mirror of
https://github.com/holub/mame
synced 2025-04-25 01:40:16 +03:00
pc88va.cpp: rewritten system bank area using address_map_bank_device (nw)
This commit is contained in:
parent
7aaa69c119
commit
481d6a7d67
@ -19,6 +19,7 @@
|
||||
hooked up by the current z80 core
|
||||
- PC-88VA stock version has two bogus opcodes. One is at 0xf0b15, another at 0xf0b31.
|
||||
Making a patch for the latter makes the system to jump into a "DIP-Switch" display.
|
||||
bp f0b31,pc=0xf0b36
|
||||
- unemulated upd71071 demand mode.
|
||||
- Fix floppy motor hook-up;
|
||||
|
||||
@ -31,11 +32,15 @@
|
||||
|
||||
void pc88va_state::video_start()
|
||||
{
|
||||
m_kanjiram = auto_alloc_array(machine(), uint8_t, 0x4000);
|
||||
m_gfxdecode->gfx(2)->set_source(m_kanjiram);
|
||||
m_gfxdecode->gfx(3)->set_source(m_kanjiram);
|
||||
printf("mammt\n");
|
||||
}
|
||||
|
||||
void pc88va_state::draw_sprites(bitmap_rgb32 &bitmap, const rectangle &cliprect)
|
||||
{
|
||||
uint16_t *tvram = (uint16_t *)(memregion("tvram")->base());
|
||||
uint16_t *tvram = m_tvram;
|
||||
int offs,i;
|
||||
|
||||
offs = m_tsp.spr_offset;
|
||||
@ -144,7 +149,8 @@ uint32_t pc88va_state::calc_kanji_rom_addr(uint8_t jis1,uint8_t jis2,int x,int y
|
||||
|
||||
void pc88va_state::draw_text(bitmap_rgb32 &bitmap, const rectangle &cliprect)
|
||||
{
|
||||
uint8_t *tvram = memregion("tvram")->base();
|
||||
uint16_t *tvram = m_tvram;
|
||||
// TODO: PCG select won't work with this arrangement
|
||||
uint8_t *kanji = memregion("kanji")->base();
|
||||
int xi,yi;
|
||||
int x,y;
|
||||
@ -159,24 +165,24 @@ void pc88va_state::draw_text(bitmap_rgb32 &bitmap, const rectangle &cliprect)
|
||||
//uint8_t blink,dwidc,dwid,uline,hline;
|
||||
uint8_t screen_fg_col,screen_bg_col;
|
||||
|
||||
count = (tvram[m_tsp.tvram_vreg_offset+0] | tvram[m_tsp.tvram_vreg_offset+1] << 8);
|
||||
count = tvram[m_tsp.tvram_vreg_offset/2];
|
||||
|
||||
attr_mode = tvram[m_tsp.tvram_vreg_offset+0xa] & 0x1f;
|
||||
attr_mode = tvram[(m_tsp.tvram_vreg_offset+0xa) / 2] & 0x1f;
|
||||
/* Note: bug in docs has the following two reversed */
|
||||
screen_fg_col = (tvram[m_tsp.tvram_vreg_offset+0xb] & 0xf0) >> 4;
|
||||
screen_bg_col = tvram[m_tsp.tvram_vreg_offset+0xb] & 0x0f;
|
||||
screen_fg_col = (tvram[(m_tsp.tvram_vreg_offset+0xa) / 2] & 0xf000) >> 12;
|
||||
screen_bg_col = (tvram[(m_tsp.tvram_vreg_offset+0xa) / 2] & 0x0f00) >> 8;
|
||||
|
||||
for(y=0;y<13;y++)
|
||||
{
|
||||
for(x=0;x<80;x++)
|
||||
{
|
||||
jis1 = (tvram[count+0] & 0x7f) + 0x20;
|
||||
jis2 = tvram[count+1] & 0x7f;
|
||||
lr_half_gfx = ((tvram[count+1] & 0x80) >> 7);
|
||||
jis1 = (tvram[count] & 0x7f) + 0x20;
|
||||
jis2 = (tvram[count] & 0x7f00) >> 8;
|
||||
lr_half_gfx = ((tvram[count] & 0x8000) >> 15);
|
||||
|
||||
tile_num = calc_kanji_rom_addr(jis1,jis2,x,y);
|
||||
|
||||
attr = (tvram[count+m_tsp.attr_offset] & 0x00ff);
|
||||
attr = (tvram[count+(m_tsp.attr_offset/2)] & 0x00ff);
|
||||
|
||||
fg_col = bg_col = reverse = secret = 0; //blink = dwidc = dwid = uline = hline = 0;
|
||||
|
||||
@ -317,7 +323,7 @@ void pc88va_state::draw_text(bitmap_rgb32 &bitmap, const rectangle &cliprect)
|
||||
}
|
||||
}
|
||||
|
||||
count+=2;
|
||||
count++;
|
||||
count&=0xffff;
|
||||
}
|
||||
}
|
||||
@ -403,112 +409,49 @@ void pc88va_state::device_timer(emu_timer &timer, device_timer_id id, int param,
|
||||
}
|
||||
}
|
||||
|
||||
READ16_MEMBER(pc88va_state::sys_mem_r)
|
||||
{
|
||||
switch((m_bank_reg & 0xf00) >> 8)
|
||||
{
|
||||
case 0: // select bus slot
|
||||
return 0xffff;
|
||||
case 1: // TVRAM
|
||||
{
|
||||
uint16_t *tvram = (uint16_t *)(memregion("tvram")->base());
|
||||
|
||||
if(((offset*2) & 0x30000) == 0)
|
||||
return tvram[offset];
|
||||
|
||||
return 0xffff;
|
||||
}
|
||||
case 4:
|
||||
{
|
||||
uint16_t *gvram = (uint16_t *)(memregion("gvram")->base());
|
||||
|
||||
return gvram[offset];
|
||||
}
|
||||
case 8: // kanji ROM
|
||||
case 9:
|
||||
{
|
||||
uint16_t *knj_ram = (uint16_t *)(memregion("kanji")->base());
|
||||
uint32_t knj_offset;
|
||||
|
||||
knj_offset = (offset + (((m_bank_reg & 0x100) >> 8)*0x20000));
|
||||
|
||||
/* 0x00000 - 0x3ffff Kanji ROM 1*/
|
||||
/* 0x40000 - 0x4ffff Kanji ROM 2*/
|
||||
/* 0x50000 - 0x53fff Backup RAM */
|
||||
/* anything else is a NOP (I presume?) */
|
||||
|
||||
return knj_ram[knj_offset];
|
||||
}
|
||||
case 0xc: // Dictionary ROM
|
||||
case 0xd:
|
||||
{
|
||||
uint16_t *dic_rom = (uint16_t *)(memregion("dictionary")->base());
|
||||
uint32_t dic_offset;
|
||||
|
||||
dic_offset = (offset + (((m_bank_reg & 0x100) >> 8)*0x20000));
|
||||
|
||||
return dic_rom[dic_offset];
|
||||
}
|
||||
}
|
||||
|
||||
return 0xffff;
|
||||
}
|
||||
|
||||
WRITE16_MEMBER(pc88va_state::sys_mem_w)
|
||||
{
|
||||
switch((m_bank_reg & 0xf00) >> 8)
|
||||
{
|
||||
case 0: // select bus slot
|
||||
break;
|
||||
case 1: // TVRAM
|
||||
{
|
||||
uint16_t *tvram = (uint16_t *)(memregion("tvram")->base());
|
||||
|
||||
if(((offset*2) & 0x30000) == 0)
|
||||
COMBINE_DATA(&tvram[offset]);
|
||||
}
|
||||
break;
|
||||
case 4: // TVRAM
|
||||
{
|
||||
uint16_t *gvram = (uint16_t *)(memregion("gvram")->base());
|
||||
|
||||
COMBINE_DATA(&gvram[offset]);
|
||||
}
|
||||
break;
|
||||
case 8: // kanji ROM, backup RAM at 0xb0000 - 0xb3fff
|
||||
case 9:
|
||||
{
|
||||
uint16_t *knj_ram = (uint16_t *)(memregion("kanji")->base());
|
||||
uint32_t knj_offset;
|
||||
|
||||
knj_offset = ((offset) + (((m_bank_reg & 0x100) >> 8)*0x20000));
|
||||
|
||||
if(knj_offset >= 0x50000/2 && knj_offset <= 0x53fff/2) // TODO: there's an area that can be write protected
|
||||
{
|
||||
COMBINE_DATA(&knj_ram[knj_offset]);
|
||||
m_gfxdecode->gfx(0)->mark_dirty((knj_offset * 2) / 8);
|
||||
m_gfxdecode->gfx(1)->mark_dirty((knj_offset * 2) / 32);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 0xc: // Dictionary ROM
|
||||
case 0xd:
|
||||
{
|
||||
// NOP?
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void pc88va_state::pc88va_map(address_map &map)
|
||||
{
|
||||
map(0x00000, 0x7ffff).ram();
|
||||
// AM_RANGE(0x80000, 0x9ffff) AM_RAM // EMM
|
||||
map(0xa0000, 0xdffff).rw(FUNC(pc88va_state::sys_mem_r), FUNC(pc88va_state::sys_mem_w));
|
||||
// map(0x80000, 0x9ffff).ram(); // EMM
|
||||
map(0xa0000, 0xdffff).m(m_sysbank, FUNC(address_map_bank_device::amap16));
|
||||
map(0xe0000, 0xeffff).bankr("rom00_bank");
|
||||
map(0xf0000, 0xfffff).bankr("rom10_bank");
|
||||
}
|
||||
|
||||
/* 0x00000 - 0x3ffff Kanji ROM 1*/
|
||||
/* 0x40000 - 0x4ffff Kanji ROM 2*/
|
||||
/* 0x50000 - 0x53fff Backup RAM */
|
||||
/* above that is a NOP presumably */
|
||||
READ8_MEMBER(pc88va_state::kanji_ram_r)
|
||||
{
|
||||
return m_kanjiram[offset];
|
||||
}
|
||||
|
||||
WRITE8_MEMBER(pc88va_state::kanji_ram_w)
|
||||
{
|
||||
// TODO: there's an area that can be write protected
|
||||
m_kanjiram[offset] = data;
|
||||
m_gfxdecode->gfx(2)->mark_dirty(offset / 8);
|
||||
m_gfxdecode->gfx(3)->mark_dirty(offset / 32);
|
||||
}
|
||||
|
||||
|
||||
void pc88va_state::sysbank_map(address_map &map)
|
||||
{
|
||||
// 0 select bus slot (?)
|
||||
// 1 tvram
|
||||
map(0x040000, 0x04ffff).ram().share("tvram");
|
||||
// 4 gvram
|
||||
map(0x100000, 0x13ffff).ram().share("gvram");
|
||||
// 8-9 kanji
|
||||
map(0x200000, 0x23ffff).rom().region("kanji", 0x00000);
|
||||
map(0x240000, 0x24ffff).rom().region("kanji", 0x40000);
|
||||
map(0x250000, 0x253fff).rw(FUNC(pc88va_state::kanji_ram_r),FUNC(pc88va_state::kanji_ram_w));
|
||||
// c-d dictionary
|
||||
map(0x300000, 0x37ffff).rom().region("dictionary", 0);
|
||||
}
|
||||
|
||||
/* IDP = NEC uPD72022 */
|
||||
READ8_MEMBER(pc88va_state::idp_status_r)
|
||||
{
|
||||
@ -813,18 +756,15 @@ WRITE16_MEMBER(pc88va_state::bios_bank_w)
|
||||
{
|
||||
/*
|
||||
-x-- ---- ---- ---- SMM (compatibility mode)
|
||||
---x ---- ---- ---- GMSP (VRAM drawing Mode)
|
||||
---x ---- ---- ---- GMSP (VRAM drawing mode)
|
||||
---- xxxx ---- ---- SMBC (0xa0000 - 0xdffff RAM bank)
|
||||
---- ---- xxxx ---- RBC1 (0xf0000 - 0xfffff ROM bank)
|
||||
---- ---- ---- xxxx RBC0 (0xe0000 - 0xeffff ROM bank)
|
||||
*/
|
||||
if ((mem_mask&0xffff) == 0xffff)
|
||||
m_bank_reg = data;
|
||||
else if ((mem_mask & 0xffff) == 0xff00)
|
||||
m_bank_reg = (data & 0xff00) | (m_bank_reg & 0x00ff);
|
||||
else if ((mem_mask & 0xffff) == 0x00ff)
|
||||
m_bank_reg = (data & 0x00ff) | (m_bank_reg & 0xff00);
|
||||
|
||||
COMBINE_DATA(&m_bank_reg);
|
||||
|
||||
/* SMBC */
|
||||
m_sysbank->set_bank((m_bank_reg & 0xf00) >> 8);
|
||||
|
||||
/* RBC1 */
|
||||
{
|
||||
@ -1056,12 +996,10 @@ WRITE16_MEMBER(pc88va_state::video_pri_w)
|
||||
|
||||
READ8_MEMBER(pc88va_state::backupram_dsw_r)
|
||||
{
|
||||
uint16_t *knj_ram = (uint16_t *)(memregion("kanji")->base());
|
||||
|
||||
if(offset == 0)
|
||||
return knj_ram[(0x50000 + 0x1fc2) / 2] & 0xff;
|
||||
return m_kanjiram[0x1fc2 / 2] & 0xff;
|
||||
|
||||
return knj_ram[(0x50000 + 0x1fc6) / 2] & 0xff;
|
||||
return m_kanjiram[0x1fc6 / 2] & 0xff;
|
||||
}
|
||||
|
||||
WRITE8_MEMBER(pc88va_state::sys_port1_w)
|
||||
@ -1391,8 +1329,8 @@ static const gfx_layout pc88va_chars_8x8 =
|
||||
RGN_FRAC(1,1),
|
||||
1,
|
||||
{ 0 },
|
||||
{ 0, 1, 2, 3, 4, 5, 6, 7 },
|
||||
{ 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 },
|
||||
{ STEP8(0,1) },
|
||||
{ STEP8(0,8) },
|
||||
8*8
|
||||
};
|
||||
|
||||
@ -1402,15 +1340,40 @@ static const gfx_layout pc88va_chars_16x16 =
|
||||
RGN_FRAC(1,1),
|
||||
1,
|
||||
{ 0 },
|
||||
{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 },
|
||||
{ 0*16, 1*16, 2*16, 3*16, 4*16, 5*16, 6*16, 7*16,8*16, 9*16, 10*16, 11*16, 12*16, 13*16, 14*16, 15*16 },
|
||||
{ STEP16(0,1) },
|
||||
{ STEP16(0,16) },
|
||||
16*16
|
||||
};
|
||||
|
||||
/* decoded for debugging purpose, this will be nuked in the end... */
|
||||
// same as above but with static size
|
||||
static const gfx_layout pc88va_kanji_8x8 =
|
||||
{
|
||||
8,8,
|
||||
0x4000/8,
|
||||
1,
|
||||
{ 0 },
|
||||
{ STEP8(0,1) },
|
||||
{ STEP8(0,8) },
|
||||
8*8
|
||||
};
|
||||
|
||||
static const gfx_layout pc88va_kanji_16x16 =
|
||||
{
|
||||
16,16,
|
||||
0x4000/32,
|
||||
1,
|
||||
{ 0 },
|
||||
{ STEP16(0,1) },
|
||||
{ STEP16(0,16) },
|
||||
16*16
|
||||
};
|
||||
|
||||
// TODO: decoded for debugging purpose, this will be nuked in the end ...
|
||||
static GFXDECODE_START( gfx_pc88va )
|
||||
GFXDECODE_ENTRY( "kanji", 0x00000, pc88va_chars_8x8, 0, 1 )
|
||||
GFXDECODE_ENTRY( "kanji", 0x00000, pc88va_chars_16x16, 0, 1 )
|
||||
GFXDECODE_ENTRY( nullptr, 0x00000, pc88va_kanji_8x8, 0, 1 )
|
||||
GFXDECODE_ENTRY( nullptr, 0x00000, pc88va_kanji_16x16, 0, 1 )
|
||||
GFXDECODE_END
|
||||
|
||||
READ8_MEMBER(pc88va_state::cpu_8255_c_r)
|
||||
@ -1499,6 +1462,7 @@ void pc88va_state::machine_start()
|
||||
m_fdd[0]->get_device()->set_rpm(300);
|
||||
m_fdd[1]->get_device()->set_rpm(300);
|
||||
m_fdc->set_rate(250000);
|
||||
|
||||
}
|
||||
|
||||
void pc88va_state::machine_reset()
|
||||
@ -1510,6 +1474,7 @@ void pc88va_state::machine_reset()
|
||||
membank("rom00_bank")->set_base(&ROM00[0x00000]);
|
||||
|
||||
m_bank_reg = 0x4100;
|
||||
m_sysbank->set_bank(1);
|
||||
m_backupram_wp = 1;
|
||||
|
||||
/* default palette */
|
||||
@ -1608,13 +1573,13 @@ static void pc88va_floppies(device_slot_interface &device)
|
||||
|
||||
READ8_MEMBER(pc88va_state::dma_memr_cb)
|
||||
{
|
||||
printf("%08x\n",offset);
|
||||
printf("%08x\n",offset);
|
||||
return 0;
|
||||
}
|
||||
|
||||
WRITE8_MEMBER(pc88va_state::dma_memw_cb)
|
||||
{
|
||||
printf("%08x %02x\n",offset,data);
|
||||
printf("%08x %02x\n",offset,data);
|
||||
}
|
||||
|
||||
|
||||
@ -1694,6 +1659,13 @@ MACHINE_CONFIG_START(pc88va_state::pc88va)
|
||||
MCFG_PIT8253_CLK1(8000000) /* BEEP frequency setting */
|
||||
MCFG_PIT8253_CLK2(8000000) /* RS232C baud rate setting */
|
||||
|
||||
MCFG_DEVICE_ADD("sysbank", ADDRESS_MAP_BANK, 0)
|
||||
MCFG_DEVICE_PROGRAM_MAP(sysbank_map)
|
||||
MCFG_ADDRESS_MAP_BANK_ENDIANNESS(ENDIANNESS_LITTLE)
|
||||
MCFG_ADDRESS_MAP_BANK_DATA_WIDTH(16)
|
||||
MCFG_ADDRESS_MAP_BANK_ADDR_WIDTH(18+4)
|
||||
MCFG_ADDRESS_MAP_BANK_STRIDE(0x40000)
|
||||
|
||||
SPEAKER(config, "mono").front_center();
|
||||
MCFG_DEVICE_ADD("ym", YM2203, 3993600) //unknown clock / divider
|
||||
MCFG_SOUND_ROUTE(0, "mono", 0.25)
|
||||
@ -1725,10 +1697,6 @@ ROM_START( pc88va2 )
|
||||
|
||||
ROM_REGION( 0x80000, "dictionary", 0 )
|
||||
ROM_LOAD( "vadic_va2.rom", 0x00000, 0x80000, CRC(a6108f4d) SHA1(3665db538598abb45d9dfe636423e6728a812b12) )
|
||||
|
||||
ROM_REGION( 0x10000, "tvram", ROMREGION_ERASE00 )
|
||||
|
||||
ROM_REGION( 0x40000, "gvram", ROMREGION_ERASE00 )
|
||||
ROM_END
|
||||
|
||||
ROM_START( pc88va )
|
||||
@ -1753,10 +1721,6 @@ ROM_START( pc88va )
|
||||
|
||||
ROM_REGION( 0x80000, "dictionary", 0 )
|
||||
ROM_LOAD( "vadic.rom", 0x0000, 0x80000, CRC(f913c605) SHA1(5ba1f3578d0aaacdaf7194a80e6d520c81ae55fb))
|
||||
|
||||
ROM_REGION( 0x10000, "tvram", ROMREGION_ERASE00 )
|
||||
|
||||
ROM_REGION( 0x40000, "gvram", ROMREGION_ERASE00 )
|
||||
ROM_END
|
||||
|
||||
|
||||
|
@ -19,6 +19,7 @@
|
||||
#include "machine/pit8253.h"
|
||||
//#include "machine/upd71071.h"
|
||||
#include "machine/upd765.h"
|
||||
#include "machine/bankdev.h"
|
||||
#include "sound/2203intf.h"
|
||||
|
||||
#include "emupal.h"
|
||||
@ -73,8 +74,12 @@ public:
|
||||
m_pic1(*this, "pic8259_master"),
|
||||
m_pic2(*this, "pic8259_slave"),
|
||||
m_palram(*this, "palram"),
|
||||
m_sysbank(*this, "sysbank"),
|
||||
m_tvram(*this, "tvram"),
|
||||
m_gvram(*this, "gvram"),
|
||||
m_gfxdecode(*this, "gfxdecode"),
|
||||
m_palette(*this, "palette") { }
|
||||
m_palette(*this, "palette")
|
||||
{ }
|
||||
|
||||
void pc88va(machine_config &config);
|
||||
protected:
|
||||
@ -92,6 +97,10 @@ private:
|
||||
required_device<pic8259_device> m_pic1;
|
||||
required_device<pic8259_device> m_pic2;
|
||||
required_shared_ptr<uint16_t> m_palram;
|
||||
required_device<address_map_bank_device> m_sysbank;
|
||||
required_shared_ptr<uint16_t> m_tvram;
|
||||
required_shared_ptr<uint16_t> m_gvram;
|
||||
uint8_t *m_kanjiram;
|
||||
uint16_t m_bank_reg;
|
||||
uint16_t m_screen_ctrl_reg;
|
||||
uint8_t m_timer3_io_reg;
|
||||
@ -124,6 +133,8 @@ private:
|
||||
DECLARE_READ8_MEMBER(key_r);
|
||||
DECLARE_WRITE16_MEMBER(backupram_wp_1_w);
|
||||
DECLARE_WRITE16_MEMBER(backupram_wp_0_w);
|
||||
DECLARE_READ8_MEMBER(kanji_ram_r);
|
||||
DECLARE_WRITE8_MEMBER(kanji_ram_w);
|
||||
DECLARE_READ8_MEMBER(hdd_status_r);
|
||||
#if TEST_SUBFDC
|
||||
DECLARE_READ8_MEMBER(upd765_tc_r);
|
||||
@ -188,8 +199,10 @@ private:
|
||||
void execute_spron_cmd();
|
||||
void execute_sprsw_cmd();
|
||||
|
||||
void pc88va_io_map(address_map &map);
|
||||
void pc88va_map(address_map &map);
|
||||
void pc88va_io_map(address_map &map);
|
||||
void sysbank_map(address_map &map);
|
||||
|
||||
void pc88va_z80_io_map(address_map &map);
|
||||
void pc88va_z80_map(address_map &map);
|
||||
protected:
|
||||
|
Loading…
Reference in New Issue
Block a user