245 lines
4.1 KiB
NASM
245 lines
4.1 KiB
NASM
meos_app_start
|
|
|
|
udata
|
|
param rb 4096
|
|
path rb 256
|
|
drive db 0
|
|
sector_buffer rb 512
|
|
meos_app_end
|
|
|
|
data
|
|
szZ msg_confirm, 'Format floppy in FAT32? (Y/N) '
|
|
szZ msg_success, 10,'Formatted successfully. Press any key.',10
|
|
szZ msg_error, 10,'Error: '
|
|
szZ msg_invalid_path, 'Invalid path (use /fd0/1 or /fd1/1)',10
|
|
szZ msg_not_floppy, 'Not a 1.44 MB floppy disk',10
|
|
szZ msg_write_error, 'Write failed',10
|
|
|
|
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
|
|
data
|
|
|
|
code
|
|
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
|
|
mcall 3, 0, 0, 0, 0, 0, 0
|
|
mov [boot_sector + 0x27], eax
|
|
|
|
; Get file size to confirm floppy
|
|
mcall 58, 4, 0, 0, sector_buffer, path
|
|
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
|
|
mcall 58, 2, 512, 0, 0, boot_sector, path
|
|
cmp eax, 0
|
|
jnz write_error
|
|
|
|
; Write FSInfo at 512
|
|
mcall 58, 2, 512, 512, 0, fs_info, path
|
|
cmp eax, 0
|
|
jnz write_error
|
|
|
|
; Write backup boot at 3072
|
|
mcall 58, 2, 512, 3072, 0, boot_sector, path
|
|
cmp eax, 0
|
|
jnz write_error
|
|
|
|
; Write backup FSInfo at 3584
|
|
mcall 58, 2, 512, 3584, 0, fs_info, path
|
|
cmp eax, 0
|
|
jnz write_error
|
|
|
|
; Write first FAT at 16384
|
|
mcall 58, 2, 512, 16384, 0, fat_first, path
|
|
cmp eax, 0
|
|
jnz write_error
|
|
|
|
; Write first FAT2 at 28160
|
|
mcall 58, 2, 512, 28160, 0, fat_first, path
|
|
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
|
|
mcall 58, 2, 512, edx, 0, sector_buffer, path
|
|
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
|
|
mcall 58, 2, 512, edx, 0, sector_buffer, path
|
|
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
|
|
mcall 58, 2, 512, edx, 0, sector_buffer, path
|
|
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:
|
|
mcall -1
|
|
|
|
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
|
|
mcall 63, 1
|
|
jmp print_string
|
|
.end:
|
|
ret
|
|
|
|
get_key:
|
|
mcall 2
|
|
shr eax, 8
|
|
ret
|
|
code |