What's new
It works for me, but I am unsure if all controls are right.

I might need some help to implement a form of force feedback in it.
The original cabinets had a spring that pulled the steering wheel back to the middle.
They had a motor that made the wheel vibrate if you went off road or crashed.

It's an export version so you might need to change your region.

It's based upon cannonball in case you might wonder.
 
I will check it out this weekend - just saw this post!

Matt
 
Confirmed this is working. Thanks for sharing.

The game play feels a little....clunky? But then again, I've been playing the shit out of or2sp the last ~9months and haven't played or1 in years. Not sure if it is game itself, inputs, i/o, or conversion, etc.

Guess I gotta score a or1 cab now to compare ;)

Thanks again man!
 

Attachments

  • or1-chihiro.jpg
    or1-chihiro.jpg
    140.9 KB · Views: 231
Last edited:
it's normal outrun 2 is the same in xbox. You can unlock it. We have the same with Fzearo AX avallable in F zero disc on gamecube.....So this video is very interesting because now we are sure the JVS I/O input is converted to USB xbox I/O....
Another thing this is the last port recent with Ferrari car , with the Saturn version (ut's not a emulation true port in 60 fps and without default...). Other port no Testarossa.
 
Hrmmmm... so they out here converting Xbox one games to work on Chihiro? I know they got it working the other way round a while back

$ strings outrun1.bin | grep -i outrun
Outrun I
d:\outrun_xbox\Cannonball\Release\or1.exe
D:\outrun\boost_1_65_1\boost/property_tree/detail/ptree_implementation.hpp
D:\outrun\boost_1_65_1\boost/property_tree/string_path.hpp
D:\outrun\boost_1_65_1\boost/property_tree/detail/xml_parser_write.hpp
D:\outrun\boost_1_65_1\boost/property_tree/xml_parser.hpp
D:\outrun\boost_1_65_1\boost/property_tree/detail/xml_parser_read_rapidxml.hpp
d:\outrun_xbox\Cannonball\Release\or1.pdb
d:\outrun_xbox\Cannonball\Release\Cannonball.exe
Place OutRun Revision B ROMs in this directory.
The original Japanese release of OutRun featured slightly different tracks
http://reassembler.blogspot.co.uk/2013/01/outrun-original-game-shipped-with.html
 
Should be able to open it in fatx explorer and get an idea of what it contains. I don’t have a windows box handy.
 
In my opinion, it would be ideal for this to be made to work with FFB on a stock OR2 standard cab with Sega MIDI FFB. A secondary goal might be to interface with the Namco RS-232 FFB. These are the only 2 FFB hardware setups that interface with a Chihiro, as far as I'm aware. I have cabs with both, and have a decent understanding of the FFB protocols, so would be happy to help.
 
Thanks for the offer to help. I thought you were the person that had the information about force feedback.
Cannonball uses sdl, and sdl seems to sample the inputs every 10ms. The framerate is 60Hz, so basically there are 16ms between 2 frames. I have no idea if this would make the inputs less responsive. Maybe running them in sync with the frames would be better?
I also noticed that occasionally the jvs trasfer is not complete when the info from the board is read; so likely that needs some tweaking as well.

The whole thing started as a port from cannonball to xbox. Next step was getting base board communication going as those libs aren't public anywhere. april first looked like the perfect day for a chihiro release.

Cannonball uses xml files for it's settings and hiscores which can't be used on chihiro. So I also had to find a way to use the base board for those.

The first thing in force feedback I would like to implement is the auto centering of the steering wheel. Original outrun cabinets used a spring for that. It would likely play a lot more authentical if we could implement that behavour.
 
I've got centering figured out and I think the commands for doing so are in my FFB translator thread, so I guess the question is, are you able to tap into the MIDI in/out for FFB?

I'll try to track down the specifics.
 
The base board contains 2 microcontollers, the an2131QC and smaller an2131SC The QC is connected to gameport 4 and the SC to gameport 3 One of the QC's serial ports is used to communicate with the JVS board (RS485) The SC uses one of it's serial ports for FFB (either midi or rs232) and the other to communicate with the cardreader. I haven't tested it yet but I am pretty confident that communicating with the SC is very simmilar as it's done with the QC.
The other QC serial port looks like an unpopulated debug port. You can clearly see the solder pads for a DB9 connector on the edge of the base board pcb.
 
Both those controllers can be reprogrammed, so it might even be possible with new firmware to have them do the conversion between the sega games midi protocol and the happ board serial protocol. (The other FFB option) Not sure how you could handle that output that sega games use for start lamp and the happ solution for ffb board initialisation.
I might just be rambling here. Some stuff I seem to remember from your experiments.
 
Is this a good place to mention I’m almost done with the 18 wheeler to Outrun conversion ? ;)
 

