Subversion Repositories pentevo

Rev

Rev 798 | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 798 Rev 800
Line 100... Line 100...
100
#include "z80/op_system.h"
100
#include "z80/op_system.h"
101
 
101
 
102
const u8 MPAG   = 0x00;
102
const u8 MPAG   = 0x00;
103
const u8 MPAGEX = 0x10;
103
const u8 MPAGEX = 0x10;
104
 
104
 
-
 
105
// gs
-
 
106
const u8 VOL1 = 0x06;
-
 
107
const u8 VOL2 = 0x07;
-
 
108
const u8 VOL3 = 0x08;
-
 
109
const u8 VOL4 = 0x09;
-
 
110
 
-
 
111
// nsg
-
 
112
const u8 VOL5 = 0x16;
-
 
113
const u8 VOL6 = 0x17;
-
 
114
const u8 VOL7 = 0x18;
-
 
115
const u8 VOL8 = 0x19;
-
 
116
 
105
const u8 DMA_MOD= 0x1b;
117
const u8 DMA_MOD= 0x1b;
106
const u8 DMA_HAD= 0x1c;
118
const u8 DMA_HAD= 0x1c;
107
const u8 DMA_MAD= 0x1d;
119
const u8 DMA_MAD= 0x1d;
108
const u8 DMA_LAD= 0x1e;
120
const u8 DMA_LAD= 0x1e;
109
const u8 DMA_CST= 0x1f;
121
const u8 DMA_CST= 0x1f;
Line 112... Line 124...
112
 
124
 
113
const u8 M_NOROM = 1;
125
const u8 M_NOROM = 1;
114
const u8 M_RAMRO = 2;
126
const u8 M_RAMRO = 2;
115
const u8 M_EXPAG = 8;
127
const u8 M_EXPAG = 8;
116
 
128
 
-
 
129
const u8 M_8CHANS = 0x04;
-
 
130
const u8 M_PAN4CH = 0x40;
-
 
131
 
117
static u8 *gsbankr[4] = { ROM_GS_M, GSRAM_M + 3 * PAGE, ROM_GS_M, ROM_GS_M + PAGE }; // bank pointers for read
132
static u8 *gsbankr[4] = { ROM_GS_M, GSRAM_M + 3 * PAGE, ROM_GS_M, ROM_GS_M + PAGE }; // bank pointers for read
118
static u8 *gsbankw[4] = { TRASH_M, GSRAM_M + 3 * PAGE, TRASH_M, TRASH_M }; // bank pointers for write
133
static u8 *gsbankw[4] = { TRASH_M, GSRAM_M + 3 * PAGE, TRASH_M, TRASH_M }; // bank pointers for write
119
 
134
 
120
static unsigned gs_v[4];
135
static unsigned gs_v[8];
121
static unsigned char gsvol[4], gsbyte[4];
136
static unsigned char gsvol[8], gsbyte[8]{ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80 };
122
static unsigned led_gssum[4], led_gscnt[4];
-
 
123
static unsigned char gsdata_in, gsdata_out, gspage = 0;
137
static unsigned char gsdata_in, gsdata_out, gspage = 0;
124
static unsigned char gscmd, gsstat;
138
static unsigned char gscmd, gsstat;
125
 
139
 
-
 
140
static bool GsSilent = false; // ╧Ёшчэръ эєыхтющ уЁюьъюёЄш тю тёхї ърэрырї
-
 
141
 
126
static unsigned long long mult_gs, mult_gs2;
142
static unsigned long long mult_gs, mult_gs2;
127
 
143
 
128
// ngs
144
// ngs
129
static u8 ngs_mode_pg1; // page ex number
145
static u8 ngs_mode_pg1; // page ex number
130
static u8 ngs_cfg0;
146
static u8 ngs_cfg0;
131
static u8 ngs_s_ctrl;
147
static u8 ngs_s_ctrl;
132
static u8 ngs_s_stat;
148
static u8 ngs_s_stat;
133
static u8 SdRdVal, SdRdValNew;
149
static u8 SdRdVal, SdRdValNew;
134
static u8 ngs_dmamod;
150
static u8 ngs_dmamod;
135
 
