RC-Project-Board/projects/GB-001 Game Board/software/common/CH06-Spinner/game.asm
Tor-Eirik Bakke Lunde 6befe9076f Chapter 7
2020-03-07 15:38:00 +01:00

116 lines
4.2 KiB
NASM

; 'SPINNER'
; PROGRAM TO TEST REACTION TIME OF PLAYER. BLIP OF LIGHT SPINS AROUND EDGE OF
; 3X3 LED MATRIX, AND USER MUST PRESS CORRESPONDING KEY. IF, AFTER A NUMBER OF
; SPINS, CORRECT KEY HAS NOT BEEN PRESSED, BLIP SPINS SLOWER. IF CORRECT KEY
; HAS BEEN PRESSED, BLIP SPINS FASTER. ALL LEDS LIGHT WHEN SUCCESSFUL KEYPRESS
; OCCURS ON MAXIMUM SPEED.
;
; 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
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
DURAT .EQ ZP ; DURATION OF INTER-MOVEMENT DELAY.
DIFCLT .EQ ZP+1 ; DIFFICULTY LEVEL.
DNTST .EQ ZP+2 ; SET TO $01 IF KEY DOWN AT START OF
; INTER-MOVEMENT DELAY.
;
; MAIN PROGRAM
;
START LDA #$FF ; SET I/O REGISTERS.
STA DDR1A
STA DDR1B
STA DDR3B
LDA #8
STA DIFCLT ; SET DIFFICULTY
STA DDR3A ; SET KEYSTROBE PORT.
NWGME LDY #0 ; RESET LOOP/BLIP COUNTER.
LOOP LDA #0
STA DNTST ; CLEAR KEYDOWN INDICATOR.
STA PORT1B ; CLEAR HI LED PORT.
TYA ; USE LOWER 3 BITS OF MAIN COUNTER
AND #$07 ; AS INDEX TO FIND LED PATTERN
TAX ; IN TABLE OF PATTERNS.
LDA LTABLE,X ; GET PATTERN FOR LED TO BE TURNED ON
STA PORT1A ; STORE IN LED PORT.
BNE CHECK ; IF PATTERN <> 0, SKIP.
LDA #1 ; PATTERN=0, SO SET HI BIT.
STA PORT1B
CHECK LDA KYTBL,X ; GET KEY# TO TEST FOR.
STA PORT3B ; STORE IN KEYPORT
BIT PORT3A ; STROBE HI?
BMI DELAY ; IF NOT, SKIP.
INVALD LDA #01 ; STROBE HI; SET KEY DOWN MARKER.
STA DNTST
DELAY LDA #$80 ; GET # OF LOOP CYCLES (DELAY LENGTH)
STA DURAT
DL1 LDA DIFCLT ; MULTIPLY DIFFICULTY COUNTER
ASL A ; BY FOUR TO DETERMINE DELAY
ASL A ; LENGTH.
TAX
DL2 ROL DNTST ; DELAY ACCORDING TO DIFCLT.
ROR DNTST
DEX
BNE DL2 ; LOOP UNTIL COUNT = 0
LDA DNTST ; GET KEY DOWN FLAG.
BNE NOTST ; IF KEY WAS DOWN AT BEGINNING OF
; DELAY, DON'T TEST IT.
BIT PORT3A ; CHECK KEY STROBE
BPL HIT ; KEY HAS CLOSED DURING DELAY: HIT.
NOTST DEC DURAT ; COUNT DELAY LOOP DOWN.
BNE DL1 ; LOOP IF NOT 0.
INY ; INCREMENT MAIN SPIN COUNTER.
BNE LOOP ; IF 32 LOOPS NOT DONE, DO NEXT LOOP EASIER
LDX DIFCLT ; NO HITS THIS TIME, MAKE NEXT EASIER.
INX
TXA ; MAKE SURE DIFFICULTY DOES NOT
CMP #16 ; EXCEED 15.
BNE OK
LDA #15
OK STA DIFCLT
JSR WAIT ; PAUSE A BIT
JMP NWGME ; START NEW ROUND.
HIT JSR WAIT ; PAUSE A BIT.
DEC DIFCLT ; MAKE NEXT GAME HARDER.
BNE NWGME ; IF DIFFICULTY NOT 0 (HARDEST), PLAY NEXT GAME.
LDA #$FF ; PLAYER HAS MADE IT TO TOP
STA PORT1A ; DIFFICULTY LEVEL, LIGHT ALL LEDS.
STA PORT1B
JSR WAIT ; PAUSE A BIT.
JMP START ; PLAY ANOTHER GAME.
;
; SUBROUTINE 'WAIT'
; SHORT DELAY.
;
WAIT LDY #$FF
LP1 LDX #$FF
LP2 ROR DURAT
ROL DURAT
ROR DURAT
ROL DURAT
DEX
BNE LP2
DEY
BNE LP1
RTS
;
; TABLE OF PATTERNS TO BE SENT TO LED MATRIX AT EACH LOOP COUNTM SET FOR
; CLOCKWISE ROTATION STARTING AT LED #1.
;
LTABLE .HS 01.02.04.20.00.80.40.08
;
; TABLE OF PATTERNS TO BE SENT TO KEYBOARD TO TEST IF LEDS ARE ON AT EACH
; LOOP COUNT.
;
KYTBL .HS 01.02.03.06.09.08.07.04