; Работа с системными и boot-файлами; ; Функция сравнения портов окон Биоса и используемых программой; ; ;--- Копирование сист. файлов в буферы ; вых: "CY" при ошибке ; CopySysFiles: xor a ld (sFlag),a ld (bigFile),a ld a,(ColDialWn) ; сохр. цвет окна ld (TmpColor),a ; Номер загрузочного диска ld bc,0009h RST ToDSS ld (SysDisk),a ; Установить текущим загрузочный диск ld a,(SysDisk) ld c,1 RST ToDSS ; Установить "корень" boot-диска ld hl,RootDir ld c,1Dh RST ToDSS ;Найти файл "SYSTEM.EXE" ;ld hl,Name1 ;call FirstFile ;jp c,NoFound ; файл не найден ; открыть файл ld hl,Name1 call OpenFile jp c,error1 ; ошибка открытия файла ld (hFile1),a ; прочитать файл in a,(Page3) push af ld a,(hPages.SBuff0) out (Page3),a ; подкл. буфер ld a,(hFile1) call ReadFile jp c,err1 ; ошибка чтения файла pop af out (Page3),a ; восст. страницу ld (Number1),de ; число прочитанных байт ; закрыть файл ld a,(hFile1) call CloseFile jp c,error1 ; ошибка закрытия файла ;Найти файл "SYSTEM.DOS" ;ld hl,Name2 ;call FirstFile ;jp c,error1 ; файл не найден ; открыть файл ld hl,Name2 call OpenFile jp c,error1 ; ошибка открытия файла ld (hFile2),a ; узнать размер файла ld hl,0 ld ix,0 ; мл.слово ld bc,0215h ; указатель от конца файла RST ToDSS jp c,error1 push ix pop hl ld de,4001h ; hl >= de ld a,l sub e ld l,a ld a,h sbc a,d ld h,a inc hl ld (ost+1),hl ; сохр. размер остатка файла jr c,tinRead ; файл < 1-й страницы ld a,1 ld (bigFile),a ; файл > 1-й страницы tinRead: ld (Number2),ix ; сохр. размер файла ; указатель на начало файла ld hl,0 ld ix,0 ; мл.слово ld a,(hFile2) ld bc,0015h ; указатель от начала файла RST ToDSS jp c,error1 ; прочитать файл in a,(Page3) push af ld a,(hPages.SBuff1) out (Page3),a ; подкл. 1-ю страницу ld a,(hFile2) call ReadFile jp c,err1 ; ошибка чтения файла ld a,(bigFile) or a jr z,endRead ; прочитан весь файл ; читаем остаток файла ost: ld de,0 ld a,(hPages.SBuff2) out (Page3),a ; подкл. 2-ю страницу ld hl,WinBoxBuff ; буфер под данные ld a,(hFile2) ld c,13h RST ToDSS jp c,err1 ; ошибка чтения файла endRead: pop af out (Page3),a ; восст. страницу ; закрыть файл ld a,(hFile2) call CloseFile jp c,error1 ; ошибка закрытия файла ret ; флаг, 0/1 - отработать/нет функции WriteSysFiles sFlag: db 0 ; флаг, 0/1 - отработать/нет функции записи trd-boot`а sFlag1: db 0 ; флаг, 0/1 - "system.dos" меньше/больше 1-й страницы bigFile: db 0 ;--- Запись сист. файлов на дискету ; вых: "CY" при ошибке ; WriteSysFiles: ld a,(sFlag) or a ret nz ; Открыть окно ld a,(ColDialWn) ; сохр. цвет окна ld (TmpColor),a ld a,10h ; цвет вывод. окна ld (ColDialWn),a ld hl,SysWrite ; "Writing system files..." call PutDialWn ; скрыть мышку call HiddenMouse ; Уст. текущий диск и путь на дискету call SetDisketa ; Создать файл "SYSTEM.EXE" ld hl,Name1 ; имя файла call CreateFile jp c,error1 ; ошибка создания файла ld (hFile1),a ; записать файл in a,(Page3) push af ld a,(hPages.SBuff0) out (Page3),a ; подкл. буфер ld de,(Number1) ; число запис. байт ld a,(hFile1) ; хэндл call WriteFile ex af,af' pop af out (Page3),a ; восст. страницу ex af,af' jr c,error1 ; ошибка записи файла ; закрыть файл ld a,(hFile1) ; хэндл call CloseFile jr c,error1 ; ошибка закрытия файла ; Создать файл "SYSTEM.DOS" ld hl,Name2 ; имя файла call CreateFile jr c,error1 ; ошибка создания файла ld (hFile2),a ; записать файл in a,(Page3) push af ld a,(hPages.SBuff1) out (Page3),a ; подкл. 1-ю страницу ld de,(Number2) ; размер "system.dos" ld hl,4000h ; 1-на страница ld a,(bigFile) or a jr z,tinFile ; файл <= 1-й страницы ex de,hl sbc hl,de push hl ld a,(hFile2) ; хэндл call WriteFile pop de jr c,err1 ; ошибка записи файла ld a,(hPages.SBuff2) out (Page3),a ; подкл. 2-ю страницу ; tinFile: ld a,(hFile2) ; хэндл call WriteFile jr c,err1 ; ошибка записи файла pop af out (Page3),a ; восст. страницу ; закрыть файл ld a,(hFile2) ; хэндл call CloseFile jr c,error1 ; ошибка закрытия файла ; восст. диск и путь call RestPath ; закрыть окно "Запись сист. файлов" call ClsDial ; открыть окно "System files transfered" ld hl,SysCopy call PutDialWn ; скрыть мышку call HiddenMouse ; задержка в 2 секунды ei ld b,2 ; секунды 1: ld a,49 ; 1/50 секунды 2: halt dec a jr nz,2B djnz 1B ; закрыть окно call ClsDial ld a,(TmpColor) ld (ColDialWn),a ; восст. прежнюю установку цвета окна ret ; err1: pop af out (Page3),a ; восст. страницу ; error1: call RestPath ; восст. диск и путь ld a,40h ld (ColDialWn),a ld hl,ErrSysFiles call DialogW ld a,(TmpColor) ld (ColDialWn),a ld a,1 ld (sFlag),a ret SetDisketa: ; Уст. текущий диск на формат. дискету ld a,(DISK) ld c,1 RST ToDSS ; Уст. "корень" дискеты ld hl,RootDir ld c,1Dh RST ToDSS ret RestPath: ; Восст. текущий диск ; ld a,(CurDisk) ; ld c,Dss.ChDisk ; RST ToDSS ; Восст. тек. путь ld hl,CurPath ld c,Dss.ChDir RST ToDSS ret ; Найти файл FirstFile: ld bc,0019h ; имя в формате 11 байт ld de,BuffName ; 44 байта буфера ld a,20h ; атрибут "архивный" RST ToDSS ret ; Создать файл CreateFile: ld c,0Ah ld a,20h ; атрибут "архивный" RST ToDSS ret ; Открыть файл OpenFile: ld c,11h ld a,1 ; на чтение RST ToDSS ret ; Прочитать файл ReadFile: ld hl,WinBoxBuff ;L4000 буфер под данные ld de,4000h ; число читаемых байт (1 страница) ld c,13h RST ToDSS ret ; Запись файла WriteFile: ld hl,WinBoxBuff ;L4000 буфер данных ld c,14h RST ToDSS ret ; Закрыть файл CloseFile: ld c,12h RST ToDSS ret SysDisk: db 0 ; номер загр. диска Name1: db "SYSTEM.EXE",0 Name2: db "SYSTEM.DOS",0 ;Name2: db "DIAL.TXT",0 hFile1: db 0 ; хэндл файла "system.exe" hFile2: db 0 ; хэндл файла "system.dos" Number1: dw 0 ; размер файла "system.exe" Number2: dw 0 ; размер файла "system.dos" RootDir: db '\',0 ; ; CurPath: CurDisk: db 0,':\' ; сохр. тек. диск ; TmpColor: db 0 ; врем. сохр. цвета окна ; файл настроек программы IniName: db "FFORMAT.INI",0 hFile3: db 0 ; дескриптор файла ;Number3:dw 0 ; размер файла "fformat.ini" TrdName: db "BOOT.$B",0 ; имя trd-boot файла hFile4: db 0 ; дескриптор файла ;[]===============================================[] /* ; Определение текущей конфигурации ; портов и включенных страниц ОЗУ compare_page: ld c,0C6h ;получить конф. портов ld a,1 ;параметры 1-го окна RST ToBIOS ld a,c ;вот здесь идет сpавнение считанного cp Page1 ;номеpа поpта с тем, котоpый я юзаю jr z,.loc1 ; уст. новый номер Page1 ld (port1+1),a ld (port2+1),a ld (port3+1),a ld (port4+1),a .loc1: ld c,0C6h ld a,3 ;параметры 3-го окна RST ToBIOS ld a,c cp Page3 ret z ; уст. новый номер Page3 ld (port5+1),a ld (port6+1),a ld (port7+1),a ld (port8+1),a ld (port9+1),a ld (port10+1),a ld (port11+1),a ld (port12+1),a ld (port13+1),a ld (port14+1),a ld (port15+1),a ld (port16+1),a ld (L091B+1),a ld (port18+1),a ld (port19+1),a ld (L0BAA+1),a ld (port21+1),a ld (port22+1),a ld (L0B21+1),a ld (port24+1),a ld (port25+1),a ld (port26+1),a ld (port27+1),a ld (port28+1),a ld (port29+1),a ld (PushBut+1),a ld (port31+1),a ld (port32+1),a ld (port33+1),a ld (port34+1),a ld (port35+1),a ld (port36+1),a ld (port37+1),a ld (port38+1),a ld (port39+1),a ld (port40+1),a ld (port41+1),a ld (port42+1),a ld (port43+1),a ld (port44+1),a ld (port45+1),a ld (port46+1),a ld (port47+1),a ld (port48+1),a ld (port49+1),a ld (port50+1),a ld (port51+1),a ld (port52+1),a ld (port53+1),a ld (port54+1),a ld (port55+1),a ld (port56+1),a ld (port57+1),a ld (port58+1),a ld (port59+1),a ld (port60+1),a ld (port61+1),a ld (port62+1),a ld (ChangeR+1),a ld (port64+1),a ld (port65+1),a ; ld (port69+1),a ld (port70+1),a ld (port71+1),a ld (port73+1),a ; ld (port74+1),a ld (port75+1),a ld (port76+1),a ; ld (port77+1),a ld (port78+1),a ret */ ;[]===============================================[] ; Чтение файла настроек (поиск в тек. каталоге) ; Читаются 2 байта в буфер BuffName ; При ошибках - просто выход ReadInit: ; найти файл "form.ini" ld hl,IniName call FirstFile ret c ; файл не найден ; открыть файл ld hl,IniName ld c,11h ld a,1 ; на чтение RST ToDSS ret c ; ошибка открытия ld (hFile3),a ; прочитать файл ld a,(hFile3) ld hl,BuffName ; буфер под данные ld de,2 ; число читаемых байт ld c,13h RST ToDSS ;ld (Number3),de ; число прочитанных байт ; закрыть файл ld a,(hFile3) call CloseFile jp SetParam ; настроить 2 ячейки опций дисков ; Запись в файл настроек ; При ошибке создания - просто выход SaveInit: ; восст. начальный диск и каталог ; ld a,(CurDisk) ; ld c,1 ; RST ToDSS ; ld hl,CurDir ; ld c,Dss.ChDir ; RST ToDSS ld hl,CurPath ld c,Dss.ChDir RST ToDSS ; call GetParam ; настроить буфер для записи ; создать файл (сущест. урезает до нуля) ld hl,IniName ; "form.ini" ld c,0Ah ld a,20h ; атрибут "архивный" RST ToDSS ret c ; ошибка создания файла ld (hFile3),a ; сохр. хэндл ; запись файла ld hl,BuffName ; буфер данных ld de,2 ; число запис. байт ld c,14h RST ToDSS ; закрыть файл ld a,(hFile3) jp CloseFile ; Настроить буфер для записи "form.ini" GetParam: ld hl,DriveA call .loc1 ld hl,BuffName ld (hl),a ; для диска "A:" ; ld hl,DriveB call .loc1 ld hl,BuffName+1 ld (hl),a ; для диска "B:" ret ; .loc1: xor a ld b,3 ; 3 ячейки ld c,a ; счетчик .loc2: cp (hl) jr nz,.loc3 inc hl inc c djnz .loc2 .loc3: ld a,c and 3 ret ; Настроить 2 ячейки RadioCheck-а опций дисков SetParam: ; обнулить 6 ячеек опций дисков A/B ld hl,DriveA ld b,6 xor a .loc1: ld (hl),a inc hl djnz .loc1 ; ld hl,DriveA ld de,BuffName ; диск "A:" ld a,(de) ld c,a add hl,bc ld (hl),1 ; отметить "RadioCheck" диска "A:" ; inc de ; на байт диска "B:" ld hl,DriveB ld a,(de) ld c,a add hl,bc ld (hl),1 ; отметить "RadioCheck" диска "B:" ret ; Копирование trd-загрузчика из внешнего файла. ; При ошибках работы с файлом - просто выход из п/программы. CopyBootTRD: xor a ld (sFlag1),a ; найти файл "boot.$b" ld hl,TrdName call FirstFile jr c,trd_err ; файл не найден ; открыть файл ld hl,TrdName call OpenFile jr c,trd_err ; ошибка открытия ld (hFile4),a ; прочитать файл in a,(Page3) push af ld a,(hPages.TRBoot) out (Page3),a ; подкл. буфер ; читаем заголовок бута ld hl,NameBt ; буфер под данные ld de,17 ; число читаемых байт ld a,(hFile4) ld c,13h RST ToDSS ; читаем тело бута ld e,0 ld a,(NameBt+14) ; узнать размер бута ld d,a cp 40h jr c,.loc1 ld d,40h .loc1: ld (SizeBt+1),de ; сохр. размер бута ld hl,L4000 ; 0C000h буфер под бут ld a,(hFile4) ld c,13h RST ToDSS pop af out (Page3),a ; восст. страницу ; закрыть файл ld a,(hFile4) jp CloseFile ; trd_err: ld a,1 ld (sFlag1),a ret