;LAST UPDATE: 24.05.2012 savelij
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
EXTERNAL EQU 0 ;ВНЕШНИЙ ВЫЗОВ
INTERNAL EQU 1 ;ВНУТРЕННИЙ ВЫЗОВ
INT4EXT EQU 3 ;ВНУТРЕННИЙ ВЫЗОВ ДЛЯ ВЫЗВАВШЕЙ ПРОГИ
;ВЫЗОВ ВЫБРАННОГО ДРАЙВЕРА
TO_DRV PUSH HL
LD L,A
LD A,IYL
AND A
LD A,L
JR NZ,TO_DRV1
CALL READ_BYTE
LD A,(RREG_A)
LD DE,(RREG_E)
LD BC,(RREG_C)
LD HL,(RREG_L)
EX (SP),HL
TO_DRV1 LD HL,(GO_DEV)
EX (SP),HL
RET
;ВНЕШНИЙ ВЫЗОВ МЕНЕДЖЕРА УСТРОЙСТВ
COM_DEV EX AF,AF'
CALL READ_BYTE
LD A,(NEXTBYTERST8)
PUSH IY
LD IYL,EXTERNAL ;ВНЕШНИЙ ВЫЗОВ
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,INTERNAL ;ВНУТРЕННИЙ ВЫЗОВ
JR NEXT_ICOM_DEV
TABLDEV DW DEVFIND ;00 ПОИСК УСТРОЙСТВ
DW SET_VOL ;01 ВЫБОР РАЗДЕЛА
DW KOL_VOL ;02 ЗАПРОС НАЙДЕНОГО
DW GET_FNDVOLUME ;03 ПОЛУЧИТЬ ТАБЛИЦУ НАЙДЕННЫХ РАЗДЕЛОВ
DW FREINIT_VOL ;04 ПОЛНАЯ ПЕРЕИНИЦИАЛИЗАЦИЯ РАЗДЕЛА
DW TO_DRV ;05 ВЫЗОВ ДРАЙВЕРА ВЫБРАННОГО УСТРОЙСТВА
DW SET_DEVICE ;06 УСТАНОВКА БИТОВ УСТРОЙСТВА И LBA РЕЖИМА
DW COMHDDNEX ;07 ПРЯМОЙ ВЫЗОВ ДРАЙВЕРА 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=04,06,0E-FAT16
;02=0B,0C-FAT32
;+3(4)-СТАРТОВЫЙ СЕКТОР РАЗДЕЛА
;+7(1)-РЕЗЕРВ
;ТОЧКА ВХОДА ДЛЯ ПОИСКА РАЗДЕЛОВ
;HL-АДРЕС КУДА ПОКЛАСТЬ ТАБЛИЦУ РАЗДЕЛОВ
;НА ВЫХОДЕ:
;A-КОЛ-ВО РАЗДЕЛОВ
DEVFIND LD HL,0XFE
LD IX,BUF_TABLVOL
CALL CRC16
LD BC,(BUF_TABLVOL+0XFE)
AND A
SBC HL,BC
JP Z,KOL_VOL
PUSH IY
XOR A
LD (KOLDVOL),A ;КОЛИЧЕСТОВ НАЙДЕННЫХ РАЗДЕЛОВ
LD HL,BUF_TABLVOL
LD D,H
LD E,L
INC DE
LD BC,0XFD
LD (HL),B
LDIR
LD IX,BUF_TABLVOL ;АДРЕС ТАБЛИЦЫ НАЙДЕННЫХ РАЗДЕЛОВ
LD IYL,INTERNAL
;NEMO
LD HL,BUF_512 ;АДРЕС БУФЕРА ДЛЯ ЗАГРУЗКИ СЕКТОРА (512 БАЙТ)
CALL COMHDDN
DB Dev_init ;ИНИЦИАЛИЗАЦИЯ УСТРОЙСТА С ОПРЕДЕЛЕНИЕМ ЧТО ПОДКЛЮЧЕНО
LD A,H
AND A
LD A,HDDN+MASTER
LD HL,BUF_512
PUSH IY
CALL Z,RD0HDD ;ПОИСК РАЗДЕЛОВ НА НАЙДЕННОМ УСТРОЙСТВЕ - HDD MASTER
POP IY
;SD ON NEOGS
LD H,CMOS_BYTE_01
CALL READCMOS
AND ACCESSSDG ;ПРОВЕРКА РАЗРЕШЕНИЯ ДОСТУПА К SD КАРТЕ NEOGS
JR Z,DEVFND1 ;ЕСЛИ ЗАПРЕЩЕН, ТО НЕ ВЫЗЫВАЕМ
CALL INSTSDD ;УCТАНОВКА ДРАЙВЕРА SD КАРТЫ НА NEOGS
AND A
JR NZ,DEVFND1 ;НЕ ИНИЦИАЛИЗИРОВАТЬ ЕСЛИ NEOGS НЕ НАЙДЕН
CALL COMSDG
DB Dev_init ;ИНИЦИАЛИЗАЦИЯ SD КАРТЫ НА NEOGS
AND A
PUSH IY
CALL Z,RD0SDG ;ПОИСК РАЗДЕЛОВ НА УСТРОЙСТВЕ
POP IY
;SD ON Z-CONTROLLER
DEVFND1 CALL COMSDZ
DB Dev_init ;ИНИЦИАЛИЗАЦИЯ SD КАРТЫ
AND A
PUSH IY
CALL Z,RD0SD ;ПОИСК РАЗДЕЛОВ НА УСТРОЙСТВЕ
POP IY
LD IYL,EXTERNAL
CALL SETVOLD ;ВЫЧИСЛЕНИЕ КОЛИЧЕСТВА НАЙДЕННЫХ РАЗДЕЛОВ НА ВСЕХ УСТРОЙСТВАХ
POP IY
SCF
JP Z,KOLVOL1
INIT_VOLS LD IX,BUF_TABLVOL
LD A,(KOLDVOL)
LD E,A
LD D,0
IV_SETDRV2 PUSH AF
LD A,D
LD (SETDVOL),A
LD A,(IX+0)
SUB 4
LD HL,COMSDZ
JR Z,IV_SETDRV1
DEC A
LD HL,COMSDG
JR Z,IV_SETDRV1
LD HL,COMHDDN
IV_SETDRV1 LD (GO_DEV),HL
LD A,(IX+2)
LD HL,BUF_TABLVOL
PUSH DE
CALL ICOM_FAT
DB Init_fatvars
CALL SAVE_FNDVOL
POP DE
INC D
LD BC,8
ADD IX,BC
POP AF
DEC A
JR NZ,IV_SETDRV2
CALL ICOM_FAT
DB Init_tekdir
LD HL,0XFE
LD IX,BUF_TABLVOL
CALL CRC16
LD (BUF_TABLVOL+0XFE),HL
KOL_VOL LD A,IYL
AND A
JR NZ,IKOL_VOL
LD HL,(ADRTEKV) ;АДРЕС ТЕКУЩЕГО ВЫБРАННОГО РАЗДЕЛА
INC HL
INC HL
LD A,(HL) ;ТИП РАЗДЕЛА
LD HL,(KOLDVOL) ;D-НОМЕР ВЫБРАННОГО РАЗДЕЛА, E-КОЛИЧЕСТВО НАЙДЕННЫХ РАЗДЕЛОВ
LD (RREG_E),HL
AND A
KOLVOL1 PUSH AF
POP HL
LD (RREG_F),HL
RET
;ЗАПРОС НАЙДЕНОГО И ТЕКУЩЕГО ВЫБРАННОГО УСТРОЙСТВА
IKOL_VOL LD HL,(ADRTEKV) ;АДРЕС ТЕКУЩЕГО ВЫБРАННОГО РАЗДЕЛА
INC HL
INC HL
LD A,(HL) ;ТИП РАЗДЕЛА
LD DE,(KOLDVOL) ;D-НОМЕР ВЫБРАННОГО РАЗДЕЛА, E-КОЛИЧЕСТВО НАЙДЕННЫХ РАЗДЕЛОВ
LD HL,BUF_TABLVOL ;АДРЕС НАЧАЛА ТАБЛИЦЫ НАЙДЕННЫХ РАЗДЕЛОВ
AND A
RET
;ВЫЧИСЛЕНИЕ КОЛИЧЕСТВА НАЙДЕННЫХ РАЗДЕЛОВ НА ВСЕХ УСТРОЙСТВАХ
SETVOLD LD A,IXL
RRCA
RRCA
RRCA
AND 0X1F
LD (KOLDVOL),A
RET
FREINIT_VOL LD L,A
LD A,IYL
AND A
JR Z,FREINITVOL1
LD A,(RREG_A)
FREINITVOL1 LD IYL,INTERNAL
CALL SET_VOL1
CALL INIT_FATVARS
JP INIRTSC
;ВЫБОР РАЗДЕЛА
SET_VOL LD L,A
LD A,IYL
AND A
LD A,L
JR NZ,SET_VOL1
LD A,(RREG_A)
LD HL,KOLVOL1
PUSH HL
SET_VOL1 PUSH AF
CALL SAVE_FNDVOL
POP AF
SET_VOL_MNT 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,BUF_TABLVOL
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
LD HL,COMHDDN
SET_DRV LD (GO_DEV),HL
CALL LOAD_FNDVOL
LD HL,0XFE
PUSH IX
LD IX,BUF_TABLVOL
CALL CRC16
POP IX
LD (BUF_TABLVOL+0XFE),HL
XOR A
RET
SAVE_FNDVOL LD BC,WIN_P1
LD A,PAGE_FATVARS
OUT (C),A
LD A,(SETDVOL)
ADD A,HIGH (CPU1+BUF_ALLVOL)+4
LD D,A
LD E,0
LD HL,BUF_TEKVOL
LD BC,0X100
LDIR
RET
LOAD_FNDVOL LD BC,WIN_P1
LD A,PAGE_FATVARS
OUT (C),A
LD A,(SETDVOL)
ADD A,HIGH (CPU1+BUF_ALLVOL)+4
LD H,A
LD L,0
LD DE,BUF_TEKVOL
LD BC,0X100
LDIR
CALL ICOM_FAT
DB Init_tekdir
RET
;ПОИСК РАЗДЕЛОВ НА SD КАРТЕ NEOGS
RD0SDG LD HL,BUF_512
LD A,SDG
PUSH AF
LD DE,0
LD B,D
LD C,E
PUSH HL
LD A,1
CALL COMSDG
DB Dev_read
JR RD0HDD_
;ПОИСК РАЗДЕЛОВ НА SD КАРТЕ Z-КОНТРОЛЛЕРА
RD0SD LD HL,BUF_512
LD A,SDZ
PUSH AF
LD DE,0
LD B,D
LD C,E
PUSH HL
LD A,1
CALL COMSDZ
DB Dev_read
JR RD0HDD_
;ПОИСК РАЗДЕЛОВ НА 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
LD A,1
CALL COMHDDN
DB Dev_read
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
INIT_VOL PUSH IY
LD IYL,INTERNAL
CALL SETVOLD
DEC A
LD (SETDVOL),A
LD L,A
LD H,0
ADD HL,HL
ADD HL,HL
ADD HL,HL
LD DE,BUF_TABLVOL
ADD HL,DE
LD (ADRTEKV),HL
LD A,(HL)
CP 4
; LD HL,DISKETA ;ЕЩЕ НЕ ОСИЛИЛ
JR C,DSET_DRV
SUB 4
LD HL,COMSDZ
JR Z,DSET_DRV
DEC A
LD HL,COMSDG
JR Z,DSET_DRV
LD HL,COMHDDN
DSET_DRV LD (GO_DEV),HL
CALL IKOL_VOL
CALL ICOM_FAT
DB Init_fatvars
LD (IX-6),A
POP IY
RET
;НА ВХОДЕ:
;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 PUSH 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
POP AF
DEC A
JR NZ,SCNMBR0
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 CALL READ_BYTE
LD A,(RREG_A)
LD DE,(RREG_E)
LD BC,(RREG_C)
LD HL,(RREG_L)
JP COMHDDN
;КОПИРОВАНИЕ ТАБЛИЦЫ НАЙДЕННЫХ РАЗДЕЛОВ ВО ВНЕШНЮЮ ПРОГРАММУ
GET_FNDVOLUME LD BC,0X100 ;ПЕРЕНОС 256 БАЙТ
LD DE,(RREG_L) ;АДРЕС КУДА ПЕРЕНОСИТЬ
LD HL,BUF_TABLVOL-CPU2
JP LDIR_BYTES