trunk/src/mame/drivers/kopunch.c
| r29204 | r29205 | |
| 4 | 4 | |
| 5 | 5 | XTAL: ? |
| 6 | 6 | CPU: 8085 (proof: it uses SIM opcode) |
| 7 | Other: 4 x i8255 for all I/O |
| 7 | 8 | |
| 8 | 9 | TODO: |
| 9 | 10 | - discrete sound? |
| r29204 | r29205 | |
| 30 | 31 | |
| 31 | 32 | #include "emu.h" |
| 32 | 33 | #include "cpu/i8085/i8085.h" |
| 34 | #include "machine/i8255.h" |
| 33 | 35 | #include "includes/kopunch.h" |
| 34 | 36 | |
| 35 | 37 | |
| 36 | | INTERRUPT_GEN_MEMBER(kopunch_state::kopunch_interrupt) |
| 38 | /******************************************************** |
| 39 | |
| 40 | Interrupts |
| 41 | |
| 42 | ********************************************************/ |
| 43 | |
| 44 | INTERRUPT_GEN_MEMBER(kopunch_state::vblank_interrupt) |
| 37 | 45 | { |
| 38 | 46 | device.execute().set_input_line(I8085_RST75_LINE, ASSERT_LINE); |
| 39 | 47 | device.execute().set_input_line(I8085_RST75_LINE, CLEAR_LINE); |
| 40 | 48 | } |
| 41 | 49 | |
| 42 | | READ8_MEMBER(kopunch_state::kopunch_in_r) |
| 50 | INPUT_CHANGED_MEMBER(kopunch_state::left_coin_inserted) |
| 43 | 51 | { |
| 44 | | /* port 31 + low 3 bits of port 32 contain the punch strength */ |
| 45 | | if (offset == 0) |
| 46 | | return machine().rand(); |
| 47 | | else |
| 48 | | return (machine().rand() & 0x07) | ioport("SYSTEM")->read(); |
| 52 | // left coin insertion causes a rst6.5 (vector 0x34) |
| 53 | if (newval) |
| 54 | m_maincpu->set_input_line(I8085_RST65_LINE, HOLD_LINE); |
| 49 | 55 | } |
| 50 | 56 | |
| 51 | | WRITE8_MEMBER(kopunch_state::kopunch_lamp_w) |
| 57 | INPUT_CHANGED_MEMBER(kopunch_state::right_coin_inserted) |
| 52 | 58 | { |
| 53 | | set_led_status(machine(), 0, ~data & 0x80); |
| 59 | // right coin insertion causes a rst5.5 (vector 0x2c) |
| 60 | if (newval) |
| 61 | m_maincpu->set_input_line(I8085_RST55_LINE, HOLD_LINE); |
| 54 | 62 | } |
| 55 | 63 | |
| 56 | | WRITE8_MEMBER(kopunch_state::kopunch_coin_w) |
| 57 | | { |
| 58 | | coin_counter_w(machine(), 0, ~data & 0x80); |
| 59 | | coin_counter_w(machine(), 1, ~data & 0x40); |
| 60 | 64 | |
| 61 | | // if ((data & 0x3f) != 0x3e) |
| 62 | | // printf("port 34 = %02x ",data); |
| 63 | | } |
| 65 | /******************************************************** |
| 64 | 66 | |
| 67 | Memory Maps |
| 65 | 68 | |
| 69 | ********************************************************/ |
| 66 | 70 | |
| 67 | 71 | static ADDRESS_MAP_START( kopunch_map, AS_PROGRAM, 8, kopunch_state ) |
| 68 | 72 | AM_RANGE(0x0000, 0x1fff) AM_ROM |
| 69 | 73 | AM_RANGE(0x2000, 0x23ff) AM_RAM |
| 70 | | AM_RANGE(0x6000, 0x63ff) AM_RAM_WRITE(kopunch_fg_w) AM_SHARE("vram_fg") |
| 71 | | AM_RANGE(0x7000, 0x70ff) AM_RAM_WRITE(kopunch_bg_w) AM_SHARE("vram_bg") |
| 74 | AM_RANGE(0x6000, 0x63ff) AM_RAM_WRITE(vram_fg_w) AM_SHARE("vram_fg") |
| 75 | AM_RANGE(0x7000, 0x70ff) AM_RAM_WRITE(vram_bg_w) AM_SHARE("vram_bg") |
| 72 | 76 | AM_RANGE(0x7100, 0x73ff) AM_RAM // unused vram |
| 77 | AM_RANGE(0x7400, 0x7bff) AM_RAM // more unused vram? or accidental writes? |
| 73 | 78 | ADDRESS_MAP_END |
| 74 | 79 | |
| 75 | 80 | static ADDRESS_MAP_START( kopunch_io_map, AS_IO, 8, kopunch_state ) |
| 76 | | AM_RANGE(0x30, 0x30) AM_READ_PORT("P1") |
| 77 | | AM_RANGE(0x31, 0x32) AM_READ(kopunch_in_r) |
| 78 | | AM_RANGE(0x33, 0x33) AM_WRITENOP |
| 79 | | AM_RANGE(0x34, 0x34) AM_WRITE(kopunch_coin_w) |
| 80 | | AM_RANGE(0x35, 0x35) AM_WRITENOP |
| 81 | | AM_RANGE(0x36, 0x36) AM_WRITENOP |
| 82 | | AM_RANGE(0x37, 0x37) AM_WRITENOP |
| 83 | | AM_RANGE(0x38, 0x38) AM_WRITE(kopunch_lamp_w) |
| 84 | | AM_RANGE(0x39, 0x39) AM_WRITENOP |
| 85 | | AM_RANGE(0x3a, 0x3a) AM_READ_PORT("DSW") |
| 86 | | AM_RANGE(0x3b, 0x3b) AM_WRITENOP |
| 87 | | AM_RANGE(0x3c, 0x3c) AM_WRITE(kopunch_scroll_x_w) |
| 88 | | AM_RANGE(0x3d, 0x3d) AM_WRITE(kopunch_scroll_y_w) |
| 89 | | AM_RANGE(0x3e, 0x3e) AM_READ_PORT("P2") AM_WRITE(kopunch_gfxbank_w) |
| 90 | | AM_RANGE(0x3f, 0x3f) AM_WRITENOP |
| 81 | AM_RANGE(0x30, 0x33) AM_DEVREADWRITE("ppi8255_0", i8255_device, read, write) |
| 82 | AM_RANGE(0x34, 0x37) AM_DEVREADWRITE("ppi8255_1", i8255_device, read, write) |
| 83 | AM_RANGE(0x38, 0x3b) AM_DEVREADWRITE("ppi8255_2", i8255_device, read, write) |
| 84 | AM_RANGE(0x3c, 0x3f) AM_DEVREADWRITE("ppi8255_3", i8255_device, read, write) |
| 91 | 85 | ADDRESS_MAP_END |
| 92 | 86 | |
| 93 | | INPUT_CHANGED_MEMBER(kopunch_state::left_coin_inserted) |
| 87 | |
| 88 | |
| 89 | /******************************************************** |
| 90 | |
| 91 | PPI I/O |
| 92 | |
| 93 | ********************************************************/ |
| 94 | |
| 95 | READ8_MEMBER(kopunch_state::sensors1_r) |
| 94 | 96 | { |
| 95 | | // left coin insertion causes a rst6.5 (vector 0x34) |
| 96 | | if (newval) |
| 97 | | m_maincpu->set_input_line(I8085_RST65_LINE, HOLD_LINE); |
| 97 | // punch strength low bits |
| 98 | return machine().rand(); |
| 98 | 99 | } |
| 99 | 100 | |
| 100 | | INPUT_CHANGED_MEMBER(kopunch_state::right_coin_inserted) |
| 101 | READ8_MEMBER(kopunch_state::sensors2_r) |
| 101 | 102 | { |
| 102 | | // right coin insertion causes a rst5.5 (vector 0x2c) |
| 103 | | if (newval) |
| 104 | | m_maincpu->set_input_line(I8085_RST55_LINE, HOLD_LINE); |
| 103 | // d0-d2: punch strength high bits |
| 104 | // d3: coin 2 |
| 105 | // d4: unknown sensor |
| 106 | // d5: unknown sensor |
| 107 | // d6: unknown sensor |
| 108 | // d7: coin 1 |
| 109 | return (machine().rand() & 0x07) | ioport("SYSTEM")->read(); |
| 105 | 110 | } |
| 106 | 111 | |
| 112 | WRITE8_MEMBER(kopunch_state::lamp_w) |
| 113 | { |
| 114 | set_led_status(machine(), 0, ~data & 0x80); |
| 115 | } |
| 116 | |
| 117 | WRITE8_MEMBER(kopunch_state::coin_w) |
| 118 | { |
| 119 | coin_counter_w(machine(), 0, ~data & 0x80); |
| 120 | coin_counter_w(machine(), 1, ~data & 0x40); |
| 121 | |
| 122 | // if ((data & 0x3f) != 0x3e) |
| 123 | // printf("port 34 = %02x ",data); |
| 124 | } |
| 125 | |
| 126 | /*******************************************************/ |
| 127 | |
| 128 | static I8255A_INTERFACE( ppi8255_0_intf ) |
| 129 | { |
| 130 | // $30 - always $9b (PPI mode 0, ports A & B & C as input) |
| 131 | DEVCB_INPUT_PORT("P1"), |
| 132 | DEVCB_NULL, |
| 133 | DEVCB_DRIVER_MEMBER(kopunch_state, sensors1_r), |
| 134 | DEVCB_NULL, |
| 135 | DEVCB_DRIVER_MEMBER(kopunch_state, sensors2_r), |
| 136 | DEVCB_NULL |
| 137 | }; |
| 138 | |
| 139 | static I8255A_INTERFACE( ppi8255_1_intf ) |
| 140 | { |
| 141 | // $34 - always $80 (PPI mode 0, ports A & B & C as output) |
| 142 | DEVCB_NULL, |
| 143 | DEVCB_DRIVER_MEMBER(kopunch_state, coin_w), |
| 144 | DEVCB_NULL, |
| 145 | DEVCB_UNMAPPED, |
| 146 | DEVCB_NULL, |
| 147 | DEVCB_UNMAPPED |
| 148 | }; |
| 149 | |
| 150 | static I8255A_INTERFACE( ppi8255_2_intf ) |
| 151 | { |
| 152 | // $38 - always $89 (PPI mode 0, ports A & B as output, port C as input) |
| 153 | DEVCB_NULL, |
| 154 | DEVCB_DRIVER_MEMBER(kopunch_state, lamp_w), |
| 155 | DEVCB_NULL, |
| 156 | DEVCB_UNMAPPED, |
| 157 | DEVCB_INPUT_PORT("DSW"), |
| 158 | DEVCB_NULL |
| 159 | }; |
| 160 | |
| 161 | static I8255A_INTERFACE( ppi8255_3_intf ) |
| 162 | { |
| 163 | // $3c - always $88 (PPI mode 0, ports A & B & lower C as output, upper C as input) |
| 164 | DEVCB_NULL, |
| 165 | DEVCB_DRIVER_MEMBER(kopunch_state, scroll_x_w), |
| 166 | DEVCB_NULL, |
| 167 | DEVCB_DRIVER_MEMBER(kopunch_state, scroll_y_w), |
| 168 | DEVCB_INPUT_PORT("P2"), |
| 169 | DEVCB_DRIVER_MEMBER(kopunch_state, gfxbank_w) |
| 170 | }; |
| 171 | |
| 172 | |
| 173 | |
| 174 | /******************************************************** |
| 175 | |
| 176 | Inputs |
| 177 | |
| 178 | ********************************************************/ |
| 179 | |
| 107 | 180 | static INPUT_PORTS_START( kopunch ) |
| 108 | 181 | PORT_START("P1") |
| 109 | 182 | PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) |
| r29204 | r29205 | |
| 158 | 231 | INPUT_PORTS_END |
| 159 | 232 | |
| 160 | 233 | |
| 161 | | static const gfx_layout charlayout = |
| 234 | |
| 235 | /*******************************************************/ |
| 236 | |
| 237 | static const gfx_layout fg_layout = |
| 162 | 238 | { |
| 163 | 239 | 8,8, |
| 164 | 240 | RGN_FRAC(1,3), |
| r29204 | r29205 | |
| 169 | 245 | 8*8 |
| 170 | 246 | }; |
| 171 | 247 | |
| 172 | | static const gfx_layout charlayoutbig = |
| 248 | static const gfx_layout bg_layout = |
| 173 | 249 | { |
| 174 | 250 | 16,16, |
| 175 | 251 | RGN_FRAC(1,3), |
| r29204 | r29205 | |
| 181 | 257 | }; |
| 182 | 258 | |
| 183 | 259 | static GFXDECODE_START( kopunch ) |
| 184 | | GFXDECODE_ENTRY( "gfx1", 0, charlayout, 0, 1 ) |
| 185 | | GFXDECODE_ENTRY( "gfx2", 0, charlayoutbig, 0, 1 ) |
| 260 | GFXDECODE_ENTRY( "gfx1", 0, fg_layout, 0, 1 ) |
| 261 | GFXDECODE_ENTRY( "gfx2", 0, bg_layout, 0, 1 ) |
| 186 | 262 | GFXDECODE_END |
| 187 | 263 | |
| 188 | 264 | |
| r29204 | r29205 | |
| 203 | 279 | MCFG_CPU_ADD("maincpu", I8085A, 4000000) // 4 MHz? |
| 204 | 280 | MCFG_CPU_PROGRAM_MAP(kopunch_map) |
| 205 | 281 | MCFG_CPU_IO_MAP(kopunch_io_map) |
| 206 | | MCFG_CPU_VBLANK_INT_DRIVER("screen", kopunch_state, kopunch_interrupt) |
| 282 | MCFG_CPU_VBLANK_INT_DRIVER("screen", kopunch_state, vblank_interrupt) |
| 207 | 283 | |
| 284 | MCFG_I8255A_ADD("ppi8255_0", ppi8255_0_intf) |
| 285 | MCFG_I8255A_ADD("ppi8255_1", ppi8255_1_intf) |
| 286 | MCFG_I8255A_ADD("ppi8255_2", ppi8255_2_intf) |
| 287 | MCFG_I8255A_ADD("ppi8255_3", ppi8255_3_intf) |
| 288 | |
| 208 | 289 | /* video hardware */ |
| 209 | 290 | MCFG_SCREEN_ADD("screen", RASTER) |
| 210 | 291 | MCFG_SCREEN_REFRESH_RATE(60) |
| 211 | 292 | MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) |
| 212 | 293 | MCFG_SCREEN_SIZE(32*8, 32*8) |
| 213 | | MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1) |
| 294 | MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 28*8-1) |
| 214 | 295 | MCFG_SCREEN_UPDATE_DRIVER(kopunch_state, screen_update_kopunch) |
| 215 | 296 | MCFG_SCREEN_PALETTE("palette") |
| 216 | 297 | |
| r29204 | r29205 | |
| 219 | 300 | MCFG_PALETTE_INIT_OWNER(kopunch_state, kopunch) |
| 220 | 301 | |
| 221 | 302 | /* sound hardware */ |
| 303 | // ... |
| 222 | 304 | MACHINE_CONFIG_END |
| 223 | 305 | |
| 224 | 306 | |
| 225 | | /*************************************************************************** |
| 226 | 307 | |
| 308 | /******************************************************** |
| 309 | |
| 227 | 310 | Game driver(s) |
| 228 | 311 | |
| 229 | | ***************************************************************************/ |
| 312 | ********************************************************/ |
| 230 | 313 | |
| 231 | 314 | ROM_START( kopunch ) |
| 232 | 315 | ROM_REGION( 0x10000, "maincpu", 0 ) |
| r29204 | r29205 | |
| 252 | 335 | ROM_LOAD( "epr1100", 0x0040, 0x0020, CRC(bedb66b1) SHA1(8e78bb205d900075b761e1baa5f5813174ff28ba) ) /* unknown */ |
| 253 | 336 | ROM_END |
| 254 | 337 | |
| 338 | |
| 255 | 339 | GAME( 1981, kopunch, 0, kopunch, kopunch, driver_device, 0, ROT270, "Sega", "KO Punch", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL | GAME_SUPPORTS_SAVE ) |