| [3ae31e9] | 1 | /*
 | 
|---|
 | 2 |    =============================================================================
 | 
|---|
 | 3 |         instdsp.c -- instrument definition display driver and support functions
 | 
|---|
 | 4 |         Version 181 -- 1988-10-06 -- D.N. Lynx Crowe
 | 
|---|
 | 5 |    =============================================================================
 | 
|---|
 | 6 | */
 | 
|---|
 | 7 | 
 | 
|---|
 | 8 | #define D_EXECKI        0               /* debug execins() */
 | 
|---|
 | 9 | 
 | 
|---|
 | 10 | #include "stddefs.h"
 | 
|---|
 | 11 | #include "memory.h"
 | 
|---|
 | 12 | 
 | 
|---|
 | 13 | #include "biosdefs.h"
 | 
|---|
 | 14 | #include "charset.h"
 | 
|---|
 | 15 | #include "fields.h"
 | 
|---|
 | 16 | #include "fpu.h"
 | 
|---|
 | 17 | #include "hwdefs.h"
 | 
|---|
 | 18 | #include "vsdd.h"
 | 
|---|
 | 19 | #include "vsddsw.h"
 | 
|---|
 | 20 | #include "vsddvars.h"
 | 
|---|
 | 21 | #include "graphdef.h"
 | 
|---|
 | 22 | #include "smdefs.h"
 | 
|---|
 | 23 | 
 | 
|---|
 | 24 | #include "midas.h"
 | 
|---|
 | 25 | #include "instdsp.h"
 | 
|---|
 | 26 | 
 | 
|---|
 | 27 | #define LSPCH           2               /* pitch source scale factor */
 | 
|---|
 | 28 | #define MAXRAND         (0x00FFFFFFL)   /* largest random number */
 | 
|---|
 | 29 | 
 | 
|---|
 | 30 | /* things defined elsewhere */
 | 
|---|
 | 31 | 
 | 
|---|
 | 32 | extern  int     (*point)(), fpuint(), setipl();
 | 
|---|
 | 33 | extern  int     cnvc2p();
 | 
|---|
 | 34 | 
 | 
|---|
 | 35 | extern  unsigned        tofpu(), fromfpu(), exp_c();
 | 
|---|
 | 36 | 
 | 
|---|
 | 37 | extern  char    *dsimlt();
 | 
|---|
 | 38 | 
 | 
|---|
 | 39 | extern  long    rand24();
 | 
|---|
 | 40 | 
 | 
|---|
 | 41 | /*  | 
|---|
 | 42 | 
 | 
|---|
 | 43 | */
 | 
|---|
 | 44 | 
 | 
|---|
 | 45 | extern  short   cxval, cyval, stcrow, stccol, initcfg;
 | 
|---|
 | 46 | extern  short   curslim, idimsw;
 | 
|---|
 | 47 | 
 | 
|---|
 | 48 | extern  unsigned        *obj0, *obj2;
 | 
|---|
 | 49 | 
 | 
|---|
 | 50 | extern  char    bfs[], *srctbl[], sfdsp[];
 | 
|---|
 | 51 | extern  char    vtlin1[], vtlin2[], vtlin3[];
 | 
|---|
 | 52 | 
 | 
|---|
 | 53 | extern  struct  sment   sments[];
 | 
|---|
 | 54 | extern  struct  valent  valents[];
 | 
|---|
 | 55 | extern  struct  sment   *vpsms[];
 | 
|---|
 | 56 | 
 | 
|---|
 | 57 | extern  short   s_inst[], vce2trg[], vce2grp[];
 | 
|---|
 | 58 | 
 | 
|---|
 | 59 | extern  short   curfunc;        /* current function number */
 | 
|---|
 | 60 | extern  short   curinst;        /* current instrument number */
 | 
|---|
 | 61 | extern  short   curpnt;         /* current point number (absolute) */
 | 
|---|
 | 62 | extern  short   curvce;         /* current voice number */
 | 
|---|
 | 63 | extern  short   idcfsw;         /* copy / fetch menu switch */
 | 
|---|
 | 64 | extern  short   idintmp;        /* temporary for instrument number */
 | 
|---|
 | 65 | extern  short   idnamsw;        /* typewriter switch */
 | 
|---|
 | 66 | extern  short   idsrcsw;        /* source menu switch */
 | 
|---|
 | 67 | extern  short   npts;           /* number of points in function */
 | 
|---|
 | 68 | extern  short   pecase;         /* point edit case variable */
 | 
|---|
 | 69 | extern  short   pntsv;          /* point selection state variable */
 | 
|---|
 | 70 | extern  short   subj;           /* edited point number (relative) */
 | 
|---|
 | 71 | extern  short   submenu;        /* submenu cursor switch */
 | 
|---|
 | 72 | extern  short   temax;          /* time upper limit */
 | 
|---|
 | 73 | extern  short   temin;          /* time lower limit */
 | 
|---|
 | 74 | extern  short   vlbtype;        /* type of message window display */
 | 
|---|
 | 75 | extern  short   wcflag;         /* ws/cf menu type */
 | 
|---|
 | 76 | extern  short   wcpage;         /* ws/cf menu page */
 | 
|---|
 | 77 | 
 | 
|---|
 | 78 | extern  short   instmod[12];    /* intrument data modified */
 | 
|---|
 | 79 | 
 | 
|---|
 | 80 | extern  unsigned *instob;       /* instrument object pointer */
 | 
|---|
 | 81 | 
 | 
|---|
 | 82 | extern  struct  octent *idoct;          /* instrument display octent pointer */
 | 
|---|
 | 83 | extern  struct  instpnt *pntptr;        /* pointer to edited point */
 | 
|---|
 | 84 | 
 | 
|---|
 | 85 | extern  struct  instdef idefs[NINST];   /* current instrument definitions */
 | 
|---|
 | 86 | extern  struct  instdef vbufs[12];      /* voice instrument buffers */
 | 
|---|
 | 87 | 
 | 
|---|
 | 88 | extern  char    *funcndx[256][2];       /* function header pointers */
 | 
|---|
 | 89 | extern  char    *vlbptr[3];             /* variable label pointers */
 | 
|---|
 | 90 | 
 | 
|---|
 | 91 | extern  char    idbuf[65];              /* display conversion work area */
 | 
|---|
 | 92 | 
 | 
|---|
 | 93 | /*  | 
|---|
 | 94 | 
 | 
|---|
 | 95 | */
 | 
|---|
 | 96 | 
 | 
|---|
 | 97 | /* forward references */
 | 
|---|
 | 98 | 
 | 
|---|
 | 99 | short   idpoint();
 | 
|---|
 | 100 | 
 | 
|---|
 | 101 | short   idbox[][8] = {  /* display box parameters */
 | 
|---|
 | 102 | 
 | 
|---|
 | 103 |         {  1,   1,  84,  26, CFBX00, CBBX00,  0,  1},   /*  0: Freq 1 */
 | 
|---|
 | 104 |         { 86,   1, 169,  26, CFBX01, CBBX01,  0, 11},   /*  1: Freq 2 */
 | 
|---|
 | 105 |         {171,   1, 254,  26, CFBX02, CBBX02,  0, 22},   /*  2: Freq 3 */
 | 
|---|
 | 106 |         {256,   1, 339,  26, CFBX03, CBBX03,  0, 33},   /*  3: Freq 4 */
 | 
|---|
 | 107 |         {341,   1, 424,  26, CFBX04, CBBX04,  0, 44},   /*  4: Filter / Resonance */
 | 
|---|
 | 108 |         {426,   1, 509,  26, CFBX05, CBBX05,  0, 54},   /*  5: Location */
 | 
|---|
 | 109 | 
 | 
|---|
 | 110 |         {  1,  29,  84,  54, CFBX06, CBBX06,  2,  1},   /*  6: Index 1 */
 | 
|---|
 | 111 |         { 86,  29, 169,  54, CFBX07, CBBX07,  2, 11},   /*  7: Index 2 */
 | 
|---|
 | 112 |         {171,  29, 254,  54, CFBX08, CBBX08,  2, 22},   /*  8: Index 3 */
 | 
|---|
 | 113 |         {256,  29, 339,  54, CFBX09, CBBX09,  2, 33},   /*  9: Index 4 */
 | 
|---|
 | 114 |         {341,  29, 424,  54, CFBX10, CBBX10,  2, 44},   /* 10: Index 5 */
 | 
|---|
 | 115 |         {426,  29, 509,  54, CFBX11, CBBX11,  2, 54},   /* 11: Index 6 */
 | 
|---|
 | 116 | 
 | 
|---|
 | 117 |         {  1,  56, 509, 208, CFBX12, CBBX12,  4, 54},   /* 12: Level */
 | 
|---|
 | 118 | 
 | 
|---|
 | 119 |         {  1, 210, 110, 236, CFBX13, CBBX13, 15,  1},   /* 13: Source- Mlt */
 | 
|---|
 | 120 |         {112, 210, 142, 236, CFBX14, CBBX14, 15, 15},   /* 14: Pt */
 | 
|---|
 | 121 |         {144, 210, 206, 236, CFBX15, CBBX15, 15, 19},   /* 15: Time */
 | 
|---|
 | 122 |         {208, 210, 366, 236, CFBX16, CBBX16, 15, 27},   /* 16: Value */
 | 
|---|
 | 123 |         {368, 210, 509, 236, CFBX17, CBBX17, 15, 47},   /* 17: Action */
 | 
|---|
 | 124 | 
 | 
|---|
 | 125 |         {  1, 238, 131, 348, CFBX18, CBBX18, 17,  2},   /* 18: Configuration */
 | 
|---|
 | 126 |         {133, 238, 267, 251, CFBX19, CBBX19, 17, 17},   /* 19: Voice & Inst */
 | 
|---|
 | 127 |         {269, 238, 379, 306, CFBX20, CBBX20, 17, 35},   /* 20: Oscillators */
 | 
|---|
 | 128 |         {381, 238, 509, 348, CFBX21, CBBX21, 17, 48},   /* 21: Waveshape */
 | 
|---|
 | 129 | 
 | 
|---|
 | 130 |         {133, 308, 379, 348, CFBX22, CBBX22, 22, 17},   /* 22: (messages) */
 | 
|---|
 | 131 | 
 | 
|---|
 | 132 |         {133, 252, 267, 306, CFBX23, CBBX23, 18, 17}    /* 23: Name & comments */
 | 
|---|
 | 133 | };
 | 
