Working on programmer's aid #1 sources

This commit is contained in:
Zellyn Hunter 2014-08-05 22:19:14 -07:00
parent d42a92879b
commit 0624e4538b
13 changed files with 1517 additions and 0 deletions

624
source/progaid/hires.asm Normal file
View File

@ -0,0 +1,624 @@
**************************
* *
* APPLE-II HI-RESOLUTION *
* GRAPHICS SUBROUTINES *
* *
* BY WOZ 9/13/77 *
* *
* ALL RIGHTS RESERVED *
* *
**************************
* HI-RES EQUATES
SHAPEL EQU $1A POINTER TO
SHAPEH EQU $1B SHAPE LIST
HCOLOR1 EQU $1C RUNNING COLOR MASK
COUNTH EQU $1D
HBASL EQU $26 BASE ADR FOR CURRENT
HBASH EQU $27 HI-RES PLOT LINE. A
HMASK EQU $30
A1L EQU $3C MONITOR A1.
A1H EQU $3D
A2L EQU $3E MONITOR A2.
A2H EQU $3F
LOMEML EQU $4A BASIC 'START OF VARS'.
MOMEMH EQU $4B
DXL EQU $50 DELTA-X FOR HLIN, SHAPE.
DXH EQU $51
SHAPEX EQU $51 SHAPE TEMP.
DY EQU $52 DELTA-Y FOR HLIN, SHAPE.
QDRNT EQU $53 ROT QUADRANT (SHAPE).
EL EQU $54 ERROR FOR HLIN.
EH EQU $55
PPL EQU $CA BASIC START OF PROG PTR.
PPH EQU $CB
PVL EQU $CC BASIC END OF VARS PTR.
PVH EQU $CD
ACL EQU $CE BASIC ACC.
ACH EQU $CF
X0L EQU $320 PRIOR X-COORD SAVE
X0H EQU $321 AFTER HLIN OR HPLOT.
Y0 EQU $322 HLIN, HPLOT Y-COORD SAVE.
BXSAV EQU $323 X-REG SAVE FOR BASIC.
HCOLOR EQU $324 COLOR FOR HPLOT, HPOSN
HNDX EQU $325 HORIZ OFFSET SAVE.
HPAG EQU $326 HI-RES PAGE ($20 NORMAL)
SCALE EQU $327 SCALE FOR SHAPE, MOVE.
SHAPXL EQU $328 START OF
SHAPXH EQU $329 SHAPE TABLE.
COLLSN EQU $32A COLLISION COUNT.
HIRES EQU $C057 SWITCH TO HI-RES VIDEO
MIXSET EQU $C053 SELECT TEXT/GRAPHICS MIX
TXTCLR EQU $C050 SELECT GRAPHICS MODE.
MEMFUL EQU $E36B BASIC MEM FULL ERROR.
RNGERR EQU $EE68 BASIC RANGE ERROR.
ACADR EQU $F11E 2-BYTE TAPE READ SETUP.
RD2BIT EQU $FCFA TWO-EDGE TAPE SENSE.
READ EQU $FEFD TAPE READ (A1.A2).
READX1 EQU $FF02 READ WITHOUT HEADER.
* HIGH RESOLUTION GRAPHICS INITS
*
* ROM VERSION $D000 TO $D3FF
*
ORG $D000
OBJ $A000
SETHRL LDA #$20 INIT FOR $2000-3FFF
STA HPAG HI-RES SCREEN MEMORY.
LDA HIRES SET HIRES DISPLAY MODE
LDA MIXSET WITH TEXT AT BOTTOM.
LDA TXTCLR SET GRAPHICS DISPLAY MODE
HCLR LDA #$0
BKGND0 STA HCOLOR1 SET FOR BLACK BKGND.
BKGND LDA HPAG
STA SHAPEH INIT HI-RES SCREEN MEM
LDY #$0 FOR CURRENT PAGE, NORMALLY
STY SHAPEL $2000-3FFF OR $4000-5FFF
BKGND1 LDA HCOLOR1
STA (SHAPEL),Y
JSR CSHFT2 (SHAPEL,H) WILL SPECIFY
INY 32 SEPARATE PAGES.
BNE BKGND1 THROUGHOUT THE INIT.
INC SHAPEH
LDA SHAPEH
AND #$1F TEST FOR DONE.
BNE BKGND1
RTS
* HI-RES GRAPHICS POSITION AND PLOT SUBRS
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 HBASL FOR Y-COORD = 00ABCDEF.
LSR ;CALCULATES BASE ADDRESS
LSR ;IN HBASL, HBASH FOR
ORA HBASL ACCESSING SCREEN MEM
STA HBASL VIA (HBASL),Y ADDRESSING MODE
PLA
STA HBASH
ASL ;CALCULATES
ASL ;HBASH = PPPFGHCD
ASL ;HBASL = EABAB000
ROL HBASH
ASL ;WHERE PPP=001 FOR $2000-3FFF
ROL HBASH SCREEN MEM RANGE AND
ASL ; PPP=010 FOR $4000-7FFF
ROR HBASL (GIVEN Y-COORD=ABCDEFGH)
LDA HBASH
AND #$1F
ORA HPAG
STA HBASH
TXA DIVIDE X0 BY 7 FOR
CPY $#0 INDEX FROM BASE ADR
BEQ HPOSN2 (QUOTIENT) AND BIT
LDY #$23 WITHIN SCREEN MEM BYTE
ADC #$4 (MASK SPEC'D BY REMAINDER)
HPOSN1 INY
HPOSN2 SBC #$7 SUBTRACT OUT SEVENS
BCS HPOSN1
STY HNDX WORKS FOR X0 FROM
TAX 0 TO 279, LOW-ORDER
LDA MSKTBL-249,X BYTE IN X-REG,
STA HMASK HIGH IN Y-REG ON ENTRY
TYA
LSR ; IF ON ODD BYTE (CARRY SET)
LDA HCOLOR THEN ROTATE HCOLOR ONE
HPOSN3 STA HCOLOR1 BIT FOR 180 DEGREE SHIFT
BCS CSHFT2 PRIOR TO COPYING TO HCOLOR1.
RTS
HPLOT JSR HPOSN
HPLOT1 LDA HCOLOR1 CALC BIT POSN IN HBASL,H
EOR (HBASL),Y HNDX, AND HMASK FROM
AND HMASK Y-COORD IN A-REG,
EOR (HBASL),Y X-COORD IN X,Y-REGS.
STA (HBASL),Y FOR ANY 'L' BITS OF HMASK
RTS SUBSTITUTE CORRESPONDING
* BIT OF HCOLOR1.
* HI-RES GRAPHICS L,R,U,D SUBRS
LFTRT BPL RIGHT USE SIGN FOR LFT/RT SELECT
LEFT LDA HMASK
LSR ; SHIFT LOW-ORDER
BCS LEFT1 7 BITS OF HMASK
EOR #$C0 ONE BIT TO LSB.
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
CMP #$C0 7 BITS OF HCOLOR1
BPL RTS1 ONE BIT POSN.
LDA HCOLOR1
EOR #$7F ZXYXYXYX -> ZYXYXYXY
STA HCOLOR1
RTS1 RTS
RIGHT LDA HMASK
ASL ; SHIFT LOW-ORDER
EOR #$80 7 BITS OF HMASK
BMI LR1 ONE BIT TO MSB.
LDA #$81
INY NEXT BYTE.
CPY #$28
BCC NEWNDX
LDY #$0 WRAP AROUND SCREEN IF >279
BCS NEWNDX ALWAYS TAKEN.
* L,R,U,D, SUBROUTINES.
LRUDX1 CLC NO 90 DEG ROT (X-OR).
LRUDX2 LDA SHAPEX
AND #$4 IF B2=0 THEN NO PLOT.
BEQ LRUD4
LDA #$7F FOR EX-OR INTO SCREEN MEM
AND HMASK
AND (HBASL),Y SCREEN BIT SET?
BNE LRUD3
INC COLLSN
LDA #$7F
AND HMASK
BPL LRUD3 ALWAYS TAKEN.
LRUD1 CLC NO 90 DEG ROT.
LRUD2 LDA SHAPEX
AND #$4 IF B2=0 THEN NO PLOT.
BEQ LRUD4
LDA (HBASL),Y
EOR HCOLOR1 SET HI-RES SCREEN BIT
AND HMASK TO CORRESPONDING HCOLOR1
BNE LRUD3 IF BIT OF SCREEN CHANGES
INC COLLSN THEN INCR COLLSN DETECT
LRUD3 EOR (HBASL),Y
STA (HBASL),Y
LRUD4 LDA SHAPEX ADD GDRNT TO
ADC QDRNT SPECIFIED VECTOR
AND #$3 AND MOVE LFT, RT,
EQ3 EQU *-1 UP, OR DWN BASED
CMP #$2 ON SIGN AND CARRY.
ROR
LRUD BCS LFTRT
UPDWN BMI DOWN4 SIGN FOR UP/DWN SELECT
UP CLC
LDA HBASH CALC BASE ADDRESS
BIT EQ1C (ADR OF LEFTMOST BYTE)
BNE UP4 FOR NEXT LINE UP
ASL HBASL IN (HBASL, HBASH)
BCS UP2 WITH 192-LINE WRAPAROUND
BIT EQ3
BEQ UP1
ADC #$1F **** BIT MAP ****
SEC
BCS UP3 FOR ROW = ABCDEFGH
UP1 ADC #$23
PHA
LDA HBASL HBASL = EABAB000
ADC #$B0 HBASH = PPPFGHCD
BCS UP5
ADC #$F0 WHERE PPP=001 FOR PRIMARY
UP5 STA HBASL HI-RES PAGE ($2000-$3FFF)
PLA
BCS UP3
UP2 ADC #$1F
UP3 ROR HBASL
UP4 ADC #$FC
UPDWN1 STA HBASH
RTS
DOWN CLC
DOWN4 LDA HBASH
ADC #$4 CALC BASE ADR FOR NEXT LINE
EQ4 EQU *-1 DOWN TO (HBASL,HBASH)
BIT EQ1C
BNE UPDWN1
ASL HBASL WITH 192-LINE WRAPAROUND
BCC DOWN1
ADC #$E0
CLC
BIT EQ4
BEQ DOWN2
LDA HBASL
ADC #$50
EOR #$F0
BEQ DOWN3
EOR #$F0
DOWN3 STA HBASL
LDA HPAG
BCC DOWN2
DOWN1 ADC #$E0
DOWN2 ROR HBASL
BCC UPDWN1
* HI-RES GRAPHICS LINE DRAW SUBRS
HLINRL PHA
LDA #$0 SET (X0L,X0H) AND
STA X0L Y0 TO ZERO FOR
STA X0H REL LINE DRAW
STA Y0 (DX, DY).
PLA
HLIN 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 HLIN2 IN (DXL,DXH)
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
HLIN2 STA SHAPEX
STA EH INIT (EL,EH) TO
PLA ABS(X-X0)
STA DXL
STA EL
PLA
STA X0L
STX X0H
TYA
CLC
SBC Y0 CALC -ABS(Y-0)-1
BCC HLIN3 IN DY.
EOR #$FF
ADC #$FE
HLIN3 STA DY ROTATE Y DIR INTO
STY Y0 QDRNT SIGN BIT
ROR QDRNT (0=UP, 1=DOWN)
SEC
SBC DXL INIT (COUNTL, COUNTH).
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 GDRNT B6 FOR LFT/RT SELECT
SEC
MOVEX2 LDA EL ASSUME CARRY SET.
ADC DY (EL,EH)-DELTY TO (EL,EH)
STA EL NOTE: DY IS (-DELTY)-1
LDA EH CARRY CLR IF (EL,EH)
SBC #$0 GOES NEG.
HCOUNT STA EH
LDA (HBASL),Y SCREEN BYTE.
EOR HCOLOR1 PLOT DOT OF HCOLOR1.
AND HMASK CURRENT BIT MASK.
EOR (HBASL),Y
STA (HBASL),Y
INX DONE (DELTX+DELTY)
BNE HLIN4 DOTS?
INC COUNTH
BEQ RTS2 YES, RETURN.
HLIN4 LDA QDRNT FOR DIRECTION TEST
BCS MOVEX IF CAR SET, (EL, EH) POS
JSR UPDWN IF CLR, NEG, MOVE YDIR
CLC
LDA EL (EL,EH)+DELTX
ADC DXL TO (EL,EH).
STA EL
LDA EH CAR SET IF (EL,EH) GOES POS
ADC DXH
BVC HCOUNT ALWAYS TAKEN
MSKTBL HEX 81 LEFTMOST BIT OF BYTE.
HEX 82,84,88
HEX 90,A0
HEX C0 RIGHTMOST BIT OF BYTE.
EQ1C HEX 1C
COS HEX FF,FE,FA,F4,EC,E1,D4,C5,B4
HEX A1,8D,78,61,49,31,18,FF
* HI-RES GRAPHICS COORDINATE RESTORE SUBR
HFIND LDA HBASL
ASL ; CONVERTS BASE ADR
LDA HBASH TO Y-COORD
AND #$3
ROL ; FOR HBASL = EABAB000
ORA HBASL HBASH = PPPFGHCD
ASL
ASL ; GENERATE
ASL ; Y-COORD = ABCDEFGH
STA Y0
LDA HBASH (PPP=SCREEN PAGE,
LSR ; NORMALLY 001 FOR
LSR ; $2000-$3FFF
AND #$7 HI-RES SCREEN)
ORA Y0
STA Y0 CONVERTS HNDX (INDEX
LDA HNDX FROM BASE ADR)
ASL ; AND HMASK (BIT
ADC HNDX MASK) TO X-COORD
ASL ; IN (X0L, X0H)
TAX (RANGE $0-$133)
DEX
LDA HMASK
AND #$7F
HFIND1 INX
LSR
BNE HFIND1
STA X0H
TXA
CLC CALC HNDX*7+
ADC HNDX LOG (BASE 2) HMASK.
BCC HFIND2
INC X0H
HFIND2 STA X0L
RTS2 RTS
* HI-RES GRAPHICS SHAPE DRAW SUBR
*
* SHAPE DRAW
* R = 0 TO 63
* SCALE FACTOR USED (1=NORMAL)
*
DRAW STX SHAPEL DRAW DEFINITION
STY SHAPEH POINTER
DRAW1 TAX
LSR ; ROT ($0=$3F)
LSR
LSR ; GRDNT 0=UP, 1=RT,
LSR ; 2=DWN, 3=LFT.
STA QDRNT
TXA
AND #$F
TAX
LDY COS,X SAVE COS AND SIN
STY DXL VALS IN DXL AND DY.
EOR #$F
TAX
LDY COS+1,X
INY
STY DY
DRAW2 LDY HNDX BYTE INDEX FROM
LDX #$0 HI-RES BASE ADR.
STX COLLSN CLEAR COLLISION COUNT.
LDA (SHAPEL,X) 1ST SHAPE DEF BYTE.
DRAW3 STA SHAPEX
LDX #$80
STX EL EL,EH FOR FRACTIONAL
STX EH L,R,U,D VECTORS.
LDX SCALE SCALE FACTOR.
DRAW4 LDA EL
SEC IF FRAC COS OVFL
ADC DXL THEN MOVE IN
STA EL SPECIFIED VECTOR
BCC DRAW5 DIRECTION.
JSR LRUD1
CLC
DRAW5 LDA EH IF FRAC SIN OVFL
ADC DY THEN MOVE IN
STA EH SPECIFIED VECTOR
BCC DRAW6 DIRECTION
JSR LRUD2
DRAW6 DEX LOOP ON SCALE
BNE DRAW4 FACTOR.
LDA SHAPEX
LSR ; NEXT 3-BIT VECTOR
LSR ; OF SHAPE DEF.
LSR
BNE DRAW3 NOT DONE THIS BYTE.
INC SHAPEL
BNE DRAW7 NEXT BYTE OF
INC SHAPEH SHAPE DEFINITION.
DRAW7 LDA (SHAPEL,X)
BNE DRAW3 DONE IF ZERO.
RTS
* HI-RES GRAPHICS SHAPE EX-OR SUBR
*
* EX-OR SHAPE INTO SCREEN.
*
* ROT = 0 TO 3 (QUADRANT ONLY)
* SCALE IS USED
*
XDRAW STX SHAPEL SHAPE DEFINITION
STY SHAPEH POINTER.
XDRAW1 TAX
LSR ; ROT ($0-$3F)
LSR
LSR ; GDRNT 0=UP, 1=RT,
LSR ; 2=DWN, 3=LFT.
STA QDRNT
TXA
AND #$F
TAX
LDY COS,X SAVE COS AND SIN
STY DXL VALS IN DXL AND DY,
EOR #$F
TAX
LDY COS+1,X
INY
STY DY
XDRAW2 LDY HNDX INDEX FROM HI-RES
LDX #$0 BASE ADR.
STX COLLSN CLEAR COLLISION DETECT
LDA (SHAPEL,X) 1ST SHAPE DEF BYTE.
XDRAW3 STA SHAPEX
LDX #$80
STX EL EL,EH FOR FRACTIONAL
STX EH L,R,U,D, VECTORS.
LDX SCALE SCALE FACTOR.
XDRAW4 LDA EL
SEC IF FRAC COS OVFL
ADC DXL THEN MOVE IN
STA EL SPECIFIED VECTOR
BCC XDRAW5 DIRECTION
JSR LRUDX1
CLC
XDRAW5 LDA EH IF FRAC SIN OVFL
ADC DY THEN MOVE IN
STA EH SPECIFIED VECTOR
BCC XDRAW6 DIRECTION +90 DEG.
JSR LRUD2
XDRAW6 DEX LOOP ON SCALE
BNE XDRAW4 FACTOR.
LDA SHAPEX
LSR ; NEXT 3-BIT VECTOR
LSR ; OF SHAPE DEF.
LSR
BNE XDRAW3
INC SHAPEL
BNE XDRAW7 NEXT BYTE OF
INC SHAPEH SHAPE DEF.
XDRAW7 LDA (SHAPEL,X)
BNE XDRAW3 DONE IF ZERO.
RTS
* ENTRY POINTS FROM APPLE-II BASIC
BPOSN JSR PCOLR POSN CALL, COLR FROM BASIC
STA HCOLOR
JSR GETY0 Y0 FROM BASIC.
PHA
JSR GETX0 X0 FROM BASIC.
PLA
JSR HPOSN
LDX BXSAV
RTS
BPLOT JSR BPOSN PLOT CALL (BASIC).
JMP HPLOT1
BXDRW1 LDA HNDX
LSR ; SET HCOLOR1 FROM
JSR PCOLR BASIC VAR COLR.
JSR HPOSN3
BLINE JSR GETX0 LINE CALL, GET X0 FROM BASIC
TXA
PHA
TYA
TAX
JSR GETY0 Y0 FROM BASIC
TAY
PLA
JSR HLIN
LDX BXSAV
RTS
BGND JSR PCOLR BACKGROUND CALL
JMP BKGND0
* DRAW ROUTINES
BDRAW1 JSR BPOSN
BDRAW JSR BDRAWX DRAW CALL FROM BASIC.
JSR DRAW
LDX BXSAV
RTS
BXDRW1 JSR BPOSN
BXDRAW JSR BDRAWX EX-OR DRAW
JSR XDRAW FROM BASIC.
LDX BXSAV
RTS
BDRAWX STX BXSAV SAVE FOR BASIC.
LDY #$32
JSR PBYTE SCALE FROM BASIC.
STA SCALE
LDY #$28
JSR PBYTE ROT FROM BASIC.
PHA SAVE ON STACK.
LDA SHAPXL
STA SHAPEL START OF
LDA SHAPXH SHAPE TABLE.
STA SHAPEH
LDY #$20
JSR PBYTE SHAPE FROM BASIC.
BEQ RERR1
LDX #$0
CMP (SHAPEL,X) > NUM OF SHAPES?
BEQ BDRWX1
BCS RERR1 YES, RANGE ERR.
BDRWX1 ASL
BCC BDRWX2
INC SHAPEH
CLC
TAY SHAPE NO. * 2.
LDA (SHAPEL),Y
ADC SHAPEL
TAX ADD 2-BYTE INDEX
INY TO SHAPE TABLE
LDA (SHAPEL),Y START ADR
ADC SHAPXH (X LOW, Y HI).
TAY
PLA ROT FROM STACK.
RTS
* BASIC PARAM FETCH SUBR'S
PCOLR LDY #$16
PBYTE LDA (LOMEML),Y
BNE RERR1 GET BASIC PARAM.
DEY (ERR IF >255)
LDA (LOMEML),Y
RTSB RTS
GETX0 STX BXSAV SAVE FOR BASIC.
LDY #$5
LDA (LOMEML),Y X0 LOW-ORDER BYTE.
TAX
INY
LDA (LOMEML),Y HI-ORDER BYTE.
TAY
CPX #$18
SBC #$1 RANGE ERR IF >279
BCC RTSB
RERR1 JMP RNGERR
GETY0 LDY #$D OFFSET TO Y0 FROM LOMEM
JSR PBYTE GET BASIC PARAM Y0.
CMP #$C0 (ERR IF >191)
BCS RERR1
RTS
* SHAPE TAPE LOAD SUBROUTINE
SHLOAD STX BXSAV SAVE FOR BASIC.
JSR ACADR READ 2-BYTE LENGTH INTO
JSR READ BASIC ACC
LDA #$00 ;START OF SHAPE TABLE IS $0800
STA A1L
STA SHAPXL
CLC
ADC ACL
TAY
LDA #$08 ;HIGH BYTE OF SHAPE TABLE POINTER.
STA A1H
STA SHAPXH
ADC ACH
BCS MFULL1 NOT ENOUGH MEMORY.
CPY PPL
PHA
SBC PPH
PLA
BCS MFULL1
STY A2L
STA A2H
INY
BNE SHLOD1
ADC #$1
SHLOD1 STY LOMEML
STA MOMEMH
STY PVL
STA PVH
JSR RD2BIT
LDA #$3 .5 SECOND HEADER.
JSR READX1
LDX BXSAV
RTS
MFULL1 JMP MEMFUL

145
source/progaid/hires.tbl Normal file
View File

@ -0,0 +1,145 @@
* HI-RES EQUATES (DIRECTLY FROM LISTING)
SHAPEL EQU $1A POINTER TO
SHAPEH EQU $1B SHAPE LIST
HCOLOR1 EQU $1C RUNNING COLOR MASK
COUNTH EQU $1D
HBASL EQU $26 BASE ADR FOR CURRENT
HBASH EQU $27 HI-RES PLOT LINE. A
HMASK EQU $30
A1L EQU $3C MONITOR A1.
A1H EQU $3D
A2L EQU $3E MONITOR A2.
A2H EQU $3F
LOMEML EQU $4A BASIC 'START OF VARS'.
MOMEMH EQU $4B
DXL EQU $50 DELTA-X FOR HLIN, SHAPE.
DXH EQU $51
SHAPEX EQU $51 SHAPE TEMP.
DY EQU $52 DELTA-Y FOR HLIN, SHAPE.
QDRNT EQU $53 ROT QUADRANT (SHAPE).
EL EQU $54 ERROR FOR HLIN.
EH EQU $55
PPL EQU $CA BASIC START OF PROG PTR.
PPH EQU $CB
PVL EQU $CC BASIC END OF VARS PTR.
PVH EQU $CD
ACL EQU $CE BASIC ACC.
ACH EQU $CF
X0L EQU $320 PRIOR X-COORD SAVE
X0H EQU $321 AFTER HLIN OR HPLOT.
Y0 EQU $322 HLIN, HPLOT Y-COORD SAVE.
BXSAV EQU $323 X-REG SAVE FOR BASIC.
HCOLOR EQU $324 COLOR FOR HPLOT, HPOSN
HNDX EQU $325 HORIZ OFFSET SAVE.
HPAG EQU $326 HI-RES PAGE ($20 NORMAL)
SCALE EQU $327 SCALE FOR SHAPE, MOVE.
SHAPXL EQU $328 START OF
SHAPXH EQU $329 SHAPE TABLE.
COLLSN EQU $32A COLLISION COUNT.
HIRES EQU $C057 SWITCH TO HI-RES VIDEO
MIXSET EQU $C053 SELECT TEXT/GRAPHICS MIX
TXTCLR EQU $C050 SELECT GRAPHICS MODE.
MEMFUL EQU $E36B BASIC MEM FULL ERROR.
RNGERR EQU $EE68 BASIC RANGE ERROR.
ACADR EQU $F11E 2-BYTE TAPE READ SETUP.
RD2BIT EQU $FCFA TWO-EDGE TAPE SENSE.
READ EQU $FEFD TAPE READ (A1.A2).
READX1 EQU $FF02 READ WITHOUT HEADER.
* LABELS
SETHRL = $D000
HCLR = $D00E
BKGND0 = $D010
BKGND = $D012
BKGND1 = $D01B
HPOSN = $D02E
HPOSN1 = $D062
HPOSN2 = $D063
HPOSN3 = $D075
HPLOT = $D07A
HPLOT1 = $D07D
LFTRT = $D088
LEFT = $D08A
LR1 = $D091
LEFT1 = $D094
LEFT2 = $D099
NEWNDX = $D09B
CSHIFT = $D0A0
CSHFT2 = $D0A2
RTS1 = $D0AD
RIGHT = $D0AE
LRUDX1 = $D0C0
LRUDX2 = $D0C1
LRUD1 = $D0D8
LRUD2 = $D0D9
LRUD3 = $D0EA
LRUD4 = $D0EE
LRUD = $D0F7
UPDWN = $D0F9
UP = $D0FB
UP1 = $D111
UP5 = $D11C
UP2 = $D121
UP3 = $D123
UP4 = $D125
UPDWN1 = $D127
DOWN = $D12A
DOWN4 = $D12B
DOWN3 = $D14A
DOWN1 = $D151
DOWN2 = $D153
HLINRL = $D157
HLIN = $D164
HLIN2 = $D17C
HLIN3 = $D197
MOVEX = $D1AD
MOVEX2 = $D1B2
HCOUNT = $D1BC
HLIN4 = $D1CF
MSKTBL = $D1E3
EQ1C = $D1EA
COS = $D1EB
HFIND = $D1FC
HFIND1 = $D226
HFIND2 = $D237
RTS2 = $D23A
DRAW = $D23B
DRAW1 = $D23F
DRAW2 = $D258
DRAW3 = $D262
DRAW4 = $D26D
DRAW5 = $D27A
DRAW6 = $D285
DRAW7 = $D295
XDRAW = $D29A
XDRAW1 = $D29E
XDRAW2 = $D2B7
XDRAW3 = $D2C1
XDRAW4 = $D2CC
XDRAW5 = $D2D9
XDRAW6 = $D2E4
XDRAW7 = $D2F4
BPOSN = $D2F9
BPLOT = $D30E
BLIN1 = $D314
BXDRW1 = $D314
BLINE = $D31E
BGND = $D331
BDRAW1 = $D337
BDRAW = $D33A
bxdrw1 = $D344
BXDRAW = $D347
BDRAWX = $D351
BDRWX1 = $D37B
BDRWX2 = $D381
PCOLR = $D390
PBYTE = $D392
RTSB = $D399
GETX0 = $D39A
RERR1 = $D3AC
GETY0 = $D3AF
SHLOAD = $D3B9
SHLOD1 = $D3E9
MFULL1 = $D3FD

46
source/progaid/info.org Normal file
View File

@ -0,0 +1,46 @@
* Integer basic ROM D0 and D8 contents:
Information on contents of INTBASIC file, version changes, etc:
http://apple2history.org/history/ah15/
Information on programmer's aid, and INTBASIC file, including the fact
that the D8 area was filled (uselessly) with the D8 part of the
FPBASIC file: http://apple2history.org/history/ah03/
Bitmap scan PDF:
ftp://ftp.apple.asimov.net/pub/apple_II/documentation/programming/6502assembly/Apple%20II%20Programmer's%20Aid%201_alt.pdf
OCR'd (badly) PDF:
http://www.classiccmp.org/cini/pdf/Apple/Apple%20Programmers%20Aid%20Book.pdf
* Layout
| hires | High-Resolution Graphics | $D000-$D3FF | Gap from $D340-D38F? |
| renumapp | Renumber | $D400-$D4BB | |
| | Append | $D4BC-$D4D4 | |
| | | $D4D5-$D4DB | |
| relocate | Relocate | $D4DC-$D52D | |
| | | $D52E-$D534 | |
| verify | Tape Verify (BASIC) | $D535-$D553 | |
| | Tape Verify (6502 Code & Data) | $D554-$D5AA | |
| | | $D5AB-$D5BB | |
| ramtest | RAM Test | $D5BC-$D691 | |
| | | $D692-$D716 | |
| music | Music | $D717-$D7F8 | |
** script generator
parts = [
('hires', 0xD000, 0xD3FF),
('renumapp', 0xD400, 0xD4D4),
('relocate', 0xD4DC, 0xD52D),
('verify', 0xD535, 0xD5AA),
('ramtest', 0xD5BC, 0xD691),
('music', 0xD717, 0xD7F8),
]
for name, start, end in parts:
tail = 0x10000 - start
length = end - start + 1
print 'tail -c %d ../../apple2.orig.rom | head -c %d > %s.rom' % (tail, length, name)

99
source/progaid/music.asm Normal file
View File

@ -0,0 +1,99 @@
********************************
*
* MUSIC SUBROUTINE
*
* GARY J. SHANNON
*
********************************
ORG $D717
*
* ZERO PAGE WORK AREAS
* PARAMETER PASSING AREAS
*
DOWNTIME EQU $0
UPTIME EQU $1
LENGTH EQU $2
VOICE EQU $2FD
LONG EQU $2FE
NOTE EQU $2FF
SPEAKER EQU $C030
ENTRY JMP LOOKUP
PLAY LDY UPTIME
LDA SPEAKER
PLAY2 INC LENGTH
BNE PATH1
INC LENGTH+1
BNE PATH2
RTS
PATH1 NOP
JMP PATH2
PATH2 DEY
BEQ DOWN
JMP PATH3
PATH3 BNE PLAY2
DOWN LDY DOWNTIME
LDA SPEAKER
PLAY3 INC LENGTH
BNE PATH4
INC LENGTH+1
BNE PATH5
RTS
PATH4 NOP
JMP PATH5
PATH5 DEY
BEQ PLAY
JMP PATH6
PATH6 BNE PLAY3
LOOKUP LDA NOTE
ASL
TAY
LDA NOTES,Y
STA DOWNTIME
LDA VOICE
SHIFT LSR
BEQ DONE
LSR DOWNTIME
BNE SHIFT
DONE LDA NOTES,Y
SEC
SBC DOWNTIME
STA UPTIME
INY
LDA NOTES,Y
ADC DOWNTIME
STA DOWNTIME
LDA #$0
SEC
SBC LONG
STA LENGTH+1
LDA #$0
STA LENGTH
LDA UPTIME
BNE PLAY
REST NOP
NOP
JMP REST2
REST2 INC LENGTH
BNE REST3
INC LENGTH+1
BNE REST4
RTS
REST3 NOP
JMP REST4
REST4 BNE REST
NOTES HEX 00,00,F6,F6,E8,E8,DB,DB
HEX CF,CF,C3,C3,B8,B8,AE,AE
HEX A4,A4,9B,9B,92,92,8A,8A
HEX 82,82,7B,7B,74,74,6D,6E
HEX 67,68,61,62,5C,5C,57,57
HEX 52,52,4D,4E,49,49,45,45
HEX 41,41,3D,3E,3A,3A,36,37
HEX 33,34,30,31,2E,2E,2B,2C
HEX 29,29,26,27,24,25,22,23
HEX 20,21,1E,1F,1D,1D,1B,1C
HEX 1A,1A,18,19,17,17,15,16
HEX 14,15,13,14,12,12,11,11
HEX 10,10,0F,10,0E,0F

31
source/progaid/music.tbl Normal file
View File

@ -0,0 +1,31 @@
* EQUATES
DOWNTIME EQU $0
UPTIME EQU $1
LENGTH EQU $2
VOICE EQU $2FD
LONG EQU $2FE
NOTE EQU $2FF
SPEAKER EQU $C030
* LABELS
ENTRY = $D717
PLAY = $D71A
PLAY2 = $D71F
PATH1 = $D728
PATH2 = $D72C
PATH3 = $D732
DOWN = $D734
PLAY3 = $D739
PATH4 = $D742
PATH5 = $D746
PATH6 = $D74C
LOOKUP = $D74E
SHIFT = $D75B
DONE = $D762
REST = $D782
REST2 = $D787
REST3 = $D790
REST4 = $D794
NOTES = $D796

142
source/progaid/ramtest.asm Normal file
View File

@ -0,0 +1,142 @@
***************************
* *
* RAMTEST: *
* *
* BY WOZ *
* 6/77 *
* *
* COPYRIGHT 1987 BY: *
* APPLE COMPUTER INC *
* *
***************************
*
* EQUATES
*
DATA EQU $0 TEST DATA $00 OR $FF
NDATA EQU $1 INVERSE TEST DATA.
TESTD EQU $2 GALLOP DATA.
R3L EQU $6 AUX ADR POINTER.
R3H EQU $7
R4L EQU $8 AUX ADR POINTER.
R4H EQU $9
R5L EQU $A AUX ADR POINTER.
R5H EQU $B
R6L EQU $C GALLOP BIT MASK.
R6H EQU $D ($0001 TO 2^N)
YSAV EQU $34 MONITOR SCAN INDEX.
A1H EQU $3D BEGIN TEST BLOCK ADR.
A2L EQU $3E LEN (PAGES) FROM MON.
SETCTLY EQU $D5B0 ;SET UP CNTRL-Y LOCATION
PRBYTE EQU $FDDA BYTE PRINT SUBR.
COUT EQU $FDED CHAR OUT SUBR.
PRERR EQU $FF2D PRINTS 'ERR-BELL'
BELL EQU $FF3A
*
* RAMTEST:
*
ORG $D5BC
OBJ $A5BC
SETUP LDA #$C3
LDY #$D5
JMP SETCTLY
RAMTST LDA #$0
JSR TEST
LDA #$FF
JSR TEST
JMP BELL
TEST STA DATA
EOR #$FF
STA NDATA
LDA A1H
STA R3H
STA R4H
STA R5H
LDY #$0
STY R3L
STY R4L
STY R5L
LDX A2L
LDA DATA
TEST01 STA (R4L),Y
INY
BNE TEST01
INC R4H
DEX
BNE TEST01
LDX A2L
TEST02 LDA (R3L),Y
CMP DATA
BEQ TEST03
PHA
LDA R3H
JSR PRBYTE
TYA
JSR PRBYSP
LDA DATA
JSR PRBYSP
PLA
JSR $D692 !!! Diverges - PRBYCR in listing. d692 is right after listing
TEST03 INY
BNE TEST02
INC R3H
DEX
BNE TEST02
LDX A2L
TEST04 LDA NDATA
STA (R5L),Y
STY R6H
STY R6L
INC R6L
TEST05 LDA NDATA
JSR TEST6
LDA DATA
JSR TEST6
ASL R6L
ROL R6H
LDA R6H
CMP A2L
BCC TEST05
LDA DATA
STA (R5L),Y
INC R5L
BNE TEST04
INC R5H
DEX
BNE TEST04
RTS1 RTS
TEST6 STA TESTD
LDA R5L
EOR R6L
STA R4L
LDA R5H
EOR R6H
STA R4H
LDA TESTD
STA (R4L),Y
LDA (R5L),Y
CMP NDATA
BEQ RTS1
PHA
LDA R5H
JSR PRBYTE
LDA R5L
JSR PRBYSP
LDA NDATA
STA (R5L),Y
JSR PRBYSP
PLA
JMP $02CB --- diverges. JSR PRBYSP in listing
LDA R4H
JSR PRBYTE
LDA R4L
JSR PRBYSP
LDA TESTD
PRBYCR JSR PRBYSP
JSR PRERR
LDA #$8D
JMP COUT
PRBYSP JSR PRBYTE
LDA #$A0
JMP COUT

View File

@ -0,0 +1,34 @@
* EQUATES
DATA EQU $0 TEST DATA $00 OR $FF
NDATA EQU $1 INVERSE TEST DATA.
TESTD EQU $2 GALLOP DATA.
R3L EQU $6 AUX ADR POINTER.
R3H EQU $7
R4L EQU $8 AUX ADR POINTER.
R4H EQU $9
R5L EQU $A AUX ADR POINTER.
R5H EQU $B
R6L EQU $C GALLOP BIT MASK.
R6H EQU $D ($0001 TO 2^N)
YSAV EQU $34 MONITOR SCAN INDEX.
A1H EQU $3D BEGIN TEST BLOCK ADR.
A2L EQU $3E LEN (PAGES) FROM MON.
SETCTLY EQU $D5B0 ;SET UP CNTRL-Y LOCATION
PRBYTE EQU $FDDA BYTE PRINT SUBR.
COUT EQU $FDED CHAR OUT SUBR.
PRERR EQU $FF2D PRINTS 'ERR-BELL'
BELL EQU $FF3A
* LABELS
SETUP = $D5BC
RAMTST = $D5C3
TEST = $D5D0
TEST01 = $D5EA
TEST02 = $D5F6
TEST03 = $D60F
TEST04 = $D619
TEST05 = $D623
RTS1 = $D644
TEST6 = $D645
PRBYCR = $D67F
PRBYSP = $D68A

View File

@ -0,0 +1,92 @@
****************************
* *
* 6502 RELOCATION *
* SUBROUTINE *
* *
* 1. DEFINE BLOCKS *
* *A4<A1.A2 ^Y *
* (^Y IS CTRL-Y) *
* *
* 2. FIRST SEGMENT *
* *A4<A1.A2 ^Y *
* (IF CODE) *
* *
* *A4<A1.A2M *
* (IF MOVE) *
* *
* 3. SUBSEQUENT SEGMENTS *
* *.A2 ^Y OR *.A2M *
* *
* WOZ 11-10-77 *
* APPLE COMPUTER INC. *
* *
****************************
*
* RELOCATION SUBROUTINE EQUATES
*
R1L EQU $02 SWEET 16 REG 1.
INST EQU $0B 3-BYTE INST FIELD.
LENGTH EQU $2F LENGTH CODE
YSAV EQU $34 CMND BUF POINTER
A1L EQU $3C APPLE-II MON PARAM AREA.
A4L EQU $42 APPLE-II MON PARAM REG 4
IN EQU $0200
SW16 EQU $F689 ;SWEET 16 ENTRY
INSDS2 EQU $F88E ;DISASSEMBLER ENTRY
NXTA4 EQU $FCB4 POINTER INCR SUBR
FRMBEG EQU $01 SOURCE BLOCK BEGIN
FRMEND EQU $02 SOURCE BLOCK END
TOBEG EQU $04 DEST BLOCK BEGIN
ADR EQU $06 ADR PART OF INST.
*
* 6502 RELOCATION SUBROUTINE
*
ORG $D4DC
OBJ $A4DC
RELOC LDY YSAV
LDA IN,Y
CMP #$AA
BNE RELOC2
INC YSAV
LDX #$07
INIT LDA A1L,X
STA R1L,X
DEX
BPL INIT
RTS
RELOC2 LDY #$02
GETINS LDA (A1L),Y
STA INST,Y
DEY
BPL GETINS
JSR INSDS2
LDX LENGTH
DEX
BNE XLATE
LDA INST
AND #$0D
BEQ STINST
AND #$08
BNE STINST
STA INST+2
XLATE JSR SW16
LD FRMEND
CPR ADR
BNC SW16RT
LD ADR
SUB FRMBEG
BNC SW16RT
ADD TOBEG
ST ADR
SW16RT RTN
STINST LDX #$00
STINS2 LDA INST,X
STA (A4L),Y
INX
JSR NXTA4
DEC LENGTH
BPL STINS2
BCC RELOC2
RTS

View File

@ -0,0 +1,27 @@
* EQUATES
R1L EQU $02 SWEET 16 REG 1.
INST EQU $0B 3-BYTE INST FIELD.
LENGTH EQU $2F LENGTH CODE
YSAV EQU $34 CMND BUF POINTER
A1L EQU $3C APPLE-II MON PARAM AREA.
A4L EQU $42 APPLE-II MON PARAM REG 4
IN EQU $0200
SW16 EQU $F689 ;SWEET 16 ENTRY
INSDS2 EQU $F88E ;DISASSEMBLER ENTRY
NXTA4 EQU $FCB4 POINTER INCR SUBR
FRMBEG EQU $01 SOURCE BLOCK BEGIN
FRMEND EQU $02 SOURCE BLOCK END
TOBEG EQU $04 DEST BLOCK BEGIN
ADR EQU $06 ADR PART OF INST.
* LABELS
RELOC = $D4DC
INIT = $D4E9
RELOC2 = $D4F1
GETINS = $D4F3
XLATE = $D50F
SW16RT = $D51C
STINST = $D51D
STINS2 = $D51F

View File

@ -0,0 +1,80 @@
**************************************************
* *
* APPLE-][ BASIC RENUMBER / APPEND SUBROUTINES *
* *
* VERSION TWO *
* RENUMBER *
* >CLR *
* >START= *
* >STEP= *
* >CALL -10531 *
* *
* OPTIONAL *
* >FROM= *
* >TO= *
* >CALL -10521 *
* *
* USE RENX ENTRY *
* FOR RENUMBER ALL *
* *
* WOZ APRIL 12, 1978 *
* APPLE COMPUTER INC. *
**************************************************
*
*
*
*
ROL EQU $0 LOW-ORDER SW16 R0 BYTE.
ROH EQU $1 HI-ORDER.
ONE EQU $01
R11L EQU $16 LOW-ORDER SW16 R11 BYTE.
R11H EQU $17 HI-ORDER.
HIMEM EQU $4C BASIC HIMEM POINTER.
PPL EQU $CA BASIC PROG POINTER.
PVL EQU $CC BASIC VAR POINTER.
MEMFULL EQU $E36B BASIC MEM FULL ERROR.
PRDEC EQU $E51B BASIC DECIMAL PRINT SUBR.
RANGERR EQU $EE68 BASIC RANGE ERROR.
LOAD EQU $F0DF BASIC LOAD SUBR.
SW16 EQU $F689 SWEET 16 ENTRY.
CROUT EQU $FD8E CAR RET SUBR.
COUT EQU $FDED CHAR OUT SUBR.
*
* SWEET 16 EQUATES
*
ACC EQU $0 SWEET 16 ACCUMULATOR.
NEWLOW EQU $1 NEW INITIAL LNO.
NEWINCR EQU $2 NEW LNO INCR.
LNLOW EQU $3 LOW LNO OF RENUM RANGE.
LNHI EQU $4 HI LNO OF RENUM RANGE.
TBLSTRT EQU $5 LNO TABLE START.
TBLNDX1 EQU $6 PASS 1 LNO TBL INDEX.
TBLIM EQU $7 LNO TABLE LIMIT.
SCR8 EQU $8 SCRATCH REG.
HMEM EQU $8 HIMEM (END OF PRGM).
SCR9 EQU $9 SCRATCH REG.
PRGNDX EQU $9 PASS 1 PROG INDEX.
PRGNDX1 EQU $A ALSO PROG INDEX.
NEWLN EQU $B NEXT "NEW LNO".
NEWLN1 EQU $C PRIOR "NEW LNO" ASSIGN.
TBLND EQU $6 PASS 2 LNO TABLE END.
PRGNDX2 EQU $7 PASS 2 PROG INDEX.
CHR0 EQU $9 ASCII "0".
CHRA EQU $A ASCII "A".
MODE EQU $C CONST/LNO MODE.
TBLNDX2 EQU $B LNO TBL IDX FOR UPDATE.
OLDLN EQU $D OLD LNO FOR UPDATE.
STRCON EQU $B BASIC STR CON TOKEN.
REM EQU $C BASIC REM TOKEN
R13 EQU $D SWEET 16 REG 13 (CPR REG).
THEN EQU $D BASIC THEN TOKEN
LIST EQU $D BASIC LIST TOKEN
DEL EQU $D
SCRC EQU $C SCRATCH REG FOR APPEND.
*
* APPLE-11 BASIC RENUMBER SUBROUTINE - PASS 1
ORG $D400
OBJ $A400

View File

@ -0,0 +1,74 @@
* EQUATES
ROL EQU $0 LOW-ORDER SW16 R0 BYTE.
ROH EQU $1 HI-ORDER.
ONE EQU $01
R11L EQU $16 LOW-ORDER SW16 R11 BYTE.
R11H EQU $17 HI-ORDER.
HIMEM EQU $4C BASIC HIMEM POINTER.
PPL EQU $CA BASIC PROG POINTER.
PVL EQU $CC BASIC VAR POINTER.
MEMFULL EQU $E36B BASIC MEM FULL ERROR.
PRDEC EQU $E51B BASIC DECIMAL PRINT SUBR.
RANGERR EQU $EE68 BASIC RANGE ERROR.
LOAD EQU $F0DF BASIC LOAD SUBR.
SW16 EQU $F689 SWEET 16 ENTRY.
CROUT EQU $FD8E CAR RET SUBR.
COUT EQU $FDED CHAR OUT SUBR.
* SWEET 16 EQUATES
ACC EQU $0 SWEET 16 ACCUMULATOR.
NEWLOW EQU $1 NEW INITIAL LNO.
NEWINCR EQU $2 NEW LNO INCR.
LNLOW EQU $3 LOW LNO OF RENUM RANGE.
LNHI EQU $4 HI LNO OF RENUM RANGE.
TBLSTRT EQU $5 LNO TABLE START.
TBLNDX1 EQU $6 PASS 1 LNO TBL INDEX.
TBLIM EQU $7 LNO TABLE LIMIT.
SCR8 EQU $8 SCRATCH REG.
HMEM EQU $8 HIMEM (END OF PRGM).
SCR9 EQU $9 SCRATCH REG.
PRGNDX EQU $9 PASS 1 PROG INDEX.
PRGNDX1 EQU $A ALSO PROG INDEX.
NEWLN EQU $B NEXT "NEW LNO".
NEWLN1 EQU $C PRIOR "NEW LNO" ASSIGN.
TBLND EQU $6 PASS 2 LNO TABLE END.
PRGNDX2 EQU $7 PASS 2 PROG INDEX.
CHR0 EQU $9 ASCII "0".
CHRA EQU $A ASCII "A".
MODE EQU $C CONST/LNO MODE.
TBLNDX2 EQU $B LNO TBL IDX FOR UPDATE.
OLDLN EQU $D OLD LNO FOR UPDATE.
STRCON EQU $B BASIC STR CON TOKEN.
REM EQU $C BASIC REM TOKEN
R13 EQU $D SWEET 16 REG 13 (CPR REG).
THEN EQU $D BASIC THEN TOKEN
LIST EQU $D BASIC LIST TOKEN
DEL EQU $D
SCRC EQU $C SCRATCH REG FOR APPEND.
* LABELS
RENX = $D400
RENUM = $D408
RNUM3 = $D410
PASS1 = $D41C
P1A = $D432
P1B = $D457
RERR = $D45A
MERR = $D45E
P1C = $D462
PASS2 = $D466
P2A = $D46C
UPDATE = $0472
UD2 = $0477
UD3 = $D485
GOTCON = $D489
ITEM = $D49D
SKPASC = $D494
CHKTOK = $D49A
CONTST = $D4B8
CONTS2 = $D4B9
APPEND = $D4BC
DONE = $D4D3

93
source/progaid/verify.asm Normal file
View File

@ -0,0 +1,93 @@
*****************************
* *
* TAPE VERIFY *
* *
* JAN 78 *
* BY WOZ *
* *
* *
*****************************
*
* TAPE VERIFY EQUATES
*
CHKSUM EQU $2E
A1 EQU $3C
HIMEM EQU $4C ;BASIC HIMEM POINTER
PP EQU $CA ;BASIC BEGIN OF PROGRAM
PRLEN EQU $CE ;BASIC PROGRAM LENGTH
XSAVE EQU $D8 ;PRESERVE X-REG FOR BASIC
HDRSET EQU $F11E ;SETS TAPE POINTERS TO $CE.CF
PRGSET EQU $F12C ;SETS TAPE POINTERS FOR PROGRAM
NXTA1 EQU $FCBA ;INCREMENTS (A1) AND COMPARES TO (A2)
HEADR EQU $FCC9
RDBYTE EQU $FCEC
RD2BIT EQU $FCFA
RDBIT EQU $FCFD
PRA1 EQU $FD92 ;PRINT (A1)-
PRBYTE EQU $FDDA
COUT EQU $FDED
FINISH EQU $FF26 ;CHECK CHECKSUM, RING BELL
PRERR EQU $FF2D
*
* TAPE VERIFY ROUTINE
*
ORG $D535
OBJ $A535
VFYBSC STX XSAVE
SEC
LDX #$FF
GETLEN LDA HIMEM+1,X
SBC PP+1,X
STA PRLEN+1,X
INX
BEQ GETLEN
JSR HDRSET
JSR TAPEVFY
LDX #$01
JSR PRGSET
JSR TAPEVFY
LDX XSAVE
RTS
*
* TAPE VERIFY RAM IMAGE (A1.A2)
*
TAPEVFY JSR RD2BIT
LDA #$16
JSR HEADR
STA CHKSUM
JSR RD2BIT
VRFY2 LDY #$24
JSR RDBIT
BCS VRFY2
JSR RDBIT
LDY #$3B
VRFY3 JSR RDBYTE
BEQ EXTDEL
VFYLOOP EOR CHKSUM
STA CHKSUM
JSR NXTA1
LDY #$34
BCC VRFY3
JMP FINISH
EXTDEL NOP
NOP
NOP
CMP (A1,X)
BEQ VFYLOOP
PHA
JSR PRERR
JSR PRA1
LDA (A1),Y
JSR PRBYTE
LDA #$A0
JSR COUT
LDA #$A8
JSR COUT
PLA
JSR PRBYTE
LDA #$A9
JSR COUT
LDA #$8D
JMP COUT

30
source/progaid/verify.tbl Normal file
View File

@ -0,0 +1,30 @@
* EQUATES
CHKSUM EQU $2E
A1 EQU $3C
HIMEM EQU $4C ;BASIC HIMEM POINTER
PP EQU $CA ;BASIC BEGIN OF PROGRAM
PRLEN EQU $CE ;BASIC PROGRAM LENGTH
XSAVE EQU $D8 ;PRESERVE X-REG FOR BASIC
HDRSET EQU $F11E ;SETS TAPE POINTERS TO $CE.CF
PRGSET EQU $F12C ;SETS TAPE POINTERS FOR PROGRAM
NXTA1 EQU $FCBA ;INCREMENTS (A1) AND COMPARES TO (A2)
HEADR EQU $FCC9
RDBYTE EQU $FCEC
RD2BIT EQU $FCFA
RDBIT EQU $FCFD
PRA1 EQU $FD92 ;PRINT (A1)-
PRBYTE EQU $FDDA
COUT EQU $FDED
FINISH EQU $FF26 ;CHECK CHECKSUM, RING BELL
PRERR EQU $FF2D
* LABELS
VFYBSC = $D535
GETLEN = $D53A
TAPEVFY = $D554
VRFY2 = $D561
VRFY3 = $D56D
VFYLOOP = $D572
EXTDEL = $D580