
#ifndef __MROS
#define __MROS
#include "portab.h"

/*----------------------------------------------------------------*/
/*                    Entry points                                */
/*----------------------------------------------------------------*/

#if ATARI
EXTERN LONG MEM(void,...);
EXTERN LONG IOM(void,...);
EXTERN LONG TM(void,...);
#else
EXTERN LONG MEM(WORD opcode,...);
EXTERN LONG IOM(WORD opcode,...);
EXTERN LONG TM(WORD opcode,...);
#endif

/*----------------------------------------------------------------*/
/*             Midi Manager (MM) Midi record                      */
/*----------------------------------------------------------------*/

typedef struct mmstruct
{
        BYTE *minin;            /* midi in buffer in            */
        BYTE *minstr;           /* midi in buffer start         */
        BYTE *minend;           /* midi in buffer end           */
        BYTE *minout;           /* midi in buffer out           */
        LONG minmask;           /* in bit mask                  */
        WORD devin;             /* device,input low nibbles     */
        LONG msop;              /* actual songpointer           */
        LONG rtim;              /* actual time                  */
        WORD flags;             /* see below                    */

        BYTE *moutin;           /* midi out buffer in           */
        BYTE *moutstr;          /* midi out buffer start        */
        BYTE *moutend;          /* midi out buffer end          */
        BYTE *moutout;          /* midi out buffer out          */
        WORD otrig;             /* out trigger flag             */
        WORD resvd2;
        WORD sysflg;            /* system exclusive active      */
        WORD syscnt;            /* sysex data count             */
        WORD mooccup;           /* output occupied              */
        WORD devout;            /* device,out low bytes         */
        WORD molock;            /* bulk send active             */
        WORD resvd3;

        LONG status;            /* status + max 2 bytes         */
        LONG event;             /* mevout event latch           */
        LONG resvd4;
        WORD resvd5;
        WORD minc;              /* midi in data counter         */
        WORD tmic;              /* temporary                    */
        BYTE *moibstr;          /* own in buffer start          */
        BYTE *moibend;          /* own in buffer end            */
        BYTE *moobstr;          /* own out buffer start         */
        BYTE *moobend;          /* own out buffer end           */

        BYTE *emsgin;           /* ext message buffer in        */
        WORD rstat;             /* running status on/off        */
        WORD astat;             /* actual status                */
        WORD mrsys;             /* mros sysex active            */
        VOID (*evmvec)();       /* actuial midi in vector       */
        VOID (*oevmvec)();      /* save                         */
        BYTE *bmoutin;          /* out buffer in while mmsend   */
        BYTE sysbuf[8];         /* sysex buffer 8 byt           */

        VOID *olistp;           /* &out task list               */
        VOID *olilast;          /* &last task in list           */
        WORD rsvd6;
        WORD mtcact;            /* this input mtc master        */
        WORD mclact;            /* this input midi clock master */
        WORD resvd7;
        struct mmstruct* (*outtrigv)(struct mmstruct *mms);
                /* out trigger vector   */
        WORD mroute;            /* re-route                     */
        VOID *mrvect;           /* re-route record              */
        WORD mmros;             /* mros device flag             */
        WORD mmrout;            /* actual mros output           */
        BYTE *drvinbuf;         /* driver in buffer,see below   */
        LONG drvinsize;         /* driver in buffer size        */
        BYTE reserved1[6];
#if MAC
        VOID *tlist;
        VOID (*ttrigger)();
        WORD tstate;
        VOID *tnext;
        WORD tcable;
        LONG mm_undef1;
#else
        BYTE reserved2[20];
#endif
} MMSTRUCT;

/* flags: none defined yet */

/* notes: devin is always nibbled (bits 4-7 dev, bits 0-3 input)
   devout is always 2 bytes (bit 8-15 dev, bits 0-7 output),
   except for the mros device where it is nibbled as in devin.
   This format may change in the future.

   If drvinsize and drvinbuf are valid, you can change the driver's
   Midi Input buffer by allocating one and set the pointer and
   size. This may be crucial if long bulks are expected and the
   data can't be processed fast enough. Normally, a driver reserves
   512 bytes buffer for immediate buffering before enabling inter-
   rupts. If you use this feature, it is important that you restore
   the original pointer/size before closing mros.
   A better method (if possible) is to use Set_mbuf (note that
   this is a different buffer), wait until the dump has arrived
   (Remdat), restore the pointers (Rst_mbuf), and read data
   directly out of your buffer.
*/

