|
|
|
@ -15,38 +15,31 @@ |
|
|
|
; |
|
|
|
#IF (PLATFORM==PLT_N8) |
|
|
|
SD_CS .EQU $04 ; RTC BIT 2, SD CARD SELECT (ACTIVE HI) |
|
|
|
#IF (!SDCSIO) |
|
|
|
#IF (!SDCSIO) |
|
|
|
SD_CLK .EQU $02 ; RTC BIT 1, SD CLOCK |
|
|
|
SD_DOUT .EQU $01 ; RTC BIT 0, SD DATA OUT |
|
|
|
SD_DIN .EQU $40 ; RTC BIT 6, SD DATA IN |
|
|
|
#ENDIF |
|
|
|
#ENDIF |
|
|
|
#ELSE |
|
|
|
#IF (PPISD) |
|
|
|
#IF (PPISD) |
|
|
|
SD_CS .EQU $10 ; PC4, SD CARD SELECT (ACTIVE LO) |
|
|
|
SD_CLK .EQU $02 ; PC1, SD CLOCK |
|
|
|
SD_DOUT .EQU $01 ; PC0, SD DATA OUT |
|
|
|
SD_DIN .EQU $80 ; PB7, SD DATA IN |
|
|
|
#ELSE |
|
|
|
#ELSE |
|
|
|
#IF (S2ISD) |
|
|
|
SD_CS .EQU $08 ; MCR:3 OUT2, CD, ACT=LO=0 |
|
|
|
SD_CLK .EQU $04 ; MCR:2 OUT1, CLK, ACT=LO=1 |
|
|
|
SD_DOUT .EQU $20 ; MSR:5 DSR, DAT0, ACT=HI=0 (INV) |
|
|
|
SD_DIN .EQU $01 ; MCR:0 DTR, CMD, ACT=HI=0 (INV) |
|
|
|
#ELSE |
|
|
|
SD_CS .EQU $04 ; RTC BIT 2, SD CARD SELECT (ACTIVE HI) |
|
|
|
SD_CLK .EQU $40 ; RTC BIT 6, SD CLOCK |
|
|
|
SD_DOUT .EQU $80 ; RTC BIT 7, DATA OUT TO SD-CARD |
|
|
|
SD_DIN .EQU $40 ; RTC BIT 6, DATA IN FROM SD-CARD |
|
|
|
#ENDIF |
|
|
|
#ENDIF |
|
|
|
#ENDIF |
|
|
|
#ENDIF |
|
|
|
|
|
|
|
;#IF (!SDCSIO) |
|
|
|
;#IF (PLATFORM = PLT_N8) |
|
|
|
;SD_CS .EQU $04 ; RTC BIT 2, SD CARD SELECT |
|
|
|
;SD_CLK .EQU $02 ; RTC BIT 1, SD CLOCK |
|
|
|
;SD_DOUT .EQU $01 ; RTC BIT 0, SD DATA OUT |
|
|
|
;SD_DIN .EQU $40 ; RTC BIT 6, SD DATA IN |
|
|
|
;#ELSE ; Zeta or Z80-SBC MK II |
|
|
|
;SD_CS .EQU $04 ; RTC BIT 2, SD CARD SELECT |
|
|
|
;SD_CLK .EQU $40 ; RTC BIT 6, SD CLOCK |
|
|
|
;SD_DOUT .EQU $80 ; RTC BIT 7, DATA OUT TO SD-CARD |
|
|
|
;SD_DIN .EQU $40 ; RTC BIT 6, DATA IN FROM SD-CARD |
|
|
|
;#ENDIF |
|
|
|
;#ENDIF |
|
|
|
; |
|
|
|
; SD CARD COMMANDS |
|
|
|
; |
|
|
|
@ -115,6 +108,13 @@ SD_INIT: |
|
|
|
OUT (PPIX),A |
|
|
|
LD A,30H ; PC4,5 /CS HIGH |
|
|
|
OUT (PPIC),A |
|
|
|
#ENDIF |
|
|
|
#IF (S2ISD) |
|
|
|
IN A,(SIO_MCR) |
|
|
|
OR SD_CS ; DEASSERT = HI = 1 |
|
|
|
AND ~SD_DIN ; DEASSERT DIN = LO = 1 |
|
|
|
AND ~SD_CLK ; DEASSERT CLK = LO = 1 |
|
|
|
OUT (SIO_MCR),A |
|
|
|
#ENDIF |
|
|
|
XOR A |
|
|
|
DEC A |
|
|
|
@ -149,8 +149,13 @@ SD_SENDCLKS: |
|
|
|
LD A,02 ;PC1=0, RESET CLOCK |
|
|
|
OUT (PPIX),A |
|
|
|
#ELSE |
|
|
|
#IF (S2ISD) |
|
|
|
OUT (SIO_MCR),A |
|
|
|
XOR SD_CLK |
|
|
|
#ELSE |
|
|
|
OUT (RTC),A |
|
|
|
XOR SD_CLK ; TOGGLE CLOCK BIT |
|
|
|
#ENDIF |
|
|
|
#ENDIF |
|
|
|
DJNZ SD_SENDCLKS |
|
|
|
RET |
|
|
|
@ -188,8 +193,15 @@ SD_DONE: |
|
|
|
OUT (PPIC),A ;PC4=1 /CS INACTIVE |
|
|
|
LD B,16 |
|
|
|
#ELSE |
|
|
|
#IF (S2ISD) |
|
|
|
IN A,(SIO_MCR) |
|
|
|
OR SD_CS ; TURN OFF CS |
|
|
|
OUT (SIO_MCR),A |
|
|
|
LD B,17 |
|
|
|
#ELSE |
|
|
|
XOR A |
|
|
|
LD B,17 |
|
|
|
#ENDIF |
|
|
|
#ENDIF |
|
|
|
CALL SD_SENDCLKS |
|
|
|
#ELSE |
|
|
|
@ -226,20 +238,37 @@ SD_PUT2: |
|
|
|
DJNZ SD_PUT1 ;REPEAT FOR ALL 8 BITS |
|
|
|
RET |
|
|
|
#ELSE |
|
|
|
#IF (!SDCSIO) |
|
|
|
#IF (S2ISD) |
|
|
|
; CALL PRTHEXBYTE ; *DEBUG* |
|
|
|
XOR $FF ; INVERT FOR S2ISD INTERFACE |
|
|
|
LD C,A ; C=BYTE TO SEND |
|
|
|
LD B,8 ; SEND 8 BITS (LOOP 8 TIMES) |
|
|
|
IN A,(SIO_MCR) ; START WITH CURRENT MCR REG VAUE |
|
|
|
SD_PUT1: |
|
|
|
RRA ; PREPARE A FOR ROTATE |
|
|
|
RL C ; ROTATE NEXT DATA BIT FROM C INTO CF |
|
|
|
RLA ; ROTATE DATA BIT INTO A:0 |
|
|
|
OR SD_CLK ; ASSERT CLOCK |
|
|
|
OUT (SIO_MCR),A ; SEND IT |
|
|
|
AND ~SD_CLK ; DEASSERT CLOCK |
|
|
|
OUT (SIO_MCR),A ; SEND IT |
|
|
|
DJNZ SD_PUT1 ; REPEAT FOR ALL 8 BITS |
|
|
|
RET |
|
|
|
#ELSE |
|
|
|
#IF (!SDCSIO) |
|
|
|
; CALL PRTHEXBYTE ; *DEBUG* |
|
|
|
LD C,A ; C=BYTE TO SEND |
|
|
|
LD B,8 ; SEND 8 BITS (LOOP 8 TIMES) |
|
|
|
SD_PUT1: |
|
|
|
#IF (PLATFORM=PLT_N8) |
|
|
|
#IF (PLATFORM==PLT_N8) |
|
|
|
LD A,2 ; SD_CS >> 1 (SD_CS WILL BE SET AFTER ROTATE) |
|
|
|
RL C ; ROTATE NEXT BIT FROM C INTO CF |
|
|
|
RLA ; ROTATE CF INTO A:0, SD_DOUT is RTC:0 |
|
|
|
#ELSE |
|
|
|
#ELSE |
|
|
|
LD A,8 ; SD_CS WILL BE IN BIT2 AFTER ROTATE |
|
|
|
RL C ; ROTATE NEXT BIT FROM C INTO CF |
|
|
|
RRA ; ROTATE CARRY INTO A:7, SD_DOUT is RTC:7 |
|
|
|
#ENDIF |
|
|
|
#ENDIF |
|
|
|
OUT (RTC),A ; CLOCK LOW (ABOUT TO SEND BIT) |
|
|
|
OR SD_CLK ; SET CLOCK BIT |
|
|
|
OUT (RTC),A ; CLOCK HIGH (SEND BIT) |
|
|
|
@ -247,7 +276,7 @@ SD_PUT1: |
|
|
|
AND ~SD_CLK ; RESET CLOCK |
|
|
|
OUT (RTC),A ; LEAVE WITH CLOCK LOW |
|
|
|
RET |
|
|
|
#ELSE |
|
|
|
#ELSE |
|
|
|
CALL MIRROR ; MSB<-->LSB mirror bits, result in C |
|
|
|
CALL SD_WAITRX ; MAKE SURE WE ARE DONE SENDING |
|
|
|
OUT0 (CPU_TRDR),C ; put byte in buffer |
|
|
|
@ -255,7 +284,8 @@ SD_PUT1: |
|
|
|
SET 4,A ; set transmit enable |
|
|
|
OUT0 (CPU_CNTR),A |
|
|
|
RET ; let it do the rest |
|
|
|
#ENDIF |
|
|
|
#ENDIF |
|
|
|
#ENDIF |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
; RECEIVE ONE BYTE |
|
|
|
@ -276,7 +306,33 @@ SD_GET1: |
|
|
|
; CALL PRTHEXBYTE ; *DEBUG* |
|
|
|
RET |
|
|
|
#ELSE |
|
|
|
#IF (!SDCSIO) |
|
|
|
#IF (S2ISD) |
|
|
|
LD B,8 ; SEND 8 BITS (LOOP 8 TIMES) |
|
|
|
SD_GET1: |
|
|
|
IN A,(SIO_MCR) ; GET CURRENT MCR TO TOGGLE CLK |
|
|
|
OR SD_CLK ; SET CLK |
|
|
|
OUT (SIO_MCR),A ; SEND IT |
|
|
|
|
|
|
|
NOP |
|
|
|
|
|
|
|
IN A,(SIO_MSR) ; MSR:5 HAS DATA BIT |
|
|
|
RLA ; ROTATE DATA BIT TO A:6 |
|
|
|
RLA ; ROTATE DATA BIT TO A:7 |
|
|
|
RLA ; ROTATE DATA BIT TO CF |
|
|
|
RL C ; NOW ROTATE CF INTO C:0 |
|
|
|
|
|
|
|
IN A,(SIO_MCR) ; GET CURRENT MCR TO TOGGLE CLK |
|
|
|
AND ~SD_CLK ; CLEAR CLK |
|
|
|
OUT (SIO_MCR),A ; SEND IT |
|
|
|
|
|
|
|
DJNZ SD_GET1 ; REPEAT FOR ALL 8 BITS |
|
|
|
LD A,C ; GET BYTE RECEIVED INTO A |
|
|
|
XOR $FF ; INVERT FOR S2ISD INTERFACE |
|
|
|
; CALL PC_PERIOD ; *DEBUG* |
|
|
|
; CALL PRTHEXBYTE ; *DEBUG* |
|
|
|
RET |
|
|
|
#ELSE |
|
|
|
#IF (!SDCSIO) |
|
|
|
LD B,8 ; RECEIVE 8 BITS (LOOP 8 TIMES) |
|
|
|
SD_GET1: |
|
|
|
IN A,(RTC) ; GET RTC BITS |
|
|
|
@ -291,7 +347,7 @@ SD_GET1: |
|
|
|
LD A,C ; GET BYTE RECEIVED INTO A |
|
|
|
; CALL PRTHEXBYTE ; *DEBUG* |
|
|
|
RET |
|
|
|
#ELSE |
|
|
|
#ELSE |
|
|
|
CALL SD_WAITTX ; MAKE SURE WE ARE DONE SENDING |
|
|
|
IN0 A,(CPU_CNTR) ; get CSIO status |
|
|
|
SET 5,A ; start receiver |
|
|
|
@ -301,19 +357,20 @@ SD_GET1: |
|
|
|
CALL MIRROR ; MSB<-->LSB mirror bits |
|
|
|
LD A,C ; keep result |
|
|
|
RET |
|
|
|
#ENDIF |
|
|
|
#ENDIF |
|
|
|
#ENDIF |
|
|
|
#ENDIF |
|
|
|
|
|
|
|
#IF (SDCSIO) |
|
|
|
MIRROR: ; MSB<-->LSB mirror bits in A, result in C |
|
|
|
#IF (!SDCSIOFAST) ; slow speed, least code space |
|
|
|
#IF (!SDCSIOFAST) ; slow speed, least code space |
|
|
|
LD B,8 ; bit counter |
|
|
|
MIRROR1: |
|
|
|
RLA ; rotate bit 7 into carry |
|
|
|
RR C ; rotate carry into result |
|
|
|
DJNZ MIRROR1 ; do all 8 bits |
|
|
|
RET |
|
|
|
#ELSE ; fastest but uses most code space |
|
|
|
#ELSE ; fastest but uses most code space |
|
|
|
LD BC,MIRTAB ; 256 byte mirror table |
|
|
|
ADD A,C ; add offset |
|
|
|
LD C,A |
|
|
|
@ -323,7 +380,7 @@ MIRROR2: |
|
|
|
LD A,(BC) ; get result |
|
|
|
LD C,A ; return result in C |
|
|
|
RET |
|
|
|
#ENDIF |
|
|
|
#ENDIF |
|
|
|
#ENDIF |
|
|
|
|
|
|
|
; |
|
|
|
@ -334,14 +391,20 @@ SD_WAITRDY: |
|
|
|
LD A,21H ;/CS ACTIVE (PC4), DOUT=1 (PC0) |
|
|
|
OUT (PPIC),A |
|
|
|
#ELSE |
|
|
|
#IF (S2ISD) |
|
|
|
IN A,(SIO_MCR) |
|
|
|
AND ~SD_CS ; ASSERT CS (1) |
|
|
|
OUT (SIO_MCR),A |
|
|
|
#ELSE |
|
|
|
IN A,(RTC) |
|
|
|
#IF (!SDCSIO) |
|
|
|
#IF (!SDCSIO) |
|
|
|
OR SD_CS | SD_DOUT ; SET SD_CS (CHIP SELECT) |
|
|
|
#ELSE |
|
|
|
#ELSE |
|
|
|
CALL SD_WAITTX ; MAKE SURE WE ARE DONE SENDING |
|
|
|
OR SD_CS ; SET SD_CS (CHIP SELECT) |
|
|
|
#ENDIF |
|
|
|
#ENDIF |
|
|
|
OUT (RTC),A |
|
|
|
#ENDIF |
|
|
|
#ENDIF |
|
|
|
LD DE,0 ; LOOP MAX (TIMEOUT) |
|
|
|
SD_WAITRDY1: |
|
|
|
@ -474,6 +537,11 @@ SD_EXEC1: |
|
|
|
IN A,(RTC) |
|
|
|
OR SD_CS ; SET CS |
|
|
|
OUT (RTC),A |
|
|
|
#ENDIF |
|
|
|
#IF (S2ISD) |
|
|
|
IN A,(SIO_MCR) |
|
|
|
AND ~SD_CS ; ASSERT = LO = 0 |
|
|
|
OUT (SIO_MCR),A |
|
|
|
#ENDIF |
|
|
|
LD A,(HL) |
|
|
|
CALL SD_PUT |
|
|
|
@ -544,14 +612,22 @@ SD_INITCARD: |
|
|
|
CALL SD_DONE ; SEEMS TO HELP SOME CARDS... |
|
|
|
|
|
|
|
#IF (!SDCSIO) |
|
|
|
#IF (PPISD) |
|
|
|
#IF (PPISD) |
|
|
|
LD A,21H ; /CS=0, DOUT=1, CLK=0 |
|
|
|
OUT (PPIC),A |
|
|
|
LD B,07FH ; 127 CLOCKS (255 TRANSITIONS STARTING WITH LO) |
|
|
|
#ELSE |
|
|
|
#ELSE |
|
|
|
#IF (S2ISD) |
|
|
|
IN A,(SIO_MCR) |
|
|
|
OR SD_CS ; DEASSERT CS = HI = 1 |
|
|
|
AND ~SD_DIN ; ASSERT DIN = HI = 0 |
|
|
|
AND ~SD_CLK ; DEASSERT CLK = HI = 0 |
|
|
|
LD B,0FFH ; 127 CLOCKS (255 TRANSITIONS STARTING WITH LO) |
|
|
|
#ELSE |
|
|
|
LD A,SD_CS | SD_DOUT ; CS=HI, DOUT=HI |
|
|
|
LD B,0FFH ; 127 CLOCKS (255 TRANSITIONS STARTING WITH LO) |
|
|
|
#ENDIF |
|
|
|
#ENDIF |
|
|
|
#ENDIF |
|
|
|
#ELSE |
|
|
|
CALL SD_WAITTX ; MAKE SURE WE ARE DONE SENDING |
|
|
|
IN A,(RTC) |
|
|
|
|