2 ; Extended memory driver for the C64 D2TV (the second or PAL version).
3 ; Driver works without problems when statically linked.
5 ; Ullrich von Bassewitz, 2005-11-27
9 .include "zeropage.inc"
11 .include "em-kernel.inc"
12 .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
40 ; ------------------------------------------------------------------------
43 OP_COPYFROM = %00001101
46 START_BANK = 2 ; Start at $20000
47 PAGES = (2048 - 128) * 4
50 ; ------------------------------------------------------------------------
54 window: .res 256 ; Memory "window"
58 ; The MAP and COMMIT entries will actually call COPYFROM/COPYTO with
59 ; a pointer to the following data structure:
61 dma_params: .word window ; Host address
62 .byte 0 ; Offset in page
63 curpage: .word $0000 ; Page
64 .word .sizeof (window); # bytes to move, lo, hi
68 ; ------------------------------------------------------------------------
69 ; INSTALL routine. Is called after the driver is loaded into memory. If
70 ; possible, check if the hardware is present and determine the amount of
72 ; Must return an EM_ERR_xx code in a/x.
91 lda #<EM_ERR_NO_DEVICE
92 ldx #>EM_ERR_NO_DEVICE
97 stx curpage+1 ; Invalidate curpage
101 ; rts ; Run into UNINSTALL instead
103 ; ------------------------------------------------------------------------
104 ; UNINSTALL routine. Is called before the driver is removed from memory.
105 ; Can do cleanup or whatever. Must not return anything.
111 ; ------------------------------------------------------------------------
112 ; PAGECOUNT: Return the total number of available pages in a/x.
120 ; ------------------------------------------------------------------------
121 ; MAP: Map the page in a/x into memory and return a pointer to the page in
122 ; a/x. The contents of the currently mapped page (if any) may be discarded
127 stx curpage+1 ; Remember the new page
131 jsr COPYFROM ; Copy data into the window
134 ldx #>window ; Return the window address
137 ; ------------------------------------------------------------------------
138 ; USE: Tell the driver that the window is now associated with a given page.
141 stx curpage+1 ; Remember the page
143 ldx #>window ; Return the window
146 ; ------------------------------------------------------------------------
147 ; COMMIT: Commit changes in the memory window to extended storage.
149 COMMIT: lda curpage+1 ; Do we have a page mapped?
150 bmi done ; Jump if no page mapped
157 ; ------------------------------------------------------------------------
158 ; COPYTO: Copy from linear into extended memory. A pointer to a structure
159 ; describing the request is passed in a/x.
160 ; The function must not return anything.
164 stx ptr1+1 ; Save the pointer
166 ldx #OP_COPYTO ; Load the command
169 ; ------------------------------------------------------------------------
170 ; COPYFROM: Copy from extended into linear memory. A pointer to a structure
171 ; describing the request is passed in a/x.
172 ; The function must not return anything.
177 stx ptr1+1 ; Save the pointer
181 ; DTV DMA transfer routine. Expects the command in X.
182 ; NOTE: We're using knowledge about field order in the EM_COPY struct here!
185 jsr WAIT ; Wait until DMA is finished
192 ; Setup the target address and the source and target steps. Y contains zero,
193 ; which is EM_COPY::BUF.
195 sty $d307 ; Source step high = 0
196 sty $d309 ; Dest step high = 0
198 sta $d303 ; Dest address low
200 sty $d306 ; Source step low = 1
201 sty $d308 ; Dest step low = 1
204 lda #$40 ; Dest is always RAM, start at $00000
207 ; Setup the source address. Incrementing Y will make it point to EM_COPY::OFFS.
208 ; We will allow page numbers higher than PAGES and map them to ROM. This will
209 ; allow reading the ROM by specifying a page starting with PAGES.
219 adc #START_BANK ; Carry clear here from WAIT
221 cmp #>PAGES+START_BANK ; Valid range?
223 ora #$40 ; Address RAM
239 ; Wait until DMA is done