ORG #3800,$; SD Card Driver ;------- SDBSF EQU #6000+21;WC global vars SDBSF2 EQU SDBSF+1 CONF EQU #77 DATA EQU #57 CMD_1 EQU %01000000+1; init CMD_12 EQU %01000000+12;Stop Transmiss CMD_16 EQU %01000000+16;Block Size CMD_18 EQU %01000000+18;Mult Read CMD_25 EQU %01000000+25;Mult Write ACMD_41 EQU %01000000+41;init (SDC only) CMD_55 EQU %01000000+55;app CMD CMD_58 EQU %01000000+58;Read OCR ;--------------------------------------- JP SELDEV JP SDINI JP REINI JP XPOZI JP PROZ JP RDDSE JP SDDSE JP RDD256 .16 DS 3 ;--------------------------------------- NSDC NOP ;\ sec num in CLUS EOC NOP ;/ End Of Chain flag ABT NOP BZN DB 4 NR0 DW 4;sectors to load CAHL DS 2 CADE DS 2 LSTSE DS 4 REZDE DS 2 PR DS 4 CLHL DS 2 CLDE DS 2 LLHL DS 4 LTHL DS 2;LAST LTDE DS 2 ;------------ENTRY PATTERN:------------- ENTRY DS 11 EFLG DB 0,0 DB #00;ms DW #0000:DW #0000;time,date DW #0000;acc date CLSDE DS 2 DW #0000:DW #0000;time,date CLSHL DS 2 SIZIK DS 4 NOP ;--------------------------------------- BREZS DS 2;+14 FAT PARAMETERS FSINF DS 4;[+48(2)]+[ADDTOP] BFATS NOP BFTSZ DS 4 BSECPC DS 2;USE 1 BROOTC DS 4 FSTFRC DW 2,0 ADDTOP DS 4 SFAT DS 2 SDFAT DS 4 CUHL DS 2 CUDE DS 2 NXDE DS 2 NXHL DS 2 LDHL DS 2;LOAD/SAVE addres COUNT NOP DUHL DS 2 DUDE DS 2 DUBA NOP UUHL DS 2 BUHL DS 2 GARY DS 2;AAA CLCNT DS 2;couter FCTS DS 4 BUTS DS 4 LSTCAT DS 4;current dir RECCAT DS 4;recycle bin BLKNUM DS 4 ;--------------------------------------- BLKT NOP ;--------------------------------------- ;======================================= XPOZI LD (LTHL),HL,(LTDE),DE PROZ LD (BLKNUM),HL,(BLKNUM+2),DE REINI RET ;i:HL - Address ; A - Sectors RDDSE LD DE,(BLKNUM) LD BC,(BLKNUM+2) EXA CALL CMD18:JR NZ,$ EXA RD1 EXA CALL WTDO:CP #FE:JR NZ,$-5 CALL READS EXA:DEC A:JR NZ,RD1 CALL CMD12,SNB CALL WTBY JP CSH SDDSE LD DE,(BLKNUM) LD BC,(BLKNUM+2) EXA XOR A:IN A,(CONF):AND 2:RET NZ CALL CMD25,WAIT EXA SD1 EXA:CALL SAVDS,DRESP EXA:DEC A:JR NZ,SD1 SDND LD BC,DATA,A,#FD:OUT A:CALL SNB CALL WTBY JP CSH ;--------------------------------------- READS PUSH BC,DE LD A,L:OR A:JR NZ,OLDRDS BIT 0,H:JR NZ,OLDRDS LD BC,#4000 LD A,H SUB B:JR C,MAK:INC C SUB B:JR C,MAK:INC C SUB B:JR C,MAK:INC C SUB B MAK ADD A,B:LD D,A LD B,#60,A,(BC) LD BC,STS:INF:JP M,$-2 LD B,DMADX[:OUT A DEC B:OUT D DEC B:OUT L LD B,DMA_T[:XOR A:OUT A LD B,DMA_N[:DEC A:OUT A LD B,DMA_C[,A,%01000010:OUT A LD DE,512:ADD HL,DE INF:JP M,$-2 RDSEX LD BC,DATA:IN A,A POP DE,BC RET OLDRDS LD BC,DATA .2 INIR JR RDSEX ;--------------------------------------- SAVDS PUSH BC,DE LD BC,DATA,A,#FC:OUT A LD A,L:OR A:JR NZ,OLDSVS BIT 0,H:JR NZ,OLDSVS LD BC,#4000 LD A,H SUB B:JR C,MAS:INC C SUB B:JR C,MAS:INC C SUB B:JR C,MAS:INC C SUB B MAS ADD A,B:LD D,A LD B,#60,A,(BC) LD BC,STS:INF:JP M,$-2 LD B,DMASX[:OUT A DEC B:OUT D DEC B:OUT L LD B,DMA_T[:XOR A:OUT A LD B,DMA_N[:DEC A:OUT A LD B,DMA_C[,A,%11000010:OUT A LD DE,512:ADD HL,DE INF:JP M,$-2 SVSEX LD BC,DATA,A,#FF:OUT A,A POP DE,BC RET OLDSVS .2 OTIR JR SVSEX ;--------------------------------------- RDD256 LD DE,(BLKNUM) LD BC,(BLKNUM+2) EXA:CALL CMD18;JR NZ,$ EXA ;------- RDS256 EXA CALL WTDO:CP #FE:JR NZ,$ ;------- LD BC,#4000 LD A,H SUB B:JR C,MA2:INC C SUB B:JR C,MA2:INC C SUB B:JR C,MA2:INC C SUB B MA2 ADD A,B:LD D,A LD B,#60,A,(BC) LD BC,STS:INF:JP M,$-2 LD B,DMADX[:OUT A DEC B:OUT D DEC B:OUT L LD B,DMA_T[,A,1:OUT A LD B,DMA_N[,A,127:OUT A LD B,DMA_C[,A,%01011010:OUT A .4 INC H INF:JP M,$-2 LD BC,DATA .2 IN A ;------- EXA:DEC A:JR NZ,RDS256 CALL CMD12;JR NZ,$ JP CSH ;--------------------------------------- CMD00 DB %01000000+0:DS 4:DB #95 CMD08 DB %01000000+8,0,0,1,#AA,#87 CMD16 DB %01000000+16,0,0,2,0,#FF ;--------------------------------------- SDINI CALL CSH LD DE,512+10:CALL CYCL LD DE,8000 SDWT DEC DE:LD A,D:OR E:JP Z,NOSD CALL CMD0:JR NZ,SDWT DEC A:JP NZ,SDWT CALL CMD8 PUSH AF .2 IN E IN H IN L POP AF:JR NZ,SDWT BIT 2,A:JR Z,SDNEW ;------- SDOLD LD DE,8000 AA DEC DE:LD A,D:OR E:JR Z,LC LD H,0 CALL ACMD41:JR NZ,AA CP 1:JR Z,AA OR A:JR NZ,LC ;SDV1 Detected JR FBS ;------- LC LD DE,8000 OO DEC DE:LD A,D:OR E:JR Z,NOSD CALL CMD1:JR NZ,OO CP 1:JR Z,OO OR A:JR NZ,NOSD ;MMC Ver.3 Detected JR FBS ;------- SDNEW LD DE,#01AA OR A:SBC HL,DE:JR NZ,NOSD LD DE,8000 YY DEC DE:LD A,D:OR E:JR Z,NOSD LD H,#40 CALL ACMD41:JR NZ,YY CP 1:JR Z,YY OR A:JR NZ,NOSD ;SDV2 Detected CALL CMD58:JR NZ,NOSD LD BC,DATA IN A .3 IN L BIT 6,A:JR Z,FBS;SDV2 Byte Addr ;SDV2 Block Address LD A,1 SDFND LD (BLKT),A SDBS LD (SDBSF),A XOR A JR CSH ;------- FBS CALL CMDi6:JR NZ,NOSD OR A:JR Z,SDFND ;------- NOSD ;CALL SDOFF XOR A:INC A RET ;--------------------------------------- CSH PUSH BC,AF LD BC,CONF,A,%00000011:OUT A LD BC,DATA,A,#FF:OUT A POP AF,BC RET CSL PUSH BC,AF LD BC,CONF CS_ON LD A,%00000001:OUT A LD BC,DATA,A,#FF:OUT A POP AF,BC JP WAIT SNB PUSH BC,AF LD B,16 SnB XOR A:IN A,(DATA):DJNZ SnB POP AF,BC RET CYCL LD BC,DATA Cy LD A,#FF:OUT A DEC DE:LD A,D:OR E:JR NZ,Cy RET ;------- CMDo CALL CSH CALL CSL CMDx PUSH BC LD BC,DATA:OUT A XOR A OUT A OUT A OUT A OUT A DEC A:OUT A POP BC RET CMD1 LD A,CMD_1:CALL CMDo:JP RESP CMD12 LD A,CMD_12:CALL CMDx XOR A:IN A,(DATA) JP RESP CMD55 LD A,CMD_55:CALL CMDo:JP RESP CMD58 LD A,CMD_58:CALL CMDo:JP RESP ;------- ACMD41 CALL CMD55 CALL CSH CALL CSL LD BC,DATA,A,ACMD_41:OUT A LD L,0 OUT H OUT L OUT L OUT L DEC L:OUT L JP RESP ;------- CMD18 LD A,CMD_18 CMDz CALL CSH CALL CSL PUSH HL,DE,BC LD L,C,H,B LD C,A,A,(BLKT):OR A:JR NZ,CMzz EX DE,HL:ADD HL,HL EX DE,HL:ADC HL,HL LD H,L,L,D,D,E,E,A CMzz LD A,C,BC,DATA:OUT A OUT H OUT L OUT D OUT E LD A,#FF:OUT A POP BC,DE,HL JP RESP CMD25 LD A,CMD_25:JR CMDz ;------- CMDi6 LD HL,CMD16:JR CMD CMD8 LD HL,CMD08:JR CMD CMD0 LD HL,CMD00 CMD CALL CSH CALL CSL LD BC,DATA .6 OUTI RESP PUSH DE,BC LD BC,DATA,D,10 RESp IN A:BIT 7,A:JR Z,REZ DEC D:JR NZ,RESp:INC D REZ POP BC,DE RET ;------- DRESP PUSH BC,AF LD BC,DATA IN A:CP #FF:JR Z,$-4 AND #1F:CP 5:JR NZ,ER IN A:OR A:JR Z,$-3 POP AF,BC RET ER AND 15:ADD A,240 LD BC,#0FAF:OUT A CALL SDND;,SDOFF JR $ ;------- WTBY PUSH BC,AF LD BC,DATA:IN A:OR A:JR Z,$-3 POP AF,BC RET WTDO PUSH BC LD BC,DATA:IN A:CP #FF:JR Z,$-4 POP BC RET WAIT PUSH BC,AF LD BC,DATA:IN A:INC A:JR NZ,$-3 POP AF,BC RET SELDEV OR A:LD A,%00000001,HL,SDBSF JR Z,SDn1 SDn2 LD A,%00001011:INC HL SDn1 LD (CS_ON+1),A LD (SDBS+1),HL RET ;--------------------------------------- STS EQU #27AF DMASL EQU #1AAF DMASH EQU #1BAF DMASX EQU #1CAF DMADL EQU #1DAF DMADH EQU #1EAF DMADX EQU #1FAF DMA_T EQU #28AF;0=1, 255=256 DMA_N EQU #26AF;255=512 DMA_C EQU #27AF;RW 1 - - - 0 0 1 ;---------------------------------------