From 0d4898d91c88a5c4b6098ccaf90c1c6260aea059 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Thu, 13 Aug 2020 19:18:05 +0200 Subject: [PATCH] preparation for up-scrollable console --- src/aliases/,aliases_ram_lowmem_m65.s | 21 ++-- src/kernal/screen_m65/mega65_clrscr.s | 118 ++++++++++++++++++ ...mega65_clrscr_clrwin.s => mega65_clrwin.s} | 59 +++++---- src/kernal/screen_m65/mega65_screen_tables.s | 12 ++ src/kernal/screen_m65/mega65_scrmodeset.s | 55 ++++++-- 5 files changed, 214 insertions(+), 51 deletions(-) create mode 100644 src/kernal/screen_m65/mega65_clrscr.s rename src/kernal/screen_m65/{mega65_clrscr_clrwin.s => mega65_clrwin.s} (67%) diff --git a/src/aliases/,aliases_ram_lowmem_m65.s b/src/aliases/,aliases_ram_lowmem_m65.s index 921bd319..97dafc69 100644 --- a/src/aliases/,aliases_ram_lowmem_m65.s +++ b/src/aliases/,aliases_ram_lowmem_m65.s @@ -30,13 +30,18 @@ // $580-$5FF - reserved for KERNAL - .label M65_SCRTXTBASE = $580 // $580-$583 base address of the screen memory for text modes - .label M65_SCRGFXBASE = $584 // $584-$587 -- NOT IMPLEMENTED -- base address of the screen memory for graphics modes - .label M65_SCRMODE = $588 // 0 = 40x25, 1 = 80x25, 2 = 80x50, (-- NOT IMPLEMENTED -- add $80 for graphics modes) - .label M65_TXTWIN_X0 = $589 // text window - top-left X coordinate, starting from 0 - .label M65_TXTWIN_Y0 = $58A // text window - top-left Y coordinate, starting from 0 - .label M65_TXTWIN_X1 = $58B // text window - bottom-right X coordinate + 1 - .label M65_TXTWIN_Y1 = $58C // text window - bottom-right Y coordinate + 1 - // $58D-$5FF -- UNUSED -- + .label M65_SCRSEG = $580 // $580-$581 segment address (2 higher bytes) of the screen memory + .label M65_SCRBASE = $582 // $582-$583 first byte of screen memory + .label M65_SCRGUARD = $584 // $584-$585 last byte of screen memory + 1 + .label M65_SCRVIEW = $586 // $586-$587 first byte of screen memory viewport + .label M65_COLVIEW = $588 // $588-$589 first byte of color memory viewport + .label M65_SCRVIEWMAX = $58A // $58A-$58B largest allowed value of M65_SCRVIEW + .label M65_SCRMODE = $58C // 0 = 40x25, 1 = 80x25, 2 = 80x50 + .label M64_SCRWINMODE = $58D // $00 = normal mode, $FF = window enabled + .label M65_TXTWIN_X0 = $58E // text window - top-left X coordinate, starting from 0 + .label M65_TXTWIN_Y0 = $58F // text window - top-left Y coordinate, starting from 0 + .label M65_TXTWIN_X1 = $590 // text window - bottom-right X coordinate + 1 + .label M65_TXTWIN_Y1 = $591 // text window - bottom-right Y coordinate + 1 + // $592-$5FF -- UNUSED -- .label M65_RS232_INBUF = $600 // $600-$6FF -- reserved for RS-232 input buffer -- .label M65_RS232_OUTBUF = $700 // $700-$7FF -- reserved for RS-232 output buffer -- diff --git a/src/kernal/screen_m65/mega65_clrscr.s b/src/kernal/screen_m65/mega65_clrscr.s new file mode 100644 index 00000000..14d951a7 --- /dev/null +++ b/src/kernal/screen_m65/mega65_clrscr.s @@ -0,0 +1,118 @@ +// #LAYOUT# M65 KERNAL_1 #TAKE +// #LAYOUT# * * #IGNORE + + +M65_CLRSCR: + + // Clear additional attributes from the color code + + lda COLOR + and #$0F + sta COLOR + + // Disable the window mode + + lda #$00 + sta M64_SCRWINMODE + + // FALLTROUGH + +m65_clrscr_takeover: + + // Set the viewport to the beginning of screen memory - variables: + // - M65_SCRVIEW, M65_COLVIEW + // To clear the screen, two zeropage long pointers will be used, initialize them too + // - M65_LPNT_SCR for screen memory + // - M65_LPNT_KERN for colour memory (starts from $FF80000) + + sta M65_COLVIEW+0 + sta M65_COLVIEW+1 + + sta M65_LPNT_KERN+0 + sta M65_LPNT_KERN+1 + lda #$F8 + sta M65_LPNT_KERN+2 + lda #$0F + sta M65_LPNT_KERN+3 + + lda M65_SCRSEG+0 + sta M65_SCRVIEW+0 + lda M65_SCRSEG+1 + sta M65_SCRVIEW+1 + + lda M65_SCRBASE+0 + sta M65_LPNT_SCR+0 + lda M65_SCRBASE+1 + sta M65_LPNT_SCR+1 + lda M65_SCRSEG+0 + sta M65_LPNT_SCR+2 + lda M65_SCRSEG+1 + sta M65_LPNT_SCR+3 + + // Clear the whole screen+color memory + + phz + + // FALLTROUGH + +m65_clrscr_loop: + + // Clear 80 characters + + ldz #$4F // 80 bytes +!: + lda #$20 + sta_lp (M65_LPNT_SCR),z + lda COLOR + sta_lp (M65_LPNT_KERN),z + + dez + bpl !- + + // Move M65_LPNT_SCR and M65_LPNT_KERN 80 characters forward + // XXX deduplicate with window clearing + + clc + lda M65_LPNT_SCR+0 + adc #$50 + sta M65_LPNT_SCR+0 + bcc !+ + inc M65_LPNT_SCR+1 +!: + clc + lda M65_LPNT_KERN+0 + adc #$50 + sta M65_LPNT_KERN+0 + bcc !+ + inc M65_LPNT_KERN+1 +!: + // Check if we have more rows to clear + + lda M65_LPNT_SCR+1 + cmp M65_SCRGUARD+1 + bne m65_clrscr_loop + lda M65_LPNT_SCR+0 + cmp M65_SCRGUARD+0 + bne m65_clrscr_loop + + // Restore .Z register + + plz + + // Set screen+color base address in VIC IV + // XXX deduplicate with mode setting routine + + lda #$00 + sta VIC_COLPTR+0 + sta VIC_COLPTR+1 + + lda M65_SCRBASE+0 + sta VIC_SCRNPTR+0 + lda M65_SCRBASE+1 + sta VIC_SCRNPTR+1 + + // Set screen variables + + // XXX implement this, together with HOME + + rts diff --git a/src/kernal/screen_m65/mega65_clrscr_clrwin.s b/src/kernal/screen_m65/mega65_clrwin.s similarity index 67% rename from src/kernal/screen_m65/mega65_clrscr_clrwin.s rename to src/kernal/screen_m65/mega65_clrwin.s index d29ae967..fdd782b9 100644 --- a/src/kernal/screen_m65/mega65_clrscr_clrwin.s +++ b/src/kernal/screen_m65/mega65_clrwin.s @@ -2,49 +2,48 @@ // #LAYOUT# * * #IGNORE -M65_CLRSCR: - - // Set the text window to whole screen area - - lda #$00 - sta M65_TXTWIN_X0 - sta M65_TXTWIN_Y0 - - ldx M65_SCRMODE - - lda m65_scrtab_txtwidth, X - sta M65_TXTWIN_X1 - lda m65_scrtab_txtheight, X - sta M65_TXTWIN_Y1 - - // FALLTROUGH - M65_CLRWIN: + // Clear additional attributes from the color code + // XXX deduplicate with M65_CLRSCR + + lda COLOR + and #$0F + sta COLOR + + // Check if windowed mode; if not, go to M65_CLRSCR + + lda M64_SCRWINMODE + bpl_16 m65_clrscr_takeover + // To clear the window, two zeropage long pointers will be used: // - M65_LPNT_SCR for screen memory // - M65_LPNT_KERN for colour memory (starts from $FF80000) // First initialize both pointers - ldx #$03 -!: - lda M65_SCRTXTBASE,x - sta M65_LPNT_SCR,x - lda #$00 - sta M65_LPNT_KERN,x - dex - bpl !- + lda M65_SCRVIEW+0 + sta M65_LPNT_SCR+0 + lda M65_SCRVIEW+1 + sta M65_LPNT_SCR+1 + lda M65_SCRSEG+0 + sta M65_LPNT_SCR+2 + lda M65_SCRSEG+1 + sta M65_LPNT_SCR+3 - lda #$0F - sta M65_LPNT_KERN+3 - lda #$F8 - sta M65_LPNT_KERN+2 + lda M65_COLVIEW+0 + sta M65_LPNT_KERN+0 + lda M65_COLVIEW+1 + sta M65_LPNT_KERN+1 + // XXX deduplicate part below with M65_CLRSCR + lda #$F8 + sta M65_LPNT_KERN+2 + lda #$0F + sta M65_LPNT_KERN+3 // Go trough all the rows phz - ldx M65_SCRMODE ldy #$00 // FALLTROUGH diff --git a/src/kernal/screen_m65/mega65_screen_tables.s b/src/kernal/screen_m65/mega65_screen_tables.s index 2a00a5ce..7055d533 100644 --- a/src/kernal/screen_m65/mega65_screen_tables.s +++ b/src/kernal/screen_m65/mega65_screen_tables.s @@ -20,6 +20,18 @@ m65_scrtab_txtheight: // height of the text screen .byte 25 .byte 50 +m65_scrtab_viewmax_lo: // maximum allowed viewport start - low byte + + .byte $B0 + .byte $B0 + .byte $E0 + +m65_scrtab_viewmax_hi: // maximum allowed viewport start - high byte + + .byte $96 + .byte $96 + .byte $8E + 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) diff --git a/src/kernal/screen_m65/mega65_scrmodeset.s b/src/kernal/screen_m65/mega65_scrmodeset.s index 56994e77..27879d87 100644 --- a/src/kernal/screen_m65/mega65_scrmodeset.s +++ b/src/kernal/screen_m65/mega65_scrmodeset.s @@ -56,21 +56,50 @@ m65_scrmodeset_internal: // entry point for M65_MODE65 ldx #$00 stx VIC_CHARSTEP+1 - // Set the base screen addresses: - // - in VIC_SCRNPTR and M65_SCRTXTBASE to $16000 - // - in VIC_COLPTR to $0000 + // Set the following locations: + // - M64_SCRWINMODE - for scroll-console mode + // - M65_SCRSEG, VIC_SCRNPTR+2/+3 - for screen in $0001xxxx area + stx M64_SCRWINMODE // .X = 0 + stx M65_SCRSEG+1 + stx VIC_SCRNPTR+3 + inx + stx M65_SCRSEG+0 + stx VIC_SCRNPTR+2 + + // Set the following locations: + // - M65_SCRBASE - for screen starting from $xxxx6000 + // - M65_SCRVIEW, VIC_SCRNPTR+0/+1 - for screen viewport starting from the same address + // - M65_COLVIEW, VIC_COLPTR - for using color memory from the start + + ldx #$60 + stx M65_SCRBASE+1 + stx M65_SCRVIEW+1 + stx VIC_SCRNPTR+1 + + ldx #$00 + stx M65_SCRBASE+0 + stx M65_SCRVIEW+0 + stx VIC_SCRNPTR+0 + + stx M65_COLVIEW+0 + stx M65_COLVIEW+1 stx VIC_COLPTR+0 stx VIC_COLPTR+1 - stx VIC_SCRNPTR+0 - stx M65_SCRTXTBASE+0 - stx VIC_SCRNPTR+3 - stx M65_SCRTXTBASE+3 - inx - stx VIC_SCRNPTR+2 - stx M65_SCRTXTBASE+2 - ldx #$60 - stx VIC_SCRNPTR+1 - stx M65_SCRTXTBASE+1 + + // Set the following locations: + // - M65_SCREND - for max 200 lines of virtual screen + // - M65_SCRVIEWMAX - as above, but depending on the mode + + ldx #$80 + stx M65_SCRGUARD+0 + ldx #$9E + stx M65_SCRGUARD+1 + + ldx M65_SCRMODE + lda m65_scrtab_viewmax_lo, x + sta M65_SCRVIEWMAX+0 + lda m65_scrtab_viewmax_hi, x + sta M65_SCRVIEWMAX+1 rts