#
Upgrading & Repairing PCs Eighth Edition

#

# - 7 -

# Memory

- The System Logical Memory Layout
  - Conventional (Base) Memory
  - Upper Memory Area (UMA)
  - Extended Memory
  - Expanded Memory
  - Preventing ROM BIOS Memory Conflicts and Overlap
  - ROM Shadowing
  - Total Installed Memory versus Total Usable Memory
  - Adapter Memory Configuration and Optimization
  - Taking Advantage of Unused Upper Memory
- Physical Memory
  - RAM Chips
  - Physical Storage and Organization
  - Memory Banks
  - Parity Checking
  - SIMMs and DIMMs
  - SIMM Pinouts
  - RAM Chip Speed
  - EDO RAM
  - SDRAM
- Upgrading by Increasing System Memory
  - Upgrade Strategies
- Adding Motherboard Memory
  - Selecting and Installing Memory Chips, SIMMs, or DIMMs
  - Adding Adapter Boards
  - Installing Memory
- Upgrading the ROM BIOS
  - Keyboard-Controller Chips
  - BIOS Manufacturers and Vendors
  - Special ROM BIOS-Related Problems
  - Changes to an Existing BIOS

#

This chapter looks at memory from both a physical and logical point of view. We will discuss the physical chips and memory modules that you can purchase and install. 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 today 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. Almost two decades after the first PC was introduced, even the newest Pentium II-based systems are limited in many important ways by the memory map of the first PCs.

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 as much as 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 16; 4,096; or 65,536M are 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.

> 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.

    . = Program-accessible memory (standard RAM)
    G = Graphics Mode Video RAM
    M = Monochrome Text Mode Video RAM
    C = Color Text Mode Video RAM
    V = Video ROM BIOS (would be "a" in PS/2)
    a = Adapter board ROM and special-purpose RAM (free UMA space)
    r = Additional PS/2 Motherboard ROM BIOS (free UMA in non-PS/2 systems)
    R = Motherboard ROM BIOS
    b = IBM Cassette BASIC ROM (would be "R" in IBM compatibles)
    h = High Memory Area (HMA), if HIMEM.SYS is loaded.

    Conventional (Base) Memory:

          : 0---1---2---3---4---5---6---7---8---9---A---B---C---D---E---F---
    000000: ................................................................
    010000: ................................................................
    020000: ................................................................
    030000: ................................................................
    040000: ................................................................
    050000: ................................................................
    060000: ................................................................
    070000: ................................................................
    080000: ................................................................
    090000: ................................................................

    Upper Memory Area (UMA):

          : 0---1---2---3---4---5---6---7---8---9---A---B---C---D---E---F---
    0A0000: GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG
    0B0000: MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
          : 0---1---2---3---4---5---6---7---8---9---A---B---C---D---E---F---
    0C0000: VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
    0D0000: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
          : 0---1---2---3---4---5---6---7---8---9---A---B---C---D---E---F---
    0E0000: rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr
    0F0000: RRRRRRRRRRRRRRRRRRRRRRRRbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbRRRRRRRR

    Extended Memory:

          : 0---1---2---3---4---5---6---7---8---9---A---B---C---D---E---F---
    100000: hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh

    Extended Memory Specification (XMS) Memory:

    110000: ................................................................
    120000: ................................................................
    130000: ................................................................
    140000: ................................................................
    150000: ................................................................
    160000: ................................................................
    170000: ................................................................
    180000: ................................................................
    190000: ................................................................
    1A0000: ................................................................
    1B0000: ................................................................
    1C0000: ................................................................
    1D0000: ................................................................
    1E0000: ................................................................
    1F0000: ................................................................

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

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 I am staying in a hotel room, and somebody asks for my 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 I am staying in room 541. If the person needs this information in segment:offset form, and each number is two digits, I could say that I am staying at a room segment starting address of 54 (room 540), and an offset of 01 from the start of that segment. I could also say that I am in room segment 50 (room 500), and an offset of 41. You could even come up with other answers, such as I am 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:

    D000:7FFF =   D000   segment	D7F0:00FF =   D7F0   segment
                +  7FFF  offset	            +  00FF  offset
                  _____	              _____
                = D7FFF  total	            = D7FFF  total
    D700:0FFF =   D700   segment	D7FF:000F =   D7FF   segment
                +  0FFF  offset	            +  000F  offset
                  _____	              _____
                = D7FFF  total	            = D7FFF  total

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:

    D500:2FFF =   D500   segment
                +  2FFF  offset
                  _____
                = D7FFF  total
    D6EE:111F =   D6EE   segment
                +  111F  offset
                  _____
                = D7FFF  total

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.

