Код:
Hddinit EQU 0
Hddoff EQU 1
Hddrds EQU 2
Hddrdm EQU 3
Hddwrs EQU 4
Hddwrm EQU 5
;ОБЩАЯ ТОЧКА ВХОДА ДЛЯ РАБОТЫ С HDD DIVIDE
EXA
EX (SP),HL
LD A,(HL)
INC HL
EX (SP),HL
ADD A,A
PUSH HL
LD HL,TBLHDDN
ADD A,L
LD L,A
LD A,H
ADC A,0
LD H,A
LD A,(HL)
INC HL
LD H,(HL)
LD L,A
EXA
EX (SP),HL
RET
TBLHDDN DW HDDINIT ;INIT HDD
DW HDDOFF
DW HDDRDS ;READ SINGLE SECTOR
DW HDDRDM ;READ MULTI SECTOR
DW HDDWRS ;SAVE SINGLE SECTOR
DW HDDWRM ;SAVE MULTI SECTOR
;Входные параметры общие:
;HL-адрес загрузки в память
;BCDE-32-х битный номер сектора
;A-количество блоков (блок=512 байт)
;только для многоблочной записи/чтении
P_1F7 EQU #BF ;РЕГИСТР СОСТОЯНИЯ/РЕГИСТР КОМАНД
P_1F6 EQU #BB ;CHS-НОМЕР ГОЛОВЫ И УСТР/LBA АДРЕС 24-27
P_1F5 EQU #B7 ;CHS-ЦИЛИНДР 8-15/LBA АДРЕС 16-23
P_1F4 EQU #B3 ;CHS-ЦИЛИНДР 0-7/LBA АДРЕС 8-15
P_1F3 EQU #AF ;CHS-НОМЕР СЕКТОРА/LBA АДРЕС 0-7
P_1F2 EQU #AB ;СЧЕТЧИК СЕКТОРОВ
P_1F1 EQU #A7 ;ПОРТ ОШИБОК/СВОЙСТВ
P_1F0 EQU #A3 ;ПОРТ ДАННЫХ
P_3F6 EQU #C8 ;РЕГИСТР СОСТОЯНИЯ/УПРАВЛЕНИЯ (UNUSED ON DIVIDE)
P_HI EQU #A3 ;СТАРШИЕ 8 БИТ
PRT_RW EQU P_1F0*256+P_HI ;ПОРТЫ ЧТЕНИЯ/ЗАПИСИ ОДНИМ СЛОВОМ
;НА ВЫХОДЕ:
;H-ДЛЯ MASTER 0-HDD, 1-CDROM, #FF-NONE
;L-ДЛЯ SLAVE 0-HDD, 1-CDROM, #FF-NONE
HDDINIT LD A,#E0
PUSH HL
CALL ID_DEV
POP HL
AND A
CALL Z,INIT_91
LD D,A
LD A,#F0
PUSH DE
PUSH HL
CALL ID_DEV
POP HL
AND A
CALL Z,INIT_91
POP HL
LD L,A
XOR A
HDDOFF RET
INIT_91 PUSH HL
LD L,49*2+1,A,(HL)
AND 2
JR Z,INI_912
LD BC,#FF00+P_1F2
LD L,#0C
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,#91
OUT (C),A
LD DE,#1000
INI_911 DEC DE
LD A,D
OR E
JR Z,INI_912
IN A,(C)
AND #80
JR NZ,INI_911
POP HL
RET
INI_912 LD A,#FF
POP HL
RET
;READ 1 SECTOR HDD
HDDRDS LD A,1
;READ "A" SECTORS HDD
HDDRDM PUSH BC
PUSH DE
CALL SETHREG
EXA
LD C,P_1F7
LD A,#20
OUT (C),A
LD C,P_1F7
HDDRD1 IN A,(C)
AND #88
CP 8
JR NZ,HDDRD1
EXA
HDDRD2 EXA
CALL READSEC
LD C,P_1F7
HDDRD3 IN A,(C)
AND #80
JR NZ,HDDRD3
EXA
DEC A
JR NZ,HDDRD2
JR EXITNHD
;WRITE 1 SECTOR HDD
HDDWRS LD A,1
;WRITE "A" SECTORS HDD
HDDWRM PUSH BC
PUSH DE
CALL SETHREG
EXA
LD C,P_1F7
LD A,#30
OUT (C),A
LD C,P_1F7
HDDWR1 IN A,(C)
AND #88
CP 8
JR NZ,HDDWR1
EXA
HDDWR2 EXA
CALL WRITSEC
LD C,P_1F7
HDDWR3 IN A,(C)
AND #80
JR NZ,HDDWR3
EXA
DEC A
JR NZ,HDDWR2
EXITNHD POP DE
POP BC
LD A,B
AND #0F
LD B,A
XOR A
RET
;READ SECTOR (512 BYTES)
READSEC LD DE,PRT_RW
LD A,#40
READSC1 LD C,D
INI
INI
INI
INI
INI
INI
INI
INI
DEC A
JR NZ,READSC1
RET
;SAVE SECTOR (512 BYTES)
WRITSEC EXX
PUSH HL
LD HL,0
ADD HL,SP
EXX
LD SP,HL
LD A,#40
LD HL,PRT_RW
WR_SEC1 POP DE
LD C,L
OUT (C),E
OUT (C),D
POP DE
OUT (C),E
OUT (C),D
POP DE
OUT (C),E
OUT (C),D
POP DE
OUT (C),E
OUT (C),D
DEC A
JR NZ,WR_SEC1
LD HL,0
ADD HL,SP
EXX
LD SP,HL
POP HL
EXX
RET
;SET HDD PORTS
SETHREG PUSH DE
LD D,B
LD E,C
LD BC,#FF00+P_1F6
OUT (C),D
EXA
LD C,P_1F7
SETHRE1 IN A,(C)
AND #80
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
EXA
OUT (C),A
RET
;HL-АДРЕС БУФЕРА СЕКТОРА ИДЕНТИФИКАЦИИ
;A=E0-ДЛЯ MASTER, A=F0-ДЛЯ SLAVE
ID_DEV LD BC,#FF00+P_1F6
OUT (C),A
LD C,P_1F7
LD D,26
ID_DEV3 EI
HALT
DI
DEC D
JR Z,NO_DEV
IN A,(C)
BIT 7,A
JR NZ,ID_DEV3
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,#EC
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 #88
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,#EB14
SBC HL,DE
LD A,1
RET Z
NO_DEV LD A,#FF
RET