151
 
-
 
152
static u8 ngs_chn_mask = 3;
-
 
153
static int vol_div = 256;
136
 
154
 
137
static bool SdDataAvail = false;
155
static bool SdDataAvail = false;
138
 
156
 
139
const unsigned GSINTFQ = 37500; // hz
157
const unsigned GSINTFQ = 37500; // hz
140
static unsigned GSCPUFQI;
158
static unsigned GSCPUFQI;
Line 160... Line 178...
160
 
178
 
161
  unsigned l,r;         //!psb
179
  unsigned l,r;         //!psb
162
  l = gs_v[0] + gs_v[1];    //!psb
180
  l = gs_v[0] + gs_v[1];    //!psb
163
  r = gs_v[2] + gs_v[3];    //!psb
181
  r = gs_v[2] + gs_v[3];    //!psb
164
 
182
 
-
 
183
  // ngs 8ch
-
 
184
  if(ngs_cfg0 & M_8CHANS)
-
 
185
  {
-
 
186
      l += gs_v[4] + gs_v[5];
165
//   sound.update(gscpu.t + (unsigned) (gs_t_states - gscpu_t_at_frame_start), gs_v[0] + gs_v[1], gs_v[2] + gs_v[3]);
187
      r += gs_v[6] + gs_v[7];
-
 
188
  }
-
 
189
 
166
   unsigned lv, rv;
190
   unsigned lv, rv;
167
   lv = (l + r/2) / 2;
191
   lv = (l + r/2) / 2;
168
   rv = (r + l/2) / 2;
192
   rv = (r + l/2) / 2;
169
 
193
 
170
/*
194
/*
Line 177... Line 201...
177
*/
201
*/
178
 
202
 
179
//   assert(gs_t_states >= gscpu_t_at_frame_start);
203
//   assert(gs_t_states >= gscpu_t_at_frame_start);
180
 
204
 
181
   sound.update(unsigned((gs_t_states + gscpu.t) - gscpu_t_at_frame_start), lv, rv);     //!psb
205
   sound.update(unsigned((gs_t_states + gscpu.t) - gscpu_t_at_frame_start), lv, rv);     //!psb
182
 
-
 
183
   for (int ch = 0; ch < 4; ch++)
-
 
184
   {
-
 
185
      gsleds[ch].level = led_gssum[ch] * gsvol[ch] / (led_gscnt[ch]*(0x100*0x40/16)+1);
-
 
186
      led_gssum[ch] = led_gscnt[ch] = 0;
-
 
187
      gsleds[ch].attrib = 0x0F;
-
 
188
   }
-
 
189
}
206
}
190
 
207
 
191
void init_gs_frame()
208
void init_gs_frame()
192
{
209
{
193
//   printf("%s, gs_t_states = %lld, gscpu.t = %u\n", __FUNCTION__, gs_t_states, gscpu.t);
210
//   printf("%s, gs_t_states = %lld, gscpu.t = %u\n", __FUNCTION__, gs_t_states, gscpu.t);
Line 203... Line 220...
203
/*   printf("%s, gs_t_states = %lld, gscpu_t_at_frame_start = %lld, gscpu.t = %u, t = %lld\n",
220
/*   printf("%s, gs_t_states = %lld, gscpu_t_at_frame_start = %lld, gscpu.t = %u, t = %lld\n",
204
       __FUNCTION__, gs_t_states, gscpu_t_at_frame_start, gscpu.t,
221
       __FUNCTION__, gs_t_states, gscpu_t_at_frame_start, gscpu.t,
205
       ((gs_t_states + gscpu.t)  - gscpu_t_at_frame_start));
222
       ((gs_t_states + gscpu.t)  - gscpu_t_at_frame_start));
206
*/
223
*/
207
   sound.end_frame(unsigned((gs_t_states + gscpu.t) - gscpu_t_at_frame_start));
224
   sound.end_frame(unsigned((gs_t_states + gscpu.t) - gscpu_t_at_frame_start));
-
 
225
 
-
 
226
   for(int ch = 0; ch < 8; ch++)
-
 
227
   {
-
 
228
       gsleds[ch].level = abs(int(gsbyte[ch] - 0x80) * gsvol[ch]) / ((128 * 63) / 15);
-
 
229
       gsleds[ch].attrib = 0x0F;
-
 
230
   }
208
}
231
}
209
 
