Index: rombios.c =================================================================== RCS file: /cvsroot/bochs/bochs/bios/rombios.c,v retrieving revision 1.110 diff -u -w -r1.110 rombios.c --- rombios.c 31 May 2004 13:11:27 -0000 1.110 +++ rombios.c 7 Oct 2004 21:23:50 -0000 @@ -137,6 +137,7 @@ #define DEBUG_INT16 0 #define DEBUG_INT1A 0 #define DEBUG_INT74 0 +#define DEBUG_APM 0 #define BX_CPU 3 #define BX_USE_PS2_MOUSE 1 @@ -145,6 +146,7 @@ #define BX_SUPPORT_FLOPPY 1 #define BX_FLOPPY_ON_CNT 37 // 2 seconds #define BX_PCIBIOS 1 +#define BX_APM 1 #define BX_USE_ATADRV 1 #define BX_ELTORITO_BOOT 1 @@ -230,17 +232,6 @@ out dx,ax MEND -MACRO HALT2 - ;; the HALT macro is called with the line number of the HALT call. - ;; The line number is then sent to the PANIC_PORT, causing Bochs/Plex - ;; to print a BX_PANIC message. This will normally halt the simulation - ;; with a message such as "BIOS panic at rombios.c, line 4091". - ;; However, users can choose to make panics non-fatal and continue. - mov dx,#PANIC_PORT2 - mov ax,#?1 - out dx,ax -MEND - MACRO JMP_AP db 0xea dw ?2 @@ -1543,15 +1534,12 @@ } if (action & BIOS_PRINTF_HALT) { - // freeze in a busy loop. If I do a HLT instruction, then in versions - // 1.3.pre1 and earlier, it will panic without ever updating the VGA - // display, so the panic message will not be visible. By waiting - // forever, you are certain to see the panic message on screen. - // After a few more versions have passed, we can turn this back into - // a halt or something. - // do {} while (1); + // freeze in a busy loop. ASM_START - HALT2(__LINE__) + cli + halt2_loop: + hlt + jmp halt2_loop ASM_END } } @@ -5412,8 +5400,8 @@ case 0x03: SET_BL( 0x06 ); break; } - DI = 0xefc7; - ES = 0xf000; + DI = read_word(0x00, 0x1e*4); // INT vector 0x1E + ES = read_word(0x00, 0x1e*4+2); goto int13_success; break; @@ -6984,8 +6972,8 @@ } /* set es & di to point to 11 byte diskette param table in ROM */ - DI = 0xefc7; - ES = 0xf000; + DI = read_word(0x00, 0x1e*4); // INT vector 0x1E + ES = read_word(0x00, 0x1e*4+2); CLEAR_CF(); // success /* disk status not changed upon success */ return; @@ -7880,7 +7868,7 @@ mov al, #0x02 out #0x0a, al ;; clear DMA-1 channel 2 mask bit - SET_INT_VECTOR(0x1E, #0xF000, #diskette_param_table) + SET_INT_VECTOR(0x1E, #0xF000, #diskette_param_table2) SET_INT_VECTOR(0x40, #0xF000, #int13_diskette) SET_INT_VECTOR(0x0E, #0xF000, #int0e_handler) ;; IRQ 6 @@ -8344,6 +8332,19 @@ pop ax iret + +;-------------------- +#if BX_APM +use32 386 +#define APM_PROT32 +#include "apmbios.S" +use16 386 + +#define APM_REAL +#include "apmbios.S" + +#endif + ;-------------------- #if BX_PCIBIOS use32 386 @@ -9515,6 +9516,26 @@ pop ds iret +diskette_param_table2: +;; New diskette parameter table adding 3 parameters from IBM +;; Since no provisions are made for multiple drive types, most +;; values in this table are ignored. I set parameters for 1.44M +;; floppy here +db 0xAF +db 0x02 ;; head load time 0000001, DMA used +db 0x25 +db 0x02 +db 18 +db 0x1B +db 0xFF +db 0x6C +db 0xF6 +db 0x0F +db 0x08 +db 79 ;; maximum track +db 0 ;; data transfer rate +db 4 ;; drive type in cmos + .org 0xf045 ; INT 10 Functions 0-Fh Entry Point HALT(__LINE__) iret @@ -9560,6 +9581,10 @@ .org 0xf859 ; INT 15h System Services Entry Point int15_handler: pushf +#if BX_APM + cmp ah, #0x53 + je apm_call +#endif push ds push es pushad @@ -9570,6 +9595,10 @@ popf //JMPL(iret_modify_cf) jmp iret_modify_cf +#if BX_APM +apm_call: + jmp _apmreal_entry +#endif ;; Protected mode IDT descriptor ;;