summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Jon Sturm <jonimoose@gmail.com>2014-10-24 16:20:00 -0500
committer Jon Sturm <jonimoose@gmail.com>2014-10-24 16:20:00 -0500
commit947d3960103a0ca4c1b507b3ea499d9042e28c61 (patch)
tree27cc3684d03be0fc3992895939f61ceb628ea7a6
parent9867043d73f42342fbcc87c4b06af3cf9033db56 (diff)
(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.
-rwxr-xr-x[-rw-r--r--]src/mess/drivers/ti85.c38
-rwxr-xr-x[-rw-r--r--]src/mess/includes/ti85.h11
-rwxr-xr-x[-rw-r--r--]src/mess/machine/ti85.c101
-rw-r--r--src/mess/mess.lst3
4 files changed, 114 insertions, 39 deletions
diff --git a/src/mess/drivers/ti85.c b/src/mess/drivers/ti85.c
index 87c667233b2..ca7e6658d3e 100644..100755
--- a/src/mess/drivers/ti85.c
+++ b/src/mess/drivers/ti85.c
@@ -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 )
diff --git a/src/mess/includes/ti85.h b/src/mess/includes/ti85.h
index ffec16c1c95..40c98d9ea52 100644..100755
--- a/src/mess/includes/ti85.h
+++ b/src/mess/includes/ti85.h
@@ -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);
diff --git a/src/mess/machine/ti85.c b/src/mess/machine/ti85.c
index 60293e973c8..44fc0d0ae9f 100644..100755
--- a/src/mess/machine/ti85.c
+++ b/src/mess/machine/ti85.c
@@ -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;
- 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;
+ 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_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();
}
diff --git a/src/mess/mess.lst b/src/mess/mess.lst
index 2a878093bd0..ba231c948a7 100644
--- a/src/mess/mess.lst
+++ b/src/mess/mess.lst
@@ -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