Trailing-Edge
-
PDP-10 Archives
-
BB-D480G-SB_FORTRAN10_V11.0_short
-
forddt.mac
Click forddt.mac to
see without markup as text/plain
There are 22 other files named forddt.mac in the archive. Click here to see a list.
Title FORDDT FORTRAN INTERACTIVE DEBUGGING AID ,11(405)
SUBTTL P.E.T. HARDING/DBT/FLD/MD/JMT/MA/SJW/JNG/DCE/BPK/CKS/DCC/BAH/BL/TGS/MRB
; Brad Merrill/BCM/AlB/MEM/PLB/CDM 10-Jul-86
;COPYRIGHT (c) DIGITAL EQUIPMENT CORPORATION 1973, 1987
;ALL RIGHTS RESERVED.
;
;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND COPIED
;ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE AND WITH THE
;INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHER
;COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY
;OTHER PERSON. NO TITLE TO AND OWNERSHIP OF THE SOFTWARE IS HEREBY
;TRANSFERRED.
;
;THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE
;AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT
;CORPORATION.
;
;DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS
;SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DIGITAL.
EDITNO==405 ;EDIT NO
VERSION==11 ;MAJOR VERSION NO
VMINOR==0 ;MINOR VERSION NO
VWHO==0 ;WHO LAST EDITED
.JBDDT=74
.JBREN=124
.JBVER=137
; Get universals and HELPER
IFNDEF TOPS20,<TOPS20==-1> ;[147] 0 = TOPS10, -1 = TOPS20
IFNDEF EXTHLP,<EXTHLP==0> ;[147] -1 If using external HELPER
IFN EXTHLP,< ;[147] external HELPER
IFE TOPS20,<.TEXT 'REL:HELPER/SEGMENT:LOW'> ;[142] load HELPER in low-seg
IFN TOPS20,<.REQUEST SYS:HELPER> ;[142] Load HELPER
> ;[147] end IFN EXTHLP
IFE TOPS20,<
SEARCH UUOSYM,MACTEN ;[142] Get -10 monitor symbols
OPDEF XMOVEI [MOVEI] ;[310] define XMOVEI for -10
OPDEF EFIW [EXP] ;[310] make sure its defined
OPDEF IFIW [EXP] ;[310] ditto
> ;end IFE TOPS20
IFN TOPS20,<SEARCH MONSYM,MACSYM> ;[142] Get -20 monitor symbols
;Report what code is being assembled.
IF1,
<IFE TOPS20,<
PRINTX [Assembling for TOPS10]
>;END OF IFE TOPS20
IFN TOPS20,<
PRINTX [Assembling for TOPS20]
>;END OF IFN TOPS20
>;END OF IF1
;[300]
; These locations may not exist on TOPS-20 as of V10. The symbol tables
; will be in PDV's and the version number and reenter address are stored
; in the program entry vector. FORDDT will not load with LINK V6 if the
; LOC's remain, so until we can resolve the problems associated with JOBDAT
; vestiges, the LOC's themselves will be for TOPS10 only.
;
IFE TOPS20,<
LOC .JBVER
BYTE(3)VWHO(9)VERSION(6)VMINOR(18)EDITNO ;SETS FORDDT VERSION #
LOC .JBREN
RE.ENT ;SETS THE RE - ENTER ADDRESS
LOC .JBDDT
SFDDT ;[145] MAKES DEBUG PROG,FORDDT WORK
RELOC
> ;END IFN TOPS20
SUBTTL REVISION HISTORY
COMMENT \
***** Begin Revision History *****
21 REMOVE ALL HIBERNATE CALLS - JUST USE TTCALL 4
22 CHANGE TRACE% TO TRACE.
23 BEGIN UPDATE FOR (1) SYMBOL TABLE LOOKUP ALGORITHMS
(2) GENERAL CLEAN UP
24 (CONTINUING)
25 CONTINUING; ALSO REWRITE OF LOOK
26 CONTINUING; REWRITE OF OFFSET
REMOVAL OF 'BIGCOD'
27 CONTINUING
30 CONTINUING; INCLUDING SYMBOL USAGE CLEANUP AND REMOVAL
OF SYMSET
31 CONTINUING; REMOVAL OF MOST 'DEBUG' CONDITIONAL CODE
AND INTCPT CONDITIONAL AND CODE
32 CONTINUING; REMOVAL OF SMART PORTION OF LOOK
33 CONTINUING; FIXUP OF PAUSE LOGIC
34 CONTINUING; REINSERT OF SMART CODE TO LOOK - IGNORE
UDDT, FORDDT, AND JOBDAT ON LOOKUP.
35 FINAL EDIT OF UPDATE - PATCH AREA GOES UNDER DEBUG
CONDITIONAL, CALL TO DO MACRO IS FIXED, SO THIS WILL
NOW ASSEMBLE WITH MACRO V50.
36 ANOTHER FINAL - HIERARCHY IN LOOK; FNDSYM RESOLVED
37 CONTINUING FINAL - SCATTERED BUGS
40 FIX AC LONG ASCII AND RASCII
FIX - LOCATE FOR LOCALS OUTSIDE OPEN
FIX - DIM A(X(1)/1)
41 FIX USAGE OF PROGRAMS NAMED OTHER THAN MAIN.
42 INITIALIZE ODF (NUMERIC BASE) FOR GROUP TYPEOUT
43 ADD CURGRP (BIT MASK ) TO NOTE CURRENT GROUPS
ACTIVE IN A TYPEOUT AND CATCH RECURSION
44 FIX UP "LOOK" SO THAT IF "MATHSM" IS NON-0 THAT IT
WILL ACCEPT ONLY A SYMBOL WHOSE NAME IS IN "MATHSM"
45 FIX PAUSE TYPING TO LISTEN TO TTY BETTER
46 CHECK RANGES TO SEE THAT EACH SYMBOL IS THE SAME
***** Begin Version 4A *****
47 DIFFERENTIATES ASCII- AND RASCII-MODE "TYPE"-OUTPUT
50 ALLOWS = AS DELIMITER IN ACCEPT STATEMENTS
51 FIXES "HELP" TO LIST COMMANDS
52 FIX TYPEOUT OF COMPLEX VALUES
53 15732 FIX TYPOUT OF SYMBOL WHEN LOCAL SYMBOL FOUND BEFORE GLOBAL
54 15732 ***** DELETED *****TYPE OUT NAMES OF ARGUMENTS WHEN PAUSE AT
ROUTINE
55 15708 MAKE TYPE KNOW ABOUT FORMAL ARGUMENTS
***** Begin Version 4B *****
56 16928 ACCEPT LOWER CASE MODE MODIFIERS
57 17043 IF TWO SYMBOLS HAVE SAME ADDRESS VALUE AND SAME
NAME VALUE , THEN THEY MUST BE IN COMMON , SO LOOK
SHOULD SUCCEED (OK SKIP 2 RETURN)
ALSO REMEMBER NAME OF ARRAY FOR DIM COMMAND.
60 17272 IF ARRAY INFORMATION DOES NOT EXIST, TELL THE USER
BUT DO NOT GIVE FDTIER ERROR.
61 17574 IF ERROR HAPPENS IN TYPING GROUP, CURRENT GROUP VARIABLE
IS NOT CLEARED AND LATER GIVES ERROR FDTRGR.
62 18059 ADD INFORMATION IN THE "WHAT" OUTPUT
(LOCATION OF THE PAUSE LABEL)
63 18374 GIVE CORRECT INFORMATION FOR "WHAT" COMMAND:
SINGLE VARIABLE NAME + ARRAY NAMES AND SUBSCRIPT
+ LOCATION OF NAMES
64 S19206 DONT TYPE EXTRA CRLF BETWEEN TYPED VALUES.
65 18715 ACCEPT COMMENTS ON COMMAND LINES
DELIMITER IS ! TO END OF LINE OR OTHER !
66 --- FIX TEST FOR ARRAY BOUNDS EXCEEDED IN DIM COMMAND
67 19541 FIX LOWER CASE RANGE CHECK
70 QA570 FIX REENTER MESSAGE TO ALWAYS GIVE SECTION NAME
***** Begin Version 5A ***** 7-Nov-76
71 20553 TYPING A FORMAT STATEMENT CAUSES AN E8 INTERNAL
ERROR IF THE PROGRAM WAS NOT COMPILED WITH THE
/DEBUG SWITCH. ADD MORE INFORMATIVE ERROR MESSAGE
AREAS AFFECTED: FRMSET, ERR41
72 10088 WHEN TYPING AN ARRAY, THE INDEXES ARE NOT CORRECTLY
TYPED IF AND ONLY IF THE IS A HIGH SEGMENT SYMBOL
TABLE (FOR EXAMPLE FOROTS IS LOADED WITH SYMBOLS).
73 21818 WHEN TYPING A COMPLEX ITEM OR ARRAY, OR ACCEPTING A
VALUE FOR A COMPLEX ARRAY, FORDDT DOESN'T NOTICE THAT
EACH ENTRY IS TWO WORDS AND MESSES UP SUBSCRIPTS ETC.
74 21988 FORDDT CANT SET BREAK POINTS (PAUSE) IN HIGH SEGMENT
OF A FORTRAN PROGRAM. ROUTINE CHKADR CLOBBERS (T)
75 21910 WHEN DOING A START, PROGRAM SHOULD CLEAR
ANY SUPPLIED ARGUMENTS FROM THE TTY BUFFER.
76 21910 FIX ERROR IN ACCEPT ROUTINE WHICH CAUSES UNNECESSARY
WARNING MESSAGE WHEN EXACTLY 5 (OR EXACTLY 10 IF IN
LONG MODE) CHARACTERS ARE ACCEPTED
77 21910 MAKE THE PAUSE COMMAND WITH NO ARGUMENTS DISPLAY
THE PAUSES.
100 Add TOPS20 conditional, make FORDDT run in native
mode under TOPS-20.
101 QA2171 FIX FORDDT OUTPUT TO USE FOROTS CORRECTLY AFTER OTS EDIT
661: OUTPUT MUST START WITH + AND CLEAR TTY BUFFER
AFTERWARDS
***** Begin Version 5B ***** 8-Nov-77
102 11018 PREVENT LOOP IF SYMBOL TABLE HAS BEEN BLT'ED TO
ZERO, AS CAN HAPPEN WITH AN OVERLAID PROGRAM.
103 QA2182 PUT "SEARCH MONSYM" FROM EDIT 100 UNDER "IFN TOPS20"
AND MOVE IT TO AFTER THE DEFINITION OF TOPS20
104 24427 PREVENT ILLEGAL MEMORY REFERENCE IF SYMBOL TABLE ENDS
EXACTLY AND THE END OF LEGAL MEMORY.
105 11395 HANDLE TYPE WITH MULTIPLE ARGUMENTS. FORDDT WAS
BLOWING UP IF FIRST ARG WAS FORMAL ARRAY, BECAUSE
FORMAL ARRAY FLAG NEVER GOT CLEARED.
106 25207 CHANGE FDTNAR NOT AN ARRAY TO FDTNAA. THIS AVOIDS
CONFLICT WITH FDTNAR NOT AFTER REENTER.
107 FIX SYMBOL SEARCH TERMINATION TEST (OFF BY 2).
110 25384 FIX TYPE OF A FORMAL ARRAY IN SMALL PROGRAMS.
111 11839 ACCEPT STMNT EATS FIRST CHARACTER OF INPUT VALUE
112 27201 MAKE USE OF TYPEOUTS AND MODE CONTROL MORE CONSISTANT
113 12316 RESTRICT USE OF DOUBLE PRECISION IN CONDITIONALS
114 ----- CLEAN UP SOME TOPS-20 CODE: IMPLEMENT NONTRIVIAL DDT
COMMAND, FIX HALTF WHEN COMND JSYS GIVES AN ERROR
RETURN, REMOVE SOME REDUNDANT CODE IN LISTEN
115 ----- GET VMDDT ON TOPS-10 WHEN DDT ISN'T LOADED WITH PROG
116 28581 Implement use of logicals (.TRUE. and .FALSE.) in
PAUSE conditionals.
117 ----- Make error messages upper and lower case /BPK
120 ----- Implement logicals into ACCEPT, MODE and TYPE statements
using the flag "/L". "/L" was previously used
to specify long (ie. two word) ASCII, RASCII and OCTAL
values in the ACCEPT and MODE commands. This switch
has been changed to "/B", mnemonic for "BIG".
121 ----- Fix -20 code to clear bad lines properly.
122 ----- Set .JBDDT when VMDDT is pulled in to prevent overflow
warnings from FOROTS.
123 ----- Prevent infinite loop on TOPS-20 if .JBHSO is 0 but
.JBHRL isn't.
124 ----- Fix logical TYPEing so that all positive values are .FALSE.
and all negative values are .TRUE.
125 ----- Add a new entry point (%FDDT) to be used when returning
from DDT in place of .F10 (which will still work).
126 ----- Add ?FDT prefix to COMND JSYS error messages.
127 ----- Call FOROTS routine DEC. to interpret real, integer,
complex, and double precision numbers instead of IN. .
130 ----- Call HELPER to print out FORDDT.HLP when the HELP command
is issued.
131 ----- Search universal FDDT20 to define TOPS20 instead of
defining it within FORDDT.
132 29363 Fix various problems that occur when core file is filled
during GROUP and TYPE commands.
133 29261 Fix up error handling when reading program name.
Use command JSYS when reading program name on -20.
134 ----- PAUSE sometimes hangs if a line terminator is typed in an
inappropriate place. Fix it.
135 ----- When looking up symbol in symbol table, make sure we
compare the whole symbol and not just the right half-word
136 ----- PAUSE command doesn't allow comments in all places.
fix it.
***** Begin Version 6 ***** 9-Jun-80
137 ----- Add G-floating capability for input/output. Use of G-floating
is determined at initialization time by the presence
of the symbol "..GFL.". If ..GFL. is missing, default
to D-floating. If ..GFL. is present, use G-floating.
140 ----- Fix COMND trailing space problem. On the -20, the COMND JSYS
is used to parse the first keyword. COMND supplies an extra
space which makes FORDDT think that there are arguments
following the keyword. This bug fix edits the COMND text buffer
before doing a RSCAN JSYS and passing it to FORDDT's parsing
code. It appropiately skips over comments. /DCC 3-July-80
141 ---- Fix G-floating bug. Symbol ..GFL. was changed to a deleted
output global symbol, breaking FORDDT's symbol lookup routine.
One line patch at: EVAL1. Replace existing line with
MOVSI R,GLOBAL!DELO /DCC 5-August-80
142 ----- Use the new FOROTS routine to get high-segment symbol table
pointer. This is in case the high segment is protected.
Make sure HELPER gets loaded into the low-seg and that we
look for it on REL: on TOPS-10. Fix up some error messages.
Relocate univeral searches.
143 ----- Assume that FOROTS and FORLIB are loaded from now on. So
remove almost all the SKIPIF macro calls. This also fixes
the problem of GHSSYP recursively calling itself.
144 QA5031 Change output format to suppress FOROTS's CR, as FORDDT types
a CR also. Also remove FORBUF, which is now unnecessary.
145 ----- Make FORDDT the entry point for FORTRAN users who wish to
call FORDDT as an error routine. SFDDT is the new entry
point for initializing FORDDT (including reseting all files
opened by FOROTS). SFDDT replaces the old FORDDT symbol.
Replace FORBUF.
NOTE: Since FORDDT is now a global symbol, users should be
careful if they decide to use the label FORDDT as a program,
subroutine or function name.
146 ----- New calling sequence for FOROP.
147 ----- Fix up help code so that we get FORDDT.HLP ourselves instead
of using HELPER. This way FOROTS' data will not get stomped
on. Conditionalize out the old code for the time being.
Redefine AC0 to be accumulator 0 and redefine the memory
location previously defined as AC0 to be SAVACS. Also,
remove universal file FDDT20.
150 ----- Change so that all JSYSs consistently end with a percent sign
(%). Also clean up the listing a bit (e.g., change PAGE
pseudo-ops to form-feeds, delete definitions already defined
in UUOSYM, etc.).
151 16084 FORDDT always flags lowercase on ASCII typeout. On TOPS20,
don't do any flagging--the monitor and user commands will do
it. On TOPS10, if the terminal is set to uppercase, flag the
lowercase character; if it is set to lowercase, don't do any
flagging (default is no flagging).
152 Q20-1675 Prevent FORDDT from getting arithmetic overflows in its
symbol offset calculation.
153 ----- Report what is assembling (TOPS10 or TOPS20). Also PURGE
some symbols which my conflict with users' subroutine names.
154 ----- Move setting .JBREN to before the call to RESET. Use a
different mechanism for detecting multiple REENTER entries.
***** Begin Version 7 *****
155 ----- Change START2 to look for global symbol instead of program
name when finding START address, since there can now be
character descriptors in front of executable code. (BL)
Change also in GETPRG.
156 ----- Fix bug in ACCEPT code...when ACCEPTing /ASCII/BIG input
into a range of double precision array elements, the
second word of the last element within the range was
not ACCEPTed, due to RANGE being set to the address of
the first word of the element. (BL)
157 ----- Lots of code to make FORDDT TYPE and ACCEPT character
scalars and arrays.
160 ----- Make character scalars work again.
161 ----- Fix problem recognizing character arrays using /DEBUG.
162 ----- Enable type-out of character strings at PAUSEes.
Also insert check for G-floating arrays in RAYNAM
F10-array-checking.
163 ----- Insert new address-checking code: allow R/W to low-
segment, R only from High-segment.
Array range checking now done only if array pointer
is in symbol table (if compiled /DEBUG).
Inserted <widgets> around (most) error messages.
164 ----- Fix bug in multiple type-out modes.
165 CDM 1-Sept-82
Change
TRNE T5,1B13
to
TRNE T5,(1B13)
to make it assemble without warnings.
166 BL 3-NOV-82
Eliminate check of indirect bit in CKBPTR...it was failing legal
byte pointers
167 BL 3-Nov-82
Insert code to simulate V6 EDIT 155...we were getting array type-out
failures on formal arrays
170 BL 17-Nov-82
Change a TLNE to a TRNE in OFFSET, so we test the correct output mode
options.
Change test of return instruction in START4 so that it tests the
instruction, not the address of its storage location. This was
causing a subroutine which had been entered via a NEXT to be repeated
if a GOTO was then performed.
171 BL 18-Nov-82
Merge in V6 EDIT 165...fix problems with TYPE of variables in
COMMON.
172 BL 2-Dec-82
Reinstate the check of the indirect bi in CKBPTR...but do it right!!!
173 BL 12-13-82
Move swapping of local and default type-out modes in DISP10 so that
OFFSET is called with the right option. (was causing inaccurate
subscripts).
174 BL 7-Jan-83
Move %FDDT (reentry from DDT) so that user-modes are not reset.
175 BL 11-Jan-83
typo at DISP10+4.
176 BL 13-Jan-83
Revise EDIT 174 so that %fddt still performs everything except the
resetting of modes.
***** End V7 Development *****
;.BEGINR ***** Begin V7 Maintenance *****
;.COMPONENT FORDDT
;.VERSION 7
;.AUTOPATCH 7
;.EDIT 177 ALLOW " = " CONSTRUCTS IN ACCEPT,IMPLEMENT ERR= DECODE CALLS
;; Since "ACCEPT A=3" is allowed (although a user error), also allow
;; "ACCEPT A = 3" style constructs. Push a 'STOP!!' billboard on FORDDT's
;; stack so FORERR's PC finder will not loop. Install an ERR= argument
;; for calls to DECODE so truly illegal arguments passed to FOROTS will
;; not abort debugging.
; TGS,09-APR-83,SPR:20-19167
; A:SRC FORDDT.MAC
;.EDIT 200 ACCEPT NAME/MODE<CR> HANGS
;; ACCEPT Name/Mode<CR> hangs waiting for another CRLF. Treat this and
;; other cases where ACCEPT command lines terminate without any value
;; supplied by the user as cases of bad syntax.
; TGS,14-JUN-83,SPR:NONE
; A:SRC FORDDT.MAC
;.EDIT 201 PROBLEM TYPING VARIABLE NAME WHEN SAME AS PROGRAM NAME
;; If the PROGRAM name is the same as a variable name, then TYPEing
;; the variable name yields "MAIN PROGRAM(1) = " etc.
; TGS,22-JUL-83,SPR:10-34002
; A:SRC FORDDT.MAC
;.EDIT 202 1+NTH ARRAY NAME TYPED OUT AS "PAT..(n)"
;; Typing an array on TOPS10 will garble the 2nd through nth array
;; element name, typing it as PAT..
; TGS,28-JUL-83,SPR:10-34001
; A:SRC FORDDT.MAC
;.EDIT 203 PROBLEMS AFTER PAUSING AT MAIN.
;; Setting a breakpoint at MAIN. will cause an ?Ill mem ref on
;; TOPS10 as soon as the program is STARTed. On TOPS20 a private
;; page may be created; in addition, a subsequent STRACE after
;; the START will loop, finally getting an ?Ill instruction.
; TGS,29-JUL-83,SPR:NONE
; A:SRC FORDDT.MAC
;.EDIT 204 GARBLED ENTRY NAME ON TOPS20 CALL TO FORDDT
;; On TOPS20, having found a valid offset during a low-seg symbol
;; table search, do not then search the hiseg symbol table as well.
; TGS,1-AUG-83,SPR:NONE
; A:SRC FORDDT.MAC
;;.ENDA 7-SEP-83
;.EDIT 205 ACCEPT/S ECHO TYPEOUT ALWAYS IN FLOATING POINT
;; ACCEPT/S <var> will always echo in floating point format, regardless
;; of the current MODE setting.
; TGS,19-SEP-83,SPR:10-34142
; A:SRC FORDDT.MAC
;;.ENDA 3-OCT-83
;;.ENDA 31-OCT-83
;;.EDIT 206 RESERVED FOR AUTOPATCH
;.ENDA
;.AUTOPATCH 8
;;.ENDA 27-DEC-83
;;.ENDA 20-JAN-84
;;.ENDA 16-FEB-84
;.EDIT 207 NOOP EDIT TO UPDATE OUR VERSION
;; Update the edit number and thereby teach Autopatch to update it
;; also. No code changes.
; TGS,24-FEB-84,SPR:NONE
; A:SRC FORDDT.MAC
;;.ENDA 23-MAR-84
;;.ENDA 26-APR-84
;.ENDA
;.AUTOPATCH 9
;;.ENDA 18-MAY-84
;.EDIT 210 FIX COMPLEX ARRAY TYPE OUT
;; Recognize a complex array as a double word array.
; MRB,5-JUN-84,SPR:20-20178
; A:SRC FORDDT.MAC
;.EDIT 211 WARN IF WE CAN'T HACK IWI ERRORS FROM FOROTS
;; FORDDT can't do anything useful if the user has set a breakpoint
;; in an IOLST function call, since any TYPE or ACCEPT command will
;; call FOROTS, thus getting an "I/O within I/O" (IWI) error. Check
;; at breakpoint processing by calling FO$UDB FOROP and warn if this
;; breakpoint is "restricted". Type an error if the user tries to
;; ACCEPT or TYPE under IWI conditions.
;; NOTE: This edit must not be installed unless FOROTS Edit 3432 has
;; been installed.
; TGS,7-JUN-84,SPR:20-20133
; A:SRC FORDDT.MAC
;.EDIT 212 MONSYM "ENDSTR" CONFLICT
;; Change label ENDSTR, as it may conflict with future releases of
;; MONSYM and give a compilation error.
; TGS,22-JUN-84,SPR:NONE
; A:SRC FORDDT.MAC
;;.EDIT 213 RESERVED FOR AUTOPATCH
;;.EDIT 214 RESERVED FOR AUTOPATCH
;;.ENDA 22-JUN-84
;.EDIT 215 HACK AN OFFSET WHEN NEXTING WITHOUT LOCAL SYMBOLS
;; If a program or program unit has been loaded /NOLOCALS, and
;; the user tries to NEXT from a global pause, don't give up
;; with FDTIER #7 when trying to print the label or source line.
;; Use the offset returned by LOOK instead.
; TGS,28-JUN-84,SPR:10-34742
; A:SRC FORDDT.MAC
;;.EDIT 216 RESERVED FOR AUTOPATCH
;;.ENDA 19-JUL-84
;.EDIT 217 TYPE CHAR(VAR)/C TYPES VAR(1)...
;; Each time SYMIN reads a variable it stores the symbol pointer in
;; CRYSYM for special character array typeout. Since CHAR(VAR) forms
;; of variables will cause routine EITHER to call SYM2 recursively,
;; CRYSYM will be left pointing to the subscript instead of the array
;; name, causing OFFSET to type the wrong name.
; TGS,2-AUG-84,SPR:10-34776
; A:SRC FORDDT.MAC
;;.EDIT 220 RESERVED FOR AUTOPATCH
;;.ENDA 16-AUG-84
;;.ENDA 20-SEP-84
;.ENDA
;.AUTOPATCH 10
;.EDIT 221 NOOP EDIT TO UPDATE OUR VERSION
;; Update the edit number and thereby teach Autopatch to update it
;; also. No code changes.
; MRB,19-OCT-84,SPR:NONE
; A:SRC FORDDT.MAC
;;.ENDA 19-OCT-84
;.EDIT 222 ACCEPT VAR/C MAY NOT DISPLAY NEW VALUE
;; If the ACCEPTed string exactly fills the variable, the ACCEPT
;; command does not display the new value.
; TGS,27-NOV-84,SPR:10-34962
; A:SRC FORDDT.MAC
;.EDIT 223 TYPING FORMAL ARRAY PARAMETERS LACK SUBSCRIPT
;; A request to TYPE a formal array will type all subscripts
;; except the first; a one-shot TYPE request (e.g. TYPE ARRAY(2))
;; will thus not show which subscript is being typed.
; TGS,7-DEC-84,SPR:10-34961
; A:SRC FORDDT.MAC
;;.EDIT 224 RESERVED FOR AUTOPATCH
;;.ENDA 26-DEC-84
;;.ENDA 16-JAN-85
;.ENDA
;.ENDV
;.ENDR ***** End V7 Maintenance *****
***** Begin V10 Development *****
300 EXTENDED ADDRESSING DEVELOPMENT
Many changes:
Modify breakpoint table layout and handling.
Address arithmetic changes.
Extended FOROTS calls.
Misc cleanup.
BCM,18-JUN-84
301 ARRAY DEFINITION TABLE HAS GLOBAL INDICES
The DIMTAB table is expanded to have three-word entries,
and all entries contain global indices.
The definition of the entries have symbolic names.
References to the entries are changed from half-word
to full-word.
Miscellaneous cleanup.
AlB,26-Jun-84
302 HELP COMMAND REQUIRES ONE-WORD GLOBAL BYTE POINTER
The HELP command requests the allocation of core memory from
the FOROTS ALCOR. routine. That routine returns a global
address, and thus the FORDDT HELP command must turn it into
a OWGBP in order to get at the assigned buffer (which could be
in another section under extended addressing).
AlB,27-Jun-84
303 More development fixes
Indirect reference in START4 no good in non-zero.
Bug introduced by edit 170 that showed up in non-zero section.
Address test failed with extra section number in WT15.
Dummy the PC using current section number in STEP4.
Fixed up address arithmetic in AUTOP.
Push an AC instead of hiding on stack in FP7.
BCM,28-Jun-84
304 RECOGNIZE GLOBAL SYMBOLS FOR LOCATE
Fix an indirect reference in QLIST6.
BCM,29-Jun-84
305 VERIFY THE CORRECT ADDRESS FOR BYTE POINTERS
A call to CKWRIT was using the updated byte pointer
after a ADJBP. Changed to use original address for
checking page access.
BCM,9-Jul-84
306 CHECKING LH FLAGS FOR RH VALUE
Old bug that showed up using flag DOUBLE.
BCM,9-Jul-84
307 ADDITIONAL WORK FOR EDIT 301
Needed to correct logic in DISP14 for DOUBLE arrays.
AlB/BCM,9-Jul-84
310 TOPS-10 ADDITIONAL WORK
Fix up EFIW,IFIW definitions for -10.
Fix XJRSTF in RESTOR to have only RH of PC and not get flags.
BCM,17-Jul-84
311 CANNOT PAUS/GOTO/START AT SOME LOCATIONS
Insufficient check for FORMAT statement disallowed some legal
breakpoints. Fix to check second ascii character for being
a control character, and if so, assume its NOT a FORMAT statement.
BCM,17-Jul-84
312 Fix ERR branch & Page access bug in CKWREX.
BCM,25-Jul-84
313 Development edit. Make extended code work with FORDDT. See spec
for details.
BCM,16-Aug-84
314 Get rid of all references to NEARST.
Clean up the LOOK routine.
AlB,23-Aug-84
315 Change the search of the symbol table which looks for the name of
the main program. Instead of looking for a program name of 'MAIN.',
use the program which contains the global value 'MAIN.'.
AlB,24-Aug-84
316 Change the START mechanism such that the main program could be
in a section other than the one in which FORDDT is loaded.
AlB,24-Aug-84
317 Add a three-word entry vector for Tops-20.
The use of .JBREN is retained for Tops-10.
AlB,24-Aug-84
320 Prepare for the handling of symbol tables which exist in a section
other than the one in which FORDDT is loaded.
o Add a temporary 'build a symbol vector' routine. This routine
will be removed when a FOROP. call is added to do the same thing.
o Change the SETLST and FIXSYR routines to allow for global indices
into the symbol tables.
o Remove SETLXS, which is no longer needed.
o Modify GHSSYP to take error exit if we are in a non-zero section.
o Modify OVRLAY so as to call SETLST whenever it detects that
.JBSYM has changed.
AlB,27-Aug-84
321 Change the symbol searches to use global addresses.
Essentially, instead of using the JOBDAT IOWD-style symbol table
addresses, we use two words: one is a global address into a
symbol table, and the other is the number of unsearched words.
This change enables the symbol tables to be anywhere in memory.
Also made several miscellaneous changes to reflect the fact that
we may be in a section other than the one in which the symbol
tables reside.
Also fixed some problems with array indices being larger than a
half-word, and with array sizes larger than a half-word.
Also made some changes just because I couldn't stand to look at
some rottenly constructed code ONE MORE TIME!!
AlB,29-Aug-84
322 Fix ACCEPT of character data. When exactly enough characters were
entered for the field, the field was not being displayed in
confirmation.
Fix TYPE of a range of character array elements. Prior to this fix,
only the last element was being TYPEd.
AlB,30-Aug-84
323 Fix BLDVEC to get the correct section number for symbols.
Re-do the handling of optional command switches. It was rather
confusing as written. Now register P3 contains the default settings
in the left half, and the currently active settings in the right half.
AlB,4-Sep-84
324 Fix CONTINUE. LEAV2 was returning to user program via an indirect jump
jump through a bogus location.
AlB,7-Sep-84
325 Add PAUSE ON ERROR command.
MEM,6-Sep-84
326 Remove references to FGLSNM, which was a flag to tell LOOK (a symbol
table lookup) that global symbols are Ok. Since that flag was being
turned off by CPOPJ1 and CPOPJ2, we sometime could not find a global
symbol. Since global symbols are always Ok, we don't need that flag.
Also changed all references to (erroneous) edit number 2460 and
replaced them with 325. Put edit number on all places that were
touched by 325 aka 2460. Fixed bugs in AC save and restore caused
by edit 325.
AlB,25-Sep-84
327 Use the routine in FORLIB which determines the location of the
symbol table. In this way, we are assured that FOROTS/FORLIB and
FORDDT are using the same symbol table.
AlB,25-Sep-84
330 Use the default MODEs when confirming the value ACCEPTed with
modifier /S.
AlB,27-Sep-84
331 Instead of typing message "Pause on error", JRST FORDDT
which will print message "Entering Forddt at..." and then do a
breakpoint 0.
MEM,2-Oct-84
332 Modify pause on error code according to comments made during its
inspection. Make REMOVE remove pause on error and make WHAT
display pause on error if it is set.
MEM,9-Oct-84
333 Fixup problems with edit 321.
BCM,5-Nov-84
334 Change message, when reentering FORDDT from ^C and running extended,
from garbage address to "from FORDDT".
MEM,27-Dec-84
335 Add a TOPS-20 conditional left out of edit 334
JLC,27-Feb-85
***** End V10 Development *****
;.VERSION 10
;.AUTOPATCH 11
;.EDIT 336 NOOP EDIT TO UPDATE OUR VERSION NUMBER
;; No code changes. (See edit 221).
; MRB,9-MAY-85,SPR:NONE
; A:SRC FORDDT.MAC
;;.ENDA 9-MAY-85
;;.EDIT 337 RESERVED FOR AUTOPATCH
;;.ENDA 24-JUN-85
;;.EDIT 340 FORDDT CRUSHES USER ACS
;; SAVACS was being used as scratch in PAUSE, START, and RESET
; PLB,2-JUL-85,SPR:20-20789
; A:SRC FORDDT.MAC
;;.ENDA
;.ENDA
;.ENDV
;.ENDR REVISION HISTORY
***** Begin V11 Development *****
400 Become Version 11.
MRB, 28-Mar-85
401 Add substring support in ACCEPT and TYPE statements.
MEM, 19-Dec-85
402 Add long symbol support. For each FORDDT memory location that stores
a symbol we also have a flag word that is zero if the symbol is short.
When we have a symbol in a register then the LNAME bit of the left
half is lit when the symbol is long.
MEM, 17-Feb-86
403 Correct various error messages and an extended addressing problem.
MEM/MRB, 1-Jun-86
404 CDM 10-Jul-86
Call ERRSET when doing PAUSE ON ERROR, so that the user will
get error/warning messages when his program pauses!
405 MEM 26-Sep-86
In LSPT, check if global address before making OWGBP since KS
can't handle them.
***** End V11 Development *****
***** End Revision History *****
ENDV11
\;END OF COMMENT
SUBTTL DEFINITIONS
;DEFINE ACCUMULATORS
ENTRY FORDDT,FDDT.,.F10,%FDDT
EXTERN .JBREL,.JBHRL,.JBSYM,.JBSA,.JBOPC,.JBDA ;[321]
EXTERN ERRSET ;[404] Set number of ots warnings to receive
IFN EXTHLP,<EXTERN .HELPR> ;[147] for external HELPER
;AC0=<F=0> ;[147] FLAGS
;AC1=<TF=1> ;[147] TEMPORARY FLAGS, RESET ON RETURN TO RET:
;AC2=<R=<T1=<A=2>>> ;[147] POINTERS TO TABLES, CORE, ETC.
;AC3=<S=<T2=<B=3>>> ;[147]
;AC4=<W=<T3=<C=4>>> ;[147] CONTAINS DISPATCH ADDR IN WORD ASSEMBLER
;AC5=<T=<T4=5>> ;[147] TRANSFER DATA
;W1=<T5=6>
;W2=<T6=7>
;TMOD=10 ;TYPE MODE FLAGS
;AR=11
;ODF=12 ;RADIX DEFINITION
;TT=<P3=13> ;TEMPORARY
;TT1=<P4=14> ;TEMPORARY
;RAY.==15 ;POINTS TO NEXT F10 DEFINE ARRAY DIMENSION
;L=16 ;[147] POINTER TO ARGUMENT LIST
;P=17 ;PUSH DOWN
T0==0 ;FLAGS
T1==1 ;TEMPORARY FLAGS, RESET ON RETURN TO RET:.
T2==2 ;POINTERS TO TABLES, CORE, ETC
T3==3
T4==4 ;CONTAINS DISPATCH ADDR IN WORD ASSEMBLER
T5==5 ;TRANSFER DATA
P1==6
P2==7
P3==10 ;[323] Mode flags (default,,active)
P4==11
S1==12 ;RADIX DEFINITION
S2==13 ;TEMPORARY
S3==14 ;TEMPORARY
S4==15 ;POINTS TO NEXT F10 DEFINE ARRAY DIMENSION
L==16 ;POINTER TO ARGUMENT LIST
P==17 ;STACK
;DEFINE SYMBOL TABLE SYMBOL TYPES
; The SECONDARY SYMBOL TABLE which starts at the local symbol .SYMTB in each
; module has its start address stored into SSTAB in FORDDT by the code to OPEN
; the current module. This table starts with a count of the number of entries
; in the right half and the left half is zero if the secondary symbol table
; contains only globals. The first entry in the symbol table (at .SYMTB+1)
; is for the module name. Each entry in the table is two words long. The first
; word has a 3 bit flag field, a 3 bit count of the number of words in the
; symbol name, and a 30 bit address to where the symbol name is stored. The
; second word is the address of the location where the value of the symbol is
; stored.
;
; +-------------------------------------------------+
; .SYMTB: | symtb flag | entry count |
; +-------+------------+---+------------------------+
; | flags | word count | ptr to symbol | First entry is
; +-------+------------+----------------------------+ module name
; | address of value of symbol |
; +-------+------------+---+------------------------+
; | |
; | ... |
; +-------+------------+---+------------------------+
; | flags | word count | ptr to symbol |
; +-------+------------+----------------------------+
; | address of value of symbol |
; +-------+------------+----------------------------+
;
;
;
;
CNTSFT==^D30 ;[402] SHIFT TO GET CNT FROM CNT+PTR FOR LONG NAME
LGLOBL==200000 ;[402] GLOBAL in secondary symbol table
LPNAME==600000 ;[402] program name in secondary symbol table
LFLG== 700000 ;[402] flag field in secondary symbol table entries
; In LINK's symbol table entries are also 2 words long. The first word contains
; a four bit flag field followed by the radix 50 name. The second word in the
; address of the symbol value.
; +-------+------------+----------------------------+
; | flags | radix 50 symbol name |
; +-------+------------+----------------------------+
; | address of value of symbol |
; +-------+------------+----------------------------+
; | |
; | ... |
; +-------+------------+----------------------------+
; | flags | radix 50 symbol name |
; +-------+------------+----------------------------+
; | address of value of symbol |
; +-------+------------+----------------------------+
GLOBAL==040000 ;GLOBAL SYMBOL
LOCAL==100000 ;in ddt and secondary symbol table
PNAME==740000 ;PROGRAM NAME
DELI==200000 ;DELETE INPUT
DELO==400000 ;DELETE OUTPUT
;[137] SYMBOLS REPRESENTING FOROTS ARG TYPES
TP%DPR==10 ;[137] D-floating double precision
TP%DPX==13 ;[137] G-floating double precision
TP%CPX==14 ;[210] Complex
TP%CHR==15 ;[157] Character
FO$HSP==4 ;[142] FOR RETURNING HISEG SYBOL TABLE PTR.
FO$GBA==20 ;[332] GET BREAK ADDRESS
FO$UDB==23 ;[211] FOR RETURNING CONTENTS OF %UDBAD
; DEFINE SYSTEM PARAMETERS
IFNDEF SYMSPC,<SYMSPC==2> ;[402] 1 word for ptr to symbol
;[402] plus 1 word for flag word
IFNDEF NBP,<NBP==^D10> ;NUMBER OF PUASE REQUESTS
IFNDEF GPMAX,<GPMAX==10> ;NUMBER OF GROUP STRINGS (MAX 35 )
IFNDEF PDSIZ,<PDSIZ==10> ;[327] DEFINE PDL SIZE FOR INITIAL STACK
IFG PDSIZ-100,<PDSIZ==100> ;LIMIT SIZE TO ^D64
IFNDEF CFSIZ,<CFSIZ==^D15> ;CORE FILE LENGTH
IFNDEF DIMSIZ,<DIMSIZ==^D50> ;AMOUNT OF SPACE FOR DIMENSION DEFINITIONS
IFNDEF DEBUG,<DEBUG==0> ;KEEP OFF - DEVELOPMENT ONLY - UNSUPORTED
IFN DEBUG< IF1<
PRINTX FORDDT - DEVELOPMENT VERSION
> >
COMMENT \
NBP DEFINE THE MAXIMUM NUMBER OF PAUSE REQUESTS ALLOWED
EACH PAUSE INCREASES CORE REQUIREMENTS BY DECIMAL 10
GPMAX DEFINE THE MAXIMUM NUMBER OF GROUPS
EACH GROUP SETTING REQUIRES AN EXTRA DECIMAL 23 LOCATIONS
PDSIZ DEFINE THE SIZE OF THE PUSH DOWN STACK
ALLOW SUFFICIENT STACK FOR ALL GROUPS TOGETHER
LIMITS PDSIZE TO ^D64
CFSIZ DEFINE THE SIZE OF EACH CORE FILE
DIMSIZ DEFINE THE NUMBER OF ENTRIES
USED TO HOLD ARRAY DIMENSION DATA
ESEFIW location of table of EFIW of JSR's under /EXTEND
SZEFIW Table of the EFIW's referenced by the JSR instruction.
Word 0 points to BP1, word 1 points to BP2, etc. In non-zero
sections, this table will be copied to the address given by ESEFIW.
ESDIEB Location of dispatch instruction execute block under /EXTEND
SZDIEB Table of displaced instruction blocks. In non-zero sections,
this table will be copied to the address given by ESDIEB.
\
ESEFIW==.JBDA+1 ;[313] location of EFIW table
ESDIEB==ESEFIW+NBP ;[313] location of displaced instruction block table
;FLAG F DEFINITIONS, LEFT HALF:
EOL== 400000 ;END OF USER LINE
FPF== 200000 ;PERIOD TYPED FLAG
FEF== 100000 ;EXPONENT FLAG
MF== 040000 ;MINUS FLAG
SIGN== 020000 ;PLUS OR MINUS TYPED
CFLIU== 010000 ;CORE FILE IN USE FLAG
OFCFL== 004000 ;OUTPUT FROM CORE FILE REQUESTED
CONS== 002000 ;CONSTANT SEEN FLAG
GRPFL== 001000 ;GROUP FLAG - ALLOWS GROUP LOGIC
AUTO== 000400 ;AUTO PROCEDE FLAG
OCTF== 000200 ;OCTAL NUMBER TYPED FLAG
;FGLSNM==000100 ;[326] ALLOW GLOBAL SYMBOL NAMES (FOR LOOK AND FINDSYM)
LABEL== 000040 ;INDICATES STATEMENT LABEL BEING PROCESSED
LFTSQB==000020 ;FLAG THAT A [ IS SEEN - SO A ] WILL END THE SPECIFICATION
BAR== 000010 ;FLAG THAT WE HAVE SEEN A / IN DIMENSION ANALYSIS
DIMEND==000004 ; ) OR ] FOUND I.E. END OF DIMENSION SPEC IMINENT
;[321] FPRNM== 000002 ; FIND PROGRAM NAME (FOR FNDSYM)
;[321] FLCLNM==000001 ; FIND LOCAL IN CURRENT OPEN PROGRAM (FOR SYMBOL SEARCH)
;RIGHT HALF
POWF== 400000 ;POWER FLAG # TO FOLLOW
DOUBLE==200000 ;FLAG FOR DOUBLE WORD ARRAY DATA
BASENM==100000 ;AN ARRAY BASE NAME HAS BEEN ACCEPTED
TRLABL==040000 ;TRACING LABEL ONLY FLAG
;[157]PNAMEF==020000 ;PROGRAM NAME SEEN IN SYBOL TABLE SEARCH
CHARS== 020000 ;[157]Character array
MDLCLF==010000 ;USED BY SYMBOL SEARCHES - MULTIPLY DEFINED LOCAL SYBOL
ID== 004000 ;SYMBOL IDENTIFIED FLAG
IDINOS==002000 ;SYMBOL IDENTIFIED IN OPEN SECTION
SILENT==001000 ;DO NOT TYPE SYMBOL IF FOUND IN 'LOOK'UP
SUBFLG==000400 ;SUBSCRIPT FLAG - CHECK SUBSCRIPTS IF ON
FLSHAL==000200 ;FLUSH ALL ARRAY NAMES FROM BASRAY ONWARDS
IDPNAM==000100 ;IF SET CAUSES 'LOOK' TO REMEMBER SECTION NAME
;[314] NEARST==000040 ;IF SET CAUSES 'LOOK' TO RETURN THE NEXT LARGER SYMBOL
F10RAY==000020 ;CURRENT ARRAY IS F10 DEFINED
TRLINE==000010 ;TRACE AT LINES LEVEL
FORMAL==000004 ;HANDLING ARRAY AS SUBROUTINE FORMAL PARAMETER
GFLOAT==000002 ;[137] If set, G-floating is in use; else D-floating.
SURGFL= 000001 ;ACCEPT / AND : AS DIMENSION RANGE DELIMETERS
; *** FLAG T1 ***
;
; T1 TEMPORARY FLAG DEFINITIONS:
; CLEARED ON EVERY RETURN TO USER (RET:)
;
; RIGHT HALF
DCOPFG==000001 ;DON'T CHANGE OPEN PROGRAM FOR GROUP
ALPHA== 000002 ;PERSUADES ROUTINE EITHER TO RETURN SIXBIT ON NON # INPUT
ACCPT== 000004 ;SIGNALS AN ACCEPT IN PROGRESS
ADELIM==000010 ;FLAG THAT WE HAVE HAD AN ASCII TEXT DELIMITER
IMPRNG==000020 ;REQUEST FOR IMPLIED RANGE
ARRAY.==000040 ;AN ARRAY HAS BEEN DETECTED DURING ACCEPT LOGIC
; ALSO DURING TYPE OFFSET PROCESS
GUDLBL==000100 ;A GOOD NUMERIC LABEL FOUND IGNORING LAST CHARACTER
FGLONL==000200 ;FIND GLOBAL SYMBOL ONLY
SYMLAB==000400 ;SYMBOL IS A LABEL
DCEVAL==001000 ;DON'T CALL EVAL ( FROM SYMIN )
COMDEL==002000 ;COMMENT PROCESS IN PROGRESS
LGCLEG==004000 ;[116] LOGICALS ARE LEGAL WHEN FLAG IS ON
ISLOGI==010000 ;[116] WE ARE DEALING WITH A LOGICAL CONSTANT
TYPCMD==020000 ;[171] Processing TYPE
COMDAT==040000 ;[171] COMMON data
LNAME== 100000 ;[402] WE HAVE A LONG SYMBOL NAME IN A REGISTER
; *** FLAG P3 ***
;
; DEFINE THE PRINT OPTION FLAGS USED IN LEFT & RIGHT OF P3
;[323] LEFT HAND - DEFAULT USER SETTING
;[323] RIGHT HAND - LOCAL TEMPORARY SETTING (TAKES PRIORITY)
F.==000001 ;TYPE FLOATING POINT FORMAT
I.==000002 ;TYPE INTEGER FORMAT
O.==000004 ;TYPE OCTAL FORMAT
A.==000010 ;TYPE ASCII FOMAT
D.==000020 ;TYPE DOUBLE PRECISION FORMAT
R.==000040 ;TYPE RIGHT JUSTIFIED ASCII
X.==000100 ;[157]TYPE COMPLEX FORM
B.==000200 ;[120] 'BIG' OPTION REQUESTED
L.==002000 ;[120] LOGICAL FORMAT (.TRUE. AND .FALSE.) OR TRACE LABELS
C.==004000 ;[157] Character string
S.==000400 ;TRACE SOURCE LINES
E.==001000 ;TRACE ENTRIES
ANYMOD==400000 ;USED BY OPTION TO SHOW LEGAL MODIFIER SEEN
;
; ********** FLAGS FOR LEFT HALF OF COND0 **********
LFTLOG==000001 ;[116] LEFT CONSTANT IN CONDITIONAL WAS LOGICAL
RHTLOG==000002 ;[116] RIGHT CONSTANT IN CONDITIONAL IS LOGICAL
;FLAG T0 - "STICKY FLAGS"
STIKYS==TRLABL!TRLINE!GFLOAT ;[137] Add "GFLOAT" to mask to be
;[137] "and"ed with STKYFL at RET:
; USEFUL OPDEFS
OPDEF PJRST [JRST] ;PUSHJ/=POPJ
; POSSIBLE ERROR MESSAGES OF THE FORM ? E#
; THE ASSOCIATED ERROR MESSAGE IS:
; ?FDTIER Internal FORDDT error - (number)
;
; ? E1 CANNOT FIND SYMBOLIC NAME FOR THE PAUSE IN A 'WHAT'
; ? E2 CANNOT FIND SYMBOLIC NAME FOR THIS PAUSE(BREAK)
; ? E3 CANNOT FIND SYMBOLIC NAME FOR AN ARGUMENT OF THE
; ROUTINE ABOUT TO BE ENTERED
; ? E4 BAD LABEL FOUND WHERE SOURCE LINE OR STATEMENT LABEL EXPECTED
; ? E5 CANNOT FIND SYMBOL IN DIMENSION LOGIC
; ? E6 CANNOT FIND SYSMBOL MATCH IN A RE-ENTER
; ? E7 CANNOT FIND SYMBOL IN A TRACE INTERUPT
; ? E8 CANNOT FIND END OF F10 FORMAT STATEMENT = LABEL+F
; THESE ERRORS SHOULD NEVER OCCUR - BUT COULD INDICATE THAT
; THE SYMBOL TABLE HAD BEEN MODIFIED(OVERLAYED?) OR SOMETHING
SUBTTL MACRO'S
;[325] Removed SETPDL
; Each FORDDT symbol is stored as follows:
; The first word may either contain a radix50 name or it may contain a 6 bit
; word count for the length of the symbol followed by a 30 bit address of the
; symbol (which is actually .+2). The symbol is long if the LNAME bit in the
; left half of the flag word is set.
;
; +------------------------+
; | wordcount| ptr to name | or radix50 name
; +------------------------+
; | flag name |
; +------------------------+
; | symbol name |
; | ... |
; +------------------------+
;
;
;
DEFINE CLRFLG(SYM)
<SETZM SYM+1>
DEFINE SETFLG(SYM)
<SETOM SYM+1>
DEFINE GETFLG(REG,SYM)
<MOVE REG,SYM+1>
DEFINE SYMSKN(SYM)
<SKIPN SYM+1>
DEFINE SYMSKE(SYM)
<SKIPE SYM+1>
DEFINE LDFLG(SYM)
< TRZ T1,LNAME ; Clear long symbol flag
SKIPE SYM+1 ; Is this a long symbol?
TRO T1,LNAME ; Yes, so set long symbol flag
>
DEFINE LDSYM(REG,SYM)
< MOVE REG,SYM ; Load long symbol into register
TRZ T1,LNAME ; Clear long symbol flag
SKIPE SYM+1 ; Is this a long symbol?
TRO T1,LNAME ; Yes, so set long symbol flag
>
DEFINE STSYM(REG,SYM)
< MOVEM REG,SYM ; Store symbol into memory
SETZM SYM+1 ; Assume symbol was short
TRNE T1,LNAME ; Was symbol long?
SETOM SYM+1 ; Yes, so set long symbol flag
>
DEFINE MOVSYM(SYM1,REG,SYM2)
< MOVE REG,SYM1+1 ;Copy flag word
MOVEM REG,SYM2+1
MOVE REG,SYM1 ;Copy symbol
MOVEM REG,SYM2
>
DEFINE QUERY
< TYPE (? ) >
ife tops20,<
DEFINE TYPE(X)
< OUTSTR [ASCIZ/X/] >
DEFINE LINE
< OUTSTR CRLF >
define atype(x)
< outstr x >
define stype(x)
< outstr [asciz x]>
define tab
< outstr [byte(7)11,0] >
define openp
< outstr [byte(7)"(",0] >
define closep
< outstr [byte(7)")",0] >
define openb
< outstr [byte(7)74,0] >
define closeb
< outstr [byte(7)76,0] >
define putchr(x)
< outchr x>
> ;end of conditional
ifn tops20,<
define type(x)
< push p,T1
hrroi T1,[asciz/x/]
psout%
pop p,T1 >
define atype(x)
< push p,T1
hrroi T1,x
psout%
pop p,T1 >
define stype(x)
< push p,T1
hrroi T1,[asciz x]
psout%
pop p,T1 >
define line
< push p,T1
hrroi T1,[byte(7)15,12,0]
psout%
pop p,T1 >
define openp
< push p,T1
hrrzi T1,"("
pbout%
pop p,T1 >
define closep
< push p,T1
hrrzi T1,")"
pbout%
pop p,T1 >
define openb
< push p,T1
hrrzi T1,74
pbout%
pop p,T1 >
define closeb
< push p,T1
hrrzi T1,76
pbout%
pop p,T1 >
define tab
< push p,T1
hrrzi T1,11
pbout%
pop p,T1 >
define putchr(x)
< push p,T1
move T1,x
pbout%
pop p,T1 >
> ;end of conditional
DEFINE SKIPIF(STRING) ;IS STRING LOADED? - SKIP IF IT IS
< MOVE T5,[SQUOZE 0,STRING] ;GET RAD50 FORM OF 'STRING'
PUSHJ P,FINDST ;SEE IF STRING IS LOADED>
DEFINE PROGIF(NAME) ;IS NAME LOADED? SKIP IF SO
< MOVE T5,[SQUOZE 0,NAME]
MOVEM T5,SYM
PUSHJ P,FINDP > ;[321]
; RECURSION MACRO'S
;
; MACRO -RECURS- TO SAVE RELEVANT INFORMATION TO
; ALLOW RECURSION
; CALL SRUCER TO RESTORE
DEFINE RECURS(X)
< XLIST
IRP(X)< PUSH P,X>
DEFINE SRUCER<NAMLST <X> >
LIST >
DEFINE NAMLST(X)
< ..A=100
IRP(X)<DO(\..A,X)>
..A=..A-1
IRP(X)<UNDO(\..A)>
PURGE ..A >
DEFINE DO(I,J)
< ..K'I=J
..A=..A+1 >
DEFINE UNDO(I)
< XLIST
POP P,..K'I
..A=..A-1
PURGE ..K'I
LIST >
DEFINE JUSTIFY ;JUSTIFY THE OUTPUT & RESET T5
< PUSHJ P,JUSTFY ;DO TYPE COMMAND OUTPUT JUSTIFICATION>
SALL ;SUPPRESS ALL MACRO EXPANSIONS
DEFINE NAMES<
XLIST
C ACCEPT,ACCEPT
C CHARAC,CARRAY
C CONTIN,CONTIN
C DDT,DDT
C DIMENS,DIM
C DOUBLE,DUBLE
C GROUP,GROUP
C GOTO,GOTO
C HELP,HELP
C LOCATE,Q
C MODE,MODE
C NEXT,NEXT
C OPEN,OPEN
C PAUSE,PAUSE
C REMOVE,RESET
C START,START
C STOP,EX.
C STRACE,TRACE
C TYPE,DISPLA
C WHAT,WHAT
LIST
>
SUBTTL INITIALIZATION
; Below are all valid entry points to FORDDT except for the entry
; to FORDDT caused by a PAUSE. The PAUSE entry is a JSR into the table
; at BP1. This table's index is a function of the breakpoint number.
; From there a JSA to BCOM is performed.
; This entry point is used when stepping through a user program
; using the NEXT command. If a NEXT has been issued, PUSHJ P,STEP4
; will be placed in FDDT.. An XCT FDDT. is performed at the beginning
; of each executable source statement if the /DEBUG:TRACE option was used.
FDDT.: JFCL ;DEFAULT TO NO TRACE MODE
;OTHERWISE PUSHJ P,STEP4 TO TRACE
; This entry point should be used for reentering FORDDT from DDT.
; The DDT command %FDDT<ESC>G should be used.
%FDDT: ;[176] ADD THIS ENTRY POINT FROM DDT
JSR SAVE ;[176]SAVE USERS ACS
PUSHJ P,REMOVB ;[176]REMOVE PAUSES
JRST MODRT2 ;[176]Re-enter(DDT only...& skip reset of mode)
;[174]%FDDT: ;[125] ADD THIS ENTRY POINT FROM DDT
.F10: JSR SAVE ;SAVE USERS ACS
PUSHJ P,REMOVB ;REMOVE PAUSES
JRST MODRET ;DO A RE-ENTER - FOR DDT ONLY
; A user may CALL FORDDT from his FORTRAN program. This will
; fake a breakpoint. FORDDT must have been run previously, as
; when DEBUG PROG.FOR is used, before the user may call this
; routine. A CONTINUE may subsequently be used to reenter the
; user program.
FORDDT: ;[145] 'CALL' HERE FROM FORTRAN USER PROG
POP P,BP0 ;[145] FAKE JSR TO GET RETURN ADDRESS
SETOM BP0FLG ;[145] REMEMBER WE WERE 'CALL'ED
JRST BP0+1 ;[145]
;[317] The Tops-20 entry vector
ENTVEC: JRST SFDDT ;[317] Normal start address
REENT.::JRST RE.ENT ;[317] REENTER address
Z ;[317] Reserved for user
; This is the entry point when FORDDT is first run. All
; initialization procedures are performed, including a call
; to FOROTS' RESET.
SFDDT:
MOVE P,[IOWD PDSIZ,PDL] ;[327] Stack for use during setup
IFE TOPS20,<
MOVEI T5,RE.ENT ;AND SET UP THE RE-ENTER ADDRESS
MOVEM T5,.JBREN ;[317]
>
IFN TOPS20,<
SETZM EXTEND ;[300] clear the extend flag
XMOVEI T5,. ;[317] Are we in
TLNE T5,-1 ;[317] non-zero section?
SETOM EXTEND ;[300] yes, set the flag
SKIPE EXTEND ;[327] In non-zero section?
HLL P,T5 ;[327] Yes--Set section in stack pointer
>
JSR SAVE ;[145] SAVE THE WORLD
PUSHJ P,REMOVB ;REMOVE ANY STANDING PAUSE REQUESTS
LINE
TYPE(STARTING FORTRAN DDT)
LINE
JSP 16,FINIT.## ;[325] INITIALISE THE FOROTS SYSTEM
0,,0 ;[142] DUMMY RESET ARG
MOVEM P,SAVACS+17 ;[326] So that RESTOR has something
PUSHJ P,SETLST ;[320] Set up symbol vector
IFN TOPS20,<
SKIPE EXTEND ;[300] non-zero section?
JRST FORDX1 ;[300] yes, get extended addrs symbol table
>
HRRZ T5,.JBSA ;REMEMBER THE START ADDRESS
MOVEM T5,JOBSA ; AND THE
MOVE T5,.JBSYM ; SYMBOL TABLE DETAILS AT THE-
MOVEM T5,JOBSYM ; TIME FORDDT IS ENTERED
ife tops20,< ;This hack doesn't work under TOPS20
MOVE T5,[XWD -1,3] ;GET THE CURRENT JOB
GETTAB T5, ; NAME
CAIA ;DON'T PANIC IF NO JOB NAME
MOVEM T5,JOBNAM ;AND SAVE,
;THIS WILL SERVE TO DETECT OVERLAYS
SETZM TTYLC ;[151] DEFAULT TO DON'T FLAG LOWERCASE
MOVNI P2,1 ;[151] GET CURRENT JOB'S CONTROLLING TERMINAL UDX
TRMNO. P2, ;[151]
JRST FORDD2 ;[151] ERROR. DEFAULT TO NO FLAGGING OF LOWERCASE
MOVEI P1,.TOLCT ;[151] TRMOP. FUNCTION TO READ LOWERCASE SETTING
MOVE T5,[2,,P1] ;[151] SET UP TRMOP. CALL
TRMOP. T5, ;[151]
JRST FORDD2 ;[151] ERROR. ASSUME LOWERCASE. DOESN'T FLAG LC
MOVEM T5,TTYLC ;[151] STORE THE SETTING
FORDD2: ;[151]
> ;END OF IFE TOPS20
IFN TOPS20,<
JRST FORDX2 ;[300] skip this stuff if not extended
FORDX1: MOVEI T1,ESEFIW ;[320] GET THE NON-ZERO VALUE
MOVEM T1,EFIWAD ;[313] STORE IT FOR LATER USE
MOVEI T1,ESDIEB ;[313] GET THE NON-ZERO VALUE
MOVEM T1,DIEBAD ;[313] STORE IT FOR LATER USE
XHLLI T1,. ;[313] SECTION # IN LH
HRLZI T2,-NBP ;[313] SETUP LOOP CNTR
FORDXL: HLLM T1,SZEFIW(T2) ;[313] STORE SECTION #
AOBJN T2,FORDXL ;[313] INCR AND LOOP
FORDX2:
>
XMOVEI T5,[JRST RET] ;[313] GUARD AGAINST CONTINUE AFTER CNTRL C
MOVEM T5,PROC0 ;[313] STORE FULL ADDRESS
MOVEI T5,1 ;RESET THE INITIAL TRACE VALUE
MOVEM T5,STPVAL ; TO ONE
SETZM STARTU ;[316] User must 'START'
PUSHJ P,RE.NTR ;ALLOW A RE-ENTER TO WORK
SETOM ESCAPE ;NO ^C'S SO ALLOW ESCAPES TO FOROTS
; RE - ENTER ENTRY
RE.RET: ;[326] Removed SETPDL
SKIPIF (CEXIT.) ;
SETZM T5 ;NO CLUDGE CONECTIONS IN THIS PROG
HRRM T5,HELLO ;SET UP FOR HELLO MACRO DETECTOR
MOVE T0,STKYFL ;REINSTATE THE FLAG REGISTER
;[137] This routine provides g-floating
;[137] capability to those programs
;[137] compiled with the /gfl switch.
TRZ T0,GFLOAT ;[137] Default to d-floating mode.
TRO T1,FGLONL ;[137] Search for globals only in sym table
MOVE S3,[SQUOZE 0,..GFL.] ;[137] Store "..GFL." in SYM for EVAL
MOVEM S3,SYM
PUSHJ P,EVAL ;[137] Search symbol table for "..GFL."
JRST FSET ;[137] Not found, mode is d-floating; done
MOVE T0,STKYFL ;[137] Found, reinstate the flag reg(in case
;[137] T0 was modified by EVAL)
TRO T0,GFLOAT ;[137] Set GFLOAT flag to get g-floating
MOVEM T0,STKYFL ;[137] Update sticky flag store.
FSET: MOVSI T5,(JFCL) ;RESET THE TRACE ENTRY
MOVEM T5,FDDT. ;
MOVE T5,M2.F ;GET THE FOROTS FIN CALL
MOVEM T5,M2.I ;RE-INSTATE IN FORMAT - AFTER COMPLEX INPUT
; SET THE DEFAULT TYPING FORMAT TO FLOATING - ALSO SET STKYFL
MODRET: HRRZI T5,F. ;SET UP TO TYPE FLOATING FORM
MOVEM T5,MODFLG ;SAVE AS THE STANDARD DEFAULT
MODRT2: SKIPE STARTU ;[402] See if already started
JRST RET ;YES - SO NOT FIRST TIME THROUGH
PUSHJ P,MAINF ;[315] Find the main program
CAIA ;[315] Not found
JRST BEGIN3 ;[315] Name is in T4
BEGIN2: PUSHJ P,GETPRG ;NOT FOUND - GET THE MAIN PROGRAM NAME
MOVE T4,[SQUOZE 0,MAIN.];No name -- Use MAIN. as default
;DEFAULT MAIN PROG NAME IS MAIN.
BEGIN3: STSYM T4,PRGNAM ;[402] Store symbol into PRGNAM
MOVEM T4,SYM ;SET SO SETNAM CAN OPEN THE MAIN PROGRAM
PUSHJ P,SETNAM ;'OPEN' THE MAIN PROGRAM
SUBTTL USER INPUT
RET: MOVE P3,MODFLG ;[323] Get the default settings into
HRLS P3 ;[323] both halves
AND T0,[STIKYS] ;MAKE SURE WE SAVE THE GOOD FLAGS
MOVEM T0,STKYFL ; IN THE STICKY STORE
SETZI T1, ;RESET THE TEMPORARY FLAGS
SKIPGE TERMK ;END OF LAST LINE SEEN?
PUSHJ P,CLRLIN ;CLEAR OUT THE REST OF USERS LINE
;[325] Removed SETPDL
CLEARM CURGRP ;CLEAR CURRENT GROUP NUMBERS
CLEARM SYL
CLEARM MATHSM
CLEARM SYM
CLEARM DEN
CLEARM RANGE
CLEARM GETCHR
CLEARM SECSAV ;CLEAR SECTION NAME SAVED
ife tops20,<
SKPINL ;CLEARS THE EFFECT -
JFCL> ; OF ^O, end of conditional
ifn tops20,<
push p,T1 ;save T1
push p,T2 ;save T2
hrrzi T1,.priou ;get terminal output designator
rfmod% ;get terminal JFN word
tlz T2,(tt%osp) ;clear ^o effects
hrrzi T1,.priou ;get terminal output designator
sfmod% ;set new JFN word
pop p,T2 ;restore T2
pop p,T1> ;restore T1, end of conditional
LINE
PUSHJ P,OVRLAY ;HAS AN OVERLAY OCCURED
pushj p,readcm ;prompt and read user command
JUMPE T3,RET ;NO SIGNIFICANT INFORMATION
MOVEM T3,COMAND ;SAVE USER COMAND
JUMPN T2,BADSYN ;COMMAND TERMINOLOGICAL INEXACTITUDE
SKIPGE T2,TERMK ; SPACE IS NOT EOL
TLZA T0,EOL ;CLEAR EOL FLAG
TLO T0,EOL ;SET EOL FLAG
;NOW SEE WHAT USER WANTS!
; ENTER WITH SIXBIT USER COMMAND IN T3
;
; EXIT TO COMMAND IF RECOGNISED AND UNIQUE, OTHERWISE
; DISPATCH TO UNKNOWN OR COMMAND NOT UNIQUE ROUTINES
; N.B. T2 = DISPATCH ADDRESS
; T3 = USER COMMAND NAME
; T4 = OFFICIAL COMMAND NAME
COMCON: MOVE T3,COMAND ;GET USER COMMAND IN T3
MOVEI S2,DISP ;START OF DISPATCH TABLE
MOVE S3,[XWD -DISPL,COMTAB] ;STEP THRO COMMANDS
MOVE T2,T3 ;COPY USER COMMAND
SETOI T5, ;SET ALL ONES MASK
LSH T5,-6 ;SET MASK IN
LSH T2,6 ; T5 TO LENGTH OF
JUMPN T2,.-2 ; USER COMMAND
MOVEI P4,0 ;NO. OF NON-UNIQUE OCURRENCES
MOVE T2,S3 ;AOBJN FOR COMMAND TABLE
COMLP: MOVE T4,(T2) ;GET NEXT COMMAND
TDZ T4,T5 ;MASK OUT FOR MATCH WITH USER
CAMN T3,(T2) ;EXACT MATCH?
JRST COMFND ; YES - THIS IS IT
CAME T3,T4 ;MATCH SO FAR
JRST COMNEQ ;NO MATCH AT ALL
AOS P4 ;FLAG ANOTHER MATCH
HRL S2,T2 ;MARK LAST INDEX
COMNEQ: AOBJN T2,COMLP ;TRIED ALL KNOWN COMMANDS?
JUMPN P4,.+2 ;UNKNOWN?
AOS T2 ;SET FOR NONE UNIQUE
CAIN P4,1 ;WAS THE COMMAND UNIQUE?
HLR T2,S2 ;YES - REMEMBER THIS INDEX
MOVEI S2,DISP ;[303] BASE OF DISPATCH TABLE, AGAIN
COMFND: MOVE T4,(T2) ;SAVE OFFICIAL COMMAND NAME
SUBI T2,(S3) ;INDEX DOWN DISPATCH
ADDI S2,(T2) ;INDEX INTO DISPATCH
MOVE T2,(S2) ;GET DISPATCH ADDRESS
JRST @T2 ; DISPATCH
SUBTTL COMMAND DECODER
DEFINE C(A,B)
< SIXBIT/A/ >
COMTAB: XLIST ;NAMES
NAMES
LIST
DISPL=.-COMTAB
DEFINE C(A,B)
< IFIW B > ;[300]
DISP: XLIST ;HANDLERS
NAMES
EXP NOTUNQ ;COMMAND NOT UNIQUE
EXP ERROR ;UNKNOWN COMMAND
LIST
SUBTTL COMMAND SERVICE MODULES
;STRACE - SUBROUTINE CALLING SEQUENCE TRACE (WALK-BACK)
TRACE: SKIPN SAVACS+17 ;[203] HAS USER INITIALIZED FOROTS?
JRST RET ;[203] NO, JUST RETURN
SKIPN STARTU ;[316] User must
JRST ERR4 ;[316] initialize with START
SKIPN ESCAPE ;ARE WE ALLOWING ESCAPES
JRST ERR30 ;NO TRACE
MOVE T2,16 ;[325] SAVE FORDDT REG 16??
MOVE 16,SAVACS+16 ;[147] - GET FOROTS REG 16
PUSHJ P,TRACE.## ;[143] DO A FORTRAN TRACE
MOVE 16,T2 ;[325] Restore Reg 16
JRST RET ;END OF TRACE
; START FUNCTION
START: MOVSI T5,(JFCL) ;RESET THE TRACE ENTRY
MOVEM T5,FDDT. ;
PUSHJ P,CLRLIN ;FLUSH OUT LINE BUFFER
START2: LDSYM T5,PRGNAM ;[402]GET THE MAIN PROGRAM NAME
MOVEM T5,SYM ;SAVE FOR EVAL
TRNE T1,LNAME ;[402]IS LONG PROGRAM NAME FLAG SET?
JRST STRT2B ;[402] YES
MOVSI T2,GLOBAL ;[157]Global prefix
MOVEM T2,SYMASK ;[157]Reset mask in case it's been munged
PUSHJ P,FINDG ;No, Find the start of short name
JRST ERR8 ;NO START ADDRESS
JRST STRT2C ;[402]
STRT2B: MOVSI T2,LPNAME ;[402] global/program name in sec. symbol tab
MOVEM T2,SYMASK ;[402] Reset mask in case it's been munged
PUSHJ P,FINDLG ;[402]
JRST ERR8 ;[402]
STRT2C: MOVEM T5,STARTU ;[316] Save for go
MOVEM T0,STKYFL ;MAKE THE FOROTS FLAG STICK
PUSHJ P,RE.NTR ;ALLOW RE-ENTERS AGAIN
PUSHJ P,INSRTB ;PUT IN BREAKPOINTS
HRRZI T0,FO$GBA ;[332] HAVE FOROTS RETURN BREAK ADDRESS
PUSHJ P,FOROP. ;[325] IN T0
MOVE T5,@T0 ;[332] IF @T0=0 THEN NO PAUSE ON ERROR
JUMPE T5,START3 ;[332]
MOVEM T0,TEM10 ;[340] SAVE BREAK ADDRESS
JSP L,FINIT. ;[332] INITIALIZE FOROTS
JFCL ;[332]
XMOVEI T4,PAUERR ;[332] RESET PAUSE ON ERROR FLAG
MOVEM T4,@TEM10 ;[340] STORE VIA BREAK ADDRESS
XMOVEI 16,ERRARG ;[404] Biggest integer
PUSHJ 17,ERRSET ;[404] Set number of errors allowed
START3: JSP T5,RESTORE
SETZI 16, ;MAKE F40 STRACE WORK
JRST @STARTU ;[316] Start user program
; GOTO STATEMENT LABEL OR SYMBOL CONTENTS
GOTO: JUMPL T0,START4 ;NO ARGUMENTS = START AT LAST GOTO
PUSHJ P,SYMIN ;GET USERS ARGUMENT
JRST ERR6 ;NONE SUCH
CAIA ;NUMERIC
MOVE T5,(T5) ;GET CONTENTS
PUSHJ P,ONFORM ;ON A FORMAT STATEMENT?
JRST ERR36 ;YES - ERROR
PUSHJ P,CHKADR ;DO A CHECK OF USER AREA
JRST ERR31 ;ILLEGAL - ERROR
JFCL
CAIA
START4: MOVE T5,STARTU ;[316] Get start address
SKIPN STARTU ;[316] Any start address?
JRST ERR4 ;[316] No address - Refuse START and GOTO
MOVEM T5,GOLOC ;SET UP FOR EXTASK
MOVE T2,SAVACS+17 ;[325] Get user P
MOVSI T5,(POPJ P,) ;HAVE WE STOPPED AFTER A NEXT?
LDB T3,[POINT 23,LEAV,35] ;[303] PICK UP AC,I,E
TLO T3,400000 ;[303] MAKE THIS AN IFIW
CAME T5,@T3 ;[303]Have we stopped after NEXT?
SKIPA T5,GOLOC ;[303] NO, so skip the pop and reload T5
POP T2,T5 ;[170]YES, POP the user return addr
MOVEM T2,SAVACS+17 ;[325] And reset his P
SKIPN ESCAPE ;HAS A RE ENTER BEEN DONE?
JRST ERR30 ;YES - ONLY SOME FORM OF CONTINUE ALLOWED
PUSHJ P,ONFORM ;SKIP IF NOT A FORMAT AT (T5)
JRST ERR24 ;NOT ALLOWED
PUSHJ P,RE.NTR ;ALLOW RE-ENTERS AGAIN
MOVSI T5,(JFCL) ;RESET THE TRACE ENTRY
MOVEM T5,FDDT. ;
PUSHJ P,EXTASK ;TRANSFER TO EXTERNAL TASK
; OPEN
OPEN: JUMPL T0,OPEN2 ;ASSUME MAIN PROG IF JUST 'OPEN'
PUSHJ P,TTYIN ;WHAT NEXT
JUMPN T2,BADSYN ;MUST BE LINE END DELIMITER
JUMPE T3,BADSYN ;MUST HAVE SOME CHARACTERS
PUSHJ P,VALID ;CHECK VALIDITY & GET RAD50 IN T4
OPEN3: MOVEM T4,SYM ;SAVE FOR 'OPEN'
PUSHJ P,SETNAM ;DO THE OPEN
JRST RET ;WHAT NEXT
OPEN2: LDSYM T4,PRGNAM ;[402]GET FORTRAN MAIN PROG NAME
JRST OPEN3 ;OPEN THIS
; DDT FUNCTION
IFE TOPS20,< ;[114] TOPS-10 HAS UDDT LOADED, SO IT'S IN
;[114] SYMBOL TABLE
DDT: PROGIF (UDDT) ;IS DDT LOADED?
JRST MAPDDT ;[115] NO, GO GET VMDDT
MOVE T5,1(T2) ;[321] The address
HRRZM T5,GOLOC ;[333] just the RH
JRST EXTASK ;TRANSFER TO EXTERNAL TASK
MAPDDT: MOVE T5,[.PAGCA,,700] ;[115] CHECK FOR PAGE 700
PAGE. T5, ;[115] IS IT THERE?
JRST ERR11 ;[115] NO PAGE UUO, NO VMDDT
TLNN T5,(PA.GNE) ;[115] DOES PAGE EXIST?
JRST GODDT ;[115] YES, GO TO IT
MOVEM 17,MRGACS+17 ;[115] MERGE WRECKS ALL ACS
MOVEI 17,MRGACS ;[115] SO SAVE THEM
BLT 17,MRGACS+16
MOVEI T5,['SYS ' ;[115] SET UP TO GET DDT
'VMDDT '
EXP 0,0,0,0]
MERGE. T5, ;[115] GET IT
JRST [MOVSI 17,MRGACS ;[115] CAN'T, TOUGH
BLT 17,17
JRST ERR11]
MOVE T5,[775777,,700000] ;[122] SET .JBDDT
SETDDT T5, ;[122]
MOVSI 17,MRGACS ;[115] PUT ACS BACK
BLT 17,17
GODDT: MOVEI T5,700000 ;[115] SET ADDRESS
MOVEM T5,GOLOC
JRST EXTASK ;[115] GO CALL EXTERNAL TASK
>
IFN TOPS20,<
DDT: MOVE T1,[.FHSLF,,770] ;[114] LOOK AT PAGE 770
RPACS% ;[114] GET PAGE ACCESS BITS
TXNN T2,PA%PEX ;[114] DOES PAGE 770 EXIST?
JRST MAPDDT ;[114] NO, GO MAP IN UDDT.EXE
MOVE T1,770000 ;[300] GET DDT ENTRY VECTOR
CAMN T1,[JRST 770002] ;[114] IS IT REALLY DDT?
JRST GODDT ;[114] YES, JUMP TO IT
MAPDDT:
MOVEI T1,.FHSLF ;[114] GET ENTRY VECTOR LOC
SKIPE EXTEND ;[300] IS THIS AN EXTENDED PROG?
JRST [XGVEC% ;[300] YES, GET X-ENTRY VECTOR
DMOVEM T2,DDTVEC ;[300] SAVE THE DDT ENTRY VECTOR
JRST MAPDD2] ;[300] SKIP THE NON-EXTENDED VERSION
GEVEC% ;[300] GET NON-EXTENDED ENTRY VECTOR
MOVEM T2,DDTVEC ;[300] STORE IT
MAPDD2: ;[300] COMMON JUNCTURE
MOVX T1,GJ%SHT+GJ%OLD ;[114] SHORT FORM, FILE MUST EXIST
HRROI T2,[ASCIZ /SYS:UDDT.EXE/] ;[114] DDT
GTJFN% ;[114] FIND IT
ERJMP ERR11 ;[114] NOT THERE, CAN'T HELP
HRLI T1,.FHSLF ;[114] MAP INTO THIS FORK
TRO T1,GT%ARG!GT%NOV ;[300] LIGHT SOME FUNCTION CODE BITS
XMOVEI T2,GTBLK ;[300] ARG BLOCK FOR GET%
HLRZM T2,GTBLK+.GBASE ;[300] STORE CURRENT SECTION NUMBER
GET% ;[114] READ IN DDT
ERJMP ERR11 ;[114] CAN'T
DMOVE T1,.JBSYM ;[300] GET SYMBOL TABLE PTRS FROM SAME SECTION
MOVEM T1,@770001 ;[114] STORE FOR DDT
MOVEM T2,@770002
MOVEI T1,.FHSLF ;[114] THIS FORK
SKIPE EXTEND ;[300] ARE WE RUNNING EXTENDED?
JRST [DMOVE T2,DDTVEC ;[300] YES, RESTORE ENTRY VECTOR
XSVEC% ;[300] SET THE ENTRY VECTOR
JRST GODDT] ;[300] JOIN COMMON CO
MOVE T2,DDTVEC ;[300] RESTORE ENTRY VECTOR
SEVEC% ;[114] SET ENTRY VECTOR
GODDT: TYPE (<To return to FORDDT, type "%FDDT<ESC>G">)
LINE
XMOVEI T2,770000 ;[300] GET DDT START ADDRESS
MOVEM T2,GOLOC ;[114] SAVE
JRST EXTASK ;[114] GO CALL EXTERNAL TASK
>;[114] END IFN TOPS20
; EXIT FUNCTION
EX.: JUMPGE T0,EX.R ;IS THE USER REQUESTING A MONITOR RETURN
SKIPN STARTU ;[316] NO - SEE IF A START HAS BEEN DONE
JRST EX.A ;[316] NO START, DO NORMAL EXIT
PUSHJ P,CHKIWI ;[211] RECURSIVE IO IF WE CALL EXIT.?
JRST EX.R2 ;[211] YES, SIMULATE A STOP/RETURN
SETZM STARTU ;[316] No CONTINUE or REENTR
SETZM TEM ;SET UP ARG BLOCK
SETZM TEM1 ; TO EXIT FOROTS
PUSHJ P,INSRTB ;REPLACE PAUSES
JSP T5,RESTORE ;RESTORE USERS ACS
XMOVEI L,TEM ;[300] GET EXIT ARGBLOCK
PUSHJ P,EXIT.## ;[143] DO A FOROTS EXIT
EX.R: PUSHJ P,TTYIN ;GET NEXT INPUT
JUMPN T3,BADSYN ;LOOKING FOR / - NOCHARACTERS ALLOWED
JUMPE T2,BADSYN ;BETTER BE /
CAIE T2,"/"
JRST BADSYN ;SORRY
PUSHJ P,TTYIN ;LOOK FOR RETURN
JUMPN T2,BADSYN ;NO MORE CHARACTERS ALLOWED
JUMPE T3,BADSYN ;NO CHARACTERS IN INPUT????
LSHC T2,6 ;GET FIRST CHARACTER
CAIE T2,' R' ;LOOK FOR 'RETURN' - IMPLIED BY R
JRST BADSYN ;WE DONT UNDERSTAND ANY OTHER CHARACTER
EX.R2: ;[211]
ife tops20,<
CALLI 1,12> ;DO A MONRET
ifn tops20,<
haltf%> ;do a monret
JRST RET ;CONTINUE'S ALLOWED
ife tops20,<
ex.a: exit> ;do a non-returnable return
ifn tops20,<
ex.a: reset% ;close files, etc.
haltf% ;stop
jrst ex.a> ;and don't permit continues
; ROUTINE OVERLAY - TO DETECT WHEN THERE HAS BEEN AN APPARENT
; OVERLAY OF THE PROGRAM. THIS IS DONE BY OBSERVING THE
; VALUES OF .JBSA AND .JBSYM EVERY RETURN TO USER MODE
;[320] OVRLAY through OVRL2 rewritten
OVRLAY:
IFN TOPS20,<
SKIPE EXTEND ;[321] Don't want this if
POPJ P,> ;[321] we are in non-zero section
PUSH P,T4
SETZ T5, ;Becomes non-zero if difference found
MOVE T4,.JBSYM ;Lowseg symbol pointer
EXCH T4,JOBSYM ;Save new symbol pointer
JUMPE T4,OVRL1 ;Old value is zero if not inited
CAMN T4,JOBSYM ;Compare to last known value
JRST OVRL1 ;No change
PUSHJ P,SETLST ;Reset the symbol tables
MOVEI T5,1 ;Remember that we did that
OVRL1: HRRZ T4,.JBSA ;The start address
EXCH T4,JOBSA ;Swap with previous value
JUMPE T4,OVRL2 ;Exit if old start not set up
CAME T4,JOBSA ;Has this changed?
AOJ T5, ;Yes
OVRL2: POP P,T4 ;Restore register
SKIPN T5 ;Any change?
POPJ P, ;No - All is well
LINE
TYPE(<%FDTPOV Program overlayed>)
ife tops20,< ;this doesn't work under TOPS20
MOVE T5,[XWD -1,3] ;SET FOR PROGRAM NAME
GETTAB T5,> ;FIND THE CURRENT NAME,end of conditional
JRST OVRL3 ;SECRETIVE TYPE??
SKIPN JOBNAM ;HAS ANY NAME BEEN STORED?
MOVEM T5,JOBNAM ;NO - REMEMBER THIS
CAMN T5,JOBNAM ;OVERLAYED BY SYSTEM WHICH DOSN'T CHANGE NAME?
JRST OVRL3 ;YES
MOVEM T5,JOBNAM ;REMEMBER NEW NAME
TYPE( by )
PUSHJ P,SIXBP ;OUTPUT PROGRAM NAME
OVRL3: TYPE( ***)
LINE
SKIPN T5,JOBOPC ;ANY RE-ENTER ADDRESS?
MOVE T5,BCOM ;IF NOT BCOM SHOULD BE USER BREAK
HRRZ T5,T5 ;JUST THE ADDRESS THANK YOU
PJRST WHERE ;TELL WHERE - END OF OVERLAY
; RE-ENTER LOGIC
RE.ENT: ;[325] Removed SETPDL
SKIPE REENTR ;ARE WE ALREADY REENTERED?
JRST ER.ENT ;YES. REPORT
IFE TOPS20,< ;[300]
MOVEM P,SAVLOC ;FREE UP A SPARE REG
HRRZ P,.JBOPC ;GET THE BREAK P.C.
> ;[300]
SKIPE ESCAPE ;RE-ENTERS ALLOWED ONCE(SEE ER.ENT)
JRST RE.BRK ;DONT DESTROY USER PROFILE
IFE TOPS20,< ;[300]
MOVE P,SAVLOC ;RE-INSTATE THE OLD REG
> ;[300]
JSR SAVE ;SAVE THE EXTERNAL PROG STATUS
PUSHJ P,REMOVB ;AND REMOVE THE PAUSES
IFE TOPS20,< ;[300]
MOVE T5,.JBOPC ;GET THE PROG P.C.
MOVEM T5,JOBOPC ;STORE AND FLAG THAT WE ARE HANDLING RE-ENTER
MOVEM T5,JOBBRK ;SAVE THE JOB BREAK LOCATION
MOVEM T5,STARTU ;[316] ALLOW CONTINUES TO WORK
> ;[300]
SETOM REENTR ;SET FLAG THAT WE HAVE REENTERED
SKIPE PRGNAM ;[315] Do we have a main program?
JRST RE.LOC ;YES
PUSHJ P,MAINF ;[315] Find the main program
JRST RE.LOC ;[315] Not found
STSYM T4,PRGNAM ;[402] Store main program name
PUSHJ P,SETNAM ;OPEN MAIN PROG
; HERE TO DISPLAY THE CURRENT SUSPEND POINT
; JOBBRK IS THE BREAK - NEED NOT = JOBOPC
RE.LOC: ;CLEAR THE OUTPUT BUFFER
ife tops20,<
clrbfo
>
ifn tops20,<
push p,t1
hrrzi t1,.priou
cfobf%
pop p,t1
>
TYPE([ Program suspended )
HRRZ T5,JOBBRK ;SET UP THE ACTUAL SUSPEND POINT
ifn tops20,< ;[335]
SKIPN EXTEND ;[334] IF REENTERING AND PROGRAM IS IN EXTENDED
JRST RE.LO2 ;[334] SECTION THEN JUST SAY REENTERING FROM
> ;[335]
TYPE (from FORDDT) ;[334] FORDDT SINCE WE CAN'T GET ADDRESS
LINE ;[334]
SKIPA ;[334]
RE.LO2: PUSHJ P,WHERE ;TELL USER WHERE HE IS SUSSPENDED
TYPE(Open section: )
LDSYM T5,OPENED ;[402]WHAT IS THE CURRENTLY OPEN SECTION
PUSHJ P,SPT1 ;TYPE THAT
TYPE ( ])
MOVE T0,STKYFL ;RESET THE FLAG REGISTER
JRST RET ;RETURN TO NORMAL WORKING
ER.ENT: JRST RE.LOC ;INDICATE THAT WE ARE ALREADY HANDLING A REENTER
RE.NTR: SETZM REENTR ;ALLOW REENTERS AGAIN
SETZM JOBOPC ;CLEAR THE RE-ENTER IN PROGRESS FLAG
SETZM ESCAPE ;DO NOT ALLOW ESCAPES FROM FORDDT
POPJ P,
RE.BRK: ;[325] Removed SETPDL
SKIPN STARTU ;[316] Has a start been done?
JRST RE.RET ;[316] No - Return to FORDDT user mode
MOVE T5,BCOM ;GET THE PAUSE POINT
MOVEI T5,-1(T5) ;CORRECT FOR JSA
ANDI T5,-1 ;JUST THE ADDRESS PORTION
MOVEM T5,JOBBRK ;SAVE THE JOB BREAK FOR RE.LOC
JRST RE.LOC ;DISPLAY PROGRAM EXECUTION SUSPENSION
; ROUTINE TO DISPLAY WHERE THE PROGRAM IS SUSPENDED
WHERE:
IFN TOPS20,<
SKIPE EXTEND ;[300] CHECK IF WE ARE RUNNING EXTENDED
JRST [TYPE(in extended section)
JRST RE.L2] ;[300] YES, SAY SO, AND CONTINUE
>
SKIPN .JBHRL ;SKIP IF WE HAVE A HIGH SEG.
JRST RE.L2
CAMLE T5,.JBREL ;ARE WE SUSPENDED OVER THE LOW SEG.
JRST [TYPE(in high segment)
JRST RE.L2]
TYPE(in low segment)
RE.L2: TYPE( at )
;[326] TLO T0,FGLSNM ;GLOBALS ARE OK
PUSHJ P,LOOK ;DO A SYSMBOL 'LOOK'-UP
JRST [TYPE( an unknown location) ;[300] SAY WE DON'T KNOW
JRST RE.L3] ;[300] AND PROCEED
CAIA ;NOTHING TYPED
JRST RE.L3A ;FOUND AND TYPED
MOVEM T5,TEM ;REMEMBER NEAREST REFERENCE
PUSHJ P,SPT ;TYPE THE SYMBOL
TYPE( + )
MOVE T5,TEM ;GET THE OFFSET
PUSHJ P,TYP4 ;DISPLAY AS OCTAL
RE.L3A: SKIPN PNAMSV ;DID WE FIND A SECTION NAME
JRST RE.L3 ;NO
TYPE( in )
LDSYM T5,PNAMSV ;[402]GET THE SECTION NAME
PUSHJ P,SPT1 ;DISPLAY THAT
RE.L3: LINE ;
POPJ P, ;
; PAUSE LOGIC
PAUSE: JUMPL T0,PSEALL ;DISPLAY ALL PAUSES IF NO ARGUMENTS
TRO T1,FGLONL ;FIND GLOBAL SYMBOL ONLY
SETZM ONFLG ;[325]
PUSHJ P,SYMIN ;GET THE NEXT SYMBOL IN SYM
JRST ONCHK ;[325]NONE SUCH!
JRST PAUS11 ;[332] ;STATEMENT # FROM USER
JRST PAUS10 ;SYMBOL - MEANS STOP AT ROUTINE
ONCHK: CAME T3,[SIXBIT/ON/] ;[325]
JRST ERR6 ;[325] INVALID SYMBOL
JRST PAUS2 ;[325]
PAUS11: MOVEM T5,TEM1 ;[313] SAVE POINTER TEMPORARILY
SETZM TEM ;CLEAR CONDITIONAL REQUEST
SKIPL TERMK ;WAS THAT ALL THE USER WANTED?
JRST PAUS5 ; YES
PUSHJ P,TTYIN ; NO,GET MOR
JUMPN T2,BADSYN ;DO WE HAVE A LEGAL DELIMITER
JUMPE T3,PAUS5 ;[136] DID WE REALLY GET ANYTHING?
SKIPN ONFLG ;[325]
JRST TYPCHK ;[325] NO SUBROUTINE CALLED "ON"
CAMN T3,[SIXBIT/ERROR/];[325]
JRST P2OK ;[325] PAUSE ON ERROR
CAMN T3,[SIXBIT/ERR/];[325]
JRST P2OK ;[325]
TYPCHK: CAMN T3,[SIXBIT/TYPING/] ;[134] YES, MAYBE A 'TYPING' REQUEST
JRST PAUS7 ;[134]
SKIPL TERMK ;[134] DID WE GET A LINE TERMINATOR?
JRST BADSYN ;[134] YES, WRONG PLACE FOR IT
CAMN T3,[SIXBIT/AFTER/] ;FORCE USER TO TYPE WHOLE WORD
JRST PAUS4 ;AFTER REQUESTED
CAME T3,[SIXBIT/IF/] ;WAS IT 'IF'?
JRST BADSYN ;ANYTHING ELSE MEANS TROUBLE
TLZ T0,CONS ;CLEAR CONSTANT SEEN FLAG
TRO T1,LGCLEG ;[116] LET EITHER KNOW WE MAY GET LOGICALS
PUSHJ P,EITHER ;NUMBER OR SYMBOL SHOULD FOLLOW
PUSHJ P,NUMB ;CONSTANT SEEN
MOVEM T5,COND1 ;SAVE CONSTANT
SKIPL TERMK ;[134] DID WE GET A LINE TERMINATOR?
JRST BADSYN ;[134] YES, WRONG PLACE FOR IT
CLEARM COND0 ;CLEAR FOR TYPE OF TEST
TRZE T1,ISLOGI ;[116] IS IT A LOGICAL CONSTANT
JRST [SETZ T5, ;[116] YES, SET FLAG IN COND0
TLO T5,LFTLOG ;[116]
MOVEM T5,COND0 ;[116]
JRST .+1] ;[116]
JUMPN T2,.+2 ;DELIMITER?
PUSHJ P,GETSKB ;NEXT CHARACTER
CAIE T2,"." ;MUST BE . OF .EQ. ETC
JRST BADSYN
PUSHJ P,TTYIN ;GET SIXBIT STRING
CAIE T2,"." ;MUST AGAIN BE TERMINATED BY .
JRST BADSYN
HLRZS T3,T3 ;MORE USEFUL IN RIGHT HALF
CAIN T3,'LT '
JRST TEST1
CAIN T3,'LE '
JRST TEST2
CAIN T3,'EQ '
JRST TEST3
CAIN T3,'NE '
JRST TEST4
CAIN T3,'GT '
JRST TEST5
CAIN T3,'GE '
JRST TEST6
JRST BADSYN ;UNKNOWN CONDITION
TEST6: AOS COND0 ;GE=5
TEST5: AOS COND0 ;GR=4
TEST4: AOS COND0 ;NE=3
TEST3: AOS COND0 ;EQ=2
TEST2: AOS COND0 ;LE=1
TEST1: TRO T1,LGCLEG ;[116] LET EITHER KNOW LOGICALS ARE LEGAL
PUSHJ P,EITHER
PUSHJ P,NUMB ;SAVE AS A NUMBER
MOVEM T5,COND2 ;SAVE THE LOCATION
TRZE T1,ISLOGI ;[116] DID WE GET A LOGICAL CONSTANT?
JRST [SETZ T5, ;[116] YUP, SET COND0 FLAG
TLO T5,RHTLOG ;[116]
ORM T5,COND0 ;[116]
JRST .+1] ;[116]
MOVE T5,[JSR COND]
MOVEM T5,TEM ;FORM THE (CONDITIONAL TEST) LOCATION LINK
PAUS5: SKIPA T5,[Z 1] ;PROCEDE COUNT=1
PAUS4: PUSHJ P,EITHER ;GET USERS PROCEDE COUNT IN T5
CAIA ;CONSTANT GIVEN
MOVE T5,(T5) ;SYMBOL - GET CONTENTS
JUMPL T5,BADSYN ;DO NOT ALLOW NEGATIVE PROCEDE COUNTS
EXCH T5,TEM1 ;GET BACK BREAKPOINT ADDRESS
SKIPL TERMK ;WAS THAT ALL
JRST PAUS6 ; YES
MOVEM T5,SAVLOC ;SAVE PAUSE ADDRESS TEPORARILY
PUSHJ P,TTYIN ;GET SIXBIT USER INPUT
JUMPN T2,BADSYN
MOVE T5,SAVLOC ;[136] RESTORE PAUSE ADDR., IN CASE WE'RE DONE
JUMPE T3,PAUS6 ;[136] WAS THERE REALLY ANYTHING THERE?
CAME T3,[SIXBIT/TYPING/] ;YES
JRST BADSYN
PAUS8: SKIPL TERMK ;[134] DID WE GET A LINE TERMINATOR?
JRST ERR15 ;[134] YES, WRONG PLACE FOR IT
PUSHJ P,GETNUM ;USER WANTS AUTO DISPLAY
JUMPN T5,PAUS3 ;ASSUME ZERO MEANS NO INPUT
CAIN T2,"/" ;A / HERE DENOTES THAT A GROUP# FOLLOWS
JRST PAUS8 ;TRY FOR THE NUMBER AGAIN
PAUS3: CAIL T5,1 ;MAKE SURE HE GETS
CAILE T5,GPMAX ; ONLY A VALID GROUP #
JRST ERR15 ;COMPLAIN ABOUT GROUP #
HRLM T5,TEM1 ;[300] GROUP # TO LH OF PROCEDE COUNT
MOVE T5,SAVLOC ;[300] GET BACK PAUSE ADDRESS
TLO T0,AUTO ;SET THE AUTO PROCEDE FLAG
PAUS6: PUSHJ P,ONFORM ;SKIP IF NOT A FORMAT AT (T5)
JRST ERR19
PUSHJ P,BPS1 ;PLACE ALL PARAMETERS TO EFFECT A PAUSE
JRST RET ;DONE!
PAUS7: SETZI T5, ;CLEAR PROCEDE COUNT
EXCH T5,TEM1 ;GET PAUSE PLACE
MOVEM T5,SAVLOC ;STORE PAUSE LOCATION
JRST PAUS8
PAUS2: SKIPL TERMK ;[332] DID WE GET A LINE TERMINATOR?
JRST ERR6 ;[332] YES, WRONG PLACE FOR IT
PUSHJ P,TTYIN ;[325] GET SIXBIT USER INPUT
JUMPN T2,BADSYN ;[325]
CAMN T3,[SIXBIT /ERROR/];[325] IS IT 'PAUSE ON ERROR'?
JRST P2OK ;[325] YES
CAME T3,[SIXBIT /ERR/];[325] YES
JRST BADSYN ;[325] NO SO PRINT ERROR MESSAGE
P2OK: SKIPGE TERMK ;[332] DID WE GET A LINE TERMINATOR?
PUSHJ P,CLRLIN ;[332] NO, JUNK AFTER "PAUSE ON ERROR"
HRRZI T0,FO$GBA ;[332] HAVE FOROTS RETURN BREAK ADDRESS
PUSHJ P,FOROP. ;[325] IN T0
PUSH P,T4 ;[340] SAVE T4
XMOVEI T4,PAUERR ;[332]
MOVEM T4,@T0 ;[332] Set address for trap
XMOVEI 16,ERRARG ;[404] Biggest integer
PUSHJ 17,ERRSET ;[404] Set number of errors allowed
POP P,T4 ;[340] RESTORE T4
JRST RET ;[325] GET NEXT FORDDT COMMAND
PAUS10: SKIPE SUBSCR ;NOR MUST THERE BE AN OFFSET
JRST ERR19
MOVE T2,@SYMSAV ;GET SYMBOL
TRNE T1,LNAME ;[402]Short symbols?
JRST PAU10L ;[402]No
TLNE T2,700000 ;IS THIS A PROGRAM NAME OR GLOBAL
JRST ERR19 ;NO SO DONT ALLOW
TLZ T2,PNAME ;[331]
CAMN T2,[SQUOZE 0,ON];[331] IF IT IS "ON" THEN
AOS ONFLG ;[325] SET "PAUSE ON" FLAG
JRST PAU10A ;[402]
PAU10L: TLNN T2,LGLOBL ;[402]IS THIS A PROGRAM NAME OR GLOBAL
JRST ERR19 ;[402]NO SO DONT ALLOW
MOVE T2,(T2) ;[402] Get name
CAMN T2,[SIXBIT /ON/];[402] IF IT IS "ON" THEN
AOS ONFLG ;[325] SET "PAUSE ON" FLAG
PAU10A: MOVE T2,1(T5) ;DOES THIS ROUTINE INVOKE THE 'HELLO' MACRO?
CAMN T2,HELLO ;YES IT DOES - STOP 2 ON
ADDI T5,2 ;
JRST PAUS11
ONFLG: Z ;[325] =1 IF "PAUSE ON"
COND0: Z ;[116] LEFT = FLAGS; RIGHT = # OF TEST
COND1: Z ;SAVE ADDRESS OF FIRST ARGUMENT
COND2: Z ;SAVES ADDRESS OF SECOND ARGUMENT
COND3: Z ;SAVE VALUE OF CONSTANT IF DEFINED
NUMB: TLOE T0,CONS ;SET CONSTANT SEEN FLAG IF NOT ALREADY SET
JRST ERR14
MOVEM T5,COND3 ;SAVE VALUE OF CONSTANT
MOVEI T5,COND3 ;SAVE ADDRESS OF CONSTANT
POPJ P,
; ROUTINE TO CHECK IF A FORTRAN FORMAT EXISTS AT
; THE ADDRESS POINTED TO BY T5
; RETURN 1 IF IT IS A FORMAT
; RETURN 2 IF NOT A FORMAT
ONFORM: LDB P1,[POINT 7,(T5),6]
CAIE P1,"(" ;[311] TRUE IF FIRST CHAR IS AN OPEN PAREN
JRST CPOPJ1 ;NOT A FORMAT STATEMENT
LDB P1,[POINT 7,(T5),13] ;[311]
CAIL P1," " ;[311] IS IT LESS THAN A BLANK?
POPJ P, ;[311] NO, PROBABLY IS A FORMAT STATEMENT
JRST CPOPJ1 ;[311] NOT FORMAT, CHAR IS A CNTRL CHAR
; CONTINUE LOGIC
CONTIN: MOVSI T5,(JFCL) ;RESET THE TRACE ENTRY
MOVEM T5,FDDT.
SKIPN STARTU ;[316] Has START been done?
JRST ERR4 ;[316] No - Please type START
SKIPE T5,JOBOPC ;ARE WE IN A RE-ENTER CONDITION
JRST CONT2 ;YES - DEAL WITH IT
MOVEI T5,[POPJ P,] ;POPJ P, IS THE EXIT AFTER A 'NEXT'
CAMN T5,LEAV ;DID WE DO A 'NEXT' LAST TIME
JRST PROCED ;YES - DO NOT TAKE ARGS - RETURN WITH A POPJ
JUMPL T0,PROCED ;CONTINUE 1
PUSHJ P,EITHER ; NO - GET ARGUMENT
CAIA ;NUMBER TYPED
MOVE T5,(T5) ;SYMBOL TYPED - GET CONTENTS
JUMPL T5,BADSYN ;DO NOT ALLOW NEGATIVE PROCEDE SETTINGS
JRST PROCDX ;SET UP A PROCEDE COUNT
CONT2: MOVE T5,JOBOPC ;GET THE CONTINUE P.C.
MOVEM T5,GOLOC ;PREPARE TO CONTINUE
PUSHJ P,RE.NTR ;ALLOW RE-ENTERS AGAIN
PUSHJ P,INSRTB ;PUT BACK PAUSES
JSP T5,RESTOR ;RESTORE USER ACS
JRST @GOLOC ;[300] DO AN OFFICIAL RE-ENTER, using JRST
;HELP code for using either external HELPER or an internal version
;depending on the value of EXTHLP (1 = use external HELPER, 0 =
;use internal HELPER). WARNING: The current TOPS10 version of
;HELPER which uses memory above .JBFF for it's input buffers, will
;trash FOROTS' data areas.
;
;NOTE: All of the following help code unless otherwise noted is part
; of edit [147].
IFN EXTHLP,< ;when using external HELPER
HELP: MOVE T1,[SIXBIT/FORDDT/]
PUSHJ P,.HELPR ;GIVE 'EM SOME REAL HELP
JRST RET ; AND RETURN
> ;end IFN EXTHLP
;Starting IFE EXTHLP (internal help code). TOPS-10 native
;help code.
IFE EXTHLP,< ;start internal help code
IFE TOPS20,< ;start -10 internal help code
DSK=0 ;INPUT CHANNEL FOR FORDDT.HLP
HELP: PUSH P,T0 ;SAVE THE FLAGS
;Generate a home made buffer ring of two buffers and a buffer
;control block. Use FOROTS' ALCOR and DECOR routines for
;allocating and deallocating the buffer space.
;Allocate the buffer space.
MOVEI T1,^D264 ;ALLOCATE ENOUGH FOR TWO 128 WORD BUFFERS
MOVEM T1,ALCBLK+1 ;PUT IT WHERE ALCOR WILL FIND IT
MOVEI L,ALCBLK ;POINT TO IT
PUSHJ P,ALCOR.## ;LET FOROTS DO IT'S THING
SKIPG T0 ;A POSITIVE VALUE?
JRST ALCFAL ;NO, ALLOCATION FAILED
MOVEM T0,ALCBLK+1 ;SAVE ADDR FOR DECOR
;Set up the buffer header blocks.
AOS T2,T0 ;POINT TO 2ND WORD OF BUFFER HDR
HRLZI T1,^D129 ;SIZE OF BUFFER+1
HRR T1,T2 ;TACK ON ADDRESS OF 1ST BUFFER HDR+1
MOVEM T1,^D131(T2) ;PUT IT IN WORD 2 OF 2ND BUFFER HDR
ADDI T1,^D131 ;ADDR OF 2ND BUFFER HDR+1
MOVEM T1,(T2) ;PUT IT IN WORD 2 OF 1ST BUFFER HDR
;Try to find the help file.
SETZB T2,T5 ;SET UP A COUNTER AND ZERO T2
GETHLP: SKIPA T3,['HLP '] ;GET HLP:
GETSYS: MOVSI T3,'SYS' ;OR GET SYS:
MOVEI T4,HLPCTB ;ADDRESS OF BUFFER CONTROL BLOCK
OPEN DSK,T2 ;OPEN THE DEVICE CHANNEL
JRST HLPNHF ;LOSE...
MOVE T1,[EXP BF.VBR] ;SET UP THE BUFFER CONTROL BLOCK
MOVEM T1,HLPCTB ;SIGNIFY VIRGIN BUFFER
HRRM T0,HLPCTB ;GIVE ADDRESS OF 2ND WORD OF 1ST BUFFER
SETZM HLPCTB+1 ;ZERO NEXT TWO LOCATIONS
SETZM HLPCTB+2
MOVE T1,[SIXBIT/FORDDT/] ;FILE NAME
MOVSI T2,'HLP' ;EXTENSION
SETZB T3,T4 ;ZERO NEXT TWO
LOOKUP DSK,T1 ;LOOKUP FORDDT.HLP
TLZA T2,-1 ;CLEAR JUNK, WE BLEW IT
JRST NXTBUF ;GOOD--GO READ FILE
CAIE T2,ERSNF% ;SFD NOT FOUND?
CAIN T2,ERSLE% ;SEARCH LIST EMPTY?
JRST NXTSTR ;ONE OF THE ABOVE
CAILE T2,ERIPP% ;INCORRECT PPN OR FILE NOT FOUND?
JRST HLPNHF ;HORRIBLE DISK ERROR
NXTSTR: SETZM T2 ;CLEAR PHYSICAL BIT
AOS T5 ;TRY NEXT CASE
TRNE T5,1 ;SEE IF ODD
TXO T2,UU.PHS ;YES--TRY PHYSICAL ONLY
JRST @[GETHLP ;TRY HLP: AGAIN
GETSYS ;THEN LOGICAL SYS:
GETSYS ;THEN PHYSICAL SYS:
HLPNHF]-1(T5) ;THEN GIVE UP
NXTBUF: IN DSK, ;GET A BUFFER
JRST OUTBUFF ;OUTPUT THE BUFFER
STATZ DSK,IO.ERR ;SEE IF ERRORS
JRST HLPIOE ;YES--ISSUE MESSAGE
STATZ DSK,IO.EOF ;DONE YET?
JRST HLPDON ;YES
OUTBUF: HRRZ T1,HLPCTB+1 ;POINT TO 1ST DATA LOC IN BUFFER
AOS T1 ; ''
OUTSTR @T1 ;OUTPUT THE BUFFER
JRST NXTBUF ;GO GET THE NEXT
ALCFAL: OUTSTR [ASCIZ /%FDTCAB Cannot allocate buffer for help file/]
JRST HLPRET
HLPIOE: OUTSTR [ASCIZ \%FDTIOE I/O error reading help file\]
SKIPA
HLPNHF: OUTSTR [ASCIZ /%FDTNHF Cannot find help file/]
OUTSTR [ASCIZ /; I'm sorry, I can't help you/]
HLPDON: RELEAS DSK, ;RELEASE DISK CHANNEL
MOVEI L,ALCBLK ;NEED TO DEALLOCATE BUFFER SPACE
PUSHJ P,DECOR.## ;DO IT
HLPRET: OUTSTR CRLF
POP P,T0 ;RESTORE FLAGS
JRST RET ;ALL DONE
HLPCTB: BLOCK 3
> ;end IFE TOPS20 (-10 internal help code)
;Continuing IFE EXTHLP (internal help code). TOPS-20 native
;help code.
IFN TOPS20,< ;start -20 internal help code
HELP: PUSH P,T0 ;SAVE THE FLAGS
;Use FOROTS' ALCOR and DECOR routines for
;allocating and deallocating the buffer space.
MOVEI T1,^D128 ;ALLOCATE ONE BLOCK FOR THE FILE
MOVEM T1,ALCBLK+1 ;PUT IT WHERE ALCOR WILL FIND IT
XMOVEI L,ALCBLK ;[300] POINT TO IT
PUSHJ P,ALCOR.## ;LET FOROTS DO IT'S THING
SKIPG T0 ;A POSITIVE VALUE?
JRST ALCFAL ;NO, ALLOCATION FAILED
MOVEM T0,ALCBLK+1 ;SAVE ADDR FOR DECOR
TLO T0,(61B5) ;[302] Make it a OWGBP
MOVEM T0,ALCPTR ;[302] Remember it
MOVEI T3,4 ;NUMBER OF ATTEMPTS AT FINDING FILE
GETHLP: MOVE T4,[POINT 7,[ASCIZ/HLP:/]] ;GET THE HLP: POINTER
MOVEM T4,GTJBLK+2 ;PUT IT IN THE GTJFN BLOCK
JRST GETIT
GETSYS: MOVE T4,[POINT 7,[ASCIZ/SYS:/]] ;GET THE SYS: POINTER
MOVEM T4,GTJBLK+2 ;PUT IT IN THE GTJFN BLOCK
GETIT: HRROI T2,FILENM ;GET POINTER TO 'FORDDT'
MOVEI T1,GTJBLK ;LONG FORM GTJFN BLOCK
GTJFN% ;GET FORDDT.HLP
JRST NXTSTR ;LOSE TEMPORARILY
HRRM T1,JFN ;SAVE THE JFN
MOVE T2,[FLD(7,OF%BSZ)!OF%RD] ;BYTE SIZE OF 7 AND READ ONLY
OPENF% ;OPEN THE FILE FOR READ ACCESS
JRST HLPIOE ;SOMETHING WEIRD HAPPENED
PRINT: MOVE T1,JFN ;GET JFN
MOVE T2,ALCPTR ;[302] POINTER FOR TEXT BUFFER
MOVEI T3,^D639 ;HELP TEXT BUFFER SIZE IN CHARS (128*5-1)
SIN% ;FILL THE BUFFER
ERJMP HLPDON ;DON'T CARE ABOUT THIS ERROR
SETZ T1, ;NEED A ZERO BYTE
IDPB T1,T2 ;MAKE SURE ZERO THE LAST BYTE
MOVE T1,ALCPTR ;[302] POINT TO BUFFER
PSOUT% ;OUTPUT ASCIZ STRING
JRST PRINT ;IF THERE'S MORE, GO GET IT
NXTSTR: MOVE T4,GTJBLK ;GET THE FLAGS
TXOE T4,GJ%PHY ;TURN ON PHYSICAL DEVICE BIT
TXZ T4,GJ%PHY ;CLEAR PHYSICAL BIT
MOVEM T4,GTJBLK ;PUT IT BACK IN GTJFN BLOCK
SOJLE T3,HLPNHF ;SEE IF ANY DEVICES LEFT
CAIG T3,2 ;TIME TO TRY SYS:?
JRST GETSYS ;YES, USE SYS:
JRST GETHLP ;NO, USE HLP:
HLPDON: SETZ T1, ;NEED A ZERO BYTE
IDPB T1,T2 ;MAKE SURE ZERO THE LAST BYTE
MOVE T1,ALCPTR ;[302] POINT TO BUFFER
PSOUT% ;OUTPUT ASCIZ STRING
HRROI T1,CRLF ;OUTPUT CRLF
PSOUT%
MOVE T1,JFN
CLOSF% ;GET RID OF THE JFN
JFCL ;NOT LIKELY
JRST HLPRET ;AND RETURN
HLPIOE: MOVE T1,JFN ;WE STILL HAVE TO RELEASE THE JFN
CLOSF%
JFCL ;NOT LIKELY
HRROI T1,[ASCIZ/%FDTEOH Error opening help file/]
SKIPA
HLPNHF: HRROI T1,[ASCIZ /%FDTNHF Cannot find help file/]
PSOUT%
HRROI T1,[ASCIZ/; I'm sorry I can't help you/]
PSOUT%
HRROI T1,CRLF
PSOUT%
HLPRET: XMOVEI L,ALCBLK ;[300] NEED TO DEALLOCATE BUFFER SPACE
PUSHJ P,DECOR.## ;DO IT
POP P,T0 ;RESTORE FLAGS
JRST RET ;ALL DONE
ALCFAL: HRROI T1,[ASCIZ/%FDTCAB Cannot allocate buffer for help file/]
PSOUT%
HRROI T1,CRLF
PSOUT%
POP P,T0 ;RESTORE FLAGS
JRST RET ;ALL DONE
FILENM: ASCIZ /FORDDT/
JFN: 0
GTJBLK: GJ%OLD ;FLAGS
.NULIO,,.NULIO
POINT 7,[ASCIZ/HLP:/] ;POINTER TO DEVICE
0
0
POINT 7,[ASCIZ/HLP/] ;POINTER TO EXTENSION
0
0
0
ALCPTR: BLOCK 1 ;[302] OWGBP to allocated buffer
> ;end IFN TOPS20 (internal -20 help code)
-1,,0 ;NUMBER OF ARGUMENTS TO ALCOR
ALCBLK: IFIW ALCBLK+1 ;[302] POINTER TO ARGUMENT
BLOCK 1 ;NUMBER OF WORDS NEEDED
> ;end IFE EXTHLP (internal help code)
; REMOVE LOGIC
RESET: JUMPL T0,RESET5 ;'RESET' - RESET ALL PAUSES
TRO T1,FGLONL ;FIND GLOBAL ONLY IF NOT LABEL
PUSHJ P,SYMIN ; NO - MUST BE ANOTHER SYMBOL TO FOLLOW
JRST [CAME T3,[SIXBIT/ON/]
JRST ERR6
JRST .+1] ;[332]
JFCL ;STATEMENT #
RESET6: MOVEM T3,TEM11 ;[340] SAVE T3
MOVE T3,SYMSAV ;[332]
TRNE T1,LNAME ;[402]Short symbols?
JRST REST6L ;[402]No
TLZ T3,PNAME ;[332]
CAME T3,[SQUOZE 0,ON];[332] IS IT A "REMOVE ON"
SKIPL TERMK ;[332] DID WE GET A LINE TERMINATOR?
JRST RSET3 ;[332] YES, CAN'T BE PAUSE ON ERRROR
JRST REST6A ;[402]
REST6L: MOVE T3,(T3) ;[402] Get ptr to name
MOVE T3,(T3) ;[402] Get name
CAMN T3,[SIXBIT /ON/];[402] IF IT IS "ON" THEN
SKIPL TERMK ;[332] DID WE GET A LINE TERMINATOR?
JRST RSET3 ;[332] YES, CAN'T BE PAUSE ON ERRROR
REST6A:
PUSHJ P,TTYIN ;[332] GET SIXBIT USER INPUT
JUMPN T2,BADSYN ;[332]
CAMN T3,[SIXBIT /ERROR/];[332] IS IT 'REMOVE ON ERROR'?
JRST RESET1 ;[332] REMOVE ON ERROR
CAME T3,[SIXBIT/ERR/];[332]
JRST ERR6 ;[332] "REMOVE ON" FOLLOWED BY JUNK
RESET1: SKIPGE TERMK ;[332] DID WE GET A LINE TERMINATOR?
PUSHJ P,CLRLIN ;[332] "REMOVE ON ERROR" FOLLOWED BY JUNK
HRRZI T0,FO$GBA ;[332] HAVE FOROTS RETURN BREAK ADDRESS
PUSHJ P,FOROP. ;[332] IN T0
SETZM @T0 ;[332] CLEAR "REMOVE ON ERROR"
JRST RET ;[332]
RSET3: MOVEI T2,B1ADR ;[402] LOOK THRO PAUSE POINTS FOR THE RIGHT ONE
RESET3: MOVE T3,TEM11 ;[340] RESTORE T3, WAS NOT ERROR PAUSE
HRRZ T4,(T2) ;GET THE PAUSE CONTENTS
CAIN T4,(T5) ;IS THIS IT?
JRST RESET2 ; YES - REMOVE IT!
ADDI T2,3 ; NO - TRY ANOTHER
CAIG T2,BNADR ;TRIED ALL POINTS YET?
JRST RESET3 ; NO - FIND THE NEXT
JRST ERR17 ;NO - NOT AN ARRAY NAME - YOU LOSE
RESET2: MOVE T4,1(T5) ;DOES THIS ROUTINE USE THE HELLO MACRO
CAMN T4,HELLO
ADDI T5,1 ;YES IT DOES - SO STOP 2 ON
ADDI T5,1 ;STOP 1 ON FOR NORMAL ROUTINES
CLEARM (T2) ;CLEAR LOCATION OF PAUSE
CLEARM 1(T2) ;CLEAR CONDITIONAL CLAUSE
CLEARM 2(T2) ;CLEAR PROCEDE COUNT
JRST RET ;REMOVED!
RESET5: CAME T3,[SIXBIT/REMOVE/] ;DO NOT ALLOW ABREVIATIONS OF REMOVE
JRST BADSYN ;THIS ANNOYS MANY USERS
HRRZI T0,FO$GBA ;[332] HAVE FOROTS RETURN BREAK ADDRESS
PUSHJ P,FOROP. ;[332] IN T0
SETZM @T0 ;[332] CLEAR "PAUSE ON ERROR"
PJRST BPS ;RESET ALL PAUSES
; ACCEPT LOGIC = ACCEPT NAME/X #
ACCEPT: JUMPL T0,BADSYN ;ACCEPT ALONE IS MEANINGLESS!
SETZM ARGVAL+1 ;CLEAR IN CASE LONG INPUT
SKIPN ESCAPE ;ESCAPE TO FOROTS?
JRST ERR30 ;SORRY
PUSHJ P,CHKIWI ;[211] RECURSIVE IO IF WE CALL THE OTS?
JRST ERRIWI ;[211] YES, TELL AND RETURN TO COMMAND LOOP.
TRO T1,ACCPT ;ACCEPT IN PROGRESS
CLEARM CLMOFF ;[401]
CLEARM CLMRNG ;[401]
CLEARM SSLOW ;[401]ZERO THE LOWER SUBSTRING BOUND
CLEARM SSUP ;[401]ZERO THE UPPER SUBSTRING BOUND
PUSHJ P,SYMIN ;GET USERS SYMBOL
JRST ERR6 ;SORRY - WE DONT HAVE IT!
JRST ACC2 ;STATEMENT # = FORMAT
MOVEM T5,TEM2 ;STORE FOR UPDATE
;[157]***For character, T5/TEM2=descriptor of array base=SAVLOC
TRNE T1,IMPRNG ;IS THIS AN IMPLIED RANGE?
PUSHJ P,DISP14 ;YES SETUP RANLIM/RANGE IN CASE OF A RANGE
MOVE T5,SYMSAV ;GET THE SYMBOL POINTER
HLRZ T5,(T5) ;GET RADIX 50 FORM AND FLAGS
TRNN T1,LNAME ;[402] if it is not long name - check if local
JRST [TRNN T5,LOCAL;[402]ALLOW ONLY LOCAL VARIABLES TO CHANGE
JRST ERR24 ;YOU LOOSE
JRST .+1] ;[402]
MOVE T2,LSTCHR ;RESTORE USERS LAST CHARACTER
; HERE HAVING READ A GOOD VARIABLE = ACCEPT NAME/
SKIPL TERMK ;END OF LINE SEEN?
JRST BADSYN ;YES - BAD NEWS
JUMPE T2,ACCF ;SPACE DELIMITER ASSUMES REAL TO FOLLOW
CAIN T2,"=" ;ALLOW = AS DELIMITER
JRST ACCF
CAIN T2,"-" ;A - MEANS A RANGE OF VALUES TO SET
JRST ACC23 ;
CAIE T2,"/" ; WE EXPECT ONLY / FROM NOW ON
JRST BADSYN ;ANYTHING ELSE LOOSES
SETZM TEM ;[323] No switches yet
ACC22: PUSH P,T1 ;[402] Save long name flag
PUSHJ P,TTYIN ;READ ARGUMENT TYPE REQUIRED BY USER
POP P,T1 ;[402] Restore long name flag
JUMPE T3,BADSYN ;NO CHARACTERS - BAD
LDB T5,[POINT 6,T3,5];GET 1ST. CHARACTER TO IDENTIFT ARG TYPE
CAIE T5,'B' ;[323] BIG SWITCH ?
TRZA P3,777777-B. ;[323] No - Remove all but 'B'
TROA P3,B. ;[120] YES - SET IT AND LOOK FOR ANOTHER SWITCH
MOVEM T5,TEM ;[323] NOT 'BIG', SAVE SWITCH IN CASE B FOLLOWS
JUMPE T2,ACC21 ;NOTHING FOLLOWS
CAIN T2,"=" ; ALLOW = AS DELIMITER
JRST ACC21 ;PROCESS FORMAT
CAIE T2,"/" ;ANOTHER SWITCH ?
JRST BADSYN ;NO - ONLY / ALLOWED
JRST ACC22 ;PROCESS ANOTHER SWITCH
; HERE HAVING READ ALL THE MODE SWITCHES
;[120] THE LAST SWITCH TAKES PRIORITY (/F/D/C/I/O/A/R/L) /B ALLOWED
; ACCEPT NAME/B/I
;[156] We now check to see whether input is /BIG/ASCII into a range
; of double-precision array elements. If so, RANGE must be
; incremented to the address of the second word of the last
; element, in order for the end-of-range check at ACC14 to
; be valid. (we were losing the second word of the last element).
ACC21: SKIPL TERMK ;[200] ALREADY AT EOL?
JRST BADSYN ;[200] YES: BAD COMMAND SYNTAX
SKIPN T5,TEM ;[323] Get current mode flags
MOVEI T5,'F' ;[323] Default is 'F'
SKIPE RANGE ;[156]looking for a range?
JRST ACC21A ;[156]YES
SETZM CLMRNG ;[163]In case character
JRST ACC21B ;[163]Go get input
ACC21A: TRNE P3,B. ;[323]/BIG?
TRNN T0,DOUBLE ;[306]and double precision?
JRST ACC21B ;[156]NO
CAIE T5,'A' ;[156]ASCII?
CAIN T5,'R' ;[156]or RASCII?
AOS RANGE ;[156]YES. Don't lose second word
ACC21B: CAIN T5,'S' ;SYMBOLIC?
JRST ACCS ;DO SYMBOL INPUT
CAIN T5,'A' ;ASCII?
JRST ACCA ;PROCESS ASCII
CAIN T5,'R' ;RASCII?
JRST RASCII ;PROCESS RIGHT JUSTIFIED ASCII
CAIN T5,'O' ;OCTAL?
JRST ACCO ;PROCESS OCTAL
CAIN T5,'C' ;[157]Character?
JRST ACCC ;[157] YES. Process string
TRZ P3,B. ;[323] IGNORE /BIG FOR THE REST
CAIN T5,'F' ;FLOATING?
JRST ACCF ;PROCESS A FLOATING INPUT
CAIN T5,'D' ;REAL*8?
JRST ACCD ;PROCESS REAL*8
CAIN T5,'I' ;INTEGER?
JRST ACCI ;PROCESS INTEGER INPUT
CAIN T5,'X' ;[157]COMPLEX?
JRST ACCX ;[157]PROCESS COMPLEX INPUT
CAIN T5,'L' ;[120] LOGICAL?
JRST ACCL ;[120] PROCESS LOGICAL INPUT
JRST BADSYN ;NO OTHER TYPES SUPPORTED
; ACCEPT A RANGE PROCESSING = ACCEPT NAME(X)-
ACC23: MOVE T5,TEM2 ;SAVE THE FIRST VALUE SOMEWHERE SAFE
MOVEM T5,RANGE ;SAVE THE FIRST VALUE OF A RANGE
MOVE T5,CLMOFF ;[157]Get beginning offset
MOVEM T5,CLMRNG ;[157]Save it in case this is /C
TLZ T0,GRPFL ;MAKE SURE WE DONT DO GROUP LOGIC
;OR ACCEPT ANY PRINT MODIFIERS
MOVE T5,MATHSM ;[403]SAVE CURRENT SYMBOL
MOVEM T5,TEM10 ;[403]
PUSHJ P,SYMIN ;GET THE NEXT VALUE
JRST ERR6 ;DOSNT EXIST
JRST BADSYN ;NUMERICS????
MOVE T4,TEM10 ;[403]GET FIRST SYMBOL BACK
CAME T4,MATHSM ;ARE THEY THE SAME
JRST ERR40 ;NO - SORRY
TRNN T0,CHARS ;[157]Character?
JRST CKRANG ;[157]NO
; clmrng=first offset given
; clmoff=offset just received
MOVE T2,CLMOFF ;[157]Get the lower offset
CAMLE T2,CLMRNG ;[157]Is lower .le. upper?
EXCH T2,CLMRNG ;[157]NO. Make it so
MOVEM T2,CLMOFF ;[157]Restore lower offset
MOVE T5,SAVLOC ;[157]Restore sym
JRST ACCONT ;[157]And continue
CKRANG: CAML T5,RANGE ;SORT OUT THE RANGE ORDER
EXCH T5,RANGE ;WRONG WAY ROUND
MOVEM T5,TEM2 ;LOWER VALIUE IN RANLIM, HI IN RANGE
ACCONT: PUSHJ P,EVAL ;GET SYMBOL IN SYMSAV
JFCL
MOVE T5,SYMSAV ;GET THE SYMBOL POINTER
HLRZ T5,(T5) ;GET SYMBOL FLAGS
TRNN T5,LOCAL ;MODIFY LOCALS ONLY
JRST ERR24 ;NOT ALLOWED
MOVE T2,LSTCHR ;RESTORE USERS LAST CHARACTER
CAIN T2,"/" ;MAYBE FORMAT SPECIFIER
JRST ACC22 ;YES - GO FIND THEM
SKIPGE TERMK ;[200] EOL ALREADY?
JUMPE T2,ACCF ;[200] NO. SPACE IMPLIES REAL*4
JRST BADSYN ;DONT ACCEPT ANYTHING ELSE HERE
; *** FLOATING INPUT ***
ACCF: TRO P3,F. ;[323] DISPLAY TO USER AS FLOATING
MOVEI T3,4 ;ARG TYPE REAL FOR FOROTS
PUSHJ P,FORINP ;YES - ASK FOROTS FOR INPUT
; HERE TO PLACE ALL ACCEPTED VALUES
ACC10: MOVE T5,ARGVAL ;LETS SEE WHAT FOROTS HAS BEEN UP TO
ACC13: EXCH T5,TEM2 ;[163]Save input value
PUSHJ P,CKWRIT ;[163]Validity check
EXCH T5,TEM2 ;[163]Regain value
MOVEM T5,@TEM2 ;PLACE VALUE WHERE USER REQUESTED
MOVEM T5,ARGVAL ;SOME PRINT OPTIONS NEED THIS
AOS T2,TEM2 ;NEXT ARRAY LOCATION
TRNN P3,X.!B.!D. ;[323] IF EITHER COMPLEX REAL*8 OR BIG OR -
TRNE T0,DOUBLE ;[112] WE HAVE A DOUBLE WORD ARRAY?
CAIA ;THEN WE PLACE TWO ARGUMENTS
JRST ACC14 ;IF NOT THEN CHECK THE RANGE CONDITION
TRO T0,SILENT ;QUIET
PUSH P,MATHSM ;SAVE CURRENT SYMBOL
PUSH P,T1 ;[402] Save long name flag in T1 for symbol
MOVE T5,[SQUOZE 0,.VEND] ;END OF VARIABLE AREA
MOVEM T5,MATHSM ;ONLY ACCEPTABLE SYMBOL
MOVE T5,TEM2 ;GET DESTINATION;T=dest addr
PUSHJ P,CKWRIT ;[163]Validity check; return if OK
PUSHJ P,LOOK ;FIND A SYMBOL FOR IT
JFCL ;NONE-OK
JRST ACC13A ;[402]OFFSET - OK
POP P,T1 ;[402]
POP P,T5 ;[402]
JRST ERR35 ;YES - ERROR
ACC13A: POP P,T1 ;[402]
POP P,T5
STSYM T5,MATHSM ;[402]RESTORE CURRENT SYMBOL
MOVE T5,ARGVAL+1 ;GET THE 2ND WORD
MOVEM T5,@TEM2 ; - AND PLACE IN NEXT LOCATION
AOS T2,TEM2 ;YES - SO NEXT DOUBLE WORD
ACC14: SKIPN RANGE ;ACCEPT A RANGE ?
JRST ACCPUT ;NO - UNLESS IMPLIED
TRNE P3,A. ;[323] SPECIAL TREATMENT FOR ASCII ARRAYS
JRST [CAMG T2,RANGE ;END OF ARRAY?
JRST ACC12 ;GET SOME MORE
JRST RET ] ;QUIT
CAMG T2,RANGE ;ALL DONE ?
JRST ACC10 ;NO - KEEP GOING
JRST RET ;ALL OVER
; VARIABLE 'ACCEPT'ED - NOW CONFIRM TO USER
ACCPUT: SOS T5,TEM2 ;REMOVE OFFSET FROM ACC13
ACPUT1: SETZM TERMK ;PREPARE FOR -
SETZM RANGE ; INPUT CONFIRMATION
TRZN T0,DOUBLE ;CHECK FOR ANY -
TRNE P3,X.!B.!D. ;[323] DOUBLE WORD WORKING
SOS T5,TEM2 ; AND IF SO CORRECT BASE ADDRESS
PUSHJ P,DISP10 ;AND LET HIM SEE HIS EFFORTS
JRST RET ;END OF ACCEPT
PUSHJ P,GETNUM ;GENERAL GET NUMBER ROUTINE
JRST ACC13 ;STORE FOR USER
; *** DOUBLE PRECISION INPUT ***
ACCD: TRO P3,D. ;[323] DISPLAY TO USER AS REAL*8
MOVEI T3,TP%DPR ;[137]Set up for default D-float arg type=10
TRNE T0,GFLOAT ;[137]If D-float, skip to FOROTS call.
MOVEI T3,TP%DPX ;[137] else, we have G-float, set arg type=13
PUSHJ P,FORINP ;REQUEST INPUT
JRST ACC10 ;PLACE FINAL ARG
; *** INTEGER INPUT ***
ACCI: TRO P3,I. ;[323] DISPLAY TO USER AS INTEGER
MOVEI T3,2 ;GET ARG TYPE INTEGER FOR FOROTS
PUSHJ P,FORINP ;GO TO FOROTS
JRST ACC10 ;PLACE ARG FOR USER
; *** COMPLEX INPUT ***
ACCX: TRO P3,X.!B. ;[323] DISPLAY TO USER AS VCOMPLEX
ACC11: PUSHJ P,GETSKB ;GET SIGNIFIGANT CHARACTER
CAIE T2,"(" ;MAKE SURE ITS A (
JRST ERR32 ; ( REQUIRED
MOVE T5,[401200,,ARGVAL+1] ;[300] WHERE TO PUT IMAGINARY OF COMPLEX
MOVEM T5,M2.I ;SET UP THE FORMAT
MOVEI T3,4 ;SET UP FOR TYPE REAL INPUT
PUSHJ P,FORINP ;LET FOROTS GET THE REAL PART
MOVE T5,M2.F ;RECOVER THE FIN CALL
MOVEM T5,M2.I ;AND REMOVE THE COMPLEX SETTING
JRST ACC10 ;GO PLACE THE RESULTS
; *** SYMBOLIC INPUT ***
ACCS: TRNE P3,B. ;[323] IF 'BIG' SET THEN
TROA P3,X. ;[330] DISPLAY TO USER AS TWO REAL*4
HLRS P3 ;[330] OTHERWISE USE CURRENT DEFAULT
MOVE T5,MATHSM ;[403]SAVE MATHSM
MOVEM T5,TEM10 ;[403]
MOVE T5,SAVLOC ;[403]SAVE SAVLOC AROUND CALL
MOVEM T5,TEM11 ;[403]
PUSHJ P,SYMIN ;GET A USER SYMBOL
JRST ERR6 ;CAN'T FIND IT!
JRST BADSYN ;DONT GIVE ME STATEMENT #
MOVE T2,TEM11 ;[403]
MOVEM T2,SAVLOC ;[403]RESTORE SAVLOC
MOVE T2,TEM10 ;[403]
MOVEM T2,MATHSM ;[403]RESTORE
MOVE T2,(T5) ;I'LL ACCEPT THAT ONE
MOVEM T2,ARGVAL ;SAVE THE FIRST WORD VALUE
TRNN P3,B. ;[323] DOUBLE WORD WORKING?
JRST ACC10 ;NO JUST PLACE SINGLE VALUE
MOVE T5,1(T5) ;GET SECOND VALUE
MOVEM T5,ARGVAL+1 ;STORE THAT
JRST ACC10 ; AND EVEN STORE IT
; *** ASCII INPUT RIGHT JUSTIFIED ***
RASCII: TRO P3,R. ;[323] DISPLAY TO USER AS RASCII
JRST ACC1 ;DO ASCII INPUT TO T
;[120] ** LOGICAL INPUT **
ACCL: TRO P3,L. ;[323] DISPLAY TO USER AS LOGICAL
MOVE T2,[POPJ P,] ;[120] HOW WE WANT TO RETURN FROM LOGICL
MOVEM T2,DONE ;[120]
TRO T1,LGCLEG ;[120] LET 'EM WE'RE EXPECTING A LOGICAL
PUSHJ P,GETSKB ;[120] GET NEXT CHAR.
CAIE T2,"." ;[120] DOES IT START WITH A "."?
JRST ERR7 ;[120] NO GOOD.
PUSHJ P,LOADCH ;[120] GET THE NEXT CHAR.
PUSHJ P,LOGICL ;[120] AND LET LOGICL HANDLE THE REST
JRST ACC13 ;[120] SAVE THE RESULTS
; *** ASCII INPUT ***
ACCA: TRO P3,A. ;[323] DISPLAY TO USER AS ASCII
MOVE T5,[ASCII . .] ;BLANK SECOND WORD FOR POSSIBLE
MOVEM T5,ARGVAL+1 ;LONG OR DOUBLE
SKIPN RANGE ;[120] IGNORE /BIG IF ACCEPTING LONG ASCII
JRST ACC1 ;OK IF NOT A RANGE
TRZ P3,B. ;[323] CLEAR /B FLAG
TRZ T0,DOUBLE ;CLEAR DOUBLE
ACC1: SKIPE SSLOW ;[400]ASSIGNING INTO SUBSTRING
JRST ERR42 ;[400]DON'T LET USER - IT WILL MESS UP BYTEPTR
PUSHJ P,GETSKB ;GETA SIGNIFICANT USER CHARACTER
SKIPL TERMK ;EOL?
JRST BADSYN ;YES - SYNTAX ERROR
MOVEI P1,(T2) ;SAVE IN T3
ACC12: SETZM ARGVAL ;CLEAR FOR DOUBLE LENGTH ASCII
TRZE T1,ADELIM ; IF SET WE CLEAR THE REST OF THE ARRAY
JRST ACCA2 ;
ACC24: MOVE T5,[ASCII . .] ;T BUILDS ASCII INPUT
TRNE P3,R. ;[323] BUILD WITH ZERO IF RASCII
SETZI T5,
MOVE P2,[POINT 7,T5] ;STORES BYTES IN T5
ACC15: pushj p,loadch ;NEXT ASCII CHARACTER
CAIN T2,(P1) ;TEXT DELIMITER FOUND?
JRST ACC18 ;YES - CHECK FOR A SECOND
TRZE T1,ADELIM ;WAS THE LAST CHARACTER OUR DELIMITER
JRST [PUSH P,T2 ;YES
MOVE T2,[pushj p,loadch] ;FOR GETSKB
MOVEM T2,GETCHR
POP P,T2
PUSHJ P,GETSK2 ;CHECK FOR COMMENT
PUSHJ P,CLRLIN ; WIND UP
JRST ACC17]
ACC19: IDPB T2,P2 ;SAVE USERS TEXT
TLNE P2,760000 ;FILLED T?
JRST ACC15 ;NO - TAKE MORE
CAIA ;DONT CONFUSE THE INDEFINATE ACCEPT
ACC17: TRO T1,ADELIM ;SET TO CLEAR REST OF ARRAY IF IN A RANGE
TRNE T0,DOUBLE ;TEST FOR ANY DOUBLE WORD -
JRST ACC2WD ; WORKING -
TRNN P3,B. ;[323] IMPLIED BY REAL*8 OR B.
JRST ACC20 ;STORE FINAL SINGLE VALUE IN T5
; DOUBLE WORD WORKING
ACC2WD: SKIPN ARGVAL ;IS THE FIRST VALUE STOREF?
JRST ACC3WD ;NO
MOVEM T5,ARGVAL+1 ;YES STORE SECOND
JRST ACC25 ;PLACE BOTH VALUES
ACC3WD: MOVEM T5,ARGVAL ;HOLD FIRST OF PAIR
TRNN T1,ADELIM ;ANY MORE TO COME
JRST ACC24 ;YES - GO FIND IT
ACC25: HRRZM P1,DELCHR ;SAVE DELIMITER FOR CLRLIN
PUSHJ P,CLRLIN ;CLEAR REST OF LINE
TRNN P3,R. ;[323] ARE WE ACCEPTING RIGHT JUSTIFIED TEXT
JRST ACC10 ;RELAX JUST ASCII
MOVE T2,ARGVAL ;GET BACK THE DOUBLE WORD
JUMPE T2,ACC10 ;NO TEXT?????
MOVE T3,ARGVAL+1 ;INTO A LONG SHIFT FORM
LSH T2,-1 ;FIRST MAKE A CONTINUOUS STRING OF TEXT
LSHC T2,-1 ;GET READY FOR 7BIT CHARACTER SHIFTS
ACC27: LDB T4,[POINT 7,T3,35]
JUMPN T4,ACC26 ;TEST FOR SUCCESSFUL RIGHT JUSTIFICATION
LSHC T2,-7 ;NOT YET MOVE DOWN
JRST ACC27 ;TRY AGAIN
ACC26: LSH T2,1 ;ASCII-ISE
TLZE T3,400000 ;SHOULD THERE BE A LOWER BIT FOR T2
TRO T2,1 ;YES - PUT IT IN
MOVEM T2,ARGVAL ;STORE TOP VALUE
MOVEM T3,ARGVAL+1 ;AND FINALLY LAST VALUE
JRST ACC10 ;AND GIVE THEM TO THE USER
ACC18: TRON T1,ADELIM ;FLAG THIS AS OUR DELIMITER
JRST ACC15 ;SEE IF NEXT CHARACTER IS SAME
TRZ T1,ADELIM ;YES IT IS -
JRST ACC19 ;PASS ON JUST ONE
ACCA2: TRZ P3,A.!R. ;[323] REMOVE THE TEXT FLAGS
MOVE T5,[ASCII . .] ;FILL THE REST OF THE ARRAY
MOVEM T5,ARGVAL ;WITH SPACES
MOVEM T5,ARGVAL+1
JRST ACC13
; FINISHED TEXT INPUT
ACC20: HRRZM P1,DELCHR ;SAVE DELIMITER FOR CLRLIN
SKIPN RANGE ;IF NOT IN A RANGE SETTING -
PUSHJ P,CLRLIN ;THEN CLEAR THE REST OF THE USER INPUT
TRNN P3,R. ;[323] LEFT OR RIGHT JUSTIFY
JRST ACC13 ;LEFT
LDB T2,[POINT 6,P2,5] ;RIGHT - GET THE T4 POINTER RESIDUE
SETCA T2, ;RIGHT SHIFT
LSH T5,1(T2) ; NOW
JRST ACC13 ;NOW PLACE TEXT
; *** CHARACTER STRING INPUT *** ;[157]
ACCC: ;[157]
TRO P3,C. ;[323]Display to user properly
PUSHJ P,GETSKB ;[157]Look for quote
SKIPL TERMK ;[157]EOL?
JRST BADSYN ;[157]YES. Syntax error
ACCC1: CAIE T2,"'" ;[157]Single quote?
JRST [TYPE (<%Character string must begin with single quote>)
JRST RET] ;[157]Try again
DMOVE T2,@SAVLOC ;[157]Get descriptor
MOVE T4,T3 ;[163]Save length for descriptor check & loop
IMUL T3,CLMOFF ;[157]Compute for ADJBP
SKIPN SSLOW ;[401]
JRST ACOMOF ;[401]
MOVE T4,SSUP ;[401]
SUB T4,SSLOW ;[401]
AOJ T4, ;[401] t4 = length = upper - (lower - 1)
ADD T3,SSLOW ;[401]substring offset
SOJ T3, ;[401] t3 = array offset + (lower - 1)
ACOMOF: ADJBP T3,T2 ;[157]Get BP to element
MOVEM T3,ORIGLM ;[157]Save starting address
MOVEI T5,T3 ;[163]T5=location of descriptor to validate
PUSHJ P,CKBPTR ;[163]Validate descriptor; return if OK
MOVE T5,T2 ;[305]GET THE REAL ADDR TO VALIDATE
TLZ T5,770000 ;[305]CLEAR THE OWGBP BITS LEAVING ADDR
PUSHJ P,CKWRIT ;[163]Check destination; return if OK
INSTRL: PUSHJ P,LOADCH ;[157]Get next character
CAIE T2,"'" ;[157]Quote?
JRST PUTBYT ;[157]NO. Store it.
PUSHJ P,LOADCH ;[157]YES. see if there is another
CAIN T2,"'" ;[157]Another quote?
JRST PUTBYT ;[157]YES. Store one only!
DMOVEM T3,TEM4 ;[157]Save pointer & count
MOVE T5,[PUSHJ P,LOADCH] ;[157]for GETSKB
MOVEM T5,GETCHR ;[157]Tell GETCHR how to get input
PUSHJ P,GETSK1 ;[157]Check for comment
PUSHJ P,CLRLIN ;[157]Clear extraneous input
DMOVE T3,TEM4 ;[157]Restore pointer & count
JRST STREND ;[212][157]End of this string
BYT2T5==^D29 ;[BL]Bits left if BP points to firstbyte in word
PUTBYT: IBP T3 ;[163]Destination address
MOVE T5,T3 ;[163]T5=address to validate
LDB P1,[POINT 6,T3,05] ;[163]Get byte position within word
CAIN P1,BYT2T5 ;[163]First byte in this word?
PUSHJ P,CKWRIT ;[163]YES. Validate destination; here +1 if OK
DPB T2,T3 ;[163]Store byte
SOJG T4,INSTRL ;[157]Loop thru input string
MOVEI T5,"'" ;[157]Anticipated delimiter
MOVEM T5,DELCHR ;[157]Save for CLRLIN
STREND: MOVEI T5," " ;[212][157]Fill character
FILSTR: SOJL T4,NDSTR1 ;[157]Jump if string full
IDPB T5,T3 ;[157]Store a space
JRST FILSTR ;[157]Loop till full
NDSTR1: MOVE T4,CLMRNG ;[157]Relative location of last element
SUB T4,CLMOFF ;[157]Elements to fill
JUMPLE T4,ENDCK ;[157]NONE.....
MOVE T5,SAVLOC ;[157]Addr/descriptor
MOVE T5,1(T5) ;[157]Get count
IMULI T5,(T4) ;[157]Total bytes to move
MOVE T4,ORIGLM ;[157]Get source addr
RNGLUP: ILDB P1,T4 ;[157]Load byte
IDPB P1,T3 ;[157]Store it
SOJG T5,RNGLUP ;[157]
ENDCK: MOVE T5,[pushj p,loadch];FOR GETSKB
MOVEM T5,GETCHR
PUSHJ P,GETSK1 ;[157]CHECK FOR COMMENT
SKIPGE TERMK ;[322]Line terminator?
PUSHJ P,CLRLIN ;[322]No - Show user error
MOVE T5,SAVLOC ;[322]Restore for display
SKIPN CLMRNG ;[157]Accept a range?
JRST ACPUT1 ;[157]NO. Go display single element
JRST RET ;[157]YES. all done!!!!!
; *** OCTAL INPUT ***
ACCO: TRO P3,O. ;[323] DISPLAY TO USER AS OCTAL
SETZI T5, ;CLEAR FOR OCTAL BUILD
SKIPL TERMK ;END OF LINE SEEN?
JRST ACC13 ;YES - ASSUME OCTAL = 0
PUSHJ P,GETSKB ;LOOK FOR "-"
SKIPL TERMK
JRST ACC13 ;END OF LINE - =0
SETZB P1,P2 ;CLEAR BUILD AREA
MOVEI T5,^D12 ;INITIALIZE COUNT
TRNE P3,B. ;[323] CHECK BIG
MOVEI T5,^D24 ;[120] DOUBLE IT FOR BIG
CAIA
ACC29: PUSHJ P,GETSKB ;GET NEXT CHARACTER
SKIPL TERMK ;END OF LINE?
JRST ACC16 ;
CAIE T2,"+" ;PLUS?
JRST ACC31
TLNE T0,MF ;YES - MINUS SEEN?
JRST BADSYN
JRST ACC29 ;NO - IGNORE THE +
ACC31: CAIN T2,42 ;DOUBLE QUOTE?
JRST ACC29 ;YES - IGNORE
CAIE T2,"-"
JRST ACC16 ;NOT A "-"
TLC T0,MF ;COMPLEMENT FLAG
JRST ACC29 ;GET NEXT CHARACTER
ACC16: SUBI T2,60 ;OCTALISE
JUMPL T2,ERR2 ;CHARACTER MUST OF COURSE -
CAIL T2,10 ; BE OCTAL
JRST ERR2 ;NOT OCTAL - COMPLAIN
LSHC P1,3 ;BUILD OCTAL VALUE
IOR P2,T2
SOJE T5,ACC28 ;CHECK FOR PROPER NUMBER OF CHARACTERS
ACA16: PUSHJ P,GETSKB ;GET A CHARACTER
SKIPGE TERMK ;END OF LINE
JRST ACC16 ;BACK FOR MORE
; HERE WITH LINE END OR FULL WORD(S)
ACC28: TRNN P3,B. ;[323] BIG WORKING?
JRST ACC30 ;AS YOU WERE - STORE OCTAL
MOVEM P1,ARGVAL ;STORE LONG OCTAL
MOVEM P2,ARGVAL+1
JRST ACC32
ACC30: MOVEM P2,ARGVAL ;STORE SINGLE OCTAL
; HERE AT END OF INPUT
ACC32: PUSHJ P,CLRLIN ;CLEAR THE LINE
TLZN T0,MF ;FLAGGED AS A NEGATIVE #?
JRST ACC10 ;NORMAL
SETCMM ARGVAL ;SET TO NEGATIVE -
SETCMM ARGVAL+1 ; = 1'S COMPLEMENT
AOS ARGVAL+1 ; LETS MAKE IT 2'S COMPLEMENT
SKIPN ARGVAL+1
AOS ARGVAL
JRST ACC10 ;NOW PLACE THAT LOT
; 'ACCEPT' FORMAT PROCESSING
ACC2: SKIPL TERMK ;[200] EOL ALREADY?
JRST BADSYN ;[200] YES
PUSHJ P,EVAL
JRST ERR6 ;NO SUCH STATEMENT NO
PUSHJ P,FRMSET ;SET UP TO ACCESS A FORMAT STATEMENT
JRST RET ;CANT DO IT!
MOVE P1,T4 ;FORMAT START
MOVE P2,T2 ;FORMAT END
; HERE WITH A RECOGNISED FORMAT REFFERENCE SET UP
ACC3: MOVE T5,[POINT 7,(P1)]
pushj p,loadch ;GET A USER CHARACTER
CAIE T2," " ;BLANKS
CAIN T2,11 ; AND TABS IGNORED TO START WITH
JRST ACC3
MOVE T3,[pushj p,loadch]
MOVEM T3,GETCHR ;SET TO READ FROM USER
PUSHJ P,GETSK2
CAIE T2,"(" ;FIRST FORMAT CHARACTER MUST BE (
JUMPA T2,BADSYN
ACC4: ILDB T3,T5 ;INCREMENT POINTER NOW
HRRM T5,.+1
CAIG P2,(P1) ;HAVE WE EXHAUSTED THE FORMAT
JRST [JUMPE T2,RET
JRST ERR13] ;YES
DPB T2,T5 ;STORE NEXT CHARACTER
JUMPE T2,ACC4
ACC6: pushj p,loadch ;GET ANOTHER USER FORMAT CHARACTER
CAIE T2," " ;NOW ALLOW
CAIN T2,11 ;BLANKS AND TABS AS USER WANTS
CAIA
PUSHJ P,GETSK2
JUMPN T2,ACC7 ;NOT THE LAST CHARACTER YET IF NON ZERO
CAIE T4,")" ;LAST USER CHARACTER MUST BE A )
JRST ERR32 ; IT WASN'T SO COMPLAIN
ACC7: MOVE T4,T2 ;REMEMBER THE LST USER CHARACTER
CAIE T2,37 ;DOES USER WANT LINE CONTINUATION = ^_
JRST ACC4 ;NO - NORMAL
ACC5: pushj p,loadch ;ACCEPT ANOTHER USER CHARACTER
CAIN T2,12 ;UNTIL END OF LAST LINE
JRST ACC6
JRST ACC5 ;DO A CONTINUATION
; TYPE LOGIC
DISPLA: SKIPN ESCAPE ;CAN WE USE FOROTS?
JRST ERR30 ;NOT AFTER A ^C RE-ENTER
PUSHJ P,CHKIWI ;[211] RECURSIVE IO IF WE CALL THE OTS?
JRST ERRIWI ;[211] YES, TELL AND RETURN TO COMMAND LOOP.
PUSHJ P,FORBUF ;[211] OK, CLEAR FOROTS BUFFER
SETZM CURGRP ;CLEAR CURRENT GROUP STACK FLAGS
TRO T1,TYPCMD ;[171] Remember it's a TYPE command
TLO T0,CFLIU!GRPFL ;SET CORE FILE IN USE - ALLOW GROUPS
CLEARM GETCHR ;THIS IS THE FIRST ACCESS TO CORE FILE THIS LINE
TLNE T0,EOL ;USER GAVE ANY ARGUMENTS?
TLOA T0,OFCFL ;NO - GET THEM FROM CORE FILE
TLZ T0,OFCFL ;YES - PUT THEM INTO CORE FILE
PUSHJ P,DISP4 ;DISPLAY ROUTINE
TLZ T0,CFLIU!OFCFL!GRPFL ;PULL DOWN DANGEROUS FLAGS
PUSHJ P,REINOP ;REINSTATE OPEN PROGRAM
JRST RET ;END OF TYPE COMMAND
DISP4: CLEARM RANGE ;CLEAR FOR RANGE INDICATION
CLEARM CLMOFF ;[157]Initialization
CLEARM CLMRNG ;[157]
CLEARM SSLOW ;[401]ZERO THE LOWER SUBSTRING BOUND
CLEARM SSUP ;[401]ZERO THE UPPER SUBSTRING BOUND
HLRS P3 ;[323] Use default flags
PUSHJ P,SYMIN ;GET USERS NEXT SYMBOL VALUE
JRST DISP9 ;NOT THERE
CAIA ;STATEMENT # FOUND
JRST DISP2 ;TRUE VARIABLE
; FORMAT STATEMENT PROCESSOR
DISP13: PUSHJ P,FRMSET ;SET UP TO ACCESS A FORMAT STATEMENT
JRST DISP5 ;CANNOT DO IT
; NOW FOUND A RECOGNISED FORMAT STATEMENT
MOVE T3,[POINT 7,(T4)]
MOVEI P1,SYM ;SET UP FOR SYMBOL PRINT
TRZ T1,LNAME ;[402] clear long name flag
PUSHJ P,SPT ;PRINT SYMBOL=STATEMENT #
TYPE( FORMAT)
DISP6: ILDB T5,T3 ;GET A CHARACTER FROM THE FORMAT TEXT
HRRM T3,.+1 ;GET NO OF WORDS DONE
CAIG T2,(T4) ;ALL DONE?
JRST DISP5 ;DONE WITH FORMAT
putchr (T5) ;TYPE IT
JRST DISP6 ;MORE TO DO - BACK FOR MORE
; SET UP ACCESS TO A FORMAT STATEMENT T4=START T2=END
; SKIP ON SUCCESS.
FRMSET: MOVEI T4,(T5) ;SHOULD POINT TO A JRST
LINE
LDB T5,[POINT 7,(T4),6] ;GET FIRST CHARACTER OF FORMAT
CAIE T5,"(" ;FIRST CHARACTER MUST BE A (
PJRST ERR16 ;USER LOSES
MOVE T5,T4 ;ACCEPTED START OF FORMAT -
MOVEM T5,SAVLOC ; NOW FIND END OF F10 FORMAT
HRREI T5,-12 ;CHANGE LABEL+P TO LABEL+F
ADDM T5,SYM ;LIKE SO
PUSH P,T4 ;SAVE (T4)
PUSHJ P,EVAL ;LOCATE THE FORMAT END
JRST [POP P,T4 ;[403]
JRST ERR41] ;[403]CANT FIND FORMAT END
POP P,T4 ;RESTORE
MOVEI T2,1(T5) ;SET UP END OF FORMAT IN T2
JRST CPOPJ1 ;T4 START - T2 END . . . ALL SET UP
VAL2: TAB
MOVE T5,RANLIM ;GET THE CURRENT VALUE POINTER
MOVE T5,1(T5) ;GET THE NEXT VALUE
POPJ P,
; IMPLIED RANGE I.E. TYPE ARRAY
DISP2: CAIN T2,"-"
JRST DISP1 ;GET LIMIT OF RANGE
TRZN T1,IMPRNG ;IS THIS A SIMULATED RANGE
JRST DISP10 ; NO - JUST NORMAL
DISP11: PUSHJ P,DISP14 ;SET UP RANGE WITH UPPER LIMIT
TLO T0,GRPFL ;[323] PERMIT GROUP LOGIC AGAIN
; ONE-SHOT TYPE REQUEST
; ENTER WITH SYMBOL VALUE IN T5
; ENSURE TERMK,RANGE=0
DISP10:
MOVEM T5,LWT ;SAVE SYMBOL VALUE
MOVE T5,(T5) ;GET CONTENTS OF SYMBOLIC ADDRESS
EXCH T5,LWT ;SAVE CONTENTS AND GET SYMBOL VALUE
;SAVE SYMBOL VALUE IN CASE WE DO A RANGE
MOVEM T5,RANLIM ;SAVE FOR RANGE NAME ID SUPRESSION
TRO P3,ANYMOD ;[173]FLAG FIRST PRINT ON LINE
PUSHJ P,OFFSET ;TYPE USERS SYMBOL
JRST DISP9
;[202]
EXCH T5,SYM ;GET BACK SYMBOL CONTENTS
TRNN P3,C. ;[157]Character string?
JRST TYPF ;[157]NO. Next test
; *** TYPE CHARACTER ***
DMOVE T2,@SAVLOC ;[157]Load ptr & length
MOVE T4,T3 ;[163]Save string length
IMUL T4,CLMOFF ;[157]Compute for ADJBP
SKIPN SSLOW ;[401]
JRST DCOMOF ;[401]
MOVE T3,SSUP ;[401]
SUB T3,SSLOW ;[401]
AOJ T3, ;[401] t3 = length = upper - (lower - 1)
ADD T4,SSLOW ;[401]
SOJ T4, ;[401] t4 = array offset + (lower - 1)
DCOMOF: ADJBP T4,T2 ;[157]Create BP to element
MOVE T2,T4 ;[157]Get the adjusted pointer
CHKPTR: MOVEI T5,T2 ;[163]T5=Location of descriptor to validate
PUSHJ P,CKBPTR ;[163]Validate; return if OK
MOVE T5,T2 ;[163]T5=address to validate
PUSHJ P,CKREAD ;[163]Validate;return if OK
CKBIG: TRNE P3,B. ;[157]Display whole string?
JRST TYPEC ;[157]YES. skip size check
CAILE T3,^D256 ;[157]Large string?
;*** flag
MOVEI T3,^D256 ;[157]YES. truncate
TYPEC: PUSHJ P,DSPSTR ;[162]Put out string
JRST TYPF ;[157][164]Go check for other type-out modes
; DSPSTR is a routine to display character strings.
; DSPST1 is an entry point to allow TYPCS (from PAUSE) to display
; character strings without calling JUSTIFY.
DSPSTR: JUSTIFY ;[164](VARIABLE NAME),TAB,=
; TYPE ( ) ;[157]Space
DSPST1: TYPE (') ;[157]Initial quote
BYTLUP: IBP T2 ;[163]Destination address
MOVE T5,T2 ;[163]T5=location of address to validate
LDB T4,[POINT 6,T2,05] ;[163]Get byte position within word
CAIN T4,BYT2T5 ;[163]First byte in this word?
PUSHJ P,CKREAD ;[163]YES. Validate source; return here if OK
LDB T5,T2 ;[163]Store byte
CAIN T5,"'" ;[157]Single quote?
PUSHJ P,ASCOUT ;[157]YES. double it
PUSHJ P,ASCOUT ;[157]Display it
SOJG T3,BYTLUP ;[157]Loop til thru
TYPE (') ;[157]Concluding quote
POPJ P,
;*** check for truncated string?
; *** TYPE FLOATING ***
TYPF: TRNN P3,F. ;TEST THE FLOATING FLAG
JRST TYPD ;NO REAL TRY DOUBLE REAL
JUSTIFY
MOVEI T3,4 ;ARG TYPE REAL FOR FOROTS
PUSHJ P,FOROUT ;ONE ARG OUTPUT
; *** TYPE DOUBLE REAL ***
TYPD: TRNN P3,D. ;TEST FOR DOUBLE REAL
JRST TYPX ;NO FLOATING TRY COMPLEX
JUSTIFY
MOVE T3,RANLIM ;GET ARG POINTER
MOVE T5,1(T3) ;GET SECOND ARG
MOVEM T5,ARGVAL+1 ;SAVE 2ND. HALF FOR FOROTS
MOVE T5,(T3) ;RE-INSTATE IST.ARG IN T5
MOVEI T3,TP%DPR ;[137]Set up for default D-float arg type=10
TRNE T0,GFLOAT ;[137]If D-float, skip to FOROTS call.
MOVEI T3,TP%DPX ;[137] else, we have G-float, set are type=13
PUSHJ P,FOROUT ;OUTPUT REAL*8
; *** TYPE COMPLEX ***
TYPX: TRNN P3,X. ;[157]TEST FOR COMPLEX TYPE OUT
JRST TYPI ;NO COMLEX TRY FOR INTEGER
JUSTIFY
MOVE T3,RANLIM ;GET ARG POINTER
MOVE T5,1(T3) ;GET SECOND ARG
MOVEM T5,ARGVAL+1 ;SAVE 2ND HALF FOR FOROTS
MOVE T5,(T3) ;REINSTATE 1ST ARG IN T5
MOVEI T3,14 ;SET UP ARGTYPE FOR COMPLEX
PUSHJ P,FOROUT ;ONE ARG OUTPUT
; ** TYPE INTEGER ***
TYPI: TRNN P3,I. ;TYPE AS INTEGER?
JRST TYPO ;NO - TRY OCTAL
JUSTIFY
MOVEI S1,^D10 ;PREPARE FOR DECIMAL TYPE OUT
PUSHJ P,FTOC ;CONSTANT PRINT
; *** TYPE OCTAL ***
TYPO: TRNN P3,O. ;TYPE AS OCTAL?
JRST TYPA ;NO - TRY ASCII
JUSTIFY
MOVEI S1,10 ;PREPARE FOR OCTAL PRINT
PUSHJ P,FTOC ;PRINT IN OCTAL
TRNN P3,B. ;[120] DOUBLE WORD
JRST TYPA ;NO - TRY ASCII
PUSHJ P,VAL2 ;GET THE NEXT VALUE
PUSHJ P,FTOC ; DISPLAY THAT
; *** TYPE ASCII ***
TYPA: TRNN P3,A. ;TYPE AS ASCII?
JRST TYPR ;NO - SEE IF RIGH JUSTIFIED ASCII
JUSTIFY
PUSHJ P,TXT341 ;THROW UP ASCII
TRNN P3,B. ;[120] DOUBLE?
JRST TYPR ;NO - TRY RASCII ?????????
PUSHJ P,VAL2 ;GET THE NEXT VALUE
PUSHJ P,TXT341 ;AND TYPE THAT AS ASCII
; *** TYPE RIGHT JUSTIFIED ASCII ***
TYPR: TRNN P3,R. ;TYPE AS ASCII RIGHT JUSTIFY
JRST TYPL ;[120] NO - TRY OCTAL
JUSTIFY
TYPE(R) ;RASCII IDENTIFIER
LSH T5,1 ;MAKE LEFT JUSTIFIED ASCII
PUSHJ P,TXT341 ;TYPE AS USUAL
TRNN P3,B. ;[120] DOUBLE RASCII?
JRST TYPL ;[120] NO
PUSHJ P,VAL2 ;GET NEXT VALUE
LSH T5,1 ;FAKE ASCII
PUSHJ P,TXT341 ;TYPE AS ASCII
TYPL: TRNN P3,L. ;[120] TYPE AS LOGICAL?
JRST TYPS ;[120] NO - SEE IF IN RANGE
JUSTIFY ;[120]
JUMPGE T5,TYPL1 ;[124][120] IF POSITIVE, IT'S FALSE
TYPE(.TRUE.) ;[124][120] IT MUST BE NEGATIVE SO TRUE
JRST TYPS ;[124][120]
TYPL1: TYPE(.FALSE.) ;[124][120] IT'S POSITIVE
TYPS: TRNN P3,S. ;/S IS ILLEGAL FOR TYPE
JRST TYPN
JRST ERR37 ; - ERROR
; HERE AT END OF TYPING - EXAMINE RANGE CONDITION
TYPN: LINE
SKIPN RANGE ;ARE WE IN A RANGE CONDITION
JRST DISP5 ; NO
TRNE P3,C. ;[157]Character string?
JRST TYPC ;[157]YES.
AOS T5,RANLIM ; YES INCREMENT VARIABLE
TRNE T0,DOUBLE ;[112] IS THIS A DOUBLE WORD ARRAY RANGE
AOS T5,RANLIM ;DOUBLE WORD ARRAYS GO UP BY TWO
CAMG T5,RANGE ;TO LIMIT OF RANGE
JRST DISP10 ;AND TYPE ALL REQUIRED
JRST DISP5 ;[157]DONE. Go clean up
TYPC: MOVE T5,RANLIM ;[157]Restore base
AOS T2,CLMOFF ;[157]Count this element
CAMG T2,CLMRNG ;[157]Was that the last?
JRST DISP10 ;[157]NO. Go type next element
DISP5: SKIPGE TERMK ;[323] END OF USER INPUT LINE YET?
JRST DISP4 ; NO - KEEP GOING
POPJ P, ; YES - END OF TYPE COMMAND
JUSTFY: TRZN P3,ANYMOD ;SEE IF FIRST OUTPUT THIS VARIABLE
jrst [LINE
jrst .+1]
TYPE( = )
MOVE T5,LWT ;GET BACK THE OUTPUT VARIABLE CONTENTS
POPJ P,
; GET THE LIMIT OF A RANGE CONDITION AND CHECK THE ORDER
DISP1:
; if character, save original offset, get new offset, save as
; hi offset. (ranlim?)
;
;
;
MOVEM T5,RANGE ;REMEMBER START OF RANGE
MOVE T5,CLMOFF ;[157]Get beginning offset
MOVEM T5,CLMRNG ;[157]Save it in case this is /C
TLZ T0,GRPFL ;NO GROUP REQUESTS HERE OR PRINT MODIFIERS
MOVE T5,MATHSM ;[403]SAVE CURRENT SYMBOL
MOVEM T5,TEM10 ;[403]
PUSHJ P,SYMIN ;GET NEXT SYMBOL
JRST DISP9 ;BAD LABEL
JRST BADSYN ;STATEMENT NO. ????
MOVE T4,TEM10 ;[403]GET FIRST SYMBOL BACK
CAME T4,MATHSM ;ARE THEY THE SAME
JRST ERR40 ;NO - SORRY
TRZE T0,SUBFLG ;WAS THERE AN IMPLIED RANGE
JRST DISP11 ;YES - GO DEAL WITH IT
CAML T5,RANGE ;SORT OUT SYMBOL ORDER
EXCH T5,RANGE ;CHANGE THEIR ORDER
CAIN T2,"-" ;"-" IS A DELIMITER BUT IS BAD HERE
JRST BADSYN
TLO T0,GRPFL ;O.K. FOR GROUPS AGAIN
TRNN P3,C. ;[322] MODE Character?
JRST DISP10 ;[322] No - Now type range
; clmrng=first offset given
; clmoff=offset just received
DISP1B: MOVE T2,CLMOFF ;[157]Get the lower offset
CAMLE T2,CLMRNG ;[157]Is lower .le. upper?
EXCH T2,CLMRNG ;[157]NO. Make it so
MOVEM T2,CLMOFF ;[157]Restore lower offset
JRST DISP10 ;[157]Go type for the user
SYM4: TLNE T0,GRPFL ;ARE WE ALLOWING CORE STRINGS
CAIE T2,"/" ;AND IF SO DOES THE USER WANT ONE
JRST SYM1 ;NOT IN GROUP LOGIC
; ACCEPT TEMPORARY PRINT OPTION MODIFIERS
SYM15: PUSHJ P,OPTION ;GET THE PRINT OPTION SETTINGS
JRST SYM14 ;NUMERIC - MUST HAVE BEEN A GROUP REQUEST
HRLS P3 ;[323] New settings become the default
SKIPL TERMK ;EOL?
JRST BADSYN ;CAN'T HAVE THAT!
PJRST SYMIN ;RESUME SYMIN ACTIVITIES
; HANDLE GROUP REQUESTS
SYM14: CAIL T5,1
CAILE T5,GPMAX ;WHICH MUST BE IN RANGE
JRST ERR15 ;NO GOOD
CAIE T2,"," ;ALLOW COMMA AS DELIMITER
JUMPN T2,BADSYN ;ANYOTHER CHARACTER IS BAD
PUSHJ P,SYM5 ;PROCESS GROUP CONTENTS
POP P,(P) ;REMOVE SYMIN PUSH
JRST DISP5 ;ANYTHING ELSE ON USERS LINE?
SYM1: TLNN T0,GRPFL ;IS GROUP LOGIC IN ACTION
JRST RET ;ASSUME NUL INPUT GO BACK TO USER
POP P,(P) ;REMOVE THE SYMIN PUSH
JUMPE T2,DISP5 ;EMPTY GROUP?
JRST BADSYN ;MUST BE BAD SYNTAX
; ROUTINE TO DETERMINE THE LENGTH OF AN IMPLIED RANGE
DISP14: MOVEM T5,RANLIM ;SAVE THE BASE ARRAY REFFERENCE
SETZM PUTTER ;SET FOR RAYNAM
PUSHJ P,GET.RP ;GET THE RANGE PRODUCT FOR THIS ARRAY
MOVE T5,DIMTOT ;
SOJ T5, ;
MOVEM T5,CLMRNG ;[157]In case character
TRNE T0,DOUBLE ;[307] IS IT DOUBLE PRECISION?
LSH T5,1 ;[307] YES, DOUBLE THE RANGE PRODUCT
ADD T5,RANLIM ;FORM UPPER RANGE LIMIT
MOVEM T5,RANGE ;SAVE THE RANGE
MOVE T5,RANLIM ;GET THE START ADDRESS
POPJ P,
; ENTRY POINT FOR A GROUP 'TYPE' REQUEST
; PUSHJ P,SYM5
; WITH GROUP # 1-GPMAX IN T5
; AND TERMK=0
SYM5: TRZE T1,DCOPFG ;DON'T OPEN PROG?
JRST SYM16 ;NO - DON'T
SKIPN T4,GRP2(T5) ;GET GROUP'S PROG
JRST SYM16 ;NULL - IGNORE IT
CAMN T4,OPENED ;IS IT CURRENT?
JRST SYM16 ;YES
MOVEM T4,SYM ;NO - SAVE IT
MOVSYM OPENED,T4,OLDOPN;[402]Save OPENED into OLDOPN
TRZ T1,LNAME ;[402] ASSUME SHORT NAME
SKIPE GRPFLG(T5) ;[402] WAS IT SHORT
TRO T1,LNAME ;[402] NO, SET LONG NAME FLAG
PUSH P,T5 ;SAVE (T5)
PUSHJ P,IMPOPN ;DO THE OPEN AND MESSAGE
POP P,T5 ;RESTORE (T5)
SYM16:
; CHECK FOR GROUP RECURSION
MOVEI T4,1
LSH T4,(T5) ;SET UP MASK BIT
TDOE T4,CURGRP ;CHECK AND SET
JRST ERR39 ;GROUP ALREADY ACTIVE - ERROR
MOVEM T4,CURGRP ;SAVE STATE
PUSH P,T5 ;SAVE T
IMULI T5,CFSIZ ;GET RELEVANT GROUP SECTION
ADD T5,[POINT 7,GRP1-CFSIZ] ;FORM POINTER TO IT
RECURS <CFLPTR,CFLST,GETCHR,TERMK>
;CFLPTR - SAVE CURRENT CORE POINTER
;CFLST - SAVE CURRENT CORE LIMIT
;GETCHR - SAVE CURRENT STRING SOURCE
;TERMK - SAVE CURRENT DELIMITER DESCRIPTOR
MOVEM T5,CFLPTR ;SET UP NEW POINTER
HRRZM T5,CFLST ;DEFINE NEW STRING LIMIT
MOVE T5,[ILDB T2,CFLPTR] ;GET POINTER TO NEW INFORMATION
MOVEM T5,GETCHR ;STATE NEW STRING SOURCE
PUSHJ P,DISP4 ;DO A RE-ENTER
SRUCER ;POP BACK ALL ABOVE RECURS-ED VALUES
; CLEAR CURRENT GROUP FLAG
POP P,T5 ;GET NUMBER BACK
MOVEI T4,1
LSH T4,(T5) ;SET UP MASK
TDC T4,CURGRP ;CLEAR THIS GROUP FLAG
MOVEM T4,CURGRP ;SAVE IT
PJRST DISP5 ;SEE IF THERE IS AN ORIGINAL USER
;STRING TO PROCESS
DISP3: PJRST DISP9 ;CANNOT FIND SYMBOL
;OPEN LOGIC
; input: SYM contains section name
; output: OPENED contains section name
; SSTAB points to secondary symbol table
SETNAM: SETZM SSTAB ;[402] Zero ptr to secondary symbol table
CLRFLG OPENED ;[402] Assume short name of open section
TRNE T1,LNAME ;[402] Looking for long symbol name?
JRST SETLNM ;[402] Yes
PUSHJ P,FINDP ;[321] Find program name
JRST ERR6 ; NO SUCH NAME
MOVE T5,SYM
MOVEM T5,OPENED ; PROGRAM NAME OPENED
JRST SETNM1 ;[402]
SETLNM: MOVSI T2,LPNAME ;[402]Global prefix
MOVEM T2,SYMASK ;[402]Reset mask in case it's been munged
PUSHJ P,FINDLG ;[402] Yes
JRST ERR6 ;[402] No such name
MOVE T5,SYM
STSYM T5,OPENED ;[402] PROGRAM NAME OPENED
SOJ T2, ;[402] Point to top of table
MOVEM T2,SSTAB ;[402] STORE PTR TO SECONDARY SYMBOL TABLE
MOVE T2,TMPSAV ;[402] Get .SYMTB entry in ddt symbol table
LG9LP: ADDI T2,2 ;[402] Loop to find ddt entry for program name
MOVE T5,(T2) ;[402] Get name of entry
TLNE T5,PNAME ;[402] Program name?
JRST LG9LP ;No
SETNM1: HLRE T5,1(T2) ;[321] Length of module (negative)
MOVMM T5,OPENLZ ;[321] Save positive size
ADD T5,T2 ;[321] Point to beginning of
ADDI T5,2 ;[321] symbols for
MOVEM T5,OPENLS ;[321] this module
TRNN T1,LNAME ;[402] Short program name?
JRST SETNM2 ;[402] No
;[402] Yes, Look for secondary symbol table
MOVE T5,[SQUOZE 0,.SYMTB] ;[402] .SYMTB in RAD50
MOVEM T5,SYM ;[402]
PUSHJ P,FINDL ;[402] Look for local .SYMTB
JRST SETNM2 ;[402] No .symtb
MOVEM T5,SSTAB ;[402] Store ptr to secondary symbol table
SETNM2: MOVE T5,OPENED ;[402]
MOVEM T5,SYM ;[402]
POPJ P,
; DIMENSION LOGIC
;
; [301] Reworked
;
; This is the heap which will contain dimension information.
;
; Each heap entry contains three words, and come in three types:
; 1) Empty
DENXT==0 ;Global index to next free entry
;The remaining two words are unused
;
; 2) Array Header
DSNXT==0 ;Global index to next array header
DSDIM==1 ;Global index to first dimension entry for
; this array.
DSLOC==2 ;Global index to the first element of the array
; 3) Dimension information
DDNXT==0 ;Global index to next dimension for this array
DDLOW==1 ;Lower dimension
DDRNG==2 ;Number of elements (less 1) in this dimension
; Higher dimension = DDLOW + DDRNG
; Bits 1-5 of DSDIM can contain flags.
; Note that these bits are not used by global indexing.
DFDBL==1B1 ;The array contains double-word data
DFCHAR==1B2 ;The array contains character data
DIMTAB: XLIST ;Allocate an empty heap
REPEAT DIMSIZ-1,<
EFIW .+3 ;Next empty slot
EXP 0 ;Unused
EXP 0 ;Unused
>
DIMTE: EXP 0 ;Zero index in last entry
EXP 0
EXP 0
LIST
DIMFF: EFIW DIMTAB ;Start of free slots
DIMLF: EFIW DIMTE ;End of free slots
DIMNAM: EXP 0 ;Global index to first array header
; ROUTINE TO OBTAIN A FREE DIMTAB ENTRY
; CALL PUSHJ P,GETRAY
; RETURN - ADDRESS OF SLOT IN T5
GETRAY: MOVE T5,DIMFF ;[301] Get the start of the free list
MOVE T2,DENXT(T5) ;[301] Find the location of the next slot
JUMPE T2,GETNON ;END OF LIST REACHED
MOVEM T2,DIMFF ;[301] Remove this entry from free list
POPJ P, ;RETURN WITH GOOD ENTRY ADDRESS IN T5
GETNON: PUSHJ P,FLUSHA ;REMOVE ALL STRUCTURES CREATED FOR
;THE ARRAY VALUE IN SAVLOC
TYPE(?FDTDTO Dimension table overflow)
JRST RET
; SUBROUTINE TO RETURN A DIMTAB ENTRY TO THE FREE LIST
; CALL PUSHJ P,PUTRAY
; ENTER WITH ADDRESS OF SLOT IN T5
; RETURN
PUTRAY: MOVE T2,DIMLF ;[301] Get address of end of free list
MOVEM T5,DENXT(T2) ;[301] Append the slot
SETZM DSNXT(T5) ;[301] Slot becomes end of list
MOVEM T5,DIMLF ;[301] Record that fact
POPJ P,
; ROUTINE TO LOOK THROUGH LIST OF ARRAY NAMES TO FIND IF
; THIS (SAVLOC) NAME IS ALREADY IN USE
; CALL PUSHJ P,RAYNAM
; RETURN HERE IF NOT FOUND
; RETURN HERE IF FOUND . . . T5=ADDRESS OF ARRAY, T3=LAST ARRAY
; F10RAY IN T0 IS SET IF F10 DEFINED
RAYNAM: TRZ T0,FORMAL!F10RAY ;[105] ASSUME NEITHER HOLDS
;[202]
XMOVEI T3,DIMNAM ;[301] Set up for
MOVE T5,(T3) ;[301] first array
RAY: JUMPE T5,RAY3 ;T3 WILL POINT TO THE END OF THE LIST
MOVE T2,DSLOC(T5) ;[301] THIS IS AN ARRAY BLOCK - GET THE VALUE
CAMN T2,SAVLOC ;ARE WE REDEFINING CURRENT NAME?
JRST RAY2 ; YES - REMOVE THE ENTRY FIRST
MOVE T3,T5 ;T3 WILL POINT TO THE CURRENT GOOD ENTRY
MOVE T5,DSNXT(T5) ;[301] Find the next entry
JRST RAY
RAY2: TRZ T0,DOUBLE!CHARS ;[301] Assume they are going to be off
MOVE T4,DSDIM(T5) ;[301] Flags from array entry
TLNE T4,(DFDBL) ;[301] Is it double word?
TRO T0,DOUBLE ;[301] Yes - Remember that
TLNE T4,(DFCHAR) ;[301] Character array?
TRO T0,CHARS ;[157]YES. mark it.
JRST CPOPJ1 ;ARRAY IDENTIFIED EXIT
; HERE IF NO USER DEFINITION EXISTS IN FORDDT DIMENSION LISTS
; NOW CHECK FOR AN F10 DEFINITION
RAY3: PUSH P,T5 ;SAVE BOTH T5 AND-
PUSH P,T3 ; T3 AROUND EVAL
MOVE T5,SAVLOC
TRO T0,SILENT ;DON'T PRINT SYMBOL
PUSHJ P,LOOK ;SETS UP P1 FROM T5
JRST RAYPOP ;
JRST RAYPOP ;DOSENT EXIST
POP P,T3 ;RETURN T3
POP P,T5 ; AND T5
MOVE S4,P1 ;[321] GET THE ARRAY SYMBOL
MOVE T2,(S4) ; AND SEE IF WE HAVE AN F10 ARRAY -
TRNE T1,LNAME ;[402] Long name?
JRST RAY3A ;[402] Yes - skip
TLZ T2,PNAME ; DEFINITION -
TLO T2,(50B5) ;[301] THIS IS THE SAME SYMBOL
RAY3A: CAME T2,2(S4) ;[402] WITH FLAGS 50 SET
POPJ P, ;NO - NOT AN F10 DEFINITION
TRO T0,F10RAY ;YES - FLAG THIS AS AN F10 ARRAY
MOVE S4,3(S4) ;SET POINTER TO ARRAY TABLE INFORMATION
LDB T2,[POINT 4,1(S4),12]
TRZ T0,DOUBLE ;[162]MAKE SURE DOUBLE IS OFF
CAIE T2,TP%DPR ;[112] [161]Double word array?
CAIN T2,TP%DPX ;[162]NO. G-Floating double array?
TROA T0,DOUBLE ;[162]YES FLAG IT & reset character flag
CAIN T2,TP%CPX ;[210]Complex is double word array also
TRO T0,DOUBLE ;[210]Yes it's complex
CAIE T2,TP%CHR ;[161]Character array?
TRZA T0,CHARS ;[161]NO
TRO T0,CHARS ;[161]YES
;[161] LDB T2,[POINT 9,1(S4),8]
LDB T2,[POINT 7,1(S4),8] ;[161]
MOVEM T2,DIMCNT ;SET UP THE NUMBER OF DIMENSIONS
LDB T2,[POINT 2,2(S4),1] ;[301] Array & Formal flags (V6 or before)
CAIN T2,2 ;[301] V7 Fortran (or later)?
LDB T2,[POINT 2,2(S4),3] ;[301] Yes - These flags instead
TRNN T2,1 ;[301] Is it a formal array argument?
JRST RAY5 ;[301] No
TRO T0,FORMAL ;[301] Yes - Flag it
XMOVEI T5,@1(S4) ;[301] Get the actual array base
MOVEM T5,FRMSAV ;[301] Save the formal reference
RAY5: ADDI S4,3 ;[301] SET TO POINT TO THE FIRST DIMENSION
JRST CPOPJ1
RAYPOP: POP P,T3 ;[321] MUST RESET T3-
POP P,T5 ; AND T5 BEFORE
POPJ P, ; GIVING A NO FOUND EXIT
; ROUTINE TO CREATE AN ARRAY ENTRY
; MUST HAVE A PAIR OF SUBSCRIPTS IN TEM,TEM1
; CALL PUSHJ P,PUTNAM
; ENTER WITH SAVLOC = VALUE OF NAME OF ARRAY
PUTNAM: PUSH P,T0 ;SAVE FLAGS ROUND THE NEXT FEW LINES
PUSHJ P,SIMDEF ;SEE IF THIS ARRAY NAME IS AFTER BASE-ARRAY
PUTCHK: PUSHJ P,RAYNAM ;HAVE WE USED THIS NAME BEFORE?
JRST PUTOK ;NO - GO AHEAD - PLACE NEW NAME
PUSHJ P,FLUSH ;NAME ALREADY IN USE STAND BY FOR REDEFINITION
TRZE T0,FORMAL ;ATTEMPT TO RE-DIMENSION A FORMAL PARAMETER
JRST [POP P,T0 ;[403]
JRST ERR33] ;[403]NO YOU DON'T
TRNN T0,F10RAY ;F10 DEFINED ARRAY?
JRST PUTCHK ;RESET ALL
JRST ERR28 ;WARN OF F10 REDEFINITION
PUTOK: POP P,T0 ;RESTORE FLAGS FROM ABOVE
PUSHJ P,GETRAY ;[301] GET A SLOT - END OF NAMES = T3
MOVEM T5,T4 ;SAVE FOR NAME DEFINITION - T4
PUSHJ P,GETRAY ;[301] GET A SLOT FOR DIMENSION DEFINITION
;ENSURE WE HAVE 2 SLOTS FREE NOW
;SAVE PAIN IN 'FLUSHING' LATER
MOVEM T4,DSNXT(T3) ;[301] SAY HELLO TO NEW MEMBER
SETZM (T4) ;NEW MEMBER BECOMES END OF CHAIN
MOVE T2,SAVLOC ;GET THE NEW MEMBERS NAME
MOVEM T2,DSLOC(T4) ;[301] ACCEPT THE NEW MEMBER TO THE FAMILY
TRNE T0,DOUBLE ;IS THIS A DOUBLE WORD ARRAY
TLO T5,(DFDBL) ;[301] YES - SAVE THE FACT
TRNE T0,CHARS ;[157]Character array?
TLO T5,(DFCHAR) ;[301] YES.
MOVEM T5,DSDIM(T4) ;[301] NEW MEMBERS ARE GIVEN A DIMENSION LIST
PUSHJ P,PUTSUB ;STORE THE SUBSCRIPTS
JRST CPOPJ1 ;JUMP OVER POSSIBLE PUTDIM ENTRY
PUTSUB: MOVE T2,TEM1 ;GET THE UPPER SUBSCRIPT
SUB T2,TEM ;[301] Compute the
MOVEM T2,DDRNG(T5) ;[301] dimension range
MOVE T2,TEM ;[301] Save the
MOVEM T2,DDLOW(T5) ;[301] lower dimension
SETZM DDNXT(T5) ;[301] End of present list
MOVEM T5,PUTTER ;SAVE THE END OF THE DIMENSION LIST
POPJ P,
; ROUTINE TO ADD ANOTHER DIMENSION TO AN ARRAY DIMENSION LIST
; CALL PUSHJ P,PUTDIM
; ENTER WITH TEM,TEM1 = LOWER AND UPPER SUBSRIPTS
PUTDIM: PUSHJ P,GETRAY ;[301] GET A FREE ENTRY
MOVE T2,PUTTER ;FIND WHERE THE LAST DIMENSION WAS STORED
MOVEM T5,DDNXT(T2) ;[301] Link new entry to list
PJRST PUTSUB ;SAVE THE SUBSCRIPTS
; ROUTINE TO GET THE DIMENSIONS, IN ORDER, FOR THE ARRAY VALUE(SAVLOC)
; CALL PUSHJ P,GETDIM
; WITH ARRAY VALUE IN SAVLOC AND PUTTER = 0 FOR FIRST CALL
; EXIT WITH TEM=SUB LOWER TEM1=SUB UPPER
GETDIM: SKIPE T5,PUTTER ;IS THIS THE FIRST CALL?
JRST GET4 ; NO - GET NEXT DIMENSION RANGE
PUSHJ P,RAYNAM ;YES - SET UP THE ARRAY REFERENCES
JRST E5 ;SAVLOC NAME NOT KNOWN??
TRNE T0,F10RAY ;F10 DEFINED?
JRST GET3 ;YES
MOVE T5,DSDIM(T5) ;[301] GET THE START OF DIMENSION LIST
JRST GET5 ;FIRST TIME IS SPECIAL
GET4: TRNE T0,F10RAY ;F10 ARRAY DEFINITION?
JRST GET3 ;YES
MOVE T5,DDNXT(T5) ;[301] GET NEXT DIMENSION IF ANY
GET5: JUMPE T5,ERR22 ;END OF LIST - TOO MANY DIMENSIONS EXPECTED
MOVEM T5,PUTTER ;SAVE LINK TO NEXT DIMENSION
MOVE T3,DDLOW(T5) ;[301] Get the
MOVEM T3,TEM ;[301] lower dimension
ADD T3,DDRNG(T5) ;[301] Form the
MOVEM T3,TEM1 ;[301] upper dimension
POPJ P,
; HERE TO GET THE NEXT UPPER AND LOWER BOUNDS
; FOR AN F10 DEFINED ARRAY
GET3: SETOM PUTTER ;FLAG NOT FIRST TIME FOR F10 ARRAYS
SOSGE DIMCNT ;ARE THERE ANY MORE DIMENSIONS TO COME?
JRST ERR22 ;NO HARD LUCK
MOVE T5,@(S4) ;GET THE LOWER BOUND
MOVEM T5,TEM ;SAVE LOWER
MOVE T5,@1(S4) ;GET THE UPPER BOUND
MOVEM T5,TEM1 ;SAVE UPPER
ADDI S4,3 ;[301] S4 NOW POINTS TO NEXT DIMENSION-
POPJ P, ; IF ANY
; ROUTINE TO GUARD AGAINST SIMULTANEOUS SINGLE COMMAND RE-DIMENSIONING
; OF THE SAME ARRAY. THE LOCATION BASRAY CONTAINS A REFFERENCE TO
; THE ARRAY NAME WHICH STARTED THE CURRENT DIMENSION WORKING
; AND WILL BE THE POINT IN THE NAMES LIST AFTER WHICH A REDEFINITION
; OF THE NAME NOW FOUND IN SAVLOC WILL BE ILLEGAL
SIMDEF: MOVE T4,SAVLOC ;GET THE NEW ARRAY NAME(VALUE)
EXCH T4,BASRAY ;SAVE AND START AT BASE-ARRAY NAME
PUSHJ P,RAYNAM ;SET UP POINTERS TO BASE-ARRAY
POPJ P, ; ????
MOVEM T4,BASRAY ;RESET BASE ARRAY AND CURRENT NAME
TRNE T0,F10RAY ;F10 DEFINED ARRAY?
POPJ P, ;MUST BE A NEW DEFINITION
PUSHJ P,RAY ;SEE IF THIS ARRAY NAME OCCURS AFTER BASRAY
POPJ P, ;NO
TYPE (?FDTMLD )
MOVE T5,SAVLOC ;GET THE OFFENDING VALUE
PUSHJ P,LOOK ;DISPLAY IT
JFCL
JFCL
TYPE( Multi-level array definition not allowed.)
PUSHJ P,FLUSHA ;FLUSH ALL FROM BASRAY TO END OF NAME LIST
JRST RET ;EXIT TO USER MODEFORDDT
; ROUTINE TO ENSURE THAT THERE ARE NO MORE DIMENSIONS
; TO BE CHECK FOR THIS (SAVLOC) ARRAY
SUBCHK: PUSHJ P,MORDIM ;ARE THERE ANY MORE DIMENSIONS LEFT
POPJ P, ;O.K.
JRST ERR1 ;NOT ENOUGH DIMENSION INFO
; TYPE THE DIMENSION LIST FOR THE ARRAY NAME VALUE IN SAVLOC
DIM1: PUSHJ P,RAYNAM ;SET UP REFERENCES TO THIS ARRAY NAME
JRST ERR34 ;NONE SUCH
TRNE T0,F10RAY ;IS THIS AN F10 DEFINED ARRAY
SKIPA T4,[EXP SAVLOC-1] ;IF SO FOOL TYPDIM
MOVE T4,T5 ;PREPARE FOR TYPDIM
PUSHJ P,TYPDIM ;TYPE OUT THE DIMENSIONS
JRST RET ;ALL DONE
; ROUTINE TO REMOVE AND RETURN(GARBAGE COLLECTION) ALL REFERENCE
; TO THE ARRAYS WHICH FOLLOW THAT DEFINED IN SAVLOC IF FLSHAL IS SET
FLUSHA: TRO T0,FLSHAL ;SET UP TO FLUSH ALL FROM BASE-ARRAY
MOVE T5,BASRAY ;GET THE BASE ARRAY VALUE
MOVEM T5,SAVLOC ;AND SET UP FOR RAYNAM
PUSHJ P,RAYNAM ;RESET F10RAY FLAG TO NEW BASRAY SETTING
POPJ P, ;?????
FLUSH: TRNN T0,F10RAY ;NOTHING TO DO IF AN F10 ARRAY
PUSHJ P,RAYNAM ;SET UP POINTERS TO THE ARRAY IN SAVLOC
POPJ P, ; CAN'T FIND THE ARRAY NAME
;T3=POINTS TO LAST ARRAY NAME BLOCK
;T5= CURRENT ARRAY NAME BLOCK
FLUSH2: MOVE T4,DSDIM(T5) ;[301] GET DIMENSION LIST ADDRESS
MOVE T2,DSNXT(T5) ;[301] GET NEXT MEMBER ADDRESS
MOVEM T2,DSNXT(T3) ;[301] LOOP OUT THE OFFENDING ARRAY NAME ENTRY
PUSHJ P,PUTRAY ;[301] RETURN A ENTRY
PUSHJ P,DELIST ;DELETE THE LIST STARTING AT C(T4)
TRNN T0,FLSHAL ;HARD FLUSH?
POPJ P, ;JUST ONE ARRAY FOR NOW
MOVE T5,DSNXT(T3) ;[301] GET NEXT ARRAY REFERENCE IF ANY
JUMPE T5,CPOPJ ;EXIT IF END OF LIST
JRST FLUSH2 ;MORE TO DO
;ROUTINE TO DELETE A LIST - STARTING IN T4
DELIST: SKIPN T5,T4 ;TEST FOR END OF LIST - RETURN ENTRY IN T5
POPJ P, ;END OF LIST
MOVE T4,DDNXT(T4) ;[301] GET NEXT ENTRY ADDRESS
PUSHJ P,PUTRAY ;[301] RETURN THE OLD ENTRY
PJRST DELIST ;FOLLOW THROUGH TO END OF LIST
DIM5: PUSHJ P,DIMOUT ;DISPLAY ALL ARRAY INFO.
LINE
JRST RET
; DIMENSION LOGIC
CARRAY: TROA T0,CHARS ;[157]Character array
DUBLE: TRO T0,DOUBLE ;[112] FLAG THIS AS A DOUBLE WORD ARRAY
DIM: JUMPL T0,DIM5 ;OUTPUT ALL DIMENSION SPECS
PUSHJ P,TTYIN ;GET NEXT USER STRING
JUMPE T3,DIM5 ;TYPE ALL ARRAYS IF EOL
PUSHJ P,ALLNUM ;SEE IF USER TYPED A LABEL
JRST DIM13 ;NO - MUST BE VARIABLE
JRST BADSYN ;BAD SYNTAX
DIM13: PUSHJ P,VALID ;CHECK VALIDITY OF VARIABLE
STSYM T4,MATHSM ;[402]THATS WHAT USER TYPED
MOVEM T4,SYM ;SAVE FOR 'EVAL'UATION
PUSHJ P,EVAL ;EVALUATE SYMBOL
JRST ERR6 ;WE DON'T HAVE IT
MOVEM T5,SAVLOC ;SAVE ARRAY NAME VALUE
MOVE T2,LSTCHR ;RE-INSTATE USERS LAST CHARACTER
SKIPL TERMK ;END OF LINE?
JRST DIM1 ;YES - USER WANTS TO SEE DIMENSION LIST
PUSHJ P,NXTCHR ;MOVE TO NEXT SIGNIFICANT CHARACTER
CAIN T2,"(" ; [ DENOTES START OF DIMENSION DEFINITION
JRST DIM14 ;COMMAND - WILL NOW BE NON ZERO
CAIE T2,"[" ; ( IS AN ALTERNATIVE TO [
JRST DIM7
TLO T0,LFTSQB ;FLAG THAT A LSB FOUND - SO RSB MUST END SPEC
DIM14: PUSHJ P,DIMIN ;SET UP A NEW ARRAY DEFINITION
JRST RET
DIM7: CAIE T2,"/" ;A / IS ACCEPTABLE TO REMOVE ARRAYS
JRST BADSYN ;ANYTHING ELSE WONT DO
PUSHJ P,TTYIN ;GET NEXT INPUT
JUMPN T2,BADSYN ;MUST BE LINE END NOW
JUMPE T3,BADSYN ;NO CHARACTERS??
LSHC T2,6 ;GET THE FIRST SWITCH CHARACTER
CAIE T2,'R' ;DID THE USER REQUEST A REMOVE
JRST BADSYN ;NO - WELL TOO BAD
PUSHJ P,RAYNAM ;SEE IF WE KNOW ABOUT HIS ARRAY
JRST ERR26 ;NO - TELL HIM
PJRST DMFLSH ;REMOVE IT
; ROUTINE TO SET UP A NEW ARRAY DEFINITION
DIMIN: SETZM DIMTOT ;CLEAR TOTAL ELEMENT COUNT
TROE T0,BASENM ;HAS A BASE NAME BEEN ACCEPTED
JRST DIM0 ;YES - DON'T FLUSH YET
SETZM F10RP ;[163]Reset
PUSH P,T0 ;PROTECT THE DOUBLE FLAG AWHILE
PUSHJ P,RAYNAM ;HAVE WE HAD THIS BASE ARRAY BEFORE
JRST DIMBAS ;[163]No references to this array
TRNE T0,F10RAY ;[163]Compiler reference?
JRST DRNGPR ;[163]YES. Go get range product
PUSHJ P,FLUSH ;[163]Clear user reference
PUSHJ P,RAYNAM ;[163]Look for compiler reference
JRST DIMBAS ;[163]None
TRNN T0,F10RAY ;[163]Better be F10 defined!!!!
JRST DIMBAS ;[163]NOT!!!!!
DRNGPR: SETZM PUTTER ;[163]Reset first-time flag
PUSHJ P,GET.RP ;[163]Get the compiled range-product
MOVE T5,DIMTOT ;[163]Load the range product
MOVEM T5