;LAST UPDATE: 27.05.2012 savelij
;32 БАЙТА ОПИСАТЕЛЬ ПРИМОНТИРОВАННОГО ФАЙЛА
;00... | ОПИСАТЕЛЬ
;...1F | ПРИМОНТИРОВАННОГО ФАЙЛА
;+20 1 ФЛАГОВЫЙ
; 7-
; 6-
; 5-
; 4-
; 3-
; 2-
; 1-
; 0-
;+21 1 ТИП ОБРАЗА ПО РАСШИРЕНИЮ
;+22 1 ШАГ КЛАСТЕРОВ
;+23 1 ТИП РАЗДЕЛА
;+24 1 НОМЕР ВЫБРАННОГО РАЗДЕЛА
;+25 2 АДРЕС ВЫЗЫВАЕМОГО ДРАЙВЕРА ДЛЯ РАБОТЫ С ПРИМОНТИРОВАННЫМ ОБРАЗОМ
;+27 2 АДРЕС ВЫЗЫВАЕМОГО ДРАЙВЕРА ТЕКУЩЕГО ВЫБРАННОГО РАЗДЕЛА
;+28 1 НОМЕР МОНТИРУМОГО ДИСКОВОДА
MOUNTER CALL READ_BYTE
LD A,(NEXTBYTERST8)
ADD A,A
LD E,A
LD D,0
LD HL,TAB_MOUNTER
ADD HL,DE
LD A,(HL)
INC HL
LD H,(HL)
LD L,A
JP (HL)
TAB_MOUNTER DW OPEN_MOUNT
DW RDWR_MOUNT
DW FIND_MOUNTED
DW GET_MOUNTED
DW CLOSEMOUNT
OPEN_MOUNT LD IYL,INTERNAL
LD BC,WIN_P1
LD A,PAGE_MOUNTER
OUT (C),A
LD A,(RREG_A) ;ВЗЯЛИ НОМЕР МОНТИРУЕМОГО ДИСКОВОДА
ADD A,HIGH (BUF_PATHMOUNT+CPU1)
LD D,A
LD E,0 ;DE=АДРЕС БУФЕРА ПУТЕЙ ПРИМОНТИРОВАННЫХ ФАЙЛОВ
LD A,(SETDVOL) ;НОМЕР ТЕКУЩЕГО УСТРОЙСТВА
ADD A,HIGH (TEK_BUFPATH+CPU1)+4
LD H,A
LD L,E ;HL=АДРЕС ПУТИ НА ТЕКУЩЕМ УСТРОЙСТВЕ
LD BC,0X100
PUSH DE
LDIR ;ПЕРЕНЕСЛИ ПУТЬ
CALL READ_DIR ;ПРОЧИТАЛИ ОПИСАТЕЛЬ МОНТИРУЕМОГО ФАЙЛА
POP DE
PUSH HL
OPENMOUNT05 LD A,(DE)
INC DE
AND A
JR NZ,OPENMOUNT05
DEC DE
LD BC,0X8FF
OPENMOUNT01 LDI
LD A,(HL)
CP "!"
JR C,OPENMOUNT03
DJNZ OPENMOUNT01
LD A,"."
LD (DE),A
INC DE
JR OPENMOUNT06
OPENMOUNT03 INC HL
DJNZ OPENMOUNT03
DEC HL
LD A,"."
LD (DE),A
INC DE
OPENMOUNT06 LD B,3
OPENMOUNT02 LDI
LD A,(HL)
CP "!"
JR C,OPENMOUNT04
DJNZ OPENMOUNT02
OPENMOUNT04 XOR A
LD (DE),A
POP HL
LD A,(RREG_A)
PUSH HL
LD B,A
RRCA
RRCA
LD E,A
LD D,HIGH (MOUNT_DRIVES)
LD IXH,D
LD IXL,E ;IX=АДРЕС ОПИСАТЕЛЯ ПРИМОНТИРОВАННОГО ФАЙЛА
LD (IX+0X28),B
LD BC,0X20
LDIR
LD A,(IX+0X28)
LD D,A
INC A
LD H,0XF7
OPENMOUNT1 RLC H
DEC A
JR NZ,OPENMOUNT1
IN A,(RW_PORT0)
AND H
LD L,A
LD A,H
CPL
OR L
OUT (RW_PORT0),A ;УСТАНОВКА БИТА ПРИМОНТИРОВАННОГО ДИСКОВОДА
LD BC,WIN_P1
LD A,PAGE_MOUNTER
OUT (C),A
POP HL
;HL=АДРЕС ОПИСАТЕЛЯ МОНТИРУЕМОГО ФАЙЛА
IOPEN_MOUNT LD DE,FILE_EXT
CALL CP_EXT
LD (IX+0X21),C ;ТИП ОБРАЗА ПО РАСШИРЕНИЮ
CALL ICOM_DEV
DB Kol_vol
LD (IX+0X23),A ;ТИП РАЗДЕЛА
LD (IX+0X24),D ;НОМЕР ВЫБРАННОГО РАЗДЕЛА
LD L,D
LD H,0
ADD HL,HL
ADD HL,HL
ADD HL,HL
LD DE,BUF_TABLVOL ;АДРЕС ТАБЛИЦЫ НАЙДЕННЫХ РАЗДЕЛОВ
ADD HL,DE
LD A,(HL)
SUB 4
LD HL,COMSDZ
JR Z,OPENMOUNT6
DEC A
LD HL,COMSDG
JR Z,OPENMOUNT6
LD HL,COMHDDN
OPENMOUNT6 LD (IX+0X25),L
LD (IX+0X26),H
LD E,(IX+0X1D)
LD D,(IX+0X1E)
LD L,(IX+0X1F) ;LDE=РАЗМЕР ФАЙЛА/256
LD A,(BYTSSEC)
OPENMOUNT3 SRL L
RR D
RR E
RRCA
JR NC,OPENMOUNT3 ;LDE=КОЛИЧЕСТВО КЛАСТЕРОВ
LD IY,INTERNAL
LD A,D
REPT 3
SRL L
RR D
ENDM
AND 7
JR Z,OPENMOUNT4
INC IYH
OPENMOUNT4 LD A,L
OR D
JR Z,OPENMOUNT5 ;ЕСЛИ КЛАСТЕРОВ МЕНЕЕ 100
SRL L
RR D
INC IYH
JR OPENMOUNT4
OPENMOUNT5 LD A,IYH
LD (IX+0X22),A ;ШАГ КЛАСТЕРОВ
LD A,(IX+0X28)
ADD A,A
ADD A,A
ADD A,HIGH (MOUNT_CLS+CPU1)
LD H,A
LD L,0
LD C,(IX+0X14)
LD B,(IX+0X15)
LD E,(IX+0X1A)
LD D,(IX+0X1B)
JR OPENMOUNT9
OPENMOUNT7 AND A
JR Z,OPENMOUNT9
DEC IYH
JR NZ,OPENMOUNT8
OPENMOUNT9 LD A,(IX+0X22)
ADD A,A
ADD A,A
ADD A,A
LD IYH,A
LD (HL),E
INC H
LD (HL),D
INC H
LD (HL),C
INC H
LD (HL),B
DEC H
DEC H
DEC H
INC L
OPENMOUNT8 PUSH HL
CALL RDFATZP
CALL LST_CLS
POP HL
LD A,IYH
JR NC,OPENMOUNT7
RET
FILE_EXT DZ "TRD"
RDWR_MOUNT LD A,(RREG_A)
AND 3
RRCA
RRCA
LD IXL,A
LD IXH,HIGH (MOUNT_DRIVES) ;IX=ОПИСАТЕЛЬ ДИСКОВОДОВ A-D
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
LD A,(IX+0X24)
ADD A,HIGH (CPU1+BUF_ALLVOL)+4
LD H,A
LD L,0
LD DE,BUF_TEKVOL
LD BC,0X100
LDIR
LD BC,WIN_P1
LD A,PAGE_MOUNTER
OUT (C),A
LD HL,(GO_DEV)
LD (IX+0X27),L
LD (IX+0X28),H
LD L,(IX+0X25)
LD H,(IX+0X26)
LD (GO_DEV),HL
LD HL,(RREG_E)
DEC L
LD E,L
LD L,H
LD H,0
LD D,H
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,DE ;HL=НОМЕР СЕКТОРА В ФАЙЛЕ (256 БАЙТ)
PUSH HL
LD A,(BYTSSEC)
RDWRMOUNT1 SRL H
RR L
RRCA
JR NC,RDWRMOUNT1
LD A,(IX+0X22)
AND A
LD A,L
JR Z,RDWRMOUNT2
REPT 3
SRL H
RR L
ENDM
RDWRMOUNT2 EX AF,AF'
LD A,(RREG_A)
ADD A,A
ADD A,A
ADD A,HIGH (MOUNT_CLS+CPU1)
LD H,A
LD E,(HL)
INC H
LD D,(HL)
INC H
LD C,(HL)
INC H
LD B,(HL)
LD A,(IX+0X22)
AND A
JR Z,RDWRMOUNT3
EX AF,AF'
AND 7
JR Z,RDWRMOUNT3
RDWRMOUNT4 PUSH AF
CALL RDFATZP
POP AF
DEC A
JR NZ,RDWRMOUNT4
RDWRMOUNT3 CALL REALSEC
POP HL
PUSH HL
SRL L
LD A,(BYTSSEC)
DEC A
JR Z,RDWRMOUNT5
AND L
LD L,A
LD H,0
ADD HL,DE
EX DE,HL
LD HL,0
ADC HL,BC
LD B,H
LD C,L
RDWRMOUNT5 CALL LOADLST
POP BC
LD A,C
AND 1
ADD A,H
LD H,A
LD BC,CPU3
ADD HL,BC ;АДРЕС БУФЕРА В ОКНЕ 1
CALL LDIR_SEC
LD A,(RREG_A) ;ЧТЕНИЕ ИЛИ ЗАПИСЬ
AND 0X80
CALL NZ,LSTSAVE
LD HL,RREG_H
INC (HL)
LD L,(IX+0X27)
LD H,(IX+0X28)
LD (GO_DEV),HL
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
LD (LSTLOAD+2),HL
RET
LDIR_SEC EXX
LD BC,WIN_P1
XOR A
OUT (C),A ;СТРАНИЦА ПЕРЕМЕННЫХ В ОКНО 1
LD HL,CPU3
ADD HL,SP
LD SP,HL ;СТЕК ТОЖЕ В ОКНО 1
LD A,(R_7FFD) ;ПРОВЕРКА В КАКОМ МАППЕРЕ
AND 0X10
LD HL,B0_CPU0-CPU1 ;ДЛЯ 0 МАППЕРА
JR Z,LDIRSEC1
LD HL,B1_CPU0-CPU1 ;ДЛЯ 1 МАППЕРА
LDIRSEC1 EXX
LD BC,CPU2 ;АДРЕС ЧТЕНИЯ/ЗАПИСИ НА 0X8000 ВЫШЕ
EXX
LD A,(RREG_H-CPU1) ;ПРОВЕРКА СТАРШЕГО БАЙТА АДРЕСА
CP 0X40
JR C,LDIRSEC2 ;УСТАНОВКА ДЛЯ ОКНО 0,1
INC HL
INC HL
EXX
LD BC,CPU1 ;АДРЕС ЧТЕНИЯ/ЗАПИСИ НА 0X4000 ВЫШЕ
EXX
CP 0X80
JR C,LDIRSEC2 ;УСТАНОВКА ДЛЯ ОКОН 1,2
INC HL
INC HL
EXX
LD BC,CPU0 ;АДРЕС ЧТЕНИЯ/ЗАПИСИ БЕЗ ИЗМЕНЕНИЙ
EXX
CP 0XC0
JR C,LDIRSEC2 ;УСТАНОВКА ДЛЯ ОКОН 2,3
INC HL
INC HL
EXX
LD BC,CPU3 ;АДРЕС ЧТЕНИЯ/ЗАПИСИ НА 0X4000 НИЖЕ
EXX
LD B,HIGH (WIN_A2) ;СТАРШИЙ БАЙТ АДРЕСА ПОРТА ОКНА 2
CALL LDIRSEC4
LD DE,0XFFF8
ADD HL,DE ;АДРЕС ГДЕ КОНФИГ СТРАНИЦ ОСНОВНОЙ ПАМЯТИ ЛЕЖИТ
JR LDIRSEC5
LDIRSEC2 LD B,HIGH (WIN_A2) ;СТАРШИЙ БАЙТ АДРЕСА ПОРТА ОКНА 2
CALL LDIRSEC4
LDIRSEC5 LD B,HIGH (WIN_A3) ;СТАРШИЙ БАЙТ АДРЕСА ПОРТА ОКНА 3
CALL LDIRSEC4
EXX
LD DE,(RREG_L-CPU1) ;АДРЕС ЧТЕНИЯ/ЗАПИСИ
EX DE,HL
ADD HL,BC ;ИЗМЕНИЛИ АДРЕС ЧТЕНИЯ/ЗАПИСИ
EX DE,HL
LD A,(RREG_A-CPU1) ;ЧТЕНИЕ ИЛИ ЗАПИСЬ
AND 0X80
JR Z,LDIRSEC6
EX DE,HL ;ДЛЯ ЗАПИСИ МЕНЯЕМ НАПРАЛЕНИЕ ПЕРЕНОСА
LDIRSEC6 LD BC,0X100
LDIR
LD HL,CPU1
ADD HL,SP
LD SP,HL ;ВЕРНУЛИ АДРЕС СТЕКА В ОКНО 2
LD A,0X7F
LD BC,WIN_A3
OUT (C),A ;УБРАЛИ ВОЗМОЖНУЮ ЗАВИСИМОСТЬ В ОКНЕ 3 ОТ ПОРТА 7FFD
LD B,HIGH (WIN_A2)
OUT (C),A ;УБРАЛИ ВОЗМОЖНУЮ ЗАВИСИМОСТЬ В ОКНЕ 2 ОТ ПОРТА 7FFD
XOR A
LD B,HIGH (WIN_P2)
OUT (C),A ;ВЕРНУЛИ СТРАНИЦУ ПЕРЕМЕННЫХ В ОКНО 2
RET
LDIRSEC4 LD E,(HL) ;БАЙТ ДЛЯ ЗАПИСИ В ПОРТ
INC HL ;УКАЗАНИЕ НА БАЙТ АДРЕСА ПОРТА
BIT 3,(HL)
JR NZ,LDIRSEC3
SET 3,B
LD A,(HL)
AND 3
RRCA
RRCA
OUT (C),A ;СНАЧАЛА ПИШЕМ В ПОРТ XFF7
RES 3,B
LDIRSEC3 INC HL
OUT (C),E ;ТЕПЕРЬ ПИШЕМ В ПОРТ X7F7
RET
TXT_MOUNTER DZ "IMAGE.MNT" ;ИМЯ ДЛЯ ПОИСКА ТЕКСТОВОГО ФАЙЛА С УКАЗАНИЕМ К МОНТИРОВАНИЮ TRD
ETXT_MOUNTER
FIND_MOUNTED LD A,(SETDVOL)
LD (SAVE_TEK_VOL),A ;СОХРАНИЛИ ТЕКУЩЕЕ УСТРОЙСТВО
CALL SAVE_FNDVOL ;СОХРАНИЛИ ПЕРЕМЕННЫЕ ТЕКУЩЕГО УСТРОЙСТВА
LD H,CMOS_BYTE_01
CALL READCMOS
AND AUTOMOUNT ;ОПРЕДЕЛЕНИЕ НУЖНО ЛИ ИСКАТЬ ФАЙЛ IMAGE.MNT
JP Z,FINDMNTD01
;ИЩЕМ ФАЙЛ IMAGE.MNT ДЛЯ АВТОМОНТИРОВАНИЯ
LD IYL,INTERNAL
LD A,(KOLDVOL)
DEC A ;ИСКАТЬ БУДЕМ НА ПОСЛЕДНЕМ НАЙДЕННОМ РАЗДЕЛЕ
CALL SET_VOL_MNT ;ПЕРЕКЛЮЧИЛСЬ НА ВЫБРАННОЕ УСТРОЙСТВО
LD HL,(ROOTCLS)
LD (TEK_DIR),HL
LD HL,(ROOTCLS+2)
LD (TEK_DIR+2),HL ;ВЫБРАЛИ КОРНЕВОЙ КАТАЛОГ ВЫБРАННОГО УСТРОЙСТВА
CALL INIRTSC ;ИНИЦИАЛИЗИРОВАЛИ ЕГО ПЕРЕМЕННЫЕ НА ROOTDIR
LD HL,TXT_MOUNTER
LD DE,BUF_256
LD BC,ETXT_MOUNTER-TXT_MOUNTER
LDIR ;ПЕРЕНЕСЛИ ИМЯ ФАЙЛА ДЛЯ ПОИСКА
CALL ICOM_FAT
DB Find_name
JP C,FINDMNTD01 ;ФАЙЛ IMAGE.MNT НЕ НАЙДЕН
;ФАЙЛ НАЙДЕН
CALL OPEN_FILE ;ОТКРЫВАЕМ ФАЙЛ
LD HL,FILE_SRC+0X1F
LD A,(HL)
DEC HL
OR (HL)
JP NZ,FINDMNTD01 ;ФАЙЛ НЕ ДОЛЖЕН БЫТЬ БОЛЕЕ 512 БАЙТ
DEC HL
LD A,(HL)
CP 2
JP NC,FINDMNTD01 ;ФАЙЛ НЕ ДОЛЖЕН БЫТЬ БОЛЕЕ 512 БАЙТ
INC A ;ЧИТАТЬ БУДЕМ 1 СЕКТОР ИЗ НАЙДЕННОГО ФАЙЛА
LD B,(HL)
DEC HL
LD C,(HL) ;ВЗЯЛИ ДЛИНУ ФАЙЛА В БАЙТАХ
PUSH BC ;СОХРАНИЛИ ДЛЯ ДАЛЬНЕЙШЕГО ТСПОЛЬЗОВАНИЯ
LD IYL,INTERNAL
LD HL,CPU2+OFFSET_BUFSYM
PUSH HL
CALL READ_FILE ;ПРОЧИТАЛИ 1 СЕКТОР ИЗ ФАЙЛА
LD BC,WIN_P1
LD A,PAGE_MOUNTER
OUT (C),A
POP HL
POP BC
ADD HL,BC
LD (HL),0 ;УСТАНОВИЛИ ПРИЗНАЙ КОНЦА ФАЙЛА В 0
SBC HL,BC
FINDMNTD04 LD A,(HL)
AND A
JR Z,FINDMNTD01 ;ВЫХОДИМ ЕСЛИ ФАЙЛ КОНЧИЛСЯ
INC HL
CP "!"
JR C,FINDMNTD04 ;ЕСЛИ СТРОКА КОНЧИЛАСЬ ПЕРЕНОСИМ ЭТУ СТРОКУ В БУФЕР ПОИСКА
DEC HL
PUSH HL
INC HL
CP "a" ;ПЕРВЫЙ СИМВОЛ СТРОКИ БУКВА УСТРОЙСТВА
JR C,FINDMNTD06 ;ДОЛЖНА БЫТЬ ТОЛЬКО СИМВОЛ ОТ "A"
CP "{"
JR NC,FINDMNTD06 ;ДО "Z"
AND 0XDF ;ПЕРЕВЕЛИ БУКВУ УСТРОЙСТВА В ВЕРХНИЙ РЕГИСТР, ЕСЛИ НУЖНО
FINDMNTD06 SUB "E" ;FAT УСТРОЙСТВА НАЧИНАЮТСЯ С БУКВЫ "E"
JR C,FINDMNTD02
EXX
LD C,A ;НОМЕР УСТРОЙСТВА ГДЕ ИСКАТЬ ФАЙЛ
LD A,(KOLDVOL) ;КОЛИЧЕСТВО НАЙДЕННЫХ РАЗДЕЛОВ
CP C
EXX
JR C,FINDMNTD02
LD A,(HL)
INC HL
CP ":" ;РАЗДЕЛИТЕЛЬ ОБЯЗАТЕЛЕН
JR NZ,FINDMNTD02
LD A,(HL)
INC HL
CP "/" ;РАЗДЕЛИТЕЛЬ ОБЯЗАТЕЛЕН
JR NZ,FINDMNTD02
FINDMNTD07 LD A,(HL)
INC HL
CP "!"
JR NC,FINDMNTD07 ;ИЩЕМ КОНЕЦ СТРОКИ
LD A,(HL) ;БУКВА ДИСКОВОДА НА КОТОРУЮ МОНТИРОВАТЬ
INC HL
CP "a"
JR C,FINDMNTD08
CP "{"
JR NC,FINDMNTD08
AND 0XDF ;ПЕРЕВОДИ В ВЕРХНИЙ РЕГИСТР, ЕСЛИ НУЖНО
FINDMNTD08 SUB "A"
JR C,FINDMNTD02
CP 4
JR NC,FINDMNTD02
EXX
LD B,A ;НОМЕР ДИСКОВОДА НА КОТОРЫЙ МОНТИРОВАТЬ
EXX
LD A,(HL)
INC HL
CP ":"
JR NZ,FINDMNTD02
LD D,H
LD E,L
EX (SP),HL
EX DE,HL
SCF
SBC HL,DE
LD B,H
LD C,L
EX DE,HL
EXX
LD A,B
EXX
ADD A,HIGH (BUF_PATHMOUNT+CPU1)
LD D,A
LD E,0 ;DE=АДРЕС БУФЕРА ТЕКСТОВОЙ СТРОКИ МОНТИРУЕМОГО ДИСКОВОДА
DEC BC
DEC BC
LDIR ;ПЕРЕНЕСЛИ СТРОКУ
XOR A
LD (DE),A ;ПРИНУДИТЕЛЬНОЕ ЗАВЕРШЕНИЕ СТРОКИ МОНТИРОВАНИЯ
POP HL
JR FINDMNTD04
FINDMNTD02 LD A,(HL)
INC HL
AND A
JR Z,FINDMNTD01
CP " "
JR NC,FINDMNTD02
POP DE
JR FINDMNTD04
FINDMNTD01 LD BC,WIN_P1
LD A,PAGE_MOUNTER
OUT (C),A
LD BC,0X400
LD IX,MOUNT_DRIVES ;БУФЕР ОПИСАТЕЛЕЙ МОНТИРУЕМЫХ ФАЙЛОВ
FINDMNTD2 PUSH BC
CALL FINDMNTD0 ;ИЩЕМ УКАЗАННЫЙ ФАЙЛ ДЛЯ МОНТИРОВАНИЯ
JR NC,FINDMNT5
LD (IX+0),0 ;ЕСЛИ ФАЙЛ НЕ НАЙДЕН, ТО ПРИНУДИТЕЛЬНО ДЕМОНТИРУЕМ ОБРАЗ
FINDMNT5 LD BC,0X40
ADD IX,BC ;СЛЕДУЮЩИЙ ОПИСАТЕЛЬ МОНТИРУЕМОГО ФАЙЛА
POP BC
DJNZ FINDMNTD2
LD A,IYH
OUT (RW_PORT0),A ;УСТАНОВИЛИ ЗНАЧЕНИЕ ПОРТА ДЛЯ EVO-DOS
LD A,(SAVE_TEK_VOL)
CALL SET_VOL_MNT ;ВОССТАНОВИЛИ ТЕКУЩЕЕ ВЫБРАННОЕ УСТРОЙСТВО
CALL INIRTSC ;ПРОИНИТИЛИ ЕГО ПЕРЕМЕННЫЕ
JP LOAD_FNDVOL ;ВЕРНУЛИ НА МЕСТО ОПИСАТЕЛЬ УСТРОЙСТВА
;ПОИСК МОНТИРУЕМОГО ФАЙЛА С УСТАНОВКОЙ СООТВЕСТВУЮЩЕГО БИТА
FINDMNTD0 CALL FINDMNTD1
EX AF,AF'
LD A,IXL
AND 0XC0
RLCA
RLCA ;НОМЕР ТЕКУЩЕГО МОНТИРУЕМОГО ДИСКОВОДА
INC A
LD B,A
LD A,%11110111
RLCA
DJNZ $-1 ;УСТАНОВКА МАСКИ МОНТИРУЕМОГО ДИСКОВОДА
LD C,A ;МАСКА
CPL
LD B,A ;БИТ
LD A,IYH
AND C ;СБРОСИЛИ БИТ СМОНТИРОВАННОГО ДИСКОВОДА
LD IYH,A
EX AF,AF'
RET C ;ВЫХОД ЕСЛИ ФАЙЛ НЕ НАЙДЕН
LD A,IYH
OR B ;УСТАНОВИЛИ БИТ ЕСЛИ ФАЙЛ НАЙДЕН
LD IYH,A
RET
;СОХРАНЕНИЕ ТЕКУЩЕГО ПУТИ
STORE_PATH PUSH AF
LD BC,WIN_P1
LD A,PAGE_MOUNTER
OUT (C),A
LD A,(SETDVOL) ;НОМЕР ТЕКУЩЕГО УСТРОЙСТВА
ADD A,HIGH (TEK_BUFPATH+CPU1)+4 ;+СТАРШИЙ БАЙТ АДРЕСА ПУТИ
LD H,A
LD DE,BUF_256
LD BC,0X100
LD L,C
LDIR
STOREPATH1 POP AF
RET
;ВОССТАНОВЛЕНИЕ ТЕКУЩЕГО ПУТИ
RESTORE_PATH PUSH AF
LD BC,WIN_P1
LD A,PAGE_MOUNTER
OUT (C),A
LD A,(SETDVOL) ;НОМЕР ТЕКУЩЕГО УСТРОЙСТВА
ADD A,HIGH (TEK_BUFPATH+CPU1)+4 ;+СТАРШИЙ БАЙТ АДРЕСА ПУТИ
LD D,A
LD HL,BUF_256
LD BC,0X100
LD E,C
LDIR
RESTOREPATH1 POP AF
RET
;ПОИСК МОНТИРУЕМОГО ФАЙЛА
FINDMNTD1 LD A,IXL
RLCA
RLCA
AND 3
ADD A,HIGH (BUF_PATHMOUNT+CPU1)
LD D,A
LD E,0 ;DE=АДРЕС БУФЕРА СТРОКИ ОПИСАТЕЛЯ МОНТИРУМОГО ФАЙЛА
LD A,(DE) ;ВЗЯЛИ БУКВУ УСТРОЙСТВА ГДЕ ФАЙЛ ИСКАТЬ
INC DE
INC DE
INC DE
AND A
SCF
RET Z
SUB "E" ;КОНВЕРСИЯ БУКВЫ В НОМЕР
PUSH DE
CALL SET_VOL_MNT ;ПЕРЕКЛЮЧИЛИСЬ НА ЭТО УСТРОЙСТВО
CALL STORE_PATH ;СОХРАНИЛИ ТЕКУЩИЙ ПУТЬ
LD HL,(ROOTCLS)
LD (TEK_DIR),HL
LD HL,(ROOTCLS+2)
LD (TEK_DIR+2),HL ;ПЕРЕШЛИ В КОРЕНЬ УСТРОЙСТВА
CALL INIRTSC ;ИНИЦИАЛИЗАЦИЯ ЕГО ПЕРЕМЕННЫХ
LD BC,WIN_P1
LD A,PAGE_MOUNTER
OUT (C),A
POP HL
CALL FNDBUF ;РАСПАКОВКА ТЕКСТОВОЙ СТРОКИ
FINDMNTD13 PUSH HL
CALL POSTF02 ;СБРОС ТЕКУЩЕГО НОМЕРА ФАЙЛА В 0
CALL FINDMNTD3 ;ПОИСК В ТЕКУЩЕЙ ДИРЕКТОРИИ
POP DE
JP C,RESTORE_PATH ;ВОССТАНОВИЛИ ТЕКУЩИЙ ПУТЬ
LD BC,0X0B
ADD HL,BC
LD A,(HL)
SBC HL,BC
AND 0X10
JR Z,FINDMNTD23 ;ЕСЛИ ЭТО ФАЙЛ НАЙДЕН, ТО ОН НАЙДЕН
PUSH DE
CALL ENTER_DIR ;ИНАЧЕ ВХОДИМ В ДИРЕКТОРИЮ
CALL POSTF02 ;СБРОС ТЕКУЩЕГО НОИЕРА ФАЙЛА В 0
POP HL
LD A,(HL)
AND A
SCF
JP Z,RESTORE_PATH ;ВОССТАНОВИЛИ ТЕКУЩИЙ ПУТЬ
CALL FNDBUF ;РАСПАКОВЫВАЕМ СЛЕДУЮЩУЮ ЧАСТЬ СТРОКИ
JR FINDMNTD13 ;ПРОДОЛЖАЕМ ПОИСК
FINDMNTD23 LD A,IXL
RLCA
RLCA
LD E,IXL
LD D,IXH ;DE=КУДА ОПИСАТЕЛЬ ПЕРЕНОСИТЬ
LD (IX+0X28),A ;НОМЕР МОНТИРУЕМОГО ДИСКОВОДА
PUSH HL
LD BC,0X20
LDIR
POP HL
PUSH IY
CALL IOPEN_MOUNT
POP IY
XOR A
JP RESTORE_PATH ;ВОССТАНОВИЛИ ТЕКУЩИЙ ПУТЬ
FINDMNTD4 CALL NXTLEGZ
FINDMNTD3 PUSH HL
LD DE,FB_EXT
CALL ICMP_NAME
POP HL
RET Z
LD A,(HL)
AND A
JR NZ,FINDMNTD4
SCF
RET
GET_MOUNTED LD BC,WIN_P1
LD A,PAGE_MOUNTER
OUT (C),A
LD HL,MOUNT_DRIVES-CPU2
LD DE,(RREG_L)
LD BC,0X100
JP LDIR_BYTES
; JP MAIN_MEM13
CLOSEMOUNT LD BC,WIN_P1
LD A,PAGE_MOUNTER
OUT (C),A
LD A,(RREG_A)
LD B,A
RRCA
RRCA
LD L,A
LD H,HIGH (MOUNT_DRIVES)
LD (HL),0
LD A,B
ADD A,HIGH (BUF_PATHMOUNT+CPU1)
LD H,A
LD L,0
LD (HL),L
INC B
LD A,0XF7
RLCA
DJNZ $-1
LD B,A
IN A,(RW_PORT0)
AND B
OUT (RW_PORT0),A
RET
;РАСПАКОВЩИК ПУТИ К ФАЙЛУ
;HL=АДРЕС ТЕКСТОВОЙ СТРОКИ
FNDBUF LD BC,0X0802
LD DE,FB_EXT
FNDBUF4 LD A,(HL)
INC HL
CP "."
JR Z,FNDBUF2
CP "/"
JR Z,FNDBUF5
LD (DE),A
INC DE
DJNZ FNDBUF4
LD A,(HL)
AND A
RET Z
INC HL
JR FNDBUF3
FNDBUF5 LD A,C
AND A
RET Z
FNDBUF2 LD A,B
AND A
JR Z,FNDBUF3
LD A," "
LD (DE),A
INC DE
DJNZ $-2
FNDBUF3 LD B,3
DEC C
DEC HL
LD A,(HL)
CP "/"
JR Z,FNDBUF4
INC HL
JR FNDBUF4