| |
EMBEDDED SOFTWARE: Wrote numerous microcontroller real-time interrupt-driven systems of considerable size and complexity in assembler and C language with multiple stacks and task switching, usually supporting the two or more lines of text in (Loveshaw) industrial printers, but also to execute other system tasks — that is, custom RTOSs. Most projects included a user interface conducted in the background, from RS232 terminal to PC CRT to bubble keyboard/LCD. The systems were low-rent single-CPU systems that printed and also talked to the operator, often concurrently. HARDWARE: I am adept at bringing microcontroller-based gadgets to life; finding/fixing hardware flaws, figuring-out operation (or not) from schematics, and writing/integrating firmware into hardware design — and modifying and creating hardware designs. ... Many of my h/w designs wound-up in production, including a DMA PC card. DEBUG: I have years of experience with chip-level PC-based debugging and the older ICE equipment — including the design and fabrication of my own 8048 device (cp/m version around 1985) — logic analyzers, oscilloscopes, and other test/debug equipment, including the soldering iron. ASSEMBLY
LANGUAGE / C: I am highly
skilled in assembly
language for several microprocessors including the Zilog Z80
and EZ80,
Intel 8048,
8088 et al, Motorola/Freescale
68HC11 — I wrote
a 68HC11/8048/80C166
macro assembler / linker / cross reference
package which I have used for years in production work — and
the
Microchip PIC.
I am equally
accomplished
in C
language/embedded C language, using it extensively on PC-,
68HC11- C++,
OBJECTIVE DELPHI PASCAL: I’ve used the Delphi RAD programming environment since 1996 for numerous utilities and printer-control programs, including SQL projects, and a TCP/IP client/server PC product. Also see my reflections on Delphi class assignment, and my vast OwenShow Windows / Linux project.... *NIX: I probably know enough to be dangerous on the Linux/Mac/Unix command-line. DOCUMENTATION: I speak, read, and write English well, and have created extensive documentation and manuals, including illustrations. As opposed to most programmers, I like to comment code. See my owenhelp project, and the OwenShow help. BACKUP:
I
don’t lose source or documentation; over the years,
I’ve generated
numerous
backup CDRs,
zip and other disks, tapes, diskettes, thumb drives, and
I’ve
preserved and used detailed records —
source, operator
manuals, graphics — from as long ago as 1985. EDUCATION: BS in Computer Science, New York State Regents External Degree Program, 1984. This institution, now known as “Excelsior” college, probably still provides access to no-classtime all-test (GREs etc.) degree certification, at www.excelsior.edu. IQ: 131 — at least according to the Tickle online test, which I took after the Monster job site goaded me. Tickle also said
Then they offered to sell me a report that would tell me more....
|
|
The G55 provides a handy controller for various Loveshaw gadgets, including third-party printers used with the company’s labeler. It supports an RS232 interface, still common (and cheap) in industrial environments, which is used in my application to provide utility features. The (free!) PC-based programming environment is reassuringly / alarmingly familiar to those of us who have used Visual Basic, Delphi etc.: you get to “paint” the GUI, and then write bits of Basic code to string it all together and actually do something. ... And it often works! |

THE
Z80
YEARS: When I
arrived at Loveshaw in 1984 I took over a Z80
assembly
language printer project with a bubble
QWERTY keyboard and
2-line LCD screen.
I typed
the assembler code
into a CP/M Kaypro microcomputer
from printed listings,
because of complex difficulties with the previous developer.
The design
used 556 timers
for the central
ink valve timing, controlled by thumb wheel
potentiometers on the
front
panel. This was odd, since the design included a Zilog
CTC
“Counter Timer
Circuit”
LSI chip
with four
digital timers. Two of these were
wasted on product delays
— the interval from photocell trigger to printing; which
were
set
by yet more thumb wheels — I think one timer was used for
baud,
with one left over. I did a
redesign with the CTC doing the valve timing, and everything
else in software — which is why the Deity created
microprocessors! ... I found only a
few cuts and jumpers
made it work right, suggesting
the design may have lost its way
somewhere along
the road.
This system went on to many glorious permutations over many years, including two advanced CRT terminal versions. Supporting these products were PC control programs — first, simple command-line / character-based, and then Windows 3.1, where I ingeniously reused existing C-language code from the character-based effort via a DLL and coroutines.
In this and most of the subsequent printers, a single embedded CPU supports real-time printing via interrupts, + implements the user interface (print message composition, menu features) in the background.

