src/mess/drivers/supracan.c
| r6898 | r6899 | |
| 29 | 29 | static UINT16 supracan_m6502_reset; |
| 30 | 30 | static UINT8 *supracan_soundram; |
| 31 | 31 | static UINT16 *supracan_soundram_16; |
| 32 | | static UINT16 supracan_video_regs[256]; |
| 33 | 32 | static emu_timer *supracan_video_timer; |
| 34 | 33 | static UINT16 *supracan_vram; |
| 35 | 34 | |
| 35 | static UINT16 supracan_video_regs[256]; |
| 36 | |
| 37 | #define ACAN_VID_LAYER_EN 0x024/2 |
| 38 | #define ACAN_VID_XFORM32A_H 0x184/2 |
| 39 | #define ACAN_VID_XFORM32A_L 0x186/2 |
| 40 | #define ACAN_VID_XFORM32B_H 0x188/2 |
| 41 | #define ACAN_VID_XFORM32B_L 0x18a/2 |
| 42 | #define ACAN_VID_XFORM16A 0x18c/2 |
| 43 | #define ACAN_VID_XFORM16B 0x192/2 |
| 44 | |
| 36 | 45 | static READ16_HANDLER( supracan_unk1_r ); |
| 37 | 46 | static WRITE16_HANDLER( supracan_soundram_w ); |
| 38 | 47 | static WRITE16_HANDLER( supracan_sound_w ); |
| r6898 | r6899 | |
| 73 | 82 | |
| 74 | 83 | bitmap_fill(bitmap, cliprect, 0); |
| 75 | 84 | |
| 76 | | count = 0x4400/2; |
| 77 | | |
| 78 | 85 | #if 0 |
| 79 | | for (y=0;y<64;y++) |
| 80 | 86 | { |
| 81 | | for (x=0;x<32;x += 8) |
| 87 | count = 0x4400/2; |
| 88 | |
| 89 | for (y=0;y<64;y++) |
| 82 | 90 | { |
| 83 | | static UINT16 dot_data; |
| 91 | for (x = 0; x < 64; x += 16) |
| 92 | { |
| 93 | static UINT16 dot_data; |
| 84 | 94 | |
| 85 | | /* FIXME: likely to be clutted */ |
| 86 | | dot_data = supracan_vram[count] ^ 0xffff; |
| 95 | dot_data = supracan_vram[count] ^ 0xffff; |
| 87 | 96 | |
| 88 | | *BITMAP_ADDR16(bitmap, y, 128+x+0) = ((dot_data >> 14) & 0x0003) + 0x20; |
| 89 | | *BITMAP_ADDR16(bitmap, y, 128+x+1) = ((dot_data >> 12) & 0x0003) + 0x20; |
| 90 | | *BITMAP_ADDR16(bitmap, y, 128+x+2) = ((dot_data >> 10) & 0x0003) + 0x20; |
| 91 | | *BITMAP_ADDR16(bitmap, y, 128+x+3) = ((dot_data >> 8) & 0x0003) + 0x20; |
| 92 | | *BITMAP_ADDR16(bitmap, y, 128+x+4) = ((dot_data >> 6) & 0x0003) + 0x20; |
| 93 | | *BITMAP_ADDR16(bitmap, y, 128+x+5) = ((dot_data >> 4) & 0x0003) + 0x20; |
| 94 | | *BITMAP_ADDR16(bitmap, y, 128+x+6) = ((dot_data >> 2) & 0x0003) + 0x20; |
| 95 | | *BITMAP_ADDR16(bitmap, y, 128+x+7) = ((dot_data >> 0) & 0x0003) + 0x20; |
| 96 | | count++; |
| 97 | *BITMAP_ADDR16(bitmap, y, 128+x+ 0) = ((dot_data >> 15) & 0x0001) + 0x20; |
| 98 | *BITMAP_ADDR16(bitmap, y, 128+x+ 1) = ((dot_data >> 14) & 0x0001) + 0x20; |
| 99 | *BITMAP_ADDR16(bitmap, y, 128+x+ 2) = ((dot_data >> 13) & 0x0001) + 0x20; |
| 100 | *BITMAP_ADDR16(bitmap, y, 128+x+ 3) = ((dot_data >> 12) & 0x0001) + 0x20; |
| 101 | *BITMAP_ADDR16(bitmap, y, 128+x+ 4) = ((dot_data >> 11) & 0x0001) + 0x20; |
| 102 | *BITMAP_ADDR16(bitmap, y, 128+x+ 5) = ((dot_data >> 10) & 0x0001) + 0x20; |
| 103 | *BITMAP_ADDR16(bitmap, y, 128+x+ 6) = ((dot_data >> 9) & 0x0001) + 0x20; |
| 104 | *BITMAP_ADDR16(bitmap, y, 128+x+ 7) = ((dot_data >> 8) & 0x0001) + 0x20; |
| 105 | *BITMAP_ADDR16(bitmap, y, 128+x+ 8) = ((dot_data >> 7) & 0x0001) + 0x20; |
| 106 | *BITMAP_ADDR16(bitmap, y, 128+x+ 9) = ((dot_data >> 6) & 0x0001) + 0x20; |
| 107 | *BITMAP_ADDR16(bitmap, y, 128+x+10) = ((dot_data >> 5) & 0x0001) + 0x20; |
| 108 | *BITMAP_ADDR16(bitmap, y, 128+x+11) = ((dot_data >> 4) & 0x0001) + 0x20; |
| 109 | *BITMAP_ADDR16(bitmap, y, 128+x+12) = ((dot_data >> 3) & 0x0001) + 0x20; |
| 110 | *BITMAP_ADDR16(bitmap, y, 128+x+13) = ((dot_data >> 2) & 0x0001) + 0x20; |
| 111 | *BITMAP_ADDR16(bitmap, y, 128+x+14) = ((dot_data >> 1) & 0x0001) + 0x20; |
| 112 | *BITMAP_ADDR16(bitmap, y, 128+x+15) = ((dot_data >> 0) & 0x0001) + 0x20; |
| 113 | count++; |
| 114 | } |
| 97 | 115 | } |
| 98 | 116 | } |
| 117 | #endif |
| 99 | 118 | |
| 119 | #if 0 |
| 100 | 120 | count = 0x4200/2; |
| 101 | 121 | |
| 102 | 122 | for (y=0;y<16;y++) |
| r6898 | r6899 | |
| 134 | 154 | } |
| 135 | 155 | |
| 136 | 156 | { |
| 137 | | int x,y,xtile,ytile,xsize,ysize,bank,spr_offs,col,i,spr_base; |
| 157 | int x, y; |
| 158 | int xtile, ytile; |
| 159 | int xsize, ysize; |
| 160 | int bank; |
| 161 | int spr_offs; |
| 162 | int col; |
| 163 | int i; |
| 164 | int spr_base; |
| 165 | int hflip; |
| 138 | 166 | //UINT8 *sprdata = (UINT8*)(&supracan_vram[0x1d000/2]); |
| 139 | 167 | |
| 140 | 168 | spr_base = 0x1d000; |
| r6898 | r6899 | |
| 145 | 173 | y = supracan_vram[i+0] & 0x0ff; |
| 146 | 174 | spr_offs = supracan_vram[i+3] << 2; |
| 147 | 175 | bank = (supracan_vram[i+1] & 0xf000) >> 12; |
| 176 | hflip = (supracan_vram[i+1] & 0x0800) ? 1 : 0; |
| 148 | 177 | |
| 149 | 178 | if(supracan_vram[i+3] != 0) |
| 150 | 179 | { |
| r6898 | r6899 | |
| 189 | 218 | ysize = 3; |
| 190 | 219 | break; |
| 191 | 220 | case 0x442a: |
| 192 | | xsize = 2; |
| 221 | xsize = 2 * (supracan_vram[i+1] & 7); |
| 193 | 222 | ysize = 3; |
| 194 | 223 | break; |
| 195 | 224 | case 0x442c: |
| r6898 | r6899 | |
| 226 | 255 | ysize = 1; |
| 227 | 256 | break; |
| 228 | 257 | } |
| 258 | |
| 229 | 259 | for(ytile = 0; ytile < ysize; ytile++) |
| 230 | 260 | { |
| 231 | | for(xtile = 0; xtile < xsize; xtile++) |
| 261 | if(hflip) |
| 232 | 262 | { |
| 233 | | UINT16 data = supracan_vram[spr_offs/2+ytile*xsize+xtile]; |
| 234 | | int tile = (bank * 0x200) + (data & 0x03ff); |
| 235 | | int xflip = data & 0x0800; |
| 236 | | int yflip = data & 0x0400; |
| 237 | | col = (data & 0xf000) >> 12; |
| 238 | | drawgfx_transpen(bitmap,cliprect,screen->machine->gfx[1],tile,col,xflip,yflip,x+xtile*8,y+ytile*8,0); |
| 263 | for(xtile = (xsize - 1); xtile >= 0; xtile--) |
| 264 | { |
| 265 | UINT16 data = supracan_vram[spr_offs/2+ytile*xsize+xtile]; |
| 266 | int tile = (bank * 0x200) + (data & 0x03ff); |
| 267 | int xflip = (data & 0x0800) ? 0 : 1; |
| 268 | int yflip = (data & 0x0400) ? 1 : 0; |
| 269 | col = (data & 0xf000) >> 12; |
| 270 | drawgfx_transpen(bitmap,cliprect,screen->machine->gfx[1],tile,col,xflip,yflip,x+((xsize - 1) - xtile)*8,y+ytile*8,0); |
| 271 | } |
| 239 | 272 | } |
| 273 | else |
| 274 | { |
| 275 | for(xtile = 0; xtile < xsize; xtile++) |
| 276 | { |
| 277 | UINT16 data = supracan_vram[spr_offs/2+ytile*xsize+xtile]; |
| 278 | int tile = (bank * 0x200) + (data & 0x03ff); |
| 279 | int xflip = (data & 0x0800) ? 1 : 0; |
| 280 | int yflip = (data & 0x0400) ? 1 : 0; |
| 281 | col = (data & 0xf000) >> 12; |
| 282 | drawgfx_transpen(bitmap,cliprect,screen->machine->gfx[1],tile,col,xflip,yflip,x+xtile*8,y+ytile*8,0); |
| 283 | } |
| 284 | } |
| 240 | 285 | } |
| 241 | 286 | } |
| 242 | 287 | } |
| r6898 | r6899 | |
| 545 | 590 | // ... |
| 546 | 591 | } |
| 547 | 592 | break; |
| 593 | // Affine transforms of some sort? |
| 594 | case ACAN_VID_XFORM32A_H: |
| 595 | case ACAN_VID_XFORM32A_L: |
| 596 | case ACAN_VID_XFORM32B_H: |
| 597 | case ACAN_VID_XFORM32B_L: |
| 598 | case ACAN_VID_XFORM16A: |
| 599 | case ACAN_VID_XFORM16B: |
| 600 | //printf( "%1.4f %1.4f %1.4f %1.4f\n", (INT32)((supracan_video_regs[ACAN_VID_XFORM32A_H] << 16) | supracan_video_regs[ACAN_VID_XFORM32A_L]) / 65536.0f, (INT32)((supracan_video_regs[ACAN_VID_XFORM32B_H] << 16) | supracan_video_regs[ACAN_VID_XFORM32B_L]) / 65536.0f, supracan_video_regs[ACAN_VID_XFORM16A] / 256.0f, supracan_video_regs[ACAN_VID_XFORM16B] / 256.0f); |
| 601 | break; |
| 548 | 602 | default: |
| 549 | 603 | verboselog(space->machine, 0, "supracan_video_w: Unknown register: %08x = %04x & %04x\n", 0xf00000 + (offset << 1), data, mem_mask); |
| 550 | 604 | break; |