aboutsummaryrefslogtreecommitdiffstats
path: root/src/term.asm
diff options
context:
space:
mode:
Diffstat (limited to 'src/term.asm')
-rw-r--r--src/term.asm38
1 files changed, 29 insertions, 9 deletions
diff --git a/src/term.asm b/src/term.asm
index fb6e870..64e45aa 100644
--- a/src/term.asm
+++ b/src/term.asm
@@ -80,10 +80,10 @@ term_init::
xor a
ld [wCurRow], a
ld [wCurCol], a
+ ld [wViewTop], a ; view starts unshifted (all 18 rows)
+ ld [wOskVisible], a ; OSK hidden until toggled
ld a, 1
ld [wCursorOn], a
- xor a
- ld [wViewTop], a ; view starts unshifted (all 18 rows)
; clear the buffer (all slots) to spaces
ld hl, TERM_BUF
@@ -108,6 +108,7 @@ term_init::
; line-slot tiles. Pass 1 = indices (bank 0), pass 2 = attributes (bank 1).
; -----------------------------------------------------------------------------
term_write_tilemap::
+ call compute_offset
xor a
ld [rVBK], a
ld c, 0 ; screen row
@@ -494,18 +495,37 @@ cursor_down:
inc a
cp TROWS
jr c, .ok
- call term_scroll
+ call term_scroll ; rewrites the tilemap (offset recomputed)
ld a, TROWS-1
-.ok
ld [wCurRow], a
ret
+.ok
+ ld [wCurRow], a
+ ; the cursor changed rows; if the OSK is up the view offset may need to move
+ ld a, [wOskVisible]
+ or a
+ ret z
+ jp term_write_tilemap
-; term_set_view - A = view-top offset. screen row -> logical row + A. 0 shows all
-; 18 rows; OSK_ROWS shifts the view up so the cursor line clears the keyboard.
-; No content is scrolled/lost - just remapped.
-term_set_view::
+; compute_offset - set wViewTop so the cursor line is always on screen: 0 when
+; the OSK is hidden; otherwise max(0, wCurRow - 14) so the cursor sits at the
+; bottom visible row (14) once the terminal has filled past it, but stays put
+; while there is little content (no shifting the cursor off the top).
+compute_offset::
+ ld a, [wOskVisible]
+ or a
+ jr nz, .osk
+ xor a
ld [wViewTop], a
- jp term_write_tilemap
+ ret
+.osk
+ ld a, [wCurRow]
+ sub TROWS - OSK_DOCK - 1 ; wCurRow - 14
+ jr nc, .store
+ xor a ; cursor above row 14 -> no shift
+.store
+ ld [wViewTop], a
+ ret
; -----------------------------------------------------------------------------
; term_putc - A = character. Print at the cursor, advance, handle \n \r \b.