/* * _mediach(): force the media 'changed' state on a removable drive. * * Usage: errcode = _mediach( devno ) - returns 1 if an error occurs * * Inputs: devno - (0 = 'A:', 1 = 'B:', etc...) * */ .globl _mediach _mediach: move.w 4(sp),d0 move.w d0,mydev add.b #'A',d0 move.b d0,fspec ; Set drive spec for search loop: clr.l -(sp) ; Get supervisor mode, leave old SSP move.w #$20,-(sp) ; and 'Super' function code on stack. trap #1 addq.l #6,sp move.l d0,-(sp) move.w #$20,-(sp) move.l $472,oldgetbpb move.l $47e,oldmediach move.l $476,oldrwabs move.l #newgetbpb,$472 move.l #newmediach,$47e move.l #newrwabs,$476 ; Fopen a file on that drive move.w #0,-(sp) move.l #fspec,-(sp) move.w #$3d,-(sp) trap #1 addq.l #8,sp ; Fclose the handle tst.l d0 bmi.s noclose move.w d0,-(sp) move.w #$3e,-(sp) trap #1 addq.l #4,sp noclose: moveq #0,d7 cmp.l #newgetbpb,$472 ; still installed? bne.s done move.l oldgetbpb,$472 ; Error, restore vectors. move.l oldmediach,$47e move.l oldrwabs,$476 trap #1 ; go back to user mode addq.l #6,sp ; restore sp moveq #1,d0 ; 1 = Error rts done: trap #1 ; go back to user mode addq.l #6,sp ; from stack left above clr.l d0 ; No Error rts /* * New Getbpb()...if it’s the target device, uninstall vectors. * In any case, call normal Getbpb(). */ newgetbpb: move.w mydev,d0 cmp.w 4(sp),d0 bne.s dooldg move.l oldgetbpb,$472 ; Got target device so uninstall. move.l oldmediach,$47e move.l oldrwabs,$476 dooldg: move.l oldgetbpb,a0 ; Go to real Getbpb() jmp (a0) /* * New Mediach()...if it’s the target device, return 2. Else call old. */ newmediach: move.w mydev,d0 cmp.w 4(sp),d0 bne.s dooldm moveq #2,d0 ; Target device, return 2 rts dooldm: move.l oldmediach,a0 ; Call old jmp (a0) /* * New Rwabs()...if it’s the target device, return E_CHG (-14) */ newrwabs: move.w mydev,d0 cmp.w 4(sp),d0 bne.s dooldr moveq #-14,d0 rts dooldr: move.l oldrwabs,a0 jmp (a0) .data fspec: .dc.b 'X:\\X',0 mydev: .ds.w 1 oldgetbpb: .ds.l 1 oldmediach: .ds.l 1 oldrwabs: .ds.l 1 .end