> See "Video Memory,"

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.

    . = Empty Addresses
    M = Original Monochrome Adapter RAM
    m = Additional Memory used in VGA Monochrome Text Mode
          : 0---1---2---3---4---5---6---7---8---9---A---B---C---D---E---F---
    0A0000: ................................................................
    0B0000: MMMMmmmmmmmmmmmmmmmmmmmmmmmmmmmm................................

FIG. 7.2 The Monochrome Display Adapter memory map.

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.

    . = Empty Addresses
    C = Original Color Graphics Adapter (CGA) RAM
    c = Additional Memory used in VGA Color Text Mode
          : 0---1---2---3---4---5---6---7---8---9---A---B---C---D---E---F---
    0A0000: ................................................................
    0B0000: ................................CCCCCCCCCCCCCCCCcccccccccccccccc

FIG. 7.3 The Color Graphics Adapter (CGA) memory map.

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.

    . = Empty Addresses
    G = Enhanced Graphics Adapter (EGA) Graphics Mode Video RAM
    M = EGA Monochrome Text Mode Video RAM
    C = EGA Color Text Mode Video RAM
    V = Standard EGA Video ROM BIOS
    R = Standard Motherboard ROM BIOS
          : 0---1---2---3---4---5---6---7---8---9---A---B---C---D---E---F---
    0A0000: GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG
    0B0000: MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
          : 0---1---2---3---4---5---6---7---8---9---A---B---C---D---E---F---
    0C0000: VVVVVVVVVVVVVVVV................................................
    0D0000: ................................................................
          : 0---1---2---3---4---5---6---7---8---9---A---B---C---D---E---F---
    0E0000: ................................................................
    0F0000: RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR

FIG. 7.4 The Enhanced Graphics Adapter (EGA) memory map.

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." The monochrome text mode RAM area would practically never be used on a modern system, because little or no software would ever need to switch the adapter into that mode. Figure 7.4 also shows the standard mother-board 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.

    . = Empty Addresses
    G = Video Graphics Array (VGA) Adapter Graphics Mode Video RAM
    M = VGA Monochrome Text Mode Video RAM
    C = VGA Color Text Mode Video RAM
    V = Standard VGA Video ROM BIOS
    R = Standard Motherboard ROM BIOS
          : 0---1---2---3---4---5---6---7---8---9---A---B---C---D---E---F---
    0A0000: GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG
    0B0000: MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
          : 0---1---2---3---4---5---6---7---8---9---A---B---C---D---E---F---
    0C0000: VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV................................
    0D0000: ................................................................
          : 0---1---2---3---4---5---6---7---8---9---A---B---C---D---E---F---
    0E0000: ................................................................
    0F0000: RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR

FIG. 7.5 The VGA (and Super 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. Some of my associates who bought some of the early cards inadvertently became members of the video card manufacturer's "ROM of the week" club! They were constantly finding problems with the operation of these cards, and many updated and patched ROMs were sent to try to fix the problems. Not wanting to pay for the privilege of beta testing the latest attempts at VGA compatibility, I bit the bullet and took the easy way out. I bought the IBM VGA card (PS/2 Display Adapter) for $595. That is still about as much as you would pay for the best Local Bus Super VGA cards on the market today.

Although the card worked very well, and although I never did find any compatibility problems, I did later run into some interesting problems with the memory use of this card. This was my first introduction to what I call scratch pad memory use by an adapter. I found that 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. In particular, the 2K "straggler" area really caught me off guard when I installed a SCSI host adapter in this system that had a 16K on-board BIOS with a default starting address of C8000. I immediately ran into a conflict that completely disabled the system. In fact, it would not boot, had no display at all, and could only beep out error codes that indicated that the video card had failed. I first thought that I had somehow "fried" the card, but removing the new SCSI adapter made everything function normally. I also could get the system to work with the SCSI adapter and an old CGA card substituted for the VGA card, so I immediately knew a conflict was underfoot. This scratch pad memory use was not documented clearly in the technical-reference information for the adapter, so it was something that I had to find out by trial and error. If you have ever had the IBM VGA card and had conflicts with other adapters, now you know why!

    . = Empty Addresses
    G = Video Graphics Array (VGA) Adapter Graphics Mode Video RAM
    M = VGA Monochrome Text Mode Video RAM
    C = VGA Color Text Mode Video RAM
    V = IBM VGA Video ROM BIOS
    v = IBM VGA Scratch Pad memory (used by the card)
    R = Standard Motherboard ROM BIOS
          : 0---1---2---3---4---5---6---7---8---9---A---B---C---D---E---F---
    0A0000: GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG
    0B0000: MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
          : 0---1---2---3---4---5---6---7---8---9---A---B---C---D---E---F---
    0C0000: VVVVVVVVVVVVVVVVVVVVVVVV..vvvvvv........vv......................
    0D0000: ................................................................
          : 0---1---2---3---4---5---6---7---8---9---A---B---C---D---E---F---
    0E0000: ................................................................
    0F0000: RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR

FIG. 7.6 IBM's ISA-bus VGA card (PS/2 Display Adapter) memory map.

Needless to say, nothing could be done about this 2K of scratch pad memory hanging out there. I had to work around it as long as I had this card in the system. I solved my SCSI adapter problem by merely moving the SCSI adapter BIOS to a different address.

> NOTE: I have seen other 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, I have seen 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 on the market 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 up to 4M or more 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 controller or SCSI adapters today 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.

Figure 7.7 shows an example memory map for an Adaptec AHA-1542CF SCSI adapter.

    . = Empty Addresses
    G = Video Graphics Array (VGA) Adapter Graphics Mode Video RAM
    M = VGA Monochrome Text Mode Video RAM
    C = VGA Color Text Mode Video RAM
    V = Standard VGA Video ROM BIOS
    S = SCSI Host Adapter ROM BIOS
    R = Standard Motherboard ROM BIOS
          : 0---1---2---3---4---5---6---7---8---9---A---B---C---D---E---F---
    0A0000: GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG
    0B0000: MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
          : 0---1---2---3---4---5---6---7---8---9---A---B---C---D---E---F---
    0C0000: VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV................................
    0D0000: ................................................SSSSSSSSSSSSSSSS
          : 0---1---2---3---4---5---6---7---8---9---A---B---C---D---E---F---
    0E0000: ................................................................
    0F0000: RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR

FIG. 7.7 Adaptec AHA-1542CF SCSI adapter default memory use.

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.

    . = Empty Addresses
    G = Video Graphics Array (VGA) Adapter Graphics Mode Video RAM
    M = VGA Monochrome Text Mode Video RAM
    C = VGA Color Text Mode Video RAM
    V = Standard VGA Video ROM BIOS
    S = SCSI Host Adapter ROM BIOS
    R = Standard Motherboard ROM BIOS
          : 0---1---2---3---4---5---6---7---8---9---A---B---C---D---E---F---
    0A0000: GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG
    0B0000: MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
          : 0---1---2---3---4---5---6---7---8---9---A---B---C---D---E---F---
    0C0000: VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVSSSSSSSSSSSSSSSS................
    0D0000: ................................................................
          : 0---1---2---3---4---5---6---7---8---9---A---B---C---D---E---F---
    0E0000: ................................................................
    0F0000: RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR

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 now shared memory is in common use among other companies' network adapters today. 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.

    . = Empty Addresses
    G = Video Graphics Array (VGA) Adapter Graphics Mode Video RAM
    M = VGA Monochrome Text Mode Video RAM
    C = VGA Color Text Mode Video RAM
    V = Standard VGA Video ROM BIOS
    I = Token Ring Network Adapter IPL ROM
    N = Token Ring Network Adapter Shared RAM
    R = Standard Motherboard ROM BIOS
          : 0---1---2---3---4---5---6---7---8---9---A---B---C---D---E---F---
    0A0000: GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG
    0B0000: MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
          : 0---1---2---3---4---5---6---7---8---9---A---B---C---D---E---F---
    0C0000: VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV................IIIIIIII........
    0D0000: ................................NNNNNNNNNNNNNNNN................
          : 0---1---2---3---4---5---6---7---8---9---A---B---C---D---E---F---
    0E0000: ................................................................
    0F0000: RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR

FIG. 7.9 Network adapter default memory map.

I have also included the standard VGA video BIOS 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.

    . = Empty Addresses
    G = Video Graphics Array (VGA) Adapter Graphics Mode Video RAM
    M = VGA Monochrome Text Mode Video RAM
    C = VGA Color Text Mode Video RAM
    V = Standard VGA Video ROM BIOS
    S = SCSI Host Adapter ROM BIOS
    I = Token Ring Network Adapter IPL ROM
    N = Token Ring Network Adapter Shared RAM
    R = Standard Motherboard ROM BIOS
          : 0---1---2---3---4---5---6---7---8---9---A---B---C---D---E---F---
    0A0000: GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG
    0B0000: MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
          : 0---1---2---3---4---5---6---7---8---9---A---B---C---D---E---F---
    0C0000: VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVSSSSSSSSSSSSSSSSNNNNNNNNNNNNNNNN
    0D0000: IIIIIIII........................................................
          : 0---1---2---3---4---5---6---7---8---9---A---B---C---D---E---F---
    0E0000: ................................................................
    0F0000: RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR

FIG. 7.10 Adaptec AHA-1542CF SCSI adapter and Network adapter with optimized memory use.

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. Information on PC/XT System BIOS memory usage can be found in the sixth edition of this book, included on the CD.

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.

    . = Empty Addresses
    R = Standard Motherboard ROM BIOS
          : 0---1---2---3---4---5---6---7---8---9---A---B---C---D---E---F---
    0E0000: ................................................................
    0F0000: RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR

FIG. 7.11 Motherboard ROM BIOS memory use of most AT-compatible systems.

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) I was using until recently came standard with a built-in SCSI adapter and currently has a 4G SCSI drive installed. Yet this system still has the ROM BASIC wasting 32K of space! I liken this to humans having an appendix. The ROM BASIC in the IBM systems is a sort of vestigial organ--a leftover that had some use in prehistoric ancestors, but that has no function today.

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:

    The IBM Personal Computer Basic
    Version C1.10 Copyright IBM Corp 1981
    62940 Bytes free
    Ok

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:

    DISK BOOT FAILURE, INSERT SYSTEM DISK AND PRESS ENTER