|---|
 | 134 | 
 | 
|---|
 | 135 | /*  | 
|---|
 | 136 | 
 | 
|---|
 | 137 | */
 | 
|---|
 | 138 | 
 | 
|---|
 | 139 | /* instrument function to FPU function table */
 | 
|---|
 | 140 | 
 | 
|---|
 | 141 | short   fnoff[NFINST] = {
 | 
|---|
 | 142 | 
 | 
|---|
 | 143 |         1,      /*  0: Freq 1 */
 | 
|---|
 | 144 |         3,      /*  1: Freq 2 */
 | 
|---|
 | 145 |         5,      /*  2: Freq 3 */
 | 
|---|
 | 146 |         7,      /*  3: Freq 4 */
 | 
|---|
 | 147 |         10,     /*  4: Filter / Resonance */
 | 
|---|
 | 148 |         4,      /*  5: Location */
 | 
|---|
 | 149 |         9,      /*  6: Index 1 */
 | 
|---|
 | 150 |         11,     /*  7: Index 2 */
 | 
|---|
 | 151 |         12,     /*  8: Index 3 */
 | 
|---|
 | 152 |         13,     /*  9: Index 4 */
 | 
|---|
 | 153 |         14,     /* 10: Index 5 */
 | 
|---|
 | 154 |         15,     /* 11: Index 6 */
 | 
|---|
 | 155 |         2       /* 12: Level */
 | 
|---|
 | 156 | };
 | 
|---|
 | 157 | 
 | 
|---|
 | 158 | short   inspal[16][3] = {       /* instrument display color palette */
 | 
|---|
 | 159 | 
 | 
|---|
 | 160 |         {0, 0, 0},      /*  0 */
 | 
|---|
 | 161 |         {3, 3, 3},      /*  1 */
 | 
|---|
 | 162 |         {2, 2, 2},      /*  2 */
 | 
|---|
 | 163 |         {3, 0, 0},      /*  3 */
 | 
|---|
 | 164 |         {0, 3, 2},      /*  4 */
 | 
|---|
 | 165 |         {0, 0, 1},      /*  5 */
 | 
|---|
 | 166 |         {0, 1, 1},      /*  6 */
 | 
|---|
 | 167 |         {1, 0, 1},      /*  7 */
 | 
|---|
 | 168 |         {3, 2, 0},      /*  8 */
 | 
|---|
 | 169 |         {1, 1, 2},      /*  9 */
 | 
|---|
 | 170 |         {2, 3, 0},      /* 10 */
 | 
|---|
 | 171 |         {2, 3, 3},      /* 11 */
 | 
|---|
 | 172 |         {3, 0, 2},      /* 12 */
 | 
|---|
 | 173 |         {0, 2, 3},      /* 13 */
 | 
|---|
 | 174 |         {0, 3, 0},      /* 14 */
 | 
|---|
 | 175 |         {3, 3, 0}       /* 15 */
 | 
|---|
 | 176 | };
 | 
|---|
 | 177 | 
 | 
|---|
 | 178 | /*  | 
|---|
 | 179 | 
 | 
|---|
 | 180 | */
 | 
|---|
 | 181 | 
 | 
|---|
 | 182 | char    *idbxlbl[] = {  /* display box labels */
 | 
|---|
 | 183 | 
 | 
|---|
 | 184 |         "    Frq 1",            /*  0 */
 | 
|---|
 | 185 |         "    Frq 2",            /*  1 */
 | 
|---|
 | 186 |         "    Frq 3",            /*  2 */
 | 
|---|
 | 187 |         "    Frq 4",            /*  3 */
 | 
|---|
 | 188 |         "    Filtr",            /*  4 */
 | 
|---|
 | 189 |         "    Loctn",            /*  5 */
 | 
|---|
 | 190 |         "    Ind 1",            /*  6 */
 | 
|---|
 | 191 |         "    Ind 2",            /*  7 */
 | 
|---|
 | 192 |         "    Ind 3",            /*  8 */
 | 
|---|
 | 193 |         "    Ind 4",            /*  9 */
 | 
|---|
 | 194 |         "    Ind 5",            /* 10 */
 | 
|---|
 | 195 |         "    Ind 6",            /* 11 */
 | 
|---|
 | 196 |         "    Level",            /* 12 */
 | 
|---|
 | 197 |         "Source  Mult",         /* 13 */
 | 
|---|
 | 198 |         "Pt",                   /* 14 */
 | 
|---|
 | 199 |         "Time  ",               /* 15 */
 | 
|---|
 | 200 |         "Value Source  Mult",   /* 16 */
 | 
|---|
 | 201 |         "Conditioned Acts",     /* 17 */
 | 
|---|
 | 202 |         "  Config  #",          /* 18 */
 | 
|---|
 | 203 |         "Voice    Inst",        /* 19 */
 | 
|---|
 | 204 |         "Oscillators",          /* 20 */
 | 
|---|
 | 205 |         "Wavshpe",              /* 21 */
 | 
|---|
 | 206 |         "",                     /* 22 */
 | 
|---|
 | 207 |         ""                      /* 23 */
 | 
|---|
 | 208 | };
 | 
|---|
 | 209 | 
 | 
|---|
 | 210 | char idhlbl[] =         /* main function time axis label */
 | 
|---|
 | 211 |         "       \324\302     \325\305     \326      \301      \302      \304      \310     \321\306    \323\302";
 | 
|---|
 | 212 | 
 | 
|---|
 | 213 | 
 | 
|---|
 | 214 | char    *osclbl[] = {   /* oscillator mode labels */
 | 
|---|
 | 215 |                         /* NOTE: must match values in instdsp.h */
 | 
|---|
 | 216 | 
 | 
|---|
 | 217 |         "Int",          /* 0:  OC_INT - Interval */
 | 
|---|
 | 218 |         "Rat",          /* 1:  OC_RAT - Ratio */
 | 
|---|
 | 219 |         "Frq",          /* 2:  OC_FRQ - Frequency */
 | 
|---|
 | 220 |         "Pch"           /* 3:  OC_PCH - Pitch */
 | 
|---|
 | 221 | };
 | 
|---|
 | 222 | 
 | 
|---|
 | 223 | /*  | 
|---|
 | 224 | 
 | 
|---|
 | 225 | */
 | 
|---|
 | 226 | 
 | 
|---|
 | 227 | long    rngdiv[] = {    /* divisors for ranges of 0..9 */
 | 
|---|
 | 228 | 
 | 
|---|
 | 229 |         MAXRAND,                /* 0..0 */
 | 
|---|
 | 230 |         MAXRAND / 2,            /* 0..1 */
 | 
|---|
 | 231 |         MAXRAND / 3,            /* 0..2 */
 | 
|---|
 | 232 |         MAXRAND / 4,            /* 0..3 */
 | 
|---|
 | 233 |         MAXRAND / 5,            /* 0..4 */
 | 
|---|
 | 234 |         MAXRAND / 6,            /* 0..5 */
 | 
|---|
 | 235 |         MAXRAND / 7,            /* 0..6 */
 | 
|---|
 | 236 |         MAXRAND / 8,            /* 0..7 */
 | 
|---|
 | 237 |         MAXRAND / 9,            /* 0..8 */
 | 
|---|
 | 238 |         MAXRAND / 10            /* 0..9 */
 | 
|---|
 | 239 | };
 | 
|---|
 | 240 | 
 | 
|---|
 | 241 | /*  | 
|---|
 | 242 | 
 | 
|---|
 | 243 | */
 | 
|---|
 | 244 | 
 | 
