IMD 1.18: 23/09/2013 10:53:08 lsi-11 wcs support software  @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ߋtv ?BOOT-F-No boot on volume w ,w 0 w: vwm7 Nw ! *  % - (?a ? 0a w?a mz ?v t  4%  b n lwTm@ < `V0  8 -$ `     w` @mPfm@"m47 Be B!  w jw  ( m     RT11A DECRT11A RrkQ{ K\MkQ fS}kQz fS}v & S}^ fRrv& f@ΫR &kSR &C vuR> K\Mv FK\M^; F          DM .MACRO BEAR LOCS V=0 .IRP L, B=1 .REPT B=B+B .ENDR V=V!B LC=L .ENDR $=. .=BEARTP+ .BYTE VREGISTER (A AND B REGS) CL.LOC= 7 ;LOCATION COUNTER DEFINITION CL.END= 10 ;END STATEMENT CL.RDF= 11 ;REGISTER DEFINITIONS CL .=$ .ENDM BEAR .MACRO BYTES COUNT, CHAR .REPT COUNT .BYTE CHAR .ENDR .ENDM .MACRO ERROR CHAR, MESSG JSR R5.TRN= 12 ;TRANSLATION PSEUDO OP CL.IW= 13 ;INPUT WORD OR BYTE OPERATION CL.TTL= 14 ;TITLE CL.SBT= 15 ;SUBTITLE CL.PAG= 16 ;P,ERROR .WORD ''CHAR .PSECT ERRS FOO=. .ASCIZ /MESSG/ .PSECT .WORD FOO .ENDM .MACRO OP NAME,CLASS,OPCODE .ASCAGE OPCODE CL.DUM= 17 ;DUMMPY OPCODE, NO OPERANDS CL.JSR= 20 ;JSR OPCODE CL.NXT= 21 ;NXT OPCODE CL.MOD= 22 ;MODEE OPCODE II /NAME/ .BYTE OPCODE/400&377,CLASS .ENDM .MACRO SYMBOL NAME, VALUE, BITS .ASCII /NAME/ .WORD BITS .WORD VALUE ; WCS BUS ADDRESSES WCSSTS= 177540 ;WCS CONTROL & STATUS (ALSO ADRS) WCS$EN= 010000 ;ENABLE BIT WCSLOW= 177542 ;WCS DATA, LO.ENDM .MCALL .CSIGEN, .EXIT, .READW, .WRITW, .PRINT, .CSISPC .MCALL .SETTOP, .CLOSE, .WAIT, .RCTRL, .GTLIN, .CHAIN .MCALW 16 BITS WCSHGH= 177544 ;WCS DATA, HIGH 8 BITS CONFIG= 300 ;OFFSET TO RT-11 CONFIGURATION WORD CLK50= 000040 ;50-CYCLE CLOCKL .DATE, .GTIM, .GVAL, .LOCK, .UNLOC, .ENTER .NLIST BEX .ENABL LC .SBTTL BIT DEFINITIONS ; CHARACTERS USED TAB= 11  BIT IN CONFIG EMTERR= 52 ;RT-11 EMT ERROR BYTE TGLBIT= 34 ;WCS ADDRESS TOGGLE TO 2ND HALF OF MODE II .SBTTL DATA AREAS ;HORIZONTAL TAB CR= 15 ;CARR. RETURN LF= 12 ;LINE FEED FF= 14 ;FORM FEED ; SYMBOL TABLE ENTRY OFFSETS SY.ID= 0 ;SYMBOL NAME SY.ADR= 6 ;ADDRESS SY.STS= 10 ;SYMBOL STATUS (SEE BELOW) SY.LCL= 12 ;LOCAL BLOCK POINTER ; SYMBOL STATUS BITS ST.DFN= 1 ;DEFINED ST.MDF= 2 ;MULTIPLY DEFINED ST.EQU= 4 ;SYMBOL EQUATED ST.REG= 10 ;REGISTER SYMBOL ST.TRN= 20 ;TRANSLATION SYMBOL  ST.EXT= 40 ;EXTENSION BITS SYMBOL ; LEXICAL TYPES LX.SYM= 0 ;A SYMBOL LX.NUM= 1 ;A NUMBER LX.SPC= -1 ;A SPECIAL CHARACTER .TITLE MICRO ASSEMBLER .SBTTL YET TO BE IMPLEMENTED FEATURES ; REGISTER TYPE SYMBOL HANDLING IN EXPRESSIONS AND OPERANDS  ; OPCODE TABLE OFFSETS OP.SYM= 0 ;SYMBOLIC INSTRUCTION NAME OP.INS= 6 ;OPCODE INSTRUCTION CODE OP.CLS= 7 ;INSTRUCTION CLA ; OPCODE CLASS MACROS ; MULTIPLE INPUT FILES ; FIX /N SWITCH FOR BITMAP ; GOOD ERRORS IF NO WCS AND /W ; LOCAL LABELS ; MUSS ; OPCODE CLASSES CL.JMP= 0 ;JUMP (11 BIT ADDRESS) CL.RFS= 1 ;NO OPERANDS (RFS, ETC.) CL.CJM= 2 ;CONDITIONAL JUMPS (8 BILTIPLY ; DIVIDE .SBTTL MACRO DEFINITIONS .MACRO RETURN RETURN=. RTS PC .ENDM .MACRO CALL SUB JSR PC,SUB .ENT PAGE ADDRESS) CL.LIT= 3 ;LITERAL (8 BIT AND REGISTER) CL.BFL= 4 ;B FIELD ONLY CL.AFL= 5 ;A FIELD ONLY CL.REG= 6 ;REGISTER- ECKSUM FOR OBJ RECORD TXTPTR: .WORD 0 ;OBJ DATA RECORD POINTER OLDFMT: .WORD 0 ;SET IF TRANS FIELD BEFORE EXTEN BITS EXTEN1: TER OBJBLK: .WORD 0 ;OBJ BLOCK NUMBER OBJPTR: .WORD 0 ;OBJ BUFFER POINTER INBLK: .WORD 0 ;INPUT BLOCK NUMBER OUTBLK: .WORD 0.WORD 0 ;ROUTINE ADDR TO HANDLE 1ST EXTEN FLD EXTEN2: .WORD 0 ;ROUTINE ADDR TO HANDLE 2ND EXTEN FLD MODE: .WORD 0 ;WCS ADDRESS ;OUTPUT BLOCK NUMBER INPTR: .WORD 0 ;INPUT BUFFER POINTER OUTPTR: .WORD 0 ;OUTPUT BUFFER POINTER TITLEN= 30. .BYTE FF TITING MODE RAMADR: .WORD 0 ;PHYSYCAL WCS RAM ADDR FOR INST OPNDFL: .WORD 0 ;SET IF OPERAND FOUND LOCADR: .WORD 0 ;ADDRESS TO LE: .BLKB TITLEN ;TITLE TEXT .EVEN SBTLEN= 50 SBTTL: .BLKB SBTLEN ;SUBTITLE TEXT INBUF: .BLKW 256. ;INPUT SOURCE BUFFER OUFILL IN LOC FIELD ERRPNT: .WORD 0 ;POINTER TO CURRENT ERROR LOCATION ERRCNT: .WORD 0 ;TOTAL ERROR COUNT FOR PROGRAM SO FAR STTBUF: .BLKW 256. ;OUTPUT BUFFER OBJBUF: .BLKW 256. ;OBJ BUFFER CRFBUF: .BLKW 256. ;CREF BUFFER CRFEND: BITMAP: .BLKB 2000/MERC: .WORD 0 ;ERROR COUNT FOR THIS STATEMENT REPEAT: .WORD 0 ;REPEAT THE LAST LEXICAL SCAN FLAG RESULT: .WORD 0 ;EXPRESSION E10 ;USED MEMORY BITMAP BEARTP: .REPT 4000/10 ;BITMAP OF PREDEFINED CTRL CHIP TRANSLATIONS .BYTE 0 .ENDR BUCKET: .BLKW 28. VALUATION RESULT MSGPTR: .WORD 0 ;TEXT ERROR BUFFER POINTER LISTFL: .WORD 0 ;SET IF LISTING FILE OBJFL: .WORD 0 ;SET IF OBJ F;SYMBOL TABLE BUCKET LIST (A-Z, ., $) BCKEND: ;END OF BUCKETS BCKPTR: .BLKW ;CURRENT BUCKET (PRTSYM) AREA: .BLKW 12 ;EMILE SPECIFIED BITFL: .WORD 0 ;BITMAP DESIRED FLAG CRFFL: .WORD 0 ;CROSS-REFERENCE DESIRED FLAG TTYFL: .WORD 0 ;NARROW LISTINGT AREA BLOCK TOP: .WORD 0 ;HIGHEST AVAILABLE MEMORY LOCATION ERRBUF: .BLKW 100 ;ERROR MESSAGE BUFFER .SBTTL ASSEMBLE ONE LI DESIRED FLAG WCSFL: .WORD 0 ;SET IF LOAD INTO WCS DESIRED EOF: .WORD 0 ;SET IF END OF FILE ON READ SAVESP: .WORD 0 ;SAVEED CNE ; ASM ; ASSEMBLE ONE LINE OF MICRO CODE. .ENABL LSB ASM: INC LINE ;NEXT LINE PLEASE CALL READ ;READ A LINE MOV LOPY OF SP FOR EXPRESSIONS PARLVL: .WORD 0 ;CURRENT PAREN LEVEL, STARTS AT 0 LINSIZ: .WORD 0 ;LINE SIZE FOR LISTING ID: .BLKOC,LOCADR ;SAVE LC AT START OF LINE MOV #IN,R5 ;R5 -> INPUT LINE TST EOF BEQ 15$ ;IF NOT AT END OF FILE ERROR E,0 IF FOUND) OLDLOC: .WORD 0 ;PREVIOUS LOC ADDRESS LOC: .WORD 0 ;LOCATION COUNTER LINCNT: .WORD 0 ;LINES LEPACE FOR ERRORS .BLKB 1 OUTLIN: .BLKB 5 ;SPACE FOR LINE NUMBER .BLKB 1 OUTLC: .BLKB 5 ;OUTPUT LOCATION COUNTER .BLKB 1 FT ON CURRENT PAGE LINE: .WORD 0 ;CURRENT LINE NUMBER PAGE: .WORD 0 ;CURRENT PAGE NUMBER PASS: .WORD 0 ;ASSEMBLY PASS SYTBGNOUTOPH: .BLKB 3 ;HIGH ORDER OPCODE FIELD .BLKB 1 OUTOPL: .BLKB 6 ;LOW ORDER OPCODE FIELD .BLKB 1 IN: .BLKB 110. ;INPUT LIN: .WORD 0 ;STARTING ADDRESS OF SYMBOL TABLE SYTEND: .WORD 0 ;SYMBOL TABLE END STIME: .BLKW 2 ;TIME-OF-DAY CHKSUM: .WORD 0 ;CHE BEING ASSEMBLED LINEND: .EVEN ; I/O BUFFERS CRFBLK: .WORD 0 ;CRF BLOCK NUMBER CRFPTR: .WORD 0 ;CREF OUTPUT BUFFER POIN LRB (R5)+ BR 6$ 15$: CALL LEX ;GET 1ST LEXEME CMP R1,#LX.SYM BNE 4$ ;IF NOT A SYMBOL, CANT BE A LABEL CALL STNF ;SKIL ; OPERANDS SINCE THEY CANT EFFECT ; ANYTHING AT THIS POINT. 16$: TSTB PSEUDO(R1) BEQ 19$ ;IF NOT PSEUDO OP MOVP TO DELIMITER CMPB @R5,#'= BNE 12$ ;IF NOT EQUATE INC R5 ;PASS EQUAL CALL ENTERD ;LOOK UP SYMBOL IN TABLE BIT #ST. #-1,OPNDFL ;SET LISTING CONTROL DEC LOC ;PSEUDO OPS DONT INCR LC 19$: CMP R1,#CL.RFS BNE 21$ ;IF INSTUCTION HAS OPERANDSDFN,SY.STS(R0) BNE 13$ ;IF SYMBOL PREVIOUSLY DEFINED MOV R0,-(SP) ;EVALUATE THE EXPRESSION OPERAND CALL EXPR MOV (SP)+ CALL STNF CMP R0,#CR BEQ 10$ ;IF END OF LINE CMPB R0,#'; BEQ 10$ ;IF END OF LINE BR 20$ ;DON'T LOOK FOR COMMA BE,R0 ;R0->SYMBOL ON LEFT OF EQUATE MOV R1,SY.ADR(R0) ;PUT IN EXPRESSION VALUE MOV R1,LOCADR ;PRINT EQUATE RESULT FOR LC BISFORE EXT FLD 21$: ASL R1 CALL @OPDISP(R1) ;BRANCH ON OPCODE CLASS 14$: CALL STNF ;CHECK FOR A HIGH ORDER WORD CMPB R0,#', #ST.EQU,SY.STS(R0) ;MAKE IT EQUATED MOV #-1,OPNDFL ;USE SAME LISTING MODE AS PSEUDO OPS BR 14$ 12$: CMPB @R5,#': BNE 4$  BNE 10$ ;IF NOT COMMA, SKIP IT INC R5 ;PASS IT UP 20$: TST OPNDFL BGT 1$ ;IF INSTRUCTION ERROR H, ; GET EXTENSION FIELD IN WHATEVER ORDER IT IS IN 1$: CALL STNF CMPB R0,#', BEQ 22$ ;IF SKIPPING THI(R0) BEQ 23$ ;IF LABEL ISNT DEFINED YET...OK TST PASS BNE 23$ ;IF MULT DEFN ON PASS 2, SKIP IT BIS #ST.MDF,SY.STS(R0) S FIELD CALL @EXTEN1 ;GET THE 1ST EXTEN FIELD CALL STNF CMPB R0,#', BNE 10$ ;IF NO 2ND FIELD 22$: INC R5 ;PASS THE C;MAKE IT MULTIPLY DEFINED 23$: BIT #ST.MDF,SY.STS(R0) BEQ 2$ ;IF NOT MULTIPLE DEFINITION ERROR M, BR 3$ 13$: ERROR M, BR 7$ 2$: MOV LOC,SY.ADR(R0) ;PUT LOCATION COUNTER AL, THEN NOT EOL CMP R0,#'; BEQ 7$ ;IF END OF LINE COMMENT CMP R0,#LF BEQ 7$ CMP R0,#CR BEQ 7$ ;IF CR EOL 9$: ERRIN AS VALUE BIS #ST.DFN,SY.STS(R0) ;MAKE IT DEFINED 3$: CALL LEX ;GET THE OPCODE FIELD 4$: CMP R1,#LX.SYM BNE 8$ ;IF NOTOR S, 7$: CALL OUTWRD ;OUTPUT THE WORD IF NEEDED CALL PRINT ;PRINT THE LINE IF CORRECT PASS RETURN .DSABL A SYMBOL, THEN NOT OPCODE 5$: CALL OPCODE ;PROCESS THE OPCODE BEQ 6$ ;IF OPCODE IS IN TABLE ERROR O, MOV #CL.RFS,R1 ;DEFAULT CLASS FOR OPCODE 6$: MOV R1,OPCLS ;HANG ONTO THE CLASS FOR LATER INC LOC ;BUMP LOCATION COUNTERCLS12, CLS13 .WORD CLS14, CLS8, CLS15, CLS16, CLS17 ; BYTE IN THIS TABLE S NONZERO IF CORRRESPONDING OPCODE IS A ; PSEUDO ng or illegal END statement> MOV #CL.END,R1 ;DEFAULT TO END STATEMENT MOVB #CR,(R5)+ ;BUILD A NULL LINE MOVB #LF,(R5)+ C FOR OPCODES MOV #1,OPNDFL ;SET TO PRINT DATA MOV PASS,R0 BISB PSEUDO(R1),R0 BEQ 7$ ;IF PASS1 AND 1 WORD INST, DONT EVA ACROSS A PAGE (MODE II) BIS #TGLBIT,OPH ;SET TO TOGGLE TO OTHER PAGE BIT #1,OPH BEQ CLS0A ;IF NOT A JSR AND TOGGLE ERROOR INTO OPERAND FIELD ; IW AND IB OPERATIONS ; THESE OPCODES HAVE AN OPTIONAL B FIELD. IF IT IS LEFT OUT ; THEN A LEADING R A, CLS0A: BIS R1,OPL ;ADD THE OPERAND TO THE OPCODE RETURN CLS0B: ERROR A, CLS8: CLS1: RETURN ;NO OPNDS AND END STMT MERGE HERE ; CONDITIONAL JUMPS ; TAKE THE ADDRESS AND CHECK I,0,0,0,0,0,0 .BYTE 1,1,1,1,0,1,1 .BYTE 1,1,0,1,1 .EVEN ; EVALUATE TRANSLATION FIELD .ENABL LSB TRNFLD: MOV R5,TRANF ITS IN THE SAME PAGE ; AS THE CURRENT LC. IF IT IS, THEN USE THE LOW ORDER ; BITS OF IT AS THE OPERAND CLS2: CALL EXPR ;GPR ;SAVE PTR TO TRAN FIELD MOVB @R5,R0 ;GET 1ST CHARACTER OF TRANSLATION TSTB CLASS(R0) BNE 17$ ;IF NOT ALPHABETIC CALET THE LABEL BIC #377,R1 ;ISOLATE THE PAGE BITS MOV LOC,R2 BIC #377,R2 ;ISOLATE PAGE BITS ON LOC CMP R1,R2 BNE 1$ ;L LEX ;COLLECT TRANSLATION NAME CMP R1,#LX.SYM BEQ 18$ ;IF REALLY A SYMBOL NAME ERROR T, BRIF OFF PAGE REFERENCE MOV RESULT,R1 ;GET ADDRESS BACK BIC #^C<377>,R1 BR CLS0A ;COMBINE PAGE ADDRESS WITH OPCODE 1$: E 17$ 18$: CALL ENTER ;ENTER TRANSLATION NAME IN SYMBOL TBL BIT #ST.TRN,SY.STS(R0) BNE 17$ ;IF IS DEFINED AS TRANSLATION RROR P, RETURN ; LITERAL INSTRUCTIONS ; THESE INSTRUCTIONS HAVE AN 8 BIT LITERAL AND A ERROR T, BIS #ST.TRN,SY.STS(R0) ;MAKE IT A TRANSLATION SYMBOL 17$: SUB R5,TRANPR ;S REGISTER .ENABL LSB CLS3: CALL EXPR ;GET THE LITERAL VALUE CMP R1,#377 BLOS 2$ ;IF LITERAL <= 8 BITS AND POSITIVE ADET FLAG <> 0 IF TRANSLATION PRESENT RETURN .DSABL LSB ; GET EXTENSION BITS FIELD AND PUT THEM IN HIGH ORDER WORD .ENAD #400,R1 ;MAKE LEGAL NEG LITERALS POSITIVE BMI 1$ ;IF NOT POS, THEN ILLEGAL HIGH BYTE 2$: ASL R1 ASL R1 ;MOVE IN POSITIBL LSB EXTFLD: CALL EXPR ;EVALUATE USER BITS CMP R1,#377 BLOS 11$ ;IF FITS IN A BYTE ERROR H, MOV RESULT,R1 BIC #^C<377>,R1 11$: BIS R1,OPH RETURN .DSABL LSB .SBTTL SPECIFIC OPCODE CLASS PROCESSINGISTER 1$: ERROR L, CLR R1 ;USE ZERO BR 2$ .DSABL LSB ; B FIELD ONLY ; ONLY ONE REGG ; JUMPS ; 11 BIT JUMP ADDRESS IS THE ONLY OPERAND CLS0: CALL EXPR ;EVALUATE THE AADDRERSS MOV R1,R0 BIC #10000,R1 ;GISTER IS USED, THE B REGISTER CLS4: CALL REG ;GET REGISTER ASL R1 ASL R1 ;INTO B FIELD ASL R1 ASL R1 BR CLS0A ;MERET RID OF MODE 2 BIT CMP R1,#3777 BHI CLS0B ;IF ADDRESS TOO BIG ADD LOCADR,R0 BIT #10000,R0 BEQ CLS0A ;IF NOT GOING GE INTO OPCODE ; A FIELD ONLY ; ONLY THE A REGISTER FIELD IS REFERENCED CLS5: CALL REG ;GET B REGISTER FIELD BR CLS0A ;  BLOCK MOV #OBJTXT,TXTPTR ;RESET POINTER TO OBJ RECORD 4$: ASL @SP ;COMPUTE NEW LOC ASL @SP ADD #1000,@SP MOV (SP)+,OB FOR LATER MOV R2,-(SP) ;SAVE BLANK BYTE ADDRESS CALL REGENT ;PUT LOW VERSION IN SYT MOV 2(SP),SY.ADR(R0) ;INSERT THE VALJADR ;USE IT FOR NEXT OBJ BLOCK RETURN .DSABL LSB ; NXT2-NXT400 OPCODES ; INCREMENT THE LC TO THE NEXT ADDRESS WHICH IS UE MOVB #'H,@(SP)+ ;MAKE HIGH VERSION CALL REGENT INC @SP ;HIGH ONE IS ODD MOV (SP)+,SY.ADR(R0) ;PUT IN VALUE RETURN THE POWER ; OF 2 SPECIFIED IN THE INSTRUCTION. CLS16: CLR R1 BISB OPL+1,R1 ;R1 = NXT OPERAND - 1 BIT R1,LOC BEQ RETURN  .DSABL LSB ; TRAN PSEUDO OP ; DEFINE TRANSLATION SYMBOL FOR LATER CHECKING AGAINST ; INSTRUCTION TRANSLATION FIELDS. .EN ;IN NOTHING TO DO, ALREADY THERE BIS LOC,R1 ;PUT IN THE LOWER BITS INC R1 ;AND BUMP THE NEXT BIT OVER BR CLS7A ;MERGE ABL LSB CLS10: CALL LEX ;GET OPERAND BNE 1$ ;IF NE, NUMERIC OR SPECIAL CHARACTER CALL ENTERD ;ENTER SYMBOL BIT #ST.DFNWITH LOC CODE ; REG PSEUDO OP ; DEFINE REGISTERS BY TAKING THE NAME AND NAME'L AND NAME'H ; AND DEFINING WITH THE APPROPRI!ST.EQU,SY.STS(R0) ;WAS IT PREVIOUSLY DEFINED? BNE 2$ ;IF NE YES BIS #ST.TRN,SY.STS(R0) ;INDICATE TRANSLATION SYMBOL RETU ; REGISTER TO REGISTER INSTRUCTIONS ; BOTH THE B AND THE A FIELD ARE THE OPERANDS IN THESE INSTRUCTIONS CLS6: CALL CLS4 ;GATE OFFSETS .ENABL LSB CLS9: CALL LEX ;GET THE REGISTER NAME CMP R1,#LX.SYM BEQ 1$ ;IF A SYMBOL ERROR R, RETURN 1$: CALL REGENT ;ENTER REGISTER NAME INTO SYT MOV R0,-(SP) ;SAVE SYMBOL ADDRESS CALL INPCOM CALL REGNTER TO THE VALUE OF THE OPERAND ; SET UP OBJADR IN OBJ TEXT BLOCK ON LOCS .ENABL LSB CLS7: CALL STNF CMPB R0,#CR BEQ 1$ ;GET THE REGISTER VALUE EXPRESSION BIT #1,R1 BEQ 2$ ;IF EVEN ADDRESS ERROR R, DEC R1  ;IF NO LOC ADDR THEN USE PREVIOUS CMPB R0,#'; BNE 2$ ;IF LOC EXPR 1$: MOV OLDLOC,R1 ;USE PREVIOUS LOC ADDRESS BR 3$ ;MAKE VALUE EVEN 2$: MOV R1,LOCADR ;SET UP TO PRINT REG VALUE MOV @SP,R0 ;R0 -> REGISTER SYT ADDRESS MOV R1,SY.ADR(R0) ;PU 2$: MOV LOC,OLDLOC ;SAVE PREVIOUS LOCATION COUNTER CALL EXPR ;GET THE NEW ORIGIN CALL CHKMOD ;SEE IF LEGAL ADDRESS FOR WCT VALUE IN FOR REGISTER MOV #ID,R2 ;R2 -> NAME HOLDING AREA MOV (R0)+,(R2)+ ;MOVE NAME TO ID TO ENTER OTHER NAMES MOV (R0S MODE CLS7A: 3$: MOV R1,LOC ;SET UP NEW LOCATION COUNTER MOV R1,LOCADR ;USE RESULT FOR LC FIELD TST OBJFL BEQ RETURN)+,(R2)+ MOV (R0)+,(R2)+ MOV (SP)+,R0 ;R0 -> SYMBOL TBL ENTRY AGAIN 3$: CMPB -(R2),#40 ;LOOK FOR LAST CHARACTER OF NAME TO  ;IF NO OBJ FILE TST PASS BEQ RETURN ;IF NOT OUTPUTTING ON THIS PASS MOV R1,-(SP) CMP TXTPTR,#OBJTXT BEQ 4$ ;IF CURADD BNE 4$ ; THE H AND L VERSIONS TO THE SYT CMP R2,#ID BHI 3$ ;IF MORE CHARACTERS ERROR R, RETURN 4$: INC R2 ;R2 -> 1ST BLANK IN NAME MOVB #'L,@R2 ;MAKE IT REG'L MOV R1,-(SP) ;SAVE THE VALUE CMPB R0,#'; BEQ 3$ ;IF AT END OF STATEMENT MOVB R0,(R2)+ ;PUT CHARACTER IN BUFFER DEC R1 BGT 2$ ;IF MORE CHARACTERS 3$: CMP R1,#1777 BHI 9$ RETURN .DSABL LSB .SBTTL OUTPUT A CROSS-REFERENCE RECORD ; CRFSYM ; WRITES A CROSS-REFERENCE$: CLRB (R2)+ ;AND A STOPPER FOR MOVE DEC R5 ;POSITION BEFORE 1$: CMPB (R5)+,#CR ;SKIP CHARACTERS BNE 1$ ; UNTIL  RECORD TO THE CREF INTERMEDIATE FILE CRFSYM: TST PASS ;IS THIS PASS 2? BEQ RETURN ;IF EQ NO - NO OUTPUT TST CRFFL ;WADEC R5 ; EOL IS REACHED RETURN .DSABL LSB ; PAGE DIRECTIVE ; PAGE CAUSES A NEW LISTING PAGE TO BE STARTED CLS14: CMS CREF SWITCH SET? BEQ RETURN ;IF EQ NO MOV #ID,R1 ;R1 -> INPUT SYMBOL NAME MOV #CRFREC+1,R2 ;R2 -> SYMBOL AREA IN RECORP LINCNT,#2 BLT RETURN ;IF A NEW PAGE IS STARTING ANYWAY MOV #1,LINCNT ;MAKE THIS THE LAST LINE ON THE PAGE RETURN ;D MOV #6.,R3 ;R3 = # OF CHARS TO COPY 1$: MOVB (R1)+,(R2)+ ;COPY SYMBOL NAME DEC R3 ; TO PROTOTYPE BNE 1$ ; OUTPUT RE JSR INSTRUCTION ; THIS IS A JUMP WITH THE LRR(1) EXTENSION BIT PRESET CLS15: MOV #1,OPH ;SET THE LRR BIT JMP CLS0 ;THEN SCORD MOVB LINE+1,CRFLIN+0 ;INSERT HIGH BYTE OF LINE # MOVB LINE+0,CRFLIN+1 ; AND LOW BYTE MOV #CRFREC,R1 ;R1 -> OUTPUT RECAME AS A JUMP INST ; MODE PSEUDO OP ; EXPRESSION INDICATES WHAT MODE PROGRAM IS FOR. IF NO MODE ; DIRECTIVE IS PRESENT, ORD MOV #12.,R2 ;R2 = # OF CHARS IN RECORD MOV R0,-(SP) ;SAVE CALLER'S R0 MOV CRFPTR,R0 ;R0 -> NEXT CHAR IN BLOCK BUFFER THEN ASSUME MODE 1 CLS17: CALL EXPR ;GET THE MODE CMP R1,#4 BHI 1$ ;IF NOT BETWEEN 1-4 MOV R1,LOCADR ;MAKE IT PRINT ON  2$: CMP R0,#CRFEND ;SPACE LEFT IN CURRENT BLOCK? BLO 3$ ;IF LO YES .WRITW #AREA,#2,#CRFBUF,#256.,CRFBLK BCS 4$ ;IF CS ELISTING BEQ 1$ ;IF ZERO, ILLEGAL MOV R1,MODE RETURN 1$: ERROR M, RETURN .SBTTL CHECK IRROR MOV #CRFBUF,R0 ;RESTORE BUFFER POINTER INC CRFBLK ;BUMP BLOCK COUNTER 3$: MOVB (R1)+,(R0)+ ;COPY A CHAR TO THE OUTPUTRN 1$: ERROR T, RETURN 2$: ERROR T, RETURN .DSABL LSB ; TITLE AND .TITLE ; MOVE REMAINDER OF LINE TO TITLE AREA CLS12: MOV . .ENABL LSB CHKMOD: MOV MODE,R0 ASL R0 JMP @10$-2(R0) 10$: .WORD 1$,2$,3$,4$ ; MODE 1 AND 3 ; ADDRESSES ARE IN THE #TITLE,R2 ;R2 -> TITLE AREA MOV #TITLEN,R1 ;R1 = NO OF CHARS IN TITLE BR CLS13A ; SBTTL AND .SBTTL DIRECTIVES ; MOVE THERANGE 2000-3777 1$: 3$: CMP R1,#2000 BLO 9$ ;IF ILLEGAL CMP R1,#3777 BLOS RETURN 9$: ERROR A, RETURN ; MODE 2 ; ADDRESS ARE IN THE RANGE 3000-3777 AND 13000-13777 2$: CMP R1,#3000 BLO 9$ ;IF OUT CMP R1,#3773A: CALL STNF ;SKIP TO TEXT 2$: MOVB (R5)+,R0 ;GET A CHARACTER FROM THE SUBTITLE CMPB R0,#CR BEQ 3$ ;IF AT END OF LINE 7 BLOS RETURN CMP R1,#13000 BLO 9$ ;OUT OF RANGE CMP R1,#13777 BHI 9$ RETURN ; MODE 4 ; ADDRESSES MAP 0-1777 4   NE, HARDWARE ERROR .PRINT #CRFSML ;ELSE INDICATE FILE TOO TINY CLR CRFFL ;AND IGNORE CREFFING FROM NOW ON BR 6$ ;EXIT  NO .PRINT #ERRWCS ;ELSE INDICATE NOT LOADED BR 15$ 3$: TST WCSFL ;LOADING DIRECT TO WCS? BEQ 4$ ;IF EQ NO BIS #WCTHIS ROUTINE 5$: .PRINT #CRFIO ;SHOW HARDWARE ERROR OCCURRED .EXIT ;AND BAIL OUT CRFREC: .BYTE 'S&37 .ASCII /SYMBOLS$EN,@#WCSSTS ;ELSE ENABLE WCS NOW 4$: .PRINT #ERRNON ;ANNOUNCE NO ERRORS BR 15$ 15$: TST CRFFL ;ANY CREF OUTPUT? BEQ / .BYTE 377,377 ;NO PAGE NUMBER DESIRED CRFLIN: .BYTE 000,000 ;LINE NUMBER CRFFLG: .BYTE 040 ;DEFN/REF FLAG CRFSML: .A16$ ;IF EQ NO MOV CRFPTR,R0 ;GET BUFFER POINTER CMP R0,#CRFBUF ;ANYTHING IN BUFFER NOW? BEQ 11$ ;NOPE 9$: CMP #CRFEND,RSCIZ /?MICRO-W-Insufficient temporary file space for cross-reference/ CRFIO: .ASCIZ /?MICRO-F-Output error on cross-reference f0 ;WHAT ABOUT NOW? BEQ 10$ ;IF EQ, DONE CLRB (R0)+ ;ELSE CLEAR BUFFER BR 9$ ;AND LOOP 10$: .WRITW #AREA,#2,#CRFBUF,#ile/ .EVEN .SBTTL CLOSE THE FILES ; CLOSE FILES BY FLUSHING THE OUTPUT BUFFER IF NECESSARY CLOSE: .SETTOP SPACE+2 ;MAK256.,CRFBLK INC CRFBLK 11$: MOV #CHAINP,R0 ;R0 -> CHAIN PROTOTYPE MOV #500,R1 ;R1 -> CHAIN PARAMETER AREA 12$: MOV (R0)+,E ROOM FOR THE USR TST LISTFL BEQ 2$ ;IF NO LISTING, DONT CLEAR BUFFER MOV OUTPTR,R4 CMP R4,#OUTBUF BEQ 2$ ;IF AT ST(R1)+ ;COPY PROTOTYPE INFORMATION CMP R1,#536 ;COPIED ALL BUT TITLE? BLO 12$ ;IF LO NO MOV LSTSPC,@#512 ;SET LISTING DEVART OF BUFFER BR 5$ 1$: CLRB (R4)+ 5$: CMP R4,#OUTBUF+512. BNE 1$ ;FILL BUFFER WITH ZEROS UNTIL END .WRITW #AREA,#1,#ICE MOV OUTBLK,@#514 ;AND LISTING BLOCK # MOV CRFSPC,@#520 ;SET CREF TEMP FILE DEVICE MOV CRFBLK,@#522 ;AND ITS BLOCK # OUTBUF,#256.,OUTBLK INC OUTBLK ;MAKE BLOK NUMBER CORRECT 2$: TST OBJFL BEQ 6$ ;IF NO OOBJ FILE OPENED CMP TXTPTR,#OBJTXBEQ 16$ ;IF NO CREF OUTPUT, NO CREF! TST TTYFL ;NARROW LISTING DESIRED? BEQ 13$ ;IF EQ NO COM @#524 ;ELSE FLAG AS SUCHT BEQ 8$ ;IF NO TEXT IN THIS RECORD MOV #TXTREC,R1 ;WRITE THIS RECORD THEN EOM MOV BYTCNT,R3 CALL OBJWRT 8$: MOV #EOMR 13$: MOV #TITLE-1,R0 ;COPY TITLE TO OUTPUT 22$: MOVB (R0)+,(R1)+ BNE 22$ DEC R1 ;BACK UP BEFORE NULL AT END MOV #HEADEEC,R1 ;WRITE EOM RECORD MOV #7,R3 CALL OBJWRT CMP OBJPTR,#OBJBUF BEQ 7$ ;IF AT THE START OF THE RECORD .WRITW #AREAR,R0 ;R0 -> OUR TITLE LINE 14$: MOVB (R0)+,(R1)+ ;COPY IT CMP #PAGEST,R0 ; UP TO PAGE HEADER BNE 14$ CLRB @R1 ;END LINE ,#0,#OBJBUF,#256.,OBJBLK ;WRITE LAST BLOCK 7$: .CLOSE #0 ;CLOSE THE FILE 6$: .CLOSE #3 .RCTRLO MOV #ERRCT,R4 ;POINT TO ERWITH A NULL .CHAIN ;CHAIN AWAY TO CREF 16$: .CLOSE #1 ;CLOSE LISTING RETURN CHAINP: .RAD50 /SY CREF SAV/ ;CHAIN PR BUFFER DEC R2 ;COUNT DOWN CHARS IN RECORD BNE 2$ ;IF NE, STILL SOME LEFT MOV R0,CRFPTR ;ELSE STORE POINTER FOR NEXT TIMROR COUNT IN MESSAGE MOV ERRCNT,R0 ;GET COUNT OF ERRORS ENCOUNTERED BEQ 3$ ;IF EQ NONE CALL DEC5 ;ELSE CONVERT IT FOR OUE 6$: MOV (SP)+,R0 ;RESTORE CALLER'S R0 RETURN ;AND RETURN 4$: TSTB @#EMTERR ;WHAT KIND OF ERROR OCCURRED? BNE 5$ ;IFTPUT CLRB @R4 ;TERMINATE LINE .PRINT #ERRSUM ;PRINT SUMMARY ON CONSOLE TST WCSFL ;REQUESTED WCS LOAD? BEQ 15$ ;IF EQ  ? BNE 2$ ;IF NE YES MOV #60.,R3 ;ELSE 60 CYCLE 2$: CALL DIV ;REMOVE TICKS CALL DIV60 ;SET R0=SECONDS MOV R0,-(SP) THE TABLE ; ENTER ; ENTER A SYMBOL IN THE SYMBOL TABLE ; ON EXIT R0->SYMBOL TABLE ENTERD: MOVB #'#,CRFFLG ;INDICATE DEFINITIOTOTYPE .WORD 1 ;LISTING OUTPUT CHANNEL .BLKW 2 ;LISTING DEV, HIGH BLOCK .WORD 2 ;CREF TEMP CHANNEL .BLKW 2 ;CREF DE CALL DIV60 ;SET R0=MINUTES MOV R0,-(SP) CALL DIV60 ;SET R0=HOURS CALL DEC2 ;FORMAT HOURS MOVB #':,(R2)+ ;INSTALL SEPV, HIGH BLOCK .WORD -1 ;LISTING FORMAT (WIDE) .RAD50 /SY MICRO SAV/ ;PROGRAM TO RETURN TO ERRSUM: .ASCII /?MICRO-F-ErrorARATOR MOV (SP)+,R0 ;RESTORE MINUTES CALL DEC2 ;FORMAT THEM MOVB #':,(R2)+ ;PUT IN ANOTHER SEPARATOR MOV (SP)+,R0 ;AND s detected: / ERRCT: .ASCII /99999 / ERRNON: .ASCIZ /MICRO-I-No errors detected/ ERRWCS: .ASCIZ /?MICRO-I-WCS has NOT been enAT LAST, SECONDS CALL DEC2 ;FORMAT THEM RETURN ; DIVIDE SUBROUTINE, DIVIDES (R4,R5) BY R3, RETURNING ; REMAINDER IN R0 abled/ .EVEN ; END OF MODULE RECORD EOMREC: .WORD 1 ;EOM RECORD .WORD 6 ;RECORD TYPE EOM=6 .WORD 6 ;BYTE COUNT .BYTEAND QUOTIENT IN (R4,R5) DIV60: MOV #60.,R3 ;SET DIVISOR=60 DIV: CLR R0 MOV #32.,R1 1$: ASL R5 ROL R4 ROL R0 CMP R0 -<1+6+6> ;CHECKSUM .EVEN .SBTTL DATE AND TIME CONVERSION ; DAYTIM ; FORMATS DATE AND TIME FOR LISTING HEADER DAYTIM,R3 BLO 2$ SUB R3,R0 INC R5 2$: DEC R1 BNE 1$ RETURN MONTHS: .ASCII /-Jan-Feb-Mar-Apr-May-Jun-Jul-Aug-Sep-Oct-Nov-: MOV #DATE,R2 ;POINT TO DATE OUTPUT AREA .DATE ;GET DATE INTO R0 MOV R0,R5 ;COPY IT BEQ 3$ ;IF NO DATE TYPED IN ASLDec-/ .EVEN .SBTTL DECIMAL NUMBER CONVERSION DEC5: MOV R4,-(SP) ;SAVE FIRST OUTPUT ADRS MOV #DECTAB,R2 ;R2 -> DIVISOR  R0 ASL R0 ;ISOLATE ASL R0 ; DAY SWAB R0 BIC #^C<37>,R0 ;AND MASK OFF OTHERS CALL DEC2 ;CONVERT TO DECIMAL MOV R5TABLE 1$: CLR R1 ;INIT QUOTIENT 2$: INC R1 ;BUMP QUO SUB @R2,R0 ;AND SUB OFF DIVISOR BPL 2$ ;WHILE STILL POSITIVE AD,R0 ;COPY DATE AGAIN SWAB R0 ;GET MONTH*4 BIC #^C<37*4>,R0 ADD #MONTHS-4,R0 ;R0 -> ASCII MONTH NAME MOV #5.,R1 ;SET TD @R2,R0 ;CORRECT OVERRUN DEC R1 ;AND CORRECT QUO BNE 3$ ;IF NE, NOT ZERO CMP R4,@SP ;ELSE, IS THIS LEADING ZERO? BEO MOVE -MON- 1$: MOVB (R0)+,(R2)+ ;COPY MONTH NAME DEC R1 BNE 1$ MOV R5,R0 ;RESTORE DATE AGAIN BIC #^C<37>,R0 ;ISOLATEQ 4$ ;IF EQ YES 3$: ADD #'0,R1 ;ASCIIFY DIGIT MOVB R1,(R4)+ ;AND OUTPUT IT 4$: TST -(R2) ;BACK TO NEXT DIVISOR BNE 1$  YEAR ADD #72.,R0 ;BASE IS 1972 CALL DEC2 ;CONVERT YEAR 3$: MOV #TIME,R2 ;NOW POINT TO TIME OUTPUT AREA MOV #STIME,R5 ;;IF NE NOT DONE ADD #'0,R0 ;DO UNIT'S DIGIT MOVB R0,(R4)+ TST (SP)+ RETURN .WORD 0 .WORD 10. .WORD 100. .WORDR5 -> STORAGE FOR SYSTEM TIME .GTIM #AREA,R5 ;GET SYSTEM TIME MOV (R5)+,R4 ;R4 = HIGH-ORDER TIME MOV @R5,R5 ;R5 = LOW-ORD 1000. DECTAB: .WORD 10000. DEC2: SWAB R0 ;CONVERTS 0<=R0<=99. 1$: ADD #<-10.*400>+1,R0 ;TO TWO ASCII DIGITS BPL 1$ ;PLER TIME .GVAL #AREA,#CONFIG ;GET CONFIG WORD IN R0 MOV #50.,R3 ;ASSUME 50-CYCLE CLOCK BIT #CLK50,R0 ;IS IT TRULY 50-CYCLEACING RESULT ADD #<10.*400>-1+"00,R0 ;AT (R2)+ MOVB R0,(R2)+ SWAB R0 MOVB R0,(R2)+ RETURN .SBTTL ENTER A SYMBOL IN  OV (R3)+,(R0)+ MOV (R3)+,(R0)+ CLR (R0)+ ;ADDRESS CLR (R0)+ ;STATUS BITS MOV (SP)+,(R0)+ ;LINK TO NEXT SYMBOL MOV R0F ERRORS CLR PARLVL ;DEFAULT TO TOP LEVEL OF PARENS EXPR0: CLR RESULT ;INITIALIZE RESULT CALL STNF CMPB R0,#'- BNE 6$,SYTEND ;RESET NEW SYMBOL TABLE END SUB #14,R0 ;R0 -> START OF ENTRY CMP R0,TOP BLO 6$ ;IF SOME SPACE LEFT .PRINT #OV ;IF NOT UNARY MINUS INC R5 ;PASS THE MINUS CALL EXOPND ;GET THE OPERAND NEG R1 ;DO THE NEGATE OPERATION BR 7$ 6$: RCOR .EXIT OVRCOR: .ASCIZ /?MICRO-F-Not enough memory/ .EVEN RETURN .SBTTL ERROR PROCESSING ; ERROR ; INSERT AN CMPB R0,#'^ BNE 9$ ;IF NOT COMPLIMENT (^C) CMPB 1(R5),#'C BNE 9$ ;DEFINITLY NOT CMPB (R5)+,(R5)+ ;SKIP OVER ^C CALL ERROR MESSAGE CHARACTER IN THE START OF THE LINE. UP ; TO THREE ERRORS ARE ALLOWED THERE ERROR: MOV R0,-(SP) ;SAVE REGISTERS EXOPND ;GET SUBEXPRESSION ARGUMENT COM R1 ;DO THE COMPLIMENT BR 7$ 9$: CMPB R0,#'+ BNE 8$ ;IF UNARY '+' INC R5 ;SKION OF SYMBOL BR ENTCOM ENTER: MOVB #' ,CRFFLG ;INDICATE JUST REFERENCE ENTCOM: MOVB ID,R2 ;GET 1ST CHARACTER AS BUCKET PO MOV R1,-(SP) MOV R2,-(SP) MOV R3,-(SP) MOV (R5)+,R0 ;GET THE ERROR CHARACTER DEC STMERC ;BUMP THE STATEMENT ERROR COUINTER CMPB R2,#'. BNE 1$ ;IF NOT A . MOVB #'A-1,R2 ;. FILLS POSITION 1 LESS THAN A 1$: CMPB R2,#'$ BNE 5$ ;IF NOT DOLNT BLE 1$ ;IF ALREADY TOO MANY ERRORS MOVB R0,@ERRPNT INC ERRPNT ;BUMP THE ERROR POINTER MOV @R5,R0 ;R5 -> ERROR TEXTLAR MOVB #'Z+1,R2 5$: ASL R2 ;MAKE WORD INDEX ADD #BUCKET-200-SY.LCL,R2 ;R2 -> SY.LCL LESS THAN BUCK PTR BR 2$ 3$: M MOV MSGPTR,R1 ;R1 -> CURRENT SPOT IN ERROR BUFFER MOVB #'*,(R1)+ ;INSERT *** BEFORE MESSAGE MOVB #'*,(R1)+ MOVB #'*,(R1OV R0,R2 ;R2 ->THIS SYMBOL TABLE ENTRY MOV #ID,R3 ;R3 -> SYMBOL FROM SOURCE LINE CMP (R0)+,(R3)+ BLO 2$ ;IF NO MATCH BU)+ MOVB #TAB,(R1)+ 2$: MOVB (R0)+,R2 ;A CHARACTER OF THE ERROR CMPB R2,#'@ BNE 4$ ;IF '@', THEN SUBST ID FOR NAME MOV T MORE TO CHECK BHI 4$ ;IF INSERT SHOULD BE HERE CMP (R0)+,(R3)+ BLO 2$ ;IF NO MATCH BUT MORE TO CHECK BHI 4$ ;IF INS#ID,R3 3$: CMPB @R3,#40 BEQ 2$ ;LOOP UNTIL BLANK MOVB (R3)+,(R1)+ ;MOVE IN ID NAME BR 3$ 4$: MOVB R2,(R1)+ ;PUT IN ERROERT SHOULD BE HERE CMP (R0)+,(R3)+ BLO 2$ ;IF NO MATCH BUT MORE TO CHECK BHI 4$ ;IF INSERT SHOULD BE HERE MOV R2,R0 ;R MESSAGE CHARACTER BNE 2$ ;LOOP UNTIL END OF MESSG DEC R1 ;BACK UP OVER NULL MOVB #CR,(R1)+ ;PUT IN CRLF MOVB #LF,(R1R0 -> SYMBOL TABLE ENTRY 6$: CALL CRFSYM ;CREF THE SYMBOL RETURN 2$: MOV R2,R4 ;SAVE ADRS OF LAST SYMBOL MOV SY.LCL(R2)+ CLRB @R1 ;NULL AS STOPPER MOV R1,MSGPTR ;SAVE CURRENT POSITION 1$: INC ERRCNT ;ERROR COUNTER FOR PROGRAM TST (R5)+ ),R0 ;R0 -> NEXT ENTRY LINKED TO BUCKET BNE 3$ ;IF IS ONE TO LOOK AT 4$: MOV SYTEND,R0 ;IF NON IN TABLE, MAKE ONE MOV #ID,;PASS ERROR TEXT POINTER MOV (SP)+,R3 ;RESTORE REGISTERS MOV (SP)+,R2 MOV (SP)+,R1 MOV (SP)+,R0 RTS R5 .SBTTL EXPRER3 MOV SY.LCL(R4),-(SP) ;SAVE FORWARD LINK MOV R0,SY.LCL(R4) ;LINK NEW ENTRY TO PREVIOUS MOV (R3)+,(R0)+ ;MOVE IN NAME MSSIONS ;ACCEPT AN EXPRESSION AND RETURN THE RESULT IN 'RESULT' AND R1 .ENABL LSB EXPR: MOV SP,SAVESP ;SAVE STACK IN CASE O  CK MUST BE ; RESET AND A ZERO IS SUBSTITUTED FOR THE RESULT EXPERR: MOV SAVESP,SP ;RESET SP CLR RESULT ;RETURN 0 FOR ILLEGA MOV (SP)+,RESULT ;PUT THE PREVIOUS RESULT IN RESULT RETURN ;THE SUBEXPRESSION RESULT IS IN R1 .DSABL LSB .SBTTL CL EXPRESSION BR 5$ 3$: DEC R5 ;BUMP BACK DELIMITER TST PARLVL BEQ 5$ ;IF NO OPEN PARENS LEFT ERROR S, CLR R1 ;RESULT IS 0 IF ERROR 5$: MOV RESULT,R1 RETURN OPERTB: .WORD 10$,20$,30$,40$ OPER: .ASCII /+-&!/ .EVEN ,#', BEQ RETURN ;IF IS A COMMA 1$: ERROR S, .SBTTL LEXICAL ANALYZER ; LEX ; GET THE NEXT NOPS= 4 ;NUMPER OF OPERATORS ; ADDITION 10$: ADD R1,RESULT BR 1$ ; SUBTRACTION 20$: SUB R1,RESULT BR 1$ ; AND  SYNTATIC ELEMENT LEX: MOV REPEAT,R1 BNE RETURN ;IF REPEATING THE LAST REPORT CALL STNF ;SKIP TO THE NEXT FIELD CLR R2  30$: COM R1 BIC R1,RESULT BR 1$ ; OR 40$: BIS R1,RESULT BR 1$ ; CLOSE PAREN (>) ; OPEN PARENS ARE FOUND IN EXOP ;DEFAULT TO RADIX 8 MOVB (R5)+,R0 ;R0=1ST CHARACTER BIC #^C<177>,R0 MOVB CLASS(R0),R1 ;DISPATCH ON THE CHARACTER CLASS ND AND THE PAREN LEVEL IS INCR AND ; EXPRESSION IS CALLED RECURSIVLY. IF THE PAREN LEVEL IS > 0, ; THEN RESET EVERYTHING AND JMP @LEX1(R1) LEX1: .WORD LEXALP,LEXNUM,LEXSPC ; ALPHABETIC CHARACTER FIRST LEXALP: MOV #ID+4,R2 ;MOVE NAME INTO ID MOVRETURN TO EXOPND. 50$: DEC PARLVL BGE 61$ ;IF WE WERE IN PARENS ERROR S, BR EXP #" ,R3 MOV R3,@R2 MOV R3,-(R2) ;INIT IT TO BLANKS MOV R3,-(R2) MOV #6,R3 ;UP TO 6 CHARACTERS 1$: DEC R3 BLT 2$ ;IP PAST PLUS OPERATOR 8$: CALL EXOPND ;GET AN OPERAND 7$: MOV R1,RESULT ;SET RESULT WITH INITIAL OPERAND 1$: MOVB (R5)+,R0 ;GERR 61$: MOV RESULT,R1 ;GET THIS RESULT RETURN .DSABL LSB ; EXPRESSION OPERAND GETTER .ENABL LSB EXOPND: CALL LEX ;GEET DELIMITER CHARACTER MOV #NOPS-1,R1 4$: CMPB OPER(R1),R0 BEQ 2$ ;IF MATCHES CURRENT OPCODE DEC R1 BPL 4$ ;IF MORE T A ITEM BLT 3$ ;IF SPECIAL CHAR BGT 2$ ;IF NUMBER, VALUE IN R1 ; SYMBOL - LOOK UP NAME IN SYMBOL TABLE CALL ENTER ;OPERATERS LEFT CMPB R0,#CR BEQ 3$ ;IF END OF LINE CONDITION CMPB R0,#', BEQ 3$ CMPB R0,#'; BEQ 3$ CMPB R0,#040 CHECK FOR NAME BIT #ST.DFN!ST.EQU,SY.STS(R0) BNE 1$ ;IF SYMBOL WAS ALREDY DEFINED ERROR U, CLRBEQ 3$ CMPB R0,#TAB BEQ 3$ CMPB R0,#'> BEQ 50$ ;IF END OF SUBEXPRESSION ERROR S, BR R1 RETURN ;DONT LEAVE WITH JUNK IN R1 1$: MOV SY.ADR(R0),R1 RETURN ; CONSTANT CODE MERGES HERE 2$: MOV R0,R1 RETUR EXPERR ;RESET EVERYTHNG ON ERROR 2$: MOV R1,-(SP) ;SAVE THE OPERATOR CALL EXOPND ;GET 2ND OPERAND MOV (SP)+,R0 ;GET OPN 3$: CMPB R0,#'< BEQ 4$ ;IF OPEN PAREN ERROR E, CLR R1 ;RETURN 0 FOR ILLEGAL OPND BERATOR BACK ASL R0 JMP @OPERTB(R0) BR 1$ ;LOOP ON OPERAND,OPRATOR PAIRS ; IF AN ERROR OCCURS IN AN EXPRESSION, THE STAR EXPERR 4$: INC PARLVL ;INDICATE IN PARENS MOV RESULT,-(SP) ;SAVE PREVIOUS RESULT CALL EXPR0 ;EVALUATE INSIDE PARENS  MBOL RETURN ; GET A NUMBER .ENABL LSB LEXNUM: CLR R1 ;INITIALIZE RESULT 1$: CMPB R0,MAXDIG(R2) BGT 2$ ;IF NOT DIGIT RN .SBTTL MICRO ASSEMBLER MAIN PROGRAM ; MICRO ASSEMBLER MICASM::CLR PASS ;START IN PASS 1 CALL DAYTIM ;FORMAT DATE AOF RADIX JMP @4$(R2) ;DISPATCH ON MULTIPLY BY RADIX 4$: .WORD 5$,6$,7$ 5$: ASL R1 ;SHIFT PREVIOUS RESULT ASL R1 6$: ASLND TIME FOR OUTPUT CALL OPEN ;OPEN THE FILES CALL ONEPAS ;DO BOTH PASSES CLRB TITLE ;START WITH NO TITLE CLRB SBTTL  R1 BR 8$ 7$: MOV R1,-(SP) ;MULTIPLY BY 10 ASL R1 ASL R1 ADD (SP)+,R1 ASL R1 8$: SUB #'0,R0 ;MAKE DIGIT A NUMBER ;START WITH NO SUBTITLE CALL ONEPAS CALL PRTSYM ;PRINT SYMBOL TABLE CALL PRBTMP ;PRINT BIT MAP ALA OS/8 CALL CLOSE ;CADD R0,R1 ;ADD INTO RUNNING TOTAL MOVB (R5)+,R0 ;GET NEXT CHARACTER BIC #^C<177>,R0 CMPB CLASS(R0),#C.NMBR BEQ 1$ ;LOOLOSE THE FILES .EXIT ;THATS ALL .SBTTL OCTAL NUMBER CONVERSION ; CONVERT BINARY NUMBERS TO OCTAL ; DIFFERENT ENTRY POP ON DIGITS MOV R1,R0 ;RETURN NUMBER IN R0 DEC R5 ;BACK OVER DELIMITER BR 3$ 2$: ERROR N, INTS FOR DIFFERENT NUMBERS OF BITS TO CONVERT OCT12: MOV #40,R2 ;DEFALUT TO BLANK UNLESS 1 BIT #10000,R0 BEQ 1$ ;IF NOT 1CLR R0 3$: MOV #LX.NUM,R1 ;RETURN A NUMBER OF ZERO RETURN .DSABL LSB ; SPECIAL CHARACTER .ENABL LSB LEXSPC: MOVB #L0000 BIT SET MOV #'1,R2 1$: MOVB R2,(R4)+ ;PUT IN THE DIGIT OCT11: .ENABLE LSB MOV #4,R2 ;DO 11 BITS (4 DIGITS) CLC X.SPC,R1 ;RETURN SPECIAL CHAR CODE CMPB R0,#'' BNE 4$ ;IF NOT ASCII CHARACTER MOVB (R5)+,R0 BIC #^C<177>,R0 CMPB R0,# SWAB R0 RORB R0 ;11 BITS TO TOP OF WORD BR 3$ ; DO A BYTE (3 DIGITS, 8 BITS) OCTBYT: MOV #3,R2 ;3 DIGITS CLC SWAB40 BGE 2$ ;MAKE R0 THE CONSTANT ERROR C, BR 5$ 4$: CMPB R0,#'; BNE 6$ ;IF NOT COMMENT DE R0 BR 4$ ; OUTPUT 16 BITS WORTH OCTOUT: MOV #6,R2 ;6 DIGITS CLR R1 ROL R0 ROL R1 ;ROTATE IN BIT CLC BR 2$ 1C R5 ;SKIP OVER SEMI-COLON RETURN 6$: CMPB R0,#'^ BNE RETURN ;IF NOT ^RADIX CHARACTER MOVB (R5)+,R0 MOV #RDXTBL,R1 ;S$: ROL R0 ;POSITION DIGIT AT LOW ORDER 3 BITS 4$: ROL R0 ROL R0 ROL R0 3$: MOV R0,R1 ;GET WORD IN SAFE PLACE ROR R0 ;EE WHAT RADIXHE WANTS 1$: MOV (R1)+,R2 BEQ 2$ ;IF ILLEGAL RADIX CMPB R2,R0 BNE 1$ ;IF NOT THIS RADIX CLRB R2 SWAB RSHIFT BACK CARRY SO IT DOESNT GET LOST 2$: BIC #^C<7>,R1 ;ONLY 3 BITS ADD #'0,R1 MOVB R1,(R4)+ ;PUT IN OUTPUT LINE DEC R2F PAST THE END OF THE NAME MOVB R0,(R2)+ ;PUT A CHARACTER IN BUFFER 2$: MOVB (R5)+,R0 ;GET THE NEXT CHARACTER BIC #^C<177>,2 ;GET RADIX NUMBER ; OCTAL = 0 ; DECIMAL = 4 ; BINARY = 2 MOVB (R5)+,R0 ;GET DIGIT BIC #^C<177>,R0 CMPB CR0 CMPB CLASS(R0),#2 BLE 1$ ;IF ALPHA-NUMERIC DEC R5 ;BACKUP OVER DELIMITER CMP ID,#". BNE 3$ ;IF NOT SYMBOL ". " LASS(R0),#C.NMBR BEQ LEXNUM 2$: ERROR N, 5$: CLR R0 ;SET ERROR 3$: MOV #LX.NUM,R1 RETURN .DSABL  MOV LOCADR,R0 ;USE LOC FOR CONSTANT VALUE MOV #LX.NUM,R1 ; AND NUMBER AS ITEM TYPE RETURN 3$: MOV #LX.SYM,R1 ;RETURN SYLSB RDXTBL: .BYTE 'O,0 .BYTE 'B,2 .BYTE 'D,4 .BYTE 0,0 ; MAX DIGIT IN RADIX TABLE MAXDIG: .WORD '7, '1, '9 RETU  BNE 1$ ;IF MORE DIGITS RETURN .DSABLE LSB .SBTTL DO AN ASSEMBLY PASS ; DO A PASS ; ASSEMBLE LINES UNTIL THE END S4)+ BNE 10$ ;IF FAILURE DEC R3 BNE 15$ ;IF MORE BYTES TO COMPARE CLR OPL ;LOW ORDER BITS ARE ZERO MOVB (R1)+,OPL+1 TATEMENT IS FOUND ONEPAS: CLR OPNDFL ;INITIAL COMMENT STATEMENT CLR ERRCNT ;CLEAR PROGRAM ERROR COUNT CLR LOC ;INITIAL L;SET HIGH BITS MOVB (R1)+,R1 CMP (SP)+,(SP)+ CLR OPH ;CLEAR HIGH MICRO WORD AND RETURN Z BIT RETURN 10$: BHI 3$ ;IFOCATION COUNTER CLR LINE ;CLEAR CURRENT LINE CLR PAGE ;CLEAR CURRENT PAGE CLR LINCNT ;AND START FRESH PAGE CLR INBLK  GREATER CASE MOV (SP)+,R0 ;LOW POINTER UPDATED ADD #10,R0 BR 5$ 3$: MOV (SP)+,R2 ;HIGH POINTER UPDATED SUB #10,R2 5$: ;I/O BUFFER ADDRESS CLR OUTBLK CLR CRFBLK ;INIT CREF FILE OUTPUT BLOCK MOV #CRFBUF,CRFPTR ;AND BUFFER POINTER MOV #OBJ CMP R0,R2 BLOS 1$ ;IF NOT DONE MOV PC,(SP)+ ;FAIL - RETURN Z CLEAR RETURN .SBTTL OPEN FILES AND SET UP ; OPEN ; DTXT,TXTPTR ;INIT TEXT RECORD POINTER MOV #10,BYTCNT ;INITIALIZE OBJ RECORD SIZE CLR OBJBLK ;START AT OBJ BLOCK 0 MOV #100O A CSI CALL TO OPEN THE FILES AND LOAD HANDLERS OPEN: MOV #SWTTBL,R0 ;R0 -> SWITCH TABLE 1$: TST (R0)+ ;AT END YET? BEQ 2$0,OBJADR ;START AT LOCATION 0 IN OBJ FILE MOV #-1,OPCLS ;MAKE SURE CLASS OK MOV #INBUF+513.,INPTR ;SET UP I/O POINTERS MOV ;IF EQ YES CLR @(R0)+ ;ELSE INIT VALUE BR 1$ 2$: MOV SP,R5 ;SAVE STACK POINTER FOR ERRORS MOV #-1*2,R1 ;GET ERROR I #OUTBUF,OUTPTR MOV #OBJBUF,OBJPTR ;INITIALIZE OUTPUT POINTER FOR OBJ 1$: MOV #3,STMERC ;NUMBER OF ALLOWABLE ERRORS MOV #ERNDEX FOR ID MSG .LOCK ;LOCK THE USR .GTLIN #LINBUF,#PROMPT ;READ A LINE OF SPECS TSTB LINBUF ;ANYTHING MORE THAN ? RBUF,MSGPTR ;INIT ERROR MESSAGE BUFFER POINTER MOV #OUTLN,ERRPNT ;SET UP ERROR POINTER CALL ASM ;ASSEMBLE A LINE CMP OPCL BEQ 3$ ;IF EQ NO .CSISPC #OUTSPC,#DEXT,#LINBUF ;GET RAD50 FOR CREF MOV R5,SP ;RESTORE STACK .CSIGEN SPACE+2,#DEXT,#LINS,#CL.END BNE 1$ ;LOOP UNTIL END INC PASS RETURN .SBTTL LOOKUP OPCODES IN OPCODE TABLE ; OPCODE ; CHECK IF THE OPCBUF ;NOW OPEN AND GET HANDLERS BCC 4$ ;IF CC NO ERRORS MOVB @#EMTERR,R1 ;ELSE GET ERROR INDEX ASL R1 ;MAKE WORD INDEX 3ODE IS IN THE TABLE AND PULL OUT THE BASE ; OPCODE NUMBER FROM THE TABLE. OPCODE: MOV #OPTBL,R1 ;R1 -> START OF TABLE MOV $: .UNLOCK ;BANISH USR .PRINT OPNERR(R1) ;PRINT APPROPRIATE MSG MOV R5,SP ;RESTORE STACK BR 2$ ;AND GET A VALID LINE R1,-(SP) BIC #^C<7>,@SP ;@SP->TABLE ADDR LOW BITS TO OR IN MOV #OPTBLE-10,R2 ;R2 -> CURRENT HIGH ENTRY MOV R1,R0 1$: MOV  4$: MOV R0,SYTBGN ;SET LOW LIMITS MOV R0,SYTEND ; POP SWITCHES OFF STACK AND SET FLAGS MOV (SP)+,R1 ;R1 = # OF SWITCHESR0,R1 ;CLACULATE PROBE INTO TABLE ADD R2,R1 ROR R1 BIC #7,R1 ;KILL LOW BITS BIS @SP,R1 ;AND USE TABLE OFFSET FM XXX0  BEQ 9$ ;IF EQ, NONE 8$: MOV #SWTTBL,R2 ;R2 -> TABLE OF VALID SWITCHES 5$: CMPB @SP,@R2 ;SWITCH NAME MATCH? BEQ 6$ ;IF  MOV #6,R3 ;R3 = BYTE COUNT MOV #ID,R4 ;R4 -> SOURCE FROM MICRO STMT MOV R1,-(SP) ;SAVE ENTRY POINTER 15$: CMPB (R1)+,(REQ YES CMP (R2)+,(R2)+ ;ELSE SKIP THIS ENTRY TST @R2 ;AT END OF TABLE? BNE 5$ ;IF NE NO MOV #-2*2,R1 ;SET UNKNOWN SWIT NED SYMBOLS BY 6$: MOV #ID,R4 ; MOVING THEM IN VIA ENTER MOV (R5)+,(R4)+ BEQ 4$ ;IF DONE ENTERNG MOV (R5)+,(R4)+ MOV  .WORD DEVFUL .WORD FNFMSG CRFERR: .ASCIZ /?MICRO-F-Insufficient space for cross-reference temporary file/ SWTMSG:.ASCII (R5)+,(R4)+ CALL ENTERD ;PUT IT IN MOV (R5)+,SY.STS(R0) ;PUT IN STATUS BITS MOV (R5)+,SY.ADR(R0) ;PUT IN VALUE BR 6$ ;%?MICRO-F-Undefined switch "/% SWTNAM: .ASCIZ / "/ VERMSG: .ASCIZ /MICRO V01.01/ ILLCMD: .ASCIZ /?MICRO-F-Illegal command forDO NEXT SYMBOL ; CLEAR THE MEMORY BITMAP 4$: MOV #BITMAP,R0 MOV #4000/10,R1 5$: CLRB (R0)+ DEC R1 BNE 5$ ; SET UP mat/ ILLDEV: .ASCIZ /?MICRO-F-Illegal device specification/ DEVFUL: .ASCIZ /?MICRO-F-Output device full/ FNFMSG: .ASCIZ /?MICCH MSG MOVB @SP,SWTNAM ;AND ITS NAME BR 3$ 6$: COM @2(R2) ;ELSE FLAG LISTED SWITCH TST (SP)+ ;DUMP SWITCH NAME BPL ORDER FOR EXTENSION BITS FIELD AND TRAN FIELD MOV #EXTFLD,EXTEN1 ;ASSUME THE NEW WAY (TRAN LAST) MOV #TRNFLD,EXTEN2 TST O7$ ;IF PL, NO VALUE GIVEN MOV (SP)+,@2(R2) ;PUT VALUE IN SWITCH 7$: DEC R1 ;COUNT DOWN # OF SWITCHES BNE 8$ ;IF NE , SOMLDFMT BEQ 11$ ;IF NOT OLD WAY MOV #TRNFLD,EXTEN1 ;SET UP TWO FIELD ADDRESSES MOV #EXTFLD,EXTEN2 ; CHECK FOR OBJ AND LIE LEFT 9$: MOV MODE,R0 ;CHECK WHAT MODE THIS SHOULD BE BEQ 12$ ;IF NONE SPECIFIED, THEN MODE 1 CMP R0,#1 BLT 14$ ;IF IST FILES IN CSI LINE 11$: CLR OBJFL ;INIT OBJ AND LIST FLAGS CLR LISTFL .WAIT #0 ;CHECK IF OBJ FILE OPENED BCS 3$ INCLLEGAL MODE CMP R0,#4 BLE 13$ ;IF LEGAL MODE 14$: .PRINT #MODERR ;ILLEGAL MODE .EXIT 12$: INC R0 ;IF NO MODE SPECIFI OBJFL ;SET OBJ FLAG 3$: MOV #131.-29.,LINSIZ ;DEFAULT TO LINE PRINTER .WAIT #1 BCS 7$ ;IF NO LIST FILE INC LISTFL TSED, USE 1 13$: MOV R0,MODE ;STORE MODE TST CRFFL ;CREF REQUESTED? BEQ 10$ ;IF EQ NO .WAIT #2 ;WAS A FILE SPECIFIED? T TTYFL BEQ 7$ ;IF NOT NARROW MOV #71.-18.,LINSIZ 7$: RETURN 2$: .PRINT #STFAIL .EXIT STFAIL: .ASCIZ /?MICRO-F-Not BCC 10$ ;IF CC YES MOV #^RSY ,CRFSPC ;ELSE SET CREF DEVICE=SY: .ENTER #AREA,#2,#CRFSYS,#-1 ;AND ENTER A CREF TEMP FILE B enough memory for symbol table/ .EVEN ILC: .PRINT #ILCM ;ILLEGAL COMMAND .EXIT ILCM: .ASCIZ /?MICRO-F-Illegal commanCC 10$ ;IF CC OKAY MOV #-3*2,R1 ;INDICATE NO CREF FILE ROOM BR 3$ 10$: .UNLOCK ;FREE USR NOW .SETTOP #-2 ;GET ALL Fd line/ .EVEN ; DEFAULT EXTENSION TABLE DEXT: .RAD50 /MIC/ ;INPUT FILES .RAD50 /OBJ/ ;OUTPUT FILES .RAD50 /LST/ ;LIREE SPACE AVAILABLE SUB #40,R0 ;LEAVE SOME BUFFER MOV R0,TOP ;REMEMBER TOP LOC TST WCSFL ;WCS LOAD REQUESTED? BEQ OPNSTING SPACE: .LIMIT ;CORE LIMIT IN 2ND WORD SWTTBL: .WORD 'B,BITFL .WORD 'C,CRFFL .WORD 'M,MODE .WORD 'N,TTYFL .PRE ;IF EQ NO CLR @#WCSSTS ;ELSE DISABLE WCS MIB RESPONSE CLR @#WCSSTS ; ENTER PREDEFINED SYMBOLS INTO THE SYMBOL TABLE WORD 'O,OLDFMT .WORD 'W,WCSFL .WORD 0 OUTSPC: .BLKW 5 LSTSPC: .BLKW 5 CRFSPC: .BLKW 5 .BLKW 24. CRFSYS: .RAD50 /SY OPNPRE: MOV #BUCKET,R5 ;CLEAR THE BUCKET POINTERS MOV #27.,R4 1$: CLR (R5)+ DEC R4 BNE 1$ MOV #PREDF,R5 ;ENTER PREDEFI CREF TMP/ PROMPT: .BYTE '*,200 .WORD CRFERR .WORD SWTMSG .WORD VERMSG OPNERR: .WORD ILLCMD .WORD ILLDEV .WORD 0  ting OBJ file/ ; WRITE SOME WORDS TO THE DATA RECORD AND WRITE IT IF NECESSARY OUTDAT: CMP TXTPTR,#OBJEND BLO 1$ ;IF ROO 2$ ;IF EQ NO TST TRANPR ;WAS A TRANSLATION PRESENT IN THE CODE? BNE 2$ ;IF NE YES CMP OPCLS,#CL.JMP ;UNCONDITIONAL JMPM IN CURRENT RECORD MOV #TXTREC,R1 MOV BYTCNT,R3 CALL OBJWRT ;NO ROOM, WRITE THIS RECORD MOV #10,BYTCNT ;START A NEW RE AT THIS ADRS? BEQ 2$ ;IF EQ YES CMP OPCLS,#CL.CJM ;OR CONDITIONAL TYPE? BEQ 2$ ;IF EQ YES CMP OPCLS,#CL.JSR BEQ 2$ CORD MOV #OBJTXT,TXTPTR MOV LOC,R0 ;SET NEW LOCATION COUNTER ASL R0 ASL R0 ADD #1000,R0 ;OBJ ADDR = LOC*4+10000 MOV ;JSR IS A JUMP CMP OPCLS,#CL.RFS BEQ 2$ ;RFS CHANGES PC ON TRANS ALSO ERROR T, 2$: TST WCSFL ;ASSEMBLING TO WCS? BEQ 3$ ;IF EQ NO MOV RAMADR,@#WCSSTS ;ELSE LOAD ADRS MOV OPL,@#WCSLOW ;AND LNT ;COUNT THE DATA BYTE INC TXTPTR BR OUTDAT ;DO NEXT BYTE 2$: RTS R5 ; OBJ TEXT RECORD TXTREC: .WORD 1 ;TEXT RECOROW DATA MOV OPH,@#WCSHGH ;AND HIGH DATA 3$: TST OBJFL BEQ 4$ ;IF NO OBJ FILE JSR R5,OUTDAT ;WRITE THE 4 BYTES IN THE OBJD BYTCNT: .WORD 0 ;BYTE COUNT FOR RECORD .WORD 3 ;RECORD TYPE 3=TXT REC OBJADR: .WORD 0 ;LOAD ADDRESS OBJTXT: .BLKW 40. ;TH .WORD OPL,OPL+1,OPH,OPH+1,0 4$: RETURN .DSABL LSB BITS: .BYTE 1,2,4,10,20,40,100,200 .SBTTL BEARTRAP LOCATION DEFINIRO-F-Input file not found/ MODERR: .ASCIZ /?MICRO-F-Illegal MODE switch value/ LINBUF: .BLKB 82. .EVEN .SBTTL OBJ OUTPUE TEXT ITSELF OBJEND: .SBTTL OUTPUT A MICRO WORD TO THE OUTPUT ; OUTPUT A MICRO WORD ; CHECK THAT IT IS NOT OVERLAYING T ROUTINES ; WRITE AN OBJ RECORD AND COMPUTE CHECKSUM ; R1 -> OBJ RECORD TO BE WRITTEN ; R3 = BYTE COUNT OBJWRT: MOV OBJPA PREVIOUSLY ASSEMBLED LOCATION .ENABLE LSB OUTWRD: TST PASS BEQ RETURN ;DONT DO ANYTHING ON PASS 1 TST OPNDFL BLE RETTR,R0 ;R0 -> OBJBUF CURRENT POSITION CLR CHKSUM 1$: CMP R0,#OBJBUF+512. BLO 3$ ;IF MORE ROOM LEFT .WRITW #AREA,#0,#OBJBUURN ;IF NO OPRAND AT THIS LOC MOV LOCADR,R0 CMP MODE,#2 BNE 5$ ;ALL MODES ARE EASY EXCEPT 2 SUB #10000,R0 ;IF IN THE HF,#256.,OBJBLK ;WRITE LAST BLOCK BCC 2$ ;IF NO ERRORS .PRINT #OBJERR .EXIT 2$: MOV #OBJBUF,R0 ;RESET BUFFER POINTER IGH RANGE BGE 5$ ; THEN ADDRESS IS NORMALIZED ADD #10000-3000,R0 ;OTHERWISE, DO LOW ADDRESSES 5$: BIC #^C<1777>,R0 ;MAKE AINC OBJBLK 3$: CLR R2 ;GET AN OBJ BYTE TO WRITE BISB (R1)+,R2 MOVB R2,(R0)+ ;PUT IN OBJ BUFFER ADD R2,CHKSUM ;ADD BYTE TDDRESS IN RANGE FOR RAM MOV R0,RAMADR MOV R0,R1 ;R0,R1=MICRO PC ASR R0 ASR R0 ASR R0 ;R0=BYTE OFFSET INTO BITMAP BO CHECKSUM DEC R3 BGT 1$ ;IF MORE BYTES TO WRITE BLT 4$ ;IF REALLY DONE WITH EVERYTHING MOV #CHKSUM,R1 ;WRITE THE CHECIC #^C<7>,R1 ;R1=BIT NUMBER TO USE BITB BITS(R1),BITMAP(R0) BEQ 1$ ;IF LOCATION IS UNUSED SO FAR ERROR O, 1$: BISB BITS(R1),BITMAP(R0) BITB BITS(R1),BEARTP(R0) ;DEFINED TRANSLATION FOR THIS LOC? BEQ  BEAR <2550,2551,2552,2553> ;RET,RET,RET,RET .SBTTL PRINT OS/8 STYLE BIT MAP ON LISTING FILE PRBTMP: TST LISTFL BEQ RETULINE CALL PRTLN ;PRINT THE LINE CMP R5,#2000 BLO 1$ ;IF MORE BITS TO DO RETURN BITM1: .ASCII /Micro 00 10 RN ;NOT IF NO OUTPUT FILES TST BITFL ;IS BITMAP SWITCH SET? BEQ RETURN ;IF EQ NO CLR LINCNT ;FORCE TOP OF PAGE MOV # 20 30 40 / .ASCIZ / 50 60 70 / BITM2: .ASCII /Adrs+ 01234567 01234567 01234567 0MEMBIT,R0 MOV #SBTTL,R1 ;PUT TITLE ON BITMAP 7$: MOVB (R0)+,(R1)+ BNE 7$ MOV #BITM1,R2 ;OUTPUT HEADER LINE 1 CALL PRNTR1234567 01234567 / .ASCII /01234567 01234567 01234567/ BITBL: .ASCIZ MEMBIT: .ASCIZ /Bitmap of Microlocations Used/2 MOV #BITM2,R2 ;OUTPUT HEADER LINE 2 CALL PRNTR2 MOV #BITBL,R2 ;AND A BLANK LINE CALL PRNTR2 MOV #BITMAP,R3 ;R3 -> BI .EVEN .SBTTL PRINT A LINE BY MOVING IT TO THE OUTPUT BUFFER ; PRINT ; MOVE THE LINE TO THE OUTPUT BUFFER AND SEND THE TMAP BYTE TABLE CLR R5 ;R5 = LOCATION CURRENTLY MAPPED 1$: MOV #OUTLN,R4 ;R4 -> OUTPUT LINE MOV R5,R0 MOV MODE,R2 ;RECOBUFFER IF NECESSARY .ENABL LSB PRINT: TST PASS BEQ RETURN ;NO LISTING ON PASS 1 TST LISTFL BNE 6$ ;IF GETTING LISTINNVERT ADDRESS BASED ON MODE ASL R2 JMP @10$-2(R2) 10$: .WORD 11$,12$,13$,14$ ; MODE 1 AND 3 11$: 13$: ADD #2000,R0 BG CMP #ERRBUF,MSGPTR BEQ 9$ ;IF NO ERRORS ON LINE 6$: MOV #OUTLIN,R4 MOV LINE,R0 CALL DEC5 ;CONVERT LINE # FOR OUTPUTR 14$ ;EASY MODE ; MODE 2 12$: ADD #3000,R0 CMP R0,#4000 BLO 14$ ;IF IN 1ST HALF OF RAM ADD #10000-1000,R0 ;MAKE 2ND TST OPNDFL BEQ PRTLN ;IF ONLY COMMENT LINE MOV #OUTLC,R4 ;PRINT LOCATION COUNTER MOV LOCADR,R0 CALL OCT12 ;12 BITS  HALF ADDRESS ; MODE 4 MERGES HERE 14$: CALL OCT12 ;CONVERT LOCATION MOVB #' ,(R4)+ CLR R2 ;LOOK FOR EMPTY ROW 2$: M TST TTYFL BEQ 4$ ;IF WIDE DEFAULT LISTING MOV #IN-1,R0 ;MOVE INPUT LINE DOWN AFTER LOC CTR 12$: MOVB (R0)+,(R4)+ ;MOVE AOVB #' ,(R4)+ MOVB (R3)+,R0 ;R0 = BYTE TO OUTPUT BIS R0,R2 ;OR ALL BITS FROM ROW SEC 3$: MOV #'0,R1 ;ASSUME A ZERO RO BYTE BNE 12$ ;IF NOT AT END BR PRTLN ;PRINT SHORTEND LINE 4$: TST OPNDFL BLE PRTLN ;IF NO OPERAND TO PRINT MOV OPH,TIONS ; BEARTRAP LOCATIONS IN THE EIS/FIS REGION: BEAR <2033> ;EII BEAR <2072> ;EII BEAR <2123> ;PSW BEAR <2172> ;PSW BERB R0 BEQ 4$ ;IF AT END OF BYTE ADC R1 ;ADD IN ACTUAL BIT MOVB R1,(R4)+ ;PUT BIT IN OUTPUT LINE BR 3$ 4$: ADD #10,RAR <2220> ;FII BEAR <2254> ;FII BEAR <2274> ;FII BEAR <2320> ;FII BEAR <2406> ;FII BEAR <2447> ;EII BEAR <2500> ;EII BEAR5 ;SKIP TO NEXT BLOCK OF 8 WORDS BIT #77,R5 BNE 2$ ;IF NOT AT END OF LINE TST R2 BNE 6$ ;IF AT LEAST ONE BIT ON ROW  <2516> ;PSW BEAR <2540> ;EII BEAR <2571> ;DMW BEAR <2604> ;EII BEAR <2614> ;EII BEAR <2622> ;PSW BEAR <2630> ;PSW BEAR < MOV #OUTLN+5,R4 ;IF NO BITS, ONLY PRINT ADDR 6$: MOVB #CR,(R4)+ MOVB #LF,(R4)+ BIT #777,R5 BNE 5$ ;IF NOT END OF BLOCK 2644> ;EII BEAR <2654> ;EII BEAR <2700> ;EII BEAR <2710,2714,2717> ;EII,PSW,PSW BEAR <2740> ;EII BEAR <2750,2754> ;EII,PSW  DEC LINCNT ;THIS IS EXTRA LINE MOVB #CR,(R4)+ ;PUT OUT EXTRA BLANK LINE MOVB #LF,(R4)+ 5$: CLRB (R4)+ ;INDICATE END OF  L 16 BITS PRTLN: MOV #OUTLN,R2 ;R2 -> LINE TO BE PRINTED PRNTR2: MOV OUTPTR,R0 ;R0 -> NEXT FREE CHARACTER IN BUFFER 8$: TST LE INTO LISTING FILE PRTSYM: TST LISTFL ;LISTING REQUESTED? BEQ RETURN ;IF EQ NO CLR LINCNT ;GET NEW PAGE MOV #SYMSBTISTFL BNE 10$ ;IF LISTING MOV R2,R0 .PRINT ;PRINT ERROR ON TTY BR 7$ 10$: DEC LINCNT ;ANY LINES LEFT ON CURRENT PAG,R0 ;POINT TO OUR SUBTITLE LINE MOV #SBTTL,R1 ;AND THE SUBTITLE BUFFER 1$: MOVB (R0)+,(R1)+ ;COPY SUBTITLE BNE 1$ MOV #BUE? BPL 11$ ;IF PL YES MOV R2,-(SP) ;SAVE VOLATILE REGS MOV R0,-(SP) MOV #PAGENM,R4 INC PAGE MOV PAGE,R0 CALL DEC5CKET,R5 ;INIT POINTER FOR PRTNXT MOV R5,BCKPTR 2$: MOV #5.,R3 ;R3 = # OF COLUMNS TO PRINT MOV #OUTLN,R4 ;R4 -> OUTPUT LINE ;FORMAT PAGE # MOV (SP)+,R0 ;RESTORE OUTPUT POINTER MOV #TITLE-1,R2 CALL 1$ ;PRINT THE TITLE MOV #HEADER,R2 ;POINT TO BUFFER 3$: CALL PRTNXT ;SET R5 -> NEXT SYMBOL TO OUTPUT BCS 9$ ;IF CS, NONE LEFT MOVB (R5)+,(R4)+ ;COPY SYMBOL TO OUTPUT LISTING HEADER CALL 1$ ;AND OUTPUT IT MOV #SBTTL,R2 ;POINT TO SUBTITLE LINE CALL 1$ ;AND OUTPUT IT MOV #CRLF,R2 ;TERM LINE MOVB (R5)+,(R4)+ MOVB (R5)+,(R4)+ MOVB (R5)+,(R4)+ MOVB (R5)+,(R4)+ MOVB (R5)+,(R4)+ MOV (R5)+,R0 ;R0 = ADRS FINATE SUBTITLE AND CALL 1$ ;LEAVE A BLANK LINE MOV (SP)+,R2 MOV #55.,LINCNT ;SET LINES LEFT 11$: CALL 1$ ;OUTPUT LINE OR SYMBOL MOVB #40,(R4)+ ;ASSUME BLANK, NOT EQUATED BIT #ST.EQU,@R5 ;WAS EQUATE DONE? BEQ 4$ ;IF EQ NO MOVB #'=,-1(R4) 7$: MOV #ERRBUF,R2 ;MOVE ERROR MESSAGES IN AFTER LINE CMP R2,MSGPTR BEQ 5$ ;IF NO ERRORS ON THIS LINE MOV R2,MSGPTR BR ;MAKE IT EQUATED 4$: MOVB #'*,@R4 ;ASSUME NO VALUE, **** MOVB (R4)+,@R4 MOVB (R4)+,@R4 MOVB (R4)+,(R4)+ MOVB #40,(R4)+8$ ;NOW MOVE IN ERROR TEXT 5$: MOV R0,OUTPTR 9$: CLR OPNDFL ;RESET FLAG FOR NEXT TIME RETURN 1$: CMP R0,#OUTBUF+512.  ;BLANK AT END BIT #ST.DFN!ST.EQU,@R5 ;DOES SYMBOL HAVE A VALUE? BEQ 5$ ;IF EQ NO SUB #5,R4 ;BACK UP TO ADDR OF VALUE INBLO 3$ ;IF MORE ROOM FOR THIS CHARACTER .WRITW #AREA,#1,#OUTBUF,#256.,OUTBLK BCC 2$ ;IF OUTPUT WENT OK .PRINT #WRERR ;G LINE CALL OCT12 ;CONVERT TO 5 OCTAL DIGITS 5$: MOV R4,R0 ;REMEMBER OUTPUT LOCATION MOV (R5)+,R1 ;PICK UP STATUS FLAGS OT AN ERROR .EXIT 2$: MOV #OUTBUF,R0 ;R0 -> START OF OUTPUT BUFFER INC OUTBLK ;NEXT BLOCK 3$: MOVB (R2)+,(R0)+ BNE 1$ MOVB #40,@R4 ;PRE-BLANK STATUS AREA (4 BYTES) MOVB (R4)+,@R4 MOVB (R4)+,@R4 MOVB (R4)+,(R4)+ BIT #ST.REG,R1 ;DEFINED AS;LOOP MOVING CHARACTERS DEC R0 ;DISCARD NULL RETURN .DSABL LSB WRERR: .ASCIZ /?MICRO-F-Output error on listing file/ REGISTER? BEQ 6$ ;IF EQ NO MOVB #'R,(R0)+ ;ELSE OUTPUT "R" FLAG 6$: BIT #ST.TRN,R1 ;IS THIS A TRANSLATION SYMBOL? BEQ 7 HEADER: .ASCII / MICRO V01.01 / DATE: .ASCII /99-XXX-99 / TIME: .ASCII /99:99:99/ PAGEST: .ASCII / PAGE / PAGENM: .ASCIZ $ ;IF EQ NO MOVB #'T,(R0)+ ;ELSE FLAG AS SUCH 7$: BIT #ST.EXT,R1 ;SYMBOL DEFINES EXTENSION BITS? BEQ 8$ ;IF EQ NO MOVB R0 INC R4 ;PASS SPACE CALL OCTBYT ;HIGH ORDER WORD INC R4 MOV OPL,R0 ;LOW ORDER WORD (INSTRUCTION) CALL OCTOUT ;AL/ / CRLF: .ASCIZ .EVEN .SBTTL PRINT SYMBOL TABLE IN LISTING ; PRTSYM ; PRINTS SYMBOL TABL VB (R0)+,R1 ;GET A CHARACTER BEQ 2$ ;SKIP OVER NULLS CMPB R1,#FF ;FORM FEED EMBEDDED? BNE 5$ ;IF NE NO CLR LINCNT ;E TABLES DRIVE THE ASSEMBLE PROCESS ; THE TABLES CONTAIN THE OPCODE, THE NAME, AND THE CLASS OF ; OPERATION TO ALLOW CORRECT OPLSE FORCE NEW OUTPUT PAGE BR 2$ ;AND IGNORE CHARACTER 5$: INC R3 ;GO TO NEXT COLUMN CMP R3,LINSIZ BGE 7$ ;IF AT THE ERAND PROCESSING. OPTBL: OP <.END >,CL.END,0 OP <.PAGE >,CL.PAG,0 OP <.SBTTL>,CL.SBT,0 OP <.TITLE>,CL.TTL,0 OP #'X,(R0)+ ;ELSE FLAG 8$: DEC R3 ;COUNT DOWN NUMBER OF OUTPUT COLUMNS BNE 3$ ;IF NE, MORE TO DO ON THIS LINE CALL 9$ ;ELSEND OF THE LINE CMPB R1,#TAB BNE 8$ ;IF NOT A TAB TO EXPAND MOVB #40,(R2)+ ;REPLACE TAB WITH AT LEAST ONE BLANK BIT #7,E OUTPUT LINE BR 2$ ;AND CONTINUE 9$: CMP R4,#OUTLN ;ANYTHING ON THIS LINE? BEQ 10$ ;IF EQ NO MOVB #CR,(R4)+ ;INSTALLR3 BNE 5$ ;IF MORE SPACES TO NEXT TAB STOP BR 2$ ;IF ALREADY THERE, DO NEXT CHARACTER 8$: MOVB R1,(R2)+ ;PUT IT IN THE LI LINE MOVB #LF,(R4)+ ; TERMINATORS CLRB @R4 ;MAKE IT ASCIZ MOV #OUTLN,R2 ;GET ADDRESS CALL PRNTR2 ;AND PRINT THE LINE NE BUFFER 7$: CMPB R1,#LF BNE 2$ ;IF NOT THE END OF LINE MOV R0,INPTR ;NEW INPUT POINTER CMPB -1(R2),#LF BEQ 6$ ;IF L 10$: RETURN PRTNXT: MOV @R5,R5 ;LINK TO NEXT SYMTAB ENTRY BNE 1$ ;IF NE, SOME LEFT ON THIS BUCKET ADD #2,BCKPTR ;ELSE INE REALLY ENDED IN LF MOVB #LF,-1(R2) ; OTHERWISE PUT IN CR AND LF SO IT MOVB #CR,-2(R2) ; WILL PRINT CORRECTLY 6$: CLRB BUMP BUCKET POINTER MOV BCKPTR,R5 ;AND GET THE NEXT BUCKET CMP R5,#BCKEND ;FINISHED ALL BUCKETS? BLO PRTNXT ;IF LO NO B(R2)+ RETURN RDERR: .ASCIZ /?MICRO-F-Error reading input file/ .EVEN .SBTTL PROCESS REGISTER OPERANDS ; REG ; GET R 2$ ;ELSE RETURN ERROR 1$: TST (PC)+ ;CLEAR CARRY (NO ERROR) 2$: SEC ;INDICATE NO SYMBOLS LEFT RETURN SYMSBT: .ASCREGISTER AS ANY EXPRESSION REG: CALL EXPR ;GET EXPRESSION CMP R1,#17 BLOS RETURN ;IF IN RANGE ERROR R, CLR R1 ;SET GL AS VALUE RETURN ; ENTER REGISTER NAME IN SYMBOL TABLE AND SET ATTRIBUTES .ENABL LSB REGENTR EOF ;DEFAULT NOT AT EOF MOV #LINEND,R2 3$: MOVB #' ,-(R2) ;MOVE IN BLANKS CMP R2,#OUTLN BNE 3$ MOV #IN-1,R2 ;R2 -> I: CALL ENTERD ;ENTER SYMBOL BIT #ST.DFN,SY.STS(R0) BEQ 1$ ;IF NOT PREVIOUSLY A LABEL ERROR R, INPUT BUFFER POINTER CLR R3 ;COLUMN COUNTER INIT 0 2$: clared as a label> RETURN 1$: BIS #ST.EQU!ST.REG,SY.STS(R0) ;MAKE IT A REGISTER IN TBL RETURN .DSABL LSB .SBTTLCMP R0,#INBUF+512. BLO 1$ ;IF A CHARACTER IN BUFFER .READW #AREA,#3,#INBUF,#256.,INBLK BCC 4$ ;IF NO ERRORS INC EOF ; SKIP TO NEXT FIELD ; STNF ; SKIP TO NEXT FIELD STNF: MOVB (R5)+,R0 ;GET CURRENT CHARACTER CMPB R0,#40 BEQ STNF ;IF A IF END OF FILE RETURN ;ASSUME EOF ON ERRORS 4$: MOV #INBUF,R0 ;NEW BUFFER POINTER INC INBLK ;BUMP BLOCK NUMBER 1$: MOBLANK CMPB R0,#TAB BEQ STNF ;IF A TAB DEC R5 ;SET TO REPEAT NEXT CHARACTER RETURN .SBTTL OPCODE TABLES ; OPCODE ICB2 >,CL.REG,112000 OP ,CL.REG,112400 OP ,CL.REG,111000 OP ,CL.REG,111400 OP ,CL.REG,113007000 OP ,CL.REG,117400 OP ,CL.REG,144000 OP ,CL.REG,144400 OP ,CL.REG,145000 OP ,CL0 OP ,CL.REG,113400 OP ,CL.IW,162000 OP ,CL.IW,162400 OP ,CL.REG,163000 OP ,CL.REG,.REG,145400 OP ,CL.REG,177000 OP ,CL.REG,176400 OP ,CL.PAG,0 OP ,CL.REG,174000 OP ,163400 OP ,CL.IW,161000 OP ,CL.IW,161400 OP ,CL.CJM,11000 OP ,CL.CJM,11400 OP ,CL.CCL.REG,175000 OP ,CL.RDF,0 OP ,CL.BFL,70000 OP ,CL.RFS,4000 OP ,CL.BFL,70000 OP ,CLJM,15000 OP ,CL.CJM,15400 OP ,CL.CJM,12000 OP ,CL.CJM,12400 OP ,CL.JMP,0 OP ,CL.CJM.REG,170000 OP ,CL.REG,172000 OP ,CL.REG,171000 OP ,CL.REG,173000 OP ,CL.RFS,72000 OP ,CL.CJM,13400 OP ,CL.CJM,17000 OP ,CL.CJM,17400 OP ,CL.JSR,0 OP ,CL.CJM,1 >,CL.REG,130000 OP ,CL.REG,134000 OP ,CL.REG,134400 OP ,CL.REG,130400 OP ,CL.SBT,0 OP ,CL.REG,124000 OP ,CL.REG,124400 OP ,CL.REG,120400 OP ,CL.LIT,20000 OP ,CL.CJM,16400 OP ,CL.CJM,10000 OP ,CL.CJM,10400 OP ,CL.CJM,14000 OP ,CL.CJMW >,CL.REG,121000 OP ,CL.REG,125000 OP ,CL.REG,125400 OP ,CL.REG,121400 OP ,CL.REG,122000,14400 OP ,CL.REG,71400 OP ,CL.AFL,72400 OP ,CL.LIT,60000 OP ,CL.LOC,0 OP ,CL.REG,1 OP ,CL.REG,122400 OP ,CL.REG,126000 OP ,CL.REG,127000 OP ,CL.REG,127400 OP ,CL.REG67000 OP ,CL.REG,100000 OP ,CL.REG,100400 OP ,CL.REG,166000 OP ,CL.MOD,0 OP ,CL.REG,123000 OP ,CL.REG,123400 OP ,CL.REG,132000 OP ,CL.REG,132400 OP ,CL.AFL,71000 OP ,,101000 OP ,CL.REG,101400 OP ,CL.REG,140000 OP ,CL.REG,140400 OP ,CL.REG,150000 OP CL.AFL,73400 OP ,CL.AFL,73000 OP ,CL.LIT,30000 OP ,CL.REG,102000 OP ,CL.REG,102400 OP ,CL.REG,151000 OP ,CL.REG,151400 OP ,CL.LIT,40000 OP ,CL.RFS,177400 OP ,CL.REG,103000 OP ,CL.REG,103400 OP ,CL.REG,133000 OP ,CL.REG,133400 OP ,CL.REG,136000 OW >,CL.REG,141000 OP ,CL.REG,141400 OP ,CL.NXT,10-1*400 OP ,CL.NXT,100-1*400 OP ,CL.NXT,2P ,CL.REG,136400 OP ,CL.REG,137000 OP ,CL.REG,137400 OP ,CL.DUM,0 OP ,CL.DUM,0 OP <-1*400 OP ,CL.NXT,20-1*400 OP ,CL.NXT,200-1*400 OP ,CL.NXT,4-1*400 OP ,CL.NXT,40-1*400 OP <END >,CL.END,0 OP ,CL.IW,160000 OP ,CL.IW,160400 OP ,CL.REG,110000 OP ,CL.REG,110400 OP <NXT400>,CL.NXT,400-1*400 OP ,CL.REG,176000 OP ,CL.REG,116000 OP ,CL.REG,116400 OP ,CL.REG,11 OP ,CL.REG,114000 OP ,CL.REG,114400 OP ,CL.REG,115000 OP ,CL.REG,115400 OP ,CL.TTL,0, ST.EQU SYMBOL <V >,2, ST.EQU SYMBOL <Z >,4, ST.EQU SYMBOL <N >,10, ST.EQU SYMBOL <C8 >,20, ST.EQU SYM OP <TL >,CL.LIT,50000 OP <TRAN >,CL.TRN,0 OP <TW >,CL.REG,143000 OP <TWF >,CL.REG,143400 OP <W >,CL.REG,17440BOL <C4 >,40, ST.EQU SYMBOL <ZB >,100, ST.EQU SYMBOL <NB >,200, ST.EQU SYMBOL <UB >,0, ST.EQU SYMBOL <LB 0 OP <WA >,CL.REG,175400 OP <WIB1 >,CL.REG,170400 OP <WIB2 >,CL.REG,172400 OP <WIW1 >,CL.REG,171400 OP <WIW2 >,CL.RE>,1, ST.EQU SYMBOL <UBC >,2, ST.EQU SYMBOL <LBC >,3, ST.EQU SYMBOL <RMW >,4, ST.EQU SYMBOL <TG6 >,1, ST.EQU SYG,173400 OP <XB >,CL.REG,146000 OP <XBF >,CL.REG,146400 OP <XW >,CL.REG,147000 OP <XWF >,CL.REG,147400 OPTBLE: .WMBOL <TG8 >,2, ST.EQU SYMBOL <LRR >,1, ST.EQU!ST.EXT SYMBOL <RSVC >,2, ST.EQU!ST.EXT SYMBOL <TROFF >,200, ST.EQU!ST.EORD 0,0,0 .SBTTL PREDEFINED SYMBOLS ; THE FOLLOWING SYMBOLS ARE ENTERED INTO THE SYMBOL TABLE BY ; OPEN AT THE START OF AXT SYMBOL <TGL >,34, ST.EQU!ST.EXT .WORD 0,0,0 .SBTTL CHARACTER CLASS TABLE ; CLASS ; EACH CHARACTER FROM 0-177 HASN ASSEMBLY. THIS ASSURES THE REGISTERS ; ETC. TO BE DEFINED. PREDF: SYMBOL <G >,0, ST.EQU!ST.REG SYMBOL <GL >,0, ST. A SPECIAL CLASS ; THE CHOICES ARE: C.ALPH= 0 ;ALPHABETIC C.NMBR= 2 ;NUMERIC C.SPCL= 4 ;SPECIAL CHARACTER CLASS: BYTES 10EQU!ST.REG SYMBOL <GH >,1, ST.EQU!ST.REG SYMBOL <RBA >,2, ST.EQU!ST.REG SYMBOL <RBAL >,2, ST.EQU!ST.REG SYMBOL <RB,C.SPCL ;0-7 BYTES 10,C.SPCL ;10-17 BYTES 10,C.SPCL ;20-27 BYTES 10,C.SPCL ;30-37 BYTES 4,C.SPCL ;40-43 BYTES 1,C.ALPHAH >,3, ST.EQU!ST.REG SYMBOL <RSRC >,4, ST.EQU!ST.REG SYMBOL <RSRCL >,4, ST.EQU!ST.REG SYMBOL <RSRCH >,5, ST.EQU!ST.REG  ;44 (DOLLAR) BYTES 3,C.SPCL ;45-47 BYTES 6,C.SPCL ;50-55 BYTES 1,C.ALPH ;56 (DOT) BYTES 1,C.SPCL BYTES 10,C.NMBR ;60- >,CL.BFL,70400 OP <SI >,CL.BFL,70400 OP <SLB >,CL.REG,106000 OP <SLBC >,CL.REG,104000 OP <SLBCF >,CL.REG,104400 O SYMBOL <RDST >,6, ST.EQU!ST.REG SYMBOL <RDSTL >,6, ST.EQU!ST.REG SYMBOL <RDSTH >,7, ST.EQU!ST.REG SYMBOL <RIR >,10, SP <SLBF >,CL.REG,106400 OP <SLW >,CL.REG,107000 OP <SLWC >,CL.REG,105000 OP <SLWCF >,CL.REG,105400 OP <SLWF >,CL.REG,10T.EQU!ST.REG SYMBOL <RIRL >,10, ST.EQU!ST.REG SYMBOL <RIRH >,11, ST.EQU!ST.REG SYMBOL <RPSW >,12, ST.EQU!ST.REG SYMBO7400 OP <SRB >,CL.REG,156000 OP <SRBC >,CL.REG,154000 OP <SRBCF >,CL.REG,154400 OP <SRBF >,CL.REG,156400 OP <SRW >,CLL <RPSWL >,12, ST.EQU!ST.REG SYMBOL <RPSWH >,13, ST.EQU!ST.REG SYMBOL <SP >,14, ST.EQU!ST.REG SYMBOL <SPL >,14, ST.EQ.REG,157000 OP <SRWC >,CL.REG,155000 OP <SRWCF >,CL.REG,155400 OP <SRWF >,CL.REG,157400 OP <SW >,CL.REG,131000 OP <SWCU!ST.REG SYMBOL <SPH >,15, ST.EQU!ST.REG SYMBOL <PC >,16, ST.EQU!ST.REG SYMBOL <PCL >,16, ST.EQU!ST.REG SYMBOL <P >,CL.REG,135000 OP <SWCF >,CL.REG,135400 OP <SWF >,CL.REG,131400 OP <TB >,CL.REG,142000 OP <TBF >,CL.REG,142400 CH >,17, ST.EQU!ST.REG SYMBOL <I4 >,1, ST.EQU SYMBOL <I5 >,2, ST.EQU SYMBOL <I6 >,4, ST.EQU SYMBOL <C >,1���  .TITLE WRITEABLE CONTROL STORE LOADER FOR LSI-11 .SBTTL WCS LOADER DOCUMENTATION SECTION. ;THIS PROGRAM USES THE GENERAL MODRT:: CALL CKMODE ;DETERMINE PAGING MODE OF WCS MOV #SWTBL,R0 MOV #MAXOPT,R1 ;CLEAR THE SWITCH TABLE 10$: CLR (R0)+ SE OF THE CSI IN A PROGRAM ;TO COPY UP TO 6 OBJECT PROGRAMS INTO WRITEABLE CONTROL STORE ;INPUT IS FROM THE CONSOLE TERMINAL. OB R1,10$ MOV #3,CHANNR BIT #400,@#JSW ;CHAIN BIT SET? BEQ 15$ .PRINT #PROMPT ;NOTIFY THE USER ;GET STRING FROM TERMIN; ;An object module consists of variable length rcords of information ;that describe the contents of the module. Six record (AL 15$: BIC #400,@#JSW MOV SP,SPSAV .CSIGEN #DSPACE,#DEXT,, MOV R0,BUFF ;R0 HAS FIRST FREE LOCATION MOV R0,BUFEND ADor block) types ;are included in the object language. These records guide the WCS ;loader in transfering the WCS object moduD #512.,BUFEND MOV (SP)+,R1 BEQ 50$ ;NO OPTIONS IF ZERO CMP R1,#MAXOPT ;ARE THERE TOO MANY OPTIONS? BLOS 20$ MOV #OPTles into writeable control ;store. ;The six record types are: ; Type 1- Declare Global Symbol Directory (GSD) ; Type 2 - EndERR,R0 JMP EXIT 20$: MOV (SP)+,R0 MOV #SWLIST,R2 30$: CMPB R0,(R2) BEQ 40$ CMP (R2)+,(R2)+ BNE 30$ MOV #ILLOPT,R of Global Symbol Directory ; Type 3 - Text Information (TXT) ; Type 4 - Relocation Directory (RLD) ; Type 5 - Internal Symbo0 JMP EXITPR 40$: MOV R0,@2(R2) SOB R1,20$ 50$: TST NSWICH ;CHAIN TO MODT? BEQ 52$ BIS #400,@#JSW ;SET UP TO CHAIN l Directory (ISD) ; Type 6 - End of Module ; EACH RECORD TYPE CONSISTS OF 6 BYTES OF PREFIX INFO AS ; FOLLOWS... ; A BYTE CTO MODT 52$: TST USWICH ;IS THIS AN UNLOAD? BEQ 55$ JMP UNLOAD 55$: TST RSWICH ;INHIBIT ZEROING WCS? BNE 60$ ;YES ONTAINING THE VALUE 1 ; A BYTE CONTAINING THE VALUE 0. ; LOW ORDER BYTE OF RECORD SIZE(IN BYTES) ; HIGH ORDER BYTE OF RECORD  CALL CLRWCS MOV SP,RSWICH ;TO PREVENT SUBSEQUENT CLEARS. 60$: MOV SPSAV,SP ;RESTORE STACK POINTER .PAGE .SBTTL MAIN COSIZE ; LOW ORDER BYTE OF RECORD TYPE ; HIGH ORDER BYTE OF RECORD TYPE ; FOLLOWING THE PREFIX INFO ARE 0 TO "RECORD SIZE"-6 DE SECTION NXTFIL: MOV BUFEND,R4 ;TO FORCE GETBYT TO READ A RECORD ON ITS ;FIRST ENTRY. CLR INBLK ;INPUT BLOCK # MO; BYTES OF DATA. ; THE DATA BYTES ARE FOLLOWED BY A ONE BYTE CHECKSUM. ; THE BYTE SIZE COUNTS ALL THE DATA CONTAINED IN ; EACV #LIST,R5 ;EMT ARGUMENT LIST NXTREC: CLR CKSUM MOV #TABLE,R1 ;FETCH THE PREFIX BYTES. MOV #TABSIZ,R2 10$: JSR PC,GETBYTH RECORD AS WELL AS THE 6 BYTES OF PREFIX INFORMATION ; THE CHECKSUM BYTE IS NOT INCLUDED IN THE BYTE COUNT. .PAGE .SBTTL I MOVB R3,(R1)+ SOB R2,10$ CMP RECTYP,#ENDMDL ;IS THIS THE END OF OBJECT MODULE? BNE 20$ .CLOSE CHANNR INC CHANNR B67 (0-7) BYTES 2,C.NMBR ;70-71 (8-9) BYTES 6,C.SPCL ;72-77 BYTES 1,C.SPCL ;100 BYTES 26.,C.ALPH ;101-132 (A-Z) BYTES 4NITIALIZATION SECTION .MCALL .CSIGEN,.READW,.PRINT,.EXIT,.CLOSE,.SRESET,.CHAIN .MCALL .WRITW ; R4 WILL ALWAYS CONTAIN THE 5,C.SPCL ;133-177 .END MICASM ���������������������������������������������������������������������������������������������RUNNING POINTER TO THE CURRENT ;CHARACTER IN THE PHYSICAL BLOCK ERRWD=52 JSW=44 .MACRO SOB RN,X DEC RN BNE X .ENDM STA���  ;SAVE CURRENT CONTENTS OF NEXT LOC 30$: SOB R2,20$ RETURN .PAGE ERRCK: TST TSWICH ;IGNORE TRANSLATION CONFLICTS? BNE 2 DISC FILE ; IN A FORM THAT LOOKS SUFFICIENTLY LIKE AN OBJECT MODULE SO THAT ; THE LOADER CAN ALSO LOAD IT. IT IS NOT A REAL OR NXTFIL 20$: CMP #1,RT11ID BEQ 25$ CALL FYLMSG MOV #NVALID,R0 JMP EXITPR 25$: MOV NUMBYT,R2 SUB #TABSIZ,R2 ;ADJUST 5$ TST WCMODE ;TEST FOR BEAR TRAP BGE 25$ ;ONLY IF A MODE 1 MACHINE BIT #1000,@#WCSCSR ;IF SECOND PAGE NO BNE 25$ ;BABYTE COUNT TO REFLECT ;CURRENT POSITION IN RECORD. BEQ SKPCKS ;POSSIBLE FOR RECORD TO HAVE ;NO DATA. CMP RECTYP,#RE TRAPS. MOV @#WCSCSR,R1 MOV R1,R0 BIC #177007,R1 ASR R1 ASR R1 ASR R1 BIC #177770,R0 BITB BARTRP(R1),BYTMSK(R0TEXT ;IS THIS LOADABLE DATA BNE 30$ JSR PC,GETBYT DEC R2 MOVB R3,LODADR JSR PC,GETBYT DEC R2 MOVB R3,LODADR+1 CA) BEQ 25$ CALL FYLMSG CALL CNVADR MOV #DNGLOC,R0 CALL APNDNR .PRINT 25$: TST OSWICH ;SHOULD OVERLAPS BE IGNORED? LL LODTXT ;PUT THE STUFF INTO WCS CALL GETBYT ;GET THE CHECKSUM BYTE TSTB CKSUM BEQ NXTREC CALL FYLMSG ;IDENTIFY THE  BNE 27$ TST DATSAV ;HAVE JUST LOADED 4 BYTES BEQ 27$ ;WAS PREVIOUS CONTENTS "JMP 0"? TST @#WCSDAT ;IS NEW CONTENTS "JMPERRANT FILE. MOV #CKSERR,R0 JMP EXITPR 30$: JSR PC,GETBYT ;IGNORE ALL OTHER RECORDS SOB R2,30$ SKPCKS: JSR PC,GETBYT ;SK 0" BEQ 27$ CALL FYLMSG ;PRINT ERRANT FILE NR. CALL CNVADR MOV #OVRLOD,R0 CALL APNDNR ;APPEND USER ADDRES TO MSG. IP THE CHECK SUM BYTE BR NXTREC .PAGE .SBTTL LOADER LODTXT: CLR @#WCSCSR ;DISABLE WCS TO ALLOW LOADING. MOV LODADR,R5.PRINT 27$: RETURN .PAGE GETBYT: CMP R4,BUFEND BLO 100$ MOV R1,-(SP) MOV R2,-(SP) .READW #LIST,CHANNR,BUFF,#256. MOV R5,-(SP) ;SAVE LOW ORDER 3 BITS SINCE ADDR BIC #177774,(SP) ;MAY START ANYWHERE AMONG ;THE FOUR BYTES IN WCSDAT ,INBLK ;READ NEXT BLOCK. INC INBLK MOV (SP)+,R2 MOV (SP)+,R1 MOV BUFF,R4 BCS 150$ 100$: MOVB (R4)+,R3 ADD R3,CKSUSUB #1000,R5 ASR R5 ASR R5 MOV R5,USRADR MOV R5,-(SP) BIC #177000,(SP) ;CLEAR ALL BUT PAGE OFFSET BIC #777,R5 ;CLEAM RTS PC 150$: TSTB @#ERRWD ;EOF ERROR? BEQ EOF CMPB #2,@#ERRWD ;IS THERE AN OPEN CHANNEL? BNE 200$ ;IF OPEN CHANNER OFFSET INTO PAGE CMP R5,PG0MSK ;IS USER ADDRESS IN PAGE 0 RANGE? BEQ 10$ BIS #1000,(SP) ;NOW ASSUME PAGE 1 CMP R5,PG1ML THEN ERROR. TST DSWICH BNE 15$ MOV #100000,@#WCSCSR ;START ENABLING WCS. MOV #10000,@#WCSCSR ;ENABLE WCS 15$: BR EXSK ;IS IT PAGE 1 BEQ 10$ CALL FYLMSG ;PRINT ERRANT FILE NR. MOV #ADDERR,R0 MOV USRADR,R1 CALL APNDNR JMP EXITPR 10IT 200$: MOV #INERR,R0 BR EXITPR EOF: MOV #UNXEOF,R0 EXITPR: .PRINT EXIT: .SRESET ;RELEASE HANDLER FROM MEMORY BI$: MOV (SP)+,@#WCSCSR MOV #WCSDAT,R5 TST (SP) BNE 15$ MOV (R5),DATSAV 15$: ADD (SP)+,R5 20$: JSR PC,GETBYT MOVB R3,(T #400,@#JSW ;IF CHAIN BIT SET,CHAIN TO MODT. BEQ 10$ MOV #500,R0 MOV #MODT,R1 MOV (R1)+,(R0)+ MOV (R1)+,(R0)+ MOV (R5)+ CMP R5,#WCSDAT+2+1 BLOS 30$ CALL ERRCK ;CHECK FOR ERROR CONDITIONS INC @#WCSCSR MOV #WCSDAT,R5 MOV (R5),DATSAVR1)+,(R0)+ MOV (R1)+,(R0)+ .CHAIN 10$: .EXIT .PAGE .SBTTL UNLOADER ; THIS ROUTINE WRITES WRITABLE CONTROL STORE TO A��� +,(R1)+ SOB R2,10$ RETURN .PAGE APNDNR: MOV R0,-(SP) 10$: TSTB (R0)+ ;SEARCH FOR ASCIZ BNE 10$ DEC R0 20$: MOV R1,T ;R0 BY 1 MOVB DW1+2,@#WCSDAT+2 MOV #100000,@#WCSCSR MOV #10000,@#WCSCSR MOV @#10,LOC10 ;SAVE TRAP VECTOR 10 MOV #MODR5 BIC #177770,R5 ;MASK OFF ALL BUT LOW DIGIG ADD #60,R5 ;ADD MAKE IT AN ASCII NR. MOVB R5,-(R0) ASR R1 ASR R1 ASR 4,@#10 ;SET UP TO IDENTIFY MODE 4 MACHINE. CLR R0 ;ASSUME MODE 4 076000 MOV LOC10,@#10 ;RESTORE TRAP VECTOR 10 CLR PG0MR1 BNE 20$ MOV (SP)+,R0 RETURN CNVADR: MOV @#WCSCSR,R1 MOV PG0MSK,-(SP) BIT #1000,R1 BEQ 10$ MOV PG1MSK,(SP) 10$SK ;ASSUME MODE 4 ADDRESSING MOV #1000,PG1MSK MOV R0,WCMODE BEQ 20$ MOV #2000,PG0MSK ;ASSUME MODE 1 ADDRESSING MOV #3: BIS (SP)+,R1 RETURN FYLMSG: MOV CHANNR,R1 SUB #2,R1 MOV #FYLTXT,R0 CALL APNDNR .PRINT RETURN CLRWCS: CLR @#WCS000,PG1MSK TST R0 BMI 20$ BIS #1000,PG0MSK ;NO! PAGE 2 ADDRESSING BIS #10000,PG1MSK 20$: CLR @#WCSCSR ;DISABLE WCS AGAIBJECT MODULE ; BUT DOES CONTAIN THE TWO ESSENTIAL RECORD TYPES, NAMELY ; TEXT RECORDS, AND AN END OF MODULE RECORD. UNLOAD: CCSR CLR @#WCSCSR ;DISABLE WCS TO ALLOW LOADING. 10$: CLR @#WCSDAT CLR @#WCSDAT+2 MOVB #200,@#WCSDAT+2 CMP @#WCSCSR,#17LR @#WCSCSR CLR @#WCSCSR ;MUST BE DONE TWICE! CLR CKSUM ;INITIALIZE CHECK SUM MOV BUFF,R1 CALL SETHDR MOV #LOC0K,R3 77 BHIS 20$ INC @#WCSCSR BR 10$ 20$: RTS PC .PAGE .SBTTL DETERMINE ADDRESSING MODE OF WCS ; SUBROUTINE TO DETERMINE  TST WCMODE BEQ 10$ MOV #LOC2K,R3 ;ASSUME MODE 1 ADDRESSING. TST WCMODE BMI 10$ MOV #LOC3K,R3 ;NO MODE 2 ADDRESSING. WHETHER MACHINE IS MODE 1 ; MODE 2, OR MODE 4. ; WCS PAGE 0 WILL RECEIVE A ROUTINE TO INCREMENT R0 BY 1 ; WCS PAGE 1 WILL R10$: MOV #2,R2 CALL PUTBYT ;INSERT PAGE 0 ADDRESS INTO TEXT CALL GETPAG ;COPY A WCS PAGE INTO BUFFER CLR CKSUM ;INITIALECEIVE A ROUTINE TO DECREMENT R0 BY 1. ; PAGE 0 LOC 1 WILL CONTA;IN A JMP TO 3001. PAGE 1 LOC 1 ; WILL CONTAIN A JMP TO 3001.IZE CHECK SUM CALL SETHDR MOV #LOC1K,R3 TST WCMODE BEQ 20$ MOV #LOC3K,R3 TST WCMODE BMI 20$ MOV #LOC13K,R3 20$: IF MODE 1(OR 3) THE PAGE 1 ; ROUTINE (DECR BY 1) WILL BE EXECUTED. IF MODE 2 THE PAGE 0 ; ROUTINE (INCR BY 1) WILL BE EXECU MOV #2,R2 CALL PUTBYT ;INSERT PAGE 1 ADDRESS INTO TEXT CALL GETPAG ;PUT WCS PAGE 1 INTO BUFFER MOV #EOMREC,R3 MOV #6TED. .MACRO SAVWCS A,B,C JSR R5,SAVWCS .WORD A .WORD B .WORD C .ENDM .MACRO RSTWCS A,B,C JSR R5,RSTWCS .WORD A,R2 CALL PUTBYT .WRITW #LIST,#0,BUFF,#2060.,#0 .CLOSE #0 JMP EXIT SETHDR: MOV #HDRTXT,R3 ;A 6 BYTE RECORD MOV #6,R2  .WORD B .WORD C .ENDM CKMODE: MOV R0,-(SP) MOV R1,-(SP) MOV R2,-(SP) MOV @#4,LOC4 ;SAVE TRAP VECTOR 4 MOV #WCSER;WITH RT11ID,RECTYPE CALL PUTBYT ;AND SIZE RETURN GETPAG: MOV #512.,R0 10$: MOV #WCSDAT,R3 MOV #4,R2 CALL PUTBYT R,@#4 CLR @#WCSCSR ;DISABLE WCS TO ALLOW ACCESS. SAVWCS 1,PG0SAV,4 ;SAVE PAGE 0 LOC 1-4 RSTWCS 1,JMP302,4 ;PUT IN ROUTINE INC @#WCSCSR SOB R0,10$ NEG CKSUM MOVB CKSUM,(R1)+ RETURN PUTBYT: 10$: MOVB (R3)+,-(SP) ADD (SP),CKSUM MOVB (SP)TO INC R0 BY 1 SAVWCS 1001,PG1SAV,4 ;SAVE PAGE 1 LOC 1-4 RSTWCS 1001,JMP302,3 ;PUT IN ROUTINE TO DECREMENT MOV DW1,@#WCSDA��� 002,,0 .WORD 60010,0 ;LL 0,RIRL .WORD 72410,2 ;LGL RIRL,,RSVC .WORD 111000,0 ;ICW1 G,G DW1: .WORD 137000,0 ;DW1 G,G WCK: .WORD 15000 ;PAGE 1 MODE 1 OR PAGE 0 MODE 2 LOC13K: .WORD 55000 ;PAGE 1 ADDRESSING MODE 2 EOMREC: .WORD 1,6,6 CKSUM: .WOMODE: .WORD 0 .PAGE .SBTTL DATA SECTION DATSAV: .WORD 0 ;PREVIOUS CONTENTS OF CURRENT LOCATION BYTMSK: .BYTE 1,2,4,8.,16.,RD 0 SPSAV: .WORD 0 SWLIST: 'D,DSWICH 'N,NSWICH 'O,OSWICH 'R,RSWICH 'T,TSWICH 'U,USWICH SWTBL: DSWICH: .WORD 0 ;I32.,64.,128. ; THE FOLLOWING BIT MAP CONTAINS A 1 FOR EACH ADDRESS IN THE ;RANGE 2000-2777 WHICH INVOKES A TRANSLATION IF NOT F NON ZERO DISABLE ON EXIT NSWICH: .WORD 0 ;IF NON ZERO CHAIN TO MODT OSWICH: .WORD 0 ;IF NON ZERO IGNORE MEMORY OVERLAP RSA JMP AND ;MAY CAUSE THE USER PROGRAM TO WANDER OFF INTO TOHE BOONDOCKS. ;TH E LOADER WILL WARN THE USER IF ANYTHING OTHER THAWICH: .WORD 0 ;IF NON ZERO RETAIN CURRENT ;WCS CONTENTS TSWICH: .WORD 0 ;IF NON ZERO IGNORE TRANSLATION ;ARRAY CONFN AN UNCONDITION ;JUMP IS LOADED INTO THESE LOCATIONS. BARTRP: .BYTE 0 ;0 .BYTE 0 ;10 .BYTE 0 ;20 .BYTE 10 ;30 .BYTE 0LICTS. USWICH: .WORD 0 ;IF NON ZERO UNLOAD WCS TO SPECIFIED FILE MAXOPT =.-SWTBL/2 WCSCSR =177540 ;STATUS AND ADDR REG. FO ;40 .BYTE 0 ;50 .BYTE 0 ;60 .BYTE 10 ;70 .BYTE 0 ;100 .BYTE 0 ;110 .BYTE 10 ;120 .BYTE 0 ;130 .BYTE 0 ;140 .BR WCS WCSDAT =177542 ;RECEIVES LOW ORDER 16 BITS OF WCS WORD. ;WCSDAT+2 RECEIVES HIGH ;ORDER 8 BITS OF WCS WORD. YTE 0 ;150 .BYTE 0 ;160 .BYTE 4 ;170 .BYTE 0 ;200 .BYTE 0 ;210 .BYTE 1 ;220 .BYTE 0 ;230 .BYTE 0 ;240 .BYTE 20 ; CHANNR: .WORD 3 DEXT: .RAD50 "OBJ" ;DEFAULT INPUT FILE EXTENSION .RAD50 "OBJ" ;DEFAULT OUTPUT FILE EXTENSION .WORD 0,0 N RSTWCS 1,PG0SAV,4 ;RESTORE ORIGINAL PAGE 0 RSTWCS 1001,PG1SAV,4 ;RESTORE ORIGINAL PAGE 1. MOV (SP)+,R2 MOV (SP)+,R1 250 .BYTE 0 ;260 .BYTE 20 ;270 .BYTE 0 ;300 .BYTE 0 ;310 .BYTE 1 ;320 .BYTE 0 ;330 .BYTE 0 ;340 .BYTE 0 ;350 .MOV (SP)+,R0 RETURN RSTWCS: MOV (R5)+,@#WCSCSR MOV (R5)+,R1 MOV (R5)+,R2 10$: MOV (R1)+,@#WCSDAT MOV (R1)+,@#WCSDAT+2 BYTE 0 ;360 .BYTE 0 ;370 .BYTE 100 ;400 .BYTE 0 ;410 .BYTE 0 ;420 .BYTE 0 ;430 .BYTE 200 ;440 .BYTE 0 ;450 .BYTE INC @#WCSCSR SOB R2,10$ RTS R5 SAVWCS: MOV (R5)+,@#WCSCSR MOV (R5)+,R1 MOV (R5)+,R2 10$: MOV @#WCSDAT,(R1)+ MOV @# 0 ;460 .BYTE 0 ;470 .BYTE 1 ;500 .BYTE 100 ;510 .BYTE 0 ;520 .BYTE 0 ;530 .BYTE 1 ;540 .BYTE 17 ;550 .BYTE 0 ;5WCSDAT+2,(R1)+ INC @#WCSCSR SOB R2,10$ RTS R5 MOD4: MOV LOC10,@#10 RTI WCSERR: MOV LOC4,@#4 ;RESTORE TRAP VECTOR 10 60 .BYTE 2 ;570 .BYTE 20 ;600 .BYTE 20 ;610 .BYTE 4 ;620 .BYTE 1 ;630 .BYTE 20 ;640 .BYTE 20 ;650 .BYTE 0 ;660  MOV #NONXWC,R0 ;MACHINE DOES NOT HAVE WCS. JMP EXITPR LOC4: .WORD 0 ;SAVE LOCATION FOR TRAP VECTOR 4. LOC10: .WORD 10 ;SAVE .BYTE 0 ;670 .BYTE 1 ;700 .BYTE 221 ;710 .BYTE 0 ;720 .BYTE 0 ;730 .BYTE 1 ;740 .BYTE 21 ;750 .BYTE 0 ;760 .BYT LOCATION FOR TRAP VECTOR 10. PG0MSK: .WORD 0 PG1MSK: .WORD 0 PG0SAV: .BLKW 8. PG1SAV: .BLKW 8. JMP302: .WORD 3002,0 ;JMP 3E 0 ;770 .EVEN LOC0K: .WORD 1000 ;PAGE 0 MODE 4 LOC1K: .WORD 5000 ;PAGE 1 MODE 4 LOC2K: .WORD 11000 ;PAGE 0 MODE 1 LOC3��� ABLE+4 TEXT =3 ;VALUE FOR TEXT ID ENDMDL =6 ;VALUE FOR END OF MODULE ID LODADR: .WORD 0 ;LOAD ADDRESS WHICH MACRO-11 UIPMENT CORPORATION ; MAYNARD, MASSACHUSETTS 01754 ; ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ; ON A SINGLE ;BELIEVES USRADR: .WORD 0 ;ADDRESS ON USER'S LISTING INBLK: .WORD 0 ;RELATIVE BLOCK TO READ/WRITE LIST: .BLKW 5 ;EMT ARG COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH ; THE INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, ; OR ANY OTHER COPIUMENT LIST HDRTXT: .WORD 1 ;THREE WORDS TO DESCRIBE .WORD 2056. ;OUTPUT OBJECT MODULES .WORD 3 ;IN A LOADER COMPATABLE WES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE MADE ; AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH SYSTEM AND TO ; ONE WAY. .PAGE .SBTTL ERROR MESSAGES .EVEN NONXWC: .ASCIZ /NO WRITEABLE CONTROL STORE IN MACHINE/ FYLTXT: .ASCIZ / FILE NHO AGREES TO THESE LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE ; SOFTWARE SHALL AT ALL TIMES REMAIN IN DEC. ; ; THE INFORMAR. / .EVEN OVRLOD: .ASCIZ /OVERLOADING NON CLEARED LOCATION / .EVEN DNGLOC: .ASCIZ /CONFLICT WITH TRANSLATION ARRAY TION IN THIS SOFTWARE IS SUBJECT TO ; CHANGE WITHOUT NOTICE AND SHOULD NOT BE CONSTRUED ; AS A COMMITMENT BY DIGITAL EQUIPMENT / .EVEN CKSERR: .ASCIZ /CHECK SUM ERR/ .EVEN OPTERR: .ASCIZ /TOO MANY OPTIONS/ .EVEN ILLOPT: .ASCIZ "UNRECOGNIZED S CORPORATION. ; ; DEC ASSUMES NO RESPONSIBILITY FOR THE USE ; OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT ; WHICH IS NOT SUPWITCH" .EVEN INERR: .ASCIZ /INPUT ERROR/ .EVEN UNXEOF: .ASCIZ /UNEXPECTED EOF/ .EVEN NVALID: .ASCIZ /INVALID DATA/ .EPLIED BY DEC. ; .SBTTL EQUATES .MCALL .EXIT . = .+144+26+30+10+50 ;RESERVES SPACE FOR STACK R0 = %0 ; REGISTER R1 VEN ADDERR: .ASCIZ /ADDRESSING MODE CONFLICT / .EVEN MODT: .RAD50 /SY MODT SAV/ .EVEN PROMPT: .ASCIZ / WCSLOD/ .E= %1 ; NAMING R2 = %2 ; CONVENTIONS R3 = %3 R4 = %4 R5 = %5 SP = %6 PC = %7 ST = 177776 ;STATUS REGISTER BKP = 16 VEN DSPACE =. .END START ��������������������������������������������������������������������������������������������������� ;NUMBER OF BREAKPOINTS-1 MULT. BY 2 RLR = 16 ;NO. OF RELOC. REGISTERS-1, TIMES 2 TVEC = 14 ;TRT VECTOR LOCATION STM = 340 � ;PRIORITY MASK - STATUS REGISTER TBT = 20 ;T-BIT MASK - STATUS REGISTER TRT = 000003 ;TRT INSTRUCTION RDB = 177562 ;;NO OTHER OUTPUT FILES. BUFF: .WORD 0 ;I/O BUFFER START BUFEND: .WORD 0 ;CONTAINS ADDRESS OF END OF I/O ;BUFFER+1 TABL�E: .BLKW 3 ;THREE PREFIX WORDS FOR EACH ;OBJECT MODULE LOGICAL RECORD TABSIZ =.-TABLE RT11ID =TABLE ;16 BITS WITH A VA .TITLE MODT V01.01 22-MAR-1977;IF YOU CHANGE THE VERSION #, ;DON'T FORGET TO CHANGE AT O.ID! ; RT-11 MODT (ADAPTATILUE OF 1. NUMBYT =TABLE+2 ;SPECIFIES TOTAL NR OF BYTES IN ;EACH LOGICAL RECORD,EXCLUDING ;CHECK SUM BYTE. RECTYP =TON OF ODT-11R) ; DEC-11-ORTSB-A ; DECEMBER 7,1972 ; R. BEAN,JD,DW ; ; COPYRIGHT (C) 1974,1975,1977 ; ; DIGITAL EQ��� R DATA BUFFER RCSR = 177560 ;R C/SR TDB = 177566 ;T DATA BUFFER TCSR = 177564 ;T C/SR MTPS = 106400 ;MOVE TO PS FOR LSI MFP JSR 0,SVR ;SAVE REGISTERS JSR 5,REM ;REMOVE ALL BREAKPOINTS JSR 5,CLRR ; CLEAR RELOCATION REGISTERS MOVB PRI,R4 ;GET S = 106700 ;MOVE FROM PS FOR LSI WCSADR = 177540 ;WCS CSR AND RAM ADDRESS WCSDAT = 177542 ;WCS I/O FOR LOW ORDER WORD ; BMODT PRIORITY RORB R4 RORB R4 ;SHIFT RORB R4 ; INTO RORB R4 ; POSITION MOVB R4,-(SP) ;STORE IN STATUS JSR PC,WSTW IS THE CURRENTLY OPENED LOCATION MODE ; VALUES ARE: CLOSED= 0 BYTE= 1 WORD= 2 WCS= 3 .SBTTL INITIALIZE MODT ; USE RST1: CLRB S ;DISABLE SINGLE INSTRUCTION FOR NOW MOVB #-1,P ;DISALLOW PROCEED MOV #STM,TVEC+2 ;STATUS WORD TO TRT VECTOR MODT FOR A NORMAL ENTRY ; USE MODT+2 TO RESTART ODT - WIPING OUT ALL BREAKPOINTS ; USE MODT+4 TO RE-ENTER (I.E. - FAKE A BR+2 MOV #BRK,TVEC ;PC TO TRT VECTOR ; THIS NEXT INSTRUCTION RAISES THE "Z" FLAG BECAUSE ; ITS PURPOSE IN LIFE IS TO BEHAVE DIEAKPOINT) MODT:: BR STRT ;NORMAL ENTRY BR RST ;RESTART JSR PC,RRST ;RE-ENTER -- SAVE STATUS MOV TVEC+2,-(SP) ;SET UFFERENTLY ON THE /20 ; AND THE /45 SO WE CAN CHANGE THE RTT WHICH ALSO ; BEHAVES DIFFERENTLY ON THE /20 AND /45. JMP (PC)+ P LOCAL STATUS JSR PC,WST MOV PC,-(SP) ;FAKE THE PC MOV (SP)+,UPC MOVB #-1,P ;DISALLOW PROCEED CLRB S JMP BK1 ST ;PROCESSOR DEPENDENT INSTRUCTION BR 1$ ;THIS PROCESSOR IS A 40 OR 45 MOV #RTI,RTIT ;CHANGE THE RTT TO AN RTI IF THEIS IS 1RT: NOP ;TO SAVE STATUS NOP ;JSR PC,RRST FOR PDP11 ;MFPS,UST FOR LSI MOV @#4,-(SP) ;SAVE RT INTERRUPT VECTOR MOV 1/20 OR 05 1$: JMP RALL ;CLEAR BRK PT TABLES ; CTLC ; ^C PROCESSING. RETURN TO KEYBOARD MONITOR CTLC: MOV USP,SP ;RESTORE#9$,@#4 ;SET MODT VECTOR TST @#ST ;LSI WILL TRAP TO 4 ;PDP11 WILL CONTINUE BR 1$ ;DON'T CHANGE ACCESS TO PS 9$: M USER STACK JSR R5,PRINT .WORD CCST ;TYPE A ^C JSR R5,RSTT ;DTW-RESTORE CONSOLE STATUS MOV SP,R0 ;WE WANT EXIT TO DO OV #MFPS+67,RRST ;CHANGE PS ACCESS IN TWO SUBROUTINES ;RRST AND WST ;STORE MFPS UST IN RRST MOV #UST-RRST-4,RRST+2 A SOFT RESET .EXIT ;EXIT TO KEYBOARD MONITOR .SBTTL ASCII TEXT TYPEOUT (A) ; ALF REXP;NA TYPE N CHARACTERS STARTING AT MOV #NOP,RRST+4 MOV #MTPS+66,WST ;STORE MTPS 2(SP) MOV #240,WST+4 MOV #1$,(SP) ;REPLACE PC ON STACK WITH CONTINUE ;L REXP; ; THEN-- ; ACCEPT A STRING OF ASCII TEXT. STORE IT IN ; SUCCESIVE BYTES STARTING AT THE INDICATED ; LOCATION. TEXT TEOCATION.PC,SP WERE PUT THERE BY ;THE TIMEOUT TRAP TO 4 RTI ;RESTORE PS AND CONTINUE AT 1$ 1$: MOV (SP)+,@#4 ;RESTORRMINATED BY COUNT, N. ; OR CR OR LF. MODT PRINTS THE ADDR OF ; THE NEXT AVAILABLE LOCATION IN CORE ALF: TST R3 ;WAS REXP TE CONTENTS OF 4 ; RUN AT CURRENT STATUS JSR 5,SVTT ;SAVE TTY STATUS JSR 0,SVR ;SAVE REGISTERS (MAINLY SP) MOV #UR0,SP YPED? BEQ 6$ ;BR IF NOT TSTB SMFD ;WAS ; TYPED? BEQ 6$ ;BR IF NOT, ERROR TST R2 ;IF N NOT TYPED, ASSUME 1 BNE 1$ ;SET UP STACK JSR R5,PRINT ;PRINT ID MESSAGE .WORD HEAD CALL CHKMOD ;DETERMINE WHAT WCS ADR MODE IS HERE BR RST1 RST: INC R4 1$: MOV R4,-(SP) ;SAVE COUNT ;SET UP TO TYPE N CHAR. MOV R5,R4 ;ADDR OF 1ST BYTE IN R4 MOV R5,R3 ;ADDR OF 1ST B��� TART ADDRESS 1$: CMPB R0,(R4)+ ;IS THIS THE CORRECT CHARACTER? BEQ 3$ ;JUMP IF YES CMP #TL+LG,R4 ;IS THE SEARCH DONE? BH(SP) BIC #^C<74>,@SP ;ISOLATE TOGGLE BITS MOV CAD,R0 CMP (SP)+,#34 BNE 1$ ;IF NOT TOGGLED COM R0 1$: BIC #10000,R2 ;I 1$ ;BRANCH IF NOT BIC #177770,R0 ;MASK OFF OCTAL MOV R0,R4 2$: ASL R4 ADD #UR0,R4 ;GENERATE ADDRESS INC R2 ;SET FOUREMOVE PAGE BITS FROM DESTINATION BIC #^C<10000>,R0 BIS R0,R2 ;MODIFY ADDRESS FOR TOGGLED MODE BR PCS ORRB: JSR 5,TCLSND FLAG JMP SCAN ;GO FIND NEXT CHARACTER 3$: SUB #TL-7,R4 ;GO FIND NEXT CHARACTER BR 2$ .SBTTL CLOSE WORD ROUTINES  ;TEST AND CLOSE MOVB R2,R2 ;SIGN EXTEND OFFSET INC R2 ASL R2 ;MAKE IT WORD OFFSET ADD CAD,R2 ;ADD IN PC BR PCS YTE IN R3 ADD (SP),R3 ;ADD N TO R3 DEC R3 ;SUB. 1 TO GET LAST ADDR MOV R3,XXX ;SAVE LAST ADDR. JSR 5,TYPE ;TYPE THE CH ;RETYPE OPENED WORD IN ANSCII (CONVERTED FROM MOD40) MOD: MOV @CAD,R0 ;CALL MOD40 UNPACK MOV #ALF1,R1 JSR PC,UNPA00 ;ASARACTERS JSR 5,CRLF ;TYPE CR/LF MOV (SP)+,R4 ;RECALL N TO R4 ;NOW ACCEPT INPUT STRING INCB SCRN ;ALLOW SPACES VIA GET CII CHARS GO INTO ALF1,2,3 INCB SCRN ;SET FLAG TO ALLOW SPACES JSR R5,PRINT .WORD ALF0 ;TYPE '=AAA ' JSR R5,GET ;USERJSR 5,GET ;LOOK AT FIRST CH. CMPB R0,#015 ;IS IT A CARR.RET? BEQ 5$ ;IF YES, RETURN TO COMM. DEC. CMPB R0,#012 ;CHK FO MUST NOW TYPE: CMPB R0,#' ; IF CHAR IS < ' ' BLT 1$ ; PREPARE TO ENTER CMD DECODER CMPB R0,#'^ ;UPARROW MEANS REOPEN R LF BNE 3$ ;IF NOT, ACCEPT N CHARACTERS CLRB SCRN ;MAKE SPACES INVISIABLE TO GET MOV XXX,R4 ;IF LINE FEED, OPEN NEXT PREVIOUS LOC BEQ 1$ MOVB R0,ALF1 ;OTHERWISE READ 3 CHAR JSR R5,GET ;2ND CH MOVB R0,ALF2 JSR R5,GET ;3RD CHAR CLRBAVAILABLE CH. INC R4 INC R2 MOV R4,R0 ;PRINT NEXT AVAIL BYTE MOV R2,-(SP) ;SAVE TO AVOID CLOBBERRING MOV R4,-(SP) ;BY SCRN ;RESTORE GET TO NORMAL MOVB R0,ALF3 MOV #ALF1,R1 ;INTO XXX JSR PC,PACK00 MOV R2,R4 ;RETURN RESULT IN R4 MOV S RORA JSR 5,RORA MOV (SP)+,R4 MOV (SP)+,R2 JSR R5,CTYPE ;TYPE A "\" .WORD '\ JMP BYT 2$: JSR 5,GET ;GET NXT CH. 3P,R2 ;SO IT LOOKS LIKE CMD DECOD DID IT JMP SCAN ;LET COMMAND DECODER DO THE REST 1$: CLRB SCRN CLR R4 ;MAKE IT APPEAR$: JSR 5,CU ;CHK FOR ^U MOVB R0,(R5)+ DEC R4 ;REDUCE COUNT. IS IT ZERO? BEQ 4$ ;BR IF YES BR 2$ 4$: MOV R5,-(SP)  CLR R2 ;AS IF NO NUMBERS WERE TYPED IN JMP SCN1 ;TYPED IN ; "BACKARROW" HANDLER - OPEN INDEXED ON THE PC (BACK ARROW;PRINT NXT AVAIL LOC: JSR 5,CRLF MOVB #WORD,BW ;FORCE WORD MODE MOV (SP)+,R0 ;THEN, ADDRESS JSR 5,RORA ; 5$: CLRB SCRN) ORPC: JSR 5,TCLS ;TEST WORD MODE AND CLOSE CMP BW,#WCS BNE 1$ ;IF NOT WCS LOCATION MOV BRADR,R2 ;USE BRANCH EFF ADDR ;MAKE SPACE INVISABLE TO GET JMP DCD ;RETURN TO COMMAND DECODER 6$: JMP ERR ; SPECIAL NAME HANDLER ; DEPENDS UPON FROM DISASM OF IT BR PCS 1$: ADD CAD,R2 INC R2 INC R2 ; NEW ADDRESS PCS: MOV R2,CAD ;UPDATE CAD JMP OP2A ;GO FINI THE EXPLICIT ORDER OF THE TWO TABLES TL AND UR0 REGT: JSR 5,GET ;SPECIAL NAME, GET ONE MORE CHARACTER MOV #TL,R4 ;TABLE SSH UP ORAB: JSR 5,TCLS ;TEST WORD MODE AND CLOSE CMP BW,#WCS BNE PCS ;DONT DO THIS STUFF FOR REGULAR MOV @#WCSDAT+2,-��� S, LOCATE RELOC. REGISTER MOV RELT(R4),BIAS ;PUT BIAS IN BIAS 1$: BR MIN1 ;GO BACK TO DECODER ;R PROCESSING. SEVERAL POSSPREPARE INPUT FOR CADV 8$: MOV R1,R0 ;TYPE THE VALUE (@CAD)-($NR) 9$: JSR 5,CADV BR DCD1 .SBTTL CONSTANT REGISTER CODE IBILITIES- ; A. ;R WAS TYPED. ZERO OUT ALL RELOCATION REGISTERS ; B. ;NR WAS TYPED. ZERO OUT $NR ; C. REXP;NR WAS TYPED.  ;C PROCESSING. ; A. REXP;C WAS TYPED- PRINT THE VALUE OF REXP AND STORE IN $C ; B. ;C WAS TYPED- SAME AS C., BUT REXP=0 BY SET $NR TO REXP ; D. NR WAS TYPED, WHILE A WORD WAS OPENED- ; COMPUTE (CAD)-($NR) AND PRINT IT REL: TSTB SMFD ;TEST IF  DEFAULT ; C. NO SEMICOLON HAS BEEN TYPED-REPLACE R4 WITH THE CONTENTS OF $C CNS: TSTB SMFD ;WAS A SEMICOLON TYPED? BNE 1$A SEMICOLON WAS TYPED BEQ 5$ ;NO CASE D TST R2 ;NOTHING OPENED, WAS N TYPED? BEQ 2$ ;N NOT TYPED 1$: BIC #177770,R4 ;G ;REXP TYPED PRIOR TO ; CASE A MOV CNST,R4 ;CASE C. REPLACE R4 WITH ($C) MOV #1,R2 BR SCAN ;RETURN TO SCAN MORE 1$UARANTEE THAT N<10 ASL R4 ;N TYPED, CASE B OR C. SET $NR. TST R3 ;IF REXP NOT TYPED,CLEAR TO -1 BEQ 3$ MOV R5,RELT(R4): MOV #WORD,BW JSR 5,CTYPE .WORD '= MOV R5,R0 JSR 5,CADV MOV R5,CNST ;AND STORE IN $C H1: BR DCD ;MINUS PROCESSIN ;IF REXP NOT TYPED, R5=0. CASE B. BR H1 ;EXIT TO DECODER 2$: TST R3 ;IF REXP TYPED, CASE B OR C WITH N=0 BEQ 4$ ;REXPG MIN: INCB MINS ;SET MINUS FOUND SWITCH ON MIN1: BR DCD1 ;REPRINT LAST OPENED ADDRESS RELATIVELY. ; A. N! WAS TYPED--PTCLS: JSR PC,CLSE ;CLOSE CURRENT CELL CMP BW,#WORD BLT TCL2 ;CANT DO THESE THINGS ON BYTES BEQ 2$ ;IF WORD OPERATION M NOT TYPED, N NOT TYPED, CLEAR ALL. BR 1$ ;REXP TYPED- N NOT TYPED 3$: MOV #-1,RELT(R4) BR H1 ;CLEAR RELOCATION REGISOV CAD,R2 ;MAKE VALUE AVAILABLE CALL PUTADR ;LOAD WCS REGISTER WITH ADDRESS MOV @R2,R2 ;GET VALUE IN R2 RTS R5 2$: MOVTERS. 4$: JSR 5,CLRR ;CLEAR RELOC REG'S BR SI2 ;GO BACK TO SCAN 5$: CMP BW,#WORD ;CASE D, PRINT @CAD IN RELATIVE FORM  @CAD,R2 RTS R5 TCL2: JMP ERR ;POP A WORD AND SHOW THE ERROR ; PROCESS S - SINGLE INSTRUCTION MODE SNGL: TSTB SMFD BNE TCL2 ;ERROR IF BYTE OPENED TST R2 BNE 7$ ; IF R MOV @CAD,R0 JSR R5,LOC ; THEN FIND BEST N BPL 6$ ;IF RELOC REG;DONT REACT IF ; NOT TYPED BEQ TCL2 TST R2 ;SEE IF TURN ON OR TURN OFF BNE 1$ ;BRANCH IF TURNING IT ON CLRB S ;CLEAR  FOUND JSR R5,CTYPE ;TYPE '=' .WORD '= MOV @CAD,R0 ;TYPE ABS. VAL OF CONTENTS BR 9$ ;OF OPENED LOC. 6$: MOV R0,R4 THE FLAG JMP DCD ;CONTINUE THE SCAN 1$: MOVB #-1,S ;SET THE FLAG SI2: JMP DCD .SBTTL RELOCATION REGISTER PROCESSING ; PUT NEW N INTO R4 7$: MOV @CAD,R1 ;OPENED VALUE IS THE MINUEND MOV R4,TMP1 ; SAVE N ASL R4 ;GET BIAS FROM $NR SUB RE ;COMMA PROCESSING. N IN R4 IS THE RELOCATION REGISTER NUMBER COMM: INCB CMFD ;SET "COMMA FOUND" SWITCH TO ON TST R2 ;WAS LT(R4),R1 ;BIAS IS THE SUBTRAHEND JSR R5,CTYPE .WORD '= ;TYPE "=" MOV TMP1,R0 ; PREPARE INPUTE FOR FTYP ADD #60,R0 ; A NUMBER TYPED IN? BEQ 1$ ;NO,USE CURRENT BIAS; I.E.,EXIT BIC #177770,R4 ;MAKE SURE THAT N IS LESS THAN 10(8) ASL R4 ;YECONVERT N TO ANSCII JSR 5,FTYP ; TYPE N JSR R5,CTYPE ;TYPE "," .WORD ', TST R2 BNE 8$ ; IF R MOV XXY,R0 ; THEN ��� EXIT TO SCAN ROUTINE 2$: MOV R4,R0 ;GET N. THIS CODE SIMULATES LOC ASL R0 ;TIMES 2 FOR INDEXING MOV CAD,XXY SUB RELTR NEXT SEARCH CMP R1,#CLGT ;IS THE SEARCH DONE? BHIS ERR ; OOPS! BR 2$ ;RE-LOOP 3$: TSTB MINS ;IF MINUS WAS NOT T(R0),XXY ;COMPUTE DIFFERENCE ASR R0 ;RESTORE N. BR 1$ ;PRINT RESULTS ;FILL MEMORY WORDS. LIMITS ARE THE SEARCH LIMITS.YPED BEQ 4$ ;DO NOT NEGATE K NEG R4 ;OTHERWISE, TAKE 2'S COMPLEMENT. 4$: TSTB CMFD ;IF A COMMA NOT TYPED, BEQ 5$ ;SKI FILL: MOV #WORD,BW ;SET MODE TO "OPEN WORD" FIL1: TSTB SMFD ;DONT REACT UNLESS ";" WAS TYPED BEQ ERR ;IF NOT TYPED, ERRP NEXT INSTRUCTION. ADD BIAS,R4 ;OTHERWISE, ADD RELOC. BIAS TO (R4) 5$: CLRB MINS ;REINITIALIZE MINUS-TYPED SWITCH FOR NXT SOR. MOV CNST,R0 ;ACTUAL VALUE MOV LOW,R4 ;USE SEARCH LIMITS FOR MOV HI,R3 ; FILL LIMITS. JSR 5,SET BR DCD ;EXIT CAN ASL R1 ;MULTIPLY BY TWO JMP @LGDR(R1) ;GO TO PROPER ROUTINE LGDR: SEMI ; ; SEMICOLON WRD ; / OPEN WORD BYT ;INITIALIZE MEMORY BYTES. INIT: MOV #BYTE,BW BR FIL1 ;LET FILL DO THE WORK .SBTTL COMMAND DECODER ; ALL REGISTERS  ; \ OPEN BYTE -BACK SLASH CRET ; CARRIAGE RETURN CLOSE REGT ; $ REGISTER OPS GO ; G GO TO ADDRESS K OP1 ; MAY BE USED (R0-R5), ERR: MOV #UR0,SP ;RESET THE STACK JSR R5,CTYPE .WORD '? CLR CFLG ;RESET CHARACTER REREAD FLAG D<LF> MODIFY, CLOSE, OPEN NEXT ORPC ; "BACKARROW" OPEN RELATED, INDEX - PC (BACK ARROW) OLD ; < RETURN TO OLD SEQUENCE ACD: CLR BW ;CLOSE ALL CLRB SCRN ;IN CASE OF ERROR WHILE SET JSR 5,CRLS ;TYPE <CR><LF>* MOV #10000,@#WCSADR DCD3: CLRB ND OPEN BACK ; ^ OPEN PREVIOUS (UP ARROW) COMM ; , COMMA. SEPERATES REL.REG. FROM INCREMENT OFST ; O OFFSET WSCH ; SMFD ;SEMICOLON FOUND FLAG CLRB CMFD ;COMMA FOUND FLAG CLRB MINS ;MINUS SIGN FOUND FLAG CLR R3 ;R3 IS A SAVE REGISTER  W SEARCH WORD EFF ; E SEARCH EFFECTIVE ADDRESS BKPT ; B BREAKPOINTS PROC ; P PROCEED ORAB ; @ OPEN RELATED, ABFOR R2 CLR R5 ;R5 IS A SAVE REGISTER FOR R4 DCD1: CLR R4 ; R4 CONTAINS THE CONVERTED OCTAL CLR R2 ; R2 IS THE NUMBER FOUSOLUTE ORRB ; > OPEN RELATED, REL. BRANCH SNGL ; S SINGLE INSTRUCTION MODE REL ; R RELOCATION PROCESSING CNS ; C RINT N,((CAD)-($NR)) ; B. ! WAS TYPED. FIND THE CLOSEST BIAS LESS THAN ; (CAD) AND USE ITS "N" -- THEN DO CASE A. RCMP: JND FLAG SCAN: JSR 5,GET ;GET A CHAR, RETURN IN R0 SCN1: CMP #'0,R0 ;COMPARE WITH ASCII 0 BHI 1$ ;CHECK LEGALITY IF NON-NUSR R5,CTYPE ;TYPE "=" .WORD '= TST R2 ;WAS N TYPED IN? BNE 2$ ;BRANCH IF YES MOV CAD,R0 JSR 5,LOC ;ELSE, FIND BEST MERIC CMP #'7,R0 ;COMPARE WITH ASCII 7 BLO 1$ ;CHECK LEGALITY IF NOT OCTAL BIC #177770,R0 ;CONVERT TO BCD ASL R4 ; MAN CMP R0,#-1 ;IF REL.REG FOUND, BNE 1$ ; BR, ELSE-- MOV CAD,R0 ;PRINT ADDR IN ABS. JSR 5,CADV BR DCD1 1$: ADD #6KE ROOM ASL R4 ; IN ASL R4 ; R4 ADD R0,R4 ;PACK THREE BITS IN R4 INC R2 ;R2 HAS NUMERIC FLAG BR SCAN ; AND 0,R0 ;CONVERT N TO ANSCII JSR 5,FTYP JSR R5,CTYPE .WORD ', JSR R5,OCTNXT ;TYPE RELATIVE AMOUNT .WORD XXY BR DCD1 ;TRY AGAIN 1$: CLR R1 ;CLEAR INDEX 2$: CMPB R0,LGCH(R1) ;DO THE CODES MATCH? BEQ 3$ ;JUMP IF YES INC R1 ; SET INDEX FO���  INIT ; I INITIALIZE MEMORY BYTES FROM THE CONSTANT REGISTER RCMP ; ! PRINT CURRENT OPENED ADDRESS IN REL. FORM MOD ; XWORD '= MOVB @CAD,R0 JSR 5,FTYP JSR R5,CTYPE .WORD ' 4$: JMP DCD3 ;GO BACK TO DECODER 3$: MOV R4,R2 ;GET THE WCS  RETYPE OPENED CONTENTS, MOD40 ALF ; A ACCEPT ASCII INPUT CTLC ; ^C EXIT TO MONITOR WCSW ; : OPEN A WCS LOCATION DUMPVALUE FOR THE ADDRESS CALL PUTADR MOV @R2,R0 ;R0=VALUE TST FORM BEQ 5$ ;IF $F=0, THEN USE SYMBOLIC JSR R5,OCTOUT ;PR ; D INSERT A DUMP POINT MICGO ; M MICROCODE GO CHAIN ; N CHAIN TO LOADER TRACE ; T DUMP TRACE BUFFER WCREG ; & PRIINT LOW ORDER WORD IN OCTAL JSR R5,CTYPE ;TYPE THE COMMA DELIMITER .WORD ', JSR R5,OCTNXT ;TYPE THE EXTENSION BITS .WORDNT SPECIFIED WCS REGISTER LGL= .-LGDR ;LGL MUST EQUAL 2X CHLGT ALWAY ; SEMI-COLON PROCESSOR SEMI: MOV R2,R3 ;A SEMI-COLO WCSDAT+2 BR 6$ 5$: JSR PC,DISASM ;DISASMBLE THE WCS LOCATION 6$: MOV #100000,@#WCSADR MOV #10000,@#WCSADR ;KEEP WCS GOINGN HAS BEEN RECEIVED MOV R4,R5 ;NUMERIC FLAG TO R3, CONTENTS TO R5 INCB SMFD ;SET SEMICOLON FOUND FLAG CLRB CMFD ;RESET  JSR R5,GET MOVB R0,CFLG ;MAKE GET BACK UP SUB #'Z+1,R0 ADD #'Z-'A+1,R0 BCC 4$ ;IF NOT ALPHABETIC JSR PC,ASMBL ;TRCOMMA FOUND FLAG BR DCD1 ;GO BACK FOR MORE .SBTTL OPEN LOCATION ; PROCESS / AND \ AND : - OPEN WORD OR BYTE OR WCS LOCAY ASSEMBLING AS AN INSTR JMP SCAN .SBTTL CLOSE, OPEN NEXT, OPEN PREVIOUS ; PROCESS CARRIAGE RETURN CRET: JSR PC,CLSE TION ;INPUT - IF R2 IS NON-ZERO A NEW REXP HAS BEEN TYPED IN ;INPUT - -ADDRESS OF WORD TO BE OPENED IS IN R4 WCSW: MOV ;CLOSE LOCATION DCDA: JMP DCD ;RETURN TO DECODER ERR3: JMP ERR ; INTERMEDIATE HELP ; PROCESS <LF>, OPEN NEXT WORD OL#WCS,BW BR WB1 WRD: MOV #WORD,BW ;OPEN WORD BR WB1 BYT: MOV #BYTE,BW ;OPEN BYTE WB1: TST R2 ;GET VALUE IF R2 IS NON-D: INCB SEQ ;SET FLAG TO LATER RESTORE CAD OP1: TST BW ;<LF> RECEIVED ERR2: BEQ ERR3 ;ERROR IF NOTHING IS OPEN JSR PC,CLSZERO BNE 3$ ;BRANCH IF NUMBER INPUT TSTB CMFD ;TEST FOR ","AND";" BEQ 2$ 1$: JMP ERR ;ERROR IF PRESENT WITHOUT NUMBER.E ;CLOSE PRESENT CELL TST SEQ ;SHOULD CAD BE RESTORED? BEQ 1$ ;BRANCH IF NOT MOV DOT,CAD ;RESTORE PREVIOUS SEQUENCE  2$: TSTB SMFD BNE 1$ BR WRD1 ;NO NUMBER - REOPEN PREVIOUS LOCATION 3$: MOV R4,DOT ;PUT VALUE IN DOT MOV R4,CAD ; CLRB SEQ ;RESET FLAG; NO LONGER NEEDED 1$: INC CAD ;BUMP TO NEXT ADDRESS CMP BW,#WORD BNE OP2 INC CAD ;WORDS ONLY GO U ALSO IN CAD WRD1: MOV CAD,R4 CMP BW,#WORD ;CHECK BYTE MODE BLT 1$ ;JUMP IF BYTE BGT 3$ ;IF WCS LOCATION BIT #1,R4 P BY 2 OP2: MOV CAD,DOT ;INITIALIZE DOT OP2A: JSR 5,CRLF ;<CR><LF> MOV BW,-(SP) ;SAVE BW MOV #WORD,BW ;SET TO TYPE FULL WO BNE BYT ;IF ODD, THEN OPEN AS BYTE MOV @R4,R0 ;GET CONTENTS OF WORD BR 2$ 1$: MOVB @R4,R0 ;GET CONTENTS OF BYTE 2$: RD ADDRESS MOV CAD,R0 ;NUMBER TO TYPE JSR 5,RORA ; CHECK FORMAT MOV (SP)+,R0 MOV R0,BW ;RESTORE BW MOVB OPNCHR(R0), CONSTANT REGISTER PROCESSING MIN ; - MINUS, NEGATES NUMBER TYPED IN FILL ; F FILL MEMORY WORDS FROM THE CONSTANT REGISTERJSR 5,CADV ;GO GET AND TYPE OUT @CAD CMP #BYTE,BW ;CHECK IF BYTE MODE. BNE 4$ ;IF NOT WE'RE DONE. ELSE: JSR R5,CTYPE .� �� CK WORD MODE BNE ERR1 ;ERROR IF NOT CORRECT MODE JSR R5,CTYPE .WORD ' TST R3 ;WAS SEMI-COLON TYPED? BEQ ERR1 ;NO, E R1 MOV (SP)+,R4 ; RESTORE R4 JSR R5,CU ;HAS CTRL/U BEEN STRUCK? 3$: TST (R2)+ ;INCREMENT TO NEXT CELL AND BR 1$ ; CALL IT AN ERROR SUB CAD,R5 ;COMPUTE DEC R5 DEC R5 ; 16 BIT OFFSET MOV R5,R0 JSR 5,CADV ;NUMBER IN R0 - WORD MODE  RETURN 4$: CMP R0,R5 ; IS (X)=K? BEQ 2$ ;TYPE IF EQUAL MOV R0,R3 ;(X) TO R3 ADD R2,R3 ;(X)+X INC R3 INC R3 ;(R0 ;GET APPROP DELIMITER 1$: JSR 5,FTYP ;TYPE THE LOW BYTE OF R0 BR WRD1 ;GO PROCESS IT OPNCHR: .ASCII '?\/:' ; PR MOV R5,R0 ASR R0 ;DIVIDE BY TWO BCS 1$ ;ERROR IF ODD CMP #-200,R0 ;COMPARE WITH -200 BGT 1$ ;DO NOT TYPE IF OUT OF OCESS ^, OPEN PREVIOUS WORD BACK: TST BW ; ^ RECEIVED BEQ ERR2 ;ERROR IF NOTHING OPEN JSR PC,CLSE DEC CAD ;DECR TO RANGE CMP #177,R0 ;COMPARE WITH +177 BLT 1$ ;DO NOT TYPE IF OUT OF RANGE DEC BW ;SET TEMPORARY BYTE MODE JSR 5,CADV ;NEXT ADDRESS CMP BW,#WORD BNE OP2 DEC CAD ;WORDS GO DOWN BY 2 BR OP2 ;GO DO THE REST .SBTTL B HANDLER - SET AND REMNUMBER IN R0 - BYTE MODE INC BW ;RESTORE WORD MODE 1$: JMP DCD3 ;ALL DONE ERR1: JMP ERR ;INTERMEDIATE HELP .SBTTL SEOVE BREAKPOINTS BKPT: MOV #TRTC,R0 ASL R4 ;MULTIPLY NUMBER BY TWO TST R3 BEQ 3$ ;IF R3 IS ZERO GO REMOVE BREAKPOINT ARCHES ; SEARCHES - $MSK HAS THE MASK ; $MSK+2 HAS THE FWA ; $MSK+4 HAS THE LWA EFF: INC R1 ;SET EFFECTIVE SEARCH  ASR R5 ;GET ONE BIT TO CARRY BCS ERR1 ;BADNESS IF ODD ADDRESS ASL R5 ;RESTORE ONE BIT ADD #ADR1,R4 TST R2 BNE 2$  BR WDS WSCH: CLR R1 ;SET WORD SEARCH WDS: TST R3 ;CHECK FOR OBJECT FOUND BEQ ERR1 ;ERROR IF NO OBJECT MOV #WORD,BW ;;JUMP IF SPECIFIC CELL 1$: CMP R0,@R4 ;IS THIS CELL FREE? BEQ 2$ ;JUMP IF YES CMP R4,#BKP+ADR1 ;ARE WE AT THE END OF OUR SET WORD MODE MOV MSK+2,R2 ;SET ORIGIN MOV MSK,R4 ;SET MASK COM R4 1$: CMP R2,MSK+4 ; IS THE SEARCH ALL DONE? BHI DCDB ROPE BHIS ERR1 ;YES, THERE IS NOTHING FREE TST (R4)+ ;INCREMENT BY TWO BR 1$ 2$: CMP R4,#BKP+ADR1 BHI ERR1 ;ERROR  ; YES MOV @R2,R0 ; GET OBJECT TST R1 ;NO BNE 4$ ;BRANCH IF EFFECTIVE SEARCH MOV R0,-(SP) MOV R5,R3 ;EXCLUSIVE ORIF TOO LARGE MOV R5,@R4 ;SET BREAKPOINT BR DCDA ;RETURN 3$: TST R2 BEQ RALL ;GO REMOVE ALL CMP R4,#BKP BHI ERR1  BIC R5,R0 ; IS DONE BIC (SP)+,R3 ; IN A VERY BIS R0,R3 ; FANCY MANNER HERE BIC R4,R3 ;AND RESULT WITH MASK 2$:  ;JUMP IF NUMBER TOO LARGE MOV R0,ADR1(R4) ;CLEAR BREAKPOINT CLR CT(R4) ;CLEAR COUNT ALSO DCDB: BR DCDA RALL: CLR R4 1$BNE 3$ ;RE-LOOP IF NO MATCH MOV R4,-(SP) ;REGISTERS R2,R4, AND R5 ARE SAFE MOV R1,-(SP) ;SAVE R1 MOV R2,-(SP) ;SAVE R2 : CMP R4,#BKP+2 ;ALL DONE? BHI DCDA ;JUMP IF YES MOV #TRTC,ADR1(R4) ;RESET BKPT MOV #TRT,UIN(R4) ;RESET CONTENTS OF TABLEMOV R3,-(SP) JSR 5,CRLF MOV R2,R0 ;GET READY TO TYPE JSR 5,RORA ; CHECK FORMAT MOV #'/,R0 ;SLASH TO R0 JSR 5,FTYP ; CLR CT(R4) ;CLEAR COUNT TST (R4)+ ;INCREMENT BY TWO BR 1$ .SBTTL PROCESS O, COMPUTE OFFSET OFST: CMP #WORD,BW ;CHETYPE IT MOV @R2,R0 ;GET CONTENTS JSR 5,CADV ; TYPE CONTENT MOV (SP)+,R3 MOV (SP)+,R2 ;RESTORE R2 MOV (SP)+,R1 ;RESTOR�!��  T BIT BIC #TBT,(SP) ; SO INTERRUPTS CAN HAPPEN BEFORE JSR PC,WST ; RTT TURNS ON THE T BIT. RTIT: RTT ; CHANGED TO RTIJSR R5,OCTNXT ;PRINT THE PC .WORD UPC JMP DCD DP: .ASCIZ <15><12>/DP @/ .EVEN .SBTTL BREAKPOINT HANDLER ; BREAKPOIN WHEN RUNNING ON /05 OR /20 ; PROCESS P - PROCEED ; ONLY ALLOWED AFTER A BREAKPOINT ERR6: JMP ERR PROC: TSTB SMFD ;WAS T HANDLER ; THE BPT VECTOR POINTS HERE. ; SAVE EVERYTHING AND PRINT THE BREAKPOINT MESSAGE BRK: MOV (SP)+,UPC ;PRIORITY IS 7 ";" TYPED? BEQ ERR6 ;BR IF NOT TYPED MOVB P,R0 BLT ERR6 ;NOT LEGAL TST R2 ;CHECK FOR ILLEGAL COUNT BNE ERR6 ;JUMP UPON ENTRY MOV (SP)+,UST ;SAVE STATUS AND PC MOVB #BKP+3,P ;TELL ;P THAT WE CAN CONTINUE BK1: JSR 0,SVR ;SAVE VARIOUS REGIIF ILLEGAL TST R3 ;WAS COUNT SPECIFIED? BEQ 1$ ;NO MOV R5,CT(R0) ;YES, PUT AWAY COUNT 1$: MOVB #STM,-(SP) ;FORCE HIGH PSTERS TSTB T ;CHECK FOR T-BIT SET BNE TBIT ;JUMP IF SET JSR 5,REM ;REMOVE BREAKPOINTS TSTB PRI ;CHECK IF PRIORITY RIORITY JSR PC,WST JSR 5,RSTT ;RESTORE TTY C1: CMPB P,#BKP ;SEE IF A REAL ONE OR A FAKE BGT TBIT ;BRANCH IF FAKE TSTB BPL 1$ ; IS AS SAME AS USER PGM MOVB UST,R5 ;PICK UP USER UST IF SO BR 2$ 1$: MOVB PRI,R5 ;OTHERWISE PICK UP ACTUAL PRIOX)+X+2 CMP R3,R5 ;IS (X)+X+2=K? BEQ 2$ ;BRANCH IF EQUAL BIC #177400,R0 ;WIPE OUT EXTRANEOUS BITS MOVB R0,R0 CCC ASS ;SEE IF SINGLE INSTRUCTION MODE BNE TBIT ;IF SO EXIT NOW MOVB #STM,-(SP) ;SET HIGH PRIORITY JSR PC,WST INCB T ;SET L R0 ;MULTIPLY BY TWO INC R0 INC R0 ADD R2,R0 ;ADD PC CMP R0,R5 ;IS THE RESULT A PROPER REL. BRANCH? BR 2$ .SBTTT-BIT FLAG BIS #TBT,UST ;SET T-BIT BR GO2 .SBTTL DUMP POINT ENTRY HANDLER ; THIS CODE HANDLE DUMP POINTS BY SAVING THEL PROCESS G - GO COMMAND GO: TSTB SMFD ;WAS ";" TYPED? BEQ ERR1 ;BR IF NOT TYPED TST R3 ;WAS K; TYPED? BEQ ERR1 ; T MACHINE STATUS AND ALLOWING ; THE USER TO EXAMINE SOME OF THE INTERNAL REGISTERS. WHEN A DUMP ; POINT IS SET BY THE 'D' COMMYPE ?<CR,LF> IF NOT MOVB #BKP+3,P ;CLEAR PROCEED BIT #1,R5 BNE ERR1 ;ERROR IF ODD ADDRESS MOV R5,UPC ;SET UP NEW PC AND, A JUMP TO A MICRO DUMP-POINT HANDLER ; IS INSERTED, THEN THE DUMP POINT CODE ITSELF IS INSERTED. THIS CODE ; SAVES THE RMOVB #STM,-(SP) ;SET HIGH PRIORITY JSR PC,WST JSR 5,RSTT ;RESTORE TELETYPE TBIT: CLRB T ;CLEAR BIS #TBT,UST ; BOTH TEGISTERS IN RVAL AND SETS THE PC TO 'DMPENT'. DMPENT: JSR PC,RRST ;SAVE MACHINE STATUS MOV RVAL,UPC ;SET USER PC SAVED BY TH-BIT FLAGS TSTB S ;SEE IF WE NEED A T BIT BNE GO2 ;IF NOT GO NOW BIC #TBT,UST ;SET TH T BIT JSR 5,RSB ;RESTORE BREAKPE MICRO CODE JSR R0,SVR ;SAVE THE REGISTERS JSR R5,REM ;REMOVE ANY BREAKPOINTS TSTB PRI BPL 1$ ;RESET PRIORITY MOVBOINTS GO2: MOV #100000,@#WCSADR ;ENABLE WCS TO RUN MICROCODE MOV #10000,@#WCSADR JSR 0,RSR ;RESTORE REGISTERS MOV UST,-( UST,R5 BR 2$ 1$: MOVB PRI,R5 CCC RORB R5 RORB R5 RORB R5 RORB R5 2$: BIC #TBT,R5 ;CLEAR T BIT TRAPS MOVB R5,-(SP) ; AND STATUS MOV UPC,-(SP) ; AND PC NOP ; CHANGE TO HALT FOR DEBUGGING MOV UST,-(SP) ; MOV IN STATUS FIRST W/OSP) JSR PC,WST ;NOW RESTORE PRIO LEVEL JSR R5,SVTT ;SAVE TTY STATUS JSR R5,PRINT ;PRINT DUMP POINT MESSAGE .WORD DP �"��  MOV R5,R0 ADD #2,UPC ;POP OVER THE ADJUSTMENT ABOVE BR 6$ ; OR CONTINUE 4$: MOVB #BKP+2,R4 ;SET BREAK POINT HIGH + 1 CSR ; BITS IN BOTH C/SR 1$: TSTB TCSR ;LOOP UNTIL READY BIT COMES ON BPL 1$ ;BR IF BIT NOT ON RTS R5 ; RESTORE TELET MOV R5,ADR1(R4) ;STORE NEXT PC VALUE FOR TYPE OUT BR 5$ 5$: MOVB R4,P ;ALLOW PROCEED DEC CT(R4) BGT C1 ;JUMP IF REPEYPE STATUS RSTT: JSR 5,CRLF TSTB TCSR ;WAIT READY BPL .-4 ; ON PRINTER BIT #4000,RCSR ;CHECK BUSY FLAG BEQ 1$ ;SKAT MOV #1,CT(R4) ;RESET COUNT TO 1 JSR 5,SVTT ;SAVE TELETYPE STATUS, R4 IS SAFE JSR R5,CTYPE .WORD 'B MOVB P,R0 ;CONVIP READY LOOP IF NOT BUSY TSTB RCSR ;WAIT READY BPL .-4 ; ON READER 1$: MOVB CSR1,RCSR ;RESTORE MOVB CSR2,TCSR ; THERT BREAKPOINT NUMBER TO ASCII ADD #140,R0 ASR R0 JSR 5,FTYP JSR R5,CTYPE .WORD '; MOV #WORD,BW ; SET WORD MODE MOE STATUS REGISTERS RTS R5 ; REMOVE BREAKPOINTS 0-7 ; IN THE OPPOSITE ORDER OF SETTING REM: TSTB S ;SEE IF SINGLE INSVB P,R4 MOV ADR1(R4),R0 ;GET ADDRESS OF BREAK 6$: JSR 5,RORA ; CHECK FORMAT JMP DCD ;GO TO DECODER ; SAVE REGISTERS R0-RTRUCTION IS GOING BNE 2$ ;EXIT IF SO CLR R4 ;REMOVE ALL BREAKPOINTS 1$: MOV UIN(R4),@ADR1(R4) ;CLEAR BREAKPOINT INC R4 6 ; INTERNAL STACK SVR: MOV (SP)+,XXX ;PICK REGISTER FROM STACK AND SAVE MOV SP,USP ;SAVE USER STACK ADDRESS MOV #USP, INC R4 CMP R4,#BKP BLE 1$ ;RE-LOOP UNTIL DONE 2$: RTS R5 ;THEN QUIT ; TYPE OUT CONTENTS OF WORD OR BYTE WITH ONE TRAISP ;SET TO INTERNAL STACK MOV R5,-(SP) ;SAVE MOV R4,-(SP) ; REGISTERS MOV R3,-(SP) ;1 MOV R2,-(SP) ; THRU MOV R1,-(SP)LING SPACE ; WORD IS IN R0 OCTNXT: MOV @(R5)+,R0 ;OUTPUT WORD WHOSE ADDR FOLLOWS CALL OCTOUT: MOV #6,R3 ;SET UP TO DO ONLY ; 5 MOV XXX,-(SP) ;PUT SAVED REGISTER ON STACK TST -(SP) RTS R0 ; RESTORE REGISTERS R0-R6 RSR: TST (SP)+ ;POP  WORDS MOV #-2,R4 BR CADV1 CADV: MOV #6,R3 ;# OF DIGITS MOV #-2,R4 ;# OF BITS FIRST-3 CMP #BYTE,BW ;SEE IF WORD MODRITY CCC ;CLEAR CARRY RORB R5 ;SHIFT LOW ORDER BITS RORB R5 ; INTO RORB R5 ; HIGH ORDER RORB R5 ; POSITTHE EXTRA CELL MOV (SP)+,XXX ;GET R0 FROM STACK MOV (SP)+,R1 ;RESTORE MOV (SP)+,R2 ; REGISTERS MOV (SP)+,R3 ; 1 MOV (ION 2$: BIC #TBT,R5 ;CLEAR POSSIBLE T BIT (S/I MODE) MOVB R5,-(SP) ;PUT THE STATUS AWAY WHERE IT BELONGS JSR PC,WST MOV SP)+,R4 ; THRU MOV (SP)+,R5 ; 5 MOV USP,SP ;RESTORE USER STACK MOV XXX,-(SP) ;PUT R0 ON USER STACK RTS R0 ; RESTOUPC,R5 ;GET PC, IT POINTS TO THE TRT TSTB S ;SEE IF IT WAS SINGLE INSTRUCTION FUN BMI 4$ ;IF SO HANDLE THERE TST -(R5) RE BREAKPOINTS 0-7 RSB: MOV #BKP,R4 ;RESTORE ALL BREAKPOINTS 1$: MOV @ADR1(R4),UIN(R4) ;SAVE CONTENTS MOV TRTC,@ADR1(R4) ; MOV R5,UPC MOV #BKP,R4 ;GET A COUNTER 3$: CMP R5,ADR1(R4) ;COMPARE WITH LIST BEQ 5$ ;JUMP IF FOUND DEC R4 DEC R4 BGREPLACE WITH TRAP DEC R4 DEC R4 BGE 1$ ;RE-LOOP UNTIL DONE RTS R5 ; THEN QUIT .SBTTL I/O ROUTINES ; SAVE TELETYE 3$ ;RE-LOOP UNTIL FOUND JSR 5,SVTT ;SAVE TELETYPE STATUS JSR 5,CRLF JSR R5,PRINT .WORD BD ;PRINT "BE" FOR BAD ENTRY PE STATUS SVTT: MOVB RCSR,CSR1 ;SAVE R C/SR MOVB TCSR,CSR2 ;SAVE T C/SR CLRB RCSR ;CLEAR ENABLE AND MAINTENANCE CLRB T�#�� Y DEC R4 ;DECREMENT COUNTER BGT 3$ ;LOOP IF MORE BITS NEEDED ADD #'0,R0 ;CONVERT TO ASCII JSR R5,FTYP ;TYPE IT DECMPB #40,R0 ;CHECK FOR SPACES BEQ 1$ ;IGNORE SPACES 4$: CLR CFLG ;RESET REPEAT FLAG RTS R5 CFLG: .WORD 0 ;CHARACTER R R3 ;SEE IF MORE DIGITS TO DO BGT 2$ ;LOOP IF SO MOVB #' ,R0 ;SET UP FOR TRAILING SPACE TST (SP)+ ;GET RID OF JUNK EPEAT FLAG ; GENERAL CHARACTER OUTPUT ROUTINE ; ADDRESS OF FIRST BYTE IN R4, ; ADDRESS OF LAST BYTE IN R3, (R3)>(R4) ; EXBR FTYP ;CLRR CLEAR RELOCATION REGS ; I.E., SET THEM TO A HIGH MEM LOC. (-1) ; R1,R0 CLOBBERED CLRR: MOV #RELT,R1 MPECTS LOCS 56,57 TO BE INITIALIZED BY MONITOR FOR FILL ; CHARACTERISTICS OF TERMINAL ; 56=CHAR TO BE FILLED AFTER ; 57=# OFOV #-1,R0 MOV R0,(R1)+ MOV R0,(R1)+ MOV R0,(R1)+ MOV R0,(R1)+ MOV R0,(R1)+ MOV R0,(R1)+ MOV R0,(R1)+ MOV R0,(R1) NULLS TO FILL WITH PRINT: MOV (R5)+,R4 ;ENTRY WITH ADDR OF ASCIZ STR MOV R4,R3 ;FOLLOWING THE CALL 1$: TSTB (R3)+ ;LOO RTS R5 ; TYPE ONLY ONE CHARACTER (CONTAINED IN R0) CTYPE: MOV (R5)+,R0 ;ENTRY WITH CHARACTER FOLLOWING CALL FTYP: DECK FOR END OF STRING BNE 1$ DEC R3 ;R3 -> LAST CHARACTER TYPE: CMP R3,R4 ;CHECK FOR COMPLETION BLO TYP1 ; EXIT WHEN D CC ;DECREMENT COLUMN COUNTER TSTB TCSR BPL .-4 BIC #177400,R0 ;CLEAR HIGH BYTE,SHOULD NOT ;CONTAIN INPORTANT INFO. ONE MOVB (R4)+,R0 ;GET A CHARACTER JSR 5,FTYP ;TYPE ONE CHARACTER CMPB R0,@#56 ;COMPARE CHAR AGAINST FILL REQUIREMENT B BEQ 3$ CMP #176,R0 ;PRINT ? FOR 177;16-37 BLO 2$ ; 1-10 AND 200-377. CMP #37,R0 BLO 3$ CMP #15,R0 BLO 2$ CMP #NE TYPE ;NO FILL NEEDED MOVB @#57,(PC)+ ;FILL COUNT INTO TEMP FTMP: 0 CLR R0 ;FILL WITH NULLS 1$: JSR R5,FTYP ;TYPE NU10,R0 BLO 3$ 2$: MOV #'?,R0 3$: MOVB R0,TDB TYP1: RTS R5 ; GENERAL CHARACTER INPUT ROUTINE ; CHARACTER INPUT GOES TO R0LLS DEC FTMP ;DECREASE COUNT BGT 1$ ;BRANCH IF NOT DONE BR TYPE ;LOOP UNTIL DONE ;CHECKS FOR ^U. IF PRESENT, ECHOS  GET: MOVB CFLG,R0 BNE 4$ ;IF FLAG IS SET, USE IT AS CHARACTER 1$: TSTB RCSR ;WAIT FOR BPL 1$ ; INPUT FROM KBD IT ;GOES TO COMMAND DECODER. STACK GETS INITIALIZED CU: CMPB RDB,#225 ;IS ^U IN TTY BUFFER BNE TYP1 ;BR TO RETURN IF NOTMOVB RDB,R0 ;GET CHARACTER - STRIP OFF PARITY BIC #177600,R0 ;STRIP OFF PARITY FROM CHARACTER CMPB #3,R0 ;IS IT ^C? BEQ 4 JSR R5,PRINT ;PRINT "^U" .WORD CTLU MOV #UR0,SP ;INT STACK JMP DCD ;SUBROUTINE TO READ THE PS INDEPENDENT OF MACHIN$ ;IF SO, DO NOT ECHO TSTB SCRN ;SHOULD WE ECHO <LF>? BNE 2$ ;BR IF YES CMPB R0,#012 ;SEE IF A <LF> BEQ 4$ ;IF SO SE RRST: MOVB ST,UST ;STORE THE STATUS IN USER ;STATUS AREA.FOR AN LSI ;THIS IS CHANGED TO ;MFPS UST RTS PC E BNE CADV1 ;BRANCH IF SO SUB #3,R3 ;ONLY DO 3 DIGITS INC R4 ;DO 2 BITS FIRST SWAB R0 ;AND TURN R0 AROUND CADV1: MOAVE THE PAPER 2$: CMPB R0,#173 BGE 3$ CMPB #140,R0 ;TEST FOR LOWER CASE BGE 3$ SUB #40,R0 ;CHAR IS LC-CONVERT TO UPPV R0,-(SP) ;SAVE R0 2$: ADD #3,R4 ;COMPUTE THE NUMBER OF BITS TO DO CLR R0 3$: ROL (SP) ;GET A BIT ROL R0 ;STORE IT AWAER CASE 3$: JSR 5,FTYP ;ECHO CHARACTER BEQ 1$ ;IGNORE NULLS TSTB SCRN ;SHOULD WE PASS ON SPACES? BNE 4$ ;BR IF YES C�$�� IVIEN VALUE. (ENTERED VIA R5) ;FIRST WORD OR BYTE ADDRESS IS IN R4, =TO R3 AT EXIT ;LAST WORD OR BYTE ADDRESS IS IN R3 ;BYTE E ADDRESS. IF NO SUCH ;RELOCATION REGISTER EXIST THEN THE ;ADDRESS WILL BE PRINTED IN ABSOLUTE FORM ;INPUT: THE ADDRESS TO B ;SUBROUTINE TO WRITE PS INDEPENDENT OF MACHINE ;CALL ROUTINE WITH PS VALUE ON THE STACK WST: MOVB 2(SP),ST ;STORE NEW PS VOR WORD VALUE IS IN R0 ;BYTE OR WORD MODE IS SPECIFIED BY BW SET: CMP BW,#WCS BNE 1$ ;IF NOT WCS REFERENCE CLR @#WCSADRALUE ;THIS INSTRUCTION IS CHANGED FOR LSI ;TO MTPS 2(SP) MOV (SP)+,(SP) ;PUT RETURN PC OVER SUB. ARGUMENT RTS PC  1$: CMP BW,#WORD ;IF NOT BYTE MODE, ASSUME WORD BLT 3$ ;IF BYTE MODE BGT 4$ ;IF WCS MODE MOV R0,(R4)+ ;DEPOSIT WORD VA;TO RETURN WITHOUT IT ON THE STACK .SBTTL LOCATE A RELOCATION REGISTER ;SUBROUTINE TO LOCATE RELOCATION REGISTER NEAREST BLUE, BUMP R4 BY 2 2$: CMP R4,R3 ;ARE WE DONE? BLOS 1$ ;BRANCH IF NOT DONE RTS 5 ;OTHERWISE EXIT 3$: MOVB R0,(R4)+ ;DEUT STILL ;BELOW THE ADDRESS IN R0. RETURNS WITH THE REGISTER ;NUMBER IN R0, AND WITH THE DISTANCE BETWEEN THE REGISTER ;APOSIT BYTE VALUE BR 2$ ;GO TO TEST IF DONE 4$: MOV R2,R2 CALL PUTADR ;SET UP WCS ADDRESS MOV R0,@R2 ;STORE THE VALUEND (R0) IN XXY ;IF NO GOOD RELOC. REG. FOUND, R0 WILL = -1 LOC: MOV R0,5$ ;PUT R0 IN WORKINK LOCATION. CLR R0 MOV #-1,X INC R4 BR 2$ ; CLOSE WORD OR BYTE AND EXIT, ; UPON ENTERING, R2 HAS NUMERIC FLAG, R4 HAS CONTENTS CLSE: TST R2 ;IF XX ;INITIALIZE RELOC. REG. INDEX MOV #177777,XXY ;INITIALIZE DISTANCE TO A HIGH VALUE 1$: CMP R0,#RLR ;ARE WE DONE COMPARING?NO NUMBER WAS TYPED THERE IS BEQ 2$ ;NO CHANGE TO THE OPEN CELL CMP BW,#WORD BLT 1$ ;IF BYTE MODE BEQ 3$ ;IF WORD MOD BHI 3$ ;BRANCH IF DONE CMP RELT(R0),5$ ;IS CURR. RELOC. BIAS > (CAD)? BHI 2$ ;IF SO, BRANCH -- DON'T SUBTRACT, GET NEXTE MOV CAD,R2 ;PUT DATA IN R4 INTO WCS(CAD) CALL PUTADR MOV R4,@R2 RTS PC 3$: MOV R4,@CAD ;STORE WORD BR 2$ 1 MOV 5$,R1 ;OTHERWISE TAKE THE DIFFERENCE SUB RELT(R0),R1 ; OF CURR. RELOC. REG. AND CAD CMP XXY,R1 ;IS THE RESULT THE SM$: MOVB R4,@CAD ;STORE BYTE 2$: RTS PC CRLF: MOV #CR+1,R3 ;LWA <CR,LF> SUB NOLF,R3 ;CONDITIONALLY ONLY DO CR AND NOT LALLEST SO FAR? BHI 4$ ;BRANCH IF YES (UNSIGNED CONDITIONAL) 2$: TST (R0)+ ;OTHERWISE, BUMP R0 FOR NEXT RELOC. REG. BR 1$ F CLR NOLF ;ONLY GOOD ONCE BR CRS CRLS: MOV #CR+2,R3 ;LWA <CR,LF>* CRS: MOV #CR,R4 ;FWA JSR 5,TYPE ;TYPE SOMETHING  ;LOOP BACK FOR NEXT COMPARISON 3$: MOV XXX,R0 ;PUT REG.# IN R0 RTS 5 ;JOB OVER, RETURN 4$: MOV R1,XXY ;REMEMBER SMALLE RTS R5 .SBTTL PRINT AN ADDRESS ;SUBROUTINE RORA ;FUNCTION: DECIDE IF AN ADDRESS IS ;TO BE PRINTED IN ABSOLUTE OR IN RST DIFFERENCE IN XXY ASR R0 ;AND ASSOCIATED REGISTER NUMBER MOV R0,XXX ; IN XXX ASL R0 ;RESTORE R0 TO ORIGINAL VALUE BELATIVE ;FORM. IF THE FLAG FORM=0 THEN PRINT ;IN RELATIVE FORM, OTHERWISE PRINT IN ABSOLUTE FORM. ;IF THE ADDRESS IS TO BE PR 2$ ;GO FO NEXT COMPARISON. 5$: .WORD ;TEMP LOCATION. .SBTTL MODIFY MEMORY CONTENTS ;SET A SEGMENT OF MEMORY TO A GRINTED IN RELATIVE FORM, ;THEN THE ADDRESS WILL BE PRINTED OUT ;RELATIVE TO A RELOCATION REGISTER NEAREST ;BUT STILL BELOW TH�%��  R2 ;8*R2 MOV R2,-(SP) ;STACK 8*R2 ASL R2 ;16.*R2 ASL R2 ;32.*R2 ADD (SP)+,R2 ;40.*R2 ; INCLUDE CURRENT CHARACTER  ;-1 IF ACTIVE ;NO BREAK BOINTS MAY BE SET WHILE IN ;SINGLE INSTRUCTION MODE T: .BYTE 0 ; T-BIT FLAG P: .BYT ADD R3,R2 INC R4 ;DONE 3 CHARS? BLT 1$ ;NO RTS PC ;EXIT ; MOD40 UNPACK - ENTERED VIA JSR PC,UNPA00 ; INPUT: R0=MOD4E 0 ;PROCEED FLAG = -2 IF MANUAL ENTRY ; -1 IF NO PROCEED ALLOWED ; 0-7 IF PCEED ALLOWED CSR1: .BYTE 0 ;SAVE CELL0 NUMBER (1 WORD) ; R1=ADR OF ASCII STRING (3 BYTES) ; OUTPUT: R1 POINTS ONE PAST LAST GENERATED CHARACTER ; ; IF N IS THE  - R C/SR CSR2: .BYTE 0 ;SAVE CELL - T C/SR CMFD: .BYTE 0 ;COMMA FOUND SWITCH, =0 NO COMMA FOUND ; =1 COMMA FOUNDMOD40 NUMBER, THEN ; N=C1*50 ^ 2+C2*50+C3 ; THUS, N/50^2 IS C1 AND THE REMAINDER IS C2*50+C3 ; THE REMAINDER IS DIVIDED BY 5 SMFD: .BYTE 0 ;SEMICOLON FOUND SWITCH ;=0 NO SEMICOLON FOUND ;=1 SEMICOLON FOUND ALF0: .BYTE '= ALF1: .BYTE 0 ALE PRINTED IS IN R0. ;DATA SAVED: R0 CONTAINING THE ADDRESS TO BE ;PRINTED, AND LOCATION CAD CONTAINING ;THE CURRENT ADDRESS 0 TO GET C2 ETC. UNPA00: MOV #-3,R5 ;MINOR LOOP COUNT MOV #COEFF,R2 ;PTR TO COEFFICIENT TABLE 1$: CLR R3 ;0 QUOTIENT ; WERE SAVED AND RESTORED. ;CALLED: JSR 5,RORA RORA: TST FORM BNE 1$ ;IF ABSOLUTE FORMAT 2$: MOV R0,-(SP) ;SAVE R0 JSDIVIDE BY COEFFICIENTS 2$: CMP R0,(R2) ;DONE WITH DIVIDE? BLO 3$ ;YES SUB (R2),R0 ;NO-SUBTRACT COEFF. INC R3 ;ADD 1 TOR 5,LOC ; FIND BEST N TST R0 ;IF = -1, PRINT IN ABS. BLT 3$ ADD #60,R0 ; CONVERT N TO ANSCII JSR 5,FTYP ; TYPE N JS QUOTIENT BR 2$ ; DIVIDE DONE. QUOT IN R3, REMAINDER IN R0 ; CONVERT TO AN ASCII CHARACTER 3$: TSTB R3 BEQ 4$ ;"BLAR R5,CTYPE .WORD ', JSR R5,OCTNXT .WORD XXY MOV (SP)+,R0 ; RESTORE R0 RTS R5 3$: MOV (SP)+,R0 ;RESTORE R0,CAD BEFORNK" CMPB R3,#33 BEQ 6$ ;"$" BGT 5$ ;"." OR "0-9" ADD #40,R3 ;"A-Z" 4$: ADD #16,R3 5$: ADD #11,R3 6$: ADD #11,R3 E 1$: JMP CADV ;PRINT THE ADDRESS .SBTTL RAD50 PACK AND UNPACK ; MOD40 PACK - ENTERED WITH JSR PC, PACK00 ; INPUT: R1=AMOVB R3,(R1)+ ;STORE CHARACTER TST (R2)+ ;ADVANCE TO NEXT COEFF. INC R5 ;DONE 3 CHARS? BLT 1$ ;NO-DO MORE RTS PC ;DR OF ASCII CHARACTERS (3 CHARS) ; OUTPUT: R1 POINTS ONE PAST END OF ASCII STRINT ; R2 CONTAINS THE RAD50 VALUE ; THE MOD40 COEFFICIENT TABLE COEFF: +1600. ;40. ^ 2 +40. ;40. ^ 1 +1. ;40. ^ 0 BW: .BYTE 0 ; =0 - ALL CLOSED ; =1 - BY WORD IS FORMED AS ; N=C1*40^2+C2*40+C3 ; R2,R3,R4 ARE CLOBBERED PACK00: MOV #-3,R4 ;LOOP CT. CLR R2 ;0 SUM 1$: MOVB TE OPEN, ; =2 - WORD OPEN .EVEN .SBTTL MODT TEMPORARY STORAGE CAD: 0 ; CURRENT ADDRESS DOT: 0 ; ORIGIN ADDRESS(R1)+,R3 ;GET NEXT ASCII CHAR. CMPB #' ,R3 BEQ 2$ ;"BLANK" CMPB #'$,R3 BEQ 4$ ;"$" CMPB R3,#'A BLO 3$ ;"." OR "0 XXX: .WORD 0 ;TEMPORARY STORAGE XXY: .WORD 0 ;2ND WORD OF TEMPORARY STORAGE SEQ: .BYTE 0 ;CHANGE SEQUENCE INDICATOR WDFG-9" SUB #40,R3 ;"A-1" 2$: SUB #16,R3 3$: SUB #11,R3 4$: SUB #11,R3 ; MULT R2 BY 40. ASL R2 ;2*R2 ASL R2 ;4*R2 ASL: .BYTE 0 ;SEARCH FLAG = 1 - EFFECTIVE ; = 0 - WORD S: .BYTE 0 ;SINGLE INSTRUCTION FLAG ;0 IF NOT ACTIVE�&�� .BYTE 'B ; B .BYTE 'P ; P .BYTE '@ ; @ .BYTE '> ; > .BYTE 'S ; S .BYTE 'R ; R .BYTE 'C ; C .BYTE '- ; - FOR BACKAROW MOV #25.,CC ;SET STOP COLUMN MOV R0,-(SP) MOV R0,WORDL ;SAVE THE INSTRUCTION ASR R0 ASR R0 ASR R0 AS.BYTE 'F ; F .BYTE 'I ; I .BYTE '! ; ! .BYTE 'X ; X .BYTE 'A ; A .BYTE 003 ; CTRL C .BYTE ': ; : WCS LOCATIONR R0 ;ISOLATE THE REG B FIELD BIC #^C<17>,R0 MOV R0,REGB MOV @SP,R0 BIC #^C<17>,R0 ;ISOLATE THE REG A FIELD MOV R0,RE TO OPEN .BYTE 'D ; D DUMP POINT INSERTION .BYTE 'M ; M MICRO GO .BYTE 'N ; N CHAIN TO LOADER .BYTE 'T ; T DUMP TRAGA MOV #NM,R0 ;SEARCH THE OPCODE TABLE 1$: MOV @SP,R3 ;GET THE OPCODE BIC (R0)+,R3 ;DO THE MASK ON IT CMP R3,(R0)+ ;SEECE BUFFER .BYTE '& ; & PRINT WCS REGISTER CLGT= .-LGCH ;TABLE LENGTH TL: .BYTE 'S ;DO 1 .BYTE 'P ;NOT 2 .BYTE 'M  IF IT MATCHES THE OPCODE BEQ 2$ TST (R0)+ ;SKIP THE ASCII STRING TST @R0 BNE 1$ ;IF NOT AT THE END OF THE TABLE MO;CHANGE 3 .BYTE 0 ;THE 4 .BYTE 0 ;ORDER 5 .BYTE 'C ; 6 .BYTE 'F ; 7 .BYTE 'R ; 10 .BYTE 0 ; V (SP)+,R0 ;OPCODE DOESN'T MATCH ANYTHING JSR R5,OCTOUT ;PRINT IT IN OCTAL BR 4$ 2$: MOV (R0)+,R3 ;R3 -> NAME STRING AND 11 .BYTE 0 ; 12 .BYTE 0 ; 13 .BYTE 0 ; 14 .BYTE 0 ; 15 .BYTE 0 ; 16 .BYTE 0 ; 17 .BYTE 'B CLASS # MOVB (R3)+,R4 ;R4 = OPCODE CLASS JSR PC,REPLAC ;PRINT THE NAME AND DO THE SUBS. MOV (SP)+,R0 ;GET THE ORIGINAL OPC; 20 LG = .-TL .EVEN TRTC: TRT ;TRACE TRAP PROTOTYPE ;THE ORDER OF THE FOLLOWING ENTRIES IS CRITICAL . = MODODE BACK MOV R4,OPCLAS ;SAVE OPCODE CLASS JSR PC,@DISCLS(R4) ;DISPATCH ON OPCODE CLASS 4$: MOV @#WCSDAT+2,R1 ;HIGH ORDER WOF2: .BYTE 0 ALF3: .BYTE 0 ALFE: .BYTE 40,0 SCRN: .BYTE 0 ;FLAG; 1=PASS SPACES ON FROM TTY ;ALSO, IF =1, <LF> IS ECHOET-144 ;MODT'S STACK IMMEDIATELY PRECEDES MODT UR0: 0 ;USER R0 0 ; R1 0 ; R2 0 ; R3 0 ; R4 0 ; RD HEAD: .BYTE 012 .BYTE 015 .BYTE 40 .ASCIZ /MODT V01.01/ BD: .ASCIZ /BE/ CTLU: .ASCIZ /^U/ CCST: .ASCIZ /^C/ .EVEN5 USP: 0 ;USER SP UPC: 0 ;USER PC UST: 0 ;USER ST PRI: 7 ;ODT PRIORITY MSK: 0 ;MASK LOW: 0 ;LOW LIMIT HI: 0 ;HIGH LIMIT  BIAS: .WORD 0 ;CURRENT RELOCATION BIAS MINS: .BYTE 0 ;MINUS SIGN TYPED (SWITCH) ;0=NO MINUS TYPED; 1=MINUS SIGN TYPED CNST: 0 ;CONSTANT REGISTER FORM: 0 ; FORMAT REGISTER ; IF $F=0 RELATIVE ADDRESSING ; ABSOLUTE OTHERWISE ;RELOCATION  .EVEN TMP1: .WORD 0 ;SAVE CELL CR: .BYTE 015 ; <CR> .BYTE 012 ; <LF> .BYTE '* ; * LGCH: .BYTE '; ; .BYTE '/ REGISTERS RELT: -1,-1,-1,-1,-1,-1,-1,-1 ;INITIALLY SET TO A HIGH ADDR. ; BREAK POINT LISTS, ADR1 = ADDRESS OF BREAKPOINT,CT = ; / .BYTE '\ ; \ (BACK SLASH) .BYTE 015 ; CARRIAGE RETURN .BYTE '$ ; $ .BYTE 'G ; G .BYTE 012 ; <LF> .BYTE '_COUNT, ; UIN = CONTENTS ADR1: . = .+BKP+4 CT: . = .+BKP+4 UIN: . = .+BKP+4 . = TRTC+2 .SBTTL DISASSEMBLE A M ; _ (BACK ARROW) .BYTE '< ; < .BYTE '^ ; ^ (UP ARROW) .BYTE ', ; , .BYTE 'O ; O .BYTE 'W ; W .BYTE 'E ; E ICROINSTRUCTION ; DISASSEMBLE A WCS MICRO-INSTRUCTION ; THE INSTRUCTION IS IN R0 DISASM: CLR BRADR ;INIT BRANCH ADDRESS �'�� PATCH TABLE DISCLS: .WORD CLS0,CLS1,CLS2,CLS3,CLS4 .WORD CLS5,CLS6,CLS7,CLS8,CLS9,CLS10 NOLF: .WORD 0 ;0 IF SHOULD DO CRLFTE CLS10: JSR PC,CLS4 ;DO B REGISTER BR CLS3A ; TYPE A REGISTER NAME TYPREG: MOV #REGTBL,R1 ;TABLE OF REGISTER NAMES  OTHERWISE 1 DO CR ONLY BRADR: .WORD 0 ;BRANCH ADDRESS OPCLAS: .WORD 0 ;OPCODE CLASS CC: .WORD 0 ;COLUMN COUNTER FOR OUTPUT 2$: MOV R1,R2 ;R1&R2->START OF REGISTER DEFN 1$: MOVB (R1)+,R3 ;LOOK FOR REGISTER # AFTER NAME BPL 1$ COM R3 ;ITS COMPL'EREGA: .WORD 0 REGB: .WORD 0 WORDL: .WORD 0 WORDH: .WORD 0 ;HIGH ORDER INSTRUCTION WORD MODE: .WORD 0 ;WCS ADDRESSING MODE D CMP R3,R0 BNE 2$ ;IF NOT RIGHT ONE 3$: MOVB (R2)+,R0 ;TYPE REGISTER NAME BLE 4$ ;IF END OF NAME JSR R5,FTYP ;TYPE  ;MODE=0 ADR 0-1777 MAP TO 0-1777 ;MODE=1 ADR 2000-3777 MAP TO 0-1777 ;MODE=2 ADR 3000-3777 MAP TO 0-777 ; ADR 1300THE CHARACTER BR 3$ 4$: RTS PC .SBTTL INSERT CORRECT OPCODE NAME FOR WILD CARDS ; REPLACE THE "*" CHARACTERS WITH THEE 0-13777 MAP TO 1000-1777 .SBTTL DISASSEMBLE SPECIFIC OPCODE CLASSES ; CLASS 0 - JUMP CLS0: BIC #^C<3777>,R0 ;ISOLATE THE CORRECCT CHARACTERS ; DEPENDING ON THE MASKS AND PRINT THE OPCODE. REPLAC: MOV R1,-(SP) MOV #10,-(SP) ;COUNT OF CHARS AFTER ADDRESS CLS0A: JSR R5,ZSUP ;PRINT THE ADDRESS ; CLASS 1 - NO OPERANDS CLS1: RTS PC ; CLASS 2 - CONDITIONAL BRANCHES CLSOPCODE MOV CLSTBL(R4),R1 ;GET THE CLASS FOR THE OPCODE 1$: MOVB (R3)+,R0 ;GET A CHARACTER FROM THE OPCODE NAME BEQ 3$ CMP2: MOV CAD,R4 ;CURRENT PC CMPB R4,#377 BNE 1$ ;IF NOT LAST ON PAGE ADD #400,R4 ;BR'S ON LAST WORD OF PAGE USE NEXT 1$:B R0,#'* BNE 2$ ;IF A NORMAL CHARACTER MOV (R1)+,R0 ;R0 = CHARACTER PAIR DEPENDING ON MASK BIT (R1)+,WORDL ;CHECK IF SHOU BIC #^C<177400>,R4 BIC #^C<377>,R0 BIS R4,R0 ;FORM EFFECTIVE BRANCH ADDR MOV R0,BRADR ;SAVE BRANCH EFF ADDRESS BR CLS0LD BE UPPER OR LOWER BEQ 2$ SWAB R0 ;USEE OTHERR ONE 2$: JSR R5,FTYP ;TYPE THE CHARACTER DEC @SP BR 1$ 3$: MOV (SP)+A ;PRINT IT ; CLASS 3 - LITERAL INSTRUCTIONS CLS3: ASR R0 ASR R0 ASR R0 ASR R0 ;ISOLATE THE LITERAL BIC #^C<377>,R,R1 MOV #40,R0 ;FILL WITH SPACES UNTIL SAME 4$: JSR R5,FTYP DEC R1 BNE 4$ MOV (SP)+,R1 RTS PC ; OPCODE CLASS RE0 JSR R5,ZSUP ;PRINT IT CLS3A: JSR R5,CTYPE ;PRINT A "," .WORD ', CLS9: MOV REGA,R0 ;DO A REG OPND BR TYPREG ; CLASSPLACEMENT TABLE CLSTBL: .WORD 0,0,RPL1,0,0,0,RPL2,0,RPL3,0,RPL4 RPL1: .WORD "FT, 400 RPL2: .WORD "BW, 1000 RPL4: .WORD " F, RD FROM WCS BEQ 3$ ;IF NO BITS SET CMP OPCLAS,#2 BEQ 6$ ;IF NO OPERANDS, NO COMMA DELIMITER JSR R5,CTYPE .WORD ', 6 4 - RII AND SI (B FIELD ONLY) CLS4: MOV REGB,R0 BR CLS0A ;TYPE AS OCTAL ; CLASS 5 - CCF AND LCF (A FIELD ONLY) CLS5: MO$: MOV R1,R0 ;GET VALUE IN CORRECT REGISTER JSR R5,ZSUP ;TYPE THE WORD AS 2ND OPERAND 3$: MOV CC,R2 ;NUMBER OF CHARACTERS V REGA,R0 BR CLS0A ;TYPE AS OCTAL BYTE ; CLASS 6, 7, AND 8 - A AND B FIELDS CLS6: CLS7: CLS8: MOV REGB,R0 ;DO B FIELD TO SPACE 5$: JSR R5,CTYPE .WORD 40 ;SPACE AFTER OPCODE DEC R2 BPL 3$ ;LOOP UNTIL COL 25 RTS PC ; OPCODE CLASS DISFIRST JSR PC,TYPREG BR CLS3A ;NOW A FIELD ; CLASS 10 - IW OPCODE ; THIS IS A 2 REG FORM BUT THE B REG IS TYPED AS A BY�(�� 400 RPL3: .WORD "RW, 400, "BW, 1000, "12, 2000 ; ZERO SUPRESSED OCTAL OUTPUT ROUTINE ZSUP: MOV R0,-(SP) ;SAVE THE NUMBER S TABLE LINK. 8$: TSTB @R3 ;IF ON END OF INPUT, MATCH A BNE 13$ ; BLANK TO IT SINCE IT IS AN OPTION CMPB @R2,#40 BEQ 9$TO BE CONVERTED CLR R0 ;QUOTIENT COUNTER 1$: INC R0 ;DIVIDE BY 8 SUB #10,@SP BHIS 1$ ;KEEP DIVIDING UNTIL NUMBER GOES  ;IF WAS TRAILING BLANK IN PATTERN 13$: CMPB @R2,(R3)+ BEQ 9$ ;MATCHED WITH 1ST ONE, NO ORING BIS 2(R2),R4 ;OR IN BITS FO<0 ADD #60+10,@SP ;ADD ON A '0' PLUS ONE EXTRA DIVISION DEC R0 BEQ 2$ ;IF REMAINING DIGITS ARE ZERO, QUIT JSR R5,ZSUP R THE OPCODE CHARACTER CMPB 1(R2),-1(R3) BNE 4$ ;IF DOESN'T MATCH 2ND CHAR 9$: CMP (R2)+,(R2)+ ;SKIP THE CLASS ENTRY TO TH;RECURSIVLY DO THE REMAINDER 2$: MOVB (SP)+,R0 ;TAKE A DIGIT AND PRINT IT JMP FTYP ; AND RETURN .SBTTL ASSEMBLE AN INSTRE NEXT BR 6$ ; CHARACTERS MATCHED TO THE END OF THE PATTERN 10$: TSTB @R3 BNE 4$ ;IF NOT REALLY AT END JSR PC,DELIM ;UCTION TYPES IN ; ASSEMBLE AN OPCODE AND IT'S OPERANDS TYPED IN ASMBL: INCB SCRN ;MAKE BLANKS COUNT MOV #ID,R4 ;R4->PLACLOOK FOR DELIMETER AFTER OPCODE CMPB R0,#12 BNE 14$ ;IF NOT LF OPCODE DELIMITER INC NOLF ;SKIP LF AT CRLF TIME IN LF CODE TO PUT OPCODE 1$: JSR R5,GET CMPB R0,#'0 BLT 3$ ;IF NOT ALPHA-NUMERIC CMPB R0,#'8 BLE 2$ ;IF DIGIT CMPB R0,#'A E 14$: MOV -(R5),R0 ;GET CLASS BACK FOR DISPATCH MOVB @R0,R3 CLR WORDH ;INITIALIZE HIGH ORDER WORD CLRB SCRN ;SKIP BLANBLT 3$ ;IF NOT ALPHABETIC CMPB R0,#'Z BGT 3$ 2$: MOVB R0,(R4)+ ;PUT IN THE CHARACTER CMP R4,#ID+5 ;CHECK IF NAME TOO LOKS AFTER OPCODE CMP R3,#2 BNE 12$ ;IF NOT NO OPERANDS CLASS JSR R5,GET ;GET NEXT CHARACTER AFTER OPCODE CMPB R0,#'0 NG BLOS 1$ 11$: JMP ERR 3$: MOV R0,CFLG ;TAKE DELIMITER AGAIN LATER MOV #NM,R5 ;LOOK UP OPCODE CLRB (R4)+ ;CLEAR LASTBLT 5$ ;IF NOT EXTENSION BITS CMPB R0,#'7 BLE 15$ ;GET EXTENSION BITS CMPB R0,#'A BLT 5$ CMPB R0,#'Z BLE 15$ BGT BYTE TO INDICATE END 4$: MOV #ID,R3 ;START OF TYPED OPCODE TST (R5)+ ;SKIP THE MASK BEQ 11$ ;IF AT THE END OF THE LIST  5$ 15$: MOV R0,CFLG BR 16$ ;GET EXTENSION BITS 12$: JSR PC,OPND ;GET 1ST OPERAND JSR PC,@ASMTBL(R3) ;OFF WE GO FOR THE  MOV (R5)+,R4 ;R4=OPCODE PROTOTYPE MOV (R5)+,R0 ;R0->NAME TABLE ENTRY MOVB (R0)+,R2 ;R2=OPCODE CLASS MOV CLSTBL(R2),R2 ;RCLASS JSR R5,GET ;GET DELIMITER CHARACTER CMPB R0,#', BNE 5$ ;IF END OF INPUT 16$: CALL OPND BIS R0,WORDH ;WRITE THE 2->OPCODE CLASS TABLE LIST 6$: MOVB (R0)+,R1 ;COMPARE NEXT BYTE BEQ 10$ ;IF AT END OF OPCODE PATTERN CMPB R1,#'* BEQ 8$ HIGH ORDER WORD BR 7$ 5$: MOVB R0,CFLG ;REPEAT THE CHARACTER 7$: MOV CAD,R2 CALL PUTADR ;GENERATE ADDRESS AGAIN MOV WO ;IF WILD CHARACTER FOUND CMPB R1,(R3)+ BEQ 6$ ;IF CHARACTER MATCHES BR 4$ ;NO MATCH, TRY NEXT OPCODE ; STAR ; A WILDRDH,@#WCSDAT+2 ;WRITE HIGH ORDER WORD CLR R3 ;MAKE IT LOOK LIKE A NUMBER WAS FOUND CLRB SCRN ;RESET BLANK PASS FLAG CLR  CHARACTER CAN MATCH ANYONE OF THE NEXT 2 CHARACTERS ; IN THE CLASS TABLE ENTRY. EACH STAR FOUND INCREMNTS TO ; THE NEXT CLASR5 ;MAKE IT LIKE CMD DECOD MOV SP,R2 ;MAKE R2 NON-ZERO RTS PC ASMTBL: .WORD ASM0,ASM1,ASM2,ASM3,ASM4 .WORD ASM5,ASM6,�)��  ROL R0 ROL R0 ROL R0 BIC #^C<17*20>,R0 ;ISOLATE FIELD BR ASM0A ASM9: ASM5: BIC #^C<17>,R0 ;A FIELD ONLY BR ASM0A  ;OUT OF LUCK 7$: TSTB @R1 BNE 6$ ;IF NOT AT END OF USER NAME, NO MATCH BNE 3$ ;IF DIDNT STOP ON END 5$: MOVB (R0)+,R0  ASM6: ASM7: ASM8: ASM10: JSR PC,ASM4 ;A AND B FIELDS ASM8A: JSR R5,GET ;GET COMMA BETWEEN OPERANDS CMPB R0,#', BNE ;GET THE VALUE COM R0 RTS PC .MACRO REG ID,NUM .ASCII /ID/<0><^C<NUM>> .ASCII /ID'L/<0><^C<NUM>> .ASCII /ID'H/<0ASM2B ;MUST HAVE COMMA CALL OPND ;GET 2ND REGISTER NUMBER BR ASM5 ; OCTAL NUMBER INPUT OCTIN: CLR R2 ;CLEAR NUMBER ><^C<NUM+1>> .ENDM REGTBL: REG G,0 REG RBA,2 REG RSRC,4 REG RDST,6 REG RIR,10 REG RPSW,12 REG SP,14 REG PC,16ASM7,ASM8,ASM9,ASM10 ; ACCEPT A DELIMETER DELIM: JSR R5,GET ;GET A CHARACTER CMPB R0,#12 BEQ 2$ ;IF LF CMPB R0,#', FOUND FLAG CLR -(SP) ;INITIALIZE THE RESULT 1$: JSR R5,GET ;GET A DIGIT CMPB R0,#'0 BLT 2$ ;IF NOT A DIGIT CMPB R0,# BEQ 1$ ;IF ITS A ',' CMPB R0,#40 BEQ 1$ ;IF ITS A SPACE CMPB R0,#15 BEQ 2$ ;IF CR JMP ERR ;ILLEGAL DELIMITER 2$:'7 BGT 2$ ;IF NOT A DIGIT ASL @SP ASL @SP ASL @SP SUB #'0,R0 ;ADD IN THE CURRENT DIGIT BIS R0,@SP INC R2 ;SET D MOVB R0,CFLG ;REPEAT END OF STMT DELIMITERS 1$: RTS PC ; HANDLE SPECIFIC CLASSES OF OPCODES ;JUMPS ;FOR MODE IGIT FOUND FLAG BR 1$ 2$: TST R2 BEQ ASM2B ;IF NO DIGITS FOUND MOV R0,CFLG ;SAVE LAST NON DIGIT CHARACTER MOV (SP)+,R2, IF THE JMP CROSSES INTO THE OTHER ;BANK, IT MUST BE TOGGLED ASM0: MOV R0,R1 ;SEE IF SAME ADDRESS BANK BIC #^C<10000>0 ;RETURN NUMBER IN R0 RTS PC ID: .BLKB 6 ;OPCODE HOLDING PLACE ; GET A SYMBOLIC OPERAND OPND: MOV #ID,R1 1$: JSR,R1 ADD CAD,R1 ;XOR THE PAGE BITS BIT #10000,R1 BEQ 1$ ;IF SAME, THEN NO NEED TO TOGGLE BIS #34,WORDH ;MAKE THE HIGH O R5,GET ;GET THE FIRST CHARACTER CMPB R0,#'A BLT 2$ ;IF NOT ALPHA CMPB R0,#'Z BGT 2$ MOVB R0,(R1)+ ;SAVE THE CHARACTRDER WORD TOGGLED 1$: BIC #^C<3777>,R0 ASM0A: BIS R0,R4 ;OR IN THE OPERAND ASM1: RTS PC ;NO OPERANDS ASM2: MOV CAD,R1 ;ER CMP R1,#ID+6 BLO 1$ ;IF STILL < MAX CHAR ALLOWED JMP ERR ;IF TOO MANY CHARACTERS IN NAME 2$: MOV R0,CFLG ;REPEAT ONBRANCH CMPB R1,#377 BNE 1$ ;IF NOT LAST ON PAGE ADD #400,R1 ;BR'S LAST ON PAGE USE NEXT PAGE 1$: BIC #377,R1 ;ISOLATE  DELIMITER CMP R1,#ID BEQ OCTIN ;IF NO ALPHA CHARACTERS, THEN TRY REG CLRB (R1)+ ;MARK END OF STRING MOV #REGTBL,R0 ;RPAGE NUMBERS MOV R0,-(SP) BIC #377,@SP CMP (SP)+,R1 BEQ ASM2A ;IF SAME PAGE ASM2B: JMP ERR ASM2A: BIC #^C<377>,R0 ;IS0-> TABLE OF REG NAMES 3$: MOV #ID,R1 ;R1 -> NAME READ IN 4$: MOVB (R0)+,R2 ;R2=CHARACTER FROM OPCODE TABLE BEQ 7$ ;IF AT OLATE OFFSET BR ASM0A ;ADD IT IN TO THE OPCODE ASM3: ROL R0 ;LITERAL INSTRUCTION ROL R0 ROL R0 ROL R0 BIC #^C<377END OF NAME CMPB R2,(R1)+ ; OTHERWISE COMPARE IT WITH TYPED CHAR BEQ 4$ ;IF MATCHES, TRY NEXT 6$: TSTB (R0)+ BPL 6$ ;I*20>,R0 ;ISOLATE JUST 8 BITS BIS R0,R4 ;MERGE IT IN THE INSTRUCTION BR ASM8A ;DO REGISTER ASM4: ROL R0 ;B FIELD ONLY F NO MATCH, LOOP UNTIL NEGATIVE CHAR TSTB @R0 ;SEE IF NEXT NAME EXISTS BNE 3$ ;MORE NAMES, STILL ANOTHER CHANCE BR ASM2B�*�� TOGGLE TO UPPER BANK 1$: MOV #100000,@#WCSADR ;START WCS ENABLE MOV #10000,@#WCSADR ;ENABLE WCS JSR R0,RSR ;RESTORE USER OV (R1)+,(R0)+ MOV (R1)+,(R0)+ MOV (R1)+,(R0)+ MOV (R1)+,(R0)+ JSR R5,CRLF ;BACK TO BEGINNING OF LINE .MCALL .CHAIN REGISTERS .WORD 76777 ;DO AN XFC INSTRUCTION JSR R0,SVR ;SAVE REGISTERS JMP DCD ERJMP: JMP ERR ;DUMP POINTS NOT IN YET .CHAIN WCSLOD: .RAD50 /SY WCSLODSAV/ .SBTTL SET A DUMP POINT ; SET A DUMP POINT ; THIS IS DONE BY INSERTING A JMP TO  ; TRACE ; PRINT THE CONTENTS OF THE TRACE BUFFER ALONG WITH THE INSTRUCTIONS ; WHICH WERE EXECUTED AS A RESULT OF THE MILOC 3750 AT THE ADDR SPECIFIED ; BY THE USER THEN INSERTING THE DUMP HANDLER CODE. THIS CODE ; SAVES ALL THE REGISTERS AND RECRO-CYCLES. IF NO ; INSTRUCTION WAS EXECUTED DURING THE CYCLE, THE WORD (WAIT) IS PRINTED ; IN PLACE OF THE INSTRUCTION. TRTURNS TO THE DUMP POINT ENTRY (DMPENT). DUMP: TST R3 BEQ ERJMP1 ;IF NO EXPR TYPED MOV R5,R2 CALL PUTADR ;SET UP WCS REGACE: MOV #16.,-(SP) ;NUMBER OF ITEMS IN TRACE BUFFER 1$: JSR R5,CRLF CLR @#WCSADR ;DISABLE WCS WHILE EXAMINING IT MOV #4000ISTER MOV #3750,(R2)+ ;INSERT JMP 3750,TROFF MOV #200,@R2 BIT #10000,R5 BNE 2$ ;IF SAME BANK AS DUMP CODE WILL BE MOV0,@#WCSADR MOV @#WCSDAT,R0 ;GET THE ADDRESS MOV R0,-(SP) ;SAVE ADDRESS BIC #^C<3777>,R0 MOV R0,@#WCSADR CMP MODE,#2  #234,@R2 ;IF DUMP HANDLER ISNT IN SAME BANK AS ; DUMP POINT LOCATION, THEN A TOGGLED ; JUMP MUST BE USED. THE DUMP P .ASCII /RSVC/<0><^C<2>> .ASCII /LRR/<0><^C<1>> .ASCII /TGL/<0><^C<34>> .ASCII /TROFF/<0><^C<200>> .BYTE 0,0 .EVEN BNE 4$ ;IF MODE 2 THEN ADDRESSES COME BACK CMP R0,#3000 ; 2000-3777 AND MUST BE TRANSLATED BHIS 5$ ;IF UPPER BANK, ADD 1 .SBTTL COMMANDS M, T, N ; MICGO ; ENTER MICROCODE USING THE ADR;M COMMAND. THE ADDRESS IS THE MICRO ; STARTING ADDRESS.0000 AND ALLS WELL ADD #1000-10000,R0 ;2000-2777 MUST COME OUT 3000-3777 5$: ADD #10000,R0 4$: JSR R5,OCTOUT ;PRINT THE ADDR IT IS IMPLEMENTED BY PUTING A MICROJUMP AT LOCATION ; 3001 IN THE WCS (THE 076XXX ENTRY ADDRESS) TO THE ADDRESS IN THE 'M' ;ESS JSR R5,CTYPE .WORD ': BIT #4000,(SP)+ BEQ 2$ ;IF NOT FROM WCS MODULE JSR R5,CTYPE ;TYPE A '*' TO SHOW IT ANSWERED COMMAND. PDP11 REGISTERS AND STATUS ARE PRESERVED OVER THE 'M'. MICGO: TST R3 ;CHECK IF GO EXPR TYPED BEQ ERJMP MOV R5,R .WORD '* MOV @#WCSDAT,R0 JSR PC,DISASM ;DISASSEMBLE THE WORD BR 3$ 2$: JSR R5,PRINT ; PRINT A ... .WORD NOANS 3$: M2 ;TRANSLATE ADDRESS TO BE SURE IT IS IN CALL PUTADR ; THE RANGE FOR THE ADDRESSING MODE MOV #3001,R2 CALL PUTADR ;NOWOV #60000,@#WCSADR ;TOGGLE THE TRACE BIT DEC @SP BNE 1$ ;GET NEXT TRACE ADDRESS TST (SP)+ MOV #100000,@#WCSADR ;RESET  PUT JUMP TO START OF CODE IN 3001 MOV R5,R0 BIC #^C<3777>,R0 ;GENERATE THE JUMP INST TO ADR MOV R0,(R2)+ ;PUT IN RAM CLTHE TRACE STUFF JMP DCD NOANS: .ASCIZ / (WAIT)/ .EVEN ; CHAIN ; CHAIN TO THE LOADER (WCSLOD.SAV). THE USER CAR @R2 ;ASSUME IT ISN'T NECESSARY TO TOGGLE BIT #10000,R5 BEQ 1$ ;IF NOT IN UPPER MODE 2 BANK MOV #34,@R2 ;WILL HAVE TO N THEN CHAIN BACK TO ; MODT.SAV VIA THE /N SWITCH IN THE LOADER. CHAIN: MOV #500,R0 ;CHAIN TO WCSLOD.SAV MOV #WCSLOD,R1 M�+��  ; DUMP POINT ROUTINE ; LOC 3750 OR 13750 DMPCOD: .WORD 060013+<RVAL/400&377*20> ;LL H(RVAL),RPSWH .WORD 060012+<RVAL&377*2ING MODE ; CHKMOD ; DETERMINE WHAT ADDRESSING MODE THE WCS IS USING AND SET THE MODE ; WORD APPROPRIATLY: ; MODE ACT ADR M0> ;LL L(RVAL),RPSWL .WORD 173672 ;WIW2 RPSWH,RPSWL .WORD 176776 ;OW PCH,PCL .WORD 173672 ;WIW2 RPSWH,RPSWL .WODE ; 0 4 ; 1 1 OR 3 ; 2 2 ; IT IS DONE BY EXECUTING A WCS INSTRUCTION. IF IN MODE 1, THE CODE ; AT RAM LOORD 176462 ;OW RBAH,RBAL .WORD 173672 ;WIW2 RPSWH,RPSWL .WORD 176524 ;OW RSRCH,RSRCL .WORD 173672 ;WIW2 RPSWH,C 1001 WILL BE EXECUTED. IF IN MODE 2, THE CODE IN RAM LOC ; 0001 WILL GET EXECUTED. IF MODE 4, THEN THE WCS MUST BE PLUGGED RPSWL .WORD 176566 ;OW RDSTH,RDSTL .WORD 173672 ;WIW2 RPSWH,RPSWL .WORD 176630 ;OW RIRH,RIRL .WORD 060017+<DMPEINTO ; A DIFFERENT COMPUTER AND AN 076XXX OPCODE WILL CAUSE AN ; ILLEGAL INSTRUCTION TRAP. CHKMOD: MOV #SAVE,R2 ;R2->SAVE ARENT/400&377*20> ;LL H(DMPENT),PCH .WORD 060016+<DMPENT&377*20> ;LL L(DMPENT),PCL .WORD 060013 ;LL 0,RPSWH .WORD 060012 A FOR OVERWRITTEN CODE MOV #CODE,R1 ;R1->CODE THAT WILL EITHER ADD 1 OR 2 ; TO R0 DEPENDING ON MODE MOV #WCSADR,R3 ;R3 ;LL 0,RPSWL .WORD 0 .SBTTL LOAD WCS ADDRESS REGISTER WITH ADDRESS ; PUTADR ; THE WCS ADDRESS REGISTER MUST BE LOAD->WCS STATUS REGISTER CLR @R3 ;BE SURE ITS DISABLED ; MOVE MODE DETERMINING MICRO CODE INTO WCS 1$: MOV (R1)+,(R3)+ ;SET ED WITH THE RAM ADDRESS OF THE ; MICROCODE. THE RAM ADDRESS IS NOT THE SAME AS THE LOGICAL MIB ADDRESS ; DEPENDING ON THE WCSADDRESS OF CODE BEQ 2$ ;ADDRESS OF 0 IS END OF CODE MOV @R3,(R2)+ ;SAVE WORD THAT WAS THERE MOV (R1)+,(R3)+ ;PUT IN LOW W ADDRESSING MODE SELECTED. PUTADR: MOV R2,-(SP) ;SAVE ADDRESS MOV MODE,R2 ;R2=WCS ADDR MODE (SEE COMMENTS ON WORD) ASL R2 ORD ON OPCODE MOV @R3,(R2)+ ;SAME FOR HIGH WORD MOV (R1)+,@R3 CMP -(R3),-(R3) ;R3->STATUS REG AGAIN BR 1$ ; ENABLE WC JMP @10$(R2) ;DISPATCH ON MODE 10$: .WORD 4$,1$,2$ ; MODE 2 - 3000-3777 AND 13000-13777 2$: SUB #12000,@SP BPL 4$ ;IF S AND EXECUTE THE CODE 2$: MOV #100000,-(R3) MOV #10000,@R3 ;ENABLE TO DO MICROCODE MOV @#10,-(SP) ;SAVE ILL INST TRAP ADDROINT ; HANDLER IS ALWAYS IN THE 2ND BANK 2$: MOV #DMPCOD,R0 ;R0 -> DUMP POINT HANDLER MOV #1750,R1 ;R1 -> LOC IN WCS WHETHIS NORMALIZED IT CORRECTLY ADD #12000-3000,@SP ;FIX IT AND NORMALIZE ADDRESS CMP @SP,#777 BHI 9$ ;IF OUT OF MODE 2 PAGERE IT GOES 1$: MOV #WCSADR,R2 ;R2 -> WCS STATUS REGISTER MOV R1,(R2)+ ;STORE ADDR OF INST TO STORE MOV (R0)+,(R2)+ ;STORE L ; MODE 4 - 0-1777 4$: CMP @SP,#1777 BHI 9$ ;IF OUT OF RANGE OF WCS 5$: BIC #^C<1777>,@SP ;BE SURE ADDRESS IS IN RANGEOW ORDER WORD CLR (R2)+ ;CLEAR HIGH ORDER WORD INC R1 ;NEXT WCS ADDRESS TST @R0 BNE 1$ ;IF MORE INSTR TO MOVE MOV # MOV #WCSADR,R2 ;R2 -> WCS ADDRESS RAM CLR @R2 MOV (SP)+,(R2)+ ;PUT TRANSLATED ADDRESS IN ADR REG RETURN ; MODE 1 - 21766,@#WCSADR MOV #2,@#WCSDAT+2 ;SET RSVC BIT ON END OF PROGRAM JMP DCD ;RETURN AFTER SETTING DUMP POINT ERJMP1: JMP ERR 000-3777 1$: CMP @SP,#2000 BLO 9$ CMP @SP,#3777 BLOS 5$ 9$: JMP ERR ;IF ILLEGAL WCS ADDRESS .SBTTL CHECK WCS ADRESS�,�� OR MOV R0,MODE ;R0 IS NOW THE MODE ; RESTORE ALL THE CODE TAKEN OUT OF THE WCS TO EXECUTE OUR CODE MOV #SAVE,R2 MOV #C BR 2$ ERJMP2: JMP ERR ; TABLE OF REGISTER AVAILABILITY. 0=NOT AVAILABLE AVAIL: .BYTE 0,0,1,0,1,0,1,0,1 .EVEN RVAL: ODE,R1 CLR @R3 ;DISABLE WCS 3$: MOV (R1)+,(R3)+ ;WRITE ADDRESS BEQ 4$ ;IF DONE MOV (R2)+,(R3)+ ;RESORE LOW WORD MOV (.BLKW 5 ;TABLE OF REGISTER VALUES .SBTTL MICROINSTRUCTION DEFINITIONS .MACRO OPCODE M, W, CL, N .PSECT NAMES A2=. .IF R2)+,@R3 ;RESORE HIGH WORD CMP -(R3),-(R3) ;R3->WCS STS REG AGAIN CMP (R1)+,(R1)+ ;SKIP OVER CODE WORDS TO NEXT ADDR BR 3$NB CL .ASCIZ <CL*2>/N/ A3=CL .IFF .ASCIZ <A3*2>/N/ .ENDC .PSECT OPS .IF NB M .WORD ^C<M>,W,A2 A1=^C<M> .IFF .WORD A1, 4$: RETURN 5$: RTI ;TRAP TO 10 HANDLER ; THE MICRO CODE WHICH GETS EXECUTED TO DETERMINE WHAT WCS MODE CODE: .WORW,A2 .ENDC .ENDM .PSECT OPS NM: OPCODE 174000, 0, 0, <JMP> OPCODE 174000, 4000, 1, <RFS> OPCODE 177000, 10000D 1,72412,2 ;LGL RPSW,RSVC .WORD 2,113000,0 ;ICW2 G,G .WORD 1001,72412,2 ;LGL RPSW,RSVC .WORD 1002,111000,0 ;ICW1 G,G , 2, <JZB*> OPCODE , 11000, , <JC8*> OPCODE , 12000, , <JI*> OPCODE , 13000, , <JNB*> OPCODE , 14000, , <JZ*> OPCO.WORD 0 SAVE: .BLKW SAVE-CODE*2/3 ;SAVE AREA FOR CODE REMOVED .SBTTL PRINT WCS REGISTERS ; WCREG ; PRINT CONTENTS OF SDE , 15000, , <JC*> OPCODE , 16000, , <JV*> OPCODE , 17000, , <JN*> OPCODE 170000, 20000, 3, <AL> OPCODE , 30000, , <CL>PECIFIED WCS REGISTER IN EITHER BYTE OR WORD MODE. ; IN BYTE MODE, THE TWO HALVES ARE PRINTED SEPARATLY. WORD MODE IS AS ; US OPCODE , 40000, , <NL> OPCODE , 50000, , <TL> OPCODE , 60000, , <LL> OPCODE 177400, 70000, 4, <RI> OPCODE , 70400, , UAL. THE SYNTAX IS: ; ®NAME/ - FOR WORD MODE EXAMINING ; ®NAME\ - FOR BYTE MODE WCREG: JSR PC,OPND ;GET THE OPERAND <SI> OPCODE , 71000, 5, <CCF> OPCODE , 71400, , <LCF> OPCODE , 72000, 1, <RTSR> OPCODE , 72400, 9., <LGL> OPCODE  CMP R0,#10 BGT ERJMP2 ;IF REGISTER NUMBER OUT OF RANGE TSTB AVAIL(R0) BEQ ERJMP2 ;IF NOT ONE OF THE ONES DUMPED OR ODD , 73000, , <CIB> OPCODE , 73400, , <CDB> OPCODE 176000, 100000, 6, <M**> OPCODE , 102000, , <CM**> OPCODE , 104000, , MOV RVAL(R0),-(SP) ;SAVE REGISTER CONTENTS JSR R5,GET ;GET BYTE OR WORD FLAG CMPB R0,#'/ BEQ 1$ ;IF PRINTED IN WORD MO <SL*C*> OPCODE , 106000, , <SL**> OPCODE , 110000, , <IC*1*> OPCODE , 112000, , <IC*2*> OPCODE , 114000, , <TC**DE CMPB R0,#'\ BNE ERJMP2 ;IF NOT BYTE MODE THATS IT ; PRINT REGISTER IN BYTE MODE CLR R0 BISB 1(SP),R0 ;PRINT UPPER> OPCODE , 116000, , <OC**> OPCODE , 120000, , <A**> OPCODE , 122000, , <CA**> OPCODE , 124000, , <A*C*> OPCODE 17 BYTE FIRST JSR R5,ZSUP JSR R5,CTYPE .WORD 40 ;SPACE BETWEEN HALVES MOV (SP)+,R0 BIC #^C<377>,R0 ;NOW THE LOWER BYTE 7400, 126000, 7, <CAD> OPCODE 177000, 127000, 6, <CA*I*> OPCODE 176000, 130000, , <S**> OPCODE , 132000, , <C**> OPCOESS MOV #5$,@#10 ;PUT IN ADDRESS OF OUT ILL INS HNDLR CLR R0 076700 ;ENTER MICRO-CODE MOV (SP)+,@#10 ;RESORE TRAP VECT JSR R5,ZSUP 2$: JMP DCD ; PRINT IN WORD MODE 1$: MOV (SP)+,R0 ;GET THE REGISTER CONTENTS JSR R5,OCTOUT ;PRINT 16 BITS �-�� ��݆ w� w�vw�d   7 -� w �~|w 7p�rw *?\/: ^ h��������������������������������������������������������������������������������������������������������������������������� V-P� JH  J e  !@ !;L !�444  !�H�4  %�w  �DE , 134000, , <S*C*> OPCODE , 136000, , <D*1*> OPCODE , 140000, , <N**> OPCODE , 142000, , <T**> OPCODE , 144000, , <������������������������������������������������������: @  7 w����� ` OR**> OPCODE , 146000, , <X**> OPCODE , 150000, , <NC**> OPCODE , 154000, , <SR*C*> OPCODE , 156000, , <SR**> OPC \ �X 6V �T ��w 7`^w  *7Lw w 8 ĝ&&  7 � W��w�ZODE 177000, 161000, 10., <IW*> OPCODE 176000, 160000, 6, <I**> OPCODE , 162000, , <IS**> OPCODE 177400, 166000, 7, <MI> w w l CT @  &DCc 2 w v w Z 7 w   �& �7#  �&w J w \�w�rw w T  f OPCODE , 167000, , <LTR> OPCODE 174000, 170000, 8., <*I**> OPCODE 177400, 174000, 7, <R> OPCODE , 174400, , <W> OPCODEw � w  7 w�rw�`w 7 %GE e^ w�p0  F w w l �^�7| w X7u w P7q  , 175000, , <RA> OPCODE , 175400, , <WA> OPCODE , 176000, , <OB> OPCODE , 176400, , <OW> OPCODE , 177000, , <OS> OPCO7j  w�7Y   w�w Z�-0 �2 m$  w�w 8�- �dE� %�@ E�EPw � m  DE , 177400, 1, <NOP> .WORD 0 .END MODT �������������������������������������������������������������������������������- �  � �w�Z  7 w�V w�L E 7| Z  E t|J |Cw �-R � H w w =�8 0 7b |w =�R e0�w w ,�  @w hh �b�w =�@w Dw�vC Qw =� w V w @e0�w fw `,�w 5� 7| �|  w H �^^���������������������������������������������������������������������������������������������������������������������������w ?�7 7 J7_w �`7J7E7f    w %0� %7�E `  1 W "�Ά( m7 y�B������������������������������������������������������������������������������������������������������������������������������X`  v>< 8 , "TVt F|P7��z�r {w�r7\�7VR-L�5���w %�0 w =�&w w  �w� T  w dw ,�w Xd d�`�`w 7 [�e�.��  �w  �7 ����DӋ Ї�w j.�ח/���� w X ׭$�w ^w�*���7B�� `H�RPSW�RPSWL�RPSWH�SP�SPL�SPH�PC�PCL�PCH�RSVC�LRR�TGL�TROFF��� B F >@E� 5���`�`7\ � 7,|(�"�|-B 6�w2 7* ��-� `-�!� :   -�� �  }7w�~w�l�w  `�@`b&E�`-� �e�e�w w J:�5�w >*�b w �``  �`w��?�?��7 w � L&w < e0�w Xw R,�w �w� Cå �å$� נA� �� � (WAIT)��@PPPPw j�zK\Mv B `��5��`R `�dw�w�kad �  e` �  Ëנ�e �e�e �e �ѐ �@(���������������������=��� �� MODT V01.02Tv`.g ` `�� z�(>R.�e�## E�` �#�#w�` SSK(1�BE�^U�^C�������� *;/\ $G _<^,OWEBP@>SRC-FI!XA:DMNT&SPM��CFR�������B��7 ���&7� E7�E7t�XD ����� }�7R S(Q$��� u����� u����������������������������������������  �   @w 0@ % %� w  w�hw�D  �("D  &C@AEPA&fw w  w Ĕ �7H� d -:��w ,�@w (�w � �6<BBB0L������������������E�w ��/�w w w   ` E��� ` & �5�w� w 7U�~E�rw �e�E�E��Q7 E�w �w j,� � .BCC w 0�f� *��`�`7ZT�PE� B�w�P  p� w ׭�� {U�  7 @w4d�w  �w ���������������FT�BW� F�RW�BW�12�&� �e8� w w�w w ŝŝ�E�f w .w l w lw� DP @���7� w <ŝŝ�E�f0�8�A� Z�!w�Z7X D@W*�Sˋ �\��$ˋ � � b@ dd wX�t! w �w w @e�2#ĕ�t�7 �w �w :B�e`� w ,w &;��^ĝh�7 h7g �w 80�7�A�Z�7h  $ w ,� 7P 7F @d 7  �*FHn~w w��Pjf&f: � 0��4x �77�w vw  � ,�  � �w�X7�Em5�U�E�P�W�e�E�&E�%w�E�@ @ @ @ EP @ 5�jd\Z�  < !��@� �%�� �&e�� N @ e0�w (�  � @ @ @ EE w 2,� 8� & w 0� 7� 0�P  7H�������w A� Z�W w�7| �@ HE�%~� %�% �%�?�7�J�!E� �{�`�W .Ћȋɋ�@ �G�GL�GH�RBA�RBAL�RBAH�RSRC�RSRCL�RSRCH�RDST�RDSTL�RDSTH�RIR�RIRL�RIR�/��  CA*I*� S**� C**� S*C*� D*1*� N**� T**� OR**� X**� NC**� SR*C*� SR**�IW*� I**� IS**�MI�LTR�*I**�R�W�RA�WA�OB�OW�OS�N?�.�� Qw =� w V w @�.��,e0�w fw `,�w  5� 7|�R��� &|�G�.��R �OP������������������������������������������������������������������������������������������������������������������������������|  w H ��.��x^^�w ?�7 7 J7_w �`7&� �� ^��.��J7E7f    w %0� %7��E�.�� `  1  W "�Ά( y� �� �.��m7 y�BX` �.��B�.��S�}����L������(XS�}h�S`��(p<���W8"(;����(�,������������$�.���: �  X`  "$&(���v><8,"�.��v> < 8,"e���$TVt 7 w��� ����.������� `  \ �X � �� ��.��6V �T ��w 7`^�w IF|P�.��T V t F|Pz�.��87��zQ���  ���"^�( �.��4 *7Lw w 8 ĝ&&  7?�.��Z �� �W��w�Z+����F�.��^�r {w�r7\7V5�.��R-L�5���w %�0 }�.��w =�&w w  �w� ��.��w  w l CT @  &DCc� �� �.�� 2 w v w Z 7 w   �& �7�.��#  � T  �.��w dw ,�w Xd d�`�`w d�.��7 [�e�݆ w� w�vw�d�.��  &w J w \�w�rw �.��w T  fw � w  7 w�rQ�.��w�`w 7  %G E e^� w���� 7 -�i�.��B w �~|w 7p�.��h�rw *?\/: ^ h V-P� � ��D&Nw /�\�� �w w p �E�w w�Rw w�8������������������������7 G $^��.��>p0   F w  w l ����0   �.��d^�7| w X7u w P7q 7j  � ���� �0�@�P �` ��p��q��r��s��t#��u)��v.��w3�8�=�C�J�P��& �.�� w�7Y   w�w Z�-0 �2 �.��m$  w�w 8�- �dE�.��� %�@ E�E�W�^�d�j�o�u��{�������Ģ�ȧ�̭�в�ظ�ܿ��Pw � m �.�� - �  � �w�Z(�.��"  7 w�V w�L El�.��H 7�������������������������JMP�RFS�JZB*�JC8*�JI*�JNB*�JZ*�JC*�JV*�JN*�AL|� Z  E t|�J��� |�&|��.��n |�Cw -R � H w � ��|�f�.��w =�8�CL�NL�TL�LL�RI�SI� CCF� LCF�RTSR�LGL�CIB�CDB� M**� CM**� SL*C*� SL**� IC*1*� IC*2*� TC**� OC**� A**� CA**� A*C*�CAD� 0 7b |�w =�� ��"|�R�.��R e0�w w ,�  @w hh �.���b�w =�@w DwvC�0�� .��&w  w�hw�D  �(L�.��L"D  &C@AEPA&f�.��rw w /�w w �.�� |�-B 6�w2 7* ��-*� ��|�n�.�� � `-�!� :w�.��   -��w �.��  ` E��� ` j�.��& �5�w� w l�.��7U�~ �  �?��.�� ?�� 7   w � L���    B�.��. &w < e0�w Xw R,�w E�rw �`��.�� `7ZT�PE� B�w�P�.��0  p�� w ׭� � ��� �� ��" �.��T w� Cå �å$� נA� ��l�.��z � �  e` � � ��( �.�<�.��V� {U�  �.��|7 w ŝŝ�E��)��f w .w lw l�w��   Ëנ�e �e�e �e��� �ѐ �@(���V� ��� �.�� �����������������=��� �� MODT V01.0 DP @�W���l���.���7� w <ŝT�.��ŝ�E�f dd o�.������ 1�BE�^U�^C�� ��� � �� ���� ��� �.�� �� *;/\ $G _<^,OWEBP@>SRC-FI!XA:DMNT:���6 &SPM��CFR�������Bm wX�t!� w �w w  @ef����$ �.��6 �2#ĕ�t��7 ���w �w �����"��.��� ���H � ��H �� ���^��.��^������������������������������q����p� ���J �.��J 7 ���&\ :B�e`� w ,w &;��^ĝh��� ��(�<�.�� w w��Pj�f&f: �0� ��j�p�.�� 07� E7�Ej�.��p 7t���D  w Ĕ �3��� S`����#�.�� 7H� d -:��w ,�@��4�����$�&�e�.�� x� �pt7p7tt����ptp"t&tt�.��w D� �� �*�� (�w � � 6<BBB0�.��   6<B B"B$0�.�� L��������� �w t5�ppptz��� tpp"p(t�.�� �  <�� !��@�>�������������E�w ���;� ��L�.��e�E�E��Q7 E�w ��.��*w j,� ���.��@ �%�� �&e�� N @ �.��f e0�w (�  � |�� ��|�V�.��  �@ �.��P.BCC w 0�f�� ��.�.��v *�@w4d�w  �w � ��8�.�� HtE�%~� %� ��tc�.�� �% �%�?�7v�J�!pe���v&p�.�� rE� ���������������FT�BW���"5�.��� F�RW�BW�12�&� �e8� �.��w w�rr�.��JH  J e�  !�@��� H �&�!�.�� !�;L !�44�4 � !C��� � �{�`�� ��rw�.�� �w  �7 ����DӋ�.��$ Ї�w j.�ח/���� w X �.��"��.���H ���4 � %�w  ���� H  ���t�.���  @w 0@ % %� `��J ׭r�w  ^�w�*�����r ^�&�.��p �7B�� `\ � 7,|�(�"�� �� |�T�1�� ��� `N�� � �������`r��� k�.���� ` `�� z�(>R.�e�#�)��`rW8"M��W8"Q�_� ��Q� CCF�����S`��f����f���rQ���� W8"Q��W8"V�V� ��V� LCF�����S`��l����l���sV��w 0�8�A�� ���.�� Z�!w�Z7�� D��� S`����$��.��4D@�� (>R.�.��:# E�` �#�#w�(�.��`` SSK(�I���W*�Sˋ �N� �� 0�.��Z\��$ˋ � � b@�.��7 h7g �w 80�7� #�.������ }�7R S��� "�.��(Q$��� u����� u����� ��A� �.��Z�7h  $ w ,� 7P� ���.�� 7F @d 7  �*F���&*(F ��� � ����.��  � D&Nw /�\�� ���DN �.���w w p �E�w w�Rw w�.��.��Hn~w  � ,�  ��*��Hn~  8�.�� �w�X7�Em5��B8�����g����W8"��� �����JMP�����S`����3������������ W8"���W8"�� ���RFS�����S`���-U��.��>E�P�W�e�E�&E�%|�.��dw�E�@ @ @ @ EP @ @ @ @ E�.��E w 2,��������� W8"��W8" ���� �JZB*�����S`�� �'��� �� ���� W8" ��W8"�����JC8*������ 8� & w x�.��0� 7� 0�P  7H�T� ����.��w A� Z�W w�7W g�S`���!��������� W8"��W8"�� ���JI*�����S`������������ W8"��W8"�����JNB*����.��.Ћȋɋ��� .�.��(�@ �G�GL�GH�RBA�RBAL�RBAH�RSRC�.����S`������������ W8"��W8"!�� ��!�JZ*�����S`��$����$��!���� W8"!��W8"&�� ��&���N�RSRCL�RSRCH�RDST�RDSTL�RDSTH�RI�.��tR�RIRL�RIRH�RPSW�RPSWL�RPSWH�SP��.��SPL�SPH�PC�PCL�PCH�RSVCJC*�����S`��*� ���*��&���� W8"&��W8"+�� ��+�JV*�����S`��0����0��+�w��� W8"+��W8"0�� �LRR�TG�.��L�TROFF��� B F >@E��.�� 5���`�`7}7w�~�.�� w�l�w  `��0�JN*�����S`��6����6��0�j��� W8"0��W8"5�� ��5�AL�(����S`��<����<�� 5�O��� W8"5��W8"9�@`b&E�`-I�.��2� �e�e�w w J:�5�w �.��X>*�b w �``  �`� ��F�� ��9�CL�"����S`��B����B��09�5��� W8"9��W8"=�� ��=�NL�����S`��H����H��@=���� W8"=�����~w� (WAIT)�� ���G�.��@PPPPw j�zK\Mv � �� *�.��B `��5��W8"A�� ��A�TL� ����S`��N����N��PA���� W8"A��W8"E�w� ��E�LL� ����S`��T����T��`E���� W8"E`R[� ���(�� `�dw�w������" `N��� i�����2Tv��W8"I�o� ��I�RI�����S`��Z����Z���pI���� W8"I��W8"M�g� ��M�SI�����S`��`����`���qM���� �2�� ��� W8"��W8"�� ��� S**�}����S`���[��������� W8"��W8"�z� ��� C**�����S`���U����h��6��N��� W8"6;������������������������������������������������������������������������������������������������������� W8"��W8"�p���� S*C*�/����S`���O��������� W8"��W8"�e���� D*1*�J����S`���I�������w��� W8"��W8"�Y� ��� N**�l����S`���C������g��� W8"��W8"�N� ��� T**�a����S`����=������X��� W8"��W8"�D���� OR**�����S`���7������I��� W8"��W8"�9� ��� X**�R����� W8"V��W8"[�L���[�RTSR�F����S`��r����r���t[���� W8"[��W8"a�A� ��a�LGL�����S`��x����x�����S`��0�����8��� W8"��W8"�.���� NC**�����S`��*�����)��� W8"��W8"�#���� SRua���� W8"a��W8"f�6� ��f�CIB�����S`��~����~���vf���� W8"f��W8"k�,� ��k�CDB�����S`�����*C*�����S`��$�������� W8"��W8"����� SR**�����S`���������� W8"��W8"� �����wk���� W8"k��W8"p�"� ��p� M**�����S`��������p�r��� W8"p��W8"u����u� CM**�����S`�� ���IW*�����S`���������� W8"��W8"� �� I**�C����S`�� ��� ���� W8"�W8������u�c��� W8"u��W8"{� ���{� SL*C*�0����S`��������{�S��� W8"{��W8"������ SL**�m��"��� IS**�����S`��& ���&���� W8"�W8" � �� MI�>����S`��,���,�� ��� W8" ��S`���������B��� W8"��W8"����� IC*1*�H����S`���������2��� W8"��W8"����� I�W8"� ��LTR�����S`��2����2����� W8"�W8"���*I**������S`��8���8����C*2*�@����S`���������!��� W8"��W8"����� TC**�a����S`������������ W8"��W8"� W8"�W8"� ��R�t����S`��>���>����� W8"�W8"� ��W�l����S`��D���D�������� OC**�`����S`������������� W8"��W8"�� ��� A**�����S`���y��������� W8"��� W8"�W8""� ��"RA�,����S`��J���J��"��� W8""�W8"&� ��&WA�#����S`��P���P��&|W8"����� CA**�c����S`���s��������� W8"��W8"����� A*C*�]����S`���m��������� ��� W8"&�W8"*� ��*OB�&����S`��V���V��*q��� W8"*�W8".� ��.OW� ����S`��\���\��W8"��W8"�� ���CAD�f����S`���g���������� W8"��W8"����� CA*I*�����S`���a������.f��� W8".�W8"2� ��2OS� ����S`��b���b��2[��� W8"2�W8"6� ��6NOP�����S`��h����3�� �������������������������������������������������������������������������������������������@������@��������������������������������������������������������1������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ ������������������������������������������������������������������������������������������������������������������������������������������������������������ �����������������4��  W �  6 �#;�    ,� xw vH�. ,� X ,� J  W  ;�  � �w 4S�8. MICRO-I-No errors detected�?MICRO-I-WCS has NOT been enabled������#�  �E @�Ee� @ED x� 8FV`^L����������w@- W ��w T�E.  *5��w T�^.U��weH� �# �p�DE ���2�5 �<� .� &�& �& � �ҕ:� �ҕ:� ��<��  � D @  � W �w H�.E�wPb� @E�W mv5� U�@5�:w `A�.wP*�w RA�.� E�E�B <E� �-Jan-Feb-Mar-Apr-May-Jun-Jul-Aug-Sep-Oct-Nov-Dec-�&r b !e0�T e0� ��� �d�'�ee/:w *P�.� W �e� wP  w L� /  T  F t,� z ` �;� ��#�U �M뗠.�•@�$�•[� e. N$ $ $ t� �4N& �4 �  7 zww  |f- F ~�<d e�.� 3w08]2  W ��w DR�)/� &  5 �7 �?MICRO-F-Not enough memory���&f@ $? @ѕ*�ѕ*�ѕ*�ѕ �@�Nע �є ѕ �ѕ ��w &R�?/ wp�N � Nw R�]/� ʕL�f ^��ޕH� P ��   5�� U���w T�/ w �7 7 -� � ^� W�C�U �A +� �wX@�@V  �!,�;��w T�/��(� "@ �;�  W � �-D��:��(w� W �w@w4�w 6M�/� � �>�1w S�.0f h� x�N7   w S�M0 �Z`fn+-&!w`wA w@wP w S�$ x�&@W �W w A�0�W �W W �W �W 낇�  N�R u�p� �&ba0� b� 5��w U�0 ����<�w pE�0  h `� �W ,�w BS�0@  @E 8   N�8 ���0 � 8 0P 7(�ߋ*�7 r#SYMBOL�� ?MICRO-W-Insufficient tempor-y� PR � @E-� -. ����� 2z�\bfj f e 0�`@Eary file space for cross-reference�?MICRO-F-Output error on cross-reference file�� !8!8  l�-�@ w N�0� ��'� @E �w vC�0;� �^�@B �@E-�w <N� 1� ��O��8���0 � T '-~D | >� p -&8 � �8���0 ��6  >�������� :vr w E�-�Օ �Օ �R 4 W ��A W=� 5��(& p�wBU��4UW:�#   8  *U�`�� E 8 %8   �8 ���0 � x@W ^J 5�� U��5�� w M�- w � M�-e�U�� W ��J w O�-�w �@.E.hLPRR _ T #%# ��z%v����������zRrv?MICRO-F-Errors detected: 99999 �5�� BD��7�1�9��7 � 0 B j�77 ^�   �5�1��������� @ A �@ @ @ @ � Ee0�8 w O�"1p 8 p  h-`��-X� -P�-H�w jT�O1 x V`(b$d Xw ���� @ T �7 7 7 v7 v7 t7 l7 D7 B7 48 0f�27 "�,6988�L LV< - � 8 67 `"! " ]" 8  V@ z�F!P!V!P!d!e�e� �e� ԕ � ԕ �P�0���%fE6+@` E�S�NfT  7 wA%7 �e�� ރ�J  �& A Te�5?� [ԕ �ԕ �5 bԕ �ԕ � "W!��Micro 00 10 20 30 40 50 6Vd@F@ *� @F7X7VJ$ Mz � � 6  � �0 70 �Adrs+ 01234567 01234567 01234567 01234567 01234567 01234567 01234567 01234567 �Bitmap of Microlocations Used� 舀 7 0�zX �� �7  ` ` � D+NT TT pߝ % \[t a q  f 8߄ * V T$ &# �p�8 � B zBtp7 7 ~�  vf�� b f5�h�?MICRO-F-Not enoug 6 >�# 6� .�# &�7� � 77 އ� 8  �8���0 �#h memory for symbol table�"?MICRO-F-Illegal command line�R^ N�1B�>C�@M�&N�BO� W�D������������������������������8 bߐ �?MICRO-F-Output error on listing file� MICRO V01.01 99-XXX-99 99:99:99 PAGE � � L7 $��������������������������������������������������z%* *7W��}?MICRO-F-Insufficient space for cross-reference temp w�V �8TTTTTT@ԕ �5�=�̕*� ԕ �5�� �A̕ � 5�ЕR�5�ЕT�5 �ЕX� orary file�?MICRO-F-Undefined switch "/ "�MICRO V01.01�?MICRO-F-Illegal command format�?MICRO-F-Illegal device specification�?MI �!V ԕ �ԕ � V @�E e�FBW!  ��Symbol Table��7 x � Vqҕ �  8 �CRO-F-Output device full�?MICRO-F-Input file not found�?MICRO-F-Illegal MODE switch value���������������������������������������8���0 � 0݇�8 W �7   W �ҕ �5�RW �7ݗ � � ��?MICRO-F-Error rea��������������������������������������������7  8  � �8���0 �8 x BԐ` ding input file� W �w R�1 � 5��w xR�1�U ���@ � � �.END �.PAGE �.SBTTL� .TITLE� AB AB 7^�?MICRO-F-Error writing OBJ file�-pF 6� n�,�T< e�7�@?< � 4�����������������C ABCF ABF AL AW AWC AWCF AWF CAB CABF CAD CAI CAIF CAW CAWF CB CB����������������������������������������������������������������������  -��e� E�7 Ep F CCF rCDB wCIB vCL 0CMB CMBF CMW CMWF CW CWF DB1 DB1F DW1 DW1F EMPTY2�EM�6��  �SPL � �SPH � �PC ��PCL ��PCH ��I4 ��I5 ��I6 ��C ��V ��Z ��N ��C8 MEMORY REGISTERS R0-R5 ARE RESTORED FROM THAT STACK BY POPR ; THIS PROGRAM TAKES INTO CONSIDERATION... ; 1) LOCATIONS 3000-3��C4 � �ZB �@�NB ��UB ���LB ��UBC ��LBC ��RMW ��TG6 ��TG8 ��LRR $��RSVC $��TROF004 ARE SPECIAL LOCATIONS THAT MUST ; RESERVED. ; 2) USE OF THE G REGISTER AS AN INDIRECT ; POINTER TO THE LSI BASE MACF $��TGL $������������������������������������HINE ; REGISTERS ; 3) USE OF A SIMPLIFIED DECODING TECHNIQUE TO ; DETERMINE IF THE PROPER INSTRUCTION HAS BEEN ; EXPTY3�END �IB IBF ICB1 ICB1F ICB2 ICB2F ICW1 ICW1F ICW2 ICW2F ISB ISBF ISW ISWF IWMissing or illegal END statement�Multiple definition of label "@"�Symbol "@" previously defined as label�O IWF JC8F JC8T JCF JCT JIF JIT JMP ��JNBF JNBT JNF JNT JSR �JVF JVT JZpcode "@" not found�Illegal extension bits on pseudo-op�Syntax error�Illegal Translation name�Symbol "@" not defined as a TranslBF JZBT JZF JZT LCF sLGL uLL `LOC �LTR MB MBF MI MODE �MW MWF NB NBation�Extension field value exceeds 8 bits�Possible subroutine return linkage error�Address out of range�Conditional jump to offF NCB NCBF NCW NCWF NL @NOP NW NWF NXT10 NXT100?NXT2 NXT20 NXT200NXT4 NXT40 NX-page label�Literal value exceeds 8 bits�Illegal register name�Register expression made even�Register name "@" greater than 5 chT400OB OCB OCBF OCW OCWF ORB ORBF ORW ORWF OS OW PAGE �R RA REG � RFaracters�Translation mnemonic "@" first character is not alphabetic�Translation mnemonic "@" is used elsewhere as symbol�Illegal pRFS RI pRIB1 RIB2 RIW1 RIW2 RTSR tSB SBC SBCF SBF SBTTL � SF qSI qSLB SL WCS addressing mode�Illegal address for mode�Illegal operator in expression�Missing Close Paren�Close paren without matching opBC SLBCF SLBF SLW SLWC SLWCF SLWF SRB SRBC SRBCF SRBF SRW SRWC SRWCF SRWF SW SWen paren�Symbol "@" is undefined�Illegal element in expression�Missing comma after operand�Error in numeric constant�Illegal ASCC SWCF SWF TB TBF TCB TCBF TCW TCWF TITLE � TL PTRAN � TW TWF W WA WIII character�Illegal number radix�Attempt to redefine previously-used location�Predefined PLA translation at this microlocation�B1 WIB2 WIW1 WIW2 XB XBF XW XWF ������G ���GL ���GH ��RBA ��RBAL ��RBAH ��Illegal register value�Register "@" previously declared as a label��������������������������������������������������������������RSRC ��RSRCL ��RSRCH ��RDST ��RDSTL ��RDSTH ��RIR ��RIRL ��RIRH � �RPSW � �RPSWL � �RPSWH � �SP � TITLE PUSHR AND POPR INSTRUCTIONS ; ; ; MAIN MEMORY REGISTERS R5-R0 ARE SAVED ON THE MAIN MEMORY ; STACK BY PUSHR. ; MAIN �7�� 6700 ; POPR=076701 ; NOTE BELOW THE ORDER IN WHICH THE TWO HALVES ; OF THE USER MICRO-INSTRUCTION ARE ANALYZED. WHEN THE ;THIS PROCESS REQUIRES TWO INSTRUCTIONS ; 1) PUT THE DESTINATION ADDRESS ONTO THE LINES (W INSTRUCTION) ; 2) PUT THE DATA ON TH INSTRUCTION IS COPIED INTO THE MICRO MACHINE, THE TWO ; HALVES ARE REVERSED FROM THE WAY IN WHICH LSI-11 16 BIT ; WORDS EXISTE LINES (OW INSTRUCTION) W SPH,SPL ;PUT THE DESTINATION ADDRESS ONTO THE ;DATA LINES.(I.E. HEY ADDRESS I ;AM ABOUT . DECODE: CL 175,RIRL ;COMPARE LEFT MOST 8 BITS OF INSTR ;REGISTER AGAINST 175.(LOOKING FOR ;0764XX) JZBT DECON ;ITO SEND YOU SOME DATA. OW GH,GL ;HERE IS THE DATA I ADVERTISED BY THE ;W INSTRUCTION. DB1 RIRL,RIRL ;DECREMENT THE LOOF Z BIT TRUE THEN SUCCESSFUL COMPARE. DECTRP: JMP 0 ;TRAP ILLEGAL OPCODES DECON: CL 301,RIRH ;COMPARE RIGHT MOST 8 BITS OF INP COUNTER BY TWO. JNBF PUSHLP ;LOOP IF COUNTER HAS NOT GONE NEGATIVE ; NOW THAT THE PUSHR INSTRUCTION HAS BEEN EMULATED IT STR ;REGISTER AGAINST 301.(LOOKING FOR ;XXX301) JZBT POPR ;IF Z BIT SET HAVE FOUND 076701 ;STILL MAY BE PUSHR CLIT TIME ; TO RETURN TO THE BASE MACHINE. THIS IS ACCOMPLISHED BY SETTING ; THE RSVC BIT. AFTER AN INSTRUCTION SETS THIS BIT, 300,RIRH ;COMPARE RIGHT MOST 8 BITS OF INSTR ;REGISTER AGAINST 300.(LOOKING FOR ;XXX300) JZBF DECTRP ;IF Z BIT CLE ONE MICRO MACHINE ; CYCLE IS NECESSARY BEFORE THE WCS IS ACTUALLY EXITED. ANY ; INSTRUCTION CAN CAUSE THE RSVC BIT TO BE SETECUTED. ; 4) A SIMPLIFIED TECHNIQUE FOR RETURNING CONTROL ; TO THE BASE MACHINE UPON COMPLETION OF THE ; REQUESTED FUNAR WE HAVE FAILED ; PUSHR: LL 5,RIRL ;PUT A 5 IN RIGHT MOST 8 BITS OF INSTR ;REGISTER. SINCE INSTRUCTION ALREADY ;CTION ; 5) AN ILLUSTRATION OF MEMORY ACCESS PWRUP =0 MICINT =3 LOC 3000 JMP 0 ;TRAP ILLEGAL OPCODES 00022X JMP DDECODED IT IS NOW AVAILABLE AS SCRATCH PUSHLP: LGL RIRL ;PUT RIGHT MOST 3 BITS OF RIGHT HALF OF ;I.R. INTO G REGISTER. THECODE ;ALL 076XXX INSTRUCTIONS CAUSE WCS LOCATION ;3001 TO BE EXECUTED. MUST GO DETERMINE ;IF THIS IS THE INSTRUCTIOIS WILL BE ;BOTH AN INDERECT POINTER TO THE BASE ;MACHINE REGISTERS R5-R0 AND A ;LOOP COUNTER AL 376,SPL ;DECRN WE WANT. JMP PWRUP JMP 0 ;TRAP ILLEGAL OPCODES 075040-075777 JMP MICINT ;LOC 3004 IS ACCESSED IF THE RSVC BIT HAS EMENT LSI-11 STACK ;POINTER BY 2 CDB SPH ;SEE IF PROPOGATION TO HIGH ORDER 8 BITS ;IS NECESSARY. ; ;NOTE THAT THE ;BEEN SET AND INTERNAL FLAG I6 HAS BEEN ;AND A LINE INTERRUPT OR A DEVICE INTERRUPT ;IS PENDING. ;TO PERFORM INT ABOVE TWO INSTRUCTIONS COULD HAVE BEEN ACCOMPLISHED BY ;TWO DW1(DECREMENT WORD) INSTRUCTIONS. HOWEVER, EACH DECREMENT WORD INERRUPT SERVICE, IT ;IS NECESSARY TO LEAVE MICROCODE. ;THE USE OF THIS LOCATION WILL NOT ;BE DEVELOPED BY THIS EXASTR ;REQUIRES TWO MICROMACHINE INSTRUCTIONS WHEREAS AL(ADD LITERAL) AND ;CDB(CONDITIONAL DECREMENT BYTE) EACH REQUIRE ONLY ONEMPLE. ;SEE THE BLOCK MOVE PROGRAM ;FOR AN ILLUSTRATION OF ITS USE. ; ;FIRST DETERMINE IF A PUSHR OR POPR ; PUSHR=07 MICROMACHINE INSTRUCTION ; THE NEXT FEW INSTRUCTIONS ACTUALLY MOVE THE USER PROCESSOR REGISTERS ; ONTO THE STACK. NOTE THAT �8��  IS RETURNED ;"MAINLINE" ;NOW THE POPR INSTRUCTION. NOTE THAT THIS INSTRUCTION ;STARTS THE RESTORE OPERATION TO R0 UPWAR�DS TO R5 POPR: LL 0,RIRL ;PUT A 0 IN LOWER 8 BITS OF ;INTERNAL INSTRUCTION REGISTER ;SINCE THE INSTRUCTION HAS ALREA;THIS IS AN LSI-11 MICRO CODE SUBROUTINE ;TO MOVE A BLOCK OF MEMORY FROM ONE PLACE TO SOME PLACE ;ELSE. ; THIS ROUTINE ILLUSTDY ;BEEN ANALYZED THIS IS A SCRATCH ;REGISTER. POPLP: LGL RIRL ;PUT THE LOW ORDER THREE BITS OF ;I.R. INTO THE RATES... ; 1) HOW A LONG RUNNING MICROCODE SUBROUTINE ENSURES THAT ; PENDING INTERRUPTS GET SERVICED IN A TIMELY FASHION. G REGISTER. ;THIS IS TO BE USED BOTH AS AN ;INDIRECT POINTER TO THE BASE ;MACHINE REGISTERS R0-R5 AND ;AND A; THE INPUT PARAMETERS ARE ; R0:SOURCE ADDRESS ; R1:DESTINATION ADDRESS ; R2:NR. OF WORDS TO BE MOVED LOC 3000 JMP 0 JLSO AS A LOOP COUNTER. RIW2 SPH,SPL ;HEY ADDRESS (TOP OF SP) PUT ;YOUR CONTENTS ON THE DATA LINES. ;TAKES SEVERAL MMP MOV JMP 0 ERROR: JMP 0 LOC 3004 ;UNNECESSARY,JUST FOR CLARITY. ;AN INTERRUPT HAS OCCURRED. MUST SUSPEND THIS OPERATIOICRO MACHINE CYCLES FOR ;MEMORY TO RESPOND (I.E. FOR THIS ;INSTRUCTION TO COMPLETE). ONCE ;MEMORY HAS RESPONDED N ;IN SUCH A WAY AS TO ALLOW THE OPERATION TO BE RESUMED RATHER ;THAN RESTARTED AFTER THE INTERRUPT HAS BEEN PROCESSED ;TO ACONE ADDITIONAL ;MICRO MACHINE CYCLE IS REQUIRED ;BEFORE THE CONTENTS ARE GATED ONTO ;D.A.L.s. TAKE ADVANTAGE OF COMPLISH THIS IT IS NECESSARY TO UPDATE THE INPUT PARAMETERS ;AND BACK UP THE BASE MACHINE PROGRAM COUNTER, THEN EXIT ;MICROCOTHIS BY... ICB1 RIRL,RIRL ;POINT THE G REGISTER CONSTANT AT ;THE NEXT GENERAL REGISTER. IW ,G ;PULL WORD OFF THE D.A.LDE. IN THIS WAY THE INTERRUPT WILL BE PROCESSED, AND ;THE NEXT INSTRUCTION FETCH WILL AGAIN EXECUTE THE 076000 INSTRUCTION ;O INTO THE ;SPECIFIED GENERAL REGISTER. CL 6,RIRL ;HAVE ALL GENERAL REGISTERS BEEN ;RESTORED? JZBF POPLP ;IF N.E.NLY NOW WITH UPDATED VALUES IN THE SOURCE, DESTINATION, AND SIZE ;PARAMETERS LL 0,RIRH ;UPDATE LSI-11 R0 TO POINT TO LGL RI SO THAT IN PRACTICE ; ONE CAN USE THE LAST TWO INSTRUCTIONS IN A MICROPROGRAM TO PERFORM ; USEFUL TERMINATING FUNCTIONS. THE ON TO NEXT ONE NOP RSVC ;SEE TERMINATION OF PUSHR INSTRUCTION ABOVE ;FOR COMMENTS NOP ; THE ABOVE TWO NOP'S COULD BESE MIGHT INCLUDE SETTING STATUS BITS ; ETC. (SEE BLKMOV IN SECTION 8.6.8 FOR AN ILLUSTRATION) ; IN THIS EXAMPLE THERE IS NOTH ACCOMPLISHED BY JUMPING TO THE SAME CODE ; IN THE TERMINATION OF PUSHR. THIS WOULD REQUIRE TWO MORE MICRO- ; MACHINE CYCLESING LEFT TO BE DONE, SO THE ; PROGRAM IS TERMINATED BY TWO NOP'S. NOP RSVC ;RETURN TO BASE MACHINE. THIS ;INSTRUCTION (JMP TAKES TWO CYCLES) BUT WOULD CONSUME ONE FEWER WORD ; OF WCS. ; .END ������������������������������������������������� REQUIRES A ONE CYCLE ;DELAY WHICH IS ACCOMPLISHED BY ... NOP ;AFTER EXECUTION OF THIS SECOND ;INSTRUCTION CONTROL��9�� 376,PCL,RSVC ;DECREMENT BASE MACHINE PC BY TWO CDB PCH ;AND EXIT MICROCODE ;PROCESS THE BLOCK MOVE INSTRUCTION MOV: CL 175,�RIRL ;LEGAL INSTRUCTION? JZBF ERROR AL 100,RIRH ;IF LEGAL C8=1 JC8F ERROR LL 0,RIRH ;COPY CONTENTS OF LSI-11 R0 LGL RI�RH ; INTO MICRO-REG RSRC MW G,RSRC ;GET SOURCE BLOCK ADDR LL 1,RIRH ;COPY CONTENTS OF LSI-11 R1 LGL RIRH ; INTO MICRO-REG ;FIS AND EIS MICROCODE FOR THE LSI-11 ;**************REVISION:10******************** ;R. LARY SEPT 15,1974 ;COPYRIGHT RDST MW G,RDST ;GET DEST BLOCK ADDR ;FROM THIS POINT ON LL 2,RIRH ;MICRO REG G WILL ALWAYS POINT TO LGL RIRH ; LSI-11 (C) 1975 ; ;DIGITAL EQUIPMENT CORPORATION ;MAYNARD, MASSACHUSETTS 01754 ; ;THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CREG R2 (WORD COUNT REG) TW G,G ;IS THE WORD COUNT REG (R2) = 0? JZBT EXIT LOOP: RIW2 RSRCH,RSRCL ;PUT SOURCE ADDR. ON DATA HANGE WITHOUT ;NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY ;DIGITAL EQUIPMENT CORPORATION. TITLE TO AND OWNERSHIP OFACCESS LINES. ;(ALSO BUMPING SOURCE ADDR POINTER). DW1F G,G ;TAKE ADVANTAGE OF IDLE TIME TO UPDATE ;CONTENTS OF LSI-11 THE ;SOFTWARE SHALL AT ALL TIMES REMAIN IN DIGITAL. ;REVISION HISTORY ;REV REASON ;10 9-15-75 FMUL TRAPS WHEN RESULT IS R2 IW ,RBA ;COPY SOURCE OPERAND INTO SCRATCH WIW2 RDSTH,RDSTL ;THEN MOVE WORD BACK OUT TO DEST OW RBAH,RBAL ; BLOCK ALSO  EQUAL TO 2EXP-128 BUT SHOULD ; ONLY TRAP WHEN RESULT IS LESS THAN 2EXP-128,TEST FOR ; UNDER FLOW WAS CORRECTEBUMPING DEST ADDR SI I6 ;THIS FLAG ALTERS THE INTERRUPT DECISION CHAIN ;SUCH THAT AFTER THE EXECUTION ;OF A MICRO CODD-LINES 342-407-408-409 ;9 8-25-75 IF ARG2=0,FADD AND FSUB GAVE WRONG RESULTANT SIGN IF ARG1 ; WAS NEGATIVE. SWAPPED THE TWO E RSVC, CONTROL ;WILL BE RETURNED TO THE MICROCODE ;IN ONE OF TWO WAYS. IF AN INTERRUPT ;IS PENDING CONTROL WILL GO SLB'S AROUND AT NOADD. ;8 6-20-75 FIX BIZARRE BUG IN EIS WITH A SM OF 0 AND A DEST. REG OF ; 2,3,6,OR 7 THAT CAUSED T BIT TO  ;TO MICRO LOCATION 3004. IF NO ;INTERRUPTS PENDING CONTROL WILL ;GO TO THE INSTRUCTION FOLLOWING ;THE RI INSTRUCCOME ON WITH ; AN INTERRUPT ABORT.OR PS BIT 7 GOT SET WHEN THE INSTRUCTION ; COMPLETED. PROBLEM SOLVED BY INSERTING MISSING TION. NOP RSVC ;EXIT TO SERVICE ANY INTERRUPT RI I6 ;RESET FLAG ;CONTROL RETURNS HERE IF NO ;INTERRUPT. JZF LOOP ;LTR AT ; MPYAS0 AND DVASC0 ;7 5-5-75 CLEAR RPSWL AT ALL EIS & AND FIS EXIT POINTS TO ELIMINATE ; REGISTER CONFLICT WITH REFIF ANY MORE WORDS, MOVE THEM. EXIT: NOP RSVC ; ELSE, RETURN TO BASE MACHINE NOP .END �������������������������������������RESH AND ODT "M" COMMAND ;6 4-9-75 ADD USER OPCODE BREAKOUT ;5 3-1-75 UPDATE FOR LSI-11 CPU. REVISE ROM CODES AND REMOVE OS INRH ; NEXT SOURCE WORD MW RSRC,G LL 1,RIRH ;UPDATE LSI-11 R1 TO POINT TO LGL RIRH ; NEXT DESTINATION WORD MW RDST,G AL ��:�� ;FIS AND EIS GO IN ROM CHIP 3 FIS: LGL RIRH ;LOAD G REGISTER WITH FLOATING STACK R GH,GL LTR RPSWH,RPSWH ;SAVE PS IN TR,E1 MW M1,E2 ;SWAP HIGH ORDERS LL 100,M1L SLBF SIGNS,SIGNS ;SWAP HIGH ORDER BITS OF "SIGNS" CABF M1L,SIGNS ;LEAVING THE IW 0,E1 ;GET HIGH WORD OF FIRST ARGUMENT ICW2 G,M2 ;G MAY NOT BE CHANGED UNTIL END! RIW2 M2M,M2L ;READ SECOND WORD OF  CARRY CLEAR MW M2,M1 ;NOW SWAP LOW ORDER WORDS USING THE ICW2 G,M2 ;IN-CORE COPY OF THE ARG1 LOW-ORDER R M2M,M2L ;TO RST. ;4 MISSING EII TRANSLATION AT LOCATION 2073 ;3 ADDED ROM CODES TO FIX BG PROBLEM WITH FMUL/FDIV ;2 CHANGED EII AND FIIFIRST ARGUMENT IW 0,M1 SLBF M1H,M1H ;GET THE EXPONENT OF ARG1 INTO EXP1 SLBCF EXP1,EXP1 ;AND THE SIGN INTO THE CARRY  LOCATIONS BECAUSE OF TRANSLATIONS ; OCCURRING ON CONDITIONAL JUMPS ;DEFINITIONS OF SYMBOLS WHOSE MASTER DEFINITIONS ARE IN ;Z NOW INDICATES IF FIRST ARG IS ZERO TL 360,RIRH ;TEST FOR MULTIPLY OR DIVIDE FMDJMP: JZBF FMLDIV ;OR ILLEGAL INSTRUCTION  THE ;MAIN MICROCODE ASSEMBLY: MTRAP= 1401 ;PLACE TO GO TO CAUSE AN INTERNAL CPU TRAP ;DEFINITIONS OF TRANSLATIONS U ;FLOATING ADD OR SUBTRACT RIW2 M2M,M2L IW 0,E2 ;GET FIRST WORD OF SECOND ARGUMENT R M2M,M2L IW 0,M2 ;AND SECOND WSED BY THIS MICROCODE TRAN EII; EIS INTERRUPT TEST (ALSO USED FOR FADD/FSUB) ;GO TO EIILOC IF ANY BR'S ARE PENDING TORD OF SECOND ARGUMENT JZT FSTZRO ;Z STILL SET FROM ARG1 - JUMP IF ZERO LL 3,SIGNS ;INITIALIZE SIGNS WORD TO SET ;CARRAN FII; FIS INTERRUPT TEST FOR FMUL AND FDIV ;GO TO FIILOC IF ANY BR'S ARE PENDING TRAN DMW; DESTINATION TRANSLATION FORY AS WE SHIFT INTO IT SRBCF SIGNS,SIGNS ;SAVE ARG1 SIGN AND SET CARRY SRBC M1H,M1H ;SET NORMALIZE BIT IN MANTISSA TL 10,R EISM0 ;GO TO DM0 THRU DM7 BASED UPON TR BITS 5 THRU 3. TRAN PSW; PSW TRANSLATION THAT REGENERATES BIT 7 AND T BIT ;RIRH ;LOW BYTE OF FIS INST IS 00R FOR FADD, JZBT NOTSBT ;01R FOR FSUB - NEGATE ARG1 SIGN IF AL 200,SIGNS ;INSTRUCTION WAS GO TO RESTPS UNCONDITIONALLY TRAN RET; RETURN TRANSLATION FOR PSW ABOVE ;LC GETS RR ;REGISTER DEFINITIONS FOR FIS M1=FSUB NOTSBT: SLBF M2H,M2H ;NOW SEPARATE SECOND ARGUMENT, PLACING SLBCF EXP2,EXP2 ;ITS EXPONENT IN EXP2 AND ITS SIGN IN C.  RBA ;LOW WORD OF ARG 1 M1M= M1+1 ;MEDIUM BYTE OF ARG 1 MANTISA M1L= M1 ;LOW BYTE OF ARG1 MANTISSA E1= RSRC ;HIGH WORD OFJZT NOADD ;EXP2=0 MEANS SECOND ARGUMENT IS ZERO SRBCF SIGNS,SIGNS ;PUT ARG2 SIGN NEXT TO ARG1 SIGN IN "SIGNS" SRBC M2H,M2H  ARG1 EXP1= E1+1 ;ARG 1 EXPONENT - ALSO RESULT EXPONENT M1H= E1 ;HIGH BYTE OF ARG 1 MANTISSA M2= RDST ;LOW WORD OF ARG 2  ;AND SHIFT THE NORMALISE BIT INTO ARG2 ;SIGN OF ARG2 IN HIGH BIT OF "SIGNS", SIGN OF ARG1 NEXT TO IT. ;SWAP ARGUMENTS IF ARG2M2M= M2+1 ;MEDIUM BYTE OF ARG 2 MANTISSA M2L= M2 ;LOW BYTE OF ARG 2 MANTISSA E2= RPSW ;HIGH WORD OF ARG 2 EXP2= E2+1 ;ARG>ARG1 CWF E2,E1,,EII; ;COMPARE EXP AND HIGH MANTISSAS JZF KLUD ;IF HIGH WORDS ARE EQUAL, CWF M2,M1 ;USE LOW WORD AS TI 2 EXPONENT M2H= E2 ;HIGH BYTE OF ARG 2 MANTISSA SIGNS= RIRL ;SIGN BITS OF ARG 1 AND ARG 2 LOC 2770 JMP 0 LOC 2000 EBREAKER KLUD: JCF NOSWAP ;DON'T SWAP IF ARG2<=ARG1 IN MAGNITUDE MW E1,M1 ;DESTROY M1 WHILE SWAPPING (LACK OF REGS) MW E2�;�� IFTING AS WE GO SBC EXP2,EXP2 ;PUT ROUNDING BIT IN EXP2, EXTENDED NOSHFT: AWF M2,M1 ;ADD ARG2 MANTISSA TO ARG1 MANTISSA AB;COME HERE IF ADD CAUSES FLOATING POINT OVERFLOW OVFLO: LL V,SIGNS ;CONDITION CODES FOR OVERFLOW JMP FISTRP ;CAUSE FLOATICF M2H,M1H TB SIGNS,SIGNS ;WERE SIGNS UNLIKE? JNBT NORMTS ;YES - MAY NEED TO NORMALIZE RESULT JCF ADROND ;OPERATION WAS NG POINT TRAP NORMTS: JNT ADROND ;IF RESULT NORMALIZED, WE'RE DONE. LL 2,M2L ;ELSE INITIALIZE SHIFT COUNTER SRBF EXP2,EXPADD - JUMP IF NO CARRY SRBCF M1H,M1H ;ADD CARRIED - DIVIDE RESULT MANTISSA SRWCF M1+1,M1+1 ;BY 2, CREATING NEW ROUND BIT 2 ;SHIFT RESULT LEFT ONE PLACE, SLWCF M1,M1 SLBC M1H,M1H ;SHIFT ROUND FLAG INTO LOW-ORDER BIT JNBT EONORM ;CHECK FOR NORICB1 EXP1,EXP1 ;BUMP RESULT EXPONENT SBC EXP2,EXP2 ;AND SAVE NEW ROUND BIT ADROND: SWF EXP2,M1 ;ROUND RESULT SBCF EXP2,M1HMALIZED NOW JZBF NORMLP ;NOPE - MORE THAN A BYTE OFF? JZT FSTOR0 ;YUP - CHECK FOR ZERO FRACTION SL1B: MBF M1M,M1H ;FRACT SBCF EXP2,EXP1 JZBT OVFLO ;IF EXP1 GOES TO 0, ITS AN OVFLO ADDONE: AL 300,SIGNS ;RESTORE ARG1 SIGN IN NEXT-TO-HI BIT SLION IS NOT ZERO - SHIFT IT A BYTE MB M1L,M1M ;TO THE LEFT. LL 0,M1L AL 10,M2L ;BUMP THE SHIFT COUNTER BY 8 JZT SL1B ;EPLACE THE ONE WE DESTROYED IW 0,M2 NOSWAP: AL 100,SIGNS ;SIGN BIT OF "SIGNS" IS 1 IF SIGNS UNEQUAL JNBF SAMSGN ;JUMP IF B SIGNS,SIGNS ;PUT SIGN OF RESULT IN CARRY NOADD: SLB M1H,M1H ;SHIFT OFF RESULT NORMALIZE BIT SLBF SIGNS,SIGNS ;ENTER HERLIKE SIGNS OCBF M2H,M2H ;SIGNS UNLIKE - NEGATE THE SMALLER MANTISSA TCW M2,M2 ;AND SET CARRY CIB M2H ;NOW ITS TIME TOE FROM FMUL AND FDIV TO STORE RESULT FISSTO: SRWCF E1+1,E1+1 ;INSERT RESULT SIGN AND CLEAR C BIT FISST1: AL 4,GL CIB GH ; ALIGN THE SMALLER MANTISSA SAMSGN: SB EXP1,EXP2 ;EXP2 NOW CONTAINS EXP DIFFERENCE JZBT NOSHFT ;IF DIFF IS 0, MANTISSAS ARBUMP STACK REGISTER TO RESULT W GH,GL,LRR,PSW ;GET THE PS BACK VIA A TRANSLATION OW EXP1,M1H ;WRITE FIRST RESULT WORD SRB E ALIGNED ALGLP1: CL 370,EXP2 ;CAN WE SHIFT A BYTE? JC8T SHFTLX ;(WE MUST HAVE ONE SHIFT LEFT AFTER) MB M2M,M2L ;EVIDENTLM1H,M1H ;GET LOW EXPONENT BIT OUT OF SIGN JMP FISST2 LOC 2554 ;PATCH FOR REV. 7 FISST2: ICW2F G,M2 ;GET POINTER TO 2D Y WE CAN - MOVE 'EM DOWN MB M2H,M2M SBC M2H,M2H ;EXTEND SIGN FROM CARRY INTO HI BYTE AL 10,EXP2 ;BUMP ALIGN COUNT CL 3RESULT WD, CLEAR C LL 0,RPSWL ;MUST BE CLEARED FOR REFRESH JMP FISST3 LOC FISST1+6 FISST3: W M2M,M2L OW M1M,M1L,RSVC 60,EXP2 ;IS IT IMPOSSIBLY LARGE? JC8T ALGLP1 ;NO - KEEP ALIGNING JMP ADDONE ;YES - RESULT IS ARG1 SHFTLP: SLBF SIGNS,RI;WRITE SECOND RESULT WORD ORBF M1H,EXP1 ;SET Z AND N FROM RESULT ;COME HERE IF FIRST ARGUMENT ZERO - RESULT IS SECOND ARGUMRH ;PUT SIGN OF ARG2 IN CARRY ;NOTE THAT LOW 6 BITS OF RIRH STAY 00 FOR EII! SHFTLX: SRBCF M2H,M2H,,EII; ;SHIFT ARG2 MANTISSENT FSTZRO: MW M2,M1 ;MOVE THE SECOND ARGUMENT SLBF M2H,M1H ;INTO THE RESULT REGISTERS SLBCF EXP2,EXP1 ;TEST THE RESULTA RIGHT ONE SRWCF M2+1,M2+1 ;WITH OVERFLOW BIT GOING INTO CARRY ICB1 EXP2,EXP2 ;COUNT DOWN ALIGN COUNTER JZBF SHFTLP ;SH EXPONENT JZF FISSTO ;AND IF IT IS ZERO, FSTOR0: SWF E1,E1 ;GENERATE A "CLEAN" DOUBLEWORD ZERO. SW M1,M1 JMP FISST1 �<��  FISTP1: LL 0,RPSWL ;MUST BE CLEARED FOR REFRESH JMP MTRAP ;GO TO COMMON TRAP ROUTINE ;FLOATING MULTIPLY ROUTINE ;BECAURG1 SIGN SRB M2L,M2H ;MOVE HIGH MANTISSA BYTE AND INSERT AL 200,M2H ;NORMALIZE BIT INTO ARG2 MANTISSA TL 10,RIRH,,FII; ;SE OF A PAUCITY OF FILE REGISTERS, FLOATING MULTIPLY & DIVIDE ;STORE THE PDP-11 PC ON THE STACK AND USE THE PC AS A ;GENERAL FTIME TO SEPARATE MULTIPLY AND DIVIDE FDVJMP: JZBF FDIV ;DIVIDE - GO TO DIVISION MICROCODE ;MULTIPLY-SPECIFIC OPERATIONS - ADDILE REGISTER. THIS MEANS THAT FLOATING MULTIPLY ;NEEDS RATHER SPECIAL INTERRUPT HANDLING. ;THERE ARE ACTUALLY TWO COMPLETE  EXPONENTS TO GET TRIAL ;RESULT EXPONENT AND SEE IF EITHER ARGUMENT HAS ONLY SEVEN BITS ;OF PRECISION. ;WE ALSO CHECK FOR TMULTIPLY LOOPS IN THIS ROUTINE - ;THE "FAST" ONE IS USED IF ONE OF THE ARGUMENTS HAS ;FEWER THAN 8 FRACTION BITS, OTHERWISE THHE RESULT EXPONENT BEING OUT OF THE ;RANGE [-177,+200], AND GIVE UNDERFLOW OR OVERFLOW TRAPS. ;ACTUALLY, AN EXPONENT OF +200 IE "SLOW" ONE IS USED. ; REGISTERS FP0= PC FP0H= PCH ;HIGH ORDER PRODUCT FP0L= PCL ;** DESTROYS PC! ** FP1= RIR FP1H=S AN OVERFLOW BUT IT MAY ;BE REDUCED BY THE POST-NORMALIZATION STEP SO WE CHECK ;THAT CASE (AND THE UNDERFLOW-ON-NORMALIZATION RIRH ;LOW ORDER PRODUCT - NOTE THAT FP1L= RIRL ;RIRH MUST BE PRESERVED UNTIL FDVJMP M2O= EXP2 LOC FMDJMP&7600+174 ;FML CASE) LATER. AL 200,EXP1 ;CONOVERT BIASED EXPONENTS TO SIGNED #S AL 177,M2M ;DECREMENT EXP2 BY ONE TO FUDGE RANGE ABF DIV MUST BE IN SAME PAGE AS FMDJMP FMLDIV: TL 340,RIRH ;COMMON CODE FOR FMUL AND FDIV JZBF USEROP ;BREAK OUT USER OPCODES M2M,EXP1 ;ADD EXPONENTS TO GET SIGNED RESULT EXP JVT UNDOFL ;IF UNDER/OVERFLOW, N BIT SAYS WHICH ONE AL 201,EXP1 ;RE-BIAS R AL 376,SPL CDB SPH ;DECREMENT THE STACK POINTER W SPH,SPL ;STORE PC ON STACK OW PCH,PCL LL 200,M2H ;INITIALIZE SIGNESULT EXPONENT R FP0H,FP0L ;FINALLY, READ ARG2 LOW WORD IWF 0,M2 ;READ WORD AND CHECK TO SEE JZF MNOSWT ;IF WE SHOULD SWREPEAT ONCE MORE, IF WE HAVE TO JNT EONORM ;OTHERWISE SHIFT BY BITS IF NECESSARY NORMLP: ICB1 M2L,M2L ;NORMALIZE LOOP - B COLLECTOR JZT MARG1Z ;CHECK FOR ARGUMENT 1 ZERO MW M2,FP0 ;MOVE ARG2 ADDRESS TO SAFE PLACE RIW2 FP0H,FP0L ;AS WE WILL NUMP SHIFT COUNTER SLWF M1,M1 SLBCF M1H,M1H ;SHIFT MANTISSA LEFT ONE BIT JNF NORMLP ;N BIT ON IF NORMALIZED EONORM: SBFOW DESTROY M2 IW 0,M2 ;GET HIGH WORD OF ARG2 ;PREPARATORY OPERATIONS COMMON TO MULTIPLY AND DIVIDE - ;PROCESS SIGNS AND I M2L,EXP1 ;DECREMENT EXPONENT BY SHIFT COUNTER ICB1 EXP1,EXP1 ;COUNTER WAS 1 TOO BIG ON PURPOSE JCF ADDONE ;SO THAT C BIT WNSERT NORMALIZE BITS ;CARRY BIT STILL CONTAINS ARG1 SIGN FROM FIS COMMON CODE SLBCF M2H,M2H ;SAVE ARG1 SIGN AND SET CARRY OULD SHOW UNDERFLOW UNDFLO: LL N+V,SIGNS ;CONDITION CODES FOR UNDERFLOW FISTRP: LCF N+V+C+Z,SIGNS ;SET CONDITION CODES LL  SRBC M1H,M1H ;SO WE CAN PUT A NORMALIZE BIT IN SLBF M2L,M2L ;GET ARG2 EXP INTO M2M AND SLBC M2M,M2M ;ARG2 SIGN INTO C8 244,RSRCL,LRR,PSW ;LOAD FIS TRAP ADDRESS ;AND GET THE PS BACK VIA A TRANSLATION JMP FISTP1 LOC 2557 ;PATCH FOR REV. 7 JZBT MRSLT0 ;QUICK EXIT IF ARG2 IS ZERO CIB SPL ;SET ARG2 SIGN INTO LOW BIT OF SP XB M2H,SPL ;AND EXCLUSIVE OR IN THE A�=�� LTIPLY LOOP - THIS IS A LOOP IN WHICH A RIGHT-SHIFTING ;MULTIPLIER IS ADDED INTO THE STATIONARY PRODUCT UNDER CONTROL OF THE ;ROUNDING CARRIES CIB EXP1 ;IF FRACTION OVERFLOWS, BUMP EXPONENT - ;NORMALIZE BIT WILL BE DESTROYED ANYWAY JC8T MOVFLO LEFT-SHIFTING MULTIPLICAND. SINCE WE ADD IN THE BIGGER MULTIPLES ;OF THE MULTIPLIER FIRST, THERE IS A CHANCE OF FRACTION OVERF ;CHECK FOR RESULT OVERFLOW SRBF SPL,M1H ;GET SIGN BIT FROM (UGH!) R6 SLB FP0H,M1H ;ELIMINATE NORMALIZE BIT TB EXP1,EXP1 LOW AND ;SO WE MUST SHIFT THE MULTIPLIER RIGHT ONE INITIALLY. AS AN ;OPTIMIZATION, WE HANDLE THE MULTIPLICAND NORMALIZE BIT A;SEE IF POSTNORMALIZE/ROUND MADE JZBT OFLUND ;EXPONENT OVER/UNDERFLOW. ;IF SO, FP1L SAYS WHICH WAY NL 376,SPL ;MAKE SS ;A SPECIAL CASE WHILE WE SHIFT THE MULTIPLIER RIGHT. MFAST: SRBF M2H,FP0H ;INITIALIZE PRODUCT TO MULTIPLIER SRBCF M2M,FPTACK POINTER EVEN AGAIN RIW2 SPH,SPL ;READ PC AND BUMP SP BACK UP AGAIN IW 0,PC ;LOAD PC WORD BACK JMP FISSTO ;STORE E10L ;SHIFTED RIGHT ONE TO AVOID OVFLO SRBCF M2L,FP1H SRBCF M1L,FP1L ;(CAREFUL WITH THAT 24TH BIT!) SRWF FP0+1,M1+1 ;NOW RED AND M1 IN G+4 AND G+6 USEROP: JMP 3003 ;GO TO USER ENTRY POINT ;SLOW MULTIPLY LOOP - IN THIS LOOP A LEFT-SHIFTING MULTIPLIUCE THE MULTIPLIER AGAIN SRWC FP1+1,M2+1 ;TO START THE LOOP AT BIT 2 SLB M1H,M1H ;ELIMINATE NORMALIZE BIT JMP FASMLP ;JUER ;IS ADDED INTO A STATIONARY PRODUCT UNDER THE CONTROL OF ;A RIGHT-SHIFTING MULTIPLICAND. AS AN OPTIMIZATION, THE ;MULTIPLMP INTO LOOP FASMAD: AWF M2,FP1 ;SHIFTED OUT BIT WAS 1 - AWC M1,FP0 ;ADD MULTIPLIER TO PRODUCT FASMSH: SRWF M1+1,M1+1,,FIIICAND IS NOT TREATED AS A SINGLE 24-BIT QUANTITY ;BUT AS 3 SEPARATE BYTES - ONE BITS SHIFTED OUT OF ANY PAR- ;TICULAR BYTE CAU; ;SHIFT MULTIPLIER RIGHT SRWC M2+1,M2+1 ;ONE PLACE FASMLP: SLB M1H,M1H ;SHIFT A BIT OUT OF THE MULTIPLICAND JC8T FASMAD SE THE MULTIPLIER TO BE ADDED WITH AN OFFSET ;DEPENDING ON THE BYTE'S SIGNIFICANCE. MSLOW: SW FP0,FP0 ;CLEAR THE PRODUCT IN;IF ITS A ONE-BIT, ADD TO PRODUCT JZBF FASMSH ;OTHERWISE LOOP UNTIL MPCAND=0 TB FP0H,FP0H ;TEST FOR NORMALIZED RESULT JNBITIALLY SW FP1,FP1 LL 0,M2O ;INITIALIZE THE MULTIPLIER OVERFLOW BYTE JMP SLOW1 ;ENTER THE LOOP SLOW3: AWF M2,FP1 ;ADT FMLDUN ;JUMP IF NORMALIZED MLNORM: SLWF FP1,FP1 ;CAN'T BE UNNORMALIZED MORE THAN SLWC FP0,FP0 ;ONE BIT - MAKE IT GOOD D MULTIPLIER INTO HIGH PRODUCT AWC E2,FP0 ;CAN'T OVERFLOW SINCE M2O LT 200 SLOW4: SLWF M2,M2 ;SHIFT MULTIPLIER LEFT SLWC DB1 EXP1,EXP1 ;DECREMENT EXPONENT JZBT PATCH ;A POTENTIAL UNDERFLOW EXISTS FMLDUN: SLBF FP1L,FP1L ;PUT ROUNDING BIT INTO C E2,E2 SLOW1: SRBF M1L,M1L,,FII; ;SHIFT OUT LOW BIT OF LOW BYTE CAW E2,FP1; ;ADD MULTIPLIER 2 BYTES OVER IF A 1 CIB FP0L ;AP ARGS MWF M1,M2 ;IF ARG2 HAS A ZERO LOW WORD AND JZT MFAST ;ARG1 DOES NOT, WE SHOULD SWAP. MB M1H,FP0H MB M2H,M1H ; LL 200,FP1L ;SET FLAG SAYING WE CAME FROM MULTIPLY ;ROUND THE RESULT IF THE CARRY IS 1 FMLRND: SW M1,M1 ;RESULT IS IN FPSWAP ARGUMENT FRACTIONS MB FP0H,M2H SW M1,M1 MNOSWT: TW M1,M1 ;SLOW OR FAST LOOP? JZBF MSLOW ;ALAS, SLOW LOOP ;FAST MU0H,FP0L,FP1H - ABCF FP1H,M1L ;TRANSFER IT TO FP0H,M1M,M1L ABC FP0L,M1M ;AS WE ROUND IT CIB FP0H,,FII; ;PROPAGATE POSSIBLE �>�� ON TRAP CODE MOVFLO: LL V,SIGNS ;LOAD OVERFLOW CODE JMP FMLTRP ;GO TO COMMON MULDIV TRAP CODE ;FLOATING DIVIDE ROUTINE -NS IN LOOP LOC 2400 ;KEEP THIS IN 2ND PAGE DSUBT: SWF M1,M2 ;COME HERE IF DIVIDEND GE DIVISOR SBC M1H,M2H ;SUBTRACT DIC8 CAN ONLY BE SET IF C WAS SET CIB FP0H ;PROPAGATE CARRIES SRB M1M,M1M ;NOW SHIFT MIDDLE BYTE JC8F SLOW2 ABF M2M,FP1L SHORT BUT VERY SLOW ;USES MULTIPLY REGISTER NAMES AND SHARES SOME MULTIPLY CODE. ;DIVISOR IS IN M1(H,M,L) , DIVIDEND IN M2 (H ;IF SHIFTED OUT BIT WAS A ONE, ADD ABCF M2H,FP1H ;THE MULTIPLIER TO THE PRODUCT OFFSET ABC M2O,FP0L ;BY ONE BYTE CIB FP0H,M,L) , ;QUOTIENT IS ACCUMULATED IN FP0H,FP0L,FP1H WHILE EXP1 HOLDS RESULT EXP ;WHEN WE GET TO "FDIV" THE EXPONENTS HAVE ALR ;PROPAGATE CARRY INTO HIGH PRODUCT WORD SLOW2: SRB M1H,M1H ;LASTLY, SHIFT HIGH MULTIPLICAND BYTE JC8F SLOW4 ;JUMP IF BIT EADY BEEN SPLIT ;OFF FROM THE MANTISSAS AND THE NORMALIZE BIT HAS BEEN INSERTED ;INTO THE MANTISSAS. LOC FDVJMP&7600+160 ;IS 0 JZBF SLOW3 ;CHECK FOR NORMALIZE BIT GONE, ELSE ADD AWF M2,FP1 ;DONE - DO THE ADD FOR THE NORMALIZE BIT AWC E2,FP0 FDIV MUST BE IN SAME PAGE AS FDVJMP FDIV: SBF EXP1,M2M ;SUBTRACT DIVISOR EXP FROM DIVIDEND EXP SRBCF M2M,EXP1 ;SHIFT RIGHT ;RESULT IS POSSIBLY UNNORMALIZED ONE BIT JNBT FMLDUN ;IF ITS NORMALIZED, JUST ROUND AND STORE JMP MLNORM ;OTHERWISE SHIFT AND THEN LEFT AGAIN TO SLBCF EXP1,EXP1 ;SET V BIT ON OVERFLOW OR UNDERFLOW JVT UNDOFL ;IF V SET, N INDICATES WHICH OCCURREDIT LEFT A PLACE ;PATCH TO FIX UNDERFLOW PROBLEM LOC 2375 PATCH: SLBF FP1L,FP1L ;PUT ROUNDING BIT INTO C LL 0,FP1L ; AL 200,EXP1 ;ADJUST RESULT EXP LL 1,FP1L ;SET GUARD BIT FOR DIVIDE LOOP CBF M1H,M2H ;SET C IF DIVISOR HIGH BYTE GT DIVIEXP1=0 AT END MEANS UNDERFLOW JMP FMLRND ;RESUME ;COME HERE ON FMUL/FDIV COMMON CODE IF THE FIRST ;ARGUMEN IS ZERO. LOCDEND R FP0H,FP0L ;FINALLY, READ IN WORD 2 OF ARG 2 IW 0,M2 ;WE ARE NOW READY TO START DIVIDING, BUT WE MUST ENTER THE ;D 2341 MARG1Z: LL C+V+N,SIGNS ;SET UP CONDITIONS FOR DIVIDE BY 0 TRAP TL 10,RIRH ;WAS THIS A MULTIPLY OR DIVIDE? JZBF FMLIVIDE LOOP DIFFERENTLY IF THE DIVIDEND IS LARGER THAN THE DIVISOR. SW FP0,FP0 ;INITIALIZE HIGH QUOTIENT TO ZERO JMP FDIV1TRP ;DIVIDE - TAKE THE TRAP MRSLT0: RIW2 SPH,SPL ;COME HERE IF RESULT WILL BE 0 IW 0,PC ;RESTORE PROGRAM COUNTER FROM ST LOC 2762 ;GET THE FOLLOWING JUMPS IN THE NEXT PAGE FDIV1: JZF FDCMP1 ;IF DIVISOR LT DIVIDEND WE MUST SUBTRACT CWF M1,M2ACK JMP FSTOR0 ;AND GO STORE A ZERO AS THE RESULT OFLUND: TBF FP1L,FP1L ;IF WE GET HERE FROM FMUL IT'S OVERFLOW, ;FRO ;IT OFF BEFORE WE START SHIFTING THE FDCMP1: JCT FDIVLP ;DIVIDEND LEFT. ICB1 EXP1,EXP1 ;ALSO, WE MUST BUMP THE RESULT EXPOM FDIV ITS UNDERFLOW UNDOFL: JNT MOVFLO ;TEST WHICH ERROR OCCURRED MUNDFL: LL N+V,SIGNS ;LOAD UNDERFLOW CODE FMLTRP: NL 376,NENT JZBF DSUBT ;THIS MAY CAUSE THE EXPONENT TO JMP MOVFLO ;OVERFLOW, IN WHICH CASE WE TRAP. ;DIVIDE LOOP PROPER - A SIMPSPL ;CLEAR RESULT SIGN BIT FROM SP RIW2 SPH,SPL ;READ FROM AND RESTORE STACK IW 0,PC ;RESTORE PC JMP FISTRP ;JOIN COMMLE SHIFT AND SUBTRACT, WITH JUST A ;LITTLE HANKY-PANKY WITH THE CARRY. ;QUOTIENT IS KEPT IN ONE'S COMPLEMENT FORM - SAVES 300 �?�� NTER AT MNTNGX WITH MULTIPLIER NEGATED IF MULTIPLIER WAS NEGATIVE ; BUT NOT EQUAL TO 100000 ;ENTER AT NOSWIT WITH RPSWH=0 IF MH MULTIPLICAND BYTE IS ZERO; WE MB RBAH,RBAL ;SIMPLY SCALE PRODUCT DOWN LL 0,RBAH ;AND WE'RE DONE. TSTNEG: TB RPSWH,RPSWH ULTIPLIER WAS 100000 ;IN ANY CASE MULTIPLIER WINDS UP "POSITIVE" AND BYTE-REVERSED IN RSRC MNTNEG: MB GL,RSRCH ;COMPLETE T;TEST RESULT SIGN JNBF STORE ;IF POSITIVE, NOTHING TO BE DONE OCW RBA,RBA TCW RSRC,RSRC CIB RBAL ;NEGATE DOUBLEWORD PRHE REVERSAL OF THE MPLIER MNTNGX: MBF RDSTH,RPSWH ;SET PRODUCT SIGN FROM MPCAND JNF RSLTPL ;JUMP IF PROD WILL BE POSITIVE ODUCT CIB RBAH JMP STORE ;NOW GO STORE RESULT ;SPECIAL FAST MULTIPLY LOOP IN CASE BOTH INPUTS ;ARE LESS THAN 256 IN ABSOLTCW RDST,RDST ;NO - NEGATE MPCAND RSLTPL: TBF RDSTH,RDSTH ;SWITCH MPLIER AND MPCAND IF JZF NOSWIT ;MPCAND HAS ONLY 8 SIGNIFIUTE VALUE. BYTEMX: CAW RDST,RBA ;LOGIC OF LOOP VERY SIMILIAR TO SLW RDST,RDST ;LARGER LOOP FOR FULL MULTIPLY BYTEML: SRBFVISOR FROM DIVIDEND SLBF FP1L,FP1L ;SHIFT A ZERO INTO THE QUOTIENT SLWCF FP0,FP0 JCT DIVOVR ;JUMP IF GUARD BIT SHIFTED OUCANT BITS MB RDSTL,RPSWL MB RSRCL,RDSTH ;MOVE HIGH MPLIER TO HIGH MPCAND JZBT BYTEML ;JUMP IF BOTH ARGS ARE BYTES MB RST FDIVLP: SLWF M2,M2 ;SHIFT DIVIDEND LEFT ONE PLACE SLBCF M2H,M2H,,FII JCT DSUBT ;CARRY MEANS ITS GT DIVISOR FOR SURE RCH,RDSTL ;NO - MOVE LOW MPLIER TO LOW MPCAND MB RPSWL,RSRCH LL 0,RSRCL ;MOVE MPCAND BYTE REVERSED TO MPLIER NOSWIT: LL 20 CBF M1H,M2H ;COMPARE HIGH BYTES JCT NOSUBT ;DIVISOR DEFINITELY BIGGER JZF DSUBT ;DIVIDEND BIGGER IF NOT EQUAL CWF M1,M,RPSWL ;INIT "COUNTER" FOR FIRST LOOP ;SLOW MULTIPLY LOOP - MULTIPLY WORD IN RDST BY BYTE IN RSRCH, ;RESULT IN RBA AND RSRCH2 ;HIGH BYTES EQUAL - COMPARE LOW BYTES JCF DSUBT ;DIVIDEND GE DIVISOR - GO SUBTRACT NOSUBT: SLBCF FP1L,FP1L ;CARRY IS ALWA THEN CONTINUE BY MULTIPLYING RDST BY ;BYTE IN RSRCL IF RSRCL NE 0, WITH RESULT IN RBA AND RSRC. MLTPL1: SRBCF RSRCH,RSRCH YS ON HERE - SLWCF FP0,FP0 ;SHIFT A ONE INTO THE QUOTIENT JCF FDIVLP ;LOOP IF GUARD BIT DIDN'T SHIFT OUT DIVOVR: OCB FP;PRIME THE LOOP MLTPLP: CAW RDST,RBA SRWF RBA+1,RBA+1,,EII; SHIFT PRODUCT RIGHT SRBCF RSRCH,RSRCH ;INCLUDING EXTENSION BYTE1L,FP1H ;DIVIDE OVER - COMPLEMENT QUOTIENT OCW FP0,FP0 SRBF M1H,FP1L ;HALVE THE DIVISOR AND SET FP1L POSITIVE ;FOR THE  WHICH CAW RDST,RBA ;HOLDS MPCAND BYTE SRWF RBA+1,RBA+1 ;REPEAT CODE TWICE IN LOOP SRBCF RSRCH,RSRCH ;TO SAVE ON OVERHEAD FINAL UND/OVFLO CHECK AT FMLRND SRW M1+1,M1+1 ;AND COMPARE THE HALVED DIVISOR CBF M2H,FP1L ;TO THE REMAINDER JZF FDCMP2 ; SLB RPSWL,RPSWL ;DONE WITH A BYTE? JC8F MLTPLP ;JUMP IF NO JNBT TSTNEG ;JUMP IF THIS WAS THE HIGH BYTE MB RSRCH,RPSWL TO GET THE ROUNDING BIT IN CWF M2,M1 ;THE CARRY FDCMP2: JMP FMLRND ;ROUNDING BIT IN C - ROUND AND STORE. ;EIS STARTS FROM ;NO - SAVE LOW PRODUCT BYTE MBF RSRCL,RSRCH ;MOVE IN NEXT MPCAND BYTE (THE HIGH ONE) MB RPSWL,RSRCL ;PUT LOW PRODUCT BYTE INHERE ON ;ENTER HERE FROM "MULT" WHEN SIGN OF MULTIPLIER HAS BEEN DETERMINED: ;ENTER AT MNTNEG IF MULTIPLIER IS POSITIVE ;E SAFE PLACE LL 30,RPSWL ;INIT COUNTER FOR SECOND BYTE LOOP JZF MLTPL1 ;SECOND LOOP IS NOT NECESSARY IF MB RBAL,RSRCH ;HIG�@�� T C IF HIGH-ORDER NE 0 ORWF RSRC,RBA ;SET Z AND N FROM "OR" OF WORDS NEGLO: OCW RBA,RDST ;IF LOW ORDER NEGATIVE, SET C IF W G,RDST ;PUT DEST IN RDST JMP DVASC1 LOC 2567 DVASC1: LTR RPSWH,RPSWH ;SAVE THE PS JMP DVASCX ;JUMP TO COMMON DIVIDE TCWF RDST,RDST,RSVC ;HIGH ORDER NE -1 ORBF RIRL,RBAH ;SET N FROM HIGH WORD, FORCE Z 0 ;COME HERE ON ALL MULTIPLY OR ASH OP/ASHC CODE ;SINGLE REGISTER ARITHMETIC SHIFT LOC 2577 ;MUST BE IN SAME PAGE AS MPYAS0 ASH: SLB RDSTL,RDSTL ;SHIFT COUNTERATIONS MPYASX: SLBF RIRH,RBAH ;ISOLATE DESTINATION REGISTER SLBC RIRL,RIRL ;BY SHIFTING INSTRUCTION AROUND SLBF RBAH,RB IS ONLY 6 BITS WIDE SLB RDSTL,RDSTL ;CHECK SIGN OF SHIFT JNBF ASHL ;POSITIVE MEANS LEFT SHIFT SLBF RSRCH,RDSTH ;RIGHT SHAH SLBC RIRL,RIRL LGL RIRL ;PUT DESTINATION REGISTER IN G TL 20,RIRL ;SEPARATE OUT ASH FROM MULTIPLY JZBF ASH MULT:IFT - PUT SIGN IN CARRY JMP ASHRT ;ENTER INTO RIGHT-SHIFT LOOP ASHRL: SRWC RSRC+1,RSRC+1,,EII; SHIFT REGISTER RIGHT ASHRT:  SW RBA,RBA ;INITIALIZE PROD LOW WORD MB GH,RSRCL ;MULTIPLIER WILL GO TO RSRC REVERSED JNBF MNTNEG,,EII; ;IF BOTH OCCUR, JUAL 4,RDSTL ;ONE LESS THAN NUMBER OF PLACES JZBF ASHRL ;SPECIFIED SRWCF RSRC+1,RSRC+1,RSVC ;SET CARRY ON LAST SHIFT MWF RMP OVERRIDES TRANSLATION TCW G,RSRC+1 ;NEGATE MULTIPLIER TO RSRC REVERSED TCWF RDST,RDST ;NEGATE MULTIPLICAND AS WELL JVF SRC,G ;STORE RESULT AND EXIT ;MUST DO THIS IN A SEPARATE STEP, ;AS SRW SETS N WRONGLY ASHL: SBF RDSTH,RDSTH ;CLEARMNTNGX ;MPCAND=100000 IS SPECIAL CASE LL 0,RPSWH ;IT CAME UP - PRODUCT WILL BE POSITIVE JMP NOSWIT ;SKIP OVER CODE WHICH  INTERNAL OVERFLOW FLAG AND C ASHLL: AL 374,RDSTL ;DECREMENT SHIFT COUNT JNBT ASHLDN ;JUMP IF DONE SLWF RSRC,RSRC,,EII; ;S RSRCH,RSRCH,,EII; CAW RDST,RBA SLW RDST,RDST SRBF RSRCH,RSRCH JZF BYTEMX CAW RDST,RBA ;DO POSSIBLE FINAL ADD SLBF RCAN'T HACK IT ;GET HERE FROM TRAN ID1 IF ITS AN EIS INSTRUCTION ;COME HERE TO DO TRAN DMW SO THAT WE DONT DO A DEST. MODE CAPSWH,RPSWH ;PUT SIGN OF RESULT IN CARRY MW RBA,RSRC ;ASSUME RESULT POSITIVE - SET LOW ORDER JCF MZAPHI ;JUMP IF ASSUMPTION LCULATION WHEN ;THIS ROM IS NOT IN THE SYSTEM. LOC 2571 EISM0: MB GH,RSRCH,,DMW; DUPLICATE OF "SM0" IN MAIN MICROCODE ;ECORRECT TCWF RSRC,RSRC ;WRONG - NEGATE LOW ORDER, SETTING C MZAPHI: SWC RBA,RBA ;ZERO PROD UNLESS RESULT LT 0 ;COME HERE NTER HERE FROM TRAN DE2 IF MUL OR ASH WITH MODE 0. LOC 2575 ;ENTRY POINTS FOR MODE 0 EIS ;THEY MUST "WIRE-OR" WITH BASETO STORE RESULT FROM RBA & RSRC AND SET CONDITIONS STORE: MW RBA,G ;STORE HIGH-ORDER PRODUCT NL 6,RIRL ;SET RIRL TO POINT ADDRESS OF ;WHERE DOP MODE 0 CODE IS(534). ;EIS MODE 0 AND NOT MODE 0 HAVE SAME LAST ;ADDRESS DIGIT TO SAVE PLA  TO AL 1,RIRL ;THE ODD REGISTER LGL RIRL,LRR,PSW ;AND LOAD G FROM IT ;GET PS BACK VIA A TRANSLATION LL 0,RPSWL ;MUSGATES MPYAS0: MW G,RDST ;PUT DEST IN RDST JMP MPYAS1 LOC 2546 MPYAS1: LTR RPSWH,RPSWH ;SAVE THE PS JMP MPYASX ;JUMPT BE CLEARED FOR REFRESH MW RSRC,G ;STORE LOW-ORDER PRODUCT JNBT NEGLO ;JUMP IF LOW-ORDER NEGTIVE TCWF RBA,RDST,RSVC ;SE TO COMMON CODE ;ENTER HERE FROM TRAN DE2 IF DIV OR ASHC WITH MODE 0. LOC 2574 DVASC0: JMP DVASCA LOC 2572 DVASCA: M�A�� PL,LRR,PSW ;CLEAR LOW BIT OF SP AS FMUL/FDIV ;USES IT TO STORE THE RESULT SIGN. ;GET PS BACK VIA TRANSLATION RIW2 SPB RSRCH AL 300,RIRH ;SET "RESULT NEGATIVE" FLAG ;AND "NUMERATOR NEGATIVE" FLAG DNUMPL: TB RDSTH,RDSTH JNBF DDNMPL ;JUH,SPL ;POP THE SAVED PC OFF THE STACK JMP FIILC1 LOC 2561 ;PATCH FOR REV. 7 FIILC1: IW 0,PC LL 0,RPSWL ;MUST BE CLEARMP IF DENOMINATOR POSITIVE TCW RDST,RDST ;FORCE DENOMINATOR POSITIVE AL 200,RIRH ;INVERT "RESULT NEGATIVE" FLAG DDNMPL: CWFED FOR REFRESH JMP FIILC2 LOC FIILOC+3 FIILC2: AL 376,PCL,RSVC ;BUMP THE PC BACK CDB PCH ;OVER THE FIS INSTRUCTION AND  RDST,RSRC ;DENOM .LE. HIGH NUM IS DIVIDE ERROR JCF DIVERR TCW RDST,RPSW ;FORM NEGATIVE OF DENOMINATOR DW1 RDST,RDST ;DECRGO AWAY ;DIVIDE ERROR CODE - TWO ENTRY POINTS ;ENTER AT DIVERR IF DIVISOR TOO SMALL OR 0, DIVERX IF QUO>32767 DIVERR: DW1EMENT DENOM TO SET CARRIES IN LOOP NL 6,RIRL ;USE HI BITS OF RIRL AS LOOP CTR SLWF RBA,RBA ;PRIME THE DIVIDE LOOP ;DIVIDEF RDST,RDST ;SET CARRY IF DIVISOR WAS 0 DIVERX: LL V,RSRCH,LRR,PSW ;RESTORE PS VIA TRANSLATION LCF Z+N+V,RSRCH,RSVC ;SET DIVI LOOP - SIMPLE SHIFT AND SUBTRACT DIVLP: SLWC RSRC,RSRC ;SHIFT NUMERATOR LEFT ONE CWF RSRC,RDST ;COMPARE NUM TO DENOM, SETTDE ERROR CONDITION CODES LL 0,RPSWL ;MUST BE CLEARED FOR REFRESH ;ENTER HERE FOR DIVIDE OR ASHC WITH SOURCE IN MEMORY DVAING CARRY CAW RPSW,RSRC ;IF DENOM .LE. NUM, SUBTRACT IT OFF SLWCF RBA,RBA ;SHIFT IN QUOTIENT BIT, ALSO SLWC RSRC,RSRC ;SHSRD: R RBAH,RBAL ;ADDRESS OF SOURCE IN RBA IW 0,RDST ;PUT SOURCE WORD IN RDST ;ENTER HERE FOR DIVIDE OR ASHC IN ALL MODES IFTING NUMERATOR LEFT AGAIN CWF RSRC,RDST ;WE REPEAT LOOP BODY TWICE TO CAW RPSW,RSRC ;REDUCE LOOP OVERHEAD SLWCF RBA,RBA, DVASCX: SLBF RIRH,RPSWH ;ISOLATE DESTINATION REGISTER SLBC RIRL,RIRL ;FROM INSTRUCTION BY SHIFTING SLBF RPSWH,RPSWH ;GET ,EII; SHIFT SECOND QUOTIENT BIT IN AL 40,RIRL ;LOOP 8 TIMES, LEAVE WITH C=0 JC8F DIVLP TL 100,RIRH JZBT REMPOS ;MEANWHLOW BIT OF REG # INTO CARRY SLB RIRL,RPSWH AL 1,RPSWH ;ODD REGISTER NUMBER IN RPSWH LGL RPSWH ;AND IN G REGISTER SLBC ILE REMAINDER MUST BE TCW RSRC,RSRC ;SAME SIGN AS ORIGINAL NUMERATOR REMPOS: MB RIRH,RPSWH ;THIS SETS NB BIT IF SIGNS DIFFERRRIRL,RIRL ;COMPLETE DEST REG # NOW IN RIRL MW G,RBA,,EII; ;MOVE ODD REGISTER TO A WORK REGISTER TL 20,RIRL JZBF ASHC ;SEPED JNBF QUOPOS ;IF SIGNS THE SAME, QUOTIENT IS GT 0 TCW RBA,RBA,,EII; OTHERWISE IT MUST BE NEGATED JZBT NODVOV ;0 IS POSHIFT REGISTER LEFT ONE PLACE JVF ASHLL ;AND LOOP LL V,RDSTH ;SET INTERNAL V FLAG IF OVFLO JMP ASHLL ;AND CONTINUE SHIFTARATE ARITH SHIFT FROM DIVIDE ;INTEGER DIVIDE ROUTINE - ENTER WITH HIGH ORDER NUMERATOR ;IN RSRC, LOW ORDER NUMERATOR IN RBAING ASHLDN: MWF RSRC,G,RSVC ;STORE RESULT LCF V,RDSTH ;SET V BIT FROM INTERNAL FLAG ;FIS INTERRUPT ROUTINE - ABORTS FMUL/ AND DENOMINATOR IN RDST. DIVIDE: NL 77,RIRH ;HIGH 2 BITS OF RIRH USED AS FLAGS TB RSRCH,RSRCH ;TEST NUMERATOR SIGN JNBFFDIV TO SERVICE BR'S LOC 2622 ;MAKE SURE THIS IS NEVER CHANGED UNLESS ;CONTROL CHIP PLA CHANGES ALSO FIILOC: NL 376,S DNUMPL ;JUMP IF NUMERATOR POSITIVE OCW RSRC,RSRC ;NEGATE NUMERATOR AS 32-BIT TCW RBA,RBA ;QUANTITY CIB RSRCL,,EII; CI�B�� ITIVE AND NEGATIVE (-0=0) QUOPOS: XB RBAH,RPSWH ;IS RESULT SIGN WHAT IT SHOULD BE? JNBT DIVERX ;IF NOT, OVERFLOW ON DIVISIONII; ;SHIFT DOUBLEWORD QUANTITY LEFT SLWCF RSRC,RSRC JVF ASHCL ;LOOP IF NO OVERFLOW LL V,RPSWL ;SET INTERNAL OVERFLOW FLA - ERROR NODVOV: MW RSRC,G,LRR,PSW ;STORE REMAINDER ;GET PS BACK VIA TRANSLATION LGL RIRL JMP DIVST1 LOC 2373 DIVSG JMP ASHCL ;AND LOOP ANYWAY ASHCRL: SLBF RSRCH,RDSTH ;PUT SIGN IN CARRY SRWCF RSRC+1,RSRC+1 ;SHIFT DOUBLEWORD QUANTITY T1: MWF RBA,G,RSVC ;STORE QUOTIENT AND SET CONDITIONS LL 0,RPSWL ;MUST BE CLEARED FOR REFRESH ;EIS INTERRUPT ROUTINE - ABO SRWCF RBA+1,RBA+1 ;RIGHT ONE PLACE AL 4,RDSTL,,EII; ;THE NUMBER OF TIMES SPECIFIED JZBF ASHCRL ;BY THE SHIFT COUNT ASHSTRTS CURRENT EIS INSTRUCTION TO SERVICE BR ;ALSO USED BY FADD AND FSUB, AS THEIR LOW BYTE MAKES THEM LOOK ;LIKE A MODE 0 OR MODO: LGL RIRL ;SET G TO HIGH-ORDER REGISTER MWF RSRC,G ;STORE HIGH ORDER AND SET FLAGS FROM IT LGL RPSWH,LRR,PSW ;NOW SET G E 1 EIS INSTRUCTION. LOC 2717 ;MAKE SURE THIS DOESNT CHANGE UNLESS PLA DOES ALSO EIILOC: LGL RIRH,LRR,PSW ;REGISTER RIRH CTO LOW ORDER REGISTER ;GET PSW BACK VIA TRANSLATION MW RBA,G ;AND STORE LOW ORDER JZBT ASHCL0 ;IF LOW ORDER WAS NON-ZONTAINS LOW BYTE ;GET PS BACK VIA TRANSLATION SLB RIRH,RIRH ;OF INSTRUCTION. SHIFT THIS BYTE SO SLB RIRH,RIRH ;THAT THEERO, LCF Z+V,RPSWL ;CLEAR Z AND SET V FROM INTERNAL FLAG ;FALL THRU TO CLEAR RPSWL FOR REV. 7 ASHCL0: LCF V,RPSWL,RSVC ; HIGH MODE BIT GOES INTO C SLBF RIRH,RIRH ;AND THE MIDDLE MODE BIT INTO N. JMP EIILC1 LOC 2564 ;PATCH FOR REV. 7 EIILC1ELSE JUST SET V FROM INTERNAL FLAG LL 0,RPSWL ;MUST BE CLEARED FOR REFRESH ;ENTER HERE FROM TRAN DE4 IF MUL OR ASH, NOT MO: LL 2,RBAH LL 0,RPSWL ;MUST BE CLEARED FOR REFRESH JMP EIILC2 LOC EIILOC+5 EIILC2: JNF EIM04 ;JUMP IF MODE WAS 0/1 ORDE 0. LOC 2775 ;ENTRY POINTS ARE DETERMINED BY WHERE ;DOP CODE NOT MODE 0 WINDS UP. ;THEY MUST "WIRE-OR" WITH BASE 4/5 JCT EIMOD6 ;JUMP IF MODE 6/7 SW RBAH,G ;UNDO MODE 2/3 BY BUMPING G BACK EIMOD6: CABF RBAH,RBAH ;SET RBAH=4 IF MODE 6 ADDRESS OF ;634 MPYASH: LTR RPSWH,RPSWH ;SAVE PS IN TR OW RDSTH,RDSTL ;FINISH THE DATIP STARTED IN MODE FLOW JMP /7, CLEAR C EIM04: CAW RBAH,G,RSVC ;BUMP G FORWARD TO UNDO MODE 4/5 SW RBAH,PC ;BUMP PC BACK 2, 4 IF MODE WAS 6/7 ;COMBINEDMPYASX ;JUMP TO COMMON CODE ;ENTER HERE FROM TRAN DE4 IF DIV OR ASHC, NOT MODE 0. LOC 2774 DVASHC: JMP DVASHA LOC 27 ARITHMETIC SHIFT - HIGH SHIFTEE IN RSRC, LOW IN RBA, ;SHIFT COUNT IN LOW 6 BITS OF RDSTL. ASHC: SLB RDSTL,RDSTL ;SHIFT COUN71 DVASHA: LTR RPSWH,RPSWH ;SAVE PS IN TR OW RDSTH,RDSTL ;FINISH DATIP STARTED IN MODE FLOW JMP DVASCX ;JUMP TO COMMON COT IS ONLY SIX BITS WIDE SBF RPSWL,RPSWL ;CLEAR OVERFLOW FLAG AND CARRY SLB RDSTL,RDSTL ;TEST SIGN OF SHIFT COUNT JNBT ASHCDE ;PSW TRANSLATION CODE THAT RECREATES THE 2 BITS IN THE PS ;THE TRANSLATION LOOKS AT THE T BIT AND BIT 7 AND SENDS THE CODERL ;JUMP IF NEGATIVE (RIGHT) ASHCL: AL 374,RDSTL ;DECREMENT SHIFT COUNT JNBT ASHSTO ;IF LT 0, WE ARE DONE SLWF RBA,RBA,,E TO ;ONE OF THE FOUR BELOW LOCATIONS. TRAN RET DOES A SIMPLE RETURN VIA ;THE PLA (LC GETS RR). LOC 2550 RESTPS: LL 0,RP�C��      $� t jw�b �  � `fE� w|fE�Ew!U�w!  LV � w� `b we �ՐW!e � `bw �  v5�``@E EpF>   D  INVALID DATA�� ����'��ADDRESSING MODE CONFLICT �� ������zS�}v WCSLOD����������������������� 6  b    n鈇�7!f�ȝ����0 � l`2�ߋ*�ߥ�*�  :�`�SWH,,RET; ;BOTH BITS =0 LL 20,RPSWH,,RET; ;JUST T BIT IS ON LL 200,RPSWH,,RET; ;JUST BIT 7 IS ON LL 220,RPSWH,,RET; ;BOTH �`5�$� @PPPP� ` `7  � h ^� � n�7  X� <BITS=1 EMPTY2 ;REPORT ON FREE LOCATIONS .END ������������������������������������������������������������������������ 2� h� B�� X�� 0 �� �0 ��w�F� $���b� � ` 7 ѝ��c �&Ћ EEe0�` �`N5�FU�� 鈇� ` ` b dߕ�d'` `�&f���� `w ���w ��&�w ��w �&��bߝ�d�`�`���� �|��7 ���7��������������������������������������������������������������������������������������������������������������������������������� U�t�U�p� `w ���w ���_`AB_b_d ` �_`ABbd ` ���� ��w�������������������������������������������������������������������������������������������������������������������������������������������������������������������������`��u����������� @������������������������@������@������������ ���Z�������D�N�O�R�T�U��������������^^��������������������������������NO WRITEABLE CONTROL STO�RE IN MACHINE� FILE NR. �OVERLOADING NON CLEARED LOCATION �CONFLICT WITH TRANSLATION ARRAY �CHECK SUM ERR�TOO MANY � �5�$�E�$�h& 77e�W �xw�8 $w� :�  6 OPTIONS��UNRECOGNIZED SWITCH�INPUT ERROR�UNEXPECTED EOF��INVALID DATA��ADDRESSING MODE CONFLICT ��zS�}v WCSLOD���������U�$� 2w�& $ <$7 ,7 � dѐ -�� %� w��-���D�� ���E�� �F�� �G�� �H�� �I�� �J�� �K�� �L��