Edenwaith Blog
29th December 2022 | Writing
DIGITAL SUICIDE
by Chad Armstrong - November 2014
The steady glow from the screen was the only source of illumination in the otherwise darkened room. The feeble light could barely make out the towers of boxes cluttering the room and the sole occupant sitting before the computer. A flurry of chiclet keys being pressed was the only evident sound, a noise portending the coming terminal doom.
Robert was dying. Not so much in the physical sense, even though his heart felt like it had been cauterized out by the soul-sucking entity called Corporate America. He was destroying his electronic avatars, one bit at a time. He was bit flipping his life. One moment he would be there, but with the flip of a switch he wouldn’t. Facebook was the first to go, with Twitter soon following. The crusty remnant of his MySpace page from ten years ago was still lurking around, but he had forgotten the original password. One password reset later, then digging about to find how to delete the account, and then the awful deed was done.
After so many years residing online, he had built up a number of digital personas, enough that he struggled to remember everything he had signed up for at one time or another. He had even once had a GeoCities page at one time, replete with annoying, animated GIFs. Yahoo had already euthanized that entire site of embarrassing starter sites which had been the home to so many teens in the 1990s who were constructing their first amateur web pages.
The computer, the very machine which had been the focus of his craft, the instrument of creation, was now being used as an implementation of destruction. His life was in shambles, he was now just tearing down what little still remained. The road had become rocky over the past several years, which finally halted at the dead end of today. There was no future path in that direction, it was time to backtrack and start over.
The journey had initially begun as an exciting endeavor, enticed by the new possibilities offered by emerging technologies. Young and impetuous, he was eager to make a dent in the universe. After fifteen years of the game, he was seeing the same play reenacted, just with a change in the cast. Companies continually sparring against each other. Competing. Cheating. Stealing ideas and making bold claims of innovation. To fuel the fire of controversy were the legions of fanbois, loudly thumping their chests and claiming their position superior to all others. They might all make excellent politicians one day; if they could find their way out of their parents’ basements, that is.
Robert had had his own time, especially during the early years, espousing the benefits of his preferred web browser or operating system. Now, he didn’t care so much. Age and experience had knocked the blinders off, so he could finally step back and objectively look at the world. Nothing was perfect. One product might have advantages over another, but that did not denounce the competitor as wholly wrong.
As he got older, and occasionally picked up a nugget of wisdom along the way, he realized that time was no longer an infinite commodity, but a very finite and precious resource. Whether he liked it or not, time was continually spent, which made it all the more critical that he made good use of it. Wasting his time, energy, and patience arguing with thirteen-year old boys on the internet was no longer entertaining. The game had become trite and boring.
The daily motions of work and school had become well engrained and automatic. Grade school with its rigid structure was merely the prelude to a corporate world filled with bureaucratic rules and starched, white shirts. The fire in his gut that had spurred on his natural curiosity to explore the ever-burgeoning technological landscape had been quenched after so many years of corporate monotony. The passion that had fueled his earlier academic endeavors had been reduced to the faintest ember.
Year after year, he had continually strived to better himself, keeping his skills finely honed. If he ever faltered or dared to take a break, he would lose his competitive edge and be supplanted by some recent fresh-minted college grad who had nothing to their credit besides unbound enthusiasm and fewer chips on their shoulders.
Technology was quicksilver, perpetually reinventing itself every couple of years. There was no solace in settling with a single niche technology, since it would most likely be obsolete within a couple of years. Rewards were only dolled out to those who kept ahead of the curve and ended up in the right place at the right time — if the particular technology caught on with the mainstream. Otherwise, one might have just wasted their time.
The never-ending cycle had worn him down and made him eternally weary. He no longer had the energy to keep sprinting through the marathons. He had worked the grueling death marches to meet some arbitrary goal.
But no longer. He would no longer subject himself to such pointless exercises of torture.
In the end, it was all for naught. All those years, professionally nodding his head in agreement with managers who were limited by the Peter Principle, too ignorant to realize their ineptness, and too stupid to understand the idiotic decisions they made. Yet, blinded by their own misguided brilliance, they brazenly ignored the advice from anyone but their favored cadre.
Robert had not been in that particular group of ordained rock stars, so it came to little surprise when he lost his job. It didn’t matter a single whit all of the nights, weekends, and even holidays he had worked. It’s not Labor Day if you don’t put in 10 hours of labor! He wasn’t the best or fastest worker, he knew that, but he had always put in his best to ensure that the job was done properly. But he didn’t deserve the treatment he had received in the end when the axe came down. The managers needed a scapegoat to sacrifice, and he fit the bill. By getting rid of him, all of their problems would suddenly go away. Robert knew differently, though, their problems wouldn’t just ‘go away’. The company was rotten straight down to the core, and no amount of slicing or dicing of innocent employees would ever fix the company’s true problems. Not until the company had undergone a management enema would there even be the slightest change for a positive turn of events. Not that he harbored any false hope that would ever happen, especially not with the lunatics already running the asylum.
To hell with all of it. He was sick of the high school politics. The blatant favoritism. The shiny, gold rock stars. Since he wasn’t in the proper clique, he didn’t matter. Robert could have told the management the building was actually on fire, but they wouldn’t have believed him unless one of their valued toadies confirmed the fact that the building was indeed, on fire.
Another rapid succession of key strokes. Another account gone, marking a chapter of his life that had come to an end.
The fire had been ignited by the fury of his anger, but he intimately realized that he was wasting his hate on the simpletons who had cast him aside. He wasn’t the first, nor would he be the last. In an intoxicating dream of Americana, employees were loyal to the company, and the company would take care of the employees in return.
Company loyalty was an ancient concept, long dead and gone. Companies were always willing to let their employees work their way down to their hypothetical bones, before tossing off their withered husks to the winds of unemployment. There would always be more resources to draw from. The universities kept churning out new batches of eager grads, anxious to make their mark on the world. A mark that could just as easily be wiped away, without the slightest trace of it ever existing.
Robert had spent years etching his digital signature across the internet, but it was going to be his own hand that would erase it, not that of some soulless entity. Next up were the source code repositories. Several minutes of work, and all of the contributions he had made on GitHub and SourceForge were obliterated. He wasn’t just eradicating his presence, but taking everything he had created, as well.
Day in, day out. Weeks and months rolled over into years, which bled into decades. Then one particular job, Robert found himself to no longer be the confident upstart who was intimately familiar with the latest and greatest of technologies, but now found himself to be closer to the cynical graybeards he had once mocked.
Where do all the old programmers go? A common question, but left without a proper answer, one that Robert would have liked to have known. Programming was an endeavor best left to the youth who had spare energy to burn. He had burned the candle at both ends for too many years, leaving a sodden, waxy mess in its wake.
Since he was effectively removing his online presence, he figured he might as well do the same for his physical self, as well. It was well past time to disconnect from the rat race of society, decompress for several months and focus on more leisurely pursuits, rather than spending his days ferreting out software bugs.
Finally seeing things with a crystal perspective, he observed the desolation of years gone by with little to show for all of his efforts. Like Thoreau, he was going off the to the woods to live deliberately, so that when it came for him to die, he could claim that he had truly lived, and not squandered his life on petty frivolities.
Perhaps now was the moment for a well-timed mid-life crisis. He had been traveling on the same career path for so long that he had never taken the time to consider other options. The further he traveled down the road, the more difficult it became to start over. But that might be the best thing for him, to begin anew. Cast off the chains off a former life, and embrace the excitement of a new venture.
It was time to get back to the basics. Remove the technological hurtles and simplify life. Thoreau had his pond. Robert had his mountains.
He had always loved going to summer camp during his youth. It was the one week out of the year where he could extract himself from the rut of daily life and live in a more carefree fashion. It was a time of reinvention where the other kids had no preconceptions about him, which allowed him to be whatever type of person he desired. It was blissful freedom, the type that was not offered by the constraints of his normal life. A small valley of paradise was surrounded by mountains, which formed an impenetrable barrier around an idyllic alternate reality based on faith, hope, and charity. It was time for him to return to nature.
His severance package had not been overly generous, but he wasn’t going to be overly hurting for money for the next several months. He had rented out a small cabin at the camp, where he would spend the summer relaxing by reading and playing guitar. His life had been so consumed by his work, leaving him exhausted each night, that he rarely had the time or inspiration to pursue the hobbies of his youth.
This was his declaration of personality bankruptcy. By wiping away his past and allowing for a time period of adjustment, he would rise from the ruins to begin a new life.
The laptop’s dim, TV-static light cast an ghostly pall throughout the room, outlining the pillars of boxes which contained nearly all of Robert’s possessions he had slated to go into storage. Only a small pile of books and a guitar remained unpacked. The light was too weak to read the book titles, but Robert knew which titles he had carefully selected that would be taken on his sojourn: Fahrenheit 451, Walden, and a Led Zeppelin tablature book.
Now for the final account, his e-mail address he had used longer than any other. Tens of thousands of e-mails, perhaps even hundreds of thousands, each message detailing a small figment of his life. All of those correspondences and memories, to be wiped out by a single motion. His finger hovered over the DELETE key, momentarily pausing like a guillotine blade.
A single soft click heralded Robert’s demise. His digital presence was gone, wiped clean away. Bit flipped to 0. Zero, nil, the empty set. He was expecting a wave of regret to smack him smartly upside the head, but it never came. With his past now a memory intended for the dustbins, Robert readied himself for his new future. He had purified his mind by releasing the past to allow for new memories to flood in.
As the computer prepared itself for shutdown, Robert picked up the books and guitar. The computer’s grey screen winked out, cloaking the room with darkness.
28th December 2022 | Games
Welcome back for another post about the Quest for Glory computer game series. This one will revisit Quest for Glory V: Dragon Fire, covering various releases, tidbits, and other interesting details (and less about fighting technical issues like last time I wrote about this game).
Related QFG articles:
QFGV Box Variants
As evidenced in Stephen Emond's Sierra Collector's Quest volumes, there were many variants of Sierra products over the years. This collection is just a subset of what was released for Quest for Glory V:
Back: (L to R)
- German version (Drachenfeuer)
- Original US version I bought back in late 1998
- UK version
Front: (L to R)
- Spanish version
- Italian version : Despite the many variants recorded in the Quest for Glory volume of the Sierra Collector's Quest collection, this yellow version was not shown in this book, which is likely a sign of how many versions can be made, and how incredibly difficult it can be to catalogue every version.
- Benelux version (descriptions in Dutch and French on the back)
Side note: I purchased the Polish QFG collection which has the "Hero's Blade" cover, but the CD only contains the first four QFG games, despite the cover being from the fifth game of the series. I initially thought that this was another variant of QFG5. When I looked at the system requirements (486 processor, 8MB of RAM, x2 CD-ROM), it tipped me off that this wasn't what I had originally expected. Stephen Emond's book about the Quest for Glory variants confirms that this is just the Polish version of the traditional QFG collection. I am not aware of any boxed collection which contained all five QFG games, since most of these collections were released in the mid-1990s, a few years before QFG5 was released in late 1998.
PowerMac G4 Setup
This is a game which takes a little more setup since it came out during that odd era of the late 90s (Windows 9x/Classic Mac OS), so it isn't as easy to play this game as those games which were developed with the SCI engine (thank you DOSBox and ScummVM). In my previous QFG5 post, I contemplated investigating Sheepshaver further, but instead I upgraded my PowerMac with new RAM, a better set of speakers, a new mouse, and an SSD drive.
PowerMac G4
My main workhorse for many years, which is able to run every version of Mac OS from version 9 through 10.4. When I initially purchased this computer in 2001, I was deciding between this and a G4 Cube. As stylish as the Cube is, I'm glad I ended up going with the PowerMac, which has had numerous upgrades, including a Zip drive and two larger hard drives. The expandability is a key reason it has survived so long.
512 MB PC100 SDR SDRAM
After the multitude of problems I experienced five years ago, I needed to replace the bad RAM stick. It had been awhile since I'd purchased new RAM, and it looked like my old sources (RIP Ramseeker and 1-800-4-MEMORY) are no longer around. Fortunately, OWC had me covered for some new RAM. I certainly didn't need the extra RAM, but there is something satisfying about bumping the computer up from its original 64MB of RAM to 1.75GB of RAM.
Fortunately, replacing the RAM resolved the issues I experienced previously. There were only one or two crashes experienced throughout the game. I had a few cases where it initially looked like the game crashed, only to find that Mac OS 9 decided at that point to start indexing the hard drive. Ah, the joys before proper preemptive multitasking.
ADC Display 15”
I splurged and bought a refurbished one of these monitors (from the now defunct PowerMax) when I was a poor university student, and it is still an amazing monitor. I even used it as a daily supplementary monitor until recently (had to convert from ADC to DVI to USB-C, but it worked). Prior to USB-C, ADC might have been the only single-cable option which could provide video, power, and USB through a single connection on a Mac. The power button on the monitor is also very handy, especially since I don't have a keyboard with a power button on it any longer.
ATI Radeon 9000 Pro Mac Edition
An upgrade from the default ATI Rage 128 Pro (16MB VRAM) video card to 128MB DDR VRAM. Includes both ADC and DVI ports.
Logitech Wheel Mouse
This is the type of mouse I would have been using 20 years ago. I used the Logitech MouseWare driver software to switch the middle and right mouse buttons, so right-clicking would correspond to right-clicking in the game.
Harman/Kardon SoundSticks III
I saw the Harman Kardon SoundSticks IV at a Micro Center and initially thought this was some retro-style callback product from twenty years ago, only to discover that this was the fourth model of a continuing line of speakers. These were more modern and included Bluetooth, which did not interest me for my retro computer setup, but a standard 3.5mm line in would work just fine.
Years ago, I had some JBL Creature speakers, which sounded great until the satellite speakers died. I purchased a used set of these speakers, but the satellite speakers didn’t work. After a bit of research, I discovered that there's a known issue with the magnets coming loose. I even tried to find a fix, but it would be tricky in finding proper replacement speakers. I then looked at some Apple Pro Speakers. I fortunately did not find any, because my PowerMac is one year too old to power and run them effectively.
Since the other options weren't panning out, I took at look at the SoundSticks again, and discovered that the model III was still available for sale on Amazon, and at a much more reasonable price versus the IV's $299 price tag. The SoundSticks III look great, sound great, and made the magnificent QFG5 soundtrack soar.
Matias Tactile Pro 4 Keyboard
I started using the model 1 about fourteen years ago, which also had the power button on it. This time around, I'm using the fourth generation, which also contains a keypad, very useful for combat in this game.
120GB OWC Mercury Pro Legacy
I purchased one of these to help future-proof this machine by being able to equip the PowerMac with an SSD drive in case any of the existing hard drives die. Mac OS 9 doesn't handle partitions larger than 80GB (or perhaps a little larger), but most new 3.5" hard drives tend to be in the 1TB+ range. I haven't installed it yet, I'll need to copy over the data from one of the other drives, but it will be interesting to see what type of speed increases I might see.
Batch Renaming PICT Files
In preparation for this post, I took a number of screenshots from the PowerMac G4, and then copied the files over via a USB thumb drive to a modern Mac so I could convert the images to a more modern format.
While many things have changed over the last several decades, some things have remained the same. As it was with Mac OS 9 and even up to today, the keyboard shortcut to take a full screenshot is Shift-Command-3. The primary difference is that Mac OS 9 saved the image in the PICT format, whereas the modern macOS saves as a PNG. However, when moving the Mac OS 9 screenshots over to a modern version of macOS, there is no file extension and macOS Ventura doesn't recognize the file and assumes it to be a UNIX Executable File. Mac OS 9 identifies them as SimpleText files (since the program SimpleText is used to open those screenshots), but they are the older image PICT format. By just adding a .PICT extension, macOS can properly identify the files.
The next step was to convert the PICTs to a more web-friendly PNG format. Since there were a decent number of files to convert, I used a short script from the command line in macOS Ventura 13.0.1, which uses the zsh shell.
for i in *; do sips -s format png $i --out $i.png;done
Running this command iterated over the directory of PICT files and created a PNG version of each image.
Other Oddities and Things of Note
After multiple playthroughs of a game, one finds little oddities and inconsistencies, as documented with the following screenshots:
Three-Way Tie
When I completed the first Rite, I freed all five of the fishing villages. The primary goal is to be the first person to free their village and return with the town's sigil. If one is not fast enough, then Gort can win this Rite. An extremely odd thing happened this time around when I spent several days freeing all of the villages, the game claims that Magnum Opus also freed his village, which resulted in a three-way tie.
Difficult To Find Monsters
There are around twenty types of enemies to fight in the game, and some of them are a little more difficult to find, whether they are found only in certain locations or at night. The Weirdings I only found near the island of Delos, and they came with some great loot of Magical Chain Armor. The Salamander I don't ever recall finding before because I hadn't done too much swimming in the ocean besides near Silmaria.
Poisoned Tea
In the game, the (SPOILER) scientists poison several wizards with a tainted box of chocolates. However, there is a line where Shakra mentions that Erasmus was poisoned via his tea, which is inconsistent with the rest of the story. I'll assume that this was a change in the story, and that one line slipped through. Also notice how in this game, the rat's name is spelled as "Fenris", but in the previous QFG games, it was spelled as "Fenrus".
Spelling Inconsistency
Speaking of spelling inconsistencies, another one appears in how to properly spell the name of the island Lymnos/Limnos. On the map, it is spelled "Lymnos", but the in-game dialogue and description spell it as "Limnos".
Poe Poetry
Quest for Glory 4 had numerous Edgar Allan Poe references, and while QFG5 does not contain the gothic atmosphere of the prior game, at least one more nod to Poe made it in. When looking at one of the underwater statues, there is a line which comes from the poem To Helen — To the glory that was Greece, And the grandeur that was Rome.
Unlucky In Love
Neither Erana nor Katrina seem to appreciate it if the hero has been a little too friendly with Nawar. (Odd how they know, considering they don't leave their respective islands.) Elsa doesn't seem to care, though.
Extra Quirky Messages
Quest for Glory games contain a lot of silly jokes and descriptions, and QFG5 does not have a shortage of those, whether it be an Alfred Hitchcock reference or some in-joke that might only make sense to the game developers.
Thoughts About QFG5
- The QFG series introduced an interesting Adventure-RPG hybrid, yet the original QFG5 game box classifies this as an Action-RPG (however, the UK box says Adventure-RPG). So, is this still a QFG game? Absolutely. It ties in and ends a series which had originally been planned as a four-part series, but was stretched out to five games (pentology?) with the inclusion of QFG3. The same cannot be said of King's Quest: Mask of Eternity, which barely had any ties to the previous KQ games. It is the logical conclusion of the series, representing West and winter. A number of previous characters and references to the other games are also present (Erasmus, Fenrus, Erana, Katrina, Rakeesh, Salim, Julanar, Elsa, Bruno).
- It is different from the other games in that it is more of an Action-RPG hybrid than an Adventure-RPG hybrid. It is definitely much stronger with the fighting and typical RPG elements, especially with a larger variety of weapons and armor (whereas the previous games kept these fairly limited), and a large variety of monsters. Perhaps they focused a little too heavily on some of these aspects of the game, and not as much on others. But considering how there have been monsters axed from final games (such as the Hyenamen from QFG3), perhaps it was a bonus to have a variety of monsters, or perhaps creating a variety of monsters (Boarmen vs. Goremen) were similar, more variants than truly unique monsters. In QFG5, there were at least twenty different opponents (not including the arena combatants). For a comparison, QFG1 had ~10 types of monsters: Saurus, Saurus Rex, Troll, Ogre, Minotaur, Bear, Goblin, Brigand, Mantray, Cheetaur (7 of these being common monsters, three are one-time encounters).
- Makes it up to the Thief for shorting that class in QFG3, with plenty of things to do in this game, and it ties up the whole Blackbird mystery.
- Once again, the Fighter is somewhat ignored and doesn't even get the bank robbery side quest. However, this game is action and fighting oriented (so not possible for a 100% pacifist run). The arena combat and plenty of rites involve fighting, plus a plethora of monsters.
Tidbits
A few tidbits straight from the creators of QFG via their Twitch channel, the original QFG5 website, and other nuggets dug up across the internet:
- The original title was going to be King's Crown.
- If QFG5 had come out right after QFG4, they would have kept with the QFG4 style of graphics and combat system.
- A wizard mini-game was planned to earn the Whirlwind spell by playing some Wizard's Whirl, but it was scrapped. It might have been something similar to how the Magic User can learn the Dazzle spell from Erasmus after winning a game of Mage's Maze in QFG1/HQ.
- When I first learned about QFG5 being in development, it was originally slated for release in Summer 1997. Even at this time, that release date seemed far too ambitious, since game development often gets delayed for a myriad of reasons. Reading the designer diaries from the QFG5 website confirmed my suspicions that they were no where near to release the game in mid-1997.
Back in mid-October 1997 the 3D Max artist John Lindemuth was still contemplating how to animate a water-breathing amulet (so much for a summer 1997 game release). A designer diary from lead systems designer Eric Lengyel mentioned adding lighting effects and how great it would be to see 16-bit color would look in a future Sierra game. Good news, that "future Sierra game" ended up being QFG5. Interesting to look back at various snapshots of a project's progress and see how things shook out. Adding the dynamic lighting and 16-bit graphics added another 6 months of development to the game, but it was well worth the end result. Considering that the early 3D games of the 90s often did not age well, QFG5 fared far better with many rendered objects and dynamic lighting.
Hacks and Updates
QFG3 and QFG4 have received new fan-made patches in the past few years (in addition to the indispensable NewRisingSun patch), and QFG5 has also received its own new patch for Windows. According to the notes, it fixes a number of bugs (especially for non-English versions of the game), plus it fixes some issues when playing through the game as either Elsa or Magnum Opus, who were playable characters in the demo, but were only NPCs in the final game.
Speaking of Elsa and Magnum Opus, when I was digging through my Mac to look at all of my QFG5 saves and determine how many times I've completed this game (at least 8), I found some Elsa and Magnum saves dated November 28, 1999. These are likely hacked saved games to play as either Elsa or Magnum as each of the four classes. There were plans to allow for multi-player capabilities, and between the patch and these save games, it should be possible to play through the game as one of these others characters.
15th December 2022 | Programming
With the release of the Playdate
this year, it has further rekindled my interest in graphics styles of an older era. Or are they just older graphics implementations for the modern age? Even though modern electronics have been able to push 16.7 million colors on high gamut displays for a long time, there is always a market for small, simple, and inexpensive displays. While the 1-bit display on the Playdate delivers a hefty dose of nostalgia (along with a ton of fun), it has been exciting to see what developers have been able to do with limited graphical constraints. This led me back down a deep rabbit hole of to research ancient dithering algorithms and color spaces to create the second version of the Agifier plug-in for Acorn.
What's new with Agifier 2.0
- Implemented Floyd-Steinberg dithering. This was a critical missing piece in trying to simulate a more complete image while using a limited color palette. There are many different dithering algorithms available, but I settled with one of the most famous ones.
- Experimented with the CIE Lab color space. As Tanner Helland mentions in a blog post, using the CIE Lab color space might work better than just comparing against RGB, but I did not get any better results than using either RGB or my own custom selection method.
Screenshots
Original Image
Agifier 1.x
Agifier 2.0
Agifier 2.0 using CIE Lab Color Model
Download + Installation
- Download: Download the files directly from GitHub or install via git with the command
git clone https://github.com/edenwaith/Agifier.git
- Installation: Copy the
Agifier.acplugin
plug-in bundle (found inside the Agifier folder) into ~/Library/Application Support/Acorn/Plug-Ins
folder on your computer. Create the Plug-Ins
folder if it does not exist yet.
- Usage: Restart Acorn after copying over the plug-in, then open a file and select the Filter > Stylize > Agifier menu. This will reduce the size of the image and reduce the color palette down to the standard 16 EGA colors that were used in Sierra games.
Future Work
- Continue exploring better selection for colors, especially in regards to green, perhaps experiment with additional color models. Unfortunately, the human's perception of color does not always align with the math of finding the "closest" color, so a lot of the greens get washed out and turn to more muted greys and browns. This is partially due to the human eye being more sensitive to greens, but not as much with blues. I did add another example for trying to select colors (modified Euclidian method), but it didn't seem to help much.
- Use different dithering methods to see if the results come out any better or worse.
- [Far Off Future] Implement Machine Learning (ML) methods to determine the best way to make a proper EGA representation of an image. Perhaps implement checkerboard dithering patterns to simulate certain color areas (in the style of SCI0-era Sierra games of the late 80s).
References
20th October 2022 | Programming
In my research for developing for the Playdate and for improving my Agifier plug-in for the Acorn image editor, I've been delving deep into the academic and artistic aspects of dithering. This article lists a number of the resources I've used so far in my research in regards to dithering and digital halftoning.
Links
White Papers
Books
9th July 2022 | EdenList
After reading an
article about making a "satisfying checkbox", I was inspired to add a little extra fun and delight to EdenList by adding some haptic feedback when tapping on a list item (an effect I had once added to another now-defunct iOS app). I wanted to add something else to this patch release, so I added the large title display feature (introduced in iOS 11), which was very easy to implement, but it would require bumping up the minimum version of iOS and dropping support for iOS 10. Since any device that can run iOS 11 can also run iOS 12, I raised the minimum version to iOS 12. This was the initial work for what was expected to be version 2.2.1.
I tend to be cautious about bumping up the minimum version of an app, and requiring iOS 12 for just a patch release didn't seem worth it, so I decided to add a larger feature by being able to search through the main list of lists. I've found this to be useful if you have a lot of lists and want to quickly find a particular list or few (such as all "to do" lists). By adding this additional feature, it bumped up the app version to 2.3.0.
New features in EdenList 2.3.0 for iOS:
- Search and filter by list names
- Haptic feedback when selecting list items
- Updated UI with larger titles
- Verified and tested with iOS 15
- Note: Now requires iOS 12+
EdenList for Mac
A benefit of the newest Macs running on Apple Silicon (instead of Intel chips) is that they can also run iOS apps. Even though EdenList for Mac has not been updated in a dozen years, the iOS version can be downloaded and run on Apple Silicon Macs (M1 chips and beyond). I have done a preliminary test to verify that the iOS version does run on Apple Silicon. Not a perfect solution, but it does work.
An update to the original Mac version is slowly in the works to make it 64-bit and as a new type of Universal Binary (Intel/Apple Silicon instead of PPC/Intel) so it will work on modern Macs. The current 1.0 version will only run on versions of macOS from 10.4 through 10.14. This is proving to be more work than initially expected, primarily because the codebase hasn't been touched in a dozen years, and some of the code dates back to even 2003, so it definitely needs some clean up, improvements, and the removal of deprecated methods. I'm hoping to eventually rework EdenList into a more unified app (using Mac Catalyst, SwiftUI, or whatever) to provide the functionality across multiple platforms so the Mac version doesn't get left so woefully behind.
EdenList 2.3.1 for iOS
9 August 2022 update: I tend to only update EdenList on a yearly basis, but an astute user of EdenList notified me of a very long-standing (and cleverly hidden) bug in EdenList where if a list name contained a /
in the name, then it would not properly save any data to the list. I fixed this issue so list names can no longer contain that slash. I also made a small UI update for the search bar for iOS 12.
New improvements in EdenList 2.3.1 for iOS:
- Bug fix for naming lists
- UI improvement for iOS 12
4th May 2022 | Programming
Twenty-one years ago I created an AppleScript to serve as an installer for Quest for Glory V on Mac OS 9. This was created because the original installer did not work under Mac OS 9 (but oddly enough, the installer that comes with the German version ("Drachenfeuer") of the game worked fine). This script was based off of advice I got from QFG5's lead programmer Eric Lengyel on which particular files need to be copied off of the install CD.
AppleScript is always kind of interesting to play with. Some things are quite elegant, whereas other things can be quite maddening in their implementation. The original script was far from a piece of beautiful coding prose, since it was likely produced by recording my actions using Script Editor. This updated version (1.1) of the script is a complete rewrite with several improvements and safe guards.
- Checks for an appropriate destination: It first checks if the
Applications (Mac OS 9)
folder exists. If not, then it looks for the Applications
folder. If neither of those options exists, then the game is installed on the startup disk.
- First checks if any of the destination folders already exist before trying to create them.
- Checks to see if the
QG5 Install
CD is inserted. If not, the installation shows a warning and will not progress.
- Extends the timeout period to complete the script when copying the files so AppleScript does not give an errant error.
The installer script can be downloaded here.
The list of files which are copied over:
- From the QG5 Install/Install folder, copy the folders MDATA, Import, and the file QFG5 to the Quest for Glory V destination folder
- From the QG5 Install/Install/Data folder, copy the files hdn.spk, hdnm.spk, and the folder Mov to the Quest for Glory V/Data destination folder
One feature I wanted to implement with this script was to be able to copy the QFG5 icon onto the main destination folder, but I have not found a way to do this in Mac OS 9. There is a way to do this in Mac OS X which requires "System Events", but unfortunately that is not available on Mac OS 9, so the function below won't work for this script. The following is an example code snippet that can copy the icon of a file and paste it onto a folder.
tell application "Finder"
set sourcePath to file "Snow Leopard:Users:chad:Pictures:L-150.tif"
set destPath to folder "Snow Leopard:Users:chad:Desktop:Foo:"
my CopyOrPaste(sourcePath, "c")
my CopyOrPaste(destPath, "v")
end tell
on CopyOrPaste(i, cv)
tell application "Finder"
activate
open information window of i
end tell
tell application "System Events" to tell process "Finder" to tell window 1
delay 0.25
keystroke tab -- select icon button
delay 0.25
keystroke (cv & "w") using command down (* (copy or paste) + close window *)
end tell
end CopyOrPaste
It's been five years since I've played Quest for Glory V, and this is the first of several QFGV-related projects I'm planning for this year. There's also a fan-made patch for the game to try out, in addition to setting up my ideal PowerMac system when I replay the game this year.
28th April 2022 | Programming
Since the classic days of Mac OS, the Desktop has been the traditional dumping ground for a variety of files and folders. When one takes a screenshot, the Desktop is the default location where to save it, but it is possible to change where screenshots are stored. A couple of quick commands will help clean up your Desktop so it isn't populated by quite so many screenshots.
Mac Screenshots
If you have macOS Mojave (10.14) or later on your Mac, the location can be set using the Mac's built in screenshot functionality.
- Press
Command + Shift + 5
- Click on
Options
- Pick one of the listed folders or choose
Other Location
. For my purposes, I selected the folder Screenshots
in my Pictures
folder (~/Pictures/Screenshot
).
However, if you are not using macOS Mojave or later, you'll need to use the Terminal. The following commands sets the Mac's default location to a folder named Screenshots in the Pictures folder:
defaults write com.apple.screencapture location ~/Pictures/Screenshots
killall SystemUIServer
To read the default setting:
defaults read com.apple.screencapture location
If the location value has not been set yet, you'll see this response:
defaults read com.apple.screencapture location
2022-04-25 11:02:26.195 defaults[6668:108767]
The domain/default pair of (com.apple.screencapture, location) does not exist
Or check all of the com.apple.screencapture
settings.
% defaults read com.apple.screencapture
{
"last-analytics-stamp" = "672074805.851666";
"last-selection" = {
Height = 945;
Width = 433;
X = "-1201";
Y = 118;
};
"last-selection-display" = 1;
style = selection;
video = 1;
}
After setting the location:
% defaults read com.apple.screencapture location
~/Pictures/Screenshots
% defaults read com.apple.screencapture
{
"last-analytics-stamp" = "672074805.851666";
"last-selection" = {
Height = 945;
Width = 433;
X = "-1201";
Y = 118;
};
"last-selection-display" = 1;
location = "~/Pictures/Screenshots";
"location-last" = "~/Pictures/Screenshots";
style = selection;
target = file;
video = 1;
}
iOS Simulator
If you are a developer who often saves screenshots of the iOS Simulator, it also has its own setting where to save the snapshots. Changing the location where the iOS Simulator saves screenshots is fairly similar to the approach to saving macOS screenshots when using the Terminal. The Terminal command to change the default location where the iOS Simulator saves screenshots:
defaults write com.apple.iphonesimulator "ScreenShotSaveLocation" -string "~/Pictures/Screenshots"
To verify, run:
defaults read com.apple.iphonesimulator "ScreenShotSaveLocation"
This should then reveal the location where the screenshot will be saved (e.g. ~/Pictures/Screenshots
). Like the Mac example, if the location hasn't been set yet, you will get a response like this:
% defaults read com.apple.iphonesimulator "ScreenShotSaveLocation"
2022-04-26 19:52:49.189 defaults[20441:18169586]
The domain/default pair of (com.apple.iphonesimulator, ScreenShotSaveLocation) does not exist
References
20th February 2022 | Games
The previous article about the Logitech CyberMan 3D Controller listed a number of games which worked with this unique peripheral. The CyberMan came with four demos: DOOM, Body Adventure, Shadowcaster, and Terminator: Rampage to showcase what its extended functionality could provide in games. This post will briefly cover these demos plus a couple other products such as the Mechwarrior II: The Clans demo and several SSI games.
Note: To ensure that the CyberMan is recognized, any other mouse drivers need to be disabled first. In my initial tests, the DOOM demo worked without any modifications, but none of the other products displayed any of the CyberMan's extra functionality. I ended up going into the autoexec.bat
and commented out the code which loaded the CuteMouse driver, which left only the Logitech 6.31E driver to be loaded.
The autoexec.bat
file configuration:
SET GALAXY=A220 I5 D1 K10 P530 T6
SET BLASTER=A220 I5 D1 T4
@ECHO OFF
rem C:\SOUND144\UTILITY\AZCAL.EXE
PROMPT $P$G
PATH C:\WINDOWS;C:\DOS;C:\
PATH %PATH%;C:\CYBERMAN
SET LMOUSE=C:\CYBERMAN
C:\CYBERMAN\MOUSE DUAL
SET MSINPUT=C:\MSINPUT
REM LH C:\MSINPUT\MOUSE\MOUSE.EXE /Q
REM LH C:\MOUSE\CTMOUSE.EXE
rem LH C:\PBTOOLS\VGAUTIL\CLMODE.EXE t640=60 t800=60 t1024=87 t1280=87
REM LH /L:0 C:\DOS\SMARTDRV.EXE 1024 512 /X
LH C:\PBTOOLS\VGAUTIL\TSRFONT.COM
LH C:\DOS\MSCDEX.EXE /D:MSCD001 /L:D
SET DIRCMD=/O
SET TEMP=C:\PBTOOLS\WINTEMP
SET WINPMT=[WINDOWS] $P$G
SET SOUND=C:\SOUND144
REM WIN
REM TYPE C:\NAV30\EXIT2.MSG
DOOM
Of all the titles which supported the Logitech CyberMan, this is the granddaddy of them all.
Without any additional configuration, the CyberMan worked right out of the box with this demo, proving that the device worked properly. It's possible to turn, strafe, move, and fire with the just the CyberMan, but the experience isn't great. I still prefer the standard keyboard+mouse combination, but I imagine with enough practice, one could get adept at using the CyberMan for the quick-twitch reactions in DOOM.
There's also a source file which indicates that Heretic (a game based off of the DOOM engine) also supported the CyberMan. I haven't tried this, but I would assume it plays in a similar manner to DOOM's controls. Further investigation will be needed to determine how many games based off of the DOOM engine also supported the CyberMan.
Quest for Glory: Shadows of Darkness (QFG4)
This is the game that started it all for me to check out the CyberMan. I ended up going down many paths in an attempt to get the CyberMan to work with a modern Mac and emulation software like DOSBox, ScummVM, or VirtualBox, but with no luck. I even bought a serial port card for a PC and installed that, but without proper drivers (the initial drivers were intended for DOS 6.22 and Windows 3.11), a modern version of Windows only identifies the CyberMan as a simple 3-button mouse. Once I obtained an era-appropriate computer (Packard Bell Legend 814CD), I was then able to get the CyberMan to work with these games.
As I mentioned in my comparison between the floppy disk and CD versions of this game, only the floppy disk version had support for the Logitech CyberMan, whereas a flyer included with the CD version explicitly mentions that it no longer supports that peripheral.
The CyberMan works decently with this game. The middle button seems to enable a stabbing/thrust attack instead of a swipe. I do not recall seeing this with normal mouse, so this is either something special with the CyberMan, or I had never tried this, or perhaps it's something unique with the floppy disk version. If batteries are inserted, there is some tactile feedback when the player is attacked. Against weaker enemies, such as the Vorpal Bunny or Badders, there is only a small buzz, but against bigger enemies, getting attacked will result in a larger vibration. It's more of a novelty feature than a truly useful addition, but the concept also extended to the N64 rumble pack and much more effectively in the eighth generation of game console controllers.
Here are some images of the CyberMan ad which came included in the purple box version of Quest for Glory: Shadows of Darkness.
I have a number of other topics planned about the floppy disk version of QFG4 and CyberMan, but those will be reserved for a potential future post.
Body Adventure
This is not a traditional game, but an educational product to learn about human anatomy. It was developed by Knowledge Adventure, which focused on educational titles. Knowledge Adventure would eventually be acquired by CUC International, the same company that acquired Sierra On-Line. Of all of the products I have tested, this worked out the best with the CyberMan by making use of the controller's 3D aspects to rotate a wireframe organ (e.g. stomach, heart, etc.) in all three dimensions. This demo was added with the CyberMan to replace the Mechwarrior II demo which was originally intended to be included.
According to the wiki page:
On November 25, 2014, five Knowledge Adventure titles were re-released digitally as DRM-Free exclusives on ZOOM-Platform.com through a partnership between JumpStart Games and the Jordan Freeman Group. The five titles included 3D Body Adventure, 3D Dinosaur Adventure, Dinosaur Adventure (Original), Space Adventure, and Undersea Adventure.
ShadowCaster
ShadowCaster was developed by Raven, the same company which also made the Heretic and Hexen games. The game engine was written by id Software's John Carmack, which was "a successor of the Wolfenstein 3D engine and a predecessor of the Doom engine." This game is a 3D hack-n-slash from 1993, an early adopter of the CyberMan.
Controls:
- The standard left-right-forward-back movements just moves the cursor on the screen.
- Up: jump
- Pitch: pitch forward to move forward, pitch back for backwards movement.
- Yaw: turn left or right.
- Roll: strafe left or right.
- Tactile vibration: The tactile vibration works when hit by enemies. There's only a single vibration setting in my initial testing, whereas other games will use different levels. The wiki page says it vibrates when hitting a wall, as well, but I never experienced this.
The Terminator: Rampage
I never could get this to run. When I tried to install the demo, it caused the computer to reboot. Even under DOSBox, it had the same effect. Perhaps if I ever find the full game, I will be able to properly test this game.
According to the wiki page, this game used the same game engine as The Elder Scrolls: Arena. However, I have not found any evidence that this Elder Scrolls game supported the CyberMan.
Mechwarrior II: The Clans (Demo 2)
Mechwarrior II: The Clans demo did not make it into the original demo bundle, so it was replaced with Body Adventure. From what I could gather, it sounded like early development of Mechwarrior 2 went through developer hell, and eventually evolved from being The Clans into 31st Century Combat.
I wasn't very good at the game, but the CyberMan did seem to work, but I was often resorting to using the keyboard to move around. As my mech was dying, the CyberMan did pulse lightly like a heartbeat, better than the strong whirring that some games have used for the tactile feature.
Since The Clans demo did not come with the CyberMan, I had to do some searching for it. From what I've read, there were two demos, but the second one seems to be the more playable version. I found several downloads for the demo, often coming in at 1.4MB, just the right size for a high density floppy disk, but I could never get any of those versions to install properly on my test machine (a Packard Bell Legend 814CD). I did eventually find a demo that came in closer to 3MB. I burned that to a CD and then installed it onto the Packard Bell, and that version worked. Unfortunately, I forgot where I exactly found that particular version of the demo after downloading several variants. Here are several links relating to the Mechwarrior II demo and related pages:
The supported controls as mentioned in the README file:
*** Cyberman ***
MechWarrior 2 fully supports the Cyberman by Logitech in the following
way:
Left Button = Fires selected weapon
Right Button = Change weapons
Pitch Forward = Increase throttle
Pitch Back = Decrease throttle
Roll Left = Left view
Roll Right = Right view
Z-Up = Up view (pull up)
Yaw Left = Turn torso left
Yaw Right = Turn torso right
Z-Down = Center torso (push down)
Targeting the Mech is controlled by moving the Cyberman Up and Down
within the X and Y axis square.
SSI Games
All three of these games (Menzoberranzan, Strahd's Possession, and Stone Prophet) were developed by DreamForge Intertainment and published by Strategic Simulations, Inc. who were notable for many of their computer games based off of AD&D properties, such Pools of Radiance and Champions of Krynn (both which were my introduction to AD&D). These three games used the same game engine, so they all share the same interface and controls.
When I initially tried using the CyberMan with these titles, it only acted like a standard mouse. I knew that the CyberMan's full suite of functionality did work, as proven with the DOOM demo. I later learned that I had to disable the CuteMouse DOS driver from the autoexec.bat file. Even though the Logitech 6.31E driver supports dual mice, having CuteMouse also loaded disabled the additional CyberMan functionality. Once I got the CyberMan enabled, I was able to test it out with the SSI games. The CyberMan works, but the additional controls aren't particularly groundbreaking in what they add to the game. There were still areas in the game where I needed to press the ESC key to skip a scene, so the keyboard was still required at times.
Controls:
- Yaw: Turn the party left or right
- Roll: Slide party left or right
- Pitch: Move party forward or backward
- Y: Move mouse up and down the screen
- X: Move mouse left and right on the screen
- Z: Not used
- Pitch and Yaw can be used in conjunction with each other so that you can move forward and turn at the same time.
Side notes:
It's nice that these games offer an option with a party already created to quickly dive into the game (versus the traditional method of endlessly curating your characters during the creation process). I remember spending several hours just setting up the party in Champions of Krynn, and this apparently hasn't changed much with modern RPGs, so the quick start approach is handy for one who just wants to play immediately.
I kept getting a generic "Unable to open resource file"
when trying to start any of these games, until I tried Stone Prophet which had a slightly more useful error message that mentioned it could not open the file 'RES0/D:\RES0'
, which indicated I forgot to put in the game's CD. Sierra games tended to be a little more informative when the CD was required, but I had encountered a variety of configuration issues with the games reviewed in this article, so this looked like just one more error.
Conclusion
So how did the CyberMan fare with these products? The CyberMan was a bold idea, but its implementation was not the best, and it did not gain much support aside from a handful of games in the mid-1990s. Some of the games seemed to offer minimal support, but others made better use of what the CyberMan offered. Not all games bothered with the tactile feedback, some kept it very basic, and others were a little more creative. With the modern PS5 controller, the tactile feedback of the buttons is a feature which adds additional interactivity with games, and this shows that Logitech was ahead of many competitors with this idea. However, I've found that moving the cursor around with the CyberMan feels fairly stiff and lacks the precision that a standard mouse would normally provide, so it does not do well as a general input device, especially when used in Windows 3.1.
1st January 2022 | Edenwaith
This past year marked the 20th anniversary of the Edenwaith website, which has diligently served as a repository for my software projects and random technical experiments. The first decade was dedicated to creating new software for the burgeoning Mac OS X market. Most of those initial apps have been retired now, but a couple of mainstays like Permanent Eraser, EdenList, and even EdenMath are still around.
There was not much in the way of traditional software development in 2021, primarily due to my job being quite busy for the first half of the year, so there was less time and energy to lend to side projects. However, there were a couple of software updates with AGI Studio and EdenList. After several years of contemplation, I have finally retired 33 RPM. Work on Permanent Eraser 3.0 has begun in earnest, but there is no defined timeframe for when it will be released. I did manage to write and complete my first short story in seven years (in addition to revising my current novel which I hope to have completed the second draft in 2022) with the Space Quest-themed Another Day, Another Buckazoid. There's also been some interesting research done with topics of color theory, serial drivers, and fonts, all which I hope to delve into further this year.
Software Updates
Prominent Blog Posts
While there were not many software updates, fourteen blog posts were written, and here are some of the more interesting ones from 2021. The article about the Logitech CyberMan had been in the works for quite awhile and became quite the deep dive into how serial mice work and trying to get it to work with modern computers.
2022
This year will likely focus on more game-related topics, and less on traditional software. However, I do now have an M1-equipped MacBook Pro and have more reason to update some Mac software to support the new Apple Silicon chips. The following are a number of topics I intend on researching and/or working on:
- More AGS Mac ports — looking at also including ARM support for the newer M1 Macs. Perhaps even learn how to do Mac ports for other game engines.
- Further research into color theory to improve the Agifier script
- Additional experimentation with the Logitech CyberMan and compatible games
- Write a Logitech CyberMan serial driver for the Mac
- Write a Mac audio player for either AGI Studio or GameAudioPlayer
- Research the issue where color Sierra AGI games had issues on newer color Macs of the 1990s
- Design fonts, particularly updating classic Sierra-style fonts using Glyphs
and FontStruct
- If I complete my 2nd draft in good time, then will look into other game development for things like TWINE
or the Playdate
- Continue work on Permanent Eraser 3.0
27th December 2021 | Games
One of the things which made the floppy disk version of Quest for Glory: Shadows of Darkness (QFG4) unique from its CD successor is that it supported the original Logitech CyberMan 3D Controller. The CyberMan was an interesting peripheral which acts like a mouse which can (somewhat) move in 3D space (X-Y-Z coordinates in addition to pitch, yaw, and roll). It was only supported on a handful of games from the mid-90s, such as DOOM, Hexen, and Quest for Glory: Shadows of Darkness. If batteries are added, the CyberMan also provides tactile feedback. This was an early attempt of creating a 6-axis controller, but it wouldn't be effectively implemented until the Playstation 3's SIXAXIS controller.
The following products supported the CyberMan:
- DOOM
- Hexen
- Quest for Glory: Shadows of Darkness
- Body Adventure
- Lands of Lore
- Shadowcaster
- Spectre VR
- System Shock
- Terminator Rampage
- Lemmings 3D
- Descent
- Ravenloft: Strahd's Possession
- Ravenloft: Stone Prophet
- Menzoberranzan
- Stonekeep
- Lords of Midnight
- Mechwarrior 2
- Rise of the Triad
- Under a Killing Moon
- Zephyr
This list is not exhaustive, and as do more research, I discover additional games which supported (or claim to have supported) the CyberMan. The two Ravenloft games and Menzoberranzan are based off of the same game engine, which explains why the CyberMan works with all three. Only the floppy disk version of Quest for Glory 4 worked with the CyberMan, as the CD release explicitly mentions that it does not support this controller.
The CyberMan I purchased off eBay came in near pristine condition. The box was in excellent condition, in addition to the manuals, floppy disks, and the controller. The only true evidence that this CyberMan had been used is because batteries had been left inside...and after an inditerminate amount of time, the batteries had leaked. Sigh. Fortunately, after I got everything set up and working, I was able to confirm that the tactile feedback does still work when I tested it in Quest for Glory: Shadows of Darkness.
USB to Serial
The first order of business was to ensure that the device actually worked. The first iteration of the CyberMan was released in 1993, several years before USB became commonplace for computer peripherals. Instead, the CyberMan uses an RS-232 9-pin serial connector, which is an obstacle in trying to interact with modern computers which generally don't have serial ports these days.
Since I initially started the testing on a Mac, I purchased the following cable from Micro Center: QVS USB 2.0 (Type-A) Male to DB-9 RS-232 Serial Male Adapter Cable 6 ft. - Black. To get more details about the cable, I used the Mac's System Profiler which identified the cable as:
USB-Serial Controller:
Product ID: 0x2303
Vendor ID: 0x067b (Prolific Technology, Inc.)
Version: 3.00
Speed: Up to 12 Mb/sec
Manufacturer: Prolific Technology Inc.
Location ID: 0x14100000 / 28
Current Available (mA): 500
Current Required (mA): 100
Extra Operating Current (mA): 0
One note about the supplied power is what USB and traditional serial ports could offer, which generally was enough to power a standard mouse or joystick, but to enable the tactile vibration, batteries were needed to give the extra power.
For some delightful technical goodness, the command line gives a few extra details, such as that the Prolific PL2303 driver is used for this adapter.
% ls /dev/tty.usb*
/dev/tty.usbserial
% kextstat | grep prolific
188 0 0xffffff7f83ae3000 0x7000 0x7000 com.prolific.driver.PL2303 (1.6.3)
E55010C7-C7DD-36D8-AE20-E050E3AFCB2B <61 52 6 5 3>
% ioreg -c IOSerialBSDClient | grep usb
| | "IOTTYBaseName" = "usbserial"
| | "IOCalloutDevice" = "/dev/cu.usbserial"
| | "IODialinDevice" = "/dev/tty.usbserial"
| | "IOTTYDevice" = "usbserial"
Another graphical utility to get additional information about the connected adapter is to use the development tool IORegistryExplorer. This app used to be provided with Xcode by default, but now it is a separate download as part of the Additional Tools for Xcode package which is downloaded from Apple's developer portal.
It had been about ten years since I had worked with a USB to serial converter, but I did find some old notes which reminded me I had to look for a PL2303 driver to get the cable to work properly with macOS. Unfortunately, the old driver I had used previously was no longer freely available via its SourceForge page. Fortunately, I found that the manufacturer of my cable did offer an up-to-date driver. Downloading and installing the appropriate driver worked perfectly under macOS Mojave. Note: Extra security measures in more modern versions of macOS (Big Sur and later) seem to have issues with some kernel extensions, so I have not tried this adapter with macOS Big Sur or Monterey, yet.
Terminal Output
With the PL2303 driver now installed, I next turned to using my favorite serial program Parley from Buttered Cat Software. After setting some options (4800 7-N-1) and connecting the CyberMan (seen as a usbserial
device to Parley), I was able to see some output from the device to confirm that it did work.
From Parley (4800 baudrate with 7 data bits : 4800 7-N-1)
**** Port Open
ø øø øx ø xx ø x ø x ø x ø x ø x ø xøøøø xøøøø x ø x ø x ø x ø x ø x ø xøøxøx x ø x ø x ø
øø ø x x ø øø xx øxøxø x xø ø ø ø x x x
x x x x xø x x x øø x ø x øø x ø x øø x x x x x x x x x x
x x x x x x x x x x x x xøxø xø øxxø øxø xø øø ø x ø x øø
ø ø øø x øø x x ø x øøø øøø x øø
From what I've read, most serial mice used a 1200 baud, 7 bit setting (1200-7-N-1), which is unfortunate since the lowest baud setting in Parley is 4800. Another option was to use command line tools.
screen /dev/cu.usbserial 1200
��������������������������������������������
�����������������������������������������
ͳǟ�Ā�Ā����������������������������������������
�������������������������ô�ß�ñ��������������
ý�ñ�ý�ú�÷�÷�ý�ý�ý�ý�ñ�å�ô���ý���������ϴ�Ϯ�̀�̀�̀�̀�̀�̀�
ý���������������������ô�Ü�Ù�Á�ý����������ý�Ѐ���ë
��������������������������������������������
Ü�ý�ý�ô�Ó�»�¬� �£�¯�¾�ë���������������������������
�������Ѐ�Ѓ�Ѓ����������������������������������
�������������������̀�̀�̀�̀�̀�����̉�̌�̆�̆�̆�̆�̃�̃�̃�
̃�̆�̃�̀�̀�̀�̀�̀�̀�̀�̀�̀�̀�̀�̀�̀�Ā�����ă�������������
������������������̘�����������ô��²��¯�©�ô�ý��
�������������
Another option I tried was to communicate with a serial device in DOS in either DOSBox or VirtualBox. Unfortunately, I was never able to get any of these emulated versions of DOS running on my Mac (yet) to see the serial device, but here are some different options I tried.
MODE COM1:1200,N,7,1,P
https://kb.iu.edu/d/afao
> kermit
set port 1
set baud 9600
connect
None of the data from Parley or screen
was very intelligible, but it did prove that the device worked to some degree. I switched over to CoolTerm, which does have the option to set the baudrate all the way down to 300 baud. But for the ideal configuration, I set the options for this connection to 1200 baud rate at 7 data bits and 1 stop bit with no parity (1200 7-N-1). The data from the CyberMan now looked like this:
Õ≥…£à»Äæ¿ÄÉ¿Ä܇ÄÄ¿ÄćÄÄ¿ÄćÄÄ¿ÄÄ√ΩÄ√ΩÄ–ÄÄ¿ÄÄ√ΩÄ√ΩÄ¿ÄĆ¿ÄɆ¿ÄÄÄ√ΩÄ–ÄÄ¿
ÄÄ√ΩÄ√¢í¬ó≥¬àõ√üĬóâ¿ÄÉ¿ÄÜ√∑ï√ΩÉÃå®ÃòäðÅúÑÕÖçÕ∏Ñ¿ºÄÕ∏¥¡∏Ä¡îÄ¿òòƒòëƒò∏ƒò؃ò∏¿Ä
í«¥ó∆àã√¥Ä¬à°¬æĬàÉ√ÅÄŒàΩ¬£Äœüñœ®¥œ®ÑÀ®≤œ®çÃ屡¨Ä¿ºÄ¿ºÄ¡∏Ä¿ÉÄ¡∏Ä¡¶Ä¿™Ä¿™Ä¡ÖÄ¿ïÄ
¿òÄ¿òÄ¿òÄ¿òÄ¿òÄ¿òÄ¿òÄ¿òÄ¿òÄ¿òÄ¿òÄ√ΩÄ√äĬµÄ¬óÜ∆àé¬ØÄ«äà¿™ò¡¶Ü¿ßÄ¿èÄ¿ÉÄ¿Äõ√Ωõ√Ωπ√
∑ò√∑Ü¿Äò¿Äò¿Äò√Ωò¿Äò¿Äò¿Äò¿Äò¿Äò¿Äò¿ÄòÃÄ∫»Ä©»ÄµÃÄÅ»Ä∏ÃÄ¥ÃÄΩœΩΩ¬¶ÄŒà∫¬àĬØÄ√¥Ä√Ω
Ä√ΩÄ√∑Ä√®Ä√®Äœ®Ω√®Ä√®Ä√®Ä√®Ä√®Ä¡ÇÄ¡ùÄ¡∏Ä¡ãÄ¡∏Ä¡∏Ä¿ïÄ¿πÄ¿ÉÄ√∑Ĭ†Ä¬àĬ¶Ä à†¬∏Ä óàÃ
ÄÑÀ´àÃÄüÃÉ®Õ֮ú®Õé®Õ∏®Õ∏®Õ∏®¿øÄ≈îã¿ò™¿òøƒòÖƒò∏«¢£∆éù¬àø¬î⬪ĬæĬ¨ÄŒ¨´œáñœ¥úœΩú
»ÉØÃò∑Õó∑ÕîçÃ≥Ω¿ÄÜ¿ÄÉ¿Äâ¿ÄÉ√±Ä√¥Ä√ΩÄÃÄ∫ÃÄäÃâ±ÃÜ∫ÃÄ∫œ∑ΩÃÄΩ√ΩÄ
CoolTerm has an option to convert the garbled ASCII output into hex codes, which is far more manageable to dissect the data coming from various commands sent by the CyberMan. All further data mentioned in this article will be either hex values (C0
) or binary (1100 0000
).
Serial Mouse Protocol
Before delving too deeply into CyberMan's technical details, let's inspect how the Microsoft serial mouse protocol works, which is the basis for how Logitech mice also worked. These details are from the original archived article by Tomi Engdahl <then@delta.hut.fi>, which is the basis for numerous other documents found on the internet.
Packet Format
D7 D6 D5 D4 D3 D2 D1 D0
Byte 1 X 1 LB RB Y7 Y6 X7 X6
Byte 2 X 0 X5 X4 X3 X2 X1 X0
Byte 3 X 0 Y5 Y4 Y3 Y2 Y1 Y0
LB is the state of the left button (1 means pressed down)
RB is the state of the right button (1 means pressed down)
X7-X0 movement in X direction since last packet (signed byte)
Y7-Y0 movement in Y direction since last packet (signed byte)
1st byte 2nd byte 3rd byte
================ =============== ================
- 1 ? ? Y Y X X - 0 X X X X X X - 0 Y Y Y Y Y Y
================ =============== ================
| | \ / \ / \---------/ \---------/
| | | | | |
| | | \----\ | |
| | \--------|-------|--------\ |
| | / \ /---------\ / \ /---------\
| | ================ =================
| | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Left Button --/ | ================ =================
Right Button ----/ X increment Y increment
Each time the mouse state changes (e.g. the mouse moves or buttons are pressed/released), a data packet is sent to the host. Each data packet is comprised of three 7-bit bytes. In the data culled from the CyberMan, each byte is made up of 8 bits, but the leading bit is always set to 1, but it is ignored, so an "empty" byte will still be 0x80
(1000 0000
in binary). An example data packet of the left mouse button being pressed would be E0 80 80
.
Note: The bit marked with X is 0 if the mouse received with 7 databits and 2 stop bits format. It is also possible to use 8 databits and 1 stop bit format for receiving. In this case, X gets the value 1. The safest thing to get everything working is to use 7 databits and 1 stopbit when receiving mouse information (and if you are making a mouse then send out 7 databits and 2 stop bits).
The byte marked with 1 is sent first, then the others. The bit D6 in the first byte is used for synchronizing the software to mouse packets if it goes out of sync.
According to this description of the PC mouse by Petr Simandl, D7
and D6
of Byte 1 will always be 1. This corresponds to the CyberMan output where the first byte in the data packet is at least 0xC0
(1100 0000
). Having the D6
bit set to 1 indicates the start of a new data packet, so any subsequent byte in the packet will not have the D6
bit set.
Examples of the first byte of a data packet, dependent upon various button states:
No buttons down: 0XC0 = 1100 0000
Left button down: 0xE0 = 1110 0000
Right button down: 0xD0 = 1101 0000
From the Serial Mouse Detection documentation:
The following is the data report format. Data is transmitted serially (LSB first) in the form of seven bit bytes. X and Y data are incremental movements with Y movement considered positive to the south. (For the PS/2 data format, Y movement was considered positive to the north). The data packet format is three or four bytes long. The fourth byte is transmitted in either of the following cases
a. The middle button is depressed
b. A report is sent while the middle button is depressed
c. The middle button is released
Additional details from Logitech Logimouse C7 Firmware Rev 3.0 Jan86 corroborates the original details on the serial mouse data format:
LOGIMOUSE C7
12.2 Microsoft. Compatible Data Format
In the Microsoft Compatible Format, data is transferred in
the form of seven bit bytes. Each report consists of three
bytes. X and Y are relative movements. In the Microsoft
Compatible Format, Y movement is positive to the south and
negative to the north.
The command to select the Microsoft Compatible Format is 'V'
(56H) .
6 5 4 3 2 1 0 Bit number
1 L R Y7 Y6 X7 X6 Byte 1
0 X5 X4 X3 X2 XI X0 Byte 2
0 Y5 Y4 Y3 Y2 Yl Y0 Byte 3
L,R = Key data (Left, Right key) 1 = key depressed
X0-X7 = X distance 8 bit two's complement value -128 to +127
Y0-Y7 = Y distance 8 bit two's complement value -128 to +127
Positive = South
If LOGIMOUSE C7 is set by jumpers to the Microsoft
Compatible Format, at power-up it will send one character
'M' (4DH) . No character is sent if the Microsoft Compatible
Format is selected with a command.
LOGIMOUSE C7-M always sends 'M' (4DH) when the host toggles
the RTS signal line. In response to a Microsoft driver reset
(i.e. toggling RTS), LOGIMOUSE C7-M sets up its operating
parameters to Microsoft compatible format, Incremental
Stream, continuous reports, 1200 baud, regardless of the
current settings or the jumpers.
3 Button Logitech Protocol Extension
These three different
pages detail how Logitech extended the Microsoft mouse protocol to support a third mouse button.
Logitech uses this same protocol in their mice (for example Logitech Pilot mouse and others). The original protocol supports only two buttons, but Logitech has added a third button to some of their mouse models. To make this possible Logitech has made one extension to the protocol.
Logitech extended the 2 button mouse protocol to support 3 button mice by adding a 4th byte when the middle button is pressed (and the first packet after it is released). If a 4th byte is encountered (i.e., an
extra byte with D6 set to 0) then D5 of that byte (0x20 or 32 in decimal) indicates the status of the middle mouse button.
Logitech serial 3-button mice use a different extension of the Microsoft protocol: when the middle button is up, the above 3-byte packet is sent. When the middle button is down a 4-byte packet is sent, where the 4th byte has value 0x20 (or at least has the 0x20 bit set). In particular, a press of the middle button is reported as 0,0,0,0x20 when no other buttons are down.
I have not seen any documentation about the exact documents, but here is what I have found out: The information of the third button state is sent using one extra byte which is send after the normal packet when needed. Value 32 (dec) is sent every time when the center button is pressed down. It is also sent every time with the data packet when center button is kept down and the mouse data packet is sent for other reasons. When the center button is released, the mouse sends the normal data packet followed by data byte which has value 0 (dec).
This looks very much in line with what is seen in the section below when pressing the middle button sends four bytes (e.g. C0 80 80 A0
), whereas any other action sends three bytes. This is an interesting method to implement the middle button by adding an additional byte. According to the documentation above, the D5 bit is set, so the byte will have the value of 0x20
(0010 0000
). Since each of these bytes in the data packet have the first bit always set to 1, the returned value is A0
(1010 0000
, which is 0x80 + 0x20
). The computer determines when a new data packet comes in by checking if the D6 bit is set to 1. Other mouse protocols ended up using more bytes per data packet to deliver additional data.
CyberMan Hex Codes
The CyberMan's controls are more akin to a joystick than a typical mouse by supporting the movement of the controller for yaw, roll, pitch, and also along the Z-axis. The following are the responses from the CyberMan when each of its controls are activated.
Buttons:
Left button down: E0 80 80
Left button up: C0 80 80
Middle button down: C0 80 80 A0
Middle button up: C0 80 80 80
Right button down: D0 80 80
Right button up: C0 80 80
L+R buttons down: F0 80 80
L+M buttons down: E0 80 80 A0
M+R buttons down: D0 80 80 A0
L+M+R buttons down: F0 80 80 A0
X-Y Axes:
Left: C3 A8 80
Right: C0 98 80
Forward: CC 80 A8
Backwards: C0 80 98
Forward-Left: CF A8 A8
Forward-Right: CC 98 A8
Backwards-Left: C3 A8 98
Backwards-Right: C0 98 98
Z-Axis:
Up: CC 80 BD
Down: C3 BD 80
Yaw:
Rotating-Left: C0 86 80
Rotating-Right: C3 BD 80 (Note: Same value as Down, one of these are likely incorrect)
Roll:
Right: C3 BD 80
Left: C0 8F 80
Pitch:
Forward: C0 80 8F
Back: CC 80 BD
These are the approximate values I could get from the output. The data for the three buttons and moving along the X-Y plane are consistent, but the other data seems far more chaotic.
The first byte of each data packet is at least C0
(1100 0000
), indicated by the D6 (second from left) bit being set. Most of the data packets are three bytes, unless the middle button is pressed, which then increases each packet to four bytes.
C0 = 1100 0000 : No buttons down
E0 = 1110 0000 : Left mouse button down
D0 = 1101 0000 : Right mouse button down
F0 = 1111 0000 : Both left and right buttons down
As shown in the Packet Format diagram, if the D5
bit (third from the left) is set in the first byte, it indicates that the left button is pressed. If the D4
bit (fourth from the left) is set, then the right mouse button is pressed. If the first byte is F0
, then it indicates that both the left and right buttons are pressed, so the D5
and D4
bits are set.
As mentioned in the 3 Button Logitech Protocol Extension section, the middle button is indicated by the addition of a fourth byte. When the middle button is pressed, the A0
is the extra byte. When the middle button is released, an extra 80
is available to indicate that the middle button is no longer active.
Middle button down: C0 80 80 A0
Middle button up: C0 80 80 80
This fourth byte will only appear when the middle button is active or the middle button has just been released. This adds a little extra complexity to the mouse driver, because it cannot always assume that each data packet is going to be exactly three bytes in length. Instead, the driver needs to check if the D6
bit on a byte is set to determine the start of a new data packet. Notice that the fourth byte is given a value of A0
, which is 1010 0000
in binary, and the D6
bit is 0. When the middle button is released, the fourth byte returns to an "empty" state of 80
.
Calculating the X and Y positions is interesting by the way it takes two bits from the first byte, and then combines it with the last six bits of either the third or fourth bits.
Left: C3 A8 80 (11000011 10101000 10000000)
Right: C0 98 80 (11000000 10011000 10000000)
Forward: CC 80 A8 (11001100 10000000 10101000)
Backwards: C0 80 98 (11000000 10000000 10011000)
The X (left and right) coordinates take the last two bits (D1
and D0
) from the first byte and combine it with the last six bits from the second byte. For the Y coordinates, it takes the third and fourth (D3
and D2
) bits from the first byte and then merges those with the last six bits of the third byte.
Left: 11101000 => E8
Right: 00011000 => 18
Forward: 11101000 => E8
Backwards: 00011000 => 18
It's interesting to see when the max values of each direction are constructed, that both Left and Forward equal E8
, and Right and Backwards equal 18
.
Now that we have covered the basic operations, let's combine them and inspect the output. Moving the CyberMan Forward and Left will return CF A8 A8
, and holding down the left mouse button at the same time will return EF A8 A8
.
Forward-Left: CF A8 A8 (CC 80 A8 | C3 A8 80 => CF A8 A8)
Forward-Right: CC 98 A8 (CC 80 A8 | C0 98 80 => CC 98 A8)
Backwards-Left: C3 A8 98 (C0 80 98 | C3 A8 80 => C3 A8 98)
Backwards-Right: C0 98 98 (C0 80 98 | C0 98 80 => C0 98 98)
There is a computational beauty of how the various input values are calculated, which uses the bitwise OR operator
(indicated by the vertical pipe character: |
). If both the left and right mouse buttons are down at the same time, then the resulting data packet is F0 80 80
, which is calculated by E0 | D0 => F0
.
1110 0000 (E0)
OR 1101 0000 (D0)
------------
1111 0000 (F0)
If the mouse is set to Backwards-Left and the middle button is pressed down, the data packet C3 A8 98 A0
is sent. Once the middle button is released (but the mouse isn't moved from its position), the data packet C3 A8 98 80
is sent once and then the standard three byte data packet C3 A8 98
is afterwards.
It appears that the X-Y values for the 2nd and 3rd bytes have a range between A8
(1010 1000
) and 98
(1001 1000
), which leaves room for the CyberMan to handle the extra functionality for the Z-axis, yaw, pitch, and roll. The values I saw in the terminal were not as consistent, but it appears that any extra values were either higher (BD
) or lower (8F
).
This covers traditional mouse functionality, but what set the CyberMan apart from its traditional counterparts is its ability to work in three dimensions. Additional details per the Logitech CyberMan's manual:
- Using Z: Pull up and push down lightly on CyberMan to use the Z movement. In a game, you might use the Z movement to jump up or crouch down.
- Using Yaw: Twist CyberMan slightly to the left or right to use the Yaw movement. Looking right or left are typical Yaw actions in 3D games.
- Using Roll: Tilt CyberMan gently to the right or left to use the Roll movement. In some games, use Roll to move left or right.
- Using Pitch: Incline CyberMan slightly forward or slightly backward to use the Pitch movement. In your 3D games, pitching simulates actions like looking up or down. Some games use Pitch to walk forward.
Looking at how the Z-axis is handled, it initially looks like it is moving Forward (CC
) when going Up, but the third byte is BD
, which is larger than a normal Forward value can achieve. There is a similar approach when pressing the mouse Down. The first byte is C3
, which looks like the mouse is moving left, but the second byte is BD
, which indicates it is not within the standard range of moving along the X-axis. When releasing from the Up position, a data packet of C0 80 83
is sent.
Up: CC 80 BD
Down: C3 BD 80
The Yaw, Roll, and Pitch follow similar approaches of communication by using a mixture of values between the three bytes to indicate what type of data is being sent. Yaw and Roll make use of the second byte, whereas Pitch uses the third byte. The data I'm seeing is inconsistent, so take some of these examples with a grain of salt, and this will require further testing to get more reliable results, or my CyberMan may not be 100% functional.
Conclusion
The Logitech CyberMan 3D Controller was an interesting PC peripheral that was a little ahead of its time. It was followed up by the Logitech CyberMan 2 a couple years later, which sported a different form factor, likely to address the ergonomic difficulties the original possessed, but the second model didn't set the world on fire, either.
This has been an interesting experiment to delve into the ancient world of serial mice and odd peripherals, one which I intend on further pursuing to see if I can get the CyberMan to successfully work on modern computers and try out some of the supported games.
References