;
; TANDEM FILENAME: R850HRS1
;
 .NLIST S
;
;       COLLEEN OPERATING SYSTEM EQUATE FILE
;
;
;
;       MODULE ORIGIN TABLE
;
CHRORG  = $E000 CHARACTER SET
VECTBL  = $E400 VECTOR TABLE
VCTABL  = $E480 RAM VECTOR INITIAL VALUE TABLE
CIOORG  = $E4A6 CENTRAL I/O HANDLER
INTORG  = $E6D5 INTERRUPT HANDLER
SIOORG  = $E944 SERIAL I/O DRIVER
DSKORG  = $EDEA DISK HANDLER
PRNORG  = $EE78 PRINTER HANDLER
CASORG  = $EF41 CASSETTE HANDLER
MONORG  = $F0E3 MONITOR/POWER UP MODULE
KBDORG  = $F3E4 KEYBOARD/DISPLAY HANDLER
;
;
;
;
;     VECTOR TABLE
;
;HANDLER ENTRY POINTS ARE CALLED OUT IN THE FOLLOWING VECTOR
;TABLE. THESE ARE THE ADDRESSES MINUS ONE.
;
;
;EXAMPLE FOR EDITOR
;
;    E400       OPEN
;       2       CLOSE
;       4       GET
;       6       PUT
;       8       STATUS
;       A       SPECIAL
;       C       JUMP TO POWER ON INITIALIZATION ROUTINE
;       F       NOT USED
;
;
EDITRV  = $E400 EDITOR
SCRENV  = $E410 TELEVISION SCREEN
KEYBDV  = $E420 KEYBOARD
PRINTV  = $E430 PRINTER
CASETV  = $E440 CASSETTE
;
;       JUMP VECTOR TABLE
;
;THE FOLLOWING IS A TABLE OF JUMP INSTRUCTIONS
;TO VARIOUS ENTRY POINTS IN THE OPERATING SYSTEM.
;
DISKIV  = $E450 DISK INITIALIZATION
DSKINV  = $E453 DISK INTERFACE
CIOV    = $E456 CENTRAL INPUT OUTPUT ROUTINE
SIOV    = $E459 SERIAL INPUT OUTPUT ROUTINE
SETVBV  = $E45C SET SYSTEM TIMERS ROUTINE
SYSVBV  = $E45F SYSTEM VERTICAL BLANK CALCULATIONS
XITVBV  = $E462 EXIT VERTICAL BLANK CALCULATIONS
SIOINV  = $E465 SERIAL INPUT OUTPUT INITIALIZATION
SENDEV  = $E468 SEND ENABLE ROUTINE
INTINV  = $E46B INTERRUPT HANDLER INITIALIZATION
CIOINV  = $E46E CENTRAL INPUT OUTPUT INITIALIZATION
BLKBDV  = $E471 BLACKBOARD MODE
WARMSV  = $E474 WARM START ENTRY POINT
COLDSV  = $E477 COLD START ENTRY POINT
RBLOKV  = $E47A CASSETTE READ BLOCK ENTRY POINT VECTOR
CSOPIV  = $E47D CASSETTE OPEN FOR INPUT VECTOR
;VCTABL = $E480
;
;
; OPERATING SYSTEM EQUATES
;
; COMMAND CODES FOR IOCB
OPEN    = 3             OPEN FOR INPUT/OUTPUT
GETREC  = 5             GET RECORD (TEXT)
GETCHR  = 7             GET CHARACTER(S)
PUTREC  = 9             PUT RECORD (TEXT)
PUTCHR  = $B            PUT CHARACTER(S)
CLOSE   = $C            CLOSE DEVICE
STATIS  = $D            STATUS REQUEST
SPECIL  = $E            BEGINNING OF SPECIAL ENTRY COMMANDS
;
; SPECIAL ENTRY COMMANDS
DRAWLN  = $11           DRAW LINE
FILLIN  = $12           DRAW LINE WITH RIGHT FILL
RENAME  = $20           RENAME DISK FILE
DELETE  = $21           DELETE DISK FILE
FORMAT  = $22           FORMAT
LOCKFL  = $23           LOCK FILE TO READ ONLY
UNLOCK  = $24           UNLOCK LOCKED FILE
POINT   = $25           POINT SECTOR
NOTE    = $26           NOTE SECTOR
IOCFRE  = $FF           IOCB "FREE"
;
; AUX1 EQUATES
; () INDICATES WHICH DEVICES USE BIT
APPEND  = $1            OPEN FOR WRITE APPEND (D), OR SCREEN READ (E)
DIRECT  = $2            OPEN FOR DIRECTORY ACCESS (D)
OPNIN   = $4            OPEN FOR INPUT (ALL DEVICES)
OPNOT   = $8            OPEN FOR OUTPUT (ALL DEVICES)
OPNINO  = OPNIN+OPNOT   OPEN FOR INPUT AND OUTPUT (ALL DEVICES)
MXDMOD  = $10           OPEN FOR MIXED MODE (E,S)
INSCLR  = $20           OPEN WITHOUT CLEARING SCREEN (E,S)
;
; DEVICE NAMES
SCREDT  = 'E            SCREEN EDITOR (R/W)
KBD     = 'K            KEYBOARD (R ONLY)
DISPLY  = 'S            SCREEN DISPLY (R/W)
PRINTR  = 'P            PRINTER (W ONLY)
CASSET  = 'C            CASSETTE
MODEM   = 'M            MODEM
DISK    = 'D            DISK (R/W)
;
; SYSTEM EOL (CARRIAGE RETURN)
CR      = $9B
;
;
;       OPERATING SYSTEM STATUS CODES
;
SUCCES  = $01   SUCCESSFUL OPERATION
;
BRKABT  = $80   BREAK KEY ABORT
PRVOPN  = $81   IOCB ALREADY OPEN
NONDEV  = $82   NON-EXISTANT DEVICE
WRONLY  = $83   IOCB OPENED FOR WRITE ONLY
NVALID  = $84   INVALID COMMAND
NOTOPN  = $85   DEVICE OR FILE NOT OPEN
BADIOC  = $86   INVALID IOCB NUMBER
RDONLY  = $87   IOCB OPENED FOR READ ONLY
EOFERR  = $88   END OF FILE
TRNRCD  = $89   TRUNCATED RECORD
TIMOUT  = $8A   PERIPHERAL DEVICE TIME OUT
DNACK   = $8B   DEVICE DOES NOT ACKNOWLEDGE COMMAND
FRMERR  = $8C   SERIAL BUS FRAMING ERROR
CRSROR  = $8D   CURSOR OVERRANGE
OVRRUN  = $8E   SERIAL BUS DATA OVERRUN
CHKERR  = $8F   SERIAL BUS CHECKSUM ERROR
;
DERROR  = $90   PERIPHERAL DEVICE ERROR (OPERATION NOT COMPLETED)
BADMOD  = $91   BAD SCREEN MODE NUMBER
FNCNOT  = $92   FUNCTION NOT IMPLEMENTED IN HANDLER
SCRMEM  = $93   INSUFICIENT MEMORY FOR SCREEN MODE
;
;
;
;
;
;
;       PAGE ZERO RAM ASSIGNMENTS
;
        *=$0000
