*  BRICKDOWN FOR THE APF MP-1000
*  -----------------------------
*  
*
*  Disassembled with DASMX by Adam Trionfo
*  
*  Version .02 - August 11, 2010
*  Version .01 - August 10, 2010



*  System ROM Routines
   
WRITEAPF  EQU   $40CB       ; Write APF Logo Routine
WRITESTR  EQU   $4144       ; Write String Routine
LEFTPAD   EQU   $41BE       ; Get Input from Leftpad Controller
RIGHTPAD  EQU   $41D9       ; Get Input from Rightpad Controller
NOISE     EQU   $426E       ; Make a Noise

*  Equates (RAM Locations - Variables)

JOYDATA   EQU   $01F2       ; Joystick Data

*  Misc Equates  

EOS       EQU   $FF         ; End of String
  

          ORG   $8000       ; Start of APF Cartridge Area
          
*  The BIOS uses the first five bytes of the cartridge  

          FCB   $BB         ; Tell BIOS a cart is present
          FDB   MENUSTR     ; Points to Menu string on cartridge 
          FCB   '7'         ; Seven Choices for Start-Up Menu
          FCB   $00         ; Must be $00

L8005:
          LDAA  $0000       ; Get the User's Menu Choice
          CMPA  #$04        ; Is Menu Choice Brickdown (1-4)?  
          BLS   BRICKDOWN   ; Branch if choice is Brickdown (1-4)
          SUBA  #$04
          STAA  $0000
          JMP   SHOOTMATC   ; Jump to "Shooting Match"

*  Start "Brickdown"
*  -----------------

BRICKDOWN CLRA              ; Zero-Out Accumulator A
          STAA  $0027       ; Store Zero
          STAA  $0020       ; Store Zero
          STAA  $001F       ; Store Zero
          STAA  $01F9       ; Store Zero
          LDX   #$0280      ; Original "Top of Paddle" Location
          STX   $0021       ; Store "Top of Paddle" Location

*  Write Top Row Game Boundry 
          LDX   #$842C      ; String for 31 Chars of Black Top / White Bottom
          STX   $0006       ; First Byte of String Address 
          LDX   #$0201      ; Screen Address to: Row 1, Column 2 (Top Row)
          JSR   WRITESTR    ; System ROM Routine - Write String

*  Write Bottom Row Game Boundry  
          LDX   #$842F      ; String for 31 Chars of White Top / Black Bottom
          STX   $0006       ; First Byte of String Address
          LDX   #$03E1      ; Screen Address to: Row 16, Column 2 (Bottom Row)
          JSR   WRITESTR    ; System ROM Routine - Write String

*  Finish Top Row Game Boundry
          LDAA  #$C3        ; ASCII Character: Black Top / White Bottom 
          STAA  $0200       ; Store in Upper-Left Corner of screen

*  Finish Bottom Row Game Boundry          
          LDAA  #$CC        ; ASCII Character: White Top / Black Bottom
          STAA  $03E0       ; Store in Lower-Left Corner of screen
          
*  Write Right Row Boundry
          LDX   #$8435      ; Use these Control and Fill Bytes
          STX   $01E6      
          LDAA  #$01        ; One Character Wide
          LDX   #$021F      ; Start at Last Column of Row 1
          JSR   WRITEAPF    ; System ROM Routine - Write APF Logo

*  Store score of "000" in Top-Left Corner of Screen
          LDAA  #$70        ; APF ASCII 'Zero'
          STAA  $0200       ; Store at Top Row, Position 0  
          STAA  $0201       ; Store at Top Row, Position 1
          STAA  $0202       ; Store at Top Row, Position 2

*  Set-up to Draw Bricks?
          LDAA  #14         ; Layer Height of Bricks
          STAA  $000E       ; Store Layer Height of Bricks
          LDAB  #8          ; Presume Layer Width of Bricks is eight
          STAB  $000B       ; Store Layer Thickness of Bricks
          LDAA  #$DF        ; APF ASCII $DF (Light Blue)
          STAA  $0008       ; Store (Light Blue)
          LDAA  #$BF        ; APF ASCII $BF (Red)       
          STAA  $0009       ; Store (Red)
          LDAA  #$CF        ; APF ASCII $CF (White)
          STAA  $000A       ; Store (White)
          LDX   #$0234      ; Placement of first Block here
          STX   $000C       ; Store Row/Column placement of first block

*  How many Brick Layers Did User Choose?
          LDAA  $0000       ; Get the User's Menu Choice  
          CMPA  #$02        ; Is it an Eight Layer Game?
          BLS   L8086       ; Yes: Branch, it is an Eight Layer Game 
          LDAB  #12         ; No: It is a twelve layer game 
          STAB  $000B       ; Store Layer Thickness of Bricks 
          LDAA  #$AF        ; APF ASCII $AF (Dark Blue)        
          STAA  $0009       ; Store (Dark Blue)
          LDX   #$0230      ; Placement of first Block here
          STX   $000C       ; Store Row/Column placement of first block