|---|
 | 245 | /*
 | 
|---|
 | 246 |    =============================================================================
 | 
|---|
 | 247 |         drawpt() -- draw a point as a cross
 | 
|---|
 | 248 |    =============================================================================
 | 
|---|
 | 249 | */
 | 
|---|
 | 250 | 
 | 
|---|
 | 251 | drawpt(px, py, pc)
 | 
|---|
 | 252 | short px, py, pc;
 | 
|---|
 | 253 | {
 | 
|---|
 | 254 |         register short tmp;
 | 
|---|
 | 255 | 
 | 
|---|
 | 256 |         tmp = px - 1;
 | 
|---|
 | 257 | 
 | 
|---|
 | 258 |         if (tmp > 7)
 | 
|---|
 | 259 |                 idpoint(tmp, py, pc);
 | 
|---|
 | 260 | 
 | 
|---|
 | 261 |         tmp = px + 1;
 | 
|---|
 | 262 | 
 | 
|---|
 | 263 |         if (tmp < 509)
 | 
|---|
 | 264 |                 idpoint(tmp, py, pc);
 | 
|---|
 | 265 | 
 | 
|---|
 | 266 |         tmp = py - 1;
 | 
|---|
 | 267 | 
 | 
|---|
 | 268 |         if (tmp > 55)
 | 
|---|
 | 269 |                 idpoint(px, tmp, pc);
 | 
|---|
 | 270 | 
 | 
|---|
 | 271 |         tmp = py + 1;
 | 
|---|
 | 272 | 
 | 
|---|
 | 273 |         if (tmp < 196)
 | 
|---|
 | 274 |                 idpoint(px, tmp, pc);
 | 
|---|
 | 275 | 
 | 
|---|
 | 276 |         idpoint(px, py, pc);
 | 
|---|
 | 277 | }
 | 
|---|
 | 278 | 
 | 
|---|
 | 279 | /*  | 
|---|
 | 280 | 
 | 
|---|
 | 281 | */
 | 
|---|
 | 282 | 
 | 
|---|
 | 283 | /*
 | 
|---|
 | 284 |    =============================================================================
 | 
|---|
 | 285 |         drawfn() -- draw a function
 | 
|---|
 | 286 |    =============================================================================
 | 
|---|
 | 287 | */
 | 
|---|
 | 288 | 
 | 
|---|
 | 289 | drawfn(fn, how, pen, wn)
 | 
|---|
 | 290 | short fn, how, pen, wn;
 | 
|---|
 | 291 | {
 | 
|---|
 | 292 |         struct idfnhdr *fp;
 | 
|---|
 | 293 |         struct instdef *ip;
 | 
|---|
 | 294 |         register struct instpnt *pt1, *pt2;
 | 
|---|
 | 295 |         register short i, npt1, npt2, xp;
 | 
|---|
 | 296 |         register unsigned color;
 | 
|---|
 | 297 |         short np, ptx, pty, ptc;
 | 
|---|
 | 298 | 
 | 
|---|
 | 299 |         ip = &vbufs[curvce];
 | 
|---|
 | 300 |         fp = &ip->idhfnc[fn];
 | 
|---|
 | 301 |         point = idpoint;
 | 
|---|
 | 302 | 
 | 
|---|
 | 303 |         np = fp->idfpif;        /* number of points in the function */
 | 
|---|
 | 304 |         xp = subj;              /* edit point */
 | 
|---|
 | 305 | 
 | 
|---|
 | 306 |         npt1 = 0;               /* left endpoint of line */
 | 
|---|
 | 307 |         npt2 = 1;               /* right endpoint of line */
 | 
|---|
 | 308 | 
 | 
|---|
 | 309 |         pt1 = &ip->idhpnt[fp->idfpt1];          /* left endpoint of line */
 | 
|---|
 | 310 |         pt2 = pt1 + 1;                          /* right endpoint of line */
 | 
|---|
 | 311 | 
 | 
|---|
 | 312 |         color = exp_c(pen);     /* replicate 4 bit 'pen' for 16 bit 'color' */
 | 
|---|
 | 313 | 
 | 
|---|
 | 314 | /*  | 
|---|
 | 315 | 
 | 
|---|
 | 316 | */
 | 
|---|
 | 317 |         ptx = ttox(timeto(fn, npt1), wn);
 | 
|---|
 | 318 |         pty = vtoy((pt1->ipval >> 5), wn);
 | 
|---|
 | 319 | 
 | 
|---|
 | 320 |         ptc = how ? ID_SELD :
 | 
|---|
 | 321 |                 ((pt1->ipact OR pt1->ipvsrc) ?
 | 
|---|
 | 322 |                         ID_ACTP : ID_CPNT);
 | 
|---|
 | 323 | 
 | 
|---|
 | 324 |         if (np EQ 1) {          /* single point ? */
 | 
|---|
 | 325 | 
 | 
|---|
 | 326 |                 if (wn EQ 12)
 | 
|---|
 | 327 |                         drawpt(ptx, pty, ptc);
 | 
|---|
 | 328 |                 else
 | 
|---|
 | 329 |                         idpoint(ptx, pty, ptc);
 | 
|---|
 | 330 |                 
 | 
|---|
 | 331 |                 return;
 | 
|---|
 | 332 |         }
 | 
|---|
 | 333 | 
 | 
|---|
 | 334 |         if (how AND (xp EQ 0))
 | 
|---|
 | 335 |                 if (wn EQ 12)
 | 
|---|
 | 336 |                         drawpt(ptx, pty, ID_SELD);
 | 
|---|
 | 337 |                 else
 | 
|---|
 | 338 |                         idpoint(ptx, pty, ID_SELD);
 | 
|---|
 | 339 | 
 | 
|---|
 | 340 |         for (i = 1; i < np; i++) {
 | 
|---|
 | 341 | 
 | 
|---|
 | 342 |                 ptx = ttox(timeto(fn, npt2), wn);
 | 
|---|
 | 343 |                 pty = vtoy((pt2->ipval >> 5), wn);
 | 
|---|
 | 344 | 
 | 
|---|
 | 345 |                 ptc = (pt2->ipact OR pt2->ipvsrc) ?
 | 
|---|
 | 346 |                         ID_ACTP : ID_CPNT;
 | 
|---|
 | 347 | 
 | 
|---|
 | 348 |                 if (how AND (xp EQ (i - 1))) {
 | 
|---|
 | 349 | 
 | 
|---|
 | 350 | 
 | 
|---|
 | 351 |                         if (wn EQ 12)
 | 
|---|
 | 352 |                                 drawpt(ptx, pty, ptc);
 | 
|---|
 | 353 |                         else
 | 
|---|
 | 354 |                                 idpoint(ptx, pty, ptc);
 | 
|---|
 | 355 | 
 | 
|---|
 | 356 |                 } else if (how AND (xp EQ i)) {
 | 
|---|
 | 357 | 
 | 
|---|
 | 358 |                         ptc = ID_SELD;
 | 
|---|
 | 359 | 
 | 
|---|
 | 360 |                         if (wn EQ 12)
 | 
|---|
 | 361 |                                 drawpt(ptx, pty, ptc);
 | 
|---|
 | 362 |                         else
 | 
|---|
 | 363 |                                 idpoint(ptx, pty, ptc);
 | 
|---|
 | 364 | /*  | 
|---|
 | 365 | 
 | 
|---|
 | 366 | */
 | 
|---|
 | 367 |                 } else {
 | 
|---|
 | 368 | 
 | 
|---|
 | 369 |                         lseg(ttox(timeto(fn, npt1), wn),
 | 
|---|
 | 370 |                                 vtoy((pt1->ipval >> 5), wn),
 | 
|---|
 | 371 |                                 ptx, pty, color);
 | 
|---|
 | 372 | 
 | 
|---|
 | 373 |                         if (wn EQ 12) {
 | 
|---|
 | 374 | 
 | 
|---|
 | 375 |                                 drawpt(ttox(timeto(fn, npt1), wn),
 | 
|---|
 | 376 |                                         vtoy((pt1->ipval >> 5), wn),
 | 
|---|
 | 377 |                                         (pt1->ipact OR pt1->ipvsrc) ?
 | 
|---|
 | 378 |                                          ID_ACTP : ID_CPNT);
 | 
|---|
 | 379 | 
 | 
|---|
 | 380 |                                 drawpt(ptx, pty, ptc);
 | 
|---|
 | 381 | 
 | 
|---|
 | 382 |                         } else {
 | 
|---|
 | 383 | 
 | 
|---|
 | 384 |                                 idpoint(ttox(timeto(fn, npt1), wn),
 | 
|---|
 | 385 |                                         vtoy((pt1->ipval >> 5), wn),
 | 
|---|
 | 386 |                                         (pt1->ipact OR pt1->ipvsrc) ?
 | 
|---|
 | 387 |                                          ID_ACTP : ID_CPNT);
 | 
|---|
 | 388 | 
 | 
|---|
 | 389 |                                 idpoint(ptx, pty, ptc);
 | 
|---|
 | 390 |                         }
 | 
|---|
 | 391 |                 }
 | 
|---|
 | 392 | 
 | 
|---|
 | 393 |                 npt1++;
 | 
|---|
 | 394 |                 npt2++;
 | 
|---|
 | 395 |                 pt1++;
 | 
|---|
 | 396 |                 pt2++;
 | 
|---|
 | 397 |         }
 | 
|---|
 | 398 | 
 | 
|---|
 | 399 |         return;
 | 
|---|
 | 400 | }
 | 
