]> git.sur5r.net Git - cc65/commitdiff
New EMD driver for the ISEPIC cartridge written and contributed by
authoruz <uz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Tue, 2 Feb 2010 18:32:34 +0000 (18:32 +0000)
committeruz <uz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Tue, 2 Feb 2010 18:32:34 +0000 (18:32 +0000)
Marco van den Heuvel with some cleanup by me.

git-svn-id: svn://svn.cc65.org/cc65/trunk@4574 b7a2c559-68d2-44c3-8de9-860c34a00d81

libsrc/c64/Makefile
libsrc/c64/c64-isepic.s [new file with mode: 0755]

index eb0d4122696d6908d26c7d5f4298d8e56974987e..747516a8a64ae1eafaee337e575519054cd498b0 100644 (file)
@@ -71,15 +71,26 @@ OBJS =      _scrsize.o              \
 #--------------------------------------------------------------------------
 # Drivers
 
-EMDS = c64-georam.emd c64-ram.emd c64-ramcart.emd c64-reu.emd c64-vdc.emd dtv-himem.emd
-
-JOYS = c64-hitjoy.joy c64-numpad.joy c64-ptvjoy.joy c64-stdjoy.joy
-
-MOUS = c64-1351.mou c64-joymouse.mou c64-potmouse.mou
-
-SERS = c64-swlink.ser
-
-TGIS = c64-320-200-2.tgi
+EMDS =  c64-georam.emd          \
+        c64-isepic.emd          \
+        c64-ram.emd             \
+        c64-ramcart.emd         \
+        c64-reu.emd             \
+        c64-vdc.emd             \
+        dtv-himem.emd
+
+JOYS =  c64-hitjoy.joy          \
+        c64-numpad.joy          \
+        c64-ptvjoy.joy          \
+        c64-stdjoy.joy
+
+MOUS =  c64-1351.mou            \
+        c64-joymouse.mou        \
+        c64-potmouse.mou
+
+SERS =  c64-swlink.ser
+
+TGIS =  c64-320-200-2.tgi
 
 #--------------------------------------------------------------------------
 # Targets
