;кодировка 866
;опознаётся неправильно
;поэтому напишем много текста кириллицей
;LAST UPDATE: 30.06.2019 savelij
;АДРЕС ЦИКЛА ОБЩЕНИЯ СО СПЕКОМ
COMINT_ EQU 0X026E
_DEV_READ=2
_DEV_WRITE=3
P_DATA EQU 0X57
P_CONF EQU 0X77
CMD_09 EQU 0X49 ;SEND_CSD
CMD_12 EQU 0X4C ;STOP_TRANSMISSION
CMD_17 EQU 0X51 ;READ_SINGLE_BLOCK
CMD_18 EQU 0X52 ;READ_MULTIPLE_BLOCK
CMD_24 EQU 0X58 ;WRITE_BLOCK
CMD_25 EQU 0X59 ;WRITE_MULTIPLE_BLOCK
CMD_55 EQU 0X77 ;APP_CMD
CMD_58 EQU 0X7A ;READ_OCR
CMD_59 EQU 0X7B ;CRC_ON_OFF
ACMD_41 EQU 0X69 ;SD_SEND_OP_COND
;АДРЕС УСТАНОВЩИКА ДРАЙВЕРА НА NeoGS
SETUPSD EQU 0X5B00
;ДРАЙВЕР SD-CARD ДЛЯ NGS
;ВХОДНЫЕ ПАРАМЕТРЫ ОБЩИЕ:
;HL-АДРЕС ЗАГРУЗКИ В ПАМЯТЬ
;BCDE-32-Х БИТНЫЙ НОМЕР СЕКТОРА
;A-КОЛИЧЕСТВО БЛОКОВ (БЛОК=512 БАЙТ)
;ТОЛЬКО ДЛЯ МНОГОБЛОЧНОЙ ЗАПИСИ/ЧТЕНИИ
;ОШИБКИ ВЫДАВАЕМЫЕ НА ВЫХОДЕ:
;A=0-ИНИЦИАЛИЗАЦИЯ ПРОШЛА УСПЕШНО
;A=1-КАРТА НЕ НАЙДЕНА ИЛИ НЕ ОТВЕТИЛА
;ЗАПИСЬ "A" СЕКТОРОВ
;SDWRMUL EX AF,AF'
writesectorsGS
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'
readsectorsGS
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 ;FC
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
GS_INIT
XOR A
OUT (GSDAT),A
ld a,0x23 ;Get number of RAM Pages
OUT (GSCOM),A
halt
halt
IN A,(GSDAT)
inc a
cp 3+1
jr c,SD_NO ;не может быть <3 pages or 0xff pages
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 ПАРАМЕТРОВ ;savelij13: тут виснет
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'
ds 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 ;ОТКУДА КОД НА НГС ЗАКИДЫВАТЬ
incbin "ngssd.bin"