From 511a30715f4c5dd1f6f6f0e36d4624c27cad0a7d Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sun, 23 Aug 2020 20:28:06 +0200 Subject: [PATCH] started work on VIC-IV cursor --- src/aliases/,aliases_cpu.s | 9 ++ src/kernal/board_m65/mega65_imports.s | 2 + .../interrupts/ea31.default_irq_handler.s | 2 +- src/kernal/screen/cursor.s | 12 ++- src/kernal/screen_m65/mega65_chrout_screen.s | 7 +- src/kernal/screen_m65/mega65_cursor.s | 32 ++++++- src/kernal/screen_m65/mega65_cursor_blink.s | 93 +++++++++++++++++++ .../screen_m65/mega65_screen_table_roff_hi.s | 13 +++ .../screen_m65/mega65_screen_table_roff_lo.s | 13 +++ ...n_tables.s => mega65_screen_tables_misc.s} | 16 ---- 10 files changed, 175 insertions(+), 24 deletions(-) create mode 100644 src/kernal/screen_m65/mega65_cursor_blink.s create mode 100644 src/kernal/screen_m65/mega65_screen_table_roff_hi.s create mode 100644 src/kernal/screen_m65/mega65_screen_table_roff_lo.s rename src/kernal/screen_m65/{mega65_screen_tables.s => mega65_screen_tables_misc.s} (61%) diff --git a/src/aliases/,aliases_cpu.s b/src/aliases/,aliases_cpu.s index f1ad4b98..ddaee704 100644 --- a/src/aliases/,aliases_cpu.s +++ b/src/aliases/,aliases_cpu.s @@ -338,6 +338,15 @@ // Flat memory access support +.pseudocommand lda_lp arg { + .var value = arg.getValue() + .var type = arg.getType() + .if(type != AT_IZEROPAGEZ) .error "'lda_lp' only accepts AT_IZEROPAGEZ" + .if(value > $FF ) .error "'lda_lp' requires zeropage address" + nop + .byte $B2, value +} + .pseudocommand sta_lp arg { .var value = arg.getValue() .var type = arg.getType() diff --git a/src/kernal/board_m65/mega65_imports.s b/src/kernal/board_m65/mega65_imports.s index bb9c3d10..1bd3fb2a 100644 --- a/src/kernal/board_m65/mega65_imports.s +++ b/src/kernal/board_m65/mega65_imports.s @@ -34,6 +34,8 @@ .label wait_x_bars = KERNAL_0.wait_x_bars .label viciv_unhide = KERNAL_0.viciv_unhide +.label m65_scrtab_rowoffset_lo = KERNAL_0.m65_scrtab_rowoffset_lo +.label m65_scrtab_rowoffset_hi = KERNAL_0.m65_scrtab_rowoffset_hi .label m65_scrtab_txtwidth = KERNAL_0.m65_scrtab_txtwidth .label m65_scrtab_txtheight = KERNAL_0.m65_scrtab_txtheight diff --git a/src/kernal/interrupts/ea31.default_irq_handler.s b/src/kernal/interrupts/ea31.default_irq_handler.s index 4dbe8ed9..f15f2305 100644 --- a/src/kernal/interrupts/ea31.default_irq_handler.s +++ b/src/kernal/interrupts/ea31.default_irq_handler.s @@ -18,7 +18,7 @@ default_irq_handler: #if ROM_LAYOUT_M65 jsr M65_ISMODE65 - bne !+ + bcs !+ jsr m65_cursor_blink diff --git a/src/kernal/screen/cursor.s b/src/kernal/screen/cursor.s index 7021133a..999c40d4 100644 --- a/src/kernal/screen/cursor.s +++ b/src/kernal/screen/cursor.s @@ -17,6 +17,7 @@ cursor_blink: + // Is the cursor enabled? lda BLNSW bne cursor_blink_end @@ -50,26 +51,31 @@ cursor_draw: bne cursor_blink_timer_reset // branches always cursor_disable: + lda #$80 sta BLNSW // FALLTHROUGH cursor_hide_if_visible: + lda BLNON beq cursor_blink_end + // FALLTROUGH + cursor_undraw: + // Prevent interrupts from updating cursor + lda #0 + sta BLNON + jsr screen_get_clipped_PNTR lda GDBLN sta (PNT),y lda GDCOL sta (USER),y - lda #0 - sta BLNON - // FALLTROUGH cursor_blink_timer_reset: diff --git a/src/kernal/screen_m65/mega65_chrout_screen.s b/src/kernal/screen_m65/mega65_chrout_screen.s index c438276d..708a5272 100644 --- a/src/kernal/screen_m65/mega65_chrout_screen.s +++ b/src/kernal/screen_m65/mega65_chrout_screen.s @@ -8,7 +8,9 @@ m65_chrout_screen: - // XXX hide cursor if visible + jsr m65_cursor_hide_if_visible + + // Retrieve the character to output lda SCHAR tax @@ -127,6 +129,7 @@ m65_chrout_fix_column_row_win: m65_chrout_screen_done: - // XXX reenable cursor + jsr m65_cursor_show_if_enabled + // XXX change this to return success rts diff --git a/src/kernal/screen_m65/mega65_cursor.s b/src/kernal/screen_m65/mega65_cursor.s index 091294bd..db0d6b8a 100644 --- a/src/kernal/screen_m65/mega65_cursor.s +++ b/src/kernal/screen_m65/mega65_cursor.s @@ -1,9 +1,37 @@ -// #LAYOUT# M65 KERNAL_0 #TAKE +// #LAYOUT# M65 KERNAL_1 #TAKE // #LAYOUT# * * #IGNORE +// +// Variables used: +// - BLNSW (cursor blink switch) +// - BLNCT (cursor blink countdown) +// - GDBLN (cursor saved character) +// - BLNON (if cursor is visible) +// - GDCOL (colour under cursor) +// -m65_cursor_blink: +m65_cursor_hide_if_visible: + + lda BLNON + beq m65_cursor_end + + // FALLTROUGH + +m65_cursor_undraw: // XXX provide implementation rts + + +m65_cursor_show_if_enabled: + + // XXX provide implementation + + nop + + // FALLTROUGH + +m65_cursor_end: + + rts diff --git a/src/kernal/screen_m65/mega65_cursor_blink.s b/src/kernal/screen_m65/mega65_cursor_blink.s new file mode 100644 index 00000000..ea8bfd9c --- /dev/null +++ b/src/kernal/screen_m65/mega65_cursor_blink.s @@ -0,0 +1,93 @@ +// #LAYOUT# M65 KERNAL_0 #TAKE +// #LAYOUT# * * #IGNORE + +// +// Variables used: +// - BLNSW (cursor blink switch) +// - BLNCT (cursor blink countdown) +// - GDBLN (cursor saved character) +// - BLNON (if cursor is visible) +// - GDCOL (colour under cursor) +// + + +m65_cursor_blink: + + // Preserve .Z + phz + + // Is the cursor enabled? + lda BLNSW + bne m65_cursor_blink_end + + // Do we need to redraw things? + dec BLNCT + bpl m65_cursor_blink_end + + // Prepare .Z and long pointer to screen position + ldz M65__TXTCOL + lda M65_SCRVIEW+0 + sta M65_LPNT_IRQ+0 + lda M65_SCRVIEW+1 + sta M65_LPNT_IRQ+1 + lda M65_SCRSEG+0 + sta M65_LPNT_IRQ+2 + lda M65_SCRSEG+1 + sta M65_LPNT_IRQ+3 + + // Add row offset to the long pointer + ldy M65__TXTROW + clc + lda m65_scrtab_rowoffset_lo,y + adc M65_LPNT_IRQ+0 + sta M65_LPNT_IRQ+0 + lda m65_scrtab_rowoffset_hi,y + adc M65_LPNT_IRQ+1 + sta M65_LPNT_IRQ+1 + + // Check if cursor was visible or not, and toggle + lda BLNON + bne m65_cursor_blink_undraw + + // FALLTROUGH + +m65_cursor_blink_draw: + + lda #1 + sta BLNON + + // Cursor draw - character + lda_lp (M65_LPNT_IRQ),z + sta GDBLN + eor #$80 + sta_lp (M65_LPNT_IRQ),z + + // Cursor draw - color + // XXX provide implementation + +m65_cursor_blink_timer_reset: + + // Rest blink counter (Mapping the 64, p39-40) + lda #20 + sta BLNCT + + // FALLTROUGH + +m65_cursor_blink_end: + + plz + rts + +m65_cursor_blink_undraw: + + lda #0 + sta BLNON + + // Cursor undraw - character + lda GDBLN + sta_lp (M65_LPNT_IRQ),z + + // Cursor undraw - color + // XXX provide implementation + + jmp_8 m65_cursor_blink_timer_reset diff --git a/src/kernal/screen_m65/mega65_screen_table_roff_hi.s b/src/kernal/screen_m65/mega65_screen_table_roff_hi.s new file mode 100644 index 00000000..15435e4a --- /dev/null +++ b/src/kernal/screen_m65/mega65_screen_table_roff_hi.s @@ -0,0 +1,13 @@ +// #LAYOUT# M65 KERNAL_0 #TAKE +// #LAYOUT# * * #IGNORE + + +// XXX consider moving this back to extended memory, and just store the offset in RAM + +m65_scrtab_rowoffset_hi: // row offsets - high bytes + + .byte >(80 * 0), >(80 * 1), >(80 * 2), >(80 * 3), >(80 * 4), >(80 * 5), >(80 * 6), >(80 * 7), >(80 * 8), >(80 * 9) + .byte >(80 * 10), >(80 * 11), >(80 * 12), >(80 * 13), >(80 * 14), >(80 * 15), >(80 * 16), >(80 * 17), >(80 * 18), >(80 * 19) + .byte >(80 * 20), >(80 * 21), >(80 * 22), >(80 * 23), >(80 * 24), >(80 * 25), >(80 * 26), >(80 * 27), >(80 * 28), >(80 * 29) + .byte >(80 * 30), >(80 * 31), >(80 * 32), >(80 * 33), >(80 * 34), >(80 * 35), >(80 * 36), >(80 * 37), >(80 * 38), >(80 * 39) + .byte >(80 * 40), >(80 * 41), >(80 * 42), >(80 * 43), >(80 * 44), >(80 * 45), >(80 * 46), >(80 * 47), >(80 * 48), >(80 * 49) \ No newline at end of file diff --git a/src/kernal/screen_m65/mega65_screen_table_roff_lo.s b/src/kernal/screen_m65/mega65_screen_table_roff_lo.s new file mode 100644 index 00000000..1327984f --- /dev/null +++ b/src/kernal/screen_m65/mega65_screen_table_roff_lo.s @@ -0,0 +1,13 @@ +// #LAYOUT# M65 KERNAL_0 #TAKE +// #LAYOUT# * * #IGNORE + + +// XXX consider moving this back to extended memory, and just store the offset in RAM + +m65_scrtab_rowoffset_lo: // row offsets - low bytes + + .byte <(80 * 0), <(80 * 1), <(80 * 2), <(80 * 3), <(80 * 4), <(80 * 5), <(80 * 6), <(80 * 7), <(80 * 8), <(80 * 9) + .byte <(80 * 10), <(80 * 11), <(80 * 12), <(80 * 13), <(80 * 14), <(80 * 15), <(80 * 16), <(80 * 17), <(80 * 18), <(80 * 19) + .byte <(80 * 20), <(80 * 21), <(80 * 22), <(80 * 23), <(80 * 24), <(80 * 25), <(80 * 26), <(80 * 27), <(80 * 28), <(80 * 29) + .byte <(80 * 30), <(80 * 31), <(80 * 32), <(80 * 33), <(80 * 34), <(80 * 35), <(80 * 36), <(80 * 37), <(80 * 38), <(80 * 39) + .byte <(80 * 40), <(80 * 41), <(80 * 42), <(80 * 43), <(80 * 44), <(80 * 45), <(80 * 46), <(80 * 47), <(80 * 48), <(80 * 49) diff --git a/src/kernal/screen_m65/mega65_screen_tables.s b/src/kernal/screen_m65/mega65_screen_tables_misc.s similarity index 61% rename from src/kernal/screen_m65/mega65_screen_tables.s rename to src/kernal/screen_m65/mega65_screen_tables_misc.s index 51d0b7b6..7dc0c5fd 100644 --- a/src/kernal/screen_m65/mega65_screen_tables.s +++ b/src/kernal/screen_m65/mega65_screen_tables_misc.s @@ -26,22 +26,6 @@ m65_scrtab_scrolx: // values for VIC_SCROLX .byte $CA .byte $CA -m65_scrtab_rowoffset_lo: // row offsets - low bytes - - .byte <(80 * 0), <(80 * 1), <(80 * 2), <(80 * 3), <(80 * 4), <(80 * 5), <(80 * 6), <(80 * 7), <(80 * 8), <(80 * 9) - .byte <(80 * 10), <(80 * 11), <(80 * 12), <(80 * 13), <(80 * 14), <(80 * 15), <(80 * 16), <(80 * 17), <(80 * 18), <(80 * 19) - .byte <(80 * 20), <(80 * 21), <(80 * 22), <(80 * 23), <(80 * 24), <(80 * 25), <(80 * 26), <(80 * 27), <(80 * 28), <(80 * 29) - .byte <(80 * 30), <(80 * 31), <(80 * 32), <(80 * 33), <(80 * 34), <(80 * 35), <(80 * 36), <(80 * 37), <(80 * 38), <(80 * 39) - .byte <(80 * 40), <(80 * 41), <(80 * 42), <(80 * 43), <(80 * 44), <(80 * 45), <(80 * 46), <(80 * 47), <(80 * 48), <(80 * 49) - -m65_scrtab_rowoffset_hi: // row offsets - high bytes - - .byte >(80 * 0), >(80 * 1), >(80 * 2), >(80 * 3), >(80 * 4), >(80 * 5), >(80 * 6), >(80 * 7), >(80 * 8), >(80 * 9) - .byte >(80 * 10), >(80 * 11), >(80 * 12), >(80 * 13), >(80 * 14), >(80 * 15), >(80 * 16), >(80 * 17), >(80 * 18), >(80 * 19) - .byte >(80 * 20), >(80 * 21), >(80 * 22), >(80 * 23), >(80 * 24), >(80 * 25), >(80 * 26), >(80 * 27), >(80 * 28), >(80 * 29) - .byte >(80 * 30), >(80 * 31), >(80 * 32), >(80 * 33), >(80 * 34), >(80 * 35), >(80 * 36), >(80 * 37), >(80 * 38), >(80 * 39) - .byte >(80 * 40), >(80 * 41), >(80 * 42), >(80 * 43), >(80 * 44), >(80 * 45), >(80 * 46), >(80 * 47), >(80 * 48), >(80 * 49) - // Jumptable for screen control codes support. To improve performance, should be sorted // starting from the least probable routine.