|---|
 | 401 | 
 | 
|---|
 | 402 | /*  | 
|---|
 | 403 | 
 | 
|---|
 | 404 | */
 | 
|---|
 | 405 | 
 | 
|---|
 | 406 | /*
 | 
|---|
 | 407 |    =============================================================================
 | 
|---|
 | 408 |         addpch() -- add an offset to a pitch function value
 | 
|---|
 | 409 |    =============================================================================
 | 
|---|
 | 410 | */
 | 
|---|
 | 411 | 
 | 
|---|
 | 412 | short
 | 
|---|
 | 413 | addpch(p1, p2)
 | 
|---|
 | 414 | short p1, p2;
 | 
|---|
 | 415 | {
 | 
|---|
 | 416 |         register long pl;
 | 
|---|
 | 417 | 
 | 
|---|
 | 418 |         pl = ((((long)p1 >> 5) - 500L) << LSPCH) + (long)p2;
 | 
|---|
 | 419 | 
 | 
|---|
 | 420 |         if (pl > PITCHMAX)
 | 
|---|
 | 421 |                 pl = PITCHMAX;
 | 
|---|
 | 422 | 
 | 
|---|
 | 423 |         return((short)pl);
 | 
|---|
 | 424 | }
 | 
|---|
 | 425 | 
 | 
|---|
 | 426 | /*  | 
|---|
 | 427 | 
 | 
|---|
 | 428 | */
 | 
|---|
 | 429 | 
 | 
|---|
 | 430 | /*
 | 
|---|
 | 431 |    =============================================================================
 | 
|---|
 | 432 |         irand() -- develop a random number in a given range
 | 
|---|
 | 433 |    =============================================================================
 | 
|---|
 | 434 | */
 | 
|---|
 | 435 | 
 | 
|---|
 | 436 | short
 | 
|---|
 | 437 | irand(range)
 | 
|---|
 | 438 | short range;
 | 
|---|
 | 439 | {
 | 
|---|
 | 440 |         if (range LE 0)         /* limit things to 'reasonable' values */
 | 
|---|
 | 441 |                 return(0);
 | 
|---|
 | 442 | 
 | 
|---|
 | 443 |         if (range > 9)          /* limit things to 'reasonable' values */
 | 
|---|
 | 444 |                 range = 9;
 | 
|---|
 | 445 | 
 | 
|---|
 | 446 |         return((short)(rand24() / rngdiv[range]));
 | 
|---|
 | 447 | }
 | 
|---|
 | 448 | 
 | 
|---|
 | 449 | /*  | 
|---|
 | 450 | 
 | 
|---|
 | 451 | */
 | 
|---|
 | 452 | 
 | 
|---|
 | 453 | /*
 | 
|---|
 | 454 |    =============================================================================
 | 
|---|
 | 455 |         xgetran() -- develop a random number
 | 
|---|
 | 456 |    =============================================================================
 | 
|---|
 | 457 | */
 | 
|---|
 | 458 | 
 | 
|---|
 | 459 | short
 | 
|---|
 | 460 | xgetran(mlt)
 | 
|---|
 | 461 | short mlt;
 | 
|---|
 | 462 | {
 | 
|---|
 | 463 |         register short sltmp;
 | 
|---|
 | 464 | 
 | 
|---|
 | 465 |         sltmp = (short)rand24();
 | 
|---|
 | 466 | 
 | 
|---|
 | 467 |         if (mlt < 0)
 | 
|---|
 | 468 |                 sltmp += (short)rand24();
 | 
|---|
 | 469 | 
 | 
|---|
 | 470 |         return(sltmp);
 | 
|---|
 | 471 | }
 | 
|---|
 | 472 | 
 | 
|---|
 | 473 | /*  | 
|---|
 | 474 | 
 | 
|---|
 | 475 | */
 | 
|---|
 | 476 | 
 | 
|---|
 | 477 | /*
 | 
|---|
 | 478 |    =============================================================================
 | 
|---|
 | 479 |         dosync() -- update sync and configuration register
 | 
|---|
 | 480 |    =============================================================================
 | 
|---|
 | 481 | */
 | 
|---|
 | 482 | 
 | 
|---|
 | 483 | dosync(vce)
 | 
|---|
 | 484 | short vce;
 | 
|---|
 | 485 | {
 | 
|---|
 | 486 |         register short sync;
 | 
|---|
 | 487 |         register struct instdef *ip;
 | 
|---|
 | 488 | 
 | 
|---|
 | 489 |         ip = &vbufs[vce];
 | 
|---|
 | 490 |         sync = ip->idhcfg << 8;
 | 
|---|
 | 491 | 
 | 
|---|
 | 492 |         if (ip->idhos1c & OC_SYN)
 | 
|---|
 | 493 |                 sync |= 0x2000;
 | 
|---|
 | 494 | 
 | 
|---|
 | 495 |         if (ip->idhos2c & OC_SYN)
 | 
|---|
 | 496 |                 sync |= 0x4000;
 | 
|---|
 | 497 | 
 | 
|---|
 | 498 |         if (ip->idhos3c & OC_SYN)
 | 
|---|
 | 499 |                 sync |= 0x8000;
 | 
|---|
 | 500 | 
 | 
|---|
 | 501 |         *(io_fpu + vce + (long)FPU_OCFG) = sync;
 | 
|---|
 | 502 | }
 | 
|---|
 | 503 | 
 | 
|---|
 | 504 | /*  | 
|---|
 | 505 | 
 | 
|---|
 | 506 | */
 | 
|---|
 | 507 | 
 | 
|---|
 | 508 | /*
 | 
|---|
 | 509 |    =============================================================================
 | 
|---|
 | 510 |         oscdsp() -- display an oscillator frequency specification
 | 
|---|
 | 511 |    =============================================================================
 | 
|---|
 | 512 | */
 | 
|---|
 | 513 | 
 | 
|---|
 | 514 | oscdsp(row, val, n, lbl, frq)
 | 
|---|
 | 515 | short row, val, n, frq;
 | 
|---|
 | 516 | char *lbl;
 | 
|---|
 | 517 | {
 | 
|---|
 | 518 |                 register short fh, fl;
 | 
|---|
 | 519 | 
 | 
|---|
 | 520 |                 tsplot4(instob, 64, idbox[n][4], row, 34, lbl, 14);
 | 
|---|
 | 521 |                 tsplot4(instob, 64, idbox[n][4], row, 36, osclbl[val & 3], 14);
 | 
|---|
 | 522 | 
 | 
|---|
 | 523 |                 switch (val & 3) {
 | 
|---|
 | 524 | 
 | 
|---|
 | 525 |                 case OC_INT:    /* interval */
 | 
|---|
 | 526 | 
 | 
|---|
 | 527 |                         sprintf(idbuf, "%c%04d", (frq < 0 ? '-' : '+'),
 | 
|---|
 | 528 |                                 ((frq < 0 ? -frq : frq) >> 1));
 | 
|---|
 | 529 | 
 | 
|---|
 | 530 |                         break;
 | 
|---|
 | 531 | 
 | 
|---|
 | 532 |                 case OC_RAT:    /* ratio */
 | 
|---|
 | 533 | 
 | 
|---|
 | 534 |                         int2rat(frq >> 1);
 | 
|---|
 | 535 | 
 | 
|---|
 | 536 |                         ebflag = FALSE;
 | 
|---|
 | 537 | 
 | 
|---|
 | 538 |                         idbuf[0] = ebuf[0];
 | 
|---|
 | 539 |                         idbuf[1] = ebuf[1];
 | 
|---|
 | 540 |                         idbuf[2] = ebuf[2];
 | 
|---|
 | 541 |                         idbuf[3] = '\0';
 | 
|---|
 | 542 | 
 | 
|---|
 | 543 |                         break;
 | 
|---|
 | 544 | 
 | 
|---|
 | 545 |                 case OC_FRQ:    /* frequency */
 | 
|---|
 | 546 | 
 | 
|---|
 | 547 |                         fh = (frq >> 1) / 10;
 | 
|---|
 | 548 |                         fl = (frq >> 1) - (fh * 10);
 | 
|---|
 | 549 | 
 | 
|---|
 | 550 |                         sprintf(idbuf, "%02d.%d ", fh, fl);
 | 
|---|
 | 551 |                         break;
 | 
|---|
 | 552 | /*  | 
|---|
 | 553 | 
 | 
|---|
 | 554 | */
 | 
|---|
 | 555 |                 case OC_PCH:
 | 
|---|
 | 556 | 
 | 
|---|
 | 557 |                         cnvc2p(idbuf, (frq >> 1));
 | 
|---|
 | 558 |                         idbuf[0] += '0';
 | 
|---|
 | 559 |                         idbuf[1] += 'A';
 | 
|---|
 | 560 |                         idbuf[2] = sfdsp[idbuf[2]];
 | 
|---|
 | 561 |                         idbuf[3] += '0';
 | 
|---|
 | 562 |                         idbuf[4] += '0';
 | 
|---|
 | 563 |                         idbuf[5] = '\0';
 | 
|---|
 | 564 |                         break;
 | 
|---|
 | 565 |                 }
 | 
|---|
 | 566 | 
 | 
|---|
 | 567 |                 tsplot4(instob, 64, idbox[n][4], row, 40, idbuf, 14);
 | 
|---|
 | 568 | 
 | 
|---|
 | 569 |                 if (row NE 21)
 | 
|---|
 | 570 |                         tsplot4(instob, 64, idbox[n][4], row, 46,
 | 
|---|
 | 571 |                                 ((val & OC_SYN) ? "S" : "s"), 14);
 | 
|---|
 | 572 | }
 | 