Phoenix BIOS systems will display either:

    No boot device available -
    strike F1 to retry boot, F2 for setup utility

or

    No boot sector on fixed disk -
    strike F1 to retry boot, F2 for setup utility

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 new 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-, 486-, Pentium-, Pentium Pro-, or Pentium II-based 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 even the new Pentium II.

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.

Figure 7.12 shows how expanded memory fits with conventional and extended memory.

FIG. 7.12 Conventional, extended, and expanded memory.

Intel originally created a custom-purpose memory board that had the necessary EMS bank-switching hardware. They called these boards Above Boards, and they were sold widely many years ago. 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. The Above Boards are no longer being manufactured, and EMS memory--as a concept as well as functionally--is extremely obsolete.

If you have any antique software that still requires EMS memory, you are advised to upgrade to newer versions that can use extended memory directly. It is also 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 today it is 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 these high-end 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 modern system is rated at 60ns.

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. Shadow-ing 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 purchase and 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 my 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 my 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. With the new PnP specification, we are moving towards that goal. 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. With the number of drivers that people are using today, it can be difficult to fit them all in the available UMA space while leaving enough base memory free to run applications.

Things are 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:

  1. Exit from any other programs you are running.

  2. Start your network or any memory-resident programs and device drivers you absolutely need.

  3. At the DOS prompt, type MEMMAKER.

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, log in 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 again run OPTIMIZE. 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 an impressive 64G!

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--even the mighty Pentium--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 can the 286 or better chips use their maximum potential for memory addressing.

