; ICEPT.ASM ; ; Intercept OpenDevice() for serial.device and force ; SERF_SHARED for the first openner, EXLUSIVE for ; other openners (required because I had to remove the ; serial port refcnt checking from uucico to support ; multi-serial ports) ; ; A1 holds IOExtSer request ptr. D0-D1/A0-A1 are NOT ; scratch. ; ; You CANNOT use A4 relative addressing since this routine ; is called from a different context. ; ; Various hacks have been added (checking the unit number ; against $FFFF) because, apparently, the A2232 serial ; device re-vectors through its opendevice vector for ; some ungodly reason. include "exec/types.i" include "devices/serial.i" section text,CODE xdef _AsmOpenIntercept xdef _AsmCloseIntercept xref _OldOpenVector xref _OldCloseVector ;xref _OldBeginIOVector xref _DeviceUnit xref _DeviceName xref _RefCnt xref _UnitPtr ; check unit on close xref _strcmp ; OpenDevice ; ; A0 = devName ; D0 = unitNumber ; A1 = iORequest ; D1 = flags _AsmOpenIntercept: cmp.l _DeviceUnit,D0 beq aovalid move.l _OldOpenVector,-(sp) rts aovalid tst.l _RefCnt beq oivalid10 bmi oivalid10 moveq.l #1,D0 ; return error move.b D0,31(A1) ; store in io_Error clr.l 20(A1) ; clear io_Device rts oivalid10 or.b #SERF_SHARED,IO_SERFLAGS(A1) move.l A1,-(sp) pea oirts(pc) move.l _OldOpenVector,-(sp) rts oirts move.l (sp)+,A1 tst.b 31(A1) ; error code bne oifailed move.l 24(A1),_UnitPtr addq.l #1,_RefCnt oifailed rts _AsmCloseIntercept: move.l A0,-(sp) move.l 24(A1),A0 cmp.l _UnitPtr,A0 bne ci10 subq.l #1,_RefCnt ci10 move.l (sp)+,A0 move.l _OldCloseVector,-(sp) rts ; A2232 serial.device fix ; xdef _A2232BeginIOFix ; ;_A2232BeginIOFix ; movem.l A2/A5-A6,-(sp) ; move.l A1,-(sp) ; move.l $18(A1),A5 ; movea.l 8(A5),A6 ; move.b #5,8(A1) ; move.l $1C(A1),D0 ; andi.w #$100,D0 ; move.w D0,$1E(A1) ; clr.w D0 ; swap D0 ; cmpi.w #$B,D0 ; bls sk10 ; moveq.l #0,D0 ;sk10 lsl.w #2,D0 ; move.l D0,-(sp) ; lea $40(A5),A0 ; jsr -$234(A6) ; move.l (sp)+,A0 ; add.l _OldBeginIOVector,A0 ; add.l #$50,A0 ; move.l (A0),A0 ; jsr (A0) ; move.l D0,-(sp) ; lea $40(A5),A0 ; jsr -$23A(A6) ; move.l (sp)+,D0 ; move.l (sp)+,A1 ; andi.b #$41,D0 ; bne sk20 ; jsr -$17A(A6) ;sk20 movem.l (sp)+,A2/A5-A6 ; rts END