|---|
 | 573 | 
 | 
|---|
 | 574 | /*  | 
|---|
 | 575 | 
 | 
|---|
 | 576 | */
 | 
|---|
 | 577 | 
 | 
|---|
 | 578 | /*
 | 
|---|
 | 579 |    =============================================================================
 | 
|---|
 | 580 |         pltws() -- plot a small waveshape display
 | 
|---|
 | 581 |    =============================================================================
 | 
|---|
 | 582 | */
 | 
|---|
 | 583 | 
 | 
|---|
 | 584 | pltws(ws, pen)
 | 
|---|
 | 585 | register unsigned ws[];
 | 
|---|
 | 586 | register short pen;
 | 
|---|
 | 587 | {
 | 
|---|
 | 588 |         register short i, x, y;
 | 
|---|
 | 589 | 
 | 
|---|
 | 590 |         for (i = 1; i < 254; i++) {
 | 
|---|
 | 591 | 
 | 
|---|
 | 592 |                 x = 382 + (i >> 1);
 | 
|---|
 | 593 |                 y = 348 - ((ws[i] ^ 0x8000) / 676);
 | 
|---|
 | 594 | 
 | 
|---|
 | 595 |                 idpoint(x, y, pen);
 | 
|---|
 | 596 |         }
 | 
|---|
 | 597 | }
 | 
|---|
 | 598 | 
 | 
|---|
 | 599 | /*  | 
|---|
 | 600 | 
 | 
|---|
 | 601 | */
 | 
|---|
 | 602 | 
 | 
|---|
 | 603 | /*
 | 
|---|
 | 604 |    =============================================================================
 | 
|---|
 | 605 |         dswin() -- display a window
 | 
|---|
 | 606 |    =============================================================================
 | 
|---|
 | 607 | */
 | 
|---|
 | 608 | 
 | 
|---|
 | 609 | dswin(n)
 | 
|---|
 | 610 | register short n;
 | 
