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.