Pentium-based systems can address as much as 4G of memory, and Pentium II systems can address 64G. To put these memory-addressing capabilities into perspective, 64G (65,536M) of memory costing the going rate of about $5 per megabyte for fast (60 ns or less) RAM chips would total $327,680. Of course, you could probably negotiate a much better price with a chip vendor if you planned to buy 64G of memory. Even if you could afford all this memory, the largest memory modules available today are 168-pin DIMMs with 128M capacity. Most Pentium motherboards only have four to eight SIMM sockets, and maybe one or two DIMM sockets, which allows a maximum of 256M to 512M if all sockets are filled. Boards that support 1G or more are becoming available, but they are still the exception and not the norm. Not all systems accept all SIMMs, and many do not accept DIMMs, so you might have a limitation of less than this amount for many older systems.

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. Most modern systems use a 30- or 72-pin memory package called a single in-line memory module (SIMM). In addition, many newer motherboards 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 | These chips once were very popular in motherboards and memory cards.
(or 64K by 4 bits) | 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 | 1M chips were very popular for a number of years and were most often used
(or 256K by 4 bits) | in 256K to 8M SIMMs.
4M by 1 bit | 4M chips are used primarily in SIMMs from 1M to 16M in capacity. They are
(or 1M by 4 bits) | used primarily in 4M and 8M SIMMs and 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 | 64M chips are popular in high capacity 16M or larger memory modules,
(or 16M by 4 bits) | especially for notebook systems.
256M by 1 bit | 256M chips are the most recent on the market. These chips allow enormous
(or 64M by 4 bits) | SIMM capacities of 128M or larger! Because of the high expense and limited availability of these chips, you see them only in the most expensive and highest capacity modules on the market.

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

FIG. 7.13 The markings on a typical memory chip.

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 SIMMs 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.

Most modern systems do not use chips, but instead use SIMMs. 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! Because these SIMMs are available in 1M and 4M capacities today, this means that a single bank has to be 8M or 32M of memory, with no in-between amounts. 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 modern 64-bit systems, two 72-pin SIMMs are required per bank.

Many newer systems now 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 Pentium and higher 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. Until recently, all IBM- compatible systems used 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.

Recently, a disturbing trend has developed in the IBM-compatible marketplace. Some of the larger vendors have been shipping systems with parity checking disabled! These systems can use slightly cheaper non-parity SIMMs like the Apple systems. The savings amounts to about $10 per 4M SIMM, which can result in a savings to the manufacturer of about $20 for a typical 8M configuration.

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: Data bit number: 0 1 2 3 4 5 6 7 Parity bit Data bit value: 1 0 1 1 0 0 1 1 0 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: Data bit number: 0 1 2 3 4 5 6 7 Parity bit Data bit value: 0 0 1 1 0 0 1 1 1 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 motherboard 2 = Error occurred in an expansion slot `yyyy` 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:

    Memory parity interrupt at xxxx:xxxx
    Type (S)hut off NMI, Type (R)eboot, other keys to continue

or

    I/O card parity interrupt at xxxx:xxxx
    Type (S)hut off NMI, Type (R)eboot, other keys to continue

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 modern 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 bits) and 72-pin (36 bits)--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. 30-pin SIMMs are on the wane, primarily because 64-bit systems--which would require eight 30-pin SIMMs per bank--are now the industry standard. 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).

FIG. 7.14 A typical 30-pin (9-bit) SIMM.

FIG. 7.15 A typical 72-pin (36-bit) SIMM.

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

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 100ns and even faster versions. Today, you can generally purchase SIMMs rated at 70ns or 60ns. Both faster and slower ones are available, but they are not frequently required and are difficult to obtain.

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. Because often very little price difference exists between the different speed versions, I usually buy faster SIMMs than are needed for a particular application, as this may make them more usable in a future system that may require the faster speed.

