ROM BIOS and the first MEG of memory

The following is the layout and contents of the first Meg of memory.

Offset (hex) Size (dec)      Description
0000 4 Interrupt Vector for INT 00h (division by zero)
0004 4 Interrupt Vector for INT 01h (single step)
0008 4 Interrupt Vector for INT 02h (Nonmaskable)
000C 4 Interrupt Vector for INT 03h (break point)
0010 4 Interrupt Vector for INT 04h (overflow)
0014 4 Interrupt Vector for INT 05h (bound fault)
0018 4 Interrupt Vector for INT 06h (invalid opcode)
001C 4 Interrupt Vector for INT 07h (processor extension not available)
0020 4 Interrupt Vector for INT 08h (clock tick (hardware))
0024 4 Interrupt Vector for INT 09h (keyboard)
0028 4 Interrupt Vector for INT 0Ah (LPT2)
002C 4 Interrupt Vector for INT 0Bh (COM2)
0030 4 Interrupt Vector for INT 0Ch (COM1)
0034 4 Interrupt Vector for INT 0Dh (IRQ5)
0038 4 Interrupt Vector for INT 0Eh (floppy disk attention)
003C 4 Interrupt Vector for INT 0Fh (printer control)
0040 4 Interrupt Vector for INT 10h (video)
0044 4 Interrupt Vector for INT 11h (equipment list)
0048 4 Interrupt Vector for INT 12h (memory size)
004C 4 Interrupt Vector for INT 13h (disk BIOS)
0050 4 Interrupt Vector for INT 14h (communications BIOS)
0054 4 Interrupt Vector for INT 15h (system BIOS)
0058 4 Interrupt Vector for INT 16h (keyboard BIOS)
005C 4 Interrupt Vector for INT 17h (printer BIOS)
0060 4 Interrupt Vector for INT 18h (ROM Basic Language)
0064 4 Interrupt Vector for INT 19h (boot-strap)
0068 4 Interrupt Vector for INT 1Ah (Time and Date)
006C 4 Interrupt Vector for INT 1Bh (Ctrl Break)
0070 4 Interrupt Vector for INT 1Ch (Clock tick)
0074 4 Holds address pointing to control parameters
0078 4 Holds address pointing to floppy disk drive parameter table
007C 4 Holds address pointing to second half of character table (128 - 255)
0080 4 Interrupt Vector for INT 20h (terminate)
0084 4 Interrupt Vector for INT 21h (MS-DOS function calls)
0088 4 Holds address pointing to MS-DOS program terminate routine
008C 4 Holds address pointing to MS-DOS keyboard-break handler
0090 4 Holds address pointing to MS-DOS critical-error handler
0094 4 Interrupt Vector for INT 25h (Absolute disk read)
0098 4 Interrupt Vector for INT 26h (Absolute disk write)
009C 4 Interrupt Vector for INT 27h (MS-DOS TSR)
00A0 4 Interrupt Vector for INT 28h (MS-DOS IDLE)
00A4 4 Interrupt Vector for INT 29h (Fast CON output)
00A8 4 Interrupt Vector for INT 2Ah (NetBIOS)
00A8 12 Interrupt Vector for INT 2Bh-2Dh (reserved)
00B8 4 Interrupt Vector for INT 2Eh (Execute)
00BC 4 Interrupt Vector for INT 2Fh (Multitask)
00C0 4 (NOT A VECTOR!) - DOS 1+ - FAR JMP instruction
00C4 4 overwritten by CP/M jump instruction in INT 30
00C8 4 Interrupt Vector for INT 32h (user)
00CC 4 Interrupt Vector for INT 33h (Mouse)
00D0 44 Interrupt Vector for INT 34h-3Eh (FLOATING POINT EMULATION)
00FC 4 Interrupt Vector for INT 3Fh (Overlay manager)
0100 4 Interrupt Vector for INT 40h (Disk handler)
0104 4 Holds address pointing to Parameter table for first hard drive
0108 4 Interrupt Vector for INT 42h (video)
010C 4 Holds address pointing to video graphics characters (EGA, PS/2s)
0110 4 Holds address pointing to video graphics characters (PCjr)
0114 4 Z100/Acron
0118 4 Holds address pointing to Parameter table for second hard drive
011C 4 Z100/Acorn/Western Digital/SQL Base
0120 4 KEYBOARD (PCjr)
0124 4 SYSTEM DATA (PCjr)
0128 4 Interrupt Vector for INT 4Ah (USER ALARM HANDLER)
012C 4 Interrupt Vector for INT 4Bh (IBM SCSI interface)
0130 4 Interrupt Vector for INT 4Ch (Z100/Acorn/TI)
0134 4 Interrupt Vector for INT 4Dh (Z100)
0138 4 Interrupt Vector for INT 4Eh (Z100/TI)
013C 4 Interrupt Vector for INT 4Fh (Common Access Method SCSI)
0140 4 Interrupt Vector for INT 50h (IRQ0 relocated by software)
0144 4 Interrupt Vector for INT 51h (IRQ1 relocated by software)
0148 4 Interrupt Vector for INT 52h (IRQ2 relocated by software)
014C 4 Interrupt Vector for INT 53h (IRQ3 relocated by software)
0150 4 Interrupt Vector for INT 54h (IRQ4 relocated by software)
0154 4 Interrupt Vector for INT 55h (IRQ5 relocated by software)
0158 4 Interrupt Vector for INT 56h (IRQ6 relocated by software)
015C 4 Interrupt Vector for INT 57h (IRQ7 relocated by software)
0160 4 Interrupt Vector for INT 58h (IRQ8/0 relocated by software)
0164 4 Interrupt Vector for INT 59h (IRQ9/1 relocated by software)
0168 4 Interrupt Vector for INT 5Ah (IRQ10/2 relocated by software)
016C 4 Interrupt Vector for INT 5Bh (IRQ11/3 relocated by software)
0170 4 Interrupt Vector for INT 5Ch (IRQ12/4 relocated by software)
0174 4 Interrupt Vector for INT 5Dh (IRQ13/5 relocated by software)
0178 4 Interrupt Vector for INT 5Eh (IRQ14/6 relocated by software)
017C 4 Interrupt Vector for INT 5Fh (IRQ15/7 relocated by software)
0180 28 Interrupt Vector for INT 60h-66h (reserved for user interrupt)
019C 4 Interrupt Vector for INT 67h (LIM Expanded Memory Manager)
01A0 16 Interrupt Vector for INT 68h-6Bh (reserved for user interrupt)
01B0 4 Interrupt Vector for INT 6Ch (DECnet DOS network scheduler)
01B4 4 Interrupt Vector for INT 6Dh (VGA internal)
01B8 4 Interrupt Vector for INT 6Eh (DECnet DOS)
01BC 4 Interrupt Vector for INT 6Fh (Novell NetWare, MS Windows 3.0)
01C0 4 Interrupt Vector for INT 70h (CMOS real-time clock)
01C4 4 Interrupt Vector for INT 71h (redirected to int 0A)
01C8 8 Interrupt Vector for INT 72h-73h (IRQ10-11 reserved)
01D0 4 Interrupt Vector for INT 74h (IRQ12 Pointing device)
01D4 4 Interrupt Vector for INT 75h (IRQ13 math coprocessor exception)
01D8 4 Interrupt Vector for INT 76h (IRQ14 Hard disk controller)
01DC 4 Interrupt Vector for INT 77h (IRQ15 reserved)
01E0 4 Interrupt Vector for INT 78h (DOS extenders?)
01E4 4 Interrupt Vector for INT 79h (reserved for user interrupt)
01E8 4 Interrupt Vector for INT 7Ah (Novell NetWare)
01E8 20 Interrupt Vector for INT 7Bh-7Fh (reserved for user interrupt)
0200 24 Interrupt Vector for INT 80h-85h (reserved for BASIC)
0218 420 Interrupt Vector for INT 86h-EEh (reserved for BASIC)
03BC 4 Interrupt Vector for INT EFh (BASIC - orig. INT 09 vector)
03C0 4 Interrupt Vector for INT F0h (BASIC - orig. INT 08 vector)
03C4 52 Interrupt Vector for INT F1h-FDh (reserved for user interrupt)
03F8 8 Interrupt Vector for INT FEh-FFh (AT/XT286/PS50+)
Remember that 0000:0400h = 0040:0000h
0400 2 COM1 I/O base address (set to 0 if none found)
0402 2 COM2 I/O base address (set to 0 if none found)
0404 2 COM3 I/O base address (set to 0 if none found)
0406 2 COM4 I/O base address (set to 0 if none found)
0408 2 LPT1 I/O base address (set to 0 if none found)
040A 2 LPT2 I/O base address (set to 0 if none found)
040C 2 LPT3 I/O base address (set to 0 if none found)
040E 2 LPT4 I/O base address (set to 0 if none found)
2 (if extended BIOS on system) Segment address of Extended BIOS Data Area (9FC0:0000h)
0410 2 equipment list reported by interrupt 11h (see figure 1)
0412 1 PCjr - Infrared Keyboard Link Error
0413 2 usable memory size in kilobytes (interrupt 12h)
Usually set to 0280h. If less, then denotes 640k-difference=size of Extended BIOS Data Area at (9FC0:0000h)
0415 2 (AT+) Error codes from the BIOS manufacturer
2 (PC,XT) Adapter Memory Size
0417 2 keyboard status bits (see figure 2)
0419 1 Alternate Keypad entry
041A 2 points to current head of keyboard buffer at 0040:001Eh
041C 2 points to current tail of keyboard buffer at 0040:001Eh
041E 32 keyboard buffer - used as sixteen 2-byte entries
043E 1 indicates whether a floppy drive should be re calibrated
043F 1 floppy drive motor status (bits 0-3)
bit 0 = drive 0, if set - drive motor running
bit 1 = drive 1, if set - drive motor running, etc.
0440 1 floppy drive motor status. The value in this byte is decremented with every tick of the system clock.
When the value returns 0, the BOIS turns off the motor.
0441 1 floppy drive motor status. status code returned by the ROM BIOS from the most recent disk operation
0442 7 floppy drive controller status
0449 1 current video mode
044A 2 max number of chars in a row of text
044C 2 number of bytes needed to display the screen (text=80x25)
044E 2 offset of current display page
0450 16 8 words, each giving the cursor location of each page
0460 2 size of current cursor
0462 1 current display page
0463 2 port address of the hardware display controller chip
0465 1 current setting of the display mode-register of the MDA and CGA
0466 1 current setting of the CGA's CRT color register
0467 5 cassette tape control
4 Reset Restart Address
046C 4 master clock count (long integer) 0 = midnight and increments until a 24 hour equiv.
0470 1 not 0 = passed midnight
0471 1 if bit 7 is set, ctrl-break was pressed
0472 2 set to 1234h after initial power up telling a warm boot to skip mem check
0474 1 Fixed disk last operation status (except ESDI drives)
0475 1 Number of fixed disk drives
0476 1 Fixed disk control byte
0477 1 Fixed disk I/O port offset (XT only)
0478 4 contains a time-out value for the respective parallel ports
047C 4 contains a time-out value for the respective RS-232 serial ports
0480 2 points at the start of the keyboard buffer area
0482 2 points at the end of the keyboard buffer area
0484 1 this value is one less than the number of character rows displayed on the screen
0485 2 height, in scan lines, of characters on the screen
0487 1 Amount of video RAM available (usually 0x60, meaning 256k)
0488 3 Initial setting of the EGA configuration switches, as well as other misc video status info.
048B 1 Diskette Media Control: Data rate & step rate
048C 3 Fixed disk status and control
048F 1 Diskette Controller information
0490 1 Diskette Drive 0 Media state
0491 1 Diskette Drive 1 Media state
0492 1 Diskette Drive 0 Media state at start of operation
0493 1 Diskette Drive 1 Media state at start of operation
0494 1 Diskette Drive 0 current track number
0495 1 Diskette Drive 1 current track number
0496 2 data area used to support the 101-key keyboard
0498 9 real time clock control
04A1 1 LANA DMA channel flags
04A2 2 Status of LANA 0,1
04A4 4 Saved hard disk interrupt vector
04A8 4 (EGA and VGA) contain segmented address of a table of video parameters and overrides
04AC 8 (reserved)
04B4 1 Keyboard NMI control flags (convertible)
04B5 4 Keyboard Break pending flags (convertible)
04B9 1 Port 60h single byte Queue (convertible)
04BA 1 Scan code for last key (convertible)
04BB 1 NMI Buffer head pointer (convertible)
04BC 1 NMI Buffer tail pointer (convertible)
04BD 16 NMI scan code Buffer (convertible)
04CD 1 unknown
04CE 2 Day Counter (convertible)
04D0 16 unknown
04F0 16 intra-application communications area (ICA)
ie: known area where one app can communicate with another app.
(not used much because of its small size)
Remember that 0000:0500h = 0050:0000h
0500 1 status of a print-screen operation:
00h - OK
01h - a print-screen operation currently in progress
FFh - error occurred during a print-screen operation
0501 3 Used by BASIC
0504 1 if only 1 floppy installed, this byte indicates which drive letter it is using (a or b)
00h - acting as drive a:
01h - acting as drive b:
0505 10 POST work area
050F 1 BASIC shell flag (2 if currently in shell)
0510 2 holds ROM Basics default DS value (DO NOT CHANGE)
0512 4 segment offset address of Basic's clock-tick interrupt handler
0516 4 address for ROM Basic's Break-key-handling routine
051A 4 address for ROM Basic's floppy disk error-handling routine
0520 2 DOS Dynamic Storage ???
0522 14 DOS Diskette Initialization Table ???
0530 4 MODE command ???
0534 206 unknown
Remember that 0000:0600h = 0060:0000h
0600 256 scratch space used during DOS 2+ boot up
Remember that 0000:0700h = 0070:0000h
DOS 2+
0700 256 IO.SYS LOAD ADDRESS
DOS 5+
0700 25 ORIGINAL INTERRUPT VECTORS 10h,13h,15h,19h,1Bh
Each value is stored as a BYTE for the interrupt number followed by a DWORD for the vector
0719 231 unknown
Remember that 0000:0800h = 0080:0000h
0800 102 80286 CPU - LOADALL WORKSPACE
On the 80286 (unlike 80386), the state buffer from which the LOADALL instruction loads all internal registers is hardwired to physical address 000800h Several versions 3.x of MS-DOS leave an empty space at offset 100h in IO.SYS (which is loaded at 0070h:0000h) so that HIMEM.SYS can use LOADALL on 80286 machines without having to save/restore the area of memory that LOADALL uses
0866 154 unknown
Remember that 0000:0900h = 0090:0000h
0900 653,056 DOS (COMMAND.COM, etc., User Memory)
9FC0h:0000h - If your system has Extended BIOS Data Area (see 0040:000Eh and :0013h above)
0000 1 Size of Extended BIOS Data Area in 1k blocks
0002 21 unknown
0017 1 Number of POST error entries
0018 10 Error Log for above
0022 4 Mouse Driver Device Far Call
0026 1 Mouse Flags 1
0027 1 Mouse Flags 2
0028 8 Mouse Data
0030 9 unknown
0039 2 Watch Dog Timer
003B 2 unknown
003D 16 Hard Disk 0 Parameter Table
004D 16 Hard Disk 1 Parameter Table
005D 11 unknown
0068 1 Cache Control
0069 5 unknown
006E 1 Repeat Rate of Keyboard
006F 1 Delay until Keyboard repeats
0070 1 Number of Hard Drives attached
0071 1 DMA channel Hard Drive
0072 1 Hard Drive interrupt status
0073 1 Hard Drive operation flags
0074 4 Old interrupt 76h vector pointer
0078 1 Hard Drive DMA type
0079 1 (Hard Drive) status of last operation
007A 1 (Hard Drive) timeout value
007B 3 unknown
007E 16 Hard Drive controller return status words
008E 89 unknown
00E7 1 Diskette Drive type
00E8 4 unknown
00EC 1 Hard Drive Parameters Loaded
00ED 1 unknown
00EE 1 CPU Family ID
00EF 1 CPU Stepping
00F0 39 unknown
0117 2 Keyboard ID
0119 1 unknown
011A 1 Non-BIOS Interrupt 18h Flag
011B 2 unknown
011D 4 User Interrupt 18h Far Pointer
0121 735 unknown
A000:0000h
0000 65,536 Graphics Video memory (EGA and above)
B000:0000h
0000 32,768 Graphics area for EGA and up
8000 4096 Page 0 - 80x25 16 color and mono (B800:0000)
9000 4096 Page 1 - 80x25 16 color and mono (B800:1000)
A000 4096 Page 2 - 80x25 16 color and mono (B800:2000)
B000 4096 Page 3 - 80x25 16 color and mono (B800:3000)
C000 4096 Page 4 - 80x25 16 color and mono (B800:4000)
D000 4096 Page 5 - 80x25 16 color and mono (B800:5000)
E000 4096 Page 6 - 80x25 16 color and mono (B800:6000)
F000 4096 Page 7 - 80x25 16 color and mono (B800:7000)
C000:0000h
0000 65,536 additional ROM-BIOS & video memory
D000:0000h
0000 65,536 ROM cartridges
E000:0000h
0000 65,536 ROM cartridges
F000:0000h
0000 32,768 IBM PC ROM BASIC
E000 8,192 ORIGINAL IBM PC ROM BIOS
FFF0 5 RESET JUMP
FFF5 8 ASCII BIOS DATE
FFFD 1 OFTEN USED TO ENSURE CORRECT BIOS CHECKSUM
FFFE 1 MACHINE TYPE CODE (See Figure 3 Below)
FFFF 1 unknown
Total memory
0000:0000—F000:FFFF 1,048,576 16 x 65,536 = 1 meg


