Страница 1 из 1

Низкоуровневое форматирование дискет

Добавлено: Вс янв 19, 2025 11:41 am
push0ret
Написал программу для форматирования дискет. Кому надо, пользуйтесь. Форматирование со стандартным размером кластера 512 байт. Пользуйтесь с осторожностью, во время форматирования дискету не извлекать, а также не будет возможности восстановления файлов, дискета будет перезаписана.

Ссылка на скачивание: https://push0ret.w10.site/downloads/pformat.com

Исходный код:

Код: Выделить всё

.model  tiny
.286
code    segment
org     100h

start:

mov ah, 9d
lea dx, usr_msg
int 21h

wait_key:

mov ah, 1d
int 21h

cmp al, 32h
jz exit

cmp al, 31h
jnz wait_key

mov ah, 2d
mov dl, 0Dh
int 21h

;Select disk

mov ah, 9d
lea dx, usr_msg2
int 21h

sel_disk:

mov ah, 1d
int 21h

cmp al, 32h
ja sel_disk

cmp al, 31h
jb sel_disk

sub al, 31h

mov disk, al

;FORMAT

format:

;2 & 11 sectors (FAT tables)

mov ah, 3d
mov dl, disk
mov dh, 0
mov ch, 0
mov cl, 2d
mov al, 1d
lea bx, fat_table
int 13h

mov ah, 3d
mov cl, 11d
mov al, 1d
int 13h

;format first cylinder

lea bx, other_sectors
mov al, 1d
mov cx, 8d

format_0cyl:

push cx
mov ah, 3d
mov cl, sector
int 13h

inc sector
pop cx

loop format_0cyl

cmp sector, 19d
jz format_other_side0

mov sector, 12d
mov cx, 7d

jmp format_0cyl

;Format other cylinders on side 0

format_other_side0:

mov sector, 1d
mov cx, 18d

format_side0:

push cx
mov ah, 3d
mov dl, disk
mov dh, side
mov ch, cyl
mov cl, sector
mov al, 1d
lea bx, other_sectors
int 13h

inc sector
pop cx

loop format_side0

cmp cyl, 80d
jz format_side1

mov sector, 1d
inc cyl
mov cx, 18d
jmp format_side0

format_side1:

mov sector, 1d
mov cyl, 0d
mov side, 1d

mov sector, 1d
mov cx, 18d

format_side1_sectors:

push cx
mov ah, 3d
mov dl, disk
mov dh, side
mov ch, cyl
mov cl, sector
mov al, 1d
lea bx, other_sectors
int 13h

inc sector
pop cx

loop format_side1_sectors

cmp cyl, 80d
jz format_boot_sec

mov sector, 1d
inc cyl
mov cx, 18d
jmp format_side1_sectors

format_boot_sec:

mov ah, 3d
mov dl, disk
mov dh, 0
mov ch, 0
mov cl, 1d
mov al, 1d
lea bx, boot_rec
int 13h

format_done:

mov ah, 9d
lea dx, usr_msg3
int 21h

exit:

mov ax, 4c00h
int 21h

usr_msg         db      '1. Low level format', 0Ah, 0Dh
		db      '2. Exit', 0Ah, 0Dh, 24h        
usr_msg2        db      'Select disk:', 0Ah, 0Dh
		db      '1. A', 0Ah, 0Dh
		db      '2. B', 0Ah, 0Dh, 24h
usr_msg3	db	0Dh, 'Formated!', 24h
disk            db      ?
sector          db      3d
cyl             db      1d
side            db      0

fat_table       db      0F0h, 0FFh, 0FFh, 509d dup(0)
other_sectors   db      512d dup(0)

