Determining & Controlling Hardware "Never let a domestic quarrel ruin a day's writing. If you can't start the next day fresh, get rid of your wife." Mario Puzo This chapter describes the objects included in the totSYS unit. There are four objects in all, designed to provide information about the hardware and operating system on which an application is running. Dis- playOBJ is an object relating to the monitor/display card; EquipOBJ returns information about the peripheral devices installed on the computer; MemOBJ provides information about base, extended and expanded memory; OSOBJ provides information about the operating system and the DOS configurable international settings. A full example illustrating the use of each object can be found at the end of the chapter. Using DisplayOBJ The public methods (i.e. the methods you should be calling) in Display- OBJ are designed to provide you with information about the computer display. Since other units in the Toolkit also need to know this information, a global instance, called Monitor, is automatically ini- tialized when the totSYS unit is used. Monitor is, in fact, a pointer to an object on the heap, and has to be referenced with the pointer symbol, e.g. Monitor^. There should be no reason to initialize another DisplayOBJ, just access the Monitor^ methods. The following methods are available: SnowProne: boolean This function method returns true if the display is a "snowy" CGA. Since the screen writing routines in totFAST take care of snow, you should not normally need to call this method. GetMode:byte Returns the current display mode, e.g. mode 3 is 80 column color mode. Refer to the Turbo Pascal Programmer's Guide or a DOS Technical Refer- ence for more information about display modes. ColorOn:boolean 4-2 User's Guide -------------------------------------------------------------------------------- This function returns true if the system is capable of color display. This function is normally called to determine whether to use monochrome or color display attributes when overriding the Toolkit's defaults. This function will always return false if ForceBW is set to true (dis- cussed next). It also returns false if the user is using a color sys- tem, but has set the device to BW80 mode. SetBW(On:boolean) Call this procedure and pass a true value if you want to force the system to use monochrome values. This is useful for laptop systems where the system responds as a color device, but the user only sees gray (or orange!) scales. Because LookTOT was initialized before your program code was executed, you should also call LookTOT^.SetDefaults, and LookTOT will then be assigned the default monochrome settings. DisplayType: tVideo The totSYS unit defines an enumerated type tVideo which has the follow- ing members: UnKnown, Mono, CGA, MCGAmono, MCGAcol, EGAmono, EGAcol, VGAmono and VGAcol. The function display type checks the installed hardware and returns the appropriate member. BaseOfScreen: pointer; This function returns a pointer to the base address of video memory. This is $B800:0000 for color systems and $B000:0000 for monochrome. Unless you are using non-Toolkit routines to directly access video memory, you should not need to call this method. Width: byte This function returns the width of the display in characters, which is commonly a value of 80. Depth: byte This function returns the depth of the display in lines. In normal display mode the function will return 25, but in condensed mode an EGA system will return 43, and a VGA system will return 50. The following two methods are used to switch an EGA or VGA display system between condensed and normal modes. SetCondensed: byte; Hardware 4-3 -------------------------------------------------------------------------------- This function tries to set the display to condensed mode, and returns the number of text lines the system can display in condensed mode. Note that only EGA and VGA systems can be set into condensed mode. 4-4 User's Guide -------------------------------------------------------------------------------- Set25; This procedure forces the display into 25 line mode. Using EquipOBJ The EquipOBJ object is designed to provide information about the installed hardware devices. Most of the EquipOBJ methods reflect the data which the user defined with the SETUP operating system command. This may not correspond with the actual physical configuration, but is the only configuration which DOS will allow software to access. Equi- pOBJ includes the following methods: ComputerID:byte; This function returns a byte indicating the basic system type. The computer ID was implemented by IBM to provide an easy way for differen- tiating between the various IBM personal computers. The following list shows the hexadecimal values of the IBM range: $FF - IBM PC $FE,$FB - IBM XT or portable $FD - the infamous PC Junior $FC - IBM AT, XT-286, PS/2 50 and 60 $FA - PS/2 25 and 30 $F9 - IBM PC Convertible $F8 - PS/2 80 Some non-IBM systems do not follow this convention, and an unlisted number may be returned by this method. ParallelPorts: byte; This function returns the number of installed parallel ports (LPTx). SerialPorts: byte; This function returns the number of installed serial ports (COMx). FloppyDrives: byte; This function returns the number of physical diskette drives. ROMDate: string; Hardware 4-5 -------------------------------------------------------------------------------- Returns an eight character string representing the ROM date in the format MM/DD/YY. GameAdapter: boolean; Returns true if a game adapter is installed. Serialprinter: boolean; Returns true if a serial printer is configured. MathChip: boolean; Returns true if a math co-processor is detected. If you compile Toolkit programs with the compiler directive FLOAT enabled, but FLOATEM dis- abled, the program will only run on systems equipped with a math co- processor. Use this function during program initialization to ensure the host PC is adequately equipped. Using MemOBJ The MemOBJ methods provide data related to base, extended and expanded memory on the host PC. The following function methods are provided: BaseMemory: integer; Returns the total amount of base memory installed, i.e. memory up to 640k. The value is returned in kilobytes ("k"). Remember that the Turbo Pascal functions MemAvail and MaxAvail provide data on free memory, i.e. memory not being used by device drivers and programs. EMMInstalled: boolean; Returns true if an expanded memory manager is installed. EMMversionMajor: byte; Returns the expanded memory manager major version number, i.e. the whole portion of the version number. If an EMM is not installed, a 0 is returned. EMMversionMinor: byte; Returns the expanded memory manager minor version number, i.e. the dec- imal portion of the version number. If an EMM is not installed, or if the minor version number is zero, a 0 is returned. 4-6 User's Guide -------------------------------------------------------------------------------- EMMversion: string; Returns a three character string representing the complete EMM version number, e.g. "4.0". MaxExpMem: word; Returns the total amount of installed expanded memory in kilobytes. ExpMemAvail: word; Returns the amount of unused (or available) expanded memory in kilo- bytes. ExtMemAvail: word; Returns the amount of unused extended memory in kilobytes. Using OSOBJ The OSOBJ object is designed to provide information about the operating system. This unit is particularly useful when programs need to be developed for the international (read: non-American!) market place, because the DOS configuration can be ascertained, including the date format, currency symbol, country code, etc. If you develop a program to be distributed internationally, you need to adhere to the host countries' formatting conventions, especially date and number formats. Refer to chapter 11: Controlling User Input for a full discussion of this topic. The following function methods are available: OSVersionMajor: byte; Returns the major DOS version number, e.g. 2, 3 or 4. OSVersionMinor: byte; Returns the minor DOS version number, e.g. 1. OSVersion: string; Returns the full DOS version number as a string, e.g. "3.1" Country: word; Hardware 4-7 -------------------------------------------------------------------------------- Returns a word which represents the country code. In general, the coun- try codes are the same as the 3-digit international phone access code. Some of the more common codes are: 001 United States 002 Canada (French) 003 Latin America 031 Netherlands 032 Belgium 033 France 034 Spain 039 Italy 041 Switzerland 044 United Kingdom 045 Denmark 046 Sweden 047 Norway 049 Germany 061 Australia 351 Portugal 358 Finland Currency: string; Returns a string identifying the country's currency abbreviation. On systems using DOS prior to version 3.0, only a signal character can be accessed. However, systems using DOS 3.0 and later may return more than one character, e.g. FFR, DKR. DateFmt: tDate; The totSYS unit includes the declaration of the tDATE enumerated type which has three members: USA, EUROPE and JAPAN. This function returns the member which represents the operating system default date format. Note that the three formats are MM-DD-YY, DD-MM-YY and YY-MM-DD, respectively. ThousandsSep: char; Returns the character used to punctuate the thousands mark in numbers. The USA uses a comma, whereas many other countries use a period or a space. DecimalSep: char; Returns the character used to punctuate the decimal place. This is usually a period or a comma. 4-8 User's Guide -------------------------------------------------------------------------------- DateSep: char; Returns the character used to separate the month, day and year elements of a date, e.g. "/", "-". Note: this information is not accessible on systems using DOS prior to version 3.0. If the machine does not have DOS 3.0 or later, a '/' is returned. TimeSep: char; Returns the character used to separate the hours, minutes and seconds when displaying the time, e.g. ":". Note: this information is not accessible on systems using DOS prior to version 3.0. If the machine does not have DOS 3.0 or later, a ':' is returned. TimeFmt: byte; Returns a byte to indicate the preferred time display. A 0 indicates a 12 hour format, and a 1 indicates a 24 hour format. Note: this informa- tion is not accessible on systems using DOS prior to version 3.0. If the machine does not have DOS 3.0 or later, a 0 is returned. CurrencyFmt: byte; Returns a byte indicating the currency format. One of the following five values will be returned: 0 String leads currency, no space 1 String follows currency, no space 2 String leads currency, one space 3 String follows currency, one space 4 String replaces decimal separator Note: this information is not accessible on systems using DOS prior to version 3.0. If the machine does not have DOS 3.0 or later, a 0 is returned. CurrencyDecPlaces: byte; Returns the number of decimal places normally used with the country's currency. Note: this information is not accessible on systems using DOS prior to version 3.0. If the machine does not have DOS 3.0 or later, a 2 is returned. Hardware 4-9 -------------------------------------------------------------------------------- Example Listed below is the demo program, DEMSY1, which illustrates the use of each of the four totSYS objects. Figure 4.1 reflects the resultant output on a VGA computer. Program DemoSystemOne; {DEMSY1} USES DOS,CRT, TOTSYS; var Equip: EquipObj; Mem: MemObj; OS: OSObj; Lines: byte; begin ClrScr; Lines := Monitor^.SetCondensed; if Monitor^.ColorOn then writeln('This system is color') else writeln('This system is monochrome'); with Equip do begin Init; Writeln('Machine ID: ',ComputerID); Writeln('Parallel Ports: ',ParallelPorts); Writeln('Serial Ports: ',SerialPorts); Writeln('Floppy Drives: ',Floppydrives); Writeln('ROM date: ',RomDate); Writeln('Game Adapter: ',GameAdapter); Writeln('Serial printer: ',Serialprinter); Writeln('Math Coprocessor: ',MathChip); Writeln; end; with Mem do begin Init; Writeln('Base memory: ',Basememory,'k'); Writeln('Avail Extended memory: ',ExtMemAvail,'k'); if EMMInstalled then begin Writeln('Total Expanded memory: ',MaxExpMem,'k'); Writeln('Avail Expanded memory: ',ExpMemAvail,'k'); Writeln('Expanded memory manager version: '+ EMMversion); end else 4-10 User's Guide -------------------------------------------------------------------------------- Writeln('Expanded memory not installed: '); writeln; end; with OS do begin Init; Writeln('Operating System Version: '+OSversion); Writeln('Country Code: ',Country); write('Currency String: ',Currency,' '); case CurrencyFmt of 0: writeln('(String leads currency, no space)'); 1: writeln('(String follows currency, no space)'); 2: writeln('(String leads currency, one space)'); 3: writeln('(String follows currency, one space)'); 4: writeln('(String replaces decimal separator)'); end; {case} writeln('Currency Decimal Places: ',CurrencyDecPlaces); write('Thousands Separator: ','''',ThousandsSep,''''); writeln(' Decimal Separator: ','''',DecimalSep,''''); case DateFmt of USA: writeln('Date Format: MM DD YY'); Europe: writeln('Date Format: DD MM YY'); Japan: writeln('Date Format: YY MM DD'); end; {case} write('Date separator: ','''',DateSep,''''); writeln(' Time separator: ','''',TimeSep,''''); if TimeFmt = 0 then writeln('Time is displayed on a 12 hour clock') else writeln('Time is displayed on a 24 hour clock'); end; write(' press any key ...'); Repeat until keypressed; if Lines > 25 then Monitor^.Set25; end. Notice that the INIT method is not called for the Monitor^ instance. This is because Monitor^ is a global instance, and the Toolkit automat- ically initializes all global instances. Figure 4.1 [SCREEN] The System Demo Program