home *** CD-ROM | disk | FTP | other *** search
-
-
- T U R B O W H E E L S
- version 1.00
-
- Copyright 1984 by Neil J. Rubenking
-
-
-
- This disk contains quite a few procedures and functions that
-
- make TURBO Pascal easier to use. Why re-invent the wheel when
-
- you can get TURBO WHEELS? I am releasing it for distribution in
-
- the User Group/Bulletin Board network subject to the following
-
- stipulations:
-
-
- 1) Anyone may get a copy of these files for examina-
- tion, either through their local Users Group or
-
- Bulletin Board, or by sending me a blank, DOUBLE-sided
-
- diskette and a prepaid, self-addressed diskette
-
- mailer. Regardless of how the disk is obtained, anyone
-
- who actually finds the contents USEFUL should send me
-
- $10, so I can continue writing and releasing software
-
- in this User-Supported fashion. Send $10 to:
-
-
- Neil J. Rubenking
-
- 300 Page St.
-
- San Francisco, CA 94102
-
-
- 2) I retain all rights to the SOURCE code. Recipients
-
- of the procedures may freely $INCLUDE them in compiled
-
- programs, but may not release the SOURCE.
-
-
- 3) Clubs may freely copy and distribute the disk for a
-
- nominal fee, not to exceed $8.
-
-
- With the legalities aside, I hope you find these procedures
-
- useful in your programs. Each has at least one "driver" program,
-
- to illustrate its actual use. If you are new to the concept of
-
- $INCLUDEing pre-written code in your TURBO Pascal programs, study
-
- the drivers. There are also several minor applications/utilities
-
- constructed using 8 or 10 of the handy procedures. A listing and
-
- description of the procedures follows.
-
-
- A keen observer might correctly deduce the following from
-
- the type of files I have put on this disk.
-
-
- 1) I don't have a Color/Graphics display
-
- 2) I don't do much in math and scientific programming
-
- 3) I do write programs that involve creating and manipu-
- lating disk files.
-
- 4) I do like my programs to look and sound good.
-
-
- You may have noticed other disks of TURBO files on the
-
- market. One that I have found useful is just called "Procedures
-
- and Functions for TURBO Pascal", from:
-
-
- The Success Press
-
- P.O. Box 2795
-
- Des Plaines, IL
-
-
- Send Bill Todd $20 to receive these procedures. A list of
-
- them is on this disk as "SUCCESS.DOC".
-
-
-
-
-
-
-
-
- TURBO WHEELS page 2
-
-
-
- *** SETTING UP THE DISK ***
-
-
- Format a blank diskette with the /S option, to make it a
-
- "bootable" DOS disk. Copy COMMAND.COM onto it, too. Copy all
-
- the files from this diskette onto the new diskette, and finally
-
- copy the files TURBO.COM and TURBO.MSG from the TURBO Pascal disk.
-
- Now your TURBO is a more powerful development tool -- it has WHEELS!
- development tool -- it has WHEELS!
-
-
-
- *** FILES ON THIS DISK ***
-
-
- The file "README.###" is a list of all the files, with a
-
- one-line description of each for quick reference. The files for
-
- INCLUsion in your programs have the extension .LIB or .TYP.
-
- Almost every .LIB file has a short program to illustrate its
-
- action (often called a "driver"). The drivers have the same name
-
- as their .LIB file, but the extension is .PAS. There are several
-
- utility application programs that use 8 or 10 .LIB files, and a
-
- few data files (extension .DAT). Now on to the descriptions of
-
- the idividual files.
-
-
-
- *** TYPE DECLARATION FILES ***
-
- Most of the files on this disk use variables of type REGPACK
-
- (for REGister PACK) or FILENAME_TYPE. The description at the top
-
- of the INCLUDE file will indicate if these or any other files
-
- need to also be present. The reason to NOT write these type
-
- declarations directly into the files that require them is that
-
- TURBO objects to multiple descriptions of the same TYPE.
-
-
- FILENAME.TYP contains the definition of "filename_type" as a
-
- string of up to 64 characters.
-
-
- REGPACK.TYP describes the type of variable required as input by
-
- TURBO's procedures INTR and MSDOS. You do not need to
-
- understand these to use them! (But if you DO, you can do a
-
- lot!)
-
-
- SCREENS.TYP is the declaration of variable type SCREEN, which is
-
- exactly the same "shape" as the (text) video display
-
- memory. Using variables of this TYPE, you can easily do
-
- direct screen manipulation.
-
-
- ERRMESSG.LIB is another file that is required by quite a few
-
- others. It contains the function MESSAGE which receives as
-
- input a one-byte error code (output of a DOS function) and
- returns the "translation" of that code, as specified in the
-
- DOS 2.0 manual.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- TURBO WHEELS page 3
-
- *** DOS 2.0 FILE HANDLING ***
-
-
- TURBO's file handling procedures do NOT work with subdirec-
-
- tories, as you may have found out. The following procedures are
-
- implementations of the DOS 2.0 procedures--all the ordinary ones
-
- and some new ones, too.
-
-
- EXTENDIO.DAT is an exact description of the parameters passed to
-
- and from these new IO functions. Until you are used to
-
- using them, you may want to actually insert this document
-
- into your source for reference (or refer to it using
-
- SIDEKICK!).
-
-
- EXTENDIO.LIB, for EXTENDed Input/Output contains 2.0 versions of
-
- Reset, Rewrite, Close, Read, Write, Seek, and Erase. Each
-
- new procedure has the same name as the one it replaces,
-
- preceded by an X (Xreset, Xclose, etc.). Any time you use
-
- these Extended IO procedures, you will also have to $INCLUDE
-
- the TYPE files REGPACK.TYP and FILENAME.TYP, and the file
-
- ERRMESSG.LIB--all of these procedures return a one-byte
-
- error code if anything goes wrong, and ERRMESSG.LIB lets you
-
- interpret the error by saying "writeLn(message(error))".
-
-
- In the DOS 2.0 mode, instead of a File Variable (a
-
- variable of TYPE "file of something") you will use an
-
- INTEGER File Handle. XReset and XRewrite receive a full-
-
- path filename (up to 64 characters) and return the file
-
- handle, which you will use for all further references to the
-
- file. XClose receives just the file handle (any open file
-
- has a handle), and XErase receives just the path/filename.
-
-
- Since DOS 2.0 files are effectively just files of
-
- bytes, the XRead and XWrite operations work rather diffe-
-
- rently from their forebears. You pass the File Handle, the
-
- variable to/from which data is to be read/written, and the
-
- SIZE of that variable (easily obtained with TURBO's SizeOf
-
- function). If the variable is a 1K array, then 1K will be
-
- read into it (or written from it). The Size-passing is
-
- necessary. Without it, you would have to write a new XRead
-
- and XWrite for each type of variable!
-
-
- XSeek is a bit complicated. You pass the File Handle
-
- (as usual), the Size of the records in your file, and the
-
- point from which you want to start your XSeek (Beginning,
-
- End, or Current position), and you get back the new current
-
- position. Even if you don't want the new current position
-
- (e.g., you just wanted to set the file pointer back to the
-
- beginning, or all the way to the end for APPEND), you still
-
- have to provide a dummy variable for it.
-
-
- For very detailed descriptions of the parameters to
-
- pass to and from these EXTENDed Input Output operations, see
-
- EXTENDIO.DAT.
-
-
- MOVEFILE.LIB might well be called "XRename", because it does
-
- serve to rename files on any path. However, the Renaming
-
- extends to the full path--you can MOVE a file to a different
-
- subdirectory simply by changing its path. You pass the old
-
- path and the new path, and receive the usual one-byte error
-
- code if anything goes wrong.
-
-
-
-
-
-
- TURBO WHEELS page 4
-
- GETFILE.LIB contains two procedures, Find_First and Find_Next.
-
- Find_First serves to find the first occurrence of a file
-
- matching the template you supply (using the standard DOS
-
- wildcard characters, ? for any character and * for anything
-
- at all, AND using full-path filenames). You also specify
-
- the File Attribute--you can GET files that are Read-Only,
-
- Hidden, System, Volume label, or Directory. Find_First sets
-
- the DTA (Disk Transfer Area) to a buffer supplied by you and
-
- either puts information about the file in the buffer, or
-
- returns an error code. Once you have Found the First
-
- occurrence, you repeat Find_Next until you don't find any
-
- more.
-
-
- ALLFILES.LIB is a very handy procedure to include in any program
-
- that makes use of other files (e.g., a word processor,
-
- picture editor, music maker, &c.). You pass the top left
-
- and bottom right coordinates of an available screen area,
-
- and a template for the files you want, and ALLFILES takes
-
- over. It opens and frames a window at the coordinates and
-
- displays all matching files. The user positions a pointer
-
- at the required file and presses <return> to select it. If
-
- there are more files than will fit in the window, the user
-
- has the choice of selecting a visible file or going on to
-
- another window full. Once a file is selected, ALLFILES
-
- erases its window and returns the filename. Note that your
-
- program will not have to test for existence of the file
-
- before trying to open it--you KNOW it exists.
-
-
- For an extremely classy use of ALLFILES, you may want
-
- to use the technique described in SCREENS.LIB to save
-
- whatever is on the screen before calling ALLFILES and pop it
-
- right back when ALLFILES is done.
-
-
- MKRMDIR.LIB brings the DOS MKDIR and RMDIR (MaKe DIRectory and
-
- DIRectory) into TURBO. If you want to do it, you can.
-
-
- FILEATTR.LIB lets you change the File Attribute byte (Read-Only,
-
- Hidden, System, Archive) of a file on any path.
-
-
- GTSETDIR.LIB lets you GET or SET the current subDIRectory. It
-
- may well be used in conjunction with GETSTDD below.
-
-
-
- *** DOS 1 OR 2 FILE HANDLING ***
-
-
- GETSETDD.LIB uses DOS function calls to GET or SET the Default
-
- Drive.
-
-
- EXISTFIL.LIB checks for the existence of a file. You pass it the
-
- "old-fashioned" filename (no subdirectory!) and it returns
-
- true or false. (The EXTENDed I/O operations do not directly
-
- crash your program if the file requested does not exist, so
-
- they don't need a corresponding 2.0 function.)
-
-
-
- *** DISK READ/WRITE PROCEDURES ***
-
-
- DISKTYP.LIB checks the type of disk (single/double sided, 8/9
-
- sectors per track). You pass the drive letter, and it
-
- returns the number of K of disk space (an integer, 160, 180,
-
- 320, or 360), 0 if an invalid drive was specified, or 1 for
-
- a non-standard format.
-
-
-
-
- TURBO WHEELS page 5
-
- GETSECTR.LIB conducts I/O between a specific sector on the disk
-
- and a buffer variable declared by you. You specify [R]ead
-
- or [W]rite and the side, sector, and track, and the buffer
-
- variable is either read from or written to the disk. As
-
- usual, a one-byte error code is returned. On the advice of
-
- the DOS Manual, GetSector makes three tries at reading the
-
- sector before it gives up and returns an error code.
-
- The buffer variable must be 512 bytes, but you can
-
- choose to arrange these bytes in convenient ways. For
-
- example, in the application LABEL.PAS, the buffer is an
-
- array[1..16] of type directory_entry, and reading a direc-
-
- tory sector gives you instant access to its 16 entries.
-
- NOTE that, unlike most of the procedures on this disk,
-
- GETSECTR does not have a driver with the same name. The
-
- sample programs that use GETSECTR are LABEL and DISKMOD.
-
-
- LABEL.PAS uses DISKTYP.LIB, GETSECTR.LIB, and several other files
-
- to read and write the volume label. It first seeks an
-
- existing label in the directory (NOTE: the volume label is
-
- just a special kind of directory entry.) If found, you may
-
- change it. If not found, the first directory slot that is
-
- either never-used or erased is converted to a label of your
-
- choice. The current date and time are properly included
-
- with your volume label, but the bit-manipulation that does
-
- that is horrifying!
-
-
- DISKMOD.PAS is a working Disk Sector Viewing and Modifying
-
- program, based on DISKMODF.BAS by John VanderGrift. You
-
- select a sector and get it displayed both in (filtered)
-
- ASCII and hex. You can modify the displayed sector by
-
- simply typing in new values, but you must specifically ask
-
- to record the modifications. Pressing PgDn and PgUp move to
-
- the next or previous sectors--the procedures "increment" and
-
- "decrement" embody the DOS sector numbering scheme.
-
-
-
- *** VIDEO DISPLAY PROCEDURES ***
-
-
- CURSOR.LIB contains the procedure Cursor_Control. You set the
-
- top and bottom "scan lines" for the cursor. You'll want to
-
- $INCLUDE the file MONITOR.LIB and ask to CheckColor before
-
- you change the cursor around, because the Monochrome cursor
-
- has 14 scan lines (numbered 0 at the top to 13 at the
-
- bottom) while the Color cursor is only 7 high (0 to 6). The
-
- normal cursor is 12,13 in Mono and 6,7 in color. In
-
- Monochrome, you can get a two-part cursor by setting the top
-
- line below the bottom. NOTE that you can "kill" the cursor
-
- by setting the top line to 48, bottom to 0.
-
-
- MONITOR.LIB sets the values of the variables COLOR (boolean) and
-
- ScreenSeg (integer) for use by other procedures. Besides
-
- $INCLUDEing it, you must invoke CheckColor at the beginning
- of your program.
-
-
-
-
-
-
-
-
-
-
- TURBO WHEELS page 6
-
- SCREEN.LIB contains procedures to read and write the character
-
- and screen attribute (i.e., COLOR) at any location on the
-
- screen IN TEXT MODE. The driver, SCREEN.PAS, is a little
-
- video game showing how handy these procedures can be.
-
-
- POPSCREN.LIB is a slightly frivolous use of the SCREEN data type,
-
- declared in SCREENS.TYP. Several SCREEN variables are
-
- created and rapidly switched to the display. A pop-up menu
-
- example is included.
-
-
- POPSCREN.DAT is a screen file used by POPSCREN.LIB
-
-
- GRFXTABL.LIB defines a table of ROMEntries "on top" of the ROM
-
- graphics table, giving us (read-only) access to the dot
-
- patterns used to create the monochrome characters.
-
-
- TITLES.LIB contains the procedure MakeTitle. Given a title up to
-
- ten characters and a starting row, it makes a big title on
-
- the screen by using the character patterns from GRFXTABL.
-
-
- WINDOWS.LIB offers another approach to using windows. The
-
- variable type "corners" is declared to be an array[1..4] of
-
- byte. Windows that your program will use are set at the
-
- beginning of the program by declaring CONSTants of type
-
- "corners". The procedures DoWindow and DoFrame operate on
-
- input of type "corners". If, later in the development of
-
- your program, you want to move the windows around, you just
-
- change the CONSTant declaration at the top.
-
-
-
- *** kEYBOARD PROCEDURES ***
-
-
- GETKEYS.LIB is one of my favorites. The line "GetKeys(C,D)"
-
- causes your program to wait for a keystroke and, if it is an
-
- "ordinary" keystroke, returns the character in C and chr(0)
-
- in D. If, however, it was a "special" keystroke (arrow key,
-
- function key), it returns chr(27) in C and a code character
-
- in D. The file KEYCHART.DAT tabulates these special codes.
-
-
- KEYBOARD.LIB is another approach to trapping keystrokes. It uses
-
- the keyboard BIOS interrupt $16 to get the scan code and
-
- ASCII code of any key pressed. The file SCANCODE.DAT is a
-
- chart of keyboard codes, along with a table of "extended"
-
- scan codes.
-
-
- FANCYKEY.LIB goes KEYBOARD one better. It returns a phrase
-
- describing the key pressed, such as "Alt-A", "Shift-F1",
-
- "Back Tab", etc.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- TURBO WHEELS page 7
-
- NEWINT9.LIB is an ambitious procedure. The keyboard's output is
-
- generally handled by Interrupt $9, which is called BY THE
-
- KEYBOARD whenever a key is struck. This interrupt checks
-
- for shift states, filters out key release codes, and
-
- produces the "typematic" effect, whereby a key held down
-
- repeats. Certain applications might be better off WITHOUT
-
- the typematic and WITH access to the key release codes -- my
-
- own PIANO MAN program comes to mind. I required a note to
-
- sound ONCE when a key was pressed and stop when that key was
-
- released. Games might requires this feature. If you do use
-
- it, your program should:
-
-
- 1) invoke procedure SetUpInt, which creates the new
-
- interrupt.
-
-
- 2) invoke NewInt, which saves the normal interrupt
-
- vector and replaces it with directions to the new one.
-
-
- 3) MOST IMPORTANT, before the program ends, invoke
-
- OldInt to restore the normal interrupt. If you don't
-
- do this, or if your program crashes before it can do
-
- it, you cannot communicate through your keyboard, and
-
- you have to turn the PC off and on again.
-
- Used with care, NEWINT9 can satisfy a real need.
-
-
-
- *** GRAPHICS ***
-
-
- (Let me note that I myself do not have a Color/Graphics adapter,
- so I haven't had much opportunity to write for one. However, the
-
- mighty BORLAND has a Graphics tool set for their usual price of
-
- $50.)
-
-
- CIRCLE.LIB draws a circle on your screen. You specify six
-
- parameters: H, K and R are the X and Y coordinates of the
-
- circle's center and its radius. "Res" is the resolution --
-
- the number of dots used to draw the circle is proportional
-
- to Res, as is the time required to draw it. "Aspect" is a
-
- real value that describes the circle's "roundness" -- adjust
-
- to a perfect circle, or change it to get an ellipse.
-
- Finally, "color" can be 1, 2, or 3 if you are in the
-
- Graphics mode that supports four colors. (See the descrip-
-
- tion of graphics modes in the TURBO 2.0 manual).
-
-
- RECTANGL.LIB naturally draws a rectangle on the screen. You tell
-
- it the X and Y coordinates of the upper left and lower right
-
- corners, the color (1, 2, or 3 if appropriate), and 1 for a
- filled rectangle, 0 for hollow.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- TURBO WHEELS page 8
-
- *** MISCELLANEOUS ROUTINES ***
-
-
- EQUIPMNT.LIB uses Interrupt $11 to check the equipment attached
-
- to your PC. It reports on number of printers, RS232 ports,
-
- game ports, and diskette drives, the initial video mode, or
-
- the amount of RAM on the motherboard.
-
-
- GETINTGR.LIB is intended to save you the embarrassment of having
-
- your program crash because someone made an invalid entry for
-
- an integer. At the same time, it makes sure that the entry
-
- is within a ranges you specify. Non-numeric keystrokes are
-
- ignored, BackSpace works, and the function does not give up
-
- until a valid integer is entered.
-
-
- GETFREE.LIB is another face-saver. It gets the amount of free
-
- space on the current disk. That way, your programs can
-
- check for space and give alternatives if there's not enough,
-
- rather than ignominiously crashing.
-
-
- HEXFUNCT.LIB contains the procedure HEX which receives an integer
-
- and returns a 5-character hex string (e.g., $BF00). The hex
-
- string always refers to a positive number -- TURBO's integer
-
- variable type uses its highest bit to indicate sign, thus
-
- restricting the integer range to -32,768 to +32,767. Hex
-
- equivalents are calculated by considering negative integers
-
- as offsets down from $10000 (decimal 65,536). Thus, HEX(-1)
-
- = $FFFF. (NOTE: the TURBO manual says that the integer
-
- range is as stated above, but in my experience, it is not
-
- possible to enter -32,768. )
-
-
-
- KAVAIL.LIB returns the number of KiloBytes of memory available.
-
- It takes into account the MemAvail function's quirk of
-
- reporting amounts greater than 32,767 as negative numbers.
-
-
-
- NOSOUND.PAS does nothing but shut off the sound, if one of your
-
- programs crashes with sound on. When you need it, you NEED
-
- it!
-
-
-
- PARAMETR.LIB contains the function GetParameter, which returns a
-
- string of up to 80 characters consisting of whatever was
-
- entered on the command line after the name of the program.
-
- This O N L Y works in COMPILED programs.
-
-
- QUEUE.LIB is a generic Queue data structure. One of Pascal's
-
- great advantages over BASIC is its implementation of
-
- Pointer^ variables and dynamic lists. By keeping your data
-
- in a linked list instead of an array, you can dedicate only
-
- as much memory as you need, up to all the memory the system
-
- has. If you test for memory available with KAVAIL before
-
- you add each item to the list, you can safely expand to the
-
- maximum memory of different systems without crashing for
-
- lack of memory.
-
-
-
-
-
-
-
-
-
-
-
-
-
- TURBO WHEELS page 9
-
-
- REBOOT.LIB does just what it says. The "warm" reboot produced by
-
- Interrupt $19 does NOT clear the RAM, so, for example,
-
- SIDEKICK will stay resident. The programs LESSRAM and
-
- NUMDISKS use REBOOT to cause the PC to act as if its
-
- internal DIP switches had been reset to indicate a different
-
- number of disk drives or different amount of RAM. One note
-
- of caution -- There seems to be some interference in this
-
- reboot process from certain device drivers in the CONFIG.SYS
-
- file. The symptom is that the driver (e.g., your hard disk
-
- driver, or a RAMdisk) installs itself and then the A: drive
-
- spins . . . and spins . . . and that's it. To avoid this
-
- problem, you could always rename CONFIG.SYS to something
-
- else temporarily. IF you can figure out why this happens
-
- and how to get around it, PLEASE let me know!
-
-
- LESSRAM.COM is handy if you always write your programs on your
-
- souped-up 640K SuperPC and want to test whether it will
-
- actually run on a lesser machine with, say 96K. You COULD
-
- open the box and change the switches, but it's a lot easier
-
- just to go back to DOS and type LESSRAM 96.
-
-
- NUMDISKS's raison d'etre is the current confusion of method among
- RAMdisks. Some require that the internal switches be set to
-
- the total number of physical drives and RAMdisks, while
-
- others insist that the switches show physical drives only.
-
- If you need to switch around, you can enter NUMDISKS
-
- <number>. If you put NUMDISKS in a batch file, be sure to
-
- add an "n" (or "N") to the number so the program won't pause
-
- for a keypress before rebooting.
-
-
- SAFEWRIT.LIB is one way to get around the fact that you cannot
-
- WRITE certain characters to the screen -- they get inter-
-
- preted as Control Characters and warp your display.
-
- Procedure SafeWrite catches these characters and replaces
-
- them with a related character in Low Video. Note that
-
- another approach would be to use the procedures in
-
- SCREEN.LIB to send characters directly to the screen
-
- memory. Using this latter method, you can put ANY character
-
- on the screen.
-
-