diff options
Diffstat (limited to 'src/mame/machine/copsnrob.c')
-rw-r--r-- | src/mame/machine/copsnrob.c | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/src/mame/machine/copsnrob.c b/src/mame/machine/copsnrob.c new file mode 100644 index 00000000000..53186c867a6 --- /dev/null +++ b/src/mame/machine/copsnrob.c @@ -0,0 +1,59 @@ +/*************************************************************************** + + Atari Cops'n Robbers hardware + +***************************************************************************/ + +#include "driver.h" +#include "copsnrob.h" + +static int gun_mask[] = {0x7e, 0x7d, 0x7b, 0x77, 0x6f, 0x5f, 0x3f}; + +// The gun control is a 7 position switch. I'm doing the following to +// emulate it: +// +// I read out the current gun position via the sprite image locations, +// and then decrement/increment it if the up/down keys are pressed. + +READ8_HANDLER( copsnrob_gun_position_r ) +{ + int keys, current_car_image, current_gun_pos = 0; + + // Determine which player we need + switch (offset) + { + default: + case 0x00: + current_car_image = copsnrob_carimage[0]; + keys = input_port_4_r(0); + break; + case 0x04: + current_car_image = copsnrob_carimage[1]; + keys = input_port_5_r(0); + break; + case 0x08: + current_car_image = copsnrob_carimage[2]; + keys = input_port_6_r(0); + break; + case 0x0c: + current_car_image = copsnrob_carimage[3]; + keys = input_port_7_r(0); + } + + if (current_car_image < 7) + { + current_gun_pos = 6 - current_car_image; + } + else if (current_car_image < 14) + { + current_gun_pos = 13 - current_car_image; + } + + // Gun up + if ((keys & 0x01) && (current_gun_pos != 6)) current_gun_pos++; + + // Gun down + if ((keys & 0x02) && (current_gun_pos != 0)) current_gun_pos--; + + return (keys & 0x80) | gun_mask[current_gun_pos]; +} |