1
0
mirror of https://github.com/PDP-10/its.git synced 2026-01-31 14:02:09 +00:00
Files
PDP-10.its/src/syseng/klrug.17
2018-06-13 21:01:39 +02:00

1948 lines
35 KiB
Plaintext
Executable File
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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 <LF>, 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 <LF>
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 ;<CR><LF>
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 <CR><LF>*
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 ?<CR,LF> 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 <CR,LF>
BR O.CRS
O.CRLS: MOV #O.CR+2,R3 ;LWA <CR,LF>*
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 ; <LF> 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 ; <LF>
.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 ; <CR>
.BYTE 012 ; <LF>
.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