Phil Storrs PC Hardware book

How DOS uses the Low Memory Addresses

DOS, and later Operating Systems make use of the first 1.5K bytes of the RAM Memory for some internal purposes. The first 1024 bytes, from 00000hex to 003FFhex, is occupied by the Interrupt Vector Table. The next 260 (or so) bytes, from 00400hex to about 00504hex is used for the BIOS Control Information Area and the Intra-Application Communications Area.

The following list has been compiled with the help of the book Programmer's Guide to the IBM PC by Peter Norton. You will notice some addresses are not listed here, most of these were used by the Disastrous PC Junior, an IBM computer that was not really IBM compatible.

Much of the operation of an Intel Processor based computer is controlled by data that is stored in low-memory locations, particularly the two adjacent 256 byte areas beginning at 00400hex and 00500hex. Data is loaded into these areas from the startup routines in the BIOS ROM when the computer is booted.

The addresses in the following table are expressed in simple form but when requesting debug to supply details of these addresses you must express the addresses in Segment and Offset Format.

The address 00400hex could be expressed as 0000:0400hex or could be shortened to 0:400hex.

You can inspect these addresses by using the Display command in Debug. (D from the Debug prompt)

Where two bytes are involved in expressing some value, the order of the bytes is Low Byte followed by the High Byte. You must put the second byte in front of the first byte to see the actual value.
An example of this is the two bytes at 00413 and 00414hex.

The hex numbers you will see are 80 and 20hex. The actual number is 0280hex, which is 640 decimal.

I have listed the most useful addresses and they are expressed in simple Hexadecimal form.

410hex (a 2-byte word) This word holds the equipment-list data that is reported by the equipment-list service, interrupt 11hex. the format of this word is shown in the table below.

Byte 410hex
7 6 5 4 3 2 1 0 bit			Meaning
x x			Number of Diskette drives installed (00=1, 01=2)
    x x			Initial Video Mode 
        x x 		Amount of RAM on the System Board *
            x 		Not used
              x		A (1) one if any Disk drives present

The amount of memory fitted to the old original IBM PC/XT computers was often only 16K, hence the rather low numbers associated with the two bits that indicate the amount of RAM on the System board. 00=16K, 01=32K, 11=64K

* the meaning of these two bytes seems to have been lost in modern computer systems and you are likely to find any number in here.

Byte 411hex
7 6 5 4 3 2 1 0  bit			Meaning
x x			Number of printer ports installed
    x			A (1) one of a serial printer is in use
      x			A (1) one if a Game Adapter is installed
        x x x		Number of serial (com) ports installed
              x		Zero (0) if a DMA chip is installed

Using Debug, you can display the contents of these locations thus:
At the debug prompt (-) type D 0000:0410 L2 and press Enter (segment 0000, offset 0410 for a Length of 2 bytes)

When Debug displays the contents of these two bytes as Hexadecimal numbers, break them down into their Binary components, put them into the tables above, and see how the computers configuration is reported by the BIOS start routines.

413hex (a 2-byte word) This word contains the usable memory size in Kbytes. BIOS interrupt service 12H reports the value of this word.

417 and 418hex These two bytes are the Keyboard Status Bytes that are used to keep track of the various shift and control keys on the keyboard.

419hex (one byte) This byte was intended for future use to control an alternate keyboard.

41Ahex (a 2-byte word) This word points to the start of the keyboard buffer.

41Chex (a 2-byte word) This word points to the tail of the keyboard buffer.

41E to 43Dhex (a 32 byte area) This is the Keyboard Buffer area.

43Ehex (one byte) This byte indicates if Diskette Drives need to be calibrated before seeking to a track. Bits 0 to 3 correspond to floppy drives A through to D. If a bit is set to Zero then re calibration is necessary.

43Fhex (one byte) This byte returns the Diskette Motor Status. bits 0 to 3 correspond to floppy drives A through to D (the XT type computer could be equipped with four floppy drives).

