[ISOBOOT]

Fix portable bootsector and make it gas compatible (its opcode identical to the nasm compiled one and works correctly)

svn path=/trunk/; revision=52153
This commit is contained in:
Timo Kreuzer 2011-06-09 11:23:01 +00:00
parent 17de5b1c0f
commit 0944b73b87

View file

@ -94,7 +94,7 @@ resb ISOFileNameEnd, 1
//align open_file_t_size //align open_file_t_size
absolute HEX(5060) absolute HEX(5060)
resb Files, MAX_OPEN * open_file_t_size resb Files, (MAX_OPEN * open_file_t_size)
/******************************************************************************/ /******************************************************************************/
@ -104,7 +104,7 @@ start:
cli // Disable interrupts cli // Disable interrupts
xor ax, ax // ax = segment zero xor ax, ax // ax = segment zero
mov ss, ax // Initialize stack segment mov ss, ax // Initialize stack segment
mov sp, start // Set up stack mov sp, offset start // Set up stack
mov ds, ax // Initialize other segment registers mov ds, ax // Initialize other segment registers
mov es, ax mov es, ax
mov fs, ax mov fs, ax
@ -150,7 +150,7 @@ relocate:
// Display the 'Press key' message and wait for a maximum of 5 seconds // Display the 'Press key' message and wait for a maximum of 5 seconds
call crlf call crlf
mov si, presskey_msg // si points to 'Press key' message mov si, offset presskey_msg // si points to 'Press key' message
call writestr // display the message call writestr // display the message
mov byte ptr ds:[TimeoutCount], 5 mov byte ptr ds:[TimeoutCount], 5
@ -166,7 +166,7 @@ relocate:
cmp eax, ebx cmp eax, ebx
jnz .poll_again jnz .poll_again
mov si, dot_msg // print '.' mov si, offset dot_msg // print '.'
call writestr call writestr
dec byte ptr ds:[TimeoutCount] // decrement timeout counter dec byte ptr ds:[TimeoutCount] // decrement timeout counter
jz .boot_harddisk jz .boot_harddisk
@ -215,7 +215,7 @@ relocate:
// at least some BIOSes will get the wrong value otherwise // at least some BIOSes will get the wrong value otherwise
mov ax, HEX(4B01) // Get disk emulation status mov ax, HEX(4B01) // Get disk emulation status
mov dl, byte ptr ds:[DriveNo] mov dl, byte ptr ds:[DriveNo]
mov si, spec_packet mov si, offset spec_packet
int HEX(13) int HEX(13)
jc spec_query_failed // Shouldn't happen (BIOS bug) jc spec_query_failed // Shouldn't happen (BIOS bug)
mov dl, byte ptr ds:[DriveNo] mov dl, byte ptr ds:[DriveNo]
@ -430,7 +430,7 @@ searchdir_iso:
inc di inc di
and cl,cl and cl,cl
jz .isfile jz .isfile
cmp cl, '\' cmp cl, 92 // '\'
jne .scan jne .scan
mov byte ptr ds:[di-1], 0 // Terminate at directory name mov byte ptr ds:[di-1], 0 // Terminate at directory name
mov cl,2 // Search for directory mov cl,2 // Search for directory
@ -519,7 +519,7 @@ searchdir_iso:
pop di // Next filename pointer pop di // Next filename pointer
// restore the backslash in the filename // restore the backslash in the filename
mov byte ptr ds:[di-1], '\' mov byte ptr ds:[di-1], 92 // '\'
mov byte ptr ds:[ISOFlags], cl // Restore the flags mov byte ptr ds:[ISOFlags], cl // Restore the flags
jz .failure // Did we fail? If so fail for real! jz .failure // Did we fail? If so fail for real!
@ -656,9 +656,9 @@ spec_query_failed:
.test_loop: .test_loop:
pusha pusha
mov ax, HEX(4B01) mov ax, HEX(4B01)
mov si, spec_packet mov si, offset spec_packet
mov byte ptr ds:[si], 13 ; Size of buffer mov byte ptr ds:[si], 13 // Size of buffer
int 13h int HEX(13)
popa popa
jc .still_broken jc .still_broken
@ -704,7 +704,7 @@ fatal_error:
writemsg: writemsg:
push ax push ax
push si push si
mov si, isolinux_str mov si, offset isolinux_str
call writestr call writestr
pop si pop si
call writestr call writestr
@ -714,7 +714,7 @@ writemsg:
// //
// crlf: Print a newline // crlf: Print a newline
crlf: crlf:
mov si, crlf_msg mov si, offset crlf_msg
// Fall through // Fall through
// //
@ -758,7 +758,7 @@ writehex_common:
.loop: .loop:
rol eax, 4 rol eax, 4
push eax push eax
and al, 0Fh and al, HEX(0F)
cmp al, 10 cmp al, 10
jae .high jae .high
.low: .low:
@ -808,7 +808,7 @@ getonesec:
// BP - Sector count // BP - Sector count
// //
getlinsec: getlinsec:
mov si, dapa // Load up the DAPA mov si, offset dapa // Load up the DAPA
mov word ptr ds:[si+4], bx mov word ptr ds:[si+4], bx
mov bx, es mov bx, es
mov word ptr ds:[si+6], bx mov word ptr ds:[si+6], bx
@ -841,7 +841,7 @@ xint13:
mov byte ptr ds:[RetryCount], retry_count mov byte ptr ds:[RetryCount], retry_count
.try: .try:
pushad pushad
int 13h int HEX(13)
jc .error jc .error
add sp, 8*4 // Clean up stack add sp, 8*4 // Clean up stack
ret ret
@ -892,7 +892,7 @@ kaboom:
mov fs, ax mov fs, ax
mov gs, ax mov gs, ax
sti sti
mov si, err_bootfailed mov si, offset err_bootfailed
call writestr call writestr
xor ax, ax // Wait for keypress xor ax, ax // Wait for keypress
int HEX(16) int HEX(16)
@ -985,88 +985,88 @@ no_isolinux_msg:
// //
.align 8 .align 8
spec_packet: spec_packet:
db HEX(13) // Size of packet .byte HEX(13) // Size of packet
sp_media: sp_media:
db 0 // Media type .byte 0 // Media type
sp_drive: sp_drive:
db 0 // Drive number .byte 0 // Drive number
sp_controller: sp_controller:
db 0 // Controller index .byte 0 // Controller index
sp_lba: sp_lba:
dd 0 // LBA for emulated disk image .long 0 // LBA for emulated disk image
sp_devspec: sp_devspec:
dw 0 // IDE/SCSI information .word 0 // IDE/SCSI information
sp_buffer: sp_buffer:
dw 0 // User-provided buffer .word 0 // User-provided buffer
sp_loadseg: sp_loadseg:
dw 0 // Load segment .word 0 // Load segment
sp_sectors: sp_sectors:
dw 0 // Sector count .word 0 // Sector count
sp_chs: sp_chs:
db 0,0,0 // Simulated CHS geometry .byte 0,0,0 // Simulated CHS geometry
sp_dummy: sp_dummy:
db 0 // Scratch, safe to overwrite .byte 0 // Scratch, safe to overwrite
// //
// EBIOS drive parameter packet // EBIOS drive parameter packet
// //
.align 8 .align 8
drive_params: drive_params:
dw 30 // Buffer size .word 30 // Buffer size
dp_flags: dp_flags:
dw 0 // Information flags .word 0 // Information flags
dp_cyl: dp_cyl:
dd 0 // Physical cylinders .long 0 // Physical cylinders
dp_head: dp_head:
dd 0 // Physical heads .long 0 // Physical heads
dp_sec: dp_sec:
dd 0 // Physical sectors/track .long 0 // Physical sectors/track
dp_totalsec: dp_totalsec:
dd 0,0 // Total sectors .long 0,0 // Total sectors
dp_secsize: dp_secsize:
dw 0 // Bytes per sector .word 0 // Bytes per sector
dp_dpte: dp_dpte:
dd 0 // Device Parameter Table .long 0 // Device Parameter Table
dp_dpi_key: dp_dpi_key:
dw 0 // 0BEDDh if rest valid .word 0 // 0BEDDh if rest valid
dp_dpi_len: dp_dpi_len:
db 0 // DPI len .byte 0 // DPI len
db 0 .byte 0
dw 0 .word 0
dp_bus: dp_bus:
db 0,0,0,0 // Host bus type .byte 0,0,0,0 // Host bus type
dp_interface: dp_interface:
db 0,0,0,0,0,0,0,0 // Interface type .byte 0,0,0,0,0,0,0,0 // Interface type
db_i_path: db_i_path:
dd 0,0 // Interface path .long 0,0 // Interface path
db_d_path: db_d_path:
dd 0,0 // Device path .long 0,0 // Device path
db 0 .byte 0
db_dpi_csum: db_dpi_csum:
db 0 // Checksum for DPI info .byte 0 // Checksum for DPI info
// //
// EBIOS disk address packet // EBIOS disk address packet
// //
.align 8 .align 8
dapa: dapa:
dw 16 // Packet size .word 16 // Packet size
.count: .count:
dw 0 // Block count .word 0 // Block count
.off: .off:
dw 0 // Offset of buffer .word 0 // Offset of buffer
.seg: .seg:
dw 0 // Segment of buffer .word 0 // Segment of buffer
.lba: .lba:
dd 0 // LBA (LSW) .long 0 // LBA (LSW)
dd 0 // LBA (MSW) .long 0 // LBA (MSW)
.align 4 .align 4
MaxTransfer: MaxTransfer:
dw 2 //32 // Max sectors per transfer .word 2 //32 // Max sectors per transfer
.org 2047 // Pad to file offset 2046 .org 2046 // Pad to file offset 2046
.word 0aa55h // BootSector signature .word HEX(0aa55) // BootSector signature
.endcode16 .endcode16