]> git.sur5r.net Git - cc65/commitdiff
New EM driver for the C16
authorcuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Mon, 15 Dec 2003 21:10:24 +0000 (21:10 +0000)
committercuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Mon, 15 Dec 2003 21:10:24 +0000 (21:10 +0000)
git-svn-id: svn://svn.cc65.org/cc65/trunk@2762 b7a2c559-68d2-44c3-8de9-860c34a00d81

libsrc/Makefile
libsrc/c16/Makefile
libsrc/c16/c16-ram.s [new file with mode: 0644]
packages/rpm/redhat/cc65.spec

index 6988fc51f8aed9e48e8fbed19351145745707448..9cf401d74d9b79fa5175e26f7e50fea9de5bcdd3 100644 (file)
@@ -99,6 +99,7 @@ c16lib:
        done
        mv c16/crt0.o c16.o
        cp c16/*.joy .
+       cp c16/*.emd .
 
 #-----------------------------------------------------------------------------
 # C64
@@ -131,7 +132,7 @@ c128lib:
            CFLAGS="-Osir -g -T -t c128 --forget-inc-paths -I. -I../../include" \
            $(MAKE) -C $$i || exit 1; \
            $(AR) a c128.lib $$i/*.o;\
-       done
+       done
        mv c128/crt0.o c128.o
        cp c128/*.emd .
        cp c128/*.joy .
index 80adaf9d1d7c917c6a37e64eda80a627c4dea710..e101f71890119378ac14929ba58bc9bc574d25c0 100644 (file)
@@ -20,6 +20,9 @@
 %.joy: %.o ../runtime/zeropage.o
        @$(LD) -t module -o $@ $^
 
+%.ser: %.o ../runtime/zeropage.o
+       @$(LD) -t module -o $@ $^
+
 %.tgi: %.o ../runtime/zeropage.o
        @$(LD) -t module -o $@ $^
 
@@ -46,10 +49,12 @@ OBJS =      _scrsize.o      \
 #--------------------------------------------------------------------------
 # Drivers
 
-EMDS =
+EMDS = c16-ram.emd
 
 JOYS = c16-stdjoy.joy
 
+SERS =
+
 TGIS =
 
 #--------------------------------------------------------------------------
@@ -57,14 +62,14 @@ TGIS =
 
 .PHONY:        all clean zap
 
-all:   $(OBJS) $(EMDS) $(JOYS) $(TGIS)
+all:   $(OBJS) $(EMDS) $(JOYS) $(SERS) $(TGIS)
 
 ../runtime/zeropage.o:
        $(MAKE) -C $(dir $@) $(notdir $@)
 
 clean:
-       @$(RM) $(OBJS) $(EMDS:.emd=.o) $(JOYS:.joy=.o) $(TGIS:.tgi=.o)
+       @$(RM) $(OBJS) $(EMDS:.emd=.o) $(JOYS:.joy=.o) $(SERS:.ser=.o) $(TGIS:.tgi=.o)
 
 zap:   clean
-       @$(RM) $(EMDS) $(JOYS) $(TGIS)
+       @$(RM) $(EMDS) $(JOYS) $(SERS) $(TGIS)
 
diff --git a/libsrc/c16/c16-ram.s b/libsrc/c16/c16-ram.s
new file mode 100644 (file)
index 0000000..3d797c6
--- /dev/null
@@ -0,0 +1,295 @@
+;
+; Extended memory driver for the C16 hidden RAM. Driver works without
+; problems when statically linked.
+;
+; Ullrich von Bassewitz, 2003-12-15
+;
+
+       .include        "zeropage.inc"
+
+       .include        "em-kernel.inc"
+        .include        "em-error.inc"
+       .include        "../plus4/plus4.inc"
+
+        .macpack        generic
+
+
+; ------------------------------------------------------------------------
+; Header. Includes jump table
+
+.segment        "JUMPTABLE"
+
+; Driver signature
+
+        .byte   $65, $6d, $64           ; "emd"
+        .byte   $00                     ; EM API version number
+
+; Jump table.
+
+        .word   INSTALL
+        .word   UNINSTALL
+        .word   PAGECOUNT
+        .word   MAP
+        .word   USE
+        .word   COMMIT
+       .word   COPYFROM
+        .word   COPYTO
+
+; ------------------------------------------------------------------------
+; Constants
+
+BASE           = $8000
+
+; ------------------------------------------------------------------------
+; Data.
+
+.bss
+pages:          .res    1               ; Number of pages
+curpage:        .res    1               ; Current page number
+window:         .res    256             ; Memory "window"
+
+.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:
+
+; Determine how much memory is available. We will use all memory above
+; $8000 up to MEMTOP
+
+        sec
+        jsr     $FF99                  ; MEMTOP: Get top memory into Y/X
+        tya
+        sub     #>BASE                  ; Low 32 K are used
+        bcc     nomem
+        beq     nomem                   ; Offering zero pages is a bad idea
+        sta     pages
+
+        ldx     #$FF
+        stx     curpage                 ; Invalidate the current page
+        inx                             ; X = 0
+        txa                             ; A = X = EM_ERR_OK
+        rts
+
+nomem:  ldx     #>EM_ERR_NO_DEVICE
+        lda     #<EM_ERR_NO_DEVICE
+;       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     #$00                    ; 128 pages max
+        rts
+
+; ------------------------------------------------------------------------
+; 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:    sta     curpage                        ; Remember the new page
+
+        add     #>BASE
+        sta    ptr1+1
+        ldy    #$00
+        sty            ptr1
+
+        lda    #<window
+        sta    ptr2
+        lda    #>window
+        sta    ptr2+1
+
+; Transfer one page
+
+        jsr     transfer                ; Transfer one page
+
+; Return the memory window
+
+        lda     #<window
+        ldx     #>window                ; Return the window address
+        rts
+
+; ------------------------------------------------------------------------
+; USE: Tell the driver that the window is now associated with a given page.
+
+USE:    sta     curpage                 ; Remember the page
+        lda     #<window
+        ldx     #>window                ; Return the window
+        rts
+
+; ------------------------------------------------------------------------
+; COMMIT: Commit changes in the memory window to extended storage.
+
+COMMIT: lda     curpage                        ; Get the current page
+        bmi     done                    ; Jump if no page mapped
+
+        add     #>BASE
+        sta    ptr2+1
+        ldy    #$00
+        sty            ptr2
+
+        lda    #<window
+        sta    ptr1
+        lda    #>window
+        sta    ptr1+1
+
+; Transfer one page. Y must be zero on entry. Because we bank out the
+; kernal, we will run the routine with interrupts disabled but leave
+; short breath times. Unroll the following loop to make it somewhat faster.
+
+transfer:
+        sei
+        sta     ENABLE_RAM
+
+        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
+        sta    (ptr2),y
+        iny
+
+        sta     ENABLE_ROM
+        cli
+
+        bne     transfer
+
+; Done
+
+done:   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:
+        sta     ptr3
+        stx     ptr3+1                  ; Save the passed em_copy pointer
+
+        ldy     #EM_COPY_OFFS
+        lda     (ptr3),y
+        sta     ptr1
+        ldy     #EM_COPY_PAGE
+        lda     (ptr3),y
+        add     #>BASE
+        sta     ptr1+1                  ; From
+
+        ldy     #EM_COPY_BUF
+        lda     (ptr3),y
+        sta     ptr2
+        iny
+        lda     (ptr3),y
+        sta     ptr2+1                  ; To
+
+common: ldy     #EM_COPY_COUNT+1
+        lda     (ptr3),y                ; Get number of pages
+        beq     @L2                     ; Skip if no full pages
+        sta     tmp1
+
+; Copy full pages allowing interrupts after each page copied
+
+        ldy     #$00
+@L1:    jsr     transfer
+        inc     ptr1+1
+        inc     ptr2+1
+        dec     tmp1
+        bne     @L1
+
+; Copy the remainder of the page
+
+@L2:    ldy     #EM_COPY_COUNT
+        lda     (ptr3),y                ; Get bytes in last page
+        beq     @L4
+        tax
+
+        sei                             ; Disable ints
+        sta     ENABLE_RAM              ; Bank out the ROM
+
+; Transfer the bytes in the last page
+
+        ldy     #$00
+@L3:    lda    (ptr1),y
+        sta    (ptr2),y
+        iny
+        dex
+        bne     @L3
+
+; Restore the old memory configuration, allow interrupts
+
+        sta     ENABLE_ROM
+        cli
+
+; Done
+
+@L4:    rts
+
+; ------------------------------------------------------------------------
+; 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: sta     ptr3
+        stx     ptr3+1                  ; Save the passed em_copy pointer
+
+        ldy     #EM_COPY_OFFS
+        lda     (ptr3),y
+        sta     ptr2
+        ldy     #EM_COPY_PAGE
+        lda     (ptr3),y
+        add     #>BASE
+        sta     ptr2+1                  ; To
+
+        ldy     #EM_COPY_BUF
+        lda     (ptr3),y
+        sta     ptr1
+        iny
+        lda     (ptr3),y
+        sta     ptr1+1                  ; From
+
+        jmp     common
+
+
index 16b92df4c1b9ee00dc7f03c016d8996462e34f26..7d4cdef5bfaa614d1397cde11b0866200e7ea7fa 100644 (file)
@@ -195,6 +195,7 @@ programs for the Commodore C16/116 using the cc65 crosscompiler.
 %files c16
 %attr(644,root,root)           /usr/lib/cc65/lib/c16.lib
 %attr(644,root,root)           /usr/lib/cc65/lib/c16.o
+%attr(644,root,root)           /usr/lib/cc65/emd/c16-*.emd
 %attr(644,root,root)           /usr/lib/cc65/joy/c16-*.joy