From 90b7a7090249c02806a329531e3cca635d962903 Mon Sep 17 00:00:00 2001 From: Tormod Volden Date: Sun, 6 Nov 2016 00:32:15 +0100 Subject: [PATCH] dragon-nx32: Also use internal upper 32K if available This comes with a small size and speed penalty, maybe we should make it a compile option. Signed-off-by: Tormod Volden --- Kernel/platform-dragon-nx32/discard.c | 11 ++++- Kernel/platform-dragon-nx32/main.c | 1 + Kernel/platform-dragon-nx32/mem-nx32.s | 56 +++++++++++++++++++++++++- 3 files changed, 65 insertions(+), 3 deletions(-) diff --git a/Kernel/platform-dragon-nx32/discard.c b/Kernel/platform-dragon-nx32/discard.c index 83863c5b..ccb12cec 100644 --- a/Kernel/platform-dragon-nx32/discard.c +++ b/Kernel/platform-dragon-nx32/discard.c @@ -11,11 +11,20 @@ * with the last page repeated to fill any holes. */ +extern uint8_t internal32k; + void pagemap_init(void) { int i; + int extbanks = membanks; + + /* map upper 32K on Dragon 64/200/Tano */ + if (!internal32k) { + pagemap_add(128); + extbanks--; + } /* map bank 1 last for init, leave 0 for kernel */ - for (i = membanks - 1; i > 0; i--) + for (i = extbanks - 1; i > 0; i--) pagemap_add(i); #ifdef SWAPDEV diff --git a/Kernel/platform-dragon-nx32/main.c b/Kernel/platform-dragon-nx32/main.c index b351c18d..32f4f481 100644 --- a/Kernel/platform-dragon-nx32/main.c +++ b/Kernel/platform-dragon-nx32/main.c @@ -7,6 +7,7 @@ #include uint8_t membanks; +uint8_t internal32k; uint8_t system_id; uint8_t cartslots = 1; uint8_t carttype[4]; diff --git a/Kernel/platform-dragon-nx32/mem-nx32.s b/Kernel/platform-dragon-nx32/mem-nx32.s index 73ee7a4a..a70c8538 100644 --- a/Kernel/platform-dragon-nx32/mem-nx32.s +++ b/Kernel/platform-dragon-nx32/mem-nx32.s @@ -20,9 +20,12 @@ .globl _ramsize .globl _procmem .globl _membanks + .globl _internal32k banksel equ 0xFFBF bankoff equ 0xFFBE +sammap1 equ 0xFFDF +sammap0 equ 0xFFDE include "kernel.def" include "../kernel09.def" @@ -38,6 +41,9 @@ zbank sta banksel ; clear test byte on all possible banks inca cmpa #16 blo zbank + sta sammap1 ; internal 64K + clr ,x + sta sammap0 clra ; now test writing to banks ldb #0xA5 size_next @@ -52,8 +58,19 @@ size_next bne size_next size_nonram clr banksel ; leave bank 0 selected and kdata mapped in + sta sammap1 ; check for internal 64K + cmpb ,x ; already same value? + bne notsame + incb ; use another value +notsame stb ,x + cmpb ,x + bne int32k + clrb + inca ; add count for internal upper 32K +int32k sta sammap0 + stb _internal32k sta _membanks - inca ; add the internal 32K to the count + inca ; add the internal lower 32K to the count ldb #32 mul std _ramsize @@ -68,6 +85,7 @@ map_kernel lda #0 sta map_copy sta banksel + sta sammap0 puls a,pc map_process @@ -75,16 +93,24 @@ map_process beq map_kernel map_process_a sta map_copy + bmi map1 ; map 128 is for the internal upper 32K + sta sammap0 sta banksel rts +map1 sta sammap1 + rts map_process_always pshs a lda U_DATA__U_PAGE+1 ; LSB of 16-bit page map_set_a sta map_copy + bmi map1a + sta sammap0 sta banksel puls a,pc +map1a sta sammap1 + puls a,pc map_save pshs a @@ -104,6 +130,10 @@ copybank lda #0xff tfr a,dp puls a + tsta + bmi copymap1b ; from SAM map 1 to bank B + tstb + bmi copyamap1 ; from bank A to SAM map 1 stu cmpend+1 ; self-modiying code FTW copyf sta