]> git.sur5r.net Git - cc65/blobdiff - libsrc/c64/c64-ram.s
Added DTV detection code by Marco van den Heuvel.
[cc65] / libsrc / c64 / c64-ram.s
index 023f86529eabc4c67f4f642015dd824b5d340d22..f176eda494f031f4f5e58cc740d236593e7ab228 100644 (file)
@@ -1,5 +1,6 @@
 ;
-; 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
@@ -43,10 +44,8 @@ PAGES        = ($10000 - BASE) / 256
 ; ------------------------------------------------------------------------
 ; Data.
 
-.data
-curpage:        .byte  $FF             ; Current page number (invalid)
-
 .bss
+curpage:        .res    1               ; Current page number
 window:         .res    256             ; Memory "window"
 
 .code
@@ -59,16 +58,18 @@ window:         .res    256             ; Memory "window"
 ;
 
 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
 
 
@@ -146,37 +147,11 @@ transfer:
 
 ; 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
 
@@ -187,7 +162,7 @@ loop:   lda (ptr1),y
 
 ; Done
 
-done:   rts
+done:   rts              
 
 ; ------------------------------------------------------------------------
 ; COPYFROM: Copy from extended into linear memory. A pointer to a structure
@@ -198,24 +173,24 @@ done:   rts
 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
@@ -231,7 +206,7 @@ common: ldy     #EM_COPY_COUNT+1
 
 ; 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
@@ -244,6 +219,7 @@ common: ldy     #EM_COPY_COUNT+1
 
 ; Transfer the bytes in the last page
 
+        ldy     #$00
 @L3:    lda    (ptr1),y
         sta    (ptr2),y
         iny
@@ -269,16 +245,16 @@ common: ldy     #EM_COPY_COUNT+1
 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