diff --git a/projects/GB-001 Game Board/software/common/CH06-Spinner/game.asm b/projects/GB-001 Game Board/software/common/CH06-Spinner/game.asm index e89e400..dfb7218 100644 --- a/projects/GB-001 Game Board/software/common/CH06-Spinner/game.asm +++ b/projects/GB-001 Game Board/software/common/CH06-Spinner/game.asm @@ -7,15 +7,14 @@ ; ; I/O: ; -DDR1A .EQ VIA1+3 ; PORT A DATA DIRECTION REGISTER -DDR1B .EQ VIA1+2 ; PORT B DATA DIRECTION REGISTER -PORT1A .EQ VIA1+1 ; PORT A -PORT2 .EQ VIA1 PORT1B .EQ VIA1 ; PORT B -DDR3A .EQ VIA3+3 ; PORT A DATA DIRECTION REGISTER -DDR3B .EQ VIA3+2 ; PORT B DATA DIRECTION REGISTER +PORT1A .EQ VIA1+1 ; PORT A +DDR1B .EQ VIA1+2 ; PORT B DATA DIRECTION REGISTER +DDR1A .EQ VIA1+3 ; PORT A DATA DIRECTION REGISTER PORT3B .EQ VIA3 ; PORT B PORT3A .EQ VIA3+1 ; PORT A +DDR3B .EQ VIA3+2 ; PORT B DATA DIRECTION REGISTER +DDR3A .EQ VIA3+3 ; PORT A DATA DIRECTION REGISTER ; ; VARIABLE STORAGE. ; diff --git a/projects/GB-001 Game Board/software/common/CH06-Spinner/spinner.list b/projects/GB-001 Game Board/software/common/CH06-Spinner/spinner.list index e52ec47..f678f3d 100644 --- a/projects/GB-001 Game Board/software/common/CH06-Spinner/spinner.list +++ b/projects/GB-001 Game Board/software/common/CH06-Spinner/spinner.list @@ -1,15 +1,16 @@ 0000- 4 ; -0000- 5 ; HEX GUESSING GAME USING '6502 GAMES' HARDWARE. BOARD SHOULD BE JUMPERED WITH -0000- 6 ; VIA CHIPS AT THE ADDRESSES SPECIFIED BELOW. OTHER THAN THAT THE CODE IS SHOULD -0000- 7 ; BE UNCHANGED FROM THE BOOK THOUGH THERE WILL BE SOME DIFFERENCES DUE TO -0000- 8 ; ASSEMBLER USED. -0000- 9 ; -C000- 10 VIA1 .EQ $C000 -CC00- 11 VIA3 .EQ $CC00 -0000- 12 -0200- 13 .OR $0200 -0200- 14 .TA $0200 -0200- 15 BEGIN .IN game.asm +0000- 5 ; SPINNER IS A REACTION TIMING GAME USING '6502 GAMES' HARDWARE, AN LED CHASES +0000- 6 ; AROUND THE LED CUBE AND YOU SHOULD TRY TO HIT THE CORRESPONDING BUTTON. +0000- 7 ; BOARD SHOULD ; BE JUMPERED WITH VIA CHIPS AT THE ADDRESSES SPECIFIED BELOW. +0000- 8 ; OTHER THAN THAT THE CODE IS SHOULD BE UNCHANGED FROM THE BOOK THOUGH THERE +0000- 9 ; WILL BE SOME DIFFERENCES DUE TO ASSEMBLER USED. +0000- 10 ; +C000- 11 VIA1 .EQ $C000 +CC00- 12 VIA3 .EQ $CC00 +0000- 13 +0200- 14 .OR $0200 +0200- 15 .TA $0200 +0200- 16 BEGIN .IN game.asm 0200- I 1 ; 'SPINNER' 0200- I 2 ; PROGRAM TO TEST REACTION TIME OF PLAYER. BLIP OF LIGHT SPINS AROUND EDGE OF 0200- I 3 ; 3X3 LED MATRIX, AND USER MUST PRESS CORRESPONDING KEY. IF, AFTER A NUMBER OF @@ -19,112 +20,111 @@ CC00- 11 VIA3 .EQ $CC00 0200- I 7 ; 0200- I 8 ; I/O: 0200- I 9 ; -C003- I 10 DDR1A .EQ VIA1+3 ; PORT A DATA DIRECTION REGISTER -C002- I 11 DDR1B .EQ VIA1+2 ; PORT B DATA DIRECTION REGISTER -C001- I 12 PORT1A .EQ VIA1+1 ; PORT A -C000- I 13 PORT2 .EQ VIA1 -C000- I 14 PORT1B .EQ VIA1 ; PORT B -CC03- I 15 DDR3A .EQ VIA3+3 ; PORT A DATA DIRECTION REGISTER +C000- I 10 PORT1B .EQ VIA1 ; PORT B +C001- I 11 PORT1A .EQ VIA1+1 ; PORT A +C002- I 12 DDR1B .EQ VIA1+2 ; PORT B DATA DIRECTION REGISTER +C003- I 13 DDR1A .EQ VIA1+3 ; PORT A DATA DIRECTION REGISTER +CC00- I 14 PORT3B .EQ VIA3 ; PORT B +CC01- I 15 PORT3A .EQ VIA3+1 ; PORT A CC02- I 16 DDR3B .EQ VIA3+2 ; PORT B DATA DIRECTION REGISTER -CC00- I 17 PORT3B .EQ VIA3 ; PORT B -CC01- I 18 PORT3A .EQ VIA3+1 ; PORT A -0200- I 19 ; -0200- I 20 ; VARIABLE STORAGE. -0200- I 21 ; -0000- I 22 ZP .EQ $00 -0000- I 23 DURAT .EQ ZP ; DURATION OF INTER-MOVEMENT DELAY. -0001- I 24 DIFCLT .EQ ZP+1 ; DIFFICULTY LEVEL. -0002- I 25 DNTST .EQ ZP+2 ; SET TO $01 IF KEY DOWN AT START OF -0200- I 26 ; INTER-MOVEMENT DELAY. -0200- I 27 ; -0200- I 28 ; MAIN PROGRAM -0200- I 29 ; -0200-A9 FF I 30 ( 2) START LDA #$FF ; SET I/O REGISTERS. -0202-8D 03 C0 I 31 ( 4) STA DDR1A -0205-8D 02 C0 I 32 ( 4) STA DDR1B -0208-8D 02 CC I 33 ( 4) STA DDR3B -020B-A9 08 I 34 ( 2) LDA #8 -020D-85 01 I 35 ( 2) STA DIFCLT ; SET DIFFICULTY -020F-8D 03 CC I 36 ( 4) STA DDR3A ; SET KEYSTROBE PORT. -0212-A0 00 I 37 ( 2) NWGME LDY #0 ; RESET LOOP/BLIP COUNTER. -0214-A9 00 I 38 ( 2) LOOP LDA #0 -0216-85 02 I 39 ( 2) STA DNTST ; CLEAR KEYDOWN INDICATOR. -0218-8D 00 C0 I 40 ( 4) STA PORT1B ; CLEAR HI LED PORT. -021B-98 I 41 ( 2) TYA ; USE LOWER 3 BITS OF MAIN COUNTER -021C-29 07 I 42 ( 2) AND #$07 ; AS INDEX TO FIND LED PATTERN -021E-AA I 43 ( 2) TAX ; IN TABLE OF PATTERNS. -021F-BD 95 02 I 44 ( 4*) LDA LTABLE,X ; GET PATTERN FOR LED TO BE TURNED ON -0222-8D 01 C0 I 45 ( 4) STA PORT1A ; STORE IN LED PORT. -0225-D0 05 I 46 (2**) BNE CHECK ; IF PATTERN <> 0, SKIP. -0227-A9 01 I 47 ( 2) LDA #1 ; PATTERN=0, SO SET HI BIT. -0229-8D 00 C0 I 48 ( 4) STA PORT1B -022C-BD 9D 02 I 49 ( 4*) CHECK LDA KYTBL,X ; GET KEY# TO TEST FOR. -022F-8D 00 CC I 50 ( 4) STA PORT3B ; STORE IN KEYPORT -0232-2C 01 CC I 51 ( 4) BIT PORT3A ; STROBE HI? -0235-30 04 I 52 (2**) BMI DELAY ; IF NOT, SKIP. -0237-A9 01 I 53 ( 2) INVALD LDA #01 ; STROBE HI; SET KEY DOWN MARKER. -0239-85 02 I 54 ( 2) STA DNTST -023B-A9 80 I 55 ( 2) DELAY LDA #$80 ; GET # OF LOOP CYCLES (DELAY LENGTH) -023D-85 00 I 56 ( 2) STA DURAT -023F-A5 01 I 57 ( 3) DL1 LDA DIFCLT ; MULTIPLY DIFFICULTY COUNTER -0241-0A I 58 ( 2) ASL A ; BY FOUR TO DETERMINE DELAY -0242-0A I 59 ( 2) ASL A ; LENGTH. -0243-AA I 60 ( 2) TAX -0244-26 02 I 61 ( 5) DL2 ROL DNTST ; DELAY ACCORDING TO DIFCLT. -0246-66 02 I 62 ( 5) ROR DNTST -0248-CA I 63 ( 2) DEX -0249-D0 F9 I 64 (2**) BNE DL2 ; LOOP UNTIL COUNT = 0 -024B-A5 02 I 65 ( 3) LDA DNTST ; GET KEY DOWN FLAG. -024D-D0 05 I 66 (2**) BNE NOTST ; IF KEY WAS DOWN AT BEGINNING OF -024F- I 67 ; DELAY, DON'T TEST IT. -024F-2C 01 CC I 68 ( 4) BIT PORT3A ; CHECK KEY STROBE -0252-10 19 I 69 (2**) BPL HIT ; KEY HAS CLOSED DURING DELAY: HIT. -0254-C6 00 I 70 ( 5) NOTST DEC DURAT ; COUNT DELAY LOOP DOWN. -0256-D0 E7 I 71 (2**) BNE DL1 ; LOOP IF NOT 0. -0258-C8 I 72 ( 2) INY ; INCREMENT MAIN SPIN COUNTER. -0259-D0 B9 I 73 (2**) BNE LOOP ; IF 32 LOOPS NOT DONE, DO NEXT LOOP EASIER -025B-A6 01 I 74 ( 3) LDX DIFCLT ; NO HITS THIS TIME, MAKE NEXT EASIER. -025D-E8 I 75 ( 2) INX -025E-8A I 76 ( 2) TXA ; MAKE SURE DIFFICULTY DOES NOT -025F-C9 10 I 77 ( 2) CMP #16 ; EXCEED 15. -0261-D0 02 I 78 (2**) BNE OK -0263-A9 0F I 79 ( 2) LDA #15 -0265-85 01 I 80 ( 2) OK STA DIFCLT -0267-20 82 02 I 81 ( 6) JSR WAIT ; PAUSE A BIT -026A-4C 12 02 I 82 ( 3) JMP NWGME ; START NEW ROUND. -026D-20 82 02 I 83 ( 6) HIT JSR WAIT ; PAUSE A BIT. -0270-C6 01 I 84 ( 5) DEC DIFCLT ; MAKE NEXT GAME HARDER. -0272-D0 9E I 85 (2**) BNE NWGME ; IF DIFFICULTY NOT 0 (HARDEST), PLAY NEXT GAME. -0274-A9 FF I 86 ( 2) LDA #$FF ; PLAYER HAS MADE IT TO TOP -0276-8D 01 C0 I 87 ( 4) STA PORT1A ; DIFFICULTY LEVEL, LIGHT ALL LEDS. -0279-8D 00 C0 I 88 ( 4) STA PORT1B -027C-20 82 02 I 89 ( 6) JSR WAIT ; PAUSE A BIT. -027F-4C 00 02 I 90 ( 3) JMP START ; PLAY ANOTHER GAME. -0282- I 91 ; -0282- I 92 ; SUBROUTINE 'WAIT' -0282- I 93 ; SHORT DELAY. -0282- I 94 ; -0282-A0 FF I 95 ( 2) WAIT LDY #$FF -0284-A2 FF I 96 ( 2) LP1 LDX #$FF -0286-66 00 I 97 ( 5) LP2 ROR DURAT -0288-26 00 I 98 ( 5) ROL DURAT -028A-66 00 I 99 ( 5) ROR DURAT -028C-26 00 I 100 ( 5) ROL DURAT -028E-CA I 101 ( 2) DEX -028F-D0 F5 I 102 (2**) BNE LP2 -0291-88 I 103 ( 2) DEY -0292-D0 F0 I 104 (2**) BNE LP1 -0294-60 I 105 ( 6) RTS -0295- I 106 ; -0295- I 107 ; TABLE OF PATTERNS TO BE SENT TO LED MATRIX AT EACH LOOP COUNTM SET FOR -0295- I 108 ; CLOCKWISE ROTATION STARTING AT LED #1. -0295- I 109 ; +CC03- I 17 DDR3A .EQ VIA3+3 ; PORT A DATA DIRECTION REGISTER +0200- I 18 ; +0200- I 19 ; VARIABLE STORAGE. +0200- I 20 ; +0000- I 21 ZP .EQ $00 +0000- I 22 DURAT .EQ ZP ; DURATION OF INTER-MOVEMENT DELAY. +0001- I 23 DIFCLT .EQ ZP+1 ; DIFFICULTY LEVEL. +0002- I 24 DNTST .EQ ZP+2 ; SET TO $01 IF KEY DOWN AT START OF +0200- I 25 ; INTER-MOVEMENT DELAY. +0200- I 26 ; +0200- I 27 ; MAIN PROGRAM +0200- I 28 ; +0200-A9 FF I 29 ( 2) START LDA #$FF ; SET I/O REGISTERS. +0202-8D 03 C0 I 30 ( 4) STA DDR1A +0205-8D 02 C0 I 31 ( 4) STA DDR1B +0208-8D 02 CC I 32 ( 4) STA DDR3B +020B-A9 08 I 33 ( 2) LDA #8 +020D-85 01 I 34 ( 2) STA DIFCLT ; SET DIFFICULTY +020F-8D 03 CC I 35 ( 4) STA DDR3A ; SET KEYSTROBE PORT. +0212-A0 00 I 36 ( 2) NWGME LDY #0 ; RESET LOOP/BLIP COUNTER. +0214-A9 00 I 37 ( 2) LOOP LDA #0 +0216-85 02 I 38 ( 2) STA DNTST ; CLEAR KEYDOWN INDICATOR. +0218-8D 00 C0 I 39 ( 4) STA PORT1B ; CLEAR HI LED PORT. +021B-98 I 40 ( 2) TYA ; USE LOWER 3 BITS OF MAIN COUNTER +021C-29 07 I 41 ( 2) AND #$07 ; AS INDEX TO FIND LED PATTERN +021E-AA I 42 ( 2) TAX ; IN TABLE OF PATTERNS. +021F-BD 95 02 I 43 ( 4*) LDA LTABLE,X ; GET PATTERN FOR LED TO BE TURNED ON +0222-8D 01 C0 I 44 ( 4) STA PORT1A ; STORE IN LED PORT. +0225-D0 05 I 45 (2**) BNE CHECK ; IF PATTERN <> 0, SKIP. +0227-A9 01 I 46 ( 2) LDA #1 ; PATTERN=0, SO SET HI BIT. +0229-8D 00 C0 I 47 ( 4) STA PORT1B +022C-BD 9D 02 I 48 ( 4*) CHECK LDA KYTBL,X ; GET KEY# TO TEST FOR. +022F-8D 00 CC I 49 ( 4) STA PORT3B ; STORE IN KEYPORT +0232-2C 01 CC I 50 ( 4) BIT PORT3A ; STROBE HI? +0235-30 04 I 51 (2**) BMI DELAY ; IF NOT, SKIP. +0237-A9 01 I 52 ( 2) INVALD LDA #01 ; STROBE HI; SET KEY DOWN MARKER. +0239-85 02 I 53 ( 2) STA DNTST +023B-A9 80 I 54 ( 2) DELAY LDA #$80 ; GET # OF LOOP CYCLES (DELAY LENGTH) +023D-85 00 I 55 ( 2) STA DURAT +023F-A5 01 I 56 ( 3) DL1 LDA DIFCLT ; MULTIPLY DIFFICULTY COUNTER +0241-0A I 57 ( 2) ASL A ; BY FOUR TO DETERMINE DELAY +0242-0A I 58 ( 2) ASL A ; LENGTH. +0243-AA I 59 ( 2) TAX +0244-26 02 I 60 ( 5) DL2 ROL DNTST ; DELAY ACCORDING TO DIFCLT. +0246-66 02 I 61 ( 5) ROR DNTST +0248-CA I 62 ( 2) DEX +0249-D0 F9 I 63 (2**) BNE DL2 ; LOOP UNTIL COUNT = 0 +024B-A5 02 I 64 ( 3) LDA DNTST ; GET KEY DOWN FLAG. +024D-D0 05 I 65 (2**) BNE NOTST ; IF KEY WAS DOWN AT BEGINNING OF +024F- I 66 ; DELAY, DON'T TEST IT. +024F-2C 01 CC I 67 ( 4) BIT PORT3A ; CHECK KEY STROBE +0252-10 19 I 68 (2**) BPL HIT ; KEY HAS CLOSED DURING DELAY: HIT. +0254-C6 00 I 69 ( 5) NOTST DEC DURAT ; COUNT DELAY LOOP DOWN. +0256-D0 E7 I 70 (2**) BNE DL1 ; LOOP IF NOT 0. +0258-C8 I 71 ( 2) INY ; INCREMENT MAIN SPIN COUNTER. +0259-D0 B9 I 72 (2**) BNE LOOP ; IF 32 LOOPS NOT DONE, DO NEXT LOOP EASIER +025B-A6 01 I 73 ( 3) LDX DIFCLT ; NO HITS THIS TIME, MAKE NEXT EASIER. +025D-E8 I 74 ( 2) INX +025E-8A I 75 ( 2) TXA ; MAKE SURE DIFFICULTY DOES NOT +025F-C9 10 I 76 ( 2) CMP #16 ; EXCEED 15. +0261-D0 02 I 77 (2**) BNE OK +0263-A9 0F I 78 ( 2) LDA #15 +0265-85 01 I 79 ( 2) OK STA DIFCLT +0267-20 82 02 I 80 ( 6) JSR WAIT ; PAUSE A BIT +026A-4C 12 02 I 81 ( 3) JMP NWGME ; START NEW ROUND. +026D-20 82 02 I 82 ( 6) HIT JSR WAIT ; PAUSE A BIT. +0270-C6 01 I 83 ( 5) DEC DIFCLT ; MAKE NEXT GAME HARDER. +0272-D0 9E I 84 (2**) BNE NWGME ; IF DIFFICULTY NOT 0 (HARDEST), PLAY NEXT GAME. +0274-A9 FF I 85 ( 2) LDA #$FF ; PLAYER HAS MADE IT TO TOP +0276-8D 01 C0 I 86 ( 4) STA PORT1A ; DIFFICULTY LEVEL, LIGHT ALL LEDS. +0279-8D 00 C0 I 87 ( 4) STA PORT1B +027C-20 82 02 I 88 ( 6) JSR WAIT ; PAUSE A BIT. +027F-4C 00 02 I 89 ( 3) JMP START ; PLAY ANOTHER GAME. +0282- I 90 ; +0282- I 91 ; SUBROUTINE 'WAIT' +0282- I 92 ; SHORT DELAY. +0282- I 93 ; +0282-A0 FF I 94 ( 2) WAIT LDY #$FF +0284-A2 FF I 95 ( 2) LP1 LDX #$FF +0286-66 00 I 96 ( 5) LP2 ROR DURAT +0288-26 00 I 97 ( 5) ROL DURAT +028A-66 00 I 98 ( 5) ROR DURAT +028C-26 00 I 99 ( 5) ROL DURAT +028E-CA I 100 ( 2) DEX +028F-D0 F5 I 101 (2**) BNE LP2 +0291-88 I 102 ( 2) DEY +0292-D0 F0 I 103 (2**) BNE LP1 +0294-60 I 104 ( 6) RTS +0295- I 105 ; +0295- I 106 ; TABLE OF PATTERNS TO BE SENT TO LED MATRIX AT EACH LOOP COUNTM SET FOR +0295- I 107 ; CLOCKWISE ROTATION STARTING AT LED #1. +0295- I 108 ; 0295-01 02 04 20 - 00 80 40 08 I 110 LTABLE .HS 01.02.04.20.00.80.40.08 -029D- I 111 -029D- I 112 ; -029D- I 113 ; TABLE OF PATTERNS TO BE SENT TO KEYBOARD TO TEST IF LEDS ARE ON AT EACH -029D- I 114 ; LOOP COUNT. -029D- I 115 ; + 00 80 40 08 I 109 LTABLE .HS 01.02.04.20.00.80.40.08 +029D- I 110 +029D- I 111 ; +029D- I 112 ; TABLE OF PATTERNS TO BE SENT TO KEYBOARD TO TEST IF LEDS ARE ON AT EACH +029D- I 113 ; LOOP COUNT. +029D- I 114 ; 029D-01 02 03 06 - 09 08 07 04 I 116 KYTBL .HS 01.02.03.06.09.08.07.04 + 09 08 07 04 I 115 KYTBL .HS 01.02.03.06.09.08.07.04 diff --git a/projects/GB-001 Game Board/software/common/CH07-SlotMachine/assemble.bat b/projects/GB-001 Game Board/software/common/CH07-SlotMachine/assemble.bat new file mode 100644 index 0000000..0847eff --- /dev/null +++ b/projects/GB-001 Game Board/software/common/CH07-SlotMachine/assemble.bat @@ -0,0 +1,4 @@ +@echo off +sbasm.py slot_machine.asm +type slot_machine.list +pause \ No newline at end of file diff --git a/projects/GB-001 Game Board/software/common/CH07-SlotMachine/game.asm b/projects/GB-001 Game Board/software/common/CH07-SlotMachine/game.asm new file mode 100644 index 0000000..68d4b3c --- /dev/null +++ b/projects/GB-001 Game Board/software/common/CH07-SlotMachine/game.asm @@ -0,0 +1,307 @@ +; 'SLOT MACHINE' +; SLOT MACHINE SIMULATOR PROGRAM, PRESS ANY KEY TO START 'SPIN'. SCORE +; DETERMINED BY ARRAY 'SCORTB'. 8 POINTS INITIAL SCORE, ONE POINT PENALTY +; FOR EACH BAD SPIN. + +; +; I/O: +; +PORT1B .EQ VIA1 ; PORT B +PORT1A .EQ VIA1+1 ; PORT A +DDR1B .EQ VIA1+2 ; PORT B DATA DIRECTION REGISTER +DDR1A .EQ VIA1+3 ; PORT A DATA DIRECTION REGISTER +T1CL .EQ VIA1+4 + +PORT3B .EQ VIA3 ; PORT B +PORT3A .EQ VIA3+1 ; PORT A +DDR3B .EQ VIA3+2 ; PORT B DATA DIRECTION REGISTER +DDR3A .EQ VIA3+3 ; PORT A DATA DIRECTION REGISTER + +; +; VARIABLE STORAGE. +; +ZP .EQ $00 +TEMP .EQ ZP ; TEMPORARY STORAGE. +SCORTP .EQ ZP+1 ; TEMPORARY SCORE STORAGE +SCORE .EQ ZP+2 ; SCORE. +DUR .EQ ZP+3 ; DURATION OF TONES. +FREQ .EQ ZP+4 +SPEEDS .EQ ZP+5 ; SPEEDS OF REVOLUTION FOR LEDS IN COLUMNS +INDX .EQ ZP+8 ; DELAY COUNTERS FOR LED REVOLUTIONS. +INCR .EQ ZP+11 ; POINTERS FOR LED POSITIONS: + ; USED TO FETCH PATTERNS OUT OF TABLES. +LTMSK .EQ ZP+14 ; PATTERNS FOR LIT LEDS +VALUES .EQ ZP+17 ; NUMBER OF LIT LEDS IN EACH ROW. +RND .EQ ZP+20 ; SCRATCHPAD FOR RND # GENERATOR. + +; +; MAIN PROGRAM +; +GETKEY .EQ $100 + + LDA #$FF ; SET UP PORTS. + STA DDR1A + STA DDR1B + STA DDR3B + LDA T1CL ; GET SEED FOR RANDOM # GENERATOR. + STA RND+1 +START LDA #8 ; INITIAL SCORE IS EIGHT. + STA SCORE + TAY ; SHOW INITIAL SCORE + JSR LIGHT +KEY JSR GETKEY ; ANY KEY PRESSED STARTS PROGRAM. + JSR DISPLY ; SPIN WHEELS + JSR EVAL ; CHECK SCORE AND SHOW IT + LDA SCORE + BNE KEY ; IF SCORE <> 0, GET NEXT PLAY. + BEQ START ; IF SCORE = 0; RESTART. + +; +; SUBROUTINE 'DISPLY' +; SUBROUTINE TO DISPLAY 'SPINNING' LEDS, FIND COMBINATION USED TO +; DETERMINE SCORE. +; +LOLIM = 90 +HILIM = 135 +SPDPRM = 80 +DISPLY LDA #0 ; RESET POINTERS. + STA INCR + STA INCR+1 + STA INCR+2 +LDRND LDY #2 ; SET INDEX FOR 3 ITERATIONS. +GETRND JSR RANDOM ; GET RANDOM #. + CMP #HILIM ; TOO LARGE? + BCS GETRND ; IF SO, GET ANOTHER. + CMP #LOLIM ; TOO SMALL? + BCC GETRND ; IF SO, GET ANOTHER. + STA INDX,Y ; SAVE IN LOOP INDEXES AND + STA SPEEDS,Y ; LOOP SPEED COUNTERS. + DEY + BPL GETRND ; GET NEXT RND #. +UPDATE LDX #2 ; SET INDEX FOR THREE ITERATIONS. +UPDTLP LDY SPEEDS,X ; IS SPEED(X) = 0? + BEQ NXTUPD ; IF SO, DO NEXT UPDATE. + DEC INDX,X ; DECREMENT LOOP INDEX(X) + BNE NXTUPD ; IF LOOPINDEX(X) <> 0, DO NEXT UPDATE. + LDY INCR,X ; INCREMENT POINTER(X). + INY + CPY #3 ; POINTER = 3? + BNE NORST ; IF NOT SKIP... + LDY #0 ; ... RESET OF POINTER TO 0. +NORST STY INCR,X ; RESTORE POINTER(X). + STX TEMP ; MULTIPLY X BY 3 FOR ARRAY ACCESS. + TXA + ASL A + CLC + ADC TEMP + ADC INCR,X ; ADD COLUMN # TO PTR(X) FOR ROW#. + TAY ; TRANSFER TO Y FOR INDEXING. + LDA LTABLE,Y ; GET PATTERN FOR LED. + STA LTMSK,X ; STORE IN LIGHT MASK(X). +SPDUPD LDY SPEEDS,X ; INCREMENT SPEED (X). + INY + STY SPEEDS,X ; RESTORE. + STY INDX,X ; RESET LOOP INDEX(X). +LEDUPD LDA #0 ; UPDATE LIGHTS. + STA PORT1B ; RESET LED #9 + LDA LTMSK+2 ; COMBINE PATTERN FOR OUTPUT. + BNE OFFLD9 ; IF MASK#3 <> 0, LED 9 OFF. + LDA #01 ; TURN ON LED 9. + STA PORT1B + LDA #0 ; RESET A SO PATTERN WON'T BE BAD. +OFFLD9 ORA LTMSK ; COMBINE REST OF PATTERNS. + ORA LTMSK+1 + STA PORT1A ; SET LIGHTS. + LDA PORT3B ; TOGGLE SPEAKER. + EOR #$FF + STA PORT3B +NXTUPD DEX ; DECREMENT X FOR NEXT UPDATE. + BPL UPDTLP ; IF X >= 0, DO NEXT UPDATE. + LDY #SPDPRM ; DELAY A BIT TO SLOW +WAIT DEY ; FLASHING OF LEDS. + BNE WAIT + LDA SPEEDS ; CHECK IF ALL COLUMNS OF LEDS STOPPED. + ORA SPEEDS+1 + ORA SPEEDS+2 + BNE UPDATE ; IF NOT, DO NEXT SEQUENCE OF UPDATES. + LDA #$FF + STA DUR ; DELAY TO SHOW USER PATTERN. + JSR DELAY + RTS ; ALL LEDS STOPPED, DONE. + +; +; SUBROUTINE 'EVAL' +; SUBROUTINE TO EVALUATE PRODUCT OF SPIN, AND DISPLAY SCORE WITH TONES FOR +; WIN, LOSE, WIN+ENDGAME AND LOST+ENDGAME. +; +HITONE = $20 +LOTONE = $F0 +EVAL LDA #0 ; RESET VARIABLES. + STA VALUES + STA VALUES+1 + STA VALUES+2 + STA SCORTP + LDY #2 ; SET INDEX Y FOR 3 ITERATIONS TO COUNT # OF + ; LEDS ON IN EACH ROW. +CNTLP LDX INCR,Y ; CHECK POINTER(Y), ADDING + INC VALUES,X ; UP # OF LEDS ON IN EACH ROW. + DEY + BPL CNTLP ; LOOP IF NOT DONE. + LDX #2 ; SET INDEX X FOR 3 ITERATIONS + ; OF LOOP TO FIND SCORE. +SCORLP TXA ; MULTIPLY INDEX BY FOUR FOR ARRAY ROW ACCESS. + ASL A + ASL A + CLC ; ADD # OF LEDS ON IN ROW(X) TO... + ADC VALUES,X ; ... ARRIVE AT COLUMN ADDRESS IN ARRAY. + TAY ; USE AS INDEX + LDA SCORTB,Y ; GET SCORE FOR THIS SPIN. + CLC + ADC SCORTP ; ADD TO ANY PREVIOUS SCORES + ; ACCUMULATED IN THIS LOOP. + STA SCORTP ; RESTORE + DEX + BPL SCORLP ; LOOP IF NOT DONE + LDA #$60 ; SET UP DURATIONS FOR TONES. + STA DUR + LDA SCORTP ; GET SCORE FOR THIS SPIN. + BEQ LOSE ; IF SCORE IS 0, LOSE A POINT. +WIN INC SCORE ; RAISE OVERALL SCORE BY ONE. + LDY SCORE ; GET SCORE + CPY #16 ; WIN WITH 16 POINTS? + BEQ WINEND ; YES; WIN+ENDGAME. + JSR LIGHT ; SHOW SCORE + LDA #HITONE ; PLAY HIGH BEEP. + JSR TONE + JSR DELAY ; SHORT DELAY. + DEC SCORTP ; DECREMENT SCORE TO BE ADDED TO... + ; OVERALL SCORE BY ONE. + BNE WIN ; LOOP IF SCORE TRANSFER NOT COMPLETE. + RTS ; DONE, RETURN TO MAIN PROGRAM. +WINEND LDA #$FF ; TURN ALL LEDS ON TO SIGNAL WIN. + STA PORT1A + STA PORT1B + STA TEMP ; SET FREQ PARAMETER FOR RISING WARBLE. + LDA #0 + STA SCORE ; CLEAR TO FLAG RESTART. + LDA #4 + STA DUR ; SHORT DURATION FOR INDIVIDUAL BEEPS IN WARBLE. +RISE LDA TEMP ; GET FREQUENCY... + JSR TONE ; ... FOR BEEP. + DEC TEMP ; NEXT BEEP WILL BE HIGHER. + BNE RISE ; DO NEXT BEEP IF NOT DONE. + RTS ; RETURN FOR RESTART. +LOSE DEC SCORE ; IF SPIN BAD, SCORE=SCORE-1 + LDY SCORE ; SHOW SCORE + JSR LIGHT + LDA #LOTONE ; PLAY LOW LOSE TONE. + JSR TONE + LDY SCORE ; GET SCORE TO SEE... + BEQ LOSEND ; ... IF GAME IS OVER. + RTS ; IF NOT, RETURN FOR NEXT SPIN. +LOSEND LDA #0 ; SET TEMP FOR USE AS FREQUENCY PARAMETER + STA TEMP ; IN FALLING WARBLE. + STA PORT1A ; CLEAR LED #1. + LDA #4 + STA DUR +FALL LDA TEMP + JSR TONE ; PLAY BEEP. + INC TEMP ; NEXT TONE WILL BE LOWER. + BNE FALL + RTS ; RETURN FOR RESTART. + +; +; SUBROUTINE 'DELAY' +; VARIABLE LENGHT DELAY SUBROUTINE +; DELAY LENGTH = (2046*[DUR]+10) US. +; +DELAY LDY DUR ; GET DELAY LENGHT. +DL1 LDX #$FF ; SET COUNTER FOR INNER 2040 US. LOOP TO +DL2 BNE DL3 ; WASTE TIME. +DL3 DEX ; DECREMENT INNER LOOP COUNTER. + BNE DL2 ; LOOP UNTIL INNER LOOP DONE. + DEY ; DECREMENT OUTER LOOP COUNTER. + BNE DL1 ; LOOP UNTIL DONE. + RTS ; RETURN. + +; +; SUBROUTINE 'LIGHT' +; SUBROUTINE TO LIGHT LEDS CORRESPONDING TO THE CONTENTS OF REGISTER Y ON +; ENTERING. +; +LIGHT LDA #0 ; CLEAR ACCUMULATOR FOR BIT SHIFT. + STA TEMP ; CLEAR OVERFLOW FLAG + STA PORT1A ; CLEAR LOW LEDS + STA PORT1B ; CLEAR HIGH LEDS. + CPY #15 ; CODE FOR UNCONNECTED BIT? + BEQ LIGHT0 ; IF SO, NO CHANGE. + DEY ; DECREMENT TO MATCH. +LIGHT0 SEC ; SET BIT TO BE SHIFTED HIGH. +LTSHFT ROL A ; SHIFT BIT LEFT. + BCC LTCC ; IF CARRY SET, OVERFLOW HAS OCCURRED + ; INTO HIGH BYTE. + LDX #$FF ; SET OVERFLOW FLAG. + STX TEMP + ROL ; MOVE BIT OUT OF CARRY. +LTCC DEY ; ONE LESS BIT TO BE SHIFTED. + BPL LTSHFT ; SHIFT AGAIN IF NOT DONE. + LDX TEMP ; GET OVERFLOW FLAG. + BNE HIBYTE ; IF FLAG <> 0, OVERFLOW: A CONTAINS HIGH BYTE. +LOBYTE STA PORT1A ; STORE A IN LOW ORDER LEDS. + RTS ; RETURN. +HIBYTE STA PORT1B ; STORE A IN HIGH ORDER LEDS. + RTS ; RETURN. + +; +; SUBROUTINE 'TONE' +; TONE GENERATION SUBROUTINE. +; +TONE STA FREQ + LDA #$FF + STA PORT3B + LDA #0 + LDX DUR +FL2 LDY FREQ +FL1 DEY + CLC + BCC FL0 +FL0 BNE FL1 + EOR #$FF + STA PORT3B + DEX + BNE FL2 + RTS + +; +; SUBROUTINE 'RANDOM' +; RANDOM NUMBER GENERATOR SUBROUTINE. +; +RANDOM SEC + LDA RND+1 + ADC RND+4 + ADC RND+5 + STA RND + LDX #4 +RNDSH LDA RND,X + STA RND+1,X + DEX + BPL RNDSH + RTS + +; +; ARRAYS +; + +; +; ARRAY OF PATTERNS TO LIGHT LEDS, ARRAY ROWS CORRESPOND TO COLUMNS OF LED +; ARRAY, AND COLUMNS TO ROWS, FOR EXAMPLE, THIRD BYTE IN ROW ONE WILL LIGHT +; LED 7. +; +LTABLE .HS 01.08.40.02.10.80.04.20.00 + +; +; ARRAY OF SCORES RECEIVED FOR CERTAIN PATTERS OF LIT LEDS; ROWS CORRESPOND TO +; ROWS IN LED ARRAY. COLUMNS CORRESPOND TO NUMBER OF LEDS LIT IN THAT ROW. +; I.E. 3 LEDS IN MIDDLE ROW IS 3 PTS. +; +SCORTB .HS 00.00.00.00.00.00.01.03.00.00.00.00 \ No newline at end of file diff --git a/projects/GB-001 Game Board/software/common/CH07-SlotMachine/slot_machine.asm b/projects/GB-001 Game Board/software/common/CH07-SlotMachine/slot_machine.asm new file mode 100644 index 0000000..fb344e9 --- /dev/null +++ b/projects/GB-001 Game Board/software/common/CH07-SlotMachine/slot_machine.asm @@ -0,0 +1,15 @@ + .CR 6502 + .TF slot_machine.hex,INT + .LF slot_machine.list +; +; SLOT MACHINE GAME FOR THE '6502 GAMES' HARDWARE, BOARD SHOULD BE JUMPERED +; WITH VIA CHIPS AT THE ADDRESSES SPECIFIED BELOW. OTHER THAN THAT THE CODE +; IS SHOULD BE UNCHANGED FROM THE BOOK THOUGH THERE WILL BE SOME DIFFERENCES +; DUE TO ASSEMBLER USED. +; +VIA1 .EQ $C000 +VIA3 .EQ $CC00 + + .OR $0200 + .TA $0200 +BEGIN .IN game.asm diff --git a/projects/GB-001 Game Board/software/common/CH07-SlotMachine/slot_machine.hex b/projects/GB-001 Game Board/software/common/CH07-SlotMachine/slot_machine.hex new file mode 100644 index 0000000..cf642cd --- /dev/null +++ b/projects/GB-001 Game Board/software/common/CH07-SlotMachine/slot_machine.hex @@ -0,0 +1,28 @@ +:10020000A9FF8D03C08D02C08D02CCAD04C0851541 +:10021000A9088502A8203D0320000120270220A76D +:1002200002A502D0F3F0E9A900850B850C850DA08D +:1002300002208003C987B0F9C95A90F5990800993E +:1002400005008810ECA202B405F044D608D040B4F2 +:100250000BC8C003D002A000940B86008A0A186560 +:1002600000750BA8B99303950EB405C894059408BE +:10027000A9008D00C0A510D007A9018D00C0A9005C +:10028000050E050F8D01C0AD00CC49FF8D00CCCA15 +:1002900010B5A05088D0FDA50505060507D0A6A974 +:1002A000FF850320300360A9008511851285138521 +:1002B00001A002B60BF6118810F9A2028A0A0A18E8 +:1002C0007511A8B99C031865018501CA10EEA960D3 +:1002D0008503A501F034E602A402C010F010203D11 +:1002E00003A920206403203003C601D0E960A9FFE0 +:1002F0008D01C08D00C08500A9008502A904850379 +:10030000A500206403C600D0F760C602A402203D09 +:1003100003A9F0206403A402F00160A90085008D08 +:1003200001C0A9048503A500206403E600D0F7609E +:10033000A403A2FFD000CAD0FB88D0F660A9008534 +:10034000008D01C08D00C0C00FF00188382A9005D3 +:10035000A2FF86002A8810F5A600D0048D01C06097 +:100360008D00C0608504A9FF8D00CCA900A603A460 +:100370000488189000D0FA49FF8D00CCCAD0F060F4 +:1003800038A515651865198514A204B5149515CA04 +:1003900010F96001084002108004200000000000F5 +:0803A000000001030000000051 +:00000001FF diff --git a/projects/GB-001 Game Board/software/common/CH07-SlotMachine/slot_machine.list b/projects/GB-001 Game Board/software/common/CH07-SlotMachine/slot_machine.list new file mode 100644 index 0000000..ebf8753 --- /dev/null +++ b/projects/GB-001 Game Board/software/common/CH07-SlotMachine/slot_machine.list @@ -0,0 +1,323 @@ +0000- 4 ; +0000- 5 ; SLOT MACHINE GAME FOR THE '6502 GAMES' HARDWARE, BOARD SHOULD BE JUMPERED +0000- 6 ; WITH VIA CHIPS AT THE ADDRESSES SPECIFIED BELOW. OTHER THAN THAT THE CODE +0000- 7 ; IS SHOULD BE UNCHANGED FROM THE BOOK THOUGH THERE WILL BE SOME DIFFERENCES +0000- 8 ; DUE TO ASSEMBLER USED. +0000- 9 ; +C000- 10 VIA1 .EQ $C000 +CC00- 11 VIA3 .EQ $CC00 +0000- 12 +0200- 13 .OR $0200 +0200- 14 .TA $0200 +0200- 15 BEGIN .IN game.asm +0200- I 1 ; 'SLOT MACHINE' +0200- I 2 ; SLOT MACHINE SIMULATOR PROGRAM, PRESS ANY KEY TO START 'SPIN'. SCORE +0200- I 3 ; DETERMINED BY ARRAY 'SCORTB'. 8 POINTS INITIAL SCORE, ONE POINT PENALTY +0200- I 4 ; FOR EACH BAD SPIN. +0200- I 5 +0200- I 6 ; +0200- I 7 ; I/O: +0200- I 8 ; +C000- I 9 PORT1B .EQ VIA1 ; PORT B +C001- I 10 PORT1A .EQ VIA1+1 ; PORT A +C002- I 11 DDR1B .EQ VIA1+2 ; PORT B DATA DIRECTION REGISTER +C003- I 12 DDR1A .EQ VIA1+3 ; PORT A DATA DIRECTION REGISTER +C004- I 13 T1CL .EQ VIA1+4 +0200- I 14 +CC00- I 15 PORT3B .EQ VIA3 ; PORT B +CC01- I 16 PORT3A .EQ VIA3+1 ; PORT A +CC02- I 17 DDR3B .EQ VIA3+2 ; PORT B DATA DIRECTION REGISTER +CC03- I 18 DDR3A .EQ VIA3+3 ; PORT A DATA DIRECTION REGISTER +0200- I 19 +0200- I 20 ; +0200- I 21 ; VARIABLE STORAGE. +0200- I 22 ; +0000- I 23 ZP .EQ $00 +0000- I 24 TEMP .EQ ZP ; TEMPORARY STORAGE. +0001- I 25 SCORTP .EQ ZP+1 ; TEMPORARY SCORE STORAGE +0002- I 26 SCORE .EQ ZP+2 ; SCORE. +0003- I 27 DUR .EQ ZP+3 ; DURATION OF TONES. +0004- I 28 FREQ .EQ ZP+4 +0005- I 29 SPEEDS .EQ ZP+5 ; SPEEDS OF REVOLUTION FOR LEDS IN COLUMNS +0008- I 30 INDX .EQ ZP+8 ; DELAY COUNTERS FOR LED REVOLUTIONS. +000B- I 31 INCR .EQ ZP+11 ; POINTERS FOR LED POSITIONS: +0200- I 32 ; USED TO FETCH PATTERNS OUT OF TABLES. +000E- I 33 LTMSK .EQ ZP+14 ; PATTERNS FOR LIT LEDS +0011- I 34 VALUES .EQ ZP+17 ; NUMBER OF LIT LEDS IN EACH ROW. +0014- I 35 RND .EQ ZP+20 ; SCRATCHPAD FOR RND # GENERATOR. +0200- I 36 +0200- I 37 ; +0200- I 38 ; MAIN PROGRAM +0200- I 39 ; +0100- I 40 GETKEY .EQ $100 +0200- I 41 +0200-A9 FF I 42 ( 2) LDA #$FF ; SET UP PORTS. +0202-8D 03 C0 I 43 ( 4) STA DDR1A +0205-8D 02 C0 I 44 ( 4) STA DDR1B +0208-8D 02 CC I 45 ( 4) STA DDR3B +020B-AD 04 C0 I 46 ( 4) LDA T1CL ; GET SEED FOR RANDOM # GENERATOR. +020E-85 15 I 47 ( 2) STA RND+1 +0210-A9 08 I 48 ( 2) START LDA #8 ; INITIAL SCORE IS EIGHT. +0212-85 02 I 49 ( 2) STA SCORE +0214-A8 I 50 ( 2) TAY ; SHOW INITIAL SCORE +0215-20 3D 03 I 51 ( 6) JSR LIGHT +0218-20 00 01 I 52 ( 6) KEY JSR GETKEY ; ANY KEY PRESSED STARTS PROGRAM. +021B-20 27 02 I 53 ( 6) JSR DISPLY ; SPIN WHEELS +021E-20 A7 02 I 54 ( 6) JSR EVAL ; CHECK SCORE AND SHOW IT +0221-A5 02 I 55 ( 3) LDA SCORE +0223-D0 F3 I 56 (2**) BNE KEY ; IF SCORE <> 0, GET NEXT PLAY. +0225-F0 E9 I 57 (2**) BEQ START ; IF SCORE = 0; RESTART. +0227- I 58 +0227- I 59 ; +0227- I 60 ; SUBROUTINE 'DISPLY' +0227- I 61 ; SUBROUTINE TO DISPLAY 'SPINNING' LEDS, FIND COMBINATION USED TO +0227- I 62 ; DETERMINE SCORE. +0227- I 63 ; +005A- I 64 LOLIM = 90 +0087- I 65 HILIM = 135 +0050- I 66 SPDPRM = 80 +0227-A9 00 I 67 ( 2) DISPLY LDA #0 ; RESET POINTERS. +0229-85 0B I 68 ( 2) STA INCR +022B-85 0C I 69 ( 2) STA INCR+1 +022D-85 0D I 70 ( 2) STA INCR+2 +022F-A0 02 I 71 ( 2) LDRND LDY #2 ; SET INDEX FOR 3 ITERATIONS. +0231-20 80 03 I 72 ( 6) GETRND JSR RANDOM ; GET RANDOM #. +0234-C9 87 I 73 ( 2) CMP #HILIM ; TOO LARGE? +0236-B0 F9 I 74 (2**) BCS GETRND ; IF SO, GET ANOTHER. +0238-C9 5A I 75 ( 2) CMP #LOLIM ; TOO SMALL? +023A-90 F5 I 76 (2**) BCC GETRND ; IF SO, GET ANOTHER. +023C-99 08 00 I 77 ( 5) STA INDX,Y ; SAVE IN LOOP INDEXES AND +023F-99 05 00 I 78 ( 5) STA SPEEDS,Y ; LOOP SPEED COUNTERS. +0242-88 I 79 ( 2) DEY +0243-10 EC I 80 (2**) BPL GETRND ; GET NEXT RND #. +0245-A2 02 I 81 ( 2) UPDATE LDX #2 ; SET INDEX FOR THREE ITERATIONS. +0247-B4 05 I 82 ( 4) UPDTLP LDY SPEEDS,X ; IS SPEED(X) = 0? +0249-F0 44 I 83 (2**) BEQ NXTUPD ; IF SO, DO NEXT UPDATE. +024B-D6 08 I 84 ( 6) DEC INDX,X ; DECREMENT LOOP INDEX(X) +024D-D0 40 I 85 (2**) BNE NXTUPD ; IF LOOPINDEX(X) <> 0, DO NEXT UPDATE. +024F-B4 0B I 86 ( 4) LDY INCR,X ; INCREMENT POINTER(X). +0251-C8 I 87 ( 2) INY +0252-C0 03 I 88 ( 2) CPY #3 ; POINTER = 3? +0254-D0 02 I 89 (2**) BNE NORST ; IF NOT SKIP... +0256-A0 00 I 90 ( 2) LDY #0 ; ... RESET OF POINTER TO 0. +0258-94 0B I 91 ( 4) NORST STY INCR,X ; RESTORE POINTER(X). +025A-86 00 I 92 ( 3) STX TEMP ; MULTIPLY X BY 3 FOR ARRAY ACCESS. +025C-8A I 93 ( 2) TXA +025D-0A I 94 ( 2) ASL A +025E-18 I 95 ( 2) CLC +025F-65 00 I 96 ( 3) ADC TEMP +0261-75 0B I 97 ( 4) ADC INCR,X ; ADD COLUMN # TO PTR(X) FOR ROW#. +0263-A8 I 98 ( 2) TAY ; TRANSFER TO Y FOR INDEXING. +0264-B9 93 03 I 99 ( 4*) LDA LTABLE,Y ; GET PATTERN FOR LED. +0267-95 0E I 100 ( 4) STA LTMSK,X ; STORE IN LIGHT MASK(X). +0269-B4 05 I 101 ( 4) SPDUPD LDY SPEEDS,X ; INCREMENT SPEED (X). +026B-C8 I 102 ( 2) INY +026C-94 05 I 103 ( 4) STY SPEEDS,X ; RESTORE. +026E-94 08 I 104 ( 4) STY INDX,X ; RESET LOOP INDEX(X). +0270-A9 00 I 105 ( 2) LEDUPD LDA #0 ; UPDATE LIGHTS. +0272-8D 00 C0 I 106 ( 4) STA PORT1B ; RESET LED #9 +0275-A5 10 I 107 ( 3) LDA LTMSK+2 ; COMBINE PATTERN FOR OUTPUT. +0277-D0 07 I 108 (2**) BNE OFFLD9 ; IF MASK#3 <> 0, LED 9 OFF. +0279-A9 01 I 109 ( 2) LDA #01 ; TURN ON LED 9. +027B-8D 00 C0 I 110 ( 4) STA PORT1B +027E-A9 00 I 111 ( 2) LDA #0 ; RESET A SO PATTERN WON'T BE BAD. +0280-05 0E I 112 ( 3) OFFLD9 ORA LTMSK ; COMBINE REST OF PATTERNS. +0282-05 0F I 113 ( 3) ORA LTMSK+1 +0284-8D 01 C0 I 114 ( 4) STA PORT1A ; SET LIGHTS. +0287-AD 00 CC I 115 ( 4) LDA PORT3B ; TOGGLE SPEAKER. +028A-49 FF I 116 ( 2) EOR #$FF +028C-8D 00 CC I 117 ( 4) STA PORT3B +028F-CA I 118 ( 2) NXTUPD DEX ; DECREMENT X FOR NEXT UPDATE. +0290-10 B5 I 119 (2**) BPL UPDTLP ; IF X >= 0, DO NEXT UPDATE. +0292-A0 50 I 120 ( 2) LDY #SPDPRM ; DELAY A BIT TO SLOW +0294-88 I 121 ( 2) WAIT DEY ; FLASHING OF LEDS. +0295-D0 FD I 122 (2**) BNE WAIT +0297-A5 05 I 123 ( 3) LDA SPEEDS ; CHECK IF ALL COLUMNS OF LEDS STOPPED. +0299-05 06 I 124 ( 3) ORA SPEEDS+1 +029B-05 07 I 125 ( 3) ORA SPEEDS+2 +029D-D0 A6 I 126 (2**) BNE UPDATE ; IF NOT, DO NEXT SEQUENCE OF UPDATES. +029F-A9 FF I 127 ( 2) LDA #$FF +02A1-85 03 I 128 ( 2) STA DUR ; DELAY TO SHOW USER PATTERN. +02A3-20 30 03 I 129 ( 6) JSR DELAY +02A6-60 I 130 ( 6) RTS ; ALL LEDS STOPPED, DONE. +02A7- I 131 +02A7- I 132 ; +02A7- I 133 ; SUBROUTINE 'EVAL' +02A7- I 134 ; SUBROUTINE TO EVALUATE PRODUCT OF SPIN, AND DISPLAY SCORE WITH TONES FOR +02A7- I 135 ; WIN, LOSE, WIN+ENDGAME AND LOST+ENDGAME. +02A7- I 136 ; +0020- I 137 HITONE = $20 +00F0- I 138 LOTONE = $F0 +02A7-A9 00 I 139 ( 2) EVAL LDA #0 ; RESET VARIABLES. +02A9-85 11 I 140 ( 2) STA VALUES +02AB-85 12 I 141 ( 2) STA VALUES+1 +02AD-85 13 I 142 ( 2) STA VALUES+2 +02AF-85 01 I 143 ( 2) STA SCORTP +02B1-A0 02 I 144 ( 2) LDY #2 ; SET INDEX Y FOR 3 ITERATIONS TO COUNT # OF +02B3- I 145 ; LEDS ON IN EACH ROW. +02B3-B6 0B I 146 ( 4) CNTLP LDX INCR,Y ; CHECK POINTER(Y), ADDING +02B5-F6 11 I 147 ( 6) INC VALUES,X ; UP # OF LEDS ON IN EACH ROW. +02B7-88 I 148 ( 2) DEY +02B8-10 F9 I 149 (2**) BPL CNTLP ; LOOP IF NOT DONE. +02BA-A2 02 I 150 ( 2) LDX #2 ; SET INDEX X FOR 3 ITERATIONS +02BC- I 151 ; OF LOOP TO FIND SCORE. +02BC-8A I 152 ( 2) SCORLP TXA ; MULTIPLY INDEX BY FOUR FOR ARRAY ROW ACCESS. +02BD-0A I 153 ( 2) ASL A +02BE-0A I 154 ( 2) ASL A +02BF-18 I 155 ( 2) CLC ; ADD # OF LEDS ON IN ROW(X) TO... +02C0-75 11 I 156 ( 4) ADC VALUES,X ; ... ARRIVE AT COLUMN ADDRESS IN ARRAY. +02C2-A8 I 157 ( 2) TAY ; USE AS INDEX +02C3-B9 9C 03 I 158 ( 4*) LDA SCORTB,Y ; GET SCORE FOR THIS SPIN. +02C6-18 I 159 ( 2) CLC +02C7-65 01 I 160 ( 3) ADC SCORTP ; ADD TO ANY PREVIOUS SCORES +02C9- I 161 ; ACCUMULATED IN THIS LOOP. +02C9-85 01 I 162 ( 2) STA SCORTP ; RESTORE +02CB-CA I 163 ( 2) DEX +02CC-10 EE I 164 (2**) BPL SCORLP ; LOOP IF NOT DONE +02CE-A9 60 I 165 ( 2) LDA #$60 ; SET UP DURATIONS FOR TONES. +02D0-85 03 I 166 ( 2) STA DUR +02D2-A5 01 I 167 ( 3) LDA SCORTP ; GET SCORE FOR THIS SPIN. +02D4-F0 34 I 168 (2**) BEQ LOSE ; IF SCORE IS 0, LOSE A POINT. +02D6-E6 02 I 169 ( 5) WIN INC SCORE ; RAISE OVERALL SCORE BY ONE. +02D8-A4 02 I 170 ( 3) LDY SCORE ; GET SCORE +02DA-C0 10 I 171 ( 2) CPY #16 ; WIN WITH 16 POINTS? +02DC-F0 10 I 172 (2**) BEQ WINEND ; YES; WIN+ENDGAME. +02DE-20 3D 03 I 173 ( 6) JSR LIGHT ; SHOW SCORE +02E1-A9 20 I 174 ( 2) LDA #HITONE ; PLAY HIGH BEEP. +02E3-20 64 03 I 175 ( 6) JSR TONE +02E6-20 30 03 I 176 ( 6) JSR DELAY ; SHORT DELAY. +02E9-C6 01 I 177 ( 5) DEC SCORTP ; DECREMENT SCORE TO BE ADDED TO... +02EB- I 178 ; OVERALL SCORE BY ONE. +02EB-D0 E9 I 179 (2**) BNE WIN ; LOOP IF SCORE TRANSFER NOT COMPLETE. +02ED-60 I 180 ( 6) RTS ; DONE, RETURN TO MAIN PROGRAM. +02EE-A9 FF I 181 ( 2) WINEND LDA #$FF ; TURN ALL LEDS ON TO SIGNAL WIN. +02F0-8D 01 C0 I 182 ( 4) STA PORT1A +02F3-8D 00 C0 I 183 ( 4) STA PORT1B +02F6-85 00 I 184 ( 2) STA TEMP ; SET FREQ PARAMETER FOR RISING WARBLE. +02F8-A9 00 I 185 ( 2) LDA #0 +02FA-85 02 I 186 ( 2) STA SCORE ; CLEAR TO FLAG RESTART. +02FC-A9 04 I 187 ( 2) LDA #4 +02FE-85 03 I 188 ( 2) STA DUR ; SHORT DURATION FOR INDIVIDUAL BEEPS IN WARBLE. +0300-A5 00 I 189 ( 3) RISE LDA TEMP ; GET FREQUENCY... +0302-20 64 03 I 190 ( 6) JSR TONE ; ... FOR BEEP. +0305-C6 00 I 191 ( 5) DEC TEMP ; NEXT BEEP WILL BE HIGHER. +0307-D0 F7 I 192 (2**) BNE RISE ; DO NEXT BEEP IF NOT DONE. +0309-60 I 193 ( 6) RTS ; RETURN FOR RESTART. +030A-C6 02 I 194 ( 5) LOSE DEC SCORE ; IF SPIN BAD, SCORE=SCORE-1 +030C-A4 02 I 195 ( 3) LDY SCORE ; SHOW SCORE +030E-20 3D 03 I 196 ( 6) JSR LIGHT +0311-A9 F0 I 197 ( 2) LDA #LOTONE ; PLAY LOW LOSE TONE. +0313-20 64 03 I 198 ( 6) JSR TONE +0316-A4 02 I 199 ( 3) LDY SCORE ; GET SCORE TO SEE... +0318-F0 01 I 200 (2**) BEQ LOSEND ; ... IF GAME IS OVER. +031A-60 I 201 ( 6) RTS ; IF NOT, RETURN FOR NEXT SPIN. +031B-A9 00 I 202 ( 2) LOSEND LDA #0 ; SET TEMP FOR USE AS FREQUENCY PARAMETER +031D-85 00 I 203 ( 2) STA TEMP ; IN FALLING WARBLE. +031F-8D 01 C0 I 204 ( 4) STA PORT1A ; CLEAR LED #1. +0322-A9 04 I 205 ( 2) LDA #4 +0324-85 03 I 206 ( 2) STA DUR +0326-A5 00 I 207 ( 3) FALL LDA TEMP +0328-20 64 03 I 208 ( 6) JSR TONE ; PLAY BEEP. +032B-E6 00 I 209 ( 5) INC TEMP ; NEXT TONE WILL BE LOWER. +032D-D0 F7 I 210 (2**) BNE FALL +032F-60 I 211 ( 6) RTS ; RETURN FOR RESTART. +0330- I 212 +0330- I 213 ; +0330- I 214 ; SUBROUTINE 'DELAY' +0330- I 215 ; VARIABLE LENGHT DELAY SUBROUTINE +0330- I 216 ; DELAY LENGTH = (2046*[DUR]+10) US. +0330- I 217 ; +0330-A4 03 I 218 ( 3) DELAY LDY DUR ; GET DELAY LENGHT. +0332-A2 FF I 219 ( 2) DL1 LDX #$FF ; SET COUNTER FOR INNER 2040 US. LOOP TO +0334-D0 00 I 220 (2**) DL2 BNE DL3 ; WASTE TIME. +0336-CA I 221 ( 2) DL3 DEX ; DECREMENT INNER LOOP COUNTER. +0337-D0 FB I 222 (2**) BNE DL2 ; LOOP UNTIL INNER LOOP DONE. +0339-88 I 223 ( 2) DEY ; DECREMENT OUTER LOOP COUNTER. +033A-D0 F6 I 224 (2**) BNE DL1 ; LOOP UNTIL DONE. +033C-60 I 225 ( 6) RTS ; RETURN. +033D- I 226 +033D- I 227 ; +033D- I 228 ; SUBROUTINE 'LIGHT' +033D- I 229 ; SUBROUTINE TO LIGHT LEDS CORRESPONDING TO THE CONTENTS OF REGISTER Y ON +033D- I 230 ; ENTERING. +033D- I 231 ; +033D-A9 00 I 232 ( 2) LIGHT LDA #0 ; CLEAR ACCUMULATOR FOR BIT SHIFT. +033F-85 00 I 233 ( 2) STA TEMP ; CLEAR OVERFLOW FLAG +0341-8D 01 C0 I 234 ( 4) STA PORT1A ; CLEAR LOW LEDS +0344-8D 00 C0 I 235 ( 4) STA PORT1B ; CLEAR HIGH LEDS. +0347-C0 0F I 236 ( 2) CPY #15 ; CODE FOR UNCONNECTED BIT? +0349-F0 01 I 237 (2**) BEQ LIGHT0 ; IF SO, NO CHANGE. +034B-88 I 238 ( 2) DEY ; DECREMENT TO MATCH. +034C-38 I 239 ( 2) LIGHT0 SEC ; SET BIT TO BE SHIFTED HIGH. +034D-2A I 240 ( 2) LTSHFT ROL A ; SHIFT BIT LEFT. +034E-90 05 I 241 (2**) BCC LTCC ; IF CARRY SET, OVERFLOW HAS OCCURRED +0350- I 242 ; INTO HIGH BYTE. +0350-A2 FF I 243 ( 2) LDX #$FF ; SET OVERFLOW FLAG. +0352-86 00 I 244 ( 3) STX TEMP +0354-2A I 245 ( 2) ROL ; MOVE BIT OUT OF CARRY. +0355-88 I 246 ( 2) LTCC DEY ; ONE LESS BIT TO BE SHIFTED. +0356-10 F5 I 247 (2**) BPL LTSHFT ; SHIFT AGAIN IF NOT DONE. +0358-A6 00 I 248 ( 3) LDX TEMP ; GET OVERFLOW FLAG. +035A-D0 04 I 249 (2**) BNE HIBYTE ; IF FLAG <> 0, OVERFLOW: A CONTAINS HIGH BYTE. +035C-8D 01 C0 I 250 ( 4) LOBYTE STA PORT1A ; STORE A IN LOW ORDER LEDS. +035F-60 I 251 ( 6) RTS ; RETURN. +0360-8D 00 C0 I 252 ( 4) HIBYTE STA PORT1B ; STORE A IN HIGH ORDER LEDS. +0363-60 I 253 ( 6) RTS ; RETURN. +0364- I 254 +0364- I 255 ; +0364- I 256 ; SUBROUTINE 'TONE' +0364- I 257 ; TONE GENERATION SUBROUTINE. +0364- I 258 ; +0364-85 04 I 259 ( 2) TONE STA FREQ +0366-A9 FF I 260 ( 2) LDA #$FF +0368-8D 00 CC I 261 ( 4) STA PORT3B +036B-A9 00 I 262 ( 2) LDA #0 +036D-A6 03 I 263 ( 3) LDX DUR +036F-A4 04 I 264 ( 3) FL2 LDY FREQ +0371-88 I 265 ( 2) FL1 DEY +0372-18 I 266 ( 2) CLC +0373-90 00 I 267 (2**) BCC FL0 +0375-D0 FA I 268 (2**) FL0 BNE FL1 +0377-49 FF I 269 ( 2) EOR #$FF +0379-8D 00 CC I 270 ( 4) STA PORT3B +037C-CA I 271 ( 2) DEX +037D-D0 F0 I 272 (2**) BNE FL2 +037F-60 I 273 ( 6) RTS +0380- I 274 +0380- I 275 ; +0380- I 276 ; SUBROUTINE 'RANDOM' +0380- I 277 ; RANDOM NUMBER GENERATOR SUBROUTINE. +0380- I 278 ; +0380-38 I 279 ( 2) RANDOM SEC +0381-A5 15 I 280 ( 3) LDA RND+1 +0383-65 18 I 281 ( 3) ADC RND+4 +0385-65 19 I 282 ( 3) ADC RND+5 +0387-85 14 I 283 ( 2) STA RND +0389-A2 04 I 284 ( 2) LDX #4 +038B-B5 14 I 285 ( 4) RNDSH LDA RND,X +038D-95 15 I 286 ( 4) STA RND+1,X +038F-CA I 287 ( 2) DEX +0390-10 F9 I 288 (2**) BPL RNDSH +0392-60 I 289 ( 6) RTS +0393- I 290 +0393- I 291 ; +0393- I 292 ; ARRAYS +0393- I 293 ; +0393- I 294 +0393- I 295 ; +0393- I 296 ; ARRAY OF PATTERNS TO LIGHT LEDS, ARRAY ROWS CORRESPOND TO COLUMNS OF LED +0393- I 297 ; ARRAY, AND COLUMNS TO ROWS, FOR EXAMPLE, THIRD BYTE IN ROW ONE WILL LIGHT +0393- I 298 ; LED 7. +0393- I 299 ; +0393-01 08 40 02 + 10 80 04 20 + 00 I 300 LTABLE .HS 01.08.40.02.10.80.04.20.00 +039C- I 301 +039C- I 302 ; +039C- I 303 ; ARRAY OF SCORES RECEIVED FOR CERTAIN PATTERS OF LIT LEDS; ROWS CORRESPOND TO +039C- I 304 ; ROWS IN LED ARRAY. COLUMNS CORRESPOND TO NUMBER OF LEDS LIT IN THAT ROW. +039C- I 305 ; I.E. 3 LEDS IN MIDDLE ROW IS 3 PTS. +039C- I 306 ; +039C-00 00 00 00 + 00 00 01 03 + 00 00 00 00 I 307 SCORTB .HS 00.00.00.00.00.00.01.03.00.00.00.00