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] >> >
