Unnamed CPS1 SDK

Yoshin222

Student
Joined
May 20, 2025
Messages
44
Reaction score
39
Location
UK
For the past while, I've been chipping away at my own custom CPS1 SDK inspired by the work of Fabian Sanglard (read The Book of CP System, love that thing!)
I'm ware of CCPS, and while that thing is cool as hell and I have a ton of respect and admiration for the guy who made it, Python is what I'm comfortable with, and far as I can tell it's somewhat incomplete, both in example code to use and sound stuff. Plus I didn't want to deal with Linux stuff at the time, anyway the point is I made something I'm personally more comfortable with!
It uses Python alongside the ASMX assembler to make creating stuff as painless as possible. There's a newproject.py script for generating new projects, and you can specify a MAME path in python/config.py so that when you do make new projects, it automatically spits out a run_[game]-debug.bat ya can run, so once MAME is setup to point to the SDKs ROMs, ya can essentially forget about it.
Atm there are 3 main python scripts

--- assemble68k ---
The main object of this script is twofold, generate CPSB register addresses based on our projects B-Board, and split up our assembled data into the proper ROMs

assembleGFX
Takes src/gfx/GFX_RES.py and allocates tiles, extracts palletes and generates draw_calls that can be easily used by the SDK based on what's in the GFX var. NOTE: It's because of this that it's best to run this first, then assemble68k. I'll probably make a script to automate this at some point

assembleZ80
Exactly what it says on the tin. ATM all it does is assemble Z80 code then chuck it into ROMs, but the functionality of this is liable to drastically shift as Music and SFX gets incorporated

Projects come with example code in src/68k/z80 respectively, and src/gfx/GFX_RES.py is where you'd declare all ya GFX files + how GFX are mapped out. There's planned to be plenty of docs to make programming stuff more approachable, and I even have a friend of mine chipping away at a sound driver, while I chip away at a Furnace convertor (both of which may be a while)

Anyway, it's not QUITE release worthy yet, least in my opinion. There's some refactoring to do with GFX, especially so SCR layers optimize tile usage, but the idea is there.
As for sprites, atm ya just chuck in BMPs and ya can write the draw_call as ya like. Sprites are stored in horizontal strips akin to how Capcom eventually did, but this could also use optimizing both to save space and for actual drawing
Main purpose of this thread is to both track progress and maybe get suggestions for stuff to add and the like. If all goes well I'd like to release some kind of demo soon enough, but of course the holidays are coming up so I make no promises. Anyway, stay tuned, and any suggestions are welcome! I'll update this post with builds/demos as they release

TO-DO (in order of priority/likelihood to be added)
- Finalize template code
- Debug info (How much PRG/GFX/Z80/OKI ROM has been used, maybe something to extract var names to make writing LUA scripts easier, that type of thing)
- Optimize Tile assignment
- Music+SFX
- Refactor scripts
- Additional GFX Formats (mainly PNG)
- More game configurations
- Kabuki support??
- SCR Quantization (the online tool is sick as hell, but it'd be ideal if the SDK handled that too)
- Maybe a custom MAME build with additional tools to help with debugging, like a visualizer for OBJ Draw_calls, displaying cycle counts for instructions ala MESEN, etc), alongside maybe a Software List to make custom CPS1 games much easier similar to how ya can with Neogeo.xml. The CPS Changer exists, I don't see why not! I'd seriously love this one so if anybody knows how to go about that, please let me know!
- Darksoft/CPS1.net ROM output, that way you'd have a version that works with another emulator + a mega simple way of testing out ya project on real hardware...I just need to actually get a multi eventually to test that
- The dream would be custom tools for stuff like SCR design or Meta-Sprite creation, but for the most part I think the scr
- Some sort of VSCode extension would be sick, that way ya could work on a project and just press a shortcut to run one of the assemble scripts, but that's for later

Demo Scene using a double buffered sprite + all 3 SCR layers
1765760322796.png
1765760985066.png


Big SCR3 Test (Basically just to show that ya can with this thing)
View: https://bsky.app/profile/yoshinpixels.bsky.social/post/3m7r64lwbhk2j
 
Update on the SDK!
Music and SFX is well underway! Made a convertor so ya can input Furnace files, and the script extracts all the sequence data, FM Instruments and OKI Samples.
A friend of mine is working on the Driver, and we aim to put his song onto real hardware!
Crisptune Music: The Blocks Move Me Once More

Also made code to take your output data and generate a version of the ROM that SHOULD be compatible with the Darksoft CPS1 Multi. Picked up one of those a bit ago, and all is good barring my lack of a proper C-Board. Would anybody know where I could snag one? Best I can find is full listings of arcade boards that include it but just makes sense to try and swipe just the C-Board if possible, but needs must. I want this BAD!
Can confirm the Multi recognizes the CPS1 SDK test in the previous post! Whether or not it works proper is yet to be seen, but I'm hopeful!
Aside from that, going to work on refactoring GFX stuff after sound stuff is wrapped up, then it should be good enough to release!



1774366843629.png
1774366869573.png
1774366802335.png


1774367320793.png
 
So big development today!
Finally managed to snag a suitable C-Board. Well, "suitable", it's a 92641C-1, and in the support thread that seems to be the absolute most finicky one lol
Anyway, it's selective with what games work, sadly Knights is one of them. It works but SCRs don't display
In spite of that, was able to port the SDK Test to run on the Multi! Thankfully the conversion script was fairly simple to do, just grab the ROMs and adjust as needed.
It's the first posted image so custom Graphics, code and Oki samples. My friend is still chipping away at music but it's coming along so get hyped for that!
Hoping to release some kind of build within a month or two, participating in a fighting game jam thing as an artist so idk how much of this month I'll have to work on this more, but I got a lot of ideas!
CPS1 SDK Test on real hardware!
 
Beautiful news!
Was able to snag a C-Board from @foxical , and with it, the Multi seems to be fully operational!
Can confirm my SDK Test works on real hardware! Couldn't be happier!
Gonna optimize OBJ/SCR tiles and draw_calls, write some docs and then release a version of the SDK, hopefully within the month! Also hoping to move to Linux soon so I'll probably need to write new stuff to accommodate that but that's a bridge to cross when I get to it. In the meantime, let's fucking go!!!
 

Attachments

  • IMG_20260505_114825317_MFNR.jpg
    IMG_20260505_114825317_MFNR.jpg
    335.2 KB · Views: 80
Small update: finally ditched Windows and am now on Linux! The SDK will need some serious refactoring for things to go smoothly on it and Windows but hey, multiple OS support! Get hyped 👍
 
Followup: The SDK now works on Linux! Even better, it's been refactored a lot to be a lot less daft. It used to be that each project spawned it's own assembly script for assembling 68k/GFX/Z80. Now that's been solidified into global scripts that a project can call, and every project can define which game to use as a base as well as what ROM to output to, potentially useful for stuff that uses similar boards, potential hacks, that kinda thing
Alongside that, refactored things so much that each script can not only run individually, but easily be called, as demonstrated with this "build_game" shell script. I imagine getting this 1-1 on Windows will be a bit finicky but hey!
Gonna optimize GFX by optimising draw_call generation/tile allocation, then see about releasing a demo build soon!
The idea is OBJ sprites will be "trimmed" to be on the upper left of the canvas, then each row of tiles is trimmed horizontally so only the data that's actually used will be allocated/taken into account when a draw_call is made. SCR layers should be a bit easier, just make flipped varitants of tiles and get rid of redundant tiles as we find em
 
Back
Top