From 7d412a05b2eb563f268d81387be0dacd1b77cac2 Mon Sep 17 00:00:00 2001 From: "B. Watson" Date: Sat, 2 Jan 2016 21:35:39 -0500 Subject: leave title screen showing while loading (not quite right yet) --- timed_getch.s | 108 +++++++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 96 insertions(+), 12 deletions(-) (limited to 'timed_getch.s') diff --git a/timed_getch.s b/timed_getch.s index 8675290..a5ac4d5 100644 --- a/timed_getch.s +++ b/timed_getch.s @@ -1,26 +1,110 @@ - .export _timed_getch, _set_jiffy_timer - .import _cgetc + .export _timed_getch, _set_jiffy_timer, _agetc, _numgetc, _yngetc, _lcgetc + .import _cgetc, _cblank -_set_jiffy_timer: - sei - sta 540 - stx 541 + .include "atari.inc" + +_set_jiffy_timer: ; called by jsleep() also. + sei ; disable IRQ while setting timer + sta CDTMV3 + stx CDTMV3+1 cli rts _timed_getch: jsr _set_jiffy_timer wait4key: - lda 540 - ora 541 - beq done - ldx 764 - inx + lda CDTMV3 ; has timer counted down to 0? + ora CDTMV3+1 + beq done ; yes, return(-1) + lda CH ; no, check for a keypress + ; ...but don't let the capslock or inverse keys count + ; as a keypress, here. + + cmp #$ff ; no key pressed + beq wait4key + and #$3f ; mask shift/control bits + cmp #$3c ; caps-lock + beq wait4key + cmp #$27 ; inverse (atari) key beq wait4key - jmp _cgetc + jmp _agetc ; user hit a key, read it. + done: lda #$ff ; return -1 tax rts + +; _agetc removes the inverse-video bit, and if +; a control key is pressed, it turns it into the non-control version +; (e.g. ^A = lowercase a). Keys that can't be mapped to regular ASCII +; (such as clear, delete, escape) are replaced with a space. +; extern char lcgetc(); +_agetc: +; lda #0 ; show cursor +; sta CRSINH +; lda #$20 +; jsr _cblank + + jsr _cgetc ; get ATASCII code of keypress + + ; special cases + cmp #$9b ; enter key, return as-is + beq ok + cmp #$7e ; backspace + beq ok + + ; everything else + and #$7f ; strip bit 7 (inverse) + bne notnull + lda #$20 ; map null (heart, ctrl-,) to space +notnull: + cmp #$20 + bcs notcontrol + ora #$60 ; 1 - 31 map to 96 - 127 +notcontrol: + cmp #$7c ; | (pipe, vertical bar) allowed as-is. + beq ok + cmp #$7a ; rest of range $7b - $7f is unmappable. + bcc ok ; (remember, $7e, backspace, was handled above) + lda #$20 +ok: +; ldx #$01 ; hide cursor +; stx CRSINH + rts + +_lcgetc: + jsr _agetc + cmp #'A' + bcc ok + cmp #'Z'+1 + bcs ok + eor #$20 ; lowercase it + bcc ok + +_numgetc: + jsr _agetc + cmp #$9b + beq ok + cmp #$7e + beq ok + cmp #$61 ; allow 'a' for "all" + beq ok + cmp #'0' + bcc _numgetc + cmp #'9'+1 + bcc ok + bcs _numgetc + +_yngetc: + sta FR0 ; stash default arg + jsr _lcgetc + cmp #'y' ; return y or n immediately + beq ok + cmp #'n' + beq ok + lda FR0 ; otherwise, check for default arg + beq _yngetc ; no default, get another keypress + rts ; else return the default + -- cgit v1.2.3