440hex (one byte) This byte holds the count-down until the diskette motor is shut off. the count is set to 37 (about 2 seconds) at the beginning of each diskette operation.

441hex (one byte) This byte indicates the diskette status , each bit representing a particular kind of error. A bit value of 0 indicates no error, 1 indicates an error.

Binary Bit Meaning
7 Diskette timed out failed to respond in time
6 Seek to track failed
5 Diskette controller chip failed
4 Cyclical redundancy check failed (CRC) error in data
3 DMA diskette error
2 Sector not found-diskette damaged or not formatted
1 Address mark on diskette not found
0 Invalid diskette command requested

442hex (seven bytes) These seven bytes hold the diskette controller status information

Starting at 449hex is a 30 byte area that is used to control the Video System.

449hex (one byte) This byte specifies the current Video Mode

Code Meaning
0 40-column text, no colour
1 40-column text, 16 colour
2 80-column text, no colour
3 80-column text, 16 colour
4 320 by 200 graphics, 4-colour
5 320 by 200 graphics, no colour (4 shades of grey)
6 640 by 200 graphics, 2 colour
7 Monochrome adapter mode

44Ahex (a 2-byte word) This word holds the screen width in text columns. Column widths are stored in the Hex equivalent of 20, 40 or 80.

44Chex ( a 2-byte word) Here the screen regeneration length is held.

44Ehex ( a 2-byte word) This word holds the screen location offset. This is the starting offset address into the Video RAM.

450hex (eight 2-byte words) These locations give the cursor locations for eight separate visual pages, starting at page zero.

460hex (a 2-byte word) these two bytes hold the size of the cursor based on a range of cursor scan lines. The first byte gives the end scan line, the second the starting scan line.

462hex (one byte) This byte holds the current display page number.

463hex (a 2-byte word) This address stores to port address of the Video Controller Chip. It is usually set to 3D4hex.

465hex (one byte) This byte contains the CRT mode setting.

466hex (one byte) This byte contains the colour-palette mask settings.

467hex (five bytes) These bytes were used for Cassette Tape control in the original IBM PC.

46Chex (four bytes) These bytes stored as two 2-byte words provide the master clock count.

470hex (one byte) This byte indicates that clock roll-over has occurred and is used to increment the date.

471hex (one byte) This byte is used to indicate a keyboard break has occurred.

472hex (a 2-byte word) These two bytes are used to signal that a keyboard reboot is in progress. Whenever the system is rebooted with a Cont. Alt. Del key combination this word is set to 1234.

473hex (one byte) reserved for IBM ? Some say a hex code of 24 in this byte indicates a stock dividend is to be issued.

500hex (one byte) Used by DOS and by basic to control the Print-Screen operation.

504hex (one byte) This byte is used in a single floppy drive system to indicate whether the one real drive is acting as drive A of drive B.

510 to 51Dhex Was used by the Basic Interpreter for various purposes, can now be used by applications as the Basic Interpreter is never used.

The (BIOS) Control Information Area

Many of the addresses in the 400hex and 500hex areas are interesting in that they contain data vital to the operation of the various BIOS and DOS service routines. In many instances programs can return the information stored in these addresses by invoking a BIOS interrupt, and in all cases programs can access the information directly. You can check on the values for yourself by starting Debug and using the syntax D 0:oooo Ln, where oooo is the address of the first byte of data and n is the number of bytes that are required for that data. For example, the amount of conventional memory is indicated by two bytes starting at 413hex, and so at the debug prompt you would type D 0:413 L2

The Intra-Application Communications Area

Although the BIOS Control Information Area comprises the largest part of the "400-block", the Intra-Application Area is also located there. This is a 16 byte reserved area from 4F0 to 4FFhex that is used to store data that can be shared by several different programs.

Back to the PC memory chapter Back to the opening index Book two index

PC Memory hardware over the years Extended Memory and High Memory The PC Memory Map Cache memory

Copyright © Phil. Storr, last updated 26th December 1998