(1 / 1)
Date: October 22, 1985 21:41
From: KIM::SHEPPERD
To: @sys$mail:engineer
Some of you might appreciate a brief intro to the version 4 VMS
debugger. DEBUG works with all VMS languages, so C, BASIC, FORTRAN and
MACRO32 programmers can use it (even with mixed language programs). It
is a powerful debugger, but quite wordy, which can sometimes be rather
annoying. One of the best things about the debugger is screen mode
monitoring. In order to make full use of the screen mode, you need to
compile your programs /LIS/DEBUG and link them /DEBUG. This will cause
symbols and references to the listing file to be loaded in the
executable. DEBUG reads commands from DBG$INPUT and writes its output to
DBG$OUTPUT which are, by default, assigned to SYS$INPUT and SYS$OUTPUT
respectively. If your program expects input from SYS$INPUT and writes
output to SYS$OUTPUT AND you re-assigned them to other than your
terminal, you'll need to
$ ASSIGN SYS$COMMAND DBG$INPUT
$ ASSIGN SYS$COMMAND DBG$OUTPUT
sometime before you start your debugging. The debugger will
automatically startup when you run your program if you've linked it
/DEBUG. The only module it will know about will be the first one
specified in the link command. For example, a LINK command $ LINK
ONE,TWO,THREE/DEBUG would create an image, ONE, with three modules in
it: ONE, TWO and THREE. The debugger would know that there are 3
modules, but wouldn't know about any symbols and such about any but ONE.
You need to type a SET MODULE xxx to the DBG> prompt to get additional
modules. For you C programmers, debug becomes case sensitive at startup
so you need to type module names in UPPERCASE or it'll give you a
rasberry. DEBUG will attempt to open and execute a startup file
pointed to by DBG$INIT (if any) so you can create a file putting in it
any/all SET MODULE command(s) or anything else and point to it with
DBG$INIT to speed things up a bit. (Note: most commands and options can
be abbreviated to 3 characters, some can be abbreviated to 1 char such
as EXAMINE, STEP, GO, etc.) You can break execution of your running
program at anytime by typing ^Y (unless your program has disabled ^Y's)
and typing DEBUG to DCL's $ prompt.
Breakpoints:
By setting breakpoints, you can suspend program execution at
specified locations. The breakpoint is taken before the instruction at
the specified address is executed. You set breakpoints with the SET
BREAK command:
DBG>SET BREAK [/qualifier] [address_expression -
[,address_expression...]] [WHEN (expression)] -
[DO (command_list)]
DBG>CANCEL BREAK [/qualifier] [address_expression -
[,address_expression...]]
The qualifiers allowed on the SET/CANCEL BREAK are:
/ALL !valid on CANCEL BREAK only
/AFTER:n !break only after n occurances
/BRANCH !break on all branches (no address_exp allowed)
/CALL !break on all CALL's (no address_exp allowed)
/EXCEPTION !break on all exceptions
/INSTRUCTION !break on all instructions (single step macro)
/INSTRUCT=(op_code,...) !break on selected instructions
/LINE !break on each line (single step hll)
/MODIFY !break on any memory write
/RETURN !break on all RET instructions (subroutine return)
/[NO]SILENT !displays no message when watchpoint hit
/[NO]SOURCE !displays the source line that caused the hit
/TEMPORARY !watchpoint is cancelled after first activated
A breakpoint is a program location where the debugger performs the
following actions: 1) Suspends program execution; 2) Checks the /AFTER
count and resumes execution if the specified number of activations
has not been reached; 3) Evaluates the WHEN clause (if any) and resumes
execution if it evaluates FALSE in the current language; 4) Displays
the name or address of the location where program execution has been
suspended; 5) Executes the commands in the DO clause if one was
specified; 6) Issues the DBG> prompt (if a DO command was not GO).
Tracepoints:
A TRACEPOINT is identical to a BREAKPOINT except that program
execution always continues after the trace is reported. The syntax and
options on the SET TRACEPOINT are the same as for the SET BREAK:
DBG>SET TRACE [/qualifier] [address_expression -
[,address_expression...]] [WHEN (expression)] -
[DO (command_list)]
DBG>CANCEL TRACE [/qualifier] [address_expression -
[,address_expression...]]
See the details on the SET BREAK command.
Watchpoints:
By setting a watchpoint, you can cause the program to stop whenever
a particular variable or other memory area has been modified. When a
watchpoint in your program is activated, the debugger suspends
execution and reports the location of the variable modified, the
initial and changed values of the variable and the instruction that
caused the modification:
DBG>SET WATCHPOINT [/qualifier] address_expression -
[,address_expression...] [WHEN (expression)] -
[DO (command_list)]
DBG>CANCEL WATCHPOINT [/qualifier] [address_expression -
[,address_expression...]]
The qualifiers allowed on WATCHPOINTS are
/AFTER:n !begin trace/watch after n occurances
/[NO]SILENT !displays no message when watchpoint hit
/[NO]SOURCE !displays the source line that caused the hit
/TEMPORARY !watchpoint is cancelled after first activated
WATCHPOINTS sound neater than they actually are. They only report on
accesses that MODIFY locations, you cannot watch a location for READ
access. The debugger causes the hardware to detect these modifications
by setting the write protection on the location in question. A serious
problem occurs due to the fact that the VAX's memory protection is
effective to a granularity of 512 bytes (1 page). The modification is
reported to DEBUG by the hardware via an ACCESS VIOLATION FAULT. Debug
examines the addresses involved in the fault and decides whether it
really is a fault or not. If the variable in question is surrounded by
rapidly changing data, there will be many many faults making your
program run V-E-R-Y S-L-O-W. There are further complications if you
happen to have a disk buffer (or any buffer used by a VMS function) in
the vacinity of a watchpoint variable. What happens in this instance is
that VMS is given the ACCESS VIOLATION FAULT and it gives up with
INVALID USER BUFFER which can really be misleading (Gee...what does
"invalid user buffer" mean? and besides, it worked a couple of minutes
ago...).
Screen Mode Debugging:
Type PF3 on a CIT-101 or VT100 to put the debugger in screen mode.
You'll notice that it creates 3 windows. The top window displays the
source (from the LIST file) including LINE numbers and is labled on
the very top line with:
---SRC: module file_name --source-scroll-----
The SRC labels the window, the "module file_name" indicates the file
from where the currently displayed source came, the "source" flags the
contents of the window as being source data and "scroll" means that the
scroll keys will operate on this window (typing a keypad 3 will move
the scroll word to the OUT window).
The middle window is for debugger output and is labled with:
---OUT---output-------------------------------
The bottom window is for command input. The pointer on the left side of
the top window points to the next instruction that will be executed. The
keypad has some predefined keys to do some useful things. Some of the
most often used keys are listed here:
(Gold = PF1, Blue = PF4, HELP = PF2, HELP = Gold/PF2, HELP = Blue/PF2)
PF3 = Set mode screen !to setup in screen mode
Gold/PF3 = Set mode noscreen !to turn off screen mode
8 = scroll window up !up_arrow function
2 = scroll window down !down_arrow function
3 = toggle scrolling from SRC to OUT !move scroll function to other window
5 = examine/source .0\%PC !display source at current PC
- = make SRC window full screen
Blue/- = put SRC and OUT windows up
0 = step to next instruction
Gold/0 = step into subroutine !default is to step OVER subroutines
Blue/0 = step over subroutine !if you changed the default to step/into
, = GO
There are tons and tons of options avaliable. The DEBUG manual is about the
size of a Wards catalog, but you are welcome to brouse through it and
order up all that you take a liking to.
Happy debugging
ds
From: KIM::VICKERS 23-OCT-1985 11:26:35.33
To: @ODDGRP,RAINS,VANELDREN,MARGOLIN,ALBAUGH
CC:
Subj: Hummer
Project Proposal - Hummer/Synkazoo
1. Brief Description
This is a small hand-held musical instrument which analyzes the pitch
and amplitude of humming, singing, or whistling, and controls the corresponding
parameters of a built-in polyphonic synthesizer (Yamaha chip.) The user would
be able to listen to a click track and overdub drum, bass, lead guitar, and
various other instruments, turning the vocalist into a 1-man band.
There would be output jacks for connecting the device to a home stereo
or a guitar amplifier, and there would possibly be a built-in speaker. Also
there would be a MIDI music synthesizer serial output, so that musicians could
control their synthesizers with their voice. The instrument would preferably
be powered by either batteries or an external transformer lump.
Other features could include the option of quantizing each note to the
nearest semi-tone, for people who aren't that great at singing or humming in
tune. In this mode, vibrato could be selected, to substitute for the voice's
natural vibrato. There could be an octave select switch, so you could play
much higher or lower than you can hum. And there could be speed select as
well, so you could hum a fast part slowly and double the speed on playback.
The voice is the most expressive musical instrument, and with this
product, it can be used to directly control a variety of synthesized
instruments.
2. Market
A. Musical toy users - these people would be attracted to the idea of a
hand-held 1-man band electronic kazoo. These are the people who buy $200 Casio
keyboards with built-in tacky rhythm, Mattel Syn-Drums, etc.
B. Vocalists - these people could turn themselves into any instrument
of the orchestra.
C. Synthesizer owners - would view this as an inexpensive accessory
that would allow them to do new and vastly more expressive effects.
D. Other musicians - composers could try out how different musical
lines work together, without having to write the music out and multi-track it.
Players of other orchestral instruments could use those instruments to
control the synthesizer.
It seems like there is potentially a huge market, both fad- and non-fad-
oriented, depending on the price.
3. Price - very rough estimates
6502 $1.50
RAM 8.00
ROM 1.50
Yamaha 9.00 (this is a smaller chip, 3 FM voice + built in GI
chip which could be used for drums and click-
track, plus a monophonic DAC)
A-D 2.00
Mic 2.00
Speaker 1.50
Display 2.00
Switches 2.00
Electr. 7.00 misc. electronics
Package 10.00
_____
$46.50
X 4 consumer markup
_____
$186.00
The general consensus that was reached with people I've talked to is
that the product probably needs to be under $200 to reach the broadest market.
Future models could include more voices, more memory, more features, for more
money.
4. Potential Problems
A. Technical
The only real technical difficulty other than cost-reduction is
the pitch-tracking. There are many waveforms for which the pitch is
undefined, and the 1.7 mHz 6502 has to figure out the pitch in real
time. The issues are - how many pitch errors will be made, how
objectionable will they be, will there be a noticable delay between
when you hum and when you hear the output, and can it be done in real
time. There is a product being sold for the Atari 800 which does
many of these functions in real time, using only an external ADC, and
using the 1 mHz 6502 to do the analysis. Fortunately, singing or
humming is more strongly pitched than spoken voice, so the pitch
analysis can be somewhat simpler. My feeling is that the technical
difficulties will not be limiting factors.
B. Legal
Atari Inc. Corporate Research at one time long ago was talking
about a similar idea (but without the MIDI-out or the advantage of
being able to multi-track with a polyphonic Yamaha chip.) But you
can't patent an idea, and although it would be tacky for us to use
the same name, Hummer, that they were using, so sue us.
A thornier problem is the fact that our current Yamaha contract,
and presumably any future one we sign to purchase the cheaper chip,
explicitly prohibits us from competing with Yamaha in the consumer
music market. Ideally what would happen would be that we would design
the product, do a non-disclosure agreement with them, demonstrate the
product, and market the product as a joint venture using Yamaha's name
and distribution channels. This is tricky, but I'm naive enough to
think it could happen this way. The obvious question is what keeps
them from taking the idea and doing it on their own, and the obvious
answer is - not much. Still, we would be saving them from having to
waste time going through the whole engineering development cycle.
They've used independant programmers in the U.S before to write
computer music software that they could have written themselves.
We wouldn't be in much of a bargaining position concerning
price, but we could always bluff that we could use some other chip
that's almost as good. If worst came to worst, we could either find
some other chip that's almost as good, or market the device primarily
as a MIDI-controller. At least we would still have a product, although
the market would be smaller.
5. Resources and time frame
I currently have time-domain pitch and amplitude analysis software
running on the Sound Processing System. This would need to be considerably
tightened up and tested, and the algorithms transferred to 6502. Most of the
6502 development could be done with a System I or System II board, with an A-D
input added. Final development would need the actual target hardware, with the
cheap Yamaha chip in place of the one we are currently using. Dennis Harper is
interested in doing the 6502 code, fortunately, and I can do most of the
hardware design, as long as there are real engineers around to answer questions.
1. Project initiation meeting, and demonstration of
humming, analysis, resynthesis and
overdubbing with the Yamaha chip - 2-3 weeks
1. Modification and testing of analysis algorithms - 1-2 months
2. 6502 development (concurrent with hardware) - 3 months?
3. Slack - 1-2 months
__________
~6 months
Oct 22, 1985