Micro_Cornucopia_#50_Nov89 Micro Cornucopia #50 Nov89

Micro_Cornucopia_#50_Nov89 Micro_Cornucopia_%2350_Nov89

User Manual: Micro_Cornucopia_#50_Nov89

Open the PDF directly: View PDF PDF.
Page Count: 100

DownloadMicro_Cornucopia_#50_Nov89 Micro Cornucopia #50 Nov89
Open PDF In BrowserView PDF
No. 50

November-December 1989

THE

TECHNICAL

M

o

3D Graphics
In Depth
This whole issue is a project. Put UNIX
on your 386, build a board to grab
video images, build another to analyze
voices, and then display all your
graphics in 3D.

3D-Surface
Generation

page 8

The PC Video Frame
Grabber

page 16

LIMBO, Part Three
Our robot project rolls on.

page 22

PostScriptal Two

page 32

A very graphic look at a very graphic
language.

UNIX For The PC

page 40

Which UNIX should you purchase for
your new 386? There are some real
bargains.

And More

• • •

On Your Own
An inside look at the lives of
silicon valley consultants.

o

$3.95

7447019388

3

J 0 URN
A.L
.

COPIA

Ufl!lf?!iiJ J/@fl!lf? fP©lEifl5Ju O!iiJ(1@ ill [§J@r:JQf?iJfl!lO
[Lo@@f?o(1@f?J/ O!iiJ@ &!iiJ@O!iiJQQf?O!iiJ@ (1@@ODDD
Introducing ...

The PC-LabCard
Family
Only from
HSC Electronic Supply

Dig ital 1/0 and
Counter Card
• 32 Digital Input Channels
- TTL compatible
- Low loading: 0.2 mA at OAV input

• 32 Digital Output Channels
- TTL compatible
- Driving capacity: Sink 24 mA,
source 15 mA

• Intel 8253 Timer/Counter
- 3 channels of timer/counter
- Breadboard area for flexible user
configuration
PCl· 720 ...............................$160.00

I
~

.

~-

~
•

•

.~

~

/;:
,-{::

..,.,

~.'"

• Large breadboard area (3290 holes)
• Independent memory and 1/0 address
decoders built-in
• Memory and I/O ports are jumper
selectable
• All bus signals are buffered, marked,
and ready for use
PCL-750 .................................... $74.00

"PC-LabCard" is a family of
add-on cards to turn your PC into a
high performance data acquisition/
testing system at an attractive price.

-

I

~ t.

-;

-:-:-~-,--< ?;:~,.-;<,

It includes not only the hardware
cards, but also the software,
accessories and application support
packages which come together to
make a thoughtful solution to your
PC-based automation needs.

... '

~
'.

Prototype Development
Card

IBM PC/XT/AT and it's
compatible models are moving into
Industrial/Laboratory applications at
an increasing rate. The reasons for
this include their price/performance
ratio and short user learning curve.
PC-based data acquisition boards
are now taking the place of the
traditional data loggers or recorders
which cost. several times more.

. ,:;:l!::~

14 Bit Super-Lab
AID + DIA + DIO +Counter
-Analog Input (AID converter)
- 16 different channels"
- 14 bit, 25K/sec sample~ate ' ...•... '
-:-Input range: +5V to-5V, +1Vto.;1V

•• >~naloglnput (t\IDconverter)
,·16single~ended

channels, 12 bit
-Input range:<+5Vto ~5V,+1Vto ~.1V

-Analog Output (D/Acomierter)

~ DIA Channels: r standard/loptional
-14 bit, +/- 5Vfullrage .' .

• Analog (:>utput( 01A converter)
~ • 2channel,12 bit.·
. ~O,,:+5Vfullrange

~•••• Digital

I/O

~16phannelse~:lCh, TTLcompatible

• Counter
>r6hanneloftimer/counter
~.' PrOgrammable pacer function
l=>CL~712 .. ~ .. ~; ....... ,.; ....... ;..... $295.00

llfl~~'(Q)f/~{ffJg~©D§JO'§J

Steppi n9 rvlotor
Control·Card

• .Digital I/O ..

.; 1 channel. of timer/counter
.:.Programmable'pacerfuhdiori·
PCL-714 .. ;.... " ... ~·..• ;.;,.~L.·..•.•.. ;.; ..$495.00

'\'; ,':1 f,'

Call ,the

,~@@/Jjl1rdJ{j)[r~gl/'(#)@g ",' . . :~~It~~~:ff~p~~~~~ outPutE/~g::~~iC
~{ffJf/§J .©U§1~i/©A\ . . @~'fl PCL.73a.~~""':""~""r"';"I .... ;$395.0oRe~g~fce
Etectro~g~p~{~~~~e~~~~upPlies

HSC of Sacramento'·

HSC,of$anta Rosa

sa
" sc'r5a,4mgeHn9tom,'COCAkg84t9'
,',;"8'

6cSolt9atRI"eCdAw090SdS4D1r.

(916) 338-254S

"

(707) 792-2277' '

.vv~ ship'Uf$~9()D , '
We shipto,APO/FPO

.

• Counter

• Independen,t; simultaneous operation
of up to 3 motors
• ProgrammablespeedJrom 3.3 to 3410, ppS
• Built~inacceleration control
• OneClock'(pulse,·Direction) or
two,clock (OW, CCWPulses) output mode

:~~~~lg~~~~~tpu~~~~~iri°utPuts

i

-16channels each, TTLc()r11patibl~

,(408) 732~2814

'·"S>'/:3
. '" " " '"
'-'1"1,,""""
tsICle"CCiUfQt'l"li.a
NowI Galif~(jrnla

,:,,:,:~ I r-(·.'.,~· !.,\lI.i:'';-.,~,~(.1 ,'"(",',,,./c-,ct0/;' ~
,!

: ':;

';.',;~.::... ,:::.": ',~~(.»,~'j

:.~, "~:;,·.\ "',.I·~'. , !.'t;,I. i·;. , ·,. i.~: 1.l~l~r~~l~rl) F

,

r.•

.•.:..1.·.i.•i,i,.:,;.•.
.:.,i•.I.:.••.•.;..•
,,~-- "," '~:;;v 'i'<"~'- ,,'::~'-' ~.<"<~·t:",!/.~:,·:,~~~·~,,1·,JJ<{,;:'·'j

,j;/ ••• V,;\ i)':

'A:r,·.,!,H

i;'+Y'

,

fi~'t.•;J?ifJ :\',,'1;;;',\ 1i',

h"":"""';'"I':'~I"':!

','

}.',

;<:~.;:~\}

,

':

Twelve function
keys for increased
Erasable template
automatic
to label ;vur function
operation.
key assignments.
Switch allows
;vu to swap
position of Ctrl
and Caps Lock.

FJ Separate numeric keypad that switches to
a multifunction business calculator
with tilt-up LCD display. Includes memory,
square root and percent keys.
Solar panel
Keyboard and
to power the
calculator status
calcu/atorindicator lights.

Switch-selectable
for all IBM XT,
AT, PS/2 and
compatible
systems.
Extra large
Backspace and
Enter keys.

even when

the computer is
turned
off!

$149~5 buys you both
the hot-selling spreadsheet and the
...............
TurboCalc-lll QUAl fRO
Keyboard/
Calculator.

charge your spreadsheet and typing
performance.
Like our famous tactile, positiveresponse keys that give
you a much better feel for
the road. So you can type
faster with fewer mistakes
than ever before.
And the new, enhanced
For just $149.95-less
IBM"lOl-key layout with
than Quattro's street
some logical improveprice, and a lot less
ments-including separate
than its $247.50 sugnumeric and cursor keys
gested retail price, you
that let you cruise through
can now get both Borspreadsheet data entry
land's best-seller and"""
. ·.~"i"!"T
without ever having to
the keyboard you need
"More than 1-2-3" at
shift Num Lock.
to drive it at top speed.
less than half the cosr
Get better mileage
Namely, the TurboThat's what PC Mggazine
from your desktop.
Calc-ill~ Keyboard!
says about Quattro," the
In case you haven't noticed
Calculator from
!wt-selling spreadsheet
already, the keypad
Datadesk.
from Borland Imagine
doubles as a full-function
Boost your
what theyU say about
business calculator comoverall performance.
this ~~dinary
plete with its own pop-up
With its built-in,
utiau
LCD display. Which saves
presentation-quality graphics, intellispace on your desktop and lets you
gent recalcs, unlimited macros, easy
perform any calculation with a single
installation and compatibility with
keystroke-no matter what software
leading spreadsheet and database
you're driving.
software, Quattro is made to order
What's more, the keypad packs a
for your business.
solar panel, so you can start up the
And TurboCalc-ill is made to
calculator even when your computer
order for Quattro. Or for any other
is idle.
software you like to drive.
We wouldn't steer
Because, as you can see, it's loaded
you wrong.
with features designed to turboFrankly, getting into a Datadesk keyReader Service Number 8

board would be an inspired idea at
this price even if you didn't get
Quattro in the bargain.
After all, as InfoWorld says, "if you
haven't looked at Datadesk's keyboards, you ought to:'
According to the Washington Post,
"for ingenUity of design and sheer
dollar value, Datadesk can't be beat:'
And when it comes to your peace
of mind, nothing beats our two-year

send them back within 30 days and
well cheerfully refund your $149.95.
No questions asked.
How, you ask, can you take advantage of this remarkable offer? Just fill
out the coupon and send it in.
Better yet, call us toll-free.
And tell us to step on it.

warranty.

What's more, if Quattro and TurboCalc-ill don't blow the doors off the
vehicles you're currently drivrng,just

rr:

.,'

$149 95
I

-

DA.TA.DESK
All individual trademarks and copyrights are acknowledged.

1;1§:\la:~"t:

Bundle includes Datadesk's TurboCa\c-11l

. - Keyboard/Calculator for IDM" and compatibles and
Borland's Quattro sllreadsheet. Add $10 shipping and handling
per urut (Continental U.S. only). CA reSIdents please add $9.75 sales tax per unit.
Amount Enclosed:
# of Units:
Disk Size: o 3lh" 05%"
Com~uter Type*:
*1£ P /2, include additional $5 for cable adapter.
Payment: o VISA DMC DAMEX o CHECK
Exp.Date:
Card No:

,

<.•

Me

<;

Name
Company Name

•••

Daytime Tek/>hone

Zip

State

City

.......•

Mail to: Datadesk, 7651 Haskell Ave., Van Nuys, CA 91406. FAX: (818) 780-7307

':

Or Call: (800) 826-5398. In cA, Call: (800) 592-9602

.'>

'"

Address

~
..

....' ... ,' ...:.

-\ .}ml~fAW
,

.,. ".,

'" .....

'.:C."

'-=C,'

'c'

.> .....'...;.•·\"1~'.i':'!,,•. ,

/.

,..........

',.: .... ,.,'.';.,

- - - - - - - - - - - - - - - - - - - - , ._._-----------_._---

fiNAllY A debugging
tool tough enough to
handle the DOS
Nasties.

New Version 2.0

How Soft-ICE Works

Soft-ICE memory range break points help you
track down memory over-write problems
whether you are doing the over-writing or
another program is over-writing you.

Soft-ICE uses the power of the 80386 to surround your program in a virtual machine.
This gives you complete control of the
DOS environment, while Soft-ICE runs
safely in protected mode. Soft- ICE uses the
80386 to provide real-time break points on
memory locations, memory ranges, execution,
II 0 ports, hardware &: software interrupts.
With Soft-ICE you get all the speed and power of
a hardware-assisted debugger at a software price.

Hung program? No problem!

Don't want to switch debuggers?

Nasty over-write? No sweat!

You don't have to!

When the system hangs, you now have hope.
With Soft-ICE you can break out of hung
programs no matter how bad the system has
been trashed. And with Soft-ICE's back trace
ranges you can re-play the instructions that led
up to the crash.

Soft-ICE can run stand-alone or it can add its
powerful break points to the debugger you already
use. Use your favorite debugger until you require
Soft-ICE. Simply pop up the Soft-ICE window to set
powerful real-time break points. When a break point
is reached, your debugger will be activated automatically.

Program too large? Not with Soft-ICE!
Soft-ICE runs entirely in extended memory. This means
you can debug even the largest DOS programs. And
since your program runs at the same address whether
Soft-ICE is loaded or not you can find those subtle
bugs that change when the starting address of your
code changes.

System debugging? Soft-ICE is a natural!
Soft-ICE is ideal for full source level debugging of TSRs,
interrupt service routines, self booting programs, DOS
loadable device drivers, real-time kernels, non-DOS O/Ss
and ROMs. Soft- ICE can even debug within DOS & BIOS.

MagicCV with Soft-ICE
Using Soft-ICE with CodeView gives you the features
necessary for professional level systems debugging.
MagicCV and Soft- ICE can work in concert with CodeView to provide the most powerful debugging platform
you will find anywhere.
"These may be the only two products I've seen in
the last two or three years that exceeded my wildest
expectations for power, compatibility and ease-of-use."
-Paul Mace
Paul Mace Software

New Soft-ICE 2.0 features
$386
$199
$199

Soft-ICE
MagicCV
MagicCV for Windows

CJ Back Trace Ranges
CJ Symbolic &: Source level debugging
D EMS 4.0 support with special EMS

debugging commands

Buy Soft-ICE &: MagicCV(W)
-Save $86.
Buy MagicCV and MagicCVW
-Save $100.
-Save $186.
Buy All 3
30 day money-back guarantee
Visa, MasterCard and
AmEx accepted

CJ Windowed user interface

™iV Nu-Mega
\j-TECHNOLOGIES

•

Y T

I

CALL TODAY (603) 888- 2386
or FAX (603) 888-2465

A W A . 0 O'

O'P' .... CTIOl'ol

PO. BOX 7607 • NASHUA, NH • 03060- 7607

2

MICRO CORNUCOPIA, #50, Nov-Dec, 1989

Reader Service Number 110

RUN CODEVIEW~TM
IN 8K
-"

MagocCV

j;,':,

'.

CodeView is a great integrated debugger. but
it uses over 200K of conventional memory.
MagicCV uses advanced features of the
80386 to load CodeView and symbols in
extended memory. This allows MagicCV to
run CodeView in less than 8K of conventional memory on your 80386 Pc.
NEW-Version 2.0 includes EMS 4.0 driver.
Attention Windows Developers!
Version available for CVW.

THE

M I C R 0

TECHNICAL

J 0 URN A L

MICRO CORNUCOPIA
NOVEMBER/DECEMBER 1989 - ISSUE NO. 50

8

16
22
32
40

Gregory K. Landheim

3D-Surface Generation

58

C'ing Clearly

Take a two dimensional illustration and turn it
into a three dimensional image? Sure. But it's not
trivial.

65

Culture Corner

The PC Video Frame Grabber

66

86World

Want to put your 'favorite' TV personality on your
favorite dartboard? Want a stock of real-life images
for your paint program? Then this is your project.

70

On Your Own

78

Units and Modules

80

Shareware

90

Techtips

82

Tidbits

96

Last Page

Gene Toner

Bob Nansel

LIMBO, Part Three
This time we're deeply into the mechanics of this moving project.
Larry Fogg

PostScript Programming, Part II
Larry probes further into the graphic mysteries of FORTH, oops, I mean
PostScript.
Bob Morein

UNIX Packages For The PC
This is the most complete comparison and discussion of 386 UNIX packages
I've seen.

49

54

Linda and Karl Lunt

Life, Bliss, And Rocky Mountain SOG
A View From The SOG
Bruce Eckel

Capturing & Graphing A Voice, Part 1
Bruce tackles another intriguing I/O project. Great information, even if you're
not in great voice.
Cover Illustration by
Rob Sanford.

MICRO CORNUCOPIA, #50, Nov-Dec, 1989

3

THE

MICRO

TECHNICAL

JOURNAL

MICRO CORNUCOPIA
Editor and Publisher
David J. Thompson
Associate Editors
Gary Entsminger
Larry Fogg
Cary Gatton
Contributing Writers
Anthony Barcellos
Bruce Eckel
Michael S. Hunt
Scott Ladd
Laine Stump
Advertising & Distribution
Erik Huston
Accounting
Sandy Thompson
Reader Services
Nancy Ellen Locke
Graphic Design & Production
Carol Steffy
MICRO CORNUCOPIA asSN 0747-587X) is
published bi-monthly for $18 per year by Micro
Cornucopia, Inc. 155 NW Hawthorne, Bend, OR
97701. Second-class postage paid at Bend, OR and
additional mailing offices. POSTMASTER: Send
address changes to MICRO CORNUCOPIA, PO
Box 223, Bend, OR 97709.
SUBSCRIPTION RATES:
1 yr. (6 issues)
$18.00
2 yr. (12 issues)
$34.00
3 yr. (18 issues)
$48.00
1 yr. Canada & Mexico
$26.00
1 yr. Other foreign (surface)
$36.00
1 yr. Foreign (airmail)
$50.00
Make all orders payable in U.s. funds
on a U.S. bank, please.

AROUND
THE BEND

By David J. Thompson

Fifty Isn't Old
If You're A
Magazin~ ...
Half A Century
As Sandy and I hand-stapled all 500 copies of the
first issue of Micro C at our kitchen table, we had no
idea that eight years later Micro C would still be around,
and we'd be working on our 50 th is~ue. Yep, and in
those 50 issues there have been so many changes in this
silly technology that even the changes have changed.
And innovations? Boy, have we seen innovations.
Once we had only software. Now we have freeware,
shareware, crippleware, vaporware, underware, and beware.
We've progressed from public domain programs
with bugs to commercial programs with bugs. (Actually, commercial programs always had bugs, it's just
that the nasty little critters are getting harder to work
around.)
Nowadays we're aiming for a computer on every
desk. When we began Micro C, we hoped for one in
every garage.
Anyway, with the big 50 upon us, I guess that means
the honeymoon is over. It's time to get down to serious
business-nose to the grindstone and ear to the ground.
We've got to get off the fence and take a stand. «Larry,
is there anything we can do about these stupid cliches
without Dave noticing? -Cary) (Probably not. -Dave»

CHANGE OF ADDRESS:
Please send your old label and new address to:

MICRO CORNUCOPIA
P.O. Box 223
Bend, Oregon 97709
CUSTOMER SERVICE:
For orders and subscription problems call
503-382-8048,9 am to 5 pm, Pacific time, M-F.
TECHNICAL ASSISTANCE
For help call 503-382-8048,
9 am to noon Pacific time, M-F
1-800-888-8087

BBS - 24 hrs. 300-1200-2400 baud
8 Bits, No Parity, 1 Stop Bit 503-382-7643
Copyright 1989 by Micro Cornucopia, Inc.
All rights reserved

ISSN 0747-587X

6
4

The
Audit

Bureau

MICRO CORNUCOPIA, #50, Nov-Dec, 1989

Salmon BBQ at the Port Alberni SOG

Continued on page 73

Lattice Tools & Libraries for
DOS and OS/2
We're the company that writes the
language and the tools. Our libraries
give you hundreds of ready-to-use
functions, compatible with our compiler
and other products.

Compiler Companion

$100

Ten proven UNIX-like tools provide a
complete programming environment,
and reduce file handling tasks,
regardless Qf programming language.

dBC III & dBC III Plus

$250/$500

Networking & non-networking libraries
let you write fast C programs to create,
access and update files compatible with
dBASE III.

Communications Library

$250

A comprehensive set of high- and lowlevel functions for asynchronous
communications programs using
XMODEM, YMODEM, KERMIT or
ASCII protocols.

C-Food Smorgasbord

$150

A selection of utility functions including
a BCD decimal arithmetic package, I/O
functions, IBM PC BIOS interface, a
Terminal Independence Page and
functions including directory, clock and
string.

Curses V Library

$125

84 C screen management functions and
macros that help you port between
UNIX System V and the Pc.

SSP!PC

$350

More than 145 subroutines eliminate
tedious and difficult mathematical
programming. Includes scientific,
engineering and statistical mathematical
routines as extensive and accurate as
similar packages used on mainframes.

PANEL Plus with Source

$495

A collection of interactive screen design
tools plus more than 150 functions to
help you create application screens.

HighStyle -Programmer's
Publishing Tool

$375

HighStyle gives you everything you
need to create attractive, highly polished
documentation for your programs.
Automatically creates tables and charts!
Includes: Word Processor, Page
Previewer, Snapshot Utility, Style
Guides, Spelling Checker, Icon Editor,
Bar Code Generator, Font Manager, and
more.

To order Lattice C 6.0, send $250 in
check or money order to: Lattice,
Inc., 2500 S. Highland Avenue, Suite
300, Lombard, IL 60148. Or order
by credit card at (800) 444-4309.
FAX # (312) 916-1190, TELEX
532253.
Reader Service Number 153

Letters

Organize, Query,
& Make Connections
Between Files of Information

MICRO EINSTEIN
The Expert System Shell
• Create expert systems
easily in minutes
• With pulldown menus and
windows
• Automatic rule generator
• Context-sensitive help
• Free example expert
systems
• Interactive full-screen
text editor
• DOS access from shell
• Turbo fast execution
(NOW 5 times faster!)
For Diagnosing ...
Monitoring ...
Indexing ...
Organizing .. .
Classifying .. .
& Discovering links
between files of information.

Only $100! (Plus $5 StH)
Reader Service Number 72

I.----C~-_-I=1----'
ACQUIRED INTELLIGENCE
P.o. BOX 2091 • DAVIS, CA 95617 • (916) 753-4704

6

MICRO CORNUCOPIA, #50, Nov-Dec, 1989

More Metaphysics
Reading your recent letters regarding
Micro C's excursion into the metaphysical realm, I thought I should write and
add my vote of support for your editorial experiment. One of the reasons
(there are many) I like Micro C is that
those behind it come through as people,
and interesting people at that. Your editorial was part of that. The same applies
to the bits of National Geographic material another letter writer referred to.
Anyway, those who complained are
entitled to their opinions. But I think an
editor should be able to write whatever
he wants in an editorial. As for those
who cancelled their subscriptions, it
seems to me pretty silly to give up 94
pages of great technical information just
because you don't like the other two
pages.
John Wells
467 Fraser st.
Victoria, B.C.
Canada V9A 6H2

~
~

Editor's note: Thanks John. After the initial flurry of letters (which ran 50% pro and
50% con), we've received a steady stream of
letters, BBS messages, and calls, most of
them starting out discussing something else
but ending with comments like yours. These
are running 99% in favor.
I've noticed some local controversy now
that our hospital is teaching "healing
touch" therapy to its nurses. It's a healing
technique in which (with patient permission) the nurses support the patient's
energy field. (Very similar to the Reiki healing techniques I've learned.)
Several people wrote angry letters to the
local paper and one even picketed the hospital. But after that initial outburst, the
nurses have received solid support from both
the local lay community and the medical
profession.

Reflections On The Radar Equation
The confusion between the radar
equation and the behavior of reflected
light on the part of Bob Nansel and Don
Sweet is because the radar return consists of scattered radiation. The usual
target is irregularly shaped and each
surface element reflects the incident
radiation in a different direction.
So the target looks like a new source
whose brightness is proportional to the
inverse square of its distance from the
radar. The signal returned to the radar
is subject to the same law, so you do
indeed multiply the two inverse squares
to get the signal strength received per
unit cross-section.
The mirror, on the other hand,
simply changes the direction of the incident light (if we consider it to be a perfect reflector), and it is proper to use the
inverse square of the total distance.
In other words, the proper analog to
the radar is obtained by replacing the
plane mirror with a polished ball bearing or a matte surface, which I think is
what Nansel assumed for his maze runner. The radar equation has nothing to
do with mirrors.
No doubt you will get a number of
responses on this one, but maybe this
will help.
Karl Theobald
1030 Granite Dr.
Granite Shoals, TX 78654

Editor's note: From the flood of responses to this raging controversy, it appears that interest in a topic is proportional
to the fourth power of that topic's abstrusity
(means it's not perfectly clear to everyone
on first glance). Read on for another illuminating view.
Letters continued on page 77

Introducing ..•

The 1st Family of
Low Cost, Powerful
Text Editors
$ 29
VEDIT Jr.
VEDIT
$ 69
VEDIT PLUS $185
Finally, you can choose the best editor for your needs without
compromising performance or paying too much. And organizations that want the "same" editor for everyone can pick VEDIT®
for most users and VEDIT PLUS for their power users.
The new family of VEDIT text editors are upwards compatible,
easy to use and offer exceptional performance, flexibility and
stunning speed. (3 to 30 times faster than the competition on
large files where speed really counts.)
Call for your free evaluation copy today. See why VEDIT has
been the #1 choice of programmers, writers and engineers
since 1980.

VEDIT Jr.- Unmatched performance for only $29.
All VEDIT editors include a pull-down menu system with "hot
keys;' context sensitive on-line help, pop-up status and ASCII
table, a configurable keyboard layout and flexible, unlimited
keystroke macros. Edit files of any size and any line length.
Perform block operations by character, line, fileorcolumn. Undo
up to 1000 keystrokes- keystroke by keystroke, line by line, or
deletion by deletion. Automatic indent, block indent and parentheses matching speed program development. Word wrap,
paragraph formatting, justification, centering, adjustable margins and printing for word processing. Run DOS programs.
VEDIT-A best value at only $69.
Simultaneously edit up to 36 files and split the screen into windows. Search/replace with regular expressions_ Includes the
best compiler support available-menu driven, easy selection
of compiler options, supports "Include" files and MAKE utilities.
VEDIT PLUS-Ultimate programmer's tool for only $185.
VEDIT PLUS adds the most powerful macro programming
language of any editor. It eliminates repetitive editing tasks and
permits creating your own editing functions. The macro
language includes testing, branching, looping, user prompts,
keyboard input, string and numeric variables and control over
the size, pOSition and color of windows. Source level macro
debugging with breakpoints and tracing. Macros developed
with VEDIT PLUS also run under VEDIT.
30 day money-back guarantee. Call for pricing of XENIX, OS/2
and FlexOS versions. Very attractive quantity pricing is available for schools, hardware and software vendors.

FREE Evaluation Copy*
Call 1·800·45·VEDIT
Compare Features and Speed
Pull-Down menus
Pop-Up ASCII table
Keystroke macros
Regular Expressions
"Cut and Paste" buffers
Text (book) markers
Undo keystroke by keystroke
Undo line by line
Normal/max Undo levels
Variable tab positions
Configurable keyboard
Integrated mouse support
FILE LIMITS
Edit files larger memory
Maximum line length
Maximum lines/file
COMPILER SUPPORT
Menu driven
Select Compiler options
Support "Include" files
BENCHMARKS 50K FILE
Simple search
Save and continue
1000 replacements
BENCHMARKS 3 MEG FILE
Simple search
Save and continue
60,000 replacements
Block-column copy (40 x 200)
Insert 1 Meg file in
middle of 1 Meg file
PRICE

VEDIT and CompuView are registered trademarks of CompuView Products, Inc. BRIEF is a
trademark of U nderWare, Inc. Norton Editor is a trademark of Peter Norton Computing Inc. OEdit
is a trademark of SemWare.
'Supports IBM PC, XT, AT, PS/2 and clones withCGA, MGA, EGA, VGA, Wyse 700, Amdek 1280
and other displays. Also supports Concurrent DOS, DESOview, Microsoft Windows,
PC-MOS/386 and most networks.
'Also available for MS-DOS (CRT terminals), TI Professional and others.
'Free evaluation disk is fully functional and can edit small files.
Reader Service Number 7

BRIEF 2.10 Norton 1.3 DEdit 2.07
VEDIT
Yes
No
No
Yes
No
Yes
No
No
1
No
100+
100+
Yes
Yes
No
No
36
1
1
100
10
10
No
No
Yes
Yes
No
No
Yes
No
No
No
500/1000
30/300
Yes
No
No
Yes
Yes
Yes
Difficult
No
Yes
No
Yes
No
Yes
>8096
8,388,607

Yes
512
65,535

Difficult
65,535
>65,535
None

No
Difficult
No

-

No
512
20,000
None

Yes
Menu
Yes
0.2 sec
1 sec
3 sec

1 sec
2 sec
19 sec

1 sec
2 sec
17 sec

0.3 sec
1 sec
2.5 sec

1:40 min
1:05 min
3:18 min
2 sec

1:36 min
3:23 min
1:44 hour
30 sec

Cannot
Cannot
Cannot
Cannot

Cannot
Cannot
Cannot
2 sec

1:11 min
$69

15:13 min
$195

Cannot
$75

Cannot
$54.95

-

CompuView
P.O. Box 1586, Ann Arbor, MI48106
(313) 996-1299, Fax (313) 996-1308
MICRO CORNUCOPIA, #50, Nov-Dec, 1989

7

3D-Surface Generation
An In-Depth Look At Graphics, Part 1

Rereading the last 35 issues of Micro C,
you're probably thinking that PCX and
Mandelbrot are all you need to know about
graphics. Wrong, Ruffy. There's something
else, and it's three dimensional. (We go for
depth,)
thought it would be nice if there were
a public domain utility that did surface plotting, with hidden line removal. It would let you view the surface from any horizontal angle from 00
through 3600 and any elevation angle
from -900 to +900 • I couldn't find one, so
I wrote my own.
I planned to tum it over to the public
domain, so I scrupulously reinvented the
wheel at every step to avoid stepping on
someone else's toes. My Bresenham's line
drawing function turned out to be nowhere near as nice as the one Professor
Rasala of Northeastern University wrote
in Pascal. So I translated his implementa-

I

8

MICRO CORNUCOPIA, #50, Nov-Dec, 1989

tion to C and asked his permission to use
it. He was amused that I bothered to ask,
since Bresenham's is so standard. But if
you think it's easy to do one that's compact, true, and fast, go ahead and write it
yourself.
The project turned out to be a bear
(actually, more of a female dog). When I
got stuck on one thorn (or claw or tooth,
to keep the metaphor straight) or
another, I amused myself by translating a
Pascal high resolution printer graphics
module I wrote a few years ago into C.
The work dragged on, so I translated
another module for scalable, rotatable,
justifiable (well, just barely) character
string plotting that works with the
printer graphics module.
Finally the thing became a true nightmare. I was too far along to quit, and too
far gone to continue. I locked myself in
my house, along with several pounds of
high grade Sumatran coffee, a box of
cheap cigars, and more cases of beer than
I could count. a use base 5 to count on

my fingers, and with my left hand for the
ones, and my right hand for the fives,
and a beer tucked in my elbow, I just
couldn't get that high.) I sacrificed my
Christmas and New Year and my entire
tight brain to finish the damned thing
before my liver failed.
How This Article Happened
Now that I had created it, I had to
tum it loose. I sent it to the good folks at
Micro C and asked them to distribute it
to the public domain for me. Somewhere
in the letter (I felt guilty about the inability of the code comments to tell the full
story) I offered to write an article. (In my
delirium tremins I actually said I would
be happy to do so.) They must have
smelled the beer on the printout. They
took me up on my offer. So, here goes.
What We Have Here
If you've been paying attention, you
have a good idea already:
(1) threed.c-a general purpose mod-

By Gregory K. Landheim
123 Greene St.
North Andover, MA 01845

ule for plotting 3-D surfaces with hidden
line removal using an axonometric projection, viewable from' any horizontal
angle from 00 through 360 0 and elevation
angles from -90 0 through +90 0 • (See Figure 6.) You can use it, as is, on any plot
de-vice that uses left-handed, rectangular, integer coordinates with (0,0) in the
upper left comer, and for which you can
supply a line drawing function.
(2) grafprt.c-an IBM Graphics Printer
(and compatibles, e.g., Epson FX and LX)
high-resolution graphics module. It supports both Portrait and Landscape mode
drawings, and it draws on 8" by 105fs" of
a page.
(3) grafstr.c-scalable, rotatable, justifiable (left, right and center) string plotting module for use with grafprt.c
(4) arrays.c-contains a function to
dynamically allocate 2-dimensional arrays of any type and size (not limited by
64K segments) up to the size of the
memory available in the heap. It uses
pointers to pointers to any type, but we
won't quibble.
Editor's note: Part 2 of Gregory's article

+Z

(0,0,0)

Ymln

Xmax

+X

Figure l-Coordinate Geometry and Matrix Correspondences

(in issue #51) will cover grafprt.c, grafstr.c,
and arrays.c)
Why This Article Is So Long
Most graphics articles in technical magazines give you a brief discussion of the
math and the method. This is especially
true of articles on 3-D surface plotting.
They show you how to do it for a special
case, then wave their hands and say
something like, "Other view angles can
be dealt with by appropriate matrix element exchanges and transformations."
This is great if you're a mathematician, but then you wouldn't be reading
the article, would you? These authors are
perfectly justified by the niggardly attitude of editors who would rather fill
their magazines with something useful,
. like advertising. Fortunately, Micro C's

2

1
~ Viewer

~

-x

3

9h

+x

4
-y

Figure 2-Quadrants and View Angles
MICRO CORNUCOPIA, #50, Nov-Dec, 1989

9

In all that follows, I assume all the
coordinate systems except the plot device's are right-handed and Cartesian. I
also ignore a lot of fine points, but I'm
just talking about basics.
A coordinate system can be left- or
right-handed. Handedness refers to
whether rotation angles are specified as
clockwise from a reference axis, or counterclockwise. In right-handed systems,
the rotations are counterclockwise. Make
a fist with each hand, thumbs pointing at
you, and note the direction your fingers
curl.
If the reference axes are orthogonal (at
right angles to one another), the system is
rectangular. If the scales are the same on
each axis, the rectangular system is called
Cartesian.
Points in space are specified by
coordinate pairs (x,y) in two dimensions,
and triples (x,y,z) in three dimensions.
The coordinate elements can be either
positive or negative. A coordinate such
as (-4.3,2.7,1.5) means you can locate the
point by moving 4.3 units in the negative
x direction, then 2.7 units in the positive
y direction, then 1.5 units in the positive
z direction.
In a 3-D right-handed system, if you
point the index finger of your right hand
along the positive x-axis, the middle finger along the positive y-axis, and the
thumb up; the thumb points along the
positive z-axis. Which axis actually

golden-hearted editors turn down
volumes of advertising to give you indepth articles and massive amounts of
code.
My background is in physics, math,
and mechanical engineering, and I have
never formally studied computer science.
Working with C.S. people, I find a circle
of confusion (cold confusion) where they
should be keeping coordinate geometry
and matrices. So I'll dwell a lot on the
basics.
I'll explain the methods behind the 3D surface plotting module, the printer
graphics module, and the associated
string drawing module. Nonetheless, I
shall attempt to keep things brief without
sacrificing substance.
Coordinate Systems-The Basics
Cartesian geometry acquired its name
from Rene Descartes (1596-1650), who invented the system. Mathematicians,
physicists, and other sensible folk like to
use right-handed Cartesian systems,
while computer scientists prefer lefthanded systems.
I suspect that, somewhere in the history of computer science, the math departments wouldn't loan their coordinate
transformation routines to the C.S. departments, so the C.S. people did their
own and got it backwards. (In fairness, I
admit that most plot devices are intrinsically left-handed.)

points up is arbitrary.
When you learn Cartesian geometry,
you start out with a flat surface, the x-y
plane, and spend a lot of time learning
the rules for 2-D. When extending it to
3-D, the instructor is used to drawing
things on the blackboard, so y becomes
"up" and z becomes "out" (unless
they're computer scientists; then z is
"in"). I liked to cut classes and learned
with my paper flat on my desk, so I
chose to make positive z "up".
Since two lines define a plane, in a 3D system we have an x-y plane, an x-z
plane, and a y-z plane. With positive z
"up," the x-y plane is the reference plane.
This means that surfaces are specified as
z = f(x,y). Figure 1 shows the coordinate
system used by the 3-D surface module.
Grids And How To Use Them
Surfaces tend to be smooth, but drawing a smooth surface takes a lot of computational time. So we fake it by computing the surface at grid locations. A rectangular grid is specified by the number
of points in the x-direction and the number of points in the y-direction, referred
to, respectively, as nx and ny. To make
life easy, we make the spacing between
grid points constant in a given direction.
The domain over which we plot the
surface extends from Xmin to Xmax and
from Ymin to ymax. Figure 1 shows the relationship between a grid in the x-y

Figure 4-Three Coordinate Systems, CRT Display

Figure 3-Axonometric Projection

[0,0]

ox

(IXmax , IVmax)

(Pmax ; Omax) = (Xmaxw; Vmaxw)

OV

~

T Zlj = f(xlj;Ylj)
.p

+---

I

-7=-------T-----------~ +p

--~-~
~

___

I

/'

~

+V

IV

------ ---1/
(0,0)

10

MICRO CORNUCOPIA, #50, Nov-Dec, 1989

i (Pmln; Omln) = (Xmlnw; Vmlnw)

IX

(OXmax,OVmax)

plane and its axial coordinates. The elements in square brackets correspond to
matrix subscripts. You could, for example, store all the coordinates that describe the surface in arrays declared:
float x[nx] [ny],y[nx] [ny],z[nx] [nY)i

This quickly eats up storage space.
Since we're smart enough to use a Cartesian system, we can completely specify
the surface by the values Xm.in, Xmax, ym.in,
ymax, nx, ny, and a 2-D array containing
z. For use in surfaceO, the storage can be
accomplished thus:

=

=

zmin
1.7e38; zmax
-1.7e38i
deltax = (xmax - xmin) / (nx-1)i
deltay = (ymax - ymin) / (ny-1)i

stead I use the more natural concept of
elevation angle (eel) defined as the angle
above the x-y plane at the location of the
viewer's eye.
Axonometric Projection
This method of rendering 3-D objects
in two dimensions was invented during
the dark ages (Le., before computers). It
was quick and easy then, and it's quick
and easy now. You lose perspective
(especially when you're on your third
six-pack and have to close one eye to
read code). But it is quicker than a perspective transformation (I think, don't
quote me on this), and with surfaces you
rarely need depth cues. If you would like
a nice perspective transformation, see
Reference (3).
When I developed the 3-D module, I
began by defining the math transformations with the viewer's eye located in or
above quadrant 1. Figures 1 and 3 show
views in that quadrant.
Figure 3 shows the transformation
from (x,y,z) coordinates to projected (p,q)
coordinates. Careful study reveals that
for any point (x, y,z):

Quadrants And View Angles
In the x-y plane, the coordinate axes
divide the plane into four quadrants. By
mathematical convention, Figure 2 shows
their labeling. Also shown is the relationship between the viewer's eye and the
horizontal view angle (8h) in the x-y
plane.
I depart from the standard mathematical convention of specifying the vertical view angle as the angle rotated
downward from the positive z axis. In-

x = xmini
for (i=Oi i zmax)
zmax = z [i] [j] i
Y += deltaYi
x += deltaxi

Add lightning fast graphics to your programs quickly and
easily through the popular PCX file format. Why reinvent the
wheel? Make your programs immediately compatible with
hundreds of packages from Aldus PageMaker to ZSoft's PC
Paintbrush with these linkable graphic libraries.

Figure 5-Filling A Triangle

"An exceptional product" - Programmer's Journal, Aug
NEW! Version 3.5 of the PCX Programmer's Toolkit gives you over 60
powerful functions to manipulate bitmapped graphics. Use Virtual screens,
Super VGA modes, LIM 4.0 support, a 300 page manual, 9 utilities including
screen capture and display, and the fastest routines on the market. $195

Xa [1]

~]

Va [1]

~]

~

11
Xa [0] [J1
Va [0] [J1

Need Special Effects, but caught in a GRASP?
Why create a demo when you can create the real thing? Don't be trapped in
a slideshow editor or demo program when you can use PCX Effects for the
PCX Toolkit and your favorite programming language. A Music Language
and spectacular effects for exploding your graphics!
$99

Blazing Graphics Text
With PCX Text you can display text with graphics as fast as it always should
have been. Display characters, strings, fixed and proportional text,
background transparency, and more. Includes a font editor, 85 fonts, and
text utilities for blazing graphics bitmapped text.
$149

All packages support 12 compilers for C, Pascal, Basic,
Fortran, Assembly, and Clipper. All modes of the Hercules,
CGA, EGA, VGA, and Super VGA adapters are supported, up
through 800x600x256 (22 modes in all). Assembly Language
source code is optionally available. Trademarks are property
of their respective holders.

MICROPROGRAMMING
11315 Meadol'! Lake. Houston. Texas 77077. (713) 87(}0737

No Royalties! 30-day Money Back Guarantee.
VISNMC/AMEXICOD/PO accepted.

MICRO CORNUCOPIA, #50, Nov-Dec, 1989

11

= y*cos(~)
= -y*sin (~)

p

q

-

X*cos(~)

- x*sin (~)

+

z*cos (8e 1)

3-D Mandelbrot Set

Traditional
(pre-computer)
ax- .
onometric projections do not consider an
elevation angle and do not multiply Z by
its cosine. I do it to fake a vertical viewpoint.
So where do 'I' and  come from? If
you look straight down at the x-y plane
(eel = 90°) as in Figure 2, then:

But  and 'I' are functions of eel, and
of the viewer's quadrant. It's weasel time
now. I would fonnally like to derive the
following relations for you (I did it for
myself), but it would take too much
space, so I'll sketch an outline.
-Intuitively, for eel = 0°:  = 0°, and 'I' =
0°. For other values of eel, as we rotate eh
from 0° to 45°, then from 45° to 90°,  = 'I'
at 45° and  and 'I' must reverse their respective values on opposite sides of the
dividing line fonned by eh = 45°.
The resulting transfonnation, valid in
all four quadrants, is:
~'

¥

= tan -1 (
= (90°)

sin (~) / cos (~)
-

($')

sin (~)

= sin (8.1) *

sin ($')

cos (~)

= cos ($')
= sin (8.1) *
= cos (¥)

sin (¥)

sin (~)
cos

(~)

In quadrant I, of course, ' = eh. The
inverse tangent function is necessary to
get the transfonnation correct in the
other three quadrant"s. transfonn_anglesO
perfonns this work for later use in axonometricO.
More Coordinate
Transformation-Will It Never End?
Okay. We now know how to get from
3-space to 2-space, but we're still working with real, or floating point, numbers.
We want to display the surface in a window, in integer coordinates. For printer
graphics, we'll need transfonnations in
both Portrait and Landscape modes; but
lefs keep it simple by just considering
Portrait mode. You use this mode on a
CRT display (unless you do your work
lying sideways).
We still have three coordinate systems
(Figure 4): P-Q our projected coordinates; IX-IY, a right-handed, rectangular,
space; and DX-DY, a left-handed, rec-

12

MICRO CORNUCOPIA, #50, Nov-Dec, 1989

tangular space (the plot device's natural
coordinate axes). IX-IY and DX-DY are
integer spaces where you count by pixels
on your CRT display. They map one-toone onto each other and are non-Cartesian if the aspect ratio does not equal 1.
You could easily skip the IX-IY space
in making these transformations, but I
find it a lot easier to decide where to
place a window on a screen if (0,0) is in
the lower left comer. IXmax is the pixel
width of the CRT minus I, and IYmax is
the pixel height minus 1 (we start counting at (0,0), hence the minus 1).
You can find (pmin, qrnm) and (pma",
qmax) by projecting the eight comers of a
box drawn to completely enclose the surface: (Xrni.n, yrni.n, Zmin), (Xmin, Ymax, Zmin),
(xmax, ymin, zrnm), (xmax, Ymax, Zmin), (Xmin,
Ymin, Zmax), (Xmin, ymax, Zmax), (xmax, ymin,
Zmax), and (Xmax, Ymax, Zmax).
'
This is done in get_max_minO, determining which of the projected values define (pmm, qmin) and (pmax, qmaJ and
saving the projected coordinates for later
use to draw a box around the surface.
In my source code, I never use variables explicitly declared as p or q (corresponding to the description given in this
text) preferring to think of them as x and
y values, or reusing already declared
variables. I define P-Q space in this discussion purely for illustrative purposes. p
and q are, however, used as arrays in dosurf0 and drawfillrectangleO to store plot
device coordinates. This is just a coincidence. Remember: Consistency is the bugaboo of small minds.

You get to specify where the window
will go. (Xminw, yminw) and (Xmaxw,
ymaxw) define this in Figure 4. P-Q
coordinates are then transformed to IX-IY
coordinates by:
ix =

Xlllinw

/

iy

= yminw
/

+

(Xmaxw -

Xminw)

*

(p - Plllin)

Yminw)

*

(q -

(Pmax - Pmin)

+

(Ymaxw -

(~ax -

~in)

~n)

This is done by defregO and transf().
"defreg" means "define region." It's really a window definition, but I was afraid
of conilicting with someone else's window definition function name if I used
"wind" as part of the name.
All you need to get into plot device
pixel space (in Portrait mode) is:
dx

dy

= ix
= IXmax

- iy

itransfO handles this. It also plots in
Landsca pe mode. If you use surfaceO
. only in Portrait mode, you can speed
things up by eliminating the Landscape
transfonnation and making itransfO into
a macro.
The Painter's Algorithm
dosurfO contains the painter's algorithm. It is conceptually simple, but confusing when drawing in all four quadrants. If we all had mainframes, we could
use matrix manipulation routines and
swap Z values around for the proper perspectives. That would keep the loops in

You asked for a place to put your things...

The Tele™ FILE SYSTEM is just the thing
BerryComputers presents The Tele Toolkit - a complete Operating Systems Kernel
If It's Data, It Must Be A File
Tele's file system is modular at several levels. FS is responsible for all storage and transfer of data.
The physical interface to disk devices is through MS-DOS
installed device drivers (MS-DOS itself is by-passed).
Therefore, Tele will work with the same devices that MSDOS supports.
Separate from the physical interface is the directory structure. Tele supports installable file systems; each device
can have a unique media format. Only MS-DOS compatible media are supported in FS.
Some other Tele components involve installable file systems.
For instance, the UX component emulates the Unix kernel.
Most of its code supports Unix media. Networks are supported by an installable file system that causes directory
operations to be performed on a device in a remote computer system. FS itself only supports MS-DOS media, but
it provides the main hooks by which any other file system'
can be emulated.
The bulk of Tele FS code supports hierarchical directory
structures and file redirection. Because MS-DOS is not
involved, you can use FS to avoid its restrictions.
Tele FS also includes serial communications support. 8250
controllers are supported in bidirectional interrupt mode.
Ring and break indicators are also supported. Serial ports
can be accessed directly, or redirected through the file

system. Files can also be redirected from the keyboard and
to the console display and printer.
To support efficient communication and storage, FS contains a modified Huffman compression algorithm. The
modification automatically recognizes fields within records
and applies a different compression tree to each type of
field. Compression can be processed directly on blocks
or continuously and transparently within the file system.
All source code, in C and assembly, is included. Tele SK
is required for FS. CD is also required for console device
support.
Demo Diskette
SK system kernel
CD console display
FS file system
OS core

$ 5
$50
$40
$40
$130

(refundable with purchase)
(multitasking)
(windows, requires SK)
(MS-DOS media, requires SK)
(SK, CD, and FS)

Telephone support is freely available.
The Tele Toolkit is available from:
Crosby Associates
P.O. Box i48
Sutter Creek, California

95685

CALL NOW TO ORDER:
(209) 267-0362 (FAX) (209) 267-0115
Visa, Mastercard, American Express & Discover Card accepted.

MS· DOS is a trademark of Microsoft Corporation.
Unix is a trademark of AT&T

Reader Service Number 147

MICRO CORNUCOPIA, #50, Nov-De~, 1989 13

Figure 6-Code for 3D Surface Drawing
/* header for threed.c */
int surface (
float xmin,float xmax,
float ymin,float ymax,
float zmin,float zmax,
int xminw,int xmaxw,int yminw,int ymaxw,
int hmax,float **z,
float horangle,float elangle,
int nx,int ny,int box,
intfillcolor,int edgecolor,int boxedgecol,
void far csetfunc(int color),
void far linefunc(int xl,int y1,int x2,int y2»;
/* start
#include
#include
#include
#include
#include

of threed.c */


"threed.h"
"grafprt.h"
"arrays.h"

#define PI 3.141592653589793238
#define BIGNUM 1.7e38
/* module threed.c, turbo c v 2.0, large code model.
released to the public domain by Gregory K. Landheim on
January 1, 1989, (c) all rights reserved. anybody is
authorized to use this code for any purpose whatsoever
on the condition that they realize I assume absolutely
no liability and give no warrantee for its use or
performance. it is distributed "as is." */
/*-------function prototypesl----------*/
void degrees to rads(float *horangle,float *elangle);
int get quad~ant(float horangle);
void transform angles (float horangle,float elangle,
int quadrant);
void get max min(float xmin,float xmax,float ymin,
float ymax,float zmin,float zmax,
float *yminp,float *ymaxp,
float *zminp,float *zmaxp);
void axonometric(float x,float *y,float *z);
void dosurf(float xmin,float xmax,float ymin,
float ymax,int nx,int ny, float **z,int iO,
int i1,int inci,int jO,int j1,int incj,
int incmode,int fillcolor,int edgecolor);
void drawfillquadrangle(int p[2] [2],int q[2] [2],
int fillcolor,int edgecolor);
void filltriangle(int x1,int y1,int x2,int y2,
int x3,int y3,int fillcolor);
void swapcoords(int *x1,int* y1,int* x2,int* y2);
void transformbox(void) ;
void drawboxbottom(int boxedgecolor);
void drawboxback(int quadrant,int boxedgecolor);
void drawboxtop(int boxedgecolor);
void drawboxfront(int quadrant,int boxedgecolor);
/*'-------aglobal declarationsl---------*/
int **Xa;
int **Ya;

/* storage for */
/* filltriangle() edge lines */

float Cosphi,Sinphi,Cospsi,Sinpsi,Cosel; /* constants
for axonometric projection */
float Yb[5],Zb[5],Yt[5],Zt[5]; /* arrays for box
bottoms and tops in projected real coordinates */
int Pb[5],Qb[5],Pt[5],Qt[5]; /* arrays for box bottoms
and tops in transformed integer coordinates */
void far (*Linef) (int x1,int y1,int x2,int y2);
/* address of plot device line drawing function */
void far (*Csetf) (int color); /* address of plot
device set color func */
/* surface () - general-purpose surface plotting
routine to plot a surface described as a matrix of
gridded z-values in the xy domain.
int surface (

14

float xmin,float xmax,float ymin,float ymax,
float zmin,float zmax,
int xminw,int xmaxw,int yminw,int ymaxw,
int hmax,float **z,
float horangle,float elangle,
int nx,int ny,int box,
int fillcolor,int edgecolor,int boxedgecol,
void far csetfunc(int color),
void far linefunc(int x1,int y1,int x2,int y2»
extern int Maxheight;
/* declared in mod grafprt */
float temp;
int quadrant,bufsiz,incmode,invert;
float ymaxp,yminp,zmaxp,zminp; /* max and mins of
projected surface */
if (abs(elangle) > 90.0) return(l);
(elangle < 0.0) ? (invert
1) : (invert

=

0);

/* allocate memory for the arrays:
*/
bufsiz
ymaxw - yminw;
if «xmaxw - xminw) > bufsiz) bufsiz
xmaxw - xminw;
Xa
(int **) alloc 2d array(2,bufsiz,sizeof(int *),
- sizeof(int»;
if (!Xa) return(2);
Ya
(int **) alloc 2d array(2,bufsiz,sizeof(int *),
- sizeof(int»;
if (!Ya) return(3);
/* change the angles from degrees to radians:
*/
degrees to rads(&horangle,&elangle);
/* dete~i~e the viewing quadrant:
*/
quadrant
get_quadrant(horangle);
/* determine the global projection angles:
*/
transform angles(horangle,elangle,quadrant);
/* swap xitin/xmax and ymin/ymax in quads 2 and 3: * /
switch (quadrant) {
case 1
break;
case 2
case 3
temp = xmin; xmin
xmax; xmax
temp;
temp = ymin; ymin
ymax; ymax
temp;
break;
case 4
break;

=

=

=

=

=

/* find max and min of the real coordinate domain: */
get_max_min(xmin,xmax,ymin,ymax,zmin,zmax,
&yminp,&ymaxp,&zminp,&zmaxp);
/*set max pixel height of device and def plot region*/
Maxheight
hmax;
defreg(yminp,ymaxp,zminp,zmaxp,
xminw,xmaxw,yminw,ymaxw);
/* assign color setting and line drawing function
addresses to global variables: */
Csetf
csetfunc;
Linef
linefunc;
/* put an optional box about the surface: */
i f (box) {
transformbox () ;
invert? drawboxtop(boxedgecol)
drawboxbottom(boxedgecol);
drawboxback(quadrant,boxedgecol);

=

=
=

/* plot the surface as a function of quadrant.
make certain it draws from back to front: */
switch (quadrant) {
case 1 : (horangle > PI/4.O) ? (incmode
0)
(incmode = 1);
dosurf(xmin,xmax,ymin,ymax,nx,ny, z,0,
nx-1,1, 0,ny-1,1,incmode,fillcolor,
edgecolor);
break;
case 2
(horangle > 3.0*PI/4.0) ? (incmode = 1):
(incmode = 0);
dosurf(xmin,xmax,ymin,ymax,nx,ny,z,nx-1,
0,-1,0,ny-1,1,incmode,fillcolor,
edgecolor);
break;
case 3
(horangle > 5.0*PI/4.0) ? (incmode
0):
(incmode = 1);
dosurf(xmin,xmax,ymin,ymax,nx,ny,z,nx-1,

=

=

Continued on page 87

MICRO CORNUCOPIA, #50, Nov-Dec, 1989

-----------------------

dosurfO simple, but it adds a lot of overhead. So we end up with a function that
gives me a headache.
The painter's algorithm simply draws
the projected quadrangles that form the
gridded surface from back to front, filling
(or painting) the quadrangle interiors
with a background color as each is
drawn, to cover up the quadrangle edge
lines behind the current quadrangle.
Quadrant 1 serves as the basis of the
whole thing. For 8h less than 45°, you
draw each quadrangle in the column
nearest the y-axis (Figure 1), then move
one column out in the direction of the
positive x-axis and draw that column.
Repeat for all columns.
For 8h greater than 45°, you draw
each quadrangle in the row nearest the
x-axis, then move one row out in the
direction of the positive y-axis and draw
that row. And so on to the end.
Argument "incmode" of dosurfO controls whether to increment along the x- or
y-axis. In either mode, an initial for loop
over k and I projects, transforms to device coordinates, and fills the first quadrangle in each column (or row). After
that, we only need to project and transform two new points for each quad-

rangle, because the other two are saved
from the previous quadrangle. The quadrangle is drawn and filled by a call to
drawfillrectangleO. (I know, I should
have called it drawfillquadrangleO, but I
wasn't thinking straight at the time.)
Drawing And Filling
I don't see any way to fill a quadrangle without breaking it up into two
triangles. This is what drawfillrectangleO
does. One vertex of each triangle is the
one farthest from the viewer, another is
the one closest to the viewer. After the
triangles are filled, the quadrangle edge
lines are drawn.
filltriangleO does the dirty work. It
first sorts the vertices of the triangle in
ascending vertical order (in device
coordinates).
In order to use loops instead of if
statements, I pretend the long side of the
triangle consists of two lines, one of
which has zero length. This trades off
storage space for speed.
I used a variation of Bresenham's linedrawing algorithm to compute the
coordinates of the triangle edge lines and
store them in global arrays Xa and Ya.
The computation is performed by divid-

QEditTM
ADVANCED

THE~'

The fast, easy to
use, fully featured text
editor at an affordable price.
If you are looking for the
right combination of price
and value in a text editor,
then give QEdit a try. At
ONt y $54.95 and a
money-back guaranteeyou just can't go wrong.
QEdit is fast, easy to use, and simple
to install. At the same time you get
all of these features and more.
I Completely configurable, including keyboard and colors
I Edit as many files simultaneously
as will fit in memory
I Open up to eight windows
I 99 scratch buffers for cut-and-

• _ '"

'ti1~
EDITOR

paste or template operations
I Exit to DOS (or a DOS shell)
from within QEdit
I "Pop-Down" menu system and
customizable Help Screen
• Column Blocks
I Easy to use macro capability
including keyboard recording
I Wordwrap and paragraph
reformat capabilities
I Recover deleted text
I Automatic indentation for C
programming
iii Import files and export blocks
I Locate matching braces and
parentheses
I Execute command line compilers
from within QEdit

ing the triangle into two conceptual triangles with an imaginary horizontal line at
the mid vertex (Figure 5). The outer loop
controls whether the computations are
for the upper or lower triangle. The inner
loop computes the actual edge lines
coordinates.
A final loop fills the triangle by drawing blank horizontal lines from
(Xa[O][jJ,Ya[O][jD to (Xa[1][jJ,Ya[1][j]). The
j subscript indicates the h pixel working
from the top to the bottom of the triangle. Ya[1][j] equals Ya[O][jJ for all j.
To make threed.c as general as
possible, I use the same line drawing
function for horizontal lines as for all the
other lines. However if you have a high
speed horizontal line drawer, use it.

t

References
(1)

Advanced C Tips and Techniques,

Paul Anderson and Gail Anderson,
Howard W. Sams & Co., 1988.
(2) "High-Resolution
Printer
Graphics," Mark Bridger and Mark
Goresky, BYrE, Nov 1985, pp. 219-232.
(3) ''The Painter's Algorithm," Richard
Chandler and Gary Faulkner, PC Tech
Journal, November, 1985, pp. 181-187.

•••

•• This small, blazing-fast editor
lets program instructions, memos,
letters, and assorted text databases flow easily between brain
and computer.',
David M. Kalman,

Editor-in-Chief, Data Based
Advisor (September, 1988)

• i The editor's speed, windows,
and other features make it among
the best text editors I've ever
used. "
George F. Goley IV,

Contributing Editor, Data Based
Advisor (September, 1988)

I QEdit supports 101 key keyboards, EGA 43·line mode, and
VGA 50-line mode
I Great for use with laptopsQEdit edits files entirely in memory,
saving drain on laptop batteries
I Compact-Even with all these
features, QEdit requires less than
50k of disk space

;'. ~ IIJiiliiiIJ
fIii!Pl .'""""":
'CAN Cards '

Full 30 day
money-back guarantee

, COO's accepted-please add $3.00
• . Georgia residents odd 4% soles tox

System Requirements _ _ __
QEdit requires an IBM PS/2, PC/AT, PC/XT,
PC, Pc/Jr, or compatible. Minimum system
requirements are 64 KB of memory, PC· DOS
2.0 or MS· DOS 2.0 or greater, 50 KB of disk
space. QEdit runs GREAT on floppy based
systems and laptops.

To order direct call

404·428·6416

~

. Add $3.00 for shipping-$lO.OO
, for overseas shipping. UPS 2nd

, DAY AIR available within
the U.s. for ONLY $5.00

SEMWARE™
730ElkCoveCt.· Kennesaw,GA 30144
QEdit and SemWare are trademarks of
Applied Systems Technologies, Inc.
© 1989 Applied Systems Technologies, Inc.

Reader Service Number 127

MICRO CORNUCOPIA, #50, Nov-Dec, 1989

15

<'. . . . .

/1/
', •• $ .

I

{

Desktop graphics are quite possible. But
possible and easy are two different things.
Here's a video frame grabber that might just
shortcut the process. This is yet another
way to use an AID convertor.
here I was trying to come up with
a catalog for IDEC's line of PC
clone computers using one of our
AT compatibles, Ventura Publisher, and
our laser printer. The idea was to do as
nice a job as possible on this document
so that our customers could see what a
desktop publishing system could do for

T

16

MICRO CORNUCOPIA, #50, Nov-Dec, 1989

their efforts. I wanted to let our customers see one of our systems. See it in
print. Credibility. Yeah, that's the ticket.
How do I get a picture of our computer into our computer? My associate,
Dr. Rao, tripping over one of the many
extension cords strung out on the floor,
suggested we needed a scanner to make
the idea work. He was carrying a box of
hard drives. ''They're about a thousand
dollars," he said. I wondered if he was
referring to the scanners or the hard
drives. Turned out it was the scanners.
Then I looked at what I had to do:
take a black and white picture of the subject; develop and print the picture; copy

the picture on a copy machine to reduce
glare; scan the picture; suck the result
into Ventura; and then print it on the
laser printer. Sounded like a lot of work.
So I proceeded to draw pictures of
computers and disk drives for our catalog using a paint program and a mouse,
pixel by pixel. That was a lot of work.
''There's gotta be a better way," I
grumbled.
. There is. The obvious solution is to
hook a video camera into the computer.
We immediately confiscated our little
VHS/C camcorder for the project. Sorry,
no more baby pictures! Using video
added the dimension of being able to
take pictures from tape. The situation
was improving by the minute.
What Would It Take?
The two happiest days in a sailor's life
are the day he buys his boat and the day
he sells his boat. When it comes to engineering projects, the two happiest days
are the day you design the hardware to
do the job and the day you think you've
fixed the last bug in the software. Some
projects never have the final bug fix,
some have it a great many times. This
project seems to be of the latter variety.
Having decided to build the World's
Greatest Low Cost Video Digitizer, there
remained but a single question: How to
do it? We needed some kind of AID converter. What speed? It was going to have
to put its data somewhere. PC memory?
Dedicated memory?
The Specification
We wanted to digitize standard RS170 video. Cameras, camcorders, and
VCRs output this on their video output
connectors. And, we wanted to do this in
real time.
That's a computer buzz word if there
ever was one. What is real time? Real
time and beauty must be very much alike

By Gene Toner
IDEC, Inc.
P.O. Box 69
Fountainville, PA 18923
(215) 249-0673

because they both depend on the beholder.Real time in the RS-170 video
world is about V60 of a second. This is the
time it takes to paint one field of video.
The rewards for being able to digitize
one field of video in real time are definitely worth the effort.
If one can digitize "on the fly," a
"snapshot" can be extracted from any
video source. Without this capability, the
subject of the picture must remain still, or
the video source frozen. Some cameras
and VCRs do a credible job of this, but

we (and perhaps you) don't have this
feature on our video gear.
So we want to digitize an entire field
in real time. Where do we put it? RAM is
an attractive place. We could use one of
the system's DMA channels for
depositing the result of the AID conversion directly into memory.
How many pixels? How many shades
of grey? Well, the best PC video adapters
around these days are VGA. They have a
grey scale mode which allows 320 x 200
resolution with 64 shades of grey.

~ f one can digitize
"on the fly," a
"snapshot" can be
extracted from any
video source.

Figure l-Grabber Block Diagram
INPUT
VIDEO
AMPLIFIER

VIDEO
SOURCE

SYNCH
SEPARATOR

ODD/EVEN FRAME

1

I

1

I

20 MHZ
GATED
OSCILLATOR

PIXEL
CLOCK
CONTROL

DIVIDE
BY
4

i

•

I

256 STATE
PIXEL COUNTER
ADDRESS
GENERATOR

n-

256 STATE
LINE COUNTER
ADDRESS
GENERATOR

J
I/O
SERVICE
PORT

PC
BUS

VIDEO
DC
RESTORATION

I/O
ADDRESS

+
ADDRESS
DECODE

- t

FLASH
6 BIT
A/D
CONVERTER

DATA (6 BITS)

64KBYTE
CAPTURE
MEMORY

CARD SELECT

BUS

1
DATA BUS

COMMAND
LATCH

DATA
BUFFER

J

MICRO CORNUCOPIA, #50, Nov-Dec, 1989

17

Sounds like a good place to start,
especially since a field of RS-170 video
has only about 244 lines of vertical resolution available. (Actually 2621/2 lines, but
some of these get consumed by vertical
retrace.) Because we work in a digital
world, the number 256 is much more appealing than 320 or 244. So we went with
256 x 256 x 64 shades of grey.
In a standard video signal, every horizontal line takes roughly 63 Jlseconds. Of
that 63 JlSec, video takes up about 53
JlSec, with the remaining time devoted to
horizontal synchronizing information.
After the dust settles over the calculator,
the result requires a sampling rate of 5
MHz to slice that 53 JlSec up into 256
samples.
Another result is that with a normal
PC-XT (4.77 MHz) computer, you
wouldn't have enough bandwidth available to stuff all these samples into computer memory using the machine's DMA
chanilel. You would have to use dedicated memory.
The Lost AID Converter
Figure 1 shows the frame grabber (actually a field grabber, each frame made
up of an odd and even field) in block diagram form. Figure 2 is the schematic of
the final version of the grabber. The heart
of the system is the RCA3306 6-bit flash
A/D converter.
This, however, was not always the
case. There are other offerings in the flash
A/D race, including a very nice 8-bit
Samsung part. It, along with the A/D
converter, has some very nice signal
clamping circuits.
Samsung advertised the part heavily
and, upon our request, sampled us a few
parts, with the assurance that unlimited
quantities would be available when we
needed them. So we prototyped a system
using this part.
Then came the worldwide DRAM
shortage, and Samsung decided to build
DRAMS instead of flash A/D converters.
Can't imagine why, but they left us with
a very functional video capture board
and no way to get parts.
We then made a mad search to find a
replacement A/D converter, preferably
American, with at least one second source.
What we found was the RCA 3306 6-bit
converter chip, second sourced by Micro
Power Systems. We were in business
once again.
Not often does a designer have the
opportunity to go back and rethink all
the design tradeoffs he made during the
design, but it happened here. Because of

18

MICRO CORNUCOPIA, #50, Nov-Dec, 1989

Real-time Grab. Fast!
this, we were able to squeeze more performance out of the capture card.
The System
We brought the signal from the
camera into the capture card as standard
R5-l70 video, which has a 1 V peak to
peak (black to white) amplitude.
The input video amp (ICl) serves two
purposes. (See Figure 1.) As a differential
amplifier, it not only provides signal gain
but also noise reduction. This output
goes to two other modules, the sync separator (IC2), and the DC restoration block
(IC3 and IC4).
The National LM188l handles sync
separation. Fed a standard video signal,
it produces composite, vertical, odd/even
frame and burst gate/black level timing
information.
We use the odd/even signal to capture even frames (those with a complete
line of video on the first line of a frame).
We use the black level signal to sample
the incoming video for its reference black
level. The DC restoration block is the LM
398 sample and hold amplifier which
holds and filters the video black level for
later subtraction from the video signal.
After subtracting the detected black
level from the incoming video, we have a
ground referenced video signal with
black at ground and white at roughly 3.3
volts-perfect for conversion by the RCA
3306 flash converter (IC13).
A gated crystal oscillatot operating at
20 MHz and divided by 4 controls the
conversion process. Each rising edge of

this sample (pixel) clock causes the A/D
to take another look at the video signal. It
then shifts the previous sample to its output.
The Conversion Process
The PC bus address decoder (IC17
and IC18) decodes a write to the board,
and a command to capture a video frame
loads into the command latch (IC19).
This command places the capture
memory in a writeable condition and allows the capture of the next even field.
When the sync separator senses the next
even field, it allows the gated oscillator to
operate for 256 samples of the pixel clock
as counted by the pixel counters (IC9 and
IClO).
When it reaches the count of 256, the
pixel clock shuts off until the next horizontal sync pulse shows up. (Line counters, ICll and IC12, also get incremented
here.) These counters generate the
addresses for the video capture memories. The falling edge of the pixel clock
strobes in the data.
The process continues until the carry
bit of the last line counter resets the command latch and stops the process. The
computer monitors the command latch to
determine the completion of the sample.
At the end of the process, video
memories return to a readable condition.
The computer resets the pixel counters
and the line counters. Then, once a signal
from the command latch has replaced the
pixel clock, the computer can access
video memory.

When the computer forces this signal
line high and then low, the pixel counters
and the line counters are incremented.
This way the computer can read the contents of video memory and transfer those
contents into its own memory.
The Software
Once the data resides in main
memory, the software takes over. The
program was written using Microsoft C
5.1 and the Zortech libraries. We found
the Zortech windows libraries not only
well done, but also a bargain at $50.
Everybody has their favorite C compiler, and ours is Microsoft's. Its wide,
third-party support is one of the reasons,
CodeView another. The intent was to
produce reasonable pictures on the laser
printer, and we accomplished this using
a technique called dot dithering. This
technique forms a macro-pixel made up
of several dots and simulates grey scale
by the percentage of dots printed. Here,
we chose a four dot by four dot cell to
simulate 16 grey levels. (This doesn't
seem to be too grainy.)
We can display the video on all the

standard monitors. The most impressive
is the VGA, presenting the picture in its
full 64 shades of grey.
We can also reproduce this picture on
an IBM graphics compatible printer.
Here, we use each printer dot as a cell
and strike it up to four times to simulate
four levels of grey.
Finally We Get To The Desktop
Recent investigation showed that both
Ventura Publisher ver. 2.0 and Aldus
PageMaker ver. 3.0 support grey scale
images in the TIFF file format. Discussions with the technical support group at
Aldus yielded a TIFF developers software kit for the meager price of $30.
After tearing into the developers kit,
we discovered that the TIFF file format is
well thought out and easy to use. We
wrote a file format converter to take our
format QDC) and convert it to TIFF.
Once we had conquered TIFF, Ventura 2.0 accepted our image files. We
now take video photographs and incorporate them into desktop publishing.
Thanks to TIFF, we can also print the resulting documents on the printer while

maintaining grey scale information.
Quality has been very good. With the
VGA and its 64 shades of grey, an image
direct from the camera (tape tends to d,egrade the image slightly) comes very
close to black and white broadcast quality.

Editor's note: Idee's Supervision software
and a sample captured screen are available on
the Micro C BBS and the Issue #50 listings
disk.
They've offered Micro C readers a special
price for the Grabber Board and software
($175 + s/h). Kits are also available. Call Idec
for details.

•••

The Complete Diagnostics Solution for Your PC/Xl, PCI AT, or Compatible
INCLUDES...
DRIVE TESTS-Complete diagnostics for Hard and Floppy
drives. including controller cards. Tests read. write. and format
capability as well as seek timings. hysteresis and rotation
timings.
I/O PORTS-For both parallel and serial ports. confirms internal
and external loopback capabilities at all baud rates and
configurations.
MEMORY-Performs over eight different tests to check standard
extended. and expanded memory.
KEYBOARD-Verifies that all keys send correct key codes.
including shift. CNTL and ALT modes.
CPU. NUMERIC COPROCESSOR-Verifies that all single and
multiple instructions perform correctly and accurately. as well
as testing all internal registers.
VIDEO DISPLAY-Checks video controller cards. Confirms
attributes. graphics. colors (if applicable). and CRT alignment
patterns.

COMPLETE PC/XT DIAGNOSTICS SET (save 528)

$ 29
$ 29
$ 19
$ 49

PCI AT System Diagnostic Software
PCI AT Disk Diagnostics (wI test diskettes)
PCIAT 110 Loopback Test Plugs

$ 29
$ 29
$ 19

COMPLETE PC/AT DIAGNOSTICS SET (save 528)

$ 49

BOTH PCIXT and PCI AT SETS (save 575)

$ 79

PCIXT System Diagnostic Software
PCIXT Disk Diagnostics (wI test diskettes)
PCIXT 110 Loopback Test Plugs

Capital Software presents the definitive disk-based diagnostiCS
package for the IBM PC AT and Xl Atechnical tool detailed
enough for the repair technician. A friendly interface that
places problem-solving skills in the hands of the end user.
An uncompromising solution.
SEND CHECK OR MONEY ORDER TO

USE YOUR VISA OR MASTERCARD
CALL TOLL FREE (800) 541-0898

REAL TIME CLOCK-Verifies correct timing. all internal
registers. and battery backed-up RAM.

C.APIT.Ai SOFTWARE
951-2 OLD COUNTY ROAD SUITE 224
BELMONT, CALIFORNIA 94002
FOR INFORMATION CALL:

...and many more features to Insure the Integrity of your computer.

408-293-5279

MICRO CORNUCOPIA, #50, Nov-Dec, 1989

19

Figure 2-Grabber Schematic

J2

IC2
LM1881

R3

SI1 IX

B
VCC 7

R2

+5

ODD 6

:511 lX

SET 5
BST

75
Rl

-=-

IC5
LS04B

Co4
JUF

RB

6801(

J3

3

-:-

+5
D2
IN''14B

R17
2.2K

CB
.22l.f'
13
330

330

+:5
+5

VGET

3

6
IC6
lSOOA

D5

IC13
B6
2

+5

B5

OF

3
VSS 0
0
4
M
VZ
M
5
4:

IC17

U

J1.A31
(X)
(X)

J1.BI3

ClK
PH

'JRO

\0

9

u

:x:

HC407:5A

9

'WRI

10

RDO

17
B4
16
RC
15
B3
14
B2
13
Bl
12

D3
D2
Dl

VIDEO

+:5A

I

CI0
.1UF _

REF'+

Cll
J,IUF

-=RIB
+12
Zl
3.3V

HC4075C

Jl.Bl
Jl.B31

Jl.B3

1-

1
+5

-:-

111111111111

TIIITIIIIIII

Jl.B29

+5A

Jl.B7

-12

BYPASS CAPACITORS

Jl.B9

+12

CI2 - C23
All .01lF

20

MICRO CORNUCOPIA, #50, Nov-Dec, 1989

- - - - - - - - - - - - - - - - - - - -_._---_....__ ._---

+5

~

220

1/2 'W

UNUSED GATES
IC5

Rll

VIIlED

10K IX

7 R14

R12

10K IX

IC4
10K IX
R13

VRI
~----------------~------------+---~------------------~------------------~
+5

~

+5

~

,M NID"

IC14
~r;;-­
7A3

r--M---§..

A4

~

DOll

DO

Dl 12
»2 113

Dl

D315

D2
D3

A7
~

3 A7 \0 D4 16
25 ~,!{l D5 17

D4
D5

A9

24 A9

A6

AS
4A6

~

~
All

AlO
23 All

~A12
~Al3
A14

1 Al4

~

D6

Al

9 Al

A2

8 A2

DO
Dl

~
A9

24 A9

D6,l!-

A7

~

D7~

7
6
5
4

~

AID

21 AlD
All 23 All
A12 2 Al2

vr~

Al3 26 Al3
A14
1 Al4

1£

r!L-J!L.
r1L-1!L

A3
A4
AS
A6
3 A7 \0
25 ~!{l

A3
A4
AS
A6

~

'--r----

20

10

D2~
D3

D4

r!L--!!!rlL--!!L
r.!2-

2D

~

DO

2~

YNJrlB~______•

Dl

4 tAl

YAI r16~______-+-t

D2

6 tAe
8
1 1A3

D3

vr rR-

YA2 ~ JLA7
YA3r!L-- JLA6

r~
~
D4

17 IBO

~

~~ IBI

r

r--------'l'"'i 1B2
l
.-------:19~1B3

YBD ~ r - - JLA5

f-

YBI
f-- JLA4
YB219 f-- JI.A3
YB3r--r-- JLA2

Ls2ill

1£

'--r----

22

««

D5~
D7

M NID"
NM.1Il

««

r;;--

NJ

~

M NID"

CD"'o",

IC1S

~Al
~A2
A3

~

MCIIID"

.nlD"
««

o_N('l)

««

+5

+5

22

~----------~-~

+5
10
JLA8 _ _~12=-t D SD Q L,...Y.GET

Al5

5

IC:S
",,6

r -_ _..:;;;ll'"l>lcp
RD

a o!-

IC1~LS74B

V~~----~------------~

MICRO CORNUCOPIA, #50, Nov-Dec, 1989

21

LIMBO Part Three
Building The Mobility Base

It's time to get out the bailing wire and
tin snips. This time Bob builds LIMBO's action fraction.
maze robot ain't much fun if it
can't cruise through the maze
without getting stuck. Mazebots
get stuck in many ways, usually by running headlong into something. We can
usually blame inadequate sensor coverage. Even a single one-inch gap in the
bumper perimeter will be catastrophic,
eventually.
Of course, there are other ways to get
stuck, losing traction being a popular
one. The concrete surface on which members of the Seattle Robotics Society run
maze robots looks flat, but the robots
know better. Mazebots with two drive
wheels and two castors tend to wobble
like four-legged stools in our maze. To
maintain traction, the wheels need to
conform to the irregularities of the running surface. That requires some kind of
springy suspension.
Why not make a robot with a rigid
three-point suspension instead of fourpoint? Small bumps and hollows
wouldn't bother a three-wheeled robot
because, like a three-legged stool, each
wheel makes contact with the ground.
However, I find that three-wheelers
are more tipsy than four-wheelers. Also,
four-wheelers can have more traction because the weight can be placed right over
the drive wheels, an impossibility with
three-wheel designs. (Perhaps the ideal
system would be a gyro stabilized twowheeler, or even a unicycle. Imagine: a
robot able to do a high wire act.. . .)
LIMBO is round as viewed from
above, with a four-point spring suspension. The drive wheel/motor combinations mount rigidly to the chassis, while
the front and back castors are spring

A

Mazebots
get stuck in many
ways, usually
by running
headlong into
something.

mounted. The drive motors mount inside
an aluminum box.
I call the motor box, combined with
the castors and spring, the undercarriage.
The undercarriage bolts on underneath
the bumper contact skirt. This whole assembly is known in robotics slang as a
mobility base, or just base.
A superstructure, which carries the
batteries, sensors, and control electronics,
bolts on top of the base. Wires from the
undercarriage run up to the superstructure through a central wire access hole.
This time we'll build the LIMBO mobility
base.
Preparing The Motors
Tools: Hacksaw, drillpress, Vee-blocks,
clamps, hand reamer, metal files, 200 W
soldering gun, 6" machinist metal rule,
flux brush, rubber mallet, drills.
Materials: Nesting brass tubing (91.32"
o.d. to ¥8" o.d.), IMC stepper motors,
rosin-core solder, rosin flux pa~te, cotter
pins.

22 MICRO CORNUCOPIA, #50, Nov-Dec, 1989

--------------------------------

Step 1. Make drive shaft sleeve adaptor.
The IMC motor I chose has 1A" shafts
on each end, one 0.7" long with flats, the
other 1.55" long, no flats. The motor body
has a 2.25" square mounting flange with
one ear cut off and standard 3116" mounting holes in the remaining three.
The long shaft is just right for mounting the wheel. Unfortunately, it's on the
opposite end from the mounting flange,
so you'll need spacers to mount the
motor inside its box. Also, you need to
add a sleeve to the lf4" shaft so it'll fit
into the 3/8" hole on the wheel.
You can accomplish this with nested
brass tubing, available at any hobby
shop. You need four sizes from 91.32" to
3/8" o.d. with 11.32" wall thickness. It's best
to take the motor and wheel you plan to
use with you to make sure the sizes are
right.
These brass tubes usually come in 12"
lengths, more than sufficient for two motors. Get brass tubing, not aluminum, be-

By Bob Nansel
816 North lOSth St.
Seattle, W A 98133

LIMBO Exploded View

Top Disk

Middle Disk

Bumper Skirt

cause aluminum tubes are too soft and
are very difficult to solder.
First, nest all the tubes together. They
should be very nearly all the same
length. If not, sand or file the tube ends
(still nested) until they are. Next, telescope the tubes out on one end so that
about %" of each tube shows. Then
brush soldering flux paste on these exposed ends (but not on the inside of the
smallest tube, nor on the outside of the
largest tube). Slide the tubes back together, repeat this procedure on the other
end and then slide back flush.
Using minimum pressure, clamp the
nested tubes in a bench vise with one
end of the tubes perpendicular to the
bench top. Heat up the top end with a
soldering gun and sweat a small amount
of solder into the flush ends. Be careful
not to get solder on the inside surface of
the smallest tube. Allow the tubes to cool,
then flip the tubes over to solder the
other end. The idea is to make the tubes

"

Suspension Spring

Motor Box

Microswitch Disk

a single unit for cutting and drilling.
From each soldered end, measure
1.5". Use a hacksaw to cut a piece from
each end slightly longer than the marked
length. Sand or file these to 1.5". Remove
the burr inside the cut ends with a hand
reamer. Ream away any excess solder on
the other end, too.
Clean off any flux or brass particles
with a paper towel, then slide the
completed sleeves onto the stepper motor
shafts. They should slide on easily. If
they don't, you will either have to ream
the ends some more or squeeze the tubes
back to round.
You can avoid most of the work
above if you can find tubing with %" Ld.
and 3/8" o.d. (I couldn't find any). In this
case, just cut two pieces to length, file,
ream and you're done.
Step 2. Drill cotter pin hole.
The long shafts of the steppers don't
have flats ground in them, so you can't
use setscrews to secure the ada ptor

sleeves and wheels to the shafts. I don't
trust setscrews for high torque drives
anyway (they tend to come loose midway through your best run), so I use cotter pins for really positive drive. Our
problem now is how to drill cotter pin
holes precisely through the V4" hardened
steel shafts of the steppers and to perfectly match holes through the sleeve
adaptors.
The problem breaks down into how to
hold the work-pieces and how to assure
proper alignment. Holding the workpieces is best done with machinist type
Vee-blocks and clamps. Alignment will
be perfect if the holes are drilled through
both the sleeves and the shafts simultaneously (see photo).
Mark a line around the sleeve adaptors 7;-32" from the soldered ends, then
slide them onto the long shafts, ends
flush with the ends of the shafts. Use two
Vee-blocks to support both front and
back shafts. Slide scrap tubing left over
MICRO CORNUCOPIA, #SO, Nov-Dec, 1989

23

Motor Box Layout

1-1.--- 4' (reF) ---·-11
~================~

I

I

3 5/8' - - - - t

2 45/64'

---t

: 125/32'i-!---{f}-i+--.-

I

,--

I

--;------It--I
I
I

I

PUNCH 1/2' DIA.

-ft>'-tt--"-

DRILL 3/16' x 3

I
I
I

~:~~~~~~~~~~~~~~~~

LEFT SIDE

from Step 1 onto the front (short) shaft,
so the two Vee-blocks support the motor
evenly between them.
Clamp the Vee-blocks to the drillpress
table using C-clamps or bar clamps.
Don't tighten the clamps completely yet;
leave. them loose enough that you can
adjust the work position by tapping with
a rubber mallet. Chuck up a 31.32" bit in
the drillpress. Then, with the drill press
still turned off, bring the bit gently down
to touch the sleeve adaptor. Adjust the
Vee-blocks until the bit comes down
squarely on the '132" mark.
An old machinist trick to tell if the bit
is perpendicular to the round shaft is to
put a 6" metal rule on the shaft, then
bring the bit down (power still off!) with
enough pressure to hold the rule in
place. Adjust the blocks around until the
rule is perfectly level and perpendicular
to the drill bit.
This will ensure that the hole is drilled
through the diameter. Remove the rule
and check to see where the bit touches
now. H you're lucky, it will still be right
on the '132" mark; if not, keep fiddling
with it.
When everything is right, tighten the
clamps, then check to make sure everything is still aligned. Also check to see
that none of the clamps will interfere
with the drill chuck. Remember that the
chuck will come 318" closer to the work
by the time you've drilled all the way
through the shaft and sleeve. Safety tip:
use masking tape to hold the wires out of
the way.
Now drill the hole slowly, backing the
bit out often to clear chips. Take care not

24

MICRO CORNUCOPIA, #50, Nov-Dec, 1989

TOP

RIGHT SIDE

to drill too far; Vee-blocks are not cheap.
Does everything look centered? H .not,
something slipped.
The setup takes a while to get right.
But once done for the first motor, you'll
be able to do the second without any
changes, provided everything is still
clamped down tight. You should still
check alignment before drilling the second shaft.
You now have two stepper motors
with cotter pin holes drilled perfectly.
The cotter pins should fit snugly. A little
sanding or filing to clean up the drill exit
burrs, and smile: you've just done precise
machining by eyeball.

corner to corner will .do just fine).
Measure all locations with respect to the
center points, and use the trisquare to
line up holes the same distance from center.
Or, you can tape templates to the
panels and directly transfer the hole locations with a prick punch. Templates can
be made by either enlarging the accompanying illustrations or ordering the full. sized plans (you can find the details in
the parts list table).
Whatever way you choose, lightly·
centerpunch all hole locations. Back up
areas being centerpunched with scraps of
wood to prevent deforming the panels.
Step 2. Drill and punch motor box
holes.
Drill 1116" pilot holes at every marked
hole location. You can use a hand-held
drill for this if you're careful, but I prefer
the drill press. Examine the results. Do
any of the pilot holes seem off-center? If
so, now's the time to correct this by nibbling away metal from the side you want
the· hole to move toward. Do this with
the corner of a file or the prick punch.
Aluminum is soft, so don't overdo it.
Once you're satisfied with your pilot
holes, enlarge them with a 3116" bit. The
two shaft holes should be drilled with a
1f,i" bit, then enlarged to 318" with the
hand reamer. (Or, you can use a 1;2"
chassis punch.)
Punch the wire access hole with a
1 3/8" Greenlee chassis punch. The punch
should be on the inside of the box, the
die on the outside. It is much easier to
turn the wrench this way, and it will
make the inside edge rounded and

Constructing The Motor Box
Tools: Prick punch, metal scribe, 1%"
chassis punch, drills, or hand drill,
machinist trisquare, machinist compass,
pin vise, files, hand reamer.
Materials: 6"xS"x4" aluminum project
box, modified stepper motors from Step
I, plastic training wheels, aluminum hex
standoffs, #10-32 machine screws, wood
scraps.
Step 1. Layout Hole Locations.
LIMBO uses a two-piece aluminum
project box to protect the stepper motors
and undercarriage wiring. With the cover
mounted, it also serves as a ,rigid, lightweight mount.
Since the stepper motors are mounted
directly to the box, it pays to be exact
when doing the mounting hole layout so
the drive shafts are accurately aligned.
Begin by locating the vertical center
line of the side panels and the center of
the top piece (scribing diagonals from

V-block Setup On Drill Press

Using Machinists' Rule Trick to Line Up Drill

Inserting the Cotter Pin with Needle Nose Pliers

smooth so it won't chafe the wiring. Oil
the threads of the chassis punch before
you begin punching; less friction will
make the job easier and your punch will
last longer.
If you don't have a chassis punch
(they cost about $25), scribe a 13/8" circle
on the box before drilling the pilot holes.
Use a nibbling tool to cut a circular slot
starting from the center and spiralling
out to follow the scribed circle line. You'll
need to do some filing to smooth the cut.
Either way, finish by deburring all the
holes with a file or X-acto knife.
Step 3. Mounting the motors and
wheels.
We need standoffs to mount the stepper motors. I special ordered the 113116"
standoffs to save time. You might wish to
find 2" spacers that you can file down to
size, though you'll want to get the ends
as square as possible.
First, loosely mount the standoffs to
the stepper motors, then fit the motors
inside the motor box one at a time. You'll
probably need to slide the standoffs
around a little to get them to line up with
your mounting holes. Once you've gotten
all three outside screws in, you can
tighten the inside screws.
The shafts may look somewhat askew
before you dose the box up, but the box
will flex a little with the bottom cover in
place so the shafts should then appear to
line up with each other. If they don't,
loosen the outside screws a bit and slide
the motors around until they do, then retighten.
Remove the adaptor sleeves from the
motors and slide the plastic wheels onto
the sleeves. Mark which sleeve went with
which wheel and motor. With the cotter
pin holes visible, mark the hub of each
wheel adjacent to the holes. Remove the
sleeves.
The hubs of the wheels don't protrude
far enough to allow directly drilling the
hole, so you'll have to use the 31.32" bit in
a pin vise. The holes will be angled inward slightly, so you'll need to offset
them to compensate (see photo). Once
you have the holes drilled, slide the
sleeves back on the motors, lining up the
holes with a small nail.
Without moving the shafts, slide each
wheel onto its sleeve. Getting the wheels
aligned can be tricky. You may have to
drill the holes in the wheel hub to a
larger size. Once aligned, force a new
cotter pin through each hub/sleeve/shaft
hole, then bend the ends of the cotter
around the hub. The wheels are now
MICRO CORNUCOPIA, #50, Nov-Dec, 1989

25

Castor Suspension Spring Diagram

DRILL 3/16' DIAMETER

PUNCH 1 .3/B' DIAMETER
0.040 ALUMINUM

,
~

M

ru

......- - - - 4 13/16' - - - - . - . . . - - - - - 5 lIB'

-----oaot----- 4

13/16' - - - -....

~---------------------------- 14 3/4' (ref) --------------------~

solidly mounted, and the motor box is
complete.
Making The Castor Suspension
Tools: Same tools as Motor Box procedure, plus aviation snips or bench shear,
ball peen hammer, C-clamps, plastic protractor, bevel gauge.
Materials: 6"x14.7S"x 0.040" Aluminum (SOSl), swivel castors, scraps of
wood, #12-24x1;2" machine screws and
nuts.
Step 1. Preparing the suspension
spring blank.
The castor suspension spring for both
front and back castors is a single piece
unit made from a 6"x14.7S" sheet of
aluminum. Buy at least a few extra inches length when you have the metal shop
cut a piece for you so you can discard the
bent corners (metal dealers seem to save
their best pieces for bigger customers).
Try to get the width as close to 6" as
possible to save trimming.
Using the trisquare, scribe a square
line across the best end, then make all
measurements relative to this line. layout the fold lines first, then the tapered
outlines, and finally centerpunch the hole
locations. Use either direct measurements
or transfer the locations from the motor
box completed previously. Cut to the
outline using either aviation snips or a
bench shear, if you're lucky enough to
have one. Drill and punch the mounting

26

MICRO CORNUCOPIA, #50, Nov-Dec, 1989

holes and the wire access hole as you did
for the motor box.
Step 2. Bending the suspension spring
and mounting the castors.
If you have access to a sheet metal
brake, this step will be easy. If not, a few
S" C-clamps and some blocks of wood
and a hammer are all that you need.
Clamp the blank between two solid
scraps of wood, straight edges lined up
right on the scribed fold line. The first
bends to make are the inner, wide ones.
Set your bevel gauge to about l1So.
Begin the bend by pushing from one
side of the metal blank with a block of
wood. As the bend proceeds, you'll need
to use considerable persuasion with the
hammer to keep the bend crisp. Don't hit
the metal directly with the hammer, but
indirectly through a block of hardwood.
Check the angle with the bevel gauge
often. Take your time, and don't break
your thumb (you'll need it later).
After you finish the four bends,
mount the castors in place with #12
screws. Make sure that the castors can
swivel freely over the screw heads. Take
the castor / spring assembly and temporarily mount it to the motor box with
#10 screws and nuts. Does it stand up
straight and proud? Is it level with no
wobbles? No? Bend the spring a little to
make it level.
The angles given should put the cast:ors slightly lower than the drive wheels

so that the castors contact the ground
, before the drive wheels do. This is called
preload.
The function of the preload is to provide enough tension in the suspension to
prevent rocking, but not so much that the
drive wheels lose traction. If the preload
seems a bit much now, remember you'll
have at least five more pounds of robot.
Put a bag full of sugar on top (C&H
granulated works best). Adjust the preload if it seems either too stiff or too
wobbly.
The Bumper Contact Skirt
Tools: Same tools as above, plus nibbling tool, 1%" wood boring auger or
spade bit, sabresaw or coping saw.
Materials: 12"x24"xlf4" plywood, #1032 screws and "Tee" nuts, #4 roundhead
wood screws, microswitches, 22 gao
stranded hookup wire (9 colors), 24 gao
solid buss wire, nylon cable ties, 9-pin
connector, 14" Superpot tray.
Step 1. Making the bumpers.
A robot's interactions with its environment can be only as good as its sensor data. The bumper contact skirt is the
first and most basic of LIMBO's sensor
suite.
For a $2 flower pot tray to function as
a super sensitive and reliable bumper
contact sensor, you must make a few
modifications (Le., don't plan on using
this baby to start tomatoes next year).

at
tool~ ~cP~
..tWO gre
.~. 4~~f~

~

SAYWHAT?!

The breakthrough
~/
DBMS toolkit for Pascal

If you'd like to combine the raw power
~
and speed of Turbo Pascal or MicroC~ .
soft's QuickPascal with the simplicityL ~ ~~'lGY\. /
and elegance of dBASE, Topaz is L~~~~ /
just what you're looking for.
?~~
That's because Topaz was
,"'''
specially created to let you
enjoy the best of both worlds./.~'JV
[)
The result? You create com- '6?J'/~
plete, truly dazzling applicat- / / _ (/-'7
ions in a very short time. And no wonder. ,,~'.....!>
Topaz is a comprehensive toolkit of
~\
dB~SE--like commands and functions,
.,\ \ \\
desIgned to help you produce
outstanding, polished programs, fast.
Check out these powerful features:

Whether you're a novice
programmer longing for
simplicity, or a seasoned
pro searching for higher
productivity, you owe it
to yourself to check out
Saywhat. You see, with
/'";; S aywh at, you can build
(beautiful,elaborate,colorI coded screens in minutes!
}/ That's right. Trulyfantastic
~ screens for menus, data
entry, data display, and
help-panels that can be
displayed with as little as one
line of code in any language.
"\.

",/11

j~

)/'

Here's what you get:

___

iL\l

• Over 200 routines all with easy-touse, dBASE-like syntax.

ORDER NOW.
YOU RISK NOTHING.
Thousands of satisfied customers
have already ordered from us. Why
not visit your dealer or call toll-free,
right nowand put Saywhat and Topaz
to the test yourself? They're fully
guaranteed. You don't risk a penny.
Special limited-time offer! Save $26.
Buy Saywhat?! and Topaz together
for just $99 (plus $5 shipping
and handling).
Visit your nearest dealer
or call toll-free:
800-468-9273
In California: 800-231-7849
International: 415-571-5019

• Design screens, windows, and
moving bar menus!
• Easy-to-use, powerful editor lets
you create screens in a jiffy.
• Pop up your screens and menus
with one line of code in dBASE,
all the dBASE compilers, your
favorite BASIC, Pascal, or any
other language!
• Screen Library Manager.
• Generates runtime code.
• No runtime license or royalty fees.
• Comes with a 100 page manual,
plus dozens of sample programs
and free utilities.

• Data entry routines like SAY, GET,
PICTURE, RANGE, color selection, unlimited data validation.
• Open up to 10 DBF files, with up to
7 indexes with USE, SELECT,
SKIP, APPEND, PACK, INDEX
ON, SET INDEX TO, and FIND.
• No need to buy dBASE. CREATE;
BROWSE and REPORT utilities
included.
• Easily implement Saywhat and
Lotus-style moving bar menus.
• BROWSE any DBF file with just
one line of code! Programmable
and windowed too.
• Pick from windowed data or filenames with one line of code.

Software Science. Inc.
The Research Group
100 Valley Drive. Brisbane. CA 94005

Q;:;

•

~~
j:;-r;-i T
I ~- ,\ I

) \ \ )\

l

I/o

Y,~~,

J

fc A ~ \'-\
-----.....:

~0'4.f~

TOPAZ

The lightning-fast
screen generator.

, t

~v.() ''<2

'),-)')J"""T)

--)-)-;\

Comprehensive Time & Date
math in 7 international formats.

A~1/ 'MONE:VBACKG:U~EE. ~. Powerful code and report generators
I D~
/ /] Ifyouaren tcompletelydehghtedWlthSaywhat
. 1 d d'

f ((
_'..Jj:

exchqet
l:ineto
forall
def.··.%Oraw
%.

copy the generator value
%. use it to •• index into x ... coordar.ray
%·put.generato.rvalue.back·ontopof·stack
llIuse it to get they;..coord
%.d.rawthe line segment
%d.Oit • for each point in the generator

1$

l'utsendpoirit13o(each .segntent .ofgenerator on stack

% (noPal:'ams)leavesgensegsinr~ve.rseorder (B-1)
% for count=GenSize-l«
» xref : «
;coaversio.

t.~le

;9662:eee7
: 9682 : eee'J

:9682:eee.
;1.0" rqister WI
.:IV

;868Z:ee9i

.:IV

;9682:9919

;»»> Conversion Section
les

4i
Address

If s
.:IVZX

bx ----------- ---- - - ex Hel p

repz

st

e

; 9682 : 991Z »xref =<86899>«
:coaversion t.~le
;9682:991£1
;9682:991b get \yte cont
;8682 :99tr
;Store AI. at IS:(DII
:8682:9911

:Turn 0" Interrupts
_IV

dX,1cOOh

iut

1.1h

:8682:991Z
:8682: 99l~ DOS: 1c- tertii IWte

Reader Service Number 142

MICRO CORNUCOPIA, #50, Nov-Dec, 1989

53

Capturing & Graphing A Voice
In Real-Time: Part 1
Analog Signal-Conditioning
This isn't just an analog project, but
here's the analog portion: as complete a discussion of analog filter design as you'll see
in any magazine.

this project. To breadboard the amplifier I filter circuit and connect it to the
AID board, I use Real-Time Device's
XB40 prototype board and cable (the Advan tech has a similar prototype kit).

ast issue, I looked at several commercially available I/O boards for
the Pc. All those boards included
analog-to-digital conversion and usually some kind of digital I/O and
counter I timers. One had a D I A converter as well.
This issue, I'll use one of the boards
(the Real-Time Devices ADI000) and step
through a complete interfacing project.
The project will capture a voice and display it on the screen using Turbo C and
the Borland Graphics Interface (BGI),
which works with any common display
adapter.
Although I'm using the Real-Time
Devices AD1000, you can also use the
Advantech PCL-BI2 or 7I2E board from
Rapid Systems or Halted Specialties for

The Circuit
It's one thing to understand a circuit;
it's something else to design one. My
friend Brinkley Barr breathes electronics.
This circuit took him about five minutes
to design; it would have taken me days.
When you're trying to accomplish something, it makes a lot of sense to go to an
expert. You pay for the expert's experience, but you'd pay for the experience one way or another.
Figure 1 shows the voice signal-conditioning circuit. It consists of a microphone, a two-stage amplifier, and a 3pole anti-aliasing filter to remove
frequencies higher than 6 KHz (most of
the information in your voice is below 6
KHz). Aliasing occurs when the
frequency of your input hits half the sampling rate of your AID converter-the

L

converter doesn't get enough information
about the waveform, so the information
is garbled.
The circuit's three op-amps reside on
a single chip, so the parts count is quite
low: the chip, a microphone, and some
resistors, diodes, and capacitors. All the
parts are inexpensive and easy to mailorder (details later).
Let's walk through each section of the
circuit so you understand what's going
on.
The Microphone
Several different types of microphones
are available: condenser, crystal, magnetic, ceramic, etc. Brink selected an electret microphone because it's simple (it
doesn't need a high-voltage bias like condenser microphones).
You'll be amazed at how tiny these
little guys are. They look like spy microphones, but they contain a field-effect
transistor (PET) so the signal is already
boosted by the time it gets to your amplifier.

+9Yofts

Stage 1
30 dB Amplifier

6 KHz Butterworth
Low·Pass Filter

Stage 2
30 dB Amplifier

2.2K

Mylar

Monolithic

Output to AID
·5Vto +5Y'

Resistors: 5% (Gold tolerance band)-

54 MICRO CORNUCOPIA, #50, Nov-Dec, 1989

----

.------

By Bruce Eckel
Revolution2
308 Meredith St.
Kennett Square, P A 19348
BIX: beckel
Compuserve: 72072,3256

The Amplifier
The amplification stage consists of
two identical sections. The input to each
stage passes through a high-pass filter
consisting of a series 0.47 J..lF capacitor
and a 12K resistor to ground.
This serves two purposes-it removes
60 Hz hum and it keeps OC (called an
offset) from reaching the inputs of the
first and second stages. The output of
any amplifier contains DC, which, if
passed on to the next stage, is magnified
along with the signal. Which isn't what
we want.
The amplifier stages are simply opamps. The 68K and 2.2K resistors provide a gain of 30 for each stage. The gain
for this op-amp configuration is calculated as 1+(68K/2.2K}. The combined
gain (calculated by multiplying the individual gains) is 900.
I've written about op-amps in my first
book, Computer Interfacing with Pascal & C
(available from Micro Cornucopia). Electric Circuit Analysis by Johnson, Hilburn,
and Johnson is also worth checking out.
You may wonder why the amplifier is
in two stages instead of just one (Le.,
why not just change the values of the
68K and 2.2K resistors to create a gain of
1000 with a single stage?) Good question.
Answer: because op-amps are introduced
to novices as "ideal components," and in
many ways they are ideal, but this circuit
displays one of their limitations.
Gain-Bandwidth Product
If you're carrying a heavy weight, you
can't run fast. If you force op-amps to
provide a lot of gain, their frequency output (bandwidth) becomes limited. The relationship between gain and bandwidth
is called the gain-bandwidth product.
If we ask for a gain of 1000 out of a
single 4136 stage, we'll limit its output to
1 KHz, maximum. But our filter cuts off

G

a
i

n
Pole at 1O~ hz

i
n

(

\..

D

e

K

\

c
I
B

e
I

10

100

1K

10K

20dB/decac e

\

\

100K

\

1M

10M

Frequency (Hz)

Figure 2- Bode Frequency Plot
at 6 KHz. By limiting the gain of each
stage to 30, we get a bandwidth of about
30 KHz. The amplifiers will pass all the
relevant infonnation, and the filter will
do the work of removing the highfrequency components.
Filters
Usually, we describe a filter, or the filtering properties of any electronic device
(even if it isn't specifically designed to be
a filter), with a frequency plot. A
frequency plot (also called "Bode plot")
shows the size (amplitude) of the signal
(usually as a ratio of output size to input
size) on the vertical axis and its
frequency in a logarithmic scale on the
horizontal axis.
In a Bode plot, the vertical axis is
20*log(base 1O} of the output amplitude
over the input amplitude (i.e., the gain in
deciBels). Although there's an interesting
history to these numbers, you shouldn't
worry too much about why you use
20*log(base lO}(output/input} instead of
just (output/input).

Figure 2 shows an example Bode plot,
similar to what you'll see in electronic
data books when you're looking for
parts. Where the line is straight, signals
of that frequency (shown on the x-axis)
pass uniformly. Where the line bends,
signals fall off. Figure 2 shows the signals
passing up to 10 KHz, where the bend
begins.
You can create any wavefonn by combining simple sine waves of different
amplitudes and frequencies (we call this
Fourier analysis). Thus, your voice contains components of 20 Hz, 500 Hz, 5
KHz, etc.
H your filter has a bend at 2.5 KHz
and you pass a voice signal through it,
all the frequency components of your
voice above 2.5 KHz will be reduced or
eliminated. There might still be enough
infonnation in the lower frequencies for
you to hear the words, but they'll sound
different.
The straight-line part of the plot
(called the passband) shows which
frequencies pass. After the bend, you
MICRO CORNUCOPIA, #50, Nov-Dec, 1989

55

enter the stopband, because the filter
doesn't pass the signals anymore. The
sharpness of the bend shows how
quickly the filter switches from passing
signals to stopping them.
Here the poles of the filter come inthe poles determine how quickly the filter switches from passband to stopband.
The more poles at the cutoff frequency
(10 KHz in Figure 2), the sharper the cutoff.
The quality factor Q, which you'll see
mentioned in the databooks, measures
the sharpness of a filter. The ideal filter
would be a perfect step transition be-

+12 Volts
From PC

20 deciBels (dB) per decade (change in
the frequency by 10 times). A deciBel is
the unit on the vertical axis of the Bode
plot equal to 20*log(base 10) of the output/input. If you add a pole at the same
cutoff frequency, the Bode plot will
decrease at 40 dB/decade; a third pole
will cause a decrease of 60 dB/decade
(which is what our filter does at 6 KHz).
Zeros of the function (points where
the numerator goes to zero) have the opposite effect-they make the Bode plot
increase by 20 dB/decade. Thus, designing a filter is a matter of figuring out
how to manipulate the poles and zeros of

supplies brought out from the PC on the
XB40 prototype board. To do this, use a
9.1 V zener diode on each line along with
an electrolytic capacitor to smooth out
the noise caused by the diode.
The diode will turn on whenever the
voltage at its cathode exceeds the voltage
at its anode by 9.1 V. Thus, the top diode
will maintain its cathode at +9.1 volts,
and the bottom diode will maintain its
anode at -9.1 volts.
The 150 ohm resistors in Figure 3 are
essential. Without them, the zener diodes
would suck current until they fried
something. These resistors also determine

150 ohms

+9 Volts

9.1 V Zener Diode

+

1N4739A
or 1N52398

100uF 16Voll
Electrolytic

11
Texas Instruments
AC4136N
QuadOp-amp

-12 Volts
From PC

-9 Volts

9.1 V Zener Diode
1N4739A
Or 1N52398

+

100uF 16Volt
Electrolytic

Figure 3-Power Supply

tween passband and stopband. If you're
wondering why you can't just add a
bunch of poles until this happens, it
turns out to be a multi-way tradeoff.
First, more poles require more components, which costs money. If you don't
need a 12-pole filter, don't buy one. Also,
adding poles can cause other side-effects,
like "rippling" in the passband (which
causes distortion). Thus, you won't often
see a filter that is more than 4 poles (the
one used in this project has 3).
Why Call Them Poles?
To design a filter, you represent it
mathematically. The mathematical equation for a filter has a numerator and denominator, which have points passing
through zero. When the denominator
goes to zero, the expression becomes infinite. If you look at the equation in a
three-dimensional space, a pole looks like
a tent-pole under the plane (the canopy)
representing the function.
Each pole of the function causes the
Bode plot to bend and start decreasing at

56 MICRO CORNUCOPIA, #50, Nov-Dec, 1989

the filter function to generate the right
Bode plot.
There are several ways to manipulate
these poles and zeros, and these ways are
named after their inventors. In this circuit, I used Mr. Butterworth's method ($5
says Dave inserts a comment about
syrup here).

the maximum current the circuit will
provide:
(12V - 9V)/150 Ohms

= 600

milliAmps

which is more than enough.

Usually you don't have to think about
poles and zeros, since most reference
books have the equations worked out for
you; all you need to know is the cutoff
and the quality factor you want.
If you want to know more about filters, an excellent reference is An Introduction to Filter Theory,. by David Johnson,
Prentice-Hall,1976.

Buying Parts
I needed to shop at two outlets to get
the parts. Digi-key has the electret microphone and the IN4739A zener diodes.
(Digi-key also has an extensive line of resistors and capacitors. If you do projects
like this a lot, you should look into their
prepackaged assortments.) You can get
their catalog by calling (800) 344-4539.
JDR Microdevices «800) 538-5000) and
Jameco «415) 592-8097) both have the
RC4136N quad op-amp (four amplifiers
on a chip).

Power Supply
Figure 3 shows the power supply circuit. To achieve a voltage swing between
-5 V and +5 V at the input of the A/D
converter, we need to reduce the ±12 volt

Types Of Capacitors
I ordered parts (from Digi-key) before
I realized I didn't have the right capacitors in my parts cabinets. JDR (where I
bought the op-amp) didn't have a great

Editor's note: $10 says I don't. Just
proves you can't sweet-talk me into adding
editorial comments to your articles.

selection of capacitors. I asked Brink if I
couldn't substitute ceramic disk capacitors for some of the values I couldn't find
in tantalum or monolithic.
He said that ceramic disk caps are the
scuzziest type around and should only
be used as bypass caps. Their values can
change by as much as 80%. Once, as an
experiment, he hooked one up in a filter
circuit connected to an oscilloscope. He
could squeeze the capacitor with his fingers and see a radical change!
There are many types of capacitors:
electrolytic, tantalum, monolithic, silver
mica, ceramic disk, polyester, polypropylene, metalized film, etc. They vary in
production cost and properties. Electrolytic capacitors, for example, come in
large values and some can handle high
voltages (they're also physically large), so
they're ideal for smoothing the ripples in
power supplies. But they're polarized;
you get the plus lead hooked to the
minus side of the supply, and poof!
Ceramic disk capacitors are cheap and
good for bypassing chips (routing supply
line noise to ground). But their capacitance isn't stable (they drift with time
and temperature) so you can't use them
in critical applications, such as filters.
Silver mica capacitors (they sound expensive, don't they) are pricey but they
don't drift. JDR didn't have .0027 J.lF or
.0039 J.lF in mylar, nor 680 pF in monolithic, but Brink said silver mica would
work just fine. JDR didn't have the right
ones in stock, so I got smaller values and
paralleled them to generate approximately the right values.
Editor's note: Ceramic and electrolytic
capacitors are relatively cheap. However both
are unstable, capacitance-wise, and considered lossy. That means that some DC current leaks through the insulation between the
plates. Electrolytics also have a fairly high
impedance so they don't pass high frequencies.
If you need a high capacitance (>1 JlF)
polarized capacitor that can pass high
frequencies, use a tantalum capacitor. If you
need a capacitor for frequency (e.g., filter) applications, you can use just about anything
other than a ceramic, electrolytic, or tantalum.

Products Mentioned
Prom Kit - $179
Annabooks
12145 Alta Carmel Ct., Suite 250-262
San Diego, CA 92128
(619) 271-9526

Schematics prepared with OrCAD SDT
OrCAD Systems Corp.
1049 SW Baseline Street, Suite 500
Hillsboro, OR 97123
(503) 640-9007

AD1000 - $295
Real-Time Devices
P.O. Box 906
State College, P A 16804
(814) 234-8087 FAX 234-6864

Digi-Key
P.O. Box 677
~ief River Falls, MN 56701
(800) 344-4539

Advantech PCl-812 or 712E
Rapid Systems
Seattle, WA 98103
(206) 547-8311
or
Halted Specialties
3500 Ryder Street
Santa Qara, CA 95051

JDR Microdevices
2233 Branham lane
San Jose, CA 95124
(800) 538-5000
Jameco Electronics
1355 Shoreway Road
Belmont, CA 94002
(415) 592-8097 FAX 592-2503

I
Goodbye BASIC, C, COBOL-hello PASCAL! Now, to make
this most advanced language available to more micro users, we've cut our price-to an amazing 529.95! This
astonishing price includes the complete JRT Pascal system on diskette and the comprehensive new user manual.
Not a subset, it's acomplete Pascal. Check the features.
Separate compilation of external procedures •
AutD-loading • 14 digit FLOATING POINT
arithmetic • True dynamic storage • Verbal
error messages • Fast one-step compiler:
no link needed • Graphing procedures • Statistics
procedures • Activity analyzer prints program
use histogram • Operating system interface

Next Time

THIS IS THE SAME SYSTEM WE SOLD FOR 5295!
So how can we make this offer?-why the unbelievable
deal? Very simply, we think all software is overpriced. We
want to build volume with the booming IBM market, and
our overhead is low, so we're passing the savings on to
you.

Next issue I'll show you the code to
make this all work. We'll display
graphics in windows, allocate data dynamically, and talk to the AID board.

AND AT NO RISK!
When you receive JRT Pascal, look it over, check it out.
If you're not completely satisfied, return the system within
30 days and your money will be refunded in full! THAT'S

•••

•

RIGHT-COMPLETE SATISFACTION GUARANTEED OR
YOUR MONEY BACK!
In addition, if you want to copy the diskette or looseleaf
manual-so long as it's not for resale-it's o.k. with us.
Pass it on to your friends! This is a Umited-Time-Offer.
SO ACT TODAY-DON'T DELAY ENJOYING PASCAl:S
ADVANTAGES-AT $29.95, THERE'S NO REASON TO
WAIT!

8m

r···································r.
To: JRT SYSTEMS
P.O. Box 187
Enola, PA 17025
phone 717/732·1093
O.K. You've sold me. Send me JRT Pascal by return mail.
I understand that if I'm not complete~ satisfied, I can
retum it within 30 days for a full refund.
I need 0 51/4" disk or 0 3'/2" disk. 0 Send me the
JRT Pascal program formatter too, for only $14.95.
Name _________________________
Address _ _ _ _ _ _ _ _ _ _ ___
City
State _ _ Zip _ _
o Check/M.D. 0 COD 0 Company P.O. [add $20)
PA residents add sales tax. Add $10 for shipping outside
US/Canada. US funds on a US bank only. Needs only
192K and 1 floppy drive.

L--_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ..

Reader Service Number 154

MICRO CORNUCOPIA, #50, Nov-Dec, 1989

57

Tuning CRITTERS

By Scott Robert Ladd
705 West Virginia
Gunnison, CO 81230
(303) 641-6438

Scott recovers from SOG just soon enough to
dash out this issue's column. Stay tuned as he discusses: Bull, CRITTERS, and a graphics character
generator.
t's over-but it isn't. Rocky Mountain SaG.
It was a big success. We didn't do it alone;
I'd like to thank everyone who helped us
with making RM SaG a success. Special thanks
go to Jim Nutt and Linda Lunt for their abovethe-call-of-dutyassistance.
The raft trip was, as always, an adventure. I
kept losing my paddle; but then again, I've
never had my oars in the water. One boat lost
its guide; another boat was swamped by high
waves. The Taylor River provided one of the
most exciting raft trips of my life. Fortunately, I
remembered to bring dry shoes for the ride
home this year.
Will we hold another SaG? You bet! Maria
and I can't conceive of a SOGless summer. So,
we're scheduled again for 1990: June 14-16,
here in Gunnison. The theme of Rocky Mountain SOG-II will be graphics and animation,
with (we hope) a special focus on robotics. If
you couldn't come this year, maybe you can try
it next year. There's nothing like cool mountain
air and friendly people.
In fact, because of Rocky Mountain SaG,
I'm going to make a change. From now on, I'm
releasing all program code published in this
column into the public domain. Copyrighting it
is both a waste of time and a nuisance. So go to
it, folks-this code's for you.
I'm writing this column during the first days
of August, just a few days after our SaG.
While SaG was great fun, it was also a considerable amount of work for Maria and me.
So, things that should have been done for
this column weren't and I'm making a minor
course correction. While the fractal landscape
generator is almost complete, it isn't finished.
Look for it in issue #51, along with a speedy
auto-sensing graphics library.
Fortunately, I received a lot of questions and

I

58

MICRO CORNUCOPIA, #50, Nov-Dec, 1989

comments about the column. So this is going to
be a potpourri of answers. We'll begin by looking at some new hardware that wandered in
the door. (Fast hardware can be a bane as well
as a boon.)

Bull
Bull is the name of my latest computer. It's
from BFM Computing of Rhinelander, Wisconsin. A 20 MHz 80386 with 4 megabytes of
memory, a 64K static RAM cache, 28 millisecond 65 megabyte Mitsubishi hard drive, and
16-bit VGA, Bull certainly has improved my
computing environment. He benchmarks out at
23.0 on the Norton 51 scale, considerably better
than my "old" 16 MHz 386 box.
BFM offers an amazing 3-year warrantee on
the motherboard, and so far, this machine is
impressive. I don't want this to be an advertisement, but if you'd like to contact the company,
you can reach them at:
BFM Computing
701 Washington St.
Rhinelander, WI 54501
(715) 362-4712

Inefficient Code
High-powered hardware is great but those
of us who write programs may find that our
super machines are hiding a problem: inefficient code. Even a sloppy program will be fast
on a 386. However, put those programs on a
lowly 8088, V-20, or even 80286, and they
crawl. Such is the case with the CRITTERS program introduced last issue.
I've rewritten CRITTERS. The self-extracting
file CRITTER4.COM contains everything you
need. You can find it on the Micro C BBS, on
the listing disk for this issue ($6 plus $2 S/H to
foreign countries) from Micro C, or from me for
a disk and postage. It's just too big to publish
in the magazine. If you get a copy, feel free to
distribute it via BBSs and users groups.
I had several goals when I rewrote CRITTERS. First, I wanted it to be faster-much
faster. Second, I needed to make the program

High-POWered
hardware is great
but those of us who
write programs may
find that our super
machines are hiding
a problem: inefficient
code.
more generic so people with non-Microsoft compilers could compile it. Third, I
wanted to add some new features. I
broke out my tool kit and got to work.
Profilers are among the least used
and most ignored tools for programmers. A profiler analyzes your program's execution, creating a report
showing how much time it spends in
which functions. It can even track variable accesses to tell you which data gets
used most.
I use the MMC AD Systems profiler
called PMon. It works very simply. You
compile your program to create a .MAP
file, which is then fed to a processing
program called MapVar. Then, PMon
works as a shell to run your program; at
regular intervals, PMon checks to see
where your program is using the output
from MapVar to locate different parts of
your program.
When your program is done, PMon
outputs a report which tells how many
times each function in your program
was "hit." The more hits, the more
often that section was executed.

typedef . unsigned. char CHAR DEF{S);
typedefCH.A1LOEFc.aAk_SE'.r [256];
CllAR_OEF.grid_char;
CHAR .• SE'.r . cset:
char~setname[641 ;/*
const char * version

/*nia..tdxto •.·hold one . charactf:lr */
l*u;ay of all chf1rsin>a. set *1

l*createlilorldngcharacter setvarial:>les

= "1.10"i

1* function· prototypes */
",oid>JlIain(intarqc,char *argv:[]);
voidshow·screen(void);
int\edit:set{void)i
. 1*~odifY~urrentcha.rset*1
",oid nOrlllblock (intI, int c); l*.~f)~block to"o~fU .*1
void blink block (int1, . i n t c ) r > < ··.J*cursor */
void reverse block (int l,int c);j.""s~t:blockto 1I0nn*/
void save char (unsigned char) ;I*writ.echartoset*/
unsigned ~har select_char (void):l~.ch0osechar toedit*/
void main(int argc, char *argv:£l)
(

FILE *csfile; f* character set file
char reply;
f* . user input~/
inti, 1;
1* loop variables *1
intsave_set;

printS(··\:;~:i~~~arD!:·.···Gre~i~¥){j%S

%s·.···%s\n" ~

l~i~~:~~w~i~jj. • l>y . . j~IT~r •. •.~~.7j.~ • . ·.Ttr~.,.\n\Xl. '.~. :
printf(,'Enter.· a. character.setn.ame: •. ");
gets (setname) : . . putcha.r ('.\n');
i f (!str1en (setnamf))'{
printf ( II \ 7Noset name entered . Exit~\n'~ r:
exit (1) i
)

else
strcpY(tJet:~ame;argv: [11);
if (Npt.L==(csf~le.·.=::Jopen(sf)tnCUllf),tlrb··»). {

p\intf (n~:~~a:rr%S~ot

.•

fo~llci ..• ~ke . '• . it . ••• (~IN) 1",

=

while (!kbhit() ).; reply
(char)getche 0;
reply:::::toupper (reply) ; putchar C\n f);
l.f (reply • ='. '''.{')
for '•• (l.= 0; i><. 256;<+tl.)
for (1 =0; 1<8:++1)
cset[l.]{l].:::::O:
else '. {

Continued on page 60

MICRO CORNUCOPIA, #50, Nov-Dec, 1989

59

-

printf ("Program. terminated. \n"); exit (2);

blink b10ck(1/a} 1
}
break;
ca.e SO ; 1* DOWN' *1
if (1 < 7) (
nom block (l,a) ;
++1;-

}

}

else
fread(aset,sizeof(aset),l,asfile):
felose(asfile); disp_open();
disp setattr(7); show screen();
save-set. edit Bet C); disp moveCO,O);
disp-eeop(); disp alose()i disp-move(O,O); if (save set)
if {io:t.L - (asfile .. fopen(setname, llrib")})
printf("Char set %saannot be written. \
Saving as. CHARBET.DAT. \nll);
asfile - fopen("CHAIUJET.DU",lw+b");

bli~b10ck(l,a);

)
break;

)

break;
case 'X, :
save_char(aurch);
stop • 1; ret_val .. 1;
break;
.
case 'Q' :
stop • II ret_val - 0;
break;
cas. 32
rever.. block(l,a);
break; case'S' ;
save char(aurch);
aurCb - seleat char();

}

else
fwrite(cset,sizeof(aset),l,csfile);
falose (asfile);
}

void show screen ()
(
int i;

-

disp_move(O,O); disp eeop();
disp_move (1,1); dispyrintf ("11) ;
disp_move(17,1); dispyrintf(IIII);
for (i - 2; i < 17; i - i + 2) {
disp move (i,l);
disPYrintf("
"};
}

for (i - 3; i < 16; i.- i
disp move(i,l);
dispyrintf ("11);

1 • 0; a - 0; -

blink block(l,a):
break;
}

return ret val;
}

-

+ 2)

void no%JD. block (int 1, int a}
{

)

disp_move(3,31)i
dispyintf(IIcursor Keys move aursor");
disp move (5,31);
dispyrintf(IIX" Exit and Savell);
disp move (6,31) ;
dispyrintf(IIQ .. Quit (without Saving)II);
disp move(O,3l);
disPJ>rintf(IISpaae Bar .. Reverse Current Block");
disp move(10,31);
dispJ>rintf(IIS .. select Character to Edit"};
}

int edit set ()
(
unsigned char key, £key, aurah;
int stop - 0; int 1; a; int ret_val;

-

1 - 0; a .. 0;

aurch .. seleat char();
blink block(l,c);
while- (t stop) (
while (tkbhit(» i
key .. (char)getch();
switah(toupper(key»
aase 0
if (kbhit (» {
fkey. (ahar)getch();
switah (ney) (
case 72 : I*vp *1
if (1 > 0) .{
no%JD. block (1, a) ;
--1;-

blink_b10ak(1,a);
}

break;
case 75 : 1* LEFT *1
if (a>O) (
nO%JD._block(l,a);
·"0;

blink block(l,a);
}
break;
case 77.: . 1* lUGHT *1
if (a< 7) {
no%JD. block (Ii a) ;
++a;-

-

-

unsigned int val, aI, aa;
al .. (1 * 2) + 2; aa - (a * 3)
val .. dispyeekw(el,aa);
val - val & Ox7rrr;
disp..,J>Okew(el,aa,val); ++aa;
val .. dispyeekw(el,aa);
val - val & Ox7rrr;
disp..,J>Okew(el,aa,val);

+ 2;

J
void blink bloak(int l,int a)
{
unsigned int val, aI, aa;

-

a1. (1 * 2) + 2; aa .. (a * 3) +.2;
val - dispyeekw(el,aa);
val .... val 1 Ox8000;
disp..,J>Okew(el,aa,val); ++aa;
val .. disp-p-ekw(el,aa);
val .'val I Oz8000;
disp..,J>Okew(el,aa,val);
}

void reVerse block(int 1, int a)
(
unsigned char bit;
int aI, aa;

-

a1 .. (1 * 2) + 2; aa .. (a * 3) + 2;
bit- 1 «~(charla;
if (grid_char [1) 'bit) (
grid char[l) ,- ~bit;
dispykew(el,aa,Oz87BO);
disp..,J>Okew(el,ac+l,Ox07BO);
}

else. (
grid char[l) I- bit;
dispykew(el,cc,OXS7DB);
disp..,J>Okew(el,cC+l,OxS7DB);
}

void saVe char (unsigned char no)
(
melllcpy(caet[no) ,grid':"char,sizeof(grid_char»;

-

Continued on page 62

60

MICRO CORNUCOPIA, #50, Nov-Dec, 1989

C CODE FOR THE PC
source code, of course

NEW!

NEW!

NEW!
NEW!
NEW!

NEW!
NEW!
NEW!
Updated!

NEW!
Updated!
NEW!

NEW!
NEW!

Updated!

MS-DOS File Compatibility Package (aeate, read, &. write MS-DOS file systems on non-MS-DOS computers) •
• $500
$500
CSource Application Program Generator ~ MBAC (includes all source cOde; generator &. libraries) . . . .
$325
dB2c (dBase-to-C translator; includes dB-Files for C anddB_Thols for C). • • . • • • • . . • . . • . • .
pBaae (relational DBMS with ~ebugging calls and spa.rae table &. repeated field support) . • • . . • . • • .
• $325
COL Que~ Sp.tem (SOL retrievals on B-trees plus wmdows) . • • . . • • • • . • • . • . . . • • ~ .
· $325
$325
GraphiC S.O (~gh-reaolution, DISSPLA-style scientific plots in color &. hardcopy) • • • • . . • . . • . . • . . • • . . • . • •
$300
Draidl Oiap with Crules (~p library and programmin~ enviro~ent with r:ule p~ing capability; natural language example) . . . .
$300
Greenleaf Data WlOdowa (Windows, menus, data entry, mteracuve form des1i; spectfy compiler) . • . • . . . • • • . • . • . • • •
PC Olraea (Aspen, Software, System V comP;8tible, extens~~ d~umentation
••..•..•.••••.....•..•....
• $290
$260
Code Base (database manager, dBase and Oipper: compaubile lOdes &. data lea; Vemon 4.0). . . . . • • • • . • . . • • • • • .
$250
MEWEL (extensible window and even~ library by Magma Software; message-passing &. object-oriented; SAA-compatible; dialog editor)
ThrboThX(Release 2.Q; HP, PS, dot dnvers; CM fonts; La'Ji3X; MetaFont) • -. . . • • • • • . . • . • • . . • . . . . . • • • . •. $250
.$250
PC PosiSaipt (complete PostScript interpreter (ROM Version 47.0A), 80286/386 only, many device drivers, optimized graphics, fast)
db.Fale &. db.Rctricye (B-tree. and ne~ork database with SOL query and report writer) .' • . : . • . • . . . • . • • . . • . •
· $245
Greenleaf Commurucatlons library (m:errupt mode, modem control, XON-XOFF; speafy compiler) . • . . . . . • . . . . . .
• $225
CDirect (multi-user hashed file manager; variable length fields, binary or ASCII data, alternate keys). . . . . . . . • . . . . . •
· $210
BOlL COmpiler (this is not C source but BOlL source; BOlL is the mother of C) . • . • • . . • • • • . . . . • .
• $195
OuickGeometry'Library (large collection of mathematics, graphics, display &. DXF subroutines for CAD/CAMICAE/CNC)
· $170
CBTh:e (B+tree ISAM driver, multiple variable-length keys) . . • . . . . • . . • • . • . . •
· $165
ThrboGeometry (library of routines for computational geometty, Version 3.0). • . • . • . . . • .
· $160
AT BIOS Kit (roll your own BIOS with this complete set of baSIC input/output functions for A'IS) ••
· $160
WKS library Verslon 2.0 (C program interface to Lotus 1-2-3, dBase, Supercalc 4, Ouatro, &. Cfipper)
· $155
OS/88 ~ ..x-like operating system, many tools, aoss-development from MS-DOS) • • . . • . . •
• $150
Cephes Mathematical library (over 100 high"'9uality, double-precision scientific functions) • • . . • . . .
· $150
ME Version 2.1 (programmer's editor with C-like maao language by Magma Software; Version 1.31 still $75)
• $140
Vmem/C (virtual memory manager; least-recently used pager; dynamic expansion of loWap file) •. . . . .
· $140
Thrbo G Graphics library (all popular adapten, hidden line removal) • . • . . • . . : . • . . . . . .
• $135
vUB (270 C functions for windows, menus, forms, pop ups, mouse support, and input editing) . . . • . .
· $125
Power Search by Blaise Computing (regular-expression compiler; generates machine code on the fly) •
• $120
Install 2.3 (automatic installation program; user-selected partial installation; CRC checking) . • • .
· $120
TE Editor l>eveloper's Kit (full saeen editor, undo command, multiple windows) • . . . • • . . •
· $105
Minix Operating System (Version 1.3; U -_x-like operating system, includes manual) . . . . . • . . • . . .
$105
$100
H~tIeXt Viewer (simple hypertext system; multi-file documents; includes TIny Curses) . • • . . . . . • •
$100
PCIIP (C.MU/MITTOJ/IP for pcs; Ethernet'.~J?pletalk &. NETBIOS drivers, RVD, update by Dan Lanciani) .
$100
B-Th:e Library &. ISAM Dnver (file system utibtle5 by Softfocus) . • . • . . . . . . . . . . . . . . . •
The Profiler (program execution profile tool) • • . • . • • • • • • • • • • • • • • . • • . • . . • • .
$100
OC88 C compiler (ASM output, small model, no longs, floats or bit fields, 80+ function library) . . . . . . . .
$90
Otter 1.0 ~autiful theorem-prover by Bill McOlne; includes manual &. two books by Wos; complete starter kit) .
$80
$80
C Windows '!boltit (pay-up, pull-down, spreadsheet, CGA/EGA/Hercules) . . • . . . • . . . . . . . . .
JATE Async Thrminal Emulator (includes file transfer and menu sUbsystem) . . . . . . . . . . . . . . . .
$80
$80
MultiDOS Plus (DOS-based mu~ti~ting, intertask messaging, semaphores) . . • . . . . . .
$75
Make Sacros, all languages, budt-lD rules) • • . • . . . . . . • . • • . . . • . • . . .
$75
evalO C function to evaluate ASCII infix expression string; 17 built-in functions) . . . . . . .
XT BI S Kit (roll your own BIOS with this complete set of basic input/output functions for XIS)
$75
Professional C Wmdows (lean &. mean window and keyboard handler). . • . . . . . . . . . . .
$70
Screenlib (simple screen definitions, windows, pop-up menus, context-sensitive help) . . . . . . .
$65
Heap ~nder (virtual memory manager using expanded memory, extended memory, and disk space)
$65
$60
SYSKIT (rommable or TSR debuglmonitor; easily expanded) . . • • . • . . . . • . . . • . •
$60
Quincy (interactive C interpreter) • • • . . • . . . . • . • . . . . . . . . . . • • . . . .
$60
Symtab (general-purpose symbol table construction and management package) . . . . . . . • • .
$60
P'Iree (general-purpose parse tree construction and management package) . . . . . .
$60
Coder's Prolog {Yersion 3.0; inference engine for use with C programs) . . . . . . .
$55
~-Thrmio (Unix V com~tible serial interface for MS-DOS; stty, ioctl, SIGINT, etc.) . . . . . . .
$50
Baam &. Restore Utility by Blake McBride (multiple volumes, file compression &. encryption) . . . .
$50
Su
rep (exceptionally fast, revolutionary text searching algorithm; also searches sub-directories) . .
$50
R GX Plus (search a~d replace string mampula!ion routines base~ on regular expressions). . '. . . •
OBJASM (convert .0bJ files to .asm files; output IS MASM compatible) . . • . . . . . . . . . . .
$50
Polyglot TSR Package (includes reminder, bookmark, virus catcher, cache manager, &. speech generator)
$50
Multi-USer BBS (chat, mail, menus, sysop displays; does not include modem driver) . . . . .
$50
CUPS (rule-based expert system generator, Version 4.3; advanced manuals available) . • . .
$50
Fortran-to-C Thlnslator by Polyglot . • . . . . . . . . . . . . . . . • . . . . . . . .
$40
AcxList (doubly-linked lists o(arbitrary data with multiple access methods) . . . . . . . . .
$40
Virtual Memory Manager by Blake McBride (LRU pager, dynamic loWap file, image save/restore)
$40
Heap I/O (treat all or part ofa disk file as heap storage) . . . . . . . . . . . . . . . . . .
$40
OOPS (collection of handy C+ + classes by Keith Gorlen of NIH; Version 2.2) . . . . . . . . . • . . • • . . . . . . . .
$35
Bison &. PREP \lACCworkalike parser generator &. attribute grammar preprocessor; now includes documentation) . . . . . .
$35
PC-XINU (Comer's XINU operatlDg system for PC) . . . . . . . • . . . . . . . • . . . . . . . • . . . . . . . . .
$35
RXC &. EOREP (Regular EXpression Compiler and Pattern Matching; RXC makes finite state machine from regular expression)
$35
$30
Polyglot RAM Disk (chanidisk size on the fly; includes utilities) . . . . . . . . . . . . . . . . . . . . . . . . . . . .
GNO Awk &. Diff for PC
th programs in one package) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
$30
Thlnslate Rules to C (YA: C-like function generator for rule-based systems) . . . . . • . .
..
..
..
$30
6-Pack of Editors (six public domain editors for use, study &. hacking) . . . . • . . . . . .
$30
Crunch Pack (14 file compression &. expansion programs) . . . . . . . . . . . . . . . .
$30
Pascal P-Code Compiler &. Interpreter or Pascal-to-C 'Ihinslator (Wirth standard Pascal) . . .
$25
$25
FLEX (fast lexical analyzer generator; new, improved LEX; official BSD Version 2.1 with docs)
$25
Arrays tor C (macro package to ease handling of arrays). . . . . • . . . . • . . .
$20
A68 (68000 cross-assembler) . . . -. . • . . . • . . . . . . . . . . . . . . .
list-Pac (C functions for lists, stacks, and queues) • . . . . . . . . . . . . . . .
$20
$20
XLT Maao Processor (general purpose text translator)

Data

Protein Sequences (over 10,000 sequences; includes demo disk of Pearson FAST/A programs). . . . . .
Smithsonian Astronomical ObselVatory Subset (right ascension, declination, & magnitude of 258,997 stars)
Mob)' Words (500,000 words &. phrases, 9,000 stars, 15,000 names) . . . . . . . . . . . .
U. S. aties (names &. longitude/latitude of 32,000 U.S. cities and 6,000 state boundary points) .
The World Oigitized (100,000 longitude/latitude oCworld country boundaries) . • . . . . .
KST Fonts (13,200 characters in 139 mixed Conts: specify 1EX or bitmap format) . • . . . .
US NO Interactive Computer Ephemeris (high-precision moon, sun, planet &. star positions)
U. S. Map (15,701 points of state boundanes) . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . .

The Austin Code Works
11100 Lea/wood Lane
acw!in/o@uunet.uu.net
Austin, Texas 78750-3409 USA
Free surface shipping for cash in advance
For delivery in Texas add 7%

Voice: (512) 258-0785
BBS: (512) 258-8831
FAX: (512) 258-1342
MasterCard/VISA

Reader Service Number 4

MICRO CORNUCOPIA, #50, Nov-Dec, 1989

$60
$60
$55
$35
$30
$30
$30
$15

61

Figure 2-CS_Disp (Character Set Display Routines)
unsigned char se1ect_char(void)
(

.

1*

unsigned char sel, bit;
int 1, e, el, ee;
disp move(19,31);
disPJrintf("Enter a character to be defined: ");
disp move(19,64)1
whil;(rkbh1t(» ;
sel • (char)getch();
dispmove(19,31)1
disPJrintf("
I.);
memcpy(grid_char,caet[se11,sizeof(grid_char»;
for (1 - 0; 1 < 8; ++1)
for (c - 0; e < 8; ++c) (
cl - (1 * 2) + 2; ee • (e * 3) + 2;
bit - 1 « (char)c1
if (grid_char [1) 'bit) {
disP-fOkew (el,ec,Ox07DB);
disP-fOkew (cl,ec+l,Ox07DB);

Version:
Language:
Environ:
Purpose:

1.10
11-Aug-1989
Zortech C v1.07.
MS-DOS, IBN-PC compatible
Load and display character seta
created with CSG.
Written by: Scott llobert r.add

*1
'include "es_disp.h"
'include "zipgraph.h"
'include "stdio.h"
typedef unsigned char CHAR DEI" [8] ;
typedef CHAR_DEF CHAR_SE~[256J;

int es load(char * cs.t_nam.)

}

else {
disP-fOkew (el,ee,Ox07BO);
disP-fOkew (cl,ec+l,Ox07BO);

(

-

*

FILE

cset_file;

}

)

return se1;

if (cset file return 1;

)

•••

fread(cset,

BOLL)

sizeof(CHAR_SE~),

1, cset_file);

felose(eset_file);
return 0;
)

void .eSJ>utch(int line, int col, unsigned char ch,
unsigned char fcolor, unsigned. char bcolor)
{

int x, y;
unsigneci ehar bit;
for (x - 0; x < 8; ++x)
(

for (y • 0; y < 8; ++y)

cr
PP
rJ 'aI7Le

TurboFlow is serious
flowcharting software at
a price that won't cost you your
kingdom. It's easy to use and more
~~;il~=r'r~~ powerful than Merlin's magic.
TurboFlow runs on an IBM PC
!l:: ~~lQ:Im~lt9JI~and features a complete set of ANSI
/b(Jl'!r~::..::3~~-"""i'i~_~s':1.ym=bo~ls!..,lS~'~m~e~n~u driven, interfaces
with desktop publishing . software,
and supports a variety of printers
and plotters.
So stop living
in the dark ages.
Call 1-800-8825822 and order
I your copy, or ask
for our free bro'------'-J.........JLL;~~BIIIIIIi. .IiiII!!~~==----l chure.

{

bit - (unsigned char) (1

void csJ>uts(int line, int col, ehar *str,
unsigned charfcolor, unsigned char bcolor)
(

char * eh;
ch -.str;
while (ch)
{

csJ>utch (line, col, *ch, fcolor, bcolor);
++ch1
col fa 8;

•••

Reader Service Number 174

MICRO CORNUCOPIA, #50, Nov-Dec, 1989

y);

if (cset[ch] [x] 'bit)
plotpixel(col+y,line+x,fcolor);
else
plotpixel (col+y, line+x, bcolor);

}

62

«

It turned out that CRITTERS spent
80% of its time in Microsoft's graphiCS
routines! Even worse, the two routines
using 60% of the program's time were
setting and resetting the EGA card!
Yuck! This becomes even more significant when you realize that Microsoft's
graphics library is faster than most of
the others (including Borland's).
The obvious solution is to get a faster
graphics library. While I have severallibraries around the house, I decided to
roll my own.
So I wrote FasCEGA and Fast_HGC,
two small assembly language graphics
modules for EGA and Hercules
Graphics cards. These modules do three
things: turn on graphics, turn off
graphics, and plot pixels. That's all that
CRITTERS needs. The CRITTER4.COM
file includes both modules.
Many people purchase commercial
libraries rather than write their own
(usually because the commercial versions are already debugged), but there
are significant advantages to building
your own. First, your function libraries
are yours (i.e., you know them from top
to bottom, and they work exactly the
way you want them to). Most importantly, you can tailor your library, as I
have done here, to fit the application.
Commercial packages are also designed to handle a variety of situations,
so they tend to be large. You end up
linking-in all sorts of things you don't
need. And, when performance is an
issue, it's best to build your own.
Another problem reared its ugly
head when I started to use Hercules
graphics. The CRITTERS dIsplay has a
short status line at the bottom, indicating the number of moves elapsed and
the current number of living critters.
The IBM-PC ROM BIOS can display
characters on a graphics screen (albeit
slowly>-but the Hercules card doesn't
use the IBM BIOS!
In order to write characters to the
screen on a Hercules adapter, you have
to put the characters there pixel-bypixel. So I wrote a quick program to
generate 8x8 bit-mapped character sets
and a set of functions to display them.
This turned out to be a good thing,
since my bit-mapped chara~ters are displayed many times faster than those put
out by the BIOS. The C EXPLORATIONS section below describes the character set generator and display functions.
The original version of CRITTERS
read screen pixels to determine if they

• SEE HOW PROGRAMS WORK
• EASILY MODIFY PROGRAMS
SOURCER'M creates detailed commented source code and listings from memory
and executable files. Built in data analyzer and simulator resolves data across
multiple segments and provides detailed comments on interrupts and subfunctions,
liD ports and much more. Determines necessary assembler directives for reassembly. Includes a definition file facility to include your own remarks and descriptive
labels, force data types, and more. Complete support for 8088/87 through 80386/387,
80486, and V20N30 instruction sets. We welcome comparisons with any other product,
because no product comes close to the ease of use and output clarity of SOURCER.

Sourcer is the best disassembler we've ever seen!
-PC Magazine, January 17, 1989, page 101
resetprn.ht

SAMPLE

Sourcer Listing

ResetPRN vl.02
PAGE

OUTPUT

18-Sep-89

1:41 pm

Page I

60.131
RESETPRN

Fully
automatic
Program
header

Created:
Version:
Passes:

14-Aug-89
1.01
8

Analysis flags on: H

.386c
• 0008

@prn_port)

equ

; (0040:0008·378h)

:-- ___________________________________________________ -------sega-----

Assembler
directives

seg_a

seglT'ent para usel6 public

-

assume cs:seg.a, ds:secLa, ss:stack.seQ.b
resetprn
658E:0000
65&:0000 E813
658E:0001 51 65 73
658[:0008 51 4E 10
65&:000E 303100
658[:0011 0040
658E:0013 00 OA 51
658[:0019 74 10 50
658[:00IF 74 65 71
658E:0015
658E:00150[
658[:0016 IF
65&:0017 .SA 0013
65&:001A 8409
658[:001C CO 11

Determines
data areas
and type
Detailed
comments

proc

far

jl11J
db

short lac 1
·ResetPRN-vl.01', OOh

dw
db

40h
COh, OAh. 'Reset Printer? S'

push
pop
II'WJY

c50
ds
d,.oflset data 3
ah,9
-

int

21h

start:
65 74 50
76 31 1E

65 73 65
71 69 6E
3F 10 14

data 1
data)

10c_l:

; (558[:0013·00h)

: DOS Services ah-function09h
;

Simulator
follows
segment
changes
80386 and
80486
support

658[:001E
658[:0030

84 01
CD 11

""V

ah.1
11h

658[:0031
65&:0034
65&:0036
658[:00lA
658[:003[
65&:0041
65&:0043

3C 79
751A
8E IE 0011
88 160008
83 C1 01
8008
[[

c""
joe

al.79h
short loc3
ds,data1-

658[:004466:8900010000
658E:004A
658E:004A 67: [1 FD
658[:0040 800C
658E:004F EE

int

""V
add
""V
out

dx,ds:@prn port 1
d',1
al.8
dx,al

, get keybd char al. with echo
; 'y'

;Ju"" If not equal
; (658E:00ll.40h)
; (0040:0008.378h)

-; po!"t 37Ah, prlnter-2 control
; al.8, Inltlallzeprlnter

ecx.10000h
locloop_1:
loopd

locloop1
al,OCh-

: loop,lf ecx)o 0

out

d.,al

: port 37Ah. printer-2 control

""V

;
658E:0050
658[:0050
658E:OQ51

Easy to
read
format

display char Hring at ds:dx

: DOS Services ah.functionOlh

""V

84 4C
CD 11

Int

resetprn

ah,4Ch
11h

al. OCh, Inlt & strobe off

'l'
; DOS Services ah·functlon 4Ch
: terminate with aI-return code

endp

seg_a

ends
:-____________________________________________________ -- stack.seg.b ----

stack.se9.b

segment para use16 stack
db
ends

191 dup (OHh)

stack_se9_b

end

start

6593:000000CO[H)

(Source code output and inline cross reference can also be selected)

BIOS SOURCE

• CHANGE AND ADD FEATURES
• CLARIFY INTERFACES

for PS/2, AT, XT, PC, and Clones
The BIOS Pre-Processor'M with SOURCER provides the first means to obtain
accurate legal source listings for any BIOS! Identifies entry pOints with full explanations. Resolves PS/2's multiple jumps for improved clarity. Provides highly
descriptive labels such as "video_mode" and much more. Fully automatic.

SOURCER Commenting disassembler $99.95
SOURCER with BIOS Pre·Processor 139.95

UNPACKER ,. Unpack packed EXE files and more
ASMtool'· Assembly source analyzer and flowcharter

$39.95
89.95

Shipping & Handling: USA $3; Canada/Mexico $10; Other $15; CA Res. add sales tax; PS/2 trademark of IBM Corp.

NOT COPY PROTECTED

30-DAY MONEY-BACK GUARANTEE

If within 30 days of purchase you find our product does not perform in accordance with our claims.
call our customer service department and we will gladly arrange a refund.

For orders and information, call:

I

VISA

I

IZ:Z:SJ
1-800-662-8266
ffi
V COMMUNICATIONS, INC.

303 t Tisch Way, Suite 802, Dept. MC4, San Jose, CA 95128 (408) 296-4224
62

MICRO CORNUCOPIA, #50, Nov-Dec, 1989 63

were food. This is slow and tedious,
taking about 10% of the program's time.
So I created a bit array which indicates
the location of food. When food is
plotted on the screen, a bit is set in the
array. When a critter moves, it checks
the bit array rather than having to read
the screen.
At this point, I began to add new
features to CRITTERS. The little guys
now mutate their color, maximum
energy level, reproduction cycle, and
life-span. Critters now move in eight
directions instead of four.
In addition, I have added a mutation
that can "sense" food. This is implemented as a radial search, the distance
controlled by the critter's sense gene. It
turns out that senses are a very positive
mutation; within a few hundred moves,
the critters that have gained senses wipe
out the "senseless" ones.
More additions are on the way. Carnivores and omnivores will be interesting. How about disease and disaster?
Different species of food? Different food
in different parts of the "world"? And,
of course, what about bisexual reproduction? (Editor's note: What about it?
This is a family magazine.) The possibilities are endless.
Of course, I tightened code here and
there and removed some redundant
loops. By the time I was through, CRITTERs had gone from 2,000 moves per
hour to over 20,OOO! With the new
graphics library, the program now compiles under the Microsoft, Borland, and
Zortech compilers. Using Zortech C in
integer-only tiny model produced a
new CRITTERS program 40% smaller
than the first.

C EXPLORATIONS
Now let's look at the character set
generator, called CSG. CSG, shown in
Figure I, is a Zortech C program which
lets you design complete 8x8 bit characters, visually. Figure 2 shows CS_Disp,
a module containing the functions to
load and display characters on the
screen.
Let's look at CSG first. The idea behind CSG is simple. An array of eight
8-bit bytes holds each character. The
array CHAR_DEF defines the structure
of a character. CHAR_SET is an array of
256 CHAR_DEFs and represents a
complete character set.
mainO begins by checking to see if
you've entered the name of a character
set on the command-line. If not, it asks
64 MICRO CORNUCOPIA, #50, Nov-Dec, 1989

for a file name. If the file exists, the program lets you edit the character set.
When you've finished, it saves the
changes. All very neat and simple, huh?
It's the editor which is tricky. When
a character is displayed for editing, it is
shown in an 8x8 matrix on the left side
of the screen. Each block in the matrix
represents one pixel. One block blinks;
this is the current cursor position.
Pressing the keypad arrow keys moves
the cursor around in the matrix.
Background cells are grey, foreground cells are white. To toggle the
state of a cell between foreground and
background, just press the space bar.
Press S to select the character to be
edited. CSG will then ask which of the
256 characters you want to edit. You
can enter the character directly (e.g., by
pressing the "g" key to edit the lower
case g), or you can hold the Alt key and
enter the decimal value of the character
on the keypad.
Once you've selected a character, the
matrix displays its current representation for editing. Pressing X will
exit the program and save the character
set; pressing Q will exit the program
without saving. All in all, a very simple
process.
As cells are toggled, the CHAR_DEF
matrix changes bits for the current character. The routines for blinking, setting,
and unsetting cells contain some interesting video-display algorithms. There
is no reason CSG could not handle
different size characters. I made it
simple to handle some simple graphics
text problems.
CS_Disp is the module which makes
the character sets useful. The function
cs_IoadO copies a character set from
disk into memory; only one character
set can be loaded at a time. cs_putchO
displays a single character, and cs_puts
outputs a complete line. A specific pixel
location on the screen displays characters. These are fairly simple routines.
I've found that having my own character generation and display routines
has made graphics programming much
easier and more· pleasant. My routines
run considerably faster than those provided by most vendors, and they use far
less. disk and memory space. Use them
and abuse them; after all, that's why
they were published. As always, I
appreciate comments.

products this time around. Microsoft C
6.0 should have been out by now, but
the development of a new "power programmer's" environment and CodeView 3.0 has delayed it. Lattice 6.0,
which is supposed to get them back into
the race, should also be out, but I
haven't seen that either. Such is life....

RESOURCES
One book you must have if you use
PC-compatible video displays is called

Programmer's Guide to PC & PS/2 Video
Systems, by Richard Wilton (Microsoft,
1987, ISBN 1-55615-103-9). This is the
best nuts-and-bolts volume I've ever
seen on every standard video adapter
from Hercules to VGA. Wilton's book is
written for assembly language programmers, which can be a problem for
people unfamiliar with that art.
If you're a C programmer (which I
assume you are if you read this
column), another good book is Graphics
Programming in C, by Roger Stevens
(M&T Books, 1988, ISBN 1-558-51018-4).
This book contains virtually no assembly, and the code in it works with
Borland's Turbo C and others. This
book isn't as deep as Wilton's, but it
covers the subject well.

NEXT TIME
I've got more things to talk about
than can possibly fit in the next few
(years of) issues-but I'm going to try.
The next issue will feature my quick
minimalist auto-sensing graphics library, ZIPGRAPH, a cornerstone of
most of the graphics work I do. It's
needed for the FRACLAND program,
which generates fractal landscapes.
If possible, I also intend to do some
work with ray-tracing in 640x400 by 256
color mode. Then there's the star-chart
generator and the c++ library and the
planetary system generator and more
CRITTERS and some interesting new
applications for fractal geometry and
the 32-bit fixed-point math library
and ....
An author's work is never done,
especially if he's having fun.
MMC AD Systems
Box 360845
Milpitas, CA 95035
(408) 263-0781

NEWS AND REVIEWS
Sorry folks! There aren't many new

•••

By David Thompson
Micro C Staff

Do You Feel Invisible?
CULTURE
CORNER

• Surviving On Caffeine & Sugar
• Getting Technical Work Without
Technical Training
• Pocket Protectors
• Advanced Pocket Protectors
• Fiction Writing
• Creating A Work History
(prerequisite: Fiction Writing)
• Moving Into Management
• Dressing For Distress
• Cashing Your Paycheck First
• 100 Most Asked Party Questions
• Advanced Mumbling

know the problem. It's Friday
night and you're attending yet
another fantastic party. But, for
all intents and purposes, you might as
well be invisible.
You notice others who naturally attract crowds, who are the centers of attention as they move about the room.
People cling to them and to their every
word.
Who are these popular people? What
makes them so interesting? There's one
now, let's see what we can discover.
Immediately you notice he's gripping a can of Jolt in one hand, a halfeaten twinkie oozes slowly from the
other. It's obvious that the color of his
skin precisely matches the dingy whites
of his eyes. Check out the ink-stained
pocket protector safety-pinned to his Tshirt. Notice the thick, dirty glasses.
We approach within earshot: "Are

Y

OU

the clones really compatible?" "Who
designed the original IBM?" "What year
did Lotus invent the spreadsheet?"
"Does Adam Osborne really paint his
toenails?" Notice that he answers only
in carefully phrased monosyllables.
This man is clearly no lightweight.
This man must be: AN ENGINEER.
Of course he is. And his suave party
dress and studied manner shows he's a
USED engineer, a graduate of Universal
Systems Engineering Development's
new program: VaporTraining. From the
company that introduced VaporWare,
VaporTraining is the most successful
program for prospective engineers and
other party animals. Plus, unlike universities, USED is no ordinary diploma
mill.
Nowhere else will you get the training you really need to be the complete
engineer. USED classes include:

Order any two classes and get the
third class free. Complete four classes
for a USED Bachelor's Degree.
Complete six for a USED Master's, or all
twelve for a USED Ph.D. (For a limited
time, we offer special discounts to already USED party animals.)
And, our diplomas are so beautiful
you'll want to display all of them in
your party room. So send in your
money ($5,000 per class) to:
USED VaporTraining
1001 Federal Penn Way
Lompoc, CA 93400
FINE PRINT:

Include payment in small

bills or other untraceable funds only. Foreign
funds O.K. from countries with which the u.s. has
no extradition treaty. We make no warrantee on
usability of USED information or on your ability
to understand it. From time to time we may actually ship USED products; such an accident in no
way requires us to ship a product to any other
purchasers.

FINER PRINT:

If you can read this,

you're ready for our new course, Squinting Without Eyestrain.

•••
MICRO CORNUCOPIA, #50, Nov-Dec, 1989

65

Generating zao Controller Code
On An AT Clone
By Laine Stump
% Redhouse Press

Merkez PK 142
34432Sirkeci
Istanbul, Turkey

Laine finds that his fancy 18 MHz 80286 machine doesn't generate 280 code. Herein he talks
about some alternatives to buying a cross assembler.
(And he talks about Turkey, and character sets,
and .... )
remember it as vividly as last night's dinner.
The long talks about why I was going off
alone. The last few moments of being together, trying to tie up all those loose ends that
you never think about until it's time to go. The
final, tearful farewell as I headed off across the
ocean and into the future, not knowing when
or if we would see each other again.
Yes, I have missed my Big Board. In the four
years since I left it sitting dejectedly in the xray tube box in my brother's garage, I can't
count the number of times I wished I had this
or that program. The stack of 80 or so 8" single
density CP 1M floppies is stashed in the closet
in Woodinville, Washington. From time to time
I have even considered sending for myoid
companion. ("I won't work for you unless you
buy a first class seat for my CP 1M machine.")
But the desire to have a CP1M machine has
faded with the passage of time. After all, I do
all my work on MS-DOS and XENIX these
days. And I definitely don't have a shortage of
programming tools anymore (C, C++, Modula,
Pascal, MASM, CodeView, Zortech Debugger,
numerous database and display libraries,
countless editors ... ).

I

Turking It Up
After arriving in Turkey in 1985, I saw the
first hints of a niche market that lately has been
the source of most of my income. It has to do
with the six characters in the Turkish alphabet
which don't appear in either the IBM PC
Graphics character set or in any ISO or ANSI
character set. These characters are simply normal characters with the addition of an accent
(like 0 or C;).
When computers first arrived in Turkey,

66

people were so glad just to have computers
that they ignored the missing accents. This
made computerized bank statements look quite
juvenile (half the words were misspelled). That,
they were told, was the price they paid for
computerizing.
Around the time I arrived here, things
started to get better. A few companies figured
out how to change the character generator
EPROMs on their video cards and write a TSR
that changed the keyboard mapping.
Suddenly everybody had to have Turkish.
"Does it do Turkish?" became such a common
question that most companies began listing
"Turkish EPROM" as a feature of their equipment.
These days, the first unit of a new model
printer or video card goes straight to the "R &
E" (Reverse Engineering) department to figure
out where the character font is, how it's organized, and how to install the Turkish characters.
The Process
Lately I have been acting as the R & E department for several companies in Istanbul and
Ankara. To aid me in this work, I have written
(actually, "caused to evolve" is a better term) a
program called BITED, a sort of visual version
of DEBUG.
When I'm converting a machine, I usually
search around in the machine's EPROM with
BITED until I see something that looks like
character bitmaps. Then I massage the display
format a bit until it looks understandable. I replace the original characters with the Turkish
characters and burn a new EPROM.
Nowhere in the process do I ever need to
pay any attention to what processor is in the
machine, or worry about any assembly language. I'm just modifying data.
For example, most of today's dot matrix
printers use an NEC integrated 8-bit MPU chip
called the uPD78C10. I have Turkified probably
ten different printers which use this chip. Although I have a data book for the uPD78C10,
I've never needed to look at it.

MICRO CORNUCOPIA, #50, Nov-Dec, 1989

---.--~------------------

Character Set Standards
All the equipment that I Turkify
plugs into IBM compatible micros. Almost all equipment that plugs into IBM
compatible micros supports the IBM PC
Graphics character set (which includes
international (accented) characters at the
codes between 80h and A7h).
It happens that the Turkish standard
for this character set puts the special
Turkish characters in place of already
existing characters not used in Turkish.
There is already a bitmap corresponding to the Turkish character code. When
the printer receives that code, it knows
it should display the bitmap.
A Bird Of A Different Feather
I recently had to deal with something slightly different. I was adding
Turkish to the display and keyboard of
the Olivetti WS-685 terminal (a private
label of an Ampex product), which is a
clone of a DEC VT-220 terminal.
The VT-220 (and, hence, the WS-685)
uses an ANSI character set instead of
the IBM PC Graphics set. This character
set contains more international characters than the IBM set, but they are in a
different range (AOh - FEh). The codes
from 80h to 9Fh are used as control
commands (similar to the familiar
ASCII codes between OOh and 1Fh).
There were plenty of empty spaces
in this ANSI set to add Turkish characters without displacing existing characters. But after I added them to the bitmap, the terminal refused to display
them. That meant I needed to dig into
the control program in the terminal's
EPROM.
Luckily, the WS-685 is based on the
Z80 processor. ("AHA!" you say. "Now
I know why you babbled on about your
Big Board!") Unluckily, I have absolutely no Z80 development tools that
run under DOS. A quick search through
my list of acquaintances came up with
zero who had a Z80-based CP 1M machine.
After searching through four or five
dusty boxes full of books, I found my
well-thumbed Mostek Z80 Reference
Manual (from the days of EE 325) and
began to disassemble by hand. This disassembling led me to a table with one
byte for each character code, telling
what action to take with the code. I
changed the table and, viola, it worked.
Capitalizing
Now that I could display Turkish, it
was time to modify the keyboard so I

could type Turkish. I searched through
a dump of the program EPROM until I
saw the familiar "QWERTY" (strangely,
only in upper case). I changed a few
bytes.
After burning a new EPROM, I could
type Turkish, but it always came out in
upper case. Another search through the
EPROM revealed no lower case table for
the keyboard. That must mean that
there is a tolowerO subroutine somewhere that is called when shift or caps
lock isn't down. Back to the Z80 reference and the notebook scratched full of
ones and zeros ....
After some time, I had managed to
deduce my way into the tolowerO subroutine. Assuming that tolowerO would
be entered with the character in the A
register, and a compare would be done
with the upper and lower limits of the
capital letters, I hand assembled those
few instructions and searched for them
with SYMDEB.
Amazingly, I found them. (Lucky for
me, since the program EPROM is
32Kbytes and it's full! I think I'd rather
eat moss than try disassembling 32K of
Z80 code by hand .... ) I modified
tolowerO for the special cases of the
Turkish characters. The new EPROM
worked, and I was done (for the moment).
Never Again
This whole experience started me
thinking again about my Big Board. Just
think if it had been here, sitting next to
my X24. I could have easily finished the
job in one-fourth the time (it took me
two days). What about next time?
Surely there will be another terminal
based on the Z80 that needs to be
Turkified.
I thought again how my Big Board
uses 8" diskettes. I remembered that,
with drives, it weighs something
slightly less than a 1963 VW Beetle. I realized that, no matter how much loving
care we put into its construction, it almost surely wouldn't survive the bashings it would receive on a flight from
Seattle to Istanbul.
A Solution
Then I thought of something else.
What about that little Micro Solutions
Z80 Coprocessor card that Emerald Microware is selling? That doesn't even
weigh as much as the left front fender
of a '63 Beetle. Besides, it's faster than
my Big Board (probably faster than a
'63 Beetle, too). And it will eliminate all

the problems of transferring data between two incompatible machines.
A few fax messages later, I had a Z80
coprocessor card and U niDOS winging
my way. Ten days later I got the note
declaring that it was in customs. I
should come down to the docks and
find out which body parts they wanted
to secure its release.
(Don't ask me why the airmail customs office is on the waterfront. Probably for the same reason it took them
seven days to notify me that I -had an
Overnight Express Mail package waiting for me.)
I hiked down the hill from my perch
in Cihangir, overlooking the Bosphorus,
and walked the short way to the Customs Post Office.
Luckily, while waiting in line for the
third time to get a piece of paper
stamped, I ran into a familiar customs
official. He'd been around a few weeks
before when I came down to pick up a
suspicious looking package from PC
Tech. He remembered me (actually, he
remembered I had promised to look for
an American wife for him) and mentioned to the agent clearing my package
that I wasn't such a bad kid.
"Look here!," said the agent, pointing at the line on my paper that said
"Duty to be Paid." "You should be paying duty on this, but I'm not charging
you because you can speak Turkish."
(So few foreigners take the time to learn
Turkish that anyone who can utter anything resembling a complete sentence
impresses them.) I thanked him,
grabbed my new toy, and left.
Micro Solutions Z80 Coprocessor
The Micro Solutions Z80 Coprocessor
card is a half-length card that can plug
into any empty slot on a PC or AT compatible. The card contains a Z80H (8
MHz), 64K of RAM (8 x 4164), and a
few TTL glue chips. Other than one
address jumper used to set the location
of the Z80 <-> 8086 communications
port, there is nothing about the card
that needs mentioning. It's small and
cute; you plug it in and forget about it.
Included with the Coprocessor card
are two pieces of software: UniDOS and
UniForm. UniDOS is a TSR program
that enables you to run any CP IM-80
program on a PC with the Z80 Coprocessor installed. UniForm is a combination device driver and TSR that allows reading, writing, and formatting of
dozens of different CP 1M format diskettes in your PC's drives.
MICRO CORNUCOPIA, #50, Nov-Dec, 1989

67

UniDOS
UniDOS is the software interface
which manages communication and
coordination between the Z80 and the
8086. After installation, UniDOS runs
CP 1M programs while making itself almost completely invisible to the user. It
accomplishes this by trapping all DOS
calls to execute a program and checking
if the program you're requesting is a
Z80 CP1M program. If so, it loads the
program into the Coprocessor memory
and starts up the Z80.
While the CP IM-80 program is running, UniDOS also handles all I/O requests, translating display, keyboard,
disk, and printer commands from
CP1M to DOS. It handles both BOOS
and BIOS requests properly, even translating some of the important fields in
FCBs (file control blocks) for those programs that make use of the information.
UniDOS decides a program is
CP IM-80 if one of the following is true:
the file has a .COM extension and is on
a CP1M format disk (accessed by UniForm); the file has a .COM extension
and is in one of the directories specified
by the "CPMDIR" command; or the file
has an extension of .CPM.

68000
SK*DOS - A 68000/68020 DOS containing
everything you expect in a DOS - on-line help.
multiple directories, floppy and hard disk support, RAM disk and/or disk cache, I/O
redirection, and more. Supplied with editor,
assembler, Basic, powerful utilities. Supported
by Users' Group and BBS. Software available
from other vendors includes C compiler,
Basic, editors, disassemblers, cross-assemblers,

text

fonnatter,

communications

programs, etc. Priced at $165 with configura-

CP/M Compatibility
UniDOS seemed near perfect in its
emulation of CP1M. I didn't encounter
problems with any of the CP1M programs I ran (including ZSID, DDT,
ZZSOURCE, Turbo Pascal 2.0, M80,
LBO, VEDIT, EXPRESS), although I
avoided some programs on purpose.
UniDOS has one problem w~th programs that do direct I/O (e.g.,
MODEM730). There are provisions for
sending hardware I/O requests to the
8086, though. These programs could be
patched to make these requests
(MODEM730 must be patched for each
different type of machine anyway).
Both CP1M and DOS programs can
access both CP1M and DOS diskettes. I
even ran DU77 (a CP1M disk sector editor) to look at MSDOS disks (floppy and
hard) and it worked perfectly. UniDOS
even cooked up some disk parameters
for DU to display (number of tracks,
sectors, allocation groups, etc.).
Integration of CP/M and MS-DOS
I also became curious about how
well UniDOS integrates the running of
CP/M programs in with MS-DOS. To
test this, I tried running CP 1M programs from within other programs (Le.,
somewhere else than the DOS prompt).
First I went into XTREE and told it to
execute a CP 1M program. It worked
perfectly (although only if it was a
CP1M .COM file in a directory marked
by the CPMDIR command). Then I
went into EXPRESS and gave a command to execute an external CP1M
command. This also worked.
About the only thing you must avoid
is losing track of which .COM files are
MS-DOS and which are CP/M. Don't
mix them together. Either keep all the
CP 1M programs in their own directory
and mark it with CPMDIR, or rename
all CP1M .COM files to .CPM the second you copy them onto your hard
drive.

tion kit, less if already configured for your
system.
HARDWARE - 68xxx systems

Mt. Kisco NY 10549
(914) 241-0287/ Fax (914) 241-8607
Reader Service Number 40

UniForm
UniForm is a program that creates a
new virtual disk drive. This makes a
CP1M diskette inserted in your floppy
drive appear to DOS programs as a
DOS diskette. Uniform version 2.13
(data version 1.12) contains 204 different
diskette formats from ABC to Zorba, including Kaypro (and Pro-8) and Morrow. Most are CP 1M formats, although
there are a few strange MS-DOS formats, such as 96 tpi DEC Rainbow.
I expected UniForm would only

68 MICRO CORNUCOPIA, #50, Nov-Dec, 1989

---------------

allow me to copy to and from CP 1M
diskettes with special, internal commands. I was favorably surprised when
I discovered that the "Uniform Disk"
works with just about any DOS command. Not only can I use COPY, DIR,
and ERASE, but I can also use XTREE,
Brief, Zortech C++, Turbo Pascal, or any
other program.
People using the same word processing program on incompatible systems and sharing files can just edit the
file right there on the floppy diskette;
no need to transfer it first. Again, Micro_
Solutions has integrated their software
into DOS almost seamlessly.
The Seams
A few seams appear in other areas,
though. My first complaint is that UniForm doesn't support CP1M user areas.
All files come up as user o. This doesn't
seem to be much of a problem (all the
files are still there) until you have two
files in different user areas with the
same name. Although I haven't tried
this, the UniForm manual states that
"unpredictable results may occur."
My second complaint is that they did
not include the formats for Slicer diskettes. That would be okay, except there
is no documentation on adding your
own formats to the UniForm data file.
I remember getting a letter from a
Micro C reader a while back telling me
how to do this, but it has become impossibly lost in my famous cardboard
box file system. Until I find it, I just
have to live without all those programs
I carefully packed onto 788K Slicer diskettes. (I deported the Slicer two years
ago for lack of proper documentation.)
Something slightly related to this: it
would be wonderful if UniForm would
attempt to narrow down the drive type
selections for me. It could look at the
diskette and throw out all formats that
didn't match the diskette's physical format (e.g., only display disk types that
are 1024 bytes per sector, double sided).
I have some unlabeled disks, and it
takes a long time to discover what format they are by trial and error.
DOS 4.0 Incompatibility
My last complaint about UniForm is
that it doesn't work with DOS 4.0. The
resident part of UniForm is in a device
driver. When I try to boot DOS 4.0 with
UniForm, the system locks as soon as it
loads UNIFORM.5YS.
I have two versions of UniDOS, the
Coprocessor version and the Interpreter

version (discussed below). The Coprocessor version (1.25) locks up under
DOS 4.0, while the Interpreter version
(1.11) runs just fine.
Fortunately I repartitioned my hard
drive recently to make the DOS partition less than 32 Mbytes (making space
for XENIX). Because of this, I can still
read the drive with DOS 3.3 (which is
compatible with UniForm). If you use
DOS 4.0 for the large drive partitions,
though, you'll have to use UniForm and
UniDOS with a floppy-only system.
These problems are just slight annoyances. Mostly I am quite impressed
with UniForm and UniDOS.
Interpreter Version Of UniDOS
The version of UniDOS I have been
talking about is specially tailored to
work with the Z80 Coprocessor card.
There is another version, though, that
uses software to interpret the Z80 machine code. I tried this version and was
mildly surprised.
Memory dumps with DDT scrolled
past the screen at nearly the same speed
as SYMDEB. VEDIT and EXPRESS even
edited text at a reasonable speed (except
wordwrap). Very acceptable. ZZSOURCE did start to bog down a bit
when its symbol table got large, but it
was still workable.
Of course, I'm running a 12 MHz, 0
wait state 286. On an 8 MHz 8088, it
might be a dog. However, the interpreter version has a mode that runs 8080 (a
subset of Z80) programs on a V20 chip.
Although not all programs contain only
8080 instructions, the ones that do will
run just as fast on the V20 as on the Coprocessor board.
You may think now that you should
forget about the Coprocessor card and
get the interpreter version of UniDOS. I
suggest thinking a bit more. The Coprocessor board is $169 and includes
UniDOS and UniForm. The price of the
Interpreter UniDOS with UniForm is
$135 (including a V20 chip). Unless you
need that slot for something else, I think
it's worthwhile to spend $34 more and
get the Coprocessor board.
Note, however, that the UniDOS included with the Coprocessor board does
not support the interpreter or the V20
mode.
Another Suggestion
Don't even think of getting UniDOS
without UniForm, although the opposite would be useful if you just
needed to exchange data files. UniDOS

would have been worthless to me if I
hadn't been able to read the programs
from the pile of Kaypro disks I've
hoarded these last four years.
Related Products
Micro Solutions sells several other interface cards for use with UniForm.
These cards allow you to read and write
diskettes for Apple II, MacIntosh, North
Star hard sector, and most 8" single and
double sided formats.
Why?
You may now be wondering why
"Laine the DOS Jock" has spent so
much time talking about a "mere Z80."
What good is it to you? Why should
you waste your money on it?
If you only work with DOS, and
never do any work with embedded controllers or anything else that might contain a Z80, UniDOS is slightly less than
worthless. You may as well spend the
money on flea collars for your armadillos.
If you're doing development work
on anything that has a Z80, you can
save yourself a considerable sum of
money by buying the Z80 Coprocessor.
Consider that a Z80 cross assembler
running under DOS can easily cost
$500. Alternatively, you can pay $169
for the Z80 card and UniDOS and buy
the Z80 Macro Assembler from Micro C
(disk K25) for $6 (plus $2 S/H to foreign countries). I've even seen copies of
CP 1M, complete with all utilities, for
$25.
Of course, if you're running something like a publishing house (or a magazine) where you get in writers' work
on anything from papyrus to 112" mag
tape, UniForm could do wonders for
your sanity.
All you newcomers to the Micro C
clan could use the Z80 Coprocessor to
see for yourselves what it was like in
the old days.

Conclusion
I have several other "Turkifization"
projects waiting. I'm sure that at least
one of the machines in question will
have a Z80 processor. When it's time to
work on that machine, I'll be ready.
Emerald Microware
P.O. Box 1726
Beaverton, OR 97075
(503) 641-8088

•••

Rack &Desk
PC/AT Chassis
Integrand's new Chassis/System is not
another IBM mechanical and electrical
clone. An entirely fresh packaging design
approach has been taken using modular
construction. At present, over 40 optional
stock modules allow you to customize our
standard chassis to nearly any requirement.
Integrand offers high quality, advanced
design hardware along with applications
and technical support all at prices competitive with imports. Why settle for less?

Accepts PC, XT, AT Motherboards
and Passive Backplanes
Doesn't Look Like IBM
Rugged, Modular Construction
Excellent Air Flow & Cooling
Optional Card Cage Fan
Designed to meet FCC
204 Watt Supply, UL Recognized
145W & 85Walso available
Reasonably Priced

-_

...... -.
.......= -- -- ........
_.

ii=W=~6r~-=-"

-.~.

:: ':!

_

ii;;=:;'

~~~ ~ ~~

Call or write for descriptive brochure and prices:
8620 Roosevelt Ave. • Visalia, CA 93291

209/651-1203

TELEX 5106012830 (INTEGRAND UD)
FAX 209/651-1353

We accept Bank AmericardlVlSA and MasterCard
IBM, PC, XT, AT trademarks of International Business Machines.
Drives and computer boards not included.

Reader Service Number 22

MICRO CORNUCOPIA, #50, Nov-Dec, 1989

69

The Mercenaries:
Silicon Valley Contractors
By Todd Hoff
1075 W. Remington Dr.
Sunnyvale, CA 94087
(408) 730-8410

Want to turn your C experience into $25 to
$125 per hour? Want to work 80+ hours a week?
Just print up some business cards and catch the
next flight to Silicon Valley. Of course, there are a
few things that money won't buy, but you'll find
out about those after you arrive.
've become something my mama warned me
against-a Silicon Valley contractor, a software mercenary. Constantly chased by headhunters, scurrying from company to company, I
lead a dangerous but interesting life in the Valley.
Silicon Valley, everyone's heard of it. Many
dream of coming here. What will you find
when you arrive? What's it like to be a contractor in the fabled Valley? Read on.
Four years ago I packed my bags, leaving
my beautiful but job-starved emerald isle of
Eugene, Oregon, for the techy promised landSilicon Valley. At the time, all I knew about Silicon Valley lay printed in the San Jose Mercury
News help wanted section; literally page after
page of engineering jobs stared back at me,
beckoning me with opportunity, challenging
me to come. So I did.
Here I, along with the thousands of other
immigrants from Russia, India, Vietnam,
Taiwan, Sweden, Germany, Ohio, and Texas,
found both opportunity and challenge in this
former land of oak trees, apricot orchards, and
old tractors.

I

Getting To Know The Territory
As a mercenary, the first thing you want to
know is the lay of the land. Every place in this
area is specified in relation to the San Francisco
Bay. Silicon Valley, although existing on no
map, is the little kingdom on the western shore
of the Bay, usually referred to as the South Bay.
East Bay lies to the east. This area is expanding exponentially and includes Bezerkly (Berkeley of BSD fame), Oakland, and Concord. The
North Bay includes the politically correct cities
of Marin and Sausalito. Last, but certainly not

70

MICRO CORNUCOPIA, #50, Nov-Dec, 1989

least, is the Peninsula, home of The City, northern California's favorite son, San Francisco.
The whole area is one frenetic job producing
machine. Producing, as in war, perfect conditions for the software mercenary. Contracting
in the Valley is perhaps unlike contracting in
any other place in the world.
There's a tangible energy in the Valley, flowing from the people and companies continuously pummelling and pushing at technology's
frontiers. There's a fever here, causing normal
people to work 80 hour weeks for months on
end. Always omnipresent, like a golden carrot,
lies the hope that your stock options will become more valuable than your toilet paper (although never as comfortable).
Power Brokers
Next, the veteran mercenary must know the
major players. Everybody's here. All the biggest
companies and all the wanna-be-biggest companies have active development staffs in the
Valley.
Opportunities are nearly endless-during
good times, of course. The mercenary can take
advantage of strained super power relations
(DEC, IBM, Amdahl), or border skirmishes
(SUN, MIPS, Apple), or foreign powers (NEC,
Sony), or countless other third world countries
(start ups).
Rarely, however, do you contact a client
directly (as you would if you were an independent contractor). Normally, introductions
are made through an intermediary (job shop).
Job shops are like floating countries, hiring the
mercenary for an hourly fee, finding a needy
company, and then reselling your services at a
higher rate. Sometimes a considerably higher
rate.
Independent contracting is good if you can
get it. You get to keep the full fee and your
hours are very flexible. But (and there are lots
of buts to independent contracting), the marketing, the problems of running a small business,
and the responsibilities to clients often push
folks into job shops.
"Tom Jones," a local independent contractor

As a mercenary,
the first thing you
want to know is the
lay of the land ... The
whole area is one
frenetic job
producing machine.
who wishes to remain anonymous, got
in via a career switch. "I started 15
years ago," Tom says, "with no contacts, no nothing. Like most independents, I got all my jobs through referrals. It was tough at first, but over
the years I've built a steady and loyal
clientele."
Now Tom is in the envious position
of being picky. "1 look for a synergy
when accepting clients," says Tom.
"I've upped my value by specializing in
one area. I look for clients who fit into
my specialty so I can make my jobs
work together. One drawback is that
I'm on call 24 hours a day. If there's a
problem, I have to fix it and fast because many of my programs perform
vital functions."
For those potential mercenaries who
don't want to build clientele, but still
want to play, job shops offer attractive
rates, some benefits, and extreme ease
of use. Job shops do all your marketing.
They contact all the clients. They set up
the interviews. They negotiate rates. All
you have to do is interview ... and work.
"I have a few customers I've built relationships with," says Mark Lewis, a
local contractor with over ten years ex-

perience, "but I go primarily through
job shops. My long term goal is to become an independent contractor. The
longest I've been without a contract is
seven days, and another guy I know
was without a contract for a total of
three days in three years."
Tour Of Duty
"UNIX porting is popular," says
Anna Osborne, a local contractor. "If
you just mention porting you got it
made. Of course, everybody wants X
Windows.
Databases,
networking,
graphics, and surprisingly, firmware. I
was originally a compiler person, but
there weren't very many compiler jobs."
UNIX and C are hot. Almost any experience with either will get your foot
in the door. I knew someone, don't
quote me, who just read a UNIX
manual, had programmed in C on MSDOS, and got a UNIX job. Perhaps not
completely ethical, but he was sure he
could handle it-and he did. A mercenary must be honest enough about his
or her abilities to make these judgments.
Not surprisingly, this area offers
many contracts for the Macintosh if
you're comfortable with MPW or C.

Also in demand are testing and technical support positions. It's difficult to
find permanent people who'll take these
dirty jobs so companies often hand
them out to mercenaries.
The Timid Need Not Apply
No matter what the job, a mercenary
position is not for the timid. Many
people need the patronage of a large
company. Why would anybody leave
the comfort and security of a large company for the fetid jungles and night
marches of contracting? The answers
may surprise you.
Mark found contracting attractive for
having " ... more freedom, less responsibility, and more pay. The less responsibility aspect is something I think most
people don't consider. You have a project. You don't have to worry about the
long term implications of anything.
Working for a couple of start ups, I carried a lot of responsibility. I got tired of
worrying about it."
Anna left the fold of a large company because "after working at a company for a while, technology passes you
by. I was so caught up in the
bureaucracy, I wasn't free to do anyMICRO CORNUCOPIA, #50, Nov-Dec, 1989

71

thing. As an employee it doesn't look
good if you jump from company to
company. But as a contractor, you can
jump around and stay up to date on the
latest stuff."
For many, contracting is predestined.
The Valley's environment almost encourages you to become a contractor.
Very few people I know ever stay at a
job more than two or three years. Job
turnover in the Valley averages 50%
every two years. Explaining the process
Mark says, "I moved every two years,
anyway. It was never my intention.
That's just how it worked out. After
having six or seven jobs in ten years, I
decided to make it permanent."
War Is Hell
Risk is inherent in the mercenary's
work. The mercenary must always be
weary of surprise attacks. Tom has
many gruesome stories. "One guy I
know has worked for three companies
that closed down with no notice. At one
place, he showed up for work Monday
morning to find the doors locked."
Company loyalty-at least in the
Valley-is dead. Mercenaries merely
recognize the reality. "Many people I
know," says Anna, "say that once
they've learned all they can learn at
their company, they'll leave. Nobody
cares because the companies don't
care."
Lack of loyalty stems from the cycles
of innovation and obsolescence. On the
upward portion of the cycle, people are
worth more than gold, vital assets to be
treated royally. On the down side,
people are dust, liabilities that must be
exorcised from the ledgers. I've heard
that many companies turn to contractors for public relation reasons: firing
contractors doesn't make headlines.
Another problem for the mercenary
is getting paid, sometimes a battle.
"One of the beauties of working for a
job shop," Tom says, "is that you always get paid. I've never worked for
free, but it's been close. One tactic companies use for getting out of paying is
complaining about your work. No matter how detailed a spec you have, there
are always misunderstandings. Sometimes a client won't pay because 'I
didn't do what they wanted.' This usually means the company doesn't need
the software anymore so they don't
want to pay me for it."
Several times people have asked me
to work for free. Here's the deal: I work

72

MICRO CORNUCOPIA, #50, Nov-Dec, 1989

my butt off, day and night. I forego
even the semblance of a family life. For
what? For some stock options and promise of payment when the product sells
"to this long list of customers just begging for it."
Another deal used by start ups is to
pay up front for three months' work.
The contractor then works six months
assuming there's payment and bonus
ready when the product is done. If the
startup happens to go under, as many
do, you're out of luck. Although contractors are one of the first in line to be
paid from bankruptcy proceedings,
chances are you'll never see a cent.
Cleanup
Latrine duty is very common. Industry often brings in contractors to fix
poorly designed, badly implemented
projects. Somehow it never occurs to
management that they should pay for
the expensive people up front, not when
it's almost too late.
The "almost" means that contractors
are often seen as cannon fodder. Because a person is only a contractor,
asking them to work 7 days and 90
hours a week is okay. Oh well, mercenaries work for money, not glory.
Always remember: as a contractor
you are just meat satisfying a temporary
hunger. Eventually you will leave, expectedly or unexpectedly, but you will
leave.
As a mercenary you have no ties, no
loyalty. None is asked, none is offered.
For money, you give someone the right
any day, any time, to say good-bye.
Wages Of Sin
Software mercenaries, however, eat
well. As a beginning contractor, say
with 2-3 years solid technical experience, you could start at $35 per
hour. With a couple of years of contracting experience, you've proven
yourself so you can command $40-$50
per hour.
A medium level specialist, say in X
Windows, device drivers, kernel work,
or networking, can ask $50-$70 per
hour. For high level specialists, with lots
of pertinent experience, the sky's the
limit. I know several people who get
$100-$125 per hour and one who gets
$250. Granted, contracts at this level
may be shorter term-but who cares!
The Field Is Bloody
Lest you think these rates too high,

remember: Silicon Valley workers deserve both hazardous duty pay and
housing allowances. The Bay Area is
beautiful, but all is not well in Oz.
Dennis Hayes quotes some startling
statistics in his book, Behind the Silicon
Curtain. It's estimated 60% of high-tech
workers are seeing psychiatrists. This
area has more divorces than marriages.
In 1987, over $500 was spent on drugs
per man, woman, and child in San Jose,
although both Anna and Mark say they
don't see much drug use. Anna jokes,
"Do caffeine, sugar, and cigarettes
count as drugs?"
Also, Silicon Valley has more Superfund sites than any other area in the nation. And the hills become a little harder
to see every year.
Housing is atrocious. Only 9% of the
people in California can afford a house.
A house in Palo Alto, 1300 square feet
on Vs of an acre, sold recently for more
than $600,000. More reasonable areas
offer cheaper houses but tack on an
hour to your commute. By the year
2000, the state's average house is supposed to reach a cost of $470,000. The
average commute, now 45 minutes, is
projected to be 2 hours by 2010. Lovely.
People also forget the cost of little
things they take for granted at a company. Health insurance is expensive.
Retirement plans are nonexistent. And
all those· paid holidays for employees
are unpaid for mercenaries.
I hear you saying that as a mercenary you get all the benefits of being a
small business. Not so. New rules have
made it much more difficult for contractors to qualify as businesses. The mercenaries' mercenary-the IRS-now
takes a dim view of W-2 contractors
saying they are a business. And because
of IRS pressure, most job shops won't
1099 you anymore. You are, in effect, an
employee of the job shop. In reality, of
course, this is total BS.
Why Do They Keep On Keeping On?
When the dust has settled, the battle
ended, wounds bandaged, the mercenary moves on. Mark, Anna, and Tom
all say that they like contracting and
won't stop. To them the advantages
outweigh the perils. Most people
wouldn't agree. But as Anna says,
"Contractors are obsessed with independence. Disillusioned with large business, they want to do it all themselves."

•••

Continuing

AROUND THE BEND

Coming Up
The whole idea of picking topics for issues happens to be a
bit controversial around here.
"Don't set topics, let readers be surprised."
"Writers will see the topics and assume we're not interested
in anything else."
"It locks us in for a whole year."
It's also nice, however, to have something to work on. Some
.
direction. So here goes.
• January-Embedded Systems
• March-Object Oriented Programming
• May-Micro Controllers
• July-Operating Systems
• September-Data Collection
• November-Graphics
You'll notice that the major topics alternate between hardware and software. I'd also considered running contrasting
subjects, such as running Exposed Systems following the issue
on Embedded Systems. Running Micro Supporters after the
issue on Micro Controllers. Running Nonoperating Systems
(should be a great issue) after Operating Systems. And running
Data Dispersal after Data Collection. (By this time you should
have a pretty graphic idea how we pick the special subjects.)
Port Albemi SOG
You can take the SaG out of the country, but you can't take
the country out of SaG. Port Alberni, Canada, was definitely
country and the event was definitely SOG.
A solid (even solider after the salmon barbeque) 50 SOGgy
families showed up at the local college and made it an event
that reminded me of the very early SOGs. Good companionship, good food, good weather, good camping (and Bed &
Breakfasting), and great scenery. The local community went
out of its way to make us feel welcome, and our hosts (David
Stern and Randy Young) had a great time despite their initial
nervousness. (Neither had even attended a SOG before.)
The only down sides of the whole event were customs and
gasoline prices. Don Jindra and wife (and sons) drove all the
way from Denton, Texas, to show off their $25 network package. (It really works.)
Canadian customs wanted $1,200 duty for his three demo
computers. No $1,200, no entry. After turning around and
heading back toward Texas (I understand he first exchanged a
few words with the customs officer-something about backward countries remaining backward because of petty officials),
he decided to try another entry point.
Under the eagle eye of a new customs agent, they dug out
the computers and again explained why they were taking
them into Canada. This time the officer wished them luck and
let them through.
This was just one of their trials. Their first Hertz van broke
down two hours from home. Then their keys got locked in the
second van.
Fortunately it happened during the barbeque and we had a
handy hardware engineer and a handy hardware debugge~
(often mistaken for a coat hangar). Made me wonder how
many software folks it would have taken to unlock the vanassuming of course they couldn't just disassemble it.

Gunnison SOG
If the Port Alberni SaG featured food and scenery, the
Gunnison SaG featured high mountain thunderstorms and
energy. Human energy. Check out Karl's write up of this fine
SaG and you'll understand what I'm talking about. Thanks for
a great SaG, Scott and Maria.
On Your Own
I led a group discussion at the BC SOG about my favorite
subject, being on your own. We shared tales of failures: unpopular T-shirts, unmarketed hardware, and a dishonest distributor. And successes: the $25 network (again), a hospital
package, and a kit robot.
When I suggested the possibility of turning a product over
to marketing folks, there were hisses from the audience. (I
might have mentioned used cars in the same breath.)
However, after the dinner, David Stern took my arm and
suggested that I (we) might be a bit mistaken.
"Technical types design the product and then they look for
a market. Marketing types find the market first. Then they see
if someone can build the product."
He's right.
We can all point to situations where the design came first
and the market followed: CP 1M, Apple, Byte, VisiCalc, C,
Osborne. (Osborne? That was the company which created the
market for Kaypros.)
However, the computer marketplace has become a lot more
mature and a lot bigger. Owning a small niche can be as lucrative as owning the whole shootin' match six years ago. You
just need a lot sharper aim to hit the niche. That's where the

Interested Folks at Robotics Demonstration, Port Alberni
marketing type, a real marketing type, can make himself invaluable.
Now, finding a real, knowledgeable marketing person and
making sense of the information he generates ... well, that's
another story.
You And Micro C?
Speaking of marketing, it's definitely time to expand Micro
C. We should be exposing ourselves to more people, contacting more potential advertisers, even possibly gqing
monthly. (Did I really say that?)
MICRO CORNUCOPIA, #50, Nov-Dec, 1989 73

· So, we're looking for a partner. A go-for-it person or group
who wants to invest time, money, ideas, and energy in making
Micro C the significant player it can be. We're ready to take a
look at focus, market, everything. (The only things that have
to stay are the light style, the informality, the readability, and
the editorial. Not necessarily in that order.)
If you feel you and Micro C might be a good fit and you're
willing to take a very significant (and demanding) role in a
more and more significant magazine, then let's talk (503-3825060). (Bend is a wonderful place to raise a family.)
A Surplus Idea
One of the best suggestions to come out of this year's regional SaGs so far: "Have readers send in information about
their sources for surplus parts. Then print the list in Micro c."
Wow! What an idea. Part of my startup time on a new project gets spent locating sources of parts. As difficult as it is
finding normal retail sources, it's nearly impossible to find
surplus dealers who have what I need. But, surplus prices can
make the search worthwhile.
I remember purchasing 25 lb. grab boxes at the Tektronix
surplus store. They wouldn't let me open them on the premises, so I didn't have the slightest idea what was inside (usually just a tangle of small parts swept off the floor at a board
assembly area).
On occasion I found brand new power cords, reed relays,
transformers, ICs in their original tubes, used soldering sta-

Mandelbrot Explorer 3.0
Fantastic fractal grapnzcs on 16-color EGAjVGA to 800x600.
Magnifies up to 16.5 trillion times. Stop and start at wil~ save and
retrieve, collage, full control over color boundaries, "zoom box, "
display ofperiodic orbits, auto-backup, all optimizations for speed
including pi,'tel interpolation and 386 integer support. Comes with
seven ready-made pictures for immediate gratification.

$30
Peter Garrison
1613 Altivo Way
Los Angeles, CA 90026
2136651397
When ordering please specify EGA/VGA and disk format
Overseas orders please add $4
Reader Service Number 112

74 MICRO CORNUCOPIA, #50, Nov-Dec, 1989

tions, and, well, other wonderful surprises. As for the floor
sweepings, I'd hate to guess how many hours I spent sorting
resistors and capacitors. At $7.50 per box, I was hooked.
Like the Tektronix outlet, some surplus stores are connected with corporations. Though many are for employees
only, the rest are quite happy to sell to the public.
Then there are the independent outlets. They often purchase overstock by the pound (often for the value of the silver,
gold, or tin). Then these shops try to sell as much as they can
to hobbyists and start-ups before stripping the rest of their
precious metals. Many of these stores haven't the slightest idea
what it is they are selling. If it's big or impressive, they ask
more. After something has blocked an aisle for six months,
they ask less.
Shopping in person is by far the most interesting (and the
safest). Many stores have a plethora of high-tech orphans.
Since orphans almost never show up in catalogs, they're only
available to browsers. They're also often just what you need
(though you wouldn't have realized it if you hadn't seen
them).
Anyway, if you're a junk aficionado, or just have regular
dungeons where you stir up dust with the buddies on Saturdays, send us the scoop on them. (Just include those that deal
with the public.) Include:
1) Name, address, phone number;
2) Person to talk to;
3) Days/hours they're open;
4) Whether they sell by mail/phone, to walk-in customers,
or both;
5) Whether they have a catalog. What does it cost?
6) Their specialty (if they have one);
7) Whether they also sell non-surplus parts. (Give a general
description);
8) Whether they have a return policy. What is it?
9) Prices (high/low /variable/wildly variable/ chaotic). You
might mention two or three examples of products and prices;
10) Include a paragraph or two about how they are to deal
with, how knowledgeable they are about their stock, amount
of stock. Is it mostly junk or prime, have you had trouble with
them ... ?
11) Include any additional information you think is germane to Micro C readers.
If there's a shop you've just heard about but haven't tried,
send the information you have and we'll try to get in contact
with them.
Now, there's a reward for you in this. You receive a free
Micro C issue disk (or Micro C back issue) for each firm you
report on. (The disks and issues might not be surplus, but
their price is right.)
Pascal Book
I don't use many books when I'm programming-for a
long while just Borland's Turbo Pascal reference manual.
However, not too long ago I found myself struggling with a
sticky little graphics problem. It was so bad that I dug through
all my Pascal books. Nothing, until I found Complete Turbo Pascal, Third edition.
How Jeff Duntemann has time to put this much effort into
a book while being editor of... (well, it was Turbo Technix)

escapes me. But he's done it. He's thrown in lots of sample
routines, including, fortunately, copious comments on Borland's Graphics Interface. (He also does mouse drivers, inline
and outline assembly language, low level system hooks, and
lots more.)
It's a readable book and it has a good index. Plus, Duntemann isn't afraid to talk straight. I get a strong feeling that
Borland doesn't print anything in its manuals that might
sound like a bug. So I turn to Duntemann at least as often as I
tum to Borland.
Complete Turbo Pascal
Third Edition (Covers 5.0)
822 pages $24.95
By Jeff Duntemann
Scott Foresman and Company
ISBN 0-673-38355-5
Speaking Of Books
One of the most famous and discerning places to get technical books, walk-in or mail order, is Computer Literacy.
They're famous because they're famous. They're discerning
because they've carried Micro C since around 2 BC (2 years
Before the fancy Covers).
The New York Times, another significant publication (though
they still don't have fancy covers) mentioned Computer Liter-

acy in its July 25 issue:
"Engineers on their way back to their cubicles at AT&T or
Xerox Corporation can stop at another valley landmark, the
Computer Literacy Bookstore, where the magazine section includes copies of Micro Cornucopia and HyperAge."
Computer Literacy will sell you just about everything
you'll need for those all-nighters, except the Jolt. So if it's technical, has pages, and has covers (not blankets), they probably
have it. They say they ship within one day (national and international), they track down obscure books for no extra charge,
and they'll be glad to put you on the mailing list for their free
newsletter.
I usually see Dan Doernberg, founder of Computer Literacy, when I attend the' West Coast Computer Faire, and I've
always enjoyed talking to him. He's a great source if you're
looking for the latest book on hi-tech arcane and obscure.
Computer Literacy Bookshop
520 Lawrence Expressway
Sunnyvale, CA 94086
(408) 730-9955
Ventura 2.0
Most of you have watched us fumble our way into desktop
publishing. Despite the tribulation (which always occurs at
deadline), I've found that desktop is as much an improvement

cYFh~C,R\der
The C Programmer's Companion
Now Available for OS/2 II!
CCSYM - C Symbol Compiler
• Analyzes ANSI C source code. MicrosofVTurbo extensions supported.
• Automatically generates separate commented function prototype files for
all global and local (static) functions.
• Log File lists all your symbol definitions with detailed usage statistics.
• Generates a "symbol database" which CCRIDER uses to quickly retrieve
ANY symbol definition in your application, no matter how large it is.
• Incremental compilation supports efficient database updates.

CCRIDER - POP-Up Symbol Lookup
• Pop-up utility which converts your own editor into a powerful hypertext
programming environment.
• Point at a symbol in your editor, then pop-up its definition in a window.
• One keystroke "Edit" command allows you to edit the definition in your
own editor, no matter which file or directory it was defined in.
• "Paste" command inserts the definition into your currently edited file.
• Supports multiple editing sessions under OS/2.

DOS Version $89

OS/2 Version $179

FREE
DEMO

Western Wares

Box C Norwood.
(303) 327-4898

Reader Service Number 169

co 81423

YOU WANT THE SOURCE1!
WELL HOW YOU CAN BAVE IT! The IIASTBR.FOL
DTS'SSEllBLER. (1ID86) vill create HASH coapatible
source code fro. program files (EXE or COK).
And the files are labeled and co •• ented so
they become USEABLE. KD86 is an interactive
disassembler with an easy to use,. vord
processor like interface (this is crucial for
the REAL progra.s you vant to disassemble).
With its built-in belp screens you
won't have to constantly refer to
the .anual either (although
there are valuable diSCUS-~
sions on the ins and outs
of disassembling vhich
you won't vant to miss).
1
f::;

t

-n.

c... .....

n'·

HD86 is a professionally
supported product and yet costs
no .. ore than "shareware". And of course, it's
not copy protected.
YBRSIOI 2 10& AVAILAlLKt
IID86

n

is om.Y $67.SO ($I.SO sQ)

+ tax

C.C" Software, 1907 Alvarado Ave., Walnut
Creek, CA 94596, (415) 939·8153
Reader Service Number 31

MICRO CORNUCOPIA, #50, Nov-Dec, 1989

75

over the old paste up procedures as word processing is over a
typewriter. I couldn't go back.
We've used Ventura Publisher from the beginning. Version
1.0 was buggy, sure, but with three different ways to do any
one thing, there was usually a work-around. As revisions
rolled in, we spent more and more time doing the work and
less and less time doing the around.
Now, with version 2.0 things seemed to take a giant step
backwards. The most consistent thing was inconsistency. An
article (chapter) that went together and saved perfectly might
be garbage when called up again. Or, we'd load a figure into a
frame and a nearby headline would get weird. Page numbers
changed into headlines, often refusing to change back.
Sometimes Carol could fix the problems. Sometimes she
couldn't. Either way, the next time the file was edited, there
might be a whole new set of problems.
I called Xerox.
The only thing the support person asked about was
memory. How much RAM? (640K.) Were we running TSRs?
(No.) Did we have at least 52 OK of free memory before running Ventura? (Definitely.)
I hadn't been too concerned about RAM because version
1.X was running precisely, though slowly, on the same machine (as an article got long or complex, the older version
would swap data between memory and disk).
Something about this new version was definitely not right.

ICs

PROMPT DELIVERY!!!

SAME DAY SHIPPING (USUALLY)

QUANTITY ONE PRICES SHOWN for SEPT. 3, 1989

DYNAMIC RAM
256Kx36
80 ns $400.00
1Mx9
70 ns 180.00
(2)
1Mx9
80 ns 135.00
256Kx9 100 ns
45.00
1 Mbit
1Mx1 100 ns
12.75
41256
256Kx1
60 ns
6.95
41256
256Kx1
80 ns
4.95
256Kx1 100 ns
3.75
41256
256Kx1 120 ns
3.40
41256
4464
64Kx4 120 ns
4.50
41264 (3) 64Kx4 120 ns
9.65
EPROM
128Kx8 200 ns $22.00
64Kx8 200 ns
9.50
32Kx8 150 ns
7.25
16Kx8 250 ns
4.50
STATIC RAM
62256p-10 32Kx8 100 ns $18.95
8Kx8 120 ns
5.50
6264p-12
6116AP-12 2Kx8 120 ns
4.50

SIMM
SIMM
SIMM
SIMM

I

(1)

Version 2.0 supports EMS memory. According to the
manual, you don't have to have EMS memory (unless you
want fancy hyphenation), but it supports it. So when Carol got
exasperated with this issue's 3-D article (page two became
totally strange the instant she loaded either of the two illustrations), I packed up her machine and headed for MicroSphere.
My hunch was that extra memory was more important
than Ventura was letting on. I suspected that overflowing
stacks or misaimed pointers were causing the problem.
"I want EMS, lots of EMS," I said as I dumped the dismembered machine onto their service bench. Fortunately RAM
prices have come down a bunch. Unfortunately, Howard, Ed,
and Allan were up to their ears in other work.
Ah well, I can stuff RAM and set dip switches with the
best. So I did. Five hours and six false starts later, I had added
1.5 meg of EMS. (The EMS board was very smart, by the way,
letting me configure its RAM as any combination of extended,
expanded (EMS), and main memory. In fact, for over an hour
it was a lot smarter than I was.)
The instant I got back to the office I cobbled up Carol's
monitor, keyboard, printer, fired up Ventura, selected "Desk"
(to get the version display), then pointed the mouse arrow to
the word "Ventura" and clicked. Up came the secret diagnostic window. (Kind of like a secret decoder ring, but useful.)
Sure enough, Ventura recognized 1.5 meg of EMS.
Then I loaded the troublesome 3-D article and looked at
page two. Wow! The page number displayed correctly, unruly
text from other pages had disappeared-the whole thing
worked. I tried another article, and another, and another ...
everything worked. Ain't desktop fun?
Longhorn SOG Reborn
After seeing Don and Kim Jindra at both the Canadian and
Colorado SaGs, I wasn't too surprised when I got a call from
Kim. What did surprise me was the subject. The Longhorn
SaG.
"We've got to do something more than the regular meeting
at the Info Mart. I got hold of Stuart, he's hard to reach, and
volunteered to take over the SaG arrangements. He said fine,
so I've got it."
It turns out she's lined up meeting space for SaG talks, a
barbeque, a place for two JoIt SIGs, T-shirts, and more. She's
arranging SaG sessions on Friday in Denton, Texas (25 miles
north of the Dallas/Ft. Worth Airport), then taking the group
to Dallas for Saturday's Info Mart meeting.
If there's any chance you can attend, or speak, or whatever,
get in touch with Kim right away. (Check the Longhorn SOG
information box in this issue.) I'll see you there.
Longhorn SOG-Oct.13-14
Kim Jindra
P.O. Drawer F
Denton, TX 76202

(817l?87)

o
Reader Service Number 37

76

MICRO CORNUCOPIA, #50, Nov-Dec, 1989

._-------------------_

... -

idL~~pson

ito--'& Publisher

Letters

\

continued from page 6

The Nature Of Radar
Regarding LIMBO's distance sensor
("Letters," Issue #49, p. 75): Whether
the intensity of reflected light, or a
radar signal, is inversely proportional to
the square or to the fourth power of distance depends on the nature of the reflecting target. If the reflection is from a
plane surface that reflects without scattering, the inverse square applies. If
scattering occurs at the target, inverse
square applies for both the forward and
the return paths, and the product is the
inverse fourth power, the radar equation.
LIMBO's received power from his
(her) own source as seen in a mirror
would be inverse square, but from a
white object would be inverse fourth
power. The polished ball bearing
beloved of telescope makers as a test
object will produce an inverse fourth
power response for LIMBO's sensor in
spite of the specular nature of the reflection, because it produces the scattering
that is the underlying reason for the inverse square law.
Not only the library's dusty tomes
on radar show the inverse fourth
power. The Second (1988) Edition of
Antennas, by Professor John D. Kraus of
Ohio State University, gives the radar
equation and explains the fourth power
of distance in the denominator. The
equation is alive and well, as good
today as the first time someone found
that doubling the transmitter power
didn't buy you much early warning
time. It also includes other factors, such
as the effective cross section of the target.
The inverse fourth power behaviour
was responsible for the effectiveness of
a very successful anti-submarine
measure during World War II. Submarines used to surface at night to run
their diesel engines and charge their
propulsion batteries. Maritime reconnaissance aircraft would search for
them with radar, and the subs used receivers on the radar frequency to warn
of their approach.
This was very effective, as the signal
arriving at the sub was detectable by its
receiver long before the reflected echo
from it was strong enough to appear on
the radar receiver in the aircraft. In fact,
the aircraft were detectable at such long
ranges that the subs would only sub-

INTRODUCING
merge when the signals indicated the
aircraft was getting close. This avoided
the loss of valuable battery charging
time when the aircraft could be a
hundred miles away.
To counter this countermeasure, the
airborne radars were fitted with attenuators in the transmitter output, in
the form of a vane that could be
cranked into a slot in the waveguide.
When a sub was first detected, with the
radar transmitter at full output, the aircraft would turn for a run at the submarine. The radar operator would crank
in the attenuator as they ran, reducing
the power steadily to keep the received
signal constant as the range decreased.
At the submarine, the receiver operator would hear the radar signal decreasing from the time the aircraft went into
kill mode, and assume that the aircraft
was going away. With the noise of the
sub's diesel to mask the sound of the
aircraft's engines, it was usually
possible to arrive over the sub before it
submerged.
The effectiveness of this system is apparent if you use the inverse square to
calculate the signal at the sub, and the
inverse fourth power to calculate the
signal at the aircraft, assuming a transmit power adjusted at all times for a
constant signal at the airborne radar receiver.
So be careful! Failure to appreciate
the inverse fourth power law in the
radar equation has been known to be
fatal!

~tude~
25 MHz 8-bit
ANALOG-TO-DIGITAL CONVERTER
Based on the TRW THC1068-1
hybrid flash converter, its high
signal-to-noise ratio yields excellent accuracy at the Nyquist
limit.
• 4 KB of cache SRAM or to host
as converted at DMA speed
• 110 or DMA data transfer
• 10 MHz full-power bandwidth
• 3.92 mV resolution
• 16 jumper selectable base
addresses
• Input unipolar or bipolar
• External clock and trigger inputs
• Software source code included

INTRODUCTORY PRICE

$299
ALSO AVAILABLE AS A KIT
FOR $99, INCLUDING:
• Printed Circuit board
• Software
• Manual &assembly instructions
(KITintroductoryprice includes PAL
and 4KB of high-speed SRAM)
Requires: PC compatible 1/2 length
8-bit expansion slot. DOS 2.11 or
greater. EGA, VGA or Hercules display needed for graphic representation of data.

John Innes
120 Macpherson Street
Cremorne, NSW 2090
Australia

Editor's note: All this leads me to a bit of
specular reflection. Placing an alien infrared
detector (for detecting alien infra reds , of
course) and a fairly substantial laser on
your robot might be the most effective way
to sink other maze contestants. (I knew
you'd get a charge out of that.)

Silicon Alley ~
P.O. BOX 59593
DEPT. MC-1112
Renton, WA 98058
206.255.7410
C 1989 Silicon AUey Inc. 'tude Is a trademark
of Silicon Alley Inc. Other brand or product
namtJS are traoemarks or registertJdtrademarfcs
oftMir respecUVtJ holders. Prices and sptJclicatbns subject to change.

Reader Service Number 177

MICRO CORNUCOPIA, #50, Nov-Dec, 1989

77

By Michael S. Hunt
th

2313 N. 20
Boise, ID 83702
(208) 336-7413

A Short Look At Sparse Matrices
Linking Your Way Into Tables

Michael is short this time. It turns out
he's still recovering from the Jolt SIGs at
the Gunnison SOG. So he's covering sparse
matrices in a sparse sort of way.
f you've looked ahead at the code for
this issue, you've probably noticed
that I haven't included the promised
B-tree balancer. Instead, the code this
time supports a linked list implementation of sparse matrices. (Sparse matrices
are like regular matrices only smaller,
we hope.)
Well, what can I say? It's summer,
and there was SOG, the new Turbo Pascal 5.5 arrived, the new Stony Brook
Modula-2 compilers arrived, and I went
scuba diving. Still, I wrote the AVL
routine (named after its developers), but
right now it has a vaguely annoying
tendency to drop pointers. So I'll cover
the A VL routines in the next issue.

I

SOG

SOG, as always, was great! My wife
Pamm and I made the trek from Boise
to Gunnison, Colorado, where I gave a
talk about the differences between Pascal and Modula-2. After about an hour,
the talk turned into a discussion about
the column.
Two camps emerged, one wanting
more simple toolkits that explained
common algorithms. The other wanted
powerful applications-oriented toolboxes. I'll try to satisfy both camps by
showcasing an algorithm from a robust
toolbox. We can still put full source
code on the issue disk and the Micro C
BBS.
Turbo Pascal 5.5
On the surface, 5.5 looks like 5.0. But
scratch the surface and hmmm, what's

78 MICRO CORNUCOPIA, #50, Nov-Dec, 1989

this, it looks like OOP (Object Oriented
Programming). I also received the
Turbo Assembler and Turbo Debugger.
Soon I'll start digging into all of it. I
have some code that could use assembly code speed so I'll discuss interfacing Pascal and Modula-2 to assembly
code routines. I'll also compare writing
with OOP and without OOP.
Stony Brook Modula-2
My upgrade to version 2 of Stony
Brook's Modula-2 compilers just arrived. With support for DOS, OS/2,
Windows, QuickMod compiler for
development, and optimizing compiler
for production, it's a very impressive
package. I'll talk in greater detail about
the Turbo and Stony Brook products
next time.
Scuba Diving
It was great! A whole day of diving
in a high mountain lake. The water was
cold, the air was clean, and the fish
weren't biting.
That Little Bug
At the last minute I realized I could
save some CPU time and simplify my
A VL code. Foolishly I began a quick rewrite. The VAX editor at work saves all
versions of a file, but the Turbo editor
saves only one .BAK file. Ah, to experience Laine's Lament for a universal
editor. Soon the original version had
been wiped out and I had no back up.
Sparse Matrices
In numerical analysis, modeling,
simulation, and many other fields of
mathematics and data analysis, we
often deal with large (1000 x 1000 or
larger) matrices of data. The data are
often real numbers at four or eight bytes
apiece. This can consume more memory

than many computers have.
Many of the matrices used in these
applications are called sparse matrices,
meaning that most of their elements
have the same value, usually zero. Some
common forms of sparse matrices are
upper and lower diagonal matrices and
tridiagonal matrices found in systems of
differential equations.
The toolkit for sparse matrices (Figure 1) stores only the nondefault elements of the matrix. The elements are
stored in an array of linked lists. The
function Sparse returns the ith row and
jth column element from the mth matrix.
PutSparse stores an element in the
linked list if it doesn't equal the default
value for that element. The unit supports MAXSPARSEMATRIX (currently
3) matrices. Each matrix can be up to
MAXROW (currently 1000) rows by
65,365 columns. SetDefault lets you
change the default value for the m th
matrix.
The sample program (Figure 2)
shows several common matrix operations using the SparseMatrix unit.
Next Time
Will there be A VL trees next time?
Yes Virginia, there really is an AVL
routine. After that, back to reality.

•••

3: DEFAULTVAL= 0.0:

=

nodePtr
"'nodeType:
node Type = record
data : data1'ype;
col :. WORD:
nextCol : nodePtr

USES SparseMatrix;
CONS'1' MatA
1; MatS =2; Matc == 3:
VAR i, j, k : WORD;

=

PROCEDURE AddMatrix: (*
BEGIN
FOR i := 1 TO 10 DO
FOR j := 1 '1'010 DO BEGIN
PutSparse(i, j, MatA, i*1.0):
PutSparse(i, j, MatB, j*2.0);
PutSparse(i,. j, MatC, Sparse(i,
Sparse(i,
END;

WriteLn;
WriteLn('MatA +MatB = MatC'):
FOR i := 1 TO 10 DO
BEGIN

MICRO CORNUCOPIA, #50, Nov-Dec, 1989

79

Getting A Little Hyper

Anthony Barcellos
p.o. Box 2249
Davis, CA 95617-2249
Voice: (916) 756-4866
Data: (916) 758-1002

Tony is hyper about hypertext (he uses it to improve his manual dexterity). This time he also talks
about his mini-BBS and about the Association of
Shareware Professionals. These are three good connections for anyone considering a shareware future.
n the beginning was text, and it d. idn't seem
all that bad at the time. Then came formatting and everyone saw that it was good.
When graphics were mixed in, the real excitement began. But there's yet another step in this
progression from text editors to word processors to desktop publishers.
It's called hypertext. It offers text, graphics,
and freedom-with a bit of confusion tossed in.
Unlike the documents most of us are used to,
hypertext does not proceed in a straightforward linear fashion. Forget about beginnings,
middles, and ends. Hypertext can go off in any
direction.
Say you're reading a hypertext document.
(Clearly this is not a hard copy system.) A particular phrase or caption catches your attention.
A special symbol flags it, indicating that more
information is available. You click on the symbol and a window opens. It may be a technical
citation or reference. Perhaps it's an illustration
or graph. It might even be an extensive digression, containing further branches of its own.
A hypertext document can be perused on
several levels, tailored to each reader's individual needs and preferences. A novice, consulting a hypertext user's manual, could ask for
additional help on difficult procedures.
An expert could lightly skim or, alternatively, deeply dig into technical details that
would frighten off a beginner. Using symbol
keys and internal "links," a hypertext author
can create a file that approaches all things to all
people.

I

That New Black Magic
NTERGAID has released a shareware hypertext authoring system called Black Magic. It includes a word processor to create your text, a

80

MICRO CORNUCOPIA, #50, Nov-Dec, 1989

screen grabber for importing graphics from
other programs, and a public domain reader to
distribute with the hypertext.
You can create four types of linkages within
Black Magic. A simple Note link pops up a
window that displays a short text string. Use
Note links to clarify comments or add little digressions.
Replacement links are quite different. Unlike
Note links, which the user may examine (or
not) on a case-by-case basis, Replacement links
are typically organized in families scattered
throughout a document. When a Replacement
link of a particular kind activates, all other Replacement links of the same name also turn on.
Replacement links substitute something for
each occurrence of the link word.
For example, "Boot your computer." could
be uniformly replaced with "If your computer
has a hard disk and is turned off, turn it on; if
it's already turned on, press the keys Ctrl, Alt,
and Del simultaneollsly. If your computer does
not have a hard disk, place your DOS diskette
in drive A and turn your computer on; if it is
already turned on, place your DOS diskette in
drive A and press the keys Ctrl, Alt, and Del
simultaneously."
How's that for customizing the level of your
documentation?
Reference links can take you from one hypertext document to another, thereby blurring
the boundaries of individual hypertext files. So
you don't get totally lost, the Reference link
gives you a flowchart map of the document.
Black Magic's DOS link lets you shell out to
a new program while Black Magic shrinks into
a tiny memory-resident kernel. When you exit
the DOS program, Black Magic resumes control. Thus you can build a highly customized
DOS shell and help system.
In their press kit, NTERGAID says that
DuPont is using hypertext as the documentation component of an active order system. The
Environmental Protection Agency uses Black
Magic to organize its voluminous regulations,
and NASA uses it to distribute aerospace test
data.

Despite its power, Black Magic's system requirements are modest. Although
it prefers a hard disk, Black Magic can
manage with a dual-floppy Pc. The
minimum RAM is 384K, although 640K
is recommended.
Black Magic requires a graphics card;
it supports CGA, Hercules, EGA, and
VGA. A Microsoft mouse (or compatible) is optional. It supports Epson dotmatrix and Hewlett-Packard LaserJet
printers for printed output. (Of course,
Black Magic loses most of its hypertext
features when you print a document.
You can, of course, choose which part of
a hypertext file to print, so Notes and
such can be included.)
That old Black Magic doesn't have us
under its speller, because it doesn't
check your writing. They left that for release 2.0. Overall, however, the package
is impressive.
NTERGAID suggests several applications for Black Magic, including technical documentation, educational courseware, computer-based training, and presentations. The clever user can probably
come up with several original applications for this combination word processor /DOS shell/clip art gallery / reference system.
If you're eager to try it, you can
download Black Magic from CompuServe or from NTERGAID's own HyperBoard at (203) 366-5698. There are
also several payment levels, as noted
below.
Black Magic, version 1.4
NTERGAID
2490 Black Rock Turnpike, Ste. 337
Fairfield, CT 06430
(203) 368-0632 (Voice)
(203) 366-5698 (BBS)
Demo disk, $7.00
Trial disk set (unregistered) $18.95
Registered copy
(with technical support), $49.95
Registered copy (with technical
support, printed manual, keybrd
template, quick reference card)
$89.95
A Heavenly Host
You're at the office. Your file is on
your PC at home. You need it now.
What to do?
If you have Minihost running on
your system at home, you just call it up
via modem and download the file to
your office computer.
Minihost is by no means unique,

since communications programs like
ProComm offer a host mode for unattended operation. However, Minihost is
more like a small bulletin board system
with amazingly low maintenance requirements. Mankin's program comes
practically ready to run as soon as you
extract the components from the archive
file and copy them to a Minihost
directory on your hard disk. (Minihost
supports floppies, too, but a hard disk is
recommended.)
You'll need to edit Minihost's parameters, but they've thrown in numerous
example entries. Just enter your name in
place of Don Mankin's (the author) as
sysop, and edit the names in the user
list to give your friends suitable access
levels. Or you can lock everyone else
out by declaring your Minihost a closed
system.
You also get to set disk and directory
protection levels. You can change the
COM port from 1 to 2 (or whatever).
Or, you can prevent others from
downloading files with specified extensions.
The documentation explains each option in the order in which it occurs in
the .CNF file, so I loaded the user's
manual into one window of my word
processor and MINIHOST.CNF into the
other. As I scrolled through the manual,
I moved through the parameters.
I have been using Minihost for over
two years so folks can send me articles
for Sacra Blue, the newsletter I edit. In
the olden days, contributors would call
and we'd attempt to get my Qmodem
talking to whatever they had. Then
we'd patiently go through the file transfer procedure.
Now I leave Minihost running and
Sacra Blue's writers can upload files just
about whenever they please. I don't
have to do a thing. Minihost lets them
leave messages to me (or to each other,
since recent Minihost releases offer message conferences as well as messages to
the sysop) and I can leave messages for
them.
My system is configured so that anyone can log in to leave messages or
upload files. I have entered a few
people in my user base so that they can
download files and access additional
directories. Minihost is very flexible.
The simplest way to receive Minihost
is to call Don Mankin's Minihost system
at (209) 836-2402 and download the current version. If you do, you'll also discover that Don is in the process of creating a new system called Maxihost. He's

converting to Turbo Pascal 5.5, thus
shaking off the 64K limit.
Since Minihost has always served me
well in its "mini" form, I'm not sure I'll
jump into Maxihost. In any case, I can
attest after years of reliable use that
Mankin's little BBS is a gem of a system.
Minihost
Don Mankin
3211 Crow Canyon Place, #A296
San Ramon, CA 94583
(209) 836-2402 (BBS)
$25 hobbyist registration fee
$50 commercial registration fee
Shareware Sources
The Association of Shareware Professionals has already done a great deal
to professionalize the shareware business. Many shareware authors have
turned to ASP for information on entering this alternative software marketplace.
ASP also has other functions. ASP
has an ombudsman to mediate disputes
between users and ASP members. In
addition to writing to the ombudsman
at ASP's address, you can reach him via
CompuServe. His ID number is
70007,3536.
ASP has also published vendor
who
give
guidelines.
Vendors
shareware authors due credit and adhere to the ASP guidelines may describe
themselves as "ASP approved."
As a shareware aficionado, I'm always curious where people obtain their
shareware. Although users groups are a
primary source for many people, the
larger mail-order operations generally
have more comprehensive inventories
and many now carry the ASP seal of
approval.
What's your favorite shareware
source? I've mentioned PC-SIG and Nelson Ford's Public (Software) Library in
the past. Let me know your ,experiences
with shareware vendors and I'll report
on which ones seem to be the best bets
for quick and friendly service. Just write
to me or leave a message on my Minihost system. Keep those bytes coming.
ASP Ombudsman
Assoc. of Shareware Professionals
P.O. Box 5786
Bellevue, WA 98006
CompuServe 70007,3536

•••
MICRO CORNUCOPIA, #50, Nov-Dec, 1989

81

mUD
omm
nrnm
By Gary Entsminger
P.o. Box 2091
Davis, CA 95617

Order And Chaos:
Creating Fibonacci Attractors With Turbo Pascal
Objects

My last conversation with Gary began with:
"How in the heck am I going to introduce this kind
of chaos?" (Actually, I didn't say "heck," but you
understand.)
"You could tell them you assumed it was a Culture Corner until you got to the very end," he said.
"The end wouldn't have straightened me out," I
muttered.
So here I am, still no introduction. (And, come
to think of it, I still don't have a Culture Corner.)
eonardo of Pisa created one of the first
models of population growth in 1220,
7.69 centuries ago. Leonardo, better
known to us as Fibonacci (renamed by mathematical historian, Guillaume Libri, in the 19th
century), used a pair of rabbits as the basic
unit for reproduction in his model. He reasoned the following(1) begin with one pair of rabbits;
(2) let them mature for one year;
(3) let them beget one pair like themselves;
(4) for each successive season, let each new
(mature!) pair beget a new (immature!) pair;
(5) continue as far as integers (or rabbits)
go.
Figure 1 shows how this scheme develops.
We call the pattern in the second, third, and

L

82

MICRO CORNUCOPIA, #50, Nov-Dec, 1989

fourth columns the Fibonacci sequence, and it
has challenged and perplexed mathematical
minds for almost eight centuries. The pattern's
simple enough-each successive number is equal

to the sum of the two preceding numbers.
As a population model, the Fibonacci
sequence has a basic flaw: it omits death. Consequently, rabbits grow by leaps and bounds
(hops, actually), eventually filling the surface
of the earth.
Fibonacci wasn't all that interested in overrunning the planet with rabbits; he wanted to
understand patterns of growth. His sequence,
it turns out, fits a very interesting ratio contemplated in Greece some 15 centuries before
Fibonacci.
The Golden Ratio
The golden ratio (11.z(1 + sqrt(5» or roughly
1.618034 ... is the ratio between two divisions
of a line or plane, such that the smaller is to
the larger as the larger is to the sum of the
two.
The golden ratio recurs throughout nature• it's roughly the ratio of your total height to
your navel's height. (If you don't believe
me, measure yourself; even better, measure
a good friend.)
• it accurately models the "bee-tree law," or
pattern of reproduction in bee colonies
(where a single female parent asexually reproduces males, and male and female
parents
together sexually reproduce
females);
• it describes the number of ways light can be
refracted and reflected through different
layers of glass;
• it describes the arrangement of florets in
sunflowers and other composites.
A typical sunflower, for example, has a
head containing spirals of tightly packed
florets. Each spiral winds a fibonacci number
of florets in one direction and the next smaller
(or larger) fibonacci number of florets in the
other. (See Figure 2.)

Sunflowers have been found spiraling in all the Fibonacci numbers up to
144.

The late summer hillside below (and
for miles around) my writing table here
in the Elk mountains glows golden with
blooming composites. A hillside fractal
of Fibonacci spirals.
Growth
Most models of population growth
share a similar formX n +1

Figure 2-Chrysanthemum Morifolium (elusion). Photo by C. Anderson
Figure 3 -Rl=1.61803398867 R2=O.6180339887

where Xn is the density in season ni
Xn+l is the density in season n+ 1; and F
is a mapping which shows how the
density changes from season to season
(or state to state).
F has two parts: one part represents
birth rate, and one part represents death
rate. Most of these mappings (at least
most of the published ones) have one
significant trait in common: they define
a single-humped (i.e., parabolic) curve.
Qualitatively, they behave like the
much-discussed
logistic
equation
(w hich I briefly discussed in Micro C,
#47, "Strange Attractors: Order In
Chaos"). In particular, these mappings
all exhibit both ordered and chaotic behavior depending on their initial conditions.
I thought it might be fun to explore a
population growth model based on the
Fibonacci sequence. The equation I
chose to model is simple enough, with a
rate parameter for birth and a second
rate parameter for deathXn+l

Figure~Rl=1.83957

·R2=O.6180339887

= F(Xn )

= R1

1<

Xn

1<

(1 - R2

1<

(Xn-l

1<

Xn -l»

where Rl is the birth rate of this generation and R2 is the death rate of the last
generation.
The Fibonacci twist is twofold:
(1) as a possible rate (for Rl or R2);
(2) as a three generation component:
future generations (or states) depend on
both this generation (birth rate) and the
generation before (death rate).
Not surprisingly, the Fibonacci
sequence (expressed as the golden ratio)
produces dramatically different behavior (when used as a rate) than
values very, very near the ratio. See the
attractors in Figures 3 and 4 for immediate gratification. Later I'll talk results.
Prolog & Pascal
Usually I use Turbo Prolog for modMICRO CORNUCOPIA, #50, Nov-Dec, 1989

83

elling systems, primarily for three reasons(1) Models are state systems (Le.,
they're recursive). The value of the last
state gets fed back into the system to
produce the next state. Prolog is a recursor's dream;
(2) The BGI (Borland Graphics Interface);
(3) Speed.
Lately, though, I've been programming about half-time in Turbo Pascal,
first beta-testing TP 5.5 and lately betatesting Turbo Power's Object Pascal
Toolbox. The new object extensions
make TP a very intriguing compiler, so I
couldn't resist an opportunity to test
Turbo Pascal objects for chaos.
After a bit of thought and a few halfblind alleys, I decided to create two objects:
(1) a graphics object; to initialize and
test the adapter; to set and modify
scales; to setup basic variables such as
screen coordinates.
(2) and a Fibonacci model object
which inherits all the graphic and scaling methods from the graphics object.
The Fibonacci model object includes
a recursive state-changing method and
a menu.
Pascal Objects
I've described the objects and their
methods in Figure 5. For convenience, I
created and compiled the graphics object first as a unit. The Fibonacci object
(created later) uses the graphics unit.
Objects are handy here for several
reasons:
(1) It's easy to view an object as an
entity with an internal state that it remembers (about itself!) even when you
aren't using it;
(2) The graphics object is generic, so I
can create many more complex objects
from it later (by inheriting its methods);
(3) Since an object's methods know
all about its data fields (Le., its state), I
don't have to pass parameters between
the object's methods;
(4) Objects group data and methods
(which might otherwise be confusing) in
distinctive blocks.
My code is simple enough, so I'll
only comment here on a few interesting
(I think) nuances.
My first semi-blind alley generated
one of Turbo Pascal's stack overflow errors. The problem-too much recursion.
Even a 64K stack isn't enough for cranking out strange attractors. In Turbo Prolog, you can recurse 'til the cows go

84 MICRO CORNUCOPIA, #50, Nov-Dec, 1989

Xmin unchanged')
current··scale.Xmin := R:
writeln('N;w Xmax: '):
readln(Rs):
Val(Rs,R,Return);
IF Return <> 0 THEN
writeln('Invalid input Xmax unchanged')

begin
Ratel:=
Rate2 ,end:
procedure
begin
WalLE I'1'rue·OO
begin
Nx :=Ratel* X* (1 Ny := X;

ELSE

calculate_scale;

IF R > current scale. Xmin THEN
current ecai'e.XmaK := R
ELSE

X := Nx;
Y := Ny;

-

writeln('Xmax must be > Xmin: no change'):
writeln('New Ymin: ');
readln(Rs):
Val (Rs, R, Return)·:
IF Return <> 0 THEN
writeln('Invalid input
ELSE
current scale.Ymin := R:
writeln('N;w Ymax: '):
readln(Rs):
Val(Rs,R,Return);
IF Return <> 0 THEN
writeln('Invalidinput Ymax unchanged')
ELSE

end;
end:
procedure fibonacci.get_rate;

current_scale.Ymin THEN
current scale.Ymax := R
ELSE

-

INGRAF 2.10

A multi-device graphics library for Scientific,
Engineering, and Business usersl Supports video,
printer, and plotter graphics for personal computers.
Ov~r 100 routines to create bar. pie, and smith charts; linear. log
(senu-log and log-log). and polar plots; axel and grid. with tick
marks and labels. uuuken, line types. curves. arcs. circles, ellipses.
and more.
(EMU IOUte' cod,., 110 nqallill or rUII-tim, feu/)
The window function allows you to use up to 32 windows. You
can set individual characteristics (such as sizing. scaling. labeling,
etc.) for each window or identical characteristics for all windows.
INDUCTIVE

REACTANCE

TEMP.

U:

& RAINFALL OF HOUSTON AREA

I~O

7S• 0

t,o,D
v

65.0

~

60.0

~

55.0

.

.c.

C

lui

~ SO.O

~O

<
a:

'~O

35.0
JAM FEB MAR ~

CAPACITIVE

REACTANCE

tlAy

Jl.II JI.l. AUC S[P OCT NOV

00

occ·

1984

INGRAF is available for C. FOR1RAN-77. and QuickBASIC
(pascal available soon); support for numerous compilers.
We also have GRAFLIB 4.10 for video and printer graphics;
PLOTLIB 4.10 for pen plotter graphics, and
FORTLIB 4.05. a FORTRAN enhancement library.

Sutrasoft
P.O. Box 1733 • Sugar Land, TX • 77487
Order Line : 1·800·888·8460
All other calls: 713 491·2088
Reader Service Number 173

MICRO CORNUCOPIA, #50, Nov-Dec, 1989

85

home by inserting a cut (!) before the recursive call. Called tail recursion elimination, this is a beautiful technique.
In Turbo Pascal, there's no obvious
way to insert a cut. But there is a subtle
way to recurse 'til your heart's content.
My first (unsuccessful) attempt at a
recursive method went something like
this: (note: this procedure belongs to the
object, fibonacci, hence it's one of fibonacci's methods)
procedure fibonacci. fib;
begin
create_a_strange_attractor;
WHILE KeyPressed

<> True DO

tween each call to fib. This sequence
runs all night or until a KeyPressed.
And there's no need for a large stack (a
few K will do).
Note in Figure 5 the use of New and
Dispose to allocate and deallocate heap
space for objects. And the use of the
caret (") for referencing dynamically allocated objects.
Note also that init and done do nothing besides internal notekeeping.
Specifically, they set up and reference
the VMT (virtual memory table), which
guarantees that the right amount of
memory will be allocated on and deallocated from the heap.

fib;
end;

This code generates a stack overflow
error long before it's created much of an
attract or.
My second (successful) attempt uses
two proceduresprocedure fibonacci.recurse_fib;
begin
WHILE KeyPressed

<> True DO

fib;

end;
procedure fibonacci.fib;
begin
create_a_strange_attractor;
end;

There's no longer a stack overflow
problem, since the stack is reclaimed be86 MICRO CORNUCOPIA, #50, Nov-Dec, 1989

Results
The results of my explorations were
revealing. The attractors do vary depending on subtle changes in birth and
death rates. If we use the golden ratio,
the attractor is periodic and highly predictable (see Figure 3).
If we vary rates ever so slightly away
from the golden ratio, the attractors
vary ever and ever more strangely,
looping and looping between and
around its loops. (See Figure 4).
Incidentally, the data generated by
the Fibonacci model equation plotted as
a time series (i.e., each successive state
versus time) shows a mass of chaotic
dots. The two attractors in Figures 3
and 4 are phase portraits, generated by
plotting one generation's data against
the last generation's data, rather than
against time. (See Micro C #47, "The

Last Page" or Dynamics, The Geometry Of
Behavior, by Abraham & Shaw for
details.)
The Fibonacci sequence clearly
brings an intriguing (if not yet fully illuminating) order to chaos. And Turbo
Pascal objects offer a potentially elegant
solution to the programming of complex models. I'll get back to you.
And that, friends, is Tidbits.
References
Abraham, Ralph & Christopher
Shaw; Dynamics, Vols. 1-4; 1982, '83, '85,
'88; Aerial Press. (An illustrative guide
to attractors, basins, tangles, and the
complex mathematics of dynamics.
Highly recommended.)
Entsminger, Gary; "Strange Attractors, Order In Chaos," Micro C #47;
May-June 1989. (A short introduction,
with Turbo Prolog code, to strange attractors.)
. Graham, Ronald; Knuth; Patashnik;
Concrete Mathematics; Addison-Wesley;
1989. (Contains an excellent discussion
of the Fibonacci sequence.)
Stevens, Peter S.; Patterns In Nature.
(Excellent examples of how nature appears to an architect.)
Stewart, Ian; Does God Play Dice? The
Mathematics Of Chaos; Basil Blackwell;
1989. (A terrific introduction to the
mathematical side of chaos. Includes
many recent experimental discoveries &
discussion of recent applications.)

•••

3D Surface Generation
O,-l,incmode,fillcolor,
(horangle>7.0*PI/4.0).? (incmode = 1):
(incmode= 0):
dosurf(xmin,xmax,ymin,ymax, nx~ny, z, 0,
me-l,l, ny-l,D, -1, incznode, fillcolor,
edqecolor):
break;
}

if (box)
invert? drawboxbottom(boxedgecol)
drawboxtop(boxedgecol);
drawboxfront(quadrant,boxedqecol);

return (1):
else if «horangle >== PI/2.0) && (horangle < PI»
return (2)i
else if «horangle >== PI) && (horangle < 3*PI/2. 0) )
return(3);
else return(4)i
1* intget_quadrant() *1

1* finds· global transformation angles and their cosines
and sines for later use in calls to axonometric () . *I
void transform_angles(float horangle,float elangle,
int quadrant)
float phi,psi/sinel;

}

1* avoid dividing by O. all this messing around with

free (Xa) : ,'. free (Ya) ;
return (0):
/ * int surface () *1

1* converts from decimal degrees to radians. */
void degrees_to_rads(float* horangle,float *elangle)
{

/* check that angles are in the range 0 to 360: *1
do

if (*borangle <0.0)' *horangle.+::360.0;
while, (*horangle < 0.0»)
do

quadrants is because angles that generate cosines of
0.0 area function of the floating point library of
the compiler and of round-off error. *1
if (cos(horangle)~ 0.0) 1* horiz angle 90 or 270*/
switch (quadrant) {
case 1
case 3
phi = PI/2.0;
psi;:: 0.0:
break;
case 2
case 4
phi =-PI/2.0;

if(*horangle>360.0)*horangle-=.360.0;
while .•·. (*horangle' >.360.0);
*elangle =*elangle * PI /180.0;
*hoiangle == *horangle·*·!?I 1180.0;
l*voiddegrees_to_rads () *1
I*find.$ >st:andardmath quadrant of viewer *I
ini: get quadrant (float horangle)
{
if «borangle>=O.O)'& (horangle< PI/2.0»

-

286 or 386SX?

CAN'T MAKE UP YOUR MIND?
WHAT SUITS YOUR NEEDS NOW MAY NOT BE
RIGHT FOR YOU IN THE FUTURE. TAKE ADVANTAGE OF THE SPEED AND POWER OF A PT286
SYSTEM AND RETAIN THE OPTION OF UPGRADING
LATER TO A386SXWITH A PLUG IN CPU MODULE.
ALL PRODUCTS ARE COMPATIBLE WITH DOS,
UNIX, XENIX, OS/2. AND MAY CONTAIN UP TO 5
MEGABYTES OF ON-BOARD MEMORY.
2861386SX KITS ARE AVAILABLE

.PT386SX

Assembled board, 16MHZ, 1 MEG,
$749.00
FDC, 2 serial, 1 parallel port
·PT286
Assembled board, 16M HZ, OK RAM, FDC,
$475.00
2 serial, 1 parallel port
.PT386SX
Optional upgrade to PT286
$325.00
CPU Module
ONLY

CATALOG AVAILABLE UPON REQUEST

PERIPHERAL TECHNOLOGY
1710 CUMBERLAND PT. DR. SUITE 8,
MARIETTA, GEORGIA 30067
404/984-0742/FAX ORDER LINE: 404/984-8248
ALL TRADEMARKS ARE THE PROPERTY OF THEIR RESPECTIVE OWNERS.

}

sinel=sin(elangle); Sinphi= sinel* sin(phl);
Cosphi= cos(pbi); Sinpsi= sinel* sin(psi);
Cospsi == cos (psi) ;" Cosel = cos (elangle) ;

AS
AT

OW $99.95
LAST!

StH $3.00
Outside U.S.
add $10.00

FLOW CHART AND ANALVZE
YOUR ASSEMBLY LANGUAGE
SOURCE CODE

• Flow Charts
• Tree Diagrams
• Stack Sizing
• Register Analysis
• CPU Timing Analysis
• Procedural X-Reference
• 8088/87 to 80386/387
• Context-Sensitive Help
• Menu/Batch/Command
line Operation
• MASM 5.1 Compatible

QUANTASM

GOIINRATIQRlt

19855 Stevens Creek BM:l, Suite 154
~,CA95014

(408) 244-6826

break current line
editor_warning
save screen
display-warning
restore screen
editor_warning
insert blank line
adjust)ne join_line
editor_warning
adjusUine
delete_ediCline
editor line out
ediUine_oUt -

E
~

Reader Service Number 139
Reader Service Number 119

VISA • Me

30 - Day Money Back Guarantee
MICRO CORNUCOPIA, #50, Nov-Dec, 1989

87

88 MICRO CORNUCOPIA, #50, Nov-Dec, 1989

----- --------

--------------

Linef(pUn1] ,q[l] [1] ,pU] [0] ,q[l] [0]);
Linef (pu] to] ,q[l] [0] , p [0] [0] , q[O] [0]);
1* void Clrawfillquadrangle 0 *1

for (i = 0; i < 5: i++) {

transf(~[i),Zb[il,&Pb[i],&Qb[i]);

1* draws triangle described by the 3 points passed.

itransf(&Pb[i],&Qb[i]);
transf(Yt[i],Zt[il,&Pt[i]i&Qt[i]);
itransf(&Pt[i],&Qt[i});

void filltriangle(int xO,int yO,intx1,int y1,
int x2iint y2,int fi11color)
int z,a,b,dx,dy,d,deltap,deltaq,jstart;
intxl[2] [3],yl[2) [3); register int x,y,i,j,k;

1* sort thepoirits in ascending vertical order:
if (y1 < yO) swapcoords(&xl,&yl,&xO,&yO);
if (y2 < yO) swapcoords(&x2,&y2,&xO,&yO)i
if (y2 < yl) swapcoords(&x2,&y2,&xl,&yl);
I*stick em in arrays for triangle edge computation:*1
xl[O] [0] = xO;
yl[O] [0] = yO;
xl[O] [1] = xl;
yl[O] [1] = y1;
xl[O] [2] =x2;
yl[O] [2] =y2;
1* to use loops instead of if statements, we pretend
the long side of the triangle is made up of 2
lines. one has zero length: (x2,y2) to (x2,y2).
xl[l) [0] =xO;
yl[l] [0] = yO;
xl[l] [1] = x2;
yl[l] (1] = y2;
xl[l] [2] = x2;
yl[l] [2] = y2;
1* i loops· over. the 2 triangles: k·loops over the· two
short aides. and· the one long side: *1
for (i = 0; i < 2; i++) {
jstart
0;
for (k = 1; k < 3; k++)

=

{

Csetf(color);
for (i = 0; i < 4; i++)
Linef(Pb[i],Qb(i),Pb[i+l),Qb[i+l]);
/* void drawboxbottom() *1
void drawboxback(int quadrant,int color)
{

Csetf(color):
for (i=O; i<2; i++) {
j = back [quadrant-1) [i);
Linef(Pb [j] , Qb [j] , Pt [ j] , Qt [j 1) ;

MICRO CORNUCOPIA, #50, Nov-Dec, 1989

89

Printer Error Handler

Current Loop To RS-232C Converter
This small circuit will convert a 20
rna signal to RS-232C. I originally built it
to convert Reliance Automate 31 program files from our Datapoint to an
Allen Bradley T-50 Industrial Terminal.
By building and using this converter, I
saved countless hours of hand converting files.
The circuit consists of a single 4N28
IC. It decides which voltage (+12 VDC
or -12 VDC) reaches the RS-232C port. I
put a 2.7K resistor in series with the
4N28's input LED. The resistor limits the
LED current to around 8 rna. I use a 10K
resistor to pull up the 4N28' s output
when it's not conducting. The schematic
(see Figure 1) shows how I wired the
4N28.
To transmit from the Datapoint, I
fired up the 20 rna current loop and
loaded the Automate 31 tape (this sets
the baud rate). Then I connected the
power supply and hooked up the signal
to the computer's RS-232C port.
After selecting the same baud rate in
my terminal package, I just captured the
files as they came in. (Imagine all the
typos and all the eye strain of comparing and checking that I avoided.)
Larry Kraemer
Rt.2 Box 190
Jackson, MO 63755
Printer Error Handler
With all the compilers I've used,
there's been one sore point when using
the standard printing routines. If there's
a problem, you get the ugly "WRITE
DEVICE FAULT ERROR," or something
similar all over your beautiful screen. I
wanted something that could handle the
error in a professional way.
I wrote Figure 2 for Borland's Turbo
C 2.0. (The routines are not ANSI compatible.) The heart of the code is Turbo

90

MICRO CORNUCOPIA, #50, Nov-Dec, 1989

C's biosprintO routine.
Let me briefly describe the algorithm.
I print strings only; printing floating
points and integers is just a matter of
converting the number to a string and
then printing the string.
First, I send a string to the printing
function. It prints out the string character by character, each time checking the
status of the printer. If the function detects an error, it moves into the
abort/retry function. The abort/retry
function saves the contents of the current window. Then it creates its own
window, prints the error message, and
asks if the user would like to abort or
retry.
If the user selects retry, it keeps
checking the printer to see if the error
has been corrected. If it has, it returns to
the printing function and continues
printing the string. If the user chooses to
abort, it exits the printing function. The
abort/retry function restores the previous screen and window coordinates
before finishing.
You may notice a little double coding
in the functions printer_okO and

bio_print_stringO. The routines for
checking in bio_print_stringO are so
small I didn't want to make the extra
call to printer_okO. However, you may
want to call printer_okO to determine
the printer status before you start printing. This is the reason for some duplicate code. Also, the abort/retry function
uses printer_okO to keep determining
printer status.
You can use these routines universally with all your Turbo C programs.
Just compile STDPRINT.H to an .OBJ
file and use it in your project files, or
put the code in your program as a
header file. If you compile STDPRINT.H
to an .OBJ file, make sure you include
the files BIOS.H, CONSOLE.H and
GRAPHICS.H in the program.
I hope these routines will make your
life a little easier when dealing with the
printer. (Note: These routines do not
work for serial printers.)
Jeffrey Scott Donovan
1515 Santa Barbara St. #A
Santa Barbara, CA 93101

Micro Ads
A Micro Ad Is the inexpensive way to reach over 22,000 technical folks like yourself. To place a Micro
Ad, Just print out your message (make it short and sweet) and mail it to Micro C. We'll typeset your ad

(no charge) and run it In the next available Issue. You can also send camera ready copy. Rates: $99
for 1 time, $267 for three times, $474 for 6 times (a best buy at only $79 per Insertion). Full payment
must accompany ad. Each ad space Is 2 V4 Inches by 1 3'4 Inches.

Briefly, a hypertext help system, context sensitive, up to
80%compresslon, requires less than 10K, Includes editor
for documents, and source for Pascal, C, and Basic.

(203)368 - 0632
NTERGAID, 955 Connecticut Ave. Bridgeport, CT 06607

DUPLICATOR TOOLKIT PRO

F

LAS

r--_-•.
•Tb •
:....J r
-.

H

THE DUPLICATOR TOOLKIT PROfessional is a superfast
diskette duplication utility for your Pc. It does what
diskcopy can't do! Copies a 360K diskette in 20 seconds,
fonnats and verifies "on the fly," and even produces diskette
labels at the same time! Copies 5 1/4 360K DDDS, 1.2M
high-density, 5 1/4 360K using a 1.2M high density drive,
3 1/2 720k, 3 1/2 1.44M and 3 1/2 720K using a l.44M
drive. Stores master in RAM or on the hard drive.
Fonnat-only option allows for high-speed fonnatting.
Eliminates the "floppy shuffle!"
$129.00 + 5.00 s/h Visa/MC/COD
COpy TECHNOLOGIES
14252 Culver Dr. Ste. 323
Irvine, CA 92714

$5.00 Shp/hnd in USA & CANADA, $15.00 overseas.

Reader Service Number 163

Reader Service Number 106

STOCKS

OPTIONS

FUTURES

-

-

EASY to Install
Cache up to 32 MEGS of EXTENDED
and/or EXPANDED

• Buffers up to 26 DEVICE driven drives
• Comes with 2 FREE utilities!!!!!

EDITOR
CHOICE

ORDER NOW $69.95
(800) 25-FLASH

100 page book covers satellite and radio data
reception of financial news and quotes for your PC.
$19 (includes demo diskette). Free informative
catalog of:
* Data receivers and kits
* Quote processing and display software
* Descrambling software utilities

Digital Vision B&W Video Digitizer $249
or Color Video Digitizer $399
Willow PC Publisher VGNframe grabber $595
Everex Vision 8 frame grabber $795
Everex Vision 16 frame grabber $1295

303·223·2120

$5 Demo Diskette
DATArx
111 E. Drake Rd. Suite 7041
Fort Collins, CO 80525

(SOD)

K
[Jg]

423-3400

KOMPUTERWERK, INC
851 Parkvlew Blvd
Pittsburgh, PA 15215

Why you want BAlCOM!
BATCOM is a batch file compiler that compiles
your -.bat-files to -.exe-files to make them faster,
more professional, and more capable. BAT·
COM extends DOS with new commands so you
can read keyboard input, perform arithmetic, use
subroutines, and much more. In addition, BAT·
COM protects your source code, and you can
distrbU1e your compiled programs without royalties. For IBM PC. Only $59.95. Order todayl

CCTV Video Cameras
Special: Color VCC3700 Sanyo $395
Panasonic WV-141D B&W $219
Panasonic WV-BL200 CCD B&W $579
Free Shipping! TX residents add sales tax.

/ - ' \ , Wenham Software Company
5 Burley St.
' _ . / Wenham, Ma. 01984
(508) 774-7036

t • l

joel Sampson Engineering
P.O.Box550363
Dallas, TX75355·0363

Support for:
~ Enhanced Keyboards
~ EGA & VGA Graphics
~ 3.5 inch Floppies
~ More ...

Reader Service Number 126

Technology for the Arts
Music Quest PC Music MIDI
Card with free software $119,
Sequencer or Toolkit $39 each.

BIOS
*AWARD
286 * 386

Authorized AWARD Distributor

SOFTWARE MASTERS 6352 North Guilford Ave.
Indianapolis, In 46220/ (317) 253-8088

Turn Your PC Into A
MARKET QUOTATION MONITOR

LATEST
PC/XT

THE DISK ACCELERATOR

Phone 214·328·2730
BBS214·328·6909

Reader Service Number 133

Reader Service Number 176

Reader Service Number 124

THOUSANDS OF NEW COMPUTER BOOKS

8031 J.l.Controller Module $39.95

The $25 Network

Shipping: $3.00 US'$5.00 Canada

40% OFF LIST
Get the newest computer titles at the lowest
prices with a low minimum order. Send 3
stamp SASE.
COMPUTER BOOKS • PO 70195. SAN DIEGO, CA 92107

Reader Service Number 167
WHITNEY EDITOR $39
Small and fast
Uses all available memory
Split-screen editing
Conflgurable keyboard
Regular expression search
One key compile
Features for writing documentation
Condensed/Outline display
Runs on IBM PC's, AT's, and PS/2's
USA shipping & handling $3; Outside USA $15
CA residents add sales tax

Whitney Software, Inc.
P.O. Box 4999, Walnut Creek, CA 94596 (415) 933-9019

Reader Service Number 164

Try the 1st truly low cost LAN

Ideal (or prototypt'!Ol. one cL a kind devic"" or .hlrl produttion
NnL P...te.t buildil1ll block (or PC or MacintoRh data aquioitioo
interface or otand alone control project&. A.".,mbled and """ted
board include. 8031 microproce.or, CI')'1ItaI. 8K oI'EPROM. 128
byteo at RAM, 2 byte·wide 110 porta and proviRi
Source Exif Data:
File Type                       : PDF
File Type Extension             : pdf
MIME Type                       : application/pdf
PDF Version                     : 1.3
Linearized                      : No
XMP Toolkit                     : Adobe XMP Core 4.2.1-c043 52.372728, 2009/01/18-15:56:37
Create Date                     : 2013:01:25 15:25:29-08:00
Modify Date                     : 2013:01:25 18:04:10-08:00
Metadata Date                   : 2013:01:25 18:04:10-08:00
Producer                        : Adobe Acrobat 9.52 Paper Capture Plug-in
Format                          : application/pdf
Document ID                     : uuid:0fbd1e96-86de-4034-921f-fa02463e8492
Instance ID                     : uuid:2c394d96-e2fc-4908-a64e-f62208065c16
Page Layout                     : SinglePage
Page Mode                       : UseNone
Page Count                      : 100
EXIF Metadata provided by EXIF.tools

Navigation menu