;
-; Extended memory driver for the C64 hidden RAM
+; Extended memory driver for the C64 hidden RAM. Driver works without
+; problems when statically linked.
;
; Ullrich von Bassewitz, 2002-12-02
;
; Driver signature
.byte $65, $6d, $64 ; "emd"
- .byte $00 ; EM API version number
+ .byte EMD_API_VERSION ; EM API version number
; Jump table.
.word INSTALL
- .word DEINSTALL
+ .word UNINSTALL
.word PAGECOUNT
.word MAP
.word USE
; ------------------------------------------------------------------------
; Data.
-.data
-curpage: .byte $FF ; Current page number (invalid)
-
.bss
+curpage: .res 1 ; Current page number
window: .res 256 ; Memory "window"
.code
;
INSTALL:
- lda #<EM_ERR_OK
- ldx #>EM_ERR_OK
- rts
+ ldx #$FF
+ stx curpage ; Invalidate the current page
+ inx ; X = 0
+ txa ; A = X = EM_ERR_OK
+; rts ; Run into UNINSTALL instead
; ------------------------------------------------------------------------
-; DEINSTALL routine. Is called before the driver is removed from memory.
+; UNINSTALL routine. Is called before the driver is removed from memory.
; Can do cleanup or whatever. Must not return anything.
;
-DEINSTALL:
+UNINSTALL:
rts
; Unroll the following loop
-loop: lda (ptr1),y
- sta (ptr2),y
- iny
-
- lda (ptr1),y
- sta (ptr2),y
- iny
-
- lda (ptr1),y
- sta (ptr2),y
- iny
-
- lda (ptr1),y
- sta (ptr2),y
- iny
-
- lda (ptr1),y
- sta (ptr2),y
- iny
-
- lda (ptr1),y
- sta (ptr2),y
- iny
-
- lda (ptr1),y
- sta (ptr2),y
- iny
-
- lda (ptr1),y
+loop: .repeat 8
+ lda (ptr1),y
sta (ptr2),y
iny
+ .endrepeat
bne loop
; Done
-done: rts
+done: rts
; ------------------------------------------------------------------------
; COPYFROM: Copy from extended into linear memory. A pointer to a structure
COPYFROM:
sta ptr3
stx ptr3+1 ; Save the passed em_copy pointer
-
- ldy #EM_COPY_OFFS
+
+ ldy #EM_COPY::OFFS
lda (ptr3),y
sta ptr1
- ldy #EM_COPY_PAGE
+ ldy #EM_COPY::PAGE
lda (ptr3),y
clc
adc #>BASE
sta ptr1+1 ; From
- ldy #EM_COPY_BUF
+ ldy #EM_COPY::BUF
lda (ptr3),y
sta ptr2
iny
lda (ptr3),y
sta ptr2+1 ; To
-common: ldy #EM_COPY_COUNT+1
+common: ldy #EM_COPY::COUNT+1
lda (ptr3),y ; Get number of pages
beq @L2 ; Skip if no full pages
sta tmp1
; Copy the remainder of the page
-@L2: ldy #EM_COPY_COUNT
+@L2: ldy #EM_COPY::COUNT
lda (ptr3),y ; Get bytes in last page
beq @L4
tax
; Transfer the bytes in the last page
+ ldy #$00
@L3: lda (ptr1),y
sta (ptr2),y
iny
COPYTO: sta ptr3
stx ptr3+1 ; Save the passed em_copy pointer
- ldy #EM_COPY_OFFS
+ ldy #EM_COPY::OFFS
lda (ptr3),y
sta ptr2
- ldy #EM_COPY_PAGE
+ ldy #EM_COPY::PAGE
lda (ptr3),y
clc
adc #>BASE
sta ptr2+1 ; To
- ldy #EM_COPY_BUF
+ ldy #EM_COPY::BUF
lda (ptr3),y
sta ptr1
iny