From 2e2f19ba79d3a7b23eb4e69f816df09ca37ee59f Mon Sep 17 00:00:00 2001 From: Marco van den Heuvel Date: Mon, 30 Nov 2015 20:14:45 -0800 Subject: [PATCH] Finished adding c128 internal/external function ram emd's. --- asminc/c128.inc | 4 +- libsrc/c128/emd/c128-efnram.s | 326 ++++++++++++++++++++++++++++++++++ libsrc/c128/emd/c128-ifnram.s | 31 +++- testcode/lib/em-test.c | 1 + 4 files changed, 359 insertions(+), 3 deletions(-) create mode 100755 libsrc/c128/emd/c128-efnram.s diff --git a/asminc/c128.inc b/asminc/c128.inc index baee2ac72..124552647 100644 --- a/asminc/c128.inc +++ b/asminc/c128.inc @@ -204,8 +204,8 @@ MMU_CFG_RAM0 := %00111111 ; Bank 0 full RAM MMU_CFG_RAM1 := %01111111 ; Bank 1 full RAM MMU_CFG_RAM2 := %10111111 ; Bank 2 full RAM MMU_CFG_RAM3 := %11111111 ; Bank 3 full RAM -MMU_CFG_INT_FROM := %00010111 ; Bank 0 with Internal Function RAM/ROM -MMU_CFG_EXT_FROM := %00101011 ; Bank 0 with External Function RAM/ROM +MMU_CFG_INT_FROM := %01010111 ; Bank 1 with Internal Function RAM/ROM +MMU_CFG_EXT_FROM := %01101011 ; Bank 1 with External Function RAM/ROM ; --------------------------------------------------------------------------- ; Super CPU diff --git a/libsrc/c128/emd/c128-efnram.s b/libsrc/c128/emd/c128-efnram.s new file mode 100755 index 000000000..4d179da83 --- /dev/null +++ b/libsrc/c128/emd/c128-efnram.s @@ -0,0 +1,326 @@ +; +; Extended memory driver for the C128 External Function RAM. Driver works +; without problems when statically linked. +; +; Marco van den Heuvel, 2015-11-30 +; + + .include "zeropage.inc" + + .include "em-kernel.inc" + .include "em-error.inc" + .include "c128.inc" + + .macpack generic + .macpack module + + +; ------------------------------------------------------------------------ +; Header. Includes jump table + + module_header _c128_efnram_emd + +; Driver signature + + .byte $65, $6d, $64 ; "emd" + .byte EMD_API_VERSION ; EM API version number + +; Library reference + + .addr $0000 + +; Jump table + + .addr INSTALL + .addr UNINSTALL + .addr PAGECOUNT + .addr MAP + .addr USE + .addr COMMIT + .addr COPYFROM + .addr COPYTO + +; ------------------------------------------------------------------------ +; Constants + +BASE = $8000 +PAGES = 127 ; Do not touch MMU + +; ------------------------------------------------------------------------ +; Data. + +.bss +curpage: .res 2 ; Current page number + +window: .res 256 ; Memory "window" + +.code + +; ------------------------------------------------------------------------ +; INSTALL routine. Is called after the driver is loaded into memory. If +; possible, check if the hardware is present and determine the amount of +; memory available. +; Must return an EM_ERR_xx code in a/x. +; + +INSTALL: + sei + ldx #0 + stx ptr1 + ldx #$80 + stx ptr1+1 + ldx #EM_ERR_NO_DEVICE + cli + rts + +@ram_present: + ldx #$FF + stx curpage + stx curpage+1 ; Invalidate the current page + inx + txa ; A = X = EM_ERR_OK + cli +; rts ; Run into UNINSTALL instead + +; ------------------------------------------------------------------------ +; UNINSTALL routine. Is called before the driver is removed from memory. +; Can do cleanup or whatever. Must not return anything. +; + +UNINSTALL: + rts + + +; ------------------------------------------------------------------------ +; PAGECOUNT: Return the total number of available pages in a/x. +; + +PAGECOUNT: + lda #PAGES + rts + +; ------------------------------------------------------------------------ +; MAP: Map the page in a/x into memory and return a pointer to the page in +; a/x. The contents of the currently mapped page (if any) may be discarded +; by the driver. +; + +MAP: sei + sta curpage + stx curpage+1 ; Remember the new page + + clc + adc #>BASE + sta ptr1+1 + ldy #$00 + sty ptr1 + + lda #window ; Return the window address + cli + rts + +; ------------------------------------------------------------------------ +; USE: Tell the driver that the window is now associated with a given page. + +USE: sta curpage + stx curpage+1 ; Remember the page + lda #window ; Return the window + rts + +; ------------------------------------------------------------------------ +; COMMIT: Commit changes in the memory window to extended storage. + +COMMIT: sei + lda curpage ; Get the current page + ldx curpage+1 + bmi done ; Jump if no page mapped + + clc + adc #>BASE + sta ptr1+1 + ldy #$00 + sty ptr1 + + lda #BASE + sta ptr1+1 ; From + + ldy #EM_COPY::BUF + lda (ptr3),y + sta ptr2 + iny + lda (ptr3),y + sta ptr2+1 ; To + + lda #BASE + sta ptr1+1 ; To + + ldy #EM_COPY::BUF + lda (ptr3),y + sta ptr2 + iny + lda (ptr3),y + sta ptr2+1 ; From + + lda #EM_ERR_NO_DEVICE + cli + rts + +@ram_present: ldx #$FF stx curpage stx curpage+1 ; Invalidate the current page inx txa ; A = X = EM_ERR_OK + cli +; rts ; Run into UNINSTALL instead ; ------------------------------------------------------------------------ ; UNINSTALL routine. Is called before the driver is removed from memory. diff --git a/testcode/lib/em-test.c b/testcode/lib/em-test.c index d6683f550..230e87f57 100644 --- a/testcode/lib/em-test.c +++ b/testcode/lib/em-test.c @@ -97,6 +97,7 @@ static emd_test_t drivers[] = { { '4', "REU", "c128-reu.emd" }, { '5', "VDC", "c128-vdc.emd" }, { '6', "Internal Function RAM", "c128-ifnram.emd" }, + { '7', "External Function RAM", "c128-efnram.emd" }, #endif #if defined(__CBM510__)