*  Draw Bricks to Screen
L8086:
          LDAA  $0008       ; Get Brick Color
          STAA  $00,X       ; Store a Brick to Screen
          DECB              ; Decrement number of bricks drawn on current row              
          BEQ   L80A0       ; Branch if all bricks for current row drawn
          INX               ; No: Not all bricks have been drawn yet
          LDAA  $0009       ; Get Color of next Brick
          STAA  $00,X       ; Store a Brick to Screen
          DECB              ; Decrement number of bricks drawn on current row
          BEQ   L80A0       ; Branch if all bricks for current row drawn
          INX               ; No: Not all bricks have been drawn yet
          LDAA  $000A       ; Get Color of next Brick
          STAA  $00,X       ; Store a Brick to Screen
          DECB              ; Have all bricks for current row been drawn?
          BEQ   L80A0       ; Branch if all bricks for current row drawn
          INX               ; No: Not all bricks have been drawn yet
          BRA   L8086       ; Continue to draw row of bricks

*  Increment Row/Column to Draw to next by one
L80A0:
          DEC   $000E       ; Decrement Layer Height of Bricks 
          BEQ   L80BE       ; Branch if no more layers to draw 
          LDX   $000C       ; Load Column placement of first block       
          LDAA  #32         ; Length of full row
          JSR   $411D       ; System ROM Routine - Increase X by one row
          STX   $000C       ; Store Row/Column placement of first block

*  Shuffle through the three Brick Colors.  This alternates the 
*  pattern so that it doesn't draw the same uninteresting pattern
*  over and over again
           
          LDAB  $0008       ; Load the color of Brick 1         
          LDAA  $0009       ; Load the color of Brick 2
          STAA  $0008       ; Place the Color of Brick 2 into Color of Brick 1 
          LDAA  $000A       ; Load the color of Brick 3
          STAA  $0009       ; Place the Color of Brick 3 into Color of Brick 2
          STAB  $000A       ; Place the Color of Brick 1 into Color of Brick 3
          LDAB  $000B       ; Get Layer Thickness of Bricks
          BRA   L8086       ; Start drawing next row of bricks

*  Draw Paddle to Screen
L80BE:
          LDAA  #$D5        ; APF ASCII $DF (Left Black/Right Light Blue) 
          STAA  $0280       ; Store "Top" of Paddle
          STAA  $02A0       ; Store "Bottom" of Paddle

*  Write "BALLS TO GO" Message          
          LDX   #BALLS2GO   ; "BALLS TO GO" Message String
          STX   $0006
          LDX   #$0213      ; Display string on Top Row
          JSR   WRITESTR    ; System ROM Routine - Write String

*  Store Number of Balls to Start (9)
          LDAA  #$79        ; APF ASCII $79 (The Number 9) 
          STAA  $021F       ; Store in Top-Right Corner of screen 

L80D6:
          TST   $0020       ; Not sure what $0020 holds yet...   
          BEQ   L80DE       ; $0020 WILL be zero first time 
          JMP   $4463       ; System ROM Routine - Interrupt Counter?  

L80DE:
          TST   $001F       ; Not sure what $001F holds yet...
          BNE   L80E7
          BSR   L8102
          BRA   L80F5

L80E7:
          WAI
          JSR   L8189
          LDAA  $0000
          BITA  #$01
          BEQ   L80F4
          JSR   L8125
L80F4:
          WAI
L80F5:
          JSR   L8125
          LDAA  $0000
          BITA  #$01
          BEQ   L80FF
          WAI
L80FF:
          WAI
          BRA     L80D6

L8102:
          LDAA  $01F9
          CMPA  #$04
          BLS   L8124
          INC   $001F
          LDAA  $01F8
          ANDA  #$03
          STAA  $001E
          JSR   L82EF
          CLRA              ; Zero-Out Accumulator A
          STAA  $0023       ; Store Zero
          STAA  $0015       ; Store Zero
          LDX   #$028F      ; Initial Placement of "Ball" 
          STX   $000F       ; Store "Ball" Position
          LDAA  #$A3        ; APF ASCII $A3, "Ball" (Top Black / Right Blue) 
          STAA  $00,X
L8124:
          RTS

*  Check Right Joystick for Movement
L8125:
          JSR   RIGHTPAD    ; System ROM Routine - Get Input from Rightpad Controller
          BCC   L8139       ; If Carry is Clear, then Joystick not used
*  Joystick Used, Check which direction it was pressed (North or South?)
          LDAA  JOYDATA     ; Joystick Data (Button or Direction Pushed)
          LDX   $0021       ; Load "Top of Paddle" Location
          LDAB  $00,X       ; Load B with Data in "Top of Paddle" Location 
          CMPA  #'N'        ; Has joystick been pushed North?
          BEQ   L813A       ; Yes: The Joystick was Pushed North
          CMPA  #'S'        ; Has joystick been pushed South?
          BEQ   L8167       ; Yes: The Joystick was Pushed South 
L8139:
          RTS

*  Joystick was pushed North
L813A:
          CMPB  #$D1        ; APF ASCII $D1 (Light Blue in Bottom-Right Corner) 
          BEQ   L815D       ; Branch if Top of Paddle is $D1  
          LDAB  #32         ; One Full Row (Used in System ROM Routine)
          JSR   $412F       ; System ROM Routine - Move X up One Row 

