Category : C Source Code
Archive   : TCHK21.ZIP
Filename : TCHK.DOC

Output of file : TCHK.DOC contained in archive : TCHK21.ZIP

TCHK 2.1 Page 1

TCHK - a Turbo C library
Version 2.10
Documentation for TCHK
Howard Kapustein

Howard Kapustein
1695 Barbara Lane
East Meadow, NY 11554
(516) 481-9612

(c) Copyright 1987, 1988, 1989 All rights reserved

TCHK 2.1 Page 2

Table of Contents

COPYRIGHT AND DISCLAIMER ........................................... 4

TRADEMARKS ......................................................... 4

LICENSE ............................................................ 4

REGISTRATION AND ORDERING INFORMATION .............................. 5

QUANTITY DISCOUNTS ................................................. 6

BACKGROUND ......................................................... 6

FILES .............................................................. 7

IN THE BEGINNING.. ................................................. 8

FEATURES ........................................................... 9

CREDIT ............................................................. 10

FUNCTIONS .......................................................... 10

TIPS AND CAVEATS ................................................... 12

#DEFINES ........................................................... 12
Ansihk.h ...................................................... 12
Color.h ....................................................... 12
Chiphk.h ...................................................... 12
Datehk.h ...................................................... 13
Doshk.h ....................................................... 13
Filehk.h ...................................................... 14
Finance.h ..................................................... 15
Howard.h ...................................................... 15
Ibm.h ......................................................... 15
Keyboard.h .................................................... 16
Keycode.h ..................................................... 16
Math.h ........................................................ 17
Menuhk.h ...................................................... 17
Mousehk.h ..................................................... 19
Multihk.h ..................................................... 20
Printhk.h ..................................................... 20
Real.h ........................................................ 20
Sound.h ....................................................... 21
Statehk.h ..................................................... 21
Timehk.h ...................................................... 21
Video.h ....................................................... 21
Zip.h ......................................................... 22

VARIABLE TYPES ..................................................... 23

TCHK 2.1 Page 3

GLOBAL VARIABLES ................................................... 24
Date variables: ............................................... 24
Keyboard variables: ........................................... 24
Menu variables: ............................................... 25
Mouse variables: .............................................. 25
Multitasking variables: ....................................... 25
Real (simulated FP) variables: ................................ 25
State/Zip code variables: ..................................... 25
TCHK version variables: ....................................... 26
Video variables: .............................................. 26

REVISION HISTORY ................................................... 28

FUTURE ENHANCEMENTS ................................................ 35

OTHER PRODUCTS ..................................................... 38

SUPPORT ............................................................ 39

APPENDIX A - DATE FORMATS .......................................... 40

APPENDIX B - date_convert() FORMATS ................................ 41

APPENDIX C - time_convert() FORMATS ................................ 43

APPENDIX D - SIMULATED FP MATH ..................................... 44

APPENDIX E - MOUSE FUNCTIONS ....................................... 46

APPENDIX F - REGISTRATION FORM ..................................... 49

APPENDIX G - BUG REPORT FORM ....................................... 52

Index .............................................................. 56

TCHK 2.1 Page 4


This library and documentation are Copyrighted (C) 1987, 1988,
1989 by Howard Kapustein, All Rights Reserved.

Use of this library acknowledges this disclaimer of warranty:
"This library is supplied as-is. The author disclaims all
warranties, expressed or implied, including, without limitation,
the warranties of merchantability and of fitness of this product
for any purpose. The author assumes no liability for damages
direct or consequential, which may result from the use of this


CLIPPER is a trademark of Nantucket Corporation.
dBASE and dBase III Plus is a registered trademark of Ashton-Tate
DESQview is a registered trademark of Quarterdeck Office Systems.
GEnie is a trademark of GE Information Services.
IBM is a registered trademark of International Business Machines.
LIM and EMS are trademarks of Lotus, Intel, and Microsoft
Lotus and Symphony are registered trademarks of Lotus Corp.
Macintosh is a registered trademark of Apple Incorporated.
Microsoft and Quick C are registered trademarks of Microsoft
TLIB, Turbo Assembler and Turbo C are registered trademarks of
Borland International.


TCHK is NOT, nor has it ever been, public domain or free software.

TCHK is being distributed under the User Supported software
concept. Nonregistered users are granted a limited license to use
TCHK for a trial period, in order to determine if it suits their
needs. Any other use of TCHK or use past this period requires
registration. Any use of non-registered copies of TCHK by a
business, organization, or any kind of institution is forbidden.

A registered copy of TCHK must be treated like a book, in that the
same registered copy of TCHK may not be used by more than one
person nor on more than one machine at the same time.

Non-registered users are granted a limited license to make an
evaluation copy for trial use on a private, non-commercial basis,
for the express purpose of determining whether TCHK is suitable

TCHK 2.1 Page 5

for their needs. After this trial period, you should either
register your copy or discontinue using TCHK. Registering your
copy of the software helps the author continue to provide
professional-quality software at very reasonable prices.

All corporate, business, government or other commercial users of
TCHK MUST be registered.

All users are granted a limited license to copy TCHK only for the
trial use of others and subject to the above limitations. This
license does NOT include distribution or copying of this software

1 - In connection with any other product or service.
2 - For general use within a company or institution.
3 - For any consideration or 'disk fee'.
4 - In modified form, i.e. the file containing this license
information MUST be included, along with the full
documentation, demos and any other files distributed
with TCHK.

Operators of electronic bulletin board systems (Sysops) are
encouraged to post TCHK for downloading by their users, as long as
the above considerations are met.

If you are a distributor of a public domain or user-supported
software library, you may be eligible to distribute copies of
TCHK. You must meet all of the above conditions and acquire
written permission from me, the author (Howard Kapustein) before
doing so. Such permission is usually granted. Please call or write
for details.

Distribution of a program incorporating an unregistered version of
TCHK, in part or whole, is a violation of the law.


Users may become REGISTERED owners for the small pittance of $20.
Registering has the following benefits:

