Announcing UltrascreenNEC: a 60x10 small-font display for the PC-8201A /
PC-8300

Back in 2007, after getting in touch with Ultrasoft and the original
Ultrascreen author, Daniel Born, I was able to make Ultrascreen100
available to everyone who has a TRS-80 Model 100. What used to be a
commercial product became freely available up on Club 100 in my Personal
Library, thanks to both Daniel Born & Richard Eckerlin.  At that time as
well, I floated an idea on this list: could Daniel Born's Ultrascreen100,
that wonderful 1987 Ultrasoft TSR that squeezes a 60-column × 10-line
display out of the Model 100's LCD, ever be brought to the NEC machines?
I've picked this project up and put it back down more times than I can
count. Today I can finally say it's real: UltrascreenNEC is working on
hardware.

Once installed, it hooks the console and renders a crisp small font that
turns the PC-8201A/8300's 40×8 screen into a 60×10 one, across TEXT,
TELCOM, and BASIC. It brings back SCREEN 0 / SCREEN 1 to flip between
40-column and 60-column modes on the fly, it installs and uninstalls
cleanly (with a "REMOVE Ultrascreen? (Y/N)" confirmation), and the part I'm
proudest of, it gives you a full-screen BASIC editor at 60 columns: arrow
keys, insert mode, delete-and-close-the-gap, delete-to-end-of-line, the
works. That last item is why this took so long.

The challenges I had to overcome

1. The menu-flag wall: Where I got stuck, and reason #1 why this project
got stalled.

On the Model 100, the ROM only calls Ultrascreen's display hook when the
small-font mode is actually active.  So when you drop back to the main
menu, the hook simply doesn't fire and you get the normal menu. The NEC's
console is wired differently: the hook I had to use fires on every
character, unconditionally, with no such gate. The result was the small
font bleeding right into the main menu and making a mess, complicated by
the large-size and unaligned menu cursor. The Model 100 flag that would
have gated it doesn't behave the same way on the NEC. This is the exact bug
that stopped me cold in 2017. The fix turned out to be a NEC-only "menu
mode" flag the ROM already maintains: once I found it and gated my
rendering on it, the menu came back clean.

2. Writing a full-screen BASIC editor from scratch, because the Model 100
never had one!  (Reason #1 why this project was stalled.)

This is the big one, and it's the reason the original Ultrascreen100 code
was no help here. Model 100 BASIC builds your command line in a keystroke
buffer as you type. It doesn't let you use cursor keys to pop around the
screen while in BASIC. However, the NEC has full-screen editing in BASIC,
i.e. when you press ENTER, it doesn't read what you typed into an input
buffer; it reads the data back off the screen, out of a 40-column character
grid that the ROM keeps in RAM (320 bytes).  The 60-column display driver
paints pixels straight to the LCD and never touches that upper RAM
character grid, because it didn't need to. The NEC's ROM routines are no
help here as they only support the 40x8 standard LCD. In fact the NEC
PC-8241A CRT adapter also has to maintain its own full screen edit buffer
in its own RAM area as well since 40x25 can't fit into the upper RAM area
either.

There was no shortcut: I had to A) maintain my own private 600 byte
character shadow in parallel with the pixel display, and B) intercept the
NEC's input path entirely and reimplement the full-screen editor myself.
That means arrow-key cursor movement across all 60 columns, an insert mode
with an underscore cursor, backspace and delete that pull the rest of the
line in to close the gap, delete-to-end-of-line, clear-screen, all reading
and writing my shadow so that when you hit ENTER, the right line goes to
BASIC. None of this exists in the 1987 original Ultrascreen code; it simply
wasn't an issue with the Model 100 due to the lack of full screen editing
in BASIC.

3. Getting SCREEN 0 / SCREEN 1 back.

This one's a cautionary tale. The flag Ultrascreen100 uses to decide "am I
active?" quietly does two jobs on that machine; it also happens to encode
the SCREEN mode. When I replaced the menu detection (challenge #1) with the
NEC's menu flag, I unknowingly dropped the SCREEN 0/1 behavior along with
it, because that same overloaded flag was carrying the mode. Once I traced
it, with a big assist from studying how NEC's own PC-8241A CRT adapter ROM
handles SCREEN, the fix was to layer both checks: the menu flag for the
menu, the mode flag for 40-vs-60. Now SCREEN 0 drops you to a clean
40-column screen and SCREEN 1 brings the 60-column display right back just
like Ultracreen100.

4. The uninstall saga.

Cleanly removing a resident TSR from a CLEAR command turned into a cascade
of NEC-specific gotchas. The NEC fires the CLEAR hook at a different point
in the command than the Model 100 does, so the original approach threw a
syntax error. Fixing that surfaced a hang: on the way out I was restoring
one of my hooks to the ROM's "function-call error" address, which is
harmless on the Model 100, but because the NEC calls that hook on every
character printed, turned the first "Ok" prompt after removal into an
infinite error loop. Sort that out and there's an interrupt-timing trap
while the ROM relocates the stack, then the function-key labels going
haywire because the screen width hadn't been reset to 40 on the way out.
Each one was a small "same code, different machine" surprise. It now
removes itself cleanly and hands all the memory back. And, since I'm
reclaiming the one-shot install code automatically at install time, it's
tidy about memory the whole way through.

5. Everything else that a 19-year project accumulates.

There was the build/entry-point puzzle that made an early build crash the
machine outright on launch, the function-key label geometry to get the
60-column labels laid out right, and a long tail of address verification
between the two ROMs. Individually small, but collectively the reason this
took the better part of two decades of on-and-off effort.

To everyone on this list who's asked me about it over the years: thank you
for your patience. It's a genuine thrill to finally hand this to the
community that's been waiting for it.

You'll find USCNEC.ZIP available for download here:

https://www.club100.org/memfiles/index.php?direction=0&order=&directory=Gary%20Weber&;

-- Gary

[image: image.png]

P.S.  Before anyone asks: I've been trying to get in touch with Daniel
Born, the original author and Copyright holder, but unfortunately my email
for him bounces.   (There's also contacts with his name on LinkedIn but
none match up.)  If I'm successful contacting him, I'll see if I can make
source available for it under GPL v3.  But I just can't do it in good
conscience yet.  All I have right now, officially, are binary distribution
rights.

-- 
Gary Weber
[email protected]

Reply via email to