|---|
 | 611 | {
 | 
|---|
 | 612 |         short th, tl, vh, vl, vv, mltval, lboff;
 | 
|---|
 | 613 |         char *s1, mltstr[6], mltsgn;
 | 
|---|
 | 614 |         long tt, sc;
 | 
|---|
 | 615 |         register short cx, pnt, par;
 | 
|---|
 | 616 |         register struct instdef *ip;
 | 
|---|
 | 617 |         register struct idfnhdr *fp;
 | 
|---|
 | 618 |         register struct instpnt *pp;
 | 
|---|
 | 619 | 
 | 
|---|
 | 620 |         if (wcflag NE -1)
 | 
|---|
 | 621 |                 return;
 | 
|---|
 | 622 | 
 | 
|---|
 | 623 |         if (idimsw AND (n NE 19) AND (n < 22))
 | 
|---|
 | 624 |                 return;
 | 
|---|
 | 625 | 
 | 
|---|
 | 626 |         ip = &vbufs[curvce];
 | 
|---|
 | 627 | 
 | 
|---|
 | 628 |         fp = &ip->idhfnc[n LE 12 ? n : curfunc];
 | 
|---|
 | 629 | 
 | 
|---|
 | 630 |         curpnt = subj + fp->idfpt1;
 | 
|---|
 | 631 |         pp = &ip->idhpnt[curpnt];
 | 
|---|
 | 632 | 
 | 
|---|
 | 633 |         cx = idbox[n][5];
 | 
|---|
 | 634 |         cx |= cx << 4;
 | 
|---|
 | 635 |         cx |= cx << 8;
 | 
|---|
 | 636 | 
 | 
|---|
 | 637 | /*  | 
|---|
 | 638 | 
 | 
|---|
 | 639 | */
 | 
|---|
 | 640 | 
 | 
|---|
 | 641 |         /* first, fill the box with the background color */
 | 
|---|
 | 642 | 
 | 
|---|
 | 643 |         if (v_regs[5] & 0x0180)
 | 
|---|
 | 644 |                 vbank(0);
 | 
|---|
 | 645 | 
 | 
|---|
 | 646 |         vbfill4(instob, 128, idbox[n][0], idbox[n][1], idbox[n][2], idbox[n][3], cx);
 | 
|---|
 | 647 | 
 | 
|---|
 | 648 |         if (n < 12)             /* draw the function if it's a label window */
 | 
|---|
 | 649 |                 drawfn(n, 0, ID_CLIN, n);
 | 
|---|
 | 650 | 
 | 
|---|
 | 651 |         /* put in the box label */
 | 
|---|
 | 652 | 
 | 
|---|
 | 653 |         if (n GT 12) {
 | 
|---|
 | 654 | 
 | 
|---|
 | 655 |                 tsplot4(instob, 64, idbox[n][4], idbox[n][6], idbox[n][7],
 | 
|---|
 | 656 |                         idbxlbl[n], 14);
 | 
|---|
 | 657 | 
 | 
|---|
 | 658 |         } else {
 | 
|---|
 | 659 | 
 | 
|---|
 | 660 |                 tsplot4(instob, 64,
 | 
|---|
 | 661 |                         ((ip->idhfnc[n].idftmd & I_TM_KEY) ?  idbox[n][4] : ID_INST),
 | 
|---|
 | 662 |                         idbox[n][6], idbox[n][7], idbxlbl[n], 14);
 | 
|---|
 | 663 |         }
 | 
|---|
 | 664 | 
 | 
|---|
 | 665 | /*  | 
|---|
 | 666 | 
 | 
|---|
 | 667 | */
 | 
|---|
 | 668 |         switch (n) {    /* final text - overlays above stuff */
 | 
|---|
 | 669 | 
 | 
|---|
 | 670 |         case 12:        /* level */
 | 
|---|
 | 671 | 
 | 
|---|
 | 672 |                 /* x labels */
 | 
|---|
 | 673 | 
 | 
|---|
 | 674 |                 tsplot4(instob, 64, TGRID, 14, 0, idhlbl, 14);
 | 
|---|
 | 675 | 
 | 
|---|
 | 676 |                 /* y labels */
 | 
|---|
 | 677 | 
 | 
|---|
 | 678 |                 tsplot4(instob, 64, TGRID, 14, 0, "\300", 14);
 | 
|---|
 | 679 |                 tsplot4(instob, 64, TGRID, 12, 0, "\302", 14);
 | 
|---|
 | 680 |                 tsplot4(instob, 64, TGRID, 10, 0, "\304", 14);
 | 
|---|
 | 681 |                 tsplot4(instob, 64, TGRID,  8, 0, "\306", 14);
 | 
|---|
 | 682 |                 tsplot4(instob, 64, TGRID,  6, 0, "\310", 14);
 | 
|---|
 | 683 |                 tsplot4(instob, 64, TGRID,  4, 0, "\312", 14);
 | 
|---|
 | 684 | 
 | 
|---|
 | 685 |                 lseg( 7,  56,   7, 196, LGRID);         /* draw the grid */
 | 
|---|
 | 686 |                 lseg( 7, 196, 509, 196, LGRID);
 | 
|---|
 | 687 | 
 | 
|---|
 | 688 |                 drawfn(12, 0, ID_CLIN, 12);             /* draw the function */
 | 
|---|
 | 689 | 
 | 
|---|
 | 690 |                 return;
 | 
|---|
 | 691 | 
 | 
|---|
 | 692 |         case 13:        /* source - multiplier */
 | 
|---|
 | 693 | 
 | 
|---|
 | 694 |                 dsimlt(bfs, fp->idfsrc, fp->idfmlt);
 | 
|---|
 | 695 | 
 | 
|---|
 | 696 |                 tsplot4(instob, 64, idbox[n][4],
 | 
|---|
 | 697 |                         idbox[n][6]+1, idbox[n][7], bfs, 14);
 | 
|---|
 | 698 |                 return;
 | 
|---|
 | 699 | 
 | 
|---|
 | 700 |         case 14:        /* point number */
 | 
|---|
 | 701 | 
 | 
|---|
 | 702 |                 sprintf(bfs, "%02d", subj);
 | 
|---|
 | 703 | 
 | 
|---|
 | 704 |                 tsplot4(instob, 64, idbox[n][4], idbox[n][6]+1, idbox[n][7], bfs, 14);
 | 
|---|
 | 705 | 
 | 
|---|
 | 706 |                 return;
 | 
|---|
 | 707 | /*  | 
|---|
 | 708 | 
 | 
|---|
 | 709 | */
 | 
|---|
 | 710 |         case 15:        /* time */
 | 
|---|
 | 711 | 
 | 
|---|
 | 712 |                 sc = 1000L;
 | 
|---|
 | 713 |                 tt = timeto(curfunc, subj);
 | 
|---|
 | 714 |                 th = tt / sc;
 | 
|---|
 | 715 |                 tl = tt - (th * sc);
 | 
|---|
 | 716 | 
 | 
|---|
 | 717 |                 sprintf(bfs, "%02d.%03d", th, tl);
 | 
|---|
 | 718 |                 tsplot4(instob, 64, idbox[n][4], idbox[n][6] + 1,
 | 
|---|
 | 719 |                         idbox[n][7], bfs, 14);
 | 
|---|
 | 720 | 
 | 
|---|
 | 721 |                 return;
 | 
|---|
 | 722 | 
 | 
|---|
 | 723 |         case 16:        /* value */
 | 
|---|
 | 724 | 
 | 
|---|
 | 725 |                 vv = pp->ipval >> 5;
 | 
|---|
 | 726 |                 vh = vv / 100;
 | 
|---|
 | 727 |                 vl = vv - (vh * 100);
 | 
|---|
 | 728 | 
 | 
|---|
 | 729 |                 sprintf(bfs, "%02d.%02d ", vh, vl);
 | 
|---|
 | 730 | 
 | 
|---|
 | 731 |                 dsimlt(&bfs[6], pp->ipvsrc, pp->ipvmlt);
 | 
|---|
 | 732 | 
 | 
|---|
 | 733 |                 tsplot4(instob, 64, idbox[n][4], idbox[n][6] + 1,
 | 
|---|
 | 734 |                         idbox[n][7], bfs, 14);
 | 
|---|
 | 735 | 
 | 
|---|
 | 736 |                 return;
 | 
|---|
 | 737 | 
 | 
|---|
 | 738 | /*  | 
|---|
 | 739 | 
 | 
|---|
 | 740 | */
 | 
|---|
 | 741 |         case 17:        /* action */
 | 
|---|
 | 742 | 
 | 
|---|
 | 743 |                 pnt = pp->ippar1;
 | 
|---|
 | 744 |                 par = pp->ippar2;
 | 
|---|
 | 745 | 
 | 
|---|
 | 746 |                 switch (pp->ipact) {
 | 
|---|
 | 747 | 
 | 
|---|
 | 748 |                 case AC_NULL:
 | 
|---|
 | 749 | 
 | 
|---|
 | 750 |                         s1 = "                ";
 | 
|---|
 | 751 |                         break;
 | 
|---|
 | 752 | 
 | 
|---|
 | 753 |                 case AC_SUST:
 | 
|---|
 | 754 | 
 | 
|---|
 | 755 |                         sprintf(bfs, "Pause if key %c  ", SP_DNA);
 | 
|---|
 | 756 |                         s1 = bfs;
 | 
|---|
 | 757 |                         break;
 | 
|---|
 | 758 | 
 | 
|---|
 | 759 |                 case AC_ENBL:
 | 
|---|
 | 760 | 
 | 
|---|
 | 761 |                         sprintf(bfs, "Stop if key %c   ", SP_UPA);
 | 
|---|
 | 762 |                         s1 = bfs;
 | 
|---|
 | 763 |                         break;
 | 
|---|
 | 764 | 
 | 
|---|
 | 765 |                 case AC_JUMP:
 | 
|---|
 | 766 | 
 | 
|---|
 | 767 |                         sprintf(bfs, "GoTo %02d forever ", pnt);
 | 
|---|
 | 768 |                         s1 = bfs;
 | 
|---|
 | 769 |                         break;
 | 
|---|
 | 770 | 
 | 
|---|
 | 771 | /*  | 
|---|
 | 772 | 
 | 
|---|
 | 773 | */
 | 
|---|
 | 774 |                 case AC_LOOP:
 | 
|---|
 | 775 | 
 | 
|---|
 | 776 |                         sprintf(bfs, "GoTo %02d %02d times", pnt, par);
 | 
|---|
 | 777 | 
 | 
|---|
 | 778 |                         if (bfs[8] EQ '9')              /* random */
 | 
|---|
 | 779 |                                 bfs[8] = 'R';
 | 
|---|
 | 780 | 
 | 
|---|
 | 781 |                         s1 = bfs;
 | 
|---|
 | 782 |                         break;
 | 
|---|
 | 783 | 
 | 
|---|
 | 784 |                 case AC_KYUP:
 | 
|---|
 | 785 | 
 | 
|---|
 | 786 |                         sprintf(bfs, "GoTo %02d if key %c",
 | 
|---|
 | 787 |                                 pnt, SP_UPA);
 | 
|---|
 | 788 |                         s1 = bfs;
 | 
|---|
 | 789 |                         break;
 | 
|---|
 | 790 | 
 | 
|---|
 | 791 |                 case AC_KYDN:
 | 
|---|
 | 792 | 
 | 
|---|
 | 793 |                         sprintf(bfs, "GoTo %02d if key %c",
 | 
|---|
 | 794 |                                 pnt, SP_DNA);
 | 
|---|
 | 795 |                         s1 = bfs;
 | 
|---|
 | 796 |                         break;
 | 
|---|
 | 797 | 
 | 
|---|
 | 798 |                 default:
 | 
|---|
 | 799 | 
 | 
|---|
 | 800 |                         s1 = "????????????????";
 | 
|---|
 | 801 |                         break;
 | 
|---|
 | 802 |                 }
 | 
|---|
 | 803 | 
 | 
|---|
 | 804 |                 tsplot4(instob, 64, idbox[n][4], idbox[n][6] + 1,
 | 
|---|
 | 805 |                         idbox[n][7], s1, 14);
 | 
|---|
 | 806 | 
 | 
|---|
 | 807 |                 return;
 | 
|---|
 | 808 | 
 | 
|---|
 | 809 | /*  | 
|---|
 | 810 | 
 | 
|---|
 | 811 | */
 | 
|---|
 | 812 | 
 | 
|---|
 | 813 |         case 18:        /* configuration */
 | 
|---|
 | 814 | 
 | 
|---|
 | 815 |                 showcfg(ip->idhcfg);
 | 
|---|
 | 816 |                 return;
 | 
|---|
 | 817 | 
 | 
|---|
 | 818 |         case 19:        /* voice & instrument */
 | 
|---|
 | 819 | 
 | 
|---|
 | 820 |                 sprintf(idbuf, "%02d", curvce + 1);
 | 
|---|
 | 821 |                 tsplot4(instob, 64, idbox[n][4], 17, 23, idbuf, 14);
 | 
|---|
 | 822 | 
 | 
|---|
 | 823 |                 sprintf(idbuf, "%02d", curinst);
 | 
|---|
 | 824 |                 tsplot4(instob, 64, (instmod[curvce] ? ID_CHGD :idbox[n][4]),
 | 
|---|
 | 825 |                         17, 31, idbuf, 14);
 | 
|---|
 | 826 | 
 | 
|---|
 | 827 |                 return;
 | 
|---|
 | 828 | 
 | 
|---|
 | 829 |         case 20:        /* oscillators */
 | 
|---|
 | 830 | 
 | 
|---|
 | 831 |                 oscdsp(18, ip->idhos1c, n, "1", ip->idhos1v);
 | 
|---|
 | 832 |                 oscdsp(19, ip->idhos2c, n, "2", ip->idhos2v);
 | 
|---|
 | 833 |                 oscdsp(20, ip->idhos3c, n, "3", ip->idhos3v);
 | 
|---|
 | 834 |                 oscdsp(21, ip->idhos4c, n, "4", ip->idhos4v);
 | 
|---|
 | 835 | 
 | 
|---|
 | 836 |                 return;
 | 
|---|
 | 837 | 
 | 
|---|
 | 838 |         case 21:        /* waveshapes */
 | 
|---|
 | 839 | 
 | 
|---|
 | 840 |                 sprintf(idbuf, "A%02d", ip->idhwsa + 1);
 | 
|---|
 | 841 |                 tsplot4(instob, 64, WSAFC, 17, 56, idbuf, 14);
 | 
|---|
 | 842 |                 pltws(ip->idhwvaf, WSAFC);
 | 
|---|
 | 843 | 
 | 
|---|
 | 844 |                 sprintf(idbuf, "B%02d", ip->idhwsb + 1);
 | 
|---|
 | 845 |                 tsplot4(instob, 64, WSBFC, 17, 60, idbuf, 14);
 | 
|---|
 | 846 |                 pltws(ip->idhwvbf, WSBFC);
 | 
|---|
 | 847 | 
 | 
|---|
 | 848 |                 return;
 | 
|---|
 | 849 | /*  | 
|---|
 | 850 | 
 | 
|---|
 | 851 | */
 | 
|---|
 | 852 |         case 22:        /* message window */
 | 
|---|
 | 853 | 
 | 
|---|
 | 854 |                 tsplot4(instob, 64, idbox[n][4], 22, 17, vlbptr[0], 14);
 | 
|---|
 | 855 |                 tsplot4(instob, 64, idbox[n][4], 23, 17, vlbptr[1], 14);
 | 
|---|
 | 856 |                 tsplot4(instob, 64, idbox[n][4], 24, 17, vlbptr[2], 14);
 | 
|---|
 | 857 | 
 | 
|---|
 | 858 |                 if (idsrcsw) {
 | 
|---|
 | 859 | 
 | 
|---|
 | 860 |                         point = idpoint;
 | 
|---|
 | 861 | 
 | 
|---|
 | 862 |                         lseg(196, 308, 196, 348, CBORD);
 | 
|---|
 | 863 |                         lseg(260, 308, 260, 348, CBORD);
 | 
|---|
 | 864 |                         lseg(324, 308, 324, 348, CBORD);
 | 
|---|
 | 865 |                 }
 | 
|---|
 | 866 | 
 | 
|---|
 | 867 |                 return;
 | 
|---|
 | 868 | 
 | 
|---|
 | 869 |         case 23:        /* Name and comments */
 | 
|---|
 | 870 | 
 | 
|---|
 | 871 |                 tsplot4(instob, 64, idbox[n][4], 18, 17, ip->idhname, 14);
 | 
|---|
 | 872 |                 tsplot4(instob, 64, idbox[n][4], 19, 17, ip->idhcom1, 14);
 | 
|---|
 | 873 |                 tsplot4(instob, 64, idbox[n][4], 20, 17, ip->idhcom2, 14);
 | 
|---|
 | 874 |                 tsplot4(instob, 64, idbox[n][4], 21, 17, ip->idhcom3, 14);
 | 
|---|
 | 875 | 
 | 
|---|
 | 876 |                 return;
 | 
|---|
 | 877 |         }
 | 
|---|
 | 878 | }
 | 
