]> git.sur5r.net Git - cc65/blob - libsrc/c128/c128-reu.s
Added C128 swiftlink driver
[cc65] / libsrc / c128 / c128-reu.s
1 ;
2 ; Extended memory driver for the Commodore REU. Driver works without
3 ; problems when statically linked.
4 ;
5 ; Ullrich von Bassewitz, 2002-11-29
6 ;
7
8         .include        "zeropage.inc"
9
10         .include        "em-kernel.inc"
11         .include        "em-error.inc"
12         .include        "c128.inc"
13
14
15         .macpack        generic
16
17
18 ; ------------------------------------------------------------------------
19 ; Header. Includes jump table
20
21 .segment        "JUMPTABLE"
22
23 ; Driver signature
24
25         .byte   $65, $6d, $64           ; "emd"
26         .byte   $00                     ; EM API version number
27
28 ; Jump table.
29
30         .word   INSTALL
31         .word   UNINSTALL
32         .word   PAGECOUNT
33         .word   MAP
34         .word   USE
35         .word   COMMIT
36         .word   COPYFROM
37         .word   COPYTO
38
39 ; ------------------------------------------------------------------------
40 ; Constants
41
42 REU_STATUS      = $DF00                 ; Status register
43 REU_COMMAND     = $DF01                 ; Command register
44 REU_C64ADDR     = $DF02                 ; C64 base address register
45 REU_REUADDR     = $DF04                 ; REU base address register
46 REU_COUNT       = $DF07                 ; Transfer count register
47 REU_IRQMASK     = $DF09                 ; IRQ mask register
48 REU_CONTROL     = $DF0A                 ; Control register
49 REU_TRIGGER     = $FF00                 ; REU command trigger
50
51 OP_COPYFROM     = $ED
52 OP_COPYTO       = $EC
53
54
55 ; ------------------------------------------------------------------------
56 ; Data.
57
58 .bss
59 pagecount:      .res    2               ; Number of pages available
60 curpage:        .res    2               ; Current page number
61
62 window:         .res    256             ; Memory "window"
63
64 reu_params:     .word   $0000           ; Host address, lo, hi
65                 .word   $0000           ; Exp  address, lo, hi
66                 .byte   $00             ; Expansion  bank no.
67                 .word   $0000           ; # bytes to move, lo, hi
68                 .byte   $00             ; Interrupt mask reg.
69                 .byte   $00             ; Adress control reg.
70
71 .code
72
73 ; ------------------------------------------------------------------------
74 ; INSTALL routine. Is called after the driver is loaded into memory. If
75 ; possible, check if the hardware is present and determine the amount of
76 ; memory available.
77 ; Must return an EM_ERR_xx code in a/x.
78 ;
79
80 INSTALL:
81         lda     #$55
82         sta     REU_REUADDR
83         cmp     REU_REUADDR             ; Check for presence of REU
84         bne     nodevice
85         lda     #$AA
86         sta     REU_REUADDR
87         cmp     REU_REUADDR             ; Check for presence of REU
88         bne     nodevice
89
90         ldx     #>(128*4)               ; Assume 128KB
91         lda     REU_STATUS
92         and     #$10                    ; Check size bit
93         beq     @L1
94         ldx     #>(256*4)               ; 256KB when size bit is set
95 @L1:    stx     pagecount+1
96
97         ldx     #$FF
98         stx     curpage
99         stx     curpage+1               ; Invalidate the current page
100         inx
101         txa                             ; X = A = EM_ERR_OK
102         rts
103
104 ; No REU found
105
106 nodevice:
107         lda     #<EM_ERR_NO_DEVICE
108         ldx     #>EM_ERR_NO_DEVICE
109         rts
110
111 ; ------------------------------------------------------------------------
112 ; UNINSTALL routine. Is called before the driver is removed from memory.
113 ; Can do cleanup or whatever. Must not return anything.
114 ;
115
116 UNINSTALL:
117         rts
118
119
120 ; ------------------------------------------------------------------------
121 ; PAGECOUNT: Return the total number of available pages in a/x.
122 ;
123
124 PAGECOUNT:
125         lda     pagecount
126         ldx     pagecount+1
127         rts
128
129 ; ------------------------------------------------------------------------
130 ; MAP: Map the page in a/x into memory and return a pointer to the page in
131 ; a/x. The contents of the currently mapped page (if any) may be discarded
132 ; by the driver.
133 ;
134
135 MAP:    sta     curpage
136         stx     curpage+1               ; Remember the new page
137
138         ldy     #OP_COPYFROM
139         jsr     common                  ; Copy the window
140
141         lda     #<window
142         ldx     #>window                ; Return the window address
143 done:   rts
144
145 ; ------------------------------------------------------------------------
146 ; USE: Tell the driver that the window is now associated with a given page.
147
148 USE:    sta     curpage
149         stx     curpage+1               ; Remember the page
150         lda     #<window
151         ldx     #>window                ; Return the window
152         rts
153
154 ; ------------------------------------------------------------------------
155 ; COMMIT: Commit changes in the memory window to extended storage.
156
157 COMMIT: lda     curpage
158         ldx     curpage+1               ; Do we have a page mapped?
159         bmi     done                    ; Jump if no page mapped
160
161         ldy     #OP_COPYTO
162 common: sty     tmp1
163
164         ldy     #<window
165         sty     REU_C64ADDR
166         ldy     #>window
167         sty     REU_C64ADDR+1
168
169         ldy     #0
170         sty     REU_REUADDR+0
171         sta     REU_REUADDR+1
172         stx     REU_REUADDR+2
173
174         sty     REU_COUNT+0
175         ldy     #1
176         sty     REU_COUNT+1             ; Move 256 bytes
177         bne     transfer1               ; Transfer 256 bytes into REU
178
179 ; ------------------------------------------------------------------------
180 ; COPYFROM: Copy from extended into linear memory. A pointer to a structure
181 ; describing the request is passed in a/x.
182 ; The function must not return anything.
183 ;
184
185 COPYFROM:
186         ldy     #OP_COPYFROM
187         .byte   $2C
188
189 ; ------------------------------------------------------------------------
190 ; COPYTO: Copy from linear into extended memory. A pointer to a structure
191 ; describing the request is passed in a/x.
192 ; The function must not return anything.
193 ;
194
195 COPYTO:
196         ldy     #OP_COPYTO
197         sty     tmp1
198
199 ; Remember the passed pointer
200
201         sta     ptr1
202         stx     ptr1+1          ; Save the pointer
203
204 ; The structure passed to the functions has the same layout as the registers
205 ; of the Commodore REU, so register programming is easy.
206
207         ldy     #7-1
208 @L1:    lda     (ptr1),y
209         sta     REU_C64ADDR,y
210         dey
211         bpl     @L1
212
213 ; Invalidate the page in the memory window
214
215         sty     curpage+1       ; Y = $FF
216
217 ; Reload the REU command and start the transfer
218
219 transfer1:
220         ldy     tmp1
221
222 ; Transfer subroutine for the REU. Expects command in Y.
223
224 transfer:
225         sty     REU_COMMAND     ; Issue command
226
227         ldy     MMU_CR          ; Save the current MMU settings
228         lda     #MMU_CFG_RAM0   ;
229         sei                     ;
230         sta     MMU_CR          ; Enable RAM in bank #0
231         lda     REU_TRIGGER     ; Don't change $FF00
232         sta     REU_TRIGGER     ; Start the transfer...
233
234         sty     MMU_CR          ; Restore the old configuration
235         cli
236         rts
237