Reading MD6 Joypad

From MegaDrive Development Wiki
Revision as of 11:53, 19 January 2017 by ElBarto (talk | contribs) (→‎Code)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

Details

As the 3 buttons pad, all the buttons can't be read at once. There is a multiplexer inside the control pad.

Reading the 6 buttons pad consist of 5 steps :

  • Set the direction of pin 6 to output and all others to input.
  • Set TH (pin6) to 1.
  • Read the first part of the buttons (UP,DOWN,LEFT,RIGHT,B,C)
  • Switch the outputs in the control pad by setting TH (pin6) to 0.
  • Read the second part of the buttons (A,START)
  • Switch the outputs in the control pad by setting TH (pin6) to 1.
  • Switch the outputs in the control pad by setting TH (pin6) to 0.
  • Switch the outputs in the control pad by setting TH (pin6) to 1.
  • Read the extra buttons (X,Y,Z,MODE)


TH State Data
1
Bit 7 6 5 4 3 2 1 0
Def 0 THCBRIGHTLEFTDOWNUP
0
Bit 7 6 5 4 3 2 1 0
Def 0 THSTARTA00DOWNUP
1
Bit 7 6 5 4 3 2 1 0
Def 0 THCBRIGHTLEFTDOWNUP
0
Bit 7 6 5 4 3 2 1 0
Def 0 THSTARTA0000
1
Bit 7 6 5 4 3 2 1 0
Def 0 THCBXYZMODE
0
Bit 7 6 5 4 3 2 1 0
Def 0 THSTARTA1111

Code

	moveq	#0, d0
	moveq	#0, d1

	move.b  #0x40, (0xA10009)	| Set direction
	move.b  #0x40, (0xA10003)	| TH = 1
	nop
	nop
	move.b  (0xA10003), d0		| d0.b = X | 1 | C | B | R | L | D | U |
	andi.b	#0x3F, d0		| d0.b = 0 | 0 | C | B | R | L | D | U |

	move.b	#0x0, (0xA10003)	| TH = 0
	nop
	nop
	move.b	(0xA10003), d1		| d1.b = X | 0 | S | A | 0 | 0 | D | U |
	andi.b	#0x30, d1		| d1.b = 0 | 0 | S | A | 0 | 0 | 0 | 0 |
	lsl.b	#0x2, d1		| d1.b = S | A | 0 | 0 | D | U | 0 | 0 |
	or.b	d1, d0			| d0.b = S | A | C | B | R | L | D | U |

	move.b  #0x40, (0xA10003)	| TH = 1
	nop
	nop
	move.b	#0x0, (0xA10003)	| TH = 0
	nop
	nop
	move.b	#0x40, (0xA10003)	| TH = 1
	nop
	nop
	move.b	(0xA10003), d1		| d1.b = X | X | X | X | M | X | Y | Z
	move.b  #0x0, (0xA10003)	| TH = 0

	andi.w	#0xF, d1		| d1.b = 0 | 0 | 0 | 0 | M | X | Y | Z
	lsl.w	#0x8, d1		| d1.w = 0 | 0 | 0 | 0 | M | X | Y | Z | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
	or.w	d1, d0			| d0.w = 0 | 0 | 0 | 0 | M | X | Y | Z | S | A | C | B | R | L | D | U |