;
;
;       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
;
        	org	0
LINZBS	ds	2	;LINBUG  RAM (WILL BE REPLACED BY MONITOR RAM)
;
; THESE LOCATIONS ARE NOT CLEARED
CASINI	ds	2	;CASSETTE INIT LOCATION
RAMLO	ds	2	;RAM POINTER FOR MEMORY TEST
TRAMSZ	ds	1	;TEMPORARY REGISTER FOR RAM SIZE
TSTDAT	ds	1	;RAM TEST DATA REGISTER
;
; CLEARED ON COLDSTART ONLY
WARMST	ds	1	;WARM START FLAG
BOOT?	ds	1	;SUCCESSFUL BOOT FLAG
DOSVEC	ds	2	;DISK SOFTWARE START VECTOR
DOSINI	ds	2	;DISK SOFTWARE INIT ADDRESS
APPMHI	ds	2	;APPLICATIONS MEMORY HI LIMIT
;
; CLEARED ON COLD OR WARM START
INTZBS  =	*	;INTERRUPT HANDLER
POKMSK	ds	1	;SYSTEM MASK FOR POKEY IRQ ENABLE
BRKKEY	ds	1	;BREAK KEY FLAG
RTCLOK	ds	3	;REAL TIME CLOCK (IN 16 MSEC UNITS)
;
BUFADR	ds	2	;INDIRECT BUFFER ADDRESS REGISTER
;
ICCOMT	ds	1	;COMMAND FOR VECTOR
;
DSKFMS	ds	2	;DISK FILE MANAGER POINTER
DSKUTL	ds	2	;DISK UTILITIES POINTER
;
PTIMOT	ds	1	;PRINTER TIME OUT REGISTER
PBPNT	ds	1	;PRINT BUFFER POINTER
PBUFSZ	ds	1	;PRINT BUFFER SIZE
PTEMP	ds	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	ds	1	;HANDLER INDEX NUMBER (FF = IOCB FREE)
ICDNOZ	ds	1	;DEVICE NUMBER (DRIVE NUMBER)
ICCOMZ	ds	1	;COMMAND CODE
ICSTAZ	ds	1	;STATUS OF LAST IOCB ACTION
ICBALZ	ds	1	;BUFFER ADDRESS LOW BYTE
ICBAHZ	ds	1
ICPTLZ	ds	1	;PUT BYTE ROUTINE ADDRESS - 1
ICPTHZ	ds	1
ICBLLZ	ds	1	;BUFFER LENGTH LOW BYTE
ICBLHZ	ds	1
ICAX1Z	ds	1	;AUXILIARY INFORMATION FIRST BYTE
ICAX2Z	ds	1
ICSPRZ	ds	4	;TWO SPARE BYTES (CIO LOCAL USE)
ICIDNO	=	ICSPRZ+2	;IOCB NUMBER X 16
CIOCHR	=	ICSPRZ+3	;CHARACTER BYTE FOR CURRENT OPERATION
;
STATUS	ds	1	;INTERNAL STATUS STORAGE
CHKSUM	ds	1	;CHECKSUM (SINGLE BYTE SUM WITH CARRY)
BUFRLO	ds	1	;POINTER TO DATA BUFFER (LO BYTE)
BUFRHI	ds	1	;POINTER TO DATA BUFFER (HI BYTE)
BFENLO	ds	1	;NEXT BYTE PAST END OF THE DATA BUFFER (LO BYTE)
BFENHI	ds	1	;NEXT BYTE PAST END OF THE DATA BUFFER (HI BYTE)
CRETRY	ds	1	;NUMBER OF COMMAND FRAME RETRIES
DRETRY	ds	1	;NUMBER OF DEVICE RETRIES
BUFRFL	ds	1	;DATA BUFFER FULL FLAG
RECVDN	ds	1	;RECEIVE DONE FLAG
XMTDON	ds	1	;TRANSMISSION DONE FLAG
CHKSNT	ds	1	;CHECKSUM SENT FLAG
NOCKSM	ds	1	;NO CHECKSUM FOLLOWS DATA FLAG
;
;
BPTR	ds	1
FTYPE	ds	1
FEOF	ds	1
FREQ	ds	1
SOUNDR	ds	1	;NOISY I/O FLAG.  (ZERO IS QUIET)
CRITIC	ds	1	;DEFINES CRITICAL SECTION (CRITICAL IF NON-ZERO)
;
FMSZPG	ds	7	;DISK FILE MANAGER SYSTEM ZERO PAGE
;
;
CKEY	ds	1	;FLAG SET WHEN GAME START PRESSED
CASSBT	ds	1	;CASSETTE BOOT FLAG
DSTAT	ds	1	;DISPLAY STATUS
;
ATRACT	ds	1	;ATRACT FLAG
DRKMSK	ds	1	;DARK ATRACT MASK
COLRSH	ds	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	ds	1
HOLD1	ds	1
LMARGN	ds	1	;LEFT MARGIN (SET TO 1 AT POWER ON)
RMARGN	ds	1	;RIGHT MARGIN (SET TO 38 AT POWER ON)
ROWCRS	ds	1	;CURSOR COUNTERS
COLCRS	ds	2
DINDEX	ds	1
SAVMSC	ds	2
OLDROW	ds	1
OLDCOL	ds	2
OLDCHR	ds	1	;DATA UNDER CURSOR
OLDADR	ds	2
NEWROW	ds	1	;POINT DRAW GOES TO
NEWCOL	ds	2
LOGCOL	ds	1	;POINTS AT COLUMN IN LOGICAL LINE
ADRESS	ds	2
MLTTMP	ds	2
OPNTMP	=	MLTTMP	;FIRST BYTE IS USED IN OPEN AS TEMP
SAVADR	ds	2
RAMTOP	ds	1	;RAM SIZE DEFINED BY POWER ON LOGIC
BUFCNT	ds	1	;BUFFER COUNT
BUFSTR	ds	2	;EDITOR GETCH POINTER
BITMSK	ds	1	;BIT MASK
SHFAMT	ds	1
ROWAC	ds	2
COLAC	ds	2
ENDPT	ds	2
DELTAR	ds	1
DELTAC	ds	2
ROWINC	ds	1
COLINC	ds	1
SWPFLG	ds	1	;NON-0 IF TXT AND REGULAR RAM IS SWAPPED
HOLDCH	ds	1	;CH IS MOVED HERE IN KGETCH BEFORE CNTL & SHIFT PROC
INSDAT	ds	1
COUNTR	ds	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
;
	org	$0200
