cc65/libsrc/lynx/eeprom.s

256 lines
5.6 KiB
ArmAsm

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