;***************
; EEPROM-routines
; for 93C66 (512 bytes as 256 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
;     2010      93c66 support B. Spruck
;     2011      modified to suit cc65 environment Karri Kaksonen
;
; (c) 1995..97 Bastian Schick
; CS    = A7 (18)
; CLK   = A1 (11)
; DI/DO = AUDIN (32)
;
;And now how to contact the EEPROM :
;
;CARD
;PORT               ----\/----      93C66(SMD too)
;(18)  A7   --------| CS     |- +5V
;(11)  A1   --------| CLK    |- NC
;               +---| DI     |- NC
;(32) AUDIN ----+---| DO     |- GND
;                   ----------

        .export         _lynx_eeread_93c66
        .export         _lynx_eewrite_93c66
        .import         popax
        .importzp       ptr1

        .include        "lynx.inc"

; -------------------
; EEPROM command list
EE_C_WRITE      =    $14
EE_C_READ       =    $18
EE_C_ERASE      =    $1C
EE_C_EWEN       =    $13
EE_C_EWEN2      =    $FF   ;; C0 schould be enough
EE_C_EWDS       =    $10
EE_C_EWDS2      =    $00

;**************
; Only lower byte in A is used for address
; unsigned int __fastcall__ lynx_eeread_93c66(unsigned int addr);
_lynx_eeread_93c66:
        ldx #EE_C_READ
        jsr EE_Send11Bit
        jsr EE_Read16Bit
        lda ptr1
        ldx ptr1+1
        rts

;***************
; reads EEPROM-word to ptr1
; A,Y destroyed
EE_Read16Bit:
        lda #$a
        sta IODIR       ; set AUDIN to Input
        clc
        stz ptr1
        stz ptr1+1
        ldy #15
EEloop1:
; 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 EEloop1

        ldx #$1a
        stx IODIR       ; set AUDIN for output
;EE_SET_CS_LOW

        ldx #3
        stx SYSCTL1
        dex
        stx SYSCTL1

        rts

;***************
; write word to EEPROM
; void __fastcall__ lynx_eewrite_93c66(unsigned int addr, unsigned int val);
_lynx_eewrite_93c66:
        sta ptr1
        stx ptr1+1
        ldx #EE_C_EWEN
        lda #EE_C_EWEN2
        jsr EE_Send11Bit
        jsr popax
        ldx #EE_C_WRITE
        jsr EE_Send11Bit
        jsr EE_Send16Bit        ; Sends ptr1 that contains val

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
        ldx #EE_C_EWDS
        lda #EE_C_EWDS2
;       bra EE_Send11Bit ; fall into
;***************
; send A via I2C
; A,Y destroyed
EE_Send11Bit:
; EE_SET_CS_LOW
        ldy #3
        sty SYSCTL1
        dey
        sty SYSCTL1
; EE_SET_CS_HIGH

        ldy #63
EEloop2:
        stz RCART0
        stz RCART0
        dey
        bpl EEloop2

        pha
        txa   ;; Ok erstmal x abarbeiten und A sichern
        ldy #2 ; 3 times
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

        ldy #7 ; 8 times
        pla  ;; jetzt kommt a an die reihe

        ror A
        ror A
        ror A           ; bit 7 at pos. 4
EEloop4:
        tax
        and #$10

        ora #$b
        sta IODAT
; CLK = 1
        stz RCART0
        stz RCART0
; CLK = 0
        stz RCART0
        stz RCART0
        txa
        rol A
        dey
        bpl EEloop4
        rts

;***************
; send ptr1 to EEPROM
EE_Send16Bit:
        lda ptr1+1

        ror A
        ror ptr1
        ror A
        ror ptr1
        ror A
        ror ptr1

        ldy #15
EEloop5:
        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 EEloop5

; EE_SET_CS_LOW
        ldx #3
        stx SYSCTL1
        dex
        stx SYSCTL1
        rts