-------------------------- Figures ---------------------------

****************************************************************
       bit
FEDCBA98 76543210  Described
XX...... ........   Number of printers installed
..X..... ........   AT = reserved, PC Jr = Serial Printer Attached
...X.... ........   set if game adapter installed
....XXX. ........   Number of RS-232 serial ports
.......X ........   DMA hardware Present ?
........ XX......   +1 = number of floppy drives (see bit 0) 00 - 1 drive, 01 - 2 drives, etc.
........ ..XX....   Initial video mode
                      01 - 40 column color
                      10 - 80 column color
                      11 - monochrome
                      00 - none of the above
........ ....XX..   For PC w/64k motherboard
                      Amount of system board RAM
                      00 - 16k,01 - 32k, 10 - 48k, 11 - 64k
                    For PC/AT: not used
                    For PS/2:
                      Bit 3 not used
                      Bit 2 - pointing device installed
........ ......X.   set if math co processor installed
........ .......X   set if any floppy drives installed
                      if set, see bits 6 and 7
****************************************************************
FIGURE 1:   equipment list word at 0000:0410h



****************************************************************
  bits
76543210  Described
0000:0417h
X....... insert state: (1 = active, 0 = inactive)
.X...... caps lock:
..X..... num lock:
...X.... scroll lock:
....X... set if alt pressed
.....X.. set if ctrl pressed
......X. set if left shift pressed
.......X set if right shift pressed

0000:0418h
X.......   set if insert pressed
.X......   set if caps lock pressed
..X.....   set if num lock pressed
...X....   set if scroll lock pressed
....X...   hold state active (ctrl-num lock or pause pressed)
.....X..   system request pressed
......X.   left alt pressed
.......X   right alt pressed
****************************************************************
FIGURE 2:   Keyboard status bits at 0000:0417h, lo order bits are set
              only while a corresponding key is pressed


****************************************************************
F000:FFFE:  Machine Type Code byte (on some machines)

 FF = original PC
 FE = XT or Portable PC
 FD = PCjr
 FC = AT (or XT model 286, or PS/2 Model 50/60)
 FB = XT with 640K motherboard
 FA = PS/2 Model 30
 F9 = Convertible PC
 F8 = PS/2 Model 80

****************************************************************
FIGURE 3:  Machine Type Code byte