Previous 15994 Revisions Next

r6873 Saturday 2nd January, 2010 at 17:10:56 UTC by Angelo Salese
[ACAN]: Implemented Sprite DMA
[src/mess/drivers]supracan.c

src/mess/drivers/supracan.c
r6872r6873
3030static UINT16 *supracan_soundram_16;
3131static UINT16 supracan_video_regs[256];
3232static emu_timer *supracan_video_timer;
33static UINT16 *supracan_charram, *supracan_sprcharram;
33static UINT16 *supracan_charram;
3434static UINT16 *supracan_vram;
3535static UINT16 *supracan_rram;
3636static UINT16 *supracan_rozpal;
r6872r6873
123123
124124static _acan_dma_regs_t acan_dma_regs;
125125
126typedef struct
127{
128   UINT32 src;
129   UINT32 dst;
130   UINT16 count;
131   UINT16 control;
132} _acan_sprdma_regs_t;
133
134static _acan_sprdma_regs_t acan_sprdma_regs;
135
136
126137static WRITE16_HANDLER( supracan_dma_w )
127138{
128139   int i;
140
129141   switch(offset)
130142   {
131143      case 0x00/2: // Source address MSW
r6872r6873
156168            for(i = 0; i <= acan_dma_regs.count; i++)
157169            {
158170               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               }
160176               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               }
162182            }
163183         }
164184         else
r6872r6873
169189   }
170190}
171191
192#if 0
172193static WRITE16_HANDLER( supracan_sprchar_w )
173194{
174195   COMBINE_DATA(&supracan_sprcharram[offset]);
r6872r6873
179200      gfx[offset*2+0] = (supracan_sprcharram[offset] & 0xff00) >> 8;
180201      gfx[offset*2+1] = (supracan_sprcharram[offset] & 0x00ff) >> 0;
181202
182      gfx_element_mark_dirty(space->machine->gfx[1], offset/32);
203      gfx_element_mark_dirty(space->machine->gfx[1], offset/16);
204
183205   }
184206}
207#endif
185208
186209static ADDRESS_MAP_START( supracan_mem, ADDRESS_SPACE_PROGRAM, 16 )
187210   AM_RANGE( 0x000000, 0x07ffff ) AM_ROM AM_REGION( "cart", 0 )
r6872r6873
198221   AM_RANGE( 0xf44200, 0xf443ff ) AM_RAM AM_BASE(&supracan_vram)   /* Foreground tilemap layer */
199222   AM_RANGE( 0xf44400, 0xf445ff ) AM_RAM AM_BASE(&supracan_rram)   /* ROZ layer tiles */
200223   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 */
202227   AM_RANGE( 0xff8000, 0xffffff ) AM_RAM   /* System work ram */
203228ADDRESS_MAP_END
204229
r6872r6873
218243      gfx[offset*2+0] = (supracan_charram[offset] & 0xff00) >> 8;
219244      gfx[offset*2+1] = (supracan_charram[offset] & 0x00ff) >> 0;
220245
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);
222248   }
223249}
224250
r6872r6873
296322      case 0: // VBlank flag
297323         break;
298324      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);
300326         break;
301327   }
302328
r6872r6873
321347   timer_adjust_oneshot( supracan_video_timer, video_screen_get_time_until_pos( machine->primary_screen, ( vpos + 1 ) & 0xff, 0 ), 0 );
322348}
323349
350/*
3510x188/0x18a is global x/y offset for the roz?
324352
353f00018 is src
354f00012 is dst
355f0001c / f00016 are flags of some sort
356f00010 is the size
357f0001e is the trigger
358*/
325359static WRITE16_HANDLER( supracan_video_w )
326360{
361   int i;
362
327363   switch(offset)
328364   {
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;
329409      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);
331411         break;
332412   }
333413   supracan_video_regs[offset] = data;
r6872r6873
391471
392472static GFXDECODE_START( supracan )
393473   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 )
395475GFXDECODE_END
396476
397477static MACHINE_DRIVER_START( supracan )
r6872r6873
428508
429509   ROM_REGION( 0x4000, "ram_gfx", ROMREGION_ERASEFF )
430510
431   ROM_REGION( 0x8000, "spr_gfx", ROMREGION_ERASEFF )
511//   ROM_REGION( 0x8000, "spr_gfx", ROMREGION_ERASEFF )
432512
433513ROM_END
434514

Previous 15994 Revisions Next


© 1998-2018 The MESS Team