Previous 199869 Revisions Next

r34771 Saturday 31st January, 2015 at 21:42:01 UTC by hap
s2000 fix a couple of bugs
[src/emu/cpu/amis2000]amis2000.c amis2000.h amis2000op.inc
[src/mess/drivers]wildfire.c

trunk/src/emu/cpu/amis2000/amis2000.c
r243282r243283
55  American Microsystems, Inc.(AMI) S2000-family 4-bit MCU cores, introduced late 1970s
66 
77  TODO:
8  - bug(s)? - MESS wildfire.c doesn't work yet
89  - unemulated opcodes (need more testing material)
910  - support external program map
1011  - add 50/60hz timer
r243282r243283
2526
2627// internal memory maps
2728static ADDRESS_MAP_START(program_1k, AS_PROGRAM, 8, amis2000_device)
28   AM_RANGE(0x0000, 0x03ff) AM_ROM AM_MIRROR(0x1c00)
29   AM_RANGE(0x0000, 0x03ff) AM_ROM
2930ADDRESS_MAP_END
3031
3132static ADDRESS_MAP_START(program_1_5k, AS_PROGRAM, 8, amis2000_device)
32   AM_RANGE(0x0000, 0x03ff) AM_ROM AM_MIRROR(0x1800)
33   AM_RANGE(0x0400, 0x05ff) AM_ROM AM_MIRROR(0x1a00)
33   AM_RANGE(0x0000, 0x03ff) AM_ROM
34   AM_RANGE(0x0400, 0x05ff) AM_ROM AM_MIRROR(0x200)
3435ADDRESS_MAP_END
3536
3637
r243282r243283
116117enum
117118{
118119   S2000_PC=1, S2000_BL, S2000_BU,
119   S2000_ACC, S2000_E, S2000_CARRY
120   S2000_ACC, S2000_E, S2000_CY
120121};
121122
122123void amis2000_device::device_start()
r243282r243283
138139   m_pc = 0;
139140   m_ppr = 0;
140141   m_pbr = 0;
141   m_pp_index = 0;
142142   m_skip = false;
143143   m_op = 0;
144   m_prev_op = 0;
144145   m_f = 0;
145146   m_carry = 0;
146147   m_bl = 0;
r243282r243283
157158   save_item(NAME(m_pc));
158159   save_item(NAME(m_ppr));
159160   save_item(NAME(m_pbr));
160   save_item(NAME(m_pp_index));
161161   save_item(NAME(m_skip));
162162   save_item(NAME(m_op));
163   save_item(NAME(m_prev_op));
163164   save_item(NAME(m_f));
164165   save_item(NAME(m_carry));
165166   save_item(NAME(m_bl));
r243282r243283
177178   state_add(S2000_BU,     "BU",     m_bu    ).formatstr("%01X");
178179   state_add(S2000_ACC,    "ACC",    m_acc   ).formatstr("%01X");
179180   state_add(S2000_E,      "E",      m_e     ).formatstr("%01X");
180   state_add(S2000_CARRY,  "CARRY",  m_carry ).formatstr("%01X");
181   state_add(S2000_CY,     "CY",     m_carry ).formatstr("%01X");
181182
182183   state_add(STATE_GENPC, "curpc", m_pc).formatstr("%04X").noshow();
183184   state_add(STATE_GENFLAGS, "GENFLAGS", m_f).formatstr("%6s").noshow();
r243282r243283
218219   {
219220      m_icount--;
220221     
221      // increase PP prefix count
222      if ((m_op & 0xf0) == 0x60)
223      {
224         if (m_pp_index < 2)
225            m_pp_index++;
226      }
227      else
228         m_pp_index = 0;
222      // remember previous opcode
223      m_prev_op = m_op;
229224
230225      debugger_instruction_hook(this, m_pc);
231226      m_op = m_program->read_byte(m_pc);
trunk/src/emu/cpu/amis2000/amis2000.h
r243282r243283
8080   UINT16 m_pc;                // 13-bit program counter
8181   UINT8 m_ppr;                // prepared page register (PP 1)
8282   UINT8 m_pbr;                // prepared bank register (PP 2)
83   UINT8 m_pp_index;           // number of handled PP prefixes
8483   bool m_skip;                // skip next opcode, including PP prefixes
8584   UINT8 m_op;
85   UINT8 m_prev_op;            // previous opcode, needed for PP, LAI, LB*
8686   UINT8 m_f;                  // generic flags: 2 on 2000/2150, 6 on 2200/2400
8787   UINT8 m_carry;              // carry flag
8888   UINT8 m_bl;                 // 4-bit ram index x
trunk/src/emu/cpu/amis2000/amis2000op.inc
r243282r243283
44
55UINT8 amis2000_device::ram_r()
66{
7   UINT16 address = m_bu << m_bu_bits | m_bl;
7   UINT16 address = m_bu << 4 | m_bl;
88   return m_data->read_byte(address) & 0xf;
99}
1010
1111void amis2000_device::ram_w(UINT8 data)
1212{
13   UINT16 address = m_bu << m_bu_bits | m_bl;
13   UINT16 address = m_bu << 4 | m_bl;
1414   m_data->write_byte(address, data & 0xf);
1515}
1616
r243282r243283
4444void amis2000_device::op_lai()
4545{
4646   // LAI X: load ACC with X, select I and K inputs
47   UINT8 param = m_op & 0x0f;
48   m_acc = param;
49   m_i = m_read_i(0, 0xff) & param;
50   m_k = m_read_k(0, 0xff) & param;
47   // note: only execute the first one in a sequence of LAI
48   if ((m_prev_op & 0xf0) != (m_op & 0xf0))
49   {
50      UINT8 param = m_op & 0x0f;
51      m_acc = param;
52      m_i = m_read_i(0, 0xff) & param;
53      m_k = m_read_k(0, 0xff) & param;
54   }
5155}
5256
5357void amis2000_device::op_lab()
r243282r243283
8993void amis2000_device::op_lbe()
9094{
9195   // LBE Y: load BU with Y, load BL with E
92   UINT8 param = m_op & 0x03;
93   m_bu = param & m_bu_mask;
94   m_bl = m_e;
96   // note: only execute the first one in a sequence of LB*
97   if ((m_prev_op & 0xf0) != (m_op & 0xf0))
98   {
99      UINT8 param = m_op & 0x03;
100      m_bu = param & m_bu_mask;
101      m_bl = m_e;
102   }
95103}
96104
97105void amis2000_device::op_lbep()
98106{
99107   // LBEP Y: load BU with Y, load BL with E+1
100   UINT8 param = m_op & 0x03;
101   m_bu = param & m_bu_mask;
102   m_bl = m_e + 1;
108   // note: only execute the first one in a sequence of LB*
109   if ((m_prev_op & 0xf0) != (m_op & 0xf0))
110   {
111      UINT8 param = m_op & 0x03;
112      m_bu = param & m_bu_mask;
113      m_bl = m_e + 1;
114   }
103115}
104116
105117void amis2000_device::op_lbz()
106118{
107119   // LBZ Y: load BU with Y, load BL with 0
108   UINT8 param = m_op & 0x03;
109   m_bu = param & m_bu_mask;
110   m_bl = 0;
120   // note: only execute the first one in a sequence of LB*
121   if ((m_prev_op & 0xf0) != (m_op & 0xf0))
122   {
123      UINT8 param = m_op & 0x03;
124      m_bu = param & m_bu_mask;
125      m_bl = 0;
126   }
111127}
112128
113129void amis2000_device::op_lbf()
114130{
115131   // LBF Y: load BU with Y, load BL with 15
116   UINT8 param = m_op & 0x03;
117   m_bu = param & m_bu_mask;
118   m_bl = 0xf;
132   // note: only execute the first one in a sequence of LB*
133   if ((m_prev_op & 0xf0) != (m_op & 0xf0))
134   {
135      UINT8 param = m_op & 0x03;
136      m_bu = param & m_bu_mask;
137      m_bl = 0xf;
138   }
119139}
120140
121141
r243282r243283
279299{
280300   // PP _X: prepare page/bank with _X
281301   UINT8 param = ~m_op & 0x0f;
282   if (m_pp_index == 0)
302   if ((m_prev_op & 0xf0) != (m_op & 0xf0))
283303      m_ppr = param;
284304   else
285305      m_pbr = param & 7;
r243282r243283
290310   // JMP X: jump to X(+PP)
291311   UINT16 mask = 0x3f;
292312   UINT16 param = m_op & mask;
293   if (m_pp_index > 0)
313   
314   // if previous opcode was PP, change PC high bits too
315   if ((m_prev_op & 0xf0) == 0x60)
294316   {
295      param |= m_ppr << 6;
296      mask |= 0x3c0;
317      param |= (m_ppr << 6) | (m_pbr << 10);
318      mask = 0x1fff;
297319   }
298   if (m_pp_index > 1)
299   {
300      param |= m_pbr << 10;
301      mask |= 0x1c00;
302   }
303320   m_pc = (m_pc & ~mask) | param;
304321}
305322
r243282r243283
308325   // JMS X: call to X(+PP)
309326   m_icount--;
310327   push_callstack();
311   if (m_pp_index == 0)
312   {
313      // subroutines default location is page 15
314      m_ppr = 0xf;
315      m_pp_index++;
316   }
317328   op_jmp();
329
330   // subroutines default location is page 15
331   if ((m_prev_op & 0xf0) != 0x60)
332      m_pc |= 0x3c0;
318333}
319334
320335void amis2000_device::op_rt()
r243282r243283
384399void amis2000_device::op_tf1()
385400{
386401   // TF1: skip next on flag 1
387   m_skip = (m_f & 0x01);
402   m_skip = (m_f & 0x01) ? true : false;
388403}
389404
390405void amis2000_device::op_tf2()
391406{
392407   // TF2: skip next on flag 2
393   m_skip = (m_f & 0x02);
408   m_skip = (m_f & 0x02) ? true : false;
394409}
395410
396411
trunk/src/mess/drivers/wildfire.c
r243282r243283
3131   required_device<cpu_device> m_maincpu;
3232   required_device<speaker_sound_device> m_speaker;
3333
34   DECLARE_WRITE8_MEMBER(write_d);
35   DECLARE_WRITE16_MEMBER(write_a);
36
3437   virtual void machine_start();
3538};
3639
r243282r243283
4144
4245***************************************************************************/
4346
44//..
47WRITE8_MEMBER(wildfire_state::write_d)
48{
49}
4550
51WRITE16_MEMBER(wildfire_state::write_a)
52{
53}
4654
4755
56
4857/***************************************************************************
4958
5059  Inputs
r243282r243283
5261***************************************************************************/
5362
5463static INPUT_PORTS_START( wildfire )
64   PORT_START("IN1") // I
65   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Shooter Button")
66   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Left Flipper")
67   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Right Flipper")
68   PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED )
5569INPUT_PORTS_END
5670
5771
r243282r243283
7185
7286   /* basic machine hardware */
7387   MCFG_CPU_ADD("maincpu", AMI_S2150, MASTER_CLOCK)
88   MCFG_AMI_S2000_READ_I_CB(IOPORT("IN1"))
89   MCFG_AMI_S2000_WRITE_D_CB(WRITE8(wildfire_state, write_d))
90   MCFG_AMI_S2000_WRITE_A_CB(WRITE16(wildfire_state, write_a))
7491
7592   MCFG_DEFAULT_LAYOUT(layout_wildfire)
7693


Previous 199869 Revisions Next


© 1997-2024 The MAME Team