Bit shift in Saturn minimalistic C program

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


__ashrsi3

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.

Read more Bit shift in Saturn minimalistic C program

Pseudo Saturn FAQ, May 2017 edition

Written by cafealpha 8 comments
Here is a small FAQ about Pseudo Saturn, so that it may help people experiencing troubles when installing or using Pseudo Saturn, and also ... reduce the number of inquiries in my mailbox

Pseudo Saturn 0.832 "Booting CD ... Error 1" message when trying to load a game.


The "Booting CD ... Error 1" message.
Special Thanks to C.L. for reporting the problem and sending the picture

This problem happens with Pseudo Saturn 0.832, both "no logo" initial build and final release with classy logo.

It concerns :
 - A specific hardware revision of Saturn : Japanese grey model 1 (95% sure), with power supply connector screwed to Saturn top case (not so sure).
 - Any game or application on burned on CD-R

So if you have Pseudo Saturn 0.832 and the "wrong" (incompatible) hardware revision of Saturn, it's not possible to play any CD-R copy of your games, and consequently can't upgrade your cartridge to other version of Pseudo Saturn, since it requires to boot a CD-R

Annoying isn't it ? The countermeasure is to either :
 1. Install latest Pseudo Saturn Kai on your Saturn cartridge
 2. Use another Saturn, compatible with Pseudo Saturn 0.832 :
      - Model 2 Saturns are 99% safe : I didn't received any "Boot Error 1" report with model 2 Saturn.
      - Please try on another model 1 Saturn only if you were lucky that day, else please be sure that this other Saturn won't be compatible too

Owning a spare and compatible Saturn -or being friend with somebody owning one- is the best solution, since it allows to both upgrade to Pseudo Saturn Kai, and to play games compatible with "JHL (PS 0.832)" game loader.

Owning only 0.832 incompatible Saturn(s) will bring you to "install Pseudo Saturn Kai on a bare Saturn" step, so basically requires to open your Saturn, watch swap trick tutorials on youtube, fail several times in trying that ('%)=(&$ swap trick, finally success in installing Pseudo Saturn Kai , look for one missing screw in order to put back Saturn top cover, re-open the Saturn in order to remove the tape on CD-ROM lid open switch, and finally put back the Saturn in its original condition

Long install steps ? Yes, but at the end the problem will be fixed (if not, please contact me)
However, there's a limitation when using Pseudo Saturn Kai on model 1 incompatible Saturns : the few games not compatible with Pseudo Saturn 0.831 won't be playable
Incompatible games are the ones marked as requiring Pseudo Saturn patcher utility, in Pseudo Saturn Kai compatibility list. Notable examples are Panzer Dragoon Saga, Batman Forever and Alien Trilogy.

You sold a kidney in order to buy original discs of Panzer Dragoon Saga, and really want to play their CD-R copies on your model 1 Japanese Saturn so that original discs won't be damaged ?

Except selling the remaining kidney in order to buy a Rhea/Phoebe (), the only solution is to wait until a new version of Pseudo Saturn Kai is released, and hope I find a fix to this problem.
While waiting for new version of Pseudo Saturn Kai, how about trying games that Pseudo Saturn Kai can play with its good old "CWX (PS 0.831)" game loader ? I would for example recommend NiGHTS into dreams, Shining Force 3 series, and also Virtua Fighter Kids



"Firmware file read error !" message when trying to install Pseudo Saturn Kai

"Firmware file read error !" message (hard to read, sorry).
Grabbed from reddit, special thanks to yoqu for reporting the problem

First, I fixed error text display in Pseudo Saturn Kai's latest release (v6.074) : it is now displayed with white background color. Readability varies from a TV monitor to another, so please contact me if that's still not readable on your TV

This problem is generally caused by incorrect timing when performing swap trick, which makes Saturn booting Save Data Manager and Flasher utility from CD-R, but not being able to read files from CD-R after that.
Another causes may be Saturn's laser incorrect calibration, or affinity problem between Saturn CD block and CD-R brand, or burn settings.

The countermeasure is simple : please use Pseudo Saturn Kai alternate flasher utility, located in Pseudo Saturn Kai latest archive → pskai_alternate_flasher.iso. This requires another CD-R, but this will work
And, burning Pseudo Saturn Kai Save Data Manager and Flasher utility (pskai_sdm_flasher.iso) wasn't a waste, since it will boot correctly after flashing your cartridge to Pseudo Saturn Kai. Save Data Manager contains many save data to import to your Saturn, so you probably want to use them in order to start playing your favorite game elsewhere than level 1

So, what's the magic behind Pseudo Saturn Kai alternate flasher utility ? nothing really special in fact : both flasher executable and Pseudo Saturn Kai firmware data are packed in a single Saturn executable file. So as firmware data is loaded just after performing swap trick, file read error won't happen


Definitely not a smart way to counter a problem,
but it works, which is the most important


This "alternate" flasher utility was developed before Pseudo Saturn Kai, and used in Pseudo Saturn 0.83x flasher utilities. I then developed an "all in one" Save Data Manager & Flasher utility on a single CD-ROM which allows to flash cartridge, manage save data, etc.

I though this would make the "alternate" initial flasher utility obsolete, so that it was dropped in Pseudo Saturn Kai 6.036 and 6.037 releases ... unfortunately I was reported about that "Firmware file read error !" problem after that
So as a countermeasure, I restored this utility from Pseudo Saturn 6.074. Sorry for the troubles caused

Additionally, some more informations about this problem are displayed in current (W.I.P.) Pseudo Saturn Kai version.

Updated error message in flasher utility.

Pseudo Saturn Kai development continues ! Stay tuned

Read more Pseudo Saturn FAQ, May 2017 edition

Pseudo Saturn Kai lite firmware fixes and improvements

Written by cafealpha no comments
One month from last update, but not significant updates
The reason is that children fought with nearly all typical winter diseases during the last three weeks : mumps, influenza (x2), gastro enteritis, and finally otitis ... x2 too

data/images/20160314_gg_winter.tb.jpg
Internet husband ...
I hesitated to put other pictures like "x2 combo !"
and "body temperature over 40 ? High score !"

Children were relatively safe from winter diseases until last month, but last spurt until summer was relatively heavy for them


So, no significant updates, but various minor updates :]

Among theses updates, main menu display has been improved when lite version of the firmware is used :
 - "Extra" features moved to main menu
 - System status now displays Saturn related informations (BIOS version and PAL/NTSC frequency information) rather than nothing when USB and SD card aren't detected.
Theses changes concerns USB dev cart and Action Relay users, hence the majority of Pseudo Saturn Kai future users, so theses changes couldn't be avoided before initial release

Here are pictures taken before and after the changes.
Many thanks to Zone66x for testing and taking theses pictures

data/images/20160303_pskai_5820.tb.jpg
Pseudo Saturn Kai v5.820 : status display was a little "empty"
And USB port was incorrectly detected when running from Action Replay ...



data/images/20160310_pskai_5875.tb.png
Pseudo Saturn Kai v5.875 : some saturn informations are now displayed.
There's no simple way to detect if cartridge is Action Replay or not,
so generic "Boot Cart" string is displayed when cartridge type is unknown.

And main menu is a little simpler :
no longer need to go to sub menu in order to access extra features.


Also, Zone66x verified that Action Replay communication port (parallel-like port) was usable with Pseudo Saturn Kai. Thank you for testing



Another new feature I'm proud enough to introduce it on my blog is the soft reset "à la carte"
Soft reset is used in Pseudo Saturn Kai when loading game from CD-ROM, and also when executing program received from USB port.
Basically, it wipes all memory, and puts VDPs memory and registers in initial state, which is good when loading game from CD-ROM, but causes problem when Saturn developer wants to do something else than "just" executing program on main RAM.
The "à la carte" advantage comes here : it is possible to select which module to soft-reset, and which one to let as-is before executing program.

Here is an example :

data/images/20160318_pskai_main_screen.tb.jpg
Pseudo Saturn Kai (lite version installed on USB dev cart) main screen.
Test program will be executed from this screen.

Let's try to let VDP registers and VDP1 RAM as-is when uploading test program :
data/images/20160318_test1_satlink.tb.jpg data/images/20160318_test1_result.tb.jpg
Soft reset "à la carte" settings and execution result :
Starfield (VDP1) remains in memory and is displayed on test program.


One more try, but with VDP1 RAM clear before execution :

data/images/20160318_test2_satlink.tb.jpg data/images/20160318_test2_result.tb.jpg
Soft reset "à la carte" settings and execution result :
As VDP1 RAM is cleared, starfield is no longer displayed.

Possibilities for this features are relatively wide : it's for example possible to upload graphics on VRAM, then level data on sub RAM, then execute test program on RAM.
I hope this will help to improve Saturn homebrew development scene :)

Read more Pseudo Saturn Kai lite firmware fixes and improvements

Merry New Year !

Written by cafealpha 6 comments
Classified in : PPCenter, Saturn, Mylife Tags : Christmas, Saturn, kai, beta, development, testing
I sometimes check this blog in order to verify if there are some interesting news, without success, and then I realized that I am the only author of this blog (), hence though I should write something here in order not to deceive my countless fans.

So, sorry for the lack of news recently, I was busy with Saturn things, but also in deciphering Christmas presents lists ... and now busy in tidying up lego blocks and trashing used wrapping paper

I hope you're spending nice Christmas vacations ! I'm a little late for wishing you a merry Christmas ( ), and a little early to wish you an Happy New Year ( ), hence the broken title


So what's new with my Saturn projects ? In fact, nothing worth writing an article, but here is a short (and probably incomplete) list anyway :

 1. SD Memory Cart : when overwriting save on Saturn side, keep the old save file on SD card (but remove it from saves list, of course).
Basically, it automatically keeps old saves somewhere on SD card, so that it is possible to revert to a previous state. I hope Saturn RPG fans will like

 2. USB dev cart mode : when USB cable is detected, allow to unlock CD-ROM and then prompt for data upload.
This feature allows to makes tests on Saturn main program using data from CD-ROM without the need of installing a modchip, and without the need of burning a CD-R on each program changes
Special thanks to Shazz for reminding me to add such a feature, antime for wiring FTDI's PWREN signal to Saturn (it was unused for 3 years, but it was useful in order to detect USB connection, and hence hiding USB dev mode for normal users not using USB), and of course CyberWarriorX and jhl for Pseudo Saturn

 3. PCB changes : basically removing few debug "in case of" stuff, and also moving SD card socket in order to fit better with cartridge shell.
It is still WIP, but plan to send the updated gerber to the PCB house on next month.

 4. Few changes to the sources of yabause I'm using for testing my projects.
Especially, I added position save/restore and keyboard shortcut to each debug dialogs ... long time I wanted to do this

 5. In Backup Data Manager, some additions to "Import" feature : backup data dump file read and parse was done a while (4-5 months ?) ago, I just added something to select where (Internal Memory or Cartridge or Floppy) to save selected saves, and plan to port save data extract algorithm next month or so
Thanks to hitomi2500's ss-save-parser project, such "Import" feature is easy to integrate in my Backup Data Manager project


Last but not least, I also want to thank Stac user on Assembler forums
He's doing good job in beta testing, and thanks to his reactivity and good communication, project is progressing faster than I was expecting.
Beta testing is far from being a funny job, especially with me as main programmer (), and when testing requires to play games (this requires time, and bugs on my Saturn project may lead to loose of progress in game), so once more, thank you 

Read more Merry New Year !

Firmware development - will it work somewhere else than in my dev Saturn ?

Written by cafealpha 6 comments
Classified in : Saturn, Programming, Mylife Tags : saturn, memcart, kai, beta, video
I'm still developing the firmware for my custom cartridge, and it worked enough so that I could take a video of it running on real hardware


data/images/20151028_pskai_sdcard_test.jpg
Click on the image in order to see its youtube video.
You can also click here in order to download .avi file.


Video may be blurry, so here are some additional pictures :
data/images/20151029_testcart_usb.tb.jpg
USB & SD card cartridge.
This is the cartridge I mainly use for testing on real hardware
(USB port is used for debug purposes)


data/images/20151029_testcart_beta.tb.jpg
SD card cartridge for Saturn.
This is the version I plan to release in the case development continues well


data/images/20151029_flatcube_from_sd_card.tb.jpg
Flatcube demo loaded and executed from SD card.
This picture is here in order to put a link to the homepage of flatcube demo author


And last but not least, many thanks to beta testers for their cooperation and patience

data/images/20151028_pskai_bt2_saturn.tb.jpg
Beta cartridge loaded on modded Japanese Saturn.
Thanks to
MeteK for beta testing and taking this picture
Last week, MeteK reported that basic SD card access worked on his Saturn

data/images/20151028_pskai_bt1_screen.tb.jpg
Pseudo Saturn Kai System Information screen.
Thanks to Alexandre Souza from www.tabalabs.com.br
for beta testing and taking this picture 

data/images/20151112_tabajaralabs_noshell.tb.jpg - data/images/20151112_tabajaralabs_shell.tb.jpg
Additional pictures from Alexandre : cartridge without, then with shell.
Alexandre is currently trying to 3D print cartridge shells. Please do your best


I still can't getting things working on Alexandre side : SD card doesn't respond to SPI requests from Saturn via my cartridge ... I suppose this is due to a bad hardware design on cartridge side, but I still need to investigate about this ...

Edit (2015/11/11) : it is fixed and verified here
Fortunately, it was not an hardware error, but a firmware (SH-2 side) error.
About details : I access SD card by using SPI protocol, and the reason some cards couldn't be initialized was due to the fact that commands were incorrectly received by SD card.
Sending a dummy synchronization byte before sending command to SD card fixed the problem.
data/images/20151111_sdtest_satlink.tb.png
Log taken from my dev Saturn : first half is SD card initialization sequence,
and second half is data blocks reading.

data/images/20151111_sdtest_yabause_log.tb.png
It works under custom build of yabause too
Thanks to this, most of the tests could be done on PC,
which saved a lot of development time.
Thank you yabause team



After doing some testings on my side, I could verify that :
 - SD card access works fine on all the 6 Saturns I own
 - Some SD card can't be accessed via my cartridge, while the others work fine. (← fixed)

data/images/20151102_test_saturns.tb.jpg
Saturns used for testing.
The one on the top of the picture is my good old dev unit

data/images/20151102_test_sd_ng.tb.jpg
SD card that aren't recognized by my cartridge.
Edit (2015/11/11) : I fixed firmware and 32GB micro SD card above was recognized
(I didn't tested with the other SD cards, but I suppose it is now OK too.)

data/images/20151102_test_sd_ok.tb.jpg
SD cards that were correctly recognized by my cartridge.



To conclude this article, I have to say than this project doesn't make exception to Muphy's Law :
Anything that can go wrong will go wrong

Beginning of year (2015) : Virtual Memory Cart related debug. After verifying that it has the chance to work, I temporary stop its development, mostly because I was bored to continue development of this feature ^^;
Until this summer : a lot of struggle with Pseudo Saturn 0.831/0.832/flasher/etc related things.
September : SD card library related troubles. Try to get a solution by using -and trying to fix- thinfat32 library. Using fat_io_lib was a better choice, thank you hitomi2500 for your advice about this library
October ~ Now : Troubles with SD card on Alexandre side ... will work if another SD card is used (currently waiting for test results) ?

Anything that can go wrong will go wrong
But at least, beta cartridge half works, so I can safely continue its development


I plan to release the first batch of cartridges with SD card included, so that there won't be incompatibility issues on user side.
As my project is a low cost one, and also because it won't load commercial games, I plan to sell the cartridges with low cost (8GB or maybe 16GB) SD cards.
Edit (2015/11/11) : SD card compatibility is likely to be fixed, and as far as possible I don't want to do SD card stock management/etc, I will probably release cartridges only.
There still no release date to announce, because some fixes/features addition/testing/etc is remaining, and also because I mostly do this for fun

Read more Firmware development - will it work somewhere else than in my dev Saturn ?

Rss feed of the tag