/*------------------------------------------------------------------------*/

/*----------------------------------------------------------------*/
/*                     MEM - Functions                            */
/*----------------------------------------------------------------*/

#define Open_mros(a)        MEM(0,a)
#define Close_mros(a)       MEM(1,a)
#define Snd_message(a,b,c,d)  MEM(2,a,b,c,d)
#define Appl_req(a,b)       MEM(3,a,b)
#define Get_vectab()        MEM(4)
#define Terminal_req(a,b)   MEM(5,a,b)
#define Switch(a)           MEM(6,a)
#define Memtrapvec()        MEM(16)
#define Get_mempar()        MEM(17)

/*----------------------------------------------------------------*/
/*              Message Manager Application Structure             */
/*----------------------------------------------------------------*/

/* set: get_message, appl_name, other: zero */

typedef struct mem_struct
{
   VOID (*get_message)(LONG opcode, LONG msg2, LONG msg3);  /* message
receiver */
   WORD appl_topped;           /* <>0: application active  */
   WORD appl_id;
   WORD appl_count;
   WORD mros_hand;
   WORD ms_extern;
   WORD active;
   WORD appl_drv;
   BYTE ms_undef[14];
   BYTE appl_name[16];                  /* write name in here       */
} MEM_STRUCT;

/*----------------------------------------------------------------*/
/*                     Switch Struct                              */
/*----------------------------------------------------------------*/

typedef struct sw_struct
{
    WORD sw_mode;           /* mode (0=3Dmros,1=3Dcomp mode,else none) */
    WORD sw_undef;          /* reserved                            */
    MEM_STRUCT *sw_memp;    /* &mem_struct                         */
    LONG sw_basep;          /* memory start                        */
    LONG sw_mend;           /* memory end                          */
    WORD sw_indev;          /* input device                        */
    WORD sw_input;          /* input                               */
    MMSTRUCT *sw_inrec;     /* &mm_struct (input)                  */
    WORD sw_outdev;         /* output device                       */

    WORD sw_output;         /* output                              */
    MMSTRUCT *sw_outrec;    /* &mm_struct (output)                 */

    BYTE sw_resvd[16];      /* reserved                            */
} SW_STRUCT;


/*----------------------------------------------------------------*/
/*              Message manager opcodes                           */
/*----------------------------------------------------------------*/

#define MEM_START               0
#define MEM_STOP                1
#define MEM_CONT                2
#define MEM_POS                 3
#define MEM_PLAY                4
#define MEM_CYCSET              5
#define MEM_CYCSTART            6
#define MEM_CYCONOFF            7
#define MEM_COUNTIN             8
#define MEM_FRAME               24
#define MEM_SYNC                25
#define MEM_TEMPO               26
#define MEM_MASTER              27
#define MEM_OFFSET              28
#define MEM_SWITCH              0x7D
#define MEM_PRIVAT              0x7E

/*----------------------------------------------------------------*/
/*                     MEM - Parameters                           */
/*----------------------------------------------------------------*/

/* mros access only */

typedef struct mem_para
{
        MEM_STRUCT *mrtab[32];          /* table of applications structs */
        WORD mem_mrcount;               /* mros application counter      */
        WORD mem_mrhand;                /* mros handle counter           */
        WORD mem_opflg;                 /* open_mros flag                */
        WORD mem_apidcnt;               /* appl identifier count         */
        WORD mem_otid;                  /* own terminal id               */
        WORD mem_noterms;               /* no of connected terminals     */
        WORD mem_updreq;                /* update request flag           */
        WORD mem_msgact;                /* message send active           */
        WORD mem_extflag;               /* ext communication active      */
        WORD mem_msglock;               /* ext msg forbidden             */
        WORD mem_versno;                /* version no                    */
        WORD mem_mecho;                 /* ext msg echo                  */
        LONG mem_tinfbuf;               /* &buffer for terminal info     */
        SW_STRUCT *mem_actappl;         /* &sw_struct of active appl.    */
        WORD mem_drvcnt;
        WORD mem_termflag;
        VOID *vectab[16];
} MEM_PARA;

