From 6f99dba4254cedc1cfe4e29cdcaf0a4194d3023e Mon Sep 17 00:00:00 2001 From: Jon Sturm Date: Mon, 27 Oct 2014 18:50:42 -0500 Subject: ti85: use direct update handler to remove boot memory mapping hacks This allows the flash calculators to properly reset pc to 0x0000 instead of 0x8000 and properly reset all memory banks to page 0x00. --- src/mess/includes/ti85.h | 3 ++- src/mess/machine/ti85.c | 51 ++++++++++++++++++++++++------------------------ 2 files changed, 27 insertions(+), 27 deletions(-) diff --git a/src/mess/includes/ti85.h b/src/mess/includes/ti85.h index 40c98d9ea52..e967101f034 100755 --- a/src/mess/includes/ti85.h +++ b/src/mess/includes/ti85.h @@ -86,10 +86,10 @@ public: UINT8 m_ON_interrupt_status; UINT8 m_ON_pressed; UINT8 m_flash_unlocked; - UINT8 m_ti8x_memory_page_0; UINT8 m_ti8x_memory_page_1; UINT8 m_ti8x_memory_page_2; UINT8 m_ti8x_memory_page_3; + bool m_booting; UINT8 m_LCD_mask; UINT8 m_power_mode; UINT8 m_cpu_speed; @@ -217,6 +217,7 @@ public: void ti85_setup_snapshot (UINT8 * data); void ti86_setup_snapshot (UINT8 * data); DECLARE_SNAPSHOT_LOAD_MEMBER( ti8x ); + DECLARE_DIRECT_UPDATE_MEMBER( ti83p_direct_update_handler ); ti83pse_timer m_ctimer[3]; diff --git a/src/mess/machine/ti85.c b/src/mess/machine/ti85.c index 44fc0d0ae9f..90c8577394d 100755 --- a/src/mess/machine/ti85.c +++ b/src/mess/machine/ti85.c @@ -154,7 +154,7 @@ void ti85_state::update_ti83p_memory () { //address_space &space = m_maincpu->space(AS_PROGRAM); - m_membank1->set_bank(0); //Always flash page 0, well allmost + m_membank1->set_bank(m_booting ? 0x1f : 0); //Always flash page 0, well allmost if (m_ti83p_port4 & 1) { @@ -182,7 +182,7 @@ void ti85_state::update_ti83pse_memory () { //address_space &space = m_maincpu->space(AS_PROGRAM); - m_membank1->set_bank(m_ti8x_memory_page_0); + m_membank1->set_bank(m_booting ? (m_model==TI84P ? 0x3f : 0x7f) : 0); if (m_ti83p_port4 & 1) { @@ -273,30 +273,32 @@ MACHINE_RESET_MEMBER(ti85_state,ti85) m_PCR = 0xc0; } +DIRECT_UPDATE_MEMBER(ti85_state::ti83p_direct_update_handler) +{ + if (m_booting) + { + if (((m_ti83p_port4 & 1) && (address >= 0x4000 && address < 0xc000)) || (address >= 0x4000 && address < 0x8000)) + { + m_booting = false; + update_ti83p_memory(); + } + } + return address; +} + + MACHINE_RESET_MEMBER(ti85_state,ti83p) { m_red_out = 0x00; m_white_out = 0x00; m_PCR = 0xc0; - m_ti8x_memory_page_0 = 0;//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_1 = 0; m_ti8x_memory_page_2 = 0; m_ti8x_memory_page_3 = 0; m_ti83p_port4 = 1; + m_booting = true; if (m_model == TI83P) { update_ti83p_memory(); @@ -305,8 +307,6 @@ MACHINE_RESET_MEMBER(ti85_state,ti83p) { update_ti83pse_memory(); } - - m_maincpu->set_pc(0x8000); } MACHINE_START_MEMBER(ti85_state,ti83p) @@ -314,14 +314,14 @@ MACHINE_START_MEMBER(ti85_state,ti83p) m_model = TI83P; //address_space &space = m_maincpu->space(AS_PROGRAM); //m_bios = memregion("flash")->base(); + m_maincpu->space(AS_PROGRAM).set_direct_update_handler(direct_update_delegate(FUNC(ti85_state::ti83p_direct_update_handler), this)); m_timer_interrupt_mask = 0; m_timer_interrupt_status = 0; m_ON_interrupt_mask = 0; m_ON_interrupt_status = 0; m_ON_pressed = 0; - m_ti8x_memory_page_0 = 0;//0x1f; - m_ti8x_memory_page_1 = 0x1f; + m_ti8x_memory_page_1 = 0; m_ti8x_memory_page_2 = 0; m_ti8x_memory_page_3 = 0; m_LCD_memory_base = 0; @@ -334,8 +334,9 @@ MACHINE_START_MEMBER(ti85_state,ti83p) m_ti83p_port4 = 1; m_flash_unlocked = 0; + m_booting = true; + 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)); @@ -345,11 +346,11 @@ MACHINE_START_MEMBER(ti85_state,ti83p) /* 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)); save_item(NAME(m_ti8x_memory_page_3)); save_item(NAME(m_ti83p_port4)); + save_item(NAME(m_booting)); } void ti85_state::ti8xpse_init_common() @@ -363,8 +364,7 @@ void ti85_state::ti8xpse_init_common() m_ON_interrupt_mask = 0; m_ON_interrupt_status = 0; m_ON_pressed = 0; - m_ti8x_memory_page_0 = 00;//0x7f; - m_ti8x_memory_page_1 = (m_model != TI84P ) ? 0x7f : 0x3f ; + m_ti8x_memory_page_1 = 0; m_ti8x_memory_page_2 = 0; m_ti8x_memory_page_3 = 0; m_LCD_memory_base = 0; @@ -378,7 +378,7 @@ void ti85_state::ti8xpse_init_common() m_flash_unlocked = 0; ti85_state::update_ti83pse_memory(); - m_maincpu->set_pc(0x8000);//same as above, hack to work around incomplete memory mapping emulation + m_maincpu->space(AS_PROGRAM).set_direct_update_handler(direct_update_delegate(FUNC(ti85_state::ti83p_direct_update_handler), this)); machine().scheduler().timer_pulse(attotime::from_hz(256), timer_expired_delegate(FUNC(ti85_state::ti83_timer1_callback),this)); @@ -391,7 +391,6 @@ void ti85_state::ti8xpse_init_common() /* 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)); save_item(NAME(m_ti8x_memory_page_1)); save_item(NAME(m_ti8x_memory_page_2)); save_item(NAME(m_ti8x_memory_page_3)); -- cgit v1.2.3