Previous 199869 Revisions Next

r26879 Wednesday 1st January, 2014 at 21:58:00 UTC by Wilbert Pol
tms7000.c: Modernized cpu core.  [Wilbert Pol]
[src/emu/cpu/tms7000]tms7000.c tms7000.h tms70op.c tms70tb.c

trunk/src/emu/cpu/tms7000/tms7000.h
r26878r26879
11/*****************************************************************************
22 *
3 *   cpustate->h (c header file)
3 *   tms7000.h (c header file)
44 *   Portable TMS7000 emulator (Texas Instruments 7000)
55 *
66 *   Copyright tim lindner, all rights reserved.
r26878r26879
4545   TMS7000_PORTD
4646};
4747
48/* PUBLIC FUNCTIONS */
49extern void tms7000_A6EC1( device_t *device ); /* External event counter */
5048
51DECLARE_LEGACY_CPU_DEVICE(TMS7000, tms7000);
52DECLARE_LEGACY_CPU_DEVICE(TMS7000_EXL, tms7000_exl);
49class tms7000_device : public cpu_device
50{
51public:
52   // construction/destruction
53   tms7000_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
54   tms7000_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source);
5355
54extern CPU_DISASSEMBLE( tms7000 );
56   DECLARE_WRITE8_MEMBER( tms70x0_pf_w );
57   DECLARE_READ8_MEMBER( tms70x0_pf_r );
58   DECLARE_WRITE8_MEMBER( tms7000_internal_w );
59   DECLARE_READ8_MEMBER( tms7000_internal_r );
5560
61   void tms7000_A6EC1();
62
63protected:
64   // device-level overrides
65   virtual void device_start();
66   virtual void device_reset();
67
68   // device_execute_interface overrides
69   virtual UINT32 execute_min_cycles() const { return 1; }
70   virtual UINT32 execute_max_cycles() const { return 48; }
71   virtual UINT32 execute_input_lines() const { return 3; }
72   virtual void execute_run();
73   virtual void execute_set_input(int inputnum, int state);
74
75   // device_memory_interface overrides
76   virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const { return (spacenum == AS_PROGRAM) ? &m_program_config : ( (spacenum == AS_IO) ? &m_io_config : NULL ); }
77
78   // device_state_interface overrides
79   void state_string_export(const device_state_entry &entry, astring &string);
80
81   // device_disasm_interface overrides
82   virtual UINT32 disasm_min_opcode_bytes() const { return 1; }
83   virtual UINT32 disasm_max_opcode_bytes() const { return 4; }
84   virtual offs_t disasm_disassemble(char *buffer, offs_t pc, const UINT8 *oprom, const UINT8 *opram, UINT32 options);
85
86private:
87   address_space_config m_program_config;
88   address_space_config m_io_config;
89
90   typedef void ( tms7000_device::*opcode_func ) ();
91   static const opcode_func s_opfn[0x100];
92   static const opcode_func s_opfn_exl[0x100];
93   const opcode_func *m_opcode;
94
95   static UINT16 bcd_add( UINT16 a, UINT16 b );
96   static UINT16 bcd_tencomp( UINT16 a );
97   static UINT16 bcd_sub( UINT16 a, UINT16 b);
98
99   PAIR        m_pc;         /* Program counter */
100   UINT8       m_sp;     /* Stack Pointer */
101   UINT8       m_sr;     /* Status Register */
102   UINT8       m_irq_state[3];   /* State of the three IRQs */
103   UINT8       m_rf[0x80];   /* Register file (SJE) */
104   UINT8       m_pf[0x100];  /* Perpherial file */
105   address_space *m_program;
106   direct_read_data *m_direct;
107   address_space *m_io;
108   int         m_icount;
109   int         m_div_by_16_trigger;
110   int         m_cycles_per_INT2;
111   UINT8       m_t1_capture_latch; /* Timer 1 capture latch */
112   INT8        m_t1_prescaler;   /* Timer 1 prescaler (5 bits) */
113   INT16       m_t1_decrementer; /* Timer 1 decrementer (8 bits) */
114   UINT8       m_idle_state; /* Set after the execution of an idle instruction */
115
116   inline UINT16 RM16( UINT32 mAddr );
117   inline UINT16 RRF16( UINT32 mAddr );
118   inline void WRF16( UINT32 mAddr, PAIR p );
119   void tms7000_check_IRQ_lines();
120   void tms7000_do_interrupt( UINT16 address, UINT8 line );
121   void illegal();
122   void adc_b2a();
123   void adc_r2a();
124   void adc_r2b();
125   void adc_r2r();
126   void adc_i2a();
127   void adc_i2b();
128   void adc_i2r();
129   void add_b2a();
130   void add_r2a();
131   void add_r2b();
132   void add_r2r();
133   void add_i2a();
134   void add_i2b();
135   void add_i2r();
136   void and_b2a();
137   void and_r2a();
138   void and_r2b();
139   void and_r2r();
140   void and_i2a();
141   void and_i2b();
142   void and_i2r();
143   void andp_a2p();
144   void andp_b2p();
145   void movp_i2p();
146   void andp_i2p();
147   void br_dir();
148   void br_ind();
149   void br_inx();
150   void btjo_b2a();
151   void btjo_r2a();
152   void btjo_r2b();
153   void btjo_r2r();
154   void btjo_i2a();
155   void btjo_i2b();
156   void btjo_i2r();
157   void btjop_ap();
158   void btjop_bp();
159   void btjop_ip();
160   void btjz_b2a();
161   void btjz_r2a();
162   void btjz_r2b();
163   void btjz_r2r();
164   void btjz_i2a();
165   void btjz_i2b();
166   void btjz_i2r();
167   void btjzp_ap();
168   void btjzp_bp();
169   void btjzp_ip();
170   void call_dir();
171   void call_ind();
172   void call_inx();
173   void clr_a();
174   void clr_b();
175   void clr_r();
176   void clrc();
177   void cmp_ba();
178   void cmp_ra();
179   void cmp_rb();
180   void cmp_rr();
181   void cmp_ia();
182   void cmp_ib();
183   void cmp_ir();
184   void cmpa_dir();
185   void cmpa_ind();
186   void cmpa_inx();
187   void dac_b2a();
188   void dac_r2a();
189   void dac_r2b();
190   void dac_r2r();
191   void dac_i2a();
192   void dac_i2b();
193   void dac_i2r();
194   void dec_a();
195   void dec_b();
196   void dec_r();
197   void decd_a();
198   void decd_b();
199   void decd_r();
200   void dint();
201   void djnz_a();
202   void djnz_b();
203   void djnz_r();
204   void dsb_b2a();
205   void dsb_r2a();
206   void dsb_r2b();
207   void dsb_r2r();
208   void dsb_i2a();
209   void dsb_i2b();
210   void dsb_i2r();
211   void eint();
212   void idle();
213   void inc_a();
214   void inc_b();
215   void inc_r();
216   void inv_a();
217   void inv_b();
218   void inv_r();
219   void jc();
220   void jeq();
221   void jl();
222   void jmp();
223   void j_jn();
224   void jne();
225   void jp();
226   void jpz();
227   void lda_dir();
228   void lda_ind();
229   void lda_inx();
230   void ldsp();
231   void mov_a2b();
232   void mov_b2a();
233   void mov_a2r();
234   void mov_b2r();
235   void mov_r2a();
236   void mov_r2b();
237   void mov_r2r();
238   void mov_i2a();
239   void mov_i2b();
240   void mov_i2r();
241   void movd_imm();
242   void movd_r();
243   void movd_inx();
244   void movp_a2p();
245   void movp_b2p();
246   void movp_r2p();
247   void movp_p2a();
248   void movp_p2b();
249   void mpy_ba();
250   void mpy_ra();
251   void mpy_rb();
252   void mpy_rr();
253   void mpy_ia();
254   void mpy_ib();
255   void mpy_ir();
256   void nop();
257   void or_b2a();
258   void or_r2a();
259   void or_r2b();
260   void or_r2r();
261   void or_i2a();
262   void or_i2b();
263   void or_i2r();
264   void orp_a2p();
265   void orp_b2p();
266   void orp_i2p();
267   void pop_a();
268   void pop_b();
269   void pop_r();
270   void pop_st();
271   void push_a();
272   void push_b();
273   void push_r();
274   void push_st();
275   void reti();
276   void rets();
277   void rl_a();
278   void rl_b();
279   void rl_r();
280   void rlc_a();
281   void rlc_b();
282   void rlc_r();
283   void rr_a();
284   void rr_b();
285   void rr_r();
286   void rrc_a();
287   void rrc_b();
288   void rrc_r();
289   void sbb_ba();
290   void sbb_ra();
291   void sbb_rb();
292   void sbb_rr();
293   void sbb_ia();
294   void sbb_ib();
295   void sbb_ir();
296   void setc();
297   void sta_dir();
298   void sta_ind();
299   void sta_inx();
300   void stsp();
301   void sub_ba();
302   void sub_ra();
303   void sub_rb();
304   void sub_rr();
305   void sub_ia();
306   void sub_ib();
307   void sub_ir();
308   void trap_0();
309   void trap_1();
310   void trap_2();
311   void trap_3();
312   void trap_4();
313   void trap_5();
314   void trap_6();
315   void trap_7();
316   void trap_8();
317   void trap_9();
318   void trap_10();
319   void trap_11();
320   void trap_12();
321   void trap_13();
322   void trap_14();
323   void trap_15();
324   void trap_16();
325   void trap_17();
326   void trap_18();
327   void trap_19();
328   void trap_20();
329   void trap_21();
330   void trap_22();
331   void trap_23();
332   void swap_a();
333   void swap_b();
334   void swap_r();
335   void swap_r_exl();
336   void tstb();
337   void xchb_a();
338   void xchb_b();
339   void xchb_r();
340   void xor_b2a();
341   void xor_r2a();
342   void xor_r2b();
343   void xor_r2r();
344   void xor_i2a();
345   void xor_i2b();
346   void xor_i2r();
347   void xorp_a2p();
348   void xorp_b2p();
349   void xorp_i2p();
350   void tms7000_service_timer1();
351
352};
353
354
355class tms7000_exl_device : public tms7000_device
356{
357public:
358   // construction/destruction
359   tms7000_exl_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
360};
361
362
363extern const device_type TMS7000;
364extern const device_type TMS7000_EXL;
365
366
56367#endif /* __TMS7000_H__ */
trunk/src/emu/cpu/tms7000/tms70tb.c
r26878r26879
1717 *
1818 *****************************************************************************/
1919
20static void (*const opfn[0x100])(tms7000_state *cpustate) = {
20const tms7000_device::opcode_func tms7000_device::s_opfn[0x100] = {
2121/*          0xX0,   0xX1,     0xX2,    0xX3,    0xX4,    0xX5,    0xX6,    0xX7,
2222            0xX8,   0xX9,     0xXA,    0xXB,    0xXC,    0xXD,    0xXE,    0xXF   */
2323
24/* 0x0X */  nop,     idle,    illegal, illegal, illegal, eint,    dint,    setc,
25         pop_st,  stsp,    rets,    reti,    illegal, ldsp,    push_st, illegal,
24/* 0x0X */  &tms7000_device::nop,     &tms7000_device::idle,    &tms7000_device::illegal, &tms7000_device::illegal, &tms7000_device::illegal, &tms7000_device::eint,    &tms7000_device::dint,    &tms7000_device::setc,
25         &tms7000_device::pop_st,  &tms7000_device::stsp,    &tms7000_device::rets,    &tms7000_device::reti,    &tms7000_device::illegal, &tms7000_device::ldsp,    &tms7000_device::push_st, &tms7000_device::illegal,
2626
27/* 0x1X */  illegal, illegal, mov_r2a, and_r2a, or_r2a,  xor_r2a, btjo_r2a,btjz_r2a,
28         add_r2a, adc_r2a, sub_ra,  sbb_ra,  mpy_ra,  cmp_ra,  dac_r2a, dsb_r2a,
27/* 0x1X */  &tms7000_device::illegal, &tms7000_device::illegal, &tms7000_device::mov_r2a, &tms7000_device::and_r2a, &tms7000_device::or_r2a,  &tms7000_device::xor_r2a, &tms7000_device::btjo_r2a,&tms7000_device::btjz_r2a,
28         &tms7000_device::add_r2a, &tms7000_device::adc_r2a, &tms7000_device::sub_ra,  &tms7000_device::sbb_ra,  &tms7000_device::mpy_ra,  &tms7000_device::cmp_ra,  &tms7000_device::dac_r2a, &tms7000_device::dsb_r2a,
2929
30/* 0x2X */  illegal, illegal, mov_i2a, and_i2a, or_i2a,  xor_i2a, btjo_i2a,btjz_i2a,
31         add_i2a, adc_i2a, sub_ia,  sbb_ia,  mpy_ia,  cmp_ia,  dac_i2a, dsb_i2a,
30/* 0x2X */  &tms7000_device::illegal, &tms7000_device::illegal, &tms7000_device::mov_i2a, &tms7000_device::and_i2a, &tms7000_device::or_i2a,  &tms7000_device::xor_i2a, &tms7000_device::btjo_i2a,&tms7000_device::btjz_i2a,
31         &tms7000_device::add_i2a, &tms7000_device::adc_i2a, &tms7000_device::sub_ia,  &tms7000_device::sbb_ia,  &tms7000_device::mpy_ia,  &tms7000_device::cmp_ia,  &tms7000_device::dac_i2a, &tms7000_device::dsb_i2a,
3232
33/* 0x3X */  illegal, illegal, mov_r2b, and_r2b, or_r2b,  xor_r2b, btjo_r2b,btjz_r2b,
34         add_r2b, adc_r2b, sub_rb,  sbb_rb,  mpy_rb,  cmp_rb,  dac_r2b, dsb_r2b,
33/* 0x3X */  &tms7000_device::illegal, &tms7000_device::illegal, &tms7000_device::mov_r2b, &tms7000_device::and_r2b, &tms7000_device::or_r2b,  &tms7000_device::xor_r2b, &tms7000_device::btjo_r2b,&tms7000_device::btjz_r2b,
34         &tms7000_device::add_r2b, &tms7000_device::adc_r2b, &tms7000_device::sub_rb,  &tms7000_device::sbb_rb,  &tms7000_device::mpy_rb,  &tms7000_device::cmp_rb,  &tms7000_device::dac_r2b, &tms7000_device::dsb_r2b,
3535
36/* 0x4X */  illegal, illegal, mov_r2r, and_r2r, or_r2r,  xor_r2r, btjo_r2r,btjz_r2r,
37         add_r2r, adc_r2r, sub_rr,  sbb_rr,  mpy_rr,  cmp_rr,  dac_r2r, dsb_r2r,
36/* 0x4X */  &tms7000_device::illegal, &tms7000_device::illegal, &tms7000_device::mov_r2r, &tms7000_device::and_r2r, &tms7000_device::or_r2r,  &tms7000_device::xor_r2r, &tms7000_device::btjo_r2r,&tms7000_device::btjz_r2r,
37         &tms7000_device::add_r2r, &tms7000_device::adc_r2r, &tms7000_device::sub_rr,  &tms7000_device::sbb_rr,  &tms7000_device::mpy_rr,  &tms7000_device::cmp_rr,  &tms7000_device::dac_r2r, &tms7000_device::dsb_r2r,
3838
39/* 0x5X */  illegal, illegal, mov_i2b, and_i2b, or_i2b,  xor_i2b, btjo_i2b,btjz_i2b,
40         add_i2b, adc_i2b, sub_ib,  sbb_ib,  mpy_ib,  cmp_ib,  dac_i2b, dsb_i2b,
39/* 0x5X */  &tms7000_device::illegal, &tms7000_device::illegal, &tms7000_device::mov_i2b, &tms7000_device::and_i2b, &tms7000_device::or_i2b,  &tms7000_device::xor_i2b, &tms7000_device::btjo_i2b,&tms7000_device::btjz_i2b,
40         &tms7000_device::add_i2b, &tms7000_device::adc_i2b, &tms7000_device::sub_ib,  &tms7000_device::sbb_ib,  &tms7000_device::mpy_ib,  &tms7000_device::cmp_ib,  &tms7000_device::dac_i2b, &tms7000_device::dsb_i2b,
4141
42/* 0x6X */  illegal, illegal, mov_b2a, and_b2a, or_b2a,  xor_b2a, btjo_b2a,btjz_b2a,
43         add_b2a, adc_b2a, sub_ba,  sbb_ba,  mpy_ba,  cmp_ba,  dac_b2a, dsb_b2a,
42/* 0x6X */  &tms7000_device::illegal, &tms7000_device::illegal, &tms7000_device::mov_b2a, &tms7000_device::and_b2a, &tms7000_device::or_b2a,  &tms7000_device::xor_b2a, &tms7000_device::btjo_b2a,&tms7000_device::btjz_b2a,
43         &tms7000_device::add_b2a, &tms7000_device::adc_b2a, &tms7000_device::sub_ba,  &tms7000_device::sbb_ba,  &tms7000_device::mpy_ba,  &tms7000_device::cmp_ba,  &tms7000_device::dac_b2a, &tms7000_device::dsb_b2a,
4444
45/* 0x7X */  illegal, illegal, mov_i2r, and_i2r, or_i2r,  xor_i2r, btjo_i2r,btjz_i2r,
46         add_i2r, adc_i2r, sub_ir,  sbb_ir,  mpy_ir,  cmp_ir,  dac_i2r, dsb_i2r,
45/* 0x7X */  &tms7000_device::illegal, &tms7000_device::illegal, &tms7000_device::mov_i2r, &tms7000_device::and_i2r, &tms7000_device::or_i2r,  &tms7000_device::xor_i2r, &tms7000_device::btjo_i2r,&tms7000_device::btjz_i2r,
46         &tms7000_device::add_i2r, &tms7000_device::adc_i2r, &tms7000_device::sub_ir,  &tms7000_device::sbb_ir,  &tms7000_device::mpy_ir,  &tms7000_device::cmp_ir,  &tms7000_device::dac_i2r, &tms7000_device::dsb_i2r,
4747
48/* 0x8X */  movp_p2a,illegal, movp_a2p,andp_a2p,orp_a2p, xorp_a2p,btjop_ap,btjzp_ap,
49         movd_imm,illegal, lda_dir, sta_dir, br_dir,  cmpa_dir,call_dir,illegal,
48/* 0x8X */  &tms7000_device::movp_p2a,&tms7000_device::illegal, &tms7000_device::movp_a2p,&tms7000_device::andp_a2p,&tms7000_device::orp_a2p, &tms7000_device::xorp_a2p,&tms7000_device::btjop_ap,&tms7000_device::btjzp_ap,
49         &tms7000_device::movd_imm,&tms7000_device::illegal, &tms7000_device::lda_dir, &tms7000_device::sta_dir, &tms7000_device::br_dir,  &tms7000_device::cmpa_dir,&tms7000_device::call_dir,&tms7000_device::illegal,
5050
51/* 0x9X */  illegal, movp_p2b,movp_b2p,andp_b2p,orp_b2p, xorp_b2p,btjop_bp,btjzp_bp,
52         movd_r,  illegal, lda_ind, sta_ind, br_ind,  cmpa_ind,call_ind,illegal,
51/* 0x9X */  &tms7000_device::illegal, &tms7000_device::movp_p2b,&tms7000_device::movp_b2p,&tms7000_device::andp_b2p,&tms7000_device::orp_b2p, &tms7000_device::xorp_b2p,&tms7000_device::btjop_bp,&tms7000_device::btjzp_bp,
52         &tms7000_device::movd_r,  &tms7000_device::illegal, &tms7000_device::lda_ind, &tms7000_device::sta_ind, &tms7000_device::br_ind,  &tms7000_device::cmpa_ind,&tms7000_device::call_ind,&tms7000_device::illegal,
5353
54/* 0xAX */  illegal, illegal, movp_i2p,andp_i2p,orp_i2p, xorp_i2p,btjop_ip,btjzp_ip,
55         movd_inx,illegal, lda_inx, sta_inx, br_inx,  cmpa_inx,call_inx,illegal,
54/* 0xAX */  &tms7000_device::illegal, &tms7000_device::illegal, &tms7000_device::movp_i2p,&tms7000_device::andp_i2p,&tms7000_device::orp_i2p, &tms7000_device::xorp_i2p,&tms7000_device::btjop_ip,&tms7000_device::btjzp_ip,
55         &tms7000_device::movd_inx,&tms7000_device::illegal, &tms7000_device::lda_inx, &tms7000_device::sta_inx, &tms7000_device::br_inx,  &tms7000_device::cmpa_inx,&tms7000_device::call_inx,&tms7000_device::illegal,
5656
57/* 0xBX */  clrc,    illegal, dec_a,   inc_a,   inv_a,   clr_a,   xchb_a,  swap_a,
58         push_a,  pop_a,   djnz_a,  decd_a,  rr_a,    rrc_a,   rl_a,    rlc_a,
57/* 0xBX */  &tms7000_device::clrc,    &tms7000_device::illegal, &tms7000_device::dec_a,   &tms7000_device::inc_a,   &tms7000_device::inv_a,   &tms7000_device::clr_a,   &tms7000_device::xchb_a,  &tms7000_device::swap_a,
58         &tms7000_device::push_a,  &tms7000_device::pop_a,   &tms7000_device::djnz_a,  &tms7000_device::decd_a,  &tms7000_device::rr_a,    &tms7000_device::rrc_a,   &tms7000_device::rl_a,    &tms7000_device::rlc_a,
5959
60/* 0xCX */  mov_a2b, tstb,    dec_b,   inc_b,   inv_b,   clr_b,   xchb_b,  swap_b,
61         push_b,  pop_b,   djnz_b,  decd_b,  rr_b,    rrc_b,   rl_b,    rlc_b,
60/* 0xCX */  &tms7000_device::mov_a2b, &tms7000_device::tstb,    &tms7000_device::dec_b,   &tms7000_device::inc_b,   &tms7000_device::inv_b,   &tms7000_device::clr_b,   &tms7000_device::xchb_b,  &tms7000_device::swap_b,
61         &tms7000_device::push_b,  &tms7000_device::pop_b,   &tms7000_device::djnz_b,  &tms7000_device::decd_b,  &tms7000_device::rr_b,    &tms7000_device::rrc_b,   &tms7000_device::rl_b,    &tms7000_device::rlc_b,
6262
63/* 0xDX */  mov_a2r, mov_b2r, dec_r,   inc_r,   inv_r,   clr_r,   xchb_r,  swap_r,
64         push_r,  pop_r,   djnz_r,  decd_r,  rr_r,    rrc_r,   rl_r,    rlc_r,
63/* 0xDX */  &tms7000_device::mov_a2r, &tms7000_device::mov_b2r, &tms7000_device::dec_r,   &tms7000_device::inc_r,   &tms7000_device::inv_r,   &tms7000_device::clr_r,   &tms7000_device::xchb_r,  &tms7000_device::swap_r,
64         &tms7000_device::push_r,  &tms7000_device::pop_r,   &tms7000_device::djnz_r,  &tms7000_device::decd_r,  &tms7000_device::rr_r,    &tms7000_device::rrc_r,   &tms7000_device::rl_r,    &tms7000_device::rlc_r,
6565
66/* 0xEX */  jmp,     j_jn,    jeq,     jc,      jp,      jpz,     jne,     jl,
67         trap_23, trap_22, trap_21, trap_20, trap_19, trap_18, trap_17, trap_16,
66/* 0xEX */  &tms7000_device::jmp,     &tms7000_device::j_jn,    &tms7000_device::jeq,     &tms7000_device::jc,      &tms7000_device::jp,      &tms7000_device::jpz,     &tms7000_device::jne,     &tms7000_device::jl,
67         &tms7000_device::trap_23, &tms7000_device::trap_22, &tms7000_device::trap_21, &tms7000_device::trap_20, &tms7000_device::trap_19, &tms7000_device::trap_18, &tms7000_device::trap_17, &tms7000_device::trap_16,
6868
69/* 0xFX */  trap_15, trap_14, trap_13, trap_12, trap_11, trap_10, trap_9,  trap_8,
70         trap_7,  trap_6,  trap_5,  trap_4,  trap_3,  trap_2,  trap_1,  trap_0
69/* 0xFX */  &tms7000_device::trap_15, &tms7000_device::trap_14, &tms7000_device::trap_13, &tms7000_device::trap_12, &tms7000_device::trap_11, &tms7000_device::trap_10, &tms7000_device::trap_9,  &tms7000_device::trap_8,
70         &tms7000_device::trap_7,  &tms7000_device::trap_6,  &tms7000_device::trap_5,  &tms7000_device::trap_4,  &tms7000_device::trap_3,  &tms7000_device::trap_2,  &tms7000_device::trap_1,  &tms7000_device::trap_0
7171};
7272
73static void (*const opfn_exl[0x100])(tms7000_state *cpustate) = {
73const tms7000_device::opcode_func tms7000_device::s_opfn_exl[0x100] = {
7474/*          0xX0,   0xX1,     0xX2,    0xX3,    0xX4,    0xX5,    0xX6,    0xX7,
7575            0xX8,   0xX9,     0xXA,    0xXB,    0xXC,    0xXD,    0xXE,    0xXF   */
7676
77/* 0x0X */  nop,     idle,    illegal, illegal, illegal, eint,    dint,    setc,
78         pop_st,  stsp,    rets,    reti,    illegal, ldsp,    push_st, illegal,
77/* 0x0X */  &tms7000_device::nop,     &tms7000_device::idle,    &tms7000_device::illegal, &tms7000_device::illegal, &tms7000_device::illegal, &tms7000_device::eint,    &tms7000_device::dint,    &tms7000_device::setc,
78         &tms7000_device::pop_st,  &tms7000_device::stsp,    &tms7000_device::rets,    &tms7000_device::reti,    &tms7000_device::illegal, &tms7000_device::ldsp,    &tms7000_device::push_st, &tms7000_device::illegal,
7979
80/* 0x1X */  illegal, illegal, mov_r2a, and_r2a, or_r2a,  xor_r2a, btjo_r2a,btjz_r2a,
81         add_r2a, adc_r2a, sub_ra,  sbb_ra,  mpy_ra,  cmp_ra,  dac_r2a, dsb_r2a,
80/* 0x1X */  &tms7000_device::illegal, &tms7000_device::illegal, &tms7000_device::mov_r2a, &tms7000_device::and_r2a, &tms7000_device::or_r2a,  &tms7000_device::xor_r2a, &tms7000_device::btjo_r2a,&tms7000_device::btjz_r2a,
81         &tms7000_device::add_r2a, &tms7000_device::adc_r2a, &tms7000_device::sub_ra,  &tms7000_device::sbb_ra,  &tms7000_device::mpy_ra,  &tms7000_device::cmp_ra,  &tms7000_device::dac_r2a, &tms7000_device::dsb_r2a,
8282
83/* 0x2X */  illegal, illegal, mov_i2a, and_i2a, or_i2a,  xor_i2a, btjo_i2a,btjz_i2a,
84         add_i2a, adc_i2a, sub_ia,  sbb_ia,  mpy_ia,  cmp_ia,  dac_i2a, dsb_i2a,
83/* 0x2X */  &tms7000_device::illegal, &tms7000_device::illegal, &tms7000_device::mov_i2a, &tms7000_device::and_i2a, &tms7000_device::or_i2a,  &tms7000_device::xor_i2a, &tms7000_device::btjo_i2a,&tms7000_device::btjz_i2a,
84         &tms7000_device::add_i2a, &tms7000_device::adc_i2a, &tms7000_device::sub_ia,  &tms7000_device::sbb_ia,  &tms7000_device::mpy_ia,  &tms7000_device::cmp_ia,  &tms7000_device::dac_i2a, &tms7000_device::dsb_i2a,
8585
86/* 0x3X */  illegal, illegal, mov_r2b, and_r2b, or_r2b,  xor_r2b, btjo_r2b,btjz_r2b,
87         add_r2b, adc_r2b, sub_rb,  sbb_rb,  mpy_rb,  cmp_rb,  dac_r2b, dsb_r2b,
86/* 0x3X */  &tms7000_device::illegal, &tms7000_device::illegal, &tms7000_device::mov_r2b, &tms7000_device::and_r2b, &tms7000_device::or_r2b,  &tms7000_device::xor_r2b, &tms7000_device::btjo_r2b,&tms7000_device::btjz_r2b,
87         &tms7000_device::add_r2b, &tms7000_device::adc_r2b, &tms7000_device::sub_rb,  &tms7000_device::sbb_rb,  &tms7000_device::mpy_rb,  &tms7000_device::cmp_rb,  &tms7000_device::dac_r2b, &tms7000_device::dsb_r2b,
8888
89/* 0x4X */  illegal, illegal, mov_r2r, and_r2r, or_r2r,  xor_r2r, btjo_r2r,btjz_r2r,
90         add_r2r, adc_r2r, sub_rr,  sbb_rr,  mpy_rr,  cmp_rr,  dac_r2r, dsb_r2r,
89/* 0x4X */  &tms7000_device::illegal, &tms7000_device::illegal, &tms7000_device::mov_r2r, &tms7000_device::and_r2r, &tms7000_device::or_r2r,  &tms7000_device::xor_r2r, &tms7000_device::btjo_r2r,&tms7000_device::btjz_r2r,
90         &tms7000_device::add_r2r, &tms7000_device::adc_r2r, &tms7000_device::sub_rr,  &tms7000_device::sbb_rr,  &tms7000_device::mpy_rr,  &tms7000_device::cmp_rr,  &tms7000_device::dac_r2r, &tms7000_device::dsb_r2r,
9191
92/* 0x5X */  illegal, illegal, mov_i2b, and_i2b, or_i2b,  xor_i2b, btjo_i2b,btjz_i2b,
93         add_i2b, adc_i2b, sub_ib,  sbb_ib,  mpy_ib,  cmp_ib,  dac_i2b, dsb_i2b,
92/* 0x5X */  &tms7000_device::illegal, &tms7000_device::illegal, &tms7000_device::mov_i2b, &tms7000_device::and_i2b, &tms7000_device::or_i2b,  &tms7000_device::xor_i2b, &tms7000_device::btjo_i2b,&tms7000_device::btjz_i2b,
93         &tms7000_device::add_i2b, &tms7000_device::adc_i2b, &tms7000_device::sub_ib,  &tms7000_device::sbb_ib,  &tms7000_device::mpy_ib,  &tms7000_device::cmp_ib,  &tms7000_device::dac_i2b, &tms7000_device::dsb_i2b,
9494
95/* 0x6X */  illegal, illegal, mov_b2a, and_b2a, or_b2a,  xor_b2a, btjo_b2a,btjz_b2a,
96         add_b2a, adc_b2a, sub_ba,  sbb_ba,  mpy_ba,  cmp_ba,  dac_b2a, dsb_b2a,
95/* 0x6X */  &tms7000_device::illegal, &tms7000_device::illegal, &tms7000_device::mov_b2a, &tms7000_device::and_b2a, &tms7000_device::or_b2a,  &tms7000_device::xor_b2a, &tms7000_device::btjo_b2a,&tms7000_device::btjz_b2a,
96         &tms7000_device::add_b2a, &tms7000_device::adc_b2a, &tms7000_device::sub_ba,  &tms7000_device::sbb_ba,  &tms7000_device::mpy_ba,  &tms7000_device::cmp_ba,  &tms7000_device::dac_b2a, &tms7000_device::dsb_b2a,
9797
98/* 0x7X */  illegal, illegal, mov_i2r, and_i2r, or_i2r,  xor_i2r, btjo_i2r,btjz_i2r,
99         add_i2r, adc_i2r, sub_ir,  sbb_ir,  mpy_ir,  cmp_ir,  dac_i2r, dsb_i2r,
98/* 0x7X */  &tms7000_device::illegal, &tms7000_device::illegal, &tms7000_device::mov_i2r, &tms7000_device::and_i2r, &tms7000_device::or_i2r,  &tms7000_device::xor_i2r, &tms7000_device::btjo_i2r,&tms7000_device::btjz_i2r,
99         &tms7000_device::add_i2r, &tms7000_device::adc_i2r, &tms7000_device::sub_ir,  &tms7000_device::sbb_ir,  &tms7000_device::mpy_ir,  &tms7000_device::cmp_ir,  &tms7000_device::dac_i2r, &tms7000_device::dsb_i2r,
100100
101/* 0x8X */  movp_p2a,illegal, movp_a2p,andp_a2p,orp_a2p, xorp_a2p,btjop_ap,btjzp_ap,
102         movd_imm,illegal, lda_dir, sta_dir, br_dir,  cmpa_dir,call_dir,illegal,
101/* 0x8X */  &tms7000_device::movp_p2a,&tms7000_device::illegal, &tms7000_device::movp_a2p,&tms7000_device::andp_a2p,&tms7000_device::orp_a2p, &tms7000_device::xorp_a2p,&tms7000_device::btjop_ap,&tms7000_device::btjzp_ap,
102         &tms7000_device::movd_imm,&tms7000_device::illegal, &tms7000_device::lda_dir, &tms7000_device::sta_dir, &tms7000_device::br_dir,  &tms7000_device::cmpa_dir,&tms7000_device::call_dir,&tms7000_device::illegal,
103103
104/* 0x9X */  illegal, movp_p2b,movp_b2p,andp_b2p,orp_b2p, xorp_b2p,btjop_bp,btjzp_bp,
105         movd_r,  illegal, lda_ind, sta_ind, br_ind,  cmpa_ind,call_ind,illegal,
104/* 0x9X */  &tms7000_device::illegal, &tms7000_device::movp_p2b,&tms7000_device::movp_b2p,&tms7000_device::andp_b2p,&tms7000_device::orp_b2p, &tms7000_device::xorp_b2p,&tms7000_device::btjop_bp,&tms7000_device::btjzp_bp,
105         &tms7000_device::movd_r,  &tms7000_device::illegal, &tms7000_device::lda_ind, &tms7000_device::sta_ind, &tms7000_device::br_ind,  &tms7000_device::cmpa_ind,&tms7000_device::call_ind,&tms7000_device::illegal,
106106
107/* 0xAX */  illegal, illegal, movp_i2p,andp_i2p,orp_i2p, xorp_i2p,btjop_ip,btjzp_ip,
108         movd_inx,illegal, lda_inx, sta_inx, br_inx,  cmpa_inx,call_inx,illegal,
107/* 0xAX */  &tms7000_device::illegal, &tms7000_device::illegal, &tms7000_device::movp_i2p,&tms7000_device::andp_i2p,&tms7000_device::orp_i2p, &tms7000_device::xorp_i2p,&tms7000_device::btjop_ip,&tms7000_device::btjzp_ip,
108         &tms7000_device::movd_inx,&tms7000_device::illegal, &tms7000_device::lda_inx, &tms7000_device::sta_inx, &tms7000_device::br_inx,  &tms7000_device::cmpa_inx,&tms7000_device::call_inx,&tms7000_device::illegal,
109109
110/* 0xBX */  clrc,    illegal, dec_a,   inc_a,   inv_a,   clr_a,   xchb_a,  swap_a,
111         push_a,  pop_a,   djnz_a,  decd_a,  rr_a,    rrc_a,   rl_a,    rlc_a,
110/* 0xBX */  &tms7000_device::clrc,    &tms7000_device::illegal, &tms7000_device::dec_a,   &tms7000_device::inc_a,   &tms7000_device::inv_a,   &tms7000_device::clr_a,   &tms7000_device::xchb_a,  &tms7000_device::swap_a,
111         &tms7000_device::push_a,  &tms7000_device::pop_a,   &tms7000_device::djnz_a,  &tms7000_device::decd_a,  &tms7000_device::rr_a,    &tms7000_device::rrc_a,   &tms7000_device::rl_a,    &tms7000_device::rlc_a,
112112
113/* 0xCX */  mov_a2b, tstb,    dec_b,   inc_b,   inv_b,   clr_b,   xchb_b,  swap_b,
114         push_b,  pop_b,   djnz_b,  decd_b,  rr_b,    rrc_b,   rl_b,    rlc_b,
113/* 0xCX */  &tms7000_device::mov_a2b, &tms7000_device::tstb,    &tms7000_device::dec_b,   &tms7000_device::inc_b,   &tms7000_device::inv_b,   &tms7000_device::clr_b,   &tms7000_device::xchb_b,  &tms7000_device::swap_b,
114         &tms7000_device::push_b,  &tms7000_device::pop_b,   &tms7000_device::djnz_b,  &tms7000_device::decd_b,  &tms7000_device::rr_b,    &tms7000_device::rrc_b,   &tms7000_device::rl_b,    &tms7000_device::rlc_b,
115115
116/* 0xDX */  mov_a2r, mov_b2r, dec_r,   inc_r,   inv_r,   clr_r,   xchb_r,  swap_r_exl,
117         push_r,  pop_r,   djnz_r,  decd_r,  rr_r,    rrc_r,   rl_r,    rlc_r,
116/* 0xDX */  &tms7000_device::mov_a2r, &tms7000_device::mov_b2r, &tms7000_device::dec_r,   &tms7000_device::inc_r,   &tms7000_device::inv_r,   &tms7000_device::clr_r,   &tms7000_device::xchb_r,  &tms7000_device::swap_r_exl,
117         &tms7000_device::push_r,  &tms7000_device::pop_r,   &tms7000_device::djnz_r,  &tms7000_device::decd_r,  &tms7000_device::rr_r,    &tms7000_device::rrc_r,   &tms7000_device::rl_r,    &tms7000_device::rlc_r,
118118
119/* 0xEX */  jmp,     j_jn,    jeq,     jc,      jp,      jpz,     jne,     jl,
120         trap_23, trap_22, trap_21, trap_20, trap_19, trap_18, trap_17, trap_16,
119/* 0xEX */  &tms7000_device::jmp,     &tms7000_device::j_jn,    &tms7000_device::jeq,     &tms7000_device::jc,      &tms7000_device::jp,      &tms7000_device::jpz,     &tms7000_device::jne,     &tms7000_device::jl,
120         &tms7000_device::trap_23, &tms7000_device::trap_22, &tms7000_device::trap_21, &tms7000_device::trap_20, &tms7000_device::trap_19, &tms7000_device::trap_18, &tms7000_device::trap_17, &tms7000_device::trap_16,
121121
122/* 0xFX */  trap_15, trap_14, trap_13, trap_12, trap_11, trap_10, trap_9,  trap_8,
123         trap_7,  trap_6,  trap_5,  trap_4,  trap_3,  trap_2,  trap_1,  trap_0
122/* 0xFX */  &tms7000_device::trap_15, &tms7000_device::trap_14, &tms7000_device::trap_13, &tms7000_device::trap_12, &tms7000_device::trap_11, &tms7000_device::trap_10, &tms7000_device::trap_9,  &tms7000_device::trap_8,
123         &tms7000_device::trap_7,  &tms7000_device::trap_6,  &tms7000_device::trap_5,  &tms7000_device::trap_4,  &tms7000_device::trap_3,  &tms7000_device::trap_2,  &tms7000_device::trap_1,  &tms7000_device::trap_0
124124};
trunk/src/emu/cpu/tms7000/tms70op.c
r26878r26879
2525
2626#include "emu.h"
2727
28static void illegal(tms7000_state *cpustate)
28void tms7000_device::illegal()
2929{
3030   /* This is a guess */
31   cpustate->icount -= 4;
31   m_icount -= 4;
3232}
3333
34static void adc_b2a(tms7000_state *cpustate)
34void tms7000_device::adc_b2a()
3535{
3636   UINT16  t;
3737
r26878r26879
4343   SET_N8(t);
4444   SET_Z8(t);
4545
46   cpustate->icount -= 5;
46   m_icount -= 5;
4747}
4848
49static void adc_r2a(tms7000_state *cpustate)
49void tms7000_device::adc_r2a()
5050{
5151   UINT16  t;
5252   UINT8   v;
r26878r26879
6161   SET_N8(t);
6262   SET_Z8(t);
6363
64   cpustate->icount -= 8;
64   m_icount -= 8;
6565}
6666
67static void adc_r2b(tms7000_state *cpustate)
67void tms7000_device::adc_r2b()
6868{
6969   UINT16  t;
7070   UINT8   v;
r26878r26879
7979   SET_N8(t);
8080   SET_Z8(t);
8181
82   cpustate->icount -= 8;
82   m_icount -= 8;
8383}
8484
85static void adc_r2r(tms7000_state *cpustate)
85void tms7000_device::adc_r2r()
8686{
8787   UINT16  t;
8888   UINT8   i,j;
r26878r26879
9898   SET_N8(t);
9999   SET_Z8(t);
100100
101   cpustate->icount -= 10;
101   m_icount -= 10;
102102}
103103
104static void adc_i2a(tms7000_state *cpustate)
104void tms7000_device::adc_i2a()
105105{
106106   UINT16  t;
107107   UINT8   v;
r26878r26879
116116   SET_N8(t);
117117   SET_Z8(t);
118118
119   cpustate->icount -= 7;
119   m_icount -= 7;
120120}
121121
122static void adc_i2b(tms7000_state *cpustate)
122void tms7000_device::adc_i2b()
123123{
124124   UINT16  t;
125125   UINT8   v;
r26878r26879
134134   SET_N8(t);
135135   SET_Z8(t);
136136
137   cpustate->icount -= 7;
137   m_icount -= 7;
138138}
139139
140static void adc_i2r(tms7000_state *cpustate)
140void tms7000_device::adc_i2r()
141141{
142142   UINT16  t;
143143   UINT8   i,j;
r26878r26879
153153   SET_N8(t);
154154   SET_Z8(t);
155155
156   cpustate->icount -= 9;
156   m_icount -= 9;
157157}
158158
159static void add_b2a(tms7000_state *cpustate)
159void tms7000_device::add_b2a()
160160{
161161   UINT16  t;
162162
r26878r26879
168168   SET_N8(t);
169169   SET_Z8(t);
170170
171   cpustate->icount -= 5;
171   m_icount -= 5;
172172}
173173
174static void add_r2a(tms7000_state *cpustate)
174void tms7000_device::add_r2a()
175175{
176176   UINT16  t;
177177   UINT8   v;
r26878r26879
186186   SET_N8(t);
187187   SET_Z8(t);
188188
189   cpustate->icount -= 8;
189   m_icount -= 8;
190190}
191191
192static void add_r2b(tms7000_state *cpustate)
192void tms7000_device::add_r2b()
193193{
194194   UINT16  t;
195195   UINT8   v;
r26878r26879
204204   SET_N8(t);
205205   SET_Z8(t);
206206
207   cpustate->icount -= 8;
207   m_icount -= 8;
208208}
209209
210static void add_r2r(tms7000_state *cpustate)
210void tms7000_device::add_r2r()
211211{
212212   UINT16  t;
213213   UINT8   i,j;
r26878r26879
223223   SET_N8(t);
224224   SET_Z8(t);
225225
226   cpustate->icount -= 10;
226   m_icount -= 10;
227227}
228228
229static void add_i2a(tms7000_state *cpustate)
229void tms7000_device::add_i2a()
230230{
231231   UINT16  t;
232232   UINT8   v;
r26878r26879
241241   SET_N8(t);
242242   SET_Z8(t);
243243
244   cpustate->icount -= 7;
244   m_icount -= 7;
245245}
246246
247static void add_i2b(tms7000_state *cpustate)
247void tms7000_device::add_i2b()
248248{
249249   UINT16  t;
250250   UINT8   v;
r26878r26879
259259   SET_N8(t);
260260   SET_Z8(t);
261261
262   cpustate->icount -= 7;
262   m_icount -= 7;
263263}
264264
265static void add_i2r(tms7000_state *cpustate)
265void tms7000_device::add_i2r()
266266{
267267   UINT16  t;
268268   UINT8   i,j;
r26878r26879
278278   SET_N8(t);
279279   SET_Z8(t);
280280
281   cpustate->icount -= 9;
281   m_icount -= 9;
282282}
283283
284static void and_b2a(tms7000_state *cpustate)
284void tms7000_device::and_b2a()
285285{
286286   UINT8   t;
287287
r26878r26879
292292   SET_N8(t);
293293   SET_Z8(t);
294294
295   cpustate->icount -= 5;
295   m_icount -= 5;
296296}
297297
298static void and_r2a(tms7000_state *cpustate)
298void tms7000_device::and_r2a()
299299{
300300   UINT8   t;
301301   UINT8   v;
r26878r26879
309309   SET_N8(t);
310310   SET_Z8(t);
311311
312   cpustate->icount -= 8;
312   m_icount -= 8;
313313}
314314
315static void and_r2b(tms7000_state *cpustate)
315void tms7000_device::and_r2b()
316316{
317317   UINT8   t;
318318   UINT8   v;
r26878r26879
326326   SET_N8(t);
327327   SET_Z8(t);
328328
329   cpustate->icount -= 8;
329   m_icount -= 8;
330330}
331331
332static void and_r2r(tms7000_state *cpustate)
332void tms7000_device::and_r2r()
333333{
334334   UINT8   t;
335335   UINT8   i,j;
r26878r26879
344344   SET_N8(t);
345345   SET_Z8(t);
346346
347   cpustate->icount -= 10;
347   m_icount -= 10;
348348}
349349
350static void and_i2a(tms7000_state *cpustate)
350void tms7000_device::and_i2a()
351351{
352352   UINT8   t;
353353   UINT8   v;
r26878r26879
361361   SET_N8(t);
362362   SET_Z8(t);
363363
364   cpustate->icount -= 7;
364   m_icount -= 7;
365365}
366366
367static void and_i2b(tms7000_state *cpustate)
367void tms7000_device::and_i2b()
368368{
369369   UINT8   t;
370370   UINT8   v;
r26878r26879
378378   SET_N8(t);
379379   SET_Z8(t);
380380
381   cpustate->icount -= 7;
381   m_icount -= 7;
382382}
383383
384static void and_i2r(tms7000_state *cpustate)
384void tms7000_device::and_i2r()
385385{
386386   UINT8   t;
387387   UINT8   i,j;
r26878r26879
396396   SET_N8(t);
397397   SET_Z8(t);
398398
399   cpustate->icount -= 9;
399   m_icount -= 9;
400400}
401401
402static void andp_a2p(tms7000_state *cpustate)
402void tms7000_device::andp_a2p()
403403{
404404   UINT8   t;
405405   UINT8   v;
r26878r26879
412412   SET_N8(t);
413413   SET_Z8(t);
414414
415   cpustate->icount -= 10;
415   m_icount -= 10;
416416}
417417
418static void andp_b2p(tms7000_state *cpustate)
418void tms7000_device::andp_b2p()
419419{
420420   UINT8   t;
421421   UINT8   v;
r26878r26879
428428   SET_N8(t);
429429   SET_Z8(t);
430430
431   cpustate->icount -= 9;
431   m_icount -= 9;
432432}
433433
434434
435static void movp_i2p(tms7000_state *cpustate)
435void tms7000_device::movp_i2p()
436436{
437437   UINT8   i,v;
438438
r26878r26879
444444   SET_N8(i);
445445   SET_Z8(i);
446446
447   cpustate->icount -= 11;
447   m_icount -= 11;
448448}
449449
450static void andp_i2p(tms7000_state *cpustate)
450void tms7000_device::andp_i2p()
451451{
452452   UINT8   t;
453453   UINT8   i,v;
r26878r26879
461461   SET_N8(t);
462462   SET_Z8(t);
463463
464   cpustate->icount -= 11;
464   m_icount -= 11;
465465}
466466
467static void br_dir(tms7000_state *cpustate)
467void tms7000_device::br_dir()
468468{
469469   PAIR p;
470470
471471   IMMWORD( p );
472472   pPC = p.d;
473   cpustate->icount -= 10;
473   m_icount -= 10;
474474}
475475
476static void br_ind(tms7000_state *cpustate)
476void tms7000_device::br_ind()
477477{
478478   UINT8   v;
479479
480480   IMMBYTE( v );
481   PC.w.l = RRF16(cpustate,v);
481   PC.w.l = RRF16(v);
482482
483   cpustate->icount -= 9;
483   m_icount -= 9;
484484}
485485
486static void br_inx(tms7000_state *cpustate)
486void tms7000_device::br_inx()
487487{
488488   PAIR p;
489489
490490   IMMWORD( p );
491491   pPC = p.w.l + RDB;
492   cpustate->icount -= 12;
492   m_icount -= 12;
493493}
494494
495static void btjo_b2a(tms7000_state *cpustate)
495void tms7000_device::btjo_b2a()
496496{
497497   UINT8   t;
498498
r26878r26879
508508
509509      SIMMBYTE( j );
510510      pPC += j;
511      cpustate->icount -= 9;
511      m_icount -= 9;
512512   }
513513   else
514514   {
515515      pPC++;
516      cpustate->icount -= 7;
516      m_icount -= 7;
517517   }
518518}
519519
520static void btjo_r2a(tms7000_state *cpustate)
520void tms7000_device::btjo_r2a()
521521{
522522   UINT8   t,r;
523523
r26878r26879
534534
535535      SIMMBYTE( j );
536536      pPC += j;
537      cpustate->icount -= 9;
537      m_icount -= 9;
538538   }
539539   else
540540   {
541541      pPC++;
542      cpustate->icount -= 7;
542      m_icount -= 7;
543543   }
544544}
545545
546static void btjo_r2b(tms7000_state *cpustate)
546void tms7000_device::btjo_r2b()
547547{
548548   UINT8   t,r;
549549
r26878r26879
560560
561561      SIMMBYTE(j);
562562      pPC += j;
563      cpustate->icount -= 12;
563      m_icount -= 12;
564564   }
565565   else
566566   {
567567      pPC++;
568      cpustate->icount -= 10;
568      m_icount -= 10;
569569   }
570570}
571571
572static void btjo_r2r(tms7000_state *cpustate)
572void tms7000_device::btjo_r2r()
573573{
574574   UINT8   t,r,s;
575575
r26878r26879
587587
588588      SIMMBYTE(j);
589589      pPC += j;
590      cpustate->icount -= 14;
590      m_icount -= 14;
591591   }
592592   else
593593   {
594594      pPC++;
595      cpustate->icount -= 12;
595      m_icount -= 12;
596596   }
597597}
598598
599static void btjo_i2a(tms7000_state *cpustate)
599void tms7000_device::btjo_i2a()
600600{
601601   UINT8   t,r;
602602
r26878r26879
613613
614614      SIMMBYTE(j);
615615      pPC += j;
616      cpustate->icount -= 11;
616      m_icount -= 11;
617617   }
618618   else
619619   {
620620      pPC++;
621      cpustate->icount -= 9;
621      m_icount -= 9;
622622   }
623623}
624624
625static void btjo_i2b(tms7000_state *cpustate)
625void tms7000_device::btjo_i2b()
626626{
627627   UINT8   t,i;
628628
r26878r26879
639639
640640      SIMMBYTE(j);
641641      pPC += j;
642      cpustate->icount -= 11;
642      m_icount -= 11;
643643   }
644644   else
645645   {
646646      pPC++;
647      cpustate->icount -= 9;
647      m_icount -= 9;
648648   }
649649}
650650
651static void btjo_i2r(tms7000_state *cpustate)
651void tms7000_device::btjo_i2r()
652652{
653653   UINT8   t,i,r;
654654
r26878r26879
666666
667667      SIMMBYTE(j);
668668      pPC += j;
669      cpustate->icount -= 13;
669      m_icount -= 13;
670670   }
671671   else
672672   {
673673      pPC++;
674      cpustate->icount -= 11;
674      m_icount -= 11;
675675   }
676676}
677677
678static void btjop_ap(tms7000_state *cpustate)
678void tms7000_device::btjop_ap()
679679{
680680   UINT8   t,p;
681681
r26878r26879
693693
694694      SIMMBYTE(j);
695695      pPC += j;
696      cpustate->icount -= 13;
696      m_icount -= 13;
697697   }
698698   else
699699   {
700700      pPC++;
701      cpustate->icount -= 11;
701      m_icount -= 11;
702702   }
703703}
704704
705static void btjop_bp(tms7000_state *cpustate)
705void tms7000_device::btjop_bp()
706706{
707707   UINT8   t,p;
708708
r26878r26879
720720
721721      SIMMBYTE(j);
722722      pPC += j;
723      cpustate->icount -= 12;
723      m_icount -= 12;
724724   }
725725   else
726726   {
727727      pPC++;
728      cpustate->icount -= 10;
728      m_icount -= 10;
729729   }
730730}
731731
732static void btjop_ip(tms7000_state *cpustate)
732void tms7000_device::btjop_ip()
733733{
734734   UINT8   t,p,i;
735735
r26878r26879
748748
749749      SIMMBYTE(j);
750750      pPC += j;
751      cpustate->icount -= 14;
751      m_icount -= 14;
752752   }
753753   else
754754   {
755755      pPC++;
756      cpustate->icount -= 12;
756      m_icount -= 12;
757757   }
758758}
759759
760static void btjz_b2a(tms7000_state *cpustate)
760void tms7000_device::btjz_b2a()
761761{
762762   UINT8   t;
763763
r26878r26879
773773
774774      SIMMBYTE( j );
775775      pPC += j;
776      cpustate->icount -= 9;
776      m_icount -= 9;
777777   }
778778   else
779779   {
780780      pPC++;
781      cpustate->icount -= 7;
781      m_icount -= 7;
782782   }
783783}
784784
785static void btjz_r2a(tms7000_state *cpustate)
785void tms7000_device::btjz_r2a()
786786{
787787   UINT8   t,r;
788788
r26878r26879
799799
800800      SIMMBYTE( j );
801801      pPC += j;
802      cpustate->icount -= 9;
802      m_icount -= 9;
803803   }
804804   else
805805   {
806806      pPC++;
807      cpustate->icount -= 7;
807      m_icount -= 7;
808808   }
809809}
810810
811static void btjz_r2b(tms7000_state *cpustate)
811void tms7000_device::btjz_r2b()
812812{
813813   UINT8   t,r;
814814
r26878r26879
825825
826826      SIMMBYTE(j);
827827      pPC += j;
828      cpustate->icount -= 12;
828      m_icount -= 12;
829829   }
830830   else
831831   {
832832      pPC++;
833      cpustate->icount -= 10;
833      m_icount -= 10;
834834   }
835835}
836836
837static void btjz_r2r(tms7000_state *cpustate)
837void tms7000_device::btjz_r2r()
838838{
839839   UINT8   t,r,s;
840840
r26878r26879
852852
853853      SIMMBYTE(j);
854854      pPC += j;
855      cpustate->icount -= 14;
855      m_icount -= 14;
856856   }
857857   else
858858   {
859859      pPC++;
860      cpustate->icount -= 12;
860      m_icount -= 12;
861861   }
862862}
863863
864static void btjz_i2a(tms7000_state *cpustate)
864void tms7000_device::btjz_i2a()
865865{
866866   UINT8   t,r;
867867
r26878r26879
878878
879879      SIMMBYTE(j);
880880      pPC += j;
881      cpustate->icount -= 11;
881      m_icount -= 11;
882882   }
883883   else
884884   {
885885      pPC++;
886      cpustate->icount -= 9;
886      m_icount -= 9;
887887   }
888888}
889889
890static void btjz_i2b(tms7000_state *cpustate)
890void tms7000_device::btjz_i2b()
891891{
892892   UINT8   t,i;
893893
r26878r26879
904904
905905      SIMMBYTE(j);
906906      pPC += j;
907      cpustate->icount -= 11;
907      m_icount -= 11;
908908   }
909909   else
910910   {
911911      pPC++;
912      cpustate->icount -= 9;
912      m_icount -= 9;
913913   }
914914}
915915
916static void btjz_i2r(tms7000_state *cpustate)
916void tms7000_device::btjz_i2r()
917917{
918918   UINT8   t,i,r;
919919
r26878r26879
931931
932932      SIMMBYTE(j);
933933      pPC += j;
934      cpustate->icount -= 13;
934      m_icount -= 13;
935935   }
936936   else
937937   {
938938      pPC++;
939      cpustate->icount -= 11;
939      m_icount -= 11;
940940   }
941941}
942942
943static void btjzp_ap(tms7000_state *cpustate)
943void tms7000_device::btjzp_ap()
944944{
945945   UINT8   t,p;
946946
r26878r26879
958958
959959      SIMMBYTE(j);
960960      pPC += j;
961      cpustate->icount -= 13;
961      m_icount -= 13;
962962   }
963963   else
964964   {
965965      pPC++;
966      cpustate->icount -= 11;
966      m_icount -= 11;
967967   }
968968}
969969
970static void btjzp_bp(tms7000_state *cpustate)
970void tms7000_device::btjzp_bp()
971971{
972972   UINT8   t,p;
973973
r26878r26879
985985
986986      SIMMBYTE(j);
987987      pPC += j;
988      cpustate->icount -= 12;
988      m_icount -= 12;
989989   }
990990   else
991991   {
992992      pPC++;
993      cpustate->icount -= 10;
993      m_icount -= 10;
994994   }
995995}
996996
997static void btjzp_ip(tms7000_state *cpustate)
997void tms7000_device::btjzp_ip()
998998{
999999   UINT8   t,p,i;
10001000
r26878r26879
10131013
10141014      SIMMBYTE(j);
10151015      pPC += j;
1016      cpustate->icount -= 14;
1016      m_icount -= 14;
10171017   }
10181018   else
10191019   {
10201020      pPC++;
1021      cpustate->icount -= 12;
1021      m_icount -= 12;
10221022   }
10231023}
10241024
1025static void call_dir(tms7000_state *cpustate)
1025void tms7000_device::call_dir()
10261026{
10271027   PAIR    tPC;
10281028
r26878r26879
10301030   PUSHWORD( PC );
10311031   pPC = tPC.d;
10321032
1033   cpustate->icount -= 14;
1033   m_icount -= 14;
10341034}
10351035
1036static void call_ind(tms7000_state *cpustate)
1036void tms7000_device::call_ind()
10371037{
10381038   UINT8   v;
10391039
10401040   IMMBYTE( v );
10411041   PUSHWORD( PC );
1042   PC.w.l = RRF16(cpustate,v);
1042   PC.w.l = RRF16(v);
10431043
1044   cpustate->icount -= 13;
1044   m_icount -= 13;
10451045}
10461046
1047static void call_inx(tms7000_state *cpustate)
1047void tms7000_device::call_inx()
10481048{
10491049   PAIR    tPC;
10501050
10511051   IMMWORD( tPC );
10521052   PUSHWORD( PC );
10531053   pPC = tPC.w.l + RDB;
1054   cpustate->icount -= 16;
1054   m_icount -= 16;
10551055}
10561056
1057static void clr_a(tms7000_state *cpustate)
1057void tms7000_device::clr_a()
10581058{
10591059   WRA(0);
1060   cpustate->icount -= 5;
1060   m_icount -= 5;
10611061}
10621062
1063static void clr_b(tms7000_state *cpustate)
1063void tms7000_device::clr_b()
10641064{
10651065   WRB(0);
1066   cpustate->icount -= 5;
1066   m_icount -= 5;
10671067}
10681068
1069static void clr_r(tms7000_state *cpustate)
1069void tms7000_device::clr_r()
10701070{
10711071   UINT8   r;
10721072
10731073   IMMBYTE(r);
10741074   WM(r,0);
1075   cpustate->icount -= 7;
1075   m_icount -= 7;
10761076}
10771077
1078static void clrc(tms7000_state *cpustate)
1078void tms7000_device::clrc()
10791079{
10801080   UINT8   a;
10811081
r26878r26879
10851085   SET_N8(a);
10861086   SET_Z8(a);
10871087
1088   cpustate->icount -= 6;
1088   m_icount -= 6;
10891089}
10901090
1091static void cmp_ba(tms7000_state *cpustate)
1091void tms7000_device::cmp_ba()
10921092{
10931093   UINT16 t;
10941094
r26878r26879
11031103   else
11041104      SET_C8( ~t );
11051105
1106   cpustate->icount -= 5;
1106   m_icount -= 5;
11071107}
11081108
1109static void cmp_ra(tms7000_state *cpustate)
1109void tms7000_device::cmp_ra()
11101110{
11111111   UINT16  t;
11121112   UINT8   r;
r26878r26879
11231123   else
11241124      SET_C8( ~t );
11251125
1126   cpustate->icount -= 8;
1126   m_icount -= 8;
11271127}
11281128
1129static void cmp_rb(tms7000_state *cpustate)
1129void tms7000_device::cmp_rb()
11301130{
11311131   UINT16  t;
11321132   UINT8   r;
r26878r26879
11431143   else
11441144      SET_C8( ~t );
11451145
1146   cpustate->icount -= 8;
1146   m_icount -= 8;
11471147}
11481148
1149static void cmp_rr(tms7000_state *cpustate)
1149void tms7000_device::cmp_rr()
11501150{
11511151   UINT16  t;
11521152   UINT8   r,s;
r26878r26879
11641164   else
11651165      SET_C8( ~t );
11661166
1167   cpustate->icount -= 10;
1167   m_icount -= 10;
11681168}
11691169
1170static void cmp_ia(tms7000_state *cpustate)
1170void tms7000_device::cmp_ia()
11711171{
11721172   UINT16  t;
11731173   UINT8   i;
r26878r26879
11841184   else
11851185      SET_C8( ~t );
11861186
1187   cpustate->icount -= 7;
1187   m_icount -= 7;
11881188}
11891189
1190static void cmp_ib(tms7000_state *cpustate)
1190void tms7000_device::cmp_ib()
11911191{
11921192   UINT16  t;
11931193   UINT8   i;
r26878r26879
12041204   else
12051205      SET_C8( ~t );
12061206
1207   cpustate->icount -= 7;
1207   m_icount -= 7;
12081208}
12091209
1210static void cmp_ir(tms7000_state *cpustate)
1210void tms7000_device::cmp_ir()
12111211{
12121212   UINT16  t;
12131213   UINT8   i,r;
r26878r26879
12251225   else
12261226      SET_C8( ~t );
12271227
1228   cpustate->icount -= 9;
1228   m_icount -= 9;
12291229}
12301230
1231static void cmpa_dir(tms7000_state *cpustate)
1231void tms7000_device::cmpa_dir()
12321232{
12331233   UINT16  t;
12341234   PAIR    i;
r26878r26879
12451245   else
12461246      SET_C8( ~t );
12471247
1248   cpustate->icount -= 12;
1248   m_icount -= 12;
12491249}
12501250
1251static void cmpa_ind(tms7000_state *cpustate)
1251void tms7000_device::cmpa_ind()
12521252{
12531253   UINT16  t;
12541254   PAIR    p;
12551255   INT8    i;
12561256
12571257   IMMBYTE(i);
1258   p.w.l = RRF16(cpustate,i);
1258   p.w.l = RRF16(i);
12591259   t = RDA - RM(p.w.l);
12601260
12611261   CLR_NZC;
r26878r26879
12671267   else
12681268      SET_C8( ~t );
12691269
1270   cpustate->icount -= 11;
1270   m_icount -= 11;
12711271}
12721272
1273static void cmpa_inx(tms7000_state *cpustate)
1273void tms7000_device::cmpa_inx()
12741274{
12751275   UINT16  t;
12761276   PAIR    i;
r26878r26879
12871287   else
12881288      SET_C8( ~t );
12891289
1290   cpustate->icount -= 14;
1290   m_icount -= 14;
12911291}
12921292
1293static void dac_b2a(tms7000_state *cpustate)
1293void tms7000_device::dac_b2a()
12941294{
12951295   UINT16  t;
12961296
r26878r26879
13061306   SET_N8(t);
13071307   SET_Z8(t);
13081308
1309   cpustate->icount -= 7;
1309   m_icount -= 7;
13101310}
13111311
1312static void dac_r2a(tms7000_state *cpustate)
1312void tms7000_device::dac_r2a()
13131313{
13141314   UINT8   r;
13151315   UINT16  t;
r26878r26879
13281328   SET_N8(t);
13291329   SET_Z8(t);
13301330
1331   cpustate->icount -= 10;
1331   m_icount -= 10;
13321332}
13331333
1334static void dac_r2b(tms7000_state *cpustate)
1334void tms7000_device::dac_r2b()
13351335{
13361336   UINT8   r;
13371337   UINT16  t;
r26878r26879
13501350   SET_N8(t);
13511351   SET_Z8(t);
13521352
1353   cpustate->icount -= 10;
1353   m_icount -= 10;
13541354}
13551355
1356static void dac_r2r(tms7000_state *cpustate)
1356void tms7000_device::dac_r2r()
13571357{
13581358   UINT8   r,s;
13591359   UINT16  t;
r26878r26879
13731373   SET_N8(t);
13741374   SET_Z8(t);
13751375
1376   cpustate->icount -= 12;
1376   m_icount -= 12;
13771377}
13781378
1379static void dac_i2a(tms7000_state *cpustate)
1379void tms7000_device::dac_i2a()
13801380{
13811381   UINT8   i;
13821382   UINT16  t;
r26878r26879
13951395   SET_N8(t);
13961396   SET_Z8(t);
13971397
1398   cpustate->icount -= 9;
1398   m_icount -= 9;
13991399}
14001400
1401static void dac_i2b(tms7000_state *cpustate)
1401void tms7000_device::dac_i2b()
14021402{
14031403   UINT8   i;
14041404   UINT16  t;
r26878r26879
14171417   SET_N8(t);
14181418   SET_Z8(t);
14191419
1420   cpustate->icount -= 9;
1420   m_icount -= 9;
14211421}
14221422
1423static void dac_i2r(tms7000_state *cpustate)
1423void tms7000_device::dac_i2r()
14241424{
14251425   UINT8   i,r;
14261426   UINT16  t;
r26878r26879
14401440   SET_N8(t);
14411441   SET_Z8(t);
14421442
1443   cpustate->icount -= 11;
1443   m_icount -= 11;
14441444}
14451445
1446static void dec_a(tms7000_state *cpustate)
1446void tms7000_device::dec_a()
14471447{
14481448   UINT16 t;
14491449
r26878r26879
14561456   SET_Z8(t);
14571457   SET_C8(~t);
14581458
1459   cpustate->icount -= 5;
1459   m_icount -= 5;
14601460}
14611461
1462static void dec_b(tms7000_state *cpustate)
1462void tms7000_device::dec_b()
14631463{
14641464   UINT16 t;
14651465
r26878r26879
14721472   SET_Z8(t);
14731473   SET_C8(~t);
14741474
1475   cpustate->icount -= 5;
1475   m_icount -= 5;
14761476}
14771477
1478static void dec_r(tms7000_state *cpustate)
1478void tms7000_device::dec_r()
14791479{
14801480   UINT16  t;
14811481   UINT8   r;
r26878r26879
14911491   SET_Z8(t);
14921492   SET_C8(~t);
14931493
1494   cpustate->icount -= 7;
1494   m_icount -= 7;
14951495}
14961496
1497static void decd_a(tms7000_state *cpustate)
1497void tms7000_device::decd_a()
14981498{
14991499   PAIR    t;
15001500
15011501   t.w.h = 0;
1502   t.w.l = RRF16(cpustate,0);
1502   t.w.l = RRF16(0);
15031503   t.d -= 1;
1504   WRF16(cpustate,0,t);
1504   WRF16(0,t);
15051505
15061506   CLR_NZC;
15071507   SET_N8(t.b.h);
r26878r26879
15091509
15101510   SET_C16(~(t.d));
15111511
1512   cpustate->icount -= 9;
1512   m_icount -= 9;
15131513}
15141514
1515static void decd_b(tms7000_state *cpustate)
1515void tms7000_device::decd_b()
15161516{
15171517   PAIR    t;
15181518
15191519   t.w.h = 0;
1520   t.w.l = RRF16(cpustate,1);
1520   t.w.l = RRF16(1);
15211521   t.d -= 1;
1522   WRF16(cpustate,1,t);
1522   WRF16(1,t);
15231523
15241524   CLR_NZC;
15251525   SET_N8(t.b.h);
r26878r26879
15271527
15281528   SET_C16(~(t.d));
15291529
1530   cpustate->icount -= 9;
1530   m_icount -= 9;
15311531}
15321532
1533static void decd_r(tms7000_state *cpustate)
1533void tms7000_device::decd_r()
15341534{
15351535   UINT8   r;
15361536   PAIR    t;
15371537
15381538   IMMBYTE(r);
15391539   t.w.h = 0;
1540   t.w.l = RRF16(cpustate,r);
1540   t.w.l = RRF16(r);
15411541   t.d -= 1;
1542   WRF16(cpustate,r,t);
1542   WRF16(r,t);
15431543
15441544   CLR_NZC;
15451545   SET_N8(t.b.h);
r26878r26879
15471547
15481548   SET_C16(~(t.d));
15491549
1550   cpustate->icount -= 11;
1550   m_icount -= 11;
15511551}
15521552
1553static void dint(tms7000_state *cpustate)
1553void tms7000_device::dint()
15541554{
15551555   CLR_NZCI;
1556   cpustate->icount -= 5;
1556   m_icount -= 5;
15571557}
15581558
1559static void djnz_a(tms7000_state *cpustate)
1559void tms7000_device::djnz_a()
15601560{
15611561   UINT16 t;
15621562
r26878r26879
15741574
15751575      SIMMBYTE(s);
15761576      pPC += s;
1577      cpustate->icount -= 7;
1577      m_icount -= 7;
15781578   }
15791579   else
15801580   {
15811581      pPC++;
1582      cpustate->icount -= 2;
1582      m_icount -= 2;
15831583   }
15841584}
15851585
1586static void djnz_b(tms7000_state *cpustate)
1586void tms7000_device::djnz_b()
15871587{
15881588   UINT16 t;
15891589
r26878r26879
16011601
16021602      SIMMBYTE(s);
16031603      pPC += s;
1604      cpustate->icount -= 7;
1604      m_icount -= 7;
16051605   }
16061606   else
16071607   {
16081608      pPC++;
1609      cpustate->icount -= 2;
1609      m_icount -= 2;
16101610   }
16111611}
16121612
1613static void djnz_r(tms7000_state *cpustate)
1613void tms7000_device::djnz_r()
16141614{
16151615   UINT16  t;
16161616   UINT8   r;
r26878r26879
16311631
16321632      SIMMBYTE(s);
16331633      pPC += s;
1634      cpustate->icount -= 9;
1634      m_icount -= 9;
16351635   }
16361636   else
16371637   {
16381638      pPC++;
1639      cpustate->icount -= 3;
1639      m_icount -= 3;
16401640   }
16411641}
16421642
1643static void dsb_b2a(tms7000_state *cpustate)
1643void tms7000_device::dsb_b2a()
16441644{
16451645   UINT16  t;
16461646
r26878r26879
16561656   SET_N8(t);
16571657   SET_Z8(t);
16581658
1659   cpustate->icount -= 7;
1659   m_icount -= 7;
16601660}
16611661
1662static void dsb_r2a(tms7000_state *cpustate)
1662void tms7000_device::dsb_r2a()
16631663{
16641664   UINT8   r;
16651665   UINT16  t;
r26878r26879
16781678   SET_N8(t);
16791679   SET_Z8(t);
16801680
1681   cpustate->icount -= 10;
1681   m_icount -= 10;
16821682}
16831683
1684static void dsb_r2b(tms7000_state *cpustate)
1684void tms7000_device::dsb_r2b()
16851685{
16861686   UINT8   r;
16871687   UINT16  t;
r26878r26879
17001700   SET_N8(t);
17011701   SET_Z8(t);
17021702
1703   cpustate->icount -= 10;
1703   m_icount -= 10;
17041704}
17051705
1706static void dsb_r2r(tms7000_state *cpustate)
1706void tms7000_device::dsb_r2r()
17071707{
17081708   UINT8   r,s;
17091709   UINT16  t;
r26878r26879
17231723   SET_N8(t);
17241724   SET_Z8(t);
17251725
1726   cpustate->icount -= 12;
1726   m_icount -= 12;
17271727}
17281728
1729static void dsb_i2a(tms7000_state *cpustate)
1729void tms7000_device::dsb_i2a()
17301730{
17311731   UINT8   i;
17321732   UINT16  t;
r26878r26879
17451745   SET_N8(t);
17461746   SET_Z8(t);
17471747
1748   cpustate->icount -= 9;
1748   m_icount -= 9;
17491749}
17501750
1751static void dsb_i2b(tms7000_state *cpustate)
1751void tms7000_device::dsb_i2b()
17521752{
17531753   UINT8   i;
17541754   UINT16  t;
r26878r26879
17671767   SET_N8(t);
17681768   SET_Z8(t);
17691769
1770   cpustate->icount -= 9;
1770   m_icount -= 9;
17711771}
17721772
1773static void dsb_i2r(tms7000_state *cpustate)
1773void tms7000_device::dsb_i2r()
17741774{
17751775   UINT8   r,i;
17761776   UINT16  t;
r26878r26879
17901790   SET_N8(t);
17911791   SET_Z8(t);
17921792
1793   cpustate->icount -= 11;
1793   m_icount -= 11;
17941794}
17951795
1796static void eint(tms7000_state *cpustate)
1796void tms7000_device::eint()
17971797{
17981798   pSR |= (SR_N|SR_Z|SR_C|SR_I);
1799   cpustate->icount -= 5;
1800   tms7000_check_IRQ_lines(cpustate);
1799   m_icount -= 5;
1800   tms7000_check_IRQ_lines();
18011801}
18021802
1803static void idle(tms7000_state *cpustate)
1803void tms7000_device::idle()
18041804{
1805   cpustate->idle_state = 1;
1806   cpustate->icount -= 6;
1805   m_idle_state = 1;
1806   m_icount -= 6;
18071807}
18081808
1809static void inc_a(tms7000_state *cpustate)
1809void tms7000_device::inc_a()
18101810{
18111811   UINT16  t;
18121812
r26878r26879
18191819   SET_N8(t);
18201820   SET_Z8(t);
18211821
1822   cpustate->icount -= 5;
1822   m_icount -= 5;
18231823}
18241824
1825static void inc_b(tms7000_state *cpustate)
1825void tms7000_device::inc_b()
18261826{
18271827   UINT16  t;
18281828
r26878r26879
18351835   SET_N8(t);
18361836   SET_Z8(t);
18371837
1838   cpustate->icount -= 5;
1838   m_icount -= 5;
18391839}
18401840
1841static void inc_r(tms7000_state *cpustate)
1841void tms7000_device::inc_r()
18421842{
18431843   UINT16  t;
18441844   UINT8   r;
r26878r26879
18541854   SET_Z8(t);
18551855   SET_C8(t);
18561856
1857   cpustate->icount -= 7;
1857   m_icount -= 7;
18581858}
18591859
1860static void inv_a(tms7000_state *cpustate)
1860void tms7000_device::inv_a()
18611861{
18621862   UINT16 t;
18631863
r26878r26879
18681868   SET_N8(t);
18691869   SET_Z8(t);
18701870
1871   cpustate->icount -= 5;
1871   m_icount -= 5;
18721872}
18731873
1874static void inv_b(tms7000_state *cpustate)
1874void tms7000_device::inv_b()
18751875{
18761876   UINT16 t;
18771877
r26878r26879
18821882   SET_N8(t);
18831883   SET_Z8(t);
18841884
1885   cpustate->icount -= 5;
1885   m_icount -= 5;
18861886}
18871887
1888static void inv_r(tms7000_state *cpustate)
1888void tms7000_device::inv_r()
18891889{
18901890   UINT16  t;
18911891   UINT8   r;
r26878r26879
19001900   SET_N8(t);
19011901   SET_Z8(t);
19021902
1903   cpustate->icount -= 7;
1903   m_icount -= 7;
19041904}
19051905
1906static void jc(tms7000_state *cpustate)
1906void tms7000_device::jc()
19071907{
19081908   if( pSR & SR_C )
19091909   {
r26878r26879
19111911
19121912      SIMMBYTE( s );
19131913      pPC += s;
1914      cpustate->icount -= 7;
1914      m_icount -= 7;
19151915   }
19161916   else
19171917   {
19181918      pPC++;
1919      cpustate->icount -= 5;
1919      m_icount -= 5;
19201920   }
19211921}
19221922
1923static void jeq(tms7000_state *cpustate)
1923void tms7000_device::jeq()
19241924{
19251925   if( pSR & SR_Z )
19261926   {
r26878r26879
19281928
19291929      SIMMBYTE( s );
19301930      pPC += s;
1931      cpustate->icount -= 7;
1931      m_icount -= 7;
19321932   }
19331933   else
19341934   {
19351935      pPC++;
1936      cpustate->icount -= 5;
1936      m_icount -= 5;
19371937   }
19381938}
19391939
1940static void jl(tms7000_state *cpustate)
1940void tms7000_device::jl()
19411941{
19421942   if( pSR & SR_C )
19431943   {
19441944      pPC++;
1945      cpustate->icount -= 5;
1945      m_icount -= 5;
19461946   }
19471947   else
19481948   {
r26878r26879
19501950
19511951      SIMMBYTE( s );
19521952      pPC += s;
1953      cpustate->icount -= 7;
1953      m_icount -= 7;
19541954   }
19551955}
19561956
1957static void jmp(tms7000_state *cpustate)
1957void tms7000_device::jmp()
19581958{
19591959   INT8 s;
19601960
19611961   SIMMBYTE( s );
19621962   pPC += s;
1963   cpustate->icount -= 7;
1963   m_icount -= 7;
19641964}
19651965
1966static void j_jn(tms7000_state *cpustate)
1966void tms7000_device::j_jn()
19671967{
19681968   if( pSR & SR_N )
19691969   {
r26878r26879
19711971
19721972      SIMMBYTE( s );
19731973      pPC += s;
1974      cpustate->icount -= 7;
1974      m_icount -= 7;
19751975   }
19761976   else
19771977   {
19781978      pPC++;
1979      cpustate->icount -= 5;
1979      m_icount -= 5;
19801980   }
19811981
19821982}
19831983
1984static void jne(tms7000_state *cpustate)
1984void tms7000_device::jne()
19851985{
19861986   if( pSR & SR_Z )
19871987   {
19881988      pPC++;
1989      cpustate->icount -= 5;
1989      m_icount -= 5;
19901990   }
19911991   else
19921992   {
r26878r26879
19941994
19951995      SIMMBYTE( s );
19961996      pPC += s;
1997      cpustate->icount -= 7;
1997      m_icount -= 7;
19981998   }
19991999}
20002000
2001static void jp(tms7000_state *cpustate)
2001void tms7000_device::jp()
20022002{
20032003   if( pSR & (SR_Z|SR_N) )
20042004   {
20052005      pPC++;
2006      cpustate->icount -= 5;
2006      m_icount -= 5;
20072007   }
20082008   else
20092009   {
r26878r26879
20112011
20122012      SIMMBYTE( s );
20132013      pPC += s;
2014      cpustate->icount -= 7;
2014      m_icount -= 7;
20152015   }
20162016}
20172017
2018static void jpz(tms7000_state *cpustate)
2018void tms7000_device::jpz()
20192019{
20202020   if ((pSR & SR_N) == 0)
20212021   {
r26878r26879
20232023
20242024      SIMMBYTE( s );
20252025      pPC += s;
2026      cpustate->icount -= 7;
2026      m_icount -= 7;
20272027   }
20282028   else
20292029   {
20302030      pPC++;
2031      cpustate->icount -= 5;
2031      m_icount -= 5;
20322032   }
20332033}
20342034
2035static void lda_dir(tms7000_state *cpustate)
2035void tms7000_device::lda_dir()
20362036{
20372037   UINT16  t;
20382038   PAIR    i;
r26878r26879
20452045   SET_N8(t);
20462046   SET_Z8(t);
20472047
2048   cpustate->icount -= 11;
2048   m_icount -= 11;
20492049}
20502050
2051static void lda_ind(tms7000_state *cpustate)
2051void tms7000_device::lda_ind()
20522052{
20532053   UINT16  t;
20542054   PAIR    p;
20552055   INT8    i;
20562056
20572057   IMMBYTE(i);
2058   p.w.l=RRF16(cpustate,i);
2058   p.w.l=RRF16(i);
20592059   t = RM(p.w.l);
20602060   WRA(t);
20612061
r26878r26879
20632063   SET_N8(t);
20642064   SET_Z8(t);
20652065
2066   cpustate->icount -= 10;
2066   m_icount -= 10;
20672067}
20682068
2069static void lda_inx(tms7000_state *cpustate)
2069void tms7000_device::lda_inx()
20702070{
20712071   UINT16  t;
20722072   PAIR    i;
r26878r26879
20792079   SET_N8(t);
20802080   SET_Z8(t);
20812081
2082   cpustate->icount -= 13;
2082   m_icount -= 13;
20832083}
20842084
2085static void ldsp(tms7000_state *cpustate)
2085void tms7000_device::ldsp()
20862086{
20872087   pSP = RDB;
2088   cpustate->icount -= 5;
2088   m_icount -= 5;
20892089}
20902090
2091static void mov_a2b(tms7000_state *cpustate)
2091void tms7000_device::mov_a2b()
20922092{
20932093   UINT16  t;
20942094
r26878r26879
20992099   SET_N8(t);
21002100   SET_Z8(t);
21012101
2102   cpustate->icount -= 6;
2102   m_icount -= 6;
21032103}
21042104
2105static void mov_b2a(tms7000_state *cpustate)
2105void tms7000_device::mov_b2a()
21062106{
21072107   UINT16  t;
21082108
r26878r26879
21132113   SET_N8(t);
21142114   SET_Z8(t);
21152115
2116   cpustate->icount -= 5;
2116   m_icount -= 5;
21172117}
21182118
21192119
2120static void mov_a2r(tms7000_state *cpustate)
2120void tms7000_device::mov_a2r()
21212121{
21222122   UINT8   r;
21232123   UINT16  t;
r26878r26879
21312131   SET_N8(t);
21322132   SET_Z8(t);
21332133
2134   cpustate->icount -= 8;
2134   m_icount -= 8;
21352135}
21362136
2137static void mov_b2r(tms7000_state *cpustate)
2137void tms7000_device::mov_b2r()
21382138{
21392139   UINT8   r;
21402140   UINT16  t;
r26878r26879
21482148   SET_N8(t);
21492149   SET_Z8(t);
21502150
2151   cpustate->icount -= 7;
2151   m_icount -= 7;
21522152}
21532153
2154static void mov_r2a(tms7000_state *cpustate)
2154void tms7000_device::mov_r2a()
21552155{
21562156   UINT8   r;
21572157   UINT16  t;
r26878r26879
21642164   SET_N8(t);
21652165   SET_Z8(t);
21662166
2167   cpustate->icount -= 8;
2167   m_icount -= 8;
21682168}
21692169
2170static void mov_r2b(tms7000_state *cpustate)
2170void tms7000_device::mov_r2b()
21712171{
21722172   UINT8   r;
21732173   UINT16  t;
r26878r26879
21802180   SET_N8(t);
21812181   SET_Z8(t);
21822182
2183   cpustate->icount -= 8;
2183   m_icount -= 8;
21842184}
21852185
2186static void mov_r2r(tms7000_state *cpustate)
2186void tms7000_device::mov_r2r()
21872187{
21882188   UINT8   r,s;
21892189   UINT16  t;
r26878r26879
21972197   SET_N8(t);
21982198   SET_Z8(t);
21992199
2200   cpustate->icount -= 10;
2200   m_icount -= 10;
22012201}
22022202
2203static void mov_i2a(tms7000_state *cpustate)
2203void tms7000_device::mov_i2a()
22042204{
22052205   UINT16  t;
22062206
r26878r26879
22112211   SET_N8(t);
22122212   SET_Z8(t);
22132213
2214   cpustate->icount -= 7;
2214   m_icount -= 7;
22152215}
22162216
2217static void mov_i2b(tms7000_state *cpustate)
2217void tms7000_device::mov_i2b()
22182218{
22192219   UINT16  t;
22202220
r26878r26879
22252225   SET_N8(t);
22262226   SET_Z8(t);
22272227
2228   cpustate->icount -= 7;
2228   m_icount -= 7;
22292229}
22302230
2231static void mov_i2r(tms7000_state *cpustate)
2231void tms7000_device::mov_i2r()
22322232{
22332233   UINT16  t;
22342234   UINT8   r;
r26878r26879
22412241   SET_N8(t);
22422242   SET_Z8(t);
22432243
2244   cpustate->icount -= 9;
2244   m_icount -= 9;
22452245}
22462246
2247static void movd_imm(tms7000_state *cpustate)
2247void tms7000_device::movd_imm()
22482248{
22492249   PAIR    t;
22502250   UINT8   r;
22512251
22522252   IMMWORD(t);
22532253   IMMBYTE(r);
2254   WRF16(cpustate,r,t);
2254   WRF16(r,t);
22552255
22562256   CLR_NZC;
22572257   SET_N8(t.b.h);
22582258   SET_Z8(t.b.h);
22592259
2260   cpustate->icount -= 15;
2260   m_icount -= 15;
22612261
22622262}
22632263
2264static void movd_r(tms7000_state *cpustate)
2264void tms7000_device::movd_r()
22652265{
22662266   PAIR    t;
22672267   UINT8   r,s;
22682268
22692269   IMMBYTE(r);
22702270   IMMBYTE(s);
2271   t.w.l = RRF16(cpustate,r);
2272   WRF16(cpustate,s,t);
2271   t.w.l = RRF16(r);
2272   WRF16(s,t);
22732273
22742274   CLR_NZC;
22752275   SET_N8(t.b.h);
22762276   SET_Z8(t.b.h);
22772277
2278   cpustate->icount -= 14;
2278   m_icount -= 14;
22792279
22802280}
22812281
2282static void movd_inx(tms7000_state *cpustate)
2282void tms7000_device::movd_inx()
22832283{
22842284   PAIR    t;
22852285   UINT8   r;
r26878r26879
22872287   IMMWORD(t);
22882288   t.w.l += RDB;
22892289   IMMBYTE(r);
2290   WRF16(cpustate,r,t);
2290   WRF16(r,t);
22912291
22922292   CLR_NZC;
22932293   SET_N8(t.b.h);
22942294   SET_Z8(t.b.h);
22952295
2296   cpustate->icount -= 17;
2296   m_icount -= 17;
22972297}
22982298
2299static void movp_a2p(tms7000_state *cpustate)
2299void tms7000_device::movp_a2p()
23002300{
23012301   UINT8   p;
23022302   UINT16  t;
r26878r26879
23092309   SET_N8(t);
23102310   SET_Z8(t);
23112311
2312   cpustate->icount -= 10;
2312   m_icount -= 10;
23132313}
23142314
2315static void movp_b2p(tms7000_state *cpustate)
2315void tms7000_device::movp_b2p()
23162316{
23172317   UINT8   p;
23182318   UINT16  t;
r26878r26879
23252325   SET_N8(t);
23262326   SET_Z8(t);
23272327
2328   cpustate->icount -= 10;
2328   m_icount -= 10;
23292329}
23302330
23312331#if 0
23322332/* this appears to be unused */
2333static void movp_r2p(tms7000_state *cpustate)
2333void tms7000_device::movp_r2p()
23342334{
23352335   UINT8   p,r;
23362336   UINT16  t;
r26878r26879
23442344   SET_N8(t);
23452345   SET_Z8(t);
23462346
2347   cpustate->icount -= 11;
2347   m_icount -= 11;
23482348}
23492349#endif
23502350
2351static void movp_p2a(tms7000_state *cpustate)
2351void tms7000_device::movp_p2a()
23522352{
23532353   UINT8   p;
23542354   UINT16  t;
r26878r26879
23612361   SET_N8(t);
23622362   SET_Z8(t);
23632363
2364   cpustate->icount -= 9;
2364   m_icount -= 9;
23652365}
23662366
2367static void movp_p2b(tms7000_state *cpustate)
2367void tms7000_device::movp_p2b()
23682368{
23692369   UINT8   p;
23702370   UINT16  t;
r26878r26879
23772377   SET_N8(t);
23782378   SET_Z8(t);
23792379
2380   cpustate->icount -= 8;
2380   m_icount -= 8;
23812381}
23822382
2383static void mpy_ba(tms7000_state *cpustate)
2383void tms7000_device::mpy_ba()
23842384{
23852385   PAIR t;
23862386
23872387   t.w.l = RDA * RDB;
23882388
2389   WRF16(cpustate,0x01,t);
2389   WRF16(0x01,t);
23902390
23912391   CLR_NZC;
23922392   SET_N8(t.b.h);
23932393   SET_Z8(t.b.h);
23942394
2395   cpustate->icount -= 43;
2395   m_icount -= 43;
23962396
23972397}
23982398
2399static void mpy_ra(tms7000_state *cpustate)
2399void tms7000_device::mpy_ra()
24002400{
24012401   PAIR    t;
24022402   UINT8   r;
r26878r26879
24052405
24062406   t.w.l = RDA * RM(r);
24072407
2408   WRF16(cpustate,0x01,t);
2408   WRF16(0x01,t);
24092409
24102410   CLR_NZC;
24112411   SET_N8(t.b.h);
24122412   SET_Z8(t.b.h);
24132413
2414   cpustate->icount -= 46;
2414   m_icount -= 46;
24152415
24162416}
24172417
2418static void mpy_rb(tms7000_state *cpustate)
2418void tms7000_device::mpy_rb()
24192419{
24202420   PAIR    t;
24212421   UINT8   r;
r26878r26879
24242424
24252425   t.w.l = RDB * RM(r);
24262426
2427   WRF16(cpustate,0x01,t);
2427   WRF16(0x01,t);
24282428
24292429   CLR_NZC;
24302430   SET_N8(t.b.h);
24312431   SET_Z8(t.b.h);
24322432
2433   cpustate->icount -= 46;
2433   m_icount -= 46;
24342434
24352435}
24362436
2437static void mpy_rr(tms7000_state *cpustate)
2437void tms7000_device::mpy_rr()
24382438{
24392439   PAIR    t;
24402440   UINT8   r,s;
r26878r26879
24442444
24452445   t.w.l = RM(s) * RM(r);
24462446
2447   WRF16(cpustate,0x01,t);
2447   WRF16(0x01,t);
24482448
24492449   CLR_NZC;
24502450   SET_N8(t.b.h);
24512451   SET_Z8(t.b.h);
24522452
2453   cpustate->icount -= 48;
2453   m_icount -= 48;
24542454
24552455}
24562456
2457static void mpy_ia(tms7000_state *cpustate)
2457void tms7000_device::mpy_ia()
24582458{
24592459   PAIR    t;
24602460   UINT8   i;
r26878r26879
24632463
24642464   t.w.l = RDA * i;
24652465
2466   WRF16(cpustate,0x01,t);
2466   WRF16(0x01,t);
24672467
24682468   CLR_NZC;
24692469   SET_N8(t.b.h);
24702470   SET_Z8(t.b.h);
24712471
2472   cpustate->icount -= 45;
2472   m_icount -= 45;
24732473
24742474}
24752475
2476static void mpy_ib(tms7000_state *cpustate)
2476void tms7000_device::mpy_ib()
24772477{
24782478   PAIR    t;
24792479   UINT8   i;
r26878r26879
24822482
24832483   t.w.l = RDB * i;
24842484
2485   WRF16(cpustate,0x01,t);
2485   WRF16(0x01,t);
24862486
24872487   CLR_NZC;
24882488   SET_N8(t.b.h);
24892489   SET_Z8(t.b.h);
24902490
2491   cpustate->icount -= 45;
2491   m_icount -= 45;
24922492
24932493}
24942494
2495static void mpy_ir(tms7000_state *cpustate)
2495void tms7000_device::mpy_ir()
24962496{
24972497   PAIR    t;
24982498   UINT8   i,r;
r26878r26879
25022502
25032503   t.w.l = RM(r) * i;
25042504
2505   WRF16(cpustate,0x01,t);
2505   WRF16(0x01,t);
25062506
25072507   CLR_NZC;
25082508   SET_N8(t.b.h);
25092509   SET_Z8(t.b.h);
25102510
2511   cpustate->icount -= 47;
2511   m_icount -= 47;
25122512
25132513}
25142514
2515static void nop(tms7000_state *cpustate)
2515void tms7000_device::nop()
25162516{
2517   cpustate->icount -= 4;
2517   m_icount -= 4;
25182518}
25192519
2520static void or_b2a(tms7000_state *cpustate)
2520void tms7000_device::or_b2a()
25212521{
25222522   UINT8   t;
25232523
r26878r26879
25282528   SET_N8(t);
25292529   SET_Z8(t);
25302530
2531   cpustate->icount -= 5;
2531   m_icount -= 5;
25322532}
25332533
2534static void or_r2a(tms7000_state *cpustate)
2534void tms7000_device::or_r2a()
25352535{
25362536   UINT8   t;
25372537   UINT8   v;
r26878r26879
25452545   SET_N8(t);
25462546   SET_Z8(t);
25472547
2548   cpustate->icount -= 8;
2548   m_icount -= 8;
25492549}
25502550
2551static void or_r2b(tms7000_state *cpustate)
2551void tms7000_device::or_r2b()
25522552{
25532553   UINT8   t;
25542554   UINT8   v;
r26878r26879
25622562   SET_N8(t);
25632563   SET_Z8(t);
25642564
2565   cpustate->icount -= 8;
2565   m_icount -= 8;
25662566}
25672567
2568static void or_r2r(tms7000_state *cpustate)
2568void tms7000_device::or_r2r()
25692569{
25702570   UINT8   t;
25712571   UINT8   i,j;
r26878r26879
25802580   SET_N8(t);
25812581   SET_Z8(t);
25822582
2583   cpustate->icount -= 10;
2583   m_icount -= 10;
25842584}
25852585
2586static void or_i2a(tms7000_state *cpustate)
2586void tms7000_device::or_i2a()
25872587{
25882588   UINT8   t;
25892589   UINT8   v;
r26878r26879
25972597   SET_N8(t);
25982598   SET_Z8(t);
25992599
2600   cpustate->icount -= 7;
2600   m_icount -= 7;
26012601}
26022602
2603static void or_i2b(tms7000_state *cpustate)
2603void tms7000_device::or_i2b()
26042604{
26052605   UINT8   t;
26062606   UINT8   v;
r26878r26879
26142614   SET_N8(t);
26152615   SET_Z8(t);
26162616
2617   cpustate->icount -= 7;
2617   m_icount -= 7;
26182618}
26192619
2620static void or_i2r(tms7000_state *cpustate)
2620void tms7000_device::or_i2r()
26212621{
26222622   UINT8   t;
26232623   UINT8   i,j;
r26878r26879
26322632   SET_N8(t);
26332633   SET_Z8(t);
26342634
2635   cpustate->icount -= 9;
2635   m_icount -= 9;
26362636}
26372637
2638static void orp_a2p(tms7000_state *cpustate)
2638void tms7000_device::orp_a2p()
26392639{
26402640   UINT8   t;
26412641   UINT8   v;
r26878r26879
26482648   SET_N8(t);
26492649   SET_Z8(t);
26502650
2651   cpustate->icount -= 10;
2651   m_icount -= 10;
26522652}
26532653
2654static void orp_b2p(tms7000_state *cpustate)
2654void tms7000_device::orp_b2p()
26552655{
26562656   UINT8   t;
26572657   UINT8   v;
r26878r26879
26642664   SET_N8(t);
26652665   SET_Z8(t);
26662666
2667   cpustate->icount -= 9;
2667   m_icount -= 9;
26682668}
26692669
2670static void orp_i2p(tms7000_state *cpustate)
2670void tms7000_device::orp_i2p()
26712671{
26722672   UINT8   t;
26732673   UINT8   i,v;
r26878r26879
26812681   SET_N8(t);
26822682   SET_Z8(t);
26832683
2684   cpustate->icount -= 11;
2684   m_icount -= 11;
26852685}
26862686
2687static void pop_a(tms7000_state *cpustate)
2687void tms7000_device::pop_a()
26882688{
26892689   UINT16  t;
26902690
r26878r26879
26952695   SET_N8(t);
26962696   SET_Z8(t);
26972697
2698   cpustate->icount -= 6;
2698   m_icount -= 6;
26992699}
27002700
2701static void pop_b(tms7000_state *cpustate)
2701void tms7000_device::pop_b()
27022702{
27032703   UINT16  t;
27042704
r26878r26879
27092709   SET_N8(t);
27102710   SET_Z8(t);
27112711
2712   cpustate->icount -= 6;
2712   m_icount -= 6;
27132713}
27142714
2715static void pop_r(tms7000_state *cpustate)
2715void tms7000_device::pop_r()
27162716{
27172717   UINT16  t;
27182718   UINT8   r;
r26878r26879
27252725   SET_N8(t);
27262726   SET_Z8(t);
27272727
2728   cpustate->icount -= 8;
2728   m_icount -= 8;
27292729}
27302730
2731static void pop_st(tms7000_state *cpustate)
2731void tms7000_device::pop_st()
27322732{
27332733   UINT16  t;
27342734
27352735   PULLBYTE(t);
27362736   pSR = t;
27372737
2738   cpustate->icount -= 6;
2738   m_icount -= 6;
27392739}
27402740
2741static void push_a(tms7000_state *cpustate)
2741void tms7000_device::push_a()
27422742{
27432743   UINT16  t;
27442744
r26878r26879
27492749   SET_N8(t);
27502750   SET_Z8(t);
27512751
2752   cpustate->icount -= 6;
2752   m_icount -= 6;
27532753}
27542754
2755static void push_b(tms7000_state *cpustate)
2755void tms7000_device::push_b()
27562756{
27572757   UINT16  t;
27582758
r26878r26879
27632763   SET_N8(t);
27642764   SET_Z8(t);
27652765
2766   cpustate->icount -= 6;
2766   m_icount -= 6;
27672767}
27682768
2769static void push_r(tms7000_state *cpustate)
2769void tms7000_device::push_r()
27702770{
27712771   UINT16  t;
27722772   INT8    r;
r26878r26879
27792779   SET_N8(t);
27802780   SET_Z8(t);
27812781
2782   cpustate->icount -= 8;
2782   m_icount -= 8;
27832783}
27842784
2785static void push_st(tms7000_state *cpustate)
2785void tms7000_device::push_st()
27862786{
27872787   UINT16  t;
27882788   t = pSR;
27892789   PUSHBYTE(t);
27902790
2791   cpustate->icount -= 6;
2791   m_icount -= 6;
27922792}
27932793
2794static void reti(tms7000_state *cpustate)
2794void tms7000_device::reti()
27952795{
27962796   PULLWORD( PC );
27972797   PULLBYTE( pSR );
27982798
2799   cpustate->icount -= 9;
2800   tms7000_check_IRQ_lines(cpustate);
2799   m_icount -= 9;
2800   tms7000_check_IRQ_lines();
28012801}
28022802
2803static void rets(tms7000_state *cpustate)
2803void tms7000_device::rets()
28042804{
28052805   PULLWORD( PC );
2806   cpustate->icount -= 7;
2806   m_icount -= 7;
28072807}
28082808
2809static void rl_a(tms7000_state *cpustate)
2809void tms7000_device::rl_a()
28102810{
28112811   UINT16  t;
28122812
r26878r26879
28222822   SET_Z8(t);
28232823   WRA(t);
28242824
2825   cpustate->icount -= 5;
2825   m_icount -= 5;
28262826}
28272827
2828static void rl_b(tms7000_state *cpustate)
2828void tms7000_device::rl_b()
28292829{
28302830   UINT16  t;
28312831
r26878r26879
28412841   SET_Z8(t);
28422842   WRB(t);
28432843
2844   cpustate->icount -= 5;
2844   m_icount -= 5;
28452845}
28462846
2847static void rl_r(tms7000_state *cpustate)
2847void tms7000_device::rl_r()
28482848{
28492849   UINT16  t;
28502850   UINT8   r;
r26878r26879
28622862   SET_Z8(t);
28632863   WM(r,t);
28642864
2865   cpustate->icount -= 7;
2865   m_icount -= 7;
28662866}
28672867
2868static void rlc_a(tms7000_state *cpustate)
2868void tms7000_device::rlc_a()
28692869{
28702870   UINT16  t;
28712871   int     old_carry;
r26878r26879
28842884   SET_Z8(t);
28852885   WRA(t);
28862886
2887   cpustate->icount -= 5;
2887   m_icount -= 5;
28882888}
28892889
2890static void rlc_b(tms7000_state *cpustate)
2890void tms7000_device::rlc_b()
28912891{
28922892   UINT16  t;
28932893   int     old_carry;
r26878r26879
29062906   SET_Z8(t);
29072907   WRB(t);
29082908
2909   cpustate->icount -= 5;
2909   m_icount -= 5;
29102910}
29112911
2912static void rlc_r(tms7000_state *cpustate)
2912void tms7000_device::rlc_r()
29132913{
29142914   UINT16  t;
29152915   UINT8   r;
r26878r26879
29302930   SET_Z8(t);
29312931   WM(r,t);
29322932
2933   cpustate->icount -= 7;
2933   m_icount -= 7;
29342934}
29352935
2936static void rr_a(tms7000_state *cpustate)
2936void tms7000_device::rr_a()
29372937{
29382938   UINT16  t;
29392939   int     old_bit0;
r26878r26879
29562956
29572957   WRA(t);
29582958
2959   cpustate->icount -= 5;
2959   m_icount -= 5;
29602960}
29612961
2962static void rr_b(tms7000_state *cpustate)
2962void tms7000_device::rr_b()
29632963{
29642964   UINT16  t;
29652965   int     old_bit0;
r26878r26879
29822982
29832983   WRB(t);
29842984
2985   cpustate->icount -= 5;
2985   m_icount -= 5;
29862986}
29872987
2988static void rr_r(tms7000_state *cpustate)
2988void tms7000_device::rr_r()
29892989{
29902990   UINT16  t;
29912991   UINT8   r;
r26878r26879
30113011
30123012   WM(r,t);
30133013
3014   cpustate->icount -= 7;
3014   m_icount -= 7;
30153015}
30163016
3017static void rrc_a(tms7000_state *cpustate)
3017void tms7000_device::rrc_a()
30183018{
30193019   UINT16  t;
30203020   int     old_bit0;
r26878r26879
30353035
30363036   WRA(t);
30373037
3038   cpustate->icount -= 5;
3038   m_icount -= 5;
30393039}
30403040
3041static void rrc_b(tms7000_state *cpustate)
3041void tms7000_device::rrc_b()
30423042{
30433043   UINT16  t;
30443044   int     old_bit0;
r26878r26879
30593059
30603060   WRB(t);
30613061
3062   cpustate->icount -= 5;
3062   m_icount -= 5;
30633063}
30643064
3065static void rrc_r(tms7000_state *cpustate)
3065void tms7000_device::rrc_r()
30663066{
30673067   UINT16  t;
30683068   UINT8   r;
r26878r26879
30853085
30863086   WM(r,t);
30873087
3088   cpustate->icount -= 7;
3088   m_icount -= 7;
30893089}
30903090
3091static void sbb_ba(tms7000_state *cpustate)
3091void tms7000_device::sbb_ba()
30923092{
30933093   UINT16  t;
30943094
r26878r26879
31003100   SET_N8(t);
31013101   SET_Z8(t);
31023102
3103   cpustate->icount -= 5;
3103   m_icount -= 5;
31043104}
31053105
3106static void sbb_ra(tms7000_state *cpustate)
3106void tms7000_device::sbb_ra()
31073107{
31083108   UINT16  t;
31093109   UINT8   r;
r26878r26879
31173117   SET_N8(t);
31183118   SET_Z8(t);
31193119
3120   cpustate->icount -= 8;
3120   m_icount -= 8;
31213121}
31223122
3123static void sbb_rb(tms7000_state *cpustate)
3123void tms7000_device::sbb_rb()
31243124{
31253125   UINT16  t;
31263126   UINT8   r;
r26878r26879
31343134   SET_N8(t);
31353135   SET_Z8(t);
31363136
3137   cpustate->icount -= 8;
3137   m_icount -= 8;
31383138}
31393139
3140static void sbb_rr(tms7000_state *cpustate)
3140void tms7000_device::sbb_rr()
31413141{
31423142   UINT16  t;
31433143   UINT8   r,s;
r26878r26879
31523152   SET_N8(t);
31533153   SET_Z8(t);
31543154
3155   cpustate->icount -= 10;
3155   m_icount -= 10;
31563156}
31573157
3158static void sbb_ia(tms7000_state *cpustate)
3158void tms7000_device::sbb_ia()
31593159{
31603160   UINT16  t;
31613161   UINT8   i;
r26878r26879
31693169   SET_N8(t);
31703170   SET_Z8(t);
31713171
3172   cpustate->icount -= 7;
3172   m_icount -= 7;
31733173}
31743174
3175static void sbb_ib(tms7000_state *cpustate)
3175void tms7000_device::sbb_ib()
31763176{
31773177   UINT16  t;
31783178   UINT8   i;
r26878r26879
31863186   SET_N8(t);
31873187   SET_Z8(t);
31883188
3189   cpustate->icount -= 7;
3189   m_icount -= 7;
31903190}
31913191
3192static void sbb_ir(tms7000_state *cpustate)
3192void tms7000_device::sbb_ir()
31933193{
31943194   UINT16  t;
31953195   UINT8   r,i;
r26878r26879
32043204   SET_N8(t);
32053205   SET_Z8(t);
32063206
3207   cpustate->icount -= 9;
3207   m_icount -= 9;
32083208}
32093209
3210static void setc(tms7000_state *cpustate)
3210void tms7000_device::setc()
32113211{
32123212   CLR_NZC;
32133213   pSR |= (SR_C|SR_Z);
32143214
3215   cpustate->icount -= 5;
3215   m_icount -= 5;
32163216}
32173217
3218static void sta_dir(tms7000_state *cpustate)
3218void tms7000_device::sta_dir()
32193219{
32203220   UINT16  t;
32213221   PAIR    i;
r26878r26879
32293229   SET_N8(t);
32303230   SET_Z8(t);
32313231
3232   cpustate->icount -= 11;
3232   m_icount -= 11;
32333233}
32343234
3235static void sta_ind(tms7000_state *cpustate)
3235void tms7000_device::sta_ind()
32363236{
32373237   UINT16  t;
32383238   PAIR    p;
32393239   INT8    r;
32403240
32413241   IMMBYTE(r);
3242   p.w.l = RRF16(cpustate,r);
3242   p.w.l = RRF16(r);
32433243   t = RDA;
32443244   WM(p.w.l,t);
32453245
r26878r26879
32473247   SET_N8(t);
32483248   SET_Z8(t);
32493249
3250   cpustate->icount -= 10;
3250   m_icount -= 10;
32513251}
32523252
3253static void sta_inx(tms7000_state *cpustate)
3253void tms7000_device::sta_inx()
32543254{
32553255   UINT16  t;
32563256   PAIR    i;
r26878r26879
32633263   SET_N8(t);
32643264   SET_Z8(t);
32653265
3266   cpustate->icount -= 13;
3266   m_icount -= 13;
32673267}
32683268
3269static void stsp(tms7000_state *cpustate)
3269void tms7000_device::stsp()
32703270{
32713271   WRB(pSP);
32723272
3273   cpustate->icount -= 6;
3273   m_icount -= 6;
32743274}
32753275
3276static void sub_ba(tms7000_state *cpustate)
3276void tms7000_device::sub_ba()
32773277{
32783278   UINT16  t;
32793279
r26878r26879
32853285   SET_N8(t);
32863286   SET_Z8(t);
32873287
3288   cpustate->icount -= 5;
3288   m_icount -= 5;
32893289}
32903290
3291static void sub_ra(tms7000_state *cpustate)
3291void tms7000_device::sub_ra()
32923292{
32933293   UINT16  t;
32943294   UINT8   r;
r26878r26879
33023302   SET_N8(t);
33033303   SET_Z8(t);
33043304
3305   cpustate->icount -= 8;
3305   m_icount -= 8;
33063306}
33073307
3308static void sub_rb(tms7000_state *cpustate)
3308void tms7000_device::sub_rb()
33093309{
33103310   UINT16  t;
33113311   UINT8   r;
r26878r26879
33193319   SET_N8(t);
33203320   SET_Z8(t);
33213321
3322   cpustate->icount -= 8;
3322   m_icount -= 8;
33233323}
33243324
3325static void sub_rr(tms7000_state *cpustate)
3325void tms7000_device::sub_rr()
33263326{
33273327   UINT16  t;
33283328   UINT8   r,s;
r26878r26879
33373337   SET_N8(t);
33383338   SET_Z8(t);
33393339
3340   cpustate->icount -= 10;
3340   m_icount -= 10;
33413341}
33423342
3343static void sub_ia(tms7000_state *cpustate)
3343void tms7000_device::sub_ia()
33443344{
33453345   UINT16  t;
33463346   UINT8   i;
r26878r26879
33543354   SET_N8(t);
33553355   SET_Z8(t);
33563356
3357   cpustate->icount -= 7;
3357   m_icount -= 7;
33583358}
33593359
3360static void sub_ib(tms7000_state *cpustate)
3360void tms7000_device::sub_ib()
33613361{
33623362   UINT16  t;
33633363   UINT8   i;
r26878r26879
33713371   SET_N8(t);
33723372   SET_Z8(t);
33733373
3374   cpustate->icount -= 7;
3374   m_icount -= 7;
33753375}
33763376
3377static void sub_ir(tms7000_state *cpustate)
3377void tms7000_device::sub_ir()
33783378{
33793379   UINT16  t;
33803380   UINT8   r,i;
r26878r26879
33893389   SET_N8(t);
33903390   SET_Z8(t);
33913391
3392   cpustate->icount -= 9;
3392   m_icount -= 9;
33933393}
33943394
3395static void trap_0(tms7000_state *cpustate)
3395void tms7000_device::trap_0()
33963396{
33973397   PUSHWORD( PC );
3398   pPC = RM16(cpustate, 0xfffe);
3399   cpustate->icount -= 14;
3398   pPC = RM16(0xfffe);
3399   m_icount -= 14;
34003400}
34013401
3402static void trap_1(tms7000_state *cpustate)
3402void tms7000_device::trap_1()
34033403{
34043404   PUSHWORD( PC );
3405   pPC = RM16(cpustate, 0xfffc);
3406   cpustate->icount -= 14;
3405   pPC = RM16(0xfffc);
3406   m_icount -= 14;
34073407}
34083408
3409static void trap_2(tms7000_state *cpustate)
3409void tms7000_device::trap_2()
34103410{
34113411   PUSHWORD( PC );
3412   pPC = RM16(cpustate, 0xfffa);
3413   cpustate->icount -= 14;
3412   pPC = RM16(0xfffa);
3413   m_icount -= 14;
34143414}
34153415
3416static void trap_3(tms7000_state *cpustate)
3416void tms7000_device::trap_3()
34173417{
34183418   PUSHWORD( PC );
3419   pPC = RM16(cpustate, 0xfff8);
3420   cpustate->icount -= 14;
3419   pPC = RM16(0xfff8);
3420   m_icount -= 14;
34213421}
34223422
3423static void trap_4(tms7000_state *cpustate)
3423void tms7000_device::trap_4()
34243424{
34253425   PUSHWORD( PC );
3426   pPC = RM16(cpustate, 0xfff6);
3427   cpustate->icount -= 14;
3426   pPC = RM16(0xfff6);
3427   m_icount -= 14;
34283428}
34293429
3430static void trap_5(tms7000_state *cpustate)
3430void tms7000_device::trap_5()
34313431{
34323432   PUSHWORD( PC );
3433   pPC = RM16(cpustate, 0xfff4);
3434   cpustate->icount -= 14;
3433   pPC = RM16(0xfff4);
3434   m_icount -= 14;
34353435}
34363436
3437static void trap_6(tms7000_state *cpustate)
3437void tms7000_device::trap_6()
34383438{
34393439   PUSHWORD( PC );
3440   pPC = RM16(cpustate, 0xfff2);
3441   cpustate->icount -= 14;
3440   pPC = RM16(0xfff2);
3441   m_icount -= 14;
34423442}
34433443
3444static void trap_7(tms7000_state *cpustate)
3444void tms7000_device::trap_7()
34453445{
34463446   PUSHWORD( PC );
3447   pPC = RM16(cpustate, 0xfff0);
3448   cpustate->icount -= 14;
3447   pPC = RM16(0xfff0);
3448   m_icount -= 14;
34493449}
34503450
3451static void trap_8(tms7000_state *cpustate)
3451void tms7000_device::trap_8()
34523452{
34533453   PUSHWORD( PC );
3454   pPC = RM16(cpustate, 0xffee);
3455   cpustate->icount -= 14;
3454   pPC = RM16(0xffee);
3455   m_icount -= 14;
34563456}
34573457
3458static void trap_9(tms7000_state *cpustate)
3458void tms7000_device::trap_9()
34593459{
34603460   PUSHWORD( PC );
3461   pPC = RM16(cpustate, 0xffec);
3462   cpustate->icount -= 14;
3461   pPC = RM16(0xffec);
3462   m_icount -= 14;
34633463}
34643464
3465static void trap_10(tms7000_state *cpustate)
3465void tms7000_device::trap_10()
34663466{
34673467   PUSHWORD( PC );
3468   pPC = RM16(cpustate, 0xffea);
3469   cpustate->icount -= 14;
3468   pPC = RM16(0xffea);
3469   m_icount -= 14;
34703470}
34713471
3472static void trap_11(tms7000_state *cpustate)
3472void tms7000_device::trap_11()
34733473{
34743474   PUSHWORD( PC );
3475   pPC = RM16(cpustate, 0xffe8);
3476   cpustate->icount -= 14;
3475   pPC = RM16(0xffe8);
3476   m_icount -= 14;
34773477}
34783478
3479static void trap_12(tms7000_state *cpustate)
3479void tms7000_device::trap_12()
34803480{
34813481   PUSHWORD( PC );
3482   pPC = RM16(cpustate, 0xffe6);
3483   cpustate->icount -= 14;
3482   pPC = RM16(0xffe6);
3483   m_icount -= 14;
34843484}
34853485
3486static void trap_13(tms7000_state *cpustate)
3486void tms7000_device::trap_13()
34873487{
34883488   PUSHWORD( PC );
3489   pPC = RM16(cpustate, 0xffe4);
3490   cpustate->icount -= 14;
3489   pPC = RM16(0xffe4);
3490   m_icount -= 14;
34913491}
34923492
3493static void trap_14(tms7000_state *cpustate)
3493void tms7000_device::trap_14()
34943494{
34953495   PUSHWORD( PC );
3496   pPC = RM16(cpustate, 0xffe2);
3497   cpustate->icount -= 14;
3496   pPC = RM16(0xffe2);
3497   m_icount -= 14;
34983498}
34993499
3500static void trap_15(tms7000_state *cpustate)
3500void tms7000_device::trap_15()
35013501{
35023502   PUSHWORD( PC );
3503   pPC = RM16(cpustate, 0xffe0);
3504   cpustate->icount -= 14;
3503   pPC = RM16(0xffe0);
3504   m_icount -= 14;
35053505}
35063506
3507static void trap_16(tms7000_state *cpustate)
3507void tms7000_device::trap_16()
35083508{
35093509   PUSHWORD( PC );
3510   pPC = RM16(cpustate, 0xffde);
3511   cpustate->icount -= 14;
3510   pPC = RM16(0xffde);
3511   m_icount -= 14;
35123512}
35133513
3514static void trap_17(tms7000_state *cpustate)
3514void tms7000_device::trap_17()
35153515{
35163516   PUSHWORD( PC );
3517   pPC = RM16(cpustate, 0xffdc);
3518   cpustate->icount -= 14;
3517   pPC = RM16(0xffdc);
3518   m_icount -= 14;
35193519}
35203520
3521static void trap_18(tms7000_state *cpustate)
3521void tms7000_device::trap_18()
35223522{
35233523   PUSHWORD( PC );
3524   pPC = RM16(cpustate, 0xffda);
3525   cpustate->icount -= 14;
3524   pPC = RM16(0xffda);
3525   m_icount -= 14;
35263526}
35273527
3528static void trap_19(tms7000_state *cpustate)
3528void tms7000_device::trap_19()
35293529{
35303530   PUSHWORD( PC );
3531   pPC = RM16(cpustate, 0xffd8);
3532   cpustate->icount -= 14;
3531   pPC = RM16(0xffd8);
3532   m_icount -= 14;
35333533}
35343534
3535static void trap_20(tms7000_state *cpustate)
3535void tms7000_device::trap_20()
35363536{
35373537   PUSHWORD( PC );
3538   pPC = RM16(cpustate, 0xffd6);
3539   cpustate->icount -= 14;
3538   pPC = RM16(0xffd6);
3539   m_icount -= 14;
35403540}
35413541
3542static void trap_21(tms7000_state *cpustate)
3542void tms7000_device::trap_21()
35433543{
35443544   PUSHWORD( PC );
3545   pPC = RM16(cpustate, 0xffd4);
3546   cpustate->icount -= 14;
3545   pPC = RM16(0xffd4);
3546   m_icount -= 14;
35473547}
35483548
3549static void trap_22(tms7000_state *cpustate)
3549void tms7000_device::trap_22()
35503550{
35513551   PUSHWORD( PC );
3552   pPC = RM16(cpustate, 0xffd2);
3553   cpustate->icount -= 14;
3552   pPC = RM16(0xffd2);
3553   m_icount -= 14;
35543554}
35553555
3556static void trap_23(tms7000_state *cpustate)
3556void tms7000_device::trap_23()
35573557{
35583558   PUSHWORD( PC );
3559   pPC = RM16(cpustate, 0xffd0);
3560   cpustate->icount -= 14;
3559   pPC = RM16(0xffd0);
3560   m_icount -= 14;
35613561}
35623562
3563static void swap_a(tms7000_state *cpustate)
3563void tms7000_device::swap_a()
35643564{
35653565   UINT8   a,b;
35663566   UINT16  t;
r26878r26879
35793579   SET_N8(t);
35803580   SET_Z8(t);
35813581
3582   cpustate->icount -=8;
3582   m_icount -=8;
35833583}
35843584
3585static void swap_b(tms7000_state *cpustate)
3585void tms7000_device::swap_b()
35863586{
35873587   UINT8   a,b;
35883588   UINT16  t;
r26878r26879
36013601   SET_N8(t);
36023602   SET_Z8(t);
36033603
3604   cpustate->icount -=8;
3604   m_icount -=8;
36053605}
36063606
3607static void swap_r(tms7000_state *cpustate)
3607void tms7000_device::swap_r()
36083608{
36093609   UINT8   a,b,r;
36103610   UINT16  t;
r26878r26879
36243624   SET_N8(t);
36253625   SET_Z8(t);
36263626
3627   cpustate->icount -=8;
3627   m_icount -=8;
36283628}
36293629
3630static void swap_r_exl(tms7000_state *cpustate)
3630void tms7000_device::swap_r_exl()
36313631{
36323632   UINT8   a,b,r;
36333633   UINT16  t;
r26878r26879
36453645      SET_N8(t);
36463646      SET_Z8(t);
36473647
3648      cpustate->icount -= 9;  /* ?????? */
3648      m_icount -= 9;  /* ?????? */
36493649   }
36503650   else
36513651   {   /* stright swap Rn instruction */
r26878r26879
36633663      SET_N8(t);
36643664      SET_Z8(t);
36653665
3666      cpustate->icount -=8;
3666      m_icount -=8;
36673667   }
36683668}
36693669
3670static void tstb(tms7000_state *cpustate)
3670void tms7000_device::tstb()
36713671{
36723672   UINT16  t;
36733673
r26878r26879
36773677   SET_N8(t);
36783678   SET_Z8(t);
36793679
3680   cpustate->icount -= 6;
3680   m_icount -= 6;
36813681}
36823682
3683static void xchb_a(tms7000_state *cpustate)
3683void tms7000_device::xchb_a()
36843684{
36853685   UINT16  t,u;
36863686
r26878r26879
36943694   SET_N8(t);
36953695   SET_Z8(t);
36963696
3697   cpustate->icount -= 6;
3697   m_icount -= 6;
36983698}
36993699
3700static void xchb_b(tms7000_state *cpustate)
3700void tms7000_device::xchb_b()
37013701{
37023702   UINT16  t;
37033703/*  UINT16  u;  */
r26878r26879
37123712   SET_N8(t);
37133713   SET_Z8(t);
37143714
3715   cpustate->icount -= 6;
3715   m_icount -= 6;
37163716}
37173717
3718static void xchb_r(tms7000_state *cpustate)
3718void tms7000_device::xchb_r()
37193719{
37203720   UINT16  t,u;
37213721   UINT8   r;
r26878r26879
37323732   SET_N8(t);
37333733   SET_Z8(t);
37343734
3735   cpustate->icount -= 8;
3735   m_icount -= 8;
37363736}
37373737
3738static void xor_b2a(tms7000_state *cpustate)
3738void tms7000_device::xor_b2a()
37393739{
37403740   UINT8   t;
37413741
r26878r26879
37463746   SET_N8(t);
37473747   SET_Z8(t);
37483748
3749   cpustate->icount -= 5;
3749   m_icount -= 5;
37503750}
37513751
3752static void xor_r2a(tms7000_state *cpustate)
3752void tms7000_device::xor_r2a()
37533753{
37543754   UINT8   t;
37553755   UINT8   v;
r26878r26879
37633763   SET_N8(t);
37643764   SET_Z8(t);
37653765
3766   cpustate->icount -= 8;
3766   m_icount -= 8;
37673767}
37683768
3769static void xor_r2b(tms7000_state *cpustate)
3769void tms7000_device::xor_r2b()
37703770{
37713771   UINT8   t;
37723772   UINT8   v;
r26878r26879
37803780   SET_N8(t);
37813781   SET_Z8(t);
37823782
3783   cpustate->icount -= 8;
3783   m_icount -= 8;
37843784}
37853785
3786static void xor_r2r(tms7000_state *cpustate)
3786void tms7000_device::xor_r2r()
37873787{
37883788   UINT8   t;
37893789   UINT8   i,j;
r26878r26879
37983798   SET_N8(t);
37993799   SET_Z8(t);
38003800
3801   cpustate->icount -= 10;
3801   m_icount -= 10;
38023802}
38033803
3804static void xor_i2a(tms7000_state *cpustate)
3804void tms7000_device::xor_i2a()
38053805{
38063806   UINT8   t;
38073807   UINT8   v;
r26878r26879
38153815   SET_N8(t);
38163816   SET_Z8(t);
38173817
3818   cpustate->icount -= 7;
3818   m_icount -= 7;
38193819}
38203820
3821static void xor_i2b(tms7000_state *cpustate)
3821void tms7000_device::xor_i2b()
38223822{
38233823   UINT8   t;
38243824   UINT8   v;
r26878r26879
38323832   SET_N8(t);
38333833   SET_Z8(t);
38343834
3835   cpustate->icount -= 7;
3835   m_icount -= 7;
38363836}
38373837
3838static void xor_i2r(tms7000_state *cpustate)
3838void tms7000_device::xor_i2r()
38393839{
38403840   UINT8   t;
38413841   UINT8   i,j;
r26878r26879
38503850   SET_N8(t);
38513851   SET_Z8(t);
38523852
3853   cpustate->icount -= 9;
3853   m_icount -= 9;
38543854}
38553855
3856static void xorp_a2p(tms7000_state *cpustate)
3856void tms7000_device::xorp_a2p()
38573857{
38583858   UINT8   t;
38593859   UINT8   v;
r26878r26879
38663866   SET_N8(t);
38673867   SET_Z8(t);
38683868
3869   cpustate->icount -= 10;
3869   m_icount -= 10;
38703870}
38713871
3872static void xorp_b2p(tms7000_state *cpustate)
3872void tms7000_device::xorp_b2p()
38733873{
38743874   UINT8   t;
38753875   UINT8   v;
r26878r26879
38823882   SET_N8(t);
38833883   SET_Z8(t);
38843884
3885   cpustate->icount -= 9;
3885   m_icount -= 9;
38863886}
38873887
3888static void xorp_i2p(tms7000_state *cpustate)
3888void tms7000_device::xorp_i2p()
38893889{
38903890   UINT8   t;
38913891   UINT8   i,v;
r26878r26879
38993899   SET_N8(t);
39003900   SET_Z8(t);
39013901
3902   cpustate->icount -= 11;
3902   m_icount -= 11;
39033903}
trunk/src/emu/cpu/tms7000/tms7000.c
r26878r26879
3636
3737#define LOG(x)  do { if (VERBOSE) logerror x; } while (0)
3838
39struct tms7000_state;
4039
41/* Private prototypes */
42
43static void tms7000_set_irq_line(tms7000_state *cpustate, int irqline, int state);
44static void tms7000_check_IRQ_lines(tms7000_state *cpustate);
45static void tms7000_do_interrupt( tms7000_state *cpustate, UINT16 address, UINT8 line );
46static CPU_EXECUTE( tms7000 );
47static CPU_EXECUTE( tms7000_exl );
48static void tms7000_service_timer1( device_t *device );
49static UINT16 bcd_add( UINT16 a, UINT16 b );
50static UINT16 bcd_tencomp( UINT16 a );
51static UINT16 bcd_sub( UINT16 a, UINT16 b);
52
5340/* Static variables */
5441
55#define RM(Addr) ((unsigned)cpustate->program->read_byte(Addr))
56#define WM(Addr,Value) (cpustate->program->write_byte(Addr, Value))
42#define RM(Addr) ((unsigned)m_program->read_byte(Addr))
43#define WM(Addr,Value) (m_program->write_byte(Addr, Value))
5744
58#define IMMBYTE(b)  b = ((unsigned)cpustate->direct->read_raw_byte(pPC)); pPC++
59#define SIMMBYTE(b) b = ((signed)cpustate->direct->read_raw_byte(pPC)); pPC++
60#define IMMWORD(w)  w.b.h = (unsigned)cpustate->direct->read_raw_byte(pPC++); w.b.l = (unsigned)cpustate->direct->read_raw_byte(pPC++)
45#define IMMBYTE(b)  b = ((unsigned)m_direct->read_raw_byte(pPC)); pPC++
46#define SIMMBYTE(b) b = ((signed)m_direct->read_raw_byte(pPC)); pPC++
47#define IMMWORD(w)  w.b.h = (unsigned)m_direct->read_raw_byte(pPC++); w.b.l = (unsigned)m_direct->read_raw_byte(pPC++)
6148
6249#define PUSHBYTE(b) pSP++; WM(pSP,b)
6350#define PUSHWORD(w) pSP++; WM(pSP,w.b.h); pSP++; WM(pSP,w.b.l)
6451#define PULLBYTE(b) b = RM(pSP); pSP--
6552#define PULLWORD(w) w.b.l = RM(pSP); pSP--; w.b.h = RM(pSP); pSP--
6653
67struct tms7000_state
54
55const device_type TMS7000 = &device_creator<tms7000_device>;
56const device_type TMS7000_EXL = &device_creator<tms7000_exl_device>;
57
58
59static ADDRESS_MAP_START(tms7000_mem, AS_PROGRAM, 8, tms7000_device )
60   AM_RANGE(0x0000, 0x007f)    AM_READWRITE(tms7000_internal_r, tms7000_internal_w) /* tms7000 internal RAM */
61   AM_RANGE(0x0080, 0x00ff)    AM_NOP                      /* reserved */
62   AM_RANGE(0x0100, 0x01ff)    AM_READWRITE(tms70x0_pf_r, tms70x0_pf_w)             /* tms7000 internal I/O ports */
63ADDRESS_MAP_END
64
65
66tms7000_device::tms7000_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
67   : cpu_device(mconfig, TMS7000, "TMS7000", tag, owner, clock, "tms7000", __FILE__)
68   , m_program_config("program", ENDIANNESS_BIG, 8, 16, 0, ADDRESS_MAP_NAME(tms7000_mem))
69   , m_io_config("io", ENDIANNESS_BIG, 8, 8, 0)
70   , m_opcode(s_opfn)
6871{
69   PAIR        pc;         /* Program counter */
70   UINT8       sp;     /* Stack Pointer */
71   UINT8       sr;     /* Status Register */
72   UINT8       irq_state[3];   /* State of the three IRQs */
73   UINT8       rf[0x80];   /* Register file (SJE) */
74   UINT8       pf[0x100];  /* Perpherial file */
75   device_irq_acknowledge_callback irq_callback;
76   legacy_cpu_device *device;
77   address_space *program;
78   direct_read_data *direct;
79   address_space *io;
80   int         icount;
81   int         div_by_16_trigger;
82   int         cycles_per_INT2;
83   UINT8       t1_capture_latch; /* Timer 1 capture latch */
84   INT8        t1_prescaler;   /* Timer 1 prescaler (5 bits) */
85   INT16       t1_decrementer; /* Timer 1 decrementer (8 bits) */
86   UINT8       idle_state; /* Set after the execution of an idle instruction */
87};
72}
8873
89INLINE tms7000_state *get_safe_token(device_t *device)
74
75tms7000_device::tms7000_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source)
76   : cpu_device(mconfig, type, name, tag, owner, clock, shortname, source)
77   , m_program_config("program", ENDIANNESS_BIG, 8, 16, 0, ADDRESS_MAP_NAME(tms7000_mem))
78   , m_io_config("io", ENDIANNESS_BIG, 8, 8, 0)
79   , m_opcode(s_opfn_exl)
9080{
91   assert(device != NULL);
92   assert(device->type() == TMS7000 ||
93         device->type() == TMS7000_EXL);
94   return (tms7000_state *)downcast<legacy_cpu_device *>(device)->token();
9581}
9682
97#define pPC     cpustate->pc.w.l
98#define PC      cpustate->pc
99#define pSP     cpustate->sp
100#define pSR     cpustate->sr
10183
84tms7000_exl_device::tms7000_exl_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
85   : tms7000_device(mconfig, TMS7000_EXL, "TMS7000_EXL", tag, owner, clock, "tms7000_exl", __FILE__)
86{
87}
88
89
90offs_t tms7000_device::disasm_disassemble(char *buffer, offs_t pc, const UINT8 *oprom, const UINT8 *opram, UINT32 options)
91{
92   extern CPU_DISASSEMBLE( tms7000 );
93   return CPU_DISASSEMBLE_NAME(tms7000)(this, buffer, pc, oprom, opram, options);
94}
95
96
97#define pPC     m_pc.w.l
98#define PC      m_pc
99#define pSP     m_sp
100#define pSR     m_sr
101
102102#define RDA     RM(0x0000)
103103#define RDB     RM(0x0001)
104104
r26878r26879
126126#define SETZ        pSR |= SR_Z
127127#define SETN        pSR |= SR_N
128128
129static DECLARE_READ8_HANDLER( tms7000_internal_r );
130static DECLARE_WRITE8_HANDLER( tms7000_internal_w );
131static DECLARE_READ8_HANDLER( tms70x0_pf_r );
132static DECLARE_WRITE8_HANDLER( tms70x0_pf_w );
133129
134static ADDRESS_MAP_START(tms7000_mem, AS_PROGRAM, 8, legacy_cpu_device )
135   AM_RANGE(0x0000, 0x007f)    AM_READWRITE_LEGACY(tms7000_internal_r, tms7000_internal_w) /* tms7000 internal RAM */
136   AM_RANGE(0x0080, 0x00ff)    AM_NOP                      /* reserved */
137   AM_RANGE(0x0100, 0x01ff)    AM_READWRITE_LEGACY(tms70x0_pf_r, tms70x0_pf_w)             /* tms7000 internal I/O ports */
138ADDRESS_MAP_END
139
140
141INLINE UINT16 RM16( tms7000_state *cpustate, UINT32 mAddr ) /* Read memory (16-bit) */
130UINT16 tms7000_device::RM16( UINT32 mAddr ) /* Read memory (16-bit) */
142131{
143132   UINT32 result = RM(mAddr) << 8;
144133   return result | RM((mAddr+1)&0xffff);
145134}
146135
147INLINE UINT16 RRF16( tms7000_state *cpustate, UINT32 mAddr )    /*Read register file (16 bit) */
136UINT16 tms7000_device::RRF16( UINT32 mAddr )    /*Read register file (16 bit) */
148137{
149138   PAIR result;
150139   result.b.h = RM((mAddr-1)&0xffff);
r26878r26879
152141   return result.w.l;
153142}
154143
155INLINE void WRF16( tms7000_state *cpustate, UINT32 mAddr, PAIR p )  /*Write register file (16 bit) */
144void tms7000_device::WRF16( UINT32 mAddr, PAIR p )  /*Write register file (16 bit) */
156145{
157146   WM( (mAddr-1)&0xffff, p.b.h );
158147   WM( mAddr, p.b.l );
159148}
160149
161150
162static CPU_INIT( tms7000 )
151void tms7000_device::device_start()
163152{
164   tms7000_state *cpustate = get_safe_token(device);
153   m_program = &space(AS_PROGRAM);
154   m_direct = &m_program->direct();
155   m_io = &space(AS_IO);
165156
166   cpustate->irq_callback = irqcallback;
167   cpustate->device = device;
168   cpustate->program = &device->space(AS_PROGRAM);
169   cpustate->direct = &cpustate->program->direct();
170   cpustate->io = &device->space(AS_IO);
157   memset(m_pf, 0, 0x100);
158   memset(m_rf, 0, 0x80);
159   m_cycles_per_INT2 = 0;
160   m_t1_capture_latch = 0;
161   m_t1_prescaler = 0;
162   m_t1_decrementer = 0;
171163
172   memset(cpustate->pf, 0, 0x100);
173   memset(cpustate->rf, 0, 0x80);
174
175164   /* Save register state */
176   device->save_item(NAME(pPC));
177   device->save_item(NAME(pSP));
178   device->save_item(NAME(pSR));
165   save_item(NAME(pPC));
166   save_item(NAME(pSP));
167   save_item(NAME(pSR));
179168
180169   /* Save Interrupt state */
181   device->save_item(NAME(cpustate->irq_state));
170   save_item(NAME(m_irq_state));
182171
183172   /* Save register and perpherial file state */
184   device->save_item(NAME(cpustate->rf));
185   device->save_item(NAME(cpustate->pf));
173   save_item(NAME(m_rf));
174   save_item(NAME(m_pf));
186175
187176   /* Save timer state */
188   device->save_item(NAME(cpustate->t1_prescaler));
189   device->save_item(NAME(cpustate->t1_capture_latch));
190   device->save_item(NAME(cpustate->t1_decrementer));
177   save_item(NAME(m_t1_prescaler));
178   save_item(NAME(m_t1_capture_latch));
179   save_item(NAME(m_t1_decrementer));
191180
192   device->save_item(NAME(cpustate->idle_state));
181   save_item(NAME(m_idle_state));
182
183   state_add( TMS7000_PC,     "PC",    m_pc.w.l).formatstr("%04X");
184   state_add( TMS7000_SP,     "S",     m_sp).formatstr("%02X");
185   state_add( TMS7000_ST,     "ST",    m_sr).formatstr("%02X");
186   state_add( TMS7000_IDLE,   "Idle",  m_idle_state).formatstr("%02X");
187   state_add( TMS7000_T1_CL,  "T1CL",  m_t1_capture_latch).formatstr("%02X");
188   state_add( TMS7000_T1_PS,  "T1PS",  m_t1_prescaler).mask(0x1f).formatstr("%02X");
189   state_add( TMS7000_T1_DEC, "T1DEC", m_t1_decrementer).mask(0xff).formatstr("%02X");
190
191   state_add(STATE_GENPC, "GENPC", m_pc.w.l).formatstr("%04X").noshow();
192   state_add(STATE_GENSP, "GENSP", m_sp).formatstr("%02X").noshow();
193   state_add(STATE_GENFLAGS, "GENFLAGS",  m_sr).formatstr("%8s").noshow();
194
195   m_icountptr = &m_icount;
193196}
194197
195static CPU_RESET( tms7000 )
198void tms7000_device::state_string_export(const device_state_entry &entry, astring &string)
196199{
197   tms7000_state *cpustate = get_safe_token(device);
200   switch (entry.index())
201   {
202      case STATE_GENFLAGS:
203         string.printf("%c%c%c%c%c%c%c%c",
204                  m_sr & 0x80 ? 'C':'c',
205                  m_sr & 0x40 ? 'N':'n',
206                  m_sr & 0x20 ? 'Z':'z',
207                  m_sr & 0x10 ? 'I':'i',
208                  m_sr & 0x08 ? '?':'.',
209                  m_sr & 0x04 ? '?':'.',
210                  m_sr & 0x02 ? '?':'.',
211                  m_sr & 0x01 ? '?':'.'
212         );
213         break;
214   }
215}
198216
199//  cpustate->architecture = (int)param;
217void tms7000_device::device_reset()
218{
219//  m_architecture = (int)param;
200220
201   cpustate->idle_state = 0;
202   cpustate->irq_state[ TMS7000_IRQ1_LINE ] = CLEAR_LINE;
203   cpustate->irq_state[ TMS7000_IRQ2_LINE ] = CLEAR_LINE;
204   cpustate->irq_state[ TMS7000_IRQ3_LINE ] = CLEAR_LINE;
221   m_idle_state = 0;
222   m_irq_state[ TMS7000_IRQ1_LINE ] = CLEAR_LINE;
223   m_irq_state[ TMS7000_IRQ2_LINE ] = CLEAR_LINE;
224   m_irq_state[ TMS7000_IRQ3_LINE ] = CLEAR_LINE;
205225
206226   WM( 0x100 + 9, 0 );     /* Data direction regs are cleared */
207227   WM( 0x100 + 11, 0 );
208228
209//  if( cpustate->architecture == TMS7000_NMOS )
229//  if( m_architecture == TMS7000_NMOS )
210230//  {
211231      WM( 0x100 + 4, 0xff );      /* Output 0xff on port A */
212232      WM( 0x100 + 8, 0xff );      /* Output 0xff on port C */
r26878r26879
223243
224244   /* On TMS70x2 and TMS70Cx2 IOCNT1 is zero */
225245
226   WRA( cpustate->pc.b.h );    /* Write previous PC to A:B */
227   WRB( cpustate->pc.b.l );
228   pPC = RM16(cpustate, 0xfffe);       /* Load reset vector */
246   WRA( m_pc.b.h );    /* Write previous PC to A:B */
247   WRB( m_pc.b.l );
248   pPC = RM16(0xfffe);       /* Load reset vector */
229249
230   cpustate->div_by_16_trigger = -16;
250   m_div_by_16_trigger = -16;
231251}
232252
233
234
235/**************************************************************************
236 * Generic set_info
237 **************************************************************************/
238
239static CPU_SET_INFO( tms7000 )
253void tms7000_device::execute_set_input(int irqline, int state)
240254{
241   tms7000_state *cpustate = get_safe_token(device);
242
243   switch (state)
244   {
245      /* --- the following bits of info are set as 64-bit signed integers --- */
246      case CPUINFO_INT_INPUT_STATE + TMS7000_IRQ1_LINE:   tms7000_set_irq_line(cpustate, TMS7000_IRQ1_LINE, info->i); break;
247      case CPUINFO_INT_INPUT_STATE + TMS7000_IRQ2_LINE:   tms7000_set_irq_line(cpustate, TMS7000_IRQ2_LINE, info->i); break;
248      case CPUINFO_INT_INPUT_STATE + TMS7000_IRQ3_LINE:   tms7000_set_irq_line(cpustate, TMS7000_IRQ3_LINE, info->i); break;
249
250      case CPUINFO_INT_PC:
251      case CPUINFO_INT_REGISTER + TMS7000_PC: pPC = info->i; break;
252      case CPUINFO_INT_SP:
253      case CPUINFO_INT_REGISTER + TMS7000_SP: pSP = info->i;  break;
254      case CPUINFO_INT_REGISTER + TMS7000_ST: pSR = info->i;  tms7000_check_IRQ_lines(cpustate);  break;
255      case CPUINFO_INT_REGISTER + TMS7000_IDLE: cpustate->idle_state = info->i;   break;
256      case CPUINFO_INT_REGISTER + TMS7000_T1_CL: cpustate->t1_capture_latch = info->i;    break;
257      case CPUINFO_INT_REGISTER + TMS7000_T1_PS: cpustate->t1_prescaler = info->i;    break;
258      case CPUINFO_INT_REGISTER + TMS7000_T1_DEC: cpustate->t1_decrementer = info->i; break;
259   }
260}
261
262/**************************************************************************
263 * Generic get_info
264 **************************************************************************/
265
266CPU_GET_INFO( tms7000 )
267{
268   tms7000_state *cpustate = (device != NULL && device->token() != NULL) ? get_safe_token(device) : NULL;
269
270   switch( state )
271   {
272      /* --- the following bits of info are returned as 64-bit signed integers --- */
273      case CPUINFO_INT_CONTEXT_SIZE:  info->i = sizeof(tms7000_state);    break;
274      case CPUINFO_INT_INPUT_LINES:   info->i = 3;    break;
275      case CPUINFO_INT_DEFAULT_IRQ_VECTOR:    info->i = 0;    break;
276      case CPUINFO_INT_ENDIANNESS:    info->i = ENDIANNESS_BIG;   break;
277      case CPUINFO_INT_CLOCK_MULTIPLIER:  info->i = 1;    break;
278      case CPUINFO_INT_CLOCK_DIVIDER: info->i = 1;    break;
279      case CPUINFO_INT_MIN_INSTRUCTION_BYTES: info->i = 1;    break;
280      case CPUINFO_INT_MAX_INSTRUCTION_BYTES: info->i = 4;    break;
281      case CPUINFO_INT_MIN_CYCLES:    info->i = 1;    break;
282      case CPUINFO_INT_MAX_CYCLES:    info->i = 48;   break; /* 48 represents the multiply instruction, the next highest is 17 */
283
284      case CPUINFO_INT_DATABUS_WIDTH + AS_PROGRAM:    info->i = 8;    break;
285      case CPUINFO_INT_ADDRBUS_WIDTH + AS_PROGRAM:    info->i = 16;   break;
286      case CPUINFO_INT_ADDRBUS_SHIFT + AS_PROGRAM:    info->i = 0;    break;
287      case CPUINFO_INT_DATABUS_WIDTH + AS_DATA:   info->i = 0;    break;
288      case CPUINFO_INT_ADDRBUS_WIDTH + AS_DATA:   info->i = 0;    break;
289      case CPUINFO_INT_ADDRBUS_SHIFT + AS_DATA:   info->i = 0;    break;
290      case CPUINFO_INT_DATABUS_WIDTH + AS_IO: info->i = 8;    break;
291      case CPUINFO_INT_ADDRBUS_WIDTH + AS_IO: info->i = 8;    break;
292      case CPUINFO_INT_ADDRBUS_SHIFT + AS_IO: info->i = 0;    break;
293
294      case CPUINFO_INT_INPUT_STATE + TMS7000_IRQ1_LINE:   info->i = cpustate->irq_state[TMS7000_IRQ1_LINE]; break;
295      case CPUINFO_INT_INPUT_STATE + TMS7000_IRQ2_LINE:   info->i = cpustate->irq_state[TMS7000_IRQ2_LINE]; break;
296      case CPUINFO_INT_INPUT_STATE + TMS7000_IRQ3_LINE:   info->i = cpustate->irq_state[TMS7000_IRQ3_LINE]; break;
297
298      case CPUINFO_INT_PREVIOUSPC:    info->i = 0; /* Not supported */    break;
299
300      case CPUINFO_INT_PC:
301      case CPUINFO_INT_REGISTER + TMS7000_PC: info->i = pPC;  break;
302      case CPUINFO_INT_SP:
303      case CPUINFO_INT_REGISTER + TMS7000_SP: info->i = pSP;  break;
304      case CPUINFO_INT_REGISTER + TMS7000_ST: info->i = pSR;  break;
305      case CPUINFO_INT_REGISTER + TMS7000_IDLE: info->i = cpustate->idle_state; break;
306      case CPUINFO_INT_REGISTER + TMS7000_T1_CL: info->i = cpustate->t1_capture_latch; break;
307      case CPUINFO_INT_REGISTER + TMS7000_T1_PS: info->i = cpustate->t1_prescaler; break;
308      case CPUINFO_INT_REGISTER + TMS7000_T1_DEC: info->i = cpustate->t1_decrementer; break;
309
310      /* --- the following bits of info are returned as pointers to data or functions --- */
311      case CPUINFO_FCT_SET_INFO:  info->setinfo = CPU_SET_INFO_NAME(tms7000); break;
312      case CPUINFO_FCT_INIT:  info->init = CPU_INIT_NAME(tms7000);    break;
313      case CPUINFO_FCT_RESET: info->reset = CPU_RESET_NAME(tms7000);  break;
314      case CPUINFO_FCT_EXECUTE:   info->execute = CPU_EXECUTE_NAME(tms7000);  break;
315      case CPUINFO_FCT_BURN:  info->burn = NULL;  /* Not supported */break;
316      case CPUINFO_FCT_DISASSEMBLE:   info->disassemble = CPU_DISASSEMBLE_NAME(tms7000);  break;
317      case CPUINFO_PTR_INSTRUCTION_COUNTER:   info->icount = &cpustate->icount;   break;
318      case CPUINFO_PTR_INTERNAL_MEMORY_MAP + AS_PROGRAM:  info->internal_map8 = ADDRESS_MAP_NAME(tms7000_mem); break;
319
320      /* --- the following bits of info are returned as NULL-terminated strings --- */
321      case CPUINFO_STR_NAME:  strcpy(info->s, "TMS7000"); break;
322      case CPUINFO_STR_SHORTNAME:  strcpy(info->s, "tms7000"); break;
323      case CPUINFO_STR_FAMILY:    strcpy(info->s, "Texas Instriuments TMS7000"); break;
324      case CPUINFO_STR_VERSION:   strcpy(info->s, "1.0"); break;
325      case CPUINFO_STR_SOURCE_FILE:   strcpy(info->s, __FILE__); break;
326      case CPUINFO_STR_CREDITS:   strcpy(info->s, "Copyright tim lindner"); break;
327
328      case CPUINFO_STR_FLAGS:
329            sprintf(info->s,  "%c%c%c%c%c%c%c%c",
330                  cpustate->sr & 0x80 ? 'C':'c',
331                  cpustate->sr & 0x40 ? 'N':'n',
332                  cpustate->sr & 0x20 ? 'Z':'z',
333                  cpustate->sr & 0x10 ? 'I':'i',
334                  cpustate->sr & 0x08 ? '?':'.',
335                  cpustate->sr & 0x04 ? '?':'.',
336                  cpustate->sr & 0x02 ? '?':'.',
337                  cpustate->sr & 0x01 ? '?':'.' );
338            break;
339
340      case CPUINFO_STR_REGISTER + TMS7000_PC: sprintf(info->s, "PC:%04X", cpustate->pc.w.l); break;
341      case CPUINFO_STR_REGISTER + TMS7000_SP: sprintf(info->s, "S:%02X", cpustate->sp); break;
342      case CPUINFO_STR_REGISTER + TMS7000_ST: sprintf(info->s, "ST:%02X", cpustate->sr); break;
343      case CPUINFO_STR_REGISTER + TMS7000_IDLE: sprintf(info->s, "Idle:%02X", cpustate->idle_state); break;
344      case CPUINFO_STR_REGISTER + TMS7000_T1_CL: sprintf(info->s, "T1CL:%02X", cpustate->t1_capture_latch); break;
345      case CPUINFO_STR_REGISTER + TMS7000_T1_PS: sprintf(info->s, "T1PS:%02X", cpustate->t1_prescaler & 0x1f); break;
346      case CPUINFO_STR_REGISTER + TMS7000_T1_DEC: sprintf(info->s, "T1DEC:%02X", cpustate->t1_decrementer & 0xff); break;
347
348   }
349}
350
351CPU_GET_INFO( tms7000_exl )
352{
353   switch( state )
354   {
355      case CPUINFO_FCT_EXECUTE:
356         info->execute = CPU_EXECUTE_NAME(tms7000_exl);
357         break;
358      default:
359         CPU_GET_INFO_CALL(tms7000);
360         break;
361   }
362}
363
364void tms7000_set_irq_line(tms7000_state *cpustate, int irqline, int state)
365{
366   if (cpustate->irq_state[irqline] != state)
255   if (m_irq_state[irqline] != state)
367256   {   /* check for transition */
368      cpustate->irq_state[irqline] = state;
257      m_irq_state[irqline] = state;
369258
370      LOG(("tms7000: (cpu '%s') set_irq_line (INT%d, state %d)\n", cpustate->device->tag(), irqline+1, state));
259      LOG(("tms7000: (cpu '%s') set_irq_line (INT%d, state %d)\n", tag(), irqline+1, state));
371260
372261      if (state == CLEAR_LINE)
373262      {
374263         return;
375264      }
376265
377      cpustate->pf[0] |= (0x02 << (irqline * 2)); /* Set INTx iocntl0 flag */
266      m_pf[0] |= (0x02 << (irqline * 2)); /* Set INTx iocntl0 flag */
378267
379268      if( irqline == TMS7000_IRQ3_LINE )
380269      {
381270         /* Latch the value in perpherial file register 3 */
382         cpustate->t1_capture_latch = cpustate->t1_decrementer & 0x00ff;
271         m_t1_capture_latch = m_t1_decrementer & 0x00ff;
383272      }
384273
385      tms7000_check_IRQ_lines(cpustate);
274      tms7000_check_IRQ_lines();
386275   }
387276}
388277
389static void tms7000_check_IRQ_lines(tms7000_state *cpustate)
278void tms7000_device::tms7000_check_IRQ_lines()
390279{
391280   if( pSR & SR_I ) /* Check Global Interrupt bit: Status register, bit 4 */
392281   {
393      if ((cpustate->irq_state[TMS7000_IRQ1_LINE] == ASSERT_LINE) || (cpustate->pf[0] & 0x02))
282      if ((m_irq_state[TMS7000_IRQ1_LINE] == ASSERT_LINE) || (m_pf[0] & 0x02))
394283      {
395         if( cpustate->pf[0] & 0x01 ) /* INT1 Enable bit */
284         if( m_pf[0] & 0x01 ) /* INT1 Enable bit */
396285         {
397            tms7000_do_interrupt( cpustate, 0xfffc, TMS7000_IRQ1_LINE );
398            cpustate->pf[0] &= ~0x02; /* Data Manual, page: 9-41 */
286            tms7000_do_interrupt( 0xfffc, TMS7000_IRQ1_LINE );
287            m_pf[0] &= ~0x02; /* Data Manual, page: 9-41 */
399288            return;
400289         }
401290      }
402291
403      if( cpustate->irq_state[ TMS7000_IRQ2_LINE ] == ASSERT_LINE )
292      if( m_irq_state[ TMS7000_IRQ2_LINE ] == ASSERT_LINE )
404293      {
405         if( cpustate->pf[0] & 0x04 ) /* INT2 Enable bit */
294         if( m_pf[0] & 0x04 ) /* INT2 Enable bit */
406295         {
407            tms7000_do_interrupt( cpustate, 0xfffa, TMS7000_IRQ2_LINE );
296            tms7000_do_interrupt( 0xfffa, TMS7000_IRQ2_LINE );
408297            return;
409298         }
410299      }
411300
412      if ((cpustate->irq_state[TMS7000_IRQ3_LINE] == ASSERT_LINE) || (cpustate->pf[0] & 0x20))
301      if ((m_irq_state[TMS7000_IRQ3_LINE] == ASSERT_LINE) || (m_pf[0] & 0x20))
413302      {
414         if( cpustate->pf[0] & 0x10 ) /* INT3 Enable bit */
303         if( m_pf[0] & 0x10 ) /* INT3 Enable bit */
415304         {
416            tms7000_do_interrupt( cpustate, 0xfff8, TMS7000_IRQ3_LINE );
417            cpustate->pf[0] &= ~0x20; /* Data Manual, page: 9-41 */
305            tms7000_do_interrupt( 0xfff8, TMS7000_IRQ3_LINE );
306            m_pf[0] &= ~0x20; /* Data Manual, page: 9-41 */
418307            return;
419308         }
420309      }
421310   }
422311}
423312
424static void tms7000_do_interrupt( tms7000_state *cpustate, UINT16 address, UINT8 line )
313void tms7000_device::tms7000_do_interrupt( UINT16 address, UINT8 line )
425314{
426315   PUSHBYTE( pSR );        /* Push Status register */
427316   PUSHWORD( PC );         /* Push Program Counter */
428317   pSR = 0;                /* Clear Status register */
429   pPC = RM16(cpustate, address);  /* Load PC with interrupt vector */
318   pPC = RM16(address);  /* Load PC with interrupt vector */
430319
431   if( cpustate->idle_state == 0 )
432      cpustate->icount -= 19;     /* 19 cycles used */
320   if( m_idle_state == 0 )
321      m_icount -= 19;     /* 19 cycles used */
433322   else
434323   {
435      cpustate->icount -= 17;     /* 17 if idled */
436      cpustate->idle_state = 0;
324      m_icount -= 17;     /* 17 if idled */
325      m_idle_state = 0;
437326   }
438327
439   (void)(*cpustate->irq_callback)(cpustate->device, line);
328   standard_irq_callback(line);
440329}
441330
442331#include "tms70op.c"
443332#include "tms70tb.c"
444333
445static CPU_EXECUTE( tms7000 )
334void tms7000_device::execute_run()
446335{
447   tms7000_state *cpustate = get_safe_token(device);
448336   int op;
449337
450   cpustate->div_by_16_trigger += cpustate->icount;
338   m_div_by_16_trigger += m_icount;
451339
452   tms7000_check_IRQ_lines(cpustate);
340   tms7000_check_IRQ_lines();
453341
454342   do
455343   {
456      debugger_instruction_hook(device, pPC);
344      debugger_instruction_hook(this, pPC);
457345
458      if( cpustate->idle_state == 0 )
346      if( m_idle_state == 0 )
459347      {
460         op = cpustate->direct->read_decrypted_byte(pPC++);
348         op = m_direct->read_decrypted_byte(pPC++);
461349
462         opfn[op](cpustate);
350         (this->*m_opcode[op])();
463351      }
464352      else
465         cpustate->icount -= 16;
353         m_icount -= 16;
466354
467355      /* Internal timer system */
468356
469      while( cpustate->icount < cpustate->div_by_16_trigger )
357      while( m_icount < m_div_by_16_trigger )
470358      {
471         cpustate->div_by_16_trigger -= 16;
359         m_div_by_16_trigger -= 16;
472360
473         if( (cpustate->pf[0x03] & 0x80) == 0x80 ) /* Is timer system active? */
361         if( (m_pf[0x03] & 0x80) == 0x80 ) /* Is timer system active? */
474362         {
475            if( (cpustate->pf[0x03] & 0x40) != 0x40) /* Is system clock (divided by 16) the timer source? */
476               tms7000_service_timer1(device);
363            if( (m_pf[0x03] & 0x40) != 0x40) /* Is system clock (divided by 16) the timer source? */
364               tms7000_service_timer1();
477365         }
478366      }
479367
480   } while( cpustate->icount > 0 );
368   } while( m_icount > 0 );
481369
482   cpustate->div_by_16_trigger -= cpustate->icount;
370   m_div_by_16_trigger -= m_icount;
483371}
484372
485static CPU_EXECUTE( tms7000_exl )
486{
487   tms7000_state *cpustate = get_safe_token(device);
488   int op;
489373
490   cpustate->div_by_16_trigger += cpustate->icount;
491
492   tms7000_check_IRQ_lines(cpustate);
493
494   do
495   {
496      debugger_instruction_hook(device, pPC);
497
498      if( cpustate->idle_state == 0 )
499      {
500         op = cpustate->direct->read_decrypted_byte(pPC++);
501
502         opfn_exl[op](cpustate);
503      }
504      else
505         cpustate->icount -= 16;
506
507      /* Internal timer system */
508
509      while( cpustate->icount < cpustate->div_by_16_trigger )
510      {
511         cpustate->div_by_16_trigger -= 16;
512
513         if( (cpustate->pf[0x03] & 0x80) == 0x80 ) /* Is timer system active? */
514         {
515            if( (cpustate->pf[0x03] & 0x40) != 0x40) /* Is system clock (divided by 16) the timer source? */
516               tms7000_service_timer1(device);
517         }
518      }
519
520   } while( cpustate->icount > 0 );
521
522   cpustate->div_by_16_trigger -= cpustate->icount;
523}
524
525374/****************************************************************************
526375 * Trigger the event counter
527376 ****************************************************************************/
528void tms7000_A6EC1( device_t *device )
377void tms7000_device::tms7000_A6EC1()
529378{
530   tms7000_state *cpustate = get_safe_token(device);
531   if( (cpustate->pf[0x03] & 0x80) == 0x80 ) /* Is timer system active? */
379   if( (m_pf[0x03] & 0x80) == 0x80 ) /* Is timer system active? */
532380   {
533      if( (cpustate->pf[0x03] & 0x40) == 0x40) /* Is event counter the timer source? */
534         tms7000_service_timer1(device);
381      if( (m_pf[0x03] & 0x40) == 0x40) /* Is event counter the timer source? */
382         tms7000_service_timer1();
535383   }
536384}
537385
538static void tms7000_service_timer1( device_t *device )
386void tms7000_device::tms7000_service_timer1()
539387{
540   tms7000_state *cpustate = get_safe_token(device);
541   if( --cpustate->t1_prescaler < 0 ) /* Decrement prescaler and check for underflow */
388   if( --m_t1_prescaler < 0 ) /* Decrement prescaler and check for underflow */
542389   {
543      cpustate->t1_prescaler = cpustate->pf[3] & 0x1f; /* Reload prescaler (5 bit) */
390      m_t1_prescaler = m_pf[3] & 0x1f; /* Reload prescaler (5 bit) */
544391
545      if( --cpustate->t1_decrementer < 0 ) /* Decrement timer1 register and check for underflow */
392      if( --m_t1_decrementer < 0 ) /* Decrement timer1 register and check for underflow */
546393      {
547         cpustate->t1_decrementer = cpustate->pf[2]; /* Reload decrementer (8 bit) */
548         device->execute().set_input_line(TMS7000_IRQ2_LINE, HOLD_LINE);
549         //LOG( ("tms7000: trigger int2 (cycles: %d)\t%d\tdelta %d\n", cpustate->device->total_cycles(), cpustate->device->total_cycles() - tick, cpustate->cycles_per_INT2-(cpustate->device->total_cycles() - tick) );
550         //tick = cpustate->device->total_cycles() );
394         m_t1_decrementer = m_pf[2]; /* Reload decrementer (8 bit) */
395         set_input_line(TMS7000_IRQ2_LINE, HOLD_LINE);
396         //LOG( ("tms7000: trigger int2 (cycles: %d)\t%d\tdelta %d\n", total_cycles(), total_cycles() - tick, m_cycles_per_INT2-(total_cycles() - tick) );
397         //tick = total_cycles() );
551398         /* Also, cascade out to timer 2 - timer 2 unimplemented */
552399      }
553400   }
554//  LOG( ( "tms7000: service timer1. 0x%2.2x 0x%2.2x (cycles %d)\t%d\t\n", cpustate->t1_prescaler, cpustate->t1_decrementer, cpustate->device->total_cycles(), cpustate->device->total_cycles() - tick2 ) );
555//  tick2 = cpustate->device->total_cycles();
401//  LOG( ( "tms7000: service timer1. 0x%2.2x 0x%2.2x (cycles %d)\t%d\t\n", m_t1_prescaler, m_t1_decrementer, total_cycles(), total_cycles() - tick2 ) );
402//  tick2 = total_cycles();
556403}
557404
558static WRITE8_HANDLER( tms70x0_pf_w )   /* Perpherial file write */
405WRITE8_MEMBER( tms7000_device::tms70x0_pf_w )   /* Perpherial file write */
559406{
560   tms7000_state *cpustate = get_safe_token(&space.device());
561407   UINT8   temp1, temp2, temp3;
562408
563409   switch( offset )
564410   {
565411      case 0x00:  /* IOCNT0, Input/Ouput control */
566412         temp1 = data & 0x2a;                            /* Record which bits to clear */
567         temp2 = cpustate->pf[0x00] & 0x2a;              /* Get copy of current bits */
413         temp2 = m_pf[0x00] & 0x2a;              /* Get copy of current bits */
568414         temp3 = (~temp1) & temp2;                       /* Clear the requested bits */
569         cpustate->pf[0x00] = temp3 | (data & (~0x2a) ); /* OR in the remaining data */
415         m_pf[0x00] = temp3 | (data & (~0x2a) ); /* OR in the remaining data */
570416         break;
571417      case 0x02:
572         cpustate->t1_decrementer = cpustate->pf[0x02] = data;
573         cpustate->cycles_per_INT2 = 0x10*((cpustate->pf[3] & 0x1f)+1)*(cpustate->pf[0x02]+1);
574         LOG( ( "tms7000: Timer adjusted. Decrementer: 0x%2.2x (Cycles per interrupt: %d)\n", cpustate->t1_decrementer, cpustate->cycles_per_INT2 ) );
418         m_t1_decrementer = m_pf[0x02] = data;
419         m_cycles_per_INT2 = 0x10*((m_pf[3] & 0x1f)+1)*(m_pf[0x02]+1);
420         LOG( ( "tms7000: Timer adjusted. Decrementer: 0x%2.2x (Cycles per interrupt: %d)\n", m_t1_decrementer, m_cycles_per_INT2 ) );
575421         break;
576422      case 0x03:  /* T1CTL, timer 1 control */
577         if( ((cpustate->pf[0x03] & 0x80) == 0) && ((data & 0x80) == 0x80 ) )   /* Start timer? */
423         if( ((m_pf[0x03] & 0x80) == 0) && ((data & 0x80) == 0x80 ) )   /* Start timer? */
578424         {
579            cpustate->pf[0x03] = data;
580            cpustate->t1_prescaler = cpustate->pf[3] & 0x1f; /* Reload prescaler (5 bit) */
581            cpustate->cycles_per_INT2 = 0x10*((cpustate->pf[3] & 0x1f)+1)*(cpustate->pf[0x02]+1);
582            LOG( ( "tms7000: Timer started. Prescaler: 0x%2.2x (Cycles per interrupt: %d)\n", cpustate->pf[3] & 0x1f, cpustate->cycles_per_INT2 ) );
425            m_pf[0x03] = data;
426            m_t1_prescaler = m_pf[3] & 0x1f; /* Reload prescaler (5 bit) */
427            m_cycles_per_INT2 = 0x10*((m_pf[3] & 0x1f)+1)*(m_pf[0x02]+1);
428            LOG( ( "tms7000: Timer started. Prescaler: 0x%2.2x (Cycles per interrupt: %d)\n", m_pf[3] & 0x1f, m_cycles_per_INT2 ) );
583429         }
584         else if( ((data & 0x80) == 0x80 ) && ((cpustate->pf[0x03] & 0x80) == 0) )   /* Timer Stopped? */
430         else if( ((data & 0x80) == 0x80 ) && ((m_pf[0x03] & 0x80) == 0) )   /* Timer Stopped? */
585431         {
586            cpustate->pf[0x03] = data;
587            cpustate->t1_prescaler = cpustate->pf[3] & 0x1f; /* Reload prescaler (5 bit) */
588            cpustate->cycles_per_INT2 = 0x10*((cpustate->pf[3] & 0x1f)+1)*(cpustate->pf[0x02]+1);
589            LOG( ( "tms7000: Timer stopped. Prescaler: 0x%2.2x (Cycles per interrupt: %d)\n", cpustate->pf[3] & 0x1f, cpustate->cycles_per_INT2 ) );
432            m_pf[0x03] = data;
433            m_t1_prescaler = m_pf[3] & 0x1f; /* Reload prescaler (5 bit) */
434            m_cycles_per_INT2 = 0x10*((m_pf[3] & 0x1f)+1)*(m_pf[0x02]+1);
435            LOG( ( "tms7000: Timer stopped. Prescaler: 0x%2.2x (Cycles per interrupt: %d)\n", m_pf[3] & 0x1f, m_cycles_per_INT2 ) );
590436         }
591437         else /* Don't modify timer state, but still store data */
592438         {
593            cpustate->pf[0x03] = data;
594            cpustate->cycles_per_INT2 = 0x10*((cpustate->pf[3] & 0x1f)+1)*(cpustate->pf[0x02]+1);
595            LOG( ( "tms7000: Timer adjusted. Prescaler: 0x%2.2x (Cycles per interrupt: %d)\n", cpustate->pf[3] & 0x1f, cpustate->cycles_per_INT2 ) );
439            m_pf[0x03] = data;
440            m_cycles_per_INT2 = 0x10*((m_pf[3] & 0x1f)+1)*(m_pf[0x02]+1);
441            LOG( ( "tms7000: Timer adjusted. Prescaler: 0x%2.2x (Cycles per interrupt: %d)\n", m_pf[3] & 0x1f, m_cycles_per_INT2 ) );
596442         }
597443         break;
598444
r26878r26879
601447         break;
602448
603449      case 0x06: /* Port B write */
604         cpustate->io->write_byte( TMS7000_PORTB, data );
605         cpustate->pf[ 0x06 ] = data;
450         m_io->write_byte( TMS7000_PORTB, data );
451         m_pf[ 0x06 ] = data;
606452         break;
607453
608454      case 0x08: /* Port C write */
609         temp1 = data & cpustate->pf[ 0x09 ];    /* Mask off input bits */
610         cpustate->io->write_byte( TMS7000_PORTC, temp1 );
611         cpustate->pf[ 0x08 ] = temp1;
455         temp1 = data & m_pf[ 0x09 ];    /* Mask off input bits */
456         m_io->write_byte( TMS7000_PORTC, temp1 );
457         m_pf[ 0x08 ] = temp1;
612458         break;
613459
614460      case 0x0a: /* Port D write */
615         temp1 = data & cpustate->pf[ 0x0b ];    /* Mask off input bits */
616         cpustate->io->write_byte( TMS7000_PORTD, temp1 );
617         cpustate->pf[ 0x0a ] = temp1;
461         temp1 = data & m_pf[ 0x0b ];    /* Mask off input bits */
462         m_io->write_byte( TMS7000_PORTD, temp1 );
463         m_pf[ 0x0a ] = temp1;
618464         break;
619465
620466      default:
621467         /* Just stuff the other registers */
622         cpustate->pf[ offset ] = data;
468         m_pf[ offset ] = data;
623469         break;
624470   }
625471}
626472
627static READ8_HANDLER( tms70x0_pf_r )    /* Perpherial file read */
473READ8_MEMBER( tms7000_device::tms70x0_pf_r )    /* Perpherial file read */
628474{
629   tms7000_state *cpustate = get_safe_token(&space.device());
630475   UINT8 result;
631476   UINT8   temp1, temp2, temp3;
632477
633478   switch( offset )
634479   {
635480      case 0x00:  /* IOCNT0, Input/Ouput control */
636         result = cpustate->pf[0x00];
637         if (cpustate->irq_state[TMS7000_IRQ1_LINE] == ASSERT_LINE)
481         result = m_pf[0x00];
482         if (m_irq_state[TMS7000_IRQ1_LINE] == ASSERT_LINE)
638483            result |= 0x02;
639         if (cpustate->irq_state[TMS7000_IRQ3_LINE] == ASSERT_LINE)
484         if (m_irq_state[TMS7000_IRQ3_LINE] == ASSERT_LINE)
640485            result |= 0x20;
641486         break;
642487
643488      case 0x02:  /* T1DATA, timer 1 8-bit decrementer */
644         result = (cpustate->t1_decrementer & 0x00ff);
489         result = (m_t1_decrementer & 0x00ff);
645490         break;
646491
647492      case 0x03:  /* T1CTL, timer 1 capture (latched by INT3) */
648         result = cpustate->t1_capture_latch;
493         result = m_t1_capture_latch;
649494         break;
650495
651496      case 0x04: /* Port A read */
652         result = cpustate->io->read_byte( TMS7000_PORTA );
497         result = m_io->read_byte( TMS7000_PORTA );
653498         break;
654499
655500
656501      case 0x06: /* Port B read */
657502         /* Port B is write only, return a previous written value */
658         result = cpustate->pf[ 0x06 ];
503         result = m_pf[ 0x06 ];
659504         break;
660505
661506      case 0x08: /* Port C read */
662         temp1 = cpustate->pf[ 0x08 ] & cpustate->pf[ 0x09 ];    /* Get previous output bits */
663         temp2 = cpustate->io->read_byte( TMS7000_PORTC );           /* Read port */
664         temp3 = temp2 & (~cpustate->pf[ 0x09 ]);                /* Mask off output bits */
507         temp1 = m_pf[ 0x08 ] & m_pf[ 0x09 ];    /* Get previous output bits */
508         temp2 = m_io->read_byte( TMS7000_PORTC );           /* Read port */
509         temp3 = temp2 & (~m_pf[ 0x09 ]);                /* Mask off output bits */
665510         result = temp1 | temp3;                             /* OR together */
666511         break;
667512
668513      case 0x0a: /* Port D read */
669         temp1 = cpustate->pf[ 0x0a ] & cpustate->pf[ 0x0b ];    /* Get previous output bits */
670         temp2 = cpustate->io->read_byte( TMS7000_PORTD );           /* Read port */
671         temp3 = temp2 & (~cpustate->pf[ 0x0b ]);                /* Mask off output bits */
514         temp1 = m_pf[ 0x0a ] & m_pf[ 0x0b ];    /* Get previous output bits */
515         temp2 = m_io->read_byte( TMS7000_PORTD );           /* Read port */
516         temp3 = temp2 & (~m_pf[ 0x0b ]);                /* Mask off output bits */
672517         result = temp1 | temp3;                             /* OR together */
673518         break;
674519
675520      default:
676521         /* Just unstuff the other registers */
677         result = cpustate->pf[ offset ];
522         result = m_pf[ offset ];
678523         break;
679524   }
680525
r26878r26879
682527}
683528
684529// BCD arthrimetic handling
685static UINT16 bcd_add( UINT16 a, UINT16 b )
530UINT16 tms7000_device::bcd_add( UINT16 a, UINT16 b )
686531{
687532   UINT16  t1,t2,t3,t4,t5,t6;
688533
r26878r26879
696541   return t2-t6;
697542}
698543
699static UINT16 bcd_tencomp( UINT16 a )
544UINT16 tms7000_device::bcd_tencomp( UINT16 a )
700545{
701546   UINT16  t1,t2,t3,t4,t5,t6;
702547
r26878r26879
712557/*
713558    Compute difference a-b???
714559*/
715static UINT16 bcd_sub( UINT16 a, UINT16 b)
560UINT16 tms7000_device::bcd_sub( UINT16 a, UINT16 b)
716561{
717562   //return bcd_tencomp(b) - bcd_tencomp(a);
718563   return bcd_add(a, bcd_tencomp(b) & 0xff);
719564}
720565
721static WRITE8_HANDLER( tms7000_internal_w ) {
722   tms7000_state *cpustate = get_safe_token(&space.device());
723   cpustate->rf[ offset ] = data;
566WRITE8_MEMBER( tms7000_device::tms7000_internal_w )
567{
568   m_rf[ offset ] = data;
724569}
725570
726static READ8_HANDLER( tms7000_internal_r ) {
727   tms7000_state *cpustate = get_safe_token(&space.device());
728   return cpustate->rf[ offset ];
571READ8_MEMBER( tms7000_device::tms7000_internal_r )
572{
573   return m_rf[ offset ];
729574}
730575
731DEFINE_LEGACY_CPU_DEVICE(TMS7000, tms7000);
732DEFINE_LEGACY_CPU_DEVICE(TMS7000_EXL, tms7000_exl);

Previous 199869 Revisions Next


© 1997-2024 The MAME Team