1 // license:BSD-3-Clause 2 // copyright-holders:Aaron Giles 3 /*************************************************************************** 4 5 tms32031.h 6 7 TMS320C3x family 32-bit floating point DSP emulator 8 9 ***************************************************************************/ 10 11 #ifndef MAME_CPU_TMS32031_TMS32031_H 12 #define MAME_CPU_TMS32031_TMS32031_H 13 14 #pragma once 15 16 17 //************************************************************************** 18 // DEBUGGING 19 //************************************************************************** 20 21 #define TMS_3203X_LOG_OPCODE_USAGE (0) 22 23 24 25 //************************************************************************** 26 // CONSTANTS 27 //************************************************************************** 28 29 // interrupts 30 const int TMS3203X_IRQ0 = 0; // IRQ0 31 const int TMS3203X_IRQ1 = 1; // IRQ1 32 const int TMS3203X_IRQ2 = 2; // IRQ2 33 const int TMS3203X_IRQ3 = 3; // IRQ3 34 const int TMS3203X_XINT0 = 4; // serial 0 transmit interrupt 35 const int TMS3203X_RINT0 = 5; // serial 0 receive interrupt 36 const int TMS3203X_XINT1 = 6; // serial 1 transmit interrupt 37 const int TMS3203X_RINT1 = 7; // serial 1 receive interrupt 38 const int TMS3203X_TINT0 = 8; // timer 0 interrupt 39 const int TMS3203X_TINT1 = 9; // timer 1 interrupt 40 const int TMS3203X_DINT = 10; // DMA interrupt 41 const int TMS3203X_DINT0 = 10; // DMA 0 interrupt (32032 only) 42 const int TMS3203X_DINT1 = 11; // DMA 1 interrupt (32032 only) 43 const int TMS3203X_MCBL = 12; // Microcomputer/boot loader mode 44 const int TMS3203X_HOLD = 13; // Primary bus interface hold signal 45 46 // register enumeration 47 enum 48 { 49 TMS3203X_PC=1, 50 TMS3203X_R0, 51 TMS3203X_R1, 52 TMS3203X_R2, 53 TMS3203X_R3, 54 TMS3203X_R4, 55 TMS3203X_R5, 56 TMS3203X_R6, 57 TMS3203X_R7, 58 TMS3203X_R0F, 59 TMS3203X_R1F, 60 TMS3203X_R2F, 61 TMS3203X_R3F, 62 TMS3203X_R4F, 63 TMS3203X_R5F, 64 TMS3203X_R6F, 65 TMS3203X_R7F, 66 TMS3203X_AR0, 67 TMS3203X_AR1, 68 TMS3203X_AR2, 69 TMS3203X_AR3, 70 TMS3203X_AR4, 71 TMS3203X_AR5, 72 TMS3203X_AR6, 73 TMS3203X_AR7, 74 TMS3203X_DP, 75 TMS3203X_IR0, 76 TMS3203X_IR1, 77 TMS3203X_BK, 78 TMS3203X_SP, 79 TMS3203X_ST, 80 TMS3203X_IE, 81 TMS3203X_IF, 82 TMS3203X_IOF, 83 TMS3203X_RS, 84 TMS3203X_RE, 85 TMS3203X_RC 86 }; 87 88 89 90 //************************************************************************** 91 // TYPE DEFINITIONS 92 //************************************************************************** 93 94 // ======================> tms3203x_device 95 96 class tms3203x_device : public cpu_device 97 { 98 struct tmsreg 99 { 100 // constructors tmsregtmsreg101 tmsreg() { i32[0] = i32[1] = 0; } tmsregtmsreg102 tmsreg(double value) { from_double(value); } tmsregtmsreg103 tmsreg(int32_t mantissa, int8_t exponent) { set_mantissa(mantissa); set_exponent(exponent); } 104 105 // getters integertmsreg106 uint32_t integer() const { return i32[0]; } mantissatmsreg107 int32_t mantissa() const { return i32[0]; } exponenttmsreg108 int8_t exponent() const { return i32[1]; } set_mantissatmsreg109 void set_mantissa(int32_t man) { i32[0] = man; } set_exponenttmsreg110 void set_exponent(int8_t exp) { i32[1] = exp; } 111 112 // exporters 113 float as_float() const; 114 double as_double() const; 115 116 // importers 117 void from_double(double); 118 119 uint32_t i32[2]; 120 }; 121 122 public: 123 virtual ~tms3203x_device(); 124 125 // inline configuration helpers set_mcbl_mode(bool mode)126 void set_mcbl_mode(bool mode) { m_mcbl_mode = mode; } xf0()127 auto xf0() { return m_xf0_cb.bind(); } xf1()128 auto xf1() { return m_xf1_cb.bind(); } iack()129 auto iack() { return m_iack_cb.bind(); } holda()130 auto holda() { return m_holda_cb.bind(); } 131 132 // public interfaces 133 static float fp_to_float(uint32_t floatdata); 134 static double fp_to_double(uint32_t floatdata); 135 static uint32_t float_to_fp(float fval); 136 static uint32_t double_to_fp(double dval); 137 138 protected: 139 enum 140 { 141 CHIP_TYPE_TMS32030, 142 CHIP_TYPE_TMS32031, 143 CHIP_TYPE_TMS32032 144 }; 145 146 // construction/destruction 147 tms3203x_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, uint32_t chiptype, address_map_constructor internal_map); 148 void common_3203x(address_map &map); 149 150 // device-level overrides 151 virtual void device_start() override; 152 virtual void device_reset() override; 153 154 virtual const tiny_rom_entry *device_rom_region() const override; 155 156 // device_execute_interface overrides 157 virtual uint32_t execute_min_cycles() const noexcept override; 158 virtual uint32_t execute_max_cycles() const noexcept override; 159 virtual uint32_t execute_input_lines() const noexcept override; 160 virtual void execute_run() override; 161 virtual void execute_set_input(int inputnum, int state) override; 162 163 // device_memory_interface overrides 164 virtual space_config_vector memory_space_config() const override; 165 166 // device_state_interface overrides 167 virtual void state_import(const device_state_entry &entry) override; 168 virtual void state_export(const device_state_entry &entry) override; 169 virtual void state_string_export(const device_state_entry &entry, std::string &str) const override; 170 171 // device_disasm_interface overrides 172 virtual std::unique_ptr<util::disasm_interface> create_disassembler() override; 173 174 // internal peripheral device handlers primary_bus_control_r()175 uint32_t primary_bus_control_r() { return m_primary_bus_control; } 176 void primary_bus_control_w(offs_t offset, uint32_t data, uint32_t mem_mask = ~0); 177 178 // memory helpers 179 uint32_t ROPCODE(offs_t pc); 180 uint32_t RMEM(offs_t addr); 181 void WMEM(offs_t addr, uint32_t data); 182 183 // misc helpers 184 void check_irqs(); 185 void execute_one(); 186 void update_special(int dreg); 187 bool condition(int which); 188 189 // floating point helpers 190 void int2float(tmsreg &srcdst); 191 void float2int(tmsreg &srcdst, bool setflags); 192 void negf(tmsreg &dst, tmsreg &src); 193 void addf(tmsreg &dst, tmsreg &src1, tmsreg &src2); 194 void subf(tmsreg &dst, tmsreg &src1, tmsreg &src2); 195 void mpyf(tmsreg &dst, tmsreg &src1, tmsreg &src2); 196 void norm(tmsreg &dst, tmsreg &src); 197 198 // memory addressing 199 uint32_t mod00_d(uint32_t op, uint8_t ar); 200 uint32_t mod01_d(uint32_t op, uint8_t ar); 201 uint32_t mod02_d(uint32_t op, uint8_t ar); 202 uint32_t mod03_d(uint32_t op, uint8_t ar); 203 uint32_t mod04_d(uint32_t op, uint8_t ar); 204 uint32_t mod05_d(uint32_t op, uint8_t ar); 205 uint32_t mod06_d(uint32_t op, uint8_t ar); 206 uint32_t mod07_d(uint32_t op, uint8_t ar); 207 208 uint32_t mod00_1(uint32_t op, uint8_t ar); 209 uint32_t mod01_1(uint32_t op, uint8_t ar); 210 uint32_t mod02_1(uint32_t op, uint8_t ar); 211 uint32_t mod03_1(uint32_t op, uint8_t ar); 212 uint32_t mod04_1(uint32_t op, uint8_t ar); 213 uint32_t mod05_1(uint32_t op, uint8_t ar); 214 uint32_t mod06_1(uint32_t op, uint8_t ar); 215 uint32_t mod07_1(uint32_t op, uint8_t ar); 216 217 uint32_t mod08(uint32_t op, uint8_t ar); 218 uint32_t mod09(uint32_t op, uint8_t ar); 219 uint32_t mod0a(uint32_t op, uint8_t ar); 220 uint32_t mod0b(uint32_t op, uint8_t ar); 221 uint32_t mod0c(uint32_t op, uint8_t ar); 222 uint32_t mod0d(uint32_t op, uint8_t ar); 223 uint32_t mod0e(uint32_t op, uint8_t ar); 224 uint32_t mod0f(uint32_t op, uint8_t ar); 225 226 uint32_t mod10(uint32_t op, uint8_t ar); 227 uint32_t mod11(uint32_t op, uint8_t ar); 228 uint32_t mod12(uint32_t op, uint8_t ar); 229 uint32_t mod13(uint32_t op, uint8_t ar); 230 uint32_t mod14(uint32_t op, uint8_t ar); 231 uint32_t mod15(uint32_t op, uint8_t ar); 232 uint32_t mod16(uint32_t op, uint8_t ar); 233 uint32_t mod17(uint32_t op, uint8_t ar); 234 235 uint32_t mod18(uint32_t op, uint8_t ar); 236 uint32_t mod19(uint32_t op, uint8_t ar); 237 uint32_t modillegal(uint32_t op, uint8_t ar); 238 239 uint32_t mod00_1_def(uint32_t op, uint8_t ar, uint32_t *&defptrptr); 240 uint32_t mod01_1_def(uint32_t op, uint8_t ar, uint32_t *&defptrptr); 241 uint32_t mod02_1_def(uint32_t op, uint8_t ar, uint32_t *&defptrptr); 242 uint32_t mod03_1_def(uint32_t op, uint8_t ar, uint32_t *&defptrptr); 243 uint32_t mod04_1_def(uint32_t op, uint8_t ar, uint32_t *&defptrptr); 244 uint32_t mod05_1_def(uint32_t op, uint8_t ar, uint32_t *&defptrptr); 245 uint32_t mod06_1_def(uint32_t op, uint8_t ar, uint32_t *&defptrptr); 246 uint32_t mod07_1_def(uint32_t op, uint8_t ar, uint32_t *&defptrptr); 247 248 uint32_t mod08_def(uint32_t op, uint8_t ar, uint32_t *&defptrptr); 249 uint32_t mod09_def(uint32_t op, uint8_t ar, uint32_t *&defptrptr); 250 uint32_t mod0a_def(uint32_t op, uint8_t ar, uint32_t *&defptrptr); 251 uint32_t mod0b_def(uint32_t op, uint8_t ar, uint32_t *&defptrptr); 252 uint32_t mod0c_def(uint32_t op, uint8_t ar, uint32_t *&defptrptr); 253 uint32_t mod0d_def(uint32_t op, uint8_t ar, uint32_t *&defptrptr); 254 uint32_t mod0e_def(uint32_t op, uint8_t ar, uint32_t *&defptrptr); 255 uint32_t mod0f_def(uint32_t op, uint8_t ar, uint32_t *&defptrptr); 256 257 uint32_t mod10_def(uint32_t op, uint8_t ar, uint32_t *&defptrptr); 258 uint32_t mod11_def(uint32_t op, uint8_t ar, uint32_t *&defptrptr); 259 uint32_t mod12_def(uint32_t op, uint8_t ar, uint32_t *&defptrptr); 260 uint32_t mod13_def(uint32_t op, uint8_t ar, uint32_t *&defptrptr); 261 uint32_t mod14_def(uint32_t op, uint8_t ar, uint32_t *&defptrptr); 262 uint32_t mod15_def(uint32_t op, uint8_t ar, uint32_t *&defptrptr); 263 uint32_t mod16_def(uint32_t op, uint8_t ar, uint32_t *&defptrptr); 264 uint32_t mod17_def(uint32_t op, uint8_t ar, uint32_t *&defptrptr); 265 uint32_t mod18_def(uint32_t op, uint8_t ar, uint32_t *&defptrptr); 266 uint32_t mod19_def(uint32_t op, uint8_t ar, uint32_t *&defptrptr); 267 uint32_t modillegal_def(uint32_t op, uint8_t ar, uint32_t *&defptrptr); 268 269 // instructions 270 void illegal(uint32_t op); 271 void unimplemented(uint32_t op); 272 273 void absf_reg(uint32_t op); 274 void absf_dir(uint32_t op); 275 void absf_ind(uint32_t op); 276 void absf_imm(uint32_t op); 277 void absi_reg(uint32_t op); 278 void absi_dir(uint32_t op); 279 void absi_ind(uint32_t op); 280 void absi_imm(uint32_t op); 281 void addc_reg(uint32_t op); 282 void addc_dir(uint32_t op); 283 void addc_ind(uint32_t op); 284 void addc_imm(uint32_t op); 285 void addf_reg(uint32_t op); 286 void addf_dir(uint32_t op); 287 void addf_ind(uint32_t op); 288 void addf_imm(uint32_t op); 289 void addi_reg(uint32_t op); 290 void addi_dir(uint32_t op); 291 void addi_ind(uint32_t op); 292 void addi_imm(uint32_t op); 293 void and_reg(uint32_t op); 294 void and_dir(uint32_t op); 295 void and_ind(uint32_t op); 296 void and_imm(uint32_t op); 297 void andn_reg(uint32_t op); 298 void andn_dir(uint32_t op); 299 void andn_ind(uint32_t op); 300 void andn_imm(uint32_t op); 301 void ash_reg(uint32_t op); 302 void ash_dir(uint32_t op); 303 void ash_ind(uint32_t op); 304 void ash_imm(uint32_t op); 305 void cmpf_reg(uint32_t op); 306 void cmpf_dir(uint32_t op); 307 void cmpf_ind(uint32_t op); 308 void cmpf_imm(uint32_t op); 309 void cmpi_reg(uint32_t op); 310 void cmpi_dir(uint32_t op); 311 void cmpi_ind(uint32_t op); 312 void cmpi_imm(uint32_t op); 313 void fix_reg(uint32_t op); 314 void fix_dir(uint32_t op); 315 void fix_ind(uint32_t op); 316 void fix_imm(uint32_t op); 317 void float_reg(uint32_t op); 318 void float_dir(uint32_t op); 319 void float_ind(uint32_t op); 320 void float_imm(uint32_t op); 321 void idle(uint32_t op); 322 void lde_reg(uint32_t op); 323 void lde_dir(uint32_t op); 324 void lde_ind(uint32_t op); 325 void lde_imm(uint32_t op); 326 void ldf_reg(uint32_t op); 327 void ldf_dir(uint32_t op); 328 void ldf_ind(uint32_t op); 329 void ldf_imm(uint32_t op); 330 void ldfi_dir(uint32_t op); 331 void ldfi_ind(uint32_t op); 332 void ldi_reg(uint32_t op); 333 void ldi_dir(uint32_t op); 334 void ldi_ind(uint32_t op); 335 void ldi_imm(uint32_t op); 336 void ldii_dir(uint32_t op); 337 void ldii_ind(uint32_t op); 338 void ldm_reg(uint32_t op); 339 void ldm_dir(uint32_t op); 340 void ldm_ind(uint32_t op); 341 void ldm_imm(uint32_t op); 342 void lsh_reg(uint32_t op); 343 void lsh_dir(uint32_t op); 344 void lsh_ind(uint32_t op); 345 void lsh_imm(uint32_t op); 346 void mpyf_reg(uint32_t op); 347 void mpyf_dir(uint32_t op); 348 void mpyf_ind(uint32_t op); 349 void mpyf_imm(uint32_t op); 350 void mpyi_reg(uint32_t op); 351 void mpyi_dir(uint32_t op); 352 void mpyi_ind(uint32_t op); 353 void mpyi_imm(uint32_t op); 354 void negb_reg(uint32_t op); 355 void negb_dir(uint32_t op); 356 void negb_ind(uint32_t op); 357 void negb_imm(uint32_t op); 358 void negf_reg(uint32_t op); 359 void negf_dir(uint32_t op); 360 void negf_ind(uint32_t op); 361 void negf_imm(uint32_t op); 362 void negi_reg(uint32_t op); 363 void negi_dir(uint32_t op); 364 void negi_ind(uint32_t op); 365 void negi_imm(uint32_t op); 366 void nop_reg(uint32_t op); 367 void nop_ind(uint32_t op); 368 void norm_reg(uint32_t op); 369 void norm_dir(uint32_t op); 370 void norm_ind(uint32_t op); 371 void norm_imm(uint32_t op); 372 void not_reg(uint32_t op); 373 void not_dir(uint32_t op); 374 void not_ind(uint32_t op); 375 void not_imm(uint32_t op); 376 void pop(uint32_t op); 377 void popf(uint32_t op); 378 void push(uint32_t op); 379 void pushf(uint32_t op); 380 void or_reg(uint32_t op); 381 void or_dir(uint32_t op); 382 void or_ind(uint32_t op); 383 void or_imm(uint32_t op); 384 void maxspeed(uint32_t op); 385 void rnd_reg(uint32_t op); 386 void rnd_dir(uint32_t op); 387 void rnd_ind(uint32_t op); 388 void rnd_imm(uint32_t op); 389 void rol(uint32_t op); 390 void rolc(uint32_t op); 391 void ror(uint32_t op); 392 void rorc(uint32_t op); 393 void rpts_reg(uint32_t op); 394 void rpts_dir(uint32_t op); 395 void rpts_ind(uint32_t op); 396 void rpts_imm(uint32_t op); 397 void stf_dir(uint32_t op); 398 void stf_ind(uint32_t op); 399 void stfi_dir(uint32_t op); 400 void stfi_ind(uint32_t op); 401 void sti_dir(uint32_t op); 402 void sti_ind(uint32_t op); 403 void stii_dir(uint32_t op); 404 void stii_ind(uint32_t op); 405 void sigi(uint32_t op); 406 void subb_reg(uint32_t op); 407 void subb_dir(uint32_t op); 408 void subb_ind(uint32_t op); 409 void subb_imm(uint32_t op); 410 void subc_reg(uint32_t op); 411 void subc_dir(uint32_t op); 412 void subc_ind(uint32_t op); 413 void subc_imm(uint32_t op); 414 void subf_reg(uint32_t op); 415 void subf_dir(uint32_t op); 416 void subf_ind(uint32_t op); 417 void subf_imm(uint32_t op); 418 void subi_reg(uint32_t op); 419 void subi_dir(uint32_t op); 420 void subi_ind(uint32_t op); 421 void subi_imm(uint32_t op); 422 void subrb_reg(uint32_t op); 423 void subrb_dir(uint32_t op); 424 void subrb_ind(uint32_t op); 425 void subrb_imm(uint32_t op); 426 void subrf_reg(uint32_t op); 427 void subrf_dir(uint32_t op); 428 void subrf_ind(uint32_t op); 429 void subrf_imm(uint32_t op); 430 void subri_reg(uint32_t op); 431 void subri_dir(uint32_t op); 432 void subri_ind(uint32_t op); 433 void subri_imm(uint32_t op); 434 void tstb_reg(uint32_t op); 435 void tstb_dir(uint32_t op); 436 void tstb_ind(uint32_t op); 437 void tstb_imm(uint32_t op); 438 void xor_reg(uint32_t op); 439 void xor_dir(uint32_t op); 440 void xor_ind(uint32_t op); 441 void xor_imm(uint32_t op); 442 void iack_dir(uint32_t op); 443 void iack_ind(uint32_t op); 444 void addc3_regreg(uint32_t op); 445 void addc3_indreg(uint32_t op); 446 void addc3_regind(uint32_t op); 447 void addc3_indind(uint32_t op); 448 void addf3_regreg(uint32_t op); 449 void addf3_indreg(uint32_t op); 450 void addf3_regind(uint32_t op); 451 void addf3_indind(uint32_t op); 452 void addi3_regreg(uint32_t op); 453 void addi3_indreg(uint32_t op); 454 void addi3_regind(uint32_t op); 455 void addi3_indind(uint32_t op); 456 void and3_regreg(uint32_t op); 457 void and3_indreg(uint32_t op); 458 void and3_regind(uint32_t op); 459 void and3_indind(uint32_t op); 460 void andn3_regreg(uint32_t op); 461 void andn3_indreg(uint32_t op); 462 void andn3_regind(uint32_t op); 463 void andn3_indind(uint32_t op); 464 void ash3_regreg(uint32_t op); 465 void ash3_indreg(uint32_t op); 466 void ash3_regind(uint32_t op); 467 void ash3_indind(uint32_t op); 468 void cmpf3_regreg(uint32_t op); 469 void cmpf3_indreg(uint32_t op); 470 void cmpf3_regind(uint32_t op); 471 void cmpf3_indind(uint32_t op); 472 void cmpi3_regreg(uint32_t op); 473 void cmpi3_indreg(uint32_t op); 474 void cmpi3_regind(uint32_t op); 475 void cmpi3_indind(uint32_t op); 476 void lsh3_regreg(uint32_t op); 477 void lsh3_indreg(uint32_t op); 478 void lsh3_regind(uint32_t op); 479 void lsh3_indind(uint32_t op); 480 void mpyf3_regreg(uint32_t op); 481 void mpyf3_indreg(uint32_t op); 482 void mpyf3_regind(uint32_t op); 483 void mpyf3_indind(uint32_t op); 484 void mpyi3_regreg(uint32_t op); 485 void mpyi3_indreg(uint32_t op); 486 void mpyi3_regind(uint32_t op); 487 void mpyi3_indind(uint32_t op); 488 void or3_regreg(uint32_t op); 489 void or3_indreg(uint32_t op); 490 void or3_regind(uint32_t op); 491 void or3_indind(uint32_t op); 492 void subb3_regreg(uint32_t op); 493 void subb3_indreg(uint32_t op); 494 void subb3_regind(uint32_t op); 495 void subb3_indind(uint32_t op); 496 void subf3_regreg(uint32_t op); 497 void subf3_indreg(uint32_t op); 498 void subf3_regind(uint32_t op); 499 void subf3_indind(uint32_t op); 500 void subi3_regreg(uint32_t op); 501 void subi3_indreg(uint32_t op); 502 void subi3_regind(uint32_t op); 503 void subi3_indind(uint32_t op); 504 void tstb3_regreg(uint32_t op); 505 void tstb3_indreg(uint32_t op); 506 void tstb3_regind(uint32_t op); 507 void tstb3_indind(uint32_t op); 508 void xor3_regreg(uint32_t op); 509 void xor3_indreg(uint32_t op); 510 void xor3_regind(uint32_t op); 511 void xor3_indind(uint32_t op); 512 void ldfu_reg(uint32_t op); 513 void ldfu_dir(uint32_t op); 514 void ldfu_ind(uint32_t op); 515 void ldfu_imm(uint32_t op); 516 void ldflo_reg(uint32_t op); 517 void ldflo_dir(uint32_t op); 518 void ldflo_ind(uint32_t op); 519 void ldflo_imm(uint32_t op); 520 void ldfls_reg(uint32_t op); 521 void ldfls_dir(uint32_t op); 522 void ldfls_ind(uint32_t op); 523 void ldfls_imm(uint32_t op); 524 void ldfhi_reg(uint32_t op); 525 void ldfhi_dir(uint32_t op); 526 void ldfhi_ind(uint32_t op); 527 void ldfhi_imm(uint32_t op); 528 void ldfhs_reg(uint32_t op); 529 void ldfhs_dir(uint32_t op); 530 void ldfhs_ind(uint32_t op); 531 void ldfhs_imm(uint32_t op); 532 void ldfeq_reg(uint32_t op); 533 void ldfeq_dir(uint32_t op); 534 void ldfeq_ind(uint32_t op); 535 void ldfeq_imm(uint32_t op); 536 void ldfne_reg(uint32_t op); 537 void ldfne_dir(uint32_t op); 538 void ldfne_ind(uint32_t op); 539 void ldfne_imm(uint32_t op); 540 void ldflt_reg(uint32_t op); 541 void ldflt_dir(uint32_t op); 542 void ldflt_ind(uint32_t op); 543 void ldflt_imm(uint32_t op); 544 void ldfle_reg(uint32_t op); 545 void ldfle_dir(uint32_t op); 546 void ldfle_ind(uint32_t op); 547 void ldfle_imm(uint32_t op); 548 void ldfgt_reg(uint32_t op); 549 void ldfgt_dir(uint32_t op); 550 void ldfgt_ind(uint32_t op); 551 void ldfgt_imm(uint32_t op); 552 void ldfge_reg(uint32_t op); 553 void ldfge_dir(uint32_t op); 554 void ldfge_ind(uint32_t op); 555 void ldfge_imm(uint32_t op); 556 void ldfnv_reg(uint32_t op); 557 void ldfnv_dir(uint32_t op); 558 void ldfnv_ind(uint32_t op); 559 void ldfnv_imm(uint32_t op); 560 void ldfv_reg(uint32_t op); 561 void ldfv_dir(uint32_t op); 562 void ldfv_ind(uint32_t op); 563 void ldfv_imm(uint32_t op); 564 void ldfnuf_reg(uint32_t op); 565 void ldfnuf_dir(uint32_t op); 566 void ldfnuf_ind(uint32_t op); 567 void ldfnuf_imm(uint32_t op); 568 void ldfuf_reg(uint32_t op); 569 void ldfuf_dir(uint32_t op); 570 void ldfuf_ind(uint32_t op); 571 void ldfuf_imm(uint32_t op); 572 void ldfnlv_reg(uint32_t op); 573 void ldfnlv_dir(uint32_t op); 574 void ldfnlv_ind(uint32_t op); 575 void ldfnlv_imm(uint32_t op); 576 void ldflv_reg(uint32_t op); 577 void ldflv_dir(uint32_t op); 578 void ldflv_ind(uint32_t op); 579 void ldflv_imm(uint32_t op); 580 void ldfnluf_reg(uint32_t op); 581 void ldfnluf_dir(uint32_t op); 582 void ldfnluf_ind(uint32_t op); 583 void ldfnluf_imm(uint32_t op); 584 void ldfluf_reg(uint32_t op); 585 void ldfluf_dir(uint32_t op); 586 void ldfluf_ind(uint32_t op); 587 void ldfluf_imm(uint32_t op); 588 void ldfzuf_reg(uint32_t op); 589 void ldfzuf_dir(uint32_t op); 590 void ldfzuf_ind(uint32_t op); 591 void ldfzuf_imm(uint32_t op); 592 void ldiu_reg(uint32_t op); 593 void ldiu_dir(uint32_t op); 594 void ldiu_ind(uint32_t op); 595 void ldiu_imm(uint32_t op); 596 void ldilo_reg(uint32_t op); 597 void ldilo_dir(uint32_t op); 598 void ldilo_ind(uint32_t op); 599 void ldilo_imm(uint32_t op); 600 void ldils_reg(uint32_t op); 601 void ldils_dir(uint32_t op); 602 void ldils_ind(uint32_t op); 603 void ldils_imm(uint32_t op); 604 void ldihi_reg(uint32_t op); 605 void ldihi_dir(uint32_t op); 606 void ldihi_ind(uint32_t op); 607 void ldihi_imm(uint32_t op); 608 void ldihs_reg(uint32_t op); 609 void ldihs_dir(uint32_t op); 610 void ldihs_ind(uint32_t op); 611 void ldihs_imm(uint32_t op); 612 void ldieq_reg(uint32_t op); 613 void ldieq_dir(uint32_t op); 614 void ldieq_ind(uint32_t op); 615 void ldieq_imm(uint32_t op); 616 void ldine_reg(uint32_t op); 617 void ldine_dir(uint32_t op); 618 void ldine_ind(uint32_t op); 619 void ldine_imm(uint32_t op); 620 void ldilt_reg(uint32_t op); 621 void ldilt_dir(uint32_t op); 622 void ldilt_ind(uint32_t op); 623 void ldilt_imm(uint32_t op); 624 void ldile_reg(uint32_t op); 625 void ldile_dir(uint32_t op); 626 void ldile_ind(uint32_t op); 627 void ldile_imm(uint32_t op); 628 void ldigt_reg(uint32_t op); 629 void ldigt_dir(uint32_t op); 630 void ldigt_ind(uint32_t op); 631 void ldigt_imm(uint32_t op); 632 void ldige_reg(uint32_t op); 633 void ldige_dir(uint32_t op); 634 void ldige_ind(uint32_t op); 635 void ldige_imm(uint32_t op); 636 void ldinv_reg(uint32_t op); 637 void ldinv_dir(uint32_t op); 638 void ldinv_ind(uint32_t op); 639 void ldinv_imm(uint32_t op); 640 void ldiuf_reg(uint32_t op); 641 void ldiuf_dir(uint32_t op); 642 void ldiuf_ind(uint32_t op); 643 void ldiuf_imm(uint32_t op); 644 void ldinuf_reg(uint32_t op); 645 void ldinuf_dir(uint32_t op); 646 void ldinuf_ind(uint32_t op); 647 void ldinuf_imm(uint32_t op); 648 void ldiv_reg(uint32_t op); 649 void ldiv_dir(uint32_t op); 650 void ldiv_ind(uint32_t op); 651 void ldiv_imm(uint32_t op); 652 void ldinlv_reg(uint32_t op); 653 void ldinlv_dir(uint32_t op); 654 void ldinlv_ind(uint32_t op); 655 void ldinlv_imm(uint32_t op); 656 void ldilv_reg(uint32_t op); 657 void ldilv_dir(uint32_t op); 658 void ldilv_ind(uint32_t op); 659 void ldilv_imm(uint32_t op); 660 void ldinluf_reg(uint32_t op); 661 void ldinluf_dir(uint32_t op); 662 void ldinluf_ind(uint32_t op); 663 void ldinluf_imm(uint32_t op); 664 void ldiluf_reg(uint32_t op); 665 void ldiluf_dir(uint32_t op); 666 void ldiluf_ind(uint32_t op); 667 void ldiluf_imm(uint32_t op); 668 void ldizuf_reg(uint32_t op); 669 void ldizuf_dir(uint32_t op); 670 void ldizuf_ind(uint32_t op); 671 void ldizuf_imm(uint32_t op); 672 void execute_delayed(uint32_t newpc); 673 void br_imm(uint32_t op); 674 void brd_imm(uint32_t op); 675 void call_imm(uint32_t op); 676 void rptb_imm(uint32_t op); 677 void swi(uint32_t op); 678 void brc_reg(uint32_t op); 679 void brcd_reg(uint32_t op); 680 void brc_imm(uint32_t op); 681 void brcd_imm(uint32_t op); 682 void dbc_reg(uint32_t op); 683 void dbcd_reg(uint32_t op); 684 void dbc_imm(uint32_t op); 685 void dbcd_imm(uint32_t op); 686 void callc_reg(uint32_t op); 687 void callc_imm(uint32_t op); 688 void trap(int trapnum); 689 void trapc(uint32_t op); 690 void retic_reg(uint32_t op); 691 void retsc_reg(uint32_t op); 692 void mpyaddf_0(uint32_t op); 693 void mpyaddf_1(uint32_t op); 694 void mpyaddf_2(uint32_t op); 695 void mpyaddf_3(uint32_t op); 696 void mpysubf_0(uint32_t op); 697 void mpysubf_1(uint32_t op); 698 void mpysubf_2(uint32_t op); 699 void mpysubf_3(uint32_t op); 700 void mpyaddi_0(uint32_t op); 701 void mpyaddi_1(uint32_t op); 702 void mpyaddi_2(uint32_t op); 703 void mpyaddi_3(uint32_t op); 704 void mpysubi_0(uint32_t op); 705 void mpysubi_1(uint32_t op); 706 void mpysubi_2(uint32_t op); 707 void mpysubi_3(uint32_t op); 708 void stfstf(uint32_t op); 709 void stisti(uint32_t op); 710 void ldfldf(uint32_t op); 711 void ldildi(uint32_t op); 712 void absfstf(uint32_t op); 713 void absisti(uint32_t op); 714 void addf3stf(uint32_t op); 715 void addi3sti(uint32_t op); 716 void and3sti(uint32_t op); 717 void ash3sti(uint32_t op); 718 void fixsti(uint32_t op); 719 void floatstf(uint32_t op); 720 void ldfstf(uint32_t op); 721 void ldisti(uint32_t op); 722 void lsh3sti(uint32_t op); 723 void mpyf3stf(uint32_t op); 724 void mpyi3sti(uint32_t op); 725 void negfstf(uint32_t op); 726 void negisti(uint32_t op); 727 void notsti(uint32_t op); 728 void or3sti(uint32_t op); 729 void subf3stf(uint32_t op); 730 void subi3sti(uint32_t op); 731 void xor3sti(uint32_t op); 732 733 // configuration 734 const address_space_config m_program_config; 735 uint32_t m_chip_type; 736 737 union int_double 738 { 739 double d; 740 float f[2]; 741 uint32_t i[2]; 742 }; 743 744 // core registers 745 uint32_t m_pc; 746 tmsreg m_r[36]; 747 uint32_t m_bkmask; 748 749 // internal peripheral registers 750 enum primary_bus_control_mask : uint32_t 751 { 752 HOLDST = 0x00000001, // hold status 753 NOHOLD = 0x00000002, // external hold disable 754 HIZ = 0x00000004, // internal hold 755 SWW = 0x00000018, // software wait mode 756 WTCNT = 0x000000e0, // software wait count 757 BNKCMP = 0x00001f00, // bank compare 758 759 WMASK = 0x00001ffe 760 }; 761 uint32_t m_primary_bus_control; 762 763 // internal stuff 764 uint16_t m_irq_state; 765 bool m_delayed; 766 bool m_irq_pending; 767 bool m_is_idling; 768 int m_icount; 769 770 uint32_t m_iotemp; 771 memory_access<24, 2, -2, ENDIANNESS_LITTLE>::cache m_cache; 772 memory_access<24, 2, -2, ENDIANNESS_LITTLE>::specific m_program; 773 774 optional_memory_region m_internal_rom; 775 776 bool m_mcbl_mode; 777 bool m_hold_state; 778 779 devcb_write8 m_xf0_cb; 780 devcb_write8 m_xf1_cb; 781 devcb_write8 m_iack_cb; 782 devcb_write_line m_holda_cb; 783 784 // tables 785 static void (tms3203x_device::*const s_tms32031ops[])(uint32_t op); 786 static uint32_t (tms3203x_device::*const s_indirect_d[0x20])(uint32_t, uint8_t); 787 static uint32_t (tms3203x_device::*const s_indirect_1[0x20])(uint32_t, uint8_t); 788 static uint32_t (tms3203x_device::*const s_indirect_1_def[0x20])(uint32_t, uint8_t, uint32_t *&); 789 790 #if (TMS_3203X_LOG_OPCODE_USAGE) 791 uint32_t m_hits[0x200*4]; 792 #endif 793 }; 794 795 796 // ======================> tms32030_device 797 798 class tms32030_device : public tms3203x_device 799 { 800 public: 801 // construction/destruction 802 tms32030_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); 803 void internal_32030(address_map &map); 804 }; 805 806 807 // ======================> tms32031_device 808 809 class tms32031_device : public tms3203x_device 810 { 811 public: 812 // construction/destruction 813 tms32031_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); 814 void internal_32031(address_map &map); 815 }; 816 817 818 // ======================> tms32032_device 819 820 class tms32032_device : public tms3203x_device 821 { 822 public: 823 // construction/destruction 824 tms32032_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); 825 void internal_32032(address_map &map); 826 }; 827 828 829 // device type definition 830 DECLARE_DEVICE_TYPE(TMS32030, tms32030_device) 831 DECLARE_DEVICE_TYPE(TMS32031, tms32031_device) 832 DECLARE_DEVICE_TYPE(TMS32032, tms32032_device) 833 834 #endif // MAME_CPU_TMS32031_TMS32031_H 835