2 ; Extended memory driver for the VDC RAM available on all C128 machines
3 ; (based on code by Ullrich von Bassewitz)
4 ; Maciej 'YTM/Elysium' Witkowiak <ytm@elysium.pl>
7 .include "zeropage.inc"
9 .include "em-kernel.inc"
10 .include "em-error.inc"
16 ; ------------------------------------------------------------------------
17 ; Header. Includes jump table
23 .byte $65, $6d, $64 ; "emd"
24 .byte $00 ; EM API version number
37 ; ------------------------------------------------------------------------
40 VDC_ADDR_REG = $D600 ; VDC address
41 VDC_DATA_REG = $D601 ; VDC data
43 VDC_DATA_HI = 18 ; used registers
48 ; ------------------------------------------------------------------------
53 pagecount: .word 64 ; $0000-$3fff as 16k default
54 curpage: .word $ffff ; currently mapped-in page (invalid)
58 window: .res 256 ; memory window
62 ; ------------------------------------------------------------------------
63 ; INSTALL routine. Is called after the driver is loaded into memory. If
64 ; possible, check if the hardware is present and determine the amount of
66 ; Must return an EM_ERR_xx code in a/x.
70 ; do test for VDC presence here???
72 ldx #VDC_CSET ; determine size of RAM...
76 jsr vdcputreg ; turn on 64k
78 jsr settestadr1 ; save original value of test byte
82 lda #$55 ; write $55 here
84 jsr test64k ; read it here and there
85 lda #$aa ; write $aa here
87 jsr test64k ; read it here and there
91 jsr vdcputbyte ; restore original value of test byte
93 lda ptr1 ; do bytes match?
102 jsr vdcputreg ; restore 16/64k flag
103 jmp @endok ; and leave default values for 16k
122 jsr vdcputbyte ; write $55
124 jsr vdcgetbyte ; read here
127 jsr vdcgetbyte ; and there
136 ldy #$02 ; test page 2 (here)
139 ldy #$42 ; or page 64+2 (there)
143 ; ------------------------------------------------------------------------
144 ; DEINSTALL routine. Is called before the driver is removed from memory.
145 ; Can do cleanup or whatever. Must not return anything.
149 ;on C128 restore font and clear the screen?
152 ; ------------------------------------------------------------------------
153 ; PAGECOUNT: Return the total number of available pages in a/x.
161 ; ------------------------------------------------------------------------
162 ; MAP: Map the page in a/x into memory and return a pointer to the page in
163 ; a/x. The contents of the currently mapped page (if any) may be discarded
184 ; copy a single page from (ptr1):VDCRAM to (ptr2):RAM
189 jsr vdcsetsrcaddr ; set source address in VDC
193 @L0: bit VDC_ADDR_REG
195 lda VDC_DATA_REG ; get 2 bytes at a time to speed-up
196 sta (ptr2),y ; (in fact up to 8 bytes could be fetched with special VDC config)
204 ; ------------------------------------------------------------------------
205 ; USE: Tell the driver that the window is now associated with a given page.
208 stx curpage+1 ; Remember the page
210 ldx #>window ; Return the window
213 ; ------------------------------------------------------------------------
214 ; COMMIT: Commit changes in the memory window to extended storage.
217 lda curpage ; jump if no page mapped
229 ; fall through to transferout
231 ; copy a single page from (ptr2):RAM to (ptr1):VDCRAM
236 jsr vdcsetsrcaddr ; set source address in VDC
240 @L0: bit VDC_ADDR_REG
242 lda (ptr2),y ; speedup does not work for writing
248 ; ------------------------------------------------------------------------
249 ; COPYFROM: Copy from extended into linear memory. A pointer to a structure
250 ; describing the request is passed in a/x.
251 ; The function must not return anything.
256 beq @L2 ; Skip if no full pages
266 ; Copy the remainder of the page
268 @L2: ldy #EM_COPY_COUNT
269 lda (ptr3),y ; Get bytes in last page
273 ; Transfer the bytes in the last page
284 ; ------------------------------------------------------------------------
285 ; COPYTO: Copy from linear into extended memory. A pointer to a structure
286 ; describing the request is passed in a/x.
287 ; The function must not return anything.
292 beq @L2 ; Skip if no full pages
302 ; Copy the remainder of the page
304 @L2: ldy #EM_COPY_COUNT
305 lda (ptr3),y ; Get bytes in last page
309 ; Transfer the bytes in the last page
320 ;-------------------------------------------------------------------------
321 ; Helper functions to handle VDC ram
327 @L0: bit VDC_ADDR_REG
340 @L0: bit VDC_ADDR_REG
349 @L0: bit VDC_ADDR_REG
354 ; ------------------------------------------------------------------------
355 ; Helper function for COPYFROM and COPYTO: Store the pointer to the request
356 ; structure and prepare data for the copy
361 stx ptr3+1 ; Save the passed em_copy pointer
378 lda (ptr3),y ; Get number of pages