INTABS	=	*	;INTERRUPT RAM
VDSLST	ds	2	;DISPLAY LIST NMI VECTOR
VPRCED	ds	2	;PROCEED LINE IRQ VECTOR
VINTER	ds	2	;INTERRUPT LINE IRQ VECTOR
VBREAK	ds	2	;SOFTWARE BREAK (00) INSTRUCTION IRQ VECTOR
VKEYBD	ds	2	;POKEY KEYBOARD IRQ VECTOR
VSERIN	ds	2	;POKEY SERIAL INPUT READY IRQ
VSEROR	ds	2	;POKEY SERIAL OUTPUT READY IRQ
VSEROC	ds	2	;POKEY SERIAL OUTPUT COMPLETE IRQ
VTIMR1	ds	2	;POKEY TIMER 1 IRQ
VTIMR2	ds	2	;POKEY TIMER 2 IRQ
VTIMR4	ds	2	;POKEY TIMER 4 IRQ
VIMIRQ	ds	2	;IMMEDIATE IRQ VECTOR
CDTMV1	ds	2	;COUNT DOWN TIMER 1
CDTMV2	ds	2	;COUNT DOWN TIMER2
CDTMV3	ds	2	;COUNT DOWN TIMER 3
CDTMV4	ds	2	;COUNT DOWN TIMER 4
CDTMV5	ds	2	;COUNT DOWN TIMER 5
VVBLKI	ds	2	;IMMEDIATE VERTICAL BLANK NMI VECTOR
VVBLKD	ds	2	;DEFERRED VERTICAL BLANK NMI VECTOR
CDTMA1	ds	2	;COUNT DOWN TIMER 1 JSR ADDRESS
CDTMA2	ds	2	;COUNT DOWN TIMER 2 JSR ADDRESS
CDTMF3	ds	1	;COUNT DOWN TIMER 3 FLAG
SRTIMR	ds	1	;SOFTWARE REPEAT TIMER
CDTMF4	ds	1	;COUNT DOWN TIMER 4 FLAG
INTEMP	ds	1	;IAN'S TEMP (RENAMED FROM T1 BY POPULAR DEMAND)
CDTMF5	ds	1	;COUNT DOWN TIMER FLAG 5
SDMCTL	ds	1	;SAVE DMACTL REGISTER
SDLSTL	ds	1	;SAVE DISPLAY LIST LOW BYTE
SDLSTH	ds	1	;SAVE DISPLAY LIST HI BYTE
SSKCTL	ds	1	;SKCTL REGISTER RAM
	ds	1
;
LPENH	ds	1	;LIGHT PEN HORIZONTAL VALUE
LPENV	ds	1	;LIGHT PEN VERTICAL VALUE
	ds	2	;SPARE BYTES
;
	ds	2	;SPARE
;
CDEVIC	ds	1	;COMMAND FRAME BUFFER - DEVICE
CCOMND	ds	1	;COMMAND
CAUX1	ds	1	;COMMAND AUX BYTE 1
CAUX2	ds	1	;COMMAND AUX BYTE 2
			;NOTE: MAY NOT BE THE LAST WORD ON A PAGE
TEMP	ds	1	;TEMPORARY RAM CELL
			;NOTE: MAY NOT BE THE LAST WORD ON A PAGE
ERRFLG	ds	1	;ERROR FLAG - ANY DEVICE ERROR EXCEPT TIME OUT
;
DFLAGS	ds	1	;DISK FLAGS FROM SECTOR ONE
DBSECT	ds	1	;NUMBER OF DISK BOOT SECTORS
BOOTAD	ds	2	;ADDRESS WHERE DISK BOOT LOADER WILL BE PUT
COLDST	ds	1	;COLDSTART FLAG (1=IN MIDDLE OF COLDSTART)
;
	ds	1	;SPARE
;
DSKTIM	ds	1	;DISK TIME OUT REGISTER
;
LINBUF	ds	40	;CHAR LINE BUFFER
;
GPRIOR	ds	1	;GLOBAL PRIORITY CELL
;
PADDL0	ds	1	;POTENTIOMETER 0 RAM CELL
PADDL1  ds	1
PADDL2  ds	1
PADDL3  ds	1
PADDL4  ds	1
PADDL5  ds	1
PADDL6  ds	1
PADDL7  ds	1
STICK0  ds	1	;JOYSTICK 0 RAM CELL
STICK1  ds	1
STICK2  ds	1
STICK3  ds	1
PTRIG0  ds	1	;PADDLE TRIGGER 0
PTRIG1  ds	1
PTRIG2  ds	1
PTRIG3  ds	1
PTRIG4  ds	1
PTRIG5  ds	1
PTRIG6  ds	1
PTRIG7  ds	1
STRIG0  ds	1	;JOYSTICK TRIGGER 0
STRIG1  ds	1
STRIG2  ds	1
STRIG3  ds	1
;
CSTAT	ds	1
WMODE	ds	1
BLIM	ds	1
;
	ds	5	;SPARE
