diff --git a/build/misc.tcl b/build/misc.tcl index 9927fd84..7d2ab2fc 100644 --- a/build/misc.tcl +++ b/build/misc.tcl @@ -906,3 +906,7 @@ expect ":KILL" # PDP-11 linker. respond "*" ":midas sys1;ts 11stnk_kldcp;11stnk\r" expect ":KILL" + +# KL10 front end debugger. +respond "*" ":palx dsk0:.;_syseng; klrug\r" +expect ":KILL" diff --git a/doc/programs.md b/doc/programs.md index 5e6a09cc..cc5e2f93 100644 --- a/doc/programs.md +++ b/doc/programs.md @@ -99,6 +99,7 @@ - JOBS, list jobs by category. - JOTTO, word-guessing game. - KLFEDR, KL10 frontend directory tool. +- KLRUG, KL10 frontend debugger. - LAY, SUDS layout program. - LD10, Lisp display slave. - LIMERI, print limerics. diff --git a/src/syseng/klrug.17 b/src/syseng/klrug.17 new file mode 100755 index 00000000..5f81df4c --- /dev/null +++ b/src/syseng/klrug.17 @@ -0,0 +1,1948 @@ +RUGLEN==10600 ;ESTIMATED LENGTH OF RUG +.=100000-RUGLEN ;PUT IN HIGH CORE ON A 16K MACHINE + ;NOTE: SOME PLACES IN RUG LOSE IF CORE > 16K. MUMBLE GROAN. +; +;RUG SYMBOLIC DEBUGGER +; +R0= %0 ; REGISTER +R1= %1 ; NAMING +R2= %2 ; CONVENTIONS +R3= %3 +R4= %4 +R5= %5 +R6= %6 +R7= %7 +SP= %6 +PC= %7 +ST= 177776 ;STATUS REGISTER +; +; +O.BPT= 10 ;NUMBER OF BREAKPOINTS +O.BKP= O.BPT+O.BPT-2 ;NUMBER OF BREAKPOINTS-1 MULT. BY 2 +O.TVEC= 14 ;TRT VECTOR LOCATION +O.STM= 340 ;PRIORITY MASK - STATUS REGISTER +O.TBT= 20 ;T-BIT MASK - STATUS REGISTER +TRT= 000003 ;TRT INSTRUCTION +; +; +O.RDB= 177562 ;R DATA BUFFER +O.RCSR= 177560 ;R C/SR +O.TDB= 177566 ;T DATA BUFFER +O.TCSR= 177564 ;T C/SR + +;THE FOLLOWING IS NEEDED BECAUSE KLDCP "ASCIIZED" FORMAT +;ONLY LOADS WORDS, NOT BYTES. + +.MACRO .EVEN +.IIF NE .&1, .BYTE 0 +.ENDM + +; +; +; 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 +O.ENTR: MOV ST,O.UST ;RE-ENTER -- SAVE STATUS + MOV O.TVEC+2,ST ;SET UP LOCAL STATUS + MOV PC,O.UPC ;FAKE THE PC + MOVB #-1,O.P ;DISALLOW PROCEED + JMP O.BK1 +; +O.STRT: MOV #O.UR0,SP ;SET UP STACK + MOV SP,O.USP ;FAKE THE SAVED STACK + MOV #ADHIAD,4 ;FIND HIGHEST CORE LOC + MOV O.STM,6 + MOV R7,R0 ;HERE IS AS GOOD A START AS ANY + TST (R0)+ ;WILL TRAP ON ILLEGAL ADDRESS + BR .-2 +ADHIAD: SUB #4,R0 ;TO HERE. R0-2 IS OFFENDING ADDR + MOV R0,HIGHAD ;R0-4 IS LAST LEGAL (EVEN) ADDRESS + ADD #4,R6 ;RESET STACK FROM INTRPT + CLR 4 ;ZAP TRAP SO WE DON'T SUDDENLY APPEAR HERE + BR O.RST1 +O.RST: JSR 0,O.SVR ;SAVE REGISTERS + JSR 5,O.REM ;REMOVE ALL BREAKPOINTS + MOVB O.PRI,R4 ;GET ODT PRIORITY + RORB R4 ;SHIFT + RORB R4 ; INTO + RORB R4 ; POSITION + MOVB R4,ST ;STORE IN STATUS +O.RST1: MOVB #-1,O.P ;DISALLOW PROCEED + MOV #O.STM,O.TVEC+2 ;STATUS WORD TO TRT VECTOR+2 + MOV #O.BRK,O.TVEC ;PC TO TRT VECTOR + CLR R3 + JMP DELTB ;CLEAR BREAKPOINT TABLES +O.ERRR: JMP O.ERR + +; +; PROCESS CARRIAGE RETURN +; +O.CRET: JSR PC,O.CLSE ;CLOSE LOCATION +O.DCDA: JMP O.DCD ;RETURN TO DECODER +; +; PROCESS , OPEN NEXT WORD +; +O.OLD: SUB LENTH,O.DOT ;PROCESSED A < RE-OPEN DOT + SUB O.BW,O.DOT + BR O.OLD1 +O.OP1: MOV O.CAD,O.DOT ;SET DOT TO CAD IF +O.OLD1: TST O.BW +O.ERR2: BEQ O.ERR ;ERROR IF NOTHING IS OPEN + JSR PC,O.CLSE ;CLOSE PRESENT CELL + ADD O.BW,O.DOT ;GENERATE NEW ADDRESS + TST INSTMD + BEQ O.OP2 + ADD LENTH,O.DOT +O.OP2: MOV O.DOT,O.CAD ;RESET CAD +O.OP2A: JSR 5,O.CRLF ; + MOV O.CAD,R0 ;NUMBER TO TYPE + JSR 5,SYMBAD ; TYPE OUT ADDRESS + JMP O.WRD1 ;GO PROCESS IT +; +;PROCESS : DEFINE LABEL +; NOTE THAT THIS COMMAND NOT INTERPRETED THROUGH +; THE REGULAR COMMAND SYMBOL AND JUMP TABLES, BUT BY +; A SPECIAL CHECK AT ININ2 +; +O.COLO: MOV O.CAD,O.CVAL + BR O.ECL3 +; +;PROCESS ! DEFINE A SYMBOL +; +O.EXCL: JSR 5,O.GETS +O.ECL3: TST R2 + BGE O.ERR + JSR 5,O.SYLL + BR O.ECL1 + BR O.ECL2 +O.ECL1: SUB #6,O.SYME ;USYMB TABLE 2WDS RAD50 PLUS ONE OF VALUE + MOV O.SYL,(R1) + MOV O.SYL+2,2(R1) + MOV O.FLGS,R4 + CMP #1,R3 ;SEE IF TIME FOR NEW FLAG WORD + BNE O.ECL2 ;NO. + CLR (R4) + CLR -(R4) ;YES, INITIALIZE IT +O.ECL2: MOV O.FLGS,R4 + MOV O.CVAL,4(R1) + TSTB .REGF ;CHECK REGISTER FLAG + BEQ O.ECL5 + BIS R3,(R4) + BR O.ECL4 +O.ECL5: BIC R3,(R4) +O.ECL4: BIC R3,-(R4) + BR O.SCAN + +; +; 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.DOT ;GENERATE NEW ADDRESS + BR O.OP2 ;GO DO THE REST + + +;PROCESS FOO^K, HALF KILLING DEFINED SYMBOL + +HKILL: MOV O.FLGS,R4 + BIS R3,-(R4) + BR O.DCD + +; +; COMMAND DECODER - ODT11X +; +; ALL REGISTERS MAY BE USED (R0-R5), +; NO REGISTERS (R0-R5) WILL BE CONSIDERED SAFE +; +O.UERR: MOV #'U,R0 + JSR 5,O.FTYP +O.ERR: MOV #'?,R0 ; ? TO BE TYPED + JSR 5,O.FTYP ; OUTPUT ? +O.DCD: CLR O.BW ;CLOSE ALL + JSR 5,O.CRLS ;TYPE * +O.DCD2: CLR R3 ;R3 IS A SAVE REGISTER FOR R2 + CLR R5 ;R5 IS A SAVE REGISTER FOR R4 +O.DCD1: CLR O.CVAL +O.DCD3: CLRB O.NUMF + CLR ININ + CLR SSFLAG + MOVB PCONMD,CONMD ;SET TEMP CONSMODE FLAG TO PERM +O.SCAN: JSR 5,GETS ;GET A SYLABLE + BR ININ1 +O.CLGL: MOVB O.NUMF,R2 + MOV O.CVAL,R4 + CLRB O.ALTF +LGL: MOV #O.NALC,R1 +O.LGL1: CMPB R0,O.LGCH(R1) ;DO THE CODES MATCH? + BEQ O.LGL2 ;JUMP IF YES + INC R1 ; SET INDEX FOR NEXT SEARCH + CMP R1,#O.CLGT ;IS THE SEARCH DONE? + BHIS O.ERR ; OOPS! + BR O.LGL1 ;RE-LOOP +O.LGL2: ASL R1 ;MULTIPLY BY TWO + JMP @O.LGDR(R1) ;GO TO PROPER ROUTINE +O.ALT: JSR 5,O.GET + MOV R2,R3 + MOV R4,R5 + INCB O.ALTF + CLR R1 + CLR R4 + CLR R2 + BR O.LGL1 + +ININ1: JSR 5,ININST + BR O.CLGL + O.DCDC: BR O.DCD ;SIGH + + +STICKY: JSR 5,O.GET + CLRB CONMD + CMP #'C,R0 + BEQ STNUMB + CMP #'S,R0 + BEQ STSYMB + CMP #'I,R0 + BEQ STINST + CMP #'A,R0 + BEQ ABSMD + CMP #'R,R0 + BEQ RELMD +ERROR: JMP O.ERR +STSYMB: MOVB #1,SYMMD +SHERE: CLRB INSTMD + JMP GOSYM +STNUMB: CLRB SYMMD + CLRB INSTMD + JMP GONUM +STINST: MOVB #1,INSTMD + CLRB SYMMD + JMP GOINST + +ABSMD: INCB PCONMD + BR O.DCD +RELMD: CLRB PCONMD + BR O.DCD +TABSMD: INCB CONMD + BR JWRD6 +TRELMD: CLRB CONMD +JWRD6: BR O.WRD6 + +O.EQUL: TSTB .REGF + BEQ O.EQU1 + MOV #'%,R0 + JSR 5,O.FTYPE +O.EQU1: MOV O.CVAL,R0 + JSR 5,O.CADV + CLRB O.NUMF + BR O.DCD3 + +O.RDEQ: MOV #'/,R0 + JSR R5,O.FTYP ;YOU ARE ABOUT TO SEE + MOVB #40,BLFLG ;THE CURRENT VALUE IN RADIX-50 + MOV O.CVAL,AINST ;HERE'S THE LITTLE DEVIL + JSR R5,TYPE50 +O.RDRT: MOV #'/,R0 + JSR R5,O.FTYP + BR GOSYM1 +O.ASEQ: MOV #'/,R0 ;IF THIS LOOKS SIMILAR TO + JSR R5,O.FTYP ;THE ABOVE, IT'S BECAUSE IT IS, + MOV O.CVAL,R0 ;ONLY IN ASCII + SWAB R0 + JSR R5,O.FTYP + SWAB R0 + JSR R5,O.FTYP + BR O.RDRT + +;SINGLE STEP MODE PROCESSOR +SSTEP: TST R3 + BGT SSTP1 + MOV #1,R5 ;ASSUME SINGLE STEP +SSTP1: TST R5 + BEQ ERROR ;ZERO STEPS? + CLR R3 + MOVB O.P,PP + MOV R5,COUNT + MOV #1,SSFLAG + JMP O.PROC + + +; +; SEMI-COLON PROCESSOR +; +O.SEMI: MOV R2,R3 ;A SEMI-COLON HAS BEEN RECEIVED + MOV R4,R5 ;NUMERIC FLAG TO R3, CONTENTS TO R5 + JMP O.DCD1 ;GO BACK FOR MORE +; +; +; +; PROCESS / AND \ - OPEN WORD OR BYTE +; +O.WRD: CMP #2,O.BW ;SEE IF WORD ALREADY OPEN + BNE O.WRD4 ; NO. + TST R2 ;USE LAST SYMBOL OUTPUTTED, IF NO USER VALUE + BEQ O.TCLS +O.WRD4: MOV #2,O.BW ;OPEN WORD + BR O.WB1 +O.BYT1: CLR R2 +O.BYT: MOV #1,O.BW ;OPEN BYTE +O.WB1: TST R2 ;GET VALUE IF R2 IS NON-ZERO + BEQ O.WRD1 ;SKIP OTHERWISE + TSTB .REGF ;USER REGISTERS ARE REALLY + BEQ O.WRD5 ;INDEX TO USER + ASL R4 ;REGISTER SAVE STACK + BMI ERROR + ADD #O.UR0,R4 ;CHECK FOR VALID REG NUM DONE IN GETS + CMP #O.URE,R4 ;REGISTERS MUST BE ONE OF THE REGISTERS + BLE O.ERR1 ;WHICH PUTS IT BETWEEN O.UR0 AND O.URE +O.WRD5: MOV R4,O.DOT ;PUT VALUE IN DOT + MOV R4,O.CAD ; ALSO IN CAD +O.WRD1: MOV #O.ERR,4 ;ILLEGAL ADDR WILL NOW TRAP TO ERR + CMP #1,O.BW ;CHECK BYTE MODE + BEQ O.WRD2 ;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 O.WRD3 +O.WRD2: MOVB @O.CAD,R0 ;GET CONTENTS OF BYTE + MOV R0,CNTNTS + MOV R0,O.CVAL + CLR LENTH + BR GONUM +O.WRD3: MOV R0,CNTNTS + MOV R0,NEXTAD + MOV R0,O.CVAL + CLR 4 ; REMOVE ILLEGAL ADDR TRAP TO AVOID CONFUSION +O.WRD6: TSTB INSTMD + BNE GOINST + TSTB SYMMD + BNE GOSYM +GONUM: MOV O.CVAL,R0 + JSR 5,O.CAV1 + BR GOSYM1 +GOSYM: MOV O.CVAL,R0 + CLRB CONMD + JSR 5,SYMBOL ; PRINT AS SYMBOL EVEN IF IN $$A MODE +GOSYM1: JMP O.DCD3 +GOINST: MOV O.CVAL,R0 + JSR 5,INST + BR GOSYM1 + BR GONUM ;DID NOT FIND ONE + + +; +O.BKAR: CMP #2,O.BW ; OPEN "SOURCE LOCATION" + BNE O.ERR1 ;OF (HOPEFULLY) CURRENTLY OPEN WORD + MOV LASTAD,NEXTAD ;FALL THROUGH TO O.TCLS + +; / HANDLER WHEN WORD OPEN - OPEN LAST THING TYPED +; +O.TCLS: JSR PC,O.CLSE ; CLOSE CURRENT CELL + MOV NEXTAD,R2 ; AND OPEN LAST VALUE TYPED + ASR R2 ; FIRST CHECKING FOR ODD ADDRESS + BCS O.ERR1 + ASL R2 + MOV R2,O.CAD ; NOW MAKE IT CURRENT ADDRESS + JMP O.OP2A + +NEXTAD: 0 +LASTAD: 0 + +INSTMD: .BYTE 1 +SYMMD: .BYTE 0 +CONMD: .BYTE 0 +PCONMD: .BYTE 0 +BLFLG: .BYTE 0 + .EVEN + +; +; B HANDLER - SET AND REMOVE BREAKPOINTS +; +O.BKPT: MOV #O.TRTC,R0 + TST R3 + BEQ O.ERR1 ;FOR NOW THAT COMMAND IS MEANINGLESS + ASR R5 ;GET ONE BIT TO CARRY + BCS O.ERR1 ;BADNESS IF ODD ADDRESS + ASL R5 ;RESTORE ONE BIT + ADD #O.ADR1,R4 +O.SET: CMP R0,@R4 ;IS THIS CELL FREE? + BEQ O.SET1 ;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 O.SET +O.SET1: CMP R4,#O.BKP+O.ADR1 + BHI O.ERR1 ;ERROR IF TOO LARGE + MOV R5,@R4 ;SET BREAKPOINT +O.DCDB: JMP O.DCDC ;RETURN + + +; D HANDLER DELETE BKPT AT 1500 BY 1500$D,$D REMOVES ALL +DELTB: MOV #O.TRTC,R0 + CLR R4 +DBLOOP: CMP R4,#O.BKP + BHI O.DCDB ;DONE + TST R3 ;IF R3 ZERO, DELETE ALL + BEQ NOTST + CMP R5,O.ADR1(R4) + BNE DB1 ;ONLY REMOVE BKPT AT THAT ADDRESS +NOTST: MOV R0,O.ADR1(R4) + MOV #TRT,O.UIN(R4) ;RESET CONTENTS OF TABLE + CLR O.CT(R4) ;CLEAR COUNT +DB1: TST (R4)+ + BR DBLOOP +O.ERR1: JMP O.ERR + +; +; 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 +O.WDS2: CMP R2,O.MSK+4 ; IS THE SEARCH ALL DONE? + BHI O.DCDB ; YES + MOV @R2,R0 ; GET OBJECT + TST R1 ;NO + BNE O.EFF1 ;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 +O.WDS3: BNE O.WDS4 ;RE-LOOP IF NO MATCH + MOV R4,-(SP) ;REGISTERS R2,R4, AND R5 ARE SAFE + JSR 5,O.CRLF + MOV R2,R0 ;GET READY TO TYPE + MOV R0,-(SP) + MOV R2,-(SP) + JSR 5,SYMBAD ; TYPE ADDRESS + MOV (SP)+,R2 + MOV (SP)+,R0 + MOV @R2,R0 ;GET CONTENTS + JSR 5,O.CADV ;TYPE CONTENTS + MOV (SP)+,R4 ; RESTORE R4 +O.WDS4: TSTB O.RCSR ;HAS THE PERSON TYPED SOMETHING, + BMI O.ERR1 ;INDICATING SEARCH SHOULD STOP? + TST (R2)+ ;INCREMENT TO NEXT CELL AND + BR O.WDS2 ; RETURN +O.EFF1: CMP R0,R5 ; IS (X)=K? + BEQ O.WDS3 ;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 O.WDS3 ;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 O.WDS3 + + + + +; +; PROCESS G - GO +; +O.GO: TST R3 ;WAS K; TYPED? + BEQ O.ERR1 ; TYPE ? IF NOT + MOVB #-1,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,ST ;SET HIGH PRIORITY + JSR 5,O.RSTT ;RESTORE TELETYPE +O.TBIT: TST SSFLAG ;SINGLE STEP MODE? + BEQ TBIT + DEC COUNT + BNE O.PR1 + JMP SSDN +TBIT: CLRB O.T ;CLEAR + BIC #O.TBT,O.UST ; BOTH T-BIT FLAGS + JSR 5,O.RSB ;RESTORE BREAKPOINTS +O.GO2: JSR 0,O.RSR ;RESTORE REGISTERS + MOV O.UST,-(SP) ; AND STATUS + MOV O.UPC,-(SP) ; AND PC + RTT ;11/40 HARDWARE MISFEATURE +; +; PROCESS P - PROCEED +; ONLY ALLOWED AFTER A BREAKPOINT +; +O.PROC: 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 + MOVB #-1,O.P ;CLEAR PROCEED FLAG + TST R3 ;WAS COUNT SPECIFIED? + BEQ O.PR1 ;NO + MOV R5,O.CT(R0) ;YES, PUT AWAY COUNT +O.PR1: MOVB #O.STM,ST ;FORCE HIGH PRIORITY + JSR 5,O.RSTT ;RESTORE TTY +O.C1: MOVB #O.STM,ST ;SET HIGH PRIORITY + MOVB #1,O.T + BIS #O.TBT,O.UST ;SET T-BIT + BR O.GO2 + +; +; BREAKPOINT HANDLER +; A TRT BREAKPOINT CAUSES O.BRK TO BE ENTERED, +; WHICH SAVES VARIOUS ODDS AND ENDS, FINDS OUT +; IF THE BREAKPOINT WAS LEGAL, AND GIVES CONTROL +; TO THE COMMAND DECODER. +; +O.BRK: MOV (SP)+,O.UPC ;PRIORITY IS 7 UPON ENTRY + MOV (SP)+,O.UST ;SAVE STATUS AND PC +O.BK1: JSR 0,O.SVR ;SAVE VARIOUS REGISTERS + TSTB O.T ;CHECK FOR T-BIT SET + BNE O.TBIT ;JUMP IF SET + JSR 5,O.REM ;REMOVE BREAKPOINTS + TSTB O.PRI ;CHECK IF PRIORITY + BPL O.BK2 ; IS AS SAME AS USER PGM + MOVB O.UST,R5 ;PICK UP USER UST IF SO + BR O.BK3 +O.BK2: 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 +O.BK3: MOVB R5,ST ;PUT THE STATUS AWAY WHERE IT BELONGS + MOV O.UPC,R5 ;GET PC, IT POINTS TO THE TRT + TST -(R5) + MOV R5,O.UPC + MOV #O.BKP,R4 ;GET A COUNTER +O.B1: CMP R5,O.ADR1(R4) ;COMPARE WITH LIST + BEQ O.B2 ;JUMP IF FOUND + DEC R4 + DEC R4 + BGE O.B1 ;RE-LOOP UNTIL FOUND + JSR 5,O.SVTT ;SAVE TELETYPE STATUS + JSR 5,O.CRLF + MOV #O.BD,R4 ;ERROR, NOTHING FOUND + MOV #O.BD+1,R3 + MOVB #8,O.P ;ALLOW PROCEED FROM "BE" +BB: JSR 5,O.TYPE ;OUTPUT "BE" FOR BAD ENTRY + BIC #O.TBT,O.UST ;CLEAR OUT ANY POSSIBLE FAKE T-BIT + BR O.B3 ; OR CONTINUE +O.B2: DEC O.CT(R4) + BGT O.C1 ;JUMP IF REPEAT + MOV #1,O.CT(R4) ;RESET COUNT TO 1 + MOVB R4,O.P ;ALLOW PROCEED + JSR 5,O.SVTT ;SAVE TELETYPE STATUS, R4 IS SAFE + MOV #'B,R0 + JSR 5,O.FTYP ;TYPE "B" + MOVB O.P,R0 + ADD #140,R0 ;CONVERT BREAKPOINT NUMBER TO ASCII + ASR R0 + JSR 5,O.FTYP + MOV #2,O.BW ; SET WORD MODE + MOVB O.P,R4 + MOV O.ADR1(R4),R5 ;GET ADDRESS OF BREAK +O.B3: MOV #';,R0 + JSR 5,O.FTYP ; TYPE ; + MOV R5,R0 ;ADDRESS OF BREAK + JSR 5,SYMBOL ;TYPE ADDRESS + JMP O.DCD ;GO TO DECODER +SSDN: MOV #BUFF,R4 + MOV R4,R3 + MOV #'S,(R3)+ + MOV #'S,(R3) + MOVB PP,O.P + CLR SSFLAG + MOV O.UPC,%5 + BR BB + +; +; 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 +; +; RESTORE BREAKPOINTS 0-7 +; +O.RSB: MOV #O.BKP,R4 ;RESTORE ALL BREAKPOINTS +O.RS1: MOV @O.ADR1(R4),O.UIN(R4) ;SAVE CONTENTS + MOV O.TRTC,@O.ADR1(R4) ;REPLACE WITH TRAP + DEC R4 + DEC R4 + BGE O.RS1 ;RE-LOOP UNTIL DONE + RTS R5 ; THEN QUIT +; +; SAVE TELETYPE STATUS +; +O.SVTT: 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 + RTS R5 + +; +; RESTORE TELETYPE STATUS +; +O.RSTT: TST SSFLAG + BEQ RSTT + CMP #1,COUNT + BNE RSTT1 +RSTT: JSR 5,O.CRLF +RSTT1: TSTB O.TCSR ;WAIT READY + BPL .-4 ; ON PRINTER + BIT #4000,O.RCSR ;CHECK BUSY FLAG + BEQ O.RSE1 ;SKIP READY LOOP IF NOT BUSY + TSTB O.RCSR ;WAIT READY + BPL .-4 ; ON READER +O.RSE1: MOVB O.CSR1,O.RCSR ;RESTORE + MOVB O.CSR2,O.TCSR ; THE STATUS REGISTERS + RTS R5 +; +; REMOVE BREAKPOINTS 0-7 +; IN THE OPPOSITE ORDER OF SETTING +; +O.REM: CLR R4 ;REMOVE ALL BREAKPOINTS +O.R1: MOV O.UIN(R4),@O.ADR1(R4) ;CLEAR BREAKPOINT + INC R4 + INC R4 + CMP R4,#O.BKP + BLE O.R1 ;RE-LOOP UNTIL DONE + RTS R5 ;THEN QUIT +; +; TYPE OUT CONTENTS OF WORD OR BYTE +; WITH ONE TRAILING AND 3 LEADING SPACES +; WORD IS IN R0 +; +O.CAV1: MOV R0,-(SP) + JSR 5,O.TYPS ;TYPE 3 SPACES + MOV (SP)+,R0 +O.CADV: MOV R2,-(SP) ;SAVE R2 + MOV #O.BUF+6,R4 ;BUFFER START ADDRESS + MOV #'0,-(SP) ;CONSTANT ASCII 0 + CMP #1,O.BW ;CHECK BYTE MODE + BNE O.SPC + BIC #177400,R0 ;GET RID OF JUNK +O.SPC: MOV R0,R2 ; GET + BIC #177770,R2 ; OCTAL CHARACTER + ADD @SP,R2 ;CONVERT TO ASCII + MOVB R2,-(R4) ;STORE IN BUFFER + ASR R0 ;SHIFT THIS MESS + ASR R0 ; RIGHT + ASR R0 ; THREE WHOLE PLACES + BIC #160000,R0 + BNE O.SPC + TST (SP)+ +O.V3: MOV #O.BUF+6,R3 ;LWA + JSR 5,O.TYPE ;TYPE WHOLE STRING OF CHARACTERS + MOV (SP)+,R2 ;RESTORE R2 + RTS R5 + ;SYMBOL TABLE-- ASCII, THEN VALUE +;TO CHANGE MASK AND JUMP HAVE 0 BYTE INSTD OF 1ST ASCII WRD +;FOLLOWED BY NEW MASK AND JUMP LOC +;IF FOLLOWED BY ZERO RIGHT BYTE, NEST SYMB IS 2 WDS LONG +;IN CHANGE BLOCK, RIGHT BYTE CAN BE OFFSET FOR JUMPING +;WHEN USER TYPES ASCII + +INST: CMP #2,O.BW + BGT INOGO + MOV #INSTS,R1 ;GET LOC OF START + CLR LENTH + CLR WDS2 +INLOOP: MOV R0,R2 ;TO SAVE VALUE + TSTB 1(R1) ;IS IT A FLAG + BNE NOCHNG + TSTB (R1) ;2 WD ASCII OR CHANGE FLAG? + BNE CHANGE + TST -(R1) ;ONE LESS LOC + MOV #1,WDS2 + BR NEXTIN +CHANGE: MOV 2(R1),R3 ;NEW MASK + MOV 4(R1),R4 ;NEW JUMP LOC + TST (R1)+ + BR NEXTIN +NOCHNG: BIC R3,R2 ;AND IT + CMP 2(R1),R2 ;CHECK VALUE + BEQ JMPLOC + TST WDS2 ;TWO WORD ASCII? + BEQ NEXTIN + TST (R1)+ ;EXTRA LOC LOONG + CLR WDS2 +NEXTIN: ADD #4,R1 + CMP R1,#INSTE ;DONE? + BLE INLOOP +INOGO: TST (R5)+ + RTS 5 +JMPLOC: JMP (R4) + ;RETURNS WITH VALUE IN R4 +;EXPECTS INPUT IN O.SYL AND O.SYL+2 + +ININST: MOV #INSTS,R1 + CLR .LENTH + CLR WDS2 +INLOP1: TSTB 1(R1) + BNE NOCH1 + TSTB (R1) ;2 WD ASCII OR CHANGE + BNE CHANG1 + MOV #1,WDS2 + TST -(%1) ;SUBTRACT 2 FROM R1 + BR NXTIN2 +CHANG1: MOV 4(R1),R3 + ADD (R1),R3 ;RIGHT HALF OF FLAG IS OFFSET + TST (%1)+ ;ADD 2 + BR NXTIN1 +NOCH1: CMP O.SYL,(R1) + BNE NXTIN1 + TST WDS2 + BEQ WDONE + MOV 2(R1),R4 + CMP O.SYL+2,4(R1) + BEQ FOUND + BR NXTIN1 +WDONE: MOV 2(R1),R4 + TST O.SYL+2 + BEQ FOUND + CMP O.SYL+2,#6200 + BNE NXTIN1 + ADD #100000,R4 + BR FOUND +NXTIN1: TST WDS2 + BEQ NXTIN2 + CLR WDS2 + TST (R1)+ +NXTIN2: ADD #4,R1 + CMP R1,#INSTE + BLE INLOP1 + BR ERRR +FOUND: JMP (R3) + ARITH: JSR 5,BPOSS +ARITH1: MOV SAVE,R0 + ROL R0 + ROL R0 + SWAB R0 ;GET SOURCE BITS IN RIGHT PLACE + BIC #177700,R0 + JSR 5,SSORDD +DEST1: MOV #BUFF,R4 + MOV R4,R3 + MOV #',,(R3)+ + MOV #' ,(R3) + JSR 5,O.TYPE +DEST: MOV SAVE,R0 + MOV NEXTAD,LASTAD + BIC #177700,R0 + JSR 5,SSORDD + JMP BACK + +ADDSUB: JSR 5,TYPIN + BR ARITH1 +INOP2: MOV R4,VAL + JSR 5,INSSDD + MOVB VAL,R4 + CLRB VAL +JSR1: SWAB R4 + ROR R4 + ROR R4 + ADD R4,VAL +ENDIN: JSR 5,INSSDD +BACK2: MOV #1,ININ + MOV VAL,O.CVAL + RTS 5 + +SINGOP: JSR 5,BPOSS + BR DEST +INOP1: MOV R4,VAL + BR ENDIN + +.RTS: JSR 5,TYPIN + BIC #177770,R0 + ADD #60,R0 + JSR 5,O.FTYP + JMP BACK +INRTS: MOV R4,VAL +RTS2: JSR 5,GETS + BR ERRR + TST R2 + BEQ ERRR + CMP #7,R4 + BLT ERRR +RTS1: ADD R4,VAL +BACK3: BR BACK2 + +ERRR: MOV #O.ERR,R5 + RTS 5 +.JSR: JSR 5,TYPIN + ROL R0 + ROL R0 + SWAB R0 + BIC #177770,R0 + ADD #60,R0 + JSR 5,O.FTYP + JMP DEST1 +INJSR: MOV R4,VAL +JSR2: JSR 5,GETS + BR ERRR + TST R2 + BEQ ERRR + CMP #7,R4 + BLT ERRR + BR JSR1 + +TYPIN: CLR AINST+2 + TST WDS2 + BEQ ONEWD + CLR WDS2 + MOV 4(R1),AINST+2 +ONEWD: MOV (R1),AINST + MOV R0,SAVE + JSR 5,TYPE50 + JSR 5,O.TYPS + MOV SAVE,R0 + RTS 5 + +.BRCHS: JSR 5,TYPIN + MOVB SAVE,R0 + INC R0 + ASL R0 + ADD O.CAD,R0 + JSR 5,SYMBOL + JMP BACK + +INBRCH: MOV R4,-(SP) + JSR 5,GETS + BR ERRR +INNUM: SUB O.CAD,R4 + ASR R4 + DEC R4 + TST R4 + BLT .NEG + CMP R4,#177 + BGT ERRR +.NEG: CMP #-177,R4 + BGT ERRR ;ABSOLUTE VALUE OF DISPL < 400 + BIC #177400,R4 + MOV (SP)+,R3 + ADD R3,R4 + MOV R4,VAL + BR BACK3 + +.CNTRL: JSR 5,TYPIN + RTS 5 + +.TRAP: BR .CNTRL +INCNTR: MOV R4,VAL +BCK3: BR BACK3 +BACK: JSR 5,O.TYPS + RTS 5 +SAVE: 0 + +BPOSS: CLR AINST+2 ;ONLY 3 CHARS LONG + TST R0 ;BYTE COMMAND? + BGE NOB + MOV #6200,AINST+2 ;.RAD50 /B / +NOB: MOV (R1),AINST + MOV R0,SAVE + TST WDS2 + BEQ BPOS1 + MOV 4(R1),AINST+2 +BPOS1: JSR 5,TYPE50 + JSR 5,O.TYPS + RTS 5 + CNDCOD: CLR AINST+2 + MOV (R1),AINST + MOV R0,R2 + ROR R2 + BCC NOCCC + ADD #3,AINST ;.RAD50 / C/ +NOCCC: ROR R2 + BCC NOCCV + ADD #104600,AINST+2 ;.RAD50 /V / +NOCCV: ROR R2 + BCC NOCCZ + ADD #2020,AINST+2 ;.RAD50 / Z / +NOCCZ: ROR R2 + BCC NOCCN + ADD #16,AINST+2 ;.RAD50 / N/ +NOCCN: BR BPOS1 +AINST: 0 + 0 +ININ: 0 ;FLAG THAT INST TYPED + +INCCDD: MOV R4,VAL +INCD: JSR 5,O.GET + MOV #1,R2 + MOV #TBL,R3 +CDLOOP: TSTB (R3) ;SIGNALS END OF TABLE + BEQ BCK3 ;DONE, GOT BREAK CHAR + CMPB R0,(R3)+ + BNE CDLP1 + BIS R2,VAL + ASL R2 + BR INCD +CDLP1: ASL R2 + BR CDLOOP + +TBL: .BYTE 'C + .BYTE 'V + .BYTE 'Z + .BYTE 'N +WDS2: 0 ;LEFT BYTE NEVER ZERO + ;THIS ROUTINE CONVERTS RAD50 TO ASCII +;NUMB GIVEN AND RETURNED IN AC0 + +FIFASC: TST R0 + BNE FIFNO + MOVB BLFLG,R0 + BR NUTHNG +FIFNO: CMP #33,R0 + BLT NUMB + BEQ DOLR +LETR: ADD #56,R0 ;57+11+11=101 +NUMB: ADD #11,R0 ;PERIOD AND NUMBERS ARE +22 +DOLR: ADD #11,R0 +NUTHNG: RTS 5 + + +;THIS ROUTINE TAKES THREE CHARS IN AC1 +;RETURNS 3 ASCII, FIRST 2 IN AC1 AND LAST IN AC0 + +UNPACK: MOV #3100,R3 + JSR 5,SUBLOP + JSR 5,FIFASC + MOV R0,R2 + MOV #50,R3 + JSR 5,SUBLOP + JSR 5,FIFASC + SWAB R0 + ADD R0,R2 + MOV R1,R0 + JSR 5,FIFASC + MOV R2,R1 + RTS 5 + +SUBLOP: MOV #-1,R0 +SUBLP1: INC R0 + SUB R3,R1 + BCC SUBLP1 + ADD R3,R1 + RTS 5 + +; +; GENERAL CHARACTER INPUT ROUTINE -- ODT11X +; CHARACTER INPUT GOES TO R0 +; +O.GET: TSTB O.RCSR ;WAIT FOR + BPL .-4 ; INPUT FROM KBD + MOVB O.RDB,R0 ;GET CHARACTER - STRIP OFF PARITY + BIC #177600,R0 + BEQ O.GET ;IGNORE NULLS + CMPB #175,R0 + BNE O.GET1 + MOV #33,R0 +O.GET1: CMPB #15,R0 + BEQ O.GET2 + CMPB #12,R0 + BEQ O.GET2 + JSR 5,O.FTYP ;ECHO CHARACTER +O.GET2: RTS R5 +; +; GENERAL CHARACTER OUTPUT ROUTINE - ODT11X +; ADDRESS OF FIRST BYTE IN R4, +; ADDRESS OF LAST BYTE IN R3, (R3)>(R4) +; +O.TYPE: CMP R3,R4 ;CHECK FOR COMPLETION + BLO O.TYP1 ; EXIT WHEN DONE + MOVB (R4)+,R0 ;GET A CHARACTER + TST R0 + BEQ O.TYPE ;DON'T BOTHER IF NULL CHAR + JSR 5,O.FTYP ;TYPE ONE CHARACTER + BR O.TYPE ;LOOP UNTIL DONE +;TYPE 3 SPACES +O.TYPS: MOV #40,R0 + JSR 5,O.FTYP + JSR 5,O.FTYP +;FALL INTO O.FTYP FOR THE THIRD SPACE +; +; TYPE ONLY ONE CHARACTER (CONTAINED IN R0) +; +O.FTYP: TSTB O.TCSR + BPL .-4 + CMPB #15,R0 + BNE O.TYP3 + BR O.TYP2 +O.TYP3: CMPB #' ,R0 + BEQ O.TYPS + CMPB #33,R0 + BNE O.TYP5 + MOV #'$,O.TDB + RTS R5 +O.TYP5: CMPB #12,R0 + BEQ O.TYP2 + CMPB #40,R0 + BLE O.TYP2 + MOV #'^,O.TDB + BIS #100,R0 + JSR 5,O.FTYP + BIC #100,R0 + RTS R5 +O.TYP2: MOV R0,O.TDB +O.TYP1: RTS R5 + TYPE50: MOV AINST,R1 + JSR 5,UNPACK + MOV R1,BUFF + MOVB R0,BUFF+2 + MOV AINST+2,R1 + CLRB BLFLG + JSR 5,UNPACK + MOVB R1,BUFF+3 + SWAB R1 + MOVB R1,BUFF+4 + MOVB R0,BUFF+5 + MOV #BUFF,R4 + MOV #BUFF+5,R3 + JSR 5,O.TYPE + RTS 5 + ;THIS ROUTINE TAKES 6 BITS IN AC0 AND FILLS BUFF +;WITH WHAT TO TYPE AND TYPES IT + +SSORDD: MOV R0,R2 + MOV #BUFF,R4 + MOV R4,R3 + BIC #177770,R0 + SUB R0,R2 + CMP R0,#7 + BEQ PCREG +REGST: ADD #60,R0 ;NOW IT HAS THE ASCII OF WHICH REG + MOV R0,ATFLG + TST R2 + BEQ MREG + CMP R2,#20 + BEQ MAUIN + BLT MREGDF + CMP R2,#40 + BEQ MAUDC + BLT MAUIND + CMP R2,#60 + BEQ MINDX + BLT MAUDCD +MINDEF: MOVB #'@,R0 + JSR 5,O.FTYP +MINDX: ADD #2,LENTH + MOV O.CAD,R1 + ADD LENTH,R1 + MOV (R1),R0 + JSR 5,O.CADV + MOV #BUFF,R3 + MOV R3,R4 +MREGDF: MOVB #'(,(R3)+ + MOVB #'%,(R3)+ + MOVB ATFLG,(R3)+ + MOVB #'),(R3) + BR TYPESS +MAUIN: MOVB #'(,(R3)+ + MOVB #'%,(R3)+ + MOVB ATFLG,(R3)+ + MOVB #'),(R3)+ + MOVB #'+,(R3)+ + BR TYPESS +MREG: MOVB #'%,(R3)+ + MOVB ATFLG,(R3) + BR TYPESS +MAUDC: MOVB #'-,(R3)+ + BR MREGDF +MAUIND: MOVB #'@,(R3)+ + BR MAUIN +MAUDCD: MOVB #'@,(R3)+ + BR MAUDC + +TYPESS: JSR 5,O.TYPE + RTS 5 +BUFF: 0 + 0 + 0 + 0 + 0 + PCREG: CMP R2,#20 + BLT REGST + CMP R2,#30 + BLT MIMMD + BEQ MABSL + CMP R2,#60 + BLT REGST + BEQ MREL +MRELDF: MOVB #'@,R0 + JSR 5,O.FTYP +MREL: ADD #2,LENTH + MOV O.CAD,R1 + ADD LENTH,R1 + MOV (R1),R0 + ADD R1,R0 + ADD #2,R0 + JSR 5,SYMBOL + RTS 5 +MABSL: MOVB #'@,(R3)+ +MIMMD: MOVB #'#,(R3)+ + CLRB (R3) ;SO RANDOM CRUFT NOT TYPED + JSR 5,O.TYPE + ADD #2,LENTH + MOV O.CAD,R1 + ADD LENTH,R1 + MOV (R1),R0 + JSR 5,SYMBOL + RTS 5 + ;NEED SPACE TO TERMINATE COMMAND +;ATFLG LEFT BYTE 0 IF @ RECEIVED +;RIGHT BYTE 0 IF NO + OR - RECEIVED + +ATFLG: 0 +INSSDD: JSR 5,GETS + BR ERR + MOV #400,ATFLG ;DEZERO LEFT BYTE + CMP #'@,R0 + BNE NOAT + CLR ATFLG + ADD #10,VAL + JSR 5,GETS + BR ERR +NOAT: TST R2 + BGT NUMER + CMP #'#,R0 + BEQ .NUM + CMP #'(,R0 + BNE ERR + TSTB .NEGFL + BEQ NOMNUS + ADD #30,VAL + INC ATFLG +NOMNUS: ADD #10,VAL +NMNUS1: JSR 5,GETS + BR ERR + TST R2 + BEQ ERR + CMP #7,R4 + BLT ERR + ADD R4,VAL + CMP #'),R0 + BNE ERR + JSR 5,O.GETS + CMP #'+,R0 + BNE NOPLUS + INC ATFLG + ADD #10,VAL + JSR 5,O.GETS +NOPLUS: TST ATFLG + BNE OK + ADD #50,VAL + ADD #2,.LENTH + MOV #VAL,%3 + ADD .LENTH,R3 + CLR (R3) +OK: BR RETRN +ERR: MOV #O.ERR,R5 + RTS 5 + +NUMER: TSTB .REGF + BEQ .NOREG + ADD R4,VAL + BR RETRN +.NOREG: ADD #2,.LENTH + ADD #60,VAL + MOV #VAL,R3 + ADD .LENTH,R3 + CMP #'(,R0 + BNE JNUM + MOV R4,(R3) + INC ATFLG ;WON'T ADD MORE TO VAL LATER + BR NMNUS1 +JNUM: MOV O.CAD,R1 + ADD .LENTH,R1 + SUB R1,R4 + SUB #2,R4 ;MAY BE ODD LOC SO NO TST + MOV R4,(R3) + ADD #7,VAL + BR RETRN +.NUM: JSR 5,GETS + BR ERR + TST R2 + BGT .NUM1 + CMP #'@,R0 + BNE ERR + ADD #10,VAL + BR .NUM +.NUM1: ADD #27,VAL + MOV #VAL,R3 + ADD #2,.LENTH + ADD .LENTH,R3 + MOV R4,(R3) + RTS 5 + +VAL: 0 + 0 + 0 +.LENTH: 0 +RETRN: RTS 5 + SYMBAD: CMP #O.UR0,R0 ;PRINT ADDRESS/ ROUTINE + BGT SYMBD1 ; IF ADDRESS IN USER REG STACK + CMP #O.URE,R0 ;THEN PRINT APPROPRIATE REG NAME + BLE SYMBD1 + SUB #O.UR0,R0 ;TRANSFORM TO REGISTER NUMBER + ASR R0 + INCB .REGF ;AND FLAG. FLAG CLEARED NEXT INPUT REQEST +SYMBD1: JSR R5,SYMBOL + MOV #'\,R0 ;BYTE MODE? + CMP #2,O.BW + BGT SYMBD2 ;BRANCH IF BYTE MODE + MOV #'/,R0 ;WORD MODE +SYMBD2: JSR R5,O.FTYP + RTS R5 + +;# IS IN R0 +SYMBOL: MOV R0,NEXTAD + TSTB CONMD + BEQ SYMBL2 + JMP O.CADV +SYMBL2: CLR AINST + CLR AINST+2 + CLR R2 + MOV O.SYMS,R1 + CLR R3 +SYMLOP: ASL R3 + BNE SYMBL1 + TST -(R1) + MOV R1,R4 ;R4 CONTAINS ADDRSS + TST -(R1) + INC R3 +SYMBL1: SUB #6,R1 + MOV NEXTAD,R0 ;VALUE TRYING TO PRINT TO R0 + CMP R1,O.SYME + BLT SYMLPE + SUB 4(R1),R0 ;R0 := VALUE - SYMBOL + BCS SYMLOP ;BRANCH IF SYMBOL HIGHER THAN VALUE + CMP R0,#1000 + BGE SYMLOP ;BRANCH IF VALUE GROSSLY HIGHER THAN SYMBOL + CMP R2,4(R1) ;FINDING LARGEST SYMBOL NOT > # + BHI SYMLOP + BIT R3,-2(R4) + BNE SYMLOP ;HALF KILLED + TSTB .REGF ;SYMBOL'S REG FLAG MUST BE SAME AS VALUE'S + BNE SYMBL3 + BIT R3,(R4) + BNE SYMLOP + BR SYMBL4 +SYMBL3: BIT R3,(R4) + BEQ SYMLOP +SYMBL4: MOV 4(R1),R2 ;REPLACE OLD LARGEST + MOV (R1),AINST + MOV 2(R1),AINST+2 + BR SYMLOP + +SYMLPE: SUB R2,R0 ;WANT TO TYPE FOO + NUMB + MOV R0,-(SP) ;SAVE R0 + TST R2 ;IF ZERO NO NO SYMBOL FOUND + BEQ SYMPE1 + JSR 5,TYPE50 + TST (SP) + BNE SYP + TST (SP)+ + RTS 5 +SYP: MOV #'+,R0 + JSR 5,O.FTYP +SYMPE1: MOV (SP)+,R0 + JSR 5,O.CADV + RTS 5 + +; +; CLOSE WORD OR BYTE AND EXIT, +; UPON ENTERING, R2 HAS NUMERIC FLAG, R4 HAS CONTENTS +; +O.CLSE: TST ININ + BNE INCLOS + TST R2 ;IF NO NUMBER WAS TYPED THERE IS + BEQ O.CLS1 ;NO CHANGE TO THE OPEN CELL + CMP #1,O.BW + BEQ O.CLS2 ;JUMP IF BYTE MODE + BHI O.CLS1 ;JUMP IF ALREADY CLOSED + MOV R4,@O.CAD ;STORE WORD + BR O.CLS1 +O.CLS2: MOVB R4,@O.CAD ;STORE BYTE +O.CLS1: 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 5,O.TYPE ;TYPE SOMETHING + RTS R5 +INCLOS: MOV O.CAD,R2 + MOV VAL,(R2) + MOV .LENTH,LENTH ;STORE NEW LENGTH AS THE LENGTH + BEQ O.CLS1 + MOV VAL+2,2(R2) + SUB #2,.LENTH + BEQ O.CLS1 + MOV VAL+4,4(R2) + BR O.CLS1 + ;SYLLABE=# OR SYMBOL + +;THIS ROUTINE GETS AN ASCII CHARATCER IN R0 +;AND ITS RAD50 EQUIVILANT IN R1 +;IF THE CHAR IS NOT RAD50, THE ROUTINE DOES NOT SKIP RETURN +O.GET5: JSR 5,O.GET + CMP #'0,R0 ;COMPARE WITH ASCII 0 + BHI O.GT51 ;CHECK LEGALITY IF NON-NUMERIC + CMP #'9,R0 ;COMPARE WITH ASCII 9 + BLT O.GT51 ;CHECK LEGALITY IF NOT NUMBER + SUB #'0,R0 + ASL R4 ; MAKE ROOM + ASL R4 ; IN + ASL R4 ; R4 + ADD R0,R4 ;PACK THREE BITS IN R4 + MOV R4,-(SP) ;GET VALUE AS DECIMAL NUMBER JUST IN CASE + ASL SAVDEC ;SAVDEC=SAVDEC*2+SAVDEC*8+DIGIT + MOV SAVDEC,R4 + ASL R4 + ASL R4 + ADD R0,R4 + ADD R4,SAVDEC + MOV (SP)+,R4 + INC R2 ;R2 HAS NUMERIC FLAG + CMP #7,R0 ;OCTAL (0-7) OR DECIMAL (8-9)? + BGE O.GT55 ;OCTAL + ADD #400,R2 ;DECIMAL. SET DECIMAL FLAG IN HIGH BYTE OF R2 +O.GT55: ADD #'0,R0 +O.GT51: MOV R0,R1 + CMP #44,R1 + BEQ O.GT5$ + TSTB STRFLG + BEQ O.GT52 + CMP #40,R1 + BEQ O.GT5B +O.GT52: CMP #56,R1 ;CONVERT TO RADIX 50 + BEQ O.GT5. + SUB #'0,R1 + BLT O.GT5T + CMP R0,#'9 + BGT O.GT53 + ADD #36,R1 + BR O.GT54 +O.GT53: SUB #20,R1 + BLE O.GT5T + CMP R0,#'Z + BGT O.GT5T +O.GT5D: MOV #170000,R2 ;GROSSLY NEGATIVE IF R2NEG,SYMB IF POS VALUE +O.GT54: TST (R5)+ ;ADD TWO TO R5 + RTS R5 +O.GT5$: MOV #33,R1 + BR O.GT5D +O.GT5B: CLR R1 + BR O.GT54 +O.GT5.: MOV #34,R1 + TST R2 ;IF NUMERIC FLAG SET, MAKE IT DECIMAL + BEQ O.GT5D ;OTHERWISE IT'S A SYMBOL + ADD #400,R2 ;SET DECIMAL FLAG + BR O.GT54 +O.GT5T: MOV R0,R1 + RTS R5 + +O.GET3: CLR O.CSYL ;GET 3 RADIX 50 CHARS + JSR 5,O.GET5 ;PCKNG ALG C1*50*50+C2*50+C3 + BR O.GT3T +O.GT31: ADD #3100,O.CSYL + DEC R1 + BGT O.GT31 + JSR 5,O.GET5 + BR O.GT3T +O.GT32: ADD #50,O.CSYL + DEC R1 + BGT O.GT32 + JSR 5,O.GET5 + BR O.GT3T + ADD R1,O.CSYL + TST (R5)+ +O.GT3T: RTS R5 + +O.GETS: CLR R4 + CLR SAVDEC + CLR R2 + JSR 5,O.GET3 + BR O.GTS2 + TSTB STRFLG + BNE O.GTS5 + MOV O.CSYL,O.SYL + JSR 5,O.GET3 + BR O.GTS3 + MOV O.CSYL,O.SYL+2 +O.GTS1: JSR 5,O.GET3 + BR O.GTS4 ;TYPES TERM + BR O.GTS1 ;DOESN'T +O.GTS2: TST R2 + BNE O.GTS5 + CMP #'",R0 + BNE O.GTS6 + JSR R5,O.GET + MOV R0,R4 + SWAB R4 + BR O.GTS7 +O.GTS6: CMP #'',R0 + BNE O.GTS5 +O.GTS7: JSR R5,O.GET + ADD R0,R4 + INC R2 ;TREAT QUOTED CHAR LIKE NUMERIC TERM + BR O.GTS1 ;LOOK FOR TERMINATING CHAR +O.GTS5: MOV O.CSYL,O.SYL + CLR O.SYL+2 + RTS R5 +O.GTS3: MOV O.CSYL,O.SYL+2 +O.GTS4: RTS R5 ;LOOK UP SYMBOL +O.SYLL: MOV O.SYMS,R1 + CLR R3 +O.SLL2: ASL R3 + BNE O.SLL3 + TST -(R1) + MOV R1,O.FLGS + TST -(R1) ;SKIP OVER HALF KILLED FLAGS BY -2 + INC R3 +O.SLL3: SUB #6,R1 + CMP R1,O.SYME + BLT O.SLL1 + CMP (R1),O.SYL + BNE O.SLL2 + CMP 2(R1),O.SYL+2 + BNE O.SLL2 + MOV #1,R2 + MOV 4(R1),R4 ;VALYE TO R4 + TST (R5)+ +O.SLL1: RTS R5 + +SAVDEC: 0 +O.FLGS: 0 + ;THIS RTINE, HOPEFULLY WILL GET AN ENTIRE SYMBOL +;WITH PLUSSES AND MINUSES, LIKE FOO+.-100 +GETS: CLR SCRTCH + CLR .NEGFL ;THIS CLEARS .REGF TOO +GTS1: JSR 5,O.GETS + TSTB STRFLG + BEQ GTS2 + CLRB STRFLG + MOV O.SYL,R4 + BR .JNUM ;THE ABOVE FEW LINES HANDLED * SYMBOLS +GTS2: TST R2 + BLT LABLE + BEQ TERM + SWAB R2 + TSTB R2 ;HIGH BYTE OF NUMERIC FLAG IS DEC NUM FLAG + BEQ .JNUM ;OCTAL + MOV SAVDEC,R4 ;DECIMAL. GET IT. + BR .JNUM +TERM: CMP %0,#'- + BNE NOTNEG + INCB .NEGFL + BR GTS1 +NOTNEG: CMP %0,#'+ + BNE NOTPOS + BR GTS1 +NOTPOS: CMP %0,#'% + BNE GTS3 + INCB .REGF ;SET REGISTER FLAG + BR GTS1 +GTS3: CMP %0,#40 + BEQ GTS1 + CMP %0,#' + BEQ GTS1 + CMP %0,#'* + BNE TERMT + INCB STRFLG + BR GTS1 +LABLE: CMP R0,#': ;HERE'S THE ONLY TIME GETS CAN HAVE + BNE .SYMBL ;AN UNDEFINED LABEL - THE : COMMAND + TSTB O.NUMF ;WHICH IS DETECTED HERE RATHER THAN IN THE + BNE GERR ;COMMAND TABLE OUT OF NECESSITY + JMP O.COLO +.SYMBL: JSR 5,O.SYLL + BR GERR + BIT R3,@O.FLGS ;TES FOR REGISTER SYMBOL + BEQ .JNUM + INCB .REGF +.JNUM: TSTB .NEGFL + BEQ POSTV + CLRB .NEGFL + NEG R4 +POSTV: ADD R4,SCRTCH + MOV SCRTCH,O.CVAL + INCB O.NUMF + BR TERM +TERMT: MOV SCRTCH,R4 + TST (R5)+ +GERR: RTS 5 +SCRTCH: 0 +.NEGFL: .BYTE 0 +.REGF: .BYTE 0 +STRFLG: .BYTE 0 + .EVEN + +; +O.LGDR: +;FOLLOWING COMMANDS PROCEEDED BY ALT + O.GO ; G GO TO ADDRESS K + O.WSCH ; W SEARCH WORD + O.EFF ; E SEARCH EFFECTIVE ADDRESS + O.BKPT ; B BREAKPOINTS + O.PROC ; P PROCEED + DELTB ;D DELETE BKPT + GONUM + GOSYM + GOINST + STICKY ;CHANGE MODE + SSTEP ;SINGLE STEP MODE + TABSMD + TRELMD +;FOLOWING COMMANDS DON'T NEED ALT + O.EQUL ; = PRINTS CURRENT VALUE + O.ALT ; ALT SIGNALS COMMAND + O.EXCL ; ! DEFINES SYM + O.SEMI ; ; DILIMITS ARGS + O.WRD ; / OPEN WORD + O.BYT ; \ OPEN BYTE + O.CRET ; CARRIAGE RETURN CLOSE + O.OP1 ; MODIFY, CLOSE, OPEN NEXT + O.OLD ; < RETURN TO OLD SEQUENCE AND OPEN + O.BACK ; ^ OPEN PREVIOUS + O.RDEQ ; ] PRINT CURRENT VAL AS RAD50 CHARS + O.ASEQ ; [ PRINT AS ASCII + HKILL ; ^K HALF KILL +O.LGL= .-O.LGDR ;LGL MUST EQUAL 2X CHLGT ALWAYS +; +O.LGCH: +;FOLLOWING COMMANDS PRECEEDED BY ALT + .BYTE 'G ; G + .BYTE 'W ; W + .BYTE 'E ; E + .BYTE 'B ; B + .BYTE 'P ; P + .BYTE 'D ; D + .BYTE 'C + .BYTE 'S + .BYTE 'I + .BYTE 33 ;ALT MODE + .BYTE 'N + .BYTE 'A + .BYTE 'R +O.NALC=.-O.LGCH + .BYTE '= ; = + .BYTE 33 ; ALT + .BYTE '! ; ! + .BYTE '; ; ; + .BYTE '/ ; / + .BYTE '\ ; \ + .BYTE 015 ; CARRIAGE RETURN + .BYTE 012 ; + .BYTE '< ; < + .BYTE '^ ; ^ + .BYTE '] ; ] + .BYTE '[ ; [ + .BYTE 13 ;^K +O.CLGT= .-O.LGCH ;TABLE LENGTH +.EVEN + +; +O.BW: 0 ; =0 - ALL CLOSED, + ; =1 - BYTE OPEN, + ; =2 - WORD OPEN +O.CSYL: 0 +O.SYL: 0 + 0 +O.VAL: 0 +O.CAD: 0 ; CURRENT ADDRESS +O.CVAL: 0 ;CURRENT VALUE +COUNT: 0 +SSFLAG: 0 +LENTH: 0 +CNTNTS: 0 +O.XXX: O.ODT ;TEMPORARY STORAGE, INITIALLY HAS START ADDRESS +O.SYMS: O.BSYM +O.SYME: O.ESYM-6 +O.ALTF:O.COLM: .BYTE 0 ;OUTPUT COLUMN POINTER + .BYTE 0 ;COMMAND PROCEEDED BY ALT +O.NUMF: .BYTE 0 ;NUMBER SEEN(USED INSTEAD OF R2) +O.WDFG: .BYTE 0 ;SEARCH FLAG = 1 - EFFECTIVE + ; = 0 - WORD +O.T: .BYTE 0 ; T-BIT FLAG +PP: .BYTE 0 ;TEMP PROCEED FLAG SAVE WHEN SINGLE STEPPING +O.P: .BYTE 0 ;PROCEED FLAG = -2 IF MANUAL ENTRY + ; -1 IF NO PROCEED ALLOWED + ; 0-7 IF PCEED ALLOWED +O.CSR1: .BYTE 0 ;SAVE CELL - R C/SR +O.CSR2: .BYTE 0 ;SAVE CELL - T C/SR +; + .EVEN +O.BD: .WORD "BE +; +O.CR: .BYTE 015 ; + .BYTE 012 ; + .BYTE '* ; * +; + .EVEN +; +O.BUF: ;6 CHAR. BUFFER WITH +.= .+6 + .BYTE ' ;TRAILING BLANK + .EVEN +; +O.TRTC: TRT ;TRACE TRAP PROTOTYPE + ;********************SYMBOL TABLE******************** + +;ARITHMETIC INSTRUCTIONS +INSTS: INOP2-ARITH ;SIGNALS CHANGE OF JUMP MASK BLOCK + 107777 ;NEW MASK + ARITH ;NEW JUMP LOC + .RAD50 /MOV/ + 010000 + .RAD50 /CMP/ + 020000 + .RAD50 /BIT/ + 030000 + .RAD50 /BIC/ + 040000 + .RAD50 /BIS/ + 050000 + +;ADD&SUB DO NOT HAVE BYTE OPTION SO ARE SEPERATE + INOP2-ADDSUB + 007777 + ADDSUB + .RAD50 /ADD/ + 060000 + .RAD50 /SUB/ + 160000 + +;SINGLE OPERAND INSTRUCTIONS + INOP1-SINGOP + 100077 + SINGOP + .RAD50 /CLR/ + 005000 + .RAD50 /COM/ + 005100 + .RAD50 /INC/ + 005200 + .RAD50 /DEC/ + 005300 + .RAD50 /NEG/ + 005400 + .RAD50 /ADC/ + 005500 + .RAD50 /SBC/ + 005600 + .RAD50 /TST/ + 005700 + .RAD50 /ROR/ + 006000 + .RAD50 /ROL/ + 006100 + .RAD50 /ASR/ + 006200 + .RAD50 /ASL/ + 006300 + +;JMP AND SWAB + INOP1-SINGOP + 000077 + SINGOP + .RAD50 /JMP/ + 000100 + 0 ;SIGNALS BLOCK OF INSTRUCTION WITH >3CHARS + .RAD50 /SWA/ + 000300 + .RAD50 /B / + +;CONDITION CODES + INCCDD-CNDCOD + 000017 + CNDCOD + .RAD50 /SE / + 000260 + .RAD50 /CL / + 000240 + +;JSR + INJSR-.JSR + 000777 + .JSR + .RAD50 /JSR/ + 004000 + +;RTS + INRTS-.RTS + 000007 + .RTS + .RAD50 /RTS/ + 000200 + +;CONTROL GROUP + INCNTR-.CNTRL + 0 + .CNTRL + 0 + .RAD50 /HAL/ + 0 + .RAD50 /T / + 0 + .RAD50 /WAI/ + 1 + .RAD50 /T / + .RAD50 /RTI/ + 2 + .RAD50 /BPT/ + 3 + .RAD50 /IOT/ + 4 + 0 + .RAD50 /RES/ + 5 + .RAD50 /ET / + +;TRAP AND EMT + INCNTR-.TRAP + 377 + .TRAP + .RAD50 /EMT/ + 104000 + 0 + .RAD50 /TRA/ + 104400 + .RAD50 /P / + +;BRANCHES + INBRCH-.BRCHS + 377 + .BRCHS + .RAD50 /BR / + 000400 + .RAD50 /BNE/ + 001000 + .RAD50 /BEQ/ + 001400 + .RAD50 /BGE/ + 002000 + .RAD50 /BLT/ + 002400 + .RAD50 /BGT/ + 003000 + .RAD50 /BLE/ + 003400 + .RAD50 /BPL/ + 100000 + .RAD50 /BMI/ + 100400 + .RAD50 /BHI/ + 101000 + 0 + .RAD50 /BLO/ + 101400 + .RAD50 /S / + .RAD50 /BVC/ + 102000 + .RAD50 /BVS/ + 102400 + .RAD50 /BCC/ + 103000 + .RAD50 /BCS/ +INSTE: 103400 + 0 ;BAG BITER GETS NXMS IF THESE AREN'T HERE + 0 + +.IIF NE .-100000,.ERROR RUGLEN IS WRONG + +; +;THE ORDER OF THE FOLLOWING ENTRIES IS CRITICAL +; +.= O.ODT-116 ;ODT'S STACK IMMEDIATELY PRECEDES ODT + +O.UR0: 0 ;USER R0 + 0 ; R1 + 0 ; R2 + 0 ; R3 + 0 ; R4 + 0 ; R5 +O.USP: 0 ;USER SP +O.UPC: 0 ;USER PC +O.UST: 0 ;USER ST +O.PRI: 7 ;ODT PRIORITY +O.MSK: 0 ;MASK + 0 ;LOW LIMIT + 0 ;HIGH LIMIT +; +; BREAK POINT LISTS, ADR1 = ADDRESS OF BREAKPOINT,CT = COUNT, +; UIN = CONTENTS +; +O.ADR1: .REPT O.BPT + O.TRTC + .ENDR +O.CT: .REPT O.BPT + 0 + .ENDR +O.UIN: .REPT O.BPT + TRT + .ENDR +HIGHAD: 0 ; LARGEST LEGAL (EVEN) CORE LOCATION +O.URE: + +.=O.ODT-200 +O.BSYM=.+2 +O.ESYM=.-2 +.=O.ESYM-6 + .RAD50 /. / + 0 +O.DOT: 0 + 1 ;HALF KILLED SYMBOL FLAG + 177776 +O.ESYM= O.ESYM-6 +.= O.ESYM-6 + .RAD50 /R0 / + 0 + 0 +O.ESYM= O.ESYM-6 +.= O.ESYM-6 + .RAD50 /R1 / + 0 + 1 +O.ESYM= O.ESYM-6 +.= O.ESYM-6 + .RAD50 /R2 / + 0 + 2 +O.ESYM= O.ESYM-6 +.= O.ESYM-6 + .RAD50 /R3 / + 0 + 3 +O.ESYM= O.ESYM-6 +.= O.ESYM-6 + .RAD50 /R4 / + 0 + 4 +O.ESYM= O.ESYM-6 +.= O.ESYM-6 + .RAD50 /R5 / + 0 + 5 +O.ESYM= O.ESYM-6 +.= O.ESYM-6 + .RAD50 /R6 / + 0 + 6 +O.ESYM= O.ESYM-6 +.= O.ESYM-6 + .RAD50 /R7 / + 0 + 7 +O.ESYM= O.ESYM-6 +.= O.ESYM-6 + .RAD50 /SP / + 0 + 6 +O.ESYM= O.ESYM-6 +.= O.ESYM-6 + .RAD50 /PC / + 0 + 7 +O.ESYM= O.ESYM-6 +.= O.ESYM-6 + .RAD50 /.P / + 0 + 11 +O.ESYM= O.ESYM-6 +.= O.ESYM-6 + .RAD50 /.M / + 0 + 12 +O.ESYM= O.ESYM-6 +.= O.ESYM-6 + .RAD50 /.S / + 0 + 10 +O.ESYM= O.ESYM-6 +.= O.ESYM-6 + .RAD50 /.B / + 0 + 15 + +O.ESYM= O.ESYM-6 +.= O.ESYM-6 + .RAD50 /.C / + 0 + 15+O.BPT +O.ESYM= O.ESYM-12 +.= O.ESYM-6 + .RAD50 /.H / + 0 + 15+O.BPT+O.BPT+O.BPT + + 0 + 1 ;NEW FLAG WORD + +O.ESYM= O.ESYM-6 +.= O.ESYM-6 + .RAD50 /TKS/ + 0 + O.RCSR +O.ESYM= O.ESYM-6 +.= O.ESYM-6 + .RAD50 /TKB/ + 0 + O.RDB +O.ESYM= O.ESYM-6 +.= O.ESYM-6 + .RAD50 /TPS/ + 0 + O.TCSR +O.ESYM= O.ESYM-6 +.= O.ESYM-6 + .RAD50 /TPB/ + 0 + O.TDB + +.=O.TVEC ;ASSEMBLE BREAK VECTOR + O.BRK + O.STM + + .END O.XXX ;-> MAGIC FROB FOR 11BOOT + \ No newline at end of file