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]
