(MESS) ti85: add basic support for the TI-84 Plus

Adds known dump of TI-84 Plus which has been sent to a mess dev and supports
enough asic functionality that it boots and runs.

Fixed up model enum to match style from the apple2 and used it to add support
for where the ti84p differs from the ti84pse.

Consolidated code for the 15Mhz calculators so there is less duplicated code
between the ti83pse, ti84pse and ti84 support code.
This commit is contained in:
Jon Sturm 2014-10-24 16:20:00 -05:00
parent 9867043d73
commit 947d396010
4 changed files with 116 additions and 41 deletions

38
src/mess/drivers/ti85.c Normal file → Executable file
View File

@ -1,5 +1,6 @@
/***************************************************************************
TI-85 and TI-86 drivers by Krzysztof Strzecha
TI-83 Plus, TI-84 Plus, and Siliver Edition support by Jon Sturm
Notes:
1. After start TI-85 waits for ON key interrupt, so press ON key to start
@ -342,6 +343,12 @@ static ADDRESS_MAP_START( ti83pse_banked_mem , AS_PROGRAM, 8, ti85_state )
AM_RANGE(0x200000, 0x21BFFF) AM_RAM AM_SHARE("nvram")
ADDRESS_MAP_END
static ADDRESS_MAP_START( ti84p_banked_mem , AS_PROGRAM, 8, ti85_state )
AM_RANGE(0x0000, 0xfffff) AM_DEVREADWRITE("flash", intelfsh8_device, read, write)
AM_RANGE(0x200000, 0x21BFFF) AM_RAM AM_SHARE("nvram")
ADDRESS_MAP_END
static ADDRESS_MAP_START( ti83p_banked_mem , AS_PROGRAM, 8, ti85_state )
AM_RANGE(0x00000, 0x7ffff) AM_DEVREADWRITE("flash", intelfsh8_device, read, write)
AM_RANGE(0x100000, 0x107fff) AM_RAM AM_SHARE("nvram")
@ -730,17 +737,31 @@ static MACHINE_CONFIG_DERIVED( ti83pse, ti83p )
MCFG_DEVICE_PROGRAM_MAP(ti83pse_banked_mem)
MCFG_MACHINE_START_OVERRIDE(ti85_state, ti83pse )
MCFG_MACHINE_RESET_OVERRIDE(ti85_state, ti83pse )
MCFG_DEVICE_REPLACE("flash", FUJITSU_29F160T, 0)
//MCFG_TI83PSERIAL_ADD( "tiserial" )
MACHINE_CONFIG_END
static MACHINE_CONFIG_DERIVED( ti84p, ti83pse )
MCFG_DEVICE_REPLACE("flash", AMD_29F800T , 0)
//MCFG_TI83PSERIAL_ADD( "tiserial" )
MCFG_DEVICE_MODIFY("membank1")
MCFG_DEVICE_PROGRAM_MAP(ti84p_banked_mem)
MCFG_DEVICE_MODIFY("membank2")
MCFG_DEVICE_PROGRAM_MAP(ti84p_banked_mem)
MCFG_DEVICE_MODIFY("membank3")
MCFG_DEVICE_PROGRAM_MAP(ti84p_banked_mem)
MCFG_DEVICE_MODIFY("membank4")
MCFG_DEVICE_PROGRAM_MAP(ti84p_banked_mem)
MCFG_MACHINE_START_OVERRIDE(ti85_state, ti84p )
MCFG_DEVICE_REPLACE("flash", AMD_29F800T , 0)
MACHINE_CONFIG_END
static MACHINE_CONFIG_DERIVED( ti84pse, ti83pse )
MCFG_MACHINE_START_OVERRIDE(ti85_state, ti84pse )
MACHINE_CONFIG_END
static MACHINE_CONFIG_DERIVED( ti73, ti83p )
//MCFG_DEVICE_REMOVE( "tiserial" )
@ -888,13 +909,12 @@ ROM_START (ti84pse)
ROM_END
ROM_START (ti84p)
ROM_REGION (0x100000, "flash",0)
ROM_DEFAULT_BIOS("v241")
ROM_SYSTEM_BIOS( 0, "v241", "V 2.41" )
ROMX_LOAD( "ti84v241.bin", 0x00000, 0x100000, CRC(5758db36) SHA1(7daa4f22e9b5dc8a1cc8fd31bceece9fa8b43515), ROM_BIOS(1) )
ROM_REGION (0x100000, "flash",0)
ROM_DEFAULT_BIOS("b100v255mp")
ROM_SYSTEM_BIOS( 0, "b100v255mp", "Boot 1.00 OS V 2.55MP" )
ROMX_LOAD( "ti84pb100v255mp.bin", 0x00000, 0x100000, CRC(4AF31251) SHA1(8F67269346644B87E7CD0F353F5F4030E787CF57), ROM_BIOS(1) )
ROM_END
/* YEAR NAME PARENT COMPAT MACHINE INPUT INIT COMPANY FULLNAME FLAGS */
COMP( 1990, ti81, 0, 0, ti81, ti81, driver_device, 0, "Texas Instruments", "TI-81", GAME_NO_SOUND )
COMP( 1992, ti85, 0, 0, ti85d, ti85, driver_device, 0, "Texas Instruments", "TI-85", GAME_NO_SOUND )
@ -906,4 +926,4 @@ COMP( 1998, ti73, 0, 0, ti73, ti82, driver_device, 0, "T
COMP( 1999, ti83p, 0, 0, ti83p, ti82, driver_device, 0, "Texas Instruments", "TI-83 Plus", GAME_NO_SOUND )
COMP( 2001, ti83pse, 0, 0, ti83pse, ti82, driver_device, 0, "Texas Instruments", "TI-83 Plus Silver Edition", GAME_NO_SOUND )
COMP( 2004, ti84p, 0, 0, ti84p, ti82, driver_device, 0, "Texas Instruments", "TI-84 Plus", GAME_NO_SOUND )
COMP( 2004, ti84pse, 0, 0, ti83pse, ti82, driver_device, 0, "Texas Instruments", "TI-84 Plus Silver Edition", GAME_NO_SOUND )
COMP( 2004, ti84pse, 0, 0, ti84pse, ti82, driver_device, 0, "Texas Instruments", "TI-84 Plus Silver Edition", GAME_NO_SOUND )

11
src/mess/includes/ti85.h Normal file → Executable file
View File

@ -16,7 +16,7 @@
/* model */
typedef enum {
enum ti85_model {
TI81,
TI81v2,
TI82,
@ -27,7 +27,7 @@ typedef enum {
TI83PSE,
TI84P,
TI84PSE
} ti85_models;
};
typedef struct
{
@ -74,6 +74,8 @@ public:
optional_device<address_map_bank_device> m_membank3;
optional_device<address_map_bank_device> m_membank4;
ti85_model m_model;
UINT8 m_LCD_memory_base;
UINT8 m_LCD_contrast;
UINT8 m_LCD_status;
@ -167,11 +169,14 @@ public:
DECLARE_PALETTE_INIT(ti85);
DECLARE_MACHINE_RESET(ti85);
DECLARE_MACHINE_RESET(ti83p);
DECLARE_MACHINE_RESET(ti83pse);
DECLARE_PALETTE_INIT(ti82);
DECLARE_MACHINE_START(ti86);
DECLARE_MACHINE_START(ti83p);
DECLARE_MACHINE_START(ti83pse);
DECLARE_MACHINE_START(ti84pse);
DECLARE_MACHINE_START(ti84p);
void ti8xpse_init_common();
UINT32 screen_update_ti85(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
TIMER_CALLBACK_MEMBER(ti85_timer_callback);
TIMER_CALLBACK_MEMBER(ti83_timer1_callback);

105
src/mess/machine/ti85.c Normal file → Executable file
View File

@ -1,5 +1,6 @@
/***************************************************************************
TI-85 driver by Krzysztof Strzecha
TI-83 Plus, TI-84 Plus, and Siliver Edition support by Jon Sturm
Functions to emulate general aspects of the machine (RAM, ROM, interrupts,
I/O ports)
@ -236,6 +237,8 @@ void ti85_state::update_ti86_memory ()
void ti85_state::machine_start()
{
m_model = TI85;
address_space &space = m_maincpu->space(AS_PROGRAM);
m_bios = memregion("bios")->base();
@ -277,33 +280,38 @@ MACHINE_RESET_MEMBER(ti85_state,ti83p)
m_PCR = 0xc0;
m_ti8x_memory_page_0 = 0;//0x1f;
m_ti8x_memory_page_1 = 0x1f;
if (m_model == TI83P)
{
m_ti8x_memory_page_1 = 0x1f;
}
else if (m_model == TI84P)
{
m_ti8x_memory_page_1 = 0x3f;
}
else
{
m_ti8x_memory_page_1 = 0x7f;
}
m_ti8x_memory_page_2 = 0;
m_ti8x_memory_page_3 = 0;
m_ti83p_port4 = 1;
update_ti83p_memory();
m_maincpu->set_pc(0x8000);
}
MACHINE_RESET_MEMBER(ti85_state,ti83pse)
{
m_red_out = 0x00;
m_white_out = 0x00;
m_PCR = 0xc0;
m_ti8x_memory_page_0 = 0;//0x1f;
m_ti8x_memory_page_1 = 0x7f;
m_ti8x_memory_page_2 = 0;
m_ti8x_memory_page_3 = 0;
m_ti83p_port4 = 1;
update_ti83pse_memory();
if (m_model == TI83P)
{
update_ti83p_memory();
}
else
{
update_ti83pse_memory();
}
m_maincpu->set_pc(0x8000);
}
MACHINE_START_MEMBER(ti85_state,ti83p)
{
m_model = TI83P;
//address_space &space = m_maincpu->space(AS_PROGRAM);
//m_bios = memregion("flash")->base();
@ -326,13 +334,17 @@ MACHINE_START_MEMBER(ti85_state,ti83p)
m_ti83p_port4 = 1;
m_flash_unlocked = 0;
ti85_state::update_ti83p_memory ();
ti85_state::update_ti83p_memory();
m_maincpu->set_pc(0x8000); //this is a hack due to incomplete memory mapping emulation
machine().scheduler().timer_pulse(attotime::from_hz(256), timer_expired_delegate(FUNC(ti85_state::ti83_timer1_callback),this));
machine().scheduler().timer_pulse(attotime::from_hz(512), timer_expired_delegate(FUNC(ti85_state::ti83_timer2_callback),this));
/* save states and debugging */
save_item(NAME(m_timer_interrupt_mask));
/* save states and debugging */
save_item(NAME(m_timer_interrupt_status));
save_item(NAME(m_timer_interrupt_mask));
save_item(NAME(m_ti8x_memory_page_0));
save_item(NAME(m_ti8x_memory_page_1));
save_item(NAME(m_ti8x_memory_page_2));
@ -340,7 +352,7 @@ MACHINE_START_MEMBER(ti85_state,ti83p)
save_item(NAME(m_ti83p_port4));
}
MACHINE_START_MEMBER(ti85_state,ti83pse)
void ti85_state::ti8xpse_init_common()
{
//address_space &space = m_maincpu->space(AS_PROGRAM);
//address_space &asic = ADDRESS_MAP_NAME(ti83p_asic_mem);
@ -352,7 +364,7 @@ MACHINE_START_MEMBER(ti85_state,ti83pse)
m_ON_interrupt_status = 0;
m_ON_pressed = 0;
m_ti8x_memory_page_0 = 00;//0x7f;
m_ti8x_memory_page_1 = 0x7f;
m_ti8x_memory_page_1 = (m_model != TI84P ) ? 0x7f : 0x3f ;
m_ti8x_memory_page_2 = 0;
m_ti8x_memory_page_3 = 0;
m_LCD_memory_base = 0;
@ -365,8 +377,8 @@ MACHINE_START_MEMBER(ti85_state,ti83pse)
m_ti83p_port4 = 1;
m_flash_unlocked = 0;
ti85_state::update_ti83p_memory();
m_maincpu->set_pc(0x8000);
ti85_state::update_ti83pse_memory();
m_maincpu->set_pc(0x8000);//same as above, hack to work around incomplete memory mapping emulation
machine().scheduler().timer_pulse(attotime::from_hz(256), timer_expired_delegate(FUNC(ti85_state::ti83_timer1_callback),this));
@ -376,7 +388,7 @@ MACHINE_START_MEMBER(ti85_state,ti83pse)
m_crystal_timer2 = timer_alloc(CRYSTAL_TIMER2);
m_crystal_timer3 = timer_alloc(CRYSTAL_TIMER3);
/* save states and debugging */
/* save states and debugging */
save_item(NAME(m_ctimer_interrupt_status));
save_item(NAME(m_timer_interrupt_status));
save_item(NAME(m_ti8x_memory_page_0));
@ -386,6 +398,28 @@ MACHINE_START_MEMBER(ti85_state,ti83pse)
save_item(NAME(m_ti83p_port4));
}
MACHINE_START_MEMBER(ti85_state,ti83pse)
{
m_model = TI84PSE;
ti8xpse_init_common();
}
MACHINE_START_MEMBER(ti85_state,ti84pse)
{
m_model = TI83PSE;
ti8xpse_init_common();
}
MACHINE_START_MEMBER(ti85_state,ti84p)
{
m_model = TI84P;
ti8xpse_init_common();
}
MACHINE_START_MEMBER(ti85_state,ti86)
{
address_space &space = m_maincpu->space(AS_PROGRAM);
@ -763,13 +797,28 @@ WRITE8_MEMBER(ti85_state::ti83pse_port_0005_w)
WRITE8_MEMBER(ti85_state::ti83pse_port_0006_w)
{
m_ti8x_memory_page_1 = data; //& ((data&0x80) ? 0x41 : 0x7f);
if ((m_model == TI84P) && (data < 0x80))
{
m_ti8x_memory_page_1 = data & 0x3f;
}
else
{
m_ti8x_memory_page_1 = data;
}
update_ti83pse_memory();
}
WRITE8_MEMBER(ti85_state::ti83pse_port_0007_w)
{
m_ti8x_memory_page_2 = data; //& ((data&0x80) ? 0x41 : 0x7f);
if ((m_model == TI84P) && (data < 0x80))
{
m_ti8x_memory_page_2 = data & 0x3f;
}
else
{
m_ti8x_memory_page_2 = data;
}
update_ti83pse_memory();
}

View File

@ -1067,8 +1067,9 @@ ti83 // 1996 TI-83 (Z80 6 MHz)
ti86 // 1997 TI-86 (Z80 6 MHz)
ti83p // 1999 TI-83 Plus (Z80 6 MHz)
ti83pse // 2001 TI-83 Plus Silver Edition
//ti84p // 2004 TI-84 Plus
ti84p // 2004 TI-84 Plus
ti84pse // 2004 TI-84 Plus Silver Edition
//ti84cse // 2013 TI-84 Plus C Silver Edition (color screen)
ti89 // 1998 TI-89
ti92 // 1995 TI-92
ti92p // 1999 TI-92 Plus