.TITLE FOCAL / EDIT 23 10--1--70 /OPTIMIZE RUN INIT. /USER AREAS EXTERNAL / / /FOCAL FOR THE PDP-9 AND PDP-15 ADVANCED SOFTWARE SYSTEM /ALSO FOR THE PDP9 AND PDP-15 BF MONITOR SYSTEM / /COPYRIGHT 1969 /DIGITAL EQUIPMENT CORP. /MAYNARD, MASS. / /DAVE LENEY /2-7-69 / /FOCAL IS A REGISTERED TRADEMARK OF /DIGITAL EQUIPMENT CORPORATION / /DEFINE MULTI=N IF MULTI-USER VERSION WHERE N=2 OR 4 USERS /DEFINE BF=0 IF BACKGROUND-FOREGROUND MONITOR /FOR PDP-9/15 BAKN MODE SYSTEM DEFINE: /PDP9=0,PDP15=0 /FOR DPD-9 SYSTEM DEFINE: /PDP9=0 /FOR PDP-15 SYSTEM, PDP9 AND PDP15 NOT DEFINED /DATA COMMANDS IMPLEMENTED FOR SINGLE USER .IFZER MULTI-4 USR4=0 .ENDC / /GLOBAL CALLS TO F4 ARITHMETIC PACKAGE / .GLOBL .AA /EXPONENT .GLOBL .AB /HIGH ORDER MANTISSA .GLOBL .AC /LOW ORDER MANTISSA .GLOBL .AO /LOAD (3 WORDS) .GLOBL .AP /STORE (3 WORDS) .GLOBL .AQ /ADD .GLOBL .AR /SUBTRACT .GLOBL .AS /MULTIPLY .GLOBL .AT /DIVIDE .GLOBL .AX /FIX .GLOBL .BA /NEGATE .GLOBL .AW /FLOAT .GLOBL .CD /NORMALIZE .GLOBL .BH /A**B-POWER .GLOBL DSIN /SINE .GLOBL DCOS /COSINE .GLOBL DATAN /ARCTANGMENT .GLOBL DLOG /LOGARITHM .GLOBL DEXP /EXPONENTIAL .GLOBL DSQRT /SQUARE ROOT .GLOBL .ER /.OTS ERROR (?36) / /.GLOBL REFERENCES FOR EXTERNAL FUNCTIONS / .GLOBL .NEWF /FUNCTION TABLE .GLOBL XPUSHJ /PUSH JUMP .GLOBL XPUSHA /PUSH AC .GLOBL PD2 /PUSH FLOATING .GLOBL PD3 /POP FLOATING .GLOBL UTRA /UNPACK .GLOBL XSPNOR /IGNORE SPACES .GLOBL FUNERR /ERROR IN EXTERNAL FUNCTION .GLOBL EFUN3 /FUNCTION RETURN .GLOBL FINT /FLOATING INTERPRETER .GLOBL CHAR /CHRACTER STORAGE .GLOBL EVAL /EVALUATION ROUTINE .GLOBL LASTV /END OF TEXT/VARIABLES .GLOBL BOTTOM /START OF PUSH-DOWN LIST .GLOBL LINENO /CURRENT LINE .GLOBL FLARG /FLOATING ARGUMENT .GLOBL BUFSTX /POINTER TO 3 WD UNPACK AREA .GLOBL XGETLN /FETCH LINE NUMBER .GLOBL XPOPJ /POP JUMP .GLOBL FETVAR /GET 3,6,OR 9 .SIXBT CHARS .IFDEF MULTI / EXTERNAL GLOBLS FOR USER AREAS ONE AND TWO .GLOBL AREA1,AREA2,FILA1,FILA2,FILB1,FILB2,FILC1,FILC2 .GLOBL BOT1,BOT2,BUF1,BUF2,ENDT1,ENDT2 .GLOBL ENDT1A,ENDT1C,ENDT1D,ENDT2A,ENDT2C,ENDT2D / INTERNAL GLOBLS USED BY USER AREAS ONE AND TWO .GLOBL CTLP1,CTLP2,WAITB1,WAITB2 .IFDEF USR4 / EXTERNAL GLOBLS FOR USER AREAS THREE AND FOUR .GLOBL AREA3,AREA4,FILA3,FILA4,FILB3,FILB4,FILC3 .GLOBL FILC4,BOT3,BOT4,BUF3,BUF4,ENDT3,ENDT4 .GLOBL ENDT3A,ENDT3C,ENDT3D,ENDT4A,ENDT4C,ENDT4D / INTERNAL GLOBLS USED BY USER AREAS THREE AND FOUR .GLOBL CTLP3,CTLP4,WAITB3,WAITB4 .ENDC .ENDC / FPOW=000000 /PSEUDO-FLOATING POINT INSTRUCTIONS. FADD=100000 FSUB=200000 FMPY=300000 FMUL=300000 FDIV=400000 FGET=500000 FPUT=600000 FNOR=700000 FEXT=0 FXIT=0 WORDS=3 DIGITS=11 .SCOM=100 XX=0 .EJECT .IFUND MULTI .IODEV -3,-2,3,5,7,10 TTI=776 TTO=775 BKI=3 BKO=5 AUXIN=7 AUXOUT=10 .ENDC .IFDEF MULTI .IODEV 1,2,3,4 .IFDEF USR4 .IODEV 5,6,7,10 .ENDC TTI=0 TTO=0 BKI=0 BKO=0 TTI1=1 TTO1=1 BKI1=2 BKO1=2 TTI2=3 TTO2=3 BKI2=4 BKO2=4 .IFDEF USR4 TTI3=5 TTO3=5 BKI3=6 BKO3=6 TTI4=7 TTO4=7 BKI4=10 BKO4=10 .ENDC COMEIN=0 COMOUT=0 IMBUFF=0 INBUF=0 OUTBUF=0 .ENDC /AUTO-INDEX REGISTERS AXIN=10 /STORAGE INDEX XRT=11 /EXTRA XR XRT2=12 /EXTRA XR PDLXR=13 /PUSHDOWN LIST INDEX REGISTER. FLTXR=14 /IOBUF-1 XR14 FOR FLOATING POINT X15=15 /FOR COMMON RESTORE X16=16 /FOR COMMON RESTORE / /IN THE MULTI USER SYSTEM 15 AND 16 ARE ALSO USED BY THE SWAP ROUTINES / .EJECT / /THE FOLLOWING BLOCK IS THE ENTIRE IMPURE / AREA FOR EACH FOCAL JOB / .IFDEF MULTI SWPSZE SWPBGN-SWPEND /BLOCK SIZE SWPBGN=. / RESTAR XSBEGN /RESTART ADDRESS FOR THIS JOB CTLP XX /ADDRESS OF ^P SWITCH FOR THIS USER BWAIT XX / FLAC 0 /.AA SAVE 0 /.AB SAVE 0 /.AC SAVE / FRSTSV 0 /FRST SAVE LIST31 0 /LIST3+1 SAVE / AUTOXR 0 /X10 SAVE 0 /X11 SAVE 0 /X12 SAVE 0 /X13 SAVE 0 /X14 SAVE / IMBFSV XX /BUFFER HEADER POINTERS IMBF2S XX INBFSV XX OTBFSV XX .FLINP XX /SUBROUTINE ENTRY POINTERS .XI33 XX .XOUTL XX .INPUT XX .DECON XX .DECNV XX .IMAGR XX .IMAGW XX / XX /RCAL01 XX /RCAL03 XX /WCAL01 XX /WCAL03 XX /WCAL04 XX /LBIN01 XX /LBIN1A XX /LBIN02 XX /LBIN03 XX /LBOUT1 XX /LBOUT2 XX /LBOUT3 XX /LBOUT4 XX /FILE01 XX /FILE02 XX /FILE03 .ENDC / /REENTRANT VARIABLES / BOTTOM XX /TOP OF PUSH-DOWN LIST BUFSTX XX /3 REG AREA BELOW TEXT AND VARIABLES /USED TO CONSTRUCT VARIABLES AND FILE /NAMES(FILE01 AND FILE02 CONTAIN SAME ADDR) ENDT XX /START OF TEXT STARTV XX /LAST LOCATION OF TEXT BUFR XX /NEXT LOCATION IN BUFFER (VARIABLES) LASTCV=STARTV /ADDRESS OF LAST COMMON VARIABLE FRSTCV XX /ADDRESS OF FIRST COMMON VARIABLE LASTV XX /ADDRESS OF LAST VARIABLE COMBUF COMEIN /COMMAND BUFFER START COMBOT COMOUT /AND END IMBUFP IMBUFF+2 /BUFFER DATA POINTERS INBUFP INBUF+2 OTBUFP OUTBUF+2 TEXTP=. /TEXT POINTERS AXOUT XX /OUTPUT INDEX XCTX 0 /UNPACK SWITCH GTEM 0 /UNPACK STORAGE MODBUF 0 /POINTER FOR MODIFY ENDCR 215 /LAST CHAR FOR GETC GETVCT 0 /VARIABLE COUNT SAVEOT 0 /OUTPUT CHAR PUTCNT -1 /OUTPUT COUNTER FOR HEADER PAIR TEMPK 0 /TEMP FOR PACK INSUB 0 /0= GETC; #0 = READC TTIN TTI TTOUT TTO BLKIN BKI BLKOUT BKO LIBRSW 0 /IN LIBRARY MODE .DATIN TTI .DATOUT TTO DATINS 0 /IN DATA MODE SWITCH EX1 0 AC1H 0 AC1L 0 OVER1 0 OVER2 0 OTEMP=OVER1 LTEMP=AC1L HTEMP=AC1H FISW 10 GETP 0 /ASCII STRING POINTER GETCX 0 /CHAR COUNTER (2'S COMP) GET1X 0 /TEMP GET2 0 /TEMP GET3 0 /TEMP PUTP 0 /ASCII STRING POINTER PUTC 0 /CHAR COUNTER PUT6 0 /TEMP SORTCN 0 /NUMBER IN TABLE FROM SORTC LASTOP 0 /LAST OPERATION FOR EVAL EFOP=. /FUNCTION CODE. ATSW 0 /ASK-TYPE CODE. CNTR -20 /DELETE AND ERROR COUNTER(USED BY F.P. ALSO) DECP 4 /NUMBER OF DECIMAL POINTS ADD XX /CHAR. BUF. IN. (DEBUG AIDS.SEE BELOW.) XCTIN XX /PACK SWITCH NAGSW 0001 /NOT ALL AND/OR GROUP SWITCH (4000=ONE;1=ALL;0=GROUP) CHAR 215 /THE MOST IMPORTANT REGISTER LINENO 0000 /LINE NUMBER READ BY GETLN PC FRSTA /PROGRAM COUNTER THISLN 0 /LINE POINTER FROM 'FINDLN' THISOP 0 /CURRENT 'EVAL' OPERATION LASTLN 0 /BACK POINTER FROM 'FINDLN' DEBGSW 1 /DEBUG SWITCH ; NON-ZERO FOR LITERAL. DMPSW 1 /=0 FOR TRACE ON. PACKST 0 /RUBOUT PROTECTION PT1 0 /VARIABLE POINTER T1 0 /TEMPORARY REGISTER - MAIN T2 0 /TEMP REGISTER - FOR NEW INST. ROUTINES. SACH 0 /SEARCH CHAR STORAGE FLARG 0 /DATA TEMPORARY STORAGE 0 0 FLARG2 0 0 0 .IFDEF MULTI SWPEND=. .ENDC / /NON-REENTRANT VARIABLES / BOX 0 /FOR DIGIT PRINT ER2T 0 /ERROR TEMP ERR2CT 0 /ERROR COUNT OP . XX /VARIABLE NAME (.SIXBT) .SIXBT /()=/ RANPT 0 /PUSEDO RANDOM POINTER FRST 0 /TEXT POINTER FRSTA 0 /DUMMY LINE NUMBER .IFUND PDP9 .IFUND PDP15 .SIXBT /C FOCAL15 V9A/<77><15> .ENDC .ENDC .IFDEF PDP9 .IFUND PDP15 .SIXBT /C FOCAL9 V9A/<77><15> .ENDC .ENDC .IFDEF PDP9 .IFDEF PDP15 .SIXBT /C FOCAL V9A/<77><15> .ENDC .ENDC SIGN2 0 /TEMP SIGN SCOUNT 0 PLCE=. FCOUNT 0 TEMPO 0 REMAIN 0 DIGIT 0 /DIGIT STORAGE (CURRENT) ISIGN 0 /0=MINUS,-1=PLUS DNUMBR 0 /NUMBER OF DIGITS BEXP 0 SEXP 0 /DECIMAL EXPONENT MODBF1=. JUMP 0 MODBF2=. JUMP2 0 ADDR 0 XY=. /TEMP FLOATING POINT FUNAME 0 /FUNCTION NAME FUNCTR 0 /FUNCTION COUNTER FUNPTR 0 /FUNCTION POINTER ARRAYN 0 /ARRAY NAME .IFDEF MULTI CLAC 0 /SAVE AC REGISTER CLAC1 0 /TEMP STORAGE REGISTERS CLAC4 0 /FOR MULTI USER CASE .ENDC / /CONSTANTS / P13 13 P17 17 C277 277 P3 3 P2 2 C100 100 C77 77 C260 260 M100 -100 C200 200 P177 177 GINC WORDS+2 CFRS FRST /DUMMY LINE ADDRESS FLARGP FLARG /DATA ADDRESS FILEXT .SIXBT /FCL/ CFRSX FLTZER /FLOATING 0 ADDRESS C306 306 C314 314 M137 -137 P337 337 C1=. FLTONE 000001 /FLOATING 1.0 200000 FLTZER 000000 /FLOATING 0.0 000000 000000 P40 40 C140 140 M140 -140 FOCAL9 4002 0 .IFUND PDP9 .IFUND PDP15 .ASCII /FOCAL15 V9A/<15> .ENDC .ENDC .IFDEF PDP9 .IFUND PDP15 .ASCII /FOCAL9 V9A/<15> .ENDC .ENDC .IFDEF PDP9 .IFDEF PDP15 .ASCII /FOCAL V9A/<15> .ENDC .ENDC CEX1 EX1-1 RND2 DIGITS+1 BUFST BUFFER-1 C144 144 M144 -144 TEN 000004 /FLOATING 10.0 240000 000000 P43 43 INDRCT 20000 MASK7 17777 C7 7 TABLE JMP* ITABLE OPTABL OPTABS .EJECT / /SUBROUTINE CONVENTIONS / /1)USE AC OR 'CHAR' ON ENTRY / SORTJ / PRINTC /2)USE 'CHAR' ONLY ON ENTRY / PACKC / SORTC / SPNOR / TESTN / TESTC /3)RETURN WITH 'CHAR' IN AC / READC / GETC / PACKC / SPNOR / SORTC / PRINTC / TESTC / INPUT /4)USE AC ONLY ON ENTRY / DECON / .EJECT /NEW INSTRUCTIONS: .DEFIN PUSHJ,A JMS XPUSHJ /RECURSIVE SUBROUTINE CALL A .ENDM .DEFIN POPA LAC* PDLXR /RESTORE AC .ENDM .DEFIN POPJ JMP XPOPJ /SUBROUTINE RETURN .ENDM .DEFIN PUSHA JMS XPUSHA /SAVE AC .ENDM .DEFIN PUSHF,A JMS PD2 /SAVE GROUP OF DATA A .ENDM .DEFIN POPF,A JMS PD3 /RESTORE GROUP A .ENDM .DEFIN GETC JMS UTRA /UNPACK A CHARACTER .ENDM .DEFIN PACKC JMS PACBUF /PACK A CHARACTER .ENDM .DEFIN SORTJ,A,B JMS SORTB /SORT AND BRANCH ON AC OR CHAR A-1 B-A .ENDM .DEFIN SORTJX,A /SORT + BRANCH ON COMMAND JMS XSORTX A-1 .ENDM .DEFIN SORTC,A JMS XSORTC /SORT CHAR A-1 .ENDM .DEFIN PRINTC JMS XOUTL /PRINT AC OR CHAR .ENDM .DEFIN READC JMS XI33 /READ KSR-33/35 INTO CHAR .ENDM .DEFIN PRNTLN JMS XPRNT /PRINT C(LINENO) .ENDM .DEFIN GETLN JMS XGETLN /UNPACK AND FORM A LINENUMBER .ENDM .DEFIN FINDLN JMS XFIND /SEARCH FOR A GIVEN LINE .ENDM .DEFIN ENDLN JMS XENDLN /INSERT LINE POINTERS .ENDM .DEFIN RTL6 JMS XRTL6 /ROTATE LEFT SIX .ENDM .DEFIN SPNOR JMS XSPNOR /IGNORE SPACES .ENDM .DEFIN TESTN JMS XTESTN /PERIOD; OTHER; NUMBER .ENDM .DEFIN TSTLPR JMS LPRTST /SKIP IF 5 13 C254 254 /, 14 C273 273 /; 15 215 /CR 16 C275 275 /= 17 / /CONTROL TABLE FOR ASK/TYPE OPERATIONS / ATLIST JMP TINTR JMP TQUOT JMP TCRLF JMP TCRLF2 JMP TDUMP JMP TASK4 JMP TASK4 JMP PROCES JMP PC1 / ALIST 245 /% - FLOATING FORMAT C242 242 /" - LITERAL 241 /! - CR AND LF 243 /# - CR ONLY 244 /$ - SYMBOL DUMP GLIST 240 /SPACE - END NAMES TLIST 254 /, - END EXPRESSIONS TLISTX 273 /; - END COMMANDS 215 /C.R. - END STRINGS / /DISPATCH TABLES FOR IF AND COMMON STATEMENTS / ILIST JMP IF1 /, JMP PROCES /; JMP PC1 /CR / FLIST2 JMP FLIMIT /, JMP FINFIN /; ERROR 11 /CR / FLIST1 JMP FINCR /, JMP PROCES /; JMP PC1 /CR / CLISTX JMP COMMON-1 /, JMP PROCES /; JMP PC1 /CR / /CONTROL TABLE FOR MODIFY OPERATION / LIST6 225 /^U - KILL LINE C375 375 /ALTMODE - NEXT OCCURANCE OF SEARCH CHAR. 207 /BELL - NEW SEARCH CHAR C212 212 /L.F. - END LINE SAVING REST C377 377 /RUBOUT - DELETE LAST CHAR LIST3=. CCR=. C215 215 /C.R. - END LINE DELETING REST 000 /SEARCH CHAR / SRNLST JMP SBAR /^U JMP SCHAR /F.F. JMP SCONT /BELL JMP SCONTX /L.F. JMP SCRUB /RUBOUT LISTGO JMP SRETN /CR JMP SFOUND /SEARCH CHAR / .EJECT .IFDEF MULTI / /THIS CODE CONTROLS THE MULTI-USER PROCESSING / OF TWO OR FOUR CONCURENT FOCAL USERS. / BUFFER=. MSTART LAC* (.SCOM+2 DAC T1 JMS TWOS TAD* (.SCOM+3 /GET SIZE CLL!RAR /DIVIDE BY TWO OR FOUR .IFDEF USR4 CLL!RAR .ENDC DAC ENDT /AMT FOR EACH /DETERMINE IF BG OR FG IN BF ENVIRONMENT /.SCOM+26 = 0 IF FG, = 1 IF BG LAC* (.SCOM+26 SNA JMP FGBY LAC BG1 .IFDEF USR4 DAC SCANQ /SET PROCESSING LOOP TO BYPASS IDLEC JMP FGBY .ENDC DAC WAIT3 FGBY LAC T1 /GO INITIALIZE REGS DAC* BUF1 DAC* FILA1 DAC* FILB1 DAC* FILC1 TAD (3 DAC* ENDT1 DAC* ENDT1A DAC* ENDT1C DAC* ENDT1D LAW -1 TAD T1 TAD ENDT DAC* BOT1 TAD C1 DAC T1 DAC* BUF2 DAC* FILA2 DAC* FILB2 DAC* FILC2 TAD (3 DAC* ENDT2 DAC* ENDT2A DAC* ENDT2C DAC* ENDT2D LAC (XSBEGN DAC* AREA1 DAC* AREA2 LAW -1 TAD T1 TAD ENDT DAC* BOT2 .IFDEF USR4 TAD C1 DAC T1 DAC* BUF3 DAC* FILA3 DAC* FILB3 DAC* FILC3 TAD (3 DAC* ENDT3 DAC* ENDT3A DAC* ENDT3C DAC* ENDT3D LAW -1 TAD T1 TAD ENDT DAC* BOT3 TAD C1 DAC T1 DAC* BUF4 DAC* FILA4 DAC* FILB4 DAC* FILC4 TAD (3 DAC* ENDT4 DAC* ENDT4A DAC* ENDT4C DAC* ENDT4D LAC (XSBEGN DAC* AREA3 DAC* AREA4 LAW -1 TAD T1 TAD ENDT DAC* BOT4 .ENDC .INIT TTO1,1,CP1+400000 .INIT TTO2,1,CP2+400000 .IFDEF USR4 .INIT TTO3,1,CP3+400000 .INIT TTO4,1,CP4+400000 .ENDC .WRITE TTO1,2,FOCAL9,40 .WRITE TTO2,2,FOCAL9,40 .IFDEF USR4 .WRITE TTO3,2,FOCAL9,40 .WRITE TTO4,2,FOCAL9,40 .ENDC JMP WAIT1 CTLP1 0 CTLP2 0 .IFDEF USR4 CTLP3 0 CTLP4 0 .ENDC CP1 0 ISZ CTLP1 .RLXIT CP1 CP2 0 ISZ CTLP2 .RLXIT CP2 .IFDEF USR4 CP3 0 ISZ CTLP3 .RLXIT CP3 CP4 0 ISZ CTLP4 .RLXIT CP4 .ENDC .EJECT /MAIN PROCESSING LOOP WAIT1 .WAITR TTI1,WAIT2 WAITB1 .WAITR TTI1,WAIT2 LAC AREA1 JMS RUN WAIT2 .WAITR TTI2,WAIT3 WAITB2 .WAITR TTI2,WAIT3 LAC AREA2 JMS RUN .IFUND USR4 WAIT3 NOP /WILL BE JMP WAIT1 IN 2 USER CASE .ENDC .IFDEF USR4 WAIT3 .WAITR TTI3,WAIT4 WAITB3 .WAITR TTI3,WAIT4 LAC AREA3 JMS RUN WAIT4 .WAITR TTI4,SCANQ WAITB4 .WAITR TTI4,SCANQ LAC AREA4 JMS RUN .ENDC SCANQ CAL /NO - GIVE BGD SOME TIME /SCANQ WILL CONT. JMP WAIT1 IN CASE OF 4USER 14 IDLE+700000 -12 CAL+1000 /.IDLEC ROUTINE WILL BYPASS THIS ON 17 /TIMER OVERFLOW CAL+1000 14 IDLE+700000 0 BG1 JMP WAIT1 /GO SEE IF ANYTHING DONE NOW / .EJECT /RUN INITIALIZATION RUN 0 TAD M1 DAC NEWUSR /CHECK FOR SAME USER SAD CURUSR /? JMP RESTAX /YES - NO SWAP LAC (MVSZE /SET TO SAVE INLINE DAC* (16 /TEMPORARIES LAC (BWAIT DAC* (17 LAC NEWUSR TAD P3 /AREA+2 DAC* (15 LAC MVSZE DAC RUNCT RUN1 LAC* 16 /SAVE REGS LOOP DAC RUNTP LAC* RUNTP DAC* 17 LAC* 15 /STORE TEMPS BEFORE SWAP DAC* RUNTP ISZ RUNCT JMP RUN1 LAC CURUSR /SWAP USERS INITIALIZATION DAC* (16 LAC NEWUSR DAC* (17 DAC CURUSR LAC (SWPBGN DAC RUNTP LAC SWPSZE DAC RUNCT RUN2 LAC* RUNTP /NOW DO SWAP DAC* 16 LAC* 17 DAC* RUNTP ISZ RUNTP ISZ RUNCT JMP RUN2 RESTAX CAL 14 TIME+700000 -12 DZM DELAY /NEED EXTRA LEVEL OF INDIRECTION SINCE USER AREAS(PURE) / ARE NOW EXTERNAL LAC* CTLP DAC CLAC1 LAC* CLAC1 SZA JMP RECOVR JMP* RESTAR /GO START UP USER /I/O BUSY OR OUT OF TIME RETURNS HERE IOBUSY 0 LAC .-1 /GET RETURN PC DAC RESTAR .IFDEF BF CAL+1000 /CLEAR OUT CALL FOR TIME 14 TIME+700000 0 .ENDC JMP* RUN / RUNTP 0 RUNCT 0 DELAY 0 / TIME 0 /SET DELAY ON OVERFLOW ISZ DELAY .RLXIT TIME / IDLE 0 /FORCE RETURN TO FGD .RLXIT IDLE / .EJECT / /COMMUNICATION BLOCK / CURUSR SWPBGN-1 /CURRENT USER AREA-1 NEWUSR 0 /NEW USER AREA-1 / /SPECIAL POINTERS FOR SAVE/RESTORE / MVSZE .+1-MVEND FLAC14 XX /.AA FLAC15 XX /.AB FLAC16 XX /.AC FRST LIST3+1 10 11 12 13 14 IMBF01 IMBF02 INBF01 OTBF01 FLINTP XI33 XOUTL INPUT DECON DECONV IMAGER IMAGEW RCAL01 RCAL03 WCAL01 WCAL03 WCAL04 LBIN01 LBIN1A LBIN02 LBIN03 LBOUT1 LBOUT2 LBOUT3 LBOUT4 FILE01 FILE02 FILE03 MVEND=. .ENDC START LAC FRSTCV SAD LASTCV /ANY COMMON? JMP STARTQ /NO - GO RESET POINTERS LAC MOVCOM SZA!CLA LAC C100 DAC T1 LAC FRSTCV TAD M1 TAD T1 DAC* (X15 LAC BUFR /SETUP NEW COMMON START DAC FRSTCV TAD M1 DAC* (X16 STARTL LAC T1 JMS TWOS TAD* (X15 SAD LASTCV /ANY MORE COMMON? JMP STARTC /NO LAC* X15 /YES - MOVE REG DAC* X16 JMP STARTL STARTC LAC* (X16 /SET NEW LAST ADDR JMP STARTB STARTQ LAC BUFR DAC FRSTCV STARTB DAC LASTCV DAC LASTV /AND VARIABLE POINTERS STARTZ ISZ DEBGSW /DISABLE TRACE FOR INPUT DZM MOVCOM LAC COMBOT /PROTECT COMMAND BUFFER DAC* (PDLXR ISZ DMPSW /INIT UNPACK AND TRACE SWITCH DZM LIST3+1 /CLEAR SEARCH CHARACTER FOR INPUT LAC RCAL01 /IS INPUT TTY IN? AND (777 SAD TTIN SKP JMP IBAR /DON'T PRINT * LAC WCAL01 AND (777 SAD TTOUT /MAKE SURE TTY OUT JMP IBARX LAC C252 /IF NOT TTY OUT USE IMAGE MODE JMS IMAGEW JMP IBAR IBARX LAC C252 /ANNOUNCE PRESENCE PRINTC LAC C375 PRINTC IBAR LAC COMBUF /INITIALIZE COMMAND BUFFER. DAC* (AXIN DZM XCTIN LAC CFRSX DAC PC IGNOR READC /READ COMMAND STRING SAD C215 JMP IRETN PACKC /SAVE STRING CHARACTER. JMP IGNOR ///// IRETN PACKC / PACK C.R. ISZ PC LAC COMBUF /INITIALIZE "TEXTP" GONE TAD C1 DAC AXOUT /SETUP CURRENT LINE M1 LAW -1 DAC XCTX GETC /READ FIRST CHARACTER. LAC BOTTOM /INIT PUSH-DOWN-LIST DAC* (PDLXR SPNOR TESTN /DOES THE LINE BEGIN WITH 1-9? ERROR 1 SKP JMP INPUTX /YES DZM DEBGSW /ENABLE TRACE DZM LINENO PUSHJ PROC /PROCESS IMMEDIATE COMMAND. LAC* PC /CHECK NEXT LINE (X-MEM) SNA /END OF PROGRAM? JMP STARTZ /YES DAC PC /SAVE NEW LINE NO. TAD C1 /START NEW LINE JMP GONE /PROCESS OTHER COMMANDS ///// INPUTX GETLN /READ THIS LINE NUMBER LAC NAGSW SMA!CLA /TEST FOR SINGLE LINE ERROR 2 JMS MOVCOM /OFFSET COMMON LAC BUFR /SET POINTERS DAC* (AXIN DZM XCTIN LAC LINENO /SAVE LINE # DAC* AXIN /(X-MEM) SKP!CLA GETC /READ 1ST AFTER LINENO TERMINATOR. PACKC /SAVE SPACE AND OTHERS - RESTORE DATA FIELD SAD C215 /TEST FOR END SKP JMP .-4 PUSHJ DELETE /REMOVE OLD LINE, IF ANY. ENDLN /INSERT NEW LINE JMP START .EJECT /TEXT LINE BUFFER FORMAT* /#1 : POINTER OR ZERO IN LAST /#2 : LINENO /#3 - #N+1 : TEXT /#N : C.R. XGETLN 0 /DEVELOP I.D. - "GETLN" SPNOR /IGNORE LEADING ZEROS AND SPACES. TESTN NOP JMP TESTA DZM INSUB /CALL 'GETC' FROM 'INPUT' FROM 'DECON' DZM* .AB DZM* .AC DZM OVER2 JMS DECON LAC OVER2 RTL6 RAL DAC LINENO AND P177 /GROUP TOO LARGE SZA!CLA ERROR 3 /YES LAC* .AC SZA ERROR 3 /GROUP TOO LARGE TESTN /TEST3 GETC /READ STEP NUMBER. /OTHER TESTN /TEST4 ERROR 5 /DOUBLE PERIODS JMP GEXIT /OTHER CLL /NUMBER *12 RTL TAD SORTCN RAL TAD LINENO DAC LINENO GETC /GET FINAL DIGIT TESTN /TEST5 ERROR 5 /MULTIPLE PERIODS JMP GEXIT /OTHER TAD LINENO DAC LINENO GETC /TEST FOR CORRECT TERMINATOR TESTN /TEST6 - I.E. NOT A NUMBER OR "." SKP JMP GEXIT ERROR 6 /TOO LARGE A LINE NUMBER. TESTA LAC CHAR SAD C242 JMP LBTEXT DZM LINENO SORTC GLIST JMP GEXIT LAW -11 JMS FETVAR LAC* BUFSTX SNA JMP GEXIT SORTJX ALLCM1 ERROR 23 GEXIT LAC LINENO /TEST FOR GROUP NUMBER. AND P177 SZA!CLA!CLL CML TAD LINENO AND P7600 SNA!CLA TAD P2 RAR DAC NAGSW JMP* XGETLN /RANGE OF ACCEPTIBLE LINE NUMBERS = 1.01 TO 99.99 /NAGSW: /GROUP=000000 /LINE=400000 /ALL=000001 XRTL6 0 /ROTATE AC LEFT SIX - "RTL6" CLL RTL RTL RTL JMP* XRTL6 .EJECT /RECURSIVE OPERATE, EXECUTE, OR CALL DO GETLN /EXECUTE ONE LINE, A GROUP,OR ALL LAC PC /SAVE ADDRESS PUSHA /OF CURRENT LINE PUSHF TEXTP /SAVE REST OF THIS LINE DGRP PUSHF NAGSW /SAVE NAGSW; CHAR; AND LINENO. LAC NAGSW /CHECK DATA FROM GETLN. SPA!CLA /SKIP IF GROUP OR ALL JMP ONE /DO ONE LINE FINDLN /INIT FOR GROUP AND SET THISLN JMP TGRP2 DGRP1 PUSHJ PROCES-2 /EXECUTE OBJECT LINE AND SET PC. POPF NAGSW /RESTORE THE DATA LAC* PC /CHECK FOR END OF TEXT (X-MEM) SNA JMP DCONT /ALL DONE TAD C1 DAC PT1 /SAVE POINTER TO LINENO LAC NAGSW /CHECK FOR GROUP SMA!SZA!CLA JMP .+4 /DO ALL TAD* PT1 /TEST GROUP (X-MEM) TSTGRP JMP DCONT /NOT IN GROUP LAC* PT1 /READ NEXT LINE NO. (X-MEM) DAC LINENO JMP DGRP /CONTINUE THE SUBROUTINE ///// ONE FINDLN /FIND THE LINE ERROR 7 PUSHJ PROCES /EXECUTE IT LPROCS=.-1 POPF NAGSW /RESTORE CHAR DCONT POPF TEXTP /RESTORE TEXT POINTERS POPA /RESTORE ADDRESS OF CURRENT LINE. DAC PC JMP PROC /CONTINUE PROCESSING THIS LINE. /////// TGRP2 LAC THISLN /TEST FOR GOOD GROUP NUMBER. DAC* (XRT LAC* XRT TSTGRP ERROR 8 JMP DGRP1 .EJECT /PUSHDOWN LIST CONTROLS XPUSHA 0 /PUSHDOWN THE AC - "PUSHA" DAC T2 /BACKUP POINTER CLA!CMA /AND THEN JMS PCHK /CHECK CORE USAGE LAC T2 /OK DAC* PDLXR /PUSH DOWN LIST POINTER CLA!CMA /BACKUP AGAIN JMS PCHK LAC T2 JMP* XPUSHA PCHK 0 TAD* (PDLXR /INC IN AC DAC* (PDLXR JMS TWOS CLL TAD LASTV SZL!CLA ERROR 9 /STORAGE FILLED BY PUSH-DOWN LIST JMP* PCHK XPUSHJ 0 /RECURSIVE SUBROUTINE CALL - "PUSHJ" LAC* XPUSHJ DAC T2 /SAVE SUBR. ADDR. CLA!CMA JMS PCHK TAD XPUSHJ TAD C1 DAC* PDLXR /SAVE RETURN CLA!CMA JMS PCHK JMP* T2 /TRANSFER CONTROL PD2 0 /SAVE A FLOATING POINT NUMBER - "PUSHF" CLA!CMA /COMPUTE VARIABLE ADDR TAD* PD2 DAC* (XRT ISZ PD2 /FIX RETURN MFLT LAW -WORDS /COMPUTE PUSH. POINTER DAC T2 JMS PCHK LAC* XRT /(X-MEM) DAC* PDLXR ISZ T2 JMP .-3 LAC MFLT /RESET POINTER JMS PCHK JMP* PD2 PD3 0 / RESTORE A FLOATING POINT NUMBER - "POPF" CLA!CMA /GET VAR. ADDR. TAD* PD3 ISZ PD3 DAC* (XRT LAC MFLT DAC T2 LAC* PDLXR /MOVE DAC* XRT ISZ T2 JMP .-3 JMP* PD3 /EXIT ///// MOVCOM 0 /MOVE COMMON AREA LAC FRSTCV SAD LASTCV /ANY COMMON? JMP* MOVCOM /NO DAC MODBUF LAC LASTCV DAC T2 /CURRENT END TAD C100 DAC T1 /NEW END JMS TWOS TAD* (PDLXR SPA /OVERFLOW ERROR 16 MOVUPX LAC* T2 /MOVE BLOCK DAC* T1 LAC T2 /IS IT AT END? SAD MODBUF JMP* MOVCOM /YES - EXIT TAD M1 /NO - BACKUP POINTERS DAC T2 LAC T1 TAD M1 DAC T1 JMP MOVUPX / .EJECT /PRIMARY CONTROL AND TRANSFER GOTO GETLN /READ THE LINE NUMBER REQUESTED FINDLN /LOCATE IT AND RESET TEXTP ERROR 7 /NOT THERE LAC THISLN /SET PC DAC PC PROCES GETC /TEST FOR END OF LINE PROC=. .IFDEF MULTI LAC DELAY SZA JMS IOBUSY .ENDC LAC C273 DAC TLISTX /RESET IN CASE ENTRY FROM COMMON STMT LAC CHAR /FIRST CHARACTER READY = USE PROC SAD C215 PC1 POPJ /EXIT "PROCESS" SORTC GLIST /IGNORE "SPACE",",", AND ";". JMP PROCES .IFUND MULTI LAC DATINS /IN DATA MODE? SZA JMP DAT1 /YES .ENDC LAC LIBRSW RAL LAC CHAR SAD C314 JMP .+3 SZL DATE ERROR 31 .IFUND MULTI JMP DAT2 /CONTINUE DAT1 LAC CHAR /IF IN DATA MODE, MAKE LIBR. COMMANDS SAD C314 /ILLEGAL JMP DATE .ENDC DAT2 LAW -11 JMS FETVAR /GET COMMAND (3 WORDS) SORTC GLIST SKP ERROR 10 SORTJX COMLST /GO DO COMMAND ERROR 10 /ILLEGAL COMMAND .EJECT ///// COMMEN=PC1 /IS CONTINUE OR COMMENT /OUTPUT COMMAND TEXT WRITE GETLN /SET LINENO ISZ DEBGSW /DISABLE TRACE (ALWAYS DURING WRITE) FINDLN /SEARCH FOR LINE NUMBER JMP WTESTG /NOT THERE OR GROUP LAC LINENO SZA!CLA JMP .+4 LAC C215 PRINTC SKP PRNTLN /PRINT LINE NUMBER GETC PRINTC /PRINT TEXT OF A LINE. SAD C215 SKP /SKIP IF END OF LINE JMP .-4 LAC* THISLN /TEST FOR END OF TEXT (X-MEM) WTEST2 SNA JMP WRITED /EXIT;DO NEXT INDIRECT LINC. TAD C1 DAC PT1 /SAVE POINTER TO LINENO OF NEXT (X-MEM) LAC NAGSW SMA!CLA TAD* PT1 /(X-MEM) TSTGRP /TRY NEXT LINENO FOR GROUP. JMP WX WALL LAC* PT1 /SET LINENO (X-MEM) DAC LINENO JMP WRITE+2 /// WTESTG LAC THISLN /INIT GROUP PRINTOUT JMP WTEST2 ///// WX LAC NAGSW SMA!SZA!CLA /SKIP IF NOT ALL JMP WALL WRITED LAC C215 PRINTC POPJ LPOPJ=.-1 .EJECT ///// XTESTC 0 /TEST THE NATURE OF THE NEXT ALPHANUMERIC - "TESTC" SPNOR /IGNORE SPACES AND ZEROS HERE SORTC TERMS /TEST THE VARIABLE TERMINATOR FOR EVAL JMP XTESTX /YES - SORTCN IS SET ISZ XTESTC SAD C306 /TEST FOR "F" JMP XT3 TESTN /TEST FOR . OR 0-9 JMP XTESTX SKP JMP XTESTX ISZ XTESTC XT3 ISZ XTESTC /RETURNS:T;N;F;A XTESTX LAC CHAR JMP* XTESTC XSORTC 0 /SORT CHAR AGAINST TABLE - "SORTC" LAC* XSORTC DAC* (XRT2 /1ST ARG IS LIST-1 LAC* XRT2 SPA /LIST IS ENDED BY A NEGATIVE NUMBER JMP SEXC /2AND EXIT = NOT IN LIST SAD CHAR SKP /COMPARE JMP .-5 LAC* XSORTC /COMPUTE INCREMENT : 0 - N CMA TAD* (XRT2 DAC SORTCN SKP /1ST EXIT = YES SEXC ISZ XSORTC ISZ XSORTC LAC CHAR JMP* XSORTC GRPTST 0 /AC VS LINENO - "TSTGRP" AND P7600 JMS TWOS DAC T2 P7600 LAW 17600 AND LINENO TAD T2 SNA!CLA ISZ GRPTST JMP* GRPTST .EJECT /CONDITIONAL TRANSFER PROCESS. GETC /IF (EXP) A,B,C; IF LAC CHAR SAD C240 JMP IF-1 SAD C250 SKP ERROR 11 /NO SPACE AFTER IF OR ILLEGAL FORMAT. PUSHJ EVAL-1 /EVALUATE EXPRESSION GETC /MOVE PAST ")" M2 LAW -2 DAC T1 LAC FLARG+1 /TEST -,0,+ SPA ISZ T1 /TO -1,-2,-3 SPA!SNA!CLA IF3 ISZ T1 /COUNT COMMAS SKP JMP GOTO /TRANSFER SORTJ TLIST,ILIST /SEARCH TEXT UNTILL ,;C.R. GETC JMP .-4 IF1 GETC /MOVE PAST JMP IF3 .EJECT ///// /LOOP CONTROL STATEMENT SET=. /SUBSET OF "FOR". FOR PUSHJ GETARG /LOOPS, ETC. SPNOR /IGNORE SPACES SAD C275 SKP ERROR 12 /LEFT OF "=" IN ERROR: 'FOR' OR 'SET' LAC PT1 PUSHA /SAVE POINTER TO VARIABLE PUSHJ EVAL-1 /GET INITIAL VALUE EXPRESSION POPA DAC PT1 JMS FINT /INITIALIZE NOW. FGET FLARG FPUT* PT1 FXIT SORTJ TLIST,FLIST1 /TEST LAST CHAR FROM "EVAL" ERROR 13 /EXCESS R-PAR ///// FINCR LAC LPROCS /SET OPERATION DAC FPUSHJ LAC LPOPJ /SET EXIT DAC FPOPJ FINCRX LAC PT1 /SAVE VARIABLE ADDRESS * PUSHA PUSHJ EVAL-1 /EVALUATE THE INCREMENT,IF ANY. SORTJ TLIST,FLIST2 /TEST TERMINATORS ERROR 14 ///// FLIMIT PUSHF FLARG /SAVE THE INCRE. * PUSHJ EVAL-1 /GET THE LIMIT FCONT PUSHF FLARG /SAVE THE LIMIT * PUSHF TEXTP /SAVE TEXT OF OBJECT STATEMENTS PUSHJ PROCES /DO THE OBJECT STATEMENTS FPUSHJ=.-1 POPF TEXTP /RESTORE REMAINING TEXT. POPF FLARG /GET LIMIT POPF FLARG2 /GET INCREMENT POPA /GET VARIABLE ADDRESS DAC PT1 JMS FINT /INCREMENT AND TEST FGET* PT1 /LOAD THE VARIABLE FADD FLARG2 /INCREMENT IT FPUT* PT1 /CHANGE IT FSUB FLARG /TEST IT FXIT GETSGN SMA!SZA!CLA POPJ /END OF LOOP FPOPJ=.-1 LAC PT1 PUSHA /SAVE ADDRESS * PUSHF FLARG2 /SAVE INCREMENT AGAIN * JMP FCONT ///// FINFIN PUSHF FLTONE /SET INCREMENT TO ONE. JMP FCONT .EJECT GETC COMMON LAC STARTV /CHECK FOR LEGALITY SAD LASTV /OF COMMON STATEMENT SKP JMP COMMEN /NOT LEGAL - COMMENT SPNOR /OK SAD C250 /IS IT LEFT PAREN JMP COMARY /YES - PROCESS ARRAY PUSHJ GETARG /NO - NORMAL VARIABLE COMMX SPNOR LAC LASTV /SET END OF COMMON DAC LASTCV LAC CHAR SORTJ TLIST,CLISTX /CHECK FOR TERMINATOR ERROR 37 /FORMAT ERROR COMARY GETC TESTC /CHECK FIRST CHAR NOP NOP ERROR 15 /FORMAT ERROR LAW -3 /GET WHOLE VARIABLE JMS FETVAR /NAME LAC CHAR SAD C254 /MUST BE A COMMA SKP ERROR 37 /FORMAT ERROR LAC* BUFSTX /GET VARIABLE NAME DAC ARRAYN PUSHJ EVAL-1 /SKIP COMMA AND EVALUATE JMS FINT FGET FLARG FPUT XY FXIT LAC LITX /USE X AS COUNTER DAC PT1 LAC C251 /SET TERMINATOR DAC TLISTX LAC (COMDEC /SET OPERATION DAC FPUSHJ LAC (JMP COMEND /SET EXIT DAC FPOPJ JMP FINCRX /GO PROCESS ARRAY DEF COMDEC LAC ARRAYN /GET NAME DAC* BUFSTX JMS* .AO /GET COUNTER LITX XY JMP GS1A COMEND LAC LASTV DAC LASTCV LAC CHAR SAD C251 /LAST PAREN? JMP COMMX /YES ERROR 37 /NO - FORMAT ERROR / .EJECT /INPUT-OUTPUT STATEMENTS ASK SKP!CLA!CMA /REMEMBER WHICH CALL. (-1) FOR ASK TYPE CLA /0 FOR TYPE DAC ATSW TASK DZM DEBGSW /RE-ENABLE THE TRACE CLA SORTJ ALIST,ATLIST /SPECIAL CHARACTER? ISZ ATSW /TEST QUOTE SWITCH JMP TYPE2 PUSHJ GETARG /DO ASK; SETUP PT1 LAC LBIN01 /INPUT FROM TT SAD TTIN SKP JMP ASK2 /DON'T T : LAC LBOUT2 SAD TTOUT SKP JMP ASK2 /DON'T T : LAW 272 /TYPE COLON PRINTC LAC C375 PRINTC ASK2 LAC CHAR PUSHA /SAVE IN-LINE CHARACTER ISZ INSUB /INDICATE 'READC' LAC C215 DAC ENDCR LAC C1 /POINT PAST CHAR JMS FLINTP /READ DATA AND SAVE LAC C215 DAC ENDCR POPA /RE-TEST LAST TERMINATOR DAC CHAR JMP ASK /CONTINUE PROCESSING //// TYPE2 PUSHJ EVAL /DO TYPE JMS FLOUTP /PRINT SORTC GLIST JMP TYPE ERROR 4 ///// TQUOT ISZ DEBGSW /DISABLE TRACE GETC /TYPE LITERALS SAD C242 /" JMP TASK5 SAD C215 /CR JMP PC1 PRINTC JMP TQUOT+1 ////// TASK5 LAC ATSW /TYPE OR ASK? SNA JMP TASK4 /TYPE-GET NEXT CHAR. TCRLF LAC CCR /SLASH=CR,LF. PRINTC TASK4 GETC /MOVE TO NEXT CHARACTER JMP TASK //// TCRLF2 LAC C375 PRINTC LAC C215 JMS IMAGEW LAC C200 JMS IMAGEW JMP TASK4 /IF DEBGSW=0 : ENABLE FLIP-FLOP "DMPSW" / #0: DISABLE AND RETURN ALL"?" ' S. /IF DMPSW = 0: TRACE ON, IF ENABLED / #0: TRACE OFF /IF BOTH = 0 : PRINT TRACE. TINTR GETC /PASS PERCENT SIGN GETLN /READ FORMAT CONTROL: "%7.03" LAC LINENO AND C77 DAC DECP LAC LINENO RAR RTR RTR RTR AND C77 DAC FISW JMP TASK .EJECT //// /SEARCH ROUTINES MODIFY GETLN /READ LINE NO. FINDLN /LOOK IT UP NOW. ERROR 7 /NOT THERE = BAD COMMAND UNLESS ZERO. JMS MOVCOM /DISPLACE COMMON LAC BUFR /SET POINTERS DAC* (AXIN /FOR INPUT DZM XCTIN LAC LINENO /COPY THE SAME LINE NUMBER. SNA /CHECK FOR ALL ERROR 7 DAC* AXIN /(X-MEM) LAC* (AXIN /SAVE START OF NEW LINE DAC PACKST LAC COMBUF DAC MODBUF /SET MODIFY COMMAND BUFFER SCONT JMS IMAGER /GET SEARCH CHAR SKP SCONTX CLA /CLEAR SEARCH CHAR DAC SACH /SAVE SEARCH CHARACTER ISZ DEBGSW /NO BREAKS. SCHAR LAC SACH DAC LIST3+1 /PUT IN "SORTJ" LIST GETC DAC CHAR /SAVE FOR SORTJ DAC* MODBUF ISZ MODBUF JMS IMAGEW SORTJ LIST3,LISTGO /LOOK FOR MATCH JMP SCHAR ///// SBAR LAW 300 /ECHO @ FOR ^U JMS IMAGEW LAC COMBUF /RESET TO BEGINNING OF BUFFER DAC MODBUF SFOUND DZM LIST3+1 JMS IMAGER /READ FROM KEYBOARD DAC CHAR SORTJ LIST6,SRNLST /CHECK FOR ACTION CHANGE LAC CHAR DAC* MODBUF /PACK CHAR ISZ MODBUF JMP SFOUND /GO GET MORE SRETN LAC C215 DAC* MODBUF /SAVE CR LAC COMBUF DAC MODBUF LAC* MODBUF /FINISH LINE AND SAVE IT DAC CHAR PACKC ISZ MODBUF SAD C215 /END LINE? SKP /YES JMP .-6 LAC C212 JMS IMAGEW PUSHJ DELETE /REPLACE WITH NEW LINE ENDLN JMP START /RESET POINTERS SCRUB LAC MODBUF SAD COMBUF /AT BEGINNING? JMP SFOUND /YES TAD M1 /NO DAC MODBUF LAW 334 /ECHO BACK SLASH JMS IMAGEW JMP SFOUND /GO PROCESS NEXT .EJECT SORTB 0 /SORT AND BRANCH ROUTINE. - "SORTJ" SNA LAC CHAR /ASSUME CHAR IF AC=0 DAC T2 /SAVE SORT ITEM LAC* SORTB /FIRST ARG IS LIST LESS ONE ISZ SORTB /2AND IS INTRA-LIST LENGTH DAC* (XRT2 LAC* XRT2 SPA /**LIST ENDED BY NEGATIVE NUMBER** JMP SEX SAD T2 /FIND ADDRESS SKP JMP .-5 LAC* (XRT2 /MATCH FOUND. TAD* SORTB DAC T2 CLA JMP* T2 SEX ISZ SORTB /MATCH NOT FOUND. CLA!CLL JMP* SORTB /RETURN TO CALLING SEQUENCE. / /SORT AND BRANCH ON COMMAND / XSORTX 0 /"SORTJX" LAC* XSORTX /GET TABLE START DAC* (XRT2 LAC* XRT2 /SET SIZE DAC T2 ANYMAT LAC BUFSTX /GET COMMAND POINTER DAC MODBF1 DZM MODBF2 MORMAT LAC* XRT2 /GET COMMAND TABLE ENTRY SAD* MODBF1 JMP ENDMAT /FULL WORD MATCH DAC SORTB /SAVE FOR END TEST AND (770000 SAD* BUFSTX JMP YESMAT /ONE LETTER MATCH JMP NOTMAT ENDMAT AND C77 /IS IT END OF COMMAND SNA JMP* XRT2 /DISPATCH ISZ MODBF1 ISZ MODBF2 /DISABLE ONE LETTER MATCH JMP MORMAT /TEST REST OF COMMAND LAC* XRT2 SKP YESMAT LAC SORTB /TEST FOR COMMAND END AND C77 SZA JMP YESMAT-2 LAC MODBF2 /ONE LETTER OK SNA JMP* XRT2 /DISPATCH NOTMAT LAC* XRT2 /SKIP REST OF COMMAND AND (700000 SAD (600000 /ENDS WITH JMP SKP JMP .-4 ISZ T2 /ANY MORE IN TABLE JMP ANYMAT /YES ISZ XSORTX /NO - ERROR RETURN JMP* XSORTX / .EJECT /FETCH VARIABLE FROM INPUT FETVAR 0 DAC GETVCT /-3 OR -6 OR -9 LAW -1 /(BUFFER-1 TAD BUFSTX DAC* (AXIN DZM XCTIN /BEGIN PACK OF VARIABLE NAME GETVAP PACKC /PACK CHAR GETC SORTC TERMS /CHECK FOR TERMINATORS JMP GETVAX ISZ GETVCT /HAVE THREE CHARS BEEN USED JMP GETVAP /NO-GO PACK THIS ONE LAW -1 /IGNORE REST DAC GETVCT JMP GETVAP+1 GETVAX ISZ GETVCT SKP!CLA JMP* FETVAR JMS PCK1 /USE NULLS JMP GETVAX /FIND OR ENTER A VARIABLE IN THE LIST. GETARG TESTC /FIRST LETTER OF ARG NOP NOP / FUNCTION OR NUMBER IS NOT AN ARG. ERROR 15 /BAD ARGUEMENT IN 'FOR', 'SET', OR 'ASK' GETVAR LAW -3 JMS FETVAR TSTLPR /LOOK FOR SUBSCRIPT VIA SORTCN JMP GS1 /NOT SUBSCRIPTED BY L-PAR. LAC LASTOP /SAVE LAST OPERATION PUSHA LAC* BUFSTX /SAVE NAME PUSHA PUSHJ EVAL-1 /MOVE PAST L-PAR AND EVALUATE SUBSCRIPT POPA DAC* BUFSTX /RESTORE NAME GETC /MOVE PAST R-PAR POPA DAC LASTOP /RECALL LAST OPERATION GS1A JMS FIX GS1 DAC SUBS /SAVE SUBSCRIPT LAC FRSTCV /SEARCH FOR VARIABLE GS3 DAC PT1 SAD LASTV /TEST FOR END OF LIST JMP GS2 /END SEARCH LAC* PT1 /GET TABLE ENTRY SAD* BUFSTX JMP GFND1 /FOUND XX GS4 LAC PT1 /TRY NEXT ONE TAD GINC JMP GS3 GS2 LAC LASTV /ADD THE VARIABLE TAD P13 /TEST RAN LIMITS CLL JMS TWOS TAD* (PDLXR SNL!CLA ERROR 16 LAC LASTV TAD GINC DAC LASTV LAC* BUFSTX /SAVE NAME DAC* PT1 ISZ PT1 /SAVE SUBSCRIPT LAC SUBS DAC* PT1 ISZ PT1 /SET PT1 JMS FINT FGET FLTZER FPUT* PT1 FXIT POPJ /EXIT //// GFND1 LAC PT1 /FOUND SAME DAC* (XRT /TEST SUBSCRIPTS LAC* XRT JMS TWOS TAD SUBS SZA!CLA JMP GS4 /WRONG SUBSCRIPT ISZ PT1 /SET POINTER TO DATA ISZ PT1 POPJ .EJECT //// ///IGNORE LEADING SPACES - "SPNOR" SUBS=. XSPNOR 0 LAC CHAR SAD C240 SKP JMP* XSPNOR GETC JMP XSPNOR+2 XTESTN 0 /RETURNS: .; OTHER; NUMBER - "TESTN" MPER LAW -256 TAD CHAR SZA!CLA ISZ XTESTN LAW -260 TAD CHAR DAC SORTCN /SAVE VALUE SPA!CLA JMP ZTESTN LAW -271 TAD CHAR SPA!SNA!CLA ISZ XTESTN /IF A NUMBER ZTESTN LAC SORTCN JMP* XTESTN /EXIT FROM A "DO" SUBROUTINE RETURX LAC CFRS /(PC) => 0 TAD C1 /TO PRETEND END OF TEXT DAC PC XPOPJ LAC* PDLXR /RECURSIVE EXIT - "POPJ" DAC T2 CLA JMP* T2 .EJECT /EVALUATE AN EXPRESSION WHICH /TERMINATES WITH AN R-PAR,; OR C.R. AND /LEAVE THE RESULT IN FLAC AND IN FLARG. GETC /MOVE PAST EXTRA CHARACTER EVAL DZM LASTOP /EVAUATION CONTROLLER TESTC /TEST CHARACTER AND IGNORE SPACES JMP ETERM1 /TERMINATION JMP ENUM /NUMBER JMP EFUN /FUNCTION PUSHJ GETVAR /FIND OR CREATE VARIABLE;ALSO SET PT1. OPNEXT TESTC /PT1=>ARG JMP ETERMN /T NOP /N-ERROR IN FORMAT NOP /F ERROR 17 /L - MISSING OPERATOR ///// ETERM1 LAC CHAR SAD C275 ERROR 17 PUSHF FLTZER /INITIALIZE RESULT TO ZERO. POPF FLARG LAC FLARGP /SET PT1. DAC PT1 LAC M2 /TEST FOR UNARY OPERATIONS TAD SORTCN SNA JMP ETERM /CREATE DUMMY FOR UNARY MINUS TAD C1 SNA!CLA JMP ARGNXT /IGNORE UNARY PLUS TAD SORTCN /TEST FOR NULL PARENS. TAD M11 SPA!CLA JMP ELPAR /MIGHT BE AN L-PAR. ETERMN TSTLPR SKP ERROR 18 /OPERATOR MISSING BEFORE PAREN ETERM LAC SORTCN /SET FROM "TESTC"-"SORTC" DAC THISOP TAD M11 SMA!CLA /END? DAC THISOP /"THISOP" EQUIV. TO END OF EXP. ETERM2 LAC THISOP /COMPARE PRIORITIES JMS TWOS TAD LASTOP SPA!CLA JMP EPAR /CONTINUE TAD LASTOP /FIND OPERATION FROM TABLE TAD OPTABL DAC FLOP LAC* FLOP DAC FLOP LAC LASTOP SNA!CLA /TEST FOR END OF DATA INTO FLOATING AC. JMP .+3 POPF XX /GET LAST DATA FLAC1=.-1 /.AA JMS FINT FLOP 00 /(FLOPR I PT1)+-*/ FPUT FLARG /SAVE RESULT FXIT LAC FLARGP DAC PT1 LAC THISOP TAD LASTOP /=0? SNA!CLA POPJ /EXIT "EVAL" POPA /GET PRIOR OP DAC LASTOP JMP ETERM2 /COMPARE THIS OP ///// EPAR TSTLPR /TEST FOR SUB-EXPRESSION SKP JMP EPAR2 /GO EVALUATE EXPRESSION LAC LASTOP /CONTINUE READING THE EXPRESSION PUSHA /SAVE "LASTOP". LAC PT1 DAC .+2 PUSHF XX /SAVE LAST ARGUMENT LAC THISOP /MORE TO COME DAC LASTOP ARGNXT GETC /READ 1ST CHAR OF AN ARG. TESTC /DO SPECIAL CHECK JMP ELPAR /COULD BE LEFT PAREN JMP ENUM /N JMP EFUN /F JMP OPNEXT-2 /L ///// ENUM PUSHF XX /TO PROCESS A NUMBER,SAVE AC FLAC2=.-1 /.AA LAC FLARGP /SET POINTER AS FOR VARIABLE. DAC PT1 DZM INSUB /POINT TO 'GETC' AND USE CHAR CLA /READ NEXT JMS FLINTP /READ TEXT NUMBER => (PT1) POPF XX /RESTORE THE AC FLAC3=.-1 /.AA JMP OPNEXT /CONTINUE ///// EFUN GETC LAW -3 JMS FETVAR /GET FUNCTION NAME LAC SORTCN /SAVE 'SORTCN','LASTOP',AND 'EFOP' PUSHA LAC LASTOP PUSHA LAC* BUFSTX /SAVE FUNCTION NAME PUSHA TSTLPR ERROR 19 /MUST BE FOLLOWED BY PARENS TO SET ARGUMENT PUSHJ EVAL-1 /YES POPA DAC FUNAME /SAVE FUNCTION NAME LAC (FNTABF JMS FUNCHK /IS IT INTERNAL FUNCTION LAC .NEWF JMS FUNCHK /IS IT EXTERNAL FUNCTION ERROR 20 /ILLEGAL FUNCTION NAME FUNCHK 0 /DISPATCH ON FUNCTION NAME DAC FUNPTR /FUNCTION TABLE START LAC* FUNPTR SMA JMP* FUNCHK DAC FUNCTR /FUNCTION TABLE COUNT FUNLOP ISZ FUNPTR /POINTS TO NEXT NAME LAC FUNAME SAD* FUNPTR /RIGHT FUNCTION? JMP FUNFND /YES - GO DISPATCH ISZ FUNPTR /NO - TRY NEXT ISZ FUNCTR /ANY MORE IN TABLE? JMP FUNLOP /YES JMP* FUNCHK /NO - RETURN FUNFND ISZ FUNPTR /TO FUNCTION ADDRESS JMP* FUNPTR /DISPATCH ///// ELPAR TSTLPR ERROR 21 /DOUBLE OPERATORS EPAR2 LAC SORTCN /LEFT PARENS FOUND. PUSHA LAC LASTOP /SAVE DATA PUSHA PUSHJ EVAL-1 /EVALUATE THE EXPRESSION RETURN .EJECT ///// /SOME MINOR FUNCTIONS XINT JMS FIX /INTEGER PART RETURN XSGN JMS* .AO /TAKE SIGN*1 OF FLARG FLTONE LAC FLARG+1 SKP XABS GETSGN /TAKE ABSOLUTE VALUE OF FLAC SPA!CLA /SKIP TO CONTINUE JMS* .BA /NEGATE THE FLOATING AC /CONTINUATION OF FUNCTION CALLS. EFUN3 POPA /RESTORE LAST OPERATION DAC LASTOP JMS* .CD /NORMALIZE FUNCTION RETURN JMS* .AP /SAVE FUNCTION VALUE FLARG LAC FLARGP /SET POINTER DAC PT1 POPA /GET LAST PAREN CODE. TAD P3 JMS TWOS /CHECK FOR PAREN MATCH. TAD SORTCN /(STILL SET FROM THE LAST "EVAL") SZA!CLA /SKIP IF MATCH ERROR 22 /PAREN ERROR GETC /MOVE PAST R-PAR, AND RETURN TO OPNEX. JMP OPNEXT /FUNTION RETURN IS OK LPRTST 0 /SKIP IF LEFT PAREN. - 'TSTLPR' M11 LAW -11 TAD SORTCN SMA!CLA JMP* LPRTST LAW -5 TAD SORTCN SMA!SZA!CLA ISZ LPRTST JMP* LPRTST .EJECT /THE DELETE A LINE ROUTINE DELETE FINDLN /SETS "THISLN" AND "LASTLN". POPJ /ALREADY GONE ISZ DEBGSW /DISABLE TRACE GETC /MEASURE LENGTH SAD C215 SKP!CLA!CMA JMP .-3 TAD AXOUT /SAVE LAST ADDRESS CMA TAD THISLN DAC CNTR /LENGTH < 0 LAC* THISLN /DISCONNECT DAC* LASTLN LAC CFRS /START LIST AT TOP DOK DAC T2 /EXAMINATION ADDRESS LAC* T2 /GET THE NEXT ADDR. SNA /TEST FOR END JMP DONE /YES-WRAP UP ALL. DAC T1 /SAVE NEXT ADDRESS. LAC THISLN /COMPARE LINE POSITIONS CLL JMS TWOS TAD T1 SZL!CLA /SKIP IF THISLN > X TAD CNTR /CHANGE (X) TO ACCOUNT FOR TAD T1 /GARBAGE COLLECTION. DAC* T2 LAC T1 /GET NEXT JMP DOK .EJECT ///// /GARBAGE COLLECTION DONE CLA!CMA /BACKUP L FOR XR TAD THISLN DAC* (XRT LAC CNTR /SETUP END OF HOSE CMA TAD THISLN DAC* (XRT2 LAC CNTR /CORRECT END OF BUFFER POINTER. TAD BUFR DAC BUFR LAC* (AXIN /COMPUTE COUNT CMA TAD* (XRT2 DAC T1 LAC* (AXIN TAD CNTR DAC* (AXIN LAC* XRT2 /SIPHON LOWER PART. DAC* XRT ISZ T1 JMP .-3 JMP DELETE /RESET 'LASTLN','THISLN', AND DATA FIELD. ///// .EJECT ERASE TESTC /TEST THE SECOND WORD, IF ANY. JMP ERVX /ERASE VARIABLES JMP ERL /LINES OR GROUPS ERROR 23 LAW -11 JMS FETVAR SORTJX ALLCM2 ERROR 23 /BAD ARG FOR ERASE. XSBEGN LAC ENDT /ERASE ALL TEXT ** DAC BUFR DZM* CFRS JMP START /POINTERS MAY BE DIFFERENT NOW. ////// ERL GETLN /ERASE LINES. LAC LINENO AND P7600 SNA ERROR 7 LAC BUFR /PROTECT REST OF TEXT. DAC* (AXIN ERG PUSHJ DELETE /EXTRACT ONE LINE ISZ THISLN LAC NAGSW SMA!CLA TAD* THISLN /(X-MEM) TSTGRP /SKIP IF G(AC) = G(LINENO) JMP START LAC* THISLN /(X-MEM) DAC LINENO JMP ERG ///// ERVX LAC STARTV /INIT VARIABLES MAY BE IN THE TEXT DAC LASTV POPJ .EJECT /ROUTINE CALLED VIA "FINDLN": /SEARCH FOR A GIVEN LINE I.D. =[ "LINENO" ] /1ST RETURN IF NOT FOUND, /2AND IF FOUND. /"THISLN" = FOUND LINE OR NEXT LARGER. /"LASTLN" = LESSER AND/OR LAST. /"TEXTP" IS SET XFIND 0 LAC CFRS /INITIALIZE POINTERS TO FIRST LINE DAC LASTLN FINDN DAC THISLN /SAVE THIS ONE DAC* (XRT2 LAC LINENO SPA /MAX 99.99 ERROR 24 JMS TWOS TAD* XRT2 /LINENO=0 WILL ALSO BE FOUND SNA JMP FEND2 /FOUND IT. SMA!CLA JMP FEND3 /PAST IT. TAD THISLN /MOVE POINTERS DAC LASTLN LAC* THISLN SZA JMP FINDN SKP FEND2 ISZ XFIND /2ND EXIT = FOUND FEND3 LAC THISLN TAD P2 DAC AXOUT /SET "TEXTP". LAW -1 DAC XCTX .IFUND MULTI LAC DEBGSW TAD DMPSW SZA!CLA JMP* XFIND LAC SAVEOT SAD C215 SKP SAD C375 JMP .+3 LAC C375 PRINTC LAC IMBUFF+2 SAD C215 JMP .+3 LAC C215 JMS IMAGEW LAC C212 JMS IMAGEW .ENDC JMP* XFIND UTRA 0 /UNPACK CHARACTER. - "GETC" JMS GET1 UTE SPA!CLA /NORM & EXTEND TAD C100 /300-337 & 340-376 TAD M137 /240-276 & 200-236 TAD CHAR SNA JMP UTX /"?" FOUND TAD P337 UTQ DAC CHAR .IFUND MULTI LAC DEBGSW TAD DMPSW SZA!CLA /PRINT ONLY IF BOTH ARE ZERO. JMP UTRAX LAC SAVEOT SAD C215 SKP SAD C375 JMP .+3 LAC C375 PRINTC LAC CHAR JMS IMAGEW LAC CHAR /FIX FOR TRACE FEATURE...WAD... SAD C215 /IF CR OUTPUT LF SKP JMP UTRAX /NOT A CR. NO LF LAC C212 /OUTPUT LF JMS IMAGEW /...END OF FIX...JUNE 69 UTRAX LAC CHAR .ENDC JMP* UTRA ////// EXTR JMS GET1 CMA JMP UTE /// UTX LAC DEBGSW /TEST FOR TRACE-ENABLED SZA!CLA JMP UTXP6 TAD DMPSW /FLIP THE TRACE FLOP SNA!CLA TAD C1 DAC DMPSW JMP UTRA+1 /GET NEXT CHARACTER INSTEAD. UTXP6 TAD C277 /TRACE DISABLED = RETURN "?" JMP UTQ GET1 0 /UNPACK 6-BITS ISZ XCTX /STARTS=-1 JMP GENDX LAW -3 DAC XCTX LAC* AXOUT /NEXT WORD ISZ AXOUT DAC GTEM GENDX LAC GTEM RTL6 DAC GTEM RAL AND C77 DAC CHAR /SAVE SAD C77 JMP EXTR /EXTENDED LAW -40 TAD CHAR JMP* GET1 .EJECT XENDLN 0 /TERMINATE THE BUFFERED LINE - "ENDLN" LAC* LASTLN /SAVE OLD POINTER DAC* BUFR LAC BUFR DAC* LASTLN LAC ADD SZA DAC* AXIN LAC* (AXIN TAD C1 DAC BUFR JMP* XENDLN XPRNT 0 /PRINT A LINE NUMBER - "PRNTLN" LAC LINENO RTR RTR RTR RAR JMS PRNT LAC PER PRINTC LAC LINENO JMS PRNT JMP* XPRNT ////// PRNT 0 /PRINT TWO DIGITS AND P177 DAC VAL LAC C260 DAC BOX LAC VAL JMP .+3 ISZ BOX XYZ DAC VAL TAD M12 SMA JMP XYZ-1 LAC BOX PRINTC LAC VAL TAD C260 PRINTC JMP* PRNT .EJECT .IFUND MULTI IMBUFF 2003; 0; 0; -1 INBUF .BLOCK 60 .ASCII <15> OUTBUF 1000 .BLOCK 57 .ASCII <15> .ENDC IMAGEW 0 DAC IMAC /STORE AC FOR SORTB DAC* IMBUFP IMBF01=.+2 WCAL03 .WRITE -3,3,IMBUFF,3 .IFUND MULTI .WAIT -3 .ENDC .IFDEF MULTI JMS IOBUSY .ENDC LAC IMAC /RESTORE AC FOR SORTB JMP* IMAGEW IMAC 0 /STORAGE FOR AC IMAGER 0 IMBF02=.+2 RCAL03 .READ -2,3,IMBUFF,3 .IFUND MULTI .WAIT -2 .ENDC .IFDEF MULTI JMS IOBUSY .ENDC LAC* IMBUFP AND P177 XOR C200 JMP* IMAGER .EJECT ///// VAL=. XI33 0 /"READC" LAC ENDCR /WAS LAST INPUT CR SAD C215 SKP /YES JMP XI33NX /NO - GO GET NEXT FROM BUFFER INBF01=.+2 RCAL01 .READ -2,2,INBUF,48 .IFUND MULTI RCAL02 .WAIT -2 .ENDC .IFDEF MULTI JMS IOBUSY .ENDC LAC* INBF01 AND P17 SAD (5 /EOF? JMP RDEOM /YES SAD (6 /EOM? JMP RDEOM /YES LAC INBUFP JMS .GETI /UNPACK INITIALIZATION XI33NX JMS .GET /UNPACK CHARACTER XOR C200 SAD C200 /IGNORE NULL JMP XI33NX SAD C377 /IGNORE RUBOUTS JMP XI33NX SAD C212 /IGNORE LINE-FEED JMP XI33NX SAD C375 /USE CR FOR ESC LAC C215 DAC ENDCR DAC CHAR JMP* XI33 .EJECT XOUTL 0 /"PRINTC" SNA /USE AC OR CHAR LAC CHAR DAC SAVEOT /SAVE CHAR ISZ PUTCNT /READY TO BUMP WPC? JMP XOUTLQ /NO LAC* OTBF01 /YES SAD (31000 /HAS THE BUFFER OVERFLOWED? JMP XOUTLI /YES - IGNORE CHAR TAD (1000 /NO - UPDATE WPC DAC* OTBF01 LAW -5 DAC PUTCNT /RESET COUNT XOUTLQ LAC* OTBF01 SAD (31000 JMP XOUTLI /BUFFER OVERFLOWED - DONT SAVE CHAR LAC SAVEOT /GET CHAR JMS .PUT XOUTLI LAC SAVEOT SAD C215 /OUTPUT BUFFER ON CR OR ESC JMP XOUTLX SAD C375 JMP XOUTLX JMP XOUTLZ XOUTLX=. OTBF01=.+2 WCAL01 .WRITE -3,2,OUTBUF,48 LAC OTBUFP JMS .PUTI LAW -1 DAC PUTCNT .IFUND MULTI WCAL02 .WAIT -3 .ENDC .IFDEF MULTI JMS IOBUSY .ENDC LAC (1000 DAC* OTBF01 XOUTLZ LAC CHAR JMP* XOUTL .EJECT .DEC .REPT 37 ISZ ERR2CT .OCT ERR2=. ERRPCX LAC TTOUT /REINIT FOR TT IN CASE IN LIB. MODE JMS SETWCL LAC C277 PRINTC LAC ERR2CT JMS PRNT DZM ERR2CT /CLEAR FOR NEXT ERROR ISZ PC /PRINT LINENO IF INDIRECT COMMAND LAC* PC SNA JMP ERR2T DAC LINENO /SAVE FOR PRINTING LAC C240 PRINTC PRNTLN ERR2T LAC CCR PRINTC JMP RECVR FUNERR DAC ERR2CT /SAVE TWO DIGIT ERROR CODE LAC C277 PRINTC /PRINT DOUBLE ? JMP ERRPCX .IFUND MULTI RECOVR LAC TTOUT /REINIT TT JMS SETWCL DZM LIBRSW DZM DATINS LAC CCR PRINTC .ENDC .IFDEF MULTI RECOVR DZM* CLAC1 /CLAC1 SET IN RESTAX ROUTINE DZM LIBRSW /REINIT LIB. SW DZM DATINS /REINIT DATA SW LAC TTOUT /REINIT TT IN CASE IN LIB. OR DATA MODE JMS SETWCL LAC CCR PRINTC JMS IOBUSY .ENDC WCAL04 .WRITE -3,2,FOCAL9,40 RECVR=. .IFDEF MULTI JMS IOBUSY .ENDC LAC OTBUFP JMS .PUTI LAC C215 DAC ENDCR LAW -1 DAC PUTCNT LAC (1000 DAC* OTBF01 LAC TTIN /RESET CAL FOR NORMAL INPUT JMS SETRCL LAC TTOUT JMS SETWCL JMP STARTZ .EJECT /SET WRITE CAL'S SUBROUTINE SETWCL 0 DAC LBOUT2 DAC LBOUT3 DAC LBOUT4 .IFUND MULTI DAC WCAL02 /.WAIT .ENDC XOR (1000 .IFDEF MULTI DAC CLAC /SAVE AC /NEED EXTRA LEVEL OF INDIRECTION SINCE USER AREAS ARE /EXTERNAL LAC* BWAIT DAC CLAC4 LAC CLAC /RESTORE AC DAC* CLAC4 /PROPER .WAITR .ENDC DAC LBOUT1 /.INIT TAD (1000 DAC WCAL01 /.WRITE JMP* SETWCL /SET READ CAL'S SUBROUTINE SETRCL 0 DAC LBIN01 DAC LBIN02 DAC LBIN03 .IFUND MULTI DAC RCAL02 /.WAIT XOR (2000 .ENDC .IFDEF MULTI DAC CLAC /SAVE AC /NEED EXTRA LEVEL OF INDIRECTION SINCE PURE USER AREAS /ARE EXTERNAL LAC* BWAIT DAC CLAC4 LAC CLAC /RESTORE AC XOR (1000 DAC* CLAC4 /PROPER .WAITR TAD (1000 .ENDC DAC RCAL01 /.READ TAD (1000 DAC LBIN1A JMP* SETRCL / .EJECT PACBUF 0 /PACK A CHARACTER - "PACKC" LAW -277 TAD CHAR SNA /CHANGE 277 TO 337 TAD P40 TAD M100 SNA /TEST FOR RUBOUT. HLT TAD C377 DAC T2 /SAVE INPUT ITEM /SO THAT QUESTION DOESN'T MAKE AND C140 /CHAR LOOK LIKE A LEFT-ARROW TAD M140 SZA /DATA WORD. TAD C140 SNA!CLA JMP ESCA /340-377 AND 200-237 TR1 LAC T2 /240-337 AND C77 SZA /IGNORE 300 JMS PCK1 LAC T2 SAD C215 JMP .+3 PACBXT LAC CHAR JMP* PACBUF LAC XCTIN SNA!CLA JMP PACBXT JMS PCK1 JMP .-4 ////// ESCA LAC C77 JMS PCK1 JMP TR1 .EJECT PCK1 0 DAC TEMPK LAC XCTIN /=0 TO START TAD (JMP PCKTB DAC .+2 LAC ADD XX PCKTB JMP ROT-1 JMP ROT RTL6 DZM XCTIN TAD TEMPK DAC* AXIN DZM ADD /CLEAR PACKING WORD LAC* (PDLXR /CHECK FOR OVERFLOW (TAD P7600) TO PROTECT (X-MEM) CMA!CLL TAD C1 TAD P13 /RESERVATIONS TAD* (AXIN SNL!CLA JMP* PCK1 ERROR 16 /FULL BUFFER ///// CLA ROT RTL6 TAD TEMPK DAC ADD ISZ XCTIN JMP* PCK1 .EJECT TDUMP LAC FRSTCV /INIT POINTER FOR SYMBOL DUMP. ISZ DMPSW /TURN OFF THE TRACE FOR EXIT DAC PT1 SAD LASTCV JMS TDUMPC SAD LASTV /TEST FOR END OF LIST. POPJ LAC* PT1 DAC OP+1 /(DCA I XOP)-FOR(X-MEM) LAC OP TAD C1 DAC AXOUT LAW -1 DAC XCTX LAW -4 JMS TDUMPX ISZ PT1 LAC* PT1 /READ SUBSCRIPT TO 99 JMS PRNT LAW -2 JMS TDUMPX ISZ PT1 JMS* .AO /PICK UP VALUE PT1+400000 JMS FLOUTP /PRINT VALUE LAC C215 PRINTC LAC GINC TAD M2 TAD PT1 JMP TDUMP+2 /// TDUMPX 0 DAC T1 GETC PRINTC ISZ T1 JMP .-3 JMP* TDUMPX TDUMPC 0 LAC C255 PRINTC LAC C215 PRINTC LAC PT1 JMP* TDUMPC .EJECT /// XRAN LAC* RANPT /RANDOM NUMBER GENERATOR. ISZ RANPT RAL TAD RANPT TAD* PT1 RAL DAC* .AB TAD* RANPT DAC* .AC DZM* .AA LAC RANPT SAD* (.SCOM DZM RANPT RETURN /TWOS COMPLEMENT - CIA TWOS 0 CMA TAD C1 JMP* TWOS .EJECT .IFUND MULTI COMEIN=. BEGIN LAC* (.SCOM+3 DAC BOTTOM LAC* (.SCOM+2 DAC BUFSTX DAC FILE01 DAC FILE02 DAC FILE03 TAD (3 DAC ENDT DAC FRSTCV DAC LASTCV DAC LASTV LAC FILE01 TAD (2 DAC FLAC1 LAC FILEXT DAC* FLAC1 .INIT -3,0,RECOVR .WRITE -3,2,FOCAL9,40 .ENDC .IFDEF MULTI BEGIN=. .ENDC LAC .AA DAC FLAC1 DAC FLAC2 DAC FLAC3 .IFUND MULTI LAC (OUTBUF+2 JMS .PUTI JMP XSBEGN BUFFER=COMEIN+70 COMOUT=COMEIN+110 .LOC COMOUT 215 /STOPPER .ENDC .IFDEF MULTI DAC FLAC14 TAD (1 DAC FLAC15 TAD (1 DAC FLAC16 JMP MSTART .ENDC .EJECT /LIBRARY(DATA) COMMAND FORMAT: / LIBRARY(DATA) IN FILE / LIBRARY(DATA) OUT FILE / LIBRARY WRITE "ANY COMMAND / LIBRARY WRITE ALL / LIBRARY WRITE XX.00 / LIBRARY WRITE XX.YY / LIBRARY(DATA) KILL / LIBRARY(DATA) CLOSE / DATA=. .IFUND BF LAC (AUXIN) /.DAT SLOT FOR AUX. INPUT DAC .DATIN LAC M1 DAC DATINS /SET DATA MODE SW LAC (AUXOUT) /AUX. OUTPUT SLOT JMP LB1 .ENDC LIBRAR LAC BLKIN /SET SLOTS FOR LIB. MODE DAC .DATIN LAC BLKOUT LB1 DAC .DATOUT SPNOR /IGNORE SPACES SAD C215 /IGNORE COMMAND IF CR POPJ SAD C273 /IGNORE IF; POPJ LAW -11 JMS FETVAR SORTC GLIST SKP ERROR 32 SORTJX LIBCMD ERROR 32 /BAD LIBR CMD ARG / LBIN JMS LBFILE /GET FILE NAME LAC .DATIN //SET INPUT CALS JMS SETRCL LAC BLKIN /SETUP INPUT CAL'S DAC LIBRSW /SIGN BIT 0 .IFDEF MULTI JMS IOBUSY .ENDC LBIN01 .INIT TTI,0,RECOVR .IFDEF MULTI JMS IOBUSY .ENDC LAC FILE03 AND (77777 DAC FILE03 FILE03=.+2 LBIN1A .FSTAT TTI,XX DAC LBFILE LAC FILE03 AND (700000 SNA JMP .+4 LAC LBFILE SNA ERROR 34 .IFDEF MULTI JMS IOBUSY .ENDC FILE01=.+2 LBIN02 .SEEK TTI,XX .IFDEF MULTI JMS IOBUSY .ENDC LAC .DATIN .IFUND BF SAD (AUXIN) POPJ /RETURN .ENDC LAC CFRSX DAC PC LBINLP LAC CHAR SAD C215 POPJ /ALL DONE SAD C273 JMP PROCES /MORE IN COME IN GETC JMP LBINLP+1 RDEOM JMS LBIEND /END LIBR IF OPEN LAC C215 JMP XI33NX+2 HSPX JMS LBIEND /END LIBR IF OPEN JMP LBINLP / LBOUT JMS LBFILE /GET FILE NAME LAC .DATOUT /SETUP OUTPUT CAL'S JMS SETWCL .IFDEF MULTI JMS IOBUSY .ENDC LBOUT1 .INIT TTO,0,RECOVR .IFDEF MULTI JMS IOBUSY .ENDC FILE02=.+2 LBOUT2 .ENTER TTO,XX .IFDEF MULTI JMS IOBUSY .ENDC LAW -1 DAC LIBRSW JMP LBINLP / LBCLOS LAC LIBRSW SNA /SEE IF A FILE IS OPEN ERROR 35 SMA /IF OUTPUT CLOSE FOR OUTPUT JMP LBOUT5 /INPUT. CLOSE FOR INPUT LAC .DATOUT /RESET OUTPUT CALS IN CASE ERR MSG JMS SETWCL /PRINTED .IFDEF MULTI JMS IOBUSY .ENDC LBOUT3 .CLOSE TTO JMP LBOUTZ LBOUT5 JMS LBIEND JMP LBOUTZ LBKILL LAC LIBRSW SMA ERROR 35 LAC .DATOUT /RESET OUT CALS IN CASE ERR MSG JMS SETWCL /PRINTED .IFDEF MULTI JMS IOBUSY .ENDC LBOUT4 .INIT TTO,0,RECOVR LBOUTZ DZM LIBRSW /CLEAR LIBR SWITCH DZM DATINS /CLEAR DATA SW LAC TTOUT /RESET WRITE CAL'S JMS SETWCL JMP LBINL 2c@