mirror of
https://github.com/UzixLS/zx-sizif-xxs.git
synced 2025-07-19 07:11:28 +03:00

* add 4.4 MHz and 5.2 MHz turbo modes * handle magic key press if initialization wasn't completed before * replace 'timings', 'ram', 'plus3' settings with one 'machine' setting * refactor memory controller * significantly improve classic timings * magic rom: fix 'h' font character * fix hanging of esxdos browser after magic key double press * enable divmmc (esxdos OS) by magic rom on poweron; add NO-OS option * improve pause ('f12' on ps/2 keyboard or 'start' on gamepad) * magic rom: handle C-key on sega gamepad as exit
190 lines
4.9 KiB
NASM
190 lines
4.9 KiB
NASM
; OUT - A - 0 - no key, 32 - exit, 16 - action, 8 - up, 4 - down, 2 - left, 1 - right
|
|
input_key_get:
|
|
ld a, (var_input_key)
|
|
ret
|
|
|
|
|
|
; OUT - B - {0, action, up, down, left, right}
|
|
; OUT - AF - garbage
|
|
; OUT - C - garbage
|
|
input_read:
|
|
ld b, 0
|
|
.kempston:
|
|
ld a, #ff ; read kempston
|
|
in a, (#1f) ; ...
|
|
bit 7, a ; detect presence by 7th bit
|
|
jr nz, .enter ; ...
|
|
and #3f ; mask useless bits
|
|
ld b, a ; ...
|
|
.enter:
|
|
ld a, #bf ; read keys
|
|
in a, (#fe) ; ...
|
|
bit 0, a ; handle Enter (ACTION) key
|
|
jr nz, .qwert ; ...
|
|
set 4, b ; ...
|
|
ret
|
|
.qwert:
|
|
ld a, #fb ; read keys
|
|
in a, (#fe) ; ...
|
|
bit 0, a ; handle Q (UP) key
|
|
jr nz, .asdfg ; ...
|
|
set 3, b ; ...
|
|
ret
|
|
.asdfg:
|
|
ld a, #fd ; read keys
|
|
in a, (#fe) ; ...
|
|
bit 0, a ; handle A (DOWN) key
|
|
jr nz, .poiuy ; ...
|
|
set 2, b ; ...
|
|
ret
|
|
.poiuy:
|
|
ld a, #df ; read keys
|
|
in a, (#fe) ; ...
|
|
bit 0, a ; handle P (RIGHT) key
|
|
jr nz, .poiuy1 ; ...
|
|
set 0, b ; ...
|
|
ret
|
|
.poiuy1:
|
|
bit 1, a ; handle O (LEFT) key
|
|
jr nz, .cszxcv ; ...
|
|
set 1, b ; ...
|
|
ret
|
|
.cszxcv:
|
|
ld a, #fe ; read keys
|
|
in a, (#fe) ; ...
|
|
bit 0, a ; handle CS key. if pressed - assume cursor key. else - assume sinclair joystick
|
|
jr z, .space_break ; ...
|
|
.space:
|
|
ld a, #7f ; read keys
|
|
in a, (#fe) ; ...
|
|
bit 0, a ; handle Space (ACTION) key
|
|
jr nz, .sinclair_09876 ; ...
|
|
set 4, b ; ...
|
|
ret
|
|
.sinclair_09876:
|
|
ld a, #ef ; read keys
|
|
in a, (#fe) ; ...
|
|
bit 0, a ; handle 0 (ACTION) key
|
|
jr nz, .sinclair_09876_9 ; ...
|
|
set 4, b ; ...
|
|
ret
|
|
.sinclair_09876_9:
|
|
bit 1, a ; handle 9 (UP) key
|
|
jr nz, .sinclair_09876_8 ; ...
|
|
set 3, b ; ...
|
|
ret
|
|
.sinclair_09876_8:
|
|
bit 2, a ; handle 8 (DOWN) key
|
|
jr nz, .sinclair_09876_7 ; ...
|
|
set 2, b ; ...
|
|
ret
|
|
.sinclair_09876_7:
|
|
bit 3, a ; handle 7 (RIGHT) key
|
|
jr nz, .sinclair_09876_6 ; ...
|
|
set 0, b ; ...
|
|
ret
|
|
.sinclair_09876_6:
|
|
bit 4, a ; handle 6 (LEFT) key
|
|
jr nz, .sinclair_ssmnb ; ...
|
|
set 1, b ; ...
|
|
ret
|
|
.sinclair_ssmnb:
|
|
ld a, #7f ; read keys
|
|
in a, (#fe) ; ...
|
|
bit 2, a ; handle M (EXIT) key (in Sinclair mode sega C button is mapped to M)
|
|
jr nz, .return ; ...
|
|
set 5, b ; ...
|
|
ret
|
|
.space_break:
|
|
ld a, #7f ; read keys
|
|
in a, (#fe) ; ...
|
|
bit 0, a ; handle Space (EXIT) key
|
|
jr nz, .cursor_09876_7 ; ...
|
|
set 5, b ; ...
|
|
ret
|
|
.cursor_09876_7:
|
|
ld a, #ef ; read keys
|
|
in a, (#fe) ; ...
|
|
bit 3, a ; handle 7 (UP) key
|
|
jr nz, .cursor_09876_6 ; ...
|
|
set 3, b ; ...
|
|
ret
|
|
.cursor_09876_6:
|
|
bit 4, a ; handle 6 (DOWN) key
|
|
jr nz, .cursor_09876_8 ; ...
|
|
set 2, b ; ...
|
|
ret
|
|
.cursor_09876_8:
|
|
bit 2, a ; handle 8 (RIGHT) key
|
|
jr nz, .cursor_12345_5 ; ...
|
|
set 0, b ; ...
|
|
ret
|
|
.cursor_12345_5:
|
|
ld a, #f7 ; read keys
|
|
in a, (#fe) ; ...
|
|
bit 4, a ; handle 5 (LEFT) key
|
|
jr nz, .return ; ...
|
|
set 1, b ; ...
|
|
ret
|
|
.return:
|
|
ret
|
|
|
|
|
|
; IN - A - current pressed key
|
|
; OUT - AF - garbage
|
|
; OUT - BC - garbage
|
|
input_beep:
|
|
or a
|
|
ret z
|
|
IFDEF TEST_BUILD
|
|
ld a, #10 ; blink border
|
|
out (#fe), a ; ...
|
|
ENDIF
|
|
xor a ; blink border
|
|
ld bc, #01ff ; ...
|
|
out (c), a ; ...
|
|
ld b, INPUT_BEEP_DELAY
|
|
.loop:
|
|
djnz .loop
|
|
ld a, 1 ; blink border back
|
|
ld bc, #01ff ; ...
|
|
out (c), a ; ...
|
|
ret
|
|
|
|
|
|
; OUT - B - current pressed key mask
|
|
; OUT - AF - garbage
|
|
; OUT - C - garbage
|
|
input_process:
|
|
call input_read ; read keys
|
|
ld a, (var_input_key_last) ;
|
|
cp b ; if (current_pressed_key == last_pressed_key) {input_key = current_pressed_key; timer = X}
|
|
jr z, .repeat ; ...
|
|
ld a, b ;
|
|
ld (var_input_key), a ; input_key = current_pressed_key
|
|
ld (var_input_key_last), a ; last_pressed_ley = current_pressed_key
|
|
call input_beep
|
|
ld a, INPUT_REPEAT_FIRST ; timer = INPUT_REPEAT_FIRST
|
|
ld (var_input_key_hold_timer), a ; ...
|
|
ret
|
|
.repeat:
|
|
ld a, (var_input_key_hold_timer) ; ...
|
|
dec a ; timer--
|
|
jr nz, .repeat_wait ; if (timer == 0) input_key = current_pressed_key
|
|
ld a, (var_input_key_last) ; ...
|
|
ld (var_input_key), a ; ...
|
|
call input_beep
|
|
ld a, INPUT_REPEAT ; timer = INPUT_REPEAT
|
|
ld (var_input_key_hold_timer), a ; ...
|
|
ret
|
|
.repeat_wait:
|
|
ld (var_input_key_hold_timer), a ; timer--
|
|
xor a ; input_key = none
|
|
ld (var_input_key), a ; ...
|
|
ret
|
|
|
|
|
|
;var_input_key: DB 0
|
|
;var_input_key_last: DB 0
|
|
;var_input_key_hold_timer: DB 0
|