bios.diff 3.83 KB
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
 ;;