Category : Miscellaneous Language Source Code
Archive   : LIBRY51.ZIP
Filename : LIBRY2.DOC

 
Output of file : LIBRY2.DOC contained in archive : LIBRY51.ZIP

.pa
GENERAL UTILITIES AND CRT CONTROL

These general utilities should work on whatever system you have (as long as it
is basically IBM compatible or an HP-1000). However, all of the CRT control
procedures will only work on PCs (80 column mode only), HP-26XXs, or Tektronix
4XXX terminals.


QUICK LIST OF GENERAL UTILITIES AND CRT CONTROL

ADATE.... fetch the date
ATIME.... fetch the time of day
BEEP..... beep
CLEAR1... clear one line on the CRT and move cursor to column 1
CPU...... fetch the time (also see SECNDS)
CRT1C.... write one character to the CRT
CRT1D.... write one dot to the CRT in graphics mode
ERASE.... clear the CRT
EXEPRG... run a program from within another program
FFPRN.... send a formfeed to the printer
FTIME.... fetch character string indicating date and time
GET1C.... read 1 character from the keyboard don't wait or display
GETPSP... get the program segment prefix (PC only - on HP use GETST)
HELPME... list help information from user-defined help file
IFBRK.... detect keyboard interrupt (if-break)
LXXX87... logical test for math coprocessor
PAUSE.... display message and wait for any keystroke
PRT1C.... send 1 character to the printer
READ1.... read 1 character from the keyboard - don't wait for RETURN
READC.... read a string from the keyboard
RRPAR.... get file name from runtime string
RS232I... RS-232 communications port I/O and control
SECNDS... fetch the time (also see CPU)
SETVM.... set video mode
SPOOL.... divert output from FFPRN and WRPRN to a file (can be NUL or CON)
TONE..... sound a tone
UP1LIN... move the cursor up 1 line on the CRT
WCGRM.... write a character in graphics mode
WRPRN.... print a character string
WRTTY.... write a character string on the CRT
.pa
NAME: ADATE
PURPOSE: fetch the date
TYPE: subroutine (far external)
SYNTAX: CALL ADATE(MONTH,IDAY,IYEAR)
OUTPUT: MONTH (INTEGER*2) month
IDAY (INTEGER*2) day of the month
IYEAR (INTEGER*2) year 1986, 1987, etc.



NAME: ATIME
PURPOSE: fetch the time of day
TYPE: subroutine (far external)
SYNTAX: CALL ATIME(IHOUR,MIN,ISEC,IHUN)
OUTPUT: IHOUR (INTEGER*2) hours in military time
MIN (INTEGER*2) minutes
ISEC (INTEGER*2) seconds
IHUN (INTEGER*2) hundredths of seconds


NAME: BEEP
PURPOSE: beep
TYPE: subroutine (far external)
SYNTAX: CALL BEEP


NAME: CLEAR1
PURPOSE: clear one line on the CRT and move cursor to column 1
TYPE: subroutine (far external)
SYNTAX: CALL CLEAR1


NAME: CPU
PURPOSE: fetch the time
TYPE: subroutine (far external)
SYNTAX: CALL CPU(SEC)
OUTPUT: SEC (REAL*4) seconds
NOTE: on the PC this returns the elapsed time since midnight
on the HP-1000F this returns cumulative session CPU
this is useful for computing runtimes
also see SECNDS


NAME: CRT1C
PURPOSE: write one character to the CRT
TYPE: subroutine (far external)
SYNTAX: CALL CRT1C(IROW,ICOL,CHAR)
INPUT: IROW (INTEGER*2) row number (0=top)
ICOL (INTEGER*2) column number (0=left)
CHAR (CHARACTER*1) character
OUTPUT: none


NAME: CRT1D
PURPOSE: write one dot to the CRT in graphics mode
TYPE: subroutine (far external)
SYNTAX: CALL CRT1D(IROW,ICOL,IDOT)
INPUT: IROW (INTEGER*2) row number (0=top)
ICOL (INTEGER*2) column number (0=left)
IDOT (INTEGER*2) color (depends on video mode)
OUTPUT: none


NAME: ERASE
PURPOSE: clear the CRT
TYPE: subroutine (far external)
SYNTAX: CALL ERASE