232
 
210
void out_gs(unsigned port, u8 val)
233
void out_gs(unsigned port, u8 val)
211
{
234
{
212
   port &= 0xFF;
235
   port &= 0xFF;
Line 255... Line 278...
255
   return 0xFF;
278
   return 0xFF;
256
}
279
}
257
 
280
 
258
static void gs_byte_to_dac(unsigned addr, unsigned char byte)
281
static void gs_byte_to_dac(unsigned addr, unsigned char byte)
259
{
282
{
-
 
283
    if(GsSilent)
-
 
284
    {
-
 
285
        return;
-
 
286
    }
-
 
287
 
260
   flush_gs_sound();
288
   flush_gs_sound();
261
   unsigned chan = (addr>>8) & 3;
289
   unsigned chan = (addr>>8) & ngs_chn_mask;
262
   gsbyte[chan] = byte;
290
   gsbyte[chan] = byte;
263
//   gs_v[chan] = (gsbyte[chan] * gs_vfx[gsvol[chan]]) >> 8;
291
//   gs_v[chan] = (gsbyte[chan] * gs_vfx[gsvol[chan]]) >> 8;
264
   gs_v[chan] = unsigned(((signed char)(gsbyte[chan]-0x80) * (signed)gs_vfx[gsvol[chan]]) /256 + int(gs_vfx[33])); //!psb
292
   gs_v[chan] = unsigned(((signed char)(gsbyte[chan]-0x80) * (signed)gs_vfx[gsvol[chan]]) / vol_div + int(gs_vfx[33])); //!psb
265
   led_gssum[chan] += byte;
-
 
266
   led_gscnt[chan]++;
-
 
267
}
293
}
268
 
294
 
269
static inline void stepi();
295
static inline void stepi();
270
 
296
 
271
Z80INLINE u8 *am_r(u32 addr)
297
Z80INLINE u8 *am_r(u32 addr)
Line 363... Line 389...
363
         return;
389
         return;
364
      }
390
      }
365
      case 0x02: gsstat &= 0x7F; return;
391
      case 0x02: gsstat &= 0x7F; return;
366
      case 0x03: gsstat |= 0x80; gsdata_in = val; return;
392
      case 0x03: gsstat |= 0x80; gsdata_in = val; return;
367
      case 0x05: gsstat &= 0xFE; return;
393
      case 0x05: gsstat &= 0xFE; return;
-
 
394
 
-
 
395
      case VOL1: case VOL2: case VOL3: case VOL4:
368
      case 0x06: case 0x07: case 0x08: case 0x09:
396
      case VOL5: case VOL6: case VOL7: case VOL8:
-
 
