Previous 199869 Revisions Next

r19371 Thursday 6th December, 2012 at 22:28:33 UTC by David Haywood
neocd/mcd code reduction (nw)
[src/mame/machine]megacdcd.c megacdcd.h

trunk/src/mame/machine/megacdcd.c
r19370r19371
2323   for (int i=0;i<10;i++)
2424      CDD_RX[i] = 0;
2525   NeoCDCommsWordCount = 0;
26   NeoCDAssyStatus = 0;
26   NeoCD_StatusHack = 0;
2727   SCD_CURLBA = 0;
2828
2929   CDC_REG0 = 0;
r19370r19371
107107      CDD_RX[7] +
108108      CDD_RX[8];
109109
110   if (is_neoCD) checksum += 0x5; // why??
110111   checksum &= 0xf;
111112   checksum ^= 0xf;
112113
113114   CDD_RX[9] = checksum;
114115}
115116
117bool lc89510_temp_device::CDD_Check_TX_Checksum(void)
118{
119   int checksum =
120      CDD_TX[0] +
121      CDD_TX[1] +
122      CDD_TX[2] +
123      CDD_TX[3] +
124      CDD_TX[4] +
125      CDD_TX[5] +
126      CDD_TX[6] +
127      CDD_TX[7] +
128      CDD_TX[8];
129
130   if (is_neoCD) checksum += 0x5; // why??
131   checksum &= 0xf;
132   checksum ^= 0xf;
133
134   if (CDD_TX[9] == checksum)
135      return true;
136
137   return false;
138}
139
116140// converts our 16-bit working regs to 8-bit regs and checksums them
117void lc89510_temp_device::CDD_Export(void)
141void lc89510_temp_device::CDD_Export(bool neocd_hack)
118142{
119   CDD_RX[0] = (CDD_STATUS  & 0xff00)>>8;
143   if (!neocd_hack)
144      CDD_RX[0] = (CDD_STATUS  & 0xff00)>>8;
145   else
146      CDD_RX[0] = NeoCD_StatusHack;
147
120148   CDD_RX[1] = (CDD_STATUS  & 0x00ff)>>0;
121149   CDD_RX[2] = (CDD_MIN  & 0xff00)>>8;
122150   CDD_RX[3] = (CDD_MIN  & 0x00ff)>>0;
r19370r19371
137165
138166
139167
140void lc89510_temp_device::CheckCommand(running_machine& machine)
141{
142   if (CDD_DONE)
143   {
144      CDD_DONE = 0;
145      CDD_Export();
146      CHECK_SCD_LV4_INTERRUPT
147   }
148168
149   if (SCD_READ_ENABLED)
150   {
151      set_data_audio_mode();
152      Read_LBA_To_Buffer(machine);
153   }
154}
155
156
157169void lc89510_temp_device::CDD_GetStatus(void)
158170{
159171   UINT16 s = (CDD_STATUS & 0x0f00);
r19370r19371
173185   cdda_stop_audio( m_cdda ); //stop any pending CD-DA
174186
175187   //neocd
176   NeoCDAssyStatus = 0x0E;
188   NeoCD_StatusHack = 0x0E;
177189
178190
179191}
r19370r19371
340352
341353   // neocd
342354   CDEmuStatus = seeking;
343   NeoCDAssyStatus = 1;
355   NeoCD_StatusHack = 1;
344356
345357}
346358
r19370r19371
372384   cdda_pause_audio( m_cdda, 1 );
373385
374386
375   NeoCDAssyStatus = 4;
387   NeoCD_StatusHack = 4;
376388
377389
378390}
r19370r19371
390402   //if(!(CURRENT_TRACK_IS_DATA))
391403   cdda_pause_audio( m_cdda, 0 );
392404
393   NeoCDAssyStatus = 1;
405   NeoCD_StatusHack = 1;
394406}
395407
396408
r19370r19371
437449   CDD_STATUS = SCD_STATUS;
438450
439451
440   NeoCDAssyStatus = 9;
452   NeoCD_StatusHack = 9;
441453}
442454
443455
r19370r19371
743755   "<undefined> (f)"         // F
744756};
745757
746void lc89510_temp_device::CDD_Import(running_machine& machine)
758bool lc89510_temp_device::CDD_Import(running_machine& machine)
747759{
760   // don't execute the command if the checksum isn't valid
761   if (!CDD_Check_TX_Checksum())
762   {
763      printf("invalid checksum\n");
764      return false;
765   }
766
748767   if(CDD_TX[0] != 2 && CDD_TX[0] != 0)
749768      printf("%s\n",CDD_import_cmdnames[CDD_TX[0]]);
750769
r19370r19371
766785   }
767786
768787   CDD_DONE = 1;
788   return true;
769789}
770790
771791
r19370r19371
9941014{
9951015   if (!is_neoCD)
9961016   {
997      CheckCommand(machine());
1017      if (CDD_DONE)
1018      {
1019         CDD_DONE = 0;
1020         CDD_Export();
1021         CHECK_SCD_LV4_INTERRUPT_A
1022      }
9981023   }
9991024   else
10001025   {
1001      if (nff0002 & 0x0050) {
1026      if (nff0002 & 0x0050)
1027      {
10021028         nIRQAcknowledge &= ~0x10;
10031029         NeoCDIRQUpdate(0);
1004
1005         if (nff0002 & 0x0500) {
1006            Read_LBA_To_Buffer(machine());
1007         }
10081030      }
10091031   }
1032
1033   if (SCD_READ_ENABLED) // if (nff0002 & 0x0050) if (nff0002 & 0x0500);
1034   {
1035      set_data_audio_mode();
1036      Read_LBA_To_Buffer(machine());
1037   }
1038
10101039}
10111040
10121041
r19370r19371
10381067
10391068void lc89510_temp_device::NeoCDCommsReset()
10401069{
1041   bNeoCDCommsSend  = false;
10421070   bNeoCDCommsClock = true;
10431071
10441072   memset(CDD_TX, 0, sizeof(CDD_TX));
r19370r19371
10461074
10471075   NeoCDCommsWordCount = 0;
10481076
1049   NeoCDAssyStatus = 9;
1077   NeoCD_StatusHack = 9;
10501078
10511079
10521080   nff0016 = 0;
10531081}
10541082
10551083
1056void lc89510_temp_device::NeoCDProcessCommand()
1057{
1058   CDD_Import(machine());
1059   CDD_Export();
1060}
10611084
1085
10621086void lc89510_temp_device::NeoCDCommsControl(UINT8 clock, UINT8 send)
10631087{
10641088   if (clock && !bNeoCDCommsClock) {
r19370r19371
10661090      if (NeoCDCommsWordCount >= 10) {
10671091         NeoCDCommsWordCount = 0;
10681092
1069         if (send) {
1093         if (send)
1094         {
1095            if (CDD_TX[0])
1096            {
1097               if (!CDD_Import(machine()))
1098                  return;
10701099
1071            // command receive complete
1072
1073            if (CDD_TX[0]) {
1074               INT32  sum = 0;
1075
1076               //   printf("has command %02x\n", CDD_TX[0]);
1077
1078//                  bprintf(PRINT_NORMAL, _T("  - CD mechanism command receive completed : 0x"));
1079               for (INT32 i = 0; i < 9; i++) {
1080//                      bprintf(PRINT_NORMAL, _T("%X"), CDD_TX[i]);
1081                  sum += CDD_TX[i];
1082               }
1083               sum = ~(sum + 5) & 0x0F;
1084//                  bprintf(PRINT_NORMAL, _T(" (CS 0x%X, %s)\n"), CDD_TX[9], (sum == CDD_TX[9]) ? _T("OK") : _T("NG"));
1085               if (sum == CDD_TX[9]) {
1086
1087               //      printf("request to process command %02x\n", CDD_TX[0]);
1088
1089                  NeoCDProcessCommand();
1090
1091                  if (CDD_TX[0]) {
1092
1093                     if (NeoCDAssyStatus == 1) {
1094                        if (CDEmuGetStatus() == idle) {
1095                           NeoCDAssyStatus = 0x0E;
1096                        }
1097                     }
1098
1099                     CDD_RX[0] = NeoCDAssyStatus;
1100
1101                     // compute checksum
1102
1103                     sum = 0;
1104
1105                     for (INT32 i = 0; i < 9; i++) {
1106                        sum += CDD_RX[i];
1107                     }
1108                     CDD_RX[9] = ~(sum + 5) & 0x0F;
1100               if (NeoCD_StatusHack == 1) {
1101                  if (CDEmuGetStatus() == idle) {
1102                     NeoCD_StatusHack = 0x0E;
11091103                  }
11101104               }
1105
1106               CDD_Export(true); // true == neocd hack,
11111107            }
1112         } else {
11131108
1114            // status send complete
1115
1116//              if (CDD_RX[0] || CDD_RX[1]) {
1117//                  INT32  sum = 0;
1118//
1119//                  bprintf(PRINT_NORMAL, _T("  - CD mechanism status send completed : 0x"));
1120//                  for (INT32 i = 0; i < 9; i++) {
1121//                      bprintf(PRINT_NORMAL, _T("%X"), CDD_RX[i]);
1122//                      sum += CDD_RX[i];
1123//                  }
1124//                  sum = ~(sum + 5) & 0x0F;
1125//                  bprintf(PRINT_NORMAL, _T(" (CS 0x%X, %s)\n"), CDD_RX[9], (sum == CDD_RX[9]) ? _T("OK") : _T("NG"));
1126//              }
1127
1128//              if (NeoCDAssyStatus == 0xE) {
1129//                  NeoCDAssyStatus = 9;
1130//              }
11311109         }
11321110
11331111      }
1134      bNeoCDCommsSend = send;
11351112   }
11361113   bNeoCDCommsClock = clock;
11371114}
trunk/src/mame/machine/megacdcd.h
r19370r19371
113113      machine.device(":segacd:segacd_68k")->execute().set_input_line(4, HOLD_LINE); \
114114   } \
115115
116#define CHECK_SCD_LV4_INTERRUPT_A \
117   if (segacd_irq_mask & 0x10) \
118   { \
119      machine().device(":segacd:segacd_68k")->execute().set_input_line(4, HOLD_LINE); \
120   } \
116121
117122
118123
119
120124#define CURRENT_TRACK_IS_DATA \
121125   (segacd.toc->tracks[SCD_CURTRK - 1].trktype != CD_TRACK_AUDIO) \
122126
r19370r19371
203207   inline int to_bcd(int val, bool byte);
204208   void set_data_audio_mode(void);
205209   void CDD_DoChecksum(void);
206   void CDD_Export(void);
210   bool CDD_Check_TX_Checksum(void);
211   void CDD_Export(bool neocd_hack = false);
207212   void scd_ctrl_checks(running_machine& machine);
208213   void scd_advance_current_readpos(void);
209214   int Read_LBA_To_Buffer(running_machine& machine);
210   void CheckCommand(running_machine& machine);
211215   void CDD_GetStatus(void);
212216   void CDD_Stop(running_machine &machine);
213217   void CDD_GetPos(void);
r19370r19371
238242   void CDC_Reg_w(UINT8 data);
239243   void CDD_Process(running_machine& machine, int reason);
240244   void CDD_Handle_TOC_Commands(void);
241   void CDD_Import(running_machine& machine);
245   bool CDD_Import(running_machine& machine);
242246   READ16_MEMBER( segacd_irq_mask_r );
243247   WRITE16_MEMBER( segacd_irq_mask_w );
244248   READ16_MEMBER( segacd_cdd_ctrl_r );
r19370r19371
274278
275279
276280
277   bool bNeoCDCommsClock, bNeoCDCommsSend;
281   bool bNeoCDCommsClock;
278282
279283   INT32 NeoCDCommsWordCount;
280284
281   INT32 NeoCDAssyStatus;
285   INT32 NeoCD_StatusHack;
282286
283287
284288
r19370r19371
290294
291295   void NeoCDIRQUpdate(UINT8 byteValue);
292296   void NeoCDCommsControl(UINT8 clock, UINT8 send);
293   void NeoCDProcessCommand();
294297   void LC8951UpdateHeader();
295298   char* LC8915InitTransfer(int NeoCDDMACount);
296299   void LC8915EndTransfer();

Previous 199869 Revisions Next


© 1997-2024 The MAME Team