Добавить F.ASM
This commit is contained in:
295
F.ASM
Normal file
295
F.ASM
Normal file
@@ -0,0 +1,295 @@
|
||||
use32
|
||||
org 0x0
|
||||
|
||||
db 'MENUET01'
|
||||
dd 1
|
||||
dd start
|
||||
dd i_end
|
||||
dd mem_end
|
||||
dd stack_top
|
||||
dd param
|
||||
dd 0
|
||||
|
||||
param rb 4096
|
||||
|
||||
path rb 256
|
||||
|
||||
drive db 0
|
||||
|
||||
msg_confirm db 'Format floppy in FAT32? (Y/N) ',0
|
||||
|
||||
msg_success db 10,'Formatted successfully. Press any key.',10,0
|
||||
|
||||
msg_error db 10,'Error: '
|
||||
|
||||
msg_invalid_path db 'Invalid path (use /fd0/1 or /fd1/1)',10,0
|
||||
|
||||
msg_not_floppy db 'Not a 1.44 MB floppy disk',10,0
|
||||
|
||||
msg_write_error db 'Write failed',10,0
|
||||
|
||||
boot_sector:
|
||||
db 0xeb,0x58,0x90
|
||||
db 'MSWIN4.1'
|
||||
dw 512
|
||||
db 1
|
||||
dw 32
|
||||
db 2
|
||||
dw 0
|
||||
dw 0
|
||||
db 0xf0
|
||||
dw 0
|
||||
dw 2
|
||||
dd 0
|
||||
dd 2880
|
||||
dd 23
|
||||
dd 0
|
||||
dw 0
|
||||
dd 2
|
||||
dw 1
|
||||
dw 6
|
||||
times 12 db 0
|
||||
db 0
|
||||
db 0
|
||||
db 0x29
|
||||
dd 0x12345678 ; serial, will be set
|
||||
db 'NO NAME '
|
||||
db 'FAT32 '
|
||||
times 420 db 0x90 ; boot code nop
|
||||
db 0x55,0xaa
|
||||
|
||||
fs_info:
|
||||
dd 0x41615252
|
||||
times 480 db 0
|
||||
dd 0x61417272
|
||||
dd 2801 ; free clusters
|
||||
dd 3 ; last allocated
|
||||
times 12 db 0
|
||||
dd 0xaa550000
|
||||
|
||||
fat_first:
|
||||
dd 0x0ffffff8
|
||||
dd 0x0fffffff
|
||||
dd 0x0fffffff
|
||||
times 512-12 db 0
|
||||
|
||||
sector_buffer rb 512 ; zero-filled
|
||||
|
||||
start:
|
||||
mov esi, param
|
||||
call skip_spaces
|
||||
mov edi, path
|
||||
call copy_string
|
||||
|
||||
; Parse and validate path
|
||||
mov esi, path
|
||||
cmp byte [esi], '/'
|
||||
jne invalid_path
|
||||
inc esi
|
||||
cmp word [esi], 'fd'
|
||||
jne invalid_path
|
||||
add esi, 2
|
||||
mov al, [esi]
|
||||
sub al, '0'
|
||||
cmp al, 0
|
||||
jl invalid_path
|
||||
cmp al, 1
|
||||
jg invalid_path
|
||||
mov [drive], al
|
||||
inc esi
|
||||
cmp byte [esi], '/'
|
||||
jne invalid_path
|
||||
inc esi
|
||||
cmp byte [esi], '1'
|
||||
jne invalid_path
|
||||
inc esi
|
||||
cmp byte [esi], 0
|
||||
jne invalid_path
|
||||
|
||||
; Set drive number in boot sector
|
||||
mov al, [drive]
|
||||
mov [boot_sector + 0x24], al
|
||||
|
||||
; Set volume serial using system time
|
||||
mov eax, 3
|
||||
int 0x40
|
||||
mov [boot_sector + 0x27], eax
|
||||
|
||||
; Get file size to confirm floppy
|
||||
mov eax, 58
|
||||
mov ebx, 4
|
||||
mov ecx, 0
|
||||
mov edx, 0
|
||||
mov edi, sector_buffer ; reuse buffer for info
|
||||
mov ebp, path
|
||||
int 0x40
|
||||
cmp eax, 0
|
||||
jnz write_error
|
||||
cmp dword [sector_buffer + 20], 0 ; size high
|
||||
jnz not_floppy
|
||||
cmp dword [sector_buffer + 16], 1474560 ; size low
|
||||
jnz not_floppy
|
||||
|
||||
; Confirm
|
||||
mov esi, msg_confirm
|
||||
call print_string
|
||||
call get_key
|
||||
or al, 0x20 ; to lowercase
|
||||
cmp al, 'y'
|
||||
jne exit
|
||||
|
||||
; Write boot sector at 0
|
||||
mov eax, 58
|
||||
mov ebx, 2
|
||||
mov ecx, 512
|
||||
mov edx, 0
|
||||
mov esi, 0
|
||||
mov edi, boot_sector
|
||||
mov ebp, path
|
||||
int 0x40
|
||||
cmp eax, 0
|
||||
jnz write_error
|
||||
|
||||
; Write FSInfo at 512
|
||||
mov edx, 512
|
||||
mov edi, fs_info
|
||||
int 0x40
|
||||
cmp eax, 0
|
||||
jnz write_error
|
||||
|
||||
; Write backup boot at 3072
|
||||
mov edx, 3072
|
||||
mov edi, boot_sector
|
||||
int 0x40
|
||||
cmp eax, 0
|
||||
jnz write_error
|
||||
|
||||
; Write backup FSInfo at 3584
|
||||
mov edx, 3584
|
||||
mov edi, fs_info
|
||||
int 0x40
|
||||
cmp eax, 0
|
||||
jnz write_error
|
||||
|
||||
; Write first FAT at 16384
|
||||
mov edx, 16384
|
||||
mov edi, fat_first
|
||||
int 0x40
|
||||
cmp eax, 0
|
||||
jnz write_error
|
||||
|
||||
; Write first FAT2 at 28160
|
||||
mov edx, 28160
|
||||
int 0x40
|
||||
cmp eax, 0
|
||||
jnz write_error
|
||||
|
||||
; Zero other FAT sectors (1 to 22 for each FAT)
|
||||
mov ecx, 22
|
||||
mov edx, 16384 + 512 ; FAT1 start +512
|
||||
zero_fat1:
|
||||
push ecx
|
||||
mov edi, sector_buffer
|
||||
int 0x40
|
||||
cmp eax, 0
|
||||
jnz write_error
|
||||
add edx, 512
|
||||
pop ecx
|
||||
loop zero_fat1
|
||||
|
||||
mov ecx, 22
|
||||
mov edx, 28160 + 512 ; FAT2
|
||||
zero_fat2:
|
||||
push ecx
|
||||
mov edi, sector_buffer
|
||||
int 0x40
|
||||
cmp eax, 0
|
||||
jnz write_error
|
||||
add edx, 512
|
||||
pop ecx
|
||||
loop zero_fat2
|
||||
|
||||
; Zero data sectors (LBA 78 to 2879, position 78*512 to 2879*512)
|
||||
mov ecx, 2802 ; data sectors
|
||||
mov edx, 78 * 512 ; start data
|
||||
zero_data:
|
||||
push ecx
|
||||
mov edi, sector_buffer
|
||||
int 0x40
|
||||
cmp eax, 0
|
||||
jnz write_error
|
||||
add edx, 512
|
||||
pop ecx
|
||||
loop zero_data
|
||||
|
||||
mov esi, msg_success
|
||||
call print_string
|
||||
call get_key
|
||||
jmp exit
|
||||
|
||||
invalid_path:
|
||||
mov esi, msg_error
|
||||
call print_string
|
||||
mov esi, msg_invalid_path
|
||||
call print_string
|
||||
jmp exit
|
||||
|
||||
not_floppy:
|
||||
mov esi, msg_error
|
||||
call print_string
|
||||
mov esi, msg_not_floppy
|
||||
call print_string
|
||||
jmp exit
|
||||
|
||||
write_error:
|
||||
mov esi, msg_error
|
||||
call print_string
|
||||
mov esi, msg_write_error
|
||||
call print_string
|
||||
jmp exit
|
||||
|
||||
exit:
|
||||
mov eax, -1
|
||||
int 0x40
|
||||
|
||||
skip_spaces:
|
||||
cmp byte [esi], ' '
|
||||
jne .end
|
||||
inc esi
|
||||
jmp skip_spaces
|
||||
.end:
|
||||
ret
|
||||
|
||||
copy_string:
|
||||
lodsb
|
||||
stosb
|
||||
or al, al
|
||||
jnz copy_string
|
||||
ret
|
||||
|
||||
print_string:
|
||||
lodsb
|
||||
or al, al
|
||||
jz .end
|
||||
mov ah, 0
|
||||
mov ebx, eax
|
||||
mov eax, 63
|
||||
mov ebx, 1
|
||||
int 0x40
|
||||
jmp print_string
|
||||
.end:
|
||||
ret
|
||||
|
||||
get_key:
|
||||
mov eax, 2
|
||||
int 0x40
|
||||
shr eax, 8
|
||||
ret
|
||||
|
||||
i_end:
|
||||
rb 1024 ; reserve for data if needed
|
||||
|
||||
stack_top:
|
||||
rb 4096
|
||||
|
||||
mem_end:
|
Reference in New Issue
Block a user