From 20d1cb205427dd5935e60bd060c43cca837d99ff Mon Sep 17 00:00:00 2001 From: cuz Date: Thu, 14 Oct 2004 17:29:22 +0000 Subject: [PATCH] New module eeprom.s git-svn-id: svn://svn.cc65.org/cc65/trunk@3247 b7a2c559-68d2-44c3-8de9-860c34a00d81 --- libsrc/lynx/Makefile | 1 + libsrc/lynx/eeprom.s | 255 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 256 insertions(+) create mode 100644 libsrc/lynx/eeprom.s diff --git a/libsrc/lynx/Makefile b/libsrc/lynx/Makefile index d4f96dd48..a1d28c555 100644 --- a/libsrc/lynx/Makefile +++ b/libsrc/lynx/Makefile @@ -34,6 +34,7 @@ # Object files OBJS = crt0.o \ + eeprom.o \ framerate.o #-------------------------------------------------------------------------- diff --git a/libsrc/lynx/eeprom.s b/libsrc/lynx/eeprom.s new file mode 100644 index 000000000..5dc535b4a --- /dev/null +++ b/libsrc/lynx/eeprom.s @@ -0,0 +1,255 @@ +;**************** +; 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 + + -- 2.39.5