;LAST UPDATE: 03.12.2014 savelij
;ОБЩАЯ ТОЧКА ВХОДА ДЛЯ РАБОТЫ С 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 (RREG_L),HL
EX (SP),HL
LD (RREG_F),HL
EX (SP),HL
RET4NEMO1 POP AF
RET
TBLHDDN DW HDDINIT
DW HDDOFF
DW HDDRDM ;READ MULTI
DW HDDWRM ;WRITE 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
EVOPORT WIN_P6,0XFD
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,0X4000
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_P6
XOR A
OUT (C),A
INIT91_2 POP BC
POP HL
RET
INI_912 LD BC,WIN_P6
XOR A
OUT (C),A
LD A,0XFF
POP BC
POP HL
RET
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
HDDWRM PUSH BC
PUSH DE
CALL SETHREG
EX AF,AF'
LD C,P_1F7
LD A,0X30
OUT (C),A
LD C,P_1F7
HDDWR1 IN A,(C)
AND 0X88
CP 8
JR NZ,HDDWR1
EX AF,AF'
HDDWR2 EX AF,AF'
CALL WRITSEC
LD C,P_1F7
HDDWR3 IN A,(C)
AND 0X80
JR NZ,HDDWR3
EX AF,AF'
DEC A
JR NZ,HDDWR2
POP DE
POP BC
LD A,B
AND 0X0F
LD B,A
XOR A
RET
READSEC LD A,IYL
BIT 1,A
JR NZ,RD2MEM
AND A
JR NZ,RD2MEM2 ;ВНУТРЕННИЙ ВЫЗОВ. ЧТЕНИЕ СЕКТОРА ВО ВНУТРЕНННИЙ БУФЕР
;ВНЕШНИЙ ВЫЗОВ. ЧТЕНИЕ СЕКТОРА В ПАМЯТЬ ВЫЗВАВШЕГО
RD2MEM
; LD A,(R_7FFD)
READ_7FFD
AND 0X10
LD BC,(B0_CPU2)
JR Z,RD2MEM1
LD BC,(B1_CPU2)
RD2MEM1 LD A,0X37
OR B
LD B,A
LD A,C
LD C,LOW (WIN_A0)
OUT (C),A
RD2MEM2 LD BC,P_1F0
INIR
INIR
LD BC,WIN_P6
XOR A
OUT (C),A
RET
WRITSEC EXX
PUSH HL
LD HL,0
ADD HL,SP
EXX
LD SP,HL
LD A,0X40
LD HL,PRT_RW
WR_SEC1 POP DE
LD C,L
OUT (C),D
LD C,H
OUT (C),E
POP DE
LD C,L
OUT (C),D
LD C,H
OUT (C),E
POP DE
LD C,L
OUT (C),D
LD C,H
OUT (C),E
POP DE
LD C,L
OUT (C),D
LD C,H
OUT (C),E
DEC A
JR NZ,WR_SEC1
LD HL,0
ADD HL,SP
EXX
LD SP,HL
POP HL
EXX
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
LD D,8
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,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,RD2MEM2
LD HL,0XEB14
SBC HL,DE
LD A,1
RET Z
NO_DEV LD A,0XFF
RET