Page 1 of 1

Sub Header

Posted: Wed Jul 05, 2017 11:40 am
by KanedaFr
Where could I find info on the SubProgram header ?

I saw nothing on the official doc on how to write a sub program, starting with the header....
For ex, what's the difference between SPInit and SPMain ? Does SPMain mean to be called after a Reset (using register $A12000) ?
Is there 3 , 4 or more jump on the header offsets ?

Re: Sub Header

Posted: Wed Jul 05, 2017 3:19 pm
by Chilly Willy
The main source is the example SCD code SEGA made... there's two versions included with the last SDK SEGA released, the second showing how to handle CD32X. It's in the docs, but you gotta hunt for it. The CD boot info is in the MEGA-CD Disc Format Specifications, and the header info is in the MEGA-CD BIOS Manual. Specifically, page 34. There's four user call vectors (0 to 3) - the first is called before int level 2 processing starts and is meant for initialization, the second is the main() and will be called over and over again when you exit (allows for chaining programs, I guess), the third is the user int level 2 routine and is called after the BIOS has done its processing. The last one is not called by the BIOS and is free for use by the programmer. I use it to retrieve a pointer to some boot info kept by my boot loader, but it can be of any use.

Re: Sub Header

Posted: Wed Jul 05, 2017 4:58 pm
by KanedaFr
Shame on me...everything I was looking for is on the MEGA-CD BIOS Manual, starting at page 30 :oops:
I thought it was only the bios calls :(

For main(), what's the better use then ?
to loop on it (bra _main) or to exit and wait for next int2 ?
From the manual, I would say exit and wait, but none of the code I saw do this....

Re: Sub Header

Posted: Wed Jul 05, 2017 7:54 pm
by Chilly Willy
I imagine that most games never exit. On console games (until they added OSes at least), the power button was your "exit" from the game. :lol:

My CD loader actually uses the "main" user call, loads "APP.BIN" from the CD, and calls the loaded binary. If that binary exits back, it checks d0 - if it's set, it assumes this is a pointer to a name of a file to load and run, so it tries to load and run that file. If THAT file exits, it does the same thing. Only if d0 is 0 does my loader exit... and then the BIOS will call it again, making it load and run APP.BIN.

Re: Sub Header

Posted: Wed Jul 05, 2017 9:08 pm
by KanedaFr
After some times thinking on it, it's clearly a bra that we need.
If you exit, it means you can only handle ONE command per VInt => when the main( ) starts

so let's keep the loop ;)


And I really like your idea...it would be very useful for a Mega(CD)Games compilation ;)

Re: Sub Header

Posted: Wed Jul 05, 2017 10:36 pm
by Chilly Willy
KanedaFr wrote:After some times thinking on it, it's clearly a bra that we need.
If you exit, it means you can only handle ONE command per VInt => when the main( ) starts

so let's keep the loop ;)
That's if you make your boot loader also the game. I separated the boot loader from any apps, as you can tell from my description. It has one default app name it tries to load initially, then counts on that to provide any other app names.

And I really like your idea...it would be very useful for a Mega(CD)Games compilation ;)
At the time, I was thinking two things: one, a file manager where when you select a file and press run, it passes the name back, so the boot loader loads and runs the file; if you loaded and ran it from the file manager, you'd have to be careful about the two overlapping in memory. And two, having an opening sequence for a game; the first part loaded would be a video player that played the opening video, then when you hit a button or it was done, it would pass back the filename for the game itself. You could even divide the game into levels that were completely separate - then you are less confined by the 512KB limit on program ram. The intro, each level, bonus levels, and the ending could all be completely separate and fill most of the available ram.

Re: Sub Header

Posted: Thu Jul 06, 2017 8:38 am
by KanedaFr
I'm not on the size limit yet so I'll keep your idea for later use ;)