Written by cafealpha no comments
Synthesis ... this is the kind of blog article posted at the end of December in normal blogs, but since this is not a normal blog, and that I can't respect any schedule for it, let's prepare this article at the beginning of January
Last year started well with an order of Gamer's Cartridge from IGK, who is administrator of Dezaemon DB homepage. More than administrating Dezaemon DB, he is also a dezaemoner who (among other titles) developed Biometal Nemesis, which deserves its youtube link in this blog :)
Biometal Nemesis - Click above if you like shmups
I really like the style of this Dezaemon game ! Thank you very much IGK for creating such gem
Thanks to IGK, it was possible to finish support of Saturn Floppy Disk Drive on Save Data Manager : initialization of this device is slightly different than with internal backup memory and backup memory cartridge, and consequently was causing troubles on various configurations such as no backup memory cartridge inserted, but floppy disk connected, etc. Fixing all possible patterns wouldn't had been possible without kind help and beta testing from IGK. Thank you
Save Data Manager (version around 2017/01/30)
Configuration when this screen was taken was no "backup memory cartridge inserted, and floppy disk connected", which was causing troubles because among other things, unavailable device in the middle of devices table wasn't supported.
Additionally, this was the occasion to add virtual floppy disk support on Gamer's Cartridge, making Saturn considering a floppy disk drive is available, even if not physically connected. Main purpose of this feature is to add 5 more save and load slots in Dezaemon 2, which, in addition of the 5 slots on backup memory cartridge, makes possible to manage up to 10 saves into a Dezaemon 2 session directly from a single SD card I don't remember exactly what was the trigger which started the addition of this feature, but I think that a suggestion from IGK like "it would be cool if floppy disk would be supported by Gamer's Cartridge too" and me "Ah yeah, that's a nice idea ... how many save slots do you want ?"
After that, IGK continued to surprise me by asking his friend beebaraka to draw a Dezaemon 2 themed label for Gamer's Cartridge ... As a result, I received images for two labels, which I personally consider as the masterpieces among Gamer's Cartridge label collection My preference goes to the white-themed label, but I suppose it's just a matter of personal taste.
Dezaemon 2 themed Gamer's Cartridges
Like shooting games ? Like DIY ? Theses cartridges are designed for you
In parallel of theses Dezaemon 2 adventures, generous contributors helped in dumping firmware of some exotic Saturn cartridges, and were successfully added to Pseudo Saturn Kai Save Data Manager. Most relevant dumps were for X-Terminator cartridge, and Urawaza Dataro cartridge : first one is a cartridge with extended support for cheat codes, especially with extra controller allowing in-game search of cheat codes. Later one provides special save data for several (around 34 IIRC) Japanese games. Special thanks to Madrom for providing dump of this cartridge !
All the points below contributed to prepare the "20170423" release of Pseudo Saturn Kai. Warm thanks to all contributors who could make it possible !
Second half of the year mostly concerned cheat codes addition to Pseudo Saturn Kai. It started in June (or May ... I don't remember correctly) from a Gamer's Cartridge user asking when cheat codes will be available in Pseudo Saturn Kai ... this reminded me I still had to finish that until next release
First working version of cheat codes
hander, with USB transfer support
It's not visible on this picture, but many polygons weren't
drawn because of performance issues.
Unlimited time cheat code working : it took me around
one month to fix missing polygons, because of unoptimized
implementation of cheat codes handler), but I did it
Cheat codes kept me busy for six solid months, basically in understanding to manage cheat codes in a similar way as is it done on Action Replay firmware, optimizing critical code, importing codes list, finishing cheat codes related interface, testing several games, etc. That's honestly a hard work, but this was also an occasion to add in-game USB transfer via USB dev cart. Thanks to this, the basis in order to fix or improve cheat codes is ready Proper PC software for cheat codes detection is still missing, but hopefully this will be done someday.
Akumajo Dracula-X illustration with Maria's inifinite jump cheat code.
This game was a nasty one regarding cheat code support, with very
tight CPU and RAM left for cheat codes handler. This was an occasion
to develop many cheat codes debug features
Summer was also the occasion for me to officially end manufacturing and support of USB dev cart : after 5 years involved in this adventure, I considered it was enough, because : 1. USB dev cart interests basically nobody 2. In the rare cases USB dev cart interests somebody, it is usually used for closed-source projects (But there are notable exceptions where USB dev cart contributed to Saturn open source projects. Big thanks to theses concerned peoples for making Saturn homebrew scene brighter )
I'm hesitating about the timing for next Pseudo Saturn Kai release : should I take some extra months in order to get proper cheat codes support for most popular games ? Or should I release it under few weeks with minimal cheat codes support (around an handful of games are currently tested and working), and hope to receive some feedback from users, so that I will eventually know which games need their cheat codes to be fixed ?
That's a very difficult choice : cheat codes is a niche feature (as everything else regarding Saturn !), so I shouldn't hope a lot of feedback. On the other hand, adding a cheat codes edition screen, and allowing cheat codes input on user side is (IMHO) a mistake too : maybe a motivated user would fix and/or add codes for some games, but rarely theses codes will be publicly available for everybody else, and in the other cases, user will simply consider Pseudo Saturn Kai cheat codes as a broken feature. Let's see ... I honestly don't have any precise idea when next release should be done. Any suggestion regarding this is welcome in the comments
Generally speaking, I'm tired about Pseudo Saturn Kai maintenance : I started it around two years ago (yes, largely over than nine thousands hours !!!), edit: that was around three years ago (I though we were at the beginning of year 2017 ), am finally seeing the end of my TODO list to realize that ... majority of users shifted to hardware ODE, or simply left the scene without any last final word ...
Well, whatever it may be, I continue development of Pseudo Saturn Kai because I went too far to stop so near of the end (that's quite a pragmatic argument, sorry), but also (and that's the most important), because that's a nice hobby, which is important in order to keep a balance between private and work
Also, my first steps in Pseudo Saturn Kai maintenance were made during my hospitalization for cancer, and keeping such hobby during theses hard times was worth gold. I don't know (and don't want to know) how things would had turned without my Saturn hobbies.
BTW, things concerning my health are getting well : I'm still undergoing periodical screening, which all were OK last year Last year was the celebration of 3 years all right after surgery, which is not bad for a cancer with 50-60% 5 years survival rate
Pokemon Go still not allowed in hospital. Fortunately, usage Saturn dev laptop isn't forbidden
To finish this article on a rant note (sorry if you went here for some final positive note ), I would like to say "thank you for nothing" to Rhea/Phoebe development team rmenu author. (← updated on 2018/06/20)
Why ? Reason is that I would like to add a rmenu equivalent to Pseudo Saturn Kai, but don't have any technical information to implement it, and it's not like I didn't asked about theses informations, but simply didn't received any relevant reply from concerned developer(s).
For a semi-commercial product, I can understand to keep schematics, source codes and other development resources private. But I don't request disclosure of theses resources, and just want some minimal information for interoperability, which isn't publicly available, and that's a pity.
Why is that a pity ? Because some cheat codes will certainly not work by having rmenu running between Pseudo Saturn Kai and Saturn game. I know there's the solution to use rmenu's full boot, which does a system reset of nearly everything (except Rhea/Phoebe, obviously) after selecting a game, so that cheat codes can be enabled after that ... but I really don't know anybody motivated to do this messy setup : everybody is using the rmenu's quick boot solution, right ?
Pseudo Saturn Kai's rmenu, dated 20151214. Latest version have some major improvements, such as scrolling title of select game, etc Because of lack of Rhea/Phoebe API, this feature is disabled.
I'm personally (and honestly) not concerned about this problem : my modded Saturn + USB dev cart are enough for my development needs, and I don't want to pay for a device costing an arm and a leg (plus a kidney when buying from ebay ...) and then having to do the reverse-engineering job for it after that ! So unless I got external help, clean support for Rhea/Phoebe will be done ... without me
From what I could found from static analysis of rmenu itself, version is checked by seeking to the last available data sector of the CD track, and game is selected by seeking to sectors just before that last available one.
After that's it's difficult to guess what data should be expected from Rhea/Phoebe without testing on real hardware. And reverse-engineering is usually a sluggish and hard work (I estimate the remaining as around a two weeks course ... and hope this to be a pessimistic estimation), and really would like to spend this time to other projects funnier.
2018/06/20 update : there will be proper support of Rhea/Phoebe image selection in Pseudo Saturn Kai, and consequently an user-friendly way of enabling cheat codes when using theses ODE
Very big thanks to Deunan Knute for the great job, providing the technical informations and everything else
And also I would like to thank privateye for contacting Deunan, his patience and great help in beta testing
Written by cafealpha 4 comments
While making a Saturn program running directly from ROM, constraint is usually to have program as small as possible. Why ? Because I would like to make Pseudo Saturn Kai continue supporting Action Replay, which have limited ROM size
So, in that situation, I use homemade, minimalistic stdlib, containing usually only memcpy and memset functions, and everything goes well. But for some reason, current program was begging for __ashlsi3 and __ashrsi3 functions. ... What's these things ? __ashlsi3 is an assembly function doing left shifts of data, and as you probably guessed, __ashrsi3 does the same, but with right shifts
No problem, let's ask my friend google, and copy & paste theses functions without minding about their contents Theses functions are standard functions provided by C library, so sources can be found here and there.
An example of what __ashrsi3 function looks like
A day after that, here comes the time to do basic testing of this ROM code Let's first start with simple things such as screen display ...
Text display ... not as expected ?!
Hrm, it's probably a problem in my printchar routine ?
printchar source code : this is the core thing behind text display in my programs
But that's a very long time I didn't touched this routine, which works well on Pseudo Saturn Kai, and works even better in vdp1ex from Charles MacDonald sample programs, because all my printchar routines come from there But just in case of, let's try to tune one " <<3 " into " *8 " in the code above, and see if that changes something. Theses two operations are equivalent, so this should give the same result, but ... Saturn screen becomes all black
Okay, there's definitely something weird regarding that printchar, but I just re-used it as-is from other project, so what's going wrong with my it ?! [...] And then (finally) a light-bulb above my head appears Maybe there's something wrong regarding the __ashlsi3 and __ashrsi3 routines ? And, yes there was something wrong regarding theses routines ... I wrote a paragraph about them on the first half of this article, so it would be surprising the problem came from somewhere else
In more accurate words, routines are OK, which is normal since they are written by people smarter than me But the calling convention of __ashrsi3 was not as my gcc was expecting ? Well, that's just a guess from the display results, because it seems to display the same pixel 8 times on each row of a given character, which may happen when ignoring shift parameter in __ashrsi3 function.
Anyway, rather than finding in details what's wrong, let's fix the problem First, with assembly by hand, in desperately trying to change input parameter handling ... I don't remember exactly what I wrote, but that was something like pushing a register to stack, moving parameter to it, finally restoring register, putting nop instructions everywhere, etc ... nothing difficult, but over my extent in assembly programming
The result is ... a mixed success :
Trying to modify __ashrsi3 routine by hand ... well, it seems that some shift values are not correctly handled
Okay, so let's re-ask google about that __ashrsi3 routine ... and a different implementation arrives in search results. Let's try it
And the execution result :
Execution result with second version of __ashrsi3 function
Yeah, it works this time !!! And don't ask me why, because I didn't took time in understanding what's different in that second version of __ashrsi3 function And, rather than understanding why it works ... let's close that assembly pandora box before some other mystic bugs pop from it
I will probably see about this in the future, but that was absolutely out of the scope of today's programming, and in software world, too much digression leads to freeze of projects, which I would like to avoid in order to go forward to next pending project
As a example, I started to adapt yeti3d engine to Saturn in 2010 (7 years ago !), and this ended in ... developing a SD card based memory cartridge for Saturn ! The point above is is not a joke : menus used in my yeti3d adaptation are the origin of menus used in Pseudo Saturn Kai, which shows the continuity (co-consanguinity ? ) in my projects. And after getting yeti3d working a bit, I really would like to load levels from something else than CD-ROM, which was from PC (via adequate link cable) on a first time, and which will (should ?) then evolve to SD card. That would be cool to make a Saturn game not requiring to burn CD-ROM somedays, but before that I need to finish neighboring side quests
Evolution of my Saturn projects
To conclude this article, let's say it was terribly fun to see some bits of the internals behind C language By the past, I remember I did something similar with my yeti3d adaptation, but remained at "C language level" : optimization done at that time was (IIRC, ) to avoid 4 bits shifts, because theses are not available in a single SH-2 CPU instruction. Avoiding 4 bits shifts was simply done by merging two fixed point operation in a single one (or something like that : I did this 7 years ago !), and this actually gave some improvements in 3D scene rendering Theses were the good times ... I sometimes think "I'm Getting Too Old For This Shit", but that's only to motivate to finish my old projects
But before that, Pseudo Saturn Kai, and then Kicad and Quartus are waiting for me
BTW, in the case you wondered about what was today's programming session, you probably guessed it was about exception handler addition to Pseudo Saturn Kai. This not a new feature, since it was available in Pseudo Saturn 0.83x ... in fact, I grabbed some sources from Pseudo Saturn 0.83x in order to implement this exception handler (thank you CyberWarriorX !) This exception handler will be available as a small add-don to cheat codes feature in Pseudo Saturn Kai next major release.
Written by cafealpha 7 comments
It's a long time USB dev cart is supported on Pseudo Saturn Kai, but it wasn't tested seriously elsewhere than my development environment. ... Until now
(Well, in fact, it was "until a couple of months ago", because I didn't had time to write this article earlier.)
So, a USB dev cart new user (Shazz) wanted to do some Saturn development : great
USB dev cart demonstration video (youtube). I used Shazz's USB dev cart to make this video, in order to be sure it worked well before sending it to him.
His dev PC runs under Linux ... I personally use Windows only, so I can't guarantee USB dev cart + Pseudo Saturn Kai will work correctly. "Maybe it will run fine with antime's ftx tool". "Maybe" Of course, it didn't worked
My first suggestion was "please use an old PC with Windows installed lol", but Shazz don't like such half-concession, and really wanted his USB dev cart to work directly on his Linux dev PC. As an USB dev cart manufacturer, I agree with him. As a programmer already busy with other projects and real life, I disagree ^^
But, Okay, Shazz is actually a cool and chatty guy, and sharing same mother tongue with me, so I will do it for him
The cause of the problem happening when using Linux + USB dev cart with Pseudo Saturn Kai is actually still unclear. With original USB dev cart firmware (nicknamed as "blinking screen", or sometimes "epileptic screen"), executing a Saturn program with "ftx" utility works fine. However, with Pseudo Saturn Kai installed, the same operation didn't worked and Pseudo Saturn Kai main screen was freezing (? or continuing doing menu things ? I already forgot about details about this bug It's really time to write it on this blog before I forget it completely ...) instead of switching to uploaded program.
I suspected Pseudo Saturn Kai ignoring two successive commands from USB dev cart ("executing" a program is actually sending an "upload" command, then "execute from specified address" command), especially because Pseudo Saturn Kai can't check for USB I/O continuously : it "just" does it once every frame.
Since I really couldn't understand why this could cause that "upload, then execute" problem, I decided to countermeasure it by adding a new "upload and execute" USB dev cart command. And on the same occasion, I also added the "à la carte" reset flags in this command : "one stone, two birds", as people in Japan would say ... I suppose that other people would rather say "one USB dev cart command to rule them all" :D
One more problem about this "Linux + USB dev cart + Pseudo Saturn Kai" problem was that I couldn't verify if everything is working fine or not. Shazz was OK to do some beta testing, but he can only upgrade his USB dev cart via USB link, so "breaking" USB transfer would brick his development cartridge. Around software development, I experienced enough Murphy's law and its corollaries to be sure it won't work on first try : - "If it can break, it will break" - "The less you test, the more likely it will fail on basic pattern" - "The more you test, the more likely it will fail on unexpected pattern"
So I added Pseudo Saturn Kai "demo" version As its name suggests, it actually doesn't do anything special else than showing menus, but that's enough in order to test communication with PC. Additionally, I also displayed some debug messages to screen when doing USB related stuff.
Pseudo Saturn Kai demo version showing USB activity logs on screen First two lines logs USB dev cart firmware version verification : even if used with old (not Pseudo Saturn Kai) version of firmware, transfer utility works
After testing many buggy versions of the firmware, Shazz tried the "20160323_test4" test pattern with his "parallax" test program, and ...
Could upload and execute libyaul example program from Linux via USB dev cart and Pseudo Saturn Kai !
Thank you Shazz for testing Pseudo Saturn Kai + USB dev cart Linux support !
USB debug port related support is always a hell for me and cartridge users (may not work on a given OS, etc), hence there are no plan to add it in release version of my cartridges. But even if it requires drivers and custom transfer software on PC side, debug USB connectivity is a must have when developing things on Saturn, so rather than dropping USB debug port, I plan to make a "USB + SD card interface" cartridge for Saturn developers only. And of course, I still continue to manufacture USB dev cart