[comp.sources.misc] v06i110: glib part 9 of 15

allbery@uunet.UU.NET (Brandon S. Allbery - comp.sources.misc) (05/15/89)

Posting-number: Volume 6, Issue 110
Submitted-by: lee@uhccux.uhcc.Hawaii.Edu (Greg Lee )
Archive-name: glib/part09

#! /bin/sh
# This is a shell archive.  Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file".  To overwrite existing
# files, type "sh file -c".  You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g..  If this archive is complete, you
# will see the following message at the end:
#		"End of archive 9 (of 15)."
# Contents:  dx7.mnu mac-vt.c
# Wrapped by lee@uhccux on Sun May  7 00:40:16 1989
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'dx7.mnu' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'dx7.mnu'\"
else
echo shar: Extracting \"'dx7.mnu'\" \(21054 characters\)
sed "s/^X//" >'dx7.mnu' <<'END_OF_FILE'
X/* $Id: dx7.mnu,v 1.6 89/05/06 17:13:22 lee Exp $
X * GLIB - a Generic LIBrarian and editor for synths
X *
X * DX-7 routines
X *
X * Scott Snyder - ssnyder@citromeo.bitnet, ssnyder@romeo.caltech.edu
X * $Log:	dx7.mnu,v $
X * Revision 1.6  89/05/06  17:13:22  lee
X * rel. to comp.sources.misc
X * 
X */
X
X#define VCED_SIZE 155
X
X#include "glib.h"
X#include <ctype.h>
X#include <math.h>
X
Xchar *visnum(), *visonoff(), *vism3num(), *viswave(), *vismono();
Xchar *visfreq(), *visdx1a(), *visr2num();
X
Xchar *visxq(), *visxx(), *vism7num(), *visx7note(), *visx7crv();
Xchar *visx7a(), *visx7wave(), *visx7brkpt();
X
Xchar *visxq1(), *visxq2(), *visxq3();
Xchar *visxq4(), *visxq5(), *visxq6();
Xchar *visxx1(), *visxx2(), *visxx3();
Xchar *visxx4(), *visxx5(), *visxx6();
X
X#define RESERVESIZE 0
X
X/* This array contains arbitrary screen labels */
Xstruct labelinfo Ldx7[] = {
X#MENU
X                      N: set name; q: quit; K: incr; J: decr; >: max; <: min  k
X                      space: play autonote Pitch  %   Vol   %                h l
X                                           Dur    %   Chan  %                 j
X
X    Atk  Sust1 Sust2  Rls        Fix/  Out De  Rat  Sens   Brk  Depth  Curve   
XOP Rt Lv Rt Lv Rt Lv Rt Lv  Freq Ratio Lvl tun Scl Key Mod Pt   L  R   L    R  
X-- -- -- -- -- -- -- -- -- ----- ----- --- --- --- --- --- ---- -- -- ---- ----
X 1 %  %  %  %  %  %  %  %  %     %      %   %   %   %   %  %    %  %  %    %   
X 2 %  %  %  %  %  %  %  %  %     %      %   %   %   %   %  %    %  %  %    %   
X 3 %  %  %  %  %  %  %  %  %     %      %   %   %   %   %  %    %  %  %    %   
X 4 %  %  %  %  %  %  %  %  %     %      %   %   %   %   %  %    %  %  %    %   
X 5 %  %  %  %  %  %  %  %  %     %      %   %   %   %   %  %    %  %  %    %   
X 6 %  %  %  %  %  %  %  %  %     %      %   %   %   %   %  %    %  %  %    %   
XPE %  %  %  %  %  %  %  %
X
XAlgorithm   %                    LFO Speed    %        Osc. Sync          @
X==============                   LFO Delay    %        Feedback           @
X                                 LFO AM Depth %        Middle C           @
X                                 LFO PM Depth %
X                                 LFO Wave     %
X                                 LFO Sync     %
X                                 LFO PM Sense %
X
X
X
X
X#END
X-1,-1,NULL
X};
X
X/* This array defines all the editable parameters. */
Xstruct paraminfo Pdx7[] = {
X"autopitch",	NULL, -1, -1, %%, visnum, 0, 127, 60, 0,
X"autovol",	NULL, -1, -1, %%, visnum, 0, 127, 63, 0,
X"autodur",	NULL, -1, -1, %%, visnum, 1,  20,  5, 0,
X"autochan",	NULL, -1, -1, %%, visnum, 1,  16,  1, 0,
X
X/*NAME		TYPE		POS	MAX	OFFSET	MASK	SHIFT	ADHOC*/
X#O op1atkrt	r2num		%%	99	85
X#O op1atklv	r2num		%%	99	89
X#O op1sust1rt	r2num		%%	99	86
X#O op1sust1lv	r2num		%%	99	90
X#O op1sust2rt	r2num		%%	99	87
X#O op1sust2lv	r2num		%%	99	91
X#O op1rlsrt	r2num		%%	99	88
X#O op1rlslv	r2num		%%	99	92
X#O op1freq	xq1		%%	4067	101			*3
X#O op1coarsefq	num		--	255	100	0x3E	1	*4
X#O op1fx	xx1		%%	1	100	0x01
X#O op1outlevel	num		%%	99	99
X#O op1detune	m7num		%%	14	97	0x78	3
X#O op1ratscl	num		%%	7	97	0x07
X#O op1tchsens	num		%%	7	98	0x1C	2
X#O op1modsens	num		%%	3	98	0x03
X#O op1brkpt	x7brkpt		%%	99	93
X#O op1ldepth	r2num		%%	99	94
X#O op1rdepth	r2num		%%	99	95
X#O op1lcurve	x7crv		%%	3	96	0x03
X#O op1rcurve	x7crv		%%	3	96	0x0C	2
X
X#O op2atkrt	r2num		%%	99	68
X#O op2atklv	r2num		%%	99	72
X#O op2sust1rt	r2num		%%	99	69
X#O op2sust1lv	r2num		%%	99	73
X#O op2sust2rt	r2num		%%	99	70
X#O op2sust2lv	r2num		%%	99	74
X#O op2rlsrt	r2num		%%	99	71
X#O op2rlslv	r2num		%%	99	75
X#O op2freq	xq2		%%	4067	84			*3
X#O op2coarsefq	num		--	255	83	0x3E	1	*4
X#O op2fx	xx2		%%	1	83	0x01
X#O op2outlevel	num		%%	99	82
X#O op2detune	m7num		%%	14	80	0x78	3
X#O op2ratscl	num		%%	7	80	0x07
X#O op2tchsens	num		%%	7	81	0x1C	2
X#O op2modsens	num		%%	3	81	0x03
X#O op2brkpt	x7brkpt		%%	99	76
X#O op2ldepth	r2num		%%	99	77
X#O op2rdepth	r2num		%%	99	78
X#O op2lcurve	x7crv		%%	3	79	0x03
X#O op2rcurve	x7crv		%%	3	79	0x0C	2
X
X#O op3atkrt	r2num		%%	99	51
X#O op3atklv	r2num		%%	99	55
X#O op3sust1rt	r2num		%%	99	52
X#O op3sust1lv	r2num		%%	99	56
X#O op3sust2rt	r2num		%%	99	53
X#O op3sust2lv	r2num		%%	99	57
X#O op3rlsrt	r2num		%%	99	54
X#O op3rlslv	r2num		%%	99	58
X#O op3freq	xq3		%%	4067	67			*3
X#O op3coarsefq	num		--	255	66	0x3E	1	*4
X#O op3fx	xx3		%%	1	66	0x01
X#O op3outlevel	num		%%	99	65
X#O op3detune	m7num		%%	14	63	0x78	3
X#O op3ratscl	num		%%	7	63	0x07
X#O op3tchsens	num		%%	7	64	0x1C	2
X#O op3modsens	num		%%	3	64	0x03
X#O op3brkpt	x7brkpt		%%	99	59
X#O op3ldepth	r2num		%%	99	60
X#O op3rdepth	r2num		%%	99	61
X#O op3lcurve	x7crv		%%	3	62	0x03
X#O op3rcurve	x7crv		%%	3	62	0x0C	2
X
X#O op4atkrt	r2num		%%	99	34
X#O op4atklv	r2num		%%	99	38
X#O op4sust1rt	r2num		%%	99	35
X#O op4sust1lv	r2num		%%	99	39
X#O op4sust2rt	r2num		%%	99	36
X#O op4sust2lv	r2num		%%	99	40
X#O op4rlsrt	r2num		%%	99	37
X#O op4rlslv	r2num		%%	99	41
X#O op4freq	xq4		%%	4067	50			*3
X#O op4coarsefq	num		--	255	49	0x3E	1	*4
X#O op4fx	xx4		%%	1	49	0x01
X#O op4outlevel	num		%%	99	48
X#O op4detune	m7num		%%	14	46	0x78	3
X#O op4ratscl	num		%%	7	46	0x07
X#O op4tchsens	num		%%	7	47	0x1C	2
X#O op4modsens	num		%%	3	47	0x03
X#O op4brkpt	x7brkpt		%%	99	42
X#O op4ldepth	r2num		%%	99	43
X#O op4rdepth	r2num		%%	99	44
X#O op4lcurve	x7crv		%%	3	45	0x03
X#O op4rcurve	x7crv		%%	3	45	0x0C	2
X
X#O op5atkrt	r2num		%%	99	17
X#O op5atklv	r2num		%%	99	21
X#O op5sust1rt	r2num		%%	99	18
X#O op5sust1lv	r2num		%%	99	22
X#O op5sust2rt	r2num		%%	99	19
X#O op5sust2lv	r2num		%%	99	23
X#O op5rlsrt	r2num		%%	99	20
X#O op5rlslv	r2num		%%	99	24
X#O op5freq	xq5		%%	4067	33			*3
X#O op5coarsefq	num		--	255	32	0x3E	1	*4
X#O op5fx	xx5		%%	1	32	0x01
X#O op5outlevel	num		%%	99	31
X#O op5detune	m7num		%%	14	29	0x78	3
X#O op5ratscl	num		%%	7	29	0x07
X#O op5tchsens	num		%%	7	30	0x1C	2
X#O op5modsens	num		%%	3	30	0x03
X#O op5brkpt	x7brkpt		%%	99	25
X#O op5ldepth	r2num		%%	99	26
X#O op5rdepth	r2num		%%	99	27
X#O op5lcurve	x7crv		%%	3	28	0x03
X#O op5rcurve	x7crv		%%	3	28	0x0C	2
X
X#O op6atkrt	r2num		%%	99	0
X#O op6atklv	r2num		%%	99	4
X#O op6sust1rt	r2num		%%	99	1
X#O op6sust1lv	r2num		%%	99	5
X#O op6sust2rt	r2num		%%	99	2
X#O op6sust2lv	r2num		%%	99	6
X#O op6rlsrt	r2num		%%	99	3
X#O op6rlslv	r2num		%%	99	7
X#O op6freq	xq6		%%	4067	16			*3
X#O op6coarsefq	num		--	255	15	0x3E	1	*4
X#O op6fx	xx6		%%	1	15	0x01
X#O op6outlevel	num		%%	99	14
X#O op6detune	m7num		%%	14	12	0x78	3
X#O op6ratscl	num		%%	7	12	0x07
X#O op6tchsens	num		%%	7	13	0x1C	2
X#O op6modsens	num		%%	3	13	0x03
X#O op6brkpt	x7brkpt		%%	99	8
X#O op6ldepth	r2num		%%	99	9
X#O op6rdepth	r2num		%%	99	10
X#O op6lcurve	x7crv		%%	3	11	0x03
X#O op6rcurve	x7crv		%%	3	11	0x0C	2
X
X#O pegatkrt	r2num		%%	99	102
X#O pegatklv	r2num		%%	99	106
X#O pegsust1rt	r2num		%%	99	103
X#O pegsust1lv	r2num		%%	99	107
X#O pegsust2rt	r2num		%%	99	104
X#O pegsust2lv	r2num		%%	99	108
X#O pegrlsrt	r2num		%%	99	105
X#O pegrlslv	r2num		%%	99	109
X
X#O algorithm	x7a		%%	31	110	0x1F
X
X#O lfospeed	num		%%	99	112
X#O lfodelay	num		%%	99	113
X#O lfoamdepth	num		%%	99	115
X#O lfopmdepth	num		%%	99	114
X#O lfowave	x7wave		%%	5	116	0x0E	1
X#O lfosync	onoff		%%	1	116	0x01
X#O lfopmsens	num		%%	7	116	0x70	4
X
X#O oscsync	onoff		@@	1	111	0x08	3
X#O feedback	num		@@	7	111	0x07
X#O transpose	x7note		@@	48	117
X
XNULL,	NULL, -1, -1, -1, -1, visnum, 0, 0, 0, 0
X};
X
X/*
X#ifdef __TURBOC__
X# pragma warn -par
X#endif
X*/
X
X#if !defined(TX81Z) && !defined(TX81ZPERF) && !defined(DX100)
X
X/* else these routines are in yama_com */
X
Xsetopval(n,str,v)
Xchar *str;
X{
X	char buff[32];
X	(void)sprintf(buff,"op%d%s",n,str);
X	setval(buff,v);
X}
X
X/* not used
Xgetopval(n,str)
Xchar *str;
X{
X	char buff[32];
X	(void)sprintf(buff,"op%d%s",n,str);
X	return(getval(buff));
X}
X*/
X
Xchar *
Xvismono(v)
X{
X	if ( v==0 )
X		return("poly");
X	else
X		return("mono");
X}
X
X#endif
X
Xchar *vism7num(v)
Xint v;
X{
X  static char Nbuff[16];
X
X  (void)sprintf(Nbuff, "%d", v-7);
X  return Nbuff;
X}
X
X/* 2-digit, right-justified */
Xchar *visr2num(v)
Xint v;
X{
X  static char Nbuff[16];
X
X  (void)sprintf(Nbuff, "%2d", v);
X  return Nbuff;
X}
X
Xchar *Dx7Notes[] =
X { "C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B" };
X
Xchar *visx7note(v)
Xint v;
X{
X  int oct, tone;
X  char *p;
X  static char buf[8];
X
X  oct = floor((double)v / 12.0);
X  tone = v - oct*12;
X
X  strcpy(buf, Dx7Notes[tone]);
X  p = buf + (buf[1] == 0 ? 1 : 2);
X  (void)sprintf(p, "%d", oct+1);
X
X  return buf;
X}
X
Xchar *visx7brkpt(v)
Xint v;
X{
X  return visx7note(v - 15);
X}
X
Xchar *visx7crv(v)
Xint v;
X{
X  switch (v) {
X    case 0: return "-LIN";
X    case 1: return "-EXP";
X    case 2: return "+EXP";
X    case 3: return "+LIN";
X    default: return "???";
X  }
X}
X
Xchar *visx7wave(v)
Xint v;
X{
X  switch (v) {
X    case 0: return "Tri";
X    case 1: return "Saw Down";
X    case 2: return "Saw Up";
X    case 3: return "Square";
X    case 4: return "Sine";
X    case 5: return "S/Hold";
X    default: return "???";
X  }
X}
X
Xchar *visxqr(c, f)
Xint c, f;
X{
X  static char buf[8];
X  float freq;
X
X  freq = c;
X  if (c == 0) freq = 0.5;
X
X  freq += f * freq / 100;
X
X  (void)sprintf(buf, "%5.2f", freq);
X  return buf;
X}
X
Xint Dx7Freqs[] = {
X  1000, 1023, 1047, 1072, 1096, 1122, 1148, 1175, 1202, 1230,
X  1259, 1288, 1318, 1349, 1380, 1413, 1445, 1479, 1514, 1549,
X  1585, 1622, 1660, 1698, 1738, 1778, 1820, 1862, 1905, 1950,
X  1995, 2042, 2089, 2138, 2188, 2239, 2291, 2344, 2399, 2455,
X  2512, 2570, 2630, 2692, 2716, 2818, 2884, 2951, 3020, 3090,
X  3162, 3236, 3311, 3388, 3467, 3548, 3631, 3715, 3802, 3890,
X  3981, 4074, 4169, 4266, 4365, 4467, 4571, 4677, 4786, 4898,
X  5012, 5129, 5248, 5370, 5495, 5623, 5754, 5888, 6026, 6166,
X  6310, 6457, 6607, 6761, 6918, 7079, 7244, 7413, 7586, 7762,
X  7943, 8128, 8318, 8511, 8718, 8913, 9120, 9333, 9550, 9772,
X};
X
Xchar *visxqf(c, f)
Xint c, f;
X{
X  static char buf[8];
X  int i;
X
X  c %= 4;
X
X  (void)sprintf(buf, "%4d ", Dx7Freqs[f]);
X
X  if (c < 3) {
X    for (i=4; i>c; i--)
X      buf[i+1] = buf[i];
X    buf[c+1] = '.';
X  }
X
X  return buf;
X}
X
Xchar *visxq(v, op)
Xint v, op;
X{
X  char buff[8];
X  int c, f;
X
X  c = v / 128;
X  f = v % 128;
X
X  if (f > 99) {
X    if (f > 110) {
X      f = 99;
X    }
X    else {
X      c++;
X      f = 0;
X    }
X    setopval(op, "freq", c*128 + f);
X  }
X
X  (void)sprintf(buff, "op%dfx", op);
X  if (getval(buff) == 0)
X    return visxqr(c, f);
X  else
X    return visxqf(c, f);
X}
X
Xchar *visxx(v, op, s)   /* s == 1 for a DX7s */
Xint v, op, s;
X{
X  static int lastfx[] = { 0, -1, -1, -1, -1, -1, -1 };
X  char buff2[8];
X  int fqindex;
X
X  if ( lastfx[op] != -1 && lastfx[op] == v )
X    goto nochange;
X
X  lastfx[op] = v;
X  (void)sprintf(buff2,"op%dfreq",op);
X  fqindex = parmindex(buff2);
X  showparam(fqindex,0);
Xnochange:
X  if ( v == 0 )
X    return(s ? " R" : "Ratio");
X  else
X    return(s ? "Hz" : "Fixed");
X}
X
Xchar *visxx1(v) { return visxx(v, 1, 0); }
Xchar *visxx2(v) { return visxx(v, 2, 0); }
Xchar *visxx3(v) { return visxx(v, 3, 0); }
Xchar *visxx4(v) { return visxx(v, 4, 0); }
Xchar *visxx5(v) { return visxx(v, 5, 0); }
Xchar *visxx6(v) { return visxx(v, 6, 0); }
X
Xchar *visxq1(v) { return visxq(v, 1); }
Xchar *visxq2(v) { return visxq(v, 2); }
Xchar *visxq3(v) { return visxq(v, 3); }
Xchar *visxq4(v) { return visxq(v, 4); }
Xchar *visxq5(v) { return visxq(v, 5); }
Xchar *visxq6(v) { return visxq(v, 6); }
X
X/*
X  6+--5   6---5   3   6+   3   6+
X  ++  |       |   |   ++   |   ||
X  2   4   2+  4   2   5    2   5|   2   4   6+   2   4   6+
X  |   |   ++  |   |   |    |   ||   |   |   ++   |   |   ||
X  1   3   1   3   1   4    1   4|   1   3   5    1   3   5|
X  +-+-+   +-+-+   +-+-+    +-+-++   +---+---+    +---+---++
X    1       2       3        4          5            6
X
X          6+           6           6           3+           3
X          ++           |           |           ++           |
X  2   4   5    2  +4   5   2+  4   5   5   6   2    5   6+  2
X  |   |   |    |  ++   |   ++  |   |   |   |   |    |   ++  |
X  1   3---+    1   3---+   1   3---+   +---4   1    +---4   1
X  +-+-+        +-+-+       +-+-+           +-+-+        +-+-+
X    7            8           9               10           11
X
X                             5--+6+   5--+6      4  6+      4  6
X  4  5  6  2+   4  5  6+ 2      |++      ||      |  ++      |  |
X  |  |  |  ++   |  |  ++ |   2  +4    2+ +4   2  3  5    2+ 3  5
X  +--3--+  1    +--3--+  1   |   |    ++  |   |  |  |    ++ |  |
X     |     |       |     |   1   3    1   3   +--1--+    +--1--+
X     +--+--+       +--+--+   +-+-+    +-+-+      |          |
X        12            13       14       15       16         17
X
X      6---5   3
X          |   | 
X  2   3+  4   2  +6       3+  5-+ 6   3+      6   2      6+
X  |   ++  |   |  ++---+   ++--+ | |  ++++   +-++  |  +---++-+
X  +---1---+   1   4   5   1   2 +-4  1  2   4  5  1  3   4  5
X      |       +---+---+   +---+---+  +--+-+-+--+  +--+-+-+--+
X      18          19          20          21           22
X
X     3    6+         6+         6+      3   5  6+    3+  5  6+
X     |   ++++      +-+++        +++     |   |  ++    ++  |  ++
X  1  2   4  5  1 2 3 4 5  1 2 3 4 5  1  2   +--4  1  2   +--4
X  +--+-+-+--+  +-+-+-+-+  +-+-+-+-+  +--+-+-+--+  +--+-+-+--+
X       23          24         25          26           27
X
X      5+                          5+
X      ++                          ++
X  2   4             4  6+         4             6+
X  |   |             |  ++         |             ++
X  1   3   6  1  2   3  5   1  2   3  6  1 2 3 4 5   1 2 3 4 5 6+
X  +---+---+  +--+-+-+--+   +--+-+-+--+  +-+-+-+-+   +-+-+-+-+-++
X      28          29            30          31            32
X*/
X
Xchar *Dx7Algstr[] = {
X"1 ~3d~10l6~T~-~-5~n~[~]  ~|~n2   4~n~|   ~|~n1   3~n~[~-~T~-~]",
X"2 ~3d~10l6~-~-~-5~n    ~|~n2~}  4~n~>~]  ~|~n1   3~n~[~-~T~-~]",
X"3 ~3d~10l3   6~}~n~|   ~>~]~n2   5~n~|   ~|~n1   4~n~[~-~T~-~]",
X"4 ~3d~10l3   6~}~n~|   ~|~|~n2   5~|~n~|   ~|~|~n1   4~|~n~[~-~T~-~^~]",
X"5 ~5d~12l2   4   6~}~n~|   ~|   ~>~]~n1   3   5~n~[~3-~+~3-~]",
X"6 ~5d~12l2   4   6~}~n~|   ~|   ~|~|~n1   3   5~|~n~[~3-~+~3-~^~]",
X"7 ~3d~12l~8 6~}~n~8 ~>~]~n2   4   5~n~|   ~|   ~|~n1   3~3-~]~n~[~-~T~-~]",
X"8 ~3d~12l~8 6~n~8 ~|~n2  ~{4   5~n~|  ~[~<   ~|~n1   3~3-~]~n~[~-~T~-~]",
X"9 ~3d~12l~8 6~n~8 ~|~n2~}  4   5~n~>~]  ~|   ~|~n1   3~3-~]~n~[~-~T~-~]",
X"10~3d~12l~8 3~}~n~8 ~>~]~n5   6   2~n~|   ~|   ~|~n~[~3-4   1~n~4 ~[~-~T~-~]",
X"11~3d~12l~8 3~n~8 ~|~n5   6~}  2~n~|   ~>~]  ~|~n~[~3-4   1~n~4 ~[~-~T~-~]",
X"12~4d~13l4  5  6  2~}~n~|  ~|  ~|  ~>~]~n~[~2-3~2-~]  1~n   ~|~5 ~|~n   ~[~2-~T~2-~]",
X"13~4d~13l4  5  6~} 2~n~|  ~|  ~>~] ~|~n~[~2-3~2-~]  1~n   ~|~5 ~|~n   ~[~2-~T~2-~]",
X"14~3d~10l5~2-~}6~}~n   ~|~>~]~n2  ~[4~n~|   ~|~n1   3~n~[~-~T~-~]",
X"15~3d~10l5~2-~}6~n   ~|~|~n2~} ~[4~n~>~]  ~|~n1   3~n~[~-~T~-~]",
X"16~3d~11l   4  6~}~n   ~|  ~>~]~n2  3  5~n~|  ~|  ~|~n~[~2-1~2-~]~n   ~|",
X"17~3d~11l   4  6~n   ~|  ~|~n2~} 3  5~n~>~] ~|  ~|~n~[~2-1~2-~]~n   ~|",
X"18~3d~12l~4 6~3-5~n~8 ~|~n2   3~}  4~n~|   ~>~]  ~|~n~[~3-1~3-~]~n~4 ~|",
X"19~3d~12l3~n~|~n2  ~{6~n~|  ~[~+~3-~}~n1   4   5~n~[~3-~+~3-~]",
X"20~5d~12l3~}  5~-~} 6~n~>~^~2-~} ~| ~|~n1   2 ~[~-4~n~[~3-~+~3-~]",
X"21~5d~13l 3~}~6 6~n~{~^~^~}   ~{~-~^~}~n1  2   4  5~n~[~2-~^~-~T~-~^~2-~]",
X"22~5d~13l2~6 6~}~n~|  ~{~3-~+~^~-~}~n1  3   4  5~n~[~2-~^~-~T~-~^~2-~]",
X"23~5d~13l   3    6~}~n   ~|   ~{~^~^~}~n1  2   4  5~n~[~2-~^~-~T~-~^~2-~]",
X"24~5d~13l~6 6~}~n    ~{~-~+~^~}~n1 2 3 4 5~n~[~-~^~-~+~-~^~-~]",
X"25~5d~13l~6 6~}~n~6 ~>~^~}~n1 2 3 4 5~n~[~-~^~-~+~-~^~-~]",
X"26~5d~13l   3   5  6~}~n   ~|   ~|  ~>~]~n1  2   ~[~2-4~n~[~2-~^~-~T~4-~]",
X"27~5d~13l   3~}  5  6~}~n   ~>~]  ~|  ~>~]~n1  2   ~[~2-4~n~[~2-~^~-~T~4-~]",
X"28~3d~12l~4 5~}~n~4 ~>~]~n2   4~n~|   ~|~n1   3   6~n~[~3-~+~3-~]",
X"29~5d~13l~7 4  6~}~n~7 ~|  ~>~]~n1  2   3  5~n~[~2-~^~-~T~-~^~2-~]",
X"30~3d~13l~7 5~}~n~7 ~>~]~n~7 4~n~7 ~|~n1  2   3  6~n~[~2-~^~-~T~-~^~2-~]",
X"31~5d~12l~8 6~}~n~8 ~>~]~n1 2 3 4 5~n~[~-~^~-~+~-~^~-~]",
X"32~7d~13l1 2 3 4 5 6~}~n~[~-~^~-~^~-~+~-~^~-~^~]",
X};
X
Xchar *visx7a(v)
Xint v;
X{
X  if (v >= 0 && v < sizeof(Dx7Algstr)/sizeof(char *))
X    return(Dx7Algstr[v]);
X  else
X    return("????");
X}
X
Xdx7din(data)
Xchar *data;
X{
X#SETVAL
X}
X
Xdx7dout(data)
Xchar *data;
X{
X#GETVAL
X
X  Channel = getval("autochan");
X}
X
Xchar *dx7nof(data)
Xchar *data;
X{
X  static char buf[11];
X  char *p;
X  int i;
X
X  p = buf;
X  for (i=118; i<=127; i++)
X    *p++ = data[i];
X
X  *p = '\0';
X
X  return buf;
X}
X
Xdx7snof(data, name)
Xchar *data, *name;
X{
X  int i;
X
X  for (i=118; i<=127 && *name; i++)
X    data[i] = *name++;
X  for (; i<=127; i++)
X    data[i] = ' ';
X}
X
Xdx7vmemtovced(in, out)
Xchar *in, *out;
X{
X  int i;
X  char *opin, *opout;
X
X  for (i=0; i<6; i++) {
X    opin = in + (6-i-1)*17;
X    opout = out + (6-i-1)*21;
X
X    opout[ 0] = opin[ 0];		/* eg rate 1 */
X    opout[ 1] = opin[ 1];		/* eg rate 2 */
X    opout[ 2] = opin[ 2];		/* eg rate 3 */
X    opout[ 3] = opin[ 3];		/* eg rate 4 */
X    opout[ 4] = opin[ 4];		/* eg level 1 */
X    opout[ 5] = opin[ 5];		/* eg level 2 */
X    opout[ 6] = opin[ 6];		/* eg level 3 */
X    opout[ 7] = opin[ 7];		/* eg level 4 */
X    opout[ 8] = opin[ 8];		/* breakpoint */
X    opout[ 9] = opin[ 9];		/* l. depth */
X    opout[10] = opin[10];		/* r. depth */
X    opout[11] = opin[11] & 0x03;	/* l. curve */
X    opout[12] = (opin[11]>>2) & 0x03;	/* r. curve */
X    opout[13] = opin[12] & 0x07;	/* rate scaling */
X    opout[14] = opin[13] & 0x03;	/* mod. sens. */
X    opout[15] = (opin[13]>>2) & 0x07;	/* touch sens. */
X    opout[16] = opin[14];		/* total level */
X    opout[17] = opin[15] & 0x01;	/* freq. mode */
X    opout[18] = (opin[15]>>1) & 0x1f;	/* coarse freq. */
X    opout[19] = opin[16];		/* fine freq. */
X    opout[20] = (opin[12]>>3) & 0x0f;	/* detune */
X  }
X
X  out[126] = in[102];			/* peg rate 1 */
X  out[127] = in[103];			/* peg rate 2 */
X  out[128] = in[104];			/* peg rate 3 */
X  out[129] = in[105];			/* peg rate 4 */
X  out[130] = in[106];			/* peg level 1 */
X  out[131] = in[107];			/* peg level 2 */
X  out[132] = in[108];			/* peg level 3 */
X  out[133] = in[109];			/* peg level 4 */
X  out[134] = in[110] & 0x1f;		/* algorithm */
X  out[135] = in[111] & 0x07;		/* feedback */
X  out[136] = (in[111]>>3) & 0x01;	/* osc sync */
X  out[137] = in[112];			/* lfo speed */
X  out[138] = in[113];			/* lfo delay time */
X  out[139] = in[114];			/* pm depth */
X  out[140] = in[115];			/* am depth */
X  out[141] = in[116] & 0x01;		/* lfo key sync */
X  out[142] = (in[116]>>1) & 0x07;	/* lfo wave */
X  out[143] = (in[116]>>4) & 0x0f;	/* lfo pm sens */
X  out[144] = in[117];			/* transpose */
X
X  for (i=0; i<10; i++)
X    out[145+i] = in[118+i];		/* name */
X}
X
Xdx7send_bulk(format, length, data)
Xint format, length;
Xchar *data;
X{
X  int csum, i;
X
X  sendmidi(0xf0);
X  sendmidi(0x43);
X  sendmidi(Channel-1);
X  sendmidi(format);
X  sendmidi(length / 128);
X  sendmidi(length % 128);
X
X  csum = 0;
X  for (i=0; i<length; i++) {
X    sendmidi(data[i]);
X    csum += data[i];
X  }
X
X  sendmidi((-csum) & 0x7f);
X  sendmidi(EOX);
X
X  return 0;
X}
X
Xdx7svced(data)
Xchar *data;
X{
X  return dx7send_bulk(0, VCED_SIZE, data);
X}
X
Xdx7sedit(data)
Xchar *data;
X{
X  char edmem[VCED_SIZE];
X
X  dx7vmemtovced(data, edmem);
X  return dx7svced(edmem);
X}
X
Xdx7sbulk(data)
Xchar *data;
X{
X  return dx7send_bulk(9, 4096, data);
X}
X
Xdx7get_bulk(format, maxlength, data)
Xint format;
Xunsigned maxlength;
Xchar *data;
X{
X  int c, n, b1, b2, cksum, ret = 1;
X  unsigned len;
X  long begin, toolong;
X  static char ckbuff[80];
X
X  flushmidi();
X
X  begin = milliclock();
X  toolong = begin + 1000 * TIMEOUT;
X
X  sendmidi(0xf0);
X  sendmidi(0x43);
X  sendmidi(0x20 | (Channel-1) );	/* Channel # */
X  sendmidi(format);			/* 4 == 32 voice bulk dump */
X  sendmidi(EOX);			/* EOX */
X
X#ifdef BYTEBOARD
X/*
X# ifdef __TURBOC__
X#  pragma warn -rch
X# endif
X*/
X  if (midi_getsex(toolong) == NULL) return 1;
X#endif
X
X  /* wait for the x43 byte starting the dump */
X  c = 0;
X  while ( milliclock() < toolong ) {
X    if ( STATMIDI && (c=(getmidi() & 0xff)) == 0x43 )
X      break;
X  }
X  if ( c != 0x43 ) {
X    Reason = "Timeout waiting for 0x43";
X    goto getout;
X  }
X
X  (void)getmidi();		/* channel # */
X  c = getmidi();	/* format # */
X  if (c != format) {
X    (void)sprintf(ckbuff, "Synth sent format %d instead of %d", c, format);
X    Reason = ckbuff;
X    goto getout;
X  }
X  len = 128 * getmidi();	/* byte count high byte */
X  len += getmidi();		/* byte count low byte */
X  if (len > maxlength) {
X    Reason = "Synth sent more data than I was expecting";
X    goto getout;
X  }
X
X  cksum = 0;
X  /* 32 voices are dumped */
X  for (n=0; n<len; n++) {
X    /* twiddle your thumbs, but not forever */
Xanotherch:
X    while ( ! STATMIDI ) {
X      if ( milliclock() > toolong )
X        goto timeout;	/* the end of an era */
X    }
X    c = (getmidi() & 0xff);
X    /* Ignore non-data bytes ? */
X    if ( c & 0x80 )
X      goto anotherch;
X    /* compute checksum */
X    cksum += c;
X    data[n] = c;
X  }
Xtimeout:
X  if ( n < len ) {
X    Reason = "Timeout while reading!";
X    goto getout;
X  }
X  b1 = (getmidi() & 0xff);	/* Checksum */
X  b2 = (getmidi() & 0xff);	/* EOX */
X  cksum = (-cksum) & 0x7f;	/* convert to what we must match */
X  if ( b2 != EOX )
X    Reason = "EOX not received";
X  else if ( b1 != cksum ) {
X    (void)sprintf(ckbuff,"Checksum doesn't match (got %d expected %d)",b1,cksum);
X    Reason = ckbuff;
X  }
X  else {
X    Reason = "";
X    ret = 0;	/* all's well */
X  }
Xgetout:
X  return(ret);
X}
X
Xdx7gbulk(data)
Xchar *data;
X{
X  return dx7get_bulk(9, 4096, data);
X}
END_OF_FILE
if test 21054 -ne `wc -c <'dx7.mnu'`; then
    echo shar: \"'dx7.mnu'\" unpacked with wrong size!
