Previous 199869 Revisions Next

r34746 Friday 30th January, 2015 at 19:40:00 UTC by hap
added jump opcodes
[src/emu/cpu/amis2000]amis2000.c amis2000.h amis2000op.inc

trunk/src/emu/cpu/amis2000/amis2000.c
r243257r243258
134134   // zerofill
135135   memset(m_callstack, 0, sizeof(m_callstack));
136136   m_pc = 0;
137   m_ppr = 0;
138   m_pbr = 0;
139   m_pp_index = 0;
137140   m_skip = false;
138141   m_op = 0;
139142   m_f = 0;
r243257r243258
148151   // register for savestates
149152   save_item(NAME(m_callstack));
150153   save_item(NAME(m_pc));
154   save_item(NAME(m_ppr));
155   save_item(NAME(m_pbr));
156   save_item(NAME(m_pp_index));
151157   save_item(NAME(m_skip));
152158   save_item(NAME(m_op));
153159   save_item(NAME(m_f));
r243257r243258
182188void amis2000_device::device_reset()
183189{
184190   m_pc = 0;
191   m_skip = false;
192   m_op = 0;
185193}
186194
187195
r243257r243258
197205   while (m_icount > 0)
198206   {
199207      m_icount--;
208     
209      // increase PP prefix count
210      if ((m_op & 0xf0) == 0x60)
211      {
212         if (m_pp_index < 2)
213            m_pp_index++;
214      }
215      else
216         m_pp_index = 0;
200217
201218      debugger_instruction_hook(this, m_pc);
202219      m_op = m_program->read_byte(m_pc);
trunk/src/emu/cpu/amis2000/amis2000.h
r243257r243258
7272   
7373   UINT8 m_bu_bits;
7474   UINT16 m_bu_mask;
75   UINT8 m_callstack_bits;
75   UINT8 m_callstack_bits;     // number of program counter bits held in callstack
7676   UINT16 m_callstack_mask;
7777   UINT8 m_callstack_depth;    // callstack levels: 3 on 2000/2150, 5 on 2200/2400
7878   UINT16 m_callstack[5];      // max 5
7979
80   UINT16 m_pc;
81   bool m_skip;
80   UINT16 m_pc;                // 13-bit program counter
81   UINT8 m_ppr;                // prepared page register (PP 1)
82   UINT8 m_pbr;                // prepared bank register (PP 2)
83   UINT8 m_pp_index;           // number of handled PP prefixes
84   bool m_skip;                // skip next opcode, including PP prefixes
8285   UINT8 m_op;
8386   UINT8 m_f;                  // generic flags: 2 on 2000/2150, 6 on 2200/2400
8487   UINT8 m_carry;              // carry flag
r243257r243258
99102   
100103   UINT8 ram_r();
101104   void ram_w(UINT8 data);
105   void pop_callstack();
106   void push_callstack();
102107   void op_illegal();
103108   
104109   void op_lai();
trunk/src/emu/cpu/amis2000/amis2000op.inc
r243257r243258
1414   m_data->write_byte(address, data & 0xf);
1515}
1616
17void amis2000_device::pop_callstack()
18{
19   m_pc = (m_pc & ~m_callstack_mask) | (m_callstack[0] & m_callstack_mask);
20   for (int i = 0; i < m_callstack_depth-1; i++)
21   {
22      m_callstack[i] = m_callstack[i+1];
23      m_callstack[i+1] = 0;
24   }
25}
26
27void amis2000_device::push_callstack()
28{
29   for (int i = m_callstack_depth-1; i >= 1; i--)
30   {
31      m_callstack[i] = m_callstack[i-1];
32   }
33   m_callstack[0] = m_pc & m_callstack_mask;
34}
35
1736void amis2000_device::op_illegal()
1837{
1938   logerror("%s unknown opcode $%02X at $%04X\n", tag(), m_op, m_pc);
r243257r243258
207226void amis2000_device::op_pp()
208227{
209228   // PP _X: prepare page/bank with _X
210   op_illegal();
229   UINT8 param = ~m_op & 0x0f;
230   if (m_pp_index == 0)
231      m_ppr = param;
232   else
233      m_pbr = param & 7;
211234}
212235
213236void amis2000_device::op_jmp()
214237{
215238   // JMP X: jump to X(+PP)
216   op_illegal();
239   UINT16 mask = 0x3f;
240   UINT16 param = m_op & mask;
241   if (m_pp_index > 0)
242   {
243      param |= m_ppr << 6;
244      mask |= 0x3c0;
245   }
246   if (m_pp_index > 1)
247   {
248      param |= m_pbr << 10;
249      mask |= 0x1c00;
250   }
251   m_pc = (m_pc & ~mask) | param;
217252}
218253
219254void amis2000_device::op_jms()
220255{
221256   // JMS X: call to X(+PP)
222   op_illegal();
257   m_icount--;
258   push_callstack();
259   if (m_pp_index == 0)
260   {
261      // subroutines default location is page 15
262      m_ppr = 0xf;
263      m_pp_index++;
264   }
265   op_jmp();
223266}
224267
225268void amis2000_device::op_rt()
226269{
227270   // RT: return from subroutine
228   op_illegal();
271   pop_callstack();
229272}
230273
231274void amis2000_device::op_rts()
232275{
233276   // RTS: return from subroutine and skip next
234   op_illegal();
277   op_rt();
278   m_skip = true;
235279}
236280
237281void amis2000_device::op_nop()


Previous 199869 Revisions Next


© 1997-2024 The MAME Team