Trailing-Edge
-
PDP-10 Archives
-
decuslib10-08
-
43,50514/uuofun.mac
There are no other files named uuofun.mac in the archive.
;
;+
;.title Monitor calls as callable functions
;.flag index
;.figure 10
;.center
; MONITOR CALLS AS CALLABLE FUNCTIONS
;.skip 2
;.center
;Markku Suni
;.center
;Computing Centre
;.center
;University of Turku
;.center
;SF-20500 TURKU 50
;.skip 3
;.hl 1 INTRODUCTION
;.i 5
;This set of callable >functions and >subroutines has been designed
;to be used by programs written in higher-level languages to
;get some useful information from the >DECsystem-10 >monitor.
;These programs can be used as functions or subroutines and they can be
;called from programs which conform the standard TOPS10 calling
;conventions. The names of the functions have been chosen to be
;.list
;.le ;mnemonically meaningfull
;.le ;close to the name of the corresponding monitor call
;.le ;such that they conform the FORTRAN name type rules.
;.end list
;In cases here these goals are conflicting, a compromise is made.
;Generally they are INTEGER FUNCTIONs, but some of them (those that
;return more than one value) can or must be called as SUBROUTINEs.
;.index INTEGER FUNCTIONS
;.index SUBROUTINES
;.i 5
;At the university of Turku these functions have been placed in
;FORTRAN library (SYS:FORLIB.REL). This makes it easy for a
;FORTRAN or >PASCAL user to call these routines and have them
;loaded with his program.
;.hl 1 Installation instructions
;.hl 2 Assembly switches
;.i 5
;There are two possible versions of UUOFUN.REL. One can
;generate it as an indexed library (like FORLIB, for instance), or as a single file,
;in which case all the routines come in the core load as soon as one is needed.
;.index indexed library
;.index single file
;The choice between these two depends on the setttng of assembly switch >FTIND.
;If FTIND = 0 the file UUOFUN.MAC assembles as a single file.
;If FTIND _# 0, the file assembles as several modules ready for indexing with >MAKLIB.
;The default value for FTIND = 1.
;.hl 2 TOPS10 Commands
;.i 5
;All you need is the following set of commands:
;.lm 6
;.skip 1
;#.R MACRO
;. ;#*UUOFUN,UUOFUN/c=TTY:,DSK:UUOFUN
;. ;#FTIND==0 ;or 1 just as you like
;. ;#_^Z
;. ;#FTIND==0 ;or 1 just as you like
;. ;#_^Z
;. ;#.R CREF
;. ;#*UUOFUN.LST=UUOFUN.CRF
;. ;#_^C
;. ;#.R RUNOFF
;. ;#*UUOFUN.MAC
;. ;#_^C
;.skip 1
;.lm 0
;.hl 1 definitions and acros
;.index Definitions and Macros
;.hl 2 Assembly switches
;-
IFNDEF FTIND, <FTIND==1>
;+
;If separate modules are assembled by setting FTIND _# 0, then
;assembler creates a >UNIVERSAL symbol table with these
;definitions in order to use AC names and macros in every module.
;-
IFN FTIND,<
UNIVERSAL UUOFPR
>
;.hl 2 AC definitions
;
;.end select
;
W==0 ;work
A==1
B==A+1
C==B+1
D==C+1
E==D+1
F==E+1
Q==16
P==17
;&
;.hl 2 Macros
;.hl 3 Macro >ENTER to define entry point
;Uses FTIND to decide, whether separate modules are needed.
;-
DEFINE ENTER(NAME), <
IFN FTIND, <
SEARCH UUOFPR
TITLE NAME
>
ENTRY NAME
NAME: CAIA ;FOR F40 and F10
PUSH P,CEXIT.##
>
;+
;.HL 2 Macro >ENTRE to define entry point for
;functions written inside some module
;-
DEFINE ENTRE(NAME), <
ENTRY NAME
NAME: CAIA ;FOR F40 AND F10
PUSH P,CEXIT.##
>
;+
;.hl 3 Macro >RET to return from routine
;Uses FTIND to decide whether separate modules are needed.
;-
DEFINE RET, <
POPJ P,
IFG FTIND, <
PRGEND
>
>
;+
;.hl 3 Macro >SAVE to save ac's:
;-
DEFINE SAVE(NUM), <
%N==1
REPEAT NUM,<
PUSH P, %N
%N==%N+1
>
>
;
;+.hl 3 Macro >REST to restore saved ac's:
;-
DEFINE REST(NUM), <
%NN==NUM
REPEAT NUM, <
POP P, %NN
%NN=%NN-1
>
>
IFN FTIND,<
PRGEND ;END OF UNIVERSAL SYMBOL TABLE
>
;+
;.hl 1 Individual routines
;.skip 2
;.hl 2 Subroutine CDATE
;.index Subroutine CDATE
;.skip 1
;.nf.nj.tab 5, 10, 15
;PURPOSE - To return current date as three integers
;USAGE - CALL CDATE( IYEAR, MONTH, IDAY )
;PARAMETERS:
; IYEAR - Integer: current year
; MONTH - Integer: current month
; IDAY - integer: current day of the month
;DATE LAST MODIFIED: 8-Feb-79
;.fill.justify
;.index current date
;-
SEARCH UUOFPR
IFNDEF FTIND, <FTIND==1>
ENTER CDATE
MOVE A,[XWD 11, 56] ;GETTAB INDEX FOR YEAR
MOVS 0, A ;GET THE CURRENT YEAR
GETTAB 0,
SETZM 0 ;IF IT FAILS
MOVEM 0,@(Q) ;RETURN TO USER
ADDI A, 1 ;INDEX OF MONTH
MOVS 0, A ;FOR GETTAB
GETTAB 0,
SETZM 0 ;IF IT FAILS, JUST ZERO
MOVEM 0,@1(Q) ;RETURN TO USER
ADDI A,1 ;INDEX OF CURRENT DAY
MOVS 0, A
GETTAB 0,
SETZM 0
MOVEM 0,@2(Q) ;RETURN TO USER
RET
;+
;.hl 2 Function MYPPN
;.index FUNCTION MYPPN
;.skip 1
;.nf.nj.tab 5, 10, 15
;PURPOSE - to get my project, programmer number
;USAGE - I = MYPPN(1)
;PARAMETERS:
; ignored, but one needed for FORTRAN compiler
;RESULT:
; User's project number in I left half and
; User's programmer number in I right half
;DATE LAST MODIFIED: 8-Feb-79
;.fill.justify
;-
SEARCH UUOFPR
IFNDEF FTIND, <FTIND==1>
ENTER (MYPPN)
GETPPN 0, ;GET MY PPN
TLN 0, 0 ;NO-OP
RET
;+
;.hl 2 Subroutine MYPETP
;.index SUBROUTINE MYPETP
;.skip 1
;.nf.nj.tab 5, 10, 15
;PURPOSE - to get my project, programmer numbers
; in two separate words
;USAGE - CALL MYPETP(IROJ, IPROG)
;PARAMETERS:
; IPROJ: INTEGER, contains the user's project number
; IPROG: INTEGER, contains the user's programmer
; number. Both are output parameters
;DATE LAST MODIFIED: 05-Jun-79
;.fill.justify
;-
SEARCH UUOFPR
IFNDEF FTIND, <FTIND==1>
ENTER (MYPETP)
GETPPN 0, ;GET MY PPN
TLN 0, 0 ;NO-OP
HLRZM 0, @(Q) ;GIVE PROJECT NUMBER TO THE USER
HRRZM 0, @1(Q) ;AND THE PROGRAMMER NUMBER
RET
;+
;.hl 2 FUNCTION MSTIME
;.index FUNCTION MSTIME
;.skip 1
;.nf.nj.tab 5, 10, 15
;PURPOSE - To give (as result) the current time of
; day in milliseconds since midnight
;USAGE - I = MSTIME(1)
;PARAMETERS:
; Ignored, one needed for FORTRAN compiler
;DATE LAST MODIFIED: 8-Feb-79
;.fill.justify
;-
SEARCH UUOFPR
IFNDEF FTIND, <FTIND==1>
ENTER (MSTIME)
CALLI 0, 23 ;MSTIME UUO
RET
;+
;.hl 2 FUNCTION NOTHER
;.index FUNCTION NOTHER
;.skip 1
;.nf.nj.tab 5, 10, 15
;PURPOSE - To tell the user, whether there are
; other users logged in under this same ppn
;USAGE - I = NOTHER(1)
;PARAMETERS:
; Ignored, needed for FORTRAN compiler
;RESULT:
; I = 0 ( or FALSE) in case there
; are no other users under this ppn
; I _# 0 (or TRUE) in case there are others
;DATE LAST MODIFIED: 8-FEB-79
;.fill.justify
;-
SEARCH UUOFPR
IFNDEF FTIND, <FTIND==1>
ENTER (NOTHER)
OTHUSR 0, ;ARE THERE OTHERS
TRZA 0,777777 ;NO, SET AC ZER & SKIP
TRO 0,777777 ;YES, SET AC # 0
TLZ 0,777777 ;CLEAR AC LEFT HALF
RET
;+
;.hl 2 Function JOBNUM
;.index FUNCTION JOBNUM
;.skip 1
;.nf.nj.tab 5, 10, 15
;PURPOSE - To return the user's job number
;USAGE - I = JOBNUM(1)
;PARAMETERS:
; Ignored, but needed for FORTRAN compiler
;RESULT:
; Job number in I
;DATE LAST MODIFIED: 8-Feb-79
;.fill.justify
;-
SEARCH UUOFPR
IFNDEF FTIND, <FTIND==1>
ENTER JOBNUM
PJOB 0, ;GET THE JOB NUMBER
RET
;+
;.hl 2 Function JOBTIM
;.index FUNCTION JOBTIM
;.skip 1
;.nf.nj.tab 5, 10, 15
;PURPOSE - To return the job's accumulated runtime in
; milliseconds
;USAGE - I = JOBTIM(1)
;PARAMETERS:
; Ignored, but needed for FORTRAN compiler
;RESULT:
; Runtime of your job in milliseconds
;DATE LAST MODIFIED: 8-Feb-79
;.fill.justify
;-
SEARCH UUOFPR
IFNDEF FTIND, <FTIND==1>
ENTER JOBTIM
SETZM 0 ;CLEAR AC, ITS YOUR JOB
RUNTIM 0,
RET
;+
;.hl 2 Function JIFFY
;.index FUNCTION JIFFY
;.skip 1
;.nf.nj.tab 5, 10, 15
;PURPOSE - To return time of day in jiffies (20ms)
;USAGE - I = JIFFY(1)
;PARAMETERS:
; Ignored, but needed for FORTRAN compiler
;RESULT
; Time of day in jiffies, i.e. number of
; 20ms cycles since midnight
;DATE LAST MODIFIED: 8-Feb-79
;.fill.justify
;-
SEARCH UUOFPR
IFNDEF FTIND, <FTIND==1>
ENTER JIFFY
TIMER 0,
RET
;+
;.hl 2 FUNCTION RUN
;.index FUNCTION RUN
;.skip 1
;.nf.nj.tab 5, 10, 15
;PURPOSE -To allow a program to start execution of
; another (>SAVEd ) program
;USAGE - X = RUN( FILE, EXT, PPN)
;PARAMETERS:
; FILE: name of file to be >RUN (>ASCII variable
; or constant). Length of NAME is 2 words
; EXT: extension of the name of the file to be RUN.
; It can be left zero in which case the monitor
; searches for file FILE with appropriate
IFNDEF FTIND, <FTIND==1>
; extension.
; PPN: Project-programmer number of the file
; to be RUN. May be left zero, in which
; case monitor searches for FILE on user's own area
IFNDEF FTIND, <FTIND==1>
;DATE LAST MODIFIED: 12-MAR-80
;.fill.justify
;-
SEARCH UUOFPR
IFNDEF FTIND, <FTIND==1>
ENTER RUN
MOVEI D, 6 ;NAME LENGTH
MOVE B,[POINT 6,PARMS ] ;POINTER TO SIXBIT NAME
MOVE C,[POINT 7, 0 ] ;POINTER TO ASCII
HRRI C,@(Q) ;ADDR OF NAME IN BYTE POINTER
PUSHJ P,MOVEIT ;MOVE NAME TO PARAMETER AREA
;
SKIPN A,@1(Q) ;GET EXTENSION, IF ANY
JRST PPN ;NO EXTENSION
MOVEI D, 3 ;LENGTH OF EXT
MOVE B,[POINT 6, PARMS+2]
MOVE C,[POINT 7, A]
PUSHJ P, MOVEIT ;MOVE EXTENSION
;
PPN: SKIPN A, @2(Q) ;GET PPN, IF ANY
MOVEM A, PPNIN ;STORE TO PARAM. LIST
HRRI A, ADDR ;ADDR OF PARM LIST
CALLI A, 35 ;RUN THE FILE
HALT ;IF ERROR, HALT
JRST RETU ;OTHERWISE RETURN
;
MOVEIT: ILDB 0, C ;LOAD ASCII BYTE
SUBI 0, 40 ;CONVERT TO SIXBIT
IDPB 0, B ;DEPOSIT SIXBIT BYT
SOJG D, MOVEIT ;GET MORE, IF ANY
POPJ P,
;
ADDR: SIXBIT ?DSK? ;DEVICE IS DSK
PARMS: BLOCK 2
EXP 0 ;for extension
EXP 0
PPNIN: XWD 0,0
XWD 0,0
RETU:
RET
;+
;.hl 2 SUBROUTINE MYNAME
;.index SUBROUTINE MYNAME
;.skip 1
;.nf.nj.tab 5, 10, 15
;PURPOSE - To tell the user's name
;USAGE - CALL MYNAME( NAME )
;PARAMETERS:
; NAME: array of length 3 (words) in which the
; routine will return the user's name in >ASCII
; left-justified 5 characters in a word
; with 12 characters of the name and three blanks
;DATE LAST MODIFIED: 25-May-79
;.fill.justify
;-
SEARCH UUOFPR
IFNDEF FTIND, <FTIND==1>
ENTER MYNAME
MOVE A,(Q) ;ADDR OF NAME IN ACC
MOVE 0,[ASCII/ /] ;BLANKS TO AC
MOVEM 0,(A) ;INITIALIZE NAME
MOVEM 0,1(A)
MOVEM 0,2(A)
MOVE B,[XWD -1, 31] ;GETTAB INDEX FOR NAME
MOVE C, B ;FOR TWO HALVES OF NAME
ADDI C, 1
GETTAB B, ;FIRST 6 CHARS OF NAME
JRST NONAM ;IF IT FAILS, CANT'T HELP
GETTAB C, ;THE REST OF THE NAME
JRST NONAM ;HOPE IT WON'T FAIL
HLL A,[POINT 7,0 ] ;MAKE ACC A BYTE POINTER
MOVE D,[POINT 6,B ] ;MAKE ACC D A BYTE POINTER
MOVEI E, 14 ;NAME LENGTH
MYNLOP: ILDB 0, D ;BYTE TO 0 (SIXBIT)
ADDI 0, 40 ;CONVERT TO ASCII
IDPB 0, A ;STORE TO USER
SOJG E, MYNLOP ;GET NEXT CHAR, IF ANY
NONAM:
RET
;+
;.hl 2 Subroutine DSKINF
;.index SUBROUTINE DSKINF
;.skip 1
;.nf.nj.tab 5, 10, 15
;PURPOSE - To combine the functions of
; INDSK, NOUDSK, and NDSSEC
;USAGE - CALL DSKINN( INBLK, NOUBLK, NSECS )
;PARAMETERS:
; INBLK: Integer, gives the number of disc blocks
; read so far
; NOUBLK: Integer, gives the number of disc blocks
; written so far
; NSECS: Integer, gives the number of disc block
; seconds used so far
;DATE LAST MODIFIED: 25-May-79
;.fill.justify
;-
SEARCH UUOFPR
IFNDEF FTIND, <FTIND==1>
ENTER DSKINF
PUSHJ P, INDSK ;GET THE NUMBER OF READ BLKS
MOVEM 0, @(Q) ;STORE TO USER
PUSHJ P, NOUDSK ;NUMBER OF BLKS WRITTEN
MOVEM 0, @1(Q) ;TO USER
PUSHJ P, NDSSEC ;AND SECONDS
MOVEM 0, @2(Q) ;TO USER
POPJ P,
;+
;.hl 2 Function INDSK
;.index FUNCTION INDSK
;.skip 1
;.nf.nj.tab 5, 10, 15
;PURPOSE - To tell the user, how many disc blocks
; this job has read
;USAGE - I = INDSK(1)
;PARAMETERS:
; Ignored, but needed for FORTRAN compiler
;RESULT:
; Number of disc bloks read by job so far
;DATE LAST MODIFIED: 8-Feb-79
;.fill.justify
;-
ENTRE INDSK
MOVE 0,[XWD -1, 17] ;GETTAB TABLE INDEX
GETTAB 0,
SETZM 0 ;CLEAR AC0, ERROR
POPJ P,
;+
;.hl 2 Function NOUDSK
;.index FUNCTION NOUDSK
;.skip 1
;.nf.nj.tab 5, 10, 15
;PURPOSE - To tell the user, how many disc blocks
; this program has written
;USAGE - I = NOUDSK(1)
;PARAMETERS:
; Ignored, but needed for FORTRAN compiler
;RESULT:
; Number of disc blocks written so far
;DATE LAST MODIFIED: 8-Feb-79
;.fill.justify
;-
ENTRE NOUDSK
MOVE [XWD -1, 20] ;GETTAB TABLE INDEX
GETTAB 0,
SETZM 0
POPJ P,
;+
;.hl 2 Function NDSSEC
;.index FUNCTION NDSSEC
;.skip 1
;.nf.nj.tab 5, 10, 15
;PURPOSE - To tell the user the number of disc
; block seconds used
;USAGE - I = NDSSEC(1)
;PARAMETERS:
; Ignored, but needed for FORTRAN compiler
;RESULT:
; Number of disck block seconds used so far
;DATE LAST MODIFIED: 8-Feb-79
;.fill.justify
;-
ENTRE NDSSEC
MOVE 0,[XWD -1, 21]
GETTAB 0,
SETZM 0
RET
;+
;.hl 2 Subroutine LOCTIM
;.index SUBROUTINE LOCTIM
;.skip 1
;.nf.nj.tab 5, 10, 15
;PURPOSE - To tell the current local time
;USAGE - CALL LOCTIM( LOCHOR, LOCMIN, LOCSEC )
;PARAMETERS:
; LOCHOR: Integer, contains the local hour
; in 24-hour format
; LOCMIN: Integer, contains the local minutes
; LOCSEC: Integer, contains the local seconds
;DATE LAST MODIFIED: 25-May-79
;.fill.justify
;-
SEARCH UUOFPR
IFNDEF FTIND, <FTIND==1>
ENTER LOCTIM
SETZB 0, 1 ;CLEAR FOR DIVIDE
CALLI 0, 23 ;GET TIME OF DAY IN MS
;
; NOW, CONVERT MILLISECONDS TO HOURS, MINUTES AND SECONDS
;
IDIV 0,[^D3600000] ;TOTAL HOURS IN 0
MOVEM 0,@(Q) ;GIVE HOURS TO CALLER
MOVE 0, 1 ;GET LEFTOVER MS IN 0
IDIVI 0, ^D60000 ;GET MINUTES IN 0
MOVEM 0, @1(Q) ;GIVE MINUTES TO USER
MOVE 0, 1 ;GET LEFTOVER MILLISECONDS
IDIVI 0, ^D1000 ;GET SECONDS IN 0
MOVEM 0, @2(Q) ;GIVE SECONDS TO USER
RET
;+
;.hl 2 Function LOCHOR
;.index FUNCTION LOCHOR
;.skip 1
;.nf.nj.tab 5, 10, 15
;PURPOSE - To tell the current local hour
;USAGE - I = LOCHOR(1)
;PARAMETERS:
; Ignored, but needed for the FORTRAN compiler
;RESULT:
; The current local hour in 24-hour format
;DATE LAST MODIFIED: 8-Feb-79
;.fill.justify
;.index 24-hour format
;-
SEARCH UUOFPR
IFNDEF FTIND, <FTIND==1>
ENTER LOCHOR
MOVE 0,[XWD 61, 11] ;GETTAB INDEX FOR HOUR
GETTAB 0,
SETZM 0
RET
;+
;.hl 2 Function LOCMIN
;.index FUNCTION LOCMIN
;.skip 1
;.nf.nj.tab 5, 10, 15
;PURPOSE - To tell the current local minute
;USAGE - I = LOCMIN(1)
;PARAMETERS:
; Ignored, but needed for FORTRAN compiler
;RESULT:
; The number of local minutes
;DATE LAST MODIFIED: 8-Feb-79
;.fill.justify
;-
SEARCH UUOFPR
IFNDEF FTIND, <FTIND==1>
ENTER LOCMIN
MOVE 0,[XWD 62, 11]
GETTAB 0,
SETZM 0
RET
;+
;.hl 2 Function LOCSEC
;.index FUNCTION LOCSEC
;.skip 1
;.nf.nj.tab 5, 10, 15
;PURPOSE - To tell the local seconds
;USAGE - I = LOCCEC(1)
;PARAMETERS:
; Ignored, but needed for FORTRAN compiler
;RESULT:
; Number of current local seconds
;DATE LAST MODIFIED: 8-Feb-79
;.fill.justify
;-
SEARCH UUOFPR
IFNDEF FTIND, <FTIND==1>
ENTER LOCSEC
MOVE 0,[XWD 63, 11]
GETTAB 0,
SETZM 0
RET
;+
;.hl 2 Function INBATC
;.index FUNCTION INBATC
;.skip 1
;.nf.nj.tab 5, 10, 15
;PURPOSE - To tell the user, whether this is a BATCH job
;USAGE - I = INBATC(1)
;PARAMETERS:
; Ignored, but needed for the FORTRAN compiler
;RESULT:
; i = 0 (FALSE) if this is NOT a BATCH job
; i _# 0 (TRUE) if this is a BATCH job
;DATE LAST MODIFIED: 8-Feb-79
;.fill.justify
;-
SEARCH UUOFPR
IFNDEF FTIND, <FTIND==1>
ENTER INBATC
MOVE 0, [XWD -1, 40]
GETTAB 0, ;GET BATCH STATUS
SETZM 0
HLRZ 0, 0 ;SHIFT TO RIGHT
ANDI 0, 000200 ;LEAVE ONLY BIT 10
RET
;+
;.hl 2 SUBROUTINE DEVTYP
;.index SUBROUTINE DEVTYP
;.skip 1
;.nf.nj.tab 5, 10, 15
;PURPOSE - To inform the user about the physical
; properties of a device
;USAGE - CALL DEVTYP(DEV,ISDIR, MINE, ISSPL, KIND)
;PARAMETERS: Integers:
; DEV: Name of the device in question (ASCII)
; this is input parameter
; The rest are output parameters
;
; ISDIR: .NE. 0 , if this is a directory device
; MINE: .NE.0 if dev. is available to caller
; ISSPL: .NE. 0 if this device is spooled
; KIND: Device type. One of the following:
; 0 - disk
; 1 - DECtape
; 2 - Magnetic tape
; 3 - Terminal
; 4 - Paper tape reader
; 5 - Paper tape punch
; 6 - display unit
; 7 - Line printer
; 8 - Card reader
; 10 - Pseudo teletype (BATCH job or OPSER)
; 11 - Plotter
ERROR:
; In case of error, DEV is zeroed and other parameters
; are left untouched.
; Error: user specified non-existing or non-initialized
; device.
;DATE LAST MODIFIED: 24-May-79
;.fill.justify
;-
SEARCH UUOFPR
IFNDEF FTIND, <FTIND==1>
ENTER DEVTYP
MOVEI B, 6 ;LENGTH OF NAME OF DEVICE
MOVE C,[POINT 6, A] ;SIXBIT STRING ADDRESS
MOVE D,[POINT 7, 0] ;ASCII STRING ADDRESS
HRRI D,@(Q) ;ADDR OF ASCII STRING
ILDB: ILDB 0, D ;GET BYTE
SUBI 0,40 ;CONVERT TO SIXBIT
IDPB 0, C ;STORE IT
SOJG B, ILDB ;CONTINUE
CALLI 1, 53 ;FIND THE PROPERTIES
JRST ERRO ;Error in case
SETZM 0 ;CLEAR 0
LSHC 0, 1 ;SHIFT BIT 0 INTO AC 0
MOVEM 0, @1(Q) ;INFORM USER: DIRECTORY OR NOT
LSHC 0, 13 ;UNINTERESTNING BITS TO AC 0
SETZM 0 ;CLEAR THEM IN 0
LSHC 0, 1 ;SHIFT BIT 12 INTO AC 0
MOVEM 0, @2(Q) ;INFORM: AVAILABLE OR NOT
SETZM 0
LSHC 0, 1 ;SHIFT BIT 13 inTO AC 0
MOVEM 0, @3(Q) ;INFORM: SPOOLED OR NOT
LSHC 0, 21 ;UNINTRESTNING BITS TO AC 0
SETZM 0
LSHC 0, 6 ;SHIFT BITS 30 - 35 INTO AC 0
MOVEM 0, @4(Q) ;INFORM: DEVICE TYPE
SKIPA ;OK, RETURN
ERRO: SETZM @(Q) ;CLEAR PARAMETER DEV
RET
;+
;.hl 2 Function FCLOCK
;.index FUNCTION FCLOCK
;.skip 1
;.nf.nj.tab 5, 10, 15
;PURPOSE - To function as a clock
;USAGE - X = FCLOCK(I)
;
;HOW DOES IT WORK:
; When called for the first time, FCLOCK ignores
; any parameters. It asks the monitor for the time
; of day in milliseconds and stores this time.
; On later calls it asks for the then current time
; in milliseeonds and subtracts this from the time
; it is keeping thus giving the amount of time
; elapsed since a) the first call, or
; b) the call before this
;PARAMETERS:
; I: Integer. When zero, tells FCLOCK to keep the same
; time thus counting time from the very first start.
; When not equal to zero, tells FCLOCK to save
; the time of the this call, thus counting time
; between successive calls.
;RESULT:
; The aforementioned time is given in milliseconds
; and it is a REAL number.
;
;DATE LAST MODIFIED: 9-Feb-79
;.fill.justify
;-
SEARCH UUOFPR
IFNDEF FTIND, <FTIND==1>
ENTER FCLOCK
MSTIME 0, ;ASK FOR CURRENT TIME
SKIPE 1, TIME ;IS THIS THE FIRST CALL?
JRST NOTINI ;NO, THIS IS NOT
MOVEM 0, TIME ;FIRST CALL, STORE TIME
POPJ P, ;AND RETURN
TIME: 0 ;TIME OF DAY IN MS
NOTINI: SUBM 0, 1 ;TIME SINCE TIME IN "TIME"
SKIPE 0, @(Q) ;DOES THE USER WANT CURRENT TIME
MOVEM 0, TIME ;YES, SAVE THE CURRENT TIME
MOVE 0, 1 ;GIVE USER THE DIFFERENCE
PUSHJ P, FLT.0## ;FLOAT THE NUMBER
RET
;+
;.hl 2 Function ICLOCK
;.index FUNCTION ICLOCK
;.skip 1
;.nf.nj.tab 5, 10, 15
;PURPOSE - To function as a clock
;USAGE - K = ICLOCK(I)
;
;HOW DOES IT WORK:
; When called for the first time, ICLOCK ignores
; any parameters. It asks the monitor for the time
; of day in milliseconds and stores this time.
; On later calls it asks for the then current time
; in milliseconds and subtracts this from the time
; it is keeping thus giving the amount of time
; elapsed since a) the first call, or
; b) the call before this
;PARAMETERS:
; I: Integer. When zero, tells ICLOCK to keep the same
; time thus counting time from the very first start.
; When not equal to zero, tells ICLOCK to save
; the time of the this call, thus counting time
; between successive calls.
;RESULT:
; The aforementioned time is given is milliseconds
; as an INTEGER.
;
;DATE LAST MODIFIED: 9-Feb-79
;.fill.justify
;-
SEARCH UUOFPR
IFNDEF FTIND, <FTIND==1>
ENTER ICLOCK
MSTIME 0, ;ASK FOR CURRENT TIME
SKIPE 1, TIME ;IS THIS THE FIRST CALL?
JRST NOTINI ;NO, THIS IS NOT
MOVEM 0, TIME ;FIRST CALL, STORE TIME
POPJ P, ;AND RETURN
TIME: 0 ;TIME OF DAY IN MS
NOTINI: SUBM 0, 1 ;TIME SINCE TIME IN "TIME"
SKIPE 0, @(Q) ;DOES THE USER WANT CURRENT TIME
MOVEM 0, TIME ;YES, SAVE THE CURRENT TIME
MOVE 0, 1 ;GIVE USER THE DIFFERENCE
RET
;+
;.hl 2 Function SWATCH
;.index FUNCTION SWATCH
;.skip 1
;.nf.nj.tab 5, 10, 15
;PURPOSE - To function as a stopwatch
;USAGE - X = SWATCH(I)
;
;HOW DOES IT WORK:
; When called for the first time, SWATCH ignores
; any parameters. It asks the monitor for the
; accumulated runtime of the job and stores this time.
; On later calls it asks for the so far accumulated
; runtime (ms) and subtracts this from the time
; it is keeping thus giving the amount of runtime
; used since a) the first call, or
; b) the call before this
;PARAMETERS:
; I: Integer. When zero, tells SWATCH to keep the same
; time thus counting runtime from the very first start.
; When not equal to zero, tells SWATCH to save
; the time of the this call, thus counting runtime
; between successive calls.
;RESULT:
; The aforementioned runtime is given in milliseconds
; and it is a REAL number.
;
;DATE LAST MODIFIED: 24-May-79
;.fill.justify
;-
SEARCH UUOFPR
IFNDEF FTIND, <FTIND==1>
ENTER SWATCH
SETZM 0 ;CLEAR AC 0, ITS THIS JOB's TIME
RUNTIM 0, ;ASK FOR CURRENT TIME
SKIPE 1, TIME ;IS THIS THE FIRST CALL?
JRST NOTINI ;NO, THIS IS NOT
MOVEM 0, TIME ;FIRST CALL, STORE TIME
POPJ P, ;AND RETURN
TIME: 0 ;TIME OF DAY IN MS
NOTINI: SUBM 0, 1 ;TIME SINCE TIME IN "TIME"
SKIPE 0, @(Q) ;DOES THE USER WANT CURRENT TIME
MOVEM 0, TIME ;YES, SAVE THE CURRENT TIME
MOVE 0, 1 ;GIVE USER THE DIFFERENCE
PUSHJ P, FLT.0## ;FLOAT THE NUMBER
RET
;+
;.hl 2 Function IWATCH
;.index FUNCTION IWATCH
;.skip 1
;.nf.nj.tab 5, 10, 15
;PURPOSE - To function as a stopwatch
;USAGE - X = IWATCH(I)
;
;HOW DOES IT WORK:
; When called for the first time, IWATCH ignores any
; parameters. It asks the monitor for the accumulated
; runtime of the job and stores this time.
; On later calls it asks for the so far accumulated
; runtime (ms) and subtracts this from the time it is
; keeping thus giving the amount of runtime used
; since a) the first call, or
; b) the call before this
;PARAMETERS:
; I: Integer. When zero, tells IWATCH o keep the same
; time thus counting runtime from the very first start.
; When not equal to zero, tells IWATCH to save
; the time of the this call, thus counting runtime
; between successive calls.
;RESULT:
; The aforementioned runtime is given in milliseconds
; and it is an INTEGER number.
;
;DATE LAST MODIFIED: 24-May-79
;.fill.justify
;-
SEARCH UUOFPR
IFNDEF FTIND, <FTIND==1>
ENTER IWATCH
SETZM 0 ;CLEAR AC 0, ITS THIS JOB's TIME
RUNTIM 0, ;ASK FOR CURRENT TIME
SKIPE 1, TIME ;IS THIS THE FIRST CALL?
JRST NOTINI ;NO, THIS IS NOT
MOVEM 0, TIME ;FIRST CALL, STORE TIME
POPJ P, ;AND RETURN
TIME: 0 ;TIME OF DAY IN MS
NOTINI: SUBM 0, 1 ;TIME SINCE TIME IN "TIME"
SKIPE 0, @(Q) ;DOES THE USER WANT CURRENT TIME
MOVEM 0, TIME ;YES, SAVE THE CURRENT TIME
MOVE 0, 1 ;GIVE USER THE DIFFERENCE
RET
;+
;.hl 2 Function INBIT
;.index function INBIT
;.skip 1
;.nf.nj.tab 5, 10, 15
;PURPOSE - To get some bits from a word
;USAGE - I = INBIT( WORD, IFROM, MANY )
;PARAMETERS:
; WORD - The word from which the bits will be
; picked
; IFROM - Bit position of the first bit to be picked
; (bit 0 is the sign bit, bit 35 the rightmost)
; MANY - Number of bits to be picked
;RESULT:
; The picked bits right justified on I
;DATE LAST MODIFIED: 30-Mar-81
;.fill.justify
;-
SEARCH UUOFPR
IFNDEF FTIND, <FTIND==1>
ENTER INBIT
MOVE 0,@(Q) ;GET THE WORD
MOVE 1,@1(Q) ;Get "IFROM"
ASH 0,(1) ;SHIFT THE FIRST BIT TO LEFT
MOVNI 1,^D36 ;NUMBER OF BITS IN WORD
ADD 1,@2(Q) ;LEAVE THIS MANY AND
LSH 0,(1) ;SHIFT THE REST OUT TO RIGHT
RET
;+
;.hl 2 Subroutine MOVBIT
;.index Subroutine MOVBIT
;.skip 1
;.nf.nj.tab 5, 10, 15
;PURPOSE - To move bits within words
;.index Move bits
;USAGE - CALL MOVBIT( FROMWR, IBEGIN, MANY, TOWORD, IBEG)
;PARAMETERS:
; FROMWR: The word from which the bits are to be moved
; IBEGIN: The bit position of the first bit to be moved
; MANY: This many bits will be moved
; TOWORD: The word to which the bits will be moved
; IBEG: The bit position of the first bit of the
; receiving field into which the bits will be moved
; without modifying any other bits of the word.
;
;WARNING: In case the parameters give bit positions outside
; a computer word, the move will not be done and
; the parameter MANY will be set to zero.
;
;DATE LAST MODIFIED: 30-Mar-81
;.fill.justify
;-
SEARCH UUOFPR
IFNDEF FTIND, <FTIND==1>
ENTER MOVBIT
MOVE 1,@(Q) ;GET THE "FROM" WORD
SKIPL 3,@1(Q) ;BIT POSITION OK?
CAILE 3,^D35 ;I MEAN, WITHIN A WORD?
JRST ZEROA ;UNFORTUNATELY NO.
ASH 1,(3) ;OK. SHIFT THE WANTED BITS LEFT
SETZM 0
ADD 3,@2(Q) ;IS THE FIELD WANTED WITHIN A WORD
SKIPL 4,@2(Q) ;OR IS IT GREATER THAN 0 BITS?
CAILE 3,^D36 ;SHOULD BE LESS THAN 36
JRST ZEROA ;UNFORTUNATELY NO
ASHC 0, (4) ;SHIFT THE WANTED FIELD IN AC 0
MOVE 1,@3(Q) ;"TO" WORD IN AC
SKIPL 3,@4(Q) ;WHERE IS THE "TO" FIELD?
CAILE 3,^D35 ;IS IT WITHIN THE WORD?
JRST ZEROA ;UNFORTUNATELY NO
ROTC 1, (3) ;BEGINNING OF "TO" WORD IN AC 2
ASH 1, (4) ;NOW, TAKE THE "TO" FIELD FROM AC 1
MOVN 4, 4 ;BY SHIFTING RIGTH COMBINED 0,1
LSHC 0, (4) ;THE AMOUNT OF BITS NEEDED (MANY)
MOVN 3,3 ;AND NEGATE
ROTC 1, (3) ;GET THE REST OF THE WORD
MOVEM 1,@3(Q) ;GIVE IT TO USER
POPJ P, ;RETURN TO CALLER
ZEROA:
SETZM @2(Q) ;ZERO THE MANY PARAMETER
POPJ P, ;RETURN
PRGEND
;
;+
;.page
;.do index
;-
; [END OF UUOFUN]
;
END