; Вывод карты диска, с выделением цветом bad-сторон ; вх: тек.дорожка ; тек.сторона ; флаг bad-вывода ; Map: ld a,(tracks) cp 83+1 ; запред. дорожка ret nc ld de,(cursor) ; Y/X полож. курсора ld hl,count ; счетчик dec (hl) jr nz,.loc1 ld (hl),4 ; сбросить счетчик "до инкремента X полож." inc de ; ++E, X полож. ld (cursor),de .loc1: ld a,(side) add a,d ld d,a ; Y полож. LD C,BIOS.LP_SET_PLACE ; уст. полож. курсора RST ToBIOS ; получить символ с экрана ld c,0B4h xor a RST ToBIOS ; ld a,(bad) ; 5/2/0 хороший/плохой/подозр. сектор ld c,a add a,52h ; вычислить атрибут ld e,a ; 57h/54h/52h атрибуты четного сектора ld a,(tracks) ; тек. дорожка rrca ld a,"▌" jr nc,.loc2 ; четная дорожка ; атрибут не четного сектора ld a,h and 0x0F rlca rlca rlca rlca add a,2 add a,c ld e,a ; ld a,"▐" ; не четная дорожка .loc2: ld bc,0181h ; печать символа с атрибутом RST ToBIOS ret maska equ 05h ; 5/2/0 "маска" ok/bad/wrn для уст.атрибута цвета bad: db maska ; атрибут bad=0k+03h cursor: dw 0D0Fh ; нач. полож. метки на карте count: db 5 ; Настройка окна процесса форматирования Setup_Map: xor a ld (_OS),a ld hl,553 ld (L0BB6+1),hl ld hl,512 ld (MinusSc+1),hl ld a,2 ld (SecCode+1),a ; код размера сектора ld hl,INTERL1 ld (INTERL+1),hl ; уст. интерлив для < 21 сектора ld hl,LABEL ; буфер имени метки ld a,(hl) or a jr nz,.loc0 ld hl,.loc22 ; "NO NAME " .loc0: ld de,LABEL1 ld b,11 .loc1: ld a,(hl) or a jr z,.loc2 ld (de),a inc hl inc de djnz .loc1 jr .loc3 .loc2: ld a," " ; заполнить остаток "LABEL" пробелом ld (de),a inc de djnz .loc2 .loc3: ld hl,(CurElem1) ; тек. полож. указателя формата ld a,h add a,l call Space call SetCyl call SetMedia push af cp 3 jr z,.loc4 cp 4 jr z,.loc4 cp 6 jr z,.loc4 cp 7 jr z,.loc4 cp 10 jr z,.loc4 cp 11 jr z,.loc4 ; 80 дорожек ld a,0FFh ld (metka1),a ld (metka2),a ld (metka4),a ld (metka3),a jr .loc5 ; 82-83 дорожки .loc4: ld a,"█" ld (metka1),a ld (metka2),a ld a," " ld (metka4),a ld a,"0" ld (metka3),a .loc5: pop af rlca ld e,a ld d,0 ld hl,.loc6 ld bc,7 add hl,de ld e,(hl) inc hl ld d,(hl) ex de,hl ld de,metka5 ldir ; ld a,(_OS) or a jr z,.loc30 ; ос ms-dos dec a jr nz,.loc28 ; ос cpm-80 ld a,(sFlag1) or a jr nz,.loc28 ; ошибки работы с файлом "boot.$b" ld a,(cSystem) or a jr z,.loc28 ld hl,.loc53 ; tr-dos "Boot disk " jr .loc27 ; ms-dos .loc30: ld hl,.loc25 ; "System files" ld a,(sFlag) or a jr nz,.loc28 ; ошибки работы с сист. файлами Estex ld a,(cSystem) or a jr nz,.loc27 .loc28: ld hl,.loc26 ; " " .loc27: ld de,metka7 ld bc,12 ldir ; настроить строку тек. режима ld hl,(CurElem1) ; тек. полож. указателя формата ld a,h add a,l ld hl,.loc52 ; " " cp 13 ; пункт CPM-80 ? jr z,.loc21 ; ms-dos, tr-dos ld hl,.loc29 ; "Optimize sectors" ld a,(Mode2) or a jr nz,.loc21 ld hl,.loc19 ; "Standart mode" ld a,(Mode0) or a jr nz,.loc21 ld hl,.loc20 ; "Quick format" .loc21: ld bc,18 ld de,metka6 ; строка в ListBox-е ldir ret ; .loc6: dw .loc7 dw .loc8 dw .loc9 dw .loc10 dw .loc11 dw .loc12 dw .loc13 dw .loc14 dw .loc15 dw .loc16 dw .loc17 dw .loc18 dw .loc50 dw .loc51 ; .loc7: db "1.44 Mb" .loc8: db "1.52 Mb" .loc9: db "1.60 Mb" .loc10: db "1.64 Mb" .loc11: db "1.66 Mb" .loc12: db "1.68 Mb" .loc13: db "1.72 Mb" .loc14: db "1.74 Mb" .loc15: db "720 kB " .loc16: db "800 kB " .loc17: db "820 kB " .loc18: db "830 kB " .loc50: db "TR-DOS " .loc51: db "CP/M-80" .loc19: db "(Standart mode) " .loc29: db "(Optimize sectors)" .loc20: db "(Quick format) " .loc52: db " " .loc22: db "NO NAME " .loc25: db "System files" .loc53: db "Boot disk " .loc26: db " " ; Занести размер выбранного формата в байтах Space: push af rlca ld e,a ld d,0 ld hl,.loc1 ld bc,7 add hl,de ld e,(hl) inc hl ld d,(hl) ex de,hl push hl ld de,space1 ldir pop hl ld bc,7 ld de,space2 ldir ld hl,.loc14 ld de,space3 ; сбр. число bad-секторов ld bc,4 ldir ld hl," 0" ld (space4),hl ; сбр. тек. число дорожек pop af ret .loc1: dw .loc2 dw .loc3 dw .loc4 dw .loc5 dw .loc6 dw .loc7 dw .loc8 dw .loc9 dw .loc10 dw .loc11 dw .loc12 dw .loc13 dw .loc15 dw .loc16 ; .loc2: db "1457664" ; 1.44Mb .loc3: db "1539584" ; 1.52Mb .loc4: db "1620480" ; 1.60Mb .loc5: db "1661440" ; 1.64Mb .loc6: db "1681920" ; 1.66Mb .loc7: db "1702400" ; 1.68Mb .loc8: db "1745408" ; 1.72Mb .loc9: db "1765888" ; 1.74Mb .loc10: db " 730112" ; 720kB .loc11: db " 812032" ; 800kB .loc12: db " 832512" ; 820kB .loc13: db " 842752" ; 830kB .loc15: db " 651264" ; TR-DOS 16 сект. по 256 байт .loc16: db " 819200" ; CP/M-80 5 сект. по 1024 байт ; .loc14: db " 0" ; сбросить число bad-секторов ; Настроить макс. число дорожек SetCyl: push af cp 3 jr z,.loc2 cp 6 jr z,.loc2 cp 10 jr z,.loc2 cp 4 jr z,.loc3 cp 7 jr z,.loc3 cp 11 jr z,.loc3 ld a,80-1 ; 80 дорожек .loc1: ld (TRACKS+1),a pop af ret .loc2: ld a,82-1 ; 82 дорожки jr .loc1 .loc3: ld a,83-1 ; 83 дорожки jr .loc1 ; Настроить BPB ms-dos загрузчика SetMedia: push af or a jr z,.loc1 ; 1.44Mb dec a jp z,.loc2 ; 1.52Mb dec a jp z,.loc3 ; 1.60Mb dec a jp z,.loc4 ; 1.64Mb dec a jp z,.loc5 ; 1.66Mb dec a jp z,.loc6 ; 1.68Mb dec a jp z,.loc7 ; 1.72Mb dec a jp z,.loc8 ; 1.74Mb dec a jp z,.loc9 ; 720kB dec a jp z,.loc10 ; 800kB dec a jp z,.loc11 ; 820kB dec a jp z,.loc14 ; 830kB dec a jp z,.trdos ; TR-DOS jp .cpm ; CPM-80 ;1.44Mb .loc1: ld hl,108 ; размер межсект. пробела ld (GAP3),hl ld hl,0016h ld (Avail+2),hl ; 4 байта размера формата ld hl,3E00h ld (Avail),hl ld a,18 ; число секторов ld (FSETUP.sectorsAll),a ld hl,18 ; секторов на сторону ld (FSETUP.sectorsSide),hl ld a,34 ; посл. служ. сектор ld (FSETUP.lastSector),a ld hl,16896 ; размер FAT-ов + Root dir ld (frm5+1),hl ld hl,2880 ; секторов на диске ld (ASect+1),hl ld hl,9 ; секторов на FAT ld (FSect+1),hl .loc13: ld a,0F0h ; байт формата ld (frm4+1),a ld a,1 ; секторов на кластер ld (FSETUP.sectorsPerCluster),a ld hl,224 ; записей в корне ld (frm6+1),hl .loc12: ld hl,Avail ld de,avail1 ld bc,4 ldir ; сохр. емкость дискеты в доп. ячейке pop af ret ;1.52Mb .loc2: ld hl,42 ; размер межсект. пробела ld (GAP3),hl ld hl,0017h ld (Avail+2),hl ; 4 байта размера формата ld hl,7E00h ld (Avail),hl ld a,19 ; число секторов ld (FSETUP.sectorsAll),a ld hl,19 ; секторов на сторону ld (FSETUP.sectorsSide),hl ld a,34 ; посл. служ. сектор ld (FSETUP.lastSector),a ld hl,16896 ; размер FAT-ов + Root dir ld (frm5+1),hl ld hl,3040 ; секторов на диске ld (ASect+1),hl ld hl,9 ; секторов на FAT ld (FSect+1),hl jr .loc13 ;1.60Mb .loc3: ld hl,0018h ld (Avail+2),hl ; 4 байта размера формата ld hl,0BA00h ld (Avail),hl ld a,20 ; число секторов ld (FSETUP.sectorsAll),a ld hl,20 ; секторов на сторону ld (FSETUP.sectorsSide),hl ld a,36 ; посл. служ. сектор ld (FSETUP.lastSector),a ld hl,17920 ; размер FAT-ов + Root dir ld (frm5+1),hl ld hl,3200 ; секторов на диске ld (ASect+1),hl ld hl,10 ; секторов на FAT ld (FSect+1),hl jp .loc50 ;1.64Mb .loc4: ld hl,0019h ld (Avail+2),hl ; 4 байта размера формата ld hl,5A00h ld (Avail),hl ld a,20 ; число секторов ld (FSETUP.sectorsAll),a ld hl,20 ; секторов на сторону ld (FSETUP.sectorsSide),hl ld a,36 ; посл. служ. сектор ld (FSETUP.lastSector),a ld hl,17920 ; размер FAT-ов + Root dir ld (frm5+1),hl ld hl,3280 ; секторов на диске ld (ASect+1),hl ld hl,10 ; секторов на FAT ld (FSect+1),hl jr .loc50 ;1.66Mb .loc5: ld hl,0019h ld (Avail+2),hl ; 4 байта размера формата ld hl,0AA00h ld (Avail),hl ld a,20 ; число секторов ld (FSETUP.sectorsAll),a ld hl,20 ; секторов на сторону ld (FSETUP.sectorsSide),hl ld a,36 ; посл. служ. сектор ld (FSETUP.lastSector),a ld hl,17920 ; размер FAT-ов + Root dir ld (frm5+1),hl ld hl,3320 ; секторов на диске ld (ASect+1),hl ld hl,10 ; секторов на FAT ld (FSect+1),hl .loc50: ld hl,40 ; размер межсект. пробела ld (GAP3),hl jp .loc13 ;1.68Mb .loc6: ld hl,0019h ld (Avail+2),hl ; 4 байта размера формата ld hl,0FA00h ld (Avail),hl ld a,21 ; число секторов ld (FSETUP.sectorsAll),a ld hl,21 ; секторов на сторону ld (FSETUP.sectorsSide),hl ld a,36 ; посл. служ. сектор ld (FSETUP.lastSector),a ld hl,17920 ; размер FAT-ов + Root dir ld (frm5+1),hl ld hl,3360 ; секторов на диске ld (ASect+1),hl ld hl,10 ; секторов на FAT ld (FSect+1),hl jp .loc80 ;1.72Mb .loc7: ld hl,001Ah ld (Avail+2),hl ; 4 байта размера формата ld hl,0A200h ld (Avail),hl ld a,21 ; число секторов ld (FSETUP.sectorsAll),a ld hl,21 ; секторов на сторону ld (FSETUP.sectorsSide),hl ld a,36 ; посл. служ. сектор ld (FSETUP.lastSector),a ld hl,17920 ; размер FAT-ов + Root dir ld (frm5+1),hl ld hl,3444 ; секторов на диске ld (ASect+1),hl ld hl,10 ; секторов на FAT ld (FSect+1),hl jr .loc80 ;1.74Mb .loc8: ld hl,001Ah ld (Avail+2),hl ; 4 байта размера формата ld hl,0F200h ld (Avail),hl ld a,21 ; число секторов ld (FSETUP.sectorsAll),a ld hl,21 ; секторов на сторону ld (FSETUP.sectorsSide),hl ld a,38 ; посл. служ. сектор ld (FSETUP.lastSector),a ld hl,18944 ; размер FAT-ов + Root dir ld (frm5+1),hl ld hl,3486 ; секторов на диске ld (ASect+1),hl ld hl,11 ; секторов на FAT ld (FSect+1),hl .loc80: ld hl,11 ; размер межсект. пробела ld (GAP3),hl ld hl,INTERL2 ; уст. интерлив для 21 сектора ld (INTERL+1),hl jp .loc13 ;720kB .loc9: ld hl,80 ; размер межсект. пробела ld (GAP3),hl ld hl,000Bh ld (Avail+2),hl ; 4 байта размера формата ld hl,2400h ld (Avail),hl ld a,9 ; число секторов ld (FSETUP.sectorsAll),a ld hl,9 ; секторов на сторону ld (FSETUP.sectorsSide),hl ld hl,1440 ; секторов на диске ld (ASect+1),hl .loc15: ld hl,6656 ; размер FAT-ов + Root dir ld (frm5+1),hl ld a,14 ; посл. служ. сектор ld (FSETUP.lastSector),a ld hl,3 ; секторов на FAT ld (FSect+1),hl ld a,0F9h ; байт формата ld (frm4+1),a ld a,2 ; секторов на кластер ld (FSETUP.sectorsPerCluster),a ld hl,112 ; записей в корне ld (frm6+1),hl jp .loc12 ;800kB .loc10: ld hl,000Ch ld (Avail+2),hl ; 4 байта размера формата ld hl,6400h ld (Avail),hl ld hl,1600 ; секторов на диске ld (ASect+1),hl jr .loc16 ;820kB .loc11: ld hl,000Ch ld (Avail+2),hl ; 4 байта размера формата ld hl,0B400h ld (Avail),hl ld hl,1640 ; секторов на диске ld (ASect+1),hl jr .loc16 ;830kB .loc14: ld hl,000Ch ld (Avail+2),hl ; 4 байта размера формата ld hl,0DC00h ld (Avail),hl ld hl,1660 ; секторов на диске ld (ASect+1),hl .loc16: ld a,10 ; число секторов ld (FSETUP.sectorsAll),a ld hl,10 ; секторов на сторону ld (FSETUP.sectorsSide),hl ld hl,36 ; размер межсект. пробела ld (GAP3),hl ld hl,INTERL3 ; уст. интерлив для 21 сектора ld (INTERL+1),hl jr .loc15 ; TR-DOS .trdos: ld hl,50 ; размер межсект. пробела ld (GAP3),hl ld hl,256 ld (MinusSc+1),hl ld hl,INTERL4 ld (INTERL+1),hl ; уст. интерлив для < 21 сектора ld hl,0009h ld (Avail+2),hl ; 4 байта размера формата ld hl,0F000h ld (Avail),hl ld a,1 ld (_OS),a ld (SecCode+1),a ; код размера сектора ld hl,297 ; 553-256 ld (L0BB6+1),hl jp .loc12 ; CP/M-80 .cpm: ld hl,50 ; размер межсект. пробела ld (GAP3),hl ld hl,1024 ld (MinusSc+1),hl ld hl,000Ch ld (Avail+2),hl ; 4 байта размера формата ld hl,8000h ld (Avail),hl ld a,2 ld (_OS),a inc a ld (SecCode+1),a ; код размера сектора ld hl,1065 ; 553+512 ld (L0BB6+1),hl jp .loc12 ; Вывод в десятичном формате (7 разрядов) ; вх: hl'= мл.разряд ; hl = ст.разряд Hex7Dec:EXX LD BC,4240h EXX LD BC,000Fh ;1.000.000 EXX ld iy,tmp1 res 7,(iy+0) CALL GetLenN32 LD BC,86A0h EXX LD BC,0001h ;100.000 EXX CALL GetLenN32 LD BC,10000 ;10.000 EXX LD BC,0 ;100.000 EXX CALL GetLenN32 Hex4Dec:LD BC,1000 ;1.000 CALL GetLenN16 LD BC,100 ;100 CALL GetLenN16 LD BC,10 ;10 CALL GetLenN16 LD A,L ADD A,"0" LD (DE),A RET tmp1: db 0 GetLenN32: LD A,2Fh OR A .loc1: INC A SBC HL,BC EXX SBC HL,BC EXX JR NC,.loc1 ADD HL,BC EXX ADC HL,BC EXX CP "0" JR Z,.loc2 SET 7,(IY+0) .loc2: BIT 7,(IY+0) JR NZ,.loc3 LD A," " .loc3: LD (DE),A INC DE RET GetLenN16: LD A,2Fh OR A .loc1: INC A SBC HL,BC JR NC,.loc1 ADD HL,BC CP "0" JR Z,.loc2 SET 7,(IY+0) .loc2: BIT 7,(IY+0) JR NZ,.loc3 LD A," " .loc3: LD (DE),A INC DE RET Avail: dw 0,0 ; число доступ. байт avail1: dw 0,0 ; ячейка для восст. "Avail" ; Вычисление и вывод доступного пространства дискеты CalcAvail: ld de,1529h ; Y/X полож. "Available bytes" LD C,BIOS.LP_SET_PLACE RST ToBIOS and a ; сбр. перенос ld de,space2 ; буфер числа ld hl,(Avail) ; мл.разряд MinusSc:ld bc,512 sbc hl,bc ld (Avail),hl exx ld hl,(Avail+2) ; ст.разряд ld bc,0 sbc hl,bc ld (Avail+2),hl call Hex7Dec ld hl,space2 ld bc,0785h ; вывод строки ld e,ColFormNumber ; атрибут RST ToBIOS ; ld de,142Ch ; Y/X полож. "Bad sectors" LD C,BIOS.LP_SET_PLACE RST ToBIOS ld hl,(BadSect) inc hl ld (BadSect),hl ld iy,tmp1 res 7,(iy+0) ld de,space3 call Hex4Dec ; вывод кол-ва bad-секторов ld hl,space3 ld bc,0485h ; вывод строки ld e,ColFormNumber ; атрибут RST ToBIOS ret ;"Системные файлы скопированы" ;okno4: ld a,10h ; цвет вывод. окна ;ld (_mtk1+1),a ;ld hl,SysCopy ;jr _mtk ; "Отсутствует диск или устройство" okno3: ld a,40h ; цвет вывод. окна ld (_mtk1+1),a ld hl,MissingDisk jr _mtk ; "Прервано пользователем" okno0: ld a,10h ; цвет вывод. окна ld (_mtk1+1),a ld hl,Interrupt jr _mtk ; "Форматирование завершено" okno1: ld a,10h ; цвет вывод. окна ld (_mtk1+1),a ld hl,FComplite jr _mtk ; "Ошибка записи сист. области или не совместимый формат" okno2: ld a,40h ; цвет вывод. окна ld (_mtk1+1),a ld hl,NoForm _mtk: ld (_mtk2+1),hl ; ld a,(ColDialWn) ; сохр. цвет окна push af _mtk1: ld a,40h ; цвет вывод. окна ld (ColDialWn),a _mtk2: ld hl,NoForm ; "Ошибка записи сист. области" call DialogW pop af ld (ColDialWn),a ; восст. цвет окна ret ; Очистить карту ClearMap: ld de,0D0Fh ; Y/X полож. верх. строки LD C,BIOS.LP_SET_PLACE RST ToBIOS call clrMap ld de,0E0Fh ; Y/X полож. нижн. строки LD C,BIOS.LP_SET_PLACE RST ToBIOS ; clrMap: ld hl,.loc2 ld a,(metka1) cp 0xFF ; стоп-байт ld b,42 ; длина строки при > 80 дорожках jr nz,.loc1 ld b,40 ; длина строки при 80 дорожках .loc1: ld c,85h ; вывод строки ld e,75h ; норм. атрибут карты RST ToBIOS ret ; .loc2: db "██████████████████████████████████████████" ; Установить заданный формат текущего флоповода. ; Для 5.25" уст. всегда 1МГц тактовой ВГ93 (практически не нужна). SetDrive: ld a,(CurElem0) ; (0=A,1=B) тек. диск ld hl,DriveA ; форматы в RadioCheck "A:" or a jr z,.loc1 ld hl,DriveB ; форматы в RadioCheck "B:" .loc1: xor a cp (hl) jr nz,.d1440 ; 1.44Mb 3.5" ; девайс 720kB 5.25" .loc2: ld a,12h ; всегда форматить на 1МГц тактовой .loc3: ld (density),a ret ; девайс 1.44Mb 3.5" .d1440: ld hl,(CurElem1) ; тек. полож. указателя формата ld a,h add a,l cp 8 ; пункт 720kB и ниже jr nc,.loc2 ld a,13h jr .loc3 ; форматы 1.44Mb..1.52Mb ; Создание метки дискеты (MS-DOS) CreateLabel: ; ld hl,LABEL ; имя метки ; ld a,(hl) ; or a ; ret z ; call SetDisketa ; уст. текущим диском дискету ; ; создать файл ; ld hl,LABEL ; имя метки ; ld a,08h ; атрибут "метка тома" ; ld c,0Ah ; RST ToDSS ; jr c,.loc1 ; ошибка создания метки ; ;ret c ; ; закрыть файл ; ld c,12h ; RST ToDSS ; .loc1: jp RestPath ; восст. диск и путь ld hl,LABEL ld de,L2400 + BOOT_SECTOR.FAT.LABEL ;!TEST ld b,11 ; .loop: ld a,(hl) and a jr z,.empty ld (de),a inc de inc hl djnz .loop ret ; .empty: ld a,b cp 11 jr z,.no_name ; ex de,hl .loop2: ld (hl)," " inc hl djnz .loop2 ret .no_name: ld hl,MS_Boot.label ld bc,11 ldir ret ; Выходные значения: ; D - день ; E - месяц ; IX - год ; H - час ; L - минуты ; B - секунды ; C - день недели ;!TEST CreateSerialNumber: ld c,Dss.SysTime rst ToDSS ; ex de,hl add ix,de ld a,xl ld (L2400 + BOOT_SECTOR.FAT.SERIAL_NUMBER + 3),a ld (L2400 + BOOT_SECTOR.FAT.SERIAL_NUMBER + 1),ix ; ld a,d ld d,b xor c .loop: rra djnz .loop ; ld e,h ld h,l ld l,e ; ld e,a add hl,de ld e,l ld l,h ld h,e ld (L2400 + BOOT_SECTOR.FAT.SERIAL_NUMBER),hl ret