Memory

This chapter looks at memory from both a physical and logical point of view. The chapter also looks at the logical layout
of memory, as well as defines the different areas and uses of these areas from the system's point of view. Because the logical
layout and uses are within the "mind" of the processor, memory remains as perhaps the most difficult subject to grasp in the
PC universe. This chapter contains much useful information that removes the mysteries associated with memory and enables you
to get the most out of your system.

The System Logical Memory Layout

The original PC had a total of 1M of addressable memory, and the top 384K of that was reserved for use by the system. Placing
this reserved space at the top (between 640K and 1024K instead of at the bottom, between 0K and 640K) led to what is often
called the conventional memory barrier. The constant pressures on system and peripheral manufacturers to maintain compatibility
by never breaking from the original memory scheme of the first PC has resulted in a system memory structure that is (to put
it kindly) a mess.

Someone who wants to become knowledgeable about personal computers must at one time or another come to terms with the types
of memory installed on their system--the small and large pieces of different kinds of memory, some accessible by software
application programs, and some not. The following sections detail the different kinds of memory installed on a modern PC.
The kinds of memory covered in the following sections include the following:

Conventional (Base) memory

Upper Memory Area (UMA)

High Memory Area (HMA)

Extended memory (XMS)

Expanded memory (obsolete)

Video RAM memory (part of UMA)

Adapter ROM and Special-Purpose RAM (part of UMA)

Motherboard ROM BIOS (part of UMA)

Subsequent sections also cover preventing memory conflicts and overlap, using memory managers to optimize your system's
memory, and making better use of memory. In an AT system, the memory map extends beyond the 1M boundary and can continue to
16M on a system based on the 286 or higher processor, 4G (4,096M) on a 386DX or higher, or 64G (65,536M) on a Pentium II.
Any memory past 1M is called extended memory.

Figure 7.1 shows the logical address locations for a PC-compatible system. If the processor is running in real mode, only
the first megabyte is accessible. If the processor is in protected mode, the full memory map is accessible. Each symbol is
equal to 1K of memory; each line or segment is 64K; and this map shows the first two megabytes of system memory.

FIG. 7.1 The logical memory map of the first 2M. This memory has the addresses from A0000 through
FFFFF.

NOTE: To save space, this map is ended after the end of the second megabyte. In reality,
this map continues to the maximum of addressable memory.

Conventional (Base) Memory

The original PC/XT-type system was designed to use 1M of memory workspace, sometimes called RAM (random access memory).
This 1M of RAM is divided into several sections, some of which have special uses. DOS can read and write to the entire megabyte,
but can manage the loading of programs only in the portion of RAM space called conventional memory, which at the time
the first PC was introduced was 512K. The other 512K was reserved for use by the system itself, including the motherboard
and adapter boards plugged into the system slots.

IBM decided after introducing the system that only 384K was needed for these reserved uses, and the company began marketing
PCs with 640K of user memory. Thus, 640K became the standard for memory that can be used by DOS for running programs, and
is often termed the 640K memory barrier. The remaining memory after 640K was reserved for use by the graphics boards,
other adapters, and the motherboard ROM BIOS.

Upper Memory Area (UMA)

The term Upper Memory Area (UMA) describes the reserved 384K at the top of the first megabyte of system memory on
a PC/XT and the first megabyte on an AT-type system.

The way the 384K of upper memory is used breaks down as follows:

The first 128K after conventional memory is called Video RAM. It is reserved for use by video adapters. When text
and graphics are displayed on-screen, the electronic impulses that contain their images reside in this space. Video RAM is
allotted the address range from A0000-BFFFF.

The next 128K is reserved for the adapter BIOS that resides in read-only memory chips on some adapter boards plugged into
the bus slots. Most VGA-compatible video adapters use the first 32K of this area for their on-board BIOS. The rest can be
used by any other adapters installed. Many network adapters also use this area for special purpose RAM called Shared Memory.
Adapter ROM and special purpose RAM is allotted the address range from C0000-DFFFF.

The last 128K of memory is reserved for motherboard BIOS, (the basic input/output system, which is stored in read-only
RAM chips or ROM). The POST (Power-On Self Test) and bootstrap loader, which handles your system at bootup until the operating
system takes over, also reside in this space. Most systems only use the last 64K (or less) of this space, leaving the first
64K or more free for remapping with memory managers. Some systems also include the CMOS Setup program in this area. The motherboard
BIOS is allotted the address range from E0000-FFFFF.

Not all the 384K of reserved memory is fully used on most AT-type systems. For example, according to IBM's definition of
the PC standard, reserved video RAM begins at address A0000, which is right at the 640K boundary. Normally, this is used for
VGA graphics modes, while the monochrome and color text modes use B0000-B7FFF and B8000-BFFFF, respectively. Older non-VGA
adapters only used memory in the B0000 segment. Different video adapters use varying amounts of RAM for their operations depending
mainly on the mode they are in. However, to the processor it always appears as the same 128K area no matter how much RAM is
really on the video card. This is managed by bank switching areas of memory on the card in and out of the A0000-BFFFF segments.

Although the top 384K of the first megabyte was originally termed reserved memory, it is possible to use previously
unused regions of this memory to load device drivers (like ANSI.SYS) and memory-resident programs (like MOUSE.COM), which
frees up the conventional memory they would otherwise require. The amount of free UMA space varies from system to system depending
on the adapter cards installed on the system. For example, most SCSI adapters and network adapters require some of this area
for built-in ROMs or special-purpose RAM use.

Segment Addresses and Linear Addresses

One thing that can be confusing is the difference between a segment address and a full linear address. The use of segmented
address numbers comes from the internal structure of the Intel processors, and is used primarily by older, 16-bit operating
systems. They use a separate register for the segment information and another for the offset. The concept is very simple.
For example, assume that you are staying in a hotel room, and somebody asks for your room number. The hotel has 10 floors,
numbered from zero through nine; each floor has 100 rooms, numbered from 00 to 99. A segment is defined as any group of 100
rooms starting at a multiple of 10, and indicated by a two-digit number. So, a segment address of 54 would indicate the actual
room 540, and you could have an offset of 00 to 99 rooms from there.

Thus in this hotel example, each segment is specified as a two-digit number from 00 to 99, and an offset can be specified
from any segment starting with a number from 00 to 99 as well.

As an example, let's say you are staying in room 541. If the person needs this information in segment:offset form, and
each number is two digits, you could say that you are staying at a room segment starting address of 54 (room 540), and an
offset of 01 from the start of that segment. You could also say that you are in room segment 50 (room 500), and an offset
of 41. You could even come up with other answers, such as you are at segment 45 (room 450) offset 91 (450+91=541). Here is
an example of how this adds up:

Segment

Offset

Total

54

01

541

50

41

541

45

91

541

As you can see, although the particular segment and offset are different, they all add up to the same room address. In
the Intel x86 processors, a similar scheme is used where a segment and offset are added internally to produce the actual address.
It can be somewhat confusing, especially if you are writing assembly language or machine language software!

This is exactly how segmented memory in an Intel processor works. Notice that the segment and offset numbers essentially
overlap on all digits except the first and last. By adding them together with the proper alignment, you can see the linear
address total.

With 32-bit operating systems, segment addresses are not an issue. A linear address is one without segment:offset boundaries,
such as saying room 541. It is a single number and not comprised of two numbers added together. For example, a SCSI host adapter
might have 16K ROM on the card addressed from D4000 to D7FFF. These numbers expressed in segment:offset form are D400:0000
to D700:0FFF. The segment portion is composed of the most significant four digits, and the offset portion is composed of the
least significant four digits. Because each portion overlaps by one digit, the ending address of its ROM can be expressed
in four different ways, as follows:

As you can see in each case, although the segment and offset differ slightly, the total ends up being the same. Adding
together the segment and offset numbers makes possible even more combinations, as in the following examples:

As you can see, several combinations are possible. The correct and generally accepted way to write this address as a linear
address is D7FFF, whereas most would write the segment:offset address as D000:7FFF. Keeping the segment mostly zeros makes
the segment:offset relationship easier to understand and the number easier to comprehend. If you understand the segment:offset
relationship to the linear address, you know why when a linear address number is discussed it is five digits, whereas a segment
number is only four.

Another important concept with newer 32-bit operating systems is their capability to map RAM from adapter cards into system
memory using linear addressing. There is no 64K limit to the amount of memory that can be mapped here, as there is in the
UMA.

Video RAM Memory

A video adapter installed in your system uses some of your system's memory to hold graphics or character information for
display. Some adapters, like the VGA, also have on-board BIOS mapped into the system's space reserved for such types of adapters.
Generally, the higher the resolution and color capabilities of the video adapter, the more system memory the video adapter
uses. It is important to note that most VGA or Super VGA adapters have additional on-board memory used to handle the information
currently displayed on-screen and to speed screen refresh.

NOTE: For more information, see Chapter 10 - Video Display Hardware.

In the standard system-memory map, a total of 128K is reserved for use by the video card to store currently displayed information.
The reserved video memory is located in segments A000 and B000. The video adapter ROM uses additional upper memory space in
segment C000.

The location of video adapter RAM is responsible for the 640K DOS conventional memory barrier. DOS can use all available
contiguous memory in the first megabyte of memory until the video adapter RAM is encountered. The use of adapters such as
the MDA and CGA allows DOS access to more than 640K of system memory. The video memory wall begins at A0000 for the
EGA, MCGA, and VGA systems, but the MDA and CGA do not use as much video RAM, which leaves some space that can be used by
DOS and programs. The previous segment and offset examples show that the MDA adapter enables DOS to use an additional 64K
of memory (all of segment A000), bringing the total for DOS program space to 704K. Similarly, the CGA enables a total of 736K
of possible contiguous memory. The EGA, VGA, or MCGA is limited to the normal maximum of 640K of contiguous memory because
of the larger amount used by video RAM. The maximum DOS-program memory workspace, therefore, depends on which video adapter
is installed. Table 7.1 shows the maximum amount of memory available to DOS using the referenced video card.

Table 7.1 DOS Memory Limitations Based on Video Adapter Type

Video Adapter Type

Maximum DOS Memory

Monochrome Display Adapter
(MDA)

704K

Color Graphics Adapter (CGA)

736K

Enhanced Graphics Adapter (EGA)

640K

Video Graphics Array (VGA)

640K

Super VGA (SVGA)

640K

eXtended Graphics Array (XGA)

640K

Using this memory to 736K might be possible depending on the video adapter, the types of memory boards installed, ROM programs
on the motherboard, and the type of system. You can use some of this memory if your system has a 386 or higher processor.
With memory manager software, such as EMM386 that comes with DOS, which can operate the 386+ Memory Management Unit (MMU),
you can remap extended memory into this space.

The following sections examine how standard video adapters use the system's memory. Figures show where in a system the
monochrome, EGA, VGA, and IBM PS/2 adapters use memory. This map is important because it may be possible to recognize some
of this as unused in some systems, which may free up more space for software drivers to be loaded.

Monochrome Display Adapter Memory (MDA)

Figure 7.2 shows where the original Monochrome Display Adapter (MDA) uses the system's memory. This adapter uses only a
4K portion of the reserved video RAM from B0000-B0FFF. Because the ROM code used to operate this adapter is actually a portion
of the motherboard ROM, no additional ROM space is used in segment C000.

Note that although the original Monochrome Display Adapter only used 4K of memory starting at B0000, a VGA adapter running
in Monochrome emulation mode (Mono Text Mode) activates 32K of RAM at this address. A true Monochrome Display Adapter has
no on-board BIOS, and instead is operated by driver programs found in the primary motherboard BIOS.

Color Graphics Adapter (CGA) Memory

Figure 7.3 shows where the Color Graphics Adapter (CGA) uses the system's memory. The CGA uses a 16K portion of the reserved
video RAM from B8000-BBFFF. Because the ROM code used to operate this adapter is a portion of the motherboard ROM, no additional
ROM space is used in segment C000.

The CGA card leaves memory from A0000-B7FFF free, which can be used by memory managers for additional DOS memory space.
However, this precludes using any graphics mode software such as Windows. The original CGA card only used 16K of space starting
at B8000, whereas a VGA adapter running in CGA emulation (Color Text) mode can activate 32K of RAM at this address. The original
CGA card has no on-board BIOS and is instead operated by driver programs found in the primary motherboard BIOS.

Enhanced Graphics Adapter (EGA) Memory

Figure 7.4 shows where the Enhanced Graphics Adapter (EGA) uses the system's memory. This adapter uses all 128K of the
video RAM from A0000-BFFFF. The ROM code used to operate this adapter is on the adapter itself and consumes 16K of memory
from C0000-C3FFF.

The original IBM EGA card only used 16K of ROM space at C0000. Aftermarket compatible EGA adapters can use additional ROM
space up to 32K total. The most interesting thing to note about EGA (and this applies to VGA adapters as well) is that segments
A000 and B000 are not all used at all times. For example, if the card is in a graphics mode, only segment A000 would appear
to have RAM installed, whereas segment B000 would appear completely empty. If you switched the mode of the adapter (through
software) into Color Text mode, segment A000 would instantly appear empty, and the last half of segment B000 would suddenly
"blink on". Figure 7.4 also shows the standard motherboard ROM BIOS as well so that you can get a picture of the entire UMA.

The EGA card became somewhat popular after it appeared, but this was quickly overshadowed by the VGA card that followed.
Most of the VGA characteristics with regard to memory are the same as the EGA because the VGA is backward-compatible with
EGA.

Video Graphics Array (VGA) Memory

All VGA-compatible cards, including Super VGA cards, are almost identical to the EGA in terms of memory use. Just as with
the EGA, they use all 128K of the video RAM from A0000-BFFFF, but not all at once. Again, the video RAM area is split into
three distinct regions, and each of these regions is used only when the adapter is in the corresponding mode. One minor difference
with the EGA cards is that virtually all VGA cards use the full 32K allotted to them for on-board ROM (C0000 to C7FFF). Figure
7.5 shows the VGA adapter memory map.

You can see that the typical VGA card uses a full 32K of space for the on-board ROM containing driver code. Some VGA cards
may use slightly less, but this is rare. Just as with the EGA card, the video RAM areas are only active when the adapter is
in the particular mode designated. In other words, when a VGA adapter is in graphics mode, only segment A000 is used; and
when it is in color text mode, only the last half of segment B000 is used. Because the VGA adapter is almost never run in
monochrome text mode, the first half of segment B000 remains unused (B0000-B7FFF). Figure 7.5 also shows the standard motherboard
ROM BIOS so that you can get a picture of how the entire UMA is laid out with this adapter.

Systems that use the LPX (Low Profile) motherboard design in an LPX- or Slimline-type case incorporate the video adapter
into the motherboard. In these systems, even though the video BIOS and motherboard BIOS may be from the same manufacturer,
they are always set up to emulate a standard VGA-type adapter card. In other words, the video BIOS appears in the first 32K
of segment C000 just as if a stand-alone VGA-type card were plugged into a slot. The built-in video circuit in these systems
can be easily disabled via a switch or jumper, which then allows a conventional VGA-type card to be plugged in. By having
the built-in VGA act exactly as if it were a separate card, disabling it allows a new adapter to be installed without the
compatibility problems that might arise if the video drivers had been incorporated into the motherboard BIOS.

