[Back to HARDWARE SWAG index] [Back to Main SWAG index] [Original]
{
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.
[Back to HARDWARE SWAG index] [Back to Main SWAG index] [Original]