Trailing-Edge - PDP-10 Archives - decuslib20-01 - decus/20-0003/paspsi.mac
There are 4 other files named paspsi.mac in the archive. Click here to see a list.
	title PASPSI - Tops-20 interrupt handling

	search monsym,pasunv


	entry psidef,psiena,psidis
	external oldpc.,chntb.,lockc.,level.,leav.

	filttb==filst1		;current tty buffer
	filbct==filst2		;tty byte count
	filbpt==filst3		;tty byte pointer

	reloc 0

ttyb0:	block ^D50		;buffers for tty at 3 interrupt levels
ttyb1:	block ^D50
ttyb2:	block ^D50

dispt:	block ^D36		;pascal routine to call for each channel

	reloc 400000

ttybuf:	ttyb0			;we get tty buffer from this, indexed

disp:	repeat ^D36,<		;chntab entries point to these
	adjstk p,24
	pushj p,intmod


intmod:	movem 0,apracs(p)	;main dispatcher - save ac's
	hrli 0,1
	hrri 0,apracs+1(p)
	blt 0,apracs+17(p)
	hrrz b,(p)		;place in disp we came from
	subi b,disp
	lsh b,-1		   ;arguments for the pascal proc called:
	subi b,1		;b _ index of interrupt
	hlrz a,chntb.(b)	;a _ interrupt level
	skipe d,lockc.		;interrupts locked out?
	jrst locked		;yes - defer it
	move c,oldpc.-1(a)	;c _ old pc
	caie b,6		;see if arith overflow
	cain b,7
	jrst ovrflw		; yes - ignore if in runtimes
intok:	hrrz e,oldpc.-1(a)	;see if this is deferred - addr only
	setz d,			; assume not
	cain e,leav.		;all deferred int's happen at this magic addr
	movei d,1		;d _ deferred flag
	movei e,oldpc.-1(a)	;e _ addr of old pc
	movei f,apracs(p)	;f _ addr of ac save area
	push p,level.
	movem a,level.		;now at new level
	push p,fileol+tty##	;save the state of tty i/o
	push p,filcmp+tty##
	push p,filttb+tty##
	push p,filbct+tty##
	push p,filbpt+tty##
	setzm filcmp+tty##	;reinit tty
	movei t,1
	movem t,fileol+tty##
	move t,ttybuf(b)
	movem t,filttb+tty##
	setzm filbct+tty##
	push p,filcmp+ttyout##	;likewise ttyoutput
	setzm filcmp+ttyout##
	push p,(p)		;top location gets garbaged

	pushj p,@dispt(b)

	pop p,(p)		;reverse the above
	pop p,filcmp+ttyout##
	pop p,filbpt+tty##
	pop p,filbct+tty##
	pop p,filttb+tty##
	pop p,filcmp+tty##
	pop p,fileol+tty##
	pop p,level.
ignore:	movem n,apracs+n(p)	;use new value of n if changed
	hrli 0,apracs+1(p)	;restore ac's
	hrri 0,1
	blt 0,17
	move 0,apracs(p)
	pop p,(p)		;restore stack
	adjstk p,-24

ovrflw:	hrrz t,c		;arith overflow - t _ pc
	cail t,safbeg##		;see if in runtimes
	caile t,safend##
	jrst .+2
	jrst ignore
	camge n,.jbff##		;or in debugger
	jrst ignore
	jrst intok


psidef:	cail b,0		;channel 0 to 35
	caile b,^D35
	jrst badind
	cail c,1		;level 1 to 3
	caile c,3
	jrst badlev
	hrl c,c
	move a,b
	lsh a,1			;a _ index into disp
	hrri c,disp(a)		;c _ level,,dispatch
	movem c,chntb.(b)
	hrrzm d,dispt(b)
	popj p,


psiena:	cail b,0
	caile b,^D35
	jrst badind
	movn a,b
	movsi b,400000		;bit 0
	lsh b,(a)		;shift to requested bit position
	movei a,400000		;this process
	popj p,


psidis:	cail b,0
	caile b,^D35
	jrst badind
	movn a,b
	movsi b,400000
	lsh b,(a)
	movei a,400000
	popj p,

badlev:	hrroi a,[asciz /Psi: priority level must be 1 to 3
	jrst endl
badind:	hrroi a,[asciz /Psi: channel must be 0 to 35
endl:	haltf
	hrroi a,[asciz /Can't continue
	jrst endl

locked:	movsi t,400000		;channel 0
	movn a,b
	lsh t,(a)		;channel .b
	iorm t,(d)		;or into deferred int.word
	jrst ignore		;now ignore interrupt