fi
# end of 'dx7.mnu'
fi
if test -f 'mac-vt.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'mac-vt.c'\"
else
echo shar: Extracting \"'mac-vt.c'\" \(19069 characters\)
sed "s/^X//" >'mac-vt.c' <<'END_OF_FILE'
X/* $Id: mac-vt.c,v 1.6 89/05/06 17:13:35 lee Exp $
X**
X** vt.c - a replacement dev:console driver for the Keynote musical expression
X**        language.
X**
X** Provides a cursor, constant-width characters, and (someday) all the escape
X** sequences for vt100 emulation.  The driver (handler) is installed at
X** run-time (for MPW 1.0) by doing the following call (before doing any I/O,
X** since that would auto-initialize the default system driver). 
X**
X** _addDevHandler(1, 'CONS', vt_faccess, vt_close, vt_read, vt_write, vt_ioctl);
X**
X** WARNING: this code assumes the MPW 1.0 development system.  It hooks itself
X** in as a device driver using the undocumented _addDevHandler call, which
X** may change in future releases of MPW.  It expects the system driver to be
X** in slot 1 - this also may change.
X**
X** If you are not using MPW, some or all of this driver may be unnecessary.
X** The vt_getch and vt_peekch functions probably ARE necessary and probably
X** work correctly under any development system.  They mainly provide the 
X** ability to stat the console to do non-blocking input.  They completely
X** avoid MPW's stdio (and all other libraries for that matter), although
X** the vt_read call provides an stdio interface if desired (blocking input
X** only, of course).  They DO assume that the mac has been initialized and
X** the event queue has been set up (InitGraf et.al.).
X**
X** The problem is printf.  If your development system has an acceptable
X** implementation (MPW *does NOT*), then just comment out the definition
X** of MPW in Keynote source file machdep.h and give 'er a try.  If, however,
X** you want to use my vt_putch or vt_write routines, you will have to figure
X** out how to hook them into your system. The only thing to beware of is to
X** call vt_open before using vt_putch.  This is done automatically via the
X** vt_faccess call for MPW 1.0.
X**
X** Steven A. Falco  4/30/87  moss!saf
X*/
X#include <types.h>
X#include <quickdraw.h>
X#include <toolutils.h>
X#include <fonts.h>
X#include <events.h>
X#include <windows.h>
X#include <dialogs.h>
X#include <menus.h>
X#include <desk.h>
X#include <textedit.h>
X#include <scrap.h>
X#include <segload.h>
X#include <resources.h>
X#include <osutils.h>
X#include <ioctl.h>
X#include <fcntl.h>
X#include "vt.h"
X#include <stdio.h>
X
X#define MAXROW		24
X#define MAXCOL		80
X#define TABVAL		8
X
X#define ENONE		0
X#define EFIRST		1
X#define EBRACKET	2
X
X/* note - the pixel location is based on the character baseline. */
X#define	XL(x)	((x) * vt_font.widMax + 4)	/* x offset from chars to pixels */
X#define	YL(y)	(((y) + 1) * vt_line - 2)  	/* y offset from chars to pixels */
X#define HOP		MoveTo(XL(vt_col), YL(vt_row)); GetPen(&vt_pen)
X
X/* BLANK(1,1) scrubs one cell.  (1,2) does a cell and the cell below it,
X * while (2,1) does a cell and the cell to the right of it.  etc.
X */
X#define BLANK(i, j) SetRect(&vt_one_char, vt_pen.h, vt_pen.v - vt_above, \
X				  vt_pen.h + (i) * vt_font.widMax, \
X				  vt_pen.v + vt_below + ((j) - 1) * vt_line); \
X				  EraseRect(&vt_one_char)
X				  
X#define CURSOR	SetRect(&vt_one_char, vt_pen.h, vt_pen.v - vt_above, \
X				  vt_pen.h + vt_font.widMax, vt_pen.v + vt_below); \
X				  PenMode(patXor); \
X				  PaintRect(&vt_one_char); \
X				  PenMode(patCopy)
X
X#define SAVE	vt_saverow = vt_row; vt_savecol = vt_col
X
X#define RESTORE	vt_row = vt_saverow; vt_col = vt_savecol
X
XWindowPtr	vt;
XFontInfo	vt_font;
Xint 		vt_line, vt_above, vt_below;
Xint			vt_col, vt_savecol;
Xint			vt_row, vt_saverow;
XRect		vt_one_char;
XRect		vt_rect;
XRect		screenRect;
XPoint		vt_pen;
Xint			vt_rawf;
Xint			vt_esc;
Xint			vt_inprog;		/* number in progress */
Xint			vt_x, vt_y;		/* for motion escape code */
X
Xstatic int	firsttime = 0;
Xstatic int	linesize = 0;
Xstatic char	*lineptr;
Xstatic char	linebuf[256];
X
X/* initialize the world.  We call this based on the "firsttime" flag - not an
X * every faccess call! - we only want to do it once...
X */
Xvt_open()
X{
X	char *vt_title;
X	int i;
X
X	InitGraf(&qd.thePort);
X	InitFonts();
X	FlushEvents(everyEvent, 0);
X	InitWindows();
X	InitMenus();
X	TEInit();
X	InitDialogs(nil);
X	InitCursor();
X	
X	vt_title = "";
X	screenRect = qd.screenBits.bounds;
X	SetRect(&vt_rect, 4, 20 + 4, screenRect.right - 4, screenRect.bottom - 4);
X	vt = NewWindow(nil, &vt_rect, vt_title, true, plainDBox, -1, false, 0);
X	SetPort(vt);
X	vt_rect.left -= 4; /* make vt_rect local - only used for scrolls hereafter */
X	vt_rect.right -= 4;
X	vt_rect.top -= (20 + 4);
X	vt_rect.bottom -= (20 + 4);
X	
X	TextFont(monaco); /* this driver only supports constant-width */
X	TextSize(9);
X	GetFontInfo(&vt_font);
X	PenMode(patCopy);
X	vt_line = vt_font.ascent + vt_font.descent + vt_font.leading;
X	vt_above = vt_font.ascent; /* dereference structure for efficiency */
X	vt_below = vt_font.descent;
X	vt_rawf = 0;			/* start out cooked */
X	vt_esc = ENONE;			/* no escape sequence yet */
X	
X	vt_row = vt_col = 0;	/* start out at home */
X	HOP;					/* actually move there */
X	CURSOR;					/* put up a cursor (XOR) */
X
X	return;
X}
X
X/* scroll the whole screen up one line-height */
Xvt_scroll()
X{
X	RgnHandle scroll_rgn;
X	
X	scroll_rgn = NewRgn();
X	ScrollRect(&vt_rect, 0, -vt_line, scroll_rgn);
X	DisposeRgn(scroll_rgn);
X	
X	return;
X}
X
X/* put a character on the screen.  Set state flags so we can process sequences
X * of characters (to do escape sequences.)
X * Assume we are sitting on the cursor and vt_pen is valid
X */
Xvt_putch(c)
X	int c;
X{
X	if(vt_esc > ENONE) { /* we are in the middle of an escape sequence */
X		escape_code(c);
X	} else if(c >= ' ' && c <= '~') {	/* it is printable */
X		printable_code(c);
X	} else {					/* it is control */
X		control_code(c);
X	}
X	
X	return;
X}
X
X/* it is a simple character */
Xprintable_code(c)
X	int c;
X{
X	BLANK(1, 1);			/* take away the cursor */
X	DrawChar(c);			/* paint in the character */
X	if(++vt_col >= MAXCOL) {	/* time to auto-linefeed */
X		vt_col = 0;
X		if(++vt_row >= MAXROW) {/* scroll it */
X			vt_row = MAXROW - 1; /* not so far please... */
X			vt_scroll();
X		}
X	}
X	HOP;					/* move to the cell */
X	CURSOR;					/* paint in the cursor */
X	
X	return;
X}
X
X/* process a control code - all are exactly 1 character in length */
Xcontrol_code(c)
X	int c;
X{
X	int i, j;
X	
X	switch(c) {
X	  case '\007':			/* bell */
X		SysBeep(20);		/* beep for 20/60 seconds */
X		break;
X	  case '\010':			/* backspace */
X		if(vt_col > 0) {	/* can't backspace past left margin */
X			CURSOR;			/* exor it again to remove */
X			vt_col--;
X			HOP;			/* jump back one */
X			CURSOR;			/* and a new cursor */
X		} else {
X			SysBeep(20);	/* be a pain */
X		}
X		break;
X	  case '\011':			/* tab */
X		j = vt_col;			/* stack this for re-entrancy */
X		for(i = 0; i < (TABVAL - (j % TABVAL)); i++) {
X			vt_putch(' ');	/* just do some spaces */
X		}
X		break;
X	  case '\012':			/* line feed */
X		CURSOR;				/* kill the old cursor */
X		if(!vt_rawf) {		/* do both cr and lf */
X			vt_col = 0;		/* the cr part is easy */
X		}
X		if(++vt_row >= MAXROW) {/* scroll it */
X			vt_row = MAXROW - 1; /* not so far please... */
X			vt_scroll();
X		}
X		HOP;
X		CURSOR;
X		break;
X	  case '\015':			/* carriage return */
X		CURSOR;				/* kill the old cursor */
X		vt_col = 0;			/* the cr part is easy */
X		if(!vt_rawf) {		/* do both cr and lf */
X			if(++vt_row >= MAXROW) {/* scroll it */
X				vt_row = MAXROW - 1; /* not so far please... */
X				vt_scroll();
X			}
X		}
X		HOP;
X		CURSOR;
X		break;
X	  case '\033':			/* escape */
X		vt_esc = EFIRST;		/* ok - start an escape sequence */
X		break;
X	  /* the ones we don't handle come next */
X	  case '\013':			/* vertical tab */
X	  case '\014':			/* form feed */
X	  default:
X		break;
X	} /* end of switch */
X	
X	return;
X}
X
Xescape_code(c)
X	int c;
X{
X	switch(vt_esc) {
X	  case EFIRST:
X	    switch(c) {
X		  case '[':
X		  	vt_esc = EBRACKET; /* remember we saw it */
X			vt_inprog = vt_x = vt_y = 0; /* clear these */
X		  	break;
X			
X		  default:
X		  	vt_esc = ENONE; /* blew it */
X		  	break;
X		}
X		break;
X	  
X	  case EBRACKET:
X		switch(c) {
X		  case 'H': /* home (or motion) */
X		  	vt_x = vt_inprog; /* column number */
X			vt_inprog = 0;
X			/* adjust for brain damaged notion of screen starting at (1,1) */
X			if(--vt_x < 0) {
X				vt_x = 0;
X			}
X			if(--vt_y < 0) {
X				vt_y = 0;
X			}
X			CURSOR; /* take it away */
X			vt_row = vt_y;
X			vt_col = vt_x;
X			HOP;
X			CURSOR;
X			vt_esc = ENONE; /* code is complete */
X			break;
X			
X		  case 'J': /* clear to end of screen */
X		  	if(vt_row + 1 < MAXROW) { /* something below us */
X				SAVE;
X				vt_row++; 	/* drop down a row */
X				vt_col = 0;	/* and over to the beginning */
X				HOP;		/* actually move there */
X				BLANK(MAXCOL, MAXROW - vt_row);
X				RESTORE;
X				HOP;
X			}
X		  	/* fall through to clear the fractional part */
X		  case 'K': /* clear to end of line */
X		  	BLANK(MAXCOL - vt_col, 1); /* erase all on the row */
X			CURSOR;	/* replace the cursor */
X			vt_esc = ENONE;
X		  	break;
X		  
X		  case '0': /* a row or column number */
X		  case '1':
X		  case '2':
X		  case '3':
X		  case '4':
X		  case '5':
X		  case '6':
X		  case '7':
X		  case '8':
X		  case '9':
X		  	vt_inprog *= 10; 		/* make room */
X			vt_inprog += c - '0';	/* add in the new digit */
X		  	break;
X			
X		  case ';': /* end of row number */
X		  	vt_y = vt_inprog;
X			vt_inprog = 0;
X		  	break;
X			
X		  default:
X		  	vt_esc = ENONE; /* blew it */
X		  	break;
X		}
X		break;
X		
X	  default:
X	  	vt_esc = ENONE; /* blew it */
X	  	break;
X	}
X	
X	return;
X}
X
X/* low level reader - call this directly if you also want to use peek - that
X * way you get raw-mode and avoid all character buffers.  But note - this code
X * does NOT initialize the world first.  You must call vt_open() manually!
X */
Xvt_getch()
X{
X	EventRecord x;
X	int rc;
X	
X	SystemTask();
X	
X	/* GetNextEvent returns a boolean enum - make it an integer */
X	while(GetNextEvent(autoKeyMask | keyDownMask, &x) == false) {
X		SystemTask(); /* wait for it */
X	}
X	rc = x.message & 0xff;
X	if(x.modifiers & cmdKey) {	/* it is a control character */
X		rc &= 0x1f;				/* so fold it */
X	}
X	if(!vt_rawf && rc == '\004') { /* cooked mode and a ^D spells EOF */
X		return(EOF);
X	}
X	return(rc);
X}
X
X/* return a character but don't pull it off the queue!  Don't block if nothing is
X * available - just return a null.
X */
Xvt_peekch()
X{
X	EventRecord x;
X	int rc;
X	
X	SystemTask();
X	
X	/* EventAvail returns a boolean enum - make it an integer */
X	if(EventAvail(autoKeyMask | keyDownMask, &x) == true) { /* something */
X		rc = x.message & 0xff;
X		if(x.modifiers & cmdKey) {	/* it is a control character */
X			rc &= 0x1f;				/* so fold it */
X		}
X		if(!vt_rawf && rc == '\004') { /* cooked mode and a ^D spells EOF */
X			return(EOF);
X		} else {	/* normal character */
X			return(rc);
X		}
X		/*NOTREACHED*/
X	} else {
X		return(0);	/* nothing - call it a null */
X	}
X	/*NOTREACHED*/
X}
X
X/* handle system requests for open, rename, and delete.  Only open is legal.
X */
Xvt_faccess(fname, mode, perm)
X	char *fname;
X	int mode;
X	int perm;
X{
X	/* if we are not the correct driver, return and let the system try
X	 * another driver.
X	 */
X	if(EqualString(fname, "dev:console", false, true) == false) {
X		return(-1);
X	}
X	
X	/* this driver only handles opens */
X	if(mode == F_OPEN) {
X		if(firsttime == 0) { /* only do it once */
X			vt_open();
X			firsttime++;
X		}
X		return(0); /* but always claim success */
X	}
X	
X	/* tell them the request is bogus */
X	return(0x40000016);
X}
X
X/* not much to do */
Xvt_close()
X{
X	return(0);
X}
X
X/* return as many characters as asked for, up to a carriage return.  Someday
X * we need to add raw mode here.
X */
Xvt_read(ap)
X	IOSTR *ap;
X{
X	/* fill the buffer if it is empty */
X	if(linesize <= 0) {
X		linesize = vt_readline(linebuf, 256);
X		lineptr = linebuf;
X	}
X	
X	/* copy till either user is satisfied or we hit the end of the line.
X	 * We must leave the count field set in the ap structure to show how
X	 * much more is to be done.
X	 */
X	for( ; (ap->count > 0) && (linesize > 0); ap->count--, linesize--) {
X		*(ap->buffer)++ = *lineptr++;
X	}
X	
X	return(0);
X}
X
X/* read until a carriage return (or we fill the buffer). Return how much we
X * got.
X */
Xvt_readline(bp, size)
X	char *bp;
X	int size;
X{
X	int i;
X	
X	for(i = size; i; bp++, i--) {
X		*bp = vt_getch();
X		
X		if(*bp == '\010' && i < size) {
X			bp -= 2;
X			i += 2;
X		}
X		
X		if(*bp == '\004' || *bp == '\n') {
X			i--;
X			break;
X		}
X	}
X	
X	return(size - i);
X}
X
X/* loop characters to the screen */
Xvt_write(ap)
X	IOSTR *ap;
X{
X	for( ; ap->count; ap->count--) { /* must leave count at 0 on exit */
X		vt_putch(*(ap->buffer)++);
X	}
X	
X	return(0);
X}
X
X/* this routine turns out to be essential because the system intends to ask us
X * for the optimum buffer size.  We return -1 to tell it to choose for us.
X */
Xvt_ioctl(fd, op, arg)
X	int fd;
X	int op;
X	int *arg;
X{
X	switch(op) {
X	  case FIOINTERACTIVE:
X	  	return(0);
X		
X	  case TIOFLUSH:
X	  	return(0);
X		
X	  /* I don't trust this!  We would have to clear screen and reset
X	   * point sizes for it to be safe.
X	   */
X	  case TIOSPORT:
X	  	/* vt = (WindowPtr) *arg; */
X	  	return(0);
X		
X	  case TIOGPORT:
X	  	*arg = (int) vt;
X		return(0);
X		
X	  default:
X	  	return(-1);
X	}
X	/*NOTREACHED*/
X}
X
X/* this stuff should be via ioctl but why make it so hard? */
Xvt_raw()
X{
X	vt_rawf = 1;
X	
X	return;
X}
X
Xvt_cooked()
X{
X	vt_rawf = 0;
X	
X	return;
X}
X
X/* this code is a reverse compile of the cruntime.o module. */
X/*
Xwrite(fd, buf, cnt)
X	int fd;
X	char *buf;
X	int cnt;
X{
X	IOSTR *ind;
X	int foo;
X	
X	if(fd < 0) {
X		_uerror(0x16, 0);
X		return(-1);
X	}
X	
X	ind = _getIOPort(&fd);
X	
X	if(!ind) {
X		return(-1);
X	}
X	
X	if(!(ind->flags & 2)) {
X		_uerror(0x09, 0);
X		return(-1);
X	}
X	
X	ind->count = cnt;
X	ind->buffer = buf;
X	foo = (*(ind->handler->l_write))(ind);
X	
X	if(foo) {
X		_uerror(foo, ind->errcode);
X		return(-1);
X	} else {
X		return(cnt - (ind->count));
X	}
X}
X*/
X
X/* this bypasses printf and is useful for debugging to avoid recursion.
X * Prints a string.
X */
X/*
Xlpr(s)
X	char *s;
X{
X	while(*s != 0) {
X		vt_putch(*s++);
X	}
X	
X	return;
X}
X*/
X
X/* this one prints an integer in hex with leading zeros. */
X/*
Xlpx(x)
X	unsigned int x;
X{
X	int i, j;
X	
X	for(i = 0; i < 8; i++) {
X		j = (x >> (28 - (i * 4))) & 0xf;
X		if(j <= 9) {
X			vt_putch(j + '0');
X		} else {
X			vt_putch(j - 10 + 'a');
X		}
X	}
X	
X	return;
X}
X*/
X
X/* Start of code for da support.  We use these for a gp text editor among
X * other things.  Note - there is no way to pass the file name in.  Oh
X * well.  Most of this code is stolen from the sample application which
X * Apple distributes with MPW and hence is copyright Apple Computer Corp.
X */
X
X/*
X * Resource ID constants.
X */
X# define appleID		128
X# define fileID 		129
X# define editID 		130
X
X# define appleMenu		0
X
X# define fileMenu		1
X# define	quitCommand 	1
X
X# define editMenu		2
X# define	undoCommand 	1
X# define	cutCommand		3
X# define	copyCommand 	4
X# define	pasteCommand	5
X# define	clearCommand	6
X
X# define menuCount	 3
X
X/*
X * HIWORD and LOWORD macros, for readability.
X */
X# define HIWORD(aLong)		(((aLong) >> 16) & 0xFFFF)
X# define LOWORD(aLong)		((aLong) & 0xFFFF)
X
X/*
X * Global Data objects, used by routines external to main().
X */
XMenuHandle		MyMenus[menuCount]; 	/* The menu handles */
Xint				Doneflag;				/* Becomes TRUE when File/Quit chosen */
X
Xda_mode(fname)
X	char *fname;
X{
X	EventRecord 	myEvent;
X	WindowPtr		theActiveWindow, whichWindow;
X	GrafPtr 		savePort;
X	char			forcedDA[256];
X
X	setupMenus();
X
X	for (Doneflag = 0; !Doneflag; ) {
X		/*
X		 * Main Event tasks:
X		 */
X		SystemTask();
X		
X		/* if a name was passed in, assume it is a DA - we fake an open
X		 * of it.  DA's are funny in that the name contains a leading
X		 * NULL character.  So we stick one in 'cause they are hard to
X		 * type.  This results in a bizzare C string but the Desk Manager
X		 * is happy...
X		 */
X		if(fname[0] != '\0') {
X			forcedDA[0] = '\0'; /* DA names (usually) have this */
X			strcpy(forcedDA + 1, fname); /* don't step on the null */
X			fname[0] = '\0'; 	/* open it only once */
X			GetPort(&savePort);
X			(void) OpenDeskAcc(forcedDA);
X			SetPort(savePort);
X			continue;
X		}
X				
X		theActiveWindow = FrontWindow();		/* Used often, avoid repeated calls */
X		/*
X		 * Handle the next event.
X		 */
X		if ( ! GetNextEvent(everyEvent, &myEvent)) {
X			continue;	/* not for us */
X		}
X		/*
X		 * In the unlikely case that the active desk accessory does not
X		 * handle mouseDown, keyDown, or other events, GetNextEvent() will
X		 * give them to us!  So before we perform actions on some events,
X		 * we check to see that the affected window in question is really
X		 * our window.
X		 */
X		switch (myEvent.what) {
X			case mouseDown:
X				switch (FindWindow(&myEvent.where, &whichWindow)) {
X					case inSysWindow:
X						SystemClick(&myEvent, whichWindow);
X						break;
X					case inMenuBar:
X						doCommand(MenuSelect(&myEvent.where));
X						break;
X					case inDrag:
X					case inGrow:
X						/* No such - Fall through */
X					case inContent:
X						if (whichWindow != theActiveWindow) {
X							SelectWindow(whichWindow);
X						}
X						break;
X					default:
X						break;
X				}/*endsw FindWindow*/
X				break;
X
X			case keyDown:
X			case autoKey:
X				if (vt == theActiveWindow) {
X					if (myEvent.modifiers & cmdKey) {
X						doCommand(MenuKey(myEvent.message & charCodeMask));
X					}
X				}
X				break;
X
X			case activateEvt:
X				if ((WindowPtr) myEvent.message == vt) {
X					if (myEvent.modifiers & activeFlag) {
X						DisableItem(MyMenus[editMenu], 0);
X					} else {
X						EnableItem(MyMenus[editMenu], 0);
X					}
X					DrawMenuBar();
X				}
X				break;
X
X			default:
X				break;
X
X		}/*endsw myEvent.what*/
X
X	}/*endfor Main Event loop*/
X
X	trashMenus();
X	return;
X}
X
XsetupMenus()
X{
X	register MenuHandle *pMenu;
X	/*
X	 * Set up the desk accessories menu.
X	 *  We install the desk accessory names from the 'DRVR' resources.
X	 */
X	MyMenus[appleMenu] = GetMenu(appleID);
X	AddResMenu(MyMenus[appleMenu], (ResType) 'DRVR');
X	/*
X	 * Now the File and Edit menus.
X	 */
X	MyMenus[fileMenu] = GetMenu(fileID);
X	MyMenus[editMenu] = GetMenu(editID);
X	/*
X	 * Now insert all of the application menus in the menu bar.
X	 *
X	 * "Real" C programmers never use array indexes
X	 * unless they're constants :-)
X	 */
X	for (pMenu = &MyMenus[0]; pMenu < &MyMenus[menuCount]; ++pMenu) {
X		InsertMenu(*pMenu, 0);
X	}
X	DisableItem(MyMenus[editMenu], 0);
X
X	DrawMenuBar();
X
X	return;
X}
X
XtrashMenus()
X{
X	ClearMenuBar();		/* remove menus */
X	DrawMenuBar();		/* show it */
X	
X	ReleaseResource(MyMenus[appleMenu]);
X	ReleaseResource(MyMenus[fileMenu]);
X	ReleaseResource(MyMenus[editMenu]);
X
X	return;
X}
X
X/*
X * Process mouse clicks in menu bar
X */
XdoCommand(mResult)
Xlong mResult;
X{	
X	int 				theMenu, theItem;
X	char				daName[256];
X	GrafPtr 			savePort;
X
X	theItem = LOWORD(mResult);
X	theMenu = HIWORD(mResult);		/* This is the resource ID */
X
X	switch (theMenu) {
X		case appleID:
X			GetItem(MyMenus[appleMenu], theItem, daName);
X			GetPort(&savePort);
X			(void) OpenDeskAcc(daName);
X			SetPort(savePort);
X			break;
X
X		case fileID:
X			switch (theItem) {
X				case quitCommand:
X					Doneflag++;			/* Request exit */
X					break;
X				default:
X					break;
X			}
X			break;
X		case editID:
X			/*
X			 * If this is for a 'standard' edit item,
X			 * run it through SystemEdit.
X			 */
X			if (theItem <= clearCommand) {
X				SystemEdit(theItem-1);
X			}
X			break;
X
X		default:
X			break;
X
X	}/*endsw theMenu*/
X
X	HiliteMenu(0);
X
X	return;
X}
END_OF_FILE
if test 19069 -ne `wc -c <'mac-vt.c'`; then
    echo shar: \"'mac-vt.c'\" unpacked with wrong size!
fi
# end of 'mac-vt.c'
fi
echo shar: End of archive 9 \(of 15\).
cp /dev/null ark9isdone
MISSING=""
for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ; do
    if test ! -f ark${I}isdone ; then
	MISSING="${MISSING} ${I}"
    fi
done
if test "${MISSING}" = "" ; then
    echo You have unpacked all 15 archives.
    rm -f ark[1-9]isdone ark[1-9][0-9]isdone
else
    echo You still need to unpack the following archives:
    echo "        " ${MISSING}
fi
##  End of shell archive.
exit 0