Program AppleSound;
{ This program loads a 6502 sound routine at apple address $302
then duration and frequency are loaded into $300 and $301
($F300 and $F301 in Z80) finally the routine is called using
a general call to an apple subroutine.
You can use this routine (try different durations and frequencies)
to get sound from your apple almost like the SOUND procedure
available to our IBM Turbo friends.
}
{=========================================================================}
{ This is a general procedure which will transfer control to a 6502 subroutine
in Apple memory. The argument is the address (in 6502 address location).
This procedure can easily be included in any program .
}
Procedure call_appl(AppleAddr : integer);
Begin
inline($2A/>AppleAddr/$22/$F3D0/$2A/$F3DE/$77);
End;
{ here is the Z80 source code
LD HL,(addr) ;get the apple address
LD (0F3D0H),HL ;store it in vector
LD HL,(0F3DEH) ;get the softcard address
LD (HL),A ;hit the softcard address
}
{============================================================================}
Procedure LoadSnd;
CONST
snd : array [0..25] of byte =
($AC,01,03,$AE,01,03,$A9,04,$20,$A8,$FC,$AD,$30,$C0,
$E8,$D0,$FD,$88,$D0,$EF,$CE,00,03,$D0,$E7,$60);
var
i : integer;
Begin
for i:= 0 to 25 do
mem[$F302+i] := snd[i];
End;
{ now the sound routine is loaded }
Procedure Sound(duration,frequency : byte);
Begin
mem[$F300] := duration;
mem[$F301] := frequency;
call_appl($0302);
End;
BEGIN
LoadSnd;
Sound(10,125);
Delay(100);
Sound(10,125);
Delay(100);
Sound(10,125);
Delay(100);
Sound(18,95);
Repeat until keypressed;
END.