mirror of
https://github.com/cc65/cc65.git
synced 2024-11-18 15:05:14 +00:00
256 lines
5.6 KiB
ArmAsm
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
|
||
|
|
||
|
|