/*------------------------------------------------------------------------*/

/*----------------------------------------------------------------*/
/*      IOM - Functions                                           */
/*----------------------------------------------------------------*/

#define Devreq(a)               IOM(0,a)
#define Snd_msingl(a,b,c)       IOM(1,a,b,c)
#define Snd_mevent(a,b,c,d,e)   IOM(2,a,b,c,d,e)
#define Snd_mmult(a,b,c,d)      IOM(3,a,b,c,d)
#define Out_mreq(a,b)           IOM(4,a,b)
#define Mget(a,b)               IOM(5,a,b)
#define Inp_mreq(a,b)           IOM(6,a,b)
#define Remdat(a,b,c)           IOM(7,a,b,c)
#define Set_mbuf(a,b,c,d,e)     IOM(8,a,b,c,d,e)
#define Rst_mbuf(a,b,c)         IOM(9,a,b,c)
#define Dev_reset(a)            IOM(10,a)
#define Run_stat(a,b,c)         IOM(11,a,b,c)
#define Get_iorec(a,b)          IOM(15,a,b)

#define Open_io(a,b)            IOM(16,a,b)
#define Close_io(a)             IOM(17,a)
#define Open_mout(a,b,c,d,e)    IOM(18,a,b,c,d,e)
#define Open_device(a)          IOM(20,a)
#define Get_minmask(a,b)        IOM(21,a,b)
#define Next_device(a,b)        IOM(22,a,b)
#define Get_device(a,b)         IOM(23,a,b)
#define Iotrapvec()             IOM(24)
#define Iovec()                 IOM(25)
#define Get_iopar()             IOM(26)

/*----------------------------------------------------------------*/
/*                     io_struct                                  */
/*----------------------------------------------------------------*/

/* set: inpmask, inpvec, ioppqsmp, others zero */

typedef struct io_struct
{
        LONG inpmask;                   /* input mask (32 inputs)    */
        BYTE ioreserved1[12];           /* reserved                  */
        VOID (*inpvec)();               /* midi in receive routine   */
        WORD ioppqsmp;                  /* time stamp mode (0=3Dppq)   */
        WORD iohand;                    /* handle (set by mros)      */
        WORD mros_hand;                 /* mros handle (set by mros) */
        BYTE ioreserved2[6];            /* reserved                  */
} IO_STRUCT;

/*----------------------------------------------------------------*/
/*                       Devices etc                              */
/*----------------------------------------------------------------*/

/* mros and devices access only */

typedef struct dev_struct
{
  MMSTRUCT *devrecp;                      /* pointer to first mmstruct        */
  WORD devid;                             /* device id (0 exept reserved)     */
  WORD devmidi;                           /* <>0, if device has midi ports    */
  WORD devppq;                            /* if device can produce ppq clocks */
  WORD devsmpte;                          /* if device has smpte capabilities */
  VOID (*devframev)(WORD frame);          /* frame change vector              */
  WORD (*devwritev)(WORD onoff, LONG time);    /* write smpte vector          */
  WORD (*devpsyncv)(WORD onoff,
          WORD dev, WORD inp);            /* ppq sync on/off vector           */
  WORD (*devssyncv)(WORD onoff,
          WORD dev, WORD inp);            /* smpte sync on/off vector         */
  WORD devact;                            /* <>0, if device active            */
  WORD devnum;                            /* device no.                       */
  WORD devmins;                           /* no. of midi inputs (0=no input)  */
  WORD devmouts;                          /* midi outputs                     */
  VOID (*devinitv)(VOID);                 /* re-initialisation vector         */
  VOID (*devtermv)(VOID);                 /* terminate vector                 */
  VOID (*devcallv)(WORD op,...);          /* for direct call to the driver    */
  WORD devwrcont;                         /* continuous smpte write flag      */
  WORD devflags;                          /* flags, none defined (v3.07) yet  */
  WORD devsmpoffs;                        /* smpte offset                     */
  WORD devvers;                           /* version no.                      */
  BYTE devname[8];                        /* 8 ascii device name              */
} DEV_STRUCT;

typedef struct
{
    VOID *next;
    VOID *task;
    LONG para1;
    LONG para2;
} OUTTASK;
/*----------------------------------------------------------------*/
/*                      IOM - Parameters                          */
/*----------------------------------------------------------------*/

