mirror of
https://github.com/tebl/RC-Project-Board.git
synced 2024-06-01 21:41:29 +00:00
362 lines
24 KiB
Plaintext
362 lines
24 KiB
Plaintext
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-20 D0 03 15 ( 6) BEGIN JSR INITKEY
|
|
0203- 16 .IN ../../common/CH07-SlotMachine/game.asm
|
|
0203- I 1 ; 'SLOT MACHINE'
|
|
0203- I 2 ; SLOT MACHINE SIMULATOR PROGRAM, PRESS ANY KEY TO START 'SPIN'. SCORE
|
|
0203- I 3 ; DETERMINED BY ARRAY 'SCORTB'. 8 POINTS INITIAL SCORE, ONE POINT PENALTY
|
|
0203- I 4 ; FOR EACH BAD SPIN.
|
|
0203- I 5
|
|
0203- I 6 ;
|
|
0203- I 7 ; I/O:
|
|
0203- 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
|
|
0203- 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
|
|
0203- I 19
|
|
0203- I 20 ;
|
|
0203- I 21 ; VARIABLE STORAGE.
|
|
0203- 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:
|
|
0203- 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.
|
|
0203- I 36
|
|
0203- I 37 ;
|
|
0203- I 38 ; MAIN PROGRAM
|
|
0203- I 39 ;
|
|
0203-A9 FF I 40 ( 2) LDA #$FF ; SET UP PORTS.
|
|
0205-8D 03 C0 I 41 ( 4) STA DDR1A
|
|
0208-8D 02 C0 I 42 ( 4) STA DDR1B
|
|
020B-8D 02 CC I 43 ( 4) STA DDR3B
|
|
020E-AD 04 C0 I 44 ( 4) LDA T1CL ; GET SEED FOR RANDOM # GENERATOR.
|
|
0211-85 15 I 45 ( 2) STA RND+1
|
|
0213-A9 08 I 46 ( 2) START LDA #8 ; INITIAL SCORE IS EIGHT.
|
|
0215-85 02 I 47 ( 2) STA SCORE
|
|
0217-A8 I 48 ( 2) TAY ; SHOW INITIAL SCORE
|
|
0218-20 40 03 I 49 ( 6) JSR LIGHT
|
|
021B-20 AB 03 I 50 ( 6) KEY JSR GETKEY ; ANY KEY PRESSED STARTS PROGRAM.
|
|
021E-20 2A 02 I 51 ( 6) JSR DISPLY ; SPIN WHEELS
|
|
0221-20 AA 02 I 52 ( 6) JSR EVAL ; CHECK SCORE AND SHOW IT
|
|
0224-A5 02 I 53 ( 3) LDA SCORE
|
|
0226-D0 F3 I 54 (2**) BNE KEY ; IF SCORE <> 0, GET NEXT PLAY.
|
|
0228-F0 E9 I 55 (2**) BEQ START ; IF SCORE = 0; RESTART.
|
|
022A- I 56
|
|
022A- I 57 ;
|
|
022A- I 58 ; SUBROUTINE 'DISPLY'
|
|
022A- I 59 ; SUBROUTINE TO DISPLAY 'SPINNING' LEDS, FIND COMBINATION USED TO
|
|
022A- I 60 ; DETERMINE SCORE.
|
|
022A- I 61 ;
|
|
005A- I 62 LOLIM = 90
|
|
0087- I 63 HILIM = 135
|
|
0050- I 64 SPDPRM = 80
|
|
022A-A9 00 I 65 ( 2) DISPLY LDA #0 ; RESET POINTERS.
|
|
022C-85 0B I 66 ( 2) STA INCR
|
|
022E-85 0C I 67 ( 2) STA INCR+1
|
|
0230-85 0D I 68 ( 2) STA INCR+2
|
|
0232-A0 02 I 69 ( 2) LDRND LDY #2 ; SET INDEX FOR 3 ITERATIONS.
|
|
0234-20 83 03 I 70 ( 6) GETRND JSR RANDOM ; GET RANDOM #.
|
|
0237-C9 87 I 71 ( 2) CMP #HILIM ; TOO LARGE?
|
|
0239-B0 F9 I 72 (2**) BCS GETRND ; IF SO, GET ANOTHER.
|
|
023B-C9 5A I 73 ( 2) CMP #LOLIM ; TOO SMALL?
|
|
023D-90 F5 I 74 (2**) BCC GETRND ; IF SO, GET ANOTHER.
|
|
023F-99 08 00 I 75 ( 5) STA INDX,Y ; SAVE IN LOOP INDEXES AND
|
|
0242-99 05 00 I 76 ( 5) STA SPEEDS,Y ; LOOP SPEED COUNTERS.
|
|
0245-88 I 77 ( 2) DEY
|
|
0246-10 EC I 78 (2**) BPL GETRND ; GET NEXT RND #.
|
|
0248-A2 02 I 79 ( 2) UPDATE LDX #2 ; SET INDEX FOR THREE ITERATIONS.
|
|
024A-B4 05 I 80 ( 4) UPDTLP LDY SPEEDS,X ; IS SPEED(X) = 0?
|
|
024C-F0 44 I 81 (2**) BEQ NXTUPD ; IF SO, DO NEXT UPDATE.
|
|
024E-D6 08 I 82 ( 6) DEC INDX,X ; DECREMENT LOOP INDEX(X)
|
|
0250-D0 40 I 83 (2**) BNE NXTUPD ; IF LOOPINDEX(X) <> 0, DO NEXT UPDATE.
|
|
0252-B4 0B I 84 ( 4) LDY INCR,X ; INCREMENT POINTER(X).
|
|
0254-C8 I 85 ( 2) INY
|
|
0255-C0 03 I 86 ( 2) CPY #3 ; POINTER = 3?
|
|
0257-D0 02 I 87 (2**) BNE NORST ; IF NOT SKIP...
|
|
0259-A0 00 I 88 ( 2) LDY #0 ; ... RESET OF POINTER TO 0.
|
|
025B-94 0B I 89 ( 4) NORST STY INCR,X ; RESTORE POINTER(X).
|
|
025D-86 00 I 90 ( 3) STX TEMP ; MULTIPLY X BY 3 FOR ARRAY ACCESS.
|
|
025F-8A I 91 ( 2) TXA
|
|
0260-0A I 92 ( 2) ASL A
|
|
0261-18 I 93 ( 2) CLC
|
|
0262-65 00 I 94 ( 3) ADC TEMP
|
|
0264-75 0B I 95 ( 4) ADC INCR,X ; ADD COLUMN # TO PTR(X) FOR ROW#.
|
|
0266-A8 I 96 ( 2) TAY ; TRANSFER TO Y FOR INDEXING.
|
|
0267-B9 96 03 I 97 ( 4*) LDA LTABLE,Y ; GET PATTERN FOR LED.
|
|
026A-95 0E I 98 ( 4) STA LTMSK,X ; STORE IN LIGHT MASK(X).
|
|
026C-B4 05 I 99 ( 4) SPDUPD LDY SPEEDS,X ; INCREMENT SPEED (X).
|
|
026E-C8 I 100 ( 2) INY
|
|
026F-94 05 I 101 ( 4) STY SPEEDS,X ; RESTORE.
|
|
0271-94 08 I 102 ( 4) STY INDX,X ; RESET LOOP INDEX(X).
|
|
0273-A9 00 I 103 ( 2) LEDUPD LDA #0 ; UPDATE LIGHTS.
|
|
0275-8D 00 C0 I 104 ( 4) STA PORT1B ; RESET LED #9
|
|
0278-A5 10 I 105 ( 3) LDA LTMSK+2 ; COMBINE PATTERN FOR OUTPUT.
|
|
027A-D0 07 I 106 (2**) BNE OFFLD9 ; IF MASK#3 <> 0, LED 9 OFF.
|
|
027C-A9 01 I 107 ( 2) LDA #01 ; TURN ON LED 9.
|
|
027E-8D 00 C0 I 108 ( 4) STA PORT1B
|
|
0281-A9 00 I 109 ( 2) LDA #0 ; RESET A SO PATTERN WON'T BE BAD.
|
|
0283-05 0E I 110 ( 3) OFFLD9 ORA LTMSK ; COMBINE REST OF PATTERNS.
|
|
0285-05 0F I 111 ( 3) ORA LTMSK+1
|
|
0287-8D 01 C0 I 112 ( 4) STA PORT1A ; SET LIGHTS.
|
|
028A-AD 00 CC I 113 ( 4) LDA PORT3B ; TOGGLE SPEAKER.
|
|
028D-49 FF I 114 ( 2) EOR #$FF
|
|
028F-8D 00 CC I 115 ( 4) STA PORT3B
|
|
0292-CA I 116 ( 2) NXTUPD DEX ; DECREMENT X FOR NEXT UPDATE.
|
|
0293-10 B5 I 117 (2**) BPL UPDTLP ; IF X >= 0, DO NEXT UPDATE.
|
|
0295-A0 50 I 118 ( 2) LDY #SPDPRM ; DELAY A BIT TO SLOW
|
|
0297-88 I 119 ( 2) WAIT DEY ; FLASHING OF LEDS.
|
|
0298-D0 FD I 120 (2**) BNE WAIT
|
|
029A-A5 05 I 121 ( 3) LDA SPEEDS ; CHECK IF ALL COLUMNS OF LEDS STOPPED.
|
|
029C-05 06 I 122 ( 3) ORA SPEEDS+1
|
|
029E-05 07 I 123 ( 3) ORA SPEEDS+2
|
|
02A0-D0 A6 I 124 (2**) BNE UPDATE ; IF NOT, DO NEXT SEQUENCE OF UPDATES.
|
|
02A2-A9 FF I 125 ( 2) LDA #$FF
|
|
02A4-85 03 I 126 ( 2) STA DUR ; DELAY TO SHOW USER PATTERN.
|
|
02A6-20 33 03 I 127 ( 6) JSR DELAY
|
|
02A9-60 I 128 ( 6) RTS ; ALL LEDS STOPPED, DONE.
|
|
02AA- I 129
|
|
02AA- I 130 ;
|
|
02AA- I 131 ; SUBROUTINE 'EVAL'
|
|
02AA- I 132 ; SUBROUTINE TO EVALUATE PRODUCT OF SPIN, AND DISPLAY SCORE WITH TONES FOR
|
|
02AA- I 133 ; WIN, LOSE, WIN+ENDGAME AND LOST+ENDGAME.
|
|
02AA- I 134 ;
|
|
0020- I 135 HITONE = $20
|
|
00F0- I 136 LOTONE = $F0
|
|
02AA-A9 00 I 137 ( 2) EVAL LDA #0 ; RESET VARIABLES.
|
|
02AC-85 11 I 138 ( 2) STA VALUES
|
|
02AE-85 12 I 139 ( 2) STA VALUES+1
|
|
02B0-85 13 I 140 ( 2) STA VALUES+2
|
|
02B2-85 01 I 141 ( 2) STA SCORTP
|
|
02B4-A0 02 I 142 ( 2) LDY #2 ; SET INDEX Y FOR 3 ITERATIONS TO COUNT # OF
|
|
02B6- I 143 ; LEDS ON IN EACH ROW.
|
|
02B6-B6 0B I 144 ( 4) CNTLP LDX INCR,Y ; CHECK POINTER(Y), ADDING
|
|
02B8-F6 11 I 145 ( 6) INC VALUES,X ; UP # OF LEDS ON IN EACH ROW.
|
|
02BA-88 I 146 ( 2) DEY
|
|
02BB-10 F9 I 147 (2**) BPL CNTLP ; LOOP IF NOT DONE.
|
|
02BD-A2 02 I 148 ( 2) LDX #2 ; SET INDEX X FOR 3 ITERATIONS
|
|
02BF- I 149 ; OF LOOP TO FIND SCORE.
|
|
02BF-8A I 150 ( 2) SCORLP TXA ; MULTIPLY INDEX BY FOUR FOR ARRAY ROW ACCESS.
|
|
02C0-0A I 151 ( 2) ASL A
|
|
02C1-0A I 152 ( 2) ASL A
|
|
02C2-18 I 153 ( 2) CLC ; ADD # OF LEDS ON IN ROW(X) TO...
|
|
02C3-75 11 I 154 ( 4) ADC VALUES,X ; ... ARRIVE AT COLUMN ADDRESS IN ARRAY.
|
|
02C5-A8 I 155 ( 2) TAY ; USE AS INDEX
|
|
02C6-B9 9F 03 I 156 ( 4*) LDA SCORTB,Y ; GET SCORE FOR THIS SPIN.
|
|
02C9-18 I 157 ( 2) CLC
|
|
02CA-65 01 I 158 ( 3) ADC SCORTP ; ADD TO ANY PREVIOUS SCORES
|
|
02CC- I 159 ; ACCUMULATED IN THIS LOOP.
|
|
02CC-85 01 I 160 ( 2) STA SCORTP ; RESTORE
|
|
02CE-CA I 161 ( 2) DEX
|
|
02CF-10 EE I 162 (2**) BPL SCORLP ; LOOP IF NOT DONE
|
|
02D1-A9 60 I 163 ( 2) LDA #$60 ; SET UP DURATIONS FOR TONES.
|
|
02D3-85 03 I 164 ( 2) STA DUR
|
|
02D5-A5 01 I 165 ( 3) LDA SCORTP ; GET SCORE FOR THIS SPIN.
|
|
02D7-F0 34 I 166 (2**) BEQ LOSE ; IF SCORE IS 0, LOSE A POINT.
|
|
02D9-E6 02 I 167 ( 5) WIN INC SCORE ; RAISE OVERALL SCORE BY ONE.
|
|
02DB-A4 02 I 168 ( 3) LDY SCORE ; GET SCORE
|
|
02DD-C0 10 I 169 ( 2) CPY #16 ; WIN WITH 16 POINTS?
|
|
02DF-F0 10 I 170 (2**) BEQ WINEND ; YES; WIN+ENDGAME.
|
|
02E1-20 40 03 I 171 ( 6) JSR LIGHT ; SHOW SCORE
|
|
02E4-A9 20 I 172 ( 2) LDA #HITONE ; PLAY HIGH BEEP.
|
|
02E6-20 67 03 I 173 ( 6) JSR TONE
|
|
02E9-20 33 03 I 174 ( 6) JSR DELAY ; SHORT DELAY.
|
|
02EC-C6 01 I 175 ( 5) DEC SCORTP ; DECREMENT SCORE TO BE ADDED TO...
|
|
02EE- I 176 ; OVERALL SCORE BY ONE.
|
|
02EE-D0 E9 I 177 (2**) BNE WIN ; LOOP IF SCORE TRANSFER NOT COMPLETE.
|
|
02F0-60 I 178 ( 6) RTS ; DONE, RETURN TO MAIN PROGRAM.
|
|
02F1-A9 FF I 179 ( 2) WINEND LDA #$FF ; TURN ALL LEDS ON TO SIGNAL WIN.
|
|
02F3-8D 01 C0 I 180 ( 4) STA PORT1A
|
|
02F6-8D 00 C0 I 181 ( 4) STA PORT1B
|
|
02F9-85 00 I 182 ( 2) STA TEMP ; SET FREQ PARAMETER FOR RISING WARBLE.
|
|
02FB-A9 00 I 183 ( 2) LDA #0
|
|
02FD-85 02 I 184 ( 2) STA SCORE ; CLEAR TO FLAG RESTART.
|
|
02FF-A9 04 I 185 ( 2) LDA #4
|
|
0301-85 03 I 186 ( 2) STA DUR ; SHORT DURATION FOR INDIVIDUAL BEEPS IN WARBLE.
|
|
0303-A5 00 I 187 ( 3) RISE LDA TEMP ; GET FREQUENCY...
|
|
0305-20 67 03 I 188 ( 6) JSR TONE ; ... FOR BEEP.
|
|
0308-C6 00 I 189 ( 5) DEC TEMP ; NEXT BEEP WILL BE HIGHER.
|
|
030A-D0 F7 I 190 (2**) BNE RISE ; DO NEXT BEEP IF NOT DONE.
|
|
030C-60 I 191 ( 6) RTS ; RETURN FOR RESTART.
|
|
030D-C6 02 I 192 ( 5) LOSE DEC SCORE ; IF SPIN BAD, SCORE=SCORE-1
|
|
030F-A4 02 I 193 ( 3) LDY SCORE ; SHOW SCORE
|
|
0311-20 40 03 I 194 ( 6) JSR LIGHT
|
|
0314-A9 F0 I 195 ( 2) LDA #LOTONE ; PLAY LOW LOSE TONE.
|
|
0316-20 67 03 I 196 ( 6) JSR TONE
|
|
0319-A4 02 I 197 ( 3) LDY SCORE ; GET SCORE TO SEE...
|
|
031B-F0 01 I 198 (2**) BEQ LOSEND ; ... IF GAME IS OVER.
|
|
031D-60 I 199 ( 6) RTS ; IF NOT, RETURN FOR NEXT SPIN.
|
|
031E-A9 00 I 200 ( 2) LOSEND LDA #0 ; SET TEMP FOR USE AS FREQUENCY PARAMETER
|
|
0320-85 00 I 201 ( 2) STA TEMP ; IN FALLING WARBLE.
|
|
0322-8D 01 C0 I 202 ( 4) STA PORT1A ; CLEAR LED #1.
|
|
0325-A9 04 I 203 ( 2) LDA #4
|
|
0327-85 03 I 204 ( 2) STA DUR
|
|
0329-A5 00 I 205 ( 3) FALL LDA TEMP
|
|
032B-20 67 03 I 206 ( 6) JSR TONE ; PLAY BEEP.
|
|
032E-E6 00 I 207 ( 5) INC TEMP ; NEXT TONE WILL BE LOWER.
|
|
0330-D0 F7 I 208 (2**) BNE FALL
|
|
0332-60 I 209 ( 6) RTS ; RETURN FOR RESTART.
|
|
0333- I 210
|
|
0333- I 211 ;
|
|
0333- I 212 ; SUBROUTINE 'DELAY'
|
|
0333- I 213 ; VARIABLE LENGHT DELAY SUBROUTINE
|
|
0333- I 214 ; DELAY LENGTH = (2046*[DUR]+10) US.
|
|
0333- I 215 ;
|
|
0333-A4 03 I 216 ( 3) DELAY LDY DUR ; GET DELAY LENGHT.
|
|
0335-A2 FF I 217 ( 2) DL1 LDX #$FF ; SET COUNTER FOR INNER 2040 US. LOOP TO
|
|
0337-D0 00 I 218 (2**) DL2 BNE DL3 ; WASTE TIME.
|
|
0339-CA I 219 ( 2) DL3 DEX ; DECREMENT INNER LOOP COUNTER.
|
|
033A-D0 FB I 220 (2**) BNE DL2 ; LOOP UNTIL INNER LOOP DONE.
|
|
033C-88 I 221 ( 2) DEY ; DECREMENT OUTER LOOP COUNTER.
|
|
033D-D0 F6 I 222 (2**) BNE DL1 ; LOOP UNTIL DONE.
|
|
033F-60 I 223 ( 6) RTS ; RETURN.
|
|
0340- I 224
|
|
0340- I 225 ;
|
|
0340- I 226 ; SUBROUTINE 'LIGHT'
|
|
0340- I 227 ; SUBROUTINE TO LIGHT LEDS CORRESPONDING TO THE CONTENTS OF REGISTER Y ON
|
|
0340- I 228 ; ENTERING.
|
|
0340- I 229 ;
|
|
0340-A9 00 I 230 ( 2) LIGHT LDA #0 ; CLEAR ACCUMULATOR FOR BIT SHIFT.
|
|
0342-85 00 I 231 ( 2) STA TEMP ; CLEAR OVERFLOW FLAG
|
|
0344-8D 01 C0 I 232 ( 4) STA PORT1A ; CLEAR LOW LEDS
|
|
0347-8D 00 C0 I 233 ( 4) STA PORT1B ; CLEAR HIGH LEDS.
|
|
034A-C0 0F I 234 ( 2) CPY #15 ; CODE FOR UNCONNECTED BIT?
|
|
034C-F0 01 I 235 (2**) BEQ LIGHT0 ; IF SO, NO CHANGE.
|
|
034E-88 I 236 ( 2) DEY ; DECREMENT TO MATCH.
|
|
034F-38 I 237 ( 2) LIGHT0 SEC ; SET BIT TO BE SHIFTED HIGH.
|
|
0350-2A I 238 ( 2) LTSHFT ROL A ; SHIFT BIT LEFT.
|
|
0351-90 05 I 239 (2**) BCC LTCC ; IF CARRY SET, OVERFLOW HAS OCCURRED
|
|
0353- I 240 ; INTO HIGH BYTE.
|
|
0353-A2 FF I 241 ( 2) LDX #$FF ; SET OVERFLOW FLAG.
|
|
0355-86 00 I 242 ( 3) STX TEMP
|
|
0357-2A I 243 ( 2) ROL ; MOVE BIT OUT OF CARRY.
|
|
0358-88 I 244 ( 2) LTCC DEY ; ONE LESS BIT TO BE SHIFTED.
|
|
0359-10 F5 I 245 (2**) BPL LTSHFT ; SHIFT AGAIN IF NOT DONE.
|
|
035B-A6 00 I 246 ( 3) LDX TEMP ; GET OVERFLOW FLAG.
|
|
035D-D0 04 I 247 (2**) BNE HIBYTE ; IF FLAG <> 0, OVERFLOW: A CONTAINS HIGH BYTE.
|
|
035F-8D 01 C0 I 248 ( 4) LOBYTE STA PORT1A ; STORE A IN LOW ORDER LEDS.
|
|
0362-60 I 249 ( 6) RTS ; RETURN.
|
|
0363-8D 00 C0 I 250 ( 4) HIBYTE STA PORT1B ; STORE A IN HIGH ORDER LEDS.
|
|
0366-60 I 251 ( 6) RTS ; RETURN.
|
|
0367- I 252
|
|
0367- I 253 ;
|
|
0367- I 254 ; SUBROUTINE 'TONE'
|
|
0367- I 255 ; TONE GENERATION SUBROUTINE.
|
|
0367- I 256 ;
|
|
0367-85 04 I 257 ( 2) TONE STA FREQ
|
|
0369-A9 FF I 258 ( 2) LDA #$FF
|
|
036B-8D 00 CC I 259 ( 4) STA PORT3B
|
|
036E-A9 00 I 260 ( 2) LDA #0
|
|
0370-A6 03 I 261 ( 3) LDX DUR
|
|
0372-A4 04 I 262 ( 3) FL2 LDY FREQ
|
|
0374-88 I 263 ( 2) FL1 DEY
|
|
0375-18 I 264 ( 2) CLC
|
|
0376-90 00 I 265 (2**) BCC FL0
|
|
0378-D0 FA I 266 (2**) FL0 BNE FL1
|
|
037A-49 FF I 267 ( 2) EOR #$FF
|
|
037C-8D 00 CC I 268 ( 4) STA PORT3B
|
|
037F-CA I 269 ( 2) DEX
|
|
0380-D0 F0 I 270 (2**) BNE FL2
|
|
0382-60 I 271 ( 6) RTS
|
|
0383- I 272
|
|
0383- I 273 ;
|
|
0383- I 274 ; SUBROUTINE 'RANDOM'
|
|
0383- I 275 ; RANDOM NUMBER GENERATOR SUBROUTINE.
|
|
0383- I 276 ;
|
|
0383-38 I 277 ( 2) RANDOM SEC
|
|
0384-A5 15 I 278 ( 3) LDA RND+1
|
|
0386-65 18 I 279 ( 3) ADC RND+4
|
|
0388-65 19 I 280 ( 3) ADC RND+5
|
|
038A-85 14 I 281 ( 2) STA RND
|
|
038C-A2 04 I 282 ( 2) LDX #4
|
|
038E-B5 14 I 283 ( 4) RNDSH LDA RND,X
|
|
0390-95 15 I 284 ( 4) STA RND+1,X
|
|
0392-CA I 285 ( 2) DEX
|
|
0393-10 F9 I 286 (2**) BPL RNDSH
|
|
0395-60 I 287 ( 6) RTS
|
|
0396- I 288
|
|
0396- I 289 ;
|
|
0396- I 290 ; ARRAYS
|
|
0396- I 291 ;
|
|
0396- I 292
|
|
0396- I 293 ;
|
|
0396- I 294 ; ARRAY OF PATTERNS TO LIGHT LEDS, ARRAY ROWS CORRESPOND TO COLUMNS OF LED
|
|
0396- I 295 ; ARRAY, AND COLUMNS TO ROWS, FOR EXAMPLE, THIRD BYTE IN ROW ONE WILL LIGHT
|
|
0396- I 296 ; LED 7.
|
|
0396- I 297 ;
|
|
0396-01 08 40 02
|
|
10 80 04 20
|
|
00 I 298 LTABLE .HS 01.08.40.02.10.80.04.20.00
|
|
039F- I 299
|
|
039F- I 300 ;
|
|
039F- I 301 ; ARRAY OF SCORES RECEIVED FOR CERTAIN PATTERS OF LIT LEDS; ROWS CORRESPOND TO
|
|
039F- I 302 ; ROWS IN LED ARRAY. COLUMNS CORRESPOND TO NUMBER OF LEDS LIT IN THAT ROW.
|
|
039F- I 303 ; I.E. 3 LEDS IN MIDDLE ROW IS 3 PTS.
|
|
039F- I 304 ;
|
|
039F-00 00 00 00
|
|
00 00 01 03
|
|
00 00 00 00 I 305 SCORTB .HS 00.00.00.00.00.00.01.03.00.00.00.00
|
|
03AB- 17 .IN ../../common/CH01-Getkey/getkey_routine.asm
|
|
03AB- I 1 ; 'GETKEY' KEYBOARD INPUT ROUTINE READS AND DEBOUNCES KEYBOARD. RETURNS WITH
|
|
03AB- I 2 ; KEY NUMBER IN ACCUMULATOR IF KEY DOWN. OPERATION: SENDS NUMBERS 0-F TO 74154
|
|
03AB- I 3 ; (4 TO 16 LINE DECODER), WHICH GROUNDS ONE SIDE OF KEYSWITCHES ONE AT A TIME.
|
|
03AB- I 4 ; IF A KEY IS DOWN, PA7 OF VIA #3 WILL BE GROUNDED, AND THE CURRENT VALUE
|
|
03AB- I 5 ; APPLIED TO THE 74154 BE THE KEY NUMBER. WHEN THE PROGRAM DETECTS A KEY CLOSE
|
|
03AB- I 6 ; CHECKS FOR KEY CLOSURE FOR 50 MS. TO ELIMINATE BOUNCE.
|
|
03AB- I 7 ; NOTE: IF NO KEY IS PRESSED, GETKEY WILL WAIT.
|
|
03AB- I 8 ;
|
|
03AB-2C 01 CC I 9 ( 4) GETKEY BIT PORT3A ; SEE IF KEY IS STILL DOWN FROM LAST KEY CLOSURE:
|
|
03AE- I 10 ; KEYSTROBE IN 'N' STATUS BIT.
|
|
03AE-10 FB I 11 (2**) BPL GETKEY ; IF YES, WAIT FOR KEY RELEASE
|
|
03B0-A2 0F I 12 ( 2) RSTART LDX #15 ; SET KEY COUNTER TO 15
|
|
03B2-8E 00 CC I 13 ( 4) NXTKEY STX PORT3B ; OUTPUT KEY # TO 74154
|
|
03B5-2C 01 CC I 14 ( 4) BIT PORT3A ; SEE IF KEY DOWN: STROBE IN 'N'
|
|
03B8-10 05 I 15 (2**) BPL BOUNCE ; IF YES, GO DEBOUNCE
|
|
03BA-CA I 16 ( 2) DEX ; DECREMENT KEY #
|
|
03BB-10 F5 I 17 (2**) BPL NXTKEY ; NO, DO NEXT KEY
|
|
03BD-30 F1 I 18 (2**) BMI RSTART ; START OVER
|
|
03BF-8A I 19 ( 2) BOUNCE TXA ; SAVE KEY NUMBER IN A
|
|
03C0-A0 12 I 20 ( 2) LDY #$12 ; OUTER LOOP CNT LOAD FOR DELAY OF 50 MS.
|
|
03C2-A2 FF I 21 ( 2) LP1 LDX #$FF ; INNER 11 US. LOOP
|
|
03C4-2C 01 CC I 22 ( 4) LP2 BIT PORT3A ; SEE IF KEY STILL DOWN
|
|
03C7-30 E7 I 23 (2**) BMI RSTART ; IF NOT, KEY NOT VALID, RESTART
|
|
03C9-CA I 24 ( 2) DEX
|
|
03CA-D0 F8 I 25 (2**) BNE LP2 ; THIS LOOP USES 2115*5 US.
|
|
03CC-88 I 26 ( 2) DEY
|
|
03CD-D0 F3 I 27 (2**) BNE LP1 ; OUTER LOOP: TOTAL IS 50 MS.
|
|
03CF-60 I 28 ( 6) RTS ; DONE: KEY IN A.
|
|
03D0- I 29 ;
|
|
03D0- I 30 ; SUBROUTINE 'INITKEY'
|
|
03D0- I 31 ; TAKES CARE OF INITIALIZING VIA #3 FOR USING WITH THE GETKEY ROUTINE FROM
|
|
03D0- I 32 ; THE CODE.
|
|
03D0- I 33 ;
|
|
03D0-A9 00 I 34 ( 2) INITKEY LDA #0
|
|
03D2-8D 03 CC I 35 ( 4) STA DDR3A ; SET KEY STROBE PORT FOR INPUT
|
|
03D5-A9 FF I 36 ( 2) LDA #$FF
|
|
03D7-8D 02 CC I 37 ( 4) STA DDR3B ; SET KEYS FOR OUTPUT
|
|
03DA-60 I 38 ( 6) RTS
|