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(); |