-cpu/e132xs: Implemented pointer error exceptions for recompiler.

* Implemented pointer error exceptions on attempting to use a zero
  address register (other than SR) in the recompiler.
* Also optimised load/store instructions a bit and reduced copy/paste.
* Fixed a couple of disassembler issues.

-misc/dgpix.cpp: Demoted The X-Files to not working with unemulated
 protection.
This commit is contained in:
Vas Crabb 2025-03-30 06:21:27 +11:00
parent bff1ab51d9
commit 27b3384acd
6 changed files with 430 additions and 464 deletions

View File

@ -38,7 +38,7 @@ const char *const SETxx[] =
const char *const Fxxx[] =
{
"FADD", "FADDD", "FSUB", "FSUBD" "FMUL", "FMULD", "FDIV", "FDIVD",
"FADD", "FADDD", "FSUB", "FSUBD", "FMUL", "FMULD", "FDIV", "FDIVD",
"FCMP", "FCMPD", "FCMPU", "FCMPUD", "FCVT", "FCVTD"
};
@ -983,7 +983,7 @@ offs_t hyperstone_disassembler::disassemble(std::ostream &stream, offs_t pc, con
{
uint8_t n = Rn_format(dest, op);
util::stream_format(stream, "SHLI %s, $%x", dest, n);
util::stream_format(stream, "SHLI %s, $%x", dest, n);
break;
}

View File

@ -9,6 +9,8 @@
COMPILE-TIME DEFINITIONS
***************************************************************************/
#define ENABLE_E132XS_DRC (1)
// compilation boundaries -- how far back/forward does the analysis extend?
enum : u32
{
@ -99,6 +101,7 @@ enum
TRAPNO_PARITY_ERROR = 58,
TRAPNO_EXTENDED_OVERFLOW = 59,
TRAPNO_RANGE_ERROR = 60,
TRAPNO_POINTER_ERROR = TRAPNO_RANGE_ERROR,
TRAPNO_PRIVILEGE_ERROR = TRAPNO_RANGE_ERROR,
TRAPNO_FRAME_ERROR = TRAPNO_RANGE_ERROR,
TRAPNO_RESERVED2 = 61,

View File

@ -31,6 +31,9 @@
- GMS30C2232
TODO:
- Pointer error exception on zero address register for interpreter
- Range error exception on store signed byte/half-word
- Fix behaviour of exceptions in delay slots
- Fix behaviour of branches in delay slots
- Many wrong cycle counts
- No emulation of memory access latency and pipleline

View File

@ -11,6 +11,8 @@
#include "cpu/drcuml.h"
#include "cpu/drcumlsh.h"
#include <utility>
/*
A note about clock multipliers and dividers:
@ -34,10 +36,6 @@
#define E132XS_STRICT_VERIFY 0x0001 /* verify all instructions */
#define SINGLE_INSTRUCTION_MODE (0)
#define ENABLE_E132XS_DRC (1)
#define E132XS_LOG_DRC_REGS (0)
#define E132XS_LOG_INTERPRETER_REGS (0)
#define E132XS_COUNT_INSTRUCTIONS (0)
@ -462,9 +460,10 @@ private:
bool generate_opcode(drcuml_block &block, compiler_state &compiler, const opcode_desc *desc);
void generate_get_trap_addr(drcuml_block &block, uml::code_label &label, uml::parameter trapno);
uint32_t generate_get_const(drcuml_block &block, compiler_state &compiler, const opcode_desc *desc);
uint32_t generate_get_immediate_s(drcuml_block &block, compiler_state &compiler, const opcode_desc *desc);
uint32_t generate_get_pcrel(drcuml_block &block, const opcode_desc *desc);
uint32_t generate_get_const(const opcode_desc *desc);
uint32_t generate_get_immediate_s(const opcode_desc *desc);
uint32_t generate_get_pcrel(const opcode_desc *desc);
std::pair<uint16_t, uint32_t> generate_get_d_code_dis(const opcode_desc *opcode);
void generate_get_global_register(drcuml_block &block, compiler_state &compiler, const opcode_desc *desc);
void generate_set_global_register(drcuml_block &block, compiler_state &compiler, const opcode_desc *desc, uint32_t dst_code);
@ -473,6 +472,10 @@ private:
void generate_load_operand(drcuml_block &block, compiler_state &compiler, reg_bank global, uint32_t code, uml::parameter dst, uml::parameter localidx);
void generate_load_src_addsub(drcuml_block &block, compiler_state &compiler, reg_bank global, uint32_t code, uml::parameter dst, uml::parameter localidx, uml::parameter sr);
uml::parameter generate_load_address_ad(drcuml_block &block, compiler_state &compiler, const opcode_desc *desc, reg_bank global, uint32_t code, uml::parameter dst, uml::parameter localidx);
void generate_load_address_ns(drcuml_block &block, compiler_state &compiler, const opcode_desc *desc, reg_bank global, uint32_t code, uml::parameter dst, uml::parameter localidx, uint16_t d_code, uint32_t dis);
void generate_load_address_rp(drcuml_block &block, compiler_state &compiler, uint32_t code, uml::parameter dst, uml::parameter localidx, uint32_t dis);
void generate_add_dis(drcuml_block &block, compiler_state &compiler, uml::parameter dst, uml::parameter base, uint32_t dis, unsigned alignment);
void generate_set_dst(drcuml_block &block, compiler_state &compiler, const opcode_desc *desc, reg_bank global, uint32_t code, uml::parameter src, uml::parameter localidx, bool calcidx);
void generate_update_flags_addsub(drcuml_block &block, compiler_state &compiler, uml::parameter sr);
void generate_update_flags_addsubc(drcuml_block &block, compiler_state &compiler, uml::parameter sr);

File diff suppressed because it is too large Load Diff

View File

@ -992,8 +992,8 @@ void dgpix_bmkey_state::init_btplay2k()
GAME( 1999, elfin, 0, dgpix, dgpix, dgpix_typea_state, init_elfin, ROT0, "dgPIX Entertainment Inc.", "Elfin", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
GAME( 1999, jumpjump, 0, dgpix, dgpix, dgpix_typea_state, init_jumpjump, ROT0, "dgPIX Entertainment Inc.", "Jump Jump", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
GAME( 1999, xfiles, 0, dgpix, dgpix, dgpix_typea_state, init_xfiles, ROT0, "dgPIX Entertainment Inc.", "The X-Files", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
GAME( 1999, xfilesk, xfiles, dgpix, dgpix, dgpix_typea_state, init_xfilesk, ROT0, "dgPIX Entertainment Inc.", "The X-Files (Censored, Korea)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
GAME( 1999, xfiles, 0, dgpix, dgpix, dgpix_typea_state, init_xfiles, ROT0, "dgPIX Entertainment Inc.", "The X-Files", MACHINE_NOT_WORKING | MACHINE_UNEMULATED_PROTECTION | MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
GAME( 1999, xfilesk, xfiles, dgpix, dgpix, dgpix_typea_state, init_xfilesk, ROT0, "dgPIX Entertainment Inc.", "The X-Files (censored, Korea)", MACHINE_NOT_WORKING | MACHINE_UNEMULATED_PROTECTION | MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
GAME( 1999, kdynastg, 0, dgpix_kdynastg, dgpix, dgpix_typea_state, init_kdynastg, ROT0, "EZ Graphics", "King of Dynast Gear (version 1.8)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
GAME( 1999, letsdnce, 0, dgpix, letsdnce, dgpix_bmkey_state, init_letsdnce, ROT0, "dgPIX Entertainment Inc.", "Let's Dance", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
GAME( 2000, btplay2k, 0, dgpix, btplay2k, dgpix_bmkey_state, init_btplay2k, ROT0, "dgPIX Entertainment Inc.", "Beat Player 2000", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )