Sega Mega Drive/Control pad inputs
From Sega Retro
Control pad inputs are received through the Sega Mega Drive's two 9-pin ports on the front of the console.
3 button control pads
Reading 3 button control pads consists of the following steps:
- Set TH pin to output and all others to input.
- Set TH pin to 1.
- Read inputs for
- Set TH pin to 0.
- Read inputs for START
The following code will perform this function for control pad #1:
moveq #$40,d0 move.b d0,($A10009).l ; TH pin to output, others to input move.b d0,($A10003).l ; TH to 1 nop nop move.b ($A10003).l,d0 andi.b #$3F,d0 ; d0 = 00CBRLDU moveq #0,d1 move.b #0,($A10003).l ; TH to 0 nop nop move.b ($A10003).l,d1 andi.b #$30,d1 ; d1 = 00SA0000 lsl.b #2,d1 ; d1 = SA000000 or.b d1,d0 ; d0 = SACBRLDU
This leaves the current state of control pad #1 in the register d0. To do the same with pad #2, replace $A10009 with $A1000B and $A10003 with $A10005.
6 button control pads
Reading 6 button control pads is the same as reading 3 button pads, with an additional step for MODE .
The following code assumes the code for a 3 button pad has already run:
moveq #0,d1 move.b #$40,($A10003).l ; TH to 1 nop nop move.b #0,($A10003).l ; TH to 0 nop nop move.b #$40,($A10003).l ; TH to 1 nop nop move.b ($A10003).l,d1 move.b #0,($A10003).l ; TH to 0 andi.w #$F,d1 ; d1 = 0000MXYZ lsl.w #8,d1 ; d1 = 0000MXYZ00000000 or.w d1,d0 ; d0 = 0000MXYZSACBRLDU