It was a bad idea and having sms/pad interact directly with sms/vdp is much simpler. ref #64pull/75/head
@@ -42,14 +42,12 @@ | |||
; Places where we store arguments specifiers and where resulting values are | |||
; written to after parsing. | |||
.equ SHELL_CMD_ARGS SHELL_MEM_PTR+2 | |||
.equ SHELL_CMD_ARGS @+2 | |||
; Pointer to a hook to call when a cmd name isn't found | |||
.equ SHELL_CMDHOOK SHELL_CMD_ARGS+PARSE_ARG_MAXCOUNT | |||
.equ SHELL_CMDHOOK @+PARSE_ARG_MAXCOUNT | |||
; Pointer to a routine to call at each shell loop iteration | |||
.equ SHELL_LOOPHOOK SHELL_CMDHOOK+2 | |||
.equ SHELL_RAMEND SHELL_LOOPHOOK+2 | |||
.equ SHELL_RAMEND @+2 | |||
; *** CODE *** | |||
shellInit: | |||
@@ -58,7 +56,6 @@ shellInit: | |||
ld (SHELL_MEM_PTR+1), a | |||
ld hl, noop | |||
ld (SHELL_CMDHOOK), hl | |||
ld (SHELL_LOOPHOOK), hl | |||
; print welcome | |||
ld hl, .welcome | |||
@@ -70,10 +67,7 @@ shellInit: | |||
; Inifite loop that processes input. Because it's infinite, you should jump | |||
; to it rather than call it. Saves two precious bytes in the stack. | |||
shellLoop: | |||
; First, call the loop hook | |||
ld ix, (SHELL_LOOPHOOK) | |||
call callIX | |||
; Then, let's wait until something is typed. | |||
; Let's wait until a line is typed. | |||
call stdioReadC | |||
jr nz, shellLoop ; not done? loop | |||
; We're done. Process line. | |||
@@ -11,6 +11,9 @@ | |||
; The space character is the first among special chars. | |||
; * C confirms letter selection | |||
; | |||
; This module is currently hard-wired to sms/vdp, that is, it calls vdp's | |||
; routines during padGetC to update character selection. | |||
; | |||
; *** Consts *** | |||
; | |||
.equ PAD_CTLPORT 0x3f | |||
@@ -29,21 +32,18 @@ | |||
; | |||
; Button status of last padUpdateSel call. Used for debouncing. | |||
.equ PAD_SELSTAT PAD_RAMSTART | |||
; Button status of last padGetC call. | |||
.equ PAD_GETCSTAT PAD_SELSTAT+1 | |||
; Current selected character | |||
.equ PAD_SELCHR PAD_GETCSTAT+1 | |||
.equ PAD_SELCHR @+1 | |||
; When non-zero, will be the next char returned in GetC. So far, only used for | |||
; LF that is feeded when Start is pressed. | |||
.equ PAD_NEXTCHR PAD_SELCHR+1 | |||
.equ PAD_RAMEND PAD_NEXTCHR+1 | |||
.equ PAD_NEXTCHR @+1 | |||
.equ PAD_RAMEND @+1 | |||
; *** Code *** | |||
padInit: | |||
ld a, 0xff | |||
ld (PAD_SELSTAT), a | |||
ld (PAD_GETCSTAT), a | |||
xor a | |||
ld (PAD_NEXTCHR), a | |||
ld a, 'a' | |||
@@ -78,14 +78,14 @@ padStatus: | |||
ret | |||
; From a pad status in A, update current char selection and return it. | |||
; Returns the same Z as padStatus: set if unchanged, unset if changed | |||
; Sets Z if current selection was unchanged, unset if changed. | |||
padUpdateSel: | |||
call padStatus | |||
push hl | |||
push hl ; --> lvl 1 | |||
ld hl, PAD_SELSTAT | |||
cp (hl) | |||
ld (hl), a | |||
pop hl | |||
pop hl ; <-- lvl 1 | |||
jr z, .nothing ; nothing changed | |||
bit PAD_UP, a | |||
jr z, .up | |||
@@ -156,45 +156,51 @@ padUpdateSel: | |||
ld (PAD_SELCHR), a | |||
jp unsetZ | |||
.nothing: | |||
cp a ; ensure Z | |||
; Z already set | |||
ld a, (PAD_SELCHR) | |||
ret | |||
; Repeatedly poll the pad for input and returns the resulting "input char". | |||
; This routine takes a long time to return because it waits until C, B or Start | |||
; was pressed. Until this is done, this routine takes care of updating the | |||
; "current selection" directly in the VDP. | |||
padGetC: | |||
ld a, (PAD_NEXTCHR) | |||
or a | |||
jr nz, .nextchr | |||
call padStatus | |||
push hl | |||
ld hl, PAD_GETCSTAT | |||
cp (hl) | |||
ld (hl), a | |||
pop hl | |||
jp z, unsetZ ; nothing changed | |||
call padUpdateSel | |||
jp z, padGetC ; nothing changed, loop | |||
; pad status was changed, let's see if an action button was pressed | |||
ld a, (PAD_SELSTAT) | |||
bit PAD_BUTC, a | |||
jr z, .advance | |||
bit PAD_BUTA, a | |||
jr z, .backspace | |||
bit PAD_START, a | |||
jr z, .return | |||
jp unsetZ | |||
; no action button pressed, but because our pad status changed, update | |||
; VDP before looping. | |||
ld a, (PAD_SELCHR) | |||
call vdpConv | |||
call vdpSpitC | |||
jp padGetC | |||
.return: | |||
ld a, ASCII_LF | |||
ld (PAD_NEXTCHR), a | |||
; continue to .advance | |||
.advance: | |||
ld a, (PAD_SELCHR) | |||
cp a | |||
; Z was already set from previous BIT instruction | |||
ret | |||
.backspace: | |||
ld a, ASCII_BS | |||
cp a | |||
; Z was already set from previous BIT instruction | |||
ret | |||
.nextchr: | |||
; We have a "next char", return it and clear it. | |||
cp a ; ensure Z | |||
push af | |||
ex af, af' | |||
xor a | |||
ld (PAD_NEXTCHR), a | |||
pop af | |||
ex af, af' | |||
ret |
@@ -21,11 +21,8 @@ | |||
; Row of cursor | |||
.equ VDP_ROW VDP_RAMSTART | |||
; Line of cursor | |||
.equ VDP_LINE VDP_ROW+1 | |||
; Returns, in A, the currently selected char in a "pad char selection" scheme. | |||
.equ VDP_CHRSELHOOK VDP_LINE+1 | |||
.equ VDP_LASTSEL VDP_CHRSELHOOK+2 | |||
.equ VDP_RAMEND VDP_LASTSEL+1 | |||
.equ VDP_LINE @+1 | |||
.equ VDP_RAMEND @+1 | |||
; *** Code *** | |||
@@ -33,9 +30,6 @@ vdpInit: | |||
xor a | |||
ld (VDP_ROW), a | |||
ld (VDP_LINE), a | |||
ld (VDP_LASTSEL), a | |||
ld hl, noop | |||
ld (VDP_CHRSELHOOK), hl | |||
ld hl, vdpInitData | |||
ld b, vdpInitDataEnd-vdpInitData | |||
@@ -121,12 +115,6 @@ vdpSpitC: | |||
ret | |||
vdpPutC: | |||
; First, let's invalidate last sel | |||
ex af, af' | |||
xor a | |||
ld (VDP_LASTSEL), a | |||
ex af, af' | |||
; Then, let's place our cursor. We need to first send our LSB, whose | |||
; 6 low bits contain our row*2 (each tile is 2 bytes wide) and high | |||
; 2 bits are the two low bits of our line | |||
@@ -267,26 +255,6 @@ vdpConv: | |||
ld a, 0x5e | |||
ret | |||
; During the shell loop, updates the currently selected char, if appropriate | |||
vdpShellLoopHook: | |||
push af | |||
push ix | |||
push hl | |||
xor a | |||
ld ix, (VDP_CHRSELHOOK) | |||
call callIX | |||
ld hl, VDP_LASTSEL | |||
cp (hl) | |||
jr z, .noChange | |||
; selection changed | |||
call vdpConv | |||
call vdpSpitC | |||
.noChange: | |||
pop hl | |||
pop ix | |||
pop af | |||
ret | |||
vdpPaletteData: | |||
.db 0x00,0x3f | |||
vdpPaletteDataEnd: | |||
@@ -33,15 +33,11 @@ init: | |||
call padInit | |||
call vdpInit | |||
ld hl, padUpdateSel | |||
ld (VDP_CHRSELHOOK), hl | |||
ld hl, padGetC | |||
ld de, vdpPutC | |||
call stdioInit | |||
call shellInit | |||
ld hl, vdpShellLoopHook | |||
ld (SHELL_LOOPHOOK), hl | |||
jp shellLoop | |||
.fill 0x7ff0-$ | |||