boot_rec		db	0EBh, 3Ch, 90h, 50h, 55h, 53h, 48h, 30h, 52h, 45h, 54h, 0, 02d, 01d, 01d, 0, 02d, 0E0h, 0 
			db	40h, 0Bh, 0F0h, 09d, 0, 12h, 0, 02d, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29h, 48h, 0Fh, 63h, 0B4h, 4Eh, 4Fh, 20h, 4Eh, 41h 
			db	4Dh, 45h, 20h, 20h, 20h, 20h, 46h, 41h, 54h, 31h, 32h, 20h, 20h, 20h, 33h, 0C9h, 8Eh, 0D1h, 0BCh, 0F0h, 7Bh, 8Eh, 0D9h 
			db	0B8h, 0, 20h, 8Eh, 0C0h, 0FCh, 0BDh, 0, 7Ch, 38h, 4Eh, 24h, 7Dh, 24h, 8Bh, 0C1h, 99h, 0E8h, 3Ch, 01d, 72h, 1Ch, 83h, 0EBh 
			db	3Ah, 66h, 0A1h, 1Ch, 7Ch, 26h, 66h, 3Bh, 07h, 26h, 8Ah, 57h, 0FCh, 75h, 06d, 80h, 0CAh, 02d, 88h, 56h, 02d, 80h, 0C3h, 10h 
			db	73h, 0EBh, 33h, 0C9h, 8Ah, 46h, 10h, 98h, 0F7h, 66h, 16h, 03d, 46h, 1Ch, 13h, 56h, 1Eh, 03d, 46h, 0Eh, 13h, 0D1h, 8Bh, 76h, 11h 
			db	60h, 89h, 46h, 0FCh, 89h, 56h, 0FEh, 0B8h, 20h, 0, 0F7h, 0E6h, 8Bh, 5Eh, 0Bh, 03d, 0C3h, 48h, 0F7h, 0F3h, 01d, 46h, 0FCh, 11h, 4Eh 
			db	0FEh, 61h, 0BFh, 0, 0, 0E8h, 0E6h, 0, 72h, 39h, 26h, 38h, 2Dh, 74h, 17h, 60h, 0B1h, 0Bh, 0BEh, 0A1h, 7Dh, 0F3h, 0A6h, 61h, 74h, 32h 
			db	4Eh, 74h, 09d, 83h, 0C7h, 20h, 3Bh, 0FBh, 72h, 0E6h, 0EBh, 0DCh, 0A0h, 0FBh, 7Dh, 0B4h, 7Dh, 8Bh, 0F0h, 0ACh, 98h, 40h, 74h, 0Ch, 48h, 74h 
			db	13h, 0B4h, 0Eh, 0BBh, 07d, 0, 0CDh, 10h, 0EBh, 0EFh, 0A0h, 0FDh, 7Dh, 0EBh, 0E6h, 0A0h, 0FCh, 7Dh, 0EBh, 0E1h, 0CDh, 16h, 0CDh, 19h, 26h, 8Bh 
			db	55h, 1Ah, 52h, 0B0h, 01d, 0BBh, 0, 0, 0E8h, 3Bh, 0, 72h, 0E8h, 5Bh, 8Ah, 56h, 24h, 0BEh, 0Bh, 7Ch, 8Bh, 0FCh, 0C7h, 46h, 0F0h, 3Dh, 7Dh, 0C7h 
			db	46h, 0F4h, 29h, 7Dh, 8Ch, 0D9h, 89h, 4Eh, 0F2h, 89h, 4Eh, 0F6h, 0C6h, 06d, 96h, 7Dh, 0CBh, 0EAh, 03d, 0, 0, 20h, 0Fh, 0B6h, 0C8h, 66h, 8Bh, 46h 
			db	0F8h, 66h, 03d, 46h, 1Ch, 66h, 8Bh, 0D0h, 66h, 0C1h, 0EAh, 10h, 0EBh, 5Eh, 0Fh, 0B6h, 0C8h, 4Ah, 4Ah, 8Ah, 46h, 0Dh, 32h, 0E4h, 0F7h, 0E2h, 03d 
			db	46h, 0FCh, 13h, 56h, 0FEh, 0EBh, 4Ah, 52h, 50h, 06d, 53h, 6Ah, 01d, 6Ah, 10h, 91h, 8Bh, 46h, 18h, 96h, 92h, 33h, 0D2h, 0F7h, 0F6h, 91h, 0F7h, 0F6h 
			db	42h, 87h, 0CAh, 0F7h, 76h, 1Ah, 8Ah, 0F2h, 8Ah, 0E8h, 0C0h, 0CCh, 02d, 0Ah, 0CCh, 0B8h, 01d, 02d, 80h, 7Eh, 02d, 0Eh, 75h, 04h, 0B4h, 42h, 8Bh, 0F4h 
			db	8Ah, 56h, 24h, 0CDh, 13h, 61h, 61h, 72h, 0Bh, 40h, 75h, 01d, 42h, 03d, 5Eh, 0B, 49h, 75h, 06d, 0F8h, 0C3h, 41h, 0BBh, 0, 0, 60h, 66h, 6Ah, 0, 0EBh, 0B0h 
			db	42h, 4Fh, 4Fh, 54h, 4Dh, 47h, 52h, 20h, 20h, 20h, 20h, 0Dh, 0Ah, 52h, 65h, 6Dh, 6Fh, 76h, 65h, 20h, 64h, 69h, 73h, 6Bh, 73h, 20h, 6Fh, 72h, 20h, 6Fh, 74h 
			db	68h, 65h, 72h, 20h, 6Dh, 65h, 64h, 69h, 61h, 2Eh, 0FFh, 0Dh, 0Ah, 44h, 69h, 73h, 6Bh, 20h, 65h, 72h, 72h, 6Fh, 72h, 0FFh, 0Dh, 0Ah, 50h, 72h, 65h, 73h, 73h 
			db	20h, 61h, 6Eh, 79h, 20h, 6Bh, 65h, 79h, 20h, 74h, 6Fh, 20h, 72h, 65h, 73h, 74h, 61h, 72h, 74h, 0Dh, 0Ah, 0, 0, 0, 0, 0, 0, 0, 0ACh, 0CBh, 0D8h, 55h, 0AAh

