; first draft keyboard reading routine to replace some BASIC
;
; Kempston mouse and joystick not implemented yet
; DEBUG CODE - PRESS 0 TO RETURN TO BASIC
; Q,A,O,P move cursor
; SPACE, ENTER, 1 and 0 are detected and indicated
; K and J alter cursor speed
;
org 30000 ; everyone has to start somewhere
jp _init ; for ease of use in BASIC, we're going to keep
; our variables at the start of the routine, so
; jump up out of the way, this is probably sub-optimal
;
action defb 0 ; we store our 'action' indicator
xpos defb 128, 0 ; have 2 bytes to make BC printing easy for now
ypos defb 88, 0 ; have 2 bytes to make BC printing easy for now
speed defb 1, 0 ; have 2 bytes to make BC printing easy for now
;
;
; screen init code
; ================
_init : ld a, 71 ; black paper, white ink
ld (23693), a ; save attribs
xor a ; a = 0
call 8859 ; clear the screen
call 3503 ; setup channel 2
;
;
; main code
; =========
_mainloop: xor a ; a = 0
ld (action), a ; reset our action indicator
ld bc, 57342 ; keyrow for Y-P
in a,(c) ; get value
push af ; save it so we don't need to re-read in a moment
cp 190 ; P key pressed?
call z, moveright ; move cursor right
pop af ; get action back
cp 189 ; O key pressed?
call z, moveleft ; move cursor left
ld bc, 64510 ; keyrow for Q-T
in a,(c) ; get value
cp 190 ; Q key pressed?
call z, movedown ; move cursor down (towards origin)
ld bc, 65022 ; keyrow for A-G
in a,(c) ; get value
cp 190 ; A key pressed?
call z, moveup ; move cursor up
; ideally the following keys would be debounced
; or whatever, so there was no auto-repeat going on
; or at least there was a delay between repeats
ld bc, 32766 ; keyrow for B-SPACE
in a,(c) ; get value
cp 190 ; SPACE key pressed?
call z, spacehit ; update action
ld bc, 63486 ; keyrow for 1-5
in a,(c) ; get value
cp 190 ; 1 key pressed?
call z, onehit ; update action
ld bc, 61438 ; keyrow for 6-0
in a,(c) ; get value
cp 190 ; 0 key pressed?
call z, zerohit ; update action
ld bc, 49150 ; keyrow for H-ENTER
in a,(c) ; get value
push af ; save it
cp 190 ; ENTER key pressed?
call z, enterhit ; update action
pop af ; get it back
push af ; and save it again
cp 187 ; K key pressed? (+) symbol
call z, speedup ; speed up cursor
pop af ; get action value again
cp 183 ; J key pressed? (-) symbol
call z, speeddown ; slow down cursor
;
; start debug code
; ================
; debugging - in final routine, we'd loop around
; until the action code!=0, at which point we'd RET
; to let BASIC handle things. But for now we're just
; blindy plotting, printing to the screen and looping forever
; until 0 key is pressed
;
_plot ld a, (ypos) ; crappy hack to easily plot the pixel
ld b, a ;
ld a, (xpos) ;
ld c, a ;
call 8937 ; ROM PLOT - not the entry point, assumes BC setup
;
_print: ld a, 22 ; now print at 0, 0
rst 16 ;
ld a, 0 ;
rst 16 ;
ld a, 0 ;
rst 16 ;
ld bc, (xpos) ; get the xpos value (xpos in C, B is 0)
call 6683 ; print BC
ld a, 44 ; and a comma
rst 16 ;
ld bc, (ypos) ; get the ypos value (ypos in C, B is 0)
call 6683 ; print BC
ld a, 32 ; and print 2 trailing spaces
rst 16 ;
ld a, 32 ;
rst 16 ;
ld a, 22 ; now, print at 1, 0
rst 16 ;
ld a, 1 ;
rst 16 ;
ld a, 0 ;
rst 16 ;
ld bc, (speed) ; get the speed value (speed in C, B is 0)
call 6683 ; print BC
ld a, 32 ; and print a trailing space
rst 16 ;
ld a, 22 ; print at 2, 0
rst 16 ;
ld a, 2 ;
rst 16 ;
ld a, 0 ;
rst 16 ;
ld a, (action) ; get the action value
add a, 48 ; normalise it (0='0', 1='1' etc)
rst 16 ; print it
;
ld a, (action) ; get the action value
cp 6 ; if it was 6 (zero pressed)
ret z ; then we return to basic
; otherwise
halt ; wait for an interrupt
jp _mainloop ; go back to the top
;
; end debug code
; ==============
;
;
; subroutines
; ===========
;
speeddown: ld a, (speed) ; fetch the speed
dec a ; subtract 1
jr nz, savespeed ; if this is still >0, we're good to save it
ret
speedup: ld a, (speed) ; fetch the speec
inc a ; add 1
cp 11 ; we're good as long as its <=10
jr nz, savespeed ; so save it
ret
savespeed: ld (speed), a ; save A back into the speed var
ld a, 2 ; action code = 2
ld (action), a ; save action code
ret
enterhit: ld a, 3 ; action code = 3
ld (action), a ; save action code
ret
spacehit: ld a, 4 ; action code = 4
ld (action), a ; save action code
ret
onehit: ld a, 5 ; action code = 5
ld (action), a ; save action code
ret
zerohit: ld a, 6 ; action code = 6
ld (action), a ; save action code
ret
moveright: ld a, (xpos) ; fetch the current xpos in A
ld hl, speed ; get speed address into HL
ld c, (hl) ; load C with speed
add a, c ; add C to A
jr nc, savex ; if it's not overflowed, we're good to save
ret ; ignore event
moveleft: ld a, (xpos) ; fetch current xpos in A
ld hl, speed ; get speed address into HL
ld c, (hl) ; load C with speed
sub c ; subtract C from A
jr nc, savex ; if not underflow, we're good to save
ret ; ignore event
moveup: ld a, (ypos) ; get ypos into A
ld hl, speed ; get speed address in HL
ld c, (hl) ; get speed in C
sub c ; subtract C from A
jr nc, savey ; if no underflow, we're good to save
ret ; ignore event
movedown: ld a, (ypos) ; get ypos into A
ld hl, speed ; and get speed adddress in HL
ld c, (hl) ; get speed into C
add a, c ; add C to A
cp 176 ; compare 176
jr c, savey ; if A <176 we can save it
ret ; ignore event
savey: ld (ypos), a ; save A back into ypos
jr commoncur ; go and save it etc
savex: ld (xpos), a ; save A back into xpos
; drop thru into commoncur code
commoncur: ld a, 7 ; action code for cursor move = 7
ld (action), a ; update action code
ret
Comments
0 B
|👍
/👎
0 B
|👍
/👎