397
      {
-
 
398
         if((port & 0x10) && !(ngs_cfg0 & (M_8CHANS | M_PAN4CH)))
-
 
399
         {
-
 
400
             return;
-
 
401
         }
-
 
402
 
-
 
403
         val &= 0x3F;
-
 
404
 
-
 
405
         if(GsSilent && val == 0)
369
      {
406
         {
-
 
407
             return;
-
 
408
         }
-
 
409
 
370
         flush_gs_sound();
410
         flush_gs_sound();
371
         unsigned chan = (port & 0x0F)-6; val &= 0x3F;
411
         unsigned chan = ((port & 0x10) >> 2U) + (port & 0x0F)-6;
372
         gsvol[chan] = val;
412
         gsvol[chan] = val;
-
 
413
 
-
 
414
         auto Chans = (ngs_cfg0 & M_8CHANS) ? 8 : 4;
-
 
415
 
-
 
416
         auto Silent = true;
-
 
417
         for(auto Ch = 0; Ch < Chans; Ch++)
-
 
418
         {
-
 
419
             if(gsvol[Ch] != 0)
-
 
420
             {
-
 
421
                 Silent = false;
-
 
422
                 break;
-
 
423
             }
-
 
424
         }
-
 
425
 
-
 
426
         GsSilent = Silent;
-
 
427
 
373
//         gs_v[chan] = (gsbyte[chan] * gs_vfx[gsvol[chan]]) >> 8;
428
//         gs_v[chan] = (gsbyte[chan] * gs_vfx[gsvol[chan]]) >> 8;
374
         gs_v[chan] = unsigned(((signed char)(gsbyte[chan]-0x80) * (signed)gs_vfx[gsvol[chan]]) /256 + int(gs_vfx[33])); //!psb
429
         gs_v[chan] = unsigned(((signed char)(gsbyte[chan]-0x80) * (signed)gs_vfx[gsvol[chan]]) /vol_div + int(gs_vfx[33])); //!psb
375
         return;
430
         return;
376
      }
431
      }
377
      case 0x0A: gsstat = u8((gsstat & 0x7F) | (gspage << 7)); return;
432
      case 0x0A: gsstat = u8((gsstat & 0x7F) | (gspage << 7)); return;
378
      case 0x0B: gsstat = u8((gsstat & 0xFE) | ((gsvol[0] >> 5) & 1)); return;
433
      case 0x0B: gsstat = u8((gsstat & 0xFE) | ((gsvol[0] >> 5) & 1)); return;
379
 
434
 
Line 385... Line 440...
385
   {
440
   {
386
      case GSCFG0:
441
      case GSCFG0:
387
      {
442
      {
388
          ngs_cfg0 = val & 0x3F;
443
          ngs_cfg0 = val & 0x3F;
389
//          printf(__FUNCTION__"->GSCFG0, %X, Ro=%d, NoRom=%d, Ext=%d\n", ngs_cfg0, RamRo, NoRom, ExtMem);
444
//          printf(__FUNCTION__"->GSCFG0, %X, Ro=%d, NoRom=%d, Ext=%d\n", ngs_cfg0, RamRo, NoRom, ExtMem);
-
 
445
 
-
 
446
          if(ngs_cfg0 & M_8CHANS)
-
 
447
          {
-
 
448
              ngs_chn_mask = 0x7;
-
 
449
              vol_div = 512;
-
 
450
          }
-
 
451
          else
-
 
452
          {
-
 
453
              ngs_chn_mask = 0x3;
-
 
454
              vol_div = 256;
-
 
455
          }
390
          UpdateMemMapping();
456
          UpdateMemMapping();
391
      }
457
      }
392
      break;
458
      break;
393
 
459
 
394
      case MPAGEX:
460
      case MPAGEX:
Line 583... Line 649...
583
   ngs_s_ctrl = u8(u8(rdtsc() & ~0xFU) | _SDNCS);
649
   ngs_s_ctrl = u8(u8(rdtsc() & ~0xFU) | _SDNCS);
584
   SdRdVal = SdRdValNew = 0xFF;
650
   SdRdVal = SdRdValNew = 0xFF;
585
   SdDataAvail = false;
651
   SdDataAvail = false;
586
   Vs1001.Reset();
652
   Vs1001.Reset();
587
 
653
 
-
 
654
   for(unsigned i = 0; i < 8; i++)
-
 
655
   {
-
 
656
       gsbyte[i] = 0x80;
-
 
657
       gsvol[i] = 0;
-
 
658
       gs_v[i] = 0;
-
 
659
   }
-
 
660
 
588
   ngs_mode_pg1 = 1;
661
   ngs_mode_pg1 = 1;
589
   ngs_dmamod = 0;
662
   ngs_dmamod = 0;
590
   temp.gsdmaaddr = 0;
663
   temp.gsdmaaddr = 0;
591
   temp.gsdmaon = 0;
664
   temp.gsdmaon = 0;
592
   SdCard.Reset();
665
   SdCard.Reset();