.NLIST BEX .IIF NDF $VIRT $VIRT= 0 ;$VIRT = 0 -> NORMAL ODT ;$VIRT = 1 -> VIRTUAL ODT ;MS01+ .IF EQ $VIRT .TITLE ODT V01.09 ;IF YOU CHANGE THE VERSION #, ;DRH ; DON'T FORGET TO CHANGE AT O.ID! .IFF .TITLE VDT V04.00 .ENDC ;EQ $VIRT ;MS01- .IIF NDF EIS EIS=1 ;NO EXTENDED INSTRUCTIONS=0 ;DRH+ .IIF NDF TKS TKS=177560 ;SYSTEM CONSOLE KEYBOARD .IIF NDF TKSVEC TKSVEC=60 ;CONSOLE TERMINAL VECTORS .IDENT /V01.09/ ;DRH- .SBTTL OCTAL DEBUGGING PROGRAM ;+ ; ; COPYRIGHT (c) 1979, 1980 BY ; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ; ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND COPIED ; ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE AND 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. NO TITLE TO AND OWNERSHIP OF THE SOFTWARE IS HEREBY ; TRANSFERRED. ; ; THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE ; AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT ; CORPORATION. ; ; DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS ; SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DIGITAL. ; ;- ; ; R. BEAN,JD,DW,MAS,MBG ; .SBTTL EDIT LOG ;+ ; ;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 ; V01.08 18-NOV-81 ADD HOOKS TO DISPLAY PRGRM AND CHG VERSION ;DRH ; INCREASED STACK SPACE FOR ODTV08 ; DONALD R. HANSON, LOCKHEED AIRCRAFT SERVICE INC ; 714-988-2427 DEPT 1-321 ; P.O. BOX 33, ONTARIO, CA, 91761 ; V01.09 7-OCT-83 ADDED GLOBALS TO ENABLE "PRELOADING" OF ; REL REG'S & BKPTS,SAVSYS,RSTSYS ;DRH ;- .SBTTL DEFINITIONS .MCALL .GVAL ;MS01+ .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 . = .+200 ;NEED MORE STACK SPACE(ODTV08) ;DRH . = .+144+26+30+10 ;RESERVES SPACE FOR STACK .IF NE $VIRT ;MS01+ . = .+40. ;GET MORE FOR VDT .ENDC ;NE $VIRT ;MS01- ; GENERAL REGISTERS R0 = %0 R1 = %1 R2 = %2 R3 = %3 R4 = %4 R5 = %5 SP = %6 ;STACK POINTER PC = %7 ;PROGRAM COUNTER 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 $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 MTPS = 106400 ;MOVE TO PS FOR LSI MFPS = 106700 ;MOVE FROM PS FOR LSI .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: JSR PC,SAVSYS ;TO SAVE STATUS ;DRH ; 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 #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. JMP (PC)+ ;PROCESSOR DEPENDENT INSTRUCTION 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 EXIT: JSR PC,RSTSYS ;RESTORE THE SYSTEM ADDRESSES ;DRH 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,V8STRT ;HOOK TO THE DISPLAY SETUP ;DRH 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,V08SRV ;SCAN THE COMMAND FLAGS ;DRH 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+ MOVB @#O.RCSR,O.CSR1 ;SAVE R C/SR MOVB @#O.TCSR,O.CSR2 ;SAVE T C/SR CLRB @#O.RCSR ;CLEAR ENABLE AND MAINTENANCE CLRB @#O.TCSR ; BITS IN BOTH C/SR 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 ON ENTRY BIS #10000,@#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$: MOVB O.CSR1,@#O.RCSR ;RESTORE MOVB O.CSR2,@#O.TCSR ; THE STATUS REGISTERS .IFF ;MG02+ MOV O.JSWS,@#JSW ;RESTORE JSW ON EXIT .RCTRL ;MAKE IT TAKE EFFECT ;MG02- .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 #100,@#JSW ;SET INHIBIT I/O WAIT .TTINR ;TRY TO GET ONE BIC #100,@#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 .IF EQ $VIRT ;MS01+ O.CSR1: .BYTE 0 ;SAVE CELL - R C/SR O.CSR2: .BYTE 0 ;SAVE CELL - T C/SR .ENDC ;EQ $VIRT ;MS01- 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 ;MS01+ .ASCII /ODT V01.09 / ;DRH .IFF .ASCIZ /VDT V04.00 / .ENDC ;EQ $VIRT ;MS01- 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 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 .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 .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: ;V01.09+ RREG.0::.WORD -1 ; USER MAY LOAD THESE LOCATIONS RREG.1::.WORD -1 ; WITH THE "ADDRESS" VALUE AT RREG.2::.WORD -1 ; THE START OF EACH PSECT IN HIS RREG.3::.WORD -1 ; INITIALIZATION PROCEDURE.. RREG.4::.WORD -1 ; NEGATING THE NEED TO DO IT RREG.5::.WORD -1 ; MANUALLY EACH START-UP RREG.6::.WORD -1 RREG.7::.WORD -1 ;INITIALLY SET TO A HIGH ADDR. ; BREAK POINT LISTS, ADR1 = ADDRESS OF BREAKPOINT,CT = COUNT, ; UIN = CONTENTS O.ADR1: BKPT.0::.WORD 0 ; PRELOAD THE "BREAKPOINT" ADDRESS BKPT.1::.WORD 0 ; FOR "0" & "7" BKPT.2::.WORD 0 BKPT.3::.WORD 0 BKPT.4::.WORD 0 BKPT.5::.WORD 0 BKPT.6::.WORD 0 BKPT.7::.WORD 0,0 O.CT: . = .+O.BKP+4 O.UIN: INST.0::.WORD 0 ; INSTRUCTION MUST GO HERE IF BRKPT INST.1::.WORD 0 ; IS PRELOADED BY "INITIALIZATION" INST.2::.WORD 0 INST.3::.WORD 0 INST.4::.WORD 0 INST.5::.WORD 0 INST.6::.WORD 0 INST.7::.WORD 0,0 ;V01.09- DRH . = O.TRTC+2 ;.LIST ;MODIFIED ON 13-MAY-82 REORDERED ACUM.L TO ENABLE ;"SEARCH" PROPERLY IF LINK MAP IS ALPHABETIC OR NOT .SBTTL V0108 DEFINITIONS AND UNIQUE MACROS ;DECIFER FOREGOING CODE SUFFICIENTLY TO OBTAIN THE ;ENTRY "HOOKS" ONLY. INITIALIZE VECTORS, SETUP ;INPUT FILE, AND DISPLAY THE MENU AT THE FIRST ;BREAKPOINT. THEREAFTER, WAIT FOR "BRK/COMMAND"!! .MCALL .ENTER,.CSISPC,.READW,.WRITW .MCALL .CLOSE,.EXIT,.LOOKUP .ENABL LC ;DEFINITIONS FOR MESSAGE USE BEL =7 BS =10 LF =12 CR =15 ESC =33 SPC =40 QUES =77 DEL =177 HME =110 ENSCR =112 B9 =1000 ;FUNCTION B12 =10000 ;CTRL BITS ;TERMINAL NOTES: ;VT-100'S ARE UTILIZED IN VT-52 MODE TO REDUCE CONTRL SEQ'S ;THIS PROGRAM WAS WRITTEN USING THE "CONSOLE" AS I/O. ;THIS MAY BE CHANGED TO AN AUX. TERMINAL BY REDEFINING ;THE APPROPRIATE STATEMENTS IN A PREFIX FILE. TERMINALS ;OTHER THAN VT-52/100 OR LOOK ALIKES MAY BE USED HOWEVER ;ONE SHOULD BE BEWARE OF THE CURSOR "ESC SEQUENCES". ;9600 BAUD ON THE VT-52 FLICKERS SOME BUT IS NOT VEXING. ;VT100 DOESN'T FLICKER & CAN BE RUN AT 19.2 KB. LOWER ;BAUD RATE MEANS SLOWER SCREEN UPDATE, NOT APPLICATION ;PROGRAM ITERATION RATE. DATA UPDATING IS PERFORMED AT ;LTC INTERRUPT ONLY IN DYNAMIC MODE, DURING THE "BREAK" ;IN NORMAL MODE. SCREEN WRITING IN DYNAMIC MODE IS ;<<54 * 12> + 6>CHAR PER UPDATE ITERATION, AT 5 BASIC ;PROGRAM INSTRUCTIONS/CHR OUTPUT IT'S EFFECT ON EXECUTION ;TIME OF AN R/T APPLICATION IS ESSENTIALLY NIL. ;KEYBOARD CAN BE ASSIGNED TO OTHER ADDRESSES & VECTORS ;BY DEFINING "TKS & TKSVEC" IN A PREFIX FILE ;TKS = KYBD STS REGISTER ADDRESS(177560) TKB =TKS+2 ;KYBD BUF TPS =TKS+4 ;PRTR STS TPB =TKS+6 ;PRTR BUF ;TKSVEC =60 ;KYBD SERV VECTOR TKSPRI =TKSVEC+2 ;IT'S PRIORITY TPSVEC =TKSVEC+4 ;PRTR SERV VECTOR TPSPRI =TKSVEC+6 ;AND PRIORITY ;PROGRAM MACROS..SAVE SOME CODING & ERRORS .MACRO SAVE A1,A2,A3,A4,A5,A6 ;DEFAULT(BLANK) .IF B ;SAVES ALL REG'S MOV R0,-(SP) MOV R1,-(SP) MOV R2,-(SP) MOV R3,-(SP) MOV R4,-(SP) MOV R5,-(SP) .MEXIT .ENDC MOV A1,-(SP) ;OR ANYTHING, #,@#,FLG .IIF NB , MOV A2,-(SP) .IIF NB , MOV A3,-(SP) .IIF NB , MOV A4,-(SP) .IIF NB , MOV A5,-(SP) .IIF NB , MOV A6,-(SP) .ENDM .MACRO RSTORE A1,A2,A3,A4,A5,A6 ;OPPOSITE ORDER .IF B ;SAVES ERRORS MOV (SP)+,R5 MOV (SP)+,R4 MOV (SP)+,R3 MOV (SP)+,R2 MOV (SP)+,R1 MOV (SP)+,R0 .MEXIT .ENDC .IIF NB , MOV (SP)+,A6 .IIF NB , MOV (SP)+,A5 .IIF NB , MOV (SP)+,A4 .IIF NB , MOV (SP)+,A3 .IIF NB , MOV (SP)+,A2 MOV (SP)+,A1 .ENDM .MACRO CRLF .ASCII <15><12> .ENDM .MACRO AI TEXT .ASCII %TEXT% .ENDM .MACRO AZ TEXT .ASCIZ %TEXT% .ENDM .MACRO PRINT ASCSTR MOV #ASCSTR,R1 CALL PRINT .ENDM .MACRO NUMCHR CHRCNT SAVE R5 MOV #CHRCNT,R5 CALL NUMCHR RSTORE R5 .ENDM .MACRO INCHAR CALL INCHAR .ENDM .MACRO OUTCHR CALL OUTCHR .ENDM .SBTTL USER FLAGS, SYMBOLS AND ADDRESS TABLES ;ORDER OF FLAGS IS IMPORTANT ONLY BECAUSE THEIR ;ADDRESSES ARE "SPECIFIED" IN THE MENU ACUM.L::0 ;VALUE OF ACCUMULATOR RPTF.G::0 ;CONTINUOUS REPORT FLG DYNF.G::0 ;DYNAMIC DISPLAY MODF.G::0 ;MODIFY FILE FLAG TMPF.G::0 ;TEMP MOD OF FILE RDFF.G::0 ;READ FILE FLG BRKF.G::0 ;STOP THE PROGRAM HEXF.G::0 ;DISPLAY IN "HEX" WRDF.G::0 ;DISPLAY IN OCTAL/DECIMAL BYTF.G::0 ;"BYTE" DECIMAL/OCTAL FLAG DEFE.R: 0 ;INDIRECT FUNCTION ACCF.G: 0 ;ACCUMULATOR FLG BLNK.F::0 ;BLINK CHANGING DATA BUFFER: ;SAVE FILE BUFFER STARTS HERE FFLG.0::0 ;FUNCTION FLAGS(OPER SET) FFLG.1::0 ;WILL INITIATE PRE SELECTED FFLG.2::0 ;FUNCTIONS AS PROGRAMMED FFLG.3::0 ;BY THE USER IN DYNAMIC MODE. FFLG.4::0 ;MAY BE USED IN THE APPLIC FFLG.5::0 ;PROGRAM SINCE THEY ARE FFLG.6::0 ;DECLARED GLOBAL! FFLG.7::0 ;TAKE CARE WITH DEFE.RED FFLG.8::0 ;ADDRESSES, THEY CAN DESTROY FFLG.9::0 ;A PRGM, IF YOU ERR!!! ;THE FOLLOWING TABLES ORDER IS "MUY IMPORTANTE" ;THE SCREEN SYMBOLICS ARE REFERENCED: ;COLUMN 1 SYMBOLS 01 THRU 12 ; 2 13 24 ; 3 25 36 ;BUT THEY ARE NOT STORED THAT WAY!! SYM01: AI ;ROW 1 - COL 1 SYM02: AI ; 1 2 SYM03: AI <007410FFLG.0 > ; 1 - 3 SYM04: AI ; " 2 " 1 SYM05: AI ;ETC,ETC....ETC SYM06: AI <007412FFLG.1 > SYM07: AI SYM08: AI SYM09: AI <007414FFLG.2 > SYM10: AI SYM11: AI SYM12: AI <007416FFLG.3 > SYM13: AI SYM14: AI SYM15: AI <007420FFLG.4 > SYM16: AI SYM17: AI SYM18: AI <007422FFLG.5 > SYM19: AI SYM20: AI SYM21: AI <007424FFLG.6 > SYM22: AI SYM23: AI SYM24: AI <007426FFLG.7 > SYM25: AI SYM26: AI SYM27: AI <007430FFLG.8 > SYM28: AI SYM29: AI SYM30: AI <007432FFLG.9 > SYM31: AI SYM32: AI SYM33: AI <007406BLNK.F > SYM34: AI SYM35: AI SYM36: AI <007356ACUM.L OO > SYM37: AI SYM38: AI SYM39: AI SYM40: AI SYM41: AI SYM42: AI SYMEND: 0 .EVEN ;TABLE OF ADDRESSES TO THE SYMBOLIC LABELS SYMTBL: SYM01,SYM04,SYM07,SYM10,SYM13,SYM16,SYM19,SYM22,SYM25,SYM28 SYM31,SYM34,SYM02,SYM05,SYM08,SYM11,SYM14,SYM17,SYM20,SYM23 SYM26,SYM29,SYM32,SYM35,SYM03,SYM06,SYM09,SYM12,SYM15,SYM18 SYM21,SYM24,SYM27,SYM30,SYM33,SYM36,SYM37,SYM38,SYM39,SYM40 SYM41,SYM42 TBLEND: 0 ADRTBL: .BLKW 36. .WORD O.UR0,O.UR0+4,O.UR0+8.,O.UR0+2,O.UR0+6,O.UR0+10. ADREND: 0 ;END OF ADDRESS TABLES .SBTTL INTERNAL PRGM FLAGS, MESSAGES AND TABLES MENF.G::0 ;DISPLAY THE MENU AD1FLG: 0 ;ADDRESS VALUE STORAGE AD2FLG: 0 ;2ND P/O THE ADDRESS NUMFLG: 0 ;NUM OF DIGITS ONEFLG: 0 ;ONCE ONLY OFFSET: 0 ;TBLE OFFSET CHGFLG: 0 ;COMMAND CHG FLG MONSAV: 0,0,0,0,0,0 ;KBRD MON ADR'S & LTC FILPTR: .RAD50 /DK0ODTV09FIL/ ;SAVE IT ON THE SYSTEM DEVICE ;MESSAGE AREA FLGSET: AZ < SET> FLGCLR: AZ < CLR> HOME: .BYTE ESC,HME,0 ;UP/LFT CORNER CLRSCR: .BYTE ESC,HME ;CLR IT ERASE: .BYTE ESC,ENSCR,0 ;FROM WHEREVER YOU ARE BACKUP: .BYTE BS,BS,BS,BS,BS,BS,0 BLANKS: .BYTE ESC,113 PCRLF: .BYTE CR,LF,0 SPC7: .BYTE SPC,SPC,SPC,SPC,SPC;7 CONSECUTIVE SPACES SPC2: .BYTE SPC ;2 ONLY SPC1: .BYTE SPC,0 QUERIE: .BYTE BEL,QUES,BS,0 ;ILLEGAL ENTRY DELETE: .BYTE BS,SPC,BS,0 ;DEL & BACKUP SCRUUP: AZ ADDRES: AZ SYMBOL: AZ MODMSG: AZ <(N)O/"##" TO CHNG = > WRTMSG: AI .BYTE CR,LF,0 NRFMSG: AZ TSTCHR: AI ACUM.L DEVFIL: AI .BYTE CR,LF,0 NOFIL: AZ MENU: AI < SET FLG AT BRKPNT TO IMPLMNT FNCTN..(NXT BRKPNT)> CRLF AI < NON COMMAND KEY..CLRS ALL OPTIONS..@/A/XX> CRLF AI < DYNAMIC MODE..(W/;7B) USE KEY SHOWN> CRLF CRLF AI <7360 RPTF.G SCRN UPDTE @ BRKPNT> CRLF AI <7362 DYNF.G SCRN UPDTE-R/T (D)> CRLF AI <7364 MODF.G CHG LABEL/UPDTE FILE (M)> CRLF AI <7366 TMPF.G TMP CHG LABEL/NO UPDTE (T)> CRLF AI <7370 RDFF.G READ FILE/CANCEL TMPF.G (R)> CRLF AI <7372 BRKF.G STP PRGRM/INIT BRKPNT 7 (^B)> CRLF AI <7374 HEXF.G ALT ACT, HEX WRDS (H)> CRLF AI <7376 WRDF.G DSPLY WRD/OCT(0),DEC(1) (W)> CRLF AI <7400 BYTF.G DSPLY BYT/OCT(0),DEC(1) (^W)> CRLF AI <7406 BLNK.F BLNK CHG'D FLG/ADD'L(B) INC'S BLNK CNT (B)> CRLF AI < DEFE.R ACUM.L DATA/SET/CLR @ADDR(FFLG.X) (@)> CRLF AI <7356 ACUM.L ALT ACT "A"=OPEN INPUT DATA(DEC/OCT) (A)> CRLF AI < FFLG.X FUNCT FLGS 0-9....(X)[@] (S)ET/(C)LR> CRLF AI < SYMBOL (0X)/(XX) (A)DATA/(S) FLG/(S)ET/(C)LR> CRLF AI <11672 MENF.G DSPLY MENU> CRLF .BYTE CR,LF,0 .EVEN DEFTYP: .RAD50 "MAP" ;DEFAULT DEV TYPE LIST: ;EMT ARG LIST.. OUTSPC: .BLKW 15. ;RETURN IT HERE! MAPFIL: .BLKW 24. ;INPUT FIL DISCR DATLST: .REPT 42. ;COMPARE NEW VALUE TO DATA LIST .WORD 177777 ;INSURE CLEANUP AT THE START .ENDR ;NO OLD DATA IS DISPLAYED HIMEM: 0 ;MEM ADDR STRT OF LNK MAP MEMAVL: 0 ;MAX ADR(WRDS) AVAIL BLKCNT: 0 ;BLOCK COUNT TOTBLK: .BYTE 0 ;TOTAL BLKS IN MAP NUMBLK: .BYTE 0 ;# OF BLKS TO (XFER) SYMF.D::.BYTE 0 ;SYMBOLIC FOUND SYMCNT: .BYTE 0 ;SYMBOLIC COUNT ONCE: .BYTE 0 ;CLR DSPLY INTFLG: .BYTE 0 ;INTERRUPT CTRL LINOUT: .BYTE 0 ;PRESENT LINE OUT LCHRCT: .BYTE 0 ;CHRS @ LINE TBLNDX: TABLE ;DATA TABLE INDEX TABLE: SYM01,SYM02,SYM03,SYM04,SYM05,SYM06,SYM07,SYM08,SYM09 SYM10,SYM11,SYM12,SYM13,SYM14,SYM15,SYM16,SYM17,SYM18 SYM19,SYM20,SYM21,SYM22,SYM23,SYM24,SYM25,SYM26,SYM27 SYM28,SYM29,SYM30,SYM31,SYM32,SYM33,SYM34,SYM35,SYM36 NXTBYT: LINBUF ;CHR TO BE OUTPUTTED ;CURSOR POSITIONING ESCAPE SEQUENCES ;ROW NUMBER IS CHG'D BY "INTRPT" ;FOR EACH LINOUT TO THE DISPLAY LINBUF: .BYTE 33,131 ;ESC,Y, ROW: .BYTE 40,50 ;ROW ?,COL 9 .BLKB 14. ;DATA .BYTE 33,131,70,105 ;ESC,Y,ROW,COL 38 .BLKB 14. ;DATA .BYTE 33,131,70,142 ;ESC,Y,ROW,COL 67 .BLKB 14. ;DATA LBUNCH: .BYTE 12,15,33,112 ;LF,CR,ESC,J CLR SCREEN AND GOHOME: .BYTE 33,110 ;ESC,H GO TO LEFT TOP LINE: .BYTE 40,41,42,43 ;1,2,3,4 CHG CODE FOR .BYTE 45,46,47,50 ;6,7,8,9 FOR EACH LINOUT .BYTE 52,53,54,55 ;11,12,13,14 STUFF IT AT "ROW" ;KEYBOARD COMMAND TABLE BYTTBL: .BYTE 'D,'M,'T,'R,2,'H,'W,27,'@,'A,'B,'0,'1,'2,'3,'4,'5,'6,'7,'8,'9,'C,'S HEXTBL: .BYTE '0,'1,'2,'3,'4,'5,'6,'7,'8,'9,'A,'B,'C,'D,'E,'F .EVEN .SBTTL V0108 START ;THE PROGRAM BEGINS! GAIN ACCESS THRU ODT ;PROVIDES OPERATOR SELECTION OF FUNCTIONS ;AN INITIAL "BREAK" MUST OCCUR TO ENTER ;THE HOOK FROM "ODT" IS JSR R0,O.SVR V8STRT: MOV (SP)+,O.XXX ;STANDARD MOV SP,O.USP ;ODT MOV #O.USP,SP ;INSTRUCTIONS SAVE R5,R4,R3,R2,R1 ;..WILL NOT MOV O.XXX,-(SP) ;DISTURB TST -(SP) ;THEM TST ONEFLG ;ONCE ONLY BNE 1$ ;EXECUTED ONLY ONCE! ;IF THE BUS EVENT VECTOR IS RELOADED AFTER ;THIS, IT WILL STEAL THE INTERRRUPT ENTRY ;POINT AND YOU CAN FORGET THE DYNAMIC DISPLAY!!! ;SWAPS VECTORS DURING INTERRUPT TO INSURE SUCCESS ;REMINDER..ODT HAS CONTROL RIGHT NOW! ;USES "LTC" VECTOR FOR R/T DISPLAY SUPPORT SAVE ;WILL USE FOLLOWING PRINT CLRSCR ;CLR THE WHOLE THING PRINT MENU ;ATTN YOU ALL!! CALL RDFILE ;READ FILE FIRST INC ONEFLG ;DON'T COME BACK MOV #2,RPTF.G ;REQ REPORT MOV @#100,SAV100 ;INT SRVCE ADR MOV #V08ATT,@#100 ;ATTACH REPORT PGM RSTORE ;RESTORE ALL REG'S 1$: CMP O.ADR1+14.,#O.TRTC;BRK PNT SET? BEQ 3$ ;GUESS NOT! TST BRKF.G ;BREAK REQUEST? BNE 2$ ;NE = YES MOV #2,O.CT+14. ;BRK 7 COUNT BR 3$ ;KEEP THE CNT UP 2$: CLR O.CT+14. ;ALLOW BREAK 7 3$: RTS R0 ;BACK TO STANDARD ODT ;....EXECUTED ONCE! ;INTRPT PROCESSES THE DATA DURING INTERRUPT ;KBDSRV PASSES OPERATOR REQUEST TO PGM ;INPROC SERVICES THE DISPLAY V08ATT: MOV #INTRPT,@#100 ;;;NEW STRT MOV #KBDSRV,@#TKSVEC;;;INTERPRET THE KBRD MOV #340,@#TKSPRI ;;;NO INT! MOV #INPROC,@#TPSVEC;;;NEW ADR MOVB #340,@#TPSPRI ;;;NO INTERRUPT THE INT. MOVB #100,TKS ;;;SET 'ENABLE' JMP INTRPT ;;;COMPLETE INT REQUEST .SBTTL SERVICE THE USER COMMAND FLAGS ;SCANS FLAGS TO DETERMINE THE USER REQUEST ;SUBR IS CALLED BY ODT IF LEGITIMATE BRK OCCURS ;I.E. 10;P WILL NOT CALL UNTIL COUNT =0 V08SRV: JSR R5,O.SVTT ;THE OTHER "HOOK" SAVE ;SAVE ALL REGS MOV #DYNF.G,R0 ;STRT TST HERE CLR (R0)+ ;NO INT DURING BREAK MOV #3,R1 ;LOOP CNT & INDEX 1$: ASR (R0)+ ;NXT FLAG IN LINE BCS 2$ ;WAS ON! SOB R1,1$ ;LOOP ASR MENF.G ;CAN'T REMEMBER IT BCC 4$ PRINT CLRSCR ;CLEAN UP PRINT MENU ;PRINT IT AGAIN BR 9$ 2$: ASL R1 ;OFFSET JMP @3$(R1) ;DO THE FUNCTION 3$: 4$,7$,6$,5$ ;FILLER,RDF,TMP,MOD 4$: ASR RPTF.G ;SET? BCC 9$ ;NO! IT'S "2 OR 0" ROL RPTF.G ;PUT IT BACK BR 8$ ;REPORT ALL! 5$: CALL MODIFY ;WHICH ONE(S) CALL WRFILE ;UPDATE DISK BR 8$ 6$: CALL MODIFY ;WRITE 'EM BIS #B9,ONEFLG ;DBLE CHK ON "SRCH" BR 8$ ;MAKE SURE OF ADRESSES 7$: CALL RDFILE ;RECOVER OLD STUFF 8$: COMB CHGFLG+1 ;MODE CHGS? CALL SETMODE ;AND DISPLAY THEM CALL RPTSYM ;GET NEW DATA CALL REPORT ;AND WRITE IT ALL PRINT ERASE ;CLEAN UP YOUR BOTTOM 9$: CLR BRKF.G ;NO MORE BRKS! RSTORE ;RESTORE REGS RTS R5 ;RETURN TO ODT .SBTTL FILE ACCESS ROUTINE ;READS AN EXISTING SYMBOLIC FILE TO THE "BUFFER" ;IF IT DOES NOT EXIST!!, IT CREATES IT. IT MUST ;BE "UPDATED" TO SYMBOL LABEL DESIRED BY THE USER. ;UPDATE ACTIVITY "WRITES" THE FILE TO THE DISK. ;SUBSEQUENT "STRT UP" INPUTS THE UPDATED VERSION RDFILE: .LOOKUP #LIST,#0,#FILPTR ;OPEN CHANNEL BCC LUPFIN ;FILE IS ON "DK:" ;IT'S NOT THERE, CREATE IT WRFILE: .ENTER #LIST,#0,#FILPTR,#3 ;OPEN FILE BCC ENTROK FAIL: PRINT NRFMSG ;SYSTEM ERROR JMP EXIT ;RETURN TO MONITOR ;WRITE IT TO THE "SYSTEM STORAGE" ENTROK: .WRITW #LIST,#0,#BUFFER,#SYMEND-BUFFER/2,#0 BCS FAIL PRINT PCRLF PRINT WRTMSG ;WRITE TO FILE BR CLSEFL LUPFIN: .READW #LIST,#0,#BUFFER,#SYMEND-BUFFER/2,#0 BCS FAIL CLSEFL: .CLOSE #0 ;CLOSE IT FOR NOW TST ONEFLG ;1ST TIME THRU? BEQ 1$ ;YES! BMI 2$ ;NO FILE! BIT #B9,ONEFLG ;TMP MOD WAS DONE? BEQ 2$ ;NOT THIS TIME BIC #B9,ONEFLG ;GET RID OF IT 1$: CALL SEARCH ;GET FILE(LINKMAP) 2$: CALL ADRCVR ;CNVRT ADDRESSES RETURN .SBTTL SYSTEM "SAVE & RESTORE ROUTINES" ; WE DON'T KNOW IF THE CONSOLE OR AN AUX TERMINAL WILL BE USED ; AND IF THE "LTC" VECTOR IS GOING TO BE CHANGED ; TO EXIT "ODTV09" ... ALL MUST BE THE SAME AS AT STARTUP .ENABL LSB SAVSYS: SAVE R0,R1 MOV #60,R0 ;START WITH THE CONSOLE MOV #MONSAV,R1 ;AND STORE THEM HERE MOV (R0)+,(R1)+ ;KEYBOARD ROUTINE MOV (R0)+,(R1)+ ;PRI MOV (R0)+,(R1)+ ;PRINTER ROUTINE MOV (R0)+,(R1)+ ;PRI MOV #100,R0 BR 2$ RSTSYS: SAVE R0,R1 ;RESTORE THEM ALL MOV #MONSAV,R0 ;SO WHEN WE EXIT MOV #60,R1 ;THERE WILL BE NO MOV (R0)+,(R1)+ ;UNEXPECTED INTERRUPTS MOV (R0)+,(R1)+ MOV (R0)+,(R1)+ MOV (R0)+,(R1)+ CMP #TKSVEC,#60 ;WERE WE USING AN AUX BEQ 1$ ;TERMINAL VECTORS CLRB @#TKS ;IF SO ... DISABLE IT CLRB @#TPS 1$: MOV #100,R1 2$: MOV (R0)+,(R1)+ MOV (R0)+,(R1)+ RSTORE R0,R1 RETURN .DSABL LSB .SBTTL KEYBOARD INTERFACE TO THE USER ;INTERPRET KYBRD INPUTS TO SET THE PROPER FLGS ;CTRL/B INITIATES BRKPNT 7 IF IT HAS BEEN SET ;"B" WILL START THE FLGS BLINKING ;"A" OPENS AND CLOSES THE ACCUMULATOR ;0-9[@] & CLR OR SET WILL OPERATE FUNCTION FLAGS ;0X TO XX & CLR/SET WILL OPERATE ON SYMBOLICS ;WITH ACUM.L OPEN, "SET" XFERS ITS VALUE TO FUNCT ;INVALID CHARACTERS CANCEL OPERATIONS ;IF ACUM.L IS OPEN, CLR IT TOO ;SET THE DEFE.R FLAG IF REQUESTED, BUT WATCH IT ;SWITCH DISPLAY MODES: DECIMAL,OCTAL,HEX ;DATA ENTRY IS NOT POSSIBLE IN HEX(REF ONLY) ;"W" AND "^W" ALTERNATE THE DISPLAY MODE .ENABL LSB KBDSRV: SAVE R0,R1,R2,R3,R4 ;;;SAVE THESE MOV #20040,R4 ;;;SPC SPC INCHAR ;;;GET THE CHAR MOV R0,R3 ;;;COPY CLR R2 ;;;INDEX 1$: CMPB R0,BYTTBL(R2) ;;;VALID CHR? BEQ 2$ ;;;MUST BE INC R2 ;;;INCR PTR CMP R2,#23. ;;;STOP THE LOOP BCS 1$ ;;;LOOK AGAIN TST ACCF.G ;;;ACCUM OPEN? BEQ 10$ ;;;NO! CLR ACUM.L ;;;IF IT'S OPEN CLR LSDIGT ;;;THE DECIMAL VALUE CLR LSDIGT+2 ;;;5 CONSECUTIVE CLR LSDIGT+4 ;;;BYTES BR 9$ ;IT'S P/O OF THE TABLE, WHAT IS IT? 2$: CMP R2,#11. ;;;FLAGS? BCS 15$ ;;;SET THEM SUB #21.,R2 ;;;NUMBERS? BMI 11$ ;;;YES IF NEG ;IT'S A CLR OR SET 3$: TST ACCF.G ;;;ON? BEQ 5$ TST R2 ;;;CLR IT? BNE 4$ ;;;NO, USE IT MOV R2,ACUM.L ;;;VALUE ENTERED CLR LSDIGT ;;;CLR IT TOO CLR LSDIGT+2 ;;;ALL BYTES CLR LSDIGT+4 ;;;MS DIGIT JMP 27$ ;SET IT 4$: MOV ACUM.L,R2 ;;;USE IT! 5$: MOV AD1FLG,R1 ;;;MULTI TST NUMFLG ;;;1 DIG? BMI 7$ ;;;2ND IS + ;IS "EIS" REQ'D? .IF EQ EIS ;;;IS AN EIS INSTR CALL MULT10 ;;;SET AVAILABLE? .IFF MUL #10.,R1 ;;;=TENS DIGIT (EIS) .ENDC 6$: ADD AD2FLG,R1 ;;;AN OFFSET BMI 9$ ;;;NO "00" CMP R1,#72. ;;;TOO HIGH? BCC 9$ ;;;OR "36+" MOV R2,@ADRTBL(R1) ;;;SET OR CLR BR 9$ ;DEFERRED OR DIRECT? 7$: TST DEFE.R ;;;INDIRECT? BEQ 8$ ;;;NO..DIRECT MOV R2,@FFLG.0(R1) ;;;VALUE (X) BR 9$ ;DIRECT, CLR THE WORLD 8$: MOV R2,FFLG.0(R1) ;;;DIRECT 9$: CLR ACCF.G ;;;CLOSE IT 10$: CLR AD2FLG ;;;DONE!! CLR DEFE.R ;;;START CLR NUMFLG ;;;FRESH MOV R4,SYM36+20. ;;;CLR "A" MOV R4,SYM36+22. ;;;DBL SPC BR 22$ ;;;SET MODE CHR ;IT'S A NUMBER! STUFF IT! 11$: SUB #'0,R0 ;;;MAKE IT BIN TST ACCF.G ;;;PUT IT THERE! BEQ 13$ ;;;NO! SEL SYMBOL # BIT #1,WRDF.G ;;;DECIMAL ENTRY? BNE 12$ ;;;YES .REPT 3 ;;;SHIFT IT ASL ACUM.L ;;;LEFT, MAKE .ENDR ;;;ROOM FOR BIS R0,ACUM.L ;;;NEW DIGIT BR 22$ 12$: CALL DECBIN ;;;DEC TO BINARY BR 22$ ;;;GET OUT ;1ST DIGIT 13$: ASL R0 ;;;WORD OFFSET COM NUMFLG ;;;BEFORE? BPL 14$ ;;;2ND DIG MOV R0,AD1FLG ;;;STORE IT MOVB R3,SYM36+22. ;;;1ST DIGIT MOVB R4,SYM36+23. ;;;CLR 2ND DIG BR 27$ ;2ND DIGIT 14$: CLR DEFE.R ;;;DEFERRED TO SUB #2,R0 ;;;SYM NOT VALID MOVB R4,SYM36+21. ;;;KILL THE "@" MOV R0,AD2FLG ;;;STORE IT MOVB R3,SYM36+23. ;;;2ND DIGIT DISPL BR 27$ ;IT IS A FUNCTION 15$: CMPB R0,#'A ;;;IS IT THE ACCUM? BNE 17$ ;;;MUST BE FUNCTION COM ACCF.G ;;;TURN IT ON/OFF! BMI 16$ ;;;ON! MOVB R4,SYM36+20. ;;;CLR IT! BR 27$ 16$: MOVB R0,SYM36+20. ;;;ACC IS ON! BR 22$ ;;;ACUM.L OPEN ;INCREMENT THE "BLINKING" FLAG 17$: ASL R2 ;;;WORD COUNT CMP R2,#20. ;;;BLNK.F? BCS 19$ ;;;SOMEONE ELSE TSTB BLNK.F ;;;+? BMI 18$ ;;;ALREADY ON! ADD #2,BLNK.F ;;;INCREASE BR 20$ ;;;BLINK CYCLE 18$: SUB #2,BLNK.F ;;;STILL ADDS BR 20$ ;SET THE FUNCTION FLAG 19$: INC DYNF.G(R2) ;;;SET FLG TST R2 ;;;=0? NO BRK BEQ 20$ ;;;DYNAM MODE CMP R2,#6. ;;;FUNCTION? BHI 20$ ;;;MOD/READ/TMP INC BRKF.G ;;;& BREAK BR 27$ ;TEST THE DISPLAY MODE FLAGS 20$: TST DEFE.R ;;;ON? BEQ 21$ ;;;NO! MOVB #'@,SYM36+21. ;;;YES 21$: SETMODE:CMP HEXF.G,#1 ;;;(REF ONLY) BHI 22$ ;;;OFF! ALT ACTION BCS 23$ ;;;WASN'T ON! MOVB #'H,SYM36+18. ;;;IT'S HEX BR 25$ ;;;FOR THE BYTES 22$: CLR HEXF.G ;;;ALT/OFF/ON 23$: BIT #1,WRDF.G ;;;IS IT ODD? BEQ 24$ ;;;MODE =OCT WORDS MOVB #'D,SYM36+18. ;;;IT IS DEC BR 25$ 24$: MOVB #'O,SYM36+18. ;;;IT IS OCTAL 25$: BIT #1,BYTF.G ;;;MODE =OCT BYTES BEQ 26$ ;;;IF =0 MOVB #'D,SYM36+19. ;;;DEC MODE BR 27$ 26$: MOVB #'O,SYM36+19. ;;;OCT MODE 27$: INC CHGFLG ;;;WHERE TO RETURN? BPL 28$ RETURN 28$: RSTORE R0,R1,R2,R3,R4 RTI .DSABL LSB .SBTTL SUPPORT ROUTINES ;"PRINT" OUTPUTS TO THE CONSOLE ;THE (R1)= LINE ADDRESS PRINT: TSTB @#TPS ;BUFF RDY? BPL .-4 MOVB (R1)+,@#TPB ;OUTPUT IT TSTB (R1) ;END OF MSG? BNE PRINT ;FINISH IT RETURN ;CHROUTPUT ROUTINE USES R0 FOR TRANSFER OUTCHR: TSTB @#TPS ;ASCII NUMBER BPL .-4 MOVB R0,@#TPB ;SNGL CHR RETURN ;LINE CHR OUTPUT ROUTINE USES (R0) FOR ;THE TRANSFER, R5 = # OF CHAR TO PRINT NUMCHR: TSTB @#TPS ;ASCII A/N BPL .-4 MOVB (R0)+,@#TPB SOB R5,NUMCHR ;NXT CHR RETURN ;INPUT CHARACTER FROM KEYBRD TO R0 INCHAR: TSTB @#TKS ;CHR AVAILABLE? BPL .-4 ;LOOP TIL RDY MOVB @#TKB,R0 BIC #177600,R0 ;CLR PARITY BIT RETURN ;MULTIPLY ASSEMBLY FOR "EIS" ONLY .IF EQ EIS ;VALUE=R1*10 (NO EIS) MULT10: ROL R1 ;DOUBLE IT MOV R1,-(SP) ;STORE IT ROL R1 ;4 TIMES ADD R1,(SP) ;6 TIMES ADD (SP)+,R1 ;10 TIMES RETURN MUL256: CLR -(SP) ;MULTIPLY THIS NUMBER 1$: ADD #256.,(SP) SOB R1,1$ ;R1*256. MOV (SP)+,R1 ;THE ANSWER! RETURN .ENDC .SBTTL DATA CONVERSION ROUTINES ;BINARY VALUE IN R0 .. ENCODES BIN TO ASCII ;ENTER - LO OR HI BYTE - ADDR TO STUFF..(R2) ;BLANK THE LEADING ZEROS HIBYTE: SWAB R0 ;ENTER HERE FIRST LOBYTE: SAVE R1 CLR -(SP) ;LEAD 0 IND. MOV #3,R1 ;3 BYTES OF ASCII BIC #177400,R0 ;CLR UPPER BYTE BR 2$ 1$: ASL R0 ;SHIFT 3 2$: ASL R0 ;2..1ST TIME ASL R0 ;MSB ARE SWAB R0 ;IN LO BYTE BNE 3$ ;LEAD ZERO TST (SP) ;BEEN SET? BNE 4$ ;IF NOT MOVB #SPC,(R2)+ ;BLANK IT BR 5$ 3$: INC (SP) ;NOT ZERO! 4$: ADD #'0,R0 ;MAKE IT ASCII MOVB R0,(R2)+ ;TO THE TBL 5$: CLRB R0 ;GET RDY TO PUT SWAB R0 ;DATA IN LO BYTE SOB R1,1$ ;3 TIMES TST (SP)+ RSTORE R1 RETURN ;CONVERT BINARY TO HEX FOR THE DISPLAY ;DATA IS IN R0, STUFF CONV..(R2) ;USES "HEXTBL" FOR THE CONV. BINHEX: SAVE R3,R5 MOV #4,R5 ;4 ALPH/NUM CHAR. MOV R0,-(SP) ;COPY IT MOV #20040,(R2)+ ;SPC,SPC 1$: CLR R3 ;TABLE INDEX .REPT 4 ASL (SP) ;SHIFT TO CARRY BIT ROL R3 ;STORE IT .ENDR MOVB HEXTBL(R3),(R2)+;STUFF IT IN DISPLAY SOB R5,1$ ;ALL 4 CHRS TST (SP)+ ;RESTORE SP RSTORE R3,R5 RETURN ;BINARY(OCTAL) TO ASCII CONVERT - DATA IN R0 ;ADDR TO STORE CONV.. (R2) ;BLANK LEADING ZEROS BINASC: SAVE R1,R3,R4,R5 CLR R4 ;LEAD 0 IND MOV #6,R5 ;DIGIT CTR MOV R0,R1 ;COPY IT ASL R1 ;SHIFT 1ST DIGIT BCC 4$ ;MUST BE ONE 1$: MOVB #'1,(R2)+ ;TO DO THIS INC R4 ;DISPLAY 0'S 2$: DEC R5 ;ONE LESS DIGIT 3$: CLR R3 ;FOR NEW DIGIT .REPT 3 ;3 TIMES/CHR ASL R1 ;SET CARRY? ROL R3 ;ROTATE IT IN .ENDR BNE 5$ ;IF IT'S ZERO TST R4 ;IS IND SET? BNE 6$ ;YES 4$: MOVB #SPC,(R2)+ ;BLANK BR 7$ 5$: INC R4 ;DISPLAY 0 6$: ADD #'0,R3 ;ASCII MOVB R3,(R2)+ ;STORE IN TBL 7$: SOB R5,3$ BR COMXIT ;SAVE MEMORY ;CONVERT THE DATA TO A DECIMAL VALUE ;DISPLAY IN ASCII- DATA IS IN R0, STORE @R2 DECBYT: SAVE R1,R3,R4,R5 ;SAVE SAVE R0 MOV #3,R5 ;3 DIGITS ON BYTES MOV #4,R4 ;THE OFFSET TO "LST" BIC #177400,R0 ;ONLY THE BYTE BR DIVDE BINDEC: SAVE R1,R3,R4,R5 ;MAY NEED LATER SAVE R0 MOVB #SPC,(R2)+ ;DECIMAL IS 5 BYTES MOV #5,R5 CLR R4 ;LIST INDEX DIVDE: MOV R0,R1 ;QUOTIENT TO ODD REG CLR R3 ;BLANK CTR 1$: CLR R0 ;YOU SHALL RECEIVE .IF EQ EIS ;EIS INSTRUCTION 2$: CMP DECLST(R4),R1 ;SUB UNTIL NEG BHI 3$ ;TOO MUCH! INC R0 ;ONCE EA TIME SUB DECLST(R4),R1 ;RSTORE IT BR 2$ ;TILL TOO SMALL 3$: TST R0 ;ANY AT ALL? .IFF DIV DECLST(R4),R0 ;DIV BY LIST VALUE .ENDC BNE 4$ ;ANYTHING THERE? TST R3 ;MORE SPACES BNE 5$ ;BEEN A DIGIT? MOVB #40,(R2)+ ;NO, BLANK IT BR 6$ 4$: INC R3 ;FLAG IT 5$: ADD #'0,R0 ;MAKE IT ASCII MOVB R0,(R2)+ ;STORE IN TABLE 6$: TST (R4)+ ;INC THE PNTR SOB R5,1$ ;5 TIMES RSTORE R0 BR COMXIT ;COMMON CODE(SAVE MEM) ;CONVERT THE ACCUMULATOR INPUT FROM ;KEYBOARD TO A DECIMAL NUMBER DECBIN: SAVE R1,R3,R4,R5 SAVE R2 CLR -(SP) ;DATA SAVE CLR R5 ;DECLST(I) MOV #4,R2 ;4 TO SHIFT MOV #LSDIGT+3,R3 ;STOR AREA 1$: MOVB (R3),1(R3) ;SHIFT LEFT MOV DECLST(R5),R1 ;MULTIPLY BY MOVB (R3),R4 ;FETCH THE VAL BIC #177400,R4 ;MAKE SURE! ;IF "EIS" IS NOT PRESENT .IF EQ EIS CLR -(SP) ;THE RESULT 2$: TST R4 ;= 0? BEQ 4$ 3$: ADD R1,(SP) ;MULT BY ADD SOB R4,3$ ;6 TIMES MAX 4$: MOV (SP)+,R1 .IFF MUL R4,R1 ;BIN(BYTE) * LST .ENDC ADD R1,(SP) ;STORE IT TST (R5)+ ;INC THE PNTR DEC R3 ;FOR NEXT LS DIGIT SOB R2,1$ MOVB R0,1(R3) ;BOTTOM DIGIT ADD R0,(SP) ;ADD THE LAST MOV (SP)+,ACUM.L ;DONE RSTORE R2 COMXIT: RSTORE R1,R3,R4,R5 RETURN LSDIGT: 0,0,0 ;STORE THE DIGITS DECLST: 10000.,1000.,100.,10.,1 ;GREAT IDEA! .SBTTL ASCII TO BINARY ADDRESS CONVERTER ;THE ROUTINE ASSUMES THAT IF A....Z HAS BEEN ;CHANGED .. A NEW SYMBOL HAS BEEN SELECTED ;IS IT A VALID ADDRESS? ;IF NOT, A....Z HAS NOT CHG'D ADRCVR: MOV #SYMTBL,R3 ;ADDRESS TO CONVERT MOV #ADRTBL,R1 ;FINISHED ADDR HERE MOV #36.,R4 ;# OF ITERATIONS 1$: MOV @R3,R2 ;A COPY! CMPB (R2),#'A ;TST IF SYMBOLIC CHG'D BNE 2$ ;IF IT HASN'T CHG'D CMPB 5(R2),#'Z ;"A----Z", SKIP IT BNE 2$ ;HOPE THERE IS NO CLR (R1) ;SYMBOL LIKE THAT! BR 4$ ;CLR THE ADDRESS ;ASCII TO BINARY CONVERTER ;ASCII CODE..(R2) STORE @R1 2$: SAVE R3,R4,R5 ;NEED THEM AGAIN MOV #6,R5 ;DIGITS MOVB (R2)+,R4 ;TOP OF DIGIT BIC #177776,R4 ;MAY BE =1 DEC R5 ;6 TIMES 3$: MOVB (R2)+,R3 ;NEW CODE BIC #177770,R3 ;LEAVE THE OCT DIG ASL R4 ;MAKE ROOM ASL R4 ;IN THE REG ASL R4 ;TO ADD ADD R3,R4 ;THE NEW VALUE SOB R5,3$ ;REPEAT MOV R4,@R1 ;ADDR IS FIN RSTORE R3,R4,R5 4$: CMP (R1)+,(R3)+ ;NXT STORE ADR & ASCII ADR SOB R4,1$ RETURN .SBTTL GENERATE A REPORT ON THE SYMBOLICS ;FETCH EACH ADDRESS, COMPARE DATA AGAINST PREVIOUS ;VALUE ... NO CHANGE MEANS DO NOTHING ;NEW VALUE UPDATES THE LIST AND IS CONVERTED ;REPORT SYMBOLICS... TAKE DATA FROM ADDR ;IN TBL(R1) AND CONVERT IT TO ASCII CODE FOR ;DISPLAY. (R2) CONTAINS THE TBL ADR FOR THE ;ASCII CONVERSION RPTSYM: CLR R1 ;ADR TBL MOV #SYMTBL,R3 ;SYMBOLIC/DATA TBL TSTB BLNK.F ;BLINK CHANGING DATA? BEQ 1$ COMB BLNK.F ;ALTERNATE DISPLAY TSTB BLNK.F+1 BMI 1$ ;NEG! DECB BLNK.F+1 1$: TST ADRTBL(R1) ;0?,NO ADDRESS THERE BEQ 14$ ;GET NXT ONE! CMP @ADRTBL(R1),DATLST(R1);SAME? BNE 2$ TST CHGFLG ;BEEN ANY CHG? BEQ 14$ ;THEN SKIP IT! 2$: MOV @R3,R2 ;COPY! ADD #12.,R2 ;THE DATA AREA MOV #6,R5 ;6 BYTES MOV @ADRTBL(R1),R0 ;IS IT A FLG? CMP R0,#1 BEQ 4$ ;IT'S A FLG BCC 8$ ;LARGER THAN 1 3$: MOV #FLGCLR,R4 ;SAY! CLR BR 5$ 4$: CMP R1,#70. ;ACCUMULATOR? BEQ 8$ ;VALUE ONLY! MOV #FLGSET,R4 ;SAY! SET ;SKIP THE FLAGS IF THEY ARE = AND SAVE TIME 5$: MOVB (R4)+,(R2)+ ;LOAD THE TABLE SOB R5,5$ ;WITH 6 CHAR TSTB BLNK.F ;WANT IT TO BLINK? BEQ 7$ ;NO BMI 12$ ;DISPLAY IT FIRST TSTB BLNK.F+1 ;0? BEQ 7$ ;BLNK CNT DONE! BPL 6$ ;NOT YET MOVB BLNK.F,BLNK.F+1 ;RELOAD 6$: MOV DATLST(R1),R0 ;DISPLAY "OLD" BR 12$ 7$: MOV R0,DATLST(R1) ;MAKE THEM ALIKE BR 12$ ;DO THE BYTES 8$: TST CHGFLG ;ANY NEW COMMANDS? BNE 9$ ;THEN DO IT ALL! CMP R0,DATLST(R1) ;BUT DON'T REPEAT BEQ 14$ ;SAVE TIME 9$: MOV R0,DATLST(R1) ;RELOAD IT TST HEXF.G ;OR HEX? BEQ 10$ CALL BINHEX ;CONV BIN TO HEX BR 12$ 10$: BIT #1,WRDF.G ;DEC WRD? BEQ 11$ ;NO! CALL BINDEC ;DEFAULT! BR 12$ 11$: CALL BINASC ;TO ASCII WORD 12$: CMP R2,#SYM36+18. ;DON'T CONVERT BYTES BEQ 14$ ;"MODE" DISPLAY AREA BIT #1,BYTF.G ;WANT OCTAL BYTES TOO? BEQ 13$ ;YES SWAB R0 ;DO THE OTHER ONE CALL DECBYT ;CONVRT BYTES TO DEC. SWAB R0 ;DO THE OTHER ONE CALL DECBYT ;LO ORDER BYT BR 14$ 13$: SAVE R0 ;HIBYTE WILL DESTROY CALL HIBYTE ;R0...NOW DO BYTES RSTORE R0 ;WE DON'T CARE CALL LOBYTE ;IF R0 GETS CLOBBERED 14$: CMP (R1)+,(R3)+ ;INC ADR TBL & DATA WRD CMP R1,#84. ;END ADR TBL? BNE 1$ ;CHECK EACH ONE 15$: CLR CHGFLG ;RESET IT RETURN .SBTTL THE SCREEN "WRITE" ROUTINE ;FILE HAS BEEN UPDATED ... SEND ;IT TO THE TO THE VIDEO TERMINAL ;TAKES A FULL SECOND TO WRITE THIS ;WE USUALLY ARE AT A BRKPNT SO THE ;TIME DOES NOT MATTER, DATA CAN'T CHANGE REPORT: PRINT HOME ;CURSOR TO HOME MOV SYMTBL,R0 ;STRT DSPL HERE MOV #3,R5 ;# OF GROUPS 1$: MOV #4,R4 ;# OF LINES 2$: MOV #3,R2 ;# OF TABS +1 MOV R2,R3 ;# OF TIMES 3$: ADD #6,R0 ;OFFSET TO SYM NUMCHR 6 ;OUTPUT 6 CHR'S PRINT SPC2 ;SPC,SPC NUMCHR 6 ;DATA WORD PRINT SPC1 ;SPC NUMCHR 3 ;HBT PRINT SPC1 ;SPC NUMCHR 3 ;LBT DEC R2 ;3-SEQUENCES BEQ 4$ ;SKIP SPCS PRINT SPC7 ;7 SPCS TO NXT ONE 4$: SOB R3,3$ ;3 PER LINE PRINT PCRLF ;1 LIN DONE SOB R4,2$ ;4 LINES IN GRP PRINT BLANKS ;1 GRP DONE SOB R5,1$ ;3 BIG GRPS COM (PC)+ ;LAST GROUP .WORD 0 ;ALTERNATE FLAG! BEQ 5$ ;HAS ONLY INC R5 ;2 LINES MOV #2,R4 ;GO TO IT BR 2$ 5$: RETURN .SBTTL MODIFY THE SYMBOL FILE PER USER REQUEST ;INPUT THE SYMBOL LABEL NUMBER (1) TO (35) AND CALL TO ;REPLACE "SYMBOL" WITH ONE SPECIFIED BY THE USER ;THEN CONVERT ASCII ADDR TO BIN FOR THE ADDRESS TABLE. MODIFY: CALL REPORT ;WRITE PRESENT STUFF CLR OFFSET ;# HERE- CONVERT CLR R4 ;# OF CHRS PRINT MODMSG ;USING UPDTBL, PRINT PRINT ERASE ;CLEAN SCREEN 1$: CALL INCHAR ;IS MORE? IF NOT, WRITE CMPB R0,#72 ;PRINTABLE? BCS 2$ ;DIGIT CMPB R0,#'N ;WANT OUT! BEQ 5$ ;YES=N PRINT QUERIE ;ILLEG CHAR BR MODIFY 2$: OUTCHR ;ECHO IT SUB #'0,R0 ;0 TO 9? BMI 4$ ;MAY BE ILLEGAL INC R4 ;KEEP TRK OF CHR'S ASL R0 ;WORD CNT CMP R4,#2 ;2ND DIG? BCC 3$ ;YES MOV R0,OFFSET ;STORE IT BR 1$ 3$: MOV OFFSET,R1 ;X 10 ON 1ST DIG ;EIS IS REQ'D HERE TOO .IF EQ EIS CALL MULT10 ;MULTI R1*10 .IFF MUL #10.,R1 ;1ST DIGIT .ENDC ADD R1,R0 ;TO 2ND DIG MOV R0,OFFSET 4$: SUB #2,OFFSET BMI MODIFY ;LOWER THAN 0 CMP OFFSET,#70. ;OVER 35 SYMBOLS BCC MODIFY ;CAN'T CHG 36(+) PRINT PCRLF ;SHOW ACTION! CALL CHGSYM ;CHANGE SYMBOL BIS #B12,ONEFLG ;FLG FROM MODIFY! CALL CHGADR ;& ADDRESS BIC #B12,ONEFLG ;NOW CLR IT! BR MODIFY 5$: CALL ADRCVR ;CONVERT ADDR TO BIN RETURN .SBTTL CHANGE THE SYMBOL FILE ;CHGE THE SYMBOL FILE AS DESIRED BY THE PROGRM'R ;USES OFFSET TO FILE FROM "MODIFY" CHGSYM: MOV #6,R4 ;# OF CHAR'S TO CHANGE CALL LOADR0 ;SET INDEX ADD R4,R0 ;"SYMBOL" MOV R0,R2 ;COPY PRINT SYMBOL NUMCHR 6 ;OLD SYMBOL PRINT BACKUP ;WRITE OVER IT 1$: INCHAR ;FETCH A CHAR CMPB R0,#'A ;IN RANGE? BCS 3$ ;NOT ALPHA CMPB R0,#'Z ;NO LC BLOS 2$ ;IN RANGE CMPB R0,#DEL ;DELETE THE PREVIOUS? BNE 4$ ;NOT LEGAL PRINT DELETE ;SO DELETE IT CMP R4,#6 ;1ST CHAR? BEQ 1$ ;POINTERS OK? DEC R2 ;PUT PTR BACK INC R4 ;INC CHR CTR BR 1$ 2$: OUTCHR ;PRINT IT MOVB R0,(R2)+ ;STORE IT SOB R4,1$ ;MUST BE 6 BR 7$ ;FINIS 3$: CMPB R0,#'. ;A PERIOD? BEQ 2$ CMPB R0,#'$ ;OR DOLLAR? BEQ 2$ CMPB R0,#SPC ;LEGAL BEQ 2$ CMPB R0,#CR ;OK! WITH BEQ 5$ ;RESTRICTIONS CMP R4,#6 ;1ST CHR? BEQ 4$ CMPB R0,#'0 ;WHAT WAS IT? BCS 4$ ;KILL IT CMPB R0,#72 ;WAS IT DIGIT? BCS 2$ 4$: PRINT QUERIE ;NO COMPRENDE! BR 1$ 5$: CMP R4,#6 ;1ST CHR? BEQ 7$ ;SAME AS BEFORE TST R4 ;ALL SIX? BEQ 7$ ;YES 6$: MOVB #SPC,R0 ;LEFT JUSTIFIED OUTCHR ;ONLY MOVB R0,(R2)+ ;FILL IT UP SOB R4,6$ 7$: RETURN LOADR0: MOV #SYMTBL,R0 ;AN INDEX PTR ADD OFFSET,R0 ;+ OFFSET MOV @R0,R0 ;R0 IS THE PTR MOV R0,R2 ;A COPY RETURN .SBTTL CHANGE THE ADDRESS ;CHANGE ADDRESS - CONVERT ASCII INPUT ;TO BINARY AND STUFF TBL'S, ALLOWS OPER ;TO SPECIFY MEM LOC FOR DATA MONITORING ;IF "SYMBOL" SPECIFIED IS A GLOBAL.. ;SEARCH FINDS IT'S ADDR & STORES IT CHGADR: CALL SEARCH ;SRCH THE LINK MAP BCS 9$ ;ADDR WAS FOUND CLR R4 ;DIGITS CALL LOADR0 ;INDEX PRINT PCRLF PRINT ADDRESS ;REMINDER NUMCHR 6 ;THE OLD ONE PRINT BACKUP ;WRITE OVER IT 1$: INCHAR CMPB R0,#70 ;TST FOR NUMERALS BCS 2$ CMPB R0,#DEL ;ERROR? BNE 3$ ;NO TST R4 ;0? BEQ 1$ ;NXT CHR PRINT DELETE ;ERASE IT DEC R2 ;RESET PNTRS DEC R4 BR 1$ 2$: CMPB R0,#CR ;DONE? BEQ 5$ ;YES CMPB R0,#'0 ;NUMERO? BCC 4$ ;UNO-SIETE 3$: PRINT QUERIE ;ILLEG CHR BR 1$ 4$: OUTCHR MOVB R0,(R2)+ ;STUFF TBL INC R4 ;CTR CMP R4,#6 ;NEED SIX BNE 1$ CMPB -6(R2),#'2 ;STAY IN RANGE BCS 9$ BR 8$ ;6 DONE 5$: TST R4 ;SAME ADR AS BEFORE? BEQ 9$ ;NONE ENTERED! MOV #6,R5 ;TOTAL CNT SUB R4,R5 SAVE R3 MOV R2,R3 ;COPY ADD R5,R2 ;ADD DIFF IN CNTS MOV #6,R5 6$: MOVB -(R3),-(R2) ;SHIFT POSITIONS DEC R5 SOB R4,6$ 7$: MOVB #'0,-(R2) ;STUFF WITH 0 SOB R5,7$ RSTORE R3 BR 9$ 8$: PRINT PCRLF ;ONLY 6 CHR PRINT SCRUUP ;MUST BE IN RANGE PRINT PCRLF ;177777 JMP CHGADR 9$: RETURN .SBTTL SEARCH FOR THE ADDRESS IN THE LINKMAP ;COPY LINKMAP INTO MEMORY, IN SECTIONS IF NEC. ;SRCH MAP FOR GLOBALS IN THE SYMBOL FILE & ;RETURN WITH THE "CARRY" SET IF IT FINDS THEM ;.CSISPC INPUTS LINKMAP "SPEC". SETB ONEFLG+1 ;IF SUCCESSFUL, & CHNGE SYMBOL ADDR(S) IN FILE. ;SUBR SETS ONEFLG+1 TO MINUS IF UNSUCCESFUL ;IN SEARCH FOR LINK MAP ;SETB ONEFLG NEG IF MAP MUST BE READ IN SECTIONS ;B12 IS SET IF SEARCH IS ENTERED FROM "MODIFY" ;ONLY A SINGLE SEARCH IS REQUIRED! ;CARRY IS CLR IF SYMBOLIC NOT FOUND SEARCH: TSTB ONEFLG+1 ;HERE BEFORE? BEQ 3$ ;ONCE ONLY! BPL 1$ JMP OUT1 ;CLR CARRY 1$: TSTB ONEFLG ;SPACE AVAIL BPL 2$ MOVB NUMBLK,R1 ;BLKS TO XFER .IF EQ EIS CALL MUL256 ;MULT R1*256 .IFF MUL #256.,R1 ;WORDS .ENDC CLR BLKCNT .READW #LIST,#3,HIMEM,R1,#0;READ IN BASE 2$: BIT #B12,ONEFLG ;FROM MODIFY? BEQ SETUP JMP TEST1 ;TST ONLY ONE ;FIND OUT HOW MUCH "MEMORY SPACE" & GET THE FIL SPEC 3$: MOV @#54,-(SP) ;STRT OF RMON ADD #266,(SP) ;OFFSET TO USR AREA MOV @(SP)+,MEMAVL ;STRT OF USR SUB @#50,MEMAVL ;BYTES FREE SPACE SUB #2,MEMAVL ;ACCOUNT FOR "MAP" CLC ;LOAD AREA ROR MEMAVL ;WORDS 4$: PRINT DEVFIL .CSISPC #OUTSPC,#DEFTYP,#0;GET FILNAME INC SP ;IT'S OFF BY 2 INC SP ;BUT DON'T CHG "C" BCS 9$ 5$: INCB ONEFLG+1 ;SUCCESSFUL .LOOKUP #LIST,#3,#MAPFIL;OPEN FILE BCS 9$ ;AN ERROR! MOV R0,TOTBLK ;# OF BLKS 6$: MOVB R0,NUMBLK ;SAVE IT MOV R0,R1 ;COPY #BLKS ;HOW MUCH ROOM IS REQ'D? .IF EQ EIS CALL MUL256 ;THE HARD WAY .IFF MUL #256.,R1 ;# WORDS .ENDC CMP R1,MEMAVL ;SPC AVAIL? BCS 8$ ;THERE'S ROOM TSTB ONEFLG ;+ = /2 BPL 7$ ;- = SUB 1 SOB R0,6$ ;TILL IT FITS BR 10$ ;IF IT DON'T 7$: ASR R0 ;DIV/2 BIS #200,ONEFLG ;WON'T FIT BR 6$ ;TRY AGAIN ;READ IT 8$: MOV R1,MEMAVL ;WORDS ASL MEMAVL ;TO BYTES MOV @#50,HIMEM ;LOAD LOCATION ADD #2,HIMEM ;IS "ABOVE" PRGRM ADD HIMEM,MEMAVL ;DENOTES TOP OF MAP .READW #LIST,#3,HIMEM,R1,#0;READ IT ABOVE THE PRGM BCC 11$ PRINT NRFMSG ;NO FILE OR ? BR 10$ 9$: PRINT NOFIL 10$: BISB #200,ONEFLG+1 ;MAKE MINUS JMP OUT2 ;CAN'T CONTINUE 11$: TSTB ONEFLG ;DID IT FIT? BMI SETUP ;IN SECTIONS ONLY .CLOSE #3 ;DONE WITH IT ;ONLY USED IF THE ENTIRE MAP CAN BE READ TO MEMORY ;NO POINT IN SEARCHING THE "SPECS" EACH TIME FIND: MOV @#50,R1 ;START HERE 1$: MOV #TSTCHR,R2 ;TST CHARACTERS CLR R4 ;A CHR CTR 2$: CMPB (R1)+,(R2)+ ;CHAR THE SAME BNE 1$ ;NO, STRT OVER INC R4 ;CHAR CNT CMP R4,#6 ;MUST MATCH 6 BCS 2$ ;CHK AGAIN SUB R4,R1 ;1 ST SYMBOLIC MOV R1,HIMEM ;TEST FROM HERE ON ;ENTER AT SETUP FOR A FULL SEARCH OF ADDRESSES ;AT "TEST1" FOR INDIVIDUAL SYMBOLIC " ;DON'T REPORT UNFOUND SYMBOLS, PRGM TOO BIG ;ALREADY. ALL GLOBALS WILL BE FOUND SETUP: CLR SYMF.D TEST36: MOVB #36.,SYMCNT ;36 IN SYMBOL FILE TSTALL: CLR OFFSET ;SETUP CONDITIONS TEST1: CALL LOADR0 ADD #6,R0 ;POINT TO THE SYMBOL MOV HIMEM,R5 ;START TEST HERE 1$: MOV R0,R3 ;ANOTHER COPY CLR R4 ;CHR CTR 2$: CMPB (R5)+,(R3)+ ;MEMORY VS SYMBOL TBL BEQ 6$ CMP R5,MEMAVL ;TOP OF THE LOAD BCS 3$ ;NO! BIT #B12,ONEFLG ;YES BEQ 9$ ;IT'S A FULL SEARCH BR 10$ ;NXT SECTION? 3$: CMPB (R5),#50 ;IS IT "(" ? BNE 4$ ADD #22.,R5 ;SKIP SPECS! BR 1$ ;IF IT MISSES, SKIP THE ADDRESS 4$: CMPB -1(R5),#'A ;ALPHA/NUMERIC? BCS 1$ 5$: SUB #9.,R4 ;ANY MATCH? COM R4 ;STEP (9-(R4)) ADD R4,R5 ;HELP SPEED UP BR 1$ ;THE SEARCH 6$: INC R4 ;< 6 CMP R4,#6 ;MUST ALL MATCH BCS 2$ ;< 6! 7$: CMPB (R5)+,#'0 ;A NUMBER? BCS 7$ ;PRINTABLE? DEC R5 ;PNTR 8$: MOVB (R5)+,(R2)+ ;STORE AT "ADDREZ" SOB R4,8$ SEC ;IT WAS THERE! BIT #B12,ONEFLG ;ONE ONLY? BNE OUT2 ;YES INCB SYMF.D 9$: CMPB SYMF.D,#36. ;ANY MISSING BCC OUT2 ADD #2,OFFSET ;GET THE NXT DECB SYMCNT ;DO 36 TIMES BNE TEST1 10$: TSTB ONEFLG ;MAP SECTIONED? BPL OUT1 ;NO, IT'S NOT 11$: MOVB NUMBLK,R1 ;TO TRANSFER ADD R1,BLKCNT ;ONES READ CMPB BLKCNT,TOTBLK ;READ THEM ALL? BCC OUT2 ;YES! ;BLK COUNT * 256 .IF EQ EIS CALL MUL256 .IFF MUL #256.,R1 ;FIND # OF WRDS .ENDC .READW #LIST,#3,HIMEM,R1,BLKCNT BCS 12$ BIT #B12,ONEFLG ;DO IT OVER BNE TEST1 BR TEST36 12$: PRINT NRFMSG ;READ ERROR OUT1: CLC OUT2: RETURN .SBTTL LTC "INTERRUPT" PROCESSING ;"REPORT" THAT PERFORMS DYNAMIC OUTPUT TO ;THE CRT ON AN INTERRUPT BASIS. REQUIRES ;A MINIMUM SHARE OF ITERATION TIME ;INTFLG INHIBITS DATA UPDATE UNTIL CYCLE ;IS FINISHED. DOES NOT OUTPUT SYMBOLICS!! ;SERV VEC WAS CHG'D TO THE SERVICE ROUTINE ;THAT OUTPUTS SUCCESSIVE "DATA BYTES" UNTIL ;ALL IS DONE. INTRPT: TST DYNF.G ;;;IN PROGR? BNE 1$ CLR ONCE ;;;RESET ALL CLR LINOUT2 BR XITINT ;;;LEAVE 1$: TSTB INTFLG ;;;COND? BMI XITINT ;;;LINE IN PROGRESS! ;SETUP FOR SNGLE LINE AT A TIME TO "DATA" ;(LINE BUFFER). CLEAN SCREEN ONCE PROCES: SAVE ;;;SAVE ALL TSTB ONCE ;;;CLEAR SCR? BNE 1$ INCB ONCE ;;;DO IT CLRB @#TPS CALL REPORT ;;;ONE TIME BR 2$ 1$: CMPB LINOUT2,#12. ;;;12TH ROW? BCS 3$ ;START OVER 2$: CALL RPTSYM ;;;DATA UPDATE MOVB #-1,LINOUT2 MOV #TABLE,TBLNDX ;;;TOP OF IT 3$: INCB LINOUT2 CMPB LINOUT2,#12. ;;;LAST LINE? BCS 5$ TSTB ONCE ;;;CLR'D ONCE? BMI 4$ COMB ONCE MOVB #6,LCHRCT ;;;6 ON LAST BUNCH MOV #LBUNCH,NXTBYT ;;;CLR SCREEN BR 11$ 4$: MOVB #2,LCHRCT ;;;NO REG ARE MOV #GOHOME,NXTBYT ;;;DISPLAYED BR 11$ ;54 CHARS/LINE INCLUDING ESC SEQUENCES 5$: MOVB #54.,LCHRCT ;;;CHR @ LINE MOV #LINBUF,NXTBYT MOVB LINOUT2,R1 ;;;INDEX MOVB LINE(R1),ROW ;;;NEW ROW 6$: MOV #3,R4 ;;;3 "DATA" SEQS MOV #LINBUF+4,R3 ;;;TO HERE 7$: MOV @TBLNDX,R1 ;;;ADR OF SYMBOL ADD #12.,R1 ;;;POINT TO DATA MOV #6,R2 ;;;XFER 14 BYTES 8$: MOVB (R1)+,(R3)+ ;;;TO BUFFER SOB R2,8$ MOV #2,R5 ;;;NXT-TWICE 9$: MOV #3,R2 ;;;THREE CHR MOVB #40,(R3)+ ;;;SPC 10$: MOVB (R1)+,(R3)+ ;;;DATA CHRS SOB R2,10$ ;;;6 SOB R5,9$ ;;;+SPCS ADD #2,TBLNDX ;;;NXT SYMBOL ADD #4,R3 SOB R4,7$ 11$: MOVB #100,@#TPS ;;;INT ENABLE COMB INTFLG ;;;INHIBIT REENTRY RSTORE XITINT: .WORD 137 ;;;JUMP TO SAV100: 0 ;;;USER?..PGM ;INTERRUPT PROCESSING OF "DATA" ONLY TO ;DYNAMIC DISPLAY, MINIMIZES EXEC TIME ;DON'T BOTHER WITH STATUS, IT CAUSED THE INT INPROC: DECB LCHRCT ;;;IS LAST BPL 1$ ;;;CHARACTER CLRB INTFLG ;;;DONE? THEN CLRB @#TPS ;;;DISABLE INT BR 2$ 1$: MOVB @NXTBYT,@#TPB ;;;CHR TBL INC NXTBYT ;;;CHR ADR 2$: RTI .END O.ODT