program soundblaster;
uses crt;

type notentyp = (c2, d1, d2, e1, f1, f2, g1, g2, a1, a2, b1, c1);
     feldtyp = array[c2..c1] of array[1..2] of byte;

const tonfeld : feldtyp = (($31, $6B), ($31, $81), ($31, $98), ($31, $B0),
                           ($31, $CA), ($31, $E5), ($32, $02), ($32, $20),
                           ($32, $41), ($32, $63), ($32, $87), ($32, $AE));

var noteplay : notentyp;
procedure ausgabe(regi, wert : integer);
  begin
    port[$388]:=regi;
    delay(10);
    port[$389]:=wert;
    delay(10);
  end;

procedure status(zahl:byte);
  var z,i: byte;
  begin
    z:=128;
    for i:=1 to 8 do
      begin
       if zahl and z = z then write(1)
                          else write(0);
       z:=z div 2;
      end;
    writeln;
  end;

procedure play(note: notentyp);
  begin
    ausgabe($A3, tonfeld[note][2]); ausgabe($A0, tonfeld[note][1]);
    ausgabe($B3, tonfeld[note][1]); ausgabe($B0, tonfeld[note][1]);
    delay(500);
    ausgabe($B3, $09); ausgabe($B3, $09);
    ausgabe($A3, $00); ausgabe($A0, $00);
    delay(1000);
  end;

begin
  clrscr;
  {status(port[$022C]);
  status(port[$022D]);
  status(port[$022E]);
  port[$0226]:=1;
  delay(1);
  port[$022D]:=$D1;
  status(port[$0388]);
  delay(1);
  status(port[$022C]);
  status(port[$022D]);
  status(port[$022E]);
  delay(1);}
  writeln('Dieses mal 12 Noten.');
  ausgabe($01, $20);
  writeln('Adresse 1: waveselect enable');
  ausgabe($02, $00); ausgabe($03, $00); ausgabe($04, $00);
  writeln('Adressen 2-4: Timer off');
  ausgabe($08, $00);
  writeln('Adresse 8 =0');
  ausgabe($23, $20); ausgabe($20, $20);
  writeln('Adresse 20H/23H: diverse Operatoreneinstellung=$20');
  ausgabe($43, $01); ausgabe($40, $01);
  writeln('Adresse 40H/43H: Operatoreneinstellung=$01 Lautst„rke');
  ausgabe($63, $73); ausgabe($60, $73);
  writeln('Adresse 60H/63H: Operatoreneinstellung=$55 (Attack, Decay');
  ausgabe($83, $11); ausgabe($80, $11);
  delay(1);
  writeln('Adresse 80H/83H: Operatoreneinstellung=$11 (Substain, Release)');
  ausgabe($C3, $01); ausgabe($C0,$01);
  writeln('Adresse $C0/$C3=$01 -> additive Synthese');
  ausgabe($BD, $00);
  writeln('Adresse $BD:=$00 -> Percussion aus');
  ausgabe($E3, $00); ausgabe($E0, $00);
  writeln('Adresse $E3:=$00 -> Waveselect Sinus');
  writeln('Ton wird gespielt');
  noteplay:=c2;
  repeat
    if ord(noteplay)<12 then noteplay:=succ(noteplay)
                        else noteplay:=c2;
    play(noteplay);
  until keypressed;
  ausgabe($23, $00); ausgabe($20, $00);
  ausgabe($C0, $00); ausgabe($C3,$00);
  writeln('Adresse $C0/$C3=$01 -> additive Synthese');
  writeln('Ton ende');
  delay(1);
  {port[$02C]:=$D3;
  delay(1);
  port[$0226]:=0;
  writeln;
  status(port[$0388]);
  writeln;
  status(port[$0388]);}
end.