diff --git a/libsrc/c64/c64-isepic.s b/libsrc/c64/c64-isepic.s
new file mode 100755 (executable)
index 0000000..533dfaf
--- /dev/null
@@ -0,0 +1,270 @@
+;
+; Extended memory driver for the ISEPIC cartridge.
+; Marco van den Heuvel, 2010-01-24
+;
+
+        .include       "zeropage.inc"
+
+        .include       "em-kernel.inc"
+        .include       "em-error.inc"
+
+
+        .macpack       generic
+
+
+; ------------------------------------------------------------------------
+; Header. Includes jump table
+
+.segment        "JUMPTABLE"
+
+; Driver signature
+
+        .byte  $65, $6d, $64           ; "emd"
+        .byte  EMD_API_VERSION         ; EM API version number
+
+; Jump table.
+
+        .word  INSTALL
+        .word  UNINSTALL
+        .word  PAGECOUNT
+        .word  MAP
+        .word  USE
+        .word  COMMIT
+        .word  COPYFROM
+        .word  COPYTO
+
+; ------------------------------------------------------------------------
+; Constants
+
+IP_WINDOW       = $DF00                ; Address of ISEPIC window
+IP_CTRL_BASE    = $DE00
+PAGES           = 8
+
+; ------------------------------------------------------------------------
+; Code.
+
+.code
+
+; ------------------------------------------------------------------------
+; INSTALL routine. Is called after the driver is loaded into memory. If
+; possible, check if the hardware is present and determine the amount of
+; memory available.
+; Must return an EM_ERR_xx code in a/x.
+;
+
+INSTALL:
+        lda    #0
+        sta    IP_CTRL_BASE
+        ldx    IP_WINDOW
+        cpx    IP_WINDOW
+        bne    @notpresent
+        inc    IP_WINDOW
+        cpx    IP_WINDOW
+        beq    @notpresent
+        ldx    IP_WINDOW
+        sta    IP_CTRL_BASE+1
+        inx
+        stx    IP_WINDOW
+        dex
+        sta    IP_CTRL_BASE
+        cpx    IP_WINDOW
+        beq    @setok
+
+@notpresent:
+        lda    #<EM_ERR_NO_DEVICE
+        ldx    #>EM_ERR_NO_DEVICE
+        rts
+
+@setok:
+        lda    #<EM_ERR_OK
+        ldx    #>EM_ERR_OK
+;       rts                            ; Run into UNINSTALL instead
+
+; ------------------------------------------------------------------------
+; UNINSTALL routine. Is called before the driver is removed from memory.
+; Can do cleanup or whatever. Must not return anything.
+;
+
+UNINSTALL:
+        rts
+
+; ------------------------------------------------------------------------
+; PAGECOUNT: Return the total number of available pages in a/x.
+;
+
+PAGECOUNT:
+        lda    #<PAGES
+        ldx    #>PAGES
+        rts
+
+; ------------------------------------------------------------------------
+; USE: Tell the driver that the window is now associated with a given page.
+; The Isepic cartridge does not copy but actually map the window, so USE is
+; identical to MAP.
+
+USE     := MAP
+
+; ------------------------------------------------------------------------
+; MAP: Map the page in a/x into memory and return a pointer to the page in
+; a/x. The contents of the currently mapped page (if any) may be discarded
+; by the driver.
+;
+
+MAP:
+        tax
+        sta    IP_CTRL_BASE,x
+        lda    #<IP_WINDOW
+        ldx    #>IP_WINDOW
+
+; Use the RTS from COMMIT below to save a precious byte of storage
+
+; ------------------------------------------------------------------------
+; COMMIT: Commit changes in the memory window to extended storage.
+
+COMMIT:
+        rts
+
+; ------------------------------------------------------------------------
+; COPYFROM: Copy from extended into linear memory. A pointer to a structure
+; describing the request is passed in a/x.
+; The function must not return anything.
+;
+
+COPYFROM:
+        jsr    setup
+
+; Setup is:
+;
+;   - ptr1 contains the struct pointer
+;   - ptr2 contains the linear memory buffer
+;   - ptr3 contains -(count-1)
+;   - tmp1 contains the low page register value
+;   - X contains the page offset
+;   - Y contains zero
+
+        jmp    @L5
+
+@L1:
+        lda    IP_WINDOW,x
+        sta    (ptr2),y
+        iny
+        bne    @L2
+        inc    ptr2+1
+@L2:
+        inx
+        beq    @L4
+
+; Bump count and repeat
+
+@L3:
+        inc    ptr3
+        bne    @L1
+        inc    ptr3+1
+        bne    @L1
+        rts
+
+; Bump page register
+
+@L4:
+        inc    tmp1            ; Bump low page register
+@L5:
+        stx    tmp2
+        ldx    tmp1
+        sta    IP_CTRL_BASE,x
+        ldx    tmp2
+        jmp    @L3
+
+; ------------------------------------------------------------------------
+; COPYTO: Copy from linear into extended memory. A pointer to a structure
+; describing the request is passed in a/x.
+; The function must not return anything.
+;
+
+COPYTO:
+        jsr    setup
+
+; Setup is:
+;
+;   - ptr1 contains the struct pointer
+;   - ptr2 contains the linear memory buffer
+;   - ptr3 contains -(count-1)
+;   - tmp1 contains the low page register value
+;   - X contains the page offset
+;   - Y contains zero
+
+        jmp    @L5
+
+@L1:
+        lda    (ptr2),y
+        sta    IP_WINDOW,x
+        iny
+        bne    @L2
+        inc    ptr2+1
+@L2:
+        inx
+        beq    @L4
+
+; Bump count and repeat
+
+@L3:
+        inc    ptr3
+        bne    @L1
+        inc    ptr3+1
+        bne    @L1
+        rts
+
+; Bump page register
+
+@L4:
+        inc    tmp1            ; Bump page register
+@L5:
+        stx    tmp2
+        ldx    tmp1
+        sta    IP_CTRL_BASE,x
+        ldx    tmp2
+        jmp    @L3
+
+; ------------------------------------------------------------------------
+; Helper function for COPYFROM and COPYTO: Store the pointer to the request
+; structure and prepare data for the copy
+
+setup:
+        sta    ptr1
+        stx    ptr1+1          ; Save passed pointer
+
+; Get the page number from the struct and remember it.
+
+        ldy    #EM_COPY::PAGE
+        lda    (ptr1),y
+        sta    tmp1
+
+; Get the buffer pointer into ptr2
+
+        ldy    #EM_COPY::BUF
+        lda    (ptr1),y
+        sta    ptr2
+        iny
+        lda    (ptr1),y
+        sta    ptr2+1
+
+; Get the count, calculate -(count-1) and store it into ptr3
+
+        ldy    #EM_COPY::COUNT
+        lda    (ptr1),y
+        eor    #$FF
+        sta    ptr3
+        iny
+        lda    (ptr1),y
+        eor    #$FF
+        sta    ptr3+1
+
+; Get the page offset into X and clear Y
+
+        ldy    #EM_COPY::OFFS
+        lda    (ptr1),y
+        tax
+        ldy    #0
+
+; Done
+
+        rts