; Работа с системными и 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,(SLOT3) ; push af ; ld a,(hPages.SBuff0) ; out (SLOT3),a ; подкл. буфер ; ld a,(hFile1) ; call ReadFile ; jp c,err1 ; ошибка чтения файла ; pop af ; out (SLOT3),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,(SLOT3) ; push af ; ld a,(hPages.SBuff1) ; out (SLOT3),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 (SLOT3),a ; подкл. 2-ю страницу ; ld hl,WinBoxBuff ; буфер под данные ; ld a,(hFile2) ; ld c,13h ; RST ToDSS ; jp c,err1 ; ошибка чтения файла ; endRead: pop af ; out (SLOT3),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,(SLOT3) ;push af ;ld a,(hPages.SBuff0) ;out (SLOT3),a ; подкл. буфер ;ld de,(Number1) ; число запис. байт ;ld a,(hFile1) ; хэндл ;call WriteFile ;ex af,af' ;pop af ;out (SLOT3),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,(SLOT3) ;push af ;ld a,(hPages.SBuff1) ;out (SLOT3),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 (SLOT3),a ; подкл. 2-ю страницу ; ; tinFile: ld a,(hFile2) ; хэндл ; call WriteFile ; jr c,err1 ; ошибка записи файла ; pop af ; out (SLOT3),a ; восст. страницу ; ; закрыть файл ; ld a,(hFile2) ; хэндл ; call CloseFile ; jr c,error1 ; ошибка закрытия файла ; ; ; запись загрузчика через sys ld hl,.sys_name ld a,(DskName) ld (.sys_prm_disk),a ld bc,Dss.Exec rst ToDSS ; jr c,.error1 and a jr nz,.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 (SLOT3),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 .sys_name: db "SYS.EXE " .sys_prm_disk: dz "A: 1" ; 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 ; ; 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 SLOT1 ;номеpа поpта с тем, котоpый я юзаю jr z,.loc1 ; уст. новый номер SLOT1 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 SLOT3 ret z ; уст. новый номер SLOT3 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,(SLOT3) push af ld a,(hPages.TRBoot) out (SLOT3),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 (SLOT3),a ; восст. страницу ; закрыть файл ld a,(hFile4) jp CloseFile ; trd_err: ld a,1 ld (sFlag1),a ret