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