;
;
;
;
TXTROW  ds	1	;TEXT ROWCRS
TXTCOL  ds	2	;TEXT COLCRS
TINDEX  ds	1	;TEXT INDEX
TXTMSC  ds	2	;FOOLS CONVRT INTO NEW MSC
TXTOLD  ds	6	;OLDROW & OLDCOL FOR TEXT (AND THEN SOME)
TMPX1	ds	1
HOLD3	ds	1
SUBTMP  ds	1
HOLD2	ds	1
DMASK	ds	1
TMPLBT  ds	1
ESCFLG  ds	1	;ESCAPE FLAG
TABMAP  ds	15
LOGMAP  ds	4	;LOGICAL LINE START BIT MAP
INVFLG  ds	1	;INVERSE VIDEO FLAG (TOGGLED BY ATARI KEY)
FILFLG  ds	1	;RIGHT FILL FLAG FOR DRAW
TMPROW  ds	1
TMPCOL  ds	2
SCRFLG  ds	1	;SET IF SCROLL OCCURS
HOLD4	ds	1	;TEMP CELL USED IN DRAW ONLY
HOLD5	ds	1	;DITTO
SHFLOK  ds	1
BOTSCR  ds	1	;BOTTOM OF SCREEN : 24 NORM  4 SPLIT
;
;
PCOLR0  ds	1	;P0 COLOR
PCOLR1  ds	1	;P1 COLOR
PCOLR2  ds	1	;P2 COLOR
PCOLR3  ds	1	;P3 COLOR
COLOR0  ds	1	;COLOR 0
COLOR1  ds	1
COLOR2  ds	1
COLOR3  ds	1
COLOR4  ds	1
;
;
	ds	23	;SPARE
;
;
;
GLBABS  =	*	;GLOBAL VARIABLES
;
	ds	4	;SPARE
;
RAMSIZ  ds	1	;RAM SIZE (HI BYTE ONLY)
MEMTOP  ds	2	;TOP OF AVAILABLE USER MEMORY
MEMLO	ds	2	;BOTTOM OF AVAILABLE USER MEMORY
	ds	1	;SPARE
DVSTAT  ds	4	;STATUS BUFFER
CBAUDL  ds	1	;CASSETTE BAUD RATE LOW BYTE
CBAUDH  ds	1
;
CRSINH  ds	1	;CURSOR INHIBIT (00 = CURSOR ON)
KEYDEL  ds	1	;KEY DELAY
CH1	ds	1
;
CHACT	ds	1	;CHACTL REGISTER RAM
CHBAS	ds	1	;CHBAS REGISTER RAM
;
	ds	5	;SPARE BYTES
;
CHAR	ds	1
ATACHR  ds	1	;ATASCII CHARACTER
CH	ds	1	;GLOBAL VARIABLE FOR KEYBOARD
FILDAT  ds	1	;RIGHT FILL DATA (DRAW)
DSPFLG  ds	1	;DISPLAY FLAG : DISPLAY CNTLS IF NON-ZERO
SSFLAG  ds	1	;START/STOP FLAG FOR PAGING (CNTL 1). CLEARED BY BREAK
;
;
;
;
;
;
;
;       PAGE THREE RAM ASSIGNMENTS
;
DCB	=	*	;DEVICE CONTROL BLOCK
DDEVIC	ds	1	;PERIPHERAL UNIT 1 BUS I.D. NUMBER
DUNIT	ds	1	;UNIT NUMBER
DCOMND	ds	1	;BUS COMMAND
DSTATS	ds	1	;COMMAND TYPE/STATUS RETURN
DBUFLO	ds	1	;DATA BUFFER POINTER LOW BYTE
DBUFHI	ds	1
DTIMLO	ds	1	;DEVICE TIME OUT IN 1 SECOND UNITS
DUNUSE	ds	1	;UNUSED BYTE
DBYTLO	ds	1	;NUMBER OF BYTES TO BE TRANSFERRED LOW BYTE
DBYTHI	ds	1
DAUX1	ds	1	;COMMAND AUXILIARY BYTE 1
DAUX2	ds	1
;
TIMER1	ds	2	;INITIAL TIMER VALUE
ADDCOR	ds	1	;ADDITION CORRECTION
CASFLG	ds	1	;CASSETTE MODE WHEN SET
TIMER2	ds	2	;FINAL TIMER VALUE. THESE TWO TIMER VALUES
;	;	;	;	;	;ARE USED TO COMPUTE INTERVAL FOR BAUD RATE
TEMP1	ds	2	;TEMPORARY STORAGE REGISTER
TEMP2	ds	1	;TEMPORARY STORAGE REGISTER
TEMP3	ds	1	;TEMPORARY STORAGE REGISTER
SAVIO	ds	1	;SAVE SERIAL IN DATA PORT
TIMFLG	ds	1	;TIME OUT FLAG FOR BAUD RATE CORRECTION
STACKP	ds	1	;SIO STACK POINTER SAVE CELL
TSTAT	ds	1	;TEMPORARY STATUS HOLDER
;
;
;
HATABS	ds	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	ds	1	;HANDLER INDEX NUMBER (FF = IOCB FREE)
ICDNO	ds	1	;DEVICE NUMBER (DRIVE NUMBER)
ICCOM	ds	1	;COMMAND CODE
ICSTA	ds	1	;STATUS OF LAST IOCB ACTION
ICBAL	ds	1	;BUFFER ADDRESS LOW BYTE
ICBAH	ds	1
ICPTL	ds	1	;PUT BYTE ROUTINE ADDRESS - 1
ICPTH	ds	1
ICBLL	ds	1	;BUFFER LENGTH LOW BYTE
ICBLH	ds	1
ICAX1	ds	1	;AUXILIARY INFORMATION FIRST BYTE
ICAX2	ds	1
ICSPR	ds	4	;FOUR SPARE BYTES
	ds	MAXIOC-IOCBSZ
