mirror of
https://github.com/PDP-10/its.git
synced 2026-03-03 02:08:00 +00:00
407 lines
7.5 KiB
Plaintext
407 lines
7.5 KiB
Plaintext
;
|
||
; INTRUP - C INTERRUPT SYSTEM
|
||
;
|
||
; This file is ITS dependent.
|
||
;
|
||
|
||
TITLE INTRUP
|
||
.INSRT NC
|
||
.INSRT NM
|
||
|
||
.GLOBAL UUOH,USAVEA,USAVEB,USAVEC,USAVED
|
||
.GLOBAL PDLTOP
|
||
|
||
; SOME C INTERRUPT NUMBERS
|
||
|
||
CH0I==16. ; CHANNEL 0 INTERRUPT
|
||
IN0I==32. ; INFERIOR 0 INTERRUPT
|
||
MPV==1. ; MPV INTERRUPT
|
||
CTRSI==41. ; CONTROL-S INTERRUPT
|
||
CTRGI==42. ; CONTROL-G INTERRUPT
|
||
NINT==42. ; NUMBER OF INTERRUPTS
|
||
|
||
; TAB1 - CONVERTS FIRST WORD INTERRUPTS TO C INTERRUPT NUMBER
|
||
|
||
.PDATA
|
||
MDATA TAB1
|
||
0 ? 0 ? 10. ? 0 ? 0 ? 0
|
||
0 ? 0 ? 0 ? 15. ? 7. ? 6.
|
||
5. ? 0 ? 0 ? 0 ? 0 ? 0
|
||
13. ? 0 ? 0 ? 4. ? 1. ? 9.
|
||
0 ? 0 ? 0 ? 2. ? 0 ? 8.
|
||
3. ? 0 ? 14. ? 0 ? 0 ? 12.
|
||
|
||
; TAB2 - CONTAINS HANDLERS FOR AND INFORMATION ABOUT C INTERRUPTS
|
||
|
||
; BITS 0-17 HANDLER (0 => DEFAULT, 1 => IGNORE, OTHER => ROUTINE ADDR)
|
||
; BITS 18-23 BIT NUMBER IN ITS MASK WORD
|
||
; BIT 24 ITS MASK WORD NUMBER
|
||
|
||
.IDATA
|
||
MDATA TAB2
|
||
0 ; NOT USED
|
||
15,,0 ; MPV
|
||
10,,0 ; IOC
|
||
5,,0 ; ILOPR
|
||
16,,0 ; MAR
|
||
27,,0 ; UTRAP
|
||
30,,0 ; PURE
|
||
31,,0 ; WIRO
|
||
|
||
6,,0 ; SYSDOWN
|
||
14,,0 ; CLOCK
|
||
41,,0 ; TIMER
|
||
0 ; PDLOV (NOT USED)
|
||
0,,0 ; TTYI
|
||
21,,0 ; CLI
|
||
3,,0 ; OVERFLOW
|
||
32,,0 ; FLOATING OVERFLOW
|
||
|
||
100,,0 ; CHANNEL 0
|
||
101,,0 ; CHANNEL 1
|
||
102,,0 ; CHANNEL 2
|
||
103,,0 ; CHANNEL 3
|
||
104,,0 ; CHANNEL 4
|
||
105,,0 ; CHANNEL 5
|
||
106,,0 ; CHANNEL 6
|
||
107,,0 ; CHANNEL 7
|
||
|
||
110,,0 ; CHANNEL 10
|
||
111,,0 ; CHANNEL 11
|
||
112,,0 ; CHANNEL 12
|
||
113,,0 ; CHANNEL 13
|
||
114,,0 ; CHANNEL 14
|
||
115,,0 ; CHANNEL 15
|
||
116,,0 ; CHANNEL 16
|
||
117,,0 ; CHANNEL 17
|
||
|
||
122,,0 ; INFERIOR 0
|
||
123,,0 ; INFERIOR 1
|
||
124,,0 ; INFERIOR 2
|
||
125,,0 ; INFERIOR 3
|
||
126,,0 ; INFERIOR 4
|
||
127,,0 ; INFERIOR 5
|
||
130,,0 ; INFERIOR 6
|
||
131,,0 ; INFERIOR 7
|
||
|
||
0 ; NOT USED
|
||
0 ; CONTROL-S INTERRUPT
|
||
0 ; CONTROL-G INTERRUPT
|
||
|
||
|
||
;
|
||
; ON - SPECIFY AN ACTION FOR A C INTERRUPT
|
||
;
|
||
|
||
.CODE
|
||
CENTRY ON,[INTNO,NEWH]
|
||
|
||
MOVE B,INTNO ; INTERRUPT #
|
||
JUMPLE B,ON2 ; BAD #
|
||
CAILE B,NINT ; NINT = HIGHEST VALID #
|
||
GO ON2 ; BAD #
|
||
HRRZ A,NEWH ; NEW HANDLER
|
||
CAIL B,CTRSI
|
||
GO ON1 ; SOFTWARE INTERRUPT
|
||
|
||
LDB D,[220600,,TAB2(B)] ; BIT #
|
||
MOVEI C,1
|
||
LSH C,(D) ; MASK
|
||
LDB D,[300100,,TAB2(B)] ; WORD #
|
||
|
||
CAIN B,CTRGI
|
||
JUMPE A,TURNON
|
||
JUMPE A,TURNOF
|
||
CAIE A,1
|
||
GO TURNON
|
||
CAIGE B,8.
|
||
GO TURNON
|
||
|
||
TURNOF: .SUSET [.SAMASK,,C ? .SAMSK2,,C](D)
|
||
GO ON1
|
||
|
||
TURNON: .SUSET [.SIMASK,,C ? .SIMSK2,,C](D)
|
||
ON1: HRRZ C,TAB2(B) ; OLD HANDLER
|
||
HRRM A,TAB2(B) ; NEW HANDLER
|
||
MOVE A,C ; RETURN OLD HANDLER
|
||
ONRET: RETURN
|
||
|
||
ON2: CROAK ON: INVALID INTERRUPT NUMBER
|
||
MOVEI A,1
|
||
GO ONRET
|
||
|
||
|
||
;
|
||
; SIGNAL - SIGNAL A C INTERRUPT
|
||
;
|
||
|
||
CENTRY SIGNAL,[SIGNO]
|
||
|
||
MOVE A,SIGNO ; INTERRUPT #
|
||
JUMPLE A,S3 ; BAD #
|
||
CAILE A,NINT ; NINT = HIGHEST VALID #
|
||
GO S3 ; BAD #
|
||
HRRZ B,TAB2(A) ; HANDLER
|
||
CAIN B,1
|
||
GO SIGRET ; 1 => IGNORE
|
||
JUMPN B,S1 ; SPECIFIED HANDLER
|
||
CAIN A,CTRGI
|
||
GO S4 ; HANDLE ^G INTERRUPT
|
||
GO SIGRET ; OTHERWISE IGNORE
|
||
|
||
S1: CAIGE A,CH0I
|
||
GO S2 ; NO ARG
|
||
CAILE A,IN0I+7
|
||
GO S2 ; NO ARG
|
||
CAIGE A,IN0I
|
||
SUBI A,CH0I ; ARG IS CHANNEL #
|
||
CAIL A,IN0I
|
||
SUBI A,IN0I ; ARG IS INFERIOR #
|
||
VCALL (B),[A]
|
||
GO SIGRET
|
||
|
||
S2: CAIN A,CTRSI
|
||
CL CTRSIH ; SPECIAL ^S ACTION
|
||
CAIN A,CTRGI
|
||
CL CTRGIH ; SPECIAL ^G ACTION
|
||
VCALL (B)
|
||
GO SIGRET
|
||
|
||
S3: CROAK INVALID INTERRUPT SIGNALLED
|
||
GO SIGRET
|
||
|
||
S4: CL CTRGIH
|
||
CALL STKDMP
|
||
CROAK -- ^G --
|
||
SIGRET: RETURN
|
||
|
||
; SPECIAL HANDLER FOR CONTROL-S INTERRUPT
|
||
|
||
IENTRY CTRSIH
|
||
|
||
PPUSH A
|
||
PPUSH B
|
||
CTRS1: SETO B,
|
||
SYSCAL IOT,[5000,,%TIACT+%TIINT+%TINWT ? TYICHN" ? 2000,,B]
|
||
JUMPLE B,CTRS2
|
||
CAIE B,^S
|
||
GO CTRS1
|
||
CTRS2: PPOP B
|
||
PPOP A
|
||
RTN
|
||
|
||
; SPECIAL HANDLER FOR CONTROL-G INTERRUPT
|
||
|
||
IENTRY CTRGIH
|
||
|
||
PPUSH A
|
||
PPUSH B
|
||
CTRG1: SETO B,
|
||
SYSCAL IOT,[5000,,%TIACT+%TIINT+%TINWT ? TYICHN ? 2000,,B]
|
||
JUMPLE B,CTRG2
|
||
CAIE A,^G
|
||
GO CTRG1
|
||
CTRG2: PPOP B
|
||
PPOP A
|
||
RTN
|
||
|
||
|
||
;
|
||
; DISMISS - DISMISS INTERRUPT AND RETURN TO CALLER
|
||
;
|
||
|
||
MENTRY DISMISS
|
||
SYSCAL DISMIS,[5000,,T%CTL ? INTPTR ? 1000,,.+2]
|
||
RETURN
|
||
|
||
;
|
||
; GETPC - GET INTERRUPTED PC
|
||
;
|
||
|
||
CENTRY GETPC
|
||
MOVE D,INTPTR ; TOP OF INTERRUPT STACK
|
||
MOVEI D,-T%SIZ+1(D) ; BOTTOM OF FRAME
|
||
HRRZ A,T%OPC(D)
|
||
RETURN
|
||
|
||
;
|
||
; SETPC - SET INTERRUPTED PC
|
||
;
|
||
|
||
CENTRY SETPC,[PC]
|
||
MOVE D,INTPTR ; TOP OF INTERRUPT STACK
|
||
MOVEI D,-T%SIZ+1(D) ; BOTTOM OF FRAME
|
||
MOVE A,PC
|
||
HRRM A,T%OPC(D)
|
||
RETURN
|
||
|
||
;
|
||
; INTERRUPT HANDLING SPECIFICATONS
|
||
;
|
||
|
||
T%NRG==4 ; NUMBER OF REGISTERS PUSHED
|
||
|
||
T%IW1==0 ; OFFSET OF 1ST INTERRUPT WORD
|
||
T%IW2==1 ; OFFSET OF 2ND INTERRUPT WORD
|
||
T%DF1==2 ; OFFSET OF 1ST OLD DEFER WORD
|
||
T%DF2==3 ; OFFSET OF 2ND OLD DEFER WORD
|
||
T%OPC==4 ; OFFSET OF OLD PC
|
||
T%REG==5 ; OFFSET OF FIRST SAVED REGISTER
|
||
T%SIZ==T%REG+T%NRG ; SIZE OF INTERRUPT FRAME
|
||
T%CTL==A*100+T%NRG ; CONTROL ARG FOR PUSHING REGS
|
||
|
||
MDATA TSINT
|
||
T%CTL,,INTPTR ; PUSH REGISTERS ON INTERRUPT STACK
|
||
%PIPDL ? 0 ; HANDLE PDL-OVERFLOW
|
||
-1 ? -1 ; DEFER ALL INTERRUPTS
|
||
PDLOVH ; PDL-OVERFLOW HANDLER
|
||
%PIMPV ? 0 ; HANDLE MPV
|
||
#%PIPDL ? -1 ; DEFER ALL BUT PDL-OVERFLOW
|
||
MPVH ; MPV HANDLER
|
||
#<%PIMPV+%PIPDL> ? 0 ; HANDLE ALL OTHER FIRST WORDERS
|
||
#<%PIMPV+%PIPDL> ? -1 ; DEFER ALL BUT MPV AND PDLOV
|
||
TSINT1 ; INTERRUPT HANDLER
|
||
0 ? -1 ; HANDLE ALL SECOND WORDERS
|
||
#<%PIMPV+%PIPDL> ? -1 ; DEFER ALL BUT MPV AND PDLOV
|
||
TSINT2 ; INTERRUPT HANDLER
|
||
TSINTL"==21. ; .-TSINT DOESN'T WORK DUE TO MIDAS BUG
|
||
|
||
;
|
||
; INTERRUPT STACK
|
||
;
|
||
|
||
INTPSZ==2*TSINTL ; SIZE OF INTERRUPT STACK
|
||
|
||
.IDATA
|
||
MDATA INTPTR
|
||
-INTPSZ,,INTPDL
|
||
MDATA INTPDL
|
||
BLOCK INTPSZ-1
|
||
-1 ; THIS PAGE MUST NOT BE DELETED!
|
||
.CODE
|
||
|
||
;
|
||
; MPV HANDLER
|
||
;
|
||
|
||
IENTRY MPVH
|
||
|
||
.SUSET [.RMPVA,,B] ; GET LOSING ADDRESS
|
||
; NOTE THAT ON KA-10 THIS ADDRESS
|
||
; IS ROUNDED DOWN TO FIRST WORD
|
||
; OF PAGE
|
||
TRZ B,1777 ; ROUND DOWN ANYWAY (FOR KL-10)
|
||
|
||
CAMGE B,SEG0LO" ; MAYBE IN SEGMENT 0?
|
||
GO MPV$0 ; NO
|
||
CAMG B,SEG0HI" ; IN SEGMENT 0?
|
||
GO MPV$1 ; YES
|
||
|
||
MPV$0: CAMGE B,SEG1LO" ; MAYBE IN SEGMENT 1?
|
||
GO TSINT1 ; NO
|
||
CAMLE B,SEG1HI" ; IN SEGMENT 1?
|
||
GO TSINT1 ; NO
|
||
|
||
; HERE IF ADDRESS IS IN SEGMENT 1
|
||
|
||
MOVE C,PDLTOP ; TOP END OF STACK
|
||
SUBI C,2000
|
||
TRZ C,1777 ; LAST FULL PAGE OF STACK
|
||
CAME B,C ; REFERENCE TO LAST PAGE OF STACK?
|
||
GO MPV$1 ; NO
|
||
CROAK IMMINENT STACK OVERFLOW
|
||
|
||
MPV$1: LSH B,-10. ; PAGE NUMBER
|
||
SYSCAL CORTYP,[B ? SETZM C] ; GET PAGE INFO
|
||
JUMPN C,TSINT1 ; PAGE EXISTS => MPV ON ANOTHER JOB
|
||
|
||
MPV$2: SYSCAL CORBLK,[1000,,%CBNDW ? 1000,,-1 ? B ? 1000,,%JSNEW],MPVLOS
|
||
GO INTDIS
|
||
MPVLOS: CROAK UNABLE TO GET ZERO PAGE
|
||
GO MPV$2
|
||
|
||
;
|
||
; HANDLER FOR FIRST WORD INTERRUPTS
|
||
;
|
||
|
||
IENTRY TSINT1
|
||
|
||
MOVE D,INTPTR ; TOP OF INTERRUPT STACK
|
||
MOVEI D,-T%SIZ+1(D) ; BOTTOM OF FRAME
|
||
MOVE A,T%IW1(D) ; GET INTERRUPT WORD
|
||
JFFO A,.+2 ; GET FIRST BIT
|
||
GO INTDIS ; NONE (?)
|
||
MOVE A,TAB1(B) ; C INTERRUPT NUMBER
|
||
JUMPE A,IGNORE ; NOT HANDLED
|
||
HRRZ B,TAB2(A) ; HANDLER
|
||
CAIN B,1
|
||
GO IGNORE ; 1 MEANS IGNORE
|
||
JUMPN B,TS1 ; HANDLER SPECIFIED
|
||
CAIN A,MPV
|
||
GO FATMPV
|
||
CAIN A,CTRGI
|
||
GO TS1 ; DEFAULT IS NOT TO IGNORE
|
||
IGNORE: AOS T%OPC(D) ; OTHERWISE - THE DEFAULT
|
||
GO INTDIS ; IS TO CONTINUE WITH THE
|
||
; NEXT INSTRUCTION
|
||
|
||
; HERE IF FATAL MPV OCCURS
|
||
|
||
FATMPV: MOVEI A,%PIMPV
|
||
IORM A,T%DF1(D) ; MAKE MPV DEFFERED
|
||
GO INTDIS ; NOW DISMISS - WILL MAKE FATAL
|
||
|
||
;
|
||
; SECOND WORD INTERRUPT HANDLER
|
||
;
|
||
|
||
IENTRY TSINT2
|
||
|
||
MOVE D,INTPTR ; TOP OF INTERRUPT STACK
|
||
MOVEI D,-T%SIZ+1(D) ; BOTTOM OF FRAME
|
||
MOVE A,T%IW2(D) ; GET INTERRUPT WORD
|
||
JFFO A,.+2
|
||
GO INTDIS
|
||
CAILE B,17.
|
||
GO CHANI
|
||
CAIGE B,10.
|
||
GO INTDIS
|
||
MOVN A,B
|
||
ADDI A,17.+IN0I
|
||
GO TS1
|
||
|
||
CHANI: CAIGE B,19.
|
||
GO INTDIS
|
||
MOVN A,B
|
||
ADDI A,35.+CH0I
|
||
GO TS1
|
||
|
||
|
||
;
|
||
; HERE TO SIGNAL SOMETHING WITH ARG IN A
|
||
;
|
||
|
||
DEFINE PUSHL LIST
|
||
IRP X,,[LIST]
|
||
PPUSH X
|
||
TERMIN!TERMIN
|
||
|
||
DEFINE POPL LIST
|
||
IRP X,,[LIST]
|
||
PPOP X
|
||
TERMIN!TERMIN
|
||
|
||
TS1: ADDI P,20 ; IN CASE EPILOG INTERRUPTED
|
||
PUSHL [0,5,6,7,10,11,12,13,14,15,16]
|
||
PUSHL [40,USAVEA,USAVEB,USAVEC,USAVED,UUOH]
|
||
CALL SIGNAL,[A]
|
||
POPL [UUOH,USAVED,USAVEC,USAVEB,USAVEA,40]
|
||
POPL [16,15,14,13,12,11,10,7,6,5,0]
|
||
SUBI P,20
|
||
|
||
PDLOVH:
|
||
INTDIS: SYSCAL DISMIS,[5000,,T%CTL ? INTPTR]
|
||
|
||
IENTRY ETSINT
|
||
END
|