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