2 SUBTTL RPG/CMF/JF/PMH/DMN 7-SEPT-71
\r
3 ;COPYRIGHT 1968,1969,1970,1971, DIGITAL EQUIPMENT CORP., MAYNARD, MASS.
\r
12 ASSEMBLY FEATURE SWITCHES (ACTION WHEN NON-ZERO)
\r
14 SWITCHES ON (NON-ZERO) IN DEC VERSION
\r
15 PURESW GIVES VARIABLES IN LOW SEGMENT
\r
16 CCLSW GIVES RAPID PROGRAM GENERATION FEATURE
\r
17 FTDISK GIVES DISK FEATURES
\r
18 RUNSW USE RUN UUO FOR "DEV:NAME!"
\r
19 TEMP TMPCOR UUO IS TO BE USED
\r
20 RENTSW ASSEMBLE REENTERANT PROGRAMS
\r
23 \fSUBTTL DEFAULT ASSEMBLY SWITCH SETTINGS
\r
25 IFNDEF PURESW,<PURESW==1>
\r
27 IFNDEF RUNSW,<RUNSW==1>
\r
29 IFNDEF RENTSW,<RENTSW==1>
\r
31 IFNDEF CCLSW,<CCLSW==1>
\r
32 IFN CCLSW,<FTDISK==1>
\r
34 IFNDEF TEMP,<TEMP==1>
\r
36 IFNDEF FTDISK,<FTDISK==0>
\r
38 \fSUBTTL OTHER PARAMETERS
\r
40 .PDP== ^D40 ;BASIC PUSH-DOWN POINTER
\r
41 IFNDEF LPTWID,<LPTWID==^D132> ;DEFAULT WIDTH OF PRINTER
\r
42 .LPTWD==8*<LPTWID/8> ;USEFUL WIDTH IN MAIN LISTING
\r
43 .CPL== .LPTWD-^D40 ;WIDTH AVAIABLE FOR TEXT WHEN
\r
44 ;BINARY IS IN HALFWORD FORMAT
\r
45 .LPP==^D55 ;LINES/PAGE
\r
46 .STP== ^D40 ;STOW SIZE
\r
47 .TBUF== ^D80 ;TITLE BUFFER
\r
48 .SBUF== ^D80 ;SUB-TITLE BUFFER
\r
49 .IFBLK==^D5 ;IFIDN COMPARISON BLOCK SIZE
\r
51 .LEAF==4 ;SIZE OF BLOCKS IN MACRO TREE
\r
53 NCOLS==LPTWID/^D40 ;NUMBER OF COLUMNS IN SYMBOL TABLE
\r
54 IFN CCLSW,<IFNDEF CTLSIZ,<CTLSIZ==^D79>>
\r
55 IFNDEF NUMBUF,<NUMBUF==2 ;NUMBER OF INPUT BUFFERS>
\r
57 EXTERN JOBREL,JOBSYM,JOBDDT,JOBFF,JOBAPR,JOBSA
\r
58 IFN CCLSW,< EXTERN JOBERR>
\r
60 IFN PURESW,< HISEG >
\r
62 ;SOME ASCII CHARACTERS
\r
74 SDEL= 3 ;SEARCH INCREMENT
\r
75 SX= SDEL+1 ;SEARCH INDEX
\r
78 C= 7 ;CURRENT CHARACTER
\r
79 CS= C+1 ;CHARACTER STATUS BITS
\r
80 RC= 11 ;RELOCATION BITS
\r
81 MWP= 12 ;MACRO WRITE POINTER
\r
82 MRP= 13 ;MACRO READ POINTER
\r
83 IO= 14 ;IO REGISTER (LEFT)
\r
84 ER== IO ;ERROR REGISTER (RIGHT)
\r
85 FR= 15 ;FLAG REGISTER (LEFT)
\r
86 RX== FR ;CURRENT RADIX (RIGHT)
\r
87 MP= 16 ;MACRO PUSHDOWN POINTER
\r
88 PP= 17 ;BASIC PUSHDOWN POINTER
\r
96 OPDEF RESET [CALLI 0]
\r
97 OPDEF SETDDT [CALLI 2]
\r
98 OPDEF DDTOUT [CALLI 3]
\r
99 OPDEF DEVCHR [CALLI 4]
\r
100 OPDEF CORE [CALLI 11]
\r
101 OPDEF EXIT [CALLI 12]
\r
102 OPDEF UTPCLR [CALLI 13]
\r
103 OPDEF DATE [CALLI 14]
\r
104 OPDEF APRENB [CALLI 16]
\r
105 OPDEF MSTIME [CALLI 23]
\r
106 OPDEF PJOB [CALLI 30]
\r
107 OPDEF RUN [CALLI 35]
\r
108 OPDEF TMPCOR [CALLI 44]
\r
109 OPDEF MTWAT. [MTAPE 0]
\r
110 OPDEF MTREW. [MTAPE 1]
\r
111 OPDEF MTEOT. [MTAPE 10]
\r
112 OPDEF MTSKF. [MTAPE 16]
\r
113 OPDEF MTBSF. [MTAPE 17]
\r
115 \f ;FR FLAG REGISTER (FR/RX)
\r
116 IOSCR== 000001 ;NO CR AFTER LINE
\r
117 MTAPSW==000004 ;MAG TAPE
\r
118 ERRQSW==000010 ;IGNORE Q ERRORS
\r
119 LOADSW==000020 ;END OF PASS1 & NO EOF YET
\r
120 DCFSW== 000040 ;DECIMAL FRACTION
\r
121 RIM1SW==000100 ;RIM10 MODE
\r
122 NEGSW== 000200 ;NEGATIVE ATOM
\r
123 RIMSW== 000400 ;RIM OUTPUT
\r
124 PNCHSW==001000 ;RIM/BIN OUTPUT WANTED
\r
126 R1BSW== 004000 ;RIM10 BINARY OUTPUT
\r
127 TMPSW== 010000 ;EVALUATE CURRENT ATOM
\r
128 INDSW== 020000 ;INDIRECT ADDRESSING WANTED
\r
129 RADXSW==040000 ;RADIX ERROR SWITCH
\r
130 FSNSW== 100000 ;NON BLANK FIELD SEEN
\r
131 MWLFLG==200000 ;ON FOR DON'T ALLOW MULTI-WORD LITERALS
\r
134 ;IO FLAG REGISTER (IO/ER)
\r
135 FLDSW== 400000 ;ADDRESS FIELD
\r
137 ARPGSW==100000 ;ALLOW RAPID PROGRAM GENERATION
\r
138 IOPROG==040000 ;SUPRESS LISTING (LIST/XLIST PSEUDO OP)
\r
140 IOMAC== 010000 ;MACRO EXPANSION IN PROGRESS
\r
141 IOPALL==004000 ;SUPRESS LISTING OF MACRO EXPANSIONS
\r
142 IONCRF==002000 ;SUPRESS OUTPUT OF CREF INFORMATION
\r
143 CRPGSW==001000 ;CURRENTLY IN PROGRESS ON RPG
\r
144 IOCREF==000400 ;WE ARE NOW OUTPUTTING CREF INFO
\r
145 IOENDL==000200 ;BEEN TO STOUT
\r
147 DEFCRS==000040 ;THIS IS A DEFINING OCCURANCE (MACROS)
\r
148 IOIOPF==000020 ;IOP INSTRUCTION SEEN
\r
149 MFLSW== 000010 ;MULTI-FILE MODE,PRGEND SEEN
\r
150 IORPTC==000004 ;REPEAT CURRENT CHARACTER
\r
151 IOTLSN==000002 ;TITLE SEEN
\r
152 IOSALL==000001 ;SUPPRESS MACRO LISTING EVEN IF BINARY IS GENERATED
\r
154 OPDEF JUMP1 [JUMPL FR, ] ;JUMP IF PASS 1
\r
155 OPDEF JUMP2 [JUMPGE FR, ] ;JUMP IF PASS 2
\r
157 OPDEF JUMPOC [JUMPGE IO, ] ;JUMP IF IN OP-CODE FIELD
\r
158 OPDEF JUMPAD [JUMPL IO, ] ;JUMP IF IN ADDRESS FIELD
\r
160 OPDEF JUMPCM [JUMPL CS, ] ;JUMP IF CURRENT CHAR IS COMMA
\r
161 OPDEF JUMPNC [JUMPGE CS, ] ;JUMP IF CURRENT CHAR IS NON-COMMA
\r
163 \f ;ER ERROR REGISTERS (IO/ER)
\r
164 ERRM== 000020 ;MULTIPLY DEFINED SYMBOL
\r
165 ERRE== 000040 ;ILLEGAL USE OF EXTERNAL
\r
166 ERRP== 000100 ;PHASE DISCREPANCY
\r
167 ERRO== 000200 ;UNDEFINED OP CODE
\r
168 ERRN== 000400 ;NUMBER ERROR
\r
169 ERRV== 001000 ;VALUE PREVIOUSLY UNDEFINED
\r
170 ERRU== 002000 ;UNDEFINED SYMBOL
\r
171 ERRR== 004000 ;RELOCATION ERROR
\r
172 ERRL== 010000 ;LITERAL ERROR
\r
173 ERRD== 020000 ;REFERENCE TO MULTIPLY DEFINED SYMBOL
\r
174 ERRA== 040000 ;PECULIAR ARGUMENT
\r
175 ERRX== 100000 ;MACRO DEFINITION ERROR
\r
176 ERRQ== 200000 ;QUESTIONABLE, NON-FATAL ERROR
\r
181 ;SYMBOL TABLE FLAGS
\r
182 SYMF== 400000 ;SYMBOL
\r
184 NOOUTF==100000 ;NO DDT OUTPUT WFW
\r
185 SYNF== 040000 ;SYNONYM
\r
186 MACF== SYNF_-1 ;MACRO
\r
187 OPDF== SYNF_-2 ;OPDEF
\r
188 PNTF== 004000 ;"VALUE" IN SYMBOL TBL IS PNTR TO 36BIT VALUE
\r
189 UNDF== 002000 ;UNDEFINED
\r
190 EXTF== 001000 ;EXTERNAL
\r
191 INTF== 000400 ;INTERNAL
\r
192 ENTF== 000200 ;ENTRY
\r
193 VARF== 000100 ;VARIABLE
\r
194 MDFF== 000020 ;MULTIPLY DEFINED
\r
195 SPTR== 000010 ;SPECIAL EXTERNAL POINTER
\r
196 SUPRBT==000004 ;SUPRESS OUTPUT TO DDT
\r
197 LELF== 000002 ;LEFT HAND RELOCATABLE
\r
198 RELF== 000001 ;RIGHT HAND RELOCATABLE
\r
200 LITF== 200000 ;FLAG FOR PSEUDO-OPS INVALID IN LIT'S
\r
201 ADDF== 100000 ;FLAG FOR PSEUDO-OPS INVALID IN ADDRESSES
\r
203 TNODE== 200000 ;TERMINAL NODE FOR EVALEX
\r
207 DEFINE FORERR(AC,ABC)<
\r
215 IFN CCLSW,< ;ASSEMBLE IF RUN UUO IMPLEMENTED
\r
216 NUNSET: SKIPN ACDEV
\r
217 MOVSI ACDEV,(SIXBIT /SYS/) ;USE SYS IF NONE SPECIFIED
\r
220 MOVEM ACFILE,RUNFIL ;STORE FILE NAME
\r
221 PUSHJ PP,DELETE ;COMMAND FILE
\r
223 MOVEI 16,RUNDEV ;XWD 0,RUNDEV
\r
224 TLNE IO,CRPGSW ;WAS RPG IN PROGRESS?
\r
225 HRLI 16,1 ;YES START NEXT AT C(JOBSA)+1
\r
226 RUN 16, ;DO "RUN DEV:NAME"
\r
227 HALT ;SHOULD'T RETURN. HALT IF IT DOES
\r
229 IFE RUNSW,<POPJ PP, >
\r
231 DELETE: HRRZ EXTMP ;IF THE EXTENSION
\r
232 CAIE (SIXBIT /TMP/) ;IS .TMP
\r
234 CLOSE CTL2, ;DELETE
\r
235 SETZB 4,5 ;THE COMMAND FILE.
\r
241 \fSUBTTL START ASSEMBLING
\r
243 ASSEMB: PUSHJ PP,INZ ;INITIALIZE FOR PASS
\r
244 MOVE [ASCII /.MAIN/]
\r
249 ASSEM1: PUSHJ PP,CHARAC ;TEST FOR FORM FEED
\r
260 CAIN C,"\" ;BACK-SLASH?
\r
261 TLZA IO,IOMAC ;YES, LIST IF IN MACRO
\r
263 PUSHJ PP,STMNT ;OFF WE GO
\r
264 TLZN IO,IOENDL ;WAS STOUT PRE-EMPTED?
\r
267 ASSEM3: PUSHJ PP,STOUT+1
\r
270 \fSUBTTL STATEMENT PROCESSOR
\r
272 STMNT: TLZ FR,INDSW
\r
274 STMNT1: PUSHJ PP,LABEL
\r
275 STMNT2: PUSHJ PP,ATOM ;GET THE FIRST ATOM
\r
280 JUMPAD STMNT7 ;NUMERIC EXPRESSION
\r
285 PUSHJ PP,MSRCH ;SEARCH FOR MACRO/OPDEF/SYN
\r
286 JRST STMNT3 ;NOT FOUND, TRY OP CODE
\r
287 LDB SDEL,[POINT 3,ARG,5]
\r
288 JUMPE SDEL,ERRAX ;ERROR IF NO FLAG
\r
289 SOJE SDEL,OPD1 ;OPDEF IF 1
\r
290 SOJE SDEL,CALLM ;MACRO IF 2
\r
291 JRST STMNT4 ;SYNONYM, PROCESS WITH OP-CODES
\r
293 STMNT3: PUSHJ PP,OPTSCH ;SEARCH OP CODE TABLE
\r
294 JRST STMNT5 ;NOT FOUND
\r
295 STMNT4: HLLZ AC0,V ;PUT CODE IN AC0
\r
296 TRZE V,LITF ;VALID IN LITERAL?
\r
297 SKIPN LITLVL ;NO, ARE WE IN A LITERAL?
\r
298 JRST 0(V) ;NO, GO TO APPRORIATE PROCESSOR
\r
301 STMNT5: PUSHJ PP,SSRCH ;TRY SYMBOLS
\r
302 JRST STMNT8 ;NOT FOUND
\r
303 TLNE ARG,EXTF!UNDF ;EXTERNAL OR UNDEFINED?
\r
304 JRST STMNT7 ;YES, PROCESS IN EVALEX
\r
305 TLNN RC,-2 ;CHECK FOR EXTERNAL
\r
308 MOVE AC0,V ;FOUND, PUT VALUE IN AC0
\r
309 TLO IO,NUMSW ;FLAG AS NUMERIC
\r
310 STMNT7: TLZ IO,IORPTC
\r
311 PUSHJ PP,EVALHA ;EVALUATE EXPRESSION
\r
312 JRST STOW ;YES,STOW THE CODE AND EXIT
\r
314 \fSTMNT8: SETZB AC0,RC ;CLEAR VALUE AND RELOCATION
\r
315 TRO ER,ERRO ;FLAG AS UNDEIFNED OP-CODE
\r
318 ;STATEMENT OUT PASSES REMAINDER OF LINE (CMNT)
\r
319 ;UNTIL A LINE TERMINATOR IS SEEN.
\r
320 STOUTS: TLO IO,IOENDL
\r
321 STOUT: TLO IO,IORPTC
\r
324 SKIPL STPX ;YES, ERROR IF CODE STORED
\r
328 STOUT1: PUSHJ PP,CHARAC
\r
333 \f SUBTTL LABEL PROCESSOR
\r
335 LABEL: JUMPAD LABEL4 ;COMPARE IF NON-SYMBOLIC
\r
336 JUMPE AC0,LABEL5 ;ERROR IF BLANK
\r
339 TLO IO,DEFCRS ;THIS IS A DEFINITION
\r
340 PUSHJ PP,SSRCH ;SEARCH FOR OPERAND
\r
341 MOVSI ARG,SYMF!UNDF!TAGF ;NOT FOUND
\r
342 TLNE ARG,EXTF ;UNDEFINED ON PASS1
\r
343 JRST LABEL3 ;NO, FLAG ERROR
\r
345 JRST LABEL2 ;YES, CHECK EQUALITY
\r
346 LABEL1: MOVE V,LOCA ;WFW
\r
349 JRST INSERT ;INSERT/UPDATE AND EXIT
\r
351 LABEL2: HRLOM V,LOCBLK ;SAVE LIST LOCATION
\r
354 LABEL0: CAMN V,LOCA ;DOES IT COMPARE WITH PREVIOUS? WFW
\r
356 LABEL3: TLOA ARG,MDFF ;NO, FLAG MULTIPLY DEFINED AND SKIP
\r
358 TRO ER,ERRM ;FLAG MULTIPLY DEFINED ERROR
\r
359 JRST UPDATE ;UPDATE AND EXIT
\r
361 LABEL4: CAMN AC0,LOCA ;DO THEY COMPARE?
\r
363 LABEL5: TRO ER,IOPAGE ;NO, FLAG PHASE ERROR
\r
366 LABEL6: JUMP1 LABEL1
\r
371 \fSUBTTL ATOM PROCESOR
\r
372 ATOM: PUSHJ PP,CELL ;GET FIRST CELL
\r
373 TLNE IO,NUMSW ;IF NON-NUMERIC
\r
374 ATOM1: CAIE C,42 ;OR NOT A BINARY SHIFT,
\r
377 PUSH PP,AC0 ;STACK REGISTERS, ITS A BINARY SHIFT
\r
381 HRRI RX,^D10 ;COMPUTE SHIFT RADIX 10
\r
382 PUSHJ PP,CELLSF ;GET SHIFT
\r
383 MOVE ARG,RC ;SAVE RELOCATION
\r
384 POP PP,RX ;RESTORE REGISTERS
\r
387 MOVN SX,AC0 ;USE NEGATIVE OF SHIFT
\r
390 TLNN IO,NUMSW ;AND NUMERIC,
\r
395 \fCELLSF: TLO IO,FLDSW
\r
396 CELL: SETZB AC0,RC ;CLEAR RESULT AND RELOCATION
\r
397 SETZB AC1,AC2 ;CLEAR WORK REGISTERS
\r
398 MOVEM PP,PPTEMP ;SAVE PUSHDOWN POINTER
\r
400 TLZA FR,NEGSW!DCFSW!RADXSW
\r
402 CELL1: TLO IO,FLDSW
\r
404 LDB V,[POINT 4,CSTAT(C),14] ;GET CODE
\r
405 XCT .+1(V) ;EXECUTE, INDEX VIA BITS 11,12,13,14 OF CSTAT TABLE
\r
406 JRST CELL1 ;0; BLANK, (TAB OR "+")
\r
407 JRST LETTER ;1; LETTER ] $ % ( ) , ; >
\r
408 TLC FR,NEGSW ;2; "-"
\r
409 TLO FR,INDSW ;3; "@"
\r
410 JRST NUM1 ;4; NUMERIC 0 - 9
\r
413 JRST QUOTES ;7; """, "'"
\r
415 JRST PERIOD ;11; "."
\r
416 TROA ER,ERRQ ;12; ERROR, FLAG AND TREAT AS DELIMITER
\r
417 ;12; ! # & * / : = ? \ _
\r
418 \fLETTER: TLOA AC2,(POINT 6,AC0,) ;SET BYTE POINTER
\r
419 LETTE1: PUSHJ PP,GETCHR ;GET CHARACTER
\r
420 TLNN CS,6 ;ALPHA-NUMERIC
\r
421 JRST LETTE3 ;NO,TEST FOR VARIABLE
\r
422 TLNE AC2,770000 ;STORE ONLY SIX BYTES
\r
423 LETTE2: IDPB C,AC2 ;RETURN FROM PERIOD
\r
426 LETTE3: CAIE C,03 ;"#"?
\r
428 JUMPE AC0,POPOUT ;TEST FOR NULL
\r
430 PUSHJ PP,SSRCH ;YES, SEARCH FOR SYMBOL (OPERAND)
\r
431 MOVSI ARG,SYMF!UNDF ;NOT FOUND, FLAGAS UNDEFINED SYM.
\r
432 TLNN ARG,UNDF ;UNDEFINED?
\r
433 JRST GETCHR ;NO, GET NEXT CHAR AND RETURN
\r
434 TLO ARG,VARF ;YES, FLAG AS A VARIABLE
\r
435 TRO ER,ERRU ;SET UNDEFINED ERROR FLAG
\r
436 PUSHJ PP,INSERZ ;INSERT IT WITH A ZERO VALUE
\r
439 LETTE4: PUSHJ PP,GETCHR ;AND SCAN PAST IT
\r
441 NUMER1: SETZB AC0,RC ;RETURN ZERO
\r
442 NUMER2: TRO ER,ERRN ;FLAG ERROR
\r
444 GETDEL: PUSHJ PP,BYPAS1
\r
445 GETDE1: JUMPE C,.-1
\r
447 GETDE3: TLO IO,NUMSW!FLDSW ;FLAG NUMERIC
\r
448 TLNN FR,NEGSW ;IS ATOM NEGATIVE?
\r
453 GETDE2: MOVNS AC0 ;YES, NEGATE VALUE
\r
454 MOVNS RC ;AND RELOCATION
\r
455 POPOUT: POPJ PP, ;EXIT
\r
456 \fQUOTE0: ASH AC0,7
\r
458 QUOTES: PUSHJ PP,CHARAC
\r
463 PUSHJ PP,CHARAC ;LOOK AT NEXT CHAR.
\r
466 QUOTE2: TLO IO,IORPTC
\r
468 \fQUAL: PUSHJ PP,BYPAS1 ;SKIP BLANKS, GET NEXT CHARACTER
\r
470 JRST QUAL2 ;YES, RADIX=D2
\r
472 JRST QUAL8 ;YES, RADIX=D8
\r
474 JRST NUMDF ;YES, PROCESS DECIMAL FRACTION
\r
478 JRST NUMER1 ;NO, FLAG NUMERIC ERROR
\r
497 \fSUBTTL NUMBER PROCESSOR
\r
509 ANGLB1: PUSHJ PP,EVALHA
\r
514 \fSUBTTL LITERAL PROCESSOR
\r
517 PUSH PP,EXTPNT ;ALLOW EXTERN TO PRECEDE LIT IN XWD
\r
519 SKIPE LITLVL ;SAVE SEQNO AND PAGE IF NOT IN LIT ALREADY
\r
522 SQB5: JSP AC2,SVSTOW
\r
523 SQB3: PUSHJ PP,STMNT
\r
524 TLNE FR,MWLFLG ;CALL IT ] IF NOT MULTI-WORD FLAG
\r
525 CAIN C,75 ;CHECK FOR ]
\r
529 CAIN C,33 ;COMMENT?
\r
532 SQB4: PUSHJ PP,CHARAC
\r
533 CAIGE C,CR ;LOOK FOR END OF LINE
\r
536 PUSHJ PP,OUTIML ;DUMP
\r
538 SQB1: TLZ IO,IORPTC
\r
543 SKIPE LITLVL ;WERE WE NESTED?
\r
544 JUMP1 NUMER2 ;YES, FORCE ERROR IF PASS 1
\r
547 PERIOD: PUSHJ PP,GETCHR ;LOOK AT NEXT CHARACTER
\r
548 TLNN CS,2 ;ALPHABETIC?
\r
549 JRST PERNUM ;NO, TEST NUMERIC
\r
550 MOVSI AC0,(SIXBIT /./) ;YES, PUT PERIOD IN AC0
\r
551 MOVSI AC2,(POINT 6,AC0,5) ;SET BYTE POINTER
\r
552 JRST LETTE2 ;AND TREAT AS SYMBOL
\r
554 PERNUM: TLNE CS,4 ;IS IT A NUMBER
\r
556 MOVE AC0,LOCA ;NO. CURRENT LOC SYMBOL (.)
\r
557 MOVE RC,MODA ;SET TO CURRENT ASSEMBLY MODE
\r
558 JRST GETDE1 ;GET DELIMITER
\r
559 NUMDF: TLO FR,DCFSW ;SET DECIMAL FRACTION FLAG
\r
560 NUM: PUSHJ PP,GETCHR ;GET A CHARACTER
\r
561 TLNN CS,4 ;NUMERIC?
\r
563 NUM1: SUBI C,20 ;CONVERT TO OCTAL
\r
564 PUSH PP,C ;STACK FOR FLOATING POINT
\r
567 ADD AC1,C ;ADD IN LAST VALUE
\r
568 CAIL C,0(RX) ;IS NUMBER LESS THAN CURRENT RADIX?
\r
569 TLO FR,RADXSW ;NO, SET FLAG
\r
570 AOJA AC2,NUM ;YES, AC2=NO. OF DECIMAL PLACES
\r
572 \fNUM10: CAIE C,16 ;PERIOD?
\r
573 TLNE FR,DCFSW ;OR DECIMAL FRACTION?
\r
574 JRST NUM31 ;YES, PROCESS FLOATING POINT
\r
575 LSH AC1,1 ;NO, CLEAR THE SIGN BIT
\r
576 LSHC AC0,^D35 ;AND SHIFT INTO AC0
\r
577 MOVE PP,PPTEMP ;RESTORE PP
\r
578 SOJE AC2,GETDE1 ;NO RADIX ERROR TEST IF ONE DIGIT
\r
579 TLNE FR,RADXSW ;WAS ILLEGAL NUMBER ENCOUNTERED?
\r
580 TRO ER,ERRN ;YES, FLAG N ERROR
\r
583 NUM31: PUSHJ PP,GETCHR
\r
584 TLNN CS,4 ;NUMERIC?
\r
590 NUM40: PUSH PP,FR ;STACK VALUES
\r
602 JUMPN RC,NUMER1 ;EXPONENT MUST BE ABSOLUTE
\r
609 JOV NUM50 ;CLEAR OVERFLOW FLAG
\r
611 NUM50: JSP SDEL,NUMUP ;FLOATING POINT
\r
612 JRST NUM52 ;END OF WHOLE NUMBERS
\r
613 FMPR AC0,[10.0] ;MULTIPLY BY 10
\r
614 TLO AC1,233000 ;CONVERT TO FLOATING POINT
\r
615 FADR AC0,AC1 ;ADD IT IN
\r
618 NUM52: JSP SDEL,NUMDN ;PROCESS FRACTION
\r
620 JOV NUMER1 ;TEST FOR OVERFLOW
\r
624 FADR AC2,AC1 ;ACCUMULATE FRACTION
\r
628 NUM60: JSP SDEL,NUMUP
\r
634 NUM62: LSHC AC1,-^D36
\r
656 GETSYM: MOVEI AC0,0 ;CLEAR AC0
\r
657 MOVSI AC1,(POINT 6,AC0) ;PUT POINTER IN AC1
\r
658 PUSHJ PP,BYPAS1 ;SKIP LEADING BLANKS
\r
659 TLNN CS,2 ;ALPHABETIC?
\r
660 JRST GETSY1 ;NO, ERROR
\r
662 JRST GETSY2 ;NO, A VALID SYMBOL
\r
663 IDPB C,AC1 ;STORE THE CHARACTER
\r
664 PUSHJ PP,GETCHR ;YES, TEST NEXT CHARACTER
\r
665 TLNN CS,2 ;ALPHABETIC?
\r
666 GETSY1: TROA ER,ERRA
\r
667 GETSY2: AOS 0(PP) ;YES, SET SKIP EXIT
\r
668 GETSY3: TLNN CS,6 ;ALPHA-NUMERIC?
\r
669 JRST BYPAS2 ;NO, GET DELIMITER
\r
670 TLNE AC1,770000 ;YES, HAVE WE STORED SIX?
\r
671 IDPB C,AC1 ;NO, STORE IT
\r
674 BYPAS1: PUSHJ PP,GETCHR
\r
675 BYPAS2: JUMPE C,.-1
\r
677 \fSUBTTL EXPRESSION EVALUATOR
\r
678 CV== AC0 ;CURRENT VALUE
\r
679 PV== AC1 ;PREVIOUS VALUE
\r
680 RC== RC ;CURRENT RELOCATABILITY
\r
681 PR== AC2 ;PREVIOUS RELOCATABILITY
\r
682 CS= CS ;CURRENT STATUS
\r
683 PS== SDEL ;PREVIOUS STATUS
\r
685 EVALHA: TLO FR,TMPSW
\r
686 EVALEX: TLO IO,FLDSW
\r
687 PUSH PP,[XWD TNODE,0] ;MARK THE LIST 200000,,0
\r
689 EVATOM: PUSHJ PP,ATOM ;GET THE NEXT ATOM
\r
690 JUMPE AC0,EVGETD ;TEST FOR NULL/ZERO
\r
691 TLOE IO,NUMSW ;SET NUMERIC, WAS IT PREVIOUSLY?
\r
692 JRST EVGETD ;YES, TREAT ACCORDINGLY
\r
693 PUSHJ PP,SEARCH ;SEARCH FOR MACRO OR SYMBOL
\r
694 JRST EVOP ;NOT FOUND, TRY FOR OP-CODE
\r
695 SKIPL ARG ;SKIP IF OPERAND
\r
696 PUSHJ PP,SSRCH1 ;OPERATOR, TRY FOR SYMBOL (OPERAND)
\r
697 PUSHJ PP,QSRCH ;PERFORM CROSS-REFERENCE
\r
698 JUMPG ARG,EVMAC ;BRANCH IF OPERATOR
\r
699 MOVE AC0,V ;SYMBOL, SET VALUE
\r
700 JRST EVTSTS ;TEST STATUS
\r
702 EVMAC: TLNE FR,NEGSW ;UNARY MINUS?
\r
703 JRST EVERRZ ;YES, INVALID BEFORE OPERATOR
\r
704 LDB SDEL,[POINT 3,ARG,5] ;GET MACF/OPDF/SYNF
\r
705 SOJL SDEL,EVERRZ ;ERROR IF NO FLAGS
\r
707 SKIPE C ;NON-BLANK?
\r
708 TLO IO,IORPTC ;YES, REPEAT CHARACTER
\r
709 SOJE SDEL,CALLM ;MACRO IF 2
\r
710 JUMPG SDEL,EVOPS ;SYNONYM IF 4
\r
713 MOVEI V,OPD ;SET TRANSFER VECTOR
\r
715 \fEVOP: TLNE FR,NEGSW ;OPCODE, UNARY MINUS?
\r
716 JRST EVERRZ ;YES, ERROR
\r
718 PUSHJ PP,OPTSCH ;SEARCH SYMBOL TABLE
\r
719 JRST EVOPX ;NOT FOUND
\r
720 EVOPS: TRZE V,LITF ;CLEAR LIT INVALID FLAG
\r
721 JRST EVOPX ;PSEUDO-OP THAT GENERATES NO DATA JUMPS
\r
723 EVOPD: SKIPE C ;OPDEF, NON-BLANK DELIMITER?
\r
724 TLO IO,IORPTC ;YES, REPEAT CHARACTER
\r
735 EVOPX: MOVSI ARG,SYMF!UNDF
\r
737 EVERRZ: SETZB AC0,RC ;CLEAR CODE AND RELOCATION
\r
738 EVERRU: TRO ER,ERRU
\r
740 \fEVTSTS: TLNE ARG,UNDF
\r
744 HRRZ RC,ARG ;GET ADRES WFW
\r
745 HRRZ ARG,EXTPNT ;SAVE IT WDW
\r
746 HRRM RC,EXTPNT ;WFW
\r
751 EVTSTR: TLNE ARG,MDFF ;MULTIPLY DEFINED?
\r
752 TRO ER,ERRD ;YES, FLAG IT
\r
753 TLNE FR,NEGSW ;NEGATIVE ATOM?
\r
754 PUSHJ PP,GETDE2 ;YES, NEGATIVE AC0 AND RC
\r
756 EVGETD: PUSHJ PP,BYPAS2
\r
757 TLNE CS,6 ;NON BLANK FIELD
\r
758 TLO IO,IORPTC ;YES,SET FLAG
\r
759 EVNUM: POP PP,SDEL ;POP THE PREVIOUS DELIMITER/TNODE
\r
761 CAMGE PS,CS ;OPERATION REQUIRED?
\r
762 JRST EVPUSH ;NO, PUT VALUES BACK ON STACK
\r
763 TLNN PS,TNODE ;YES, HAVE WE REACHED TERMINAL NODE?
\r
764 JRST EVXCT ;NO, EXECUTION REQUIRED
\r
765 TLNN CS,170000 ;YES, ARE WE POINTING AT DEL (& ! * / + - _)
\r
766 POPJ PP, ;YES, EXIT
\r
767 ;NO, FALL INTO EVPUSH
\r
768 \fEVPUSH: PUSH PP,PS ;STACK VALUES
\r
772 JRST EVATOM ;GET NEXT ATOM
\r
774 EVXCT: POP PP,AC2 ;POP PREVIOUS RELOCATABILITY
\r
775 POP PP,AC1 ;AND PREVIOUS VALUE
\r
776 LDB PS,[POINT 3,PS,29] ;TYPE OF OPERATION TO PS
\r
777 JRST .(PS) ;PREFORM PROPER OPERATION
\r
783 TDOA CV,PV ;6; MERGE PV INTO CV
\r
784 AND CV,PV ;7; AND PV INTO CV
\r
785 SKIPN RC ;COMMON RELOCATION TEST
\r
787 TRO ER,ERRR ;BOTH MUST BE FIXED
\r
788 JRST EVNUM ;GO TRY AGAIN
\r
798 XDIV: IDIV PR,CV ;CORRECT RELOCATABILITY
\r
800 XDIV1: EXCH PR,RC ;TAKE RELOCATION OF NUMERATOR
\r
805 XMUL: JUMPE PR,XMUL1 ;AT LEAST ONE OPERAND
\r
806 JUMPE RC,XMUL1 ;MUST BE FIXED
\r
808 XMUL1: IORM PR,RC ;GET RELOCATION TO RC
\r
816 \f SUBTTL LITERAL STORAGE HANDLER
\r
818 STOLER: SETZB AC0,RC ;ERROR, NO CODE STORED
\r
819 PUSHJ PP,STOW ;STOW ZERO
\r
820 TRO ER,ERRL ;AND FLAG THE ERROR
\r
822 STOLIT: MOVE SDEL,STPX
\r
823 SUB SDEL,STPY ;COMPUTE NUMBER OF WORDS
\r
824 JUMPE SDEL,STOLER ;ERROR IF NONE STORED
\r
825 TRNN ER,ERRORS ;ANY ERRORS?
\r
827 JUMP2 STOL22 ;YES, NO SEARCH. BRANCH IF PASS2
\r
831 STOL06: MOVEI SX,LITAB
\r
836 STOL08: PUSHJ PP,DSTOW ;GET VALUE WFW
\r
837 STOL10: SOJL AC2,STOL24 ;TEST FOR END
\r
838 MOVE SX,0(SX) ;NO, GET NEXT STORAGE CELL
\r
839 MOVE V,-1(SX) ;GET RELOCATION BITS WFW
\r
840 CAMN AC0,-2(SX) ;DO CODES COMPARE? WFW
\r
841 CAME RC,V ;YES, HOW ABOUT RELOCATION?
\r
842 AOJA SDEL,STOL10 ;NO, TRY AGAIN
\r
843 SKIPGE STPX ;YES, MULTI-WORD?
\r
844 JRST STOL26 ;NO, JUST RETURN LOCATION
\r
845 MOVEM AC2,SAVBLK+AC2 ;YES, SAVE STARTING INFO
\r
848 STOL12: SOJL AC2,STOL23 ;TEST FOR END
\r
849 PUSHJ PP,DSTOW ;GET NEXT WORD WFW
\r
850 MOVE SX,0(SX) ;UPDATE POINTER
\r
851 MOVE V,-1(SX) ;GET RELOCATION WFW
\r
852 CAMN AC0,-2(SX) ;COMPARE VALUE WFW
\r
853 CAME RC,V ;AND RELOCATION
\r
854 JRST STOL14 ;NO MATCH, TRY AGAIN
\r
855 SKIPL STPX ;MATCH, HAVE WE FINISHED SEARCH?
\r
856 JRST STOL12 ;NO, TRY NEXT WORD
\r
857 JRST STOL26 ;YES, RETURN LOCATION
\r
859 STOL14: MOVE AC2,SAVBLK+AC2 ;RESTORE STOW POINTERS
\r
863 AOJA SDEL,STOL08 ;BETTER LUCK NEXT TIME
\r
865 STOL22: MOVE SDEL,LITNUM
\r
866 STOL23: PUSHJ PP,DSTOW ;DSTOW AND CONVERT
\r
867 STOL24: MOVE SX,LITABX ;GET CURRENT STORAGE
\r
868 PUSHJ PP,GETTOP ;GET NEXT CELL
\r
869 MOVEM AC0,-2(SX) ;STORE CODE WFW
\r
870 MOVEM RC,-1(SX) ;WFW
\r
871 MOVEM SX,LITABX ;SET POINTER TO CURRENT CELL
\r
872 AOS LITNUM ;INCREMENT NUMBER STORED
\r
873 AOS LITCNT ;INCREMENT NUMBER RESERVED
\r
874 SKIPL STPX ;ANY MODE CODE?
\r
876 STOL26: JUMP1 POPOUT ;EXIT IF PASS ONE
\r
877 MOVE SX,LITHDX ;GET HEADER BLOCK
\r
878 HLRZ RC,-1(SX) ;GET BLOCK RELOCATION
\r
880 ADDI AC0,0(SDEL) ;COMPUTE ACTUAL LOCATION
\r
882 \fSUBTTL INPUT ROUTINES
\r
883 GETCHR: PUSHJ PP,CHARAC ;GET ASCII CHARACTER
\r
884 CAIG C,172 ;CHECK FOR LOWER CASE
\r
886 SKIPA ;NOT LOWER CASE
\r
887 SUBI C,40 ;CONVERT LOWER CASE TO SIXBIT
\r
888 SUBI C,40 ;CONVERT TO SIX BIT
\r
896 TLOA IO,IORPTC ;REPEAT CHARACTER
\r
898 GETCS1: TDO IO,[XWD IORPTC,ERRQ]
\r
900 GETCS: MOVE CS,CSTAT(C) ;GET STATUS BITS
\r
903 CHARAC: TLZE IO,IORPTC ;REPEAT REQUESTED?
\r
905 RSW0: JUMPN MRP,MREAD ;BRANCH IF TREE POINTER SET
\r
907 RSW1: SKIPE RPOLVL ;ARE WE IN "REPEAT ONCE"?
\r
909 RSW2: SOSG CPL ;ANY ROOM IN THE IMAGE BUFFER?
\r
910 PUSHJ PP,OUTPL ;NO, OUTPUT THE PARTIAL LINE
\r
911 IDPB C,LBUFP ;YES, STORE IN PRINT AREA
\r
915 ANDCAM CS,CPL ;MASK
\r
918 CHARAX: LDB C,LBUFP ;GET LAST CHARACTER
\r
920 CHARL: PUSHJ PP,CHARAC ;GET AND TEST 7-BIT ASCII
\r
921 CAIE C,LF ;LINE OR FORM FEED OR VT?
\r
923 SKIPA CS,LITLVL ;IN LITERAL?
\r
925 JUMPN CS,OUTIML ;YES
\r
926 CHARL1: PUSHJ PP,SAVEXS ;SAVE REGISTERS
\r
927 PUSHJ PP,OUTLIN ;DUMP THE LINE
\r
928 JRST RSTRXS ;RESTORE REGISTERS AND EXIT
\r
929 \fSUBTTL CHARACTER STATUS TABLE
\r
931 DEFINE GENCS (OPLVL,ATOM,AN,SQUOZ,OPTYPE,SEQNO)
\r
932 <BYTE (6)OPLVL (9)ATOM (3)AN (6)SQUOZ,OPTYPE,SEQNO>
\r
934 ;OPLVL PRIORITY OF BINARY OPERATORS
\r
935 ;ATOM INDEX TO JUMP TABLE AT CELL1
\r
936 ;AN TYPE OF CHARACTER
\r
937 ; 1=OTHER, 2=ALPHA, 4=NUMERIC
\r
938 ;SQUOZ VALUE IN RADIX 50
\r
939 ;OPTYPE INDEX TO JUMP TABLE AT EVXCT
\r
940 ;SEQNO VALUE IN SIXBIT
\r
942 GENCS 00,00,1,00,00,00 ; ' '
\r
943 GENCS 04,12,1,00,06,01 ; '!'
\r
944 GENCS 00,07,1,00,00,02 ; '"'
\r
945 GENCS 00,12,1,00,00,03 ; '#'
\r
946 GENCS 00,01,2,46,00,04 ; '$'
\r
947 GENCS 00,01,2,47,00,05 ; '%'
\r
948 GENCS 04,12,1,00,07,06 ; '&'
\r
949 GENCS 00,00,1,00,00,07 ; '''
\r
951 GENCS 00,01,1,00,00,10 ; '('
\r
952 GENCS 00,01,1,00,00,11 ; ')'
\r
953 GENCS 02,12,1,00,01,12 ; '*'
\r
954 GENCS 01,00,1,00,03,13 ; '+'
\r
955 GENCS 40,01,1,00,00,14 ; ','
\r
956 GENCS 01,02,1,00,04,15 ; '-'
\r
957 GENCS 00,11,2,45,00,16 ; '.'
\r
958 GENCS 02,12,1,00,02,17 ; '/'
\r
960 GENCS 00,04,4,01,00,20 ; '0'
\r
961 GENCS 00,04,4,02,00,21 ; '1'
\r
962 GENCS 00,04,4,03,00,22 ; '2'
\r
963 GENCS 00,04,4,04,00,23 ; '3'
\r
964 GENCS 00,04,4,05,00,24 ; '4'
\r
965 GENCS 00,04,4,06,00,25 ; '5'
\r
966 GENCS 00,04,4,07,00,26 ; '6'
\r
967 GENCS 00,04,4,10,00,27 ; '7'
\r
969 GENCS 00,04,4,11,00,30 ; '8'
\r
970 GENCS 00,04,4,12,00,31 ; '9'
\r
971 GENCS 00,12,1,00,00,32 ; ':'
\r
972 GENCS 00,01,1,00,00,33 ; ';'
\r
973 GENCS 00,05,1,00,00,34 ; '<'
\r
974 GENCS 00,12,1,00,00,35 ; '='
\r
975 GENCS 00,01,1,00,00,36 ; '>'
\r
976 GENCS 00,12,1,00,00,37 ; '?'
\r
977 \f GENCS 00,03,1,00,00,40 ; '@'
\r
978 GENCS 00,01,2,13,00,41 ; 'A'
\r
979 GENCS 00,01,2,14,00,42 ; 'B'
\r
980 GENCS 00,01,2,15,00,43 ; 'C'
\r
981 GENCS 00,01,2,16,00,44 ; 'D'
\r
982 GENCS 00,01,2,17,00,45 ; 'E'
\r
983 GENCS 00,01,2,20,00,46 ; 'F'
\r
984 GENCS 00,01,2,21,00,47 ; 'G'
\r
986 GENCS 00,01,2,22,00,50 ; 'H'
\r
987 GENCS 00,01,2,23,00,51 ; 'I'
\r
988 GENCS 00,01,2,24,00,52 ; 'J'
\r
989 GENCS 00,01,2,25,00,53 ; 'K'
\r
990 GENCS 00,01,2,26,00,54 ; 'L'
\r
991 GENCS 00,01,2,27,00,55 ; 'M'
\r
992 GENCS 00,01,2,30,00,56 ; 'N'
\r
993 GENCS 00,01,2,31,00,57 ; 'O'
\r
995 GENCS 00,01,2,32,00,60 ; 'P'
\r
996 GENCS 00,01,2,33,00,61 ; 'Q'
\r
997 GENCS 00,01,2,34,00,62 ; 'R'
\r
998 GENCS 00,01,2,35,00,63 ; 'S'
\r
999 GENCS 00,01,2,36,00,64 ; 'T'
\r
1000 GENCS 00,01,2,37,00,65 ; 'U'
\r
1001 GENCS 00,01,2,40,00,66 ; 'V'
\r
1002 GENCS 00,01,2,41,00,67 ; 'W'
\r
1004 GENCS 00,01,2,42,00,70 ; 'X'
\r
1005 GENCS 00,01,2,43,00,71 ; 'Y'
\r
1006 GENCS 00,01,2,44,00,72 ; 'Z'
\r
1007 GENCS 00,06,1,00,00,73 ; '['
\r
1008 GENCS 00,12,1,00,00,74 ; '\'
\r
1009 GENCS 00,01,1,00,00,75 ; ']'
\r
1010 GENCS 00,10,1,00,00,76 ; '^'
\r
1011 GENCS 10,12,1,00,05,77 ; '_'
\r
1012 \fSUBTTL LISTING ROUTINES
\r
1013 OUTLIN: TRNN ER,ERRORS-ERRQ ;ANY ERRORS?
\r
1014 TLNE FR,ERRQSW ;NO, IGNORE Q ERRORS?
\r
1015 TRZ ER,ERRQ ;YES, YES, ZERO THE Q ERROR
\r
1016 HRLZ AC0,ER ;PUT ERROR FLAGS IN AC0 LEFT
\r
1019 JUMP1 OUTL30 ;BRANCH IF PASS ONE
\r
1020 JUMPN AC0,OUTL02 ;JUMP IF ANY ERRORS TO FORCE PRINTING
\r
1021 SKIPL STPX ;SKIP IF NO CODE, OTHERWISE
\r
1022 TLZ IO,IOMAC ;FORCE MACRO PRINTING
\r
1023 TLNN IO,IOMSTR!IOPROG!IOMAC
\r
1024 OUTL02: IOR IO,OUTSW ;FORCE IT.
\r
1025 TLNN FR,CREFSW ;CREF?
\r
1026 PUSHJ PP,CLSCRF ;YES, WRITE END OF CREF DATA (177,003)
\r
1027 JUMPE AC0,OUTL20 ;BRANCH IF NO ERRORS
\r
1028 TLZE AC0,ERRM ;M ERROR?
\r
1029 TLO AC0,ERRP ;M ERROR SET - SET P ERROR.
\r
1030 PUSHJ PP,OUTLER ;PROCESS ERRORS
\r
1032 OUTL20: SKIPN RC,ASGBLK
\r
1034 SKIPL STPX ;ANY BINARY?
\r
1035 JRST OUTL23 ;YES, JUMP
\r
1036 JUMPE RC,OUTL22 ;SEQUENCE BREAK AND NO BINARY JUMPS
\r
1037 ILDB C,TABP ;ASSIGNMENT FALL THROUGH
\r
1039 ILDB C,TABP ;OUTPUT 2ND TAB, LOCATION FIELD
\r
1040 PUSHJ PP,OUTC ;NEXT IS BINARY LISTING FIELD
\r
1041 HLLO CS,LOCBLK ;LEFT HALF OF A 36BIT VALUE
\r
1042 TLNE CS,-1 ;SKIP IF ITS A 18BIT VALUE, OTHERWISE
\r
1043 PUSHJ PP,ONC1 ;PRINT LH OF A 36 BIT VALUE IN CS
\r
1044 HRLO CS,LOCBLK ;PICK UP THE RIGHT HALF (18BIT VALUE)
\r
1046 \fOUTL22: PUSHJ PP,ONC ;PRINT IT
\r
1047 OUTL23: SKIPL STPX ;ANY BINARY?
\r
1048 PUSHJ PP,BOUT ;YES, DUMP IT
\r
1049 MOVE CS,@OUTLI2 ;[POINT 7,LBUF]
\r
1055 PUSHJ PP,OUTASC ;OUTPUT TABS
\r
1056 OUTL25: MOVEI CS,LBUF
\r
1057 PUSHJ PP,OUTAS0 ;DUMP THE LINE
\r
1058 OUTL26: SKIPGE STPX ;ANY BINARY?
\r
1059 JRST OUTLI ;NO, CLEAN UP AND EXIT
\r
1060 PUSHJ PP,OUTLI2 ;YES, INITIALIZE FOR NEXT LINE
\r
1061 PUSHJ PP,BOUT ;YES, DUMP IT
\r
1062 PUSHJ PP,OUTCR ;OUTPUT CARRIAGE RETURN
\r
1063 JRST OUTL26 ;TEST FOR MORE BINARY
\r
1065 \fOUTL30: AOS CS,STPX ;PASS ONE
\r
1066 ADDM CS,LOCO ;INCREMENT OUTPUT LOCATION
\r
1067 PUSHJ PP,STOWI ;INITIALIZE STOW
\r
1068 TLZ AC0,ERRORS-ERRM-ERRP-ERRV-400000
\r
1069 JUMPE AC0,OUTLI3 ;JUMP IF ERRORS
\r
1070 IOR ER,OUTSW ;LIST ERRORS
\r
1072 PUSHJ PP,OUTSIX ;OUTPUT TAG
\r
1074 PUSHJ PP,DNC ;CONVERT INCREMENT TO DECIMAL
\r
1075 PUSHJ PP,OUTTAB ;OUTPUT TAB
\r
1076 PUSHJ PP,OUTLER ;OUTPUT ERROR FLAGS
\r
1078 JRST OUTL25 ;OUTPUT BASIC LINE
\r
1080 OUTLER: ASH AC0,-4
\r
1081 MOVE CS,[POINT 6,[SIXBIT /PRINTQXADLRUVNOPEM/]]
\r
1082 OUTLE2: ILDB C,CS ;GET ERROR MNEMONIC
\r
1083 JUMPGE AC0,OUTLE4 ;BRANCH IF NOT FLAGGED
\r
1086 AOS ERRCNT ;INCREMENT ERROR COUNT
\r
1087 OUTLE4: LSH AC0,1 ;SHIFT NEXT FLAG INTO SIGN BIT
\r
1088 JUMPN AC0,OUTLE2 ;TEST FOR END
\r
1091 OUTIM1: JUMP1 OUTLI3
\r
1099 OUTIM2: MOVE CS,TABP
\r
1100 PUSHJ PP,OUTASC ;OUTPUT TABS
\r
1108 OUTLI: TLNE IO,IOPALL ;SUPRESSING ALL
\r
1110 TLZA IO,IOMAC ;NO, CLEAR MAC FLAG
\r
1111 TLO IO,IOMAC ;YES, SET FLAG
\r
1112 OUTLI3: TRZ IO,ERRORS!LPTSW!TTYSW
\r
1113 OUTLI2: MOVE CS,[POINT 7,LBUF] ;INITIALIZE BUFFERS
\r
1117 MOVE CS,[POINT 7,TABI,6]
\r
1119 MOVSI CS,(ASCII / /)
\r
1120 SKIPE SEQNO ;HAVE WE SEQUENCE NUMBERS?
\r
1121 MOVEM CS,SEQNO ;YES, STORE TAB IN CASE OF MACRO
\r
1122 MOVEM CS,SEQNO+1 ;STORE TAB AND TERRMINATOR
\r
1126 \fOUTIML: TRNN ER,ERRORS-ERRQ ;FOR LITERALS (MULIT-LINE) OUTPUT ERRORS
\r
1130 JUMP1 OUTML1 ;CHECK PASS1 ERRORS
\r
1133 PUSH PP,[0] ;ERRORS SHOULD BE ZEROED
\r
1135 PUSH PP,AC0 ;SAVE ACO IN CASE CALLED FROM ASCII
\r
1136 MOVE AC0,CS ;ERROR ROUTINE WANTS FLAGS IN AC0
\r
1139 PUSHJ PP,CLSCRF ;FIX CREF
\r
1142 PUSHJ PP,OUTLER ;OUTPUT THEM
\r
1145 OUTML1: TLZ CS,ERRORS-ERRM-ERRP-ERRV-400000
\r
1147 TRZ ER,ERRM!ERRP!ERRV!400000
\r
1150 PUSH PP,C ;SAVE THIS
\r
1151 PUSH PP,AC0 ;AS ABOVE
\r
1160 PUSHJ PP,OUTLER ;DO NOT FORGET ERRORS
\r
1162 MOVEI CS,LBUF ;PRINT REST OF LINE
\r
1168 \fSUBTTL OUTPUT ROUTINES
\r
1169 UOUT: PUSHJ PP,LOOKUP ;SET FOR TABLE SCAN
\r
1170 TRNN ARG,PNTF ;WFW
\r
1176 MOVEI CS,[SIXBIT /UNASSIGNED, DEFINED AS @/]
\r
1180 UOUT1: PUSHJ PP,ONC1
\r
1182 \f ;OUTPUT THE ENTRIES
\r
1184 EOUT: MOVEI C,0 ;INITIALIZE THE COUNT
\r
1187 EOUT1: SOJL SDEL,EOUT2
\r
1190 ANDCAI ARG,SYMF!INTF!ENTF
\r
1191 JUMPN ARG,EOUT1 ;IF INVALID, DON'T COUNT
\r
1192 AOJA C,EOUT1 ;BUMP COUNT
\r
1194 EOUT2: HRLI C,4 ;BLOCK TYPE 4
\r
1202 EOUT3: SOJL SDEL,POPOUT
\r
1205 ANDCAI C,SYMF!INTF!ENTF
\r
1207 SOJGE V,EOUT4 ;TEST END OF BLOCK
\r
1210 EOUT4: MOVE AC0,-1(SX)
\r
1215 \f ;OUTPUT THE SYMBOLS
\r
1217 SOUT: MOVEI [ASCIZ /SYMBOL TABLE/]
\r
1218 HRRM SUBTTX ;SET NEW SUB-TITLE
\r
1219 PUSHJ PP,OUTFF ;FORCE NEW PAGE
\r
1220 MOVEI ARG,NCOLS ;SET UP FOR NCOLS ACROSS SYMBOL TABLE
\r
1221 MOVEM ARG,SYMCNT ;STORE ANSWER
\r
1222 PUSHJ PP,LOUT1 ;OUTPUT THEM
\r
1225 JRST OUTCR ;NO, NEED CR
\r
1228 LOUT1: PUSHJ PP,LOOKUP ;SET FOR TABLE SCAN
\r
1230 TRNN ARG,MACF!SYNF
\r
1231 TRNE ARG,40 ;SKIP AND CLEAR MRP
\r
1232 POPJ PP, ;NO, TRY AGAIN
\r
1237 MOVNI MRP,1 ;MRP=-1 FOR EXTERNAL
\r
1238 TRNE ARG,SYNF ;SYNONYM?
\r
1239 JUMPL MRP,POPOUT ;YES, DON'T OUTPUT IF EXTERNAL
\r
1240 TRNE ARG,SUPRBT ;IF SUPRESSED
\r
1245 HLRZ RC,V ;PUT POINTER/FLAGS IN RC
\r
1246 TRNE RC,-2 ;POINTER?
\r
1247 MOVS RC,0(RC) ;YES
\r
1248 HLL V,RC ;STORE LEFT HALF
\r
1250 LOUT10: PUSH PP,RC ;SAVE FOR LATER
\r
1251 PUSHJ PP,OUTSYM ;OUTPUT THE NAME
\r
1252 MOVE RC,0(PP) ;GET COPY
\r
1254 JUMPLE MRP,LOUT15 ;SET DEFFERRED BITS IF EXTERNAL
\r
1255 TLNE RC,-2 ;CHECK FOR LEFT FIXUP
\r
1256 IORI AC1,40 ;AND SET BITS
\r
1257 TRNE RC,-2 ;CHECK FOR RIGHT FIXUP
\r
1258 IORI AC1,20 ;AND SET BITS
\r
1259 LOUT15: TLNE RC,-2 ;FIX RELOC AS 0 IF EXTERNAL
\r
1267 TRNE ARG,NOOUTF ;ENTRY DMN
\r
1268 ADDI MRP,3 ;YES WFW
\r
1269 IOR AC1,SOUTC(MRP)
\r
1271 PUSHJ PP,NOUT2 ;SQUOZE AND DUMP THE SYMBOL
\r
1272 MOVEM AC0,SVSYM ;SAVE IT
\r
1273 MOVE AC0,V ;GET THE VALUE
\r
1274 HLRZ RC,MRP ;AND THE RELOCATION
\r
1277 TRNE RC,2 ;LEFT HALF RELOCATABLE?
\r
1278 TRZA CS,1 ;NO, FLAG AND PRINT
\r
1279 TLNE CS,-1 ;IS THE LEFT HALF ZERO?
\r
1280 PUSHJ PP,ONC1 ;NO, OUTPUT IT
\r
1283 TDZ CS,RC ;SET RELOCATION
\r
1286 POP PP,RC ;GET BACK RELOC AND CHECK EXTERNAL
\r
1287 TRNN RC,-2 ;IS IT?
\r
1289 MOVE AC0,1(RC) ;GET NAME
\r
1290 MOVEI ARG,60 ;EXTERNAL REQ
\r
1292 HLLZS AC0,RC ;NO RELOC
\r
1293 PUSHJ PP,COUT ;OUTPUT IT
\r
1294 MOVE AC0,SVSYM ;GET SYMBOL NAME
\r
1295 TLO AC0,500000 ;SET AS ADDITIVE SYMBOL
\r
1296 TLZ AC0,200000 ;BUT NOT LEFT HALF ETC
\r
1299 SOUT50: MOVSS RC ;CHECK LEFT HALF
\r
1311 SOUT30: MOVEI CS,SOUTC(MRP)
\r
1319 SOUT20: PUSHJ PP,OUTAS0
\r
1322 <ASCII /EXT/>!60 ;DMN
\r
1327 <ASCII /INT/>!04 ;DMN
\r
1328 \f ;OUTPUT THE BINARY
\r
1330 BOUT: HRLO CS,LOCO ;PICKUP THE LOCATION
\r
1331 PUSHJ PP,ONC ;OUTPUT IT TO THE LISTING FILE
\r
1332 PUSHJ PP,DSTOW ;GET THE CODE
\r
1333 PUSH PP,RC ;SAVE RELOCATION
\r
1334 TLNE RC,-2 ;CHECK LEFT EXTERNAL
\r
1335 HRRZS RC ;MAKE LEFT NON-RELOC
\r
1336 TRNN RC,-2 ;RIGHT EXT?
\r
1339 JUMPE AC1,BOUT20 ;PROCESS IF ZERO CODE THERE
\r
1340 HLLZS AC0,RC ;MAKE NON-RELOC
\r
1341 JRST BOUT30 ;PROCESS
\r
1345 BOUT20: HRRM AC1,0(PP) ;FIX RC IN STACK SO NO CONFUSION WFW (AC1 HAS 0)
\r
1346 HRR AC0,0(RC) ;NO, SET ADDRESS LINK
\r
1347 MOVE AC1,LOCO ;GET CURRENT LOCATION
\r
1348 HRRM AC1,0(RC) ;SET NEW LINK
\r
1349 HLRZ AC1,0(RC) ;GET FLAGS/POINTER
\r
1350 TRNN AC1,-2 ;POINTER?
\r
1351 HRR AC1,RC ;NO, SET TO FLAGS
\r
1352 HLR RC,0(AC1) ;PUT FLAGS IN RC
\r
1353 HRL AC1,MODO ;GET CURRENT MODE
\r
1354 TRZE RC,-2 ;LEFT HALF RELOCATABLE+
\r
1355 TLO AC1,2 ;YES, SET FLAG
\r
1356 HLLM AC1,0(AC1) ;STORE NEW FLAGS
\r
1357 BOUT30: HLLO CS,AC0
\r
1358 TLZE RC,1 ;PACK RELOCATION BITS
\r
1360 TRNE RC,2 ;LEFT HALF RELOCATABLE?
\r
1361 TRZ CS,1 ;YES, RESET BIT
\r
1364 TDZ CS,RC ;SET RELOCATION
\r
1366 HRRZ CS,LOCO ;CS = RIGHT RELOCATION
\r
1367 TLNE FR,RIMSW!RIM1SW!R1BSW ;RIM OUTPUT?
\r
1368 JRST ROUT ;YES, GO PROCESS
\r
1371 CAME CS,MODLOC ;SEQUENCE OR RELOCATION BREAK?
\r
1372 PUSHJ PP,COUTD ;YES, DUMP THE BUFFER
\r
1373 SKIPL COUTX ;NEW BUFFER?
\r
1374 JRST BOUT40 ;NO, STORE CODE AND EXIT
\r
1375 MOVEM CS,MODLOC ;YES, STORE NEW VALUES
\r
1378 PUSHJ PP,COUT ;STORE BLOCK LOCATION AND MODE
\r
1379 EXCH RC,MODO ;RESTORE CURRENT VALUES
\r
1381 \fBOUT40: PUSHJ PP,COUT ;EXIT CODE
\r
1382 POP PP,RC ;RETREIVE EXTERNAL BITS
\r
1383 TRNN RC,-2 ;RIGHT EXTERNAL?
\r
1384 JRST BOUT50 ;TRY FOR LEFT
\r
1386 PUSH PP,BLKTYP ;TERMINATE TYPE AND SAVE
\r
1387 MOVEI AC0,2 ;BLOCK TYPE 2
\r
1389 MOVE AC0,1(11) ;GET SYMBOL
\r
1390 MOVEI ARG,60 ;CODE BITS
\r
1391 PUSHJ PP,SQOZE ;CONVERT TO RADIX 50
\r
1392 HLLZS RC ;SYMBOL HAS NO RELOCATION
\r
1393 PUSHJ PP,COUT ;EMIT
\r
1394 MOVE AC0,LOCO ;GET CURRENT LOC
\r
1395 HRLI AC0,400000 ;ADDITIVE REQ
\r
1396 HRR RC,MODO ;CURRENT MODE
\r
1397 PUSHJ PP,COUT ;EMIT
\r
1398 MOVSS RC ;NOW FOR LEFT
\r
1402 BOUT50: MOVSS RC ;CHECK OTHER HALF
\r
1403 TRNN RC,-2 ;LEFT HALF EXTERNAL?
\r
1404 JRST BOUT80 ;NO, FALSE ALARM
\r
1405 PUSHJ PP,COUTD ;CHANGE MODE
\r
1409 BOUT70: MOVE AC0,1(RC)
\r
1415 HRLI AC0,600000 ;LEFT HALF ADD
\r
1417 PUSHJ PP,COUT ;EMIT
\r
1418 BOUT60: PUSHJ PP,COUTD ;CHANGE MODE
\r
1419 POP PP,BLKTYP ;TO OLD ONE
\r
1423 \fNOUT: MOVE V,[POINT 7,TBUF] ;POINTER TO ASCII LINE
\r
1424 MOVSI CS,(POINT 6,AC0) ;POINTER TO SIXBIT AC0
\r
1426 NOUT1: ILDB C,V ;GET ASCII
\r
1430 SUBI C,40 ;CONVERT TO LOWER CASE
\r
1431 SUBI C,40 ;CONVERT TO SIXBIT
\r
1432 JUMPLE C,NOUT3 ;TEST FORM NON-SIXBIT
\r
1433 CAILE C,77 ;AND NOT GREATER THAN SIXBIT
\r
1435 IDPB C,CS ;DEPOSIT IN AC0
\r
1436 TLNE CS,770000 ;TEST FOR SIX CHARACTERS
\r
1440 IFN CCLSW,< TLNN IO,IOTLSN ;AND IF WE HAVE NOT SEEN A TITLE
\r
1441 PUSHJ PP,PRNAM ;THEN PRINT THE NAME>
\r
1442 NOUT2: PUSHJ PP,SQOZE ;CONVERT TO SIXBIT
\r
1443 JRST COUT ;DUMP AND EXIT
\r
1447 MOVE AC0,HHIGH ;GET HIGH SEG IF TWO SEGMENTS
\r
1448 MOVEI RC,1 ;RELOCATABL
\r
1449 PUSHJ PP,COUT ;OUTPUT IT
\r
1451 JRST COUT ;OUTPUT THE HIGHEST LOCATION>
\r
1453 VOUT: SKIPN RC,VECREL ;IS VECTOR ABSOLUTE ZERO?
\r
1454 SKIPE VECTOR ;ALSO CHECK RELOCATION
\r
1456 POPJ PP, ;YES, EXIT
\r
1457 MOVE AC0,VECTOR ;ACO SHOULD BE FLAGS
\r
1458 COUT: AOS C,COUTX ;INCREMENT INDEX
\r
1459 MOVEM AC0,COUTDB(C) ;STORE CODE
\r
1460 IDPB RC,COUTP ;STORE RELOCATION BITS
\r
1461 CAIE C,^D17 ;IS THE BUFFER FULL?
\r
1462 POPJ PP, ;NO, EXIT
\r
1464 COUTD: AOSG C,COUTX ;DUMP THE BUFFER
\r
1465 JRST COUTI ;BUFFER WAS EMPTY
\r
1466 HRL C,BLKTYP ;SET BLOCK TYPE
\r
1467 PUSHJ PP,OUTBIN ;OUTPUT COUNT AND TYPE
\r
1468 SETOB C,COUTY ;INITIALIZE INDEX
\r
1470 COUTD2: MOVE C,COUTDB(C) ;GET RELOCATION BITS/CODE
\r
1471 PUSHJ PP,OUTBIN ;DUMP IT
\r
1472 AOS C,COUTY ;INCREMENT INDEX
\r
1473 CAMGE C,COUTX ;TEST FOR END
\r
1474 JRST COUTD2 ;NO, GET NEXT WORD
\r
1476 COUTI: SETOM COUTX ;INITIALIZE BUFFER INDEX
\r
1477 SETZM COUTRB ;ZERO RELOCATION BITS
\r
1478 MOVE C,[POINT 2,COUTRB]
\r
1479 MOVEM C,COUTP ;INITIALIZE BIT POINTER
\r
1481 \fSTOWZ: MOVEI RC,0 ;USE STANDARD FORM
\r
1482 STOW: JUMP1 STOW20 ;SKIP TEST IF PASS ONE
\r
1483 TRNE RC,-2 ;RIGHT HALF ZERO OR 1?
\r
1484 PUSHJ PP,STOWT ;NO, HANDLE EXTERNAL
\r
1485 TLNN RC,-2 ;LEFT HALF ZERO OR 1? WFW
\r
1486 JRST STOW10 ;YES, SKIP TEST
\r
1487 MOVSS RC ;SWAP HALVES
\r
1488 PUSHJ PP,STOWT1 ;HANDLE EXTERNAL WFW
\r
1489 MOVSS RC ;RESTORE VALUES
\r
1491 STOW10: SKIPE EXTPNT ;ANY EXTERNALS REMAINING?
\r
1492 TRO ER,ERRE ;YES, SET EXTERNAL ERROR FLAG
\r
1494 STOW20: AOS AC1,STPX ;INCREMEMT POINTER
\r
1495 MOVEM AC0,STCODE(AC1) ;STOW CODE
\r
1496 MOVEM RC,STOWRC(AC1) ;STOW RELOCATION BITS
\r
1497 SKIPN LITLVL ;ARE WE IN LITERAL?
\r
1498 AOS LOCA ;NO, INCREMENT ASSEMBLY LOCATION
\r
1499 CAIGE AC1,.STP-1 ;OVERFLOW
\r
1500 POPJ PP, ;NO, EXIT
\r
1502 SKIPE LITLVL ;ARE WE IN A LITERAL?
\r
1503 TROA ER,ERRL ;YES, FLAG ERRRO BUT DON'T DUMP
\r
1504 JRST CHARL1 ;NO, SAVE REGISTERS AND DUMP THE BUFFER
\r
1505 JRST STOWI ;INITIALIZE BUFFER
\r
1507 DSTOW: AOS AC1,STPY ;INCREMENT POINTER
\r
1508 MOVE AC0,STCODE(AC1) ;FETCH CODE
\r
1509 MOVE RC,STOWRC(AC1) ;FETCH RELOCATION BITS
\r
1510 CAMGE AC1,STPX ;IS THIS THE END?
\r
1511 POPJ PP, ;NO, EXIT
\r
1512 STOWI: SETOM STPX ;INITIALIZE FOR INPUT
\r
1513 SETOM STPY ;INITIALIZE FOR OUTPUT
\r
1517 \fSVSTOW: AOS LITLVL ;NESTED LITERALS
\r
1518 PUSH PP,STPX ;MAKE ROOM FOR ANOTHER
\r
1524 GTSTOW: POP PP,STPY ;BACK UP A LEVEL
\r
1530 STOWT: HRRZ AC1,EXTPNT ;GET RIGHT POINTER
\r
1531 CAIN AC1,0(RC) ;DOES IT MATCH
\r
1532 JRST STOWT0 ;EXTERNAL OR RELOCATION ERROR
\r
1535 STOWT0: HLLZS EXTPNT
\r
1539 STOWT1: HLRZ AC1,EXTPNT ;GET LEFT HALF
\r
1540 CAIN AC1,0(RC) ;SEE ABOVE
\r
1544 STOWT2: HRRZS EXTPNT
\r
1546 \fONC: ILDB C,TABP ;ENTRY TO ADVANCE TAB POINTER
\r
1547 PUSHJ PP,OUTL ;OUTPUT A TAB
\r
1548 ;OUTPUT 6 OCT NUMBERS FROM CS LEFT
\r
1549 ONC1: MOVEI C,6 ;CONVERT TO ASCII
\r
1550 LSHC C,3 ;SHIFT IN OCTAL
\r
1551 PUSHJ PP,OUTL ;OUTPUT ASCII FROM C
\r
1552 TRNE CS,-1 ;ARE WE THROUGH?
\r
1553 JRST ONC1 ;NO, GET ANOTHER
\r
1555 TLNN CS,1 ;RELOCATABLE?
\r
1556 PUSHJ PP,OUTC ;OUTPUT IF EXTERN OR RELOCATABLE
\r
1562 PUSHJ PP,DNC ;RECURSE IF NON-ZERO
\r
1564 ADDI C,"0" ;FORM ASCII
\r
1565 JRST PRINT ;DUMP AND TEST FOR END
\r
1567 OUTAS0: HRLI CS,(POINT 7,,) ;ENTRY TO SET POINTER
\r
1568 OUTASC: ILDB C,CS ;GET NEXT BYTE
\r
1569 JUMPE C,POPOUT ;EXIT ON ZERO DELIMITER
\r
1573 OUTSIX: HRLI CS,(POINT 6,,) ;OUTPUT SIXBIT
\r
1574 ILDB C,CS ;GET SIXBIT
\r
1575 CAIN C,40 ;"@" DELIMITER?
\r
1576 POPJ PP, ;YES, EXIT
\r
1577 ADDI C,40 ;NO, FORM ASCII
\r
1578 PUSHJ PP,OUTL ;OUTPUTASCII CHAR FROM C
\r
1581 OUTSYM: MOVE CS,AC0 ;PLACE NAME IN CS
\r
1582 OUTSY1: MOVEI C,0 ;CLEAR C
\r
1583 LSHC C,6 ;MOVE NEXT SIXBIT CHARACTER IN
\r
1584 JUMPE C,OUTTAB ;TEST FOR END
\r
1585 ADDI C,40 ;CONVERT TO ASCII
\r
1586 PUSHJ PP,OUTL ;OUTPUT
\r
1588 \fOUTSET: AOS SX,0(PP) ;GET RETURN LOCATION
\r
1589 MOVE SX,-1(SX) ;GET XWD CODE
\r
1590 HLRM SX,BLKTYP ;SET BLOCK TYPE
\r
1592 PUSHJ PP,0(SX) ;GO TO PRESCRIBED ROUTINE
\r
1593 JRST COUTD ;TERMINATE BLOCK AND EXIT
\r
1595 ;LOOKUP SCANS ALL THE SYMBOLS IN THE SYMBOL TABLE
\r
1597 LOOKUP: POP PP,LOOKX ;INTERCEPT RETURN POP
\r
1599 MOVE SDEL,0(SX) ;SET FOR TABLE SCAN
\r
1600 LOOKL: SOJL SDEL,POPOUT ;TEST FOR END
\r
1603 PUSHJ PP,SRCH7 ;LOAD REGISTERS
\r
1605 PUSHJ PP,@LOOKX ;RETURN TO CALLING ROUTINE
\r
1606 JRST LOOKL ;TRY AGAIN
\r
1607 \fEND0: AOS LITLVL
\r
1624 PASS20: SETZM CTLSAV
\r
1626 PUSHJ PP,EOUT ;OUTPUT THE ENTRIES
\r
1628 XWD 6,NOUT ;OUTPUT THE HISEG BLOCK
\r
1630 HRRM BLKTYP ;SET FOR TYPE 1 BLOCK
\r
1631 TLZ FR,P1!MWLFLG ;SET FOR PASS 2 AND TURN OFF FLAG
\r
1632 TLO IO,IOPALL ;PUT THESE BACK
\r
1633 TLZ IO,IOPROG!IOCREF!DEFCRS ;SO LISTINGS WILL BE THE WAY THEY SHOULD
\r
1636 MOVE CS,[XWD $ST-1-$CKSM,R1BLDR]
\r
1650 DATAI PTR,@$TBL1-$RD+1($A)
\r
1651 XCT $TBL1-$RD+1($A)
\r
1652 XCT $TBL2-$RD+1($A)
\r
1654 $TBL1: CAME $CKSM,$ADR
\r
1663 IF2,< PURGE $ST,$RD,$A,$TBL1,$TBL2,$ADR,$CKSM>
\r
1664 \fENDP2: PUSHJ PP,COUTD ;DUMP THE BUFFER
\r
1671 TLNN IO,IOCREF ;CLOSE CREF IF NECESSARY
\r
1673 PUSHJ PP,CLSCR2 ;CLOSE IT UP
\r
1674 HRR ER,OUTSW ;SET OUTPUT SWITCH
\r
1677 PUSHJ PP,UOUT ;OUTPUT UNDEFINEDS
\r
1679 SKIPG C,ERRCNT ;GET ERROR COUNT AND CHECK FOR POSITIVE
\r
1681 IFN CCLSW,<ADDM C,JOBERR ;REMEMBER ERROR COUNT FOR EXECUTION DELETION>
\r
1684 CAIN C,1 ;1 IS A SPECIAL CASE
\r
1685 JRST ONERW ;PRINT MESSAGE
\r
1686 MOVEI C,"?" ;? FOR BATCH
\r
1687 PUSHJ PP,OUTL ;...
\r
1688 MOVE C,ERRCNT ;PRINT NUMBER OF ERRORS
\r
1690 SKIPA CS,[EXP ERRMS3] ;LOAD TO PRINT
\r
1691 ONERW: MOVEI CS,ERRMS2 ;ONE ERROR DECTECTED
\r
1692 ONERW1: PUSHJ PP,OUTSIX ;PRINT
\r
1694 NOERW: MOVEI CS,ERRMS1
\r
1695 TLNE IO,CRPGSW ;IF RPG, DON'T PRINT MESSAGE
\r
1696 TRZ IO,TTYSW ;NO TTY OUTPUT
\r
1697 IOR IO,OUTSW ;UNLESS NEEDED FOR LISTING
\r
1700 ENDP2D: PUSHJ PP,OUTCR
\r
1701 IFN CCLSW,<TLNE IO,CRPGSW ;IF RPG, DON'T PRINT PGM BREAK
\r
1702 TRZ IO,TTYSW ;...>
\r
1703 IFE CCLSW,< SKIPA ;SO PRGEND CODE CAN WORK>
\r
1706 MOVEI CS,[SIXBIT /PROGRAM BREAK IS @/]
\r
1709 HRLO CS,HHIGH ;GET PROGRAM BREAK
\r
1712 TLNE FR,RIMSW!R1BSW ;RIM MODE?
\r
1713 PUSHJ PP,RIMFIN ;YES, FINISH IT
\r
1716 XWD 2,SOUT ;OUTPUT THE SYMBOLS (BLKTYP-2)
\r
1718 XWD 7,VOUT ;OUTPUT TRANSFER VECTOR (..-7)
\r
1721 XWD 5,HOUT ;OUTPUT HIGHEST RELOCATABLE (..-5)>
\r
1724 RIMFIN: TLNE FR,R1BSW
\r
1733 \fSUBTTL PASS INITIALIZE
\r
1747 RCPNTR: POINT 1,ARG,^L<RELF>-18 ;POINT 1,ARG,22
\r
1748 \fSUBTTL PSEUDO-OP HANDLERS
\r
1750 TAPE0: PUSHJ PP,STOUTS
\r
1753 RADIX0: PUSHJ PP,EVAL10 ;EVALUATE RADIX D10
\r
1754 CAIG AC0,^D10 ;IF GREATER THAN 10
\r
1755 CAIG AC0,1 ;OR LESS THAN 2.
\r
1756 ERRAX: TROA ER,ERRA ;FLAG ERROR AND SKIP
\r
1757 HRR RX,AC0 ;SET NEW RADIX
\r
1760 IOSET: JUMP1 POPOUT ;NOSYM (IONSYM), XALL (IOPALL), XLIST (IOPROG)
\r
1761 HLRZ SX,AC0 ;STORE FLAGS
\r
1762 PUSHJ PP,STOUTS ;POLISH OFF LINE
\r
1763 TLOA IO,0(SX) ;NOW SUPPRESS PRINTING
\r
1764 IORSET: TDZ IO,AC0 ;RESET FLAG IOPALL/IOPROG
\r
1767 BLOCK0: PUSHJ PP,HIGHQ
\r
1768 PUSHJ PP,EVALEX ;EVALUATE
\r
1769 TRZE RC,-1 ;EXTERNAL OR RELOCATABLE?
\r
1770 PUSHJ PP,QEXT ;UPDATE ASSEMBLY LOCATION
\r
1771 ADDM AC0,LOCO ;SAVE START OF BLOCK
\r
1772 BLOCK1: EXCH AC0,LOCA ;UPDATE OUTPUT LOCATION
\r
1774 BLOCK2: HRLOM AC0,LOCBLK
\r
1780 PRINT0: MOVNI AC0,5
\r
1785 REMAR0: PUSHJ PP,GETCHR
\r
1789 \fLIT0: PUSHJ PP,BLOCK1
\r
1792 ;ON PASS ONE, WE JUST STEP THE LOCATION COUNTER AND CLEAR
\r
1803 LIT20: PUSH PP,LOCA
\r
1811 LIT20A: PUSHJ PP,STOUTS
\r
1813 LIT21: SOSGE LITNUM
\r
1815 MOVE AC0,-2(SX) ;WFW
\r
1816 MOVE RC,-1(SX) ;WFW
\r
1817 MOVE SX,0(SX) ;WFW POINTER TO THE NEXT LIT
\r
1818 PUSHJ PP,STOW20 ;STOW CODE
\r
1819 MOVEI C,12 ;SET LINE FEED
\r
1821 PUSHJ PP,OUTLIN ;OUTPUT THE LINE
\r
1823 \fLIT22: HRRZ AC2,LOCO
\r
1828 SUB AC2,LOCO ;COMPUTE LENGTH USED
\r
1829 CAMGE AC0,AC2 ;USE LARGER
\r
1832 LIT24: ADDM AC0,LOCA
\r
1836 LITI: SETZM LITCNT
\r
1841 GETTOP: HRRZ AC1,SX ;VARHD
\r
1848 SETZM 0(SX) ;CLEAR FORWARE LINK
\r
1849 HRRM SX,0(AC1) ;STORE ADDRESS IN LAST LINK
\r
1851 \fVAR0: PUSHJ PP,BLOCK1 ;PRINT LOCATION
\r
1855 VARA: MOVE SX,VARHDX
\r
1856 MOVE AC0,LOCA ;GET LOCATION FOR CHECK
\r
1857 JUMP1 VARB ;DO NOT CHECK START ON PASS 1
\r
1858 CAME AC0,-1(SX) ;CHECK START OF VAR AREA
\r
1859 TRO ER,ERRP ;AND GIVE ERROR
\r
1860 VARB: MOVEM AC0,-1(SX) ;SAVE START FOR PASS 2
\r
1868 PUSHJ PP,LOOKUP ;SET FOR TABLE SCAN
\r
1870 POPJ PP, ;NO, EXIT
\r
1871 TRZ ARG,UNDF ;TURN OFF FLAG NOW
\r
1872 MOVSI V,1 ;NUMBER TO ADD TO
\r
1873 ADDM V,0(AC1) ;UPDATE COUNT
\r
1874 VARA1: IOR ARG,MODA ;SET TO ASSEMBLY MODE
\r
1877 MOVSM ARG,0(SX) ;UPDATE 2ND WRD OF SYM TAB ENTRY
\r
1881 \fIF: PUSH PP,AC0 ;SAVE AC0
\r
1883 PUSHJ PP,EVALXQ ;EVALUATE AND TEST EXTERNAL
\r
1887 IFPOP: POP PP,AC1 ;RETRIEVE SKIP INSTRUCTION
\r
1888 IFSET: TLO IO,IORPTC ;REPEAT CHARACTER
\r
1889 IFXCT: XCT AC1 ;EXECUTE INSTRUCTION
\r
1890 TDZA AC0,AC0 ;FALSE
\r
1892 IFEXIT: JUMPOC REPEA1 ;BRANCH IF IN OP-CODE FIELD
\r
1893 IFEX1: PUSHJ PP,GETCHR ;SEARCH FOR "<"
\r
1894 CAIN C,EOL ;ERROR IF END OF LINE
\r
1898 JUMPE AC0,IFEX2 ;TEST FOR 0
\r
1899 TLO IO,IORPTC ;NO, PROCESS AS CELL
\r
1901 JRST STOW ;STOW CODE AND EXIT
\r
1904 HRRI AC0,P1 ;MAKE IT TLNX IO,P1
\r
1905 MOVE AC1,AC0 ;PLACE IT IN AC1
\r
1906 JRST IFSET ;EXECUTE INSTRUCTION
\r
1908 IFB0: HLLO AC1,AC0 ;FORM AND STORE TEST INSTRUCTION
\r
1909 IFB2: PUSHJ PP,CHARAC ;GET FIRST NON-BLANK
\r
1917 \fIFDEF0: HRRI AC0,UNDF ;MAKE IT TLNX ARG,UNDF
\r
1918 PUSH PP,AC0 ;STACK IT
\r
1919 PUSHJ PP,GETSYM ;TAKES SKIP RETURN IF SYM NAME IS LEGAL
\r
1920 TROA ER,ERRA ;ILLEGAL!
\r
1922 JRST [PUSHJ PP,OPTSCH
\r
1925 PUSHJ PP,SSRCH3 ;EMIT TO CREF ANYWAY
\r
1928 \fIFIDN0: HLRZS AC0
\r
1929 MOVEI V,2*.IFBLK-1
\r
1930 SETZM IFBLK(V) ;CLEAR COMPARISON BLOCK
\r
1932 MOVEI RC,IFBLK ;SET FOR FIRST BLOCK
\r
1933 PUSHJ PP,IFCL ;GET FIRST STRING
\r
1935 PUSHJ PP,IFCL ;GET SECOND STRING
\r
1937 MOVE SX,IFBLK(V) ;GET WORD FROM FIRST STRING
\r
1938 CAMN SX,IFBLKA(V) ;COMPARE WITH SECOND STRING
\r
1939 SOJGE V,.-2 ;EQUAL, TRY NEXT WORD
\r
1940 SKIPL V ;DID WE FINISH STRING
\r
1941 XORI AC0,1 ;NO, TOGGLE REQUEST
\r
1942 JRST IFEXIT ;DO NOT TURN ON IORPTC WFW
\r
1944 IFCL: HRLI RC,(POINT 7,,)
\r
1945 IFCL1: PUSHJ PP,CHARAC ;GET AND LIST CHARACTERS
\r
1946 CAIE C,74 ;SKIP SPACES
\r
1949 IFCL2: PUSHJ PP,CHARAC
\r
1956 IFEX2: PUSHJ PP,GETCHR
\r
1957 CAIN C,EOL ;EXIT WITH ERROR IF END OF LINE
\r
1960 AOJA IFEX2 ;YES, INCREMENT COUNT
\r
1962 JRST IFEX2 ;NO, TRY AGAIN
\r
1963 SOJGE IFEX2 ;YES, TEST FOR MATCH
\r
1964 PUSHJ PP,BYPAS1 ;YES, MOVE TO NEXT DELIMITER
\r
1965 AOJA AC0,STOWZ ;STOW ZERO
\r
1968 INTER0: HLLZM AC0,INTENT ;AC0 CONTAINS INTF/ENTF FLAGS
\r
1970 INTER1: PUSHJ PP,GETSYM ;GET A SYMBOL
\r
1971 JRST INTER3 ;INVALID, SKIP
\r
1972 PUSHJ PP,SSRCH ;SEARCH THE TABLE
\r
1973 MOVSI ARG,SYMF!INTF!UNDF
\r
1974 TLNE ARG,UNDF ;ALLOW FORWARD REFERENCE
\r
1976 TLNN ARG,SYNF!EXTF
\r
1977 TDOA ARG,INTENT ;SET APPROPRIATE FLAGS
\r
1978 INTER3: TROA ER,ERRA ;FLAG ARG EROR AND SKIP
\r
1979 PUSHJ PP,INSERQ ;INSERT/UPDATE
\r
1981 POPJ PP, ;NO, EXIT
\r
1982 \fEXTER0: PUSHJ PP,GETSYM ;GET A SYMBOL
\r
1983 JRST EXTER3 ;INVALID, ERROR
\r
1984 PUSHJ PP,SSRCH ;OK, SEARCH SYMBOL TABLE
\r
1985 JRST EXTER2 ;NOT THER, INSERT IT
\r
1986 TLNN ARG,EXTF!VARF!UNDF
\r
1987 TROA ER,ERRE ;FLAG ERROR AND BYPASS
\r
1988 TLNE ARG,EXTF ;VALID, ALREADY DEFINED
\r
1990 EXTER2: MOVEI V,2 ;NO, GET 2 CELLS FROM THE TREE
\r
1992 CAML V,SYMBOL ;HAVE WE RUN OUT OF CORE?
\r
1993 PUSHJ PP,XCEEDS ;YES, TRY TO BORROW SOME MORE
\r
1994 SUBI V,1 ;GET RIGHT CELL FOR POINTER
\r
1995 SETZB RC,0(V) ;ALL SET, ZERO VALUES
\r
1996 MOVSI ARG,SYMF!EXTF
\r
1997 PUSHJ PP,INSERT ;INSERT/UPDATE IT
\r
2000 MOVE ARG,-1(SX) ;GET THE SIXBIT FOR THE NAME
\r
2001 MOVEM ARG,1(V) ;AND STORE IT FOR ADDITIVE GLOBAL FIXUPS
\r
2002 EXTER3: JUMPCM EXTER0
\r
2004 \fEVAL10: PUSH PP,RX
\r
2006 PUSHJ PP,EVALEX ;EVALUATE
\r
2007 POP PP,RX ;RESET RADIX
\r
2008 JUMPE RC,POPOUT ;EXIT IF ABSOLUTE
\r
2010 QEXT: SKIPE EXTPNT ;ANY POSSIBILITIES?
\r
2011 TROA ER,ERRE ;YES, FLAG EXTERNAL ERROR
\r
2012 TRO ER,ERRR ;NO, FLAG RELOCATION ERROR
\r
2013 HLLZS RC ;CLEAR RELOCATION/EXTERNAL
\r
2016 EVALXQ: PUSHJ PP,EVALEX ;EVALUTE EXPRESSION
\r
2017 TLZN RC,-2 ;WAS AN EXTERNAL FOUND?
\r
2019 TRO ER,ERRE ;YES, FLAG ERROR
\r
2021 \fOPDEF0: PUSHJ PP,GETSYM ;GET THE FIRST SYMBOL
\r
2022 POPJ PP, ;ERROR IF INVALID SYMBOL
\r
2024 JRST ERRAX ;NO, ERROR
\r
2025 PUSH PP,AC0 ;STACK MNEMONIC
\r
2026 AOS LITLVL ;SHORT OUT LOCATION INCREMENT
\r
2027 PUSHJ PP,STMNT ;EVALUATE STATEMENT
\r
2028 PUSHJ PP,DSTOW ;GET AND DECODE VALUE
\r
2030 EXCH AC0,0(PP) ;EXCHANGE VALUE FOR MNEMONIC
\r
2031 PUSH PP,RC ;STACK RELOCATION
\r
2032 TLO IO,DEFCRS ;SAY WE ARE DEFINING IT
\r
2033 PUSHJ PP,MSRCH ;SEARCH SYMBOL TABLE
\r
2034 MOVSI ARG,OPDF ;NOT FOUND
\r
2035 POP PP,RC ;RESTORE VALUES
\r
2037 TLNE ARG,SYNF!MACF
\r
2038 JRST ERRAX ;YES "A" ERROR
\r
2039 PUSHJ PP,INSERT ;NO, INSERT/UPDATE
\r
2040 TLZ IO,DEFCRS ;JUST IN CASE
\r
2042 JRST STOWI ;BE SURE STOW IS RESET
\r
2045 DEPHA0: MOVE AC0,LOCO
\r
2046 SKIPA RC,MODO ;SET TO OUTPUT VALUES AND SKIP
\r
2047 PHASE0: PUSHJ PP,EVALXQ ;EVALUATE AND CHECK FOR EXTERNAL
\r
2048 MOVEM AC0,LOCA ;SET ASSEMBLY LOCATION COUNTER
\r
2051 \fASSIGN: JUMPAD ERRAX ;NO, ERROR
\r
2057 ASSIG1: PUSH PP,AC0
\r
2060 CAIN C,35 ;EQUALS?
\r
2061 TLOA AC0,NOOUTF ;YES, NOT OUT TO DDT WFW
\r
2063 MOVEM AC0,HDAS ;STORE THESE BITS WFW
\r
2065 PUSHJ PP,EVALEX ;EVALUATE EXPRESSION
\r
2066 EXCH AC0,0(PP) ;SWAP VALUE FOR SYMBOL
\r
2068 TRNN RC,-2 ;CHECK EXTERNAL AGREEMENT
\r
2074 ASSIG2: HLRZ RC,0(PP)
\r
2080 ASSIG3: TLO IO,DEFCRS
\r
2084 TLZA ARG,UNDF!VARF!40 ;CANCEL UNDEFINED AND VARIABLE FLAGS
\r
2085 ASSIG4: TRO ER,ERRE
\r
2086 SETZM EXTPNT ;FOR REST OF WORLD
\r
2087 TRNE ER,ERRORS-ERRQ
\r
2088 TLO ARG,UNDF ;YES,SO TURN UNDF ON
\r
2091 TLNE ARG,TAGF!EXTF
\r
2094 \fLOC0: PUSHJ PP,HIGHQ ;AC0=0,0
\r
2102 HRRZM AC0,LOCA ;SET ASSEMBLY LOCATION
\r
2103 HRRZM AC0,LOCO ;AND OUTPUT LOCATION
\r
2104 HLRZM AC0,MODA ;SET MODE
\r
2109 HISEG0: PUSHJ PP,HIGHQ ;SET CURRENT PROGRAM BREAK
\r
2110 PUSHJ PP,COUTD ;DUMP CURRENT TYPE OF BLOCK
\r
2114 PUSHJ PP,BYPAS1 ;GO GET EXPRESSION
\r
2116 PUSHJ PP,EVALXQ ;CHECK FOR EXTERNAL
\r
2117 HRRZM AC0,LOCA ;SET LOC COUNTERS
\r
2119 MOVEI RC,1 ;ASSUME RELOCATABLE
\r
2121 MOVEM RC,MODA ;SET MODES
\r
2126 \fHIGHQ: JUMP1 POPOUT
\r
2127 HIGHQ1: SKIPN MODO
\r
2129 MOVE V,LOCO ;GET ASSEMBLY LOCATION
\r
2130 CAMLE V,HHIGH ;IS IT GREATER THAN "HIGH"?
\r
2131 MOVEM V,HHIGH ;YES, REPLACE WITH LARGER VALUE
\r
2134 HIGHQ: JUMP1 POPOUT
\r
2135 HIGHQ1: MOVE V,LOCO
\r
2138 ONML: TLOA FR,MWLFLG ;MULTI-WORD LITERALS OK
\r
2139 OFFML: TLZ FR,MWLFLG
\r
2141 SUPRE0: PUSHJ PP,GETSYM ;GET A SYMBOL TO SUPRES
\r
2142 JRST SUPRE1 ;ERROR
\r
2143 PUSHJ PP,SSRCH ;SYMBOL ONLY
\r
2144 JRST SUPRE1 ;GIVE ERROR MESSAGE
\r
2145 TLOA ARG,SUPRBT ;SET THE SUPRESS BIT
\r
2146 SUPRE1: TROA ER,ERRA
\r
2147 IORM ARG,(SX) ;PUT BACK
\r
2149 SUPRS1: SETZM EXTPNT
\r
2152 SUPRSA: PUSHJ PP,LOOKUP ;SUPRESS ALL
\r
2155 SETZM EXTPNT ;JUST IN CASE
\r
2158 \fTITLE0: JUMP2 REMAR0
\r
2161 PUSHJ PP,SUBTT1 ;GO READ IT
\r
2162 TLOE IO,IOTLSN ;HAVE WE SEEN ONE
\r
2163 IFE CCLSW,<TRO ER,ERRM ;YES, COMPLAIN>
\r
2164 IFN CCLSW,<TROA ER,ERRM ;YES, MESSAGE
\r
2165 JRST PRNAM ;PRINT NAME IF FIRST ONE>
\r
2166 POPJ PP, ;EXIT OTHERWISE
\r
2168 SUBTT0: JUMP1 REMAR0 ;OTHERWISE EXIT IF PASS ONE
\r
2171 SUBTT1: PUSHJ PP,BYPAS1 ;BYPASS LEADING BLANKS
\r
2173 SUBTT3: PUSHJ PP,CHARAC ;GET ASCII CHARACTER
\r
2174 IDPB C,AC0 ;STORE IN BLOCK
\r
2175 CAIGE C,40 ;TEST FOR TERMINATOR
\r
2177 SOJGE SX,SUBTT3 ;TEST FOR BUFFER FULL
\r
2178 DPB RC,AC0 ;END, STORE TERMINATOR
\r
2181 PRNAM: TLNN IO,CRPGSW ;NOT IF NOT RPG
\r
2183 MOVE AC0,[POINT 7,TBUF]
\r
2184 MOVE SX,[POINT 7,OTBUF]
\r
2185 MOVEI RC,6 ;MAX OF SIX CHRS
\r
2187 CAILE C," " ;CHECK FOR LEGAL
\r
2188 CAILE C,"Z"+40 ;CHECK AGAINST LOWER CASE Z
\r
2190 IDPB C,SX ;PUT IN OUTPUT BUFFER
\r
2191 SOJG RC,PN1 ;GET MORE
\r
2193 IDPB C,SX ;TERMINATOR
\r
2201 \fSYN0: PUSHJ PP,GETSYM ;GET THE FIRST SYMBOL
\r
2202 JRST ERRAX ;ERROR, EXIT
\r
2203 PUSHJ PP,MSRCH ;TRY FOR MACRO/OPDEF
\r
2204 JRST SYN3 ;NO,0THRY FOR OPERAND
\r
2205 SYN1: MOVEI SX,MSRCH ;YES, SET FLAG
\r
2206 SYN2: PUSHJ PP,SAVEXS ;SAVE REGISTERS
\r
2207 JUMPNC ERRAX ;ERROR IF NO COMMA
\r
2208 PUSHJ PP,GETSYM ;GET THE SECOND SYMBOL
\r
2210 PUSHJ PP,@SAVBLK+SX ;SEARCH FOR SECOND SYMBOL
\r
2212 MOVE ARG,SAVBLK+ARG ;GET VALUES
\r
2215 TLNE ARG,MACF ;MACRO?
\r
2216 PUSHJ PP,REFINC ;YES, INCREMENT REFERENCE
\r
2217 JRST INSERT ;INSERT AND EXIT
\r
2219 SYN3: PUSHJ PP,SSRCH ;SEARCH FOR OPERAND
\r
2220 JRST SYN4 ;NOT FOUND, EXIT WITH ERROR
\r
2221 TLO ARG,SYNF ;FLAG AS SYNONYM
\r
2222 TLNE ARG,EXTF ;EXTERNAL?
\r
2223 HRRZ V,ARG ;YES, RELPACE WITH POINTER
\r
2224 MOVEI SX,SSRCH ;SET FLAG
\r
2227 SYN4: PUSHJ PP,OPTSCH ;SEARCH FOR OP-CODE
\r
2228 JRST ERRAX ;NOT FOUND, EXIT WITH ERROR
\r
2229 MOVSI ARG,SYNF ;FLAG AS SYNONYM
\r
2231 \fPURGE0: PUSHJ PP,GETSYM ;GET A MNEMONIC
\r
2233 PUSHJ PP,MSRCH ;SEARCH MACRO SYMBOL TABLE
\r
2234 JRST PURGE2 ;NOT FOUND, TRY SYMBOLS
\r
2235 TLNE ARG,MACF ;MACRO?
\r
2236 PUSHJ PP,REFDEC ;YES, DECREMENT THE REFERENCE
\r
2237 JRST PURGE4 ;REMOVE SYMBOL FROM TABLE
\r
2239 PURGE2: PUSHJ PP,SSRCH ;TRY OPERAND SYMBOL TABLE
\r
2240 JRST PURGE3 ;NOT FOUND GET NEXT SYMBOL
\r
2241 TRNN RC,-2 ;CHECK COMPLEX EXTERNAL
\r
2246 TLNE ARG,EXTF!UNDF ;ERROR IF EXTERNAL OR UNDEFINED
\r
2247 TLNE ARG,SYNF ;BUT NOT A SYNONYM
\r
2249 PURGE3: TROA ER,ERRA ;NOT FOUND, ERROR
\r
2250 PURGE4: PUSHJ PP,REMOVE ;REMOVE FROM THE SYMBOL TABLE
\r
2251 PURGE5: JUMPCM PURGE0
\r
2253 \fOPD1: MOVE AC0,V ;PUT VALUE IN AC0
\r
2255 OPD: SKIPA 2,[POINT 4,0(PP),12]
\r
2256 IOP: MOVSI AC2,(POINT 9,0(PP),11)
\r
2258 PUSH PP,AC0 ;STACK CODE
\r
2260 PUSHJ PP,EVALEX ;EVALUATE FIRST EXPRESSION
\r
2266 SKIPE RC ;EXTERNAL OR RELOCATABLE?
\r
2267 PUSHJ PP,QEXT ;YES, DETERMINE WHICH AND FLAG AN ERROR
\r
2268 OP1A: PUSHJ PP,EVALEX ;GET ADDRESS PART
\r
2269 OP2: PUSHJ PP,EVADR ;EVALUATE STANDARD ADDRESS
\r
2270 OP3: POP PP,AC0 ;PUT IN AC0
\r
2272 JRST STOW ;NO,STOW CODE AND EXIT
\r
2273 \fEVADR: TLCE AC0,-1 ;OK IF ALL 0'S
\r
2276 TRO ER,ERRQ ;NO,FLAG Q ERROR
\r
2277 ADD AC0,-1(PP) ;ADD ADDRESS PORTIONS
\r
2278 HLL AC0,-1(PP) ;GET LEFT HALF
\r
2279 TLZE FR,INDSW ;INDIRECT BIT?
\r
2281 MOVEM AC0,-1(PP) ;RE-STACK CODE
\r
2282 ADD RC,-2(PP) ;UPDATE RELOCATION
\r
2283 HRRM RC,-2(PP) ;USE HALF WORD ADD
\r
2285 POPJ PP, ;NO, EXIT
\r
2287 PUSHJ PP,EVALEX ;EVALUATE
\r
2289 MOVSS V,AC0 ;SWAP HALVES
\r
2291 IOR SX,V ;MERGE RELOCATION
\r
2292 TRNN SX,-1 ;RIGHT HALF ZERO?
\r
2293 JRST OP2A ;YES, DO SIMPLE ADD
\r
2294 MOVE ARG,RC ;NO, SWAP RC INTO ARG
\r
2295 ADD V,-1(PP) ;ADD RIGHT HALVES
\r
2297 HRRM V,-1(PP) ;UPDATE WITHOUT CARRY
\r
2299 HLLZS AC0 ;PREPARE LEFT HALVES
\r
2301 TLNE SX,-1 ;IS LEFT HALF ZERO?
\r
2302 TRO ER,ERRQ ;NO FLAG FORMAT ERROR
\r
2303 OP2A: ADDM AC0,-1(PP) ;MERGE WITH PREVIOUS VALUE
\r
2306 JRST ERRAX ;NO, FLAG ERROR
\r
2307 JRST BYPAS1 ;YES, BYPASS PARENTHESIS
\r
2309 EXPRES: HRLZ AC0,RX ;FUDGE FOR OCT0
\r
2313 OCT1: PUSHJ PP,EVALEX ;EVALUATE
\r
2314 PUSHJ PP,STOW ;STOW CODE
\r
2316 POP PP,RX ;YES, RESTORE RADIX
\r
2318 \fSIXB10: MOVSI RC,(POINT 6,AC0);SET UP POINTER
\r
2319 MOVEI AC0,0 ;CLEAR WORD
\r
2321 SIXB20: PUSHJ PP,CHARL ;GET NEXT CHARACTER
\r
2322 CAMN C,SX ;IS THIS PRESET DELIMITER?
\r
2327 SUBI C,40 ;CONVERT LOWER CASE TO SIXBIT
\r
2328 SUBI C,40 ;CONVERT TO SIXBIT
\r
2329 JUMPL C,ASC55 ;TEST FOR INVALID CHARACTER
\r
2330 IDPB C,RC ;NO, DEPOSIT THE BYTE
\r
2331 TLNE RC,770000 ;IS THE WORD FULL?
\r
2332 JRST SIXB20 ;NO, GET NEXT CHARACTER
\r
2333 PUSHJ PP,STOWZ ;YES, STORE
\r
2334 JRST SIXB10 ;GET NEXT WORD
\r
2335 \fASCII0: HLLZ SDEL,AC0 ;STORE ASCII/ASCIZ FLAG
\r
2336 ASC10: PUSHJ PP,CHARL ;GET FIRST NON-BLANK
\r
2340 CAIG C,CR ;CHECK FOR CRRET AS DELIM
\r
2349 MOVE SX,C ;SAVE FOR COMPARISON
\r
2350 JUMPG SDEL,SIXB10 ;BRANCH IF SIXBIT
\r
2352 ASC20: MOVSI RC,(POINT 7,AC0) ;SET UP POINTER
\r
2353 MOVEI AC0,0 ;CLEAR WORD
\r
2354 ASC30: PUSHJ PP,CHARL ;GET ASCII CHARACTER AND LIST
\r
2355 CAMN C,SX ;TEST FOR DELIMITER
\r
2357 IDPB C,RC ;DEPOSIT BYTE
\r
2358 TLNE RC,760000 ;HAVE WE FINISHED WORD?
\r
2359 JRST ASC30 ;NO,GET NEXT CHARACTER
\r
2360 PUSHJ PP,STOWZ ;YES, STOW IT
\r
2361 JRST ASC20 ;GET NEXT WORD
\r
2363 ASC50: TDZA RC,SDEL ;TEST FOR ASCIIZ
\r
2364 ASC55: TROA ER,ERRA ;SIXBIT FOUND EXIT
\r
2365 ASC60: PUSHJ PP,BYPAS1 ;POLISH OFF TERMINATE
\r
2366 SETZM INTXT ;WE ARE OUT OF IT
\r
2367 ANDCM RC,STPX ;STORE AT LEAST ONE WORD
\r
2368 JUMPGE RC,STOWZ ;STOW
\r
2369 POPJ PP, ;ASCII, NO BYTES STORED, SO EXIT
\r
2370 \fPOINT0: PUSH PP,RC ;STACK REGISTERS
\r
2372 PUSHJ PP,EVAL10 ;EVALUATE RADIX 10
\r
2373 DPB AC0,[POINT 6,0(PP),11] ;STORE BYTE SIZE
\r
2375 PUSHJ PP,EVALEX ;NO, GET ADDRESS
\r
2376 PUSHJ PP,EVADR ;EVALUATE STANDARD ADDRESS
\r
2378 PUSHJ PP,EVAL10 ;EVALUATE RADIX 10
\r
2379 TLNE IO,NUMSW ;IF NUMERIC
\r
2380 TDCA AC0,[-1] ;POSITION=D35-RHB
\r
2381 POINT2: MOVEI AC0,0 ;OTHERWISE SET TO D36
\r
2384 ADDM AC0,0(PP) ;UPDATE VALUE
\r
2386 \fXWD0: PUSH PP,RC
\r
2387 PUSH PP,AC0 ;STORE ZERO ON STACK
\r
2388 PUSHJ PP,EVALEX ;EVALUATE EXPRESSION
\r
2390 HRLM AC0,0(PP) ;SET LEFT HALF
\r
2393 JRST OP1A ;EXIT THROUGH OP
\r
2395 IOWD0: PUSHJ PP,EVALXQ ;EVALUATE AND TEST FOR EXTERNAL
\r
2397 SOJA AC0,STOW ;NO, TREAT AS RIGHT HALF
\r
2398 PUSH PP,AC0 ;YES, STACK LEFT HALF
\r
2399 PUSHJ PP,EVALEX ;WFW
\r
2401 POP PP,AC1 ;RETRIEVE LEFT HALF
\r
2404 JRST STOW ;STOW CODE AND EXIT
\r
2405 \fBYTE0: PUSHJ PP,BYPAS1 ;GET FIRST NON-BLANK
\r
2407 JRST ERRAX ;NO, FLAG ERROR AND EXIT
\r
2409 PUSH PP,AC0 ;INITIALIZE STACK TO ZERO
\r
2410 MOVSI ARG,(POINT -1,(PP))
\r
2412 BYTE1: PUSH PP,ARG
\r
2413 PUSHJ PP,EVAL10 ;EVALUATE RADIX 10
\r
2415 CAIG AC0,^D36 ;TEST SIZE
\r
2418 DPB AC0,[POINT 6,ARG,11] ;STORE BYTE SIZE
\r
2420 BYTE2: IBP ARG ;INCREMENT BYTE
\r
2421 TRZN ARG,-1 ;OVERFLOW?
\r
2424 EXCH AC0,0(PP) ;GET CURRENT VALUES
\r
2425 EXCH RC,-1(PP) ;AND STACK ZEROS
\r
2426 PUSHJ PP,STOW ;STOW FULL WORD
\r
2428 BYTE3: PUSH PP,ARG
\r
2429 PUSHJ PP,EVALEX ;COMPUTE NEXT BYTE
\r
2431 DPB AC0,ARG ;STORE BYTE
\r
2437 JRST BYTE1 ;YES, GET NEW BYTE SIZE
\r
2438 JRST OP3 ;NO, EXIT
\r
2439 \fRADX50: PUSHJ PP,EVALEX ;EVALUATE CODE
\r
2440 JUMPN RC,ERRAX ;ERROR IF NOT ABSOLUTE
\r
2443 PUSHJ PP,GETSYM ;YET, GET SYMBOL
\r
2445 PUSHJ PP,SQOZE ;SQUOZE SIXBIT AND ADD CODE
\r
2446 JRST STOW ;STOW CODE AND EXIT
\r
2449 SQOZE: MOVE AC1+1,AC0 ;PUT SIXBIT IN AC1+1
\r
2450 MOVEI AC0,0 ;CLEAR RESULT
\r
2451 SQOZ1: MOVEI AC1,0
\r
2452 LSHC AC1,6 ;PUT 6-BIT CHARACTER IN AC1
\r
2453 LDB AC1,[POINT 6,CSTAT(AC1),23] ;CONVERT TO RADIX50
\r
2454 IMULI AC0,50 ;MULTIPLY PREVIOUS RESULT
\r
2455 ADD AC0,AC1 ;ADD NEW CHARACTER
\r
2456 JUMPN AC1+1,SQOZ1 ;TEST FOR END
\r
2457 LSH ARG,^D30 ;LEFT-JUSTIFY CODE
\r
2458 IOR AC0,ARG ;MERGE WITH RESULT
\r
2460 \fSUBTTL MACRO/REPEAT HANDLERS
\r
2462 REPEA0: PUSHJ PP,EVALXQ ;EVALUATE REPEAT EXP, EXTERNS ARE ILL
\r
2465 REPEA1: JUMPLE AC0,REPZ ;PASS THE EXP., DONT PROCESS
\r
2466 SOJE AC0,REPO ;REPEAT ONCE
\r
2467 REPEA2: PUSHJ PP,GCHARQ ;GET STARTING "<"
\r
2470 PUSHJ PP,SKELI1 ;INITIALZE SKELETON
\r
2473 PUSH MP,REPPNT ;STACK PREVIOUS REPEAT POINTER
\r
2474 MOVEM ARG,REPPNT ;STORE NEW POINTER
\r
2475 TDZA SDEL,SDEL ;YES, INITIALIZE BRACKET COUNT AND SKIP
\r
2477 REPEA4: PUSHJ PP,WCHARQ ;WRITE A CHARACTER
\r
2478 PUSHJ PP,GCHARQ ;GET A CHARACTER
\r
2480 AOJA SDEL,REPEA4 ;YES, INCREMENT AND WRITE
\r
2482 JRST REPEA4 ;NO, WRITE THE CHARACTER
\r
2483 SOJGE SDEL,REPEA4 ;YES, WRITE IF NON-NEGATIVE COUNT
\r
2484 MOVSI CS,(BYTE (7) 177,3) ;SET "REPEAT" END
\r
2485 PUSHJ PP,WWRXE ;WRITE END
\r
2486 PUSH MP,MRP ;STACK PREVIOUS READ POINTER
\r
2487 REPEA5: HLRZ MRP,@REPPNT
\r
2488 REPEA8: MOVEI C,LF
\r
2491 REPEND: SOSL REPEXP
\r
2493 HRRZ V,REPPNT ;GET START OF TREE
\r
2494 PUSHJ PP,REFDEC ;DECREMENT REFERENCE
\r
2499 \fREPZ: MOVE SDEL,SEQNO2
\r
2504 MOVEI SDEL,0 ;SET COUNT
\r
2505 REPZ1: PUSHJ PP,GCHAR ;GET NEXT CHARACTER
\r
2507 AOJA SDEL,REPZ1 ;YES, INCREMENT COUNT
\r
2509 SOJLE SDEL,REPZ2 ;YES, EXIT IF MATCHING
\r
2510 JRST REPZ1 ;NO, RECYCLE
\r
2511 REPZ2: SETZM INREP
\r
2514 REPO: PUSHJ PP,GCHAR ;GET "<"
\r
2517 SKIPE RPOLVL ;ARE WE NESTED?
\r
2518 AOS RPOLVL ;YES, DECREMENT CURRENT
\r
2531 \fDEFIN0: PUSHJ PP,GETSYM ;GET MACRO NAME
\r
2532 JRST ERRAX ;EXIT ON ERROR
\r
2533 MOVEM PP,PPTMP1 ;SAVE POINTER
\r
2534 MOVEM AC0,PPTMP2 ;SAVE NAME
\r
2542 DEF02: PUSHJ PP,GCHAR
\r
2547 DEF10: PUSHJ PP,GETSYM ;YES, GET DUMMY SYMBOL
\r
2548 TRO ER,ERRA ;FLAG ERROR
\r
2549 ADDI SX,1000 ;INCREMENT ARG COUNT
\r
2550 PUSH PP,AC0 ;STACK IT
\r
2552 JRST DEF10 ;NO, GET NEXT DUMMY SYMBOL
\r
2553 DEF12: PUSHJ PP,GCHAR
\r
2556 DEF20: PUSH PP,[0] ;YES, MARK THE LIST
\r
2558 PUSHJ PP,SKELI ;INITIALIZE MACRO SKELETON
\r
2559 MOVE AC0,PPTMP2 ;GET NAME
\r
2562 PUSHJ PP,MSRCH ;SEARCH THE TABLE
\r
2563 JRST DEF24 ;NOT FOUND
\r
2564 TLNN ARG,MACF ;FOUND, IS IT A MACRO?
\r
2565 TROA ER,ERRX ;NO, FLAG ERROR AND SKIP
\r
2566 PUSHJ PP,REFDEC ;YES, DECREMENT THE REFERENCE
\r
2567 DEF24: HRRZ V,WWRXX ;GET START OF TREE
\r
2569 PUSHJ PP,INSERT ;INSERT/UPDATE
\r
2570 TLZ IO,DEFCRS ;JUST IN CASE
\r
2571 TDZA SDEL,SDEL ;CLEAR BRACKET COUNT
\r
2572 \fDEF30: PUSHJ PP,WCHAR ;WRITE CHARACTER
\r
2573 DEF31: PUSHJ PP,GCHAR ;GET A CHARACTER
\r
2574 DEF32: MOVE CS,C ;GET A COPY
\r
2575 CAIG CS,"Z"+40 ;CONVERT LOWER CASE
\r
2581 JRST DEF30 ;TEST FOR SPECIAL
\r
2582 MOVE CS,CSTAT-40(CS) ;GET STATUS BITS
\r
2583 TLNE CS,6 ;ALPHA-NUMERIC?
\r
2589 CAIE C,47 ;IS THIS A '?
\r
2592 CPEEK1: PUSHJ PP,WCHAR
\r
2597 \fDEF40: MOVEI AC0,0 ;CLEAR ATOM
\r
2598 MOVSI AC1,(POINT 6,AC0) ;SET POINTER
\r
2602 PUSHJ PP,GCHAR ;GET NEXT CHARACTER
\r
2607 SUBI CS,40 ;CONVERT LOWER TO UPPER
\r
2610 JRST DEF44 ;TEST SPECIAL
\r
2611 MOVE CS,CSTAT-40(CS) ;GET STATUS
\r
2612 TLNE CS,6 ;ALPHA-NUMERIC?
\r
2613 JRST DEF42 ;YES, GET ANOTHER
\r
2614 DEF44: PUSH PP,[0] ;NO, MARK THE LIST
\r
2615 MOVE SX,PPTMP1 ;GET POINTER TO TP
\r
2617 DEF46: SKIPN 1(SX) ;END OF LIST?
\r
2619 CAME AC0,1(SX) ;NO, DO THEY COMPARE
\r
2620 AOJA SX,DEF46 ;NO, TRY AGAIN
\r
2621 SUB SX,PPTMP1 ;YES, GET DUMMY SYMBOL NUMBER
\r
2623 MOVSI CS,0776020(SX) ;(<BYTE (7) 177,101>)(SX) ;SET ESCAPE CODE MACEND
\r
2626 TLO CS,1000 ;YES, SET CRESYM FLAG
\r
2627 PUSHJ PP,WWORD ;WRITE THE WORD
\r
2628 DEF48: MOVE PP,PPTMP2 ;RESET PUSHDOWN POINTER
\r
2629 TLO IO,IORPTC ;ECHO LAST CHARACTER
\r
2632 DEF51: MOVE C,2(SX) ;GET CHARACTER
\r
2633 JUMPE C,DEF48 ;CLEAN UP IF END
\r
2634 PUSHJ PP,WCHAR ;WRITE THE CHARACTER
\r
2635 AOJA SX,DEF51 ;GET NEXT
\r
2637 DEF70: MOVE PP,PPTMP1 ;RESTORE PUSHDOWN POINTER
\r
2638 MOVSI CS,(BYTE (7) 177,1)
\r
2639 PUSHJ PP,WWRXE ;WRITE END
\r
2640 SETZM INDEF ;OUT OF IT
\r
2642 \fSUBTTL MACRO CALL PROCESSOR
\r
2643 CALLM: SKIPGE MACENL ;ARE WE TRYING TO RE-ENTER?
\r
2644 JRST ERRAX ;YES, BOMB OUT WITH ERROR
\r
2645 HRROS MACENL ;FLAG "CALLM IN PROGRESS"
\r
2647 PUSH MP,V ;STACK FOR REFDEC
\r
2654 AOS SDEL,0(V) ;INCREMENT ARG COUNT
\r
2655 LSHC SDEL,-^D<9+36> ;ZERO SDEL, GET ARG COUNT IN SX
\r
2657 PUSH PP,V ;STORE COUNT OF ARGS
\r
2658 PUSH PP,RP ;STACK FOR MACPNT
\r
2659 JUMPE SX,MAC20 ;TEST FOR NO ARGS
\r
2662 TROA SDEL,-1 ;YES, END OF ARGUMENT STRING
\r
2664 MAC10: PUSHJ PP,GCHAR
\r
2670 JRST MAC21 ;YES, END OF ARGUMENT STRING
\r
2671 PUSHJ PP,SKELI1 ;NO, INITIALIZE SKELETON
\r
2673 JRST MAC30 ;YES, PROCESS AS SPECIAL
\r
2677 MAC14: CAIN C,"," ;","?
\r
2678 JRST MAC16 ;YES, NULL SYMBOL
\r
2680 ADDI SDEL,1 ;YES, INCREMENT COUNT
\r
2682 SOJL SDEL,MAC16 ;YES, TEST FOR END
\r
2683 PUSHJ PP,WCHAR ;WRITE INTO SKELETON
\r
2684 MAC14A: PUSHJ PP,CHARAC ;GET NEXT CHARACTER
\r
2688 JRST MAC15 ;TEST FOR END OF LINE
\r
2690 JRST MAC14 ;YES, END OF LINE
\r
2692 MAC15: TLO IO,IORPTC
\r
2693 MAC16: MOVSI CS,(BYTE (7) 177,2)
\r
2694 PUSHJ PP,WWRXE ;WRITE END
\r
2698 SOJG SX,MAC10 ;BRANCH IF NO MORE ARGS
\r
2699 \fMAC20: TLZN IO,IORPTC
\r
2702 MAC21A: PUSH MP,[-1] ;NO MISSING ARGS
\r
2711 PUSHJ PP,STOUT ;LIST COMMOENT OR CR-LF
\r
2712 TLNE IO,IOPALL ;MACRO EXPANSION SUPPRESSION?
\r
2713 TLO IO,IOMAC ; NO, SET TEMP BIT
\r
2714 TDOA C,[-1] ;FLAG LAST CHARACTER
\r
2715 MAC24: DPB SX,LBUFP
\r
2719 PUSH MP,MRP ;STACK WORD COUNT
\r
2720 POP PP,MRP ;STACK MACRO POINTER
\r
2723 HRRZS MACENL ;RESET "CALLM IN PROGRESS"
\r
2724 JUMPOC STMNT2 ;OP-CODE FIELD
\r
2725 JRST EVATOM ;ADDRESS FIELD
\r
2727 \fMAC30: MOVEI AC0,0 ;INITIALIZE BRACKET COUNTER
\r
2728 MAC31: PUSHJ PP,GCHAR ;GET A CHARACTER
\r
2730 ADDI AC0,1 ;YES, INCREMENT COUNT
\r
2732 SOJL MAC14A ;YES, EXIT IF MATCHING
\r
2733 PUSHJ PP,WCHAR ;WRITE INTO SKELETON
\r
2734 JRST MAC31 ;GO BACK FOR ANOTHER
\r
2736 MAC40: PUSH PP,SX ;STACK REGISTERS
\r
2738 HLLM IO,TAGINC ;SAVE IO FLAGS
\r
2739 PUSHJ PP,CELL ;GET AN ATOM
\r
2740 MOVE V,AC0 ;ASSUME NUMERIC
\r
2741 TLNE IO,NUMSW ;GOOD GUESS?
\r
2743 PUSHJ PP,SSRCH ;SEARCH THE SYMBOL TABLE
\r
2744 TROA ER,ERRX ;NOT FOUND, ERROR
\r
2745 MAC41: PUSHJ PP,MAC42 ;FORM ASCII STRING
\r
2746 HLL IO,TAGINC ;RESTORE IO FLAGS
\r
2749 TLO IO,IORPTC ;REPEAT LAST CHARACTER
\r
2750 JRST MAC14A ;RETURN TO MAIN SCAN
\r
2753 MAC44: LSHC C,-^D35
\r
2755 DIVI C,0(RX) ;DIVIDE BY CURRENT RADIX
\r
2757 SKIPE C ;TEST FOR END
\r
2760 ADDI C,"0" ;FORM TEXT
\r
2761 JRST WCHAR ;WRITE INTO SKELETON
\r
2762 \fMACEN0: SOS MACENL
\r
2763 MACEND: SKIPGE C,MACENL ;TEST "CALLM IN PROGRESS"
\r
2764 AOS MACENL ;INCREMENT END LEVEL AND EXIT
\r
2767 POP MP,MRP ;RETRIEVE READ POINTER
\r
2769 SKIPL 0(MP) ;TEST FLAG
\r
2770 PUSHJ PP,RSW2 ;MARK END OF SUBSTITUTION
\r
2773 SKIPA MP,MACPNT ;RESET MP AND SKIP
\r
2774 MACEN1: PUSHJ PP,REFDEC ;DECREMENT REFERENCE
\r
2775 MACEN2: AOS V,MACPNT ;GET POINTER
\r
2777 JUMPG V,MACEN1 ;IF >0, DECREMENT REFERENCE
\r
2778 JUMPL V,MACEN2 ;IF <0, BYPASS
\r
2779 POP MP,V ;IF=0, RETRIEVE POINTER
\r
2780 PUSHJ PP,REFDEC ;DECREMENT REFERENCE
\r
2785 SKIPE MACENL ;CHECK UPROCESSED END LEVEL
\r
2786 JUMPE CS,MACEN0 ;THEN POP THE MACRO STACK NOW
\r
2787 JUMPL C,REPEA8 ;IF FLAG SET SUBSTITUTE
\r
2789 \fIRP0: SKIPN MACLVL ;ARE WE IN A MACRO
\r
2790 JRST ERRAX ;NO, BOMB OUT
\r
2791 IRP10: PUSHJ PP,MREADS ;YES, GET DATA SPEC
\r
2792 CAIE C,40 ;SKIP LEADING BLANKS
\r
2794 JRST IRP10 ;YES, BYPASS
\r
2797 CAIE C,177 ;NO, IS IT SPECIAL?
\r
2798 JRST ERRAX ;NO, ERROR
\r
2799 PUSHJ PP,MREADS ;YES
\r
2800 TRZN C,100 ;CREATED?
\r
2802 CAIL C,40 ;TOO BIG?
\r
2804 ADD C,MACPNT ;NO, FORM POINTER TO STACK
\r
2805 PUSH MP,IRPCF ;STACK PREVIOUS POINTERS
\r
2813 MOVEM AC0,IRPCF ;IRPC FLAG FOUND IN AC0
\r
2814 SETOM AC0,IRPSW ;RESET IRP SWITCH
\r
2819 JRST .-2 ;NO, SEARCH UNTIL FOUND
\r
2820 PUSHJ PP,SKELI1 ;INITIALIZE NEW STRING
\r
2821 MOVEM ARG,IRPPOI ;SET NEW POINTER
\r
2823 TDZA SDEL,SDEL ;ZERO BRACKET COUNT AND SKIP
\r
2824 IRP20: PUSHJ PP,WCHAR
\r
2827 AOJA SDEL,IRP20 ;YES, INCREMENT COUNT AND WRITE
\r
2829 JRST IRP20 ;NO, JUST WRITE IT
\r
2830 SOJGE SDEL,IRP20 ;YES, WRITE IF NOT MATCHING
\r
2831 MOVE CS,[BYTE (7) 15,177,4]
\r
2832 PUSHJ PP,WWRXE ;WRITE END
\r
2833 PUSH MP,MRP ;STACK PREVIOUS READ POINTER
\r
2835 JRST IRPPOP ;EXIT IF NOT VALID ARGUMENT
\r
2836 HLRZ C,0(CS) ;INITIALIZE POINTER
\r
2838 \fIRPSET: EXCH MRP,IRPARG ;SWAP READ POINTERS
\r
2839 PUSHJ PP,SKELI1 ;INITIALIZE SKELETON FOR DATA
\r
2840 HRRZM ARG,@IRPARP ;STORE NEW DS POINTER
\r
2841 SETZB SX,SDEL ;ZERO FOUND FLAG AND BRACKET COUNT
\r
2842 IRPSE1: PUSHJ PP,MREADS
\r
2843 CAIE C,177 ;SPECIAL?
\r
2844 AOJA SX,IRPSE2 ;NO, FLAG AS FOUND
\r
2846 PUSHJ PP,MREADS ;LOOK AT NEXT CHARACTER
\r
2848 SETZM IRPSW ;SET IRP SWITCH
\r
2849 JUMPG SX,IRPSE4 ;IF ARG FOUND, PROCESS IT
\r
2850 JRST IRPPOP ;NO, CLEAN UP AND EXIT
\r
2852 IRPSE2: SKIPE IRPCF ;IRPC?
\r
2853 JRST IRPSE3 ;YES, WRITE IT
\r
2854 CAIN C,"," ;NO, IS IT A COMMA?
\r
2855 JUMPE SDEL,IRPSE4 ;YES, EXIT IF NOT NESTED
\r
2857 ADDI SDEL,1 ;YES, INCREMENT COUNT
\r
2859 SUBI SDEL,1 ;YES, DECREMENT COUNT
\r
2861 IRPSE3: PUSHJ PP,WCHAR
\r
2862 SKIPN IRPCF ;IRPC?
\r
2863 JRST IRPSE1 ;NO, GET NEXT CHARACTER
\r
2865 IRPSE4: MOVSI CS,(BYTE (7) 177,2)
\r
2866 PUSHJ PP,WWRXE ;WRITE END
\r
2867 MOVEM MRP,IRPARG ;SAVE POINTER
\r
2868 HLRZ MRP,@IRPPOI ;SET FOR NEW SCAN
\r
2869 JRST REPEA8 ;ON ARG COUNT
\r
2870 \fSTOPI0: SKIPN IRPARP ;IRP IN PROGRESS?
\r
2871 JRST ERRAX ;NO, ERROR
\r
2872 SETZM IRPSW ;YES, SET SWITCH
\r
2875 IRPEND: MOVE V,@IRPARP
\r
2877 SKIPE IRPSW ;MORE TO COME?
\r
2880 IRPPOP: MOVE V,IRPPOI
\r
2881 PUSHJ PP,REFDEC ;DECREMENT REFERENCE
\r
2882 POP MP,MRP ;RESTORE CELLS
\r
2890 \fGETDS: MOVE CS,C ;USE CS FOR WORK REGISTER
\r
2892 ADD CS,MACPNT ;ADD BASE ADDRESS
\r
2893 MOVE V,0(CS) ;GET POINTER FLAG
\r
2894 JUMPG V,GETDS1 ;BRANCH IF POINTER
\r
2895 TRNN C,40 ;NOT POINTER, SHOULD WE CREATE?
\r
2896 JRST RSW0 ;NO, FORGET THIS ARG
\r
2898 PUSH PP,MWP ;STACK MACRO WRITE POINTER
\r
2899 PUSHJ PP,SKELI1 ;INITIALIZE SKELETON
\r
2900 MOVEM ARG,0(CS) ;STORE POINTER
\r
2901 MOVE CS,[BYTE (7) 0,170,170,170,171] ;CREATE A SYMBOL
\r
2902 ADD CS,LSTSYM ;LSTSYM= # OF LAST CREATED
\r
2903 TDZ CS,[BYTE (7) 0,170,170,170,170]
\r
2905 IOR CS,[ASCII /.0000/]
\r
2907 PUSHJ PP,WCHAR ;WRITE INTO SKELETON
\r
2909 MOVSI CS,(BYTE (7) 177,2)
\r
2910 PUSHJ PP,WWRXE ;WRITE END CODE
\r
2911 POP PP,MWP ;RESTORE MACRO WRITE POINTER
\r
2913 MOVE V,ARG ;SET UP FOR REFINC
\r
2915 GETDS1: PUSHJ PP,REFINC ;INCREMENT REFERENCE
\r
2916 PUSH MP,V ;STACK V FOR DECREMENT
\r
2917 PUSH MP,MRP ;STACK READ POINTER
\r
2918 HLRZ MRP,0(V) ;FORM READ POINTER
\r
2923 PUSHJ PP,REFDEC ;DECREMENT REFERENCE
\r
2925 \fSKELI1: MOVEI ARG,1 ;ENTRY FOR SINGLE ARG
\r
2926 SKELI: MOVE MWP,LADR
\r
2927 PUSHJ PP,SKELWL ;GET POINTER WORD
\r
2928 HRRZM MWP,WWRXX ;SAVE FIRST ADDRESS
\r
2930 HRRM ARG,0(MWP) ;STORE COUNT
\r
2931 HRRZ ARG,WWRXX ;SET FIRST ADDRESS
\r
2932 ;SKEW RETURNS WITH ADR OF NEXT FREE LOC IN V (RIGHT)
\r
2934 SKELWL: SKIPE V,NEXT ;GET FIRST FREE ADDRESS
\r
2935 JRST SKELW1 ;IF NON-ZERO, UPDATE FREE
\r
2936 AOS V,FREE ;INCREMENT BY LEAF SIZE
\r
2937 CAML V,SYMBOL ;OVERFLOW?
\r
2938 PUSHJ PP,XCEED ;YES, BOMB OUT
\r
2939 SETZM (V) ;CLEAR LINK
\r
2941 SKELW1: HLL V,0(V) ;GET ADDRESS
\r
2942 HLRM V,NEXT ;UPDATE NEXT
\r
2943 HRLM V,0(MWP) ;STORE LINK IN FIRST WORD OF LEAF
\r
2945 TLO MWP,(POINT 7,,21) ;2 ASCII CHARS
\r
2948 ;WWRXX POINTS TO END OF TREE
\r
2949 ;MWP IDPB POINTER TO NEXT HOLE
\r
2950 ;NEXT FIRST OF A LINKED PORTION THAT IS NOT BEING USED (LEAVES)
\r
2951 ;FREE POINTS TO FREE CORE BETWEEN TREE AND SYM-TABLE
\r
2952 ;LADR POINTS TO BEG OF LINKED PORTION.
\r
2953 \fGCHARQ: SKIPE MACLVL
\r
2954 JRST MREADS ;IF GETTING CHAR. FROM TREE
\r
2955 GCHAR: PUSHJ PP,CHARAC ;GET ASCII CHARACTER
\r
2956 CAIE C,LF ;TEST FOR LF, VT OR FF
\r
2958 PUSHJ PP,OUTIM1 ;YES, LIST IT
\r
2961 WCHARQ: SKIPE MACLVL
\r
2963 WCHAR: TLNN MWP,770000 ;END OF WORD?
\r
2964 PUSHJ PP,SKELWL ;YES, GET ANOTHER
\r
2968 WWORD: LSHC C,7 ;MOVE ASCII INTO C
\r
2969 PUSHJ PP,WCHAR ;STORE IT
\r
2970 JUMPN CS,WWORD ;TEST FOR END
\r
2971 POPJ PP, ;YES, EXIT
\r
2973 WWRXE: PUSHJ PP,WWORD ;WRITE LAST WORD
\r
2974 HRRZS (MWP) ;ZERO LEFT HALF OF LAST LEAF
\r
2975 HRRM MWP,@WWRXX ;SET POINTER TO END
\r
2977 \fMREAD: PUSHJ PP,MREADS ;READ ON CHARACTER
\r
2978 CAIE C,177 ;SPECIAL?
\r
2979 JRST RSW1 ;NO, EXIT
\r
2980 PUSHJ PP,MREADS ;YES, GET CODE WORD
\r
2981 TRZE C,100 ;SYMBOL?
\r
2983 CAILE C,4 ;POSSIBLY ILLEGAL
\r
2987 JRST MACEND ;1; END OF MACRO
\r
2988 JRST DSEND ;2; END OF DUMMY SYMBOL
\r
2989 JRST REPEND ;3; END OF REPEAT
\r
2990 JRST IRPEND ;4; END OF IRP
\r
2992 MREADS: TLNE MRP,770000 ;HAVE WE FINISHED WORD?
\r
2993 JRST MREADC ;STILL CHAR. IN LEAF
\r
2994 HLRZ MRP,0(MRP) ;YES, GET LINK
\r
2995 HRLI MRP,(POINT 7,,21) ;SET POINTER
\r
2996 MREADC: ILDB C,MRP ;GET CHARACTER
\r
2999 \fREFINC: HLRZ CS,0(V) ;GET POINTER TO FREE
\r
3000 AOS 0(CS) ;INCREMENT REFERENCE
\r
3002 REFDEC: HLRZ CS,0(V) ;GET POINTER TO TREE
\r
3003 SOS CS,0(CS) ;DECREMENT REFERENCE
\r
3004 TRNE CS,000777 ;IS IT ZERO?
\r
3005 POPJ PP, ;NO, EXIT
\r
3006 HRRZ CS,0(V) ;YES, GET POINTER TO END
\r
3007 HRL CS,NEXT ;GET POINTER TO NEXT RE-USABLE
\r
3008 HLLM CS,0(CS) ;SET LINK
\r
3009 HRRM V,NEXT ;RESET NEXT
\r
3012 \fA== 0 ;ASCII MODE
\r
3013 AL== 1 ;ASCII LINE MODE
\r
3014 IB== 13 ;IMAGE BINARY MODE
\r
3015 B== 14 ;BINARY MODE
\r
3017 CTL== 0 ;CONTROL DEVICE NUMBER
\r
3018 IFN CCLSW,<CTL2==4 ;INPUT DEV FOR CCL FILE>
\r
3019 BIN== 1 ;BINARY DEVICE NUMBER
\r
3020 CHAR== 2 ;INPUT DEVICE NUMBER
\r
3021 LST== 3 ;LISTING DEVICE NUMBER
\r
3023 ; COMMAND STRING ACCUMULATORS
\r
3027 ACEXT== 3 ;EXTENSION
\r
3029 ACDEL== 4 ;DELIMITER
\r
3030 ACPNTR==5 ;BYTE POINTER
\r
3038 DIRBIT==4 ;DIRECTORY DEVICE
\r
3042 DISBIT==2000 ;DISPLAY
\r
3043 CONBIT==20000 ;CONTROLING TTY
\r
3044 LPTBIT==40000 ;LPT
\r
3045 DSKBIT==200000 ;DSK
\r
3047 ;GETSTS ERROR BITS
\r
3049 IOIMPM==400000 ;IMPROPER MODE (WRITE LOCK)
\r
3050 IODERR==200000 ;DEVICE DATA ERROR
\r
3051 IODTER==100000 ;CHECKSUM OR PARITY ERROR
\r
3052 IOBKTL== 40000 ;BLOCK TOO LARGE
\r
3053 ERRBIT==IOIMPM!IODERR!IODTER!IOBKTL
\r
3054 \fSUBTTL I/O ROUTINES
\r
3056 IFN CCLSW,<TLZA IO,ARPGSW ;DON'T ALLOW RAPID PROGRAM GENERATION
\r
3057 TLO IO,ARPGSW ;ALLOW RAPID PROGRAM GENERATION
\r
3058 TLZA IO,CRPGSW ;SET TO INITI NEW COMMAND FILE
\r
3059 M: TLNN IO,CRPGSW ;CURRENTLY DOING RPG?>
\r
3061 RESET ;INITIALIZE PROGRAM
\r
3063 MOVE [XWD PASS1I,PASS1I+1]
\r
3064 BLT PASS2X-1 ;ZERO THE PASS1 AND PASS2 VARIABLE
\r
3065 MOVEI PP,JOBFFI ;SET TEMP PUSH-DOWN POINTER
\r
3066 MOVE CS,[POINT 7,DBUF] ;INITIALIZE FOR DATA
\r
3067 MSTIME 2, ;GET TIME FROM MONITOR
\r
3068 IDIVI 2,^D60*^D1000
\r
3070 PUSH PP,3 ;SAVE MINUTES
\r
3075 IDIVI 1,^D31 ;GET DAY
\r
3077 CAIG 2,^D9 ;TWO DIGITS?
\r
3078 ADDI 2,7760*^D10 ;NO, PUT IN SPACE
\r
3079 PUSHJ PP,OTOD1 ;STORE DAY
\r
3080 IDIVI 1,^D12 ;GET MONTH
\r
3081 MOVE 2,DTAB(2) ;GET MNEMONIC
\r
3084 MOVEI 2,^D64(1) ;GET YEAR
\r
3085 PUSHJ PP,OTOD ;STORE IT
\r
3086 MOVSI FR,P1!CREFSW
\r
3087 IFN CCLSW,<TLNE IO,CRPGSW ;RPG IN PROGRESS?
\r
3088 JRST GOSET ;YES, GO READ NEXT COMMAND
\r
3089 TLNE IO,ARPGSW ;NO, RPG ALLOWED?
\r
3090 JRST RPGSET ;YES, GO TRY
\r
3091 CTLSET: RELEAS CTL2, ;IN CASE OF LOOKUP FAILURE>
\r
3092 IFE CCLSW,<CTLSET:>
\r
3093 MOVSI IO,IOPALL ;ZERO FLAGS
\r
3094 INIT CTL,AL ;INITIALIZE USER CONSOLE
\r
3097 EXIT ;NO TTY, NO ASSEMBLY
\r
3098 INBUF CTL,1 ;INITIALIZE SINGLE CONTROL
\r
3099 OUTBUF CTL,1 ;BUFFERS
\r
3100 PUSHJ PP,CRLF ;OUTPUT CARRIAGE RETURN - LINE FEED
\r
3105 \fIFN CCLSW,<JRST BINSET ;BEGIN WITH BINARY FILE
\r
3107 IFN TEMP,<HRRZ 3,JOBFF ;GET START OF BUFFER AREA
\r
3108 HRRM 3,TMPFIL+1 ;STORE IN TMPCOR UUO IOWD
\r
3109 SOS TMPFIL+1 ;MAKE IT THE PROPER IOWD FORMAT
\r
3110 HRRM 3,CTLBLK+1 ;DUMMY UP BUFFER HEADER
\r
3111 MOVE 0,[XWD 2,TMPFIL] ;SET UP FOR TEMP CORE READ
\r
3112 TMPCOR ;READ AND DELETE FILE "MAC"
\r
3113 JRST RPGTMP ;NO SUCH FILE IN CORE TRY DISK
\r
3114 ADD 3,0 ;CALCULATE END OF BUFFER
\r
3115 MOVEM 3,JOBFF ;FIX JOBFF SO FILE WONT BE KILLED
\r
3116 IMULI 0,5 ;CALCULATE CHARACTER COUNT
\r
3117 MOVEM 0,CTLBLK+2 ;SET UP CHAR CNT IN BUFFER HEADER
\r
3118 MOVEI 0,440700 ;SET UP BYTE POINTER IN HEADER
\r
3119 HRLM 0,CTLBLK+1 ;BUUFER HEADER NOW SET UP
\r
3120 SETOM TMPFLG ;MARK THAT A TMPCOR UUO WAS DONE
\r
3121 JRST RPGS2A ;CONTINUE IN MAIN STREAM
\r
3123 INIT CTL2,AL ;LOOK FOR DISK
\r
3126 JRST CTLSET ;DSK NOT THERE
\r
3128 HRLZI 3,(SIXBIT /MAC/) ;###MAC
\r
3130 PJOB AC1, ;RETURNS JOB NO. TO AC1
\r
3131 RPGLUP: IDIVI AC1,12 ;CONVERT
\r
3132 ADDI AC2,"0"-40 ;SIXBITIZE IT
\r
3134 SOJG RPGLUP ;3 TIMES
\r
3135 MOVEM 3,CTLBUF ;###MAC
\r
3136 HRLZI (SIXBIT /TMP/) ;
\r
3137 MOVEM CTLBUF+1 ;TMP
\r
3138 SETZM CTLBUF+3 ;PROG-PRO
\r
3139 LOOKUP CTL2,CTLBUF ;COMMAND FILE
\r
3140 JRST CTLSET ;NOT THERE
\r
3141 HLRM EXTMP ;SAVE THE EXTENSION
\r
3142 RPGS2: INBUF CTL2,1 ;SINGLE BUFFERED
\r
3143 RPGS2A: INIT CTL,AL ;TTY FOR CONSOLE MESSAGES
\r
3146 EXIT ;NO TTY, NO ASSEMBLY
\r
3147 OUTBUF CTL,1 ;SINGLE BUFFERED
\r
3148 MOVE JOBFF ;REMEMBER WHERE BINARY BUFFERS BEGIN
\r
3150 TLNE IO,CRPGSW ;ARE WE ALREAD IN RPG MODE?
\r
3151 JRST M ;MUST HAVE COME FROM @ COMMAND, RESET
\r
3153 \fGOSET: MOVSI IO,IOPALL!CRPGSW ;SET INITIAL FLAGS
\r
3154 MOVEI CS,CTLSIZ ;MAXIMUM CHARS IN A LINE
\r
3155 MOVE AC1,[POINT 7,CTLBUF] ;WHERE TO STASH CHARS
\r
3156 MOVEM AC1,CTIBUF+1 ;...
\r
3157 GOSET1: SOSG CTLBLK+2 ;ANY MORE CHARS?
\r
3158 PUSHJ PP,[IFN TEMP,<SKIPE TMPFLG ;TMPCOR UUO IN PROGRESS?
\r
3160 IN CTL2, ;READ ANOTHER BUFFERFUL
\r
3161 POPJ PP, ;EVERYTHING OK, RETURN
\r
3162 STATO CTL2,20000 ;EOF?
\r
3163 JRST [HRROI RC,[SIXBIT /ERROR READING COMMAND FILE@/]
\r
3164 JRST ERRNE0] ;GO COMPLAIN
\r
3165 PUSHJ PP,DELETE ;CMD FILE
\r
3166 EXIT] ;EOF AND FINISHED
\r
3167 ILDB C,CTLBLK+1 ;GET NEXT CHAR
\r
3168 MOVE RC,@CTLBLK+1 ;CHECK FOR SEQUENCE NUMBERS
\r
3170 JRST [AOS CTLBLK+1 ;SKIP OVER ANOTHER 5 CHARS
\r
3172 ADDM RC,CTLBLK+2 ;...
\r
3173 JRST GOSET1] ;GO READ ANOTHER CHAR
\r
3174 JUMPE C,GOSET1 ;IGNORE NULLS
\r
3175 IDPB C,CTIBUF+1 ;GET NEXT CHAR
\r
3176 CAIE C,12 ;LINE FEED OR
\r
3177 CAIN C,175 ;ALTMODE?
\r
3178 JRST GOSET2 ;YES, FINISHED WITH COMMAND
\r
3181 JRST GOSET2 ;ALTMODE.
\r
3182 SOJG CS,GOSET1 ;GO READ ANOTHER
\r
3183 HRROI RC,[SIXBIT /COMMAND LINE TOO LONG@/]
\r
3184 JRST ERRNE0 ;GO COMPLAIN
\r
3185 GOSET2: MOVEI C,12 ;MAKE SURE THERE'S A LF
\r
3186 IDPB C,CTIBUF+1 ;...
\r
3187 MOVEM AC1,CTIBUF+1 ;SET POINTER TO BEGINNING
\r
3188 MOVE AC0,SAVFF ;RESET JOBFF FOR NEW BINARY
\r
3189 MOVEM AC0,JOBFF ;...
\r
3191 \fRPGS1: PUSHJ PP,DELETE ;DELETE COMMAND FILE
\r
3192 MOVEM ACDEV,RPGDEV ;GET SET TO INIT
\r
3194 MOVEM ACFILE,INDIR ;USE INPUT BLOCK
\r
3195 MOVEM ACEXT,INDIR+1
\r
3198 HLRM ACEXT,EXTMP ;SAVE THE EXTENSION
\r
3199 HLRZ JOBSA ;RESET JOBFF TO ORIGINAL
\r
3201 TLO IO,CRPGSW ;TURN ON SWITHC SO WE RESET WORLD
\r
3202 JRST RPGS2 ;AND GO
\r
3203 RPGLOS: RELEAS CTL2,0
\r
3204 TLZ IO,CRPGSW ;STOPS IO TO UNASGD CHAN
\r
3205 JRST ERRCF ;NO FILE FOUND
\r
3207 \fBINSET: PUSHJ PP,NAME1 ;GET FIRST NAME
\r
3208 IFN CCLSW,<CAIN C,"!" ;CHECK FOR A NEW RPG FILE
\r
3210 CAIN C,"@" ;CHEK FOR A NEW RPG FILE
\r
3212 TLNN FR,CREFSW ;CROSS REF REQUESTED?
\r
3213 JRST LSTSE1 ;YES, SKIP BINARY
\r
3214 CAIN C,"," ;COMMA?
\r
3215 JUMPE ACDEV,LSTSET ;YES, SKIP BINARY IF NO DEVICE SPECIFIED
\r
3216 CAIN C,"_" ;LEFT ARROW?
\r
3217 JUMPE ACDEV,LSTSE1 ;YES, SKIP BINARY IF NO DEVICE SPECIFIED
\r
3218 JUMPE ACDEV,ERRCM ;IGNORE IF JUST <CR-LF>
\r
3219 TLO FR,PNCHSW ;OK, SET SWITCH
\r
3220 MOVEM ACDEV,BINDEV ;STORE DEVICE NAME
\r
3221 MOVEM ACFILE,INDIR ;STORE FILE NAME IN DIRECTORY
\r
3222 SKIPN ACEXT ;EXTENSION SPECIFIED?
\r
3223 MOVSI ACEXT,(SIXBIT /REL/) ;NO, ASSUME RELOCATABLE BINARY
\r
3224 MOVEM ACEXT,INDIR+1 ;STORE IN DIRECTORY
\r
3225 PUSHJ PP,BININI ;INITIALIZE BINARY
\r
3226 TLZE TIO,TIOLE ;SKIP TO EOT
\r
3228 TLZE TIO,TIORW ;REWIND REQUESTED?
\r
3230 JUMPGE CS,BINSE2 ;BRANCH IF NO BACK-SPACE
\r
3231 MTBSF. BIN, ;BACK-SPACE A FILE
\r
3232 AOJL CS,.-1 ;TEST FOR END
\r
3234 STATO BIN,1B24 ;LOAD POINT?
\r
3235 MTSKF. BIN, ;NO, GO FORWARD ONE
\r
3236 BINSE2: SOJG CS,.-1 ;TEST FORWARD SPACING
\r
3238 TLNE TIO,TIOCLD ;DIRECTORY CLEAR REQUESTED?
\r
3239 UTPCLR BIN, ;YES, CLEAR IT
\r
3240 OUTBUF BIN,2 ;SET UP TWO RING BUFFER
\r
3244 JRST GETSET ;NO LISTING
\r
3245 \fLSTSET: PUSHJ PP,NAME1 ;GET NEXT DEVICE
\r
3246 LSTSE1: CAIE C,"_"
\r
3248 TLNE FR,CREFSW ;CROSS-REF REQUESTED?
\r
3249 JRST LSTSE2 ;NO, BRANCH
\r
3250 SKIPN ACDEV ;YES, WAS DEVICE SPECIFIED?
\r
3251 MOVSI ACDEV,(SIXBIT /DSK/) ;NO, ASSUME DSK
\r
3253 MOVE ACFILE,[SIXBIT /CREF/]
\r
3255 MOVSI ACEXT,(SIXBIT /LST/)
\r
3256 LSTSE2: JUMPE ACDEV,GETSET ;FORGET LISTING IF NO DEVICE SPECIFIED
\r
3257 MOVEM ACDEV,LSTDEV
\r
3261 TLNE FR,CREFSW ; WAS CROSS-REF REQUESTED?
\r
3262 AOSA OUTSW ;NO, ASSUME TTY
\r
3263 JRST ERRCM ;YES, ERROR - CREF DEV MUST NO TBE LPT, DIS OR TTY
\r
3264 TLNE AC0,TTYBIT ;CONTROLING TELETYPE LISTING?
\r
3265 JRST GETSET ;YES, BUFFER ALREADY SET
\r
3266 AOS OUTSW ;SET FOR LPT
\r
3267 MOVEM ACFILE,INDIR
\r
3269 MOVSI ACEXT,(SIXBIT /LST/)
\r
3270 MOVEM ACEXT,INDIR+1
\r
3282 LSTSE3: SOJG CS,.-1
\r
3283 TLNE TIO,TIOCLD ;DIRECTORY CLEAR REQUESTED?
\r
3284 UTPCLR LST, ;YES, CLEAR IT
\r
3285 OUTBUF LST,2 ;SET UP A TWO RING BUFFER
\r
3288 \fGETSET: MOVEI 3,PDPERR
\r
3289 HRRM 3,JOBAPR ;SET TRAP LOCATION
\r
3290 MOVEI 3,1B19 ;SET FOR PUSH-DOWN OVERFLOW
\r
3292 SOS 3,PDP ;GET PDP REQUEST MINUS 1
\r
3293 IMULI 3,.PDP ;COMPUTE SIZE (50*<NUMBER OF /P'S +1>)
\r
3295 HRR MP,JOBFF ;SET BASIC POINTER
\r
3298 MOVEM PP,RP ;SET RP
\r
3300 ASH 3,1 ;DOUBLE SIZE OF BASIC POINTER
\r
3302 SUBM PP,3 ;COMPUTE TOP LOCATION
\r
3303 HRRZM 3,LADR ;SET START OF MACRO TREE
\r
3306 GETSE1: HRRZ JOBREL
\r
3315 HRRZ 2,JOBREL ;NO, TRY FOR MORE CORE
\r
3318 JRST XCEED2 ;NO MORE, INFORM USER
\r
3319 JRST GETSE1 ;TRY AGAIN
\r
3321 GETSE2: MOVEM SYMBOL ;SET START OF SYMBOL TABLE
\r
3323 BLT @SYMTOP ;STORE SYMBOLS
\r
3327 MOVSI AC0,(SIXBIT 'DSK')
\r
3331 MOVEI CS,[ASCIZ /MACRO: /] ;PUBLISH COMPILER NAME
\r
3332 TLNE IO,CRPGSW ;PUNCH REQUESTED?
\r
3336 \fFINIS: CLOSE BIN, ;DUMP BUFFER
\r
3337 TLNE FR,PNCHSW ;PUNCH REQUESTED?
\r
3338 PUSHJ PP,TSTBIN ;YES, TEST FOR ERRORS
\r
3341 SOSLE OUTSW ;LPT TYPE OUTPUT?
\r
3342 PUSHJ PP,TSTLST ;YES, TEST FOR ERRORS
\r
3346 OUTPUT CTL,0 ;FLUSH TTY OUTPUT
\r
3348 \fINSET: MOVEI JOBFFI ;POINTER TO INPUT BUFFER
\r
3349 HRRM JOBFF ;INFORM SYSTEM OF BUFFER AREA
\r
3350 PUSHJ PP,NAME2 ;GET NEXT COMMAND NAME
\r
3351 JUMPE ACDEV,ERRNE ;ERROR IF NONE LEFT
\r
3352 MOVEM ACDEV,INDEV ;STORE DEVICE
\r
3353 MOVEM ACFILE,INDIR ;STORE FILE IN DIRECTORY
\r
3355 DEVCHR ACDEV, ;TEST CHARACTERISTICS
\r
3356 TLNN ACDEV,MTABIT ;MAG TAPE?
\r
3358 TLZN FR,MTAPSW ;FIRST MAG TAPE IS PASS 2?
\r
3360 TLNN TIO,TIORW ;YES, REWIND REQUESTED?
\r
3361 SUB CS,RECCNT ;NO, PREPARE TO BACK-SPACE TAPE
\r
3362 INSET1: AOS RECCNT ;INCREMENT FILE COUNTER
\r
3363 ADDM CS,RECCNT ;UPDATE COUNT
\r
3366 TLZE TIO,TIORW ;REWIND?
\r
3375 INSET2: SOJGE CS,.-1
\r
3377 INSET3: INBUF CHAR,1
\r
3378 MOVEI ACPNTR,JOBFFI
\r
3380 SUBI ACPNTR,JOBFFI
\r
3381 MOVEI ACDEL,NUMBUF*203+1
\r
3383 INBUF CHAR,(ACDEL)
\r
3384 JUMPN SDEL,INSET4 ;TAKE USER'S EXTENSION IF NON-BLANK
\r
3385 MOVSI SDEL,(SIXBIT /MAC/) ;BLANK, TRY .MAC FIRST
\r
3387 INSET4: PUSHJ PP,INSETI
\r
3388 JUMPE ACEXT,ERRCF ;ERROR IF ZERO
\r
3389 TLNE ACDEV,TTYBIT ;TELETYPE?
\r
3390 SETSTS CHAR,AL ;YES, CHANGE TO ASCII LINE
\r
3393 INSETI: HLLM ACEXT,INDIR+1 ;STORE EXTENSION
\r
3398 \fREC2: MOVE CTLSAV
\r
3403 MOVE [XWD PASS2I,PASS2I+1]
\r
3404 BLT PASS2X-1 ;ZERO PASS2 VARIABLES
\r
3405 TLOA FR,MTAPSW!LOADSW ;SET FLAGS
\r
3408 GOTEND: STATO CHAR,1B22 ;TEST FOR EOF
\r
3411 EOT: PUSHJ PP,SAVEXS ;SAVE REGISTERS
\r
3413 PUSHJ PP,INSET ;GET THE NEXT INPUT DEVICE
\r
3414 HRROI RC,[SIXBIT /END OF PASS 1@/] ;ASSUME END OF PASS
\r
3415 TLZN FR,LOADSW ;ZERO ONLY ON END OF PASS 1
\r
3416 HRROI RC,[SIXBIT /LOAD THE NEXT FILE@/] ;NOT END OF PASS
\r
3417 TLNN ACDEV,(1B13!1B15) ;WAS ALL THAT WORK NECESSARY?
\r
3418 PUSHJ PP,TYPMSG ;YES
\r
3420 RSTRXS: MOVSI RC,SAVBLK ;SET POINTER
\r
3422 MOVE RC,SAVERC ;RESTORE RC
\r
3425 SAVEXS: MOVEM RC,SAVERC ;SAVE RC
\r
3426 MOVEI RC,SAVBLK ;SET POINTER
\r
3427 BLT RC,SAVBLK+RC-1 ;BLT ALL REGISTERS BELOW EC
\r
3430 \fNAME2: SKIPA ACDEV,ACDEVX
\r
3431 NAME1: SETZB ACDEV,INDIR+2
\r
3432 MOVEI ACFILE,0 ;CLEAR FILE
\r
3433 HLRZ ACDEL,ACDELX ;GET PREVIOUS DELIMITER
\r
3435 SETZB ACEXT,INDIR+3 ;RESET EXTENSION AND PROGRAM-NUMBER PAIR
\r
3436 NAME3: MOVSI ACPNTR,(POINT 6,AC0) ;SET POINTER
\r
3437 TDZA AC0,AC0 ;CLEAR SYMBOL
\r
3439 SLASH: PUSHJ PP,SW0
\r
3440 GETIOC: PUSHJ PP,TTYIN ;GET INPUT CHARACTER
\r
3449 IFN CCLSW,<CAIE C,"!" ;IS CHAR AN IMPARTIVE?
\r
3451 JRST TERM ;YES, GO DO IT>
\r
3452 CAIE C,33 ;CHECK FOR THREE FLAVORS OF ALT-MODE
\r
3455 CAIE C,175 ;OR 3RD ALTMOD
\r
3463 SUBI C,40 ;CONVERT TO 6-BIT
\r
3464 TLNE ACPNTR,770000 ;HAVE WE STORED SIX BYTES?
\r
3465 IDPB C,ACPNTR ;NO, STORE IT
\r
3466 JRST GETIOC ;GET NEXT CHARACTER
\r
3468 DEVICE: SKIPA ACDEV,0 ;ERROR IF ALREADY SET
\r
3470 NAME: MOVE ACFILE,AC0 ;FILE NAME
\r
3471 MOVE ACDEL,C ;SET DELIMITER
\r
3474 TERM: JUMPE ACDEL,TERM1 ;IF NO PREVIOUS TERMINATOR, THEN FILENAME
\r
3475 CAIN ACDEL,"_" ;...
\r
3477 CAIE ACDEL,":" ;IF PREVIOUS DELIMITER
\r
3478 CAIN ACDEL,"," ;WAS COLON OR COMMA
\r
3479 TERM1: MOVE ACFILE,AC0 ;SET FILE
\r
3480 CAIN ACDEL,"." ;IF PERIOD
\r
3481 HLLZ ACEXT,AC0 ;SET EXTENSION
\r
3482 HRLM C,ACDELX ;SAVE PREVIOUS DELIMITER
\r
3483 MOVEM ACDEV,ACDEVX ;USE LAST DEVICE
\r
3484 CAIN C,"!" ;IMPERATIVE?
\r
3485 POPJ PP, ;YES, DON'T ASSUME DEV
\r
3486 JUMPE ACFILE,POPOUT ;IF THERE IS A FILE,
\r
3487 SKIPN ACDEV ;BUT NO DEVICE
\r
3488 MOVSI ACDEV,(SIXBIT /DSK/) ;THEN ASSUME DISK
\r
3491 \fPROGNP: JUMPL PP,PROGN2
\r
3493 ERRCM: HRROI RC,[SIXBIT /COMMAND ERROR@/]
\r
3496 PROGN1: HRLZM RC,INDIR+3
\r
3497 PROGN2: MOVEI RC,0 ;CLEAR AC
\r
3498 PROGN3: PUSHJ PP,TTYIN
\r
3500 JRST PROGN1 ;STORE LEFT HALF
\r
3504 LSH RC,3 ;SHIFT PREVIOUS RESULT
\r
3505 ADDI RC,-"0"(C) ;ADD IN NEW NUMBER
\r
3507 \fSWITC0: PUSHJ PP,SW1
\r
3508 SWITCH: PUSHJ PP,TTYIN ;GET NEXT CHARACTER
\r
3509 CAIE C,")" ;END OF STRING?
\r
3513 SW0: PUSHJ PP,TTYIN
\r
3514 SW1: MOVEI C,-"A"(C) ;CONVERT FROM ASCII TO NUMERIC
\r
3515 CAILE C,"Z"-"A" ;WITHIN BOUNDS? (IS IT ALPHA?)
\r
3516 JRST ERRCM ;NO, ERROR
\r
3517 MOVE RC,[POINT 4,BYTAB]
\r
3519 SOJGE C,.-1 ;MOVE TO PROPER BYTE
\r
3520 LDB C,RC ;PICK UP BYTE
\r
3521 JUMPE C,ERRCM ;TEST FOR VALID SWITCH
\r
3522 CAIG C,SWTABT-SWTAB ;LEGAL ON SOURCE?
\r
3523 JUMPL PP,ERRCM ;NO, TEST FOR SOURCE
\r
3524 LDB RC,[POINT 4,SWTAB-1(C),12]
\r
3526 SKIPN CTLSAV ;IF PASS2 OR IO SWITCH
\r
3527 XCT SWTAB-1(C) ;EXECUTE INSTRUCTION
\r
3530 \f DEFINE SETSW (LETTER,INSTRUCTION) < INSTRUCTION
\r
3531 J= <"LETTER"-"A">-9*<I=<"LETTER"-"A">/9>
\r
3534 DEFINE SETCOD (I,J)
\r
3535 <BYTAB'I=BYTAB'I!<.-SWTAB>B<4*J+3>>
\r
3537 BYTAB0= 0 ;INITIALIZE TABLE
\r
3542 SETSW Z,<TLO TIO,TIOCLD >
\r
3543 SETSW C,<TLZ FR,CREFSW >
\r
3544 SETSW P,<SOS PDP >
\r
3545 SWTABT: ;THE ABOVE SW'S ARE LEGAL ON OUTPUT ONLY
\r
3546 SETSW A,<ADDI CS,1 >
\r
3547 SETSW B,<SUBI CS,1 >
\r
3548 SETSW E,<TLZ IO,IOPALL >
\r
3549 SETSW L,<TLZ IO,IOMSTR >
\r
3550 SETSW N,<HLLOS TYPERR >
\r
3551 SETSW Q,<TLO FR,ERRQSW >
\r
3552 SETSW S,<TLO IO,IOMSTR >
\r
3553 SETSW T,<TLO TIO,TIOLE >
\r
3554 SETSW W,<TLO TIO,TIORW >
\r
3555 SETSW X,<TLO IO,IOPALL >
\r
3556 IFG .-SWTAB-17,<PRINTX SWITCH TABLE TOO LONG, CHANGE BYTE SIZE>
\r
3558 BYTAB: ;BYTAB CONTAINS AN INDEX TO SWTAB
\r
3559 ;IT CONSIST OF 9 4BIT BYTES/WORD
\r
3560 ;OR ONE BYTE FOR EACH LETTER
\r
3562 +BYTAB0 ;A-G BYTE = 1 THROUGH 17 = INDEX
\r
3563 +BYTAB1 ;H-N BYTE = 0 = COMMAND ERROR
\r
3566 \fTTYIN: ILDB C,CTIBUF+1 ;GET CHARACTER
\r
3567 CAIE C," " ;SKIP BLANKS
\r
3568 CAIN C,HT ;AND TABS
\r
3573 ERRNE: HRROI RC,[SIXBIT /?NO END STATEMENT ENCOUNTERED ON INPUT FILE@/]
\r
3575 SKIPN LITLVL ;SET IF IN LITERAL
\r
3576 JRST ERRNE1 ;NO, TRY OTHERS
\r
3577 MOVE V,[XWD [SIXBIT /LITERAL@/],LITPG]
\r
3579 ERRNE1: MOVEI V,0 ;CHECK FOR OTHER PLACES
\r
3581 MOVE V,[XWD [SIXBIT /DEFINE@/],DEFPG]
\r
3583 MOVE V,[XWD [SIXBIT /TEXT@/],TXTPG]
\r
3585 MOVE V,[XWD [SIXBIT /CONDITIONAL OR REPEAT@/],REPPG]
\r
3587 MOVE V,[XWD [SIXBIT /MACRO CALL@/],CALPG]
\r
3589 PUSHJ PP,PRNUM ;GO PRINT INFORMATION
\r
3590 HRROI RC,[SIXBIT /@/] ;WILL GET A RETURN
\r
3593 ERRMS3: SIXBIT / ERRORS DETECTED@/
\r
3594 ERRMS2: SIXBIT /?1 ERROR DETECTED@/
\r
3595 ERRMS1: SIXBIT /NO ERRORS DETECTED@/
\r
3596 EINIT: MOVE RC,[XWD ACDEV,[SIXBIT /NOT AVAILABLE@/]]
\r
3598 \fERREF: SKIPA RC,[XWD [SIXBIT /CANNOT ENTER FILE@/],ACFILE]
\r
3599 ERRCF: MOVE RC,[XWD [SIXBIT /CANNOT FIND@/],ACFILE]
\r
3600 ERRNE0: PUSHJ PP,CRLF
\r
3605 \fTYPMSG: PUSHJ PP,CRLF ;MOVE TO NEXT LINE
\r
3606 TYPMS1: HLRZ CS,RC ;GET FIRST MESSAGE
\r
3607 CAIE CS,-1 ;SKIP IF MINUS ONE
\r
3608 PUSHJ PP,TYPM2 ;TYPE MESSAGE
\r
3609 HRRZ CS,RC ;GET SECOND HALF
\r
3612 CRLF: MOVEI C,CR ;OUTPUT CARRIAGE RETURN
\r
3614 MOVEI C,LF ;AND LINE FEED
\r
3616 TYO: SOSG CTOBUF+2 ;BUFFER FULL?
\r
3617 OUTPUT CTL,0 ;YES, DUMP IT
\r
3618 IDPB C,CTOBUF+1 ;STORE BYTE
\r
3619 CAIE C,FF ;FORM FEED?
\r
3620 CAIN C,LF ;V TAB OR LINE FEED?
\r
3622 POPJ PP, ;AND EXIT
\r
3624 TYPM2: MOVSI C,(1B0) ;ANTICIPATE REGISTER WORD
\r
3625 CAIG CS,17 ;IS IT?
\r
3627 HRLI CS,(POINT 6,,) ;FORM BYTE POINTER
\r
3629 TYPM3: ILDB C,CS ;GET A SIXBIT BYTE
\r
3631 JRST TYO ;YES, TYPE SPACE AND EXIT
\r
3632 ADDI C,40 ;NO, FORM 7-BIT ASCII
\r
3633 PUSHJ PP,TYO ;OUTPUT CHARACTER
\r
3636 \fXCEEDS: ADDI SX,2000 ;ADJUST SYMBOL POINTER
\r
3637 XCEED: PUSHJ PP,SAVEXS ;SAVE THE REGISTERS
\r
3638 HRRZ 1,JOBREL ;GET CURRENT TOP
\r
3640 XCEED2: HRROI RC,[SIXBIT /INSUFFICIENT CORE@/]
\r
3641 CORE 0 ;REQUEST MORE CORE
\r
3642 JRST ERRNE0 ;ERROR, BOMB OUT
\r
3643 HRRZ 2,JOBREL ;GET NEW TOP
\r
3645 XCEED1: MOVE 0,0(1) ;GET ORIGIONAL
\r
3646 MOVEM 0,0(2) ;STORE IN NEW LOCATION
\r
3647 SUBI 2,1 ;DECREMENT UPPER
\r
3648 CAMLE 1,SYMBOL ;HAVE WE ARRIVED?
\r
3649 SOJA 1,XCEED1 ;NO, GET ANOTHER
\r
3654 PUSHJ PP,SRCHI ;RE-INITIALIZE SYMBOL TABLE
\r
3655 JRST RSTRXS ;RESTORE REGISTERS AND EXIT
\r
3657 PDPERR: HRROI RC,[SIXBIT .PDP OVERFLOW, TRY /P@.]
\r
3660 PRNUM: HLRZ CS,V ;GET MESSAGE
\r
3662 MOVE AC0,(V) ;GET PAGE
\r
3663 PUSHJ PP,DP1 ;PRINT NUMBER
\r
3666 SKIPN AC1,1(V) ;GET SEQ NUM IF THERE
\r
3670 OUTPUT CTL,0 ;TO MAKE THINGS PRINT IN RIGHT ORDER
\r
3673 JRST TYO ;AND RETURN
\r
3675 DP1: IDIVI AC0,^D10
\r
3682 \fRIM0: TDO FR,AC0 ;SET RIM/RIM10 FLAG
\r
3683 TLNE FR,PNCHSW ;FORGET IT IF PUNCH RESET
\r
3684 SETSTS BIN,IB ;SET TO IMAGE BINARY MODE
\r
3687 ROUT: EXCH CS,RIMLOC
\r
3688 SUB PP,[XWD 1,1] ;CLEAR OUT STACK WFW
\r
3700 ROUT1: MOVSI C,(DATAI PTR,) ;RIM OUTPUT
\r
3701 HRR C,LOCO ;GET ADDRESS
\r
3702 TLNE FR,RIM1SW ;NO DATAI IF RIM10
\r
3704 PUSHJ PP,PTPBIN ;OUTPUT
\r
3706 AOSA LOCO ;INCREMENT CURRENT LOCATION
\r
3708 OUTBIN: TLNN FR,RIMSW!RIM1SW!R1BSW ;EXIT IF RIM MODE
\r
3709 PTPBIN: TLNN FR,PNCHSW ;EXIT IF PUNCH NOT REQUESTED
\r
3711 SOSG BINBUF+2 ;TEST FOR BUFFER FULL
\r
3712 PUSHJ PP,DMPBIN ;YES, DUMP IT
\r
3713 IDPB C,BINBUF+1 ;DEPOSIT BYTE
\r
3715 \fDMPBIN: OUTPUT BIN,0 ;DUMP THE BUFFER
\r
3716 TSTBIN: STATO BIN,740000 ;GET STATUS BITS
\r
3717 POPJ PP, ;NO, EXIT
\r
3718 MOVE AC0,BINDEV ;YES, GET TAG
\r
3721 R1BDMP: SETCM CS,R1BCNT
\r
3729 R1BDM1: MOVE C,0(CS)
\r
3735 R1BI: SETOM R1BCNT
\r
3740 ROUT6: CAME CS,RIMLOC
\r
3749 \fREAD0: PUSHJ PP,EOT
\r
3750 READ: SOSG IBUF+2 ;BUFFER EMPTY?
\r
3752 READ1: ILDB C,IBUF+1 ;PLACE CHARACTER IN C
\r
3753 MOVE CS,@IBUF+1 ;CHECK FOR SEQUENCE NUMBER
\r
3756 CAIN CS,1 ;CHECK FOR SPECIAL
\r
3757 MOVE CS,[<ASCII/ />+1]
\r
3761 ADDM CS,IBUF+2 ;ADJUST WORD COUNT
\r
3762 REPEAT 4,< IBP IBUF+1> ;SKIP SEQ NU
\r
3763 PUSHJ PP,READ ;AND THE TAB
\r
3764 JRST READ ;GET NEXT CHARACTER
\r
3766 READ1A: JUMPE C,READ ;IGNORE NULL
\r
3770 READ1B: CAIN C,32 ;IF IT'S A "^Z"
\r
3771 MOVEI C,LF ;TREAT IT AS A "LF"
\r
3772 CAIE C,37 ;CONTROL _
\r
3774 READ2: PUSHJ PP,READ ;YES, TEST FOR LINE FEED
\r
3775 PUSHJ PP,RSW2 ;LIST IN ANY EVENT
\r
3776 CAIE C,LF ;IS IT LF
\r
3778 PUSHJ PP,OUTIM1 ;YES, DUMP THE LINE
\r
3779 JRST READ ;RETURN NEXT CHARACTER
\r
3781 READ3: INPUT CHAR,0 ;GET NEXT BUFFER
\r
3782 STATO CHAR,762000 ;NO ERRORS
\r
3784 STATO CHAR,742000 ;ERRORS?
\r
3787 MOVSI RC,[SIXBIT /INPUT ERROR ON DEVICE@/]
\r
3789 \fOUTAB2: PUSHJ PP,OUTTAB ;PRINT TWO TABS
\r
3790 OUTTAB: MOVEI C,HT
\r
3791 PRINT: CAIN C,LF ;IS THIS A LF?
\r
3792 JRST OUTCR ;YES, GO PROCESS
\r
3795 CAIN C,FF ;FORM FEED?
\r
3796 JRST OUTFF ;YES FORCE NEW PAGE
\r
3799 OUTCR: TRNN ER,ERRORS!LPTSW!TTYSW
\r
3801 MOVEI C,CR ;CARRIAGE RETURN, LINE FEED
\r
3803 SOSGE LPP ;END OF PAGE?
\r
3804 TLO IO,IOPAGE ;YES, SET FLAG
\r
3805 TRCA C,7 ;FORM LINE FEED AND SKIP
\r
3807 OUTL: TLZN IO,IOPAGE ;NEW PAGE REQUESTED?
\r
3809 JUMP1 OUTC ;YES, BYPASS IF PASS ONE
\r
3810 PUSH PP,C ;SAVE C AND CS
\r
3813 TLNN IO,IOMSTR!IOPROG
\r
3816 MOVEM C,LPP ;SET NEW COUNTER
\r
3820 PUSHJ PP,OUTC ;OUTPUT FORM FEED
\r
3822 PUSHJ PP,OUTAS0 ;OUTPUT TITLE
\r
3824 PUSHJ PP,OUTAS0 ;OUTPUT VERSION
\r
3826 PUSHJ PP,DNC ;OUTPUT PAGE NUMBER
\r
3827 AOSG PAGEN. ;FIRST PAGE OF THIS NUMBER?
\r
3829 MOVEI C,"-" ;NO, PUT OUT MODIFIER
\r
3833 OUTL1: PUSHJ PP,OUTCR
\r
3834 HRRZ CS,SUBTTX ;SWITCH FOR SUB-TITLE
\r
3835 SKIPE 0(CS) ;IS THERE A SUB-TITLE?
\r
3836 PUSHJ PP,OUTTAB ;YES, OUTPUT A TAB
\r
3837 PUSHJ PP,SOUT20 ;OUTPUT ASCII WITH CARRIAGE RETURN
\r
3843 OUTC: TRNE ER,ERRORS!TTYSW
\r
3847 OUTLST: SOSG LSTBUF+2 ;BUFFER FULL?
\r
3848 PUSHJ PP,DMPLST ;YES, DUMP IT
\r
3849 IDPB C,LSTBUF+1 ;STORE BYTE
\r
3851 DMPLST: OUTPUT LST,0 ;OUTPUT BUFFER
\r
3852 TSTLST: STATO LST,740000
\r
3855 ERRLST: MOVSI RC,[SIXBIT /DATA ERROR DEVICE@/]
\r
3864 OTOD: IDIVI 2,^D10
\r
3865 ADDI 2,60 ;FORM ASCII
\r
3871 DTAB: ASCII "JAN-"
\r
3883 \fSUBTTL MACHINE INSTRUCTION SEARCH ROUTINES
\r
3884 OPTSCH: MOVEI RC,0
\r
3885 MOVEI ARG,1B^L<OP1END-OP1TOP> ;SET UP INDEX
\r
3886 MOVEI V,1B^L<OP1END-OP1TOP>/2 ;SET UP INCREMENT
\r
3887 OPT1A: CAMN AC0,OP1TOP(ARG) ;ARE WE POINTING AT SYMBOL?
\r
3888 JRST OPT1D ;YES, GET THE CODE
\r
3889 JUMPE V,POPOUT ;TEST FOR END
\r
3890 CAML AC0,OP1TOP(ARG) ;NO, SHOULD WE MOVE DOWN?
\r
3891 TDOA ARG,V ;NO, INCREMENT
\r
3892 OPT1B: SUB ARG,V ;YES, DECREMENT
\r
3893 ASH V,-1 ;HALVE INCREMENT
\r
3894 CAIG ARG,OP1END-OP1TOP ;ARE WE OUT OF BOUNDS?
\r
3895 JRST OPT1A ;NO, TRY AGAIN
\r
3896 JRST OPT1B ;YES, BRING IT DOWN A PEG
\r
3897 OPT1D: IDIVI ARG,4 ;ARG HAS INDEX USED IN OPTTAB
\r
3898 LDB V,OPTTAB(V) ;V HAS INDEX TO OPTTAB
\r
3899 CAIL V,700 ;PSEUDO-OP OR IO INSTRUCTION?
\r
3901 ROT V,-^D9 ;LEFT JUSTIFY
\r
3902 HRRI V,OPD ;POINT TO BASIC FORMAT
\r
3903 OPT1F: AOS 0(PP) ;SET FOR SKIP EXIT
\r
3904 MOVEI SDEL,%OP ;SET OP-CODE CROSS-REF FLAG
\r
3905 JRST CREF ;TEST AND OUTPUT, AC0=SYMBOL, V=VALUE
\r
3906 OPT1G: TLNN AC0,200000 ;PSEUDO-OP OR IO INST., TEST FOR PROPER TABLE
\r
3907 SKIPA V,OP2TAB-700(V) ;2ND TABLE, FIRST LETTER IS "A" TO "O"
\r
3908 MOVE V,OP1TAB-700(V) ;1ST TABLE, ..."P" TO "Z"
\r
3911 POINT 9,OP1COD-1(ARG),35
\r
3912 POINT 9,OP1COD(ARG),8
\r
3913 POINT 9,OP1COD(ARG),17
\r
3914 POINT 9,OP1COD(ARG),26
\r
3916 \fIFDEF .XCREF,< .XCREF ;DON'T CREF THIS MESS>
\r
3922 DEFINE X <N1=N1+1 ;>>
\r
3929 DEFINE X (SYMBOL,CODE)
\r
3931 CC=CC+CODE_<N2=N2-9>
\r
3939 SYN X,XX ;JUST THE SAME MACRO
\r
4113 IFN RENTSW, <X HISEG , 706>
\r
4547 OP1COD: BLOCK N1/4
\r
4551 IFDEF .CREF,< .CREF ;START CREFFING AGAIN
\r
4553 \fSUBTTL PERMANENT SYMBOLS
\r
4554 SYMNUM: EXP LENGTH/2 ;NUMBER OF PERMANENT SYMBOLS
\r
4560 PRMTBL: ;PERMANENT SYMBOLS
\r
4594 PRMEND: ;END OF PERMANENT SYMBOLS
\r
4596 LENGTH= .-SYMNUM ;LENGTH OF INITIAL SYMBOLS
\r
4598 \f OPDEF ZL [Z LITF] ;INVALID IN LITERALS
\r
4599 OPDEF ZA [Z ADDF] ;INVALID IN ADDRESSES
\r
4600 OPDEF ZAL [Z ADDF!LITF]
\r
4611 Z RADX50 ;RADIX50,SQUOZE
\r
4612 ZL LOC0 (1) ;RELOC
\r
4615 ZL SUPRE0 ;SUPRESS
\r
4617 ZL RIM0 (RIMSW) ;RIM
\r
4619 Z ASCII0 (1) ;SIXBIT
\r
4622 ; ZL IOSET (IOPALL!IOSALL) ;SALL
\r
4624 ZL SUBTT0 (Z (POINT 7,,)) ;SUBTTL
\r
4627 ZL TITLE0 (Z (POINT 7,,)) ;TITLE
\r
4632 ZL IOSET (IOPALL) ;XALL
\r
4633 ZL IOSET (IOPROG) ;XLIST
\r
4635 ZL RIM0 (RIM1SW) ;RIM10
\r
4636 ZL RIM0 (R1BSW) ;RIM10B
\r
4639 Z ASCII0 (0) ;ASCII
\r
4640 Z ASCII0 (1B18) ;ASCIZ
\r
4644 ZL SUPRSA ;ASUPPRESS
\r
4645 IFN RENTSW,< ZL HISEG0 ;HISEG>
\r
4646 IFE RENTSW,< Z ;HISEG>
\r
4654 Z OCT0 (^D10) ;DEC
\r
4657 ZL DEPHA0 ;DEPHASE
\r
4659 ZL INTER0 (INTF!ENTF) ;ENTRY
\r
4663 TLNN FR,IFPASS ;IF1
\r
4664 TLNE FR,IFPASS ;IF2
\r
4666 TRNE AC0,IFB0 ;IFB
\r
4667 TLNE ARG,IFDEF0 ;IFDEF
\r
4668 Z IFIDN0 (0) ;IFDIF
\r
4672 Z IFIDN0 (1) ;IFIDN
\r
4677 TRNN AC0,IFB0 ;IFNB
\r
4678 TLNN ARG,IFDEF0 ;IFNDEF
\r
4679 ZL INTER0 (INTF) ;INTERN
\r
4682 ZL IRP0 (400000) ;IRPC
\r
4690 ZL IORSET (IOPALL) ;LALL
\r
4691 ZL IORSET (IOPROG) ;LIST
\r
4694 ZL IOSET (IONCRF) ;CREF
\r
4695 ; ZL OFFSYM ;NOSYM
\r
4701 ; TRN ASCII0 (3B19) ;COMMENT
\r
4703 \f SUBTTL USER-DEFINED SYMBOL SEARCH ROUTINES
\r
4704 MSRCH: PUSHJ PP,SEARCH ;PERFORM GENERAL SEARCH
\r
4705 POPJ PP, ;NOT FOUND, EXIT
\r
4706 JUMPG ARG,MSRCH2 ;SKIP-EXIT AND CROSS-REF IF FOUND
\r
4707 CAME AC0,1(SX) ;WE ARE LOOKING AT SYMBOL, TRY ONE ABOVE
\r
4708 POPJ PP, ;NO, EXIT
\r
4709 ADDI SX,2 ;YES, POINT TO IT
\r
4710 PUSHJ PP,SRCH5 ;LOAD REGISTERS
\r
4711 MSRCH2: AOSA 0(PP) ;SET SKIP-EXIT
\r
4712 QSRCH: JUMPL ARG,SSRCH3 ;BRANCH IF OPERAND
\r
4713 MOVEI SDEL,%MAC ;SET OPERATOR FLAG
\r
4714 TLZE IO,DEFCRS ;IS IT A DEFINITION?
\r
4715 MOVEI SDEL,%DMAC ;YES
\r
4716 JRST CREF ;CROSS-REF AND EXIT
\r
4718 SSRCH: PUSHJ PP,SEARCH ;PERFORM GENERAL SEARCH
\r
4719 POPJ PP, ;NOT FOUND, EXIT
\r
4720 JUMPL ARG,SSRCH2 ;SKIP-EXIT AND CROSS-REF IF FOUND
\r
4721 SSRCH1: CAME AC0,-3(SX) ;WE ARE LOOKING AT MACRO, LOOK ONE SLOT BELOW
\r
4722 POPJ PP, ;NO DICE, EXIT
\r
4723 SUBI SX,2 ;YES, POINT TO IT
\r
4724 PUSHJ PP,SRCH5 ;LOAD REGISTERS
\r
4725 SSRCH2: AOS 0(PP) ;SET FOR SKIP-EXIT
\r
4726 SSRCH3: MOVEI SDEL,%SYM ;SET OPERAND FLAG
\r
4728 CREF: TLNE FR,P1!CREFSW ;PASS ONE OR CROSS-REF SUPPRESSION?
\r
4729 POPJ PP, ;YES, EXIT
\r
4730 EXCH SDEL,C ;PUT FLAG IN C, SACE C
\r
4732 TLOE IO,IOCREF ;HAVE WE PUT OUT THE 177,102
\r
4734 PUSH PP,C ;START OF CREF DATA
\r
4736 REPEAT 0,< ;NEEDS CHANGE TO CREF
\r
4741 TLO IO,IOCREF ;WE NOW ARE IN THAT STATE
\r
4742 POP PP,C ;WE HAVE NOW
\r
4743 CREF3: JUMPE C,NOFLG ;JUST CLOSE IT
\r
4744 PUSHJ PP,OUTLST ;TYPE OF SYMBOL (%MAC,%DMAC,%SYM)
\r
4745 MOVSI CS,770000 ;COUNT CHRS
\r
4746 TDZA C,C ;STARTING AT 0
\r
4747 LSH CS,-6 ;TRY NEXT
\r
4748 TDNE AC0,CS ;IS THAT ONE THERE?
\r
4750 PUSHJ PP,OUTLST ;PRINT NUMBER OF SYMBOL CONSTITUENTS
\r
4756 PUSHJ PP,OUTLST ;THE ASCII SYMBOL
\r
4760 PUSHJ PP,OUTLST ;MARK IT AS A DEFINING OCCURENCE
\r
4761 NOFLG: MOVE C,SDEL
\r
4765 CLSCRF: TRNN ER,LPTSW
\r
4766 POPJ PP, ;LEAVE IF WE SHOULD NOT BE PRINTING
\r
4767 CLSCR2: MOVEI C,177
\r
4769 TLZE IO,IOCREF ;WAS IT OPEN?
\r
4770 JRST CLSCR1 ;YES, JUST CLOSE IT
\r
4771 MOVEI C,102 ;NO, OPEN IT FIRST
\r
4772 PUSHJ PP,OUTLST ;MARK BEGINNING OF CREF DATA
\r
4775 CLSCR1: MOVEI C,103
\r
4776 JRST OUTLST ;MARK END OF CREF DATA
\r
4778 CLSC3: TLZ IO,IOCREF
\r
4782 JRST OUTLST ;177,104 CLOSES IT FOR NOW
\r
4783 > ;END OF REPEAT 0
\r
4784 REPEAT 1,< ;WORKS WITH EXISTING CREF
\r
4786 PUSHJ PP,OUTL ;GET CORRECT SUBTTL
\r
4791 POP PP,C ;WE HAVE NOW
\r
4792 CREF3: PUSHJ PP,OUTLST ;TYPE OF SYMBOL (%MAC,%DMAC,%SYM)
\r
4793 MOVSI CS,770000 ;COUNT CHRS
\r
4794 TDZA C,C ;STARTING AT 0
\r
4795 LSH CS,-6 ;TRY NEXT
\r
4796 TDNE AC0,CS ;IS THAT ONE THERE?
\r
4798 PUSHJ PP,OUTLST ;PRINT NUMBER OF SYMBOL CONSTITUENTS
\r
4804 PUSHJ PP,OUTLST ;THE ASCII SYMBOL
\r
4808 PUSHJ PP,OUTLST ;MARK IT AS A DEFINING OCCURENCE
\r
4813 CLSCRF: TRNN ER,LPTSW
\r
4814 POPJ PP, ;LEAVE IF WE SHOULD NOT BE PRINTING
\r
4815 CLSCR2: TLZE IO,IOCREF ;FINISH UP LINE
\r
4820 PUSHJ PP,OUTLST ;MARK BEGINNING OF CREF DATA
\r
4821 CLSCR1: MOVEI C,177
\r
4824 JRST OUTLST ;MARK END OF CREF DATA
\r
4825 > ;END OF REPEAT 1
\r
4826 \fSEARCH: HLRZ SX,SRCHX
\r
4829 SRCH1: CAML AC0,-1(SX)
\r
4831 SRCH2: SUB SX,SDEL
\r
4836 SOJA SX,POPOUT ;NOT FOUND
\r
4838 SRCH3: CAMN AC0,-1(SX)
\r
4839 JRST SRCH4 ;NORMAL / FOUND EXIT
\r
4845 SOJA SX,POPOUT ;NOT FOUND
\r
4847 SRCH4: AOS 0(PP) ;SET FOR SKIP EXIT
\r
4848 SRCH5: MOVSI ARG,SUPRBT ;HE IS USING IT, TURN OFF BIT
\r
4849 ANDCAM ARG,0(SX) ; IN THE TABLE
\r
4850 SRCH7: MOVE ARG,0(SX) ;FLAG AND VALUE TO ARG
\r
4851 LDB RC,RCPNTR ;POINT 1,ARG,17
\r
4852 TLNE ARG,LELF ;CHECK LEFT RELOCATE
\r
4855 TLNE ARG,SPTR ;CHECK SPECIAL EXTESN POINTER
\r
4858 MOVE V,0(ARG) ;36BIT VALUE TO V
\r
4861 SRCH6: MOVE V,0(ARG) ;VALUE
\r
4862 MOVE RC,1(ARG) ;AND RELOC
\r
4863 TLNE RC,-2 ;CHECK AND SET EXTPNT
\r
4868 \fINSERQ: TLNE ARG,UNDF!VARF
\r
4869 INSERZ: SETZB RC,V
\r
4870 INSERT: CAME AC0,-1(SX) ;ARE WE LOOKING AT MATCHING MNEMONIC?
\r
4871 JRST INSRT2 ;NO, JUST INSERT
\r
4872 JUMPL ARG,INSRT1 ;YES, BRANCH IF OPERAND
\r
4873 SKIPL 0(SX) ;OPERATOR, ARE WE LOOKING AT ONE?
\r
4874 JRST UPDATE ;YES, UPDATE
\r
4875 JRST INSRT2 ;NO, INSERT
\r
4877 INSRT1: SKIPG 0(SX) ;OPERAND, ARE WE LOOKING AT ONE?
\r
4878 JRST UPDATE ;YES, UPDATE
\r
4879 SUBI SX,2 ;NO, MOVE UNDER OPERATOR AND INSERT
\r
4880 INSRT2: MOVE SDEL,SYMBOL
\r
4887 INSRT3: MOVEM SDEL,SYMBOL ;MAKE ROOM FOR A TWO WORD ENTRY
\r
4889 BLT SDEL,-2(SX) ;PUSH EVERYONE DOWN TWO LOACTIONS
\r
4890 AOS @SYMBOL ;INCREMENT THE SYMBOL COUNT
\r
4891 TLNN RC,-2 ;SPECIAL LEFT OR RIGHT EXTERNAL?
\r
4893 JRST INSRT5 ;YES, JUMP
\r
4894 TLNN V,-1 ;SKIP IF V IS A 36BIT VALUE
\r
4895 JRST INSRT4 ;JUMP, ITS A 18BIT VALUE
\r
4896 AOS SDEL,FREE ;36BIT, SO GET A CELL FROM FREE CORE
\r
4897 CAML SDEL,SYMBOL ;MORE CORE NEEDED
\r
4898 PUSHJ PP,XCEEDS ;YES
\r
4899 HRR ARG,SDEL ;POINT TO ARG
\r
4900 MOVEM V,0(ARG) ;36BIT VALUE TO FREE CORE
\r
4901 TLOA ARG,PNTF ;NOTE THAT ARG IS APOINTER, NOT A 18BIT VALUE
\r
4903 INSRT4: HRR ARG,V ;18BIT VALUE TO ARG
\r
4904 DPB RC,RCPNTR ;FIX RIGHT RELOCATION
\r
4906 TLO ARG,LELF ;FIX LEFT RELOCATION
\r
4907 INSRT6: MOVEM ARG,0(SX) ;INSERT FLAGS AND VALUE.
\r
4908 MOVEM AC0,-1(SX) ;INSERT SYMBOL NAME.
\r
4909 PUSHJ PP,SRCHI ;INITILIAZE SRCHX
\r
4910 JRST QSRCH ;EXIT THROUGH CREF
\r
4912 INSRT5: MOVEI SDEL,2 ;GET TWO CELLS FROM FREE CORE
\r
4914 CAML SDEL,SYMBOL ;MORE CORE NEEDED?
\r
4915 PUSHJ PP,XCEEDS ;YES
\r
4917 HRRI ARG,-1(SDEL) ;POINT TO THE ARG
\r
4919 TLO ARG,SPTR ;SET SPECIAL POINTER, POINTS TO TWO CELLS
\r
4921 \fREMOVE: SUBI SX,2 ;MOVE EVERYONE UP TWO LOCATIONS
\r
4922 REMOV1: MOVE 0,0(SX)
\r
4923 MOVEM 0,2(SX) ;OVERWRITE THE DELETED SYMBOL
\r
4924 CAME SX,SYMBOL ;SKIP WHEN DONE
\r
4928 SOS 0,0(SX) ;DECREMENT THE SYMBOL COUNT
\r
4930 SRCHI: MOVEI AC2,0 ;THIS CODE SETS UP SRCHX
\r
4940 \fUPDATE: DPB RC,RCPNTR ;FIX RIGHT RELOCATION
\r
4941 TLNE ARG,SPTR ;SKIP IF THERE IS NO SPECIAL POINTER
\r
4942 JRST UPDAT4 ;YES, USE THE TWO CELLS
\r
4943 TLNN RC,-2 ;NEED TO CHANGE ANY CURRENT EXTERNS
\r
4945 JRST UPDAT5 ;YES, JUMP
\r
4946 TLZ ARG,LELF ;CLEAR LELF
\r
4947 TLNE RC,1 ;LEFT RELOCATABLE?
\r
4948 TLO ARG,LELF ;YES, SET THE FLAG
\r
4949 TLNE ARG,PNTF ;WAS THERE A 36BIT VALUE?
\r
4950 JRST UPDAT2 ;YES, USE IT.
\r
4951 TLNE V,-1 ;NO,IS THERE A 36BIT VALUE?
\r
4952 JRST UPDAT1 ;YES, GET A CELL
\r
4953 HRR ARG,V ;NO, USE RH OF ARG
\r
4954 UPDAT3: MOVEM ARG,0(SX) ;OVERWRITE THE ONE IN THE TABLE
\r
4955 POPJ PP, ;AND EXIT
\r
4957 UPDAT1: AOS SDEL,FREE ;GET ONE CELL
\r
4958 CAML SDEL,SYMBOL ;NEED MORE CORE?
\r
4959 PUSHJ PP,XCEEDS ;YES
\r
4960 HRR ARG,SDEL ;POINT TO ARG
\r
4961 TLO ARG,PNTF ;AND NOTE IT.
\r
4962 UPDAT2: TLNE ARG,EXTF ;IS THERE A EXTERNAL?
\r
4963 JRST UPDAT3 ;YES, - JUST SAVE A LOCATION
\r
4964 MOVEM ARG,0(SX) ;NO, OVERWRITE THE POINTER IN THE TABLE
\r
4965 MOVEM V,0(ARG) ;STORE VALUE AS A 36BIT VALUES
\r
4966 POPJ PP, ;AND EXIT
\r
4968 UPDAT4: MOVEM ARG,0(SX) ;WE HAVE TWO CELLS, WE USE THEM
\r
4969 MOVEM V,0(ARG) ;SAVE AS 36BIT VALUE
\r
4970 MOVEM RC,1(ARG) ;SAVE RELCATION BITS
\r
4971 POPJ PP, ;AND EXIT
\r
4973 UPDAT5: MOVEI SDEL,2 ;THERE IS A EXTERNAL
\r
4974 ADDB SDEL,FREE ;SO WE NEED TWO LOCATIONS
\r
4975 CAML SDEL,SYMBOL ;NEED MORE CORE?
\r
4976 PUSHJ PP,XCEEDS ;YES
\r
4977 MOVEM RC,0(SDEL) ;SAVE RELOCATION BITS
\r
4978 HRRI ARG,-1(SDEL) ;SAVE THE POINTER IN ARG
\r
4979 MOVEM V,0(ARG) ;SAVE A 36BIT VALUE
\r
4980 TLO ARG,SPTR ;SET SPECIAL PNTR FLAG
\r
4981 TLZ ARG,PNTF ;CLEAR POINTER FLAG
\r
4982 JRST UPDAT3 ;SAVE THE POINTER AND EXIT
\r
4984 \fSUBTTL STORAGE CELLS
\r
4992 IFE CCLSW,<CTIBUF: BLOCK 3
\r
4996 IFN CCLSW,<CTLBUF: BLOCK <CTLSIZ+5>/5
\r
4997 IFN RUNSW,<RUNDEV: BLOCK 1
\r
5003 IFN CCLSW,<IFE RUNSW,<NUNDIR:>>
\r
5006 ACDELX: ;LEFT HALF
\r
5007 BLKTYP: BLOCK 1 ;RIGHT HALF
\r
5013 COUTDB: BLOCK ^D18
\r
5017 IFN RENTSW,<HHIGH: BLOCK 1 ;SAVE BREAK OF HIGH SEG. IN TWO SEG PROG.>
\r
5018 IFBLK: BLOCK .IFBLK
\r
5019 IFBLKA: BLOCK .IFBLK
\r
5022 LBUF: BLOCK <.CPL+5>/5
\r
5042 SBUF: BLOCK .SBUF/5
\r
5052 STCODE: BLOCK .STP
\r
5053 STOWRC: BLOCK .STP
\r
5056 TBUF: BLOCK .TBUF/5
\r
5100 IFN CCLSW,<OTBUF: BLOCK 2 >
\r
5114 R1BBLK: BLOCK .R1B
\r
5123 \fSUBTTL MULTI-ASSEMBLY STORAGE CELLS
\r
5126 IFN CCLSW,<EXTMP: BLOCK 1 ;HOLDS EXT OF COMMAND FILE (RH)
\r
5131 IFN TEMP,<TMPFLG: BLOCK 1>
\r
5132 VAR ;CLEAR VARIABLES
\r
5134 \f SUBTTL CONSTANTS
\r
5136 IFN TEMP,<TMPFIL: SIXBIT /MAC/
\r
5141 BYTE (7) 0, 11, 11, 11, 11
\r
5170 VBUF: ASCII / MACRO.V36/ ;MUST BE LAST LOCATIONS IN BLOCK
\r
5171 DBUF: ASCIZ / TI:ME DY-MON-YR PAGE /
\r
5172 JOBFFI: BLOCK 203*NUMBUF+1 ;INPUT BUFFER PLUS ONES
\r
5173 IFN PURESW,<LOWEND==.-1
\r