From 7df35cac945232fc20043b989e1e31ffbcd6a7d4 Mon Sep 17 00:00:00 2001 From: Marco van den Heuvel Date: Mon, 30 Nov 2015 09:53:30 -0800 Subject: [PATCH] Started on making c128 function ram emd's. --- asminc/c128.inc | 14 +- libsrc/c128/emd/c128-ifnram.s | 297 ++++++++++++++++++++++++++++++++++ testcode/lib/em-test.c | 1 + 3 files changed, 306 insertions(+), 6 deletions(-) create mode 100755 libsrc/c128/emd/c128-ifnram.s diff --git a/asminc/c128.inc b/asminc/c128.inc index 6e3078297..baee2ac72 100644 --- a/asminc/c128.inc +++ b/asminc/c128.inc @@ -198,12 +198,14 @@ CIA2_CRB := $DD0F ; --------------------------------------------------------------------------- ; I/O: MMU -MMU_CR := $FF00 -MMU_CFG_CC65 := %00001110 ; Bank 0 with kernal ROM -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_CR := $FF00 +MMU_CFG_CC65 := %00001110 ; Bank 0 with kernal ROM +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 ; --------------------------------------------------------------------------- ; Super CPU diff --git a/libsrc/c128/emd/c128-ifnram.s b/libsrc/c128/emd/c128-ifnram.s new file mode 100755 index 000000000..774678f33 --- /dev/null +++ b/libsrc/c128/emd/c128-ifnram.s @@ -0,0 +1,297 @@ +; +; Extended memory driver for the C128 Internal 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_ifnram_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 = 128 + +; ------------------------------------------------------------------------ +; 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: + ldx #$FF + stx curpage + stx curpage+1 ; Invalidate the current page + inx + txa ; A = X = EM_ERR_OK + +; ------------------------------------------------------------------------ +; 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 #