Metropoli BBS
VIEWER: gccfix.asm MODE: TEXT (ASCII)
;   File To Fix DJGCC V1.09 bug that doesn't allow IOCTL read/writes
;
;   Written 2/9/93 by Aaron A. Collins
;   This file is hereby placed in the public domain.
;
;   Version 1.1 - minor entry/exit fixes 6/1/93 - AAC
;
;   Things that need IOCTL read/write operations simply need to be
;   recoded to use 0x440A and 0x440B (which DJGCC's go32 passes).
;   This converts them to the proper 0x4402 or 0x4403 as required,
;   then executes the DOS interrupt.
;		
	.RADIX	16
; 
CSEG	segment para public 'CODE'
	assume cs:CSEG, ds:CSEG, ss:CSEG, es:CSEG
;
main	proc	near
;
	org	100
;
begin:	jmp	start			; entry point according to 'end' statement
;
olddv:	dw	0000
oldds:	dw	0000
;
;
start:	push	es
	push	ds
	push	cs			; litter seg registers with our CS
	pop	ds
	cli
	mov	ah,35			; get vector, save and effect mine.
	mov	al,21			; get vector of DOS fn. interrupt
	int	21
	mov	word ptr [olddv],bx	; store vector offset of old...
	mov	ax,es
	mov	word ptr [oldds],ax	; store vector segment of old...
	lea	dx,dosint		; get effective address of int srvr.
	mov	ah,25			; set new interrupt vector
	mov	al,21			; set vector of DOS fn. interrupt
	int	21
	sti
	pop	ds
	pop	es
	mov	dx,((finish-begin+115) SHR 4) ; add file length to PSP >> para
	mov	ax,3100			; DOS TSR with retcd = 00.
	int	21
	mov	ax,4c01			; DOS Program Terminate, retcd = 01
	int	21			; we should never get here...
	ret
;
main	endp
;
	even
;
;dosint	proc	far			; DOS function int. service routine
;
;	pushf				; simulate building Int stack structure
;	pushf				; save flags we are about to trash
;	cmp	cx,1E			; make sure this is a Targa read/write?
;	jnz	around
;	cmp	ax,440A			; bogus IOCTL read call?
;	jz	yup			; Yes - modify it, else do DOS call
;	cmp	ax,440BH		; bogus IOCTL write call?
;	jnz	around			; No - do DOS call straight away...
;yup:	sub	al,8
;	jmp	around
;wierd:	iret				; this is really strange but it works!
;around: popf				; restore saved flags
;	push	cs			; simulate building Int stack structure
;	call	wierd
;	jmp	dword ptr cs:[olddv] 	; simulated far call to prev. INT 21 vector
;
;dosint	endp
;
dosint	proc	far			; DOS function int. service routine
;
	pushf				; save flags we are about to trash
	cmp	cx,1E			; make sure this is a Targa read/write?
	jnz	around
	cmp	ax,440A			; bogus IOCTL read call?
	jz	yup			; Yes - modify it, else do DOS call
	cmp	ax,440BH		; bogus IOCTL write call?
	jnz	around			; No - do DOS call straight away...
yup:	sub	al,8
around: popf				; restore saved flags
	jmp	dword ptr cs:[olddv] 	; simulated far call to prev. INT 21 vector
;
dosint	endp
;
finish:	db	0
;
CSEG	ends
;
	end	begin
[ RETURN TO DIRECTORY ]