*  Check Paddle Boundaries - Can Paddle Actually Move?
L8143:
          CPX   #$0200      ; Check Top Boundary Limit
          BEQ   L8139       ; Hit Top Boundary, So Paddle can't go North
          CPX   #$03A0      ; Check Bottom Boundary Limit      
          BEQ   L8139       ; Hit Bottom Boundary, So Paddle can't go South

*  Erase Paddle and then Redraw it at New Location
          BSR   L8176       ; Erase Entire Paddle Column 
          LDAA  #$D4        ; APF ASCII $D4 (Light Blue in Upper-Right Corner)
          STAA  $40,X       ; Draw Lower-part of Paddle 
          LDAA  #$D1        ; APF ASCII $D1 (Light Blue in Bottom-Right Corner)
L8155:
          STAA  $00,X       ; Draw Top-part of Paddle
          LDAA  #$D5        ; APF ASCII $D5 (Right Black / Left Light Blue)
          STAA  $20,X       ; Draw Middle of Paddle 
          BRA   L8139       ; Return from Subroutine

L815D:
          LDAA  #$80        ; APF ASCII $80 (Black)
          STAA  $40,X       ; 
L8161:
          BSR   L8176       ; Erase Entire Paddle Column 
          LDAA  #$D5        ; APF ASCII $D5 (Right Black / Left Light Blue)
          BRA   L8155       ; Draw Paddle       

*  Joystick was pushed South
L8167:
          CMPB  #$D1        ; APF ASCII $D1 (Light Blue in Bottom-Right Corner)
          BNE   L8143       ; Check Paddle Boundries 
          LDAA  #$80        ; APF ASCII $80 (Black) 
          STAA  $00,X       ; Store Black at Top of Paddle 
          LDAA  #32         ; One Full Row (Used in System ROM Routine)        
          JSR   $411D       ; System ROM Routine - Move X Down One Row
          BRA   L8161

*  Erase Entire Paddle Column
*  This gets rid of the Paddle, no matter WHERE it is currently placed
L8176:
          STX   $0021       ; Store "Top of Paddle" Location 
          LDX   #$8432      ; Fill Paddle area with Black 
          STX   $01E6
          LDAA  #$01        ; One Row Wide
          LDX   $0220       ; Start at Second Row Down from Top-Left
          JSR   WRITEAPF    ; System ROM Routine - Write APF Logo
          
          LDX   $0021       ; Restore "Top of Paddle" Location       
          RTS

L8189:
          LDX   $000F       ; Load "Ball" Position 
          BSR   L81F4
          BSR   L81B8
          LDX   $0018
          LDAA  #$A3        ; APF ASCII $A3, "Ball" (Top Black / Right Blue)
          TST   $0015
          BEQ   L819D
          CLR   $0015
          BRA   L81A2

L819D:
          INC   $0015
          LDAA  #$AC        ; APF ASCII $AC, "Ball" (Top Blue / Right Black)
L81A2:
          JSR   L8362
          TST   $001C
          BNE   L81B5
          STAA  $00,X
          STX   $000F       ; Store "Ball" Position
          STX   $0011
          BSR   L81B8
          JMP   L820B
L81B5:
          JMP   L8267

L81B8:
          TST   $0016
          BNE   L81D6
          TST   $0015
          BEQ   L81C8
          LDAB  #$20
          CLC
          JSR   $412F       ; System ROM Routine
L81C8:
          TST   $0023
          BNE   L81D0
          DEX
          BRA   L81D1

L81D0:
          INX
L81D1:
          STX   $0018
          STX   $001A
          RTS

L81D6:
          TST   $0015
          BEQ   L81E6
          TST   $0023
          BEQ   L81E3
          INX
          BRA   L81D1

L81E3:
          DEX
          BRA   L81D1

L81E6:
          LDAA  #$1F
          TST   $0023
          BEQ   L81EF
          INCA
          INCA
L81EF:
          JSR   $411D       ; System ROM Routine - Part of WRITEAPF
          BRA   L81D1

L81F4:
          LDAA  $00,X        
          CMPA  #$AC        ; APF ASCII $AC, "Ball" (Top Blue / Right Black)
          BEQ   L8206
          CMPA  #$A3        ; APF ASCII $A3, "Ball" (Top Black / Right Blue)
          BEQ   L8206
          CMPA  #$A4        ; APF ASCII $A4, "Half-Ball" (Blue in Top-Right)
          BEQ   L8206       
          CMPA  #$A8        ; APF ASCII $A8, "Half-Ball" (Blue in Top-Left)
          BNE   L820A
L8206:
          LDAA  #$80        ; APF ASCII $80, (Black)
          STAA  $00,X       ; Erase "Ball" by Overwriting with Black
L820A:
          RTS

L820B:
          CLR   $001D
          CLR   $001C
          JSR   L8125
          LDX   $000F       ; Load "Ball" Position
          INX
          LDAA  $00,X
          BSR   L8268
          TST   $001C
          BNE   L8267
          DEX
          DEX
          LDAA  $00,X
          BSR   L8268
          TST   $001C
          BNE   L8267
          INX
          LDX   $0018
L822E:
          LDAA  $00,X
          BSR   L8268
          TST   $001C
          BNE   L8267
          TST   $001D
          BNE   L8247
          CPX   $001A
          BEQ   L8247
          LDX   $001A
          INC   $001D
          BRA   L822E

