;LAST UPDATE: 01.05.2013 savelij
BUF_512_ EQU DRV_VAR ;200 БУФЕР СЕКТОРА
NUM_DEVICE EQU DRV_VAR+0X2FF ;1 НОМЕР УСТРОЙСТВА ДЛЯ ЗАПУСКА КОДА
MAS_SLA EQU NUM_DEVICE-1 ;1 МАСКА ДЛЯ MASTER/SLAVE
LOADSCS1 EQU MAS_SLA-2 ;2 АДРЕС ВЫЗЫВАЕМОГО ДРАЙВЕРА
LENGHT EQU LOADSCS1-2 ;2 ДЛИНА ФАЙЛА В БАЙТАХ
;НА ВХОДЕ: A-НОМЕР ВЫБРАННОГО УСТРОЙСТВА
; BCDE-НОМЕР КЛАСТЕРА ЗАПУСКАЕМОГО ФАЙЛА
DI
LD A,(NUM_DEVICE)
AND A
LD HL,READ_SD ;4 ДРАЙВЕР SD ZC КАРТЫ
JR Z,SETLOADER
DEC A
LD HL,READNGS ;5 ДРАЙВЕР SD NGS КАРТЫ
JR Z,SETLOADER
DEC A
LD HL,RD_HDDN ;6 ДРАЙВЕР HDD NEMO
JR Z,SETLOADER
DEC A
LD HL,RD_HDDS ;7 ДРАЙВЕР HDD SMUC
JR Z,SETLOADER
DEC A
LD HL,RD_HDDD ;8 ДРАЙВЕР HDD DIVIDE
JR Z,SETLOADER
LD HL,RD_HDDP
SETLOADER LD (LOADSCS1),HL ;УСТАНОВИЛИ АДРЕС ЧИТАЛКИ СЕКТОРОВ
LD A,(MAS_SLA)
AND A
LD A,0XE0
JR Z,SETMASL
LD A,0XF0
SETMASL LD (MAS_SLA),A
LD HL,(FILE_SRC+0X14)
LD (AFILCLS+2),HL
LD HL,(FILE_SRC+0X1A)
LD (AFILCLS),HL
LD A,(FILE_SRC+8)
CP "S"
JP Z,RUNSPG2 ;ПЕРЕХОД НА ЗАПУСК SPG ФАЙЛА
CALL REALSEC ;ПРЕОБРАЗОВАЛИ В НОМЕР СЕКТОРА
CALL LOADLST ;ЗАГРУЗИЛИ В БУФЕР
EXX
LD HL,(BUF_512_+9)
LD (0X5D45),HL ;АДРЕС СТАРТА КОДА
LD HL,(BUF_512_+0X0B)
LD (LENGHT),HL ;УСТАНОВКА ДЛИНЫ ФАЙЛА В БАЙТАХ
LD DE,0X11
ADD HL,DE ;ПРОПУСК HOBETA ЗАГОЛОВКА
LD A,L
AND A
JR Z,READ01 ;ЕСЛИ МЛАДШИЙ БАЙТ НЕ 0
INC H ;СТАРШИЙ +1
READ01 LD A,H
SRL A ;ДЕЛИМ НА 2 ИБО НА ФАТЕ СЕКТОР 512 БАЙТ
ADC A,0 ;УЧИТЫВАЕМ ЧЕТ/НЕЧЕТ
DEC A ;ПЕРВЫЙ СЕКТОР ЗАГРУЖЕН, ГРУЗИТЬ НА 1 МЕНЬШЕ
EXX
JP Z,LDIRBUF ;ЕСЛИ СЕКТОР 1 ПЕРЕНОС И ЗАПУСК
LD IXL,A ;ЗАПОМНИЛИ КОЛИЧЕСТВО СЕКТОРОВ-1
EXX
CALL LD_ONES ;ПЕРЕНОС ОСТАТКОВ ПЕРВОГО СЕКТОРА
PUSH DE ;АДРЕС КУДА ДАЛЕЕ ГРУЗИТЬ
EXX
LD HL,1 ;ОДИН СЕКТОР УЖЕ ЗАГРУЖЕН
ADD HL,DE ;ДАЛЕЕ ГРУЗИТЬ СО СЛЕДУЮЩЕГО СЕКТОРА
EX DE,HL
JR NC,READ04
INC BC ;BCDE=BCDE+1
READ04 POP HL ;В HL АДРЕС ДЛЯ ПРОДОЛЖЕНИЯ ЗАГРУЗКИ
LD IY,(BYTSSEC) ;LY=КОЛ-ВО СЕКТОРОВ В КЛАСТЕРЕ
LD A,IXL
CP IYL ;СЕКТОРОВ ОСТАЛОСЬ МЕНЬШЕ ЧЕМ В КЛАСТЕРЕ
JR C,READ02 ;ПЕРЕХОД НА ДОЗАГРУЗКУ ОСТАТКА СЕКТОРОВ
INC IXL
LD A,IYL
CP 2
JR C,READ07
DEC A
JR READ05
READ07 PUSH HL
CALL RDFATZP ;ПОЛУЧИТЬ НОМЕР СЛЕДУЮЩЕГО КЛАСТЕРА
CALL LST_CLS ;ПРОВЕРКА НА ОКОНЧАНИЕ FAT ЦУПОЧКИ
POP HL
JR C,RUNLOAD ;ЕСЛИ КЛАСТЕРА ЗАКОНЧИЛИСЬ, ТО ЗАПУСКА ЗАГРУЖЕННОГО
PUSH HL
CALL REALSEC ;ПРЕОБРАЗОВАНИЕ НОМЕРА КЛАСТЕРА В НОМЕР СЕКТОРА
POP HL
LD A,IXL ;СКОЛЬКО СЕКТОРОВ ОСТАЛОСЬ ЗАГРУЗИТЬ
CP IYL ;СРАВНИВАЕМ С РАЗМЕРОМ КЛАСТЕРА
JR C,READ02 ;ЕСЛИ ОСТАЛОСЬ ЗАГРУЗИТЬ СЕКТОРОВ МЕНЬШЕ ЧЕМ В КЛАСТЕРЕ, ТО ДОЗАГРУЖАЕМ ОСТАТОК
LD A,IYL ;СКОЛЬКО СЕКТОРОВ ЗАГРУЖАТЬ
READ05 CALL LOADSCS ;ЗАГРУЗКА СЕКТОРОВ
LD A,IXL ;СКОЛЬКО СЕКТОРОВ ВСЕГО ЗАГРУЖАТЬ
SUB IYL ;МИНУС СКОЛЬКО СЕКТОРОВ ТОЛЬКО ЧТО ЗАГРУЗИЛИ
JR Z,RUNLOAD ;СЕКТОРА КОНЧИЛИСЬ, ПЕРЕХОДИМ НА ЗАПУСК
LD IXL,A ;СКОЛЬКО СЕКТОРОВ ОСТАЛОСЬ ЗАГРУЗИТЬ
JR READ07 ;ПРОДОЛЖАЕМ ЗАГРУЗКУ
;ЗАГРУЗКА КОЛИЧЕСТВА СЕКТОРОВ, ЕСЛИ ОСТАЛОСЬ МЕНЕЕ РАЗМЕРА КЛАСТЕРА
READ02 AND A
JR Z,READ03
CALL LOADSCS
READ03 PUSH HL
LD A,IXL
DEC A
LD L,A
LD H,0
ADD HL,DE
EX DE,HL
JR NC,READ06
INC BC
READ06 CALL LOADLST
LD BC,(LENGHT)
EX DE,HL
LD HL,0X11
ADD HL,BC
LD B,H
LD C,L
EX DE,HL
POP DE
LD A,B
AND 1
LD B,A
OR C
JR Z,RUNLOAD
LDIR
;ЗАПУСК ЗАГРУЖЕННОГО
RUNLOAD LD HL,0X2758
EXX
LD IY,0X5C3A
EI
JP 0X1B7D ;ЗАПУСК ПЕРЕНЕСЕННОЙ БЕЙСИК ПРОГИ
LDIRBUF LD HL,0X200-0X11
LD DE,(BUF_512_+0X0B)
AND A
SBC HL,DE
JR NC,LDIRBUF1
CALL LD_ONES
JP RUNLOAD
LDIRBUF1 LD HL,BUF_512_+0X11
LD DE,(BUF_512_+9)
LD BC,(BUF_512_+0X0B)
LDIR
JP RUNLOAD
;ПЕРЕНОС КУСКА ИЗ УЖЕ ЗАГРУЖЕННОГО СЕКТОРА, ЕСЛИ ФАЙЛ=501 БАЙТ И МЕНЕЕ
LD_ONES LD HL,BUF_512_+0X11
LD DE,(BUF_512_+9)
LD BC,0X200-0X11
LDIR
RET
;ЗАГРУЗИТЬ СЕКТОРА С ВЫБРАННОГО УСТРОЙСТВА
LOADSCS PUSH HL
LD HL,(LOADSCS1)
EX (SP),HL
RET
;LX-КОЛИЧЕСТВО СЕКТОРОВ ДЛЯ ЗАГРУЗКИ
;HX-РАЗМЕР КЛАСТЕРА
;LY-TEMP VAR
;HY-СМЕЩЕНИЕ В КЛАСТЕРЕ
;IXL-РАЗМЕР КЛАСТЕРА
;IXH-TEMP VAR
;IYL-КОЛИЧЕСТВО СЕКТОРОВ ДЛЯ ЗАГРУЗКИ
;IYH-СМЕЩЕНИЕ В КЛАСТЕРЕ
LD_FILE PUSH BC ;СТАРШИЕ 16 БИТ НОМЕРА КЛАСТЕРА
PUSH DE ;МЛАДШИЕ 16 БИТ НОМЕРА КЛАСТЕРА
PUSH HL ;СОХРАНИЛИ АДРЕС ЗАГРУЗКИ
CALL REALSEC ;ПЕРЕВЕЛИ НОМЕР КЛАСТЕРА В НОМЕР СЕКТОРА
LD IX,(BYTSSEC)
LD A,IYH ;HY СМЕЩЕНИЕ В КЛАСТЕРЕ
LD L,A
LD H,0
ADD HL,DE
EX DE,HL
JR NC,LDFILE1
INC BC ;BCDE=НОМЕР СЕКТОРА ОТКУДА ГРУЗИТЬ
LDFILE1 LD A,IYL;IXL ;LX КОЛИЧЕСТВО СЕКТОРОВ ДЛЯ ЗАГРУЗКИ
CP IXL;IXH ;HX РАЗМЕР КЛАСТЕРА
JP C,LDFILE2
LD A,IXL;IXH ;HX РАЗМЕР КЛАСТЕРА
LDFILE2 ADD A,IYH ;HY СМЕЩЕНИЕ В КЛАСТЕРЕ
CP IXL;IXH ;HX РАЗМЕР КЛАСТЕРА
LD A,IYL;IXL ;LX КОЛИЧЕСТВО СЕКТОРОВ ДЛЯ ЗАГРУЗКИ
JP C,LDFILE5
LD A,IXL;IXH ;HX РАЗМЕР КЛАСТЕРА
SUB IYH ;HY СМЕЩЕНИЕ В КЛАСТЕРЕ
LDFILE5 LD IXH,A;IYL,A ;LY,A TEMP VAR ;СКОЛЬКО СЕКТОРОВ СЕЙЧАС ГРУЗИМ
POP HL ;ВОССТАНОВИЛИ АДРЕС ЗАГРУЗКИ
CALL LOADSCS ;ЗАГРУЗИЛИ СЕКТОРА
POP DE
POP BC ;ВОССТАНОВИЛИ НОМЕР КЛАСТЕРА
LD A,IYH ;HY СМЕЩЕНИЕ В КЛАСТЕРЕ
ADD A,IXH;IYL ;LY TEMP VAR
CP IXL;IXH ;HX РАЗМЕР КЛАСТЕРА
JP C,LDFILE3
SUB IXL;IXH ;HX РАЗМЕР КЛАСТЕРА
LDFILE3 LD IYH,A ;HY,A СМЕЩЕНИЕ В КЛАСТЕРЕ
JP C,LDFILE4
PUSH HL ;СОХРАНИЛИ АДРЕС ЗАГРУЗКИ
CALL RDFATZP ;ПРОЧИТАЛИ НОМЕР СЛЕДУЮЩЕГО КЛАСТЕРА
CALL LST_CLS ;ПРОВЕРИЛИ, А МОЖЕТ ЭТО ПОСЛЕДНИЙ КЛАСТЕР?
POP HL ;ВОССТАНОВИЛИ АДРЕС ЗАГРУЗКИ
RET C ;ЕСЛИ ПОСЛЕДНИЙ, ВЫХОДИМ
LDFILE4 LD A,IYL;IXL ;LX КОЛИЧЕСТВО СЕКТОРОВ ДЛЯ ЗАГРУЗКИ
SUB IXH;IYL ;LY TEMP VAR
RET Z
LD IYL,A;IXL,A ;LX,A КОЛИЧЕСТВО СЕКТОРОВ ДЛЯ ЗАГРУЗКИ
JP NZ,LD_FILE
RET
LST_CLS LD A,(CAL_FAT)
AND A
JR NZ,LST_CL1
LD HL,0X0FF7
SBC HL,DE
RET
LST_CL1 DEC A
JR NZ,LST_CL2
LD HL,0XFFF7
SBC HL,DE
RET
LST_CL2 LD HL,0X0FFF
SBC HL,BC
RET NZ
LD HL,0XFFF7
SBC HL,DE
RET
RDFATZP LD BC,(AFILCLS+2)
LD DE,(AFILCLS)
LD A,(CAL_FAT)
AND A
JR Z,RDFATS0
DEC A
JR Z,RDFATS1
EX DE,HL
ADD HL,HL
EX DE,HL
LD HL,0
ADC HL,BC
ADD HL,BC
LD A,E
LD E,D
LD D,L
LD C,H
LD B,0
CALL RDFATS2
INC HL
LD C,(HL)
INC HL
LD B,(HL)
RDFATS5 LD (AFILCLS+2),BC
LD (AFILCLS),DE
RET
RDFATS1 LD BC,0
LD A,E
LD E,D
LD D,C
RDFATS2 PUSH AF
PUSH BC
LD HL,FATSTR
CALL BCDEHLP
CALL LOADLST
POP BC
POP AF
LD E,A
LD D,0
ADD HL,DE
ADD HL,DE
LD E,(HL)
INC HL
LD D,(HL)
JR RDFATS5
RDFATS0 LD H,D
LD L,E
ADD HL,HL
ADD HL,DE
SRL H
RR L
LD A,E
LD E,H
LD D,0
LD B,D
LD C,D
SRL E
PUSH AF
PUSH HL
LD HL,FATSTR
CALL BCDEHLP
CALL LOADLST
POP BC
LD A,B
AND 1
LD B,A
ADD HL,BC
LD B,(HL)
INC HL
LD A,H
CP HIGH (BUF_512_)+2
JR NZ,RDFATS4
PUSH BC
LD BC,0
INC DE
CALL LOADLST
POP BC
RDFATS4 POP AF
LD D,(HL)
LD E,B
LD BC,0
RRA
JR NC,RDFATS3
REPT 4
SRL D
RR E
ENDM
RDFATS3 LD A,D
AND 0X0F
LD D,A
JR RDFATS5
;ВЫЧИСЛЕНИЕ РЕАЛЬНОГО СЕКТОРА
;НА ВХОДЕ BCDE=НОМЕР FAT
;НА ВЫХОДЕ BCDE=АДРЕС СЕКТОРА
REALSEC LD BC,(AFILCLS+2)
LD DE,(AFILCLS)
LD A,B
OR C
OR D
OR E
JR NZ,REALSE1
LD DE,(FATSTR)
LD BC,(FATSTR+2)
LD HL,SEC_FAT
PUSH HL
CALL BCDEHLP
POP HL
JP BCDEHLP
REALSE1 LD HL,0XFFFE
EX DE,HL
ADD HL,DE
EX DE,HL
INC HL
ADC HL,BC ;НОМЕР КЛАСТЕРА-2
LD A,(BYTSSEC)
JR REALSE3
REALSE2 SLA E
RL D
RL L
RL H
REALSE3 RRCA
JR NC,REALSE2 ;УМНОЖИЛИ НА РАЗМЕР КЛАСТЕРА
LD B,H
LD C,L
LD HL,STARTRZ
CALL BCDEHLP ;ПРИБАВИЛИ СМЕЩЕНИЕ ОТ НАЧАЛА ДИСКА
LD HL,FRSTDAT
JP BCDEHLP ;ПРИБАВИЛИ СМЕЩЕНИЕ ОТ НАЧАЛА РАЗДЕЛА
BCDE200 LD E,D
LD D,C
LD C,B
LD B,0
LD A,2
JR BCDE_A
;BCDE>>A=BCDE
BCDE_A1 SRL B
RR C
RR D
RR E
BCDE_A RRCA
JR NC,BCDE_A1
RET
;(ADR)-BCDE=BCDE
BCDEHLM LD A,(HL)
INC HL
SUB E
LD E,A
LD A,(HL)
INC HL
SBC A,D
LD D,A
LD A,(HL)
INC HL
SBC A,C
LD C,A
LD A,(HL)
SBC A,B
LD B,A
RET
;(ADR)+BCDE=BCDE
BCDEHLP LD A,(HL)
INC HL
ADD A,E
LD E,A
LD A,(HL)
INC HL
ADC A,D
LD D,A
LD A,(HL)
INC HL
ADC A,C
LD C,A
LD A,(HL)
ADC A,B
LD B,A
RET
;HLDE+BC=HLDE
HLDEPBC EX DE,HL
ADD HL,BC
EX DE,HL
LD BC,0
ADC HL,BC
RET
;ЗАГРУЖАЕМ СЕКТОР В БУФЕР
LOADLST LD HL,BUF_512_
PUSH HL
LD A,1
CALL LOADSCS
POP HL
RET
;================ЗАГРУЗЧИК С ZC SD КАРТОЧКИ===================
READ_SD PUSH AF
LD A,1
OUT (P_CONF),A
POP AF
EX AF,AF'
LD A,CMD_18
CALL SECM200
EX AF,AF'
RDMULT1 EX AF,AF'
RDMULT2 CALL IN_OOUT
CP 0XFE
JR NZ,RDMULT2
PUSH BC
LD BC,P_DATA
INIR
NOP
INIR
NOP
IN A,(C)
NOP
IN A,(C)
POP BC
EX AF,AF'
DEC A
JR NZ,RDMULT1
LD A,CMD_12
CALL OUT_COM
RDMULT3 CALL IN_OOUT
INC A
JR NZ,RDMULT3
PUSH AF
LD A,3
OUT (P_CONF),A
XOR A
OUT (P_DATA),A
POP AF
RET
SECM200 PUSH HL
PUSH DE
PUSH BC
PUSH AF
PUSH BC
LD A,CMD_58
LD BC,P_DATA
CALL OUT_COM
CALL IN_OOUT
IN A,(C)
NOP
IN H,(C)
NOP
IN H,(C)
NOP
IN H,(C)
BIT 6,A
POP HL
JR NZ,SECN200
EX DE,HL
ADD HL,HL
EX DE,HL
ADC HL,HL
LD H,L
LD L,D
LD D,E
LD E,0
SECN200 POP AF
LD BC,P_DATA
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
OUT_COM PUSH BC
LD BC,P_DATA
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
IN_OOUT PUSH DE
LD DE,0X20FF
IN_WAIT IN A,(P_DATA)
CP E
JR NZ,IN_EXIT
IN_NEXT DEC D
JR NZ,IN_WAIT
IN_EXIT POP DE
RET
;=========================================================
;===============ЧТЕНИЕ С SD NEOGS=========================
;ЧТЕНИЕ "A" СЕКТОРОВ
READNGS EX AF,AF'
LD A,_DEV_READ
CALL COMM2SD
EX AF,AF'
PUSH DE
PUSH BC
LD BC,GSDAT
SDRDSN1 EX AF,AF'
OUT (GSCOM),A
CALL WC_
LD DE,0X0200
SDRDSN2 CALL WN_
INI
DEC DE
LD A,D
OR E
JR NZ,SDRDSN2
EX AF,AF'
DEC A
JR NZ,SDRDSN1
CALL WN_
SDRDSN3 IN A,(C)
CP 0X77
JR NZ,SDRDSN3
POP BC
POP DE
XOR A
RET
;ПЕРЕДАТЧИК КОМАНД/ПАРАМЕТРОВ В ДРАЙВЕР НА NeoGS
COMM2SD OUT (GSDAT),A ;УШЛА КОМАНДА ДРАЙВЕРУ
LD A,0X1E
OUT (GSCOM),A ;УШЛА КОМАНДА ПРОШИВКЕ
CALL WC_
LD A,B
OUT (GSDAT),A ;УШЛИ БИТЫ 31-24 ПАРАМЕТРОВ
CALL WD_
LD A,C
OUT (GSDAT),A ;УШЛИ БИТЫ 23-16 ПАРАМЕТРОВ
CALL WD_
LD A,D
OUT (GSDAT),A ;УШЛИ БИТЫ 15-8 ПАРАМЕТРОВ
CALL WD_
LD A,E
OUT (GSDAT),A ;УШЛИ БИТЫ 7-0 ПАРАМЕТРОВ
CALL WD_
EX AF,AF'
OUT (GSDAT),A ;УШЛО КОЛ-ВО СЕКТОРОВ
EX AF,AF'
DUPL 9,0
RET
;ОЖИДАНИЕ КОГДА NeoGS БАЙТ ЗАБЕРЕТ
WD_ IN A,(GSCOM)
RLA
JR C,WD_
RET
;ОЖИДАНИЕ КОГДА NeoGS ДАСТ БАЙТ
WN_ IN A,(GSCOM)
RLA
JR NC,WN_
RET
;ОЖИДАНИЕ КОГДА NeoGS КОМАНДУ ЗАБЕРЕТ
WC_ IN A,(GSCOM)
RRA
JR C,WC_
RET
;==========================================================
;==================ЧТЕНИЕ С NEMO HDD=======================
P_1F7 EQU 0XF0 ;РЕГИСТР СОСТОЯНИЯ/РЕГИСТР КОМАНД
P_1F6 EQU 0XD0 ;CHS-НОМЕР ГОЛОВЫ И УСТР/LBA АДРЕС 24-27
P_1F5 EQU 0XB0 ;CHS-ЦИЛИНДР 8-15/LBA АДРЕС 16-23
P_1F4 EQU 0X90 ;CHS-ЦИЛИНДР 0-7/LBA АДРЕС 8-15
P_1F3 EQU 0X70 ;CHS-НОМЕР СЕКТОРА/LBA АДРЕС 0-7
P_1F2 EQU 0X50 ;СЧЕТЧИК СЕКТОРОВ
P_1F1 EQU 0X30 ;ПОРТ ОШИБОК/СВОЙСТВ
P_1F0 EQU 0X10 ;ПОРТ ДАННЫХ
P_3F6 EQU 0XC8 ;РЕГИСТР СОСТОЯНИЯ/УПРАВЛЕНИЯ
P_HI EQU 0X11 ;СТАРШИЕ 8 БИТ
PRT_RW EQU P_1F0*256+P_HI ;ПОРТЫ ЧТЕНИЯ/ЗАПИСИ ОДНИМ СЛОВОМ
RD_HDDN PUSH BC
PUSH DE
PUSH DE
EX AF,AF'
LD A,(MAS_SLA)
OR B
LD E,C
LD BC,0XFF00+P_1F6
OUT (C),A
LD C,P_1F5
OUT (C),E
POP DE
LD C,P_1F4
OUT (C),D
LD C,P_1F3
OUT (C),E
LD C,P_1F2
EX AF,AF'
OUT (C),A
EX AF,AF'
LD C,P_1F7
LD A,0X20
OUT (C),A
LD C,P_1F7
HDDRD1 IN A,(C)
AND 0X88
CP 8
JR NZ,HDDRD1
EX AF,AF'
HDDRD2 EX AF,AF'
LD A,0X40
LD C,P_1F0
READSC1 IN E,(C)
INC C
IN D,(C)
DEC C
LD (HL),E
INC HL
LD (HL),D
INC HL
IN E,(C)
INC C
IN D,(C)
DEC C
LD (HL),E
INC HL
LD (HL),D
INC HL
IN E,(C)
INC C
IN D,(C)
DEC C
LD (HL),E
INC HL
LD (HL),D
INC HL
IN E,(C)
INC C
IN D,(C)
DEC C
LD (HL),E
INC HL
LD (HL),D
INC HL
DEC A
JR NZ,READSC1
LD C,P_1F7
HDDRD3 IN A,(C)
AND 0X80
JR NZ,HDDRD3
EX AF,AF'
DEC A
JR NZ,HDDRD2
POP DE
POP BC
XOR A
RET
;=============================================================
;==================ЧТЕНИЕ СО СМУК ВИНТА=======================
PS1F7 EQU 0XFF ;0XFFBE РЕГИСТР СОСТОЯНИЯ/РЕГИСТР КОМАНД
PS1F6 EQU 0XFE ;0XFEBE CHS-НОМЕР ГОЛОВЫ И УСТР/LBA АДРЕС 24-27
PS1F5 EQU 0XFD ;0XFDBE CHS-ЦИЛИНДР 8-15/LBA АДРЕС 16-23
PS1F4 EQU 0XFC ;0XFCBE CHS-ЦИЛИНДР 0-7/LBA АДРЕС 8-15
PS1F3 EQU 0XFB ;0XFBBE CHS-НОМЕР СЕКТОРА/LBA АДРЕС 0-7
PS1F2 EQU 0XFA ;0XFABE СЧЕТЧИК СЕКТОРОВ
PS1F1 EQU 0XF9 ;0XF9BE ПОРТ ОШИБОК/СВОЙСТВ
PS1F0 EQU 0XF8 ;0XF8BE ПОРТ ДАННЫХ
PS3F6 EQU 0XFE ;0XFEBE РЕГИСТР СОСТОЯНИЯ/УПРАВЛЕНИЯ
PSHI EQU 0XD8 ;0XD8BE СТАРШИЕ 8 БИТ
PRTSRW EQU PS1F0*256+PSHI ;ПОРТЫ ЧТЕНИЯ/ЗАПИСИ ОДНИМ СЛОВОМ
LOW_PRT EQU 0XBE ;МЛАДШИЙ БАЙТ АДРЕСА SMUC IDE
SMUCSYS EQU 0XFFBA ;СИСТЕМНЫЙ ПОРТ SMUC
SMUCVER EQU 0X5FBA ;ПОРТ ВЕРСИИ SMUC
RD_HDDS PUSH BC
PUSH DE
CALL SETSREG
EX AF,AF'
LD B,PS1F7
LD A,0X20
CALL SOUTPRT
HDSRDM2 CALL SINPRT
AND 0X88
CP 8
JR NZ,HDSRDM2
EX AF,AF'
HDSRDM1 PUSH AF
LD DE,PRTSRW
LD A,0X40
RDCSSC1 EX AF,AF'
LD B,D
CALL SINPRT
LD (HL),A
INC HL
LD B,E
CALL SINPRT
LD (HL),A
INC HL
LD B,D
CALL SINPRT
LD (HL),A
INC HL
LD B,E
CALL SINPRT
LD (HL),A
INC HL
LD B,D
CALL SINPRT
LD (HL),A
INC HL
LD B,E
CALL SINPRT
LD (HL),A
INC HL
LD B,D
CALL SINPRT
LD (HL),A
INC HL
LD B,E
CALL SINPRT
LD (HL),A
INC HL
EX AF,AF'
DEC A
JR NZ,RDCSSC1
LD B,PS1F7
HDSRDM3 CALL SINPRT
AND 0X80
JR NZ,HDSRDM3
POP AF
DEC A
JR NZ,HDSRDM1
POP DE
POP BC
RET
SETSREG PUSH DE
LD D,B
LD E,C
EX AF,AF'
LD A,(MAS_SLA)
OR D
LD BC,(PS1F6*0X0100)+LOW_PRT
CALL SOUTPRT
LD B,PS1F5
LD A,E
CALL SOUTPRT
POP DE
LD B,PS1F4
LD A,D
CALL SOUTPRT
LD B,PS1F3
LD A,E
CALL SOUTPRT
LD B,PS1F2
EX AF,AF'
SOUTPRT PUSH HL
LD HL,0X3FF0
EX (SP),HL
JP 0X3D2F
SINPRT PUSH HL
LD HL,0X3FF3
EX (SP),HL
JP 0X3D2F
;=============================================================
;==================ЧТЕНИЕ С DIVIDE ВИНТА======================
PV1F7 EQU 0XBF ;РЕГИСТР СОСТОЯНИЯ/РЕГИСТР КОМАНД
PV1F6 EQU 0XBB ;CHS-НОМЕР ГОЛОВЫ И УСТР/LBA АДРЕС 24-27
PV1F5 EQU 0XB7 ;CHS-ЦИЛИНДР 8-15/LBA АДРЕС 16-23
PV1F4 EQU 0XB3 ;CHS-ЦИЛИНДР 0-7/LBA АДРЕС 8-15
PV1F3 EQU 0XAF ;CHS-НОМЕР СЕКТОРА/LBA АДРЕС 0-7
PV1F2 EQU 0XAB ;СЧЕТЧИК СЕКТОРОВ
PV1F1 EQU 0XA7 ;ПОРТ ОШИБОК/СВОЙСТВ
PV1F0 EQU 0XA3 ;ПОРТ ДАННЫХ
PV3F6 EQU 0XC8 ;РЕГИСТР СОСТОЯНИЯ/УПРАВЛЕНИЯ (UNUSED ON DIVIDE)
PVHI EQU 0XA3 ;СТАРШИЕ 8 БИТ
PRTVRW EQU PV1F0*256+PVHI ;ПОРТЫ ЧТЕНИЯ/ЗАПИСИ ОДНИМ СЛОВОМ
RD_HDDD PUSH BC
PUSH DE
CALL SETVREG
EX AF,AF'
LD C,PV1F7
LD A,0X20
OUT (C),A
LD C,PV1F7
HDVRD1 IN A,(C)
AND 0X88
CP 8
JR NZ,HDVRD1
EX AF,AF'
HDVRD2 EX AF,AF'
CALL READVSEC
LD C,PV1F7
HDVRD3 IN A,(C)
AND 0X80
JR NZ,HDVRD3
EX AF,AF'
DEC A
JR NZ,HDVRD2
EXITVHD POP DE
POP BC
LD A,B
AND 0X0F
LD B,A
XOR A
RET
SETVREG PUSH DE
LD D,B
LD E,C
LD BC,0XFF00+PV1F6
OUT (C),D
EX AF,AF'
LD C,PV1F7
SETVRE1 IN A,(C)
AND 0X80
JR NZ,SETVRE1
LD C,PV1F5
OUT (C),E
POP DE
LD C,PV1F4
OUT (C),D
LD C,PV1F3
OUT (C),E
LD C,PV1F2
EX AF,AF'
OUT (C),A
RET
;READ SECTOR (512 BYTES)
READVSEC LD A,0X40
LD C,PV1F0
READVSC1 REPT 8
INI
INC B
ENDM
DEC A
JR NZ,READVSC1
RET
;==================ЧТЕНИЕ С DIVIDE ВИНТА======================
;==================ЧТЕНИЕ С PROFI ВИНТА=======================
PP_1F7W EQU 0X07EB ;W РЕГИСТР КОМАНД
PP_1F7R EQU 0X07CB ;R РЕГИСТР СОСТОЯНИЯ
PP_1F6W EQU 0X06EB ;W CHS-НОМЕР ГОЛОВЫ И УСТР/LBA АДРЕС 24-27
PP_1F6R EQU 0X06CB ;R CHS-НОМЕР ГОЛОВЫ И УСТР/LBA АДРЕС 24-27
PP_1F5W EQU 0X05EB ;W CHS-ЦИЛИНДР 8-15/LBA АДРЕС 16-23
PP_1F5R EQU 0X05CB ;R CHS-ЦИЛИНДР 8-15/LBA АДРЕС 16-23
PP_1F4W EQU 0X04EB ;W CHS-ЦИЛИНДР 0-7/LBA АДРЕС 8-15
PP_1F4R EQU 0X04CB ;R CHS-ЦИЛИНДР 0-7/LBA АДРЕС 8-15
PP_1F3W EQU 0X03EB ;W CHS-НОМЕР СЕКТОРА/LBA АДРЕС 0-7
PP_1F3R EQU 0X03CB ;R CHS-НОМЕР СЕКТОРА/LBA АДРЕС 0-7
PP_1F2W EQU 0X02EB ;W СЧЕТЧИК СЕКТОРОВ
PP_1F2R EQU 0X02CB ;R СЧЕТЧИК СЕКТОРОВ
PP_1F1W EQU 0X01EB ;W ПОРТ СВОЙСТВ
PP_1F1R EQU 0X01CB ;R ПОРТ ОШИБОК
PP_1F0W EQU 0X00EB ;W ПОРТ ДАННЫХ МЛАДШИЕ 8 БИТ
PP_1F0R EQU 0X00CB ;R ПОРТ ДАННЫХ МЛАДШИЕ 8 БИТ
PP_3F6 EQU 0X06AB ;W РЕГИСТР СОСТОЯНИЯ/УПРАВЛЕНИЯ
PP_HIW EQU 0XFFCB ;W ПОРТ ДАННЫХ СТАРШИЕ 8 БИТ
PP_HIR EQU 0XFFEB ;R ПОРТ ДАННЫХ СТАРШИЕ 8 БИТ
RD_HDDP PUSH BC
PUSH DE
PUSH AF
PUSH BC
LD BC,0XDFFD
LD A,0X20
OUT (C),A
POP BC
LD A,(MAS_SLA)
OR B
LD B,A
POP AF
CALL SETHPREG
EX AF,AF'
LD BC,PP_1F7W
LD A,0X20
OUT (C),A
LD BC,PP_1F7R
HDDPRD1 IN A,(C)
AND 0X88
CP 8
JR NZ,HDDPRD1
EX AF,AF'
HDDPRD2 EX AF,AF'
CALL READPSEC
LD BC,PP_1F7R
HDDPRD3 IN A,(C)
AND 0X80
JR NZ,HDDPRD3
EX AF,AF'
DEC A
JR NZ,HDDPRD2
LD BC,0XDFFD
XOR A
OUT (C),A
POP DE
POP BC
LD A,B
AND 0X0F
LD B,A
XOR A
RET
SETHPREG PUSH DE
LD D,B
LD E,C
LD BC,PP_1F6W
OUT (C),D
EX AF,AF'
LD BC,PP_1F7R
SETHPRE1 IN A,(C)
AND 0X80
JR NZ,SETHPRE1
LD BC,PP_1F5W
OUT (C),E
POP DE
LD BC,PP_1F4W
OUT (C),D
LD BC,PP_1F3W
OUT (C),E
LD BC,PP_1F2W
EX AF,AF'
OUT (C),A
RET
READPSEC LD A,0X40
READPSC1 REPT 4
LD BC,PP_1F0R
IN E,(C)
LD BC,PP_HIR
IN D,(C)
LD (HL),E
INC HL
LD (HL),D
INC HL
ENDM
DEC A
JR NZ,READPSC1
RET
;==================ЧТЕНИЕ С PROFI ВИНТА=======================