PAG ***************************** * * * Applesoft - Part D * * * * Copywrite Apple Computer, * * Inc. and Microsoft, Inc.; * * not for publication or * * distribution. * * * ***************************** * * * Graphics, etc. * * * * $F1D5 - $F7FF * * * ***************************** CALL JSR FRMNUM ;Note that CALL does not set up JSR GETADR ; registers as in INTEGER BASIC JMP (LINNUM) ;On a CALL: ; Y has low byte CALL adrs ; A has high byte CALL adrs ; X has $9D INNU JSR GETBYT ;IN# TXA JMP INPORT PRNU JSR GETBYT ;PR# TXA JMP OUTPORT * Lores subroutines: * Subroutine to get *,* coordinates: DO APPLEC SIZE = 80 ;Screen size for lores ELSE SIZE = 48 FIN PLOTFNS JSR GETBYT ;Get first coordinate CPX #SIZE ;Make sure it is < SIZE BCS GOERR STX FIRST LDA #',' JSR SYNCHR ;Syntax check JSR GETBYT ;Get 2nd coor CPX #SIZE ;Must be SPEEDZ EOR #$FF TAX INX STX SPEEDZ RTS TRACE SEC HEX 90 ;Fake BCC to skip NOTRACE CLC ROR TRCFLG RTS NORMAL LDA #$FF BNE NRM INVERSE LDA #$3F NRM LDX #0 SI STA INVFLG STX ORMASK RTS FLASH LDA #$7F LDX #$40 BNE SI HIMEM JSR FRMNUM ;Get specified HIMEM JSR GETADR CMPR LINNUM;STREND BGE SETHI ;Above variable table? JMM JMP MEMERR ;Error if not SETHI LDA LINNUM STA MEMSIZ STA FRETOP LDA LINNUM+1 STA MEMSIZ+1 STA FRETOP+1 RTS LOMEM JSR FRMNUM JSR GETADR CMPR LINNUM;MEMSIZ BGE JMM CMPR LINNUM;VARTAB BLT JMM MOVD LINNUM;VARTAB JMP CLEARC ;LOMEM clears variables ONERR LDA #goto JSR SYNCHR MOVD TXTPTR;TXTPSV SEC ROR ERRFLG MOVD CURLIN;CURLSV JSR REMN ;Ignore rest of line JMP ADDON * Routine to handle errors if ONERR GOTO active: HANDLERR STX ERRNUM LDX REMSTK ;Get stack ptr saved at NEWSTT STX ERRSTK ;Remember it ;(Should also have done TXS ; here; see ONERR correction ; in Applesoft manual.) MOVD CURLIN;ERRLIN MOVD OLDTEXT;ERRPOS MOVD TXTPSV;TXTPTR MOVD CURLSV;CURLIN JSR CHRGOT JSR GOTO ;Goto specified ONERR line JMP NEWSTT RESUME MOVD ERRLIN;CURLIN MOVD ERRPOS;TXTPTR LDX ERRSTK ;Retrieve stack ptr as it was TXS ; when error was encountered JMP NEWSTT JSYN JMP SYNERR DEL BCS JSYN ;Error if # not specified TRX PRGEND;VARTAB JSR LINGET ;Get beginning of range JSR FNDLIN ;Find this line or next MOVD LOWTR;DEST LDA #',' JSR SYNCHR ;Check syntax JSR LINGET ;Get end range ;(Does nothing if end range ; not specified.) INCR LINNUM ;Point 1 past it JSR FNDLIN ;Find next line to it CMPR LOWTR;DEST BGE MOVDWN ;Do move unless it is RTS ; an invalid range MOVDWN LDY #0 ;Move LOWTR through VARTAB MOVIT LDA (LOWTR),Y ; to DEST STA (DEST),Y INCR LOWTR INCR DEST CMPR VARTAB;LOWTR BGE MOVIT LDX DEST+1 ;Set Y,X to DEST-1 LDY DEST BNE :OV DEX :OV DEY STX VARTAB+1 ;Point VARTAB to last STY VARTAB ; byte moved JMP LINKSET ;Reset links after a delete GR LDA LORES LDA MIXSET DO APPLEC JMP GRPATCH ELSE JMP SETGR FIN TEXT LDA LOWSCR ;JMP $FB36 would have JMP SETTXT ; done both these. DO APPLEC PLOT80 LSR PHP JSR GBASCALC PLP LDA #$F BCC :OV ADC #$E0 ;= LDA #$F0 :OV STA MASK DOPLOT PHY JSR SELSCR ;Select page BCC :JP ;Branch if page 1 PHX LDA HMASK ;Rotate bit 0 to 7 TAX LSR TXA ROR SEC STA HMASK :JP JSR PLOT1 BCC :Y ;Skip if on page 1 LDA LOWSCR ;Switch to page 1 STX HMASK ;Replace HMASK PLX CLC :Y PLY RTS IS80 LDA RDDOUBHG ;Double hires on? EOR #$80 ;Set hi bit if so AND RD80ST ; and 80STORE active AND RD80COL ; and 80-col mode ASL ;Set carry if all 3 true RTS ELSE ;//e roms: * Tape array store and recall routines: * (No corresponding routines for disk in Applesoft.) STORE JSR GETARYPT LDY #3 LDA (LOWTR),Y TAX DEY LDA (LOWTR),Y SBC #1 BCS :OV DEX :OV STA LINNUM STX LINNUM+1 JSR WRITE JSR TAPEPNT JMP WRITE RECALL JSR GETARYPT JSR MONREAD LDY #2 LDA (LOWTR),Y CMP LINNUM INY LDA (LOWTR),Y SBC LINNUM+1 BCS :OV JMP MEMERR :OV JSR TAPEPNT JMP MONREAD FIN * Hires initialization routines: HGR2 BIT HISCR BIT MIXCLR ;Default to full screen LDA #$40 BNE SETHPG HGR LDA #$20 BIT LOWSCR BIT MIXSET ;Default to mixed screen SETHPG STA HPAG LDA HIRES LDA TXTCLR HCLR LDA #0 ;Set for black bkgrnd STA HCOLOR1 BKGND LDA HPAG ;Init hires screen mem STA SHAPEH LDY #0 STY SHAPEL BKGND1 LDA HCOLOR1 STA (SHAPEL),Y ;Clear hires to HCOLOR1 JSR CSHFT2 ;Correct for color shift INY ;(Slows clear by factor of 2) BNE BKGND1 INC SHAPEH LDA SHAPEH AND #$1F ;Done? BNE BKGND1 RTS * Hires position and plot subroutines HPOSN STA Y0 ;Enter with Y in A-reg STX X0L ; XL in X-reg, STY X0H ; and XH in Y-reg. PHA AND #$C0 STA GBASL ;For y-coor = 00ABCDEF LSR ;calculates base addr LSR ;in GBASL,GBASH for ORA GBASL ;accessing screen memory STA GBASL ;via (GBASL),Y. PLA STA GBASH ASL ;Calculates ASL ; GBASH = PPPFGHCD, ASL ; GBASL = EABAB000 ROL GBASH ;where PPP=001 for $2000-$3FFF ASL ;and PPP=010 for $4000-$5FFF, ROL GBASH ;given y-coor = ABCDEFGH ASL ROR GBASL LDA GBASH AND #$1F ORA HPAG STA GBASH TXA ;Divide X0 by 7 for CPY #0 ;index from base adrs (quotient) BEQ HPOSN2 ;and bit within screen mem byte LDY #$23 ;(mask specified by remainder). ADC #4 HPOSN1 INY HPOSN2 SBC #7 BCS HPOSN1 STY HNDX ;Works for X0 from 0 to 279, TAX ;low byte in X-reg, high in LDA MSKTBL-$F9,X STA HMASK ;Y-reg on entry. TYA LSR LDA HCOLORZ ;If on odd byte (carry set) STA HCOLOR1 ;then rotate bits BCS CSHFT2 RTS HPLOT0 JSR HPOSN LDA HCOLOR1 ;Calculate bit posn in GBAS, EOR (GBASL),Y ; HNDX, and HMASK from AND HMASK ; Y-coor in A-reg, EOR (GBASL),Y ; X-coor in X,Y regs. STA (GBASL),Y ;For any 1-bits, substitute RTS ;corresp bit of HCOLOR1. * Hires L,R,U,D subroutines LFTRT BPL RIGHT ;Use sign for left/right subr. LEFT LDA HMASK LSR ;Shift low-order 7 bits BCS LEFT1 ; of HMASK one bit posn. EOR #$C0 LR1 STA HMASK RTS LEFT1 DEY ;Decr horiz index BPL LEFT2 LDY #$27 ;Wrap around screen LEFT2 LDA #$C0 ;New HMASK, rightmost NEWNDX STA HMASK ; dot of byte. STY HNDX ;Update horiz index. CSHIFT LDA HCOLOR1 CSHFT2 ASL ;Rotate low-order 7 bits CMP #$C0 ; of HCOLOR1 one bit posn. BPL :RET ;Branch if black or white LDA HCOLOR1 EOR #$7F STA HCOLOR1 :RET RTS RIGHT LDA HMASK ASL ;Shift low order 7 bits EOR #$80 ; of HMASK one bit posn. BMI LR1 LDA #$81 INY ;Next byte CPY #40 BCC NEWNDX LDY #0 ;Wrap around BCS NEWNDX ;Always taken LRUDX1 CLC ;No 90 deg rot LRUDX2 LDA DXH AND #4 ;If bit2=0 then no plot BEQ LRUD4 LDA #$7F AND HMASK AND (GBASL),Y ;Screen bit set? BNE LRUD3 INC COLCOUNT LDA #$7F AND HMASK BPL LRUD3 ;Always LRUD1 CLC ;No 90 deg rot LRUD2 LDA DXH AND #4 ;If bit2=0 then no plot BEQ LRUD4 LDA (GBASL),Y EOR HCOLOR1 ;Set hires screen bit AND HMASK ; to corresponding HCOLOR. BNE LRUD3 ;If screen bit changes, INC COLCOUNT ;then incr collsn count. LRUD3 EOR (GBASL),Y STA (GBASL),Y LRUD4 LDA DXH ;Add quadrant to specified ADC QDRNT ; vector and move lft, rt, AND #3 ; up, or down based on EQ3 = *-1 ; sign and carry. CMP #2 ROR BCS LFTRT UPDOWN BMI DOWN ;Sign for up/down select. UP CLC LDA GBASH ;Calc base adrs for next BIT EQ1C ; line up in (GBAS) BNE :U4 ; with 192-line wrap around. ASL GBASL BCS :U2 BIT EQ3 BEQ :U1 ADC #$1F ;**** BIT MAP **** SEC BCS :U3 ;for row = ABCDEFGH :U1 ADC #$23 PHA LDA GBASL ;GBASL = EABAB000 ADC #$B0 ;GBASH = PPPFGHCD BCS :U5 ADC #$F0 ;where PPP=001 for pg1 :U5 STA GBASL PLA BCS :U3 :U2 ADC #$1F :U3 ROR GBASL :U4 ADC #$FC UPDWN1 STA GBASH RTS CLC DOWN LDA GBASH ADC #4 ;Calc base adr for next EQ4 = *-1 ; line down, with 192 BIT EQ1C ; line wrap around. BNE UPDWN1 ASL GBASL BCC :D1 ADC #$E0 CLC BIT EQ4 BEQ :D2 LDA GBASL ADC #$50 EOR #$F0 BEQ :D3 EOR #$F0 :D3 STA GBASL LDA HPAG BCC :D2 :D1 ADC #$E0 :D2 ROR GBASL BCC UPDWN1 * Hires line draw subroutines HLINRL PHA LDA #0 ;Set X0L,H and Y0 STA X0L ; to 0 for rel line draw STA X0H ; (DX,DY). STA Y0 PLA HGLIN PHA ;On entry: SEC ; XL: A-reg SBC X0L ; XH: X-reg PHA ; Y: Y-reg TXA SBC X0H STA QDRNT ;Calc ABS(X-X0) BCS :HL2 ; in (DXL,H) PLA EOR #$FF ;X dir to sign bit ADC #1 ; of qdrnt. PHA ; 0=right (DX pos) LDA #0 ; 1=left (DX neg) SBC QDRNT :HL2 STA DXH STA EH ;Init EL,H to ABS(X-X0) PLA ; = DELTX STA DXL STA EL PLA STA X0L ;Set ptr to end of line STX X0H TYA CLC SBC Y0 ;Calc -DELTY-1 in DY where BCC :HL3 ; DELTY = ABS(Y-Y0) EOR #$FF ADC #$FE :HL3 STA DY ;Rotate Y dir into STY Y0 ; qdrnt sign bit ROR QDRNT ; (0=up, 1=down) SEC SBC DXL ;Init COUNTL,H (COUNTL=X-reg) TAX ; to -(DELTX+DELTY+1) LDA #$FF SBC DXH STA COUNTH LDY HNDX ;Horiz index. BCS MOVEX2 ;Always taken. MOVEX ASL ;Move in X-dir. Use JSR LFTRT ; QDRNT bit6 for lft/rt set. SEC MOVEX2 LDA EL ;Assume carry set ADC DY ;(EL,H)-DELTY to (EL,H) STA EL ;Note: DY is (-DELTY)-1 LDA EH ;Carry clr if (EL,H) goes neg. SBC #0 ;= ADC #$FF HCOUNT STA EH LDA (GBASL),Y EOR HCOLOR1 ;Plot dot of HCOLOR1. AND HMASK EOR (GBASL),Y STA (GBASL),Y INX ;Done (DELTX+DELTY) dots? BNE :OV INC COUNTH BEQ RTS2 ;Yes, return. :OV LDA QDRNT ;For direction test. BCS MOVEX ;If carry set, (EL,H) plot JSR UPDOWN ; if clr, neg, move CLC LDA EL ;(EL,H)+DELTX to (EL,H). ADC DXL STA EL LDA EH ADC DXH BVC HCOUNT ;Always taken MSKTBL DFB %10000001 DFB %10000010 DFB %10000100 DFB %10001000 DFB %10010000 DFB %10100000 DFB %11000000 EQ1C HEX 1C * Table of COS(90*X/16 degrees)*$100 - 1 with * one byte precision, X=0 to 16: COSTBL HEX FFFEFAF4ECE1D4C5 HEX B4A18D7861493118 HEX FF * Hires coordinate restore subroutine: * (not called by any Applesoft routine) HFIND LDA GBASL ;Converts base adrs ASL LDA GBASH ; to y-coor. AND #3 ROL ;For GBASL=EABAB000 ORA GBASL ; GBASH=PPPFGHCD ASL ASL ;generate ASL ; Y-coor=ABCDEFGH STA Y0 LDA GBASH ;(PPP=screen page) LSR LSR AND #7 ORA Y0 STA Y0 ;Converts HNDX (index from LDA HNDX ; base adrs) and HMASK ASL ; (bit mask) to x-coor ADC HNDX ; in (X0L,H), range ASL ; 0-$133 TAX DEX LDA HMASK AND #$7F :HF1 INX LSR BNE :HF1 STA X0H TXA CLC ;Calc HNDX*7+LOG(HMASK), base 2 ADC HNDX BCC :HF2 INC X0H :HF2 STA X0L RTS2 RTS * Hires shape drawing subroutines DRAW0 STX SHAPEL ;Shape pointer STY SHAPEH DODRAW TAX ;A holds ROT (0-$3F) LUP 4 LSR --^ STA QDRNT ;QDRNT 0=UP, 1=RT TXA ; 2=DWN, 3=LFT AND #$F TAX LDY COSTBL,X ;Save COS and SIN STY DXL ; values in DXL and DY. EOR #$F TAX LDY COSTBL+1,X INY STY DY LDY HNDX ;Index from base adrs. LDX #0 STX COLCOUNT ;Clear collision count. LDA (SHAPEL,X) ;First byte of shape defn :D2 STA DXH LDX #$80 STX EL ;EL,H for fractional STX EH ; L,R,U,D vectors. LDX SCALEZ ;Scale factor. :D3 LDA EL SEC ;If frac. cos overflow ADC DXL ; then move in specified STA EL ; vector direction. BCC :D4 JSR LRUD1 CLC :D4 LDA EH ;If frac. sin overflow ADC DY ; then move in specified STA EH ; direction+90 deg. BCC :D5 JSR LRUD2 :D5 DEX ;Loop on scale factor. BNE :D3 LDA DXH LSR ;Next 3 bit vector LSR ; of shape defn. LSR BNE :D2 ;Not done this byte. INCR SHAPEL LDA (SHAPEL,X) ;Next byte of shape defn. BNE :D2 ;Done if 0. RTS * Hires shape xdraw subroutine: XDRAW0 STX SHAPEL ;See DRAW comments STY SHAPEH DOXDRAW TAX LUP 4 LSR --^ STA QDRNT TXA AND #$F TAX LDY COSTBL,X STY DXL EOR #$F TAX LDY COSTBL+1,X INY STY DY LDY HNDX LDX #0 STX COLCOUNT LDA (SHAPEL,X) :XD2 STA DXH LDX #$80 STX EL STX EH LDX SCALEZ :XD3 LDA EL SEC ADC DXL STA EL BCC :XD4 JSR LRUDX1 CLC :XD4 AD EH;DY;EH BCC :XD5 JSR LRUDX2 :XD5 DEX BNE :XD3 LDA DXH LSR LSR LSR BNE :XD2 INCR SHAPEL LDA (SHAPEL,X) BNE :XD2 RTS * Parsing routines used by BASIC for Hires access: HFNS JSR FRMNUM JSR GETADR LDY LINNUM+1 ;Get horiz coor in X,Y LDX LINNUM CPY #>280 ;Make sure it is < 280 BLT HFNS1 BNE GGERR CPX #<280 BGE GGERR HFNS1 TXA ;Save horiz coor on stack PHA TYA PHA LDA #',' JSR SYNCHR ;Check syntax JSR GETBYT ;Get vert coor CPX #$C0 ;Check it is < $C0 = 192 BGE GGERR STX DSCTMP ;Save it PLA ;Retrieve horiz coor TAY PLA TAX LDA DSCTMP ; and vert coor RTS ;Return to caller GGERR JMP GOERR ;Illegal quantity HCOLOR JSR GETBYT CPX #8 BGE GGERR LDA COLORTBL,X STA HCOLORZ RTS3 RTS COLORTBL DFB %00000000 ;Black1 DFB %00101010 ;Green DFB %01010101 ;Violet DFB %01111111 ;White1 DFB %10000000 ;Black2 DFB %10101010 ;Orange DFB %11010101 ;Cyan DFB %11111111 ;White2 HPLOT CMP #to ;Continued plot requested? BEQ :P3 ;Branch if so JSR HFNS ;Get coor of start point JSR HPLOT0 ;Plot it, setting up coor :P2 JSR CHRGOT CMP #to ;Line specified? BNE RTS3 ;Exit if not :P3 JSR SYNCHR JSR HFNS ;Get coor of line end STY DSCTMP ;Set up for line TAY TXA LDX DSCTMP JSR HGLIN ;Plot line JMP :P2 ;Loop till no more "TO" ROT JSR GETBYT STX ROTZ RTS SCALE JSR GETBYT STX SCALEZ RTS DRWPNT JSR GETBYT ;Shape number specified MOVD SHAPEPNT;SHAPEL TXA LDX #0 CMP (SHAPEL,X) ;Shape defined in table? BEQ DP1 BGGERR BGE GGERR ;Error if not DP1 ASL ;Find address of shape BCC :DP2 ; from table. INC SHAPEH CLC :DP2 TAY LDA (SHAPEL),Y ADC SHAPEL TAX INY LDA (SHAPEL),Y ADC SHAPEPNT+1 STA SHAPEH ;Save adrs of shape STX SHAPEL JSR CHRGOT ;Check syntax CMP #at BNE :DP3 JSR SYNCHR JSR HFNS ;Draw it where? JSR HPOSN :DP3 LDA ROTZ RTS DRAW JSR DRWPNT ;Entries from BASIC JMP DODRAW XDRAW JSR DRWPNT JMP DOXDRAW DO NEWROMS DO APPLEC CHKSIZ JSR IS80 ;Double gr mode? BCS :OV ;Branch if so CPY #40 BCS BGGERR :OV CPY #80 BCS BGGERR RTS VLIN80 PHA LDA V2 ;Check vert range CMP #48 PLA BCS BGGERR NEWVLIN1 PHA JSR PLOT80 PLA CMP V2 INC BLT NEWVLIN1 VRET RTS HLINE80 TXA LDY FIRST JSR PLOT80 :L CPY H2 BGE VRET INY JSR DOPLOT BRA :L SCRN80 PHA JSR SELSCR PLA PHP ;Remember page used JSR SCRN PLP BCC :X ;Exit if on page 1 STA LOWSCR ;Switch to page 1 CMP #8 ASL ;Should be ROL (BUG) AND #$F ;This routine gives :X RTS ; incorrect results SELSCR JSR IS80 ;Double gr enabled? BCC :X ;Exit with C clear if not TYA EOR #1 LSR ;Which page to use? TAY BCC :X LDA HISCR ;Switch page if needed :X RTS ;Result is in carry SUBCH TXA BIT RD80COL BMI SUBOURCH HEX 2C ;Skip SETCH STA CH SEC TXA SBC CH CHRET RTS GETARYPT LDA #$40 STA SUBFLG JSR PTRGET STZ SUBFLG RTS SUBOURCH SBC OURCH RTS HTAB JSR GETBYT ;Get tab in X DEX :HT LDA #40 CMP WNDWDTH BCS :OV LDA WNDWDTH ;Use wdth if it is > 40 :OV JSR SETCH STX CH BCC CHRET TAX JSR CRDO BRA :HT ELSE ;New //e roms: SHLOAD SEC BCC * ;Fake for branch DS -1 TAPEPNT CLC STA INTROM JSR $C500 STA SLOTROM BCS JMEMERR RTS JMEMERR JMP MEMERR GETUPC0 LDA IN+1,X BPL CNVUPC ;Always GETUPC LDA ENDCHR BEQ NOCNV ;Don't convert if REM CMP #'"' BEQ NOCNV ; or literal LDA DATAFLG CMP #data-':' BEQ NOCNV ; or DATA INUPC LDA IN,X CNVUPC PHP CMP #'a' BLT :PP AND #%01011111 ;Convert to upper case :PP PLP RTS NOCNV LDA IN,X RTS SPCLIN PHA LDA #' ' JSR OUTDO ;Precede line # with space PLA ; to ease editing JMP LINPRT GETCH LDA CH CMP #40-7 BIT RD80COL ;80 col mode? BPL :X ;Exit if not LDA OURCH CMP #80-7 :X RTS SUBCH TXA BIT RD80COL BMI SUBOURCH HEX 2C ;Skip SETCH STA CH SEC TXA SBC CH CHRET RTS SUBOURCH SBC OURCH RTS ERR \$F7D9 DS $F7D9-* GETARYPT LDA #$40 ;Called by STORE & RECALL STA SUBFLG JSR PTRGET LDA #0 STA SUBFLG JMP VARTIO HTAB JSR GETBYT ;Get tab in X DEX :HT LDA #40 CMP WNDWDTH BCS :OV LDA WNDWDTH :OV JSR SETCH STX CH BCC CHRET TAX JSR CRDO BNE :HT FIN ELSE ;Old roms: * Load shape table from tape: SHLOAD LDA #0 STA A1H STA A2H LDY #LINNUM STY A1L INY STY A2L JSR MONREAD ;Read length to LINNUM CLC LDA MEMSIZ TAX DEX STX A2L ;MEMSIZ-1 -> end ptr SBC LINNUM ;MEMSIZ-2-len -> start PHA LDA MEMSIZ+1 TAY INX BNE :SL1 DEY :SL1 STY A2H SBC LINNUM+1 CMP STREND+1 BCC :SL2 BNE :SL3 ;Require page > STREND :SL2 JMP MEMERR :SL3 STA MEMSIZ+1 ;Set HIMEM and shape ptr STA FRETOP+1 ; to shape table STA A1H STA SHAPEPNT+1 PLA STA SHAPEPNT STA MEMSIZ STA FRETOP STA A1L JSR RD2BIT ;Find edge LDA #3 JMP MONREAD2 ;Read shape tbl to (A1L) TAPEPNT ADD LOWTR;LINNUM;A2L LDY #4 LDA (LOWTR),Y JSR GETARY2 MOVD HIGHDS;A1L RTS * Non graphics stuff: GETARYPT LDA #$40 ;Called by STORE & RECALL STA SUBFLG JSR PTRGET LDA #0 STA SUBFLG JMP VARTIO * Note that if WNDLEFT is not 0, HTAB can print * outside the screen (eg., in the program). HTAB JSR GETBYT ;Get tab in X DEX TXA HTAB1 CMP #40 BLT HTAB2 SBC #40 PHA JSR CRDO PLA JMP HTAB1 HTAB2 STA CH RTS HEX CBD278 ;Left over FIN ERR *-$F800 PAG *------------------------------------------------ * Applesoft zero page usage map: *------------------------------------------------ * KEY: X = General usage * . = Not used * C = Set by cold start but not used * H = Used by high resolution graphics only * G = Used by low resolution graphics only * T = Used by tape routines only * D = Important DOS use * $ = Used by STR$ routine only * U = Set up for USR, not otherwise used * 8 = Used by some 80 column cards *------------------------------------------------ * * 0 1 2 3 4 5 6 7 8 9 A B C D E F * ------------------------------- * 0X: C C C C C C . . . . U U U X X X * 1X: X X X X X X X . . . H H H H 8 8 * 2X: X X X X X X H H X X X X G G X T * 3X: G . X X . X X X X X . . T T T T * 4X: D D D D D D D D D D . . . . X X * 5X: X X X X X X X X X X X X X X X X * 6X: X X X X X X X X X X X X X X X X * 7X: X X X X X X X X X X X X X X X X * 8X: X X X X X X X X X X X X X X . X * 9X: X X X X X X X X X X X X X X X X * AX: X X X X X X X X X X X X X X X X * BX: X X X X X X X X X X X X X X X X * CX: X X X X X X X X X X X X X X . . * DX: H H H H H H X . X . X X X X X X * EX: H H H H H H H H H H H . . . . . * FX: X X X X X X X X X H . . . . . $ * ------------------------------- * 0 1 2 3 4 5 6 7 8 9 A B C D E F