L8247:
          LDX   $0018
          CLR   $001D
L824C:
          LDAA  $00,X
          JSR   L82FC
          CMPA  #$80
          BEQ   L8257
          BRA   L8267

L8257:
          TST   $001D
          BNE   L8267
          CPX   $001A
          BEQ   L8267
          LDX   $001A
          INC   $001D
          BRA   L824C
L8267:
          RTS

L8268:
          CMPA  #$D4        ; APF ASCII $D4 (Light Blue in Upper-Right Corner)
          BEQ   L8284
          CMPA  #$D5        ; APF ASCII $DF (Left Black/Right Light Blue)
          BEQ   L8284
          CMPA  #$D1        ; APF ASCII $D1 (Light Blue Lower-Right Corner) 
          BEQ   L8284
          CMPA  $0008       ; Brick Color 1
          BEQ   L8281
          CMPA  $0009       ; Brick Color 2
          BEQ   L8281
          CMPA  $000A       ; Brick Color 3
          BEQ   L8281
          RTS
L8281:
          JMP   L82A3

L8284:
          LDAB  #$06
          LDAA  $01F9
          ANDA  #$02
          BEQ   L828F
          LDAB  #$02
L828F:
          STAB  $001E
          CLR   $0027
          INC   $0023
          INC   $001C
          JSR   L82EF
          LDAB  #$5E
          JSR   NOISE       ; System ROM Routine - Make a Noise
          RTS

L82A3:
          INC   $001C
          LDAA  #$80
          STAA  $00,X
          LDAA  $0202
          INCA
          CMPA  #$7A
          BEQ   L82B7
          STAA  $0202
          BRA   L82D1

L82B7:
          LDAA  #$70
          STAA  $0202
          LDAA  $0201
          INCA
          CMPA  #$7A
          BEQ   L82C9
          STAA  $0201
          BRA   L82D1

L82C9:
          LDAA  #$70
          STAA  $0201
          INC   $0200
L82D1:
          LDAB  #$58
          JSR   NOISE       ; System ROM Routine - Make a Noise
          TST   $0023
          BEQ   L82E0
          CLR   $0023
          BRA   L82E8

L82E0:
          TST   $0027
          BEQ   L82E8
          INC   $0023
L82E8:
          CLR   $0027
          JSR   L82EF
          RTS

L82EF:
          CLR   $0016
          LDAA  $001E
          CMPA  #$02
          BEQ   L82FB
          INC   $0016
L82FB:
          RTS

L82FC:
          STX   $0029
          LDAB  $002A
          ANDB  #$0F
          BNE   L830A
          LDAB  $002A
          ANDB  #$10
          BEQ   L833D
L830A:
          CMPA  #$80        ; APF ASCII $CA, "Background" (Black)
          BEQ   L832D
          CMPA  #$CA        ; APF ASCII $CA, "Right Wall" (Right White / Left Black)
          BEQ   L8332
          CMPA  #$CC        ; APF ASCII $CC, "Top Wall" (Top Black / Bottom White)
          BEQ   L832E
          CMPA  #$C4        ; APF ASCII $C4, "" (White Square on Top-Right)
          BEQ   L832E
          CMPA  #$C8        ; APF ASCII $C8, "" (White Square on Top-Left)
          BEQ   L832E
          LDAA  #$06
L8320:
          STAA  $001E
          JSR   L82EF
          CLR   $0027
L8328:
          LDAB  #$5E
          JSR   NOISE       ; System ROM Routine - Make a Noise
L832D:
          RTS

L832E:
          LDAA  #$02
          BRA   L8320

L8332:
          CLR   $0023
          JSR   L82EF
          INC   $0027
          BRA   L8328

L833D:
          LDX   $000F       ; Load "Ball" Position
          WAI
          WAI
          LDAA  #$80
          STAA  $00,X
          DEC   $021F
          LDAA  $021F
          CLR   $001F
          CLR   $01F9
          CMPA  #$70
          BEQ   L835E
          CLR   $0027
          LDAB  #$50
          JSR   NOISE       ; System ROM Routine - Make a Noise
          RTS

L835E:
          INC   $0020
          RTS

L8362:
          CLR   $001C
          STAA  $0026
          STX   $0024
          LDAA  $00,X
          CMPA  #$80
          BEQ   L837D
          JSR   L8268
          TST   $001C
          BNE   L837D
          INC   $001C
          JSR   L82FC
L837D:
          LDAA  $0026
          LDX   $0024
          RTS

*  Cartridge Menu String
*  ---------------------
*  
*  The data required by the BIOS for the main menu is here.

