trunk/src/mame/drivers/dblcrown.c
| r18564 | r18565 | |
| 29 | 29 | |
| 30 | 30 | #define MAIN_CLOCK XTAL_28_63636MHz |
| 31 | 31 | |
| 32 | #define DEBUG_VRAM |
| 33 | |
| 32 | 34 | class dblcrown_state : public driver_device |
| 33 | 35 | { |
| 34 | 36 | public: |
| r18564 | r18565 | |
| 45 | 47 | |
| 46 | 48 | UINT8 m_bank; |
| 47 | 49 | UINT8 m_irq_src; |
| 50 | UINT8 *m_pal_ram; |
| 51 | UINT8 *m_vram; |
| 52 | UINT8 m_vram_bank[2]; |
| 48 | 53 | |
| 49 | 54 | DECLARE_READ8_MEMBER(bank_r); |
| 50 | 55 | DECLARE_WRITE8_MEMBER(bank_w); |
| 51 | 56 | DECLARE_READ8_MEMBER(irq_source_r); |
| 52 | 57 | DECLARE_WRITE8_MEMBER(irq_source_w); |
| 58 | DECLARE_READ8_MEMBER(palette_r); |
| 59 | DECLARE_WRITE8_MEMBER(palette_w); |
| 60 | DECLARE_READ8_MEMBER(vram_r); |
| 61 | DECLARE_WRITE8_MEMBER(vram_w); |
| 62 | DECLARE_READ8_MEMBER(vram_bank_r); |
| 63 | DECLARE_WRITE8_MEMBER(vram_bank_w); |
| 53 | 64 | |
| 54 | 65 | TIMER_DEVICE_CALLBACK_MEMBER(dblcrown_irq_scanline); |
| 55 | 66 | |
| r18564 | r18565 | |
| 64 | 75 | |
| 65 | 76 | void dblcrown_state::video_start() |
| 66 | 77 | { |
| 78 | m_pal_ram = auto_alloc_array(machine(), UINT8, 0x200*2); |
| 79 | m_vram = auto_alloc_array(machine(), UINT8, 0x1000*0x10); |
| 67 | 80 | |
| 81 | state_save_register_global_pointer(machine(), m_vram, 0x1000*0x10); |
| 68 | 82 | } |
| 69 | 83 | |
| 70 | 84 | UINT32 dblcrown_state::screen_update( screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect ) |
| r18564 | r18565 | |
| 93 | 107 | m_irq_src = data; // this effectively acks the irq, by writing 0 |
| 94 | 108 | } |
| 95 | 109 | |
| 110 | READ8_MEMBER( dblcrown_state::palette_r) |
| 111 | { |
| 112 | if(m_bank & 8) /* TODO: verify this */ |
| 113 | offset+=0x200; |
| 96 | 114 | |
| 115 | return m_pal_ram[offset]; |
| 116 | } |
| 117 | |
| 118 | WRITE8_MEMBER( dblcrown_state::palette_w) |
| 119 | { |
| 120 | int r,g,b,datax; |
| 121 | |
| 122 | if(m_bank & 8) /* TODO: verify this */ |
| 123 | offset+=0x200; |
| 124 | |
| 125 | m_pal_ram[offset] = data; |
| 126 | offset>>=1; |
| 127 | datax = m_pal_ram[offset*2] + 256*m_pal_ram[offset*2 + 1]; |
| 128 | |
| 129 | r = ((datax)&0x000f)>>0; |
| 130 | g = ((datax)&0x00f0)>>4; |
| 131 | b = ((datax)&0x0f00)>>8; |
| 132 | |
| 133 | palette_set_color_rgb(machine(), offset, pal4bit(r), pal4bit(g), pal4bit(b)); |
| 134 | } |
| 135 | |
| 136 | |
| 137 | READ8_MEMBER( dblcrown_state::vram_r) |
| 138 | { |
| 139 | UINT32 hi_offs; |
| 140 | hi_offs = m_vram_bank[offset & 0x1000 >> 12] << 12; |
| 141 | |
| 142 | return m_vram[(offset & 0xfff) | hi_offs]; |
| 143 | } |
| 144 | |
| 145 | WRITE8_MEMBER( dblcrown_state::vram_w) |
| 146 | { |
| 147 | UINT32 hi_offs; |
| 148 | hi_offs = m_vram_bank[(offset & 0x1000) >> 12] << 12; |
| 149 | |
| 150 | m_vram[(offset & 0xfff) | hi_offs] = data; |
| 151 | |
| 152 | #ifdef DEBUG_VRAM |
| 153 | { |
| 154 | UINT8 *VRAM = memregion("vram")->base(); |
| 155 | |
| 156 | VRAM[(offset & 0xfff) | hi_offs] = data; |
| 157 | machine().gfx[0]->mark_dirty(((offset & 0xfff) | hi_offs) / 32); |
| 158 | } |
| 159 | #endif |
| 160 | } |
| 161 | |
| 162 | READ8_MEMBER( dblcrown_state::vram_bank_r) |
| 163 | { |
| 164 | return m_vram_bank[offset]; |
| 165 | } |
| 166 | |
| 167 | WRITE8_MEMBER( dblcrown_state::vram_bank_w) |
| 168 | { |
| 169 | m_vram_bank[offset] = data & 0xf; |
| 170 | |
| 171 | if(data & 0xf0) |
| 172 | printf("vram bank = %02x\n",data); |
| 173 | } |
| 174 | |
| 97 | 175 | static ADDRESS_MAP_START( dblcrown_map, AS_PROGRAM, 8, dblcrown_state ) |
| 98 | 176 | AM_RANGE(0x0000, 0x7fff) AM_ROM |
| 99 | 177 | AM_RANGE(0x8000, 0x9fff) AM_ROMBANK("rom_bank") |
| 100 | 178 | AM_RANGE(0xa000, 0xb7ff) AM_RAM // work ram |
| 101 | 179 | AM_RANGE(0xb800, 0xbfff) AM_RAM AM_SHARE("nvram") |
| 102 | | AM_RANGE(0xc000, 0xc3ff) AM_RAM |
| 103 | | AM_RANGE(0xc400, 0xc7ff) AM_RAM |
| 104 | | AM_RANGE(0xc800, 0xcfff) AM_RAM |
| 105 | | AM_RANGE(0xd000, 0xdfff) AM_RAM // vram |
| 106 | | AM_RANGE(0xf000, 0xf1ff) AM_RAM_WRITE(paletteram_xBBBBBGGGGGRRRRR_byte_le_w) AM_SHARE("paletteram") // TODO: correct bit order |
| 180 | AM_RANGE(0xc000, 0xdfff) AM_READWRITE(vram_r, vram_w) |
| 181 | AM_RANGE(0xf000, 0xf1ff) AM_READWRITE(palette_r, palette_w) //AM_RAM_WRITE(paletteram_xBBBBBGGGGGRRRRR_byte_le_w) AM_SHARE("paletteram") // TODO: correct bit order |
| 107 | 182 | AM_RANGE(0xfe00, 0xfeff) AM_RAM // ??? |
| 108 | | // 0xff00 - 0xff01 RAM banks for 0xd000 |
| 183 | AM_RANGE(0xff00, 0xff01) AM_READWRITE(vram_bank_r, vram_bank_w) |
| 109 | 184 | AM_RANGE(0xff04, 0xff04) AM_READWRITE(irq_source_r,irq_source_w) |
| 110 | 185 | |
| 111 | 186 | AM_RANGE(0xff00, 0xffff) AM_RAM // ???, intentional fall-through |
| r18564 | r18565 | |
| 172 | 247 | PORT_DIPSETTING( 0x00, DEF_STR( On ) ) |
| 173 | 248 | INPUT_PORTS_END |
| 174 | 249 | |
| 250 | static const gfx_layout char_8x8_layout = |
| 251 | { |
| 252 | 8,8, |
| 253 | RGN_FRAC(1,1), |
| 254 | 4, |
| 255 | { 0,1,2,3 }, |
| 256 | { 4,0, 12,8, 20,16, 28,24 }, |
| 257 | { 0*32, 1*32, 2*32, 3*32, 4*32, 5*32, 6*32, 7*32 }, |
| 258 | 32*8 |
| 259 | }; |
| 175 | 260 | |
| 176 | 261 | static const gfx_layout char_16x16_layout = |
| 177 | 262 | { |
| r18564 | r18565 | |
| 186 | 271 | |
| 187 | 272 | |
| 188 | 273 | static GFXDECODE_START( dblcrown ) |
| 189 | | GFXDECODE_ENTRY( "gfx1", 0, char_16x16_layout, 0, 16*4 ) |
| 274 | #ifdef DEBUG_VRAM |
| 275 | GFXDECODE_ENTRY( "vram", 0, char_8x8_layout, 0, 0x20 ) |
| 276 | #endif |
| 277 | GFXDECODE_ENTRY( "gfx1", 0, char_16x16_layout, 0, 0x20 ) |
| 190 | 278 | GFXDECODE_END |
| 191 | 279 | |
| 192 | 280 | |
| r18564 | r18565 | |
| 217 | 305 | } |
| 218 | 306 | |
| 219 | 307 | /* TODO: unknown source */ |
| 220 | | if (scanline == 0) |
| 308 | if (scanline == 128) |
| 221 | 309 | { |
| 222 | 310 | m_maincpu->set_input_line(0, HOLD_LINE); |
| 223 | 311 | m_irq_src = 4; |
| r18564 | r18565 | |
| 243 | 331 | |
| 244 | 332 | MCFG_GFXDECODE(dblcrown) |
| 245 | 333 | |
| 246 | | MCFG_PALETTE_LENGTH(0x100) |
| 334 | MCFG_PALETTE_LENGTH(0x200) |
| 247 | 335 | |
| 248 | 336 | MCFG_NVRAM_ADD_0FILL("nvram") |
| 249 | 337 | |
| r18564 | r18565 | |
| 267 | 355 | ROM_REGION( 0x80000, "gfx1", ROMREGION_ERASE00 ) |
| 268 | 356 | ROM_LOAD("2.u43", 0x00000, 0x80000, CRC(58200bd4) SHA1(2795cfc41056111f66bfb82916343d1c733baa83) ) |
| 269 | 357 | |
| 358 | #ifdef DEBUG_VRAM |
| 359 | ROM_REGION( 0x1000*0x10, "vram", ROMREGION_ERASE00 ) |
| 360 | #endif |
| 361 | |
| 270 | 362 | ROM_REGION( 0x0bf1, "pals", 0 ) // in Jedec format |
| 271 | 363 | ROM_LOAD("palce16v8h.u39", 0x0000, 0x0bf1, CRC(997b0ba9) SHA1(1c121ab74f33d5162b619740b08cc7bc694c257d) ) |
| 272 | 364 | ROM_END |