Attachments

  • BD1391FD-A813-46A0-A620-F0F847696BC3.jpeg
    BD1391FD-A813-46A0-A620-F0F847696BC3.jpeg
    552.2 KB · Views: 210
For what it is worth you can extract the provided outrun1.bin with Chihiro-Tools
https://github.com/JayFoxRox/Chihiro-Tools/blob/master/extract-fatx.c

$ ./extract-fatx ~/Desktop/outrun1.bin outrun1
FAT size is 2050 / 0x802
Partition-Size: 16777216 bytes
Cluster sector count is 32
First root cluster: 1
Guessed clusters count: 1025 / 0x401 (FAT16)
Superblock is 4096 / 0x1000 bytes
Cluster size is 16384 / 0x4000 bytes
Searching file area...
Cluster base is 53248 / 0xD000 bytes
Entry 0 (Cluster 1) is called 0x8 'name.txt' (extracting to 'outrun1/name.txt'), firstcluster is 2 (Filesize: 10 bytes)
Cluster type: 0xFFFF
Volume label
Entry 1 (Cluster 1) is called 0x7 'boot.id' (extracting to 'outrun1/boot.id'), firstcluster is 3 (Filesize: 480 bytes)
Cluster type: 0xFFFF
Extracting 'outrun1/boot.id' from cluster 3
Entry 2 (Cluster 1) is called 0xD 'firmware2.bin' (extracting to 'outrun1/firmware2.bin'), firstcluster is 4 (Filesize: 6680 bytes)
Cluster type: 0xFFFF
Extracting 'outrun1/firmware2.bin' from cluster 4
Entry 3 (Cluster 1) is called 0xC 'firmware.bin' (extracting to 'outrun1/firmware.bin'), firstcluster is 5 (Filesize: 6922 bytes)
Cluster type: 0xFFFF
Extracting 'outrun1/firmware.bin' from cluster 5
Entry 4 (Cluster 1) is called 0xA 'config.xml' (extracting to 'outrun1/config.xml'), firstcluster is 6 (Filesize: 2694 bytes)
Cluster type: 0xFFFF
Extracting 'outrun1/config.xml' from cluster 6
Entry 5 (Cluster 1) is called 0xC 'hiscores.xml' (extracting to 'outrun1/hiscores.xml'), firstcluster is 7 (Filesize: 3460 bytes)
Cluster type: 0xFFFF
Extracting 'outrun1/hiscores.xml' from cluster 7
Entry 6 (Cluster 1) is called 0xD 'hiscores2.xml' (extracting to 'outrun1/hiscores2.xml'), firstcluster is 8 (Filesize: 3460 bytes)
Cluster type: 0xFFFF
Extracting 'outrun1/hiscores2.xml' from cluster 8
Entry 7 (Cluster 1) is called 0xD 'hiscores3.xml' (extracting to 'outrun1/hiscores3.xml'), firstcluster is 9 (Filesize: 3460 bytes)
Cluster type: 0xFFFF
Extracting 'outrun1/hiscores3.xml' from cluster 9
Entry 8 (Cluster 1) is called 0xA 'config.bak' (extracting to 'outrun1/config.bak'), firstcluster is 10 (Filesize: 2694 bytes)
Cluster type: 0xFFFF
Extracting 'outrun1/config.bak' from cluster 10
Entry 9 (Cluster 1) is called 0x7 'or1.xbe' (extracting to 'outrun1/or1.xbe'), firstcluster is 11 (Filesize: 712704 bytes)
Cluster type: 0xFFFF
Extracting 'outrun1/or1.xbe' from cluster 11
Entry 10 (Cluster 1) is called 0x3 'res' (extracting to 'outrun1/res'), firstcluster is 55 (Filesize: 0 bytes)
Cluster type: 0xFFFF
Trying to open dir
Entry 0 (Cluster 55) is called 0xB 'tilemap.bin' (extracting to 'outrun1/res/tilemap.bin'), firstcluster is 56 (Filesize: 2804 bytes)
Cluster type: 0xFFFF
Extracting 'outrun1/res/tilemap.bin' from cluster 56
Entry 1 (Cluster 55) is called 0xD 'tilepatch.bin' (extracting to 'outrun1/res/tilepatch.bin'), firstcluster is 57 (Filesize: 1870 bytes)
Cluster type: 0xFFFF
Extracting 'outrun1/res/tilepatch.bin' from cluster 57
[end of directory]
Leaving directory
Cluster type: 0xFFFF
Entry 11 (Cluster 1) is called 0x4 'roms' (extracting to 'outrun1/roms'), firstcluster is 58 (Filesize: 0 bytes)
Cluster type: 0xFFFF
Trying to open dir
Entry 0 (Cluster 58) is called 0xC 'epr-10187.88' (extracting to 'outrun1/roms/epr-10187.88'), firstcluster is 59 (Filesize: 32768 bytes)
Cluster type: 0xFFFF
Extracting 'outrun1/roms/epr-10187.88' from cluster 59
Entry 1 (Cluster 58) is called 0xD 'epr-10327a.76' (extracting to 'outrun1/roms/epr-10327a.76'), firstcluster is 61 (Filesize: 65536 bytes)
Cluster type: 0xFFFF
Extracting 'outrun1/roms/epr-10327a.76' from cluster 61
Entry 2 (Cluster 58) is called 0xD 'epr-10328a.75' (extracting to 'outrun1/roms/epr-10328a.75'), firstcluster is 65 (Filesize: 65536 bytes)
Cluster type: 0xFFFF
Extracting 'outrun1/roms/epr-10328a.75' from cluster 65
Entry 3 (Cluster 58) is called 0xD 'epr-10329a.58' (extracting to 'outrun1/roms/epr-10329a.58'), firstcluster is 69 (Filesize: 65536 bytes)
Cluster type: 0xFFFF
Extracting 'outrun1/roms/epr-10329a.58' from cluster 69
Entry 4 (Cluster 58) is called 0xD 'epr-10330a.57' (extracting to 'outrun1/roms/epr-10330a.57'), firstcluster is 73 (Filesize: 65536 bytes)
Cluster type: 0xFFFF
Extracting 'outrun1/roms/epr-10330a.57' from cluster 73
Entry 5 (Cluster 58) is called 0xE 'epr-10380b.133' (extracting to 'outrun1/roms/epr-10380b.133'), firstcluster is 77 (Filesize: 65536 bytes)
Cluster type: 0xFFFF
Extracting 'outrun1/roms/epr-10380b.133' from cluster 77
Entry 6 (Cluster 58) is called 0xE 'epr-10381a.132' (extracting to 'outrun1/roms/epr-10381a.132'), firstcluster is 81 (Filesize: 65536 bytes)
Cluster type: 0xFFFF
Extracting 'outrun1/roms/epr-10381a.132' from cluster 81
Entry 7 (Cluster 58) is called 0xE 'epr-10381b.132' (extracting to 'outrun1/roms/epr-10381b.132'), firstcluster is 85 (Filesize: 65536 bytes)
Cluster type: 0xFFFF
Extracting 'outrun1/roms/epr-10381b.132' from cluster 85
Entry 8 (Cluster 58) is called 0xE 'epr-10382b.118' (extracting to 'outrun1/roms/epr-10382b.118'), firstcluster is 89 (Filesize: 65536 bytes)
Cluster type: 0xFFFF
Extracting 'outrun1/roms/epr-10382b.118' from cluster 89
Entry 9 (Cluster 58) is called 0xE 'epr-10383b.117' (extracting to 'outrun1/roms/epr-10383b.117'), firstcluster is 93 (Filesize: 65536 bytes)
Cluster type: 0xFFFF
Extracting 'outrun1/roms/epr-10383b.117' from cluster 93
Entry 10 (Cluster 58) is called 0xB 'mpr-10371.9' (extracting to 'outrun1/roms/mpr-10371.9'), firstcluster is 97 (Filesize: 131072 bytes)
Cluster type: 0xFFFF
Extracting 'outrun1/roms/mpr-10371.9' from cluster 97
Entry 11 (Cluster 58) is called 0xC 'mpr-10372.13' (extracting to 'outrun1/roms/mpr-10372.13'), firstcluster is 105 (Filesize: 131072 bytes)
Cluster type: 0xFFFF
Extracting 'outrun1/roms/mpr-10372.13' from cluster 105
Entry 12 (Cluster 58) is called 0xC 'mpr-10373.10' (extracting to 'outrun1/roms/mpr-10373.10'), firstcluster is 113 (Filesize: 131072 bytes)
Cluster type: 0xFFFF
Extracting 'outrun1/roms/mpr-10373.10' from cluster 113
Entry 13 (Cluster 58) is called 0xC 'mpr-10374.14' (extracting to 'outrun1/roms/mpr-10374.14'), firstcluster is 121 (Filesize: 131072 bytes)
Cluster type: 0xFFFF
Extracting 'outrun1/roms/mpr-10374.14' from cluster 121
Entry 14 (Cluster 58) is called 0xC 'mpr-10375.11' (extracting to 'outrun1/roms/mpr-10375.11'), firstcluster is 129 (Filesize: 131072 bytes)
Cluster type: 0xFFFF
Extracting 'outrun1/roms/mpr-10375.11' from cluster 129
Entry 15 (Cluster 58) is called 0xC 'mpr-10376.15' (extracting to 'outrun1/roms/mpr-10376.15'), firstcluster is 137 (Filesize: 131072 bytes)
Cluster type: 0xFFFF
Extracting 'outrun1/roms/mpr-10376.15' from cluster 137
Entry 16 (Cluster 58) is called 0xC 'mpr-10377.12' (extracting to 'outrun1/roms/mpr-10377.12'), firstcluster is 145 (Filesize: 131072 bytes)
Cluster type: 0xFFFF
Extracting 'outrun1/roms/mpr-10377.12' from cluster 145
Entry 17 (Cluster 58) is called 0xC 'mpr-10378.16' (extracting to 'outrun1/roms/mpr-10378.16'), firstcluster is 153 (Filesize: 131072 bytes)
Cluster type: 0xFFFF
Extracting 'outrun1/roms/mpr-10378.16' from cluster 153
Entry 18 (Cluster 58) is called 0xC 'opr-10185.11' (extracting to 'outrun1/roms/opr-10185.11'), firstcluster is 161 (Filesize: 32768 bytes)
Cluster type: 0xFFFF
Extracting 'outrun1/roms/opr-10185.11' from cluster 161
Entry 19 (Cluster 58) is called 0xC 'opr-10186.47' (extracting to 'outrun1/roms/opr-10186.47'), firstcluster is 163 (Filesize: 32768 bytes)
Cluster type: 0xFFFF
Extracting 'outrun1/roms/opr-10186.47' from cluster 163
Entry 20 (Cluster 58) is called 0xC 'opr-10188.71' (extracting to 'outrun1/roms/opr-10188.71'), firstcluster is 165 (Filesize: 32768 bytes)
Cluster type: 0xFFFF
Extracting 'outrun1/roms/opr-10188.71' from cluster 165
Entry 21 (Cluster 58) is called 0xC 'opr-10189.70' (extracting to 'outrun1/roms/opr-10189.70'), firstcluster is 167 (Filesize: 32768 bytes)
Cluster type: 0xFFFF
Extracting 'outrun1/roms/opr-10189.70' from cluster 167
Entry 22 (Cluster 58) is called 0xC 'opr-10190.69' (extracting to 'outrun1/roms/opr-10190.69'), firstcluster is 169 (Filesize: 32768 bytes)
Cluster type: 0xFFFF
Extracting 'outrun1/roms/opr-10190.69' from cluster 169
Entry 23 (Cluster 58) is called 0xC 'opr-10191.68' (extracting to 'outrun1/roms/opr-10191.68'), firstcluster is 171 (Filesize: 32768 bytes)
Cluster type: 0xFFFF
Extracting 'outrun1/roms/opr-10191.68' from cluster 171
Entry 24 (Cluster 58) is called 0xC 'opr-10192.67' (extracting to 'outrun1/roms/opr-10192.67'), firstcluster is 173 (Filesize: 32768 bytes)
Cluster type: 0xFFFF
Extracting 'outrun1/roms/opr-10192.67' from cluster 173
Entry 25 (Cluster 58) is called 0xC 'opr-10193.66' (extracting to 'outrun1/roms/opr-10193.66'), firstcluster is 175 (Filesize: 32768 bytes)
Cluster type: 0xFFFF
Extracting 'outrun1/roms/opr-10193.66' from cluster 175
Entry 26 (Cluster 58) is called 0xD 'opr-10230.104' (extracting to 'outrun1/roms/opr-10230.104'), firstcluster is 177 (Filesize: 32768 bytes)
Cluster type: 0xFFFF
Extracting 'outrun1/roms/opr-10230.104' from cluster 177
Entry 27 (Cluster 58) is called 0xD 'opr-10231.103' (extracting to 'outrun1/roms/opr-10231.103'), firstcluster is 179 (Filesize: 32768 bytes)
Cluster type: 0xFFFF
Extracting 'outrun1/roms/opr-10231.103' from cluster 179
Entry 28 (Cluster 58) is called 0xD 'opr-10232.102' (extracting to 'outrun1/roms/opr-10232.102'), firstcluster is 181 (Filesize: 32768 bytes)
Cluster type: 0xFFFF
Extracting 'outrun1/roms/opr-10232.102' from cluster 181
Entry 29 (Cluster 58) is called 0xD 'opr-10266.101' (extracting to 'outrun1/roms/opr-10266.101'), firstcluster is 183 (Filesize: 32768 bytes)
Cluster type: 0xFFFF
Extracting 'outrun1/roms/opr-10266.101' from cluster 183
Entry 30 (Cluster 58) is called 0xD 'opr-10267.100' (extracting to 'outrun1/roms/opr-10267.100'), firstcluster is 185 (Filesize: 32768 bytes)
Cluster type: 0xFFFF
Extracting 'outrun1/roms/opr-10267.100' from cluster 185
Entry 31 (Cluster 58) is called 0xC 'opr-10268.99' (extracting to 'outrun1/roms/opr-10268.99'), firstcluster is 187 (Filesize: 32768 bytes)
Cluster type: 0xFFFF
Extracting 'outrun1/roms/opr-10268.99' from cluster 187
Entry 32 (Cluster 58) is called 0x8 'roms.txt' (extracting to 'outrun1/roms/roms.txt'), firstcluster is 189 (Filesize: 1473 bytes)
Cluster type: 0xFFFF
Extracting 'outrun1/roms/roms.txt' from cluster 189
[end of directory]
Leaving directory
Cluster type: 0xFFFF
Entry 12 (Cluster 1) is called 0x8 'or1t.xbe' (extracting to 'outrun1/or1t.xbe'), firstcluster is 190 (Filesize: 192512 bytes)
Cluster type: 0xFFFF
Extracting 'outrun1/or1t.xbe' from cluster 190
Entry 13 (Cluster 1) is called 0x5 'Media' (extracting to 'outrun1/Media'), firstcluster is 202 (Filesize: 0 bytes)
Cluster type: 0xFFFF
Trying to open dir
Entry 0 (Cluster 202) is called 0x8 'Font.xpr' (extracting to 'outrun1/Media/Font.xpr'), firstcluster is 203 (Filesize: 284672 bytes)
Cluster type: 0xFFFF
Extracting 'outrun1/Media/Font.xpr' from cluster 203
Entry 1 (Cluster 202) is called 0xB 'Gamepad.xpr' (extracting to 'outrun1/Media/Gamepad.xpr'), firstcluster is 221 (Filesize: 266240 bytes)
Cluster type: 0xFFFF
Extracting 'outrun1/Media/Gamepad.xpr' from cluster 221
Entry 2 (Cluster 202) is called 0xC 'Resource.xpr' (extracting to 'outrun1/Media/Resource.xpr'), firstcluster is 238 (Filesize: 440320 bytes)
Cluster type: 0xFFFF
Extracting 'outrun1/Media/Resource.xpr' from cluster 238
Entry 3 (Cluster 202) is called 0x8 'Textures' (extracting to 'outrun1/Media/Textures'), firstcluster is 265 (Filesize: 0 bytes)
Cluster type: 0xFFFF
Trying to open dir
Entry 0 (Cluster 265) is called 0xA 'bihull.bmp' (extracting to 'outrun1/Media/Textures/bihull.bmp'), firstcluster is 266 (Filesize: 196662 bytes)
Cluster type: 0xFFFF
Extracting 'outrun1/Media/Textures/bihull.bmp' from cluster 266
Entry 1 (Cluster 265) is called 0x9 'Thumbs.db' (extracting to 'outrun1/Media/Textures/Thumbs.db'), firstcluster is 279 (Filesize: 11264 bytes)
Cluster type: 0xFFFF
Extracting 'outrun1/Media/Textures/Thumbs.db' from cluster 279
Entry 2 (Cluster 265) is called 0x9 'wings.bmp' (extracting to 'outrun1/Media/Textures/wings.bmp'), firstcluster is 280 (Filesize: 49206 bytes)
Cluster type: 0xFFFF
Extracting 'outrun1/Media/Textures/wings.bmp' from cluster 280
[end of directory]
Leaving directory
Cluster type: 0xFFFF
Entry 4 (Cluster 202) is called 0x6 'Models' (extracting to 'outrun1/Media/Models'), firstcluster is 284 (Filesize: 0 bytes)
Cluster type: 0xFFFF
Trying to open dir
Entry 0 (Cluster 284) is called 0xA 'airplane.x' (extracting to 'outrun1/Media/Models/airplane.x'), firstcluster is 285 (Filesize: 36959 bytes)
Cluster type: 0xFFFF
Extracting 'outrun1/Media/Models/airplane.x' from cluster 285
Entry 1 (Cluster 284) is called 0xC 'airplane.xbg' (extracting to 'outrun1/Media/Models/airplane.xbg'), firstcluster is 288 (Filesize: 18256 bytes)
Cluster type: 0xFFFF
Extracting 'outrun1/Media/Models/airplane.xbg' from cluster 288
[end of directory]
Leaving directory
Cluster type: 0xFFFF
[end of directory]
Leaving directory
Cluster type: 0xFFFF
[end of directory]
Leaving directory
Cluster type: 0xFFFF
Done!

