cc65/libsrc/lynx/eeprom66.s

228 lines
4.3 KiB
ArmAsm

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