code    ends
end     start
С уважением, push0ret!

Re: Низкоуровневое форматирование дискет

Добавлено: Сб янв 25, 2025 9:57 am
alsk
Сейчас не все знают что такое дискета и кассета.

Помню что когда-то баловался ассемблером: "минировал" принтер, замораживал всю систему.
вот доказательство
Изображение

1 при отправке какого-то байта в порт принтера, он делал "пик", сделав loop получаем пикающий принтер.

2 у процессора есть cw0 cw1 cw2... - контрольные слова (или контрольные регистры). При отправке байта/слова можно было заблокировать ВСЕ прерывания. Только кнопка на сист блоке помогала.

Какие-никакие минимальные знания ассемблера мне очень пригодились. В районе только я знал и понимал почему файл 4+ гб не хочет записываться на пустую флешку объемом 8 гб.

Re: Низкоуровневое форматирование дискет

Добавлено: Сб янв 25, 2025 10:48 am
push0ret
alsk писал(а): Сб янв 25, 2025 9:57 am Сейчас не все знают что такое дискета и кассета.

Помню что когда-то баловался ассемблером: "минировал" принтер, замораживал всю систему.
вот доказательство
Изображение

1 при отправке какого-то байта в порт принтера, он делал "пик", сделав loop получаем пикающий принтер.

2 у процессора есть cw0 cw1 cw2... - контрольные слова (или контрольные регистры). При отправке байта/слова можно было заблокировать ВСЕ прерывания. Только кнопка на сист блоке помогала.

Какие-никакие минимальные знания ассемблера мне очень пригодились. В районе только я знал и понимал почему файл 4+ гб не хочет записываться на пустую флешку объемом 8 гб.

Рад, что кто-то интересуется моими темами на форуме :D.
Не могу не поправить. Управляющие регистры именуются как CR (Control Register).
Если есть интерес, то про прерывания тоже есть тема с названием "Контроллер прерываний". Там я показывал пример запрета прерываний.

Re: Низкоуровневое форматирование дискет

Добавлено: Сб янв 25, 2025 11:08 am
alsk
ну я выше в скобках написал "(или контрольные регистры)" - точно уже не помню.

ох, блин, я только что проверил, на месте ли книга по https://www.google.com/search?q=SoftIce SoftIce или я ее тоже отдал? На месте, на полке.

ааа, я еще помню как я восстанавливал отформатированные дискеты в ndd (norton disk doctor). С удивлением выяснил что при форматировании (и/или удалении) файла с дискеты, там только первые один два(?) символа в имени файла затираются и он "пропадает".

Но записав какие-то (ну не какие-то, а допустимые для имен файлов) символы на место затертых байтов имени файла, можно было восстановить удаленный файл. Были времена...
---
Книги на фото - это книги которые я отвез в библиотеку села, в они их выкинули(?) вместе с русской литературой.
---
снова на меня будут модераторы орать за то что я не по теме флужу (флудю).