MENUSTR
          FCB   $CB         ; Control Byte - Fill 11 spaces with next byte 
          FCB   $EF         ; Fill-Byte - ASCII $EF, (Purple)                       
          FCC   " BRICKDOWN "
          FCB   $CA         ; Control Byte - Fill 10 spaces with next byte
          FCB   $EF         ; Fill-Byte - ASCII $EF, (Purple)
          FCC   "1. EIGHT LAYER--SLOW"
          FCB   $CC         ; Control Byte - Fill 12 spaces with next byte
          FCB   $60         ; Fill-Byte - ASCII $60, (Light Green)
          FCC   "2. EIGHT LAYER--FAST"
          FCB   $CC         ; Control Byte - Fill 12 spaces with next byte
          FCB   $60         ; Fill-Byte - ASCII $60, (Light Green)
          FCC   "3. TWELVE LAYER--SLOW"
          FCB   $CB         ; Control Byte - Fill 11 spaces with next byte
          FCB   $60         ; Fill-Byte - ASCII $60, (Light Green)
          FCC   "4. TWELVE LAYER--FAST"
          FCB   $CB         ; Control Byte - Fill 11 spaces with next byte
          FCB   $60         ; Fill-Byte - ASCII $60, (Light Green)
          FCB   $C8         ; Control Byte - Fill 8 spaces with next byte
          FCB   $EF         ; Fill-Byte - ASCII $EF, (Purple)
          FCC   " SHOOTING MATCH "
          FCB   $C8         ; Control Byte - Fill 8 spaces with next byte
          FCB   $EF         ; Fill-Byte - ASCII $EF, (Purple)
          FCC   "5. 5 BULLETS"
          FCB   $D4         ; Control Byte - Fill 20 spaces with next byte
          FCB   $60         ; Fill-Byte - ASCII $60, (Light Green)
          FCC   "6. 10 BULLETS"
          FCB   $D3         ; Control Byte - Fill 19 spaces with next byte
          FCB   $60         ; Fill-Byte - ASCII $60, (Light Green)
          FCC   "7. 20 BULLETS"
          FCB   $D3         ; Control Byte - Fill 19 spaces with next byte
          FCB   $60         ; Fill-Byte - ASCII $60, (Light Green)
          FCB   EOS         ; Control Byte - End of String

*  Control Bytes?
          FCB   $DE         ; Control Byte - Fill 31 spaces with next byte
          FCB   $C3         ; Fill-Byte - ASCII $C3
*                                        (Black on Top, White on Bottom)
          FCB   EOS         ; Control Byte - End of String

          FCB   $DE         ; Control Byte - Fill 31 spaces with next byte
          FCB   $CC         ; Fill-Byte - ASCII $CC
*                                        (White on Top, Black on Bottom)
          FCB   EOS         ; Control Byte - End of String

*  More Control Bytes ( I THINK it works like this...)
*  I need to check the WRITEAPF routine to be certain.
*  Left Boundary
          FCB   $0E         ; Control Byte - Fill Column with 14 of next byte 
          FCB   $80         ; Fill-Byte - ASCII $80 (Black)
          FCB   EOS         ; Control Byte - End of String

*  Right Boundary
          FCB   $01         ; Control Byte - Fill Column with 1 of next byte
          FCB   $C2         ; Fill-Byte - APF ASCII $C2 (Lower-Left is White)
          FCB   $0E         ; Control Byte - Fill Column with 14 of next byte
          FCB   $CA         ; Fill-Byte - APF ASCII $CA (Left is White)
          FCB   $01         ; Control Byte - Fill Column with 1 of next byte
          FCB   $C8         ; Fill-Byte - APF ASCII $C8 (Upper-Left is White)
          FCB   EOS         ; Control Byte - End of String

*  Number of Balls Left Message            
BALLS2GO  FCC   "BALLS TO GO " 
          FCB   EOS         ; Control Byte - End of String

*  Start "Shooting Match"
*  ----------------------

SHOOTMATC
*  Draw Bottom Row of "Shooting Match"
          LDX   #$8770
          STX   $0006
          LDX   #$03E0      ; Write in Lower-Left Corner
          JSR   WRITESTR    ; System ROM Routine - Write String

*  Zero-Out Memory Locations
          CLRA              ; Zero-Out Accumulator A
          STAA  $0033       ; Store Zero 
          STAA  $002D       ; Store Zero
          STAA  $0012       ; Store Zero
          STAA  $0013       ; Store Zero

*  Decide which version of "Shooting Match" was picked.
          LDAA  #6          ; Presume it is game 5, 5 Bullets
          LDAB  $0000       ; Which Version of "Shooting Match"  
          CMPB  #$01        ; Check for Game 5, 5 Bullets
          BEQ   L846D       ; Yes, it is Game 5       
          LDAA  #11         ; Presume it is game 6, 10 bullets
          CMPB  #$02        ; Check for Game 6, 10 Bullets
          BEQ   L846D       ; Yes, it is Game 6
          LDAA  #21         ; No, It's Game 7, 20 Bullets
L846D:
          STAA  $002A
          CLR   $0019
          JSR   L8646
          INC   $0019
          LDAA  $0026
          INCA
          STAA  $002A
          JSR   L8646
          
*  Draw Left Blue Border
          LDX   #$876D      ; Column of 15 Squares for Blue Border 
          STX   $01E6
          LDAA  #1          ; One Character in Row
          LDX   #$0200      ; Upper-Left Corner of Screen
          JSR   WRITEAPF    ; System ROM Routine - Write APF Logo

*  Draw Right Blue Border            
          LDX   #$876D      ; Column of 15 Squares for Blue Border
          STX   $01E6
          LDAA  #1          ; One Character in Row
          LDX   #$021F      ; Upper-Right Corner of Screen
          JSR   WRITEAPF    ; System ROM Routine - Write APF Logo
          
