;
;
;
;
;
;	PAGE ZERO RAM ASSIGNMENTS
;
	.ORG	$0000

LINZBS: .RES	2		;LINBUG RAM (WILL BE REPLACED BY MONITOR RAM
;
; THESE LOCATIONS ARE NOT CLEARED
CASINI: .RES	2		;CASSETTE INIT LOCATION
RAMLO:	.RES	2		;RAM POINTER FOR MEMORY TEST
TRAMSZ: .RES	1		;TEMPORARY REGISTER FOR RAM SIZE
 

;PAGE	5

TSTDAT: .RES	1		;RAM TEST DATA REGISTER
;
; CLEARED ON COLDSTART ONLY
WARMST: .RES	1		;WARM START FLAG
BOOT_query:	.RES	1	;SUCCESSFUL BOOT FLAG
DOSVEC: .RES	2		;DISK SOFTWARE START VECTOR
DOSINI: .RES	2		;DISK SOFTWARE INIT ADDRESS
APPMHI: .RES	2		;APPLICATIONS MEMORY HI LIMIT
;
; CLEARED ON COLD OR WARM START
INTZBS	=*			;INTERRUPT HANDLER
POKMSK: .RES	1		;SYSTEM MASK FOR POKEY IRQ ENABLE
BRKKEY: .RES	1		;BREAK KEY FLAG
RTCLOK: .RES	3		;REAL TIME CLOCK (IN 16 MSEC UNITS)
;
BUFADR: .RES	2		;INDIRECT BUFFER ADDRESS REGISTER
;
ICCOMT: .RES	1		;COMMAND FOR VECTOR
;
DSKFMS: .RES	2		;DISK FILE MANAGER POINTER
DSKUTL: .RES	2		;DISK UTILITIES POENTER
;
PTIMOT: .RES	1		;PRINTER TIME OUT REGISTER
PBPNT:	.RES	1		;PRINT BUFFER POINTER
PBUFSZ: .RES	1		;PRINT BUFFER SIZE
PTEMP:	.RES	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: .RES	1		;HANDLER INDEX NUMBER (FF = IOCB FREE)
ICDNOZ: .RES	1		;DEVICE NUMBER (DRIVE NUMBER)
ICCOMZ: .RES	1		;COMMAND CODE
ICSTAZ: .RES	1		;STATUS OF LAST IOCB ACTION
ICBALZ: .RES	1		;BUFFER ADDRESS LOW BYTE
ICBAHZ: .RES	1
ICPTLZ: .RES	1		;PUT BYTE ROUTINE ADDRESS - 1
ICPTHZ: .RES	1
ICBLLZ: .RES	1		;BUFFER LENGTH LOW BYTE
ICBLHZ: .RES	1
ICAX1Z: .RES	1		;AUXILIARY INFORMATION FIRST BYTE
ICAX2Z: .RES	1
ICSPRZ: .RES	4		;TWO SPARE BYTES (CIO LOCAL USE)
ICIDNO	=	ICSPRZ+2	;IOCB NUMBER X 16
CIOCHR	=	ICSPRZ+3	;CHARACTER BYTE FOR CURRENT OPERATION
;
STATUS: .RES	1		;INTERNAL STATUS STORAGE
CHKSUM: .RES	1		;CHECKSUM (SINGLE BYTE SUM WITH CARRY)
BUFRLO: .RES	1		;POINTER TO DATA BUFFER (LO BYTE)
BUFRHI: .RES	1		;POINTER TO DATA BUFFER (HI BYTE)
BFENLO: .RES	1		;NEXT BYTE PAST END OF THE DATA BUFFER (LO B
BFENHI: .RES	1		;NEXT BYTE PAST END OF THE DATA BUFFER (HI B
CRETRY: .RES	1		;NUMBER OF COMMAND FRAME RETRIES
 


;PAGE	6

DRETRY: .RES	1		;NUMBER OF DEVICE RETRIES
BUFRFL: .RES	1		;DATA BUFFER FULL FLAG
RECVDN: .RES	1		;RECEIVE DONE FLAG
XMTDON: .RES	1		;TRANSMISSION DONE FLAG
CHKSNT: .RES	1		;CHECKSUM SENT FLAG
NOCKSM: .RES	1		;NO CHECKSUM FOLLOWS DATA FLAG
;
;
BPTR:	.RES	1
FTYPE:	.RES	1
FEOF:	.RES	1
FREQ:	.RES	1
SOUNDR: .RES	1		;NOISY I/O FLAG. (ZERO IS QUIET)
CRITIC: .RES	1		;DEFINES CRITICAL SECTION (CRITICAL IF NON-Z
;
FMSZPG: .RES	7		;DISK FILE MANAGER SYSTEM ZERO PAGE
;
;
CKEY:	.RES	1		;FLAG SET WHEN GAME START PRESSED
CASSBT: .RES	1		;CASSETTE BOOT FLAG
DSTAT:	.RES	1		;DISPLAY STATUS
;
ATRACT: .RES	1		;ATRACT FLAG
DRKMSK: .RES	1		;DARK ATRACT MASK
COLRSH: .RES	1		;ATRACT COLOR SHIFTER (EOR'ED WITH PLAYFIELD
;
LEDGE	=	2		;LMARGN'S VALUE AT COLD START
REDGE	=	39		;RMARGN'S VALUE AT COLD START
TMPCHR: .RES	1
HOLD1:	.RES	1
LMARGN: .RES	1		;LEFT MARGIN (SET TO 1 AT POWER ON)
RMARGN: .RES	1		;RIGHT MARGIN (SET TO 38 AT POWER ON)
ROWCRS: .RES	1		;CURSOR COUNTERS
COLCRS: .RES	2
DINDEX: .RES	1
SAVMSC: .RES	2
OLDROW: .RES	1
OLDCOL: .RES	2
OLDCHR: .RES	1		;DATA UNDER CURSOR
OLDADR: .RES	2
NEWROW: .RES	1		;POINT DRAW DRAW GOES TO
NEWCOL: .RES	2
LOGCOL: .RES	1		;POINTS AT COLUMN IN LOGICAL LINE
ADRESS: .RES	2
MLTTMP: .RES	2
OPNTMP	=	MLTTMP		;FIRST BYTE IS USED IN OPEN AS TEMP
SAVADR: .RES	2
RAMTOP: .RES	1		;RAM SIZE DEFINED BY POWER ON LOGIC
BUFCNT: .RES	1		;BUFFER COUNT
BUFSTR: .RES	2		;EDITOR GETCH POINTER
BITMSK: .RES	1		;BIT MASK
SHFAMT: .RES	1
ROWAC:	.RES	2
COLAC:	.RES	2
 

;PAGE	7

ENDPT:	.RES	2
DELTAR: .RES	1
DELTAC: .RES	2
ROWINC: .RES	1
COLINC: .RES	1
SWPFLG: .RES	1		;NON-0 IF TXT AND REGULAR RAM IS SWAPPED
HOLDCH: .RES	1		;CH IS MOVED HERE IN KGETCH BEFORE CNTL & SH
INSDAT: .RES	1
COUNTR: .RES	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	$200
.ORG $200
INTABS	=*			;INTERRUPT RAM
VDSLST: .RES	2		;DISPLAY LIST NMI VECTOR
VPRCED: .RES	2		;PROCEED LINE IRQ VECTOR
VINTER: .RES	2		;INTERRUPT LINE IRQ VECTOR
VBREAK: .RES	2		;SOFTWARE BREAK (00) INSTRUCTION IRQ VECTOR
VKEYBD: .RES	2		;POKEY KEYBOARD IRQ VECTOR
VSERIN: .RES	2		;POKEY SERIAL INPUT READY IRQ
VSEROR: .RES	2		;POKEY SERIAL OUTPUT READY IRQ
VSEROC: .RES	2		;POKEY SERIAL OUTPUT COMPLETE IRQ
VTIMR1: .RES	2		;POKEY TIMER 1 IRQ
VTIMR2: .RES	2		;POKEY TIMER 2 IRQ
VTIMR4: .RES	2		;POKEY TIMER 4 IRQ
VIMIRQ: .RES	2		;IMMEDIATE IRQ VECTOR
CDTMV1: .RES	2		;COUNT DOWN TIMER 1
CDTMV2: .RES	2		;COUNT DOWN TIMER2
CDTMV3: .RES	2		;COUNT DOWN TIMER 3
CDTMV4: .RES	2		;COUNT DOWN TIMER 4
CDTMV5: .RES	2		;COUNT DOWN TIMER 5
VVBLKI: .RES	2		;IMMEDIATE VERTICAL BLANK NMI VECTOR
VVBLKD: .RES	2		;DEFERRED VERTICAL BLANK NMI VECTOR
CDTMA1: .RES	2		;COUNT DOWN TIMER 1 JSR ADDRESS
CDTMA2: .RES	2		;COUNT DOWN TIMER 2 JSR ADDRESS
CDTMF3: .RES	1		;COUNT DOWN TIMER 3 FLAG
SRTIMR: .RES	1		;SOFTWARE REPEAT TIMER
 
;PAGE	8

CDTMF4: .RES	1		;COUNT DOWN TIMER 4 FLAG
INTEMP: .RES	1		;IAN'S TEMP (RENAMED FROM T1 BY POPULAR DEMA
CDTMF5: .RES	1		;COUNT DOWN TIMER FLAG 5
SDMCTL: .RES	1		;SAVE DMACTL REGISTER
SDLSTL: .RES	1		;SAVE DISPLAY LIST LOW BYTE
SDLSTH: .RES	1		;SAVE DISPLAY LIST HI BYTE
SSKCTL: .RES	1		;SKCTL REGISTER RAM
	.RES	1		;
;
LPENH:	.RES	1		;LIGHT PEN HORIZONTAL VALUE
LPENV:	.RES	1		;LIGHT PEN VERTICAL VALUE
BRKKY:	.RES	2		;BREAK KEY VECTOR
;
	.RES	2		;SPARE
;
CDEVIC: .RES	1		;COMMAND FRAME BUFFER - DEVICE
CCOMND: .RES	1		;COMMAND
CAUX1:	.RES	1		;COMMAND AUX BYTE 1
CAUX2:	.RES	1		;COMMAND AUX BYTE 2
				; NOTE: MAY NOT BE THE LAST WORD ON A PAGE
TEMP:	.RES	1		;TEMPORARY RAM CELL
				; NOTE: MAY NOT BE THE LAST WORD ON A PAGE
ERRFLG: .RES	1		;ERROR FLAG - ANY DEVICE ERROR EXCEPT TIME O
;
DFLAGS: .RES	1		;DISK FLAGS FROM SECTOR ONE
DBSECT: .RES	1		;NUMBER OF DISK BOOT SECTORS
BOOTAD: .RES	2		;ADDRESS WHERE DISK BOOT LOADER WILL BE PUT
COLDST: .RES	1		;COLDSTART FLAG (1=IN MIDDLE OF COLDSTART)
;
	.RES	1		;SPARE
;
DSKTIM: .RES	1		;DISK TIME OUT REGISTER
;
LINBUF: .RES	40		;CHAR LINE BUFFER
;
GPRIOR: .RES	1		;GLOBAL PRIORITY CELL
;
PADDL0: .RES	1		;POTENTIOMETER 0 RAM CELL
PADDL1: .RES	1
PADDL2: .RES	1
PADDL3: .RES	1
PADDL4: .RES	1
PADDL5: .RES	1
PADDL6: .RES	1
PADDL7: .RES	1
STICK0: .RES	1		;JOYSTICK 0 RAM CELL
STICK1: .RES	1
STICK2: .RES	1
STICK3: .RES	1
PTRIG0: .RES	1		;PADDLE TRIGGER 0
PTRIG1: .RES	1
PTRIG2: .RES	1
PTRIG3: .RES	1
PTRIG4: .RES	1
 
;PAGE	9

PTRIG5: .RES	1
PTRIG6: .RES	1
PTRIG7: .RES	1
STRIG0: .RES	1		;JOYSTICK TRIGGER 0
STRIG1: .RES	1
STRIG2: .RES	1
STRIG3: .RES	1
;
CSTAT:	.RES	1
WMODE:	.RES	1
BLIM:	.RES	1
IMASK:	.RES	1
JVECK:	.RES	2
;
	.RES	2		;SPARE
;
;
;
;
TXTROW: .RES	1		;TEXT ROWCRS
TXTCOL: .RES	2		;TEXT COLCRS
TINDEX: .RES	1		;TEXT INDEX
TXTMSC: .RES	2		;FOOLS CONVRT INTO NEW MSC
TXTOLD: .RES	6		;OLDROW & OLDCOL FOR TEXT (AND THEN SOME)
TMPX1:	.RES	1
HOLD3:	.RES	1
SUBTMP: .RES	1
HOLD2:	.RES	1
DMASK:	.RES	1
TMPLBT: .RES	1
ESCFLG: .RES	1		;ESCAPE FLAG
TABMAP: .RES	15
LOGMAP: .RES	4		;LOGICAL LINE START BIT MAP
INVFLG: .RES	1		;INVERSE VIDEO FLAG (TOGGLED BY ATARI KEY)
FILFLG: .RES	1		;RIGHT FILL FLAG FOR DRAW
TMPROW: .RES	1
TMPCOL: .RES	2
SCRFLG: .RES	1		;SET IF SCROLL OCCURS
HOLD4:	.RES	1		;TEMP CELL USED IN DRAW ONLY
HOLD5:	.RES	1		;DITTO
SHFLOK: .RES	1
BOTSCR: .RES	1		;BOTTOM OF SCREEN : 24 NORM 4 SPLIT
;
;
PCOLR0: .RES	1		;P0 COLOR
PCOLR1: .RES	1		;P1 COLOR
PCOLR2: .RES	1		;P2 COLOR
PCOLR3: .RES	1		;P3 COLOR
COLOR0: .RES	1		;COLOR 0
COLOR1: .RES	1
COLOR2: .RES	1
COLOR3: .RES	1
COLOR4: .RES	1
;
 
;PAGE	10

;
	.RES	23		;SPARE
;
;
;
GLBABS	=*			;GLOBAL VARIABLES
;
	.RES	4		;SPARE
;
RAMSIZ: .RES	1		;RAM SIZE (HI BYTE ONLY)
MEMTOP: .RES	2		;TOP OF AVAILABLE USER MEMORY
MEMLO:	.RES	2		;BOTTOM OF AVAILABLE USER MEMORY
	.RES	1		;SPARE
DVSTAT: .RES	4		;STATUS BUFFER
CBAUDL: .RES	1		;CASSETTE BAUD RATE LOW BYTE
CBAUDH: .RES	1
;
CRSINH: .RES	1		;CURSOR INHIBIT (00 = CURSOR ON)
KEYDEL: .RES	1		;KEY DELAY
CH1:	.RES	1
;
CHACT:	.RES	1		;CHACTL REGISTER RAM
CHBAS:	.RES	1		;CHBAS REGISTER RAM
;
	.RES	5		;SPARE BYTES
;
CHAR:	.RES	1
ATACHR: .RES	1		;ATASCII CHARACTER
CH:	.RES	1		;GLOBAL VARIABLE FOR KEYBOARD
FILDAT: .RES	1		;RIGHT FILL DATA (DRAW)
DSPFLG: .RES	1		;DISPLAY FLAG : DISPLAY CNTLS IF NON-ZERO
SSFLAG: .RES	1		;START/STOP FLAG FOR PAGING (CNTL 1). CLEARE
;
;
;
;
;
;
;
;	PAGE THREE RAM ASSIGNMENTS
;
DCB	=*			;DEVICE CONTROL BLOCK
DDEVIC: .RES	1		;PERIPHERAL UNIT 1 BUS I.D. NUMBER
DUNIT:	.RES	1		;UNIT NUMBER
DCOMND: .RES	1		;BUS COMMAND
DSTATS: .RES	1		;COMMAND TYPE/STATUS RETURN
DBUFLO: .RES	1		;DATA BUFFER POINTER LOW BYTE
DBUFHI: .RES	1
DTIMLO: .RES	1		;DEVICE TIME OUT IN 1 SECOND UNITS
DUNUSE: .RES	1		;UNUSED BYTE
DBYTLO: .RES	1		;NUMBER OF BYTES TO BE TRANSFERRED LOW BYTE
DBYTHI: .RES	1
DAUX1:	.RES	1		;COMMAND AUXILIARY BYTE 1
DAUX2:	.RES	1
 
;PAGE	11

;
TIMER1: .RES	2		;INITIAL TIMER VALUE
ADDCOR: .RES	1		;ADDITION CORRECTION
CASFLG: .RES	1		;CASSETTE MODE WHEN SET
TIMER2: .RES	2		;FINAL TIMER VALUE. THESE TWO TIMER VALUES
				;ARE USED TO COMPUTE INTERVAL FOR BAUD RATE
TEMP1:	.RES	2		;TEMPORARY STORAGE REGISTER
TEMP2:	.RES	1		;TEMPORARY STORAGE REGISTER
TEMP3:	.RES	1		;TEMPORARY STORAGE REGISTER
SAVIO:	.RES	1		;SAVE SERIAL IN DATA PORT
TIMFLG: .RES	1		;TIME OUT FLAG FOR BAUD RATE CORRECTION
STACKP: .RES	1		;SIO STACK POINTER SAVE CELL
TSTAT:	.RES	1		;TEMPORARY STATUS HOLDER
;
;
;
HATABS: .RES	38		;HANDLER ADDRESS TABLE
MAXDEV	=	*-HATABS-5	;MAXIMUM HANDLER ADDRESS INDEX
;
;	NOTE : THE ENTIRE IOCB DEFINITIONS HAVE BEEN MODIFIED
;
IOCB:	.ORG	*		;I/O CONTROL BLOCKS
ICHID:	.RES	1		;HANDLER INDEX NUMBER (FF = IOCB FREE)
ICDNQ:	.RES	1		;DEVICE NUMBER (DRIVE NUMBER)
ICCOM:	.RES	1		;COMMAND CODE
ICSTA:	.RES	1		;STATUS OF LAST IOCB ACTION
ICBAL:	.RES	1		;BUFFER ADDRESS LOW BYTE
ICBAH:	.RES	1
ICPTL:	.RES	1		;PUT BYTE ROUTINE ADDRESS - 1
ICPTH:	.RES	1
ICBLL:	.RES	1		;BUFFER LENGTH LOW BYTE
ICBLH:	.RES	1
ICAX1:	.RES	1		;AUXILIARY INFORMATION FIRST BYTE
ICAX2:	.RES	1
ICSPR:	.RES	4		;FOUR SPARE BYTES
	.RES	MAXIOC-IOCBSZ
;
PRNBUF: .RES	40		;PRINTER BUFFER
;
	.RES	21		;SPARE BYTES
;
;
;
;
;
;
;
;	PAGE FOUR RAM ASSIGNMENTS
;
CASBUF: .RES	131		;CASSETTE BUFFER
;
; USER AREA STARTS HERE AND GOES TO END OF PAGE FIVE
USAREA:	.RES	128		;SPARE
;
;PAGE	12
;
;	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)
FSTOR	=	$DDA7		;FLOATING	STORE	REG0	(X,Y) <- FR0
FSTOP	=	$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
 
;PAGE	13

; FLOATING POINT ROUTINES ZERO PAGE (NEEDED ONLY IF F.P. ROUTINES ARE CA
;	.ORG	$D4
.ORG $D4
FR0:	.RES	FPREC		;FP REG0
FRE:	.RES	FPREC
FR1:	.RES	FPREC		;FP REG1
FR2:	.RES	FPREC
FRX:	.RES	1		;FP SPARE
EEXP:	.RES	1		;VALUE OF E
NSIGN:	.RES	1		;SIGN OF #
ESIGN:	.RES	1		;SIGN OF EXPONENT
FCHRFLG:.RES	1		;1ST CHAR FLAG
DIGRT:	.RES	1		;# OF DIGITS RIGHT OF DECIMAL
CIX:	.RES	1		;CURRENT INPUT INDEX
INBUFF: .RES	2		;POINTS TO USER'S LINE INPUT BUFFER
ZTEMP1: .RES	2
ZTEMP4: .RES	2
ZTEMP3: .RES	2
DEGFLG:
RADFLG: .RES	1		;0=RADIANS, 6=DEGREES
RADON	=	0		;INDICATES RADIANS
DEGON	=	6		;INDICATES DEGREES
FLPTR:	.RES	2		;POINTS TO USER'S FLOATING PT NUMBER
FPTR2:	.RES	2
; FLOATING PT ROUTINES' NON-ZERO PAGE RAM
; (NEEDED ONLY IF F.P. ROUTINES CALLED)
	.ORG	$57E
LBPR1:	.RES	1		;LBUFF PREFIX 1
LBPR2:	.RES	1		;LBUFF PREFIX 2
LBUFF:	.RES	128		;LINE BUFFER
PLYARG	=	LBUFF+$60	;POLYNOMIAL ARGUMENTS
FPSCR	=	PLYARG+FPREC
FPSCR1	=	FPSCR+FPREC
FSCR	=	FPSCR
FSCR1	=	FPSCR1
LBFEND	=	*-1		;END OF LBUFF