;
PRNBUF	ds	40	;PRINTER BUFFER
;
	ds	21	;SPARE BYTES
;
;
;
;
;
;
;
;	;	; PAGE FOUR RAM ASSIGNMENTS
;
CASBUF	ds	131	;CASSETTE BUFFER
;
; USER AREA STARTS HERE AND GOES TO END OF PAGE FIVE
USAREA	ds	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)
	org	$D4
FR0	ds	FPREC	;FP REG0
FRE	ds	FPREC
FR1	ds	FPREC	;FP REG1
FR2	ds	FPREC
FRX	ds	1	;FP SPARE
EEXP	ds	1	;VALUE OF E
NSIGN	ds	1	;SIGN OF #
ESIGN	ds	1	;SIGN OF EXPONENT
FCHRFLG ds	1	;1ST CHAR FLAG
DIGRT	ds	1	;# OF DIGITS RIGHT OF DECIMAL
CIX	ds	1	;CURRENT INPUT INDEX
INBUFF	ds	2	;POINTS TO USER'S LINE INPUT BUFFER
ZTEMP1	ds	2
ZTEMP4	ds	2
ZTEMP3	ds	2
DEGFLG
RADFLG	ds	1	;0=RADIANS, 6=DEGREES
RADON 	=	0	;INDICATES RADIANS
DEGON 	=	6	;INDICATES DEGREES
FLPTR	ds	2	;POINTS TO USER'S FLOATING PT NUMBER
FPTR2	ds	2
;FLOATING PT ROUTINES' NON-ZERO PAGE RAM (NEEDED ONLY IF F.P. ROUTINES CALLED)
	org	$57E
LBPR1	ds	1	;LBUFF PREFIX 1
LBPR2	ds	1	;LBUFF PREFIX 2
LBUFF	ds	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]
;
;
;
;
;
;	;  VECTOR TABLE
;
;HANDLER ENTRY POINTS ARE CALLED OUT IN THE FOLLOWING VECTOR
;TABLE. THESE ARE THE ADDRESSES MINUS ONE.
;
;RS-232 HANDLER (RELOCATING VERSION !!)
;
;RS-232 HANDLER CODE (COLLEEN RESIDENT)
;
;
ORIGIN	=	$700	; PROGRAM ORIGIN FOR ASSEMBLER
RBFSIZ	=	32
RSTAT	=	'S'	;DCB STATUS COMMAND
WRITE	=	'W'	;DCB WRITE COMMAND
CTLCOM	=	'A'	;DCB CONTROL COMMAND
STRCOM	=	'X'	;DCB STREAM COMMAND
CNFCOM	=	'B'	;DCB CONFIGURE COMMAND
STRCMD	=	$28	;IOCB STREAM COMMAND
TRNCMD	=	$26	;IOCB TRANSLATE COMMAND
CNFCMD	=	$24	;IOCB CONFIGURE COMMAND
CTLCMD	=	$22	;IOCB CONTROL COMMAND
FRCCMD	=	$20	;IOCB FORCE BLOCK COMMAND
RSADRS	=	$50	;RS-232 DEVICE ADDRESS
PRTOPN	=	150	;PORT ALREADY OPEN ERROR
NOSTER	=	151	;PORT NOT OPEN FOR STREAM ERROR
BADBUF	=	152	;BAD USER-SUPPLIED BUFFERS
STACTV	=	153	;ANOTHER STREAM IS ALREADY ACTIVE
NOSTAC	=	154	;NO STREAM IS ACTIVE (THUS, NO INPUT ALLOWED)

	LIST	I

	ORG	ORIGIN	;DEVELOPMENT ORIGIN

RHOPEN	JSR	RDVTST	;TEST FOR VALID DEVICE NUMBER

	LDA	IOCTRL-1,X
	BPL	RNTOPN	;TEST FOR PORT ALREADY OPEN
	LDY	#PRTOPN	;ERROR, PORT ALREADY OPENED
	RTS

RNTOPN	LDA	ICAX1Z
	TAY
	AND	#12
	BNE	ROKOPN
	LDY	#132	;ERROR, NO PERMISSIONS GRANTED ON OPEN
	RTS
ROKOPN	TYA
	ORA	#$80
	STA	IOCTRL-1,X	;SET-UP PERMISSION BYTE
	LDA	#0
	STA	PUTCTR-1,X	;INITIALIZE PUT-COUNTER
	STA	RERROR-1,X	;CLEAR ERROR FLAGS
	LDY	#SUCCES
	RTS

RHCLOS  JSR	RDVTST	;TEST DEVICE NUMBER FOR VALIDITY

	CPX	ACTSTR
	BEQ	CLSTRM	;TEST FOR ACTIVE STREAM, BRANCH IF SO

	LDA	PUTCTR-1,X
	BEQ	MTPBUF	;TEST FOR BUFFER EMPTY, BRANCH IF SO

	JSR	PREPUT	;PREPARE TO DO A PUT-BLOCK
	LDY	#$80
	BNE	CLSPUT	;JOIN AND SEND DCB (BRANCH IS A JUMP)

CLSTRM  LDA	ALLDUN
	BEQ	CLSTRM	;WAIT FOR BUFFER TO DRAIN
	SEI
	LDA	RMAINV
	STA	VIMIRQ
	LDA	RMAINV+1
	STA	VIMIRQ+1	;RESTORE MAIN SYSTEM IRQ VECTOR
	LDX	#5