*  Draw Base on Left Side of Screen  
          LDX   #PLAYBASE   ; Player Base Graphic (Low-Res)
          STX   $01E6
          LDAA  #3          ; Three Characters in Row
          LDX   #$0367      ; Tip of Gun of Left Side of Screen
          JSR   WRITEAPF    ; System ROM Routine - Write APF Logo

*  Draw Base on Right Side of Screen          
          LDX   #PLAYBASE   ; Player Base Graphic (Low-Res)
          STX   $01E6
          LDAA  #3          ; Three Characters in Row
          LDX   #$0376      ; Tip of Gun of Right Side of Screen 
          JSR   WRITEAPF    ; System ROM Routine - Write APF Logo

*  Place Four Dark Blue Squares on Second to Bottom Row          
          LDX   #$03C0      ; Set-up Base for X 
          LDAA  #$AF        ; APF ASCII $AF, (Dark Blue)
          STAA  $01,X       ; Store Dark Blue at $03C1 
          STAA  $0F,X       ; Store Dark Blue at $03CF
          STAA  $10,X       ; Store Dark Blue at $03D0
          STAA  $1E,X       ; Store Dark Blue at $03DE 

*  
          LDAB  $0000       ; Load Version of "Shooting Match"
          CMPB  #$02        ; Is it Game 6? (10 Bullets)
          BNE   L84CF       ; NO: Not Game 6, so Branch  
          STAA  $3E,X       ; Store Dark Blue at $03FE
          STAA  $3F,X       ; Store Dark Blue at $03FE
L84CF:
*  Draw Center Border between two players
          LDX   #$8785      ;       
          STX   $01E6
          LDAA  #$02        ; Two Characters Wide
          LDX   #$020F      ; About the Center of the screen
          JSR   WRITEAPF    ; System ROM Routine - Write APF Logo

*  Place a $02 into Memory Locations          
          LDAA  #$02        ; Place a $02 into Accum A
          STAA  $0035       ; Store $02
          STAA  $0036       ; Store $02
          STAA  $0037       ; Store $02
          STAA  $0038       ; Store $02
          
*  Zero-Out Memory Locations
          CLRA              ; Zero-Out Accumulator A
          STAA  $0045       ; Store Zero
          STAA  $0046       ; Store Zero
          STAA  $0048       ; Store Zero
          STAA  $0049       ; Store Zero
          
          LDX   #$0221      
          STX   $0039
          LDX   #$023D
          STX   $003B
          LDX   #$8789
          STX   $003F
          STX   $0041
          JMP   L8694

L8504:
          TST   $0014
          BEQ   L8521
          JSR   RIGHTPAD    ; System ROM Routine - Get Input from Rightpad Controller
          BCC   L8521
L850E:
          LDX   #$0235
          STX   $001C
          LDAA  $0027
          STAA  $002A
          LDAA  $002C
          STAA  $002D
          INC   $0019
          JSR   L854C
L8521:
          JSR   LEFTPAD     ; System ROM Routine - Get Input from Leftpad Controller
          BCC   L8539
          LDX   #$0226
          STX   $001C
          LDAA  $0026
          STAA  $002A
          LDAA  $002B
          STAA  $002D
          CLR   $0019
          JSR   L854C
L8539:
          TST   $0014
          BEQ   L8542
          CLR   $0014
L8541:
          RTS

L8542:
          INC   $0014
          JSR   RIGHTPAD    ; System ROM Routine - Get Input from Rightpad Controller
          BCC   L8541
          BRA   L850E

L854C:
          LDAA  JOYDATA     ; Joystick Data (Button or Direction Pushed)
          LDAA  JOYDATA     ; Joystick Data (Button or Direction Pushed)
          CMPA  #$21        ; Was Fire Button Pressed?
          BNE   L8559       ; No: Fire Button NOT Pressed 
          JMP   L855A       ; Yes: Fire Button Pressed
L8559:
          RTS

*  Fire Button was pressed
L855A:
          LDAA  $0000
          CMPA  #$01
          BEQ   L856B
          TST   $0033
          BNE   L856B
          INC   $0033
          CLR   $01F9
L856B:
          LDAA  $0033
          CMPA  #$02
          BEQ   L85A8
          TST   $002A
          BEQ   L85A8
          LDAB  #$5D
          JSR   NOISE       ; System ROM Routine - Make a Noise
          LDX   $001C
          LDAA  #$40
          JSR   $411D       ; System ROM Routine - Part of WRITEAPF
          LDAA  #$F5
          STAA  $01,X
          STAA  $21,X
          STAA  $41,X
          STX   $002E
          STX   $0031
          STAA  $0030
          LDX   $001C
          STX   $01EE
          LDAA  $01,X
          STAA  $01EA
          LDAB  $0030
          STAB  $01,X
          CMPA  #$80
          BEQ   L85A9
          CMPA  $0030
          BEQ   L85A9
          BRA   L85C2
L85A8:
          RTS

L85A9:
          WAI
          WAI
          LDAA  $01EA
          LDX   $01EE
          STAA  $01,X
          LDAA  #$80
          LDX   $002E
          STAA  $01,X
          STAA  $21,X
          STAA  $41,X
          JSR   L8646
          BRA   L85A8

