perm filename SAIIRP.FAI[S,AIL] blob
sn#191932 filedate 1975-12-15 generic text, type T, neo UTF8
SEARCH HDRFIL
COMPIL(IRP,,,,,,DUMMYFORGDSCISS)
NOTENX <
DEFINE IENS1 < INTTBL,INTMOD,ENABLE,DISABLE,INTMAP>
DEFINE IEXT1 < GOGTAB,INTRPT,X22,CORGET >
IFN APRISW <
DEFINE XJBCNI <JOBCNI>
DEFINE XJBTPC <JOBTPC>
DEFINE XJBAPR <JOBAPR>
DEFINE IEXT5 <JOBCNI,JOBTPC,JOBAPR,XJBENB,APRACS>
IFN ALWAYS <
EXTERN JOBCNI,JOBTPC,JOBAPR ;THESE ARE ALWAYS EXTERNAL
>;IFN ALWAYS
>;IFN APRISW
IFE APRISW <
DEFINE IEXT5 <XJBCNI,XJBTPC,XJBAPR,JOBINT>
IFN ALWAYS <
EXTERNAL JOBINT ;THIS FELLOW IS ALWAYS EXTERNAL
>;IFN ALWAYS
>;IFE APRISW
COMPXX(IRP,< IENS1 >,< IEXT1,IEXT5 >
,<INTERRUPT STUFF>,,HIIFPOSSIB)
BEGIN IRPPKG
INTDBG←←0
IFE APRISW <
IFE INTDBG <
OPDEF DISMIS [ CALLI 400024]
>;IFE INTDBG
IFN INTDBG <
DEFINE DISMIS < JRST DSMMSR >
DSMMSR:
HRLZI P,INACS
BLT P,P
JRST @JOBTPC
INACS: BLOCK 20
>;IFN ITDBG
OPDEF INTORM [ CALLI 400026]
OPDEF INTACM [ CALLI 400027]
OPDEF INTENB [ CALLI 400025]
>;IFE APRISW
IFN APRISW <
OPDEF APRENB [ CALLI 16]
DEFINE DISMIS < JRST DSMSSR >
DSMSSR: HRLZI 17,APRACS
BLT 17,17 ;BLT BACK ALL ACS
JRST @XJBTPC
>;IFN APRISW
HERE(INTTBL)
MOVE USER,GOGTAB ;
INTTB1: MOVEI C,=110
ADD C,-1(P)
PUSHJ P,CORGET
ERR <NOT ENOUGH SPACE FOR INTSET>
SKIPN D,DISPAT(USER) ;ALREADY HABE ONE?
JRST INTTB2 ;NO
MOVSS D
HRR D,B ;D ← OLD,,NEW
BLT D,=71(B) ;COPY OLD DISPAT TABLE
JRST INTTB3
INTTB2: SETZM (B)
HRL A,B
HRRI A,1(B)
ADDI C,-1(B)
BLT A,(C)
INTTB3: HRLI B,10
MOVEM B,DISPAT(USER)
ADDI B,=36
MOVEM B,DFRINF(USER)
ADDI B,=36
HRRZM B,INTQWB(USER)
HRRZM B,INTQWP(USER)
HRRZM B,INTQRP(USER)
ADD B,-1(P)
HRRZM B,INTQWT(USER)
HRLI B,-20
MOVEM B,IPDP(USER)
ADD B,[XWD -10,20]
MOVEM B,ISPDP(USER)
SUB P,X22
JRST @2(P)
IFN INTDBG,<
INTAPR: MOVEM P,INACS+17
MOVEI P,INACS
BLT P,INACS+16
>;IFN INTDBG
HERE(INTMOD)
IFN APRISW <
MOVEM 17,APRACS+17
MOVEI 17,APRACS
BLT 17,APRACS+16 ;SAVE THE ACS
>;IFN APRISW
MOVE USER,GOGTAB
MOVE 7,XJBCNI ;PICK UP THE BITS
IFN APRISW <
ANDI 7,235110 ;BE SURE LEGIT BITS ONLY
>;IFN APRISW
MOVE P,IPDP(USER) ;A PDL FOR THIS
MOVE SP,ISPDP(USER) ;A STRING PDL
DSPIT: JFFO 7,DODISP ;DISPATCH INDEX
ERR <DRYROT: INTMOD>
DODISP:
SKIPN 7,@DISPAT(USER) ;GO DISPATCH
DISMIS ;DISMISS
PUSHJ P,(7) ;
DISMIS
IFE APRISW <
HERE(ENABLE)
SKIPA B,[ INTORM A, ]
HERE(DISABLE)
MOVE B,[ INTACM A, ]
MOVN C,-1(P)
HRLZI A,400000
LSH A,(C)
XCT B
SUB P,X22
JRST @2(P)
>;IFE APRISW
IFN APRISW <
HERE(ENABLE)
SKIPA B,[OR A,XJBENB]
HERE(DISABLE)
MOVE B,[ANDCA A,XJBENB]
MOVN C,-1(P) ;
HRLZI A,400000
LSH A,(C) ;THE BIT
EXPO <
TRO A,400000 ;REPETITIVE ENABLE (THIS MIGHT GET YOU
>;EXPO
XCT B
MOVEM A,XJBENB ;REMEMBER
APRENB A,
SUB P,X22
JRST @2(P)
>;IFN APRISW
HERE(INTMAP)
IFE APRISW <
MOVEI A,XJBCNI
MOVEM A,JOBINT
>;IFE APRISW
IFE INTDBG,<
MOVEI A,INTMOD
>;IFE INTDBG
IFN INTDBG,<
MOVEI A,INTAPR
>;IFN INTDBG
MOVEM A,XJBAPR
MOVE USER,GOGTAB
SKIPE DISPAT(USER)
JRST .+3
PUSH P,[=128]
PUSHJ P,INTTB1 ;GET MINIMAL TABLES
MOVE 10,-3(P) ;GET INDEX
POP P,-3(P) ;RET ADR
POP P,@DFRINF(USER)
POP P,@DISPAT(USER)
POPJ P,
HERE(IRPSP1)
HERE(IRPSP2)
HERE(IRPSP3)
BEND IRPPKG
>;NOTENX
TENX<
DEFINE IENS1 < INTTBL,PSIL1,PSIL2,PSIL3,ENABLE,DISABLE >
DEFINE IENS2 < ATI,DTI,RTIW,STIW,GTRPW,PSIMAP,INTMAP,PSIDISMS,PSIRUNTM,KPSITIME >
DEFINE IEXT1 < GOGTAB,INTRPT,JMPCHN,PS1CAS,PS2ACS,PS3ACS >
DEFINE IEXT2 < XJBCNI,XJBTPC,X22,X33,X44,CORGET,JOBUUO >
COMPXX(IRP,<IENS1,IENS2>
,<IEXT1,IEXT2>,<INTERRUPT STUFF FOR TENEX>,,HIIFPOSSIB)
BEGIN IRPPKG
HERE(INTTBL)
MOVE USER,GOGTAB ;
INTTB1: MOVEI C,=194
ADD C,-1(P)
PUSHJ P,CORGET
ERR <NOT ENOUGH SPACE FOR INTSET>
SKIPN D,DISPAT(USER) ;ALREADY HABE ONE?
JRST INTTB2 ;NO
MOVSS D
HRR D,B ;D ← OLD,,NEW
BLT D,=71(B) ;COPY OLD DISPAT TABLE
JRST INTTB3
INTTB2: SETZM (B)
HRL A,B
HRRI A,1(B)
ADDI C,-1(B)
BLT A,(C)
INTTB3: HRLI B,10
MOVEM B,DISPAT(USER)
ADDI B,=36
MOVEM B,DFRINF(USER)
ADDI B,=36
MOVEM B,TIMFRK(USER)
ADDI B,=36
HRRZM B,INTQWB(USER)
HRRZM B,INTQWP(USER)
HRRZM B,INTQRP(USER)
ADD B,-1(P)
HRRZM B,INTQWT(USER)
DEFINE XXX $ (LEV) <
MOVEI C,(B)
HRLI C,-20
MOVEM C,IPDP$LEV(USER)
ADDI B,20
MOVEI C,(B)
HRLI C,-10
MOVEM C,ISPDP$LEV(USER)
>
XXX(1)
XXX(2)
XXX(3)
SUB P,X22
JRST @2(P)
DEFINE XXX $ (LEV) <
HERE(PSIL$LEV)
MOVEM 16,PS$LEV$ACS+16 ;SAVE ACS
MOVEI 16,PS$LEV$ACS
BLT 16,PS$LEV$ACS+15
HRRZI 10,-JMPCHN-1(17) ;CHANNEL NUMBER INTO 10
MOVE USER,GOGTAB
MOVE P,IPDP$LEV(USER)
MOVE SP,ISPDP$LEV(USER)
SKIPN 7,@DISPAT(USER)
JRST DIS$LEV
MOVSI A,400000
MOVNI B,(10)
LSH A,(B)
PUSH P,A ;THE CHANNEL AS A BIT
MOVEI 1,400000 ;THIS FORK
JSYS RIR ;READ LEVTAB,CHNTAB
HLRZ 2,2 ;LEVTAB
PUSH P,@LEV-1(2) ;PC WORD FOR THIS LEVEL
PUSH P,JOBUUO ;SAVE JOBUUO
PUSHJ P,(7)
POP P,JOBUUO ;RESTORE JOBUUO
SUB P,X22 ;POINTLESS ACTUALLY
DIS$LEV:HRLZI 17,PS$LEV$ACS
BLT 17,17
JSYS DEBRK
>;END OF MACRO DEFINITION
XXX(1)
XXX(2)
XXX(3)
HERE(ENABLE)
SKIPA C,AIC1
HERE(DISABLE)
MOVE C,DIC1
MOVN A,-1(P) ;NEGATED PSI CHAN
HRLZI B,400000
LSH B,(A) ;GET THE RIGHT BIT
HRRZI A,400000
XCT C
SUB P,X22
JRST @2(P)
AIC1: JSYS AIC ;AVOID A LITERAL
DIC1: JSYS DIC
HERE(ATI)
HRRZ B,-1(P) ;GET THE CODE
JUMPL B,.+2 ;IF NOT (0 LEQ CODE LEQ =35) THEN ERR
CAILE B,=35
ERR <ATI: Terminal code not in range 0 thru 35>
MOVE A,-2(P) ;PSI CHANNEL
JUMPL A,BADCHN
CAILE A,=35
JRST BADCHN
CAIGE A,=24
CAIG A,=5
JRST .+2
BADCHN: ERR <ATI: Terminal interrupt channel not 0-5 or 24-35>
HRL A,B
JSYS ATI
SUB P,X33
JRST @3(P)
HERE(DTI)
HRRZ A,-1(P) ;TERMINAL CODE
JUMPL A,DTIERR
CAILE A,=35
DTIERR: ERR <DTI: Terminal interrupt code not in range>
JSYS DTI
SUB P,X22
JRST @2(P)
HERE(RTIW)
MOVE 1,-3(P)
JSYS RTIW
MOVEM 2,@-2(P)
MOVEM 3,@-1(P)
SUB P,X44
JRST @4(P)
HERE(STIW)
MOVE 1,-3(P)
MOVE 2,-2(P)
MOVE 3,-1(P)
JSYS STIW
SUB P,X44
JRST @4(P)
HERE(GTRPW)
MOVE 1,-2(P)
JSYS GTRPW
MOVEM 2,@-1(P)
SUB P,X33
JRST @3(P) ;CONTENTS OF 1 OK
HERE(PSIMAP)
MOVE USER,GOGTAB
SKIPE DISPAT(USER) ;ARE TABLES SET UP?
JRST .+3
PUSH P,[=128]
PUSHJ P,INTTB1 ;SO SET UP
MOVEI A,400000 ;THIS FORK
JSYS RIR ;READ ADDRESS
JUMPN 2,.+2
ERR <PSIMAP: DRYROT>
JSYS EIR ;TURN ON PSI SYSTEM
SKIPL 10,-4(P) ;CHANNEL
CAILE 10,=35 ;CHECK RANGE
ERR <PSIMAP: Channel number not between 0 and 35>
POP P,-4(P) ;RETURN ADDRESS
POP P,D ;LEVEL
CAIL D,1
CAILE D,3
ERR <PSIMAP: Level not between 1 and 3>
POP P,@DFRINF(USER) ;INFORMATION ABOUT DEFERRED INTERRUPT -- CHANNEL IN 10
POP P,@DISPAT(USER) ;DISPATCH ADDRESS -- CHANNEL IN 10
ADDI 2,(10) ;POSITION IN TENEX CHNTBL
ADDI 10,JMPCHN ;ADDRESS TO JMP TO FROM CHNTAB
HRLI A,(D) ;XWD LEVEL, ADDRESS
HRRI A,(10)
MOVEM A,(2) ;PUT INTO TENEX CHNTAB
MOVE A,LEVJMP-1(D) ;JUMP TO CORRECT LEVEL
MOVEM A,(10)
POPJ P, ;RETURN -- STACK IS OK
LEVJMP: JSA 17,PS1ACS+17
JSA 17,PS2ACS+17
JSA 17,PS3ACS+17
HERE(INTMAP)
PUSH P,(P) ;RETURN ADDR
MOVEI A,3 ;LEVEL 3
MOVEM A,-1(P) ;MAKE ANOTHER ARGUMENT
JRST PSIMAP ;AND CALL PSIMAP
HERE(PSIDISMS)
BEGIN PSIDISMS
MOVE USER,GOGTAB
SKIPE DISPAT(USER) ;TABLES SET UP?
JRST .+3
PUSH P,[=128] ;DEFAULT DI BUFFER SIZE
PUSHJ P,INTTBL ;INITIALIZE
MOVE 10,-2(P) ;INTERRUPT CHANNEL
SKIPE 1,@TIMFRK(USER) ;GET FORK
JSYS KFORK ;KILL OLD ONE
MOVNI 1,(10) ;CHANNEL NEGATED
MOVSI 2,400000
LSH 2,(1) ;BIT MASK FOR CHANNEL IN 2
MOVE 3,-1(P) ;TIME TO DISMISS
ADD P,[XWD 20,20]
TLNN P,400000 ;OVERFLOW?
ERR <PSITIME: PDL overflow>
HRLI 4,PSTACS ;ADDRESS OF ACS
HRRI 4,-17(P) ;STACK ADDRESS
BLT 4,(P) ;ONTO STACK
MOVEM 3,-5(P) ;TIME
MOVEM 2,-6(P) ;CHANNEL MASK
MOVE 1,[XWD 260000,3] ;SET ACS, START FORK AT LOCATION 3
MOVEI 2,-17(P) ;POINTER TO ACS
JSYS CFORK ;CREATE FORK
ERR <PSITIME: Cannot CFORK>
MOVEM 1,@TIMFRK(USER) ;SAVE HANDLE
SUB P,[XWD 23,23] ;ADJUST STACK, INCLUDING ARGS
JRST @3(P) ;RETURN
PSTACS: 0 ;0
0 ;1
0 ;2
MOVE 1,12 ;3
JSYS DISMS ;4
MOVEI 1,-1 ;HANDLE TO SUPERIOR FORK
MOVE 2,11 ;CHANNEL MASK
JSYS IIC ;CAUSE AN INTERRUPT
JRST 3 ;LOOP
0 ;11 --- CHANNEL MASK GOES HERE
0 ;12 -- TIME TO DISMISS GOES HERE
BLOCK 5 ;ACS 13-17 HERE
BEND PSIDISMS
HERE(PSIRUNTM)
BEGIN PSIRUNTM
MOVE USER,GOGTAB
SKIPE DISPAT(USER) ;TABLES SET UP?
JRST .+3
PUSH P,[=128] ;DEFAULT DI BUFFER SIZE
PUSHJ P,INTTBL ;INITIALIZE
MOVE 10,-2(P) ;INTERRUPT CHANNEL
SKIPE 1,@TIMFRK(USER) ;GET FORK
JSYS KFORK ;KILL OLD ONE
MOVNI 1,(10) ;CHANNEL NEGATED
MOVSI 2,400000
LSH 2,(1) ;BIT MASK FOR CHANNEL IN 2
CAIG 2,777777 ;IN LEFT HALF
JRST [HLL 2,[HRRZI 2,]
JRST GOTMSK]
HLR 2,2 ;MOVE MASK TO RIGHT HALF
HLL 2,[HRLZI 2,]
GOTMSK: MOVE 3,-1(P) ;TIME TO DISMISS
CAILE 3,777777 ;MAXIMUM IS 777777 MS
MOVEI 3,777777 ;FORCE TO MAXIMUM
ADD P,[XWD 20,20]
TLNN P,400000 ;OVERFLOW?
ERR <PSITIME: PDL overflow>
HRLI 4,PSTACS ;ADDRESS OF ACS
HRRI 4,-17(P) ;STACK ADDRESS
BLT 4,(P) ;ONTO STACK
HRRM 3,-5(P) ;TIME INTERVAL INTO AC 12
HRRM 3,-13(P) ;TIME INTERVAL INTO AC 4
MOVEM 2,-2(P) ;CHANNEL MASK INTO AC 15
PUSH P,3 ;SAVE TIME INTERVAL
MOVEI 1,400000 ;THIS FORK
JSYS RUNTM
POP P,3 ;RESTORE INTERVAL
ADD 1,3 ;NEXT TIME TO INTERRUPT
MOVEM 1,-17(P) ;STORE IN AC 0
MOVE 1,[XWD 260000,4] ;SET ACS, START FORK AT LOCATION 4
MOVEI 2,-17(P) ;POINTER TO ACS
JSYS CFORK ;CREATE FORK
ERR <PSITIME: Cannot CFORK>
MOVEM 1,@TIMFRK(USER) ;SAVE HANDLE
SUB P,[XWD 23,23] ;ADJUST STACK, INCLUDING ARGS
JRST @3(P) ;RETURN
PSTACS: 0 ;0 NEXT RUNTM TO INTERRUPT
0 ;1
0 ;2
0 ;3
MOVEI 1,0 ;4 TIME INTERVAL IN THE RIGHT HALF
JSYS DISMS ;5 DISMISS FOR THIS LONG
MOVEI 1,-1 ;6 HANDLE TO SUPERIOR FORK
JSYS RUNTM ;7 GET RUNTIME IN AC 1
CAMGE 1,0 ;10 IS IT BEYOND THE INTERVAL?
JRST 4 ;11 NO DISMISS AGAIN
ADDI 1,0 ;12 NEXT PERIOD -- INTERVAL IN RIGHT HALF
MOVEM 1,0 ;13 AND SAVE IT
MOVEI 1,-1 ;14 HANDLE TO SUPERIOR FORK
HRRZ 2,0 ;15 CHANNEL MASK -- EITHER A HRRZ OR HRLZ INSTRUCTION, MODIFIED
JSYS IIC ;16 CAUSE AN INTERRUPT
JRST 4 ;17 AND CONTINUE
BEND PSIRUNTM
HERE(KPSITIME)
MOVE USER,GOGTAB
SKIPN TIMFRK(USER) ;CHECK SET UP
JRST KPSIRET ;NOT SET UP -- RETURN
MOVE 10,-1(P) ;CHANNEL NUMBER
SKIPE 1,@TIMFRK(USER)
JSYS KFORK ;KILL FORK
SETZM @TIMFRK(USER) ;REMEMBER NO FORK
KPSIRET:SUB P,X22
JRST @2(P) ;RETURN
HERE(IRPSP1)
HERE(IRPSP2)
HERE(IRPSP3)
BEND IRPPKG
>;TENX
ENDCOM(IRP)
END