CLSVCT  LDA	RVSAVE,X
	STA	VSERIN,X
	DEX
	BPL	CLSVCT	;RETURN SYSTEM INTERRUPT VECTORS
	CLI
	LDA	ACTSTR
	STX	ACTSTR	;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
	STA	IOCTRL-1,X	;CLEAR DEVICE PERMISSIONS AND ETC.
	LDA	#WRITE
	JMP	MAKDCB	;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	STA	RSCHAR	;SAVE UNTRANSLATED CHARACTER
	LDA	IOCTRL-1,Y
	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

	LDA	RTRANS-1,X
	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	LDA	RSCHAR
	CMP	#$9B	;TEST FOR <EOL>
	BNE	REGOTR
	LDA	RTRANS-1,X
	AND	#$40
	BEQ	TONOLF	;TEST FOR REQUEST TO APPEND <LF>
	LDA	#$D	;APPEND <LF> CASE ...
	JSR	PAROUT	;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	STA	RSCHAR	;SAVE TRANSLATED CHARACTER
PAROT2	LDA	RTRANS-1,X
	AND	#$3
	BEQ	POTXIT	;0=SKIP, IGNORE PARITY BIT
	CMP	#3
	BEQ	STOUTP	;3=SET-PARITY REQUESTED
	TAY		;SAVE PARITY-REQUEST FLAG
	JSR	CLHIBT	;MASK ANY HI-BIT PRESENT
	JSR	PARITY	;FIND ORIGINAL PARITY
	TYA
	AND	#2	;2=EVEN PARITY, ODD ELSE
	BEQ	ODDOUT
	BCC	POTXIT
STOUTP	LDA	RSCHAR
	ORA	#$80	;SET PARITY BIT
	STA	RSCHAR
	BMI	POTXIT	;JUMP/BRANCH
