Analog controls for games that have support for it

Issue #156 resolved
Former user created an issue

Original issue 156 created by Rodrigo.Borges.Freitas on 2011-03-09T22:20:44.000Z:

There are some games (6 if I'm not wrong) that have analog support with the use of an special joystick(XE-1AP), Two notable game that support it are Afterburner II and Super Monaco GP, no other emulator implemented this function yet).

Comments (33)

  1. Former user Account Deleted
    • changed status to open

    Comment # 1 originally posted by ekeeke31 on 2011-03-09T23:35:24.000Z:

    Interesting, I never heard about this controller before, seems like it was only released in Japan.

    Thanks for heads up anyway but still, without more informations about this special joystick, it is a little hard to emulate it. Only solution is again to disassemble games said to support it and look for special I/O detection & access routines.

    Do you have an exhaustive list of games supporting this controller ? I have quickly looked into Afterburner II disassembled code but did not found any special handling code inside it...

  2. Former user Account Deleted

    Comment # 2 originally posted by Rodrigo.Borges.Freitas on 2011-03-09T23:55:18.000Z:

    Here is a list:

    MEGA DRIVE/GENESIS

    Afterburner II M.U.S.H.A Aleste Fastest One Galaxy Force II Ayrton Senna Super Monaco GP II

    32X

    Afterburner Space Harrier

    ------------------

    I don't know if it helps but the Afterburner and Super Monaco GP games detect and show in the title screen if it is a normal or analog joystick. As this joystick was only released in japan, maybe only the japanese roms are compatible.

  3. Former user Account Deleted

    Comment # 3 originally posted by Rodrigo.Borges.Freitas on 2011-03-10T00:05:05.000Z:

    Sorry for the double post, couldn't find an edit button

    Here's is the title screen, in the lower left appears the name "Control Pad" if you use a standard controller [IMG]http://i306.photobucket.com/albums/nn262/Rebirfh/AfterBurnerIIJapan000.jpg[/IMG]

    Here is a picture of the japanese manual for afterburner, it clearly shows a sensibility options for the analog pad that isn't acessible normally. [IMG]http://i306.photobucket.com/albums/nn262/Rebirfh/Clipboard01-9.jpg[/IMG]

  4. Former user Account Deleted

    Comment # 4 originally posted by ekeeke31 on 2011-03-10T00:30:09.000Z:

    Thanks for the pictures, it helps figuring what kind of data the game is going to read. And yes, I already figured it would display "Control Pad" on title screen and always wondered why, I thought it was to make it more "arcade-feeling"...

    I actually found the analog pad routine in After Burner 2 code. It is similar to the Sega Mouse protocol except that the game only "initializes" the acquisition sequence then the controller automatically sends all the info about button status, analog values, etc in a sequential way. The game looks at 2 input lines (TR/TL) to know which part of the data is returned and use some kind of tempo to wait for analog controller to return next set of data.

    I/O port mapping seems to be like this:

    D6: 0 = start acquisition sequence, 1 = end of acquisition (output) D5: indicates if D0-D3 are high or low bits of 8-bit data (input) D4: same as D5 D3-D0: high or low nibble of 8-bit data

    There is a total of four 8-bit data acquired which are (I guess): - horizontal stick position (0-255) - vertical stick position (0-255) - buttons status (4 buttons = 4 bits, are the 4 remaining bits used ?) - analog speed (0-255), I'm not sure to understand what this is, a translation of the manual would help.

    This is a preliminary analysis of the code, still need to figure the order of data acquisition and the position of each buttons in the data field, their state when pressed, etc, but I guess this should be possible to emulate ;-)

  5. Former user Account Deleted

    Comment # 5 originally posted by Rodrigo.Borges.Freitas on 2011-03-10T05:11:09.000Z:

    I've put in some places hoping for someone to translate correctly. While this doesn't happen, I typed ad google-translated it:

    This game was released for the Company "XE-1AP" (analog joypad from now on "AP"), Making possible the delicate operation of your ship. The operation is shown below, AP connected to "CONTROL1",

    How AP works

    Control stick : moves ship

    Start Button Select and in-game pause menu

    Speed ​​control throttle

    A trigger: missile

    B trigger: fire vulcan

    --------------

    Connected to an AP-mode option "CONTROL" in the field of a center position can be adjusted.

    Stick in each direction, so that reading from the throttle began to view numbers, please make sure to move.

    While none hands Usually "STICK", "SPEED" 127 to 128 both Adjust the circle to take the AP or the volume adjustment done on the back of the AP Please see the manual for detailed instructions.

  6. Former user Account Deleted

    Comment # 6 originally posted by ekeeke31 on 2011-03-10T07:45:06.000Z:

    Speed is actually the Throttle Analog Stick, seems like its adds a third analog direction, i.e depth, for games using a first-person view.

    From pictures, it seems there are 14 buttons on that thing (2x2 on each side, 6x at bottom, 4x on top), some of them must be auto-fire or stuff like that since only 8 buttons status can be returned. Need more informations about these, the AP user manual would also help a lot but it seems very rare (there is apparently one on ebay)

  7. Former user Account Deleted

    Comment # 7 originally posted by Rodrigo.Borges.Freitas on 2011-03-10T08:48:28.000Z:

    More info: This joystick isn't exclusive for Mega Drive, it is in the box advertised also for PC's X68000, MSX, PC8801,PC9801 and FM-TOWNS.

    Images

    http://www.gigaoldgames.com.br/16bits/imagens/md\_xe1ap\_03.jpg http://www.gigaoldgames.com.br/16bits/imagens/md\_xe1ap\_00.jpg http://www.gigaoldgames.com.br/16bits/imagens/md\_xe1ap\_01.jpg http://www.gigaoldgames.com.br/16bits/imagens/md\_xe1ap\_02.jpg

    The third analog (slider) looks like it can be rotated if you compare the box/afterburner manual with the actual photos.

    Buttons:

    A B A¹ (same function as A?) B¹ (same function as B?) C D E¹ (?) E² (?) Start Select Analog Slider Analog Stick Mode 1 (Personal computer <--> Mega Drive) Mode 2 (Digital <--> Analog) Autofire Button A (ON <--> OFF> Autofire Button B (ON <--> OFF>

  8. Former user Account Deleted

    Comment # 8 originally posted by Rodrigo.Borges.Freitas on 2011-03-10T09:08:31.000Z:

    This could be useful:

    While normally a 9-pin DSUB connector won't fit in the PC Engine's 6-pin mini-DIN, there was an adaptor (The XHE-3) which allowed the use of MSX, X68000 and FM-Towns1) pads on the PCE. When connected, the XE-1AP offered real analogue control to all of four PC Engine games:

    Comparison of Japanese PC, Sega + Amiga DB9 pinouts http://www.gamesx.com/wiki/doku.php?id=controls:sega\_atari\_msx\_x68000

    ------------------------------ Translated from a japanese web site:

    "distinctive look reminiscent of a back and forth 256 degrees in each direction (8bit) with the control stick and the output of stage 256 in the longitudinal direction (8bit) with the output of the throttle lever, trigger button 8 + start, equipped with the select button."

    "Before using the XE-1AP, without a center control stick and throttle lever should not be first. "AFTER BURNER" Since the configuration of the screen shows you the analog input to quantify the situation, it is easy to use and implement it. Because the hexadecimal stage I 256 & H7F ~ & H80 around the center point. Centering on the rear of CH0 ~ CH2 done by turning the volume adjustment screwdriver.

    After adjustments are immediately verified.

    "AFTER BURNER" after boot "OPT1" Switch to note that the analog control is pressed."

  9. Former user Account Deleted

    Comment # 9 originally posted by ekeeke31 on 2011-03-10T11:45:24.000Z:

    Ok, so the 8-bit input data would be status of A,B,C,D,E1,E2,SELECT,START buttons The three other 8-bit data are the 3 analog values.

    Mode 1 & Mode 2 buttons are not needed for emulation (default would be Analog and Mega Drive): Digital mode is probably to make the controller works like a 3-Button (or Maybe 6-Button controller), Personal Computer mode to handle compatibility with X68000.

    Auto Fire could be emulated just like any other controller with Auto Fire, in a generic way (currently not handle in Genesis Plus GX)

  10. Former user Account Deleted

    Comment # 10 originally posted by ekeeke31 on 2011-03-10T12:06:38.000Z:

    Hum, 8-bit input data is more like status of A,B,C,D,A1,B1,E1,E2 buttons, with START & SELECT handled differently (other bits maybe).

  11. Former user Account Deleted

    Comment # 11 originally posted by Rodrigo.Borges.Freitas on 2011-03-10T15:55:28.000Z:

    I really know nothing about programming or hardware interface, but making an educated guess, as afterbuner came out in Japan in 1988, I think it's safe to asssume that A,B and Start are probably directly correlated with their 3 button controller counterpart and this joystick (XE-1AP) has no correlation with the 6 button controller as it was planned only with the release of Street Fighter II.

  12. Former user Account Deleted

    Comment # 12 originally posted by Rodrigo.Borges.Freitas on 2011-03-10T16:05:16.000Z:

    A more accurate translation from the manual:

    This game uses the [XE-1AP] (Analog Joypad. Henceforth: "AP") that we at (this company) sell. Because of that, you can move the player in very delicate ways. The illustration below shows that if you take AP and plug it into controller 1 then reset the consule, you become able to use AP.

    Once you've plugged AP into your controller, head to Option Mode, and go to "Control". There, you can adjust the callibration for the centered sticks (\*note: I'm somewhat guessing here). Once you've done that for both sticks, a number will be indicated on screen. Once it does, move a stick to confirm. When you don't move the sticks, a normal reading for "Stick" and "Speed" should be about 127-128. If you need to adjust anything, on the back side of AP there is a volume adjuster you can use. For details on that, please read AP's instruction manual.

  13. Former user Account Deleted

    Comment # 13 originally posted by ekeeke31 on 2011-03-11T09:14:54.000Z:

    After some reverse-analysing of XE-1AP input code in AFter Burner 2, I finally managed to figure which data was returned in which order. Only 4 buttons are used by the game so I could not figure the position of unused buttons in returned data.

    Here are some screenshots from the SDL port of genesis plus I'm using to test changes :

    For informations, here are some infos about data returned by the controller (Th is set as output and is used to control acquisition cycles):

    TH TR TL D3 D2 D1 D0

    1 x x x x x x

    0 x x x x x x x 0 0 ? ? B4 ? cycle = 0 x 1 1 B3 B2 B1 ? cycle = 1

    1 x x x x x x x 0 0 X7 X6 X5 X4 cycle = 2 x 1 1 Y7 Y6 Y5 Y4 cycle = 3

    1 x x x x x x x 0 0 ? ? ? ? cycle = 4 x 1 1 Z7 Z6 Z5 Z4 cycle = 5

    1 x x x x x x x 0 0 X3 X2 X1 X0 cycle = 6 x 1 1 Y3 Y2 Y1 Y0 cycle = 7

    1 x x x x x x x 0 0 ? ? ? ? cycle = 8 x 1 1 Z3 Z2 Z1 Z0 cycle = 9

    1 x x x x x x

  14. Former user Account Deleted

    Comment # 14 originally posted by ekeeke31 on 2011-03-14T09:10:25.000Z:

    After more analyzing of other games input engines, I think I got the communication protocol pretty much correct now (it was not exactly as stated in previous comment), all five games (including revisions) work fine with analog controller now.

    Musha Aleste seems buggy, it does not read analog sticks on the main screen so you can't go to option menu. If you wait for the in-game demo loop before hitting a button, it won't detect analog controller buttons anymore and you need to reset the game manually. Everything works fine IN game though which confirms it's not an issue with my emulation code but game's code.

    It indeed seems that the right stick can be rotated: racing games use it as left/right steering stick. It's unidirectional though, all games always get the same data from cycles 5&9 above, cycles 4&10 are never used so it's not really known which data is returned there (I initially thought it behaves like the left stick with the ability to return X & Y axis data but it's not the case).

    For both sticks: Vertically, top position is 0, bottom position is 255, 128 is middle. Horizontally, left position is 0, right position is 256, 128 is middle.

    Buttons data returned in cycles 0 & 1 is: ? ? START SELECT A B C D 0 means button is pressed, 1 means it's released Unknown buttons are probably E1 & E2 but since no games use these, there is no way to be sure.

  15. Former user Account Deleted

    Comment # 16 originally posted by Rodrigo.Borges.Freitas on 2011-03-14T10:34:24.000Z:

    Thanks! and congratulations for being the first emu author to support this function.

  16. Former user Account Deleted

    Comment # 17 originally posted by ekeeke31 on 2011-03-14T17:04:10.000Z:

    For completeness, here's a more accurate protocol description, this could help other emu authors supporting this analog controller:

    TH TR TL D3 D2 D1 D0 ------------------------------ 1 x x x x x x (write) 0 x x x x x x (write) reset acquisition

    1 x x x x x x (write) sequence comment 1\. (some games do not send this) x 1 0 x x x x (read) data not ready x 0 0 ? ? Start Select (read) START & SELECT buttons status (active low) x 1 1 x x x x (read) data not ready x 0 1 A B C D (read) A,B,C,D buttons status (active low) ...

    0/1 x x x x x x (write) sequence comment 2\. (some games write 0, others 1) x 1 0 x x x x (read) data not ready x 0 0 X7 X6 X5 X4 (read) left stick X axis value (msb) x 1 1 x x x x (read) data not ready x 0 1 Y7 Y6 Y5 Y4 (read) left stick Y axis value (msb) ...

    0/1 x x x x x x (write) sequence comment 3\. (some games write 0, others 1) x 1 0 x x x x (read) data not ready x 0 0 ? ? ? ? (read) unused by games, maybe same value as below x 1 1 x x x x (read) data not ready x 0 1 Z7 Z6 Z5 Z4 (read) right stick axis value (msb) ...

    0/1 x x x x x x (write) sequence comment 4\. (some games write 0, others 1) x 1 0 x x x x (read) data not ready x 0 0 X3 X2 X1 X0 (read) left stick X axis value (lsb) x 1 1 x x x x (read) data not ready x 0 1 Y3 Y2 Y1 Y0 (read) left stick Y axis value (lsb) ...

    0/1 x x x x x x (write) sequence comment 5\. (some games write 0, others 1) x 1 0 x x x x (read) data not ready x 0 0 ? ? ? ? (read) unused by games, maybe same value as below x 1 1 x x x x (read) data not ready x 0 1 Z3 Z2 Z1 Z0 (read) right stick axis value (lsb) ...

    Within a sequence, the controller alternatively & automatically outputs the 1st (TL=0) and 2nd (TL=1) 4-bit data.

    TR indicates if data is valid (0) or if controller is still busy processing data (1).

    Writing 1 or 0 to TH will program next acquisition sequence (out of 5). A transition from 1 to 0 on TH will restart first acquisition sequence.

  17. Former user Account Deleted

    Comment # 18 originally posted by ekeeke31 on 2011-03-31T22:44:27.000Z:

    Implemented in 1.5.0

  18. Former user Account Deleted

    Comment # 19 originally posted by vaguerant on 2013-03-29T09:36:44.000Z:

    Sorry for the extremely late response, but I was thinking with regard to Musha Aleste, perhaps the "MODE 2" switch as discussed above should be implemented after all? Presumably the developers originally intended for players to use the digital mode to navigate the menu, then turn the switch to analog to play. If this switch could be set in the menu like a button then it would be closer to normal play, without having to exit to the menu to switch control types on the fly.

    That said, the analog controls in Musha are /horrible/ (not your fault, just bad design), so from that perspective it's probably not worth it because nobody wants to use it anyway. It also poses a problem for control schemes, e.g. I don't think there are any spare buttons on the Wiimote+Nunchuk or GameCube controller schemes, so it might have to be left out for those controls and only work on Classic Controller, which seems limiting.

    If you want to leave it as is, that seems reasonable due to the small usage case here. Changing it would bring the experience a little closer to what's had on hardware ... but still terrible and unlikely to be used for very long. Obviously depends on your priorities, undoubtedly this would be a pretty low one.

  19. Former user Account Deleted

    Comment # 20 originally posted by vaguerant on 2013-06-18T09:24:54.000Z:

    Continuing on from the above, it seems that XE-1AP support is currently nonworking on Sega/Mega-CD games in genplus-gx. Three games were released which supported the controller: After Burner III, Night Striker (Japan-only) and Star Blade. However, I haven't been able to use the emulated 1AP with any of these titles. Though I'm not sure of the exact reason, a couple of potential sticking points come to mind:

    1. XE-1AP input does not seem to be registered in the Sega/Mega-CD BIOS. With apologies, I can't confirm if the same is true on hardware. It is possible players would have been required to use the "MODE 2" switch set to Digital to start the game before switching back to analog?

    2. Games which support the XE-1AP seem to require that the controller is connected on startup. e.g. If After Burner II (stock Mega Drive) is started with a standard 3-button pad inserted, it will not respond to inputs from the XE-1AP. Instead, the 1AP must be set, then the game launched. Due to point 1, it's impossible to start games with the 1AP set. I've tried "hot-swapping" by launching the game and immediately dropping out to the menu to switch controllers, but with no results.

    In my testing of XE-1AP support in stock Mega Drive games, all international (e.g. USA) releases do still include analog support. However, it's possible that the feature could have been removed from the international releases of After Burner III and Star Blade. To confirm that this wasn't the issue, I have also been testing with Japanese version games, which are known to support the controller. However, just like their USA counterparts, Japanese BIOSes and games do not work with the XE-1AP in genplus-gx.

  20. Former user Account Deleted

    Comment # 21 originally posted by ekeeke31 on 2013-06-18T12:19:29.000Z:

    Thanks, I didn't know it was supported in some CD games as well, I will have a look but I doubt the software support implementation is different from cart games and I do not see why my emulation code would not work for CD games specifically.
    To be sure if this controller is really supported and it was meant to be used, the best way would be to find the game manuals.

    However, there are zero chances that this controller is supported by CD bootrom (any model) so, in the case of japanese bios which requires you to enter the CD player interface to start the game, i guess you would have to start with a normal gamepad and switch to xe-1ap when the CD is being loaded, before game initializayion program really starts.

  21. Former user Account Deleted

    Comment # 22 originally posted by vaguerant on 2013-06-22T06:20:48.000Z:

    I just managed to get Japanese After Burner III working with the XE-1AP, so it looks like you're correct and there's no issue with your code. Apologies for the false report. AF3 does the controller check on the title screen, specifically. If you switch early, during the attract sequence, any input will be ignored (but if you let it sit long enough, you'll eventually reach the title screen and the XE-1AP is picked up). Once the XE-1AP has been recognised, "ANALOG PAD" is displayed on the title screen, in place of "CONTROL PAD" for a normal 3/6-button pad.

    Notably, the USA version does /not/ support the XE-1AP. Instead, it uses the controller detection code to add support for the 6-button controller--the Japanese game is limited to three buttons. The title screen thus displays "CONTROL PAD" (3-button) or "6 BUTTON PAD". The XE-1AP is not registered at all, with no notation on the title screen, as if all controllers have been removed.

    While it now seems unlikely that genplus-gx is the issue, I still haven't been able to successfully use the XE-1AP in Night Striker or Star Blade. They have no obvious display of the currently used controller and either don't register 1AP inputs at all or do it wrong in my testing (in theory you could play Night Striker--it's just that you're constantly firing, Mode maps to Up, Start maps to Down, B maps to D-pad right and C maps to D-pad left). If these games do indeed support the controller, it's likely a matter of finding the correct time and place to insert it.

  22. Former user Account Deleted

    Comment # 23 originally posted by vaguerant on 2013-06-22T06:51:14.000Z:

    Well that's convenient. This post was made three weeks ago on Sega-16, by an XE-1AP owner:

    http://www.sega-16.com/forum/showthread.php?4367-Official-Sega-16-Haul-Thread-4-0&p=584579&viewfull=1#post584579

    In it, the poster states that Night Striker requires the 1AP to be in the second controller slot, with a standard pad in slot one. genplus-gx currently only supports putting the analog controller in slot one, so this change is likely necessary to allow use of the controller.

    Notably, the post also claims that compatibility spans all game versions of 1AP titles, which seems to be wrong from my experience with After Burner III. It also again lists Star Blade as a 1AP game, though I've had no success using it there as yet.

  23. Former user Account Deleted

    Comment # 24 originally posted by vaguerant on 2013-07-09T11:07:31.000Z:

    Bah, Starblade is a jerk. If you have the XE-1AP in slot 1 and a standard MD pad in slot two, it will ignore the analog controller's inputs entirely, handing control over to player two's digital pad. I pretty much always have a standard pad set in slot 2 because a full cycle of slot 1's inputs leaves it there by default. Messing around with the slot 2 controls in r810 I found that setting it to someone other than a standard pad (e.g. none, the Activator, another XE-1AP) makes the game start listening to the inputs on slot 1 again. No idea why they would have made this design choice, assuming it was intentional. Same behaviour on Japanese and USA version games.

    I can also confirm the slot 2 XE-1AP support working perfectly for Night Striker, as I'm sure you're already aware. That means all games currently expected to work are working, with the only exceptions being whatever 32X games use the 1AP. Thanks for the excellent support of such a niche accessory.

  24. Eke ekeeke repo owner

    Comment # 25 originally posted by sdsnatch...@gmail.com

    @ekeeke31

    Thanks for your explanation about the protocol! But some aspects are still not clear to me:

    1) Are TR and TL configured as input or output? Is it the controller or the software that flips the bits?

    2) How exactly the games detect the XE1-AP presence, before they begin to use its specific protocol?

    I also have some info to contribute here, provided by Takamichi of the MSX community:

    • There are two other joysticks compatible with the XE1-AP protocol: The Dempa XE1-AJ and the Sharp CZ-8NJ2
    • The protocol was published in detail in the Micom BASIC Magazine Oct 1990 issue
  25. Eke ekeeke repo owner

    Comment # 26 originally posted by Project Member ekeeke31@gmail.com

    1) TR and TL are configured as input by the software and are driven by the controller.

    2) I did not analyse the detection code but it's impossible for a gamepad to return 0 on TR and TL at the same time so they probably use this particularity.

  26. Eke ekeeke repo owner

    Comment # 27 originally posted by sdsnatch...@gmail.com

    Important note: The Dempa XE1-AJ and the Sharp CZ-8NJ2 don't have the Sega<->JPC switch and cannot be connected directly to the Megadrive as that would damage the controller.

    To allow them to be connected to the Megadrive, a simple rewiring adapter must be used in the middle.

    This website contains a complete scan of the Sharp CZ-8NJ2 user manual, showing the MSX standard joystick pinout:

    http://kpark.co.kr/m/2891714

    This website has more info on how to connect the Sharp CZ-8NJ2 to the Megadrive:

    http://www.sankichi.flnet.org/cyberstick_ab_1.html

    I just found that this guy has built an USB adapter for the XE-1AP, XE-1AJ & CZ-8NJ2. The source code is available and shows how to read the protocol:

    https://developer.mbed.org/users/sankichi/notebook/NiseKabuto/

    Unfortunately, he doesn't detect the XE-1AP protocol. He just try to detect the Megadrive 6-button joystick, and if none is present the code falls back to the XE-1AP protocol as the default.

  27. Eke ekeeke repo owner

    Comment # 28 originally posted by sdsnatch...@gmail.com

    it's impossible for a gamepad to return 0 on TR and TL at the same time

    Is that info correct? IIRC, the TL and TR pins return the A, B, START and C button status on a 3-button megadrive joypad. And it's possible to press A & START & B & C simultaneously, right?

  28. Eke ekeeke repo owner

    Comment # 29 originally posted by Project Member ekeeke31@gmail.com

    My mistake, you are right off course ;-) I am not sure how they detect it then. All I know is I don't do anything special in the emulator, maybe it's because sometimes D0-D3 are forced to zero (first cycles of sequences #3 and #5),I really don't know, you will have to disassemble the game to be sure.

  29. Eke ekeeke repo owner

    Comment # 30 originally posted by sdsnatch...@gmail.com

    Problem is, I'm no M68K programmer. But I'm an experienced Z80 programmer. I want to add support for the XE-1AP in a joystick library for the MSX, and until now I couldn't find any decent programming info for this device. Good thing you published all this info here! Thank you so much! :)

    The only thing that is missing now is how to properly detect the thingie.

    The usual Sega algorithm described in the genesis_multitap.txt document doesn't work with it, and only returns 0xF for every nibble... :(

    http://www.raphnet.net/divers/documentation/genesis_multitap.txt

  30. Eke ekeeke repo owner

    Comment # 31 originally posted by sdsnatch...@gmail.com

    One additional info: It seems that what resets the controller for a new sequence is a transition of TH from 0 to 1. It's like this because the protocol was originally designed for the MSX joystick port, and this machine keeps the OUT pin (equivalent to TH) at 0 by default.

    This transition explains why some games keep it at 0 and others at 1 afterwards. The correct should be to keep it at 0 after the reset.

  31. Eke ekeeke repo owner

    Comment # 33 originally posted by Project Member ekeeke31@gmail.com

    Here are some notes I found back about some MD games that access XE-1AP

    **********************************************************
    Galaxy Force II
    
        TH TR TL D3 D2 D1 D0
       ----------------------
    
    wr  0  x  x  x  x  x  x
    wr  1  x  x  x  x  x  x
    
    *:
    wr  0  x  x  x  x  x  x
    rd  x  x  0  x  x  x  x  (loop if TL = 1)
    rd  x  0  x  x  x  x  x  (loop if TR = 1)
    rd  x  x  x  b7 b6 b5 b4
    rd  x  x  1  x  x  x  x  (loop if TL = 0)
    rd  x  0  x  x  x  x  x  (loop if TR = 1)
    rd  x  x  x  b3 b2 b1 b0
    goto * (repeat 6 times)
    
    
    
    **********************************************************
    Fastest One
    
        TH TR TL D3 D2 D1 D0
       ----------------------
    
    wr  0  x  x  x  x  x  x
    
    *:
    rd  x  0  x  x  x  x  x  (loop if TR = 1)
    wr  1  x  x  x  x  x  x
    rd  x  x  x  b7 b6 b5 b4
    rd  x  1  x  x  x  x  x  (try eight times if TR = 0)
    rd  x  0  x  x  x  x  x  (loop if TR = 1)
    rd  x  x  x  b3 b2 b1 b0
    rd  x  1  x  x  x  x  x  (loop if TR = 0)
    goto * (repeat x times)
    
    
    
    **********************************************************
    Ayrton Senna GP II   /    Musha Aleste
    
        TH TR TL D3 D2 D1 D0
       ----------------------
    
    rd  x  x  x  x  x  x  x
    wr  1  x  x  x  x  x  x
    rd  x  x  x  x  x  x  x
    wr  0  x  x  x  x  x  x
    
    *:
    rd  x  x  x  x  x  x  x
    wr  1  x  x  x  x  x  x
    rd  x  x  0  x  x  x  x  (loop if TL = 1)
    rd  x  0  x  x  x  x  x  (loop if TR = 1)
    rd  x  x  x  b7 b6 b5 b4
    rd  x  x  1  x  x  x  x  (loop if TL = 0)
    rd  x  0  x  x  x  x  x  (loop if TR = 1)
    rd  x  x  x  b3 b2 b1 b0
    goto * (repeat 5 times)
    
    
    
    **********************************************************
    After Burner II
    
        TH TR TL D3 D2 D1 D0
       ----------------------
    
    rd  x  x  x  x  x  x  x
    wr  1  x  x  x  x  x  x
    rd  x  x  x  x  x  x  x
    wr  0  x  x  x  x  x  x
    
    *:
    rd  x  x  0  x  x  x  x  (loop if TL = 1)
    rd  x  0  x  x  x  x  x  (loop if TR = 1)
    rd  x  x  x  b7 b6 b5 b4
    rd  x  x  1  x  x  x  x  (loop if TL = 0)
    rd  x  0  x  x  x  x  x  (loop if TR = 1)
    rd  x  x  x  b3 b2 b1 b0
    rd  x  x  x  x  x  x  x
    wr  1  x  x  x  x  x  x
    goto * (repeat 5 times)
    

    I'm quite sure the transition of TH from 1 to 0 resets acquisition, not the opposite or it would break After Burner II example.

    I'm not sure to follow why it would explain "some games keep it at 0 and others at 1" as the same could be said to the opposite so it does not make much sense to me. Same as you can't rely on the default state of some console I/O pin to figure a protocol (also I'm pretty sure it was initially an X68000 device not MSX).

    Finally, according to this X68000 driver source code that was posted here:

    http://www.sega-16.com/forum/showthread.php?30101-XE-1AP-Analogue-Controller-Cyber-Stick-CZ-8NJ2-XE-1AJ-Driver-%28Source-JP-docs%29&p=720819#post720819

    it does a HIGH to LOW transition on PC4 pin to initialize the acquisition:

    _PC4ON      equ $09     *PC4 on
    _PC4OFF     equ $08     *PC4 off
    _REQUEST    equ _PC4OFF
    _REQOFF     equ _PC4ON
    
    ...
    
    move.b  #_REQOFF,_8255CTRL  *request off
    move.b  #_REQUEST,_8255CTRL *request to analog_joystick
    
  32. Eke ekeeke repo owner

    For completeness, here's a full protocol description as in comment # 17, including missing infos guessed from the driver code linked in above comment.

    #!
    
    
     TH  TR  TL  D3  D2  D1  D0
    ------------------------------
     1   x   x   x   x   x   x     (write)
     0   x   x   x   x   x   x     (write) reset acquisition
    
     1   x   x   x   x   x   x     (write) sequence #1 (some games do not send this)
     x   1   0   x   x   x   x      (read) data not ready 
     x   0   0   E1 E2 Start Select (read) E1, E2, START and SELECT buttons pressed status (active low)
     x   1   1   x   x   x   x      (read) data not ready 
     x   0   1 A&A' B&B' C   D      (read)  A or A', B or B', C and D buttons pressed status (active low)
    ...
    
    0/1  x   x   x   x   x   x     (write) sequence #2 (some games write 0, others 1)
     x   1   0   x   x   x   x      (read) data not ready 
     x   0   0   X7  X6  X5  X4     (read) left stick X axis value (msb)
     x   1   1   x   x   x   x      (read) data not ready 
     x   0   1   Y7  Y6  Y5  Y4     (read) left stick Y axis value (msb)
    ...
    
    0/1  x   x   x   x   x   x     (write) sequence #3 (some games write 0, others 1)
     x   1   0   x   x   x   x      (read) data not ready 
     x   0   0   ?7  ?6  ?5  ?4     (read) unused by MD games, referred as "Option analog stick (up/down)" in X68000 driver
     x   1   1   x   x   x   x      (read) data not ready 
     x   0   1   Z7  Z6  Z5  Z4     (read) right stick axis value (msb)
    ...
    
    0/1  x   x   x   x   x   x     (write) sequence #4 (some games write 0, others 1)
     x   1   0   x   x   x   x      (read) data not ready 
     x   0   0   X3  X2  X1  X0     (read) left stick X axis value (lsb)
     x   1   1   x   x   x   x      (read) data not ready 
     x   0   1   Y3  Y2  Y1  Y0     (read) left stick Y axis value (lsb)
    ...
    
    0/1  x   x   x   x   x   x     (write) sequence #5 (some games write 0, others 1)
     x   1   0   x   x   x   x      (read) data not ready 
     x   0   0   ?3  ?2  ?1  ?0     (read) unused by MD games, referred as "Option analog stick (up/down)" in X68000 driver
     x   1   1   x   x   x   x      (read) data not ready 
     x   0   1   Z3  Z2  Z1  Z0     (read) right stick axis value (lsb)
    ...
    
    0/1  x   x   x   x   x   x     (write) sequence #6 (unused by MD games)
     x   1   0   x   x   x   x      (read) data not ready 
     x   0   0   A   B   A'  B'     (read) distinct A, B, A' and B' buttons pressed status (active low)
     x   1   1   x   x   x   x      (read) data not ready 
     x   0   1   ?   ?   ?   ?      (read) unused
    

    TR indicates if data is ready (TR=0) or if controller is still busy processing data (TR=1).

    TL indicates if data is the first (TL=0) or second (TL=1) 4-bit nibble.

    Writing TH will either stop (TH = 1) or enable (TH = 0) data acquisition.

    The controller presumably automatically outputs first and second 4-bit nibble alternatively within a sequence then cycle through each sequences at unknown speed.

  33. Log in to comment