[Back to COMM SWAG index] [Back to Main SWAG index] [Original]

    {
    > I know this been asked a lot, but I still can't seem to figure it out:
    > how do I detect a 'RING' signal from the modem at COMx?  (I want to
    > write a tsr that makes the monitor flash red (like fading color 0 from
    > black to red and
    > back - that would be no problem, but the TSR and the modem part sure is)

    This will do the trick for you.
    }
    Program RingDetector;  { TSR to detect telephone ring via modem    }
    {$M $400,0,0}
    Uses   Dos;            { import GetIntVec, SetIntVec               }
    Const  COMport     = $3FE;             { COM1 = $3FE, COM2 = $2FE  }
           RingMsg     : Array [0..7] of Byte =
                       ( $52,$40,$49,$40,$4E,$40,$47,$40 );   { "RinG" }
    Var    OldClock    : Procedure;        { For previous int vector   }
           GSpot       : Byte Absolute $B800:$072C;    { display area  }
           OldScreen   : Array [0..7] of Byte; { to save display are   }
    {$F+}
    Procedure RingDetect; Interrupt;
       begin
           if ODD(Port[COMport] SHR 6)
           then begin
               Move( GSpot, OldScreen, 8 );        { save screen area  }
               While ODD(PorT[COMport] SHR 6)
                   do Move( RingMsg, GSpot, 8 );   { display "RinG"    }
               Move( OldScreen, GSpot, 8 );        { restore screen    }
           end; {if}
           InLine($9C);                            { to fake an inT    }
           OldClock;                               { chain ticker      }
       end {RingDetect};
    {$F-}

    begin
           GetIntVec($1C,@OldClock);               { save current isr  }
           SetIntVec($1C,ADDR(RingDetect));        { install this isr  }
           Keep(0);                                { tsr               }
    end {RingDetector}.

[Back to COMM SWAG index] [Back to Main SWAG index] [Original]