ODDOUT	BCC	STOUTP
POTXIT	LDX	ICDNOZ	;PARITY COMPLETE, RESTORE DEVICE NUMBER
	CPX	ACTSTR
	BEQ	PUTSTR	;TEST FOR DEVICE ACTIVELY STREAMING

	JSR	X32M1	;A=32*(DEVICE#-1)
	ADC	PUTCTR-1,X
	TAY			;Y=INDEX INTO PROPER PUT BUFFER
	LDA	RSCHAR
	STA	OUTBAS,Y	;PUT DATA-BYTE INTO BUFFER
	INC	PUTCTR-1,X

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

	LDA	#RBFSIZ
	CMP	PUTCTR-1,X	;INCREMENT BUFFER COUNTER AND CHECK BUFFER FULL
	BEQ	PTBFUL
	LDY	#SUCCES
	RTS			;... EXIT IF BUFFER NOT FULL
;       **** SPECIAL ENTRY POINT FOR FORCE ****
PTBFUL	JSR	PREPUT
	LDY	#$80		;Y=DCB STATUS BYTE
	LDA	#0
	STA	PUTCTR-1,X	;CLEAR PUT-COUNTER
	LDA	#WRITE
	JMP	MAKDCB	;EXIT THRU SIO WITH A WRITE DCB

PUTSTR	LDA	OUSTAT
	CMP	#RBFSIZ-1
	BCS	PUTSTR		;TEST FOR PUT-BUFFER FULL, WAIT IF SO ...
	JSR	X32M1	;A=32*(ACTIVE STREAM-1)
	SEI
	ADC	PUTCTR-1,X
	TAY			;Y=POINTER INTO PROPER PUT-BUFFER
	LDA	RSCHAR		;FETCH TRANSLATED CHARACTER
	STA	OUTBAS,Y	;PLACE CHARACTER IN BUFFER
	LDY	PUTCTR-1,X
	JSR	CIRCIN		;CIRCULAR INCREMENT
	STA	PUTCTR-1,X
	INC	OUSTAT		;COUNT A BYTE IN THE BUFFER
	LDA	POKMSK
	LDY	RTRANS-1,X
	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
	STY	ALLDUN	;SET ALL-DONE FLAG TO FALSE
	CLI
	INY
	RTS		;RETURN SUCCESS


RHGET	JSR	RDVTST	;TEST DEVICE NUMBER FOR VALIDITY

	LDA	IOCTRL-1,X
	AND	#4
	BNE	READOK	;TEST FOR READ PERMISSION
	LDY	#WRONLY
	RTS		;RETURN ERROR STATUS

READOK	CPX	ACTSTR
	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
	JSR	CMP16B	;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
	LDA	NXTOUT
	STA	ICSPRZ
	LDA	NXTOUT+1
	STA	ICSPRZ+1	;SET-UP AN INDIRECT POINTER
	LDY	#0
	LDA	(ICSPRZ),Y	;FETCH NEXT-OUT DATA BYTE
	STA	RSCHAR		;SAVE UNTRANSLATED CHARACTER
	PLA
	STA	ICSPRZ+1
	PLA
	STA	ICSPRZ	;RETURN BORROWED ZERO PAGE
	SEC
	LDA	INSTAT
	SBC	#1
	STA	INSTAT
	BCS	GTSBOK
	DEC	INSTAT+1
GTSBOK  LDX	#2
	JSR	CIN16B	;16-BIT CIRCULAR INCREMENT OF NXTOUT POINTER
	CLI
	LDX	ICDNOZ	;RESTORE THE X-REGISTER


; INPUT PARITY CHECKING

	LDA	RTRANS-1,X
	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
	LDA	RSCHAR
	JSR	PARITY	;DERIVE PARITY
	TYA
        AND	#2
        BEQ	PINODD	;2=EVEN PARITY CHECKING, ODD CHECKING ELSE
        BCC	PINCLR
PINERR	LDX	ICDNOZ	;RESTORE DEVICE NUMBER
        LDA	#$20
        ORA	RERROR-1,X	;SET PARITY ERROR BIT
        STA	RERROR-1,X
        BNE	PINCLR		;JUMP/BRANCH TO EXIT
PINODD	BCC	PINERR
PINCLR	JSR	CLHIBT	;CLEAR ANY PARITY BIT
;
; INPUT TRANSLATION
;
INTRNS	LDX	ICDNOZ		;RESTORE DEVICE NUMBER
        LDA	RTRANS-1,X
        AND	#$30		;STRIP ALL BUT TRANSLATE MODE
        CMP	#$20
        BCC	DOTRNS
        LDA	RSCHAR	;NO TRANSLATION IS DESIRED
        LDY	#SUCCES
        RTS		;RETURN SUCCESS

DOTRNS	TAY
        JSR	CLHIBT	;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	LDA	RSPRCH-1,X	;FIND INPUT SUPPRESSION TRANSLATE CHAR

INTRXT	LDY	#SUCCES		;EXIT, SUCCESS
        RTS

RHSTAT	JSR	RDVTST		;TEST DEVICE# FOR VALIDITY

        LDA	RERROR-1,X
        STA	DVSTAT		;FETCH AND STORE DEVICE STATUS
        STA	RSCHAR		;SAVE FOR BLOCK MODE STATUS
        LDA	#0
        STA	RERROR-1,X	;RESET DEVICE ERROR STATUS BYTE
        CPX	ACTSTR
        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
        JSR	MAKDCB	;CREATE SIO CALL
        LDA	RSCHAR
        ORA	DVSTAT	;INSERT PARITY ERROR BIT
        STA	DVSTAT
        CPY	#0	;RESET I/O SUCCESS/FAILURE FLAG
        RTS

STASTR	LDY	#3
STSTLP	LDA	INSTAT-1,Y
        STA	DVSTAT,Y
        DEY
        BNE	STSTLP	;COPY OVER STATUS BYTES FOR USER
        INY
        RTS		;RETURN SUCCESS

RHSPEC	JSR	RDVTST	;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
        LDA	JMPTBL+1,Y
        PHA
        LDA	JMPTBL,Y
        PHA			;INDIRECT JUMP TO PROPER ENTRY POINT
        RTS

XIOERR	LDY	#NVALID
        RTS			;ERROR, COMMAND IS INVALID


STREAM	LDA	IOCTRL-1,X
        BMI	STROPN		;TEST FOR PORT OPEN
        LDY	#NOTOPN
        RTS			;RETURN ERROR IF NOT
STROPN	BIT	ACTSTR
        BVS	STROK2	;TEST FOR ANOTHER STREAM ALREADY ACTIVE (BIT6=0)
        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
        STA	BOBUF
        ADC	ICBLLZ
        STA	TOBUF	;COMPUTE LO-BYTE OF BUFFER POINTER
        LDA	ICBAHZ
        STA	BOBUF+1
        ADC	ICBLHZ
        STA	TOBUF+1	;COMPUTE HI-BYTE OF BUFFER POINTER
        BCC	RDJOIN
        LDY	#BADBUF	;IF OVERFLOW THEN ERROR
        RTS

SYSBUF	JSR	X32M1		;PREPARE TO OPEN A SYSTEM BUFFER INPUT STREAM
        ADC	#LOW INBASE
        STA	BOBUF
        LDA	#HIGH INBASE
        ADC	#0
        STA	BOBUF+1		;SET BOTTOM-OF-BUFFER TO POINT TO SYSTEM
        CLC
        LDA	BOBUF
        ADC	#RBFSIZ-1
        STA	TOBUF
        LDA	BOBUF+1
        ADC	#0
        STA	TOBUF+1	;COMPUTE TOP-OF-BUFFER POINTER IN SYSTEM BUFFER

RDJOIN	LDY	#6
STINLP	JSR	CINTRY	;SET POINTERS TO BOTTOM-OF-BUFFER
        DEY
        DEY		;SET-UP INPUT AND OUTPUT POINTERS
        CPY	#2
        BNE	STINLP

STNORD	LDX	ICDNOZ
        LDA	IOCTRL-1,X
        AND	#$8		;EST FOR WRITE PERMISSION
        BEQ	STNOWT
        LDA	#0
        STA	PUTCTR-1,X
        STA	GETCTR-1,X	;INITIALIZE OUTPUT-STREAM PUT AND GET POINTERS

STNOWT	STA	DBYTHI
        LDA	#LOW RVSAVE
        STA	DBUFLO
        LDA	#HIGH RVSAVE
        STA	DBUFHI
        LDA	IOCTRL-1,X
        STA	DAUX1		;DAUX1=IO PERMISSION FOR CONTROLLER
        LDA	#9
        STA	DBYTLO		;CREATE A STREAM DCB
        LDY	#$40
        LDA	#STRCOM
        JSR	MAKDCB		;EXECUTE AN SIO CALL TO CONTROLLER
        BPL	STROK4
        RTS			;RETURN IF ERROR ENCOUNTERED DURING SIO
STROK4	SEI
        LDA	#$73
        STA	SKCTL
        LDA	RVSAVE+8
        STA	AUDCTL		;SET-UP SUPPLIED AUDIO CONTROL
        LDY	#7
STRCTL	LDA	RVSAVE,Y
        STA	AUDF1,Y
        DEY
        BPL	STRCTL	;SET-UP BAUD RATE SUPPLIED BY CONTROLLER

        LDX	#5
STVCTL	LDA	VSERIN,X
        STA	RVSAVE,X
        LDA	RVECTS,X
        STA	VSERIN,X	;REPLACE ALL SYSTEM SIO INTERRUPTS WITH OWN
        DEX
        BPL	STVCTL

        LDA	VIMIRQ
        STA	RMAINV
        LDA	#LOW RBREAK
        STA	VIMIRQ
        LDA	VIMIRQ+1
        STA	RMAINV+1
        LDA	#HIGH RBREAK
        STA	VIMIRQ+1	;REPLACE AND SAVE MAIN SYSTEM IRQ VECTOR

        LDA	#0
        LDY	#2
STRZLN	STA	INSTAT,Y
        DEY
        BPL	STRZLN		;CLEAR ALL STATUS COUNTERS

        LDX	ICDNOZ
        LDA	IOCTRL-1,X
        AND	#4
        BEQ	NOINPT		;TEST FOR READ PERMISSION
        LDA	POKMSK
        ORA	#$20
        STA	IRQEN
        STA	POKMSK	;ENABLE INPUT INTERRUPT

NOINPT	STX	ACTSTR	;RECOGNIZE ACTIVE STREAM
        STX	ALLDUN	;RESET ALL DONE FLAG TO TRUE (NON-ZERO)
        CLI
        BNE	SPCXIT	;EXIT AND RESTORE AUX1 OF THE IOCB

FORCE	LDA	IOCTRL-1,X
        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	LDA	PUTCTR-1,X
        BEQ	SPCXIT		;EXIT IF BUFFER IS EMPTY
        JSR	PTBFUL		;** SPECIAL ENTRY ENTRY TO PUT THE BUFFER **
        BNE	SPXIT2		;EXIT, AND RESTORE I/O PERMISSIONS

CONFIG	LDY	#$7F
        JSR	SETRNS		;SET INTERNAL TRANSLATION FLAGS
        LDA	#CNFCOM
        JSR	SPCDCB	;MAKE A SPECIAL DCB AND EXIT
        BNE	SPXIT2	;EXIT, AND RESTORE I/O PERMISSIONS

CONTRL	LDA	#CTLCOM
        JSR	SPCDCB	;CREATE A SPECIAL DCB AND EXIT
        BNE	SPXIT2	;EXIT, AND RESTORE I/O PERMISSIONS

TRANSL	LDY	#$80
        JSR	SETRNS	;SET INTERNAL TRANSLATION FLAGS
        LDA	ICAX2Z
        STA	RSPRCH-1,X	;SAVE SUPPRESS/FILL CHARACTER
SPCXIT	LDY	#SUCCES
SPXIT2	LDX	ICDNOZ
        LDA	IOCTRL-1,X	;FETCH DEVICE PERMISSIONS
        STA	ICAX1Z		;AND RESTORE AFTER CIO CALL
        CPY	#0		;RESTORE STATUS BYTE
        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 ERROR ENCOUNTERED
CMPFND	LDA	#'R'
        STA	ACTSTR		;INDICATE NO ACTIVE STREAM (SET BIT 6)
        STA	HATABS,X	;INSERT HANDLER I.D.
        LDA	#LOW HANDVS
        STA	HATABS+1,X
        LDA	#HIGH HANDVS
        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 HANDLER LENGTH

                        	;CONTROL TRANSFERS HERE ON COLD/WARM START
        LDX	#4
RINCLD	LDA	#0		;COLD-START ENTRY, RELOCATOR SETS X=12
INITLP	STA	IOCTRL-1,X
        DEX
        BNE	INITLP		;CLEAR ALL HANDLER PERMISSIONS
        INX			;X=1
        JSR	STFUNK		;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
;       *** NOTE THAT THIS ADDRESS IS SET BY THE RELOCATOR

;       SUBROUTINE TO MONITOR SYSTEM INTERRUPTS AND CAPTURE BREAK-KEY
;
RBREAK	BIT	IRQST
        BPL	ABREAK		;TEST FOR A BREAK-KEY
        JMP	(RMAINV)

ABREAK	PHA			;DO BREAK-KEY PROCESSING
        LDA	#$7F
        STA	IRQEN
        LDA	POKMSK
        STA	IRQEN	;RESET BREAK-KEY INTERRUPT
        PLA
        RTI		;PULL 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
        LDA	NEXTIN
        STA	ICSPRZ
        LDA	NEXTIN+1
        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
        LDX	ACTSTR
        ORA	RERROR-1,X
        STA	RERROR-1,X	;SET LOCAL ERROR BITS
        PLA
        STA	ICSPRZ+1
        PLA
        STA	ICSPRZ		;RESTORE BORROWED ZERO PAGE
        LDX	#0
        JSR	CIN16B		;CIRCULAR INCREMENT NEXTIN POINTER
        LDY	#4
        LDX	#6
        JSR	CMP16B		;COMPARE NEXTIN WITH NXTOUT
        BNE	INOWRP
        LDX	#2
        JSR	CIN16B	;IF WRAPAROUND THEN CIRCULAR INCREMENT NXTOUT
        LDX	ACTSTR
        LDA	RERROR-1,X
        ORA	#$10
        STA	RERROR-1,X	;SET WRAP-AROUND ERROR FLAG
        BNE	RINXIT
INOWRP  LDX	#4
        JSR	INC16B		;16-BIT INCREMENT OF INSTAT COUNTER

RINXIT
;       *** 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
        LDX	ACTSTR
        LDA	PUTCTR-1,X
        CMP	GETCTR-1,X
        BNE	GTBFOK		;TEST FOR BUFFER EMPTY
        STX	ALLDUN		;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	JSR	X32M1		;A=32*(DEVICE#-1)
        ADC	GETCTR-1,X
        TAY			;Y=INDEX INTO PROPER BUFFER
        LDA	OUTBAS,Y
        STA	SEROUT		;PUT BYTE INTO SERIAL PORT
        LDY	GETCTR-1,X
        JSR	CIRCIN		;CIRCULAR INCREMENT OF GET POINTER
        STA	GETCTR-1,X

        DEC	OUSTAT	;COUNT A BYTE REMOVED FROM BUFFER
ROUTLP  LDA	IRQST
        AND	#8
        BEQ	ROUTLP	;WAIT FOR FIRST BIT OF DATA TO SHIFT IN
        BNE	INTXIT	;RESTORE REGISTERS AND EXIT



;       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	JSR	X32M1		;A=32*(DEVICE#-1)
        ADC	#LOW OUTBAS	;CARRY CLEAR FROM SHIFT
        STA	DBUFLO
        LDA	#0
        STA	DBYTHI
        ADC	#HIGH OUTBAS
        STA	DBUFHI		;POINTER=PROPER PUT BUFFER

        LDA	PUTCTR-1,X	;A=BUFFER LENGTH
        STA	DAUX1
        LDA	#64
        STA	DBYTLO	;KLUDGE TO COMPENSATE FOR AN O.S. BUG
        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
        AND	RTRANS-1,X
        STA	RTRANS-1,X	;MASK-OFF OLD VALUES
        TYA
        EOR	#$FF		;INVERT MASK
        AND	ICAX1Z		;AND MASK DATA
        ORA	RTRANS-1,X
        STA	RTRANS-1,X	;OR IN NEW VALUES
        RTS

;       SUBROUTINE TO MASK THE HI-BIT OF RSCHAR
;
;       GIVEN:  RSCHAR
;
;       REGISTER USAGE:
;               A=MASKING
;               RSCHAR RETURNED MASKED AND IN ACCUMULATOR
;
CLHIBT  LDA	RSCHAR
        AND	#$7F
        STA	RSCHAR
        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
;
;
INC16B	INC	NEXTIN,X
        BNE	N16XIT
        INC	NEXTIN+1,X
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	LDA	TOBUF+1,Y
        CMP	TOBUF+1,X
        BEQ	CMPMOR		;TEST LO-ORDER BYTES
        RTS
CMPMOR	LDA	TOBUF,Y
        CMP	TOBUF,X
        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	JSR	INC16B	;INCREMENT INDICATED POINTER
        TXA
        CLC
        ADC	#4
        TAY		;Y=PASSED POINTER+4
        LDX	#0
        JSR	CMP16B	;TEST FOR TOP-OF-BUFFER < POINTER
        BEQ	CINXIT	;STRICTLY GREATER-THAN FOR CIRCULARITY
        BCC	CINXIT
CINTRY  LDA	BOBUF	;CIRCULAR PART OF THE INCREMENT
        STA	TOBUF,Y
        LDA	BOBUF+1
        STA	TOBUF+1,Y	;RESET POINTER TO BOTTOM OF BUFFER
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


HANDVS  DW	RHOPEN-1
        DW	RHCLOS-1
        DW	RHGET-1
        DW	RHPUT-1
        DW	RHSTAT-1
        DW	RHSPEC-1
        JMP	RINWRM
        DB	0

JMPTBL  DW	FORCE-1,CONTRL-1,CONFIG-1,TRANSL-1,STREAM-1
RVECTS  DW	RIN,ROUT,ROUT





INBASE			;INPUT BUFFERS
INBF1   DS	RBFSIZ
INBF2   DS	RBFSIZ
INBF3   DS	RBFSIZ
INBF4   DS	RBFSIZ
OUTBAS			;OUTPUT BUFFERS
OUTBF1  DS	RBFSIZ
OUTBF2  DS	RBFSIZ
OUTBF3  DS	RBFSIZ
OUTBF4  DS	RBFSIZ
GETCTR  DS	4	;COUNTER FOR NUMBER OF ELEMENTS IN INPUT BUFFERS
PUTCTR  DS	4	;COUNTER FOR ELEMENTS IN OUTPUT BUFFERS
RERROR  DS	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  DS	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  DS	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	DS	4	;USER-DEFINED SUPPRESSION CHARACTER
TOBUF	DS	2	;TOP OF BUFFER POINTER
BOBUF	DS	2	;BOTTOM OF BUFFER POINTER
NEXTIN	DS	2	;NEXT FREE INPUT LOCATION IN BUFFER
NXTOUT	DS	2	;ELDEST-USED OUTPUT LOCATION IN BUFFER
INSTAT	DS	2	;# OF BYTES IN INPUT STREAM BUFFER (ADDRESS STYLE)
OUSTAT	DS	1	;# OF BYTES IN OUTPUT STREAM BUFFER
RVSAVE	DS	6	;TEMPORARY FOR SYSTEM VECTORS WHEN TAKEN
RMAINV	DS	2	;STORAGE FOR VIMIRQ, MAIN SYTEM IRQ VECTOR
ALLDUN	DS	1	;FLAG INDICATING INTERUPT-DRIVEN I/O IS COMPLETE
ACTSTR	DS	1	;NUMBER OF DEVICE WHICH IS ACTIVELY STREAMING (BIT6 SET=NONE)
RSCHAR	DS	1	;RS232 XMIT CHARACTER (UNTRANSLATED)
DUMMY			;END OF BUFFERS POINTER
RHLONG	=	DUMMY-ORIGIN	;TOTAL LENGTH OF HANDLER


;	END	ORIGIN
