Previous 199869 Revisions Next

r34927 Sunday 8th February, 2015 at 16:21:23 UTC by hap
small update, thanks plgDavid for sending me that doc
[src/emu/cpu/ucom4]ucom4.c ucom4.h ucom4op.inc

trunk/src/emu/cpu/ucom4/ucom4.c
r243438r243439
44
55  NEC uCOM-4 MCU family cores
66 
7  reference: 1981 NEC Microcomputers Catalog (later editions may have errors!)
8  also looked at asterick's JavaScript D553 emulator for verification, with permission
7  References:
8  - 1981 NEC Microcomputers Catalog (later editions may have errors!)
9  - Supplement to uCOM-43 Single Chip Microcomputer Users' Manual
10  I've also looked at asterick's JavaScript D553 emulator for verification, with permission.
911
1012  TODO:
1113  - what happens with uCOM-43 opcodes on an uCOM-44/45 MCU?
r243438r243439
5254
5355static ADDRESS_MAP_START(data_96x4, AS_DATA, 8, ucom4_cpu_device)
5456   AM_RANGE(0x00, 0x3f) AM_RAM
55   AM_RANGE(0x40, 0x5f) AM_RAM AM_MIRROR(0x20)
57   AM_RANGE(0x40, 0x4f) AM_RAM
58   AM_RANGE(0x70, 0x7f) AM_RAM
5659ADDRESS_MAP_END
5760
5861
r243438r243439
199202//  execute
200203//-------------------------------------------------
201204
205void ucom4_cpu_device::increment_pc()
206{
207   // upper bits (field register) don't auto-increment
208   m_pc = (m_pc & ~0xff) | ((m_pc + 1) & 0xff);
209}
210
202211void ucom4_cpu_device::fetch_arg()
203212{
204213   // 2-byte opcodes: STM/LDI/CLI/CI, JMP/CAL, OCD
r243438r243439
206215   {
207216      m_icount--;
208217      m_arg = m_program->read_byte(m_pc);
209      m_pc = (m_pc + 1) & m_prgmask;
218      increment_pc();
210219   }
211220}
212221
r243438r243439
222231      debugger_instruction_hook(this, m_pc);
223232      m_op = m_program->read_byte(m_pc);
224233      m_bitmask = 1 << (m_op & 0x03);
225      m_pc = (m_pc + 1) & m_prgmask;
234      increment_pc();
226235      fetch_arg();
227236     
228237      if (m_skip)
trunk/src/emu/cpu/ucom4/ucom4.h
r243438r243439
110110   virtual UINT32 execute_input_lines() const { return 1; }
111111   virtual void execute_run();
112112   
113   void fetch_arg();
114
115113   // device_memory_interface overrides
116114   virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const { return(spacenum == AS_PROGRAM) ? &m_program_config :((spacenum == AS_DATA) ? &m_data_config : NULL); }
117115
r243438r243439
167165   devcb_write8 m_write_h;
168166   devcb_write8 m_write_i;
169167   
170   // opcode handlers
168   // misc internal helpers
169   void increment_pc();
170   void fetch_arg();
171
171172   UINT8 ram_r();
172173   void ram_w(UINT8 data);
173174   void pop_stack();
174175   void push_stack();
175176   UINT8 input_r(int index);
176177   void output_w(int index, UINT8 data);
177   void op_illegal();
178
178179   bool check_op_43();
180   UINT8 ucom43_reg_r(int index);
181   void ucom43_reg_w(int index, UINT8 data);
179182
183   // opcode handlers
184   void op_illegal();
185
180186   void op_li();
181187   void op_lm();
182188   void op_ldi();
trunk/src/emu/cpu/ucom4/ucom4op.inc
r243438r243439
326326   // JMP A: Jump to Address / CAL A: Call Address
327327   if (m_op & 0x08)
328328      push_stack();
329   m_pc = (m_op & 0x07) << 8 | m_arg;
329   m_pc = ((m_op & 0x07) << 8 | m_arg) & m_prgmask;
330330}
331331
332332void ucom4_cpu_device::op_jcp()
r243438r243439
338338void ucom4_cpu_device::op_jpa()
339339{
340340   // JPA: Jump to (ACC) in current page
341   m_icount--;
341342   m_pc = (m_pc & ~0x3f) | (m_acc << 2);
342343}
343344
r243438r243439
358359void ucom4_cpu_device::op_rts()
359360{
360361   // RTS: Return from subroutine, skip next
361   pop_stack();
362   op_rt();
362363   m_skip = true;
363364}
364365
r243438r243439
434435void ucom4_cpu_device::op_ia()
435436{
436437   // IA: Input port A to ACC
438   m_icount--;
437439   m_acc = input_r(NEC_UCOM4_PORTA);
438440}
439441
r243438r243439
446448void ucom4_cpu_device::op_oe()
447449{
448450   // OE: Output ACC to port E
451   m_icount--;
449452   output_w(NEC_UCOM4_PORTE, m_acc);
450453}
451454
r243438r243439
483486   return (m_family == NEC_UCOM43);
484487}
485488
489// extra registers reside in RAM
490enum
491{
492   UCOM43_X = 0,
493   UCOM43_Y,
494   UCOM43_R,
495   UCOM43_S,
496   UCOM43_W,
497   UCOM43_Z,
498   UCOM43_F
499};
500
501inline UINT8 ucom4_cpu_device::ucom43_reg_r(int index)
502{
503   return m_data->read_byte(m_datamask - index) & 0xf;
504}
505
506inline void ucom4_cpu_device::ucom43_reg_w(int index, UINT8 data)
507{
508   m_data->write_byte(m_datamask - index, data & 0xf);
509}
510
511
486512// Transfer
487513
488514void ucom4_cpu_device::op_taw()


Previous 199869 Revisions Next


© 1997-2024 The MAME Team