midway/omegrace.cpp: Replaced input lookup table with encoder function. (#10728)

This commit is contained in:
0kmg 2022-12-23 13:39:57 -08:00 committed by GitHub
parent 6120f9a042
commit 61a26b1898
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -109,8 +109,7 @@
15 I encoder 1 (d7-d2)
The encoder is a 64 position Grey Code encoder, or a
pot and A to D converter.
The encoder is a 64 position Gray code encoder.
Unlike the quadrature inputs on Atari and Sega games,
Omega Race's controller is an absolute angle.
@ -126,8 +125,7 @@
16 I encoder 2 (d5-d0)
The inputs aren't scrambled as they are on the 1 player
encoder
The encoder is a 64 position Gray code encoder.
17 I DIP SW C6 (coin/cocktail settings)
@ -269,6 +267,7 @@ private:
TIMER_CALLBACK_MEMBER(periodic_int);
uint8_t vg_go_r();
static constexpr uint8_t encode_spinner(uint8_t data);
uint8_t spinner1_r();
uint8_t spinner2_r();
void outputs_w(uint8_t data);
@ -327,38 +326,20 @@ uint8_t omegrace_state::vg_go_r()
*
*************************************/
/*
* Encoder bit mappings
* The encoder is a 64 way switch, with the inputs scrambled
* on the input port (and shifted 2 bits to the left for the
* 1 player encoder)
*
* 3 6 5 4 7 2 for encoder 1 (shifted two bits left..)
*
* 1 4 3 2 5 0 for encoder 2 (not shifted..)
*/
static const uint8_t spinnerTable[64] =
constexpr uint8_t omegrace_state::encode_spinner(uint8_t data)
{
0x00, 0x01, 0x05, 0x04, 0x06, 0x07, 0x17, 0x16,
0x14, 0x15, 0x11, 0x10, 0x12, 0x13, 0x1b, 0x1a,
0x18, 0x19, 0x1d, 0x1c, 0x1e, 0x1f, 0x3f, 0x3e,
0x3c, 0x3d, 0x39, 0x38, 0x3a, 0x3b, 0x33, 0x32,
0x30, 0x31, 0x35, 0x34, 0x36, 0x37, 0x27, 0x26,
0x24, 0x25, 0x21, 0x20, 0x22, 0x23, 0x2b, 0x2a,
0x28, 0x29, 0x2d, 0x2c, 0x2e, 0x2f, 0x0f, 0x0e,
0x0c, 0x0d, 0x09, 0x08, 0x0a, 0x0b, 0x03, 0x02
};
data &= 0x3f;
return data ^ (data >> 1) ^ 0x3f; // Inverted 6-bit Gray code
}
uint8_t omegrace_state::spinner1_r()
{
return spinnerTable[m_spinner[0]->read() & 0x3f] << 2;
return encode_spinner(m_spinner[0]->read()) << 2;
}
uint8_t omegrace_state::spinner2_r()
{
return spinnerTable[m_spinner[1]->read() & 0x3f];
return encode_spinner(m_spinner[1]->read());
}