;LAST UPDATE: 01.10.2011 savelij
SMUC EQU 0
MASTER EQU 0
SLAVE EQU 0X80
DRV_A EQU 0 ;DRIVE A
DRV_B EQU 1 ;DRIVE B
DRV_C EQU 2 ;DRIVE C
DRV_D EQU 3 ;DRIVE D
SDZ EQU 4 ;SD КАРТА НА ZC
SDG EQU 5 ;SD КАРТА НА NeoGS
HDDN EQU 6 ;HDD НА NEMO
HDDS EQU 7 ;HDD НА SMUC
;ВЫЗОВ ВЫБРАННОГО ДРАЙВЕРА
TO_DRV PUSH HL
LD L,A
LD A,IYL
AND A
LD A,L
JR NZ,TO_DRV1
RST 0X10
LD A,(REG_A)
LD DE,(REG_E)
LD BC,(REG_C)
LD HL,(REG_L)
EX (SP),HL
TO_DRV1 LD HL,(GO_DEV)
EX (SP),HL
RET
;ВНЕШНИЙ ВЫЗОВ МЕНЕДЖЕРА УСТРОЙСТВ
COM_DEV EX AF,AF'
RST 0X10
LD A,(NEXTBYTERST8)
PUSH IY
LD IYL,0 ;ВНЕШНИЙ ВЫЗОВ
NEXT_ICOM_DEV PUSH IX
PUSH HL
LD HL,EXITDEV
EX (SP),HL
PUSH HL
ADD A,A
ADD A,LOW (TABLDEV)
LD L,A
ADC A,HIGH (TABLDEV)
SUB L
LD H,A
LD A,(HL)
INC HL
LD H,(HL)
LD L,A
EX AF,AF'
EX (SP),HL
RET
EXITDEV POP IX
POP IY
RET
;ВНУТРЕННИЙ ВЫЗОВ МЕНЕДЖЕРА УСТРОЙСТВ
ICOM_DEV EX AF,AF'
EX (SP),HL
LD A,(HL)
INC HL
EX (SP),HL
PUSH IY
LD IYL,1 ;ВНУТРЕННИЙ ВЫЗОВ
JR NEXT_ICOM_DEV
TABLDEV DW DEVFIND ;00 ПОИСК УСТРОЙСТВ
DW SET_VOL ;01 ВЫБОР РАЗДЕЛА
DW KOL_VOL ;02 ЗАПРОС НАЙДЕНОГО
DW SET_DEVICE ;03 УСТАНОВКА БИТОВ УСТРОЙСТВА И LBA РЕЖИМА
DW TO_DRV ;04 ВЫЗОВ ДРАЙВЕРА ВЫБРАННОГО УСТРОЙСТВА
DW COMHDDNEX ;05 ПРЯМОЙ ВЫЗОВ ДРАЙВЕРА HDD NEMO (ВРЕМЕННАЯ ФУНКЦИЯ)
;ФОРМАТ ТАБЛИЦЫ НАЙДЕННЫХ РАЗДЕЛОВ
;+0(1)-0-DRIVE A
; 1-DRIVE B
; 2-DRIVE C
; 3-DRIVE D
; 4-SD КАРТА ZC
; 5-SD КАРТА NEOGS
; 6-HDD NEMO
; 7-HDD SMUC
;+1(1)-ДЛЯ SD-ТУПО 0
; ИНАЧЕ HDD/CD 0-MASTER, 1-SLAVE
;+2(1)-ТИП РАЗДЕЛА, В ТАБЛИЦЕ ТОЛЬКО
;РАЗДЕЛЫ:
;00=01-FAT12
;01=06,0E-FAT16
;02=0B,0C-FAT32
;+3(4)-СТАРТОВЫЙ СЕКТОР
;+7(1)-РЕЗЕРВ
;ТОЧКА ВХОДА ДЛЯ ПОИСКА РАЗДЕЛОВ
;HL-АДРЕС КУДА ПОКЛАСТЬ ТАБЛИЦУ РАЗДЕЛОВ
;НА ВЫХОДЕ:
;A-КОЛ-ВО РАЗДЕЛОВ
DEVFIND XOR A
LD (KOLDVOL),A ;КОЛИЧЕСТОВ НАЙДЕННЫХ РАЗДЕЛОВ
LD IX,ADRTVOL ;АДРЕС ТАБЛИЦЫ НАЙДЕННЫХ РАЗДЕЛОВ
LD A,IYL
LD IYL,1
AND A
JR NZ,DEVFIND1
LD HL,FOR_EXTERN
PUSH HL
;NEMO
DEVFIND1 LD HL,BUFFSEC ;АДРЕС БУФЕРА ДЛЯ ЗАГРУЗКИ СЕКТОРА (512 БАЙТ)
CALL COMHDDN
DB Hddinit ;ИНИЦИАЛИЗАЦИЯ УСТРОЙСТА С ОПРЕДЕЛЕНИЕМ ЧТО ПОДКЛЮЧЕНО
LD A,H
AND A
LD A,HDDN+MASTER
LD HL,BUFFSEC
PUSH IY
CALL Z,RD0HDD ;ПОИСК РАЗДЕЛОВ НА НАЙДЕННОМ УСТРОЙСТВЕ - HDD MASTER
POP IY
;SMUC
IF SMUC=1
LD HL,BUFFSEC
CALL COMHDDS
DB 0 ;ИНИЦИАЛИЗАЦИЯ УСТРОЙСТА С ОПРЕДЕЛЕНИЕМ ЧТО ПОДКЛЮЧЕНО
LD A,H
AND A
LD A,HDDS+MASTER
LD HL,BUFFSEC
PUSH IY
CALL Z,RD0HDDS ;ПОИСК РАЗДЕЛОВ НА НАЙДЕННОМ УСТРОЙСТВЕ - HDD MASTER
POP IY
ENDIF
;SD ON NEOGS
CALL INSTSDD ;УCТАНОВКА ДРАЙВЕРА SD КАРТЫ НА NEOGS
AND A
JR NZ,DEVFND1 ;НЕ ИНИЦИАЛИЗИРОВАТЬ ЕСЛИ NEOGS НЕ НАЙДЕН
CALL COMSDG
DB 0 ;ИНИЦИАЛИЗАЦИЯ SD КАРТЫ НА NEOGS
AND A
PUSH IY
CALL Z,RD0SDG ;ПОИСК РАЗДЕЛОВ НА УСТРОЙСТВЕ
POP IY
;SD ON Z-CONTROLLER
DEVFND1 CALL COMSDZ
DB 0 ;ИНИЦИАЛИЗАЦИЯ SD КАРТЫ
AND A
PUSH IY
CALL Z,RD0SD ;ПОИСК РАЗДЕЛОВ НА УСТРОЙСТВЕ
POP IY
LD IYL,0
CALL SETVOLD ;ВЫЧИСЛЕНИЕ КОЛИЧЕСТВА НАЙДЕННЫХ РАЗДЕЛОВ НА ВСЕХ УСТРОЙСТВАХ
SCF
RET Z ;ВЫХОД ЕСЛИ НЕ НАЙДЕН НЕ ОДИН РАЗДЕЛ
DEC A
CALL SET_VOL1 ;ВЫБОР ПОСЛЕДНЕГО НАЙДЕНОГО УСТРОЙСТВА
RET C
;ЗАПРОС НАЙДЕНОГО И ТЕКУЩЕГО ВЫБРАННОГО УСТРОЙСТВА
IKOL_VOL LD HL,(ADRTEKV) ;АДРЕС ТЕКУЩЕГО ВЫБРАННОГО РАЗДЕЛА
INC HL
INC HL
LD A,(HL) ;ТИП РАЗДЕЛА
LD DE,(KOLDVOL) ;D-НОМЕР ВЫБРАННОГО РАЗДЕЛА, E-КОЛИЧЕСТВО НАЙДЕННЫХ РАЗДЕЛОВ
LD HL,ADRTVOL ;АДРЕС НАЧАЛА ТАБЛИЦЫ НАЙДЕННЫХ РАЗДЕЛОВ
AND A
RET
KOL_VOL LD HL,(ADRTEKV) ;АДРЕС ТЕКУЩЕГО ВЫБРАННОГО РАЗДЕЛА
INC HL
INC HL
LD A,(HL) ;ТИП РАЗДЕЛА
LD HL,(KOLDVOL) ;D-НОМЕР ВЫБРАННОГО РАЗДЕЛА, E-КОЛИЧЕСТВО НАЙДЕННЫХ РАЗДЕЛОВ
LD (REG_E),HL
AND A
PUSH AF
POP HL
LD (REG_F),HL
RET
FOR_EXTERN PUSH AF
POP HL
LD (REG_F),HL
LD BC,0X100 ;ПЕРЕНОС ДО 256 БАЙТ
LD DE,(REG_L) ;АДРЕС КУДА ПЕРЕНОСИТЬ
LD HL,ADRTVOL
LD A,D
CP 0XC0 ;ВЕРХНЯЯ ГРАНИЦА АДРЕСА ПЕРЕНОСА
JR NC,LDIR4EXTRN
CP 0X7F ;НИЖНЯЯ ГРАНИЦА АДРЕСА ПЕРЕНОСА
JR C,LDIR4EXTRN
PUSH BC
LD BC,WIN_A1 ;ЕСЛИ ПЕРЕНОС В ПРЕДЕЛАХ 2-ГО ОКНА
LD A,0X7D
OUT (C),A ;ВКЛЮЧИЛИ СТРАНИЦУ 2-ГО ОКНА В 1-У ОКНО
LD A,D
SUB 0X40
LD D,A ;АДРЕС ПЕРЕНОСА УМЕНЬШИЛИ
POP BC
LD A,E
AND A ;ПРОВЕРКА НА ВЫРАВНИВАНИЕ 256 БАЙТ
JR Z,LDIR4EXTRN2
NEG
LD C,A
NEG
LD B,0
LDIR ;ЕСЛИ НЕ ВЫРОВНЕНО, ТО ПЕРЕНОСИМ НАЧАЛО ТАБЛИЦЫ
LD C,A
LD B,0
LDIR4EXTRN2 LDIR ;ПЕРЕНЕСЛИ ОСТАТОК ТАБЛИЦЫ
LD BC,WIN_A1
LD A,0X7A
OUT (C),A ;ВЕРНУЛИ СТРАНИЦУ В 1-Е ОКНО
JR LDIR4EXTRN1
LDIR4EXTRN LDIR
LDIR4EXTRN1 LD HL,(KOLDVOL)
LD (REG_E),HL
RET
;ВЫЧИСЛЕНИЕ КОЛИЧЕСТВА НАЙДЕННЫХ РАЗДЕЛОВ НА ВСЕХ УСТРОЙСТВАХ
SETVOLD LD A,IXL
RRCA
RRCA
RRCA
AND 0X1F
LD (KOLDVOL),A
AND A
RET
;ПОИСК РАЗДЕЛОВ НА SD КАРТЕ NEOGS
RD0SDG LD HL,BUFFSEC
LD A,SDG
PUSH AF
LD DE,0
LD B,D
LD C,E
PUSH HL
CALL COMSDG
DB 2
JR RD0HDD_
;ПОИСК РАЗДЕЛОВ НА SD КАРТЕ Z-КОНТРОЛЛЕРА
RD0SD LD HL,BUFFSEC
LD A,SDZ
PUSH AF
LD DE,0
LD B,D
LD C,E
PUSH HL
CALL COMSDZ
DB 2
JR RD0HDD_
;ПОИСК РАЗДЕЛОВ НА HDD SMUC
IF SMUC=1
RD0HDDS PUSH AF
PUSH HL
LD (ADRTEKV),IX
LD B,A
AND 0X80
RLCA
LD (IX+1),A
LD A,B
LD DE,0
LD B,D
LD C,E
CALL COMHDDS
DB 2
JR RD0HDD_
ENDIF
;ПОИСК РАЗДЕЛОВ НА HDD NEMO
RD0HDD PUSH AF
PUSH HL
LD (ADRTEKV),IX
LD B,A
AND 0X80
RLCA
LD (IX+1),A
LD A,B
LD DE,0
LD B,D
LD C,E
CALL COMHDDN
DB 2
RD0HDD_ LD DE,0X01BE ;СМЕЩЕНИЕ В 0 СЕКТОРЕ УСТРОЙСТВА ДО ТАБЛИЦЫ MBR
POP IY
PUSH IY
ADD IY,DE ;УСТАНОВИЛИ УКАЗАТЕЛЬ НА НАЧАЛО ОПИСАТЕЛЕЙ РАЗДЕЛОВ
LD BC,0X0400 ;РАЗДЕЛОВ МАКСИМУМ 4 И ОБНУЛИЛИ СЧЕТЧИК РАЗДЕЛОВ С FAT
RD0HDD0 LD A,(IY) ;ПЕРВЫЙ БАЙТ 16 БАЙТНОГО ОПИСАТЕЛЯ
AND A ;ДОЛЖЕН БЫТЬ РАВЕН 0
JR Z,RD0HDD1
CP 0X80 ;ИЛИ 0X80 (ПРИЗНАК ЗАГРУЗОЧНОГО РАЗДЕЛА)
JR NZ,RD0HDD2
RD0HDD1 LD A,(IY+4) ;БАЙТ ТИПА РАЭДЕЛА
CALL CP_RAZD ;ПРОВЕРКА ТИПА РАЗДЕЛА
JR NZ,RD0HDD2 ;ЕСЛИ НЕ FAT ТОПРОЕВЕРЯЕМ СЛЕДУЮЩУЮ 16 БАЙТНУЮ ЗАПИСЬ
INC C
RD0HDD2 LD DE,0X10
ADD IY,DE
DJNZ RD0HDD0 ;ПРОВЕРЯЕМ СЛЕДУЮЩУЮ 16 БАЙТНУЮ ЗАПИСЬ В MBR
LD A,C
AND A
POP HL
JP NZ,SCANMBR
PUSH HL
POP IY
LD C,(IY+0X0D)
XOR A
LD E,A
LD B,8
RR C
ADC A,0
DJNZ $-4
DEC A
JR NZ,$+3
INC E
LD A,(IY+0X0E)
OR (IY+0X0F)
JR Z,$+3
INC E
LD A,(IY+0X13)
OR (IY+0X14)
JR NZ,$+3
INC E
LD A,(IY+0X20)
OR (IY+0X21)
OR (IY+0X22)
OR (IY+0X22)
JR NZ,$+3
INC E
LD A,(IY+0X15)
AND 0XF0
CP 0XF0
JR NZ,$+3
INC E
LD A,E
CP 4
INC SP
INC SP
RET NZ
DEC SP
DEC SP
POP AF
BIT 7,A
LD B,0
JR Z,$+3
INC B
AND 0X7F
LD C,A
PUSH IX
POP HL
XOR A
LD (HL),C
INC HL
LD (HL),B
INC HL
LD (HL),0XFF
INC HL
LD (HL),A
INC HL
LD (HL),A
INC HL
LD (HL),A
INC HL
LD (HL),A
INC HL
LD (HL),A
LD DE,8
ADD IX,DE
CALL SETVOLD
DEC A
LD (IX-6),0XFF
JP SET_VOL
;НА ВХОДЕ:
;A-BIT 7-0/1-MASTER/SLAVE
;BITS 6-0-ТИП НОСИТЕЛЯ
SCANMBR POP AF
LD DE,0X01BE
ADD HL,DE
EXX
BIT 7,A
LD B,0
JR Z,$+3
INC B
AND 0X7F
LD C,A
EXX
LD B,0
LD A,4
SCNMBR0 EX AF,AF'
LD A,(HL)
LD C,4
ADD HL,BC
LD C,0X0C
AND A
JR Z,SCNMBR1
CP 0X80
JR NZ,SCNMBR2
SCNMBR1 LD A,(HL)
AND A
JR Z,SCNMBR2
CALL CP_RAZD
JR NZ,SCNMBR2
SCNMBR3 EXX
LD (IX),C
LD (IX+1),B
EXX
LD (IX+2),E
LD C,4
PUSH IX
POP DE
INC DE
INC DE
INC DE
ADD HL,BC
LDI
LDI
LDI
LDI
LD (IX+7),0
SCNMBR4 LD C,8
ADD IX,BC
LD C,4
SCNMBR2 ADD HL,BC
EX AF,AF'
DEC A
JR NZ,SCNMBR0
SCNMBR5 CALL SETVOLD
SCF
RET Z
DEC A
;ВЫБОР РАЗДЕЛА
SET_VOL LD L,A
LD A,IYL
AND A
LD A,L
JR NZ,SET_VOL1
LD A,(REG_A)
SET_VOL1 LD HL,KOLDVOL
CP (HL)
CCF
RET C
LD (SETDVOL),A
LD L,A
LD H,0
ADD HL,HL
ADD HL,HL
ADD HL,HL
LD DE,ADRTVOL
ADD HL,DE
LD (ADRTEKV),HL
LD A,(HL)
CP 4
; LD HL,DISKETA ;ЕЩЕ НЕ ОСИЛИЛ
JR C,SET_DRV
SUB 4
LD HL,COMSDZ
JR Z,SET_DRV
DEC A
LD HL,COMSDG
JR Z,SET_DRV
DEC A
LD HL,COMHDDN
IF SMUC=1
JR Z,SET_DRV
LD HL,COMHDDS
ENDIF
SET_DRV LD (GO_DEV),HL
XOR A
RET
SET_DEVICE PUSH AF
PUSH HL
LD A,B
AND 0X0F
LD B,A
LD HL,(ADRTEKV)
INC HL
LD A,(HL)
AND 1 ;MASTER ИЛИ SLAVE?
RLCA
RLCA
RLCA
RLCA
OR 0XE0 ;ВСЕГДА LBA РЕЖИМ
OR B
LD B,A ;УСТАНОВИЛИ ВЫБРАННОЕ УСТРОЙСТВО MASTER ИЛИ SLAVE
POP HL
POP AF
RET
;ПРОВЕРКА ТИПА РАЗДЕЛА
CP_RAZD LD E,1 ;FAT16
CP 4
RET Z
CP 6
RET Z
CP 0X0E
RET Z
LD E,2 ;FAT32
CP 0X0B
RET Z
CP 0X0C
RET Z
LD E,0 ;FAT12
CP 1
RET
;ВРЕМЕННАЯ ФУНКЦИЯ ВЫЗОВА ДРАЙВЕРА HDD NEMO
COMHDDNEX RST 0X10
LD A,(REG_A)
LD DE,(REG_E)
LD BC,(REG_C)
LD HL,(REG_L)
JP COMHDDN