> 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 up to 100MHz, and possibly more in the future.

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 offer so-called "SIMM-saver" motherboards that are designed for newer Pentium processors, but have both 72- and 30-pin SIMM sockets. Although this is not the most desirable arrangement, it allows 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--especially if overhead clearance is tight--so investigate carefully before you buy. With the falling prices of SIMMs today, you are probably better off staying with 72-pin SIMMs and 168-pin DIMMs.

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 systems on the market today use SIMMs, and many use DIMMs. 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 | +5 Vdc | +5 Vdc
2 | Column Address Strobe | Column Address Strobe
3 | Data Bit 0 | Data Bit 0
4 | Address Bit 0 | Address Bit 0
5 | Address Bit 1 | Address Bit 1
6 | Data Bit 1 | Data Bit 1
7 | Address Bit 2 | Address Bit 2
8 | Address Bit 3 | Address Bit 3
9 | Ground | Ground
10 | Data Bit 2 | Data Bit 2
11 | Address Bit 4 | Address Bit 4
12 | Address Bit 5 | Address Bit 5
13 | Data Bit 3 | Data Bit 3
14 | Address Bit 6 | Address Bit 6
15 | Address Bit 7 | Address Bit 7
16 | Data Bit 4 | Data Bit 4
17 | Address Bit 8 | Address Bit 8
18 | Address Bit 9 | Address Bit 9
19 | Address Bit 10 | Row Address Strobe 1
20 | Data Bit 5 | Data Bit 5
21 | Write Enable | Write Enable
22 | Ground | Ground
23 | Data Bit 6 | Data Bit 6
24 | No Connection | Presence Detect (Ground)
25 | Data Bit 7 | Data Bit 7
26 | Data Bit 8 (Parity) Out | Presence Detect (1M = Ground)
27 | Row Address Strobe | Row Address Strobe
28 | Column Address Strobe Parity | No Connection
29 | Data Bit 8 (Parity) In | Data Bit 8 (Parity) I/O
30 | +5 Vdc | +5 Vdc

#### Table 7.7 Standard 72-Pin SIMM Pinout

Pin | SIMM Signal Name
1 | Ground
2 | Data Bit 0
3 | Data Bit 16
4 | Data Bit 1
5 | Data Bit 17
6 | Data Bit 2
7 | Data Bit 18
8 | Data Bit 3
9 | Data Bit 18
10 | +5 Vdc
11 | Column Address Strobe Parity
12 | Address Bit 0
13 | Address Bit 1
14 | Address Bit 2
15 | Address Bit 3
16 | Address Bit 4
17 | Address Bit 5
18 | Address Bit 6
19 | Reserved
20 | Data Bit 4
21 | Data Bit 20
22 | Data Bit 5
23 | Data Bit 21
24 | Data Bit 6
25 | Data Bit 22
26 | Data Bit 7
27 | Data Bit 23
28 | Address Bit 7
29 | Block Select 0
30 | +5 Vdc
31 | Address Bit 8
32 | Address Bit 9
33 | Row Address Strobe 3
34 | Row Address Strobe 2
35 | Parity Data Bit 2
36 | Parity Data Bit 0
37 | Parity Data Bit 1
38 | Parity Data Bit 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 Bit 8
50 | Data Bit 24
51 | Data Bit 9
52 | Data Bit 25
53 | Data Bit 10
54 | Data Bit 26
55 | Data Bit 11
56 | Data Bit 27
57 | Data Bit 12
58 | Data Bit 28
59 | +5 Vdc
60 | Data Bit 29
61 | Data Bit 13
62 | Data Bit 30
63 | Data Bit 14
64 | Data Bit 31
65 | Data Bit 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.

#### Table 7.8 72-Pin SIMM Presence Detect Pins

70 | 69 | 68 | 67 | SIMM Type | IBM Part Number
- | - | - | - | Not a valid SIMM | N/A
- | - | - | Gnd | 1M 120ns | N/A
- | - | Gnd | - | 2M 120ns | N/A
- | - | Gnd | Gnd | 2M 70ns | 92F0102
- | Gnd | - | - | 8M 70ns | 64F3606
- | Gnd | - | Gnd | Reserved | N/A
- | Gnd | Gnd | - | 2M 80ns | 92F0103
- | Gnd | Gnd | Gnd | 8M 80ns | 64F3607
Gnd | - | - | - | Reserved | N/A
Gnd | - | - | Gnd | 1M 85ns | 90X8624
Gnd | - | Gnd | - | 2M 85ns | 92F0104
Gnd | - | Gnd | Gnd | 4M 70ns | 92F0105
Gnd | Gnd | - | - | 4M 85ns | 79F1003 (square notch) L40-SX
Gnd | Gnd | - | Gnd | 1M 100ns | N/A
Gnd | Gnd | - | Gnd | 8M 80ns | 79F1004 (square notch) L40-SX
Gnd | Gnd | Gnd | - | 2M 100ns | N/A
Gnd | Gnd | Gnd | Gnd | 4M 80ns | 87F9980
Gnd | Gnd | Gnd | Gnd | 2M 85ns | 79F1003 (square notch) L40SX

