| CODE |
;************************************ ;******** MEMORYCARD READER ********* ;************************************ ;*** hardware design and AVR code *** ;********* by Shin of LKR *********** ;************************************ .device AT90S1200 .include "1200def.inc" .def ttt=2 .def tmp=r20 .def count=r21 .def tmpi=r22 .def tmpo=r23 .def c_ack=r24 .def tmp2=r25 ;--------- SOME EQU ------------------- .equ WAIT_ACK='W'+'A' .equ WAIT_CLK='W'+'C' .equ DAT = 0 .equ SEL = 3 .equ CLK = 4 .equ A_CMD = 2 .equ C_CMD = 5 .equ A_ACK = 1 .equ C_ACK = 2 .equ bDAT = 1<<0 .equ bSEL = 1<<3 .equ bCLK = 1<<4 .equ bA_CMD = 1<<2 .equ bC_CMD = 1<<5 .equ bA_ACK = 1<<1 .equ bC_ACK = 1<<2 .equ oAMIGA = PORTB .equ oCARD = PORTD .equ iAMIGA = PINB .equ iCARD = PIND .equ cAMIGA = DDRB .equ cCARD = DDRD ;--------- MACROS -------------------- .macro pOUT out o@0,@1 .endmacro .macro pIN in @1,i@0 .endmacro .macro cOUT out c@0,@1 .endmacro .macro pWAIT0 loop: sbic i@0,@1 rjmp loop .endmacro .macro pWAIT1 loop: sbis i@0,@1 rjmp loop .endmacro .macro SETB SBI o@0,@1 .endmacro .macro CLRB CBI o@0,@1 .endmacro ;-------------------------------------- reset: rjmp main ser c_ack reti reti main: ; init cli clr tmp cOUT CARD,tmp cOUT AMIGA,tmp ser tmp pOUT CARD,tmp pOUT AMIGA,tmp push r16 SBI ACSR,7 clr tmp out GIMSK,tmp ldi tmp,3 out MCUCR,tmp ldi tmp,1<<6 out GIMSK,tmp sei ; end init loop: ; I/O pins configured as INPUT clr tmp cOUT CARD,tmp cOUT AMIGA,tmp ser tmp pOUT CARD,tmp pOUT AMIGA,tmp ;wait SEL clr tmp out WDTCR,tmp pWAIT1 AMIGA,SEL pWAIT0 AMIGA,SEL ldi tmp,12 wdr out WDTCR,tmp ldi tmp,bA_ACK|bDAT cOUT AMIGA,tmp ser tmp pOUT AMIGA,tmp ldi tmp,bSEL|bCLK|bC_CMD cOUT CARD,tmp ldi tmp,~bSEL pOUT CARD,tmp ldi tmpo,'D'; first byte out to amiga as 'D' - sign "Device present" wdr rcall amiga_io cpi tmpi,0x81 brne joyemu ser c_ack loopc: ; tst c_ack ; breq loopc wdr clr c_ack mov tmpo,tmpi rcall card_io mov tmpo,tmpi rcall amiga_io sbis iAMIGA,SEL rjmp loopc SETB CARD,SEL rjmp loop ;+++++++++++ PAD EMULATION / DISABLED / +++++++++++++ joyemu: SETB CARD,SEL pWAIT1 AMIGA,SEL rjmp loop ;+++++++++++ CARD SIDE I/O SUBPROGRAM ++++++++++++++ ; 8mhz = 16+16 card_io: ldi count,8 ciol: ldi tmp,~(bSEL|bCLK);1 asr tmpo ;1 brcs cios1 ;1 andi tmp,~(bC_CMD);1 cios1: pOUT CARD,tmp;1 rcall delay ;7 rcall delay ;7 ori tmp,bCLK ;1 pOUT CARD,tmp ;1 pIN CARD,tmp;1 asr tmp ;1 ror tmpi ;1 nop ;1 nop ;1 wdr ;1 nop ;1 nop ;1 dec count ;1 brne ciol ;2 ldi tmp,~bSEL pOUT CARD,tmp ldi tmp,50 delay0: wdr dec tmp brne delay0 delay: ret ;+++++++++++ AMIGA SIDE I/O SUBPROGRAM ++++++++++++++ amiga_io: ldi count,8 pWAIT1 AMIGA,CLK CLRB AMIGA,A_ACK wdr aiol: mov tmp,tmpo ori tmp,~bDAT asr tmpo pWAIT0 AMIGA,CLK pOUT AMIGA,tmp wdr pWAIT1 AMIGA,CLK pIN AMIGA,tmp wdr asr tmp asr tmp asr tmp ror tmpi dec count brne aiol ret |