{ This is a complete map of PC, XT, AT, PS/2 and EGA-installed data areas between 0400h and 0500h in the low memory segment put into the form of a Turbo Pascal 4/5/5.5 compatible unit. I found myself needing one or two of these absolute addresses from time to time and got tired of looking them up. Using a record structure declared as absolute variable relieves you of specifying the individual addresses for each variable, providing that all the Resrved areas are included too. I hope this saves all those Turbo Pascal programmers out there some time and lets them get on with the creative side of the business. Enjoy! David Gwillim 159 Woodbury Road Hicksville, NY 11801-3030 (516) 942-8697 6 August 1989 CREDITS: The absolute addresses for this unit came from "The Programmer's PC Sourcebook" by Thom Hogan, published by Microsoft Press. ISBN 1-55615-118-7. List price $24.95 USA. This book is very helpful (apart from a few inevitable) typos). I consider it an essential purchase for any programmer who has to deal with a PC at the hardware level. } unit Bios; interface var BiosSeg : record ComBase : array[1..4] of word; LptBase : array[1..4] of word; InstalledHardware : array[1..2] of byte; POST_Status : byte; { Convertible only } MemorySize : word; _RESERVED1 : word; KeyboardControl : array[1..2] of byte; AlternateKeypadEntry : byte; KeyboardBufferHeadPtr : word; { points to first char in type-ahead buffer } KeyboardBufferTailPtr : word; { points to last char in type-ahead buffer } KeyboardBuffer : array[1..16] of word; FloppyRecalStatus : byte; FloppyMotorStatus : byte; FloppyMotorOffCounter : byte; FloppyPrevOpStatus : byte; FloppyControllerStatus : array[1..7] of byte; DisplayMode : byte; NumberOfColumns : word; RegenBufferLength : word; RegenBufferAddress : word; CursorPosition : array[1..8] of word; CursorType : word; CurrentDisplayPage : byte; VideoControllerBaseAddress : word; Current3x8Register : byte; Current3x9Register : byte; PointerToResetCode : pointer; { PS/2 only - except model 30 } _RESERVED2 : byte; TimerCounter : longint; TimerOverflowFlag : byte; { non-zero means timer passed 24 hours } BreakKeyState : byte; ResetFlag : word; { $1234=bypass mem test; $4321=preserve mem (PS/2) } { $5678=system supended (Convertible) } { $9ABC=manufacturing test (Convertible) } { $ABCD=system POST loop (Convertible only) } FixedDiskPrevOpStatus : byte; NumberOfFixedDrives : byte; FixedDiskDriveControl : byte; {XT only} FixedDiskControllerPort : byte; {XT only} LptTimeOut : array[1..4] of byte; { [4] valid for PC, XT and AT only } ComTimeOut : array[1..4] of byte; KeyboardBufferStartOffsetPtr :word; KeyboardBufferEndOffsetPtr :word; VideoRows : byte; CharacterHeight : word; { bytes per character } VideoControlStates : array[1..2] of byte; _RESERVED3 : word; MediaControl : byte; FixedDiskControllerStatus : byte; { AT, XT after 1/10/85, PS/2 only } FixedDiskControllerErrorStatus : byte; { AT, XT after 1/10/85, PS/2 only } FixedDiskInterruptControl : byte; { AT, XT after 1/10/85, PS/2 only } _RESERVED4 : byte; DriveMediaState : array[0..1] of byte; _RESERVED5 : word; DriveCurrentCylinder : array[0..1] of byte; KeyboardModeState : byte; KeyboardLEDflags : byte; UserWaitCompleteFlagAddress : pointer; UserWaitCount : longint; { micro-seconds } WaitActiveFlag : byte; _RESERVED6 : array[1..7] of byte; VideoParameterTable : pointer; { EGA and PS/2 only } DynamicSaveArea : pointer; { EGA and PS/2 only } AlphaModeAuxCharGenerator : pointer; { EGA and PS/2 only } GraphicsModeAuxCharGenerator : pointer; { EGA and PS/2 only } SecondarySaveArea : pointer; { PS/2 only (not Model 30) } _RESERVED7 : array[1..4] of byte; _RESERVED8 : array[1..64] of byte; PrintScreenStatus : byte; end absolute $0040:$0000; implementation end.