From 646dcd7d4abb181202831e4ba142f93e6779e9ce Mon Sep 17 00:00:00 2001 From: Lars Brinkhoff Date: Mon, 11 Jun 2018 10:06:04 +0200 Subject: [PATCH] Microcode assembler and converters for KL10. --- build/misc.tcl | 17 + doc/programs.md | 2 + src/syseng/cnvrt.37 | 1094 ++++++++++++++++ src/syseng/micro.52 | 2887 +++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 4000 insertions(+) create mode 100755 src/syseng/cnvrt.37 create mode 100755 src/syseng/micro.52 diff --git a/build/misc.tcl b/build/misc.tcl index 4e50decd..9c29169f 100644 --- a/build/misc.tcl +++ b/build/misc.tcl @@ -798,6 +798,23 @@ respond "*" ":midas sys3;ts scrmbl_ejs;scrmbl\r" expect ":KILL" respond "*" ":link sys3;ts unscr,sys3;ts scrmbl\r" +# KL10 microcode assembler +respond "*" ":midas sysbin;_syseng;micro\r" +expect ":KILL" +respond "*" ":job micro\r" +respond "*" ":load sysbin; micro bin\r" +respond "*" ":start purify\r" +respond "TS MICRO" "sys; ts micro\r" +respond "*" ":kill\r" + +# Microcode ASCIIzer and binarator converter. +respond "*" ":midas sysbin;_syseng;cnvrt\r" +expect ":KILL" +respond "*" ":link sys1;ts mcnvrt,sysbin;cnvrt bin\r" +respond "*" ":link sys1;ts pcnvrt,sysbin;cnvrt bin\r" +respond "*" ":link sys1;ts ucnvrt,sysbin;cnvrt bin\r" +respond "*" ":link sys1;ts acnvrt,sysbin;cnvrt bin\r" + # XXFILE respond "*" ":midas sysbin;xxfile bin_sysen1;xxfile\r" expect ":KILL" diff --git a/doc/programs.md b/doc/programs.md index 09a708b7..fad87d4a 100644 --- a/doc/programs.md +++ b/doc/programs.md @@ -1,6 +1,7 @@ - 11SIM, PDP-11 emulator. - 20XCVT, convert TOPS-20 CSAVE file to PDUMP. - @, cross reference generation tool. +- ACNVRT/MCNVRT/PCNVRT/UCNVRT, asciizer and binarator. - ACCLNK, sets com-link accept bit for specified TTY. - ACOUNT, dummy account program used for users from safe sites. - ADVENT, (Colossal Cave) Adventure by Will Crowther. @@ -116,6 +117,7 @@ - MAILT, allows editing mail (from :MAIL) in EMACS. - MCL, subsystem for compiling individual Macsyma files. - METER, displays system metering information. +- MICRO, microcode assembler. - MLDEV, MLSLV, Allows access to remote systems as devices (e.g. DB:). - MLIFE, Mike Speciner's Conway Life. - MODEMS, modems gragon. diff --git a/src/syseng/cnvrt.37 b/src/syseng/cnvrt.37 new file mode 100755 index 00000000..2610b1f3 --- /dev/null +++ b/src/syseng/cnvrt.37 @@ -0,0 +1,1094 @@ + +IF1 TITLE CNVRT - KL10 MICROCODE, etc. ASCIIZER + +.MLLIT==1 + +A=1 ;ARG/TEMP +B=2 ;.. +C=3 ;.. +D=4 ;.. +E=5 ;.. +T=6 ;TEMP +TT=7 ;TEMP +H=10 ;ARG TO ASCIIZING ROUTINE +I=11 ;.. +J=12 ;.. +Q=13 ;.. +IX=14 ;INPUT INDEX IN MICROCODE ASCIIZER +OX=15 ;OUTPUT .. +COD=16 ;TYPE OF CODE BEING ASCIIZED +P=17 ;PDL POINTER + +TYIC==1 +TYOC==2 +INCH==3 +OUCH==4 + +LBUF==200 +INBUF: BLOCK LBUF +INPNT: 0 +INCNT: 0 +INBS: 7 + +OUTBUF: BLOCK LBUF +OUTPNT: 0 +OUTCNT: 0 +OUTBS: 7 + +LPDL==100 +PDL: -LPDL,,. + BLOCK LPDL + +RCH: .VALUE ;INSTRUCTION TO READ CHAR INTO A + +LOSE: 0 ;NON-ZERO IF ERR MSGS PRINTED + +DEFINE MSG A + MOVEI TT,[ASCIZ\A\] + PUSHJ P,MSGO +TERMIN + +MSGOT: MOVE TT,T +MSGO: HRLI TT,440700 ;IMPLEMENT MSG MACRO +MSGO1: ILDB T,TT + JUMPE T,CPOPJ + .IOT TYOC,T + JRST MSGO1 + +DEFINE POINT (SIZ,ADR,POS=-1 +<<43'-.RADIX 10.,>_36'+<.RADIX 10.,>_30'+ADR>TERMIN + +JCLF: 0 ;-1 READING FROM JCL INSTEAD OF TTY +JCLBUF: BLOCK 20 +JCLEND==.-1 + +DEFINE CONC A,B +A!B!TERMIN + +DEFINE SUBTTL A/ +TERMIN + +SUBTTL I/O ROUTINES + +;JSP TT,INIT TO SET UP PDL, TYIC, TYOC + +INIT: MOVE P,PDL + PUSH P,TT + .OPEN TYIC,[.UAI,,'TTY] + .VALUE + .OPEN TYOC,[%TJDIS+.UAO,,'TTY] + .VALUE + .CALL [ SETZ + SIXBIT /CNSGET/ + MOVEI TYOC + REPEAT 4,MOVEM NOWHER + SETZM TT ] + MOVEI TT,0 + SETZM DISTTY' + TLNE TT,%TOERS + SETOM DISTTY + + SETOM JCLF + SETZM JCLBUF + MOVE T,[JCLBUF,,JCLBUF+1] + BLT T,JCLEND + .BREAK 12,[5,,JCLBUF] + MOVE T,[440700,,JCLBUF] + MOVEM T,JCLP' + SKIPN JCLBUF + SETZM JCLF + MOVE T,[PUSHJ P,TYIMAN] + MOVEM T,RCH + POPJ P, + +;READ CHARACTER FROM JCL OR TTY +;CHAR RETURNED IN T + +TYIMAN: SKIPN JCLF + JRST RCHTYI + ILDB T,JCLP + CAIE T,^M + CAIN T,^C + CAIA + JUMPN T,CPOPJ + MOVEI T,^M ;JCL ENDS WITH ^@, ^C, OR ^M + SETZM JCLF + POPJ P, + +RCHTYI: MOVE T,[.IOT TYIC,T] + MOVEM T,RCH + SOS (P) + POPJ P, + +;READ SIXBIT SYLLABLE INTO A, RETURN DELIMITER IN T +;DELIMITERS ARE NON-SIXBIT PLUS COLON, SEMICOLON, QUESTION, AND SPACE +;SKIP RETURN UNLESS FULLY RUBBED-OUT + +GETSYL: MOVEI A,0 + MOVE TT,[440600,,A] +GETSY0: XCT RCH + CAIN T,177 + JRST GSYRUB + CAIE T,"? + CAIG T,40 + JRST POPJ1 + CAIE T,": + CAIN T,"; + JRST POPJ1 + CAIL T,"a + CAILE T,"z + SUBI T,40 + TLNE TT,770000 + IDPB T,TT + JRST GETSY0 + +GSYRUB: MOVEI T,[ASCIZ/XXX /] + JUMPL TT,MSGOT ;WHOLE SYLLABLE RUBBED OUT, POPJ + LDB T,TT + ADDI T,40 + ADD TT,[060000,,] + SKIPN DISTTY + JRST [ .IOT TYOC,T + JRST GETSY0 ] + .IOT TYOC,[^P] + .IOT TYOC,["X] + JRST GETSY0 + + +;FILE NAME READER. STORES INTO DEVICE, FNAME1, FNAME2, SNAME +;RETURNS: NO SKIP, FULLY RUBBED OUT. SKIP, WON. + +FNR: MOVSI T,'DSK ;DEFAULTS + MOVEM T,DEVICE + .SUSET [.RSNAME,,SNAME] +FNR00: SETZM FNAME1 ;FN1 NOT TYPED YET + SETZM FNAME2 +FNR0: PUSHJ P,GETSYL ;READ NEXT SYLLABLE + POPJ P, ;FULLY RUBBED OUT + CAIN T,": + MOVEM A,DEVICE' + CAIN T,"; + MOVEM A,SNAME' + CAIE T,": + CAIN T,"; + JRST FNR0 + JUMPE A,FNR3 + SKIPN FNAME1 + JRST [ MOVEM A,FNAME1' + JRST FNR3 ] + MOVEM A,FNAME2' +FNR3: CAIL T,40 + JRST FNR0 + SKIPE TT,FNAME1 ;IF FN1 GIVEN, BUT NOT FN2, + MOVE TT,2NDNIN(COD) ;DEFAULT FN2 APPROPRIATELY + SKIPN FNAME2 + MOVEM TT,FNAME2 + ;RETURN WITH DELIM CHAR IN T +POPJ1: AOS (P) +CPOPJ: POPJ P, + +2NDNIN: SIXBIT /MCR/ + SIXBIT /BIN/ + SIXBIT /BIN/ + SIXBIT /A10/ +IF2 IFN .-2NDNIN-LJNMTB, .ERR 2NDNIN TABLE LOSES + +;READ CHARACTER FROM INCH, RETURN IN T. + +RDCH: SOSG INCNT + PUSHJ P,RDCH1 + ILDB T,INPNT + POPJ P, + +RDCH1: PUSH P,TT ;GETSYL WANTS TT PROTECTED + MOVEI T,36. ;BUFFER REFILL + IDIV T,INBS + MOVE TT,[-LBUF,,INBUF] + .IOT INCH,TT + MOVEI TT,-INBUF(TT) + IMUL TT,T + MOVEM TT,INCNT + JUMPE TT,EOFHAN ;@EOFHAN(COD) ? + MOVE T,INBS + LSH T,18.+6 + TLO T,440000 + HRRI T,INBUF + MOVEM T,INPNT +POPTTJ: POP P,TT + POPJ P, + +EOFHAN: MSG UNEXPECTED E-O-F + .VALUE + +REWIND: .ACCESS INCH,[0] + SETZM INCNT ;CAUSE BUFFER RELOAD ON NEXT RDCH + POPJ P, + +;WRITE CHARACTER IN A ONTO OUCH, CLOBBER T,TT + +WRCH: SOSG OUTCNT + PUSHJ P,WRBUF + IDPB A,OUTPNT + POPJ P, + +WRBUF: SKIPN T,OUTPNT ;PAD TO WORD + JRST WRBUF1 + IBP T + HRRZS T + CAIE T,@OUTPNT + JRST WRBUF0 + MOVEI T,^C + IDPB T,OUTPNT + JRST WRBUF + +WRBUF0: MOVE T,OUTPNT + HRLOI T,-OUTBUF(T) + EQVI T,OUTBUF + .IOT OUCH,T +WRBUF1: MOVEI T,36. + IDIV T,OUTBS + IMULI T,LBUF + MOVEM T,OUTCNT + MOVE T,OUTBS + LSH T,18.+6 + TLO T,440000 + HRRI T,OUTBUF + MOVEM T,OUTPNT + POPJ P, + +;RETURN OCTAL NUMBER IN B, DELIMITER IN T, CLOBBER A,B,T,TT + +GETOCT: MOVEI B,0 +GETOC1: XCT RCH + CAIL T,"0 + CAILE T,"7 + POPJ P, + IMULI B,8 + ADDI B,-"0(T) + JRST GETOC1 + +SUBTTL ASCIIZING SUBROUTINES + +;CALL HERE TO START PUTTING OUT AN ASCIIZED LINE +;H HAS FIRST CHARACTER, I HAS ADDRESS, J HAS COUNT +;CHECKSUM WILL BE ACCUMULATED IN Q +;CLOBBER Q,A,B,C,T,TT + +11BEG: MOVE Q,J ;INIT CHECKSUM FROM COUNT + ADD Q,I ; AND ADDRESS + MOVE A,H ;PUT COMMAND CHAR + PUSHJ P,WRCH + MOVEI A,40 ;PUT SPACE + PUSHJ P,WRCH + MOVE B,J ;PUT WORD COUNT + PUSHJ P,11PUT + PUSHJ P,PUTCMA ;PUT COMMA + LDB B,[.BP 177777,I] + PUSHJ P,11PUT ;PUT ADDRESS + JRST PUTCMA ;PUT COMMA AND RETURN + +;CALL HERE TO PUT NEXT WORD OF ASCIIZED LINE +;B HAS WORD. CHECKSUM IN Q. CLOBBERS A,C,T,TT. + +11WORD: ADD Q,B ;ACCUMULATE CHECKSUM + PUSHJ P,11PUT ;OUTPUT THE WORD + JRST PUTCMA ;PUT COMMA AND RETURN + +;CALL HERE TO END AN ASCIIZED LINE +;CLOBBERS A,B,C,T,TT + +11END: MOVN B,Q ;OUTPUT NEGATIVE CHECKSUM + ANDI B,177777 ;MASKED TO 16 BITS + PUSHJ P,11PUT + MOVEI A,15 ;THEN CRLF + PUSHJ P,WRCH + MOVEI A,12 + PUSHJ P,WRCH + POPJ P, + +PUTCMA: MOVEI A,", + JRST WRCH + +;PUT WORD IN B INTO ASCIIZED LINE, 3 CHARS LEADING ZEROS SUPPRESSED +;CLOBBER A,B,C,T,TT + +11PUT: MOVE C,[220600,,B] + JUMPE B,CPOPJ ;SKIP LEADING ZEROS + ILDB A,C + JUMPE A,.-1 +11PUT0: CAIGE A,75 ;MAP INTO RANGE 75-174 + ADDI A,100 + PUSHJ P,WRCH ;WRITE OUT CHR + TLNN C,770000 + POPJ P, + ILDB A,C ;DO NEXT CHR + JRST 11PUT0 + +;TYPE OUT OCTAL NUMBER IN T. CLOBBER T,TT. + +PUTOCT: IDIVI T,8 + HRLM TT,(P) + SKIPE T + PUSHJ P,PUTOCT + HLRZ TT,(P) + ADDI TT,"0 + .IOT TYOC,TT + POPJ P, + +;TYPE OUT SIXBIT WORD IN TT. CLOBBER T,TT. + +PUTSIX: MOVEI T,0 + LSHC T,6 + ADDI T,40 + .IOT TYOC,T + JUMPN TT,PUTSIX + POPJ P, + +SUBTTL MAIN PROGRAM + +CNVRT: JSP TT,INIT + MOVE TT,[.FNAM1] + PUSHJ P,PUTSIX + .IOT TYOC,[".] + MOVE TT,[.FNAM2] + PUSHJ P,PUTSIX + .IOT TYOC,[15] + .SUSET [.RJNAME,,TT] + MOVSI T,-LJNMTB + CAME TT,JNMTAB(T) + AOBJN T,.-1 + JUMPGE T,[MSG [JNAME NOT IN {UCNVRT,MCNVRT,PCNVRT}] + .BREAK 16,040000 ] + HRRZ COD,T + MOVE TT,GREET(COD) + PUSHJ P,MSGO + .IOT TYOC,[15] + +RFN: MOVEI TT,[ASCIZ/FILE: /] + SKIPN JCLF + PUSHJ P,MSGO + PUSHJ P,FNR + JRST RFN + .CALL [ SETZ + SIXBIT/OPEN/ + [.BAI,,INCH] + DEVICE + FNAME1 + FNAME2 + SETZ SNAME ] + JRST [ MSG CANNOT READ FILE + .VALUE [ASCIZ\î:ERRî\] ] + .CALL [ SETZ + SIXBIT/OPEN/ + [.BAO,,OUCH] + DEVICE + FNAME1 + 2NDNAM(COD) + SETZ SNAME ] + JRST [ MSG CANNOT WRITE FILE + .VALUE [ASCIZ\î:ERRî\] ] + MOVE TT,[PUSHJ P,RDCH] + MOVEM TT,RCH + JRST @CNVRTR(COD) + +;COME HERE WHEN ALL OUTPUT IS COMPLETE + +DONE: PUSHJ P,WRBUF ;WRITE OUT LAST BUFFER + .CLOSE OUCH, + SKIPE LOSE + JRST LOST + MSG DONE + .BREAK 16,160000 + +LOST: MSG LOST + .BREAK 16,040000 + +JNMTAB: OFFSET -. +%%UCOD::SIXBIT/UCNVRT/ ;ASCIIZE SOME MICROCODE +%%MID:: SIXBIT/MCNVRT/ ;ASCIIZE "MIDAS" (ITS SBLK FORMAT) +%%PALX::SIXBIT/PCNVRT/ ;ASCIIZE "PALX" (PDP11 ABS PAPER TAPE, 1 BYTE PER WORD) +%%ASS:: SIXBIT/ACNVRT/ ;PDP10 BINARY DE-ASCIIZER + OFFSET 0 +LJNMTB==.-JNMTAB + +GREET: [ASCIZ/KL10 MICROCODE ASCIIZER/] + [ASCIZ/PDP10 BINARY CODE ASCIIZER/] + [ASCIZ/PDP11 BINARY CODE ASCIIZER/] + [ASCIZ/PDP10 ASCII BINARATOR/] +IFN .-GREET-LJNMTB, .ERR GREET TABLE LOSES + +2NDNAM: SIXBIT/RAM/ + SIXBIT/A10/ + SIXBIT/A11/ + SIXBIT/BIN/ +IFN .-2NDNAM-LJNMTB, .ERR 2NDNAM TABLE LOSES + +CNVRTR: UCNVRT + MCNVRT + PCNVRT + ACNVRT +IFN .-CNVRTR-LJNMTB, .ERR CNVRTR TABLE LOSES + +SUBTTL MICROCODE ASCIIZER + +UCNVRT: SETZM DRMCNT' + SETZM CRMMAX' + SETZM DRAM ;ZERO OUT BOTH RAMS + MOVE TT,[DRAM,,DRAM+1] + BLT TT,CRAM+CRMSIZ*CRMWDS-1 + +MICLP: PUSHJ P,GETSYL ;GET COMMAND WORD + .VALUE + JUMPN A,MICL1 + CAIE T,"; + JRST MICLP ;IGNORE RANDOM BLANK LINES ETC +MICL0: XCT RCH ;SKIP COMMENT +SKEOL: CAIE T,12 + CAIN T,14 + JRST MICLP + JRST MICL0 + +MICL1: CAMN A,[SIXBIT/END/] + JRST DCSHUF ;DONE, SHUFFLE BITS AND OUTPUT + CAMN A,[SIXBIT/D/] + JRST STDRAM + CAME A,[SIXBIT/U/] + CAMN A,[SIXBIT/V/] + JRST STCRAM + MSG RAMDOMNESS IN ALLEGED "MCR" FILE + .VALUE + +;STORE INTO C RAM + +STCRAM: PUSHJ P,GETOCT ;GET C RAM ADDRESS + CAIL B,CRMSIZ + JRST [ MSG C RAM DON'T FIT + .VALUE ] + CAMLE B,CRMMAX + MOVEM B,CRMMAX ;REMEMBER MAXIMUM C RAM ADDRESS SEEN + MOVE I,B + IMULI I,CRMWDS + XCT RCH ;SKIP COMMA AFTER ADDRESS + CAIE T,40 + JRST [ MSG C RAM SEPARATOR NOT SPACE + .VALUE ] + PUSHJ P,GETOCT ;GET LISTING BITS 0-11 + LSH B,24. + MOVE Q,B + PUSHJ P,GETOCT ;GET LISTING BITS 12-23 + LSH B,12. + IOR Q,B + PUSHJ P,GETOCT ;GET LISTING BITS 24-35 + IOR Q,B + MOVEM Q,CRAM(I) ;STORE 1ST WD + PUSHJ P,GETOCT ;GET LISTING BITS 36-47 + LSH B,24. + MOVE Q,B + PUSHJ P,GETOCT ;GET LISTING BITS 48-59 + LSH B,12. + IOR Q,B + PUSHJ P,GETOCT ;GET LISTING BITS 60-71 + IOR Q,B + MOVEM Q,CRAM+1(I) ;STORE 2ND WD + PUSHJ P,GETOCT ;GET LISTING BITS 72-83 + LSH B,24. + HLLOM B,CRAM+2(I) ;STORE 3D WD, RH=-1 TO MARK WORD USED + JRST SKEOL + +DRMSIZ==512. ;SIZE OF D RAM +DRMWDS==1 ;# WORDS PER FROB IN D RAM +CRMSIZ==1536. ;SIZE OF C RAM +CRMWDS==3 ;# WORDS PER FROB IN C RAM + +DRAM: BLOCK DRMSIZ*DRMWDS +CRAM: BLOCK CRMSIZ*CRMWDS +11BUF: BLOCK 4*6 ;LOAD UP TO 4 CRAM LOCS AT A TIME +NOWHER: -1 ;UNUSED BITS GO HERE + +;STORE INTO D RAM + +STDRAM: PUSHJ P,GETOCT ;GET D RAM ADDRESS + CAIL B,DRMSIZ + JRST [ MSG D RAM DON'T FIT + .VALUE ] + AOS DRMCNT ;ANOTHER D RAM ENTRY + MOVE I,B + IMULI I,DRMWDS + XCT RCH ;SKIP COMMA AFTER ADDRESS + CAIE T,40 + JRST [ MSG D RAM SEPARATOR NOT SPACE + .VALUE ] + PUSHJ P,GETOCT ;GET 1ST LISTING WORD, A, B, & P + HRLZM B,DRAM(I) + PUSHJ P,GETOCT ;GET 2ND LISTING WORD, J FIELD + HRRM B,DRAM(I) + JRST SKEOL + +;SHUFFLE BITS AND OUTPUT + +DCSHUF: .CLOSE INCH, + MOVE TT,DRMCNT + CAIE TT,DRMSIZ + JRST [ MSG D RAM NOT FULLY POPULATED + JRST .+1 ] + +;ZERO, SHUFFLE, AND OUTPUT C RAM + +CSHUF: MOVEI H,"Z ;ZERO ALL USED C RAM LOCATIONS + MOVEI I,0 + MOVEI J,1 + PUSHJ P,11BEG + MOVE B,CRMMAX + PUSHJ P,11WORD + PUSHJ P,11END + + SETZB I,IX ;START DUMPING C RAM AT ADDRESS 0 + SETOM CRMPRV' ;INIT PREVIOUS ADDRESS + SETOM CRMBLK' ;INIT CURRENT BLOCK BASE ADDR + SETZB J,OX ;INIT COUNT OF WORDS IN BLOCK, 11BUF INDEX + +CSHUF1: PUSHJ P,CWORD ;PROCESS ONE C RAM WORD + ADDI IX,CRMWDS ;ADVANCE TO NEXT + CAIGE I,CRMSIZ-1 + AOJA I,CSHUF1 + PUSHJ P,CRMOUT ;OUTPUT ANY RESIDUE + MOVEI H,"C ;END BLOCK, TYPE C, COUNT 0, ADDR 0 MEANS NO START + SETZB I,J + PUSHJ P,11BEG + PUSHJ P,11END + +;SHUFFLE AND OUTPUT D RAM + +DSHUF: SETZB I,IX ;START DUMPING D RAM AT ADDRESS 0 + SETZB J,OX ;INIT COUNT OF WORDS IN BLOCK, 11BUF INDEX + SETOM DRMBLK' + +DSHUF1: PUSHJ P,DWORD ;PROCESS TWO D RAM WORDS + ADDI IX,2*DRMWDS ;ADVANCE TO NEXT + ADDI I,2 + CAIGE I,DRMSIZ + JRST DSHUF1 + PUSHJ P,DRMOUT ;OUTPUT ANY RESIDUE + MOVEI H,"D ;END BLOCK, TYPE D, COUNT 0, ADDR 0 MEANS NO START + SETZB I,J + PUSHJ P,11BEG + PUSHJ P,11END + JRST DONE + +;OUTPUT BLOCK OF C RAM INDICATED BY CRMPRV, J + +CRMOUT: JUMPE J,CRMOU2 ;DON'T PUT ZERO LENGTH BLOCKS + PUSH P,I + SKIPGE I,CRMBLK ;GET ADDRESS OF BLOCK + .VALUE + CAILE OX,4*6 ;MAKE SURE 11BUF DIDN'T OVERFLOW + .VALUE + MOVEI H,"C + PUSHJ P,11BEG + MOVNS J + HRLZS J +CRMOU1: MOVE B,11BUF(J) + PUSHJ P,11WORD + AOBJN J,CRMOU1 + PUSHJ P,11END + SETZB J,OX + POP P,I +CRMOU2: MOVEM I,CRMBLK ;SET BASE ADDRESS OF NEXT BLOCK + POPJ P, + +;SHUFFLE AND OUTPUT CRAM WORD POINTED TO BY IX, ADDRESS IN I + +CWORD: SKIPN CRAM+2(IX) + POPJ P, ;THIS ADDRESS NOT LOADED + AOS CRMPRV + CAME I,CRMPRV + PUSHJ P,CRMOUT ;ADDRESSES NOT SEQUENTIAL, START NEW BLOCK + TRNN I,3 + PUSHJ P,CRMOUT ;START NEW BLOCK OF FOUR + MOVEM I,CRMPRV ;INIT PREV ADDR TO THIS ADDR + SETZM 11BUF(OX) ;ZERO OUT ACTUAL STORAGE + MOVEI A,1+11BUF(OX) + HRLI A,11BUF(OX) + BLT A,11BUF+5(OX) + SETZM NOWHER + SETZB C,D ;INIT BIT COUNTER, PARITY + MOVE B,[440100,,CRAM(IX)] ;INIT BP TO BITS +CWORD1: ILDB A,B ;GET NEXT BIT OF LISTING FORMAT C RAM WORD + JUMPE A,CWORD2 ;FAST IF 0 + DPB A,CRAMPT(C) ;STORE THE BIT + XORI D,1 ;AND ACCUMULATE PARITY +CWORD2: CAIGE C,84.-1 ;SKIP IF ALL BITS DONE + AOJA C,CWORD1 + SKIPE NOWHER ;MAKE ERROR CHECKS + PUSHJ P,CUNUSD + SKIPN D + PUSHJ P,CODDPR + ADDI J,6 ;OUTPUT 6 WORDS + ADDI OX,6 + POPJ P, + +CUNUSD: MSG ATTEMPT TO TURN ON UNUSED BITS + JRST CRMERR + +CODDPR: MSG EVEN PARITY +CRMERR: MSG [ IN C RAM LOCATION ] + SETOM LOSE + MOVE T,I + PUSHJ P,PUTOCT + .IOT TYOC,[15] + POPJ P, + +;C RAM BIT MAPPING TABLE + +CRAMPT: POINT 1,NOWHERE,35 ;UNUSED 0 + POINT 1,11BUF+4(OX),25 ;J00 + POINT 1,11BUF+4(OX),26 ;J01 + POINT 1,11BUF+4(OX),27 ;J02 + POINT 1,11BUF+4(OX),28 ;J03 + POINT 1,11BUF+4(OX),29 ;J04 + POINT 1,11BUF+4(OX),30 ;J05 + POINT 1,11BUF+4(OX),31 ;J06 + POINT 1,11BUF+4(OX),32 ;J07 + POINT 1,11BUF+4(OX),33 ;J08 + POINT 1,11BUF+4(OX),34 ;J09 10 + POINT 1,11BUF+4(OX),35 ;J10 + POINT 1,11BUF+0(OX),30 ;AD CRY + POINT 1,11BUF+3(OX),28 ;AD BOOLE + POINT 1,11BUF+3(OX),24 ;AD SEL 8 + POINT 1,11BUF+3(OX),25 ;AD SEL 4 + POINT 1,11BUF+3(OX),26 ;AD SEL 2 + POINT 1,11BUF+3(OX),27 ;AD SEL 1 + POINT 1,11BUF+3(OX),29 ;ADA DIS + POINT 1,11BUF+3(OX),30 ;ADA SEL 2 + POINT 1,11BUF+3(OX),31 ;ADA SEL 1 20 + POINT 1,NOWHERE,34 ;UNUSED + POINT 1,11BUF+3(OX),32 ;ADB SEL 2 + POINT 1,11BUF+2(OX),20 ;ADB SEL 1 + POINT 1,11BUF+2(OX),33 ;ARM SEL 4 + POINT 1,11BUF+0(OX),20 ;ARM SEL 2 + POINT 1,11BUF+0(OX),22 ;ARM SEL 1 + POINT 1,11BUF+2(OX),24 ;ARXM SEL 4 + POINT 1,11BUF+0(OX),24 ;ARXM SEL 2 + POINT 1,11BUF+0(OX),26 ;ARXM SEL 1 + POINT 1,11BUF+1(OX),24 ;BR LOAD 30 + POINT 1,11BUF+1(OX),26 ;BRX LOAD + POINT 1,11BUF+3(OX),20 ;MQ SEL + POINT 1,11BUF+1(OX),28 ;FM ADR SEL 4 + POINT 1,11BUF+1(OX),29 ;FM ADR SEL 2 + POINT 1,11BUF+1(OX),30 ;FMADR SEL 1 35 + POINT 1,11BUF+4(OX),21 ;SCAD 4 36 + POINT 1,11BUF+4(OX),22 ;SCAD 2 + POINT 1,11BUF+4(OX),23 ;SCAD 1 + POINT 1,11BUF+4(OX),20 ;SCADA DIS + POINT 1,11BUF+2(OX),28 ;SCADA SEL 2 40 + POINT 1,11BUF+2(OX),29 ;SCADA SEL 1 + POINT 1,NOWHERE,33 ;UNUSED + POINT 1,11BUF+2(OX),30 ;SCADB SEL 2 + POINT 1,11BUF+1(OX),32 ;SCADB SEL 1 + POINT 1,NOWHERE,32 ;UNUSED + POINT 1,11BUF+1(OX),34 ;SCM SEL 2 + POINT 1,11BUF+4(OX),24 ;FE LOAD + POINT 1,NOWHERE,31 ;UNUSED + POINT 1,11BUF+2(OX),34 ;ARMM SEL 2 + POINT 1,11BUF+2(OX),35 ;ARMM SEL 1 50 + POINT 1,NOWHERE,30 ;UNUSED + POINT 1,11BUF+2(OX),32 ;VMAM SEL 2 + POINT 1,11BUF+0(OX),28 ;VMAM SEL 1 + POINT 1,11BUF+0(OX),32 ;T00 + POINT 1,11BUF+0(OX),34 ;T01 + POINT 1,11BUF+1(OX),20 ;MEM 00 + POINT 1,11BUF+1(OX),21 ;MEM 01 + POINT 1,11BUF+1(OX),22 ;MEM 02 + POINT 1,11BUF+1(OX),23 ;MEM 03 + POINT 1,11BUF+3(OX),21 ;COND 00 60 + POINT 1,11BUF+3(OX),22 ;COND 01 + POINT 1,11BUF+3(OX),23 ;COND 02 + POINT 1,11BUF+1(OX),25 ;COND 03 + POINT 1,11BUF+1(OX),27 ;COND 04 + POINT 1,11BUF+1(OX),31 ;COND 05 + POINT 1,NOWHERE,29 ;UNUSED + POINT 1,11BUF+5(OX),31 ;SPEC 00 + POINT 1,11BUF+5(OX),32 ;SPEC 01 + POINT 1,11BUF+5(OX),33 ;SPEC 02 + POINT 1,11BUF+5(OX),34 ;SPEC 03 70 + POINT 1,11BUF+5(OX),35 ;SPEC 04 71 + POINT 1,NOWHERE,28 ;UNUSED 72 + POINT 1,NOWHERE,27 ;UNUSED + POINT 1,11BUF+2(OX),31 ;MARK + POINT 1,11BUF+3(OX),33 ;# 00 + POINT 1,11BUF+3(OX),34 ;# 01 + POINT 1,11BUF+3(OX),35 ;# 02 + POINT 1,11BUF+2(OX),21 ;# 03 + POINT 1,11BUF+2(OX),22 ;# 04 + POINT 1,11BUF+2(OX),23 ;# 05 80 + POINT 1,11BUF+2(OX),25 ;# 06 + POINT 1,11BUF+2(OX),26 ;# 07 + POINT 1,11BUF+2(OX),27 ;# 08 83 + +;OUTPUT BLOCK OF D RAM INDICATED BY I, J + +DRMOUT: JUMPE J,DRMOU2 ;DON'T PUT ZERO LENGTH BLOCKS + PUSH P,I + SKIPGE I,DRMBLK + .VALUE + CAILE OX,4*6 ;MAKE SURE 11BUF DIDN'T OVERFLOW + .VALUE + MOVEI H,"D + PUSHJ P,11BEG + MOVNS J + HRLZS J +DRMOU1: MOVE B,11BUF(J) + PUSHJ P,11WORD + AOBJN J,DRMOU1 + PUSHJ P,11END + SETZB J,OX + POP P,I +DRMOU2: MOVEM I,DRMBLK + POPJ P, + +;OUTPUT PAIR OF DRAM WORDS AT ADDRESS I, IX -> LISTING FMT, J # WDS SO FAR, OX -> OUT BUF + +DWORD: TRNN I,7 + PUSHJ P,DRMOUT ;START NEW BLOCK OF 8 + SETZM 11BUF(OX) ;CLEAR OUTPUT AREA + SETZM 11BUF+1(OX) + SETZM 11BUF+2(OX) + + LDB T,[POINT 3,DRAM(IX),8] ;DO EVEN A FIELD + DPB T,[POINT 3,11BUF(OX),24] + LDB T,[POINT 3,DRAM+DRMWDS(IX),8] ;DO ODD A FIELD + DPB T,[POINT 3,11BUF+1(OX),24] + + LDB T,[POINT 3,DRAM(IX),11] ;DO EVEN B FIELD + DPB T,[POINT 3,11BUF(OX),27] + LDB T,[POINT 3,DRAM+DRMWDS(IX),11] ;DO ODD B FIELD + DPB T,[POINT 3,11BUF+1(OX),27] + + LDB T,[POINT 1,DRAM(IX),17] ;DO EVEN PARITY FIELD + DPB T,[POINT 1,11BUF(OX),30] + LDB T,[POINT 1,DRAM+DRMWDS(IX),17] ;DO ODD PARITY FIELD + DPB T,[POINT 1,11BUF+1(OX),30] + + LDB T,[POINT 4,DRAM(IX),35] ;DO EVEN PART OF J FIELD + DPB T,[POINT 4,11BUF(OX),35] + LDB T,[POINT 4,DRAM+DRMWDS(IX),35] ;DO ODD PART OF J FIELD + DPB T,[POINT 4,11BUF+1(OX),35] + LDB T,[POINT 6,DRAM(IX),31] ;DO COMMON PART OF J FIELD + LDB TT,[POINT 6,DRAM+DRMWDS(IX),31] + CAIN I,254 + TRO T,100_-4 ;JRST HACK (UGH) + CAME T,TT + JRST [ MSG [EVEN AND ODD J FIELDS DON'T MATCH. D RAM LOC ] + SETOM LOSE + PUSH P,T + MOVE T,I + PUSHJ P,PUTOCT + .IOT TYOC,[15] + POP P,T + JRST .+1 ] + TRNE T,3 + JRST [ MSG [EVIL BITS ON IN J FIELD. D RAM LOC ] + SETOM LOSE + PUSH P,T + MOVE T,I + PUSHJ P,PUTOCT + .IOT TYOC,[15] + POP P,T + JRST .+1 ] + MOVE TT,T + LSH TT,-2 + DPB TT,[POINT 4,11BUF+2(OX),35] + +REPEAT 0,[ ;THIS WOULD BE A NEAT HACK, BUT DIVI IS REALLY SINGLE PRECISION + MOVE TT,11BUF(OX) ;CHECK PARITY + XOR TT,11BUF+2(OX) + CAIN I,254 + XORI TT,1 ;THE CRUFTY JRST HACK AGAIN + IMULI TT,100000 ;2 COPIES OF 15 BITS + MOVE T,TT ;4 COPIES + AND TT,[2104210421] ;TAKE EVERY 4TH BIT + AND T,[421042104] ;DITTO, ALLOWING FOR 4 BITS + SIGN OF TT BETWEEN + DIVI T,17 ;HEXADECIMALLY CAST OUT 15'S + SKIPN TT + JRST [ MSG [EVEN PARITY D RAM LOC ] + SETOM LOSE + MOVE T,I + PUSHJ P,PUTOCT + .IOT TYOC,[15] + JRST .+1 ] + + MOVE TT,11BUF+1(OX) ;CHECK PARITY OF ODD LOC + XOR TT,11BUF+2(OX) + IMULI TT,100000 ;2 COPIES OF 15 BITS + MOVE T,TT ;4 COPIES + AND TT,[2104210421] ;TAKE EVERY 4TH BIT + AND T,[421042104] ;DITTO, ALLOWING FOR 4 BITS + SIGN OF TT BETWEEN + DIVI T,17 ;HEXADECIMALLY CAST OUT 15'S + SKIPN TT ; (CASTING A HEX?) + JRST [ MSG [EVEN PARITY D RAM LOC ] + SETOM LOSE + MOVEI T,1(I) + PUSHJ P,PUTOCT + .IOT TYOC,[15] + JRST .+1 ] +] ;END OF REPEAT 0 + + MOVE TT,11BUF(OX) ;CHECK PARITY + XOR TT,11BUF+2(OX) ;THE PEDESTRIAN WAY + CAIN I,254 + XORI TT,1 ;THE CRUFTY JRST HACK AGAIN + MOVEI T,0 +DPARL1: TRNE TT,1 + XORI T,1 + LSH TT,-1 + JUMPN TT,DPARL1 + SKIPN T + JRST [ MSG [EVEN PARITY D RAM LOC ] + SETOM LOSE + MOVE T,I + PUSHJ P,PUTOCT + .IOT TYOC,[15] + JRST .+1 ] + + MOVE TT,11BUF+1(OX) ;CHECK PARITYOF ODD WORD + XOR TT,11BUF+2(OX) ;THE PEDESTRIAN WAY + MOVEI T,0 +DPARL2: TRNE TT,1 + XORI T,1 + LSH TT,-1 + JUMPN TT,DPARL2 + SKIPN T + JRST [ MSG [EVEN PARITY D RAM LOC ] + SETOM LOSE + MOVEI T,1(I) + PUSHJ P,PUTOCT + .IOT TYOC,[15] + JRST .+1 ] + + ADDI J,3 ;PUT OUT 3 WORDS + ADDI OX,3 + POPJ P, + +SUBTTL PDP10 BINARY CODE ASCIIZER + +MCNVRT: MOVEI T,36. + MOVEM T,INBS + SETOM H ;HIGHEST ADDRESS USED + MOVEI J,-1 ;LOWEST ADDRESS USED +MCNV1: PUSHJ P,RDCH ;FIRST PASS JUST FINDS SIZE OF PROGRAM + CAME T,[JRST 1] + JRST MCNV1 +MCNV2: PUSHJ P,RDCH ;START NEW BLOCK + MOVE A,T ;HEADER IN A + JUMPGE A,MCNVP2 ;START ADDR, ENTER PASS 2 + HRRZ T,A ;T FIRST LOC IN BLOCK + HLRE TT,A + SUBM T,TT ;TT FIRST LOC ABOVE BLOCK + CAMGE T,J + MOVE J,T + CAMLE TT,H + MOVE H,TT + PUSHJ P,RDCH ;GOBBLE REST OF BLOCK + AOBJN A,.-1 + PUSHJ P,RDCH ;GOBBLE CHECKSUM + JRST MCNV2 + +MCNVP2: PUSHJ P,REWIND ;BEGIN PASS 2 + CAIGE J,1000 ;IF PROGRAM LOADS INTO LOW CORE + MOVEI J,0 ;CLEAR ALL CORE + MOVE TT,FNAME1 + PUSHJ P,PUTSIX + MSG [ PROGRAM LIMITS ] + MOVE T,J + PUSHJ P,PUTOCT + .IOT TYOC,["-] + MOVE T,H + PUSHJ P,PUTOCT + .IOT TYOC,[15] + SUB H,J ;NUMBER OF WORDS TO ZERO + LDB I,[.BP 177777,J] ;PUT A CORE-ZERO LINE + LDB J,[.BP 600000,J] ;WEIRD KLUDGE FOR HIGH 2 BITS OF ADDR + LSH J,8 ;.. + MOVE T,H ;COMPUTE NUMBER OF COUNT WORDS + IDIVI T,177777 + SKIPE TT + AOS T + MOVE J,T + PUSH P,H + MOVEI H,"Z + PUSHJ P,11BEG + POP P,H +MCNV4: MOVE B,H + CAILE B,177777 + MOVEI B,177777 + SUB H,B + PUSHJ P,11WORD + JUMPN H,MCNV4 + PUSHJ P,11END +;DROPS THROUGH + +;DROPS IN + +MCNV5: PUSHJ P,RDCH + CAME T,[JRST 1] + JRST MCNV5 +MCNV6: PUSHJ P,RDCH ;START BLOCK + MOVE A,T ;BLOCK HEADER IN A + JUMPGE A,MCNVSA + HLRE J,A + IMUL J,[-3] + HRRZ I,A +MCNV7: PUSH P,J ;START LINE + CAILE J,24. + MOVEI J,24. + SUBM J,(P) + MOVNS (P) + MOVEI H,"T + LDB T,[.BP 600000,I] + LSH T,8 + IOR J,T + PUSHJ P,11BEG + ANDI J,377 ;PUT PIECES OF WORDS +MCNV8: PUSHJ P,RDCH + MOVE H,T + LDB B,[002000,,H] + PUSHJ P,11WORD + LDB B,[202000,,H] + PUSHJ P,11WORD + LDB B,[400400,,H] + PUSHJ P,11WORD + SUBI J,3 + ADDI I,1 + JUMPG J,MCNV8 ;MORE WORDS THIS LINE + PUSHJ P,11END + POP P,J + JUMPN J,MCNV7 ;MORE LINES THIS BLOCK + PUSHJ P,RDCH ;FLUSH CHECKSUM + JRST MCNV6 ;MORE BLOCKS THIS FILE + +MCNVSA: MOVEI H,"T ;WRITE TRANSFER LINE + HRRZ I,A + LDB J,[.BP 600000,I] + LSH J,8 + PUSHJ P,11BEG + PUSHJ P,11END + JRST DONE + +SUBTTL PDP10 ASCII BINARATOR + +ACNVRT: MOVEI T,36. + MOVEM T,OUTBS + MOVE A,[JRST 1] + PUSHJ P,WRCH +ACNV00: PUSHJ P,RDCH ;FIND 'T' LINE + CAIN T,"T + JRST ACNV01 +ACNVNL: PUSHJ P,RDCH ;FIND NEXT LINE + CAIN T,12 + JRST ACNV00 + JRST ACNVNL + +ACNV01: PUSHJ P,RDCH ;SKIP SPACE + PUSHJ P,RDASS ;GET WORD COUNT + LDB C,[101000,,A] ;HIGH BYTE OF WORD COUNT HAS HIGH 2 BITS OF LOAD ADDR + ANDI A,377 + IDIVI A,3 ;3 PDP11 WORDS PER PDP10 WORD + MOVN B,A + PUSHJ P,RDASS ;GET LOAD ADDRESS + DPB C,[200200,,A] ;INSERT HIGH 2 BITS + JUMPE B,ACNV69 ;0 => START ADDR LINE => E.O.F. + HRL A,B ;MAKE AOBJN POINTER + MOVE Q,A ;INIT CHECKSUM + MOVE H,A ;AOBJN PNTR + PUSHJ P,WRCH +ACNV02: PUSHJ P,RDASS ;GET LOW 16 BITS + MOVE B,A + PUSHJ P,RDASS ;GET MIDDLE 16 BITS + DPB A,[202000,,B] + PUSHJ P,RDASS ;GET HIGH 4 BITS + DPB A,[400400,,B] + MOVE A,B + ROT Q,1 + ADD Q,A + PUSHJ P,WRCH + AOBJN H,ACNV02 + MOVE A,Q ;PUNCH CHECKSUM + PUSHJ P,WRCH + JRST ACNVNL ;AND GO DO NEXT LINE + +ACNV69: SKIPE A ;PUNCH START ADDR + HRLI A,(JUMPA) + PUSHJ P,WRCH + PUSHJ P,WRCH + JRST DONE + +;SUBROUTINE TO READ AN ASCIIZED WORD AND RETURN 16 BINARY BITS IN A + +RDASS: MOVEI A,0 +RDASS1: PUSHJ P,RDCH + CAIGE T,75 + POPJ P, + LSH A,6 + ANDI T,77 + ADD A,T + JRST RDASS1 + +SUBTTL PALX BINARY ASCIIZER + +PCNVRT: MOVEI T,36. + MOVEM T,INBS +PCNV1: PUSHJ P,RDCH ;SEARCH FOR START OF BLOCK + JUMPE T,PCNV1 + CAIE T,1 + JRST [ MSG ALLEGED PALX BINARY FILE CONTAINS NON-ABSLDR BLOCK TYPE + .VALUE ] + PUSHJ P,RDCH ;SKIP RANDOM NULL BYTE + PUSHJ P,RWORD ;GET BYTE COUNT + TRNE A,1 + JRST [ MSG BARF! KLDCP CAN'T LOAD ODD NUMBER OF BYTES IN A BLOCK + .VALUE ] + LSH A,-1 ;CONVERT TO WORD COUNT + MOVEI J,-3(A) ;DON'T COUNT BLOCK HEADER + PUSHJ P,RWORD ;GET LOAD ADDRESS + MOVE I,A + JUMPE J,PCNVSA + TRNE I,1 + JRST [ MSG BARF! KLDCP CAN'T LOAD ON BYTE BOUNDARIES + .VALUE ] +PCNV2: PUSH P,J ;START NEW LINE + CAILE J,29. + MOVEI J,29. + SUBM J,(P) + MOVNS (P) + MOVEI H,"E + PUSHJ P,11BEG +PCNV3: PUSHJ P,RWORD + MOVE B,A + PUSHJ P,11WORD + AOS I + SOJG J,PCNV3 ;MORE WORDS THIS LINE + PUSHJ P,11END + POP P,J + JUMPN J,PCNV2 ;MORE LINES THIS BLOCK + PUSHJ P,RDCH ;GOBBLE CHECKSUM BYTE + JRST PCNV1 ;MORE BLOCKS THIS FILE + +PCNVSA: MOVEI H,"E ;WRITE TRANSFER LINE + PUSHJ P,11BEG + PUSHJ P,11END + JRST DONE + +RWORD: PUSHJ P,RDCH + MOVE A,T + PUSHJ P,RDCH + LSH T,8 + IOR A,T + POPJ P, + +VARIABLES +CONSTANTS + +CONC PRINTX /HIGHEST USED=,\., +/ +END CNVRT + \ No newline at end of file diff --git a/src/syseng/micro.52 b/src/syseng/micro.52 new file mode 100755 index 00000000..57659ae6 --- /dev/null +++ b/src/syseng/micro.52 @@ -0,0 +1,2887 @@ +TITLE MICRO CODE ASSEMBLER +; TOM EGGERS/JSL 30 APRIL, 75 +; modified for ITS OCTOBER 1975. +;4/21/79 Moon .SEQADR + +;CUSTVR==0 ;CUSTOMER VERSION +;DECVER==20 ;MAJOR VERSION +;DECMVR==0 ;MINOR VERSION +;DECEVR==156 ;EDIT NUMBER +;LOC <.JBVER==:137> +; BYTE (3) CUSTVR (9) DECVER (6) DECMVR (18) DECEVR + +DEFINE SUBTTL A/ +TERMIN + +;AC DEFINITIONS +F==0 ;FLAG REGISTER +T1=1 ;GLOBAL TEMP +T2=T1+1 ;DITTO +T3=T2+1 +T4=T3+1 +RAM==7 ;CONTAINS RAM NUMBER CURRENTLY BEING ASSEMBLED + UCODE==0 + DISP==1 ;BITS WITHIN AC RAM +FPNT=10 ;POINTS TO CURRENT FIELD NAME IN SYM TABLE +SPNT=11 ;POINTS TO CURRENT SYMBOL NAME IN SYM TABLE +C=12 ;HOLDS LAST CHARACTER READ FOR INPUT +C1=C+1 +N=14 ;GLOBAL AC FOR PASSING ARGS +N1=N+1 ;DITTO +PM=16 ;STACK FOR MACROS AND RESCANS +P=17 ;PUSH DOWN POINTER + +;IN AC F (RIGHT HALF) +REREAD==1 ;REREAD LAST INPUT CHARACTER +SUPP==2 ;SUPPRESS ASSEMBLY +BINF==200 ;BINARY WORD HAS BEEN STARTED +PASS2==400 ;0 FOR PASS1, 1 FOR PASS2 +ERROR==1000 ;ERROR FOUND ON LINE +NOHDR==2000 ;SUPPRESS PRINTING TOP-OF-PAGE HEADERS + +DEFINE SWSET VAR,VAL +IFNDEF VAR,VAR==VAL +IF2,[ IFN VAR,[ +PRINTX \SWITCH VAR IS ON +\] IFE VAR,[ +PRINTX \SWITCH VAR IS OFF +\]] +TERMIN + +SWSET FTLOOS,0 ;1 TO DISTINGUISH "LOOSE" MICRO-WORDS +SWSET FTCOIN,0 ;1 TO CREF ALL LINES OF ONE WORD TOGETHER +SWSET FTMAP,1 ;1 TO PRINT MAP OF LINE #'S BY LOCATION +SWSET FTECHR,0 ;1 TO PRINT LAST CHAR ON ERROR +SWSET FTIF,1 ;1 TO ENABLE CONDITIONAL ASSEMBLY LOGIC +SWSET FTBB,0 ;1 TO ENABLE KL10 BREADBOARD HACK +IFN FTBB,[ +FTLOOS==1 +GDWRDS==2000'/36. +BORDER==-1_<35.-<2000'-<<2000'/36.>*36.>-1>> +] + +;DEFINE IO CHANNELS +OUTCHN==0 +INCHN==1 +TYIC==2 +TYOC==3 +ERRC==4 + +DEFINE MSG [A,B] + 1000,,[[ASCIZ @B@],,A] +TERMIN + + OUTSTR=2000,,0 + HALT=3000,,0 ;THESE CRETINOUS BAG CHOMPERS STORE DATA IN THE RH OF HALT + +LPPAG==58. ;LINES PER PAGE + +EXIT=.BREAK 16,040000 + +DEFINE PINDEX SIZ,ADR +REPEAT 36./, POINT SIZ,ADR,<.RPCNT+1>*-1 +TERMIN + +DEFINE POINT (SIZ,ADR,POS=-1 +<<43'-<.RADIX 10.,>>_36'+<.RADIX 10.,>_30'+ADR>TERMIN + +DEFINE IOWD (A,B) +-,,-1 TERMIN + +;STRUCTURE DEFINITIONS + +MICMXB==144. ;MAX NUMBER OF BITS IN A MICRO WORD +MICMXW==MICMXB/36. ;MAX NUMBER OF WORDS FOR A MICRO WORD +NCHARS==20. ;MAX NUM OF CHARS IN A SYMBOL +NWORDS==/5 ;MAX NUMBER OF WORDS TO HOLD A SYMBOL + +MAXPC==2047. ;MAXIMUM AMOUNT OF MICRO CODE-1 +MAXDSP==512. ;MAX SIZE OF DISPATCH + +;STRUCTURE OF A SYMBOL TABLE ENTRY + + OFFSET -. +SYMLNK::BLOCK 1 ;LEFT HALF CHAINS SYMBOLS WITHIN A FIELD TOGETHER + ;RIGHT HALF CHAINS FIELDS TOGETHER + ;POINTER TO 1ST FIELD IS IN FLDPNT + SYMMAC==SYMLNK ;FOR MACRO SYMBOLS, RIGHT HALF + ;POINTS TO 1ST CHAR OF MACRO EXPANSION + SYMPSO==SYMLNK ;FOR PSEUDO OPS, RH IS HANDLER ADDR + SYMEQL==SYMLNK ;RH LINKS EQUAL TAGS IN J FIELD +SYMTXT::BLOCK NWORDS ;1ST WORD WITH ASCIZ TEXT FOR NAME +SYMVAL::BLOCK 1 ;CONTAINS VALUES FOR A SYMBOL +SYMCRF::BLOCK 1 ;LEFT IS POINTER TO LAST ITEM IN CREF LIST + ;RIGHT IS POINTER TO 1ST ITEM +SYMLST==.-1 ;LAST LOCATION IN BLOCK +SYMLEN==.-SYMLNK ;# OF WORDS IN A SYMBOL BLOCK + OFFSET 0 + +;FLAGS IN SYMBOL FLAG FIELD +MULF==1 + +;TWO-SEGMENT FROBBERY + +%%HIGH==400000 +%%LOW==100 +%%PURE==0 + +DEFINE PURE +IFN %%PURE,.ERR TWO `PURE'S IN A ROW +.ELSE %%LOW==. +%%PURE==1 +LOC %%HIGH +TERMIN + +DEFINE IMPURE +IFE %%PURE,.ERR TWO `IMPURE'S IN A ROW +.ELSE %%HIGH==. +%%PURE==0 +LOC %%LOW +TERMIN + +SUBTTL INITIALIZATION + PURE + +MICRO: .OPEN TYIC,[.UAI,,'TTY] + .VALUE + .OPEN TYOC,[%TJDIS+.UAO,,'TTY] + .VALUE + .SUSET [.RRUNT,,N] ;GET STARTING RUNTIME + SETZM GOBLT + MOVE T1,[GOBLT,,GOBLT+1] + BLT T1,ENDBLT-1 ;ZERO STORAGE AREA + MOVEM N,STTIME ;SAVE STARTING TIME + .CALL [ SETZ ? 'CNSGET ? MOVEI TYOC ? REPEAT 4,[MOVEM T1 ? ] SETZM T1 ] + MOVEI T1,0 + SETZM DISTTY + TLNE T1,%TOERS + SETOM DISTTY + MOVEI 17,1 + MOVEI 0,0 + BLT 17,17 ;ZERO THE AC'S + MOVE P,[IOWD PDLEND-PDL-1,PDL] + MOVE PM,[IOWD PMEND-PMDL-1,PMDL] + MOVE T1,[PUSHJ P,UUOH] + MOVEM T1,41 + PUSHJ P,FNR. ;READ COMMAND LINE + +;SETUP IO + + SKIPN O.DEV + MSG [EXIT], NO OUTPUT FILE SPECIFIED + .CALL [ SETZ + SIXBIT/OPEN/ + [.BAO,,OUTCHN] + O.DEV + O.NAM + O.EXT + SETZ O.PPN ] + PUSHJ P,OFOPER ;CAN'T OPEN + + MOVE T1,[OUTCHN,,RCHST] + .RCHST T1, + MOVE T1,RCHST+1 + MOVEM T1,OUTFIL+F.NAM + MOVE T1,RCHST+2 + MOVEM T1,OUTFIL+F.EXT + MOVE T1,RCHST+3 + MOVEM T1,OUTFIL+F.PPN + MOVE T1,O.DEV ;RCHST SCREWS DEVICE + MOVEM T1,OUTFIL+F.DEV + .CALL [ SETZ + 'RQDATE + SETZM OUTFIL+F.TIM ] + .VALUE + + PUSHJ P,PNTINI ;INIT OUTPUT LISTING + HRROI T1,1 ;START AT PAGE 1, NEED A HEADER + MOVEM T1,PAGNUM + +BEGPAS: SETZM STATE ;INIT STATE FOR SYNTAX ANALYSIS + SETZM PC+UCODE + SETZM PC+DISP + SETOM PRNTPC+UCODE ;LAST LOC ASSEMBLED WAS -1 + SETOM PRNTPC+DISP ; IN BOTH RAMS + MOVEI RAM,UCODE ;START WITH UCODE ASSEMBLY + MOVEI T1,1 + MOVEM T1,LINNUM ;INIT LINE NUMBER TO 1 + PUSHJ P,BEGIO ;INIT INPUT IO + MSG [EXIT], NO INPUT FILES + SETZM USAGE + MOVE T1,[USAGE,,USAGE+1] +IFN FTBB,[ + BLT T1,USAGE+GDWRDS-1 + MOVE T1,[252525252525] + MOVEM T1,USAGE+GDWRDS+1 + TLZ T1,(BORDER) + MOVEM T1,USAGE+GDWRDS + MOVE T1,[USAGE+GDWRDS+1,,USAGE+GDWRDS+2] +];END FTBB + BLT T1,USGEND-1 ;CLEAR USAGE TABLE + ANDI F,PASS2 + +SUBTTL TOP LEVEL ASSEMBLY LOOP + +STATLP: SKIPE STATE + JRST STAT1 + TRZ F,BINF\ERROR ;ONLY CLEARED IN STATE 0 + SETZM VALUE + MOVE T1,[VALUE,,VALUE+1] + BLT T1,VALEND-1 + MOVE T1,LINNUM + HRRZM T1,CRFLIN' ;CREF LINE # CHANGES ONLY ON MICRO WORDS +STAT1: PUSHJ P,TOKEN ;SCAN NEXT TOKEN + LSH N,.SZTRM ;MOVE TOKEN TYPE OVER + LDB T1,STAPNT ;GET TERM CHARACTER TYPE + IOR T1,N ;COMBINE STATE, TOKEN TYPE, AND TERM TYPE + IOR T1,STATE + IDIVI T1,36./<.SZDSP+.SZSTA> + LDB T1,STAMTB(T1+1) ;GET DISPATCH AND NEW STATE + DPB T1,[POINT .SZSTA,STATE,35.-.SZTOK-.SZTRM] + LSH T1,-.SZSTA +STAXCT: XCT STDISP(T1) ;DISPATCH TO HANDLE FIELD AND TERM + SKIPN STATE + PUSHJ P,PNTBIN ;BINARY PRINTED IFF PASS2 & STATE=0 & BINARY ASSEMBLED + CAIN C,"; + PUSHJ P,SCNEND ;FLUSH A COMMENT + CAIE C,12 + JRST STATLP ;AND START ALL OVER AGAIN + PUSHJ P,PNTLIN ;FINISH END OF LINE + SKIPN ENDFIL ;END-OF-FILE? + JRST STATLP ;NO + TRON F,PASS2 + JRST START2 ;GO BEGIN PASS 2 + PUSHJ P,FINLST + PUSHJ P,OUTCLS + .CLOSE OUTCHN, + EXIT ;MICRO ASSEMBLY COMPLETELY DONE + +SCND1: PUSHJ P,GETCHR +SCNEND: CAIE C,12 ;SEARCH FOR END OF LINE + JRST SCND1 + POPJ P, + +SUBTTL STATE TABLE DISPATCH + +STDISP: + PUSHJ P,ILLFOR ;FOR ANY UNDEFINED FORMAT + DLBLK: PUSHJ P,LOCBLK + DTAG: PUSHJ P,TAG + DLSET: PUSHJ P,LOCSET ;"NUMBER:" + DCFLD: PUSHJ P,CFSPC ;COND ASSY OR FIELD + DFLD: PUSHJ P,FLDSPC ;FIELD/ + DMDEF: PUSHJ P,DEFMAC + DSUDO: PUSHJ P,PSEUDO + DMAC: PUSHJ P,BEGMAC + DNOP: JFCL + DDEFF: PUSHJ P,DEFFLD + DDEFS: PUSHJ P,DEFSYM + DFSYM: PUSHJ P,FLDSYM + DFNUM: PUSHJ P,FLDNUM + DCMNT: PUSHJ P,SCNEND + +ILLFOR: MSG SCNEND, ILLEGAL FORMAT + +SUBTTL START PASS 2 + +;HERE TO START PASS 2 BY LISTING TABLE OF CONTENTS, IF ANY + +START2: SKIPE N,TTLPNT ;IS THERE A TITLE? + OUTSTR (N) ;YES, SEND TO TTY + OUTSTR [ASCIZ / +/] + SKIPN TOCPNT ;ANYTHING FOR TABLE OF CONTENTS? + JRST TOCEND ;NO + MOVEI C,[ASCIZ /TABLE OF CONTENTS/] + PUSHJ P,SETHDR ;SETUP SPECIAL HEADER + HLRZ N,TOCPNT ;BEGIN SCAN OF TOC LIST +TOCLUP: PUSH P,N ;SAVE ADDR OF THIS ENTRY + PUSHJ P,PRINT + ASCIZ /; / ;OUTPUT AS COMMENT + + MOVE N,0(P) ;PICK UP ENTRY ADDR + HRRZ C,0(N) ;LINE NUMBER OF DEFINITION + PUSHJ P,PNTDEC ;IN DECIMAL + PUSHJ P,TAB + + MOVE N,0(P) ;ENTRY ADDR AGAIN + MOVEI N,1(N) ;POINT TO TEXT + PUSHJ P,PRINT0 ;PRINT IT + PUSHJ P,NEWLIN + + POP P,N ;PICK UP LINK + HLRZ N,0(N) ;GET ADDR OF NEXT ENTRY + JUMPN N,TOCLUP ;PRINT IT IF IT EXISTS + + PUSHJ P,PRINT + ASCIZ \; CROSS REFERENCE INDEX +; DCODE LOCATION / LINE # INDEX +; UCODE LOCATION / LINE # INDEX +\ + SETZM HDRPNT ;TURN OFF SPECIAL HEADERS +TOCEND: PUSHJ P,FORM ;THROW A PAGE + JRST BEGPAS ;AND DO PASS 2 + +SUBTTL PROCESS "FIELD/" AND CONDITIONALS + +;FIELD/ SCANNED. COULD BE CONDITIONAL ASSEMBLY + +CFSPC: IFN FTIF,[ + MOVEI FPNT,PSUDF% ;PSEUDO FIELD TABLE + PUSHJ P,SRCSY1 ;IS IT A DEFINED PSEUDO-FIELD? + JRST CFSPC1 ;NO, TRY FOR NORMAL FIELD + MOVE T1,SYMPSO(SPNT) ;YES, GET HANDLER ADDR + JRST 0(T1) ;GO TO IT + +$DEFLT: MOVEI T1,1 ;SET SWITCH IF NOT DEFINED + JRST SWT +$SET: TDZA T1,T1 ;ERROR IF SWITCH PREVIOUSLY DEFINED +$CHNG: SETO T1, ;ERROR IF SWITCH NOT DEFINED +SWT: MOVEM T1,SWTFLG' + TRNE F,SUPP ;ALREADY SUPPRESSED? + JRST SCNEND ;YES, IGNORE THIS + PUSH P,RAM ;SWITCHES ARE NOT RAM-SPECIFIC + MOVEI RAM,0 + SKIPE FPNT,SWTPNT ;IS THE SWITCH% FIELD DEFINED? + JRST SWT1 ;YES, AVOID SEARCH + MOVE T1,[SWTCH,,FIELD] + BLT T1,FIELD+NWORDS-1 + PUSHJ P,MAKFLD ;CREATE INTIAL SWITCH FIELD + MSG STOP, !!CAN'T DEFINE "SWITCH%"!! + MOVEM FPNT,SWTPNT +SWT1: MOVE T1,[NAME,,FIELD] + BLT T1,FIELD+NWORDS-1 + PUSHJ P,TOKEN ;GO GET SWITCH NAME + CAIE N,.TKS ;IT MUST BE SYMBOLIC + MSG SWT99, NO SYMBOL IN CONDITIONAL ASSEMBLY DEFINITION + PUSHJ P,SRCSYM ;GO LOOK FOR SYMBOL + JRST SWT2 ;NOT FOUND + SKIPLE SWTFLG ;FOUND. IS THIS A DEFAULT? + JRST SWT99 ;YES -- DEFAULT HAS BEEN PREVIOUSLY SET + TRNN F,PASS2 ;IS IT PASS1? + SKIPE SWTFLG ; AND A SET? + JRST SWT3 ;NO, GO CHANGE VALUE + MSG SWT3, SWITCH SET TWICE +SWT2: SKIPGE SWTFLG ;IS THIS A CHANGE? + MSG .+1, SWITCH CHANGED WITHOUT SET OR DEFAULT + PUSHJ P,MAKS1 ;FILL IN SYMBOL ENTRY + JRST SWT99 ;CAN'T CREATE IT +SWT3: CAIE C,"= ;DID SWITCH NAME TERMINATE WITH EQUAL? + MSG SWT99, FORMAT ERROR ON SWITCH SPECIFICATION + PUSHJ P,TOKEN ;GO GET SWITCH VALUE + CAIE N,.TKN + MSG SWT99, SWITCH VALUE MUST BE NUMERIC + MOVE N,NUMBER ;GET SWITCH VALUE + DPB N,DEFVAL ;PUT INTO VALUE OF SYMBOL +SWT99: POP P,RAM ;RESTORE CURRENT RAM + SETZM STATE + SETZM FIELD + JRST SCNEND ;IGNORE REST OF LINE + +;HERE FOR CONDITIONAL ASSEMBLY TEST PSEUDO-OPS + +$ENDIF: MOVEI T1,1 + JRST AIF1 +$IF: TDZA T1,T1 +$IFNOT: MOVNI T1,1 +AIF1: MOVEM T1,SWTFLG ;FLAG TO INVERT ASSEMBLY SENSE + PUSHJ P,TOKEN + CAIE N,.TKS ;SWITCH MUST BE SYMBOLIC + MSG SCNEND, SWITCH MUST BE SYMBOLIC + SKIPE FPNT,SWTPNT + PUSHJ P,SRCSYM ;GO LOOK FOR SWITCH SYMBOL + MSG SCNEND, SWITCH NOT DEFINED + TRNN F,SUPP ;CURRENTLY SUPPRESSED? + JRST IF3 ;NO + CAME SPNT,SUPSYM ;IS THIS THE SYMBOL WHICH SUPPRESSED? + JRST SCNEND ;NO, IGNORE +IF3: MOVEM SPNT,SUPSYM ;SAVE SUPPRESSION SYMBOL + LDB T1,DEFVAL ;GET SWITCH VALUE + SKIPG SWTFLG ;VALUE IRRELEVANT ON ENDIF + SKIPE T1 ;SWITCH SET? + TRZA F,SUPP + TRO F,SUPP ;SUPPRESS ASSY + SKIPGE SWTFLG ;INVERT SENSE? + TRC F,SUPP + MOVEI T1,0 + TRNE F,SUPP ;NOW...ARE WE SUPPRESSED? + MOVEI T1,4_<.SZTOK+.SZTRM> + MOVEM T1,STATE ;STATE 0 IF ASSEMBLING, 4 IF SUPPRESSED + JRST SCNEND + +CFSPC1: TRNE F,SUPP ;IN SUPPRESSED ASSEMBLY? + JRST SCNEND ;YES, AND NOT END OF COND. COMMENT +];END IFN FTIF +FLDSPC: MOVE T1,[NAME,,FIELD] + BLT T1,FIELD+NWORDS-1 ;MOVE NAME TO FIELD + POPJ P, + +;FIELD/NUMBER SCANNED, INSERT VALUE INTO MICRO WORD + +FLDNUM: +IFE FTBB,[ + TRNN F,PASS2 + JRST FLDS99 +] + PUSHJ P,SRCFLD + JRST FLDS1 + LDB T2,DEFSIZ ;GET SIZE OF FIELD + SETOM T1 ;1S INTO T1 + LSH T1,(T2) ;0S ON RIGHT EQUAL TO BYTE LENGTH + MOVE N,NUMBER + MOVM T2,N ;SAVE POS VAL OF NUMBER + TDZ N,T1 ;MASK NUMBER TO CORRECT SIZE + TDNE T2,T1 ;WILL NUMBER FIT IN FIELD? + MSG FLDN2, NUMBER TOO BIG FOR FIELD + PUSHJ P,BITS1 ;NUMBER ALWAYS GOES INTO FIELD +FLDN2: PUSHJ P,MAKCRF ;PUT FIELD INTO CREF LISTING + JRST FLDS99 + +;FIELD/SYMBOL SCANNED, INSERT VALUE INTO MICRO WORD + +FLDSYM: +IFE FTBB,[ + TRNN F,PASS2 + JRST FLDS99 +] + PUSHJ P,SRCFLD +FLDS1: MSG FLDS99, FIELD NOT DEFINED + PUSHJ P,SRCSYM + TRCA RAM,DISP\UCODE ;NOT FOUND, LOOK IN OTHER TABLE + JRST FLDS3 ;FOUND + PUSH P,FPNT ;SAVE FIELD POINTER + PUSHJ P,SRCFLD ;FIND OTHER FIELD, IF ANY + JRST FLDLUZ ;NONE + PUSHJ P,SRCSYM + JRST FLDLUZ ;NO SYMBOL IN OTHER FIELD EITHER + POP P,FPNT ;GET CORRECT FIELD BACK + TRC RAM,DISP\UCODE ;PUT MODE BACK +FLDS3: LDB T1,DEFTM1 ;GET 1ST TIME + ADDM T1,TIME1 ;ACCUMULATE SUM + LDB T1,DEFTM2 ;SAME FOR 2ND TIME + ADDM T1,TIME2 + LDB T1,DEFFNC + MOVE T1,DEFTAB(T1) + PUSHJ P,(T1) ;DISPATCH ON FUNCTION +FLDS99: TRO F,BINF +ZFPOPJ: SETZM FIELD ;NO CARRY OVER OF FIELD NAMES + POPJ P, + +FLDLUZ: POP P,FPNT ;ADJUST STACK + TRC RAM,DISP\UCODE ;PUT MODE BACK +IFN FTBB,[ + TRNN F,PASS2 + JRST FLDS99 +] + MSG FLDS99, SYMBOL NOT DEFINED + +SUBTTL PSEUDO INSTRUCTIONS (INCL MACROS) + +PSEUDO: MOVEI FPNT,PSUDO% ;PSEUDO SYMBOL TABLE + PUSHJ P,SRCSY1 ;IS IT A DEFINED PSEUDO OP? + JRST BEGMAC ;NO, SEE IF IT'S A MACRO + MOVE T1,SYMPSO(SPNT) ;YES, GET HANDLER ADDR + JRST 0(T1) ;GO TO IT + +$DCODE: MOVEI RAM,DISP + POPJ P, + +$UCODE: MOVEI RAM,UCODE + POPJ P, + +$SEQAD: SETOM SEQADR + POPJ P, + +; MACRO CALL SCANNED +;COMMENTED LINES BUMMED OUT FOR SPEED + +BEGMAC: ;OUGHT TO SUPPRESS ON PASS1, CAN'T DUE TO + ;STATE PROCESSING TROUBLES +; MOVE T1,[MACRO,,FIELD] ;LOOK FOR MACRO DEF +; BLT T1,FIELD+NWORDS-1 +; PUSHJ P,SRCFLD +; MSG ZFPOPJ, NO MACROS DEFINED + SETZM FIELD + SKIPE FPNT,MACPNT(RAM) ;AVOID FIELD SEARCH + PUSHJ P,SRCSYM ;LOOK FOR DEFINITION + MSG MACLUZ, MACRO NAME NOT DEFINED + MOVSI N,(POINT 7,0) + HRR N,SYMMAC(SPNT) ;GET POINTER TO MACRO + PUSHJ P,SAVE + MOVEI C,", ;MACRO MUST NOT INVOKE END-OF-LINE ACTIONS + JRST ZFPOPJ + +MACLUZ: LDB T1,STAPNT ;GET CHAR TYPE + CAIN T1,EOL ;END OF LINE? + SETZM STATE ;YES, RETURN TO STATE ZERO + JRST ZFPOPJ + +SUBTTL "SYMBOL:" DEFINE ADDRESS TAG + +TAG: MOVE T1,[ASCII /J/] + MOVEM T1,FIELD + SETZM FIELD+1 + MOVE T1,[FIELD+1,,FIELD+2] + BLT T1,FIELD+NWORDS-1 + SKIPE FPNT,JPNT(RAM) ;DO WE KNOW WHERE J FIELD IS DEFINED? + JRST TAG2 ;YES, DO NOT SEARCH + PUSHJ P,SRCFLD + MSG ZFPOPJ, CAN'T FIND J FIELD + MOVEM FPNT,JPNT(RAM) ;REMEMBER FOR FUTURE +TAG2: PUSHJ P,MAKSYM + JFCL +IFN FTBB,[ + MOVE T1,JEQL ;ADDR OF LIST OF EQUAL TAGS + MOVEM SPNT,JEQL + HRRM T1,SYMEQL(SPNT) ;ADD THIS TO LIST + TRNE F,PASS2 + JRST ZFPOPJ +] + HRRZ N,PC(RAM) + PUSHJ P,DEFCHK + HALT DEFVAL + PUSHJ P,DEFSLS + JRST ZFPOPJ + +;SET LOCATION COUNTER FOR LEADING BIT PATTERN + +LOCBLK: SETZB N,BLDPAT' ;INIT COUNT, INIT PATTERN FOR 1'S + SETZM BLDAST' ;INIT PATTERN FOR *'S +LOCB1: PUSHJ P,GETCHR + CAIN C,40 + JRST LOCB1 + CAIN C,"0 + SOJA N,LOCB1 ;COUNT DIGITS + MOVSI T1,(SETZ) ;GET BIT INTO POSITION FOR PATTERNS + LSH T1,(N) + CAIN C,"1 + JRST [ IORM T1,BLDPAT + SOJA N,LOCB1 ] + CAIN C,"* + JRST [ IORM T1,BLDAST + SOJA N,LOCB1 ] + MOVNS N ;GET POSITIVE POSITION COUNT + CAIE C,12 + TRO F,REREAD ;ONLY BACK UP IF NOT END-OF-LINE +LOCB2: MOVEI T1,1 ;FIND HOW MANY CONSECUTIVE WORDS + LSH T1,(N) ;WORDS=2**NUMBER OF BITS + MOVE T2,BLDPAT ;GET BIT PATTERN + ROT T2,(N) ;MOVE TO LOW ORDER + MOVEM T2,BLDPAT + MOVE T4,BLDAST ;GET * PATTERN + ROT T4,(N) + MOVEM T4,BLDAST + JUMPN RAM,[MOVE N,PC(RAM) ;GET CURRENT PC + ANDI N,-1(T1) ;MASK PC TO RELEVANT BITS + SUB T2,N ;HOW FAR OFF? + JUMPE T2,CPOPJ ;XFER IF RIGHT ON + SKIPGE T2 + ADD T2,T1 ;GET POS VAL, MOD BLOCK SIZE + ADD N,T2 ;ADJUST PC + JRST LOCB8 + ; MSG LOCB8, DISP LOCATION CHECK FAILED + ] + JUMPE N,PCNXT1 ;IF 0, FIND FIRST FREE WORD + SKIPGE N,PC(RAM) ;GET CURRENT PC + CAMLE T1,FRECNT ;IS NEW BLOCK LARGER? + JRST LOCB6 ;YES, OR PC NOT RESTRICTED + + MOVEI T3,-1(T1) ;GET 1S FOR BITS SPECIFIED + ANDCM T3,BLDAST ;CLEAR * POSITIONS + TDNE T3,LOCAST ;CHECK FOR 1S OR 0S WHERE *S GIVEN IN MASTER + JRST LOCB5 ;YES, PATTERN IS ILLEGAL + +LOCB4: MOVE T3,N + ANDCM T3,BLDAST ;CLEAR DON'T-CARE BITS + ANDI T3,-1(T1) ;MASK PC TO NEW BLOCK SIZE + CAMN T3,BLDPAT ;DOES PC MATCH NEW PATTERN? + JRST LOCB8 ;YES, USE IT + MOVE T3,N ;GET PC AGAIN + AND T3,LOCAST ;SAVE STATE OF * BITS + IOR N,LOCAST ;THEN FORCE THEM TO CARRY + AOBJP N,.+1 ;PICK NEXT PC IN BLOCK + IOR N,LOCPAT ;RESET BIT CARRIED OUT OF + ANDCM N,LOCAST ;CLEAR OUT DON'T CARE BITS + IOR N,T3 ;SET ANY WHICH WERE SET BEFORE + JUMPL N,LOCB4 ;LOOP IF ANY MORE IN THIS BLOCK +LOCB5: MOVEM T1,FRECNT ;SAVE NEW PARAMETERS + MOVEM T2,LOCPAT + MOVEM T4,LOCAST + MSG LOCB7, NO SUCH MICRO WORD ADR PATTERN IN CURRENT BLOCK + +LOCB6: MOVEM T1,FRECNT ;STORE NEW BLOCK SIZE AWAY + MOVEM T2,LOCPAT ; ALSO BIT PATTERN + MOVEM T4,LOCAST ; AND * PATTERN +LOCB7: PUSHJ P,FREWRD ;DOESN'T FIT + MSG LOCB99, NO SUCH REQUIRED MICRO WORD ADDRESS PATTERN +LOCB8: MOVEM N,PC(RAM) ;SET UP FIRST WORD ADDRESS +LOCB99: POPJ P, + +; NUMBER: SET LOCATION COUNTER + +LOCSET: SKIPGE N,NUMBER + MSG LOCS99, LOCATION NEGATIVE + CAMLE N,[MAXPC ? MAXDSP](RAM) + MSG LOCS99, LOCATION TOO LARGE + HRROM N,PC(RAM) ;STORE AWAY NEW PC VALUE + JUMPN RAM,LOCS99 + SETZM FRECNT ;END ANY LOCATION DEFAULTING + SETZM LOCPAT + SETZM LOCAST +LOCS99: SETZM FIELD + POPJ P, + +SUBTTL "FIELD/=" + +;FIELD/= HAS BEEN SCANNED. SO, A MICRO FIELD DEFINITION IS IN PROGRESS. + +DEFSYM: PUSHJ P,SRCFLD ;FIND THE FIELD + MSG SCNEND, UNDEFINED FIELD IN SYMBOL DEFINITION + PUSHJ P,MAKSYM ;GO MAKE THE SYMBOL + JFCL ;DO CONSISTENCY CHECK + PUSHJ P,TOKEN + CAIE N,.TKN ;SKIP IF TOKEN NUMERIC + MSG DEFS99, VALUE REQUIRED IN SYMBOL DEFINITION + MOVE N,NUMBER + PUSHJ P,DEFCHK + HALT DEFVAL + PUSHJ P,DEFSLS + CAIE C,", + JRST SCNEND + PUSHJ P,TOKN10 + MOVE N,NUMBER + PUSHJ P,DEFCHK + HALT DEFTM1 ;FIRST TIME VALUE + CAIE C,", + JRST SCNEND + PUSHJ P,TOKN10 + MOVE N,NUMBER + PUSHJ P,DEFCHK + HALT DEFTM2 ;SECOND TIME VALUE +DEFS99: JRST SCNEND + + + + +SUBTTL DEFINE A FIELD + +DEFFLD: PUSHJ P,MAKFLD + JRST SCNEND + PUSHJ P,GETARG ;SCANNED FIELD/=, GET ARGS + MSG CPOPJ, VALUE REQUIRED FOR FIELD DEFINITION + MSG CPOPJ, SIZE REQUIRED FOR FIELD DEFINITION + MSG CPOPJ, POSITION REQUIRED FOR FIELD DEFINITION + JRST CPOPJ + PUSHJ P,DEFSLF + JRST SCNEND + +DEFSLF: +DEFSLS: LDB T1,DEFPOS + CAILE T1,MICMXB + MSG .+1, POSITION TOO LARGE FOR MICRO WORD + LDB T2,DEFSIZ + ADDI T1,1 + CAMGE T1,T2 + MSG .+1, SIZE TOO LARGE FOR POSITION + LDB T1,DEFVAL + MOVEI N,1 + LSH N,(T2) + CAMG N,T1 + MSG .+1, VALUE TOO LARGE FOR FIELD + POPJ P, + +SUBTTL DEFINE A MACRO + +DEFMAC: MOVEI FPNT,PSUDM% ;FIRST CHECK FOR PSEUDO-MACRO + PUSHJ P,SRCSY1 ;IS IT ONE OF THOSE NAMES? + JRST DEFM0 ;NO, DEFINE A REAL MACRO + HRRZ T1,SYMPSO(SPNT) ;YES, GET ADDR OF HANDLER + JRST 0(T1) + +$TITLE: TRNE F,PASS2 + JRST SCNEND ;TREAT AS COMMENT ON PASS 2 + SKIPE TTLPNT ;DO WE ALREADY HAVE A TITLE + MSG SCNEND, TITLE MULTIPLY DEFINED + MOVEI N,1 + PUSHJ P,GETWRD + HRRZM N,TTLPNT ;SAVE ADDRESS INTO WHICH IT IS STORED + JRST DEFM2 ;GO COLLECT IT + +$TOC: TRNE F,PASS2 ;ENTIRELY DIFFERENT FUNCTION ON PASS2 + JRST TOC2 + MOVEI N,2 ;LINK WORD + ONE FOR STRING + PUSHJ P,GETWRD + SKIPN T1,TOCPNT ;TOC INITIALIZED? + MOVEI T1,TOCPNT ;NO, POINT TO IT + HRLM N,0(T1) ;LINK THIS ONE TO LAST ON LIST + HRRM N,TOCPNT ;AND NOTE THIS IS NOW LAST + + MOVE T1,LINNUM + HRRZM T1,0(N) ;STUFF LINE # INTO ENTRY + AOJA N,DEFM2 ;NOW COLLECT THE STRING + +TOC2: HLRZ N,TOCPNT ;TRY TO FIND THIS ON LIST +TOC3: HRRZ T1,0(N) ;GET LINE # OF DEFINITION + CAMLE T1,LINNUM ;IS IT OLD FOR THIS LINE? + MSG STOP, !!TOC LST FOULED UP !! + CAMN T1,LINNUM ;IS THIS WHERE WE DEFINED IT? + JRST SCNEND ;YES, IT WILL PRINT AS SUBTTL + HLRZ N,0(N) ;NO, LOOK AT NEXT + HRLM N,TOCPNT + JRST TOC3 + ;DEFINE A MACRO + +DEFM0: SKIPE FPNT,MACPNT(RAM) ;IS THE "MACRO%" FIELD DEFINED? + JRST DEFM1 ;YES, AVOID SEARCH + MOVE T1,[MACRO,,FIELD] ;FORCE FIELD NAME + BLT T1,FIELD+NWORDS-1 + PUSHJ P,MAKFLD ;MAKE INITIAL FIELD FOR MACROS + MSG STOP, !!CAN'T DEFINE "MACRO%"!! + SETZM FIELD + MOVEM FPNT,MACPNT(RAM) ;REMEMBER FOR FUTURE +DEFM1: PUSHJ P,MAKSYM + JRST SCNEND + MOVEI N,1 + PUSHJ P,GETWRD ;GET 1 WORD OF SPACE + HRRM N,SYMMAC(SPNT) ; AND SAVE AS 1ST WORD OF MACRO +DEFM2: PUSHJ P,COPMAC ;COPY TEXT INTO SYMBOL TABLE + JRST SCNEND + +;SUBR TO COPY QUOTED TEXT INTO SYMBOL TABLE + +COPMAC: HRLI N,(POINT 7,) ;MAKE ADDR OF SPACE INTO BYTE POINTER + PUSH P,N ;CREATE TEMP FOR IT +CMAC1: PUSHJ P,GETCHR + CAIN C,12 ;EOL? + MSG CMAC99, MISSING TERMINAL QUOTE + CAIN C,42 ;TERMINAL QUOTE? + MOVEI C,0 ;YES, TERMINATE WITH IT + + MOVE T1,0(P) ;PICK UP POINTER + TLNN T1,760000 ;AT END OF WORD? + JRST CMAC2 ;NO + MOVEI N,1 ;YES, GET ANOTHER + PUSHJ P,GETWRD + +CMAC2: IDPB C,0(P) ;STORE THIS CHAR + JUMPN C,CMAC1 ; COLLECT ASCIZ STRING + +CMAC99: POP P,N ;RESTORE STACK + POPJ P, + +SUBTTL GETARG + +;SEARCH ARGUMENT LIST AND RE-CALL CALLING ROUTINE +;FOR MISSING ARGS +;CALLING SEQUENCE: +; PUSHJ P,GETARG +; ;GETARG PUSHJ'S TO HERE IF 1ST ARG IS MISSING +; ;TO HERE IF 2ND ARG IS MISSING +; ;3RD ARG +; ;4TH ARG +; FINAL RETURN + +GETARG: PUSHJ P,TOKEN ;GET 1ST ARG + CAIE N,.TKN + PUSHJ P,@(P) ;1ST ARG MISSING, CALL CALL SITE+1 + MOVE N,NUMBER + PUSHJ P,DEFCHK ;CHECK THAT VALUE FITS FIELD + HALT DEFVAL + AOS (P) ;1ST ARG SCAN COMPLETED + + CAIN C,", ;POSSIBLE 2ND ARG? + PUSHJ P,TOKN10 ;YES, GO SCAN + CAIE N,.TKN + PUSHJ P,@(P) ;NO POSSIBLE ARG, OR WASN'T THERE + MOVE N,NUMBER + PUSHJ P,DEFCHK + HALT DEFSIZ + AOS (P) ;2ND ARG SCAN COMPLETED + + CAIN C,", + PUSHJ P,TOKN10 + CAIE N,.TKN + PUSHJ P,@(P) + MOVE N,NUMBER + PUSHJ P,DEFCHK + HALT DEFPOS + CAML N,MAXPOS(RAM) + MOVEM N,MAXPOS(RAM) ;KEEP TRACK OF MICRO WORD SIZE + AOS (P) ;3RD ARG SCAN COMPLETED + + CAIE C,", + JRST GETA4 +GETA2: PUSHJ P,GETCHR ;4TH ARG IS SINGLE CHAR + CAIN C,40 + JRST GETA2 ; BUT FLUSH SPACES + MOVSI N,DEFTAB-DEFTND +GETA3: HLRZ T1,DEFTAB(N) ;SEARCH TABLE FOR CHARACTER + CAMN T1,C + JRST GETA5 + AOBJN N,GETA3 + MSG .+1, UNDEFINED SPECIAL FUNCTION CHARACTER +GETA4: PUSHJ P,@(P) + JRST GETA6 +GETA5: HRRZS N + PUSHJ P,DEFCHK + HALT DEFFNC +GETA6: JRST CPOPJ1 + +SUBTTL VALUE INSERTION + +;CHECK TO SEE THAT VALUE FITS IN THE BYTE FIELD ALLOWED +;AND THEN STUFF IT THERE + +DEFCHK: LDB T1,DEFFLG ;FIRST CHECK FOR MULTIPLE DEFINITION + TRNE T1,MULF ;IF SET, WE'VE ALREADY OBJECTED + JRST CPOPJ1 ;CAN'T EXPECT THAT TO BE CONSISTENT + HRRZ T1,@(P) + TRNN F,PASS2 + JRST DEFC2 + LDB N1,(T1) ;GET PASS1 DEFINITION + CAME N,N1 + MSG STOP, PASS1 AND PASS2 DEFINITIONS DIFFER + JRST CPOPJ1 +DEFC2: DPB N,(T1) + LDB N1,(T1) + CAME N,N1 + MSG .+1, NUMBER TOO BIG FOR FIELD + JRST CPOPJ1 + +TIMSET: MOVE N,TIME1 ;DEFAULT TIME INSERTION + CAMGE N,TIME2 ;GET MAX + MOVE N,TIME2 + LDB T2,DEFVAL ;GET DEFAULT MINIMUM TIME + CAMGE N,T2 + MOVE N,T2 ;DEFAULT TIME .GT. MAX(T1,T2) + JRST BITS1 + +PCINC: HRRZ N,PC(RAM) ;DEFAULT PC INSERTION + SKIPN N,PCTABL(N) ;GET DEFAULT PC + MSG CPOPJ, NO DEFAULT PC AVAILABLE + TLZA N,-1 ;MASK TO 18 BITS + +BITSET: LDB N,DEFVAL ;VALUE INSERTION INTO MICRO FIELD +BITS1: PUSH P,N ;SAVE VALUE + PUSHJ P,FLDTST ;FIELD ALREADY LOADED? + JRST BITS3 ;NO + MOVE T1,0(P) ;YES...CHECK FOR CONFLICTING OVERLAP + MOVEI T2,0 + LSHC T1,(N1) + SKIPE N + XOR T1,VALUE-1(N) + XOR T2,VALUE(N) ;GET DIFFERENCE FROM PREVIOUS VALUES + SKIPE N + AND T1,VALSET-1(N) + AND T2,VALSET(N) ;LIMIT DIFF TO FIELDS ALREADY SET + TDNN T1,T3 + TDNE T2,T4 ;ANY SUCH DIFFERENCES IN THIS FIELD? + MSG NPOPJ, MICRO FIELD SET WITH CONFLICTING VALUES + ;NO, SET THIS VALUE INTO MICROWORD +BITS3: POP P,T1 + MOVEI T2,0 + LSHC T1,(N1) ;PUSH VALUE INTO PLACE + SETCA T3, ;MAKE UNUSED FIELDS BE 1S + SETCA T4, + TDNN T1,T3 ;IF VALUE EXTENDS OUTSIDE FIELD, + TDNE T2,T4 ; THEN THERE IS AN ERROR + MSG CPOPJ, VALUE TOO LARGE FOR FIELD + SKIPE N + IORM T1,VALUE-1(N) + IORM T2,VALUE(N) + SKIPE N + ORCAM T3,VALSET-1(N) ;MARK MICRO WORD FIELD AS USED + ORCAM T4,VALSET(N) + POPJ P, + +;SKIP IF SOME FIELDS MATCH THIS ONE +;NO SKIP IF FIELD VIRGIN +;ON RETURN, LEAVE MASK FOR THIS FIELD IN T3,T4 +;LEAVE SHIFT POSITION AND TABLE INDEX IN N1,N +FLDTST: MOVEI T3,0 + MOVNI T4,1 + LDB T1,DEFSIZ + LSHC T3,(T1) + MOVEI T4,0 + LDB N,DEFPOS + ADDI N,1 + IDIVI N,36. + MOVNS N1 + LSHC T3,(N1) + SKIPE N + TDNN T3,VALSET-1(N) + TDNE T4,VALSET(N) + AOS (P) + POPJ P, + +;CODE TO SEARCH FIELD DEFINITION LIST AND INSERT DEFAULTS +DEFALT: MOVEI FPNT,FLDPNT ;START OF LIST +DFLT2: HRRZ FPNT,SYMLNK(FPNT) + JUMPE FPNT,CPOPJ ;STOP AT END OF LIST + MOVE SPNT,FPNT + LDB T1,DEFTYP ;GET "UCODE" OR "DISP" TYPE + CAME T1,RAM ;MATCH CURRENT MODE? + JRST DFLT4 ;NO + PUSHJ P,FLDTST ;IS FIELD VIRGIN? + SKIPA ;YES + JRST DFLT4 ;NO + LDB T1,DEFFNC + JUMPE T1,DFLT4 ;0 FUNCTION MEANS NO DEFAULT + MOVE T1,DEFTAB(T1) + PUSHJ P,(T1) ;DISPATCH ON FUNCTION +DFLT4: JRST DFLT2 + +PARITY: POP P,T1 ;GET RETURN ADR + PUSH P,FPNT ; SAVE FPNT TO PARITY FIELD + PUSHJ P,(T1) ; AND MAKE "CALLER" BE "CALLEE" + POP P,FPNT ;SET UP PARITY FIELD POINTERS + MOVE SPNT,FPNT + MOVEI T1,0 ;INIT PARITY + MOVSI T2,-MICMXW ;COUNT THRU ALL OF MICRO WORD + XOR T1,VALUE(T2) ;COMPUTE TABLE PARITY + AOBJN T2,.-1 + TSC T1,T1 ;REDUCE TO 18 BITS + MOVEI N,0 +PARLUP: JUMPN T1,[ANDI T1,-1(T1) ;REMOVE 1 BIT + AOJA N,PARLUP ] + TRNE N,1 ;IF PARITY ALREADY ODD, + POPJ P, ; THEN OK AS IS + MOVEI N,1 ;GET A PARITY BIT + LDB T2,DEFSIZ ;GET PARITY FIELD SIZE + JUMPN T2,BITS1 ;PUT PARITY BIT INTO FIELD + MOVSI T1,-MICMXW ;MINUS TABLE LENGTH OF MICRO WORD +PAR3: SETCM T2,VALSET(T1) ;GET BIT USAGE + JFFO T2,[MOVSI N,(SETZ) ;BIT TO SHIFT + MOVNS T3 ;GET RIGHT SHIFT COUNT + LSH N,(T3) ; AND SHIFT PARITY BIT TO FREE PLACE + IORM N,VALUE(T1) + IORM N,VALSET(T1) + JRST PAR5 ] + AOBJN T1,PAR3 ;CONTINUE LOOKING FOR PLACE FOR BIT +PAR5: HLRES T1 ;GET # WORDS REMAINING + ADDI T1,MICMXW ;GET WHICH WORD HAD FREE BIT + IMULI T1,36. + SUB T1,T3 ;CONVERT TO BIT NUMBER + CAMLE T1,MAXPOS(RAM) ;WAS THERE ROOM FOR PARITY BIT? + MSG .+1, NO ROOM FOR PARITY BIT + POPJ P, + +SUBTTL SYMBOL TABLE ROUTINES + +;SUBROUTINE TO FIND A FIELD OR MAKE ONE IF IT DOESN'T EXIST. +; NO SKIP IF IT ALREADY EXISTS. SKIP IF NEWLY MADE. +; RETURNS POINTER TO FIELD BLOCK IN SPNT AND FPNT. + +MAKFLD: PUSHJ P,SRCFLD + JRST MAKF1 ;NOT FOUND + TRNN F,PASS2 ;ONLY ONCE PER PASS, PLEASE + JRST MULFLD + PUSHJ P,BEGCRF ;PUT DEFINITION IN THE CREF + LDB T1,DEFFLG ;CHECK FOR MULTIPLY DEFINED + TRNE T1,MULF + MSG CPOPJ, MULTIPLY DEFINED FIELD + POPJ P, ;AND RETURN FOUND + +MAKF1: SKIPN FIELD + MSG CPOPJ, CAN'T DEFINE A NULL FIELD + TRNE F,PASS2 ;BETTER BE PASS 1 + MSG STOP, !!FIELD UNDEFINED ON PASS 2!! + PUSH P,N + PUSHJ P,GETROM + MOVE FPNT,N ;SAVE POINTER TO NEW FIELD + MOVE SPNT,N + POP P,N1 ;GET POINTER TO PREVIOUS FIELD + HRRZ N,SYMLNK(N1) ;GET POINTER FROM PREVIOUS FIELD + HRRZM N,SYMLNK(FPNT) ;AND CONTINUE FROM NEW FIELD + HRRM FPNT,SYMLNK(N1) ;LINK LIST STRUCTURE + MOVSI T1,FIELD + HRRI T1,SYMTXT(FPNT) + BLT T1,SYMTXT+NWORDS-1(FPNT) ;COPY NAME TEXT INTO DEFINITION + SETZM SYMVAL(FPNT) ;ZERO DEFINITION WORD + DPB RAM,DEFTYP + SETZM SYMCRF(SPNT) ;INIT CREF LIST STRUCTURE + JRST CPOPJ1 + +MULSYM: +MULFLD: LDB T1,DEFFLG ;PICK UP FLAGS + IORI T1,MULF ;NOTE MULTIPLE DEFINITION + DPB T1,DEFFLG + MSG CPOPJ, MULTIPLE DEFINITION + +;SUBROUTINE TO MAKE A SYMBOL DEFINITION (IF ONE DOESN' EXIST) +;SIMILAR TO MAKFLD ABOVE +; CALLED WITH POINTER TO FIELD IN FPNT +; SKIPS IF NEWLY MADE. RETURNS POINTER IN SPNT. +; NO SKIP IF ALREADY DEFINED. +; POINTER IN SPNT TO PRESENT DEFINITION. + +MAKSYM: PUSHJ P,SRCSY1 ;LOOK FOR SYMBOL, BUT DON'T CREF YET + JRST MAKS1 ;NOT FOUND + TRNN F,PASS2 ;DISALLOW MULTIPLE DEFINITION + JRST MULSYM + PUSHJ P,BEGCRF ;NOTE DEFINITION IN CREF + LDB T1,DEFFLG ;LOOK AT FLAGS + TRNE T1,MULF ;IS THIS MULTIPLY DEFINED? + MSG CPOPJ, MULTIPLY DEFINED SYMBOL + POPJ P, + +MAKS1: SKIPN NAME ;NO DEFINED YET + MSG CPOPJ, CAN'T DEFINE NULL SYMBOL + TRNE F,PASS2 + MSG STOP, !!SYMBOL UNDEFINED ON PASS2!! + PUSH P,N + PUSHJ P,GETROM + HRRZM N,SPNT + POP P,N1 + HLRZ N,SYMLNK(N1) + HRLZM N,SYMLNK(SPNT) ;LINK TO NEXT SYMBOL + HRLM SPNT,SYMLNK(N1) + MOVSI T1,NAME + HRRI T1,SYMTXT(SPNT) + BLT T1,SYMTXT+NWORDS-1(SPNT) + SETZM SYMVAL(SPNT) + DPB RAM,DEFTYP + SETZM SYMCRF(SPNT) ;INIT CREF LIST STRUCTURE + JRST CPOPJ1 + +SRCFLD: MOVEI N,FLDPNT +SRCF2: MOVEI N1,(N) ;SAVE POINTER TO LAST LOWER FIELD + HRRZ N,SYMLNK(N) + JUMPE N,SRCX ;QUIT IF END OF LIST +REPEAT NWORDS,[ + MOVE T1,FIELD+.RPCNT + CAMLE T1,.RPCNT+SYMTXT(N) + JRST SRCF2 + CAME T1,.RPCNT+SYMTXT(N) + JRST SRCX ;NO MATCH, RETURN PTR TO SMALLER FLD +] + HRRZ FPNT,N + HRRZ SPNT,N + LDB T1,DEFTYP + CAIE T1,(RAM) ;DOES FIELD TYPE MATCH CURRENT MODE? + JRST SRCF2 ;NO, LOOK SOME MORE + JRST CPOPJ1 ;YES, SKIP RETURN + +SRCX: MOVEI N,(N1) ;GET POINTER TO SMALLER FIELD + POPJ P, ;RETURN NO MATCH + +SRCSYM: PUSHJ P,SRCSY1 ;LOOK FOR SYMBOL + POPJ P, ;WASN'T THERE + PUSHJ P,MAKCRF ;WAS, CREF THE REFERENCE + JRST CPOPJ1 + +SRCSY1: MOVEI N,(FPNT) +SRCS2: MOVEI N1,(N) + HLRZ N,SYMLNK(N) + JUMPE N,SRCX ;END OF LIST, RETURN NO MATCH +REPEAT NWORDS,[ + MOVE T1,NAME+.RPCNT + CAMLE T1,.RPCNT+SYMTXT(N) + JRST SRCS2 ;TRY NEXT ENTRY, THIS IS TOO SMALL + CAME T1,.RPCNT+SYMTXT(N) + JRST SRCX ;NO CAN FIND +] + MOVEI SPNT,(N) ;THIS IS THE SYMBOL + JRST CPOPJ1 + +MAKCRF: TRNN F,PASS2 + POPJ P, ;BUILD CREF ON PASS2 + TDZA N1,N1 ;CLEAR DEFINE FLAG +BEGCRF: MOVEI N1,400000 ;FLAG AS DEFINITION + MOVEI N,1 ;GET 1 WORD FOR CREF REFERENCE + PUSHJ P,GETWRD + HLRZ T1,SYMCRF(SPNT) ;GET LAST ADR IN LIST + HRLM N,SYMCRF(SPNT) ;MAKE NEW WORD LAST ADR + SKIPN T1 ;IF OLD LAST ADR IS ZERO, THEN + MOVEI T1,SYMCRF(SPNT) ; LAST ADR IS IN SYMBOL BLOCK + HRRM N,(T1) ;PUT THIS WORD ONTO END OF LIST +IFN FTCOIN, HRRZ T1,CRFLIN ;GET LINE # AT WHICH THIS WORD STARTED +IFE FTCOIN, HRRZ T1,LINNUM ;GET CURRENT LINE NUMBER + IOR T1,N1 ;PUT DEFINE FLAG, IF ANY, IN + HRLZM T1,(N) ; STUFF INTO WORD NOW ON LIST END + ; AND MAKE POINTER TO NEXT BE 0 + POPJ P, + +GETROM: MOVEI N,SYMLEN ;GET ROOM FOR NEW SYM TABLE ENTRY +GETWRD: PUSH P,.JBFF + ADDB N,.JBFF + CAMGE N,.JBREL + JRST GETW2 + LSH N,-10. + .CALL [ SETZ ;GET FRESH PAGE + 'CORBLK + MOVEI %CBRED+%CBWRT+%CBNDW+%CBNDR + MOVEI -1 + MOVEI (N) + SETZI 400001 ] + .VALUE + MOVEI N,2000 + ADDM N,.JBREL +GETW2: +NPOPJ: POP P,N + POPJ P, + +SUBTTL LEXICAL ANALYZER + +;SUBROUTINE TO BUILD A SYMBOLIC OR NUMERIC TOKEN +; ENTRY TOKEN - BUILD SYMBOL, OCTAL NUMBER, OR DECIMAL NUMBER +; ENTRY TOKN10 - BUILD SYMBOL, OR DECIMAL NUMBER +;OCTAL NUMBERS ARE OF FORM <+,-, > +; AN 8 OR 9 OR A DECIMAL POINT MAKES NUMBER DECIMAL +;DECIMAL NUMBERS ARE OF FORM <+,-, > +; AN 8 OR 9 OR A FINAL DECIMAL POINT IS REQUIRED +;A SYMBOL IS ANYTHING THAT IS NOT A LEGAL NUMBER +; RETURN .TKB - BLANK TOKEN +; RETURN .TKN - SIGNED NUMERIC TOKEN WITH VALUE IN "NUMBER" +; RETURN .TKS - SYMBOL TOKEN WITH ASCIZ TEXT IN "NAME" TABLE + .TKB==0 ;BLANK (OR NULL) TOKEN + .TKN==1 ;NUMERIC TOKEN + .TKS==2 ;SYMBOLIC TOKEN + + +TOKEN: TDZA T1,T1 ;ENTRY FOR SYM,OCT#,DEC# START WITH STATE 0 +TOKN10: MOVEI T1,5_3 ;ENTRY FOR SYM,DEC# START WITH STATE 5 + MOVEM T1,TOKSTA' ;INIT STATE TABLE + SETZM TKZER + MOVE T1,[TKZER,,TKZER+1] + BLT T1,TKZEND-1 ;INITIALIZE TOKEN VALUES + MOVE T1,[POINT 7,NAME] + MOVEM T1,TOKPNT' ;INIT SYMBOL BUILD POINTER + +TOK2: PUSHJ P,GETCHR ;GET NEXT CHARACTER + MOVE T1,TOKSTA ;GET OLD STATE + ANDI T1,170 ;AND EXTRACT STATE BITS + LDB T2,TOKTYP ;GET CHARACTER TYPE + IOR T1,T2 ; AND COMBINE WITH OLD STATE + IDIVI T1,4 ;GET NEXT STATE, 4 ENTRIES/WORD + LDB T1,TOKNXT(T1+1) + MOVEM T1,TOKSTA ;SAVE NEW STATE + ANDI T1,7 ; AND EXTRACT DISPATCH ADDRESS + XCT TOKXCT(T1) ;PROCESS CURRENT CARACTER + JRST [ MOVE T1,TOKPNT ;GET SYMBOL BUILD POINTER + CAME T1,[POINT 7,NAME+NWORDS-1,34-7] + IDPB C,TOKPNT ;ROOM FOR CHAR, STORE AWAY + JRST TOK2 ] + JRST TOK2 ;GO GET NEXT CHARACTER + + ; EXECUTE TABLE +TOKXCT: SKIPA ; 0 IGNORE CHARACTER + JFCL ; 1 INCLUDE IN SYMBOL ONLY + SETOM TOKMIN ; 2 SET MINUS FLAG + PUSHJ P,TOKDIG ; 3 PROCESS 0-9 + JRST TOK5 ; 4 RETURN .TKB - NO TOKEN + JRST TOK6 ; 5 RETURN .TKS - SYMBOL + JRST TOK7 ; 6 RETURN .TKN - DECIMAL NUMBER + JRST TOK8 ; 7 RETURN .TKN - OCTAL NUMBER + +;MARGINAL INDEX TABLE INTO TOKTAB + +TOKNXT: PINDEX 9,TOKTAB(T1) + +DEFINE BYTE A,B,C,D,E,F,G,H +.BYTE 9 +A ? B ? C ? D ? E ? F ? G ? H +.BYTE +TERMIN + +;STATE TABLE. THE ROWS ARE INDEXED BY STATE; COLUMNS BY CHAR TYPE. +; EACH ENTRY CONSISTS OF 2 DIGITS- 2ND IS INDEX INTO TOKXCT, 1ST +; IS THE NEW STATE NUMBER. +TOKTAB: ;TERM, " ", ".", "+", "-", 0-7, 8-9,OTHER LEGAL SYM CHAR +BYTE 04, 00, 11, 21, 22, 23, 33, 11 ;STATE #0 +BYTE 05, 61, 11, 11, 11, 11, 11, 11 ;STATE #1 +BYTE 07, 71, 41, 11, 11, 23, 33, 11 ;STATE #2 +BYTE 06, 101, 41, 11, 11, 33, 33, 11 ;STATE #3 +BYTE 06, 111, 11, 11, 11, 11, 11, 11 ;STATE #4 +BYTE 54, 50, 11, 31, 32, 33, 33, 11 ;STATE #5 +BYTE 05, 60, 11, 11, 11, 11, 11, 11 ;STATE #6 +BYTE 07, 70, 41, 11, 11, 23, 33, 11 ;STATE #7 +BYTE 06, 100, 41, 11, 11, 33, 33, 11 ;STATE #10 +BYTE 06, 110, 11, 11, 11, 11, 11, 11 ;STATE #11 + +;STATE #0 - FLUSHES SPACES, ALLOWS + OR - FOR NUMBERS +;STATES #1,6 - BUILDS SYMBOLS, A CHARACTER WAS ILLEGAL FOR A NUMBER +;STATES #2,7 - BUILDS OCTAL NUMBER UNTIL 8,9, OR (.) SEEN +;STATES #3,10 - BUILDS DECIMAL NUMBER +;STATES #4,11 - A (.) SEEN AFTER A NUMBER, GO TO #1 FOR ANYTHING OTHER +; THAN SPACE OR TERM. +;STATE #5 - SAME AS #0 EXCEPT ANY NUMBER IS FORCED DECIMAL +; STATES #6-11 FLUSH MULTIPLE SPACES + +EXPUNGE BYTE + +TOKDIG: MOVEI T1,-"0(C) ;EXTRACT DIGIT FORM ASCII CHAR + MOVEI T2,8. + IMULM T2,TOKOCT ;BUILD OCTAL NUMBER + ADDM T1,TOKOCT ; AND ADD IN NEXT DIGIT + MOVEI T2,10. + IMULM T2,TOKDEC ;BUILD DECIMAL NUMBER + ADDM T1,TOKDEC ; AND ADD IN NEXT DIGIT + POPJ P, + +TOK5: MOVEI N,.TKB + JRST TOK99 + +TOK6: MOVEI T1,0 ;TRAILING SPACE FLUSHER FOR SYMBOLS + LDB T2,TOKPNT ;GET LAST CHAR IN SYMBOL + CAIN T2,40 + DPB T1,TOKPNT ;REPLACE A TRAILING SPACE WITH NULL + MOVEI N,.TKS + JRST TOK99 + +TOK7: SKIPA N,TOKDEC ;PICK UP DECIMAL NUMBER +TOK8: MOVE N,TOKOCT ;PICK UP OCTAL NUMBER + SKIPGE TOKMIN + MOVNS N ;NEGATE IF MINUS FLAG SET + MOVEM N,NUMBER + MOVEI N,.TKN +TOK99: POPJ P, + +SUBTTL GETCHR - GET A CHARACTER + +;LOWEST LEVEL ROUTINE TO GET A CHARACTER +; IF REREAD FLAG SET, RETURNS LAST CHARACTER READ + +GETCHR: TRZE F,REREAD + JRST [ MOVE C,LASTC + POPJ P, ] +GETC1: SKIPE CHRPNT ;RESCANNING ANYTHING? + JRST [ ILDB C,CHRPNT ;YES, GET CHARACTER + JUMPN C,GETC9 + POP PM,CHRPNT ;BUT NOTHING LEFT + POP PM,C ;GET LAST CHAR FROM STACK + JRST GETC9 ] + SOSGE INCNT + JRST GETC7 + ILDB C,INPNT ;GET CHAR FROM INPUT FILE +GETC8: LDB C1,GETPNT ;TRANSLATE INPUT CHARACTER + JUMPE C1,GETC1 + +PNTLST: MOVEM C,EOLCHR ;SAVE LAST CHAR TO FIND WHAT ENDED LINE + CAIE C1,12 ;DON'T SAVE 12,13, OR 14 + SOSG PNTCNT ;ROOM IN LISTING FILE (LEAVE 1 CHAR ROOM) + JRST .+2 ;NO + IDPB C,PNTPNT ;YES, SAVE INPUT CHAR IN OUTPUT LISTING + + MOVE C,C1 ;SEND TRANSLATED CHAR TO CALLER +GETC9: MOVEM C,LASTC' ;SAVE CHAR FOR POSSIBLE RE-READS + POPJ P, + +GETC7: MOVE C,[440700,,INBUF] ;REFILL BUFFER + MOVEM C,INPNT + MOVE C,[-BUFL,,INBUF] + .IOT INCHN,C + MOVEI C,-INBUF(C) + IMULI C,5 ;NUMBER OF CHARS READ + MOVEM C,INCNT + JUMPN C,GETC1 + PUSHJ P,NXTFIL + SKIPA C,[12] ;END-OF-FILE RETURNS LINE-FEED + MOVEI C,14 ;START NEW FILE WITH FORM FEED + JRST GETC8 + +SAVE: PUSH PM,C ;ROUTINE TO START RESCAN + PUSH PM,CHRPNT + MOVEM N,CHRPNT + POPJ P, + +SUBTTL LISTING GENERATION + +PNTLIN: PUSH P,C + TRNN F,PASS2\ERROR + JRST PNTL2 ;NO LIST ON PASS1, RE-INIT LISTING + MOVE N,MAXPOS+UCODE ;GET # BITS IN RAM + CAMGE N,MAXPOS+DISP + MOVE N,MAXPOS+DISP ;FIND LONGEST RAM LENGTH + ADDI N,11. ;RAM #S START AT 0, FORCE ROUNDUP + IDIVI N,12. ;GET HOW MANY DIGIT GROUPS + IMULI N,5 ;5 CHARACTERS PER GROUP + ADDI N,7 ;PLUS 7 EXTRA CHARACTERS + PUSHJ P,TABTON ;TAB OUT TO THERE + PUSHJ P,PRINT ;PRINT SOURCE LINE + ASCIZ /; / + HRRZ C,LINNUM + PUSHJ P,PNTDEC + PUSHJ P,TAB + MOVEI C,0 + IDPB C,PNTPNT + MOVEI N,PNTBUF + PUSHJ P,PRINT0 + MOVEI C,15 + PUSHJ P,PUT + MOVE C,EOLCHR + CAIE C,14 + MOVEI C,12 ;END LINE WITH 15,14, OR 15,12 + PUSHJ P,PUT +PNTL2: AOS LINNUM ;INDEX LINE NUMBER + POP P,C +PNTINI: MOVE T1,[POINT 7,PNTBUF] ;INIT OUTPUT LIST LINE BUFFER + MOVEM T1,PNTPNT ;INIT OUTPUT BUFFER BYTE POINTER + MOVEI T1,PNTMAX + MOVEM T1,PNTCNT ;INIT OUTPUT BUFFER CHAR COUNT + POPJ P, + +PNTBIN: TRNN F,BINF + POPJ P, + PUSH P,C +IFN FTBB,[ + JUMPN RAM,NOMOVE ;NEVER MOVE DISP DATA + SKIPGE PC+UCODE ; OR CONSTRAINED ADDRESS DATA + JRST NOMOVE + + MOVSI T1,-MICMXW ;COUNT THRU ALL PIECES OF MICROWORD + MOVE T2,MOVMSK(T1) ;BITS WHICH DON'T EXIST ABOVE 2000 + TDNN T2,VALUE(T1) ;ANY SET IN THIS MICROWORD? + AOBJN T1,.-2 ;LOOK AT ALL PIECES + JUMPL T1,NOMOVE ;DON'T MOVE IF ANY NXB SET + + MOVE T1,[-<1000/36.>,,<2000/36.>] + SETCM T2,USAGE(T1) ;LOOK FOR UNSET BITS UP THERE + TLZA T2,(BORDER) ;START AT THE BORDER OF 2000 + SETCM T2,USAGE(T1) ;TRY NEXT WORD + JFFO T2,MOVUP ;IF FOUND ONE, USE IT + AOBJN T1,.-2 ;NO, LOOK AT NEXT + JRST NOMOVE ;NO FREE BITS, DO NOT MOVE + +MOVUP: HRRZS T1 ;COMPUTE ADDRESS FOR THIS BIT + IMULI T1,36. + ADDI T1,(T3) + MOVEM T1,PC+UCODE ;STORE NEW PC FOR THIS WORD + + MOVEI SPNT,JEQL-SYMEQL +ADJTAG: HRRZ SPNT,SYMEQL(SPNT) + JUMPE SPNT,NODFLT ;NO MORE + DPB T1,DEFVAL ;REPLACE VALUE + JRST ADJTAG ;ADJUST NEXT TAG + +NODFLT: MOVSI T1,-MICMXW + MOVE T2,MOVMSK(T1) + IORM T2,VALSET(T1) ;PREVENT DEFAULT SETTING THESE BITS + AOBJN T1,.-2 +NOMOVE: +];END FTBB + MOVE T1,PRNTPC(RAM) ;GET LAST LOCATION ASSEMBLED + MOVE N,PC(RAM) ;GET THIS LOCATION + MOVEM N,PRNTPC(RAM) ;SAVE PRESENT PC FOR NEXT WORD DEFAULT + HRRZS N ;COMPARE RH ONLY + CAMLE N,HIGHPC(RAM) ;IS THIS THE HIGHEST PC USED SO FAR? + MOVEM N,HIGHPC(RAM) ;YES, SAVE FOR LOC'N LISTING + JUMPN RAM,PNTB0 ;PCTABL RELEVANT ONLY FOR UCODE + TRNN F,PASS2 + JRST CHNPC ;ON PASS1, CHAIN PC'S TOGETHER + HRRZ T2,PCTABL(T1) ;GET ADDR ASSUMED BY LAST UWORD FOR THIS ONE + CAIE T2,(N) ;IS IT SAME AS THIS PASS? + MSG STOP, !! PHASE ERROR !! + HLRZ T2,PCTABL(N) ;GET LINE OF THIS PC LAST PASS + CAME T2,LINNUM + MSG .+1, LINE NUMBER FOUL UP + JRST PNTB0 + +CHNPC: HRRM N,PCTABL(T1) ;SAVE THIS PC FOR PASS2 DEFAULTS + MOVE T1,LINNUM ;GET THIS LINE NUMBER + HRLM T1,PCTABL(N) ;ASSOCIATE IT WITH THIS PC +PNTB0: TRNE F,PASS2 + PUSHJ P,DEFALT ;PUT IN PASS2 DEFAULTS + PUSHJ P,USEDPC ;LOOK TO SEE IF THIS PC USED + MSG .+1, MICRO WORD USED TWICE +PNTB1: PUSHJ P,PCNEXT ;GET NEXT PC SET UP + SETZM JEQL + TRNN F,PASS2 + JRST PNTB99 + AOS WRDCNT(RAM) ;COUNT MICRO WORDS USED +IFN FTLOOS,[ + SKIPL PRNTPC(RAM) + AOSA LOOSPC(RAM) ;COUNT PC WORDS THAT CAN GO ANYWHERE +];END IFN FTLOOS + SKIPA N,RAM + MOVEI N,2(RAM) + ADDI N,[ASCII /U / + ASCII /D / + ASCII /V / + ASCII /D / ] + PUSHJ P,PRINT0 + HRRZ C,PRNTPC(RAM) + PUSHJ P,PNTOC4 + MOVE T1,[POINT 12,VALUE] + MOVEM T1,MICPNT' + SETZM MICCNT' + PUSHJ P,PRINT + ASCIZ /, / + JRST PNTB3 + +PNTB2: MOVEI C,", + PUSHJ P,PUT +PNTB3: ILDB C,MICPNT + PUSHJ P,PNTOC4 + MOVEI T1,12. + ADDB T1,MICCNT + CAMG T1,MAXPOS(RAM) + JRST PNTB2 +PNTB99: POP P,C + POPJ P, + +FINLST: TRO F,ERROR\NOHDR ;FORCE NEXT MSG TO TTY, SUPPRESS HEADERS + PUSHJ P,PRINT + ASCIZ / + +; Number of Micro Words used: +; D Words= / + MOVE C,WRDCNT+DISP + PUSHJ P,PNTDEC + PUSHJ P,PRINT + ASCIZ / +; U Words= / + MOVE C,WRDCNT+UCODE + PUSHJ P,PNTDEC +IFN FTLOOS,[ + PUSHJ P,PRINT + ASCIZ / +; "Loose" U Words= / + MOVE C,LOOSPC+UCODE ;GET # OF U WORDS THAT CAN GO ANYWHERE + PUSHJ P,PNTDEC +];END IFN FTLOOS + PUSHJ P,CRLF + TRZ F,ERROR ;"END" DOESN'T GO TO TTY CONSOLE + PUSHJ P,PRINT + ASCIZ / + END +/ + TRZ F,NOHDR +;DROPS THROUGH + +;DROPS IN +;START CREF LISTING + + MOVEI C,[ASCIZ /CROSS REFERENCE LISTING/] + PUSHJ P,SETHDR + MOVEI FPNT,FLDPNT ;GET START OF SYM TABLE +CRFLUP: HRRZ FPNT,(FPNT) ;GET NEXT FIELD + JUMPE FPNT,CRFEND ;STOP AT END + MOVE SPNT,FPNT + LDB RAM,DEFTYP ;GET "UCODE" OR "DISP" NUMBER + MOVEI N,[ASCII /(U) / + ASCII /(D) / ] (RAM) + PUSHJ P,PRINT0 + MOVEI N,SYMTXT(FPNT) ;GET TEXT ADDRESS + PUSHJ P,PRINT0 ; AND PRINT FIELD NAME + PUSHJ P,CRFLST ;LIST CREF FOR FIELD +CRSLUP: HLRZ SPNT,SYMLNK(SPNT) ;GET NEXT + JUMPE SPNT,CRFLUP ;GET NEXT FIELD IF NULL + MOVE T1,SYMTXT(SPNT) + PUSHJ P,TAB + MOVEI N,SYMTXT(SPNT) ;GET ADR OF SYMBOL + PUSHJ P,PRINT0 + PUSHJ P,CRFLST + JRST CRSLUP + +;HERE TO PRINT CREF FOR ONE SYMBOL + +CRFLST: HRRZ N,SYMCRF(SPNT) ;GET POINTER TO 1ST ITEM +CRILUP: HRRZS N + JUMPE N,NEWLIN ;EXITS WITH POPJ + PUSH P,(N) ;SAVE LIST ITEM + MOVE T1,HORPOS ;GET HORIZONTAL POSITION + CAILE T1,120.+1 ;ROOM FOR ANOTHER ITEM? + PUSHJ P,NEWLIN ;NO +CRILP2: PUSHJ P,TAB ;TAB BEFORE EACH ITEM + MOVE T1,HORPOS + CAIGE T1,NCHARS+8 ;SPACED OVER SYMBOLS? + JRST CRILP2 ;NO, ANOTHER TAB NEEDED + HLRZ C,(P) ;GET LINE NUMBER + TRZ C,400000 ;CLEAR DEFINITION FLAG + PUSHJ P,PNTDEC + SKIPL 0(P) ;IS DEFINITION FLAG SET? + JRST CRILP3 ;NO + PUSHJ P,PRINT ;YES, FLAG IT + ASCIZ / #/ +CRILP3: POP P,N + JRST CRILUP + +;START LOCATION/LINE LISTING + +CRFEND: +IFN FTMAP,[ + MOVEI C,[ASCIZ \LOCATION / LINE NUMBER INDEX +; DCODE LOC'N 0 1 2 3 4 5 6 7\] + PUSHJ P,SETHDR + HRLO FPNT,HIGHPC+1 ;GET HIGHEST LOC'N IN DRAM USED + SETCA FPNT, ;USE AS LIMIT ON AOBJN POINTER + JRST DLOCST +DLCLUP: TRNE FPNT,7 ;TIME FOR A NEW LINE? + JRST DLOCL1 ;NO + PUSHJ P,NEWLIN ;YES + TRNN FPNT,70 + PUSHJ P,NEWLIN ;DOUBLE SPACE AFTER 100 +DLOCST: PUSHJ P,PRINT + ASCIZ /D / ;MARK AS DCODE LOC + MOVEI C,(FPNT) ;GET LOCATION + PUSHJ P,PNTOC4 ;PRINT IN OCTAL, 4 DIGITS + PUSHJ P,TAB +DLOCL1: PUSHJ P,TAB ;SPACE OVER + MOVEI C,(FPNT) ;COPY LOC'N + ROT C,-1 ;PREPARE INDEX INTO DTABL + SKIPGE C ;RIGHT OR LEFT? + SKIPA C,DTABL(C) ;RIGHT + MOVS C,DTABL(C) ;LEFT + TLZ C,-1 ;CLEAR OTHER HALF + SKIPE C ;IF USED, + PUSHJ P,PNTDEC ; PRINT IT + AOBJN FPNT,DLCLUP ;GO TO NEXT + PUSHJ P,CRLF ;RETURN TO LEFT MARGIN + + MOVEI C,[ASCIZ \LOCATION / LINE NUMBER INDEX +; UCODE LOC'N 0 1 2 3 4 5 6 7\] + PUSHJ P,SETHDR + HRLO FPNT,HIGHPC ;GET HIGHEST LOC'N USED + SETCA FPNT, ;USE AS LIMIT ON AOBJN POINTER + JRST LOCST +LOCLUP: TRNE FPNT,7 ;TIME FOR A NEW LINE? + JRST LOCL1 ;NO + PUSHJ P,NEWLIN ;YES + TRNN FPNT,70 ;DOUBLE SPACE AFTER 100 LOC'S + PUSHJ P,NEWLIN +LOCST: PUSHJ P,PRINT + ASCIZ /U / ;MARK AS U LOC + MOVEI C,(FPNT) ;GET LOCATION + PUSHJ P,PNTOC4 ;PRINT IN OCTAL, 4 DIGITS + PUSHJ P,TAB +LOCL1: PUSHJ P,TAB ;SPACE OVER + HLRZ C,PCTABL(FPNT) ;GET LINE # FOR THIS LOCATION + SKIPE C ;IF USED, + PUSHJ P,PNTDEC ; PRINT IT + AOBJN FPNT,LOCLUP ;GO TO NEXT + PUSHJ P,CRLF ;RETURN TO LEFT MARGIN +];END IFN FTMAP + +;HERE WHEN LISTING FINISHED + + TRO F,ERROR\NOHDR ;FORCE NEXT MESSAGE TO TTY + SKIPN ERRCNT ;ANY ERRORS? + SKIPA N,[[ASCIZ / +NO/]] + MOVEI N,[ASCIZ / +? /] + PUSHJ P,PRINT0 + SKIPE C,ERRCNT + PUSHJ P,PNTDEC ;NUMBER OF ERRORS IF ANY + PUSHJ P,PRINT + ASCIZ / ERROR/ + MOVEI C,"S ;PLURAL + MOVE N,ERRCNT + CAIE N,1 ;IS IT PLURAL? + PUSHJ P,PUT ;YES + PUSHJ P,PRINT + ASCIZ / DETECTED +END OF MICRO CODE ASSEMBLY +USED / + .SUSET [.RRUNT,,C] ;GET FINAL RUNTIME + SUB C,STTIME ;GET USED RUNTIME (MS) + IDIVI C,250. ;GET MILLISECONDS + ADDI C,5 ;ROUND TO HUNDREDTH OF SEC + IDIVI C,10. + IDIVI C,100. ;GET HUNDREDTHS OF SEC + PUSH P,C+1 ;SAVE FRACTION + PUSHJ P,PNTDEC ;PRINT SECONDS + MOVEI C,". + PUSHJ P,PUT + POP P,C ;RECOVER FRACTION + PUSHJ P,PNTDC2 + PUSHJ P,PRINT + ASCIZ / SECONDS +/ + POPJ P, ;LISTING FINISHED + +PRINT: POP P,N ;PRINT IN-LINE ASCIZ + PUSHJ P,PRINT0 + JRST 1(N) + +CRLF: MOVEI N,[ASCIZ / +/] +PRINT0: HRLI N,440700 ;PRINT ASCIZ N -> +PRINT1: ILDB C,N + JUMPE C,CPOPJ + PUSHJ P,PUT + JRST PRINT1 + +PNTSX0: HRLI N,440600 ;SIXBIT PRINTER +PNTSX1: TLNN N,770000 + POPJ P, + ILDB C,N + JUMPE C,CPOPJ + ADDI C,40 ;CONVERT TO ASCII + PUSHJ P,PUT + JRST PNTSX1 + +PNTOCT: TDZA T1,T1 +PNTOC4: MOVEI T1,4 +PNTOC2: PUSHJ P,SGNCHK +PNTOC3: IDIVI C,8 + HRLM C+1,(P) + SOSG T1 + SKIPE C + PUSHJ P,PNTOC3 + JRST PNTDC4 + +PNTDEC: TDZA T1,T1 +PNTDC2: MOVEI T1,2 + PUSHJ P,SGNCHK +PNTDC3: IDIVI C,10. + HRLM C+1,(P) + SOSG T1 + SKIPE C + PUSHJ P,PNTDC3 +PNTDC4: HLRE C,(P) + MOVMS C + ADDI C,"0 + JRST PUT + +SGNCHK: JUMPGE C,CPOPJ + PUSH P,C + MOVEI C,"- + PUSHJ P,PUT + POP P,C + MOVMS C + POPJ P, + +NEWLIN: PUSHJ P,CRLF ;SEND END OF LINE + MOVE N,VERPOS ;HOW FAR DOWN PAGE + CAIGE N,LPPAG ;COMPARE LINES PER PAGE LIMIT + POPJ P, + JRST FORM ;EJECT & PRINT NEW HEADER + +SETHDR: HRRZM C,HDRPNT ;SAVE ADDR OF NEW SUBHEADER +FORM: SKIPN VERPOS ;ALREADY AT TOP OF PAGE? + POPJ P, ;YES, DON'T BE REDUNDANT + SKIPA C,[14] ;AND GET NEW PAGE +TAB: MOVEI C,11 +; JRST PUT + +PUT: SKIPGE PAGNUM ;IS PAGE HEADER FLAG SET? + PUSHJ P,HEADER ;NEW HEADER FOR NEW PAGE + SOSG OUTCNT + PUSHJ P,OUTRFL + IDPB C,OUTPNT + CAIE C,^L ;DON'T FORMFEED THE TERMINAL + JRST [ TRNE F,ERROR + .IOT TYOC,C + JRST .+1 ] + TRNN C,140 ;SPACING CHARACTER? + JRST PUT2 ;NO + AOS HORPOS ;INDEX HORIZONTAL LINE POSITION + POPJ P, + +PUT2: CAIN C,14 + JRST [ AOS PAGNUM + HRROS PAGNUM ;SET HEADER FLAG + SETZM VERPOS + POPJ P, ] + CAIN C,15 + SETZM HORPOS ;ZERO POSITION FOR CARRIAGE RETURN + CAIN C,12 ;LF? + AOS VERPOS ;YES, COUNT NEW LINE + CAIE C,11 + POPJ P, ;NOT HORIZONTAL TAB + EXCH C,HORPOS + IORI C,7 + ADDI C,1 + EXCH C,HORPOS + POPJ P, + +TABTON: PUSHJ P,TAB + CAMLE N,HORPOS + JRST TABTON + POPJ P, + +;OUTPUT LAST BUFFERFULL + +OUTCLS: MOVE T1,OUTPNT ;FILL LAST WORD WITH EOF CHRS + MOVEI C,^C + IDPB C,T1 + TLNE T1,760000 + JRST .-2 ;THEN FALL INTO OUTRFL + +;OUTPUT BUFFER REFILL + +OUTRFL: PUSH P,C + SKIPN C,OUTPNT ;GET NUMBER OF WORDS GENERATED SO FAR + JRST OUTRF1 + HRLOI C,-OUTBUF(C) ;AND MAKE AOBJN POINTER (ASSUMING NO PARTIAL WORDS) + EQVI C,OUTBUF + .IOT OUTCHN,C + JUMPGE C,OUTRF1 + .VALUE ;FAILED TO TRANSMIT ALL THE CRUFT? +OUTRF1: MOVE C,[440700,,OUTBUF] + MOVEM C,OUTPNT + MOVEI C,5*BUFL + MOVEM C,OUTCNT + POP P,C + POPJ P, + +;PRINT HEADER ROUTINE + +HEADER: HRRZS PAGNUM + TRNN F,NOHDR ;HEADERS SUPPRESSED? + TRNN F,PASS2 + POPJ P, + PUSH P,16 ;SAVE AC'S 0-16 + MOVEI 16,1(P) + BLT 16,16(P) + ADD P,[16,,16] + TRZ F,ERROR ;DON'T SEND HEADER TO TTY + ; WILL BE RESTORED WITH AC'S + PUSHJ P,PRINT + ASCIZ /; / + MOVEI N,OUTFIL ;GET ADR OF OUTPUT FILE DESCRIPTOR + PUSHJ P,HEDNAM ;AND PRINT THE DESCRIPTOR + MOVEI N,32. + PUSHJ P,TABTON ;POSITION THE VERSION STUFF + PUSHJ P,PRINT + ASCIZ /MICRO / + MOVEI N,[.FNAM2] + PUSHJ P,PNTSX0 + MOVEI N,48. ;SPACE OVER TO TITLE + PUSHJ P,TABTON + SKIPN N,TTLPNT ;IS THERE A TITLE? + MOVEI N,[ASCIZ /MICROCODE FILE/] + PUSHJ P,PRINT0 ;PRINT A TITLE + +;HERE TO DO PAGE # & 2ND LINE OF HEADER + + PUSHJ P,PRINT + ASCIZ / PAGE / + HRRZ C,PAGNUM + PUSHJ P,PNTDEC ;PRINT PAGE NUMBER + PUSHJ P,PRINT + ASCIZ / +; / + SKIPE N,HDRPNT ;SPECIAL HEADER? + JRST HEAD5 ;YES + MOVEI N,INFILE ;GET CURRENT INPUT FILE DESCRIPTOR + PUSHJ P,HEDNAM + MOVEI N,48. + PUSHJ P,TABTON ;TAB OVER FOR SUBTITLE + HLRZ N,TOCPNT ;GET SUBTTL STRING ADDR + JUMPE N,HEAD6 ;MAKE SURE THERE'S SOMETHING TO PRINT + MOVEI N,1(N) ;POINT TO TEXT STRING +HEAD5: PUSHJ P,PRINT0 ;PRINT SUBTTL OR SPECIAL HEADER +HEAD6: PUSHJ P,CRLF + PUSHJ P,CRLF + SUB P,[16,,16] + MOVSI 16,1(P) + BLT 16,15 + POP P,16 + POPJ P, + +;SUBR TO PRINT FILENAME, TIME, AND DATE + +HEDNAM: PUSH P,N ;SAVE DESCRIPTOR POINTER + ADDI N,F.DEV + PUSHJ P,PNTSX0 + MOVEI C,": + PUSHJ P,PUT + MOVEI C,40 + PUSHJ P,PUT + + MOVE N,(P) + ADDI N,F.PPN + PUSHJ P,PNTSX0 + MOVEI C,"; + PUSHJ P,PUT + MOVEI C,40 + PUSHJ P,PUT + + MOVE N,(P) + ADDI N,F.NAM ;POINT TO FILE NAME + PUSHJ P,PNTSX0 + MOVEI C,40 + PUSHJ P,PUT + + MOVE N,(P) + ADDI N,F.EXT + PUSHJ P,PNTSX0 + + PUSHJ P,TAB + POP P,N ;GET POINTER TO BLOCK BACK + MOVE C,F.TIM(N) + LSH C,-2 + ASH C,-2 + AOJE C,CPOPJ ;SUPPRESS DATE/TIME IF "-" + HRRZ C,F.TIM(N) ;GET 1/2 SECONDS SINCE MIDNIGHT + LSH C,-1 + IDIVI C,3600. + PUSH P,C1 + PUSHJ P,PNTDC2 ;HOURS + MOVEI C,": + PUSHJ P,PUT + POP P,C + IDIVI C,60. + PUSH P,C1 + PUSHJ P,PNTDC2 ;MINUTES + MOVEI C,": + PUSHJ P,PUT + POP P,C + PUSHJ P,PNTDC2 ;SECONDS + MOVEI C,40 + PUSHJ P,PUT + + LDB C,[.BP (37),F.TIM(N)] + PUSHJ P,PNTDEC ;DAY + LDB C,[.BP (740),F.TIM(N)] + PUSH P,N + MOVEI N,[SIXBIT /-JAN-/ + SIXBIT /-FEB-/ + SIXBIT /-MAR-/ + SIXBIT /-APR-/ + SIXBIT /-MAY-/ + SIXBIT /-JUNE-/ + SIXBIT /-JULY-/ + SIXBIT /-AUG-/ + SIXBIT /-SEPT-/ + SIXBIT /-OCT-/ + SIXBIT /-NOV-/ + SIXBIT /-DEC-/ ]-1(C) ;INDEX INTO TABLE BY MONTH + PUSHJ P,PNTSX0 + POP P,N + LDB C,[.BP (177000),F.TIM(N)] + PUSHJ P,PNTDEC ;YEAR + POPJ P, + +SUBTTL MICRO-LOCATION ASSIGNMENT + +;SEARCH FOR FREE MICRO WORDS. +; LOCPAT CONTAINS THE 1'S PATTERN +; LOCAST CONTAINS THE ASTERISK "DON'T CARE" PATTERN +; FRECNT CONTAINS THE SIZE OF THE BLOCK WITHIN WHICH +; THE PATTERN OF LOCPAT EXISTS. FRECNT IS ALWAYS +; A SINGLE BIT. +;SUBROUTINE RETURNS THE 1ST LOCATION MEETING CRITERIA AND SKIPS. +;IF CRITERIA CANNOT BE MET WITH ANY LOCATION, THEN NO SKIP + +;*** TEMPORARY HACK: *** +; IF THE PATTERN IS MORE THAN 5 BITS WIDE, MATCH IT, +; BUT DO NOT LOOK FOR FREE WORDS OUTSIDE A 32-WORD BLOCK, +; AND RESTRICT PC DEFAULT PROGRESSION TO 32-WORD BLOCK. + +FREWRD: JUMPN RAM,STOP + MOVE T1,LOCPAT ;GET PATTERN TO MATCH + IOR T1,LOCAST ;COUNT IN THE *'S + ANDI T1,FRESIZ-1 ;*** LOOK ONLY AT LOW BITS *** + MOVE T1,FRETAB(T1) ;GET LIST OF WORDS FITTING PATTERN + MOVEI T2,FRESIZ ;TABLE IS BUILT FOR 32 WORDS + SUB T2,FRECNT ;GET # OF WORDS TO THROW AWAY + SKIPL T2 ;*** NO SHIFT IF NEGATIVE *** + LSH T1,(T2) ; AND THROW THEM AWAY + MOVEM T1,FREMSK' ;SAVE PATTERN FOR MATCHING + + MOVSI N,-MAXPC/36. ;SET UP TABLE LENGTH +FREE2: SETCM T1,USAGE(N) ;GET 1'S FOR FREE PC BITS +FREE3: JFFO T1,FREE5 ;IF ANY FREE HERE, XFER + AOBJN N,FREE2 ;KEEP LOOKING UNTIL ALL GONE + POPJ P, ;NO SUCH STRING + +FREE5: HRRZ N1,T1+1 ;GET LEFT MOST BIT # TO BETTER PLACE + SETCM T1+1,USAGE+1(N) ;GET FREE BITS FROM NEXT WORD + LSHC T1,(N1) ;PUT 1ST FREE BIT INTO BIT 0 + MOVE T2,T1 ;COPY + AND T2,FREMSK ;LOOK ONLY FOR REQUIRED STRING + HRRZ T3,N ;GET PC FOR THIS BIT + IMULI T3,36. + ADD T3,N1 + MOVE T4,FRECNT ;GET MASK FOR PC ZEROS + SUBI T4,1 ;POWER OF 2 CHANGED TO STRING OF 1'S + AND T4,T3 ;GET PC BITS TO TEST + ANDCM T4,LOCAST ;IGNORE PLACES WHERE *'S ARE IN PATTERN + CAMN T2,FREMSK ;PC BITS FREE? + CAME T4,LOCPAT ;CORRECT BIT PATTERN? + JRST FREE6 ;NO OR NO + +BLKCNT: MOVN T1,FRECNT ;COUNT WORDS IMPLIED BY FRECNT + ORCMI T1,FRESIZ-1 ;*** IF FRECNT .GT. FRESIZ, USE FRESIZ *** + ANDCB T1,LOCPAT ; AND LOCPAT + ANDCM T1,LOCAST ;*'S DON'T COUNT + MOVSI N,-1 +BLKC2: JUMPN T1,[ANDI T1,-1(T1) + ASH N,1 + JRST BLKC2 ] + HRR N,T3 ;INSERT PC + JRST CPOPJ1 + +FREE6: MOVEI T4,1 ;THROW AWAY 1 FREE WORD + LSH T1,(T4) ; AND WIPE OUT THAT MANY BITS + ADD N1,T4 ;CALC TOTAL # OF SHIFT PLACES + MOVNS N1 + LSH T1,(N1) ; AND SHIFT PC BITS BACK TO PLACE + JRST FREE3 ;GO LOOK SOME MORE + +FRESIZ==32. ;TABLE IS 32 WORDS OF 32 BITS +FRETAB: .BYTE 1 +REPEAT 32.,[ + .WALGN + XB==.RPCNT + REPEAT 32., IFE .RPCNT&XB,[1]+0 +] +.BYTE + +PCNEXT: MOVE N,PC(RAM) + JUMPN RAM,[AOJA N,PCNX2] + JUMPGE N,PCNXT1 ;IF NOT IN ADR BLOCK, FIND 1ST FREE WORD + MOVE T2,N ;FIND BITS IN PC THAT + AND T2,LOCAST ; SHOULD NOT CHANGE + IOR N,LOCAST ;INSERT BITS TO PROPOGATE CARRIES + AOBJP N,PCNXT1 ;IF .GE. 0, FIND 1ST FREE WORD + IOR N,LOCPAT ;RE-INSERT BITS THAT MUST BE 1'S + ANDCM N,LOCAST ;MAKE ROOM FOR PC BITS THAT MUST NOT + IOR N,T2 ; CHANGE, AND INSERT THEM +PCNX2: MOVEM N,PC(RAM) + POPJ P, + +PCNXT1: MOVE N,PC(RAM) + SKIPE SEQADR + AOJA N,PCNX2 ;DON'T USE FIRST FREE, USE NEXT, IF SEQUENTIAL ADDRESS MODE + SETZM LOCPAT ;START ON 000 BOUNDARY + SETZM LOCAST ;* PATTERN IS 0'S + MOVEI T1,1 ;LOOK FOR 1ST FREE WORD + MOVEM T1,FRECNT + PUSHJ P,FREWRD + MSG CPOPJ, NO MORE MICRO WORDS FREE + TLZ N,-1 ;NO ADDRESS RESTRICTIONS + JRST PCNX2 + +;TEST PC LOCATION FOR PREVIOUS USAGE +; IF USED, NO SKIP ;IF NOT USED, SKIP +; ON RETURN, N,N1 CONTAINS BIT ALIGNED FOR DOING "IORM N1,USAGE(N)" + +USEDPC: HRRZ N,PC(RAM) + JUMPN RAM,USED1 ;DIFFERENT IF DISPATCH + IDIVI N,36. + MOVN T1,N1 ;NEGATE REMAINDER FOR RIGHT SHIFTS + MOVSI N1,(SETZ) + LSH N1,(T1) + TDNN N1,USAGE(N) + AOS (P) + IORM N1,USAGE(N) + POPJ P, + +USED1: TRNN F,PASS2 ;COLLECT THIS ON PASS 2 ONLY + JRST CPOPJ1 + ROT N,-1 ;DIVIDE BY 2 + JUMPL N,USED2 ;ODD, USE RH + HLRZ N1,DTABL(N) ;PREVIOUS CONTENTS + JUMPN N1,CPOPJ ;ERROR IF ALREADY SET + MOVE N1,LINNUM ;ELSE GET THIS LINE # + HRLM N1,DTABL(N) ;AND RECORD IT + JRST CPOPJ1 ;OK RETURN + +USED2: HRRZ N1,DTABL(N) + JUMPN N1,CPOPJ + MOVE N1,LINNUM + HRRM N1,DTABL(N) + JRST CPOPJ1 + +SUBTTL UUO HANDLER - ERROR MESSAGE PRINTER + +UUOH: PUSH P,C + LDB C,[331100,,40] ;GET OPCODE + CAIN C,1 + JRST UUOHM ;MSG + CAIE C,2 + .VALUE ;ILUUO - E.G. HALT + MOVE C,40 ;OUTSTR + HRLI C,440700 + PUSH P,N +UUOHOS: ILDB N,C + JUMPE N,UUOHSX + .IOT TYOC,N + JRST UUOHOS + +UUOHSX: POP P,N + POP P,C + POPJ P, + +;HERE TO PRINT ERROR MESSAGE +;CALLED BY LUUO + +UUOHM: TRO F,ERROR + AOS ERRCNT + EXCH N,40 + HRRZ T1,(N) + MOVEM T1,-1(P) ;SAVE RETURN + PUSH P,40 ;SAVE N + SKIPN OUTFIL+F.DEV ;IS THERE A FILE ONTO WHICH TO PUT MESSAGE? + JRST NOEFIL ;NOPE, JUST TTY + +;FIRST LINE -- MESSAGE TEXT AS SPECIFIED BY CALLER + + .IOT TYOC,[15] ;BLANK LINE ON TTY FOR READABILITY + .IOT TYOC,[12] + MOVEI C,"; ;PUT ERROR COMMENT + PUSHJ P,PUT + HLRZ N,(N) ;GET ADR OF MSG + PUSHJ P,PRINT0 + +;SECOND LINE -- CONTEXT OF ERROR + + PUSHJ P,PRINT + ASCIZ / +; / + MOVEI N,[ ASCII /U= / + ASCII /D= / ](RAM) + PUSHJ P,PRINT0 + HRRZ C,PC(RAM) + PUSHJ P,PNTOC4 + MOVEI N,[ASCIZ /, /] + SKIPN NAME + SKIPE FIELD + PUSHJ P,PRINT0 ;GIVE COMMA SPACE IF FIELD OR NAME TO BE PRINTED + MOVEI N,FIELD + PUSHJ P,PRINT0 + MOVEI C,"/ + SKIPE FIELD + PUSHJ P,PUT + MOVEI N,NAME + PUSHJ P,PRINT0 + + MOVE N,I.MAXC ;# OF SOURCE FILES + CAIG N,1 ; MORE THAN ONE? + JRST UUOHP ;NO. NO NEED TO IDENTIFY WHICH + PUSHJ P,PRINT ;YES. IDENTIFY IT + ASCIZ /, FILE= / + MOVEI N,INFILE+F.DEV + PUSHJ P,PNTSX0 + PUSHJ P,PRINT + ASCIZ/: / + MOVEI N,INFILE+F.PPN + PUSHJ P,PNTSX0 + PUSHJ P,PRINT + ASCIZ/; / + MOVEI N,INFILE+F.NAM ;ADDR OF CURRENT INPUT NAME + PUSHJ P,PNTSX0 ;PRINT IT + MOVEI C,40 + PUSHJ P,PUT + MOVEI N,INFILE+F.EXT + PUSHJ P,PNTSX0 +UUOHP: TRNN F,PASS2 + JRST UUOHL ;PAGE # MEANINGLESS ON PASS 1 + PUSHJ P,PRINT + ASCIZ /, PAGE= / + HRRZ C,PAGNUM + PUSHJ P,PNTDEC +UUOHL: PUSHJ P,PRINT + ASCIZ /, LINE= / + HRRZ C,LINNUM + PUSHJ P,PNTDEC +IFN FTECHR,[ + PUSHJ P,PRINT + ASCIZ /, CHAR= / + MOVE C,-1(P) ;GET C BACK + MOVEI T1,3 ;TYPE 3 OCTAL DIGITS + PUSHJ P,PNTOC2 +];END IFN FTECHR + PUSHJ P,CRLF + MOVEI C,"? + PUSHJ P,PNTLST + POP P,N + POP P,C + POPJ P, + +NOEFIL: HLRZ N,(N) ;ADDR OF MESSAGE + .IOT TYOC,["?] ;MAKE IT ERROR-FORM + OUTSTR (N) ;TYPE MESSAGE + OUTSTR [ASCIZ / +/] + EXIT + + +STOP: +REPEAT 16.,MOVEM .RPCNT,SAVACS+.RPCNT + MSG .+1,[ INTERNAL ERROR, "SAVE" CORE IMAGE +AND CALL JUD LEONARD, MARLBORO, X6104] + .VALUE + +SUBTTL OPEN INPUT FILE + +BEGIO: MOVE T1,I.MAXC ;START LOOKING AT 1ST FILE + MOVNM T1,I.CNT ;INIT COUNTER TO NUMBER OF FILES +NXTFIL: SETOM ENDFIL ;SET END-OF-FILE INDICATOR + SKIPL I.CNT + POPJ P, ;NO FILES LEFT + MOVE C,I.MAXC ;GET NEXT INPUT FILE DESCRIPTOR + ADD C,I.CNT ;C HAS FILE NUMBER + IMULI C,I.LEN + ADDI C,I.STG ;NOW C -> FILE DESC + .CALL [ SETZ + SIXBIT/OPEN/ + [.BAI,,INCHN] + I.DEV(C) + I.NAM(C) + I.EXT(C) + SETZ I.PPN(C) ] + PUSHJ P,IFOPER + MOVE C,I.DEV(C) ;.RCHST SCREWS DEVICE NAME + MOVEM C,INFILE+F.DEV + MOVE C,[INCHN,,RCHST] + .RCHST C, + MOVE C,RCHST+1 + MOVEM C,INFILE+F.NAM + MOVE C,RCHST+2 + MOVEM C,INFILE+F.EXT + MOVE C,RCHST+3 + MOVEM C,INFILE+F.PPN + SETO C, + .CALL [ SETZ + 'RFDATE + MOVEI INCHN + SETZM INFILE+F.TIM ] + PUSHJ P,IFOPER + AOS I.CNT ;NEXT FILE + SETZM ENDFIL ;CLEAR END-OF-FILE INDICATOR +CPOPJ1: AOS (P) ;FILE FOUND, SKIP RETURN +CPOPJ: POPJ P, +.TNEWL==CPOPJ ;??? + +;FILE SYSTEM ERROR HANDLING + +OFOPER: MOVEI C,O.DEV +IFOPER: PUSH P,T1 + PUSH P,T2 + .IOT TYOC,[^M] + .IOT TYOC,["?] + .IOT TYOC,[" ] + .OPEN ERRC,[.UAI,,'ERR ? 1] + .VALUE +IFOPE1: .IOT ERRC,T1 + CAIGE T1,40 + JRST IFOPE2 + .IOT TYOC,T1 + JRST IFOPE1 + +IFOPE2: .CLOSE ERRC, + SKIPGE C + EXIT + .IOT TYOC,[40] + .IOT TYOC,["-] + .IOT TYOC,[40] + MOVE T2,I.DEV(C) + PUSHJ P,IFOPE3 + .IOT TYOC,[":] + MOVE T2,I.PPN(C) + PUSHJ P,IFOPE3 + .IOT TYOC,[";] + MOVE T2,I.NAM(C) + PUSHJ P,IFOPE3 + .IOT TYOC,[40] + MOVE T2,I.EXT(C) + PUSHJ P,IFOPE3 + .IOT TYOC,[15] + PUSH P,FPNT + PUSH P,SPNT + PUSH P,T3 + PUSH P,T4 + OUTSTR [ASCIZ/USE WHAT FILENAME INSTEAD? /] + PUSHJ P,FNR."RLINE + SETOM 1FLFLG + MOVE FPNT,C + PUSHJ P,FNR."FNRAA + IRPS R,,T4 T3 SPNT FPNT T2 T1 + POP P,R + TERMIN + SOS (P) + SOS (P) + POPJ P, ;RETRY THE .CALL + +IFOPE3: MOVEI T1,0 + LSHC T1,6 + ADDI T1,40 + .IOT TYOC,T1 + JUMPN T2,IFOPE3 + POPJ P, + +SUBTTL MOOOOBY TABLES + +DEFTAB: 0,,BITSET ;TABLE OF SPECIAL DEFINE FUNCTIONS + "+,,PCINC ;PUT PC INTO VALUE FIELD + "D,,BITSET ;DEFAULT FUNCTION FOR FIELDS + "T,,TIMSET ;DEFAULT FUNCTION FOR TIME FIELD + "P,,PARITY ;PARITY DEFAULT FUNCTION +DEFTND: + +DEFTYP: POINT 2,SYMVAL(SPNT),1 ;"UCODE" OR "DISP" NUMBER +DEFTM1: POINT 4,SYMVAL(SPNT),5 ;TIME VALUE #1 +DEFTM2: POINT 3,SYMVAL(SPNT),8 ;TIME VALUE #2 +DEFPOS: POINT 7,SYMVAL(FPNT),8 ;MICRO WORD POSITION +DEFSIZ: POINT 4,SYMVAL(FPNT),12 ;MICRO WORD FIELD SIZE +DEFVAL: POINT 12,SYMVAL(SPNT),24 ;VALUE OF SYMBOL +DEFFLG: POINT 7,SYMVAL(SPNT),31 ;FLAGS FOR A SYMBOL +DEFFNC: POINT 4,SYMVAL(SPNT),35 ;FUNCTION TO EXECUTE + + ;FIELD NAME FOR MACRO DEFINITIONS + +MACRO: ASCIZ /MACRO%/ + REPEAT NWORDS-2,0 +SWTCH: ASCIZ /SWITCH%/ + REPEAT NWORDS-2,0 + +IFN FTBB,[ +MOVMSK: 1_2 ;FMADR SEL 4 + 1_32.+3_27.+37 ;SCADA DIS, SCADB, SPEC + 0 ? 0 +];END FTBB + +;CHARACTER TABLES +COL==1 +COM==2 +EOL==3 +EQL==4 +QOT==5 +SLSH==6 + +TOKTYP: POINT 3,CHRTAB(C),2 ;GET CHARACTER TYPE FOR TOKEN BUILDER +STAPNT: POINT .SZTRM,CHRTAB(C),2+.SZTRM ;TERM TYPE FOR TOP LEVEL STATE +GETPNT: POINT 7,CHRTAB(C),35 ;CHARACTER TRANSLATION + +IF2 .SHTRM==41-.SZTRM +DEFINE BYTS A,B,C +_41+_.SHTRM+ +TERMIN + + +CHRTAB: ;CHARACTER LOOK UP TABLE + ;FIRST PARAMETER IS CHARACTER TYPE + ;SECOND IS TERMINATOR SUB-TYPE + ;THIRD IS TRANSLATED VALUE +BYTS ,,0 ; NUL +BYTS 7,,1 ; DOWN ARROW +BYTS 7,,2 ; ALPHA +BYTS ,,0 ; EOF CHARACTER (MUST IGNORE) +BYTS 7,,4 ; LOGICAL AND +BYTS 7,,5 ; LOGICAL NOT +BYTS 7,,6 ; EPSILON +BYTS 7,,7 ; PI + +BYTS ,,10 ; BACKSPACE +BYTS ,,40 ; TAB +BYTS ,EOL,12 ; LF +BYTS ,EOL,12 ; VT +BYTS ,EOL,12 ; FF +BYTS ,,00 ; CR +BYTS 7,,16 ; INFINITY +BYTS 7,,17 ; PARTIAL DERIVATIVE +BYTS 7,,20 ; LEFT LUMP +BYTS 7,,21 ; RIGHT LUMP +BYTS 7,,22 ; UP LUMP +BYTS 7,,23 ; DOWN LUMP +BYTS 7,,24 ; FOR ALL +BYTS 7,,25 ; THERE EXISTS +BYTS 7,,26 ; WHEEL +BYTS 7,,27 ; LEFT-RIGHT ARROW + +BYTS 7,,30 ; LEFT ARROW +BYTS 7,,31 ; RIGHT ARROW +BYTS 7,,32 ; NOT EQUAL +BYTS 7,,33 ; ALTMODE +BYTS 7,,34 ; LESS OR EQUAL +BYTS 7,,35 ; GREATER OR EQUAL +BYTS 7,,36 ; EQUIVALENCE +BYTS 7,,37 ; LOGICAL OR + +BYTS 1,,040 ; SP +BYTS 7,,041 ; ! +BYTS ,QOT,042 ; " +BYTS 7,,"# ; # +BYTS ,,"$ ; $ +BYTS ,,"% ; % +BYTS ,,"& ; & +BYTS ,,"' ; ' +BYTS 7,,"( ; ( +BYTS 7,,") ; ) +BYTS 7,,"* ; * +BYTS 3,,"+ ; + +BYTS ,COM,[",] ; , +BYTS 4,,"- ; - +BYTS 2,,". ; . +BYTS ,SLSH,"/ ; / + +BYTS 5,,"0 ; 0 +BYTS 5,,"1 ; 1 +BYTS 5,,"2 ; 2 +BYTS 5,,"3 ; 3 +BYTS 5,,"4 ; 4 +BYTS 5,,"5 ; 5 +BYTS 5,,"6 ; 6 +BYTS 5,,"7 ; 7 + +BYTS 6,,"8 ; 8 +BYTS 6,,"9 ; 9 +BYTS ,COL,": ; : +BYTS ,EOL,073 ; ; +BYTS ,,074 ; < +BYTS ,EQL,"= ; = +BYTS ,,076 ; > +BYTS ,,"? ; ? +BYTS ,,"@ ; @ +BYTS 7,,"A ; A +BYTS 7,,"B ; B +BYTS 7,,"C ; C +BYTS 7,,"D ; D +BYTS 7,,"E ; E +BYTS 7,,"F ; F +BYTS 7,,"G ; G + +BYTS 7,,"H ; H +BYTS 7,,"I ; I +BYTS 7,,"J ; J +BYTS 7,,"K ; K +BYTS 7,,"L ; L +BYTS 7,,"M ; M +BYTS 7,,"N ; N +BYTS 7,,"O ; O + +BYTS 7,,"P ; P +BYTS 7,,"Q ; Q +BYTS 7,,"R ; R +BYTS 7,,"S ; S +BYTS 7,,"T ; T +BYTS 7,,"U ; U +BYTS 7,,"V ; V +BYTS 7,,"W ; W +BYTS 7,,"X ; X +BYTS 7,,"Y ; Y +BYTS 7,,"Z ; Z +BYTS ,,133 ; [ +BYTS ,,"\ ; \ +BYTS ,,135 ; ] +BYTS ,,"^ ; ^ +BYTS 7,,"_ ; _ + +BYTS ,,140 ; ` +BYTS 7,,"A ; A (LOWER CASE) +BYTS 7,,"B ; B +BYTS 7,,"C ; C +BYTS 7,,"D ; D +BYTS 7,,"E ; E +BYTS 7,,"F ; F +BYTS 7,,"G ; G + +BYTS 7,,"H ; H +BYTS 7,,"I ; I +BYTS 7,,"J ; J +BYTS 7,,"K ; K +BYTS 7,,"L ; L +BYTS 7,,"M ; M +BYTS 7,,"N ; N +BYTS 7,,"O ; O +BYTS 7,,"P ; P +BYTS 7,,"Q ; Q +BYTS 7,,"R ; R +BYTS 7,,"S ; S +BYTS 7,,"T ; T +BYTS 7,,"U ; U +BYTS 7,,"V ; V +BYTS 7,,"W ; W + +BYTS 7,,"X ; X +BYTS 7,,"Y ; Y +BYTS 7,,"Z ; Z +BYTS ,,173 ; { +BYTS ,,174 ; | +BYTS ,,175 ; } +BYTS ,,176 ; ~ +BYTS ,,000 ; DEL + +IFN .-CHRTAB-128.,.ERR CHARACTER TABLE MESSED UP + + +IF1,[ + .MXSTA==0 + .MXTOK==0 + .MXTRM==0 + .MXDSP==0 + +DEFINE ITEM STATE,.TOKTYP,.TRMTYP,.DISP,.NSTATE + IRPS TOKTYP,,[.TOKTYP]TRMTYP,,[.TRMTYP]DISP,,[.DISP]NSTATE,,[.NSTATE] + IFG STATE-.MXSTA,.MXSTA==STATE + IFG TOKTYP-.MXTOK,.MXTOK==TOKTYP + IFG TRMTYP-.MXTRM,.MXTRM==TRMTYP + IFG DISP-STDISP-.MXDSP,.MXDSP==DISP-STDISP + IFG NSTATE-.MXSTA,.MXSTA==NSTATE + .STOP + TERMIN +TERMIN ;END OF DEFINE ITEM + +DEFINE EXPAND N + BLOCK 1 +TERMIN ;END OF DEFINE EXPAND +];END OF IF1 + +IF2,[ +DEFINE ITEM STATE,.TOKTYP,.TRMTYP,.DISP,.NSTATE + IRPS TOKTYP,,[.TOKTYP]TRMTYP,,[.TRMTYP]DISP,,[.DISP]NSTATE,,[.NSTATE] + .XE==_.SZTRM+TRMTYP + .XN==36./<.SZDSP+.SZSTA> + .XV==_.SZSTA+NSTATE + INSERT \<.XE/.XN>,\<.XE-.XE/.XN*.XN> + .STOP + TERMIN +TERMIN ;END OF DEFINE ITEM + +DEFINE INSERT Q,R + IFNDEF .ENT!Q,.ENT!Q==0 + .ENT!Q==.ENT!Q+.XV_<36.-*<.SZDSP+.SZSTA>> +TERMIN ;END OF DEFINE INSERT + +DEFINE EXPAND N + IFNDEF .ENT!N,.ENT!N==0 + .ENT!N +TERMIN ;END OF DEFINE EXPAND +];END OF IF2 + +; OLD STATE TOKEN TERM DISP NEW STATE + + ITEM 0, .TKB, EQL, DLBLK, 0 + ITEM 0, .TKS, COL, DTAG, 0 + ITEM 0, .TKN, COL, DLSET, 0 + ITEM 0, .TKS, EQL, DDEFS, 0 + ITEM 0, .TKS, SLSH, DCFLD, 1 + ITEM 0, .TKS, QOT, DMDEF, 0 + ITEM 0, .TKS, EOL, DSUDO, 0 + ITEM 0, .TKS, COM, DMAC, 0 + ITEM 0, .TKB, EOL, DNOP, 0 +;?? ITEM 1, .TKS, EQL, DDEFS, 0 + ITEM 1, .TKB, EQL, DDEFF, 0 + ITEM 1, .TKS, COM, DFSYM, 2 + ITEM 1, .TKS, EOL, DFSYM, 0 + ITEM 1, .TKN, COM, DFNUM, 2 + ITEM 1, .TKN, EOL, DFNUM, 0 + ITEM 2, .TKS, SLSH, DFLD, 3 + ITEM 2, .TKS, COM, DMAC, 2 + ITEM 2, .TKS, EOL, DMAC, 2 + ITEM 2, .TKB, EOL, DNOP, 2 + ITEM 3, .TKS, COM, DFSYM, 2 + ITEM 3, .TKS, EOL, DFSYM, 0 + ITEM 3, .TKN, COM, DFNUM, 2 + ITEM 3, .TKN, EOL, DFNUM, 0 +IFN FTIF,[ ;CONDITIONAL ASSEMBLY STATES + ITEM 4, .TKB, EQL, DCMNT, 4 + ITEM 4, .TKS, COL, DNOP, 4 + ITEM 4, .TKN, COL, DNOP, 4 + ITEM 4, .TKS, EQL, DCMNT, 4 + ITEM 4, .TKS, SLSH, DCFLD, 4 + ITEM 4, .TKS, QOT, DCMNT, 4 + ITEM 4, .TKS, EOL, DCMNT, 4 + ITEM 4, .TKS, COM, DCMNT, 4 + ITEM 4, .TKB, EOL, DCMNT, 4 +];END IFN FTIF + +;STATE MEANING +; 0 START OF LINE/MICROWORD +; 1 SYMBOL/ SCANNED AT START OF LINE/MICROWORD +; 2 COMMA SEEN, SO IN MIDDLE OF MICROWORD +; 3 SYMBOL/ SCANNED IN MIDDLE OF MICROWORD +; 4 ASSEMBLY SUPPRESSED + +DEFINE LOG2 AA,B +IRPS A,,[AA] + A==0 + REPEAT 35.,IFGE B-1_A,A==A+1 +TERMIN +TERMIN ;END OF DEFINE LOG2 + + LOG2 .SZTOK=,.MXTOK + LOG2 .SZSTA=,.MXSTA + LOG2 .SZTRM=,.MXTRM + LOG2 .SZDSP=,.MXDSP + +STAMTB: PINDEX .SZDSP+.SZSTA,STATAB(T1) + +STATAB: ;EXPANSION OF STATE TABLE + REPEAT 1+<1_<.SZSTA+.SZTOK+.SZTRM>/<36./<.SZDSP+.SZSTA>>>,[ + EXPAND \.RPCNT +] + +;FAKED SYMBOL TABLE ENTRIES FOR PSEUDO OPS + +PSUDO%: XWD ..DCD,0 ;FIELD NODE +..DCD: XWD ..UCD,$DCODE ;SYMBOL NODE + ASCII /DISPATCH/ +REPEAT NWORDS-2,0 + +..UCD: XWD .DCODE,$UCODE + ASCII /UCODE/ +REPEAT NWORDS-1,0 + +.DCODE: XWD .SEQAD,$DCODE ;SYMBOL NODE + ASCII /.DCODE/ +REPEAT NWORDS-2,0 + +.SEQAD: XWD .UCODE,$SEQAD + ASCII /.SEQADR/ +REPEAT NWORDS-2,0 + +.UCODE: XWD 0,$UCODE ;END OF PSEUDO-OP TABLE + ASCII /.UCODE/ +REPEAT NWORDS-2,0 + +PSUDM%: XWD .TITLE,0 ;FIELD NODE FOR PSEUDO-MACROS + +.TITLE: XWD .TOC,$TITLE + ASCII /.TITLE/ +REPEAT NWORDS-2,0 + +.TOC: XWD 0,$TOC + ASCII /.TOC/ +REPEAT NWORDS-1,0 + +;FAKED SYMBOL TABLE ENTRIES FOR CONDITIONAL ASSEMBLY OPERATORS + +IFN FTIF,[ +PSUDF%: XWD .CHNG,0 ;FIELD NODE FOR PSEUDO-FIELDS + +.CHNG: XWD .DEFLT,$CHNG + ASCII /.CHANGE/ +REPEAT NWORDS-2,0 + +.DEFLT: XWD .ENDIF,$DEFLT + ASCII /.DEFAULT/ +REPEAT NWORDS-2,0 + +.ENDIF: XWD .IF,$ENDIF + ASCII /.ENDIF/ +REPEAT NWORDS-2,0 + +.IF: XWD .IFNOT,$IF + ASCII /.IF/ +REPEAT NWORDS-1,0 + +.IFNOT: XWD .SET,$IFNOT + ASCII /.IFNOT/ +REPEAT NWORDS-2,0 + +.SET: XWD 0,$SET + ASCII /.SET/ +REPEAT NWORDS-1,0 +];END IFN FTIF + +IMPURE + +.JBFF: HGHIMP ;FIRST FREE LOCATION IN IMPURE +.JBREL: &<-2000> ;FIRST LOCATION IN NXM ABOVE IMPURE + +PAT: +PATCH: BLOCK 40 ;PATCH SPACE, INTENTIONALLY NOT ZERO'D +GOBLT:: ;START OF BLT TO ZERO MEMORY + VARIABLES +VERPOS: BLOCK 1 ;LINE NUMBER ON PAGE +HORPOS: BLOCK 1 ;COLUMN NEXT OUTPUT CHARACTER WILL GO INTO +FLDPNT: BLOCK 1 ;POINTS TO BEGINNING OF SYMBOL TABLE +MAXPOS: BLOCK 2 ;LARGEST BIT POSITION DEFINED FOR MICRO CODE +VALUE: BLOCK MICMXW ;HOLDS BINARY MICRO CODE UNDER CONSTRUCTION +VALSET: BLOCK MICMXW ;1S IN ALL FIELDS WHERE ITEMS INSERTED INTO "VALUE" +TIME1: BLOCK 1 ;TIME VALUE #1 MAXIMUM +TIME2: BLOCK 1 ;TIME VALUE #2 MAXIMUM +VALEND:: ;END OF BLT TO INIT A MICRO WORD +TKZER:: ;BLOCK TO ZERO FOR EACH TOKEN SCAN +TOKMIN: BLOCK 1 ;FLAG NUMERIC TOKEN IS NEGATIVE +TOKOCT: BLOCK 1 ;BUILDING OCTAL VALUE +TOKDEC: BLOCK 1 ; DECIMAL TOKEN VALUE +NUMBER: BLOCK 1 ;NUMERIC RESULT OF TOKEN SCANNER +NAME: BLOCK NWORDS ;ASCII TEXT FOR SYMBOL NAME +TKZEND:: ;END OF BLT TO INIT A TOKEN +FIELD: BLOCK NWORDS ;ASCII TEXT FOR FIELD NAME +PC: BLOCK 2 ;MICRO WORD LOCATION COUNTER +SEQADR: 0 ;NON-ZERO MEANS USE SEQUENTIAL ADDRESSES +STATE: BLOCK 1 ;SYNTAX SCANNER STATE +ENDFIL: BLOCK 1 ;NON-0 INDICATES END OF ALL INPUT DATA +CHRPNT: BLOCK 1 ;HOLDS 0, OR BYTE POINTER FOR RESCANS +INPNT: BLOCK 1 ;BYTE POINTER FOR INPUT FILE +INCNT: BLOCK 1 ;BYTE COUNTER FOR INPUT FILE +OUTPNT: BLOCK 1 ;BYTE POINTER FOR OUTPUT FILE +OUTCNT: BLOCK 1 ;BYTE COUNTER FOR OUTPUT FILE +PDL: BLOCK 100 ;PUSH DOWN LIST +PDLEND:: +PMDL: BLOCK 100 ;STACK FOR RECURSING ON RESCANS +PMEND:: +STTIME: BLOCK 1 ;RUNTIME AT START +SAVACS: BLOCK 16. ;AC STORAGE DURING FATAL ERRORS + +PNTBUF: BLOCK 100./5 ;BUFFER FOR HOLDING LISTING TEXT + PNTMAX==<.-PNTBUF>*5-1 +EOLCHR: BLOCK 1 ;HOLDS LAST CHAR IN PRINT LINE +ERRCNT: BLOCK 1 ;COUNTS MSG UUOS FOR ERRORS +PAGNUM: BLOCK 1 ;SOURCE PAGE NUMBER IN RIGHT HALF + ;-1 IN LEFT IS FLAG TO PRINT HEADER +TTLPNT: BLOCK 1 ;ADDRESS OF TITLE TEXT +TOCPNT: BLOCK 1 ;LIST POINTER TO TABLE OF CONTENTS +HDRPNT: BLOCK 1 ;ADDRESS OF HEADER TEXT +LINNUM: BLOCK 1 ;SOURCE LINE NUMBER +FRECNT: BLOCK 1 ;COUNT OF REQUIRED CONSECUTIVE MICRO WORDS +LOCPAT: BLOCK 1 ;BIT PATTERN FOR LOCATION ASSIGNMENTS +LOCAST: BLOCK 1 ;BIT PATTERN FOR *'S IN LOCATION PATTERN +PNTCNT: BLOCK 1 ;COUNT OF NUMBER OF CHARS IN PNTBUF +PNTPNT: BLOCK 1 ;BYTE POINTER INTO PNTBUF FOR LISTING +JEQL: BLOCK 1 ;HOLDS LIST HEADER FOR EQUAL TAGS +PRNTPC: BLOCK 2 ;HOLDS PC FOR ASSEMBLY LISTING +WRDCNT: BLOCK 2 ;COUNT OF MICRO WORDS USED +LOOSPC: BLOCK 2 ;COUNT OF PC WORDS WITH NO ADR RESTRICTIONS +HIGHPC: BLOCK 2 ;HIGHEST LOCATION ASSIGNED +MACPNT: BLOCK 2 ;ADDRESSES OF "MACRO%" FIELD HEADERS +JPNT: BLOCK 2 ;ADDRESSES OF "J" FIELD HEADERS +SWTPNT: BLOCK 1 ;ADDRESS OF "SWITCH%" FIELD HEADER +SUPSYM: BLOCK 1 ;ADDRESS OF SYMBOL TABLE ENTRY FOR + ;SYMBOL WHICH TURNED OFF ASSY +USAGE: BLOCK MAXPC/36.+1 ;HOLDS 1S FOR EVERY MICRO WORD USED +USGEND:: +DTABL: BLOCK MAXDSP/2 ;EACH HALF,LINE # AT WHICH WORD DEFINED + BLOCK 1 ;PCTABL-1 FOR CHAINING TO FIRST WORD +PCTABL: BLOCK MAXPC ;LH, LINE # AT WHICH THIS MICRO-WORD DEFINED + ;RH, NEXT MICRO-WORD ADDR ASSEMBLED AFTER THIS + ; IE, DEFAULT VALUE FOR J FIELD + ;ZERO IF THIS LOC'N NOT ASSEMBLED INTO +PCTEND:: ;TABLE FOR DEFAULT PC'S + +JCL: BLOCK 100./5 ;JCL BUFFER +JCLE: 0 +JCLFNC: -1 ;FENCE +DISTTY: 0 ;-1 IF %TOERS +I.MAXC: BLOCK 1 ;COUNT OF NUMBER OF INPUT FILES +I.CNT: BLOCK 1 ;FILE COUNTER USED BY ALLIN +1FLFLG: 0 ;NON-ZERO FNR READING ONLY ONE FILE + +O.DEV: BLOCK 1 +O.NAM: BLOCK 1 +O.EXT: BLOCK 1 +O.PPN: BLOCK 1 +O.LEN==.-O.DEV + +I.DEV==0 ;INPUT DEVICE +I.NAM==1 ;INPUT FILE NAME/MASK +I.EXT==2 ;INPUT EXTENSION +I.PPN==3 ;INPUT PPN +I.LEN==4 ;LENGTH OF INPUT FILE DESCRIPTOR BLOCK + +I.STG: BLOCK 20.*I.LEN ;INPUT FILE DESCRIPS + +BUFL==200 +INBUF: BLOCK BUFL +OUTBUF: BLOCK BUFL + +OUTFIL: BLOCK 5 ;SAVED STUFF FOR OUTPUT FILE +INFILE: BLOCK 5 ;SAVED STUFF FOR CURRENT INPUT FILE + F.DEV==0 ;DEVICE NAME + F.NAM==1 ;FILE NAME + F.EXT==2 ;FILE NAME 2 + F.TIM==3 ;FILE DATE ITS FORMAT + F.PPN==4 ;FILE DIRECTORY + +RCHST: BLOCK 10. ;FOR .RCHST + +ENDBLT: ;END OF BLT TO ZERO MEMORY + +SUBTTL COMMAND LINE SCANNER + + PURE + +FNR.: .BEGIN + +A=1 +B=2 +C=3 +D=4 + SETZM JCL + MOVE A,[JCL,,JCL+1] + BLT A,JCLE + SETOM JCLFNC + .SUSET [.ROPTION,,A] + TLNE A,OPTCMD + .BREAK 12,[5,,JCL] + PUSHJ P,FNRLIN ;PROCESS COMMAND LINE + SKIPN I.MAXC ;SEE IF GOT ANYTHING + SKIPE O.DEV + POPJ P, ;YUP, OK + .IOT TYOC,["*] + PUSHJ P,RLINE ;NO, READ A LINE FROM TTY + PUSHJ P,FNRLIN + SKIPN I.MAXC + SKIPE O.DEV + POPJ P, + EXIT ;NOTHING FROM TTY, EXIT + +; READ A LINE FROM TTY INTO JCL + +RLINE: MOVE D,[010700,,JCL-1] +RLINE0: .IOT TYIC,A + CAIE A,177 + JRST RLINE1 + CAMN D,[010700,,JCL-1] + JRST [ .IOT TYOC,[15] ? JRST RLINE0 ] + LDB A,D + MOVEI B,0 + DPB B,D + ADD D,[070000,,] + SKIPGE D + SUB D,[430000,,1] + SKIPN DISTTY + JRST [ .IOT TYOC,A ? JRST RLINE0 ] + .IOT TYOC,[^P] + .IOT TYOC,["X] + JRST RLINE0 + +RLINE1: CAIE A,^L + JRST RLINE2 + .IOT TYOC,[15] + MOVE C,[010700,,JCL-1] +RLIN1A: CAMN C,D + JRST RLINE0 + ILDB A,C + .IOT TYOC,A + JRST RLIN1A + +RLINE2: CAIE A,^M + CAIN A,^C + CAIA + JUMPN A,RLINE3 + MOVEI A,0 + IDPB A,D ;END HERE + POPJ P, + +RLINE3: IDPB A,D + JRST RLINE0 + +;GET OUTPUT AND INPUT FILE SPECS FROM JCL + +FNRLIN: SETZB FPNT,I.MAXC ;FPNT INDEX INTO I.STG + ADDI FPNT,I.STG ;WELL I REALLY WANTED A POINTER I GUESS + SETZM O.DEV + SETZM O.NAM + SETZM O.EXT + SETZM O.PPN +FNRAA: MOVE SPNT,[000700,,JCL-1] ;SPNT BP TO JCL +FNR0: SETZM I.DEV(FPNT) ;HERE FOR NEXT FILE + SETZM I.NAM(FPNT) + SETZM I.EXT(FPNT) + SETZM I.PPN(FPNT) +FNR1: SETZM D ;HERE FOR NEXT SYLLABLE + MOVE C,[440600,,D] +FNR2: ILDB A,SPNT ;HERE FOR NEXT CHARACTER + CAIGE A,40 + JRST FNREND + CAIN A,"; + JRST FNRSEM + CAIN A,": + JRST FNRCOL + CAIN A,", + JRST FNRSEP + CAIN A," + JRST FNRSPC + CAIE A,"= + CAIN A,"_ + JRST FNROUT + CAIGE A,140 + SUBI A,40 + TLNE C,770000 + IDPB A,C + JRST FNR2 + +FNRSEM: MOVEM D,I.PPN(FPNT) + JRST FNR1 + +FNRCOL: MOVEM D,I.DEV(FPNT) + JRST FNR1 + +FNRSPC: MOVEM D,I.NAM(FPNT) + JRST FNR1 + +FNREND: MOVEI A,400000 + JRST FNRSEP + +FNROUT: SETOM A + CAIE FPNT,I.STG + MSG [EXIT],OUTPUT FILE MUST COME FIRST +FNRSEP: JUMPE D,FNRSP1 + SKIPN I.NAM(FPNT) + JRST [ MOVEM D,I.NAM(FPNT) + JRST FNRSP1 ] + MOVEM D,I.EXT(FPNT) +FNRSP1: MOVSI D,(SIXBIT/>/) ;APPLY DEFAULTS + SKIPGE A + MOVSI D,(SIXBIT/MCR/) + SKIPN I.EXT(FPNT) + MOVEM D,I.EXT(FPNT) + MOVSI D,(SIXBIT/DSK/) + CAIE FPNT,I.STG + MOVE D,I.DEV-I.LEN(FPNT) + SKIPN I.DEV(FPNT) + MOVEM D,I.DEV(FPNT) + CAIE FPNT,I.STG + SKIPA D,I.PPN-I.LEN(FPNT) + .SUSET [.RSNAM,,D] + SKIPN I.PPN(FPNT) + MOVEM D,I.PPN(FPNT) + SKIPE 1FLFLG + POPJ P, + JUMPL A,FNROU1 + SKIPE I.NAM(FPNT) ;SKIP IF BLANK LINE + AOS I.MAXC + CAIN A,400000 + JRST FNREN1 ;END OF LINE + ADDI FPNT,I.LEN + CAIGE FPNT,I.STG+20.*I.LEN + JRST FNR0 + MSG [EXIT],ONLY 20. INPUT FILES ALLOWED + +FNROU1: IRPS SYL,,[DEV NAM EXT PPN] + MOVE D,I.!SYL(FPNT) + MOVEM D,O.!SYL + TERMIN + JRST FNR0 + +FNREN1: POPJ P, + + .END FNR. + +LIT..: +CONSTANTS + +IMPURE +VARIABLES + +PURE +IMPURE + +IF1,[ +DEFINE INFORM A,B +PRINTX\A=B +\ +TERMIN + +INFORM HIGHEST IMPURE USED,\%%LOW +INFORM HIGHEST PURE USED,\%%HIGH +] + +HGHIMP=%%LOW + +;PUT PURIFICATION CODE IN LOW IMPURE. WIPED OUT BY SYMBOLS. + + 0 + NPURPG==<%%HIGH-400000+1777>/2000 ;NUMBER OF PURE PAGES +IF2, NNXMPG==200-/2000 ;NUMBER OF NXM PAGES BETWEEN LOW AND HIGH + +PURIFY::MOVE T1,[-NPURPG,,200] + .CALL [ SETZ + 'CORBLK + MOVEI %CBRED+%CBNDR + MOVEI -1 + MOVE T1 + SETZI -1 ] + .VALUE + MOVE T1,[-NNXMPG,,/2000] + .CALL [ SETZ + 'CORBLK + MOVEI 0 + MOVEI -1 + SETZ T1 ] + .VALUE + .VALUE [ASCIZ/:PDUMP TS MICRO/] +CONSTANTS +PURIFE:: + END MICRO + \ No newline at end of file