Tweaking the AlphaSmart Neo, a great portable word processor with 700-hour battery life

0.00 avg. rating (0% score) - 0 votes

Although I really love my AlphaSmart Dana, its limited battery life which requires recharging every couple of days as well as the lack of a backup battery is a major inconvenience. I therefore decided to purchase the Neo 2 that has a 700-hour battery life instead. With such a long battery life, I did not bother to use rechargeable cells and simply bought good alkaline batteries instead. 700 hours be equal to at least a year of typical use, by which time the alkaline battery should be replaced anyway to avoid leakage. You can also purchase the Neo, which also has 700-hour battery life but with only 2MB of RAM.

Much has changed between the Dana and the Neo. First, the Neo does not have backlight so you might need an external light source to use in low lighting conditions. A USB light cannot be used as the USB port on the Neo is not powered. Second, unlike the Dana which runs Palm OS supporting a wide variety of apps, the Neo runs its own proprietary OS with a very limited selection of apps, known as applets. The good thing is that the Neo Manager has 64-bit signed drivers so should not have any issues running it on 64-bit versions of Windows 8 or Windows 10. On the other hand, a third party 64-bit driver is required for the Dana to work on 64-bit OS.

AlphaWord Plus 3.4, the main applet, gives the Neo its purpose in life as a dedicated word processor.  There are also applets for control panel, calculator and beamer (a tool to send files via infrared). Depending on the device, you may also find Responder, MathFacts or AlphaQuiz, which are designed for use in a classroom context and useless on their own. By default, the device boots up with an applet chooser and you need to choose AlphaWord to start the word processor:

PXL_20210506_033204878

I found an SDK form betawise which allows developers to write third party applets for the Neo. The same website also provides NeoFontTerminal, a 5×7 font which allows AlphaWord the Neo to display up to 44 columns x 8 rows of text, instead of the default 6 lines. To install the applets, copy them to %LocalAppData%\VirtualStore\Program Files (x86)\AlphaSmart\AlphaSmart Manager 2\SmartApplets or C:\Program Files (x86)\AlphaSmart\AlphaSmart Manager 2\SmartApplets\ and start Neo Manager. You should then see the new applets shown under the SmartApplet tab. Take note that there should be other .OS3KOS or .OS3KApp files under this folder. If the folder does not exist, use something like Process Monitor to find our the exact path where Neo Manager is searching for the applet files, and copy the new applets there. The following screenshot demonstrates symbols and accented characters that can be displayed by the Neo using the custom 8-line font. To generate those characters, press Ctrl or Shift, followed by the correct key (e.g. 0..9 or A..Z). Refer to the Neo user manual for details.

PXL_20210506_034801207

This is the screenshot of EhBasic, a custom applet from betawise, running on the Neo. Simple but useful BASIC applications can be written using this applet using the documentation from the original author here.

EHBasic AlphaSmart Neo

EhBasic is case-sensitive and only accepts keywords in upper case, which is rather strange compared to other BASIC variants. There is no permanent storage of programs into memory, and codes will be lost once the device is powered off. It is definitely possible to study how to save the programs into the Neo memory slot and add this feature to EhBasic, for example by patching the LOAD and SAVE command. Meanwhile, RAM contents can be loaded and saved manually via the PEEK and POKE commands, if you know the memory location. If you do not know the location and poke the wrong memory address, this is what happens:

AlphaSmart Neo BSOD

The error message reads “Bus Error Accessing: XXX. Next instruction at: XXX. Write down the information above. Press DOWN for more help. Email the information to support@renlearn.com. Press UP to see the previous message”. The system will then freeze and you will need to power cycle the Neo. The text file contents in RAM are still maintained. I guess this is the Neo equivalent of an address trap.

Using the Debugging Tools applet from the website, I was able to inspect the Neo raw memory and locate the contents of the first text file around address 0x35E0:

AlphaSmart Neo Raw Memory Contents

The exact address varies each time the AlphaWord applet is reloaded, but is always below the 0x100000 (1MB) limit. The contents of the second, third, etc. text files will follow shortly after the text file. The message showed by AlphaWord before each file is opened, e.g. Opening File 1, is always found at 0x7FA60, at least one my device. Interestingly, if the file size is large, characters will no longer be stored in one contiguous block in memory, but rather in various blocks. At location 0x400000 the first few characters of the Neo Small ROM binary (OS 3KNeo Small ROM from file SMALLOS3KNeoROM.OS3KOS) can be found. Similarly, the first few bytes of the Neo ROM (System 3 Neo from file OS3KNeoROM.OS3KOS) can be found at 0x406000 and again at 0x46FFC0. In case you are not sure what Small ROM is, the Neo can be started in Small ROM mode to recover from a failed system update, refer to this article for details. Also, the entire ROM is not loaded into memory (not that there is a reason to in my opinion), so patching ROM cannot be done by simply modifying memory contents.