|---|
 | 879 | 
 | 
|---|
 | 880 | /*  | 
|---|
 | 881 | 
 | 
|---|
 | 882 | */
 | 
|---|
 | 883 | 
 | 
|---|
 | 884 | /*
 | 
|---|
 | 885 |    =============================================================================
 | 
|---|
 | 886 |         allwins() -- display all windows
 | 
|---|
 | 887 |    =============================================================================
 | 
|---|
 | 888 | */
 | 
|---|
 | 889 | 
 | 
|---|
 | 890 | allwins()
 | 
|---|
 | 891 | {
 | 
|---|
 | 892 |         register short i;
 | 
|---|
 | 893 | 
 | 
|---|
 | 894 |         for (i = 0; i < 24; i++)
 | 
|---|
 | 895 |                 dswin(i);
 | 
|---|
 | 896 | }
 | 
|---|
 | 897 | 
 | 
|---|
 | 898 | /*
 | 
|---|
 | 899 |    =============================================================================
 | 
|---|
 | 900 |         idpoint() -- plot a point for the lseg function
 | 
|---|
 | 901 |    =============================================================================
 | 
|---|
 | 902 | */
 | 
|---|
 | 903 | 
 | 
|---|
 | 904 | idpoint(x, y, pen)
 | 
|---|
 | 905 | short x, y, pen;
 | 
|---|
 | 906 | {
 | 
|---|
 | 907 |         if (v_regs[5] & 0x0180)
 | 
|---|
 | 908 |                 vbank(0);
 | 
|---|
 | 909 | 
 | 
|---|
 | 910 |         vputp(idoct, x, y, pen);
 | 
|---|
 | 911 | }
 | 
|---|
 | 912 | 
 | 
|---|
 | 913 | /*  | 
|---|
 | 914 | 
 | 
|---|
 | 915 | */
 | 
|---|
 | 916 | 
 | 
|---|
 | 917 | /*
 | 
|---|
 | 918 |    =============================================================================
 | 
|---|
 | 919 |         idbord() -- draw the border for the instrument display
 | 
|---|
 | 920 |    =============================================================================
 | 
|---|
 | 921 | */
 | 
|---|
 | 922 | 
 | 
|---|
 | 923 | idbord()
 | 
|---|
 | 924 | {
 | 
|---|
 | 925 |         point = idpoint;
 | 
|---|
 | 926 | 
 | 
|---|
 | 927 |         lseg(  0,   0, 510,   0, CBORD);        /* outer border */
 | 
|---|
 | 928 |         lseg(510,   0, 510, 349, CBORD);
 | 
|---|
 | 929 |         lseg(510, 349,   0, 349, CBORD);
 | 
|---|
 | 930 |         lseg(  0, 349,   0,   0, CBORD);
 | 
|---|
 | 931 | 
 | 
|---|
 | 932 |         lseg(  0,  27, 510,  27, CBORD);        /* label widows - H lines */
 | 
|---|
 | 933 |         lseg(  0,  55, 510,  55, CBORD);
 | 
|---|
 | 934 | 
 | 
|---|
 | 935 |         lseg( 85,   1,  85,  54, CBORD);        /* label windows - V lines */
 | 
|---|
 | 936 |         lseg(170,   1, 170,  54, CBORD);
 | 
|---|
 | 937 |         lseg(255,   1, 255,  54, CBORD);
 | 
|---|
 | 938 |         lseg(340,   1, 340,  54, CBORD);
 | 
|---|
 | 939 |         lseg(425,   1, 425,  54, CBORD);
 | 
|---|
 | 940 | 
 | 
|---|
 | 941 |         lseg(  0, 209, 510, 209, CBORD);        /* S/M, Time, Val - H lines */
 | 
|---|
 | 942 |         lseg(  0, 237, 510, 237, CBORD);
 | 
|---|
 | 943 | 
 | 
|---|
 | 944 |         lseg(111, 210, 111, 236, CBORD);        /* S/M, Time, Val - V lines */
 | 
|---|
 | 945 |         lseg(143, 210, 143, 236, CBORD);
 | 
|---|
 | 946 |         lseg(207, 210, 207, 236, CBORD);
 | 
|---|
 | 947 |         lseg(367, 210, 367, 236, CBORD);
 | 
|---|
 | 948 | 
 | 
|---|
 | 949 |         lseg(132, 238, 132, 349, CBORD);        /* Voice, Osc, Vars */
 | 
|---|
 | 950 |         lseg(380, 238, 380, 349, CBORD);
 | 
|---|
 | 951 |         lseg(132, 307, 380, 307, CBORD);
 | 
|---|
 | 952 |         lseg(268, 238, 268, 306, CBORD);
 | 
|---|
 | 953 | }
 | 
|---|
 | 954 | 
 | 
|---|
 | 955 | /*  | 
|---|
 | 956 | 
 | 
|---|
 | 957 | */
 | 
|---|
 | 958 | 
 | 
|---|
 | 959 | /*
 | 
|---|
 | 960 |    =============================================================================
 | 
|---|
 | 961 |         idvlblc() -- clear the message window
 | 
|---|
 | 962 |    =============================================================================
 | 
|---|
 | 963 | */
 | 
|---|
 | 964 | 
 | 
|---|
 | 965 | idvlblc()
 | 
|---|
 | 966 | {
 | 
|---|
 | 967 |         vlbtype = 0;    /* nothing in the message window */
 | 
|---|
 | 968 | 
 | 
|---|
 | 969 |         vlbptr[0] = vlbptr[1] = vlbptr[2] = "                              ";
 | 
|---|
 | 970 | }
 | 
|---|
 | 971 | 
 | 
|---|
 | 972 | /*
 | 
|---|
 | 973 |    =============================================================================
 | 
|---|
 | 974 |         idvlbld() -- put the labels in the message window
 | 
|---|
 | 975 |    =============================================================================
 | 
|---|
 | 976 | */
 | 
|---|
 | 977 | 
 | 
|---|
 | 978 | idvlbld()
 | 
|---|
 | 979 | {
 | 
|---|
 | 980 |         vlbtype = 1;    /* variable labels */
 | 
|---|
 | 981 | 
 | 
|---|
 | 982 | /*                  "123456789012345678901234567890"  */
 | 
|---|
 | 983 | 
 | 
|---|
 | 984 |         vlbptr[0] = "PchW/HT Pch/Frq Random  GPC/V1";
 | 
|---|
 | 985 |         vlbptr[1] = "ModW/VT Key Vel Pedal 1       ";
 | 
|---|
 | 986 |         vlbptr[2] = "Brth/LP Key Prs               ";
 | 
|---|
 | 987 | }
 | 
|---|
 | 988 | 
 | 
|---|
 | 989 | /*  | 
|---|
 | 990 | 
 | 
|---|
 | 991 | */
 | 
|---|
 | 992 | 
 | 
|---|
 | 993 | /*
 | 
|---|
 | 994 |    =============================================================================
 | 
|---|
 | 995 |         idvtyp() -- display the virtual typewriter in the message window
 | 
|---|
 | 996 |    =============================================================================
 | 
|---|
 | 997 | */
 | 