If you were involved with the PC industry in 1987, you might remember how long it took for clone video card manufacturers
to accurately copy the IBM VGA circuits. It took nearly two years (almost until 1989) before you could buy an aftermarket
VGA card and expect it to run everything an IBM VGA system would with no problems. This was caused by the so called scratch
pad memory use by an adapter. Many different types of adapters may use some areas in the UMA for mapping scratch pad memory.
This refers to memory on the card that stores status information, configuration data, or any other temporary type of information
of a variable nature. Most cards keep this scratch pad memory to themselves and do not attempt to map it into the processor's
address space. But some cards do place this type of memory in the address space so that the driver programs for the card can
use it. Figure 7.6 shows the memory map of the IBM PS/2 Display Adapter (IBM's VGA card).

There is no difference between this VGA card and any other with respect to the Video RAM area. What is different is that
the ROM code that operates this adapter only consumes 24K of memory from C0000-C5FFF. Also strange is the 2K "hole" at C6000,
and the 6K of scratch pad memory starting at C6800, as well as the additional 2K of scratch pad memory at CA000. The scratch
pad memory use is not always documented clearly in the technical-reference information for the adapter. If you have ever had
the IBM VGA card and had conflicts with other adapters, now you know why!

NOTE: There are more VGA-type video adapters use scratch pad memory, but they have all kept
it within the C0000-C7FFF 32K region allotted normally for the video ROM BIOS. By using a 24K BIOS, there are other cards
with up to 8K of scratch pad area, but none--except for IBM's--in which the scratch pad memory goes beyond C8000.

Adapter ROM and Special Purpose RAM Memory

The second 128K of upper memory beginning at segment C000 is reserved for the software programs, or BIOS (basic input/output
system), on the adapter boards plugged into the system slots. These BIOS programs are stored on special chips known as read-only
memory (ROM), which have fused circuits so that the PC cannot alter them. ROM is useful for permanent programs that always
must be present while the system is running. Graphics boards, hard disk controllers, communications boards, and expanded memory
boards, for example, are adapter boards that might use some of this memory. On systems based on the 386 CPU chip or higher,
memory managers like the MS DOS 6 MEMMAKER, IBM DOS RAMBOOST, or aftermarket programs like QEMM by Quarterdeck, can load device
drivers and memory-resident programs into unused regions in the UMA.

To actually move the RAM usage on any given adapter requires that you consult the documentation for the card. Most older
cards require that specific switches or jumpers be changed, and the settings will probably not be obvious without the manual.
Most newer cards, especially those that are Plug and Play, allow these settings to be changed by software that either comes
with the card itself, or the Configuration Manager program that goes with some of the newer operating systems like Windows
95 or OS/2.

Video Adapter BIOS

The video adapter BIOS handles communication between the video chipset and the video RAM. Although 128K of upper memory
beginning at segment C000 is reserved for use by the video adapter BIOS, not all this space is used by various video adapters
commonly found on PCs. Table 7.2 details the amount of space used by the BIOS on each type of common video adapter card.

Table 7.2 Memory Used by Different Video Cards

Type of Adapter

Adapter BIOS Memory Used

Monochrome Display Adapter
(MDA)

None - Drivers in Motherboard
BIOS

Color Graphics Adapter (CGA)

None - Drivers in Motherboard
BIOS

Enhanced Graphics Adapter (EGA)

16K on-board (C0000-C3FFF)

Video Graphics Array (VGA)

32K on-board (C0000-C7FFF)

Super VGA (SVGA)

32K on-board (C0000-C7FFF)

Some more advanced graphics accelerator cards do use most or all of the 128K of upper memory beginning at segment C000
to speed the repainting of graphics displays in Windows, OS/2, or other graphical user interfaces (GUIs). In addition, these
graphics cards may contain a lot of on-board memory in which to store currently displayed data and more quickly fetch new
screen data as it is sent to the display by the CPU.

Hard Disk Controller and SCSI Host Adapter BIOS

The upper memory addresses C0000 to DFFFF also are used for the BIOS contained on many hard drive controllers. Table 7.3
details the amount of memory and the addresses commonly used by the BIOS contained on hard drive adapter cards.

Table 7.3 Memory Addresses Used by Different Hard Drive Adapter Cards

Disk Adapter Type

On-Board BIOS Size

BIOS Address Range

IBM XT 10M Controller

8K

C8000-C9FFF

IBM XT 20M Controller

4K

C8000-C8FFF

Most XT Compatible Controllers

8K

C8000-C9FFF

Most AT Controllers

None

Drivers in Motherboard BIOS

Most IDE Adapters

None

Drivers in Motherboard BIOS

Most ESDI Controllers

16K

C8000-CBFFF

Most SCSI Host Adapters

16K

C8000-CBFFF

The hard drive or SCSI adapter card used on a particular system may use a different amount of memory, but it is most likely
to use the memory segment beginning at C800 because this address is considered part of the IBM standard for personal computers.
Virtually all the disk controllers or SCSI adapters that have an on-board BIOS allow the BIOS starting address to be easily
moved in the C000 and D000 segments. The locations listed in Table 7.3 are only the default addresses that most of these cards
use. If the default address is already in use by another card, you have to consult the documentation for the new card to see
how to change the BIOS starting address to avoid any conflicts.

Note how this SCSI adapter fits in here. Although no conflicts are in the UMA memory, the free regions have been fragmented
by the placement of the SCSI BIOS. Because most systems do not have any BIOS in segment E000, that remains as a free 64K region.
With no other adapters using memory, this example shows another free UMB (Upper Memory Block) starting at C8000 and continuing
through DBFFF, which represents an 80K free region. Using the EMM386 driver that comes with DOS, memory can be mapped into
these two regions for loading memory-resident drivers and programs. Unfortunately, because programs cannot be split across
regions, the largest program you could load is 80K, which is the size of the largest free region. It would be much better
if you could move the SCSI adapter BIOS so that it is next to the VGA BIOS, as this would bring the free UMB space to a single
region of 144K. It is much easier and more efficient to use a single 144K region than two regions of 80K and 64K, respectively.

Fortunately, it is possible to move this particular SCSI adapter, although doing so requires that several switches be reset
on the card itself. One great thing about this Adaptec card is that a sticker is placed directly on the card detailing all
the switch settings, or the settings are screened into the card! This means that you don't have to go hunting for a manual
that may not be nearby. More adapter card manufacturers should place this information right on the card.

After changing the appropriate switches to move the SCSI adapter BIOS to start at C8000, the optimized map would look like
Figure 7.8.

FIG. 7.8 Adaptec AHA-1542CF SCSI adapter with optimized memory use. Notice how the free space is now
a single contiguous block of 144K.

This represents a far more optimum setup than the default settings.

Network Adapters

Network adapter cards also can use upper memory in segments C000 and D000. The exact amount of memory used and the starting
address for each network card varies with the type and manufacturer of the card. Some network cards do not use any memory
at all. A network card might have two primary uses for memory. They are as follows:

IPL (Initial Program Load or Boot) ROM

Shared Memory (RAM)

An IPL ROM is usually an 8K ROM that contains a bootstrap loader program that allows the system to boot directly
from a file server on the network. This allows the removal of all disk drives from the PC, creating a diskless workstation.
Because no floppy or hard disk would be in the system to boot from, the IPL ROM gives the system the instructions necessary
to locate an image of the operating system on the file server and load it as if it were on an internal drive. If you are not
using your system as a diskless workstation, it would be beneficial to disable any IPL ROM or IPL ROM Socket on the adapter
card. Note that many network adapters do not allow this socket to be disabled, which means that you lose the 8K of address
space for other hardware even if the ROM chip is removed from the socket!

Shared memory refers to a small portion of RAM contained on the network card that is mapped into the PC's Upper
Memory Area. This region is used as a memory window onto the network and offers very fast data transfer from the network card
to the system. IBM pioneered the use of shared memory for its first Token-Ring Network adapters, and later shared memory became
in common use among other companies' network adapters. Shared memory was first devised by IBM because they found that transfers
using the DMA channels were not fast enough in most systems. This had mainly to do with some quirks in the DMA controller
and bus design, which especially affected 16-bit ISA bus systems. Network adapters that do not use shared memory will either
use DMA or Programmed I/O (PIO) transfers to move data to and from the network adapter.

Although shared memory is faster than either DMA or PIO for ISA systems, it does require 16K of UMA space to work. Most
standard performance network adapters use PIO because this makes them easier to configure, and they require no free UMA space,
whereas most high performance adapters will use shared memory. The shared memory region on most network adapters that use
one is usually 16K in size and may be located at any user-selected 4K increment of memory in segments C000 or D000.

Figure 7.9 shows the default memory addresses for the IPL ROM and shared memory of an IBM Token-Ring Network adapter, although
other network adapters such as Ethernet adapters would be similar.

The standard VGA video BIOS is also included in Figure 7.9 because nearly every system would have a VGA-type video adapter
as well. Note that these default addresses for the IPL ROM and the shared memory can easily be changed by reconfiguring the
adapter. Most other network adapters are similar in that they also would have an IPL ROM and a shared memory address, although
the sizes of these areas and the default addresses may be different. Most network adapters that incorporate an IPL ROM option
can disable the ROM and socket such that those addresses are not needed at all. This helps to conserve UMA space and prevent
possible future conflicts if you are never going to use the function.

Notice in this case that the SCSI adapter used in Figure 7.9 would fit both at its default BIOS address of DC000, as well
as the optimum address of C8000. The Token-Ring shared memory location is not optimum and causes the UMB space to be fragmented.
By adjusting the location of the shared memory, this setup can be greatly improved. Figure 7.10 shows an optimum setup with
both the Token-Ring adapter and the SCSI adapter in the same machine.

This configuration allows a single 120K UMB that can very efficiently be used to load software drivers. Notice that the
IPL ROM was moved to D0000, which places it as the last item installed before the free memory space. This is because if the
IPL function is not needed, it can be disabled and the UMB space would increase to 128K and still be contiguous. If the default
settings are used for both the SCSI and network adapters, the UMB memory would be fragmented into three regions of 16K, 40K,
and 64K. The memory would still function, but it is hardly an optimum situation.

Other ROMs in the Upper Memory Area

In addition to the BIOS for hard drive controllers, SCSI adapters, and network cards, upper memory segments C000 and D000
are used by some terminal emulators, security adapters, memory boards, and various other devices and adapter boards. Some
adapters may require memory only for BIOS information, and others may require RAM in these upper memory segments. For information
on a specific adapter, consult the manufacturer's documentation.

Motherboard BIOS Memory

The last 128K of reserved memory is used by the motherboard BIOS. The BIOS programs in ROM control the system during the
bootup procedure and remain as drivers for various hardware in the system during normal operation. Because these programs
must be available immediately, they cannot be loaded from a device like a disk drive. The main functions of the programs stored
in the motherboard ROM are as follows:

Power-On Self Test, the POST, is a set of routines that tests the motherboard, memory, disk controllers, video
adapters, keyboard, and other primary system components. This routine is useful when you troubleshoot system failures or problems.

The bootstrap loader routine initiates a search for an operating system on a floppy disk or hard disk. If an operating
system is found, it is loaded into memory and given control of the system.

The BIOS is the software interface, or master control program, to all the hardware in the system. With the BIOS,
a program easily can access features in the system by calling on a standard BIOS program module instead of talking directly
to the device.

Both segments E000 and F000 in the memory map are considered reserved for the motherboard BIOS, but only some AT-type systems
actually use this entire area. PC/XT-type systems require only segment F000 and enable adapter card ROM or RAM to use segment
E000. Most AT systems use all of F000 for the BIOS, and may decode but not use any of segment E000. By decoding an area, the
AT motherboard essentially grabs control of the addresses, which precludes installing any other hardware in this region. In
other words, it is not possible to install any other adapters to use this area. That is why you will find that most adapters
that use memory simply do not allow any choices for memory use in segment E000. Although this may seem like a waste of 64K
of memory space, any 386 or higher system can use the powerful MMU in the processor to map RAM from extended memory into segment
E000 as an Upper Memory Block, and subsequently use it for loading software. This is a nice solution to what otherwise would
be wasted memory. Under DOS, the EMM386 driver controls the MMU remapping functions.

Many different ROM-interface programs are in the IBM motherboards, but the location of these programs is mostly consistent.

Figure 7.11 shows the motherboard ROM BIOS memory use of most AT-compatible systems. These systems lack the IBM Cassette
BASIC, but do usually include a built-in Setup program.

Note that the standard AT-compatible system BIOS uses only segment F000 (64K). In almost every case, the remainder of the
BIOS area (segment E000) is completely free and can be used as UMB space.

BIOS Error Messages

The ROM maps of most IBM compatibles equal the IBM system with which they are compatible--with the exception of the Cassette
BASIC portion (also called ROM BASIC). It may come as a surprise to some personal computer users, but the original
IBM PC actually had a jack on the rear of the system for connecting a cassette tape recorder. This was to be used for loading
programs and data to or from a cassette tape. Tapes were used at the time because floppy drives were very costly, and hard
disks were not even an option yet. Floppy drives came down in price quickly at the time, and the cassette port never appeared
on any subsequent IBM systems. The cassette port also never appeared on any compatible system. The original PC came standard
with only 16K of memory in the base configuration. No floppy drives were included, so you could not load or save files from
disks. Most computer users at the time would either write their own programs in the BASIC (Beginner's All-Purpose Symbolic
Instruction Code) language or run programs written by others. A BASIC language interpreter was built into the ROM BIOS of
these early IBMs, and was designed to access the cassette port on the back of the system.

What is really strange is that IBM kept this ROM BASIC relationship all the way through most of the PS/2 systems! The portable
486 PS/2 system (IBM P75 Portable) came standard with a built-in SCSI adapter. Yet this system still has the ROM BASIC wasting
32K of space! The ROM BASIC in the IBM systems is a sort of vestigial organ--a leftover that had some use in prehistoric ancestors.

You can catch a glimpse of this ROM BASIC on IBM systems that have it by disabling all the disk drives in the system. In
that case, with nothing to boot from, most IBM systems unceremoniously dump you into the strange (vintage 1981) ROM BASIC
screen. When this occurs, the message looks like this:

Many people used to dread seeing this because it usually meant that your hard disk had failed to be recognized! Because
no compatible systems ever had the Cassette BASIC interpreter in ROM, they had to come up with different messages to display
for the same situations in which an IBM system would invoke this BASIC. Compatibles that have an AMI BIOS in fact display
a confusing message, as follows:

NO
ROM BASIC - SYSTEM HALTED

This message is a BIOS error message that is displayed by the AMI BIOS when the same situations occur that would cause
an IBM system to dump into Cassette BASIC, which of course is not present in an AMI BIOS (or any other compatible BIOS for
that matter). Other BIOS versions display different messages. For example, under the same circumstances, a Compaq BIOS displays
the following:

Non-System disk
or disk error
replace and strike any key when ready

This is somewhat confusing on Compaq's part because this very same (or similar) error message is contained in the DOS Boot
Sector, and would normally be displayed if the system files were missing or corrupted.

In the same situations that you would see Cassette BASIC on an IBM system, a system with an Award BIOS would display the
following:

The first or second Phoenix message displays depending on exactly which error actually occurred.

Although the message displayed varies from BIOS to BIOS, the cause is the same for all of them. Two things can generally
cause any of these messages to be displayed, and they both relate to specific bytes in the Master Boot Record, which is the
first sector of a hard disk at the physical location Cylinder 0, Head 0, Sector 1.

The first problem relates to a disk that has either never been partitioned, or has had the Master Boot Sector corrupted.
During the boot process, the BIOS checks the last two bytes in the Master Boot Record (the first sector of the drive) for
a "signature" value of 55AAh. If the last two bytes are not 55AAh, an Interrupt 18h is invoked. This calls the subroutine
that displays the message you received, as well as the others indicated, or on an IBM system invokes Cassette (ROM) BASIC
itself.

The Master Boot Sector (including the signature bytes) is written to the hard disk by the DOS FDISK program. Immediately
after you low level format a hard disk, all the sectors are initialized with a pattern of bytes, and the first sector does
not contain the 55AAh signature. In other words, these ROM error messages are exactly what you see if you attempt to
boot from a hard disk that has been low level formatted, but has not yet been partitioned.

Now consider the second situation that can cause these messages. If the signature bytes are correct, the BIOS executes
the Master Partition Boot Record code, which performs a test of the Boot Indicator Bytes in each of the four partition table
entries. These bytes are at offset 446 (1BEh), 462 (1CEh), 478 (1DEh), and 494 (1EEh), respectively. They are used to indicate
which of the four possible partition table entries contain an active (bootable) partition. A value of 80h in any of these
byte offsets indicates that table contains the active partition, whereas all other values must be 00h. If more than one of
these bytes is 80h (indicating multiple active partitions), or any of the byte values is anything other than 80h or 00h, you
see the following error message:

Invalid
partition table

If all four of these Boot Indicator Bytes are 00h, indicating no active (bootable) partitions, then you also see Cassette
BASIC on an IBM system, or the other messages indicated earlier depending on which BIOS you have. This is exactly what occurs
if you were to remove the existing partitions from a drive using FDISK, but had not created new partitions on the drive, or
had failed to make one of the partitions Active (bootable) with FDISK before rebooting your system.

Extended Memory

As mentioned previously in this chapter, the memory map on a system based on the 286 or higher processor can extend beyond
the 1M boundary that exists when the processor is in real mode. On a 286 or 386SX system, the extended memory limit is 16M;
on a 386DX, 486, Pentium, Pentium MMX, or Pentium Pro system, the extended memory limit is 4G (4,096M). Systems based on the
Pentium II processor have a limit of 64G (65,536M).

For an AT system to address memory beyond the first megabyte, the processor must be in protected mode--the native
mode of these newer processors. On a 286, only programs designed to run in protected mode can take advantage of extended memory.
386 and higher processors offer another mode, called virtual real mode, which enables extended memory to be, in effect,
chopped into 1M pieces (each its own real mode session). Virtual real mode also allows for several of these sessions to be
running simultaneously in protected areas of memory. Although several DOS programs can be running at once, each still is limited
to a maximum of 640K of memory because each session simulates a real mode environment, right down to the BIOS and Upper Memory
Area. Running several programs at once in virtual real mode, called multitasking, requires software that can manage
each program and keep them from crashing into one another. OS/2, Windows 95, and Windows NT all do this.

The 286 and higher CPU chips also run in what is termed real mode, which enables full compatibility with the 8088
CPU chip installed on the PC/XT-type computer. Real mode enables you to run DOS programs one at a time on an AT-type system
just like you would on a PC/XT. However, an AT-type system running in real mode, particularly a 386-based or newer system,
is really functioning as little more than a turbo PC. In real mode, these processors can emulate the 8086 or 8088, but they
cannot operate in protected mode at the same time. For that reason the 386 and above also provide a virtual real mode that
operates under protected mode. This allows for the execution of real mode programs under the control of a protected mode operating
system like OS/2 or Windows NT.

NOTE: Extended memory is basically all memory past the first megabyte, which can only be
accessed while the processor is in protected mode.

XMS Memory

The extended memory specification (XMS) was developed in 1987 by Microsoft, Intel, AST Corp., and Lotus Development to
specify how programs would use extended memory. The XMS specification functions on systems based on the 286 or higher and
allows real mode programs (those designed to run in DOS) to use extended memory and another block of memory usually out of
the reach of DOS. Before XMS, there was no way to ensure cooperation between programs that switched the processor into protected
mode and used extended memory. There was no way for one program to know what another had been doing with the extended memory
because none of them could see that memory while in real mode. HIMEM.SYS becomes an arbitrator of sorts that first grabs all
the extended memory for itself and then doles it out to programs that know the XMS protocols. In this manner, several programs
that use XMS memory can operate together under DOS on the same system, switching the processor into and out of protected mode
to access the memory. XMS rules prevent one program from accessing memory that another has in use. Because Windows 3.x is
a program manager that switches the system to and from protected mode in running several programs at once, it has been set
up to require XMS memory to function. Windows 95 operates mostly in protected mode, but still calls on real mode for access
to many system components. Windows NT is a true protected mode operating system, as is OS/2.

Extended memory can be made to conform to the XMS specification by installing a device driver in the CONFIG.SYS file. The
most common XMS driver is HIMEM.SYS, which is included with Windows 3.x and later versions of DOS, starting with 4.0 and up.
Other memory managers, like QEMM, also convert extended memory into XMS-specification memory when you add its device drivers
to CONFIG.SYS.

High Memory Area (HMA) and the A20 line

The High Memory Area (HMA) is an area of memory 16 bytes short of 64K in size, starting at the beginning of the first megabyte
of extended memory. It can be used to load device drivers and memory-resident programs to free up conventional memory for
use by real mode programs. Only one device driver or memory-resident program can be loaded into HMA at one time, no matter
what its size. Originally this could be any program, but Microsoft decided that DOS could get there first, and built capability
into DOS 5 and newer versions.

The HMA area is extremely important to those who use DOS 5 or higher because these DOS versions can move their own kernel
(about 45K of program instructions) into this area. This is accomplished simply by first loading an XMS driver (such as HIMEM.SYS)
and adding the line DOS=HIGH to your CONFIG.SYS file. Taking advantage of this DOS capability frees another 45K or
so of conventional memory for use by real-mode programs by essentially moving 45K of program code into the first segment of
extended memory. Although this memory was supposed to be accessible in protected mode only, it turns out that a defect in
the design of the original 286 (which fortunately has been propagated forward to the more recent processors as a "feature")
accidentally allows access to most of the first segment of extended memory while still in real mode.

The use of the HMA is controlled by the HIMEM.SYS or equivalent driver. The origins of this memory usage are interesting
because they are based on a bug in the original 286 processor carried forward through the newer processors.

The problem started from the fact that memory addresses in Intel processors are dictated by an overlapping segment and
offset address. By setting the segment address to FFFF, which itself specifies an actual address of FFFF0 that is 16 bytes
from the end of the first megabyte, and then specifying an offset of FFFF, which is equal to 64K, you can create a memory
address as follows:

FFFF
segment
+ FFFF offset
______
= 10FFEF total

This type of address is impossible on a 8088 or 8086 system that has only 20 address lines and therefore cannot calculate
an address that large. By leaving off the leading digit, these processors interpret the address as 0FFEF, in essence causing
the address to "wrap around" and end up 16 bytes from the end of the first 64K segment of the first megabyte. The problem
with the 286 and higher was that when they were in real mode, they were supposed to operate the same way, and the address
should wrap around to the beginning of the first megabyte also. Unfortunately, a "bug" in the chip left the 21st address line
active (called the A20 line), which allowed the address to end up 16 bytes from the end of the first 64K segment in the second
megabyte. This memory was supposed to be addressable only in protected mode, but this bug allowed all but 16 bytes of the
first 64K of extended memory to be addressable in real mode.

Because this bug caused problems with many real mode programs that relied on the wrap to take place, when IBM engineers
designed the AT, they had to find a way to disable the A20 line while in real mode, but then re-enable it when in protected
mode. They did this by using some unused pins on the 8042 keyboard controller chip on the motherboard. The 8042 keyboard controller
was designed to accept scan codes from the keyboard and transmit them to the processor, but there were unused pins not needed
strictly for this function. So IBM came up with a way to command the keyboard controller to turn on and off the A20 line,
thus enabling the "defective" 286 to truly emulate an 8088 and 8086 while in real mode.

Microsoft realized that you could command the 8042 keyboard controller to turn back on the A20 line strictly for the purpose
of using this "bug" as a feature that enabled you to access the first 64K of extended memory (less 16 bytes) without having
to go through the lengthy and complicated process of switching to protected mode. Thus HIMEM.SYS and the High Memory Area
was born! HIMEM.SYS has to watch the system to see if the A20 line should be off for compatibility, or on to enable access
to the HMA or while in protected mode. In essence, HIMEM becomes a control program that manipulates the A20 line through the
8042 keyboard controller chip.

Expanded Memory

Some older programs can use a type of memory called Expanded Memory Specification or EMS memory. Unlike conventional
(the first megabyte) or extended (the second through 16th or 4,096th megabytes) memory, expanded memory is not directly
addressable by the processor. Instead, it can only be accessed through a 64K window and small 16K pages established in the
UMA. Expanded memory is a segment or bank-switching scheme in which a custom memory adapter has a large number of 64K segments
on-board, combined with special switching and mapping hardware. The system uses a free segment in the UMA as the home address
for the EMS board. After this 64K is filled with data, the board rotates the filled segment out and a new, empty segment appears
to take its place. In this fashion, you have a board that can keep on rotating in new segments to be filled with data. Because
only one segment can be seen or operated on at one time, EMS is very inefficient for program code and is normally only used
for data.

Intel originally created a custom-purpose memory board that had the necessary EMS bank-switching hardware. They called
these boards Above Boards, and were manufactured for a short period. EMS was designed with 8-bit systems in mind and
was appropriate for them because they had no capability to access extended memory. 286 and newer systems, however, have the
capability to have 15 or more megabytes of extended memory, which is much more efficient than the goofy (and slow) bank-switching
EMS scheme.

It is possible to use the powerful MMU of the 386 and higher processors to convert extended memory to function like LIM
EMS, but this should only be done if there is no way to use the extended memory directly. EMM386 can convert extended to expanded,
and in fact was originally designed for this purpose, although later it became more likely being used to map extended memory
into the UMA for the purposes of loading drivers and not for EMS. The EMM386 driver is included with DOS versions 5 and newer
as well as with Windows. If you have several versions on hand, as a rule, always use the newest one.

Preventing ROM BIOS Memory Conflicts and Overlap

As detailed in previous sections, C000 and D000 are reserved for use by adapter-board ROM and RAM. If two adapters have
overlapping ROM or RAM addresses, usually neither board operates properly. Each board functions if you remove or disable the
other one, but they do not work together.

With many adapter boards, you can change the actual memory locations to be used with jumpers, switches, or driver software,
which might be necessary to allow two boards to coexist in one system. This type of conflict can cause problems for troubleshooters.
You must read the documentation for each adapter to find out what memory addresses the adapter uses and how to change the
addresses to allow coexistence with another adapter. Most of the time, you can work around these problems by reconfiguring
the board or changing jumpers, switch settings, or software-driver parameters. This change enables the two boards to coexist
and stay out of each other's way.

Additionally, you must ensure that adapter boards do not use the same IRQ (interrupt request line), DMA (direct memory
access) channel, or I/O port address. You can easily avoid adapter board memory, IRQ, DMA channel, and I/O port conflicts
by creating a chart or template to mock up the system configuration by penciling on the template the resources already used
by each installed adapter. You end up with a picture of the system resources and the relationship of each adapter to the others.
This procedure helps you anticipate conflicts and ensures that you configure each adapter board correctly the first time.
The template also becomes important documentation when you consider new adapter purchases. New adapters must be configurable
to use the available resources in your system.

If your system has Plug and Play capabilities, and you use PnP adapters, it will be able to resolve conflicts between the
adapters by moving the memory usage on any conflict. Unfortunately, this routine is not intelligent and still requires human
intervention, that is, manual specification of addresses in order to achieve the most optimum location for the adapter memory.

ROM Shadowing

Computers based on the 386 or higher CPU chip, which provides memory access on a 32- or 64-bit path, often use a 16-bit
data path for system ROM BIOS information. In addition, adapter cards with on-board BIOS may use an 8-bit path to system memory.
On newer computers, using a 16- or 8-bit path to memory is a significant bottleneck to system performance. In addition to
these problems of width, most actual ROM chips are available in maximum speeds far less than what is available for the system's
dynamic RAM. For example, the fastest ROMs available are generally 150ns to 200ns, whereas the RAM in a newer system is rated
at 60ns or faster.

Because of the fact that ROM is so slow, any system accesses to programs or data in ROM cause many additional wait states
to be inserted. These wait states can slow the entire system down tremendously, especially considering that many of the driver
programs used constantly by DOS reside in the BIOS chips found on the motherboard and many of the installed adapters. Fortunately,
a way was found to transfer the contents of the slow 8- or 16-bit ROM chips into much faster 32-bit main memory. This is called
shadowing the ROMs.

Virtually all 386 and higher systems enable you to use what is termed shadow memory for the motherboard and possibly
some adapter ROMs as well. Shadowing essentially moves the programming code from slow ROM chips into fast 32-bit system memory.
Shadowing slower ROMs by copying their contents into RAM can greatly speed up these BIOS routines--sometimes making them four
to five times faster.

The shadowing is accomplished by using the powerful MMU in the 386 and higher processors. With the appropriate instructions,
the MMU can take a copy of the ROM code, place it in RAM, and enable the RAM such that it appears to the system in exactly
the same addresses in which it was originally located. This actually disables the ROM chips themselves, which are essentially
shut down. The system RAM that is now masquerading as ROM is fully write-protected so that it acts in every way just like
the real ROM, with the exception of being much faster, of course! Most systems have an option in the system Setup to enable
shadowing for the motherboard BIOS (usually segment F000) and the video BIOS (usually the first 32K of segment C000). Some
systems will go further and offer you the capability to enable or disable shadowing in (usually 16K) increments throughout
the remainder of the C000 and D000 segments.

NOTE: The important thing to note about shadowing is that if you enable shadowing for a
given set of addresses, anything found there when the system is booting will be copied to RAM and locked in place. If you
were to do this to a memory range that had a network adapter's shared memory mapped into it, the network card would cease
to function. You must only shadow ranges that contain true ROM and no RAM.

Some systems do not offer shadowing for areas other than the motherboard and video BIOS. In these systems, you can use
a memory manager such as EMM386 (which comes with DOS and Windows) to enable shadowing for any range you specify. It is preferable
to use the system's own internal shadowing capabilities first because the system shadowing uses memory that would otherwise
be discarded. Using an external memory manager such as EMM386 for shadowing costs you a small amount of extended memory, equal
to the amount of space you are shadowing.

If you enable shadowing for a range of addresses and one or more adapters or the system in general no longer works properly,
you may have scratch pad memory or other RAM within the shadowed area, which is not accessible as long as the shadowing remains
active. In this case, you should disable the shadowing for the system to operate properly. If you can figure out precisely
which addresses are ROM and which are RAM within the Upper Memory Area, you can selectively shadow only the ROM for maximum
system performance.

Total Installed Memory versus Total Usable Memory

One thing that most people don't realize is that not all the SIMM or other RAM memory you install in a system will be available.
Because of some quirks in system design, the system usually has to "throw away" up to 384K of RAM to make way for the Upper
Memory Area.

For example, most systems with 4M of RAM (which is 4,096K) installed show a total of only 3,712K installed during the POST
or when running Setup. This indicates that 4,096K-3,712K = 384K of missing memory! Some systems may show 3,968K with the same
4M installed, which works out to 4,096K-3,968K = 128K missing.

If you run your Setup program and check out your base and extended memory values, you will find more information than just
the single figure for the total shown during the POST. In most systems with 4,096K (4M), you have 640K base and 3,072K extended.
In some systems, Setup reports 640K base and 3,328K extended memory, which is a bonus. In other words, most systems come up
384K short, but some come up only 128K short.

This shortfall is not easy to explain, but it is consistent from system to system. Say that you have a 486 system with
two installed 72-pin (36-bit) 1M SIMMs. This results in a total installed memory of 2M in two separate banks because the processor
has a 32-bit data bus, and one parity bit is required for every eight data bits. Each SIMM is a single bank in this system.
Note that most cheaper 486 systems use the 30-pin (9-bit) SIMMs of which four are required to make a single bank. The first
bank (or SIMM in this case) starts at address 000000 (the first megabyte), and the second starts at 100000 (the second megabyte).

One of the cardinal rules of memory is that you absolutely cannot have two hardware devices wired to the same address.
This means that 384K of the first memory bank in this system would be in direct conflict with the Video RAM (segments A000
and B000), any adapter card ROMs (segments C000 and D000), and of course the motherboard ROM (segments E000 and F000). This
means that all SIMM RAM that occupies these addresses must be shut off or the system will not function! Actually, a motherboard
designer can do three things with the SIMM memory that would overlap from A0000-FFFFF:

Use the faster RAM to hold a copy of any slow ROMs (shadowing), disabling the ROM in the process.

Turn off any RAM not used for shadowing, eliminating any UMA conflicts.

Remap any RAM not used for shadowing, adding to the stack of currently installed extended memory.

Most systems shadow the motherboard ROM (usually 64K), the video ROM (32K), and simply turn off the rest. Some motherboard
ROMs allow additional shadowing to be selected between C8000-DFFFF, usually in 16K increments.

NOTE: You can only shadow ROM, never RAM, so if any card (such as a network card for example)
has a RAM buffer in the C8000-DFFFF area, you must not shadow the RAM buffer addresses or the card does not function. For
the same reason, you cannot shadow the A0000-BFFFF area because this is the video adapter RAM buffer.

Most motherboards do not do any remapping, which means that any of the 384K not shadowed is simply turned off. That is
why enabling shadowing does not seem to use any memory. The memory used for shadowing would otherwise be discarded in most
systems. These systems would appear to be short by 384K compared to what is physically installed in the system. In our example
system with 2M, no remapping would result in 640K of base memory and 1,024K of extended memory, for a total of 1,664K of usable
RAM--384K short of the total (2,048K-384K).

More advanced systems shadow what they can and then remap any segments that do not have shadowing into extended memory
so as not to waste the non-shadowed RAM. PS/2 systems, for example, shadow the motherboard BIOS area (E0000-FFFFF or 128K
in these systems) and remap the rest of the first bank of SIMM memory (256K from A0000-DFFFF) to whatever address follows
the last installed bank.

NOTE: Note that PS/2 systems have the video BIOS integrated with the motherboard BIOS in
E0000-FFFFF, so no separate video BIOS exists to shadow as compared to other systems.

In our example system with two 1M 36-bit SIMMs, the 256K not used for shadowing would be remapped to 200000-23FFFF, which
is the start of the third megabyte. This affects diagnostics because if you had any memory error reported in those addresses
(200000-23FFFF), it would indicate a failure in the first SIMM, even though the addresses point to the end of installed extended
memory. The addresses from 100000-1FFFFF would be in the second SIMM, and the 640K base memory 000000-09FFFF would be back
in the first SIMM. As you can see, figuring out how the SIMMs are mapped into the system is not easy.

Most systems that do remapping can only remap an entire segment if no shadowing is going on within it. The video RAM area
in segments A000 and B000 can never contain shadowing, so at least 128K can be remapped to the top of installed extended memory
in any system that supports remapping. Because most systems shadow in segments F000 (motherboard ROM) and C000 (Video ROM),
these two segments cannot be remapped. This leaves 256K maximum for remapping. Any system remapping the full 384K must not
be shadowing at all, which would slow down the system and is not recommended. Shadowing is always preferred over remapping,
and remapping what is not shadowed is definitely preferred to simply turning off the RAM.

Systems that have 384K of "missing" memory do not do remapping. If you want to determine if your system has any missing
memory, all you need to know are three things. One is the total physical memory actually installed. The other two items can
be discovered by running your Setup program. You want to know the total base and extended memory numbers recognized by the
system. Then simply subtract the base and extended memory from the total installed to determine the missing memory. You will
usually find that your system is "missing" 384K, but may be lucky and have a system that remaps 256K of what is missing and
thus shows only 128K of memory missing.

Virtually all systems use some of the missing memory for shadowing ROMs, especially the motherboard and video BIOS. So
what is missing is not completely wasted. Systems "missing" 128K will find that it is being used to shadow your motherboard
BIOS (64K from F0000-FFFFF) and video BIOS (32K from C0000-C8000). The remainder of segment C0000 (32K from C8000-CFFFF) is
simply being turned off. All other segments (128K from A0000-BFFFF and 128K from D0000-EFFFF) are being remapped to the start
of the fifth megabyte (400000-43FFFF). Most systems simply disable these remaining segments rather than take the trouble to
remap them. Remapping requires additional logic and BIOS routines, and many motherboard designers do not feel that it is worth
the effort to reclaim 256K.

NOTE: If your system is doing remapping, any errors reported near the end of installed extended
memory are likely to be in the first bank of memory because that is where they are remapped from. The first bank in a 32-bit
system would be constructed of either four 30-pin (9-bit) SIMMs or one 72-pin (36-bit) SIMM.

Adapter Memory Configuration and Optimization

Ideally, all adapter boards would be PnP devices that require you to merely plug the adapter into a motherboard slot and
then use it. However, sometimes it almost seems that adapter boards are designed as if they were the only adapter likely to
be present on a system. They usually require you to know the upper memory addresses and IRQ and DMA channels already on your
system, as well as how to configure the new adapter so that it does not conflict with your already-installed adapters.

Adapter boards use upper memory for their BIOS and as working RAM. If two boards attempt to use the same BIOS area or RAM
area of upper memory, a conflict occurs that can keep your system from booting. The following sections cover ways to avoid
these potential conflicts and how to troubleshoot them if they do occur. In addition, these sections discuss moving adapter
memory to resolve conflicts and provide some ideas on optimizing adapter memory use.

Adding adapters to EISA and MCA systems is somewhat easier because these system architectures feature auto-configure
adapter boards. In other words, EISA and MCA systems work with adapters to determine available upper memory addresses,
IRQs, and DMA channels and automatically configure all adapters to work optimally together.

How to Determine What Adapters Occupy the UMA

You can determine what adapters are using space in upper memory in the following two ways:

Study the documentation for each adapter on your system to determine the memory addresses they use.

Use a software utility that can quickly determine what upper memory areas your adapters are using.

The simplest way (although by no means always the most foolproof) is to use a software utility to determine the upper memory
areas used by the adapters installed on your system. One such utility, Microsoft Diagnostics (MSD), comes with Windows 3.x
and DOS 6 or higher versions. The Device Manager under System in the Windows 95 Control Panel also provides this information.
These utilities examine your system configuration and determine not only the upper memory used by your adapters, but also
the IRQs used by each of these adapters.

After you run MSD, Device Manager, or another utility to determine your system's upper memory configuration, make a printout
of the memory addresses used. Thereafter, you can quickly refer to the printout when you are adding a new adapter to ensure
that the new board does not conflict with any devices already installed on your system.

Moving Adapter Memory to Resolve Conflicts

After you identify a conflict or potential conflict by studying the documentation for the adapter boards installed on your
system or using a software diagnostic utility to determine the upper memory addresses used by your adapter boards, you may
have to reconfigure one or more of your adapters to move the upper memory space used by a problem adapter. Most adapter boards
make moving adapter memory a somewhat simple process, enabling you to change a few jumpers or switches to reconfigure the
board. The following steps help you resolve most conflicts that arise because adapter boards conflict with one another.

1. Determine the upper memory addresses currently used by your adapter boards and write them down.

2. Determine if any of these addresses are overlapping, which results in a conflict.

3. Consult the documentation for your adapter boards to determine which boards can be reconfigured so that all adapters
have access to unique memory addresses.

4. Configure the affected adapter boards so that no conflict in memory addresses occurs.

For example, if one adapter uses the upper memory range C8000-CBFFF and another adapter uses the range CA000-CCFFF, you
have a potential address conflict. One of these must be changed.

Optimizing Adapter Memory Use

On an ideal PC, adapter boards would always come configured so that the upper memory addresses they use immediately follow
the upper memory addresses used by the previous adapter, with no overlap that would cause conflicts. Such an upper memory
arrangement would not only be "clean," but would make it much more simple to use available upper memory for loading device
drivers and memory-resident programs. However, this is not the case. Adapter boards often leave gaps of unused memory between
one another, which is, of course, preferable to an overlap, but still is not the best use of upper memory.

Someone who wanted to make the most of their upper memory might consider studying the documentation for each adapter board
installed on his or her system to determine a way to compact the upper memory used by each of these devices. For example,
if it were possible on a particular system using the adapters installed on it, the use of upper memory could be more simple
if you configured your adapter boards so that the blocks of memory they use fit together like bricks in a wall, rather than
like a slice of Swiss cheese, as is the case on most systems. The more you can reduce your free upper memory to as few contiguous
chunks as possible, the more completely and efficiently you can take advantage of the UMA.

Taking Advantage of Unused Upper Memory

On systems using an older 16-bit operating system such as Windows 3.1 or DOS, memory-resident programs and device drivers
can be moved into the UMA by using a memory manager like the MEMMAKER utility or Quarterdeck's QEMM. These memory management
utilities examine the memory-resident programs and device drivers installed on your system, determine their memory needs,
and then calculate the best way to move these drivers and programs into upper memory, thus freeing the conventional memory
they used.

Using MEMMAKER and QEMM is quite simple. Make a backup of your CONFIG.SYS and AUTOEXEC.BAT files so that you have usable
copies if you need them to restore your system configuration. Then run either MEMMAKER from the DOS prompt or use the installation
program on the QEMM disk. Both programs install required device drivers in your CONFIG.SYS file, and then begin optimizing
your memory configuration. Both do an outstanding job of freeing up conventional memory, although QEMM can free more conventional
memory automatically than most other utilities. With careful fine-tuning, an individual can perform feats of memory management
using only the raw DOS HIMEM.SYS and EMM386.EXE drivers that no automatic program can do.

Only driver programs that run in the processor's real mode must be loaded within the first megabyte of memory. Because
real mode drivers are made up of 16-bit real mode program code, they cannot reside in extended memory, as only the first megabyte
(base memory) is accessible when in real mode. DOS and Windows 3.x are 16-bit programs and utilize drivers that run in real
mode, hence the need for the base memory optimization. If you have a lot of drivers to load, it can be difficult to fit them
all in the available UMA space while leaving enough base memory free to run applications.

Things were changing with the newer operating systems. Windows 95, for example, uses primarily 32-bit protected mode drivers
and program code, although there is still a large amount of 16-bit real mode program code left. Windows NT and OS/2 are full
32-bit operating systems, and all their drivers and applications are made up of 32-bit protected mode instruction code. If
you are using all 32-bit programs, then virtually no memory optimization is necessary in the first megabyte, as 32-bit programs
are free to run in extended memory.

The following sections cover using memory management software to optimize conventional memory, as well as additional ways
to configure your system memory to make your system run as efficiently as possible. It is important to note that the DOS HIMEM.SYS
and EMM386.EXE play an integral role in MEMMAKER's capability to move device drivers and memory-resident programs into upper
memory. The next two sections describe using HIMEM.SYS and EMM386.EXE to configure extended and expanded memory.

NOTE: If you are running older 16-bit DOS applications under Windows 95, Windows NT, or
OS/2, then you still need to know about base memory optimization. In these cases, you will be running the application in a
DOS window, which, using the virtual real mode of the processor, can emulate the first megabyte of real mode workspace. Using
these 32-bit operating systems, you can customize how the application running in the DOS window sees the system, and how the
system memory appears to be organized.

Using HIMEM.SYS (DOS)

The DOS device driver HIMEM.SYS, which has been included with Windows as well as DOS 4.0 and higher, is used to configure
extended memory to the XMS specification, as well as to enable the use of the first 64K of extended memory as the high memory
area (HMA). HIMEM.SYS is installed by adding a line invoking the device driver to your CONFIG.SYS file.

The XMS extended memory specification was developed by Microsoft, Intel, AST Corp., and Lotus Development in 1987 and specifies
how programs can use memory beyond the first megabyte on systems based on the 286 CPU chip or higher. The XMS specification
also allows real mode programs (those designed to run in DOS) to use extended memory in several different ways.

Using EMM386.EXE (DOS)

The program EMM386.EXE, which is included with DOS 5.0 and higher, is used primarily to map XMS memory (extended memory
managed by HIMEM.SYS) into unused regions of the UMA. This allows programs to be loaded into these regions for use under DOS.
EMM386 also has a secondary function of using XMS memory to emulate EMS version 4 memory, which can then be used by programs
that need expanded memory. For more information on using EMM386.EXE, refer to Que's Using MS-DOS 6 or your DOS manual.

MS-DOS 6.x MEMMAKER

You can increase the amount of conventional memory available to software applications on systems based on the 386 chip
and above by running the MS DOS 6.x utility MEMMAKER. DOS 5 had the capability, using EMM386, to map extended memory into
the UMA so that DOS could load memory-resident programs and drivers into the UMA. Unfortunately, this required an extensive
knowledge of the upper memory configuration of a particular system, as well as trial and error to see what programs could
fit into the available free regions. This process was difficult enough that many people were not effectively using their memory
under DOS (and Windows). To make things easier, when DOS 6 was released, Microsoft included a menu-driven program called MEMMAKER
that determines the system configuration, automatically creates the proper EMM386 statements, and inserts them into the CONFIG.SYS
file. By manipulating the UMA manually or through MEMMAKER and loading device drivers and memory-resident programs into upper
memory, you can have more than 600K of free conventional memory.

Over the course of months or years of use, the installation programs for various software utilities often install so many
memory-resident programs and device drivers in your AUTOEXEC.BAT and CONFIG.SYS files that you have too little conventional
memory left to start all the programs you want to run. You may want to use MEMMAKER to free up more conventional memory for
your programs. You can get help on MEMMAKER by typing HELP MEMMAKER at the DOS prompt. When you run the MEMMAKER utility,
it automatically performs the following functions:

Moves a portion of the DOS kernel into the HMA.

Maps free XMS memory into unused regions in the UMA as UMBs, into which DOS can then load device drivers and memory-resident
programs to free up the conventional memory these drivers and programs otherwise use.

Modifies CONFIG.SYS and AUTOEXEC.BAT to cause DOS to load memory-resident programs and device drivers into UMBs.

Before running MEMMAKER, carefully examine your CONFIG.SYS and AUTOEXEC.BAT files to identify unnecessary device drivers
and memory-resident programs. For example, the DOS device driver ANSI.SYS is often loaded in CONFIG.SYS to enable you to use
color and other attributes at the DOS prompt as well as to remap the keys on your keyboard. If you are primarily a Windows
user and do not spend much time at the DOS prompt, you can eliminate ANSI.SYS from your CONFIG.SYS file to free up the memory
the driver is using.

TIP: SETVER is another often loaded driver that most people don't need. If you don't run
utilities or programs that require a specific version of DOS, you can remove SETVER from your CONFIG.SYS file.

After you strip down CONFIG.SYS and AUTOEXEC.BAT to their bare essentials (it is advisable to make backup copies first),
you are ready to run MEMMAKER to optimize your system memory. To run MEMMAKER, follow these steps:

The MEMMAKER setup runs in two modes--Express and Custom. Express setup is preferable for users who want to enable MEMMAKER
to load device drivers and memory-resident programs into high memory with the minimum amount of user input, unless they have
an EGA or VGA (but not a Super VGA) monitor. If you have an EGA or VGA monitor, choose Custom Setup and answer Yes in the
advanced options screen where it asks whether MEMMAKER should use monochrome region (B0000-B7FFF) for running programs. Use
the defaults for the rest of the options in Custom setup unless you are sure that one of the defaults is not correct for your
system. Custom setup is probably not a good idea unless you are knowledgeable about optimizing system memory, particular device
drivers, and memory-resident programs on the system.

When MEMMAKER finishes optimizing the system memory, the following three lines are added to CONFIG.SYS:

DEVICE=C:\DOS\HIMEM.SYS
DEVICE=C:\DOS\EMM386.EXE NOEMS
DOS=HIGH,UMB

In addition, MEMMAKER modifies each line in CONFIG.SYS and AUTOEXEC.BAT that loads a device driver or memory-resident program
now being loaded into UMBs. Various DEVICE= lines in your CONFIG.SYS are changed to DEVICEHIGH=, and various lines in your
AUTOEXEC.BAT have the LH (LoadHigh) command inserted in front of them. For example, the line DEVICE=ANSI.SYS is changed to
DEVICEHIGH=ANSI.SYS. In your AUTOEXEC.BAT, lines like C:\DOS\DOSKEY are changed to LH C:\DOS\DOSKEY. The DEVICEHIGH and LH
commands load the device drivers and memory-resident programs into UMBs. MEMMAKER also adds codes to specify where in upper
memory each program will be loaded. For example, after you run MEMMAKER, a statement like this might be added to your AUTOEXEC.BAT:

LH /L:1 C:\DOS\DOSKEY

The /L:1 causes the resident program DOSKEY to load into the first UMB region. On many systems, MEMMAKER configures the
system to free up 620K of conventional memory.

Quarterdeck QEMM

Although MEMMAKER does a good job of freeing-up conventional memory on most systems, memory management utilities like Quarterdeck's
QEMM can do a better job on many systems with more complex configurations, and therefore, numerous memory-resident programs
and device drivers. The following section provides information about QEMM. If you are running Windows 95 or Windows NT, be
aware that many products are available in new versions that are specifically designed for those operating systems.

One of the strengths of QEMM is how simple it is to install and use. Before running the QEMM INSTALL program, make a backup
of your CONFIG.SYS and AUTOEXEC.BAT files so that you have usable copies if you need them to restore your system configuration.

1. Exit any program you are running.

2. At the DOS prompt, go to the drive where the QEMM install disk is located and run the INSTALL program. QEMM copies
its files to the C:\QEMM directory (or another directory, if you want). The INSTALL program loads the Optimize utility, which
calculates the upper memory needed for your memory-resident programs and device drivers, and determines the proper region
of upper memory for each. During this process, your system is rebooted several times (or when prompted, you may have to turn
off your system and then restart it).

3. When Optimize is finished, type MEM at the DOS prompt to find out how much free conventional memory your
system has.

After QEMM is installed and running on your system, each time you add a memory-resident program or device driver, or any
time you add or remove an adapter board (which might change the configuration of upper memory), you need to run OPTIMIZE again.
For additional information on installing and running QEMM, and for troubleshooting help, consult your QEMM user manual.

One of the best features of QEMM is that it comes with a system configuration diagnostic utility called MANIFEST. This
program is much like MSD, but offers more information and detail in many areas.

Physical Memory

The CPU and motherboard architecture dictates a computer's physical memory capacity. The 8088 and 8086, with 20 address
lines, can use as much as 1M (1024K) of RAM. The 286 and 386SX CPUs have 24 address lines; they can keep track of as much
as 16M of memory. The 386DX, 486, Pentium, Pentium-MMX, and Pentium Pro CPUs have a full set of 32 address lines; they can
keep track of 4G of memory, while the Pentium II with 36 address lines can manage 64G. In most situations you can never install
that much memory, because most motherboards have only a few SIMM or DIMM sockets.

When the 286 and higher chips emulate the 8088 chip (as they do when running a single DOS program), they implement a hardware
operating mode called real mode. Real mode is the only mode available on the 8086 and 8088 chips used in PC and XT
systems. In real mode, all Intel processors are restricted to using only 1M of memory, just as their 8086 and 8088 ancestors,
and the system design reserves 384K of that amount. Only in protected mode the 286 or better chips can use their maximum potential
for memory addressing.

On many systems, accessing RAM chips installed directly on a motherboard is faster than accessing memory through an expansion
slot. Even without considering this speed advantage, you have the advantage of saving slots. The more memory chips you can
get on the motherboard, the fewer adapter slots you need to use. A system that does not have a memory expansion slot faces
a large reduction in speed if you use a memory expansion board made for a standard 16-bit slot.

Some 386 and 486 motherboards may have problems addressing memory past 16M due to DMA (Direct Memory Access) controller
problems. If you install an ISA adapter that uses a DMA channel and you have more than 16M of memory, you have the potential
for problems because the ISA bus only allows DMA access to 16M. Attempted transfers beyond 16M cause the system to crash.
This should not be an issue with newer 32-bit operating systems.

Because the PC hardware design reserves the top 384K of the first megabyte of system memory for use by the system itself,
you have access to 640K for your programs and data. The use of 384K by the system results in the 640K conventional memory
limit. The amount of conventional memory you can actually use for programs depends on the memory used by device drivers (such
as ANSI.SYS) and memory-resident programs (such as MOUSE.COM) you load in your CONFIG.SYS and AUTOEXEC.BAT files. Device drivers
and memory-resident programs usually use conventional memory.

RAM Chips

A RAM chip temporarily stores programs when they are running and the data being used by those programs. RAM chips
are sometimes termed volatile storage because when you turn off your computer or an electrical outage occurs, whatever
is stored in RAM is lost unless you saved it to your hard drive. Because of the volatile nature of RAM, many computer users
make it a habit to save their work frequently. (Some software applications can do timed backups automatically.)

Launching a computer program brings files into RAM, and as long as they are running, computer programs reside in RAM. The
CPU executes programmed instructions in RAM. RAM stores your keystrokes when you use a word processor. RAM stores numbers
used in calculations. The CPU also stores results in RAM. Telling a program to save your data instructs the program to store
RAM contents on your hard drive as a file.

If you decide to purchase more RAM, you need the information on RAM chips and their speeds presented in the following sections
to help ensure that you don't slow down your computer when you add memory.

Physical Storage and Organization

RAM chips can be physically integrated into the motherboard or adapter board in several forms. Older systems used individual
memory chips, called dual in-line package (DIP) chips, that were plugged into sockets or soldered directly to a board.
Many 286-, 386- and 486-based systems use a 30-pin memory package called a single in-line memory module (SIMM). Later
486-based and the first Pentium systems use 70-pin SIMMs. Newer Pentium systems use a 168-pin package called dual in-line
memory module (DIMM). These modules combine several chips on a small circuit board plugged into a retaining socket. A
SIPP, or single in-line pinned package, is similar to a SIMM, but it uses pins rather than an edge connector
to connect to the motherboard. It would be possible to convert a SIPP to a SIMM by cutting off the pins, or to convert a SIMM
to a SIPP by soldering pins on. Also, some companies have made SIPP to SIMM converters that allow the SIPPs to be plugged
into 30-pin SIMM sockets.

Several types of memory chips have been used in PC system motherboards. Most of these chips are single-bit-wide chips,
available in several capacities. The following table lists available RAM chips and their capacities:

RAM Chip

Capacity

16K by 1 bit

These devices were used in
the original IBM PC with a Type 1 motherboard.

64K by 1 bit

These chips were used in the
standard IBM PC Type 2 motherboard and in the XT Type 1 and 2 motherboards. Many memory adapters of the era, such as the popular
vintage AST 6-pack boards, used these chips also.

128K by 1 bit

These chips, used in the IBM
AT Type 1 motherboard, often were a strange physical combination of two 64K chips stacked on top of one another and soldered
together. Single-chip versions were used also for storing the parity bits in the IBM XT 286.

256K by 1 bit (or 64K by 4
bits)

These chips once were very
popular in motherboards and memory cards. The IBM XT Type 2 and IBM AT Type 2 motherboards, as well as most compatible systems
of that era used these chips.

1M by 1 bit (or 256K by 4 bits)

1M chips were very popular
for a number of years and were most often used in 256K to 8M SIMMs.

4M by 1 bit (or 1M by 4 bits)

4M chips are used primarily
in SIMMs from 1M to 16M in capacity. They generally are not sold as individual chips.

16M by 1 bit (or 4M by 4 bits)

16M chips are often used in
72-pin SIMMs of 16M to 32M capacity.

64M by 1 bit (or 16M by 4 bits)

64M chips are used in 16M or
larger memory modules, especially for notebook systems.

256M by 1 bit (or 64M by 4
bits)

These chips allow DIMM capacities
of 128M or larger.

Figure 7.13 shows a typical memory chip. Each marking on the chip is significant.

The -10 on the chip corresponds to its speed in nanoseconds (a 100-nanosecond rating). MB81256 is the chip's part number,
which usually contains a clue about the chip's capacity. The key digits are 1256, which indicate that this chip is 1-bit wide,
and has a depth of 256K. The 1 means that to make a full byte with parity, you need nine of these single-bit-wide chips. A
chip with a part number KM4164B-10 indicates a 64K-by-1-bit chip at a speed of 100 ns. The following list matches common chips
with their part numbers:

Part Number

Chip

4164

64K by 1 bit

4464

64K by 4 bits

41128

128K by 1 bit

44128

128K by 4 bits

41256

256K by 1 bit

44256

256K by 4 bits

41000

1M by 1 bit

44000

1M by 4 bits

Chips wider than 1 bit are used to construct banks of less than 9, 18, or 36 chips (depending on the system architecture).
For example, in the IBM XT 286, which is an AT-type 16-bit system, the last 128K bytes of memory on the motherboard consist
of a bank with only six chips; four are 64K-by-4 bits wide, and two parity chips are 1 bit wide, storing 18 bits.

In Figure 7.13, the "F" symbol centered between two lines is the manufacturer's logo for Fujitsu Microelectronics. The
8609 indicates the date of manufacture (ninth week of 1986). Some manufacturers, however, use a Julian date code. To decode
the chip further, contact the manufacturer if you can tell who that is, or perhaps a memory chip vendor.

Memory Banks

Memory chips (DIPs, SIMMs, SIPPs, and DIMMs) are organized in banks on motherboards and memory cards. You should
know the memory bank layout and position on the motherboard and memory cards.

You need to know the bank layout when adding memory to the system. In addition, memory diagnostics report error locations
by byte and bit addresses, and you must use these numbers to locate which bank in your system contains the problem.

The banks usually correspond to the data bus capacity of the system's microprocessor. Table 7.4 shows the widths of individual
banks based on the type of PC.

The number of bits for each bank can be made up of single chips, SIMMs, or DIMMs. For example, in a 286 system that would
use an 18-bit bank, you could make up a bank of 18 individual 1-bit-wide chips, or you could use four individual 4-bit-wide
chips to make up the data bits, and two individual 1-bit-wide chips for the parity bits.

Table 7.4 Memory Bank Widths on Different Systems

Processor

Data Bus

Memory Bank Size (No Parity)

Memory Bank Size (Parity)

30-pin SIMMs Per Bank

72-pin SIMMs Per Bank

168-pin DIMMs Per Bank

8088

8-bit

8-bits

9-bits

1

<1 *

<1 *

8086

16-bit

16-bits

18-bits

2

<1 *

<1 *

286

16-bit

16-bits

18-bits

2

<1 *

<1 *

386SX, SL, SLC

16-bit

16-bits

18-bits

2

<1 *

<1 *

386DX

32-bit

32-bits

36-bits

4

1

<1 *

486SLC, SLC2

16-bit

16-bits

18-bits

2

<1 *

<1 *

486SX, DX, DX2, DX4

32-bit

32-bits

36-bits

4

1

<1 *

Pentium, MMX

64-bit

64-bits

72-bits

8

2

1

Pentium Pro, II

64-bit

64-bits

72-bits

8

2

1

* In these cases, a single SIMM or DIMM constitutes multiple banks of memory.

Newer systems do not use chips, but instead use SIMMs or DIMMs. If the system has an 18-bit bank, it likely would use 30-pin
SIMMs and have two SIMMs per bank. All the SIMMs in a single bank must be the same size and type. As you can see, the 30-pin
SIMMs are less than ideal for 64-bit systems because you must use them in increments of eight per bank! Using 30-pin SIMMs
in 32- and 64-bit systems artificially constricts memory configurations and such systems are not recommended. If a 32-bit
system uses 72-pin SIMMs, each SIMM represents a separate bank, and the SIMMs can be added or removed on an individual basis
rather than in groups of four. This makes memory configuration much easier and more flexible.

In 64-bit systems, two 72-pin SIMMs are required per bank. The newer 64-bit systems use the 168-pin DIMM devices. These
are 64 bits without parity, and 72 bits each with parity. The devices function as a single bank in these systems.

Older systems often used individual chips. For example, the IBM PC Type 2 and XT Type 1 motherboards contain four banks
of memory labeled Bank 0, 1, 2, and 3. Each bank uses nine 64Kx1-bit chips. The total number of chips present is 4x9, or 36
chips.

This layout is used in many older 8-bit motherboards, including the Type 1 and 2 PC motherboards and the Type 1 and 2 XT
motherboards. Most PC or XT clones also followed this scheme.

The physical orientation used on a motherboard or memory card is arbitrary and determined by the board's designers. Documentation
covering your system or card comes in very handy. You can determine the layout of a motherboard or adapter card through testing,
but this takes time and may be difficult, particularly after you have a problem with a system.

Parity Checking

One standard IBM set for the industry is that the memory chips in a bank of nine each handle one bit of data: eight bits
per character plus one extra bit called the parity bit. The parity bit enables memory-control circuitry to keep tabs
on the other eight bits--a built-in cross-check for the integrity of each byte in the system. If the circuitry detects an
error, the computer stops and displays a message informing you of the malfunction. If you are running a newer operating system
such as Windows or OS/2, a parity error will generally manifest itself as a locked system. When you reboot, the BIOS should
detect the error and display the appropriate error message.

SIMMs are available both with and without parity bits. Most of the IBM- compatible systems use parity-checked memory to
ensure accuracy. Other non-IBM-compatible systems like the Apple Macintosh have never used parity-checked memory. For example,
Apple computers use the same 30-pin or 72-pin SIMMs as IBM systems, but Apple computers as a rule do not have parity-checking
circuitry, so they can use slightly cheaper 30-pin SIMMs that are only 8 bits wide instead of 9 bits, as is required on many
IBM-compatible systems. They also can use 72-pin SIMMs that are only 32-bits wide rather than 36-bits (32 data bits plus 4
parity bits) as is required on most IBM compatibles. You can use the parity SIMMs in Apple systems, they will simply ignore
the extra bits. If you use non-parity SIMMs in an IBM compatible that requires parity-checked memory, you instantly get memory
errors, and the system cannot operate. If you service both IBM and Apple systems, you could simply stock only parity SIMMs
because they can be used in either system.

Because several of the big names have started selling systems without parity, most of the others have been forced to follow
to remain price competitive. Because nobody wants to announce this information, it has remained as a sort of dirty little
secret within the industry. What is amazing is that the 386 and higher processors all contain the parity circuitry within
them, so no additional circuits are needed on the motherboard. It is solely the cost of the parity chips on the SIMMs that
is being saved.

IBM established the odd parity standard for error checking. The following explanation may help you understand what
is meant by odd parity. As the eight individual bits in a byte are stored in memory, a parity generator/checker, which is
either part of the CPU or located in a special chip on the motherboard, evaluates the data bits by counting the number of
1s in the byte. If an even number of 1s is in the byte, the parity generator/checker creates a 1 and stores it as the ninth
bit (parity bit) in the parity memory chip. That makes the total sum for all nine bits an odd number. If the original sum
of the eight data bits is an odd number, the parity bit created is 0, keeping the 9-bit sum an odd number. The value of the
parity bit is always chosen so that the sum of all nine bits (eight data bits plus one parity bit) is an odd number. Remember
that the eight data bits in a byte are numbered 0 1 2 3 4 5 6 7. The following examples may make it easier to understand:

In this example, because the total
number of data bits with a value of 1 is an odd number (5), the parity bit must have a value of 0 to ensure an odd sum for
all nine bits. The following is another example:

In this example, because the total number of data bits with a value of 1 is an even number (4), the parity bit must have
a value of 1 to create an odd sum for all nine bits.

When the system reads memory back from storage, it checks the parity information. If a (9-bit) byte has an even number
of bits with a parity bit value of 1, that byte must have an error. The system cannot tell which bit has changed, or if only
a single bit has changed. If three bits changed, for example, the byte still flags a parity-check error; if two bits changed,
however, the bad byte may pass unnoticed. The following examples show parity-check messages for three types of systems:

For the IBM PC:
PARITY CHECK x
For the IBM XT: PARITY CHECK x yyyyy (z)
For the IBM AT and late model XT: PARITY CHECK x yyyyy

Where x is 1 or 2:1 = Error occurred on
the motherboard2 = Error occurred in an expansion slotyyyy
represents a number from 00000 through FFFFF that indicates, in hexadecimal notation, the byte in which the error has occurred.

Where (z) is (S) or (e):(S) = Parity error
occurred in the system unit(e)= Parity error occurred in the expansion chassis

NOTE: An expansion chassis was an option IBM sold for the original PC and XT systems to
add more expansion slots. This unit consisted of a backplane motherboard with eight slots, one of which contained a special
extender/receiver card cabled to a similar extender/receiver card placed in the main system. Due to the extender/receiver
cards in the main system and the expansion chassis, the net gain was six slots.

When a parity-check error is detected, the motherboard parity-checking circuits generate a non-maskable interrupt
(NMI), which halts processing and diverts the system's attention to the error. The NMI causes a routine in the ROM to be executed.
The routine clears the screen and then displays a message in the upper-left corner of the screen. The message differs depending
on the type of computer system. On some older IBM systems, the ROM parity-check routine halts the CPU. In such a case, the
system locks up, and you must perform a hardware reset or a power-off/power-on cycle to restart the system. Unfortunately,
all unsaved work is lost in the process.

Most systems do not halt the CPU when a parity error is detected; instead, they offer you a choice of either rebooting
the system or continuing as though nothing happened. Additionally, these systems may display the parity error message in a
different format from IBM, although the information presented is basically the same. For example, many systems with a Phoenix
BIOS display these messages:

The first of these two messages indicates a motherboard parity error (Parity Check 1), and the second indicates an expansion-slot
parity error (Parity Check 2). Notice that the address given in the form xxxx:xxxx for the memory error is in a segment:offset
form rather than a straight linear address such as with IBM's error messages. The segment:offset address form still gives
you the location of the error to a resolution of a single byte.

You have three ways to proceed after viewing this error message.

You can press S, which shuts off parity checking and resumes system operation at the point where the parity check first
occurred.

Pressing R forces the system to reboot, losing any unsaved work.

Pressing any other key causes the system to resume operation with parity checking still enabled.

If the problem recurs, it is likely to cause another parity-check interruption. In most cases, it is most prudent to press
S, which disables the parity checking so that you can then save your work. It would be best in this case to save your work
to a floppy disk to prevent the possible corruption of a hard disk. You should also avoid overwriting any previous (still
good) versions of whatever file you are saving, because in fact you may be saving a bad file due to the memory corruption.
Because parity checking is now disabled, your save operations will not be interrupted. Then you should power the system off,
restart it, and run whatever memory diagnostics software you have to try and track down the error. In some cases, the POST
finds the error on the next restart, but in most cases you need to run a more sophisticated diagnostics program, perhaps in
a continuous mode, to locate the error.

The AMI BIOS displays the parity error messages in the following forms:

ON BOARD PARITY ERROR ADDR (HEX) = (xxxxx)

or

OFF BOARD PARITY ERROR
ADDR (HEX) = (xxxxx)

These messages indicate that an error in memory has occurred during the POST, and the failure is located at the address
indicated. The first one indicates the error occurred on the motherboard, whereas the second message indicates an error in
an expansion slot adapter card. The AMI BIOS also can display memory errors in the following manner:

Memory Parity Error at xxxxx

or

I/O Card Parity Error
at xxxxx

These messages indicate that an error in memory has occurred at the indicated address during normal operation. The first
one indicates a motherboard memory error, and the second indicates an expansion slot adapter memory error.

Although many systems enable you to continue processing after a parity error, and even allow for the disabling of further
parity checking, continuing to use your system after a parity error is detected can be dangerous. The idea behind letting
you continue using either method is to give you time to save any unsaved work before you diagnose and service the computer,
but be careful how you do this.

CAUTION: When you are notified of a memory parity error, remember the parity check is telling
you that memory has been corrupted. Do you want to save potentially corrupted data over the good file from the last time you
saved? Definitely not! Make sure that you save your work to a different file name. In addition, after a parity error, save
only to a floppy disk if possible and avoid writing to the hard disk; there is a slight chance that the hard drive could become
corrupted if you save the contents of corrupted memory.

After saving your work, determine the cause of the parity error and repair the system. You may be tempted to use an option
to shut off further parity checking and simply continue using the system as if nothing were wrong. Doing so resembles unscrewing
the oil pressure warning indicator bulb on a car with an oil leak so that the oil pressure light won't bother you anymore!

SIMMs and DIMMs

For memory storage, most newer systems have adopted the single in-line memory module (SIMM) or dual in-line memory module
(DIMM) as an alternative to individual memory chips. These small boards plug into special connectors on a motherboard or memory
card. The individual memory chips are soldered to the SIMM/DIMM, so removing and replacing individual memory chips is impossible.
Instead, you must replace the entire module if any part of it fails. The SIMM/DIMM is treated as though it were one large
memory chip.

IBM compatibles have two main physical types of SIMMs--30-pin (9-bit) and 72-pin (36-bit)--with various capacities and
other specifications. The 30-pin SIMMs are smaller than the 72-pin versions, and may have chips on either one or both sides.
DIMMs, which have become popular on Pentium-MMX and Pentium Pro-based systems, are 168-pin units with 64-bit (non-parity)
or 72-bit (parity) data paths.

Figures 7.14 and 7.15 show typical 30-pin (9-bit) and 72-pin (36-bit) SIMMs, respectively. The pins are numbered from left
to right and are connected through to both sides of the module. Note that all dimensions are in both inches and millimeters
(in parentheses).

A SIMM is extremely compact considering the amount of memory it holds. SIMMs are available in several capacities, depending
on the version. Table 7.5 lists the different capacities available for both the 30-pin and 72-pin SIMMs, as well as 168-pin
DIMMs.

Table 7.5 SIMM and DIMM Capacities

30-Pin SIMM Capacities

Capacity

Parity SIMM

Non-Parity SIMM

256K

256Kx9

256Kx8

1M

1Mx9

1Mx8

4M

4Mx9

4Mx8

16M

16Mx9

16Mx8

72-Pin SIMM Capacities

Capacity

Parity SIMM

Non-Parity SIMM

1M

256Kx36

256Kx32

2M

512Kx36

512Kx32

4M

1Mx36

1Mx32

8M

2Mx36

2Mx32

16M

4Mx36

4Mx32

32M

8Mx36

8Mx32

64M

16Mx36

16Mx32

168-Pin DIMM Capacities

Capacity

Parity DIMM

Non-Parity DIMM

8M

1Mx72

1Mx64

16M

2Mx72

2Mx64

32M

4Mx72

4Mx64

64M

8Mx72

8Mx64

128M

16Mx72

16Mx64

256M

32Mx72

32Mx64

512M

64Mx72

64Mx64

Dynamic RAM (DRAM) SIMMs of each type and capacity are available in different speed ratings. These ratings are expressed
in nanoseconds (billionths of a second, abbreviated ns). SIMMs have been available in many different speed ratings ranging
from 120ns for some of the slowest, to 50ns for some of the fastest available. Many of the first systems to use SIMMs used
versions rated at 120ns. These were quickly replaced in the market by 80ns, 70ns and 60ns.

If a system requires a specific speed, you can almost always substitute faster speeds if the one specified is not available.
There are no problems in mixing SIMM speeds, as long as you use SIMMs equal or faster than what the system requires.

NOTE: Most DIMMs are Synchronous DRAM (SDRAM) memory, which means they deliver data in very
high speed bursts using a clocked interface. SDRAM supports bus speeds of 100MHz, 133MHz or faster.

Several variations on the 30-pin SIMMs can affect how they work (if at all) in a particular system. First, there are actually
two variations on the pinout configurations. Most systems use a generic type of SIMM, which has an industry standard
pin configuration. Many older IBM systems used a slightly modified 30-pin SIMM, starting with the XT-286 introduced in 1986
through the PS/2 Model 25, 30, 50, and 60. These systems require a SIMM with different signals on five of the pins. These
are known as IBM-style 30-pin SIMMs. You can modify a generic 30-pin SIMM to work in the IBM systems and vice versa,
but purchasing a SIMM with the correct pinouts is much easier. Be sure you tell the SIMM vendor if you need the specific IBM-style
versions.

Another issue with respect to the 30-pin SIMMs relates to the chip count. The SIMM itself acts as if it were a single chip
of 9-bits wide (with parity), and it really does not matter how this total is derived. Older SIMMs were constructed with nine
individual 1-bit-wide chips to make up the total, whereas many newer SIMMs use two 4-bit-wide chips and one 1-bit-wide chip
for parity, making a total of three chips on the SIMM. Accessing the 3-chip SIMMs can require adjustments to the refresh timing
circuits on the motherboard, and many older motherboards could not cope. Most newer motherboards automatically handle the
slightly different refresh timing of both the 3-chip or 9-chip SIMMs, and in this case the 3-chip versions are more reliable,
use less power, and generally cost less as well. If you have an older system, most likely it will also work with the 3-chip
SIMMs, but some do not. Unfortunately, the only way to know is to try them. To prevent the additional time required to change
them for 9-chip versions should the 3-chip versions not work in an older system, it seems wise to stick with the 9-chip variety
in any older systems.

The 72-pin SIMMs do not have different pinouts and are differentiated only by capacity and speed. These SIMMs are not affected
by the number of chips on them. The 72-pin SIMMs are ideal for 32-bit systems like 486 machines because they comprise an entire
bank of memory (32 data bits plus 4 parity bits). When you configure a 32-bit system that uses a 72-pin SIMM, you can usually
add or remove memory in single SIMM modules (except on systems that use interleaved memory schemes to reduce wait states).

In 64-bit systems--which includes any Pentium or newer processor--72-pin SIMMs must be used in pairs to fill a single bank.
A few motherboard manufacturers offered so-called "SIMM-saver" motherboards that were designed for newer Pentium processors,
but had both 72- and 30-pin SIMM sockets. Although this was not the most desirable arrangement, it allowed users on a budget
to re-use their old 30-pin SIMMs. In this situation, eight 30-pin SIMMs can be used at a time to fill one bank. Alternatively,
you could pair four 30-pin SIMMs with one 72-pin SIMM to create one bank. This really is not a very efficient setup because
it consumes large amounts of space on the motherboard.

Other options are SIMM stackers and converters. These items allow you to use 30-pin SIMMs in 72-pin sockets, thereby saving
you the expense of having to scrap all those old 30-pin SIMMs you have lying around. Again, such adapters can cause problems,
specially if overhead clearance is tight.

Remember that some 486 systems (such as the PS/2 90 and 95 systems) use interleaved memory to reduce wait states. This
requires a multiple of two 36-bit SIMMs because interleaved memory access is alternated between the SIMMs to improve performance.

NOTE: A bank is the smallest amount of memory that can be addressed by the processor at
one time and usually corresponds to the data bus width of the processor. If the memory is interleaved, a virtual bank may
be twice the absolute data bus width of the processor.

You cannot always replace a SIMM with a greater-capacity unit and expect it to work. For example, the IBM PS/2 Model 70-Axx
and Bxx systems accept 72-pin SIMMs of 1M or 2M capacity, which are 80ns or faster. Although an 80ns 4M SIMM is available,
it does not work in these systems. The PS/2 Model 55 SX and 65 SX, however, accept 1M, 2M, or 4M 72-pin SIMMs. A larger-capacity
SIMM works only if the motherboard is designed to accept it in the first place. Consult your system documentation to determine
the correct capacity and speed to use.

SIMMs were designed to eliminate chip creep, which plagues systems with memory chips installed in sockets. Chip creep
occurs when a chip works its way out of its socket, caused by the normal thermal expansion and contraction from powering a
system on and off. Eventually, chip creep leads to poor contact between the chip leads and the socket, and memory errors and
problems begin.

The original solution for chip creep was to solder all the memory chips to the printed circuit board. This approach, however,
was impractical. Memory chips fail more frequently than most other types of chips, and soldering chips to the board made the
units difficult to service.

The SIMM/DIMM incorporates the best compromise between socketed and soldered chips. The chips are soldered to the module,
but you can replace the socketed module easily. In addition, the SIMM/DIMM is held tight to the motherboard by a locking mechanism
that does not work loose from contraction and expansion, but is easy for you to loosen. This solution is a good one, but it
can increase repair costs. You must replace what amounts to, in some cases, an entire bank rather than one defective chip.

All newer systems use SIMMs and DIMMs instead of memory chips. Even Apple Macintosh systems use SIMMs and DIMMs. The SIMM/DIMM
is not a proprietary memory system but rather an industry-standard device. As mentioned, some SIMMs have slightly different
pinouts and specifications other than speed and capacity, so be sure that you obtain the correct SIMMs for your system.

SIMM Pinouts

Tables 7.6 and 7.7 show the interface connector pinouts for both 30-pin SIMM varieties, as well as the standard 72-pin
version. Also included is a special presence detect table that shows the configuration of the presence detect pins on various
72-pin SIMMs. The presence detect pins are used by the motherboard to detect exactly what size and speed SIMM is installed.
Industry-standard 30-pin SIMMs do not have a presence detect feature, but IBM did add this capability to their modified 30-pin
configuration.

Table 7.6 Industry-Standard and IBM 30-Pin SIMM Pinouts

Pin

Standard SIMM Signal Names

IBM SIMM Signal Names

1

+5v

+5v

2

Column Address Strobe

Column Address Strobe

3

Data 0

Data 0

4

Address 0

Address 0

5

Address 1

Address 1

6

Data 1

Data 1

7

Address 2

Address 2

8

Address 3

Address 3

9

Ground

Ground

10

Data 2

Data 2

11

Address 4

Address 4

12

Address 5

Address 5

13

Data 3

Data 3

14

Address 6

Address 6

15

Address 7

Address 7

16

Data 4

Data 4

17

Address 8

Address 8

18

Address 9

Address 9

19

Address 10

Row Address Strobe 1

20

Data 5

Data 5

21

Write Enable

Write Enable

22

Ground

Ground

23

Data 6

Data 6

24

Reserved

Presence Detect (Ground)

25

Data 7

Data 7

26

Data 8 (Parity) Out

Presence Detect (1M = Ground)

27

Row Address Strobe

Row Address Strobe

28

Column Address Strobe Parity

Reserved

29

Data 8 (Parity) In

Data 8 (Parity) I/O

30

+5v

+5v

Table 7.7 Standard 72-Pin SIMM Pinout

Pin

SIMM Signal Name

1

Ground

2

Data 0

3

Data 16

4

Data 1

5

Data 17

6

Data 2

7

Data 18

8

Data 3

9

Data 18

10

+5v

11

Column Address Strobe Parity

12

Address 0

13

Address 1

14

Address 2

15

Address 3

16

Address 4

17

Address 5

18

Address 6

19

Reserved

20

Data 4

21

Data 20

22

Data 5

23

Data 21

24

Data 6

25

Data 22

26

Data 7

27

Data 23

28

Address 7

29

Block Select 0

30

+5v

31

Address 8

32

Address 9

33

Row Address Strobe 3

34

Row Address Strobe 2

35

Parity Data 2

36

Parity Data 0

37

Parity Data 1

38

Parity Data 3

39

Ground

40

Column Address Strobe 0

41

Column Address Strobe 2

42

Column Address Strobe 3

43

Column Address Strobe 1

44

Row Address Strobe 0

45

Row Address Strobe 1

46

Block Select 1

47

Write Enable

48

Reserved

49

Data 8

50

Data 24

51

Data 9

52

Data 25

53

Data 10

54

Data 26

55

Data 11

56

Data 27

57

Data 12

58

Data 28

59

+5v

60

Data 29

61

Data 13

62

Data 30

63

Data 14

64

Data 31

65

Data 15

66

Block Select 2

67

Presence Detect Bit 0

68

Presence Detect Bit 1

69

Presence Detect Bit 2

70

Presence Detect Bit 3

71

Block Select 3

72

Ground

Notice that the 72-pin SIMMs employ a set of four pins to indicate the type of SIMM to the motherboard. These presence
detect pins are either grounded or not connected to indicate the type of SIMM to the motherboard. This is very similar to
the industry- standard DX code used on modern 35mm film rolls to indicate the ASA (speed) rating of the film to the camera.
Unfortunately, unlike the film standards, the presence detect signaling is not a standard throughout the PC industry. Different
system manufacturers sometimes use different configurations for what is expected on these 4 pins. Table 7.8 shows how IBM
defines these pins.

RAM Chip Speed

Memory-chip speed is reported in nanoseconds (ns). (One nanosecond is the time that light takes to travel 11.72 inches.)
PC memory speeds vary from about 10ns to 200ns. When you replace a failed memory module, you must install a module of the
same type and speed as the failed module. You can substitute a chip with a different speed only if the speed of the replacement
chip is equal to or faster than that of the failed chip.

Some people have had problems when "mixing" chips because they used a chip that did not meet the minimum required specifications
(for example, refresh timing specifications) or was incompatible in pinout, depth, width, or design. Chip access time always
can be less (that is, faster) as long as your chip is the correct type and meets all other specifications.

Substituting faster memory usually doesn't provide improved performance because the system still operates the memory at
the same speed. In systems not engineered with a great deal of "forgiveness" in the timing between memory and system, however,
substituting faster memory chips might improve reliability.

The same common symptoms result when the system memory has failed or is simply not fast enough for the system's timing.
The usual symptoms are frequent parity check errors or a system that does not operate at all. The POST also might report errors.
If you're unsure of what chips to buy for your system, contact the system manufacturer or a reputable chip supplier.

EDO RAM

There is a type of memory designed for Pentium systems called EDO (Extended Data Out) RAM. These are 72-pin SIMMs
and 168-pin DIMMs with specially manufactured chips that allow for a timing overlap between successive accesses. EDO RAM has
a dual-pipeline architecture that allows the unit to simultaneously read new data while discharging the old. This allows for
a tighter coupled access cycle and a performance improvement of 20 percent or so over regular non-EDO SIMMs. EDO RAM is ideal
for systems with bus speeds of up to 66MHz, which fits perfectly with the Pentium and higher processor architectures. Unfortunately,
most EDO RAM is non-parity, and it is incapable of supporting systems with a bus speed higher than 66MHz.

To actually utilize EDO memory, your motherboard chipset must support it. Chipsets like the Intel Triton and Opti Viper
offer support for EDO.

A variation of EDO is Burst Extended-Data-Out Dynamic Random Access Memory (BEDO DRAM). BEDO is basically EDO memory
with burst features for speedier data transfer. Intel's 440FX Natoma and 440LX chipsets offer support for BEDO memory, which
is used only in Pentium Pro and Pentium II systems.

SDRAM

SDRAM is similar to EDO RAM in that it has a dual-stage pipeline structure. SDRAM delivers information in very high
speed bursts using a high-speed, clocked interface. Like EDO RAM, your chipset must support this type of memory. Intel's 430TX
and 430VX Triton II chipsets fully support SDRAM. Performance of SDRAM is similar to EDO RAM, with the exception that SDRAM
supports bus speeds of 100MHz, 133MHz or faster. SDRAM is limited primarily to DIMMs.

Upgrading by Increasing System Memory

Adding memory to a system is one of the most useful upgrades that you can perform and also one of the least expensive,
especially when you consider the increased capabilities of Windows 95, Windows NT, and OS/2 when you give them access to more
memory. In some cases, doubling the memory can virtually double the speed of a computer.

If you decide to upgrade to a more powerful computer system, you normally cannot salvage the memory from a PC or XT system.
The 8-bit memory boards are useless in AT and Micro Channel systems, and the speed of the memory chips usually is inadequate
for newer systems. Most newer systems use high-speed SIMM modules rather than chips. A pile of 150ns, 64K, or 256K chips is
useless if your next system uses SIMMs or memory devices faster than 70ns.

Be sure to weigh carefully your future needs for computing speed and for a multitasking operating system (OS/2, for example)
with the amount of money that you spend to upgrade current equipment.

Adding Motherboard Memory

This section discusses motherboard memory--the memory actually installed on the motherboard--rather than the memory
that resides on adapter boards. The first part of this section presents recommendations on selecting and installing chips.
The last part of the section provides instructions for modifying an IBM XT Type 1 motherboard. This modification enables you
to place a full 640K of memory on the motherboard, eliminating the need for memory expansion boards. IBM's newer XT Type 2
motherboards already include this modification.

Selecting and Installing Memory Chips, SIMMs, or DIMMs

If you are upgrading a motherboard by adding memory, follow the manufacturer's guidelines on which memory chips or modules
to purchase. As you learned earlier, memory comes in various form factors, including individual chips known as DIP memory
chips, SIMMs (single in-line memory modules), SIPPs, and DIMMs. Your computer may use one or possibly a mixture of these form
factors.

The maker of your computer's motherboard determines what type of memory chips are used. The following list describes each
chip or module type:

DIPs. Early computers used DIP memory chips. A DIP memory chip is a rectangular chip that has 16 metal legs, eight
on each side. To install such a memory chip, you must plug it in place. DIP chips are installed in multiples of nine. For
example, you must install 36 separate 256Kbit chips to acquire 1M of memory. Sometimes, the DIPs are permanently soldered
to your motherboard.

SIMMs. Single Inline Memory Modules are like small circuit boards with chips soldered on them. Different numbers
of chips can be mounted on the SIMM, and the chips can be mounted on one or both sides of the SIMM. A SIMM has a row of contacts
on one edge of the board. The contacts can be tin- or gold-plated. SIMMs are retained in the system by special sockets with
positive latching mechanisms that lock the SIMMs in place. SIMM connectors use a high-force wiping contact that is extremely
resistant to corrosion. SIMMs are available in two types: 30-pin and 72-pin. The 30-pin modules come in 9-bit form with parity
or 8-bit form for systems that lack parity checking. The 72-pin SIMMs are 36 bits wide with parity (32 data bits and 4 parity
bits), or 32 bits wide without parity. Notice that the 9-bit and 36-bit SIMMs with parity always can be used in systems that
lack parity checking. The nonparity SIMMs cannot be used in normal systems that require parity bits.

SIPPs. Single In-line Pinned Packages, sometimes called SIP, really are SIMMs with pins rather than contacts. The
pins are designed to be installed in a long connector socket that is much cheaper than the standard SIMM socket. SIPPs are
inferior to SIMMs because they lack the positive latching mechanism that retains the module, and the connector lacks the high-force
wiping contacts that resist corrosion. SIPPs are rarely used.

DIMMs. Dual Inline Memory Modules are 168-pin modules designed to work with 64-bit systems. DIMMs must be inserted
carefully because they have different contacts on each side. Like SIMMs, DIMMs are held in place by a locking mechanism to
prevent chip creep. Non-parity DIMMs are 64-bits wide, while parity DIMMs are 72-bits wide.

No matter what type of memory chips you have, the chips are installed in memory banks. A memory bank is a collection
of memory chips that make up a block of memory. Each bank of memory is read by your processor in one pass. A memory bank does
not work unless it is filled with memory chips.

286 computers usually can take four banks of 256Kbit chips to make 1,024K (1M). Some 286 computers can handle up to 4M
on the motherboard, using 1M chips. In 386SX-based computers, four memory banks are used, requiring 18 chips (16 plus 2 for
parity), or in most cases two 30-pin (8- or 9-bit) SIMMs each. 386DX and 486 computers often have between two and four memory
banks, each bank using four 30-pin (8- or 9-bit) SIMMs or one 72-pin (32- or 36-bit) SIMM. Pentium, Pentium Pro, and Pentium
II computers also normally have between two and four banks of memory, but each bank usually requires two 72-pin (32- or 36-bit)
SIMMs or one 168-pin DIMM.

Installing extra memory on your motherboard is an easy way to add memory to your computer. Most systems have at least one
vacant memory bank in which you can install extra memory at a later time and speed your computer.

RAM-Chip Type (Capacity)

Individual RAM chips come in different capacities. The capacity determines the number of data bits that can be stored in
a chip of a particular size. For example, RAM chips for the original IBM PC store 16Kbits of data; these RAM chips are the
smallest used in any IBM-compatible system. The RAM chips for the original version of the IBM XT store 64Kbits of data. Before
you add RAM to a system (or replace defective RAM chips), you must determine the memory chips required for your system. Your
system documentation contains this information.

If you need to replace a defective RAM chip and do not have the system documentation, you can determine the correct chip
for your system by inspecting the chips that are already installed. Each chip has markings that indicate the chip's capacity
and speed. The following table lists the markings on individual 1M chips produced by various companies:

Markings

Manufacturer

TMS4C1024N/DJ

Texas Instruments

HM511000AP/AJP/AZP

Hitachi

MB81C1000P/PJ/PSZ

Fujitsu

If you do not have the documentation for your system and the manufacturer does not offer technical support, open your system
case and carefully write down the markings that appear on your memory chips. Then contact a local computer store or mail-order
chip vendor for help in determining the proper RAM chips for your system. Adding the wrong RAM chips to a system can make
it as unreliable as leaving a defective chip on the motherboard and trying to use the system in that condition.

RAM-Chip Speed

RAM chips also come in various speeds. For example, 80ns or slower chips are used in older systems, and 60 or 70ns chips
are used in 486 and higher systems. The motherboard manufacturer determines the correct speed of the memory chips installed
in each system. IBM, for example, specifies different speed memory for different systems. Table 7.9 lists the required RAM-chip
speeds and wait states for IBM motherboards.

Table 7.9 IBM Motherboard Memory Timing

System

CPU

Clock Speed (MHz)

Memory Wait States

Access Time (ns)

Notes

PC

8088

4.77

1

200

XT

8088

4.77

1

200

AT

286

6

1

150

AT

286

8

1

150

XT-286

286

6

0

150

Zero wait

PS/1

286

10

1

120

25

8086

8

0

150

Zero wait

30

8086

8

0

150

Zero wait

25-286

286

10

1

120

30-286

286

10

1

120

35 SX

386SX

20

0-2

85

Paged memory

40 SX

386SX

20

0-2

85

Paged memory

L40

386SX

20

0-2

80

Paged memory

50

286

10

1

150

50Z

286

10

0

85

Zero wait

53486SLC2

486SLC2

50

0-2

70

Interleaved memory, internal
16K cache

55 SX

386SX

16

0-2

100

Paged memory

56 486SLC3

486SLC3

75

0-2

70

Interleaved memory, internal
16K cache

57 SX

386SX

20

0-2

70

Paged memory

57 486SLC3

486SLC3

75

0-2

70

Interleaved memory, internal
16K cache

60

286

10

1

150

65

386SX

16

0-2

100

Paged memory

70

386DX

16

0-2

85

Paged memory

70

386DX

20

0-2

85

Paged memory

70

386DX

25

0-5

80

External 64K cache

70

486DX

25

0-5

80

Internal 8K cache

P70

386DX

16

0-2

85

Paged memory

P70

386DX

20

0-2

85

Paged memory

P75

486DX

33

0-5

70

Internal 8K cache

76

486DX2

66

0-2

70

Interleaved memory, internal
8K cache

76

486SX

33

0-2

70

Interleaved memory, internal
8K cache

76

486DX4

100

0-2

70

Interleaved memory, internal
16K cache

77

486DX2

66

0-2

70

Interleaved memory, internal
8K cache

77

486SX

33

0-2

70

Interleaved memory, internal
8K cache

77

486DX4

100

0-2

70

Interleaved memory, internal
16K cache

80

386DX

16

0-2

80

Paged memory

80

386DX

20

0-2

80

Paged memory

80

386DX

25

0-5

80

External 64K cache

90

486SX

20

0-5

70

Interleaved memory, internal
8K cache

90

486SX

25

0-5

70

Interleaved memory, internal
8K cache

90

486DX

25

0-5

70

Interleaved memory, internal
8K cache, optional external 256K cache

90

486DX

33

0-5

70

Interleaved memory, internal
8K cache, optional external 256K cache

90

486DX

50

0-5

70

Interleaved memory, internal
8K cache, optional external 256K cache

95

486SX

20

0-5

70

Interleaved memory, internal
8K cache

95

486SX

25

0-5

70

Interleaved memory, internal
8K cache

95

486DX

25

0-5

70

Interleaved memory, internal
8K cache, optional external 256K cache

95

486DX

33

0-5

70

Interleaved memory, internal
8K cache, optional external 256K cache

95

486DX

50

0-5

70

Interleaved memory, internal
8K cache, optional external 256K cache

NOTE: In general, non-IBM systems should use memory similar to their IBM counterparts listed
previously. Memory slower than 70ns (60ns is better) should not be used in Pentium or higher systems.

It won't hurt to install chips that are faster than required for your motherboard or memory card; buying faster memory
chips can be a benefit if you intend to transplant them to a faster computer in the future. Unfortunately, the faster memory
won't speed your computer; your computer's design anticipates working at a certain speed and no faster.

The speed of a memory chip is printed on the surface of the chip. On the memory chips--whether they are the DIP, SIPP,
or SIMM type--you will find an identifying number. The last two digits after the dash (-) are especially important, because
they indicate the speed of your memory.

In some systems, the motherboard memory speed can be controlled. Systems with adjustable wait-state settings enable you
to choose optimal performance by purchasing the proper high-speed memory, or to choose lower performance by purchasing cheaper
memory. Many compatibles offer a wait-state jumper or configuration option, which controls whether the motherboard runs with
wait states. Running with zero wait states may require faster-access-speed memory.

Systems that use 72-pin SIMMs can detect both the speed and capacity of the installed SIMMs through four special contacts
called presence detect pins. The motherboard can use these pins to determine the installed SIMM's rated speed and capacity,
in much the same way that many cameras can tell what speed film you have loaded by "reading" a series of contacts on the film
canister. Installing memory that is too slow for the system may cause an error message to appear on startup.

RAM-Chip Architecture

Some special memory-architecture schemes have been devised to reduce the number of wait states required, boost overall
system performance, and keep costs down. The following architecture schemes are most commonly used to increase memory performance:

Paged memory

Interleaved memory

Memory caching

Paged memory is a simple scheme for improving memory performance that divides memory into pages ranging from 512
bytes to a few kilobytes long. The paging circuitry then enables memory locations within a page to be accessed with zero wait
states. If the desired memory location is outside the current page, one or more wait states are added while the system selects
the new page.

Interleaved memory offers greater performance than paged memory. This higher- performance scheme combines two banks
of memory into one, organized as even and odd bytes. With this combination, an access cycle can begin in the second bank while
the first is already processing a previous access, and vice versa. By alternating access to even and odd banks, you can request
data from one bank, and while the request is pending, the system can move to the next bank to process another request. The
first request becomes available while the second request is still pending, and so on. By interleaving access to memory in
this manner, a system can effectively double memory-access performance without using faster memory chips.

Many of the highest-performance systems use interleaved memory to achieve increased performance. Some systems that offer
interleaved memory can use the interleaving function only if you install banks in matched-capacity pairs, which usually means
adding two 36-bit SIMMs of equal capacity at a time. If you add only a single bank or add two banks of different capacity,
the system still functions, but memory interleaving is disabled, and you pay a considerable performance penalty. Consult your
system's technical-reference manual for more information.

Memory caching is the most popular and usually the most effective scheme for improving memory performance. This
technique relies on a small amount (8K to 512K) of raw, high-speed memory fast enough to keep up with the processor with zero
wait states. This small bank of cache memory often is rated at 15ns or less in access speed. Because this rate is faster
than normal DRAM components can handle, a special type of memory is used. This memory is called SRAM. SRAM devices do not
need the constant refresh signals that DRAM devices require. This feature, combined with other design properties, results
in extremely fast access times and higher costs.

Memory Caching

As mentioned in the previous section, memory caching is one of the most effective means of improving memory performance.
Although SRAM chips are expensive, only a small number of SRAM chips are required in a caching scheme. SRAM is used by a special
cache-controller circuit that stores frequently accessed RAM locations and also is preloaded with the RAM values that the
cache controller expects to be accessed next. The cache acts as an intelligent buffer between the CPU and slower dynamic RAM.

A cache hit means that the particular data the CPU wanted was available in the cache RAM and that no additional
wait states are available for retrieving this data. A cache miss means that the data the CPU wanted had not been loaded
into the cache RAM and that wait states must be inserted while the data is retrieved. A good cache controller has a hit ratio
of 95 percent or more (the system runs with zero wait states 95 percent of the time). The net effect is that the system acts
as though nearly all the memory is 15ns or less in speed, although most of the memory really is much slower (and, therefore,
much less costly).

Systems based on the 486SX, SL, or DX processors include a cache controller and 8K of internal-cache RAM in the CPU that
makes them much faster than earlier systems. The 486SLC CPU has a 1K internal cache; 486DX4 processors have a 16K internal
cache; and the 486SLC2 and 486SLC3 processors have a 16K cache. Systems with 386SX or DX processors must use an external-cache
controller with externally provided cache RAM; these systems have no internal cache. The Pentium and Pentium Pro CPUs include
two 8K internal caches: one for code and the other for data. This dual-cache architecture is carried over in the newer CPUs,
which have separate code and write-back data caches.

A CPU internal cache is called a primary or Level 1 (L1) cache, and an external cache is called a secondary or Level 2
(L2) cache. Typically, the larger the memory cache, the better the performance. A larger secondary processor cache, however,
is no guarantee; you may find that the system with the least cache RAM can outperform a system with a greater amount of cache
RAM. Actual performance depends on the efficiency of the cache controller and the system design. For example, a cache integrated
into a CPU can far outperform an external cache. Adding the 256K L2 cache RAM option to a PS/2 Model 90 or 95 with a 486DX
processor offers only a small increase in performance relative to the 8K of L1 cache memory built into the 486 CPU chip. This
is because the L1 cache integrated into the CPU can outperform an external (L2) cache. Also, adding cache RAM does not result
in a proportional increase in performance. You often gain the best performance by using the middle amount of secondary cache
that your computer can accept. A PC that can accommodate a 256K or 512K secondary cache provides the most bang for the buck.

To get maximum system performance and reliability, the best recommendation for adding chips, SIMMs, or DIMMs to a motherboard
is to use memory rated at the speeds recommended by the manufacturer. Faster memory is likely to work in the system, but it
creates no performance benefit and therefore is a waste of money.

The minimum access-time specification for motherboard memory in a specific system is listed in the system's technical-reference
manual. If you have an IBM-compatible system that lacks proper documentation, you can refer to other similar system documentation
as a guide, because most compatibles follow the same requirements. Because of the variety of system designs, however, you
should try to acquire the proper documentation from the manufacturer.

Adding Adapter Boards

Memory expansion boards typically are a last-resort way to add memory. For many systems (such as older models from Compaq)
with proprietary local bus memory-expansion connectors, you must purchase all memory-expansion boards from that company. Similarly,
IBM used proprietary memory connectors in the PS/2 Model 80 systems. For other industry-standard systems that use nonproprietary
memory expansion (such as the IBM PC, XT, and AT) and most IBM-compatible systems, as well as most PS/2 systems, you can purchase
memory-expansion boards that plug into the standard bus slots from hundreds of vendors.

Unfortunately, any memory expansion that plugs into a standard bus slot runs at bus speed rather than at full system speed.
For this reason, most systems provide standard SIMM- or DIMM-connector sockets directly on the motherboard so that the memory
can be plugged directly into the system's local bus. Using memory adapter cards in these systems only slows them down. Other
systems use proprietary local bus connectors for memory-expansion adapters, which can cause additional problems and expense
when you have to add or service memory.

In some cases, an adapter board can use slower memory than would be required on the system motherboard. (Memory adapters
for PS/2 Models 50 and 60, for example, use 120ns memory chips.) Many systems run memory-expansion slots at a fixed slower
speed--8MHz for most ISA bus systems--so that installed adapters function properly. The PS/2 system memory adapters may be
able to run more slowly than main memory because of the Micro Channel Architecture (MCA) interface's higher level of controls
and capabilities. The MCA's asynchronous design enables adapters to remain independent of the processor's speed and to request
additional wait states, as required, to accommodate the slower adapters.

Installing Memory

This section discusses installing memory chips--specifically, new RAM chips or memory modules. The section also covers
the problems that you are most likely to encounter and how to avoid them. You will also get information on configuring your
system to use new memory.

When you install or remove memory, you are most likely to encounter the following problems:

Electrostatic discharge

Broken or bent pins

Incorrect switch and jumper settings

To prevent electrostatic discharge (ESD) when you install sensitive memory chips or boards, do not wear synthetic-fiber
clothing or leather-soled shoes. Remove any static charge that you are carrying by touching the system chassis before you
begin, or better yet, wear a good commercial grounding strap on your wrist. A grounding strap consists of a conductive wristband
grounded at the other end by a wire clipped to the system chassis. Leave the system unit plugged in but turned off to keep
it grounded.

CAUTION: Be sure to use a properly designed commercial grounding strap; do not make one
yourself. Commercial units have a one-megohm resistor that serves as protection if you accidentally touch live power. The
resistor ensures that you do not become the path of least resistance to the ground and therefore become electrocuted. An improperly
designed strap can cause the power to conduct through you to the ground, possibly killing you.

Broken or bent leads are another potential problem associated with installing individual memory chips (DIPs) or SIPP modules.
Sometimes, the pins on new chips are bent into a V, making them difficult to align with the socket holes. If you notice this
problem on a DIP chip, place the chip on its side on a table, and press gently to bend the pins so that they are at a 90-degree
angle to the chip. For a SIPP module, you may want to use needle-nose pliers to carefully straighten the pins so that they
protrude directly down from the edge of the module, with equal amounts of space between pins. Then you should install the
chips in the sockets one at a time.

CAUTION: Straightening the pins on a DIP chip or SIPP module is not difficult work, but
if you are not careful, you could easily break off one of the pins, rendering the chip or memory module useless. Use great
care when you straighten the bent pins on any memory chip or module. You can use chip-insertion and pin-straightening devices
to ensure that the pins are straight and aligned with the socket holes; these inexpensive tools can save you a great deal
of time.

Each memory chip or module must be installed to point in a certain direction. Each chip has a polarity marking on one end.
This marking may be a polarity notch, a circular indentation, or both. The chip socket may have a corresponding notch. Otherwise,
the motherboard may have a printed legend that indicates the orientation of the chip. If the socket is not marked, you should
use other chips as a guide. The orientation of the notch indicates the location of Pin 1 on the chip. Aligning this notch
correctly with the others on the board ensures that you do not install the chip backward. Gently set each chip into a socket,
ensuring that every pin is properly aligned with the connector into which it fits. Then push the chip in firmly with both
thumbs until the chip is fully seated.

SIMM and DIMM memory is oriented by a notch on one side of the module that is not present on the other side. The socket
has a protrusion that must fit into this notched area on one side of the module. This protrusion makes it impossible to install
a SIMM or DIMM backward unless you break the connector. SIPP modules, however, do not plug into a keyed socket; you have to
orient them properly. The system documentation can be helpful if the motherboard has no marks to guide you. You also can use
existing SIPP modules as a guide.

Before installing memory, make sure that the system power is off. Then remove the PC cover and any installed cards. SIMMs
snap easily into place, but chips can be more difficult to install. A chip-installation tool is not required, but it can make
inserting the chips into sockets much easier. To remove chips, use a chip extractor or small screwdriver. Never try removing
a RAM chip with your fingers, because you can bend the chip's pins or poke a hole in your finger with one of the pins. You
remove SIMMs by releasing the locking tabs and either pulling or rolling them out of their sockets.

After adding the memory chips and putting the system back together, you may have to alter motherboard switches or jumper
settings. The original PC includes two switch blocks with eight switches per block. Switch positions 1 through 4 of a PC's
second switch block must be set to reflect the total installed memory. The XT has only one switch block, which is set to reflect
the number of memory banks installed on the system board but not the expansion-card memory.

IBM AT and compatible systems have no switches or jumpers for memory. Rather, you must run a setup program to inform the
system of the total amount of memory installed. IBM-compatible AT-type systems usually have a setup program built into the
system ROM BIOS, and you must run this program after installing new memory to configure the system properly.

After configuring your system to work properly with the additional memory, you should run a memory-diagnostics program
to ensure the proper operation of the new memory. At least two and sometimes three memory-diagnostic programs are available
for all systems. In order of accuracy, these programs are:

POST (Power-On Self Test)

Advanced diagnostics disk

User diagnostics disk

Aftermarket diagnostics software

The POST is used every time you power up the system; you can press Ctrl+A at the opening menu of an IBM pc to access the
advanced diagnostics on the reference disk.

Many additional diagnostics programs are available from aftermarket utility software companies. More information on aftermarket
testing facilities can be found in Chapter 20 - Software and Hardware Diagnostic Tools.

Upgrading the ROM BIOS

In this section, you learn that ROM BIOS upgrades can improve a system in many ways. You also learn that the upgrades can
be difficult and may require much more than plugging in a generic set of ROM chips.

The ROM BIOS, or Read-Only Memory Basic Input/Output System, provides the crude brains that get your computer's
components working together. The BIOS is the reason why DOS can operate on virtually any IBM-compatible system despite hardware
differences. Because the BIOS communicates with the hardware, the BIOS must be specific to the hardware and match it completely.
Instead of creating their own BIOSes, many computer makers buy a BIOS from specialists such as American Megatrends Inc. (AMI),
Award Software, Microid Research, or Phoenix Technologies Ltd. A hardware manufacturer that wants to license a BIOS must undergo
a lengthy process of working with the BIOS company to tailor the BIOS code to the hardware. This process is what makes upgrading
a BIOS so difficult; BIOS usually resides on ROM chips on the motherboard.

The BIOS is a collection of small computer programs embedded in an EPROM (Erasable Programmable Read-Only Memory)
chip or chips, depending on the design of your computer. That collection of programs is the first thing loaded when you start
your computer, even before the operating system. Simply put, the BIOS has three main functions:

It tests your computer's components when it is turned on. This test is called the Power-On Self Test, or POST. The POST
tests your computer's memory, motherboard, video adapter, disk controller, keyboard, and other crucial components.

It finds the operating system and loads, or boots, it. This operation is called the bootstrap loader routine. If an operating
system is found, it is loaded and given control of your computer.

After an operating system is loaded, the BIOS works with your processor to give software programs easy access to your
computer's specific features. For example, the BIOS tells your computer how to work with your video card and hard disk when
a software program requires these devices.

In older systems, you often must upgrade the BIOS to take advantage of some other upgrade. To install some of the newer
IDE (Integrated Drive Electronics) hard drives and 1.44M or 2.88M floppy drives in older machines, for example, you may need
a BIOS upgrade. The following list shows the primary functions of a ROM BIOS upgrade:

Adding 720K, 1.44M, or 2.88M 3 1/2-inch floppy drive support to a system

Eliminating controller- or device-driver-based hard disk parameter translation for MFM, RLL, IDE, or ESDI drives with
1,024 or fewer cylinders by using a user-definable hard drive type matched to the drive

Correcting known bugs or compatibility problems with certain hardware and software

Adding PnP compatibility to the system

Upgrading the CPU

Because of the variety of motherboard designs on the market, ordering a BIOS upgrade often is more difficult than it sounds
initially. If you have a name-brand system with a well-known design, the process can be simple. For many lesser-known compatible
systems, however, you must give the BIOS vendor information about the system, such as the type of manufacturer's chipset that
the motherboard uses.

For most BIOS upgrades, you must obtain the following information:

The make and model of the system unit

The type of CPU

The make and version of the existing BIOS

The part numbers of the existing ROM chips (you may have to peel back the labels to read this information)

An integrated chipset is a group of chips on the original AT motherboard that can perform the functions of hundreds
of discrete chips. Many chipsets offer customizable features that are available only if you have the correct BIOS. Most differences
among systems lie in the variety of integrated chipsets that are used to manufacture PCs, and in the special initialization
required to operate these chips.

The BIOS also must support variations in keyboard-controller programming and in the way that nonstandard features such
as speed switching are handled. A computer that uses the Chips & Technologies NEAT chipset, for example, must have a BIOS
specifically made for it. The BIOS must initialize the NEAT chipset registers properly; otherwise, the machine does not even
boot. The BIOS also must have support for this chipset's special features. Each of the chipsets for PC systems requires specific
BIOS support for proper operation. A generic BIOS may boot some systems, but certain features, such as shifting to and from
protected mode and speed switching, may not be possible without the correct BIOS.

Keyboard-Controller Chips

Besides the main system ROM, AT-class computers also have a keyboard controller or keyboard ROM, which is a keyboard-controller
microprocessor with its own built-in ROM. The keyboard controller usually is an Intel 8042 microcontroller, which incorporates
a microprocessor, RAM, ROM, and I/O ports. The keyboard controller usually is a 40-pin chip, often with a label that has a
copyright notice identifying the BIOS code programmed into the chip.

The keyboard controller controls the reset and A20 lines and also deciphers the keyboard scan codes. The A20 line is used
in extended memory and other protected-mode operations. In many systems, one of the unused ports is used to select the CPU
clock speed. Because of the tie-in with the keyboard controller and protected-mode operation, many problems with keyboard
controllers become evident when you use either Windows or OS/2. If you experience lockups or keyboard problems with either
Windows or OS/2 software--or with any software that runs in protected mode, such as Lotus 1-2-3 Release 3.x--get a replacement
from your BIOS vendor or system-board vendor.

IBM systems do not need a replacement of the keyboard controller for upgrade purposes. (Replacement is difficult because
the chip normally is soldered in.) Most manufacturers of IBM-compatible systems install the keyboard-controller chip in a
socket so that you can upgrade or replace it easily. If you upgrade the BIOS in your system, the BIOS vendor often includes
a compatible keyboard controller as well. You usually do not have to buy the controller unless your old keyboard controller
has a problem with the new BIOS.

BIOS Manufacturers and Vendors

Several BIOS manufacturers have developed ROM BIOS software for use in upgrading IBM or IBM-compatible systems. The following
companies are the largest manufacturers of ROM BIOS software:

Phoenix

American Megatrends International (AMI)

Award

Phoenix pioneered the IBM-compatible BIOS and the legal means to develop a product that is fully compatible with IBM's
BIOS without infringing on the corporation's copyright. Phoenix first introduced many new features, such as user-defined hard
drive types and 1.44M drive support. The Phoenix BIOS has a very good Power-On Self Test; this thorough POST presents a complete
set of failure codes for diagnosing problems, especially the ones that occur when a system seems to be dead.

The Phoenix BIOS documentation, a complete three-volume reference package, is one of the product's most useful features.
This documentation includes System BIOS for IBM PC/XT/AT Computers and Compatibles, CBIOS for IBM PS/2 Computers
and Compatibles, and ABIOS for IBM PS/2 Computers and Compatibles. These excellent reference works, published by
Addison-Wesley, are recommended even if you do not have the Phoenix BIOS (although some of its specific information does not
apply to other systems).

The BIOS produced by AMI is very popular and surpasses even Phoenix in new system installations. The AMI BIOS offers a
less comprehensive POST than the Phoenix BIOS, but it has an extensive diagnostics program in ROM. The program is even sold
separately, as AMIDIAG. The in-ROM version, however, lacks the capability to test memory--a crucial capability if the failure
is in the first bank. On the other hand, the BIOS is very compatible with the PC standard, available for several different
chipsets and motherboards, and has been handled responsibly from the support level. When problems have occurred, AMI has fixed
them, earning this program full compatibility with OS/2 and other difficult environments.

Because AMI manufactures its own motherboards, it has a distinct advantage over other BIOS companies. If the motherboard
and BIOS are made by the same source, the single vendor probably can resolve any interaction problems between the BIOS and
motherboard quickly, without shifting blame for the problem to another party.

Award, the third-largest manufacturer of BIOS software, has made a name for itself with many system vendors, because it
licenses the BIOS code to them for further modification. AST, for example, purchased the rights to the Award BIOS for its
own systems, so it can modify the BIOS internally, as though it created the BIOS from scratch. In a sense, AST could develop
its own custom BIOS, using the Award code as a starting point. Award also provides precustomized BIOS code for manufacturers.

If you want to replace or upgrade your BIOS, you can obtain replacement chips directly from the BIOS manufacturer or from
several distributors.

Special ROM BIOS-Related Problems

Some known problems exist in certain ROM BIOS versions. Several of these problems have the potential to affect a large
number of people, either because the problem is severe or many systems have the problem. This section describes some of the
most important known BIOS- and system-interaction problems and also provides solutions for those problems.

Some systems with BIOSes sold in 1992 or 1993 may not start after you upgrade to DOS 6.x. Some of the older BIOSes came
online when DOS 3.3 or earlier was the current operating system. As a result, those older BIOSes often cannot take advantage
of the advanced features of DOS 6.x.

If you use an AT&T 6300 system, you will want to use BIOS Version 1.43, which solves many problems with older 6300
systems and also provides support for a 720K floppy disk drives.

Some systems with the AMI BIOS have had problems with IDE hard disk drives. IDE (Integrated Drive Electronics) drives have
been touted as being fully port-compatible with existing ST-506/412 (MFM or RLL) and ESDI drives. Some IDE drives, however,
take somewhat longer than they should after certain commands to present valid data at their ports. In late 1989, AMI received
many reports of problems with IDE drives, especially Conner and Toshiba drives. Because of these timing problems, AMI BIOS
versions dated earlier than April 9, 1990 are not recommended for use with IDE drives, and data loss can result if earlier
versions are used. You may experience 'Drive C not ready' errors with certain IDE drives, such as those from Conner Peripherals.
To make sure that you have the correct AMI BIOS version, look for this figure in the lower-left corner of the screen when
you boot your computer:

xxxx-zzzz-040990

The 040990 indicates a BIOS date of April 9, 1990--the minimum version to use. Older versions are okay only if you are
not using IDE drives. The xxxx-zzzz indicates the
BIOS type code and an OEM (original equipment manufacturer) ID number. For AMI- manufactured motherboards, for example, the
BIOS type code is DAMI-[model code].

Changes to an Existing BIOS

If you have access to the correct tools and knowledge, you can perform some interesting modifications or upgrades to your
system by altering your existing ROM BIOS. This section discusses several modifications that you can perform on your system.

NOTE: BIOS modifications are for readers who are especially technically astute or extremely
adventurous; they are not recommended for everyone, especially for readers for whom system reliability is of crucial importance.
But the following information should prove to be interesting even for readers of this document who do not attempt these operations
on their systems.

Using a Flash BIOS

Flash ROM is a type of EEPROM chip that is included in most newer systems. EEPROM (Electrically Erasable Programmable
Read-Only Memory) is a type of ROM chip that you can erase and reprogram directly in the system without using ultraviolet
light and an EPROM programmer device. Using Flash ROM enables a manufacturer to send out ROM upgrades on disk; you then can
load the upgrade into the Flash ROM chip on the motherboard without removing and replacing the chip. Often these upgrades
can be downloaded from the manufacturer's Web site. This method saves time and money for both the system manufacturer and
the end user.

Sometimes, the Flash ROM in a system is write-protected, and you must disable the protection before performing an update,
usually by means of a jumper or switch that controls the lock on the ROM update. Without the lock, any program that knows
the right instructions can rewrite the ROM in your system--not a comforting thought. Without the write protection, it is conceivable
that virus programs could be written that copy themselves directly into the ROM BIOS code in your system!

One potential drawback to Flash ROM equipped systems is their dependence on battery power. If the battery dies, so does
the BIOS. Obviously, this presents an inconvenience beyond simply having to reset the clock every time you power up. In any
case, it is a good idea to back up your BIOS. Several BIOS backup programs are available, and the manufacturers themselves
generally provide some sort of provision to protect you in the event of a battery failure.

Using IML System Partition BIOS

IBM used a scheme similar to a Flash ROM called Initial Microcode Load (IML). IML is a technique in which the BIOS
code is installed on the hard disk in a special hidden system partition and is loaded every time the system is powered up.
Of course, the system still has a core BIOS on the motherboard, but all that BIOS does is locate and load updated BIOS code
from the system partition. This technique enabled IBM to distribute ROM updates on disk for installation in the system partition.
The IML BIOS is loaded every time the system is reset or powered on.

Along with the system BIOS code, the system partition contains a complete copy of the Reference Disk, which provides the
option of running the setup and system configuration software at any time during a reboot operation. This option eliminates
the need to boot from the Reference Disk to reconfigure the system, and gives the impression that the entire Reference Disk
is contained in ROM.

One drawback to this technique is that the BIOS code is installed on the (SCSI) hard disk; the system cannot function properly
without the correctly set-up hard disk connected. You always can boot from the Reference Disk floppy, should the hard disk
fail or become disconnected, but you cannot boot from a standard floppy disk.