AlphaWord has a built in spell checker and thesaurus, which can be useful occasionally. Below is the screenshot of the thesaurus displaying synonyms for the word “stormy”:

AlphaWord Dictionary

The Neo also supports printing to a suitable USB printer. Similar to the Dana, the printer will need to register itself as USB device class 07h (for printers) for the Neo to even attempt printing. The printer will also need to support raw text, or preferably PCL, to be able to actually print any text. An office USB laser printer should work well, while a cheap inkjet printer will most likely not work at all. As the Neo USB port is not powered, the printer must not rely on the USB VCC line for operation. Cheap thermal printers power themselves via USB power, or use the presence of USB power to detect the USB host and will not work on the Neo. I have such a printer and can only make it work on the Neo by using a USB Y-cable.

In the Settings list for the System applet under Neo Manager software, you will find a Printer option. The Neo will use this option to generate the escape sequences (e.g. Epson escape codes or PCL) which will be sent to initialize the printer. The default is HP Laserjet/Deskjet, which should work with most office laser printers:

Alphasmart Neo printer settings

This is a sample printing output from the Neo on my Brother printer, which is just text from the documentation for the Debugging Tool applet:

AlphaSmart Neo printing output

As can be seen, the printout is in what is probably a fixed-width Courier font with double line spacing, wastes paper and looks ugly. To be fair, the Neo user manual is honest to the users about this and indicates clearly that the Neo does not control font settings on the printer. Still, the quality of the default printout leaves much to be desired and I decided to spend some time figuring how to at least change the default text font.

My first assumption is that the Neo sends some kinds of control codes, be it PCL or Epson escape codes, suitable to the type of printer currently selected. To prove this, I selected Canon and re-printed the same document on my Brother printer laser. Sure enough, the new printout looked gibberish with random symbols and overlapping lines. From this, I concluded that the Neo must have at least attempted to set PCL vertical line spacing, among other things, before printing. According to this reference, the PCL code to set vertical line spacing is ESC &l or 1B 26 6C. To see if the issue can be quickly fixed, I added the escape sequence to set the correct line spacing to the beginning of a text document, and used Neo Manager to transfer the text file. Disappointingly, although ASCII codes below 32 such as escape (27 or 0x1B) could be transferred to (and retrieved from) the Neo properly, these characters were lost during the printing process and replaced with ‘?”, so this approach could not be used to set the line spacing. I also found out in the process that although Neo Manager could send/receive accented characters (at least those supported by the Neo), its built-in text editor would not handle these characters. To view files retrieved from the Neo that have accented characters, use a text editor that can set the code page such as Notepad++. On my unit, these characters are displayed properly after setting code page 437, the character set of the original IBM PC, using Encoding > Character Sets > Western European > OEM US menu.

The only thing I could try now is patching the ROM. To do this, I searched OS3KNeoROM.OS3KOS for this byte sequence and located around five such sequences, among which the first occurrence at 0x39F00 was the most suspicious with the following entries:

1B 45 			- PCL Reset 
1B 26 6B 33 47		- PCL Line Termination (CR=CR+LF LF=CR+LF FF=CR+FF)
1B 26 73 30 43  	- PCL Line ending (Enable Line Wrap)
1B 26 61 30 38 4C	- Not sure what this is, does not seem to do anything
1B 26 61 37 30 4D	- Not sure what this is, does not seem to do anything
1B 26 6C 30 35 45 	
1B 26 6C 33 44		
1B 28 31 32 55		- PCL Font Selection, PCL PC-850 Multilingual

