;LAST UPDATE: 01.12.2014 savelij
;АДРЕС ЦИКЛА ОБЩЕНИЯ СО СПЕКОМ
COMINT_ EQU 0X026E
;АДРЕС УСТАНОВЩИКА ДРАЙВЕРА НА NeoGS
SETUPSD EQU 0X5B00
;ДРАЙВЕР SD-CARD ДЛЯ NGS
;ВХОДНЫЕ ПАРАМЕТРЫ ОБЩИЕ:
;HL-АДРЕС ЗАГРУЗКИ В ПАМЯТЬ
;BCDE-32-Х БИТНЫЙ НОМЕР СЕКТОРА
;A-КОЛИЧЕСТВО БЛОКОВ (БЛОК=512 БАЙТ)
;ТОЛЬКО ДЛЯ МНОГОБЛОЧНОЙ ЗАПИСИ/ЧТЕНИИ
;ОШИБКИ ВЫДАВАЕМЫЕ НА ВЫХОДЕ:
;A=0-ИНИЦИАЛИЗАЦИЯ ПРОШЛА УСПЕШНО
;A=1-КАРТА НЕ НАЙДЕНА ИЛИ НЕ ОТВЕТИЛА
COMSDG EX AF,AF'
LD A,IYL
AND A
LD A,(NEXTBYTERST8)
JR Z,COMSDG1
EX (SP),HL
LD A,(HL)
INC HL
EX (SP),HL
COMSDG1 ADD A,A
PUSH HL
LD HL,RET4SDG
EX (SP),HL
PUSH HL
LD HL,NGSSDT
ADD A,L
LD L,A
ADC A,H
SUB L
LD H,A
LD A,(HL)
INC HL
LD H,(HL)
LD L,A
EX AF,AF'
EX (SP),HL
RET
RET4SDG PUSH AF
LD A,IYL
AND A
JR NZ,RET4SDG1
LD (RREG_L),HL
EX (SP),HL
LD (RREG_F),HL
EX (SP),HL
RET4SDG1 POP AF
RET
NGSSDT DW GSDINIT ;ИНИТ SD КАРТЫ
DW GSDCMP ;ПРОВЕРКА НАЛИЧИЯ SD КАРТЫ
DW SDRDMUL ;ЧИТАТЬ "A" СЕКТОРОВ
DW SDWRMUL ;ПИСАТЬ "A" СЕКТОРОВ
;ЗАПИСЬ "A" СЕКТОРОВ
SDWRMUL EX AF,AF'
LD A,_DEV_WRITE
CALL COMM2SD
EX AF,AF'
PUSH DE
PUSH BC
LD BC,GSDAT
SDWRSN1 EX AF,AF'
OUT (GSCOM),A
CALL WC_
LD DE,0X0200
SDWRSN2 OUTI
CALL WD_
DEC DE
LD A,D
OR E
JR NZ,SDWRSN2
EX AF,AF'
DEC A
JR NZ,SDWRSN1
CALL WN_
IN A,(GSDAT)
CP 0X99 ;КАРТА ПОТЕРЯЛАСЬ ПО ВРЕМЯ ЧТЕНИЯ/ЗАПИСИ
JP Z,SD_CARD_LOST
POP BC
POP DE
XOR A
RET
;ЧТЕНИЕ "A" СЕКТОРОВ
SDRDMUL EX AF,AF'
LD A,_DEV_READ
CALL COMM2SD
EX AF,AF'
PUSH DE
PUSH BC
LD D,A
LD A,IYL
BIT 1,A
JR NZ,SDRDSN3
AND A
JR NZ,SDRDSN5
SDRDSN3
; LD A,(R_7FFD)
READ_7FFD
AND 0X10
LD BC,(B0_CPU2)
JR Z,SDRDSN4
LD BC,(B1_CPU2)
SDRDSN4 LD A,0X37
OR B
LD B,A
LD A,C
LD C,LOW (WIN_A0)
OUT (C),A
SDRDSN5 LD A,D
LD BC,GSDAT
SDRDSN1 EX AF,AF'
OUT (GSCOM),A
IN A,(GSCOM)
RRA
JR C,$-3
LD DE,0X0200 ;ПРОДОЛЖАЕМ ЕСЛИ ВСЕ В ПОРЯДКЕ
SDRDSN2 IN A,(GSCOM)
RLA
JR NC,$-3
INI
DEC DE
LD A,D
OR E
JR NZ,SDRDSN2
EX AF,AF'
DEC A
JR NZ,SDRDSN1
IN A,(GSCOM)
RLA
JR NC,$-3
IN A,(GSDAT)
CP 0X99 ;КАРТА ПОТЕРЯЛАСЬ ПО ВРЕМЯ ЧТЕНИЯ/ЗАПИСИ
JP Z,SD_CARD_LOST
LD BC,WIN_P6
XOR A
OUT (C),A
POP BC
POP DE
RET
;ПРОВЕРКА НАЛИЧИЯ КАРТОЧКИ
GSDCMP LD H,CMOS_BYTE_01
PCALL READCMOS,P_ADDONS
LD A,L
AND ACCESSSDG ;ПРОВЕРКА РАЗРЕШЕНИЯ ДОСТУПА К SD КАРТЕ NEOGS
JR Z,SD_NO ;ВЫХОД ЕСЛИ ДОСТУП К КАРТОЧКЕ ЗАПРЕЩЕН
LD A,(FLAGS_DRV)
AND B_INST_SDG
JR Z,SD_NO ;ВЫХОД ЕСЛИ ДРАЙВЕР НЕ УСТАНОВЛЕН
XOR A
OUT (GSDAT),A
LD A,0X1D
OUT (GSCOM),A
IN A,(GSCOM)
RRA
JR C,$-3
IN A,(GSDAT)
LD D,A
AND 0X0F
LD E,A
LD A,D
AND 0XF0
RRCA
RRCA
RRCA
RRCA
CP E
LD A,1
JR NZ,GSDINIT1
CALL INSTSDD
;ИНИЦИАЛИЗАЦИЯ КАРТОЧКИ
GSDINIT XOR A
GSDINIT1 CALL COMM2SD
CALL WN_
GSDINIT2 IN A,(GSDAT)
GSDINIT3 CP 0X99 ;КАРТА ПОТЕРЯЛАСЬ ПО ВРЕМЯ ЧТЕНИЯ/ЗАПИСИ
JP Z,SD_CARD_LOST
CP 0X77
JR NZ,SD_NO
XOR A
RET
SD_NO LD A,1
RET
;ПЕРЕДАТЧИК КОМАНД/ПАРАМЕТРОВ В ДРАЙВЕР НА NeoGS
COMM2SD OUT (GSDAT),A ;УШЛА КОМАНДА ДРАЙВЕРУ
LD A,0X1E
OUT (GSCOM),A
CALL WC_ ;УШЛА КОМАНДА ПРОШИВКЕ
LD A,B
OUT (GSDAT),A
CALL WD_ ;УШЛИ БИТЫ 31-24 ПАРАМЕТРОВ
LD A,C
OUT (GSDAT),A
CALL WD_ ;УШЛИ БИТЫ 23-16 ПАРАМЕТРОВ
LD A,D
OUT (GSDAT),A
CALL WD_ ;УШЛИ БИТЫ 15-8 ПАРАМЕТРОВ
LD A,E
OUT (GSDAT),A
CALL WD_ ;УШЛИ БИТЫ 7-0 ПАРАМЕТРОВ
EX AF,AF'
OUT (GSDAT),A
EX AF,AF'
DUPL 9,0
RET ;УШЛО КОЛ-ВО СЕКТОРОВ
;ОЖИДАНИЕ КОГДА NeoGS БАЙТ ЗАБЕРЕТ
WD_ IN A,(GSCOM)
RLA
JR C,$-3
RET
;ОЖИДАНИЕ КОГДА NeoGS ДАСТ БАЙТ
WN_ IN A,(GSCOM)
RLA
JR NC,$-3
RET
;ОЖИДАНИЕ КОГДА NeoGS КОМАНДУ ЗАБЕРЕТ
WC_ IN A,(GSCOM)
RRA
JR C,$-3
RET
;УСТАНОВЩИК ДРАЙВЕРА НА NeoGS
INSTSDD LD A,0X80
OUT (GSCTR),A ;ПОЛНЫЙ СБРОС NEOGS
EI
HALT
EI
HALT
EI
HALT
DI
LD A,0XF3
OUT (GSCOM),A
LD B,0X30
ISDD1 EI
HALT
DI
DEC B
JR Z,SD_NO
IN A,(GSCOM)
RRA
JR C,ISDD1
LD BC,GSDAT
IN A,(C)
LD DE,0X0300
LD HL,SETUPSD
OUT (C),E
LD A,0X14
OUT (GSCOM),A
CALL WC_
OUT (C),D
CALL WD_
OUT (C),L
CALL WD_
OUT (C),H
CALL WD_
LD HL,UKLAD1
ISDD3 OUTI
CALL WD_
DEC DE
LD A,D
OR E
JR NZ,ISDD3
LD HL,SETUPSD
OUT (C),L
LD A,0X13
OUT (GSCOM),A
CALL WC_
OUT (C),H
EI
HALT
EI
HALT
DI
LD B,3
IN A,(GSDAT)
DEC B
JP Z,SD_NO
CP 0X77
JP NZ,SD_NO
XOR A
RET
UKLAD1 ;ОТКУДА КОД НА НГС ЗАКИДЫВАТЬ
PHASE SETUPSD
;САМ УСТАНОВЩИК ДРАЙВЕРА ДЛЯ NeoGS
DI
LD A,0X9C
OUT (SCTRL),A ;КОНФИГУРАТОР NeoGS
CALL AVTODET
AND A
LD A,0X77 ;0X77-NeoGS НАЙДЕН
JR Z,$+4
LD A,0XCC ;0XCC-НАЙДЕН OLDGS
OUT (ZXDATWR),A
OUT (CLRCBIT),A
JP NZ,COMINT_
DI
IN A,(GSCFG0)
RES B_RAMRO,A
OUT (GSCFG0),A
LD HL,0X1D00
LD (0X0300+(0X1E*2)),HL
LD DE,UKLAD2
LD BC,GSDDRVE-GSDDRV
EX DE,HL
LDIR
IN A,(GSCFG0)
SET B_RAMRO,A
OUT (GSCFG0),A
JP COMINT_
;ПРОВЕРКА ЧТО ЭТО NeoGS И ВКЛЮЧЕНИЕ ЧАСТОТЫ 24MHz
AVTODET IN A,(GSCFG0)
AND 0XCF
OUT (GSCFG0),A ;ОБРАТНАЯ ЗАПИСЬ В ПОРТ СО СБРОШЕННЫМИ
;БИТАМИ 5-4 ВКЛЮЧАЕТ ЧАСТОТУ ПРОЦЕССОРА
;РАВНЫМ 24 МГц
LD D,A
IN A,(GSCFG0)
CP D
LD A,0
RET Z
DEC A
RET
UKLAD2 ;ОТКУДА КОД ПЕРЕКИДЫВАТЬ
DEPHASE
PHASE 0X1D00
;ОБЩАЯ ТОЧКА ВХОДА ДЛЯ РАБОТЫ С SD КАРТОЙ
GSDDRV DI
IN A,(ZXDATRD) ;ПРИЕМ КОМАНДЫ ДРАЙВЕРА
OUT (CLRCBIT),A ;СБРОС COMANDBIT
LD HL,COMINT_
PUSH HL
PUSH IY
LD IYH,0X77
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
LD IYH,0X88 ;КАРТА НЕ ПРОШЛА ПРОВЕРКУ НА НАЛИЧИЕ
JP OK_WORK
ZAW003G LD IYH,0XEE ;КАРТА НЕОБНАРУЖЕНА
JP OK_WORK
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)
INC A
JR NZ,SECN20G1
LD IYH,0X99 ;КАРТА ПОТЕРЯЛАСЬ
SECN20G1 DEC A
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,0X80FF
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
;ПЕРЕДАЧА ОДНОГО СЕКТОРА В SD КАРТУ
WRSECTG LD BC,SD_SEND
OUT (SD_SEND),A
IN A,(ZXSTAT)
RRA
JR NC,$-3
OUT (CLRCBIT),A
LD HL,0X0200
WRSECTG1 CALL WDY
IN A,(ZXDATRD)
DEC HL
OUT (C),A
LD A,H
OR L
JR NZ,WRSECTG1
LD A,0XFF
OUT (C),A
NOP
OUT (C),A
RET
;ПЕРЕДАЧА ОДНОГО СЕКТОРА НА СПЕК
RDSECTG IN A,(ZXSTAT)
RRA
JR NC,$-3
OUT (CLRCBIT),A
LD BC,SD_RSTR
LD HL,0X0200
RDSECTG1 IN A,(C)
DEC HL
OUT (ZXDATWR),A
CALL WDN
LD A,H
OR L
JR NZ,RDSECTG1
IN A,(C)
NOP
IN A,(C)
RET
;ЗАПИСЬ "A" СЕКТОРОВ
WRMULG EX AF,AF'
LD A,CMD_25
CALL SECM20G
LD A,IYH
CP 0X99
JR Z,ERR_WR_LOST
WRMULG3 CALL INOOUTG
INC A
JR NZ,WRMULG3
EX AF,AF'
WRMULG1 EX AF,AF'
LD A,0XFC
CALL WRSECTG
WRMULG2 CALL INOOUTG
INC A
JR NZ,WRMULG2
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
ERR_WR_LOST LD BC,SD_SEND
OUT (SD_SEND),A
IN A,(ZXSTAT)
RRA
JR NC,$-3
OUT (CLRCBIT),A
LD HL,0X0200
ERRWRLOST1 CALL WDY
IN A,(ZXDATRD)
DEC HL
LD A,H
OR L
JR NZ,ERRWRLOST1
JP OK_WORK
ERR_RD_LOST IN A,(ZXSTAT)
RRA
JR NC,$-3
OUT (CLRCBIT),A
LD BC,SD_RSTR
LD HL,0X0200
ERRRDLOST1 XOR A
OUT (ZXDATWR),A
CALL WDN
DEC HL
LD A,H
OR L
JR NZ,ERRRDLOST1
JP OK_WORK
;ЗАГРУЗКА "A" СЕКТОРОВ
RDMULG EX AF,AF'
LD A,CMD_18
CALL SECM20G
LD A,IYH
CP 0X99
JR Z,ERR_RD_LOST
EX AF,AF'
RDMULG1 EX AF,AF'
CALL INOOUTG
CP 0XFE
JR NZ,$-5
RDMULG5 CALL RDSECTG
EX AF,AF'
DEC A
JR NZ,RDMULG1
LD A,CMD_12
CALL OUT_COG
RDMULG3 CALL INOOUTG
INC A
JR NZ,RDMULG3
OK_WORK CALL CSHIGHG
LD A,IYH
POP IY
OUTSTAT OUT (ZXDATWR),A
;ОЖИДАНИЕ КОГДА СПЕК ЗАБЕРЕТ БАЙТ ДАННЫХ
WDN IN A,(ZXSTAT)
RLA
JR C,$-3
RET
;ОЖИДАНИЕ КОГДА СПЕК ДАСТ БАЙТ ДАННЫХ
WDY IN A,(ZXSTAT)
RLA
JR NC,$-3
RET
GSDDRVE
DEPHASE