Trailing-Edge
-
PDP-10 Archives
-
BB-D480C-SB_1981
-
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 ,6(154)
SUBTTL P.E.T. HARDING/DBT/FLD/MD/JMT/MA/SJW/JNG/DCE/BPK/CKS/DCC/BAH 02-OCT-81
;COPYRIGHT (C) 1973,1977,1978,1979,1980,1981 BY
;DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.
;
;
;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==154 ;EDIT NO
VERSION==6 ;MAJOR VERSION NO
VMINOR==0 ;MINOR VERSION NO
VWHO==0 ;WHO LAST EDITED
.JBDDT=74
.JBREN=124
.JBVER=137
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
; 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 [SETMI] ;[147] define XMOVEI for -10
> ;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
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.
***** End Revision History *****
\;END OF COMMENT
SUBTTL DEFINITIONS
;DEFINE ACCUMULATORS
ENTRY FORDDT,FDDT.,.F10,%FDDT
EXTERN .JBREL,.JBHRL,.JBSYM,.JBHSM,.JBSA,.JBUSY,.JBOPC,.JBDA
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
;DEFINE SYMBOL TABLE SYMBOL TYPES
GLOBAL==040000 ;GLOBAL SYMBOL
LOCAL==100000
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
FO$HSP==4 ;[142] FOR RETURNING HISEG SYBOL TABLE PTR.
; DEFINE SYSTEM PARAMETERS
IFNDEF NBP,<NBP==^D10> ;NUMBER OF PUASE REQUESTS
IFNDEF GPMAX,<GPMAX==10> ;NUMBER OF GROUP STRINGS (MAX 35 )
IFNDEF PDSIZ,<PDSIZ==10*GPMAX+40> ;DEFINE PDL SIZE TO ALLOW ALL GROUPS TOGETHER
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 TWO WORD PAIRS
USED TO HOLD ARRAY DIMENSION DATA
\
;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 ;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
FPRNM== 000002 ; FIND PROGRAM NAME (FOR FNDSYM)
FLCLNM==000001 ; FIND LOCAL IN CURRENT OPEN PROGRAM (FOR FNDSYM)
;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
PNAMEF==020000 ;PROGRAM NAME SEEN IN SYBOL TABLE SEARCH
MDLCLF==010000 ;USED BY LOKSYM AND FNDSYM - 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
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 TF ***
;
; TF 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
; *** FLAG TMOD ***
;
; DEFINE THE PRINT OPTION FLAGS USED IN LEFT & RIGHT OF TMOD
; RIGHT HAND - DEFAULT USER SETTING
; LEFT 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
C.==000100 ;TYPE COMPLEX FORM
B.==000200 ;[120] 'BIG' OPTION REQUESTED
L.==002000 ;[120] LOGICAL FORMAT (.TRUE. AND .FALSE.) OR TRACE LABELS
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 F - "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
; ? E9 INTERNAL INCONSISTENCY (FNDSYM)
; THESE ERRORS SHOULD NEVER OCCUR - BUT COULD INDICATE THAT
; THE SYMBOL TABLE HAD BEEN MODIFIED(OVERLAYED?) OR SOMETHING
SUBTTL MACRO'S
DEFINE SETPDL ;SETUP PDL STACK
< MOVE P,[IOWD PDSIZ,PDL] >
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,tf
hrroi tf,[asciz/x/]
psout%
pop p,tf >
define atype(x)
< push p,tf
hrroi tf,x
psout%
pop p,tf >
define stype(x)
< push p,tf
hrroi tf,[asciz x]
psout%
pop p,tf >
define line
< push p,tf
hrroi tf,[byte(7)15,12,0]
psout%
pop p,tf >
define openp
< push p,tf
hrrzi tf,"("
pbout%
pop p,tf >
define closep
< push p,tf
hrrzi tf,")"
pbout%
pop p,tf >
define openb
< push p,tf
hrrzi tf,74
pbout%
pop p,tf >
define closeb
< push p,tf
hrrzi tf,76
pbout%
pop p,tf >
define tab
< push p,tf
hrrzi tf,11
pbout%
pop p,tf >
define putchr(x)
< push p,tf
move tf,x
pbout%
pop p,tf >
> ;end of conditional
DEFINE SKIPIF(STRING) ;IS STRING LOADED? - SKIP IF IT IS
< MOVE T,[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 T,[SQUOZE 0,NAME]
MOVEM T,SYM
TLO F,FPRNM
PUSHJ P,FNDSYM >
; 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 T
< PUSHJ P,JUSTFY ;DO TYPE COMMAND OUTPUT JUSTIFICATION>
SALL ;SUPPRESS ALL MACRO EXPANSIONS
DEFINE NAMES<
XLIST
C ACCEPT,ACCEPT
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: ;[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]
; This is the entry point when FORDDT is first run. All
; initialization procedures are performed, including a call
; to FOROTS' RESET.
SFDDT: JSR SAVE ;[145] SAVE THE WORLD
PUSHJ P,REMOVB ;REMOVE ANY STANDING PAUSE REQUESTS
LINE
TYPE(STARTING FORTRAN DDT)
LINE
MOVEI T,RE.ENT ;AND SET UP THE RE-ENTER ADDRESS
MOVEM T,.JBREN ;SO THAT FUTURE RE ENTERS WILL WORK
JSP 16,RESET.## ;[143] INITIALISE THE FOROTS SYSTEM
0,,0 ;[142] DUMMY RESET ARG
FORDD1: PUSHJ P,GHSSYP ;[142] ANY HISEG SYMBOLS?
SKIPGE .JBSYM ;NO, ANY LOSEG SYMBOLS?
CAIA
PUSHJ P,ERR20 ;NO - WARN USER
PUSHJ P,SETLST ;SETUP SYM TABLE LISTS
HRRZ T,.JBSA ;REMEMBER THE START ADDRESS
MOVEM T,JOBSA ; AND THE
MOVE T,.JBSYM ; SYMBOL TABLE DETAILS AT THE-
MOVEM T,JOBSYM ; TIME FORDDT IS ENTERED
ife tops20,< ;This hack doesn't work under TOPS20
MOVE T,[XWD -1,3] ;GET THE CURRENT JOB
GETTAB T, ; NAME
CAIA ;DON'T PANIC IF NO JOB NAME
MOVEM T,JOBNAM ;AND SAVE,
;THIS WILL SERVE TO DETECT OVERLAYS
SETZM TTYLC ;[151] DEFAULT TO DON'T FLAG LOWERCASE
MOVNI T6,1 ;[151] GET CURRENT JOB'S CONTROLLING TERMINAL UDX
TRMNO. T6, ;[151]
JRST FORDD2 ;[151] ERROR. DEFAULT TO NO FLAGGING OF LOWERCASE
MOVEI T5,.TOLCT ;[151] TRMOP. FUNCTION TO READ LOWERCASE SETTING
MOVE T,[2,,T5] ;[151] SET UP TRMOP. CALL
TRMOP. T, ;[151]
JRST FORDD2 ;[151] ERROR. ASSUME LOWERCASE. DOESN'T FLAG LC
MOVEM T,TTYLC ;[151] STORE THE SETTING
FORDD2: ;[151]
> ;END OF IFE TOPS20
HRRZI T,[JRST RET] ;GUARD AGAINST CONTINUE AFTER CNTRL C
HRRM T,PROC0
MOVEI T,1 ;RESET THE INITIAL TRACE VALUE
MOVEM T,STPVAL ; TO ONE
MOVE T,STARTU
HLLZM T,STARTU ;RESET - SO 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: SETPDL
SKIPIF (CEXIT.) ;
SETZM T ;NO CLUDGE CONECTIONS IN THIS PROG
HRRM T,HELLO ;SET UP FOR HELLO MACRO DETECTOR
MOVE F,STKYFL ;REINSTATE THE FLAG REGISTER
;[137] This routine provides g-floating
;[137] capability to those programs
;[137] compiled with the /gfl switch.
TRZ F,GFLOAT ;[137] Default to d-floating mode.
TRO TF,FGLONL ;[137] Search for globals only in sym table
MOVE TT1,[SQUOZE 0,..GFL.] ;[137] Store "..GFL." in SYM for EVAL
MOVEM TT1,SYM
PUSHJ P,EVAL ;[137] Search symbol table for "..GFL."
JRST FSET ;[137] Not found, mode is d-floating; done
MOVE F,STKYFL ;[137] Found, reinstate the flag reg(in case
;[137] F was modified by EVAL)
TRO F,GFLOAT ;[137] Set GFLOAT flag to get g-floating
MOVEM F,STKYFL ;[137] Update sticky flag store.
FSET: MOVSI T,(JFCL) ;RESET THE TRACE ENTRY
MOVEM T,FDDT. ;
MOVE T,M2.F ;GET THE FOROTS FIN CALL
MOVEM T,M2.I ;RE-INSTATE IN FORMAT - AFTER COMPLEX INPUT
; SET THE DEFAULT TYPING FORMAT TO FLOATING - ALSO SET STKYFL
MODRET: HRRZI T,F. ;SET UP TO TYPE FLOATING FORM
MOVEM T,MODFLG ;SAVE AS THE STANDARD DEFAULT
HRRZ T,STARTU ;SEE IF ALREADY STARTED
JUMPN T,RET ;YES LEAVE ANY OPENED SECTIONS ALONE
SKIPE PRGNAM ;HAS ANY SECTION BEEN OPENED?
JRST RET ;YES - SO NOT FIRST TIME THROUGH
PROGIF (MAIN.) ;SKIP IF MAIN. IS LOADED
BEGIN2: PUSHJ P,GETPRG ;NOT FOUND - GET THE MAIN PROGRAM NAME
MOVE T3,[SQUOZE 0,MAIN.]
MOVEM T3,PRGNAM ;DEFAULT MAIN PROG NAME IS MAIN.
MOVEM T3,SYM ;SET SO SETNAM CAN OPEN THE MAIN PROGRAM
PUSHJ P,SETNAM ;'OPEN' THE MAIN PROGRAM
SUBTTL USER INPUT
RET: HRRZ TMOD,MODFLG ;SET UP THE DEFAULT TYPING OPTIONS ONLY
AND F,[STIKYS] ;MAKE SURE WE SAVE THE GOOD FLAGS
MOVEM F,STKYFL ; IN THE STICKY STORE
SETZI TF, ;RESET THE TEMPORARY FLAGS
SKIPGE TERMK ;END OF LAST LINE SEEN?
PUSHJ P,CLRLIN ;CLEAR OUT THE REST OF USERS LINE
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,tf ;save tf
push p,r ;save r
hrrzi tf,.priou ;get terminal output designator
rfmod% ;get terminal JFN word
tlz r,(tt%osp) ;clear ^o effects
hrrzi tf,.priou ;get terminal output designator
sfmod% ;set new JFN word
pop p,r ;restore r
pop p,tf> ;restore tf, end of conditional
LINE
PUSHJ P,OVRLAY ;HAS AN OVERLAY OCCURED
pushj p,readcm ;prompt and read user command
JUMPE T2,RET ;NO SIGNIFICANT INFORMATION
MOVEM T2,COMAND ;SAVE USER COMAND
JUMPN T1,BADSYN ;COMMAND TERMINOLOGICAL INEXACTITUDE
SKIPGE T1,TERMK ; SPACE IS NOT EOL
TLZA F,EOL ;CLEAR EOL FLAG
TLO F,EOL ;SET EOL FLAG
;NOW SEE WHAT USER WANTS!
; ENTER WITH SIXBIT USER COMMAND IN T2
;
; EXIT TO COMMAND IF RECOGNISED AND UNIQUE, OTHERWISE
; DISPATCH TO UNKNOWN OR COMMAND NOT UNIQUE ROUTINES
; N.B. T1 = DISPATCH ADDRESS
; T2 = USER COMMAND NAME
; T3 = OFFICIAL COMMAND NAME
COMCON: MOVE T2,COMAND ;GET USER COMMAND IN T2
MOVEI P3,DISP ;START OF DISPATCH TABLE
MOVE P4,[XWD -DISPL,COMTAB] ;STEP THRO COMMANDS
MOVE T1,T2 ;COPY USER COMMAND
SETOI T4, ;SET ALL ONES MASK
LSH T4,-6 ;SET MASK IN
LSH T1,6 ; T4 TO LENGTH OF
JUMPN T1,.-2 ; USER COMMAND
MOVEI AR,0 ;NO. OF NON-UNIQUE OCURRENCES
MOVE T1,P4 ;AOBJN FOR COMMAND TABLE
COMLP: MOVE T3,(T1) ;GET NEXT COMMAND
TDZ T3,T4 ;MASK OUT FOR MATCH WITH USER
CAMN T2,(T1) ;EXACT MATCH?
JRST COMFND ; YES - THIS IS IT
CAME T2,T3 ;MATCH SO FAR
JRST COMNEQ ;NO MATCH AT ALL
AOS AR ;FLAG ANOTHER MATCH
HRL P3,T1 ;MARK LAST INDEX
COMNEQ: AOBJN T1,COMLP ;TRIED ALL KNOWN COMMANDS?
JUMPN AR,.+2 ;UNKNOWN?
AOS T1 ;SET FOR NONE UNIQUE
CAIN AR,1 ;WAS THE COMMAND UNIQUE?
HLR T1,P3 ;YES - REMEMBER THIS INDEX
COMFND: MOVE T3,(T1) ;SAVE OFFICIAL COMMAND NAME
SUBI T1,(P4) ;INDEX DOWN DISPATCH
ADDI P3,(T1) ;INDEX INTO DISPATCH
MOVE T1,(P3) ;GET DISPATCH ADDRESS
JRST @T1 ; DISPATCH
SUBTTL COMMAND DECODER
DEFINE C(A,B)
< SIXBIT/A/ >
COMTAB: XLIST ;NAMES
NAMES
LIST
DISPL=.-COMTAB
DEFINE C(A,B)
< EXP B >
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: HRRZ T,STARTU ;USER MUST INITIALISE WITH START
JUMPE T,ERR4 ;MUST TYPE START FIRST
SKIPN ESCAPE ;ARE WE ALLOWING ESCAPES
JRST ERR30 ;NO TRACE
MOVE T,P ;SAVE FORDDT STACK PIONTER
MOVE T1,16 ;SAVE FORDDT REG 16??
MOVE P,SAVACS+17 ;[147] SET UP FORTRAN STACK
MOVE 16,SAVACS+16 ;[147] - AND REG 16
PUSHJ P,TRACE.## ;[143] DO A FORTRAN TRACE
MOVE P,T ;MUST RESTORE FORDDT STACK
MOVE 16,T1 ;AND 16
JRST RET ;END OF TRACE
; START FUNCTION
START: MOVSI T,(JFCL) ;RESET THE TRACE ENTRY
MOVEM T,FDDT. ;
PUSHJ P,CLRLIN ;FLUSH OUT LINE BUFFER
START2: MOVE T,PRGNAM ;GET THE MAIN PROGRAM NAME
MOVEM T,SYM ;SAVE FOR EVAL
TLO F,FPRNM ;LOOK FOR PROGRAM NAMES
PUSHJ P,FNDSYM ;FIND THE START
JRST ERR8 ;NO START ADDRESS
HRRM T,STARTU ;SAVE FOR GO
MOVEM F,STKYFL ;MAKE THE FOROTS FLAG STICK
PUSHJ P,RE.NTR ;ALLOW RE-ENTERS AGAIN
PUSHJ P,INSRTB ;PUT IN BREAKPOINTS
JSP T,RESTORE
SETZI 16, ;MAKE F40 STRACE WORK
STARTU: JRST .-. ;START USER PROGRAM
; GOTO STATEMENT LABEL OR SYMBOL CONTENTS
GOTO: JUMPL F,START4 ;NO ARGUMENTS = START AT LAST GOTO
PUSHJ P,SYMIN ;GET USERS ARGUMENT
JRST ERR6 ;NONE SUCH
CAIA ;NUMERIC
MOVE T,(T) ;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: HRRZ T,STARTU ;GET START ADDRESS
HRRZ T1,STARTU ;SEE IF A START HAS BEEN DONE
JUMPE T1,ERR4 ;NO, REFUSE STARTS AND GOTO'S
MOVEM T,GOLOC ;SET UP FOR EXTASK
SETOI T1,
MOVSI T,(POPJ P,) ;HAVE WE STOPPED AFTER A NEXT?
CAMN T,LEAV ;IF SO LEAV WILL BE A POPJ P,
SUBM T1,AC17 ;SOBJN!!!!
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 (T)
JRST ERR24 ;NOT ALLOWED
PUSHJ P,RE.NTR ;ALLOW RE-ENTERS AGAIN
MOVSI T,(JFCL) ;RESET THE TRACE ENTRY
MOVEM T,FDDT. ;
PUSHJ P,EXTASK ;TRANSFER TO EXTERNAL TASK
; OPEN
OPEN: JUMPL F,OPEN2 ;ASSUME MAIN PROG IF JUST 'OPEN'
PUSHJ P,TTYIN ;WHAT NEXT
JUMPN T1,BADSYN ;MUST BE LINE END DELIMITER
JUMPE T2,BADSYN ;MUST HAVE SOME CHARACTERS
PUSHJ P,VALID ;CHECK VALIDITY & GET RAD50 IN T3
OPEN3: MOVEM T3,SYM ;SAVE FOR 'OPEN'
PUSHJ P,SETNAM ;DO THE OPEN
JRST RET ;WHAT NEXT
OPEN2: MOVE T3,PRGNAM ;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
HRRZM T,GOLOC ;SAVE ADDRESS
JRST EXTASK ;TRANSFER TO EXTERNAL TASK
MAPDDT: MOVE T,[.PAGCA,,700] ;[115] CHECK FOR PAGE 700
PAGE. T, ;[115] IS IT THERE?
JRST ERR11 ;[115] NO PAGE UUO, NO VMDDT
TLNN T,(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 T,['SYS ' ;[115] SET UP TO GET DDT
'VMDDT '
EXP 0,0,0,0]
MERGE. T, ;[115] GET IT
JRST [MOVSI 17,MRGACS ;[115] CAN'T, TOUGH
BLT 17,17
JRST ERR11]
MOVE T,[775777,,700000] ;[122] SET .JBDDT
SETDDT T, ;[122]
MOVSI 17,MRGACS ;[115] PUT ACS BACK
BLT 17,17
GODDT: MOVEI T,700000 ;[115] SET ADDRESS
MOVEM T,GOLOC
JRST EXTASK ;[115] GO CALL EXTERNAL TASK
>
IFN TOPS20,<
DDT: MOVE 1,[.FHSLF,,770] ;[114] LOOK AT PAGE 770
RPACS% ;[114] GET PAGE ACCESS BITS
TXNN 2,PA%PEX ;[114] DOES PAGE 770 EXIST?
JRST MAPDDT ;[114] NO, GO MAP IN UDDT.EXE
MOVE 1,770000 ;[114] GET DDT ENTRY VECTOR
CAMN 1,[JRST 770002] ;[114] IS IT REALLY DDT?
JRST GODDT ;[114] YES, JUMP TO IT
MAPDDT: MOVEI 1,.FHSLF ;[114] GET ENTRY VECTOR LOC
GEVEC%
PUSH P,2 ;[114] SAVE SINCE GET WRECKS IT
MOVX 1,GJ%SHT+GJ%OLD ;[114] SHORT FORM, FILE MUST EXIST
HRROI 2,[ASCIZ /SYS:UDDT.EXE/] ;[114] DDT
GTJFN% ;[114] FIND IT
ERJMP ERR11 ;[114] NOT THERE, CAN'T HELP
HRLI 1,.FHSLF ;[114] MAP INTO THIS FORK
GET% ;[114] READ IN DDT
ERJMP ERR11 ;[114] CAN'T
DMOVE 1,116 ;[114] GET SYMBOL TABLE POINTERS
MOVEM 1,@770001 ;[114] STORE FOR DDT
MOVEM 2,@770002
POP P,2 ;[114] GET ENTRY VECTOR BACK
MOVEI 1,.FHSLF ;[114] THIS FORK
SEVEC% ;[114] RESTORE ENTRY VECTOR
GODDT: MOVEI T1,770000 ;[114] GET DDT START ADDRESS
MOVEM T1,GOLOC ;[114] SAVE
JRST EXTASK ;[114] GO CALL EXTERNAL TASK
>;[114] END IFN TOPS20
; EXIT FUNCTION
EX.: JUMPGE F,EX.R ;IS THE USER REQUESTING A MONITOR RETURN
HRRZ T,STARTU ;NO - SEE IF A START HAS BEEN DONE
JUMPN T,.+2
jrst ex.a ;JUST A NORMAL EXIT
MOVE T,STARTU ;REMOVE START ADDRESS SO-
HLLZM T,STARTU ;NO CONTINUES OR RE-ENTERS
SETZM TEM ;SET UP ARG BLOCK
SETZM TEM1 ; TO EXIT FOROTS
PUSHJ P,INSRTB ;REPLACE PAUSES
JSP T,RESTORE ;RESTORE USERS ACS
MOVEI 16,TEM ;GET EXIT ARGBLOCK
PUSHJ P,EXIT.## ;[143] DO A FOROTS EXIT
EX.R: PUSHJ P,TTYIN ;GET NEXT INPUT
JUMPN T2,BADSYN ;LOOKING FOR / - NOCHARACTERS ALLOWED
JUMPE T1,BADSYN ;BETTER BE /
CAIE T1,"/"
JRST BADSYN ;SORRY
PUSHJ P,TTYIN ;LOOK FOR RETURN
JUMPN T1,BADSYN ;NO MORE CHARACTERS ALLOWED
JUMPE T2,BADSYN ;NO CHARACTERS IN INPUT????
LSHC T1,6 ;GET FIRST CHARACTER
CAIE T1,' R' ;LOOK FOR 'RETURN' - IMPLIED BY R
JRST BADSYN ;WE DONT UNDERSTAND ANY OTHER CHARACTER
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
OVRLAY: MOVE T,.JBSYM ;GET THE SYMBOL TABLE PARAMETERS
EXCH T,JOBSYM ;SAVE NEW SYMBOL POINTERS
JUMPE T,OVRL4 ;OLD VALUE COULD BE ZERO IF NOT INITED
CAME T,JOBSYM ;COMPARE WITH LAST KNOWN VALUE
JRST OVRL2 ;SOMETHING CHANGED!!
OVRL4: HRRZ T,.JBSA ;GET THE START ADDRESS
EXCH T,JOBSA ;SAVE NEW - AND FIND OLD START ADDRESS
JUMPE T,CPOPJ ;EXIT IF OLD START NOT SET-UP
CAMN T,JOBSA ;HAS THIS CHANGED
POPJ P, ;ALL IS WELL
OVRL2: LINE
TYPE(%FDTPOV Program overlayed)
ife tops20,< ;this doesn't work under TOPS20
MOVE T,[XWD -1,3] ;SET FOR PROGRAM NAME
GETTAB T,> ;FIND THE CURRENT NAME,end of conditional
JRST OVRL3 ;SECRETIVE TYPE??
SKIPN JOBNAM ;HAS ANY NAME BEEN STORED?
MOVEM T,JOBNAM ;NO - REMEMBER THIS
CAMN T,JOBNAM ;OVERLAYED BY SYSTEM WHICH DOSN'T CHANGE NAME?
JRST OVRL3 ;YES
MOVEM T,JOBNAM ;REMEMBER NEW NAME
TYPE( by )
PUSHJ P,SIXBP ;OUTPUT PROGRAM NAME
OVRL3: TYPE( ***)
LINE
SKIPN T,JOBOPC ;ANY RE-ENTER ADDRESS?
MOVE T,BCOM ;IF NOT BCOM SHOULD BE USER BREAK
HRRZ T,T ;JUST THE ADDRESS THANK YOU
PJRST WHERE ;TELL WHERE - END OF OVERLAY
; RE-ENTER LOGIC
RE.ENT: SKIPE REENTR ;ARE WE ALREADY REENTERED?
JRST ER.ENT ;YES. REPORT
MOVEM P,SAVLOC ;FREE UP A SPARE REG
HRRZ P,.JBOPC ;GET THE BREAK P.C.
SKIPE ESCAPE ;RE-ENTERS ALLOWED ONCE(SEE ER.ENT)
JRST RE.BRK ;DONT DESTROY USER PROFILE
MOVE P,SAVLOC ;RE-INSTATE THE OLD REG
JSR SAVE ;SAVE THE EXTERNAL PROG STATUS
PUSHJ P,REMOVB ;AND REMOVE THE PAUSES
MOVE T,.JBOPC ;GET THE PROG P.C.
MOVEM T,JOBOPC ;STORE AND FLAG THAT WE ARE HANDLING RE-ENTER
MOVEM T,JOBBRK ;SAVE THE JOB BREAK LOCATION
HRRM T,STARTU ;ALLOW CONTINUES TO WORK
SETOM REENTR ;SET FLAG THAT WE HAVE REENTERED
SKIPE PRGM ;HAS ANY SECTION BEEN OPENED
JRST RE.LOC ;YES
PROGIF(MAIN.) ;NO - SO OPEN MAIN PROG
CAIA ;NO SECTION CALLED MAIN.
PUSHJ P,SETNAM ;OPEN MAIN PROG IF FOUND
; 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,tf
hrrzi tf,.priou
cfobf%
pop p,tf >
TYPE([ Program suspended )
HRRZ T,JOBBRK ;SET UP THE ACTUAL SUSPEND POINT
PUSHJ P,WHERE ;TELL USER WHERE HE IS SUSSPENDED
TYPE(Open section: )
MOVE T,OPENED ;WHAT IS THE CURRENTLY OPEN SECTION
PUSHJ P,SPT1 ;TYPE THAT
TYPE ( ])
MOVE F,STKYFL ;RESET THE FLAG REGISTER
JRST RET ;RETURN TO NORMAL WORKING
ER.ENT: SETPDL ;RESET THE PDL
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: SETPDL ;RESTORE THE STACK
HRRZ T,STARTU ;HAS A START BEEN DONE
JUMPE T,RE.RET ;NO - JUST RETURN TO FORDDT USER MODE
MOVE T,BCOM ;GET THE PAUSE POINT
MOVEI T,-1(T) ;CORRECT FOR JSA
ANDI T,-1 ;JUST THE ADDRESS PORTION
MOVEM T,JOBBRK ;SAVE THE JOB BREAK FOR RE.LOC
JRST RE.LOC ;DISPLAY PROGRAM EXECUTION SUSPENSION
; ROUTINE TO DISPLAY WHERE THE PROGRAM IS SUSPENDED
WHERE: SKIPN .JBHRL ;SKIP IF WE HAVE A HIGH SEG.
JRST RE.L2
CAMLE T,.JBREL ;ARE WE SUSPENDED OVER THE LOW SEG.
JRST [TYPE(in high segment)
JRST RE.L2]
TYPE(in low segment)
RE.L2: TYPE( at )
TLO F,FGLSNM ;GLOBALS ARE OK
PUSHJ P,LOOK ;DO A SYSMBOL 'LOOK'-UP
JRST E6 ;
CAIA ;NOTHING TYPED
JRST RE.L3A ;FOUND AND TYPED
MOVEM T,TEM ;REMEMBER NEAREST REFERENCE
PUSHJ P,SPT ;TYPE THE SYMBOL
TYPE( + )
MOVE T,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 )
MOVE T,PNAMSV ;GET THE SECTION NAME
PUSHJ P,SPT1 ;DISPLAY THAT
RE.L3: LINE ;
POPJ P, ;
; PAUSE LOGIC
PAUSE: JUMPL F,PSEALL ;DISPLAY ALL PAUSES IF NO ARGUMENTS
TRO TF,FGLONL ;FIND GLOBAL SYMBOL ONLY
PUSHJ P,SYMIN ;GET THE NEXT SYMBOL IN SYM
JRST ERR6 ;NONE SUCH!
CAIA ;STATEMENT # FROM USER
JRST PAUS10 ;SYMBOL - MEANS STOP AT ROUTINE
PAUS11: HRRZM T,TEM1 ;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 T1,BADSYN ;DO WE HAVE A LEGAL DELIMITER
JUMPE T2,PAUS5 ;[136] DID WE REALLY GET ANYTHING?
CAMN T2,[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 T2,[SIXBIT/AFTER/] ;FORCE USER TO TYPE WHOLE WORD
JRST PAUS4 ;AFTER REQUESTED
CAME T2,[SIXBIT/IF/] ;WAS IT 'IF'?
JRST BADSYN ;ANYTHING ELSE MEANS TROUBLE
TLZ F,CONS ;CLEAR CONSTANT SEEN FLAG
TRO TF,LGCLEG ;[116] LET EITHER KNOW WE MAY GET LOGICALS
PUSHJ P,EITHER ;NUMBER OR SYMBOL SHOULD FOLLOW
PUSHJ P,NUMB ;CONSTANT SEEN
MOVEM T,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 TF,ISLOGI ;[116] IS IT A LOGICAL CONSTANT
JRST [SETZ T, ;[116] YES, SET FLAG IN COND0
TLO T,LFTLOG ;[116]
MOVEM T,COND0 ;[116]
JRST .+1] ;[116]
JUMPN T1,.+2 ;DELIMITER?
PUSHJ P,GETSKB ;NEXT CHARACTER
CAIE T1,"." ;MUST BE . OF .EQ. ETC
JRST BADSYN
PUSHJ P,TTYIN ;GET SIXBIT STRING
CAIE T1,"." ;MUST AGAIN BE TERMINATED BY .
JRST BADSYN
HLRZS T2,T2 ;MORE USEFUL IN RIGHT HALF
CAIN T2,'LT '
JRST TEST1
CAIN T2,'LE '
JRST TEST2
CAIN T2,'EQ '
JRST TEST3
CAIN T2,'NE '
JRST TEST4
CAIN T2,'GT '
JRST TEST5
CAIN T2,'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 TF,LGCLEG ;[116] LET EITHER KNOW LOGICALS ARE LEGAL
PUSHJ P,EITHER
PUSHJ P,NUMB ;SAVE AS A NUMBER
MOVEM T,COND2 ;SAVE THE LOCATION
TRZE TF,ISLOGI ;[116] DID WE GET A LOGICAL CONSTANT?
JRST [SETZ T, ;[116] YUP, SET COND0 FLAG
TLO T,RHTLOG ;[116]
ORM T,COND0 ;[116]
JRST .+1] ;[116]
MOVE T,[JSR COND]
MOVEM T,TEM ;FORM THE (CONDITIONAL TEST) LOCATION LINK
PAUS5: SKIPA T,[Z 1] ;PROCEDE COUNT=1
PAUS4: PUSHJ P,EITHER ;GET USERS PROCEDE COUNT IN T
CAIA ;CONSTANT GIVEN
MOVE T,(T) ;SYMBOL - GET CONTENTS
JUMPL T,BADSYN ;DO NOT ALLOW NEGATIVE PROCEDE COUNTS
EXCH T,TEM1 ;GET BACK BREAKPOINT ADDRESS
SKIPL TERMK ;WAS THAT ALL
JRST PAUS6 ; YES
MOVEM T,SAVLOC ;SAVE PAUSE ADDRESS TEPORARILY
PUSHJ P,TTYIN ;GET SIXBIT USER INPUT
JUMPN T1,BADSYN
MOVE T,SAVLOC ;[136] RESTORE PAUSE ADDR., IN CASE WE'RE DONE
JUMPE T2,PAUS6 ;[136] WAS THERE REALLY ANYTHING THERE?
CAME T2,[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 T,PAUS3 ;ASSUME ZERO MEANS NO INPUT
CAIN T1,"/" ;A / HERE DENOTES THAT A GROUP# FOLLOWS
JRST PAUS8 ;TRY FOR THE NUMBER AGAIN
PAUS3: CAIL T,1 ;MAKE SURE HE GETS
CAILE T,GPMAX ; ONLY A VALID GROUP #
JRST ERR15 ;COMPLAIN ABOUT GROUP #
HRL T,T ;SET UP FOR AUTO TYPE
HRR T,SAVLOC ;GET BACK PAUSE ADDRESS
TLO F,AUTO ;SET THE AUTO PROCEDE FLAG
PAUS6: PUSHJ P,ONFORM ;SKIP IF NOT A FORMAT AT (T)
JRST ERR19
PUSHJ P,BPS1 ;PLACE ALL PARAMETERS TO EFFECT A PAUSE
JRST RET ;DONE!
PAUS7: SETZI T, ;CLEAR PROCEDE COUNT
EXCH T,TEM1 ;GET PAUSE PLACE
MOVEM T,SAVLOC ;STORE PAUSE LOCATION
JRST PAUS8
PAUS10: MOVE T1,@SYMSAV ;GET SYMBOL
TLNE T1,700000 ;IS THIS A PROGRAM NAME OR GLOBAL
JRST ERR19 ;NO SO DONT ALLOW
SKIPE SUBSCR ;NOR MUST THERE BE AN OFFSET
JRST ERR19
MOVE T1,1(T) ;DOES THIS ROUTINE INVOKE THE 'HELLO' MACRO?
CAMN T1,HELLO ;YES IT DOES - STOP 2 ON
ADDI T,2 ;
JRST PAUS11
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 F,CONS ;SET CONSTANT SEEN FLAG IF NOT ALREADY SET
JRST ERR14
MOVEM T,COND3 ;SAVE VALUE OF CONSTANT
MOVEI T,COND3 ;SAVE ADDRESS OF CONSTANT
POPJ P,
; ROUTINE TO CHECK IF A FORTRAN FORMAT EXISTS AT
; THE ADDRESS POINTED TO BY T
; RETURN 1 IF IT IS A FORMAT
; RETURN 2 IF NOT A FORMAT
ONFORM: LDB W1,[POINT 7,(T),6] ;
CAIN W1,"(" ;TRUE IF FIRST CHAR IS AN OPEN PAREN
POPJ P,
JRST CPOPJ1 ;FOUND A FORMAT STATEMENT REFFERENCE
; CONTINUE LOGIC
CONTIN: MOVSI T,(JFCL) ;RESET THE TRACE ENTRY
MOVEM T,FDDT. ;
HRRZ T,STARTU ;HAS START BEEN SEEN
JUMPE T,ERR4 ;NO - PLEASE TYPE START
SKIPE T,JOBOPC ;ARE WE IN A RE-ENTER CONDITION
JRST CONT2 ;YES - DEAL WITH IT
MOVEI T,[POPJ P,] ;POPJ P, IS THE EXIT AFTER A 'NEXT'
CAMN T,LEAV ;DID WE DO A 'NEXT' LAST TIME
JRST PROCED ;YES - DO NOT TAKE ARGS - RETURN WITH A POPJ
JUMPL F,PROCED ;CONTINUE 1
PUSHJ P,EITHER ; NO - GET ARGUMENT
CAIA ;NUMBER TYPED
MOVE T,(T) ;SYMBOL TYPED - GET CONTENTS
JUMPL T,BADSYN ;DO NOT ALLOW NEGATIVE PROCEDE SETTINGS
JRST PROCDX ;SET UP A PROCEDE COUNT
CONT2: MOVE T,JOBOPC ;GET THE CONTINUE P.C.
MOVEM T,GOLOC ;PREPARE TO CONTINUE
PUSHJ P,RE.NTR ;ALLOW RE-ENTERS AGAIN
PUSHJ P,INSRTB ;PUT BACK PAUSES
JSP T,RESTORE ;RESTORE USER ACS
JRSTF @GOLOC ;DO AN OFFICIAL RE-ENTER
;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 AC1,[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,AC0 ;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 AC1,^D264 ;ALLOCATE ENOUGH FOR TWO 128 WORD BUFFERS
MOVEM AC1,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 AC0 ;A POSITIVE VALUE?
JRST ALCFAL ;NO, ALLOCATION FAILED
MOVEM AC0,ALCBLK+1 ;SAVE ADDR FOR DECOR
;Set up the buffer header blocks.
AOS AC2,AC0 ;POINT TO 2ND WORD OF BUFFER HDR
HRLZI AC1,^D129 ;SIZE OF BUFFER+1
HRR AC1,AC2 ;TACK ON ADDRESS OF 1ST BUFFER HDR+1
MOVEM AC1,^D131(AC2) ;PUT IT IN WORD 2 OF 2ND BUFFER HDR
ADDI AC1,^D131 ;ADDR OF 2ND BUFFER HDR+1
MOVEM AC1,(AC2) ;PUT IT IN WORD 2 OF 1ST BUFFER HDR
;Try to find the help file.
SETZB AC2,AC5 ;SET UP A COUNTER AND ZERO AC2
GETHLP: SKIPA AC3,['HLP '] ;GET HLP:
GETSYS: MOVSI AC3,'SYS' ;OR GET SYS:
MOVEI AC4,HLPCTB ;ADDRESS OF BUFFER CONTROL BLOCK
OPEN DSK,AC2 ;OPEN THE DEVICE CHANNEL
JRST HLPNHF ;LOSE...
MOVE AC1,[EXP BF.VBR] ;SET UP THE BUFFER CONTROL BLOCK
MOVEM AC1,HLPCTB ;SIGNIFY VIRGIN BUFFER
HRRM AC0,HLPCTB ;GIVE ADDRESS OF 2ND WORD OF 1ST BUFFER
SETZM HLPCTB+1 ;ZERO NEXT TWO LOCATIONS
SETZM HLPCTB+2
MOVE AC1,[SIXBIT/FORDDT/] ;FILE NAME
MOVSI AC2,'HLP' ;EXTENSION
SETZB AC3,AC4 ;ZERO NEXT TWO
LOOKUP DSK,AC1 ;LOOKUP FORDDT.HLP
TLZA AC2,-1 ;CLEAR JUNK, WE BLEW IT
JRST NXTBUF ;GOOD--GO READ FILE
CAIE AC2,ERSNF% ;SFD NOT FOUND?
CAIN AC2,ERSLE% ;SEARCH LIST EMPTY?
JRST NXTSTR ;ONE OF THE ABOVE
CAILE AC2,ERIPP% ;INCORRECT PPN OR FILE NOT FOUND?
JRST HLPNHF ;HORRIBLE DISK ERROR
NXTSTR: SETZM AC2 ;CLEAR PHYSICAL BIT
AOS AC5 ;TRY NEXT CASE
TRNE AC5,1 ;SEE IF ODD
TXO AC2,UU.PHS ;YES--TRY PHYSICAL ONLY
JRST @[GETHLP ;TRY HLP: AGAIN
GETSYS ;THEN LOGICAL SYS:
GETSYS ;THEN PHYSICAL SYS:
HLPNHF]-1(AC5) ;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 AC1,HLPCTB+1 ;POINT TO 1ST DATA LOC IN BUFFER
AOS AC1 ; ''
OUTSTR @AC1 ;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,AC0 ;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,AC0 ;SAVE THE FLAGS
;Use FOROTS' ALCOR and DECOR routines for
;allocating and deallocating the buffer space.
MOVEI AC1,^D128 ;ALLOCATE ONE BLOCK FOR THE FILE
MOVEM AC1,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 AC0 ;A POSITIVE VALUE?
JRST ALCFAL ;NO, ALLOCATION FAILED
MOVEM AC0,ALCBLK+1 ;SAVE ADDR FOR DECOR
MOVEI AC3,4 ;NUMBER OF ATTEMPTS AT FINDING FILE
GETHLP: MOVE AC4,[POINT 7,[ASCIZ/HLP:/]] ;GET THE HLP: POINTER
MOVEM AC4,GTJBLK+2 ;PUT IT IN THE GTJFN BLOCK
JRST GETIT
GETSYS: MOVE AC4,[POINT 7,[ASCIZ/SYS:/]] ;GET THE SYS: POINTER
MOVEM AC4,GTJBLK+2 ;PUT IT IN THE GTJFN BLOCK
GETIT: HRROI AC2,FILENM ;GET POINTER TO 'FORDDT'
MOVEI AC1,GTJBLK ;LONG FORM GTJFN BLOCK
GTJFN% ;GET FORDDT.HLP
JRST NXTSTR ;LOSE TEMPORARILY
HRRM AC1,JFN ;SAVE THE JFN
MOVE AC2,[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 AC1,JFN ;GET JFN
HRROI AC2,@ALCBLK+1 ;POINTER FOR TEXT BUFFER
MOVEI AC3,^D639 ;HELP TEXT BUFFER SIZE IN CHARS (128*5-1)
SIN% ;FILL THE BUFFER
ERJMP HLPDON ;DON'T CARE ABOUT THIS ERROR
SETZ AC1, ;NEED A ZERO BYTE
IDPB AC1,AC2 ;MAKE SURE ZERO THE LAST BYTE
HRROI AC1,@ALCBLK+1 ;POINT TO BUFFER
PSOUT% ;OUTPUT ASCIZ STRING
JRST PRINT ;IF THERE'S MORE, GO GET IT
NXTSTR: MOVE AC4,GTJBLK ;GET THE FLAGS
TXOE AC4,GJ%PHY ;TURN ON PHYSICAL DEVICE BIT
TXZ AC4,GJ%PHY ;CLEAR PHYSICAL BIT
MOVEM AC4,GTJBLK ;PUT IT BACK IN GTJFN BLOCK
SOJLE AC3,HLPNHF ;SEE IF ANY DEVICES LEFT
CAIG AC3,2 ;TIME TO TRY SYS:?
JRST GETSYS ;YES, USE SYS:
JRST GETHLP ;NO, USE HLP:
HLPDON: SETZ AC1, ;NEED A ZERO BYTE
IDPB AC1,AC2 ;MAKE SURE ZERO THE LAST BYTE
HRROI AC1,@ALCBLK+1 ;POINT TO BUFFER
PSOUT% ;OUTPUT ASCIZ STRING
HRROI AC1,CRLF ;OUTPUT CRLF
PSOUT%
MOVE AC1,JFN
CLOSF% ;GET RID OF THE JFN
JFCL ;NOT LIKELY
JRST HLPRET ;AND RETURN
HLPIOE: MOVE AC1,JFN ;WE STILL HAVE TO RELEASE THE JFN
CLOSF%
JFCL ;NOT LIKELY
HRROI AC1,[ASCIZ/%FDTEOH Error opening help file/]
SKIPA
HLPNHF: HRROI AC1,[ASCIZ /%FDTNHF Cannot find help file/]
PSOUT%
HRROI AC1,[ASCIZ/; I'm sorry I can't help you/]
PSOUT%
HRROI AC1,CRLF
PSOUT%
HLPRET: MOVEI L,ALCBLK ;NEED TO DEALLOCATE BUFFER SPACE
PUSHJ P,DECOR.## ;DO IT
POP P,AC0 ;RESTORE FLAGS
JRST RET ;ALL DONE
ALCFAL: HRROI AC1,[ASCIZ/%FDTCAB Cannot allocate buffer for help file/]
PSOUT%
HRROI AC1,CRLF
PSOUT%
POP P,AC0 ;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
> ;end IFN TOPS20 (internal -20 help code)
-1,,0 ;NUMBER OF ARGUMENTS TO ALCOR
ALCBLK: ALCBLK+1 ;POINTER TO ARGUMENT
BLOCK 1 ;NUMBER OF WORDS NEEDED
> ;end IFE EXTHLP (internal help code)
; REMOVE LOGIC
RESET: JUMPL F,RESET5 ;'RESET' - RESET ALL PAUSES
TRO TF,FGLONL ;FIND GLOBAL ONLY IF NOT LABEL
PUSHJ P,SYMIN ; NO - MUST BE ANOTHER SYMBOL TO FOLLOW
JRST ERR6 ;SOME ONE SLIPPED UP
JFCL ;STATEMENT #
RESET6: MOVEI R,B1ADR ;LOOK THRO PAUSE POINTS FOR THE RIGHT ONE
RESET3: HRRZ W,(R) ;GET THE PAUSE CONTENTS
CAIN W,(T) ;IS THIS IT?
JRST RESET2 ; YES - REMOVE IT!
ADDI R,3 ; NO - TRY ANOTHER
CAIG R,BNADR ;TRIED ALL POINTS YET?
JRST RESET3 ; NO - FIND THE NEXT
JRST ERR17 ;NO - NOT AN ARRAY NAME - YOU LOSE
RESET2: MOVE W,1(T) ;DOES THIS ROUTINE USE THE HELLO MACRO
CAMN W,HELLO ;
ADDI T,1 ;YES IT DOES - SO STOP 2 ON
ADDI T,1 ;STOP 1 ON FOR NORMAL ROUTINES
CLEARM (R) ;CLEAR LOCATION OF PAUSE
CLEARM 1(R) ;CLEAR CONDITIONAL CLAUSE
CLEARM 2(R) ;CLEAR PROCEDE COUNT
JRST RET ;REMOVED!
RESET5: CAME T2,[SIXBIT/REMOVE/] ;DO NOT ALLOW ABREVIATIONS OF REMOVE
JRST BADSYN ;THIS ANNOYS MANY USERS
PJRST BPS ;RESET ALL PAUSES
; ACCEPT LOGIC = ACCEPT NAME/X #
ACCEPT: JUMPL F,BADSYN ;ACCEPT ALONE IS MEANINGLESS!
SETZM ARGVAL+1 ;CLEAR IN CASE LONG INPUT
SKIPN ESCAPE ;ESCAPE TO FOROTS?
JRST ERR30 ;SORRY
TRO TF,ACCPT ;ACCEPT IN PROGRESS
PUSHJ P,SYMIN ;GET USERS SYMBOL
JRST ERR6 ;SORRY - WE DONT HAVE IT!
JRST ACC2 ;STATEMENT # = FORMAT
MOVEM T,TEM2 ;STORE FOR UPDATE
TRNE TF,IMPRNG ;IS THIS AN IMPLIED RANGE?
PUSHJ P,DISP14 ;YES SETUP RANLIM/RANGE IN CASE OF A RANGE
PUSHJ P,EVAL ;SETUP SYMSAV TO POINT TO RAD50 SYMBOL
JFCL ;CAN'T HAPPEN!!?
MOVE T,SYMSAV ;GET THE SYMBOL POINTER
HLRZ T,(T) ;GET RADIX 50 FORM AND FLAGS
TRNN T,LOCAL ;ALLOW ONLY LOCAL VARIABLS TO CHANGE
JRST ERR24 ;YOU LOOSE
MOVE T1,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 T1,ACCF ;SPACE DELIMITER ASSUMES REAL TO FOLLOW
CAIN T1,"=" ;ALLOW = AS DELIMITER
JRST ACCF
CAIN T1,"-" ;A - MEANS A RANGE OF VALUES TO SET
JRST ACC23 ;
CAIE T1,"/" ; WE EXPECT ONLY / FROM NOW ON
JRST BADSYN ;ANYTHING ELSE LOOSES
ACC22: PUSHJ P,TTYIN ;READ ARGUMENT TYPE REQUIRED BY USER
JUMPE T2,BADSYN ;NO CHARACTERS - BAD
LDB T,[POINT 6,T2,5];GET 1ST. CHARACTER TO IDENTIFT ARG TYPE
CAIN T,'B' ;[120] BIG SWITCH ?
TLOA TMOD,B. ;[120] YES - SET IT AND LOOK FOR ANOTHER SWITCH
MOVEM T,TEM ;[120] NOT 'BIG', SAVE SWITCH IN CASE B FOLLOWS
JUMPE T1,ACC21 ;NOTHING FOLLOWS
CAIN T1,"=" ; ALLOW = AS DELIMITER
JRST ACC21 ;PROCESS FORMAT
CAIE T1,"/" ;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
ACC21: MOVE T,TEM ;GET THE CURRENT FORMAT REQUEST
CAIN T,'S' ;SYMBOLIC?
JRST ACCS ;DO SYMBOL INPUT
CAIN T,'A' ;ASCII?
JRST ACCA ;PROCESS ASCII
CAIN T,'R' ;RASCII?
JRST RASCII ;PROCESS RIGHT JUSTIFIED ASCII
CAIN T,'O' ;OCTAL?
JRST ACCO ;PROCESS OCTAL
TLZ TMOD,B. ;[120] IGNORE /BIG FOR THE REST
CAIN T,'F' ;FLOATING?
JRST ACCF ;PROCESS A FLOATING INPUT
CAIN T,'D' ;REAL*8?
JRST ACCD ;PROCESS REAL*8
CAIN T,'I' ;INTEGER?
JRST ACCI ;PROCESS INTEGER INPUT
CAIN T,'C' ;COMPLEX?
JRST ACCC ;PROCESS COMPLEX INPUT
CAIN T,'L' ;[120] LOGICAL?
JRST ACCL ;[120] PROCESS LOGICAL INPUT
JRST BADSYN ;NO OTHER TYPES SUPPORTED
; ACCEPT A RANGE PROCESSING = ACCEPT NAME(X)-
ACC23: MOVE T,TEM2 ;SAVE THE FIRST VALUE SOMEWHERE SAFE
MOVEM T,RANGE ;SAVE THE FIRST VALUE OF A RANGE
TLZ F,GRPFL ;MAKE SURE WE DONT DO GROUP LOGIC
;OR ACCEPT ANY PRINT MODIFIERS
PUSH P,MATHSM ;SAVE CURRENT SYMBOL
PUSHJ P,SYMIN ;GET THE NEXT VALUE
JRST ERR6 ;DOSNT EXIST
JRST BADSYN ;NUMERICS????
POP P,T3 ;GET FIRST SYMBOL BACK
CAME T3,MATHSM ;ARE THEY THE SAME
JRST ERR40 ;NO - SORRY
CAML T,RANGE ;SORT OUT THE RANGE ORDER
EXCH T,RANGE ;WRONG WAY ROUND
MOVEM T,TEM2 ;LOWER VALIUE IN RANLIM, HI IN RANGE
PUSHJ P,EVAL ;GET SYMBOL IN SYMSAV
JFCL ;
MOVE T,SYMSAV ;GET THE SYMBOL POINTER
HLRZ T,(T) ;GET SYMBOL FLAGS
TRNN T,LOCAL ;MODIFY LOCALS ONLY
JRST ERR24 ;NOT ALLOWED
MOVE T1,LSTCHR ;RESTORE USERS LAST CHARACTER
CAIN T1,"/" ;MAYBE FORMAT SPECIFIER
JRST ACC22 ;YES - GO FIND THEM
JUMPE T1,ACCF ;SPACE IMPLIES REAL*4
JRST BADSYN ;DONT ACCEPT ANYTHING ELSE HERE
; *** FLOATING INPUT ***
ACCF: TLO TMOD,F. ;DISPLAY TO USER AS FLOATING
MOVEI T2,4 ;ARG TYPE REAL FOR FOROTS
PUSHJ P,FORINP ;YES - ASK FOROTS FOR INPUT
; HERE TO PLACE ALL ACCEPTED VALUES
ACC10: MOVE T,ARGVAL ;LETS SEE WHAT FOROTS HAS BEEN UP TO
ACC13: MOVEM T,@TEM2 ;PLACE VALUE WHERE USER REQUESTED
MOVEM T,ARGVAL ;SOME PRINT OPTIONS NEED THIS
AOS T1,TEM2 ;NEXT ARRAY LOCATION
TLNN TMOD,C.!B.!D. ;[120] IF EITHER COMPLEX REAL*8 OR BIG OR -
TRNE F,DOUBLE ;[112] WE HAVE A DOUBLE WORD ARRAY?
CAIA ;THEN WE PLACE TWO ARGUMENTS
JRST ACC14 ;IF NOT THEN CHECK THE RANGE CONDITION
TRO F,SILENT ;QUIET
PUSH P,MATHSM ;SAVE CURRENT SYMBOL
MOVE T,[SQUOZE 0,.VEND] ;END OF VARIABLE AREA
MOVEM T,MATHSM ;ONLY ACCEPTABLE SYMBOL
MOVE T,TEM2 ;GET DESTINATION
PUSHJ P,LOOK ;FIND A SYMBOL FOR IT
JFCL ;NONE-OK
CAIA ;OFFSET - OK
; JRST ACC37 ; NONE - OK
; JRST ACC37 ; OFFSET - OK
; MOVE T,(W1) ;GET SYMBOL
; TLZ T,PNAME ;NO BITS
; CAMN T,[SQUOZE 0,.VEND] ;END OF VARIABLE AREA?
JRST ERR35 ;YES - ERROR
;ACC37:
POP P,T
MOVEM T,MATHSM ;RESTORE CURRENT SYMBOL
MOVE T,ARGVAL+1 ;GET THE 2ND WORD
MOVEM T,@TEM2 ; - AND PLACE IN NEXT LOCATION
AOS T1,TEM2 ;YES - SO NEXT DOUBLE WORD
ACC14: SKIPN RANGE ;ACCEPT A RANGE ?
JRST ACCPUT ;NO - UNLESS IMPLIED
TLNE TMOD,A. ;SPECIAL TREATMENT FOR ASCII ARRAYS
JRST [CAMG T1,RANGE ;END OF ARRAY?
JRST ACC12 ;GET SOME MORE
JRST RET ] ;QUIT
CAMG T1,RANGE ;ALL DONE ?
JRST ACC10 ;NO - KEEP GOING
JRST RET ;ALL OVER
; VARIABLE 'ACCEPT'ED - NOW CONFIRM TO USER
ACCPUT: SETZM TERMK ;PREPARE FOR -
SETZM RANGE ; INPUT CONFIRMATION
SOS T,TEM2 ;REMOVE OFFSET FROM ACC13
TRZN F,DOUBLE ;CHECK FOR ANY -
TLNE TMOD,C.!B.!D. ;[120] DOUBLE WORD WORKING
SOS T,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: TLO TMOD,D. ;DISPLAY TO USER AS REAL*8
MOVEI T2,TP%DPR ;[137]Set up for default D-float arg type=10
TRNE F,GFLOAT ;[137]If D-float, skip to FOROTS call.
MOVEI T2,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: TLO TMOD,I. ;DISPLAY TO USER AS INTEGER
MOVEI T2,2 ;GET ARG TYPE INTEGER FOR FOROTS
PUSHJ P,FORINP ;GO TO FOROTS
JRST ACC10 ;PLACE ARG FOR USER
; *** COMPLEX INPUT ***
ACCC: TLO TMOD,C.!B. ;[120] DISPLAY TO USER AS COMPLEX
ACC11: PUSHJ P,GETSKB ;GET SIGNIFIGANT CHARACTER
CAIE T1,"(" ;MAKE SURE ITS A (
JRST ERR32 ; ( REQUIRED
MOVE T,[1200,,ARGVAL+1] ;WHERE TO PUT IMAGINARY OF COMPLEX
MOVEM T,M2.I ;SET UP THE FORMAT
MOVEI T2,4 ;SET UP FOR TYPE REAL INPUT
PUSHJ P,FORINP ;LET FOROTS GET THE REAL PART
MOVE T,M2.F ;RECOVER THE FIN CALL
MOVEM T,M2.I ;AND REMOVE THE COMPLEX SETTING
JRST ACC10 ;GO PLACE THE RESULTS
; *** SYMBOLIC INPUT ***
ACCS: TLNE TMOD,B. ;[120] IF 'BIG' SET THEN
TLOA TMOD,C. ;DISPLAY TO USER AS TWO REAL*4
TLO TMOD,F. ;ELSE DISPLAY JUST ONE REAL*4
PUSH P,MATHSM ;SAVE MATHSM
PUSH P,SAVLOC ;SAVE SAVLOC AROUND CALL
PUSHJ P,SYMIN ;GET A USER SYMBOL
JRST ERR6 ;CAN'T FIND IT!
JRST BADSYN ;DONT GIVE ME STATEMENT #
POP P,SAVLOC ;RESTORE SAVLOC
POP P,MATHSM ;RESTORE
MOVE T1,(T) ;I'LL ACCEPT THAT ONE
MOVEM T1,ARGVAL ;SAVE THE FIRST WORD VALUE
TLNN TMOD,B. ;[120] DOUBLE WORD WORKING?
JRST ACC10 ;NO JUST PLACE SINGLE VALUE
MOVE T,1(T) ;GET SECOND VALUE
MOVEM T,ARGVAL+1 ;STORE THAT
JRST ACC10 ; AND EVEN STORE IT
; *** ASCII INPUT RIGHT JUSTIFIED ***
RASCII: TLO TMOD,R. ;DISPLAY TO USER AS RASCII
JRST ACC1 ;DO ASCII INPUT TO T
;[120] ** LOGICAL INPUT **
ACCL: TLO TMOD,L. ;[120] DISPLAY TO USER AS LOGICAL
MOVE T1,[POPJ P,] ;[120] HOW WE WANT TO RETURN FROM LOGICL
MOVEM T1,DONE ;[120]
TRO TF,LGCLEG ;[120] LET 'EM WE'RE EXPECTING A LOGICAL
PUSHJ P,GETSKB ;[120] GET NEXT CHAR.
CAIE T1,"." ;[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: TLO TMOD,A. ;DISPLAY TO USER AS ASCII
MOVE T,[ASCII . .] ;BLANK SECOND WORD FOR POSSIBLE
MOVEM T,ARGVAL+1 ;LONG OR DOUBLE
SKIPN RANGE ;[120] IGNORE /BIG IF ACCEPTING LONG ASCII
JRST ACC1 ;OK IF NOT A RANGE
TLZ TMOD,B. ;[120] CLEAR /B FLAG
TRZ F,DOUBLE ;CLEAR DOUBLE
ACC1: PUSHJ P,GETSKB ;GETA SIGNIFICANT USER CHARACTER
SKIPL TERMK ;EOL?
JRST BADSYN ;YES - SYNTAX ERROR
MOVEI T5,(T1) ;SAVE IN T2
ACC12: SETZM ARGVAL ;CLEAR FOR DOUBLE LENGTH ASCII
TRZE TF,ADELIM ; IF SET WE CLEAR THE REST OF THE ARRAY
JRST ACCA2 ;
ACC24: MOVE T,[ASCII . .] ;T BUILDS ASCII INPUT
TLNE TMOD,R. ;BUILD WITH ZERO IF RASCII
SETZI T,
MOVE T6,[POINT 7,T] ;STORES BYTES IN T
ACC15: pushj p,loadch ;NEXT ASCII CHARACTER
CAIN T1,(T5) ;TEXT DELIMITER FOUND?
JRST ACC18 ;YES - CHECK FOR A SECOND
TRZE TF,ADELIM ;WAS THE LAST CHARACTER OUR DELIMITER
JRST [PUSH P,T1 ;YES
MOVE T1,[pushj p,loadch];FOR GETSKB
MOVEM T1,GETCHR
POP P,T1
PUSHJ P,GETSK2 ;CHECK FOR COMMENT
PUSHJ P,CLRLIN ; WIND UP
JRST ACC17]
ACC19: IDPB T1,T6 ;SAVE USERS TEXT
TLNE T6,760000 ;FILLED T?
JRST ACC15 ;NO - TAKE MORE
CAIA ;DONT CONFUSE THE INDEFINATE ACCEPT
ACC17: TRO TF,ADELIM ;SET TO CLEAR REST OF ARRAY IF IN A RANGE
TRNE F,DOUBLE ;TEST FOR ANY DOUBLE WORD -
JRST ACC2WD ; WORKING -
TLNN TMOD,B. ;[120] IMPLIED BY REAL*8 OR B.
JRST ACC20 ;STORE FINAL SINGLE VALUE IN T
; DOUBLE WORD WORKING
ACC2WD: SKIPN ARGVAL ;IS THE FIRST VALUE STOREF?
JRST ACC3WD ;NO
MOVEM T,ARGVAL+1 ;YES STORE SECOND
JRST ACC25 ;PLACE BOTH VALUES
ACC3WD: MOVEM T,ARGVAL ;HOLD FIRST OF PAIR
TRNN TF,ADELIM ;ANY MORE TO COME
JRST ACC24 ;YES - GO FIND IT
ACC25: HRRZM T5,DELCHR ;SAVE DELIMITER FOR CLRLIN
PUSHJ P,CLRLIN ;CLEAR REST OF LINE
TLNN TMOD,R. ;ARE WE ACCEPTING RIGHT JUSTIFIED TEXT
JRST ACC10 ;RELAX JUST ASCII
MOVE T1,ARGVAL ;GET BACK THE DOUBLE WORD
JUMPE T1,ACC10 ;NO TEXT?????
MOVE T2,ARGVAL+1 ;INTO A LONG SHIFT FORM
LSH T1,-1 ;FIRST MAKE A CONTINUOUS STRING OF TEXT
LSHC T1,-1 ;GET READY FOR 7BIT CHARACTER SHIFTS
ACC27: LDB T3,[POINT 7,T2,35]
JUMPN T3,ACC26 ;TEST FOR SUCCESSFUL RIGHT JUSTIFICATION
LSHC T1,-7 ;NOT YET MOVE DOWN
JRST ACC27 ;TRY AGAIN
ACC26: LSH T1,1 ;ASCII-ISE
TLZE T2,400000 ;SHOULD THERE BE A LOWER BIT FOR T1
TRO T1,1 ;YES - PUT IT IN
MOVEM T1,ARGVAL ;STORE TOP VALUE
MOVEM T2,ARGVAL+1 ;AND FINALLY LAST VALUE
JRST ACC10 ;AND GIVE THEM TO THE USER
ACC18: TRON TF,ADELIM ;FLAG THIS AS OUR DELIMITER
JRST ACC15 ;SEE IF NEXT CHARACTER IS SAME
TRZ TF,ADELIM ;YES IT IS -
JRST ACC19 ;PASS ON JUST ONE
ACCA2: TLZ TMOD,A.!R. ;REMOVE THE TEXT FLAGS
MOVE T,[ASCII . .] ;FILL THE REST OF THE ARRAY
MOVEM T,ARGVAL ;WITH SPACES
MOVEM T,ARGVAL+1
JRST ACC13
; FINISHED TEXT INPUT
ACC20: HRRZM T5,DELCHR ;SAVE DELIMITER FOR CLRLIN
SKIPN RANGE ;IF NOT IN A RANGE SETTING -
PUSHJ P,CLRLIN ;THEN CLEAR THE REST OF THE USER INPUT
TLNN TMOD,R. ;LEFT OR RIGHT JUSTIFY
JRST ACC13 ;LEFT
LDB T1,[POINT 6,T6,5] ;RIGHT - GET THE T3 POINTER RESIDUE
SETCA T1, ;RIGHT SHIFT
LSH T,1(T1) ; NOW
JRST ACC13 ;NOW PLACE TEXT
; *** OCTAL INPUT ***
ACCO: TLO TMOD,O. ;DISPLAY TO USER AS OCTAL
SETZI T, ;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 W1,W2 ;CLEAR BUILD AREA
MOVEI T,^D12 ;INITIALIZE COUNT
TLNE TMOD,B. ;[120] CHECK BIG
MOVEI T,^D24 ;[120] DOUBLE IT FOR BIG
CAIA
ACC29: PUSHJ P,GETSKB ;GET NEXT CHARACTER
SKIPL TERMK ;END OF LINE?
JRST ACC16 ;
CAIE T1,"+" ;PLUS?
JRST ACC31
TLNE F,MF ;YES - MINUS SEEN?
JRST BADSYN
JRST ACC29 ;NO - IGNORE THE +
ACC31: CAIN T1,42 ;DOUBLE QUOTE?
JRST ACC29 ;YES - IGNORE
CAIE T1,"-"
JRST ACC16 ;NOT A "-"
TLC F,MF ;COMPLEMENT FLAG
JRST ACC29 ;GET NEXT CHARACTER
ACC16: SUBI T1,60 ;OCTALISE
JUMPL T1,ERR2 ;CHARACTER MUST OF COURSE -
CAIL T1,10 ; BE OCTAL
JRST ERR2 ;NOT OCTAL - COMPLAIN
LSHC W1,3 ;BUILD OCTAL VALUE IN T
IOR W2,T1 ;
SOJE T,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: TLNN TMOD,B. ;[120] BIG WORKING?
JRST ACC30 ;AS YOU WERE - STORE OCTAL
MOVEM W1,ARGVAL ;STORE LONG OCTAL
MOVEM W2,ARGVAL+1
JRST ACC32
ACC30: MOVEM W2,ARGVAL ;STORE SINGLE OCTAL
; HERE AT END OF INPUT
ACC32: PUSHJ P,CLRLIN ;CLEAR THE LINE
TLZN F,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: 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 W1,T3 ;FORMAT START
MOVE W2,T1 ;FORMAT END
; HERE WITH A RECOGNISED FORMAT REFFERENCE SET UP
ACC3: MOVE T,[POINT 7,(W1)]
pushj p,loadch ;GET A USER CHARACTER
CAIE T1," " ;BLANKS
CAIN T1,11 ; AND TABS IGNORED TO START WITH
JRST ACC3
MOVE T2,[pushj p,loadch]
MOVEM T2,GETCHR ;SET TO READ FROM USER
PUSHJ P,GETSK2
CAIE T1,"(" ;FIRST FORMAT CHARACTER MUST BE (
JUMPA T1,BADSYN
ACC4: ILDB T2,T ;INCREMENT POINTER NOW
HRRM T,.+1
CAIG W2,(W1) ;HAVE WE EXHAUSTED THE FORMAT
JRST [JUMPE T1,RET
JRST ERR13] ;YES
DPB T1,T ;STORE NEXT CHARACTER
JUMPE T1,ACC4
ACC6: pushj p,loadch ;GET ANOTHER USER FORMAT CHARACTER
CAIE T1," " ;NOW ALLOW
CAIN T1,11 ;BLANKS AND TABS AS USER WANTS
CAIA
PUSHJ P,GETSK2
JUMPN T1,ACC7 ;NOT THE LAST CHARACTER YET IF NON ZERO
CAIE T3,")" ;LAST USER CHARACTER MUST BE A )
JRST ERR32 ; IT WASN'T SO COMPLAIN
ACC7: MOVE T3,T1 ;REMEMBER THE LST USER CHARACTER
CAIE T1,37 ;DOES USER WANT LINE CONTINUATION = ^_
JRST ACC4 ;NO - NORMAL
ACC5: pushj p,loadch ;ACCEPT ANOTHER USER CHARACTER
CAIN T1,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
SETZM CURGRP ;CLEAR CURRENT GROUP STACK FLAGS
TLO F,CFLIU!GRPFL ;SET CORE FILE IN USE - ALLOW GROUPS
CLEARM GETCHR ;THIS IS THE FIRST ACCESS TO CORE FILE THIS LINE
TLNE F,EOL ;USER GAVE ANY ARGUMENTS?
TLOA F,OFCFL ;NO - GET THEM FROM CORE FILE
TLZ F,OFCFL ;YES - PUT THEM INTO CORE FILE
PUSHJ P,DISP4 ;DISPLAY ROUTINE
TLZ F,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
PUSHJ P,SYMIN ;GET USERS NEXT SYMBOL VALUE
JRST DISP3 ;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 T2,[POINT 7,(T3)]
MOVEI W1,SYM ;SET UP FOR SYMBOL PRINT
PUSHJ P,SPT ;PRINT SYMBOL=STATEMENT #
TYPE( FORMAT)
DISP6: ILDB T,T2 ;GET A CHARACTER FROM THE FORMAT TEXT
HRRM T2,.+1 ;GET NO OF WORDS DONE
CAIG T1,(T3) ;ALL DONE?
JRST DISP5 ;DONE WITH FORMAT
putchr (T) ;TYPE IT
JRST DISP6 ;MORE TO DO - BACK FOR MORE
; SET UP ACCESS TO A FORMAT STATEMENT T3=START T1=END
; SKIP ON SUCCESS.
FRMSET: MOVEI T3,(T) ;SHOULD POINT TO A JRST
LINE
LDB T,[POINT 7,(T3),6] ;GET FIRST CHARACTER OF FORMAT
CAIE T,"(" ;FIRST CHARACTER MUST BE A (
PJRST ERR16 ;USER LOSES
MOVE T,T3 ;ACCEPTED START OF FORMAT -
MOVEM T,SAVLOC ; NOW FIND END OF F10 FORMAT
HRREI T,-12 ;CHANGE LABEL+P TO LABEL+F
ADDM T,SYM ;LIKE SO
PUSH P,T3 ;SAVE (T3)
PUSHJ P,EVAL ;LOCATE THE FORMAT END
JRST ERR41 ;CANT FIND FORMAT END
POP P,T3 ;RESTORE
MOVEI T1,1(T) ;SET UP END OF FORMAT IN T1
JRST CPOPJ1 ;T3 START - T1 END . . . ALL SET UP
VAL2: TAB
MOVE T,RANLIM ;GET THE CURRENT VALUE POINTER
MOVE T,1(T) ;GET THE NEXT VALUE
POPJ P,
; IMPLIED RANGE I.E. TYPE ARRAY
DISP2: CAIN T1,"-"
JRST DISP1 ;GET LIMIT OF RANGE
TRZN TF,IMPRNG ;IS THIS A SIMULATED RANGE
JRST DISP10 ; NO - JUST NORMAL
DISP11: PUSHJ P,DISP14 ;SET UP RANGE WITH UPPER LIMIT
TLOA F,GRPFL ;PERMIT GROUP LOGIC AGAIN
DISP0: HRL TMOD,TMOD ;UNFUDDLES THE MODIFIERS FOR A RANGE
; ONE-SHOT TYPE REQUEST
; ENTER WITH SYMBOL VALUE IN T
; ENSURE TERMK,RANGE=0
DISP10: MOVEM T,LWT ;SAVE SYMBOL VALUE
MOVE T,(T) ;GET CONTENTS OF SYMBOLIC ADDRES
EXCH T,LWT ;SAVE CONTENTS AND GET SYMBOL VALUE
;SAVE SYMBOL VALUE IN CASE WE DO A RANGE
MOVEM T,RANLIM ;SAVE FOR RANGE NAME ID SUPRESSION
PUSHJ P,OFFSET ;TYPE USERS SYMBOL
JRST DISP3
EXCH T,SYM ;GET BACK SYMBOL CONTENTS
TLNE TMOD,-1 ;ANY LOCAL MODIFIERS?
MOVS TMOD,TMOD ;YES - USE THEM
TRO TMOD,ANYMOD ;FLAG FIRST PRINT ON LINE
; *** TYPE FLOATING ***
TYPF: TRNN TMOD,F. ;TEST THE FLOATING FLAG
JRST TYPD ;NO REAL TRY DOUBLE REAL
JUSTIFY
MOVEI T2,4 ;ARG TYPE REAL FOR FOROTS
PUSHJ P,FOROUT ;ONE ARG OUTPUT
; *** TYPE DOUBLE REAL ***
TYPD: TRNN TMOD,D. ;TEST FOR DOUBLE REAL
JRST TYPC ;NO FLOATING TRY COMPLEX
JUSTIFY
MOVE T2,RANLIM ;GET ARG POINTER
MOVE T,1(T2) ;GET SECOND ARG
MOVEM T,ARGVAL+1 ;SAVE 2ND. HALF FOR FOROTS
MOVE T,(T2) ;RE-INSTATE IST.ARG IN T
MOVEI T2,TP%DPR ;[137]Set up for default D-float arg type=10
TRNE F,GFLOAT ;[137]If D-float, skip to FOROTS call.
MOVEI T2,TP%DPX ;[137] else, we have G-float, set are type=13
PUSHJ P,FOROUT ;OUTPUT REAL*8
; *** TYPE COMPLEX ***
TYPC: TRNN TMOD,C. ;TEST FOR COMPLEX TYPE OUT
JRST TYPI ;NO COMLEX TRY FOR INTEGER
JUSTIFY
MOVE T2,RANLIM ;GET ARG POINTER
MOVE T,1(T2) ;GET SECOND ARG
MOVEM T,ARGVAL+1 ;SAVE 2ND HALF FOR FOROTS
MOVE T,(T2) ;REINSTATE 1ST ARG IN T
MOVEI T2,14 ;SET UP ARGTYPE FOR COMPLEX
PUSHJ P,FOROUT ;ONE ARG OUTPUT
; ** TYPE INTEGER ***
TYPI: TRNN TMOD,I. ;TYPE AS INTEGER?
JRST TYPO ;NO - TRY OCTAL
JUSTIFY
MOVEI ODF,^D10 ;PREPARE FOR DECIMAL TYPE OUT
PUSHJ P,FTOC ;CONSTANT PRINT
; *** TYPE OCTAL ***
TYPO: TRNN TMOD,O. ;TYPE AS OCTAL?
JRST TYPA ;NO - TRY ASCII
JUSTIFY
MOVEI ODF,10 ;PREPARE FOR OCTAL PRINT
PUSHJ P,FTOC ;PRINT IN OCTAL
TRNN TMOD,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 TMOD,A. ;TYPE AS ASCII?
JRST TYPR ;NO - SEE IF RIGH JUSTIFIED ASCII
JUSTIFY
PUSHJ P,TXT341 ;THROW UP ASCII
TRNN TMOD,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 TMOD,R. ;TYPE AS ASCII RIGHT JUSTIFY
JRST TYPL ;[120] NO - TRY OCTAL
JUSTIFY
TYPE(R) ;RASCII IDENTIFIER
LSH T,1 ;MAKE LEFT JUSTIFIED ASCII
PUSHJ P,TXT341 ;TYPE AS USUAL
TRNN TMOD,B. ;[120] DOUBLE RASCII?
JRST TYPL ;[120] NO
PUSHJ P,VAL2 ;GET NEXT VALUE
LSH T,1 ;FAKE ASCII
PUSHJ P,TXT341 ;TYPE AS ASCII
TYPL: TRNN TMOD,L. ;[120] TYPE AS LOGICAL?
JRST TYPS ;[120] NO - SEE IF IN RANGE
JUSTIFY ;[120]
JUMPGE T,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 TMOD,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
AOS T,RANLIM ; YES INCREMENT VARIABLE
TRNE F,DOUBLE ;[112] IS THIS A DOUBLE WORD ARRAY RANGE
AOS T,RANLIM ;DOUBLE WORD ARRAYS GO UP BY TWO
CAMG T,RANGE ;TO LIMIT OF RANGE
JRST DISP0 ;AND TYPE ALL REQUIRED
DISP5: TLNE TMOD,-1 ;LOCAL MODIFIERS?
HLRZ TMOD,TMOD ;YES - REMOVE THEM
SKIPGE TERMK ;END OF USER INPUT LINE YET?
JRST DISP4 ; NO - KEEP GOING
POPJ P, ; YES - END OF TYPE COMMAND
JUSTFY: TRZN TMOD,ANYMOD ;SEE IF FIRST OUTPUT THIS VARIABLE
jrst [LINE
jrst .+1]
TYPE( = )
MOVE T,LWT ;GET BACK THE OUTPUT VARIABLE CONTENTS
POPJ P,
; GET THE LIMIT OF A RANGE CONDITION AND CHECK THE ORDER
DISP1: MOVEM T,RANGE ;REMEMBER START OF RANGE
TLZ F,GRPFL ;NO GROUP REQUESTS HERE OR PRINT MODIFIERS
PUSH P,MATHSM ;SAVE CURRENT SYMBOL
PUSHJ P,SYMIN ;GET NEXT SYMBOL
JRST DISP3 ;BAD LABEL
JRST BADSYN ;STATEMENT NO. ????
POP P,T3 ;GET FIRST SYMBOL BACK
CAME T3,MATHSM ;ARE THEY THE SAME
JRST ERR40 ;NO - SORRY
TRZE F,SUBFLG ;WAS THERE AN IMPLIED RANGE
JRST DISP11 ;YES - GO DEAL WITH IT
CAML T,RANGE ;SORT OUT SYMBOL ORDER
EXCH T,RANGE ;CHANGE THEIR ORDER
CAIN T1,"-" ;"-" IS A DELIMITER BUT IS BAD HERE
JRST BADSYN
TLO F,GRPFL ;O.K. FOR GROUPS AGAIN
JRST DISP10 ;NOW TYPE RANGE
SYM4: TLNE F,GRPFL ;ARE WE ALLOWING CORE STRINGS
CAIE T1,"/" ;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
SKIPL TERMK ;EOL?
JRST BADSYN ;CAN'T HAVE THAT!
PJRST SYMIN ;RESUME SYMIN ACTIVITIES
; HANDLE GROUP REQUESTS
SYM14: CAIL T,1
CAILE T,GPMAX ;WHICH MUST BE IN RANGE
JRST ERR15 ;NO GOOD
CAIE T1,"," ;ALLOW COMMA AS DELIMITER
JUMPN T1,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 F,GRPFL ;IS GROUP LOGIC IN ACTION
JRST RET ;ASSUME NUL INPUT GO BACK TO USER
POP P,(P) ;REMOVE THE SYMIN PUSH
JUMPE T1,DISP5 ;EMPTY GROUP?
JRST BADSYN ;MUST BE BAD SYNTAX
; ROUTINE TO DETERMINE THE LENGTH OF AN IMPLIED RANGE
DISP14: MOVEM T,RANLIM ;SAVE THE BASE ARRAY REFFERENCE
SETZM PUTTER ;SET FOR RAYNAM
PUSHJ P,GET.RP ;GET THE RANGE PRODUCT FOR THIS ARRAY
MOVE T,DIMTOT ;
ADD T,RANLIM ;FORM UPPER RANGE LIMIT
SOJ T, ;
MOVEM T,RANGE ;SAVE THE RANGE
MOVE T,RANLIM ;GET THE START ADDRESS
POPJ P,
; ENTRY POINT FOR A GROUP 'TYPE' REQUEST
; PUSHJ P,SYM5
; WITH GROUP # 1-GPMAX IN T
; AND TERMK=0
SYM5: TRZE TF,DCOPFG ;DON'T OPEN PROG?
JRST SYM16 ;NO - DON'T
SKIPN T3,GRP2(T) ;GET GROUP'S PROG
JRST SYM16 ;NULL - IGNORE IT
CAMN T3,OPENED ;IS IT CURRENT?
JRST SYM16 ;YES
MOVEM T3,SYM ;NO - SAVE IT
MOVE T3,OPENED
MOVEM T3,OLDOPN ;AND SAVE OLD OPENED
PUSH P,T ;SAVE (T)
PUSHJ P,IMPOPN ;DO THE OPEN AND MESSAGE
POP P,T ;RESTORE (T)
SYM16:
; CHECK FOR GROUP RECURSION
MOVEI T3,1
LSH T3,(T) ;SET UP MASK BIT
TDOE T3,CURGRP ;CHECK AND SET
JRST ERR39 ;GROUP ALREADY ACTIVE - ERROR
MOVEM T3,CURGRP ;SAVE STATE
PUSH P,T ;SAVE T
IMULI T,CFSIZ ;GET RELEVANT GROUP SECTION
ADD T,[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 T,CFLPTR ;SET UP NEW POINTER
HRRZM T,CFLST ;DEFINE NEW STRING LIMIT
MOVE T,[ILDB T1,CFLPTR] ;GET POINTER TO NEW INFORMATION
MOVEM T,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,T ;GET NUMBER BACK
MOVEI T3,1
LSH T3,(T) ;SET UP MASK
TDC T3,CURGRP ;CLEAR THIS GROUP FLAG
MOVEM T3,CURGRP ;SAVE IT
PJRST DISP5 ;SEE IF THERE IS AN ORIGINAL USER
;STRING TO PROCESS
DISP3: PJRST DISP9 ;CANNOT FIND SYMBOL
;OPEN LOGIC
SETNAM: TLO F,FPRNM ; FIND PROGRAM NAME
PUSHJ P,FNDSYM ;
JRST ERR6 ; NO SUCH NAME
HLRE T,(R) ; GET (XWD -LEN,...)
HRLM T,OPENLS
ADDI T,1(R) ; POINT TO BEG OF PROGS SYMBOLS
HRRM T,OPENLS ;
MOVE T,SYM
MOVEM T,OPENED ; PROGRAM NAME OPENED
POPJ P, ;
; DIMENSION LOGIC
DEFINE PAIRS(K)
< K=K+2
XWD 0,K ;START OF STRING,NEXT IN STRING
XWD 0,0 ;PARAMETER WORD>
K=DIMTAB
DIMTAB: XLIST ;DEFINE TABLE OF TWO WORD PAIRS
REPEAT DIMSIZ-1,<PAIRS(K)>
XWD 0,0 ;END OF LIST IS SPECIAL
XWD 0,0
LIST
NUMPRS=DIMFRE-DIMTAB ;THE NUMBER OF AVAILABLE WORDS
NUMPRS=NUMPRS/2 ;DEFINES THE # OF 'PAIRS' AVAILABLE
DIMFRE: XWD K,DIMTAB ;END, AND START OF FREE SPACE
DIMNAM: XWD 0,0 ;END, AND START OF LIST OF ARRAY NAMES
; ROUTINE TO OBTAIN A FREE TWO WORD PAIR
; CALL PUSHJ P,GET2WD
; RETURN - ADDRESS OF 'PAIR' IN T
GET2WD: HRRZ T,DIMFRE ;GET THE START OF THE FREE LIST
HRRZ T1,(T) ;FIND THE LOCATION OF THE NEXT 'PAIR'
JUMPE T1,GETNON ;END OF LIST REACHED
HRRM T1,DIMFRE ;REMOVE THIS 'PAIR' FROM THE LIST
POPJ P, ;RETURN WITH GOOD 'PAIR' ADDRESS IN T
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 'PAIR' TO THE FREE LIST
; CALL PUSHJ P,PUT2WD
; ENTER WITH ADDRESS OF 'PAIR' IN T
; RETURN
PUT2WD: HLRZ T1,DIMFRE ;GET THE ADDRESS OF THE END OF THE LIST
HRRM T,(T1) ;APPEND THE NEW 'PAIR'
SETZM (T) ;NEW 'PAIR' BECOMES END OF LIST
HRLM T,DIMFRE ;RECORD THE 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 . . . T=ADDRESS OF ARRAY, T2=LAST ARRAY
; F10RAY IN TF IS SET IF F10 DEFINED
RAYNAM: TRZ F,FORMAL!F10RAY ;[105] ASSUME NEITHER HOLDS
HRRZI T2,DIMNAM ;SET UP FOR FIRST ARRAY
HRRZ T,DIMNAM ;IS THERE AN ENTRY AT ALL?
RAY: JUMPE T,RAY3 ;T2 WILL POINT TO THE END OF THE LIST
HRRZ T1,1(T) ;THIS IS AN ARRAY BLOCK - GET THE NAME(VALUE)
CAMN T1,SAVLOC ;ARE WE REDEFINING CURRENT NAME?
JRST RAY2 ; YES - REMOVE THE ENTRY FIRST
MOVE T2,T ;T2 WILL POINT TO THE CURRENT GOOD ENTRY
HRRZ T,(T) ;FIND THE NEXT 'PAIR' ADDRESS
JRST RAY
RAY2: SKIPL 1(T) ;IS THE DOUBLE PRECISION BIT ON = 400000,,0
TRZA F,DOUBLE ;NO - MAKE SURE 'DOUBLE' IS OFF
TRO F,DOUBLE ;YES - SET THE DOUBLE FLAG
JRST CPOPJ1 ;ARRAY IDENTIFIED EXIT
; HERE IF NO USER DEFINITION EXISTS IN FORDDT DIMENSION LISTS
; NOW CHECK FOR AN F10 DEFINITION
RAY3: PUSH P,T ;SAVE BOTH T AND-
PUSH P,T2 ; T2 AROUND EVAL
MOVE T,SAVLOC
TRO F,SILENT ;DON'T PRINT SYMBOL
PUSHJ P,LOOK ;SETS UP W1 FROM T
JRST RAYPOP ;
JRST RAYPOP ;DOSENT EXIST
POP P,T2 ;RETURN T2
POP P,T ; AND T
MOVE RAY.,W1 ;GET THE ARRAY SYMBOL
MOVE T1,(RAY.) ; AND SEE IF WE HAVE AN F10 ARRAY -
TLZ T1,PNAME ; DEFINITION -
IOR T1,[XWD 500000,0]; THIS IS THE SAME SYMBOL
CAME T1,2(RAY.) ; WITH FLAGS 50 SET
POPJ P, ;NO - NOT AN F10 DEFINITION
TRO F,F10RAY ;YES - FLAG THIS AS AN F10 ARRAY
MOVE RAY.,3(RAY.) ;SET POINTER TO ARRAY TABLE INFORMATION
LDB T1,[POINT 4,1(RAY.),12]
TRNN T1,10 ;[112] IS THIS A DOUBLE WORD ARRAY?
TRZA F,DOUBLE ;NO MAKE SURE DOUBLE IS OFF
TRO F,DOUBLE ;YES FLAG IT
LDB T1,[POINT 9,1(RAY.),8]
MOVEM T1,DIMCNT ;SET UP THE NUMBER OF DIMENSIONS
LDB T1,[POINT 1,1(RAY.),13]
JUMPN T1,RAY4 ;PASSING FORMAL ARRAY ARGUMENTS?
RAY5: HRRZI RAY.,3(RAY.) ;SET TO POINT TO THE FIRST DIMENSION
JRST CPOPJ1
RAYPOP: POP P,T1 ;MUST RESET T2-
POP P,T ; AND T BEFORE
POPJ P, ; GIVING A NO FOUND EXIT
RAY4: TRO F,FORMAL ;FLAG FORMAL WORKING
HRRZI T,@1(RAY.) ;GET THE ACTUAL ARRAY BASE
MOVEM T,FRMSAV ;SAVE THE FORMAL REFFERENCE
JRST RAY5 ;
; 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,F ;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 F,FORMAL ;ATTEMPT TO RE-DIMENSION A FORMAL PARAMETER
JRST ERR33 ;NO YOU DON'T
TRNN F,F10RAY ;F10 DEFINED ARRAY?
JRST PUTCHK ;RESET ALL
JRST ERR28 ;WARN OF F10 REDEFINITION
PUTOK: POP P,F ;RESTORE FLAGS FROM ABOVE
PUSHJ P,GET2WD ;GET A 'PAIR' - END OF NAMES = T2
MOVEM T,T3 ;SAVE FOR NAME DEFINITION - T3
PUSHJ P,GET2WD ;GET A 'PAIR' FOR DIMENSION DEFINITION
;ENSURE WE HAVE 2 'PAIRS' FREE NOW
;SAVE PAIN IN 'FLUSHING' LATER
HRRM T3,(T2) ;SAY HELLO TO NEW MEMBER
SETZM (T3) ;NEW MEMBER BECOMES END OF CHAIN
MOVE T1,SAVLOC ;GET THE NEW MEMBERS NAME
TRNE F,DOUBLE ;IS THIS A DOUBLE WORD ARRAY
TLO T1,400000 ;YES - SAVE THE FACT
MOVEM T1,1(T3) ;ACCEPT THE NEW MEMBER TO THE FAMILY
HRLM T,(T3) ;NEW MEMBERS ARE GIVEN A DIMENSION LIST
PUSHJ P,PUTSUB ;STORE THE SUBSCRIPTS
JRST CPOPJ1 ;JUMP OVER POSSIBLE PUTDIM ENTRY
PUTSUB: MOVE T1,TEM1 ;GET THE UPPER SUBSCRIPT
SUB T1,TEM ;FORM THE DIMENSION RANGE < 256K
HRLZM T1,(T) ;SAVE IN LINK LOCATION OF PAIR
; AND DENOTE END OF PRESENT DIMENSION LIST
MOVE T1,TEM ;GET THE LOWER SUBSCRIPT
MOVEM T1,1(T) ;SAVE FOR FUTURE REFERENCE
MOVEM T,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,GET2WD ;GET A FREE 'PAIR'
MOVE T1,PUTTER ;FIND WHERE THE LAST DIMENSION WAS STORED
HRRM T,(T1) ;LINK NEW 'PAIR' TO OLD 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 T,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 F,F10RAY ;F10 DEFINED?
JRST GET3 ;YES
HLRZ T,(T) ;GET THE START OF DIMENSION LIST
JRST GET5 ;FIRST TIME IS SPECIAL
GET4: TRNE F,F10RAY ;F10 ARRAY DEFINITION?
JRST GET3 ;YES
HRRZ T,(T) ;GET NEXT DIMENSION IF ANY
GET5: JUMPE T,ERR22 ;END OF LIST - TOO MANY DIMENSIONS EXPECTED
MOVEM T,PUTTER ;SAVE LINK TO NEXT DIMENSION
MOVE T2,1(T) ;GET THE LOWER SUBSCRIPT
MOVEM T2,TEM ;SAVE THE LOWER SUBSCRIPT
HLRZ T2,(T) ;GET THE RANGE OF THIS DIMENSION
ADD T2,TEM ;FORM THE UPPER SUBSCRIPT
MOVEM T2,TEM1 ;SAVE AS THE UPPER SUBSCRIPT
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 T,@(RAY.) ;GET THE LOWER BOUND
MOVEM T,TEM ;SAVE LOWER
MOVE T,@1(RAY.) ;GET THE UPPER BOUND
MOVEM T,TEM1 ;SAVE LOWER
HRRZI RAY.,3(RAY.) ;RAY. 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 T3,SAVLOC ;GET THE NEW ARRAY NAME(VALUE)
EXCH T3,BASRAY ;SAVE AND START AT BASE-ARRAY NAME
PUSHJ P,RAYNAM ;SET UP POINTERS TO BASE-ARRAY
POPJ P, ; ????
MOVEM T3,BASRAY ;RESET BASE ARRAY AND CURRENT NAME
TRNE F,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 T,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 F,F10RAY ;IS THIS AN F10 DEFINED ARRAY
SKIPA T3,[EXP SAVLOC-1] ;IF SO FOOL TYPDIM
MOVE T3,T ;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 F,FLSHAL ;SET UP TO FLUSH ALL FROM BASE-ARRAY
MOVE T,BASRAY ;GET THE BASE ARRAY VALUE
MOVEM T,SAVLOC ;AND SET UP FOR RAYNAM
PUSHJ P,RAYNAM ;RESET F10RAY FLAG TO NEW BASRAY SETTING
POPJ P, ;?????
FLUSH: TRNN F,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
;T2=POINTS TO LAST ARRAY NAME BLOCK
;T= CURRENT ARRAY NAME BLOCK
FLUSH2: HLRZ T3,(T) ;GET DIMENSION LIST ADDRESS
HRRZ T1,(T) ;GET NEXT MEMBER ADDRESS
HRRM T1,(T2) ;LOOP OUT THE OFFENDING ARRAY NAME ENTRY
PUSHJ P,PUT2WD ;RETURN A PAIR
PUSHJ P,DELIST ;DELETE THE LIST STARTING AT C(T3)
TRNN F,FLSHAL ;HARD FLUSH?
POPJ P, ;JUST ONE ARRAY FOR NOW
HRRZ T,(T2) ;GET NEXT ARRAY REFERENCE IF ANY
JUMPE T,CPOPJ ;EXIT IF END OF LIST
JRST FLUSH2 ;MORE TO DO
;ROUTINE TO DELETE A LIST - STARTING IN T3
DELIST: SKIPN T,T3 ;TEST FOR END OF LIST - RETURN PAIR IN T
POPJ P, ;END OF LIST
HRRZ T3,(T3) ;GET NEXT PAIR ADDRESS
PUSHJ P,PUT2WD ;RETURN THE OLD PAIR
PJRST DELIST ;FOLLOW THROUGH TO END OF LIST
DIM5: PUSHJ P,DIMOUT ;DISPLAY ALL ARRAY INFO.
LINE
JRST RET
; DIMENSION LOGIC
DUBLE: TRO F,DOUBLE ;[112] FLAG THIS AS A DOUBLE WORD ARRAY
DIM: JUMPL F,DIM5 ;OUTPUT ALL DIMENSION SPECS
PUSHJ P,TTYIN ;GET NEXT USER STRING
JUMPE T2,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
MOVEM T3,MATHSM ;THATS WHAT USER TYPED
MOVEM T3,SYM ;SAVE FOR 'EVAL'UATION
PUSHJ P,EVAL ;EVALUATE SYMBOL
JRST ERR6 ;WE DON'T HAVE IT
MOVEM T,SAVLOC ;SAVE ARRAY NAME VALUE
MOVE T1,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 T1,"(" ; [ DENOTES START OF DIMENSION DEFINITION
JRST DIM14 ;COMMAND - WILL NOW BE NON ZERO
CAIE T1,"[" ; ( IS AN ALTERNATIVE TO [
JRST DIM7
TLO F,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 T1,"/" ;A / IS ACCEPTABLE TO REMOVE ARRAYS
JRST BADSYN ;ANYTHING ELSE WONT DO
PUSHJ P,TTYIN ;GET NEXT INPUT
JUMPN T1,BADSYN ;MUST BE LINE END NOW
JUMPE T2,BADSYN ;NO CHARACTERS??
LSHC T1,6 ;GET THE FIRST SWITCH CHARACTER
CAIE T1,'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 F,BASENM ;HAS A BASE NAME BEEN ACCEPTED
JRST DIM0 ;YES - DON'T FLUSH YET
PUSH P,F ;PROTECT THE DOUBLE FLAG AWHILE
PUSHJ P,RAYNAM ;HAVE WE HAD THIS BASE ARRAY BEFORE
CAIA ;NO - VIRGIN
TRNN F,F10RAY ;F10 DEFINED?
PUSHJ P,FLUSH ;YES - WE MUST REMOVE IT NOW FOR REDEFINITION
MOVE T,SAVLOC ;GET THE ARRAY VALUE
MOVEM T,BASRAY ;MARK THIS AS OUR BASE ARRAY
POP P,F ;RE-INSTATE THE DOUBLE FLAG IF THERE
DIM0: TRO F,SURGFL ;FLAG THIS CALL AS SUBSCRIPT GATHERING
PUSHJ P,EITHER ;READ A SUBSCRIPT
CAIA ;CONSTANT
MOVE T,(T) ;VARIABLE - GET VALUE
TRZ F,SURGFL ;CLEAR SUBSCRIPT RANGE ACCEPT FLAG
MOVEM T,TEM1 ;SAVE TEMPORARILY AS UPPER SUBSRIPT
PUSHJ P,NXTCHR ;MOVE TO NEXT CHARACTER
CAIN T1,"," ;COMMA IS THE USUAL DELIMITER
JRST DIMCOM ;PROCESS A COMMA
CAIE T1,":" ;A : IS AS GOOD AS A BAR=/
CAIN T1,"/" ;BAR IS THE SUBSCRIPT SEPARATOR
JRST DIMBAR ;PROCESS A BAR
TLNN F,LFTSQB ;SKIP IF WE HAD A [ TO START
ADDI T1,"]"-")" ;ACCEPTABLE DELIMITER IF )
CAIN T1,"]" ;ONLY ] ACCEPTED AS DELIMITER
JRST DIM4 ;DENOTE END OF DEFINITIONS
PUSHJ P,FLUSHA ;REMOVE THE PRESUMABLY WRONG DEFINITION
JRST BADSYN ;COMPLAIN ABOUT SYNTAX
DIM4: TLO F,DIMEND ;FLAG THAT THIS IS THE END OF THE LIST
DIMCOM: TLZE F,BAR ;HAVE HAD TWO SUBSCRIPTS?
JRST DIM2 ;YES - CHECK THE ORDER
MOVEI T,1 ;ADJUST LOWER SUBSCRIPT TO BE 1
MOVEM T,TEM ;LOWER SCR IN TEM
JRST DIM2 ;CHECK THE SUBSCRIPTS
DIM3: SKIPN DIMTOT ;IS THIS THE FIRST SETTING FOR THIS ARRAY
PUSHJ P,PUTNAM ;YES - USE PUTNAM
PUSHJ P,PUTDIM ;N0 - ADD ANOTHER DIMENSION
MOVE T,TEM1 ;GET UPPER SUBSCRIPT
SUB T,TEM ;FORM RANGE
AOJ T, ;MUST HAVE AT LEAST ONE
SKIPN DIMTOT ;IS THIS THE FIRST DIMENSION
AOS DIMTOT ;YES - MAKE FIRST RANGE DEFAULT = ONE
IMULM T,DIMTOT ;FORM TOTAL SUBSCRIPT COUNT IN DIMTOT
TLNN F,DIMEND ;WAS A LEFT SQUARE BRACKET SEEN LAST?
JRST DIM0 ;NO - BACK FOR MORE
MOVE T,SAVLOC ;GET THE ARRAY VALUE
ADD T,DIMTOT ;FORM REFERENCE TO LAST ELEMENT OF ARRAY
TRNE F,DOUBLE ;[112] DO WE HAVE A DOUBLE WORD ARRAY
ADD T,DIMTOT ;YES - SO THE RANGE MUST BE DOUBLED
SUBI T,1
TRO F,SILENT ;DO NOT TYPE SYMBOL IF GOOD MATCH
SETZM MATHSM ;NO SPECIFIC SYMBOL TO FIND
PUSHJ P,LOOK ;DO A LOOK-UP ON LAST ELEMENT
JRST E5 ;INTERNAL ERROR
JFCL ;FOUND SOME REFERENCE - NOT EXACT
MOVE W1,1(W1) ;EXACT - FOR DIMENSION OF 1 ONLY
TRZ F,F10RAY ;NO LONGER REQUIRE F10 INDICATOR
MOVE T1,LSTCHR ;RE-INSTATE USERS LAST CHARACTER
CAMN W1,SAVLOC ;THE LAST REFERENCE SHOULD BE TO THE SAME ARRAY
POPJ P,
LINE
TYPE (%FDTABX ) ;WARNING
PUSHJ P,TYPRAY ;TYPE THE (SAVLOC) ARRAY NAME
TYPE( compiled array bounds exceeded)
POPJ P,
DMFLSH: PUSHJ P,FLUSH ;THE WHOLE SETUP FAILS
JRST RET
TYPRAY: MOVE T,SAVLOC ;GET THE OFFENDING ARRAY NAME
TRZ F,SILENT ;SPEAK-UP
PUSHJ P,LOOK ;SHOW THE USER
JFCL
JFCL
POPJ P,
DIM2: MOVE T,TEM1 ;GET THE SECOND SUBSCRIPT
CAMGE T,TEM ;ENSURE THAT IT IS GREATER THAN THE FIRST
JRST ERR3 ;TELL USER ABAOUT THE ERROR
SUB T,TEM ;FIND THE RANGE
CAIG T,777777 ;CANT HAVE ARRAYS OWNING WHOLE OF CORE
JRST DIM3 ;SUBSCRIPTS OK
JRST ERR27 ;BAD SUBSCRIPTS
DIMBAR: TLOE F,BAR ;FLAG A BAR IF NOT ALREADY SET
JRST BADSYN
MOVE T,TEM1 ;MOVE FIRST SUBSCRIPT TO APPROPRIATE PALCE
MOVEM T,TEM ; IN TEM
JRST DIM0 ;LOOK FOR SECOND SUBSCRIPT
NXTCHR: SKIPL TERMK ;END OF LINE?
JRST BADSYN ;YES - SHOULD'T BE
JUMPN T1,CPOPJ ;TERMINATOR?
PJRST GETSKB ;MOVE TO NEXT SIGNIFICANT CHARACTER
; DISPLAY ALL ARRAY DATA ENTERED BY USER
DIMOUT: LINE
ife tops20,<
SKPINL ;INTERCEPT A USER CONTROL O
JFCL> ;end of conditional
ifn tops20,<
push p,tf ;save tf
push p,r ;save r
hrrzi tf,.priou ;get terminal output designator
rfmod% ;get terminal JFN word
tlz r,(tt%osp) ;clear ^o effects
hrrzi tf,.priou ;get terminal output designator
sfmod% ;set new JFN word
pop p,r ;restore r
pop p,tf> ;restore tf, end of conditional
LINE
SKIPN T3,DIMNAM ;START AT HEAD OF ARRAY NAMES
jrst [TYPE(No )
jrst .+1]
TYPE(Array specifications)
LINE
JUMPE T3,CPOPJ ;EXIT IF NOTHING TO PRINT
LINE
TYPE(USED MAX ARRAY DIMENSIONS)
LINE
HRRZI T3,DIMNAM ;START AT HEAD OF ARRAY NAMES
TYPNXT: HRRZ T3,(T3) ;FIND NEXT ARRAY REFERENCE
JUMPE T3,CPOPJ ;ALL PROCESSED?
PUSHJ P,TYPDIM ;NO - TYPE DIMENSIONS
JRST TYPNXT ;LOOK FOR MORE
; TYPE THE DIMENSION LIST FOR THE ARRAY 'PAIR' IN T3
TYPDIM: PUSH P,T3 ;SAVE T3 ROUND LOOK-UP
LINE
HRRZ T,1(T3) ;GET THE ARRAY NAME VALUE
MOVEM T,SAVLOC ;SAVE THE ARRAY REFERENCE
PUSHJ P,GET.RP ;GET THE RANGE PRODUCT = DIMTOT
MOVE T,DIMTOT ;GET TOTAL ELEMENT COUNT
PUSHJ P,TYP0 ;AND DISPLAY IT
TAB
TYPE([)
MOVE T,SAVLOC ;GET THE USER ARRAY NAME
TRO F,SILENT!NEARST ;DO NOT PRINT IF EXACT MATCH & FIND NEAREST SYMBOL
PUSHJ P,LOOK ;SEE IF THE ARRAY EXISTS
JRST E5 ;CANNOT FIND IT!
JFCL ;NOT EXACT
;EXACT MATCH RETURN
SUB T,SAVLOC ;REMOVE BASE ARRAY OFFSET
PUSHJ P,TYP0 ;DISPLAY
type(])
tab
SETZM PUTTER ;RESET FOR RESCAN OF ARRAY'S DIMENSIONS
MOVE T,SAVLOC ;GET THE ARRAY NAME VALUE
TRZ F,SILENT!NEARST ;TURN OF PRINT SUPRRESS SWITCH & NEAREST
PUSHJ P,LOOK ;DO A LOOK UP ON C(T)
JFCL ;NOT FOUND
JRST E5 ; OR NOT EXACT??
TAB
TYPE([)
DIM10: PUSHJ P,GETDIM ;GET THE SUBSCRIPTS FOR THE NEXT DIMENSION IN TEM,TEM1
MOVE T,TEM ;GET THE LOWER SUBSCRIPT
PUSHJ P,TYP0 ;AND TYPE IT
stype("/")
MOVE T,TEM1 ;GET TUE UPPER SUBSCRIPT
PUSHJ P,TYP0 ;AND TYPE THAT
PUSHJ P,MORDIM ;ANY MORE DIMENSIONS?
JRST DIM20 ;NO
stype(</,/>)
JRST DIM10 ;PROCESS NEXT DIMENSION
DIM20: TYPE(])
POP P,T3 ;GET BACK ARRAY REFERENCE
TRNE F,F10RAY ;F10 ORIGINATED?
jrst [TYPE( - F10 ORIGINATED)
jrst .+1]
TRNE F,DOUBLE ;REAL*8
jrst [TYPE( DP)
jrst .+1]
TRNN F,DOUBLE ;REAL*4
jrst [TYPE( SP)
jrst .+1]
TRNE F,FORMAL ;ARRAY IS A FORMAL ?
jrst [TYPE( FORMAL)
jrst .+1]
POPJ P,
; SUBROUTINE TO SEE IF THERE ARE ANY MORE DIMENSIONS TO COME
; FOR THE CURRENT ARRAY
; CALL PUSHJ P,MORDIM
; RETURN NO MORE
; RETURN MORE TO FOLLOW
MORDIM: TRNE F,F10RAY ;F10 DEFINED ARRAY?
JRST MORD2 ;YES
SKIPN T,PUTTER ;EXIT IF PUTTER = 0
POPJ P, ;NO MORE TO COME
HRRZ T,(T) ;NO MORE IF NEXT IN LINE = 0
JUMPE T,CPOPJ ;T WILL BE ZERO IF THIS IS THE LAST DIMENSION
JRST CPOPJ1 ;MUST BE MORE THERE
MORD2: SKIPG DIMCNT ;ANY MORE DIMENSIONS TO COME?
POPJ P, ;NO
JRST CPOPJ1 ;YES
; ROUTINE TO GET THE RANGE PRODUCT FOR THE ARRAY WHOSE VALUE
; IS HELD IN SAVLOC. EXIT WITH DIMTOT = RANGE PROD.
GET.RP: SETZM DIMTOT ;CLEAR THE ELEMENT COUNT CELL
SETZM PUTTER ;CLEAR FOR NEW SCAN IN GETDIM
DIM11: PUSHJ P,GETDIM ;GET THE NEXT SET OF DIMENSIONS FOR THE (SAVLOC) ARRAY
MOVE T,TEM1 ;GET THE UPPER SUBSCRIPT SU
SUB T,TEM ;FORM SU-SL
AOJ T, ;FORM SU-SL+1
SKIPN DIMTOT ;FIRST TIME IS SPECIAL
AOS DIMTOT
IMULM T,DIMTOT ;FORM TOTAL SPACE DECLARED FOR THIS ARRAY
PUSHJ P,MORDIM ;SEE IF THERE ARE ANY MORE DIMENSIONS
SKIPA T,DIMTOT ; NO - ALL DONE
JRST DIM11 ;YES - BACK FOR MORE
TRNE F,DOUBLE ;[112] IS THIS ARRAY DOUBLE WORD
ADDM T,DIMTOT ;YES - DOUBLE UP THE RANGE ACCESSED
POPJ P, ;WE NOW HAVE THE TRUE SCOPE OF THE ARRAY
; GROUP LOGIC
GROUP: JUMPL F,GRPALL ;DISPLAY ALL GROUPS
PUSHJ P,GETNUM ;WHICH GROUP IS THE USER SETTING?
JUMPLE T,ERR15 ;NOT VALID
CAILE T,GPMAX ;GPMAX IS THE MOST HE SHOULD ASK FOR
JRST ERR15
MOVE T1,OPENED
MOVEM T1,GRP2(T) ;THIS GROUP BELONGS TO THIS SECTION
IMULI T,CFSIZ ;END OF GROUP AREA
SKIPL TERMK
JRST [PUSHJ P,GRTYP ;FORGETFULL USER WANTS TO SEE GROUP CONTENTS
JRST RET]
ADD T,[POINT 7,GRP1-CFSIZ]
MOVEM T,CFLPTR ;WHERE TO STORE NEW STRING
HRRZM T,CFLST ;GUARD AGAINST OVERFLOW
MOVE T,[PUSHJ P,I2CFIL]
MOVEM T,GETCHR ;SETUP TTYIN TO READ CORE FILE
GRPMOR: PUSHJ P,I2CFIL ;CRAFTY READ AND STORE ROUTINE
PUSHJ P,GETSK2 ;SET UP ANY DELIMITER FLAGS
JUMPN T1,GRPMOR ;IF NO DELIMITERS - DO MORE
SKIPL TERMK ;END OF INPUT?
JRST RET ; YES - ALL DONE
JRST GRPMOR ; NO - DO MORE, WAS A SPACE
; DISPLAY THE CONTENTS OF THE GROUP WHOSE # IS IN T
GRTYP: HRRZM T,T2 ;
ADD T,[POINT 7,GRP1-CFSIZ,6] ;[132]
MOVE T1,[ILDB T1,T]
MOVEM T1,GETCHR ; INPUT FROM GROUP FILE
GRPNXT: SETOM TERMK ;SET UP FOR DELIMETER TEST
LDB T1,T ;[132] GET NEXT CHAR FROM STRING
PUSHJ P,GETSK2 ;END OF STRING?
JUMPN T1,.+2
MOVEI T1, " " ;SPACE IS SPECIAL
SKIPL TERMK
POPJ P, ;YES - IF TERMINAL CHARACTER TERMK +VE
putchr (T1) ;SHOW CHARACTER
IBP T ;[132] POSITION FOR NEXT BYTE
HRRZM T,T3
CAIE T3,GRP1(T2) ;OVERFLO CHECK
JRST GRPNXT ;KEEP GOING
POPJ P, ;BETTER STOP
; GROUP STRING CORE STORAGE
GRP1: REPEAT GPMAX,< XWD 050000,0 ;NULL GROUP CONTENTS
BLOCK CFSIZ-1 ;SPACE FOR GROUP STRING
>
GRP2=.-1
BLOCK GPMAX ;PROGRAM NAMES FOR GROUPS
CURGRP: BLOCK 1 ;BITS TO FLAG CURRENT GROUP STACK
;IN ORDER TO CATCH RECURSION
; WHAT LOGIC
WHAT: LINE
TYPE(Open section: )
MOVE T,OPENED
PUSHJ P,SPT1 ;TYPE NAME OF OPEN SECTION
LINE
SKIPA T,[0] ;FLAG DISPLAY OF EVERYTHING
PSEALL: SETO T, ;FLAG DISPLAY OF PAUSES ONLY
PUSH P,T ;SAVE FLAG
MOVEI T,^D10
MOVEM T,ODF ;SET RADIX 10 AS STANDARD IN 'WHAT'
MOVEI T,B1ADR ;START OF PAUSES
WT10: SKIPE (T)
JRST WT9 ;THERE IS AT LEAST ONE PAUSE SET
ADDI T,1 ;NO PAUSES SEEN SO FAR
CAIG T,BNADR ;ALL PAUSES EXAMINED?
JRST WT10 ;NO
LINE
TYPE(No pause requests)
JRST WT11
WT9: LINE
TYPE(GROUP AFTER PAUSE LOCATED IN)
LINE
MOVEI AR,B1ADR ;GET START OF PAUSES
WT6: HRRZ T,(AR) ;GET THE PAUSE ADDRESS
JUMPE T,WT5 ;OMIT IF NO PAUSE SETTING
; TYPING OPTION = GROUP
HLRZ T,(AR) ;GET THE 'TYPING' OPTION
JUMPE T,WT12 ;WAS TYPING REQUESTED?
HLRZ T,(AR) ;YES - GET GROUP #
PUSHJ P,FTOC ;DISPLAY GROUP #
; PROCEDE SETTING
WT12: TAB
MOVE T,1(AR) ;GET CONDITIONAL SETTING
JUMPE T,WT2 ;NO CONDITIONALS
stype("N/A") ;NOT APLICABLE DUE TO CONDITIONAL
JRST WT13 ;DISPLAY GROUP
WT2: MOVE T,2(AR) ;GET PROCEDE COUNT
PUSHJ P,FTOC ;TYPE THE PROCEDE COUNT
; PAUSE IDENTIFICATION
WT13: TAB
HRRZ T,(AR) ;GET PAUSE ADDRESS
JUMPE T,WT5 ;NO PAUSE SET UP HERE
TLO F,FGLSNM ;GLOBALS OK
PUSHJ P,LOOK ;LOOKUP SYMBOL
JRST E1 ;NOT THERE??
PUSHJ P,SPT ;TYPE SUBROUTINE NAME
TAB ;ADD PROGRAM NAME WHERE PAUSE IS
SKIPE T,PNAMSV ;WAS A PG NAME FOUND?
PUSHJ P,SPT1 ;YES TYPE IT
; ANY CONDITIONALS?
SKIPE 1(AR) ;IS THIS A CONDITIONAL PAUSE?
JRST WT14 ; YES
WT5: SKIPE (AR)
jrst [LINE
jrst .+1]
ADDI AR,3 ;MOVE ON TO NEXT PAUSE
CAIG AR,BNADR ;DONE ALL PAUSES?
JRST WT6 ;NO - BACK FOR MORE
JRST WT11 ;FINISHED PAUSE DISPLAY - DO GROUPS
; TYPE PARAMETERS OF CONDITIONAL PAUSE
WT14: TAB
TYPE(IF )
HRRZ T1,AR ;GET CURRENT PAUSE ADDRESS
SUBI T1,B1ADR ;REMOVE OFFSETT
IDIVI T1,3 ;FORM PAUSE#
LSH T1,2 ;FORM INDEX TO TESTAB
MOVEM T1,WT16 ;SAVE T1 TEMPORARILY
MOVE T,TESTAB(T1) ;[116] GET LOGICAL FLAGS
TLNE T,LFTLOG ;[116] IS ARG. LOGICAL?
JRST WTLLOG ;[116] YES, TAKE CARE OF IT
MOVE T,TESTAB+1(T1) ;GET FIRST ARG ADDRESS
CAIN T,TESTAB+3(T1) ;IS IT A CONSTANT?
JRST [MOVE T,(T) ;YES
PUSHJ P,TFLOT ;TYPE FLOATING
JRST WT15]
CLEARM SAVLOC ;USER DIDNT GIVE ANY INFO!
CLEARM SECSAV ;CLEAR SAVED NAME OF SECTION
PUSHJ P,OFFSET ;TYPE THE ARGUMENT NAME
JRST E1 ;NAME NOT FOUND?
WT15: MOVE T1,WT16 ;RE-INSTATE T1
MOVE T,TESTAB(T1) ;GET CONDITIONAL TYPE
TYPE( .)
atype(TYPTST(T)) ;TYPE THE CONDITION
TLNE T,RHTLOG ;[116] IS THIS ARG. LOGICAL?
JRST WTRLOG ;[116] YES, TAKE CARE OF IT
MOVE T,TESTAB+2(T1) ;GET SECOND ARG ADDRESS
CAIN T,TESTAB+3(T1) ;IS THIS A CONSTANT?
JRST [MOVE T,(T) ;YES -
PUSHJ P,TFLOT ;TYPE FLOATING
JRST WT5]
CLEARM SAVLOC ;USER DIDNT GIVE ANY INFO!
CLEARM SECSAV ;CLEAR SAVED NAME OF SECTION
PUSHJ P,OFFSET ;DISPLAY THE SECOND ARGUMENT NAME
JRST E1 ;NAME NOT FOUND
JRST WT5 ;RETURN FOR NEXT PAUSE
WTLLOG: MOVE T,@TESTAB+1(T1) ;[124][116] GET VALUE
JUMPL T,WTLTRU ;[124][116] IS IT POSITIVE?
TYPE(.FALSE.) ;[116] YES, SO .FALSE.
JRST WT15 ;[116]
WTLTRU: TYPE(.TRUE.) ;[116] MUST BE .TRUE.
JRST WT15 ;[116]
WTRLOG: MOVE T,@TESTAB+2(T1) ;[124][116] GET VALUE
JUMPL T,WTRTRU ;[124][116] IS IT POSITIVE?
TYPE(.FALSE.) ;[116] YES, SO IT'S .FALSE.
JRST WT5 ;[115]
WTRTRU: TYPE(.TRUE.) ;[116] MUST BE .TRUE.
JRST WT5 ;[116]
TYPTST: ASCIZ/LT. /
ASCIZ/LE. /
ASCIZ/EQ. /
ASCIZ/NE. /
ASCIZ/GT. /
ASCIZ/GE. /
WT16: 0
; GROUP SETTINGS
WT11: LINE
POP P,T ;GET DISPLAY FLAG BACK
JUMPL T,RET ;DONE IF FLAG IS SET
PUSHJ P,GROUPS ;DISPLAY THE USERS GROUP SETTINGS
PUSHJ P,DIMOUT ;DISPLAY ANY USER DEFINED ARRAY SPECS.
LINE
JRST RET ;END OF WHAT
; PUSHJ P,GRPALL TO TYPE ALL GROUP SETTINGS
GRPALL: PUSHJ P,GROUPS
JRST RET
GROUPS: MOVEI AR,GPMAX ;CHECK IF ANY ARE USED
GROU1: SKIPE GRP2(AR) ;USED?
JRST GROU2 ;YES
SOJG AR,GROU1 ;NO, TRY NEXT
LINE
TYPE (No group specifications)
POPJ P,
GROU2: MOVEI AR,1 ;SET UP FOR FIRST GROUP
JRST WT7.5 ;
WT7: SKIPN GRP2(AR) ;THIS ONE USED?
JRST WT7.3 ;NO - IGNORE IT
LINE
TLO F,CFLIU!OFCFL ;MAKE REQUEST FOR CORE FILE USE
TYPE(GROUP )
MOVE T,AR
MOVEI ODF,12 ;DECIMAL BASE FOR GROUP NUMBERS
PUSHJ P,FTOC ;TYPE GROUP #
type(:)
tab
MOVEI T,(AR) ;GET GROUP # BACK
IMULI T,CFSIZ ;POINT TO ACTUAL LOCATION OF GROUP START
PUSHJ P,GRTYP ;DISPLAY GROUP CONTENTS
WT7.3: ADDI AR,1 ;BUMP GROUP NUMBER
WT7.5: CAIG AR,GPMAX ;DONE ALL GROUPS?
JRST WT7 ;NO - BACK FOR MORE
WT8: TLZ F,CFLIU!OFCFL ;REMOVE DANGEROUS FLAGS
POPJ P, ;
; NEXT LOGIC - STEPS THROUGH STATEMENT LABELS(S),
; SOURCE LINES(L) OR SUBROUTINE ENTRIES(E)
NEXT: JUMPL F,STEP2 ;NO ARGUMENTS USES DEFAULTS
PUSHJ P,EITHER ;ACCEPT EITHER A NUMERIC OR VARIABLE
CAIA ;NUMERIC
MOVE T,(T) ;GET VARIABLE CONTENTS
JUMPE T,.+2 ;ZERO = LAST VALUE SUPPLIED
MOVEM T,STPVAL ;STORE THE NEW STEP VALUE
CAIE T1,"/" ;TRACE OPTION FOLLOWS?
JRST STEP2 ;NO SWITCHES
PUSHJ P,OPTION ;FIND WHICH
JRST BADSYN ;NO GROUP REQUESTS HERE
TRNN TMOD,L.!S.!E. ;ANY TRACE OPTIONS SELECTED?
JRST STEP2 ;NO JUST 'NEXT'
TRZ F,TRLABL!TRLINE ;FIRST RESET THE TRACE FLAGS
TRZE TMOD,L. ;DO WE TRACE LINES?
TRO F,TRLINE ;YES
TRZE TMOD,S. ;DO WE TRACE LABELS?
TRO F,TRLABL ;YES
STEP2: MOVEM F,STKYFL ;RECORD THE STICKY FLAGS
MOVE T,STPVAL ;GET THE STEP VALUE
MOVEM T,STPCNT ;AND SET UP THE STEP COUNT
MOVE T,[PUSHJ P,STEP4] ;PREPARE TO SET UP THE TRACE FEATURE
MOVEM T,FDDT. ;LIKE-SO
HRRZ T,STARTU ;HAS A 'START' BEEN DONE
JUMPE T,START2 ;SIMULATE A START WITH TRACE ON
SKIPE T,JOBOPC ;WAS A RE-ENTER THE LAST ACTION
JRST CONT2 ;YES - PROCEED FROM THERE
JRST PROCED ; NO - DO A NORMAL CONTINUE
; THIS IS THE ENTRY POINT FOR TRACING EACH SOURCE LINE OR LABEL
STEP4: JSR SAVE ;SAVE THE USERS ACS
PUSHJ P,REMOVB ;AND REMOVE THE PAUSES
HRRZ T,AC17 ;GET THE FORTRAN PDL POINTER TO FIND THE PUSHJ
HRRZ T,(T) ;FIND WHERE WE ARE TRACING
SOJ T, ;P.C. = STOPS ONE ON
MOVEM T,BCOM ;SET UP FOR RE.BRK
SETZM SYM ;ACCEPT FIRST SYMBOL FOUND IN 'LOOK'UP
SETOM ESCAPE ;ALLOW ESCAPES
TRO F,SILENT ;RIG FOR SILENT RUNNING
TLO F,FGLSNM ;GLOBALS ARE OK
PUSHJ P,LOOK ;'LOOK'-UP THE INTERCEPT
JRST E7 ;JUST HAS TO BE THERE
JRST E7 ; AN OFFSET IS EVEN WORSE
PUSHJ P,STEP11 ;OPEN AND NAME SECTION IF NEW
TRNN F,TRLINE!TRLABL ;REQUESTED TO TRACE ENTRIES ONLY?
JRST STEP7 ;YES
STEP13: MOVEM W1,W2 ;SAVE THE NOW RECOGNISED SYMBOL(LINE)
MOVE T,TRUFST ;GET THE LAST CHARACTER OF THE LABEL
CAIN T,32 ;"P"?
TRNN F,TRLABL ;AND TRACING LABELS?
CAIA
JRST STEP5 ;YES - OK
TRNN F,TRLINE ;ARE WE TRACING LINES?
JRST STEP7 ;NO - IGNORE
; PREPARE TO TYPE NEXT LABEL OR LINE
STEP5: SOSG TABCNT ;COUNT UP TO 8 LABELS PER LINE
JRST [line
MOVEI T,10 ;SET FOR 8 LABELS/LINE
MOVEM T,TABCNT ;RECORD IN TABCNT
JRST .+1]
TAB
MOVE W1,W2 ;GET BACK THE NEW FOUND SOURCE LINE
PUSHJ P,SPT ;AND PROUDLY DISPLAY IT
SKIPL STPCNT ;SKIP IF AN INFINITE TRACE
JRST STEP6 ;OTHERWISE GO COUNT DOWN STPCNT
; HERE BEGINS THE EXIT
STEP7: PUSHJ P,LISTEN ;HAS THE USER HAD ENOUGH
CAIA ;NO
JRST STEP8 ;ENOUGH - ENOUGH
PUSHJ P,INSRTB ;REPLACE PAUSES
JSP T,RESTORE ;RESTORE FORTRAN ACS
POPJ P, ;RETURN THE WAY WE CAME IN
; TRACE COUNT EXHAUSTED?
STEP6: SOSE STPCNT ;DECREMENT THE STEP COUNT
JRST STEP7 ;MORE TO DO - SEE IF THE USER INTERCEPTS
; TRAP TO USER COMMAND LEVEL
STEP8: MOVEI T,[POPJ P,] ;MAKE SURE WE DO A POPJ RETURN
MOVEM T,LEAV ;PLACE IT IN THE LEAVE LOCATION
HRRM T,PROC0 ;TO MAKE SURE WE DO A POPJ RETURN TO FORTRAN
JRST RET ;NORMAL WORKING
; XCT REFFERENCE FOUND BUT NOT 'P' OR 'L'
STEP12: TRZN TF,GUDLBL ;DID WE FIND A GOOD NUMERIC LABEL?
JRST STEP7 ;NO - THEN IT MUST BE A SUBROUTINE
MOVE T,BCOM ;WHAT ARE WE 'LOOK'ING FOR
TRO F,SILENT ;SILENCE AGAIN
PUSHJ P,RELOOK ;REFFERENCE DID NOT POINT TO A KNOWN LINE#
JRST E7 ;CAN'T FIND A PROPPER REFFERENCE?
JRST E7 ;THERE REALLY SHOULD BE SOMETHING THERE
JRST STEP13 ;VALIDATE THIS ONE THEN
; ROUTINE TO TYPE OUT NEW SECTION NAME
STEP11: PUSHJ P,SAV2AC ;SAVES T & W1
PUSHJ P,OVRLAY ;LOOK FOR AND TELL WHERE & IF AN OVERLAY HAPPENED
MOVE T,PNAMSV ;WHAT WAS THE SECTION IN WHICH IT WAS FOUND
CAMN T,OPENED ;DO WE ALREADY NOW ABOUT IT
POPJ P, ;YES JUST EXIT - AND RESET T,W1
MOVEM T,SYM ;SET UP FOR SETNAM
PUSHJ P,SETNAM ;AND OPEN THIS SECTION FOR EFFICIENT SEARCHES
LINE
type([)
PUSHJ P,SPT1 ;DISPLAY THE SECTION NAME
type(])
tab
TRNN F,TRLINE!TRLABL ;ARE WE TRACING ENTRIES?
JRST STEP6 ;YES - COUNT THEM - RET: RESETS PDL
SETZM TABCNT ;PRODUCE A PRETTY PRINT OF 8 LABELS/LINE
POPJ P, ;RESET T,W1
; Q LOGIC
Q: LINE
JUMPL F,BADSYN ;MUST HAVE AN ARGUMENT
TRO TF,DCEVAL ;DON'T CALL EVAL
PUSHJ P,SYMIN ;GET A SYMBOL REFERENCE
TRZ F,ID ;SYMBOL FOUND FLAG
SKIPGE R,.JBSYM ;FIRST CHECK LOSEG TABLE
JRST QLIST1
QLIST0: PUSHJ P,GHSSYP ;NOW TRY HISEG TBL
JRST QLIST9 ;DONE
MOVE R,TT ;GET LIST
QLIST1: SETZM QLPNT ;ZERO FLAG SHOWING REFERENCE
QLIST2: PUSHJ P,FIXSYR ;UPDATE PTR
JUMPGE R,QLIST4 ;[104] GIVE UP IF OFF END OF TABLE
MOVE T,(R) ;PICK UP SYMBOL
JUMPE T,QLIST3
TLZN T,PNAME ;A PROGRAM NAME?
JRST QLIST6 ;YES
CAMN T,SYM ;NO, IS AN OCCURANCE FOUND?
HRRZM R,QLPNT ;YES, REMEMBER WHERE
QLIST3: ADD R,[XWD 2,2] ;POINT TO NEXT ENTRY
JUMPL R,QLIST2 ;AND GO IF MORE
QLIST4: TRNN R,1B18 ;[104] TABLE EXHAUSTED - LOSEG?
JRST QLIST0 ;YES - TRY HISEG
QLIST9: TRZE F,ID ;ANY FOUND
JRST RET ;DONE
JRST ERR6 ;NO - ERROR
QLIST6: SKIPN QLPNT ;FOUND THE SYMBOL?
JRST QLIST3 ;NO
TRO F,ID
PUSHJ P,SPT1 ;YES, PRINT THE PROGRAM NAME
MOVE T,@QLPNT ;GET THE SYMBOL BACK AND
TLNE T,GLOBAL ; TEST FOR A GLOBAL SYMBOL
JRST QLIST8 ; THIS IS A GLOBAL SYMBOL
QLIST7: TYPE( )
SETZM QLPNT ;RESET FLAG
JRST QLIST3 ; AND SEARCH THE NEXT SET OF SYMBOLS
QLIST8: type( )
openp
MOVE T,SYM ;PREPARE TO -
PUSHJ P,SPT1 ; PRINT THE SYMBOL
type( IS GLOBAL)
closep
JRST QLIST7 ;LOOK FOR MORE - SHOULD BE NONE
; MODE CHANGE LOGIC
MODE: JUMPL F,MODRET ;'MODE' ALONE - MEANS RESUME STANDARD SETTING
SETZI W1, ;NO - PREPARE FOR A MODE CHANGE
MODNXT: PUSHJ P,TTYIN ;GET AN ARGUMENT FROM USER
JUMPE T2,BADSYN
LDB T2,[POINT 6,T2,5] ;GET FIRST CHARACTER OF USERS ARGUMENT
CAIN T2,'F'
JRST [TRO W1,F.
JRST MODMOR]
CAIN T2,'D'
JRST [TRO W1,D.
JRST MODMOR]
CAIN T2,'I'
JRST [TRO W1,I.
JRST MODMOR]
CAIN T2,'O'
JRST [TRO W1,O.
JRST MODMOR]
CAIN T2,'R'
JRST [TRO W1,R.
JRST MODMOR]
CAIN T2,'C'
JRST [TRO W1,C.
JRST MODMOR]
CAIN T2,'L' ;[120]
JRST [TRO W1,L. ;[120]
JRST MODMOR] ;[120]
CAIE T2,'A'
JRST BADSYN
TRO W1,A.
MODMOR: SKIPL TERMK
JRST MODSET ;END OF USER LINE SET MODES
JUMPE T1,MODNXT ;SPACE IS A DELIMITER
CAIE T1,"," ;COMMA IS THE ONLY ARG SEPARATOR
JRST BADSYN
JRST MODNXT ;GET MORE ARGUMENTS
MODSET: MOVEM W1,MODFLG ;SAVE USERS DEFAULT TYPE OPTIONS
JRST RET ;END OF MODE CHANGE
SUBTTL SYMBOL TABLE LOGIC
; SYMBOL EVALUATION ROUTINE - EVALUATES THE SYMBOL IN SYM
EVAL: MOVEI R,SYM ;CHECK SYM
PUSHJ P,TRUVAR ;LABEL OR STATEMENT #?
TROA TF,SYMLAB ;YES
TRZ TF,SYMLAB
TRZE TF,FGLONL ;LOOKING FOR GLOBALS ONLY?
TRNE TF,SYMLAB ;AND THIS IS NOT A LABEL?
CAIA
JRST EVAL1 ;YES
TLO F,FLCLNM ; FIND LOCAL NAME
PUSHJ P,FNDSYM ;
CAIA
JRST EVAL2 ; FOUND
TRNE TF,SYMLAB ;IS IT A LABEL?
POPJ P, ;YES - FAIL
MOVSI R,LOCAL ;YES, LOOK FOR OUTSIDE LOCALS
EVAL0: TLO F,FGLSNM ;THROUGH THE WHOLE TABLE
MOVEM R,SYMASK ;
PUSHJ P,FNDSYM
POPJ P, ; FAIL
EVAL2: HRRZM R,SYMSAV ;ALWAYS SAVE POINTER
MOVE W1,R ;
MOVE W2,1(R)
SKIPA T,1(R) ;GET VALUE OF SYMBOL
CPOPJ2: AOS (P) ;SKIP TWICE
CPOPJ1: AOS (P) ;FOUND SYMBOL, SKIP
TLZ F,FGLSNM ;KILL FLAG
CPOPJ: POPJ P,
EVAL1: MOVSI R,GLOBAL!DELO ;[141] GLOBALS ONLY(ALSO DELETED GLOBALS)
JRST EVAL0 ;GO
; GHSSYP LOOKS TO SEE IF THERE IS A HISEG FOR THIS CORE IMAGE; IF
;SO, IT GETS THE POINTER TO THE HISEG SYMBOL TABLE IN T. THERE IS
;A SKIP RETURN ON SUCCESS.
;
; AC'S USED: R, T
GHSSYP: PUSH P,1 ;[142] SAVE FLAGS
PUSH P,0 ;[146] Save AC0
MOVEI 0,FO$HSP ;[146] Function code in AC0
XMOVEI 1,TT ;[146] Address in AC1
PUSHJ P,FOROP.## ;[143] GET HI-SEG SYMBOL TABLE POINTER
POP P,0 ;[146] Restore AC0
POP P,1 ;[142] RESTORE FLAGS
JUMPE TT,CPOPJ ;FAIL IF NO TBL
JRST CPOPJ1 ;OK
; GET HISEG START ADDRESS IN (R)
ife tops20,<
GSTAH: MOVE R,[XWD -1,.GTSGN]
GETTAB R, ; GET HISEG INDEX
HALT . ; *****
HRLZI R, (R) ; GET INDEX
HRRI R,.GTUPM
GETTAB R, ; GET HISEG START
HRLZI R,400000 ;PRE-507 MONITOR - FUDGE VALUE
HLRZ R,R
POPJ P,> ;End of conditional
ifn tops20,<
gstah: skipn r,.jbhso ;[123]get page of high segment
movei r,400 ;[123]not set, guess 400
lsh r,11 ;get address of high segment
popj p,> ;return,end of conditional
;THIS ROUTINE SETS UP IGNORE LISTS FOR SYMBOL TABLE LOOKUPS.
SETLST: MOVEI AR,0 ;COUNT
SKIPN R,.JBSYM ;LOSEG FIRST
CAIA
PUSHJ P,SETL ;SET UP THAT PART
PUSHJ P,GHSSYP ;NOW THE HISEG TABLE
POPJ P, ;NONE
SETL: MOVE W2,(R) ;GET NEXT ENTRY
TLNN W2,PNAME ;PRIG NAME?
JRST SETL1 ;YES
SETL0: ADD R,[2,,2] ;NO
JUMPL R,SETL ;CHECK NEXT
POPJ P, ;DONE
SETL1: CAME W2,[SQUOZE 0,UDDT] ;IGNORE THESE PROGRAMS
CAMN W2,[SQUOZE 0,FORDDT]
JRST SETL2
CAME W2,[SQUOZE 0,JOBDAT]
JRST SETL0 ;NO
SETL2: HLRE T2,1(R) ;GET THE -LENGTH
ADDI T2,2(R) ;BEG OF SYMBOLS FOR PROGRAM
HRRZM T2,SYMLST(AR) ;
HLRE T2,1(R)
MOVM T2,T2 ;GET LENGTH
HRLM T2,SYMLST(AR) ;SAVE THAT TOO
AOJA AR,SETL0 ;NEXT
;FIX (R) AS PTR TO SYMBOL TABLE.
FIXSYR: MOVEI W2,(R) ;GET ADDR POINTED TO
MOVEI TT,PSYLST-1 ;GET # OF IGNORED PROGRAMS
FIXS1: HRRZ T3,SYMLST(TT) ;NEXT LOCATION
CAIN T3,(W2) ;PART OF AN IGNORED PROG?
JRST FIXS2
SOJGE TT,FIXS1 ;NO - TRY NEXT
POPJ P, ;NONE - LET IT GO
FIXS2: HLRZ T3,SYMLST(TT) ;GET LENGTH OF IGNORED SYMBOLS
HLL T3,SYMLST(TT) ;LENGTH,,LENGTH
ADD R,T3 ;UPDATE PTR
POPJ P, ;DONE
SYMLST: BLOCK 5 ;# OF POSSIBLE PROGRAMS TO IGNORE (CONSERVATIVE)
PSYLST==.-SYMLST ;LENGTH
;FNDSYM: FIND A SYMBOL IN THE SYMBOL TABLE. ACCORDING TO THE FOLLOWING
;BITS: FPRNM - FIND PROGRAM NAME
; FLCLNM - FIND LOCAL NAME
; FGLSNM - FIND GLOBAL (ANYWHERE IN TABLE) (SYMASK CONTROLS
; THE TYPES OF SYMBOLS ALLOWED)
;
; THE SYMBOL (IN RADIX50) IS GIVEN IN SYM, AC R IS LEFT POINTING TO
;THE ENTRY THAT MATCHED.
FNDSYM: SETZI W1,
TLZN F,FPRNM ;LOOK FOR PROGRAM NAME?
JRST FNDS3 ;NO
MOVE R,.JBSYM ; CHECK LOSEG TABLE FIRST
MOVEM R,OJBSYM
PUSHJ P,FINDS ; TRY
CAIA ; NO GOOD
JRST CPOPJ1
PUSHJ P,GHSSYP ;GET HISEG SYM TBL PTR
POPJ P, ;FAIL
MOVEM TT,OJBSYM
JRST FINDS ;TRY
FNDS3: TLZN F,FLCLNM ;LOOKING FOR A LOCAL?
JRST FNDS5 ;NO
SKIPN R,OPENLS ; YES - GET PROG SYM LIST
POPJ P, ;NO PROGRAM OPENED, OR NO SYMS FOR PROG
FNDS4: MOVE W,(R) ;GET NEXT SYM
TLNN W,PNAME ;PROGRAM NAME?
JRST FNDS45 ;YES - IGNORE
TLZ W,LOCAL ;LOCALS ONLY
CAMN W,SYM ;FOUND?
JRST FNDS9 ;YES
FNDS45: ADD R,[XWD 2,2] ; NO, UPDATE PTR
JUMPL R,FNDS4
POPJ P, ;NOT FOUND
FNDS5: TLZN F,FGLSNM ;LOOKING FOR A GLOBAL?
JRST E9 ;ERROR - NO SPEC
MOVE R,.JBSYM
JUMPE R,FNDS6
PUSHJ P,FNDS7 ;LOOK FOR SYM IN LOSEG SYM TABLE
CAIA ;N.G.
JRST FNDS9 ;FOUND IT - SET T
FNDS6: PUSHJ P,GHSSYP ;GET HISEG SYM TABLE PTR
POPJ P, ;
JUMPE TT,CPOPJ ;
MOVE R,TT
FNDS7: PUSHJ P,FIXSYR ;FIX PTR IN (R)
JUMPGE R,FNDS13 ;[104] GET OUT IF OFF END OF TABLE
MOVE W,(R) ;GET NEXT SYM
TLNN W,PNAME ;PROGRAM NAME?
JRST FNDS8 ;YES - IGNORE
TDZ W,SYMASK ;CLEAR LEGAL BITS
CAMN W,SYM ;MATCH?
JRST FNDS11 ;YES
FNDS8: ADD R,[XWD 2,2]
JUMPL R,FNDS7 ;TRY NEXT
FNDS13: JUMPE W1,CPOPJ ;[104] FAIL IF NOTHING FOUND
SKIPA R,W1 ;USE LOC OF MATCH
FNDS10: SKIPA T,(R) ;GET VALUE (FOR FINDS)
FNDS9: MOVE T,1(R) ;GET VALUE OF SYMBOL
JRST CPOPJ1 ;SUCCESS
FNDS11: MOVE W,(R) ;GET SYMBOL
TLNE W,GLOBAL ;GLOBAL?
JRST FNDS9 ;YES - USE IT
JUMPN W1,FNDS12 ;MATCH ALREADY?
MOVE W1,R ;NO - MARK THIS ONE
JRST FNDS8 ;GO AHEAD
FNDS12: TRO F,MDLCLF ;MULT. DEF.
POPJ P, ;FAIL
; THIS ROUTINE SEARCHES THE SYMBOL TABLE IN A BACKWARDS DIRECTION
;LOOKING ONLY FOR PROGRAM NAMES.
FINDS: HLRE R,OJBSYM ; GET -# OF ENTRIES
JUMPE R,CPOPJ ;IGNORE IF TABLE EMPTY
MOVM R,R
ADD R,OJBSYM ;POINTER TO END OF TABLE
MOVEI R,-1(R)
FNDS1: MOVE W,-1(R) ;GET NEXT PROG NAME
CAMN W,SYM ;IS THIS IT?
JRST FNDS10 ;YES
HLRE W,(R) ; NO, GET LEN OF SYMBOLS
JUMPGE W,CPOPJ ;[102] IF TABLE ZEROED, GET OUT
ADD R,W ;POINT TO PREVIOUS PROG
HRRZ W,OJBSYM
CAILE W,(R) ;[107] DONE?
POPJ P, ;YES - NO FOUND
JRST FNDS1 ; NO - TRY NEXT
SUBTTL ENTER AND LEAVE FORDDT LOGIC
; SAVE THE ACS AND PI SYSTEM
SAVE: 0 ;SAVE THE ACS AND PI SYSTEM
SKIPN SARS
JRST SAV1
AOS SAVE
JRST SAV5
SAV1: MOVEM 17,AC17
HRRZI 17,SAVACS ;[147]
BLT 17,SAVACS+16 ;[147]
MOVE T, SAVE
HLLM T, SAVPI
SETPDL
SAV5: MOVE F,STKYFL ;INIT THE FLAG REGISTER
SETOM SARS ;FLAG PROTECTING SAVED REGISTERS
SETPDL
JRST @SAVE
; RESTORE ACS AND PI SYSTEM
RESTOR: HRRM T,SAVE
MOVE T,SAVPI
TLZ T,010037 ;DON'T TRY TO RESTORE USER MODE FLAG
HLLM T, SAVE
HRLZI 17,SAVACS ;[147]
BLT 17,17
SETZM SARS
JRST 2,@SAVE
; PAUSE LOGIC
BP0: 0 ;[145] USERS PC FROM FAKED JSR
JSA T,BCOM ;[145] SAVE T AND GO TO BCOM
TRN ;[145] BREAKPOINT INSTRUCTION
BP1: XLIST ;TABLE FOR ENTRY FROM BREAKPOINTS
REPEAT NBP,< 0 ;JSR TO HERE FOR A PAUSE
JSA T, BCOM
0 ;HOLDS INSTRUCTION WHILE PAUSE IS IN PLACE>
LIST
B1INS=BP1+2
BPN=.-3
; CONDITIONAL LOGIC
TESTAB: XLIST
REPEAT NBP,< 0 ;NUMBER OF TEST
0 ;ADDRESS OF ARG1
0 ;ADDRESS OF ARG2
0 ;CONSTANT VALUE>
LIST
COMPAR: CAML T2,T3
CAMLE T2,T3
CAME T2,T3
CAMN T2,T3
CAMG T2,T3
CAMGE T2,T3
COND: 0
JSR CONSAV ;SAVE RELEVANT REGS
AOS COND ;PREPARE FOR SKIP RETURNS
HRRZ T,BCOM3
SUBI T,B1ADR+1
IDIVI T,3
LSH T,2
MOVE T1,TESTAB(T)
MOVE T2,@TESTAB+1(T)
MOVE T3,@TESTAB+2(T)
XCT COMPAR(T1)
AOS COND
JSR CONSAV ;REINSTATE USERS ACS
JRST @COND
CONSAV: 0
EXCH T,CONSV0
EXCH T1,CONSV1
EXCH T2,CONSV2
EXCH T3,CONSV3
JRST @CONSAV
CONSV0: Z
CONSV1: Z
CONSV2: Z
CONSV3: Z
BCOM: 0
POP T,LEAV ;MOVE INSTRUCTION TO LEAV
MOVEI T,B1SKP-B1INS+1(T)
HRRM T,BCOM3 ;CONDITIONAL BREAK SETUP
MOVEI T,B1CNT-B1SKP(T)
HRRM T,BCOM2 ;PROCEDE COUNTER SETUP
MOVE T,BP1-B1CNT(T) ;GET PC WORD
HLLM T,LEAV1 ;SAVE FLAGS FOR RESTORING
EXCH T,BCOM ; ALSO SAVE PC WORD IN BCOM
BCOM3: SKIPE B1SKP ;ADDR MOD TO LOOK AT COND. INST.
XCT @.-1
BCOM2: SOSG B1CNT ;ADDR MOD TO LOOK AT PROCEED COUNTER
JRST BREAK
MOVEM T,SAVACS+T ;[147]
HRRZ T,BCOM3 ;ADDRESS OF CONDITIONAL
HLRZ T,-1(T) ;SEE IF A 'TYPING' REQUESTED
JUMPN T,BCOM1 ;'TYPING' REQUESTED
LDB T,[POINT 9,LEAV,8] ;GET INSTRUCTION
CAIL T,264 ;JSR
CAILE T,266 ;JSA,JSP
TRNN T,700 ;UUO
JRST PROC1 ;MUST BE INTERPRETED
CAIE T,260 ;PUSHJ
CAIN T,256 ;XCT
JRST PROC1 ;MUST BE INTERPRETED
MOVE T,SAVACS+T ;[147]
JRST 2,@LEAV1 ;RESTORE FLAGS, GO TO LEAV
LEAV1: XWD 0,LEAV
BCOM1: MOVE T,SAVACS+T ;[147] RESTORE T
JSR SAVE ;SAVE ACS
PUSHJ P,LISTEN ;DID THE DOOR BELL RING?
JRST BREAK3 ;NO - THIS IS NOT A TRUE BREAK
CAIA ;YES - LETS STOP HERE
BREAK: JSR SAVE ;SAVE THE WORLD
TLO F,AUTO ;SIGNAL THAT THIS WAS A TRUE BREAK
BREAK3: PUSHJ P,REMOVB ;REMOVE BREAKPOINTS
SETZM MATHSM ;CLEAR SPECIFIC SYMBOL LOOKUP FLAG
SETOM ESCAPE ;USER ENVIRONMENT PROTECTED ALLOW ESCAPES
PUSHJ P,TTYCLR ;FLUSH WAITING TTY CHARACTERS FOR INPUT
PUSHJ P,FORBUF ;[145] LET FOROTS CLEAR ITS BUFFER
SOS T,BCOM3
HRRZS T ;GET ADR OF CONDITIONAL BREAK INST
SUBI T,B1ADR-3 ;CHANGE TO ADDRESS OF $0B
IDIVI T,3 ;QUOTIENT IS BREAK POINT NUMBER
HRRM T,BREAK2 ;SAVE BREAK POINT #
;NOW DISPLAY BREAK INFORMATION
SETZI TF, ;
LINE
SKIPL BP0FLG ;[145] SKIP IF FORDDT WAS 'CALL'ED
JRST [TYPE (Pause at ) ;[145] ANNOUNCE BREAKPOINT
JRST BRKAT] ;[145] PROCEED
TYPE (Entering FORDDT from ) ;[145] SAY WHERE 'CALL'ED FROM
BRKAT: MOVE T,BCOM ;[145]
HLLM T, SAVPI ;SAVE PROCESSOR FLAGS
MOVEI T,-1(T)
ANDI T,-1 ;ADDRESS PORTION ONLY THANK YOU
TRO F,SILENT ;SILENCE
TLO F,FGLSNM ;GLOBALS ARE OK
PUSHJ P,LOOK ;TYPE PC AT BREAK
JRST BP0E2 ;[145] NO NAME, PROBABLY ERROR
CAIA ;[145] OFFSET
JRST BPOK ;[145] FOUND AND TYPED
SKIPL BP0FLG ;[145] ERROR IF NOT FROM BREAKPOINT 0
JRST E2 ;[145]
MOVEM T,TEM ;[145] REMEMBER NEAREST REFERENCE
PUSHJ P,SPT ;[145] TYPE SYMBOL
TYPE ( + ) ;[145]
MOVE T,TEM ;[145] TYPE OFFSET
PUSHJ P,TYP4 ;[145] IN OCTAL
JRST BPSEC ;[145]
BPOK: MOVE T,(R) ;[145] GET SYMBOL
TLNE T,GLOBAL ;GLOBAL?
JRST BREAK6 ;YES - THIS IMPLIES A ROUTINE
PUSHJ P,SPT1 ;NO, SO PRINT IT
BPSEC: TYPE( in ) ;[145]
MOVE T,PNAMSV ;GET NAME OF SYMBOL'S SECTION
MOVEM T,SYM ;SAVE IT
PUSHJ P,SPT1 ;AND TYPE IT
MOVE T,PNAMSV
CAME T,OPENED ;THIS PROGRAM OPENED?
JRST BREAK7 ;NO - DO IT
SKIPGE BP0FLG ;[145] IF FROM BREAKPOINT 0,
JRST BP0RET ;[145] DONE
BREAK4: LINE
HRRZ T,@BCOM3
HRRM T,PROC0 ;SETUP ADDRESS OF BREAK
HLRZ T,@BCOM3
JUMPE T,BREAK1 ;TEST FOR REGISTER TO EXAMINE
MOVE TMOD,MODFLG ;REMEMBER TO SET UP THE PRINT FLAGS
TLO F,GRPFL!CFLIU!OFCFL ;WE WANT TO ALLOW GROUP LOGIC HERE
SETZM TERMK
PUSHJ P,SYM5 ;DISPLAY USERS GROUP IN 'TYPING' REQUEST
PUSHJ P,REINOP ;RE-OPEN PROG
TLZ F,GRPFL!CFLIU!OFCFL ;REMOVE FLAG, IT MAY CAUSE TROUBLE
BREAK1: MOVSI S,400000
BREAK2: ROT S,.-. ;ROT BY # OF BREAK POINT
TLZE F,AUTO ;DO WE HAVE A TRUE BREAK CONDITION?
ANDCAM S,AUTOPI ;YES - END OF 'TYPING' LOGIC
TDNN S,AUTOPI ;DONT PROCEED IF NOT AUTOMATIC
JRST RET ;DONT PROCEED
JRST PROCD1
BP0E2: SKIPN BP0FLG ;[145] IN BREAKPOINT 0?
JRST E2 ;[145] NO, ERROR
MOVEI T,@BCOM ;[145] TYPE IT IN OCTAL
SUBI T1,1 ;[145]
PUSHJ P,TYP4 ;[145]
BP0RET: LINE ;[145]
MOVNS BP0FLG ;[145] MAKE IT POSITIVE NOW
JRST RET ;[145] INITIALIZE SOME FLAGS ETC.
BREAK6: MOVEM R,SAVLOC ;NAME OR ROUTINE
TYPE (routine )
PUSHJ P,SPT ;TYPE ROUTINE NAME
PUSHJ P,GETARG ;DISPLAY ANY ARGS
SKIPGE BP0FLG ;[145] DONE IF FROM BREAKPOINT 0
JRST BP0RET ;[145]
MOVE T,PNAMSV ;GET PROGRAM NAME
BREAK7: MOVEM T,SYM ;SAVE IT
PUSHJ P,IMPOPN ;AND OPEN IT
SKIPGE BP0FLG ;[145] IF FROM BREAKPOINT 0,
JRST BP0RET ;[145] DONE
JRST BREAK4
PROCED: MOVEI T,1 ;SET UP FOR PROCEDE OF 1
SKIPG @BCOM2 ;DO NOT CHANGE VALUE IF ALREADY SET
PROCDX: MOVEM T,@BCOM2 ;STORE IN B#CNT
HRRZ R,BCOM3
SETZM TEM ;DO NOT RE-INSERT 'CONDITIONAL' INFO.
HLRZ S,(R)
JUMPE S,.+2 ;SET THE AUTO PROCEDE FLAG
TLO F,AUTO ;IF THIS IS A 'TYPING' REQUEST
PUSHJ P,AUTOP
PROCD1: LINE
PROC0: HRRZI R,[JRST RET] ;MODIFIED TO ADDR OF BREAKPOINT
SKIPE BP0FLG ;[145] PHANTOM BREAKPOINT?
JRST PROC00 ;[145] YES, DON'T WORRY ABOUT LEAV INSTRUCTION
;[145] EXCEPT THAT PROC0 MAY BE MODIFIED
PUSHJ P,FETCH
JRST BPLUP1 ; GET HERE ONLY IF MEMORY SHRANK
MOVEM T,LEAV
PROC00: CLEARM BP0FLG ;[145] WON'T NEED THIS ANYMORE
PUSHJ P,INSRTB
JRST PROC2
PROC1: MOVE T,SAVACS+T ;[147]
JSR SAVE
JFCL
MOVE T,BCOM ;STORE FLAGS WHERE "RESTORE"
HLLM T,SAVPI ; CAN FIND THEM
PROC2: MOVEI W,100
MOVEM W,TEM1 ;SETUP MAX LOOP COUNT
JRST IXCT5
IXCT4: SUBI T,041 ;IS UUO "INIT"?
JUMPE T,BPLUP
AOJGE T,IXCT6 ;DONT PROCEDE FOR INIT
;DONT INTERPRET FOR SYSTEM UUOS
MOVEM R,40 ;INTERPRET FOR NON-SYSTEM UUOS
MOVEI R,41
IXCT: SOSL TEM1
PUSHJ P,FETCH
JRST BPLUP ;BREAKPOINT LOOPING OR FETCH FAILED
MOVEM T,LEAV
IXCT5:; SETZM ESCAPE ;NO ESCAPES FROM FORDDT
LDB T,[POINT 9,LEAV,8] ;GET INSTRUCTION
CAIN T,254 ;DON'T DO ANYTHING TO JRST
JRST IXCT6
HRLZI 17,SAVACS ;[147]
BLT 17,17
MOVEI T,@LEAV
DPB T,[POINT 23,LEAV,35] ;STORE EFFECTIVE ADDRESS
LDB W1,[POINT 4,LEAV,12] ;PICK UP AC FIELD
LDB T,[POINT 9,LEAV,8] ;PICK UP INSTRUCTION FIELD
SETPDL
CAIN T,260
JRST IPUSHJ ;INTERPRET PUSHJ
CAIN T,264
JRST IJSR ;INTERPRET JSR
CAIN T,265
JRST IJSP ;INTERPRET JSP
CAIN T,266
JRST IJSA ;INTERPRET JSA
MOVE R,LEAV
TRNN T,700
JRST IXCT4 ;INTERPRET UUO
CAIN T,256
JRST IXCT ;INTERPRET XCT
IXCT6: JSP T,RESTORE
LEAV: 0 ;INSTRUCTION MODIFIED
JRST @BCOM
AOS BCOM
JRST @BCOM
BPLUP: PUSHJ P,REMOVB ;BREAKPOINT PROCEED ERROR
BPLUP1: JSR SAVE
JFCL
JRST ERR18
IPUSHJ: DPB W1,[POINT 4,CPUSHP,12] ;STORE AC FIELD INTO A PUSH
HLL T,SAVPI ;PICK UP FLAGS
HLLM T,BCOM ;SET UP THE OLD PC WORD
MOVSI T,(1B4) ;TURN OFF BIS FLAG IN NEW PC WORD
ANDCAM T,SAVPI
JSP T,RESTORE ;RESTORE THE MACHINE STATE
CPUSHP: PUSH .-.,BCOM ;GETS MODIFIED IN AC FIELD
JRST @LEAV ;JUMP TO "E" OF THE PUSHJ
IJSA: MOVE T,BCOM ;INTERPRET JSA
HRL T,LEAV
EXCH T,SAVACS(W1) ;[147]
JRST IJSR2
IJSR: MOVE T,BCOM ;INTERPRET JSR
HLL T,SAVPI ;SET UP THE OLD PC WORD
MOVSI W,(1B4) ;TURN OFF BIS IN NEW PC WORD
ANDCAM W,SAVPI
IJSR2: MOVE R,LEAV
PUSHJ P,DEPMEM
JRST BPLUP ;ERROR, CAN'T STORE
AOSA T,LEAV
IJSR3: MOVE T,LEAV
JRST RESTORE
IJSP: MOVE W,BCOM ;INTERPRET JSP
HLL W,SAVPI ;PICK UP PC WORD FLAGS
MOVEM W,SAVACS(W1) ;[147] INSERT OLD PC WORD INTO AC
MOVSI T,(1B4) ;TURN OFF BIS FLAG IN NEW PC WORD
ANDCAM T,SAVPI
JRST IJSR3
; INSERT PAUSES REQUESTS
INSRTB: MOVE S,[JSR BP1]
INSRT1: SKIPE R,B1ADR-BP1(S)
PUSHJ P,FETCH
JRST INSRT3
MOVEM T,B1INS-BP1(S)
MOVE T,S
PUSHJ P,DEPMEM
JFCL ;HERE ONLY IF CAN'T WRITE IN HIGH SEG
INSRT3: ADDI S,3
CAMG S,[JSR BPN]
JRST INSRT1
POPJ P,
;REMOVE PAUSE REQUESTS
REMOVB: MOVEI S,BNADR
REMOV1: MOVE T,B1INS-B1ADR(S)
SKIPE R,(S)
PUSHJ P,DEPMEM
JFCL ;HERE ONLY IF NO WRITE IN HIGH SEG
SUBI S,3
CAIL S,B1ADR
JRST REMOV1
POPJ P, ;
; HERE TO SET PAUSE BREAKS
BPS: MOVE T,[XWD B1ADR,B1ADR+1] ; CLEAR ALL PAUSES
CLEARM B1ADR
BLT T,AUTOPI ;CLEAR OUT ALL PAUSES AND AUTO PROCEDE REGESTER
JRST RET
BPS1: MOVE R,T
PUSHJ P,FETCH ;CAN PAUSE BE INSERTED HERE?
JRST ERR19 ;NO
PUSHJ P,DMEMER ; AGAIN NO
MOVE T,R ;PUT THE PAUSE ADR BACK IN T
SETZM SAVLOC ;STORES AVAILABLE PAUSE SLOT
MOVEI R,B1ADR ;START OF PAUSE ARGUMENTS
BPS4: HRRZ W,(R) ;GET ADDRESS OF PAUSE IF ALREADY SET
CAIN W,(T) ;SEE IF ALREADY SET
JRST BPS5 ;YES - USE THIS
SKIPN (R) ;IS IT FREE?
HRRM R,SAVLOC ;YES - REMEMBER WHERE
ADDI R,3 ;LOOK AT NEXT
CAIG R,BNADR ;ALL EXAMINED?
JRST BPS4 ;NO GO ON IN CASE THIS ADDRESS USED ALREADY
SKIPN R,SAVLOC ;WHERE THERE ANY FREE?
JRST ERR9 ;NO - UNLUCKY USER
BPS5: MOVEM T,(R) ;SET UP PAUSE ADDRESS
MOVE T,TEM ;GET CONDITIONAL IF ANY L.H. = WHAT TO TYPE
MOVEM T,1(R)
MOVE T,TEM1 ;GET THE PROCEDE COUNT
MOVEM T,2(R) ;PLACE WHERE IT DOES THE MOST GOOD
AUTOP: SUBI R,B1ADR ;AUTO PROCEDE SETUP SUBROUTINE
IDIVI R,3
MOVEI S,1
LSH S,(R)
ANDCAM S,AUTOPI
TLNE F,AUTO ;DID USER ASK FOR AUTO PROCEDE?
IORM S,AUTOPI ;YES - LET HIM HAVE IT
HRRZ T,TEM ;DID USER ASK FOR A CONDITIONAL
JUMPE T,CPOPJ ;NO - ALL DONE
LSH R,2 ;FORM INDEX TO TEST TABLES
ADDI R,TESTAB
MOVE T,COND0
MOVEM T,(R) ;SAVE TEST NO.
MOVE T,COND1
CAIN T,COND3 ;SHOULD THIS BE A CONSTANT
MOVEI T,3(R) ;YES CORRECT IT
MOVEM T,1(R) ;SAVE ADDRESS OF FIRST ARG
MOVE T,COND2
CAIN T,COND3
MOVEI T,3(R) ;SAVE ADDRESS OF SECOND ARG
MOVEM T,2(R) ;SAVE ADDRESS OF SECOND ARG
MOVE T,COND3 ;GET CONSTANT IF ANY
MOVEM T,3(R) ;AND SAVE
POPJ P,
SUBTTL MEMORY MANAGER SUBROUTINES
;DEPOSIT INTO MEMORY SUBROUTINE
DEPMEM: EXCH R,T ;CHECK (T)
PUSHJ P,CHKADR ;LEGAL ADDRESS?
POPJ P, ;NO - ILLEGAL
JRST DEP4 ;YES BUT IN HI SEGMENT
EXCH R,T
TRNN R,777760
JRST DEPAC ;DEPOSIT IN AC
MOVEM T,(R)
JRST CPOPJ1 ;SKIP RETURN
DEPAC: MOVEM T,SAVACS(R) ;[147] DEPOSIT IN AC
JRST CPOPJ1 ;SKIP RETURN
ife tops20,<
DEP4: EXCH R,T
MOVEI TT1,0
SETUWP TT1, ;IS HI SEGMENT PROTECTED? TURN OFF
POPJ P, ;PROTECTED, NO SKIP RETURN
MOVEM T,(R) ;STORE WORD IN HI SEGMENT
TRNE TT1,1 ;WAS WRITE PROTECT ON?
SETUWP TT1, ;YES, TURN IT BACK ON
JFCL
JRST CPOPJ1> ;skip return, end of conditional
ifn tops20,<
dep4: exch r,t ;restore r and t
push p,tf ;save regs for JSYS
push p,r
lsh r,-11 ;form page number from address
hrrzi tf,(r) ;put into AC1
hrli tf,400000 ;get process handle into left half
push p,tf ;save this argument, just in case!
rpacs% ;get access bits into AC2
tlne tf,(pa%wt) ;can we write to this page?
jrst dep5 ;yes, go do it
move tf,(p) ;no, get saved argument
and r,[pa%wt!pa%rd!pa%cpy!pa%ex]
;clear unneeded bits
tlo r,(pa%cpy) ;get cw access for page
spacs%
hrroi tf,[asciz/
%FDTWSP Writing to shared page
/] ;prepare to warn him once
aosn pagwrn ;skip if he has already been warned
psout% ;send warning
dep5: pop p,r ;flush extra stack level
pop p,r ;restore r
pop p,tf ;restore flags
movem t,(r) ;save away t
jrst cpopj1> ;skip return,end of conditional
DMEMER: PUSHJ P,DEPMEM ;DEPOSIT AND GO TO ERR IF IT FAILS
JRST ERR19
POPJ P,
FETCH: EXCH R,T ;CHECK (T)
PUSHJ P,CHKADR ;LEGAL ADDRESS?
POPJ P, ;NO
JFCL ;HIGH OR LOW OK FOR FETCH
EXCH R,T
TRNN R,777760 ;ACCUMULATOR?
SKIPA T,SAVACS(R) ;[147] YES
MOVE T,(R) ;NO
JRST CPOPJ1 ;SKIP RETURN ONLY FOR LEGAL ADDRESS
SUBTTL BINARY TO SYMBOLIC CONVERSION
; PUSHJ P,LOOK ;AC T CONTAINS BINARY TO BE INTERPRETED
; RETURN 1 ;NOTHING AT ALL FOUND THAT'S USEFUL
; RETURN 2 ;SOMETHING FOUND, BUT NO EXACT MATCH
; ; OR MULTIPLY DEFINED IF OFFSET = 0 IN T
; RETURN 3 ;EXACT MATCH FOUND AND PRINTED IF R=0
; ;R=SYMBOL VALUE IF SILENT FLAG ON
; ;T = SYMBOL VALUE BEING 'LOOKED' UP
; ;W1 = ADDRESS OF BEST SYMBOL SO FAR
; ;TRULST=LAST CHARACTER IF LABEL FOUND
LOOK: SETZM PNAMSV ;RESET PROGRAM NAME OF SYMBOL
TRZ F,MDLCLF!PNAMEF!ID ;CLEAR FLAGS
MOVEI R,377777
TRNE F,NEARST ;
MOVNI R,377777
MOVEM R,BESTVA ;SETUP FALSE OFFSET
PUSHJ P,LOKSYM ;CHECK IT
LOOK0: POPJ P, ;NOTHING FOUND
JRST LOOK4 ;MULT. DEF. OR OFFSET
MOVE R,W1 ;PTR TO SYMBOL
MOVEM R,LASYM ;SAVE THIS SYMBOL
MOVE W2,1(R) ;GET VALUE
MOVEM W2,LASVAL ;SAVE
TRZN F,SILENT ;FOUND - SILENCE?
PUSHJ P,SPT ;NO - TYPE SYMBOL
PUSHJ P,LOOKPG ;LOOKUP FOR PROGRAM NAME
JRST CPOPJ2 ;DOUBLE SKIP - SUCCESS
LOOK4: JUMPE T,CPOPJ1 ;MULT DEF
MOVEM R,LASYM ;UPDATE LAST SYMBOL
MOVE W2,1(R) ;GET VALUE
ADDI W2,(T) ;WITH OFFSET
MOVEM W2,LASVAL ;AS LAST VALUE
PUSHJ P,LOOKPG ;GET PROGRAM NAME
JRST CPOPJ1 ;2ND SKIP
RELOOK: MOVE R,W1 ;RESET (R)
PUSH P,[LOOK0] ;RETURN
TRZ F,ID ;ALLOW LOKSYM TO FIND IT
JRST LOK3 ;HERE WE GO AGAIN
;ROUTINE TO LOOKUP FOR PROGRAM NAME
LOOKPG:
PUSH P,R ; SAVE R
LOOK2: ADD R,[2,,2]
JUMPGE R,LOOK3 ;END OF TABLE
MOVE W2,(R) ;GET NEXT ENTRY
TLNE W2,PNAME ;PROGRAM NAME?
JRST LOOK2 ;NO
MOVEM W2,PNAMSV ;YES - SAVE IT
LOOK3: POP P,R ;RESTORE R
POPJ P, ;END ROUTINE
;THIS ROUTINE SEARCHES THE SYMBOL TABLE SPECIFIED BY FLAG FGLSNM FOR
;THE VALUE SUPPLIED IN AC T. THERE IS A FAIL RETURN FOR SYMBOL NOT
;FOUND OR MULT. DEF. LOCAL.
LOKSYM: SETZB W1,TEM3
MOVEM T,TEM8 ;STORE VALUE
MOVE R,.JBSYM ;USE LOSEG TBL
PUSHJ P,LOK2 ;
JRST LOK1 ;NOT FOUND
CAIA ;OFFSET OR MULT DEF.
JRST CPOPJ2 ;FOUND
TRNE F,MDLCLF ;MULT. DEF.?
JRST CPOPJ1 ;FAIL - 2ND SKIP
MOVEM T,TEM3 ;OFFSET - SAVE IT
MOVEM W1,TEM4 ;SAVE PTR
LOK1: PUSHJ P,GHSSYP ;GET HISEG SYM TBL PTR
JRST [SKIPN TEM3 ;OFFSET FOUND?
JRST CPOPJ ;NO - FAIL
JRST LOK15] ;YES - USE IT
MOVE T,TEM8 ;RESTORE VALUE
MOVEI R,(TT) ;
PUSHJ P,LOK2
JRST CPOPJ ;NOTHING FOUND
CAIA
JRST CPOPJ2 ;EXACT MATCH
JUMPE T,CPOPJ1 ;2ND SKIP ON MULT DEF
TRNN F,NEARST ;LOOKING FOR THE NEAREST ABOVE?
JRST LOK13 ;NO
CAML T,TEM3 ;YES - NEW VALUE CLOSER?
JRST CPOPJ1 ;YES
JRST LOK15 ;NO - USE THE OLD VALUE
LOK13: SKIPE TEM3 ;OFFSET FOUND FOR LOSEG TBL?
CAMG T,TEM3 ;YES - A BETTER ONE?
JRST CPOPJ1 ;NO
LOK15: MOVE T,TEM3 ;YES - UPDATE VALUES
MOVE W1,TEM4
MOVE R,TEM4
JRST CPOPJ1 ;2ND SKIP
LOK2: PUSHJ P,FIXSYR ;FIX SYM TBL PTR IN (R)
JUMPGE R,LOK16 ;[104] IF OFF END OF TABLE, GET OUT
MOVE W2,(R) ;GET NEXT SYM
TLNN W2,PNAME ;IGNORE PROG NAMES
JRST LOK3
TLNE W2,GLOBAL ;GLOBAL?
TLNE F,FGLSNM ;GLOBALS OK?
TLZA W2,LOCAL!GLOBAL ;YES - ZERO BITS
JRST LOK3 ;NO - PASS IT
TLNE W2,PNAME ;SHOULD BE CLEAR NOW
JRST LOK3
MOVE W2,1(R) ;OK - GET VALUE
MOVE TT,T ;[135] VALUE WE'RE LOOKING FOR
;IN ORDER TO PREVENT FORDDT FROM GETTING A FIXED-POINT OVERFLOW
;HERE, WE DO THE SIGN-BIT MAGIC TRICK. IF THE SIGNS OF THE 2 VALUES
;ARE DIFFERENT, WE JUST FLIP THE SIGN BIT OF ONE OF THEM, DO THE
;SUBTRACT, AND FLIP IT AGAIN. WE DON'T CARE ABOUT THE OVERFLOW
;CONDITION, SO IT IS JUST LOST TO POSTERITY.
;THIS PATCH COMPLIMENTS OF PHIL ALMQUIST, CARNEGIE-MELLON UNIV.
XOR T,W2 ;SAME AS SIGN FOR SYMBOL?
JUMPGE T,LOKSSN ;YES. EASY CASE
TXC TT,1B0 ;NO. MAKE SIGNS THE SAME
SUB TT,W2 ;SUBTRACT IS SAFE NOW
TXCA TT,1B0 ;FIX UP SIGN AGAIN
LOKSSN: SUB TT,W2 ;[135] GET OFFSET
XOR T,W2 ;EITHER WAY, RESTORE T
JUMPL TT,LOK6 ;IGNORE IF WRONG DIRECTION
JUMP