diff options
author | Kevin O'Connor <kevin@koconnor.net> | 2008-03-11 11:14:59 -0400 |
---|---|---|
committer | Kevin O'Connor <kevin@koconnor.net> | 2008-03-11 11:14:59 -0400 |
commit | ed12849c9b06e371f11596a32da5997c96d9bc95 (patch) | |
tree | 690280737159fb0f8feb42301d37e660517928f2 /src/disk.h | |
parent | 2cdd8b6fb1aced4ec08c5e98705922c27285ddfb (diff) | |
download | seabios-ed12849c9b06e371f11596a32da5997c96d9bc95.tar.gz |
Reduce stack usage for ISRs; minor fixes.
Don't back up all registers on isr handlers - they don't read/modify
them. This saves stack space.
extended_bios_data_area_s must be packed to match ebda spec.
Enable irqs on int 08 - follows old bochs bios code.
Fix bug in int 76 -- should clear disk_interrupt_flag not
floppy_harddisk_info.
Make sure we alert in disk_ret on failure case.
int 18/19 entry points need to setup cld/%ds too.
asm in handle_1587 clobbers flags - note that in clobber list.
Diffstat (limited to 'src/disk.h')
-rw-r--r-- | src/disk.h | 16 |
1 files changed, 9 insertions, 7 deletions
@@ -8,6 +8,7 @@ #include "ioport.h" // outb #include "biosvar.h" // struct bregs +#include "util.h" // set_code_fail #define DISK_RET_SUCCESS 0x00 #define DISK_RET_EPARAM 0x01 @@ -34,7 +35,7 @@ struct int13ext_s { u16 segment; u32 lba1; u32 lba2; -}; +} PACKED; #define GET_INT13EXT(regs,var) \ GET_FARVAR((regs)->ds, ((struct int13ext_s*)((regs)->si+0))->var) @@ -63,7 +64,7 @@ struct int13dpt_s { u8 device_path[8]; u8 reserved3; u8 checksum; -}; +} PACKED; #define GET_INT13DPT(regs,var) \ GET_FARVAR((regs)->ds, ((struct int13dpt_s*)((regs)->si+0))->var) @@ -83,7 +84,7 @@ struct floppy_dbt_s { u8 fill_byte; u8 settle_time; u8 startup_time; -}; +} PACKED; struct floppy_ext_dbt_s { struct floppy_dbt_s dbt; @@ -91,15 +92,17 @@ struct floppy_ext_dbt_s { u8 max_track; u8 data_rate; u8 drive_type; -}; +} PACKED; // Helper function for setting up a return code. static inline void disk_ret(struct bregs *regs, u8 code) { - regs->ah = code; SET_BDA(disk_last_status, code); - set_cf(regs, code); + if (code) + set_code_fail(regs, code); + else + set_code_success(regs); } // floppy.c @@ -109,7 +112,6 @@ void floppy_tick(); // disk.c void emu_access(struct bregs *regs, u8 device, u16 command); -void extended_access(struct bregs *regs, u8 device, u16 command); void disk_13(struct bregs *regs, u8 device); void disk_13XX(struct bregs *regs, u8 device); |