In
the late 80s, the company
entered the 8088
/ 68HC11 era: we built a 6811 version
of the Z80 product, and then a more elaborate 8088-based system. I
wrote
a lot of embedded 8088 code, much of it in C + a good deal of assembler,
including coroutine code
for multitasking,
and created various programs to provide PC
access
to both the 6811 and 8088 designs.
Both units used industrial bubble keyboard / LCD
handheld units.
The
6811 won — the hardware design was simpler/cheaper,
particularly
after the handheld was “absorbed” into the main
chassis.
Numerous variations on this basic printer continue to this day,
ranging from 5 dot single-head machines up to 6
heads, +
newer technology higher-resolution 32-dot devices.
I’ve diverged the
software to follow the hardware models — but the basic code
is fairly common to everything. Along the way, to avoid the endless
struggles typical with cross-assemblers,
I
wrote my own.
...
I
wrote Windows
programs
for the printers,
supporting message
edit/change and other features, including graphics:
the
letters in
a printer graphics
font
are
replaced
with
images loaded from
the PC
program which, as shown here, used standard Windows “BMP”
graphics
files.
I created an industrial RS422 network for the 6811 design, allowing multiple printers to connect to a single PC with longer cable runs and less cable, and also alleviating the then-limited supply of PC serial ports. And starting with the 6811 design, I created multi-language “localization” interfaces, in the most elaborate case providing utility software to allow customization by others.
The product went through years of
variations and customization. In
1994, I replaced
a costly third-party
PC card with my own 68HC11-based
hardware design and
assembly-language software.
|
If I really liked 5 volts, I suppose I could connect an all 5-volt system to the eZ80 bus, including the LCD — but the Zilog prototype gadget I use wouldn’t like that, already equipped as it is with 3.3 volt memory and other devices which don’t have the eZ80 5-volt input tolerance feature....
|
|
In the illustration, window (a) is the main window of the printer control program. The automation feature in window (b) — as shown more-or-less on the form — has been configured with the “$:database” key word; the desired host, table, password, etc. information is provided in the program’s INI file under the section heading “[adbase]”. In the arbitrary syntax of the feature, the database section is followed by a scanner and one or more printers. The information the automation feature will act upon will be provided by the first “p:” specification, a “p:scanner”, an imaginary “printer” whose attributes are found in the INI file under “[printer:scanner]”. Here this scanner controls a single printer “p:com1”. The INI specifications for the scanner configure it as a file-based protocol instead of an actual device, so the demonstration program shown in window (c) (which could be any software capable of creating a file) can function as an “imitation scanner”. It has just sent the unimaginative bar code “3” in this fashion, and the automation feature used the code to recall printer text from a particular row in a database, as indicated by the caption after “most recent activity” in window (b). |
An alternate action might recall a specified message from the printer’s built-in store; or load a disk file of messages into the printer, and then recall one of them. |
|
|
except
on E: Exception do begin dbef( ’SQLfinishUPIsave; in database “%s”, table “%s”:’ +CRLF +CRLF + ’[ERROR]’+CRLF+’%s’+ CRLF +CRLF + ’[STATEMENT]’+CRLF+’%s’, [work.databasename,Goptions.storagetable, E.Message,work.sql.text]); which would display the actual SQL involved, as well as other information, instead of spitting-out a cryptic “Field value required” or somesuch. ... But then, the built-in messages are probably so typically terse because evil hackers use them to spelunk on-line databases and figure-out injection hacks.... |
|
Verifying
that a serial connection exists at all was a challenge. A demo
“alphanet3.exe” crashed all the
W98 and XP computers I tried. An older alphanet2demo.exe I eventually
found lurking on the web worked — but probably not on XP,
since
it’s a Windows 3.1 kind of thing. The control protocol is “documented” in the vast 97088061.pdf. After the initial shock and awe, I settled for a “Sample C Program” (page 55). The protocol sequence shown there seemed to be only vaguely related to the stuff earlier in the book, and the actual C code was probably nonfunctional, but, once transferred to a working program, the sequence lit up the sign from a PC. I did have to stick in another sequence, using the page 55 outline with the text stuff replaced by an “E$” memory clear sequence I found somewhere else in the pdf. If I didn’t do that, the sign, although it’d display the new text, insisted on then immediately resuming the amusing show the alphanet2demo program set-off — and it remembers everything through power-cycles, the clever devil! ... Anyway, once I got that far, it was then just a skip and a jump and one of my printers was happily chatting with the device, and large-character printer technology took another giant LED step forward.... |
|
The printers themselves are stuck in the inexpensive past, with the simple RS232 or RS485 proprietary network links I designed. The new Windows + Delphi + Indy Internet components + Marshallsoft’s 32-bit serial DLL opened new vistas, supporting ethernet connections as well as USB serial (32 ports — or more!) and, with a little luck, actually running on the next operating system Microsoft© released — and, indeed, it did run without complaint on XP when it showed up — out of the box! ... On the other hand, there are now $150 industrial TCP/IP / RS232 / RS485 boxes that apparently do everything my server does — and no PC required! ... Sic transit etc.... But the Win32 program, which also supplies normal printer
control
functions through the usual serial link, recently only took a bit of
disciplining to work OK in Vista! |
|
My
linker has an
option which bumps
a module that might enter this forbidden zone, but that merely works
and doesn’t optimize code space usage After I fixed both programs, the best solution is still when a module hits B600 precisely, so not a byte is wasted before the boundary, but now the linker and SCRAMBLE correctly bump the module to B800. SCRAMBLE does 100,000 iterations — about 3 seconds in 16-bit 1988 Turbo C — but the actual solution takes around 13,000 tries. ... Thank goodness for these Pentiums.... |
|
What
did I
learn? (1.) Debugging software without source-level tools is unpleasant
and foolish, although occasionally necessary.
(2.) But I’m going to keep a logic analyzer around in case ... And isn’t life like that?! ... We struggle and suffer, only to discover there was a simple answer before us all the time? ... When the dust settled, it seems the broken pointer was something like $0102, a location where the E-series 68HC11 has RAM and the A-series doesn’t, perhaps explaining the pathological randomness of the E-series failures — although I can’t help but feel that reading random bytes from nothing ought to have been at least as unpredictable.... Subsequently, I modified my assembler to detect suspicious absolute references — i.e. because “ldaa 20h” (load from memory location 20 hex) should almost always be “ldaa #20h” (load the constant 20 hex) — which, I hope, will tend to discourage this kind of thing.... |
|
Also advanced technology with up-to-date printer parameter class.
|
|
And of course numerous printers required font support and I wrote numerous “ascii-to-font” programs, where patterns like
are converted to the bits and bytes needed by the printer. |
|
|
|
|
|
|
|
Conquering the Linux Desktop I’m not a script genius or Apache adept, although I’ve
managed to get NFS and
Samba working
in the Computer Attic now and then — but I am
a Linux
Kylix expert
— or at least I’ve spent months and written
over 10,000 lines of Pascal
with the Borland Kylix product,
a Delphi work-alike which
supported fast GUI
development in Linux.
... Not only did I write my
Linux/Windows open-source OwenShow
program
with Kylix, I’ve written a few bash
(shell) scripts, ... As certification of my obscure expertise, I fixed a Kylix / Delphi / CLX / Win98 save dialog bug with mildly cunning hackery.... I’ve written a few C programs with emacs
and gcc,
although ... But my truly towering triumph was getting cute little icons to appear on the Linux desktop! ... Now I wear the wizard’s cap indeed!... |
|
When the dust cleared I could do the job in a 16-bit DOS C-language program (unincremented 1988 Turbo C) — but that wasn’t right, see for instance the excellent WinHex file ’n’ disk editor — or better still a guy who sold me the source for $70! He hadn’t gotten to physical sectors yet, but I found I had made the most astonishing errors in the 7,000 Things That Must Be Done just to read / write logical sectors. The excitement was almost unbearable. ... Well the result was JGX, yet another dubious sector read / write program. ... Just to finish the story, I should point out that all these programs and information are of course totally useless in Windows XP — well except the exceedingly clever WinHex works fine in XP. ... And then there’re the fabulous Newbigins utilities with source, which whack file systems with admirable ease, both W98 and XP, but sadly didn’t show up in time for my JGX adventures.... |
|
|
|
|
An earlier era with the National Radio Institute.
|
|
Wednesday 7/1/09 12:41 pm |