;LAST UPDATE: 30.08.2017 savelij
LOAD4FLASH LD HL,ROMS
LD DE,CMP4ROMS
JR FATBOOT4
COPYIMAGE LD HL,IMAGES
LD DE,CMP4IMAGE
JR FATBOOT4
;ВЫБОР УСТРОЙСТВА ДЛЯ ЗАГРУЗКИ
FATBOOT LD HL,HOBETA
LD DE,CMP4HOBETA
FATBOOT4 DI
LD (GDE_EXT_FILES),HL
LD (CMP_FOUNDED),DE
LD HL,ADRTBLDIRL
LD (DIR_LEVEL),HL ;УСТАНОВИЛИ ДНО СТЕКА СОХРАНЕННИЙ ОКОШЕК
LD HL,FLAGS
SET B_RUN_FAT_DSK,(HL) ;РАБОТАТЬ БУДЕМ С FAT
CALL COM_DEV
DB Devfind ;СКАНИРОВАНИЕ УСТРОЙСТВ
JP C,_STUPID ;ОШИБКА, НИ ОДНОГО РАЗДЕЛА НЕ НАЙДЕНО
LD B,E ;СЧЕТЧИК КОЛИЧЕСТВА НАЙДЕННЫХ РАЗДЕЛОВ
LD IX,SEL_FAT_DEV ;АДРЕС ОПИСАТЕЛЯ ОКНА ВЫБОРА РАЗДЕЛОВ
LD (IX+0X10),E ;КОЛИЧЕСТВО ПУНКТОВ В ОКНЕ
INC E
INC E
LD (IX+2),E ;УСТАНОВИЛИ ВЫСОТУ ВЫВОДИМОГО ОКНА
LD DE,6 ;ШАГ ПО ТАБЛИЦЕ НАЙДЕННЫХ РАЗДЕЛОВ -2
EXX
LD HL,TXT_FAT_SEL
LD DE,SEL_FAT_DRV ;АДРЕС ГДЕ БУДЕТ ФОРМИРОВАТЬСЯ ТЕКСТ ОКНА ВЫБОРА РАЗДЕЛОВ
LD BC,ETXT_FAT_SEL-TXT_FAT_SEL
LDIR
EX DE,HL
EXX
FATBOOT1 EXX
LD (HL),0X0D
INC HL
LD (HL),3
INC HL
EXX
LD A,(HL) ;ВЗЯЛИ НОМЕР РАЗДЕЛА
INC HL
LD C,(HL) ;MASTER ИЛИ SLAVE
INC HL
ADD A,C
ADD A,C
SUB 4 ;-4, ИБО ДИСКОВОДЫ НЕ УЧИТЫВАЮТСЯ
ADD A,A
ADD A,A
ADD A,A
ADD A,A ;УМНОЖЕНО НА 16
EXX
EX DE,HL
LD HL,TXT4MENU_DEVICE ;АДРЕС ТАБЛИЦЫ ТЕКСТА О РАЗДЕЛАХ
LD C,A
LD B,0
ADD HL,BC ;ПОЛУЧИЛИ АДРЕС ОТКУДА ТЕКСТ ВЗЯТЬ
LD BC,0X10 ;ДЛИНА ПЕРЕНОСА 16 БАЙТ
EXX
LD A,L
EXX
RRCA
RRCA
RRCA
AND 0X1F
ADD A,"E" ;БУКВА НАЙДЕННОГО УСТРОЙСТВА
LD (DE),A
INC DE
LDIR ;ПЕРЕНОС ТЕКСТА ИЗ ВЫБРАННОЙ ТАБЛИЦЫ
EXX
LD A,(HL) ;ТИП РАЗДЕЛА
EXX
LD C,A
ADD A,A
ADD A,A
ADD A,C ;УМНОЖЕННО НА 5
LD HL,TXT4MENU_TYPE ;АДРЕС ТАБЛИЦЫ ТЕКСТА ТИПОВ РАЗДЕЛОВ
LD C,A
ADD HL,BC
LD C,5
LDIR ;ПЕРЕНОС ТЕКСТА ИЗ ВЫБРАННОЙ ТАБЛИЦЫ
EX DE,HL
EXX
ADD HL,DE
DJNZ FATBOOT1
EXX
LD (HL),0
INC HL
LD B,(IX+2)
DEC B
DEC B
LD C,B
LD A,"e"
LD (HL),B
INC HL
FATBOOT3 LD (HL),A ;ФОРМИРОВАНИЕ ТАБЛИЦЫ ГОРЯЧИХ КЛАВИШ
INC HL
INC A
DJNZ FATBOOT3
LD (SELFATDEVEXE),HL ;ПОЛОЖИЛИ АДРЕС ТАБЛИЦЫ АДРЕСОВ ВЫЗОВА ВЫБРАННОГО
LD B,C
FATBOOT2 LD (HL),LOW (SEL_FAT) ;ФОРМИРОВАНИЕ ТАБЛИЦЫ АДРЕСОВ ВЫЗЫВОВ
INC HL
LD (HL),HIGH (SEL_FAT)
INC HL
DJNZ FATBOOT2
LD A,C
EXX
DEC A
JR Z,SEL_FAT
CALL WINW ;ВЫВЕЛИ СФОРМИРОВАННОЕ ОКНО
JP _RULILKA ;ВОЗВРАЩАЕМСЯ К ОБЩЕМУ УПРАВЛЕНИЮ
;ПЕРЕКЛЮЧЕНИЕ НА УСТРОЙСТВА И ВЫВОД НАЙДЕННОГО НА НЕМ
SEL_FAT DI
LD A,(IX+0X12) ;ВЗЯЛИ НОМЕР ВЫБРАННОГО УСТРОЙСТВА
CALL COM_DEV
DB Set_vol ;ВЫБРАЛИ УСТРОЙСТВО ПО НОМЕРУ
CALL COM_FAT
DB Wc_fat ;ИНИЦИАЛИЗАЦИЯ ФАТ ДРАЙВЕРА ДЛЯ ВЫБРАННОГО УСТРОЙСТВА
CALL SEARCH_FILE
LD HL,1
AND A
SBC HL,BC ;НАЙДЕННО ЧТО-ТО ОДНО?
JR NZ,SEL_FAT1 ;ЕСЛИ НАЙДЕНО >1, ТО ПРОДОЛЖАЕМ
PUSH BC ;СОХРАНИЛИ КОЛИЧЕСТВО НАЙДЕННОГО
LD BC,(ADR_CAT) ;ВЗЯЛИ НОМЕР ЕДИНСТВЕННОГО НАЙДЕННОГО
LD A,6
CALL COM_FAT
DB Positf
CALL COM_FAT
DB Getfzap ;ПОЛУЧИЛИ ОПИСАТЕЛЬ
POP BC ;ВЕРНУЛИ КОЛИЧЕСТВО НАЙДЕННОГО
LD DE,0X0B
ADD HL,DE
LD A,(HL) ;ВЗЯЛИ ФЛАГОВЫЙ БАЙТ ТОГО ЧТО НАШЛИ
AND 0X10
LD HL,0 ;ЕСЛИ ЗАПУСКАЕМ, ТО НОМЕР 0 ИЗ НАЙДЕННОГО
JR Z,RUN_HOB1 ;ЕСЛИ ЭТО ФАЙЛ СРАЗУ ЗАПУСКАЕМ
SEL_FAT1 LD IX,FAT_FILES ;ЕСЛИ ДИРА, ТО ВЫВОДИМ В ОКНО
JP OUT_HOB
;ЗАПУСК ВЫБРАННОГО КОДОВОГО ФАЙЛА ИЗ HOBETA ФАЙЛА
RUN_HOB DI
CALL SHUT2AY ;БУМКАЛКА В AY
LD L,(IX+0X12)
LD H,(IX+0X13)
RUN_HOB1 LD DE,ADR_CAT
ADD HL,HL
ADD HL,DE ;ОТКУДА ИМЯ ФАЙЛА ВЗЯТЬ
LD C,(HL)
INC HL
LD B,(HL) ;ПОЛУЧИЛИ ТЕКУЩИЙ ВЫБРАННЫЙ НОМЕР
LD A,6
CALL COM_FAT
DB Positf ;УСТАНОВКА ВНУТРЕННЕГО УКАЗАТЕЛЯ FAT ДРАЙВЕРА
CALL COM_FAT
DB Getfzap ;ПОЛУЧИЛИ ОПИСАТЕЛЬ ПО УСТАНОВЛЕННОМУ НОМЕРУ
LD DE,0X0B ;НУЖЕН БАЙТ ПО СМЕЩЕНИЮ
ADD HL,DE
LD A,(HL) ;ИЗ ЭТОГО БАЙТА НУЖЕН ОДИН БИТ
SBC HL,DE
AND 0X10 ;ПРОВЕРИЛИ
JR Z,GO_RUN_HOB ;ЕСЛИ ЭТО ФАЙЛ, ТО ЗАПУСКАЕМ КОДОВЫЙ БЛОК
PUSH BC ;СОХРАНИЛИ НОМЕР
CALL COM_FAT
DB Ent_dir ;ВОЙТИ/ВЫЙТИ В/ИЗ ДИРЕКТОРИЙ
POP BC ;ВОССТАНОВИЛИ ТЕКУЩИЙ НОМЕР
LD A,D ;БУДЕМ ПРОВЕРЯТЬ ПЕРВЫЙ СИМВОЛ ИМЕНИ ПРЕДЫДУЩЕГО ОПИСАТЕЛЯ
LD HL,0 ;АДРЕС СТЕКА ОКОННЫХ СОХРАНЕНИЙ ДЛЯ ХОЖДЕНИЯ ПО ДИРАМ
DIR_LEVEL EQU $-2
CP "." ;ЕСЛИ ПЕРВЫЙ СИМВОЛ ИМЕНИ НЕ ".", ТО СОХРАНЯЕМ ТЕКУЩИЕ ЗНАЧЕНИЯ ОКОШКА И
JR NZ,SNYT0 ;ВХОДИМ В ДИРУ
INC HL ;ПРИ ВЫХОДЕ ИЗ ДИРЫ ВОЗВРАЩАЕМ ДАННЫЕ ПРЕДЫДУЩЕГО ОКНА
LD A,(HL)
INC HL
LD E,(HL)
INC HL
LD D,(HL)
LD (DIR_LEVEL),HL ;СОХРАНИЛИ ИЗМЕНИВШИЙСЯ АДРЕС СТЕКА ДИРЕКТОРИЙ
LD (IX+0X12),E
LD (IX+0X13),D
LD (IX+0X0F),A
CALL SEARCH_FILE
LD (IX+0X10),C
LD (IX+0X11),B ;ВОССТАНОВИЛИ ДАННЫЕ ОКНА ПРЕДЫДУЩЕЙ ДИРЫ
JP REOUT_HOB ;ВЫВЕЛИ НОВОЕ СОДЕРЖИМОЕ ОКНА
;ПРИ ВХОДЕ В ДИРУ СОХРАНЕНИЕ ТЕКУЩИХ ДАННЫХ ОКНА
SNYT0 LD D,(IX+0X13)
LD E,(IX+0X12)
LD A,(IX+0X0F)
LD C,(IX+0X10)
LD B,(IX+0X11)
LD (HL),D
DEC HL
LD (HL),E
DEC HL
LD (HL),A
DEC HL
LD (DIR_LEVEL),HL ;СОХРАНИЛИ ИЗМЕНИВШИЙСЯ АДРЕС СТЕКА
CALL SEARCH_FILE
JP OUT_HOB
GO_RUN_HOB PUSH HL ;СОХРАНИЛИ АДРЕС ОПИСАТЕЛЯ
LD DE,0X14 ;ПЕРЕХОДИМ К СМЕЩЕНИЮ В ОПИСАТЕЛЕ ДЛЯ ПОЛУЧЕНИЯ
ADD HL,DE ;СТАРШИХ 16 БИТ НОМЕРА КЛАСТЕРА НАЧАЛА ФАЙЛА ДЛЯ ЗАПУСКА
LD C,(HL)
INC HL
LD B,(HL) ;ЗАБРАЛИ СТРАШИЕ 16 БИТ НОМЕРА КЛАСТЕРА
LD E,5 ;ТЕПЕРЬ ИДЕМ ЗА МЛАДШИМИ 16 БИТАМИ НОМЕРА КЛАСТЕРА
ADD HL,DE
LD E,(HL)
INC HL
LD D,(HL) ;ТЕПЕРЬ BCDE=ПОЛНЫЙ 32-Х БИТНЫЙ НОМЕР КЛАСТЕРА
LD IXL,0
CALL COM_FAT ;УСТАНОВКА ВНУТРЕННИХ ПАРАМЕТРОВ FAT ДРАЙВЕРА
DB Load_file ;ДЛЯ ПОСЛЕДОВАТЕЛЬНОЙ ЗАГРУЗКИ
POP HL
LD DE,8
ADD HL,DE
LD A,(HL)
CP "$"
JP NZ,LOAD_IMAGE ;ПЕРЕХОД НА ЗАГРУЗКУ ОБРАЗА
CALL COM_DEV
DB Kol_vol ;ЗАПРОС У МЕНЕДЖЕРА УСТРОЙСТВ О ТЕКУЩЕМ УСТРОЙСТВЕ
LD A,D ;ВЗЯЛИ НОМЕР ТЕКУЩЕГО УСТРОЙСТВА
ADD A,A
ADD A,A
ADD A,A
LD C,A
LD B,0
ADD HL,BC
LD A,(HL) ;ВЗЯЛИ ТИП РАЗДЕЛА
SUB 4 ;ПРОПУСКАЕМ ДИСКОВОДЫ
EX AF,AF' ;НОМЕР ТЕКУЩЕГО УСТРОЙСТВА В "A"
INC HL
LD A,(HL) ;ВЗЯЛИ МЕСТОПОЛОЖЕНИЕ НОСИТЕЛЯ (MASTER/SLAVE)
EX AF,AF'
LD HL,0X5800
LD DE,0X5801
LD BC,0X02FF
LD (HL),L
LDIR ;ЗАЧЕРНИЛИ ЭКРАН ДЛЯ МАСКИРОВКИ ЗАПУСКАЛКИ
LD HL,ERORDRV
LD DE,0X4200
LD B,1
LDIR ;ПЕРЕНОС ПЕРЕМЕННЫХ ФАТА ДЛЯ MICROBOOT
PUSH DE ;СЮДА ПЕРЕНОС КОДА И ЗАПУСК
LD HL,MICROBOOT
LD BC,END_MICROBOOT-MICROBOOT
LDIR ;ПЕРЕНЕСЛИ ЗАПУСКАЛКУ
PUSH AF
LD HL,RUN_CODE
LD DE,0X5D3B
LD BC,ERUN_CODE-RUN_CODE
LDIR
CALL MEMSET ;ВЫСТАВИЛИ РЕЖИМ КОМПА
CALL FOR_RUN
POP AF
RET ;ЗАПУСК ЗАПУСКАЛКИ :)
;ЗАГРУЗКА FDI ОБРАЗА
LOAD_FDI LD A,PAGE_RAMDISK ;СТРАНИЦА НАЧАЛА РАМДИСКА
PUSH AF ;СОХРАНИЛИ НА СТЕКЕ
CALL SET4MBPAGE ;ВКЛЮЧИЛИ ЕЕ
LD HL,FDI_TABLE_CYL
LD DE,FDI_TABLE_CYL+1
LD BC,0X3FFF
LD (HL),0
LDIR ;ОЧИСТКА СТРАНИЦЫ С ОПИСАТЕЛЯМИ ДОРОЖЕК
LD IXH,0XFF
CALL LOAD1SECFDI ;ПРИНУДИТЕЛЬНАЯ ЗАГРУЗКА ПЕРВОГО СЕКТОРА
LD A,(0XC006) ;ВЗЯЛИ КОЛИЧЕСТВО СТОРОН
DEC A
LD A,(0XC004) ;ВЗЯЛИ КОИЧЕСТВО ДОРОЖЕК
JR Z,LOADFDI1
ADD A,A ;ЕСЛИ СТОРОН 2, ТО УМНОЖИЛИ КОЛИЧЕСТВО ДОРОЖЕК НА 2
LOADFDI1 LD C,A ;КОЛИЧЕСТВО ДОРОЖЕК
LD HL,(0XC00A)
; LD A,H
; SRL A
; ADC A,0
; LD H,A
; LD DE,(0XC008)
; AND A
; SBC HL,DE
LD (START_DATA),HL
LD DE,0X4000 ;АДРЕС БУФЕРА НАЧАЛА ОПИСАТЕЛЕЙ ДОРОЖЕК
LD HL,0XC00F ;АДРЕС НАЧАЛА ВЫБОРКИ ОПИСАТЕЛЕЙ ДОРОЖЕК В FDI ЗАГОЛОВКЕ
LOADFDI3 BIT 1,H
CALL NZ,LOAD1SECFDI ;ЕСЛИ ВЫШЛИ ЗА ПРЕДЕЛЫ СЕКТОРА МЕНЯЕМ УКАЗАТЕЛЬ И ГРУЗИМ СЛЕДУЮЩИЙ СЕКТОР В БУФЕР
LD A,(HL) ;БИТЫ 8-15 СМЕЩЕНИЯ ДОРОЖКИ ОТ НАЧАЛА
AND 0X3F ;ВЗЯЛИ ДЛЯ 8-13 БИТЫ-СМЕЩЕНИЕ В БЛОКАХ В СТРАНИЦЕ
LD (DE),A ;УЛОЖИЛИ СМЕЩЕНИЕ В БЛОКАХ В СТРАНИЦЕ
LD A,(HL) ;ВЗЯЛИ БИТЫ 14-15
INC HL ;СЛЕДУЮЩИЙ БАЙТ FDI ЗАГОЛОВКА
INC D ;ЗДЕСЬ ПОЛОЖИМ СМЕЩЕНИЕ В СТРАНИЦАХ ДО НУЖНОЙ ДОРОЖКИ
BIT 1,H
CALL NZ,LOAD1SECFDI ;ЕСЛИ ВЫШЛИ ЗА ПРЕДЕЛЫ СЕКТОРА МЕНЯЕМ УКАЗАТЕЛЬ И ГРУЗИМ СЛЕДУЮЩИЙ СЕКТОР В БУФЕР
LD B,A ;СОХРАНИЛИ НУЖНЫЕ 14-15 БИТЫ
LD A,(HL) ;ВЗЯЛИ 16-23 БИТЫ СМЕЩЕНИЯ ДОРОЖКИ ОТ НАЧАЛА
RL B
RLA
RL B
RLA
LD (DE),A ;УКЛАДКА БИТОВ СМЕЩЕНИЯ НОМЕРА СТРАНИЦЫ
INC D
REPT 4
INC HL
ENDM
BIT 1,H
CALL NZ,LOAD1SECFDI ;ЕСЛИ ВЫШЛИ ЗА ПРЕДЕЛЫ СЕКТОРА МЕНЯЕМ УКАЗАТЕЛЬ И ГРУЗИМ СЛЕДУЮЩИЙ СЕКТОР В БУФЕР
LD B,(HL) ;ВЗЯЛИ КОЛИЧЕСТВО СЕКТОРОВ НА ДОРОЖКЕ
LD A,B
AND A
JP Z,LOADFDI_ERR
INC HL
INC HL
LOADFDI4 INC HL
BIT 1,H
CALL NZ,LOAD1SECFDI ;ЕСЛИ ВЫШЛИ ЗА ПРЕДЕЛЫ СЕКТОРА МЕНЯЕМ УКАЗАТЕЛЬ И ГРУЗИМ СЛЕДУЮЩИЙ СЕКТОР В БУФЕР
LDI ;ПЕРЕНОС НОМЕРА СЕКТОРА
DEC DE
INC C
INC D
BIT 1,H
CALL NZ,LOAD1SECFDI ;ЕСЛИ ВЫШЛИ ЗА ПРЕДЕЛЫ СЕКТОРА МЕНЯЕМ УКАЗАТЕЛЬ И ГРУЗИМ СЛЕДУЮЩИЙ СЕКТОР В БУФЕР
LD A,(HL) ;ВЗЯЛИ РАЗМЕР СЕКТОРА
EX DE,HL
LD (HL),1
AND A
JR Z,LOADFDI2
LD (HL),2
DEC A
JR Z,LOADFDI2
LD (HL),4
DEC A
JR Z,LOADFDI2
LD (HL),8
LOADFDI2 EX DE,HL
INC D
REPT 5
INC HL
ENDM
DJNZ LOADFDI4 ;ВОЗВРАЩАЕМСЯ ДЛЯ ПРОДОЛЖЕНИЯ, ПОКА СЕКТОРА ДОРОЖКИ НЕ КОНЧАТСЯ
LD D,0X40
INC E
DEC C
JR NZ,LOADFDI3 ;ВОЗВРАЩАЕМСЯ ДЛЯ ПРОДОЛЖЕНИЯ ПОКА НЕ КОНЧАТСЯ ДОРОЖКИ
DEC HL
BIT 1,H
CALL NZ,LOAD1SECFDI ;ЕСЛИ ВЫШЛИ ЗА ПРЕДЕЛЫ СЕКТОРА МЕНЯЕМ УКАЗАТЕЛЬ И ГРУЗИМ СЛЕДУЮЩИЙ СЕКТОР В БУФЕР
PUSH HL
LD A,H
AND 1
LD B,A
LD C,L
LD A,IXH
ADD A,A
ADD A,B
LD B,A
LD HL,0
START_DATA EQU $-2
AND A
SBC HL,BC
EX DE,HL
POP HL
LD A,D
AND A
JR Z,LOADFDI7
LOADFDI8 INC H
BIT 1,H
CALL NZ,LOAD1SECFDI ;ЕСЛИ ВЫШЛИ ЗА ПРЕДЕЛЫ СЕКТОРА МЕНЯЕМ УКАЗАТЕЛЬ И ГРУЗИМ СЛЕДУЮЩИЙ СЕКТОР В БУФЕР
DEC D
JR NZ,LOADFDI8
LOADFDI7 ADD HL,DE
BIT 1,H
CALL NZ,LOAD1SECFDI ;ЕСЛИ ВЫШЛИ ЗА ПРЕДЕЛЫ СЕКТОРА МЕНЯЕМ УКАЗАТЕЛЬ И ГРУЗИМ СЛЕДУЮЩИЙ СЕКТОР В БУФЕР
PUSH HL ;СОХРАНИЛИ АДРЕС НА НАЧАЛО НАЧАЛА СЕКТОРОВ
LD DE,0XC000
AND A
SBC HL,DE
LD (OSTAT_SECT),HL ;СКОЛЬКО БАЙТ ПЕРЕНЕСТИ ИЗ ХВОСТА СЕКТОРА В БУФЕРЕ В НАЧАЛО СТРАНИЦЫ
LD B,H
LD C,L
LD HL,0X200
SBC HL,BC
LD (NACH_SECT),HL ;СКОЛЬКО БАЙТ ПЕРЕНЕСТИ ИЗ НАЧАЛА СЕКТОРА В БУФЕРЕ В КОНЕЦ СТРАНИЦЫ
POP HL ;ВОССТАНОВИЛИ СДРЕС НАЧАЛА СЕКТОРОВ, ДАЛЕЕ ЗАГРУЗКА ВСЕХ СЕКТОРОВ В ПАМЯТЬ
LOADFDI5 POP AF
INC A
CALL SET4MBPAGE
PUSH AF
BIT 1,H
CALL NZ,LOAD1SECFDI
EX AF,AF'
LD DE,0X4000
LD BC,0
NACH_SECT EQU $-2
LDIR
EX AF,AF'
JP C,ELOAD_IMAGE
EX DE,HL
LD IXL,0X1F
CALL COM_FAT
DB Load_file
JP C,ELOAD_IMAGE
PUSH HL
LD HL,0XC000
PUSH HL
LD IXL,1
CALL COM_FAT
DB Load_file
POP HL
POP DE
LD BC,0
OSTAT_SECT EQU $-2
LDIR
JR LOADFDI5
LOADFDI_ERR LD A,PAGE_RAMDISK
CALL SET4MBPAGE
LD HL,0X7FFF
LD (HL),0
DEC H
LD (HL),0
LD A,0XFA
CALL SET4MBPAGE
LD SP,(LD_FILE_SP)
POP IY
POP IX
JP LDFDI_ERROR
CREATE_RAMTABL PUSH IX
PUSH IY
LD (LD_FILE_SP),SP
LD SP,ADR_CAT
;СОЗДАНИЕ ТАБЛИЦЫ ОПИСАТЕЛЯ ДЛЯ ЗАГРУЖЕННЫХ TRD И SCL ОБРАЗОВ
END_LOAD_TRD LD A,PAGE_RAMDISK+1 ;НУЖНА СТРАНИЦА ОТКУДА НАЧИНАЕТСЯ ЗАГРУЖЕННЫЙ ОБРАЗ
CALL SET4MBPAGE
LD HL,(0X48E1) ;ПЕРВЫЙ СВОБОДНЫЙ ТРЕК СЕКТОР
LD A,L
LD L,H
LD H,0
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,HL
OR L
LD L,A ;КОЛИЧЕСТВО ЗАНЯТЫХ СЕКТОРОВ С ДИРЕКТОРИЕЙ
LD DE,(0X48E5) ;КОЛИЧЕСТВО СВОБОДНЫХ СЕКТОРОВ
ADD HL,DE
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,HL ;H=КОЛИЧЕСТВО ДОРОЖЕК
LD A,H
CP 0XA0
JR NC,ELT3
LD A,0XA0
ELT3 EX AF,AF'
LD A,PAGE_RAMDISK ;НУЖНА СТРАНИЦА НАЧАЛА РАМДИСКА, ГДЕ БУДЕТ ТАБЛИЦА ОПИСАТЕЛЕЙ
CALL SET4MBPAGE
LD HL,0X4000
PUSH HL
LD DE,0X4001
LD BC,0X3FFF
LD (HL),L
LDIR ;ОЧИСТИЛИ СТРАНИЦУ
POP DE ;АДРЕС НАЧАЛА
LD HL,0 ;СМЕЩЕНИЕ В БЛОКАХ И СТРАНИЦАХ
EX AF,AF'
ELT2 EX AF,AF'
LD BC,0X1000 ;СЧЕТЧИК НОМЕРОВ СЕКТОРОВ И ИХ НОМЕРА
LD A,L
RRCA
RRCA
LD (DE),A ;СМЕЩЕНИЕ В БЛОКАХ ДОРОЖКИ В СТРАНИЦЕ
INC D
LD A,H
LD (DE),A ;СМЕЩЕНИЕ В СТРАНИЦАХ ДО ДОРОЖКИ
INC D
ELT1 INC C
LD A,C
LD (DE),A ;НОМЕР СЕКТОРА
INC D
LD A,2
LD (DE),A ;РАЗМЕР СЕКТОРА
INC D
DJNZ ELT1 ;ВНОСИМ В ТАБЛИЦУ ВСЕ НОМЕРА СЕКТОРОВ С РАЗМЕРАМИ
LD D,0X40 ;ВЕРНУЛИ УКАЗАТЕЛЬ В НАЧАЛО
INC E ;ДЛЯ СЛЕДУЮЩЕЙ ДОРОЖКИ
LD BC,0X40
ADD HL,BC ;ПЕРЕХОД К СЛЕДУЮЩЕЙ ДОРОЖКЕ
EX AF,AF'
DEC A
JR NZ,ELT2 ;ПОВТОРЯЕМ ДЛЯ ВСЕХ ДОРОЖЕК
;ОБЩИЙ ВЫХОД ИЗ ЗАГРУЗКИ С ВОЗВРАТОМ СТАНДАРТНОЙ СТРАНИЦЫ В ОКНЕ ПРОЕЦИРОВАНИЯ 1
ELOAD_IMAGE LD A,PAGE_RAMDISK
CALL SET4MBPAGE
LD HL,0X7FFF
LD (HL),"R"
DEC H
LD (HL),"D"
LD A,0XFA
CALL SET4MBPAGE
LD SP,0
LD_FILE_SP EQU $-2
POP IY
POP IX
RET
;ЗАГРУЗКА СЛЕДУЮЩЕГО СЕКТОРА ЗАГОЛОВКА FDI
LOAD1SECFDI PUSH HL
PUSH BC
PUSH DE
PUSH AF
LD HL,0XC000
LD IXL,1
CALL COM_FAT
DB Load_file
INC IXH
POP AF
POP DE
POP BC
POP HL
RES 1,H
RET
;ВКЛЮЧЕНИЕ В 1 ОКНО ПРОЕЦИРОВАНИЯ ЗАДАННОЙ СТРАНИЦЫ
SET4MBPAGE PUSH BC
LD B,A
PEC_ON SHADOW_BF
; LD A,1
; OUT (PEVO_CONF),A
LD A,B
LD BC,WIN_P5
OUT (C),A
LD B,A
PEC_OFF SHADOW_BF
; XOR A
; OUT (PEVO_CONF),A
LD A,B
POP BC
RET
LOAD_IMAGE DI
CP "R"
LD HL,FLASHER
JR Z,LOAD_IMAGE8
LD HL,RESTART
LOAD_IMAGE8 PUSH HL
PUSH IX
PUSH IY
LD (LD_FILE_SP),SP
LD SP,ADR_CAT
CP "S" ;ЭТО SCL ФАЙЛ?
JR Z,LOAD_IMAGE2
CP "F" ;ЭТО FDI ФАЙЛ?
JP Z,LOAD_FDI
CP "T" ;ЭТО TRD ФАЙЛ?
JR NZ,LOAD_ROM
LD A,PAGE_RAMDISK+1
;ЗАГРУЗКА TRD ОБРАЗА
LOAD_IMAGE1 PUSH AF
CALL SET4MBPAGE
LD HL,0X4000
LD IXL,0X20
CALL COM_FAT
DB Load_file
JP C,END_LOAD_TRD;ELOAD_IMAGE
POP AF
INC A
JR LOAD_IMAGE1
LOAD_ROM CP "R" ;ЭТО ROM ФАЙЛ?
JP NZ,ELOAD_IMAGE
LD A,PAGE4FLASHER
JR LOAD_IMAGE1
;ЗАГРУЗКА SCL ОБРАЗА
LOAD_IMAGE2 LD HL,DSKINFO
LD DE,ADR_CAT+0XF00
LD BC,DSK_END-DSKINFO
LDIR ;СОХРАНЕНИЕ ИНФЫ ДЛЯ СОЗДАНИЯ ЗАГОЛОВКА ДИСКЕТЫ
LD A,PAGE_RAMDISK+1
LOAD_IMAGE4 PUSH AF
CALL SET4MBPAGE ;ВКЛЮЧИЛИ ПЕРВУЮ СТРАНИЦУ ОТКУДА РАМДИСК НАЧИНАЕТСЯ
LD HL,0X5000
LD IXL,0X18
CALL COM_FAT ;ЗАГРУЗИЛИ ПЕРВЫЕ 0X18 СЕКТОРОВ SCL ОБРАЗА
DB Load_file
PUSH AF ;СОХРАНИЛИ ФЛАГ ОКОНЧАНИЯ ЗАГРУЗКИ НА СЛУЧАЙ ОКОНЧАНИЯ ОБРАЗА
LD HL,0X4000
PUSH HL ;СОХРАНИЛИ АДРЕС НАЧАЛА КАТАЛОГА
LD (HL),L
LD D,H
LD E,L
INC DE
LD BC,0XFFF
LDIR ;ЗАЧИСТКА ОБЛАСТИ ПЕРВОЙ ДОРОЖКИ ДЛЯ ФОРМИРОВАНИЯ КАТАЛОГА ДИСКА
LD HL,0X5008 ;АДРЕС КОЛИЧЕСТВА ФАЙЛОВ В SCL ОБРАЗЕ
LD A,(HL) ;ВЗЯЛИ КОЛИЧЕСТВО ФАЙЛОВ КАК СЧЕТЧИК
INC HL ;ПЕРЕШЛИ НА ПЕРВЫЙ ОПИСАТЕЛЬ ФАЙЛА
EXX
LD HL,0 ;НОМЕР АБСОЛЮТНОГО СЕКТОРА
LD D,L ;ПРИРАЩЕНИЕ СЕКТОРОВ НЕ МОЖЕТ БЫТЬ БОЛЕЕ 255 СЕКТОРОВ
LD B,A ;СОХРАНЕНИЕ КОЛИЧЕСТВА ФАЙЛОВ
EXX
POP DE ;ВЕРНУЛИ АДРЕС НАЧАЛА КАТАЛОГА ДИСКА
LOAD_IMAGE3 EX AF,AF'
LD BC,0X0D
LDIR ;ПЕРЕНЕСЛИ 13 БАЙТ ТЕЛА ОПИСАТЕЛЯ
LD A,(HL) ;ЗАБРАЛИ РАЗМЕР ФАЙЛА В СЕКТОРАХ
LDI ;ПЕРЕНЕСЛИ ЕЩЕ БАЙТ
EXX
LD E,A
PUSH HL ;СОХРАНИЛИ ТЕКЩЕЕ ЗНАЧЕНИЕ НОМЕРА СЕКТОРА
ADD HL,DE ;УВЕЛИЧИЛИ ТЕКЩЕЕ ЗНАЧЕНИЕ НА РАЗМЕР ФАЙЛА В СЕКТОРАХ
EXX
EX (SP),HL
LD A,L
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,HL
INC H
AND 0X0F
LD L,A
EX (SP),HL
POP BC ;ВОССТАНОВИЛИ ТЕКЩИЙ НОМЕР СЕКТОРА
EX DE,HL
LD (HL),C
INC HL
LD (HL),B ;УЛОЖИЛИ ПОСЛЕ ТЕКУЩЕГО ОПИСАТЕЛЯ
INC HL
EX DE,HL
EX AF,AF'
DEC A
JR NZ,LOAD_IMAGE3 ;ЕСЛИ ФАЙЛЫ НЕ КОНЧИЛИСЬ ПРОДОЛЖАЕМ
PUSH HL ;СОХРАНИЛИ АДРЕС НАЧАЛА ДАННЫХ
LD HL,ADR_CAT+0XF00
LD DE,0X48E1
LD BC,DSK_END-DSKINFO
LDIR
EXX
LD DE,2544 ;СТАНДАРТНЫЙ РАЗМЕР ДИСКЕТЫ
EX DE,HL
AND A
SBC HL,DE
LD (0X48E5),HL ;КОЛИЧЕСТВО СВОБОДНЫХ СЕКТОРОВ
EX DE,HL
LD A,L
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,HL
INC H
AND 0X0F
LD L,A
LD (0X48E1),HL ;ПЕРВЫЙ СВОБОДНЫЙ ТРЕК И СЕКТОР
LD A,B
LD (0X48E4),A ;КОЛИЧЕСТВО ФАЙЛОВ НА ДИСКЕ
EXX
POP DE ;ВОССТАНОВЛЕНИЕ АДРЕСА НАЧАЛА ДАННЫХ
LD HL,0X8000 ;КОНЕЦ ОКНА ПРОЕЦИРОВАНИЯ
AND A
SBC HL,DE ;ПОЛУЧИЛИ КОЛИЧЕСТВО БАЙТ ДЛЯ СДВИГА
LD B,H
LD C,L
LD HL,0X5000 ;НАЧАЛО ДАННЫХ НА РАМДИСКЕ
EX DE,HL
LDIR ;СДВИНУЛИ, ПОСЛЕ ПЕРЕНОСА DE=АДРЕС КУДА ДАЛЕЕ ГРУЗИТЬ
LD A,D
CP 0X7E
JR NC,LOAD_IMAGE7
EX DE,HL
SRL A
LD IXL,A
CALL COM_FAT
DB Load_file
LD DE,0X8000
EX DE,HL
LOAD_IMAGE7 AND A
SBC HL,DE ;ПОЛУЧИЛИ СКОЛЬКО БАЙТ ОСТАЛОСЬ ДО КОНЦА ОКНА
LD (OST_HWOST),HL
LD (KUDA_HWOST),DE
LD DE,0
EX DE,HL
SBC HL,DE
LD A,1
AND H
LD H,A
LD (NEXT4PAGE),HL
POP AF ;ВОССТАНОВИЛИ ФЛАГ ПОСЛЕДНЕЙ ЗАГРУЗКИ
JP C,END_LOAD_TRD;ELOAD_IMAGE ;ЕСЛИ ФАЙЛ УЖЕ КОНЧИЛСЯ, ТО ВЫХОД
JR LOAD_IMAGE5
LOAD_IMAGE6 LD DE,0X4000
LD BC,0
NEXT4PAGE EQU $-2
LDIR
EX AF,AF'
JP C,END_LOAD_TRD;ELOAD_IMAGE
EX DE,HL
LD IXL,0X1F
CALL COM_FAT
DB Load_file
JP C,END_LOAD_TRD;ELOAD_IMAGE
LOAD_IMAGE5 LD HL,ADR_CAT
PUSH HL
LD IXL,1
CALL COM_FAT
DB Load_file
EX AF,AF' ;СПРЯТАЛИ ФЛАГ ЗАГРУЗКИ СЕКТОРА
POP HL ;ВОССТАНОВИЛИ АДРЕС КУДА СЕКТОР В БУФЕР ЗАГРУЗИЛИ
LD DE,0
KUDA_HWOST EQU $-2 ;КУДА ЛОЖИТ ОСТАТОК В ОКНЕ
LD BC,0
OST_HWOST EQU $-2 ;СКОЛЬКО ПЕРЕНОСИТЬ В КОНЕЦ СТРАНИЦЫ
LDIR
POP AF
INC A
PUSH AF
CALL SET4MBPAGE
JR LOAD_IMAGE6
;ПРОВЕРКА ЗАГОЛОВКА HOBETA ФАЙЛА
;НА ВЫХОДЕ: ФЛАГ С=1-НЕ СООТВЕСТВУЕТ
CMP4HOBETA SUB 1
RET NZ
LD A,(BUF_512+8)
CP "C" ;ПРОВЕРКА ЧТО ЭТО КОДОВЫЙ БЛОК, А НЕ ЧТО-ТО ДРУГОЕ
SCF
RET NZ
PUSH DE ;СОХРАНИЛИ АДРЕС СКЛАДИРОВАНИЯ ДЛЯ ДАЛЬНЕЙШЕЙ ПРОВЕРКИ
LD B,H
LD C,L ;ВОЗВРАЩАЕМСЯ В НАЧАЛО СЕКТОРА
CALL HOB_CRC ;СЧИТАЕМ CRC HOBETA ЗАГОЛОВКА
LD A,(BC)
INC BC
LD E,A
LD A,(BC)
LD D,A ;В "DE" РАССЧИТАННОЕ CRC ХОБЕТА ЗАГОЛОВКА
AND A ;В "HL" ВЗЯТОЕ ИЗ СМЕЩЕНИЯ +0X0F ОТ НАЧАЛА ФАЙЛА
SBC HL,DE ;СРАВНИВАЕМ
POP DE ;ЕСЛИ НЕ СОВПАЛО ТО ВОЗМОЖНО ЭТО НЕ ХОБЕТА
SCF
RET NZ ;ПРОПУСКАЕМ ФАЙЛ
EXX
LD HL,(BUF_512+9) ;ВЗЯЛИ АДРЕС ЗАГРУЗКИ
DEC HL ;ДЛЯ ЗАГРУЗКИ МАСИМУМ 40960 БАЙТ (160 СЕКТОРОВ)
LD DE,(BUF_512+0X0B) ;ВЗЯЛИ ДЛИНУ КОДОВОГО БЛОКА
ADD HL,DE ;ПРОВЕРЯЕМ ВЫХОД ЗА ПРЕДЕЛЫ ОЗУ
EXX ;ЕСЛИ ВЫЛЕТ ЗА ПРЕДЕЛ ОЗУ
RET C ;ПРОПУСКАЕМ ФАЙЛ
EXX
LD HL,(BUF_512+9)
LD DE,0X6000 ;ПРОВЕРЯЕМ АДРЕС ЗАГРУЗКИ
AND A ;АДРЕС ЗАГРУЗКИ НЕ ДОЛЖЕН БЫТЬ НИЖЕ 0X6000
SBC HL,DE
EXX ;ЕСЛИ АДРЕС ЗАГРУЗКИ НИЖЕ 0X6000
RET
;НА ВХОДЕ: BC-АДРЕС ЗАГОЛОВКА
;НА ВЫХОДЕ: HL-HOBETA CRC
HOB_CRC LD A,0X0F
LD HL,0
EXX
LD E,0
EXX
HOBCRC1 EX AF,AF'
LD A,(BC)
LD E,A
LD D,A
ADD HL,DE
EXX
LD A,E
INC E
EXX
LD E,A
LD D,0
ADD HL,DE
EX AF,AF'
INC BC
DEC A
JR NZ,HOBCRC1
RET
CMP4ROMS EXX
LD A,B
OR D
OR E
JR NZ,CMP4IMAGE2
LD A,C
CP 8
JR NZ,CMP4IMAGE2
EXX
CMP4ROMS1 AND A
RET
CMP4IMAGE2 EXX
SCF
RET
CMP4FDI PUSH HL
EXX
POP HL
LD A,(HL)
CP "F"
JR NZ,CMP4IMAGE2
INC HL
LD A,(HL)
CP "D"
JR NZ,CMP4IMAGE2
INC HL
LD A,(HL)
CP "I"
JR NZ,CMP4IMAGE2
INC HL
INC HL
LD A,(HL) ;КОЛИЧЕСТВО ЦИЛИНДРОВ
CP 0X57
JR NC,CMP4IMAGE2
INC HL
LD A,(HL) ;ДОЛЖЕН БЫТЬ 0
AND A
JR NZ,CMP4IMAGE2
INC HL
LD A,(HL) ;КОЛИЧЕСТВО СТОРОН
AND A
JR Z,CMP4IMAGE2
CP 3
JR NC,CMP4IMAGE2
INC HL
LD A,(HL) ;ДОЛЖНО БЫТЬ 0
AND A
JR NZ,CMP4IMAGE2
EXX
AND A
RET
CMP4IMAGE CP 3
JR Z,CMP4FDI
SUB 1
RET Z ;ДЛЯ TRD ПРОВЕРКА НЕ НУЖКА
;ДЛЯ SCL ПРОВЕРКА НАЛИЧИЯ СЛОВА "SINCLAIR" В ПЕРВЫХ 8 БАЙТАХ
PUSH HL
EXX
POP HL
LD DE,SIGN_SCL
LD B,8
CMP4IMAGE1 LD A,(DE)
CP (HL)
JR NZ,CMP4IMAGE2
INC DE
INC HL
DJNZ CMP4IMAGE1
EXX
AND A
RET
SEARCH_FILE LD DE,ADR_CAT ;АДРЕС КУДА СКЛАДИРОВАТЬ НОМЕРА НАЙДЕННОГО
LD HL,0 ;ГДЕ СПИСОК РАСШИРЕНИЙ ДЛЯ ПОИСКА
GDE_EXT_FILES EQU $-2
CALL COM_FAT
DB Find_file ;ПОИСК ФАЙЛОВ ПО ЗАДАННОМУ РАСШИРЕНИЮ
RET Z
JR SEARCHF2
SEARCHF1 CALL COM_FAT
DB Next_find
RET Z
SEARCHF2 CALL 0
CMP_FOUNDED EQU $-2
RLA
AND 1
JR SEARCHF1
;ПРОШИВАТЕЛЬ ПЗУ И ИНДИКАЦИЕЙ ПРОЦЕССА
FLASHER LD IX,ERASE_ROM
CALL WINW
LD (FLASH_SP),SP
LD SP,ADR_CAT
PEC_ON SHADOW_BF+FLASH_BF
; LD A,3
; OUT (PEVO_CONF),A
LD A,3
CALL SETWIN_INDICAT
LD E,0
LD HL,0
FLASHER4 CALL ERASE_BLK
LD A,0XFA
EX AF,AF'
CALL INC_INDICAT
INC E
BIT 3,E
JR Z,FLASHER4
LD A,0XFF
LD BC,WIN_P3;0XF7F7
OUT (C),A
LD IX,UPDATE_WIN
CALL WINW
LD A,PAGE4FLASHER
LD E,0
FLASHER3 LD HL,0
PUSH AF
LD A,0XFA
LD BC,WIN_P5;0X77F7
OUT (C),A
LD A,E
ADD A,2
CALL SETWIN_INDICAT
POP AF
FLASHER2 PUSH AF
LD BC,WIN_P5;0X77F7
OUT (C),A
EX AF,AF'
PUSH IX
LD IX,0X4000
FLASHER1 LD A,(IX)
CALL PGM_BYTE
INC IX
INC HL
LD A,H
AND 0X0F
OR L
CALL Z,INC_INDICAT
LD A,IXH
AND 0X80
JR Z,FLASHER1
POP IX
POP AF
INC A
LD D,A
LD A,H
AND A
LD A,D
JR NZ,FLASHER2
INC E
BIT 3,E
JR Z,FLASHER3
EFLASHER LD A,0XFA
LD BC,WIN_P5;0X77F7
OUT (C),A
LD BC,WIN_A3;0XFFF7
LD A,0XFF
OUT (C),A
PEC_OFF SHADOW_BF+FLASH_BF
; XOR A
; OUT (PEVO_CONF),A
LD SP,0
FLASH_SP EQU $-2
JP RESTART