111
110
*************************************/
113
static READ8_HANDLER( qix_videoram_r )
112
READ8_MEMBER(qix_state::qix_videoram_r)
115
qix_state *state = space->machine().driver_data<qix_state>();
117
115
/* add in the upper bit of the address latch */
118
offset += (state->m_videoram_address[0] & 0x80) << 8;
119
return state->m_videoram[offset];
116
offset += (m_videoram_address[0] & 0x80) << 8;
117
return m_videoram[offset];
123
static WRITE8_HANDLER( qix_videoram_w )
121
WRITE8_MEMBER(qix_state::qix_videoram_w)
125
qix_state *state = space->machine().driver_data<qix_state>();
127
124
/* update the screen in case the game is writing "behind" the beam -
128
125
Zookeeper likes to do this */
129
space->machine().primary_screen->update_now();
126
machine().primary_screen->update_now();
131
128
/* add in the upper bit of the address latch */
132
offset += (state->m_videoram_address[0] & 0x80) << 8;
129
offset += (m_videoram_address[0] & 0x80) << 8;
134
131
/* write the data */
135
state->m_videoram[offset] = data;
132
m_videoram[offset] = data;
139
static WRITE8_HANDLER( slither_videoram_w )
136
WRITE8_MEMBER(qix_state::slither_videoram_w)
141
qix_state *state = space->machine().driver_data<qix_state>();
143
139
/* update the screen in case the game is writing "behind" the beam -
144
140
Zookeeper likes to do this */
145
space->machine().primary_screen->update_now();
141
machine().primary_screen->update_now();
147
143
/* add in the upper bit of the address latch */
148
offset += (state->m_videoram_address[0] & 0x80) << 8;
144
offset += (m_videoram_address[0] & 0x80) << 8;
150
146
/* blend the data */
151
state->m_videoram[offset] = (state->m_videoram[offset] & ~*state->m_videoram_mask) | (data & *state->m_videoram_mask);
147
m_videoram[offset] = (m_videoram[offset] & ~*m_videoram_mask) | (data & *m_videoram_mask);
169
165
*************************************/
171
static READ8_HANDLER( qix_addresslatch_r )
167
READ8_MEMBER(qix_state::qix_addresslatch_r)
173
qix_state *state = space->machine().driver_data<qix_state>();
175
170
/* compute the value at the address latch */
176
offset = (state->m_videoram_address[0] << 8) | state->m_videoram_address[1];
177
return state->m_videoram[offset];
171
offset = (m_videoram_address[0] << 8) | m_videoram_address[1];
172
return m_videoram[offset];
181
static WRITE8_HANDLER( qix_addresslatch_w )
176
WRITE8_MEMBER(qix_state::qix_addresslatch_w)
183
qix_state *state = space->machine().driver_data<qix_state>();
185
179
/* update the screen in case the game is writing "behind" the beam */
186
space->machine().primary_screen->update_now();
180
machine().primary_screen->update_now();
188
182
/* compute the value at the address latch */
189
offset = (state->m_videoram_address[0] << 8) | state->m_videoram_address[1];
183
offset = (m_videoram_address[0] << 8) | m_videoram_address[1];
191
185
/* write the data */
192
state->m_videoram[offset] = data;
186
m_videoram[offset] = data;
196
static WRITE8_HANDLER( slither_addresslatch_w )
190
WRITE8_MEMBER(qix_state::slither_addresslatch_w)
198
qix_state *state = space->machine().driver_data<qix_state>();
200
193
/* update the screen in case the game is writing "behind" the beam */
201
space->machine().primary_screen->update_now();
194
machine().primary_screen->update_now();
203
196
/* compute the value at the address latch */
204
offset = (state->m_videoram_address[0] << 8) | state->m_videoram_address[1];
197
offset = (m_videoram_address[0] << 8) | m_videoram_address[1];
206
199
/* blend the data */
207
state->m_videoram[offset] = (state->m_videoram[offset] & ~*state->m_videoram_mask) | (data & *state->m_videoram_mask);
200
m_videoram[offset] = (m_videoram[offset] & ~*m_videoram_mask) | (data & *m_videoram_mask);
216
209
*************************************/
219
static WRITE8_HANDLER( qix_paletteram_w )
212
WRITE8_MEMBER(qix_state::qix_paletteram_w)
221
qix_state *state = space->machine().driver_data<qix_state>();
223
UINT8 old_data = state->m_paletteram[offset];
215
UINT8 old_data = m_paletteram[offset];
225
217
/* set the palette RAM value */
226
state->m_paletteram[offset] = data;
218
m_paletteram[offset] = data;
228
220
/* trigger an update if a currently visible pen has changed */
229
if (((offset >> 8) == state->m_palette_bank) &&
221
if (((offset >> 8) == m_palette_bank) &&
230
222
(old_data != data))
231
space->machine().primary_screen->update_now();
223
machine().primary_screen->update_now();
235
WRITE8_HANDLER( qix_palettebank_w )
227
WRITE8_MEMBER(qix_state::qix_palettebank_w)
237
qix_state *state = space->machine().driver_data<qix_state>();
239
230
/* set the bank value */
240
if (state->m_palette_bank != (data & 3))
231
if (m_palette_bank != (data & 3))
242
space->machine().primary_screen->update_now();
243
state->m_palette_bank = data & 3;
233
machine().primary_screen->update_now();
234
m_palette_bank = data & 3;
246
237
/* LEDs are in the upper 6 bits */
247
state->m_leds = ~data & 0xfc;
238
m_leds = ~data & 0xfc;
345
336
*************************************/
347
static ADDRESS_MAP_START( qix_video_map, AS_PROGRAM, 8 )
338
static ADDRESS_MAP_START( qix_video_map, AS_PROGRAM, 8, qix_state )
348
339
AM_RANGE(0x0000, 0x7fff) AM_READWRITE(qix_videoram_r, qix_videoram_w)
349
340
AM_RANGE(0x8000, 0x83ff) AM_RAM AM_SHARE("share1")
350
341
AM_RANGE(0x8400, 0x87ff) AM_RAM AM_SHARE("nvram")
351
342
AM_RANGE(0x8800, 0x8800) AM_MIRROR(0x03ff) AM_WRITE(qix_palettebank_w)
352
343
AM_RANGE(0x8c00, 0x8c00) AM_MIRROR(0x03fe) AM_READWRITE(qix_data_firq_r, qix_data_firq_w)
353
344
AM_RANGE(0x8c01, 0x8c01) AM_MIRROR(0x03fe) AM_READWRITE(qix_video_firq_ack_r, qix_video_firq_ack_w)
354
AM_RANGE(0x9000, 0x93ff) AM_RAM_WRITE(qix_paletteram_w) AM_BASE_MEMBER(qix_state, m_paletteram)
345
AM_RANGE(0x9000, 0x93ff) AM_RAM_WRITE(qix_paletteram_w) AM_SHARE("paletteram")
355
346
AM_RANGE(0x9400, 0x9400) AM_MIRROR(0x03fc) AM_READWRITE(qix_addresslatch_r, qix_addresslatch_w)
356
AM_RANGE(0x9402, 0x9403) AM_MIRROR(0x03fc) AM_WRITEONLY AM_BASE_MEMBER(qix_state, m_videoram_address)
357
AM_RANGE(0x9800, 0x9800) AM_MIRROR(0x03ff) AM_READONLY AM_BASE_MEMBER(qix_state, m_scanline_latch)
358
AM_RANGE(0x9c00, 0x9c00) AM_MIRROR(0x03fe) AM_DEVWRITE_MODERN("vid_u18", mc6845_device, address_w)
359
AM_RANGE(0x9c01, 0x9c01) AM_MIRROR(0x03fe) AM_DEVREADWRITE_MODERN("vid_u18", mc6845_device, register_r, register_w)
347
AM_RANGE(0x9402, 0x9403) AM_MIRROR(0x03fc) AM_WRITEONLY AM_SHARE("videoram_addr")
348
AM_RANGE(0x9800, 0x9800) AM_MIRROR(0x03ff) AM_READONLY AM_SHARE("scanline_latch")
349
AM_RANGE(0x9c00, 0x9c00) AM_MIRROR(0x03fe) AM_DEVWRITE("vid_u18", mc6845_device, address_w)
350
AM_RANGE(0x9c01, 0x9c01) AM_MIRROR(0x03fe) AM_DEVREADWRITE("vid_u18", mc6845_device, register_r, register_w)
360
351
AM_RANGE(0xa000, 0xffff) AM_ROM
364
static ADDRESS_MAP_START( zookeep_video_map, AS_PROGRAM, 8 )
355
static ADDRESS_MAP_START( zookeep_video_map, AS_PROGRAM, 8, qix_state )
365
356
AM_RANGE(0x0000, 0x7fff) AM_READWRITE(qix_videoram_r, qix_videoram_w)
366
357
AM_RANGE(0x8000, 0x83ff) AM_RAM AM_SHARE("share1")
367
358
AM_RANGE(0x8400, 0x87ff) AM_RAM AM_SHARE("nvram")
369
360
AM_RANGE(0x8801, 0x8801) AM_MIRROR(0x03fe) AM_WRITE(zookeep_bankswitch_w)
370
361
AM_RANGE(0x8c00, 0x8c00) AM_MIRROR(0x03fe) AM_READWRITE(qix_data_firq_r, qix_data_firq_w)
371
362
AM_RANGE(0x8c01, 0x8c01) AM_MIRROR(0x03fe) AM_READWRITE(qix_video_firq_ack_r, qix_video_firq_ack_w)
372
AM_RANGE(0x9000, 0x93ff) AM_RAM_WRITE(qix_paletteram_w) AM_BASE_MEMBER(qix_state, m_paletteram)
363
AM_RANGE(0x9000, 0x93ff) AM_RAM_WRITE(qix_paletteram_w) AM_SHARE("paletteram")
373
364
AM_RANGE(0x9400, 0x9400) AM_MIRROR(0x03fc) AM_READWRITE(qix_addresslatch_r, qix_addresslatch_w)
374
AM_RANGE(0x9402, 0x9403) AM_MIRROR(0x03fc) AM_WRITEONLY AM_BASE_MEMBER(qix_state, m_videoram_address)
375
AM_RANGE(0x9800, 0x9800) AM_MIRROR(0x03ff) AM_READONLY AM_BASE_MEMBER(qix_state, m_scanline_latch)
376
AM_RANGE(0x9c00, 0x9c00) AM_MIRROR(0x03fe) AM_DEVWRITE_MODERN("vid_u18", mc6845_device, address_w)
377
AM_RANGE(0x9c01, 0x9c01) AM_MIRROR(0x03fe) AM_DEVREADWRITE_MODERN("vid_u18", mc6845_device, register_r, register_w)
365
AM_RANGE(0x9402, 0x9403) AM_MIRROR(0x03fc) AM_WRITEONLY AM_SHARE("videoram_addr")
366
AM_RANGE(0x9800, 0x9800) AM_MIRROR(0x03ff) AM_READONLY AM_SHARE("scanline_latch")
367
AM_RANGE(0x9c00, 0x9c00) AM_MIRROR(0x03fe) AM_DEVWRITE("vid_u18", mc6845_device, address_w)
368
AM_RANGE(0x9c01, 0x9c01) AM_MIRROR(0x03fe) AM_DEVREADWRITE("vid_u18", mc6845_device, register_r, register_w)
378
369
AM_RANGE(0xa000, 0xbfff) AM_ROMBANK("bank1")
379
370
AM_RANGE(0xc000, 0xffff) AM_ROM
383
static ADDRESS_MAP_START( slither_video_map, AS_PROGRAM, 8 )
374
static ADDRESS_MAP_START( slither_video_map, AS_PROGRAM, 8, qix_state )
384
375
AM_RANGE(0x0000, 0x7fff) AM_READWRITE(qix_videoram_r, slither_videoram_w)
385
376
AM_RANGE(0x8000, 0x83ff) AM_RAM AM_SHARE("share1")
386
377
AM_RANGE(0x8400, 0x87ff) AM_RAM AM_SHARE("nvram")
387
378
AM_RANGE(0x8800, 0x8800) AM_MIRROR(0x03ff) AM_WRITE(qix_palettebank_w)
388
379
AM_RANGE(0x8c00, 0x8c00) AM_MIRROR(0x03fe) AM_READWRITE(qix_data_firq_r, qix_data_firq_w)
389
380
AM_RANGE(0x8c01, 0x8c01) AM_MIRROR(0x03fe) AM_READWRITE(qix_video_firq_ack_r, qix_video_firq_ack_w)
390
AM_RANGE(0x9000, 0x93ff) AM_RAM_WRITE(qix_paletteram_w) AM_BASE_MEMBER(qix_state, m_paletteram)
381
AM_RANGE(0x9000, 0x93ff) AM_RAM_WRITE(qix_paletteram_w) AM_SHARE("paletteram")
391
382
AM_RANGE(0x9400, 0x9400) AM_MIRROR(0x03fc) AM_READWRITE(qix_addresslatch_r, slither_addresslatch_w)
392
AM_RANGE(0x9401, 0x9401) AM_MIRROR(0x03fc) AM_WRITEONLY AM_BASE_MEMBER(qix_state, m_videoram_mask)
393
AM_RANGE(0x9402, 0x9403) AM_MIRROR(0x03fc) AM_WRITEONLY AM_BASE_MEMBER(qix_state, m_videoram_address)
394
AM_RANGE(0x9800, 0x9800) AM_MIRROR(0x03ff) AM_READONLY AM_BASE_MEMBER(qix_state, m_scanline_latch)
395
AM_RANGE(0x9c00, 0x9c00) AM_MIRROR(0x03fe) AM_DEVWRITE_MODERN("vid_u18", mc6845_device, address_w)
396
AM_RANGE(0x9c01, 0x9c01) AM_MIRROR(0x03fe) AM_DEVREADWRITE_MODERN("vid_u18", mc6845_device, register_r, register_w)
383
AM_RANGE(0x9401, 0x9401) AM_MIRROR(0x03fc) AM_WRITEONLY AM_SHARE("videoram_mask")
384
AM_RANGE(0x9402, 0x9403) AM_MIRROR(0x03fc) AM_WRITEONLY AM_SHARE("videoram_addr")
385
AM_RANGE(0x9800, 0x9800) AM_MIRROR(0x03ff) AM_READONLY AM_SHARE("scanline_latch")
386
AM_RANGE(0x9c00, 0x9c00) AM_MIRROR(0x03fe) AM_DEVWRITE("vid_u18", mc6845_device, address_w)
387
AM_RANGE(0x9c01, 0x9c01) AM_MIRROR(0x03fe) AM_DEVREADWRITE("vid_u18", mc6845_device, register_r, register_w)
397
388
AM_RANGE(0xa000, 0xffff) AM_ROM