Yes I have the full source code, derived from an initial disassembly, then
hand corrected from a printed out listing that I had gotten from Daniel
Born years ago.


On Thu, Sep 3, 2026, 1:28 PM Stephen Adolph <[email protected]> wrote:

> Hi Gary,
> Does this mean you have the source code for ultrascreen?
> Thanks
> Steve
>
>
> On Tuesday, September 1, 2026, Gary Weber <[email protected]> wrote:
>
>> 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