- = No Connection (open)
Gnd = Ground
Pin 67 = Presence detect bit 0
Pin 68 = Presence detect bit 1
Pin 69 = Presence detect bit 2
Pin 70 = Presence detect bit 3

### 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 newer type of memory being offered 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 current and future Pentium and higher processor architectures. Unfortunately, all EDO RAM offered today 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. Current chipsets like the Intel Triton and Opti Viper offer support for EDO. Because these chips cost the same to manufacture as standard chips, the market has jumped on the EDO bandwagon, and virtually all newer chipsets support it. A pleasant surprise in the last year or so has been a steady drop in EDO RAM prices, to the point that EDO SIMMs and DIMMs generally cost about the same as--or sometimes even less than--non-parity, non-EDO SIMMs.

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.

Get more information on EDO RAM online at:

http://www.corsairmicro.com/EDOECCBrief.htm

### 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 up to 100MHz. It is anticipated that in the near future this figure will be pushed to 200MHz in order to keep up with faster systems of the future. SDRAM is limited primarily to DIMMs at this point, but prices are not appreciably higher than for other types of memory.

## 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.

Memory chips come in different shapes and sizes, yet all memory chips in which you are interested are called DRAM, or dynamic random-access memory. DRAM chips are the most common type of memory. These chips are considered to be dynamic because they need to be energized hundreds of times per second to hold information. If you shut off the power, the information is lost.

This section discusses adding memory, including selecting memory chips, installing memory chips, and testing the installation.

### Upgrade Strategies

Adding memory can be an inexpensive solution; at this writing, the cost of memory has fallen to less than $5 per megabyte. A small dose can give your computer's performance a big boost.

How do you add memory to your PC? You have three options, listed in order of convenience and cost:

- Adding memory in vacant slots on your motherboard.
- Replacing your current motherboard's memory with higher-capacity memory.
- Purchasing a memory expansion card.

Adding expanded memory to PC- or XT-type systems is not a good idea, mainly because an expanded memory board with a couple of megabytes of expanded memory installed can cost more than the entire system is worth. Also, this memory does not function for Windows, and a PC- or XT-class system cannot run OS/2. Instead, purchase a more powerful system--for example, an inexpensive Pentium 100--with greater expansion capabilities.

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. Many new systems use high-speed SIMM modules rather than chips. A pile of 150ns, 64K, or 256K chips is useless if your next system is a high-speed system that 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 more recent 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 today.
- DIMMs. Dual inline memory modules are 168-pin modules designed to work singly with today's 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 (which are nearly impossible to find) 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. The standard chip for Pentium-based systems today is the 4M bit or 16M bit chip (usually found in SIMMs). 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.

Systems with 16MHz or faster clock speeds require extremely fast memory to keep up with the processor. In fact, the speeds that are required are so excessive that standard DRAM typically would be replaced by faster and more expensive static RAM (SRAM). One alternative--adding wait states to reduce the memory-speed requirements--greatly decreases performance, which is not what you want in a fast system.

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 very high 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 Pentium-MMX and Pentium II CPUs, which both have separate 16K 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 on the market, 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 today provide standard SIMM-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. You can order one from an electronics parts store or mail-order house. 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. Appendix A provides more detailed information about the PC and XT motherboard switch settings.

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.

> NOTE: Information on installing memory on older memory-expansion cards can be found in Chapter 7 of the sixth edition of Upgrading and Repairing PCs on the CD accompanying this book.

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 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 21, "Software and Hardware Diagnostic Tools."

> NOTE: Information on installing 640K of RAM in an XT motherboard can be found on the CD accompanying this book.

