TITLE DDT60 -- PROGRAM TO DEBUG DN60'S -- V1(51) ; Revision History ; 1(50) 24-Mar-79 JW Add code to run on a 2020 ; 1(51) 7-May-79 SMJ Change 2020 code to conditionally execute at run time. ; 1(52) 16-May-79 Fix ASJFN so it doesn't use FE0: ;DDT60 VERSION NUMBER ; VWHO==0 ;WHO LAST EDITED VDDT60==1 ;MAJOR VERSION NUMBER VMINOR==0 ;MINOR VERSION NUMBER VEDIT==52 ;EDIT NUMBER ; IFN FTJSYS,< SEARCH MONSYM,MACSYM,MACTEN SALL> FLG=0 F.FLIP==000001 F.FLOP==000002 F.LOPN==000004 ;CURRENT LOCATION IS OPEN F.MOPN==000010 ;MASK OPEN F.MASK==000020 ;ESCAPE M TYPED F.ENDL==000100 ;END OF INPUT LINE (GIVE PROMPT) F.IOCT==000200 ;ASSEMBLING AN OCTAL NUMBER F.IDEC==000400 ;ASSEMBLING A DECIMAL NUMBER F.IHEX==001000 ;ASSEMBLING A HEX NUMBER F.ISIX==002000 ;ASSEMBLING A SIXBIT SYMBOL F.SYMB==004000 ;ASSEMBLING A SYMBOL F.CACH==010000 ;USE CACHE IF POSSIBLE F.WRIT==020000 ;WE ARE OPENING FILE FOR OUTPUT F.LOCK==040000 ;PROGRAM IS LOCKED F.WENB==100000 ;PATCHING WAS ENABLED WITH /PATCH F.PDP8==200000 ;WORKING WITH 8'S INSTEAD OF 11'S F..ESC==400000 ;TYPED ESCAPE TWICE T1=1 T2=T1+1 T3=T2+1 T4=T3+1 T5=T4+1 DOT=6 ;CURRENT LOCATION DOTFOO=7 ;IN CASE IS 32 OR 48 BIT INSTRUCTION P1=10 ;FOR PASSING ARGS AROUND SUBR EXPRESS=11 ;BUILD EXPRESSIONS IN THIS AC STATE=12 SYM=13 ;PONTER TO SYMBOL BLOCK SYMBOL=14 ;CURRENT SYMBOL WE ARE BUILDING P=17 OPDEF CAL11. [CALLI 125] OPDEF NODE. [CALLI 157] OPDEF PJRST [JRST] INTERNAL .JBVER .JBVER==137 LOC .JBVER BYTE (3)VWHO(9)VDDT60(6)VMINOR(18)VEDIT RELOC 0 EXMAX=140 ;MAXIMUM NUMBER OF BYTES TO EXAMINE AT ONCE IFNDEF FT2SEG < FT2SEG=0 ;IF NONZERO MAKE 2 SEGMANT PROGRAM > IFNDEF FTPROM ;IF NONZERO INCLUDE CODE TO PUNCH ROMS. IFN FTPROM < IFNDEF ROMTYP ;END OF IFNDEF ROMTYP >;END OF IFN FTPROM COMMENT % DDT60 VERSION 1 -- DERIVED FROM DDT11 VERSION 1 INITIAL SWITCHES: /BINARY:FILSPEC READ A ".BIN" FILE (OUTPUT FROM MACDLX) /DUMP:FILESPEC READ A CORE DUMP LISTING (OUTPUT OF BOOT11 OR NETLDR) /DIMAGE:FILESPEC READ A CORE IMAGE FILE (OUTPUT OF DTELDR OR DASLOD) /EXIT RETURN TO MONITOR /LINE SPECIFY LINE FROM NODE (SIMILAR TO NETLDR) /NODE SPECIFY NODE TO DEBUG OR (WITH /LINE) NODE ADJACENT TO NODE TO DEBUG /PATCH ALLOW WRITING INTO CORE /PDP8 REMOTE CPU IS A PDP-8 (I.E., DC71 OR DC72) (THIS FACILITY ONLY PARTIALLY IMPLEMENTED) /PORT SPECIFY DL10 PORT FOR DC76, DN85, DN87 OR DAS60. (0-3 ON DL10 NUMBER 1, 4-7 ON DL10 NUMBER 2, 10-13 ARE DTE 0-3.) /SYMBOLS:FILESPEC READ SYMBOL TABLE FROM A CROSS-REFERENCE LISTING. (OUTPUT FROM MACDLX) NOTE: /BINARY, /DUMP, /DIMAGE, /NODE AND /PORT CAUSE IMMEDIATE EXIT FROM INITIAL DIALOG, WITHOUT PROCESSING ANY SUBSEQUENT TEXT ON THE LINE. DEBUGGING LANGUAGE: THE LANGUAGE MIMICS DDT-10 FOR EXAMINING MEMORY AND BUILDING SYMBOLS. SPECIAL FUNCTIONS ARE INTRODUCED BY "ESC". NUMERIC ARGUMENTS GO BETWEEN THE "ESC" AND THE LETTER. LOWER CASE LETTERS ARE PERMITTED. THE NOTATION "TEMP/PERM" MEANS THE MODE IS SET UNTIL A CARRIAGE RETURN IS INPUT UNLESS IT IS INTRODUCED BY TWO "ESC"S, JUST AS IN DDT-10. THE FOLLOWING IS THE LIST OF FUNCTION LETTERS INTRODUCED BY "ESC". A SET "ADDRESS" TYPEOUT MODE. TEMP/PERM. ARG=LENGTH B SET "BYTE" TYPEOUT MODE. TEMP/PERM. ARG=LENGTH C SET "NUMERIC" (CONSTANT) TYPEOUT MODE. TEMP/PERM. ARG=LENGTH D DUMP MEMORY ONTO A FILE. THE RANGE IS SPECIFIED AS: LOWESC D. ARG = DUMP TYPE: 0 = NORMAL, 1 = NO INSTRUCTION TYPEOUT G CAUSE CPU TO BRANCH TO EXPRESSION. (ONLY WITH /NODE) I SET "EBCDIC" OUTPUT MODE. TEMP/PERM. ARG=LENGTH K SUPPRESS TYPEOUT OF PRECEEDING SYMBOL. M LOCATION FOR "MASK" FOR SEARCHES N "NOT WORD" SEARCH FOR PRECEEDING EXPRESSION. SEARCH IS MASKED BY LOCATION "$M" AND LIMITED BY RANGE, EXPRESSED AS FOR $D. P PUNCH BINARY TAPE OF CORE IMAGE (NOT YET IMPLEMENTED) R SET RADIX IN RANGE 2 TO 15. TEMP/PERM. ARG=RADIX S SET "INSTRUCTION" OUTPUT MODE (DEFAULT). TEMP/PERM. ARG=LENGTH T SET "ASCII" OUTPUT MODE. TEMP/PERM. ARG=LENGTH V WATCH OPEN LOCATION, TYPE OUT CHANGES, STOP WHEN CARRIAGE RETURN TYPED. W "WORD" SEARCH, SIMILAR TO $N. % ; IFN FTJSYS,< ; THE FOLLOWING DATA STRUCTURE IS USED FOR SENDING AND RECEIVING ; DATA TO/FROM THE FRONT-END PDP-11 ; DEFSTR(D10DF,SBUF,^D15,^D16) ;FUNCTION FOR SENDING TO FE DEFSTR(D10AD,SBUF,^D31,^D16) ;ADDRESS FOR EX/DEP FUNCTION DEFSTR(D10DT,SBUF+1,^D15,^D16) ;DATA FOR DEPOSIT ; DEFSTR(D11RS,RBUF,^D7,^D8) ;RESULT CODE FROM FE DEFSTR(D11DF,RBUF,^D15,^D8) ;FUNCTION CODE DEFSTR(D11AD,RBUF,^D31,^D16) ;ADDRESS FOR EX/DEP DEFSTR(D11DT,RBUF+1,^D15,^D16) ;DATA FOR EXAMINE ; DEXFUN=11 ;EXAMINE FUNCTION DEPFUN=12 ;DEPOSIT FUNCTION > IFN FT2SEG < TWOSEG RELOC 400000 > DDT60: JFCL RESET SETZ 0, ;ZERO FIRST AC MOVEI 17,1 ;MAKE BLT POINTER BLT 17,17 ;CLEAR ALL AC'S MOVE P,[IOWD PDLEN,PDL] PUSHJ P,IDTYPE ;IDENTIFY OURSELF PUSHJ P,CRLTYP ;END WITH A FLOURISH MOVE T1,[0,,0] ;DEFAULT OUTPUT MODE IS SYMBOLIC MOVEM T1,O.MODE SETZM MEMORY SETZM CACHEL ;HIGHEST ADDR IN CACHE SETZM NODE ;HAVEN'T SPECIFIED NODE YET SETZM LINE ;OR LINE ON NODE JRST INI.03 INI.00: OUTSTR [ASCIZ \ ?Respond with /PORT:#, /NODE:#, /NODE:name, /BINARY:filespec, /DIMAGE:filespec or /DUMP:filspec\] CLRBFI ;FLUSH TYPEAHEAD INI.03: TRZ FLG,F.ENDL ;DONT CARE IF END OF LINE OUTSTR [ASCIZ \ Input: \] INI.XX: TRZE FLG,F.ENDL ;END OF LINE? JRST INI.03 ;YES, GIVE PROMPT AGAIN. PUSHJ P,SIXIN ;SHOULD RETURN JUST "/" JRST INI.00 JUMPN T1,INI.00 CAIN T5,15 ;END OF LINE? JRST INI.03 ;YES, GIVE PROMPT AGAIN. CAIE T5,"/" JRST INI.00 INI.YY: PUSHJ P,SIXIN ;GET COMMAND JRST INI.00 MOVNI T2,1 ;BUILD MASK INI.04: MOVSI T3,-4 INI.05: SKIPN T4,[ SIXBIT \BINARY\ ;FILE IS BINARY SIXBIT \DUMP\ ;FILE IS A DUMP SIXBIT \DIMAGE\ ;FILE IS A DUMP IMAGE SIXBIT \EXIT\ ;EXIT TO MONITOR SIXBIT \LINE\ ;SPECIFY LINE FROM NODE SIXBIT \NODE\ ;SPECIFY NODE TO DEBUG SIXBIT \PATCH\ ;ENABLE PATCHING SIXBIT \PDP8\ ;DO PDP-8'S, NOT PDP-11'S SIXBIT \PORT\ ;SPECIFY PORT OF LOCAL PDP-11 SIXBIT \SYMBOL\ ;SPECIFY FILE OF SYMBOLS Z ](T3) JRST INI.06 AND T4,T2 CAMN T1,T4 ;MATCH ? JRST INI.08 ;FOUND MATCH AOJA T3,INI.05 ;ON TO NEXT ENTRY INI.06: LSH T2,6 ;ADJUST MASK JUMPN T2,INI.04 JRST INI.00 ;DON'T UNDERSTAND INI.08: JRST @[ SETBIN ;/BINARY SETDMP ;/DUMP SETIMG ;/DIMAGE SETXIT ;/EXIT SETLIN ;/LINE SETNOD ;/NODE SETWEN ;/PATCH SETPD8 ;/PDP8 SETPRT ;/PORT RSYMB ;/SYMBOL ](T3) ;HERE BECAUSE FILE TO BE READ IS BINARY TAPE SETBIN: TRO FLG,F.FLOP PUSHJ P,RDDUMP ;READ THE BINARY FILE JRST LEVL.0 ;GO DEBUG IT ;HERE BECAUSE FILE TO BE READ IS NETLDR (OR EQUIVALENT) DUMP SETDMP: TRZ FLG,F.FLOP PUSHJ P,RDDUMP ;READ THE DUMP FILE JRST LEVL.0 ;GO DEBUG IT ;HERE FOR /DIMAGE SETIMG: PUSHJ P,RDDIMG ;READ DUMP IMAGE JRST LEVL.0 ;GO DEBUG IT ;HERE FOR /PATCH SETWEN: TRO FLG,F.WENB ;ENABLE PATCHING JRST SET.X9 SETLIN: PUSHJ P,SIXIN ;GET LINE ARGUMENT JRST INI.00 PUSHJ P,SIXOCT ;CONVERT TO NUMBER JFCL AOS T1 MOVEM T1,LINE SET.X9: CAIE T5,"/" JRST INI.XX JRST INI.YY SETPD8: TRO FLG,F.PDP8 JRST SET.X9 SETNOD: PUSHJ P,SIXIN ;GET NODE ARGUMENT JRST INI.00 PUSHJ P,SIXOCT ;CONVERT TO NUMBER JFCL MOVEM T1,NODE ;SAVE NODE NAME MOVEI T1,1 ;CODE TO LOCK LOCK T1, JRST LOCKER TRO FLG,F.LOCK ;REMEMBER WE DID JRST LEVL.0 ; SETPRT: PUSHJ P,SIXIN ;GET SIXBIT ARGUMENT JRST INI.00 PUSHJ P,SIXOCT ;CONVERT TO OCTAL JRST INI.00 CAILE T1,13 ;UNREASONABLE? JRST INI.00 ;YES, REJECT. MOVEM T1,PORT# ;NO, SAVE PORT NUMBER IFN FTJSYS,< PUSHJ P,ASJFN ;GET JFN FOR FE DEVICE > JRST LEVL.0 RSYMB: PUSHJ P,RDSYMB ;READ IN SYMBOLS MOVE T5,LASCAR ;RETRIEVE LAST CHAR INPUT JRST SET.X9 ;AND LOOK FOR MORE SWITCHES SETXIT: EXIT ;EXIT TO THE MONITOR IFN FTJSYS,< ; THIS SECTION OF CODE ASSIGNS A JFN TO DEVICE FE ; OPENS IT AND SPECIFIES ITS FRONT-END ; ASJFN: SKIPN APRNUM ; Check for proccessor type known yet PUSHJ P,PRCTYP ; No .. go get it SKIPN KSFLG ; Check for a 2020 JRST ASJF.1 ; No .. go do SIN/SOUT type FE I/O MOVE T1,PORT# ;GET THE PORT NUMBERT SUBI T1,10 ;GET THE DMC LINE # MOVEM T1,D60JFN ;STORE AS THE "JFN" POPJ P, ;RETURN TO CALLER ASJF.1: SETZB P1,D60JFN ;INITIALIZE PTR TO JFN MOVEI P1,1 ; Start looking at FE1: D60ST2: MOVE T1,[POINT 7,D60BUF] ;BUFFER TO HOLD JFN MOVEI T2,"F" ;STICK FE FOR DEVICE IN THE BUFFER IDPB T2,T1 ;IN THE JFN MOVEI T2,"E" ;PUT IN E OF THE "FE" IDPB T2,T1 ;IN THE JFN BUFFER LDB T2,[POINT 3,P1,32] ;3-BIT BYTE PTR JUMPE T2,D60ST3 ADDI T2,"0" ;FOR FE 0 IDPB T2,T1 ;PUT IN THE JFN D60ST3: LDB T2,[POINT 3,P1,35] ;BUILD A 3-BIT BYTE PTR ADDI T2,"0" ;FOR FE "0" IDPB T2,T1 ;DEPOSIT IN JFN MOVEI T2,":" ;COMPLETES DEVICE NAME IDPB T2,T1 ;IN THE JFN SETZ T2, ;ZERO BYTE AT THE END IDPB T2,T1 ;IN THE JFN MOVX T1,GJ%OLD!GJ%SHT ;OLD FILE,SHORT JFN HRROI T2,D60BUF ;BUFFER TO HOLD JFN GTJFN ;GO GET JFN FOR FE DEVICE ERJMP D60ST4 ;UNABLE TO GET JFN FOR THIS FE# MOVEM T1,D60JFN ;GOT IT ,SAVE JFN PUSHJ P,ENQDEV ;LOCK DEVICE FOR OUR USE MOVE T1,D60JFN ;FET JFN IN T1 MOVX T2,<^D8>B5!OF%RD!OF%WR ;WRITE ,READ,8 LONG JFN OPENF ;OPEN THE DEVICE ERJMP D60ST5 ;UNABLE TO OPEN THIS DEVICE MOVX T2,.MODTE ;FUNCTION CODE TO GET DTE FE MOVE T3,PORT# ;GET THE PORT NO SUBI T3,10 ;GET THE DTE# MTOPR ;GET A DTE FE ERJMP FATAL ;MUST NOT HAPPEN PUSHJ P,DEQDEV ;RELEASE DEVICE IF LOCKED POPJ P, ;RETURN TO CALLER ; ; ;SUBROUTINE TO RELEASE A DEVICE IF LOCKED ; DEQDEV: SKIPN ENQFLG ;DO WE HAVE THE DEVICE LOCKED? JRST DQEXIT ;NO,JUST EXIT SETZM ENQFLG ;FLAG DEVICE RELEASED MOVX T1,.DEQDR ;DEQ FUNCTION CODE MOVEI T2,ENQBLK ;POINT TO THE FUN BLOCK DEQ ;UNLOCK THE DEVICE ERJMP FATALQ ;DEQ FAILED DQEXIT: POPJ P, ;RETURN ; ENQDEV: MOVE T1,PORT# ;GET THE PORT NO DPB T1,[POINT 3,ENQBUF+1,20] ;AND PUT IN LOW ORDER DIGIT LSH T1,-3 ;GET NEXT DIGIT DPB T1,[POINT 3,ENQBUF+1,13] ;PUT IN HIGH DIGIT MOVX T1,.ENQBL ;ENQ FUNCTION CODE MOVEI T2,ENQBLK ;POINT TO ARGUMENT BLOCK ENQ ;REQUEST ACCESS OF RESOURCE ERJMP [ CAIE T1,ENQX6 ;LOCK ALREADY REQUESTED? PJRST FATAL ;FATAL ERROR MOVEI T1,^D500 ;SLEEP FOR 1-SECOND DISMS ;SLEEP JSYS JRST ENQDEV ] ;TRY AGAIN SETOM ENQFLG ;FLAG THAT WE GOT DEVICE POPJ P, ;RETURN ; ; ;HERE IF THE GTJFN FAILS ; D60ST4: CAIE T1,GJFX29 ;DEVICE NOT AVAILABLE JRST D60STK ;NO,SOMETHING'S WRONG AOJA P1,D60ST2 ;YES,TRY NEXT FE DEVICE ; ; HERE IF OPENF FAILS ; D60ST5: CAIE T1,OPNX9 ; Simultanoues access or CAIN T1,OPNX7 ; device not available? CAIA ; Yes .. so clean up and move to next one JRST D60STK ; No, something's wrong MOVE T1,D60JFN ; Release the JFN RLJFN ; JSYS to do release ERJMP D60STK ; JSYS error in release PUSHJ P,DEQDEV ; Unlock the device AOJA P1,D60ST2 ; Get another JFN ; ; HERE IF A FATAL JSYS ERROR ; D60STK: JRST FATAL ;FATAL ERROR ; FATAL: PUSHJ P,DEQDEV ;UNLOCK DEVICE IF LOCKED FATALQ: HRROI T1,[ASCIZ/ ?/] PUSHJ P,ERROR ;GO TO PRINT THE ERROR HALTF ;STOP ; ERROR: PSOUT ;PUT OUT THE STRING MOVE T1,[.PRIOU] ;OUTPUT DEVICE FOR ERROR MESSAGES MOVE T2,[.FHSLF,,-1] ;CURRENT FORK,,LAST ERROR SETZB T3,T4 ;NO LIMIT,FULL MESSAGE ERSTR ;JSYS TO OUTPUT ERROR MESSAGE JFCL ;IGNORE UNDEFINED ERROR NUMBER JFCL ;IGNORE ERROR DURING EXECUTION OG ERSTR POPJ P, ;RETURN TO CALLER ; ENQFLG: BLOCK 1 ;IF NON-ZERO,WE HAVE DEVICE ENQBLK: XWD 1,5 ;1 LOCK,,LENGH IS 5 XWD 0,0 ;CHN 0,,ID EXP EN%BLN+EN%LTL+<0,,-3> ;FLAGS,,WHEEL OR OPR POINT 7,ENQBUF ;STRING POINTER XWD 0,0 ;1 RESOURCE,,NO OF ACCESSES ; ENQBUF: ASCIZ \DN60-P00\ ;BUILD ENQ/DEQ STRING HERE ; > LEVL.0: OUTSTR [BYTE (7)15,12,0] LEVEL0: SETZM OHD TRZ FLG,F.LOPN!F.MASK!F.MOPN!F.CACH!F.WRIT HLRS ORADIX ;RESET OUTPUT RADIX HLRS O.MODE ;RESET CURRENT OUTPUT MODE FROM PERMANENT HLRS BYTCNT ;RESET REPETITION COUNT LEVEL1: MOVE P,[IOWD PDLEN,PDL] TRZ FLG,F.SYMB!F.IOCT!F.IDEC!F.IHEX LEVEL2: MOVEI STATE,STATE0 ;DISPATCH TABLE WHEN IDLE LEVEL3: TRZ FLG,F..ESC SETZM INPOPR ;CLEAR INPUT OPERATOR SETZM EXPRESS ;EXPRESSION WE HAVE BUILT SETZM OCTIN# SETZM DECIN# SETZM HEXIN# SETZM SYMBOL MOVE T4,[POINT 6,SYMBOL] LOOP: PUSHJ P,GETCHR ;GET A COMMAND CHAR MOVEM T1,T2 ADD T2,STATE JRST @(T2) ;DISPATCH ON CHARACTER ;HERE WHEN USER TYPES IN AN ILLEGAL CHARACTER ILLCHR: OUTSTR [BYTE (7)7,"?",7,11,7,0] CLRBFI ;CLEAR TYPEAHEAD JRST LEVEL1 ;HERE WHEN THE USER TYPES A TAB COMMAND COMHT: OUTSTR [BYTE (7)15,12,0] SKIPN DOT,LSTADR ;IN CASE SET IN FUNNY WAY MOVE DOT,DATA ;LAST DATA BECOMES ADR JRST COMLF1 ;HERE WHEN THE USER TYPES A LINE FEED COMMAND COMLF: SKIPE DOTFOO MOVE DOT,DOTFOO SETZM DOTFOO OUTCHR [15] ;CARRIAGE RETURN ADDI DOT,2 COMLF1: TRO FLG,F.LOPN ;FLAG LOCATION IS OPEN ANDI DOT,177776 ;FLUSH EXTRA BITS MOVE T1,DOT PUSHJ P,ADRTYP ;TYPE ADR MOVEI T1,"/" PUSHJ P,TYPCHR COMLF2: CAMGE DOT,CACHEL ;IS THIS ALREADY IN CACHE ? SETZM CACHEL ;YES SO FLUSH CACHE PUSHJ P,TABTYP TRO FLG,F.CACH ;USE CACHE AFTER 1ST WORD PUSHJ P,DATYPE JRST LEVEL2 ;HERE WHEN USER TYPES = EQUALS: TRNN FLG,F.LOPN ;IS LOCATION OPEN ? JRST ILLCHR ;NO SO ILLEGAL PUSH P,O.MODE ;SAVE OUTPUT MODE MOVEI T1,2 ;OUTPUT AS NUMERIC HRRM T1,O.MODE PUSH P,BYTCNT SKIPN T5,DOTFOO HRRZ T5,DOT SUBI T5,-2(DOT) ANDI T5,777777 ;HALF WORD ONLY LSH T5,-1 HRRM T5,BYTCNT PUSH P,DOTFOO SETZM DOTFOO TRO FLG,F.CACH ;USE CACHE IF POSSIBLE PUSHJ P,DATYPE ;TYPE DATA POP P,DOTFOO POP P,BYTCNT POP P,O.MODE ;RESTORE OUTPUT MODE JRST LOOP ;HERE WHEN USER TYPES / AT END OF A NUMBER OPNLOC: TRZE FLG,F.MASK ;ASKING ABOUT THE MASK ? JRST [ PUSHJ P,TABTYP HRRZ T1,S.MASK ;GET THE MASK PUSHJ P,RADTYP ;DISPLAY IT TRO FLG,F.MOPN ;MAKS NOW OPEN PUSHJ P,TABTYP JRST LEVEL2 ] PUSHJ P,ACCUM HRRZ DOT,EXPRESS SETZM DOTFOO TRO FLG,F.LOPN ;FLAG LOCATION IS OPEN JRST COMLF2 ;HERE WHEN USER TYPES A RUBOUT COMRUB: OUTSTR [ASCIZ \xxx \] JRST LEVEL1 ;HERE WHEN THE USER TYPES AN UP ARROW COMMAND COMARR: OUTSTR [BYTE (7)15,12,0] SETZM DOTFOO HRRZ T1,BYTCNT ;NUMBER OF BYTES HRRZ T2,O.MODE ;GET OUTPUT MODE JUMPE T2,COMAR0 ;SYMBOLIC ? CAIN T2,1 ; OR ADDRESS ? ASH T1,1 ;CONVERT WORD COUNT TO BYTES CAIN T2,2 ;OR NUMERIC ASH T1,1 ;CONVERT WORD COUNT TO BYTES SUBI DOT,(T1) JRST COMLF1 ;REST LIKE A LINE FEED COMMAND ;HERE IF DID UP ARROW WHEN IN SYMBOLIC MODE ; TRY TO MAKE A GUESS HOW FAR BACK TO GO COMAR0: ANDI DOT,177776 ;INSTRUCTIONS BEGIN ON WORD BOUNDRY TRZ FLG,F.CACH ;DON'T USE CACHE MOVEI T4,1 ;TRY ONE WORD INSTRUCTION FIRST ;HERE TO COUNT WORDS IN INSTRUCTION COMAR1: MOVE T2,T4 ;NUMBER OF WORDS TO LOOK FOR ASH T2,1 ;TIMES 2 FOR BYTES MOVEI T1,(DOT) ;CURRENT ADR SUBI T1,(T2) ;BACK UP CURRENT ADR PUSHJ P,GETWRD ;TRY TO GET THE DATA JRST COMAR9 ;LOSES PUSHJ P,INVLFN ;SEE IT THERE IS ANY SUCH INSTRUCTION JRST COMAR8 ;NO = LOSE HLLZ T2,1(SYM) ;GET FLAGS FOR INSTRUCTION AOS T2 ;ONE FOR INSTRUCTION TLNN T2,SMF.SS ;IS THIS SSDD FORMAT ? JRST COMAR6 ;NO LDB T3,[POINT 6,T1,29] ;GET SS FIELD PUSHJ P,COMARX ;ADJUST NUMBER OF WDS IN INSTRUCTION COMAR6: TLNN T2,SMF.DD!SMF.SS ;IS DD PRESENT ? JRST COMAR7 ;NO LDB T3,[POINT 6,T1,35] ;GET DD FIELD PUSHJ P,COMARX COMAR7: CAIE T4,(T2) ;IS THAT WHAT WE WANTED ? JRST COMAR8 ;NO SUBI DOT,(T4) SUBI DOT,(T4) JRST COMLF1 ;PRINT INSTRUCTION COMAR8: AOS T4 ;TRY FOR LARGER INSTRUCTION CAIE T4,4 ;IS THAT TOO LARGE ? JRST COMAR1 ;NO COMAR9: SUBI DOT,2 ;JUST BACK UP ONE WORD JRST COMLF1 COMARX: CAIE T3,27 ;IS THIS IMMEDIATE (#FOO) CAIN T3,37 ;OR ABSOLUTE AOS T2 ;YES SO ANOTHER WORD IN INSTRUCTION LDB T3,[POINT 3,T3,32] CAIE T3,6 ;IS THIS RELATIVE CAIN T3,7 ;OR RELATIVE DEFERRED ? AOS T2 ;YES SO ANOTHER WORD POPJ P, ;HERE WHEN THE USER TYPE A ^Z COMCZ: CALLI 1,12 JRST LEVEL0 ;HERE WHEN THE USER ENDS AN EXPRESSION WITH A BACKSLASH COMBSE: PUSHJ P,ACCUM ;FINISH ACCUMULATING EXPRESSION MOVE T1,EXPRESS ;MAKES ADDRESS JRST COMBS5 ;HERE WHEN THE USER TYPES A BACKSLASH COMBSL: SKIPN T1,LSTADR MOVE T1,DATA COMBS5: PUSHJ P,TABTYP PUSH P,DOT MOVEM T1,DOT PUSHJ P,DATYPE POP P,DOT JRST LEVEL2 ;HERE WHEN USER TYPE A BACK ARROW BKARRW: PUSHJ P,ACCUM ;FINISH ACCUMULATING EXPRESSION MOVE T1,EXPRESS PUSHJ P,ADRTYP ;AND TYPE OUT SYMBOL FOR IT PUSHJ P,TABTYP JRST LEVEL0 ;AND DONE ACCUM: SETZ T1, TRZE FLG,F.IOCT MOVE T1,OCTIN TRZE FLG,F.IDEC MOVE T1,DECIN TRZE FLG,F.IHEX MOVE T1,HEXIN TRZE FLG,F.SYMB PUSHJ P,EVLSYM ACCUM0: MOVE T2,INPOPR ;GET INPUT OPERATOR XCT [ ADD EXPRES,T1 SUB EXPRES,T1 IMUL EXPRES,T1 IDIV EXPRES,T1 IOR EXPRES,T1 AND EXPRES,T1 XOR EXPRES,T1 ](T2) ANDI EXPRESS,177777 ;16 BITS ONLY MOVEI STATE,STATEE SETZM OCTIN SETZM DECIN SETZM HEXIN SETZM SYMBOL MOVE T4,[POINT 6,SYMBOL] POPJ P, FINEXP: PUSHJ P,ACCUM ;ACCUMULATE WHATEVER WE HAVE JRST COMLF2 EXPLUS: TDZA T1,T1 ;CODE FOR NEXT TIME IS 0 EXPMIN: MOVEI T1,1 JRST EXP.DO EXPMUL: MOVEI T1,2 JRST EXP.DO EXPDIV: MOVEI T1,3 JRST EXP.DO EXPIOR: MOVEI T1,4 JRST EXP.DO EXPAND: MOVEI T1,5 JRST EXP.DO EXPXOR: MOVEI T1,6 EXP.DO: PUSH P,T1 ;SAVE CODE FOR NEXT TIME PUSHJ P,ACCUM ;ACCUMULATE EXPRESSION POP P,INPOPR ;NEXT INPUT OPERATION JRST LOOP ;THEN DONE EXPEQU: PUSHJ P,ACCUM ;ACCUMULATE EXPRESSION MOVE T1,EXPRESS ;GET EXPRESSION PUSHJ P,RADTYP PUSHJ P,TABTYP JRST LEVEL2 SLOWLM: PUSHJ P,ACCUM ;ACCUMULATE EXPRESSION MOVE T1,EXPRESS ;GET EXPRESSION HRRZM T1,SBEGIN ;SET LOWER LIMIT FOR SEARCH JRST LEVEL2 SUPLIM: PUSHJ P,ACCUM ;ACCUMULATE EXPRESSION MOVE T1,EXPRESS ;GET EXPRESSION HRRZM T1,S..END ;SET UPPER LIMIT FOR SEARCH JRST LEVEL2 ;HERE WHEN ASSEMBLING NUMBER AND FIND A PERIOD ASSPER: TRNN FLG,F.IDEC!F.IOCT JRST ASSYMB TRO FLG,F.IDEC TRZ FLG,F.IOCT!F.IHEX JRST ASYMB2 ;HERE WHEN NUMBER MUST BE DECIMAL ASSDEC: TRO FLG,F.IDEC TRZ FLG,F.IOCT ;HERE WHEN ASSEMBLING A OCTAL, DECIMAL OR HEX NUMBER ASSNUM: TRNN FLG,F.IDEC!F.IHEX TRO FLG,F.IOCT MOVEI STATE,STATEE MOVE T2,OCTIN LSH T2,3 ;CAIL T1,70 ; TRO FLG,F.IDEC ;NUMBER IS DECIMAL ADDI T2,-60(T1) MOVEM T2,OCTIN MOVE T2,DECIN IMULI T2,^D10 ADDI T2,-60(T1) MOVEM T2,DECIN MOVE T2,HEXIN LSH T2,4 ADDI T2,-60(T1) MOVEM T2,HEXIN ;TRNN FLG,F.IDEC!F.IHEX ; TROA FLG,F.IOCT ; TRZ FLG,F.IOCT JRST ASYMB2 ;HERE WHEN ASSEMBLING A SYMBOL ASSYMB: MOVEI STATE,STATEE TRO FLG,F.SYMB TRZ FLG,F.IDEC!F.IOCT!F.IHEX ASYMB2: SUBI T1,40 ;CONVERT CHAR TO SIXBIT CAME T4,[POINT 6,SYMBOL,35] IDPB T1,T4 ;ADD CHAR TO SYMBOL JRST LOOP ;HERE BECAUSE USER FINISHED SYMBOL WITH ":" DEFSYM: TRNE FLG,F.SYMB SKIPN T1,SYMBOL ;SYMBOL HE DEFINED JRST ILLCHR HRRZ T2,DOT ;CURRENT ADR PUSHJ P,ADDSYM PUSHJ P,TABTYP JRST LEVEL1 ;HERE TO EVALUATE A SYMBOL EVLSYM: MOVE T1,SYMBOL CAMN T1,[SIXBIT \.\] JRST [ HRRZ T1,DOT POPJ P, ] PUSHJ P,SYMFND ;TRY TO FIND SYMBOL JRST SYMERR MOVE T1,1(SYM) ;GET VALUE OF SYMBOL TLNN T1,SMF.IN ;WAS THAT AN INSTRUCTION ? JRST [ ANDI T1,-1 ;STRIP FLAGS POPJ P, ] ANDI T1,-1 POPJ P, SYMERR: OUTSTR [ASCIZ \U \] JRST LEVEL0 ;HERE IF TERMINATES EXPRESSION WITH A HT STEHT: PUSHJ P,STEFIN JRST COMHT ;NOW DO TAB FUNCTION ;HERE IF TERMINATES EXPRESSION WITH A CARRIAGE RETURN STECR: PUSHJ P,STEFIN ;STORE IF APPROPRIATE JRST LEVEL0 ;HERE TO DO DEPOSIT MAYBE AFTER CR OR LF OR UP ARROW STEFIN: TRZE FLG,F.MOPN ;IS MASK OPEN ? JRST SETMSK ;SET MASK TRZN FLG,F.LOPN ;IS LOCATION OPEN ? POPJ P, ;NO SO JUST RETURN TRNN FLG,F.WENB ;WAS PATCHING ENABLED ? JRST WRTLCK ;IS WRITE LOCKED PUSHJ P,ACCUM ;DO LAST MINUTE ACCUMULATION MOVE T1,DOT ;GET ADR TO EXAMINE MOVE T2,EXPRESS ;GET JUNK TO DEPOSIT PUSHJ P,PUTWRD ;TRY TO DEPOSIT IT PUSHJ P,CAL1ER POPJ P, WRTLCK: OUTSTR [ASCIZ \?patching was not enabled by /PATCH \] JRST LEVEL0 ;HERE TO SET MASK SETMSK: PUSHJ P,ACCUM ;DO LAST MINUTE ACCUMULATION HRRM EXPRESS,S.MASK ;SET MASK POPJ P, ;HERE IF TERMINATES EXPRESSION WITH A LF STELF: PUSHJ P,STEFIN ;DEPOSIT LOCATION MAYBE JRST COMLF ;DID DEPOSIT ;HERE IF TERMINATES EXPRESSION WITH AN UP ARROW STEARR: PUSHJ P,STEFIN JRST COMARR ;HERE IS USER TYPES ESCAPE WHILE INPUTTING AN EXPRESSION ESCEXP: PUSHJ P,ACCUM ;ACCUMULATE EXPRESSION SO FAR ;HERE IF USER TYPES ESCAPE ESCAPE: PUSHJ P,ACCUM ;FINISH PREVIOUS INPUT MOVEI STATE,STATSC ;SET ESCAPE FLAG SETZ T5, JRST LOOP ESCESC: TRO FLG,F..ESC JRST LOOP ;HERE TO ACCUMULATE NUMBER AFTER ESCAPE ESC..0: IMULI T5,^D10 ADDI T5,-60(T1) ;ACCUMULATE NUMBER JRST LOOP ESC..A: MOVEI T1,1 ;SETTING ADDRESS MODE JRST ESCMOD ESC..B: MOVEI T1,3 ;SETTING BYTE MODE SKIPN T5 ;DID HE TYPE NUMBER ? MOVEI T5,2 ;NO SO 2 BYTES JRST ESCMOD ESC..C: MOVEI T1,2 ;SETTING NUMERIC MODE JRST ESCMOD ESC..G: MOVE T1,EXPRESS ;GET ADDRESS HE TYPED MOVEM T1,GOTO ;REMEMBER IT FOR LATER SKIPE MEMORY ;ARE DIDDLING DUMP OR BIN FILE ? JRST TABDNE ;YES SO DONE SKIPN NODE ;ARE WE DOING STUFF WITH A NODE ? JRST ILLCHR ;NO SO THIS IS IMPOSSIBLE TRNN FLG,F.WENB ;WAS PATCHING ENABLED ? JRST WRTLCK ;CAN'T DO IT MOVE T1,EXPRESS ;GET ADDRESS HE TYPED PUSHJ P,SETUPN ;SETUP NODE UUO EXP 3 ;CODE FOR GOTO IS 3 PUSHJ P,NODSET ;GO DO NODE UUO TABDNE: OUTSTR [" "] JRST LEVEL2 ;WE DID IT ESC..K: JUMPE SYM,ILLCHR ;DID A SYMBOL PRECEDE $K ? PUSHJ P,TABTYP ;TYPE TAB SO HE KNOWS HE WON MOVSI T1,SMF.SU ;FLAG TO SUPRESS OUTPUT IORM T1,1(SYM) ;SUPRESS SYMBOL TRZN FLG,F..ESC ;DID HE WANT TO FLUSH SYMBOL ? JRST LEVEL2 ;NO SO DONE JRST LEVEL2 ESC..R: CAIG T5,^D16 CAIG T5,1 ;IS RADIX REASONABLE ? JRST ILLCHR ;NO SO FLUSH REQUEST HRRM T5,ORADIX ;YES SET NEW RADIX TRZE FLG,F..ESC ;SETTING PERMANENT MODE ? HRLM T5,ORADIX ;YES PUSHJ P,TABTYP JRST LEVEL2 ;AND KEEP GOING ESC..S: MOVEI T1,0 ;SETTING INSTRUCTION MODE JRST ESCMOD ESC..I: SKIPA T1,[EXP 5] ;SETTING EBCDIC OUTPUT ESC..T: MOVEI T1,4 ;SETTING ASCII OUTPUT SKIPN T5 ;DID USER SPECIFY NUMBER OF BYTES ? MOVEI T5,2 ;DEFAULT IS 2 ESCMOD: SKIPN T5 MOVEI T5,1 ;DEFAULT IS ONLY ONE HRRM T5,BYTCNT PUSHJ P,TABTYP HRRM T1,O.MODE ;SET CURRENT MODE TRZN FLG,F..ESC JRST LEVEL2 ;NOT SETTING PERMANENT MODE HRLS BYTCNT ;LOCAL COUNT IS PERMANT COUNT HRLM T1,O.MODE ;SET PERMANT MODE JRST LEVEL2 ;ESCAPE V - WATCH A LOCATION FOR VARIANCE ESC..V: SKIPE MEMORY JRST ILLCHR TRNN FLG,F.LOPN ;IS LOCATION OPEN ? JRST ILLCHR ;GIVE USER "?" TRO FLG,F.FLOP ESC.V0: MOVEI T1,0 ;MINIMUM SLEEP SLEEP T1, MOVE T1,DOT ;GET ADDRESS TO WATCH HRRZ T2,BYTCNT ;NUMBER OF BYTES TO DISPLAY HRRZ T3,O.MODE ;OUTPUT MODE CAIG T3,2 ASH T2,1 ;WORD MODE SO TIMES 2 BYTES TRZ FLG,F.CACH PUSHJ P,GETWRD ;GET DATA JRST ILLCHR MOVE T2,T1 ;COPY DATA XOR T2,DATA ;COMPARE TO LAST TIME AND T2,S.MASK ;MASK OFF IRREVELANT BITS TRZN FLG,F.FLOP JUMPE T2,ESC.V9 ;BRANCH IF SAME AS BEFORE ESC.V2: OUTSTR [BYTE (7)15,12,0] PUSH P,T1 ;SAVE NEW DATA MOVEM T1,DATA ;SAVE NEW DATA MOVE T1,DOT ;GET ADDRESS PUSHJ P,ADRTYP OUTSTR [ASCIZ \/ \] TRO FLG,F.CACH PUSHJ P,DATYPE ;TYPE NEW DATA POP P,DATA ;IN CASE DATYPE CHANGED IT ESC.V9: SKPINC ;HAS USER TYPED A CHARACTER ? JRST ESC.V0 ;NO SO KEEP WATCHING OUTSTR [ASCIZ \ \] JRST LEVEL2 ;GO PROCESS NEXT COMMAND ESC..M: TRO FLG,F.MASK ;MASK IS OPEN MOVEI STATE,STATEE ;EVALUATE AS AN EXPRESSION JRST LEVEL3 ;GET REST OF COMMAND ESC..N: TROA FLG,F.FLIP ;FLAG WE ARE DOING NOT SEARCH ;HERE FOR (ALTMODE)W WHICH IS WORD SEARCH ESC..W: TRZ FLG,F.FLIP ;FLAG WE WANT MATCHES MOVE T1,EXPRESS ;GET WHAT TO SEARCH FOR AND T1,S.MASK MOVEM T1,S.WORD MOVE DOT,SBEGIN SETZM CACHEL ;NOTHING IN CACHE SO FAR TRO FLG,F.CACH ;USE CACHE IF WE CAN ESC.W2: MOVE T1,DOT MOVE T2,S..END ADDI T2,2 SUB T2,T1 ;NUMBER OF WORDS TO GET TO FINSIH SEARCH CAILE T2,EXMAX MOVEI T2,EXMAX ;MAXIMUM NUMBER OF WORDS FOR THIS REQUEST PUSHJ P,GETWRD JRST LEVEL0 MOVEM T1,DATA ;SAVE DATA AND T1,S.MASK ;MASK SOME OF THE BITS TRNE FLG,F.FLIP ;ARE WE LOOKING FOR MATCH ? JRST [ CAMN T1,S.WORD ;DON'T WANT MATCH JRST ESCW.8 JRST ESCW.6 ] CAME T1,S.WORD JRST ESCW.8 ESCW.6: OUTSTR [BYTE (7)15,12,0] MOVE T1,DOT ;GET ADDRESS PUSHJ P,ADRTYP OUTSTR [ASCIZ \/ \] PUSHJ P,DATYPE SKPINC ;ANY TYPEAHEAD ? JRST ESCW.8 JRST ESCW.9 ;YES SO STOP ESCW.8: ADDI DOT,2 CAMLE DOT,S..END JRST ESCW.9 TRNN DOT,377 ;DON'T DO TOO MANY UUO'S SKPINC ;TYPEING AHEAD ? JRST ESC.W2 ;NO ESCW.9: OUTSTR [ASCIZ \ \] JRST LEVEL2 ;ROUTINE TO GET A WORD FROM THE PDP-11 ; CALL PUSHJ P,GETWRD ;WITH ADR IN T1, NUMBER OF BYTES IN T2 ; ERROR RETURN ; SUCCES DATA IN T1 GETWRD: PUSH P,T3 PUSH P,T4 SKIPN T2 HALT SKIPE CACHEL ;IS THERE DATA IN CACHE ? TRNN FLG,F.CACH ;AND MAY WE USE CACHE ? JRST GETWD1 ;NO CACHE OR CAN'T USE IT CAMGE T1,CACHEL ;IS REQUEST TOO LARGE ? CAMGE T1,CACHEA ;OR TOO SMALL JRST GETWD1 ;NO GETWD0: MOVE T4,[POINT 8,CACHE] ;POINTER TO CACHE MOVE T3,T1 ;COPY ADDRESS OF BYTE TO GET SUB T3,CACHEA ;MAKE RELATIVE CAIA IBP T4 ;SKIP NEXT BYTE SOJGE T3,.-1 ILDB T1,T4 ;GET LOW ORDER BYTE OF REQUESTED WORD ILDB T2,T4 ;GET HIGH ORDER BYTE OF REQUESTED WORD DPB T2,[POINT 8,T1,27] GETWD3: AOS -2(P) ;SKIP RETURN GETWD4: POP P,T4 POP P,T3 POPJ P, GETWD1: SKIPE T4,MEMORY ;DO WE HAVE MEMORY IN CORE ? JRST GETMEM ;YUP SKIPE NODE ;ARE WE WORKING REMOTELY ? JRST GETNOD ;YES SO DO IT IFE FTJSYS,< ;HERE TO DO CALL11 UUO TO GET DATA SETZ T4, HRRZM T1,T3 MOVEI T2,1 ;FUNCTION 1 GETWD2: MOVE T1,[3,,T2] HRL T2,PORT# ;ADD PORT NUMBER CAL11. T1, JRST [CAIE T1,4 ;FACILITY IN USE? JRST GETWD4 ;NO, ERROR RETURN. MOVEI T1,1 ;YES, SLEEP A SECOND SLEEP T1, JRST GETWD2] ; AND TRY AGAIN. > ; IFN FTJSYS,< ; ;TO DO EXAMINES FUNCTION 11(OCTAL) IS SENT TO THE FE AND ;THE RESULT OF EXAMINE IS READ BY DOING A SIN JSYS. ; HRRZM T1,SAVT3 ;SAVE ADR IN T3 MOVEM T4,SAVT4 ;SAVE T4 MOVEI T4,DEXFUN ;EXAMINE FUNCTION STOR T4,D10DF ;SET IN THE HEADER STOR T1,D10AD ;THE ADDRESS TO EXAMINE IN -11 SETZ T4, ;CLEAR T4 STOR T4,D10DT ;CLEAR THE CELL PUSHJ P,ENQDEV ;LOCK DEVICE FOR OUR USE SKIPE KSFLG ;Check for a 2020 PUSHJ P,FLSHFE ; Yes .. flush any ddcmp buffers hanging around MOVE T1,D60JFN ;JFN IN T1 MOVE T2,[POINT 8,SBUF] ;BUILD PTR TO SEND BUFFR MOVNI T3,6 ;#OF BYTES TO XFER SKIPE KSFLG ;Check for a 2020 JRST EXS.1 ; Yes .. go do 2020 style I/O SOUT ;SEND IT TO FE MOVEI T3,1 ;DO NOT SEND EOF MOVE T1,D60JFN ;JFN MOVEI T2,.MOEOF ;FORCE PARTIAL RECORDS MTOPR ;TO THE FE DEVICE ERJMP FATAL ;SHOULD NOT HAPPEN MOVEI T4,^D1000 ;MAX 2-SECOND WAIT INPWT: MOVE T1,D60JFN ;JFN IN T1 SIBE ;CHECK IF MONITOR BUFFER IS EMPTY? JRST SOMEIN ;GOT SOME INPUT MOVEI T1,2 ;SLEEP FOR 2 MS DISMS ;DISMISS PROCESS FOR 2MS SOJG T4,INPWT ;DONE WAITING? JRST FATAL ;FATAL ERROR,BUFFER EMPTY EXS.1: CALL WR200 ;WRITE TO THE DN200 JRST FATAL ;FATAL ERROR SOMEIN: MOVE T1,D60JFN ;GET JFN MOVE T2,[POINT 8,RBUF] ;BUILD A BYTE PTR TO RECV BUFFER MOVNI T3,6 ;6 BYTES TO BE READ SKIPE KSFLG ;Check for a 2020 JRST EXS.5 ; Yes go talk to DDCMP link SIN ;READ IN THE STRING ERJMP FATAL ;SIN ERROR RETURN MOVEI T3,1 ;DO NOT SEND EOF MOVE T1,D60JFN ;JFN MOVEI T2,.MOEOF ;SEND THE ACK MTOPR ;TO THE FE DEVICE ERJMP FATAL ;SHOULD NOT HAPPEN JRST EXS.6 EXS.5: CALL RD200 ;READ IN STING JRST FATAL ;ERROR EXS.6: PUSHJ P,DEQDEV ;DEQ DEVICE IF LOCKED LOAD T1,D11RS ;HOW DID WE DO IN EXAMINE? CAIE T1,1 ;SUCCESSFUL?? JRST GETWD4 ;NO,ERROR RETURN MOVE T3,SAVT3 ;RESTORE T3 MOVE T4,SAVT4 ;RESTORE T4 LOAD T1,D11DT ;DATA IN T1 > ; ; ; HERE WHEN WE MUST EXAMINE MORE ; GETWD5: HRRZ T2,T3 ;GET ADDRESS WE WERE GETTING PUSHJ P,PUTBCH ;PUT BYTE INTO THE CACHE LSH T1,-^D8 ;ADJUST DATA AOS T2 PUSHJ P,PUTBCH ;ALSO HIGH ORDER BYTE MOVE T1,T3 ;GET ADDRESS AGAIN MOVEI T2,2 ;NUMBER OF BYTES TO GET JRST GETWD0 ;GET DATA FROM THE CACHE ;HERE TO GET A WORD FROM CORE IN 10 MEMORY GETMEM: CAMLE T1,MEMLIM ;IS IT IN RANGE ? JRST GETWD4 ;ERROR RETURN IDIVI T1,4 ;WE KEEP 4 BYTES IN 36BIT WORD ADD T1,MEMORY ;ADD RELOCATION ADD T1,[ POINT 9,0,8 POINT 9,0,17 POINT 9,0,26 POINT 9,0,35 ](T2) LDB T2,T1 ILDB T1,T1 ROT T2,-^D8 LSHC T1,^D8 ANDI T1,177777 ;STRIP EXTRA BITS JRST GETWD3 ;HERE TO EXAMINE MEMORY FROM ANOTHER NETWORK NODE GETNOD: PUSHJ P,SETUPN ;BEGIN BUILDING MSG EXP 1 ;CODE FOR EXAMINE REQUESTS IS 1 MOVEM T1,T3 ;SAVE ADDRESS ADDI T1,(T2) ;MAKE LIMIT ADDRESS PUSHJ P,PUTADR ;PUT LIMIT ADDRESS INTO THE MESSAGE PUSHJ P,NODSET ;DO NODE UUO CAIE T1,12 ;CODE FOR EXAMINE DATA IS 12 JRST STCERR PUSH P,T3 ;SAVE ADDRESS WE WENT FOR HLRZ T3,NODARG+3 ;GET BYTE COUNT FROM MSG SUBI T3,4 ;SUBTRACT BYTES WE ALREADY READ ILDB T2,T4 ;GET LOW ORDER 8 BITS OF ADDRESS ILDB T1,T4 ;GET HIGH ORDER 8 BITS DPB T1,[POINT 8,T2,27] TRNE FLG,F.PDP8 JRST GTNOD3 SOS T3 ;COUNT BYTE ILDB T1,T4 DPB T1,[POINT 8,T2,19] GTNOD3: ILDB T1,T4 ;GET NEXT BYTE OF DATA PUSHJ P,PUTBCH ;PUT BYTE INTO THE CACHE AOS T2 ;ADVANCE ADDRESS SOJG T3,GTNOD3 POP P,T1 ;GET ADDRESS WE WENT FOR JRST GETWD0 ;HERE TO BEGIN A NODE UUO MSG
; CALL MOVE T1, ; PUSHJ P,SETUPN ; EXP SETUPN: PUSH P,T1 ;SAVE ADDRESS MOVE T4,[POINT 8,STCMSG] ;POINTER TO STATION CONTROL MSG MOVE T1,LINE ;0 = SELF, 1-N IS LINE NUMBER IDPB T1,T4 ;MSG IS FOR NODE MOVE T1,@-1(P) ;GET CODE IDPB T1,T4 POP P,T1 ;GET ADDRESS BACK PUSHJ P,PUTADR ;PUT ADDRESS INTO THE MESSAGE AOS (P) ;SKIP ARGUMENT POPJ P, ;HERE TO DO A NODE UUO ; CALL MOVEI T1, ;OF BYTES IN MSG TO SEND ; RETURNS WITH T4 POINTING TO INPUT MSG AND CODE IN T1 NODSET: PUSH P,[POINT 8,STCMSG] MOVEI T1,1 ;INITIALIZE LENGTH COUNTER IBP (P) ;ADVANCE DUMMY POINTER CAME T4,(P) AOJA T1,.-2 HRLI T1,STCMSG MOVSM T1,NODARG+2 POP P,T1 ;CLEAN OFF STACK MOVEI T1,4 ;NUMBER OF WORDS IN ARGUMENT MOVEM T1,NODARG MOVE T1,NODE ;NODE NAME MOVEM T1,NODARG+1 MOVE T1,[400,,STCIMS] ;INPUT MSG SLOT MOVEM T1,NODARG+3 MOVE T1,[3,,NODARG] ;FUNCTION IS SEND STC MSG NODE. T1, JRST NODERR MOVE T4,[POINT 8,STCIMS] ;POINTER TO INPUT MESSAGE ILDB T1,T4 ;GET FIRST BYTE (= LINE# OR SELF) CAME T1,LINE JRST NODERR ILDB T1,T4 ;GET MESSAGE SUBTYPE POPJ P, STCERR: OUTSTR [ASCIZ \STC error - msg =\] HLRZ T4,NODARG+3 SKIPA T5,[POINT 8,STCIMS] STCER3: OUTCHR [","] OUTCHR ["<"] ILDB T1,T5 PUSHJ P,OCTYPE OUTCHR [">"] SOJG T4,STCER3 JRST LEVEL0 ;HERE TO PUT A BYTE INTO THE CACHE ; CALL MOVE T1, ; MOVE T2, ; PUSHJ P,PUTBCH ; RETURN PUTBCH: PUSH P,T1 PUSH P,T2 PUSH P,T3 PUSH P,T4 SKIPE T3,CACHEL ;IS CACHE EMPTY ? CAMG T2,CACHEA ;IS NEW BYTE BELOW CACHE ADDRESS ? JRST PTBCH2 ;FLUSH CACHE SUB T3,CACHEA ;HOW MANY BYTES ALREADY IN THE CACHE ? CAIGE T3,CACHSZ ;SMALL ENOUGH ? JRST PTBCH1 ;YES MOVEI T3,4 ;REDUCE CONTENTS BY 4 BYTES = ON 10 WORD ADDM T3,CACHEA MOVE T3,[CACHE+1,,CACHE] ;BLT POINTER BLT T3,CACHE+-1 ;SHUFFLE CACHE PTBCH1: CAMN T2,CACHEL ;ARE TRYING TO ADD ONE BYTE TO CACHE ? JRST PTBCH4 ;YES PTBCH2: MOVEM T2,CACHEA ;BEGIN CACHE HERE PTBCH4: MOVEM T2,CACHEL ;THIS IS THE NEW CACHE LIMIT AOS CACHEL ;MAKE ONE PLUS SUB T2,CACHEA ;HOW MANY BYTES TO NEW BYTE ? MOVE T3,[POINT 8,CACHE] CAIA IBP T3 SOJGE T2,.-1 IDPB T1,T3 ;PUT BYTE INTO THE CACHE POP P,T4 POP P,T3 POP P,T2 POP P,T1 POPJ P, ;ROUTINE TO DEPOSIT A WORD IN PDP-11 MEMORY ; CALL PUSHJ P,PUTWRD ;WITH ADR IN T1 & DATA IN T2 PUTWRD: PUSH P,T3 PUSH P,T4 MOVEM T1,T3 PUTWD1: SKIPE T4,MEMORY ;DID WE READ A DUMP ? JRST PUTMEM ;DEPOSIT INTO MEMORY SKIPE NODE ;WORKING REMOTELY ? JRST PUTNOD ;YES IFE FTJSYS,< ;THE FOLLOWING ASSEMBLES FOR TEN MOVEM T2,T4 MOVEI T2,0 ;FUNCTION 0 PUTWD2: MOVE T1,[3,,T2] HRL T2,PORT# ;ADD PORT NUMBER CAL11. T1, JRST [CAIE T1,4 ;FACILITY IN USE? JRST GETWD4 ;NO, ERROR RETURN. MOVEI T1,1 ;YES, WAIT A SECOND SLEEP T1, JRST PUTWD2] ; AND TRY AGAIN. > ; ; HERE TO USE SIN/SOUT FOR TOPS-20 F.E. DEVICE ; IFN FTJSYS,< MOVEM T3,SAVT3 ;SAVE T3 MOVEM T4,SAVT4 ;SAVE T4 MOVEI T4,DEPFUN ;DEPOSIT FUNCTION STOR T4,D10DF ;SETUP IN HEADER TO FE STOR T1,D10AD ;ADR TO EXAMINE IN THE -11 SETZ T4, ;CLEAR T4 STOR T2,D10DT ;DATA TO DEPOSIT IN ABOVE ADR PUSHJ P,ENQDEV ;LOCK DEVICE FOR OUR USE SKIPE KSFLG ;Check for a 2020 PUSHJ P,FLSHFE ; Yes .. flush any ddcmp buffers hanging around MOVE T1,D60JFN ;ADR OF JFN MOVE T2,[POINT 8,SBUF] ;BYTE PTR TO SEND BUFFER MOVNI T3,6 ;6 BYTES TO XFER SKIPE KSFLG ;Check for a 2020 JRST SS20.1 ; Yes .. go talk to DDCMP link SOUT ;SEND TO THE FE MOVEI T3,1 ;DO NOT SEND EOF MOVE T1,D60JFN ;JFN MOVEI T2,.MOEOF ;WRITE PARTIAL RECORDS MTOPR ;WITH THIS JSYS ERJMP FATAL ;SHOULD NOT HAPPEN MOVE T4,^D1000 ;2-SECOND MAXIMUM WAIT INWAIT: MOVE T1,D60JFN ;JFN SIBE ;CHECK IF MONITOR BUFFER EMPTY JRST SOMINP ;GOT SOME INPUT MOVEI T1,2 ;SLEEP FOR 2 MS DISMS ;JSYS FOR SLEEPING SOJG T4,INWAIT ;WAITED ENOUGH? JRST FATAL ;YES,TIMEOUT FATAL ERROR SS20.1: CALL WR200 ;SEND TO REMOTE CPU JRST FATAL SOMINP: MOVE T1,D60JFN ;GET JFN MOVE T2,[POINT 8,RBUF] ;BYTE PTR TO REC BUFFER MOVNI T3,6 ;#BYTES TO BE READ SKIPE KSFLG ;Check for a 2020 JRST SS20.5 ; Yes .. talk to DDCMP SIN ;READ STRING DATA MOVEI T3,1 ;DO NOT SEND EOF ERJMP FATAL ;SIN FATAL ERROR MOVE T1,D60JFN ;JFN MOVEI T2,.MOEOF ;WRITE PARTIAL RECORDS MTOPR ;WITH THIS JSYS ERJMP FATAL ;SHOULD NOT HAPPEN JRST SS20.6 SS20.5: CALL RD200 ;READ THE ANSWER JRST FATAL SS20.6: PUSHJ P,DEQDEV ;DEQ IF LOCKED LOAD T1,D11RS ;CHECK THE RESULT CODE CAIE T1,1 ;SUCCESSFUL?? JRST GETWD4 ;NO,ERROR RETURN ; > JRST GETWD3 ;YES,WIN RETURN ; PUTMEM: CAML T1,MEMLIM ;IS ADR IN RANGE ? JRST GETWD4 ;NO SO REJECT IT EXCH T1,T2 ;SWAP ADR AND DATA PUSHJ P,PUTBYT ;PUT LOW ORDER BYTE INTO MEMORY LSH T1,-^D8 ;POSITION HIGH ORDER BYTE AOS T2 PUSHJ P,PUTBYT JRST GETWD3 PUTNOD: PUSHJ P,SETUPN ;BEGIN NODE. MSG EXP 2 ;CODE FOR DEPOSIT IS 2 IDPB T2,T4 ;PUT HIGH ORDER BYTE OF DATA INTO MSG LSH T2,-^D8 IDPB T2,T4 PUSHJ P,NODSET ;SEND MSG CAIE T1,11 ;DID WE GET AN ACCEPT ? JRST STCERR JRST GETWD3 PUTADR: PUSH P,T1 TRNE FLG,F.PDP8 ANDI T1,077777 ;STRIP EXTRA BITS IDPB T1,T4 ;PUT LOW ORDER BYTE OF ADR INTO MSG ROT T1,-^D8 IDPB T1,T4 ROT T1,-^D8 TRNE FLG,F.PDP8 JRST TPOPJ IDPB T1,T4 TPOPJ: POP P,T1 POPJ P, CAL1ER: OUTCHR ["?"] PUSHJ P,OCTYPE OUTSTR [ASCIZ \? \] POPJ P, IFN FT2SEG NODARG: BLOCK 5 STCMSG: BLOCK 20 STCIMS: BLOCK 110 IFN FT2SEG SUBTTL SYMBOL TABLE ROUTINES ;SYMBOLS ARE KEPT IN THREE WORD BLOCKS(ALPHABETIZED) ; STARTING AT LOCATION POINTED TO BY SYMBEG ; 1ST WORD IN BLOCK IS SIXBIT SYMBOL ; 2ND WORD IS HALF WORD FLAGS,,VALUE SMF.SU==000001 ;SYMBOL IS SUPPRESSED(DEFINED WITH =) SMF.RG==000002 ;SYMBOL IS A REGISTER VALUE SMF.MK==000004 ;MARK NN SMF.IN==000010 ;SYMBOL IS AN INSTRUCTION SMF.DD==000020 ;LOW ORDER SIX BITS ARE DESTINATION SMF.SS==000040 ;LOW ORDER 12 BITS ARE SSDD SMF.XX==000100 ;LOW ORDER 8 BITS ARE XXX(E.G. BR) SMF.SB==000200 ;SOB TYPE ADDRESS SMF.RT==000400 ;RTS TYPE REGISTER USAGE SMF.JS==001000 ;JSR TYPE REGISTER USAGE SMF.EM==002000 ;EMT TYPE ARGUMENT SMF.AS==004000 ;ASH TYPE NN ARG SMF.PL==010000 ;SET PROCESSOR LEVEL SMF.FL==020000 ;FLOATING POINT (FP11-B) ; 3RD WORD IS LINK TO NEXT SYMBOL BLOCK ;HERE TO FIND A MATCH FOR A SYMBOL ; CALL MOVE T1,[SIXBIT \SYMBOL\] ; PUSHJ P,SYMFND ; ERROR RETURN ; SUCCESS RETURN SYM POINTS TO SYMBOL SYMFND: SKIPN SYM,SYMBEG ;GET ADR OF BEGINING OF SYMBOL TABLE POPJ P, ;CAN'T FIND SYMBOL SYMFN1: CAMN T1,(SYM) ;HAVE WE FOUND THE SYMBOL ? JRST CPOPJ1 ;YES HRRZ SYM,2(SYM) ;GET ADR OF NEXT SYMBOL BLOCK JUMPN SYM,SYMFN1 POPJ P, ;CAN'T FIND SYMBOL ;HERE TO SEE IF WE CAN FIND A MATCH FOR AN INSTRUCTION ; CALL MOVEI T1, ; PUSHJ P,INVLFN ; LOSE RETURN ; WIN RETURN WITH SYM SET UP INVLFN: SKIPN SYM,SYMBEG ;ADDRESS OF FIRST SYMBOL BLOCK POPJ P, ;NO SYMBOL TABLE INVLF1: MOVE T2,1(SYM) ;GET SYMBOL VALUE TLNN T2,SMF.IN ;IS THIS AN INSTRUCTION ? JRST INVLF8 TLNE T2,SMF.SU ;IS INSTRUCTION SUPPRESSED? JRST INVLF8 ;YES, DON'T USE IT. LDB T3,[POINT 4,1(SYM),3] ;GET NUMBER OF BITS IN INSTRUCTION -1 MOVE T3,MASKTB(T3) ;GET MASK FOR INSTRUCTION AND T3,T1 ;MASK ARGUMENT CAIE T3,(T2) ;IS THIS A MATCH ? JRST INVLF8 ;NO CPOPJ1: AOS (P) ;FOR SKIP RETURN CPOPJ: POPJ P, INVLF8: HRRZ SYM,2(SYM) ;GET ADR OF NEXT SYMBOL BLOCK JUMPN SYM,INVLF1 POPJ P, MASKTB: EXP 100000 EXP 140000,160000,170000 EXP 174000,176000,177000 EXP 177400,177600,177700 EXP 177740,177760,177770 EXP 177774,177776,177777 IFN FTJSYS,< ;THE FOLLOWING BUFFERS ARE USED BY DECSYSTEM-20 ONLY ; SBUF: BLOCK 2 ;FOR SENDING HEADER TO FE RBUF: BLOCK 2 ;FOR RECEIVING HEADERS FROM FE D60JFN: BLOCK 1 ;TO HOLD JFN D60BUF: BLOCK 20 ;TO HOLD JFN SAVT3: BLOCK 1 ;TO SAVE T3 SAVT4: BLOCK 1 ;TO SAVE T4 ; > ;HERE TO FIND A NAME FOR A REGISTER ; CALL: MOVEI T1,# ;REGISTER NUMBER ; PUSHJ P,RGFNDN ; LOSE ; BINGO RGFNDN: SKIPN SYM,SYMBEG ;GET FIRST SYMBOL BLOCK ADR POPJ P, ;NO SYMBOL TABLE RGFND1: MOVE T2,1(SYM) ;GET SYMBOL VALUE TLNN T2,SMF.RG ;IS THIS A REGISTER ? JRST RGFND8 ;NO CAIE T1,(T2) ;IS THIS WHAT WE WANTED ? JRST RGFND8 ;NO TLNE T2,SMF.SU ;IS SYMBOL SUPPRESSED? JRST RGFND8 ;YES, DON'T USE IT. AOS (P) ;SKIP RETURN POPJ P, RGFND8: HRRZ SYM,2(SYM) ;GET NEXT SYMBOL BLOCK JUMPN SYM,RGFND1 ;NOT YET POPJ P, ;ERROR RETURN ;HERE TO ADD A SYMBOL TO TABLE ; CALL PUT SYMBOL IN T1, PUT VALUE AND FLAGS IN T2, MISC IN T3 ADDSYM: MOVE SYM,SYMBEG ;GET ADDRESS OF FIRST SYMBOL BLOCK ADSYM1: CAMN T1,@SYM ;DOES THIS MATCH ? JRST [ MOVEM T2,1(SYM) ;YES SO THIS REPLACES PREVIOUS POPJ P, ] HRRZ SYM,2(SYM) ;GET ADDRESS OF NEXT SYMBOL BLOCK JUMPN SYM,ADSYM1 ;MAKE A NEW SYMBOL BLOCK MOVE T4,.JBFF ;ADDRESS OF NEW SYMBOL BLOCK ADDI T4,3 MOVEM T4,.JBFF HRLM T4,.JBSA## PUSHJ P,GETCOR SUBI T4,3 ;MAKE ADDRESS OF BLOCK AGAIN MOVE SYM,SYMEND ;GET ADDRESS OF LAST SYMBOL BLOCK HRRZM T4,2(SYM) HRRZM T4,SYMEND MOVEM T4,SYM MOVEM T1,0(SYM) MOVEM T2,1(SYM) SETZM 2(SYM) POPJ P, ;HERE TO FIND A NEAR MATCH FOR A VALUE ; CALL MOVEI T1,VALUE TO MATCH ; PUSHJ P,VALFND ; ERROR RETURN ; RETURN WITH SYM SET UP VALFND: PUSH P,T4 SETZ SYM, MOVE T2,SYMBEG ;ADR OF FIRST SYMBOL BLOCK VLFND1: MOVE T3,1(T2) ;GET SYMBOL'S VALUE TRNE T3,177777 ;IS VALUE ZERO ? TLNE T3,SMF.SU!SMF.IN!SMF.RG ;IS SYMBOL SUPPRESSED OR INSTRUCTION ? JRST VLFND7 ;YES SO DON'T TRY IT CAIGE T1,400(T3) ;IS SYMBOL VALUE MUCH LESS THAN DESIRED ? CAIGE T1,(T3) ;IS SYMBOL VALUE .LE. DESIRED VALUE ? JRST VLFND7 ;NO JUMPE SYM,VLFND4 CAIL T4,(T3) ;IS SYMBOL BETTER THAN LAST MATCH ? JRST VLFND7 ;NO VLFND4: MOVE SYM,T2 ;BEST MATCH SO FAR HRRZ T4,T3 ;COPY VALUE FOR FUTURE REFERENCE VLFND7: HRRZ T2,2(T2) ;GET ADDRESS OF NEXT BLOCK JUMPN T2,VLFND1 SKIPE SYM AOS -1(P) POP P,T4 POPJ P, GETCOR: PUSH P,T1 HRRZ T1,.JBFF## ;GET NEW AMOUNT OF CORE WE NEED CAMG T1,.JBREL## JRST GTCOR9 TRNE FLG,F.LOCK JRST [ MOVEI T1,1 ;CODE FOR LOW SEG UNLOK. T1, ;CAN'T BE LOCKED WHEN WE DO THIS JRST LOCKER ;OLD MONITOR PERHAPS ? HRRZ T1,.JBFF## ;GET CORE ARG BACK CORE T1, JRST CORERR ;CAN'T HAVE MORE ? MOVEI T1,1 ;CODE TO LOCK LOW SEG LOCK T1, JRST LOCKER JRST GTCOR6 ] CORE T1, JRST CORERR GTCOR6: REPEAT 0,< OUTCHR ["["] PUSH P,T2 PUSH P,T3 HRRZ T1,.JBREL## AOS T1 LSH T1,-^D9 PUSHJ P,DECTYP POP P,T3 POP P,T2 OUTSTR [ASCIZ \P core] \] > GTCOR9: POP P,T1 POPJ P, ;HERE IF CAN'T GET CORE WE WANT CORERR: OUTSTR [ASCIZ \ CORE UUO failed\] EXIT ;HERE TO READ A SYMBOL TABLE FROM A LISTING RDSYMB: MOVE T1,[SIXBIT \FOOBAR\] ;DEFAUL FILE NAME MOVE T2,[SIXBIT \LSTCRF\] ;DEFAULT EXTENSIONS PUSHJ P,OPNFL0 ;OPEN FILE TO READ SYMBOLS FROM JRST LEVEL0 MOVE T1,[FILDEV,,SYMDEV] BLT T1,SYMDEV+3 GETSC0: SETZ T5, ;COUNT OF SYMBOLS PUSHJ P,GETSCH CAIE T1,14 ;IS THIS A FORM FEED ? JRST GETSC0 ;LOOK FOR ONE GETSC1: PUSHJ P,GETSCH CAIE T1,12 ;IS THIS A LINE FEED ? JRST GETSC1 ;LOOK FOR ONE GETSC2: PUSHJ P,GETSCH CAIE T1,12 ;IS THIS A LINE FEED ? JRST GETSC2 ;LOOK FOR ONE SETZB T3,SYMBOL ;BUILD SYMBOL HERE MOVE T2,[POINT 6,SYMBOL] GETSC3: PUSHJ P,GETSCH CAIN T1,"=" ;EQUAL SIGN? JRST [CAME T2,[POINT 6,SYMBOL,35] JRST GETSC2 JRST GETSC7] CAIG T1,40 ;IN SIXBIT RANGE (EXCEPT BLANK)? JRST GETSC4 ;IF NOT HAVE FINISHED SYMBOL SUBI T1,40 ;CONVERT TO SIXBIT CAMN T2,[POINT 6,SYMBOL,35] ;FILLED WORD YET ? JRST GETSC2 ;YES, MUST NOT BE A SYMBOL IDPB T1,T2 ;NO SO KEEP FILLING JRST GETSC3 ; GETSC4: CAIE T1,40 ;SYMBOLS END WITH A SPACE JRST GETSC2 ;NOT SYMBOL - FLUSH LINE GETSC7: JUMPE SYMBOL,GETSC2 ;IF NO SYMBOL FLUSH LINE TDZA T4,T4 ;FLAGS GETSC5: PUSHJ P,GETSCH CAIN T1,40 JRST GETSC5 CAIN T1,"=" JRST [ TRO T4,SMF.SU ;SUPPRESSED SYMBOL JRST GETSC5 ] CAIN T1,"%" JRST [ TRO T4,SMF.RG ;REGISTER NAME TRZ T4,SMF.SU ;NOT SUPPRESSED JRST GETSC5 ] CAIL T1,60 CAILE T1,67 JRST GETSC2 ;FLUSH REST OF LINE GETSC6: IMULI T3,^D8 ADDI T3,-60(T1) PUSHJ P,GETSCH CAIL T1,60 CAILE T1,67 CAIA JRST GETSC6 MOVE T1,SYMBOL ;COPY SYMBOL HRRZ T2,T3 ;VALUE HRL T2,T4 ;FLAGS SETZ T3, PUSH P,SYMEND PUSHJ P,ADDSYM POP P,T1 ;GET OLD SYMEND CAME T1,SYMEND AOS T5 ;COUNT SYMBOL JRST GETSC2 ;FLUSH REST OF LINE GETSCH: SOSGE IHD+2 JRST GTSCH5 ILDB T1,IHD+1 POPJ P, GTSCH5: IN JRST GETSCH OUTSTR [ASCIZ \ Loaded \] MOVE T1,T5 PUSHJ P,DECTYP OUTSTR [ASCIZ \ symbols \] POP P,T1 ;ADJUST THE STACK POPJ P, SYMDEV: EXP 0 EXP 0 EXP 0 EXP 0 SUBTTL GENERAL FILE ROUTINES ;HERE TO OPEN A FILE TO READ ; CALL MOVE T1,[SIXBIT \FILE\] ;DEFAULT FILE NAME ; MOVE T2,[SIXBIT \EXTEXT\] ;DEFAULT EXTENSIONS ; PUSHJ P,OPNFIL ; LOSE RETURN ; WIN RETURN OPNFIL: TROA FLG,F.FLIP ;FLAG WE SHOULD PROMPT OPNFL0: TRZ FLG,F.FLIP ;NO PROMPT PLEASE MOVEM T1,FILNAM ;SAVE DEFAULT FILE NAME MOVEM T2,FILEXT ;SAVE DEFAULT EXTENSIONS SETZM FILPPN OPFIL1: MOVSI T1,'DSK' ;DEFAULT DEVICE NAME MOVEM T1,FILDEV TROE FLG,F.FLIP ;WANT PROMPT ? OUTSTR [ASCIZ \ FILE: \] PUSHJ P,SIXIN ;GET FILE NAME JRST OPFIL1 CAIE T5,":" ;WAS THIS A DEVICE SPECIFICATION ? JRST OPFIL5 MOVEM T1,FILDEV ;YES SO WAS A DEVICE PUSHJ P,SIXIN ;GET FILE NAME JRST OPFIL1 OPFIL5: SKIPE T1 ;WAS THERE A FILE NAME ? MOVEM T1,FILNAM ;SAVE FILE NAME CAIE T5,"." ;GIVING AN EXTENSION ? JRST OPFIL6 ;NO PUSHJ P,SIXIN ;GET EXTENSION JRST OPFIL1 HLLZM T1,FILEXT OPFIL6: CAIE T5,"[" ;GIVING A PPN ? JRST OPFIL7 PUSHJ P,SIXIN JRST OPFIL7 CAIE T5,"," JRST OPFIL7 PUSHJ P,SIXOCT JRST OPFIL7 HRLM T1,FILPPN PUSHJ P,SIXIN JRST OPFIL1 PUSHJ P,SIXOCT JRST OPFIL1 HRRM T1,FILPPN OPFIL7: SETZ T1, MOVE T2,FILDEV MOVEI T3,IHD TRNE FLG,F.WRIT HRLZI T3,OHD OPEN T1 JRST FILER0 PUSH P,.JBFF## MOVEI T2,INPBUF MOVEM T2,.JBFF## MOVE T1,[INBUF 1] TRNE FLG,F.WRIT HRLI T1,(OUTBUF) XCT T1 JFCL POP P,.JBFF## OPNFL8: MOVE T1,[LOOKUP T2] TRNE FLG,F.WRIT HRLI T1,(ENTER) MOVE T2,FILNAM HLLZ T3,FILEXT ;GET DEFAULT EXTENSION SETZ T4, MOVE T5,FILPPN XCT T1 CAIA ;LOOKUP OR ENTER LOST JRST OPNFL9 TRNE FLG,F.WRIT ;WRITING ? JRST FILER0 ;HE LOSES HRLZS T3,FILEXT ;TRY DEFAULT EXTENSION JUMPE T3,FILER0 ;IF NONE DON'T TRY AGAIN JRST OPNFL8 OPNFL9: HLLZS FILEXT ;SAVE REAL FILE EXTENSION JRST CPOPJ1 ;RETURN TO CALLER FILER0: OUTSTR [ASCIZ \can't LOOKUP/ENTER file \] FILERR: MOVEI T1,FILDEV PUSHJ P,FILTYP OUTSTR [ASCIZ \ \] POPJ P, FILTYP: PUSH P,T1 ;SAVE POINTER TO FILE DESCRIPTOR MOVE T1,@(P) ;GET DEVICE NAME PUSHJ P,SIXTYP MOVEI T1,":" PUSHJ P,TYPCHR AOS (P) MOVE T1,@(P) ;GET FILE NAME PUSHJ P,SIXTYP MOVEI T1,"." PUSHJ P,TYPCHR AOS (P) ;ADVANCE TO FILE EXTENSION HLLZ T1,@(P) ;GET EXTENSION PUSHJ P,SIXTYP AOS (P) SKIPN T1,@(P) JRST FILTY6 PUSH P,T1 ;SAVE PPN MOVEI T1,"[" PUSHJ P,TYPCHR HLRZ T1,(P) PUSHJ P,OCTYPE MOVEI T1,"," PUSHJ P,TYPCHR POP P,T1 ;GET RH OF PPN ANDI T1,-1 PUSHJ P,OCTYPE MOVEI T1,"]" PUSHJ P,TYPCHR FILTY6: POP P,T1 POPJ P, ;HERE TO CLOSE OUTPUT FILE DONE.W: SKIPN OHD POPJ P, OUT CLOSE RELEASE SETZM OHD POPJ P, IFN FT2SEG < RELOC > IHD: BLOCK 3 INPBUF: BLOCK 203 FILDEV: SIXBIT \DSK\ FILNAM: BLOCK 1 FILEXT: BLOCK 1 FILPPN: BLOCK 1 IFN FT2SEG < RELOC > ;HERE TO GET NEXT CHAR FROM A FILE ; CALL PUSHJ P,FILCHR ; ERROR RETURN ; NORMAL RETURN WITH CHAR IN T1 FILCHR: SOSGE T1,IHD+2 ;IS THERE MORE STUFF IN BUFFER ? JRST FLCHR5 ;NO ILDB T1,IHD+1 ;GET NEXT CHAR JUMPE T1,FILCHR ;FLUSH NULLS AOS (P) ;SKIP RETURN POPJ P, FLCHR5: IN ;GET NEXT BUFFER JRST FILCHR ;TRY AGAIN POPJ P, ;HERE TO INPUT AN OCTAL NUMBER ; CALL: PUSHJ P,INPOCT ; ERROR RETURN ; RETURN WITH OCTAL NUMBER IN T1, BREAK CHAR IN T2 INPOCT: PUSH P,T3 PUSH P,T4 SETZB T3,T4 INPRD2: PUSHJ P,FILCHR ;GET NEXT INPUT CHAR JRST INPRD9 ;NO MORE IN FILE JUMPE T1,INPRD2 CAIE T1," " ;LEADING SPACE ? CAIN T1," " ;OR TAB ? JRST INPRD2 ;YES INPRD5: CAIL T1,"0" CAILE T1,"7" JRST INPRD7 IMULI T3,^D8 ADDI T3,-60(T1) PUSHJ P,FILCHR CAIA ;EOF JRST INPRD5 INPRD7: MOVE T2,T1 MOVE T1,T3 AOS -2(P) ;SKIP RETURN INPRD9: POP P,T4 POP P,T3 POPJ P, ;HERE TO GET A SIXBIT WORD FROM TTY SIXIN: MOVE T4,[POINT 6,T5] SETZ T5, SIXIN2: PUSHJ P,RDCHAR ;GET A CHAR FROM TTY CAIN T1,177 JRST [ OUTSTR [ASCIZ \xxx\] POPJ P, ] CAIL T1,"0" CAILE T1,"Z" JRST SIXIN9 ;RETURN CAILE T1,"9" CAIL T1,"A" CAIA JRST SIXIN9 ;RETURN SUBI T1,40 CAME T4,[POINT 6,T5,35] ;HAVE WE ALREADY FILLED WORD ? IDPB T1,T4 ;NOT YET JRST SIXIN2 SIXIN9: EXCH T1,T5 CAIN T5,15 ;END OF LINE? TRO FLG,F.ENDL ;YES, NOTE THAT. JRST CPOPJ1 ;HERE TO CONVERT SIXBIT TO OCTAL SIXOCT: MOVE T4,[POINT 6,T1] SETZ T2, SIXOC1: ILDB T3,T4 JUMPE T3,SIXOC9 CAIL T3,20 CAILE T3,27 POPJ P, ;CAN'T CONVERT IMULI T2,^D8 ADDI T2,-20(T3) CAME T4,[POINT 6,T1,35] ;DONE ALL OF WORD ? JRST SIXOC1 SIXOC9: EXCH T1,T2 JRST CPOPJ1 SUBTTL TTY ROUTINES ;HERE TO DISPLAY CONTENTS OF T1 AS AN ADDRESS ADRTYP: ANDI T1,177777 ;SIXTEEN BITS ONLY PLEASE HRROM T1,LSTADR ;SAVE LAST ADDRESS DISPLAYED PUSHJ P,VALFND ;SEE IF WE CAN FIND A SYMBOL JRST RADTYP ;TYPE ADDR IN CURRENT RADIX PUSH P,T1 ;SAVE VALUE MOVE T1,(SYM) ;GET SYMBOL NAME PUSHJ P,SIXTYP ;TYPE SYMBOL POP P,T1 ;GET VALUE AGAIN SUB T1,1(SYM) ;GET DISPLACEMENT ANDI T1,177777 ;STRIP EXTRA BITS JUMPE T1,CPOPJ ;IF EXACT WE ARE DONE PUSH P,T1 ;SAVE REMAINDER MOVEI T1,"+" PUSHJ P,TYPCHR POP P,T1 JRST RADTYP ;TYPE REST IN CURRENT RADIX ;HERE TYPE DATA DATYPE: MOVE T1,DOT HRRZ T2,BYTCNT ;BYTE COUNT HRRZ T3,O.MODE ;OUTPUT MODE CAIG T3,2 ;IS THIS A WORD MODE ASH T2,1 ;YES SO BYTE=WORDS*2 PUSHJ P,GETWRD JRST [ PUSHJ P,CAL1ER JRST LEVEL0 ] MOVEM T1,DATA HRRZ T5,BYTCNT ;REPETITION COUNT SETZM LSTADR SETZM DOTFOO MOVE T1,DATA ;GET DATA TO TYPE HRRZ T2,O.MODE ;GET OUTPUT MODE PUSHJ P,@[EXP DATINS,DATADR,DATNUM,DATBYT,DATASC,DATEBC](T2) MOVEI T1,[ASCIZ \ \] PJRST TYPSTR ; DATNUM: PUSHJ P,RADTYP ;TYPE AS NUMERIC SOJLE T5,DATYP8 PUSHJ P,BLANKT PUSHJ P,NXTDWD ;GET NEXT DATA WORD JRST DATNUM NXTDWD: SKIPN DOTFOO ;DONE 2ND WORD YET MOVE DOTFOO,DOT ADDI DOTFOO,2 MOVE T1,DOTFOO MOVEI T2,2 PUSHJ P,GETWRD ;FIND WHAT NEXT WORD IS JRST DATYP8 ;CAN'T READ NEXT WORD ! MOVEM T1,DATA POPJ P, ;HERE TO TYPE DATA AS AN ADDRESS DATADR: PUSHJ P,ADRTYP SOJLE T5,DATYP8 ;HAVE WE DONE ENOUGH ? PUSHJ P,BLANKT ;TYPE A SPACE TO SEPERATE FIELDS PUSHJ P,NXTDWD ;GET NEXT DATA WORD JRST DATADR ;AND TYPE NEXT WORD ;HERE TO TYP DATA AS INSTRUCTIONS DATINS: PUSHJ P,INVLFN ;SEE IF WE CAN FIND AN INSTRUCTION TO MATCH JRST DATNUM MOVE T1,(SYM) ;GET INSTRUCTION NAME PUSHJ P,SIXTYP MOVE T5,1(SYM) ;GET FLAGS AGAIN PUSHJ P,BLANKT ;TYPE A BLANK TLNE T5,SMF.MK ;MARK INSTRUCTION? JRST [ LDB T1,[POINT 6,DATA,35] PUSHJ P,OCTYPE JRST DATYP8] TLNE T5,SMF.PL ;SPL TYPE INSTRUCTION ? JRST [ LDB T1,[POINT 3,DATA,35] ;GET ARGUMENT PUSHJ P,OCTYPE JRST DATYP8 ] TLNE T5,SMF.EM ;EMT TYPE ARGUMENTS ? JRST [ LDB T1,[POINT 8,DATA,35] ;GET ARGUMENT PUSHJ P,RADTYP ;TYPE ARGUMENT AS NUMBER JRST DATYP8 ] TLNE T5,SMF.RT ;RTS TYPE ? JRST [ LDB T1,[POINT 3,DATA,35] ;GET REG ADR PUSHJ P,DATIN9 ;TYPE REG NAME JRST DATYP8 ] TLNE T5,SMF.JS ;JSR TYPE ? JRST [ LDB T1,[POINT 3,DATA,29] PUSHJ P,DATIN9 ;TYPE REG NAME PUSHJ P,COMTYP JRST .+1 ] TLNE T5,SMF.AS ;ASH TYPE NN ? JRST [ LDB T1,[POINT 6,DATA,29] ;GET NN TRNE T1,40 ;CHECK FOR NEGATIVE IORI T1,177740 ;EXTEND SIGN JRST RADTYP ] TLNE T5,SMF.SB ;SOB TYPE ? JRST [ LDB T1,[POINT 3,DATA,29] ;GET REGISTER PUSHJ P,DATIN9 ;TYPE REG NAME PUSHJ P,COMTYP LDB T1,[POINT 6,DATA,35] ;GET OFFSET IMULI T1,-2 ADDI T1,2(DOT) ANDI T1,177777 PUSHJ P,ADRTYP JRST DATYP8 ] TLNN T5,SMF.SS ;12BIT SSDD FORMAT ? JRST DATIN2 ;NO LDB T4,[POINT 6,DATA,29] ;GET SS CODE PUSHJ P,DATIN8 PUSHJ P,COMTYP DATIN2: TLNN T5,SMF.SS!SMF.DD ;IS THERE A 6 BIT DESTINATION CODE ? JRST DATIN4 ;NO LDB T4,[POINT 6,DATA,35] ;GET DD CODE PUSHJ P,DATIN8 DATIN4: TLNN T5,SMF.XX ;IS THIS BR TYPE ADDRESSING ? JRST DATIN6 ;NO LDB T1,[POINT 8,DATA,35] ;GET OFFSET TRNE T1,200 ;CHECK FOR NEGATIVE OFFSET IORI T1,177400 AOS T1 LSH T1,1 ;MAKE WORD ADDRESS ADD T1,DOT ANDI T1,177777 ;16 BITS ONLY PUSHJ P,ADRTYP ;TYPE ADDRESS DATIN6: JRST DATYP8 DATIN8: CAIN T4,27 ;CHECK FOR IMMEDIATE MODE JRST [ PUSHJ P,HSHTYP ;TYPE A # SKIPN DOTFOO MOVE DOTFOO,DOT ADDI DOTFOO,2 MOVE T1,DOTFOO MOVEI T2,2 PUSHJ P,GETWRD POPJ P, JRST ADRTYP ] CAIN T4,37 ;CHECK FOR ABSOLUTE MODE JRST [ SKIPN DOTFOO MOVE DOTFOO,DOT ADDI DOTFOO,2 MOVE T1,DOTFOO MOVEI T2,2 PUSHJ P,GETWRD POPJ P, JRST ADRTYP ] CAIL T4,10 ;IS THIS (REGSITER)? CAILE T4,16 ;EXCEPT (PC)? SKIPA ;NO. JRST [ MOVEI T1,"(" ;YES. PUSHJ P,TYPCHR LDB T1,[POINT 3,T4,35] PUSHJ P,DATIN9 MOVEI T1,")" PJRST TYPCHR] TRNE T4,10 ;CHECK FOR DEFERRED MODE PUSHJ P,[ MOVEI T1,"@" PJRST TYPCHR ] CAIE T4,77 ;CHECK FOR RELATIVE DEFERRED MODE CAIN T4,67 ;CHECK FOR RELATIVE MODE JRST [ SKIPN DOTFOO MOVE DOTFOO,DOT ADDI DOTFOO,2 MOVE T1,DOTFOO MOVEI T2,2 PUSHJ P,GETWRD POPJ P, ADD T1,DOTFOO ;MAKE RELATIVE ADDI T1,2 JRST ADRTYP ] LDB T1,[POINT 3,T4,32] ;GET MODE CAIE T1,4 CAIN T1,5 PUSHJ P,MINTYP CAIL T1,6 ;CHECK FOR INDEX OR INDEX DEFERRED JRST [ SKIPN DOTFOO MOVE DOTFOO,DOT ADDI DOTFOO,2 MOVE T1,DOTFOO MOVEI T2,2 PUSHJ P,GETWRD POPJ P, PUSHJ P,ADRTYP JRST .+2 ] TRNE T1,6 PUSHJ P,[ MOVEI T1,"(" PJRST TYPCHR ] LDB T1,[POINT 3,T4,35] ;GET REGISTER VALUE PUSHJ P,DATIN9 ;TYPE REGISTER NAME TRNN T4,60 POPJ P, ;PLAIN REGISTER MODE MOVEI T1,")" PUSHJ P,TYPCHR LDB T1,[POINT 3,T4,32] CAIE T1,2 CAIN T1,3 PUSHJ P,PLUTYP POPJ P, DATIN9: PUSHJ P,RGFNDN ;FIND REGISTERS NAME JRST [ PUSHJ P,PCNTYP ;TYPE A % PUSHJ P,OCTYPE POPJ P, ] MOVE T1,(SYM) ;GET REGISTERS NAME JRST SIXTYP ;HERE TO TYPE DATA AS ASCII TEXT DATASC: ANDI T1,377 MOVEM T1,T3 PUSHJ P,DATAS3 SOJLE T5,DATYP8 LDB T1,[POINT 8,DATA,27] MOVEM T1,T3 ;SAVE IN CASE ILLEGAL PUSHJ P,DATAS3 SOJLE T5,DATYP8 PUSHJ P,NXTDWD ;GET NEXT DATA WORD JRST DATASC DATAS3: ANDI T1,177 ;STRIP PARITY BIT CAIL T1,40 CAILE T1,176 CAIA ;SPECIAL HANDLING JRST TYPCHR ;JUST TYPE CHARACTER DATAS4: PUSH P,T3 ;SAVE WEIRD CHARACTER MOVEI T1,"<" PUSHJ P,TYPCHR POP P,T1 ;GET CHAR PUSHJ P,RADTYP MOVEI T1,">" PJRST TYPCHR ;HERE TO TYPE DATA AS TEXT DATEBC: PUSHJ P,DATEB3 SOJLE T5,DATYP8 LDB T1,[POINT 8,DATA,27] PUSHJ P,DATEB3 SOJLE T5,DATYP8 PUSHJ P,NXTDWD ;GET NEXT DATA WORD JRST DATEBC DATEB3: ANDI T1,377 MOVEM T1,T3 SETZ T2, LSHC T1,-2 ROT T2,2 LDB T1,[ POINT 8,EB.TRN(T1),7 POINT 8,EB.TRN(T1),15 POINT 8,EB.TRN(T1),23 POINT 8,EB.TRN(T1),31 ](T2) PJRST DATAS3 ;HERE TO TYPE DATA AS BYTES DATBYT: ANDI T1,377 PUSHJ P,RADTYP SOJLE T5,DATYP8 MOVEI T1,"," PUSHJ P,TYPCHR LDB T1,[POINT 8,DATA,27] PUSHJ P,RADTYP ;TYPE IN CURRENT RADIX SOJLE T5,DATYP8 MOVEI T1,"," PUSHJ P,TYPCHR PUSHJ P,NXTDWD ;GET NEXT DATA WORD JRST DATBYT ; DATYP8: POPJ P, ;RETURN. DECTYP: SKIPA T3,[EXP ^D10] OCTYPE: MOVEI T3,^D8 JRST RADTY2 RADTYP: HRRZ T3,ORADIX CAIE T3,^D10 JRST RADTY2 PUSHJ P,RADTY2 MOVEI T1,"." PJRST TYPCHR RADTY2: JUMPGE T1,RADTY5 MOVMS T1 PUSH P,T1 PUSHJ P,MINTYP POP P,T1 RADTY5: IDIVI T1,(T3) HRLM T2,(P) SKIPE T1 PUSHJ P,RADTY5 HLRZ T1,(P) ADDI T1,"0" CAILE T1,"9" ADDI T1,7 ;DOING HEX PJRST TYPCHR SIXTYP: MOVEM T1,T2 SXTYP1: SETZ T1, LSHC T1,6 ADDI T1,40 PUSHJ P,TYPCHR JUMPN T2,SXTYP1 POPJ P, TABTYP: PUSH P,T1 MOVEI T1," " TYPEIT: PUSHJ P,TYPCHR POP P,T1 POPJ P, CRLTYP: PUSH P,T1 MOVEI T1,15 ;CARRIAGE RETURN PUSHJ P,TYPCHR MOVEI T1,12 ;LINEFEED PJRST TYPEIT BLANKT: PUSH P,T1 MOVEI T1," " PJRST TYPEIT COMTYP: PUSH P,T1 MOVEI T1,"," PJRST TYPEIT PCNTYP: PUSH P,T1 MOVEI T1,"%" PJRST TYPEIT HSHTYP: PUSH P,T1 MOVEI T1,"#" PJRST TYPEIT MINTYP: PUSH P,T1 MOVEI T1,"-" PJRST TYPEIT PLUTYP: PUSH P,T1 MOVEI T1,"+" PJRST TYPEIT ;HERE TO TYPE OR PRINT A STRING OF CHARACTERS TYPSTR: PUSH P,T2 MOVE T2,[POINT 7,0] ADDI T2,(T1) ;COPY STRING POINTER TYPST3: ILDB T1,T2 ;GET NEXT CHAR JUMPE T1,TYPST5 PUSHJ P,TYPCHR ;TYPE THE CHARACTER JRST TYPST3 TYPST5: POP P,T2 ;RESTORE REGISTER POPJ P, ;HERE TO TYPE A SPACE SP.TYP: MOVEI T1," " ;A SPACE ;HERE TO TYPE OR PRINT A SINGLE CHARACTER TYPCHR: SKIPE OHD ;DOING A DUMP ? JRST TYPCH3 ;YES OUTCHR T1 POPJ P, TYPCH3: SOSGE OHD+2 ;ROOM IN BUFFER JRST TYPCH4 ;NO IDPB T1,OHD+1 POPJ P, TYPCH4: OUT JRST TYPCH3 HALT IFN FT2SEG < RELOC > OHD: BLOCK 3 IFN FT2SEG < RELOC > ;HERE ;HERE TO TYPE PROGRAM NAME IDTYPE: MOVEI T1,[ASCIZ \DDT60 \] PUSHJ P,TYPSTR LDB T1,[POINT 9,.JBVER,11] PUSHJ P,OCTYPE LDB T1,[POINT 6,.JBVER,17] MOVEI T1,100(T1) CAIE T1,100 PUSHJ P,TYPCHR MOVEI T1,"(" PUSHJ P,TYPCHR HRRZ T1,.JBVER PUSHJ P,OCTYPE MOVEI T1,")" PUSHJ P,TYPCHR LDB T1,[POINT 3,.JBVER,2] MOVNS T1 SKIPE T1 PUSHJ P,OCTYPE HRROI T1,3 ;CODE FOR PROGRAM NAME GETTAB T1, JRST IDTYP2 CAMN T1,[SIXBIT \DDT60\] JRST IDTYP2 PUSH P,T1 MOVEI T1,[ASCIZ \ = \] PUSHJ P,TYPSTR POP P,T1 PUSHJ P,SIXTYP IDTYP2: SKIPN SYMDEV JRST IDTYP3 MOVEI T1,[ASCIZ \ /Symbols:\] PUSHJ P,TYPSTR MOVEI T1,SYMDEV PUSHJ P,FILTYP IDTYP3: PUSHJ P,SP.TYP POPJ P, ;NOW TYPE THE DATE DATETY: DATE T1, IDIVI T1,^D31*^D12 ;LEAVE YEAR-64 IN T1 ADDI T1,^D64 PUSH P,T1 ;SAVE YEAR IDIVI T2,^D31 LSH T2,1 ;MULTIPLY BY 2 ADDI T2,MONTAB PUSH P,T2 ;SAVE ADR OF MONTH NAME AOS T1,T3 ;GET DAY PUSHJ P,DECTYP POP P,T1 ;GET MONTH PUSHJ P,TYPSTR ;TYPE MONTH NAME POP P,T1 ;GET YEAR PUSHJ P,DECTYP PUSHJ P,BLANKT ;TYPE A SPACE ;HERE TO TYPE THE TIME OF DAY TIMTYP: PUSH P,T1 PUSH P,T2 PUSH P,T3 MSTIME T1, ;GET TIME OF DAY IN MS IDIVI T1,^D1000 ;GET RID OF MS IDIVI T1,^D60 ;LEAVES SECONDS IN T2 PUSH P,T2 IDIVI T1,^D60 ;LEAVES MIN IN T2 PUSH P,T2 PUSHJ P,DECTYP MOVEI T1,":" PUSHJ P,TYPCHR POP P,T1 PUSHJ P,DC2TYP ;TYPE 2 DIGIT DECIMAL NUMBER MOVEI T1,":" PUSHJ P,TYPCHR POP P,T1 PUSHJ P,DC2TYP ;TYPE 2 DIGIT DECIMAL NUMBER POP P,T3 POP P,T2 POP P,T1 POPJ P, DC2TYP: CAIL T1,^D10 JRST DECTYP PUSH P,T1 MOVEI T1,"0" PUSHJ P,TYPCHR POP P,T1 JRST DECTYP MONTAB: ASCIZ \-Jan-\ ASCIZ \-Feb-\ ASCIZ \-Mar-\ ASCIZ \-April-\ ASCIZ \-May-\ ASCIZ \-June-\ ASCIZ \-July-\ ASCIZ \-Aug-\ ASCIZ \-Sept-\ ASCIZ \-Oct-\ ASCIZ \-Nov-\ ASCIZ \-Dec-\ LOCKER: OUTSTR [ASCIZ \?LOCK UUO failed - code \] PUSHJ P,OCTYPE EXIT NODERR: PUSHJ P,DONE.W ;CLOSE OUTPUT IF ANY OUTSTR [ASCIZ \?NODE UUO failed - code \] PUSHJ P,OCTYPE EXIT SUBTTL DUMP TO FILE ESC..D: MOVEM T5,DUMPF ;SAVE ARG TO $D COMMAND TRO FLG,F.WRIT ;REMEMBER WE ARE WRITING HRROI T1,3 GETTAB T1, ;GET NAME OF JOB MOVE T1,[SIXBIT \DDT60\] MOVSI T2,'LSD' PUSHJ P,OPNFIL JRST DUMP9 SETZM CACHEL ;SWEEP CACHE TRO FLG,F.CACH ;PUT USE IT AFTER IT IS SET UP MOVE DOT,SBEGIN ;WHERE TO BEGIN DUMP SETZM DUMPL ;FORCE TOP OF PAGE ; ; COME HERE TO DUMP THE NEXT WORD ; DUMP3: PUSHJ P,CRLTYP ;GO TO NEXT LINE SOSG DUMPL ;ROOM ON PAGE? PUSHJ P,DUMP7 ;NO, GO TO NEXT. HRRZ T1,DOT ;CURRENT LOCATION ANDI T1,177777 PUSHJ P,OCTYPE ;LOCATION IN OCTAL PUSHJ P,TABTYP HRRZ T1,DOT PUSHJ P,VALFND ;FIND SYMBOL, IF ANY. JRST DUMP1 ;THERE IS NONE. MOVE T1,0(SYM) ;GET SYMBOL NAME PUSHJ P,SIXTYP PUSHJ P,TABTYP HRRZ T1,DOT SUB T1,1(SYM) ;COMPUTE OFFSET ANDI T1,177777 JUMPE T1,DUMP2 ;THERE IS NONE PUSH P,T1 ;SAVE OFFSET PUSHJ P,PLUTYP ; TYPE "+" POP P,T1 ;GET OFFSET PUSHJ P,OCTYPE ;TYPE OFFSET JRST DUMP2 ;ONLYTWO TABS DUMP1: PUSHJ P,TABTYP DUMP2: PUSHJ P,TABTYP PUSHJ P,TABTYP MOVE T1,DOT MOVE T2,S..END SUB T2,T1 ;COMPUTE BYTES TO GO IN DUMP CAIL T2,EXMAX ;TOO MANY? SKIPA T2,[EXP EXMAX] ;YES, REDUCE TO MAX ADDI T2,2 PUSHJ P,GETWRD ;GET THIS WORD (AND SOME FOLLOWING) JRST DUMP8 ;NOT AVAILABLE, END THE DUMP MOVEM T1,DATA ;SAVE VALUE GOTTEN PUSHJ P,OCTYPE ;TYPE AS OCTAL WORD PUSHJ P,TABTYP MOVE T1,DATA ANDI T1,377 ;LOW BYTE PUSHJ P,OCTYPE PUSHJ P,COMTYP LDB T1,[POINT 8,DATA,27] ;HIGH BYTE PUSHJ P,OCTYPE PUSHJ P,TABTYP ; ; NOW TYPE AS DECIMAL ; MOVE T1,DATA PUSHJ P,DECTYP PUSHJ P,TABTYP MOVE T1,DATA ANDI T1,377 ;LOW BYTE PUSHJ P,DECTYP PUSHJ P,COMTYP LDB T1,[POINT 8,DATA,27] ;HIGH BYTE PUSHJ P,DECTYP PUSHJ P,TABTYP HRRZ T1,DATA PUSHJ P,VALFND ;FIND SYMBOL FOR ADDRESS JRST DUMP4 MOVE T1,0(SYM) PUSHJ P,SIXTYP PUSHJ P,TABTYP HRRZ T1,DATA SUB T1,1(SYM) ;COMPUTE OFFSET ANDI T1,177777 JUMPE T1,DUMP5 ;OFFSET IS ZERO PUSH P,T1 ;SAVE OFFSET PUSHJ P,PLUTYP POP P,T1 PUSHJ P,OCTYPE ;TYPE OFFSET JRST DUMP5 DUMP4: PUSHJ P,TABTYP DUMP5: PUSHJ P,TABTYP MOVE T1,DATA ANDI T1,377 ;LOW BYTE MOVE T3,T1 PUSHJ P,DUMP6 ;PRINT AS ASCII PUSHJ P,COMTYP LDB T1,[POINT 8,DATA,27] MOVE T3,T1 PUSHJ P,DUMP6 ;LIKEWISE HIGH BYTE PUSHJ P,TABTYP ; ; NOW TYPE AS EBCDIC ; MOVE T1,DATA ANDI T1,377 MOVE T3,T1 SETZ T2, LSHC T1,-2 ROT T2,2 LDB T1,[POINT 8,EB.TRN(T1),7 POINT 8,EB.TRN(T1),15 POINT 8,EB.TRN(T1),23 POINT 8,EB.TRN(T1),31](T2) PUSHJ P,DUMP6 PUSHJ P,COMTYP LDB T1,[POINT 8,DATA,27] ANDI T1,377 MOVE T3,T1 SETZ T2, LSHC T1,-2 ROT T2,2 LDB T1,[POINT 8,EB.TRN(T1),7 POINT 8,EB.TRN(T1),15 POINT 8,EB.TRN(T1),23 POINT 8,EB.TRN(T1),31](T2) PUSHJ P,DUMP6 PUSHJ P,TABTYP SETZ T5, ;ONLY ONE INSTRUCTION SETZ DOTFOO, MOVE T1,DATA SKIPN DUMPF ;IF $1D, DON'T PRINT INSTRUCTION PUSHJ P,DATINS ADDI DOT,2 CAMG DOT,S..END JRST DUMP3 ;DUMP NEXT WORD DUMP8: PUSHJ P,CRLTYP PUSHJ P,DONE.W OUTSTR [ASCIZ \ Dump done \] JRST LEVEL0 ; ; SUBROUTINE TO PRINT A CHARACTER, OR ITS OCTAL IF THIS IS ; NOT PRINTABLE ; DUMP6: CAIL T1,40 CAILE T1,175 ;LOWER CASE PRINTER ASSUMED SKIPA PJRST TYPCHR ;CHAR OK, PRINT IT. MOVEI T1,[ASCIZ \??\] PUSHJ P,TYPSTR POPJ P, ; ; HERE ON ERROR. ; DUMP9: OUTSTR [ASCIZ \error writing \] JRST FILERR JRST LEVEL0 DUMPL: BLOCK 1 ;LINES TO GO ON THIS PAGE DUMPF: BLOCK 1 ;ARG TO $D COMMAND ; ; SUBROUTINE TO PRINT DUMP PAGE HEADER ; DUMP7: MOVEI T1,14 ;FORM FEED PUSHJ P,TYPCHR MOVEI T1,[ASCIZ \Dump of \] PUSHJ P,TYPSTR SKIPE MEMORY JRST [ MOVEI T1,DMPDEV PUSHJ P,FILTYP ;TYPE FILE ID JRST DUMP0 ] MOVE T1,[SIXBIT \/PORT:\] SKIPE NODE MOVE T1,[SIXBIT \/NODE:\] PUSHJ P,SIXTYP SKIPN T1,NODE HRRZ T1,PORT MOVEI T2,OCTYPE TLNE T1,-1 MOVEI T2,SIXTYP PUSHJ P,(T2) DUMP0: MOVEI T1,[ASCIZ \ by \] PUSHJ P,TYPSTR PUSHJ P,IDTYPE PUSHJ P,DATETY ;TYPE DATE AND TIME PUSHJ P,CRLTYP PUSHJ P,CRLTYP MOVEI T1,[ASCIZ \Location Octal Decimal Address ASCII EBCDIC Instruction\] PUSHJ P,TYPSTR PUSHJ P,CRLTYP MOVEI T1,[ASCIZ \value symbol word byte word byte\] PUSHJ P,TYPSTR PUSHJ P,CRLTYP MOVEI T2,^D132 MOVEI T1,"-" PUSHJ P,TYPCHR SOJG T2,.-1 PUSHJ P,CRLTYP PUSHJ P,CRLTYP MOVEI T1,^D60-7 ;REMAINING PAGE LENGTH MOVEM T1,DUMPL POPJ P, SUBTTL DUMP TO A BINARY FILE ESC..P: TRO FLG,F.WRIT ;REMEMBER WE ARE WRITING MOVE T1,[SIXBIT /KRUFT/] ;DEFAULT FILE NAME MOVSI T2,'BIN' ;DEFAULT EXTENSION PUSHJ P,OPNFIL ;OPEN FILE HALT MOVEI T1,1 PUSHJ P,WRTWRD ;WRITE BINARY WORD HALT WRTWRD: SOSGE OHD+2 ;IS THERE ROOM IN BUFFER ? JRST WRTBN9 ;NO ROOM IDPB T1,OHD+1 ;PUT BYTE INTO BUFFER POPJ P, WRTBN9: OUT CAIA JRST FILERR ;COMPLAIN PUSH P,T1 ;SAVE DATA LDB T1,[POINT 6,OHD+1,11] ;GET S FROM BYTE POINTER TRNE FLG,F..ESC ;PUNCHING TAPE ? JRST WRTWD6 ;YES WRTWD6: WRTWD7: POP P,T1 ;GET DATA BACK JRST WRTWRD IFN FTPROM < PROM: INIT 10 SIXBIT /PTP/ OHD,,0 JRST DUMP9 OUTBUF 1 ;GET ONE BUFFER PUSHJ P,PROM.7 JFCL PUSHJ P,PROM.7 LSH T1,-^D4 IFN ROMTYP < ;IF M9301 PUSHJ P,PROM.7 LSH T1,-^D8 PUSHJ P,PROM.7 LSH T1,-^D12 >;END OF IFN ROMTYP PJRST DUMP8+1 PROM.7: MOVEI T1,377 PUSHJ P,TYPCHR MOVE DOT,SBEGIN IFE ROMTYP < ;ONLY BM873 MOVEI T4,^D128 >;END OF IFE ROMTYP IFN ROMTYP < ;ONLY M9301 MOVEI T4,^D256 >;END OF IFN ROMTYP PROM.8: MOVE T1,DOT IFN ROMTYP < ;M9301 ONLY MOVEI T2,2 ;REQUEST 2 BYTES >;END OF IFN ROMTYP PUSHJ P,GETWRD SETZ T1, XCT @(P) IFE ROMTYP < ;ONLY BM873 PUSH P,T1 >;END OF IFE ROMTYP ANDI T1,17 PUSHJ P,TYPCHR IFE ROMTYP < ;ONLY BM873 POP P,T1 LSH T1,-^D8 ANDI T1,17 PUSHJ P,TYPCHR >;END OF IFE ROMTYP ADDI DOT,2 SOJG T4,PROM.8 IFN ROMTYP < ;ONLY M9301 MOVE DOT,S..END MOVEI T4,^D256 PROM.9: MOVE T1,DOT MOVEI T2,2 PUSHJ P,GETWRD SETZ T1, XCT @(P) ANDI T1,17 PUSHJ P,TYPCHR ADDI DOT,2 SOJG T4,PROM.9 >;END OF IFN ROMTYP MOVEI T4,^D256 SETZ T1, PUSHJ P,TYPCHR SOJGE T4,.-1 AOS (P) POPJ P, >;END OF IFN FTPROM RDCHAR: INCHWL T1 ;GET THE NEXT CHAR PUSHJ P,GETCH0 JRST RDCHAR POPJ P, ;HERE TO GET A CHARACTER FROM THE TTY GETCHR: INCHRW T1 ;GET THE NEXT CHAR PUSHJ P,GETCH0 JRST GETCHR POPJ P, GETCH0: JUMPE T1,CPOPJ ;FLUSH NULLS CAIN T1,15 ;IS THIS A CARRIAGE RETURN ? JRST [ PUSHJ P,GETCHR ;GET LF MOVEI T1,15 ;MAKE LF JRST .+1 ] CAIL T1,40+"A" ;CHECK FOR LOWER CASE CAILE T1,40+"Z" CAIA TRZ T1,40 ;CONVERT TO UPPER CASE MOVEM T1,LASCAR# ;REMEMBER LAST CHARACTER INPUT JRST CPOPJ1 SUBTTL /BIN: AND /DUMP: FILE HANDLING ;HERE BECAUSE WE FOUND /BIN OR /DUMP IN INITIAL DIALOG ; READ EITHER A BOOT11 OR NETLDR DUMP OR A BINARY FILE RDDUMP: MOVE T1,[SIXBIT \PDPXI0\] ;DEFAULT FILE NAME MOVSI T2,'LSD' ;DEFAULT EXTENSION TRNE FLG,F.FLOP ;READING BINARY FILE ? MOVSI T2,'BIN' ;DEFAULT EXTENSION FOR BIN FILES PUSHJ P,OPNFL0 JRST DDT60 ;BEGIN ALL OVER AGAIN MOVE T1,[FILDEV,,DMPDEV] BLT T1,DMPDEV+3 ;COPY FILDEV, FILNAM, FILEXT, FILPPN HLRZ T1,FILEXT ;GET FILE EXTENSION HRRZ T1,.JBFF## ;GET FIRST FREE LOCATION MOVEM T1,MEMORY ;SAVE ADDRESS OF SIMULATED MEMORY SETZM MEMLIM ;FIRST NONEXISTENT ADDRESS IN DUMP MEMORY AOS .JBFF## PUSHJ P,GETCOR TRZN FLG,F.FLOP ;READING A BINARY FILE ? JRST RDUMP0 ;NO READING A DUMP SETZB T5,T4 ;ACCUMULATE CHECKSUM HERE LDB T1,[POINT 6,IHD+1,11] ;GET S FIELD FROM INPUT POINTER CAIN T1,^D36 ;WORD POINTER ? JRST RDBN10 ;YEH CAIE T1,^D7 ;ASCII POINTER ? EXIT MOVEI T1,^D36 DPB T1,[POINT 6,IHD+1,11] ;CHANGE POINTER MOVE T1,IHD+2 ;GET COUNT IDIVI T1,5 ;CONVERT TO WORD COUNT MOVEM T1,IHD+2 ;HERE TO LOOK FOR INITIAL 1 RDBN10: PUSHJ P,RDBN70 ;GET NEXT CHAR JRST RDUMP9 ;ALL DONE JUMPE T1,RDBN10 ;LOOP ON HEADER CAIE T1,1 ;IS THIS LEADING 1 ? JRST [OUTSTR [ASCIZ \improper format in input tape\] EXIT ] PUSHJ P,RDBN70 ;GET NEXT WORD = 0 EXIT JUMPN T1,[ EXIT ] PUSHJ P,RDBN60 ;GET 16BIT WORD = COUNT MOVEI T3,-6(T1) ;MAKE BYTE COUNT PUSHJ P,RDBN60 ;GET 16BIT WORD = ADR MOVE T2,T1 ;COPY ADDRESS JUMPE T3,RDBN30 RDBN20: PUSHJ P,RDBN70 ;GET NEXT BYTE TO STUFF EXIT PUSHJ P,PUTBYT ;PUT BYTE INTO MEMORY AOS T2 ;ADVANCE LOCATION COUNTER SOJG T3,RDBN20 RDBN30: PUSHJ P,RDBN60 ;INCLUDE CHECKSUM IN CALC TRNE T5,377 ;TEST CHECKSUM JRST [ OUTSTR [ASCIZ \CHECKSUM ERROR\] EXIT ] JRST RDBN10 ;HERE TO GET SIXTEEN BITS RDBN60: PUSHJ P,RDBN70 ;GET LOW ORDER BITS EXIT PUSH P,T2 LSHC T1,-^D8 ;SHOVE EM INTO T2 PUSHJ P,RDBN70 ;GET HIGH ORDER BITS EXIT ROTC T1,^D8 ;ADD LOW ORDER BITS POP P,T2 POPJ P, ;RETURN TO CALLER ;HERE TO GET NEXT BYTE FROM BINARY FILE RDBN70: JUMPE T4,RDBN74 ;HALF OF PREVIOUS WORD LEFT ? LDB T1,[POINT 8,T4,27] ;LOW ORDER BITS FROM PREV HLF WRD SETZ T4, ;DONE WITH HALF WORD JRST RDBN79 RDBN74: SOSGE IHD+2 ;MORE DATA IN BUFFER ? JRST RDBN80 ;NO SO READ MORE ILDB T1,IHD+1 TRNN FLG,F.FLOP ;IS THIS PACKED FILE ? JRST RDBN79 ;NO HRRO T4,T1 ;COPY HALF WORD LDB T1,[POINT 8,T4,35] ;GET HIGH ORDER BITS RDBN79: ANDI T1,377 ;STRIP EXTRA BITS ADDI T5,(T1) ;INCLUDE IN CHECKSUM JRST CPOPJ1 RDBN80: IN ;GET NEXT BUFFER JRST RDBN85 ;GOT NEXT BUFFER POPJ P, RDBN85: HRRZ T1,IHD ;GET ADDRES OF CURRENT BUFFER HLRE T1,2(T1) ;GET FIRST WORD IN BUFFER JUMPL T1,RDIMAG ;THIS IS A DTELDR BINARY FILE JUMPE T1,RDBN70 ;PROCEED TRO FLG,F.FLOP ;IS PACKED FILE LDB T1,[POINT 6,IHD+1,11] ;GET S FIELD FROM INPUT POINTER CAIN T1,^D18 ;HALF WORD POINTER JRST RDBN70 ;YES MOVEI T1,^D18 DPB T1,[POINT 6,IHD+1,11] ;CHANGE POINTER MOVE T1,IHD+2 ;GET WORD COUNT LSH T1,1 ;MULTIPLY BY 2 MOVEM T1,IHD+2 JRST RDBN70 DMPDEV: EXP 0 EXP 0 EXP 0 EXP 0 ; ; COME HERE IF WE HAVE A DTELDR BINARY FILE ; ;HERE IF WE HAVE A DTELDR DUMP (A .BIN FILE WITH THE SIGN BIT ON IN ;THE FIRST WORD). READ ALL THE DATA AND STORE IN CONTIGUOUS MEMORY RDIMAG: SETO T2, ;THIS WILL INCREMENT TO 0 FOR FIRST BYTE RDIMA1: SOSL IHD+2 ;ANY DATA LEFT IN BUFFER? JRST RDIMA2 ;YES, USE IT IN ;NO, GET A NEW BUFFER JRST RDIMA1 ;OK. TRY AGAIN POPJ P, ;ERROR - ASSUME EOF RDIMA2: ILDB T1,IHD+1 ;GET NEXT WORD MOVS T1,T1 ;GET BYTES IN REVERSE ORDER (3,2,,1,0) PUSHJ P,PUTBYI ;STUFF 0 IN NEXT LOCATION ROT T1,-^D8 ;POSITION TO NEXT BYTE PUSHJ P,PUTBYI ;STUFF ROT T1,-^D10 ;THIRD, ACCOUNT FOR 2 EXTRA BITS PUSHJ P,PUTBYI ROT T1,-^D8 ;FOURTH AND LAST PUSHJ P,PUTBYI JRST RDIMA1 ;NEXT WORD ; COME HERE IF WE HAVE A DUMP IMAGE FILE. SUCH A FILE HAS EACH 16-BIT ; WORD FROM THE PDP-11 IN A HALF-WORD OF THE FILE. ; DUMPS OF THIS KIND ARE PRODUCED BY DTELDR AND BY DASLOD. ; ; THE /BIN SWITCH WILL READ DTELDR DUMPS BY RECOGNIZING A SPECIAL FLAG ; IN THE FIRST WORD OF THE FILE. THIS SUBROUTINE WILL READ EITHER ; KIND OF FILE. ; RDDIMG: MOVE T1,[SIXBIT /DTED01/] ;DEFAULT FILE NAME MOVSI T2,'BIN' ;DEFAULT EXTENSION PUSHJ P,OPNFL0 ;OPEN THE FILE (NO DIALOG) JRST DDT60 ;CAN'T, RESTART. HRRZ T1,.JBFF## ;BUILD CORE IMAGE AT END OF MEMORY MOVEM T1,MEMORY SETZM MEMLIM ;AS YET, MEMORY IS EMPTY AOS .JBFF## ;WE HAVE USED THAT WORD PUSHJ P,GETCOR ;BE SURE MEMORY IS ALLOCATED MOVEI T1,^D36 ;SET BYTE POINTER TO 36-BIT MODE DPB T1,[POINT 6,IHD+1,11] MOVE T1,IHD+2 ;RECOMPUTE FIRST BUFFER COUNT IDIVI T1,5 MOVEM T1,IHD+2 SETO T2, ;WILL BE INCREMENTED TO 0 BY FIRST CALL TO PUTBYI ; ; PROCESS ANOTHER FILE WORD ; RDDIM1: SOSL IHD+2 ;ANY DATA LEFT IN BUFFER? JRST RDDIM2 ;YES, PROCESS IT. IN ;NO, GET A NEW BUFFER JRST RDDIM1 ;GOT ONE, PROCESS IT. JRST RDUMP9 ;ASSUME EOF, PRINT MEMORY SIZE RDDIM2: ILDB T1,IHD+1 ;GET WORD FROM FILE MOVSS T1 ;PUT PDP-11 BYTES IN RATIONAL ORDER PUSHJ P,PUTBYI ;STORE FIRST BYTE IN MEMORY ROT T1,-10 PUSHJ P,PUTBYI ;SECOND BYTE ROT T1,-12 PUSHJ P,PUTBYI ;THIRD BYTE ROT T1,-10 PUSHJ P,PUTBYI ;FOURTH BYTE JRST RDDIM1 ;PROCESS REST OF FILE ; ;HERE TO PUT A BYTE INTO A CORE DUMP ; CALL PUSHJ P,PUTBYT WITH DATA IN T1, ADR IN T2 ; PUTBYI: ADDI T2,1 ;PUT IN NEXT LOCATION PUTBYT: PUSHJ P,SAVE4 SKIPE MEMORY ;DO WE HAVE A BASE ADDRESS FOR DUMPS ? JRST PUTBY4 PUSH P,T1 MOVE T1,.JBFF## ;ADDRESS OF FIRST FREE WORD MOVEM T1,MEMORY AOS .JBFF PUSHJ P,GETCOR SETZM MEMLIM SETZM @MEMORY POP P,T1 PUTBY4: CAMG T2,MEMLIM ;IS ADDRESS LARGER THAN PREVIOUS LIMIT ? JRST PUTBY8 ;NO PUSH P,T1 ;SAVE DATA PUSH P,T2 ;SAVE ADDRESS AOS T2,MEMLIM ;INCREASE LIMIT TRNE T2,3 ;ADVANCING TO NEXT WORD ? JRST PUTBY6 AOS .JBFF## ;GET ANOTHER WORD FOR CORE PUSHJ P,GETCOR PUTBY6: SETZ T1, ;FOR MEMORY PUSHJ P,PUTBY9 ;PUT ZERO BYTE INTO SIMULATED MEMORY POP P,T2 POP P,T1 JRST PUTBY4 PUTBY8: IORI T1,400 PUTBY9: IDIVI T2,^D4 ADD T2,MEMORY ;RELOCATE ADD T2,[ POINT 9,0,8 POINT 9,0,17 POINT 9,0,26 POINT 9,0,35 ](T3) DPB T1,T2 POPJ P, SAVE4: PUSH P,T1 PUSH P,T2 PUSH P,T3 PUSH P,T4 PUSHJ P,@-4(P) POP P,T4 POP P,T3 POP P,T2 POP P,T1 POP P,(P) POPJ P, ;ROUTINES TO READ BOOT11 OR NETLDR DUMPS ;HERE TO FLUSH REST OF INPUT LINE RDUMP0: PUSHJ P,FILCHR ;GET NEXT CHAR FROM DUMP JRST RDUMP9 ;END OF DUMP CAIE T1,12 ;WE ARE LOOKING FOR A LINE FEED JRST RDUMP0 ;AND DIDN'T FIND ONE RDUMP1: PUSHJ P,INPOCT ;GET ADR JRST RDUMP9 CAIN T2,12 ;SKIP EXTRA LINE FEEDS JRST RDUMP1 ; GENERATED BY DTELDR CAIE T2,":" ;FINISHED READING ADDRESS ? JRST RDUMP0 ;FLUSH LINE MOVEM T1,DOT ;SAVE ADDRESS RDUMP3: PUSHJ P,INPOCT ;GET DATA FOR LINE JRST RDUMP9 ;END OF DUMP CAIE T2,15 ;CHECK FOR CR CAIN T2,11 ;CHECK FOR HT JRST RDUMP6 ;THAT WAS DATA JRST RDUMP0 ;FLUSH LINE RDUMP6: MOVE T2,DOT ;GET ADDRESS PUSHJ P,PUTBYT LSH T1,-^D8 AOS T2,DOT PUSHJ P,PUTBYT AOJA DOT,RDUMP3 ;BACK FOR MORE DATA RDUMP9: MOVE T1,MEMLIM ;HIGHEST ADDRESS READ MOVEM T1,S..END ;END OF SEARCH SUBI T1,1 OUTSTR [ASCIZ \ highest location is \] MOVE T1,MEMLIM PUSHJ P,OCTYPE OUTSTR [ASCIZ \ \] POPJ P, SUBTTL Routines to write/read the DN200 IFN FTJSYS,< ; ; The SINs and SOUTs are merely replaced by calls to the BOOT JSYS. ; JFN is in this case used for the line number over which we are talking ; to the DN200. It may be 0 or 1. .BTLEN=2 .BTMSG=1 MAXBYT==274 ;cannot send more than this RTRIES==10 ;Number of times to try for response BTSIZ==20 ;size of BOOT JSYS argument block BTARG: BLOCK BTSIZ ;The BOOT JSYS argument block RETRY: BLOCK 1 RDLIN: BLOCK 1 RDMSG: BLOCK 1 RDLEN: BLOCK 1 MOPMSG: BLOCK MAXBYT_<-2>+1 ;ADD ONE TIL KDPSRV BUG FIXED;!!; APRNUM: BLOCK 1 ; Processor serial number KSFLG: BLOCK 1 ; Flag for 2020 (non-zero) ;routine to clear the BOOT JSYS argument block CLRBOT: HRRI T4,1+BTARG ;address of arg block HRLI T4,-1(T4) ;address,,address+1 for blt SETZM BTARG ;zero 1st word BLT T4,BTSIZ-1+BTARG ;clear rest POPJ P, WR200: PUSHJ P,CLRBOT ;clear MOVEI T4,BTARG ;address of MOVEM T1,.BTDTE(T4) ;line # over which we are conversing MOVMM T3,.BTLEN(T4) ;the number of bytes MOVE T4,[POINT 8,MOPMSG] ;WHERE TO COPY MESSAGE SKIPN T3 ;ZERO LENGTH NO ALLOWED POPJ P, WRLOP: ILDB T1,T2 ;GET A BYTE FROM INPUT IDPB T1,T4 ;DEPOSIT IN BUFFER AOJL T3,WRLOP ;LOOP OVER ALL BYTES MOVEI T2,BTARG ;ADDRESS OF ARG BLOCK FOR BOOT JSYS MOVE T1,[POINT 8,MOPMSG] MOVEM T1,.BTMSG(T2) ;STORE IN BOOT ARG BLOCK MOVEI T1,21 ;function code for write BOOT ERJMP .+2 AOS (P) POPJ P, ;success return RD200: MOVEM T1,RDLIN MOVEM T2,RDMSG MOVEM T3,RDLEN MOVEI T4,RTRIES ;RETRY COUNTER MOVEM T4,RETRY RD2RTY: PUSHJ P,CLRBOT ;clear MOVEI T4,BTARG ;address of MOVEM T1,.BTDTE(T4) ;line # over which we are conversing MOVE T2,[POINT 8,MOPMSG] MOVEM T2,.BTMSG(T4) ;pointer to data MOVMM T3,.BTLEN(T4) ;the number of bytes MOVE T2,T4 ;where the BOOT jsys expects arg address MOVEI T1,22 ;function code for read BOOT ERJMP RD2ERR SKIPLE T1,.BTLEN(T4) ;POSITIVE MEANS WE GOT DATA JRST RD2OK ;RETURN OKAY SKIPE T1 ;NEGATIVE MEANS JRST [HRRZS T1 ; CAIN T1,1 ;LINE CAME UP JRST RD2AGN ;READ NEXT MESSAGE CAIN T1,3 ;TRANSMISSION COMPLETE JRST RD2AGN ;READ NEXT MESSAGE JRST RD2ERR ;ERROR ] SOSGE RETRY ;HAVE WE ALREADY TRIED TWICE? JRST RD2ERR ;YES MOVEI T1,^D100 ;WAIT 1/10 SECOND DISMS RD2AGN: MOVE T1,RDLIN MOVE T2,RDMSG MOVE T3,RDLEN JRST RD2RTY ;RETRY RD2OK: MOVN T3,T1 ;GET RECEIVED LENGTH MOVE T4,[POINT 8,MOPMSG] MOVE T2,RDMSG CAMN T2,T4 ;IF SOURCE AND DESTINATION SAME JRST RD2RET ;NO NEED TO COPY RDLOP: ILDB T1,T4 ;GET A BYTE FROM MESSAGE IDPB T1,T2 ;PUT WHERE USER WANTS IT AOJL T3,RDLOP RD2RET: AOS (P) RD2ERR: POPJ P, ;success return ;ROUTINE TO FLUSH THE DDCMP BUFFERS FLSHFE: MOVE T1,D60JFN ;THE FE LINE MOVE T2,[POINT 8,MOPMSG] ;WHERE TO PUT FLUSHD DATA MOVEI T3,MAXBYT ;MAXIMUM SIZE OF MESSAGE CALL RD200 ;DO THE FLUSH JFCL ;IGNORE ERRORS JUMPN T1,FLSHFE ;IF MORE , FLUSH THAT TOO POPJ P, ;RETURN WHEN DONE SUBTTL PRCTYP -- Routine to type the processor ; Routine - PRCTYP ; ; Function - ; ; This routine determines whether we are running on a KL or KS system. ; ; Parameters - none ; ; Returns - True always ; ; APRNUM/ Contains the processor serial number ; KSFLG/ 0 if KL, non-zero if KS PRCTYP: PUSH P,T1 ; Save some registers PUSH P,T2 MOVE T1,[SIXBIT \APRID\] ; Table in TOPS20 to check SYSGT ; for the processor serial number MOVEM T1,APRNUM ; Save the processor serial number SETZM KSFLG ; Default to KL CAIL T1,^d4096 ; Test for a KS serial number SETOM KSFLG ; Yes .. so set such an indicator POP P,T2 ; Restore registers POP P,T1 POPJ P, > ;End if TOPS20 (FTJSYS) ;PDP11 WORDS ARE READ INTO PDP10 HALF WORDS WITH AN INCREMENTING BYTE POINTER ; IF PDP11 WORD WAS READ IN THE BIT 200000 OF THE HALF WORD WILL BE SET ; IF PDP11 WORD IS MODIFIED, BIT 400000 OF THE HALF WORD WILL BE SET IFN FT2SEG < RELOC > MEMORY: EXP Z ;ADDRESS OF DUMP MEMORY MEMLIM: EXP Z ;HIGHEST LOCATION IN DUMP IFN FT2SEG < RELOC > ;TRANSLATION TABLE FROM EBCDIC TO ASCII EB.TRN: BYTE (8)000,001,002,003,000,011,000,177 ;000-007 BYTE (8)000,000,000,013,014,015,000,000 ;010-017 BYTE (8)000,021,022,000,000,000,000,000 ;020-027 BYTE (8)000,000,000,000,000,000,000,000 ;030-037 BYTE (8)000,000,000,000,000,000,000,000 ;040-047 BYTE (8)000,000,000,000,000,000,000,000 ;050-057 BYTE (8)000,000,000,000,000,000,000,000 ;060-067 BYTE (8)000,000,000,000,000,000,000,000 ;070-077 BYTE (8)040,000,000,000,000,000,000,000 ;100-107 BYTE (8)000,000,133,056,074,050,053,041 ;110-117 BYTE (8)046,000,000,000,000,000,000,000 ;120-127 BYTE (8)000,000,135,044,052,051,073,136 ;130-137 BYTE (8)055,057,000,000,000,000,000,000 ;140-147 BYTE (8)000,000,174,054,045,137,076,077 ;150-157 BYTE (8)000,000,000,000,000,000,000,000 ;160-167 BYTE (8)000,140,072,043,100,047,075,042 ;170-177 BYTE (8)000,141,142,143,144,145,146,147 ;200-207 BYTE (8)150,151,000,000,000,000,000,000 ;210-217 BYTE (8)000,152,153,154,155,156,157,160 ;220-227 BYTE (8)161,162,000,000,000,000,000,000 ;230-237 BYTE (8)000,176,163,164,165,166,167,170 ;240-247 BYTE (8)171,172,000,000,000,000,000,000 ;250-257 BYTE (8)000,000,000,000,000,000,000,000 ;260-267 BYTE (8)000,000,000,000,000,000,000,000 ;270-277 BYTE (8)173,101,102,103,104,105,106,107 ;300-307 BYTE (8)110,111,000,000,000,000,000,000 ;310-317 BYTE (8)175,112,113,114,115,116,117,120 ;320-327 BYTE (8)121,122,000,000,000,000,000,000 ;330-337 BYTE (8)134,000,123,124,125,126,127,130 ;340-347 BYTE (8)131,132,000,000,000,000,000,000 ;350-357 BYTE (8)060,061,062,063,064,065,066,067 ;360-367 BYTE (8)070,071,000,000,000,000,000,000 ;370-377 SUBTTL STATE TABLES STATE0: EXP LOOP ,ILLCHR,ILLCHR,ILLCHR,ILLCHR,ILLCHR,ILLCHR,ILLCHR ;00-07 EXP ILLCHR,COMHT ,COMLF ,ILLCHR,ILLCHR,LEVEL0,ILLCHR,ILLCHR ;10-17 EXP ILLCHR,ILLCHR,ILLCHR,ILLCHR,ILLCHR,ILLCHR,ILLCHR,ILLCHR ;20-27 EXP EXPXOR,ILLCHR,COMCZ ,ESCAPE,ILLCHR,ILLCHR,ILLCHR,ILLCHR ;30-37 EXP LOOP ,ILLCHR,ILLCHR,ILLCHR,ASSYMB,ILLCHR,ILLCHR,ILLCHR ;40-47 EXP ILLCHR,ILLCHR,ILLCHR,EXPLUS,ILLCHR,EXPMIN,ASSYMB,ILLCHR ;50-57 EXP ASSNUM,ASSNUM,ASSNUM,ASSNUM,ASSNUM,ASSNUM,ASSNUM,ASSNUM ;60-67 EXP ASSDEC,ASSDEC,ILLCHR,ILLCHR,ILLCHR,EQUALS,ILLCHR,ILLCHR ;70-77 EXP ILLCHR,ASSYMB,ASSYMB,ASSYMB,ASSYMB,ASSYMB,ASSYMB,ASSYMB ;100-107 EXP ASSYMB,ASSYMB,ASSYMB,ASSYMB,ASSYMB,ASSYMB,ASSYMB,ASSYMB ;110-117 EXP ASSYMB,ASSYMB,ASSYMB,ASSYMB,ASSYMB,ASSYMB,ASSYMB,ASSYMB ;120-127 EXP ASSYMB,ASSYMB,ASSYMB,ILLCHR,COMBSL,ILLCHR,COMARR,ILLCHR ;130-137 EXP ILLCHR,ASSYMB,ASSYMB,ASSYMB,ASSYMB,ASSYMB,ASSYMB,ASSYMB ;140-147 EXP ASSYMB,ASSYMB,ASSYMB,ASSYMB,ASSYMB,ASSYMB,ASSYMB,ASSYMB ;150-157 EXP ASSYMB,ASSYMB,ASSYMB,ASSYMB,ASSYMB,ASSYMB,ASSYMB,ASSYMB ;160-167 EXP ASSYMB,ASSYMB,ASSYMB,ILLCHR,ILLCHR,ILLCHR,ILLCHR,COMRUB ;170-177 ;STATE TABLE WHEN BUILDING AN EXPRESSION STATEE: EXP LOOP ,ILLCHR,ILLCHR,ILLCHR,ILLCHR,ILLCHR,ILLCHR,ILLCHR ;00-07 EXP ILLCHR,STEHT ,STELF ,ILLCHR,ILLCHR,STECR ,ILLCHR,ILLCHR ;10-17 EXP ILLCHR,ILLCHR,ILLCHR,ILLCHR,ILLCHR,ILLCHR,ILLCHR,ILLCHR ;20-27 EXP EXPXOR,ILLCHR,COMCZ ,ESCEXP,ILLCHR,ILLCHR,ILLCHR,ILLCHR ;30-37 EXP EXPLUS,EXPIOR,ILLCHR,ILLCHR,ASSYMB,ILLCHR,EXPAND,EXPDIV ;40-47 EXP ILLCHR,ILLCHR,EXPMUL,EXPLUS,ILLCHR,EXPMIN,ASSPER,OPNLOC ;50-57 EXP ASSNUM,ASSNUM,ASSNUM,ASSNUM,ASSNUM,ASSNUM,ASSNUM,ASSNUM ;60-67 EXP ASSDEC,ASSDEC,DEFSYM,ILLCHR,SLOWLM,EXPEQU,SUPLIM,ILLCHR ;70-77 EXP ASSYMB,ASSYMB,ASSYMB,ASSYMB,ASSYMB,ASSYMB,ASSYMB,ASSYMB ;100-107 EXP ASSYMB,ASSYMB,ASSYMB,ASSYMB,ASSYMB,ASSYMB,ASSYMB,ASSYMB ;110-117 EXP ASSYMB,ASSYMB,ASSYMB,ASSYMB,ASSYMB,ASSYMB,ASSYMB,ASSYMB ;120-127 EXP ASSYMB,ASSYMB,ASSYMB,ILLCHR,COMBSE,ILLCHR,STEARR,BKARRW ;130-137 EXP ILLCHR,ASSYMB,ASSYMB,ASSYMB,ASSYMB,ASSYMB,ASSYMB,ASSYMB ;140-147 EXP ASSYMB,ASSYMB,ASSYMB,ASSYMB,ASSYMB,ASSYMB,ASSYMB,ASSYMB ;150-157 EXP ASSYMB,ASSYMB,ASSYMB,ASSYMB,ASSYMB,ASSYMB,ASSYMB,ASSYMB ;160-167 EXP ASSYMB,ASSYMB,ASSYMB,ILLCHR,ILLCHR,ILLCHR,ILLCHR,COMRUB ;170-177 ;STATE TABLE WHEN USER TYPES ALTMODE STATSC: EXP LOOP,ILLCHR,ILLCHR,ILLCHR,ILLCHR,ILLCHR,ILLCHR,ILLCHR ;00-07 EXP ILLCHR,ILLCHR,ILLCHR,ILLCHR,ILLCHR,ILLCHR,ILLCHR,ILLCHR ;10-17 EXP ILLCHR,ILLCHR,ILLCHR,ILLCHR,ILLCHR,ILLCHR,ILLCHR,ILLCHR ;20-27 EXP ILLCHR,ILLCHR,COMCZ ,ESCESC,ILLCHR,ILLCHR,ILLCHR,ILLCHR ;30-37 EXP ILLCHR,ILLCHR,ILLCHR,ILLCHR,ILLCHR,ILLCHR,ILLCHR,ILLCHR ;40-47 EXP ILLCHR,ILLCHR,ILLCHR,ILLCHR,ILLCHR,ILLCHR,ILLCHR,ILLCHR ;50-57 EXP ESC..0,ESC..0,ESC..0,ESC..0,ESC..0,ESC..0,ESC..0,ESC..0 ;60-67 EXP ESC..0,ESC..0,ILLCHR,ILLCHR,ILLCHR,ILLCHR,ILLCHR,ILLCHR ;70-77 EXP ILLCHR,ESC..A,ESC..B,ESC..C,ESC..D,ILLCHR,ILLCHR,ESC..G ;100-107 EXP ILLCHR,ESC..I,ILLCHR,ESC..K,ILLCHR,ESC..M,ESC..N,ILLCHR ;110-117 EXP ESC..P,ILLCHR,ESC..R,ESC..S,ESC..T,ILLCHR,ESC..V,ESC..W ;120-127 EXP ILLCHR,ILLCHR,ILLCHR,ILLCHR,ILLCHR,ILLCHR,ILLCHR,ILLCHR ;130-137 EXP ILLCHR,ESC..A,ESC..B,ESC..C,ESC..D,ILLCHR,ILLCHR,ESC..G ;140-147 EXP ILLCHR,ESC..I,ILLCHR,ESC..K,ILLCHR,ESC..M,ESC..N,ILLCHR ;150-157 EXP ESC..P,ILLCHR,ESC..R,ESC..S,ESC..T,ILLCHR,ESC..V,ESC..W ;160-167 EXP ILLCHR,ILLCHR,ILLCHR,ILLCHR,ILLCHR,ILLCHR,ILLCHR,COMRUB ;170-177 IFN FT2SEG < RELOC > GOTO: EXP 0 ;STARTING ADDRESS FOR PROGRAM NODE: Z ;NAME OR NODE NUMBER WE ARE WORKING WITH LINE: Z ;LINE NUMBER ON NODE WE ARE WORKING WITH DATA: BLOCK ^D20 SBEGIN: EXP 0 ;FIRST ADDRESS FOR SEARCH S..END: EXP 0 ;LAST ADDRESS FOR SEACRH S.WORD: EXP 0 ;WORD TO SEARCH FOR SZMASK: EXP 1 ;NUMBER OF WORDS IN MASK S.MASK: EXP 177777 ;MASK FOR WORD SEARCH EXP 177777 ;MORE OF MASK EXP 177777 ;MORE OF MASK EXP 177777 ;MORE OF MASK EXP 177777 ;MORE OF MASK EXP 177777 ;MORE OF MASK EXP 177777 ;MORE OF MASK EXP 177777 ;MORE OF MASK INPOPR: EXP 0 ;INPUT OPERATION (0=+,1=-,2=*,3=',4=!,5=&,6=^X) BYTCNT: XWD 1,1 ;REPEITION COUNTS FOR OUPUT BYTES ETC. O.MODE: EXP 0 ;OUTPUT MODE LH = PERMANENT, RH = CURRENT ; (0=SYMBOLIC, 1=ADDRESS, 2=NUMERIC, 3=BYTES, ; 4=ASCII TEXT, 5=EBCDIC TEXT) ORADIX: ^D8,,^D8 ;OUTPUT RADIX ; LH IS PERMANENT SETTING, RH IS CURRENT LSTADR: Z ;LAST ADDRESS DISPLAYED ;THE CACHE IS SO WORK OVER SYNCHRONOUS LINE WILL BE FASTER CACHEL: 0 ;CACHE LIMIT, I.E. 1ST NONEXISTEN BYTE ADR IN CACHE CACHEA: 0 ;ADDRESS REPRESENTED BY FIRST ADR IN CACHE CACHSZ=400 ;NUMBER OF WORDS IN CACHE CACHE: BLOCK IFNDEF PDLEN PDL: BLOCK PDLEN LIT VAR SUBTTL SYMBOL TABLES DEFINE X (VAL,BIT,NAME,FLAG) < EXP .+1 SIXBIT \NAME\ BYTE (4)<-1>(14)FLAG(18)VAL >;END OF DEFINE X SYMBEG: X 000000,^D16,HALT, X 000001,^D16,WAIT, X 000002,^D16,RTI, X 000003,^D16,BPT, X 000004,^D16,IOT, X 000005,^D16,RESET, X 000006,^D16,RTT, X 000100,^D10,JMP, X 000200,^D13,RTS, X 000230,^D13,SPL, X 000240,^D16,NOP, X 000241,^D16,CLC, X 000242,^D16,CLV, X 000244,^D16,CLZ, X 000250,^D16,CLN, X 000257,^D16,CCC, X 000261,^D16,SEC, X 000262,^D16,SEV, X 000264,^D16,SEZ, X 000270,^D16,SEN, X 000277,^D16,SCC, X 000300,^D10,SWAB, X 000400,^D8,BR, X 001000,^D8,BNE, X 001400,^D8,BEQ, X 002000,^D8,BGE, X 002400,^D8,BLT, X 003000,^D8,BGT, X 003400,^D8,BLE, X 004000,^D7,JSR, X 005000,^D10,CLR, X 005100,^D10,COM, X 005200,^D10,INC, X 005300,^D10,DEC, X 005400,^D10,NEG, X 005500,^D10,ADC, X 005600,^D10,SBC, X 005700,^D10,TST, X 006000,^D10,ROR, X 006100,^D10,ROL, X 006200,^D10,ASR, X 006300,^D10,ASL, X 006400,^D10,MARK, X 006500,^D10,MFPI, X 006600,^D10,MTPI, X 006700,^D10,SXT, X 010000,^D4,MOV, X 020000,^D4,CMP, X 030000,^D4,BIT, X 040000,^D4,BIC, X 050000,^D4,BIS, X 060000,^D4,ADD, X 070000,^D7,MUL, X 071000,^D7,DIV, X 072000,^D7,ASH, X 073000,^D7,ASHC, X 074000,^D7,XOR, X 075000,^D13,FADD, X 075010,^D13,FSUB, X 075020,^D13,FMUL, X 075030,^D13,FDIV, X 077000,^D7,SOB, X 100000,^D8,BPL, X 100400,^D8,BMI, X 101000,^D8,BHI, X 101400,^D8,BLOS, X 102000,^D8,BVC, X 102400,^D8,BVS, X 103000,^D8,BCC, X 103000,^D8,BHIS, X 103400,^D8,BCS, X 103400,^D8,BLO, X 104000,^D8,EMT, X 104400,^D8,TRAP, X 105000,^D10,CLRB, X 105100,^D10,COMB, X 105200,^D10,INCB, X 105300,^D10,DECB, X 105400,^D10,NEGB, X 105500,^D10,ADCB, X 105600,^D10,SBCB, X 105700,^D10,TSTB, X 106000,^D10,RORB, X 106100,^D10,ROLB, X 106200,^D10,ASRB, X 106300,^D10,ASLB, X 106400,^D10,MTPS, X 106500,^D10,MFPD, X 106600,^D10,MTPI, X 106700,^D10,MFPS, X 110000,^D4,MOVB, X 120000,^D4,CMPB, X 130000,^D4,BITB, X 140000,^D4,BICB, X 150000,^D4,BISB, X 160000,^D4,SUB, ; ; FLOATING POINT (17XXXX) OMITTED IN THIS VERSION ; EXP Z SYMEND: EXP .-3 DDTEND: END DDT60