Full Version : Memory Card Reader from LKR (AVR ASM)
avr >>ASSMBLER ROUTINES >>Memory Card Reader from LKR (AVR ASM)


AVR_Admin- 04-18-2006
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



Forumer™ is Voted #1 Free Forum Hosting provider
Build your own community today with the largest message board hosting company.