src/mess/drivers/supracan.c
| r6872 | r6873 | |
| 30 | 30 | static UINT16 *supracan_soundram_16; |
| 31 | 31 | static UINT16 supracan_video_regs[256]; |
| 32 | 32 | static emu_timer *supracan_video_timer; |
| 33 | | static UINT16 *supracan_charram, *supracan_sprcharram; |
| 33 | static UINT16 *supracan_charram; |
| 34 | 34 | static UINT16 *supracan_vram; |
| 35 | 35 | static UINT16 *supracan_rram; |
| 36 | 36 | static UINT16 *supracan_rozpal; |
| r6872 | r6873 | |
| 123 | 123 | |
| 124 | 124 | static _acan_dma_regs_t acan_dma_regs; |
| 125 | 125 | |
| 126 | typedef struct |
| 127 | { |
| 128 | UINT32 src; |
| 129 | UINT32 dst; |
| 130 | UINT16 count; |
| 131 | UINT16 control; |
| 132 | } _acan_sprdma_regs_t; |
| 133 | |
| 134 | static _acan_sprdma_regs_t acan_sprdma_regs; |
| 135 | |
| 136 | |
| 126 | 137 | static WRITE16_HANDLER( supracan_dma_w ) |
| 127 | 138 | { |
| 128 | 139 | int i; |
| 140 | |
| 129 | 141 | switch(offset) |
| 130 | 142 | { |
| 131 | 143 | case 0x00/2: // Source address MSW |
| r6872 | r6873 | |
| 156 | 168 | for(i = 0; i <= acan_dma_regs.count; i++) |
| 157 | 169 | { |
| 158 | 170 | if(data & 0x1000) |
| 159 | | memory_write_word(space, acan_dma_regs.dest+=2, memory_read_word(space, acan_dma_regs.source+=2)); |
| 171 | { |
| 172 | memory_write_word(space, acan_dma_regs.dest, memory_read_word(space, acan_dma_regs.source)); |
| 173 | acan_dma_regs.dest+=2; |
| 174 | acan_dma_regs.source+=2; |
| 175 | } |
| 160 | 176 | else |
| 161 | | memory_write_byte(space, acan_dma_regs.dest++, memory_read_byte(space, acan_dma_regs.source++)); |
| 177 | { |
| 178 | memory_write_byte(space, acan_dma_regs.dest, memory_read_byte(space, acan_dma_regs.source)); |
| 179 | acan_dma_regs.dest++; |
| 180 | acan_dma_regs.source++; |
| 181 | } |
| 162 | 182 | } |
| 163 | 183 | } |
| 164 | 184 | else |
| r6872 | r6873 | |
| 169 | 189 | } |
| 170 | 190 | } |
| 171 | 191 | |
| 192 | #if 0 |
| 172 | 193 | static WRITE16_HANDLER( supracan_sprchar_w ) |
| 173 | 194 | { |
| 174 | 195 | COMBINE_DATA(&supracan_sprcharram[offset]); |
| r6872 | r6873 | |
| 179 | 200 | gfx[offset*2+0] = (supracan_sprcharram[offset] & 0xff00) >> 8; |
| 180 | 201 | gfx[offset*2+1] = (supracan_sprcharram[offset] & 0x00ff) >> 0; |
| 181 | 202 | |
| 182 | | gfx_element_mark_dirty(space->machine->gfx[1], offset/32); |
| 203 | gfx_element_mark_dirty(space->machine->gfx[1], offset/16); |
| 204 | |
| 183 | 205 | } |
| 184 | 206 | } |
| 207 | #endif |
| 185 | 208 | |
| 186 | 209 | static ADDRESS_MAP_START( supracan_mem, ADDRESS_SPACE_PROGRAM, 16 ) |
| 187 | 210 | AM_RANGE( 0x000000, 0x07ffff ) AM_ROM AM_REGION( "cart", 0 ) |
| r6872 | r6873 | |
| 198 | 221 | AM_RANGE( 0xf44200, 0xf443ff ) AM_RAM AM_BASE(&supracan_vram) /* Foreground tilemap layer */ |
| 199 | 222 | AM_RANGE( 0xf44400, 0xf445ff ) AM_RAM AM_BASE(&supracan_rram) /* ROZ layer tiles */ |
| 200 | 223 | AM_RANGE( 0xf44600, 0xf44fff ) AM_RAM /* Unknown, stuff gets written here. Zoom table?? */ |
| 201 | | AM_RANGE( 0xfc0000, 0xfcffff ) AM_RAM_WRITE( supracan_sprchar_w ) AM_BASE( &supracan_sprcharram ) /* System work ram */ |
| 224 | AM_RANGE( 0xf48000, 0xf4ffff ) AM_RAM /* more character data */ |
| 225 | AM_RANGE( 0xf5d000, 0xf5d0ff ) AM_RAM |
| 226 | AM_RANGE( 0xfc0000, 0xfcffff ) AM_RAM /* System work ram */ |
| 202 | 227 | AM_RANGE( 0xff8000, 0xffffff ) AM_RAM /* System work ram */ |
| 203 | 228 | ADDRESS_MAP_END |
| 204 | 229 | |
| r6872 | r6873 | |
| 218 | 243 | gfx[offset*2+0] = (supracan_charram[offset] & 0xff00) >> 8; |
| 219 | 244 | gfx[offset*2+1] = (supracan_charram[offset] & 0x00ff) >> 0; |
| 220 | 245 | |
| 221 | | gfx_element_mark_dirty(space->machine->gfx[0], offset/16); |
| 246 | gfx_element_mark_dirty(space->machine->gfx[0], offset/32); |
| 247 | gfx_element_mark_dirty(space->machine->gfx[1], offset/16); |
| 222 | 248 | } |
| 223 | 249 | } |
| 224 | 250 | |
| r6872 | r6873 | |
| 296 | 322 | case 0: // VBlank flag |
| 297 | 323 | break; |
| 298 | 324 | default: |
| 299 | | verboselog(space->machine, 0, "supracan_video_r: Unknown register: %08x (%04x & %04x)\n", 0xf0000 + (offset << 1), data, mem_mask); |
| 325 | verboselog(space->machine, 0, "supracan_video_r: Unknown register: %08x (%04x & %04x)\n", 0xf00000 + (offset << 1), data, mem_mask); |
| 300 | 326 | break; |
| 301 | 327 | } |
| 302 | 328 | |
| r6872 | r6873 | |
| 321 | 347 | timer_adjust_oneshot( supracan_video_timer, video_screen_get_time_until_pos( machine->primary_screen, ( vpos + 1 ) & 0xff, 0 ), 0 ); |
| 322 | 348 | } |
| 323 | 349 | |
| 350 | /* |
| 351 | 0x188/0x18a is global x/y offset for the roz? |
| 324 | 352 | |
| 353 | f00018 is src |
| 354 | f00012 is dst |
| 355 | f0001c / f00016 are flags of some sort |
| 356 | f00010 is the size |
| 357 | f0001e is the trigger |
| 358 | */ |
| 325 | 359 | static WRITE16_HANDLER( supracan_video_w ) |
| 326 | 360 | { |
| 361 | int i; |
| 362 | |
| 327 | 363 | switch(offset) |
| 328 | 364 | { |
| 365 | case 0x18/2: // Source address MSW |
| 366 | acan_sprdma_regs.src &= 0x0000ffff; |
| 367 | acan_sprdma_regs.src |= data << 16; |
| 368 | break; |
| 369 | case 0x1a/2: // Source address LSW |
| 370 | acan_sprdma_regs.src &= 0xffff0000; |
| 371 | acan_sprdma_regs.src |= data; |
| 372 | break; |
| 373 | case 0x12/2: // Destination address MSW |
| 374 | acan_sprdma_regs.dst &= 0x0000ffff; |
| 375 | acan_sprdma_regs.dst |= data << 16; |
| 376 | break; |
| 377 | case 0x14/2: // Destination address LSW |
| 378 | acan_sprdma_regs.dst &= 0xffff0000; |
| 379 | acan_sprdma_regs.dst |= data; |
| 380 | break; |
| 381 | case 0x10/2: // Byte count |
| 382 | acan_sprdma_regs.count = data; |
| 383 | break; |
| 384 | case 0x1e/2: |
| 385 | //if(data != 0xa000) |
| 386 | //printf("%08x %08x %04x %04x\n",acan_sprdma_regs.src,acan_sprdma_regs.dst,acan_sprdma_regs.count,data); |
| 387 | if(data & 0xa000) //0x2000 selects dword transfer? |
| 388 | { |
| 389 | for(i = 0; i <= acan_sprdma_regs.count; i++) |
| 390 | { |
| 391 | if(data & 0x0100) //dma 0x00 fill (or fixed value?) |
| 392 | { |
| 393 | memory_write_dword(space, acan_sprdma_regs.dst, 0x00000000); |
| 394 | acan_sprdma_regs.dst+=4; |
| 395 | } |
| 396 | else |
| 397 | { |
| 398 | memory_write_dword(space, acan_sprdma_regs.dst, memory_read_dword(space, acan_sprdma_regs.src)); |
| 399 | acan_sprdma_regs.dst+=4; |
| 400 | acan_sprdma_regs.src+=4; |
| 401 | } |
| 402 | } |
| 403 | } |
| 404 | else |
| 405 | { |
| 406 | // ... |
| 407 | } |
| 408 | break; |
| 329 | 409 | default: |
| 330 | | verboselog(space->machine, 0, "supracan_video_w: Unknown register: %08x = %04x & %04x\n", 0xf0000 + (offset << 1), data, mem_mask); |
| 410 | verboselog(space->machine, 0, "supracan_video_w: Unknown register: %08x = %04x & %04x\n", 0xf00000 + (offset << 1), data, mem_mask); |
| 331 | 411 | break; |
| 332 | 412 | } |
| 333 | 413 | supracan_video_regs[offset] = data; |
| r6872 | r6873 | |
| 391 | 471 | |
| 392 | 472 | static GFXDECODE_START( supracan ) |
| 393 | 473 | GFXDECODE_ENTRY( "ram_gfx", 0, supracan_gfxlayout, 0, 1 ) |
| 394 | | GFXDECODE_ENTRY( "spr_gfx", 0, supracan_sprlayout, 0, 2 ) |
| 474 | GFXDECODE_ENTRY( "ram_gfx", 0, supracan_sprlayout, 0, 0x10 ) |
| 395 | 475 | GFXDECODE_END |
| 396 | 476 | |
| 397 | 477 | static MACHINE_DRIVER_START( supracan ) |
| r6872 | r6873 | |
| 428 | 508 | |
| 429 | 509 | ROM_REGION( 0x4000, "ram_gfx", ROMREGION_ERASEFF ) |
| 430 | 510 | |
| 431 | | ROM_REGION( 0x8000, "spr_gfx", ROMREGION_ERASEFF ) |
| 511 | // ROM_REGION( 0x8000, "spr_gfx", ROMREGION_ERASEFF ) |
| 432 | 512 | |
| 433 | 513 | ROM_END |
| 434 | 514 | |