L85C2:
          LDAB  $0030
          ANDB  #$0F
          STAB  $01EB
          ANDA  $01EB
          TSTA
          BEQ   L85A9
          LDAA  $01EA
          ANDA  #$F0
          LDAB  $002D
          INCB
          INCB
          CMPA  #$80
          BEQ   L85F0
          INCB
          INCB
          CMPA  #$E0
          BEQ   L85F0
          INCB
          INCB
          CMPA  #$A0
          BEQ   L85F0
          INCB
          INCB
          CMPA  #$B0
          BEQ   L85F0
          INCB
          INCB
L85F0:
          STAB  $002D
          LDAB  #$7F
          JSR   NOISE       ; System ROM Routine - Make a Noise
          WAI
          LDX   $002E
          LDAA  #$80
          STAA  $01,X
          STAA  $21,X
          STAA  $41,X
          BSR   L8646
          TST   $0019
          BEQ   L860F
          LDX   $0041
          LDAB  $0036
          BRA   L8613

L860F:
          LDX   $003F
          LDAB  $0035
L8613:
          CPX   #$87D1
          BEQ   L8638
          LDAA  #$12
          JSR   $411D       ; System ROM Routine - Part of WRITEAPF
          CPX   #$87AD
          BNE   L863E
          DECB
L8623:
          TST   $0019
          BEQ   L8630
          STX   $0041
          STAB  $0036
          CLR   $0038
          RTS

L8630:
          STX   $003F
          STAB  $0035
          CLR   $0037
          RTS

L8638:
          CLRB
          LDX   #$87E3
          BRA   L8623

L863E:
          CPX   #$87D1
          BNE   L8623
          DECB
          BRA   L8623

L8646:
          LDAA  $002A
          DECA
          TST   $0019
          BEQ   L8656
          STAA  $0027
          LDAB  $002D
          STAB  $002C
          BRA   L865C

L8656:
          STAA  $0026
          LDAB  $002D
          STAB  $002B
L865C:
          LDX   #$03E0
          LDAA  $0026
          BSR   L8681
          LDX   #$03FE
          LDAA  $0027
          BSR   L8681
          LDX   #$03E7
          LDAA  $002B
          BSR   L8681
          LDX   #$03F6
          LDAA  $002C
          BSR   L8681
          LDAA  #$70
          STAA  $03E9
          STAA  $03F8
          RTS

L8681:
          LDAB  #$70
          STAB  $00,X
L8685:
          CMPA  #$09
          BLS   L868F
          SUBA  #$0A
          INC   $00,X
          BRA   L8685

L868F:
          ORAA  #$70
          STAA  $01,X
          RTS

L8694:
          WAI
          JSR   L86A0
          JSR   L8746
          JSR   L8504
          BRA   L8694

L86A0:
          LDAA  $0037
          CMPA  $0035
          BNE   L86C2
          CLR   $0037
          LDX   $003F
          STX   $0043
          LDX   $0039
          STX   $003D
          LDAA  $0045
          STAA  $0047
          LDAB  $0048
          STAB  $004A
          BSR   L86C6
          STX   $0039
          STAA  $0045
          STAB  $0048
          RTS

L86C2:
          INC   $0037
          RTS

L86C6:
          LDX   #$87EC
          STX   $01E6
          LDAA  #$03
          TST   $0047
          BNE   L86DB
          LDX   #$87E3
          STX   $01E6
          LDAA  #$02
L86DB:
          LDX   $003D
          JSR   WRITEAPF    ; System ROM Routine - Write APF Logo
          LDX   $003D
          LDAA  $0047
          TSTA
          BNE   L8704
          CPX   #$0221
          BEQ   L86F1
          CPX   #$0231
          BNE   L86F7
L86F1:
          LDAB  #$01
          STAB  $004A
          BRA   L8704

L86F7:
          CPX   #$022D
          BEQ   L8701
          CPX   #$023D
          BNE   L8704
L8701:
          CLR   $004A
L8704:
          TST   $0047
          BNE   L8711
          TST   $004A
          BNE   L8717
          DEX
          BRA   L8717

L8711:
          TST   $004A
          BEQ   L8717
          INX
L8717:
          STX   $003D
          TSTA
          BEQ   L8721
          CLR   $0047
          BRA   L872D

L8721:
          INC   $0047
          LDX   $0043
          LDAA  #$09
          JSR   $411D       ; System ROM Routine - Part of WRITEAPF
          STX   $0043
L872D:
          LDX   $0043
          STX   $01E6
          LDAA  #$03
          TST   $0047
          BNE   L873A
          DECA
L873A:
          LDX   $003D
          JSR   WRITEAPF    ; System ROM Routine - Write APF Logo
          LDX   $003D
          LDAA  $0047
          LDAB  $004A
          RTS

L8746:
          LDAA  $0038
          CMPA  $0036
          BNE   L8769
          CLR   $0038
          LDX   $0041
          STX   $0043
          LDX   $003B
          STX   $003D
          LDAA  $0046
          STAA  $0047
          LDAB  $0049
          STAB  $004A
          JSR   L86C6
          STX   $003B
          STAA  $0046
          STAB  $0049
          RTS