NAME: EXEPRG
PURPOSE: run a program from within another program
TYPE: subroutine (far external)
SYNTAX: CALL EXEPRG('d:\path\myprog.exe'//CHAR(0),
& 'string/options etc.'//CHAR(0),IER)
INPUT: program name and runtime string
OUTPUT: IER (INTEGER*2) error indicator


NAME: FFPRN
PURPOSE: send a formfeed to the printer
TYPE: subroutine (far external)
SYNTAX: CALL FFPRN


NAME: FTIME
PURPOSE: fetch character string indicating date and time
TYPE: subroutine (far external)
SYNTAX: CALL FTIME(DATE)
OUTPUT: DATE (CHARACTER*30)


NAME: GET1C
PURPOSE: read 1 character from the keyboard don't wait or display
TYPE: subroutine (far external)
SYNTAX: CALL GET1C(ANS)
OUTPUT: ANS (CHARACTER*1)
NOTE: this is very handy for creating menus - also see READ1


NAME: GETPSP
PURPOSE: get the program segment prefix (PC only - on HP use GETST)
TYPE: subroutine (far external)
SYNTAX: CALL GETPSP(PSP)
INPUT: none
OUTPUT: PSP (CHARACTER*1 PSP(128))
NOTE: This seems like a logical thing to want; but to actually find
the PSP after DOS gets through with it on the PC is no easy
task when working from inside an EXE file.


NAME: HELPME
PURPOSE: detect keyboard interrupt (if-break)
TYPE: subroutine (far external)
SYNTAX: CALL HELPME(NAME,CBUF)
INPUT: NAME (CHARACTER*12) user-defined help file name
CBUF (CHARACTER*5) key
OUTPUT: output is always to the CRT via WRTTY
NOTE: The key can be '?,xxx' or just 'xxx ' either way will do.
See example help file at the end of this section.


NAME: IFBRK
PURPOSE: detect keyboard interrupt (if-break)
TYPE: LOGICAL*2 function (far external)
SYNTAX: IF(IFBRK(0)) GO TO 100
NOTE: you must pass a dummy parameter "0" so FORTRAN will generate
the proper calling sequence


NAME: LXXX87
PURPOSE: logical test for math coprocessor
TYPE: LOGICAL*2 function (far external)
SYNTAX: IF(.NOT.LXXX87(0)) GO TO 100
NOTE: you must pass a dummy parameter "0" so FORTRAN will generate
the proper calling sequence


NAME: PAUSE
PURPOSE: display the message "hit the SPACE BAR to continue" and wait
for any keystroke
TYPE: subroutine (far external)
SYNTAX: CALL PAUSE
NOTE: you may want to follow this with CALL CLEAR1 to erase the line


NAME: PRT1C
PURPOSE: send 1 character to the printer (bypasses DOS)
TYPE: subroutine (far external)
SYNTAX: CALL PRT1C('a') or CALL PRT1C(CHAR(13))
INPUT: one CHARACTER*1 variable
NOTE: if you want to print a string use WRPRN


NAME: READ1
PURPOSE: read 1 character from the keyboard - don't wait for RETURN
TYPE: subroutine (far external)
SYNTAX: CALL READ1(ANS)
OUTPUT: ANS (CHARACTER*1)
NOTE: this is very handy for creating menus - also see GET1C


NAME: READC
PURPOSE: read a string from the keyboard
TYPE: subroutine (far external)
SYNTAX: CALL READC(CBUF,NBUF,IERR)
INPUT: NBUF (INTEGER*2) maximum number of characters to be read
OUTPUT: CBUF (CHARACTER*1 CBUF(NBUF) or CHARACTER*80 CBUF, NBUF=80)
IERR (INTEGER*2) error return indicator (IERR=0 is normal)
NOTE: This bypasses DOS (which is often advantageous). On the HP
this goes directly to the OPSYS. If you ask for 6 characters
then READC will only allow you to enter 6. The maximum number
of characters that can be requested is the 80 - the current
column (or a maximum of 79 if the cursor is at the left)


NAME: RRPAR
PURPOSE: get file name from runtime string
TYPE: subroutine (far external)
SYNTAX: CALL RRPAR(N,NAME)
INPUT: N (INTEGER*2) number of entry see example below
OUTPUT: NAME (CHARACTER*12)
NOTE: the purpose of this is to fetch and parse the string that you
type in after the name of your program as below

MYPROG this.dat that.for other.bin wednesday

fetch the names with the following

CHARACTER NAME1*12,NAME2*12,NAME3*12,COMMENT*12
CALL RRPAR(1,NAME1)
CALL RRPAR(2,NAME2)
CALL RRPAR(3,NAME3)
CALL RRPAR(4,COMMENT)

you will get the following

NAME1='this.dat'
NAME2='that.for'
NAME3='other.bin'
COMMENT='wednesday'


NAME: RS232IO (or RS232I as FORTRAN chops external names longer than 6
characters)
PURPOSE: control RS-232 port
TYPE: subroutine (far external)
SYNTAX: CALL RS232IO(IPORT,IOPT,ICHAR)
INPUT: IPORT (INTEGER*2) either 1 or 2
IOPT (INTEGER*2) see DOS Technical Reference Manual for INT14
ICHAR (INTEGER*2) see DOS Technical Reference Manual for INT
OUTPUT: ICHAR (INTEGER*2) see DOS Technical Reference Manual for INT
NOTE: All this routine does is subtract 1 from IPORT and put the result
in the DX register, put the low byte of IOPT into the AH register,
put the low byte of ICHAR into the AL register, call the BIOS
interrupt 14, put the resulting value of AX into ICHAR and return.
In order to figure out what this does you'll just have to consult
the DOS Technical Reference Manual. I have provided an example of
its use to "talk" to an HP pen plotter at the end of this section.


NAME: SETVM
PURPOSE: set video mode
TYPE: subroutine (far external)
SYNTAX: CALL SETVM(MODE)
INPUT: MODE (INTEGER*2) mode (see your hardware manual)
OUTPUT: none


NAME: SECNDS
PURPOSE: fetch the time
TYPE: REAL*4 function (far external)
SYNTAX: T=SECNDS(0.) or T=SECNDS(T0)
INPUT: T0 (REAL*4) offset time
OUTPUT: seconds since midnight (REAL*4)
NOTE: this is for compatibility with DEC machines
also see CPU


NAME: SPOOL
PURPOSE: divert output from FFPRN and WRPRN to a file
TYPE: subroutine (far external)
SYNTAX: CALL SPOOL('FILE.EXT',IER)
INPUT: FILE.EXT (CHARACTER*?) name of file (can be NUL or CON)
note: if the file name has no extension then leave a space at the
end (e.g. 'PRN ') otherwise there is no way of telling where the
name ends
OUTPUT: IER (INTEGER*2) error indicator (IER=0 is normal)
NOTE: This will only divert output sent to FFPRN or WRPRN. The file must
not already exist (to avoid unintentional overwriting). To
terminate diversion and return output to the printer, just call it
again like: CALL SPOOL('PRN ',IER).


NAME: TONE
PURPOSE: sound a tone
TYPE: subroutine (far external)
SYNTAX: CALL TONE(IFREQ,ICOUNT)
INPUT: IFREQ (INTEGER*2) frequency in HZ
ICOUNT (INTEGER*2) duration in "counts" which is about 1/18th sec
OUTPUT: none
NOTE: This can also be used for a timed wait by setting IFREQ to zero.


NAME: UP1LIN
PURPOSE: move the cursor up 1 line on the CRT
TYPE: subroutine (far external)
SYNTAX: CALL UP1LIN
NOTE: there is no way to do this in FORTRAN on the PC
(UP1LIN is in assembler)


NAME: WCGRM
PURPOSE: write a character in graphics mode
TYPE: subroutine (far external)
SYNTAX: CALL WCGRM(CHAR,IROW,ICOL,ICOLOR)
INPUT: CHAR (CHARACTER*1) character
INPUT: IROW (INTEGER*2) row number (0=top)
ICOL (INTEGER*2) column number (0=left)
ICOLOR (INTEGER*2) color (see your hardware manual)
OUTPUT: none


.de
NAME: WRPRN
PURPOSE: print a character string
TYPE: subroutine (far external)
SYNTAX: CALL WRPRN('print this string<')
INPUT: a character string (CHARACTER*? , it doesn't matter)
NOTE: this bypasses DOS (which is often advantageous)

CALL WRPRN('this is only a test_')
CALL WRPRN(' for the next 60 seconds<')

the above 2 lines will print on the same line as...

this is only a test for the next 60 seconds

The "_" tells WRPRN to not follow the string with a
carriage return (CR) and line feed (LF) while the "<"
does indicate this. Neither the "_" nor the "<" will
actually be printed.

If you want to change the symbols "_" and "<" to say
"+" and "." use the following...

CALL WRPRN('_+.this is only a test+')
CALL WRPRN('_+.for the next 60 seconds.')

Of course, in this case you can't print a "+" or a "."
so you could use CHAR(0) and CHAR(13) instead. Beginning
a string with a "_" tells WRPRN that the next 2 characters
are to replace the "_" and "<" characters.

Also see WRTTY.

In case you are wondering why I wrote this, it's because some
misguided persons at DEC and Microsoft had this bizarre idea
that one should put some stupid character like "\" or "$" at
the end of a format to suppress a carriage control, while the
whole rest of the world uses "_" at the end of a string.
If anyone out there knows, please tell me what comes over
these people who do weird things like this?

WARNING: should you forget to end the string with a proper terminator
(e.g. "_" or "<") WRPRN will just continue indefinitely until
it finds one or your system crashes...
.ee


NAME: WRTTY
PURPOSE: write a character string on the CRT
TYPE: subroutine (far external)
SYNTAX: CALL WRTTY('display this string<')
INPUT: a character string (CHARACTER*? , it doesn't matter)
NOTE: This bypasses DOS (which is often advantageous) AND the BIOS
(which is also often advantageous) and pushes your string
directly into the display memory (as a result Ctrl-PrtSc will
not even see it). This is VERY much faster than DOS (which is
often painfully slow) and the BIOS (which isn't any better).
On the HP this goes directly to the OPSYS, not the FORTRAN I/O
handler.

For notes on how to use WRTTY see WRPRN.
.ad LIBRY2A.DOC