2 ; Extended memory driver for the RamCart 64/128KB cartridge. Driver works
3 ; without problems when statically linked.
4 ; Code is based on GEORAM code by Ullrich von Bassewitz.
5 ; Maciej 'YTM/Elysium' Witkowiak <ytm@elysium.pl>
10 .include "zeropage.inc"
12 .include "em-kernel.inc"
13 .include "em-error.inc"
19 ; ------------------------------------------------------------------------
20 ; Header. Includes jump table
26 .byte $65, $6d, $64 ; "emd"
27 .byte EMD_API_VERSION ; EM API version number
44 ; ------------------------------------------------------------------------
47 RAMC_WINDOW = $DF00 ; Address of RamCart window
48 RAMC_PAGE_LO = $DE00 ; Page register low
49 RAMC_PAGE_HI = $DE01 ; Page register high (only for RC128)
51 ; ------------------------------------------------------------------------
56 pagecount: .res 2 ; Number of pages available
60 ; ------------------------------------------------------------------------
61 ; INSTALL routine. Is called after the driver is loaded into memory. If
62 ; possible, check if the hardware is present and determine the amount of
64 ; Must return an EM_ERR_xx code in a/x.
105 lda #<EM_ERR_NO_DEVICE
106 ldx #>EM_ERR_NO_DEVICE
107 ; rts ; Run into UNINSTALL instead
109 ; ------------------------------------------------------------------------
110 ; UNINSTALL routine. Is called before the driver is removed from memory.
111 ; Can do cleanup or whatever. Must not return anything.
118 ; ------------------------------------------------------------------------
119 ; PAGECOUNT: Return the total number of available pages in a/x.
127 ; ------------------------------------------------------------------------
128 ; USE: Tell the driver that the window is now associated with a given page.
129 ; The RamCart cartridge does not copy but actually map the window, so USE is
135 ; ------------------------------------------------------------------------
136 ; MAP: Map the page in a/x into memory and return a pointer to the page in
137 ; a/x. The contents of the currently mapped page (if any) may be discarded
141 MAP: sta RAMC_PAGE_LO
146 ; Use the RTS from COMMIT below to save a precious byte of storage
148 ; ------------------------------------------------------------------------
149 ; COMMIT: Commit changes in the memory window to extended storage.
153 ; ------------------------------------------------------------------------
154 ; COPYFROM: Copy from extended into linear memory. A pointer to a structure
155 ; describing the request is passed in a/x.
156 ; The function must not return anything.
164 ; - ptr1 contains the struct pointer
165 ; - ptr2 contains the linear memory buffer
166 ; - ptr3 contains -(count-1)
167 ; - tmp1 contains the low page register value
168 ; - tmp2 contains the high page register value
169 ; - X contains the page offset
174 @L1: lda RAMC_WINDOW,x
182 ; Bump count and repeat
201 ; ------------------------------------------------------------------------
202 ; COPYTO: Copy from linear into extended memory. A pointer to a structure
203 ; describing the request is passed in a/x.
204 ; The function must not return anything.
212 ; - ptr1 contains the struct pointer
213 ; - ptr2 contains the linear memory buffer
214 ; - ptr3 contains -(count-1)
215 ; - tmp1 contains the low page register value
216 ; - tmp2 contains the high page register value
217 ; - X contains the page offset
230 ; Bump count and repeat
249 ; ------------------------------------------------------------------------
250 ; Helper function for COPYFROM and COPYTO: Store the pointer to the request
251 ; structure and prepare data for the copy
254 stx ptr1+1 ; Save passed pointer
256 ; Get the page number from the struct and adjust it so that it may be used
257 ; with the hardware. That is: lower 6 bits in tmp1, high bits in tmp2.
266 ; Get the buffer pointer into ptr2
275 ; Get the count, calculate -(count-1) and store it into ptr3
286 ; Get the page offset into X and clear Y