/* mros access only */

typedef struct iopara
{
    WORD io_nodevs;             /* no of devices */
    MMSTRUCT *skipped;          /* former &system midi record   */
    OUTTASK *io_ofreelp;        /* &next free element in out task list */
    WORD io_iotskc;             /* iom task counter             */
    WORD io_iohc;               /* handle count                 */
    LONG io_aminmask;           /* actual in bit mask           */
    WORD io_amdev;              /* next midi device             */
    WORD io_apdev;              /* next ppq device              */
    WORD io_asdev;              /* next smpte device            */

    DEV_STRUCT *devp[16];       /* device structs array         */
    IO_STRUCT *iotsktab[16];    /* array of io tasks            */
    VOID *iorout[4];            /* io routines                  */
    OUTTASK olist[64];          /* out task list                */
} IOPARA;

/*------------------------------------------------------------------------*/

/*----------------------------------------------------------------*/
/*                    TM - functions                              */
/*----------------------------------------------------------------*/

#define Tm_start()               TM(0)
#define Tm_stop()                TM(1)
#define Tm_cont()                TM(2)
#define Tm_pos(a)                TM(3,a)
#define Tm_play(a)               TM(4,a)
#define Cycle_set(a,b)           TM(5,a,b)
#define Cycle_start()            TM(6)
#define Cycle_onof(a)            TM(7,a)
#define Count_in(a,b,c)          TM(8,a,b,c)
#define Tm_forward(a)            TM(9,a)
#define Tm_rewind(a)             TM(10,a)

#define Timstr(a,b)              TM(16,a,b)
#define Curtimstr(a)             TM(17,a)
#define Songstr(a,b)             TM(18,a,b)
#define Cursngstr(a)             TM(19,a)
#define Curtmpstr(a)             TM(20,a)
#define Curtsgstr(a)             TM(21,a)
#define Strtim(a)                TM(22,a)
#define Strsong(a)               TM(23,a)
#define Set_frame(a)             TM(24,a)
#define Tm_sync(a,b,c,d,e,f,g)   TM(25,a,b,c,d,e,f,g)
#define Set_tempo(a)             TM(26,a)
#define Set_master(a)            TM(27,a)
#define Mtc_onoff(a,b,c)         TM(28,a,b,c)
#define Mcl_onoff(a,b,c)         TM(29,a,b,c)
#define Mclick(a,b)              TM(30,a,b)
#define Wrt_smpte(a,b,c)         TM(31,a,b,c)

#define Open_tm(a,b)             TM(32,a,b)
#define Close_tm(a)              TM(33,a)
#define Store_loc(a)             TM(34,a)
#define Get_loc(a)               TM(35,a)

#define Get_tmpar()              TM(40)
#define Get_tmtrap()             TM(41)
#define Get_tmvec()              TM(42)
#define Smpte_offset(a)          TM(43,a)

#define Tm_masterconv(a)         TM(49,a)
#define Human_clock(a)           TM(50,a)

/*----------------------------------------------------------------*/
/*                         tm_struct                              */
/*----------------------------------------------------------------*/

/* set: tmq, startq, stopq, posq, freezeq, restq, stillq,
        tiks, tppqsmp, prio. atime may be used for wakeup */

typedef struct tm_struct
{
    VOID (*tmq)(VOID);              /* task (called in run mode)    */
    VOID (*startq)(VOID);           /* start message task           */
    VOID (*stopq)(VOID);            /* stop message task            */
    VOID (*posq)(LONG pos, LONG time);      /* position message     */
    VOID (*freezeq)(VOID);          /* cycle freeze task            */
    VOID (*restq)(VOID);            /* cycle restore task           */
    VOID (*stillq)(VOID);           /* task (called during stop)    */
    LONG tmreserved1;

    WORD tiks;              /* task called every n tiks             */
    WORD tppqsmp;           /* either 1/384 ppq or 1/16 frame       */
    WORD prio;              /* priority                             */
    WORD ttiks;             /* tiks temporary                       */
    WORD tmreserved2;
    WORD thand;             /* handle                               */
    WORD stiks;             /* tiks for still queue                 */
    WORD sttiks;            /* temporary                            */
    WORD tsem;              /* semaphore                            */
    LONG atime;             /* task's pos                           */
    WORD tmroshand;         /* mros handle                          */
    LONG astime;            /* task's pos during stop               */
    BYTE tmreserved3[32];
} TM_STRUCT;

