.IIF NDF $VIRT $VIRT= 0 ;$VIRT = 0 -> NORMAL ODT ;$VIRT = 1 -> VIRTUAL ODT ;MS01+ .MCALL .MODULE .IF EQ $VIRT .MODULE ODT,VERSION=08,COMMENT=,AUDIT=NO,LIB=YES .IFF .MODULE VDT,VERSION=07,COMMENT=,AUDIT=NO,LIB=YES .ENDC ; Copyright (c) 1998 by Mentec, Inc., Nashua, NH. ; All rights reserved ; ; This software is furnished under a license for use only on a ; single computer system and may be copied only with the ; inclusion of the above copyright notice. This software, or ; any other copies thereof, may not be provided or otherwise ; made available to any other person except for use on such ; system and to one who agrees to these license terms. Title ; to and ownership of the software shall at all times remain ; in Mentec, Inc. ; ; The information in this document is subject to change without ; notice and should not be construed as a commitment by Digital ; Equipment Corporation, or Mentec, Inc. ; ; Digital and Mentec assume no responsibility for the use or ; reliability of its software on equipment which is not supplied ; by Digital or Mentec, and listed in the Software Product ; Description. .SBTTL EDIT LOG ; ; R. BEAN,JD,DW,MAS,MBG,SMD ; ;+ ; ;DL01 -- FIX RETURN TO PREVIOUS SEQUENCE FUNCTION ;DL03 -- ADD PSECT $ODT$ ;MS01 -- ADD .TTYIN AND .TTYOUT FOR XM AND MULTI-TERMINAL USE ; ; V01.07 29-OCT-79 FIXED '<' AND 'A' COMMANDS, SEARCH ROUTINES, ; -MBG- CLEANED-UP CODE ;MG01 ; ; V04.00 14-NOV-79 ADDED '$J' WHICH RETURNS THE CONTENTS OF ; -MBG- THE JSW AT THE TIME OF ENTRY TO ODT. ; (UNDER VDT ONLY) ;MG02 ; ; X05.00 09-JUN-82 Save EERB if VDT. ; -JRW- ; ; X05.01 10-JUN-82 Add command to get at ERRBYT AND USERRB ; -MBG- ; ; Y05.01 19-OCT-82 Reset some bad bits in JSW when coming in ; -JRW- using VDT - to prevent looping on .TTYIN. ; ; Y05 (002) 15-Nov-83 Added support for FALCON(+) by changing ; MBG MOV/CLR's of RECV and XMIT CSR's to BIS/BIC's ; so speed info is not munged. ; ; X05.02 26-OCT-84 Refined previous edit of 15-Nov-83 to work on ; SMD all PDP-11's. Changed .AUDIT to "NO" in ; response to SPR # 11-68706 (LINK and ODT). ; ; ; Y5.3C 21-OCT-85 George Thissell ; add patch around .gval ; ; 1-May-91 WFG Update Copyright Statement ;- .SBTTL DEFINITIONS .MCALL .GVAL .IF NE $VIRT .MCALL .TTYIN, .TTINR, .TTYOU, .RCTRL .ENDC ;NE $VIRT ;MS01- ; STACK SPACE RESERVED .PSECT $ODT$ ;DL03 .GLOBL O.ODT ;GETS ENTRY POINT TO SHOW UP ; IN LOAD MAP . = .+144+26+30+10 ;RESERVES SPACE FOR STACK .IF NE $VIRT ;MS01+ . = .+40. ;GET MORE FOR VDT .ENDC ;NE $VIRT ;MS01- ST = 177776 ;PROCESSOR STATUS WORD O.BKP = 16 ;NUMBER OF BREAKPOINTS-1 MULT. BY 2 O.RLR = 16 ;NO. OF RELOC. REGISTERS-1, TIMES 2 O.TVEC = 14 ;TRT VECTOR LOCATION O.STM = 340 ;PRIORITY MASK - STATUS REGISTER O.STM1 = 140340 ;PRIORITY MASK PLUS USER MAP ;MS01+ ; BITS FOR XM MONITOR ONLY JSW = 44 ;JOB STATUS WORD EERB = 52 ;User/System error bytes word. $CNFG1 = 300 ;MONITOR CONFIG WORD ONE C1.XM = 10000 ;XM MONITOR IS RUNNING ;MS01- O.TBT = 20 ;T-BIT MASK - STATUS REGISTER TRT = 000003 ;TRT INSTRUCTION O.RCSR = 177560 ;KEYBOARD CONTROL/STATUS O.RDB = O.RCSR+2 ;KEYBOARD BUFFER O.TCSR = O.RCSR+4 ;PRINTER CONTROL/STATUS O.TDB = O.RCSR+6 ;PRINTER BUFFER RC.IE = 000100 ;Receiver interrupt enable XC.IE = 000100 ;Transmitter interrupt enable ; JSW Bit definitions TCBIT$ = 000100 ;FB,XM; Inhibit terminal wait bit TTSPC$ = 010000 ;Special mode terminal bit TTLC$ = 040000 ;Lower-case bit for console .SBTTL INITIALIZATION CODE ;+ ; ; INITIALIZE ODT ; USE O.ODT FOR A NORMAL ENTRY ; USE O.ODT+2 TO RESTART ODT - WIPING OUT ALL BREAKPOINTS ; USE O.ODT+4 TO RE-ENTER (I.E. - FAKE A BREAKPOINT) ; ;- O.ODT: BR O.STRT ;NORMAL ENTRY BR O.RST ;RESTART JSR PC,O.RRST ;RE-ENTER -- SAVE STATUS MOV O.TVEC+2,-(SP) ;SET UP LOCAL STATUS JSR PC,O.WST MOV PC,-(SP) ;FAKE THE PC MOV (SP)+,O.UPC MOVB #-1,O.P ;DISALLOW PROCEED CLRB O.S JMP O.BK1 O.STRT: NOP ;TO SAVE STATUS NOP ; JSR PC,O.RRST FOR PDP11 ; MFPS,O.UST FOR LSI .IF EQ $VIRT ;MS01+ MOV @#4,-(SP) ;SAVE RT INTERRUPT VECTOR MOV #9$,@#4 ;SET ODT VECTOR TST @#ST ;LSI WILL TRAP TO 4 ; PDP11 WILL CONTINUE BR 1$ ;DON'T CHANGE ACCESS TO PS 9$: MOV #MFPS+67,O.RRST ;CHANGE PS ACCESS IN TWO SUBROUTINES ; O.RRST AND O.WST ; STORE MFPS O.UST IN O.RRST MOV #O.UST-O.RRST-4,O.RRST+2 MOV #NOP,O.RRST+4 MOV #MTPS+66,O.WST ;STORE MTPS 2(SP) MOV #240,O.WST+4 MOV #1$,(SP) ;REPLACE PC ON STACK WITH CONTINUE ; LOCATION.PC,SP WERE PUT THERE BY ; THE TIMEOUT TRAP TO 4 RTI ;RESTORE PS AND CONTINUE AT 1$ 1$: MOV (SP)+,@#4 ;RESTORE CONTENTS OF 4 .ENDC ;EQ $VIRT ;MS01- ; RUN AT CURRENT STATUS JSR R5,O.SVTT ;SAVE TTY STATUS JSR R0,O.SVR ;SAVE REGISTERS (MAINLY SP) MOV #O.UR0,SP ;SET UP STACK MOV #O.ID,R4 ;TYPE ID MOV #O.IDND,R3 JSR R5,O.TYPE BR O.RST1 O.RST: JSR R0,O.SVR ;SAVE REGISTERS JSR R5,O.REM ;REMOVE ALL BREAKPOINTS JSR R5,O.CLRR ; CLEAR RELOCATION REGISTERS MOVB O.PRI,R4 ;GET ODT PRIORITY RORB R4 RORB R4 ;SHIFT RORB R4 ; INTO RORB R4 ; POSITION MOVB R4,-(SP) ;STORE IN STATUS JSR PC,O.WST O.RST1: CLRB O.S ;DISABLE SINGLE INSTRUCTION FOR NOW MOVB #-1,O.P ;DISALLOW PROCEED MOV #O.STM,O.TVEC+2 ;STATUS WORD TO TRT VECTOR+2 ;MS01+ ; ASSUME IT IS NOT THE XM MONITOR ..GVAL::.GVAL #AREA,#$CNFG1 ;SET TO FIND OUT IF XM IS RUNNING BIT #C1.XM,R0 ;IS IT? BEQ 2$ ;NOPE, DON'T SET UP USER MODE BITS MOV #O.STM1,O.TVEC+2 ;STATUS WORD AND XM USER MODE ; TO TRT VECTOR+2 2$: MOV #O.BRK,O.TVEC ;PC TO TRT VECTOR ;MS01- ; THIS NEXT INSTRUCTION RAISES THE "Z" FLAG BECAUSE ; ITS PURPOSE IN LIFE IS TO BEHAVE DIFFERENTLY ON THE /20 ; AND THE /45 SO WE CAN CHANGE THE RTT WHICH ALSO ; BEHAVES DIFFERENTLY ON THE /20 AND /45. ; THIS IS NOT AN ERROR! ;;; JMP (PC)+ ;PROCESSOR DEPENDENT INSTRUCTION .WORD JMP!27 ;EQUIVALENT TO JMP (PC)+ (W/O "Z" ERROR) BR 1$ ;THIS PROCESSOR IS A 40 OR 45 MOV #RTI,O.RTIT ;CHANGE THE RTT TO AN RTI IF ; THIS IS 11/05 OR 11/20 1$: JMP O.RALL ;CLEAR BRK PT TABLES .SBTTL O.CTLC RETURN TO KEYBOARD MONITOR ;+ ; ; O.CTLC ; ^C PROCESSING. RETURN TO KEYBOARD MONITOR ; ;- O.CTLC: MOV O.USP,SP ;RESTORE USER STACK MOV #O.CCST,R4 MOV #O.CCSP,R3 JSR R5,O.TYPE ;ECHO "^C" JSR R5,O.RSTT ;DTW-RESTORE CONSOLE STATUS MOV SP,R0 ;WE WANT EXIT TO DO A SOFT RESET EMT 340+10 ;EXIT TO KEYBOARD MONITOR O.CCST: .BYTE '^ O.CCSP: .BYTE 'C .SBTTL ASCII STRING PRINT AND ACCEPT ;+ ; ; O.ALF REXP;NA TYPE N CHARACTERS STARTING AT REXP; ; THEN-- ; ACCEPT A STRING OF ASCII TEXT. STORE IT IN ; SUCCESIVE BYTES STARTING AT THE INDICATED ; LOCATION. TEXT TERMINATED BY COUNT, N. ; OR CR OR LF. ODT PRINTS THE ADDR OF ; THE NEXT AVAILABLE LOCATION IN CORE ; ;- O.ALF: TST R3 ;WAS REXP TYPED? BEQ 6$ ;BR IF NOT TSTB O.SMFD ;WAS ';' TYPED? BEQ 6$ ;BR IF NOT, ERROR TST R2 ;IF N NOT TYPED, ASSUME 1 BNE 1$ 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 BYTE IN R3 ADD (SP),R3 ;ADD N TO R3 DEC R3 ;SUB. 1 TO GET LAST ADDR MOV R3,O.XXX ;SAVE LAST ADDR. JSR R5,O.TYPE ;TYPE THE CHARACTERS JSR R5,O.CRLF ;TYPE CR/LF MOV (SP)+,R4 ;RECALL N TO R4 ; NOW ACCEPT INPUT STRING INCB O.SCRN ;ALLOW SPACES VIA O.GETC JSR R5,O.GETC ;LOOK AT FIRST CH. CMPB R0,#15 ;IS IT A CARR.RET? .IF NE $VIRT ;MG01+ BNE 15$ ;NOPE...CONTINUE JSR R5,O.GETC ;YES...DISCARD THAT FOLLOWS BR 5$ ;RETURN TO COMMAND DECODER .IFF BEQ 5$ ;YES...RETURN TO COMMAND DECODER .ENDC ;NE $VIRT ;MG01- 15$: CMPB R0,#12 ;CHK FOR LF BNE 3$ ;IF NOT, ACCEPT N CHARACTERS CLRB O.SCRN ;MAKE SPACES INVISIBLE TO O.GETC MOV O.XXX,R4 ;IF LINE FEED, OPEN NEXT AVAILABLE CH. INC R4 INC R2 MOV R4,R0 ;PRINT NEXT AVAIL BYTE MOV R2,-(SP) ;SAVE TO AVOID CLOBBERRING MOV R4,-(SP) ;BY O.RORA JSR R5,O.RORA MOV (SP)+,R4 MOV (SP)+,R2 MOVB #'\,R0 ;PRINT BACK SLASH JSR R5,O.PUTC JMP O.BYT 2$: JSR R5,O.GETC ;GET NXT CH. 3$: JSR R5,O.CU1 ;IS IT A '^U'? BCC 4$ ;YES...HANDLE AS ZERO COUNT ;MG01 MOVB R0,(R5)+ DEC R4 ;REDUCE COUNT. IS IT ZERO? BNE 2$ ;BR IF NO 4$: MOV R5,-(SP) ;PRINT NXT AVAIL LOC: JSR R5,O.CRLF ;CR,LF MOVB #2,O.BW ;FORCE WORD MODE MOV (SP)+,R0 ;THEN, ADDRESS JSR R5,O.RORA 5$: CLRB O.SCRN ;MAKE SPACE INVISIBLE TO O.GETC JMP O.DCD ;RETURN TO COMMAND DECODER 6$: JMP O.ERR .SBTTL O.REGT SPECIAL NAME HANDLER ;+ ; ; SPECIAL NAME HANDLER ; DEPENDS UPON THE EXPLICIT ORDER OF THE TWO TABLES O.TL AND O.UR0 ; ;- O.REGT: JSR R5,O.GETC ;SPECIAL NAME, GET ONE MORE CHARACTER MOV #O.TL,R4 ;TABLE START ADDRESS 1$: CMPB R0,(R4)+ ;IS THIS THE CORRECT CHARACTER? BEQ 3$ ;JUMP IF YES CMP R4,#O.TL+O.LG ;IS THE SEARCH DONE? BLO 1$ ;BRANCH IF NOT BIC #177770,R0 ;MSK OFF OCTAL MOV R0,R4 2$: ASL R4 ADD #O.UR0,R4 ;GENERATE ADDRESS INC R2 ;SET FOUND FLAG JMP O.SCAN ;GO FIND NEXT CHARACTER 3$: SUB #O.TL-7,R4 ;GO FIND NEXT CHARACTER BR 2$ ; RETYPE OPENED WORD IN ASCII (CONVERTED FROM MOD40) O.MOD: MOV O.CAD,R0 ;CALL MOD40 UNPACK MOV #O.ALF1,R1 JSR PC,UNPA00 ;ASCII CHARS GO INTO O.ALF1,2,3 MOV #'=,R0 ;PRINT "=" JSR R5,O.PUTC INCB O.SCRN ;SET FLAG TO ALLOW SPACES MOVB O.ALF1,R0 ;PRINT 1ST CHAR JSR R5,O.PUTC MOVB O.ALF2,R0 ;PRINT 2ND CH JSR R5,O.PUTC MOVB O.ALF3,R0 ;PRINT 3RD CH JSR R5,O.PUTC MOV #40,R0 ;PRINT SPACE JSR R5,O.PUTC JSR R5,O.GETC ;USER MUST NOW TYPE: CMPB R0,#40 ;IF CHAR IS LESS THAN SPACE, BLO 1$ ;PREPARE TO ENTER COMMAND DECODER CMPB R0,#'^ ;'^'? BEQ 1$ ;YES...OPEN PREVIOUS LOCATION MOVB R0,O.ALF1 ;OTHERWISE READ 3 CHAR JSR R5,O.GETC ;2ND CH MOVB R0,O.ALF2 JSR R5,O.GETC ;3RD CHAR CLRB O.SCRN ;RESTORE O.GETC TO NORMAL MOVB R0,O.ALF3 MOV #O.XXX,R0 ;TELL MOD40 TPACK TO PACK MOV #O.ALF1,R1 ;INTO O.XXX JSR PC,PACK00 MOV O.XXX,R4 ;MAKE IT APPEAR AS IF THE MOV #1,R2 ;PACKED # WAS TYPED JMP O.SCAN ;LET COMMAND DECODER DO THE REST 1$: CLRB O.SCRN CLR R4 ;MAKE IT APPEAR CLR R2 ;AS IF NO NUMBERS WERE TYPED IN JMP O.SCN1 ;TYPED IN .SBTTL O.ORPC BACK ARROW HANDLER ; "BACKARROW" HANDLER - OPEN INDEXED ON THE PC (BACK ARROW) O.ORPC: JSR R5,O.TCLS ;TEST WORD MODE AND CLOSE ADD @R2,R2 ;COMPUTE INC R2 INC R2 ; NEW ADDRESS O.PCS: MOV R2,O.CAD ;UPDATE CAD CLR R2 ;CLEAR NUMBER TYPED FLAG ;DL01 JMP O.OP2A ;GO FINISH UP O.ORAB: JSR R5,O.TCLS ;TEST WORD MODE AND CLOSE MOV @R2,R2 ;GET ABSOLUTE ADDRESS BR O.PCS O.ORRB: JSR R5,O.TCLS ;TEST AND CLOSE MOV @R2,R1 ;COMPUTE NEW ADDRESS MOVB R1,R1 ;EXTEND THE SIGN ASL R1 ;R2=2(@R2) INC R1 ; +2 INC R1 ADD R1,R2 ; +PC BR O.PCS O.TCLS: JSR PC,O.CLSE ;CLOSE CURRENT CELL CMP O.BW,#2 ;ONLY WORD MODE ALLOWED BNE 1$ ;BRANCH IF ERROR MOV O.CAD,R2 ;CURRENT ADDRESS IN R2 RTS R5 1$: TST (SP)+ O.TCL2: JMP O.ERR ;POP A WORD AND SHOW THE ERROR .SBTTL O.SNGL PROCESS SINGLE INSTRUCTION MODE ; PROCESS S - SINGLE INSTRUCTION MODE O.SNGL: TSTB O.SMFD ;DONT REACT IF ; NOT TYPED BEQ O.TCL2 TST R2 ;SEE IF TURN ON OR TURN OFF BNE 1$ ;BRANCH IF TURNING IT ON CLRB O.S ;CLEAR THE FLAG JMP O.DCD ;CONTINUE THE SCAN 1$: MOVB #-1,O.S ;SET THE FLAG O.SI2: JMP O.DCD .SBTTL O.COMM COMMA PROCESSING ; COMMA PROCESSING. N IN R4 IS THE RELOCATION REGISTER NUMBER O.COMM: INCB O.CMFD ;SET "COMMA FOUND" SWITCH TO ON TST R2 ;WAS 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 ;YES, LOCATE RELOC. REGISTER MOV O.RELT(R4),O.BIAS ;PUT BIAS IN O.BIAS 1$: BR O.MIN1 ;GO BACK TO DECODER .SBTTL O.REL R PROCESSING ;+ ; ; R PROCESSING. SEVERAL POSSIBILITIES- ; A. ;R WAS TYPED. ZERO OUT ALL RELOCATION REGISTERS ; B. ;NR WAS TYPED. ZERO OUT $NR ; C. REXP;NR WAS TYPED. SET $NR TO REXP ; D. NR WAS TYPED, WHILE A WORD WAS OPENED- ; COMPUTE (O.CAD)-($NR) AND PRINT IT ; ;- O.REL: TSTB O.SMFD ;TEST IF 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 ;GUARANTEE 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,O.RELT(R4) ;IF REXP NOT TYPED, R5=0. CASE B. BR O.H1 ;EXIT TO DECODER 2$: TST R3 ;IF REXP TYPED, CASE B OR C WITH N=0 BEQ 4$ ;NEITHER REXP NOR N TYPED, CLEAR ALL. BR 1$ ;REXP TYPED- N NOT TYPED 3$: MOV #-1,O.RELT(R4) BR O.H1 ; CLEAR RELOCATION REGISTERS. 4$: JSR R5,O.CLRR ;CLEAR RELOC REG'S BR O.SI2 ;GO BACK TO SCAN 5$: CMP O.BW,#2 ;CASE D, PRINT @O.CAD IN RELATIVE FORM BNE O.TCL2 ;ERROR IF BYTE OPENED TST R2 ; CHECK IF R BNE 7$ ; IF R MOV @O.CAD,R0 JSR R5,O.LOC ; THEN FIND BEST N CMP R0,#-1 ;WAS A RELOC REG FOUND? BNE 6$ ;BR IF YES. ELSE-- MOV #'=,R0 ;TYPE "=" JSR R5,O.PUTC MOV @O.CAD,R0 ;TYPE ABS. VAL OF CONTENTS BR 9$ ;OF OPENED LOC. 6$: MOV R0,R4 ; PUT NEW N INTO R4 7$: MOV @O.CAD,R1 ;OPENED VALUE IS THE MINUEND MOV R4,O.TMP1 ; SAVE N ASL R4 ;GET BIAS FROM $NR SUB O.RELT(R4),R1 ;BIAS IS THE SUBTRAHEND MOV #'=,R0 ;TYPE "=" JSR R5,O.PUTC MOV O.TMP1,R0 ; PREPARE INPUT FOR O.PUTC ADD #60,R0 ; CONVERT N TO ASCII JSR R5,O.PUTC ; TYPE N MOV #',,R0 ;PREPARE INPUT FOR O.PUTC JSR R5,O.PUTC ; TYPE COMMA TST R2 ; CHECK IF R BNE 8$ ; IF R MOV O.XXY,R0 ; THEN PREPARE INPUT FOR O.CADV 8$: MOV R1,R0 ;TYPE THE VALUE (@O.CAD)-($NR) 9$: JSR R5,O.CADV BR O.DCD1 .SBTTL O.CNS C PROCESSING ;+ ; ; 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 DEFAULT ; C. NO SEMICOLON HAS BEEN TYPED-REPLACE R4 WITH THE CONTENTS OF $C ; ;- O.CNS: TSTB O.SMFD ;WAS A SEMICOLON TYPED? BNE 1$ ;REXP TYPED PRIOR TO ; CASE A MOV O.CNST,R4 ;CASE C. REPLACE R4 WITH ($C) MOV #1,R2 BR O.SCAN ;RETURN TO SCAN MORE 1$: MOV #'=,R0 ;PRINT VALUE MOV #2,O.BW JSR R5,O.PUTC MOV R5,R0 JSR R5,O.CADV MOV R5,O.CNST ;AND STORE IN $C O.H1: BR O.DCD .SBTTL O.MIN MINUS PROCESSING O.MIN: INCB O.MINS ;SET MINUS FOUND SWITCH ON O.MIN1: BR O.DCD1 .SBTTL O.RCMP REPRINT LAST OPENED ADDRESS RELATIVELY ;+ ; ; A. N! WAS TYPED--PRINT N,((O.CAD)-($NR)) ; B. ! WAS TYPED. FIND THE CLOSEST BIAS LESS THAN ; (O.CAD) AND USE ITS "N" -- THEN DO CASE A. ; ;- O.RCMP: MOV #'=,R0 ;FIRST TYPE A "=" JSR R5,O.PUTC ;WAS N TYPED IN? TST R2 ;WAS N TYPED IN? BNE 2$ ;BRANCH IF YES MOV O.CAD,R0 JSR R5,O.LOC ;ELSE, FIND BEST N CMP R0,#-1 ;IF REL.REG FOUND, BNE 1$ ; BR, ELSE-- MOV O.CAD,R0 ;PRINT ADDR IN ABS. JSR R5,O.CADV BR O.DCD1 1$: ADD #060,R0 ;CONVERT N TO ANSCII JSR R5,O.PUTC ;TYPE N MOV #',,R0 ;TYPE COMMA JSR R5,O.PUTC MOV O.BW,-(SP) ;SAVE O.BW MOV #2,O.BW ;ARTIFCIALLY SET MODE FOR WORDS MOV O.XXY,R0 ;TYPE RELATIVE AMOUNT JSR R5,O.CADV MOV (SP)+,O.BW ;RESTORE MODE BR O.DCD1 ;EXIT TO SCAN ROUTINE 2$: MOV R4,R0 ;GET N. THIS CODE SIMULATES O.LOC ASL R0 ;TIMES 2 FOR INDEXING MOV O.CAD,O.XXY SUB O.RELT(R0),O.XXY ;COMPUTE DIFFERENCE ASR R0 ;RESTORE N. BR 1$ ;PRINT RESULTS ; FILL MEMORY WORDS. LIMITS ARE THE SEARCH LIMITS. O.FILL: MOV #2,O.BW ;SET MODE TO "OPEN WORD" O.FIL1: TSTB O.SMFD ;DONT REACT UNLESS ";" WAS TYPED BEQ O.ERR ;IF NOT TYPED, ERROR. MOV O.CNST, R0 ;ACTUAL VALUE MOV O.LOW,R4 ;USE SEARCH LIMITS FOR MOV O.HI,R3 ; FILL LIMITS. JSR R5,O.ST BR O.DCD ;EXIT ; INITIALIZE MEMORY BYTES. O.INIT: MOV #1,O.BW BR O.FIL1 ;LET O.FILL DO THE WORK .SBTTL COMMAND DECODER ; ALL REGISTERS MAY BE USED (R0-R5), O.ERR: MOV #'?,R0 ; ? TO BE TYPED JSR R5,O.PUTC ; OUTPUT ? O.DCD: CLR O.BW ;CLOSE ALL JSR R5,O.CRLS ;TYPE * O.DCD3: CLRB O.SMFD ;SEMICOLON FOUND FLAG CLRB O.CMFD ;COMMA FOUND FLAG CLRB O.MINS ;MINUS SIGN FOUND FLAG CLR R3 ;R3 IS A SAVE REGISTER FOR R2 CLR R5 ;R5 IS A SAVE REGISTER FOR R4 O.DCD1: CLR R4 ; R4 CONTAINS THE CONVERTED OCTAL CLR R2 ; R2 IS THE NUMBER FOUND FLAG O.SCAN: JSR R5,O.GETC ;GET A CHAR, RETURN IN R0 O.SCN1: CMPB R0,#'0 ;COMPARE WITH ASCII 0 BLO 1$ ;CHECK LEGALITY IF NON-NUMERIC CMPB R0,#'7 ;COMPARE WITH ASCII 7 BHI 1$ ;CHECK LEGALITY IF NOT OCTAL BIC #177770,R0 ;CONVERT TO BCD ASL R4 ; MAKE ROOM ASL R4 ; IN ASL R4 ; R4 ADD R0,R4 ;PACK THREE BITS IN R4 INC R2 ;R2 HAS NUMERIC FLAG BR O.SCAN ; AND TRY AGAIN 1$: CLR R1 ;CLEAR INDEX 2$: CMPB R0,O.LGCH(R1) ;DO THE CODES MATCH? BEQ 3$ ;JUMP IF YES INC R1 ; SET INDEX FOR NEXT SEARCH CMP R1,#O.CLGT ;IS THE SEARCH DONE? BLO 2$ ;NOPE...RE-LOOP BR O.ERR ; OOPS! 3$: TSTB O.MINS ;IF MINUS WAS NOT TYPED BEQ 4$ ;DO NOT NEGATE K NEG R4 ;OTHERWISE, TAKE 2'S COMPLEMENT. 4$: TSTB O.CMFD ;IF A COMMA NOT TYPED, BEQ 5$ ;SKIP NEXT INSTRUCTION. ADD O.BIAS,R4 ;OTHERWISE, ADD RELOC. BIAS TO (R4) 5$: CLRB O.MINS ;REINITIALIZE MINUS-TYPED SWITCH ; FOR NXT SCAN ASL R1 ;MULTIPLY BY TWO JMP @O.LGDR(R1) ;GO TO PROPER ROUTINE O.LGDR: O.SEMI ; ; SEMICOLON (DELIMITER) O.WRD ; / OPEN WORD O.BYT ; \ OPEN BYTE O.CRET ; CARRIAGE RETURN CLOSE O.REGT ; $ REGISTER OPS O.GO ; G GO TO ADDRESS K O.OP1 ; MODIFY, CLOSE, OPEN NEXT O.ORPC ; BACK-ARROW OPEN RELATED, ; INDEX - PC (BACK ARROW) O.OLD ; < RETURN TO OLD SEQUENCE (OPEN) O.BACK ; ^ OPEN PREVIOUS (UP ARROW) O.COMM ; , COMMA. SEPERATES REL.REG. ; FROM INCREMENT O.OFST ; O OFFSET O.WSCH ; W SEARCH WORD O.EFF ; E SEARCH EFFECTIVE ADDRESS O.BKPT ; B BREAKPOINTS O.PROC ; P PROCEED O.ORAB ; @ OPEN RELATED, ABSOLUTE O.ORRB ; > OPEN RELATED, REL. BRANCH O.SNGL ; S SINGLE INSTRUCTION MODE O.REL ; R RELOCATION PROCESSING O.CNS ; C CONSTANT REGISTER PROCESSING O.MIN ; - MINUS, NEGATES NUMBER TYPED IN O.FILL ; F FILL MEMORY WORDS FROM THE ; CONSTANT REGISTER O.INIT ; I INITIALIZE MEMORY BYTES FROM ; THE CONSTANT REGISTER O.RCMP ; ! PRINT CURRENT OPENED ADDRESS ; IN REL. FORM O.MOD ; X RETYPE OPENED CONTENTS, MOD40 O.ALF ; A ACCEPT ASCII INPUT O.CTLC ; ^C EXIT TO MONITOR O.LGL = .-O.LGDR ;LGL MUST EQUAL 2X CHLGT ALWAY .SBTTL O.SEMI SEMI-COLON PROCESSOR O.SEMI: MOV R2,R3 ;A SEMI-COLON HAS BEEN RECEIVED MOV R4,R5 ;NUMERIC FLAG TO R3, CONTENTS TO R5 INCB O.SMFD ;SET SEMICOLON FOUND FLAG CLRB O.CMFD ;RESET COMMA FOUND FLAG BR O.DCD1 ;GO BACK FOR MORE .SBTTL PROCESS / AND \ - OPEN WORD OR BYTE ;+ ; ; INPUT - IF R2 IS NON-ZERO A NEW REXP HAS BEEN TYPED IN ; INPUT - -ADDRESS OF WORD TO BE OPENED IS IN R4 ; ;- O.WRD: MOV #2,O.BW ;OPEN WORD BR O.WB1 O.BYT1: ROL R4 ;GET THE ADDRESS BACK O.BYT: MOV #1,O.BW ;OPEN BYTE O.WB1: TST R2 ;GET VALUE IF R2 IS NON-ZERO BNE 3$ ;BRANCH IF NUMBER INPUT TSTB O.CMFD ;TEST FOR ","AND";" BEQ 2$ 1$: JMP O.ERR ;ERROR IF PRESENT WITHOUT NUMBER. 2$: TSTB O.SMFD BNE 1$ BR O.WRD1 ;NO NUMBER - REOPEN PREVIOUS LOCATION 3$: MOV R4,O.DOT ;PUT VALUE IN DOT MOV R4,O.CAD ; ALSO IN CAD O.WRD1: CMP O.BW,#1 ;CHECK BYTE MODE BEQ 1$ ;JUMP IF BYTE MOV O.CAD,R4 ASR R4 ;MOVE ONE BIT TO CARRY BCS O.BYT1 ;JUMP IF ODD ADDRESS MOV @O.CAD,R0 ;GET CONTENTS OF WORD BR 2$ 1$: MOVB @O.CAD,R0 ;GET CONTENTS OF BYTE 2$: JSR R5,O.CADV ;GO GET AND TYPE OUT @CAD CMP O.BW,#1 ;CHECK IF BYTE MODE. BNE O.DCD3 ;IF NOT WE'RE DONE. ELSE: MOVB #'=,R0 ;TYP "=" AND THEN THE ASCII BYTE JSR R5,O.PUTC MOVB @O.CAD,R0 JSR R5,O.PUTC MOVB #40,R0 JSR R5,O.PUTC JMP O.DCD3 ;GO BACK TO DECODER .SBTTL O.CRET PROCESS CARRIAGE RETURN O.CRET: JSR PC,O.CLSE ;CLOSE LOCATION .IF NE $VIRT ;MS01+ .TTYIN ;GET RID OF THE LF .ENDC ;NE $VIRT ;MS01- O.DCDA: JMP O.DCD ;RETURN TO DECODER O.ERR3: JMP O.ERR ;INTERMEDIATE HELP .SBTTL PROCESS , OPEN NEXT WORD O.OLD: INCB O.SEQ ;SET FLAG TO LATER RESTORE CAD O.OP1: TST O.BW ; RECEIVED O.ERR2: BEQ O.ERR3 ;ERROR IF NOTHING IS OPEN JSR PC,O.CLSE ;CLOSE PRESENT CELL TST O.SEQ ;SHOULD CAD BE RESTORED? BEQ 1$ ;BRANCH IF NOT ;MG01; CMP O.CAD,O.DOT ;IS CURRENT ADDRESS = ORIGIN? ;DL01 ;MG01; BEQ 2$ ;PROCEED AS USUAL IF YES ;DL01 ;MG01; MOV #2,O.BW ;OTHERWISE BACK TO WORD MODE ;DL01 2$: MOV O.DOT,O.CAD ;RESTORE PREVIOUS SEQUENCE CLRB O.SEQ ;RESET FLAG; NO LONGER NEEDED 1$: ADD O.BW,O.CAD ;GENERATE NEW ADDRESS O.OP2: MOV O.CAD,O.DOT ;INITIALIZE DOT O.OP2A: JSR R5,O.CRLF ; MOV O.BW,-(SP) ;SAVE BW MOV #2,O.BW ;SET TO TYPE FULL WORD ADDRESS MOV O.CAD,R0 ;NUMBER TO TYPE JSR R5,O.RORA ; CHECK FORMAT MOV @SP,O.BW ;RESTORE BW MOV #"\/,R0 ;/ IN LOW BYTE ; \ IN HIGH BYTE ASR (SP)+ ;IS IT BYTE MODE? BCS 1$ ;YES... SWAB R0 ;TYPE A / 1$: JSR R5,O.PUTC ;TYPE THE LOW BYTE OF R0 BR O.WRD1 ;GO PROCESS IT .SBTTL O.BACK PROCESS ^, OPEN PREVIOUS WORD O.BACK: TST O.BW ; ^ RECEIVED BEQ O.ERR2 ;ERROR IF NOTHING OPEN JSR PC,O.CLSE SUB O.BW,O.CAD ;GENERATE NEW ADDRESS BR O.OP2 ;GO DO THE REST .SBTTL O.BKPT B HANDLER - SET AND REMOVE BREAKPOINTS O.BKPT: MOV #O.TRTC,R0 ASL R4 ;MULTIPLY NUMBER BY TWO TST R3 BEQ 3$ ;IF R3 IS ZERO GO REMOVE BREAKPOINT ASR R5 ;GET ONE BIT TO CARRY BCS O.ERR1 ;BADNESS IF ODD ADDRESS ASL R5 ;RESTORE ONE BIT ADD #O.ADR1,R4 TST R2 BNE 2$ ;JUMP IF SPECIFIC CELL 1$: CMP R0,@R4 ;IS THIS CELL FREE? BEQ 2$ ;JUMP IF YES CMP R4,#O.BKP+O.ADR1 ;ARE WE AT THE END OF OUR ROPE BHIS O.ERR1 ;YES, THERE IS NOTHING FREE TST (R4)+ ;INCREMENT BY TWO BR 1$ 2$: CMP R4,#O.BKP+O.ADR1 BHI O.ERR1 ;ERROR IF TOO LARGE MOV R5,@R4 ;SET BREAKPOINT BR O.DCDA ;RETURN 3$: TST R2 BEQ O.RALL ;GO REMOVE ALL CMP R4,#O.BKP BHI O.ERR1 ;JUMP IF NUMBER TOO LARGE MOV R0,O.ADR1(R4) ;CLEAR BREAKPOINT CLR O.CT(R4) ;CLEAR COUNT ALSO O.DCDB: BR O.DCDA O.RALL: CLR R4 MOV #O.TRTC,R0 1$: CMP R4,#O.BKP+2 ;ALL DONE? BHI O.DCDA ;JUMP IF YES MOV R0,O.ADR1(R4) ;RESET BKPT MOV #TRT,O.UIN(R4) ;RESET CONTENTS OF TABLE CLR O.CT(R4) ;CLEAR COUNT TST (R4)+ ;INCREMENT BY TWO BR 1$ .SBTTL O.OFDT PROCESS O, COMPUTE OFFSET O.OFST: CMP O.BW,#2 ;CHECK WORD MODE BNE O.ERR1 ;ERROR IF NOT CORRECT MODE MOV #40,R0 ;TYPE ONE BLANK JSR R5,O.PUTC ; AS A SEPARATOR TST R3 ;WAS SEMI-COLON TYPED? BEQ O.ERR1 ;NO, CALL IT AN ERROR SUB O.CAD,R5 ;COMPUTE DEC R5 DEC R5 ; 16 BIT OFFSET MOV R5,R0 JSR R5,O.CADV ;NUMBER IN R0 - WORD MODE MOV R5,R0 ASR R0 ;DIVIDE BY TWO BCS 1$ ;ERROR IF ODD CMP R0,#-200 ;COMPARE WITH -200 BLE 1$ ;DO NOT TYPE IF OUT OF RANGE CMP R0,#177 ;COMPARE WITH +177 BGE 1$ ;DO NOT TYPE IF OUT OF RANGE DEC O.BW ;SET TEMPORARY BYTE MODE JSR R5,O.CADV ;NUMBER IN R0 - BYTE MODE INC O.BW ;RESTORE WORD MODE 1$: JMP O.DCD3 ;ALL DONE O.ERR1: JMP O.ERR ;INTERMEDIATE HELP .SBTTL SEARCHES ;+ ; ; SEARCHES - $MSK HAS THE MASK ; $MSK+2 HAS THE FWA ; $MSK+4 HAS THE LWA ; ;- O.EFF: INC R1 ;SET EFFECTIVE SEARCH BR O.WDS O.WSCH: CLR R1 ;SET WORD SEARCH O.WDS: TST R3 ;CHECK FOR OBJECT FOUND BEQ O.ERR1 ;ERROR IF NO OBJECT MOV #2,O.BW ;SET WORD MODE MOV O.MSK+2,R2 ;SET ORIGIN MOV O.MSK,R4 ;SET MASK COM R4 1$: CMP R2,O.MSK+4 ; IS THE SEARCH ALL DONE? BHI O.DCDB ; YES MOV @R2,R0 ; GET OBJECT TST R1 ;NO BNE 4$ ;BRANCH IF EFFECTIVE SEARCH MOV R0,-(SP) MOV R5,R3 ;EXCLUSIVE OR 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$: 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 MOV R3,-(SP) JSR R5,O.CRLF MOV R2,R0 ;GET READY TO TYPE JSR R5,O.RORA ; CHECK FORMAT MOV #'/,R0 ;SLASH TO R0 JSR R5,O.PUTC ;TYPE IT MOV @R2,R0 ;GET CONTENTS JSR R5,O.CADV ; TYPE CONTENT MOV (SP)+,R3 MOV (SP)+,R2 ;RESTORE R2 MOV (SP)+,R1 ;RESTORE R1 MOV (SP)+,R4 ; RESTORE R4 JSR R5,O.CU ;HAS CTRL/U BEEN STRUCK? BCC O.DCDB ;YES...STOP SEARCH... ;MG01 3$: TST (R2)+ ;INCREMENT TO NEXT CELL AND BR 1$ ; 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 ;(X)+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 ASL 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$ .SBTTL O.GO PROCESS G - GO O.GO: TSTB O.SMFD ;WAS ";" TYPED? BEQ O.ERR1 ;BR IF NOT TYPED TST R3 ;WAS K; TYPED? BEQ O.ERR1 ; TYPE ? IF NOT MOVB #O.BKP+3,O.P ;CLEAR PROCEED ASR R5 ;CHECK LOW ORDER BIT BCS O.ERR1 ;ERROR IF ODD NUMBER ASL R5 ;RESTORE WORD MOV R5,O.UPC ;SET UP NEW PC MOVB #O.STM,-(SP) ;SET HIGH PRIORITY JSR PC,O.WST JSR R5,O.RSTT ;RESTORE TELETYPE O.TBIT: CLRB O.T ;CLEAR BIS #O.TBT,O.UST ; BOTH T-BIT FLAGS TSTB O.S ;SEE IF WE NEED A T BIT BNE O.GO2 ;IF NOT GO NOW BIC #O.TBT,O.UST ;SET TH T BIT JSR R5,O.RSB ;RESTORE BREAKPOINTS O.GO2: JSR R0,O.RSR ;RESTORE REGISTERS MOV O.UST,-(SP) ; AND STATUS MOV O.UPC,-(SP) ; AND PC NOP ; CHANGE TO HALT FOR DEBUGGING MOV O.UST,-(SP) ; MOV IN STATUS FIRST W/O T BIT BIC #O.TBT,(SP) ; SO INTERRUPTS CAN HAPPEN BEFORE JSR PC,O.WST ; RTT TURNS ON THE T BIT. O.RTIT: RTT ; CHANGED TO RTI WHEN RUNNING ; ON 11/05 OR 11/20 .SBTTL O.PROC PROCESS P - PROCEED ; ONLY ALLOWED AFTER A BREAKPOINT O.PROC: TSTB O.SMFD ;WAS ";" TYPED? BEQ O.ERR1 ;BR IF NOT TYPED MOVB O.P,R0 TSTB R0 ;CHECK LEGALITY OF PROCEED BLT O.ERR1 ;NOT LEGAL TST R2 ;CHECK FOR ILLEGAL COUNT BNE O.ERR1 ;JUMP IF ILLEGAL TST R3 ;WAS COUNT SPECIFIED? BEQ 1$ ;NO MOV R5,O.CT(R0) ;YES, PUT AWAY COUNT 1$: MOVB #O.STM,-(SP) ;FORCE HIGH PRIORITY JSR PC,O.WST JSR R5,O.RSTT ;RESTORE TTY O.C1: CMPB O.P,#O.BKP ;SEE IF A REAL ONE OR A FAKE BGT O.TBIT ;BRANCH IF FAKE TSTB O.S ;SEE IF SINGLE INSTRUCTION MODE BNE O.TBIT ;IF SO EXIT NOW MOVB #O.STM,-(SP) ;SET HIGH PRIORITY JSR PC,O.WST INCB O.T ;SET T-BIT FLAG BIS #O.TBT,O.UST ;SET T-BIT BR O.GO2 .SBTTL BREAKPOINT HANDLER O.BRK: MOV (SP)+,O.UPC ;PRIORITY IS 7 UPON ENTRY MOV (SP)+,O.UST ;SAVE STATUS AND PC MOVB #O.BKP+3,O.P ;TELL ;P THAT WE CAN CONTINUE O.BK1: JSR R0,O.SVR ;SAVE VARIOUS REGISTERS TSTB O.T ;CHECK FOR T-BIT SET BNE O.TBIT ;JUMP IF SET JSR R5,O.REM ;REMOVE BREAKPOINTS TSTB O.PRI ;CHECK IF PRIORITY BPL 1$ ; IS AS SAME AS USER PGM MOVB O.UST,R5 ;PICK UP USER UST IF SO BR 2$ 1$: MOVB O.PRI,R5 ;OTHERWISE PICK UP ACTUAL PRIORITY CCC ;CLEAR CARRY RORB R5 ;SHIFT LOW ORDER BITS RORB R5 ; INTO RORB R5 ; HIGH ORDER RORB R5 ; POSITION 2$: BIC #O.TBT,R5 ;CLEAR POSSIBLE T BIT (S/I MODE) MOVB R5,-(SP) ;PUT THE STATUS AWAY WHERE IT BELONGS JSR PC,O.WST MOV O.UPC,R5 ;GET PC, IT POINTS TO THE TRT TSTB O.S ;SEE IF IT WAS SINGLE INSTRUCTION FUN BMI 4$ ;IF SO HANDLE THERE TST -(R5) MOV R5,O.UPC MOV #O.BKP,R4 ;GET A COUNTER 3$: CMP R5,O.ADR1(R4) ;COMPARE WITH LIST BEQ 5$ ;JUMP IF FOUND DEC R4 DEC R4 BGE 3$ ;RE-LOOP UNTIL FOUND JSR R5,O.SVTT ;SAVE TELETYPE STATUS JSR R5,O.CRLF MOV #O.BD,R4 ;ERROR, NOTHING FOUND MOV #O.BD+1,R3 JSR R5,O.TYPE ;OUTPUT "BE" FOR BAD ENTRY MOV R5,R0 ADD #2,O.UPC ;POP OVER THE ADJUSTMENT ABOVE BR 6$ ; OR CONTINUE 4$: MOVB #O.BKP+2,R4 ;SET BREAK POINT HIGH + 1 MOV R5,O.ADR1(R4) ;STORE NEXT PC VALUE FOR TYPE OUT BR 5$ 5$: MOVB R4,O.P ;ALLOW PROCEED DEC O.CT(R4) BGT O.C1 ;JUMP IF REPEAT MOV #1,O.CT(R4) ;RESET COUNT TO 1 JSR R5,O.SVTT ;SAVE TELETYPE STATUS, R4 IS SAFE MOV #'B,R0 JSR R5,O.PUTC ;TYPE "B" MOVB O.P,R0 ;CONVERT BREAKPOINT NUMBER TO ASCII ADD #140,R0 ASR R0 JSR R5,O.PUTC MOV #';,R0 JSR R5,O.PUTC ; TYPE MOV #2,O.BW ; SET WORD MODE MOVB O.P,R4 MOV O.ADR1(R4),R0 ;GET ADDRESS OF BREAK 6$: JSR R5,O.RORA ; CHECK FORMAT JMP O.DCD ;GO TO DECODER .SBTTL SAVE AND RESTORE REGISTERS ;+ ; ; SAVE REGISTERS R0-R6 ; INTERNAL STACK ; ;- O.SVR: MOV (SP)+,O.XXX ;PICK REGISTER FROM STACK AND SAVE MOV SP,O.USP ;SAVE USER STACK ADDRESS MOV #O.USP,SP ;SET TO INTERNAL STACK MOV R5,-(SP) ;SAVE MOV R4,-(SP) ; REGISTERS MOV R3,-(SP) ;1 MOV R2,-(SP) ; THRU MOV R1,-(SP) ; 5 MOV O.XXX,-(SP) ;PUT SAVED REGISTER ON STACK TST -(SP) RTS R0 ; RESTORE REGISTERS R0-R6 O.RSR: TST (SP)+ ;POP THE EXTRA CELL MOV (SP)+,O.XXX ;GET R0 FROM STACK MOV (SP)+,R1 ;RESTORE MOV (SP)+,R2 ; REGISTERS MOV (SP)+,R3 ; 1 MOV (SP)+,R4 ; THRU MOV (SP)+,R5 ; 5 MOV O.USP,SP ;RESTORE USER STACK MOV O.XXX,-(SP) ;PUT R0 ON USER STACK RTS R0 .SBTTL RESTORE BREAKPOINTS 0-7 O.RSB: MOV #O.BKP,R4 ;RESTORE ALL BREAKPOINTS 1$: MOV @O.ADR1(R4),O.UIN(R4) ;SAVE CONTENTS MOV O.TRTC,@O.ADR1(R4) ;REPLACE WITH TRAP DEC R4 DEC R4 BGE 1$ ;RE-LOOP UNTIL DONE RTS R5 ; THEN QUIT .SBTTL SAVE TELETYPE STATUS O.SVTT: .IF EQ $VIRT ;MS01+ MOV @#O.RCSR,O.CSR1 ; Save receiver status BIC #^C,O.CSR1 ; and turn off BIC #RC.IE,@#O.RCSR ; interrupts. MOV @#O.TCSR,O.CSR2 ; Save transmitter status BIC #^C,O.CSR2 ; and turn off BIC #XC.IE,@#O.TCSR ; interrupts. 1$: TSTB @#O.TCSR ;LOOP UNTIL READY BIT COMES ON BPL 1$ ;BR IF BIT NOT ON .IFF ;MG02+ MOV @#JSW,O.JSWS ;SAVE JSW, MOV @#EERB,O.EERB ; ERRBYT AND USERRB ON ENTRY BIC #,@#JSW ;Clear lower-case and FB/XM ; no-block bits. BIS #,@#JSW ;and set TT special mode .RCTRL ;MAKE IT TAKE EFFECT ;MG02- .ENDC ;EQ $VIRT ;MS01- RTS R5 .SBTTL RESTORE TELETYPE STATUS O.RSTT: JSR R5,O.CRLF .IF EQ $VIRT ;MS01+ TSTB @#O.TCSR ;WAIT READY BPL .-4 ; ON PRINTER BIT #4000,@#O.RCSR ;CHECK BUSY FLAG BEQ 1$ ;SKIP READY LOOP IF NOT BUSY TSTB @#O.RCSR ;WAIT READY BPL .-4 ; ON READER 1$: BIS O.CSR1,@#O.RCSR ; Turn on input and BIS O.CSR2,@#O.TCSR ; output interrupts. .IFF ;MG02+ MOV O.JSWS,@#JSW ;RESTORE JSW ON EXIT .RCTRL ;MAKE JSW TAKE EFFECT ;MG02- MOV O.EERB,@#EERB ;NOW RESTORE ERROR BYTES ; (OTHERWISE, .RCTRL WOULD ; HAVE MUNGED ERRBYT) .ENDC ;EQ $VIRT ;MS01- RTS R5 .SBTTL REMOVE BREAKPOINTS 0-7 ; IN THE OPPOSITE ORDER OF SETTING O.REM: TSTB O.S ;SEE IF SINGLE INSTRUCTION IS GOING BNE 2$ ;EXIT IF SO CLR R4 ;REMOVE ALL BREAKPOINTS 1$: MOV O.UIN(R4),@O.ADR1(R4) ;CLEAR BREAKPOINT INC R4 INC R4 CMP R4,#O.BKP BLOS 1$ ;RE-LOOP UNTIL DONE 2$: RTS R5 ;THEN QUIT .SBTTL TYPE OUT CONTENTS OF WORD OR BYTE WITH ONE TRAILING SPACE ; WORD IS IN R0 O.CADV: MOV #6,R3 ;# OF DIGITS MOV #-2,R4 ;# OF BITS FIRST-3 CMP O.BW,#1 ;SEE IF WORD MODE BNE 1$ ;BRANCH IF SO SUB #3,R3 ;ONLY DO 3 DIGITS INC R4 ;DO 2 BITS FIRST SWAB R0 ;AND TURN R0 AROUND 1$: MOV 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 AWAY DEC R4 ;DECREMENT COUNTER BGT 3$ ;LOOP IF MORE BITS NEEDED ADD #'0,R0 ;CONVERT TO ASCII JSR R5,O.PUTC ;TYPE IT DEC R3 ;SEE IF MORE DIGITS TO DO BGT 2$ ;LOOP IF SO MOVB #40,R0 ;SET UP FOR TRAILING SPACE TST (SP)+ ;GET RID OF JUNK BR O.PUTC .SBTTL CLEAR RELOCATION REGISTERS ;+ ; ; O.CLRR CLEAR RELOCATION REGS ; I.E., SET THEM TO A HIGH MEM LOC. (-1) ; R1,R0 CLOBBERED ; ;- O.CLRR: MOV #O.RELT,R1 MOV #-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) RTS R5 .SBTTL SINGLE CHARACTER TYPE-OUT ; TYPE ONLY ONE CHARACTER (CONTAINED IN R0) O.PUTC: .IF EQ $VIRT ;MS01+ TSTB @#O.TCSR BPL .-4 .ENDC ;EQ $VIRT ;MS01- MOV R0,-(SP) ;SAVE CHARACTER FOR AWHILE ;MG01 BIC #177400,R0 ;CLEAR HIGH BYTE,SHOULD NOT ; CONTAIN INPORTANT INFO. BEQ 3$ ;NULLS ARE EASY TO DO... CMPB R0,#10 ;PRINT A '?' FOR ASCII CODES BLOS 2$ ; 1-10 CMPB R0,#16 ; 16-37 BLO 3$ ; 177 CMPB R0,#37 ; 200-377 BLOS 2$ ;ALL OTHERS...LEAVE ALONE CMPB R0,#177 BLO 3$ 2$: MOV #'?,R0 3$: .IF EQ $VIRT ;MS01+ MOVB R0,@#O.TDB .IFF .TTYOUT ;NEED TTYOUT FOR VIRTUAL JOBS .ENDC ;EQ $VIRT ;MS01- MOV (SP)+,R0 ;RESTORE CHARACTER ;MG01 O.TYP1: RTS R5 .SBTTL GENERAL CHARACTER INPUT ROUTINE ; CHARACTER INPUT GOES TO R0 O.GETC: 1$: .IF EQ $VIRT ;MS01+ TSTB @#O.RCSR ;WAIT FOR BPL 1$ ; INPUT FROM KBD MOVB @#O.RDB,R0 ;GET CHARACTER - STRIP OFF PARITY .IFF .TTYIN ;INPUT A CHARACTER .ENDC ;EQ $VIRT ;MS01- BIC #177600,R0 ;STRIP OFF PARITY FROM CHARACTER CMPB R0,#3 ;IS IT ^C? BEQ 4$ ;IF SO, DO NOT ECHO TSTB O.SCRN ;SHOULD WE ECHO ? BNE 2$ ;BR IF YES CMPB R0,#12 ;SEE IF A BEQ 4$ ;IF SO SAVE THE PAPER 2$: CMPB R0,#'A+40 ;IS CHARACTER LOWER CASE? ;MG01+ BLO 3$ ;NOPE... CMPB R0,#'Z+40 ;MAYBE...CHECK UPPER LIMIT BHI 3$ ;NOPE... BIC #40,R0 ;YES...CONVERT IT TO UPPER CASE ;MG01- 3$: JSR R5,O.PUTC ;ECHO CHARACTER BEQ 1$ ;IGNORE NULLS TSTB O.SCRN ;SHOULD WE PASS ON SPACES? BNE 4$ ;BR IF YES CMPB R0,#40 ;CHECK FOR SPACES BEQ 1$ ;IGNORE SPACES 4$: RTS R5 .SBTTL O.TYPE GENERAL CHARACTER OUTPUT ROUTINE ;+ ; ; ADDRESS OF FIRST BYTE IN R4, ; ADDRESS OF LAST BYTE IN R3, (R3)>(R4) ; EXPECTS LOCS 56,57 TO BE INITIALIZED BY MONITOR FOR FILL ; CHARACTERISTICS OF TERMINAL ; 56=CHAR TO BE FILLED AFTER ; 57=# OF NULLS TO FILL WITH ; ;- O.TYPE: CMP R3,R4 ;CHECK FOR COMPLETION BLO O.TYP1 ; EXIT WHEN DONE MOVB (R4)+,R0 ;GET A CHARACTER JSR R5,O.PUTC ;TYPE ONE CHARACTER CMPB R0,@#56 ;COMPARE CHAR AGAINST FILL REQUIREMENT BNE O.TYPE ;NO FILL NEEDED MOVB @#57,(PC)+ ;FILL COUNT INTO TEMP O.FTMP: .WORD 0 CLR R0 ;FILL WITH NULLS 1$: JSR R5,O.PUTC ;TYPE NULLS DEC O.FTMP ;DECREASE COUNT BGT 1$ ;BRANCH IF NOT DONE BR O.TYPE ;LOOP UNTIL DONE .SBTTL ^U TEST ;+ ; ; CHECKS FOR ^U. IF PRESENT, ECHOS IT ; GOES TO COMMAND DECODER. STACK GETS INITIALIZED ; ;- .ENABL LSB ;MG01+ O.CU: .IF NE $VIRT BIS #,@#JSW ;Set inhibit I/O wait .TTINR ;TRY TO GET ONE BIC #,@#JSW ;Clear inhibit I/O wait BCS 1$ ;NO CHARACTER AVAILABLE... .IFF TSTB @#O.RCSR ;CHARACTER AVAILABLE? BPL 1$ ;NOPE... MOVB @#O.RDB,R0 ;YES...GET IT... .ENDC ;EQ $VIRT O.CU1: BIC #177600,R0 ;STRIP PARITY CMPB R0,#'U-'@ ;IS CHARACTER A '^U'? BNE 1$ ;NOPE... MOV #'^,R0 ;YES...PUT "^" IN R0 JSR R5,O.PUTC MOV #'U,R0 ;PUT U IN R0 JSR R5,O.PUTC TST (PC)+ 1$: SEC RTS R5 .DSABL LSB ;MG01- .SBTTL SUBROUTINE TO READ THE PS INDEPENDENT OF MACHINE O.RRST: .IF EQ $VIRT ;MS01+ MOVB ST,O.UST ;STORE THE STATUS IN USER ; STATUS AREA.FOR AN LSI ; THIS IS CHANGED TO ; MFPS O.UST .ENDC ;EQ $VIRT ;MS01+ RTS PC .SBTTL SUBROUTINE TO WRITE PS INDEPENDENT OF MACHINE ; CALL ROUTINE WITH PS VALUE ON THE STACK O.WST: .IF EQ $VIRT ;MS01+ MOVB 2(SP),ST ;STORE NEW PS VALUE ; THIS INSTRUCTION IS CHANGED FOR LSI ; TO MTPS 2(SP) .ENDC ;EQ $VIRT ;MS01- MOV (SP)+,(SP) ;PUT RETURN PC OVER SUB. ARGUMENT RTS PC ;TO RETURN WITHOUT IT ON THE STACK .SBTTL SUBROUTINE TO LOCATE RELOCATION REGISTER ;+ ; ; NEAREST BUT STILL ; BELOW THE ADDRESS IN R0. RETURNS WITH THE REGISTER ; NUMBER IN R0, AND WITH THE DISTANCE BETWEEN THE REGISTER ; AND (R0) IN O.XXY ; IF NO GOOD RELOC. REG. FOUND, R0 WILL = -1 ; ;- O.LOC: MOV R0,5$ ;PUT R0 IN WORKINK LOCATION. CLR R0 MOV #-1,O.XXX ;INITIALIZE RELOC. REG. INDEX MOV #177777,O.XXY ;INITIALIZE DISTANCE TO A HIGH VALUE 1$: CMP R0,#O.RLR ;ARE WE DONE COMPARING? BHI 3$ ;BRANCH IF DONE CMP O.RELT(R0),5$ ;IS CURR. RELOC. BIAS > (O.CAD)? BHI 2$ ;YES -- DON'T SUBTRACT, GET NEXT MOV 5$,R1 ;OTHERWISE TAKE THE DIFFERENCE SUB O.RELT(R0),R1 ; OF CURR. RELOC. REG. AND O.CAD CMP O.XXY,R1 ;IS THE RESULT THE SMALLEST SO FAR? BHI 4$ ;BRANCH IF YES (UNSIGNED CONDITIONAL) 2$: TST (R0)+ ;OTHERWISE, BUMP R0 FOR NEXT ; RELOCATION REGISTER BR 1$ ;LOOP BACK FOR NEXT COMPARISON 3$: MOV O.XXX,R0 ;PUT REG.# IN R0 RTS R5 ;JOB OVER, RETURN 4$: MOV R1,O.XXY ;REMEMBER SMALLEST DIFFERENCE IN O.XXY ASR R0 ;AND ASSOCIATED REGISTER NUMBER MOV R0,O.XXX ; IN O.XXX ASL R0 ;RESTORE R0 TO ORIGINAL VALUE BR 2$ ;GO FO NEXT COMPARISON. 5$: .WORD ;TEMP LOCATION. .SBTTL INIT MEMORY ;+ ; ; SET A SEGMENT OF MEMORY TO A GIVEN 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 OR WORD VALUE IS IN R0 ; BYTE OR WORD MODE IS SPECIFIED BY O.BW ; ;- O.ST: 1$: CMP O.BW,#1 ;IF NOT BYTE MODE, ASSUME WORD BEQ 3$ ;BRANCH IF BYTE MODE MOV R0,(R4)+ ;DEPOSIT WORD VALUE, BUMP R4 BY 2 2$: CMP R4,R3 ;ARE WE DONE? BLOS 1$ ;BRANCH IF NOT DONE RTS R5 ;OTHERWISE EXIT 3$: MOVB R0,(R4) ;DEPOSIT BYTE VALUE INC R4 ;BUMP R4 BY 1 BR 2$ ;GO TO TEST IF DONE .SBTTL CLOSE WORD OR BYTE ;+ ; ; CLOSE WORD OR BYTE AND EXIT, ; UPON ENTERING, R2 HAS NUMERIC FLAG, R4 HAS CONTENTS ; ;- O.CLSE: TST R2 ;IF NO NUMBER WAS TYPED THERE IS BEQ 2$ ;NO CHANGE TO THE OPEN CELL CMP O.BW,#1 BEQ 1$ ;JUMP IF BYTE MODE BLO 2$ ;JUMP IF ALREADY CLOSED MOV R4,@O.CAD ;STORE WORD BR 2$ 1$: MOVB R4,@O.CAD ;STORE BYTE 2$: RTS PC O.CRLF: MOV #O.CR+1,R3 ;LWA BR O.CRS O.CRLS: MOV #O.CR+2,R3 ;LWA * O.CRS: MOV #O.CR,R4 ;FWA JSR R5,O.TYPE ;TYPE SOMETHING RTS R5 .SBTTL DECODE RELATIVE OR ABS ADDRESS ;+ ; ; SUBROUTINE O.RORA ; FUNCTION: DECIDE IF AN ADDRESS IS ; TO BE PRINTED IN ABSOLUTE OR IN RELATIVE ; FORM. IF THE FLAG O.FORM=0 THEN PRINT ; IN RELATIVE FORM, OTHERWISE PRINT IN ABSOLUTE FORM. ; IF THE ADDRESS IS TO BE PRINTED IN RELATIVE FORM, ; THEN THE ADDRESS WILL BE PRINTED OUT ; RELATIVE TO A RELOCATION REGISTER NEAREST ; BUT STILL BELOW THE ADDRESS. IF NO SUCH ; RELOCATION REGISTER EXIST THEN THE ; ADDRESS WILL BE PRINTED IN ABSOLUTE FORM ; INPUT: THE ADDRESS TO BE PRINTED IS IN R0. ; DATA SAVED: R0 CONTAINING THE ADDRESS TO BE ; PRINTED, AND LOCATION O.CAD CONTAINING ; THE CURRENT ADDRESS WERE SAVED AND RESTORED. ; CALLED: JSR 5,O.RORA ; ;- O.RORA: TST O.FORM ;CHECK FORMAT BEQ 2$ ; GO TO 2$ IF RELATIVE 1$: JSR R5,O.CADV ;PRINT ABSOLUTE ADDRESS RTS R5 2$: MOV R0,O.TMP2 ;SAVE R0 JSR R5,O.LOC ; FIND BEST N TST R0 ;IF = -1, PRINT IN ABS. BLT 3$ ADD #60,R0 ; CONVERT N TO ANSCII JSR R5,O.PUTC ; TYPE N MOV #',,R0 ; PREPARE INPUT FOR O.PUTC JSR R5,O.PUTC ; TYPE COMMA MOV O.BW,-(SP) ; SAVE O.BW MOV #2,O.BW ;ARTIFICIALLY SET MODE FOR WORDS MOV O.XXY,R0 ;PREPARE INPUT FOR O.CADV JSR R5,O.CADV ;TYPE RELATIVE AMOUNT MOV (SP)+,O.BW ;RESTORE MODE MOV O.TMP2,R0 ; RESTORE R0 RTS R5 3$: MOV O.TMP2,R0 ;RESTORE R0,CAD BEFORE BR 1$ .SBTTL MOD40 PACK AND UNPACK ;+ ; ; MOD40 PACK - ENTERED WITH JSR PC, PACK00 ; INPUT: R0=ADR OF MOD40 WORD (1 WORD) ; R1=ADR OF ASCII CHARACTERS (3 CHARS) ; OUTPUT: R1 POINTS ONE PAST END OF ASCII STRINT ; THE MOD40 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 (R1)+,R3 ;GET NEXT ASCII CHAR. CMPB R3,#40 BEQ 2$ ;"BLANK" CMPB R3,#'$ BEQ 4$ ;"$" CMPB R3,#'A BLO 3$ ;"." OR "0-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 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 ADD R3,R2 INC R4 ;DONE 3 CHARS? BLT 1$ ;NO MOV R2,(R0)+ ;YES-STORE MOD40 WORD RTS PC ;EXIT .SBTTL MOD40 UNPACK ;+ ; ; MOD40 UNPACK - ENTERED VIA JSR PC,UNPA00 ; INPUT: R0=ADR OF MOD40 NUMBER (1 WORD) ; R1=ADR OF ASCII STRING (3 BYTES) ; OUTPUT: R1 POINTS ONE PAST LAST GENERATED CHARACTER ; ; IF N IS THE MOD40 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 50 TO GET C2 ETC. ; ;- UNPA00: MOV #-3,R5 ;MINOR LOOP COUNT MOV (R0),R0 ;GET MOD40 WORD MOV #COEFF,R2 ;PTR TO COEFFICIENT TABLE 1$: CLR R3 ;0 QUOTIENT ; DIVIDE BY COEFFICIENTS 2$: CMP R0,(R2) ;DONE WITH DIVIDE? BLO 3$ ;YES SUB (R2),R0 ;NO-SUBTRACT COEFF. INC R3 ;ADD 1 TO QUOTIENT BR 2$ ; DIVIDE DONE. QUOT IN R3, REMAINDER IN R0 ; CONVERT TO AN ASCII CHARACTER 3$: TSTB R3 BEQ 4$ ;"BLANK" 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 MOVB R3,(R1)+ ;STORE CHARACTER TST (R2)+ ;ADVANCE TO NEXT COEFF. INC R5 ;DONE 3 CHARS? BLT 1$ ;NO-DO MORE MOV (SP),R0 ;RESTORE ORIGINAL R0 AND TST (R0)+ ;MOVE TO NEXT WORD RTS PC .SBTTL IMPURE DATA, AND DATA ; COEFFICIENT TABLE COEFF: +1600. ;40. ^ 2 +40. ;40. ^ 1 +1. ;40. ^ 0 O.BW: .BYTE 0 ; =0 - ALL CLOSED ; =1 - BYTE OPEN, ; =2 - WORD OPEN .EVEN O.CAD: .WORD 0 ; CURRENT ADDRESS O.DOT: .WORD 0 ; ORIGIN ADDRESS O.XXX: .WORD 0 ;TEMPORARY STORAGE O.XXY: .WORD 0 ;2ND WORD OF TEMPORARY STORAGE O.SEQ: .BYTE 0 ;CHANGE SEQUENCE INDICATOR O.WDFG: .BYTE 0 ;SEARCH FLAG = 1 - EFFECTIVE ; = 0 - WORD O.S: .BYTE 0 ;SINGLE INSTRUCTION FLAG ; 0 IF NOT ACTIVE ; -1 IF ACTIVE ; NO BREAK BOINTS MAY BE SET WHILE IN ; SINGLE INSTRUCTION MODE O.T: .BYTE 0 ; T-BIT FLAG O.P: .BYTE 0 ;PROCEED FLAG = -2 IF MANUAL ENTRY ; -1 IF NO PROCEED ALLOWED ; 0-7 IF PCEED ALLOWED O.CMFD: .BYTE 0 ;COMMA FOUND SWITCH, =0 NO COMMA FOUND ; =1 COMMA FOUND O.SMFD: .BYTE 0 ;SEMICOLON FOUND SWITCH ; =0 NO SEMICOLON FOUND ; =1 SEMICOLON FOUND O.ALF1: .BYTE 0 O.ALF2: .BYTE 0 O.ALF3: .BYTE 0 O.SCRN: .BYTE 0 ;FLAG; 1=PASS SPACES ON FROM TTY ; ALSO, IF =1, IS ECHOED O.ID: .BYTE 012 .BYTE 015 .BYTE 40 .IF EQ $VIRT .NLCSI TYPE=I .IFF .NLCSI .ENDC ;EQ $VIRT O.IDND = .-1 .EVEN O.BD: .WORD "BE O.BIAS: .WORD 0 ;CURRENT RELOCATION BIAS O.MINS: .BYTE 0 ;MINUS SIGN TYPED (SWITCH) ; 0=NO MINUS TYPED ; 1=MINUS SIGN TYPED .EVEN .IF EQ $VIRT O.CSR1: .WORD 0 ; Receiver Status. O.CSR2: .WORD 0 ; Transmitter Status. .ENDC ;EQ $VIRT O.TMP1: .WORD 0 O.TMP2: .WORD 0 ;SAVE CELL O.CR: .BYTE 015 ; .BYTE 012 ; .BYTE '* ; * O.LGCH: .BYTE '; ; .BYTE '/ ; / .BYTE '\ ; \ (BACK SLASH) .BYTE 015 ; CARRIAGE RETURN .BYTE '$ ; $ .BYTE 'G ; G .BYTE 012 ; .BYTE '_ ; _ (BACK ARROW) .BYTE '< ; < .BYTE '^ ; ^ (UP ARROW) .BYTE ', ; , .BYTE 'O ; O .BYTE 'W ; W .BYTE 'E ; E .BYTE 'B ; B .BYTE 'P ; P .BYTE '@ ; @ .BYTE '> ; > .BYTE 'S ; S .BYTE 'R ; R .BYTE 'C ; C .BYTE '- ; - .BYTE 'F ; F .BYTE 'I ; I .BYTE '! ; ! .BYTE 'X ; X .BYTE 'A ; A .BYTE 003 ;CTRL C O.CLGT = .-O.LGCH ;TABLE LENGTH O.TL: .BYTE 'S ;DO 1 .BYTE 'P ;NOT 2 .BYTE 'M ;CHANGE 3 .BYTE 0 ;THE 4 .BYTE 0 ;ORDER 5 .IF NE $VIRT ;MG02+ .BYTE 'J .BYTE 'E .ENDC ;NE $VIRT ;MG02- .BYTE 'C ; 6 .BYTE 'F ; 7 .BYTE 'R ; 10 .BYTE 0 ; 11 .BYTE 0 ; 12 .BYTE 0 ; 13 .BYTE 0 ; 14 .BYTE 0 ; 15 .BYTE 0 ; 16 .BYTE 0 ; 17 .BYTE 'B ; 20 O.LG = .-O.TL .EVEN AREA: .BLKW 2 ;USED BY .GVAL ;MS01 O.TRTC: TRT ;TRACE TRAP PROTOTYPE ; THE ORDER OF THE FOLLOWING ENTRIES IS CRITICAL . = O.ODT-144 ;ODT'S STACK IMMEDIATELY PRECEDES ODT O.UR0: .WORD 0 ;USER R0 .WORD 0 ; R1 .WORD 0 ; R2 .WORD 0 ; R3 .WORD 0 ; R4 .WORD 0 ; R5 O.USP: .WORD 0 ;USER SP O.UPC: .WORD 0 ;USER PC O.UST: .WORD 0 ;USER ST .IF EQ $VIRT ;MS01+ O.PRI: .WORD 7 ;ODT PRIORITY .IFF O.PRI: .WORD 0 ;VDT PRIORITY .ENDC ;EQ $VIRT ;MS01- O.MSK: .WORD 0 ;MSK O.LOW: .LIMIT O.HI = .-2 ;O.LOW: .WORD 0 ;LOW LIMIT ;O.HI: .WORD 0 ;HIGH LIMIT .IF NE $VIRT ;MG02+ O.JSWS: .WORD 0 O.EERB: .WORD 0 ;SAVED ERRBYT AND USERRB .ENDC ;NE $VIRT ;MG02- O.CNST: .WORD 0 ;CONSTANT REGISTER O.FORM: .WORD 0 ; FORMAT REGISTER ; =0 -> RELATIVE ADDRESS TYPEOUT ; <>0 -> ABSOLUTE ADDRESS TYPEOUT ; RELOCATION REGISTERS O.RELT: .WORD -1,-1,-1,-1,-1,-1,-1,-1 ;INITIALLY SET TO A HIGH ADDR. ; BREAK POINT LISTS, ADR1 = ADDRESS OF BREAKPOINT,CT = COUNT, ; UIN = CONTENTS O.ADR1: . = .+O.BKP+4 O.CT: . = .+O.BKP+4 O.UIN: . = .+O.BKP+4 . = O.TRTC+2 .END O.ODT