1 // license:BSD-3-Clause 2 // copyright-holders:Peter Trauner,Antoine Mine 3 /***************************************************************************** 4 * 5 * cpustate->h 6 * portable saturn emulator interface 7 * (hp calculators) 8 * 9 * 10 *****************************************************************************/ 11 /* 12 Calculator Release Date Chip Version Analog/Digital IC 13 HP71B (early) 02/01/84 1LF2 - 14 HP71B (later) ??/??/?? 1LK7 - 15 HP18C 06/01/86 1LK7 - 16 HP28C 01/05/87 1LK7 - 17 HP17B 01/04/88 1LT8 Lewis 18 HP19B 01/04/88 1LT8 Lewis 19 HP27S 01/04/88 1LT8 Lewis 20 HP28S 01/04/88 1LT8 Lewis 21 HP48SX 03/16/91 1LT8 Clarke 22 HP48S 04/02/91 1LT8 Clarke 23 HP48GX 06/01/93 1LT8 Yorke 24 HP48G 06/01/93 1LT8 Yorke 25 HP38G 09/??/95 1LT8 Yorke 26 */ 27 /* 4 bit processor 28 20 address lines */ 29 30 #ifndef MAME_CPU_SATURN_SATURN_H 31 #define MAME_CPU_SATURN_SATURN_H 32 33 #pragma once 34 35 #include "saturnds.h" 36 37 #define SATURN_INT_NONE 0 38 #define SATURN_INT_IRQ 1 39 #define SATURN_INT_NMI 2 40 41 42 enum 43 { 44 SATURN_A=1, SATURN_B, SATURN_C, SATURN_D, 45 SATURN_R0, SATURN_R1, SATURN_R2, SATURN_R3, SATURN_R4, 46 SATURN_RSTK0, SATURN_RSTK1, SATURN_RSTK2, SATURN_RSTK3, 47 SATURN_RSTK4, SATURN_RSTK5, SATURN_RSTK6, SATURN_RSTK7, 48 SATURN_PC, SATURN_D0, SATURN_D1, 49 50 SATURN_P, 51 SATURN_OUT, 52 SATURN_CARRY, 53 SATURN_ST, 54 SATURN_HST, 55 56 SATURN_IRQ_STATE, 57 SATURN_SLEEPING 58 }; 59 60 #define SATURN_IRQ_LINE 0 61 #define SATURN_NMI_LINE 1 62 #define SATURN_WAKEUP_LINE 2 63 64 65 class saturn_device : public cpu_device, public saturn_disassembler::config 66 { 67 public: 68 // construction/destruction 69 saturn_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); 70 71 // configuration helpers out_func()72 auto out_func() { return m_out_func.bind(); } in_func()73 auto in_func() { return m_in_func.bind(); } reset_func()74 auto reset_func() { return m_reset_func.bind(); } config_func()75 auto config_func() { return m_config_func.bind(); } unconfig_func()76 auto unconfig_func() { return m_unconfig_func.bind(); } id_func()77 auto id_func() { return m_id_func.bind(); } crc_func()78 auto crc_func() { return m_crc_func.bind(); } rsi_func()79 auto rsi_func() { return m_rsi_func.bind(); } 80 81 protected: 82 // device-level overrides 83 virtual void device_start() override; 84 virtual void device_reset() override; 85 86 // device_execute_interface overrides execute_min_cycles()87 virtual uint32_t execute_min_cycles() const noexcept override { return 2; } execute_max_cycles()88 virtual uint32_t execute_max_cycles() const noexcept override { return 21; } execute_input_lines()89 virtual uint32_t execute_input_lines() const noexcept override { return 1; } 90 virtual void execute_run() override; 91 virtual void execute_set_input(int inputnum, int state) override; 92 93 // device_memory_interface overrides 94 virtual space_config_vector memory_space_config() const override; 95 96 // device_state_interface overrides 97 virtual void state_string_export(const device_state_entry &entry, std::string &str) const override; 98 virtual void state_import(const device_state_entry &entry) override; 99 virtual void state_export(const device_state_entry &entry) override; 100 101 // device_disasm_interface overrides 102 virtual std::unique_ptr<util::disasm_interface> create_disassembler() override; 103 virtual bool get_nonstandard_mnemonics_mode() const override; 104 105 private: 106 address_space_config m_program_config; 107 108 devcb_write32 m_out_func; 109 devcb_read32 m_in_func; 110 devcb_write_line m_reset_func; 111 devcb_write32 m_config_func; 112 devcb_write32 m_unconfig_func; 113 devcb_read32 m_id_func; 114 devcb_write32 m_crc_func; 115 devcb_write_line m_rsi_func; 116 117 // 64 bit, unpacked (one nibble per byte) 118 typedef uint8_t Saturn64[16]; 119 120 Saturn64 m_reg[9]; //r0,r1,r2,r3,r4,a,b,c,d 121 122 uint32_t m_d[2], m_pc, m_oldpc, m_rstk[8]; // 20 bit, packed addresses 123 124 uint8_t m_p; // 4 bit pointer 125 126 uint16_t m_out; // 12 bit (packed) 127 uint8_t m_carry, m_decimal; 128 uint16_t m_st; // status 16 bit 129 130 uint8_t m_hst; // hardware status 4 bit 131 132 uint8_t m_nmi_state; 133 uint8_t m_irq_state; 134 uint8_t m_irq_enable; /* INTON / INTOFF */ 135 uint8_t m_in_irq; /* already servicing IRQ */ 136 uint8_t m_pending_irq; /* IRQ is pending */ 137 uint8_t m_sleeping; /* low-consumption state */ 138 int m_monitor_id; 139 int m_monitor_in; 140 memory_access<20, 0, 0, ENDIANNESS_LITTLE>::cache m_cache; 141 memory_access<20, 0, 0, ENDIANNESS_LITTLE>::specific m_program; 142 int m_icount; 143 int64_t m_debugger_temp; 144 145 void saturn_take_irq(); 146 void IntReg64(Saturn64 r, int64_t d); 147 int64_t Reg64Int(Saturn64 r); 148 149 int READ_OP(); 150 int READ_OP_ARG(); 151 int READ_OP_ARG8(); 152 int8_t READ_OP_DIS8(); 153 int READ_OP_ARG12(); 154 int READ_OP_DIS12(); 155 int READ_OP_ARG16(); 156 int16_t READ_OP_DIS16(); 157 int READ_OP_ARG20(); 158 int READ_NIBBLE(uint32_t adr); 159 int READ_8(uint32_t adr); 160 int READ_12(uint32_t adr); 161 int READ_16(uint32_t adr); 162 int READ_20(uint32_t adr); 163 void WRITE_NIBBLE(uint32_t adr, uint8_t nib); 164 int S64_READ_X(int r); 165 int S64_READ_WORD(int r); 166 int S64_READ_A(int r); 167 void S64_WRITE_X(int r, int v); 168 void S64_WRITE_WORD(int r, int v); 169 void S64_WRITE_A(int r, int v); 170 uint32_t saturn_pop(); 171 void saturn_push(uint32_t adr); 172 void saturn_interrupt_on(); 173 void saturn_interrupt_off(); 174 void saturn_reset_interrupt(); 175 void saturn_mem_reset(); 176 void saturn_mem_config(); 177 void saturn_mem_unconfig(); 178 void saturn_mem_id(); 179 void saturn_shutdown(); 180 void saturn_bus_command_b(); 181 void saturn_bus_command_c(); 182 void saturn_bus_command_d(); 183 void saturn_serial_request(); 184 void saturn_out_c(); 185 void saturn_out_cs(); 186 void saturn_in(int reg); saturn_sethex()187 void saturn_sethex() { m_decimal=0; } saturn_setdec()188 void saturn_setdec() { m_decimal=1; } 189 void saturn_clear_st(); 190 void saturn_st_to_c(); 191 void saturn_c_to_st(); 192 void saturn_exchange_c_st(); 193 void saturn_jump_after_test(); 194 void saturn_st_clear_bit(); 195 void saturn_st_set_bit(); 196 void saturn_st_jump_bit_clear(); 197 void saturn_st_jump_bit_set(); 198 void saturn_hst_clear_bits(); 199 void saturn_hst_bits_cleared(); 200 void saturn_exchange_p(); 201 void saturn_p_to_c(); 202 void saturn_c_to_p(); 203 void saturn_dec_p(); 204 void saturn_inc_p(); 205 void saturn_load_p(); 206 void saturn_p_equals(); 207 void saturn_p_not_equals(); 208 void saturn_ca_p_1(); 209 void saturn_load_reg(int reg); 210 void saturn_jump(int adr, int jump); 211 void saturn_call(int adr); 212 void saturn_return(int yes); 213 void saturn_return_carry_set(); 214 void saturn_return_carry_clear(); 215 void saturn_return_interrupt(); 216 void saturn_return_xm_set(); 217 void saturn_pop_c(); 218 void saturn_push_c(); 219 void saturn_indirect_jump(int reg); 220 void saturn_equals_zero(int reg, int begin, int count); 221 void saturn_equals(int reg, int begin, int count, int right); 222 void saturn_not_equals_zero(int reg, int begin, int count); 223 void saturn_not_equals(int reg, int begin, int count, int right); 224 void saturn_greater(int reg, int begin, int count, int right); 225 void saturn_greater_equals(int reg, int begin, int count, int right); 226 void saturn_smaller_equals(int reg, int begin, int count, int right); 227 void saturn_smaller(int reg, int begin, int count, int right); 228 void saturn_jump_bit_clear(int reg); 229 void saturn_jump_bit_set(int reg); 230 void saturn_load_pc(int reg); 231 void saturn_store_pc(int reg); 232 void saturn_exchange_pc(int reg); 233 void saturn_load_adr(int reg, int nibbles); 234 void saturn_add_adr(int reg); 235 void saturn_sub_adr(int reg); 236 void saturn_adr_to_reg(int adr, int reg); 237 void saturn_reg_to_adr(int reg, int adr); 238 void saturn_adr_to_reg_word(int adr, int reg); 239 void saturn_reg_to_adr_word(int reg, int adr); 240 void saturn_exchange_adr_reg(int adr, int reg); 241 void saturn_exchange_adr_reg_word(int adr, int reg); 242 void saturn_load_nibbles(int reg, int begin, int count, int adr); 243 void saturn_store_nibbles(int reg, int begin, int count, int adr); 244 void saturn_clear_bit(int reg); 245 void saturn_set_bit(int reg); 246 void saturn_clear(int reg, int begin, int count); 247 void saturn_exchange(int left, int begin, int count, int right); 248 void saturn_copy(int dest, int begin, int count, int src); 249 void saturn_add(int reg, int begin, int count, int right); 250 void saturn_add_const(int reg, int begin, int count, uint8_t right); 251 void saturn_sub(int reg, int begin, int count, int right); 252 void saturn_sub_const(int reg, int begin, int count, int right); 253 void saturn_sub2(int reg, int begin, int count, int right); 254 void saturn_increment(int reg, int begin, int count); 255 void saturn_decrement(int reg, int begin, int count); 256 void saturn_invert(int reg, int begin, int count); 257 void saturn_negate(int reg, int begin, int count); 258 void saturn_or(int dest, int begin, int count, int src); 259 void saturn_and(int dest, int begin, int count, int src); 260 void saturn_shift_nibble_left(int reg, int begin, int count); 261 void saturn_shift_nibble_right(int reg, int begin, int count); 262 void saturn_rotate_nibble_left_w(int reg); 263 void saturn_rotate_nibble_right_w(int reg); 264 void saturn_shift_right(int reg, int begin, int count); 265 void saturn_invalid3(int op1, int op2, int op3); 266 void saturn_invalid4(int op1, int op2, int op3, int op4); 267 void saturn_invalid5(int op1, int op2, int op3, int op4, int op5); 268 void saturn_invalid6(int op1, int op2, int op3, int op4, int op5, int op6); 269 void saturn_instruction_0e(); 270 void saturn_instruction_1(); 271 void saturn_instruction_80(); 272 void saturn_instruction_81a(); 273 void saturn_instruction_81(); 274 void saturn_instruction_8(); 275 void saturn_instruction_9(); 276 void saturn_instruction_a(); 277 void saturn_instruction_b(); 278 void saturn_instruction(); 279 }; 280 281 DECLARE_DEVICE_TYPE(SATURN, saturn_device) 282 283 #endif // MAME_CPU_SATURN_SATURN_H 284