Previous 199869 Revisions Next

r19380 Friday 7th December, 2012 at 14:39:33 UTC by David Haywood
move some ngcd specific code back into the actual driver (nw)
[src/mame/machine]megacdcd.c megacdcd.h
[src/mess/drivers]ng_aes.c

trunk/src/mess/drivers/ng_aes.c
r19379r19380
107107      NeoCDDMAValue2   = 0;
108108      NeoCDDMACount    = 0;
109109      NeoCDDMAMode = 0;
110      nIRQAcknowledge = ~0;
111      nNeoCDIRQVectorAck = 0;
112      nNeoCDIRQVector = 0;
110113
111114   }
112115
r19379r19380
152155   INT32 NeoCDDMAValue2;
153156   INT32 NeoCDDMACount;
154157   INT32 NeoCDDMAMode;
158   INT32 nIRQAcknowledge;
159   int nNeoCDIRQVectorAck;
160   int nNeoCDIRQVector;
155161
162   int get_nNeoCDIRQVectorAck(void) { return nNeoCDIRQVectorAck; }
163   void set_nNeoCDIRQVectorAck(int val) { nNeoCDIRQVectorAck = val; }
164   int get_nNeoCDIRQVector(void) { return nNeoCDIRQVector; }
165   void NeoCDIRQUpdate(UINT8 byteValue);
166   
167   // from the CDC
168   void interrupt_callback_type1(void);
169   void interrupt_callback_type2(void);
170   void interrupt_callback_type3(void);
171
156172   UINT8 nTransferWriteEnable;
157173
158174   address_space* curr_space;
r19379r19380
323339         break;
324340
325341      case 0x000E:
326         m_tempcdc->NeoCDIRQUpdate(wordValue); // irqack
342         NeoCDIRQUpdate(wordValue); // irqack
327343         break;
328344
329345      case 0x0016:
r19379r19380
447463         break;
448464
449465      case 0x0180: {
450         static UINT8 clara = 0;
451         if (!byteValue && clara) {
452//              bprintf(PRINT_IMPORTANT, _T("  - NGCD CD communication reset (PC: 0x%06X)\n"), SekGetPC(-1));
453//              NeoCDCommsReset();
466         // 1 during CD access, 0 otherwise, written frequently
467         //printf("reset cdc %04x %04x\n",data, mem_mask);
468
469         if (ACCESSING_BITS_0_7)
470         {
471            if (data==0x00)
472            {
473               m_tempcdc->NeoCDCommsReset();
474            }
454475         }
455         clara = byteValue;
456476         break;
457477      }
458478      case 0x0182: {
r19379r19380
15091529
15101530   if (irqline==4)
15111531   {
1512      if (state->m_tempcdc->get_nNeoCDIRQVectorAck()) {
1513         state->m_tempcdc->set_nNeoCDIRQVectorAck(0);
1514         return state->m_tempcdc->get_nNeoCDIRQVector();
1532      if (state->get_nNeoCDIRQVectorAck()) {
1533         state->set_nNeoCDIRQVectorAck(0);
1534         return state->get_nNeoCDIRQVector();
15151535      }
15161536   }
15171537
15181538   return (0x60+irqline*4)/4;
15191539}
15201540
1541void ng_aes_state::interrupt_callback_type1(void)
1542{
1543   nIRQAcknowledge &= ~0x20;
1544   NeoCDIRQUpdate(0);
1545}
15211546
1547void ng_aes_state::interrupt_callback_type2(void)
1548{
1549   nIRQAcknowledge &= ~0x10;
1550   NeoCDIRQUpdate(0);
1551}
15221552
1553void ng_aes_state::interrupt_callback_type3(void)
1554{
1555   nIRQAcknowledge &= ~0x08;
1556   NeoCDIRQUpdate(0);
1557}
1558
1559
1560void ng_aes_state::NeoCDIRQUpdate(UINT8 byteValue)
1561{
1562   // do we also need to check the regular interrupts like FBA?
1563
1564   nIRQAcknowledge |= (byteValue & 0x38);
1565
1566   if ((nIRQAcknowledge & 0x08) == 0) {
1567      nNeoCDIRQVector = 0x17;
1568      nNeoCDIRQVectorAck = 1;
1569      machine().device("maincpu")->execute().set_input_line(4, HOLD_LINE);
1570      return;
1571   }
1572   if ((nIRQAcknowledge & 0x10) == 0) {
1573      nNeoCDIRQVector = 0x16;
1574      nNeoCDIRQVectorAck = 1;
1575      machine().device("maincpu")->execute().set_input_line(4, HOLD_LINE);
1576      return;
1577   }
1578   if ((nIRQAcknowledge & 0x20) == 0) {
1579      nNeoCDIRQVector = 0x15;
1580      nNeoCDIRQVectorAck = 1;
1581      machine().device("maincpu")->execute().set_input_line(4, HOLD_LINE);
1582      return;
1583   }
1584}
1585
15231586struct cdrom_interface neocd_cdrom =
15241587{
15251588   "neocd_cdrom",
r19379r19380
15381601   // temporary until things are cleaned up
15391602   MCFG_DEVICE_ADD("tempcdc", LC89510_TEMP, 0) // cd controller
15401603   MCFG_SEGACD_HACK_SET_NEOCD
1604   MCFG_SET_TYPE1_INTERRUPT_CALLBACK( ng_aes_state, interrupt_callback_type1 )
1605   MCFG_SET_TYPE2_INTERRUPT_CALLBACK( ng_aes_state, interrupt_callback_type2 )
1606   MCFG_SET_TYPE3_INTERRUPT_CALLBACK( ng_aes_state, interrupt_callback_type3 )
15411607
1608
15421609   MCFG_MEMCARD_HANDLER(neogeo_aes)
15431610
15441611   MCFG_MACHINE_START_OVERRIDE(ng_aes_state,neocd)
trunk/src/mame/machine/megacdcd.c
r19379r19380
1414   : device_t(mconfig, LC89510_TEMP, "lc89510_temp_device", tag, owner, clock)
1515{
1616   segacd_dma_callback =  segacd_dma_delegate(FUNC(lc89510_temp_device::Fake_CDC_Do_DMA), this);
17   type1_interrupt_callback =  interrupt_delegate(FUNC(lc89510_temp_device::dummy_interrupt_callback), this);
18   type2_interrupt_callback =  interrupt_delegate(FUNC(lc89510_temp_device::dummy_interrupt_callback), this);
19   type3_interrupt_callback =  interrupt_delegate(FUNC(lc89510_temp_device::dummy_interrupt_callback), this);
20
1721   is_neoCD = false;
1822
1923   nff0002 = 0;
20   nIRQAcknowledge = ~0;
2124   for (int i=0;i<10;i++)
2225      CDD_TX[i] = 0;
2326   for (int i=0;i<10;i++)
r19379r19380
2730   SCD_CURLBA = 0;
2831
2932   CDC_REG0 = 0;
30   nNeoCDIRQVectorAck = 0;
31   nNeoCDIRQVector = 0;
3233}
3334
35void lc89510_temp_device::dummy_interrupt_callback(void)
36{
3437
38}
3539
3640void lc89510_temp_device::set_CDC_Do_DMA(device_t &device,segacd_dma_delegate new_segacd_dma_callback)
3741{
r19379r19380
3943   dev.segacd_dma_callback = new_segacd_dma_callback;
4044}
4145
46void lc89510_temp_device::set_type1_interrupt_callback(device_t &device,interrupt_delegate interrupt_callback)
47{
48   lc89510_temp_device &dev = downcast<lc89510_temp_device &>(device);
49   dev.type1_interrupt_callback = interrupt_callback;
50}
51
52void lc89510_temp_device::set_type2_interrupt_callback(device_t &device,interrupt_delegate interrupt_callback)
53{
54   lc89510_temp_device &dev = downcast<lc89510_temp_device &>(device);
55   dev.type2_interrupt_callback = interrupt_callback;
56}
57
58void lc89510_temp_device::set_type3_interrupt_callback(device_t &device,interrupt_delegate interrupt_callback)
59{
60   lc89510_temp_device &dev = downcast<lc89510_temp_device &>(device);
61   dev.type3_interrupt_callback = interrupt_callback;
62}
63
4264void lc89510_temp_device::set_is_neoCD(device_t &device, bool is_neoCD)
4365{
4466   lc89510_temp_device &dev = downcast<lc89510_temp_device &>(device);
r19379r19380
5476void lc89510_temp_device::device_start()
5577{
5678   segacd_dma_callback.bind_relative_to(*owner());
79   type1_interrupt_callback.bind_relative_to(*owner());
80   type2_interrupt_callback.bind_relative_to(*owner());
81   type3_interrupt_callback.bind_relative_to(*owner());
82
5783   m_cdda = (cdda_device*)subdevice("cdda");
5884}
5985
r19379r19380
10191045   {
10201046      if (nff0002 & 0x0050)
10211047      {
1022         nIRQAcknowledge &= ~0x10;
1023         NeoCDIRQUpdate(0);
1048         type2_interrupt_callback();
10241049      }
10251050   }
10261051
r19379r19380
11921217   if (LC8951RegistersW[REG_W_IFCTRL] & 0x20)
11931218   {
11941219   
1195      // todo: handle as interrupt callback
11961220      if (is_neoCD)
11971221      {
1198         nIRQAcknowledge &= ~0x20;
1199         NeoCDIRQUpdate(0);
1222         type1_interrupt_callback();
12001223      }
12011224      else
12021225      {
1226         // todo: make callback
12031227         CHECK_SCD_LV5_INTERRUPT     
12041228      }
12051229
r19379r19380
12931317
12941318
12951319
1296void lc89510_temp_device::NeoCDIRQUpdate(UINT8 byteValue)
1297{
1298   // do we also need to check the regular interrupts like FBA?
12991320
1300   nIRQAcknowledge |= (byteValue & 0x38);
13011321
1302   if ((nIRQAcknowledge & 0x08) == 0) {
1303      nNeoCDIRQVector = 0x17;
1304      nNeoCDIRQVectorAck = 1;
1305      machine().device("maincpu")->execute().set_input_line(4, HOLD_LINE);
1306      return;
1307   }
1308   if ((nIRQAcknowledge & 0x10) == 0) {
1309      nNeoCDIRQVector = 0x16;
1310      nNeoCDIRQVectorAck = 1;
1311      machine().device("maincpu")->execute().set_input_line(4, HOLD_LINE);
1312      return;
1313   }
1314   if ((nIRQAcknowledge & 0x20) == 0) {
1315      nNeoCDIRQVector = 0x15;
1316      nNeoCDIRQVectorAck = 1;
1317      machine().device("maincpu")->execute().set_input_line(4, HOLD_LINE);
1318      return;
1319   }
1320}
1321
13221322void lc89510_temp_device::nff0002_set(UINT16 wordValue)
13231323{
13241324   nff0002 = wordValue;
trunk/src/mame/machine/megacdcd.h
r19379r19380
55
66typedef device_delegate<void (int&, UINT8*, UINT16&, UINT16&)> segacd_dma_delegate;
77
8typedef device_delegate<void (void)> interrupt_delegate;
89
910
1011#define READ_MAIN (0x0200)
r19379r19380
136137#define MCFG_SEGACD_HACK_SET_NEOCD \
137138   lc89510_temp_device::set_is_neoCD(*device, true); \
138139
140#define MCFG_SET_TYPE1_INTERRUPT_CALLBACK( _class, _method) \
141   lc89510_temp_device::set_type1_interrupt_callback(*device, interrupt_delegate(&_class::_method, #_class "::" #_method, NULL, (_class *)0)); \
139142
143#define MCFG_SET_TYPE2_INTERRUPT_CALLBACK( _class, _method) \
144   lc89510_temp_device::set_type2_interrupt_callback(*device, interrupt_delegate(&_class::_method, #_class "::" #_method, NULL, (_class *)0)); \
145
146#define MCFG_SET_TYPE3_INTERRUPT_CALLBACK( _class, _method) \
147   lc89510_temp_device::set_type3_interrupt_callback(*device, interrupt_delegate(&_class::_method, #_class "::" #_method, NULL, (_class *)0)); \
148
140149/* neocd */
141150
142151#define CD_FRAMES_MINUTE (60 * 75)
r19379r19380
156165
157166   // HACK for DMA handling
158167   segacd_dma_delegate segacd_dma_callback;
168   interrupt_delegate type1_interrupt_callback;
169   interrupt_delegate type2_interrupt_callback;
170   interrupt_delegate type3_interrupt_callback;
171
159172   void Fake_CDC_Do_DMA(int &dmacount, UINT8 *CDC_BUFFER, UINT16 &dma_addrc, UINT16 &destination );
160173   static void set_CDC_Do_DMA(device_t &device,segacd_dma_delegate new_segacd_dma_callback);
174   
175   void dummy_interrupt_callback(void);
176   static void set_type1_interrupt_callback(device_t &device,interrupt_delegate interrupt_callback);
177   static void set_type2_interrupt_callback(device_t &device,interrupt_delegate interrupt_callback);
178   static void set_type3_interrupt_callback(device_t &device,interrupt_delegate interrupt_callback);
161179
180
162181   static void set_is_neoCD(device_t &device, bool is_neoCD);
163182
164183
r19379r19380
268287   cdda_device* m_cdda;
269288
270289   /* NeoCD */
271   INT32 nIRQAcknowledge;
272290   UINT16 nff0002;
273291   UINT16 nff0016;
274292
r19379r19380
286304
287305
288306
289   int nNeoCDIRQVectorAck;
290   int get_nNeoCDIRQVectorAck(void) { return nNeoCDIRQVectorAck; }
291   void set_nNeoCDIRQVectorAck(int val) { nNeoCDIRQVectorAck = val; }
292   int nNeoCDIRQVector;
293   int get_nNeoCDIRQVector(void) { return nNeoCDIRQVector; }
294307
295   void NeoCDIRQUpdate(UINT8 byteValue);
296308   void NeoCDCommsControl(UINT8 clock, UINT8 send);
297309   void LC8951UpdateHeader();
298310   char* LC8915InitTransfer(int NeoCDDMACount);

Previous 199869 Revisions Next


© 1997-2024 The MAME Team