L8769:
          INC   $0038
          RTS

*  Control and Fill Bytes for Write Routines

*  Column of 15 Squares for Blue Border "Shooting Match" 
          FCB   $0F         ; Control Byte - Fill Column with 15 of next byte
          FCB   $AF         ; Fill-Byte - APF ASCII $60, (Dark Blue)
          FCB   EOS         ; Control Byte - End of String

*  Bottom Row of "Shooting Match"          
          FCB   $DE         ; Control Byte - Fill 30 locations with next byte      
          FCB   $AF         ; Fill-Byte - APF ASCII $60, (Dark Blue)
          FCB   EOS         ; Control Byte - End of String

*  Player Base - 3 rows x 4 columns
*  
*  The Player looks KINDA like this (not to scale):
*  
*     #
*     #
*     #
*    ###
*    # #
*    ###
*   #####
*   ## ##
    
PLAYBASE  FCB   $02         ; Control Byte - Fill two rows of three with this:
          FCB   $80         ; Fill-Byte - APF ASCII $80 (Black)
          FCB   $EA         ; Fill-Byte - APF ASCII $EA (Left Purple/Right Black)
          FCB   $80         ; Fill-Byte - APF ASCII $80 (Black)
          FCB   $01         ; Control Byte - Fill One row of three with this: 
          FCB   $E5         ; Fill-Byte - APF ASCII $E5 (Left Black/Right Purple)
          FCB   $ED         ; Fill-Byte - APF ASCII $ED (Purple with Black Hole)
          FCB   $80         ; Fill-Byte - APF ASCII $80 (Black)
          FCB   $01         ; Control Byte - Fill One row of three with this:
          FCB   $EF         ; Fill-Byte - APF ASCII $EF (Left Black/Right Purple)
          FCB   $ED         ; Fill-Byte - APF ASCII $ED (Purple with Black Hole)
          FCB   $EA         ; Fill-Byte - APF ASCII $EA (Left Purple/Right Black)
          FCB   EOS         ; Control Byte - End of String          
          
          FCB   $04         ; Control Byte - Fill four rows of three with this:
          FCB   $80         ; Fill-Byte - APF ASCII $80 (Black)
          FCB   $80         ; Fill-Byte - APF ASCII $80 (Black)
          FCB   $80         ; Fill-Byte - APF ASCII $80 (Black)
          FCB   EOS         ; Control Byte - End of String
          
*  Center Border between two players
          FCB   $0E         ; Control Byte - Fill 14 rows of 2 with this: 
          FCB   $AF         ; Fill-Byte - APF ASCII $AF (Dark Blue)
          FCB   $AF         ; Fill-Byte - APF ASCII $AF (Dark Blue)
          FCB   EOS         ; Control Byte - End of String
          
*  Green Target  
          FCB   $01         ; Control Byte - Fill 1 row of 2 chars with this:
          FCB   $8F         ; Fill-Byte - APF ASCII $8F (Green)
          FCB   $8F         ; Fill-Byte - APF ASCII $8F (Green)
          FCB   $01         ; Control Byte - Fill 1 row of 2 chars with this:
          FCB   $8F         ; Fill-Byte - APF ASCII $8F (Green)
          FCB   $8F         ; Fill-Byte - APF ASCII $8F (Green)
          FCB   EOS         ; Control Byte - End of String
          
          FCB   $00
          FCB   $00, $01, $85, $8F
          FCB   $8A, $01, $85, $8F
          FCB   $8A, $FF, $01, $EF
          FCB   $EA, $01, $EC, $E8
          FCB   $FF, $00, $00, $01
          FCB   $E5, $EF, $80, $01
          FCB   $E4, $EC, $80, $FF
          FCB   $01, $AF, $AA, $01
          FCB   $AC, $A8, $FF, $00
          FCB   $00, $01, $A5, $AF
          FCB   $80, $01, $A4, $AC
          FCB   $80, $FF, $01, $BF
          FCB   $80, $01, $80, $80
          FCB   $FF, $00, $00, $01
          FCB   $B5, $BA, $80, $01
          FCB   $80, $80, $80, $FF
          FCB   $01, $CF, $80, $01
          FCB   $80, $80, $FF, $00
          FCB   $00, $01, $C5, $CA
          FCB   $80, $01, $80, $80
          FCB   $80, $FF
          
*
          FCB   $02         ; Control Byte - Fill two rows of two with this:
          FCB   $80         ; Fill-Byte - APF ASCII $80 (Black)
          FCB   $80         ; Fill-Byte - APF ASCII $80 (Black)
          FCB   EOS         ; Control Byte - End of String

          FCB   $00, $00, $00, $00, $00

*
          FCB   $02         ; Control Byte - Fill two rows of three with this:
          FCB   $80         ; Fill-Byte - APF ASCII $80 (Black)
          FCB   $80         ; Fill-Byte - APF ASCII $80 (Black)
          FCB   $80         ; Fill-Byte - APF ASCII $80 (Black)
          FCB   EOS         ; Control Byte - End of String

          FCB   $00, $00, $00, $00
          FCB   $00, $00, $00, $4D
          FCB   $4D, $4D, $4D, $4D
          FCB   $4D, $4D, $4D