typedef struct mr_master
{
    LONG pos;
    LONG event;
} MR_MASTER;           /* mastertrack entry */

/* typedef struct new_master
{
    LONG pos;
    LONG event;
    LONG time;
} NEW_MASTER;   not implemented */

/*----------------------------------------------------------------*/
/*              Time Manager Parameters                           */
/*----------------------------------------------------------------*/

/* access only to documented items, others may change! */

typedef struct tmpara
{
    LONG t_runclock;        /* smpte-clock                   */
    LONG t_songpos;         /* actual songp                  */
    MR_MASTER *t_nxtmas;    /* next master tempo entry       */
    LONG t_nxtpos;          /* next tempo change position    */
    LONG t_tempo;           /* tempo                         */
    LONG t_humt;            /* human runclk algned to qurter */
    WORD t_ttsden;          /* tsm denom temp                */
    WORD t_tsden;           /* tsm denom(4=4,8=2,16=1)       */
    WORD t_tsnum;           /* tsm numerator                 */
    WORD t_abar;            /* actual bar                    */
    WORD t_numer;           /* numerator                     */
    WORD t_denom;           /* denominator                   */
    WORD t_mtcc;            /* mtc count                     */
    BYTE t_rfrm;            /* mtc frames                    */
    BYTE t_rsec;
    BYTE t_rmin;
    BYTE t_rhor;
    LONG t_chasepos;        /* chase songpos                 */
    LONG t_humqua;          /* human quarter count (24 ppq)  */
    LONG t_chaseclock;      /* chase smpte time              */
    BYTE t_unused_0[10];
                            /* first block swapped on cycle! */
    WORD t_runflag;         /* system running                */
    WORD t_frame;           /* frame type 0=24,1=25 etc      */
    WORD t_beepflg;         /* beep on/off                   */
    BYTE t_bfre1;           /* beeper frequency lo           */
    BYTE t_bfre2;           /* hi                            */
    WORD t_ahrs;            /* actual hours                  */
    WORD t_amin;            /* minutes                       */
    WORD t_asec;            /* seconds                       */
    WORD t_afrm;            /* frames                        */
    WORD t_abit;            /* subfrms                       */
    WORD t_mtco;            /* mtc out on/off                */
    WORD t_frms;            /* frames(real)                  */
    LONG t_cclock;          /* calc clock                    */
    MR_MASTER *t_master;    /* mastertrack adress            */
    WORD t_ssync;           /* smpte sync mode               */
    WORD t_maston;          /* mastertrack on/off            */
    WORD t_psync;           /* ppq sync mode                 */
    LONG t_cycstr;          /* cycle start pos               */
    LONG t_cycend;          /* cycle end pos                 */
    WORD t_cycon;           /* cycle on/off                  */
    LONG t_cycflg;          /* cycle start req               */
    WORD t_tmlock;          /* system lock                   */
    WORD t_jobcnt;          /* jobs counter                  */
    VOID *t_jobend;         /* jobs list end                 */
    WORD t_cycchg;          /* cycle start change            */
    WORD t_timclock;        /* lock clock                    */
    WORD t_bardispoffs;     /* bar display offset            */

    LONG t_stopclk;         /* stop clock                    */
    LONG t_tmcount;         /* tm overflow counter           */
    WORD t_tmhandc;         /* next tm handle                */
    WORD t_mcthand;         /* midi clock out tm handle      */
    WORD t_sfcnt;           /* 1/16 frame counter            */
    WORD t_smpclock;        /* mtc subframes                 */
    WORD t_stic;            /* mtc flag                      */
    WORD t_fchen;           /* frame change enable (mtc)     */
    WORD t_mtcdat;          /* mtc latch                     */
    WORD t_mtcstill;        /* flag for non moving code      */
    LONG t_lastmtc;         /* latched mtc time              */
    LONG t_stopsop;         /* stop songpos                  */
    WORD t_tioffs;          /* internal offset               */
    LONG t_smpoffs;         /* smpte offset (mtc sync)       */
    WORD t_sycc;            /* sync watchdog count           */
    LONG t_tcibpb;          /* count in bpb                  */
    WORD t_cinum;           /* numerator                     */
    WORD t_tcinum;          /* temp                          */
    WORD t_cibar;           /* bars                          */
    WORD t_cippq;           /* ppq                           */
    WORD t_tcippq;          /* temp                          */
    WORD t_ciflag;          /* count in flag                 */
    WORD t_slzero;          /* leading zero flag songpos     */
    WORD t_tlzero;          /* time                          */
    BYTE t_tsep;            /* time string separator         */
    BYTE t_ssep;            /* song string separator         */
    WORD t_sscal;           /* songstr remainder scaling     */
    WORD t_cabar;           /* calc paras actual bar         */
    WORD t_cnumer;          /* numerator                     */
    WORD t_cdenom;          /* denominator                   */
    WORD t_cppbar;          /* ppq per bar                   */
    WORD t_cppden;          /* ppq per denominator           */
    WORD t_carem;           /* actual remainder              */
    WORD t_canum;           /* actual numerator              */
    LONG t_ctempo;          /* tempo                         */
    WORD t_ciden;           /* count in denominator          */
    WORD t_mtcon;           /* mtc out on                    */
    WORD t_mclon;           /* midi clock out on/off         */
    MMSTRUCT *t_mtcodev;    /* mtc out device record         */
    MMSTRUCT *t_mclodev;    /* midi clock out device record  */
    WORD t_tmflag;          /* tm overflow flag              */
    WORD t_tmtc;            /* tm applications count         */
    WORD t_ptskc;           /* ppq tasks count(-1)           */
    WORD t_stskc;           /* smpte tasks count             */
    WORD t_strtc;           /* start tasks count             */
    WORD t_stopc;           /* stop tasks count              */
    WORD t_posc;            /* position tasks count          */
    WORD t_freezec;         /* cycle freeze tasks count      */
    WORD t_restc;           /* cycle restore tasks count     */
    WORD t_stillc;          /* still tasks count             */
    WORD t_psfcnt;          /* stillq 1/16 frame counter     */
    WORD t_mclkon;          /* midi click on/off             */
    LONG t_mclkevt1;        /* 2 events                      */
    LONG t_mclkevt2;        /* for midi click                */

    MMSTRUCT *t_mclkdev;    /* midi clock in record          */
    WORD t_pstillc;         /* stillq count ppq temp         */
    WORD t_sstillc;         /* stillq count smpte temp       */
    WORD t_asmpsyn;         /* smpte sync source int/ext     */
    WORD t_appqsyn;         /* ppq sync source               */
    WORD t_misync;          /* midi sync status              */
    WORD t_ppqclock;        /* ext sync ppq clocks           */
    WORD t_mtcframe;        /* mtc in frame rate             */
    WORD t_lckoffs;         /* lock time offset in subframes */
    LONG t_lockt;           /* * frames                      */
    WORD t_settle;          /* settle time (* ys/subframe)   */
    LONG t_alltim;          /* timer clock                   */
    MMSTRUCT *t_tmsinrec;   /* mtc in record                 */
    MMSTRUCT *t_tmpinrec;   /* midi clock in record          */
    VOID *t_humtab;         /* &human clock quantize table   */
    WORD t_hbpb;            /* bits (subframes) per beat     */
    WORD t_humtmhand;       /* tm handle                     */
    WORD t_humiohand;       /* io handle                     */
    WORD t_hevtcnt;         /* event repeat count            */
    LONG t_tscale;          /* (frames*80*60*1000)/384       */
    LONG t_bpbscal;         /* frames*80*60*1000             */
    LONG t_humscal;         /* (frames*80*60*1000)/8         */
    VOID *t_jobin;          /* jobs buffer in                */
    VOID *t_jobout;         /* out                           */
    WORD t_timsem;          /* tasks entry/exit semaphore    */
    LONG t_locktim;         /* lock time mtc                 */
    LONG t_tmsp;            /* tm stackpointer save          */
    LONG t_tmdevoffs;       /* device specific smpte offset  */
    LONG t_citempo;         /* still queue,count in tempo    */
    LONG t_notused1;
    LONG t_notused2;
    WORD t_tevcnt;          /* tempo evaluation counter      */
    LONG t_twidth;          /* width (in ppq)                */
    WORD t_cutcnt;          /* sync cut code watch           */
    WORD t_prohib;          /* sync flag                     */
    LONG t_atfunc;          /* actual entry                  */
    LONG t_otempo;          /* tempo offset                  */
    LONG t_arem;            /* csmpte remainder temporary    */
    WORD t_humcibar;        /* human count in bars           */
    LONG t_humcit;          /* last trigger time             */
    LONG t_timdoffs;        /* time display offset           */
    WORD t_timtim;          /* time divisor                  */
    LONG t_cstarttime;      /* cycle start time (subfr)      */
    LONG t_cendtime;        /* end, updated on cycle swap    */
    WORD t_tmpreq;          /* tempo change request          */
    LONG t_rtempo;          /* tempo                         */
    LONG t_rtmppos;         /* position                      */
    WORD t_emaster;         /* external master               */
    WORD t_eslave;          /* external slave                */
    WORD t_tstress;         /* overflow clocks latch (displ) */
    LONG t_cpos;            /* calculated time after sngstr  */

    LONG t_mclscale;        /* midi clock frame scaler       */
    WORD t_mclscnt;         /* midi clock 1/8 count          */
    WORD t_tlink;           /* tempo to smpte speed link     */
    WORD t_sfppq;           /* subfr per ppq                 */
    LONG t_sfprest;         /* remainder                     */
    LONG t_asfprest;        /* actual                        */
    LONG t_lmcltime;        /* midi clock distance in subfr  */
    WORD t_wmtcc;           /* watch mtc count               */
    WORD t_mtcfrm;          /* mtc frame (hours tens)        */
    WORD t_lmtccnt;         /* mtc counter latch             */
    LONG t_emtcfrm;         /* mtc calc frames               */
    LONG t_emtcsec;         /* seconds                       */
    LONG t_droptime;        /* mtc drop frames               */
    LONG t_lmtctime;        /* reftime latch                 */
    LONG t_refclock;        /* mtc reference clock           */
    LONG t_mtctime;         /* absolute sync time            */
    LONG t_cipcnt;          /* count in ppq count            */
    MR_MASTER *t_cmaster;   /* next mastertrack address      */
    WORD t_master_format;   /* set if new master format      */
    LONG t_ttemp;           /* exebit tempo counter          */
    WORD t_cycreq;          /* set at cycle end              */
    WORD t_amscount;        /* actual ms counter             */
    LONG t_mscount;         /* actual time in ms             */
    WORD t_msscale;         /* ms scaler                     */
    WORD t_mtcerror;        /* flag for main pgm             */
    WORD t_mtcmin;          /* mtc minutes for 30df          */
    WORD t_lmtcmin;         /* latch                         */
    LONG t_cmscount;        /* time in ms after ppq->smpte   */
    WORD lockincnt;         /* mtc lock in delay (2 frms)    */
    WORD mtcgood;           /* good frames count (2 frms)    */
    WORD mtcspcount;        /* speed measure count           */
    LONG mtcaccu;           /* speed accu                    */
    LONG cspeed;            /* get clock speed count         */
    LONG mtcspeed;          /* mtc speed scaled              */
    LONG mtccspeed;         /* latch                         */
    LONG cycledone;         /* subframes                     */
    WORD t_tmcli;           /* allow irq mask for timer,
                               default ATARI: $2500, 
                                       MAC  : $2000          */
    WORD t_usestack;        /* if != 0, enable timer irq
                               stack (2k), default: 
                                            ATARI: enabled,
                                            MAC  : disabled  */
    LONG t_ppqltime;
    MR_MASTER *t_ppqlmaster;
    LONG t_ppqlarem;
    LONG t_ppqlpos;
    MR_MASTER *t_smplmaster;
    LONG t_smpltime;
    LONG t_smplarem;
    LONG t_smpltempo;

    BYTE t_tmcopy[64];      /* copy area for cycle start variables */
} TMPARA;

/*---------------------------------------------------------------------*/
/*                   Human Sync struct                                 */
/*---------------------------------------------------------------------*/

typedef struct humanblk
{
    WORD hm_algo[24];
    LONG hm_offset;
    WORD hm_lag;
    LONG hm_maxdiff;
    LONG hm_mindiff;
    LONG hm_maxtempo;
    LONG hm_mintempo;
    BYTE hm_unused[10];
} HUMANBLK;

#endif

