;**************** ; 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