Previous 15994 Revisions Next

r8764 Thursday 12th August, 2010 at 10:00:41 UTC by MooglyGuy
Massive Super A'Can re-write using the pre-existing driver as a base:
- Issue: Sprites are wrong. Harmony is looking into it.
- Added sprite masking.
- Added scanline-based tilemap rendering.
- Began implementing sound CPU comms, currently disabled behind a #define.
- Added scanline-based IRQ triggering, possibly still wrong.
- Corrected off-by-one in sprite DMA.
- Brought rendering entirely into the driver by eliminating drawgfx calls.
[src/mess/drivers]supracan.c

src/mess/drivers/supracan.c
r8763r8764
11/***************************************************************************
22
3Skeleton driver file for Super A'Can console.
43
5The system unit contains a reset button.
4    Funtech Super A'Can
5    -------------------
66
7Controllers:
8- 4 directional buttons
9- A, B, X, Y, buttons
10- Start, select buttons
11- L, R shoulder buttons
7    Preliminary driver by Angelo Salese
8    Improvements by Harmony
129
13f00000 - bit 15 is probably vblank bit.
1410
15Known unemulated graphical effects:
16- The green blob of the A'Can logo should slide out from beneath the word
17  "A'Can";
18- Unemulated 1bpp ROZ mode, used by the Super A'Can BIOS logo;
19- Priorities;
20- Boom Zoo: missing window effect applied on sprites;
21- C.U.G.: gameplay backgrounds are broken (wrong tile bank);
22- C.U.G.: roz paging is wrong;
23- Sango Fighter: Missing rowscroll effect;
24- Sango Fighter: sprites have some bad gaps of black;
25- Sango Fighter: Missing black masking on the top-down edges of the screen on gameplay?
26- Sango Fighter: intro looks bogus, dunno what's supposed to draw...
27- Speedy Dragon: backgrounds are broken (wrong tile bank)
28- Super Taiwanese Baseball League: Missing window effect applied on a tilemap;
29- Super Taiwanese Baseball League: Unemulated paging mode;
30- Super Dragon Force: priority issues with the text;
31- Super Dragon Force: wrong ysize on character select screen;
32- The Son of Evil: has problems with irq mask
33- The Son of Evil: has many gfx artifacts
11*******************************************************************************
3412
35baseball game debug trick:
36wpset e90020,1f,w
37do pc=5ac40
38...
39do pc=5acd4
40wpclear
41bp 0269E4
42[ff7be4] <- 0x269ec
43bpclear
13INFO:
4414
45Sound notes:
15    The system unit contains a reset button.
4616
47There are 6 interrupt sources on the 6502 side, all of which use the IRQ line.
48The register at 0x411 is bitmapped to indicate what source(s) are active.
49In priority order from most to least important, they are:
17    Controllers:
18    - 4 directional buttons
19    - A, B, X, Y, buttons
20    - Start, select buttons
21    - L, R shoulder buttons
5022
51411 value  How acked                     Notes
520x40       read reg 0x16 of sound chip   likely timer. snd regs 0x16/0x17 are time constant, write 0 to reg 0x9f to start
530x04       read at 0x405                 latch 1?  0xcd is magic value
540x08       read at 0x404                 latch 2?  0xcd is magic value
550x10       read at 0x409                 unknown, dispatched but not used in startup 6502 code
560x20       read at 0x40a                 possible periodic like vblank?
570x80       read reg 0x14 of sound chip   depends on reg 0x14 of sound chip & 0x40: if not set writes 0x8f to reg 0x14,
58                                         otherwise writes 0x4f to reg 0x14 and performs additional processing
23STATUS:
5924
25    The driver is begging for a re-write or at least a split into video/supracan.c.  It will happen eventually.
26
27    Sound CPU comms and sound chip are completely unknown.
28
29    There are 6 interrupt sources on the 6502 side, all of which use the IRQ line.
30    The register at 0x411 is bitmapped to indicate what source(s) are active.
31    In priority order from most to least important, they are:
32
33    411 value  How acked                     Notes
34    0x40       read reg 0x16 of sound chip   likely timer. snd regs 0x16/0x17 are time constant, write 0 to reg 0x9f to start
35    0x04       read at 0x405                 latch 1?  0xcd is magic value
36    0x08       read at 0x404                 latch 2?  0xcd is magic value
37    0x10       read at 0x409                 unknown, dispatched but not used in startup 6502 code
38    0x20       read at 0x40a                 possible periodic like vblank?
39    0x80       read reg 0x14 of sound chip   depends on reg 0x14 of sound chip & 0x40: if not set writes 0x8f to reg 0x14,
40                                             otherwise writes 0x4f to reg 0x14 and performs additional processing
41
42    Known unemulated graphical effects and issues:
43    - All: Sprites are currently very broken for an unknown reason.
44    - All: Sprite sizing is still imperfect.
45    - All: Sprites need to be converted to use scanline rendering for proper clipping.
46    - All: Improperly-emulated 1bpp ROZ mode, used by the Super A'Can BIOS logo.
47    - All: Unimplemented ROZ scaling tables, used by the Super A'Can BIOS logo and Speedy Dragon intro, among others.
48    - All: Priorities are largely unknown.
49    - C.U.G.: Gameplay backgrounds are broken.
50    - Sango Fighter: Possible missing masking on the upper edges of the screen during gameplay.
51    - Speedy Dragon: Backgrounds are broken (wrong tile bank/region).
52    - Super Taiwanese Baseball League: Does not boot for unknown reasons.
53    - Super Taiwanese Baseball League: Missing window effect applied on tilemaps?
54    - The Son of Evil: Does not boot for unknown reasons.
55    - The Son of Evil: Many graphical issues.
56
57DEBUG TRICKS:
58
59    baseball game debug trick:
60    wpset e90020,1f,w
61    do pc=5ac40
62    ...
63    do pc=5acd4
64    wpclear
65    bp 0269E4
66    [ff7be4] <- 0x269ec
67    bpclear
68
6069***************************************************************************/
6170
6271#include "emu.h"
r8763r8764
6574#include "devices/cartslot.h"
6675#include "debugger.h"
6776
68#define DRAW_DEBUG_ROZ  (0)
77#define SOUNDCPU_BOOT_HACK      (1)
6978
79#define DRAW_DEBUG_ROZ          (0)
80
81#define DRAW_DEBUG_UNK_SPRITE   (0)
82
83#define DEBUG_PRIORITY          (0)
84#define DEBUG_PRIORITY_INDEX    (0) // 0-3
85
86#define VERBOSE_LEVEL   (0)
87
88#define ENABLE_VERBOSE_LOG (0)
89
7090typedef struct _acan_dma_regs_t acan_dma_regs_t;
7191struct _acan_dma_regs_t
7292{
r8763r8764
92112public:
93113   static driver_data_t *alloc(running_machine &machine) { return auto_alloc_clear(&machine, supracan_state(machine)); }
94114
95   supracan_state(running_machine &machine)
96      : driver_data_t(machine) { }
115   supracan_state(running_machine &machine) : driver_data_t(machine)
116    {
117        m6502_reset = 0;
118    }
97119
98120   acan_dma_regs_t acan_dma_regs;
99121   acan_sprdma_regs_t acan_sprdma_regs;
100122
101123   UINT16 m6502_reset;
102124   UINT8 *soundram;
103   UINT16 *soundram_16;
125    UINT8 soundlatch;
126    UINT8 soundcpu_irq_src;
127    UINT8 sound_irq_enable_reg;
128    UINT8 sound_irq_source_reg;
129    UINT8 sound_cpu_68k_irq_reg;
130
104131   emu_timer *video_timer;
132    emu_timer *hbl_timer;
133    emu_timer *line_on_timer;
134    emu_timer *line_off_timer;
105135   UINT16 *vram;
106   UINT16 spr_limit;
107    UINT16 spr_yline;
108   UINT32 spr_base_addr;
109   UINT8 spr_flags;
110   UINT32 tilemap_base_addr[4];
111   int tilemap_scrollx[4],tilemap_scrolly[4];
136    UINT8 bg_color;
137
138    bitmap_t *sprite_final_bitmap;
139    UINT8 sprite_pri[1024*1024];
140    UINT16 sprite_count;
141   UINT32 sprite_base_addr;
142    UINT8 sprite_flags;
143
144    bitmap_t *tilemap_bitmap[3];
145    bitmap_t *tilemap_final_bitmap[3];
146    UINT8 tilemap_pri[3][1024*1024];
147    UINT8 tilemap_final_pri[3][320*240];
148   UINT32 tilemap_base_addr[3];
149   int tilemap_scrollx[3];
150    int tilemap_scrolly[3];
112151   UINT16 video_flags;
113   UINT16 tilemap_flags[4],tilemap_mode[4];
152   UINT16 tilemap_flags[3];
153    UINT16 tilemap_mode[3];
114154   UINT16 irq_mask;
155    UINT16 hbl_mask;
115156
116157    bitmap_t *roz_bitmap;
117158    bitmap_t *roz_final_bitmap;
159    UINT8 roz_pri[1024*1024];
160    UINT8 roz_final_pri[320*240];
118161   UINT32 roz_base_addr;
119162   UINT16 roz_mode;
120163   UINT32 roz_scrollx;
r8763r8764
132175    INT32 roz_cy;
133176
134177   UINT16 video_regs[256];
178
179    bool hack_68k_to_6502_access;
135180};
136181
137static READ16_HANDLER( supracan_unk1_r );
138static WRITE16_HANDLER( supracan_soundram_w );
182static READ16_HANDLER( supracan_68k_soundram_r );
183static WRITE16_HANDLER( supracan_68k_soundram_w );
184static READ16_HANDLER( supracan_sound_r );
139185static WRITE16_HANDLER( supracan_sound_w );
140186static READ16_HANDLER( supracan_video_r );
141187static WRITE16_HANDLER( supracan_video_w );
142static WRITE16_HANDLER( supracan_char_w );
143188
144#define VERBOSE_LEVEL   (99)
145
146#define ENABLE_VERBOSE_LOG (1)
147
148189#if ENABLE_VERBOSE_LOG
149INLINE void verboselog(running_machine *machine, int n_level, const char *s_fmt, ...)
190INLINE void verboselog(const char *tag, running_machine *machine, int n_level, const char *s_fmt, ...)
150191{
151192   if( VERBOSE_LEVEL >= n_level )
152193   {
r8763r8764
155196      va_start( v, s_fmt );
156197      vsprintf( buf, s_fmt, v );
157198      va_end( v );
158      logerror( "%06x: %s", cpu_get_pc(machine->device("maincpu")), buf );
199      logerror( "%06x: %s: %s", cpu_get_pc(machine->device(tag)), tag, buf );
159200   }
160201}
202
161203#else
162#define verboselog(x,y,z,...)
204#define verboselog(w,x,y,z,...)
163205#endif
164206
165207static VIDEO_START( supracan )
166208{
209    // crash debug: printf("A"); fflush(stdout);
167210    supracan_state *state = machine->driver_data<supracan_state>();
168    state->roz_bitmap = auto_bitmap_alloc(machine, 1024, 512, BITMAP_FORMAT_INDEXED16);
169    state->roz_final_bitmap = auto_bitmap_alloc(machine, 1024, 512, BITMAP_FORMAT_INDEXED16);
211    state->roz_bitmap = auto_bitmap_alloc(machine, 1024, 1024, BITMAP_FORMAT_INDEXED16);
212    state->roz_final_bitmap = auto_bitmap_alloc(machine, 320, 240, BITMAP_FORMAT_INDEXED16);
213    state->tilemap_bitmap[0] = auto_bitmap_alloc(machine, 1024, 1024, BITMAP_FORMAT_INDEXED16);
214    state->tilemap_bitmap[1] = auto_bitmap_alloc(machine, 1024, 1024, BITMAP_FORMAT_INDEXED16);
215    state->tilemap_bitmap[2] = auto_bitmap_alloc(machine, 1024, 1024, BITMAP_FORMAT_INDEXED16);
216    state->tilemap_final_bitmap[0] = auto_bitmap_alloc(machine, 320, 240, BITMAP_FORMAT_INDEXED16);
217    state->tilemap_final_bitmap[1] = auto_bitmap_alloc(machine, 320, 240, BITMAP_FORMAT_INDEXED16);
218    state->tilemap_final_bitmap[2] = auto_bitmap_alloc(machine, 320, 240, BITMAP_FORMAT_INDEXED16);
219    state->sprite_final_bitmap = auto_bitmap_alloc(machine, 1024, 1024, BITMAP_FORMAT_INDEXED16);
170220}
171221
172static void draw_tilemap(running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect,int layer)
222static UINT16 fetch_8bpp_tile_pixel(running_machine *machine, int tile, int palette, bool xflip, bool yflip, int x, int y)
173223{
174   supracan_state *state = machine->driver_data<supracan_state>();
224    // crash debug: printf("B"); fflush(stdout);
225    supracan_state *state = machine->driver_data<supracan_state>();
226    UINT16 *supracan_vram = state->vram;
227
228    if(xflip) x = 7 - x;
229    if(yflip) y = 7 - y;
230
231    UINT32 address = (tile * 8 * 8 + y * 8 + x) >> 1;
232    UINT8 shift = (x & 1) ? 0 : 8;
233
234    return (supracan_vram[address] >> shift) & 0x00ff;
235}
236
237static UINT16 fetch_4bpp_tile_pixel(running_machine *machine, int tile, int palette, bool xflip, bool yflip, int x, int y)
238{
239    // crash debug: printf("C"); fflush(stdout);
240    supracan_state *state = machine->driver_data<supracan_state>();
241    UINT16 *supracan_vram = state->vram;
242
243    if(xflip) x = 7 - x;
244    if(yflip) y = 7 - y;
245
246    UINT32 address = (tile * 8 * 4 + y * 4 + (x >> 1)) >> 1;
247    UINT8 shift = (3 - (x & 3)) * 4;
248
249    return (palette << 4) | ((supracan_vram[address] >> shift) & 0x000f);
250}
251
252static UINT16 fetch_2bpp_tile_pixel(running_machine *machine, int tile, int palette, bool xflip, bool yflip, int x, int y)
253{
254    // crash debug: printf("D"); fflush(stdout);
255    supracan_state *state = machine->driver_data<supracan_state>();
256    UINT16 *supracan_vram = state->vram;
257
258    if(xflip) x = 7 - x;
259    if(yflip) y = 7 - y;
260
261    UINT32 address = (tile * 8 * 2 + y * 2 + (x >> 2)) >> 1;
262    UINT8 shift = (7 - (x & 7)) * 2;
263
264    return (palette << 2) | ((supracan_vram[address] >> shift) & 0x0003);
265}
266
267static void draw_tile(running_machine *machine, UINT8* primap, bitmap_t *bitmap, const rectangle *cliprect, int tile, int palette, bool xflip, bool yflip, int x, int y, int priority, int depth, int mask)
268{
269    // crash debug: printf("E"); fflush(stdout);
270    for(int tiley = 0; tiley < 8; tiley++)
271    {
272        for(int tilex = 0; tilex < 8; tilex++)
273        {
274            UINT16 pixel = 0;
275            switch(depth)
276            {
277                case 0: // 8bpp
278                    pixel = fetch_8bpp_tile_pixel(machine, tile, palette, xflip, yflip, tilex, tiley);
279                    break;
280                case 1: // 4bpp
281                    pixel = fetch_4bpp_tile_pixel(machine, tile, palette, xflip, yflip, tilex, tiley);
282                    if((pixel & 0x0f) == 0)
283                    {
284                        pixel = 0;
285                    }
286                    break;
287                case 2: // 2bpp
288                    pixel = fetch_2bpp_tile_pixel(machine, tile, palette, xflip, yflip, tilex, tiley);
289                    if((pixel & 0x03) == 0)
290                    {
291                        pixel = 0;
292                    }
293                    break;
294                default:
295                    fatalerror("Unsupported bit depth for draw_tile\n");
296                    break;
297            }
298
299            int total_x = x + tilex;
300            int total_y = y + tiley;
301            if((cliprect != NULL && total_x >= cliprect->min_x && total_y >= cliprect->min_y && total_x < cliprect->max_x && total_y < cliprect->max_y) || cliprect == NULL)
302            {
303                if(pixel)
304                {
305                    switch(mask)
306                    {
307                        case 0: // Default
308                            *BITMAP_ADDR16(bitmap, total_y, total_x) = pixel;
309                            primap[total_y*1024 + total_x] = (UINT8)priority;
310                            break;
311                        case 1: // Mask against previous alpha
312                            if(*BITMAP_ADDR16(bitmap, total_y, total_x) & 0x8000)
313                            {
314                                *BITMAP_ADDR16(bitmap, total_y, total_x) = pixel | 0x8000;
315                                primap[total_y*1024 + total_x] = (UINT8)priority;
316                            }
317                            break;
318                        case 2: // Write to alpha
319                            *BITMAP_ADDR16(bitmap, total_y, total_x) |= 0x8000;
320                            break;
321                        case 3: // Clear mask
322                            *BITMAP_ADDR16(bitmap, total_y, total_x) &= 0x7fff;
323                            break;
324                    }
325                }
326            }
327        }
328    }
329}
330
331static void draw_tilemap_scanline(running_machine *machine, UINT16 *scanline, UINT8 *priline, int ypos, int layer)
332{
333    supracan_state *state = machine->driver_data<supracan_state>();
334
335    if((!(state->video_flags & 0x80) && layer == 0) ||
336       (!(state->video_flags & 0x40) && layer == 1) ||
337       (!(state->video_flags & 0x20) && layer == 2))
338    {
339        for(int x = 0; x < 320; x++)
340        {
341            priline[x] = 8;
342            scanline[x] = 0;
343        }
344        return;
345    }
346
347    int width = 32;
348    int height = 32;
349    switch(state->tilemap_flags[layer] & 0x0f00)
350    {
351        case 0x600:
352            width = 64;
353            break;
354
355        case 0xa00:
356            width = 128;
357            break;
358
359        case 0xc00:
360            width = 64;
361            height = 64;
362            break;
363
364        default:
365            //verboselog("maincpu", machine, 0, "Unsupported tilemap size: %04x\n", state->tilemap_flags[layer] & 0x0f00);
366            break;
367    }
368
369    int scrollx = state->tilemap_scrollx[layer];
370    int scrolly = state->tilemap_scrolly[layer];
371    scrollx |= (scrollx & 0x800) ? 0xfffff000 : 0;
372    scrolly |= (scrolly & 0x800) ? 0xfffff000 : 0;
373
374    int gfx_mode = (state->tilemap_mode[layer] & 0x7000) >> 12;
375
376    int region = 1;
377    UINT16 tile_bank = 0;
378    UINT16 palette_bank = 0;
379    switch(gfx_mode)
380    {
381        case 7:
382            region = 2;
383            tile_bank = 0x1c00;
384            palette_bank = 0x00;
385            break;
386
387        case 4:
388            region = 1;
389            tile_bank = 0x800;
390            palette_bank = 0x00;
391            break;
392
393        case 2:
394            region = 1;
395            tile_bank = 0x400;
396            palette_bank = 0x00;
397            break;
398
399        case 0:
400            region = 1;
401            tile_bank = 0;
402            palette_bank = 0x00;
403            break;
404
405        default:
406            verboselog("maincpu", machine, 0, "Unsupported tilemap mode: %d\n", (state->tilemap_flags[layer] & 0x7000) >> 12);
407            break;
408    }
409
410    int wrapped_x = scrollx;
411    int wrapped_y = ypos + scrolly;
412
413    if(state->tilemap_flags[layer] & 0x20)
414    {
415        while(wrapped_y >= height*8) wrapped_y -= height*8;
416        while(wrapped_y < 0) wrapped_y += height*8;
417    }
418    else
419    {
420        if(wrapped_y < 0 || wrapped_y >= height*8)
421        {
422            for(int x = 0; x < 320; x++)
423            {
424                scanline[x] = 0;
425                priline[x] = 8;
426            }
427            return;
428        }
429    }
430
431    UINT16 *src = BITMAP_ADDR16(state->tilemap_bitmap[layer], wrapped_y, 0);
432    UINT8 *srcpri = &state->tilemap_pri[layer][1024*wrapped_y];
433
434    if(state->tilemap_flags[layer] & 0x20)
435    {
436        while(wrapped_x >= width*8) wrapped_x -= width*8;
437        while(wrapped_x < 0) wrapped_x += width*8;
438
439        for(int x = 0; x < 320; x++)
440        {
441            scanline[x] = src[wrapped_x] ? src[wrapped_x] : scanline[x];
442            priline[x] = src[wrapped_x] ? srcpri[wrapped_x] : 8;
443            wrapped_x++;
444            while(wrapped_x >= width*8) wrapped_x -= width*8;
445        }
446    }
447    else
448    {
449        for(int x = 0; x < 320; x++)
450        {
451            if(wrapped_x >= 0 && wrapped_x < width*8)
452            {
453                scanline[x] = src[wrapped_x] ? src[wrapped_x] : scanline[x];
454                priline[x] = src[wrapped_x] ? srcpri[wrapped_x] : 8;
455            }
456            else
457            {
458                scanline[x] = scanline[x];
459                priline[x] = 8;
460            }
461            wrapped_x++;
462        }
463    }
464}
465
466static void draw_tilemap(running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect, int layer)
467{
468    /*crash debug: printf("F"); fflush(stdout); */
469    supracan_state *state = machine->driver_data<supracan_state>();
175470   UINT16 *supracan_vram = state->vram;
176   UINT32 count;
177   int x,y;
178   int scrollx,scrolly;
179   int region;
180   int gfx_mode;
181   int xsize,ysize;
182   UINT16 tile_bank,pal_bank;
183471
184   count = (state->tilemap_base_addr[layer]);
472   UINT32 count = (state->tilemap_base_addr[layer]);
185473
474    int xsize = 32;
475    int ysize = 32;
186476   switch(state->tilemap_flags[layer] & 0x0f00)
187477   {
188      case 0x600: xsize = 64; ysize = 32; break;
189      case 0xa00:   xsize = 128; ysize = 32; break;
190      case 0xc00: xsize = 64; ysize = 64; break;
191      default: xsize = 32; ysize = 32; break;
478      case 0x600:
479            xsize = 64;
480            ysize = 32;
481            break;
482
483        case 0xa00:
484            xsize = 128;
485            ysize = 32;
486            break;
487
488        case 0xc00:
489            xsize = 64;
490            ysize = 64;
491            break;
492
493        default:
494            verboselog("maincpu", machine, 0, "Unsupported tilemap size for layer %d: %04x\n", layer, state->tilemap_flags[layer] & 0x0f00);
495            break;
192496   }
193497
194    scrollx = state->tilemap_scrollx[layer];
195    scrolly = state->tilemap_scrolly[layer];
498    UINT8 priority = ((state->tilemap_flags[layer] >> 12) & 7) + 1;
499
500    int scrollx = state->tilemap_scrollx[layer];
501    int scrolly = state->tilemap_scrolly[layer];
196502    scrollx |= (scrollx & 0x800) ? 0xfffff000 : 0;
197503    scrolly |= (scrolly & 0x800) ? 0xfffff000 : 0;
198504
199   gfx_mode = (state->tilemap_mode[layer] & 0x7000) >> 12;
505   int gfx_mode = (state->tilemap_mode[layer] & 0x7000) >> 12;
200506
507    int region = 1;
508    UINT16 tile_bank = 0;
509    UINT16 palette_bank = 0;
201510   switch(gfx_mode)
202511   {
203      case 7:  region = 2; tile_bank = 0x1c00; pal_bank = 0x00; break;
204      case 4:  region = 1; tile_bank = 0x800;  pal_bank = 0x00; break;
205      case 2:  region = 1; tile_bank = 0x400;  pal_bank = 0x00; break;
206      case 0:  region = 1; tile_bank = 0;      pal_bank = 0x00; break;
207      default: region = 1; tile_bank = 0;      pal_bank = 0x00; break;
512      case 7:
513            region = 2;
514            tile_bank = 0x1c00;
515            palette_bank = 0x00;
516            break;
517
518        case 4:
519            region = 1;
520            tile_bank = 0x800;
521            palette_bank = 0x00;
522            break;
523
524        case 2:
525            region = 1;
526            tile_bank = 0x400;
527            palette_bank = 0x00;
528            break;
529
530        case 0:
531            region = 1;
532            tile_bank = 0;
533            palette_bank = 0x00;
534            break;
535
536        default:
537            verboselog("maincpu", machine, 0, "Unsupported tilemap mode: %d\n", (state->tilemap_flags[layer] & 0x7000) >> 12);
538            break;
208539   }
209540
210   for (y=0;y<ysize;y++)
211   {
212      for (x=0;x<xsize;x++)
213      {
214         int tile, flipx, flipy, pal;
215         tile = (supracan_vram[count] & 0x03ff) + tile_bank;
216         flipx = (supracan_vram[count] & 0x0800) ? 1 : 0;
217         flipy = (supracan_vram[count] & 0x0400) ? 1 : 0;
218         pal = ((supracan_vram[count] & 0xf000) >> 12) + pal_bank;
541    if(state->tilemap_flags[layer] & 0x20)
542    {
543        bitmap_fill(state->tilemap_bitmap[layer], NULL, 0);
219544
220         drawgfx_transpen(bitmap,cliprect,machine->gfx[region],tile,pal,flipx,flipy,(x*8)-scrollx,(y*8)-scrolly,0);
221         if(state->tilemap_flags[layer] & 0x20) //wrap-around enable
222         {
223            drawgfx_transpen(bitmap,cliprect,machine->gfx[region],tile,pal,flipx,flipy,(x*8)-scrollx+xsize*8,(y*8)-scrolly,0);
224            drawgfx_transpen(bitmap,cliprect,machine->gfx[region],tile,pal,flipx,flipy,(x*8)-scrollx,(y*8)-scrolly+ysize*8,0);
225            drawgfx_transpen(bitmap,cliprect,machine->gfx[region],tile,pal,flipx,flipy,(x*8)-scrollx+xsize*8,(y*8)-scrolly+ysize*8,0);
226            drawgfx_transpen(bitmap,cliprect,machine->gfx[region],tile,pal,flipx,flipy,(x*8)-scrollx-xsize*8,(y*8)-scrolly,0);
227            drawgfx_transpen(bitmap,cliprect,machine->gfx[region],tile,pal,flipx,flipy,(x*8)-scrollx,(y*8)-scrolly-ysize*8,0);
228            drawgfx_transpen(bitmap,cliprect,machine->gfx[region],tile,pal,flipx,flipy,(x*8)-scrollx-xsize*8,(y*8)-scrolly-ysize*8,0);
229            drawgfx_transpen(bitmap,cliprect,machine->gfx[region],tile,pal,flipx,flipy,(x*8)-scrollx+xsize*8,(y*8)-scrolly-ysize*8,0);
230            drawgfx_transpen(bitmap,cliprect,machine->gfx[region],tile,pal,flipx,flipy,(x*8)-scrollx-xsize*8,(y*8)-scrolly+ysize*8,0);
231         }
232         count++;
233      }
234   }
545        for(int y = 0; y < ysize; y++)
546        {
547            for(int x = 0; x < xsize; x++)
548            {
549                int tile = (supracan_vram[count] & 0x03ff) + tile_bank;
550                int flipx = (supracan_vram[count] & 0x0800) ? 1 : 0;
551                int flipy = (supracan_vram[count] & 0x0400) ? 1 : 0;
552                int palette = ((supracan_vram[count] & 0xf000) >> 12) + palette_bank;
553
554                draw_tile(machine, state->tilemap_pri[layer], bitmap, NULL, tile, palette, flipx, flipy, x*8, y*8, priority, region, 0);
555
556                count++;
557            }
558        }
559    }
560    else
561    {
562        bitmap_fill(state->tilemap_bitmap[layer], NULL, 0);
563
564        for(int y = 0; y < ysize; y++)
565        {
566            for(int x = 0; x < xsize; x++)
567            {
568                int tile = (supracan_vram[count] & 0x03ff) + tile_bank;
569                int flipx = (supracan_vram[count] & 0x0800) ? 1 : 0;
570                int flipy = (supracan_vram[count] & 0x0400) ? 1 : 0;
571                int palette = ((supracan_vram[count] & 0xf000) >> 12) + palette_bank;
572
573                draw_tile(machine, state->tilemap_pri[layer], bitmap, cliprect, tile, palette, flipx, flipy, x*8/*-scrollx*/, y*8/*-scrolly*/, priority, region, 0);
574
575                count++;
576            }
577        }
578    }
235579}
236580
237/* probably similar to the regular tilemap layers with extra features */
238/* 0x0402 Boom Zoo */
239/* 0x2603 / 0x6623 Super Dragon Force */
240/* 0x4020 BIOS logo */
241/* */
242static void draw_roz_bitmap_scanline(running_machine *machine, bitmap_t *roz_bitmap, UINT16 *scanline, int ypos, INT32 X, INT32 Y, INT32 PA, INT32 PB, INT32 PC, INT32 PD, INT32 *currentx, INT32 *currenty, int changed)
581static void draw_roz_bitmap_scanline(running_machine *machine, bitmap_t *roz_bitmap, UINT16 *scanline, UINT8 *priline, int ypos, INT32 X, INT32 Y, INT32 PA, INT32 PB, INT32 PC, INT32 PD, INT32 *currentx, INT32 *currenty, int changed)
243582{
583    // crash debug: printf("G"); fflush(stdout);
244584    supracan_state *state = machine->driver_data<supracan_state>();
245585
246586    INT32 sx = 0;
r8763r8764
254594        default: sx = 32*8; sy = 32*8; break;
255595    }
256596
597    if((state->roz_mode & 3) == 0)
598    {
599        sx = 64;
600        sy = 32;
601    }
602
257603    if (X & 0x08000000) X |= 0xf0000000;
258604    if (Y & 0x08000000) Y |= 0xf0000000;
259605    if (PA & 0x8000) PA |= 0xffff0000;
r8763r8764
308654            while(pixy >= sy) pixy -= sy;
309655
310656            scanline[x] = *BITMAP_ADDR16(roz_bitmap, pixy, pixx);
657            priline[x] = state->roz_pri[pixy*1024 + pixx];
311658        }
312659        else
313660        {
314661            if(pixx >= 0 && pixy >= 0 && pixx < sx && pixy < sy)
315662            {
316663                scanline[x] = *BITMAP_ADDR16(roz_bitmap, pixy, pixx);
664                priline[x] = state->roz_pri[pixy*1024 + pixx];
317665            }
318666        }
319667
r8763r8764
327675    state->roz_changed = 0;
328676}
329677
678static void draw_roz_bitmap(running_machine *machine, const rectangle *cliprect)
679{
680    // crash debug: printf("H"); fflush(stdout);
681    supracan_state *state = machine->driver_data<supracan_state>();
682    UINT16 *supracan_vram = state->vram;
683    UINT32 addr = state->roz_tile_bank << 1;
684
685    const int ysize = 32;
686    bitmap_t *roz_bitmap = state->roz_bitmap;
687    for (int y = 0; y < ysize; y++)
688    {
689        UINT32 plane_word_msw[2];
690        UINT32 plane_word_lsw[2];
691        plane_word_msw[0] = ((UINT32)supracan_vram[addr + (y * 8) + 0] << 16) | supracan_vram[addr + (y * 8) + 1];
692        plane_word_lsw[0] = ((UINT32)supracan_vram[addr + (y * 8) + 2] << 16) | supracan_vram[addr + (y * 8) + 3];
693        plane_word_msw[1] = ((UINT32)supracan_vram[addr + (y * 8) + 4] << 16) | supracan_vram[addr + (y * 8) + 5];
694        plane_word_lsw[1] = ((UINT32)supracan_vram[addr + (y * 8) + 6] << 16) | supracan_vram[addr + (y * 8) + 7];
695        for (int x = 0; x < 32; x++)
696        {
697            UINT8 bit = BIT(plane_word_msw[0], 31-x);// | BIT(plane_word_msw[1], 31-x);
698            if(bit)
699            {
700                *BITMAP_ADDR16(roz_bitmap, y, x) = bit;
701                state->roz_pri[y*1024 + x] = (state->roz_mode >> 12) & 7;
702            }
703        }
704        for (int x = 0; x < 32; x++)
705        {
706            UINT8 bit = BIT(plane_word_lsw[0], 31-x);// | BIT(plane_word_lsw[1], 31-x)
707            if(bit)
708            {
709                *BITMAP_ADDR16(roz_bitmap, y, x+32) = bit;
710                state->roz_pri[y*1024 + x + 32] = (state->roz_mode >> 12) & 7;
711            }
712        }
713    }
714}
715
330716static void draw_roz(running_machine *machine, const rectangle *cliprect)
331717{
718    // crash debug: printf("I"); fflush(stdout);
332719    supracan_state *state = machine->driver_data<supracan_state>();
333720    UINT16 *supracan_vram = state->vram;
334721    UINT32 roz_base_addr = state->roz_base_addr;
335722    int region = 0;
336723    UINT16 tile_bank = 0;
337//  int gfx_mode;
338724
339725    switch(state->roz_mode & 3) //FIXME: fix gfx bpp order
340726    {
341        case 0: return;//region = 2; tile_bank = (state->roz_tile_bank & 0xf000) >> 3; break;
342        case 1: region = 2; break;
343        case 2: region = 1; tile_bank = (state->roz_tile_bank & 0xf000) >> 3; break;
344        case 3: region = 0; break;
727        case 0:
728            return draw_roz_bitmap(machine, cliprect);
729
730        case 1:
731            region = 2;
732            tile_bank = (state->roz_tile_bank & 0xf000) >> 3;
733            break;
734
735        case 2:
736            region = 1;
737            tile_bank = (state->roz_tile_bank & 0xf000) >> 3;
738            break;
739
740        case 3:
741            region = 0;
742            tile_bank = (state->roz_tile_bank & 0xf000) >> 3;
743            break;
345744    }
346745
347746    int xsize = 32;
348747    int ysize = 32;
349748    switch(state->roz_mode & 0x0f00)
350749    {
351        case 0x600: xsize = 64; ysize = 32; break;
352        case 0xa00: xsize = 128; ysize = 32; break;
353        case 0xc00: xsize = 64; ysize = 64; break;
354        default: xsize = 32; ysize = 32; break;
750        case 0x600:
751            xsize = 64;
752            ysize = 32;
753            break;
754
755        case 0xa00:
756            xsize = 128;
757            ysize = 32;
758            break;
759
760        case 0xc00:
761            xsize = 64;
762            ysize = 64;
763            break;
764
765        default:
766            xsize = 32;
767            ysize = 32;
768            break;
355769    }
356770
357    UINT32 count = (0);
771    UINT32 count = 0;
772    UINT8 priority = ((state->roz_mode >> 12) & 7) + 1;
358773
359774    bitmap_t *roz_bitmap = state->roz_bitmap;
360775    for (int y = 0; y < ysize; y++)
361776    {
362777        for (int x = 0; x < xsize; x++)
363778        {
364            int tile, flipx, flipy, pal;
365            tile = (supracan_vram[roz_base_addr | (count & 0xfff)] & 0x03ff) | tile_bank;
366            flipx = (supracan_vram[roz_base_addr | (count & 0xfff)] & 0x0800) ? 1 : 0;
367            flipy = (supracan_vram[roz_base_addr | (count & 0xfff)] & 0x0400) ? 1 : 0;
368            pal = (supracan_vram[roz_base_addr | (count & 0xfff)] & 0xf000) >> 12;
779            int tile = (supracan_vram[roz_base_addr | (count & 0xfff)] & 0x03ff) | tile_bank;
780            bool flipx = (supracan_vram[roz_base_addr | (count & 0xfff)] & 0x0800) ? true : false;
781            bool flipy = (supracan_vram[roz_base_addr | (count & 0xfff)] & 0x0400) ? true : false;
782            int palette = (supracan_vram[roz_base_addr | (count & 0xfff)] & 0xf000) >> 12;
369783
370            drawgfx_transpen(roz_bitmap,NULL,machine->gfx[region],tile,pal,flipx,flipy,(x*8),(y*8),0);
784            draw_tile(machine, state->roz_pri, roz_bitmap, NULL, tile, palette, flipx, flipy, x*8, y*8, priority, region, 0);
371785
372786            count++;
373787        }
r8763r8764
376790
377791static void draw_sprites(running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect)
378792{
379   supracan_state *state = machine->driver_data<supracan_state>();
793    // crash debug: printf("J"); fflush(stdout);
794    supracan_state *state = machine->driver_data<supracan_state>();
380795   UINT16 *supracan_vram = state->vram;
381   int x, y;
382   int xtile, ytile;
383   int xsize, ysize;
384   int bank;
385   int spr_offs;
386   int col;
387   int i;
388   int spr_base;
389   int hflip,vflip;
390   int region;
391   //UINT8 *sprdata = (UINT8*)(&supracan_vram[0x1d000/2]);
392796
393   spr_base = state->spr_base_addr;
394   region = (state->spr_flags & 1) ? 0 : 1; //8bpp : 4bpp
797#if !(DRAW_DEBUG_UNK_SPRITE)
798    int region = (state->sprite_flags & 1) ? 0 : 1; //8bpp : 4bpp
799#endif
395800
396   /*
397        [0]
398        ---h hhh- ---- ---- Y size
399        ---- ---y yyyy yyyy Y offset
400        [1]
401        bbbb ---- ---- ---- sprite offset bank
402        ---- d--- ---- ---- horizontal direction
403        ---- ---- ---- -www X size
404        [2]
405        zzz- ---- ---- ---- X shrinking
406        ---- ---x xxxx xxxx X offset
407        [3]
408        oooo oooo oooo oooo sprite pointer
409    */
801//      [0]
802//      ---h hhh- ---- ---- Y size
803//      ---- ---y yyyy yyyy Y offset
804//      [1]
805//      bbbb ---- ---- ---- sprite offset bank
806//      ---- h--- ---- ---- horizontal flip
807//      ---- -v-- ---- ---- vertical flip
808//      ---- --mm ---- ---- masking
809//      ---- ---- ---- -www X size
810//      [2]
811//      zzz- uuu- ---- ---- unknown
812//      ---- ---x xxxx xxxx X offset
813//      [3]
814//      oooo oooo oooo oooo sprite pointer
410815
411   for(i=spr_base/2;i<(spr_base+(state->spr_limit*8))/2;i+=4)
816    UINT32 start_word = (state->sprite_base_addr >> 1) + 0 * 4;
817    UINT32 end_word = start_word + state->sprite_count * 4;
818    for(int i = start_word; i < end_word; i += 4)
412819   {
413      x = supracan_vram[i+2] & 0x01ff;
414      y = supracan_vram[i+0] & 0x01ff;
415      spr_offs = supracan_vram[i+3] << 2;
416      bank = (supracan_vram[i+1] & 0xf000) >> 12;
417      hflip = (supracan_vram[i+1] & 0x0800) ? 1 : 0;
418      vflip = (supracan_vram[i+1] & 0x0400) ? 1 : 0;
820      int x = supracan_vram[i+2] & 0x01ff;
821      int y = supracan_vram[i+0] & 0x01ff;
822      int sprite_offset = supracan_vram[i+3] << 2;
823      int bank = (supracan_vram[i+1] & 0xf000) >> 12;
824        int mask = (supracan_vram[i+1] & 0x0300) >> 8;
825      bool hflip = (supracan_vram[i+1] & 0x0800) ? true : false;
826      bool vflip = (supracan_vram[i+1] & 0x0400) ? true : false;
827#if !(DRAW_DEBUG_UNK_SPRITE)
828        UINT8 priority = ((supracan_vram[i+0] >> 12) & 7) + 1;
829#endif
830      while(x > cliprect->max_x)
831        {
832         x -= 0x200;
833        }
419834
420      if(x > cliprect->max_x)
421         x-=0x200;
422      if(y > cliprect->max_y)
423         y-=0x200;
835      while(y > cliprect->max_y)
836        {
837         y -= 0x200;
838        }
424839
425840      if(supracan_vram[i+3] != 0)
426841      {
427         xsize = 1 << (supracan_vram[i+1] & 7);
428         ysize = ((supracan_vram[i+0] & 0x1e00) >> 9)+1;
842            int xsize = 1 << (supracan_vram[i+1] & 7);
843            int ysize = ((supracan_vram[i+0] & 0x1e00) >> 9)+1;
844            //int ysize = (((supracan_vram[i+0] & 0x0600) >> 9) + 1) * (1 << ((supracan_vram[i+0] & 0x1800) >> 11));
845            //if(supracan_vram[i+2] & 0x2000) ysize = xsize;
846            //int ysize = ((supracan_vram[i+2] & 0x1e00) >> 9)+1;
429847
430848         if(vflip)
431849         {
432            for(ytile = (ysize - 1); ytile >= 0; ytile--)
850            for(int ytile = (ysize - 1); ytile >= 0; ytile--)
433851            {
434852               if(hflip)
435853               {
436                  for(xtile = (xsize - 1); xtile >= 0; xtile--)
854                  for(int xtile = (xsize - 1); xtile >= 0; xtile--)
437855                  {
438                     UINT16 data = supracan_vram[spr_offs/2+ytile*xsize+xtile];
856                            UINT16 data = supracan_vram[sprite_offset/2+ytile*xsize+xtile];
439857                     int tile = (bank * 0x200) + (data & 0x03ff);
440                     int xflip = (data & 0x0800) ? 0 : 1;
441                     int yflip = (data & 0x0400) ? 0 : 1;
442                     col = (data & 0xf000) >> 12;
443                     drawgfx_transpen(bitmap,cliprect,machine->gfx[region],tile,col,xflip,yflip,x+((xsize - 1) - xtile)*8,y+((ysize - 1) - ytile)*8,0);
858                            bool xflip = (data & 0x0800) ? false : true;
859                            bool yflip = (data & 0x0400) ? false : true;
860                            int palette = (data & 0xf000) >> 12;
861
862#if !(DRAW_DEBUG_UNK_SPRITE)
863                            draw_tile(machine, state->sprite_pri, bitmap, cliprect, tile, palette, xflip, yflip, x+xtile*8, y+ytile*8, priority, region, mask);
864#else
865                            tile = 0;
866                            xflip = false;
867                            yflip = false;
868                            palette = 0;
869                            for(int ypix = 0; ypix < 8; ypix++)
870                            {
871                                for(int xpix = 0; xpix < 8; xpix++)
872                                {
873                                    if((y + ytile*8 + ypix) < 240 &&
874                                       (y + ytile*8 + ypix) >= 0 &&
875                                       (x + xtile*8 + xpix) < 320 &&
876                                       (x + xtile*8 + xpix) >= 0)
877                                    {
878                                        *BITMAP_ADDR16(bitmap, y + ytile*8 + ypix, x + xtile*8 + xpix) = supracan_vram[i+2] >> 9;
879                                    }
880                                }
881                            }
882#endif
444883                  }
445884               }
446885               else
447886               {
448                  for(xtile = 0; xtile < xsize; xtile++)
887                  for(int xtile = 0; xtile < xsize; xtile++)
449888                  {
450                     UINT16 data = supracan_vram[spr_offs/2+ytile*xsize+xtile];
889                            UINT16 data = supracan_vram[sprite_offset/2+ytile*xsize+xtile];
451890                     int tile = (bank * 0x200) + (data & 0x03ff);
452                     int xflip = (data & 0x0800) ? 1 : 0;
453                     int yflip = (data & 0x0400) ? 0 : 1;
454                     col = (data & 0xf000) >> 12;
455                     drawgfx_transpen(bitmap,cliprect,machine->gfx[region],tile,col,xflip,yflip,x+xtile*8,y+((ysize - 1) - ytile)*8,0);
891                            bool xflip = (data & 0x0800) ? true : false;
892                            bool yflip = (data & 0x0400) ? false : true;
893                            int palette = (data & 0xf000) >> 12;
894
895#if !(DRAW_DEBUG_UNK_SPRITE)
896                            draw_tile(machine, state->sprite_pri, bitmap, cliprect, tile, palette, xflip, yflip, x+xtile*8, y+((ysize - 1) - ytile)*8, priority, region, mask);
897#else
898                            tile = 0;
899                            xflip = false;
900                            yflip = false;
901                            palette = 0;
902                            for(int ypix = 0; ypix < 8; ypix++)
903                            {
904                                for(int xpix = 0; xpix < 8; xpix++)
905                                {
906                                    if((y + ytile*8 + ypix) < 240 &&
907                                       (y + ytile*8 + ypix) >= 0 &&
908                                       (x + xtile*8 + xpix) < 320 &&
909                                       (x + xtile*8 + xpix) >= 0)
910                                    {
911                                        *BITMAP_ADDR16(bitmap, y + ytile*8 + ypix, x + xtile*8 + xpix) = supracan_vram[i+2] >> 9;
912                                    }
913                                }
914                            }
915#endif
456916                  }
457917               }
458918            }
459919         }
460920         else
461921         {
462            for(ytile = 0; ytile < ysize; ytile++)
922            for(int ytile = 0; ytile < ysize; ytile++)
463923            {
464924               if(hflip)
465925               {
466                  for(xtile = (xsize - 1); xtile >= 0; xtile--)
926                  for(int xtile = (xsize - 1); xtile >= 0; xtile--)
467927                  {
468                     UINT16 data = supracan_vram[spr_offs/2+ytile*xsize+xtile];
928                            UINT16 data = supracan_vram[sprite_offset/2+ytile*xsize+xtile];
469929                     int tile = (bank * 0x200) + (data & 0x03ff);
470                     int xflip = (data & 0x0800) ? 0 : 1;
471                     int yflip = (data & 0x0400) ? 1 : 0;
472                     col = (data & 0xf000) >> 12;
473                     drawgfx_transpen(bitmap,cliprect,machine->gfx[region],tile,col,xflip,yflip,x+((xsize - 1) - xtile)*8,y+ytile*8,0);
930                            bool xflip = (data & 0x0800) ? false : true;
931                            bool yflip = (data & 0x0400) ? true : false;
932                            int palette = (data & 0xf000) >> 12;
933
934#if !(DRAW_DEBUG_UNK_SPRITE)
935                            draw_tile(machine, state->sprite_pri, bitmap, cliprect, tile, palette, xflip, yflip, x+((xsize - 1) - xtile)*8, y+ytile*8, priority, region, mask);
936#else
937                            tile = 0;
938                            xflip = false;
939                            yflip = false;
940                            palette = 0;
941                            for(int ypix = 0; ypix < 8; ypix++)
942                            {
943                                for(int xpix = 0; xpix < 8; xpix++)
944                                {
945                                    if((y + ytile*8 + ypix) < 240 &&
946                                       (y + ytile*8 + ypix) >= 0 &&
947                                       (x + xtile*8 + xpix) < 320 &&
948                                       (x + xtile*8 + xpix) >= 0)
949                                    {
950                                        *BITMAP_ADDR16(bitmap, y + ytile*8 + ypix, x + xtile*8 + xpix) = supracan_vram[i+2] >> 9;
951                                    }
952                                }
953                            }
954#endif
474955                  }
475956               }
476957               else
477958               {
478                  for(xtile = 0; xtile < xsize; xtile++)
959                  for(int xtile = 0; xtile < xsize; xtile++)
479960                  {
480                     UINT16 data = supracan_vram[spr_offs/2+ytile*xsize+xtile];
961                            UINT16 data = supracan_vram[sprite_offset/2+ytile*xsize+xtile];
481962                     int tile = (bank * 0x200) + (data & 0x03ff);
482                     int xflip = (data & 0x0800) ? 1 : 0;
483                     int yflip = (data & 0x0400) ? 1 : 0;
484                     col = (data & 0xf000) >> 12;
485                     drawgfx_transpen(bitmap,cliprect,machine->gfx[region],tile,col,xflip,yflip,x+xtile*8,y+ytile*8,0);
963                            bool xflip = (data & 0x0800) ? true : false;
964                            bool yflip = (data & 0x0400) ? true : false;
965                            int palette = (data & 0xf000) >> 12;
966
967#if !(DRAW_DEBUG_UNK_SPRITE)
968                            draw_tile(machine, state->sprite_pri, bitmap, cliprect, tile, palette, xflip, yflip, x + xtile * 8, y + ytile * 8, priority, region, mask);
969#else
970                            tile = 0;
971                            xflip = false;
972                            yflip = false;
973                            palette = 0;
974                            for(int ypix = 0; ypix < 8; ypix++)
975                            {
976                                for(int xpix = 0; xpix < 8; xpix++)
977                                {
978                                    if((y + ytile*8 + ypix) < 240 &&
979                                       (y + ytile*8 + ypix) >= 0 &&
980                                       (x + xtile*8 + xpix) < 320 &&
981                                       (x + xtile*8 + xpix) >= 0)
982                                    {
983                                        *BITMAP_ADDR16(bitmap, y + ytile*8 + ypix, x + xtile*8 + xpix) = supracan_vram[i+2] >> 9;
984                                    }
985                                }
986                            }
987#endif
486988                  }
487989               }
488990            }
r8763r8764
5051007        INT32 temp = supracan_vram[state->roz_unk_base1 + y*2] << 16;
5061008        temp |= supracan_vram[state->roz_unk_base1 + y*2 + 1];
5071009        x = ((float)temp / 65536.0f) * 128.0f;
508        if(x > -160 && x < 160)
509        {
510            *BITMAP_ADDR16(bitmap, y, (int)x + 160) = 2;
511        }
512
5131010        temp = supracan_vram[state->roz_unk_base2 + y*2] << 16;
5141011        temp |= supracan_vram[state->roz_unk_base2 + y*2 + 1];
515        x = ((float)temp / 65536.0f) * 128.0f;
516        if(x > -160 && x < 160)
1012        float y = ((float)temp / 65536.0f) * 128.0f;
1013        if(x >= -160 && x < 160 && y >= -112 && y < 112)
5171014        {
518            *BITMAP_ADDR16(bitmap, y, (int)x + 160) = 4;
1015            *BITMAP_ADDR16(bitmap, (int)y + 112, (int)x + 160) = 2;
5191016        }
5201017    }
5211018}
r8763r8764
5231020
5241021static VIDEO_UPDATE( supracan )
5251022{
526   supracan_state *state = screen->machine->driver_data<supracan_state>();
1023    // crash debug: printf("K"); fflush(stdout);
1024    supracan_state *state = (supracan_state *)screen->machine->driver_data<supracan_state>();
5271025
528   bitmap_fill(bitmap, cliprect, 0);
1026    bitmap_fill(bitmap, cliprect, state->bg_color);
5291027
530#if 0
531   {
532      count = 0x4400/2;
1028    bitmap_fill(state->sprite_final_bitmap, cliprect, 0);
1029    memset(state->sprite_pri, 8, 1024*1024 * sizeof(UINT8));
5331030
534      for (y=0;y<64;y++)
535      {
536         for (x = 0; x < 64; x += 16)
537         {
538            static UINT16 dot_data;
1031    // VIDEO FLAGS                  ROZ MODE            TILEMAP FLAGS
1032    //
1033    //  Bit                         Bit                 Bit
1034    // 15-9: Unknown                15-13: Priority?    15-13: Priority?
1035    //    8: X ht. (256/320)        12: Unknown         12: Unknown
1036    //    7: Tilemap 0 enable       11-8: Dims          11-8: Dims
1037    //    6: Tilemap 1 enable       7-6: Unknown        7-6: Unknown
1038    //    5: Tilemap 2 enable?      5: Wrap             5: Wrap
1039    //    3: Sprite enable          4-2: Unknown        4-2: Unknown
1040    //    2: ROZ enable             1-0: Bit Depth      1-0: Bit Depth
1041    //  1-0: Unknown
5391042
540            dot_data = supracan_vram[count] ^ 0xffff;
1043    //                      Video Flags                 ROZ Mode                    Tilemap 0   Tilemap 1   Tilemap 2   VF Unk0
1044    // A'Can logo:          120e: 0001 0010 0000 1110   4020: 0100 0000 0010 0000   4620        ----        ----        0x09
1045    // Boomzoo Intro:       9a82: 1001 1010 1000 0010   0402: 0000 0100 0000 0010   6400        6400        4400        0x4d
1046    // Boomzoo Title:       9acc: 1001 1010 1100 1100   0402: 0000 0100 0000 0010   6400        6400        4400        0x4d
1047    // C.U.G. Intro:        11c8: 0001 0001 1100 1000   0402: 0000 0100 0000 0010   2400        4400        6400        0x08
1048    // C.U.G. Title:        11cc: 0001 0001 1100 1100   0602: 0000 0110 0000 0010   2600        4600        ----        0x08
1049    // Speedy Dragon Logo:  0388: 0000 0011 1000 1000   4020: 0100 0000 0010 0000   6c20        6c20        2600        0x01
1050    // Speedy Dragon Title: 038c: 0000 0011 1000 1100   2603: 0010 0110 0000 0011   6c20        2c20        2600        0x01
1051    // Sango Fighter Intro: 03c8: 0000 0011 1100 1000   ----: ---- ---- ---- ----   6c20        4620        ----        0x01
1052    // Sango Fighter Game:  03ce: 0000 0011 1100 1110   0622: 0000 0110 0010 0010   2620        4620        ----        0x01
5411053
542            *BITMAP_ADDR16(bitmap, y, 128+x+ 0) = ((dot_data >> 15) & 0x0001) + 0x20;
543            *BITMAP_ADDR16(bitmap, y, 128+x+ 1) = ((dot_data >> 14) & 0x0001) + 0x20;
544            *BITMAP_ADDR16(bitmap, y, 128+x+ 2) = ((dot_data >> 13) & 0x0001) + 0x20;
545            *BITMAP_ADDR16(bitmap, y, 128+x+ 3) = ((dot_data >> 12) & 0x0001) + 0x20;
546            *BITMAP_ADDR16(bitmap, y, 128+x+ 4) = ((dot_data >> 11) & 0x0001) + 0x20;
547            *BITMAP_ADDR16(bitmap, y, 128+x+ 5) = ((dot_data >> 10) & 0x0001) + 0x20;
548            *BITMAP_ADDR16(bitmap, y, 128+x+ 6) = ((dot_data >>  9) & 0x0001) + 0x20;
549            *BITMAP_ADDR16(bitmap, y, 128+x+ 7) = ((dot_data >>  8) & 0x0001) + 0x20;
550            *BITMAP_ADDR16(bitmap, y, 128+x+ 8) = ((dot_data >>  7) & 0x0001) + 0x20;
551            *BITMAP_ADDR16(bitmap, y, 128+x+ 9) = ((dot_data >>  6) & 0x0001) + 0x20;
552            *BITMAP_ADDR16(bitmap, y, 128+x+10) = ((dot_data >>  5) & 0x0001) + 0x20;
553            *BITMAP_ADDR16(bitmap, y, 128+x+11) = ((dot_data >>  4) & 0x0001) + 0x20;
554            *BITMAP_ADDR16(bitmap, y, 128+x+12) = ((dot_data >>  3) & 0x0001) + 0x20;
555            *BITMAP_ADDR16(bitmap, y, 128+x+13) = ((dot_data >>  2) & 0x0001) + 0x20;
556            *BITMAP_ADDR16(bitmap, y, 128+x+14) = ((dot_data >>  1) & 0x0001) + 0x20;
557            *BITMAP_ADDR16(bitmap, y, 128+x+15) = ((dot_data >>  0) & 0x0001) + 0x20;
558            count++;
559         }
560      }
561   }
562#endif
1054    if(state->video_flags & 0x08)
1055    {
1056        draw_sprites(screen->machine, state->sprite_final_bitmap, cliprect);
1057    }
5631058
564   if(state->video_flags & 0x20) //guess, not tested
565      draw_tilemap(screen->machine,bitmap,cliprect,2);
1059    for(int y = 0; y < 240; y++)
1060    {
1061        for(int x = 0; x < 320; x++)
1062        {
5661063
567    int pri_order[3] = { 0, 0, 0 };
568    int pri_index[3] = { 0, 1, 2 };
1064#if !(DEBUG_PRIORITY)
1065            /* Harmony 7/27: THIS CODE IS KNOWN TO BE COMPLETELY WRONG.  DO NOT USE IT AS-IS IN A STANDALONE EMULATOR. */
1066            int pri_order[3] = { 0, 0, 0 };
1067            bitmap_t *bitmaps[3] = { state->tilemap_final_bitmap[0], state->tilemap_final_bitmap[1], state->tilemap_final_bitmap[2] };
5691068
570    pri_order[0] = state->tilemap_flags[0] >> 13;
571    pri_order[1] = state->tilemap_flags[1] >> 13;
572    pri_order[2] = state->roz_mode >> 13;
1069            pri_order[0] = state->tilemap_final_pri[0][y*320 + x];
1070            pri_order[1] = state->tilemap_final_pri[1][y*320 + x];
1071            pri_order[2] = state->tilemap_final_pri[2][y*320 + x];
5731072
574    // Evil bubble sort, but who cares, it's 3 entries long...
575    for(int i1 = 0; i1 < 3; i1++)
576    {
577        for(int i2 = i1; i2 < 3; i2++)
578        {
579            if(pri_order[i2] > pri_order[i1])
1073            int current_priority = 8;
1074            for(int index = 0; index < 3; index++)
5801075            {
581                int temp = pri_order[i1];
582                pri_order[i1] = pri_order[i2];
583                pri_order[i2] = temp;
1076                UINT16 pixel = *BITMAP_ADDR16(bitmaps[index], y, x) & 0x7fff;
1077                if(pixel)
1078                {
1079                    if(pri_order[index] < current_priority )
1080                    {
1081                        *BITMAP_ADDR16(bitmap, y, x) = pixel;
1082                        current_priority = pri_order[index];
1083                    }
1084                }
1085            }
5841086
585                temp = pri_index[i1];
586                pri_index[i1] = pri_index[i2];
587                pri_index[i2] = temp;
1087            UINT16 pixel = *BITMAP_ADDR16(state->roz_final_bitmap, y, x) & 0x7fff;
1088            if(pixel)
1089            {
1090                *BITMAP_ADDR16(bitmap, y, x) = pixel;
5881091            }
589        }
590    }
5911092
592    for(int index = 0; index < 3; index++)
593    {
594        switch(pri_index[index])
595        {
596            case 0:
597                if(state->video_flags & 0x80)
598                {
599                    draw_tilemap(screen->machine,bitmap,cliprect, 0);
600                }
601                break;
602            case 1:
603                if(state->video_flags & 0x40)
604                {
605                    draw_tilemap(screen->machine,bitmap,cliprect, 1);
606                }
607                break;
608            case 2:
609                copybitmap_trans(bitmap,state->roz_final_bitmap,0,0,0,0,cliprect,0);
610                break;
1093            pixel = *BITMAP_ADDR16(state->sprite_final_bitmap, y, x) & 0x7fff;
1094            if(pixel)
1095            {
1096                *BITMAP_ADDR16(bitmap, y, x) = pixel;
1097            }
1098#else
1099            switch(0)
1100            {
1101                case 0:
1102                    *BITMAP_ADDR16(bitmap, y, x) = state->tilemap_pri[0][1024*y + x] + 2;
1103                    break;
1104                case 1:
1105                    *BITMAP_ADDR16(bitmap, y, x) = state->tilemap_pri[1][1024*y + x] + 2;
1106                    break;
1107                case 2:
1108                    *BITMAP_ADDR16(bitmap, y, x) = state->sprite_pri[1024*y + x] + 2;
1109                    break;
1110                case 3:
1111                    *BITMAP_ADDR16(bitmap, y, x) = state->roz_pri[1024*y + x] + 2;
1112                    break;
1113            }
1114#endif
6111115        }
6121116    }
6131117
614   if(state->video_flags & 8)
615      draw_sprites(screen->machine,bitmap,cliprect);
616
6171118#if DRAW_DEBUG_ROZ
6181119    draw_debug_roz(screen->machine,bitmap);
6191120#endif
r8763r8764
6241125
6251126static WRITE16_HANDLER( supracan_dma_w )
6261127{
627   supracan_state *state = space->machine->driver_data<supracan_state>();
1128    // crash debug: printf("L"); fflush(stdout);
1129    supracan_state *state = (supracan_state *)space->machine->driver_data<supracan_state>();
6281130   acan_dma_regs_t *acan_dma_regs = &state->acan_dma_regs;
629   int i;
630   int ch;
1131    int ch = (offset < 0x10/2) ? 0 : 1;
6311132
632   ch = (offset < 0x10/2) ? 0 : 1;
633
6341133   switch(offset)
6351134   {
6361135      case 0x00/2: // Source address MSW
6371136      case 0x10/2:
1137            verboselog("maincpu", space->machine, 0, "supracan_dma_w: source msw %d: %04x\n", ch, data);
6381138         acan_dma_regs->source[ch] &= 0x0000ffff;
6391139         acan_dma_regs->source[ch] |= data << 16;
6401140         break;
6411141      case 0x02/2: // Source address LSW
6421142      case 0x12/2:
1143            verboselog("maincpu", space->machine, 0, "supracan_dma_w: source lsw %d: %04x\n", ch, data);
6431144         acan_dma_regs->source[ch] &= 0xffff0000;
6441145         acan_dma_regs->source[ch] |= data;
6451146         break;
6461147      case 0x04/2: // Destination address MSW
6471148      case 0x14/2:
1149            verboselog("maincpu", space->machine, 0, "supracan_dma_w: dest msw %d: %04x\n", ch, data);
6481150         acan_dma_regs->dest[ch] &= 0x0000ffff;
6491151         acan_dma_regs->dest[ch] |= data << 16;
6501152         break;
6511153      case 0x06/2: // Destination address LSW
6521154      case 0x16/2:
1155            verboselog("maincpu", space->machine, 0, "supracan_dma_w: dest lsw %d: %04x\n", ch, data);
6531156         acan_dma_regs->dest[ch] &= 0xffff0000;
6541157         acan_dma_regs->dest[ch] |= data;
6551158         break;
6561159      case 0x08/2: // Byte count
6571160      case 0x18/2:
1161            verboselog("maincpu", space->machine, 0, "supracan_dma_w: count %d: %04x\n", ch, data);
6581162         acan_dma_regs->count[ch] = data;
6591163         break;
6601164      case 0x0a/2: // Control
6611165      case 0x1a/2:
662         //if(acan_dma_regs.dest != 0xf00200)
663         //printf("%08x %08x %02x %04x\n",acan_dma_regs->source[ch],acan_dma_regs->dest[ch],acan_dma_regs->count[ch] + 1,data);
1166            verboselog("maincpu", space->machine, 0, "supracan_dma_w: control %d: %04x\n", ch, data);
6641167         if(data & 0x8800)
6651168         {
666            //if(data != 0x9800 && data != 0x8800)
667            //{
668            //  fatalerror("%04x",data);
669            //}
6701169//              if(data & 0x2000)
6711170//                  acan_dma_regs->source-=2;
672            //verboselog(space->machine, 0, "supracan_dma_w: Kicking off a DMA from %08x to %08x, %d bytes (%04x)\n", acan_dma_regs->source[ch], acan_dma_regs->dest[ch], acan_dma_regs->count[ch] + 1, data);
1171            //verboselog("maincpu", space->machine, 0, "supracan_dma_w: Kicking off a DMA from %08x to %08x, %d bytes (%04x)\n", acan_dma_regs->source[ch], acan_dma_regs->dest[ch], acan_dma_regs->count[ch] + 1, data);
6731172
674            for(i = 0; i <= acan_dma_regs->count[ch]; i++)
1173            for(int i = 0; i <= acan_dma_regs->count[ch]; i++)
6751174            {
6761175               if(data & 0x1000)
6771176               {
r8763r8764
6921191         }
6931192         else if(data != 0x0000) // fake DMA, used by C.U.G.
6941193         {
695            verboselog(space->machine, 0, "supracan_dma_w: Unknown DMA kickoff value of %04x (other regs %08x, %08x, %d)\n", data, acan_dma_regs->source[ch], acan_dma_regs->dest[ch], acan_dma_regs->count[ch] + 1);
1194            verboselog("maincpu", space->machine, 0, "supracan_dma_w: Unknown DMA kickoff value of %04x (other regs %08x, %08x, %d)\n", data, acan_dma_regs->source[ch], acan_dma_regs->dest[ch], acan_dma_regs->count[ch] + 1);
6961195            fatalerror("supracan_dma_w: Unknown DMA kickoff value of %04x (other regs %08x, %08x, %d)",data, acan_dma_regs->source[ch], acan_dma_regs->dest[ch], acan_dma_regs->count[ch] + 1);
6971196         }
6981197         break;
1198        default:
1199            verboselog("maincpu", space->machine, 0, "supracan_dma_w: Unknown register: %08x = %04x & %04x\n", 0xe90020 + (offset << 1), data, mem_mask);
1200            break;
6991201   }
7001202}
7011203
r8763r8764
7031205   AM_RANGE( 0x000000, 0x3fffff ) AM_ROM AM_REGION( "cart", 0 )
7041206   AM_RANGE( 0xe80200, 0xe80201 ) AM_READ_PORT("P1")
7051207   AM_RANGE( 0xe80202, 0xe80203 ) AM_READ_PORT("P2")
706//  AM_RANGE( 0xe80204, 0xe80205 ) AM_READ( supracan_unk1_r ) //or'ed with player 2 inputs, why?
7071208   AM_RANGE( 0xe80208, 0xe80209 ) AM_READ_PORT("P3")
7081209   AM_RANGE( 0xe8020c, 0xe8020d ) AM_READ_PORT("P4")
709   AM_RANGE( 0xe80300, 0xe80301 ) AM_READ( supracan_unk1_r )
710   AM_RANGE( 0xe81000, 0xe8ffff ) AM_RAM_WRITE( supracan_soundram_w ) AM_BASE_MEMBER(supracan_state,soundram_16)
711   AM_RANGE( 0xe90000, 0xe9001f ) AM_WRITE( supracan_sound_w )
1210    AM_RANGE( 0xe80000, 0xe8ffff ) AM_READWRITE( supracan_68k_soundram_r, supracan_68k_soundram_w )
1211   AM_RANGE( 0xe90000, 0xe9001f ) AM_READWRITE( supracan_sound_r, supracan_sound_w )
7121212   AM_RANGE( 0xe90020, 0xe9003f ) AM_WRITE( supracan_dma_w )
7131213   AM_RANGE( 0xf00000, 0xf001ff ) AM_READWRITE( supracan_video_r, supracan_video_w )
714   AM_RANGE( 0xf00200, 0xf003ff ) AM_RAM_WRITE(paletteram16_xBBBBBGGGGGRRRRR_word_w) AM_BASE_GENERIC(paletteram)
715   AM_RANGE( 0xf40000, 0xf5ffff ) AM_RAM_WRITE(supracan_char_w) AM_BASE_MEMBER(supracan_state,vram)   /* Unknown, some data gets copied here during boot */
716//  AM_RANGE( 0xf44000, 0xf441ff ) AM_RAM AM_BASE_MEMBER(supracan_state,rozpal) /* clut data for the ROZ? */
717//  AM_RANGE( 0xf44600, 0xf44fff ) AM_RAM   /* Unknown, stuff gets written here. Zoom table?? */
718   AM_RANGE( 0xfc0000, 0xfcffff ) AM_MIRROR(0x30000) AM_RAM /* System work ram */
1214    AM_RANGE( 0xf00200, 0xf003ff ) AM_RAM_WRITE(paletteram16_xBBBBBGGGGGRRRRR_word_w) AM_BASE_GENERIC(paletteram)
1215   AM_RANGE( 0xf40000, 0xf5ffff ) AM_RAM AM_BASE_MEMBER(supracan_state,vram)
1216   AM_RANGE( 0xfc0000, 0xfdffff ) AM_MIRROR(0x30000) AM_RAM /* System work ram */
7191217ADDRESS_MAP_END
7201218
1219static READ8_HANDLER( supracan_6502_soundmem_r )
1220{
1221    // crash debug: printf("M"); fflush(stdout);
1222    supracan_state *state = (supracan_state *)space->machine->driver_data<supracan_state>();
1223    UINT8 data = state->soundram[offset];
7211224
722static ADDRESS_MAP_START( supracan_sound_mem, ADDRESS_SPACE_PROGRAM, 8 )
723   AM_RANGE( 0x0000, 0x03ff ) AM_RAM
724   AM_RANGE( 0x0411, 0x0411 ) AM_READ(soundlatch_r)
725   AM_RANGE( 0x0420, 0x0420 ) AM_READNOP //AM_READ(status)
726   AM_RANGE( 0x0420, 0x0420 ) AM_WRITENOP //AM_WRITE(data)
727   AM_RANGE( 0x0422, 0x0422 ) AM_WRITENOP //AM_WRITE(address)
728   AM_RANGE( 0x1000, 0xffff ) AM_RAM AM_BASE_MEMBER(supracan_state,soundram )
729ADDRESS_MAP_END
1225    switch(offset)
1226    {
1227#if SOUNDCPU_BOOT_HACK
1228        case 0x300: // HACK to make games think the sound CPU is always reporting 'OK'.
1229            return 0xff;
1230#endif
7301231
731static WRITE16_HANDLER( supracan_char_w )
732{
733   supracan_state *state = space->machine->driver_data<supracan_state>();
734   UINT16 *supracan_vram = state->vram;
1232        case 0x410: // Sound IRQ enable
1233            data = state->sound_irq_enable_reg;
1234            if(!space->debugger_access) verboselog(state->hack_68k_to_6502_access ? "maincpu" : "soundcpu", space->machine, 0, "supracan_soundreg_r: IRQ enable: %04x\n", data);
1235            if(!space->debugger_access)
1236            {
1237                if(state->sound_irq_enable_reg & state->sound_irq_source_reg)
1238                {
1239                    cpu_set_input_line(space->machine->device("soundcpu"), 0, ASSERT_LINE);
1240                }
1241                else
1242                {
1243                    cpu_set_input_line(space->machine->device("soundcpu"), 0, CLEAR_LINE);
1244                }
1245            }
1246            break;
1247        case 0x411: // Sound IRQ source
1248            data = state->sound_irq_source_reg;
1249            state->sound_irq_source_reg = 0;
1250            if(!space->debugger_access) verboselog(state->hack_68k_to_6502_access ? "maincpu" : "soundcpu", space->machine, 3, "supracan_soundreg_r: IRQ source: %04x\n", data);
1251            if(!space->debugger_access)
1252            {
1253                cpu_set_input_line(space->machine->device("soundcpu"), 0, CLEAR_LINE);
1254            }
1255            break;
1256        case 0x420:
1257            if(!space->debugger_access) verboselog(state->hack_68k_to_6502_access ? "maincpu" : "soundcpu", space->machine, 3, "supracan_soundreg_r: Sound hardware status? (not yet implemented): %02x\n", 0);
1258            break;
1259        case 0x422:
1260            if(!space->debugger_access) verboselog(state->hack_68k_to_6502_access ? "maincpu" : "soundcpu", space->machine, 3, "supracan_soundreg_r: Sound hardware data? (not yet implemented): %02x\n", 0);
1261            break;
1262        case 0x404:
1263        case 0x405:
1264        case 0x409:
1265        case 0x414:
1266        case 0x416:
1267            // Intentional fall-through
1268        default:
1269            if(offset >= 0x300 && offset < 0x500)
1270            {
1271                if(!space->debugger_access) verboselog(state->hack_68k_to_6502_access ? "maincpu" : "soundcpu", space->machine, 0, "supracan_soundreg_r: Unknown register %04x\n", offset);
1272            }
1273            break;
1274    }
7351275
736   COMBINE_DATA(&supracan_vram[offset]);
1276    return data;
1277}
7371278
738   {
739      UINT8 *gfx = memory_region(space->machine, "ram_gfx");
1279static WRITE8_HANDLER( supracan_6502_soundmem_w )
1280{
1281    // crash debug: printf("N"); fflush(stdout);
1282    supracan_state *state = (supracan_state *)space->machine->driver_data<supracan_state>();
7401283
741      gfx[offset*2+0] = (supracan_vram[offset] & 0xff00) >> 8;
742      gfx[offset*2+1] = (supracan_vram[offset] & 0x00ff) >> 0;
743
744      gfx_element_mark_dirty(space->machine->gfx[0], offset/32);
745      gfx_element_mark_dirty(space->machine->gfx[1], offset/16);
746      gfx_element_mark_dirty(space->machine->gfx[2], offset/8);
747   }
1284    switch(offset)
1285    {
1286        case 0x407:
1287            if(state->sound_cpu_68k_irq_reg &~ data)
1288            {
1289                verboselog(state->hack_68k_to_6502_access ? "maincpu" : "soundcpu", space->machine, 0, "supracan_soundreg_w: sound_cpu_68k_irq_reg: %04x: Triggering M68k IRQ\n", data);
1290                cpu_set_input_line(space->machine->device("maincpu"), 7, HOLD_LINE);
1291            }
1292            else
1293            {
1294                verboselog(state->hack_68k_to_6502_access ? "maincpu" : "soundcpu", space->machine, 0, "supracan_soundreg_w: sound_cpu_68k_irq_reg: %04x\n", data);
1295            }
1296            state->sound_cpu_68k_irq_reg = data;
1297            break;
1298        case 0x410:
1299            state->sound_irq_enable_reg = data;
1300            verboselog(state->hack_68k_to_6502_access ? "maincpu" : "soundcpu", space->machine, 0, "supracan_soundreg_w: IRQ enable: %02x\n", data);
1301            break;
1302        case 0x420:
1303            verboselog(state->hack_68k_to_6502_access ? "maincpu" : "soundcpu", space->machine, 3, "supracan_soundreg_w: Sound hardware reg data? (not yet implemented): %02x\n", data);
1304            break;
1305        case 0x422:
1306            verboselog(state->hack_68k_to_6502_access ? "maincpu" : "soundcpu", space->machine, 3, "supracan_soundreg_w: Sound hardware reg addr? (not yet implemented): %02x\n", data);
1307            break;
1308        default:
1309            if(offset >= 0x300 && offset < 0x500)
1310            {
1311                verboselog(state->hack_68k_to_6502_access ? "maincpu" : "soundcpu", space->machine, 0, "supracan_soundreg_w: Unknown register %04x = %02x\n", offset, data);
1312            }
1313            state->soundram[offset] = data;
1314            break;
1315    }
7481316}
7491317
1318static ADDRESS_MAP_START( supracan_sound_mem, ADDRESS_SPACE_PROGRAM, 8 )
1319    AM_RANGE( 0x0000, 0xffff ) AM_READWRITE(supracan_6502_soundmem_r, supracan_6502_soundmem_w) AM_BASE_MEMBER(supracan_state, soundram)
1320ADDRESS_MAP_END
1321
7501322static INPUT_PORTS_START( supracan )
7511323   PORT_START("P1")
7521324   PORT_DIPNAME( 0x01, 0x00, "SYSTEM" )
r8763r8764
8791451}
8801452
8811453
882static WRITE16_HANDLER( supracan_soundram_w )
1454static WRITE16_HANDLER( supracan_68k_soundram_w )
8831455{
884   supracan_state *state = space->machine->driver_data<supracan_state>();
1456    // crash debug: printf("P"); fflush(stdout);
1457    supracan_state *state = (supracan_state *)space->machine->driver_data<supracan_state>();
8851458
886   state->soundram_16[offset] = data;
1459    state->soundram[offset*2 + 1] = data & 0xff;
1460    state->soundram[offset*2 + 0] = data >> 8;
8871461
888   state->soundram[offset*2 + 1] = data & 0xff;
889   state->soundram[offset*2 + 0] = data >> 8;
1462    if(offset*2 < 0x500 && offset*2 >= 0x300)
1463    {
1464        if(mem_mask & 0xff00)
1465        {
1466            state->hack_68k_to_6502_access = true;
1467            supracan_6502_soundmem_w(space, offset*2, data >> 8);
1468            state->hack_68k_to_6502_access = false;
1469        }
1470        if(mem_mask & 0x00ff)
1471        {
1472            state->hack_68k_to_6502_access = true;
1473            supracan_6502_soundmem_w(space, offset*2 + 1, data & 0xff);
1474            state->hack_68k_to_6502_access = false;
1475        }
1476    }
8901477}
8911478
1479static READ16_HANDLER( supracan_68k_soundram_r )
1480{
1481    // crash debug: printf("Q"); fflush(stdout);
1482    supracan_state *state = (supracan_state *)space->machine->driver_data<supracan_state>();
8921483
893static READ16_HANDLER( supracan_unk1_r )
1484    UINT16 val = state->soundram[offset*2 + 0] << 8;
1485    val |= state->soundram[offset*2 + 1];
1486
1487    if(offset*2 >= 0x300 && offset*2 < 0x500)
1488    {
1489        val = 0;
1490        if(mem_mask & 0xff00)
1491        {
1492            state->hack_68k_to_6502_access = true;
1493            val |= supracan_6502_soundmem_r(space, offset*2) << 8;
1494            state->hack_68k_to_6502_access = false;
1495        }
1496        if(mem_mask & 0x00ff)
1497        {
1498            state->hack_68k_to_6502_access = true;
1499            val |= supracan_6502_soundmem_r(space, offset*2 + 1);
1500            state->hack_68k_to_6502_access = false;
1501        }
1502    }
1503
1504    return val;
1505}
1506
1507static READ16_HANDLER( supracan_sound_r )
8941508{
895   /* No idea what hardware this is connected to. */
896   return 0xffff;
1509    // crash debug: printf("R"); fflush(stdout);
1510    //supracan_state *state = (supracan_state *)space->machine->driver_data<supracan_state>();
1511    UINT16 data = 0;
1512
1513    switch( offset )
1514    {
1515        default:
1516            verboselog("maincpu", space->machine, 0, "supracan_sound_r: Unknown register: (%08x) & %04x\n", 0xe90000 + (offset << 1), mem_mask);
1517            break;
1518    }
1519
1520    return data;
8971521}
8981522
899
9001523static WRITE16_HANDLER( supracan_sound_w )
9011524{
902   supracan_state *state = space->machine->driver_data<supracan_state>();
1525    // crash debug: printf("S"); fflush(stdout);
1526    supracan_state *state = (supracan_state *)space->machine->driver_data<supracan_state>();
9031527
9041528   switch ( offset )
9051529   {
906      case 0x000a/2:
907         //soundlatch_w(space, 0, (data & 0xff00) >> 8);
908         //cputag_set_input_line(space->machine, "soundcpu", 0, HOLD_LINE);
909         break;
9101530      case 0x001c/2:   /* Sound cpu control. Bit 0 tied to sound cpu RESET line */
911         if ( data & 0x01 )
1531         if(data & 0x01)
9121532         {
913            if ( ! state->m6502_reset )
1533            if(!state->m6502_reset)
9141534            {
9151535               /* Reset and enable the sound cpu */
916               //cputag_set_input_line(space->machine, "soundcpu", INPUT_LINE_HALT, CLEAR_LINE);
917               //space->machine->device("soundcpu")->reset();
1536                    #if !(SOUNDCPU_BOOT_HACK)
1537               cputag_set_input_line(space->machine, "soundcpu", INPUT_LINE_HALT, CLEAR_LINE);
1538               devtag_get_device(space->machine, "soundcpu")->reset();
1539                    #endif
9181540            }
1541                state->m6502_reset = data & 0x01;
9191542         }
9201543         else
9211544         {
9221545            /* Halt the sound cpu */
9231546            cputag_set_input_line(space->machine, "soundcpu", INPUT_LINE_HALT, ASSERT_LINE);
9241547         }
925         state->m6502_reset = data & 0x01;
1548            verboselog("maincpu", space->machine, 0, "sound cpu ctrl: %04x\n", data);
9261549         break;
9271550      default:
928         //printf("supracan_sound_w: writing %04x to unknown address %08x\n", data, 0xe90000 + offset * 2 );
1551            verboselog("maincpu", space->machine, 0, "supracan_sound_w: Unknown register: %08x = %04x & %04x\n", 0xe90000 + (offset << 1), data, mem_mask);
9291552         break;
9301553   }
9311554}
r8763r8764
9331556
9341557static READ16_HANDLER( supracan_video_r )
9351558{
936   supracan_state *state = space->machine->driver_data<supracan_state>();
1559    // crash debug: printf("T"); fflush(stdout);
1560    supracan_state *state = (supracan_state *)space->machine->driver_data<supracan_state>();
9371561   UINT16 data = state->video_regs[offset];
9381562
9391563   switch(offset)
9401564   {
941      case 0: // VBlank flag
1565      case 0x00/2: // Video IRQ flags
1566            if(!space->debugger_access)
1567            {
1568                cpu_set_input_line(space->machine->device("maincpu"), 7, CLEAR_LINE);
1569            }
9421570         break;
1571        case 0x02/2: // Current scanline
1572            break;
9431573      default:
944         verboselog(space->machine, 0, "supracan_video_r: Unknown register: %08x (%04x & %04x)\n", 0xf00000 + (offset << 1), data, mem_mask);
1574            if(!space->debugger_access) verboselog("maincpu", space->machine, 0, "supracan_video_r: Unknown register: %08x (%04x & %04x)\n", 0xf00000 + (offset << 1), data, mem_mask);
9451575         break;
9461576   }
9471577
9481578   return data;
9491579}
9501580
1581static TIMER_CALLBACK( supracan_hbl_callback )
1582{
1583    // crash debug: printf("U"); fflush(stdout);
1584    supracan_state *state = machine->driver_data<supracan_state>();
9511585
1586    timer_adjust_oneshot(state->hbl_timer, attotime_never, 0);
1587}
1588
1589static TIMER_CALLBACK( supracan_line_on_callback )
1590{
1591    supracan_state *state = machine->driver_data<supracan_state>();
1592
1593    cpu_set_input_line(machine->device("maincpu"), 5, HOLD_LINE);
1594
1595    timer_adjust_oneshot(state->line_on_timer, attotime_never, 0);
1596}
1597
1598static TIMER_CALLBACK( supracan_line_off_callback )
1599{
1600    supracan_state *state = machine->driver_data<supracan_state>();
1601
1602    cpu_set_input_line(machine->device("maincpu"), 5, CLEAR_LINE);
1603
1604    timer_adjust_oneshot(state->line_on_timer, attotime_never, 0);
1605}
1606
9521607static TIMER_CALLBACK( supracan_video_callback )
9531608{
954   supracan_state *state = machine->driver_data<supracan_state>();
1609    // crash debug: printf("V"); fflush(stdout);
1610    supracan_state *state = machine->driver_data<supracan_state>();
9551611   int vpos = machine->primary_screen->vpos();
9561612
1613    state->video_regs[0] &= ~0x0002;
1614
9571615   switch( vpos )
9581616   {
9591617   case 0:
r8763r8764
9611619      break;
9621620   case 240:
9631621      state->video_regs[0] |= 0x8000;
1622        if(state->irq_mask & 1)
1623        {
1624            verboselog("maincpu", machine, 0, "Triggering VBL IRQ\n");
1625            cpu_set_input_line(machine->device("maincpu"), 7, HOLD_LINE);
1626        }
9641627      break;
965   }
1628    }
9661629
1630    state->video_regs[1] = machine->primary_screen->vpos();
1631
9671632    if (vpos == 0)
9681633    {
9691634        bitmap_fill(state->roz_final_bitmap, &machine->primary_screen->visible_area(), 0);
9701635        bitmap_fill(state->roz_bitmap, &machine->primary_screen->visible_area(), 0);
1636        bitmap_fill(state->tilemap_bitmap[0], NULL, 0);
1637        bitmap_fill(state->tilemap_bitmap[1], NULL, 0);
1638        bitmap_fill(state->tilemap_bitmap[2], NULL, 0);
1639        bitmap_fill(state->tilemap_final_bitmap[0], NULL, 0);
1640        bitmap_fill(state->tilemap_final_bitmap[1], NULL, 0);
1641        bitmap_fill(state->tilemap_final_bitmap[2], NULL, 0);
1642        //memset(state->roz_pri, 8, 1024*1024 * sizeof(UINT8) );
1643        //memset(state->tilemap_pri[0], 8, 1024*1024 * sizeof(UINT8));
1644        //memset(state->tilemap_pri[1], 8, 1024*1024 * sizeof(UINT8));
1645        //memset(state->tilemap_pri[2], 8, 1024*1024 * sizeof(UINT8));
1646        //memset(state->tilemap_final_pri[0], 8, 320*240 * sizeof(UINT8));
1647        //memset(state->tilemap_final_pri[1], 8, 320*240 * sizeof(UINT8));
1648        //memset(state->tilemap_final_pri[2], 8, 320*240 * sizeof(UINT8));
9711649        if(state->video_flags & 4)
9721650        {
9731651            draw_roz(machine, &machine->primary_screen->visible_area());
9741652        }
1653
1654        if(state->video_flags & 0x80)
1655        {
1656            draw_tilemap(machine, state->tilemap_bitmap[0], &machine->primary_screen->visible_area(), 0);
1657        }
1658
1659        if(state->video_flags & 0x40)
1660        {
1661            draw_tilemap(machine, state->tilemap_bitmap[1], &machine->primary_screen->visible_area(), 1);
1662        }
1663
1664        if(state->video_flags & 0x20)
1665        {
1666            draw_tilemap(machine, state->tilemap_bitmap[2], &machine->primary_screen->visible_area(), 2);
1667        }
9751668    }
9761669
9771670    if (vpos < 240)
9781671    {
9791672        UINT16 *scandata = BITMAP_ADDR16(state->roz_final_bitmap, vpos, 0);
980        draw_roz_bitmap_scanline(machine, state->roz_bitmap, scandata, vpos, state->roz_scrollx, state->roz_scrolly, state->roz_coeffa, state->roz_coeffb, state->roz_coeffc, state->roz_coeffd, &state->roz_cx, &state->roz_cy, state->roz_changed);
1673        UINT8 *pridata = &state->roz_final_pri[vpos*320];
1674        draw_roz_bitmap_scanline(machine, state->roz_bitmap, scandata, pridata, vpos, state->roz_scrollx, state->roz_scrolly, state->roz_coeffa, state->roz_coeffb, state->roz_coeffc, state->roz_coeffd, &state->roz_cx, &state->roz_cy, state->roz_changed);
1675
1676        for(int index = 0; index < 3; index++)
1677        {
1678            if(state->video_flags & (0x80 >> index) )
1679            {
1680                scandata = BITMAP_ADDR16(state->tilemap_final_bitmap[index], vpos, 0);
1681                pridata = &state->tilemap_final_pri[index][vpos*320];
1682                draw_tilemap_scanline(machine, scandata, pridata, vpos, index);
1683            }
1684        }
9811685    }
9821686
983   timer_adjust_oneshot( state->video_timer, machine->primary_screen->time_until_pos( ( vpos + 1 ) & 0xff, 0 ), 0 );
1687    timer_adjust_oneshot( state->hbl_timer, machine->primary_screen->time_until_pos( vpos, 320 ), 0 );
1688    timer_adjust_oneshot( state->video_timer, machine->primary_screen->time_until_pos( ( vpos + 1 ) % 256, 0 ), 0 );
9841689}
9851690
986/*
9870x188/0x18a is global x/y offset for the roz?
988
989f00018 is src
990f00012 is dst
991f0001c / f00016 are flags of some sort
992f00010 is the size
993f0001e is the trigger
994*/
9951691static WRITE16_HANDLER( supracan_video_w )
9961692{
997   supracan_state *state = space->machine->driver_data<supracan_state>();
1693    // crash debug: printf("W"); fflush(stdout);
1694    supracan_state *state = (supracan_state *)space->machine->driver_data<supracan_state>();
9981695   acan_sprdma_regs_t *acan_sprdma_regs = &state->acan_sprdma_regs;
9991696   int i;
10001697
10011698   switch(offset)
10021699   {
10031700        case 0x10/2: // Byte count
1701            verboselog("maincpu", space->machine, 0, "sprite dma word count: %04x\n", data);
10041702            acan_sprdma_regs->count = data;
10051703            break;
10061704      case 0x12/2: // Destination address MSW
10071705         acan_sprdma_regs->dst &= 0x0000ffff;
10081706         acan_sprdma_regs->dst |= data << 16;
1707            verboselog("maincpu", space->machine, 0, "sprite dma dest msw: %04x\n", data);
10091708         break;
10101709      case 0x14/2: // Destination address LSW
10111710         acan_sprdma_regs->dst &= 0xffff0000;
10121711         acan_sprdma_regs->dst |= data;
1712            verboselog("maincpu", space->machine, 0, "sprite dma dest lsw: %04x\n", data);
10131713         break;
10141714        case 0x16/2: // Source word increment
1715            verboselog("maincpu", space->machine, 0, "sprite dma dest word inc: %04x\n", data);
10151716            acan_sprdma_regs->dst_inc = data;
10161717            break;
10171718        case 0x18/2: // Source address MSW
10181719            acan_sprdma_regs->src &= 0x0000ffff;
10191720            acan_sprdma_regs->src |= data << 16;
1721            verboselog("maincpu", space->machine, 0, "sprite dma src msw: %04x\n", data);
10201722            break;
10211723        case 0x1a/2: // Source address LSW
1724            verboselog("maincpu", space->machine, 0, "sprite dma src lsw: %04x\n", data);
10221725            acan_sprdma_regs->src &= 0xffff0000;
10231726            acan_sprdma_regs->src |= data;
10241727            break;
10251728        case 0x1c/2: // Source word increment
1729            verboselog("maincpu", space->machine, 0, "sprite dma src word inc: %04x\n", data);
10261730            acan_sprdma_regs->src_inc = data;
10271731            break;
10281732      case 0x1e/2:
1029         //printf("* %08x %08x %04x %04x\n",acan_sprdma_regs->src,acan_sprdma_regs->dst,acan_sprdma_regs->count,data);
1030         //verboselog(space->machine, 0, "supracan_dma_w: Kicking off a DMA from %08x to %08x, %d bytes (%04x)\n", acan_sprdma_regs->src, acan_sprdma_regs->dst, acan_sprdma_regs->count + 1, data);
1733         verboselog("maincpu", space->machine, 0, "supracan_dma_w: Kicking off a DMA from %08x to %08x, %d bytes (%04x)\n", acan_sprdma_regs->src, acan_sprdma_regs->dst, acan_sprdma_regs->count, data);
10311734
10321735         /* TODO: what's 0x2000 and 0x4000 for? */
10331736         if(data & 0x8000)
10341737         {
10351738            if(data & 0x2000 || data & 0x4000)
1739                {
10361740               acan_sprdma_regs->dst |= 0xf40000;
1741                }
10371742
1038            for(i = 0; i <= acan_sprdma_regs->count; i++)
1743                if(data & 0x2000)
1744                {
1745                    //acan_sprdma_regs->count <<= 1;
1746                }
1747
1748            for(i = 0; i < acan_sprdma_regs->count; i++)
10391749            {
10401750               if(data & 0x0100) //dma 0x00 fill (or fixed value?)
10411751               {
r8763r8764
10531763         }
10541764         else
10551765         {
1056            // ...
1766                verboselog("maincpu", space->machine, 0, "supracan_dma_w: Attempting to kick off a DMA without bit 15 set! (%04x)\n", data);
10571767         }
10581768         break;
10591769      case 0x08/2:
10601770         {
1061                verboselog(space->machine, 5, "video_flags = %04x\n", data);
1771                verboselog("maincpu", space->machine, 3, "video_flags = %04x\n", data);
10621772                state->video_flags = data;
10631773
10641774                rectangle visarea = space->machine->primary_screen->visible_area();
r8763r8764
10691779            space->machine->primary_screen->configure(348, 256, visarea, space->machine->primary_screen->frame_period().attoseconds);
10701780         }
10711781         break;
1072      case 0x20/2: state->spr_base_addr = data << 2; break;
1073      case 0x22/2: state->spr_limit = data+1; break;
1074        case 0x24/2: state->spr_yline = data; verboselog(space->machine, 0, "spr_yline = %04x\n", data); break;
1075        case 0x26/2: state->spr_flags = data; verboselog(space->machine, 0, "spr_flags = %04x\n", data); break;
1076        case 0x100/2: state->tilemap_flags[0] = data; verboselog(space->machine, 0, "tilemap_flags[0] = %04x\n", data); break;
1077        case 0x104/2: state->tilemap_scrollx[0] = data; verboselog(space->machine, 0, "tilemap_scrollx[0] = %04x\n", data); break;
1078        case 0x106/2: state->tilemap_scrolly[0] = data; verboselog(space->machine, 0, "tilemap_scrolly[0] = %04x\n", data); break;
1079        case 0x108/2: state->tilemap_base_addr[0] = (data) << 1; verboselog(space->machine, 0, "tilemap_base_addr[0] = %05x\n", data << 2); break;
1080        case 0x10a/2: state->tilemap_mode[0] = data; verboselog(space->machine, 0, "tilemap_mode[0] = %04x\n", data); break;
1081        case 0x120/2: state->tilemap_flags[1] = data; verboselog(space->machine, 0, "tilemap_flags[1] = %04x\n", data); break;
1082        case 0x124/2: state->tilemap_scrollx[1] = data; verboselog(space->machine, 0, "tilemap_scrollx[1] = %04x\n", data); break;
1083        case 0x126/2: state->tilemap_scrolly[1] = data; verboselog(space->machine, 0, "tilemap_scrolly[1] = %04x\n", data); break;
1084        case 0x128/2: state->tilemap_base_addr[1] = (data) << 1; verboselog(space->machine, 0, "tilemap_base_addr[1] = %05x\n", data << 2); break;
1085        case 0x12a/2: state->tilemap_mode[1] = data; verboselog(space->machine, 0, "tilemap_mode[1] = %04x\n", data); break;
1086        case 0x140/2: state->tilemap_flags[2] = data; verboselog(space->machine, 0, "tilemap_flags[2] = %04x\n", data); break;
1087        case 0x144/2: state->tilemap_scrollx[2] = data; verboselog(space->machine, 0, "tilemap_scrollx[2] = %04x\n", data); break;
1088        case 0x146/2: state->tilemap_scrolly[2] = data; verboselog(space->machine, 0, "tilemap_scrolly[2] = %04x\n", data); break;
1089        case 0x148/2: state->tilemap_base_addr[2] = (data) << 1; verboselog(space->machine, 0, "tilemap_base_addr[2] = %05x\n", data << 2); verboselog(space->machine, 0, "tilemap_base_addr[2] = %05x\n", data << 1); break;
1090        case 0x14a/2: state->tilemap_mode[2] = data; verboselog(space->machine, 0, "tilemap_mode[2] = %04x\n", data); break;
1782        case 0x0a/2:
1783            {
1784                verboselog("maincpu", space->machine, 0, "IRQ Trigger? = %04x\n", data);
1785                if(data & 0x8000)
1786                {
1787                    timer_adjust_oneshot(state->line_on_timer, space->machine->primary_screen->time_until_pos(data & 0x00ff, 0), 0);
1788                }
1789                else
1790                {
1791                    timer_adjust_oneshot(state->line_on_timer, attotime_never, 0);
1792                }
1793            }
1794            break;
10911795
1092      /* 0x180-0x19f are roz tilemap related regs */
1093        case 0x180/2: state->roz_mode = data; verboselog(space->machine, 5, "roz_mode = %04x\n", data); break;
1796        case 0x0c/2:
1797            {
1798                verboselog("maincpu", space->machine, 0, "IRQ De-Trigger? = %04x\n", data);
1799                if(data & 0x8000)
1800                {
1801                    timer_adjust_oneshot(state->line_off_timer, space->machine->primary_screen->time_until_pos(data & 0x00ff, 0), 0);
1802                }
1803                else
1804                {
1805                    timer_adjust_oneshot(state->line_off_timer, attotime_never, 0);
1806                }
1807            }
1808            break;
1809
1810        /* Sprites */
1811      case 0x20/2: state->sprite_base_addr = data << 2; verboselog("maincpu", space->machine, 0, "sprite_base_addr = %04x\n", data); break;
1812        case 0x22/2: state->sprite_count = data+1; verboselog("maincpu", space->machine, 0, "sprite_count = %d\n", data+1); break;
1813        case 0x26/2: state->sprite_flags = data; verboselog("maincpu", space->machine, 0, "sprite_flags = %04x\n", data); break;
1814
1815        /* Tilemap 0 */
1816        case 0x100/2: state->tilemap_flags[0] = data; verboselog("maincpu", space->machine, 3, "tilemap_flags[0] = %04x\n", data); break;
1817        case 0x104/2: state->tilemap_scrollx[0] = data; verboselog("maincpu", space->machine, 3, "tilemap_scrollx[0] = %04x\n", data); break;
1818        case 0x106/2: state->tilemap_scrolly[0] = data; verboselog("maincpu", space->machine, 3, "tilemap_scrolly[0] = %04x\n", data); break;
1819        case 0x108/2: state->tilemap_base_addr[0] = (data) << 1; verboselog("maincpu", space->machine, 3, "tilemap_base_addr[0] = %05x\n", data << 2); break;
1820        case 0x10a/2: state->tilemap_mode[0] = data; verboselog("maincpu", space->machine, 3, "tilemap_mode[0] = %04x\n", data); break;
1821
1822        /* Tilemap 1 */
1823        case 0x120/2: state->tilemap_flags[1] = data; verboselog("maincpu", space->machine, 3, "tilemap_flags[1] = %04x\n", data); break;
1824        case 0x124/2: state->tilemap_scrollx[1] = data; verboselog("maincpu", space->machine, 3, "tilemap_scrollx[1] = %04x\n", data); break;
1825        case 0x126/2: state->tilemap_scrolly[1] = data; verboselog("maincpu", space->machine, 3, "tilemap_scrolly[1] = %04x\n", data); break;
1826        case 0x128/2: state->tilemap_base_addr[1] = (data) << 1; verboselog("maincpu", space->machine, 3, "tilemap_base_addr[1] = %05x\n", data << 2); break;
1827        case 0x12a/2: state->tilemap_mode[1] = data; verboselog("maincpu", space->machine, 3, "tilemap_mode[1] = %04x\n", data); break;
1828
1829        /* Tilemap 2? */
1830        case 0x140/2: state->tilemap_flags[2] = data; verboselog("maincpu", space->machine, 0, "tilemap_flags[2] = %04x\n", data); break;
1831        case 0x144/2: state->tilemap_scrollx[2] = data; verboselog("maincpu", space->machine, 0, "tilemap_scrollx[2] = %04x\n", data); break;
1832        case 0x146/2: state->tilemap_scrolly[2] = data; verboselog("maincpu", space->machine, 0, "tilemap_scrolly[2] = %04x\n", data); break;
1833        case 0x148/2: state->tilemap_base_addr[2] = (data) << 1; verboselog("maincpu", space->machine, 0, "tilemap_base_addr[2] = %05x\n", data << 2); verboselog("maincpu", space->machine, 0, "tilemap_base_addr[2] = %05x\n", data << 1); break;
1834        case 0x14a/2: state->tilemap_mode[2] = data; verboselog("maincpu", space->machine, 0, "tilemap_mode[2] = %04x\n", data); break;
1835
1836      /* ROZ */
1837        case 0x180/2: state->roz_mode = data; verboselog("maincpu", space->machine, 3, "roz_mode = %04x\n", data); break;
10941838        case 0x184/2: state->roz_scrollx = (data << 16) | (state->roz_scrollx & 0xffff); state->roz_changed |= 1; break;
10951839        case 0x186/2: state->roz_scrollx = (data) | (state->roz_scrollx & 0xffff0000); state->roz_changed |= 1; break;
10961840        case 0x188/2: state->roz_scrolly = (data << 16) | (state->roz_scrolly & 0xffff); state->roz_changed |= 2; break;
r8763r8764
10991843        case 0x18e/2: state->roz_coeffb = data; break;
11001844        case 0x190/2: state->roz_coeffc = data; break;
11011845        case 0x192/2: state->roz_coeffd = data; break;
1102        case 0x194/2: state->roz_base_addr = (data) << 1; verboselog(space->machine, 5, "roz_base_addr = %05x\n", data << 2); break;
1103        case 0x196/2: state->roz_tile_bank = data; verboselog(space->machine, 5, "roz_tile_bank = %04x\n", data); break; //tile bank
1104        case 0x198/2: verboselog(space->machine, 0, "roz_unk_base0 = %05x\n", data << 2); state->roz_unk_base0 = data << 1; break;
1105        case 0x19a/2: verboselog(space->machine, 0, "roz_unk_base1 = %05x\n", data << 2); state->roz_unk_base1 = data << 1; break;
1106        case 0x19e/2: verboselog(space->machine, 0, "roz_unk_base2 = %05x\n", data << 2); state->roz_unk_base2 = data << 1; break;
1846        case 0x194/2: state->roz_base_addr = (data) << 1; verboselog("maincpu", space->machine, 3, "roz_base_addr = %05x\n", data << 2); break;
1847        case 0x196/2: state->roz_tile_bank = data; verboselog("maincpu", space->machine, 3, "roz_tile_bank = %04x\n", data); break; //tile bank
1848        case 0x198/2: state->roz_unk_base0 = data << 1; verboselog("maincpu", space->machine, 3, "roz_unk_base0 = %05x\n", data << 2); break;
1849        case 0x19a/2: state->roz_unk_base1 = data << 1; verboselog("maincpu", space->machine, 3, "roz_unk_base1 = %05x\n", data << 2); break;
1850        case 0x19e/2: state->roz_unk_base2 = data << 1; verboselog("maincpu", space->machine, 3, "roz_unk_base2 = %05x\n", data << 2); break;
11071851
1852        case 0x1d0/2: state->bg_color = data & 0x00ff; verboselog("maincpu", space->machine, 3, "bg_color = %02x\n", data & 0x00ff); break;
1853
11081854      case 0x1f0/2: //FIXME: this register is mostly not understood
1109         state->irq_mask = (data & 8) ? 0 : 1;
1855         state->irq_mask = data;//(data & 8) ? 0 : 1;
1856            /*
1857            if(!state->irq_mask && !state->hbl_mask)
1858            {
1859                cpu_set_input_line(devtag_get_device(space->machine, "maincpu"), 7, CLEAR_LINE);
1860            }
1861            */
1862            verboselog("maincpu", space->machine, 3, "irq_mask = %04x\n", data);
11101863         break;
11111864      default:
1112         verboselog(space->machine, 0, "supracan_video_w: Unknown register: %08x = %04x & %04x\n", 0xf00000 + (offset << 1), data, mem_mask);
1865         verboselog("maincpu", space->machine, 0, "supracan_video_w: Unknown register: %08x = %04x & %04x\n", 0xf00000 + (offset << 1), data, mem_mask);
11131866         break;
11141867   }
11151868   state->video_regs[offset] = data;
r8763r8764
11181871
11191872static DEVICE_IMAGE_LOAD( supracan_cart )
11201873{
1121   UINT8 *cart = memory_region(image.device().machine, "cart");
1874    // crash debug: printf("X"); fflush(stdout);
1875    UINT8 *cart = memory_region(image.device().machine, "cart");
11221876   UINT32 size;
11231877
1124   if (image.software_entry() == NULL)
1878    if (image.software_entry() == NULL)
11251879   {
1126      size = image.length();
1880        size = image.length();
11271881
11281882      if (size > 0x400000)
11291883      {
11301884         image.seterror(IMAGE_ERROR_UNSPECIFIED, "Unsupported cartridge size");
1131         return IMAGE_INIT_FAIL;
1885            return IMAGE_INIT_FAIL;
11321886      }
11331887
1134      if (image.fread( cart, size) != size)
1888      if (image.fread(cart, size) != size)
11351889      {
11361890         image.seterror(IMAGE_ERROR_UNSPECIFIED, "Unable to fully read from file");
1137         return IMAGE_INIT_FAIL;
1891            return IMAGE_INIT_FAIL;
11381892      }
11391893   }
11401894   else
r8763r8764
11431897      memcpy(cart, image.get_software_region("rom"), size);
11441898   }
11451899
1146   return IMAGE_INIT_PASS;
1900    return IMAGE_INIT_PASS;
11471901}
11481902
11491903
11501904static MACHINE_START( supracan )
11511905{
1152   supracan_state *state = machine->driver_data<supracan_state>();
1906    // crash debug: printf("Y"); fflush(stdout);
1907    supracan_state *state = machine->driver_data<supracan_state>();
11531908
11541909   state->video_timer = timer_alloc( machine, supracan_video_callback, NULL );
1910    state->hbl_timer = timer_alloc( machine, supracan_hbl_callback, NULL );
1911    state->line_on_timer = timer_alloc( machine, supracan_line_on_callback, NULL );
1912    state->line_off_timer = timer_alloc( machine, supracan_line_off_callback, NULL );
11551913}
11561914
11571915
11581916static MACHINE_RESET( supracan )
11591917{
1160   supracan_state *state = machine->driver_data<supracan_state>();
1918    // crash debug: printf("Z"); fflush(stdout);
1919    supracan_state *state = machine->driver_data<supracan_state>();
11611920
11621921   cputag_set_input_line(machine, "soundcpu", INPUT_LINE_HALT, ASSERT_LINE);
1163   timer_adjust_oneshot( state->video_timer, machine->primary_screen->time_until_pos(0, 0 ), 0 );
1922
1923   timer_adjust_oneshot( state->video_timer, machine->primary_screen->time_until_pos( 0, 0 ), 0 );
11641924   state->irq_mask = 0;
11651925}
11661926
1927/* gfxdecode is retained for reference purposes but not otherwise used by the driver */
1928#ifdef UNUSED_CODE
11671929static const gfx_layout supracan_gfx8bpp =
11681930{
11691931   8,8,
r8763r8764
12021964   GFXDECODE_ENTRY( "ram_gfx",  0, supracan_gfx4bpp,   0, 0x10 )
12031965   GFXDECODE_ENTRY( "ram_gfx",  0, supracan_gfx2bpp,   0, 0x40 )
12041966GFXDECODE_END
1967#endif
12051968
12061969static INTERRUPT_GEN( supracan_irq )
12071970{
1208   supracan_state *state = device->machine->driver_data<supracan_state>();
1971    /*
1972    supracan_state *state = (supracan_state *)device->machine->driver_data<supracan_state>();
12091973
12101974   if(state->irq_mask)
1975    {
12111976      cpu_set_input_line(device, 7, HOLD_LINE);
1977    }
1978    */
12121979}
12131980
1981static INTERRUPT_GEN( supracan_sound_irq )
1982{
1983    supracan_state *state = (supracan_state *)device->machine->driver_data<supracan_state>();
1984
1985    cpu_set_input_line(device, 0, HOLD_LINE);
1986    state->sound_irq_source_reg |= 0x80;
1987}
1988
12141989static MACHINE_DRIVER_START( supracan )
12151990
12161991   MDRV_DRIVER_DATA( supracan_state )
r8763r8764
12211996
12221997   MDRV_CPU_ADD( "soundcpu", M6502, XTAL_3_579545MHz )      /* TODO: Verfiy actual clock */
12231998   MDRV_CPU_PROGRAM_MAP( supracan_sound_mem )
1999    MDRV_CPU_VBLANK_INT("screen", supracan_sound_irq)
12242000
2001#if !(SOUNDCPU_BOOT_HACK)
2002    MDRV_QUANTUM_PERFECT_CPU("maincpu")
2003    MDRV_QUANTUM_PERFECT_CPU("soundcpu")
2004#endif
2005
12252006   MDRV_MACHINE_START( supracan )
12262007   MDRV_MACHINE_RESET( supracan )
12272008
r8763r8764
12312012
12322013   MDRV_PALETTE_LENGTH( 32768 )
12332014   MDRV_PALETTE_INIT( supracan )
1234   MDRV_GFXDECODE( supracan )
12352015
12362016   MDRV_CARTSLOT_ADD("cart")
12372017   MDRV_CARTSLOT_EXTENSION_LIST("bin")
r8763r8764
12552035
12562036/*    YEAR  NAME        PARENT  COMPAT  MACHINE     INPUT     INIT    COMPANY                  FULLNAME        FLAGS */
12572037CONS( 1995, supracan,   0,      0,      supracan,   supracan, 0,      "Funtech Entertainment", "Super A'Can",  GAME_NO_SOUND | GAME_IMPERFECT_GRAPHICS | GAME_NOT_WORKING )
1258
1259

Previous 15994 Revisions Next


© 1998-2018 The MESS Team