|---|
 | 998 | 
 | 
|---|
 | 999 | idvtyp()
 | 
|---|
 | 1000 | {
 | 
|---|
 | 1001 |         vlbtype = 2;    /* virtual typewriter */
 | 
|---|
 | 1002 | 
 | 
|---|
 | 1003 |         vlbptr[0] = vtlin1;
 | 
|---|
 | 1004 |         vlbptr[1] = vtlin2;
 | 
|---|
 | 1005 |         vlbptr[2] = vtlin3;
 | 
|---|
 | 1006 | }
 | 
|---|
 | 1007 | 
 | 
|---|
 | 1008 | /*
 | 
|---|
 | 1009 |    =============================================================================
 | 
|---|
 | 1010 |         idcpfch() -- display the copy / fetch menu in the message window
 | 
|---|
 | 1011 |    =============================================================================
 | 
|---|
 | 1012 | */
 | 
|---|
 | 1013 | 
 | 
|---|
 | 1014 | idcpfch()
 | 
|---|
 | 1015 | {
 | 
|---|
 | 1016 |         vlbtype = 3;    /* copy / fetch menu */
 | 
|---|
 | 1017 | 
 | 
|---|
 | 1018 | /*                  "123456789012345678901234567890"    */
 | 
|---|
 | 1019 | 
 | 
|---|
 | 1020 |         vlbptr[0] = "Fetch from library     Escape ";
 | 
|---|
 | 1021 |         vlbptr[1] = "Copy to library               ";
 | 
|---|
 | 1022 |         vlbptr[2] = "                              ";
 | 
|---|
 | 1023 | }
 | 
|---|
 | 1024 | 
 | 
|---|
 | 1025 | /*  | 
|---|
 | 1026 | 
 | 
|---|
 | 1027 | */
 | 
|---|
 | 1028 | 
 | 
|---|
 | 1029 | /*
 | 
|---|
 | 1030 |    =============================================================================
 | 
|---|
 | 1031 |         instdsp() -- put up the instrument display
 | 
|---|
 | 1032 |    =============================================================================
 | 
|---|
 | 1033 | */
 | 
|---|
 | 1034 | 
 | 
|---|
 | 1035 | instdsp()
 | 
|---|
 | 1036 | {
 | 
|---|
 | 1037 |         register struct instdef *ip;
 | 
|---|
 | 1038 |         register struct idfnhdr *fp;
 | 
|---|
 | 1039 | 
 | 
|---|
 | 1040 |         instob = &v_score[0];           /* setup object pointer */
 | 
|---|
 | 1041 |         idoct  = &v_obtab[INSTOBJ];     /* setup object control table pointer */
 | 
|---|
 | 1042 |         obj0   = &v_curs0[0];           /* setup cursor object pointer */
 | 
|---|
 | 1043 |         obj2   = &v_tcur[0];            /* setup typewriter cursor pointer */
 | 
|---|
 | 1044 | 
 | 
|---|
 | 1045 |         idnamsw = FALSE;        /* typewriter not up */
 | 
|---|
 | 1046 |         idsrcsw = FALSE;        /* source menu not up */
 | 
|---|
 | 1047 |         idcfsw  = FALSE;        /* copy / fetch menu not up */
 | 
|---|
 | 1048 |         idimsw  = FALSE;        /* instrument menu not up */
 | 
|---|
 | 1049 |         submenu = FALSE;        /* submenu cursor not enabled */
 | 
|---|
 | 1050 |         wcflag  = -1;           /* no menu page up */
 | 
|---|
 | 1051 |         wcpage  = 0;            /* initial ws/cf page */
 | 
|---|
 | 1052 | 
 | 
|---|
 | 1053 |         setinst();              /* setup editing variables */
 | 
|---|
 | 1054 | 
 | 
|---|
 | 1055 |         dswap();                /* initialize display */
 | 
|---|
 | 1056 | 
 | 
|---|
 | 1057 |         vbank(0);               /* clear the display */
 | 
|---|
 | 1058 |         memsetw(instob, 0, 32767);
 | 
|---|
 | 1059 |         memsetw(instob+32767L, 0, 12033);
 | 
|---|
 | 1060 | 
 | 
|---|
 | 1061 |         SetObj(INSTOBJ, 0, 0, instob, 512, 350, 0, 0, INSTFL, -1);
 | 
|---|
 | 1062 |         SetObj(0, 0, 1, obj0, 16, 16, ICURX, ICURY, OBFL_00, -1);
 | 
|---|
 | 1063 |         SetObj(TTCURS, 0, 1, obj2, 16, 16,     0,     0,  TTCCFL, -1);
 | 
|---|
 | 1064 | 
 | 
|---|
 | 1065 |         arcurs(ID_NCUR);        /* setup arrow cursor object */
 | 
|---|
 | 1066 |         itcini(ID_TCUR);        /* setup text cursor object */
 | 
|---|
 | 1067 |         ttcini(ID_TCUR);        /* setup typewriter cursor object */
 | 
|---|
 | 1068 | 
 | 
|---|
 | 1069 |         vbank(0);
 | 
|---|
 | 1070 |         idbord();               /* draw the border */
 | 
|---|
 | 1071 |         idvlblc();              /* no initial label */
 | 
|---|
 | 1072 |         allwins();              /* fill in the windows */
 | 
|---|
 | 1073 | 
 | 
|---|
 | 1074 |         SetPri(INSTOBJ, INSTPRI);
 | 
|---|
 | 1075 |         SetPri(0, GCPRI);       /* display the graphic cursor */
 | 
|---|
 | 1076 | 
 | 
|---|
 | 1077 |         setgc(ICURX, ICURY);
 | 
|---|
 | 1078 | 
 | 
|---|
 | 1079 |         vsndpal(inspal);        /* set the palette */
 | 
|---|
 | 1080 | }
 | 
|---|
 | 1081 | 
 | 
|---|
 | 1082 | /*  | 
|---|
 | 1083 | 
 | 
|---|
 | 1084 | */
 | 
|---|
 | 1085 | 
 | 
|---|
 | 1086 | /*
 | 
|---|
 | 1087 |    =============================================================================
 | 
|---|
 | 1088 |         reshowi() -- redisplay the instrument
 | 
|---|
 | 1089 |    =============================================================================
 | 
|---|
 | 1090 | */
 | 
|---|
 | 1091 | 
 | 
|---|
 | 1092 | reshowi()
 | 
|---|
 | 1093 | {
 | 
|---|
 | 1094 |         idfield();              /* fix up field table, etc. */
 | 
|---|
 | 1095 | 
 | 
|---|
 | 1096 |         wcflag = -1;            /* no menu page up */
 | 
|---|
 | 1097 |         wcpage = 0;             /* first page of waveshapes */
 | 
|---|
 | 1098 | 
 | 
|---|
 | 1099 |         dswap();                /* initialize display */
 | 
|---|
 | 1100 | 
 | 
|---|
 | 1101 |         vbank(0);               /* clear the display */
 | 
|---|
 | 1102 |         memsetw(instob, 0, 32767);
 | 
|---|
 | 1103 |         memsetw(instob+32767L, 0, 12033);
 | 
|---|
 | 1104 | 
 | 
|---|
 | 1105 |         SetObj(INSTOBJ, 0, 0, instob, 512, 350, 0, 0, INSTFL, -1);
 | 
|---|
 | 1106 |         SetObj(0, 0, 1, obj0, 16, 16, ICURX, ICURY, OBFL_00, -1);
 | 
|---|
 | 1107 |         SetObj(TTCURS, 0, 1, obj2, 16, 16,     0,     0,  TTCCFL, -1);
 | 
|---|
 | 1108 | 
 | 
|---|
 | 1109 |         arcurs(ID_NCUR);        /* setup arrow cursor object */
 | 
|---|
 | 1110 |         itcini(ID_TCUR);        /* setup text cursor object */
 | 
|---|
 | 1111 |         ttcini(ID_TCUR);        /* setup typewriter cursor object */
 | 
|---|
 | 1112 | 
 | 
|---|
 | 1113 |         vbank(0);
 | 
|---|
 | 1114 |         idbord();               /* draw the border */
 | 
|---|
 | 1115 |         idvlblc();              /* no initial label */
 | 
|---|
 | 1116 |         allwins();              /* fill in the windows */
 | 
|---|
 | 1117 | 
 | 
|---|
 | 1118 |         SetPri(INSTOBJ, INSTPRI);
 | 
|---|
 | 1119 |         SetPri(0, GCPRI);       /* enable the cursor */
 | 
|---|
 | 1120 | 
 | 
|---|
 | 1121 |         if (cyval > curslim)
 | 
|---|
 | 1122 |                 settc(stcrow, stccol);
 | 
|---|
 | 1123 |         else
 | 
|---|
 | 1124 |                 setgc(cxval, cyval);
 | 
|---|
 | 1125 | 
 | 
|---|
 | 1126 |         vsndpal(inspal);        /* set the palette */
 | 
|---|
 | 1127 | }
 | 
|---|