; ==============================================================================
; Apple II [$D0 ROM] (341-0016) - Programmer's Aid #1 [1978]
; ------------------------------------------------------------------------------
; Part 1 [$D000~$D3FF]: High-Resolution Graphics Subroutines
; by Steve Wozniak [WOZ], 1977-09-13;
; Copyright (c) 1978 by Apple Computer Inc. All Rights Reserved
; ------------------------------------------------------------------------------
; Instructions are in the Programmer's Aid #1 Installation and Operating Manual
; ==============================================================================
; Analyzed (via McFadden's SourceGen) by James Davis [Last Updated: 2020/06/17]
; ==============================================================================
;
; Hi-Res Equates:
;
SHAPEL EQU $1A {addr/1} ;Pointer to SHAPE List, Low
SHAPEH EQU $1B {addr/1} ;Pointer to SHAPE List, High
HCOLOR1 EQU $1C {addr/1} ;Running Color Mask
COUNTH EQU $1D {addr/1} ;BASIC Hi-Res Line Step, High
HBASL EQU $26 {addr/1} ;Hi-Res Graphics Base Address, Low
HBASH EQU $27 {addr/1} ;Hi-Res Graphics Base Address, High
HMASK EQU $30 {addr/1} ;Graphics On-the-Fly Color Bit Mask Safe
A1L EQU $3C {addr/1} ;Monitor General Purpose A1-Reg, Low
A1H EQU $3D {addr/1} ;Monitor General Purpose A1-Reg, High
A2L EQU $3E {addr/1} ;Monitor General Purpose A2-Reg, Low
A2H EQU $3F {addr/1} ;Monitor General Purpose A2-Reg, High
LOMEML EQU $4A {addr/1} ;BASIC Start of Variables, Low
LOMEMH EQU $4B {addr/1} ;BASIC Start of Variables, High
DXL EQU $50 {addr/1} ;DXL EQU $50 ;Delta-X for HLIN & SHAPE, Low
DXH EQU $51 {addr/1} ;Delta-X for HLIN & SHAPE, High
DY EQU $52 {addr/1} ;Delta-Y for HLIN & SHAPE
QDRNT EQU $53 {addr/1} ;Hi-Res Graphics Rotation Quadrant (SHAPE)
EL EQU $54 {addr/1} ;Error for HLIN, Low
EH EQU $55 {addr/1} ;Error for HLIN, High
PPL EQU $CA {addr/1} ;BASIC Start of Program Pointer, Low
PPH EQU $CB {addr/1} ;BASIC Start of Program Pointer, High
PVL EQU $CC {addr/1} ;BASIC End of Variables Pointer, Low
PVH EQU $CD {addr/1} ;BASIC End of Variables Pointer, High
ACL EQU $CE {addr/1} ;BASIC Accumulator, Low
ACH EQU $CF {addr/1} ;BASIC Accumulator, High
X0L EQU $0320 {addr/1} ;Prior X-Coord Safe after HLIN|HPLOT, Low
X0H EQU $0321 {addr/1} ;Prior X-Coord Safe after HLIN|HPLOT, High
Y0 EQU $0322 {addr/1} ;HLIN & HPLOT Y-Coordinate Safe
BXSAV EQU $0323 {addr/1} ;BASIC X-Reg Safe
HCOLOR EQU $0324 {addr/1} ;Color for HPLOT & HPOSN
HNDX EQU $0325 {addr/1} ;Horizontal Offset Safe
HPAG EQU $0326 {addr/1} ;Hi-Res Page (1=$20/2=$40) to Draw on
SCALE EQU $0327 {addr/1} ;SCALE for SHAPE & MOVE
SHAPXL EQU $0328 {addr/1} ;Start of SHAPE Table, Low
SHAPXH EQU $0329 {addr/1} ;Start of SHAPE Table, High
COLLSN EQU $032A {addr/1} ;Collision Count
TXTCLR EQU $C050 {addr/1} ;Select Graphics Mode
MIXSET EQU $C053 {addr/1} ;Select Text/Graphics Mixed Mode
HIRES EQU $C057 {addr/1} ;Switch to Hi-Res Video
MEMFUL EQU $E36B ;BASIC Memory Full Error
RNGERR EQU $EE68 ;BASIC Range Error
ACADR EQU $F11E ;2-Byte Tape Read Setup
RD2BIT EQU $FCFA ;Two-Edge Tape Sense (READ)
READ EQU $FEFD ;Read Data from Tape (A1,A2)
READX1 EQU $FF02 ;Read Data from Tape without Header
ORG $D000
;
; ==============================================================================
; High Resolution Graphics Inits [ROM Version $D000 to $D3FF]
; ==============================================================================
;
D000: A9 20 SETHRL LDA #$20 ;Initialize Hi-Res Page 1 =($2000~$3FFF):
D002: 8D 26 03 STA HPAG ;Set Hi-Res Screen Area =(32 Memory Pages)
D005: AD 57 C0 LDA HIRES ;Set Hi-Res Display Mode ...
D008: AD 53 C0 LDA MIXSET ; with Text at Bottom
D00B: AD 50 C0 LDA TXTCLR ;Set Graphics Display Mode
D00E: A9 00 HCLR LDA #0
D010: 85 1C BKGND0 STA HCOLOR1 ;Set for Black Background
D012: AD 26 03 BKGND LDA HPAG
D015: 85 1B STA SHAPEH ;Init Hi-Res Screen Memory ...
D017: A0 00 LDY #0 ; for Current Page, normally
D019: 84 1A STY SHAPEL ; $2000~$3FFF or $4000~$5FFF
D01B: A5 1C BKGND1 LDA HCOLOR1
D01D: 91 1A STA (SHAPEL),Y
D01F: 20 A2 D0 JSR CSHFT2 ;(SHAPEL,H) will specify ...
D022: C8 INY ; 32 Separate Pages ...
D023: D0 F6 BNE BKGND1 ; throughout the Init
D025: E6 1B INC SHAPEH
D027: A5 1B LDA SHAPEH
D029: 29 1F AND #%00011111 ;Test for Done
D02B: D0 EE BNE BKGND1
D02D: 60 RTS
; ==============================================================================
; Hi-Res Graphics Position & Plot Subroutines
; ==============================================================================
;
D02E: 8D 22 03 HPOSN STA Y0 ;Enter with Y in A-Reg, ...
D031: 8E 20 03 STX X0L ; XL in X-Reg, & ...
D034: 8C 21 03 STY X0H ; XH in Y-Reg, for ...
D037: 48 PHA
D038: 29 C0 AND #%11000000
D03A: 85 26 STA HBASL ; Y-Coordinate = 00ABCDEF
D03C: 4A LSR A ;Calculates Base Address ...
D03D: 4A LSR A ; in HBASL,HBASH for ...
D03E: 05 26 ORA HBASL ; Accessing Screen Memory ...
D040: 85 26 STA HBASL ; via (HBASL),Y Addressing Mode
D042: 68 PLA
D043: 85 27 STA HBASH
D045: 0A ASL A ;Calculates ...
D046: 0A ASL A ; HBASH = PPPFGHCD, ...
D047: 0A ASL A ; HBASL = EABAB000, ...
D048: 26 27 ROL HBASH
D04A: 0A ASL A ; Where PPP=001 for $2000~$3FFF ...
D04B: 26 27 ROL HBASH ; Screen Memory Range & ...
D04D: 0A ASL A ; PPP1010 for $4000~$7FFF ...
D04E: 66 26 ROR HBASL ; (Given Y-Coordinate=ABCDEFGH)
D050: A5 27 LDA HBASH
D052: 29 1F AND #%00011111
D054: 0D 26 03 ORA HPAG
D057: 85 27 STA HBASH
D059: 8A TXA ;Divide X0 by 7 for ...
D05A: C0 00 CPY #0 ; Index from Base Address ...
D05C: F0 05 BEQ HPOSN2 ; (Quotient) & Bit ...
D05E: A0 23 LDY #$23 ; within Screen Memory Byte ...
D060: 69 04 ADC #4 ; (Mask Specified by Remainder) ...
D062: C8 HPOSN1 INY
D063: E9 07 HPOSN2 SBC #7 ; Subtract Out Sevens
D065: B0 FB BCS HPOSN1
D067: 8C 25 03 STY HNDX ;Works for X0 from ...
D06A: AA TAX ; 0 to 279, Low-Order ...
D06B: BD EA D0 LDA LRUD3,X ; Byte in X-Reg, ...
D06E: 85 30 STA HMASK ; High in Y-Reg on Entry
D070: 98 TYA
D071: 4A LSR A ;If on Odd Byte (Carry Set), ...
D072: AD 24 03 LDA HCOLOR ; Then Rotate HCOLOR One ...
D075: 85 1C HPOSN3 STA HCOLOR1 ; Bit for 180 Degree Shift ...
D077: B0 29 BCS CSHFT2 ; Prior to Copying to HCOLOR1
D079: 60 RTS
D07A: 20 2E D0 HPLOT JSR HPOSN
D07D: A5 1C HPLOT1 LDA HCOLOR1 ;Calculate Bit Position in HBASL,H, ...
D07F: 51 26 EOR (HBASL),Y ; HNDX, & HMASK from ...
D081: 25 30 AND HMASK ; Y-Coordinate in A-Reg, ...
D083: 51 26 EOR (HBASL),Y ; X-Coordinate in X,Y-Regs
D085: 91 26 STA (HBASL),Y ;For any 'L' Bits of HMASK ...
D087: 60 RTS ; Substitute Corresponding Bit of HCOLOR1
; ==============================================================================
; Hi-Res Graphics L,R,U,D Subroutines
; ==============================================================================
;
D088: 10 24 LFTRT BPL RIGHT ;Use Sign for Left/Right Select
D08A: A5 30 LEFT LDA HMASK
D08C: 4A LSR A ;Shift Low-Order ...
D08D: B0 05 BCS LEFT1 ; 7 Bits of HMASK ...
D08F: 49 C0 EOR #%11000000 ; One Bit to Lsb
D091: 85 30 LR1 STA HMASK
D093: 60 RTS
D094: 88 LEFT1 DEY ;Decrement Horizontal Index
D095: 10 02 BPL LEFT2
D097: A0 27 LDY #39 ;Wrap Around Screen
D099: A9 C0 LEFT2 LDA #%11000000 ;New HMASK, Righthost ...
D09B: 85 30 NEWNDX STA HMASK ; Dot of Byte
D09D: 8C 25 03 STY HNDX ;Update Horizontal Index
D0A0: A5 1C CSHIFT LDA HCOLOR1
D0A2: 0A CSHFT2 ASL A ;Rotate Low-Order ...
D0A3: C9 C0 CMP #%11000000 ; 7 Bits of HCOLOR1 ...
D0A5: 10 06 BPL RTS1 ; One Bit Position
D0A7: A5 1C LDA HCOLOR1
D0A9: 49 7F EOR #%01111111 ;ZXYXYXYX -> ZYXYXYXY
D0AB: 85 1C STA HCOLOR1
D0AD: 60 RTS1 RTS
D0AE: A5 30 RIGHT LDA HMASK
D0B0: 0A ASL A ;Shift Low-Order ...
D0B1: 49 80 EOR #$80 ; 7 Bits of HMASK ...
D0B3: 30 DC BMI LR1 ; One Bit to Msb
D0B5: A9 81 LDA #$81
D0B7: C8 INY ;Next Byte
D0B8: C0 28 CPY #$28
D0BA: 90 DF BCC NEWNDX
D0BC: A0 00 LDY #0 ;Wrap Around Screen If >279
D0BE: B0 DB BCS NEWNDX ;Always Taken
; ==============================================================================
; L,R,U,D Subroutines
; ==============================================================================
;
D0C0: 18 LRUDX1 CLC ;No 90 Degree Rotation (XOR)
D0C1: A5 51 LRUDX LDA DXH
D0C3: 29 04 AND #%00000100 ;If Bit2=0 then No Plot
D0C5: F0 27 BEQ LRUD4
D0C7: A9 7F LDA #$7F ;For XOR into Screen Memory
D0C9: 25 30 AND HMASK
D0CB: 31 26 AND (HBASL),Y ;Screen Bit Set?
D0CD: D0 1B BNE LRUD3
D0CF: EE 2A 03 INC COLLSN
D0D2: A9 7F LDA #$7F
D0D4: 25 30 AND HMASK
D0D6: 10 12 BPL LRUD3 ;Always Taken
;
D0D8: 18 LRUD1 CLC ;No 90 Degree Rotation
D0D9: A5 51 LRUD2 LDA DXH
D0DB: 29 04 AND #%00000100 ;If Bit2=0 then No Plot
D0DD: F0 0F BEQ LRUD4
D0DF: B1 26 LDA (HBASL),Y
D0E1: 45 1C EOR HCOLOR1 ;Set Hi-Res Screen Bit ...
D0E3: 25 30 AND HMASK ; to Corresponding HCOLOR1
D0E5: D0 03 BNE LRUD3 ;If Bit of Screen Changes ...
D0E7: EE 2A 03 INC COLLSN ; then Increment Collision Detect
D0EA: 51 26 LRUD3 EOR (HBASL),Y
D0EC: 91 26 STA (HBASL),Y
D0EE: A5 51 LRUD4 LDA DXH ;Add Quadrant to Specified Vector; ...
D0F0: 65 53 ADC QDRNT ; & Move Left, Right, Up, or Down, ...
D0F2: 29 03 AND #%00000011 ;<-[EQ3-1=(3)]; based on Sign & Carry
D0F4: C9 02 EQ3 CMP #%00000010
D0F6: 6A ROR A
D0F7: B0 8F LRUD BCS LFTRT
D0F9: 30 30 UPDWN BMI DOWN4 ;Sign for Up/Down Select
D0FB: 18 UP CLC
D0FC: A5 27 LDA HBASH ;Calculate Base Address ...
D0FE: 2C EA D1 BIT EQ1C ; (Address of Leftmost Byte) ...
D101: D0 22 BNE UP4 ; for Next Line Up ...
D103: 06 26 ASL HBASL ; in (HBASL,HBASH) ...
D105: B0 1A BCS UP2 ; with 192-Line Wraparound
D107: 2C F3 D0 BIT EQ3-1
D10A: F0 05 BEQ UP1
D10C: 69 1F ADC #$1F ;**** Bit Map ****
D10E: 38 SEC
D10F: B0 12 BCS UP3 ;Always Taken; For Row = ABCDEFGH, ...
D111: 69 23 UP1 ADC #$23
D113: 48 PHA
D114: A5 26 LDA HBASL ; HBASL = EABAB000
D116: 69 B0 ADC #$B0 ; HBASH = PPPFGHCD
D118: B0 02 BCS UP5
D11A: 69 F0 ADC #$F0 ;Where PPP=001 for Primary ...
D11C: 85 26 UP5 STA HBASL ; Hi-Res Page ($2000-$3FFF)
D11E: 68 PLA
D11F: B0 02 BCS UP3
D121: 69 1F UP2 ADC #$1F
D123: 66 26 UP3 ROR HBASL
D125: 69 FC UP4 ADC #$FC
D127: 85 27 UPDWN1 STA HBASH
D129: 60 RTS
D12A: 18 DOWN CLC
D12B: A5 27 DOWN4 LDA HBASH ;Calculate BASE Address for NEXT LINE ...
D12D: 69 04 ADC #4 ;<-[EQ4-1=(4)]; Down to (HBASL,HBASH) ...
D12F: 2C EA D1 EQ4 BIT EQ1C
D132: D0 F3 BNE UPDWN1
D134: 06 26 ASL HBASL ; with 192-Line Wraparound
D136: 90 19 BCC DOWN1
D138: 69 E0 ADC #$E0
D13A: 18 CLC
D13B: 2C 2E D1 BIT EQ4-1
D13E: F0 13 BEQ DOWN2
D140: A5 26 LDA HBASL
D142: 69 50 ADC #$50
D144: 49 F0 EOR #$F0
D146: F0 02 BEQ DOWN3
D148: 49 F0 EOR #$F0
D14A: 85 26 DOWN3 STA HBASL
D14C: AD 26 03 LDA HPAG
D14F: 90 02 BCC DOWN2
D151: 69 E0 DOWN1 ADC #$E0
D153: 66 26 DOWN2 ROR HBASL
D155: 90 D0 BCC UPDWN1
;
; ==============================================================================
; Hi-Res Graphics Line Draw Subroutines
; ==============================================================================
;
D157: 48 HLINRL PHA
D158: A9 00 LDA #0 ;Set (XOL,XOH) & ...
D15A: 8D 20 03 STA X0L ; Y0 to Zero for ...
D15D: 8D 21 03 STA X0H ; Relative Line Draw ...
D160: 8D 22 03 STA Y0 ; Y0 (DX,DY)
D163: 68 PLA
D164: 48 HLIN PHA ;On Entry ...
D165: 38 SEC ; XL: A-Reg
D166: ED 20 03 SBC X0L ; XH: X-Reg
D169: 48 PHA ; Y: Y-REG
D16A: 8A TXA
D16B: ED 21 03 SBC X0H
D16E: 85 53 STA QDRNT ;Calculate ABS(X-X0) ...
D170: B0 0A BCS HLIN2 ; in (DXL,DXH)
D172: 68 PLA
D173: 49 FF EOR #%11111111 ;X-Direction to Sign Bit ...
D175: 69 01 ADC #%00000001 ; of Quadrant ...
D177: 48 PHA ; 0=Right (DX Positive), ...
D178: A9 00 LDA #0 ; 1=Left (DX Negative)
D17A: E5 53 SBC QDRNT
D17C: 85 51 HLIN2 STA DXH
D17E: 85 55 STA EH ;Init (EL,EH) to ...
D180: 68 PLA ; ABS(X-X0)
D181: 85 50 STA DXL
D183: 85 54 STA EL
D185: 68 PLA
D186: 8D 20 03 STA X0L
D189: 8E 21 03 STX X0H
D18C: 98 TYA
D18D: 18 CLC
D18E: ED 22 03 SBC Y0 ;Calculate -ABS(Y-0)-1 ...
D191: 90 04 BCC HLIN3 ; in DY
D193: 49 FF EOR #%11111111
D195: 69 FE ADC #%11111110
D197: 85 52 HLIN3 STA DY ;Rotate Y-Direction into ...
D199: 8C 22 03 STY Y0 ; Quadrant Sign Bit ...
D19C: 66 53 ROR QDRNT ; (0=Up, 1=Down)
D19E: 38 SEC
D19F: E5 50 SBC DXL ;Init (COUNTL,COUNTH) ...
D1A1: AA TAX ; to -(DELTX+DELTY+1)
D1A2: A9 FF LDA #$FF
D1A4: E5 51 SBC DXH
D1A6: 85 1D STA COUNTH
D1A8: AC 25 03 LDY HNDX ;Horizontal Index
D1AB: B0 05 BCS MOVEX2 ;Always Taken
;
D1AD: 0A MOVEX ASL A ;Move in X-Direction
D1AE: 20 88 D0 JSR LFTRT ;Use Quadrant Bit 6 for Left/Right Select
D1B1: 38 SEC
D1B2: A5 54 MOVEX2 LDA EL ;Assume Carry Set
D1B4: 65 52 ADC DY ;(EL,EH)-DELTY to (EL,EH)
D1B6: 85 54 STA EL ;Note: DY is (-DELTY)-1
D1B8: A5 55 LDA EH ;Carry Clear if (EL,EH) ...
D1BA: E9 00 SBC #0 ; goes Negative
D1BC: 85 55 HCOUNT STA EH
D1BE: B1 26 LDA (HBASL),Y ;Screen Byte
D1C0: 45 1C EOR HCOLOR1 ;Plot Dot of HCOLOR1
D1C2: 25 30 AND HMASK ;Current Bit Mask
D1C4: 51 26 EOR (HBASL),Y
D1C6: 91 26 STA (HBASL),Y
D1C8: E8 INX ;Done (DELTX+DELTY)
D1C9: D0 04 BNE HLIN4 ;Dots?
D1CB: E6 1D INC COUNTH
D1CD: F0 6B BEQ RTS2 ;Yes, Return to Caller
;
D1CF: A5 53 HLIN4 LDA QDRNT ;For Direction Test ...
D1D1: B0 DA BCS MOVEX ; If Carry Set, (EL,EH) Positive, ...
D1D3: 20 F9 D0 JSR UPDWN ; If Clear, Negative, Move in Y-Direction
D1D6: 18 CLC
D1D7: A5 54 LDA EL ;(EL,EH)+DELTX ...
D1D9: 65 50 ADC DXL ; to (EL,EH)
D1DB: 85 54 STA EL
D1DD: A5 55 LDA EH ;Carry Set if (EL,EH) goes Positive
D1DF: 65 51 ADC DXH
D1E1: 50 D9 BVC HCOUNT ;Always Taken
;
D1E3: 81 MSKTBL HEX 81 ;<-[Bit-7] Leftmost Bit of Byte
D1E4: 82 84 88 HEX 828488
D1E7: 90 A0 HEX 90A0
D1E9: C0 HEX C0 ;<-[Bit-1 is NOT] Rightmost Bit of Byte
D1EA: 1C EQ1C HEX 1C ;<-[Bit-0 is] Rightmost Bit of Byte [!]
D1EB: FF FE FA F4 COS HEX FFFEFAF4
D1EF: EC E1 D4 C5 HEX ECE1D4C5
D1F3: B4 A1 8D 78 HEX B4A18D78
D1F7: 61 49 31 18 HEX 61493118
D1FB: FF HEX FF
;
; ==============================================================================
; Hi-Res Graphics Coordinate Restore Subroutine
; ==============================================================================
;
D1FC: A5 26 HFIND LDA HBASL
D1FE: 0A ASL A ;Converts Base Address ...
D1FF: A5 27 LDA HBASH ; to Y-Coordinate
D201: 29 03 AND #%00000011
D203: 2A ROL A ;For HBASL = EABAB000 ...
D204: 05 26 ORA HBASL ; & HBASH = PPPFGHCD, ...
D206: 0A ASL A
D207: 0A ASL A ;Generate ...
D208: 0A ASL A ; Y-Coordinate = ABCDEFGH
D209: 8D 22 03 STA Y0
D20C: A5 27 LDA HBASH ;(PPP=Screen Page, ...
D20E: 4A LSR A ; Normally 001 for ...
D20F: 4A LSR A ; $2000-$3FFF ...
D210: 29 07 AND #%00000111 ; Hi-Res Screen)
D212: 0D 22 03 ORA Y0
D215: 8D 22 03 STA Y0 ;Converts HNDX (Index ...
D218: AD 25 03 LDA HNDX ; from Base Address) ...
D21B: 0A ASL A ; & HMASK (Bit ...
D21C: 6D 25 03 ADC HNDX ; Mask) to X-Coordinate ...
D21F: 0A ASL A ; in (X0L,X0H) ...
D220: AA TAX ; (Range $0~$133)
D221: CA DEX
D222: A5 30 LDA HMASK
D224: 29 7F AND #$7F
D226: E8 HFIND1 INX
D227: 4A LSR A
D228: D0 FC BNE HFIND1
D22A: 8D 21 03 STA X0H
D22D: 8A TXA
D22E: 18 CLC
D22F: 6D 25 03 ADC HNDX ;Calculate HNDX*7 + LOG (Base 2) HMASK
D232: 90 03 BCC HFIND2
D234: EE 21 03 INC X0H
D237: 8D 20 03 HFIND2 STA X0L
D23A: 60 RTS2 RTS
; ==============================================================================
; Hi-Res Graphics Shape Draw Subroutine
; ==============================================================================
; Shape Draw
; R = 0 to 63
; Scale Factor used (1=Normal)
; ==============================================================================
;
D23B: 86 1A DRAW STX SHAPEL ;Draw Definition ...
D23D: 84 1B STY SHAPEH ; Pointer
D23F: AA DRAW1 TAX
D240: 4A LSR A ;Rotation ($0~$3F)
D241: 4A LSR A
D242: 4A LSR A ;Quadrant 0=Up, 1=Right, 2=Down, 3=Left
D243: 4A LSR A
D244: 85 53 STA QDRNT
D246: 8A TXA
D247: 29 0F AND #%00001111
D249: AA TAX
D24A: BC EB D1 LDY COS,X ;Save COS & SIN ...
D24D: 84 50 STY DXL ; Values in DXL & DY
D24F: 49 0F EOR #%00001111
D251: AA TAX
D252: BC EC D1 LDY COS+1,X
D255: C8 INY
D256: 84 52 STY DY
D258: AC 25 03 DRAW2 LDY HNDX ;Byte Index From Hi-Res Base Address
D25B: A2 00 LDX #0
D25D: 8E 2A 03 STX COLLSN ;Clear Collision Count
D260: A1 1A LDA (SHAPEL,X) ;1st Shape Definition Byte
D262: 85 51 DRAW3 STA DXH
D264: A2 80 LDX #$80
D266: 86 54 STX EL ;EL,EH for Fractional L,R,U,D Vectors
D268: 86 55 STX EH
D26A: AE 27 03 LDX SCALE ;Scale Factor
D26D: A5 54 DRAW4 LDA EL
D26F: 38 SEC ;If Fractional COS Overflow then ...
D270: 65 50 ADC DXL ; Move in Specified Vector Direction
D272: 85 54 STA EL
D274: 90 04 BCC DRAW5
D276: 20 D8 D0 JSR LRUD1
D279: 18 CLC
D27A: A5 55 DRAW5 LDA EH ;If Fractional SIN Overflow, Move in ...
D27C: 65 52 ADC DY ; Specified Vector Direction +90 Degrees
D27E: 85 55 STA EH
D280: 90 03 BCC DRAW6
D282: 20 D9 D0 JSR LRUD2
D285: CA DRAW6 DEX ;Loop on Scale Factor
D286: D0 E5 BNE DRAW4
D288: A5 51 LDA DXH
D28A: 4A LSR A ;Next 3-Bit Vector of Shape Definition
D28B: 4A LSR A
D28C: 4A LSR A
D28D: D0 D3 BNE DRAW3 ;Not Done this Byte
D28F: E6 1A INC SHAPEL
D291: D0 02 BNE DRAW7 ;Next Byte of Shape Definition
D293: E6 1B INC SHAPEH
D295: A1 1A DRAW7 LDA (SHAPEL,X)
D297: D0 C9 BNE DRAW3 ;Done If Zero
D299: 60 RTS
; ==============================================================================
; Hi-Res Graphics Shape XOR Subroutine
; ==============================================================================
; XOR Shape into Screen
;
; Rotation = 0 to 3 (Quadrant Only)
; Scale is Used
; ==============================================================================
;
D29A: 86 1A XDRAW STX SHAPEL ;Shape Definition Pointer
D29C: 84 1B STY SHAPEH
D29E: AA XDRAW1 TAX
D29F: 4A LSR A ;Rotation ($0-$3F)
D2A0: 4A LSR A
D2A1: 4A LSR A ;Quadrant: 0=Up, 1=Right, 2=Down, 3=Left
D2A2: 4A LSR A
D2A3: 85 53 STA QDRNT
D2A5: 8A TXA
D2A6: 29 0F AND #%00001111
D2A8: AA TAX
D2A9: BC EB D1 LDY COS,X ;Save COS & SIN Values in DXL & DY
D2AC: 84 50 STY DXL
D2AE: 49 0F EOR #%00001111
D2B0: AA TAX
D2B1: BC EC D1 LDY COS+1,X
D2B4: C8 INY
D2B5: 84 52 STY DY
D2B7: AC 25 03 XDRAW2 LDY HNDX ;Index from Hi-Res Base Address
D2BA: A2 00 LDX #0
D2BC: 8E 2A 03 STX COLLSN ;Clear Collision Detect
D2BF: A1 1A LDA (SHAPEL,X) ;1St Shape Definition Byte
D2C1: 85 51 XDRAW3 STA DXH
D2C3: A2 80 LDX #$80
D2C5: 86 54 STX EL ;EL,EH for Fractional L,R,U,D, Vectors
D2C7: 86 55 STX EH
D2C9: AE 27 03 LDX SCALE ;Scale Factor
D2CC: A5 54 XDRAW4 LDA EL
D2CE: 38 SEC ;If Fractional COS Overflow then ...
D2CF: 65 50 ADC DXL ; Move in Specified Vector Direction
D2D1: 85 54 STA EL
D2D3: 90 04 BCC XDRAW5
D2D5: 20 C0 D0 JSR LRUDX1
D2D8: 18 CLC
D2D9: A5 55 XDRAW5 LDA EH ;If Fractional SIN Overflow, Move in ...
D2DB: 65 52 ADC DY ; Specified Vector Direction +90 Degrees
D2DD: 85 55 STA EH
D2DF: 90 03 BCC XDRAW6
D2E1: 20 D9 D0 JSR LRUD2
D2E4: CA XDRAW6 DEX ;Loop on Scale Factor
D2E5: D0 E5 BNE XDRAW4
D2E7: A5 51 LDA DXH
D2E9: 4A LSR A ;Next 3-Bit Vector of Shape Definition
D2EA: 4A LSR A
D2EB: 4A LSR A
D2EC: D0 D3 BNE XDRAW3
D2EE: E6 1A INC SHAPEL
D2F0: D0 02 BNE XDRAW7 ;Next Byte of Shape Definition
D2F2: E6 1B INC SHAPEH
D2F4: A1 1A XDRAW7 LDA (SHAPEL,X)
D2F6: D0 C9 BNE XDRAW3 ;Done If Zero
D2F8: 60 RTS
; ==============================================================================
; Entry Points from Apple-II BASIC
; ==============================================================================
;
D2F9: 20 90 D3 BPOSN JSR PCOLR ;BASIC Position Call; Get Color from BASIC
D2FC: 8D 24 03 STA HCOLOR
D2FF: 20 AF D3 JSR GETY0 ;Get Y0 from BASIC
D302: 48 PHA
D303: 20 9A D3 JSR GETX0 ;Get X0 from BASIC
D306: 68 PLA
D307: 20 2E D0 JSR HPOSN
D30A: AE 23 03 LDX BXSAV
D30D: 60 RTS
D30E: 20 F9 D2 BPLOT JSR BPOSN ;BASIC Plot Call
D311: 4C 7D D0 JMP HPLOT1
D314: AD 25 03 BLIN1 LDA HNDX
D317: 4A LSR A ;Set HCOLOR1 from BASIC Variable Color
D318: 20 90 D3 JSR PCOLR
D31B: 20 75 D0 JSR HPOSN3
D31E: 20 9A D3 BLINE JSR GETX0 ;BASIC Line Call, Get X0 from BASIC
D321: 8A TXA
D322: 48 PHA
D323: 98 TYA
D324: AA TAX
D325: 20 AF D3 JSR GETY0 ;Get Y0 from BASIC
D328: A8 TAY
D329: 68 PLA
D32A: 20 64 D1 JSR HLIN
D32D: AE 23 03 LDX BXSAV
D330: 60 RTS
D331: 20 90 D3 BGND JSR PCOLR ;BASIC Background Call
D334: 4C 10 D0 JMP BKGND0
; ==============================================================================
; Draw Routines
; ==============================================================================
;
D337: 20 F9 D2 BDRAW1 JSR BPOSN
D33A: 20 51 D3 BDRAW JSR BDRAWX ;DRAW CALL from BASIC
D33D: 20 3B D2 JSR DRAW
D340: AE 23 03 LDX BXSAV
D343: 60 RTS
D344: 20 F9 D2 BXDRW1 JSR BPOSN
D347: 20 51 D3 BXDRAW JSR BDRAWX ;XOR-DRAW CALL from BASIC
D34A: 20 9A D2 JSR XDRAW
D34D: AE 23 03 LDX BXSAV
D350: 60 RTS
D351: 8E 23 03 BDRAWX STX BXSAV ;Save for BASIC
D354: A0 32 LDY #$32
D356: 20 92 D3 JSR PBYTE ;Scale from BASIC
D359: 8D 27 03 STA SCALE
D35C: A0 28 LDY #$28
D35E: 20 92 D3 JSR PBYTE ;Rotation from BASIC
D361: 48 PHA ;Save on Stack
D362: AD 28 03 LDA SHAPXL
D365: 85 1A STA SHAPEL ;Start of Shape Table
D367: AD 29 03 LDA SHAPXH
D36A: 85 1B STA SHAPEH
D36C: A0 20 LDY #$20
D36E: 20 92 D3 JSR PBYTE ;Shape from BASIC
D371: F0 39 BEQ RERR1
D373: A2 00 LDX #0
D375: C1 1A CMP (SHAPEL,X) ;Is it > Number of Shapes?
D377: F0 02 BEQ BDRWX1
D379: B0 31 BCS RERR1 ;Yes, Range Error
D37B: 0A BDRWX1 ASL A
D37C: 90 03 BCC BDRWX2
D37E: E6 1B INC SHAPEH
D380: 18 CLC
D381: A8 BDRWX2 TAY ;No, Multiply by 2
D382: B1 1A LDA (SHAPEL),Y
D384: 65 1A ADC SHAPEL
D386: AA TAX ;Add 2-Byte Index ...
D387: C8 INY ; to Shape Table ...
D388: B1 1A LDA (SHAPEL),Y ; Start Address ...
D38A: 6D 29 03 ADC SHAPXH ; [(X,Y)={Low,High}]
D38D: A8 TAY
D38E: 68 PLA ;Rotation from Stack
D38F: 60 RTS
; ==============================================================================
; BASIC Parameter Fetch Subroutines
; ==============================================================================
;
D390: A0 16 PCOLR LDY #$16
D392: B1 4A PBYTE LDA (LOMEML),Y
D394: D0 16 BNE RERR1 ;Get BASIC Parameter
D396: 88 DEY ;(Error If >255)
D397: B1 4A LDA (LOMEML),Y
D399: 60 RTSB RTS
D39A: 8E 23 03 GETX0 STX BXSAV ;Save for BASIC
D39D: A0 05 LDY #5
D39F: B1 4A LDA (LOMEML),Y ;X0 Low-Order Byte
D3A1: AA TAX
D3A2: C8 INY
D3A3: B1 4A LDA (LOMEML),Y ;X0 High-Order Byte
D3A5: A8 TAY
D3A6: E0 18 CPX #$18
D3A8: E9 01 SBC #1 ;Range Error If >279
D3AA: 90 ED BCC RTSB
D3AC: 4C 68 EE RERR1 JMP RNGERR
D3AF: A0 0D GETY0 LDY #13 ;Offset to Y0 from LOMEM
D3B1: 20 92 D3 JSR PBYTE ;Get BASIC Parameter Y0
D3B4: C9 C0 CMP #$C0 ;(Error If >191)
D3B6: B0 F4 BCS RERR1
D3B8: 60 RTS
; ==============================================================================
; Shape Tape Load Subroutine
; ==============================================================================
;
D3B9: 8E 23 03 SHLOAD STX BXSAV ;Save for BASIC
D3BC: 20 1E F1 JSR ACADR ;Read 2-Byte Length into ...
D3BF: 20 FD FE JSR READ ; BASIC Accumulator
D3C2: A9 00 LDA #0 ;Start of Shape Table is $0800
D3C4: 85 3C STA A1L
D3C6: 8D 28 03 STA SHAPXL
D3C9: 18 CLC
D3CA: 65 CE ADC ACL
D3CC: A8 TAY
D3CD: A9 08 LDA #8 ;High Byte of Shape Table Pointer
D3CF: 85 3D STA A1H
D3D1: 8D 29 03 STA SHAPXH
D3D4: 65 CF ADC ACH
D3D6: B0 25 BCS MFULL1 ;Not Enough Memory
D3D8: C4 CA CPY PPL
D3DA: 48 PHA
D3DB: E5 CB SBC PPH
D3DD: 68 PLA
D3DE: B0 1D BCS MFULL1
D3E0: 84 3E STY A2L
D3E2: 85 3F STA A2H
D3E4: C8 INY
D3E5: D0 02 BNE SHLOD1
D3E7: 69 01 ADC #1
D3E9: 84 4A SHLOD1 STY LOMEML
D3EB: 85 4B STA LOMEMH
D3ED: 84 CC STY PVL
D3EF: 85 CD STA PVH
D3F1: 20 FA FC JSR RD2BIT
D3F4: A9 03 LDA #3 ;.5 Second Header
D3F6: 20 02 FF JSR READX1
D3F9: AE 23 03 LDX BXSAV
D3FC: 60 RTS
D3FD: 4C 6B E3 MFULL1 JMP MEMFUL