* 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