1
0
mirror of https://github.com/PDP-10/its.git synced 2026-03-03 02:08:00 +00:00
Files
PDP-10.its/src/clib/c10int.cmid
2018-10-23 19:37:16 +02:00

407 lines
7.5 KiB
Plaintext
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.
;
; 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