program MIDI_DIN_SYNC;  {9.2.03 / 21:12}

{$NOSHADOW}
{ $S+ Stack check }
{ $R+ Range check }
{ $W+ Warnings    }

Device = 90S2313;
Import  Serport;
{From System Import ; }

Define
        ProcClock   = 4000000;      {4 Meg Hertz}
        StackSize   = $0020, iData;
        FrameSize   = $0020, iData;

        Rxbuffer    =  16,iData;     {16 Bytes RAMpage}
                                     {somewhere between $60 and $25F}
        Serport     =  31250,stop1;  {31,25 KBaud -> MIDI}
                                     {with 1 stopbit !}

Implementation

{$IDATA}                     {i.e. = put the following vars}
                             {in memory area from $60 to $25F}
var  t,u:byte;               {vars for loops and so on}
     bytereceive:byte;       {the byte from the UART}
     div2, div3, div5, div7, div9, div11 : byte;
     {all the div's are used to count from the number}
     {down to 0 and then generate a pulse}
     tStart[@PortB, 0] : bit;  {sys realtime start pulse out}
     tConti[@PortB, 1] : bit;  {sys realtime start pulse out}
     tStopp[@PortB, 2] : bit;  {sys realtime start pulse out}
     tdin[@PortB, 3]   : bit;  {sys realtime start pulse out}

     tdiv02[@PortD, 2] : bit;
     tdiv03[@PortD, 3] : bit;
     tdiv05[@PortD, 4] : bit;
     tdiv07[@PortD, 5] : bit;
     tdiv09[@PortD, 6] : bit;
     tdiv11[@PortD, 7] : bit;

 procedure reset_divs;
 begin
  div2:=0;
  div3:=0;
  div5:=0;
  div7:=0;
  div9:=0;
  div11:=0;
 end;

begin
  EnableInts; {enable interrupts : we want to see, whats in the UART}

  reset_divs;

  DDRB:= %00011111; {bits 0 to 3 are for trigger outputs}
                    {bit 0  =  start signal}
                    {bit 1  =  continue signal}
                    {bit 2  =  stop signal}
                    {bit 3  =  Din Sync  1 msec long}
  portB:=0; {set them all to zero}

  DDRD:= %11111100; {bits 1 to 6 are for trigger outputs}
                    {bit 1  =  original signal / 2 (12 PPQN)}
                    {bit 2  =  original signal / 3 (8 PPQN)}
                    {bit 3  =  original signal / 5 (4,8 PPQN)}
                    {bit 4  =  original signal / 7 (3,428 PPQN)}
                    {bit 5  =  original signal / 9 (2,667 PPQN)}
                    {bit 6  =  original signal / 11 (2,182 PPQN)}
  portD:=0; {set them all to zero}

  tstart:=false;      {}
  tconti:=false;
  tstopp:=false;
  tdin:=False;

  {the main loop, looking for midi time events}
  loop {never ending}

    tstart:=false;
    tconti:=false;

    if serstat then {there was a serial event}
      bytereceive := serinp;  {get whats in the UART (resp in RAMpage)}
      if bytereceive=$F8 then  {midi clock sync (24 PPQN)}
                               {PPQN = pulses per quarter note}
        {could also be : portD:=0}
        tdiv02:=false;
        tdiv03:=false;
        tdiv05:=false;
        tdiv07:=false;
        tdiv09:=false;
        tdiv11:=false;

        tstopp:=false;

        tdin:=true;
        mdelay(1);
        tdin:=false;

        if div2=0 then
          tdiv02:=true;
          div2:=2;
        endif;
        if div3=0 then
          tdiv03:=true;
          div3:=3;
        endif;
        if div5=0 then
          tdiv05:=true;
          div5:=5;
        endif;
        if div7=0 then
          tdiv07:=true;
          div7:=7;
        endif;
        if div9=0 then
          tdiv09:=true;
          div9:=9;
        endif;
        if div11=0 then
          tdiv11:=true;
          div11:=11;
        endif;

        dec(div2);
        dec(div3);
        dec(div5);
        dec(div7);
        dec(div9);
        dec(div11);

      endif;{if bytereceive=$F8 then}
      if bytereceive=$FA then {midi clock sync : start pulse}
        reset_divs;
        tstart:=true;
        mdelay(1);
      endif;{if bytereceive=$FA then}
      if bytereceive=$FB then {midi clock sync : continue pulse}
        tconti:=true;
        mdelay(1);
      endif;{if bytereceive=$FB then}
      if bytereceive=$FC then {midi clock sync : stop}
        tstopp:=true;
        portD:=0;
      endif;{if bytereceive=$FC then}




    endif;{if serstat then}



  endloop;
end.
