;LAST UPDATE: 08.09.2011 savelij
Hddinit EQU 0
Hddoff EQU 1
Hddrds EQU 2
Hddrdm EQU 3
;ОБЩАЯ ТОЧКА ВХОДА ДЛЯ РАБОТЫ С HDD NEMO
COMHDDN EX AF,AF'
LD A,IYL
AND A
LD A,(NEXTBYTERST8)
JR Z,COMHDDN1
EX (SP),HL
LD A,(HL)
INC HL
EX (SP),HL
COMHDDN1 ADD A,A
PUSH HL
LD HL,RET4NEMO
EX (SP),HL
PUSH HL
LD HL,TBLHDDN
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
RET4NEMO PUSH AF
LD A,IYL
AND A
JR NZ,RET4NEMO1
LD (REG_L),HL
EX (SP),HL
LD (REG_F),HL
EX (SP),HL
RET4NEMO1 POP AF
RET
TBLHDDN DW HDDINIT
DW HDDOFF
DW HDDRDS ;READ SINGLE
DW HDDRDM ;READ MULTI
;Входные параметры общие:
;HL-адрес загрузки в память
;BCDE-32-х битный номер сектора
;A-количество блоков (блок=512 байт)
;только для многоблочной записи/чтении
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*0X100+P_HI ;ПОРТЫ ЧТЕНИЯ/ЗАПИСИ ОДНИМ СЛОВОМ
;НА ВЫХОДЕ:
;H-ДЛЯ MASTER 0-HDD, 1-CDROM, 0XFF-NONE
;L-ДЛЯ SLAVE 0-HDD, 1-CDROM, 0XFF-NONE
HDDINIT LD A,0XE0
PUSH HL
CALL ID_DEV
POP HL
AND A
CALL Z,INIT_91
LD D,A
PUSH DE
; LD A,0XF0
; PUSH HL
; CALL ID_DEV
; POP HL
; AND A
; CALL Z,INIT_91
POP HL
LD L,0XFF;A
XOR A
HDDOFF RET
INIT_91 PUSH HL
PUSH BC
LD A,IYL
AND A
JR NZ,INIT91_1
LD BC,WIN_P2
LD A,0XFD
OUT (C),A
INIT91_1 LD L,49*2+1
LD A,(HL)
AND 2
JR Z,INI_912
LD BC,0XFF00+P_1F2
LD L,0X0C
LD A,(HL)
OUT (C),A
LD L,6
LD C,P_1F6
LD A,(HL)
DEC A
OUT (C),A
LD C,P_1F7
LD A,0X91
OUT (C),A
LD DE,0X1000
INI_911 DEC DE
LD A,D
OR E
JR Z,INI_912
IN A,(C)
AND 0X80
JR NZ,INI_911
LD L,A
LD A,IYL
AND A
LD A,L
JR NZ,INIT91_2
LD BC,WIN_P2
XOR A
OUT (C),A
INIT91_2 POP BC
POP HL
RET
INI_912 LD A,0XFF
POP HL
RET
HDDRDS LD A,1
HDDRDM PUSH BC
PUSH DE
CALL SETHREG
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'
CALL READSEC
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
READSEC LD A,IYL
AND A
JR Z,RD2MEM
;ВНУТРЕННИЙ ВЫЗОВ. ЧТЕНИЕ СЕКТОРА ВО ВНУТРЕНННИЙ БУФЕР
LD BC,P_1F0
INIR
INIR
XOR A
RET
;ВНЕШНИЙ ВЫЗОВ. ЧТЕНИЕ СЕКТОРА В ПАМЯТЬ ВЫЗВАВШЕГО
RD2MEM LD BC,WIN_P2
LD A,0XFD
OUT (C),A
LD BC,P_1F0
INIR
INIR
LD BC,WIN_P2
XOR A
OUT (C),A
RET
SETHREG PUSH DE
CALL ICOM_DEV
DB Set_device
LD D,B
LD E,C
LD BC,0XFF00+P_1F6
OUT (C),D
EX AF,AF'
LD C,P_1F7
SETHRE1 IN A,(C)
AND 0X80
JR NZ,SETHRE1
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
RET
;HL-АДРЕС БУФЕРА СЕКТОРА ИДЕНТИФИКАЦИИ
;A=E0-ДЛЯ MASTER, A=F0-ДЛЯ SLAVE
ID_DEV LD BC,0XFF00+P_1F6
OUT (C),A
LD C,P_1F7
IN A,(C)
AND A
JR Z,NO_DEV
INC A
JR Z,NO_DEV
XOR A
LD C,P_1F5
OUT (C),A
LD C,P_1F4
OUT (C),A
LD A,0XEC
LD C,P_1F7
OUT (C),A
LD C,P_1F7
ID_DEV1 IN A,(C)
AND A
JR Z,NO_DEV
INC A
JR Z,NO_DEV
DEC A
RRCA
JR C,ID_DEV2
RLCA
AND 0X88
CP 8
JR NZ,ID_DEV1
ID_DEV2 LD C,P_1F4
IN E,(C)
LD C,P_1F5
IN D,(C)
LD A,D
OR E
JP Z,READSEC
LD HL,0XEB14
SBC HL,DE
LD A,1
RET Z
NO_DEV LD A,0XFF
RET