[net.micro.pc] More PC problems.....

greenber@timeinc.UUCP (Ross M. Greenberg) (06/23/85)

Many thanks to those of you who responded to my posting "Weirdness in PC".
It looks like I was making a whole bunch of mistakes, which I've
rectified.  Primary was neglecting to address all variables via "CS:"
since my other segments are unknown at the time of the interrupt.

Returning from the interrupt with an 'iret' instruction was bogus, since
status and other data is transferred in the flag word, so the 'iret'
was replaced with a 'retf 2' after popping the flags manually.

So the code is much healthier --- but still doesn't function properly
(the way I want it to!).

Current problem:  The dos interrupt is taken over and in turn is
called by my new interrupt routine. The code itself is terminate and stay
resident.  And it seems to work --- until the *next* program is
loaded/executed and then tries to exit, where it goes out to lunch.
Why would this be?  The memory is staying around after the terminate and
stay resident call, and the problem only seems to exist if I take over
the dos interrupt.  Other interrupts seem to be okay.  I've enclosed
the code I'm presently using below.  Take a look and let me know where
the problem lies?

I'm certain that the code can be done more effeciently, and I'll do that
after the other bugs are out of the way.

Thanks in advance.....


==============================================


public	set_dos, in_dos
include dos.mac
PSEG
in_dos	dw	0
old_dos	dd	?

set_dos	proc far
	push	ds			;save the segment

	xor	ax,ax			;zero ax
	mov	ds,ax			;so we can zero the segment
	mov	si,84h			;start of int21 vector

	mov	ax, [si]
	mov	cs:old_dos, ax		;save the offset
	mov	ax, [si + 2]
	mov	cs:old_dos + 2,ax	;save the segment

	push	cs			;get the cs in bx
	pop	bx
	mov	ax,offset int21		;put the offset of routine in ax
	cli				;can't get interrupted now!
	mov	ds:[si], ax		;move in the offset
	mov	ds:[si + 2],bx		;and the segment
	sti				;okay for interrupts

	pop	ds			;restore the old ds
	ret				;back home
set_dos	endp

int21	proc	far
	pushf				;save the flags because the 'inc'
	inc	cs:in_dos		;   changes them. Inc the flag
	popf				;restore the flags
	pushf				;and put them on the stack
	call	dword ptr cs:[old_dos]	;call the "real dos"
	cli
	pushf				;save the flags because the 'dec'
	dec	cs:in_dos		;   changes them. Dec the flag
	popf				;get the flags back
	ret 2				;return after stripping the flags 
int21	endp

endps
end


-- 
------------------------------------------------------------------
Ross M. Greenberg  @ Time Inc, New York 
              --------->{ihnp4 | vax135}!timeinc!greenber<---------

I highly doubt that Time Inc. they would make me their spokesperson.