Oh, maybe time to elaborate a bit.
When you develop for the PC-FX you can use two ways:
1) execute your program in an emulator. There is mednafen which is quite good but tuned to work well with 'what is out there'. It might quite easily 'accept' things to work that will NOT run on the real machine. In an ideal word, programmers would collect all of those occurances and properly report it to the developers of emulators. This hits me particularly often as I code things in assembly and do not rely on any existing libraries, so I am very likely to try something bad
2) burn your CD image onto an actual CD and have it run on your physical PC-FX.
#2 is incredibly slower and wastes many many CDs.
Also it doesn't help you TOO much when for example the screen simply stays blank because you tried an 'illegal' gfx mode setting (read: KING microcode).
People have suggested a third way: hook up your modern PC *SOMEHOW* to the PC-FX and directly feed data into it.
Ideas favored the RAM expansion port for this.
Another option could be using the Joypad ports!
I chose the latter.
Now there 2 options left:
1) simple to do and 100% risc free: open a controller and replace any number of buttons with some switch you can control from PC.
PRO: the controller does all the work for you and you can just read out the controller setting on PC-FX side.
CON: you can only transfer a limited number of bits every time (one per button/direction) AND you have no feedback from the PC-FX that it did in fact just received a value.
Another CON: you need one switch per bit.
2) mimic the complete serial protocol of the controller (it sends 32bits in rapid fashion via dedicated protocol with a CLOCK and LATCH signal).
PRO: you can transfer all 32 bits in one go! The PC-FX tells 'you' when it wants more data (LATCH line is pulled low) and you only need 5 data lines (VCC,GND,LATCH,CLOCK,DATA).
CON: you need to reverse the actual protocol and also you need to be pretty fast/accurate to keep up with the timing. This will NOT work (in a stable fashion) with ANY operation system running along. Not even one a modern PC.
I went with #2 again.
The PC-FX pulls the LATCH line to low (0 Volts) when it wants more data to come in.
Then it sends a quick clock signal HIGH/LOW/HIGH...
You need to sense that LATCH line, if it gets low, wait for it to get high then sense the CLOCK line and make sure you OUTput the signal of DATA line to either high or low depending on the state of your data bit (0 or 1). I tested that in C on the raspberry PI with _some_ success.
But it became clear that it would be too instable.
Then I went for a microcontroller (with only ~100 Mhz) in C. That worked but I wasn't totally happy.
Then I recoded the microcontroller in plain assembly (32bit RiscV, not TOOO different from the PC-FX's native v810 CPU btw!).
I wrote another small program for the PC-FX that does nothing else than putting intself into a memory section that is not being used and then polling
the keypad input in joystick port 2. It loops doing so until it gets a certain 32bit value there: 0x123456768 for example.
The microcontroller sees that the PCFX has pulled the LATCH line low and starts reading the CLOCK line and then settings its data to the DATA line bit by bit, 32 times.
It starts by sending 0x12345678 = one 32bit word.
The PC-FX receives this start-signal value and then asks for another keypad input (usually it would NOT expect a full 32 bits to arrive because some of them are un-used).
The microcontroller sends the following (every time it is being asked, so the PC-FX side fully dictates the delay between the data chunks):
1) destination address (32 bits conveniently, usually 0x8000)
2) execution address (usually 0x8000)
3) data length
and then one word after the other all the data. In the video that's about 21KB sent in less than a second.
I hope this helps clearing this up a bit.
And I will try a few more things here and there and then also put all that code onto github as well.
The PC-FX community appears to have a great history of sharing and I, too, received immediate help and first pointers on my arrival.