$ cd outrun1/
$ ls
Mediaconfig.bak firmware.bin hiscores.xml hiscores3.xml or1t.xbe roms
boot.id config.xml firmware2.bin hiscores2.xml or1.xbe res
 
...very interesting because now we are sure the JVS I/O input is converted to USB xbox I/O....
See below...
...
The whole thing started as a port from cannonball to xbox. Next step was getting base board communication going as those libs aren't public anywhere. april first looked like the perfect day for a chihiro release.
"jvs_init timeout"
"jvs_init fine after %d iterations"
are both in or1.xbe

"c:\Program Files\Microsoft Xbox SDK\Samples\Xbox\Misc\jvs_test\Release\or1_t.exe"
"c:\Program Files\Microsoft Xbox SDK\Samples\Xbox\Misc\jvs_test\Release\AsyncWrite.pdb"
are in
or1t.xbe

Also relevant as I mentioned before the "Chihiro on XBOX" Assembler Games thread:
https://assemblergames.com/threads/chihiro-on-xbox.26483/page-26

They mention the rumored JVS ports on the DVT3 variant of the Xbox dev kits also mentioned here:
https://xboxdevwiki.net/Development_Kits

I wonder if all you need to pump out stuff like this is Xbox SDK, some JVS hardware, and some skill like the Cannonball folks have. Interesting April fools joke indeed.
 
Last edited:
Back
Top