Previous 199869 Revisions Next

r19209 Wednesday 28th November, 2012 at 23:27:47 UTC by Angelo Salese
Emulated the KART, but RISC OS still hangs due of something ...
[src/emu/machine]aakart.c aakart.h
[src/mame/includes]archimds.h
[src/mame/machine]archimds.c
[src/mess/drivers]a310.c

trunk/src/mame/machine/archimds.c
r19208r19209
465465      }
466466
467467      case KART:   // keyboard read
468         //archimedes_request_irq_b(ARCHIMEDES_IRQB_KBD_XMIT_EMPTY);
469468         return m_kart->read(space,0);
470469
471470      case IRQ_STATUS_A:
trunk/src/mame/includes/archimds.h
r19208r19209
6666   DECLARE_WRITE32_MEMBER(archimedes_ioc_w);
6767   DECLARE_READ32_MEMBER(archimedes_vidc_r);
6868   DECLARE_WRITE32_MEMBER(archimedes_vidc_w);
69   DECLARE_WRITE_LINE_MEMBER( a310_kart_rx_w );
70   DECLARE_WRITE_LINE_MEMBER( a310_kart_tx_w );
6971
7072   UINT8 m_i2c_clk;
7173   INT16 m_memc_pages[0x2000];   // the logical RAM area is 32 megs, and the smallest page size is 4k
trunk/src/emu/machine/aakart.c
r19208r19209
22
33Acorn Archimedes KART interface
44
5TODO:
6- FIFO
7
58***************************************************************************/
69
710#include "emu.h"
r19208r19209
1619// device type definition
1720const device_type AAKART = &device_creator<aakart_device>;
1821
22#define HRST 0xff
23#define RAK1 0xfe
24#define RAK2 0xfd
25#define BACK 0x3f
26#define SMAK 0x33   /* keyboard + mouse ack */
27#define MACK 0x32   /* mouse ack */
28#define SACK 0x31   /* keyboard ack */
29#define NACK 0x30   /* no data ack */
30#define RQID 0x20
1931
2032//**************************************************************************
2133//  LIVE DEVICE
r19208r19209
4860
4961void aakart_device::device_start()
5062{
63   m_out_tx_func.resolve(m_out_tx_cb, *this);
64    m_out_rx_func.resolve(m_out_rx_cb, *this);
65   m_rxtimer = timer_alloc(RX_TIMER);
66   m_rxtimer->adjust(attotime::from_hz(clock()), 0, attotime::from_hz(clock()));
67   m_txtimer = timer_alloc(TX_TIMER);
68   m_txtimer->adjust(attotime::from_hz(clock()), 0, attotime::from_hz(clock()));
69   m_mousetimer = timer_alloc(MOUSE_TIMER);
70   m_mousetimer->adjust(attotime::from_hz(clock()), 0, attotime::from_hz(clock()));
71   m_keybtimer = timer_alloc(KEYB_TIMER);
72   m_keybtimer->adjust(attotime::from_hz(clock()), 0, attotime::from_hz(clock()));
73}
5174
75//-------------------------------------------------
76//  device_config_complete - perform any
77//  operations now that the configuration is
78//  complete
79//-------------------------------------------------
80
81void aakart_device::device_config_complete()
82{
83   // inherit a copy of the static data
84   const aakart_interface *intf = reinterpret_cast<const aakart_interface *>(static_config());
85   if (intf != NULL)
86      *static_cast<aakart_interface *>(this) = *intf;
87
88   // or initialize to defaults if none provided
89   else
90   {
91      memset(&m_out_tx_cb, 0, sizeof(m_out_tx_cb));
92      memset(&m_out_rx_cb, 0, sizeof(m_out_rx_cb));
93   }
5294}
5395
54
5596//-------------------------------------------------
5697//  device_reset - device-specific reset
5798//-------------------------------------------------
5899
59100void aakart_device::device_reset()
60101{
102   m_status = STATUS_NORMAL;
103   m_new_command = 0;
104   m_rx = -1;
61105}
62106
107//-------------------------------------------------
108//  device_timer - handler timer events
109//-------------------------------------------------
63110
111void aakart_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
112{
113   #if 0
114   if(id == KEYB_TIMER && m_keyb_enable && m_status == STATUS_NORMAL)
115   {
116      m_new_command |= 2;
117      m_rx_latch = 0xd0 | 0; // keyb scancode (0xd0=up 0xc0=down, bits 3-0 row)
118      m_status = STATUS_KEYUP;
119      //m_ff ^= 1;
120      return;
121   }
122   #endif
123
124   if(id == MOUSE_TIMER && m_mouse_enable && m_status == STATUS_NORMAL)
125   {
126      m_new_command |= 2;
127      m_rx_latch = 0; // mouse X position
128      m_status = STATUS_MOUSE;
129      //m_ff ^= 1;
130      return;
131   }
132
133   if(m_new_command == 0)
134      return;
135
136   if(id == RX_TIMER && m_new_command & 2)
137   {
138      m_out_rx_func(ASSERT_LINE);
139      m_new_command &= ~2;
140      m_rx = m_rx_latch;
141      return;
142   }
143
144   if(id == TX_TIMER && m_new_command & 1)
145   {
146      switch(m_status)
147      {
148         case STATUS_NORMAL:
149         {
150            switch(m_tx_latch)
151            {
152               case 0x00: // set leds
153                  break;
154               case RQID:
155                  m_rx_latch = 0x81; //keyboard ID
156                  break;
157               case SMAK:
158               case MACK:
159               case SACK:
160               case NACK:
161                  if(m_tx_latch & 2) { m_mouse_enable = 1; }
162                  if(m_tx_latch & 1) { m_keyb_enable = 1; }
163                  break;
164               case HRST:
165                  m_rx_latch = HRST;
166                  m_status = STATUS_HRST;
167                  break;
168               default:
169                  //printf("%02x\n",m_tx_latch);
170                  break;
171            }
172            break;
173         }
174         case STATUS_KEYDOWN:
175         {
176            switch(m_tx_latch)
177            {
178               case BACK:
179                  m_rx_latch = 0xc0 | 0; // keyb scancode (0xd0=up 0xc0=down, bits 3-0 col)
180                  m_status = STATUS_NORMAL;
181                  break;
182               case HRST:
183                  m_rx_latch = HRST;
184                  m_status = STATUS_HRST;
185                  break;
186            }
187            break;
188         }
189         case STATUS_KEYUP:
190         {
191            switch(m_tx_latch)
192            {
193               case BACK:
194                  m_rx_latch = 0xd0 | 0; // keyb scancode (0xd0=up 0xc0=down, bits 3-0 col)
195                  m_status = STATUS_NORMAL;
196                  break;
197               case HRST:
198                  m_rx_latch = HRST;
199                  m_status = STATUS_HRST;
200                  break;
201            }
202            break;
203         }
204         case STATUS_MOUSE:
205         {
206            switch(m_tx_latch)
207            {
208               case BACK:
209                  m_rx_latch = 0; // mouse Y
210                  m_status = STATUS_NORMAL;
211                  break;
212               case HRST:
213                  m_rx_latch = HRST;
214                  m_status = STATUS_HRST;
215                  break;
216            }
217            break;
218         }
219         case STATUS_HRST:
220         {
221            switch(m_tx_latch)
222            {
223               case HRST:   { m_rx_latch = HRST; m_keyb_enable = m_mouse_enable = 0; break; }
224               case RAK1:   { m_rx_latch = RAK1; m_keyb_enable = m_mouse_enable = 0; break; }
225               case RAK2:   { m_rx_latch = RAK2; m_status = STATUS_NORMAL; break; }
226            }
227            break;
228         }
229      }
230      m_out_tx_func(ASSERT_LINE);
231      m_new_command &= ~1;
232      m_new_command |= 2;
233   }
234}
235
64236//**************************************************************************
65237//  READ/WRITE HANDLERS
66238//**************************************************************************
67239
68240READ8_MEMBER( aakart_device::read )
69241{
70   return 0;
242   m_out_tx_func(CLEAR_LINE);
243   return m_rx;
71244}
72245
73246WRITE8_MEMBER( aakart_device::write )
74247{
248   if(m_new_command)
249      printf("skip cmd %02x\n",data);
250
251   m_tx_latch = data;
252   m_new_command |= 1;
253   m_out_rx_func(CLEAR_LINE);
75254}
trunk/src/emu/machine/aakart.h
r19208r19209
1515//  INTERFACE CONFIGURATION MACROS
1616//**************************************************************************
1717
18#define MCFG_AAKART_ADD(_tag,_freq) \
18#define MCFG_AAKART_ADD(_tag, _freq, _config) \
1919   MCFG_DEVICE_ADD(_tag, AAKART, _freq) \
20   MCFG_DEVICE_CONFIG(_config) \
2021
22#define AAKART_INTERFACE(name) \
23   const aakart_interface (name) =
2124
25struct aakart_interface
26{
27   devcb_write_line      m_out_tx_cb;
28   devcb_write_line      m_out_rx_cb;
29};
30
31enum{
32   STATUS_NORMAL = 0,
33   STATUS_KEYUP,
34   STATUS_KEYDOWN,
35   STATUS_MOUSE,
36   STATUS_HRST,
37   STATUS_UNDEFINED
38};
39
2240//**************************************************************************
2341//  TYPE DEFINITIONS
2442//**************************************************************************
2543
2644// ======================> aakart_device
2745
28class aakart_device : public device_t
46class aakart_device : public device_t,
47                      public aakart_interface
2948{
3049public:
3150   // construction/destruction
r19208r19209
4059   virtual void device_validity_check(validity_checker &valid) const;
4160   virtual void device_start();
4261   virtual void device_reset();
62   virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);
63   virtual void device_config_complete();
64
65private:
66   static const device_timer_id RX_TIMER = 1;
67   static const device_timer_id TX_TIMER = 2;
68   static const device_timer_id MOUSE_TIMER = 3;
69   static const device_timer_id KEYB_TIMER = 4;
70   emu_timer *         m_rxtimer;
71   emu_timer *         m_txtimer;
72   emu_timer *         m_mousetimer;
73   emu_timer *         m_keybtimer;
74
75   devcb_resolved_write_line   m_out_tx_func;
76   devcb_resolved_write_line   m_out_rx_func;
77   int m_tx_latch, m_rx_latch;
78   int m_rx;
79   int m_new_command;
80   int m_status;
81   int m_mouse_enable;
82   int m_keyb_enable;
4383};
4484
4585
trunk/src/mess/drivers/a310.c
r19208r19209
6262#include "sound/dac.h"
6363#include "includes/archimds.h"
6464#include "machine/i2cmem.h"
65#include "machine/aakart.h"
65//#include "machine/aakart.h"
6666#include "machine/ram.h"
6767
6868
r19208r19209
268268   I2CMEM_SLAVE_ADDRESS, 0, 0x100
269269};
270270
271WRITE_LINE_MEMBER( archimedes_state::a310_kart_tx_w )
272{
273   if(state)
274      archimedes_request_irq_b(ARCHIMEDES_IRQB_KBD_RECV_FULL);
275   else
276      archimedes_clear_irq_b(ARCHIMEDES_IRQB_KBD_RECV_FULL);
277}
278
279WRITE_LINE_MEMBER( archimedes_state::a310_kart_rx_w )
280{
281   if(state)
282      archimedes_request_irq_b(ARCHIMEDES_IRQB_KBD_XMIT_EMPTY);
283   else
284      archimedes_clear_irq_b(ARCHIMEDES_IRQB_KBD_XMIT_EMPTY);
285}
286
287static AAKART_INTERFACE( kart_interface )
288{
289   DEVCB_DRIVER_LINE_MEMBER(archimedes_state, a310_kart_tx_w),
290   DEVCB_DRIVER_LINE_MEMBER(archimedes_state, a310_kart_rx_w)
291};
292
271293static MACHINE_CONFIG_START( a310, a310_state )
272294   /* basic machine hardware */
273295   MCFG_CPU_ADD("maincpu", ARM, 8000000)        /* 8 MHz */
274296   MCFG_CPU_PROGRAM_MAP(a310_mem)
275297
276   MCFG_AAKART_ADD("kart", 8000000) // TODO: frequency
298   MCFG_AAKART_ADD("kart", 8000000/128, kart_interface) // TODO: frequency
277299   MCFG_I2CMEM_ADD("i2cmem",i2cmem_interface)
278300
279301   /* video hardware */

Previous 199869 Revisions Next


© 1997-2024 The MAME Team