The sequence starts with resetting PCL, configuring line termination and ends with setting PCL character set, which makes sense to me. There are two lines beginning with 1B 26 61 which did not seem to do anything when I tested them on my printer. The last few lines beginning with 1B 26 6C are probably what I am looking for, and a quick test revealed that the second last line is the line that sets the vertical spacing. Changing it to 1B 26 6C 33 40 and the line spacing reduced significantly. The next task is to configure the printer to use a proportional font, instead of fixed width, which requires inserting 1B 28 73 31 50 or ESC (s1P somewhere in the sequence (use ESC (s0P for fixed width font, which is the default). The only way to do this without affecting the file structure is to replace one of the existing PCL sequences. For this I picked the 6th line which did not seem to do anything in my tests. The new escape codes are below – take note that the original escape sequence has 6 characters and we only need 5 so the last one is replaced with 0, which is simple ignored by the printer.

1B 45 			- PCL Reset 
1B 26 6B 33 47		- PCL Line Termination (CR=CR+LF LF=CR+LF FF=CR+FF)
1B 26 73 30 43  	- PCL Line ending (Enable Line Wrap)
1B 26 61 30 38 4C	- Not sure what this is, does not seem to do anything
1B 26 61 37 30 4D	- Not sure what this is, does not seem to do anything
1B 28 73 31 50 00 	- Set proportional font
1B 26 6C 33 40		- Line spacing
1B 28 31 32 55		- PCL Font Selection, PCL PC-850 Multilingual

After patching the ROM, the next step is to load it into the device. To do this, backup the original OS3KNeoROM.OS3KOS somewhere and replace it with your patched file. In your Neo Manager, open Edit > Preferences, check “Replace SmartApplets on device with SmartApplets from computer” and select “System 3.15″ from the drop down:

Neo Manager Settings

After that, connect your Neo and choose Setup > Reset all Neo devices which will install the patch ROM. You can also add something to the Send List and send it to the Neo, which will cause Neo Manager to install the latest ROM from the computer. When done, open the Preferences dialog again and uncheck the last option, otherwise Neo Manager will always attempt to flash the same patched ROM in future. Take note that the patched firmware is for System 3.15 US version only and similar steps must be done on other localizations or firmware versions. Also, the patched escape code works well on my printer but might need some tweaks to work with other printers. To test the escape codes, the best way is to use a Linux distribution such as Ubuntu and send raw text to the printer USB endpoint. If you are on Windows, raw printing is usually not allowed but can be worked around by sharing the printer on the network, mapped it via NET USE to something like LPT2 and use COPY CON from command line to print raw text file with escape codes. As usual, be very careful when flashing the firmware or else you may brick your Neo.

With the modified escape codes, printout quality has improved, with normal line spacing and proportional font. The text is much easier to read now:

AlphaSmart Neo Improved Printout

Still, one may notice that there is a huge right margin and assume that the quality can be further improved by finding some PCL escape sequences to set the right margin. Unfortunately, this turned out not to be the case. For one thing, the default margins on most printers are reasonable and back in the day, many software simply dumped text to the printer without sending any escape codes and the margin was never an issue. For another thing, on the original and patched firmware, the printed text wraps at exactly the same place, which is not the same as the text being displayed on the screen. PCL by itself has no support for word wrapping, only line wrapping (e.g. cutting off long lines in the middle of words if need be), so the premature wrapping produced by the patched firmware must have been done by the Neo itself. I counted and the text seemed to wrap at around 64 characters, indicating that the Neo automatically wraps longer lines, assuming a fixed width font is used. Because we use a proportional font which consumes less space, the right margin will be significantly increased as text is wrapped prematurely.

One way is to modify the firmware further and wrap text at, let’s say, 80 characters, and not 64 characters, Nope, I am not going to randomly modify any byte that looks like 64 in the ROM and hope for the best, without at least the ability to disassemble the 68000-based ROM source code and make sense of the output. The improved printout quality, meanwhile, is still good enough for me for occasional use. Any serious printing should be done on a PC instead.

By the way, if you want to disassemble the applets (.OS3KApp extension), use this Perl script to remove the headers first before passing it to your favorite tool. The link contains documentation for the applet file format. There is no documentation for the ROM (.OS3KOS) file format, although I suspect it also has a header, as Neo Manager is able to identify the version number (3.15) after reading the ROM file. I tried using various tools such as IDA but without knowing the entry point or the exact architecture, the decompiled output with just a bunch of 68000 instructions makes no sense to me whatsoever. Also, if after the firmware patch your Neo Manager insists on reinstalling the ROM every time despite unchecking the options, please uninstall and reinstall Neo Manager and try again or simply use something like neotools to manage the Neo instead.

All in all, the Neo is a great device for those who love to write while on the go, especially with its long battery life. The lack of a backlight was initially a bit of an inconvenience of me, but does not matter that much eventually as I can always use an external USB light. Ever since purchasing the Neo, I have been using it primarily for writing and the Dana is now only used occasionally.

The original and patched ROM files, the script to remove the applet header as well as Neo Manager can be downloaded from this link.

 

See also

AlphaSmart Dana, an almost perfect typewriter running Palm OS 4.1

0.00 avg. rating (0% score) - 0 votes
ToughDev

ToughDev

A tough developer who likes to work on just about anything, from software development to electronics, and share his knowledge with the rest of the world.

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>