mirror of
https://github.com/PDP-10/stacken.git
synced 2026-02-23 07:31:54 +00:00
1706 lines
45 KiB
Plaintext
1706 lines
45 KiB
Plaintext
;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED
|
|
; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.
|
|
;
|
|
;COPYRIGHT (c) DIGITAL EQUIPMENT CORPORATION 1984,1987.
|
|
;ALL RIGHTS RESERVED.
|
|
|
|
TITLE DDTSIM DDT11 SIMULATOR AND UBA CONTROL
|
|
|
|
SEARCH DDTSYM,JOBDAT,MACTEN,UUOSYM,MONSYM
|
|
|
|
SALL ;GET NICE LISTINGS FOR A CHANGE
|
|
.HWFRMT ;AND SKIP THE FANCY BITS
|
|
|
|
ENTSIM (ENTRY)
|
|
ENT11 (EXTERN)
|
|
ENTGP (EXTERN)
|
|
ENTFIL (EXTERN)
|
|
|
|
RLMSIZ==0 ; MUST BE DEFINED HERE
|
|
|
|
;HERE TO EXECUTE THE NEXT INSTRUCTION
|
|
; CALL WITH F.RUNF CLEAR TO SINGLE INSTRUCTION
|
|
; WITH F.RUNF SET TO RUN
|
|
; CALL SIMXCT
|
|
; RETURN ;WHEN MACHINE HALTED
|
|
; ; AC1 WILL CONTAIN THE STARTING PC
|
|
SIMXCT: TXZ FLG,F.SVIO
|
|
SETZM F.HALT
|
|
TXNN PS,20 ;IS T BIT SET ?
|
|
SETZM INTDLY
|
|
SETZM INTDLY+1
|
|
TXON FLG,F.TOPN ;HAS CTY BEEN OPENED ?
|
|
CALL SIMOPN ;DO OPEN FOR TTY
|
|
CALL SIMSAC ;SETUP THE AC'S
|
|
SETSTS 17,200 ;SET NO ECHO
|
|
TRNN PC,1 ;GET A BUM PC ?
|
|
JRST SIMCYC ;EXECUTE AN INSTRUCTION
|
|
JRST NXM... ;TAKE A BUS TRAP
|
|
|
|
SIMSAC: EXCH 0,SIMREG
|
|
EXCH 1,SIMREG+1
|
|
EXCH 2,SIMREG+2
|
|
EXCH 3,SIMREG+3
|
|
EXCH 4,SIMREG+4
|
|
EXCH 5,SIMREG+5
|
|
EXCH 6,SIMREG+6
|
|
EXCH 7,SIMREG+7
|
|
TXC FLG,F..SIM
|
|
POPJ P,
|
|
|
|
;HERE TO SETUP THE PC TO EXECUTE
|
|
SETUPC: SKIPN AC1,EXPRESS ;DID USER GIVE A PC ?
|
|
SKIPE AC1,SIMREG+PC ;OR DID WE ALREADY HAVE A PC ?
|
|
JRST SETPC2
|
|
SKIPE INSRUN ;HAVE WE RUN YET ?
|
|
JRST SETPC2 ;YES SO MUST BE WE MEANT 0 PC
|
|
SKIPN AC1,GOTO ;TAKE STARTING ADDRESS FOR PROGRAM
|
|
HRRZ AC1,DOT ;OH WELL USE CURRENT LOCATION
|
|
SETPC2: HRRZM AC1,SIMREG+PC
|
|
POPJ P,
|
|
|
|
;HERE TO OPEN THE TTY FOR THE SIMULATOR
|
|
SIMOPN: CALL SIMREL ;RELOCATE STUFF
|
|
SIMOP1: INIT 17,200 ;SUPRESS ECHO
|
|
SIXBIT \TTY\
|
|
Z
|
|
EXIT
|
|
CALL R.SET ;RESET THE WORLD
|
|
CALL PS.CHK ;BE SURE LEVELS SET UP RIGHT
|
|
POPJ P,
|
|
SIM.U1:
|
|
SIM11: TRNE PS,PS...T ;CHECK T BIT
|
|
JRST TB.INT
|
|
SIM11A: SOSG T1,INTDLY ;TIME TO CHECK FOR INTERRUPTS ?
|
|
JRST INTCHK ;CHECK TO SEE IF THERE IS AN INTERRUPT PENDING
|
|
|
|
SIMCYC: HRRZ MA,PC ;COPY PC
|
|
MEMREL MEMLIM
|
|
CAIL MA,0
|
|
JRST [ CALL IOLDP2 ;GET INFORMATION
|
|
MOVE IR,T1 ;PUT INSTRUCTION IN RIGHT REGISTER
|
|
JRST SIMCY1]
|
|
ROT MA,-2
|
|
SKIPGE MA
|
|
MEMREL MEMORY
|
|
SKIPA IR,(MA)
|
|
MEMREL MEMORY
|
|
MOVS IR,(MA)
|
|
SIMCY1: ADDI PC,2 ;ADVANCE PC
|
|
HRRZ T2,IR ;COPY INSTRUCTION
|
|
LSH T2,-6 ;POSITION FOR DISPATCH
|
|
JRST @OPDSP0(T2) ;DISPATCH ON OPCODE
|
|
|
|
;HERE IF OPCODE IN RANGE 000000 THRU 000077
|
|
OPDSPA: JRST @OPDSP1(IR)
|
|
|
|
;HERE IF OPCODE IN RANGE 000200 THRU 000277
|
|
OPDSPB: JRST @OPDSP2-200(IR)
|
|
|
|
;HERE FOR A TBIT TRAP
|
|
TB.INT: INTSAV 14
|
|
HRROS INTDLY ;COME BACK THROUGH AGAIN
|
|
JRST SIM11A
|
|
|
|
;HERE BECAUSE TIMER WENT OFF - CHECK FOR INTERRUPTS ETC.
|
|
|
|
INTCHK:
|
|
HRRE T1,INTDLY ;CURRENT COUNT
|
|
HRRE T2,INTDLY+1 ;ORIGINAL COUNT
|
|
SUB T2,T1
|
|
ADDB T2,INSRUN ;MAKE CURRENT NUMBER OF INSTRUCTIONS EXECUTED
|
|
MOVE T1,CTISPD ;PROBABLE MAXIMUM FOR INTDLY
|
|
MOVEM T1,INTDLY
|
|
MOVEM T1,INTDLY+1
|
|
|
|
;NOW SEE IF LAST INSTRUCTION HAD A STACK VIOLATION
|
|
INTCK0: TXZN FLG,F.SVIO ;HIT A STACK VIOLATION ?
|
|
JRST INTCK1 ;NO
|
|
INTSAV 4
|
|
TXZ FLG,F.SVIO
|
|
|
|
INTCK1: TXNN FLG,F.EXEC ;RUNNING IN EXEC MODE ?
|
|
JRST INTCK6 ;NO SO DON'T TOUCH HDW
|
|
SKIPE T1,BR7PND ;ANY INTERRUPTS PENDING ON BR7 ?
|
|
JRST [ SETZM BR7PND ;FORGET OLD INTERRUPT
|
|
JRST INTCK3 ] ;GO TAKE THE INTERRUPT
|
|
SKIPN T1,BR5PND ;ANY BR5 INTERRUPTS PENDING ?
|
|
JRST INTCK6 ;NO
|
|
SETZM BR5PND
|
|
INTCK3: INTSAV <(T1)> ;TAKE AN INTERRUPT
|
|
HRROS INTDLY ;CHECK FOR OTHER INTERRUPTS
|
|
JRST SIM11A ;IN CASE THAT LOWERED THE LEVEL
|
|
|
|
INTCK6: CALL TIMCHK ;CHECK FOR DEVICES THAT WANT TO INTERRUPT
|
|
NOP
|
|
|
|
TXNE FLG,F.RUNF ;STILL RUNNING ?
|
|
JRST SIMCYC ;YES GO DO NEXT INSTRUCTION
|
|
SETSTS 17,0 ;PUT ECHO BACK ON
|
|
JRST SIMSAC ;SAVE SIMULATED REGS AND RET
|
|
|
|
;HERE TO CHECK FOR DEVICES WHICH MAY EXPIRED TIMERS
|
|
|
|
TIMCHK: TXZ FLG,F.FLOP
|
|
|
|
;HERE TO SEE IF ANY DEVICES WANT TIMER SERVICE
|
|
|
|
HRRZ T5,FIRDDB ;POINT TO FIRST DEVICE(LOWEST ADR)
|
|
TIMCK2: SKIPN DV.TIM+1(T5) ;IS THIS DEVICE TIMING ?
|
|
JRST TIMCK4 ;NO SO DONE WITH IT
|
|
MOVE T2,INSRUN
|
|
CAMGE T2,DV.TIM+1(T5) ;HAS TIMER EXPIRED ?
|
|
JRST TIMCK3 ;NOT TIME FOR AN INTERRUPT
|
|
SETZM DV.TIM+1(T5)
|
|
CALL @DV.TIM(T5)
|
|
TIMCK3: SKIPN T1,DV.TIM+1(T5) ;IS THERE A TIMER ?
|
|
JRST TIMCK4 ;NO TIMER NOW
|
|
SUB T1,INSRUN ;MAKE RELATIVE TIME
|
|
CAML T1,INTDLY+1 ;LOWER THAN OTHERS ?
|
|
JRST TIMCK4 ;NO
|
|
MOVEM T1,INTDLY ;RESET TIMER
|
|
MOVEM T1,INTDLY+1
|
|
TIMCK4: HRRZ T5,DV.LNK(T5) ;GET ADR OF NEXT DEVICE
|
|
JUMPN T5,TIMCK2
|
|
TXNE FLG,F.FLOP
|
|
AOS (P)
|
|
POPJ P,
|
|
|
|
INTDLY: Z ;FLAG TO KEEP TRACK OF TIMING ETC.
|
|
; TO REQUEST A CHECK FOR INTERRUPTS DO A HRROS INTDLY
|
|
Z ;ORIGINAL COUNT IN INTDLY
|
|
|
|
INSRUN: Z ;COUNTER TICKED ONCE PER INSTRUCTION
|
|
WAITIM: Z ;TIME SPENT WAITING
|
|
|
|
DEFINE TADJUS <
|
|
HRRE T1,INTDLY ;CURRENT COUNT
|
|
HRRE T2,INTDLY+1 ;ORIGINAL COUNT
|
|
SUB T2,T1 ;COUNTS TAKEN SO FAR
|
|
ADDM T2,INSRUN ;UPDATE NUMBER OF INSTRUCTIONS EXECUTED
|
|
MOVNS T2
|
|
ADDB T2,INTDLY+1 ;MAKES NEW INTERVAL
|
|
HRRM T2,INTDLY
|
|
>
|
|
|
|
;HERE ON A RESET INSTRUCTION OR WHEN FIRST START
|
|
R.SET: HLLZ MA,UBACTL ;GET UNIBUS CONTROLLER NUMBER
|
|
TXNN FLG,F.EXEC
|
|
JRST R.SET1 ;DON'T RESET UNIBUS
|
|
MOVEI T1,1B29 ;BIT TO DO UNIBUS RESET
|
|
WRIO T1,UBA.SR(MA) ;RESET THE UNIBUS
|
|
CAIA
|
|
HALT R.SET ;IN CASE OF PAGE FAIL
|
|
WRIO T1,UBA.SR(MA) ;RESET THE UNIBUS
|
|
CAIA
|
|
HALT R.SET ;IN CASE OF PAGE FAIL
|
|
MOVEI T1,1B18!1B19!1B20!1B21 ;TO RESET TIMEOUT & MEMORY ERRORS
|
|
WRIO T1,UBA.SR(MA)
|
|
CAIA
|
|
HALT R.SET
|
|
RDIO T1,UBA.SR(MA)
|
|
TRNE T1,740000 ;ANY ERRORS LEFT ?
|
|
HALT R.SET
|
|
MOVEI T1,1B28 ;STOP ON MEMORY ERRORS
|
|
WRIO T1,UBA.SR(MA) ;ASSIGN PI LVLS
|
|
CAIA
|
|
HALT .+1 ;IN CASE OF PAGE FAIL
|
|
|
|
;INITIALIZE THE CTY
|
|
SETZM COLUMN ;BACK TO THE LH MARGIN
|
|
R.SET1: SETZM BR7PND ;CLEAN OUT PENDING INTERRUPTS
|
|
SETZM BR5PND ; DITTO
|
|
HRRZ T5,FIRDDB ;POINT TO THE FIRST DEVICE
|
|
R.SET2: SETZM DV.TIM+1(T5) ;CLEAR TIMER FOR DEVICE
|
|
CALL @DV.RST(T5) ;RESET THIS DEVICE
|
|
HRRZ T5,DV.LNK(T5) ;GET NEXT DEVICE ADR
|
|
JUMPN T5,R.SET2 ;LOOPBACK FOR REST OF DEVICES
|
|
POPJ P,
|
|
;DISPATCH TABLE FOR INSTRUCTIONS
|
|
|
|
DEFINE X (VAL,MASK,NAME,FLAG) <
|
|
IFE <<FLAG&<SMF.11!SMF.IN>>-<SMF.11!SMF.IN>> <ZZ=<VAL/100>-Z
|
|
IFG ZZ < REPEAT ZZ,<EXP ILLINS
|
|
Z=Z+1 >>
|
|
ZZ=<VAL+<<-MASK>&177777>>/100-Z
|
|
IFG ZZ < REPEAT ZZ,<EXP .'NAME
|
|
Z=Z+1 >>>>
|
|
|
|
|
|
OPDSP0:
|
|
XLIST
|
|
OPDSPA ;0000XX INSTRUCTIONS
|
|
.JMP ;0001XX INSTRUCTIONS
|
|
OPDSPB ;0002XX INSTRUCTIONS
|
|
Z= 3
|
|
INSTRU
|
|
ZZ= 2000-Z
|
|
REPEAT ZZ,<EXP ILLINS>
|
|
|
|
;DISPATCH TABLE FOR OPCODES 000000 THRU 000077
|
|
|
|
DEFINE X (VAL,MASK,NAME,FLAG) <
|
|
IFE <<FLAG&<SMF.11!SMF.IN>>-<SMF.11!SMF.IN>> <IFL <VAL-100> <ZZ=VAL-Z
|
|
IFG ZZ <REPEAT ZZ,<EXP ILLINS ;ILLEGAL INSTRUCTION DISPATCH
|
|
Z=Z+1>>
|
|
ZZ=VAL+<<-MASK>&177777>-Z
|
|
IFG ZZ <REPEAT ZZ,<EXP .'NAME ;DISPATCH FOR INSTRUCTION
|
|
Z=Z+1>>>>>
|
|
|
|
Z=0
|
|
OPDSP1:
|
|
INSTRU ;DO DISPATCHS FOR 000000-000077
|
|
REPEAT <100-Z>,<EXP ILLINS>
|
|
|
|
;DISPATCH TABLE FOR OPCODES 000200 THRU 000277
|
|
|
|
DEFINE X (VAL,MASK,NAME,FLAG) <
|
|
IFE <<FLAG&<SMF.11!SMF.IN>>-<SMF.11!SMF.IN>> <IFL <VAL-240> <ZZ=VAL-Z
|
|
IFG ZZ <REPEAT ZZ,<EXP ILLINS ;ILLEGAL INSTRUCTION DISPATCH
|
|
Z=Z+1>>
|
|
ZZ=VAL+<<-MASK>&177777>-Z
|
|
IFG ZZ <REPEAT ZZ,<EXP .'NAME ;DISPATCH FOR INSTRUCTION
|
|
Z=Z+1>>>>>
|
|
|
|
Z=200
|
|
OPDSP2: INSTRU ;DO DISPATCHS FOR 000200-000227
|
|
REPEAT <240-Z>,<EXP ILLINS>
|
|
EXP SIM11 ;THIS IS A NOP
|
|
REPEAT 17,<EXP .CCCLR> ;CLEAR CONDITION CODES
|
|
EXP SIM11 ;THIS IS A NOP
|
|
REPEAT 17,<EXP .CCSET> ;SET CONDITION CODES
|
|
|
|
LIST
|
|
|
|
DEFINE X (VAL,MASK,NAME,FLAG) <
|
|
IFE <<FLAG&<SMF.11!SMF.IN>>-<SMF.11!SMF.IN>> <IFN <<VAL&177740>-240> <
|
|
.'NAME: ZZRET==0
|
|
IFN <FLAG&<SMF.SS!SMF.DD!SMF.EI>>,<ANDI IR,77 >
|
|
IFN <FLAG&SMF.SS>,<ANDI T2,77
|
|
IFN <FLAG&SMF.BY>,<JSR @SBFTCH(T2) >
|
|
IFE <FLAG&SMF.BY>,<JSR @SFETCH(T2) >>
|
|
NAME'. FLAG
|
|
IFN <FLAG&SMF.BR> <
|
|
TRNE IR,200
|
|
TROA IR,177400
|
|
TRZ IR,177400
|
|
LSH IR,1
|
|
ADD PC,IR
|
|
ANDI PC,177777 >
|
|
IFE ZZRET,<JRST SIM11 >>>>
|
|
|
|
INSTRU
|
|
|
|
;HERE WHEN INSTRUCTION TRIES TO JMP TO REG
|
|
JMPREG: Z ;CAME WITH A JSR
|
|
JRST NXM... ;DIE
|
|
|
|
;HERE IF @STUFF (OR @BSTUFF) GIVES BUS TRAP
|
|
STFNXM: HRR PS,PS.REG+1 ;RESTORE OLD PS
|
|
JRST NXM...
|
|
|
|
;HERE FOR ILLEGAL MEMORY REFERENCES
|
|
NXM...: INTSAV 4
|
|
JRST SIM11
|
|
|
|
;HERE FOR ILLEGAL INSTRUCTION
|
|
ILLINS: INTSAV 10
|
|
JRST SIM11
|
|
|
|
;HERE FOR A CONDITION CODE CLEAR
|
|
.CCCLR: ANDI IR,17 ;STRIP EXTRA BITS
|
|
TRZ PS,(IR) ;CLEAR BITS
|
|
JRST SIM11
|
|
|
|
;HERE FOR A CONDITION CODE SET
|
|
.CCSET: ANDI IR,17 ;STRIP EXTRA BITS
|
|
TRO PS,(IR) ;SET BITS
|
|
JRST SIM11
|
|
|
|
;HERE FOR A STACK VIOLATION & RESTORE PS IF RED STACK & PDP11/40
|
|
STCKVP: Z ;HERE WITH A JSR
|
|
TXO FLG,F.SVIO ;REMEMBER WE HAD VIOLATION
|
|
HRROS INTDLY ;SO WE FIND IT QUICK
|
|
CAIL MA,400-40 ;DO WE NEED TO FORCE A RED ?
|
|
JRST @STCKVP ;JUST YELLOW SO RETURN
|
|
HRR PS,PS.REG+1 ;RESTORE PS
|
|
JRST RSTACK ;AND TAKE A RED STACK
|
|
|
|
;HERE FOR A STACK VIOLATION
|
|
STACKV: Z ;HERE WITH A JSR
|
|
TXO FLG,F.SVIO ;REMEMBER WE HAD VIOLATION
|
|
HRROS INTDLY ;SO WE FIND IT QUICK
|
|
CAIL MA,400-40 ;DO WE NEED TO FORCE A RED ?
|
|
JRST @STACKV ;JUST YELLOW SO RETURN
|
|
|
|
;HERE FOR A RED STACK VIOLATION
|
|
RSTACK: TXZ FLG,F.SVIO ;WE DID IT
|
|
MOVEI MA,2 ;PUT PS AT 2
|
|
STORE MA,PS ;SAVE THE PS
|
|
SETZB SP,MA
|
|
STORE MA,PC ;SAVE THE PC IN 0
|
|
MOVEI MA,4 ;ADR OF NEW PC
|
|
LOAD MA,T1 ;GET THE NEW PC
|
|
MOVEI MA,6 ;GET THE NEW PS
|
|
LOAD MA,T2 ;GET THE NEW PS
|
|
ANDI T2,377 ;STRIP EXTRA BITS
|
|
MOVE PC,T1 ;SET THE NEW PC
|
|
MOVE PS,T2 ;SET THE NEW PS
|
|
TRNE PC,1 ;BAD PC ?
|
|
TXZ FLG,F.RUNF ;STOP THE MACHINE
|
|
JRST SIM11
|
|
|
|
;DISPATCH TO FECTH SOURCE OPERAND (WORD MODE)
|
|
SFETCH: TAGDSP SGET
|
|
|
|
;DISPATCH TO FETCH OPERAND (WORD MODE)
|
|
FETCH: TAGDSP GET
|
|
|
|
;DISPATCH TO FETCH OPERAND (WORD MODE) AND SET UP MA FOR RSTORE
|
|
RFETCH: TAGDSP RGET
|
|
|
|
;DISPATCH TO FETCH SOURCE OPERAND (BYTE MODE)
|
|
SBFTCH: TAGDSP SBGT
|
|
|
|
;DISPATCH TO FETCH OPERAND (BYTE MODE)
|
|
BFETCH: TAGDSP BGET
|
|
|
|
;DISPATCH TO FETCH OPERAND (BYTE MODE) AND SET UP MA FOR RSTORE
|
|
BRFTCH: TAGDSP BRGT
|
|
|
|
;DISPATCH TO DO ADDRESS CALCULATION FOR JMP OR JSR
|
|
JMPCLC: TAGDSP JMP
|
|
|
|
;DISPATCH TO STORE OPERAND (WORD MODE)
|
|
; RH OF OPERAND MUST ALREADY BE MASKED TO 16 BITS (LH MAY BE NONZERO)
|
|
STUFF: TAGDSP PUT
|
|
|
|
;DISPATCH TO STORE OPERAND (BYTE MODE)
|
|
; RH OF OPERAND MUST ALREADY BE MASKED TO 8 BITS (LH MAY BE NONZERO)
|
|
BSTUFF: TAGDSP BPUT
|
|
|
|
|
|
;EXPAND MACRO FOR GET, RGET AND PUT
|
|
|
|
QQ= 0
|
|
REPEAT 10,<MODES \QQ
|
|
QQ= QQ+1
|
|
XLIST>
|
|
LIST
|
|
|
|
;ROUTINE TO READ AND WRITE IN THE IO AREA
|
|
; NOTE THAT REFERENCES ARE NOT CHECKED TO BE SURE IN IO AREA (160000-177777)
|
|
; THIS DOESN'T MATTER BECAUSE THEY WILL REFERENCE 600000+MEMLIM TO 7600000
|
|
; WHICH SHOULD PAGE FAIL (UNLESS MEMORY IS ON UNIBUS)
|
|
|
|
DEFINE X (Q,QQ) <
|
|
HRRZ MA+1,FIRDDB
|
|
CAMG MA,1(MA+1)
|
|
JRST [ CAMGE MA,(MA+1)
|
|
JRST .+3
|
|
TLO MA,MA..IO ;REMEMBER IS AN IO DEVICE
|
|
JRST @DV.'Q(MA+1) ]
|
|
HRRZ MA+1,DV.LNK(MA+1) ;GET NEXT DEVICE ADR
|
|
JUMPN MA+1,.-3
|
|
TXNN FLG,F.EXEC
|
|
JRST QQ ;CAN'T HELP THIS GUY
|
|
HLL MA,UBACTL ;ADD UBA UNIT NUMBER
|
|
>
|
|
|
|
;HERE TO DO A WORD LOAD FROM AN IO REGISTER
|
|
IOLDM1: SKIPA T1,[EXP 1] ;SIMPLE SKIP RETURN FOR GETWRD
|
|
IOLOAD: MOVEI T1,LODRET ;SO RETURN GOES RIGHT
|
|
ADDM T1,(P)
|
|
IOLDP2: X LOD,NXMRET
|
|
TXNN FLG,F.EXEC
|
|
JRST NXMRET
|
|
RDIO T1,600000(MA) ;GET DATA FROM UNIBUS
|
|
JRST IORET ;DONE
|
|
|
|
;HERE FOR A NXM (AFTER POPING RETURN OFF STACK)
|
|
NXMRET: TXNN FLG,F.EXEC ;RUNNING IN EXEC MODE ?
|
|
JRST NXMRT3 ;NO
|
|
MOVEI T2,1B18+1B21+1B28
|
|
LDB T1,P.PLVL ;GET PROCESSOR LEVEL
|
|
CAIGE T1,7 ;ALLOW BR7 ?
|
|
MOVEI T2,1B18+1B21!UBA.B7
|
|
CAIGE T1,5 ;ALLOW BR7 ?
|
|
MOVEI T2,1B18+1B21!UBA.B5!UBA.B7
|
|
HLLZ T1,UBACTL ;POINT TO RIGHT UNIBUS
|
|
WRIO T2,UBA.SR(T1) ;CLEAR FLAG
|
|
NXMRT3: TXNN FLG,F..SIM ;ARE WE SIMULATING ?
|
|
JRST [ SOS (P) ;UNSKIP THE RETURN
|
|
POPJ P, ]
|
|
POP P,T1 ;CLEAN OFF STACK
|
|
JRST NXM...
|
|
|
|
IORET: HRLI MA,MA..UN!MA..IO ;MUST BE A UNIBUS DEVICE
|
|
POPJ P,
|
|
|
|
;HERE TO DO A BYTE LOAD FROM AN IO REGISTER
|
|
SKIPA T1,[EXP 1] ;SIMPLE SKIP RETURN
|
|
IOBLOD: MOVEI T1,BLDRET ;NUMBER OF INSTRUCTIONS TO SKIP
|
|
ADDM T1,(P) ;SKIP RETURN
|
|
X BLD,NXMRET
|
|
TXNN FLG,F.EXEC
|
|
JRST NXMRET
|
|
RDIOB T1,600000(MA) ;GET DATA FROM UNIBUS
|
|
JRST IORET ;WILL SKIP IF FAILED
|
|
|
|
;HERE TO STORE A WORD IN THE IO AREA
|
|
IOSTOR: X WRT,STONXM
|
|
TXNN FLG,F.EXEC
|
|
JRST STONX3
|
|
WRIO T1,600000(MA) ;GIVE DATA TO UNIBUS
|
|
JRST IORET
|
|
STONXM: TXNN FLG,F.EXEC ;RUNNING IN EXEC MODE ?
|
|
JRST STONX3 ;NO
|
|
MOVEI T2,1B18+1B21+1B28
|
|
LDB T1,P.PLVL ;GET PROCESSOR LEVEL
|
|
CAIGE T1,7 ;ALLOW BR7 ?
|
|
MOVEI T2,1B18+1B21!UBA.B7
|
|
CAIGE T1,5 ;ALLOW BR7 ?
|
|
MOVEI T2,1B18+1B21!UBA.B5!UBA.B7
|
|
HLLZ T1,UBACTL ;POINT TO RIGHT UNIBUS
|
|
WRIO T2,UBA.SR(T1) ;CLEAR FLAG
|
|
STONX3: TXNN FLG,F..SIM ;ARE WE SIMULATING ?
|
|
POPJ P,
|
|
POP P,T1 ;CLEAN OFF STACK
|
|
JRST STFNXM ;GIVE BUS TRAP
|
|
|
|
;HERE TO STORE A BYTE IN THE IO AREA
|
|
IOBSTO: X BWR,STONXM
|
|
TXNN FLG,F.EXEC
|
|
JRST STONXM
|
|
WRIOB T1,600000(MA) ;GET DATA FROM UNIBUS
|
|
JRST IORET ;WON
|
|
|
|
DEFINE X (Q,QQ) <
|
|
TLNN MA,MA..UN ;IS THIS A UNIBUS DEVICE ?
|
|
JRST Q ;SAME AS PLAIN TYPE
|
|
HLL MA,UBACTL ;ADD UNIBUS UNIT
|
|
QQ T2,600000(MA) ;DO THE WRITE
|
|
POPJ P,
|
|
JRST IORERR > ;ERROR !?!
|
|
|
|
;HERE TO RESTORE (CLEARING BITS) A WORD TO THE IO AREA
|
|
IOR.C: X IOR.,BCIO
|
|
|
|
;HERE TO RESTORE (SETTING BITS) A WORD TO THE IO AREA
|
|
IOR.S: X IOR.,BSIO
|
|
|
|
;HERE TO RESTORE A WORD TO THE IO AREA
|
|
IOR.: TLNE MA,MA..UN ;IS THIS A UNIBUS DEVICE ?
|
|
JRST [ HLL MA,UBACTL ;ADD UNIBUS UNIT
|
|
WRIO T1,600000(MA) ;WRITE THE DATA
|
|
POPJ P,
|
|
JRST IORERR ] ;ERROR !?!
|
|
ANDI MA,177777
|
|
JRST @DV.WRT(MA+1) ;STORE DATA
|
|
|
|
;HERE TO RESTORE (CLEARING BITS) A BYTE TO THE IO AREA
|
|
IOBR.C: X IOBR.,BCIOB
|
|
|
|
;HERE TO RESTORE (SETTING BITS) A BYTE TO THE IO AREA
|
|
IOBR.S: X IOBR.,BSIOB
|
|
|
|
;HERE TO RESTORE A BYTE TO THE IO AREA
|
|
IOBR.: TLNE MA,MA..UN ;IS THIS A UNIBUS DEVICE ?
|
|
JRST [ HLL MA,UBACTL ;ADD UNIBUS NUMBER
|
|
WRIOB T1,600000(MA) ;WRITE THE DATA
|
|
POPJ P,
|
|
JRST IORERR ] ;ERROR !?!
|
|
ANDI MA,177777 ;STRIP EXTRA BITS
|
|
JRST @DV.BWR(MA+1) ;STORE DATA
|
|
|
|
;HERE IF ERROR RESTORING DATA
|
|
IORERR: HALT .
|
|
|
|
DDBADR==200000
|
|
|
|
DDBLNK==0
|
|
|
|
;HERE TO WRITE A SIMULATED DEVICE REGISTER
|
|
; CALL MOVE T1,<WANT TO WRITE>
|
|
; CALL DEVWRT
|
|
; RETURN WITH NEW REGISTER IN T1
|
|
DEVWRT: ANDI MA,177777 ;STRIP EXTRA BITS
|
|
HRRZ T2,MA ;COPY DEVICE ADDRESS
|
|
SUB T2,(MA+1) ;MAKE RELATIVE ADR
|
|
ADDI T2,DV.SIZ(MA+1) ;POINT TO DEVICE REGISTERS
|
|
PUSH P,T1 ;SAVE DATA TO WRITE
|
|
MOVE T1,(T2) ;GET ORIGINAL REGISTER
|
|
HRRM T1,1(T2) ;SAVE ORIGINAL REGISTER
|
|
HRLZS T1 ;BITS PROGRAM CAN WRITE
|
|
TXNN FLG,F..SIM ;IS SIMULATION RUNNING
|
|
HLRZ T1,1(T2) ;NO SO HAVE DIFFERENT ENABLES
|
|
ANDCAM T1,(T2) ;CLEAR BITS IN SIMULATED REGISTER
|
|
AND T1,(P) ;BITS TO SET
|
|
IORB T1,(T2) ;SET NEW BITS
|
|
POP P,T2 ;CLEAN UP STACK
|
|
POPJ P,
|
|
|
|
|
|
;HERE FOR PDP11 REFERENCES TO THE PS
|
|
|
|
DDBGEN PS.,1
|
|
|
|
PS.REG:
|
|
000357,,0 ;PS REGISTER FOR DEVWRT, ETC.
|
|
000377,,0 ;LET OPERATOR SET ALL BITS
|
|
|
|
PS.LOD: HRRZ T1,PS ;JUST A LOAD
|
|
POPJ P,
|
|
|
|
PS.BLD: HRRZ T1,PS ;LOAD THE PS
|
|
TRNE MA,1 ;WANT LEFT HALF ?
|
|
LSH T1,-^D8
|
|
ANDI T1,377
|
|
POPJ P,
|
|
|
|
PS.BWR: TRNE MA,1 ;WRITING LH ?
|
|
POPJ P,
|
|
PS.WRT: HRRM PS,PS.REG ;COPY CURRENT PS
|
|
CALL DEVWRT ;SET NEW PS
|
|
HRRZ PS,PS.REG ;SETUP NEW PS
|
|
|
|
;HERE TO SEE IF NEW PS IS LOWER PRIORITY THAN OLD PS AND IF SO CHECK FOR INTERRUPTS
|
|
PS.CHK: LDB T2,P.PLVL ;GET CURRENT PS LEVEL
|
|
TXNN FLG,F.EXEC ;RUNNING IN EXEC MODE ?
|
|
JRST PSCHK0 ;NO SO DON'T CHANGE ANYTHING
|
|
MOVEI T1,1B28 ;ASSUME CAN'T TAKE INTERRUPTS
|
|
CAIGE T2,7 ;CAN WE TAKE BR7'S NOW ?
|
|
HRRZI T1,UBA.B7 ;ENABLE CHANNEL FOR BR7
|
|
CAIGE T2,5 ;CAN WE TAKE BR5'S NOW ?
|
|
HRRZI T1,UBA.B5!UBA.B7 ;ENABLE FOR BR5 & BR7
|
|
HLLZ T2,UBACTL ;POINT TO UNIBUS
|
|
WRIO T1,UBA.SR(T2) ;ENABLE TO TAKE INTERRUPTS
|
|
PSCHK0: HRRZ MA+1,FIRDDB
|
|
PSCHK1: CAML T2,DV.LVL(MA+1)
|
|
JRST PSCHK3
|
|
TXZ FLG,F.FLOP
|
|
CALL @DV.INT(MA+1)
|
|
TXNE FLG,F.FLOP ;DID THAT ONE TAKE AN INTERRUPT ?
|
|
POPJ P, ;ALL DONE
|
|
LDB T2,P.PLVL ;GET CURRENT PS LEVEL
|
|
PSCHK3: HRRZ MA+1,DV.LNK(MA+1)
|
|
JUMPN MA+1,PSCHK1
|
|
POPJ P,
|
|
|
|
;HERE FOR PDP11 REFERENCES TO THE SWITCH REGISTER
|
|
|
|
SW.WRT==DEVWRT ;PLAIN DEVICE WRITE
|
|
DDBGEN SW.,1
|
|
|
|
SW.REG: 0,,0 ;THIS IS THE SWITCH REGISTER
|
|
177777,,0 ;LH IS WRITEABLE BY OPER BITS
|
|
|
|
SW.LOD: MOVE T1,SW.REG ;LOAD THE SWITCHES
|
|
POPJ P,
|
|
|
|
SW.BLD: MOVE T1,SW.REG ;LOAD THE SWITCHES
|
|
TRNE T1,1 ;WANT LH BYTE ?
|
|
LSH T1,-10 ;WANT LH
|
|
ANDI T1,377 ;ONLY 8 BITS
|
|
POPJ P,
|
|
|
|
SW.BWR: TXNE FLG,F..SIM ;ARE WE SIMULATING ?
|
|
POPJ P, ;YES SO DON'T WRITE IT
|
|
TRNN MA,1 ;WRITING RH ?
|
|
DPB T1,[POINT 8,SW.REG,35] ;YES
|
|
TRNE MA,1 ;WRITING LH ?
|
|
DPB T1,[POINT 8,SW.REG,27]
|
|
POPJ P,
|
|
|
|
;HERE TO READ OR WRITE THE SIMULATED CTY REGS
|
|
|
|
DDBGEN CTY,4
|
|
|
|
;SIMULATED DEVICE REGISTERS FOR CTY
|
|
; LH IS MASK FOR BITS WHICH USER CAN WRITE
|
|
; RH IS SIMULATED REGISTER
|
|
; 2ND WORD IS COPY BEFORE WRITE
|
|
CTISTS: 100,,200
|
|
300,,0
|
|
CTIDAT: 377,,0
|
|
377,,0
|
|
CTOSTS: 104,,200 ;200=RDY,100=ENAB,4=MAINT
|
|
304,,0
|
|
CTODAT: 377,,0
|
|
377,,0
|
|
CTOFLG: -1 ;WHEN -1 CTY OUTPUT WANTS TO INTERRUPT
|
|
CTIFLG: -1 ;WHEN -1 CTY INPUT WANTS TO INTERRUPT
|
|
|
|
CTITIM: Z ;TIME TO CHECK CTY FOR INPUT
|
|
CTISPD: EXP 010000 ;NUMBER OF INSTRUCTIONS BETWEEN INPUTTING CHARS
|
|
CTOTIM: Z ;TIME FOR CTY OUTPUT TO BE DONE OR 0
|
|
CTOSPD: EXP 001000 ;NUMBER OF INSTRUCTIONS BETWEEN PRINTING CHARS
|
|
|
|
;HERE ON A RESET
|
|
CTYRST: MOVE T1,CTISPD ;START TIMING AGAIN
|
|
ADD T1,INSRUN ;MAKE ABSOLUTE
|
|
MOVEM T1,CTITIM ;TIME TO CHECK KEYBOARD AGAIN
|
|
MOVEM T1,DV.TIM+1+CTYDDB ;TIME TO CHECK KEYBOARD
|
|
SETZM CTOTIM ;DON'T NEED TIMER FOR PRINTER
|
|
HLLZS CTISTS ;CLEAR KEYBOARD REGISTER
|
|
;CTIDAT UNAFFECTED
|
|
SETZM CTIFLG ;DON'T WANT TO INTERRUPT
|
|
MOVEI T1,200 ;DONE FLAG
|
|
HRRM T1,CTOSTS ;FOR TELEPRINTER
|
|
HLLZS CTODAT ;CLEAR OUTPUT DATA REGISTER
|
|
SETOM CTOFLG ;WANT TO INTERRUPT
|
|
POPJ P,
|
|
|
|
;HERE IF USER DOES A BYTE OPERATION TO READ A CTY REGISTER
|
|
CTYBLD: SETZ T1,
|
|
TRNE MA,1
|
|
POPJ P,
|
|
;FALL INTO WORD OPERATION
|
|
|
|
;HERE IF USER DOES A WORD OPERATION TO READ A CTY REGISTER
|
|
CTYLOD: SETCMI T1,200 ;MASK FOR CTISTS
|
|
TXNN FLG,F..SIM ;ARE WE SIMULATING ?
|
|
SETZ T1, ;NO - DON'T ZERO ANYTHING
|
|
CAMN MA,[MA..IO,,CTYADR+2] ;READING DATA ?
|
|
ANDM T1,CTISTS ;CLEAR DONE FLOP
|
|
HRRZ T1,CTISTS-CTYADR(MA) ;GET REGISTER FOR HIM
|
|
POPJ P,
|
|
|
|
;HERE IF USER DOES A BYTE WRITE TO A CTY REGISTER
|
|
CTYBWR: TRNE MA,1 ;WRITING LH ?
|
|
POPJ P, ;NO BITS THERE TO CHANGE
|
|
;FALL INTO WORD OPERATION
|
|
|
|
;HERE IF USER DOES A WORD WRITE TO A CTY REGISTER
|
|
CTYWRT: CALL DEVWRT ;PERFORM THE WRITE
|
|
JRST @.+1-CTYADR(MA)
|
|
CTIWRS ;WRITE CTY KEYBOARD STATUS REGISTER
|
|
HALT .
|
|
R ;WRITE KEYBOARD DATA REGISTER
|
|
HALT .
|
|
CTOWRS ;WRITE CTY PRINTER STATUS REGISTER
|
|
HALT .
|
|
CTOWDT ;WRITE CTY PRINTER DATA
|
|
HALT .
|
|
|
|
DEFINE X (Q,VEC) <
|
|
CT'Q'WRS:
|
|
TDZ T1,CT'Q'STS+1 ;CLEAR BITS WHICH WERE ALREADY SET
|
|
TRNN T1,100 ;WAS ENABLE SET ?
|
|
POPJ P, ;WAS ALREADY SET
|
|
SETOM CT'Q'FLG ;CAN INTERRUPT AGAIN
|
|
JRST CTYCHK ;CHECK FOR INTERRUPTS
|
|
>
|
|
|
|
;HERE BECAUSE WRITING CTY KEYBOARD STATUS REGISTER
|
|
X I,60
|
|
|
|
;HERE BECAUSE WRITING CTY PRINTER STATUS REGISTER
|
|
X O,64
|
|
|
|
;HERE BECAUSE WRITING CTY PRINTER DATA REGISTER
|
|
CTOWDT: MOVEI T1,200 ;READY FLOP
|
|
ANDCAM T1,CTOSTS
|
|
SETZM CTOFLG ;DON'T WANT TO INTERRUPT
|
|
TADJUS ;BE SURE INSRUN IS CURRENT
|
|
MOVE T1,CTOSPD ;TIME TILL ALL PRINTED
|
|
CAML T1,INTDLY+1 ;BEFORE WE STOP TO CHECK ?
|
|
JRST CTOWD1 ;YES
|
|
HRRM T1,INTDLY ;SET NEW TIME TO STOP
|
|
HRRM T1,INTDLY+1
|
|
CTOWD1: ADD T1,INSRUN ;ABSOLUTE TIME TO FINISH PRINT
|
|
MOVEM T1,CTOTIM ;REMEMBER WHEN DONE
|
|
CAMGE T1,DV.TIM+1+CTYDDB ;SOONER THAN KEYBOARD ?
|
|
MOVEM T1,DV.TIM+1+CTYDDB ;SOONER SO USE THIS VALUE
|
|
POPJ P,
|
|
|
|
;HERE IF TIMER FOR CTY GOES OFF
|
|
CTYTIM: MOVE T1,INSRUN ;GET NUMBER OF INSTRUCTIONS EXECUTED SO FAR
|
|
CAMGE T1,CTITIM ;TIME TO CHECK FOR CTY INPUT ?
|
|
JRST CHKCTO
|
|
ADD T1,CTISPD
|
|
MOVEM T1,CTITIM ;RESET CTY TIMER
|
|
INCHRS T1 ;HAS USER TYPED ?
|
|
JRST CHKCTO ;NOT YET
|
|
ANDI T1,177 ;STRIP PARITY (SHOULDN'T HAVE BEEN SET)
|
|
CAIN T1,15 ;WAS THAT A CARRIAGE RETURN ?
|
|
JRST [ INCHRS T2 ;GET THE LF THAT FOLLOWES
|
|
NOP ;FOOBAZ !!!!
|
|
JRST .+1 ]
|
|
CAIN T1,5 ;WAS THAT A <^E>
|
|
JRST [ TYPE <
|
|
^E
|
|
>
|
|
CALL TYPSTR
|
|
HRROS INTDLY ;STOP THE SIMULATION
|
|
TXZ FLG,F.RUNF ;STOP THE SIMULATION
|
|
JRST CHKCTO ]
|
|
CAIN T1,24 ;WAS THAT A ^T ?
|
|
JRST CNTRLT ;DISPLAY STATUS FOR CONTROL T
|
|
HRRM T1,CTIDAT ;SAVE CHAR FOR PROGRAM
|
|
MOVEI T1,200 ;DONE FLAG
|
|
IORB T1,CTISTS ;SET FLAG
|
|
SETOM CTIFLG ;SO WE INTERRUPT
|
|
CHKCTO: SKIPE T1,CTOTIM ;ARE WE TIMING TRANSMITTER ?
|
|
CAMLE T1,INSRUN ;AND HAS ITS TIME COME ?
|
|
JRST CTTIM8 ;NO
|
|
HRRZ T1,CTODAT ;GET CHARACTER TO PRINT
|
|
CALL TYPCHR ;TYPE THE CHARACTER
|
|
SETZM CTOTIM ;CLEAR TIMER
|
|
MOVEI T1,200 ;DONE FLAG
|
|
IORB T1,CTOSTS ;FLAG ITS DONE
|
|
SETOM CTOFLG ;WANT TO INTERRUPT
|
|
CTTIM8: SKIPE T1,CTOTIM ;ARE WE TIMING TRANSMITTER ?
|
|
CAMLE T1,CTITIM ;WILL TRANSMITTER BE FIRST ?
|
|
MOVE T1,CTITIM ;USE KEYBOARD TIME
|
|
MOVEM T1,CTYDDB+DV.TIM+1 ;SET TIMER
|
|
CTYCHK: LDB T1,P.PLVL ;GET PROCESSOR LEVEL
|
|
CAML T1,CTYDDB+DV.LVL ;CAN WE TAKE INTERRUPTS NOW ?
|
|
POPJ P, ;NOT NOW
|
|
|
|
;HERE CAUSE PS WENT BELOW OUR LVL
|
|
CTYINT: MOVE T1,CTISTS ;GET RECEIVER STATUS
|
|
TRNE T1,200 ;IN INTERRUPT FLAG UP
|
|
TRNN T1,100 ;AND IS ENABLE SET ?
|
|
JRST CTOINT ;CHECK TRANSMITTER
|
|
SKIPN CTIFLG ;MAY WE INTERRUPT ?
|
|
JRST CTOINT ;NO SO CHECK TRANSMITTER
|
|
SETZM CTIFLG ;DON'T INTERRUPT AGAIN
|
|
INTSAV 60 ;TAKE INPUT INTERRUPT
|
|
TXO FLG,F.FLOP ;FLAG WE TOOK AN INTERRUPT
|
|
CTOINT: MOVE T1,CTOSTS ;GET TRANSMITTER STATUS
|
|
TRNE T1,200 ;IS FLAG SET ?
|
|
TRNN T1,100 ;AND IS ENABLE SET ?
|
|
POPJ P,
|
|
SKIPN CTOFLG ;WANT TO INTERRUPT ?
|
|
POPJ P, ;CAN'T INTERRUPT AGAIN
|
|
SETZM CTOFLG ;DON'T WANT ANOTHER
|
|
INTSAV 64 ;TAKE A TRANSMITTER INTERRUPT
|
|
TXO FLG,F.FLOP ;FLAG WE TOOK AN INTERRUPT
|
|
POPJ P,
|
|
|
|
;HERE WHEN READ A CONTROL T FROM CTY WHILE SIMULATING
|
|
|
|
CNTRLT: CALL SIMSAC ;SAVE REG'S
|
|
TYPE < PC = >
|
|
MOVE T1,SIMREG+PC
|
|
CALL ADRTYP
|
|
TYPE < PS = >
|
|
MOVE T1,PS
|
|
CALL OCTYPE
|
|
TYPE < after >
|
|
MOVE T1,INSRUN
|
|
CALL PDECTY
|
|
TYPE < instructions >
|
|
TXNN FLG,F.LOPN ;WAS A LOCATION OPEN ?
|
|
JRST CNTLT6 ;NO SO DON'T DISPLAY
|
|
PUSH P,T5 ;SAVE DDB POINTER
|
|
CALL COMLF1 ;DISPLAY LOCATION
|
|
POP P,T5 ;RESTORE DDB POINTER
|
|
CNTLT6: CALL SIMSAC ;RESTORE AC'S
|
|
CALL CRLTYP
|
|
JRST CHKCTO
|
|
|
|
;HERE FOR REFERENCES TO KW11 CLOCK
|
|
|
|
DDBGEN CLK,1
|
|
|
|
CLKSTS: 000300,,0 ;SIMULATED CLOCK STATUS REGISTER
|
|
000300,,0 ; 200=INT,100=ENAB
|
|
CLKFLG: Z ;WHEN NONZERO CLOCK CAN INTERRUPT
|
|
CLKSPD: EXP ^D5000 ;INSTRUCTIONS/CLOCK TICK
|
|
; THIS IS SLOWER THAN REAL 11/40 BUT
|
|
; FASTER THAN SIMULATED 11/40
|
|
CLKTCK: Z ;COUNTED DOWN ONCE/MILASECOND
|
|
|
|
;HERE FOR THE KW11L ON A RESET
|
|
CLKRST: MOVEI T1,200
|
|
HRRM T1,CLKSTS
|
|
SETOM CLKFLG ;CAN TAKE AN INTERRUPT
|
|
TXNN FLG,F.EXEC
|
|
JRST CLKRS1
|
|
MOVEI T1,^D20 ;NUMBER OF MILLASECONDS TILL NEXT TICK
|
|
MOVEM T1,CLKTCK
|
|
CLKRS1: TADJUS ;MAKE TIMER CURRENT
|
|
MOVE T1,CLKSPD ;TIME TILL NEXT TICK
|
|
CAML T1,INTDLY+1 ;LESS THAN ANY OTHER ?
|
|
JRST CLKRS2
|
|
HRRM T1,INTDLY+1
|
|
HRRM T1,INTDLY
|
|
CLKRS2: ADD T1,INSRUN ;TIME TILL NEXT TICK
|
|
MOVEM T1,CLKDDB+DV.TIM+1
|
|
POPJ P,
|
|
|
|
;HERE TO READ THE CLOCK
|
|
CLKLOD: HRRZ T1,CLKSTS ;GET THE STATUS REGISTER
|
|
POPJ P, ;RETURN
|
|
|
|
;HERE TO READ THE CLOCK WITH A BYTE INSTRUCTION
|
|
CLKBLD: TRNE MA,1 ;WANT RH OR LH ?
|
|
TDZA T1,T1 ;WANTED LEFT HALF
|
|
HRRZ T1,CLKSTS ;WANTED RH
|
|
POPJ P,
|
|
|
|
;HERE FOR A BYTE WRITE TO THE KW11L
|
|
CLKBWR: TRNE MA,1 ;WRITING RH OR LH ?
|
|
POPJ P, ;DON'T WRITE LH
|
|
|
|
;HERE TO WRITE THE KW11L
|
|
CLKWRT: CALL DEVWRT ;PERFORM THE WRITE
|
|
TDZ T1,CLKSTS+1 ;CLEAR BITS ALREADY SET
|
|
TRNE T1,100 ;DID THAT SET ENABLE ?
|
|
SETOM CLKFLG ;CAN INTERRUPT AGAIN
|
|
JRST CLKWR3 ;CHECK FOR POSSIBLE INTERRUPT
|
|
|
|
;HERE WHEN TIMER GOES OFF FOR THE CLOCK
|
|
CLKTIM: TADJUS ;BE SURE TIMER CURRENT
|
|
MOVE T1,CLKSPD ;TIME TILL NEXT CLOCK TICK
|
|
CAML T1,INTDLY+1 ;WILL THIS BE NEXT DEVICE TO TICK ?
|
|
JRST CLKTI1
|
|
HRRM T1,INTDLY
|
|
HRRM T1,INTDLY+1
|
|
CLKTI1: ADD T1,INSRUN ;MAKES TIME FOR NEXT TICK
|
|
MOVEM T1,CLKDDB+DV.TIM+1 ;TIME FOR NEXT TICK
|
|
MOVEI T1,200 ;DONE FLAG
|
|
IORM T1,CLKSTS
|
|
SETOM CLKFLG ;CAN INTERRUPT AGAIN
|
|
TXNN FLG,F.EXEC
|
|
JRST CLKWR3
|
|
MOVEI T1,^D20 ;NUMBER OF MILLASECONDS TILL NEXT TICK
|
|
MOVEM T1,CLKTCK
|
|
CLKWR3: LDB T1,P.PLVL ;GET PROCESSOR LEVEL
|
|
CAML T1,CLKDDB+DV.LVL ;CAN WE INTERRUPT ?
|
|
POPJ P, ;NOT NOW
|
|
|
|
;HERE TO SEE IF CLOCK WANTS TO INTERRUPT
|
|
|
|
CLKINT: SKIPN CLKFLG ;CAN WE INTERRUPT ?
|
|
POPJ P, ;NO
|
|
HRRZ T1,CLKSTS ;GET THE STATUS REGISTER
|
|
TRNE T1,100 ;IS ENABLE SET ?
|
|
TRNN T1,200 ;IS FLAG SET ?
|
|
POPJ P, ;DON'T WANT TO INTERRUPT NOW
|
|
SETZM CLKFLG ;HAVE TAKEN OUR INTERRUPT NOW
|
|
INTSAV 100 ;TAKE AN INTERRUPT
|
|
TXO FLG,F.FLOP ;FLAG WE TOOK AN INTERRUPT
|
|
POPJ P,
|
|
|
|
REPEAT 0,<
|
|
;HERE FOR REFERENCES TO KG11
|
|
|
|
DDBGEN KG.,3
|
|
|
|
KG.STS: 000117,,0
|
|
000777,,0
|
|
KG.BCC: 000000,,0 ;BCC REGISTER - READ ONLY FOR PDP11
|
|
177777,,0 ; BUT OPERATOR CAN WRITE IT
|
|
KG.DAT: 177777,,0 ;DATA REGISTER - WRITE ONLY
|
|
177777,,0
|
|
|
|
KG.RST:
|
|
KG.LOD:
|
|
KG.BLD:
|
|
|
|
;HERE FOR WRITES TO KG11
|
|
KG.WRT: CALL DEVWRT ;WRITE THE REGISTER
|
|
POPJ P,
|
|
|
|
KG.BWR:
|
|
KG.TIM:
|
|
>
|
|
|
|
;HERE FOR REFERENCES TO UNIBUS ADAPTER
|
|
|
|
DDBGEN UBX,41
|
|
|
|
DEFINE X (Q) <
|
|
TXNE FLG,F..SIM ;ARE WE SIMULATING ?
|
|
JRST Q ;LOSE
|
|
TXNN FLG,F.EXEC ;ARE WE IN EXEC MODE ?
|
|
JRST Q ;LOSE
|
|
HLL MA,UBACTL ;ADD UNIBUS NUMBER
|
|
>
|
|
|
|
;HERE TO DO A LOAD FROM A UBX REGISTER
|
|
UBXLOD: X NXMRET
|
|
RDIO T1,600000(MA) ;GET DATA FROM UNIBUS
|
|
POPJ P, ;WILL SKIP IF FAILED
|
|
JRST NXMRET
|
|
|
|
;HERE TO DO A BYTE LOAD FROM A UBX REGISTER
|
|
UBXBLD: X NXMRET
|
|
RDIOB T1,600000(MA) ;GET BYTE FROM UNIBUS
|
|
POPJ P, ;WILL SKIP IF FAILED
|
|
JRST NXMRET
|
|
|
|
;HERE TO DO A WRITE TO A UBX REGISTER
|
|
UBXWRT: X STONXM
|
|
WRIO T1,600000(MA) ;GIVE DATA TO UNIBUS
|
|
POPJ P,
|
|
JRST STONXM
|
|
|
|
;HERE TO DO A BYTE WRITE TO THE UBX REGISTER
|
|
UBXBWR: X STONXM
|
|
WRIOB T1,600000(MA) ;GIVE DATA TO UNIBUS
|
|
POPJ P,
|
|
JRST STONXM
|
|
|
|
;POINTER TO FIRST DDB
|
|
; RH LINK IS FOR USE WHILE RUNNING - DEVICES MAY BE REMOVED BY REMOVING LINKS
|
|
; LH LINK IS SO DELETED DEVICES CAN BE REINSTALLED
|
|
FIRDDB: DDBLNK,,DDBLNK ;POINTER TO FIRST DDB
|
|
|
|
;BYTE POINTERS TO THE SIMULATED MEMORY
|
|
SIMPTR: MEMREL MEMORY
|
|
POINT 8,0(MA),17
|
|
MEMREL MEMORY
|
|
POINT 8,0(MA),9
|
|
MEMREL MEMORY
|
|
POINT 8,0(MA),35
|
|
MEMREL MEMORY
|
|
POINT 8,0(MA),27
|
|
|
|
;TABLE OF INSTRUCTIONS WHICH MUST BE RELOCATED
|
|
RLMTAB: BLOCK RLMSIZ
|
|
;HERE TO RELOCATE MEMORY REFERENCES
|
|
|
|
SIMREL: MOVE T3,[-RLMSIZ,,RLMTAB]
|
|
SKIPN T1,MEMORY ;GET ADDRESS OF SIMULATED MEMORY
|
|
HALT
|
|
SIMRL2: MOVE T2,(T3)
|
|
HLRZ T1,T2 ;GET WHAT TO RELOCATE WITH
|
|
MOVE T1,(T1)
|
|
HRRM T1,(T2)
|
|
AOBJN T3,SIMRL2
|
|
|
|
;RECONSTRUCT VIRGIN DEVICE CHAIN
|
|
MOVEI T1,FIRDDB-DV.LNK
|
|
HLRS T1,DV.LNK(T1)
|
|
JUMPN T1,.-1
|
|
|
|
;TO SPEED UP USER MODE RUNS REMOVE DDB FOR UNIBUS ADAPTER
|
|
TXNE FLG,F.EXEC ;RUNNING IN EXEC MODE ?
|
|
POPJ P, ;NO, SKIP THIS
|
|
PUSH P,IR ;SAVE REGISTER
|
|
MOVEI IR,FIRDDB-DV.LNK
|
|
SIMRL4: HRRZ T1,DV.LNK(IR) ;POINT TO NEXT DEVICE
|
|
CAIN T1,UBXDDB
|
|
HRRZ T1,DV.LNK(T1) ;SKIP POINTER TO UBA
|
|
HRRM T1,DV.LNK(IR)
|
|
SKIPE IR,T1
|
|
JRST SIMRL4
|
|
POP P,IR
|
|
SIMRL5: POPJ P,
|
|
|
|
;HERE TO SETUP EPT AND UNIBUS MAPPING
|
|
|
|
MAPCOR: TXNN FLG,F.EXEC ;RUNNING IN EXEC MODE ?
|
|
POPJ P, ;NO SO DON'T DIDDLE ADAPTER MAPPING
|
|
SKIPE T4,EPTBLK ;HAVE WE CHOSEN A SLOT FOR AN EPT YET ?
|
|
JRST MAPCR3 ;ALREADY HAVE AN EPT
|
|
|
|
;MOVE SYMBOL TABLE AND PDP11 MEMORY UP TO ALLOW FOR EPT
|
|
CALL POSYMT ;BE SURE SYMBOL TABLE IS AT END OF CORE
|
|
SKIPN T1,MEMUSE ;FIRST TABLE TO MOVE UP
|
|
HRRZ T1,SYMBEG ;IF NO MEMORY THAN JUST MOVING SYMBOL TABLE
|
|
HRRZM T1,T2 ;SAVE FIRST ADR IN OLD TABLES
|
|
ADDI T1,777 ;WE WILL ROUND TO NEXT PAGE
|
|
ANDI T1,777000 ;MAKE PAGE ADR
|
|
MOVEM T1,EPTBLK ;SAVE ADR OF EPT
|
|
ADDI T1,EBLKSZ ;TO GET TO FIRST TABLE
|
|
SUB T1,T2 ;HOW MUCH TO MOVE TABLE
|
|
MOVE T3,SYMEND ;LAST ADR IN SYMBOL TABLE
|
|
ADDI T3,-1(T1) ;NEW LAST ADR IN SYMBOL TABLE
|
|
CALL MOVMUS ;MOVE THE TABLES
|
|
MAPCR1: MOVE T4,EPTBLK ;GET EPT ADR AGAIN
|
|
HRLI T1,INTBLK ;COPY UUO AND INTERRUPT VECTORS
|
|
HRRI T1,EPTINT(T4)
|
|
BLT T1,EPTINT+15(T4)
|
|
MOVEI T1,VECTAB(T4) ;ADR OF VECTOR TABLE FOR UBA
|
|
MOVEI T2,EPTVEC(T4) ;WHERE VECTORS GO
|
|
HRLI T2,-10 ;POSSIBLE NUMBER OF UBA'S
|
|
MOVEM T1,(T2)
|
|
AOBJN T2,.-1
|
|
MOVSI T1,(NOP)
|
|
MOVEM T1,EPTAOV(T4) ;IN CASE OF ARITHMITIC OVERFLOW
|
|
MOVE T1,[JSR EPDLOV] ;TELL USER ABOUT PROBLEM
|
|
MOVEM T1,EPTPDO ;IN CASE OF PUSHDOWN LIST OVERFLOW
|
|
LDB T1,[POINT 9,T4,26] ;PICK UP PAGE NUMBER OF EPT
|
|
ADD T1,[124000,,2] ;IMMEDIATE; KERNEL; WRITABLE; CACHE
|
|
; ,, SECT 0 PAGE TABLE
|
|
MOVEM T1,EPTSTP(T4) ;POINTER TO SECTION 0 PAGE TABLE
|
|
MOVEI T1,UUO0 ;WHERE TO GO ON A MUUO
|
|
MOVEM T1,1430(T4)
|
|
HRLI T1,1430(T4)
|
|
HRRI T1,1431(T4)
|
|
BLT T1,1437(T4)
|
|
MOVEI T1,PGFAIL ;WHERE TO GO ON A PAGE FAIL
|
|
MOVEM T1,UPTPFN(T4)
|
|
MOVSI T1,400000 ;CST ENTRY
|
|
MOVEM T1,CST...(T4) ;FIRST ENTRY IN THE TABLE
|
|
HRLI T1,CST...(T4) ;BEGINING OF CST TABLE
|
|
HRRI T1,CST...+1(T4)
|
|
BLT T1,CST...+777(T4) ;FILL TABLE
|
|
;FILL UP VECTOR TABLE AND SPACE
|
|
MOVEI T3,VECTAB(T4)
|
|
MAPCR2: MOVE T1,T3
|
|
SUBI T1,VECTAB(T4)
|
|
IMULI T1,5
|
|
ADDI T1,VECTAB+400(T4)
|
|
HRLI T1,(JSR)
|
|
MOVEM T1,(T3) ;JSR VEC#
|
|
SETZM (T1) ;VEC#: 0
|
|
HRLI T1,(PUSH P,)
|
|
MOVEM T1,1(T1) ;PUSH P,VEC#
|
|
MOVE T2,[PUSH P,T1]
|
|
MOVEM T2,2(T1) ;PUSH P,T1
|
|
MOVE T2,T3
|
|
SUBI T2,VECTAB(T4)
|
|
LSH T2,2
|
|
HRLI T2,(MOVEI T1,)
|
|
MOVEM T2,3(T1) ;MOVEI T1,#
|
|
MOVE T2,[JRST VECXX]
|
|
MOVEM T2,4(T1) ;JRST VECXX
|
|
CAIE T3,VECTAB+377(T4)
|
|
AOJA T3,MAPCR2
|
|
|
|
;SETUP THE PAGE MAP FOR LOW CORE
|
|
MAPCR3: MOVSI T1,124000 ;FIRST ENTRY FOR SECTION 0 PAGE TABLE
|
|
MOVEI T3,STB...(T4) ;ADR OF SECTION 0 PAGE TABLE
|
|
HRLI T3,-400 ;ONLY FILL IN FIRST 256 PAGES
|
|
MAPCR4: HRRZ T2,T1
|
|
LSH T2,^D9
|
|
CAML T2,MEMORY ;CACHE ONLY UP TO PDP11 MEMORY
|
|
TLZ T1,004000 ;UNCACHE PDP11 MEMORY
|
|
MOVEM T1,(T3)
|
|
AOS T1
|
|
AOBJN T3,MAPCR4
|
|
MOVSI T1,4000 ;MASK FOR CACHE BIT
|
|
ANDCAM T1,STB...(T4) ;UNCACHE FIRST PAGE (8080 WORDS)
|
|
;SETUP THE UNIBUS MAPPING REGISTERS
|
|
SETZM T2
|
|
MOVE T1,MEMORY ;GET STARTING ADDRESS OF MEMORY
|
|
LSH T1,-^D9 ;CONVERT TO PAGE NUMBER
|
|
TXO T1,UB.VLD!UB.16B!UB.RPW ;SET READ/PAUSE WRITE, 16BIT, & VALID
|
|
MAPCR5: HLL T2,UBACTL ;POINT TO RIGHT UNIBUS
|
|
WRIO T1,UBAMAP(T2) ;WRITE MAPPING REGISTER
|
|
TLZA T2,-1 ;CLEAR UNIBUS NUMBER
|
|
HALT .+1 ;IF GET PAGE FAIL
|
|
AOS T2
|
|
LSH T2,^D11
|
|
CAML T2,MEMLIM ;STILL IN RANGE ?
|
|
TXZ T1,UB.VLD ;CLEAR VALID BIT
|
|
LSH T2,-^D11
|
|
CAIE T2,^D64
|
|
AOJA T1,MAPCR5
|
|
SETO T1,
|
|
WRCSTM T1 ;WRITE CST MASK REGISTER
|
|
SETZ T1,
|
|
WRPUR T1 ;WRITE PROCESS USE REGISTER
|
|
MOVEI T1,CST...(T4) ;ADR OF CST
|
|
WRCSB T1 ;WRITE CORE STATUS TABLE BASE REGISTER
|
|
MOVE T1,EPTBLK ;GET ADR OF EXECUTIVE PROCESS TABLE
|
|
LSH T1,-^D9
|
|
IORI T1,1B21!1B22 ;TOPS-20 PAGING, ENABLE TRAP AND PAGING
|
|
WREBR (T1) ;SET UP EBR FOR EPT
|
|
TRZ T1,1B22
|
|
ADD T1,[1B0!1B2!1] ;LOAD AC BLOCK AND UBR
|
|
WRUBR T1 ;SETUP UBR FOR UPT
|
|
POPJ P,
|
|
|
|
INTBLK: JSR CH1
|
|
HALT 42
|
|
JSR CH2
|
|
HALT 44
|
|
JSR CH3
|
|
HALT 46
|
|
JSR CH4
|
|
HALT 50
|
|
JSR CH5
|
|
HALT 52
|
|
JSR CH6
|
|
HALT 54
|
|
JSR CH7
|
|
HALT 56
|
|
|
|
CH1: Z
|
|
HALT .+1
|
|
JEN @CH1
|
|
|
|
CH2: Z
|
|
PUSH P,T1 ;SAVE REGISTER
|
|
PUSH P,T2 ;SAVE ANOTHER REGISTER
|
|
RDAPR T1 ;GET PROCESSOR STATUS
|
|
TRNE T1,7B28 ;SERIOUS PROBLEM ?
|
|
PUSHJ P,[CALL SAVE24 ;SAVE REGISTER
|
|
PUSH P,T1
|
|
CALL INLMES
|
|
ASCIZ \
|
|
APR error \
|
|
POP P,T1
|
|
CALL OCTYPE
|
|
WRAPR 1B22!7B28!APRLVL ;CLEAR ERROR FLAG
|
|
HALT R ]
|
|
TRNN T1,1B30 ;DID CLOCK GO OFF ?
|
|
JRST CH2CK5
|
|
AOS UPTIME ;WE HAVE BEEN UP FOR ANOTHER MILLASECOND
|
|
WRAPR 1B22!1B30!APRLVL ;CLEAR THE CLOCK FLAG
|
|
SOSG CLKTCK ;TIME FOR KW11 TO TICK ?
|
|
JRST [ MOVEI T2,^D20 ;NUMBER OF MILASECONDS TILL NEXT TICK
|
|
MOVEM T2,CLKTCK
|
|
TXNN FLG,F.RUNF ;ARE WE SIMULATING
|
|
JRST CH2CK5 ;NO
|
|
MOVEM T2,CLKDDB+DV.TIM+1 ;KW11 WANTS TIMER SERVICE NOW
|
|
HRROS INTDLY ;CHECK KW11 SOON
|
|
JRST CH2CK5]
|
|
CH2CK5: TRNE T1,1B31 ;DID THE 8080 INTERRUPT
|
|
JRST [ MOVE T2,FEWINP ;GET DATA
|
|
WRAPR 1B22!1B31!APRLVL ;CLEAR FLAG
|
|
JUMPE T2,CH2CK9 ;IF NOTHING WE'RE DONE
|
|
SETZM FEWINP ;FLAG WE SAW IT
|
|
HRRZ T1,T2 ;COPY DATA
|
|
LSH T1,-^D8 ;LEAVE ONLY THE CODE
|
|
CAIE T1,1 ;IS THIS A CTY CHAR ?
|
|
JRST CH2CK9 ;NO
|
|
ANDI T2,377
|
|
CAIE T2,217 ; ODD PARITY
|
|
CAIN T2,17 ;IS THIS A CONTROL O ?
|
|
JRST [ SETCMM CNTLOF ;COMPLEMENT CONTROL O FLAG
|
|
JRST CH2CK9]
|
|
MOVE T1,RCVPTR ;GET RECEIVE CHAR PUTTER
|
|
IDPB T2,T1 ;PUT CHAR IN BUFFER
|
|
CAMN T1,[POINT 8,RCVBUF+7,31]
|
|
MOVE T1,[POINT 8,RCVBUF] ;WRAP BUFFER AROUND
|
|
MOVEM T1,RCVPTR
|
|
JRST CH2CK9 ]
|
|
CH2CK9: POP P,T2 ;RESTORE REGISTER
|
|
POP P,T1 ;RESTORE REGISTER
|
|
JEN @CH2
|
|
|
|
UPTIME: Z ;COUNTED ONCE PER MILLASECOND
|
|
|
|
CH3: Z
|
|
HALT .+1
|
|
JEN @CH3
|
|
|
|
CH4: Z
|
|
HALT .+1
|
|
JEN @CH4
|
|
|
|
CH5: Z
|
|
HALT .+1
|
|
JEN @CH5
|
|
|
|
CH6: Z
|
|
HALT .+1
|
|
JEN @CH6
|
|
|
|
CH7: Z
|
|
HALT .+1
|
|
JEN @CH7
|
|
|
|
;HERE AFTER AFTER TAKING A VECTORED INTERRUPT
|
|
; INTERRUPTED PC IS PUSHED ON STACK FOLLOWED BY T1
|
|
VECXX: HRROS INTDLY
|
|
PUSH P,T2 ;SAVE ANOTHER REG
|
|
RDPI T2 ;GET PI STATUS
|
|
TRNE T2,BR7INT ;WAS THIS A BR7(BR6) INTERRUPT ?
|
|
JRST VECX7
|
|
TRNN T2,BR5INT ;WAS THIS A BR5(BR4) INTERRUPT
|
|
HALT .+1
|
|
MOVEM T1,BR5PND# ;SAVE VECTOR FOR PENDING INTERRUPT
|
|
MOVEI T1,1B28
|
|
HLLZ T2,UBACTL ;GET UNIBUS NUMBER
|
|
WRIO T1,UBA.SR(T2)
|
|
POP P,T2
|
|
POP P,T1
|
|
POP P,BR5TRP#
|
|
JEN @BR5TRP# ;DISMISS THE INTERRUPT
|
|
|
|
VECX7: MOVEM T1,BR7PND# ;SAVE VECTOR FOR PENDING INTERRUPT
|
|
MOVEI T1,1B28
|
|
HLLZ T2,UBACTL ;GET UNIBUS NUMBER
|
|
WRIO T1,UBA.SR(T2)
|
|
POP P,T2
|
|
POP P,T1
|
|
POP P,BR7TRP# ;GET WHERE WE INTERRUPTED FROM
|
|
JEN @BR7TRP#
|
|
|
|
|
|
;HERE IN CASE OF PUSHDOWN LIST OVERFLOW
|
|
|
|
EPDLOV: HALT .
|
|
|
|
;HERE ON A PAGE FAIL
|
|
|
|
PGFAIL: MOVEM T4,PGFSAV# ;SAVE A REG
|
|
MOVE T4,EPTBLK ;POINT TO PAGE TABLES
|
|
PUSH P,UPTPFO(T4) ;SAVE ADR WE CAME FROM
|
|
AOS (P) ;ADVANCE OVER FAILING INSTRUCTION
|
|
MOVE T4,PGFSAV# ;RESTORE REG
|
|
CALL SAVE4 ;SAVE T1-T4
|
|
MOVE T4,EPTBLK ;POINT TO PAGE TABLES
|
|
LDB T1,[POINT 6,UPTPFW(T4),5] ;GET PAGE FAIL CODE
|
|
CAIN T1,20 ;IS THIS AN IO FAILURE ?
|
|
JRST RSKP ;RETURN MAKING FAILING INSTRUCTION SKIP
|
|
CALL INLMES
|
|
ASCIZ \
|
|
Page Fail @pc = \
|
|
MOVE T4,EPTBLK ;POINT TO PAGE TABLES AGAIN
|
|
MOVE T1,UPTPFO(T4) ;GET FAILING PC
|
|
CALL OCTYPE ;DISPLAY THE PC
|
|
CALL INLMES
|
|
ASCIZ \ ... Page fail word \
|
|
MOVE T4,EPTBLK ;CUZ INLMES WIPES T4
|
|
MOVE T1,UPTPFW(T4)
|
|
CALL OCTYPE
|
|
HALT .+1
|
|
POPJ P,
|
|
|
|
;HERE ON A UUO
|
|
UUO0: MOVEM 16,UUOACS+16
|
|
MOVEI 16,UUOACS
|
|
BLT 16,UUOACS+15
|
|
MOVE AC1,EPTBLK ;ADDRESS OF EXECUTIVE PROCESS TABLE
|
|
PUSH P,.UPMUP(AC1) ;SAVE RETURN ADR ON STACK
|
|
MOVE AC2,.UPMUO+2(AC1) ;GET UUO EFFECTIVE ADR
|
|
LDB AC3,[POINT 4,.UPMUO(AC1),30] ;GET REG ARGUMENT
|
|
LDB T1,[POINT 9,.UPMUO(AC1),26] ;GET OP CODE
|
|
CAIL T1,40
|
|
CAIL T1,100
|
|
CALL ILLUUO
|
|
ROT T1,-1
|
|
TLNE T1,400000
|
|
SKIPA T1,UUODSP-20(T1)
|
|
HLRZ T1,UUODSP-20(T1)
|
|
CALL (T1)
|
|
UUORET: CAIA
|
|
AOS (P)
|
|
MOVSI 16,UUOACS
|
|
BLT 16,16 ;RESTORE ACS
|
|
POPJ P,
|
|
|
|
UUOACS: BLOCK ^D16 ;COPY AC'S HERE WHILE DOING A UUO
|
|
|
|
UUODSP: ILLUUO,,UUINIT ;CALL(40),,INIT(41)
|
|
ILLUUO,,ILLUUO ;(42),,(43)
|
|
ILLUUO,,ILLUUO ;(44),,(45)
|
|
ILLUUO,,UCALLI ;(46),,CALLI(47)
|
|
UUOPEN,,UTTCAL ;OPEN(50),,TTCALL(51)
|
|
ILLUUO,,ILLUUO ;(52),,(53)
|
|
ILLUUO,,ILLUUO ;(54),,RENAME(55)
|
|
ILLUUO,,ILLUUO ;IN(56),,OUT(57)
|
|
USTSTS,,ILLUUO ;SETSTS(60),,STATO(61)
|
|
ILLUUO,,ILLUUO ;STATUS(62),,GETSTS(63)
|
|
ILLUUO,,ILLUUO ;STATZ(64),,INBUF(65)
|
|
ILLUUO,,ILLUUO ;INPUT(66),,OUTPUT(67)
|
|
UCLOSE,,URLEAS ;CLOSE(70),,RELEAS(71)
|
|
ILLUUO,,ILLUUO ;MTAPE(72),,UGETF(73)
|
|
ILLUUO,,ILLUUO ;USETI(74),,USETO(75)
|
|
ILLUUO,,ILLUUO ;LOOKUP(76),,ENTER(77)
|
|
|
|
ILLUUO: CALL INLMES
|
|
ASCIZ \
|
|
Illegal UUO \
|
|
PUSH P,.UPMUP(AC1) ;SAVE PC
|
|
HRLZ T1,.UPMUO(AC1) ;GET THE UUO
|
|
HRR T1,.UPMUO+2(AC1) ;PICKUP EFFECTIVE ADR
|
|
CALL OCTYPE ;DISPLAY OCTAL CODE
|
|
CALL INLMES
|
|
ASCIZ \ @PC=\
|
|
POP P,T1 ;GET PC
|
|
ANDI T1,-1 ;STRIP OFF THE FLAGS
|
|
SOS T1 ;BACK UP TO UUO
|
|
CALL OCTYPE
|
|
HALT .+1
|
|
POP P,T1 ;CLEAN OFF THE STACK
|
|
JRST UUORET ;THEN EXIT UUO
|
|
|
|
;HERE FOR A CALLI UUO
|
|
UCALLI: MOVE T1,UUOACS(AC3) ;GET ARGUMENT FROM REGISTER
|
|
HRRZ T2,AC2 ;GET CALLI INDEX
|
|
CAIL T2,126
|
|
JRST ILLUUO
|
|
ROT T2,-1
|
|
TLNE T2,400000
|
|
SKIPA T2,CALDSP(T2)
|
|
HLRZ T2,CALDSP(T2)
|
|
JRST (T2)
|
|
|
|
CALDSP: CALLI0,,ILLUUO ;RESET(0),,(1)
|
|
ILLUUO,,ILLUUO ;SETDDT(2),,(3)
|
|
ILLUUO,,ILLUUO ;DEVCHR(4),,(5)
|
|
ILLUUO,,ILLUUO ;GETCHR(6),,(7)
|
|
ILLUUO,,UCORE ;WAIT(10),,CORE(11)
|
|
ILLUUO,,ILLUUO ;EXIT(12),,(13)
|
|
ILLUUO,,ILLUUO ;DATE(14),,LOGIN(15)
|
|
ILLUUO,,ILLUUO ;APRENB(16),,LOGOUT(17)
|
|
ILLUUO,,ILLUUO ;SWITCH(20),,REASSIGN(21)
|
|
ILLUUO,,ILLUUO ;TIMER(22),,MSTIME(23)
|
|
ILLUUO,,ILLUUO ;GETPPN(24),,TRPSET(25)
|
|
ILLUUO,,URUNTM ;(26),,RUNTIM(27)
|
|
ILLUUO,,USLEEP ;PJOB(30),,SLEEP(31)
|
|
ILLUUO,,ILLUUO ;(32),,PEEK(33)
|
|
ILLUUO,,ILLUUO ;GETLIN(34),,RUN(35)
|
|
ILLUUO,,ILLUUO ;SETUWP(36),,REMAP(37)
|
|
ILLUUO,,UGTTAB ;GETSEG(40),,GETTAB(41)
|
|
ILLUUO,,ILLUUO ;SPY(42),,SETNAM(43)
|
|
ILLUUO,,ILLUUO ;TMPCOR(44),,DSKCHR(45)
|
|
ILLUUO,,ILLUUO ;SYSSTR(46),,JOBSTR(47)
|
|
ILLUUO,,ILLUUO ;STRUUO(50),,SYSPHY(51)
|
|
ILLUUO,,ILLUUO ;(52),,DEVTYP(53)
|
|
ILLUUO,,ILLUUO ;DEVSTS(54),,DEVPPN(55)
|
|
ILLUUO,,ILLUUO ;SEEK(56),,RTTRP(57)
|
|
RSKP,,ILLUUO ;LOCK(60),,JOBSTS(61)
|
|
ILLUUO,,ILLUUO ;LOCATE(62),,WHERE(63)
|
|
ILLUUO,,ILLUUO ;DEVNAM(64),,CTLJOB(65)
|
|
ILLUUO,,ILLUUO ;GOBSTR(66),,(67)
|
|
ILLUUO,,RSKP ;(70),,HPQ(71)
|
|
ILLUUO,,ILLUUO ;HIBER(72),,WAKE(73)
|
|
ILLUUO,,ILLUUO ;CHGPPN(74),,SETUUO(75)
|
|
ILLUUO,,ILLUUO ;(76),,OTHUSR(77)
|
|
ILLUUO,,ILLUUO ;CHKACC(100),,DEVSIZ(101)
|
|
ILLUUO,,ILLUUO ;DAEMON(102),,JOBPEK(103)
|
|
ILLUUO,,ILLUUO ;ATTACH(104),,DAEFIN(105)
|
|
ILLUUO,,ILLUUO ;FRCUUO(106),,DEVLNM(107)
|
|
ILLUUO,,ILLUUO ;PATH(110),,METER.(111)
|
|
ILLUUO,,ILLUUO ;MTCHR.(112),,JBSET.(113)
|
|
ILLUUO,,ILLUUO ;POKE.(114),,TRMNO.(115)
|
|
ILLUUO,,ILLUUO ;TRMOP.(116),,RESDV.(117)
|
|
RSKP,,ILLUUO ;UNLOK.(120),,DISK(121)
|
|
ILLUUO,,ILLUUO ;DVRST.(122),,DVURS.(123)
|
|
ILLUUO,,ILLUUO ;(124),,CAL11.(125)
|
|
|
|
;RESET
|
|
CALLI0: WRAPR 1B19!1B22!37B30 ;IO RESET
|
|
CALL R.SET ;DO A UNIBUS RESET
|
|
WRPI 12377 ;RESET PI SYSTEM & TURN IT ON
|
|
MOVEI T1,^D4096
|
|
WRINT T1 ;SET INTERVAL FOR TIMER
|
|
SETZM FEWSTS ;CLEAR FRONT END STATUS WORD
|
|
SETZM FEWINP ;CLEAR INPUT WORD
|
|
SETZM FEWOUT ;CLEAR OUTPUT WORD
|
|
MOVE T1,[POINT 8,RCVBUF]
|
|
MOVEM T1,RCVPTR ;INITIALIZE RECEIVE CHAR PUTTER
|
|
MOVEM T1,RCVTKR ;INITIALIZE RECEIVE CHAR TAKER
|
|
SETZM CNTLOF ;CLEAR CONTROL O FLAG
|
|
WRAPR 1B20!73B31!APRLVL ;ENABLE INTERRUPTS
|
|
MOVSI T1,400000
|
|
LSH T1,-1
|
|
JUMPG T1,R
|
|
TYPE <LSH extends sign>
|
|
HALT CALLI0
|
|
|
|
;CORE - CALLI 11
|
|
UCORE: IORI T1,777
|
|
HRRM T1,.JBREL ;SET NEW JOBREL
|
|
MOVEI T1,140
|
|
MOVEM T1,UUOACS(AC3) ;RESULT
|
|
AOS (P)
|
|
POPJ P,
|
|
|
|
;HERE FOR A RUNTIM UUO
|
|
URUNTM: MOVE T1,UPTIME ;GET UPTIME (WE USE ALL THE TIME)
|
|
MOVEM T1,UUOACS(AC3) ;RESULT
|
|
POPJ P,
|
|
|
|
;SLEEP - CALLI 31
|
|
USLEEP: POPJ P,
|
|
|
|
;GETTAB - CALLI 41
|
|
UGTTAB: POPJ P,
|
|
|
|
;HERE FOR A TTCALL UUO
|
|
UTTCAL: CAIG AC2,16
|
|
ADDI AC2,UUOACS ;POINT TO RIGHT ARGUMENT
|
|
ROT AC3,-1
|
|
TLNE AC3,400000
|
|
SKIPA T2,TTCDSP(AC3)
|
|
HLRZ T2,TTCDSP(AC3)
|
|
JRST (T2)
|
|
TTCDSP: TTCLL0,,TTCLL1 ;INCHRW(0),,OUTCHR(1)
|
|
TTCLL2,,TTCLL3 ;INCHRS(2),,OUTSTR(3)
|
|
TTCLL4,,TTCLL5 ;INCHWL(4),,INCHSL(5)
|
|
TTCLL6,,TTCLL7 ;GETLCH(6),,SETLCH(7)
|
|
TTCL10,,TTCL11 ;RESCAN(10),,CLRBFI(11)
|
|
TTCL12,,TTCL13 ;CLRBFO(12),,SKPINC(13)
|
|
TTCL14,,TTCL15 ;SKPINL(14),,IONEOU(15)
|
|
ILLUUO,,ILLUUO ;(16),,(17)
|
|
|
|
;INCHRW
|
|
TTCLL0: CALL CHKCHR ;SEE IF THERE IS A CHARACTER READY
|
|
JRST TTCLL0 ;TRY AGAIN
|
|
MOVEM T1,(AC2) ;GIVE USER THE DATA
|
|
POPJ P,
|
|
|
|
;OUTCHR
|
|
TTCLL1: MOVE T1,(AC2) ;GET THE CHARACTER TO WRITE
|
|
JRST SCNTYP ;TYPE THE CHARACTER
|
|
|
|
;INCHRS
|
|
TTCLL2: CALL CHKCHR ;TRY TO GET A CHARACTER
|
|
POPJ P, ;TRY LATER
|
|
MOVEM T1,(AC2) ;GIVE THE USER THE CHARACTER
|
|
AOS (P)
|
|
POPJ P,
|
|
|
|
;OUTSTR
|
|
TTCLL3: HRLI AC2,(POINT 7,0)
|
|
TTCL31: ILDB T1,AC2
|
|
JUMPE T1,R ;IF NULL WE ARE DONE
|
|
CALL SCNTYP ;TYPE THE CHARACTER
|
|
JRST TTCL31
|
|
|
|
;INCHWL
|
|
TTCLL4: JRST TTCLL0
|
|
|
|
;INCHSL
|
|
TTCLL5: JRST TTCLL2
|
|
|
|
;GETLCH
|
|
TTCLL6: SETZM (AC2)
|
|
POPJ P,
|
|
|
|
;SETLCH
|
|
TTCLL7: POPJ P,
|
|
|
|
;RESCAN
|
|
TTCL10: POPJ P,
|
|
|
|
;CLRBFI
|
|
TTCL11: POPJ P,
|
|
|
|
;CLRBFO
|
|
TTCL12: POPJ P,
|
|
|
|
;SKPINC
|
|
TTCL13: CALL CHKCHR ;IS ANYTHING READY ?
|
|
POPJ P, ;NO
|
|
MOVEM T1,(AC2) ;GIVER USER CHARACTER
|
|
AOS (P)
|
|
POPJ P,
|
|
|
|
;SKPINL
|
|
TTCL14: JRST TTCL13
|
|
|
|
;IONEOU
|
|
TTCL15: MOVE T1,(AC2)
|
|
JRST SCNTYP
|
|
|
|
;HERE TO TYPE AN INLINE MESSAGE
|
|
INLMES: HRLI T1,(POINT 7,0)
|
|
HLLM T1,(P) ;MAKE A BYTE POINTER
|
|
INLMS3: ILDB T1,(P)
|
|
JUMPE T1,RSKP ;SKIP NULL CHAR AND DONE
|
|
CALL SCNTYP
|
|
JRST INLMS3 ;FINISH REST OF MESSAGE
|
|
|
|
;HERE TO TYPE A CHARACTER
|
|
SCNTYP: SKIPE CNTLOF ;DID USER FLUSH OUTPUT ?
|
|
POPJ P,
|
|
ANDI T1,177 ;STRIP PARITY BIT
|
|
CAIN T1,15 ;WAS THAT A CARRIAGE RETURN ?
|
|
SETZM COLUMN ;BACK TO LH MARGIN
|
|
AOS T2,COLUMN ;ADVANCE COLUMN POINTER
|
|
CAIE T1,177 ;RUBOUTS DON'T PRINT
|
|
CAIGE T1,40 ;IS THIS A PRINTING CHARACTER ?
|
|
SOS T2,COLUMN ;NOT PRINTING SO BACKUP SOLUMN COUNTER
|
|
CAIN T1,11 ;WAS THAT A HT ?
|
|
JRST [ ADDI T2,^D8
|
|
ANDI T2,-10
|
|
MOVEM T2,COLUMN
|
|
JRST .+1 ]
|
|
CAMLE T2,WIDTH ;IS THAT IN RANGE ?
|
|
JRST [ PUSH P,T1 ;SAVE CHAR TO TYPE
|
|
CALL INLMES
|
|
BYTE (7)15,12,0
|
|
POP P,T1
|
|
JRST SCNTYP ]
|
|
CAIGE T1,40 ;SHOULD WE PAD THIS CHARACTER ?
|
|
JRST [ CALL .+1 ;PRINT THE CHARACTER THEN RETURN HERE
|
|
MOVEI T1,377 ;PAD CHAR
|
|
JRST .+1 ]
|
|
SKIPE FEWOUT ;CAN WE TYPE NEXT CHAR ?
|
|
JRST .-1 ;WAIT UNTIL WE CAN
|
|
ANDI T1,377 ;STRIP EXTRA BITS
|
|
IORI T1,1B27 ;FLAG THIS IS A CTY CHAR
|
|
MOVEM T1,FEWOUT ;PUT IT FOR 8080 TO FIND
|
|
WRAPR 1B23!1B25!APRLVL ;INTERRUPT THE 8080
|
|
POPJ P,
|
|
CNTLOF: Z ;CONTROL O FLAG
|
|
RCVTKR: Z ;TAKER FOR RECEIVE CHARACTERS
|
|
RCVPTR: Z ;PUTTER FOR RECEIVE CHARACTERS
|
|
RCVBUF: BLOCK 10 ;BUFFER FOR RECEIVE CHARACTERS
|
|
|
|
COLUMN: Z ;COLUMN WE ARE ON
|
|
WIDTH: ^D80 ;MAXIMUM NUMBER OF COLUMNS FOR OUTPUT
|
|
|
|
;HERE TO TRY TO GET A CHARACTER FROM THE CTY
|
|
CHKCHR: SETZM CNTLOF ;CLEAR CONTROL O FLAG
|
|
SETZ T1,
|
|
EXCH T1,SAVCHR# ;GET SAVED CHAR
|
|
JUMPN T1,CKCHR5
|
|
MOVE T2,RCVTKR ;GET RECEIVE CHAR TAKER
|
|
CAMN T2,RCVPTR ;ANY CHARACTERS
|
|
POPJ P,
|
|
ILDB T1,T2 ;GET NEXT CHARACTER
|
|
CAMN T2,[POINT 8,RCVBUF+7,31] ;WAS THAT LAST IN BUFFER ?
|
|
MOVE T2,[POINT 8,RCVBUF] ;TIME TO WRAP BUFFER AROUND
|
|
MOVEM T2,RCVTKR
|
|
CKCHR5: ANDI T1,377 ;STRIP EXTRA BITS
|
|
MOVE T2,T1 ;COPY CHAR
|
|
ANDI T2,177 ;STRIP PARITY BIT
|
|
TXNN FLG,F.RUNF ;RUNNING SIMULATION ?
|
|
CAIE T2,3 ;WAS THAT A CONTROL C ?
|
|
CAIA
|
|
JRST DDT11 ;YES SO BEGIN AGAIN
|
|
PUSH P,T2 ;SAVE CHARACTER FOR RETURN
|
|
CAIN T2,15 ;WAS THAT A CR ?
|
|
JRST [ MOVEI T2,12 ;LF
|
|
MOVEM T2,SAVCHR#
|
|
JRST .+1]
|
|
CAIN T2,33 ;WAS THAT AN ALTMODE ?
|
|
MOVEI T1,"$" ;ECHO AS THIS
|
|
TXNN FLG,F.RUNF ;IF SIMULATING DON'T ECHO
|
|
CALL SCNTYP ;ECHO THE CHARACTER
|
|
POP P,T1 ;GET CHAR OFF STACK
|
|
AOS (P)
|
|
POPJ P,
|
|
|
|
;HERE ON AN INIT UUO
|
|
UUINIT: HRRZ AC2,-1(P) ;GET RETURN ADDRESS
|
|
SOS AC2
|
|
MOVEI T1,2
|
|
ADDM T1,-1(P) ;SO RETURN WORKS
|
|
|
|
;HERE ON AN OPEN UUO
|
|
UUOPEN: CAIG AC2,16 ;WAS ARGUMENT IN REGISTERS ?
|
|
ADDI AC2,UUOACS ;YES SO RELOCATE
|
|
HRRZ T1,AC3 ;GET REGISTER ARGUMENT = CHNL
|
|
LSH T1,^D23 ;POSITION IN LH
|
|
TLO T1,20 ;FLAG DEVICE OPENED
|
|
HRR T1,(AC2) ;GET STATUS
|
|
MOVS T2,1(AC2) ;GET DEVICE NAME TO OPEN
|
|
CAIN T2,'TTY'
|
|
JRST OPNTTY
|
|
POPJ P, ; *** FOR NOW, DUE TO SOME BUGS ***
|
|
MOVEM T1,DSKDDB ;SAVE STATUS
|
|
MOVSM T2,DSKSTR ;SAVE NAME OF DISK STRUCTURE
|
|
SETZM RJUNIT ;LOOK AT FIRST UNIT FOR STRUCTURE NAME
|
|
SETZM RJBLCK ;BLOCK TO READ
|
|
DSKOP2: CALL RJREAD ;TRY TO READ THE BLOCK
|
|
JRST [ AOS T1,RJUNIT
|
|
CAIE T1,^D8 ;TOO LARGE ?
|
|
JRST DSKOP2
|
|
POPJ P, ]
|
|
POPJ P,
|
|
|
|
OPNTTY: MOVEM T1,TTYDDB ;SAVE DEVICE STATUS
|
|
AOS (P)
|
|
POPJ P,
|
|
|
|
;DEVICE BLOCKS
|
|
TTYDDB: Z ;CHNL,,DEVICE STATUS SET BY USER
|
|
EXP DSKDDB
|
|
|
|
DSKDDB: Z ;CHNL,,DEVICE STATUS SET BY USER
|
|
Z
|
|
DSKSTR: Z ;STRUCTURE
|
|
DSKFIL: Z ;FILE NAME
|
|
DSKEXT: Z ;FILE EXT
|
|
|
|
;HERE ON A SETSTS UUO
|
|
USTSTS: CALL UFNDDB
|
|
POPJ P,
|
|
HRRM T1,0(AC4)
|
|
POPJ P,
|
|
|
|
;HERE ON A CLOSE UUO
|
|
UCLOSE: POPJ P,
|
|
|
|
;HERE ON A RELEASE UUO
|
|
URLEAS: CALL UFNDDB ;FIND WHICH DDB
|
|
POPJ P,
|
|
SETZM 0(AC4)
|
|
POPJ P,
|
|
|
|
UFNDDB: MOVEI AC4,TTYDDB
|
|
UFNDD0: SKIPN T1,0(AC4) ;GET STATUS
|
|
JRST UFNDD7
|
|
LDB T1,[POINT 4,0(AC4),12]
|
|
CAMN T1,AC3
|
|
JRST RSKP
|
|
UFNDD7: SKIPE AC4,1(AC4) ;GET NEXT DDB ADR
|
|
JRST UFNDD0
|
|
POPJ P,
|
|
|
|
;HERE TO HANDLE AN RJPO4
|
|
|
|
;HERE TO READ A BLOCK FROM AN RJP04
|
|
; CALL SETUP RJUNIT WITH UNIT NUMBER
|
|
; SETUP RJBLCK TO BE BLOCK NUMBER TO READ
|
|
; CALL RJREAD
|
|
; ERROR RETURN
|
|
; WIN RETURN
|
|
RJREAD: HLLZ MA,UBACTL ;ADD UNIBUS UNIT
|
|
RDIO T1,UBAMAP+77(MA) ;GET CURRENT MAP FOR PAGE
|
|
PUSH P,T1 ;SAVE STATUS
|
|
HRRZ T1,EPTBLK ;GET ADR OF EPT
|
|
MOVEI T1,DSKPAG(T1) ;MAKE ADR OF DISK PAGE
|
|
LSH T1,-^D9 ;MAKE PAGE NUMBER
|
|
TRO T1,UB.VLD!UB.FST ;STATUS
|
|
WRIO T1,UBAMAP+77(MA) ;MAP THE DISK PAGE
|
|
MOVEI T1,000040 ;RESET
|
|
WRIO T1,RPCS2(MA) ;CLEAR OUT THE CONTROLLER
|
|
MOVE T1,RJUNIT ;UNIT TO READ FROM
|
|
WRIO T1,RPCS2(MA) ;SELECT UNIT
|
|
MOVEI T1,21 ;PRESELECT
|
|
WRIO T1,RPCS1(MA) ;SELECT OUR UNIT
|
|
MOVEI T1,174000 ;ADR TO TRANSFER TO
|
|
WRIO T1,RPBA(MA) ;SET ADDRESS
|
|
MOVEI T1,-2000 ;NUMBER OF PDP11 WORDS TO TRANSFER
|
|
WRIO T1,RPWC(MA)
|
|
MOVEI T1,471 ;READ DATA AND MEMORY EXTENSION
|
|
WRIO T1,RPCS1(MA) ;START THE TRANSFER
|
|
CALL RJRDWT ;WAIT FOR TRANSFER TO COMPLETE
|
|
JRST RJRD.9
|
|
RJRD.9: POP P,T2 ;GET OLD UBAMAP STATUS
|
|
LDB T1,[POINT 11,T2,26] ;GET PAGE NUMBER
|
|
LDB T2,[POINT 4,T2,8] ;GET STATUS BITS
|
|
DPB T2,[POINT 4,T1,21] ;PUT INTO WORD
|
|
WRIO T1,UBAMAP+77(MA) ;RESTORE MAP FOR THAT PAGE
|
|
POPJ P,
|
|
;HERE TO WAIT FOR DISK OPERATION TO COMPLETE
|
|
RJRDWT: MOVE T4,UPTIME ;HOW LOG WE HAVE BEEN UP
|
|
ADDI T4,^D1000 ;ADD A SECOND
|
|
RJRDW4: CAMG T4,UPTIME ;HAVE WE WAITED TOO LONG ?
|
|
POPJ P, ;MUST BE DEAD
|
|
RJRD.5: RDIO T1,RPCS1(MA) ;GET DRIVE STATUS
|
|
TRNN T1,160200 ;FLAG COME UP ?
|
|
JRST RJRDW4 ;NOT YET
|
|
TRNN T1,060000 ;ERROR FLAG UP ?
|
|
AOS (P) ;NO, SKIP RETURN
|
|
POPJ P, ;YES LOSE
|
|
|
|
|
|
RJUNIT: Z ;UNIT TO READ
|
|
RJBLCK: Z ;BLOCK TO READ
|
|
|
|
P.PLVL: POINT 3,PS,30 ;BYTE POINTER TO GET PROCESSOR LEVEL
|
|
|
|
;FOLLOWING ARE SIMULATOR REGISTERS WHEN NOT SIMULATING
|
|
SIMREG: EXP 0 ;R0
|
|
EXP 0 ;R1
|
|
EXP 0 ;R2
|
|
EXP 0 ;R3
|
|
EXP 0 ;R4
|
|
EXP 0 ;R5
|
|
EXP 0 ;R6
|
|
EXP 0 ;R7
|
|
|
|
EPTBLK: Z ;ADR OF EXEC STORAGE
|
|
|
|
UBACTL: 1,,0 ;UBA CONTROLLER NUMBER
|
|
|
|
END
|