;LAST UPDATE: 11.10.2012 savelij
;ОБЩАЯ ТОЧКА ВХОДА ДЛЯ РАБОТЫ С SD КАРТОЙ
GSDDRV DI
IN A,(ZXDATRD) ;ПРИЕМ КОМАНДЫ ДРАЙВЕРА
OUT (CLRCBIT),A ;СБРОС COMANDBIT
LD HL,COMINT_
PUSH HL
ADD A,A
LD E,A
LD D,0
LD HL,TABLSDG
ADD HL,DE
LD E,(HL)
INC HL
LD D,(HL)
EX DE,HL
CALL WDY
IN A,(ZXDATRD) ;ПРИЕМ БИТОВ 31-24 ПАРАМЕТРА
LD B,A
CALL WDY
IN A,(ZXDATRD) ;ПРИЕМ БИТОВ 23-16 ПАРАМЕТРА
LD C,A
CALL WDY
IN A,(ZXDATRD) ;ПРИЕМ БИТОВ 15-8 ПАРАМЕТРА
LD D,A
CALL WDY
IN A,(ZXDATRD) ;ПРИЕМ БИТОВ 7-0 ПАРАМЕТРА
LD E,A
CALL WDY
IN A,(ZXDATRD) ;ПРИЕМ КОЛ-ВО СЕКТОРОВ
JP (HL)
TABLSDG DW SDINITG ;0 ПАРАМЕТРОВ НЕ ТРЕБУЕТ, НА ВЫХОДЕ A
;СМОТРИ ВЫШЕ ПЕРВЫЕ 2 ЗНАЧЕНИЯ
DW SDCMPG ;1 ПРОВЕРКА НАЛИЧИЯ SD КАРТЫ
DW RDMULG ;2 ЧИТАТЬ "A" СЕКТОРОВ
DW WRMULG ;3 ПИСАТЬ "A" СЕКТОРОВ
SDCMPG LD A,CMD_58
LD BC,SD_RSTR
CALL OUT_COG
CALL INOOUTG
IN A,(C)
NOP
IN H,(C)
NOP
IN H,(C)
NOP
IN H,(C)
INC A
JP NZ,OK_WORK
ZAW003G CALL CSHIGHG
LD A,0XEE
JP OUTSTAT
SDINITG CALL CSHIGHG
LD BC,SD_SEND
LD DE,0X20FF
OUT (C),E
DEC D
JR NZ,$-3
LD BC,SD_RSTR
XOR A
EX AF,AF'
ZAW001G LD HL,CMD00G
CALL OUTCOMG
CALL INOOUTG
EX AF,AF'
DEC A
JR Z,ZAW003G
EX AF,AF'
DEC A
JR NZ,ZAW001G
LD HL,CMD08G
CALL OUTCOMG
CALL INOOUTG
IN H,(C)
NOP
IN H,(C)
NOP
IN H,(C)
NOP
IN H,(C)
LD HL,0
BIT 2,A
JR NZ,ZAW006G
LD H,0X40
ZAW006G LD A,CMD_55
CALL OUT_COG
CALL INOOUTG
LD BC,SD_SEND
LD A,ACMD_41
OUT (C),A
NOP
OUT (C),H
NOP
OUT (C),L
NOP
OUT (C),L
NOP
OUT (C),L
LD A,0XFF
OUT (C),A
CALL INOOUTG
AND A
JR NZ,ZAW006G
ZAW004G LD A,CMD_59
CALL OUT_COG
CALL INOOUTG
AND A
JR NZ,ZAW004G
ZAW005G LD HL,CMD16G
CALL OUTCOMG
CALL INOOUTG
AND A
JR NZ,ZAW005G
JP OK_WORK
CSHIGHG PUSH AF
LD A,M_SDNCS+M_SNCLR ;0X81
OUT (SCTRL),A
POP AF
RET
CSLOWG PUSH AF
LD A,M_SDNCS ;1
OUT (SCTRL),A
POP AF
RET
OUTCOMG CALL CSLOWG
PUSH BC
LD BC,0X0600+SD_SEND
OTIR
POP BC
RET
OUT_COG PUSH BC
CALL CSLOWG
LD BC,SD_SEND
OUT (C),A
XOR A
OUT (C),A
NOP
OUT (C),A
NOP
OUT (C),A
NOP
OUT (C),A
DEC A
OUT (C),A
POP BC
RET
SECM20G PUSH HL
PUSH DE
PUSH BC
PUSH AF
PUSH BC
LD A,CMD_58
LD BC,SD_RSTR
CALL OUT_COG
CALL INOOUTG
IN A,(C)
NOP
IN H,(C)
NOP
IN H,(C)
NOP
IN H,(C)
BIT 6,A
POP HL
JR NZ,SECN20G
EX DE,HL
ADD HL,HL
EX DE,HL
ADC HL,HL
LD H,L
LD L,D
LD D,E
LD E,0
SECN20G POP AF
LD BC,SD_SEND
OUT (C),A
NOP
OUT (C),H
NOP
OUT (C),L
NOP
OUT (C),D
NOP
OUT (C),E
LD A,0XFF
OUT (C),A
POP BC
POP DE
POP HL
RET
INOOUTG PUSH DE
LD DE,0X30FF
INWAITG IN A,(SD_RSTR)
CP E
JR NZ,INEXITG
DEC D
JR NZ,INWAITG
INEXITG POP DE
RET
CMD00G DB 0X40,0X00,0X00,0X00,0X00,0X95 ;GO_IDLE_STATE
CMD08G DB 0X48,0X00,0X00,0X01,0XAA,0X87 ;SEND_IF_COND
CMD16G DB 0X50,0X00,0X00,0X02,0X00,0XFF ;SET_BLOCKEN
;ПЕРЕДАЧА ОДНОГО СЕКТОРА НА СПЕК
RDSECTG IN A,(ZXSTAT)
RRA
JR NC,$-3
OUT (CLRCBIT),A
LD BC,SD_RSTR
LD HL,0X0200
IN A,(C)
DEC HL
OUT (ZXDATWR),A
CALL WDN
LD A,H
OR L
JR NZ,$-10
IN A,(C)
NOP
IN A,(C)
RET
;ПЕРЕДАЧА ОДНОГО СЕКТОРА В SD КАРТУ
WRSECTG LD BC,SD_SEND
OUT (C),A
IN A,(ZXSTAT)
RRA
JR NC,$-3
OUT (CLRCBIT),A
LD HL,0X0200
CALL WDY
IN A,(ZXDATRD)
DEC HL
OUT (C),A
LD A,H
OR L
JR NZ,$-10
LD A,0XFF
OUT (C),A
NOP
OUT (C),A
RET
;ЗАПИСЬ "A" СЕКТОРОВ
WRMULG EX AF,AF'
LD A,CMD_25
CALL SECM20G
CALL INOOUTG
INC A
JR NZ,$-4
EX AF,AF'
WRMULG1 EX AF,AF'
LD A,0XFC
CALL WRSECTG
CALL INOOUTG
INC A
JR NZ,$-4
EX AF,AF'
DEC A
JR NZ,WRMULG1
LD C,SD_SEND
LD A,0XFD
OUT (C),A
CALL INOOUTG
INC A
JR NZ,$-4
JR OK_WORK
;ЗАГРУЗКА "A" СЕКТОРОВ
RDMULG EX AF,AF'
LD A,CMD_18
CALL SECM20G
EX AF,AF'
RDMULG1 EX AF,AF'
CALL INOOUTG
CP 0XFE
JR NZ,$-5
CALL RDSECTG
EX AF,AF'
DEC A
JR NZ,RDMULG1
LD A,CMD_12
CALL OUT_COG
CALL INOOUTG
INC A
JR NZ,$-4
OK_WORK CALL CSHIGHG
LD A,0X77
OUTSTAT OUT (ZXDATWR),A
;ОЖИДАНИЕ КОГДА СПЕК ЗАБЕРЕТ БАЙТ ДАННЫХ
WDN IN A,(ZXSTAT)
RLA
JR C,$-3
RET
;ОЖИДАНИЕ КОГДА СПЕК ДАСТ БАЙТ ДАННЫХ
WDY IN A,(ZXSTAT)
RLA
JR NC,$-3
RET