## 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. A simple $30-$90 BIOS replacement can give your computer faster performance and more features.

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, mother-board, 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. Machines still are being sold with older BIOSes that do not support the user-definable drive-type feature required for easy installation of an IDE drive, or that may have timing problems associated with IDE drives.

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
- Adding support for block-mode Programmed I/O (PIO) transfers for a Fast-ATA (AT Attachment Interface) (Enhanced-IDE) hard disk.
- Adding 101-key Enhanced Keyboard support
- Adding compatibility for Novell networks
- Adding compatibility for SVGA displays
- Adding support for additional serial (COM) ports and printer ports
- Adding password protection
- Adding virus protection
- Adding support for additional disk drives
- 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 (for example, 286, 386DX, 386SX, 486DX, 486SX, Pentium 100, and so on)
- 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)
- The make, model, or part numbers of integrated motherboard chipsets, if used (for example, Intel, ALI, Chips & Technologies, VLSI, OPTI, UMC, and others)

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 today lie in the variety of integrated chipsets that are now 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 more popular chipsets for 286, 386, 486, Pentium, Pentium-MMX, Pentium Pro, and Pentium II machines 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. (Appendix A contains a complete list of Phoenix BIOS POST error codes.)

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. I recommend these excellent reference works, published by Addison-Wesley, 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. You even can purchase the program 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 mother-board quickly, without shifting blame for the problem to another party. I recommend buying AMI's motherboards, because you generally don't have to worry about compatibility problems between the AMI BIOS and the AMI motherboard. Even if problems occur, AMI corrects them.

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 and now 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. Although Award's BIOS is not yet as popular as the Phoenix and AMI BIOSes, it is very popular, and compatibility even in tough environments, such as OS/2, is ensured.

If you want to replace or upgrade your BIOS, you can obtain replacement chips directly from the BIOS manufacturer or from the following recommended distributors:

- Micro Firmware Inc. Micro Firmware offers an extensive line of Phoenix BIOS upgrades, with more than 50 common 8088, 286, 386, 486, Pentium, and higher versions available. This company develops BIOS upgrades for specific hardware platforms, even when the original motherboard manufacturer is no longer in business. Many other BIOS vendors sell BIOSes developed by Micro Firmware for specific platforms.
- Washburn & Company Distributors. This licensed AMI distributor deals exclusively with AMI BIOS upgrades. Washburn has complete AMI motherboard and BIOS packages. A primary distributor for AMI, Washburn has great expertise in dealing with BIOS upgrade problems. The company also sells Second Nature, a disk drive support product that may eliminate the need for a BIOS if all you want is additional hard disk or floppy drive support.

### Special ROM BIOS-Related Problems

Some known problems exist in certain ROM BIOS versions as well as in some systems sold during the past few years. 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 even as recent as 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 is the most recent one made for the system. This version solves many problems with older 6300 systems and also provides support for a 720K floppy disk drive. You can order BIOS Version 1.43 for about $35 from the AT&T National Parts Sales Center (see Appendix A) under part number 105203780.

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. If you have a computer with an IDE drive and an AMI BIOS dated earlier than 04/09/90, you should get a newer BIOS from the system vendor.

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 I have performed on my own systems. (These modifications have worked for me, and I am not necessarily recommending that anyone else perform them.) If nothing else, the research and development of these modifications taught me much about the way some things work in an IBM-compatible system, and I know that many of you are interested in some of this information.

> 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 book who do not attempt these operations on their systems.

> NOTE: More information on BIOS, including removing the POST Speed Check, making a backup of your BIOS, modifying the hard disk parameter tables, and changing the hard disk controller head step rate can be found on the CD that accompanies this book. They can also be found in Chapter 7 of the sixth edition of Upgrading and Repairing PCs.

Using a Flash BIOS

Flash ROM is a type of EEPROM chip that is included in most systems today. 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.

Most manufacturers that use the Flash BIOS system notify their customers when they upgrade the BIOS for a particular system line. Usually, the cost of the upgrade is nominal; if your system is new enough, the upgrade may even be free.

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.

© Copyright, Macmillan Computer Publishing. All rights reserved.