LINZBS  *=*+2   LINBUG  RAM (WILL BE REPLACED BY MONITOR RAM)
;
; THESE LOCATIONS ARE NOT CLEARED
CASINI  *=*+2   CASSETTE INIT LOCATION
RAMLO   *=*+2   RAM POINTER FOR MEMORY TEST
TRAMSZ  *=*+1   TEMPORARY REGISTER FOR RAM SIZE
TSTDAT  *=*+1   RAM TEST DATA REGISTER
;
; CLEARED ON COLDSTART ONLY
WARMST  *=*+1   WARM START FLAG
BOOT?   *=*+1   SUCCESSFUL BOOT FLAG
DOSVEC  *=*+2   DISK SOFTWARE START VECTOR
DOSINI  *=*+2   DISK SOFTWARE INIT ADDRESS
APPMHI  *=*+2   APPLICATIONS MEMORY HI LIMIT
;
; CLEARED ON COLD OR WARM START
INTZBS  =*      INTERRUPT HANDLER
POKMSK  *=*+1   SYSTEM MASK FOR POKEY IRQ ENABLE
BRKKEY  *=*+1   BREAK KEY FLAG
RTCLOK  *=*+3   REAL TIME CLOCK (IN 16 MSEC UNITS)
;
BUFADR  *=*+2   INDIRECT BUFFER ADDRESS REGISTER
;
ICCOMT  *=*+1   COMMAND FOR VECTOR
;
DSKFMS  *=*+2   DISK FILE MANAGER POINTER
DSKUTL  *=*+2   DISK UTILITIES POINTER
;
PTIMOT  *=*+1   PRINTER TIME OUT REGISTER
PBPNT   *=*+1   PRINT BUFFER POINTER
PBUFSZ  *=*+1   PRINT BUFFER SIZE
PTEMP   *=*+1   TEMPORARY REGISTER
;
ZIOCB   =*      ZERO PAGE I/O CONTROL BLOCK
IOCBSZ  = 16    NUMBER OF BYTES PER IOCB
MAXIOC  = 8*IOCBSZ      LENGTH OF THE IOCB AREA
IOCBAS  =*
ICHIDZ  *=*+1   HANDLER INDEX NUMBER (FF = IOCB FREE)
ICDNOZ  *=*+1   DEVICE NUMBER (DRIVE NUMBER)
ICCOMZ  *=*+1   COMMAND CODE
ICSTAZ  *=*+1   STATUS OF LAST IOCB ACTION
ICBALZ  *=*+1   BUFFER ADDRESS LOW BYTE
ICBAHZ  *=*+1
ICPTLZ  *=*+1   PUT BYTE ROUTINE ADDRESS - 1
ICPTHZ  *=*+1
ICBLLZ  *=*+1   BUFFER LENGTH LOW BYTE
ICBLHZ  *=*+1
ICAX1Z  *=*+1   AUXILIARY INFORMATION FIRST BYTE
ICAX2Z  *=*+1
ICSPRZ  *=*+4   TWO SPARE BYTES (CIO LOCAL USE)
ICIDNO = ICSPRZ+2  IOCB NUMBER X 16
CIOCHR = ICSPRZ+3  CHARACTER BYTE FOR CURRENT OPERATION
;
STATUS  *=*+1   INTERNAL STATUS STORAGE
CHKSUM  *=*+1   CHECKSUM (SINGLE BYTE SUM WITH CARRY)
BUFRLO  *=*+1   POINTER TO DATA BUFFER (LO BYTE)
BUFRHI  *=*+1   POINTER TO DATA BUFFER (HI BYTE)
BFENLO  *=*+1   NEXT BYTE PAST END OF THE DATA BUFFER (LO BYTE)
BFENHI  *=*+1   NEXT BYTE PAST END OF THE DATA BUFFER (HI BYTE)
CRETRY  *=*+1   NUMBER OF COMMAND FRAME RETRIES
DRETRY  *=*+1   NUMBER OF DEVICE RETRIES
BUFRFL  *=*+1   DATA BUFFER FULL FLAG
RECVDN  *=*+1   RECEIVE DONE FLAG
XMTDON  *=*+1   TRANSMISSION DONE FLAG
CHKSNT  *=*+1   CHECKSUM SENT FLAG
NOCKSM  *=*+1   NO CHECKSUM FOLLOWS DATA FLAG
;
;
BPTR    *=*+1
FTYPE   *=*+1
FEOF    *=*+1
FREQ    *=*+1
SOUNDR  *=*+1   NOISY I/O FLAG.  (ZERO IS QUIET)
CRITIC  *=*+1   DEFINES CRITICAL SECTION (CRITICAL IF NON-ZERO)
;
FMSZPG  *=*+7   DISK FILE MANAGER SYSTEM ZERO PAGE
;
;
CKEY    *=*+1   FLAG SET WHEN GAME START PRESSED
CASSBT  *=*+1   CASSETTE BOOT FLAG
DSTAT   *=*+1   DISPLAY STATUS
;
ATRACT  *=*+1   ATRACT FLAG
DRKMSK  *=*+1   DARK ATRACT MASK
COLRSH  *=*+1   ATRACT COLOR SHIFTER (EOR'ED WITH PLAYFIELD COLORS)
;
LEDGE   = 2     LMARGN'S VALUE AT COLD START
REDGE   = 39    RMARGN'S VALUE AT COLD START
TMPCHR  *=*+1
HOLD1   *=*+1
LMARGN  *=*+1   LEFT MARGIN (SET TO 1 AT POWER ON)
RMARGN  *=*+1   RIGHT MARGIN (SET TO 38 AT POWER ON)
ROWCRS  *=*+1   CURSOR COUNTERS
COLCRS  *=*+2
DINDEX  *=*+1
SAVMSC  *=*+2
OLDROW  *=*+1
OLDCOL  *=*+2
OLDCHR  *=*+1   DATA UNDER CURSOR
OLDADR  *=*+2
NEWROW  *=*+1   POINT DRAW GOES TO
NEWCOL  *=*+2
LOGCOL  *=*+1   POINTS AT COLUMN IN LOGICAL LINE
ADRESS  *=*+2
MLTTMP  *=*+2
OPNTMP  = MLTTMP        FIRST BYTE IS USED IN OPEN AS TEMP
SAVADR  *=*+2
RAMTOP  *=*+1   RAM SIZE DEFINED BY POWER ON LOGIC
BUFCNT  *=*+1   BUFFER COUNT
BUFSTR  *=*+2   EDITOR GETCH POINTER
BITMSK  *=*+1   BIT MASK
SHFAMT  *=*+1
ROWAC   *=*+2
COLAC   *=*+2
ENDPT   *=*+2
DELTAR  *=*+1
DELTAC  *=*+2
ROWINC  *=*+1
COLINC  *=*+1
SWPFLG  *=*+1   NON-0 IF TXT AND REGULAR RAM IS SWAPPED
HOLDCH  *=*+1   CH IS MOVED HERE IN KGETCH BEFORE CNTL & SHIFT PROC
INSDAT  *=*+1
COUNTR  *=*+2
;
;
;
;
;       80 - FF ARE RESERVED FOR USER APPLICATIONS
;
;
;
;       NOTE : SEE FLOATING POINT SUBROUTINE AREA FOR ZERO PAGE CELLS
;
;
;
;
;       PAGE 1   -   STACK
;
;
;
;
;       PAGE TWO RAM ASSIGNMENTS
;
        *=$0200
INTABS  =*      INTERRUPT RAM
VDSLST  *=*+2   DISPLAY LIST NMI VECTOR
VPRCED  *=*+2   PROCEED LINE IRQ VECTOR
VINTER  *=*+2   INTERRUPT LINE IRQ VECTOR
VBREAK  *=*+2   SOFTWARE BREAK (00) INSTRUCTION IRQ VECTOR
VKEYBD  *=*+2   POKEY KEYBOARD IRQ VECTOR
VSERIN  *=*+2   POKEY SERIAL INPUT READY IRQ
VSEROR  *=*+2   POKEY SERIAL OUTPUT READY IRQ
VSEROC  *=*+2   POKEY SERIAL OUTPUT COMPLETE IRQ
VTIMR1  *=*+2   POKEY TIMER 1 IRQ
VTIMR2  *=*+2   POKEY TIMER 2 IRQ
VTIMR4  *=*+2   POKEY TIMER 4 IRQ
VIMIRQ  *=*+2   IMMEDIATE IRQ VECTOR
CDTMV1  *=*+2   COUNT DOWN TIMER 1
CDTMV2  *=*+2   COUNT DOWN TIMER2
CDTMV3  *=*+2   COUNT DOWN TIMER 3
CDTMV4  *=*+2   COUNT DOWN TIMER 4
CDTMV5  *=*+2   COUNT DOWN TIMER 5
VVBLKI  *=*+2   IMMEDIATE VERTICAL BLANK NMI VECTOR
VVBLKD  *=*+2   DEFERRED VERTICAL BLANK NMI VECTOR
CDTMA1  *=*+2   COUNT DOWN TIMER 1 JSR ADDRESS
CDTMA2  *=*+2   COUNT DOWN TIMER 2 JSR ADDRESS
CDTMF3  *=*+1   COUNT DOWN TIMER 3 FLAG
SRTIMR  *=*+1   SOFTWARE REPEAT TIMER
CDTMF4  *=*+1   COUNT DOWN TIMER 4 FLAG
INTEMP  *=*+1   IAN'S TEMP (RENAMED FROM T1 BY POPULAR DEMAND)
CDTMF5  *=*+1   COUNT DOWN TIMER FLAG 5
SDMCTL  *=*+1   SAVE DMACTL REGISTER
SDLSTL  *=*+1   SAVE DISPLAY LIST LOW BYTE
SDLSTH  *=*+1   SAVE DISPLAY LIST HI BYTE
SSKCTL  *=*+1   SKCTL REGISTER RAM
        *=*+1
;
LPENH   *=*+1   LIGHT PEN HORIZONTAL VALUE
LPENV   *=*+1   LIGHT PEN VERTICAL VALUE
        *=*+2   SPARE BYTES
;
        *=*+2   SPARE
;
CDEVIC  *=*+1   COMMAND FRAME BUFFER - DEVICE
CCOMND  *=*+1                          COMMAND
CAUX1   *=*+1                           COMMAND AUX BYTE 1
CAUX2   *=*+1                           COMMAND AUX BYTE 2
;               NOTE: MAY NOT BE THE LAST WORD ON A PAGE
TEMP    *=*+1   TEMPORARY RAM CELL
;               NOTE: MAY NOT BE THE LAST WORD ON A PAGE
ERRFLG  *=*+1   ERROR FLAG - ANY DEVICE ERROR EXCEPT TIME OUT
;
DFLAGS  *=*+1   DISK FLAGS FROM SECTOR ONE
DBSECT  *=*+1   NUMBER OF DISK BOOT SECTORS
BOOTAD  *=*+2   ADDRESS WHERE DISK BOOT LOADER WILL BE PUT
COLDST  *=*+1   COLDSTART FLAG (1=IN MIDDLE OF COLDSTART)
;
        *=*+1   SPARE
;
DSKTIM  *=*+1   DISK TIME OUT REGISTER
;
LINBUF  *=*+40  CHAR LINE BUFFER
;
GPRIOR  *=*+1   GLOBAL PRIORITY CELL
;
PADDL0  *=*+1   POTENTIOMETER 0 RAM CELL
PADDL1  *=*+1
PADDL2  *=*+1
PADDL3  *=*+1
PADDL4  *=*+1
PADDL5  *=*+1
PADDL6  *=*+1
PADDL7  *=*+1
STICK0  *=*+1   JOYSTICK 0 RAM CELL
STICK1  *=*+1
STICK2  *=*+1
STICK3  *=*+1
PTRIG0  *=*+1   PADDLE TRIGGER 0
PTRIG1  *=*+1
PTRIG2  *=*+1
PTRIG3  *=*+1
PTRIG4  *=*+1
PTRIG5  *=*+1
PTRIG6  *=*+1
PTRIG7  *=*+1
STRIG0  *=*+1   JOYSTICK TRIGGER 0
STRIG1  *=*+1
STRIG2  *=*+1
STRIG3  *=*+1
;
CSTAT   *=*+1
WMODE   *=*+1
BLIM    *=*+1
;
        *=*+5   SPARE
;
;
;
;
TXTROW  *=*+1   TEXT ROWCRS
TXTCOL  *=*+2   TEXT COLCRS
TINDEX  *=*+1   TEXT INDEX
TXTMSC  *=*+2   FOOLS CONVRT INTO NEW MSC
TXTOLD  *=*+6   OLDROW & OLDCOL FOR TEXT (AND THEN SOME)
TMPX1   *=*+1
HOLD3   *=*+1
SUBTMP  *=*+1
HOLD2   *=*+1
DMASK   *=*+1
TMPLBT  *=*+1
ESCFLG  *=*+1   ESCAPE FLAG
TABMAP  *=*+15
LOGMAP  *=*+4   LOGICAL LINE START BIT MAP
INVFLG  *=*+1   INVERSE VIDEO FLAG (TOGGLED BY ATARI KEY)
FILFLG  *=*+1   RIGHT FILL FLAG FOR DRAW
TMPROW  *=*+1
TMPCOL  *=*+2
SCRFLG  *=*+1   SET IF SCROLL OCCURS
HOLD4   *=*+1   TEMP CELL USED IN DRAW ONLY
HOLD5   *=*+1   DITTO
SHFLOK  *=*+1
BOTSCR  *=*+1   BOTTOM OF SCREEN : 24 NORM  4 SPLIT
;
;
PCOLR0  *=*+1   P0 COLOR
PCOLR1  *=*+1   P1 COLOR
PCOLR2  *=*+1   P2 COLOR
PCOLR3  *=*+1   P3 COLOR
COLOR0  *=*+1   COLOR 0
COLOR1  *=*+1
COLOR2  *=*+1
COLOR3  *=*+1
COLOR4  *=*+1
;
;
        *=*+23  SPARE
;
;
;
GLBABS  =*      GLOBAL VARIABLES
;
        *=*+4   SPARE
;
RAMSIZ  *=*+1   RAM SIZE (HI BYTE ONLY)
MEMTOP  *=*+2   TOP OF AVAILABLE USER MEMORY
MEMLO   *=*+2   BOTTOM OF AVAILABLE USER MEMORY
        *=*+1   SPARE
DVSTAT  *=*+4   STATUS BUFFER
CBAUDL  *=*+1   CASSETTE BAUD RATE LOW BYTE
CBAUDH  *=*+1
;
CRSINH  *=*+1   CURSOR INHIBIT (00 = CURSOR ON)
KEYDEL  *=*+1   KEY DELAY
CH1     *=*+1
;
CHACT   *=*+1   CHACTL REGISTER RAM
CHBAS   *=*+1   CHBAS REGISTER RAM
;
        *=*+5   SPARE BYTES
;
CHAR    *=*+1
ATACHR  *=*+1   ATASCII CHARACTER
CH      *=*+1   GLOBAL VARIABLE FOR KEYBOARD
FILDAT  *=*+1   RIGHT FILL DATA (DRAW)
DSPFLG  *=*+1   DISPLAY FLAG : DISPLAY CNTLS IF NON-ZERO
SSFLAG  *=*+1   START/STOP FLAG FOR PAGING (CNTL 1). CLEARED BY BREAK
;
;
;
;
;
;
;
;       PAGE THREE RAM ASSIGNMENTS
;
DCB     =*      DEVICE CONTROL BLOCK
DDEVIC  *=*+1   PERIPHERAL UNIT 1 BUS I.D. NUMBER
DUNIT   *=*+1   UNIT NUMBER
DCOMND  *=*+1   BUS COMMAND
DSTATS  *=*+1   COMMAND TYPE/STATUS RETURN
DBUFLO  *=*+1   DATA BUFFER POINTER LOW BYTE
DBUFHI  *=*+1
DTIMLO  *=*+1   DEVICE TIME OUT IN 1 SECOND UNITS
DUNUSE  *=*+1   UNUSED BYTE
DBYTLO  *=*+1   NUMBER OF BYTES TO BE TRANSFERRED LOW BYTE
DBYTHI  *=*+1
DAUX1   *=*+1   COMMAND AUXILIARY BYTE 1
DAUX2   *=*+1
;
TIMER1  *=*+2   INITIAL TIMER VALUE
ADDCOR  *=*+1   ADDITION CORRECTION
CASFLG  *=*+1   CASSETTE MODE WHEN SET
TIMER2  *=*+2   FINAL TIMER VALUE. THESE TWO TIMER VALUES
;               ARE USED TO COMPUTE INTERVAL FOR BAUD RATE
TEMP1   *=*+2   TEMPORARY STORAGE REGISTER
TEMP2   *=*+1   TEMPORARY STORAGE REGISTER
TEMP3   *=*+1   TEMPORARY STORAGE REGISTER
SAVIO   *=*+1   SAVE SERIAL IN DATA PORT
TIMFLG  *=*+1   TIME OUT FLAG FOR BAUD RATE CORRECTION
STACKP  *=*+1   SIO STACK POINTER SAVE CELL
TSTAT   *=*+1   TEMPORARY STATUS HOLDER
;
;
;
HATABS  *=*+38  HANDLER ADDRESS TABLE
MAXDEV  = *-HATABS-5    MAXIMUM HANDLER ADDRESS INDEX
;
;     NOTE : THE ENTIRE IOCB DEFINITIONS HAVE BEEN MODIFIED
;
IOCB    *= *    I/O CONTROL BLOCKS
ICHID   *=*+1   HANDLER INDEX NUMBER (FF = IOCB FREE)
ICDNO   *=*+1   DEVICE NUMBER (DRIVE NUMBER)
ICCOM   *=*+1   COMMAND CODE
ICSTA   *=*+1   STATUS OF LAST IOCB ACTION
ICBAL   *=*+1   BUFFER ADDRESS LOW BYTE
ICBAH   *=*+1
ICPTL   *=*+1   PUT BYTE ROUTINE ADDRESS - 1
ICPTH   *=*+1
ICBLL   *=*+1   BUFFER LENGTH LOW BYTE
ICBLH   *=*+1
ICAX1   *=*+1   AUXILIARY INFORMATION FIRST BYTE
ICAX2   *=*+1
ICSPR   *=*+4   FOUR SPARE BYTES
        *=*+MAXIOC-IOCBSZ
;
PRNBUF  *=*+40  PRINTER BUFFER
;
        *=*+21  SPARE BYTES
;
;
;
;
;
;
;
;       PAGE FOUR RAM ASSIGNMENTS
;
CASBUF  *=*+131 CASSETTE BUFFER
;
; USER AREA STARTS HERE AND GOES TO END OF PAGE FIVE
USAREA  *=*+128 SPARE
;
;
;
;
;
;
;
;       PAGE FIVE RAM ASSIGNMENTS
;
;       PAGE FIVE IS RESERVED AS A USER WORK SPACE
;
;       NOTE: SEE FLOATING POINT SUBROUTINE AREA FOR PAGE FIVE CELLS
;
;
;       PAGE SIX RAM ASSIGNMENTS
;
;       PAGE SIX IS RESERVED AS A USER'S USER WORK SPACE
;
;
;
;
;                               FLOATING POINT SUBROUTINES
;
FPREC   =       6               ;FLOATING PT PRECISION (# OF BYTES)
;                               IF CARRY USED THEN CARRY CLEAR => NO ERROR, CARR
AFP     =       $D800           ;ASCII->FLOATING POINT (FP)
;                               INBUFF+CIX -> FR0, CIX, CARRY
FASC    =       $D8E6           ;FP -> ASCII      FR0-> LBUFF  (INBUFF)
IFP     =       $D9AA           ;INTEGER -> FP
;                               0-$FFFF (LSB,MSB) IN FR0,FR0+1->FR0
FPI     =       $D9D2           ;FP -> INTEGER    FR0 -> FR0,FR0+1, CARRY
FSUB    =       $DA60           ;FR0 <- FR0 - FR1  ,CARRY
FADD    =       $DA66           ;FR0 <- FR0 + FR1  ,CARRY
FMUL    =       $DADB           ;FR0 <- FR0 * FR1  ,CARRY
FDIV    =       $DB28           ;FR0 <- FR0 / FR1  ,CARRY
FLD0R   =       $DD89           ;FLOATING LOAD REG0    FR0 <- (X,Y)
FLD0P   =       $DD8D           ;    "     "    "      FR0 <- (FLPTR)
FLD1R   =       $DD98           ;    "     "   REG1    FR1 <- (X,Y)
FLD1P   =       $DD9C           ;    "     "    "      FR1 <- (FLPTR)
FST0R   =       $DDA7           ;FLOATING STORE REG0 (X,Y) <- FR0
FST0P   =       $DDAB           ;    "     "    "   (FLPTR)<- FR0
FMOVE   =       $DDB6           ;FR1 <- FR0
PLYEVL  =       $DD40           ;FR0 <- P(Z) = SUM(I=N TO 0) (A(I)*Z**I)     CAR
;                               INPUT: (X,Y) = A(N),A(N-1)...A(0)  -> PLYARG
;                                      ACC   = # OF COEFFICIENTS = DEGREE+1
;                                      FR0   = Z
EXP     =       $DDC0           ;FR0 <- E**FR0 = EXP10(FR0 * LOG10(E))  CARRY
EXP10   =       $DDCC           ;FR0 <- 10**FR0  CARRY
LOG     =       $DECD           ;FR0 <- LN(FR0) = LOG10(FR0)/LOG10(E)   CARRY
LOG10   =       $DED1           ;FR0 <- LOG10 (FR0)    CARRY
;                               THE FOLLOWING ARE IN BASIC CARTRIDGE:
SIN     =       $BD81           ;FR0 <- SIN(FR0)  DEGFLG=0 =>RADS,  6=>DEG.   CA
COS     =       $BD73           ;FR0 <- COS(FR0)    CARRY
ATAN    =       $BE43           ;FR0 <- ATAN(FR0)   CARRY
SQR     =       $BEB1           ;FR0 <- SQUAREROOT(FR0)   CARRY
;FLOATING POINT ROUTINES ZERO PAGE (NEEDED ONLY IF F.P. ROUTINES ARE CALLED)
        *=$D4
FR0     *=*+FPREC       ;FP REG0
FRE     *=*+FPREC
FR1     *=*+FPREC       ;FP REG1
FR2     *=*+FPREC
FRX     *=*+1           ;FP SPARE
EEXP    *=*+1           ;VALUE OF E
NSIGN   *=*+1           ;SIGN OF #
ESIGN   *=*+1           ;SIGN OF EXPONENT
FCHRFLG *=*+1           ;1ST CHAR FLAG
DIGRT   *=*+1           ;# OF DIGITS RIGHT OF DECIMAL
CIX     *=*+1           ;CURRENT INPUT INDEX
INBUFF  *=*+2           ;POINTS TO USER'S LINE INPUT BUFFER
ZTEMP1  *=*+2
ZTEMP4  *=*+2
ZTEMP3  *=*+2
DEGFLG
RADFLG  *=*+1           ;0=RADIANS, 6=DEGREES
RADON   =       0       ;INDICATES RADIANS
DEGON   =       6       ;INDICATES DEGREES
FLPTR   *=*+2           ;POINTS TO USER'S FLOATING PT NUMBER
FPTR2   *=*+2
;FLOATING PT ROUTINES' NON-ZERO PAGE RAM (NEEDED ONLY IF F.P. ROUTINES CALLED)
        *=$57E
LBPR1   *=*+1           ;LBUFF PREFIX 1
LBPR2   *=*+1           ;LBUFF PREFIX 2
LBUFF   *=*+128         ;LINE BUFFER
PLYARG  =       LBUFF+$60       ;POLYNOMIAL ARGUMENTS
FPSCR   =       PLYARG+FPREC
FPSCR1  =       FPSCR+FPREC
FSCR    =       FPSCR
FSCR1   =       FPSCR1
LBFEND  =       *-1     ;END OF LBUFF
;
;
;
;
;
;
;
;
;
;       COLLEEN MNEMONICS
;
POKEY   =       $D200           VBLANK ACTION:          DESCRIPTION:
POT0    =       POKEY+0         POT0-->PADDL0           0-227 IN RAM CELL
POT1    =       POKEY+1         POT1-->PADDL1           0-227 IN RAM CELL
POT2    =       POKEY+2         POT2-->PADDL2           0-227 IN RAM CELL
POT3    =       POKEY+3         POT3-->PADDL3           0-227 IN RAM CELL
POT4    =       POKEY+4         POT4-->PADDL4           0-227 IN RAM CELL
POT5    =       POKEY+5         POT5-->PADDL5           0-227 IN RAM CELL
POT6    =       POKEY+6         POT6-->PADDL6           0-227 IN RAM CELL
POT7    =       POKEY+7         POT7-->PADDL7           0-227 IN RAM CELL
ALLPOT  =       POKEY+8         ???
KBCODE  =       POKEY+9
RANDOM  =       POKEY+10
POTGO   =       POKEY+11        STROBED
SERIN   =       POKEY+13
IRQST   =       POKEY+14
SKSTAT  =       POKEY+15
AUDF1   =       POKEY+0
AUDC1   =       POKEY+1
AUDF2   =       POKEY+2
AUDC2   =       POKEY+3
AUDF3   =       POKEY+4
AUDC3   =       POKEY+5
AUDF4   =       POKEY+6
AUDC4   =       POKEY+7
AUDCTL  =       POKEY+8         NONE                    AUDCTL<--[SIO]
STIMER  =       POKEY+9
SKRES   =       POKEY+10        NONE                    SKRES<--[SIO]
SEROUT  =       POKEY+13        NONE                    SEROUT<--[SIO]
IRQEN   =       POKEY+14        POKMSK-->IRQEN  (AFFECTED BY OPEN S: OR E:)
SKCTL   =       POKEY+15        SSKCTL-->SKCTL          SSKCTL<--[SIO]
;
CTIA    =       $D000           VBLANK ACTION:          DESCRIPTION:
HPOSP0  =       CTIA+0
HPOSP1  =       CTIA+1
HPOSP2  =       CTIA+2
HPOSP3  =       CTIA+3
HPOSM0  =       CTIA+4
HPOSM1  =       CTIA+5
HPOSM2  =       CTIA+6
HPOSM3  =       CTIA+7
SIZEP0  =       CTIA+8
SIZEP1  =       CTIA+9
SIZEP2  =       CTIA+10
SIZEP3  =       CTIA+11
SIZEM   =       CTIA+12
GRAFP0  =       CTIA+13
GRAFP1  =       CTIA+14
GRAFP2  =       CTIA+15
GRAFP3  =       CTIA+16
GRAFM   =       CTIA+17
COLPM0  =       CTIA+18         PCOLR0-->COLPM0         WITH ATTRACT MODE
COLPM1  =       CTIA+19         PCOLR1-->COLPM1         WITH ATTRACT MODE
COLPM2  =       CTIA+20         PCOLR2-->COLPM2         WITH ATTRACT MODE
COLPM3  =       CTIA+21         PCOLR3-->COLPM3         WITH ATTRACT MODE
COLPF0  =       CTIA+22         COLOR0-->COLPF0         WITH ATTRACT MODE
COLPF1  =       CTIA+23         COLOR1-->COLPF1         WITH ATTRACT MODE
COLPF2  =       CTIA+24         COLOR2-->COLPF2         WITH ATTRACT MODE
COLPF3  =       CTIA+25         COLOR3-->COLPF3         WITH ATTRACT MODE
COLBK   =       CTIA+26         COLOR4-->COLBK          WITH ATTRACT MODE
PRIOR   =       CTIA+27         (ON OPEN S: OR E:)      GPRIOR-->PRIOR
VDELAY  =       CTIA+28
GRACTL  =       CTIA+29
HITCLR  =       CTIA+30
CONSOL  =       CTIA+31         $08-->CONSOL            TURN OFF SPEAKER
M0PF    =       CTIA+0
M1PF    =       CTIA+1
M2PF    =       CTIA+2
M3PF    =       CTIA+3
P0PF    =       CTIA+4
P1PF    =       CTIA+5
P2PF    =       CTIA+6
P3PF    =       CTIA+7
M0PL    =       CTIA+8
M1PL    =       CTIA+9
M2PL    =       CTIA+10
M3PL    =       CTIA+11
P0PL    =       CTIA+12
P1PL    =       CTIA+13
P2PL    =       CTIA+14
P3PL    =       CTIA+15
TRIG0   =       CTIA+16         TRIG0-->STRIG0
TRIG1   =       CTIA+17         TRIG1-->STRIG1
TRIG2   =       CTIA+18         TRIG2-->STRIG2
TRIG3   =       CTIA+19         TRIG3-->STRIG3
;
ANTIC   =       $D400           VBLANK ACTION           DESCRIPTION
DMACTL  =       ANTIC+0         DMACTL<--SDMCTL         ON OPEN S: OR E:
CHACTL  =       ANTIC+1         CHACTL<--CHACT          ON OPEN S: OR E:
DLISTL  =       ANTIC+2         DLISTL<--SDLSTL         ON OPEN S: OR E:
DLISTH  =       ANTIC+3         DLISTH<--SDLSTH         ON OPEN S: OR E:
HSCROL  =       ANTIC+4
VSCROL  =       ANTIC+5
PMBASE  =       ANTIC+7
CHBASE  =       ANTIC+9         CHBASE<--CHBAS          ON OPEN S: OR E:
WSYNC   =       ANTIC+10
VCOUNT  =       ANTIC+11
PENH    =       ANTIC+12
PENV    =       ANTIC+13
NMIEN   =       ANTIC+14        NMIEN<--40               POWER ON AND [SETVBV]
NMIRES  =       ANTIC+15        STROBED
NMIST   =       ANTIC+15
PIA     =       $D300           VBLANK ACTION           DESCRIPTION
PORTA   =       PIA+0           PORTA-->STICK0,1        X-Y CONTROLLERS
PORTB   =       PIA+1           PORTB-->STICK2,3        X-Y CONTROLLERS
PACTL   =       PIA+2           NONE                    PACTL<--3C [INIT]
PBCTL   =       PIA+3           NONE                    PBCTL<--3C [INIT]
;
;
;
; .END
        .PAGE
 .LIST S
;
;       RS-232 HANDLER (RELOCATING VERSION !!)
;
;               RS-232 HANDLER CODE (COLLEEN RESIDENT)
;
;
ORIGIN  .EQU  $700  ORIGIN FOR ASSEMBLER
RBFSIZ  .EQU 32
RSTAT   .EQU  'S'   DCB STATUS COMMAND
WRITE   .EQU  'W'   DCB WRITE COMMAND
CTLCOM  .EQU  'A'   DCB CONTROL COMMAND
STRCOM  .EQU  'X'   DCB STREAM COMMAND
CNFCOM  .EQU  'B'   DCB CONFIGURE COMMAND
STRCMD  .EQU  $28   IOCB STREAM COMMAND
TRNCMD  .EQU  $26   IOCB TRANSLATE COMMAND
CNFCMD  .EQU  $24   IOCB CONFIGURE COMMAND
CTLCMD  .EQU  $22   IOCB CONTROL COMMAND
FRCCMD  .EQU  $20   IOCB FORCE BLOCK COMMAND
RSADRS  .EQU  $50   RS-232 DEVICE ADDRESS
PRTOPN  .EQU  150   PORT ALREADY OPEN ERROR
NOSTER  .EQU  151   PORT NOT OPEN FOR STREAM ERROR
BADBUF  .EQU  152   BAD USER-SUPPLIED BUFFERS
STACTV  .EQU  153   ANOTHER STREAM IS ALREADY ACTIVE
NOSTAC  .EQU  154   NO STREAM IS ACTIVE (THUS, NO INPUT ALLOWED)



;       OPCODE DEFINITIONS FOR RELOCATING MACRO
RBIT    .EQU $2C
RJSR    .EQU $20
RLDAX   .EQU $BD
RSTAX   .EQU $9D
RCPX    .EQU $EC
RLDA    .EQU $AD
RSTX    .EQU $8E
RJMP    .EQU $4C
RSTA    .EQU $8D
RLDAY   .EQU $B9
RSTAY   .EQU $99
RINCX   .EQU $FE
RCMPX   .EQU $DD
RADCX   .EQU $7D
RLDYX   .EQU $BC
RINC    .EQU $EE
RSTY    .EQU $8C
RORAX   .EQU $1D
RLDY    .EQU $AC
RJMPI   .EQU $6C
RLDX    .EQU $AE
RDEC    .EQU $CE
RANDX   .EQU $3D
RSBCX   .EQU $FD

;       RELOCATION MACRO
REL     .MACRO  OP,VARNUM
        .BYTE   OP
        .BYTE   VARNUM
        .BYTE   *-Q+1
Q       .SET *
        .ENDM

        .ORG ORIGIN        TEMPORARY ORIGIN FOR DEVELOPMENT

RHOPEN  .BYTE $20
        .BYTE 0,0
Q       .SET *

        REL RLDAX,2
        BPL RNTOPN      TEST FOR PORT ALREADY OPEN
        LDY #PRTOPN     ERROR, PORT ALREADY OPENED
        RTS

RNTOPN  LDA ICAX1Z
        TAY
        AND #12
        BNE ROKOPN
        LDY #132
        RTS             ERROR, NO PERMISSIONS GRANTED PORT

ROKOPN  TYA
        ORA #$80
        REL RSTAX,2    SET-UP PERMISSION BYTE
        LDA #0
        REL RSTAX,4    INITIALIZE PUT-COUNTER
        REL RSTAX,6    CLEAR ERROR FLAGS
        LDY #SUCCES
        RTS

RHCLOS  REL RJSR,0     TEST DEVICE NUMBER FOR VALIDITY

        REL RCPX,8
        BEQ CLSTRM      TEST FOR ACTIVE STREAM, BRANCH IF SO

        REL RLDAX,4
        BEQ MTPBUF      TEST FOR BUFFER EMPTY, BRANCH IF SO

        REL RJSR,10    PREPARE TO DO A PUT-BLOCK
        LDY #$80
        BNE CLSPUT      JOIN AND SEND DCB (BRANCH IS A JUMP)

CLSTRM  REL RLDA,12
        BEQ CLSTRM      WAIT FOR BUFFER TO DRAIN
        SEI
        REL RLDA,14
        STA VIMIRQ
        REL RLDA,16
        STA VIMIRQ+1    RESTORE MAIN SYSTEM IRQ VECTOR
        LDX #5
CLSVCT  REL RLDAX,18
        STA VSERIN,X
        DEX
        BPL CLSVCT      RETURN SYSTEM INTERRUPT VECTORS
        CLI
        REL RLDA,8
        REL RSTX,8     INDICATE NO ACTIVE STREAM
        TAX             X=DEVICE STREAMING
;*** FALL THRU TO REST OF EMPTY PUT BUFFER PROCESSING

MTPBUF  LDY #0
        STY DAUX1       INDICATE NO DATA (FOR CONTROLLER)
CLSPUT  LDA #0
        REL RSTAX,2    CLEAR DEVICE PERMISSIONS AND ETC.
        LDA #WRITE
        REL RJMP,22    CREATE A WRITE DCB AND EXIT


RHPUT   LDY ICDNO,X     FETCH DEVICE NUMBER FROM ORIGINATING IOCB
        CPY #5
        BCC PTDVOK      TEST DEVICE NUMBER FOR VALIDITY
        LDY #NONDEV
        RTS             RETURN ERROR IF INVALID

PTDVOK  REL RSTA,24    SAVE UNTRANSLATED CHARACTER
        REL RLDAY,2
        AND #8          TEST FOR WRITE PERMISSION
        BNE WRITOK
        LDY #RDONLY
        RTS             RETURN, ERROR DEVICE READ-ONLY

WRITOK  TYA
        TAX             X=DEVICE NUMBER
        STX ICDNOZ      COPY INTO ZERO PAGE (DAMN BASIC ANYWAY!)

; OUTPUT TRANSLATION 0=LONG,1=SHORT, ELSE NOT TRANSLATED

        REL RLDAX,26
        AND #$30
        TAY             MASK-OFF AND SAVE OUTPUT PARITY MODE
        BEQ OTRANS      0 ==> TRANSLATION (LONG TO BE EXACT)
        CMP #$20
        BCS PAROT2      NO TRANSLATION, GO DIRECTLY TO OUTPUT PARITY
OTRANS  REL RLDA,24
        CMP #$9B        TEST FOR <EOL>
        BNE REGOTR
        REL RLDAX,26
        AND #$40
        BEQ TONOLF      TEST FOR REQUEST TO APPEND <LF>
        LDA #$D         APPEND <LF> CASE ...
        REL RJSR,28    FAKE A SUBR. CALL TO NORMAL EXIT ... TRICKY,UGLY
        BPL LFNOER
        RTS             RETURN IMMEDIATLY IF SIO ERROR
LFNOER  LDX ICDNOZ      RESTORE DEVICE NUMBER
        LDA #$A         APPEND <LF>
        BNE PAROUT
TONOLF  LDA #$D
        BNE PAROUT      JUST <EOL> TO <CR> TRANSLATION PLEASE ...
REGOTR  CPY #$10        REGULAR TRANSLATION, TEST FOR SHORT OR LONG
        BEQ OSHRTR      1 ==> SHORT TRANSLATE MODE
        AND #$7F        FOLD TABLE OVER
        BPL PAROUT
OSHRTR  CMP #$20
        BCC SPROUT      IF CHAR<' ' THEN SUPPRESS
        CMP #$7D
        BCC PAROUT      ACCEPT IF CHAR< <SCREEN CLEAR>
SPROUT  LDY #SUCCES     RETURN SUCCESS IF CHARACTER SUPPRESSED
        RTS

; OUTPUT PARITY

PAROUT  REL RSTA,24    SAVE TRANSLATED CHARACTER
PAROT2  REL RLDAX,26
        AND #$3
        BEQ POTXIT      0=SKIP, IGNORE PARITY BIT
        CMP #3
        BEQ STOUTP      3=SET-PARITY REQUESTED
        TAY             SAVE PARITY-REQUEST FLAG
        REL RJSR,30    MASK ANY HI-BIT PRESENT
        REL RJSR,32    FIND ORIGINAL PARITY
        TYA
        AND #2          2=EVEN PARITY, ODD ELSE
        BEQ ODDOUT
        BCC POTXIT
STOUTP  REL RLDA,24
        ORA #$80        SET PARITY BIT
        REL RSTA,24
        BMI POTXIT      JUMP/BRANCH
ODDOUT  BCC STOUTP
POTXIT  LDX ICDNOZ      PARITY COMPLETE, RESTORE DEVICE NUMBER
        REL RCPX,8
        BEQ PUTSTR      TEST FOR DEVICE ACTIVELY STREAMING

        REL RJSR,34    A=32*(DEVICE#-1)
        REL RADCX,4
        TAY             Y=INDEX INTO PROPER PUT BUFFER
        REL RLDA,24
        REL RSTAY,36   PUT DATA-BYTE INTO BUFFER
        REL RINCX,4

        CMP #$D
        BEQ PTBFUL      IF <CR> THEN DUMP THE BUFFER

        LDA #RBFSIZ
        REL RCMPX,4    INCREMENT BUFFER COUNTER AND CHECK BUFFER FULL
        BEQ PTBFUL
        LDY #SUCCES
        RTS             ... EXIT IF BUFFER NOT FULL
;       **** SPECIAL ENTRY POINT FOR FORCE ****
PTBFUL  REL RJSR,10
        LDY #$80        Y=DCB STATUS BYTE
        LDA #0
        REL RSTAX,4    CLEAR PUT-COUNTER
        LDA #WRITE
        REL RJMP,22    EXIT THRU SIO WITH A WRITE DCB

PUTSTR  REL RLDA,20
        CMP #RBFSIZ-1
        BCS PUTSTR      TEST FOR PUT-BUFFER FULL, WAIT IF SO ...
        REL RJSR,34    A=32*(ACTIVE STREAM-1)
        SEI
        REL RADCX,4
        TAY             Y=POINTER INTO PROPER PUT-BUFFER
        REL RLDA,24    FETCH TRANSLATED CHARACTER
        REL RSTAY,36   PLACE CHARACTER IN BUFFER
        REL RLDYX,4
        REL RJSR,38    CIRCULAR INCREMENT
        REL RSTAX,4
        REL RINC,20    COUNT A BYTE IN THE BUFFER
        LDA POKMSK
        REL RLDYX,26
        BMI TWOSTP      TEST FOR ONE OR TWO STOP BIT MODE
        ORA #$18        ONE-STOP BIT CASE
        BNE ONESTP
TWOSTP  ORA #$8         TWO-STOP BIT CASE
ONESTP  STA POKMSK
        STA IRQEN
        LDY #0
        REL RSTY,12    SET ALL-DONE FLAG TO FALSE
        CLI
        INY
        RTS             RETURN SUCCESS


RHGET   REL RJSR,0     TEST DEVICE NUMBER FOR VALIDITY

        REL RLDAX,2
        AND #4
        BNE READOK      TEST FOR READ PERMISSION
        LDY #WRONLY
        RTS             RETURN ERROR STATUS

READOK  REL RCPX,8
        BEQ GETSTR      TEST FOR STREAM ACTIVE, BRANCH IF SO
        LDY #NOSTAC     ELSE, ERROR NO INPUT ALLOWED
        RTS

GETSTR  LDY #4
        LDX #6
GBFMTY  CLI             CLEAR INTERRUPTS TO ALLOW ESCAPE
        SEI             INHIBIT INTERRUPTS TO PREVENT CONFUSION
        REL RJSR,40    COMPARE NEXTIN AND NXTOUT POINTERS
        BEQ GBFMTY      WAIT LOOP (INTERUPTS INHIBITED ON EXIT)
        LDA ICSPRZ
        PHA
        LDA ICSPRZ+1
        PHA             SAVE ZERO PAGE BYTES ON STACK
        REL RLDA,42
        STA ICSPRZ
        REL RLDA,44
        STA ICSPRZ+1    SET-UP AN INDIRECT POINTER
        LDY #0
        LDA (ICSPRZ),Y  FETCH NEXT-OUT DATA BYTE
        REL RSTA,24    SAVE UNTRANSLATED CHARACTER
        PLA
        STA ICSPRZ+1
        PLA
        STA ICSPRZ      RETURN BORROWED ZERO PAGE
        SEC
        REL RLDA,46
        SBC #1
        REL RSTA,46
        BCS GTSBOK
        REL RDEC,48
GTSBOK  LDX #2
        REL RJSR,50    16-BIT CIRCULAR INCREMENT OF NXTOUT POINTER
        CLI
        LDX ICDNOZ      RESTORE THE X-REGISTER


; INPUT PARITY CHECKING

        REL RLDAX,26
        LSR A
        LSR A
        AND #3          ISOLATE INPUT PARITY FLAGS
        BEQ INTRNS      0=SKIP, IGNORE PARITY
        CMP #3
        BEQ PINCLR      3=CLEAR PARITY BIT, IGNORE PARITY
        TAY
        REL RLDA,24
        REL RJSR,32    DERIVE PARITY
        TYA
        AND #2
        BEQ PINODD      2=EVEN PARITY CHECKING, ODD CHECKING ELSE
        BCC PINCLR
PINERR  LDX ICDNOZ      RESTORE DEVICE NUMBER
        LDA #$20
        REL RORAX,6    SET PARITY ERROR BIT
        REL RSTAX,6
        BNE PINCLR      JUMP/BRANCH TO EXIT
PINODD  BCC PINERR
PINCLR  REL RJSR,30    CLEAR ANY PARITY BIT
;
; INPUT TRANSLATION
;
INTRNS  LDX ICDNOZ      RESTORE DEVICE NUMBER
        REL RLDAX,26
        AND #$30        STRIP ALL BUT TRANSLATE MODE
        CMP #$20
        BCC DOTRNS
        REL RLDA,24    NO TRANSLATION IS DESIRED
        LDY #SUCCES
        RTS             RETURN SUCCESS

DOTRNS  TAY
        REL RJSR,30    MASK PARITY BIT (ASCII IS A 7-BIT CODE)
        CMP #$D
        BNE INOEOL      TEST FOR <CR> ==> <EOL> TRANSLATION
        LDA #$9B
        BNE INTRXT      EXIT, TRANSLATION COMPLETE
INOEOL  CPY #0
        BEQ INTRXT      LONG TRANSLATION DESIRED
        CMP #$20
        BCC SUPRIN      TEST FOR VALUE UNACCEPTABLY LOW
        CMP #$7D
        BCC INTRXT      TEST FOR VALUE UNACCEPTABLY HIGH (JOIN IF NOT)
SUPRIN  REL RLDAX,52   FIND INPUT SUPPRESSION TRANSLATE CHAR

INTRXT  LDY #SUCCES     EXIT, SUCCESS
        RTS

RHSTAT  REL RJSR,0     TEST DEVICE# FOR VALIDITY

        REL RLDAX,6
        STA DVSTAT      FETCH AND STORE DEVICE STATUS
        REL RSTA,24    SAVE FOR BLOCK MODE STATUS
        LDA #0
        REL RSTAX,6    RESET DEVICE ERROR STATUS BYTE
        REL RCPX,8
        BEQ STASTR      TEST FOR ACTIVE STREAM
;       **** FUNKY ENTRY POINT FOR INIT.TIME STATUS REQUEST
STFUNK  LDA #.LOW.DVSTAT
        STA DBUFLO
        LDA #.HIGH.DVSTAT
        STA DBUFHI      SET-UP DCB BUFFER POINTER
        LDA #2
        STA DBYTLO
        LDA #0
        STA DBYTHI      SET-UP DCB BUFFER LENGTH
        LDY #$40
        LDA #RSTAT
        REL RJSR,22    CREATE SIO CALL
        REL RLDA,24
        ORA DVSTAT      INSERT PARITY ERROR BIT
        STA DVSTAT
        CPY #0          RESET I/O SUCCESS/FAILURE FLAG
        RTS

STASTR  LDY #3
STSTLP  REL RLDAY,54
        STA DVSTAT,Y
        DEY
        BNE STSTLP      COPY OVER STATUS BYTES FOR USER
        INY
        RTS             RETURN SUCCESS

RHSPEC  REL RJSR,0     TEST DEVICE NUMBER FOR VALIDITY
        LDA ICCOMZ
        AND #$F
        CMP #9          TEST FOR LO-NIBBLE > MAX VALID
        BCS XIOERR
        TAY             Y=INDEX (ASSUMED VALID)
        LSR A
        BCS XIOERR      ERROR IF INDEX IS ODD
        REL RLDAY,56
        PHA
        REL RLDAY,58
        PHA             INDIRECT JUMP TO PROPER ENTRY POINT
        RTS

XIOERR  LDY #NVALID
        RTS             ERROR, COMMAND IS INVALID


STREAM  REL RLDAX,2
        BMI STROPN      TEST FOR PORT OPEN
        LDY #NOTOPN
        RTS             RETURN ERROR IF NOT
STROPN  REL RBIT,8
        BVS STROK2      TEST FOR ANOTHER STREAM ALREADY ACTIVE
        LDY #STACTV
        RTS             RETURN ERROR IF SO
STROK2  LSR A
        BCS STROK1
        LDY #NOSTER     RETURN ERROR IF PORT NOT OPEN FOR STREAM
        RTS
STROK1  LSR A
        LSR A
        BCC STNORD      TEST FOR DEVICE OPEN FOR READ

        LDA ICAX1Z
        BEQ SYSBUF      AUX1=0 ==> USE SYSTEM BUFFERS

        LDA ICBLLZ
        ORA ICBLHZ
        BEQ SYSBUF      TEST FOR SYSTEM BUFFER USAGE(LENGTH=0)

        CLC
        LDA ICBALZ
        REL RSTA,60
        ADC ICBLLZ
        REL RSTA,62    COMPUTE LO-BYTE OF BUFFER POINTER
        LDA ICBAHZ
        REL RSTA,64
        ADC ICBLHZ
        REL RSTA,66    COMPUTE HI-BYTE OF BUFFER POINTER
        BCC RDJOIN
        LDY #BADBUF     IF OVERFLOW THEN ERROR
        RTS

SYSBUF  REL RJSR,34    PREPARE TO OPEN A SYSTEM BUFFER INPUT STREAM
        .BYTE $69,120
        REL RSTA,60
        .BYTE $A9,121
        ADC #0
        REL RSTA,64    SET BOTTOM-OF-BUFFER TO POINT TO SYSTEM
        CLC
        REL RLDA,60
        ADC #RBFSIZ-1
        REL RSTA,62
        REL RLDA,64
        ADC #0
        REL RSTA,66    COMPUTE TOP-OF-BUFFER POINTER IN SYSTEM BUFFER

RDJOIN  LDY #6
STINLP  REL RJSR,68    SET POINTERS TO BOTTOM-OF-BUFFER
        DEY
        DEY             SET-UP INPUT AND OUTPUT POINTERS
        CPY #2
        BNE STINLP

STNORD  LDX ICDNOZ
        REL RLDAX,2
        AND #$8         TEST FOR WRITE PERMISSION
        BEQ STNOWT
        LDA #0
        REL RSTAX,4
        REL RSTAX,70   INITIALIZE OUTPUT-STREAM PUT AND GET POINTERS

STNOWT  STA DBYTHI
        .BYTE $A9,18
        STA DBUFLO
        .BYTE $A9,19
        STA DBUFHI
        REL RLDAX,2
        STA DAUX1       DAUX1=IO PERMISSION FOR CONTROLLER
        LDA #9
        STA DBYTLO      CREATE A STREAM DCB
        LDY #$40
        LDA #STRCOM
        REL RJSR,22    EXECUTE AN SIO CALL TO CONTROLLER
        BPL STROK4
        RTS             RETURN IF ERROR ENCOUNTERED DURING SIO
STROK4  SEI
        LDA #$73
        STA SKCTL
        REL RLDA,72
        STA AUDCTL      SET-UP SUPPLIED AUDIO CONTROL
        LDY #7
STRCTL  REL RLDAY,18
        STA AUDF1,Y
        DEY
        BPL STRCTL      SET-UP BAUD RATE SUPPLIED BY CONTROLLER

        LDX #5
STVCTL  LDA VSERIN,X
        REL RSTAX,18
        REL RLDAX,74
        STA VSERIN,X    REPLACE ALL SYSTEM SIO INTERRUPTS WITH OWN
        DEX
        BPL STVCTL

        LDA VIMIRQ
        REL RSTA,14
        .BYTE $A9,122
        STA VIMIRQ
        LDA VIMIRQ+1
        REL RSTA,16
        .BYTE $A9,123
        STA VIMIRQ+1    REPLACE AND SAVE MAIN SYSTEM IRQ VECTOR

        LDA #0
        LDY #2
STRZLN  REL RSTAY,46
        DEY
        BPL STRZLN      CLEAR ALL STATUS COUNTERS

        LDX ICDNOZ
        REL RLDAX,2
        AND #4
        BEQ NOINPT      TEST FOR READ PERMISSION

        LDA POKMSK
        ORA #$20
        STA IRQEN
        STA POKMSK      ENABLE INPUT INTERRUPT

NOINPT  REL RSTX,8     RECOGNIZE ACTIVE STREAM
        REL RSTX,12    RESET ALL DONE FLAG TO TRUE (NON-ZERO)
        CLI
        BNE SPCXIT      EXIT AND RESTORE AUX1 OF THE IOCB

FORCE   REL RLDAX,2
        BMI FRCOPN
        LDY #NOTOPN     ERROR IF PORT NOT OPEN
        RTS
FRCOPN  AND #$8
        BNE OKFORC      CHECK FOR WRITE PERMISSION
        LDY #RDONLY     ERROR, OPEN FOR READ ONLY
        RTS
OKFORC  REL RLDAX,4
        BEQ SPCXIT      EXIT IF NOTHING IN BUFFER
        REL RJSR,76    ** SPECIAL ENTRY ENTRY TO PUT THE BUFFER **
        BNE SPXIT2      EXIT, AND RESTORE I/O PERMISSIONS

CONFIG  LDY #$7F
        REL RJSR,78    SET INTERNAL TRANSLATION FLAGS
        LDA #CNFCOM
        REL RJSR,80    MAKE A SPECIAL DCB AND EXIT
        BNE SPXIT2      EXIT, AND RESTORE I/O PERMISSIONS

CONTRL  LDA #CTLCOM
        REL RJSR,80    CREATE A SPECIAL DCB AND EXIT
        BNE SPXIT2      EXIT, AND RESTORE I/O PERMISSIONS

TRANSL  LDY #$80
        REL RJSR,78    SET INTERNAL TRANSLATION FLAGS
        LDA ICAX2Z
        REL RSTAX,52   SAVE SUPPRESS/FILL CHARACTER
SPCXIT  LDY #SUCCES
SPXIT2  LDX ICDNOZ
        REL RLDAX,2    FETCH DEVICE PERMISSIONS
        STA ICAX1Z      AND RESTORE AFTER CIO CALL
        CPY #0          RESET ERROR BIT
        RTS




        ;RS232 INITIALIZATION CODE
RINWRM  LDA #0          FIND FIRST FREE HANDLER SLOT IN TABLE
        LDX #0
CMPTLP  CMP HATABS,X    TEST FOR EQUIVALENCE
        BEQ CMPFND
        INX
        INX
        INX             PUSH INDEX TO NEXT HANDLER SLOT
        CPX #MAXDEVS-1
        BCC CMPTLP      UNTIL ALL ENTRIES TRIED
        RTS             RETURN QUIETLY IF NO FREE SLOT
CMPFND  LDA #'R
        REL RSTA,8     INDICATE NO ACTIVE STREAM
        STA HATABS,X    INSERT HANDLER I.D.
        .BYTE $A9,84
        STA HATABS+1,X
        .BYTE $A9,85
        STA HATABS+2,X  INSERT ADDRESS OF HANDLER ENTRIES

        CLC
        LDA MEMLO
        ADC #.LOW.RHLONG
        STA MEMLO
        LDA MEMLO+1
        ADC #.HIGH.RHLONG
        STA MEMLO+1     RESET MEMLO TO ACCOUNT FOR LENGTH OF HANDLER

                        ;CONTROL TRANSFERS HERE ON COLD/WARM START
        LDX #4
RINCLD  LDA #0          X=12, SET BY RELOCATOR ON ENTRY
INITLP  REL RSTAX,2
        DEX
        BNE INITLP      CLEAR ALL HANDLER PERMISSIONS
        INX             X=1
        REL RJSR,82    CREATE A STATUS REQUEST FOR R DEVICE
        CLC             INDICATE BOOT SUCCESS
        LDA WARMST
        BNE WRMXIT
        RTS
WRMXIT  JMP $FFFF       DAISY CHAIN THRU DOSINI UNLESS COLD START
;       *** THIS ADDRESS IS INSERTED BY RELOCATOR


;       SUBROUTINE TO MONITOR SYSTEM INTERRUPTS AND CAPTURE BREAK-KEY
;
RBREAK  BIT IRQST
        BPL ABREAK      TEST FOR A BREAK-KEY
        REL RJMPI,14

ABREAK  PHA             DO BREAK-KEY PROCESSING
        LDA #$7F
        STA IRQEN
        LDA POKMSK
        STA IRQEN       RESET BREAK-KEY INTERRUPT
        PLA
        RTI             RESTORE ACC. AND RETURN

;       SUBROUTINE TO SERVICE INPUT INTERRUPTS
RIN     CLD
        TXA
        PHA
        TYA
        PHA     SAVE REGISTERS ON STACK
        LDA ICSPRZ
        PHA
        LDA ICSPRZ+1
        PHA     SAVE ZERO PAGE BYTES ON STACK
        REL RLDA,88
        STA ICSPRZ
        REL RLDA,90
        STA ICSPRZ+1
        LDA SERIN
        LDY #0
        STA (ICSPRZ),Y  USE AS OWN INDIRECT POINTER
        LDA SKSTAT
        STA SKRES       FETCH AND RESET SYSTEM ERROR BYTE
        EOR #$FF
        AND #$C0        INVERT AND MASK XMISSION ERROR BITS
        REL RLDX,8
        REL RORAX,6
        REL RSTAX,6    SET LOCAL ERROR BITS
        PLA
        STA ICSPRZ+1
        PLA
        STA ICSPRZ      RESTORE BORROWED ZERO PAGE
        LDX #0
        REL RJSR,50    CIRCULAR INCREMENT NEXTIN POINTER
        LDY #4
        LDX #6
        REL RJSR,40    COMPARE NEXTIN WITH NXTOUT
        BNE INOWRP
        LDX #2
        REL RJSR,50    IF WRAPAROUND THEN CIRCULAR INCREMENT NXTOUT
        REL RLDX,8
        REL RLDAX,6
        ORA #$10
        REL RSTAX,6    SET WRAP-AROUND ERROR FLAG
        BNE RINXIT
INOWRP  LDX #4
        REL RJSR,92    16-BIT INCREMENT OF INSTAT COUNTER
RINXIT  .EQU *
; ** FALL THRU TO RESTORE REGISTERS AND EXIT


;       SUBROUTINE TO RESTORE REGISTERS AND RETURN FROM INTERRUPT
;
INTXIT  PLA
        TAY
        PLA
        TAX
        PLA
        RTI             RESTORE REGISTERS AND RETURN FROM INTERRUPT

;       SUBROUTINE TO SERVICE OUTPUT INTERRUPTS
ROUT    CLD
        TXA
        PHA
        TYA
        PHA             SAVE REGISTERS
        REL RLDX,8
        REL RLDAX,4
        REL RCMPX,70
        BNE GTBFOK      TEST FOR BUFFER EMPTY
        REL RSTX,12    SET ALL DONE FLAG
        LDA POKMSK
        AND #$E7
        STA POKMSK
        STA IRQEN       TURN-OFF ALL OUTPUT INTERRUPTS
        CLC
        BCC INTXIT      RESTORE REGISTERS AND EXIT

GTBFOK  REL RJSR,34    A=32*(DEVICE#-1)
        REL RADCX,70
        TAY             Y=INDEX INTO PROPER BUFFER
        REL RLDAY,36
        STA SEROUT      PUT BYTE INTO SERIAL PORT
        REL RLDYX,70
        REL RJSR,38    CIRCULAR INCREMENT OF GET POINTER
        REL RSTAX,70

        REL RDEC,20    COUNT A BYTE REMOVED FROM BUFFER
ROUTLP  LDA IRQST
        AND #8
        BEQ ROUTLP      WAIT FOR FIRST BIT OF DATA TO SHIFT IN
        BNE INTXIT



;       SUBROUTINE TO PREPARE A PUT DCB
;
;       GIVEN:  X=DEVICE NUMBER (1-4)
;
;       REGISTER USAGE
;       A=GENERAL AND MATH
;               SETS UP BUFFER POINTER AND LENGTH FOR PUT DCB
;
PREPUT  REL RJSR,34    A=32*(DEVICE#-1)
        .BYTE $69,36    ;CARRY CLEAR FROM SHIFT
        STA DBUFLO
        LDA #0
        STA DBYTHI
        .BYTE $69,37
        STA DBUFHI      POINTER=PROPER PUT BUFFER

        REL RLDAX,4    A=BUFFER LENGTH
        STA DAUX1
        LDA #64
        STA DBYTLO      KLUDGE FOR AN O.S. BUG (MUST SEND AT LEAST 63.5 BYTES)
        RTS



;       SUBROUTINE TO FIND THE PARITY OF THE ACCUMULATOR
;
;       GIVEN:  A=BYTE TO FIND PARITY OF
;
;       REGISTER USAGE:
;               X=USED FOR COUNTING ONES
;
;       RESULT RETURNED IN CARRY
;
PARITY  LDX #0
CKPTLP  LSR A
        BCC ZERBIT      IGNORE, ZERO-BIT
        INX             COUNT A ONE BIT
ZERBIT  BNE CKPTLP      TEST FOR ALL DONE (BYTE=0)
        TXA
        LSR A           SET CARRY DEPENDENT ON RESULT
        RTS


;       SUBROUTINE TO SET INTERNAL TRANSLATION FLAGS
;
;       GIVEN:  Y=MASK SHOWING WHICH BITS WILL NOT CHANGE
;               X=DEVICE NUMBER (1-4), NEW TRANSLATE FLAGS IN ICAX1Z
;
;       REGISTER USAGE:
;               ACCUMULATOR DESTROYED, PROPER FLAGS SET OR RESET
;
SETRNS  TYA
        REL RANDX,26
        REL RSTAX,26
        TYA
        EOR #$FF        INVERT MASK
        AND ICAX1Z      AND MASK DATA
        REL RORAX,26
        REL RSTAX,26
        RTS

;       SUBROUTINE TO MASK THE HI-BIT OF RSCHAR
;
;       GIVEN:  RSCHAR
;
;       REGISTER USAGE:
;               A=MASKING
;               RSCHAR RETURNED MASKED AND IN ACCUMULATOR
;
CLHIBT  REL RLDA,24
        AND #$7F
        REL RSTA,24
        RTS



;       SUBROUTINE TO DO A CIRCULAR ONE BYTE INCREMENT
;
;       GIVEN:  Y=BYTE TO BE INCREMENTED, RBFSIZ IS DEFAULT WRAPAROUND
;
;       REGISTER USAGE:
;               A=CIRCULARLY INCREMENTED VALUE
;
CIRCIN  INY
        TYA
        CMP #RBFSIZ
        BCC CIRXIT
        LDA #0
CIRXIT  RTS


;       SUBROUTINE TO FIND INDEX INTO BUFFERS GIVEN WHICH OF FOUR
;
;       GIVEN:  X=PORT NUMBER(1-4)
;
;       REGISTER USAGE: ACCUMULATOR ONLY
;
X32M1   TXA
        SEC
        SBC #1
MULT32  ASL A
MULT16  ASL A
        ASL A
        ASL A
        ASL A
        RTS


;       SUBROUTINE TO DO A 16-BIT INCREMENT
;
;       GIVEN:  X=0, INCREMENT NEXTIN
;                =2, INCREMENT NXTOUT
;               =4, INCREMENT INSTAT COUNTER
;
;       REGISTER USAGE: ACCUMULATOR DESTROYED
;
INC16B  REL RINCX,88
        BNE N16XIT
        REL RINCX,90
N16XIT  RTS

;       SUBROUTINE TO DO A 16 BIT COMPARE
;
;       GIVEN:  X=COMPARER AND Y=COMPAREE
;               RETURNS CS IF Y>=X, CC ELSE
;               0=TOP OF BUFFER
;               2=BOTTOM OF BUFFER
;               4=NEXT-IN POINTER
;               6=NEXT-OUT POINTER
;
;       REGISTER USAGE: ACCUMULATOR DESTROYED
;
CMP16B  REL RLDAY,66
        REL RCMPX,66
        BEQ CMPMOR      COMPARE THE LO-ORDER BYTES
        RTS
CMPMOR  REL RLDAY,62
        REL RCMPX,62
        RTS


;       SUBROUTINE TO DO A CIRCULAR 16-BIT INCREMENT
;
;       GIVEN:  X=INDEX INTO POINTERS
;                       0=NEXT-IN POINTER
;                       2=NEXT-OUT POINTER
;
;       REGISTER USAGE:
;               ALL REGISTERS ARE CLOBBERED
;               INDICATED POINTER IS RETURNED CIRCULARLY INCREMENTED

CIN16B  REL RJSR,92    INCREMENT INDICATED POINTER
        TXA
        CLC
        ADC #4
        TAY             Y=PASSED POINTER+4
        LDX #0
        REL RJSR,40    TEST FOR TOP-OF-BUFFER < POINTER
        BEQ CINXIT      STRICTLY GREATER-THAN FOR CIRCULARITY
        BCC CINXIT
CINTRY  REL RLDA,60    CIRCULAR PART OF THE INCREMENT

        REL RSTAY,62
        REL RLDA,64
        REL RSTAY,66
CINXIT  RTS

;       SUBROUTINE TO TEST DEVICE NUMBER FOR VALIDITY
;
;       GIVEN:  DEVICE NUMBER IN ICDNOZ
;
;       REGISTER USAGE:
;               RETURNS IF VALUE IS ACCEPTABLE, EXITS IF NOT
;
RDVTST  LDX ICDNOZ
        CPX #5
        BCS RSERR1
        RTS             RETURN, INDEX IS VALID
RSERR1  PLA
        PLA             PULL CALL FROM STACK
        LDY #NONDEV
        RTS




;       SUBROUTINE TO CREATE A SPECIAL I/O DCB
;
;       GIVEN:  A=DCB COMMAND BYTE
;               X=DEVICE NUMBER
;
;       REGISTER USAGE:
;                Y IS DESTROYED
;
SPCDCB  LDY ICAX1Z
        STY DAUX1
        LDY ICAX2Z
        STY DAUX2       PASS INFO TO DCB
        LDY #0
;FALL THRU TO MAKE A DCB ****


;       SUBROUTINE TO MAKE A DCB
;
;       GIVEN:  A=DCB COMMAND BYTE
;               X=UNIT NUMBER (1-4)
;               Y=DCB STATUS BYTE
;
;       REGISTER USAGE:
;               A=GENERAL PURPOSE (SET-UP CONSTANT DEVICE ADDRESS AND TIMEOUT)
;
MAKDCB  STA DCOMND
        STX DUNIT
        STY DSTATS
        LDY #RSADRS
        STY DDEVIC      SET-UP DEVICE ADDRESS
        LDY #8
        STY DTIMLO      SET-UP A TIME-OUT
        JMP SIOV        PASS CONTROL TO SIO

        .BYTE 94,$31    ;RHOPEN-1
        .BYTE 96,2      ;RHCLOS-1
        .BYTE 98,2      ;RHGET-1
        .BYTE 100,2     ;RHPUT-1
        .BYTE 102,2     ;RHSTAT-1
        .BYTE 104,2     ;RHSPEC-1
        .BYTE $4C,118,3 ;JMP RINWRM
        .BYTE 0

        .BYTE 106,3     ;FORCE-1
        .BYTE 108,2     ;CONTRL-1
        .BYTE 110,2     ;CONFIG-1
        .BYTE 112,2     ;TRANSL-1
        .BYTE 114,2     ;STREAM-1


        .BYTE 86,2      ;RIN
        .BYTE 116,2,116,2       ;ROUT REPEATED TWICE
INBASE  .EQU *   INPUT BUFFERS
INBF1   .RES RBFSIZ
INBF2   .RES RBFSIZ
INBF3   .RES RBFSIZ
INBF4   .RES RBFSIZ
OUTBAS  .EQU *   OUTPUT BUFFERS
OUTBF1  .RES RBFSIZ
OUTBF2  .RES RBFSIZ
OUTBF3  .RES RBFSIZ
OUTBF4  .RES RBFSIZ
GETCTR  .RES 4   COUNTER FOR NUMBER OF ELEMENTS IN INPUT BUFFERS
PUTCTR  .RES 4   COUNTER FOR ELEMENTS IN OUTPUT BUFFERS
RERROR  .RES 4   LOCAL PARITY AND INPUT ERROR STORAGE
;               BIT 7=FRAME ERROR
;               BIT 6=OVERRUN ERROR
;               BIT 5=INPUT PARITY ERROR
;               BIT 4=WRAPAROUND FLAG

IOCTRL  .RES 4   I/O CONTROL, PERMISSIONS GRANTED A PORT
;               BIT 7=OPEN/CLOSE
;               BIT 3=WRITE PERMISSION
;               BIT 2=READ PERMISSION
;               BIT 0=STREAM PERMISSION

RTRANS  .RES 4   LOCAL TRANSLATION AND PARITY REQUESTED FOR PORT
;               BIT 7=ONE OR TWO STOP BITS
;               BIT 6=APPEND/NO APPEND LINE FEED
;               BITS 4,5=TRANSLATION MODE
;                       BIT5=1 ==>NO TRANSLATE
;                       BIT4=1 ==>SHORT ASCII TRANSLATION
;                           =0 ==>LONG ASCII TRANSLATION
;               BITS 2,3=INPUT PARITY MODE
;                       0 ==> IGNORE PARITY
;                       1 ==> ODD CHECK
;                       2 ==> EVEN CHECK
;                       3 ==> STRIP PARITY
;               BITS 0,1=OUTPUT PARITY MODE
;                       0 ==> SKIP ANY PARITY
;                       1 ==> ODD PARITY SET
;                       2 ==> EVEN PARITY SET
;                       3 ==> ALWAYS SET PARITY BIT

RSPRCH  .RES 4   USER-DEFINED SUPPRESSION CHARACTER
TOBUF   .RES 2   TOP OF BUFFER POINTER
BOBUF   .RES 2   BOTTOM OF BUFFER POINTER
NEXTIN  .RES 2   NEXT FREE INPUT LOCATION IN BUFFER
NXTOUT  .RES 2   ELDEST-USED OUTPUT LOCATION IN BUFFER
INSTAT  .RES 2   # OF BYTES IN INPUT STREAM BUFFER (ADDRESS STYLE)
OUSTAT  .RES 1   # OF BYTES IN OUTPUT STREAM BUFFER
RVSAVE  .RES 6   TEMPORARY FOR SYSTEM VECTORS WHEN TAKEN
RMAINV  .RES 2   STORAGE FOR VIMIRQ, MAIN SYTEM IRQ VECTOR
ALLDUN  .RES 1   FLAG INDICATING INTERUPT-DRIVEN I/O IS COMPLETE
ACTSTR  .RES 1   NUMBER OF DEVICE WHICH IS ACTIVELY STREAMING (BIT6 SET=NONE)
RSCHAR  .RES 1   RS232 XMIT CHARACTER (UNTRANSLATED)
DUMMY   .EQU *   END OF BUFFERS POINTER
RHLONG  .EQU DUMMY-ORIGIN+1  TOTAL LENGTH OF HANDLER (EVEN LENGTH ONLY)


        .END