Registered owners will receive TCHK compiled for use with all
memory models (not just the small memory model distributed

Registered owners will receive a disk supplied version of the
TCHK manual formatted for printing on an HP Laserjet.

Registered owners have a royalty-free runtime license, and
are entitled to utilize TCHK in distributed applications.

Registered owners can update their registration to the newest
version of TCHK for a nominal fee to cover diskette(s),
shipping and handling.

TCHK 2.1 Page 6

REGISTERED owners may purchase the source code to TCHK for $40.

All materials are shipped on 5.25-inch floppy diskettes.
Unfortunately, I do not yet have a 3.5-inch floppy drive, but it
is on my list of "Uses for registration monies". Sorry, but for
now, 3.5-inch disk versions of TCHK are not available. Yet...

An evaluation disk with the current copy of TCHK on it is
available for $10. This is to be used to try out TCHK, and does
not include registration. The fee covers the cost of postage,
diskette(s), and handling.

Non-U.S. orders need to include $5.00 extra to cover additional
shipping and handling charges. Checks and money orders must be
drawn on a U.S. bank. Please send all payments payable in U.S.

To place an order, please use the order form distributed with TCHK
(REGISTER.DOC). If by chance, you don't have the REGISTER.DOC
file, a copy of the registration form is available in Appendix F.


Quantity discounts are available starting at the 11th copy, as

0-10 copies: no discount
11-15 copies: 5% discount
16-20 copies: 10% discount
21+ copies: 15% discount

Discounts are not cumulative; they apply to single orders of like
products only.


I am a recent graduate of Rensselaer Polytechnic Institute (May
'89) with a B.S. in Computer Science and a minor in Accounting.
I also do consulting/programming work as a sideline (hint hint.)
Currently, I'm working full time with Shared Medical Systems (SMS)
in Malvern, PA. When I purchased Turbo C (way back at version
1.0), I wanted to do more than bare bones printf(). I was also
engaged in designing some software requiring the use of dates, and
some other unusual functions. Thus, after several months of
testing and use, I developed a rather useful collection of
functions. After some requests from other programmers, I decided
to bundle most of them together and document them. Since
then, my library has grown, and so has TCHK. This library is a
collection of most of these functions.

TCHK 2.1 Page 7


You may not distribute TCHK except in unmodified form, and it must
be distributed with all the following files:

PACKING.LST - list of distributed files
READ.ME - last minute notes

BUG.DOC - TCHK bug report form
REGISTER.DOC - TCHK registration form
TCHK.GEN - TCHK file description for GEnie
TCHK.MSG - brief description of TCHK
TCHK.PRO - TCHK BBS file description for ProDoor
TCHK.ZDR - TCHK BBS file description for ZDoor

TCHK.DOC - TCHK documentation
TCHK.FNC - TCHK function documentation
TCHKS.TC - Turbo C configuration file (Small)
TCHKS.LIB - small memory model library

ANSIHK.H - header file for ANSI functions
CHIPHK.H - header file for chip id routines
COLOR.H - color definitions
COMM.H - header file for communications functions
DATEADV.H - header file for advanced date routines
DATECONV.H - header file for date conversion routines
DATEHK.H - header file for date routines
DOSHK.H - header file for DOS routines
FILEHK.H - header file for file routines
FINANCE.H - header file for financial routines
HOWARD.H - header file for miscellanoues definitions
IBM.H - header file for misc. IBM routines
KEYBOARD.H - header file for keyboard routines
KEYCODE.H - keyboard key codes
MATHHK.H - header file of math routines
MENUHK.H - header file for menu routines
MOUSEHK.H - header file for mouse routines
MULTIHK.H - header file for multi-tasking routines
NETWORK.H - header file for network routines
PRINTHK.H - header file for print routines
REAL.H - header file for simulated FP functions
SOUND.H - header file for sound routines
STATEHK.H - header file for state/zip code functions
STRINGHK.H - header file for string routines
TIMEHK.H - header file for time routines
VIDEO.H - header file for video routines
ZIP.H - header file for .ZIP file format support

TCHK 2.1 Page 8

DEMO.ZIP - archive of TCHK demo programs:

DEMOADV.C - date conversion functions
DEMODATE.C - date functions
DEMODISK.C - disktype function
DEMOLITE.C - litebar menu functions
DEMONUM.C - number functions (math/financial)
DEMOPARS.C - DOS parsing functions
DEMOPOP.C - popup menu functions
DEMOTIME.C - time conversion functions

To compile the demo programs, use the configuration file TCHK.TC
and the appropriate project file. Make sure you check the Turbo C
directories before compiling. See Tips and Caveats for more


Except where explicitly stated, all of these functions have been
compiled and tested on my system:

- 640K memory
- (CGA) Color Graphics Adapter
- DOS 3.2
- AST SixPakPremium w/1 MB EEMS (REMM.SYS 3.1 and 4.3)
- Microsoft Mouse (MOUSE.COM 6.24)
- IBM Proprinter XL
- NEC V20 cpu
- PC Sprint (dandy little speed up plug in. No slot,
hardware switch for normal (4.77) and fast (~7) MHz speeds
and reboot. Between the board and the NEC my machine plods

TCHK 2.1 Page 9

along almost 2x as fast as a normal PC. At only $95, I
highly recommend it. Call these guys for more info:

Product: PC Sprint and/or NEC V20
Exec-PC, Inc.
PO BOX 11268
Shorewood, WI 53211
VOICE: (414) 963-2880
MODEM: (414) 964-5160

TCHK was compiled from the interactive environment of Turbo C,
with the following options changed from the default:

Memory model: SMALL
Optimize on: SPEED
Full optimization (Register/Jump)
No debug information
Standard stack frame Off

For more info, check out the configuration file TCHK.TC.

This library was written in 100% Turbo C, except for a couple of
TASM modules which were originally inline Assembly. All C code was
compiled with Turbo C 2.0, all Assembly was compiled with Turbo
Assembler 1.0 and TCHK created with TLIB 2.0.


TCHK sports many useful features not found in other shareware
packages. Aside from many input and output routines, TCHK provides
many functions dealing with dates, time, strings, popup and
litebar menus, DESQview support, and much more.

Many of the functions requiring output as a side effect (most
noticeably the keyboard and menu functions) make use of some of
the output routines prototyped in VIDEO.H or some of the console
i/o functions by Borland (i.e. cputs(), putch(), etc.). If you use
almost any of the keyboard routines, also expect some video
routines to be linked into your program. This is true of some
other functions as well (the popup menus use Borland's gettext()
and cputs() routines.) If you really want to change the library,
you can always purchase the source code...

For a quick synopsis of TCHK, check out the file TCHK.MSG.

TCHK 2.1 Page 10


The following people deserve credit for their help:

James Arnold for helping with optimizing the direct video access
Darius Thabit for his help with the reboot function.
Mark Seyden, Sysop of The BOSS (201-568-7293), for allowing me
to use his bbs as a base for TCHK.
Robert Blacher, Sysop of Computer Connections (202-547-2008),
for his comments regarding my license information and for
running an excellent BBS
Robert Mason, my college roomate, for his uncanny knack at finding
bugs within the first 30 seconds of use, no matter how clean
the code.


Most of the functions are documented well enough below, although I
feel a few more explanations are necessary:

In the interactive environment you can #define one item in
terms of another, including spaces. If anyone knows how to do
this with the command line version, please let me know. The
variable type byte is just an unsigned char. If you use the
command line version of TC you will have to change some of
the header files of TCHK.

Beginning with TCHK 2.0, unless otherwise noted, all
functions asking for screen coordinates comply with Borland's
format (x,y). The top left corner of the screen is (1,1).
This is highly different from previous versions of TCHK.

Many functions rely on interrupts and low memory addresses
(400:xxxx) to comply with the IBM standard. Certain values
(for instance, the current video page) can be found by an
interrupt or by peeking at the value stored in low memory.
Many of the video functions especially require these values
to be found at the proper places. If your clone is radically
different from the IBM standard some of these functions may
not work properly. I didn't want to have to write a million
small functions that are just background support for the
functions found here (like current page number, etc.) so I
used the #defines found in the headers (see video.h for more

TCHK considers "key codes", "scan codes" and "ascii codes" as
different animals. Via the BIOS, any key pressed returns a
word (2-byte) value. If a 'normal' key is pressed (i.e. a
letter, space, etc.) the low order byte contains the letter.
When the low order byte is zero, an unusual key has been
pressed (i.e. Alt combinations, arrows, grey +, etc.) This 2

TCHK 2.1 Page 11

byte word as returned by the BIOS is called a scan code. For
ease of use, several functions convert this "scan code" to a
value from 0-511, called a "key code", where 0-255 are
'normal' ascii codes, as per the IBM ASCII character set, and
256-511 are the unusual keys. Many of the popular key codes
are listed in KEYCODE.H. To determine a key code, if the low
order byte is zero, take the high order byte as a number
0-255 and add 256. If the low order byte is non-zero, take
the low order byte as a number from 0-255. Note that although
the regular plus key and the grey plus key (on the numeric
keypad) return different scan codes, their key code is the
same. So, briefly, an "ascii code" is a char (value of
0-255), a "scan code" is a 2-byte word returned from the
BIOS, and a "key code" is a value 0-511. "Scan codes" and
"key codes" are both 2 bytes long (unsigned int and int,

There are several functions that refer to a DOS file name. A
'file name' is a generic term for any possible name for a
file (drive, path and even filename.ext are optional). A
'filename' refers to a DOS filename.ext, no drive or path
(sometimes referred to with 'filename.ext'). A 'filepathname'
refers to a full file name, including drive, path and
filename.ext (some parts may be optional.) A 'filespec' is
similiar to a 'filename', but does not necessarily refer to a
specific file (i.e. D:\TURBOC is actually D:\TURBOC\*.*. See
how DIR parses filespecs for more details.)

TCHK has not been tested on a Hercules or MDA video card
since I do not have access to either piece of hardware,
although the methods I used are well documented and should
cause no problems.

All functions that use my direct screen access routines have
built-in snow control. On CGA monitors, the snow was
horrendous without it. Unless I code these routines in
assembler, I won't be able to squeeze any more optimization
out of these routines. Since Borland now provides acceptable
console i/o functions, I doubt I shall bother to recode these
in Assembler.

One type of command you will NOT find in TCHK are windowing
commands. There are plenty of windowing libraries available. You
should not try to make your poor IBM into a Mac, it won't cut it.
Splurge for the Mac, you'll be happier. If you really want windows
on your IBM-type machine, use DESQview. Yes, I know, a 'windowing'
interface is nicer. I use 'windows' too, although mine are just
boxes. Given the overhead needed for windows (in memory and
performance) I find my method more than acceptable for my current

The functions are listed in the same manner as the Turbo C manual,
in alphabetical order. Due to the size of the documentation, the
functions appear in a separate file TCHK.FNC.

TCHK 2.1 Page 12


You really should check the settings in TCHK.TC before trying to
use TCHK. Here are a few things you might want to be aware of:

Nested Comments: I use them. Some of the header files have
nested comments in them. If you do not tell the compiler that
nested comments are ok, you may get strange and usually
untraceable error messages when compiling TCHK demos or
source code.

Command Line Compiler: byte, word and bboolean can only be
#defined in the interactive environment. If you use the
command line compiler you may have to change some header

DESQview/EMS: I plan on expanding the support for DESQview
and EMS in the near future. Several functions may seem
useless or nearly so right now. Due to time constraints,
there is only so much I can do at a time, but rest assured
there is more in the works. If you really can't wait, you
could always purchase the source code and putter around


Most of these #defines are self-explanatory. All can be found in
the appropriate header files:


Ansi color definitions. See ansihk.h for more details


DOS color definitions. See color.h for more details.


Cpu types recognized by cpu_id(). See chiphk.h for more details.
Math coprocessor types recognized by ndp_id(). See chiphk.h for
more details.

TCHK 2.1 Page 13


Date types:

typedef enum { Sun, Mon, Tues, Wed, Thrus, Fri, Sat } days;
typedef enum { Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep,
Oct, Nov, Dec } months;

My date structure:

typedef struct ddate {
int dyear; /* Year - 1900 */
int dday; /* Day of month (1-31) */
months dmon; /* Month (Jan = 0) */

Note: the year is stored as Year - 1900. For example, if you
wanted to store 1987 in the variable d (of type struct
ddate), you would: d.dyear = 87;
Note: the months start with January as zero.

Date constants:

#define DATENULL " - - " /* empty date string */
#define DATECHAR '-' /* date delimiter char */
#define DATECHARSTR "-" /* date delim. string */
#define DATECHARTEST "/- " /* all date delimiters */
#define BASE_LEAP_YEAR 1980 /* base year for leap
year calculations */
#define BASE_JUL_YEAR 1720982.0 /* base day for Julian
Type E calcs */

Date macros:

#define isleap(yr) isleapyear(yr)


DOS types:

typedef struct BIOSParmBlock {
unsigned int BytesPerSector;
byte SectorsPerAllocUnit;
unsigned int ReservedSectors;
byte numberFATs;
unsigned int numberRootDirEntries;
unsigned int TotalSectors;
byte MediaDescriptor;
unsigned int SectorsPerFAT;

TCHK 2.1 Page 14

typedef struct BootBlock {
byte JumpInstr[3];
byte OEMinfo[8];
struct BIOSParmBlock BPB;
unsigned int SectorsPerTrack;
unsigned int numberHeads;
unsigned int numberHiddenSectors;

typedef struct BootBlock4 {
byte JumpInstr[3];
byte OEMinfo[8];
struct BIOSParmBlock BPB;
unsigned int SectorsPerTrack;
unsigned int numberHeads;
unsigned long numberHiddenSectors;
unsigned long TotalnumberSectors;
byte Physicaldrive;
byte reserved1[1];
byte Signaturebyte;
unsigned long VolumeSerialNumber;
char VolumeLabel[11];
byte reserved2[8];


File types:

typedef struct filespec {
char drive;
char path[81];
char filename[13];
typedef struct fnameext {
char filename[9];
char ext[4];

File constants:

#define FNAMESIZE 96
#define PATHSIZE 100
#define MAXFNAME 13

TCHK 2.1 Page 15


Finance macros:

#define SLD(c,s,l) straight_line_dep(c,s,l)
#define SYD(c,s,l,p) sum_year_digits_dep(c,s,l,p)
#define DDB(c,l,p) double_decline_bal_dep(c,l,p)
#define ACC_SLD(c,s,l) accum_dep(c,s,l,0,1)
#define ACC_SYD(c,s,l,p) accum_dep(c,s,l,p,2)
#define ACC_DDB(c,l,p) accum_dep(c,0,l,p,3)


Boolean constants and macros:

#define boolean char
#define FALSE 0
#define TRUE (!FALSE)
#define EQU(b1,b2) (((b1)&&(b2)) || ((!b1)&&(!b2)))
#define NEQ(b1,b2) (((b1)&&(!b2)) || ((!b1)&&(b2)))
#define BINV(b1) (b1 ? FALSE : TRUE)

Text justification:

#define NONE 0
#define LEFT 1
#define CENTER 2
#define RIGHT 3

Turbo C version numbers

#define _TCmajor ((__TURBOC__&0xFF00)>>8)
#define _TCminor ((__TURBOC__&0x00FF)>>4)


#define OFF 0
#define ON 1


IBM types:

typedef struct EMSrecord {
unsigned int handle;
unsigned int totalpages;
unsigned int availpages;
byte version;
byte emserror;

TCHK 2.1 Page 16

IBM constants:

Rom id constants. See ibm.h for more details.
Machine id constants. See ibm.h for more details.
Memory strategy constants. See ibm.h for more details.
Disk id byte constants. See ibm.h for more details.
EMS constants. See ibm.h for more details.

IBM macros:

#define TIMER_TICKS *((long far *) 0x46Clu)


Keyboard constants:

#define SHIFT_STATUS *((byte far *) 0x417lu)
#define WAITFORKEY 1

getget() flags:

#define UDFIDLE 0x0080
#define DVFREESLICE 0x0040
#define JCENTER 0x0030
#define JLEFT 0x0020
#define JRIGHT 0x0010
#define JNONE 0x0000
#define BELL 0x0008
#define TRIMLEFT 0x0004
#define TRIMRIGHT 0x0002
#define INSERTMODE 0x0001
#define NOFLAGS 0x0000


Keycode constants:

Key shift status constants. See keycode.h for more details.
Key code constants. See keycode.h for more details.

TCHK 2.1 Page 17


Math constants:

#define SQRT2 1.41421356237309504880
#define PI 3.141592653589793238462643
#define E 2.7182818284590452353602874
#define MAXFLOAT 3.4E+38
#define MAXDOUBLE 1.7E+308
#define MAXLONG 2147483647
#define MAXLONG_UNSIGNED 4294967295


Menuhk types:

typedef struct popup_field {
char *command;
int y;
char flag;
char key;
char offset;
int retval;
struct popup_header *submenu;
struct popup_field *next;
struct popup_field *previous;

typedef struct popup_header {
char *videosave;
struct text_info inforec;
int left, top, right, bottom;
int margc;
struct popup_field *margv;
struct popup_field *current;
char *menusave;
int colnorm;
int colcmdkey;
int colhilite;
int coldisabled;
int coldishilite;
unsigned flags;
char internal;

TCHK 2.1 Page 18

typedef struct litebar_field {
char *command;
int x, y;
char flag;
char key;
char offset;
char *message;
int retval;
struct litebar_header *submenu;
struct litebar_field *next;
struct litebar_field *previous;
struct litebar_field *left;
struct litebar_field *right;
struct litebar_field *up;
struct litebar_field *down;

typedef struct litebar_header {
char *videosave;
struct text_info inforec;
int left, top, right, bottom;
int margc;
struct litebar_field *margv;
struct litebar_field *current;
int msgx, msgy;
char *menusave;
struct keylist *quitkey;
int colnorm;
int colcmdkey;
int colhilite;
int coldisabled;
int coldishilite;
int colmessage;
unsigned flags;
char internal;

typedef struct keylist {
int keyval;
struct keylist *next;

TCHK 2.1 Page 19

Menu flags:

#define QUITMENU 0x8000
#define ESCQUIT 0x4000
#define FREEMENU 0x2000
#define HIERARCHIAL 0x0100
#define UDFIDLE 0x0080
#define DVFREESLICE 0x0040
#define CASEINDEP 0x0020
#define RESTORECURSOR 0x0010
#define CURSORON 0x0008
#define ERASEMENU 0x0004
#define DISABLENOHILITE 0x0002
#define WRAPAROUND 0x0001

Internal menu flags:

#define FIRSTTIME 0x01

Menu command flags:

#define ENABLED 0x01
#define DISABLED 0x02
#define NOTOPTION 0x04


Mousehk constants:

#define MOUSEINT 0x33

#define NO_MOUSE 0

#define TWOBUTTONS -1
#define XBUTTONS 0
#define MSYSMOUSE 3

#define LEFTBUTTON 0

#define LBPRESSED 0x01
#define RBPRESSED 0x02
#define MBPRESSED 0x04

TCHK 2.1 Page 20


Multihk types:

typedef struct DESQmemory {
int memavail;
int largestblockavail;
int totalmem;

Multihk constants:

#define DVERROR_BEEP 0x8000
#define DVERROR_LEFT 0x2000
#define DVERROR_RIGHT 0x4000
#define DVERROR_EITHER 0x0000


Printhk constants:

Print Screen constants. See printhk.h for more details. constants. See printhk.h for more details. error codes. See printhk.h for more details.
#define PRTSC_STATUS *((byte far *) 0x500lu)


Real types:

typedef enum {
} _rmexcep;

typedef struct REAL {
long rint;
long rfrac;
int precision;

TCHK 2.1 Page 21

Real constants:



Sound constants:

Tone constants: see sound.h for mode details.


Statehk constants:

#define MAXSTATES 55


Timehk constants:

#define MAXLONGTIME 8640000l


Video constants:

#define VIDEO 0x10
#define MODE *((byte far *) 0x449lu)
#define PAGE *((byte far *) 0x462lu)
#define PAGELEN *((unsigned int far *) 0x44Clu)
#define VIDOFFSET *((unsigned int far *) 0x44Elu)
#define ROWCOUNT *((byte far *) 0x484lu)
#define CHARHEIGHT *((unsigned int far *) 0x485lu)
#define CURSOR_UNDERBAR (MODE==7)?0x0B0C:0x0607
#define CURSOR_HALFBLOCK (MODE==7)?0x070C:0x0407

#define SHADOW_TL 0x0080
#define SHADOW_T 0x0040
#define SHADOW_TR 0x0020
#define SHADOW_R 0x0010
#define SHADOW_BR 0x0008
#define SHADOW_B 0x0004
#define SHADOW_BL 0x0002
#define SHADOW_L 0x0001

TCHK 2.1 Page 22



Zip types:

typedef struct ZIP_local_header {
long Signature;
int version;
int BitFlag;
int CompressionMethod;
unsigned int FileTime;
unsigned int FileDate;
long CRC32;
long CompressedSize;
long UnCompressedSize;
int FileNameLength;
int ExtraFieldLength;

typedef struct ZIP_central_record {
long Signature;
int VersionMadeBy;
int VersionNeeded;
int BitFlag;
int CompressionMethod;
unsigned int FileTime;
unsigned int FileDate;
long CRC32;
long CompressedSize;
long UnCompressedSize;
int FileNameLength;
int CommentFieldLength;
int DiskStartNumber;
int InternalAttributes;
long ExternalAttributes;
long LocalHeaderOffset;

typedef struct ZIP_end_central_record {
long Signature;
int ThisDiskNumber;
int CentralDiskNumber;
int EntriesCentral;
long SizeCentral;
long OffsetCentral;
int ZipfileCommentLength;

TCHK 2.1 Page 23

Zip constants:

#define MAX_ZIP_VERSION 10
#define ZIPSignatureLocal 0x04034B50l
#define ZIPSignatureCentral 0x02014B50l
#define ZIPSignatureEndCentral 0x06054B50l

Zip macros:

#define nextZIPlocal(Z) (Z.FileNameLength +
Z.ExtraFieldLength +
#define ZIPversion(Zversion) (Zversion & 0x00FF)
#define _ZIPmajor(Zversion) (ZIPversion(Zversion) / 10)
#define _ZIPminor(Zversion) (ZIPversion(Zversion) % 10)


The following variable types have been defined:

bboolean = unsigned int defined in TC.EXE. See Features.
boolean = char Howard.h
byte = unsigned char defined in TC.EXE. See Features.
word = unsigned int defined in TC.EXE. See Features.
struct ddate Datehk.h
struct BiosParmBlock Doshk.h
struct BootBlock Doshk.h
struct BootBlock4 Doshk.h
struct filespec Filehk.h
struct fnameext Filehk.h
struct EMSrecord Ibm.h
struct keylist Menuhk.h
struct litebar_field Menuhk.h
struct litebar_header Menuhk.h
struct popup_field Menuhk.h
struct popup_header Menuhk.h
struct DESQmemory Multihk.h
struct ZIP_local_header Zip.h
struct ZIP_central_record Zip.h
struct ZIP_end_central_record Zip.h

TCHK 2.1 Page 24


These variables are defined for one reason or another and used
internally. None of these variables have to be initialized (see
insertmode.) They are mainly used to return extra values found in
certain functions or needed globally by other functions.

Date variables:

char *Days[7] = { "Sunday","Monday","Tuesday","Wednesday",
"Thursday","Friday","Saturday" };
char *Months[12] = { "January","February","March","April",
"December" };
char *MonthAbbr[12] = { "Jan","Feb","Mar","Apr","May",
"Nov","Dec" };
int daylist[13] = { 0, 31, 59, 90, 120, 151, 181, 212,
243, 273, 304, 334, 365 };

Note: daylist is a list of the day number of the year at the end
of each month (i.e. April 1st is the 91st (Mar 31 = 90, +1)
day of the year.)

Keyboard variables:

boolean key_extended; /* TRUE if special key pressed,
i.e. Alt-X, etc. */
int key_status; /* shift key status byte */

Note: these variables are set by getk(), and are checked by many
other keyboard routines.

boolean insertmode; /* insert or overwrite mode? */

Note: This variable is used internally by getstr() and getget().
Although getget() initializes this variable, getstr does
NOT. You MUST set insertmode to TRUE or FALSE before
calling getstr() or unpredictable results may occur. Upon
completion of this function, testing this variable will
determine the input mode last used. Future versions will
default insertmode to some value if it has not been set.

unsigned _cursorinsert;
unsigned _cursoroverwrite;

Note: Cursor used in insert and overwrite modes during keyboard
input. Currently only supported by getget().

TCHK 2.1 Page 25

Menu variables:

int litebarerrno;
int popuperrno;

Mouse variables:

int _mouse1, _mouse2, _mouse3, _mouse4;

Multitasking variables:

char _dvmajor;
char _dvminor;

Real (simulated FP) variables:

int _r_minpre, _r_maxpre;
boolean _r_maximum = FALSE;
int _rmatherror;

State/Zip code variables:

const char *States[] =
{ "AL","AK","AZ","AR","CA","CO","CT","CZ","DE","DC",
"VI","WA","WV","WI","WY" };

const char *StateName[] =
{ "Alabama","Alaska","Arizona","Arkansas",
"California","Colorodo", "Connecticut",
"Canal Zone","Delaware","District of Columbia",
"Montana","Nebraska", "Nevada","New Hampshire",
"New Jersey","New Mexico","New York",
"North Carolina","North Dakota","Ohio","Oklahoma",
"Oregon","Pennsylvania","Puerto Rico",
"Rhode Island","South Carolina","South Dakota",
"Virgin Islands","Washington","West Virginia",
"Wisconsin", "Wyoming" };

TCHK 2.1 Page 26

const long ZipMin[] =
{ 99500l, 35000l, 71500l, 85000l, 90000l, 80000l,
06000l, LONG_MIN, 20000l, 19700l, 32000l, 30000l,
96900l, 96700l, 50000l, 83200l, 60000l, 46000l,
66000l, 40000l, 70000l, 01000l, 20600l, 03900l,
48000l, 55000l, 63000l, 38600l, 59000l, 68000l,
27000l, 58000l, 03000l, 07000l, 87000l, 88900l,
09000l, 43000l, 73000l, 97000l, 15000l, 00600l,
02800l, 29000l, 57000l, 37000l, 75000l, 84000l,
22000l, 00800l, 05000l, 24700l, 98000l, 53000l,
82000l };

const long ZipMax[] =
{ 99999l, 36999l, 72899l, 86599l, 96699l, 81699l,
06999l LONG_MAX, 20599l, 19999l, 34299l, 31999l,
96999l, 96899l, 52699l, 83899l, 62999l, 47999l,
67999l, 42799l, 71499l, 02799l, 21999l, 04999l,
49999l, 56799l, 65899l, 39799l, 59999l, 69399l,
28999l, 58899l, 03899l, 08999l, 88499l, 89899l,
14999l, 45899l, 74999l, 97999l, 19699l, 00999l,
02999l, 29999l, 57799l, 38599l, 79999l, 84799l,
24699l, 00899l, 05999l, 26899l, 99499l, 54999l,
83199l };

TCHK version variables:

unsigned int _TCHKversion = 0x0210;
unsigned char _TCHKmajor = 2;
unsigned char _TCHKminor = 10;
char *_TCHKdate = "06/06/89";
char *_TCHK = "TCHK is Copyright (C) 1988,1989 by Howard
Kapustein. All rights reserved.";

Video variables:

FRAMES: see video.h for frame[] declarations.

const char emptystring[] = " ";

Note: Do NOT alter this variable. emptystring[] is defined
as a string of 15 spaces and is used internally by
several functions. Altering this function can lead to
wildly unpredictable results.

byte char_attribute;

Note: This variable is used by many output functions to set
the attribute byte. For functions such as putstr() you
can either call set_color() with the attribute desired
or declare char_attribute as an extern and then set it

TCHK 2.1 Page 27

int _shadowstyle = SHADOW_B | SHADOW_BR | SHADOW_R;
char _shadowchar = '±';
char _shadowcolor = LBLACK | B_BLACK;

TCHK 2.1 Page 28


Version 2.1 - 4-1-89
- ON and OFF are defined in howard.h
- isNovellNetavail()
- resolvepath()
- getBootBlock4(), getVolSerialNum()
- getAssignmemseg()
- isScrnSav2()
- isAutoPark(), setAutoPark()
- commit()
- isXMSinstalled()
- isCEDavail(), CEDadd(), CEDremove()
- nmid(), iseven(), isodd()
- Tone()
- iscdevicemoderaw(), setcdevicemoderaw()
- isremoveable()
- isdrivelocal(), ishandlelocal()
- isRedirectStdin(), isRedirectStdout()
- fileexist()
- new header file STATEHK.H for state and zip code information:
isstate(), iszip(), stateindex()
- Checksum_block(), CRC16_block(), CRC16tupdate(),
CRC16update(), CRC32tupdate()
- header file ZIP.H, containing support for .ZIP files
- joystickAx(), joystickAy(), joystickBx(), joystickBy(),
- center()
- dostimetolong(), longtodostime()
- isallalpha(), isallalphanum(), isalllower(), isallupper()
- iswildcarded()
- strpadleft(), strpadright()
- strspace2tab(), strtabexpand()
- soundex()
- bitrevb(), bitrevl(), bitrevw()
- new header file REAL.H for real (simulated fp) math: radd(),
rsub(), rdiv(), rceil(), rfloor(), rsign(), rnegate(),
rnormalize(), lpow() and Appendix D
- isdate(), isfilename(), ispathname()
- isHiliteable()
- shadow()
- ispcAnywhere(), SetpcAnywhere()
- DESQapilevel(), DESQappnum(), DESQbeginc(), DESQdisperror(),
DESQendc(), DESQgetbuf(), DESQgetmem(), DESQiskmouse(),
DESQjustify(), DESQkmouse_off(), DESQkmouse_on(),
DESQposttask(), DESQpushkey(), DESQputmem(), DESQstart(),
- getpw()
- initkeyvars()
- keyclick()
- is2nd8259(), isrealtimeclock(), isMCA()
- isDoubleDOS(), isInvisible()

TCHK 2.1 Page 29

- GetTypePointDevice(), ResetPointDevice(), SetPointDevice(),
SetRatePointDevice(), SetResPointDevice()
- CompaqExternalMonitorType(), CompaqInternalMonitorType(),
CompaqGetMasterMode(), CompaqSetMasterMode(),
CompaqGetMonitor(), CompaqSelectMonitor(),
- isDriverSys(), isNLSFuncCom()
- isWhoa(), setWhoa(), uninstallWhoa()
- isAnarkey()
- Compaq386GetCpuSpeed(), Compaq386SetCpuSpeed(),
- menu_litebar()
- all menu functions now have the bit flag DVFREESLICE to free
up time slices if running under DESQview
- all menu functions support a user-defined function during

idle keyboard waits via the _idle_menu() function
- getget() now supports type Hexadecimal (Hh), DOS Filename
(Ff) and Pathname (Pp) and Date (Dd)
- getget() now has the bit flag DVFREESLICE to free up time
slices if running under DESQview
- getget() supports a user-defined function during idle
keyboard waits via the _idle_get() function
- boxwindow() now supports NONE for title justification (like
the popup...() and litebar...() functions)
- new header file MOUSEHK.H for mouse functions: ismouse(),
MButtonPress(), MButtonRelease(), MButtonStatus(),
MMickeysMovedx(), MMickeysMovedy(), MCursorOff(),
MCursorOn(), MCursorRangex(), MCursorRangey(),
MCursorGraphic(), MCursorText(), MGotoxy(), MDriverSize(),
MGetDriver(), MPutDriver(), MouseReset(), MGetVerType(),
MGetDisplayPage(), MSetDisplayPage(), MUpdateScreen(),
MEmulateLightpenOff(), MEmulateLightpenOn(), MSetRatio(),
MSetThreshold(), MGetSensitivity(), MSetSensitivity() and
Appendix E
- new demos: demomous.c,
- all demos now distributed with executable file (.EXE)
- several new small files now distributed with TCHK (TCHK.ZDR,
BUG.DOC, etc.)

- iskey102() renamed to isEnhanceKbd()
- isNetwork() moved to network.h
- beep() moved to sound.h
- TRUE now defined as (!FALSE) in howard.h
- OEMinfo[] in struct BootBlock is now OEMinfo[8]. Previously
OEMinfo was defined as OEMinfo[9] with OEMinfo[8] as '\0'.
OEMinfo is no longer null terminated.
- several DESQview functions have been renamed to conform to
the naming conventions by Quarterdeck in their API toolkits.
DESQfreeCPU() has been renamed to DESQpause(), DESQMakeTone()
has been renamed to DESQsound(), DESQInternalStack() has been
renamed to DESQostack(), DESQProgramStack() has been renamed

TCHK 2.1 Page 30

to DESQustack(), and DESQdispchar() has been renamed to
- all menu functions command flags changed (STATICTEXT, etc.
have been renumbered), if you relink any of your existing
compiled code that uses TCHK menus you must recompile it too
- getEMSstatus() renamed to EMSGetStatus(), and type renamed
from byte to unsigned char
- getget() no longer supports justification in pattern. Use
flags field/#defines instead
- flags parameter in getget() changed from char (1 byte) to
unsigned int (2 bytes)
- getget() uses global variables _cursorinsert and
_cursoroverwrite to define the cursor size
- isdate() has been renamed to isvaliddate()
- all menu functions now handle DISABLED fields slightly
differently. Disabled fields are normally hiliteable unless
the flag DISABLENOHILITE is set. Note that this is exactly
opposite to previous operation. Changed for several reasons,
foremost clarity and this was how I originally intended it to
- totally removed the Lotus...() menu functions. They are not
currently worth the effort to recode, since the litebar...()
menu functions can be made to emulate Lotus-style menus, but
with much greater power. Currently, I plan on working on
other menu formats (pulldown, hierarchial). If you have any
particular types of menus, or specific enhancements to the
current menu functions, let me know. It's a lot easier to
make changes to code-in-progress than to alter existing
(released) code.

- ndp() works properly now. I was misaligning an instruction by
a byte. Oops
- #define bboolean was inadvertently left out of the Compiler
Defines in TURBOC.TC
- keyboard.h listed a prototype for a function inkeyscan().
There is no such function. It was under development, but did
not make it into the release and I forgot to remove it from
the header file

The manual has had several errors, typos and omissions corrected.

Version 2.0 - 12-3-88
Compiled with Turbo C 2.0
New functions:
- ansiback(), ansifore()
- DESQcommonmem(), DESQconvenmem(), DESQdispchar(), DESQexit(),
DESQexpandedmem(), DESQInternalStack(), DESQMakeTone(),
- DoubleDOSGetVirtual()
- EMSinfo(), EMSpages(), EMSwarmbootprep(), getEMSstatus()

TCHK 2.1 Page 31

- inkeyc()
- strclean(), strcapital(), strfill(), stroccur(),
strtocomma(), strwcmp(), strwicmp()
- cpu_id(), ndp_id() (ndp_id() is not 100% bug free yet)
- diskchanged()
- isBlogical(), isgameport(), iskey102()
- CapsLock(), InsLock(), NumLock(), ScrollLock()
- tocapkey()
- accum_dep(), depreciation(), double_decline_bal_dep(),
striaght_line_dep(), sum_year_digits_dep()
- FV(), FVa(), PMT(), PV(), PVa()
- average(), factorial(), stddev(), summation(), variance()
- frac(), round()
- expandfilespec(), fncmp(), getfilespec(), isdir(),
parsefilename(), parsefnameext()
- beep()
- boxwindow()
- isPM(), to24hour(), tohour()
- time_convert()
- getcursor(), setcursor()
- color()
- read_attrib(), read_char()
- settextinfo()
- endstri(), endstrp()
- pause()
- print_screen()
- isPRINTavail(), PRINTadd(), PRINThold(), PRINTpurge(),
PRINTremove(), PRINTresume()
- isAssignavail(), isAppendavail(), isShareavail(),
- getBootBlock(), getBPB()
- menu_popup(), popup_alloc(), popup_free(), popup_get()
- popup_restore(), popup_setcurrent(), pophilite(), popunlite()
- litebar_alloc(), litebar_free(), litebar_get()
- changelitebar(), litehilite(), litemessage(), liteunhilite()
- dosday(), doshour(), dosmonth(), dosmin(), dossec(),
dosyear(), todosdate(), todostime()
- mid(), sqr(), swap()
- fsgn(), isgn(), lsgn()
- framebox[], emptystring[], _dvmajor, _dvminor, _TCHKversion,
_TCHKmajor and _TCHKminor variables

- screen coordinates format now (x,y) starting at (1,1)
- atrim(), ltrim() and rtrim() now modify the string passed to
- box(), clear(), cls()
- ddatetolong() renamed to ddatetofull()
- EMMversion() modified
- getc_match(), getci_match() previously were getk_match() and
- virtually all get...() functions now use Borland's console
i/o routines

TCHK 2.1 Page 32

- gotoxy() renamed to gotohv()
- isBREAKon(), isVERIFYon(), setBREAK(), setVERIFY() are now

- delay() removed
- isleap() removed
- restore_box(), restore_screen(), save_box(), save_screen()
- max() and min() #defines removed (Borland now supplies them)

If I've missed a couple, forgive me. I think I got them all down,
but with all the changes and additions, it's hard to be 100% sure.

Note: The ndp(), menu_lotus() and lotus_setup() functions are not
fully implemented yet. The ndp() seems to crash the machine,
and I found something grievously wrong with the lotus
functions while testing the demo. Due to previous
commitments, I am forced to release the library with these
defective functions. Look for the working versions in the
next release.

Version 1.5 - Internal release only

Version 1.0 - Internal release only

Version 0.70 - 2-17-88
New functions:
- date_convert()
- machine_id()
- fname_match()
I rewrote the License agreement after several conversations with
Robert Blacher. He pointed out, rightly so, that the old
licensing information was a bit confusing.
Fixed a bug in shorttoddate() and fulltoddate(). These functions
required a proper month abbreviation. If you had "Mau 12,
1987" instead of "May 12, 1987" it would get stuck in an
endless loop.
Fixed a bug in some of the date conversion functions. A few
functions refer to a list of the day number at the end of a
month. This list (daylist[] in this version) listed Jun 30 as
the 182nd day of the year instead of the 181st day of the
year. The only inaccurate dates would be those occurring
between July 1 and July 30, inclusive, and these would only
be ahead by 1 day. Only those date functions with english in
them (shorttoddate(), ddatetofull(), etc.) are affected.

TCHK 2.1 Page 33

Found the proper way to check for DESQview. DESQversion() now
returns the version of DESQview in the high and low order
bytes. See DESQversion() for more details.
Changed the #define BASE_JUL_YR to a double to prevent loss of
significant digits warning message.
Restructured the global variables. With version 0.70, most
of the global variables are declared separately from the code
itself. If you use, say, Months[], but nothing else, only
Months[] will get linked in to your program instead of
pulling a whole bunch of functions with it. When I get TC 1.5
I hope to break up the functions even more.
Added MonthAbbr[] and DayList[] global variables
Fixed the disktype() function. It would plain not work. It would
get a word and return a byte (the wrong byte, of course.) God
curse all typos.
Changed the DemoDisk sample program as well (no more DISK_ERROR,
now it's DISK_INVALID. See the #define section for more
Expanded the list of Rom id bytes. See the #define section for
more details.
Cleaned up some typos in the documentation.

Version 0.60 - 1-15-88
Over 30 new functions added:
- Cal...(), Greg...(), Jul...(), fulltoddate(), shorttoddate()
- dayofweek()
- isBREAKon(), setBREAK()
- isVERIFYon(), setVERIFY()
- reboot()
- isExtended(), Extendedtotal(), EMMversion()
- isNetwork()
- memory_strategy()
- disktype()
- set_handles()
- DESQversion(), DESQfreeCPU()
- isDoubleDOS(), DoubleDOSTaskSwitch(), DoubleDOSfreeCPU()
- scrbuff()
- cursor_blink()
- ansi_call()
Fixed a bug in isleapyear(). Previously, isleapyear() would
determine years ending in 00 that were evenly divisible by 4
to be leap years (i.e. 1600). The gregorian calendar (you
know, 30 days hath September...) doesn't count those as leap
Optimized the direct video access routines as well as possible
using 100% C code. Previously they checked for vertical
retrace. Now all direct accesses play with the video
registers and other fun things, basically turning off the
screen for a fraction of a second, performing the access,
then turning the screen back on again. In the longer access
functions (save_screen() to name one) I found changing 30
bytes between screen blankings to be optimal. These changes

TCHK 2.1 Page 34

have sped up the direct video access functions (putsay(),
save_...(), restore_...()) by a factor or 3! These functions
now take 1/3 the time they used to. If you find the screen to
blink, or that there is snow (putsay() may experience
miniscule snow when outputting long strings) please let me
know and I'll see what I can do.

Version 0.50 - 11-18-87
Initial release of TCHK

TCHK 2.1 Page 35


There are more functions on the way. If you have any favorites you
would like to see, or need, drop me a line. In future releases,
look for the following features:

- I'd hoped to have a family of functions to access dBASE
files (.DBF and .NDX) ready for this version, but due to
time constraints and the enormous complexity of index
files, I decided to get this version out the door and
smooth out some of the rough spots in the code I have.
Look for the dBASE file functions in the next release of
- enhancement of the get and put routines to support all
features found in the @...SAY...GET commands of dBase III+
- keyboard routines using scan codes
- more menu interfaces (pulldown, hierarchial)
- more EMS functions. Since I recently acquired an EMS card,
I can do more experimenting. I'd like to have a set of
functions to access EMS as if it were dynamic memory
(xmalloc(), xcalloc(), xfree(), etc.) but doing it right
can be tricky. We shall see...
- functions to access XMS (non-EMS memory above 640K on
286/386 machines). When dynamic EMS access is implemented,
I will try to have equivalent XMS functions
- several math functions (integration, numerical methods, +)
- some more accounting functions to have a well rounded
accounting library
- software id functions (TSR, ANSI.SYS, VDISK.SYS, etc.)
- more mouse functions
- more DESQview functions
- more sound functions
- expansion of the functions dealing with simulated reals
(more precision, more functions, etc.)
- direct screen accesses coded in assembler
- enhancement of the put routines to support the 'backslash'
control characters like printf does (\n, \t, etc.)
- some more video routines

Here's some ideas I've had regarding TCHK. Let me know what you

- Laser Printers
I use OfficeWriter 5.0 for the documentation and several
laser printers are supported, but I don't have access to a
laser printer so I'm not sure which one to support.
Currently, registered users receive a disk version of the
manual formatted for an HP LaserJet. Is this the best one
to support? What font? Etc.

- Norton Guides
Converting the documentation to a Norton Guide is a LOT of
work. NG is an excellent tool, but do the benefits (having

TCHK 2.1 Page 36

a Guide for TCHK) outweigh the disadvantages (time
needed) ? Are people out there using NG? Are you
interested in a NG database for TCHK?

- 286 Libraries
- Turbo C can generate 80186/80286 code. Are people
interested in 286 generated code?

- Menu Generator
- I'd like to write a program that lets you 'paint' menus,
and then let the program chug through and generate all the
code (variables, function calls, etc.). Right now most of
the menu work is drudge work, where you have to code all
the coordinates, the commands, etc. I don't know about
you, but I hate drudge work. However, this is no small
undertaking. Are you interested in such a program?

And the big question: what other compilers will I support?
The major contenders right now are Turbo C, MSC, Quick C, Watcom
C, Zortech C++ and Power C (I think I got all the popular ones).
Power C is intended for the inexpensive C programmer (at a list
price of $20, it can't be beat. The manual alone is worth it...)
Zortech has a very promising compiler, and the price is right. I'm
awaiting their next significant release, or user requests, before
looking further. Although supposedly the best micro C compiler
available, Watcom's price and lack of market penetration makes a
shareware Watcom library impractical at this time. Currently, I
have no plans to support any of these compilers. Are you
interested? Let me know...

Of course, we now have the big three. I purchased Turbo C
when it first came out (1.0) and I've been very pleased ever
since. The price is good, and the performance is top notch. I'm
aware that many users would like MSC and QC compatible libraries.
This has 2 major problems: I do not own either compiler, and
certain conventions are different. I've toyed with Quick C 2.0 and
it shows promise. However, I can't afford to buy it and hope
someone likes QCHK (TCHK for Quick C). Aside from the money, it's
a question of time. For me, this is a hobby. A serious hobby, but
still a hobby (lord knows I'm not in it for the money). Although
most of the code for TCHK is ANSI C, enough is Turbo C specific
(i.e. pseudo registers, console i/o, many structures, etc.) that
just converting to another compiler would take a good chunk of
time. Let's not forget the learning curve needed to get the hang
of the new compiler's syntax. Right now I think enhancing the
existing library is more productive than producing libraries for
other compilers.

Am I wrong? I've only had 2 people ask me about MSC/QC
versions of TCHK, and one of them purchased the source code with
plans to convert it himself. Like I said, converting most of the
code is just a matter of recompiling. However, if I were to offer

TCHK 2.1 Page 37

other compiler versions I would have to convert all the code,
which is just not practical right now. If you want to use TCHK
with another compiler, you can always purchase the source code.
It's not expensive, and most of the changes would be simple
renames of function calls. If you would like to see a version of
TCHK for another compiler, let me know. If I think people are
interested, I'll give it a shot.

Last minute rumors: the next version of Turbo C will NOT generate
80386 code, is highly unlikely to support overlays, and OS/2 is a
very popular phrase with Borland. What does this mean? A special
386 version of TCHK will not be available in the forseeable future
(don't blame me, blame Borland). As for the rest, only time will

TCHK 2.1 Page 38


I am also the author of the following products:

COOKIE 1.2 - Fortune cookie, gives you a random fortune from a
cookie file. Lots of options and distributed with
2800 cookies of mixed content (rated G - X)

DCOUNT 1.2 - Document/Text file info, find out all kinds of
information like # words, lines, pages, control
characters, etc. A small program, but it suited a
small need. Several options.

FREE 1.7 - Free disk space, with options. Network compatbile,
search multiple drives, DESQview friendly + more.
Distributed with full Turbo C source.

SF 3.32 - Subtree Find, a powerful directory searcher. SF's
main claim to fame is being able to search a branch
of a disk directory, from a single directory to an
entire disk, 5%-250% faster than the leading file
finders! (Compared with Norton's and Graham's
programs). Other features include displaying more
information than DIR (attributes, disk space used,
etc.), delete files, touch date and/or time, modify
attributes, color output, pause during display,
permanently configure options, search inside .ARC
and .ZIP files, network compatible, and much much
more. Written in Turbo C 2.0 and linked with TCHK

TCHK 2.1 Page 39


Thanks to the graciousness of the sysops at The BOSS and Computer
Connections, I have easier access to their BBSes. The latest
versions of my software can be found there. However, due to
current PC Pursuit restrictions, I am unable to reach The BOSS via
PCP. As a result, I can quite often be found on Computer
Connections, but only infrequently at The BOSS. Hopefully, Telenet
will implement better 201 access before the turn of the century
and I will be back on The BOSS on a regular basis.

If there are some features you would like to see implemented, or
you have any questions or comments, please contact me. I can be
reached at the following:

Howard Kapustein
1695 Barbara Lane
East Meadow, NY 11554
Phone: (516) 481-9612

*** If I have to call you I'll have to call collect ***

or at the following electronic services/bulletin boards:

The Boss dBBS (201) 568-7293 *** Support BBS ***
Software Society (201) 729-7410 Distribution BBS
Computer Connection (202) 547-2008 *** Support BBS ***
The Tool Shop (602) 279-2673 Distribution BBS
GEnie H. Kapustein
Also: IBM RT, SET 4, TOPIC # 25
Borland RT, SET 2, TOPIC # 55

These are the places I can be reached by modem. TCHK (and all
other software I release) is supported through The BOSS and
Computer Connections.

TCHK 2.1 Page 40


The following date formats are supported by TCHK:

TCHK Reference Date Type Format
-------------- --------- ------
Greg Gregorian (US) MM-DD-YY
GregEuro Gregorian (European) DD-MM-YY
GregJap Gregorian (Japan) YY-MM-DD
Cal Calendar YYMMDD
CalCent Calendar (w/Century) YYYYMMDD
Jul Julian (Type E) special hashed number
JulA Julian (Type A) YYDDD
JulB Julian (Type B) YYYYDDD
full English (Full) Month DD, YYYY
short English (Short) Mon DD, YYYY
ddate struct ddate see datehk.h

- Gregorian units are common shorthand dates (in string format)
with all leading zeros preserved
- Calendar units are numeric representations (double)
- Julian Type E is a special "magic" hashed number (double)
representing the number of elapsed days since an initial date.
Julian Type E numbers are valid for the years 1900-2100 (give
or take a couple of months)
- Julian Type A and B are ANSI defined formats (double)
containing year (and century for type B) and the day of the
- full are strings of the date with the full name of the month
- short are strings of the date with the short abbreviation of
the month
- ddate is my own date structure defined in datehk.h

In some instances date formats not specifically designed to hold
the century may overflow. For example, converting CalCent
formatted 20220401 (April 1, 2022) to Greg (MM-DD-YY) would
result in the string "04-01-122". Be aware.

! ! ! WARNING ! ! !

Unless otherwise specified, date format conversion functions
(GregtoCal, JulAtoddate, etc.) do NOT perform error checking. If
you pass an invalid date (March 32, 1988) your result may be
logically incorrect even though syntactically correct (Gregorian
date of 03/32/88) or be totally corrupted.

Julian Type E numbers are valid for the years 1900-2100 (give or
take a couple of months.)

TCHK 2.1 Page 41

APPENDIX B - date_convert() FORMATS

The following formats are supported by date_convert():

Type (id) Data Type Format Notes
--------- --------- ------ -----
1 char MM-DD-YY US
2 " DD-MM-YY Europe
3 " YY-MM-DD Japan

4 double YYMMDD Calendar
5 " YYYYMMDD " w/cent
6 " hashed Julian Type E
7 " YYDDD " Type A
8 " YYYYDDD " Type B

9 struct date see dos.h
10 struct ddate see datehk.h

11 char Mon DD, YYYY short, no lead 0
12 " Month DD, YYYY full, no lead 0

13 " MM/DD/YY US
14 " DD/MM/YY Europe
15 " YY/MM/DD Japan

16 " MM-DD-YY no lead 0
17 " DD-MM-YY "
18 " YY-MM-DD "

19 " MM/DD/YY no lead 0
20 " DD/MM/YY "
21 " YY/MM/DD "

22 " MM-DD-YYYY century
23 " DD-MM-YYYY "
24 " YYYY-MM-DD "

25 " MM/DD/YYYY century
26 " DD/MM/YYYY "
27 " YYYY/MM/DD "

28 " MM-DD-YYYY century, no lead 0
29 " DD-MM-YYYY "
30 " YYYY-MM-DD "

31 " MM/DD/YYYY century, no lead 0
32 " DD/MM/YYYY "
33 " YYYY/MM/DD "

34 char DD-MON-YY
35 " DD-MON-YY no lead 0

TCHK 2.1 Page 42

36 " DD-MON-YYYY century
37 " DD-MON-YYYY " no lead 0

38 " Mon DD, YYYY short
39 " Month DD, YYYY full

40 " DD MON YY
41 " DD MON YY no lead 0
42 " DD MON YYYY century
43 " DD MON YYYY " no lead 0

Unless otherwise specified, a date format contains leading zeros.

Refer to date_convert() for further specifications.

TCHK 2.1 Page 43

APPENDIX C - time_convert() FORMATS

The following formats are supported by time_convert():

Type (id) Data Type Format Notes
--------- --------- ------ -----
1 char HH:MM AM 12-hour (h,m)
2 " HH:MM 24-hour (h,m)
3 " HH:MM:SS AM 12-hour (h,m,s)
4 " HH:MM:SS 24-hour (h,m,s)
5 " HH:MM:SS:CC AM 12-hour (h,m,s,u)
6 " HH:MM:SS:CC 24-hour (h,m,s,u)

7 struct time see dos.h

8 double 1/100 seconds
9 " seconds
10 " minutes
11 " hours
12 " days

13 char HHhMMm no leading zeros
14 " HHhMMmSSs no leading zeros
15 " HHhMMmSSsCCc no leading zeros

16 " 0HH:MM AM 12-hour (0h,m)
17 " 0HH:MM 24-hour (0h,m)
18 " 0HH:MM:SS AM 12-hour (0h,m,s)
19 " 0HH:MM:SS 24-hour (0h,m,s)
20 " 0HH:MM:SS:CC AM 12-hour (0h,m,s,u)
21 " 0HH:MM:SS:CC 24-hour (0h,m,s,u)

22 " 0HHhMMm all leading zeros
23 " 0HHhMMmSSs all leading zeros
24 " 0HHhMMmSSsCCc all leading zeros

The notation H:M:S:C stands for hours:minutes:seconds:centiseconds
(1/100 secs). The notation AM stands for AM or PM, as is

Unless otherwise specified, a time string contains leading zeros
for all values except the hour. The notation 0H stands for hours
containing leading zeros.

Refer to time_convert() for further specifications.

TCHK 2.1 Page 44


When I was working on my Free disk space program, I could not get
it to link as a Tiny program, no matter what I did. Even if I
compiled it with the Small memory model, it would not run without
65K RAM available. After exhaustive testing, I realized what the
problem was: I was trying to link in Borland's FP Emulation. If
you use FP Emulation, you will NOT be able to generate a .COM
file. This was a significant problem. Who wants a free disk space
program requiring 65K?

Unfortunately, I had but two options: leave out all real math,
which was totally unacceptable, or write my own FP functions. With
great trepidation I wrote a division function which more than fit
my needs. The real division found in the source distributed with
my free program is far simpler than the rdiv() function in TCHK,
fulfilling a far simpler need.

Consider yourself warned right now. My real functions are NOT a
complete substitute for Borland's FP Emulation library. However,
if you only need accuracy up to 8 decimal places for numbers with
integer portions less than 2 billion and change, or plan on using
the Tiny memory model, they are acceptable.

A REAL number is defined as:

typedef struct REAL {
long rint; /* real - integer */
long rfrac; /* real - fraction */
int precision; /* (# of decimal places) */

A picture is worth a thousand words, so here are some sample REALs
and the real numbers they represent:

{ 402, 17, 2 } = 402.17
{ 12, 2, 3 } = 12.002
{ 0, 0, 0 } = 0.0
{ -8356, 286, 3 } = -8356.286
{ 0, -3, 1 } = -0.3

REALs obey certain rules:

Sign: If rint is non-zero, it will contain the sign of the
REAL and rfrac will be positive. If rint is zero,
rfrac will contain the sign of the REAL

Precision: always ranging from 0 to MAXPRECISION, it will
NEVER be negative

Decimal: the decimal portion of a REAL is always represented
as a value displayed to the right of the decimal

TCHK 2.1 Page 45

point. For instance, { 3, 6, 4 } is the REAL
representation of 3.0006, which could also be
expressed as { 3, 0006, 4 }. Note that a long with
a value of 0006 is the same as a long with a value
of 6. It is only because longs are used to store
the value of REALs that the precision plays such a
crucial role

To calculate the value of a REAL, use the following formula:

value = rint + rfrac * 10^(-precision)

which is read as "value equals rint plus rfrac times ten raised to
the negative precision power".

Error trapping for such things as division by zero, overflow,
underflow, etc. as listed in REAL.H is provided.

Planned for some future release is a facility for a user-defined
rmatherr() function, much like Borland's facility for a user-
-defined matherr(), and a method of handling larger (> LONG_MAX)
numbers, probably through the use of negative precision values.
Perhaps at an even later date there will be a true set of real
math functions, done the right way with mantissas and exponents
via bit encoding. This would require a significant amount of
effort, since I would basically be rewriting Borland's EMU.LIB, so
don't get your hopes up too high. With sufficient user response or
personal need, I may give it a shot. However, due to the great
complexity of such a project, you will understand if I don't rush
right out and whip up said emulation functions.

TCHK 2.1 Page 46


A mickey is the smallest increment the mouse can sense, named,
appropriately enough, after Mickey Mouse.

Many of the mouse functions return multiple pieces of information.
The mouse driver can use the AX, BX, CX and DX registers to return
information, but repeating a function call to return another piece
of information already provided is ridiculous. If used, the global
variables _mouse1, _mouse2, _mouse3 and _mouse4 will usually, but
not always, correspond to the AX, BX, CX and DX registers,
respectively. MButtonPress() is an example of a mouse function
that returns extra information via the _mouse# variables.
MMickeysMovedx() is an example of a function that does the work of
multiple functions via the _mouse# variables.

The MCursorGraphic() function requires a pointer to a bitmap,
which consists of a 16 word screen mask and a 16 word cursor mask
(64 bytes in total). The global variables listed below are bitmaps
available for your use, listed here for you reference. Each global
variable bitmap contains the horizontal and vertical hot spots
(hotx and hoty) as _Bitmap...[0] and _Bitmap...[1] elements,
respectively, and _Bitmap...+2 pointing to the bitmap itself.
Thus, each of these global variables is 68 bytes, 4 for hot spots
and 64 for the bitmap. Note that the hot spots are signed values
ranging from -16 to 16.

unsigned int _Bitmap_StandardCursor[] =
{ (unsigned int) -1, (unsigned int) -1,
0x3FFF, 0x1FFF, 0x0FFF, 0x07FF,
0x03FF, 0x01FF, 0x00FF, 0x007F,
0x003F, 0x001F, 0x01FF, 0x10FF,
0x30FF, 0xF87F, 0xF87F, 0xFC3F,
0x0000, 0x4000, 0x6000, 0x7000,
0x7800, 0x7C00, 0x7E00, 0x7F00,
0x7F80, 0x78C0, 0x7C00, 0x4600,
0x0600, 0x0300, 0x0300, 0x0180 };

unsigned int _Bitmap_UpArrow[] =
{ (unsigned int) 5, (unsigned int) 0,
0xF9FF, 0xF0FF, 0xE07F, 0xE07F,
0xC03F, 0x801F, 0x801F, 0x000F,
0x000F, 0x000F, 0xF0FF, 0xF0FF,
0xF0FF, 0xF0FF, 0xF0FF, 0xF0FF,
0x0000, 0x0600, 0x0F00, 0x0F00,
0x1F80, 0x1F80, 0x3FC0, 0x3FC0,
0x7FE0, 0x0600, 0x0600, 0x0600,
0x0600, 0x0600, 0x0600, 0x0000 };

TCHK 2.1 Page 47

unsigned int _Bitmap_LeftArrow[] =
{ (unsigned int) 0, (unsigned int) 3,
0xFE1F, 0xF01F, 0x0000, 0x0000,
0x0000, 0xF01F, 0xFE1F, 0xFFFF,
0x0000, 0x00C0, 0x07C0, 0x7FFE,
0x07C0, 0x00C0, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000 };

unsigned int _Bitmap_CheckMark[] =
{ (unsigned int) 6, (unsigned int) 7,
0xFFF0, 0xFFE0, 0xFFC0, 0xFF81,
0xFF03, 0x0607, 0x000F, 0x001F,
0xC03F, 0xF07F, 0xFFFF, 0xFFFF,
0x0000, 0x0006, 0x000C, 0x0018,
0x0030, 0x0060, 0x70C0, 0x1D80,
0x0700, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000 };

unsigned int _Bitmap_PointingHand[] =
{ (unsigned int) 5, (unsigned int) 0,
0xE1FF, 0xE1FF, 0xE1FF, 0xE1FF,
0xE1FF, 0xE000, 0xE000, 0xE000,
0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000,
0x1E00, 0x1200, 0x1200, 0x1200,
0x1200, 0x13FF, 0x1249, 0x1249,
0xF249, 0x9001, 0x9001, 0x9001,
0x8001, 0x8001, 0x8001, 0xFFFF };

unsigned int _Bitmap_DiagonalCross[] =
{ (unsigned int) 7, (unsigned int) 4,
0x07E0, 0x0180, 0x0000, 0xC003,
0xF00F, 0xC003, 0x0000, 0x0180,
0x07E0, 0xFFFF, 0xFFFF, 0xFFFF,
0x0000, 0x700E, 0x1C38, 0x0660,
0x03C0, 0x0660, 0x1C38, 0x700E,
0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000 };

unsigned int _Bitmap_RectangularCross[] =
{ (unsigned int) 7, (unsigned int) 4,
0xFC3F, 0xFC3F, 0xFC3F, 0x0000,
0x0000, 0x0000, 0xFC3F, 0xFC3F,
0xFC3F, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0180, 0x0180, 0x0180,
0x7FFE, 0x0180, 0x0180, 0x0180,
0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000 };

TCHK 2.1 Page 48

unsigned int _Bitmap_Hourglass[] =
{ (unsigned int) 7, (unsigned int) 7,
0x0000, 0x0000, 0x0000, 0x0000,
0x8001, 0xC003, 0xE007, 0xF00F,
0xE007, 0xC003, 0x8001, 0x0000,
0x0000, 0x0000, 0x0000, 0xFFFF,
0x0000, 0x7FFE, 0x6006, 0x300C,
0x1818, 0x0C30, 0x0660, 0x03C0,
0x0660, 0x0C30, 0x1998, 0x33CC,
0x67E6, 0x7FFE, 0x0000, 0x0000 };

TCHK 2.1 Page 49


This page intentionally left blank

TCHK 2.1 Page 50

Quick Registration for TCHK Version 2.1 TCHK210/BBS

Please answer as many questions as possible and return this form with
your registration cash, check or money order to :

Howard Kapustein
1695 Barbara Lane
East Meadow, NY 11554
Phone: (516) 481-9612

Name ____________________________________ Sex _________ Age _________

Address _______________________________________________________________




Phone (_____)_____-______ Occupation _________________________________

Type of computer(s) you own ___________________________________________

Operating System (circle): DOS DESQview Windows OS/2 Unix Other

Operating System version ______ DOS version (if OpSys not DOS) _____

Type of modem you own (if any) ______________________ Max Speed _______

Where did you get TCHK 2.1 from:

BBS Name ________________________________ Number (_____)_____-______

Other electronic service (Compuserve, GEnie, etc.) _________________

Other ______________________________________________________________

Are you a SYSOP or CO-SYSOP (circle) NO - YES ________________________

How would you rate TCHK (circle) 1 - 2 - 3 - 4 - 5
Excellent Garbage

____ TCHK Registration ......................... @ $ 20.00 ea $ _______
(Includes latest version of program diskette, with
all memory models and documentation on the disk.)

____ TCHK Source Code .......................... @ $ 40.00 ea $ _______

____ TCHK Registration and Source Code.......... @ $ 55.00 ea $ _______
(As above with source code.)

____ TCHK Sampler Disk ......................... @ $ 10.00 ea $ _______
(Does NOT include registration)

Non-US Shipping ...............................@ $ 5.00 $ _______
(Payments must be in US Dollars, US bank)

TOTAL Enclosed ......................................... $ ____________

Non-U.S. orders need to include $5.00 extra to cover additional
shipping and handling charges. Checks and money orders must be
drawn on a U.S. bank. Please send all payments payable in U.S. Dollars

TCHK 2.1 Page 51

------------------------- User comments --------------------------------

I would also appreciate any input you would care to give concerning
TCHK. If you have any ideas or comments that would make TCHK a better
program, then please let me know.

What features do you find most useful:





What features do you find least useful:





Features you would like to see added (use additional pages, if necessary):






THANK YOU for supporting Shareware and TCHK

TCHK 2.1 Page 52


This page intentionally left blank

TCHK 2.1 Page 53

Bug Report for TCHK Version 2.1 TCHK210/BBS

Please use the following form to report any bugs or discrepancies
you find with TCHK 2.1.

Please take the time to fill out as much information in the following
form as possible. I know it's a lot, but it helps if I know what the
system looked like when the error occurred. At the minimum, make sure
you fill in your name, address, TCHK serial number, operating system
(with version!), compiler, and the list of any TSRs, device drivers,
or anything else in memory when the error occurred.

Return this form, and any necessary additional papers to:

Howard Kapustein
1695 Barbara Lane
East Meadow, NY 11554
Phone: (516) 481-9612

Name ____________________________________ TCHK Serial # ______________

Address _______________________________________________________________




Phone (_____)_____-______

Please describe the system you found the error on in as much detail as
possible. This will help me to determine the exact nature of the error:

Computer Model ________________________________________________________

Cpu (circle): 8086/8088 V20/V30 80186 80286 80386 Other _________

Cpu speed: __________MHz

Math Coprocessor (circle): None 8087 80287 80387 Other ___________

Memory: Conventional _____K EMS/EEMS _____K Extended (>640K) _____K

If EMS/EEMS: Product _________________________________________________

Product manufacturer ____________________________________

Which (circle): EMS EEMS Version: _______________

TCHK 2.1 Page 54

Video Adapter (circle): MDA Hercules CGA EGA VGA 8514 Other_____

Drive letter _____ Size __________ Brand/Model ___________________

Type (circle): 5.25" Floppy 3.5" Floppy Hard drive Other _______

Drive letter _____ Size __________ Brand/Model ___________________

Type (circle): 5.25" Floppy 3.5" Floppy Hard drive Other _______

Drive letter _____ Size __________ Brand/Model ___________________

Type (circle): 5.25" Floppy 3.5" Floppy Hard drive Other _______

# Serial ports ____ # Parallel ports ____ Joystick (circle): Yes No

Operating System (circle): DOS DESQview Windows OS/2 Unix Other

Operating System version ______ DOS version (if OpSys not DOS) _____

Compiler (circle): Turbo C 1.5 Turbo C 2.0 Other _________________

TSRs, device drivers, or any other memory resident software:





TCHK 2.1 Page 55

--------------------------- Bug report ---------------------------------

Please list the steps necessary for me to discover and duplicate
the error. Try to be as explicit as possible when detailing the
steps leading to the problem. Include any screen dumps, file lists,
source code, or other information necessary. Use additional pages
if necessary:




















THANK YOU for supporting Shareware and TCHK

TCHK 2.1 Page 56


_cursorinsert 24, 30
_cursoroverwrite 24, 30
_dvmajor 25, 31
_dvminor 25, 31
_mouse1 25, 46
_mouse2 25, 46
_mouse3 25, 46
_mouse4 25, 46
_rmatherror 25
_rmexcep 20
_r_maximum 25
_r_maxpre 25
_r_minpre 25
_shadowchar 27
_shadowcolor 27
_shadowstyle 27
_TCHK 26, 31
_TCHKdate 26
_TCHKmajor 26, 31
_TCHKminor 26, 31
_TCHKversion 26, 31
_TCmajor 15
_TCminor 15
_ZIPmajor 23
_ZIPminor 23

Accum_dep 15, 31
Ansiback 30
Ansifore 30
Ansi_call 33
Atrim 31
Average 31

Bboolean 12, 23, 30
Beep 20, 29, 31
Bitrevb 28
Bitrevl 28
Bitrevw 28
Box 9, 11, 29, 31, 32
Boxwindow 29, 31

TCHK 2.1 Page 57

Cal... 33
CapsLock 31
CEDadd 28
CEDremove 28
Center 15, 28
Changelitebar 31
Char_attribute 26
Checksum_block 28
Clear 31
Cls 31
Color 7, 8, 12, 25, 26, 31, 38
Commit 28, 32
Compaq386GetCpuSpeed 29
Compaq386GetCpuSpeed 29
Compaq386KbdType 29
CompaqExternalMonitorType 29
CompaqGetMasterMode 29
CompaqGetMonitor 29
CompaqInternalMonitorType 29
CompaqModeSwitchDelay 29
CompaqSelectMonitor 29
CompaqSetMasterMode 29
Cpu_id 12, 31
CRC16tupdate 28
CRC16update 28
CRC16_block 28
CRC32tupdate 28
Cursor_blink 33

Date_convert 32, 41, 42
Daylist 24, 32, 33
Dayofweek 33
Ddatetofull 31, 32
DDB 15
Depreciation 31
DESQapilevel 28
DESQappnum 28
DESQbeginc 28
DESQcommonmem 30
DESQconvenmem 30

TCHK 2.1 Page 58

DESQdisperror 28
DESQendc 28
DESQexit 30
DESQexpandedmem 30
DESQgetbuf 28
DESQgetmem 28
DESQiskmouse 28
DESQjustify 28
DESQkmouse_off 28
DESQkmouse_on 28
DESQostack 29
DESQpause 29
DESQpoke 30
DESQposttask 28
DESQpushkey 28
DESQputmem 28
DESQsound 29
DESQstart 28
DESQstop 28
DESQustack 30
DESQversion 33
Diskchanged 31
Disktype 8, 33
Dosday 31
Doshour 31
Dosmin 31
Dosmonth 31
Dossec 31
Dostimetolong 28
Dosyear 31
DoubleDOSfreeCPU 33
DoubleDOSGetVirtual 30
DoubleDOSTaskSwitch 33
Double_decline_bal_dep 15, 31
DVFREESLICE 16, 19, 29

EMMversion 31, 33
Emptystring 26, 31
EMSGetStatus 30
EMSinfo 30
EMSpages 30
EMSwarmbootprep 30
Endstri 31
Endstrp 31
EQU 15

TCHK 2.1 Page 59

Expandfilespec 31
Extendedtotal 33

Factorial 31
Fileexist 28
Fname_match 32
Fncmp 31
Frac 31, 33, 44
Fsgn 31
Fulltoddate 32, 33
FV 31
FVa 31

GetAssignmemseg 28
GetBootBlock 28, 31
GetBootBlock4 28
GetBPB 31
Getci_match 31
Getcursor 31
Getc_match 31
Getfilespec 31
Getget 16, 24, 29, 30
Getk 24, 31
Getpw 28
Getstr 24
GetTypePointDevice 29
GetVolSerialNum 28
Gotohv 32
Greg... 33


Initkeyvars 28
Inkey 30, 31
Inkeyc 31
Insertmode 16, 24
InsLock 31
Is2nd8259 28
Isallalpha 28
Isallalphanum 28

TCHK 2.1 Page 60

Isalllower 28
Isallupper 28
IsAnarkey 29
IsAppendavail 31
IsAssignavail 31
IsAutoPark 28
IsBlogical 31
IsBREAKon 32, 33
Iscdevicemoderaw 28
IsCEDavail 28
Isdate 28, 30
Isdir 31
IsDoubleDOS 28, 33
Isdrivelocal 28
IsDriverSys 29
IsEnhanceKbd 29
Iseven 28
IsExtended 33
Isfilename 28
Isgameport 31
Isgn 31
Ishandlelocal 28
IsHiliteable 28
IsInvisible 28
Isleapyear 13, 33
IsMCA 28
Ismouse 29
IsNetwork 29, 33
IsNLSFuncCom 29
IsNovellNetavail 28
Isodd 28
Ispathname 28
IspcAnywhere 28
IsPM 31
IsPRINTavail 31
Isrealtimeclock 28
IsRedirectStdin 28
IsRedirectStdout 28
Isremoveable 28
IsScrnSav2 28
IsShareavail 31
Isstate 28
IsVERIFYon 32, 33
IsVidclock 31
IsWhoa 29
Iswildcarded 28
IsXMSinstalled 28
Iszip 28


TCHK 2.1 Page 61

JoystickAx 28
JoystickAy 28
JoystickBx 28
JoystickBy 28
Joysticksettings 28
Jul... 33

Keyclick 28
Key_extended 24
Key_status 24

Litebarerrno 25
Litebar_alloc 31
Litebar_free 31
Litebar_get 31
Litehilite 31
Litemessage 31
Longtodostime 28
Lpow 28
Lsgn 31
Ltrim 31

Machine_id 32
MAXLONG 17, 21
MButtonPress 29, 46
MButtonRelease 29
MButtonStatus 29
MCursorGraphic 29, 46
MCursorOff 29
MCursorOn 29
MCursorRangex 29
MCursorRangey 29
MCursorText 29
MDriverSize 29
Memory_strategy 33
MEmulateLightpenOff 29

TCHK 2.1 Page 62

MEmulateLightpenOn 29
Menu_litebar 29
Menu_popup 31
MGetDisplayPage 29
MGetDriver 29
MGetSensitivity 29
MGetVerType 29
MGotoxy 29
Mid 19, 31
MMickeysMovedx 29, 46
MMickeysMovedy 29
MODE 9, 21
MouseReset 29
MPutDriver 29
MSetDisplayPage 29
MSetRatio 29
MSetSensitivity 29
MSetThreshold 29
MUpdateScreen 29

Ndp_id 12, 31
NEQ 15
NextZIPlocal 23
Nmid 28
NumLock 31

Parsefilename 31
Parsefnameext 31
Pause 31, 38
PI 17
PMT 31
Pophilite 31
Popunlite 31
Popuperrno 25
Popup_alloc 31
Popup_free 31
Popup_get 31
Popup_restore 31
Popup_setcurrent 31
PRINTadd 31

TCHK 2.1 Page 63

PRINThold 31
PRINTpurge 31
PRINTremove 31
PRINTresume 31
Print_screen 31
Putsay 34
Putstr 26
PV 31
PVa 31


Radd 28
Rceil 28
Rdiv 20, 28, 44
Read_attrib 31
Read_char 31
Reboot 8, 10, 33
ResetPointDevice 29
Resolvepath 28
Rfloor 28
Rnegate 28
Rnormalize 28
Round 31, 35
Rsign 28
Rsub 28
Rtrim 31

Scrbuff 33
ScrollLock 31
SetAutoPark 28
SetBREAK 32, 33
Setcdevicemoderaw 28
Setcursor 31
SetpcAnywhere 28
SetPointDevice 29
SetRatePointDevice 29
SetResPointDevice 29
Settextinfo 31
SetVERIFY 32, 33
SetWhoa 29
Set_color 26
Set_handles 33

TCHK 2.1 Page 64

Shadow 21, 22, 27, 28
SHADOW_B 21, 22, 27
SHADOW_BL 21, 22
SHADOW_BR 21, 22, 27
SHADOW_L 21, 22
SHADOW_R 21, 22, 27
SHADOW_T 21, 22
SHADOW_TL 21, 22
SHADOW_TR 21, 22
Shorttoddate 32, 33
SLD 15
Soundex 28
Sqr 17, 31
SQRT2 17
Stateindex 28
StateName 25
StateName 25
States 25
Stddev 31
Straight_line_dep 15
Strcapital 31
Strclean 31
Strfill 31
Stroccur 31
Strpadleft 28
Strpadright 28
Strspace2tab 28
Strtabexpand 28
Strtocomma 31
Struct BIOSParmBlock 13, 14
Struct BootBlock 14, 23, 29
Struct BootBlock4 14, 23
Struct ddate 13, 23, 40, 41
Struct DESQmemory 20, 23
Struct EMSrecord 15, 23
Struct filespec 14, 23
Struct fnameext 14, 23
Struct keylist 18, 23
Struct litebar_field 18, 23
Struct litebar_header 18, 23
Struct popup_field 17, 23
Struct popup_header 17, 23
Struct REAL 20, 44
Struct ZIP_central_record 22, 23
Struct ZIP_end_central_record 22, 23
Struct ZIP_local_header 22, 23
Strwcmp 31
Strwicmp 31

TCHK 2.1 Page 65

Summation 31
Sum_year_digits_dep 15, 31
Swap 31
SYD 15

Time_convert 31, 43
To24hour 31
Tocapkey 31
Todosdate 31
Todostime 31
Tohour 31
Tone 21, 28

UDFIDLE 16, 19
UninstallWhoa 29

Variance 31
VIDEO 7, 9, 21



ZipMax 26
ZipMin 26
ZIPSignatureCentral 23
ZIPSignatureEndCentral 23
ZIPSignatureLocal 23
ZIPversion 23

  3 Responses to “Category : C Source Code
Archive   : TCHK21.ZIP
Filename : TCHK.DOC

  1. Very nice! Thank you for this wonderful archive. I wonder why I found it only now. Long live the BBS file archives!

  2. This is so awesome! 😀 I’d be cool if you could download an entire archive of this at once, though.

  3. But one thing that puzzles me is the “mtswslnkmcjklsdlsbdmMICROSOFT” string. There is an article about it here. It is definitely worth a read: