PPCenter :: devblog

PPcenter. Arts and craft for my Sega Saturn. Since 1847 :D

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 6 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

Blog's CMS updated ...

Written by cafealpha no comments
Updated ... for around two hours, then reverted to previous version
Making a backup of whole devblog directory before trying version update was useful this time

Details about why I reverted to previous version : I first wanted to try latest version in order to see if image upload is better than current one (sluggish HTTP POST upload ).
So I download Pluxml latest version, and verify differences with current one installed in this blog (there are some modifications for captcha and extra smileys), merged everything, uploaded and ... article editor plugin (pxleditor) displays corrupted text when trying to modify an article

It's not that I can't do anything without article editor plugin, but ... I don't want to write articles in raw HTML (), and trying other editor plugin was only an half-success, because I prefer pxleditor simple interface (the simpler the better ).

Well, I don't give up, but that's enough web-related things for today this week this month ().
I don't know if I hate html/php, or if html/php hate me, or both, but what's sure is that I prefer Saturn programming

Next time I will try to update my blog, I will first try with xampp on my dev laptop ^^


Edit (2015/11/12) : at least I made one change to my blog : I added this smiley :
This is the image from where I made the cow (not hippopotamus) logo that I put on all my personal projects
I found it in "pre 2007" archive folder in my laptop. Fortunately this old file wasn't lost

Edit (2015/11/16) : re-install from scratch, and local setting & testing with xampp did the job. However, "send email to cafe-alpha when comment is posted" feature seems to be broken, but I will investigate about this later

Edit (2015/11/18) : email send feature is fixed, everything is working correctly, and blog's CMS is updated to its latest version

Edit (2016/01/14) : fixed article formatter in order to display images in a separate browser tab.

Read more Blog's CMS updated ...

Rss feed of the tag