back to project page

Apple II Programmers Aid 1.1.$D000~$D3FF - Hi-Res Graphics.BIN Disassembly

                   ; ==============================================================================
                   ; 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

Symbol Table

BDRAW$D33A
BDRAW1$D337
BDRAWX$D351
BDRWX1$D37B
BDRWX2$D381
BGND$D331
BKGND$D012
BKGND1$D01B
BLIN1$D314
BLINE$D31E
BPLOT$D30E
BPOSN$D2F9
BXDRAW$D347
BXDRW1$D344
COS$D1EB
CSHFT2$D0A2
CSHIFT$D0A0
DOWN$D12A
DOWN1$D151
DOWN2$D153
DOWN3$D14A
DRAW$D23B
DRAW2$D258
DRAW3$D262
DRAW4$D26D
DRAW5$D27A
DRAW6$D285
DRAW7$D295
EQ1C$D1EA
EQ3$D0F4
EQ4$D12F
GETX0$D39A
GETY0$D3AF
HCLR$D00E
HCOUNT$D1BC
HFIND$D1FC
HFIND1$D226
HFIND2$D237
HLIN$D164
HLIN2$D17C
HLIN3$D197
HLIN4$D1CF
HLINRL$D157
HPLOT$D07A
HPLOT1$D07D
HPOSN$D02E
HPOSN1$D062
HPOSN2$D063
HPOSN3$D075
LEFT$D08A
LEFT1$D094
LFTRT$D088
LR1$D091
LRUD$D0F7
LRUD1$D0D8
LRUD2$D0D9
LRUD3$D0EA
LRUD4$D0EE
LRUDX$D0C1
LRUDX1$D0C0
MFULL1$D3FD
MOVEX$D1AD
MOVEX2$D1B2
MSKTBL$D1E3
NEWNDX$D09B
PBYTE$D392
PCOLR$D390
RERR1$D3AC
RIGHT$D0AE
RTS1$D0AD
RTSB$D399
SETHRL$D000
SHLOAD$D3B9
SHLOD1$D3E9
UP$D0FB
UP1$D111
UP2$D121
UP3$D123
UP4$D125
UP5$D11C
UPDWN$D0F9
UPDWN1$D127
XDRAW$D29A
XDRAW1$D29E
XDRAW2$D2B7
XDRAW3$D2C1
XDRAW4$D2CC
XDRAW5$D2D9
XDRAW6$D2E4
XDRAW7$D2F4