From a25be2d083b477171248aacc0b68a79ccc91e794 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Mon, 31 Aug 2020 06:24:20 +0200 Subject: [PATCH] use DMAgic for MEGA65 screen clearing --- src/kernal/board_m65/mega65_dmagic.s | 22 ++-- src/kernal/screen_m65/mega65_chrout_screen.s | 35 +++--- src/kernal/screen_m65/mega65_clrscr.s | 116 ++---------------- src/kernal/screen_m65/mega65_screen_helpers.s | 37 ++++++ .../screen_m65/mega65_screen_helpers_K0.s | 3 + 5 files changed, 81 insertions(+), 132 deletions(-) diff --git a/src/kernal/board_m65/mega65_dmagic.s b/src/kernal/board_m65/mega65_dmagic.s index 495da892..29268033 100644 --- a/src/kernal/board_m65/mega65_dmagic.s +++ b/src/kernal/board_m65/mega65_dmagic.s @@ -8,9 +8,6 @@ // - https://c65gs.blogspot.com/2018/01/improving-dmagic-controller-interface.html -// XXX: finish the implementation, use in screen editor - - m65_dmagic_oper_fill: // To configure job parameters, use: @@ -28,8 +25,9 @@ m65_dmagic_oper_fill: lda #($03 + $08) // operation: FILL + allow interrupts sta M65_DMAGIC_LIST+6 - // Go to common part + // Adapt the addresses, go to common part + jsr m65_dmagic_adapt_dst jmp_8 m65_dmagic_common m65_dmagic_oper_copy: @@ -45,20 +43,20 @@ m65_dmagic_oper_copy: lda #($00 + $08) // operation: COPY + allow interrupts sta M65_DMAGIC_LIST+6 - // Adapt the source addresses, go to common part + // Adapt the addresses, go to common part jsr m65_dmagic_adapt_src + jsr m65_dmagic_adapt_dst + + // XXX prepare separate version for the opposite direction - change direction + // by setting bit 6 of M65_DMAJOB_*_2 // FALLTROUGH m65_dmagic_common: - // Adapt destination addresses - this is always needed - // XXX consider inlining this here - - jsr m65_dmagic_adapt_dst - // Set remaining job parameters + // XXX this should be done during switching to MEGA65 native mode lda #$0A sta M65_DMAGIC_LIST+0 // <- $0A = use F018A list format (it is shorter by 1 byte) @@ -110,7 +108,7 @@ m65_dmagic_adapt_src: rol M65_DMAJOB_SRC_3 pla - and %00001111 + and #%00001111 sta M65_DMAJOB_SRC_2 rts @@ -135,7 +133,7 @@ m65_dmagic_adapt_dst: rol M65_DMAJOB_DST_3 pla - and %00001111 + and #%00001111 sta M65_DMAJOB_DST_2 rts diff --git a/src/kernal/screen_m65/mega65_chrout_screen.s b/src/kernal/screen_m65/mega65_chrout_screen.s index 89cbfb06..bfb92f25 100644 --- a/src/kernal/screen_m65/mega65_chrout_screen.s +++ b/src/kernal/screen_m65/mega65_chrout_screen.s @@ -125,7 +125,7 @@ m65_chrout_fix_column_row: lda M65__TXTROW bpl !+ - jsr m65_chrout_fix_scroll_up + jsr m65_chrout_fix_scroll_down !: // Check for row above maximum @@ -133,7 +133,7 @@ m65_chrout_fix_column_row: cmp m65_scrtab_txtheight,y bcc !+ - jsr m65_chrout_fix_scroll_down + jsr m65_chrout_fix_scroll_up !: jmp_8 m65_chrout_fix_txtrow_off @@ -164,9 +164,9 @@ m65_chrout_screen_done: -// Try to fix coordinates by scrolling the screen up +// Try to fix coordinates by scrolling the screen down -m65_chrout_fix_scroll_up: +m65_chrout_fix_scroll_down: inc M65__TXTROW @@ -174,7 +174,7 @@ m65_chrout_fix_scroll_up: lda M65_COLVIEW+0 ora M65_COLVIEW+1 - beq m65_chrout_fix_scroll_up_end + beq m65_chrout_fix_scroll_down_end // Yes, we can simply adapt the viewport @@ -196,14 +196,14 @@ m65_chrout_fix_scroll_up: !: // FALLTROUGH -m65_chrout_fix_scroll_up_end: +m65_chrout_fix_scroll_down_end: - jmp_8 m65_chrout_fix_scroll_done + rts // Try to fix coordinates by scrolling the screen up -m65_chrout_fix_scroll_down: +m65_chrout_fix_scroll_up: dec M65__TXTROW @@ -215,7 +215,7 @@ m65_chrout_fix_scroll_down: lda M65_COLVIEW+0 cmp M65_COLVIEWMAX+0 - beq m65_chrout_fix_scroll_down_scroll + beq m65_chrout_fix_scroll_up_scroll !: // Yes, we can simply adapt the viewport @@ -235,15 +235,22 @@ m65_chrout_fix_scroll_down: bcc !+ inc VIC_SCRNPTR+1 !: - jmp_8 m65_chrout_fix_scroll_done + rts -m65_chrout_fix_scroll_down_scroll: +m65_chrout_fix_scroll_up_scroll: + + // Virtual screen is too small - we will lose one row // XXX implement - // FALLTROUGH + // XXX set size -m65_chrout_fix_scroll_done: + // jsr m65_screen_dmasrcdst_screen + // XXX add $50 to DST + // jsr m65_dmagic_oper_copy + + // jsr m65_screen_dmasrcdst_color + // XXX add $50 to DST + // jsr m65_dmagic_oper_copy - ldy M65_SCRMODE rts diff --git a/src/kernal/screen_m65/mega65_clrscr.s b/src/kernal/screen_m65/mega65_clrscr.s index 4568bb2d..41913d29 100644 --- a/src/kernal/screen_m65/mega65_clrscr.s +++ b/src/kernal/screen_m65/mega65_clrscr.s @@ -1,8 +1,6 @@ // #LAYOUT# M65 KERNAL_1 #TAKE // #LAYOUT# * * #IGNORE -// #define DMAGIC_CLRSCR - M65_CLRSCR: @@ -17,23 +15,7 @@ M65_CLRSCR: // FALLTROUGH -m65_clrscr_takeover: // .A has to be 0 - - // Set the viewport to the beginning of screen memory - variable: - // - M65_COLVIEW - // It will serve as line counter - - sta M65_COLVIEW+0 - sta M65_COLVIEW+1 - - // Clear the row offset, so that it won't interfere - - sta M65_TXTROW_OFF+0 - sta M65_TXTROW_OFF+1 - -#if DMAGIC_CLRSCR - - // XXX for some reason this does not work correctly - find out, why +m65_clrscr_takeover: // Clear the whole screen + colour memory @@ -43,104 +25,28 @@ m65_clrscr_takeover: // .A has to be 0 lda M65_COLGUARD+1 sta M65_DMAJOB_SIZE_1 - // Screen start address - lda M65_SCRBASE+0 - sta M65_DMAJOB_DST_0 - lda M65_SCRBASE+1 - sta M65_DMAJOB_DST_1 - lda M65_SCRSEG+0 - sta M65_DMAJOB_DST_2 - lda M65_SCRSEG+1 - sta M65_DMAJOB_DST_3 - // Fill with spaces + // Fill screen memory with spaces + jsr m65_screen_dmasrcdst_screen lda #$20 jsr m65_dmagic_oper_fill - // Colour RAM start address - lda #$00 - sta M65_DMAJOB_DST_0 - sta M65_DMAJOB_DST_1 - lda #$F8 - sta M65_DMAJOB_DST_2 - lda #$0F - sta M65_DMAJOB_DST_3 - - // Fill with colour, without attributes + // Fill color memory with the current color + jsr m65_screen_dmasrcdst_color lda COLOR and #$0F jsr m65_dmagic_oper_fill -#else + // Set the viewport to the beginning of virtual screen + // XXX deduplicate with mode setting routine - // Clear the whole screen+color memory - // XXX consider using DMAgic for this - FILL command - - phz - - // FALLTROUGH - -m65_clrscr_loop: - - // Prepare M65_LPNT_SCR, let it point to color memory - - jsr m65_helper_scrlpnt_color - - // Clear color for the whole line - - ldz #$4F // 80 bytes - lda COLOR -!: - sta_lp (M65_LPNT_SCR),z - - dez - bpl !- - - // Let M65_LPNT_SCR point to scren memory - - jsr m65_helper_scrlpnt_to_screen - - // Clear characters in the whole line - - ldz #$4F // 80 bytes - lda #$20 -!: - sta_lp (M65_LPNT_SCR),z - - dez - bpl !- - - // Advance by one line, do next iteration - - // XXX this can probably be deduplicated - clc - lda M65_COLVIEW+0 - adc #$50 + lda #$00 sta M65_COLVIEW+0 - bcc !+ - inc M65_COLVIEW+1 -!: - // Check if we are allowed to progress further - - lda M65_COLVIEW+1 - cmp M65_COLGUARD+1 - bne m65_clrscr_loop - lda M65_COLVIEW+0 - cmp M65_COLGUARD+0 - bne m65_clrscr_loop - -m65_clrscr_loop_done: - - // Nothing more to clear - restore .Z register - - plz - -#endif // no DMAGIC_CLRSCR + sta M65_COLVIEW+1 // Set screen+color base address in VIC IV // XXX deduplicate with mode setting routine - lda #$00 sta VIC_COLPTR+0 sta VIC_COLPTR+1 sta M65_COLVIEW+0 @@ -151,12 +57,10 @@ m65_clrscr_loop_done: lda M65_SCRBASE+1 sta VIC_SCRNPTR+1 - // Set screen variables + // Set logical row length jsr m65_screen_set_indx - // XXX provide proper implementation - // FALLTROUGH M65_HOME: diff --git a/src/kernal/screen_m65/mega65_screen_helpers.s b/src/kernal/screen_m65/mega65_screen_helpers.s index 8418d92e..b4fa7d16 100644 --- a/src/kernal/screen_m65/mega65_screen_helpers.s +++ b/src/kernal/screen_m65/mega65_screen_helpers.s @@ -20,3 +20,40 @@ m65_screen_upd_txtrow_off: sta M65_TXTROW_OFF+1 rts + + +m65_screen_dmasrcdst_screen: + + // Set screen memory as start/end addresses + + lda M65_SCRBASE+0 + sta M65_DMAJOB_SRC_0 + sta M65_DMAJOB_DST_0 + lda M65_SCRBASE+1 + sta M65_DMAJOB_SRC_1 + sta M65_DMAJOB_DST_1 + lda M65_SCRSEG+0 + sta M65_DMAJOB_SRC_2 + sta M65_DMAJOB_DST_2 + lda M65_SCRSEG+1 +!: + sta M65_DMAJOB_SRC_3 + sta M65_DMAJOB_DST_3 + + rts + + +m65_screen_dmasrcdst_color: + + // Set color memory as start/end addresses + + lda #$00 + sta M65_DMAJOB_SRC_0 + sta M65_DMAJOB_DST_0 + sta M65_DMAJOB_SRC_1 + sta M65_DMAJOB_DST_1 + lda #$F8 + sta M65_DMAJOB_SRC_2 + sta M65_DMAJOB_DST_2 + lda #$0F + jmp_8 !- diff --git a/src/kernal/screen_m65/mega65_screen_helpers_K0.s b/src/kernal/screen_m65/mega65_screen_helpers_K0.s index ceeb2649..edcd9382 100644 --- a/src/kernal/screen_m65/mega65_screen_helpers_K0.s +++ b/src/kernal/screen_m65/mega65_screen_helpers_K0.s @@ -1,6 +1,9 @@ // #LAYOUT# M65 KERNAL_0 #TAKE // #LAYOUT# * * #IGNORE +// +// Set the INDX variable - logical row length +// m65_screen_set_indx: // leaves value in .A