]> git.sur5r.net Git - cc65/commitdiff
New module eeprom.s
authorcuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Thu, 14 Oct 2004 17:29:22 +0000 (17:29 +0000)
committercuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Thu, 14 Oct 2004 17:29:22 +0000 (17:29 +0000)
git-svn-id: svn://svn.cc65.org/cc65/trunk@3247 b7a2c559-68d2-44c3-8de9-860c34a00d81

libsrc/lynx/Makefile
libsrc/lynx/eeprom.s [new file with mode: 0644]

index d4f96dd48d7fd0711b50eacd9c89992c551d8c6d..a1d28c5550c9642e923802f2b80e54d79a265cd6 100644 (file)
@@ -34,6 +34,7 @@
 # Object files
 
 OBJS = crt0.o          \
+        eeprom.o        \
         framerate.o
 
 #--------------------------------------------------------------------------
diff --git a/libsrc/lynx/eeprom.s b/libsrc/lynx/eeprom.s
new file mode 100644 (file)
index 0000000..5dc535b
--- /dev/null
@@ -0,0 +1,255 @@
+;****************
+; CC65 Lynx Library
+;
+; Originally by Bastian Schick
+; http://www.geocities.com/SiliconValley/Byte/4242/lynx/
+;
+; Ported to cc65 (http://www.cc65.org) by
+; Shawn Jefferson, June 2004
+;
+; Several changes,
+; Ullrich von Bassewitz, 1004-10-14
+;
+;
+;****************
+;* EEPROM-routs
+;* for 93C46 (1024bit => 64 16-bit words)
+;*
+;* created : 11.05.95
+;* last modified :
+;*
+;* 16.02.96      leaner (thanks to Harry)
+;* 12.03.96      test for busy after write and erase (well, Harry ;)) )
+;* 22.08.97      ported to ra65 for use with cc65
+;* 02.12.97      added xref for the new ra65
+;*
+;*
+;* (c) 1995..97 Bastian Schick
+;* CS    = A7 (18)
+;* CLK   = A1 (11)
+;* DI/DO = AUDIN (32)
+;*
+;* And now how to contact the EEPROM :
+;*
+;* CARD
+;* PORT               ----\/----      93C46(SMD too)
+;* (18)  A7   --------| CS     |- +5V
+;* (11)  A1   --------| CLK    |- NC
+;*                +---| DI     |- NC
+;* (32) AUDIN ----+---| DO     |- GND
+;*                    ----------
+;*
+;****************
+
+
+       .export         _lynx_eeprom_read
+        .export         _lynx_eeprom_write
+        .export         _lynx_eeprom_erase
+       .import         popa
+        .importzp       ptr1
+
+        .include        "lynx.inc"
+
+
+; ------------------------------------------------------------------------
+; EEPROM command list
+
+EE_C_WRITE      =    $40
+EE_C_READ       =    $80
+EE_C_ERASE      =    $C0
+EE_C_EWEN       =    $30
+EE_C_EWDS       =    $00
+
+
+; ------------------------------------------------------------------------
+; unsigned __fastcall__ lynx_eeprom_read (unsigned char cell);
+; /* Read a 16 bit word from the given address */
+;
+
+_lynx_eeprom_read:
+        and     #$3f
+        ora     #EE_C_READ
+        jsr     EE_Send9Bit
+
+        lda     #$a
+        sta     IODIR            ; set AUDIN to Input
+
+        clc
+        stz     ptr1
+        stz     ptr1+1          ; Clear result
+        ldy     #16-1           ; Initialize bit counter
+@L1:
+; CLK = 1
+        stz     RCART0
+        stz     RCART0
+; CLK = 0
+        stz     RCART0
+        stz     RCART0
+
+        lda     IODAT
+        and     #$10             ; mask bit
+        adc     #$f0             ; C=1 if A=$10
+        rol     ptr1
+        rol     ptr1+1           ; shifts 0 to Carry
+        dey
+        bpl     @L1
+
+        ldx     #$1a
+        stx     IODIR            ; set AUDIN for output
+;EE_SET_CS_LOW
+
+        ldx     #3
+        stx     SYSCTL1
+        dex
+        stx     SYSCTL1
+
+        lda     ptr1
+        ldy     ptr1+1          ; Load result
+
+        rts
+
+
+; ------------------------------------------------------------------------
+; unsigned __fastcall__ lynx_eeprom_erase (unsigned char cell);
+; /* Clear the word at the given address */
+;
+
+_lynx_eeprom_erase:
+        pha                     ; Save argument
+        lda     #EE_C_EWEN      ; EWEN
+        jsr     EE_Send9Bit
+        pla                     ; Restore cell
+        and     #$3f
+        ora     #EE_C_ERASE     ; clear cell A
+        jsr     EE_Send9Bit
+        bra     EE_wait
+
+
+; ------------------------------------------------------------------------
+; unsigned __fastcall__ lynx_eeprom_write (unsigned char cell, unsigned val);
+; /* Write the word at the given address */
+;
+
+_lynx_eeprom_write:
+        sta     ptr1
+        stx     ptr1+1          ; Save val into ptr1
+        lda     #EE_C_EWEN      ; EWEN
+        jsr     EE_Send9Bit
+        jsr     popa            ; Get cell
+        and     #$3f            ; Make valid range 0..63
+        ora     #EE_C_WRITE     ; WRITE
+        jsr     EE_Send9Bit
+        jsr     EE_Send16Bit    ; Send value in ptr1
+
+EE_wait:
+; EE_SET_CS_HIGH
+
+        ldx     #63
+EEloop:
+        stz     RCART0
+        stz     RCART0
+        dex
+        bpl     EEloop
+
+        lda     #$0A
+        sta     IODIR           ; AUDIN to input
+        lda     #$10
+EE_wait1:
+        bit     IODAT           ; 'til ready :D0-read is /D0-written
+        beq     EE_wait1
+        lda     #$1a            ; AUDIN to output
+        sta     IODIR
+
+        lda     #EE_C_EWDS      ; EWDS
+
+;       bra     EE_Send9Bit     ; fall into
+
+
+; ------------------------------------------------------------------------
+; Send 8 bit value in A to eeprom
+
+EE_Send9Bit:
+; EE_SET_CS_LOW
+        ldx     #3
+        stx     SYSCTL1
+        dex
+        stx     SYSCTL1
+; EE_SET_CS_HIGH
+
+        ldx     #63
+EEloop2:
+        stz     RCART0
+        stz     RCART0
+        dex
+        bpl     EEloop2
+
+        ldy     #8
+        sec                     ; start bit
+        ror     A
+        ror     A
+        ror     A
+        ror     A               ; bit 8 at pos. 4
+EEloop3:
+        tax
+        and     #$10
+        ora     #$b
+        sta     IODAT
+; CLK = 1
+        stz     RCART0
+        stz     RCART0
+; CLK = 0
+        stz     RCART0
+        stz     RCART0
+        txa
+        rol     A
+        dey
+        bpl     EEloop3
+
+        lda     #$b             ; fnr neue EEPROMs
+        sta     IODAT
+
+        rts
+
+; ------------------------------------------------------------------------
+; Send 16 bit value in ptr1 to eeprom
+
+EE_Send16Bit:
+        lda     ptr1+1
+
+        ror     A
+        ror     ptr1
+        ror     A
+        ror     ptr1
+        ror     A
+        ror     ptr1
+
+        ldy     #15
+EEloop4:
+        tax
+        and     #$10
+        ora     #$b
+        sta     IODAT
+; CLK = 1
+        stz     RCART0
+        stz     RCART0
+; CLK = 0
+        stz     RCART0
+        stz     RCART0
+        txa
+        rol     ptr1
+        rol     A
+        dey
+        bpl     EEloop4
+
+; EE_SET_CS_LOW
+        ldx     #3
+        stx     SYSCTL1
+        dex
+        stx     SYSCTL1
+
+        lda     #$b             ; fnr neue EEPROMs
+        sta     IODAT
+
+        rts
+
+