{   Computer Systems Research Group
    University of Toronto

    Module:  MS-DOS BIOS Speaker Interface   V1.00
    Author:  James R. Cordy
    Date:    27 June 1984  (Rev 28 June 1984) }

{ Copyright 1984, The University of Toronto }


var SPKR : module

    imports (var BIOS, byteregs)
    exports (SoundSpeaker, SpeakerDone, SetSpeakerFrequency,
	SpeakerOn, SpeakerOff)

    { BIOS Registers }
    var inregs : REGS := ZEROREGS
    var outregs : REGS
    var outflags : FLAGS

    procedure SoundSpeaker (time : ShortInt) =
	imports (var BIOS, var inregs, var outregs, byteregs, var outflags)
	begin
	    byteregs (inregs) (AHREG) := SPKRSOUNDSPKR
	    byteregs (inregs) (ALREG) := time
	    outflags := BIOS.int86 (outregs, inregs, SPKRDSR)
	end SoundSpeaker

    function SpeakerDone returns result : Boolean =
	{ Yes, this function unavoidably imports vars. }
	imports (var BIOS, var inregs, var outregs, byteregs, var outflags)
	begin
	    byteregs (inregs) (AHREG) := SPKRGETSPKRSTATUS
	    outflags := BIOS.int86 (outregs, inregs, SPKRDSR)
	    return (ZFLAG in outflags)
	end SpeakerDone

    procedure SetSpeakerFrequency (frequency : SignedInt) =
	imports (var BIOS, var inregs, var outregs, byteregs, var outflags)
	begin
	    const divisor : SignedInt := 1250000 div Long (frequency)
	    byteregs (inregs) (AHREG) := SPKRSETSPKRFREQ
	    inregs (CXREG) := divisor
	    outflags := BIOS.int86 (outregs, inregs, SPKRDSR)
	end SetSpeakerFrequency

    procedure SpeakerOn =
	imports (var BIOS, var inregs, var outregs, byteregs, var outflags)
	begin
	    byteregs (inregs) (AHREG) := SPKRSPKRON
	    outflags := BIOS.int86 (outregs, inregs, SPKRDSR)
	end SpeakerOn

    procedure SpeakerOff =
	imports (var BIOS, var inregs, var outregs, byteregs, var outflags)
	begin
	    byteregs (inregs) (AHREG) := SPKRSPKROFF
	    outflags := BIOS.int86 (outregs, inregs, SPKRDSR)
	end SpeakerOff

end module
