trunk/src/mame/drivers/deco_mlc.c
r21918 | r21919 | |
206 | 206 | return m_mlc_vram[offset]&0xffff; |
207 | 207 | } |
208 | 208 | |
| 209 | // there is more to this, it controls the runner on the attract screen before the title should appear at least |
209 | 210 | READ32_MEMBER(deco_mlc_state::stadhr96_prot_146_r) |
210 | 211 | { |
211 | 212 | /* |
r21918 | r21919 | |
217 | 218 | */ |
218 | 219 | offset<<=1; |
219 | 220 | |
220 | | logerror("%08x: Read prot %04x\n", space.device().safe_pc(), offset); |
221 | 221 | |
222 | 222 | if (offset==0x5c4) |
223 | 223 | return 0xaa55 << 16; |
r21918 | r21919 | |
228 | 228 | if (offset==0x304) |
229 | 229 | return 0x0001 << 16; // Unknown, is either 0,1,2,3 |
230 | 230 | |
| 231 | printf("%08x: Read prot %08x\n", space.device().safe_pc(), offset); |
| 232 | |
231 | 233 | return 0; |
232 | 234 | } |
233 | 235 | |
| 236 | WRITE32_MEMBER(deco_mlc_state::stadhr96_prot_146_w) |
| 237 | { |
| 238 | printf("%08x: Write prot %04x %08x\n", space.device().safe_pc(), offset, data); |
| 239 | } |
| 240 | |
234 | 241 | /******************************************************************************/ |
235 | 242 | |
236 | 243 | static ADDRESS_MAP_START( decomlc_map, AS_PROGRAM, 32, deco_mlc_state ) |
r21918 | r21919 | |
250 | 257 | AM_RANGE(0x044001c, 0x044001f) AM_WRITENOP AM_MIRROR(0xff000000) |
251 | 258 | AM_RANGE(0x0500000, 0x0500003) AM_WRITE(avengrs_eprom_w) AM_MIRROR(0xff000000) |
252 | 259 | AM_RANGE(0x0600000, 0x0600007) AM_DEVREADWRITE8_LEGACY("ymz", ymz280b_r, ymz280b_w, 0xff000000) AM_MIRROR(0xff000000) |
253 | | AM_RANGE(0x070f000, 0x070ffff) AM_READ(stadhr96_prot_146_r) AM_MIRROR(0xff000000) |
254 | | // AM_RANGE(0x070f000, 0x070ffff) AM_READ_LEGACY(stadhr96_prot_146_w) AM_SHARE("prot32ram") |
| 260 | AM_RANGE(0x070f000, 0x070ffff) AM_READWRITE(stadhr96_prot_146_r, stadhr96_prot_146_w) AM_MIRROR(0xff000000) |
255 | 261 | ADDRESS_MAP_END |
256 | 262 | |
257 | 263 | /******************************************************************************/ |
trunk/src/mame/includes/deco_mlc.h
r21918 | r21919 | |
16 | 16 | required_shared_ptr<UINT32> m_mlc_vram; |
17 | 17 | timer_device *m_raster_irq_timer; |
18 | 18 | int m_mainCpuIsArm; |
19 | | int m_mlc_raster_table[9][256]; |
| 19 | UINT32 m_mlc_raster_table_1[4*256]; |
| 20 | UINT32 m_mlc_raster_table_2[4*256]; |
| 21 | UINT32 m_mlc_raster_table_3[4*256]; |
20 | 22 | UINT32 m_vbl_i; |
21 | 23 | int m_lastScanline[9]; |
22 | 24 | UINT32 m_colour_mask; |
r21918 | r21919 | |
30 | 32 | DECLARE_READ32_MEMBER(mlc_spriteram_r); |
31 | 33 | DECLARE_READ32_MEMBER(mlc_vram_r); |
32 | 34 | DECLARE_READ32_MEMBER(stadhr96_prot_146_r); |
| 35 | DECLARE_WRITE32_MEMBER(stadhr96_prot_146_w); |
33 | 36 | DECLARE_READ32_MEMBER(avengrgs_speedup_r); |
34 | 37 | DECLARE_WRITE32_MEMBER(avengrs_eprom_w); |
35 | 38 | DECLARE_DRIVER_INIT(mlc); |
trunk/src/mame/video/deco_mlc.c
r21918 | r21919 | |
336 | 336 | if(fx1&1) fx^=0x8000; |
337 | 337 | if(fy1&1) fy^=0x4000; |
338 | 338 | |
| 339 | int extra_x_scale = 0x100; |
| 340 | |
| 341 | // I think we need some hardware tests.. |
| 342 | // see notes about how this can't be our enable register (avengrgs doesn't touch it |
| 343 | // and relies on something else, probably just the bits we use to select the window) |
| 344 | // (although as previously noted, it isn't writing valid per-scanline values either) |
339 | 345 | if (rasterMode) |
340 | 346 | { |
341 | | int irq_base_reg = 12 /* 6, 9, 12 */; |
| 347 | // use of these is a bit weird. |
| 348 | // -ZZZ -xxx ---- -yyy -XXX -zzz |
342 | 349 | |
343 | | int extra_y_off = m_irq_ram[irq_base_reg+0] & 0x7ff; |
344 | | int extra_x_off = m_irq_ram[irq_base_reg+1] & 0x7ff; |
345 | | int extra_y_scale = (m_irq_ram[irq_base_reg+2]>>16) & 0x7ff; |
346 | | int extra_x_scale = (m_irq_ram[irq_base_reg+2]>>0) & 0x7ff; |
| 350 | // xxx = x offset? |
| 351 | // yyy = y offset? |
| 352 | // zzz = xzoom (confirmed? stadium hero) |
| 353 | // 0x100 = no zoom |
| 354 | // |
| 355 | // XXX = duplicate bits of xxx? |
| 356 | // ZZZ = (sometimes) duplicate bits of zzz |
347 | 357 | |
348 | | if (extra_x_off & 0x400) extra_x_off -= 0x800; |
349 | | if (extra_y_off & 0x400) extra_y_off -= 0x800; |
| 358 | if ((clipper==0x0) || (clipper==0x2)) |
| 359 | { |
| 360 | |
| 361 | int irq_base_reg; /* 6, 9, 12 are possible */ |
| 362 | if (clipper== 0) irq_base_reg = 6; // OK upper screen.. left? |
| 363 | else if (clipper== 2) irq_base_reg = 9; // OK upper screen.. main / center |
| 364 | else irq_base_reg = 12; |
| 365 | |
| 366 | int extra_y_off = m_irq_ram[irq_base_reg+0] & 0x7ff; |
| 367 | int extra_x_off = m_irq_ram[irq_base_reg+1] & 0x7ff; |
| 368 | extra_x_scale = (m_irq_ram[irq_base_reg+2]>>0) & 0x3ff; |
| 369 | |
| 370 | if (extra_x_off & 0x400) { extra_x_off = (-extra_x_off & 0x3ff); } else { extra_x_off = (extra_x_off & 0x3ff); } |
| 371 | if (extra_y_off & 0x400) { extra_x_off = (-extra_y_off & 0x3ff); } else { extra_y_off = (extra_y_off & 0x3ff); } |
350 | 372 | |
351 | | if (extra_y_scale & 0x400) extra_y_scale -= 0x800; |
352 | | if (extra_x_scale & 0x400) extra_x_scale -= 0x800; |
353 | 373 | |
354 | | x += extra_x_off; |
355 | | y += extra_y_off; |
| 374 | x += extra_x_off; |
| 375 | y += extra_y_off; |
| 376 | } |
| 377 | else if (clipper==0x1) |
| 378 | { |
| 379 | // right? |
| 380 | } |
| 381 | else if (clipper==0x3) |
| 382 | { |
| 383 | // bottom? |
| 384 | } |
356 | 385 | |
357 | | xscale += extra_x_scale; |
358 | | yscale += extra_y_scale; |
359 | | |
360 | 386 | } |
361 | 387 | |
| 388 | xscale *= extra_x_scale; |
| 389 | |
362 | 390 | int ybase=y<<16; |
363 | 391 | int yinc=(yscale<<8)*16; |
364 | 392 | |
r21918 | r21919 | |
368 | 396 | ybase-=yoffs * (yscale<<8); |
369 | 397 | |
370 | 398 | int xbase=x<<16; |
371 | | int xinc=(xscale<<8)*16; |
| 399 | int xinc=(xscale)*16; |
372 | 400 | |
373 | 401 | if (fx) |
374 | | xbase+=(xoffs-15) * (xscale<<8) - ((w-1)*xinc); |
| 402 | xbase+=(xoffs-15) * (xscale) - ((w-1)*xinc); |
375 | 403 | else |
376 | | xbase-=xoffs * (xscale<<8); |
| 404 | xbase-=xoffs * (xscale); |
377 | 405 | |
378 | 406 | |
379 | 407 | int full_realybase = ybase; |
r21918 | r21919 | |
490 | 518 | tile,tile2, |
491 | 519 | color + colorOffset,fx,realxbase, |
492 | 520 | 0, |
493 | | use8bppMode,(xscale<<8),alpha, srcline); |
| 521 | use8bppMode,(xscale),alpha, srcline); |
494 | 522 | |
495 | 523 | } |
496 | 524 | |