ReactOS  0.4.15-dev-3440-g915569a
bios32.c
Go to the documentation of this file.
1 /*
2  * COPYRIGHT: GPL - See COPYING in the top level directory
3  * PROJECT: ReactOS Virtual DOS Machine
4  * FILE: subsystems/mvdm/ntvdm/bios/bios32/bios32.c
5  * PURPOSE: VDM 32-bit BIOS
6  * PROGRAMMERS: Aleksandar Andrejevic <theflash AT sdf DOT lonestar DOT org>
7  * Hermes Belusca-Maito (hermes.belusca@sfr.fr)
8  */
9 
10 /* INCLUDES *******************************************************************/
11 
12 #include "ntvdm.h"
13 
14 /* BIOS Version number and Copyright */
15 #include <reactos/buildno.h>
16 #include <reactos/version.h>
17 
18 #define NDEBUG
19 #include <debug.h>
20 
21 #include "emulator.h"
22 #include "cpu/cpu.h" // for EMULATOR_FLAG_CF
23 #include "cpu/bop.h"
24 #include "int32.h"
25 #include <isvbop.h>
26 
27 #include <bios/bios.h>
28 #include <bios/rom.h>
29 #include "bios32.h"
30 #include "bios32p.h"
31 #include "dskbios32.h"
32 #include "kbdbios32.h"
33 #include "vidbios32.h"
34 #include "moubios32.h"
35 
36 #include "memory.h"
37 #include "io.h"
38 #include "hardware/cmos.h"
39 #include "hardware/pic.h"
40 #include "hardware/pit.h"
41 #include "hardware/ps2.h"
42 
43 /* PRIVATE VARIABLES **********************************************************/
44 
46 
47 /*
48 
49 Bochs BIOS, see rombios.h
50 =========================
51 
52 // model byte 0xFC = AT
53 #define SYS_MODEL_ID 0xFC
54 #define SYS_SUBMODEL_ID 0x00
55 #define BIOS_REVISION 1
56 #define BIOS_CONFIG_TABLE 0xe6f5
57 
58 #ifndef BIOS_BUILD_DATE
59 # define BIOS_BUILD_DATE "06/23/99"
60 #endif
61 
62 // 1K of base memory used for Extended Bios Data Area (EBDA)
63 // EBDA is used for PS/2 mouse support, and IDE BIOS, etc.
64 #define EBDA_SEG 0x9FC0
65 #define EBDA_SIZE 1 // In KiB
66 #define BASE_MEM_IN_K (640 - EBDA_SIZE)
67 
68 
69 See rombios.c
70 =============
71 
72 ROM BIOS compatibility entry points:
73 ===================================
74 $e05b ; POST Entry Point
75 $e2c3 ; NMI Handler Entry Point
76 $e3fe ; INT 13h Fixed Disk Services Entry Point
77 $e401 ; Fixed Disk Parameter Table
78 $e6f2 ; INT 19h Boot Load Service Entry Point
79 $e6f5 ; Configuration Data Table
80 $e729 ; Baud Rate Generator Table
81 $e739 ; INT 14h Serial Communications Service Entry Point
82 $e82e ; INT 16h Keyboard Service Entry Point
83 $e987 ; INT 09h Keyboard Service Entry Point
84 $ec59 ; INT 13h Diskette Service Entry Point
85 $ef57 ; INT 0Eh Diskette Hardware ISR Entry Point
86 $efc7 ; Diskette Controller Parameter Table
87 $efd2 ; INT 17h Printer Service Entry Point
88 $f045 ; INT 10 Functions 0-Fh Entry Point
89 $f065 ; INT 10h Video Support Service Entry Point
90 $f0a4 ; MDA/CGA Video Parameter Table (INT 1Dh)
91 $f841 ; INT 12h Memory Size Service Entry Point
92 $f84d ; INT 11h Equipment List Service Entry Point
93 $f859 ; INT 15h System Services Entry Point
94 $fa6e ; Character Font for 320x200 & 640x200 Graphics (lower 128 characters)
95 $fe6e ; INT 1Ah Time-of-day Service Entry Point
96 $fea5 ; INT 08h System Timer ISR Entry Point
97 $fef3 ; Initial Interrupt Vector Offsets Loaded by POST
98 $ff53 ; IRET Instruction for Dummy Interrupt Handler
99 $ff54 ; INT 05h Print Screen Service Entry Point
100 $fff0 ; Power-up Entry Point
101 $fff5 ; ASCII Date ROM was built - 8 characters in MM/DD/YY
102 $fffe ; System Model ID
103 
104 */
105 
106 /*
107  * See Ralf Brown: http://www.ctyme.com/intr/rb-1594.htm#Table515
108  * for more information.
109  */
110 #define BIOS_MODEL 0xFC // PC-AT
111 #define BIOS_SUBMODEL 0x01 // AT models 319,339 8 MHz, Enh Keyb, 3.5"
112 #define BIOS_REVISION 0x00
113 // FIXME: Find a nice PS/2 486 + 487 BIOS combination!
114 
116 {
117  sizeof(BIOS_CONFIG_TABLE) - sizeof(((BIOS_CONFIG_TABLE*)0)->Length), // Length: Number of bytes following
118 
119  BIOS_MODEL, // BIOS Model
120  BIOS_SUBMODEL, // BIOS Sub-Model
121  BIOS_REVISION, // BIOS Revision
122 
123  // Feature bytes
124  {
125  0x78, // At the moment we don't have any Extended BIOS Area; see http://www.ctyme.com/intr/rb-1594.htm#Table510
126  0x00, // We don't support anything from here; see http://www.ctyme.com/intr/rb-1594.htm#Table511
127  0x10, // Bit 4: POST supports ROM-to-RAM enable/disable
128  0x00,
129  0x00
130  }
131 };
132 
133 
134 /*
135  * WARNING! For compatibility purposes the string "IBM" should be at F000:E00E .
136  * Some programs otherwise look for "COPR. IBM" at F000:E008 .
137  */
138 static const CHAR BiosCopyright[] = "0000000 NTVDM IBM COMPATIBLE 486 BIOS COPYRIGHT (C) ReactOS Team 1996-"COPYRIGHT_YEAR;
139 static const CHAR BiosVersion[] = "ReactOS NTVDM 32-bit BIOS Version "KERNEL_VERSION_STR"\0"
140  "BIOS32 Version "KERNEL_VERSION_STR" (Build "KERNEL_VERSION_BUILD_STR")";
141 static const CHAR BiosDate[] = "06/17/13";
142 
143 C_ASSERT(sizeof(BiosCopyright)-1 <= 0x5B); // Ensures that we won't overflow on the POST Code starting at F000:E05B
144 C_ASSERT(sizeof(BiosDate)-1 == 0x08);
145 
146 /* 16-bit bootstrap code at F000:FFF0 */
147 static const BYTE Bootstrap[] =
148 {
149  0xEA, // jmp far ptr
150  0x5B, 0xE0, 0x00, 0xF0, // F000:E05B
151 };
152 
153 /*
154  * POST code at F000:E05B. All the POST is done in 32 bit
155  * and only at the end it calls the bootstrap interrupt.
156  */
157 static const BYTE PostCode[] =
158 {
159  LOBYTE(EMULATOR_BOP), HIBYTE(EMULATOR_BOP), BOP_RESET, // Call BIOS POST
160  0xCD, BIOS_BOOTSTRAP_LOADER, // INT 0x19
161  0xCD, BIOS_ROM_BASIC, // INT 0x18
163 };
164 
165 
166 /* PRIVATE FUNCTIONS **********************************************************/
167 
168 static VOID BiosCharPrint(CHAR Character)
169 {
170  /* Save AX and BX */
171  USHORT AX = getAX();
172  USHORT BX = getBX();
173 
174  /*
175  * Set the parameters:
176  * AL contains the character to print,
177  * BL contains the character attribute,
178  * BH contains the video page to use.
179  */
180  setAL(Character);
182  setBH(Bda->VideoPage);
183 
184  /* Call the BIOS INT 10h, AH=0Eh "Teletype Output" */
185  setAH(0x0E);
187 
188  /* Restore AX and BX */
189  setBX(BX);
190  setAX(AX);
191 }
192 
194 {
195  /* Get the exception number and call the emulator API */
196  BYTE ExceptionNumber = LOBYTE(Stack[STACK_INT_NUM]);
197  EmulatorException(ExceptionNumber, Stack);
198 }
199 
201 {
202  /* Return the equipment list */
204 }
205 
207 {
208  /* Return the conventional memory size in kB, typically 640 kB */
209  setAX(Bda->MemorySize);
210 }
211 
213 {
214  switch (getAH())
215  {
216  /* OS Hooks for Multitasking */
217  case 0x80: // Device Open
218  case 0x81: // Device Close
219  case 0x82: // Program Termination
220  case 0x90: // Device Busy
221  case 0x91: // Device POST
222  {
223  /* Return success by default */
224  setAH(0x00);
226  break;
227  }
228 
229  /* Wait on External Event */
230  case 0x41:
231  {
232  BYTE Value;
233  BOOLEAN Return;
234  static DWORD StartingCount;
235 
236  /* Check if this is the first time this BOP occurred */
237  if (!getCF())
238  {
239  /* Set the starting count */
240  StartingCount = Bda->TickCounter;
241  }
242 
243  if (getBL() != 0 && (Bda->TickCounter - StartingCount) >= getBL())
244  {
245  /* Timeout expired */
246  setCF(0);
247  break;
248  }
249 
250  if (getAL() & (1 << 4))
251  {
252  /* Read from the I/O port */
253  Value = IOReadB(getDX());
254  }
255  else
256  {
257  /* Read from the memory */
259  }
260 
261  switch (getAL() & 7)
262  {
263  /* Any external event */
264  case 0:
265  {
266  /* Return if this is not the first time the BOP occurred */
267  Return = getCF();
268  break;
269  }
270 
271  /* Compare and return if equal */
272  case 1:
273  {
274  Return = Value == getBH();
275  break;
276  }
277 
278  /* Compare and return if not equal */
279  case 2:
280  {
281  Return = Value != getBH();
282  break;
283  }
284 
285  /* Test and return if not zero */
286  case 3:
287  {
288  Return = (Value & getBH()) != 0;
289  break;
290  }
291 
292  /* Test and return if zero */
293  case 4:
294  {
295  Return = (Value & getBH()) == 0;
296  break;
297  }
298 
299  default:
300  {
301  DPRINT1("INT 15h, AH = 41h - Unknown condition type: %u\n", getAL() & 7);
302  Return = TRUE;
303  break;
304  }
305  }
306 
307  /* Repeat the BOP if we shouldn't return */
308  setCF(!Return);
309  break;
310  }
311 
312  /* Keyboard intercept */
313  case 0x4F:
314  {
315  /* CF should be set but let's just set it again just in case */
316  /* Do not modify AL (the hardware scan code), but set CF to continue processing */
317  // setCF(1);
319  break;
320  }
321 
322  /* Wait */
323  case 0x86:
324  {
325  /*
326  * Interval in microseconds in CX:DX
327  * See Ralf Brown: http://www.ctyme.com/intr/rb-1525.htm
328  * for more information.
329  */
330 
331  static ULONG CompletionTime = 0;
332 
333  /* Check if we're already looping */
334  if (getCF())
335  {
336  if (GetTickCount() >= CompletionTime)
337  {
338  /* Stop looping */
339  setCF(0);
340 
341  /* Clear the CF on the stack too */
343  }
344  }
345  else
346  {
347  /* Set the CF on the stack */
349 
350  /* Set the completion time and start looping */
351  CompletionTime = GetTickCount() + (MAKELONG(getDX(), getCX()) / 1000);
352  setCF(1);
353  }
354 
355  break;
356  }
357 
358  /* Copy Extended Memory */
359  case 0x87:
360  {
361  DWORD Count = (DWORD)getCX() * 2;
362  PFAST486_GDT_ENTRY Gdt = (PFAST486_GDT_ENTRY)SEG_OFF_TO_PTR(getES(), getSI());
363  DWORD SourceBase = Gdt[2].Base + (Gdt[2].BaseMid << 16) + (Gdt[2].BaseHigh << 24);
364  DWORD SourceLimit = Gdt[2].Limit + (Gdt[2].LimitHigh << 16);
365  DWORD DestBase = Gdt[3].Base + (Gdt[3].BaseMid << 16) + (Gdt[3].BaseHigh << 24);
366  DWORD DestLimit = Gdt[3].Limit + (Gdt[3].LimitHigh << 16);
367 
368  /* Check for flags */
369  if (Gdt[2].Granularity) SourceLimit = (SourceLimit << 12) | 0xFFF;
370  if (Gdt[3].Granularity) DestLimit = (DestLimit << 12) | 0xFFF;
371 
372  if ((Count > SourceLimit) || (Count > DestLimit))
373  {
374  setAX(0x80);
376  break;
377  }
378 
379  /* Copy */
380  RtlMoveMemory((PVOID)((ULONG_PTR)BaseAddress + DestBase),
381  (PVOID)((ULONG_PTR)BaseAddress + SourceBase),
382  Count);
383 
386  break;
387  }
388 
389  /* Get Extended Memory Size */
390  case 0x88:
391  {
392  UCHAR Low, High;
393 
394  /*
395  * Return the (usable) extended memory (after 1 MB)
396  * size in kB from CMOS.
397  */
402  setAX(MAKEWORD(Low, High));
403 
404  /* Clear CF */
406  break;
407  }
408 
409  /* Switch to Protected Mode */
410  case 0x89:
411  {
412  DPRINT1("BIOS INT 15h, AH=89h \"Switch to Protected Mode\" is UNIMPLEMENTED");
413 
415  goto Default;
416  }
417 
418  /* Get Configuration */
419  case 0xC0:
420  {
421  /* Return the BIOS ROM Configuration Table address in ES:BX */
422  // The BCT is found at F000:E6F5 for 100% compatible BIOSes.
424  setBX(0xE6F5);
425 
426  /* Call successful; clear CF */
427  setAH(0x00);
429  break;
430  }
431 
432  /* Return Extended-Bios Data-Area Segment Address (PS) */
433  case 0xC1:
434  {
435  /* We do not support EBDA yet */
438  goto Default;
439  }
440 
441  /* Pointing Device BIOS Interface (PS) */
442  case 0xC2:
443  {
444  // FIXME: Reenable this call when we understand why
445  // our included mouse driver doesn't correctly reeanble
446  // mouse reporting!
447  // BiosMousePs2Interface(Stack);
448  // break;
449  goto Default;
450  }
451 
452  /* Get CPU Type and Mask Revision */
453  case 0xC9:
454  {
455  /*
456  * We can see this function as a CPUID replacement.
457  * See Ralf Brown: http://www.ctyme.com/intr/rb-1613.htm
458  * for more information.
459  */
460 
461  /*
462  * Fast486 is a 486DX with FPU included,
463  * but old enough to not support CPUID.
464  */
465  setCX(0x0400);
466 
467  /* Call successful; clear CF */
468  setAH(0x00);
470  break;
471  }
472 
473  /* Get System Memory Map */
474  case 0xE8:
475  {
476  if (getAL() == 0x01)
477  {
478  /* The amount of memory between 1M and 16M, in kilobytes */
479  ULONG Above1M = (min(MAX_ADDRESS, 0x01000000) - 0x00100000) >> 10;
480 
481  /* The amount of memory above 16M, in 64K blocks */
482  ULONG Above16M = (MAX_ADDRESS > 0x01000000) ? ((MAX_ADDRESS - 0x01000000) >> 16) : 0;
483 
484  setAX(Above1M);
485  setBX(Above16M);
486  setCX(Above1M);
487  setDX(Above16M);
488 
490  }
491  else if (getAL() == 0x20 && getEDX() == 'SMAP')
492  {
493  ULONG Offset = getEBX();
494  ULONG Length;
495  ULONG BytesWritten = 0;
496  BOOLEAN Hooked;
498 
499  /* Assume the buffer won't be large enough */
501 
502  while (BytesWritten < getECX() && (ULONG_PTR)Map < (MAX_ADDRESS - sizeof(BIOS_MEMORY_MAP)))
503  {
504  /* Let's ask our memory controller */
505  if (!MemQueryMemoryZone(Offset, &Length, &Hooked))
506  {
507  /* No more memory blocks */
509  break;
510  }
511 
512  Map->BaseAddress = (ULONGLONG)Offset;
513  Map->Length = (ULONGLONG)Length;
515 
516  /* Go to the next record */
517  Map++;
518  Offset += Length;
519  BytesWritten += sizeof(BIOS_MEMORY_MAP);
520  }
521 
522  setEAX('SMAP');
523  setEBX(Offset);
525  }
526  else
527  {
528  DPRINT1("BIOS Function INT 15h, AH = 0xE8 - unexpected AL = %02X, EDX = %08X\n",
529  getAL(), getEDX());
530  }
531 
532  break;
533  }
534 
535  default: Default:
536  {
537  DPRINT1("BIOS Function INT 15h, AH = 0x%02X NOT IMPLEMENTED\n",
538  getAH());
539 
540  /*
541  * The original signification of the error code 0x86 is that
542  * no PC Cassette is present. The CF is also set in this case.
543  * To keep backward compatibility, newer BIOSes use this value
544  * to indicate an unimplemented call in INT 15h.
545  */
546  setAH(0x86);
548  }
549  }
550 }
551 
553 {
554  PrintMessageAnsi(BiosCharPrint, "FATAL: INT18: BOOT FAILURE.");
555 
556  /* ROM Basic is unsupported, display a message to the user */
557  DisplayMessage(L"NTVDM doesn't support ROM Basic. The VDM is closing.");
558 
559  /* Stop the VDM */
561 }
562 
563 
566 
568 {
569  USHORT BootOrder;
570 
571  USHORT AX, BX, CX, DX, ES;
572  AX = getAX();
573  BX = getBX();
574  CX = getCX();
575  DX = getDX();
576  ES = getES();
577 
578  /*
579  * Read the boot sequence order from the CMOS, old behaviour AMI-style.
580  *
581  * For more information, see:
582  * http://www.virtualbox.org/svn/vbox/trunk/src/VBox/Devices/PC/BIOS/orgs.asm
583  * http://www.virtualbox.org/svn/vbox/trunk/src/VBox/Devices/PC/BIOS/boot.c
584  * http://bochs.sourceforge.net/cgi-bin/lxr/source/iodev/cmos.cc
585  * https://web.archive.org/web/20111209041013/http://www-ivs.cs.uni-magdeburg.de/~zbrog/asm/cmos.html
586  * http://www.bioscentral.com/misc/cmosmap.htm
587  */
589  BootOrder = (IOReadB(CMOS_DATA_PORT) & 0x20) >> 5;
590 
591  /*
592  * BootOrder =
593  * 0: Hard Disk, then Floppy Disk
594  * 1: Floppy Disk, then Hard Disk
595  * In all cases, if booting from those devices failed,
596  * ROM DOS-32 is started. If it fails, INT 18h is called.
597  */
598 
599  DPRINT("BiosBootstrapLoader (BootOrder = 0x%02X) -->\n", BootOrder);
600 
601  /*
602  * Format of the BootOrder command:
603  * 2 bytes. Each half-byte contains the ID of the drive to boot.
604  * Currently defined:
605  * 0x0: 1st Floppy disk
606  * 0x1: 1st Hard disk
607  * Other, or 0xF: Stop boot sequence.
608  */
609  BootOrder = 0xFF00 | ((1 << (4 * BootOrder)) & 0xFF);
610 
611 Retry:
612  switch (BootOrder & 0x0F)
613  {
614  /* Boot from 1st floppy drive */
615  case 0:
616  {
617  setAH(0x02); // Read sectors
618  setAL(0x01); // Number of sectors
619  setDH(0x00); // Head 0
620  setCH(0x00); // Cylinder 0
621  setCL(0x01); // Sector 1
622  setDL(0x00); // First diskette drive (used by loader code, so should not be cleared)
623  setES(0x0000); // Write data in 0000:7C00
624  setBX(0x7C00);
626  if (!(Stack[STACK_FLAGS] & EMULATOR_FLAG_CF)) goto Quit;
627 #ifdef ADVANCED_DEBUGGING
628  DPRINT1("An error happened while loading the bootsector from floppy 0, error = %d\n", getAH());
629 #endif
630 
631  break;
632  }
633 
634  /* Boot from 1st HDD drive */
635  case 1:
636  {
637  setAH(0x02); // Read sectors
638  setAL(0x01); // Number of sectors
639  setDH(0x00); // Head 0
640  setCH(0x00); // Cylinder 0
641  setCL(0x01); // Sector 1
642  setDL(0x80); // First HDD drive (used by loader code, so should not be cleared)
643  setES(0x0000); // Write data in 0000:7C00
644  setBX(0x7C00);
646  if (!(Stack[STACK_FLAGS] & EMULATOR_FLAG_CF)) goto Quit;
647 #ifdef ADVANCED_DEBUGGING
648  DPRINT1("An error happened while loading the bootsector from HDD 0, error = %d\n", getAH());
649 #endif
650 
651  break;
652  }
653 
654  default:
655  goto StartDos;
656  }
657 
658  /* Go to next drive and invalidate the last half-byte. */
659  BootOrder = (BootOrder >> 4) | 0xF000;
660  goto Retry;
661 
662 StartDos:
663  /* Clear everything, we are going to load DOS32 */
664  setAX(AX);
665  setBX(BX);
666  setCX(CX);
667  setDX(DX);
668  setES(ES);
670 
671  /* Load our DOS */
673 
674 Quit:
675  /*
676  * Jump to 0000:7C00 to boot the OS.
677  *
678  * Since we are called via the INT32 mechanism, we need to correctly set
679  * CS:IP, not by changing the current one (otherwise the interrupt could
680  * not be clean up and return properly), but by changing the CS:IP in the
681  * stack, so that when the interrupt returns, the modified CS:IP is popped
682  * off the stack and the CPU is correctly repositioned.
683  */
684  Stack[STACK_CS] = 0x0000;
685  Stack[STACK_IP] = 0x7C00;
686 
687  DPRINT("<-- BiosBootstrapLoader\n");
688 }
689 
691 {
692  switch (getAH())
693  {
694  /* Get System Time */
695  case 0x00:
696  {
697  /* Set AL to 1 if midnight had passed, 0 otherwise */
698  setAL(Bda->MidnightPassed ? 0x01 : 0x00);
699 
700  /* Return the tick count in CX:DX */
703 
704  /* Reset the midnight flag */
706 
707  break;
708  }
709 
710  /* Set System Time */
711  case 0x01:
712  {
713  /* Set the tick count to CX:DX */
715 
716  /* Reset the midnight flag */
718 
719  break;
720  }
721 
722  /* Get Real-Time Clock Time */
723  case 0x02:
724  {
725  UCHAR StatusB;
726 
729 
732 
735 
736  /* Daylight Savings Time */
738  StatusB = IOReadB(CMOS_DATA_PORT);
739  setDL(StatusB & 0x01);
740 
741  /* Clear CF */
743  break;
744  }
745 
746  // /* Set Real-Time Clock Time */
747  // case 0x03:
748  // {
749  // break;
750  // }
751 
752  /* Get Real-Time Clock Date */
753  case 0x04:
754  {
757 
760 
763 
766 
767  /* Clear CF */
769  break;
770  }
771 
772  // /* Set Real-Time Clock Date */
773  // case 0x05:
774  // {
775  // break;
776  // }
777 
778  default:
779  {
780  DPRINT1("BIOS Function INT 1Ah, AH = 0x%02X NOT IMPLEMENTED\n",
781  getAH());
782  }
783  }
784 }
785 
787 {
788  /* Increase the system tick count */
789  Bda->TickCounter++;
790 }
791 
792 
793 // From SeaBIOS
795 {
796  UCHAR pic1off = off, pic1on = on, pic2off = off>>8, pic2on = on>>8;
797  IOWriteB(PIC_MASTER_DATA, (IOReadB(PIC_MASTER_DATA) & ~pic1off) | pic1on);
798  IOWriteB(PIC_SLAVE_DATA , (IOReadB(PIC_SLAVE_DATA ) & ~pic2off) | pic2on);
799 }
800 
801 // From SeaBIOS
803 {
804  UCHAR vector;
805 
806  PicSetIRQMask(1 << hwirq, 0);
807  if (hwirq < 8)
808  vector = BIOS_PIC_MASTER_INT + hwirq;
809  else
810  vector = BIOS_PIC_SLAVE_INT + hwirq - 8;
811 
813 }
814 
815 
817 {
818  /*
819  * If this was a PIC IRQ, send an End-of-Interrupt to the PIC.
820  */
821  if (IntNum >= BIOS_PIC_MASTER_INT && IntNum < BIOS_PIC_MASTER_INT + 8)
822  {
823  /* It was an IRQ from the master PIC */
825  }
826  else if (IntNum >= BIOS_PIC_SLAVE_INT && IntNum < BIOS_PIC_SLAVE_INT + 8)
827  {
828  /* It was an IRQ from the slave PIC */
831  }
832 }
833 
835 {
836  BYTE IrqNumber;
837 
838  IOWriteB(PIC_MASTER_CMD, PIC_OCW3_READ_ISR /* == 0x0B */);
839  IrqNumber = IOReadB(PIC_MASTER_CMD);
840 
841  DPRINT("Master - IrqNumber = 0x%02X\n", IrqNumber);
842 
844 }
845 
847 {
848  BYTE IrqNumber;
849 
850  IOWriteB(PIC_SLAVE_CMD, PIC_OCW3_READ_ISR /* == 0x0B */);
851  IrqNumber = IOReadB(PIC_SLAVE_CMD);
852 
853  DPRINT("Slave - IrqNumber = 0x%02X\n", IrqNumber);
854 
856 }
857 
858 // Timer IRQ 0
860 {
861  /*
862  * Perform the system timer interrupt.
863  *
864  * Do not call directly BiosSystemTimerInterrupt(Stack);
865  * because some programs may hook only BIOS_SYS_TIMER_INTERRUPT
866  * for their purpose...
867  */
868 
869  WORD AX = getAX();
870  WORD CX = getCX();
871  WORD DX = getDX();
872  WORD BX = getBX();
873  WORD BP = getBP();
874  WORD SI = getSI();
875  WORD DI = getDI();
876  WORD DS = getDS();
877  WORD ES = getES();
878 
880 
881  setAX(AX);
882  setCX(CX);
883  setDX(DX);
884  setBX(BX);
885  setBP(BP);
886  setSI(SI);
887  setDI(DI);
888  setDS(DS);
889  setES(ES);
890  setCF(0);
891 
892  // BiosSystemTimerInterrupt(Stack);
894 }
895 
896 
898 {
899  /* Initialize the master and the slave PICs (cascade mode) */
902 
903  /*
904  * Set the interrupt vector offsets for each PIC
905  * (base IRQs: 0x08-0x0F for IRQ 0-7, 0x70-0x77 for IRQ 8-15)
906  */
909 
910  /* Tell the master PIC that there is a slave PIC at IRQ 2 */
911  IOWriteB(PIC_MASTER_DATA, 1 << 2);
912  /* Tell the slave PIC its cascade identity */
914 
915  /* Make sure both PICs are in 8086 mode */
918 
919  /* Clear the masks for both PICs */
920  // IOWriteB(PIC_MASTER_DATA, 0x00);
921  // IOWriteB(PIC_SLAVE_DATA , 0x00);
922  /* Disable all IRQs */
923  IOWriteB(PIC_MASTER_DATA, 0xFF);
924  IOWriteB(PIC_SLAVE_DATA , 0xFF);
925 
926 
927  /* Initialize PIT Counter 0 - Mode 2, 16bit binary count */
928  // NOTE: Some BIOSes set it to Mode 3 instead.
929  IOWriteB(PIT_COMMAND_PORT, 0x34);
930  // 18.2Hz refresh rate
931  IOWriteB(PIT_DATA_PORT(0), 0x00);
932  IOWriteB(PIT_DATA_PORT(0), 0x00);
933 
934  /* Initialize PIT Counter 1 - Mode 2, 8bit binary count */
935  IOWriteB(PIT_COMMAND_PORT, 0x54);
936  // DRAM refresh every 15ms: http://www.cs.dartmouth.edu/~spl/Academic/Organization/docs/PC%20Timer%208253.html
937  IOWriteB(PIT_DATA_PORT(1), 18);
938 
939  /* Initialize PIT Counter 2 - Mode 3, 16bit binary count */
940  IOWriteB(PIT_COMMAND_PORT, 0xB6);
941  // Count for 440Hz
942  IOWriteB(PIT_DATA_PORT(2), 0x97);
943  IOWriteB(PIT_DATA_PORT(2), 0x0A);
944 
945 
946  /* Initialize PS/2 keyboard port */
947  // Enable the port
948  IOWriteB(PS2_CONTROL_PORT, 0xAE);
949  // Port interrupts and clock enabled,
950  // enable keyboard scancode translation.
951  // POST passed, force keyboard unlocking.
952  IOWriteB(PS2_CONTROL_PORT, 0x60);
953  IOWriteB(PS2_DATA_PORT , 0x6D);
954  // Enable data reporting
955  IOWriteB(PS2_DATA_PORT , 0xF4);
956 
958 }
959 
961 {
962  USHORT i;
963 
964  /* Initialize the callback context */
966 
967  /* Register the default BIOS interrupt vectors */
968 
969  /*
970  * Zero out all of the IVT (0x00 -- 0xFF). Some applications
971  * indeed expect to have free vectors at the end of the IVT.
972  */
973  RtlZeroMemory(BaseAddress, 0x0100 * sizeof(ULONG));
974 
975 #if defined(ADVANCED_DEBUGGING) && (ADVANCED_DEBUGGING_LEVEL >= 3)
976  // Initialize all the interrupt vectors to the default one.
977  for (i = 0x00; i <= 0xFF; i++)
979 #endif
980 
981  /* Initialize the exception interrupt vectors to a default Exception handler */
982  for (i = 0x00; i <= 0x07; i++)
984 
985  /* Initialize HW interrupt vectors to a default HW handler */
986  for (i = BIOS_PIC_MASTER_INT; i < BIOS_PIC_MASTER_INT + 8; i++) // 0x08 -- 0x0F
988  for (i = BIOS_PIC_SLAVE_INT ; i < BIOS_PIC_SLAVE_INT + 8; i++) // 0x70 -- 0x77
990 
991  /* Initialize software vector handlers */
992  // BIOS_VIDEO_INTERRUPT : 0x10 (vidbios32.c)
995  // BIOS_DISK_INTERRUPT : 0x13 (dskbios32.c)
996  // BIOS_SERIAL_INTERRUPT : 0x14 -- UNIMPLEMENTED
998  // BIOS_KBD_INTERRUPT : 0x16 (kbdbios32.c)
999  // BIOS_PRINTER_INTERRUPT: 0x17 -- UNIMPLEMENTED
1003  // BIOS_KBD_CTRL_BREAK_INTERRUPT: 0x1B -- UNIMPLEMENTED
1005 
1006  /* Vectors that should be implemented (see above) */
1007  RegisterBiosInt32(0x14, NULL);
1008  RegisterBiosInt32(0x17, NULL);
1009  RegisterBiosInt32(0x1B, NULL);
1010  RegisterBiosInt32(0x4A, NULL); // User Alarm Handler
1011 
1012  /* Relocated services by the BIOS (when needed) */
1013  RegisterBiosInt32(0x40, NULL); // ROM BIOS Diskette Handler relocated by Hard Disk BIOS
1014  RegisterBiosInt32(0x42, NULL); // Relocated Default INT 10h Video Services
1015 
1016  /* Miscellaneous unimplemented vector handlers that should better have a default one */
1017  RegisterBiosInt32(0x4B, NULL); // Virtual DMA Specification Services
1018  RegisterBiosInt32(0x5C, NULL); // NetBIOS
1019 
1020  // ROM-BASIC interrupts span from 0x80 up to 0xEF.
1021  // They don't have any default handler at the moment.
1022 
1023  /* Some vectors are in fact addresses to tables */
1024  ((PULONG)BaseAddress)[0x1D] = NULL32; // Video Parameter Tables
1025  ((PULONG)BaseAddress)[0x1E] = NULL32; // Diskette Parameters
1026  ((PULONG)BaseAddress)[0x1F] = NULL32; // 8x8 Graphics Font
1027  ((PULONG)BaseAddress)[0x41] = NULL32; // Hard Disk 0 Parameter Table Address
1028  ((PULONG)BaseAddress)[0x43] = NULL32; // Character Table (EGA, MCGA, VGA)
1029  ((PULONG)BaseAddress)[0x46] = NULL32; // Hard Disk 1 Drive Parameter Table Address
1030  /* Tables that are always uninitialized */
1031  ((PULONG)BaseAddress)[0x44] = NULL32; // ROM BIOS Character Font, Characters 00h-7Fh (PCjr)
1032  ((PULONG)BaseAddress)[0x48] = NULL32; // Cordless Keyboard Translation (PCjr)
1033  ((PULONG)BaseAddress)[0x49] = NULL32; // Non-Keyboard Scan-code Translation Table (PCJr)
1034 }
1035 
1037 {
1038  UCHAR Low, High;
1039 
1040  /* Initialize the BDA contents */
1041  RtlZeroMemory(Bda, sizeof(*Bda));
1042 
1043  /*
1044  * Retrieve the basic equipment list from the CMOS
1045  */
1048  // TODO: Update it if required.
1049  Bda->EquipmentList &= 0x00FF; // High byte cleared for now...
1050 
1051  /*
1052  * Retrieve the conventional memory size
1053  * in kB from the CMOS, typically 640 kB.
1054  */
1060 }
1061 
1062 
1063 /*
1064  * The BIOS POST (Power On-Self Test)
1065  */
1066 /*static*/ VOID
1067 WINAPI
1069 {
1070  static BOOLEAN FirstBoot = TRUE;
1071  BYTE ShutdownStatus;
1072 
1073  /*
1074  * Initialize BIOS/Keyboard/Video RAM dynamic data
1075  */
1076 
1077  DPRINT("Bios32Post\n");
1078 
1079  /* Disable interrupts */
1080  setIF(0);
1081 
1082  /* Set the data segment */
1083  setDS(BDA_SEGMENT);
1084 
1085  /* Initialize the stack */
1086  // Temporary stack for POST (to be used only before initializing the INT vectors)
1087  // setSS(0x0000);
1088  // setSP(0x0400);
1089  //
1090  // Stack to be used after the initialization of the INT vectors
1091  setSS(0x0000); // Stack at 00:8000, going downwards
1092  setSP(0x8000);
1093 
1094  /*
1095  * Perform early CMOS shutdown status checks
1096  */
1097 
1098  /* Read the CMOS shutdown status byte and reset it */
1100  ShutdownStatus = IOReadB(CMOS_DATA_PORT);
1102  IOWriteB(CMOS_DATA_PORT, 0x00);
1103 
1104  DPRINT1("Bda->SoftReset = 0x%04X ; ShutdownStatus = 0x%02X\n",
1105  Bda->SoftReset, ShutdownStatus);
1106 
1107  switch (ShutdownStatus)
1108  {
1109  /* Shutdown after Memory Tests (unsupported) */
1110  case 0x01: case 0x02: case 0x03:
1111  /* Shutdown after Protected Mode Tests (unsupported) */
1112  case 0x06: case 0x07: case 0x08:
1113  /* Shutdown after Block Move Test (unsupported) */
1114  case 0x09:
1115  {
1116  DisplayMessage(L"Unsupported CMOS Shutdown Status value 0x%02X. The VDM will shut down.", ShutdownStatus);
1118  return;
1119  }
1120 
1121  /* Shutdown to Boot Loader */
1122  case 0x04:
1123  {
1124  DPRINT1("Fast restart to Bootstrap Loader...\n");
1125  goto Quit; // Reenable interrupts and exit.
1126  }
1127 
1128  /* Flush keyboard, issue an EOI... */
1129  case 0x05:
1130  {
1132 
1133  /* Send EOI */
1136 
1137  // Fall back
1138  }
1139 
1140  /*
1141  * ... and far JMP to user-specified location at 0040:0067
1142  * (Bda->ResumeEntryPoint) with interrupts and NMI disabled.
1143  */
1144  case 0x0A:
1145  {
1146  DPRINT1("Bda->ResumeEntryPoint = %04X:%04X\n",
1149 
1150  /* Position execution pointers and return with interrupts disabled */
1153  return;
1154  }
1155 
1156  /* Soft reset or unexpected shutdown... */
1157  case 0x00:
1158  /* ... or other possible shutdown codes: just continue the POST */
1159  default:
1160  break;
1161  }
1162 
1163  /*
1164  * FIXME: UNIMPLEMENTED!
1165  * Check the word at 0040h:0072h (Bda->SoftReset) and do one of the
1166  * following actions:
1167  * - if the word is 0000h, perform a cold reboot (aka. Reset). Everything gets initialized.
1168  * - if the word is 1234h, perform a warm reboot (aka. Ctrl-Alt-Del). Some stuff is skipped.
1169  */
1170  switch (Bda->SoftReset)
1171  {
1172  case 0x0000:
1173  {
1174  if (!FirstBoot)
1175  {
1176  DisplayMessage(L"NTVDM is performing a COLD reboot! The program you are currently testing does not seem to behave correctly! The VDM will shut down...");
1178  return;
1179  }
1180  break;
1181  }
1182 
1183  case 0x1234:
1184  {
1185  DisplayMessage(L"NTVDM is performing a WARM reboot! This is not supported at the moment. The VDM will shut down...");
1187  return;
1188  }
1189 
1190  default:
1191  break;
1192  }
1193 
1194  FirstBoot = FALSE;
1195 
1196  /* Initialize the BDA */
1198 
1199  /* Initialize the User Data Area at 0050:XXXX */
1200  RtlZeroMemory(SEG_OFF_TO_PTR(0x50, 0x0000), sizeof(USER_DATA_AREA));
1201 
1202 
1203 
1205 
1206  /*
1207  * Initialize IVT and hardware
1208  */
1209 
1210  // WriteUnProtectRom(...);
1211 
1212  /* Register the BIOS 32-bit Interrupts */
1214 
1215  /* Initialize platform hardware (PIC/PIT chips, ...) */
1216  BiosHwSetup();
1217 
1218  /* Initialize the Keyboard, Video and Mouse BIOS */
1219  KbdBios32Post();
1220  VidBiosPost();
1221  MouseBios32Post();
1222  DiskBios32Post();
1223 
1224  // WriteProtectRom(...);
1225 
1227 
1228 
1229 
1231 
1232  /*
1233  * End of the 32-bit POST portion. We then fall back into 16-bit where
1234  * the rest of the POST code is executed, typically calling INT 19h
1235  * to boot up the OS.
1236  */
1237 
1238 Quit:
1239  /* Enable interrupts */
1240  setIF(1);
1241 }
1242 
1243 
1244 /* PUBLIC FUNCTIONS ***********************************************************/
1245 
1247 {
1248  /*
1249  * Initialize BIOS/Keyboard/Video ROM static data
1250  */
1251 
1252  /* System BIOS Copyright */
1254 
1255  /* System BIOS Version */
1257 
1258  /* System BIOS Date */
1260 
1261  /* Bootstrap code */
1264 
1265  /* BIOS ROM Information */
1267 
1268  /* System BIOS Model (same as Bct->Model) */
1270 
1271  /* Initialize the Keyboard and Video BIOS */
1273  {
1274  /* Stop the VDM */
1276  return FALSE;
1277  }
1278 
1279  /* Redefine our POST function */
1281 
1283  ROM_AREA_END - TO_LINEAR(BIOS_SEGMENT, 0x0000) + 1);
1284 
1285  /* We are done */
1286  return TRUE;
1287 }
1288 
1290 {
1293  VidBios32Cleanup();
1294  KbdBiosCleanup();
1295 }
1296 
1297 /* EOF */
static VOID BiosCharPrint(CHAR Character)
Definition: bios32.c:168
static VOID PicSetIRQMask(USHORT off, USHORT on)
Definition: bios32.c:794
_Must_inspect_result_ _In_ WDFIOTARGET _In_opt_ WDFREQUEST _In_opt_ PWDF_MEMORY_DESCRIPTOR _In_opt_ PLONGLONG _In_opt_ PWDF_REQUEST_SEND_OPTIONS _Out_opt_ PULONG_PTR BytesWritten
Definition: wdfiotarget.h:949
VOID VidBios32Cleanup(VOID)
Definition: vidbios32.c:67
#define STACK_INT_NUM
Definition: int32.h:30
GLenum func
Definition: glext.h:6028
#define PS2_DATA_PORT
Definition: ps2.h:16
VOID Bios32Cleanup(VOID)
Definition: bios32.c:1289
#define BIOS_TIME_INTERRUPT
Definition: bios32p.h:28
VOID WINAPI setIP(USHORT)
Definition: registers.c:471
USHORT WINAPI getBX(VOID)
Definition: registers.c:170
BOOLEAN MemQueryMemoryZone(ULONG StartAddress, PULONG Length, PBOOLEAN Hooked)
Definition: memory.c:381
BOOLEAN WriteProtectRom(IN PVOID RomLocation, IN ULONG RomSize)
Definition: rom.c:138
BYTE VideoPage
Definition: bios.h:66
VOID WINAPI setBL(UCHAR)
Definition: registers.c:205
static VOID WINAPI BiosTimerIrq(LPWORD Stack)
Definition: bios32.c:859
_In_ ULONG _In_ ULONG _In_ ULONG Length
Definition: ntddpcm.h:101
#define CMOS_ADDRESS_PORT
Definition: cmos.h:15
#define ERROR_SUCCESS
Definition: deptool.c:10
VOID WINAPI setEAX(ULONG)
Definition: registers.c:107
USHORT WINAPI getSI(VOID)
Definition: registers.c:404
VOID WINAPI setECX(ULONG)
Definition: registers.c:221
#define BIOS_SYS_TIMER_INTERRUPT
Definition: bios32p.h:29
#define LOBYTE(W)
Definition: jmemdos.c:487
VOID PrintMessageAnsi(IN CHAR_PRINT CharPrint, IN LPCSTR Format,...)
Definition: ntvdm.c:416
#define MAKEWORD(a, b)
Definition: typedefs.h:248
USHORT WINAPI getCX(VOID)
Definition: registers.c:228
VOID WINAPI setCH(UCHAR)
Definition: registers.c:249
#define TRUE
Definition: types.h:120
VOID WINAPI setAH(UCHAR)
Definition: registers.c:135
VOID RegisterBop(BYTE BopCode, EMULATOR_BOP_PROC BopHandler)
Definition: bop.c:29
ULONG WINAPI getEDX(VOID)
Definition: registers.c:272
static const CHAR BiosVersion[]
Definition: bios32.c:139
#define PIC_ICW4_8086
Definition: pic.h:23
VOID WINAPI setAX(USHORT)
Definition: registers.c:121
VOID VidBiosPost(VOID)
Definition: vidbios.c:3932
VOID InitializeContext(IN PCALLBACK16 Context, IN USHORT Segment, IN USHORT Offset)
Definition: callback.c:60
char CHAR
Definition: xmlstorage.h:175
static VOID WINAPI BiosHandleSlavePicIRQ(LPWORD Stack)
Definition: bios32.c:846
#define BIOS_BOOTSTRAP_LOADER
Definition: bios32p.h:27
VOID WINAPI setDS(USHORT)
Definition: registers.c:515
VOID Int32Call(IN PCALLBACK16 Context, IN BYTE IntNumber)
Definition: int32.c:151
DWORD WINAPI GetTickCount(VOID)
Definition: time.c:455
#define HIBYTE(W)
Definition: jmemdos.c:486
#define BOP_UNSIMULATE
Definition: isvbop.h:31
#define BIOS_REVISION
Definition: bios32.c:112
VOID WINAPI setAL(UCHAR)
Definition: registers.c:149
PBIOS_DATA_AREA Bda
Definition: bios.c:42
Definition: strmini.h:380
#define PIC_ICW1
Definition: pic.h:20
static VOID WINAPI BiosSystemTimerInterrupt(LPWORD Stack)
Definition: bios32.c:786
UCHAR WINAPI getAH(VOID)
Definition: registers.c:128
static VOID WINAPI BiosMiscService(LPWORD Stack)
Definition: bios32.c:212
VOID WINAPI BiosEquipmentService(LPWORD Stack)
Definition: bios32.c:200
UCHAR WINAPI getAL(VOID)
Definition: registers.c:142
Definition: bidi.c:78
DWORD ResumeEntryPoint
Definition: bios.h:74
#define DEFAULT_ATTRIBUTE
Definition: vidbios.h:21
Definition: parse.h:75
#define PIC_OCW2_EOI
Definition: pic.h:27
VOID KbdBios32Post(VOID)
Definition: kbdbios32.c:361
BOOLEAN Bios32Initialize(VOID)
Definition: bios32.c:1246
#define BIOS_MODEL
Definition: bios32.c:110
#define SEG_OFF_TO_PTR(seg, off)
Definition: emulator.h:32
ULONG WINAPI getEBX(VOID)
Definition: registers.c:156
#define DWORD
Definition: nt_native.h:44
static VOID BiosHwSetup(VOID)
Definition: bios32.c:897
#define BIOS_VIDEO_INTERRUPT
Definition: vidbios.h:15
#define RtlMoveMemory(Destination, Source, Length)
Definition: typedefs.h:264
uint32_t ULONG_PTR
Definition: typedefs.h:65
#define RegisterBiosInt32(IntNumber, IntHandler)
Definition: bios32p.h:34
#define EMULATOR_FLAG_CF
Definition: cpu.h:19
#define MAX_ADDRESS
VOID EmulatorException(BYTE ExceptionNumber, LPWORD Stack)
Definition: emulator.c:85
_In_ WDFREQUEST _In_ PIO_STACK_LOCATION Stack
Definition: wdfrequest.h:636
VOID WINAPI setES(USHORT)
Definition: registers.c:529
VOID WINAPI setSP(USHORT)
Definition: registers.c:351
BOOLEAN KbdBiosInitialize(VOID)
Definition: kbdbios.c:85
#define L(x)
Definition: ntvdm.h:50
unsigned char * LPBYTE
Definition: typedefs.h:53
#define BOP_RESET
Definition: bios.c:33
#define FALSE
Definition: types.h:117
#define PIC_SLAVE_CMD
Definition: pic.h:17
static VOID WINAPI BiosException(LPWORD Stack)
Definition: bios32.c:193
static VOID WINAPI BiosHandleMasterPicIRQ(LPWORD Stack)
Definition: bios32.c:834
VOID WINAPI setSS(USHORT)
Definition: registers.c:501
LONGLONG BaseAddress
Definition: osloader.h:33
VOID WINAPI setCF(ULONG)
Definition: registers.c:573
BYTE MidnightPassed
Definition: bios.h:78
VOID WINAPI setSI(USHORT)
Definition: registers.c:411
UCHAR IOReadB(USHORT Port)
Definition: io.c:64
VOID WINAPI setEBX(ULONG)
Definition: registers.c:163
#define BIOS_MISC_INTERRUPT
Definition: bios32p.h:25
WORD MemorySize
Definition: bios.h:47
#define MAKELONG(a, b)
Definition: typedefs.h:249
unsigned char BOOLEAN
VOID DiskBios32Post(VOID)
Definition: dskbios32.c:647
#define STACK_FLAGS
Definition: int32.h:35
Definition: amd64_sup.c:16
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING _Out_opt_ PUSHORT _Inout_opt_ PUNICODE_STRING Value
Definition: wdfregistry.h:406
static VOID InitializeBiosInt32(VOID)
Definition: bios32.c:960
static const BYTE Bootstrap[]
Definition: bios32.c:147
VOID IOWriteB(USHORT Port, UCHAR Buffer)
Definition: io.c:111
static const BYTE PostCode[]
Definition: bios32.c:157
VOID DosBootsectorInitialize(VOID)
Definition: dem.c:1089
int Count
Definition: noreturn.cpp:7
_In_ HANDLE _Outptr_result_bytebuffer_ ViewSize PVOID * BaseAddress
Definition: mmfuncs.h:404
#define NULL32
Definition: emulator.h:21
VOID EnableHwIRQ(UCHAR hwirq, EMULATOR_INT32_PROC func)
Definition: bios32.c:802
static VOID WINAPI BiosRomBasic(LPWORD Stack)
Definition: bios32.c:552
#define DX
Definition: i386-dis.c:418
struct _BIOS_CONFIG_TABLE BIOS_CONFIG_TABLE
#define PIC_OCW3_READ_ISR
Definition: pic.h:31
USHORT WINAPI getES(VOID)
Definition: registers.c:522
uint64_t ULONGLONG
Definition: typedefs.h:67
VOID PicIRQComplete(BYTE IntNum)
Definition: bios32.c:816
CALLBACK16 BiosContext
Definition: bios32.c:45
static const CHAR BiosCopyright[]
Definition: bios32.c:138
#define WINAPI
Definition: msvc.h:6
BOOLEAN VidBiosInitialize(VOID)
Definition: vidbios.c:3981
unsigned short WORD
Definition: ntddk_ex.h:93
unsigned long DWORD
Definition: ntddk_ex.h:95
UCHAR WINAPI getBH(VOID)
Definition: registers.c:184
#define BIOS_PIC_SLAVE_INT
Definition: bios32p.h:21
#define PIT_DATA_PORT(x)
Definition: pit.h:18
Definition: strmini.h:378
VOID WINAPI setBP(USHORT)
Definition: registers.c:381
#define BIOS_SUBMODEL
Definition: bios32.c:111
VOID WINAPI setDX(USHORT)
Definition: registers.c:293
#define TO_LINEAR(seg, off)
Definition: emulator.h:26
#define BIOS_MEMORY_SIZE
Definition: bios32p.h:24
#define PIC_MASTER_CMD
Definition: pic.h:15
VOID MouseBios32Cleanup(VOID)
Definition: moubios32.c:538
unsigned char UCHAR
Definition: xmlstorage.h:181
#define PS2_CONTROL_PORT
Definition: ps2.h:17
#define PIC_SLAVE_DATA
Definition: pic.h:18
#define ROM_AREA_END
Definition: rom.h:15
#define PIC_ICW1_ICW4
Definition: pic.h:21
_In_ PSCSI_REQUEST_BLOCK _Out_ NTSTATUS _Inout_ BOOLEAN * Retry
Definition: classpnp.h:310
USHORT WINAPI getDX(VOID)
Definition: registers.c:286
#define BDA_SEGMENT
Definition: bios.h:28
USHORT WINAPI getAX(VOID)
Definition: registers.c:114
static VOID WINAPI BiosTimeService(LPWORD Stack)
Definition: bios32.c:690
DWORD TickCounter
Definition: bios.h:77
#define STACK_CS
Definition: int32.h:34
VOID EmulatorTerminate(VOID)
Definition: emulator.c:503
VOID WINAPI setBX(USHORT)
Definition: registers.c:177
unsigned char BYTE
Definition: xxhash.c:193
VOID WINAPI BiosGetMemorySize(LPWORD Stack)
Definition: bios32.c:206
#define BIOS_ROM_BASIC
Definition: bios32p.h:26
static const CHAR BiosDate[]
Definition: bios32.c:141
VOID WINAPI setBH(UCHAR)
Definition: registers.c:191
#define PIT_COMMAND_PORT
Definition: pit.h:19
uint16_t * LPWORD
Definition: typedefs.h:56
VOID WINAPI setCS(USHORT)
Definition: registers.c:487
_In_ ULONG _In_ ULONG Offset
Definition: ntddpcm.h:101
BOOLEAN DiskBios32Initialize(VOID)
Definition: dskbios32.c:674
VOID WINAPI setDI(USHORT)
Definition: registers.c:441
static const BIOS_CONFIG_TABLE BiosConfigTable
Definition: bios32.c:115
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
#define CMOS_DISABLE_NMI
Definition: cmos.h:17
unsigned short USHORT
Definition: pedump.c:61
#define EMULATOR_BOP
Definition: bop.h:16
UCHAR WINAPI getBL(VOID)
Definition: registers.c:198
USHORT WINAPI getDI(VOID)
Definition: registers.c:434
VOID WINAPI setDL(UCHAR)
Definition: registers.c:321
#define BIOS_PIC_MASTER_INT
Definition: bios32p.h:20
static VOID WINAPI BiosBootstrapLoader(LPWORD Stack)
Definition: bios32.c:567
#define CMOS_DATA_PORT
Definition: halhw.h:12
WORD EquipmentList
Definition: bios.h:45
unsigned int * PULONG
Definition: retypes.h:1
#define min(a, b)
Definition: monoChain.cc:55
#define NULL
Definition: types.h:112
VOID WINAPI setIF(ULONG)
Definition: registers.c:643
VOID DiskBios32Cleanup(VOID)
Definition: dskbios32.c:701
VOID WINAPI setCX(USHORT)
Definition: registers.c:235
VOID MouseBios32Post(VOID)
Definition: moubios32.c:486
#define DPRINT1
Definition: precomp.h:8
VOID(WINAPI * EMULATOR_INT32_PROC)(LPWORD Stack)
Definition: int32.h:42
#define AX
Definition: i386-dis.c:417
USHORT WINAPI getDS(VOID)
Definition: registers.c:508
#define PIC_MASTER_DATA
Definition: pic.h:16
VOID WINAPI BiosDiskService(LPWORD Stack)
Definition: dskbios32.c:164
#define HIWORD(l)
Definition: typedefs.h:247
unsigned int ULONG
Definition: retypes.h:1
#define BIOS_EQUIPMENT_INTERRUPT
Definition: bios32p.h:23
WORD SoftReset
Definition: bios.h:80
#define UNIMPLEMENTED
Definition: debug.h:115
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
#define ULONG_PTR
Definition: config.h:101
#define RtlCopyMemory(Destination, Source, Length)
Definition: typedefs.h:263
ULONG WINAPI getECX(VOID)
Definition: registers.c:214
USHORT WINAPI getBP(VOID)
Definition: registers.c:374
static VOID InitializeBiosData(VOID)
Definition: bios32.c:1036
#define DPRINT
Definition: sndvol32.h:71
VOID KbdBiosCleanup(VOID)
Definition: kbdbios.c:93
void DisplayMessage(BOOL bConsole, BOOL bSilent, LPCTSTR lpMessage, LPCTSTR lpTitle, UINT uType)
Definition: regsvr32.c:239
C_ASSERT(sizeof(BiosCopyright) -1<=0x5B)
#define STACK_IP
Definition: int32.h:33
BOOLEAN MouseBiosInitialize(VOID)
Definition: moubios32.c:533
VOID WINAPI setCL(UCHAR)
Definition: registers.c:263
BYTE * PBYTE
Definition: pedump.c:66
LONGLONG Length
Definition: osloader.h:34
#define LOWORD(l)
Definition: pedump.c:82
struct BIOS_MEMORY_MAP * PBIOS_MEMORY_MAP
VOID WINAPI Bios32Post(LPWORD Stack)
Definition: bios32.c:1068
ULONG WINAPI getCF(VOID)
Definition: registers.c:566
#define BIOS_SEGMENT
Definition: bios.h:29
VOID SearchAndInitRoms(IN PCALLBACK16 Context)
Definition: rom.c:252
VOID WINAPI setDH(UCHAR)
Definition: registers.c:307