From dee452d3525a45b949b74152fab5cad6868f423b Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Thu, 27 Aug 2020 22:44:42 +0200 Subject: [PATCH] CHRIN for MEGA65 - code complete, but needs bugfixing --- .../board_m65/4000.mega65_vectable_kernal_1.s | 16 +++---- src/kernal/board_m65/mega65_imports.s | 2 + src/kernal/board_m65/mega65_redirect_screen.s | 6 +++ src/kernal/keyboard/chrin_keyboard.s | 10 ++++- src/kernal/screen_m65/mega65_chrin_keyboard.s | 42 ++++++++++++++----- .../mega65_screen_helpers_scrlpnt.s | 28 ++++++++++--- 6 files changed, 80 insertions(+), 24 deletions(-) diff --git a/src/kernal/board_m65/4000.mega65_vectable_kernal_1.s b/src/kernal/board_m65/4000.mega65_vectable_kernal_1.s index 87d0a1f3..07d924d1 100644 --- a/src/kernal/board_m65/4000.mega65_vectable_kernal_1.s +++ b/src/kernal/board_m65/4000.mega65_vectable_kernal_1.s @@ -19,13 +19,14 @@ .label VK1__load_tape_auto = $4000 + 2 * 5 .label VK1__tape_head_align = $4000 + 2 * 6 .label VK1__m65_chrout_screen = $4000 + 2 * 7 - .label VK1__M65_MODE64 = $4000 + 2 * 8 - .label VK1__M65_MODE65 = $4000 + 2 * 9 - .label VK1__M65_SCRMODEGET = $4000 + 2 * 10 - .label VK1__M65_SCRMODESET = $4000 + 2 * 11 - .label VK1__M65_CLRSCR = $4000 + 2 * 12 - .label VK1__M65_CLRWIN = $4000 + 2 * 13 - .label VK1__m65_screen_upd_txtrow_off = $4000 + 2 * 14 + .label VK1__m65_chrin_keyboard = $4000 + 2 * 8 + .label VK1__M65_MODE64 = $4000 + 2 * 9 + .label VK1__M65_MODE65 = $4000 + 2 * 10 + .label VK1__M65_SCRMODEGET = $4000 + 2 * 11 + .label VK1__M65_SCRMODESET = $4000 + 2 * 12 + .label VK1__M65_CLRSCR = $4000 + 2 * 13 + .label VK1__M65_CLRWIN = $4000 + 2 * 14 + .label VK1__m65_screen_upd_txtrow_off = $4000 + 2 * 15 #else @@ -60,6 +61,7 @@ #endif .word m65_chrout_screen + .word m65_chrin_keyboard .word M65_MODE64 .word M65_MODE65 diff --git a/src/kernal/board_m65/mega65_imports.s b/src/kernal/board_m65/mega65_imports.s index 8231b46d..4e4d9cb7 100644 --- a/src/kernal/board_m65/mega65_imports.s +++ b/src/kernal/board_m65/mega65_imports.s @@ -30,6 +30,8 @@ .label udtim_keyboard = KERNAL_0.udtim_keyboard .label chrout_to_screen_code = KERNAL_0.chrout_to_screen_code .label colour_codes = KERNAL_0.colour_codes +.label screen_check_toggle_quote = KERNAL_0.screen_check_toggle_quote +.label screen_code_to_petscii = KERNAL_0.screen_code_to_petscii .label setup_irq_timer = KERNAL_0.setup_irq_timer .label wait_x_bars = KERNAL_0.wait_x_bars diff --git a/src/kernal/board_m65/mega65_redirect_screen.s b/src/kernal/board_m65/mega65_redirect_screen.s index 18dacdaf..ed4d13b6 100644 --- a/src/kernal/board_m65/mega65_redirect_screen.s +++ b/src/kernal/board_m65/mega65_redirect_screen.s @@ -13,6 +13,12 @@ m65_chrout_screen: jsr map_NORMAL jmp chrout_done_success +m65_chrin_keyboard: + + jsr map_KERNAL_1 + jsr_ind VK1__m65_chrin_keyboard + jmp map_NORMAL + m65_screen_upd_txtrow_off: jsr map_KERNAL_1 diff --git a/src/kernal/keyboard/chrin_keyboard.s b/src/kernal/keyboard/chrin_keyboard.s index 522c306b..44335795 100644 --- a/src/kernal/keyboard/chrin_keyboard.s +++ b/src/kernal/keyboard/chrin_keyboard.s @@ -15,6 +15,14 @@ chrin_keyboard: stx XSAV phy_trash_a +#if ROM_LAYOUT_M65 + +/* XXX does not work yet + jsr M65_ISMODE65 + bcc_16 m65_chrin_keyboard +*/ +#endif + // FALLTROUGH chrin_keyboard_repeat: @@ -119,7 +127,7 @@ chrin_enter_calc_length: chrin_enter_loop: - // Retrieve bytes + // Skip spaces at the end of line dey bmi chrin_keyboard_empty_line lda (LSXP),y diff --git a/src/kernal/screen_m65/mega65_chrin_keyboard.s b/src/kernal/screen_m65/mega65_chrin_keyboard.s index 25b6dca0..ebd92a43 100644 --- a/src/kernal/screen_m65/mega65_chrin_keyboard.s +++ b/src/kernal/screen_m65/mega65_chrin_keyboard.s @@ -8,10 +8,8 @@ m65_chrin_keyboard: // XXX connnect this function to Kernal - // Preserve .X, .Y and .Z registers + // Preserve .Z register - phx - phy phz // FALLTROUGH @@ -24,8 +22,6 @@ m65_chrin_keyboard_repeat: lda CRSW beq m65_chrin_keyboard_read - // XXX implement - // We have input waiting at [M65__SCRINPUT]+CRSW // When CRSW = INDX, then we return a carriage return and clear the flag @@ -50,9 +46,9 @@ m65_chrin_keyboard_empty_line: m65_chrin_keyboard_end: + ldx XSAV plz ply - plx clc rts @@ -67,7 +63,14 @@ m65_chrin_keyboard_not_end_of_input: m65_chrin_keyboard_return_byte: - // XXX implement + jsr m65_helper_scrlpnt_chrin + + tya + taz + lda_lp (M65_LPNT_SCR), z + + jsr screen_check_toggle_quote + jsr screen_code_to_petscii jmp_8 m65_chrin_keyboard_end @@ -113,10 +116,9 @@ m65_chrin_keyboard_enter: adc M65_TXTROW_OFF+1 sta M65__SCRINPUT+1 - // XXX for windowed mode add current column too - // Retrieve first byte which is not space + jsr m65_helper_scrlpnt_chrin ldy INDX iny @@ -124,13 +126,30 @@ m65_chrin_keyboard_enter: m65_chrin_enter_loop: + // Skip spaces at the end of line dey bmi m65_chrin_keyboard_empty_line - // XXX implement + tya + taz + lda_lp (M65_LPNT_SCR), z + cmp #$20 + beq m65_chrin_enter_loop + iny + sty INDX - rts + // XXX add windowed mode support here - correct INDX and M65__SCRINPUT + // Set mark informing that we are returning a line + ldy #$01 + sty CRSW + + // Clear quote mode mark + dey + sty QTSW + + // Return first char of line + jmp_8 m65_chrin_keyboard_return_byte // branch always m65_chrkin_keyboard_not_enter: @@ -148,3 +167,4 @@ m65_chrkin_keyboard_not_enter: jsr CHROUT jsr pop_keyboard_buffer jmp m65_chrin_keyboard_repeat + diff --git a/src/kernal/screen_m65/mega65_screen_helpers_scrlpnt.s b/src/kernal/screen_m65/mega65_screen_helpers_scrlpnt.s index 0f5046ba..f9b91ccf 100644 --- a/src/kernal/screen_m65/mega65_screen_helpers_scrlpnt.s +++ b/src/kernal/screen_m65/mega65_screen_helpers_scrlpnt.s @@ -33,15 +33,11 @@ m65_helper_scrlpnt_color: rts + m65_helper_scrlpnt_to_screen: // Change M65_LPNT_SCR to point to screen memory (when it points to color memory) - lda M65_SCRSEG+1 - sta M65_LPNT_SCR+3 - lda M65_SCRSEG+0 - sta M65_LPNT_SCR+2 - clc lda M65_SCRBASE+0 adc M65_LPNT_SCR+0 @@ -50,4 +46,26 @@ m65_helper_scrlpnt_to_screen: adc M65_LPNT_SCR+1 sta M65_LPNT_SCR+1 + // FALLTROUGH + +m65_helper_scrlpnt_to_screen_hi: + + lda M65_SCRSEG+1 + sta M65_LPNT_SCR+3 + lda M65_SCRSEG+0 + sta M65_LPNT_SCR+2 + rts + + + +m65_helper_scrlpnt_chrin: + + // Prepare the pointer for CHRIN + + lda M65__SCRINPUT+0 + sta M65_LPNT_SCR+0 + lda M65__SCRINPUT+1 + sta M65_LPNT_SCR+1 + + jmp_8 m65_helper_scrlpnt_to_screen_hi