;****** COMMON ROUTINES ALL ALL SEGMENTS SEARCH S IFNDEF BASEDT, ;EDIT PHASE IFNDEF BASCOM, ;COMPILE PHASE IFNDEF BASXCT, ;EXECUTE PHASE IFNDEF BASEC, IFNDEF BASEX, IFNDEF BASCX, IFN BASEDT, IFN BASCOM,<TITLE COMLIB> IFN BASXCT,<TITLE XCTLIB> EXTERN INLNFG,INPFLA,LIBFLG EXTERN CEIL,CHAFL2,COPFLG,CURBAS,CURDEV,CUREXT,CURNAM,DEVBAS EXTERN DRMBUF,FILDIR,FLOOR,HPOS,IFIFG,ODF,RENFLA,RENDON EXTERN SAVE1,STARFL,TTYBUF,TTYIN,TYI,TYO EXTERN .JBFF,.JBREL XLIST IFN BASEDT,< LIST EXTERN EDTXIT,LRUNNH UXIT=EDTXIT RUNNH=LRUNNH EXTERN BASIC,COMM1,FIXUP,LINROL,RTIME,RUNFLA EXTERN SAVFIL,TEMLOC,UNSATP,UNSER INTERN ERACOM,SCN2,CLOSUP,QST,BUMPRL,SCN3,RPUSH INTERN PANIC1,CTTAB,GETNU,OUTCNT,PTXER1,LINPT INTERN OUTPT,EOFFL,GOSR2,GOSR3,DPBSTR INTERN EOFFAL,INERR,OUCHX INTERN NOGETD,ERASE,INLSYS,XXXXXX,PRTOCT INTERN INLB1,INLINE,INLGEN,EDTXT1,DATTBL INTERN OUTERR,OUTLMS,OUTQMS,DSKOT,DOS INTERN SCNLT1,CPOPJ1,CPOPJ,NXCHD2,SCNLT3,NXCHD,CLOB,QSA INTERN INLMES,INLME1,NXCHS,PRINT,PRNSIX,NXCH,ATOMSZ,FILNAM INTERN PRNNAM,PANIC,OUCH,FILNM1,SEARCH,SCNLT2,FILNMO,ERRMS2 INTERN OPENUP,QSAX,ERRMS3,ERRMSG,PRESS,GETNUM,GTNUMB,LOCKON INTERN SKIPDA,DATCHK,DECFLO,DECTAB,D1EM4,QSELS,QSKIP,FIXCON INTERN EVANUM,D1EM18,D1E14,DECCEI INTERN LOCKOF,ALPHSX DEFINE FAIL(A,AC)< XWD 001000+AC'00,[ASCIZ /A/] > DEFINE INLEMS(C,A,B),< JRST [MOVEI T,B JRST ERRMSG] > DEFINE INLERR(C,A,B),< PUSHJ P,INLMES ASCIZ B > DEFINE ERROM(A,B),< ASCIZ B > XLIST > IFN BASCOM,< LIST EXTERN LBASIC BASIC=LBASIC EXTERN LUXIT INTERN SKIPDA,NXCHD2,NXCHS,INLME1,PRNSIX,ATOMSZ INTERN DECTAB,D1EM4,BASORT,FILNM1,PANIC,FIXCON,CTTAB INTERN QSAX,D1EM18,D1E14,QSELS,ALPHSX,DECFLO,DECCEI INTERN SCNLT1,CPOPJ1,ERACOM,CPOPJ,SCN2,PRINT,NXCHD,SCNLT3 INTERN SCNLT2,QST,CLOB,QSA,INLMES,BUMPRL,CLOSUP,SCN3,VSUB1 INTERN DATCHK,NXCH,FILNAM,RPUSH,PRNNAM,PANIC1,OUCH,EVANUM INTERN SEARCH,FILNMO,OPENUP,ERRMS2,GETNU,ERRMS3,ERRMSG INTERN PRESS,GETNUM,GTNUMB,LOCKON,LOCKOF,QSKIP DEFINE ERROM(A,B),< ASCIZ B > DEFINE INLEMS(C,A,B),< JRST [MOVEI T,B JRST ERRMSG] > DEFINE FAIL(A,AC),< XWD 001000+AC'00,[ASCIZ /A/] > XLIST > XLIST IFN BASXCT,< LIST EXTERN UXIT,LUXIT1 UXIT1=LUXIT1 BASIC=UXIT RUNNH=UXIT EXTERN .USREL,RUNDDT,NOLINE,NOTLIN EXTERN APPMAX,CHAER1,CHAXIT,CLSRAN,CRLF3,EOF31,EOF32,ERRTCN EXTERN ERRXCX,ERRXCY,ERRBPT,EXTD,FCNLNK,FILD,FPPN EXTERN INITO,LOK,LOKUP,MARGIN,MARWAI,MONLVL EXTERN OPS1,PAGLIM,PRDLER,QUOTBL,RENAMD,WRIPRI EXTERN REUXIT,TEMLOC,UXFLAG INTERN XXXXXX,SCNLTN INTERN PRINT,INLME1,QST,ATOMSZ,FILNM1,QSAX INTERN GETNU,ALPHSX,OUTCNT,OUTPT,PRTOCT INTERN UXIT7,UXIT6,DPBSTR,NOGETD,INLSYS INTERN PTXER1,LINPT,OUCH INTERN DATTBL,EOFFL,GOSR2,GOSR3,INLINE,INLB1,INLGEN INTERN OUTERR,OUTLMS,OUTQMS,DSKOT,DOS INTERN SKIPDA,D1E14,CPOPJ,CPOPJ1,NXCHD,NXCHD2,VPANIC INTERN NXCHS,QSA,INLMES,PRNSIX,VSUB1,DATCHK,NXCH,FILNAM,PRNNAM INTERN DECTAB,FIXCON,D1EM4,BASORT,CTTAB,EVANUM,SEARCH INTERN FILNMO,ERRMS3,D1EM18,GETNUM,GTNUMB,LOCKOF,LOCKON INTERN DECCEI,DECFLO,QSKIP DEFINE INLERR(C,A,B),< BYTE (9) 1,0,^D'C,^D'A > DEFINE ERROM(A,B),< > DEFINE INLEMS(C,A,B),< JRST [BYTE (9) 1,0,^D'C,^D'A JRST GOSR2] > XLIST > XLIST IFN BASEC,< LIST EXTERN CELIN,CETXT,CODROL,COMTOP,FLLIN,FLTXT EXTERN OLDCOD,PAKFLA,ROLTOP,SEXROL,TOPSTG XLIST > IFN BASEX,< LIST EXTERN ACTBL,CHAFLG,COMTIM,DDTFLG,FUNAME,GTSTS EXTERN INDSK,MTIME,NUMCOT,OUTTDS,PLIST,PRTNUM EXTERN SORCLN,STADSK,STODSK,STRCTR,STRPTR XLIST > IFN BASCX,< LIST EXTERN APPLST,BA,CEVSP,CORINC,FLVSP,INPFLA,LIBFLG EXTERN MASAPP,NUMAPP,NUMMSP,SRTDBA,SVRBOT EXTERN SVRTOP,VARFRE,VPAKFL,VRFBOT,VRFBTB,VRFTOP XLIST > LIST RELOC HISEG CTTAB: XWD F.NU, F.STR ;NULL , @ XWD F.STR, F.LETT ; , A XWD F.STR, F.LETT ; , B XWD F.STR, F.LETT ; , C XWD F.STR, F.LETT ; , D XWD F.STR, F.LETT ; , E XWD F.STR, F.LETT ; , F XWD F.STR, F.LETT ; , G XWD F.STR, F.LETT ; , H XWD F.SPTB, F.LETT ;TAB , I XWD F.CR, F.LETT ;LF , J XWD F.CR, F.LETT ;VER.TAB, K XWD F.CR, F.LETT ;FFEED , L XWD F.CR, F.LETT ;CR , M XWD F.STR, F.LETT ; , N XWD F.STR, F.LETT ; , O XWD F.STR, F.LETT ; , P XWD F.STR, F.LETT ; , Q XWD F.STR, F.LETT ; , R XWD F.STR, F.LETT ; , S XWD F.STR, F.LETT ; , T XWD F.STR, F.LETT ; , U XWD F.STR, F.LETT ; , V XWD F.STR, F.LETT ; , W XWD F.STR, F.LETT ; , X XWD F.STR, F.LETT ; , Y XWD F.STR, F.LETT ; , Z XWD F.ESC, F.STR ;ESC , [ XWD F.STR, F.APOS ; , \ XWD F.STR, F.STR ; , ] XWD F.STR, F.OTH ; , ^ XWD F.STR, F.OTH ; , _ XWD F.SPTB, F.STR ;SPACE , <ACCENT GRAVE> XWD F.STR, F.LETT+F.LCAS ; ! , <LOWER CASE> A XWD F.QUOT, F.LETT+F.LCAS ; " , <LOWER CASE> B XWD F.STR, F.LETT+F.LCAS ; # , <LOWER CASE> C XWD F.DOLL, F.LETT+F.LCAS ; $ , <LOWER CASE> D XWD F.STR, F.LETT+F.LCAS ; % , <LOWER CASE> E XWD F.OTH, F.LETT+F.LCAS ; & , <LOWER CASE> F XWD F.APOS, F.LETT+F.LCAS ; ' , <LOWER CASE> G XWD F.OTH, F.LETT+F.LCAS ; ( , <LOWER CASE> H XWD F.RPRN, F.LETT+F.LCAS ; ) , <LOWER CASE> I XWD F.STAR, F.LETT+F.LCAS ; * , <LOWER CASE> J XWD F.PLUS, F.LETT+F.LCAS ; + , <LOWER CASE> K XWD F.COMA, F.LETT+F.LCAS ; , , <LOWER CASE> L XWD F.MINS, F.LETT+F.LCAS ; - , <LOWER CASE> M XWD F.PER, F.LETT+F.LCAS ; . , <LOWER CASE> N XWD F.SLSH, F.LETT+F.LCAS ; / , <LOWER CASE> O XWD F.DIG, F.LETT+F.LCAS ; 0 , <LOWER CASE> P XWD F.DIG, F.LETT+F.LCAS ; 1 , <LOWER CASE> Q XWD F.DIG, F.LETT+F.LCAS ; 2 , <LOWER CASE> R XWD F.DIG, F.LETT+F.LCAS ; 3 , <LOWER CASE> S XWD F.DIG, F.LETT+F.LCAS ; 4 , <LOWER CASE> T XWD F.DIG, F.LETT+F.LCAS ; 5 , <LOWER CASE> U XWD F.DIG, F.LETT+F.LCAS ; 6 , <LOWER CASE> V XWD F.DIG, F.LETT+F.LCAS ; 7 , <LOWER CASE> W XWD F.DIG, F.LETT+F.LCAS ; 8 , <LOWER CASE> X XWD F.DIG, F.LETT+F.LCAS ; 9 , <LOWER CASE> Y XWD F.OTH, F.LETT+F.LCAS ; : , <LOWER CASE> Z XWD F.OTH, F.STR ; ; , <LEFT BRACE> XWD F.OTH, F.STR ; < , <VERTICAL BAR> XWD F.EQAL, F.STR ; = , <RIGHT BRACE> XWD F.OTH, F.STR ; > , <TILDE> XWD F.STR, F.STR ; ? , <RUBOUT> XLIST IFN BASEX,< LIST DATTBL: ASCIZ /JAN/ ;TABLE OF MONTHS, USED BY HEADING TYPEOUT. ASCIZ /FEB/ ASCIZ /MAR/ ASCIZ /APR/ ASCIZ /MAY/ ASCIZ /JUN/ ASCIZ /JUL/ ASCIZ /AUG/ ASCIZ /SEP/ ASCIZ /OCT/ ASCIZ /NOV/ ASCIZ /DEC/ XLIST > LIST SUBTTL COMMAND SUBROUTINES ;ROUTINE TO PICK UP FILE NAME AND SET UP FOR DSK ACTION. ;THE FLAG COPFLG IS EXPLAINED AT THE COPY ROUTINE COPER. FILNAM: SETZM COPFLG FILNM1: POP P,B ;COPER ENTERS HERE, WITH COPFLG = -1. SETZM DEVBAS MOVEI A,<SIXBIT / DSK/> HRLI A,<SIXBIT / BAS/> HRLZM A,@(B) HLLZM A,FILDIR+1 MOVEI X2,FILDIR PUSHJ P,ATOMSZ SETZM STARFL ;=0, MEANS DEVICE NOT YET SEEN. MOVEI X1,":" ;DEVICE INDICATOR. CAIE X1,(C) JRST FILN1 JUMPE A,COMM2 SETOM STARFL ;LT.0, MEANS EXPLICIT DEVICE SEEN. MOVEM A,DEVBAS MOVEM A,@(B) PUSHJ P,NXCH PUSHJ P,ATOMSZ XLIST IFN BASEDT,< LIST SKIPL COPFLG JRST FILN1 JUMPN A,FILN1 SETZM COPFLG JRST 1(B) XLIST > IFN BASCX,< LIST JRST FILN1 XLIST > LIST FILNMO: POP P,B ;ENTRY POINT FOR NO DEVICE ALLOWED. MOVEI A,<SIXBIT/ DSK/> HRLZM A,@(B) SETZM COPFLG HRRI A,<SIXBIT / BAS/> HRLZM A,FILDIR+1 MOVEM A,STARFL ;GT.0, MEANS NO DEVICE ALLOWED. MOVEI X2,FILDIR PUSHJ P,ATOMSZ FILN1: SETZM FILDIR+2 SETZM FILDIR+3 TLNN C,F.PER ;PERIOD SEEN? JRST FILN2 JUMPE A,COMM2 MOVEM A,FILDIR MOVEI X2,FILDIR+1 PUSHJ P,NXCH PUSHJ P,ATOMSZ FILN2: JUMPN A,FILN3 CAIE X2,FILDIR JRST FILN3 XLIST IFN BASEDT,< LIST HRRZ A,B CAIN A,SAVFIL+1 ;ONLY SAVE AND UNSAVE CAN OMIT THE FILENAME. JRST FILN9 CAIL A,UNSER CAILE A,UNSATP JRST COMM2 FILN9: MOVE A,CURNAM MOVEM A,FILDIR HLLZ A,CUREXT MOVEM A,FILDIR+1 JRST FILN5 XLIST > IFN BASCX,< LIST JRST COMM2 XLIST > LIST FILN3: CAIN X2,FILDIR JRST FILN4 TRNE A,777777 ;ONLY 3 CHARACTERS ALLOWED JRST COMM2 ;IN THE EXT. FILN4: MOVEM A,(X2) XLIST IFN BASEDT,< LIST FILN5: SKIPLE STARFL ;POSSIBLE ***? JRST FILN6 ;NO. SKIPL STARFL JRST FILN51 MOVE A,DEVBAS ;ALREADY SEEN A DEVICE. CAME A,[SIXBIT/BAS/] JRST FILN6 FILN50: DEVCHR A, JUMPN A,FILN6 MOVE A,[XWD 5,1] MOVEM A,FILDIR+3 MOVEI A,<SIXBIT/ DSK/> HRLZM A,@(B) MOVSI A,(SIXBIT/BAS/) MOVEM A,DEVBAS ;FOR USE BY ERROR MESSAGES, ETC. JRST FILN61 FILN51: CAME C,[XWD F.STAR,"*"] JRST FILN6 PUSH P,T PUSHJ P,NXCH CAME C,[XWD F.STAR,"*"] JRST FILN7 PUSHJ P,NXCH CAME C,[XWD F.STAR,"*"] JRST FILN7 MOVSI A,(SIXBIT /BAS/) HLLZM A,@(B) POP P,C ;CLEAN UP PLIST. PUSHJ P,NXCH JRST FILN50 FILN7: POP P,T MOVE C,[XWD F.STAR,"*"] XLIST > LIST FILN6: SETZM DEVBAS ;< > 0 SAYS FAKED DEVICE BAS. FILN61: ;UOFP PATCH TO ALLOW ACCESS TO OTHER PPNS PUSH P,D ;SAVE PUSH P,G ;SOME ACS HRRZ D,C ;GET CHAR CAIE D,"[" ;WAS IT [ ? JRST FILN62 ;NO SETZB D,G ;CLEAR THE DECKS PROJN: PUSHJ P,NXCH ;GET A DIGIT TLNE C,F.COMA ;, ? JRST PROGN ;YES, GO TO PROG # PUSHJ P,OCTAL ;NO, STASH IT JRST PROJN ;AND GET MORE PROGN: EXCH G,D ;STORE PROJ, ZERO D PROGN1: PUSHJ P,NXCH ;GET ANOTHER CHAR TLZ C,-1 ;CLEAR L.H. CAIN C,"]" ;WAS IT ] ? JRST PPN ;YES, ALL OVER PUSHJ P,OCTAL ;NO, STASH IT JRST PROGN1 ;AND GET MORE PPN: HRL G,D ;SET PG,PJ IN G TLNE G,-1 ;L.H. ZERO ? TRNN G,-1 ;R.H. ZERO ? JRST LEAVE1 ;YES MOVSM G,FILDIR+3 ;OKAY, SET PJ,PG IN LOOKUP BLOCK PUSHJ P,NXCH ;GET ANOTHER CHARACTER JRST FILN62 ;AND RETURN TO MAINSTREAM OCTAL: MOVEI C,-"0"(C) ;MAKE DIGIT CAILE C,7 ;OCTAL ? JRST LEAVE ;NO LSH C,41 ;LEFT JUSTIFY DIGIT ROTC C,3 ;AND SNEAK IT INTO D TLNN D,-1 ;MORE THAN 6 DIGITS ? POPJ P, ;NO, RETURN LEAVE: POP P,G ;RECTIFY PDL LEAVE1: POP P,G ;RESTORE ACS POP P,D JRST COMM2 ;AND GO COMMISERATE FILN62: POP P,G ;RESTORE POP P,D ;ACS MOVEI A,DRMBUF MOVEM A,.JBFF JRST 1(B) COMM2: XLIST IFN BASEDT,< LIST HRRZI A,@(B) ;GET FILE STORAGE LOC CAIE A,FILDIR ;FROM COMMAND LEVEL ? JRST COMM1 ;YES. FAIL <? Illegal filename> ;NO, MUST BE SYNTAX CHECKER XLIST > IFN BASCOM,< LIST FAIL <? Illegal filename> ;MUST BE COMPILE TIME XLIST > IFN BASXCT,< LIST JRST CHAER1 ;YES XLIST > LIST ;ROUTINE TO CONVERT NEXT ATOM TO SIXBIT ALPHSX: SKIPA D,[Z (F.LETT)] ATOMSZ: HRLZI D,F.LETT+F.DIG HRRZI B,(B) MOVEI A,0 MOVE X1,[POINT 6,A] ATOMS1: TDNN C,D POPJ P, PUSHJ P,SCNLTN ;PACK THIS LETTER INTO A JFCL ;SCNLTN HAS SKIP RETURN TLNE X1,770000 JRST ATOMS1 POPJ P, XLIST IFN BASEDT,< LIST EXTERN CRBUF OUCHX: SKIPLE CRBUF+2 ;ANY ROOM IN BUFFER? JRST OUCH1X ;YES. GO DEPOSIT CHAR. OUTPUT 16, ;OUTPUT ON CHAN. 16 MOVEM N,TEMLOC ;SAVE AC N GETSTS 16,N ;GET STATUS TRNE N,740000 ;ANY ERROR BITS? JRST [SETZM OUCRFF ;MAKE ERROR TO TTY JRST OUTERR] MOVE N,TEMLOC ;RESTORE AC N OUCH1X: SOS CRBUF+2 ;DECREMENT BYTE COUNT IDPB C,CRBUF+1 ;DEPOSIT CHAR IN BUFFER POPJ P, ;RETURN ERASE: HRLZ A,N ;LOOK FOR LINE MOVEI R,LINROL PUSHJ P,SEARCH POPJ P, ;NONE, GOTO INSERTION XLIST > XLIST IFN BASEC,< LIST ERACOM: MOVE D,(B) ;PICK UP LOC OF LINE HRLI D,440700 ;MAKE BYTE POINTER MOVEI T1,0 ;TO USE IN DEPOSITING ERAS1: ILDB C,D ;GET CHAR DPB T1,D ;CLOBBER IT CAIE C,15 ;CARRIAGE RET? JRST ERAS1 ;NO. GO FOR MORE SETOM PAKFLA ;MARK FACT THAT THERE IS A HOLE MOVEI E,1 ;REMOVE ENTRY FROM LINE TABLE JRST CLOSUP XLIST > LIST SUBTTL ERROR MESSAGES XLIST IFN BASEC,< LIST ;ERROR MESSAGE ROUTINE. ; ;AC T ENTERS WITH THE LOC OF THE MESSAGE. ;ALL OTHER AC'S, EXCEPT P, CAN BE DESTROYED. ERRMSG: SETZM ODF SETZM HPOS PUSHJ P,TTYIN SETZ D, ;END ON NULL. PUSHJ P,PRINT ;PRINT MESSAGE. SKIPE CHAFL2 ;CHAINING? JRST ERRMS2 OUTPUT ;NO. XLIST IFN BASEDT,< LIST JRST UXIT ERRMS2: PUSH P,[Z UXIT] ;YES, ADD DEV, FILENM, ETC. XLIST > IFN BASCOM,< LIST JRST LUXIT ERRMS2: PUSH P,[Z LUXIT] ;YES, ADD DEV, FILENM, ETC. XLIST > > LIST ERRMS3: PUSHJ P,INLMES ASCIZ / in / PUSH P,ODF SETZM ODF SKIPN CURBAS JRST ERLAB1 MOVSI T,(SIXBIT/BAS/) JRST ERRM35 ERLAB1: HLRZ T,CURDEV CAIN T,<SIXBIT/ DSK/> JRST ERRMS4 MOVE T,CURDEV ;DEV MAY BE GT. 3 LETTERS. ERRM35: PUSHJ P,PRNSIX MOVEI T,32 PUSHJ P,PRNSIX ERRMS4: MOVE T,CURNAM PUSHJ P,PRNSIX HLRZ T,CUREXT CAIN T,<SIXBIT/ BAS/> JRST ERLAB2 TLO T,16 PUSHJ P,PRNSIX ERLAB2: POP P,ODF OUTPUT SETZM HPOS POPJ P, XLIST IFN BASEX,< LIST NOGETD: SETZM ODF PUSH P,T INLERR(10,57,</ ? No such device />) POP P,T XLIST IFN BASEDT,< LIST PUSHJ P,PRNSIX OUTPUT JRST UXIT XLIST > IFN BASXCT,< LIST PUSHJ P,ERRXCX PUSHJ P,PRNSIX OUTPUT PUSHJ P,ERRXCY JRST UXIT XLIST > > LIST ;SUBROUTINE TO CHECK DATA LINE ;ALSO CALLED AT RUN TIME TO CHECK INPUT LINE ;(NOTE.. <RETURN> NOT CHECKED AFTER INPUT LINE) DATCHK: TLNN C,F.LETT+F.QUOT ;LETTER OR QUOT SIGN FIRST JRST DATCH2 ;NO, EVALUATE NUMBER PUSH P,[DATCH3] ;YES, ASSUME STRING AND SKIP OVER JRST SKIPDA DATCH2: PUSH P,X1 PUSHJ P,EVANUM JRST [POP P,X1 POPJ P,] POP P,X1 DATCH4: CAIE C,"&" ;IF "&", ASSUME MATINPUT TERM TLNE C,F.CR ;MORE? JRST CPOPJ1 ;NO. RETURN SKIPE INPFLA ;FOR READ AND MAT READ JRST DALAB1 ;BUT NOT FOR INPUT OR MAT TLNE C,F.TERM ;INPUT, STOP ALSO ON AN JRST CPOPJ1 ;APOSTROPHE. DALAB1: TLNN C,F.COMA ;DID FIELD END CORRECTLY? POPJ P, ;NO. ERROR PUSHJ P,NXCH ;YES. SKIP COMMA TLNE C,F.TERM JRST CPOPJ1 JRST DATCHK ;AND GO TO NEXT ITEM. DATCH3: POPJ P, JRST DATCH4 XLIST IFN BASCX,< LIST BASORT: MOVE X1,[XWD BA,SRTDBA] BLT X1,SRTDBA+8 MOVEI E,8 BASOR1: MOVE X1,SRTDBA(E) MOVEI C,(E) BASOR2: MOVE X2,SRTDBA-1(C) CAMG X2,X1 JRST BASOR3 MOVEM X2,SRTDBA(E) MOVEM X1,SRTDBA-1(C) MOVE X1,X2 BASOR3: SOJG C,BASOR2 SOJG E,BASOR1 BASOR4: SKIPE SRTDBA(C) JRST BASOR5 AOJ C, CAIG C,8 JRST BASOR4 POPJ P, BASOR5: JUMPE C,CPOPJ MOVEI E,10 JRST PAKBL0 XLIST > XLIST IFN BASEX,< LIST OUTERR: TRNE N,040000 ;OUTERR EXPECTS THE STATUS BITS IN N INLEMS(10,58,OUTQMS) TRNE N,400000 INLEMS(10,59,OUTLMS) INLEMS(1,70,INLSYS) OUTLMS: ERROM (59,</ ? Device is write locked/>) OUTQMS: ERROM (58,</ ? Quota exceeded or block no. too large on output device/>) XXXXXX: SETZM COMTIM SETZM HPOS MOVE P,PLIST SETZM NUMCOT SETZB LP,IFIFG XLIST IFN BASXCT,< LIST SKIPN UXFLAG JRST UXIT5 SETOM ODF MOVEI LP,^D9 UXIT3: SKIPL A,ACTBL-1(LP) JRST UXLAB1 PUSHJ P,CLSRAN JRST UXIT49 UXLAB1: CAIE A,3 JRST UXIT49 SETZM 40 SETZM WRIPRI-1(LP) PUSHJ P,PRDLER SKIPE HPOS(LP) PUSHJ P,CRLF3 UXIT49: SOJG LP,UXIT3 SETZM ODF PUSHJ P,PRDLER XLIST > LIST UXIT5: SETZM ODF DEFINE %R(A) < IRP A < RELEASE ^D<A>, >> %R<1,2,3,4,5,6,7,8,9> ;DISK DATA FILES 1-9 XLIST IFN BASEDT,< LIST EDTXT1: PUSH P,T ;SAVE T SETO T, ;NEED LINE CHARACTERISTICS GETLCH T ;ASK MONITOR TLZ T,(1B15) ;TURN ON ECHO SETLCH T ;IN CASE IT WAS LEFT OFF POP P,T ;RESTORE T SETZM RUNFLA PUSHJ P,TTYIN ;INIT TTY IN CASE OF ^O. SKIPE CHAFLG ;CHAINING? JRST FIXUP ;YES. SKIPE MTIME ;IS THERE SOME RUN TIME? PUSHJ P,RTIME PUSHJ P,INLMES ASCIZ / Ready / JRST FIXUP ;GO TO MAIN LOOP AFTER CLEARING ROLLS XLIST > XLIST IFN BASXCT,< LIST SKIPN UXFLAG ;END OF PROGRAM EXECUTION? JRST UXIT1 ;NO. SETZM UXFLAG ;YES. SETZM MARWAI MOVEI X1,^D72 MOVEM X1,MARGIN SETZM QUOTBL SETZM HPOS SETOM PAGLIM MOVEI X1,^D9 UXIT2: SKIPL A,ACTBL-1(X1) ;ACTBL ENTRY = 3 IF FILE CAIN A,3 JRST UXIT21 ;IS BEING WRITTEN. SOJG X1,UXIT2 JRST UXIT1 UXIT21: PUSH P,[Z UXIT4] UXIT6: MOVE X2,FILD-1(X1) MOVEM X2,LOK MOVE X2,EXTD-1(X1) MOVEM X2,LOK+1 MOVE X2,FPPN-1(X1) MOVEM X2,LOK+3 HLRZ X2,BA-1(X1) MOVEM X2,.JBFF XCT INITO-1(X1) JRST [MOVE T,OPS1+1 JRST NOGETD] ;OUTPUT MESSAGE "NO SUCH DEVICE" DPB X1,[POINT 4,LOKUP,12] ;AND GIVE UP BECAUSE HLLZS LOK+1 ;ALL DEVICES ARE THE SAME. SETZM LOK+2 XCT LOKUP JFCL UXIT7: HLLZ X2,LOK+2 TLZ X2,777 SKIPL MONLVL TLNN X2,700000 IOR X2,MONLVL ;MONLVL CONTAINS THE "DON'T DELETE " BIT. MOVEM X2,LOK+2 HLLZS LOK+1 DPB X1,[POINT 4,RENAMD,12] XCT RENAMD JFCL ;RENAME FAILS FOR DECTAPES. POPJ P, UXIT4: SOJG X1,UXIT2 ;RETURN HERE FROM RENFAL MESSAGE. JRST CHAXIT XLIST > LIST DEFINE %R(A) < IRP A < EXP DO'A+1 >> OUTPT: %R<1,2,3,4,5,6,7,8,9> DEFINE %R(A) < IRP A < EXP DO'A+2 EXTERN DO'A >> OUTCNT: %R<1,2,3,4,5,6,7,8,9> DEFINE %R(A) < IRP A < EXP DI'A+1 EXTERN DI'A >> INTERN INPT INPT: %R<1,2,3,4,5,6,7,8,9> DEFINE %R(A) < IRP A < EXP DI'A+2 >> INTERN INCNT INCNT: %R<1,2,3,4,5,6,7,8,9> DEFINE %R(A) < IRP A < POINT 7,LINB'A EXTERN LINB'A >> LINPT: %R<0,1,2,3,4,5,6,7,8,9> XLIST > XLIST IFN BASEC,< LIST ;SUBROUTINES FOR GENERAL ROLL MANIPULATION CLOSUP: MOVN X1,E ;COMPUTE NEW END OF ROLL ADDB X1,CEIL(R) ;AND STORE IT MOVE X2,B ;CONSTRUCT BLT WORD ADD X2,E MOVS X2,X2 HRR X2,B BLT X2,-1(X1) ;MOVE DOWN TOP OF ROLL POPJ P, CLOB: MOVEI T1,COMTOP ;ROUTINE TO CLOBBER ALL MOVEABLE ROLLS CLLAB1: MOVEM T,FLOOR(T1) ;T CONTAINS CLOBBER VALUE. MOVEM T,CEIL(T1) CAILE T1,1(X1) ;DO NOT CLOBBER ROLLS LE.(X1) SOJA T1,CLLAB1 POPJ P, OPEN2: MOVE X2,E ;IS THERE ROOM ABOVE THIS STODGY ROLL? ADD X2,CEIL(R) ;THE NEW CEILING CAMLE X2,FLOOR+1(R) JRST OPENU0 ;NO ROOM, PACK OTHER ROLLS UP ADDM E,CEIL(R) ;THERE IS ROOM, INCREMENT CEILING POPJ P, OPENU0: SUB B,FLOOR(R) PUSHJ P,PANIC ADD B,FLOOR(R) OPENUP: CAMG R,TOPSTG ;OPEN UP THE TOP STODGY ROLL? JRST OPEN2 ;YES. OPEN UPWARDS, NOT DOWN MOVN X2,E MOVE X1,TOPSTG ;DO NOT MOVE STODGY ROLLS ADD X2,FLOOR+1(X1) CAMGE X2,CEIL+0(X1) JRST OPENU0 ;NEED MORE ROOM HRL X2,FLOOR+1(X1) ;CONSTRUCT BLT WORD SUB B,E ;FIRST WORD OF GAP BLT X2,-1(B) ;MOVE ROLLS DOWN MOVEI X1,1(X1) ;ADJUST POINTERS FOR ROLLS JUST BLT'D. MOVN X2,E OPEN1: ADDM X2,FLOOR(X1) CAML X1,R POPJ P, ADDM X2,CEIL(X1) AOJA X1,OPEN1 ;RPUSH - PUSH A ON TOP OF DESIGNATED ROLL RPUSH: MOVEI E,1 PUSHJ P,BUMPRL ;MAKE ROOM MOVEM A,(B) ;STORE WORD POPJ P, ;ROUTINE TO ADD TO END OF ROLL ;E CONTAINS SIZE, R CONTAINS ROLL NUMBER BUMPRL: MOVE B,CEIL(R) ADD B,E CAIE R,ROLTOP SKIPA X1,FLOOR+1(R) HRRZ X1,.JBREL CAMLE B,X1 JRST BUMP1 EXCH B,CEIL(R) POPJ P, BUMP1: MOVE B,CEIL(R) CAIE R,CODROL CAIN R,SEXROL JRST BULAB1 JRST OPENUP BULAB1: ADDI E,^D10 ;***EXTRA 10 LOCS PUSHJ P,OPENUP MOVNI X1,^D10 ;TAKE BACK THE 10 LOCS ADDM X1,CEIL(R) POPJ P, XLIST > LIST QSKIP: PUSHJ P,NXCH ;SKIP TO NEXT QUOTE CHARACTER TLNE C,F.CR ;TERMINAL QUOTE MISSING? POPJ P, ;YES TLNN C,F.QUOT ;END OF STRING? JRST QSKIP ;NO, GO ON. PUSHJ P,NXCH ;LYES, GET NEXT CHAR AND RETURN JRST CPOPJ1 ; ;BINARY SEARCH OF SORTED ROLL ;CALL WITH KEY IN A ;RETURN IN B ADDRS OF FIRST ;ENTRY NOT LESS THAN KEY ;SKIP RETURN IF LEFT SIDES EQUAL SEARCH: MOVE B,FLOOR(R) SKIPA X1,CEIL(R) SEAR1: MOVEI B,1(X2) CAIGE B,(X1) JRST SEAR2 CAML B,CEIL(R) POPJ P, JRST SEAR3 SEAR2: MOVEI X2,@X1 ADD X2,B ASH X2,-1 CAMLE A,(X2) JRST SEAR1 HRRI X1,0(X2) CAIGE B,(X1) JRST SEAR2 SEAR3: HLLZ X2,(B) CAMN X2,A AOS (P) POPJ P, ;COMMON SUBROUTINE RETURNS CPOPJ1: AOS (P) CPOPJ: POPJ P, ;ROUTINES TO ALLOW AND DELAY REENTRY. ;LOCKON TEMPORARILY PREVENTS REENTRY ;LOCKOF ALLOWS REENTRY AND REENTERS IF THERE IS A STANDING REQUEST ;REENTR MAKES A REENTRY OR MAKES A REQUEST AND CONTINUES LOCKON: SKIPGE RENFLA SETZM RENFLA ;TURN ON REENTER PROTECT POPJ P, LOCKOF: SKIPE RENDON ;ALREADY PROCESSING INTERRUPT ? POPJ P, ;YES, JUST IGNORE SKIPG RENFLA ;NO, HAS ONE COME IN ? JRST [SETOM RENFLA ;NO, JUST GO AWAY POPJ P,] SETOM RENDON ;YES, LOCK IT OUT JRST BASIC ;AND GO HANDLE ;ROUTINE TO READ CHARACTER, SKIPPING BLANKS ;CALL: MOVE T,<POINTER TO CHAR BEFORE FIRST> ; PUSHJ P,NXCH ; ... RETURN, C:= (<FLAGS>)CHARACTER NXCHS: ILDB C,T ;DOESNT SKIP TAB OR BLANK CAIE C," " CAIN C,11 POPJ P, JRST NXLAB1 ;SKIP INTO NXCH NXCH: ILDB C,T ;FETCH NEXT CHARACTER NXLAB1: HLL C,CTTAB(C) ;GET FLAGS FROM CTTAB TRNE C,100 HRL C,CTTAB-100(C) CAME C,[XWD F.CR,12] ;SKIP <LF> TLNE C,F.SPTB ;SPACE OR TAB? JRST NXCH ;YES. IGNORE POPJ P, NXCHD: ILDB C,T NXCHD2: HLL C,CTTAB(C) TRNE C,100 HRL C,CTTAB-100(C) POPJ P, XLIST IFN BASEC,< LIST ;SCAN INITIAL LETTER, LETTER IS PLACED LEFT ;JUSTIFIED IN A, 7-BIT ASCII. SCNLT1: HRRZ A,C ROT A,-7 JRST NXCH ;SCAN SECOND LETTER, NON-SKIP RETURN IF NOT LETTER. ;MAKE 7-BIT LETTER LEFT JUST IN A ;INTO 6-BIT. THAN PUT 6-BIT CURRENT LETTER IN A. SCNLT2: TLNN C,F.LETT POPJ P, SCN2: TLNN A,400000 ;ENTER HERE TO PROCESS NON-LETTER CHARS TLZA A,200000 TLO A,200000 LSH A,1 MOVE X1,[POINT 6,A,5] JRST SCNLTN ;ENTER HERE TO SCAN SECOND CHAR EVEN IF BOTH ARE NOT LETTERS. ;SCAN THIRD LETTER, NON-SKIP IF NOT LETTER. ;PUT 6-BIT LETTER TO 3RD 6-BIT FIELD IN A. SCNLT3: TLNN C,F.LETT POPJ P, SCN3: MOVE X1,[POINT 6,A,11] ;ROUTINE TO SEARCH FOR ELSE, SKIP RETURN IF SUCCESSFUL XLIST > LIST ;NOW PUT 6-BIT LETTER INTO A, ADJUSTING LOWER CASE, INCREMENTING POINTER. SCNLTN: TLNN C,F.LCAS TRC C,40 IDPB C,X1 AOS (P) JRST NXCH ;QUOTE SCAN AND TEST ;CALL WITH PATTERN ADDRS IN X1 ;SKIP IF EQUAL. C,T UPDATED TO LAST CHAR SCANNED. QST: HRLI X1,440700 ;MAKE BYTE PNTR TO PATTERN QST1: ILDB X2,X1 ;GET PATTERN CHAR JUMPE X2,CPOPJ1 ;DONE ON NULL SUBI X2,(C) JUMPE X2,QSLAB1 ;DO CHARACTERS MATCH? TLNE C,F.LCAS ;NO. LOWER CASE LETTER? CAME X2,[ EXP -40] ;YES. SAME LETTER OF ALPHABET? JRST QST2 ;NO. MATCH FAILS QSLAB1: PUSHJ P,NXCH JRST QST1 QST2: ILDB X2,X1 ;ON FAIL JUMPN X2,QST2 ;SKIP TO NULL POPJ P, ;QUOTE SCAN UNTIL FAIL. ;CALL WITH INLINE PATTERN. QSAX: POP P,X1 PUSHJ P,QST JRST 1(X1) JRST 1(X1) ;QUOTE SCAN WITH ANSWER ;CALL WITH INLINE PATTERN ;SKIP ON SUCCESS ;ON FAIL, RETURN WITH C,T RESTORED QSA: POP P,X1 ;GET PATTERN ADDRESS PUSH P,C ;SAVE C,T PUSH P,T PUSHJ P,QST ;SAVE STRING JRST QSLAB2 JRST QSA1 ;MATCH QSLAB2: POP P,T ;NO MATCH. BACK UP POP P,C JRST 1(X1) QSA1: POP P,X2 POP P,X2 JRST 2(X1) XLIST IFN BASEC,< LIST QSELS: AOS (P) ;ASSUME SUCCESS PUSH P,C ;SAVE CHAR PUSH P,T ;SAVE POINTER PUSHJ P,QSA ;FIND ELSE ASCIZ /ELSE/ SOS -2(P) ;NOT THERE POP P,T ;RESTORE POP P,C ;ACS POPJ P, ;AND RETURN XLIST > XLIST IFN BASEX,< LIST ;ROUTINE TO READ A LINE INTO LINB0 ;CALL: PUSHJ P,INLINE INLINE: PUSH P,X1 PUSH P,[XWD Z,INLI1A] INLGEN: SETZB X1,T1 ;ENTRY FOR GEN COMMAND SKIPE IFIFG SKIPA T,LINPT(LP) MOVE T,LINPT POPJ P, INLI1: ILDB C,TYI+1 ;GET CHAR JRST INLB INLA: SOSGE @INCNT-1(LP) JRST DSKIN ILDB C,@INPT-1(LP) INLB: JUMPE C,INLB2 ;SKIP NULL AS USUAL CAIE C,15 ;<CR> ? JRST INLB3 ;NO SETO X1, ;YES, FLAG & SKIP INLB2: SOJA T1,INLI1A INLB3: CAIE C,21 ;IGNORE XON,XOFF CAIN C,23 SOJA T1,INLI1A CAIN C,12 ;<LF> ? JUMPE X1,INLC ;JUST IGNORE UNLESS AFTER <CR> SETZ X1, CAIG C,14 ;LINE TERMINATOR? CAIGE C,12 JRST INLAB1 JRST INLI2 ;YES. GO FINISH UP INLAB1: CAIG T1,^D255 ;ROOM FOR CHAR+1 MORE? JRST INLB1 ;YES. SKIPE IFIFG ;DISK? JRST INERR ;YES, ERROR EXIT. INLEMS(38,69,INERR1) ;NO, ERROR EXIT. INERR1: ERROM(68,</ ? Line too long/>) INLC: HRRZ X1,TYI+1 CAIL X1,TTYBUF TTCALL 1,INLI2 ;ECHO <CR> TO NAKED <LF> SETZ X1, INLB1: IDPB C,T ;STORE CHAR INLI1A: SKIPE IFIFG AOJA T1,INLA SOSLE TYI+2 ;MORE INPUT? AOJA T1,INLI1 ;YES. BUMP COUNT AND GO GET MORE INPUT STATZ 20000 JRST [SKIPN CHAFLG JRST BASIC JRST RUNNH] STATO 740000 AOJA T1,INLI1 SKIPE IFIFG SETZM ACTBL-1(LP) INLEMS(1,70,INLSYS) INLSYS: ASCIZ / ? System error/ INLI2: MOVEI C,15 ;DONE. PUT CR IN BFR. IDPB C,T POP P,X1 RESCAN: SKIPN IFIFG SKIPA T,LINPT MOVE T,LINPT(LP) SKIPE IFIFG JRST INLI8 SETZM HPOS ;CARRIAGE POSITION := LFT MRGN SKIPE INLNFG JRST NXCHS JRST NXCH ;GET FIRST CHAR AND RETURN INLI8: SETZM HPOS(LP) SKIPE INLNFG JRST NXCHS JRST NXCH XLIST > XLIST IFN BASEX,< LIST DSKIN: DPB LP,[POINT 4,INDSK,12] ;DISK INPUT XCT INDSK DPB LP,[POINT 4,STADSK,12] XCT STADSK XLIST IFN BASEDT,< LIST JRST EOFFAL XLIST > IFN BASXCT,< LIST JRST [HRRZ T,-2(P) CAIE T,EOF32 JRST EOFFAL JRST EOF31] XLIST > LIST DPB LP,[POINT 4,STODSK,12] XCT STODSK JRST INLA SETZM ACTBL-1(LP) INLEMS(1,70,INLSYS) XLIST > LIST ;ROUTINE TO READ NEXT INTEGER FROM SCANNED LINE ;CALL: MOVE T,POINTER TO FIRST CHAR ; PUSHJ P,GETNUM ; ... FAIL RETURN ; ... SUCCESS RETURN, INTEGER IN N GETNU: TDZA X1,X1 ;GET A NUMBER OF ANY LENGTH. GETNUM: MOVEI X1,5 ;GET A NUMBER OF AT MOST 5 DIGS MOVE X2,[PUSHJ P,NXCH] ;IGNORE BLANKS JRST GNNOB GTNUMB: MOVEI X1,5 ;ALWAYS A LINE NUMBER MOVE X2,[PUSHJ P,NXCHS] ;PRESERVE SPACING GNNOB: TLNN C,F.DIG ;NUMERAL? POPJ P, ;NO. FAIL RETURN MOVEI N,-60(C) ;YES. ACCUMULATE FIRST DIGIT GETN1: MOVE G,T ;SAVE PNTR FOR USE BY INSERT XCT X2 ;GET NEXT CHAR SOJE X1,GETN2 ;EXIT IF FIVE DIGITS ALREADY TLNN C,F.DIG ;NUMERAL? JRST GETN2 ;NO. RETURN. IMULI N,^D10 ;YES. ACCUMULATE NUMBER ADDI N,-60(C) JRST GETN1 ;GO FOR MORE GETN2: CAMN C,[XWD F.STR,"%"] PUSHJ P,NXCH ;EAT THE % IF IT IS THERE JRST CPOPJ1 ;DO SKIP RETURN ;PRINT TO QUOTE CHAR ;CALL: MOVE T,<ADDRS OF MSG> ; MOVE D,<QUOTE CHAR> ; PUSHJ P,PRINT ;CALL: MOVE T,<ADDRS OF MSG> ; MOVE D,<QUOTE CHAR> ; PUSHJ P,PRINT ;ALTERNATE CALL: PRINT1, IF BYTE PNTR IN T. PRINT: HRLI T,440700 PRINT1: ILDB C,T CAMN C,D POPJ P, PUSHJ P,OUCH ;OUTPUT THE CHAR XLIST IFN BASEDT,< LIST CAIN D,15 ;CHECKING FOR <CR> ? CAIE C,12 ;AND SEEN <LF> ? XLIST > LIST JRST PRINT1 ;NO XLIST IFN BASEDT,< LIST EXCH C,D ;YES, PUT OUT <CR> PUSHJ P,OUCH EXCH C,D JRST PRINT1 ;GO FOR MORE XLIST > LIST OUCH: XLIST IFN BASEDT,< EXTERNAL OUCRFF LIST SKIPE OUCRFF ;ERRORS TO CREF OUTPUT? JRST OUCHX ;YES XLIST > XLIST IFN BASEDT,< LIST SKIPE ODF ;DISK? JRST DSKOT ;YES. XLIST > XLIST IFN BASEC,< LIST SKIPLE TYO+2 ;NO. JRST OUCH1 OUTPUT LIST > XLIST IFN BASEDT,< LIST MOVEM N,TEMLOC GETSTS 0,N TRNE N,740000 JRST OUTERR MOVE N,TEMLOC XLIST > XLIST IFN BASXCT,< LIST SKIPE ODF ;DISK? JRST DSKOT ;YES SKIPN ERRTCN ;STORING FATAL ERRORS? JRST ERROK ;NO IDPB C,ERRBPT ;YES, STORE IN LOW CORE AOS HPOS POPJ P, ERROK: SKIPLE TYO+2 JRST OUCH1 OUTPUT MOVEM N,TEMLOC GETSTS 0,N TRNE N,740000 JRST OUTERR MOVE N,TEMLOC XLIST > LIST OUCH1: SOS TYO+2 IDPB C,TYO+1 AOS HPOS POPJ P, XLIST IFN BASEX,< LIST DSKOT: SKIPG @OUTCNT-1(LP) JRST DOS SOS @OUTCNT-1(LP) IDPB C,@OUTPT-1(LP) AOS HPOS(LP) POPJ P, DOS: DPB LP,[POINT 4,OUTTDS,12] XCT OUTTDS JRST DSKOT SETZM ACTBL-1(LP) XCT GTSTS JRST OUTERR XLIST > LIST ;ROUTINE TO PRINT SIXBIT CHARACTERS IN ACCUM "T". ;IGNORES BLANKS. PRNSIX: MOVE T1,[POINT 6,T] ILDB C,T1 JUMPE C,PRNS1 ;SKIP A BLANK ADDI C,40 PUSHJ P,OUCH PRNS1: TLNE T1,770000 ;ALL SIX PRINTED? JRST PRNSIX+1 POPJ P, ;UTILITY ROUTINE TO PRINT OUT "DEV:FILENM.EXT". ;FOR USE BY VARIOUS ERROR MESSAGES. ;DEV IS IN SAVE1, FILENM IN FILDIR, AND EXT IN FILDIR+1. ;IF LH(SAVE1)=0, DEV IS NOT PRINTED. DSK: AND .BAS ARE ;OMITTED. PRNNAM: PUSH P,C PUSH P,T PUSH P,ODF SETZM ODF HLRZ T,SAVE1 JUMPE T,PRNAM1 CAIN T,<SIXBIT / DSK/> JRST PRNAM1 MOVE T,SAVE1 PUSHJ P,PRNSIX MOVSI T,320000 PUSHJ P,PRNSIX PRNAM1: MOVE T,FILDIR PUSHJ P,PRNSIX HLRZ T,FILDIR+1 CAIN T,<SIXBIT / BAS/> JRST PRNAM2 TLO T,16 PUSHJ P,PRNSIX PRNAM2: SKIPN FILDIR+3 JRST PRNAM3 GETPPN C, JFCL CAMN C,FILDIR+3 JRST PRNAM3 MOVEI C,"[" PUSHJ P,OUCH HLRZ T,FILDIR+3 PUSHJ P,PRTOCT MOVEI C,"," PUSHJ P,OUCH HRRZ T,FILDIR+3 PUSHJ P,PRTOCT MOVEI C,"]" PUSHJ P,OUCH PRNAM3: POP P,ODF POP P,T POP P,C POPJ P, XLIST IFN BASEX,< LIST ;OCTAL NUMBER PRINTER. PRTOCT: IDIVI T,10 JUMPE T,PRTOC1 PUSH P,T1 PUSHJ P,PRTOCT POP P,T1 PRTOC1: MOVEI C,60(T1) AOS NUMCOT JRST OUCH ;ROUTINE USED BY OUTNUM FOR STRB. DPBSTR: EXCH T,STRPTR IDPB C,T EXCH T,STRPTR SOS STRCTR POPJ P, XLIST > LIST ;MESSAGE PRINTER INLMES: PUSHJ P,TTYIN INLME1: SETZM HPOS EXCH T,(P) ;GET MSG ADR AND SAVE T. PUSH P,C PUSH P,ODF SETZM ODF MOVEI D,0 ;END ON NULL PUSHJ P,PRINT ;PRINT THE MESSAGE POP P,ODF POP P,C EXCH T,(P) SETZM HPOS JRST CPOPJ1 ;RTN AFTER MSG. SUBTTL CORE COMPRESSION AND EXPANSION XLIST IFN BASEC,< LIST ;PANIC - ROUTINE TO COMPRESS CORE PANIC: PUSHJ P,PRESS ;COMPRESS MEMORY MOVE X2,TOPSTG ;IS THERE ROOM BETWEEN STODGY AND MOVE X1,FLOOR+1(X2) ;MOVEABLE ONES? SUB X1,CEIL(X2) CAML X1,E ;ENOUGH ROOM? POPJ P, MOVE X1,.JBREL ;EXPAND BY 1K ADDI X1,2000 CORE X1, INLEMS(60,60,PANIC1) JRST PANIC ;OK. GO MOVE ROLLS PANIC1: ERROM(60,</ ? Out of room/>) PRESS: PUSH P,G ;SAVE AC PUSH P,A SKIPN PAKFLA ;ARE LINES PACKED? JRST PRESS5 ;YES SETZM PAKFLA MOVE X1,FLTXT ;LOOK FOR EMPTY SPACE PRESS2: CAML X1,CETXT ;THROUGH LOOKING? JRST PRESS5 SKIPE (X1) ;A FREE WORD? AOJA X1,PRESS2 ;NO MOVEI X2,1(X1) ;YES PRESS3: CAML X2,CETXT JRST PRESS4 ;FREE TO END SKIPN (X2) AOJA X2,PRESS3 ;LOOK FOR NON-FREE WORD SUB X1,X2 ;X1 :=-LNG OF MOVE MOVE A,FLLIN PRES3A: CAML A,CELIN ;MOVE DOWN THE REFERENCES JRST PRES3B ;IN THE LINE ROLL. HRRZ G,(A) CAML G,X2 ADDM X1,(A) AOJA A,PRES3A PRES3B: MOVE G,CETXT ;MOVE DOWN THE TEXT ROLL. ADD G,X1 MOVEM G,CETXT ADD X1,X2 HRL X2,X1 MOVSS X2 BLT X2,-1(G) JRST PRESS2 PRESS4: MOVEM X1,CETXT ;ROUTINE TO MOVE ROLLS UP PRESS5: SKIPE OLDCOD ;CRUNCHING SAVE CODE JRST PRES9A ;YES, JUST RETURN MOVEI G,ROLTOP ;HIGHEST MOVABLE ROLL MOVE X1,.JBREL ;X1 IS PREVIOUS FLOOR ;NOTE: TOP WORD OF USR CORE IS LOST PRESS6: MOVE X2,CEIL(G) ;GET OLD CEIL AND FLOOR MOVE A,FLOOR(G) SUBI X2,1 ;SET UP X2 FOR POP LOOP ORCMI X2,777777 MOVEM X1,CEIL(G) ;NEW CEILING PRESS7: CAILE A,(X2) ;DONE? JRST PRESS8 POP X2,-1(X1) ;MOVE ONE WORD SOJA X1,PRESS7 PRESS8: MOVEM X1,FLOOR(G) ;NEW FLOOR SOS G ;GO TO NEXT LOWER ROLL CAMLE G,TOPSTG ;IS THIS ROLL MOVEABLE? JRST PRESS6 ;YES. GO PRESS IT. PRES9A: POP P,A PRESS9: POP P,G ;RESTORE G POPJ P, ;RETURN XLIST > XLIST IFN BASEX,< LIST GOSR2: MOVE T,[Z UXIT] XLIST > IFN BASXCT,< LIST SKIPE RUNDDT MOVE T,[Z UXIT1] XLIST > IFN BASEX,< LIST PUSH P,T GOSR3: XLIST IFN BASXCT,< LIST SKIPE ERRTCN PUSHJ P,ERRXCX SKIPN NOTLIN ;ANY LINE NUMBERS ? SKIPE NOLINE ;SHOULD WE PRINT LINE #? JRST GOSR3A ;NO, NO LINE NUMBER TO OUTPUT XLIST > LIST PUSHJ P,INLMES ASCIZ / in line / MOVE T,SORCLN ;PRINT LINE NUMBER AND CONTINUE EXECUTION. HRRZ T,0(T) PUSH P,ODF SETZM ODF PUSHJ P,PRTNUM POP P,ODF GOSR3A: SKIPE CHAFL2 ;CHAINING? PUSHJ P,ERRMS3 GOSR6: PUSHJ P,INLMES ASCIZ / / OUTPUT XLIST IFN BASXCT,< LIST SKIPE ERRTCN PUSHJ P,ERRXCY XLIST > LIST POPJ P, INERR: INLERR(38,8,</ ? Data file line too long/>) JRST GOSR2 PTXER1: INLERR(82,9,</ ? Illegal character in string/>) JRST GOSR2 EOFFAL: POP P,X1 EOFFL: INLERR(8,21,</ ? Eof/>) JRST GOSR2 XLIST > XLIST IFN BASCX,< LIST ;SUBROUTINE TO GET OUT OF THE WAY OF THE BUFFERS. VSUB1: SETZ C, ;X2 HAS LOWER BOUND. VSUB11: HRRZ X1,SRTDBA(C) ;T1 HAS UPPER BOUND. JUMPE X1,CPOPJ ;T OR A HAS LENGTH, DEPENDING ON CAIG X1,(X2) ;DIRECTION OF TRAVEL. JRST VSUB12 HLRZ X1,SRTDBA(C) CAIL X1,(T1) JRST VSUB12 JUMPN A,VSUB13 ;GOING DOWN OR UP? HRRZ T1,SRTDBA(C) ;GOING UP. HRRZI X2,(T1) ADDI T1,(T) JRST VSUB12 VSUB13: HLRZ T1,SRTDBA(C) ;GOING DOWN. HRRZI X2,T1 SUBI X2,(A) VSUB12: AOJ C, CAIGE C,9 JRST VSUB11 POPJ P, XLIST > IFN BASXCT,< LIST VPANIC: PUSH P,R PUSH P,X1 PUSH P,X2 PUSH P,G PUSH P,A PUSH P,C PUSH P,E PUSH P,T1 PUSH P,T SKIPN VPAKFL PUSHJ P,VPRESS VPAN3: MOVE G,VRFBTB SKIPN VRFBOT MOVE G,.USREL MOVE X2,VARFRE MOVEI T,^D200 SETZ A, MOVEI T1,^D200(X2) PUSHJ P,VSUB1 SOJ T1, CAIGE T1,(G) JRST [SKIPN X2,VRFBOT JRST VPAN92 CAMN X2,VRFBTB JRST VPAN30 JRST VPN21] SKIPE X2,VRFBOT CAME X2,VRFBTB JRST VPAN32 CAML T1,VRFTOP ;ENCROACHING ON TEMP STRINGS ? JRST VPAN32 VPAN30: ADDI T1,1 MOVEM T1,VRFBTB MOVEM T1,VRFBOT JRST VPN2 VPAN32: PUSH P,T1 PUSHJ P,VPAN16 SKIPE VRFBOT JRST VPAN33 POP P,T1 CAMLE T1,.USREL JRST VPAN32 JRST VPAN92 VPAN33: POP P,T1 SKIPN A,APPLST JRST VPAN30 SETZ E, VPAN34: MOVE C,APPLST(A) CAILE C,(T1) JRST VPLAB1 AOJ E, SOJG A,VPAN34 VPLAB1: JUMPE E,VPAN30 MOVE X2,VRFBOT MOVEI T,^D47 SETZ A, VPLAB2: MOVEI T1,^D47(X2) PUSHJ P,VSUB1 MOVEI X2,(T1) SOJG E,VPLAB2 SUBI T1,1 VPAN35: CAMG T1,VRFTOP JRST VPAN36 PUSH P,T1 PUSHJ P,VPAN16 POP P,T1 JRST VPAN35 VPAN36: MOVEI E,1 ADDI T1,1 MOVEM T1,VRFBOT VPAN37: SUBI T1,^D47 HRL T1,APPLST(E) PUSH P,T1 PUSH P,T MOVEI T,^D46(T1) BLT T1,(T) POP P,T POP P,T1 MOVE C,MASAPP SUBI C,MASAPP JUMPE C,VPAN38 VPLAB3: HRRZ A,MASAPP(C) CAMN A,APPLST(E) HRRM T1,MASAPP(C) SOJG C,VPLAB3 VPAN38: AOJ E, MOVEI T1,(T1) CAMLE E,APPLST JRST VPAN39 MOVEI X2,-^D47(T1) SETZ T, MOVEI A,^D47 PUSHJ P,VSUB1 JRST VPAN37 VPAN39: MOVEM T1,VRFBTB JRST VPN2 ; DONE WITH MOVING UP APP BLKS VPN21: ADDI T1,1 ; START OF APPEND BLOCK SPACE CAMN T1,VRFBTB ; ANY CHANGE? JRST VPN2 ; NO - NOTHING TO DO MOVEM T1,VRFBTB ; YES - SAVE NEW START ADDRESS MOVE E,APPLST ; ANY APPEND BLOCKS JUMPE E,VPN25 ; NO - END = START VPN22: MOVEI X2,(T1) ; LOWER ADDR OF NEW BLOCK ADDI T1,^D47 ; UPPER ADDR OF NEW BLOCK + 1 MOVEI T,^D47 ; MOVING UP SETZ A, ; NOT DOWN PUSHJ P,VSUB1 ; SKIP PAST ANY BUFFERS SUBI T1,^D47 ; NEW APP BLK. START ADDR. PUSH P,T1 ; SAVE AROUND BLT HRL T1,APPLST(E) ; ADDR. OF CURRENT BLK. MOVEI T,^D46(T1) ; END OF NEW BLK. BLT T1,(T) ; MOVE 1 APPEND BLOCK DOWN POP P,T1 ; RESTORE NEW BLOCK PTR. MOVE C,MASAPP ; DETERMINE NUMBER OF MASTER SUBI C,MASAPP ; APPEND BLOCKS JUMPE C,VPN24 ; NONE - CONTINUE MOVE DOWN VPN23: HRRZ A,MASAPP(C) ; GET MASTER APP. BLK. KEY CAMN A,APPLST(E) ; DOES IT POINT TO MOVED APP. BLK.? HRRM T1,MASAPP(C) ; YES - POINT IT TO NEW ADDR. SOJG C,VPN23 ; CHECK ALL MASTER APP. BLKS. VPN24: MOVEI T1,^D47(T1) ; ADVANCE PAST NEW APP. BLK. SOJG E,VPN22 ; MOVE DOWN EACH EXISTING APP. BLK VPN25: MOVEM T1,VRFBOT ; WHEN DONE - MARK END OF BLKS. VPN2: MOVEI R,^D10 MOVEI T,^D47 SETZ A, MOVE X2,VRFBOT VPLAB4: MOVEI T1,^D47(X2) PUSHJ P,VSUB1 MOVEI X2,(T1) SOJG R,VPLAB4 SUBI T1,1 VPN3: CAMG T1,VRFTOP JRST VPAN92 PUSH P,T1 PUSHJ P,VPAN16 POP P,T1 JRST VPN3 VPAN16: MOVE X2,.JBREL ;GET MORE CORE AND MOVE UP TEMP STRS. MOVE C,CORINC ADDI C,(X2) CORE C, INLEMS(60,60,PANIC1) MOVE X2,.USREL PUSHJ P,DPANIC## ;YES, SPECICAL HANDLING SKIPN VRFBOT POPJ P, MOVE C,VRFTOP CAIE C,(X2) JRST VPLAB5 MOVE C,.USREL MOVEM C,VRFTOP POPJ P, VPLAB5: PUSHJ P,VPRES1 MOVE X1,.USREL MOVEI T,10 VPAN41: HRRZ T1,SRTDBA(T) JUMPN T1,VPAN42 SOJGE T,VPAN41 JRST VPAN43 VPAN42: MOVEI T1,-1(T1) CAMLE T1,VRFTOP JRST VPAN44 SETO T, VPAN43: MOVE T1,VRFTOP VPAN44: MOVEI R,(X1) SUBI R,(X2) SKIPN C,NUMMSP JRST VPAN5 VPAN45: HRRZ E,MASAPP(C) ;UPDATE MASTER APP BLK. CAILE E,(T1) CAILE E,(X2) JRST VPLAB6 ADDI E,(R) HRRM E,MASAPP(C) VPLAB6: SOJG C,VPAN45 VPAN5: SKIPN C,APPLST JRST VPAN56 VPAN51: MOVE A,APPLST(C) ;UPDATE OTHER APP BLKS. HRRZ E,(A) HRRZI G,(A) ADDI E,(G) VPAN55: HRRZ A,(E) CAILE A,(T1) CAILE A,(X2) JRST VPLAB7 ADDI A,(R) HRRM A,(E) VPLAB7: SOJ E, CAIE E,(G) JRST VPAN55 SOJG C,VPAN51 VPAN56: HRLS T1 ;SOURCE-1 TO BOTH HALVES AOBJN T1,VPN56A ;SOURCE TO BOTH VPN56A: ADDI T1,(R) ;ADD INCREMENT, GIVES XWD SOURCE,DEST HRLS X1 ;LIMIT TO BOTH HALVES SUBI X1,(R) ;DECREMENT BY INCREMENT MOVSS X1 ;XWD LIMIT-INCREMENT,LIMIT HRLS R ;INCREMENT TO BOTH HALVES MOVE X2,X1 ;SAVE LIMIT AOBJN X1,VPN56B ;PREPARE TOSET UP VPN56B: SUB X1,R ;LARGEST SAFE BLT POINTER IN X1 CAMGE X1,T1 ;LARGER THAN REQUIRED ? MOVE X1,T1 ;NO, USE REQUIRED PUSH P,X1 ;SAVE POINTER BLT X1,(X2) ;BLOCK TRANSFER POP P,X1 ;GET BACK POINTER CAMN X1,T1 ;WAS IT FINAL BLOCK ? JRST VPN56C ;YES SUBI X2,(R) ;NO, REDUCE LIMIT JRST VPN56B ;AND DO ANOTHER VPN56C: MOVEI X1,-1(T1) JUMPL T,VPAN6 VPAN58: HLRZ X2,SRTDBA(T) SUBI X2,1 CAMG X2,VRFTOP JRST VPAN6 SOJL T,VPAN57 HRRZ T1,SRTDBA(T) CAIN T1,1(X2) JRST VPAN58 SOJA T1,VPAN44 VPAN57: MOVE T1,VRFTOP JRST VPAN44 VPAN6: HRRZM X1,VRFTOP POPJ P, VPAN92: POP P,T POP P,T1 POP P,E POP P,C POP P,A POP P,G POP P,X2 POP P,X1 POP P,R POPJ P, ;PACK DOWN ROUTINE. VPRESS: PUSH P,[Z VPR4] VPRES1: MOVE A,MASAPP SUBI A,MASAPP MOVEM A,NUMMSP ;COUNT OF KEYS IN MASTER APPEND BLOCK. SETZM NUMAPP ;COUNT OF KEYS IN ALL OTHER APP. BLKS. SETZM APPLST ;COUNT OF OTHER APP. BLKS. SKIPN A,VRFBOT POPJ P, SETZ E, ;E IS INDEX FOR APPLST. MOVEI G,10 ;G IS INDEX TO SRTDBA SKIPN SRTDBA ;BUFFERS IN THE WAY? JRST VLOPF1 ;NO. VLOOP: HLRZ C,SRTDBA(G) ;FIND THE APPEND BLKS, WHICH ARE JUMPE C,VLOPFN CAIL C,(A) ;BETWEEN VRFBTB AND VRFBOT. JRST VLOPFN HRRZ C,SRTDBA(G) CAMG C,VRFBTB JRST VLOPFN PUSHJ P,VCHPBK ;A BUFFER IS IN THE APP BLK SPACE. HLRZ A,SRTDBA(G) CAMGE A,VRFBTB JRST VLOOP4 ;NO APP BLKS. LEFT. VLOPFN: SOJGE G,VLOOP VLOPF1: MOVE C,VRFBTB ;POSSIBLY NO BUFFERS WERE SEEN. PUSH P,[Z VLOOP4] VCHPBK: HRRZI X1,(A) ;MAKE SURE SUBI X1,(C) ;THIS SPACE JUMPLE X1,CPOPJ ;IS STILL THERE PUSH P,X2 IDIVI X1,^D47 ;AND IS DIVISIBLE BY 47 SUBI A,(X2) POP P,X2 VCHPB1: SUBI A,^D47 ;CUT UP THIS KNOWN SPACE. CAIGE A,(C) POPJ P, CAIL E,APPMAX ;IS APPEND LIST FULL ? JRST APPFUL ;YES, GRIPE MOVEM A,APPLST+1(E) AOJA E,VCHPBK VLOOP4: MOVEM E,APPLST ;STORE COUNT OF APP BLKS. SETZ A, ;FIND NO. OF KEYS. JUMPE E,VLOOP5 VPLAB8: MOVE X1,APPLST(E) HRRZ X1,(X1) ;GET COUNT OF STRING POINTERS ADDI A,(X1) SOJG E,VPLAB8 VLOOP5: MOVEM A,NUMAPP POPJ P, APPFUL: INLEMS(6,71,APPERR) APPERR: ERROM(71,</ ? Out of static list space/>) VPR4: MOVE G,SVRTOP ;SET UP LOWER BOUND. SETZ C, MOVEI E,10 SKIPN SRTDBA ;ANY BUFFERS? JRST VPR00 ;NO. VPR5: HLRZ A,SRTDBA(C) CAIN G,(A) ;GET ABOVE THE BUFFERS. JRST VPLAB9 PUSHJ P,PAKBLK JRST VPR00 VPLAB9: HRRZ G,SRTDBA(C) AOJ C, CAIG C,10 JRST VPR5 VPLABA: SETZM SRTDBA(E) ;ABOVE ALL THE BUFFERS, SO "ERASE" THEM. SOJGE E,VPLABA JRST VPR00 PAKBLK: JUMPE C,CPOPJ XLIST > IFN BASCX,< LIST PAKBL0: SETZ X1, ;SET UP SRTDBA SO THAT SUBI E,(C) ;THE NEXT HIGHEST BUFFER PAKBL1: MOVE X2,SRTDBA(C) ;IS IN THE FIRST LOCATION, MOVEM X2,SRTDBA(X1) ;AND "ERASE" THE LOWER BUFFERS. SETZM SRTDBA(C) AOJ X1, AOJ C, SOJGE E,PAKBL1 VPLABB: CAILE X1,10 POPJ P, SETZM SRTDBA(X1) AOJA X1,VPLABB XLIST > IFN BASXCT,< LIST VPR00: MOVEM G,VARFRE VPR0: HRRZI X2,-1 ;THE LOWEST ADDRESS WILL GO INTO X1 MOVE A,FLVSP ;A POINTS TO EACH ENTRY ON THE ROLL. SETZI X1, ;X1 WILL GET THE LOC OF NEXT LOWEST POINTER VPR1: CAMN A,CEVSP ;STARTING TO SCAN SVRROL, OR STILL IN VSPROL? MOVE A,SVRBOT CAML A,SVRTOP JRST VPR2 ;SEARCH FOR MINIMUM IS OVER. HRRZ E,(A) ;GET POINTER ADDRESS. JUMPE E,VPR11 ;NULL POINTER? CAIL E,(G) ;HAVE WE MOVED THIS STRING ALREADY? CAIG X2,(E) ;NO, IS IT A LOWER STRING ADDRESS? VPR11: AOJA A,VPR1 ;NO. LOOK AT NEXT STRING. MOVE X1,A ;WE HAVE FOUND A STRING WITH LOWER ADDRESS. MOVE X2,E AOJA A,VPR1 VPR2: JUMPE X1,VPR3 ;ANY MORE STRINGS TO MOVE? HLRE E,(X1) ;CALCULATE WORD LENGTH.. JUMPN E,VPLABC ;IS THIS A NULL STRING? SETZM (X1) ;YES. IGNORE IT. JRST VPR0 VPLABC: HRL G,(X1) ;GET THE OLD ADDRESS OF THIS STRING MOVN E,E ;GET WORD LENGTH ADDI E,4 PUSH P,G IDIVI E,5 POP P,G ADDI E,-1(G) HRRZI X2,(G) HRRZ C,(X1) ;GET CURRENT ADDRESS OF STRING CAMN X2,C ;IS IT THE SAME AS THE NEW ONE JRST VPR28 SKIPN SRTDBA ;POSSIBLY BUFFERS IN THE WAY? JRST VPR23 ;NO. SETZ C, VPR21: HLRZ X2,SRTDBA(C) JUMPE X2,VPR22 CAILE X2,(E) JRST VPR22 SUBI E,-1(G) HRR G,SRTDBA(C) ADDI E,-1(G) AOJ C, CAIG C,10 JRST VPR21 MOVEI E,10 VPLABD: SETZM SRTDBA(E) SOJGE E,VPLABD JRST VPR23 VPR22: JUMPE C,VPR23 PUSH P,E PUSH P,X1 MOVEI E,10 PUSHJ P,PAKBL0 ;WIND DOWN THE BUFFERS. POP P,X1 POP P,E VPR23: HRRZ X2,(X1) ;GET THE OLD STRING ADDRESS HRRM G,(X1) ;STORE THE NEW ADDRESS IN THE MAIN KEY. PUSH P,G BLT G,(E) ;MOVE THE STRING DOWN POP P,G SKIPN X1,NUMMSP ;UPDATE MASTER APP BLK? JRST VPR25 ;NO NEED. MOVE X1,MASAPP ;GET NO OF MASAPP KEYS SUBI X1,MASAPP ;SINCE NUMMSP CAN CHANGE VPR24: HRRZ A,MASAPP(X1) ;POSSIBLY. CAIE A,(X2) JRST VPLABE HRRM G,MASAPP(X1) SOS NUMMSP VPLABE: SOJG X1,VPR24 VPR25: SKIPN NUMAPP ;UPDATE OTHER APP BLKS? JRST VPR28 ;NO NEED. PUSH P,E ;POSSIBLY. MOVE X1,APPLST VPR26: HRRZ A,APPLST(X1) HRRZ C,(A) ;GET NO OF STRING PTRS ADDI C,(A) VPR27: HRRZ E,(C) CAIE E,(X2) JRST VPLABF HRRM G,(C) SOS NUMAPP VPLABF: SOJ C, CAILE C,(A) JRST VPR27 SOJG X1,VPR26 POP P,E VPR28: AOS G,E ;LOOK FOR A HIGHER ADDRESS NEXT TIME MOVEM E,VARFRE JRST VPR0 VPR3: PUSHJ P,BASORT ;RESTORE SRTDBA SETOM VPAKFL ;STRINGS ARE TIGHTLY PACKED POPJ P, XLIST > LIST SUBTTL DECIMAL NUMBER EVALUATE/PRINT ;ROUTINE TO EVALUATE NUMBER ;T: PNTR TO FIRST CHAR, C: FIRST CHAR ;NON-SKIP IS FAIL RETURN ;RETURN NUMBER IN N ;N: ACCUM NBMR, B: SCA FAC, D: DIG CNT, USE FLGS IN LEFT OF F EVANUM: SETZB N,B ;CLEAR ACS MOVEI D,8 MOVEI F,(F) ;CLEAR LH OF F TLNE C,F.PLUS ;SKIP + JRST EVAN1 TLNN C,F.MINS ;CHECK FOR - JRST EVAN2 ;NO TLO F,F.MIN ;SET MINUS FLG EVAN1: SKIPN IFIFG JRST EV1 PUSHJ P,NXCHD JRST EVAN2 EV1: PUSHJ P,NXCH EVAN2: TLNN C,F.DIG ;DIGIT? JRST EVAN3 ;NO TLO F,F.NUM ;DIGIT SEEN FLAG JUMPE N,EVAN2A ;DONT COUNT LEADING ZEROS SOJG D,EVAN2A ;COUNT DIGIT, GO ACCUM IF OK ; REST OF DIGITS ARE INSIGNIFIGANT. AOJA B,EVAN2B ;LEAD OR TRAIL 0, FUDGE SCA FAC EVAN2A: IMULI N,^D10 ;ACCUMULATE DIGIT ADDI N,-60(C) EVAN2B: TLNE F,F.DOT ;DECIMAL SEEN? SUBI B,1 ;YES. COUNT DOWN SCALE FACT JRST EVAN1 ;GO TO NEXT CHAR EVAN3: TLNN C,F.PER ;NOT DIGIT. DEC PNT? JRST EVAN4 ;NO. TLOE F,F.DOT ;YES, SET FLG & CHK ONLY ONE POPJ P, ;2 DEC PNTS JRST EVAN1 EVAN4: TLNN F,F.NUM ;DID WE SEE A DIGIT? POPJ P, ;NO. WHAT A LOUSY NUMBER MOVEI X1,"E" CAIE X1,(C) ;EXPLICIT SCALE FACTOR? JRST EVAN8 ;NO XLIST IFN BASEC,< LIST PUSH P,T PUSH P,C XLIST > LIST SKIPN IFIFG JRST EV2 PUSHJ P,NXCHD JRST EVLAB1 EV2: PUSHJ P,NXCH ;DO LOOK AHEAD EVLAB1: TLNE C,F.PLUS ;SCALE FACTOR SIGN JRST EVAN5 TLNN C,F.MINS JRST EVAN6 TLO F,F.MXP EVAN5: SKIPN IFIFG JRST EV3 PUSHJ P,NXCHD JRST EVAN6 EV3: PUSHJ P,NXCH EVAN6: TLNN C,F.DIG ;CHK FOR DIGIT XLIST IFN BASXCT,< LIST POPJ P, XLIST > XLIST IFN BASEC,< LIST JRST EVAN6A POP P,A POP P,A XLIST > LIST MOVEI A,-60(C) ;SAVE FIRST EXPON DIGIT SKIPN IFIFG JRST EV4 PUSHJ P,NXCHD JRST EVLAB2 EV4: PUSHJ P,NXCH EVLAB2: TLNN C,F.DIG ;IS THERE A SECOND DIGIT JRST EVAN7 ;NO IMULI A,^D10 ;YES. ACCUMULATE IT ADDI A,-60(C) SKIPN IFIFG JRST EV5 PUSHJ P,NXCHD JRST EVAN7 EV5: PUSHJ P,NXCH ;DO LOOK AHEAD EVAN7: TLNE F,F.MXP ;NEG EXPON? MOVN A,A ;YES. NEGATE IT ADD B,A ;ADD TO SCALE FACTOR XLIST IFN BASEC,< JRST EVAN8 EVAN6A: POP P,C POP P,T XLIST > LIST EXTERN TYPE,PFLAG EVAN8: CLEARM TYPE ;ASSUME REAL JUMPL B,EVAN8F ; TLNE F,F.DOT ;PERIOD SEEN? JRST EVAN8F ;YES, REAL NUMBER CAME C,[XWD F.STR,"%"] ;PERCENT SEEN? JRST EVAN9 ;NO PUSHJ P,NXCH ; SETOM PFLAG ;YES WE DID EVAN9A: SETOM TYPE ; XLIST IFN BASEC,< LIST JUMPE B,CPOPJ1 ; FAIL <? Integer overflow> XLIST > IFE BASEC,< LIST SETZM TYPE ; JUMPN B,EVAN8F SETOM TYPE ; CLEARM LIBFLG ;CLEAR OVERFLOW FLAG JRST EVAN8E+1 XLIST > LIST EVAN9: SKIPGE PFLAG JRST EVAN9A ;AND SKIP RETURN EVAN8F: JUMPE N,CPOPJ1 EVAN8A: MOVE X1,N ;) IDIVI X1,^D10 ;)REMOVE ANY TRAILING ZEROS JUMPN X2,EVAN8B ;) IN MANTISSA. (REASON: MOVE N,X1 ;) SO THAT, E.G., .1, AOJA B,EVAN8A ;) .10, .100, ..., ARE THE SAME) EVAN8B: TLO N,233000 ;FLOAT N FAD N,[0] SETZM LIBFLG ;CLEAR OVER/UNDERFLOW FLAG. EVAN8C: CAIGE B,^D15 ;SCALE UP IF .GE. 10^15 JRST EVAN8D SUBI B,^D14 ;SUBTRACT 14 FROM SCALE FACTOR FMPR N,D1E14 ;MULTIPLY BY 10^14 JRST EVAN8C ;GO LOOK AT SCALE AGAIN EVAN8D: CAML B,[EXP -^D4] ;SCALE DOWN IF .LT. 10^-4 JRST EVAN8E ADDI B,^D18 ;ADD 18 TO SCALE FMPR N,D1EM18 ;MULTIPLY BY 10^-18 JRST EVAN8D ;GO LOOK AT SCALE AGAIN EVAN8E: FMPR N,DECTAB(B) ;SCALE N TLNE F,F.MIN ;MINUS? MOVN N,N ;YES. NEGATE IT SKIPE LIBFLG ;SKIP IF NO OVER/UNDERFLOW. JRST CPOPJ JRST CPOPJ1 ;SUCCESS RETURN, NUMBER IN N ;POWER-OF-TEN TABLE. D1EM18: OCT 105447113564 ;10^-18 DECFLO: D1EM4: OCT 163643334273 ;10^-4 OCT 167406111565 OCT 172507534122 OCT 175631463146 DECTAB: DEC 1.0 ;10^0 DEC 1.0E1 DEC 1.0E2 DEC 1.0E3 DEC 1.0E4 DEC 1.0E5 DEC 1.0E6 DEC 1.0E7 OCT 233575360401 DEC 1.0E9 DEC 1.0E10 DEC 1.0E11 OCT 250721522451 ;10^12 OCT 254443023471 D1E14: OCT 257553630410 ;10^14 DECCEI: MAXEXP=^D38 DECFIX: EXP 225400000000 FIXCON: EXP 233400000000 ;FLAGS USED BY DECIMAL READER/PRINTER F.NUM=200000 ;DIGIT SEEN F.MIN=100000 ;MINUS SEEN F.MXP=40000 ;MINUS EXPONENT F.DOT=20000 ;DECIMAL POINT SEEN ;ROUTINE THAT SKIPS OVER ONE DATA FIELD SKIPDA: TLNE C,F.QUOT ;QUOTE STRING? JRST QSKIP ;YES, USE QSKIP ROUTINE SKLAB1: TLNE C,F.COMA+F.TERM ;FIELD TERMINATOR? JRST CPOPJ1 PUSHJ P,NXCH JRST SKLAB1 DEFINE INT(LABEL),< INTERN LABEL LABEL: > IFN BASEDT,< INT VPANIC INT VSUB1 INT BASORT INT UXIT7 INT UXIT6 > IFN BASCOM,< INT QUEUER INT .HELPR INT OUCHX INT UXIT7 INT UXIT6 INT NOGETD INT VPANIC INT OUTCNT INT ERASE INT INLSYS INT PTXER1 INT OUTERR INT DSKOT INT LINPT INT OUTPT INT PRTOCT INT DATTBL INT EOFFL INT GOSR2 INT GOSR3 INT DPBSTR INT INLINE INT INLGEN INT INLB1 INT XXXXXX INT INPT INT INCNT INT EDTXT1 > IFN BASXCT,< INT QUEUER INT .HELPR INT ERRMSG INT ERRMS2 INT PANIC1 INT OUCHX INT SCNLT1 INT ERACOM INT SCN2 INT SCNLT3 INT CLOSUP INT SCNLT2 INT CLOB INT SCN3 INT RPUSH INT PANIC INT QSELS INT OPENUP INT PRESS INT BUMPRL INT ERASE INT EDTXT1 > END