From 513acb41e145248493bb86d0e9eab7c00b1649d1 Mon Sep 17 00:00:00 2001 From: lp85d Date: Sun, 14 Sep 2025 08:08:18 +0200 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D1=82?= =?UTF-8?q?=D1=8C=20F.ASM?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- F.ASM | 295 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 295 insertions(+) create mode 100644 F.ASM diff --git a/F.ASM b/F.ASM new file mode 100644 index 0000000..00f1975 --- /dev/null +++ b/F.ASM @@ -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: \ No newline at end of file