From cc3424a545002599fcad69f585b8c2c76c4e092f Mon Sep 17 00:00:00 2001 From: uz Date: Mon, 25 Apr 2011 18:42:50 +0000 Subject: [PATCH] Access routines for different eeprom types. By Karri Kaksonen. git-svn-id: svn://svn.cc65.org/cc65/trunk@4994 b7a2c559-68d2-44c3-8de9-860c34a00d81 --- include/lynx.h | 39 +++++++ libsrc/lynx/Makefile | 3 + libsrc/lynx/eeprom46.s | 204 +++++++++++++++++++++++++++++++++++ libsrc/lynx/eeprom66.s | 227 +++++++++++++++++++++++++++++++++++++++ libsrc/lynx/eeprom86.s | 236 +++++++++++++++++++++++++++++++++++++++++ 5 files changed, 709 insertions(+) create mode 100644 libsrc/lynx/eeprom46.s create mode 100644 libsrc/lynx/eeprom66.s create mode 100644 libsrc/lynx/eeprom86.s diff --git a/include/lynx.h b/include/lynx.h index 3a9c9141f..ba17dc047 100644 --- a/include/lynx.h +++ b/include/lynx.h @@ -120,6 +120,12 @@ unsigned __fastcall__ lynx_eeprom_write (unsigned char cell, unsigned val); void __fastcall__ lynx_eeprom_erase (unsigned char cell); /* Clear the word at the given address */ +unsigned __fastcall__ lynx_eeread (unsigned cell); +/* Read a 16 bit word from the given address 93C46 93C66 or 93C86*/ + +unsigned __fastcall__ lynx_eewrite (unsigned cell, unsigned val); +/* Write the word at the given address 93C46 93C66 or 93C86*/ + /*****************************************************************************/ @@ -138,6 +144,39 @@ void __fastcall__ lynx_eeprom_erase (unsigned char cell); +/*****************************************************************************/ +/* Sprites */ +/*****************************************************************************/ + + + +#define SPRCTL0_1_bit_per_pixel 0 +#define SPRCTL0_2_bits_per_pixel 0x40 +#define SPRCTL0_3_bits_per_pixel 0x80 +#define SPRCTL0_4_bits_per_pixel 0xc0 +#define SPRCTL0_h_flip 0x20 +#define SPRCTL0_v_flip 0x10 +#define SPRCTL0_shadow 7 +#define SPRCTL0_xor_shadow 6 +#define SPRCTL0_non_collide 5 +#define SPRCTL0_normal 4 +#define SPRCTL0_boundary 3 +#define SPRCTL0_boundary_shadow 2 +#define SPRCTL0_background_no_coll 1 +#define SPRCTL0_background_shadow 0 + +#define SPRCTL1_literal 0x80 +#define SPRCTL1_hsize_vsize_strech_tilt 0x30 +#define SPRCTL1_hsize_vsize_strech 0x20 +#define SPRCTL1_hsize_vsize 0x10 +#define SPRCTL1_no_palette 0x08 +#define SPRCTL1_skip_sprite 0x04 +#define SPRCTL1_start_drawing_up 0x02 +#define SPRCTL1_start_drawing_left 0x01 + +#define SPRCOLL_dont_collide 0x20 +#define SPRCOLL_number_0_3 0x00 + /* End of lynx.h */ #endif diff --git a/libsrc/lynx/Makefile b/libsrc/lynx/Makefile index c5a1c13af..4e0e73d1d 100644 --- a/libsrc/lynx/Makefile +++ b/libsrc/lynx/Makefile @@ -51,6 +51,9 @@ OBJS = bllhdr.o \ ctype.o \ defdir.o \ eeprom.o \ + eeprom46.o \ + eeprom66.o \ + eeprom86.o \ exec.o \ exehdr.o \ extzp.o \ diff --git a/libsrc/lynx/eeprom46.s b/libsrc/lynx/eeprom46.s new file mode 100644 index 000000000..961ecf76a --- /dev/null +++ b/libsrc/lynx/eeprom46.s @@ -0,0 +1,204 @@ +;*************** +; EEPROM-routines +; for 93C46 (128 bytes as 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_eeread_93c46 + .export _lynx_eewrite_93c46 + .import popax + .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_eeread_93c46(unsigned char cell); +; /* Read a 16 bit word from the given address */ +; +_lynx_eeread_93c46: + and #$3f + ora #EE_C_READ + jsr EE_Send9Bit + 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_93c46(unsigned int addr, unsigned int val); +_lynx_eewrite_93c46: + sta ptr1 + stx ptr1+1 + lda #EE_C_EWEN + jsr EE_Send9Bit + jsr popax + and #$3f + ora #EE_C_WRITE + jsr EE_Send9Bit + 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 + lda #EE_C_EWDS +; bra EE_Send9Bit ; fall into +;*************** +; send A via I2C +; A,Y destroyed +;*************** +EE_Send9Bit: +; 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 + + 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 + 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 + diff --git a/libsrc/lynx/eeprom66.s b/libsrc/lynx/eeprom66.s new file mode 100644 index 000000000..0fcf081ed --- /dev/null +++ b/libsrc/lynx/eeprom66.s @@ -0,0 +1,227 @@ +;*************** +; 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 + diff --git a/libsrc/lynx/eeprom86.s b/libsrc/lynx/eeprom86.s new file mode 100644 index 000000000..d645fea51 --- /dev/null +++ b/libsrc/lynx/eeprom86.s @@ -0,0 +1,236 @@ +;*************** +; EEPROM-routs +; for 93C86 (2048 bytes as 1024 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 +; 2010 93c86 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 ----\/---- 93C86(SMD too) +;(18) A7 --------| CS |- +5V +;(11) A1 --------| CLK |- NC +; +---| DI |- NC +;(32) AUDIN ----+---| DO |- GND +; ---------- + + .export _lynx_eeread_93c86 + .export _lynx_eewrite_93c86 + .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_93c86(unsigned int addr); +_lynx_eeread_93c86: + pha + txa + ora #EE_C_READ + tax + pla + jsr EE_Send13Bit + 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_93c86(unsigned int addr, unsigned int val); +_lynx_eewrite_93c86: + sta ptr1 + stx ptr1+1 + ldx #EE_C_EWEN + lda #EE_C_EWEN2 + jsr EE_Send13Bit + jsr popax + pha + txa + ora #EE_C_WRITE + tax + pla + jsr EE_Send13Bit + 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_Send13Bit ; fall into +;*************** +; send A via I2C +; A,Y destroyed +EE_Send13Bit: +; 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 #4 ; 5 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 + -- 2.39.5