1 // ---------------------------------------------------------------------------
2 // OPN/A/B interface with ADPCM support
3 // Copyright (C) cisc 1998, 2001.
4 // ---------------------------------------------------------------------------
5 // $Id: opna.cpp,v 1.70 2004/02/06 13:13:39 cisc Exp $
12 #include "../../common.h"
13 #include "../../fileio.h"
15 #include "../../statesub.h"
16 extern DLL_PREFIX_I CSP_Logger *csp_logger;
24 // OPN ch3
\82ª
\8fí
\82ÉPrepare
\82Ì
\91Î
\8fÛ
\82Æ
\82È
\82Á
\82Ä
\82µ
\82Ü
\82¤
\8fá
\8aQ
27 // ---------------------------------------------------------------------------
28 // OPNA: ADPCM
\83f
\81[
\83^
\82Ì
\8ai
\94[
\95û
\8e®
\82Ì
\88á
\82¢ (8bit/1bit)
\82ð
\83G
\83~
\83\85\83\8c\81[
\83g
\82µ
\82È
\82¢
29 //
\82±
\82Ì
\83I
\83v
\83V
\83\87\83\93\82ð
\97L
\8cø
\82É
\82·
\82é
\82Æ ADPCM
\83\81\83\82\83\8a\82Ö
\82Ì
\83A
\83N
\83Z
\83X(
\93Á
\82É 8bit
\83\82\81[
\83h)
\82ª
30 //
\91½
\8f
\8cy
\82
\82È
\82é
\82©
\82à
32 //#define NO_BITTYPE_EMULATION
41 // ---------------------------------------------------------------------------
44 #if defined(BUILD_OPN) || defined(BUILD_OPNA) || defined (BUILD_OPNB)
46 uint32 OPNBase::lfotable[8]; // OPNA/B
\97p
56 //
\83p
\83\89\83\81\81[
\83^
\83Z
\83b
\83g
57 void OPNBase::SetParameter(Channel4* ch, uint addr, uint data)
59 const static uint slottable[4] = { 0, 2, 1, 3 };
60 const static uint8 sltable[16] =
62 0, 4, 8, 12, 16, 20, 24, 28,
63 32, 36, 40, 44, 48, 52, 56, 124,
68 uint slot = slottable[(addr >> 2) & 3];
69 Operator* op = &ch->op[slot];
71 switch ((addr >> 4) & 15)
73 case 3: // 30-3E DT/MULTI
74 op->SetDT((data >> 4) & 0x07);
75 op->SetMULTI(data & 0x0f);
79 op->SetTL(data & 0x7f, ((regtc & 0xc0) == 0x80) && (csmch == ch));
82 case 5: // 50-5E KS/AR
83 op->SetKS((data >> 6) & 3);
84 op->SetAR((data & 0x1f) * 2);
87 case 6: // 60-6E DR/AMON
88 op->SetDR((data & 0x1f) * 2);
89 op->SetAMON((data & 0x80) != 0);
93 op->SetSR((data & 0x1f) * 2);
96 case 8: // 80-8E SL/RR
97 op->SetSL(sltable[(data >> 4) & 15]);
98 op->SetRR((data & 0x0f) * 4 + 2);
101 case 9: // 90-9E SSG-EC
102 op->SetSSGEC(data & 0x0f);
108 //
\83\8a\83Z
\83b
\83g
109 void OPNBase::Reset()
118 //
\8a\84\82è
\8d\9e\82Ý
\90M
\8d\86\82Ì
\8eæ
\93¾
119 bool OPNBase::ReadIRQ()
124 //
\83v
\83\8a\83X
\83P
\81[
\83\89\90Ý
\92è
125 void OPNBase::SetPrescaler(uint p)
127 static const char table[3][2] = { { 6, 4 }, { 3, 2 }, { 2, 1 } };
128 static const uint8 table2[8] = { 108, 77, 71, 67, 62, 44, 8, 5 };
133 assert(0 <= prescale && prescale < 3);
135 uint fmclock = clock / table[p][0] / 12;
139 //
\8d\87\90¬
\8eü
\94g
\90\94\82Æ
\8fo
\97Í
\8eü
\94g
\90\94\82Ì
\94ä
140 assert(fmclock < (0x80000000 >> FM_RATIOBITS));
141 uint ratio = ((fmclock << FM_RATIOBITS) + rate/2) / rate;
143 SetTimerPrescaler(table[p][0] * 12);
144 // MakeTimeTable(ratio);
145 chip.SetRatio(ratio);
146 psg.SetClock(clock / table[p][1], psgrate);
148 for (int i=0; i<8; i++)
150 lfotable[i] = (ratio << (2+FM_LFOCBITS-FM_RATIOBITS)) / table2[i];
156 bool OPNBase::Init(uint c, uint r)
165 void OPNBase::SetVolumeFM(int db_l, int db_r)
167 db_l = Min(db_l, 20);
168 db_r = Min(db_r, 20);
171 fmvolume_l = int(16384.0 * pow(10.0, db_l / 40.0));
175 fmvolume_r = int(16384.0 * pow(10.0, db_r / 40.0));
180 //
\83^
\83C
\83}
\81[
\8e\9e\8aÔ
\8f\88\97\9d
181 void OPNBase::TimerA()
183 if ((regtc & 0xc0) == 0x80)
185 csmch->KeyControl(0x00);
186 csmch->KeyControl(0x0f);
190 //
\8a\84\82è
\8d\9e\82Ý
\90M
\8d\86\82Ì
\90Ý
\92è
191 void OPNBase::Intr(bool value)
196 // ---------------------------------------------------------------------------
197 //
\83X
\83e
\81[
\83g
\83Z
\81[
\83u
199 #define OPN_BASE_STATE_VERSION 4
201 void OPNBase::DeclState()
204 DECL_STATE_ENTRY_INT32(fmvolume_l);
205 DECL_STATE_ENTRY_INT32(fmvolume_r);
206 DECL_STATE_ENTRY_UINT32(clock);
207 DECL_STATE_ENTRY_UINT32(rate);
208 DECL_STATE_ENTRY_UINT32(psgrate);
209 DECL_STATE_ENTRY_UINT32(status);
210 DECL_STATE_ENTRY_BOOL(interrupt);
211 DECL_STATE_ENTRY_UINT8(prescale);
216 void OPNBase::SaveState(void *f)
218 FILEIO *state_fio = (FILEIO *)f;
220 if(state_entry != NULL) {
221 state_entry->save_state(state_fio);
225 // state_fio->FputUint32_BE(OPN_BASE_STATE_VERSION);
227 // Timer::SaveState(f);
228 // state_fio->FputInt32_BE(fmvolume_l);
229 // state_fio->FputInt32_BE(fmvolume_r);
230 // state_fio->FputUint32_BE(clock);
231 // state_fio->FputUint32_BE(rate);
232 // state_fio->FputUint32_BE(psgrate);
233 // state_fio->FputUint32_BE(status);
234 // state_fio->FputBool(interrupt);
235 // state_fio->FputUint8(prescale);
238 bool OPNBase::LoadState(void *f)
240 FILEIO *state_fio = (FILEIO *)f;
242 if(state_entry != NULL) {
243 mb = state_entry->load_state(state_fio);
245 if(!mb) return false;
246 // if(state_fio->FgetUint32_BE() != OPN_BASE_STATE_VERSION) {
249 // if(!Timer::LoadState(f)) {
252 // fmvolume_l = state_fio->FgetInt32_BE();
253 // fmvolume_r = state_fio->FgetInt32_BE();
254 // clock = state_fio->FgetUint32_BE();
255 // rate = state_fio->FgetUint32_BE();
256 // psgrate = state_fio->FgetUint32_BE();
257 // status = state_fio->FgetUint32_BE();
258 // interrupt = state_fio->FgetBool();
259 // prescale = state_fio->FgetUint8();
261 // Make force-restore around prescaler and timers. 20180625 K.O
266 if(!chip.LoadState(f)) {
269 if(!psg.LoadState(f)) {
275 #endif // defined(BUILD_OPN) || defined(BUILD_OPNA) || defined (BUILD_OPNB)
277 // ---------------------------------------------------------------------------
289 for (int i=0; i<3; i++)
291 ch[i].SetChip(&chip);
292 ch[i].SetType(typeN);
297 bool OPN::Init(uint c, uint r, bool ip, const char*)
299 if (!SetRate(c, r, ip))
310 //
\83T
\83\93\83v
\83\8a\83\93\83O
\83\8c\81[
\83g
\95Ï
\8dX
311 bool OPN::SetRate(uint c, uint r, bool)
319 //
\83\8a\83Z
\83b
\83g
323 for (i=0x20; i<0x28; i++) SetReg(i, 0);
324 for (i=0x30; i<0xc0; i++) SetReg(i, 0);
332 //
\83\8c\83W
\83X
\83^
\93Ç
\82Ý
\8d\9e\82Ý
333 uint OPN::GetReg(uint addr)
336 return psg.GetReg(addr);
342 //
\83\8c\83W
\83X
\83^
\83A
\83\8c\83C
\82É
\83f
\81[
\83^
\82ð
\90Ý
\92è
343 void OPN::SetReg(uint addr, uint data)
345 // LOG2("reg[%.2x] <- %.2x\n", addr, data);
352 case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7:
353 case 8: case 9: case 10: case 11: case 12: case 13: case 14: case 15:
354 psg.SetReg(addr, data);
357 case 0x24: case 0x25:
358 SetTimerA(addr, data);
366 SetTimerControl(data);
369 case 0x28: // Key On/Off
371 ch[data & 3].KeyControl(data >> 4);
374 case 0x2d: case 0x2e: case 0x2f:
375 SetPrescaler(addr-0x2d);
379 case 0xa0: case 0xa1: case 0xa2:
380 fnum[c] = data + fnum2[c] * 0x100;
383 case 0xa4: case 0xa5: case 0xa6:
384 fnum2[c] = uint8(data);
387 case 0xa8: case 0xa9: case 0xaa:
388 fnum3[c] = data + fnum2[c+3] * 0x100;
391 case 0xac: case 0xad: case 0xae:
392 fnum2[c+3] = uint8(data);
395 case 0xb0: case 0xb1: case 0xb2:
396 ch[c].SetFB((data >> 3) & 7);
397 ch[c].SetAlgorithm(data & 7);
403 if ((addr & 0xf0) == 0x60)
405 OPNBase::SetParameter(&ch[c], addr, data);
411 //
\83X
\83e
\81[
\83^
\83X
\83t
\83\89\83O
\90Ý
\92è
412 void OPN::SetStatus(uint bits)
414 if (!(status & bits))
421 void OPN::ResetStatus(uint bit)
428 //
\83}
\83X
\83N
\90Ý
\92è
429 void OPN::SetChannelMask(uint mask)
431 for (int i=0; i<3; i++)
432 ch[i].Mute(!!(mask & (1 << i)));
433 psg.SetChannelMask(mask >> 6);
438 void OPN::Mix(Sample* buffer, int nsamples)
440 #define IStoSampleL(s) ((Limit(s, 0x7fff, -0x8000) * fmvolume_l) >> 14)
441 #define IStoSampleR(s) ((Limit(s, 0x7fff, -0x8000) * fmvolume_r) >> 14)
443 psg.Mix(buffer, nsamples);
446 ch[0].SetFNum(fnum[0]);
447 ch[1].SetFNum(fnum[1]);
449 ch[2].SetFNum(fnum[2]);
452 ch[2].op[0].SetFNum(fnum3[1]);
453 ch[2].op[1].SetFNum(fnum3[2]);
454 ch[2].op[2].SetFNum(fnum3[0]);
455 ch[2].op[3].SetFNum(fnum[2]);
458 int actch = (((ch[2].Prepare() << 2) | ch[1].Prepare()) << 2) | ch[0].Prepare();
461 Sample* limit = buffer + nsamples * 2;
462 for (Sample* dest = buffer; dest < limit; dest+=2)
466 if (actch & 0x01) s = ch[0].Calc();
467 if (actch & 0x04) s += ch[1].Calc();
468 if (actch & 0x10) s += ch[2].Calc();
469 s_l = IStoSampleL(s);
470 s_r = IStoSampleR(s);
471 StoreSample(dest[0], s_l);
472 StoreSample(dest[1], s_r);
479 // ---------------------------------------------------------------------------
480 //
\83X
\83e
\81[
\83g
\83Z
\81[
\83u
482 #define OPN_STATE_VERSION 2
484 void OPN::DeclState()
486 state_entry = new csp_state_utils(OPN_STATE_VERSION, chip_num, _T("FMGEN::OPN::"), csp_logger);
487 OPNBase::DeclState();
489 for(int i = 0; i < 3; i++) {
490 DECL_STATE_ENTRY_UINT32_MEMBER((fnum[i]), i);
491 DECL_STATE_ENTRY_UINT32_MEMBER((fnum3[i]), i);
493 DECL_STATE_ENTRY_1D_ARRAY(fnum2, sizeof(fnum2));
494 for(int i = 0; i < 3; i++) {
499 void OPN::SaveState(void *f)
501 FILEIO *state_fio = (FILEIO *)f;
502 OPNBase::SaveState(f);
503 // state_fio->FputUint32_BE(OPN_STATE_VERSION);
505 // OPNBase::SaveState(f);
506 // for(int i = 0; i < 3; i++) {
507 // state_fio->FputUint32_BE(fnum[i]);
509 // for(int i = 0; i < 3; i++) {
510 // state_fio->FputUint32_BE(fnum3[i]);
512 // //state_fio->Fwrite(fnum, sizeof(fnum), 1);
513 // //state_fio->Fwrite(fnum3, sizeof(fnum3), 1);
514 // state_fio->Fwrite(fnum2, sizeof(fnum2), 1);
515 for(int i = 0; i < 3; i++) {
520 bool OPN::LoadState(void *f)
522 FILEIO *state_fio = (FILEIO *)f;
525 mb = OPNBase::LoadState(f);
526 if(!mb) return false;
527 // if(state_fio->FgetUint32_BE() != OPN_STATE_VERSION) {
530 // if(!OPNBase::LoadState(f)) {
533 // for(int i = 0; i < 3; i++) {
534 // fnum[i] = state_fio->FgetUint32_BE();
536 // for(int i = 0; i < 3; i++) {
537 // fnum3[i] = state_fio->FgetUint32_BE();
539 // //state_fio->Fread(fnum, sizeof(fnum), 1);
540 // //state_fio->Fread(fnum3, sizeof(fnum3), 1);
541 // state_fio->Fread(fnum2, sizeof(fnum2), 1);
542 for(int i = 0; i < 3; i++) {
543 if(!ch[i].LoadState(f)) {
552 // ---------------------------------------------------------------------------
553 // YM2608/2610 common part
554 // ---------------------------------------------------------------------------
556 #if defined(BUILD_OPNA) || defined(BUILD_OPNB)
558 int OPNABase::amtable[FM_LFOENTS] = { -1, };
559 int OPNABase::pmtable[FM_LFOENTS];
561 int32 OPNABase::tltable[FM_TLENTS+FM_TLPOS];
562 bool OPNABase::tablehasmade = false;
577 for (int i=0; i<6; i++)
579 ch[i].SetChip(&chip);
580 ch[i].SetType(typeN);
584 OPNABase::~OPNABase()
588 // ---------------------------------------------------------------------------
591 bool OPNABase::Init(uint c, uint r, bool)
603 // ---------------------------------------------------------------------------
604 //
\83e
\81[
\83u
\83\8b\8dì
\90¬
606 void OPNABase::MakeTable2()
610 for (int i=-FM_TLPOS; i<FM_TLENTS; i++)
612 tltable[i+FM_TLPOS] = uint(65536. * pow(2.0, i * -16. / FM_TLENTS))-1;
619 // ---------------------------------------------------------------------------
620 //
\83\8a\83Z
\83b
\83g
622 void OPNABase::Reset()
627 for (i=0x20; i<0x28; i++) SetReg(i, 0);
628 for (i=0x30; i<0xc0; i++) SetReg(i, 0);
629 for (i=0x130; i<0x1c0; i++) SetReg(i, 0);
630 for (i=0x100; i<0x110; i++) SetReg(i, 0);
631 for (i=0x10; i<0x20; i++) SetReg(i, 0);
645 apout0_l = apout1_l = adpcmout_l = 0;
646 apout0_r = apout1_r = adpcmout_r = 0;
655 // ---------------------------------------------------------------------------
656 //
\83T
\83\93\83v
\83\8a\83\93\83O
\83\8c\81[
\83g
\95Ï
\8dX
658 bool OPNABase::SetRate(uint c, uint r, bool)
660 c /= 2; //
\8f]
\97\88\94Å
\82Æ
\82Ì
\8cÝ
\8a·
\90«
\82ð
\8fd
\8e\8b\82µ
\82½
\82¯
\82è
\82á
\83R
\83\81\83\93\83g
\83A
\83E
\83g
\82µ
\82æ
\82¤
664 adplbase = int(8192. * (clock/72.) / r);
665 adpld = deltan * adplbase >> 16;
669 lfodcount = reg22 & 0x08 ? lfotable[reg22 & 7] : 0;
674 // ---------------------------------------------------------------------------
675 //
\83`
\83\83\83\93\83l
\83\8b\83}
\83X
\83N
\82Ì
\90Ý
\92è
677 void OPNABase::SetChannelMask(uint mask)
679 for (int i=0; i<6; i++)
680 ch[i].Mute(!!(mask & (1 << i)));
681 psg.SetChannelMask(mask >> 6);
682 adpcmmask_ = (mask & (1 << 9)) != 0;
683 rhythmmask_ = (mask >> 10) & ((1 << 6) - 1);
686 // ---------------------------------------------------------------------------
687 //
\83\8c\83W
\83X
\83^
\83A
\83\8c\83C
\82É
\83f
\81[
\83^
\82ð
\90Ý
\92è
689 void OPNABase::SetReg(uint addr, uint data)
696 // Timer -----------------------------------------------------------------
697 case 0x24: case 0x25:
698 SetTimerA(addr, data);
706 SetTimerControl(data);
709 // Misc ------------------------------------------------------------------
710 case 0x28: // Key On/Off
713 c = (data & 3) + (data & 4 ? 3 : 0);
714 ch[c].KeyControl(data >> 4);
718 // Status Mask -----------------------------------------------------------
721 // UpdateStatus(); //?
724 // Prescaler -------------------------------------------------------------
725 case 0x2d: case 0x2e: case 0x2f:
726 SetPrescaler(addr-0x2d);
729 // F-Number --------------------------------------------------------------
730 case 0x1a0: case 0x1a1: case 0x1a2:
732 case 0xa0: case 0xa1: case 0xa2:
733 fnum[c] = data + fnum2[c] * 0x100;
734 ch[c].SetFNum(fnum[c]);
737 case 0x1a4: case 0x1a5: case 0x1a6:
739 case 0xa4 : case 0xa5: case 0xa6:
740 fnum2[c] = uint8(data);
743 case 0xa8: case 0xa9: case 0xaa:
744 fnum3[c] = data + fnum2[c+6] * 0x100;
747 case 0xac : case 0xad: case 0xae:
748 fnum2[c+6] = uint8(data);
751 // Algorithm -------------------------------------------------------------
753 case 0x1b0: case 0x1b1: case 0x1b2:
755 case 0xb0: case 0xb1: case 0xb2:
756 ch[c].SetFB((data >> 3) & 7);
757 ch[c].SetAlgorithm(data & 7);
760 case 0x1b4: case 0x1b5: case 0x1b6:
762 case 0xb4: case 0xb5: case 0xb6:
763 pan[c] = (data >> 6) & 3;
767 // LFO -------------------------------------------------------------------
769 modified = reg22 ^ data;
773 lfodcount = reg22 & 8 ? lfotable[reg22 & 7] : 0;
776 // PSG -------------------------------------------------------------------
777 case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7:
778 case 8: case 9: case 10: case 11: case 12: case 13: case 14: case 15:
779 psg.SetReg(addr, data);
782 //
\89¹
\90F ------------------------------------------------------------------
788 OPNBase::SetParameter(&ch[c], addr, data);
794 // ---------------------------------------------------------------------------
797 void OPNABase::SetADPCMBReg(uint addr, uint data)
801 case 0x00: // Control Register 1
802 if ((data & 0x80) && !adpcmplay)
806 adpcmx = 0, adpcmd = 127;
816 case 0x01: // Control Register 2
818 granuality = control2 & 2 ? 1 : 4;
821 case 0x02: // Start Address L
822 case 0x03: // Start Address H
823 adpcmreg[addr - 0x02 + 0] = data;
824 startaddr = (adpcmreg[1]*256+adpcmreg[0]) << 6;
826 // LOG1(" startaddr %.6x", startaddr);
829 case 0x04: // Stop Address L
830 case 0x05: // Stop Address H
831 adpcmreg[addr - 0x04 + 2] = data;
832 stopaddr = (adpcmreg[3]*256+adpcmreg[2] + 1) << 6;
833 // LOG1(" stopaddr %.6x", stopaddr);
836 case 0x08: // ADPCM data
837 if ((control1 & 0x60) == 0x60)
839 // LOG2(" Wr [0x%.5x] = %.2x", memaddr, data);
844 case 0x09: // delta-N L
845 case 0x0a: // delta-N H
846 adpcmreg[addr - 0x09 + 4] = data;
847 deltan = adpcmreg[5]*256+adpcmreg[4];
848 deltan = Max(256, deltan);
849 adpld = deltan * adplbase >> 16;
852 case 0x0b: // Level Control
854 adpcmvolume_l = (adpcmvol_l * adpcmlevel) >> 12;
855 adpcmvolume_r = (adpcmvol_r * adpcmlevel) >> 12;
858 case 0x0c: // Limit Address L
859 case 0x0d: // Limit Address H
860 adpcmreg[addr - 0x0c + 6] = data;
861 limitaddr = (adpcmreg[7]*256+adpcmreg[6] + 1) << 6;
862 // LOG1(" limitaddr %.6x", limitaddr);
865 case 0x10: // Flag Control
868 // for Firecracker Music collection (Hi-speed PCM loader)
874 stmask = ~(data & 0x1f);
875 // UpdateStatus(); //???
882 // ---------------------------------------------------------------------------
883 //
\83\8c\83W
\83X
\83^
\8eæ
\93¾
885 uint OPNA::GetReg(uint addr)
888 return psg.GetReg(addr);
892 // LOG1("%d:reg[108] -> ", Diag::GetCPUTick());
894 uint data = adpcmreadbuf & 0xff;
896 if ((control1 & 0x60) == 0x20)
898 adpcmreadbuf |= ReadRAM() << 8;
899 // LOG2("Rd [0x%.6x:%.2x] ", memaddr, adpcmreadbuf >> 8);
914 // ---------------------------------------------------------------------------
915 //
\83X
\83e
\81[
\83^
\83X
\83t
\83\89\83O
\90Ý
\92è
917 void OPNABase::SetStatus(uint bits)
919 if (!(status & bits))
921 // LOG2("SetStatus(%.2x %.2x)\n", bits, stmask);
922 status |= bits & stmask;
926 // LOG1("SetStatus(%.2x) - ignored\n", bits);
929 void OPNABase::ResetStatus(uint bits)
932 // LOG1("ResetStatus(%.2x)\n", bits);
936 inline void OPNABase::UpdateStatus()
938 // LOG2("%d:INT = %d\n", Diag::GetCPUTick(), (status & stmask & reg29) != 0);
939 Intr((status & stmask & reg29) != 0);
942 // ---------------------------------------------------------------------------
943 // ADPCM RAM
\82Ö
\82Ì
\8f\91\8d\9e\82Ý
\91\80\8dì
945 void OPNABase::WriteRAM(uint data)
947 #ifndef NO_BITTYPE_EMULATION
951 adpcmbuf[(memaddr >> 4) & 0x3ffff] = data;
957 uint8* p = &adpcmbuf[(memaddr >> 4) & 0x7fff];
958 uint bank = (memaddr >> 1) & 7;
959 uint8 mask = 1 << bank;
962 p[0x00000] = (p[0x00000] & ~mask) | (uint8(data) & mask); data >>= 1;
963 p[0x08000] = (p[0x08000] & ~mask) | (uint8(data) & mask); data >>= 1;
964 p[0x10000] = (p[0x10000] & ~mask) | (uint8(data) & mask); data >>= 1;
965 p[0x18000] = (p[0x18000] & ~mask) | (uint8(data) & mask); data >>= 1;
966 p[0x20000] = (p[0x20000] & ~mask) | (uint8(data) & mask); data >>= 1;
967 p[0x28000] = (p[0x28000] & ~mask) | (uint8(data) & mask); data >>= 1;
968 p[0x30000] = (p[0x30000] & ~mask) | (uint8(data) & mask); data >>= 1;
969 p[0x38000] = (p[0x38000] & ~mask) | (uint8(data) & mask);
973 adpcmbuf[(memaddr >> granuality) & 0x3ffff] = data;
974 memaddr += 1 << granuality;
977 if (memaddr == stopaddr)
980 statusnext = 0x04; // EOS
983 if (memaddr == limitaddr)
985 // LOG1("Limit ! (%.8x)\n", limitaddr);
991 // ---------------------------------------------------------------------------
992 // ADPCM RAM
\82©
\82ç
\82Ì
\93Ç
\82Ý
\8d\9e\82Ý
\91\80\8dì
994 uint OPNABase::ReadRAM()
997 #ifndef NO_BITTYPE_EMULATION
1001 data = adpcmbuf[(memaddr >> 4) & 0x3ffff];
1007 uint8* p = &adpcmbuf[(memaddr >> 4) & 0x7fff];
1008 uint bank = (memaddr >> 1) & 7;
1009 uint8 mask = 1 << bank;
1011 data = (p[0x38000] & mask);
1012 data = data * 2 + (p[0x30000] & mask);
1013 data = data * 2 + (p[0x28000] & mask);
1014 data = data * 2 + (p[0x20000] & mask);
1015 data = data * 2 + (p[0x18000] & mask);
1016 data = data * 2 + (p[0x10000] & mask);
1017 data = data * 2 + (p[0x08000] & mask);
1018 data = data * 2 + (p[0x00000] & mask);
1023 data = adpcmbuf[(memaddr >> granuality) & 0x3ffff];
1024 memaddr += 1 << granuality;
1026 if (memaddr == stopaddr)
1029 statusnext = 0x04; // EOS
1030 memaddr &= 0x3fffff;
1032 if (memaddr == limitaddr)
1034 // LOG1("Limit ! (%.8x)\n", limitaddr);
1037 if (memaddr < stopaddr)
1043 inline int OPNABase::DecodeADPCMBSample(uint data)
1045 static const int table1[16] =
1047 1, 3, 5, 7, 9, 11, 13, 15,
1048 -1, -3, -5, -7, -9, -11, -13, -15,
1050 static const int table2[16] =
1052 57, 57, 57, 57, 77, 102, 128, 153,
1053 57, 57, 57, 57, 77, 102, 128, 153,
1055 adpcmx = Limit(adpcmx + table1[data] * adpcmd / 8, 32767, -32768);
1056 adpcmd = Limit(adpcmd * table2[data] / 64, 24576, 127);
1061 // ---------------------------------------------------------------------------
1062 // ADPCM RAM
\82©
\82ç
\82Ì nibble
\93Ç
\82Ý
\8d\9e\82Ý
\8by
\82Ñ ADPCM
\93W
\8aJ
1064 int OPNABase::ReadRAMN()
1069 #ifndef NO_BITTYPE_EMULATION
1070 if (!(control2 & 2))
1072 data = adpcmbuf[(memaddr >> 4) & 0x3ffff];
1075 return DecodeADPCMBSample(data >> 4);
1080 uint8* p = &adpcmbuf[(memaddr >> 4) & 0x7fff] + ((~memaddr & 1) << 17);
1081 uint bank = (memaddr >> 1) & 7;
1082 uint8 mask = 1 << bank;
1084 data = (p[0x18000] & mask);
1085 data = data * 2 + (p[0x10000] & mask);
1086 data = data * 2 + (p[0x08000] & mask);
1087 data = data * 2 + (p[0x00000] & mask);
1091 return DecodeADPCMBSample(data);
1094 data = adpcmbuf[(memaddr >> granuality) & adpcmmask];
1095 memaddr += 1 << (granuality-1);
1096 if (memaddr & (1 << (granuality-1)))
1097 return DecodeADPCMBSample(data >> 4);
1103 data = adpcmbuf[(memaddr >> 1) & adpcmmask];
1106 return DecodeADPCMBSample(data >> 4);
1110 DecodeADPCMBSample(data);
1113 if (memaddr == stopaddr)
1115 if (control1 & 0x10)
1117 memaddr = startaddr;
1119 adpcmx = 0, adpcmd = 127;
1120 // for PC-8801FA/MA shop demonstration
1121 SetStatus(adpcmnotice);
1126 memaddr &= adpcmmask; //0x3fffff;
1127 SetStatus(adpcmnotice);
1132 if (memaddr == limitaddr)
1138 // ---------------------------------------------------------------------------
1139 //
\8ag
\92£
\83X
\83e
\81[
\83^
\83X
\82ð
\93Ç
\82Ý
\82±
\82Þ
1141 uint OPNABase::ReadStatusEx()
1143 uint r = ((status | 8) & stmask) | (adpcmplay ? 0x20 : 0);
1144 status |= statusnext;
1149 // ---------------------------------------------------------------------------
1152 inline void OPNABase::DecodeADPCMB()
1154 apout0_l = apout1_l;
1155 apout0_r = apout1_r;
1156 int ram = ReadRAMN();
1157 int s_l = (ram * adpcmvolume_l) >> 13;
1158 int s_r = (ram * adpcmvolume_r) >> 13;
1159 apout1_l = adpcmout_l + s_l;
1160 apout1_r = adpcmout_r + s_r;
1165 // ---------------------------------------------------------------------------
1168 void OPNABase::ADPCMBMix(Sample* dest, uint count)
1170 uint mask_l = control2 & 0x80 ? -1 : 0;
1171 uint mask_r = control2 & 0x40 ? -1 : 0;
1174 mask_l = mask_r = 0;
1179 // LOG2("ADPCM Play: %d DeltaN: %d\n", adpld, deltan);
1180 if (adpld <= 8192) // fplay < fsamp
1182 for (; count>0; count--)
1191 int s_l = (adplc * apout0_l + (8192-adplc) * apout1_l) >> 13;
1192 int s_r = (adplc * apout0_r + (8192-adplc) * apout1_r) >> 13;
1193 StoreSample(dest[0], s_l & mask_l);
1194 StoreSample(dest[1], s_r & mask_r);
1198 for (; count>0 && (apout0_l || apout0_r); count--)
1202 apout0_l = apout1_l, apout1_l = 0;
1203 apout0_r = apout1_r, apout1_r = 0;
1206 int s_l = (adplc * apout1_l) >> 13;
1207 int s_r = (adplc * apout1_r) >> 13;
1208 StoreSample(dest[0], s_l & mask_l);
1209 StoreSample(dest[1], s_r & mask_r);
1214 else // fplay > fsamp (adpld = fplay/famp*8192)
1216 int t = (-8192*8192)/adpld;
1217 for (; count>0; count--)
1219 int s_l = apout0_l * (8192+adplc);
1220 int s_r = apout0_r * (8192+adplc);
1226 s_l -= apout0_l * Max(adplc, t);
1227 s_r -= apout0_r * Max(adplc, t);
1233 StoreSample(dest[0], s_l & mask_l);
1234 StoreSample(dest[1], s_r & mask_r);
1243 apout0_l = apout1_l = adpcmout_l = 0;
1244 apout0_r = apout1_r = adpcmout_r = 0;
1249 // ---------------------------------------------------------------------------
1251 // in: buffer
\8d\87\90¬
\90æ
1252 // nsamples
\8d\87\90¬
\83T
\83\93\83v
\83\8b\90\94
1254 void OPNABase::FMMix(Sample* buffer, int nsamples)
1256 if (fmvolume_l > 0 || fmvolume_r > 0)
1260 if (!(regtc & 0xc0))
1261 csmch->SetFNum(fnum[csmch-ch]);
1264 //
\8cø
\89Ê
\89¹
\83\82\81[
\83h
1265 csmch->op[0].SetFNum(fnum3[1]); csmch->op[1].SetFNum(fnum3[2]);
1266 csmch->op[2].SetFNum(fnum3[0]); csmch->op[3].SetFNum(fnum[2]);
1269 int act = (((ch[2].Prepare() << 2) | ch[1].Prepare()) << 2) | ch[0].Prepare();
1271 act |= (ch[3].Prepare() | ((ch[4].Prepare() | (ch[5].Prepare() << 2)) << 2)) << 6;
1272 if (!(reg22 & 0x08))
1277 Mix6(buffer, nsamples, act);
1282 // ---------------------------------------------------------------------------
1284 void OPNABase::MixSubSL(int activech, ISample** dest)
1286 if (activech & 0x001) (*dest[0] = ch[0].CalcL());
1287 if (activech & 0x004) (*dest[1] += ch[1].CalcL());
1288 if (activech & 0x010) (*dest[2] += ch[2].CalcL());
1289 if (activech & 0x040) (*dest[3] += ch[3].CalcL());
1290 if (activech & 0x100) (*dest[4] += ch[4].CalcL());
1291 if (activech & 0x400) (*dest[5] += ch[5].CalcL());
1294 inline void OPNABase::MixSubS(int activech, ISample** dest)
1296 if (activech & 0x001) (*dest[0] = ch[0].Calc());
1297 if (activech & 0x004) (*dest[1] += ch[1].Calc());
1298 if (activech & 0x010) (*dest[2] += ch[2].Calc());
1299 if (activech & 0x040) (*dest[3] += ch[3].Calc());
1300 if (activech & 0x100) (*dest[4] += ch[4].Calc());
1301 if (activech & 0x400) (*dest[5] += ch[5].Calc());
1304 // ---------------------------------------------------------------------------
1306 void OPNABase::BuildLFOTable()
1308 if (amtable[0] == -1)
1310 for (int c=0; c<256; c++)
1313 if (c < 0x40) v = c * 2 + 0x80;
1314 else if (c < 0xc0) v = 0x7f - (c - 0x40) * 2 + 0x80;
1315 else v = (c - 0xc0) * 2;
1318 if (c < 0x80) v = 0xff - c * 2;
1319 else v = (c - 0x80) * 2;
1320 amtable[c] = v & ~3;
1325 // ---------------------------------------------------------------------------
1327 inline void OPNABase::LFO()
1329 // LOG3("%4d - %8d, %8d\n", c, lfocount, lfodcount);
1331 // Operator::SetPML(pmtable[(lfocount >> (FM_LFOCBITS+1)) & 0xff]);
1332 // Operator::SetAML(amtable[(lfocount >> (FM_LFOCBITS+1)) & 0xff]);
1333 chip.SetPML(pmtable[(lfocount >> (FM_LFOCBITS+1)) & 0xff]);
1334 chip.SetAML(amtable[(lfocount >> (FM_LFOCBITS+1)) & 0xff]);
1335 lfocount += lfodcount;
1338 // ---------------------------------------------------------------------------
1341 #define IStoSampleL(s) ((Limit(s, 0x7fff, -0x8000) * fmvolume_l) >> 14)
1342 #define IStoSampleR(s) ((Limit(s, 0x7fff, -0x8000) * fmvolume_r) >> 14)
1344 void OPNABase::Mix6(Sample* buffer, int nsamples, int activech)
1349 idest[0] = &ibuf[pan[0]];
1350 idest[1] = &ibuf[pan[1]];
1351 idest[2] = &ibuf[pan[2]];
1352 idest[3] = &ibuf[pan[3]];
1353 idest[4] = &ibuf[pan[4]];
1354 idest[5] = &ibuf[pan[5]];
1356 Sample* limit = buffer + nsamples * 2;
1357 for (Sample* dest = buffer; dest < limit; dest+=2)
1359 ibuf[1] = ibuf[2] = ibuf[3] = 0;
1360 if (activech & 0xaaa)
1361 LFO(), MixSubSL(activech, idest);
1363 MixSubS(activech, idest);
1364 StoreSample(dest[0], IStoSampleL(ibuf[2] + ibuf[3]));
1365 StoreSample(dest[1], IStoSampleR(ibuf[1] + ibuf[3]));
1369 // ---------------------------------------------------------------------------
1370 //
\83X
\83e
\81[
\83g
\83Z
\81[
\83u
1372 #define OPNA_BASE_STATE_VERSION 2
1374 void OPNABase::DeclState()
1377 OPNBase::DeclState();
1379 DECL_STATE_ENTRY_1D_ARRAY(pan, sizeof(pan));
1380 DECL_STATE_ENTRY_1D_ARRAY(fnum2, sizeof(fnum2));
1381 DECL_STATE_ENTRY_UINT8(reg22);
1382 DECL_STATE_ENTRY_UINT32(reg29);
1383 DECL_STATE_ENTRY_UINT32(stmask);
1384 DECL_STATE_ENTRY_UINT32(statusnext);
1385 DECL_STATE_ENTRY_UINT32(lfocount);
1386 DECL_STATE_ENTRY_UINT32(lfodcount);
1387 //state_fio->Fwrite(fnum, sizeof(fnum), 1);
1388 //state_fio->Fwrite(fnum3, sizeof(fnum3), 1);
1389 for(int i = 0; i < 6; i++) {
1390 DECL_STATE_ENTRY_UINT32_MEMBER((fnum[i]), i);
1392 for(int i = 0; i < 3; i++) {
1393 DECL_STATE_ENTRY_UINT32_MEMBER((fnum3[i]), i);
1395 DECL_STATE_ENTRY_1D_ARRAY(adpcmbuf, 0x40000);
1396 DECL_STATE_ENTRY_UINT32(adpcmmask);
1397 DECL_STATE_ENTRY_UINT32(adpcmnotice);
1398 DECL_STATE_ENTRY_UINT32(startaddr);
1399 DECL_STATE_ENTRY_UINT32(stopaddr);
1400 DECL_STATE_ENTRY_UINT32(memaddr);
1401 DECL_STATE_ENTRY_UINT32(limitaddr);
1402 DECL_STATE_ENTRY_INT32(adpcmlevel);
1403 DECL_STATE_ENTRY_INT32(adpcmvolume_l);
1404 DECL_STATE_ENTRY_INT32(adpcmvolume_r);
1405 DECL_STATE_ENTRY_INT32(adpcmvol_l);
1406 DECL_STATE_ENTRY_INT32(adpcmvol_r);
1407 DECL_STATE_ENTRY_UINT32(deltan);
1408 DECL_STATE_ENTRY_INT32(adplc);
1409 DECL_STATE_ENTRY_INT32(adpld);
1410 DECL_STATE_ENTRY_UINT32(adplbase);
1411 DECL_STATE_ENTRY_INT32(adpcmx);
1412 DECL_STATE_ENTRY_INT32(adpcmd);
1413 DECL_STATE_ENTRY_INT32(adpcmout_l);
1414 DECL_STATE_ENTRY_INT32(adpcmout_r);
1415 DECL_STATE_ENTRY_INT32(apout0_l);
1416 DECL_STATE_ENTRY_INT32(apout0_r);
1417 DECL_STATE_ENTRY_INT32(apout1_l);
1418 DECL_STATE_ENTRY_INT32(apout1_r);
1419 DECL_STATE_ENTRY_UINT32(adpcmreadbuf);
1420 DECL_STATE_ENTRY_BOOL(adpcmplay);
1421 DECL_STATE_ENTRY_INT8(granuality);
1422 DECL_STATE_ENTRY_BOOL(adpcmmask_);
1423 DECL_STATE_ENTRY_UINT8(control1);
1424 DECL_STATE_ENTRY_UINT8(control2);
1425 DECL_STATE_ENTRY_1D_ARRAY(adpcmreg, sizeof(adpcmreg));
1426 DECL_STATE_ENTRY_INT32(rhythmmask_);
1428 for(int i = 0; i < 6; i++) {
1432 void OPNABase::SaveState(void *f)
1434 FILEIO *state_fio = (FILEIO *)f;
1435 if(state_entry != NULL) {
1436 state_entry->save_state(state_fio);
1441 // state_fio->FputUint32_BE(OPNA_BASE_STATE_VERSION);
1443 // OPNBase::SaveState(f);
1444 // state_fio->Fwrite(pan, sizeof(pan), 1);
1445 // state_fio->Fwrite(fnum2, sizeof(fnum2), 1);
1446 // state_fio->FputUint8(reg22);
1447 // state_fio->FputUint32_BE(reg29);
1448 // state_fio->FputUint32_BE(stmask);
1449 // state_fio->FputUint32_BE(statusnext);
1450 // state_fio->FputUint32_BE(lfocount);
1451 // state_fio->FputUint32_BE(lfodcount);
1452 // //state_fio->Fwrite(fnum, sizeof(fnum), 1);
1453 // //state_fio->Fwrite(fnum3, sizeof(fnum3), 1);
1454 // for(int i = 0; i < 6; i++) {
1455 // state_fio->FputUint32_BE(fnum[i]);
1457 // for(int i = 0; i < 3; i++) {
1458 // state_fio->FputUint32_BE(fnum3[i]);
1460 // state_fio->Fwrite(adpcmbuf, 0x40000, 1);
1461 // state_fio->FputUint32_BE(adpcmmask);
1462 // state_fio->FputUint32_BE(adpcmnotice);
1463 // state_fio->FputUint32_BE(startaddr);
1464 // state_fio->FputUint32_BE(stopaddr);
1465 // state_fio->FputUint32_BE(memaddr);
1466 // state_fio->FputUint32_BE(limitaddr);
1467 // state_fio->FputInt32_BE(adpcmlevel);
1468 // state_fio->FputInt32_BE(adpcmvolume_l);
1469 // state_fio->FputInt32_BE(adpcmvolume_r);
1470 // state_fio->FputInt32_BE(adpcmvol_l);
1471 // state_fio->FputInt32_BE(adpcmvol_r);
1472 // state_fio->FputUint32_BE(deltan);
1473 // state_fio->FputInt32_BE(adplc);
1474 // state_fio->FputInt32_BE(adpld);
1475 // state_fio->FputUint32_BE(adplbase);
1476 // state_fio->FputInt32_BE(adpcmx);
1477 // state_fio->FputInt32_BE(adpcmd);
1478 // state_fio->FputInt32_BE(adpcmout_l);
1479 // state_fio->FputInt32_BE(adpcmout_r);
1480 // state_fio->FputInt32_BE(apout0_l);
1481 // state_fio->FputInt32_BE(apout0_r);
1482 // state_fio->FputInt32_BE(apout1_l);
1483 // state_fio->FputInt32_BE(apout1_r);
1484 // state_fio->FputUint32_BE(adpcmreadbuf);
1485 // state_fio->FputBool(adpcmplay);
1486 // state_fio->FputInt8(granuality);
1487 // state_fio->FputBool(adpcmmask_);
1488 // state_fio->FputUint8(control1);
1489 // state_fio->FputUint8(control2);
1490 // state_fio->Fwrite(adpcmreg, sizeof(adpcmreg), 1);
1491 // state_fio->FputInt32_BE(rhythmmask_);
1492 for(int i = 0; i < 6; i++) {
1497 bool OPNABase::LoadState(void *f)
1499 FILEIO *state_fio = (FILEIO *)f;
1502 if(state_entry != NULL) {
1503 mb = state_entry->load_state(state_fio);
1505 if(!mb) return false;
1507 // Make force-restore around prescaler and timers. 20180625 K.O
1508 uint bak = prescale;
1512 if(!chip.LoadState(f)) {
1515 if(!psg.LoadState(f)) {
1518 // if(state_fio->FgetUint32_BE() != OPNA_BASE_STATE_VERSION) {
1521 // if(!OPNBase::LoadState(f)) {
1524 // state_fio->Fread(pan, sizeof(pan), 1);
1525 // state_fio->Fread(fnum2, sizeof(fnum2), 1);
1526 // reg22 = state_fio->FgetUint8();
1527 // reg29 = state_fio->FgetUint32_BE();
1528 // stmask = state_fio->FgetUint32_BE();
1529 // statusnext = state_fio->FgetUint32_BE();
1530 // lfocount = state_fio->FgetUint32_BE();
1531 // lfodcount = state_fio->FgetUint32_BE();
1532 // //state_fio->Fread(fnum, sizeof(fnum), 1);
1533 // //state_fio->Fread(fnum3, sizeof(fnum3), 1);
1534 // for(int i = 0; i < 6; i++) {
1535 // fnum[i] = state_fio->FgetUint32_BE();
1537 // for(int i = 0; i < 3; i++) {
1538 // fnum3[i] = state_fio->FgetUint32_BE();
1540 // state_fio->Fread(adpcmbuf, 0x40000, 1);
1541 // adpcmmask = state_fio->FgetUint32_BE();
1542 // adpcmnotice = state_fio->FgetUint32_BE();
1543 // startaddr = state_fio->FgetUint32_BE();
1544 // stopaddr = state_fio->FgetUint32_BE();
1545 // memaddr = state_fio->FgetUint32_BE();
1546 // limitaddr = state_fio->FgetUint32_BE();
1547 // adpcmlevel = state_fio->FgetInt32_BE();
1548 // adpcmvolume_l = state_fio->FgetInt32_BE();
1549 // adpcmvolume_r = state_fio->FgetInt32_BE();
1550 // adpcmvol_l = state_fio->FgetInt32_BE();
1551 // adpcmvol_r = state_fio->FgetInt32_BE();
1552 // deltan = state_fio->FgetUint32_BE();
1553 // adplc = state_fio->FgetInt32_BE();
1554 // adpld = state_fio->FgetInt32_BE();
1555 // adplbase = state_fio->FgetUint32_BE();
1556 // adpcmx = state_fio->FgetInt32_BE();
1557 // adpcmd = state_fio->FgetInt32_BE();
1558 // adpcmout_l = state_fio->FgetInt32_BE();
1559 // adpcmout_r = state_fio->FgetInt32_BE();
1560 // apout0_l = state_fio->FgetInt32_BE();
1561 // apout0_r = state_fio->FgetInt32_BE();
1562 // apout1_l = state_fio->FgetInt32_BE();
1563 // apout1_r = state_fio->FgetInt32_BE();
1564 // adpcmreadbuf = state_fio->FgetUint32_BE();
1565 // adpcmplay = state_fio->FgetBool();
1566 // granuality = state_fio->FgetInt8();
1567 // adpcmmask_ = state_fio->FgetBool();
1568 // control1 = state_fio->FgetUint8();
1569 // control2 = state_fio->FgetUint8();
1570 /// state_fio->Fread(adpcmreg, sizeof(adpcmreg), 1);
1571 // rhythmmask_ = state_fio->FgetInt32_BE();
1572 for(int i = 0; i < 6; i++) {
1573 if(!ch[i].LoadState(f)) {
1580 #endif // defined(BUILD_OPNA) || defined(BUILD_OPNB)
1582 // ---------------------------------------------------------------------------
1584 // ---------------------------------------------------------------------------
1588 // ---------------------------------------------------------------------------
1593 for (int i=0; i<6; i++)
1595 rhythm[i].sample = 0;
1598 rhythm[i].volume_l = 0;
1599 rhythm[i].volume_r = 0;
1600 rhythm[i].level = 0;
1605 adpcmmask = 0x3ffff;
1610 // ---------------------------------------------------------------------------
1615 for (int i=0; i<6; i++)
1616 delete[] rhythm[i].sample;
1621 // ---------------------------------------------------------------------------
1624 bool OPNA::Init(uint c, uint r, bool ipflag, const _TCHAR* path)
1627 LoadRhythmSample(path);
1630 adpcmbuf = new uint8[0x40000];
1634 if (!SetRate(c, r, ipflag))
1636 if (!OPNABase::Init(c, r, ipflag))
1641 SetVolumeADPCM(0, 0);
1642 SetVolumeRhythmTotal(0, 0);
1643 for (int i=0; i<6; i++)
1644 SetVolumeRhythm(i, 0, 0);
1648 // ---------------------------------------------------------------------------
1649 //
\83\8a\83Z
\83b
\83g
1656 limitaddr = 0x3ffff;
1660 // ---------------------------------------------------------------------------
1661 //
\83T
\83\93\83v
\83\8a\83\93\83O
\83\8c\81[
\83g
\95Ï
\8dX
1663 bool OPNA::SetRate(uint c, uint r, bool ipflag)
1665 if (!OPNABase::SetRate(c, r, ipflag))
1668 for (int i=0; i<6; i++)
1670 rhythm[i].step = rhythm[i].rate * 1024 / r;
1676 // ---------------------------------------------------------------------------
1677 //
\83\8a\83Y
\83\80\89¹
\82ð
\93Ç
\82Ý
\82±
\82Þ
1679 bool OPNA::LoadRhythmSample(const _TCHAR* path)
1681 static const _TCHAR* rhythmname[6] =
1683 _T("BD"), _T("SD"), _T("TOP"), _T("HH"), _T("TOM"), _T("RIM"),
1694 _TCHAR buf[_MAX_PATH] = _T("");
1695 memset(buf, 0x00, sizeof(buf));
1697 _tcsncpy(buf, path, _MAX_PATH - 1);
1698 _tcsncat(buf, _T("2608_"), _MAX_PATH - 1);
1699 _tcsncat(buf, rhythmname[i], _MAX_PATH- 1);
1700 _tcsncat(buf, _T(".WAV"), _MAX_PATH - 1);
1702 if (!file.Fopen(buf, FILEIO_READ_BINARY))
1706 memset(buf, 0x00, sizeof(buf));
1708 _tcsncpy(buf, path, _MAX_PATH - 1);
1710 _tcsncat(buf, _T("2608_RYM.WAV"), _MAX_PATH - 1);
1711 if (!file.Fopen(buf, FILEIO_READ_BINARY))
1718 file.Fread(&whdr, sizeof(whdr), 1);
1720 uint8 subchunkname[4];
1721 bool is_eof = false;
1722 file.Fseek(EndianFromLittle_DWORD(whdr.fmt_chunk.size) - 16, FILEIO_SEEK_CUR);
1725 if(file.Fread(&chunk, sizeof(chunk), 1) != 1) {
1729 if(strncmp(chunk.id, "data", 4) == 0) {
1732 file.Fseek(EndianFromLittle_DWORD(chunk.size), FILEIO_SEEK_CUR);
1736 // rhythm[i].rate = whdr.sample_rate;
1737 // rhythm[i].step = rhythm[i].rate * 1024 / rate;
1738 // rhythm[i].pos = rhythm[i].size = fsize * 1024;
1739 // delete rhythm[i].sample;
1740 // rhythm[i].sample = new int16[fsize];
1741 // memset(rhythm[i].sample, 0x00, fsize * 2);
1745 fsize = EndianFromLittle_DWORD(chunk.size);
1748 if ((fsize >= 0x100000) || (EndianFromLittle_WORD(whdr.format_id) != 1) || (EndianFromLittle_WORD(whdr.channels) != 1))
1750 fsize = Max(fsize, (1<<31)/1024);
1752 delete rhythm[i].sample;
1753 rhythm[i].sample = new int16[fsize];
1754 if (!rhythm[i].sample)
1756 for(int __iptr = 0; __iptr < fsize; __iptr++) {
1763 pair16.b.l = file.FgetUint8();
1764 pair16.b.h = file.FgetUint8();
1765 rhythm[i].sample[__iptr] = pair16.s16;
1767 //file.Fread(rhythm[i].sample, fsize * 2, 1);
1769 rhythm[i].rate = EndianFromLittle_DWORD(whdr.sample_rate);
1770 rhythm[i].step = rhythm[i].rate * 1024 / rate;
1771 rhythm[i].pos = rhythm[i].size = fsize * 1024;
1776 // printf("NG %d\n", i);
1779 delete[] rhythm[i].sample;
1780 rhythm[i].sample = 0;
1790 // ---------------------------------------------------------------------------
1791 //
\83\8c\83W
\83X
\83^
\83A
\83\8c\83C
\82É
\83f
\81[
\83^
\82ð
\90Ý
\92è
1793 void OPNA::SetReg(uint addr, uint data)
1801 // UpdateStatus(); //?
1804 // Rhythm ----------------------------------------------------------------
1805 case 0x10: // DM/KEYON
1806 if (!(data & 0x80)) // KEY ON
1808 rhythmkey |= data & 0x3f;
1809 if (data & 0x01) rhythm[0].pos = 0;
1810 if (data & 0x02) rhythm[1].pos = 0;
1811 if (data & 0x04) rhythm[2].pos = 0;
1812 if (data & 0x08) rhythm[3].pos = 0;
1813 if (data & 0x10) rhythm[4].pos = 0;
1814 if (data & 0x20) rhythm[5].pos = 0;
1823 rhythmtl = ~data & 63;
1826 case 0x18: // Bass Drum
1827 case 0x19: // Snare Drum
1828 case 0x1a: // Top Cymbal
1830 case 0x1c: // Tom-tom
1831 case 0x1d: // Rim shot
1832 rhythm[addr & 7].pan = (data >> 6) & 3;
1833 rhythm[addr & 7].level = ~data & 31;
1836 case 0x100: case 0x101:
1837 case 0x102: case 0x103:
1838 case 0x104: case 0x105:
1839 case 0x108: case 0x109:
1840 case 0x10a: case 0x10b:
1841 case 0x10c: case 0x10d:
1843 OPNABase::SetADPCMBReg(addr - 0x100, data);
1847 // for PC-8801FA/MA shop demonstration
1848 if ((control1 & 0x10) && (status & adpcmnotice)) {
1849 ResetStatus(adpcmnotice);
1854 OPNABase::SetReg(addr, data);
1860 // ---------------------------------------------------------------------------
1861 //
\83\8a\83Y
\83\80\8d\87\90¬
1863 void OPNA::RhythmMix(Sample* buffer, uint count)
1865 if ((rhythmtvol_l < 128 || rhythmtvol_r < 128) && rhythm[0].sample && (rhythmkey & 0x3f))
1867 Sample* limit = buffer + count * 2;
1868 for (int i=0; i<6; i++)
1870 Rhythm& r = rhythm[i];
1871 if ((rhythmkey & (1 << i)) && r.level < 128)
1873 int db_l = Limit(rhythmtl+rhythmtvol_l+r.level+r.volume_l, 127, -31);
1874 int db_r = Limit(rhythmtl+rhythmtvol_r+r.level+r.volume_r, 127, -31);
1875 int vol_l = tltable[FM_TLPOS+(db_l << (FM_TLBITS-7))] >> 4;
1876 int vol_r = tltable[FM_TLPOS+(db_r << (FM_TLBITS-7))] >> 4;
1877 int mask_l = -((r.pan >> 1) & 1);
1878 int mask_r = -(r.pan & 1);
1880 if (rhythmmask_ & (1 << i))
1882 mask_l = mask_r = 0;
1885 for (Sample* dest = buffer; dest<limit && r.pos < r.size; dest+=2)
1887 int sample_l = (r.sample[r.pos / 1024] * vol_l) >> 12;
1888 int sample_r = (r.sample[r.pos / 1024] * vol_r) >> 12;
1890 StoreSample(dest[0], sample_l & mask_l);
1891 StoreSample(dest[1], sample_r & mask_r);
1898 // ---------------------------------------------------------------------------
1901 void OPNA::SetVolumeRhythmTotal(int db_l, int db_r)
1903 db_l = Min(db_l, 20);
1904 db_r = Min(db_r, 20);
1906 rhythmtvol_l = -(db_l * 2 / 3);
1907 rhythmtvol_r = -(db_r * 2 / 3);
1910 void OPNA::SetVolumeRhythm(int index, int db_l, int db_r)
1912 db_l = Min(db_l, 20);
1913 db_r = Min(db_r, 20);
1915 rhythm[index].volume_l = -(db_l * 2 / 3);
1916 rhythm[index].volume_r = -(db_r * 2 / 3);
1919 void OPNA::SetVolumeADPCM(int db_l, int db_r)
1921 db_l = Min(db_l, 20);
1922 db_r = Min(db_r, 20);
1925 adpcmvol_l = int(65536.0 * pow(10.0, db_l / 40.0));
1929 adpcmvol_r = int(65536.0 * pow(10.0, db_r / 40.0));
1933 adpcmvolume_l = (adpcmvol_l * adpcmlevel) >> 12;
1934 adpcmvolume_r = (adpcmvol_r * adpcmlevel) >> 12;
1937 // ---------------------------------------------------------------------------
1939 // in: buffer
\8d\87\90¬
\90æ
1940 // nsamples
\8d\87\90¬
\83T
\83\93\83v
\83\8b\90\94
1942 void OPNA::Mix(Sample* buffer, int nsamples)
1944 FMMix(buffer, nsamples);
1945 psg.Mix(buffer, nsamples);
1946 ADPCMBMix(buffer, nsamples);
1947 RhythmMix(buffer, nsamples);
1950 // ---------------------------------------------------------------------------
1951 //
\83X
\83e
\81[
\83g
\83Z
\81[
\83u
1953 #define OPNA_STATE_VERSION 4
1955 void OPNA::DeclState()
1957 state_entry = new csp_state_utils(OPNA_STATE_VERSION, chip_num, _T("FMGEN::OPNA::"), csp_logger);
1959 OPNABase::DeclState();
1961 for(int i = 0; i < 6; i++) {
1962 DECL_STATE_ENTRY_UINT8_MEMBER((rhythm[i].pan), i);
1963 DECL_STATE_ENTRY_INT8_MEMBER((rhythm[i].level), i);
1964 DECL_STATE_ENTRY_UINT32_MEMBER((rhythm[i].pos), i);
1966 DECL_STATE_ENTRY_INT8(rhythmtl);
1967 DECL_STATE_ENTRY_INT32(rhythmtvol_l);
1968 DECL_STATE_ENTRY_INT32(rhythmtvol_r);
1969 DECL_STATE_ENTRY_UINT8(rhythmkey);
1971 void OPNA::SaveState(void *f)
1973 FILEIO *state_fio = (FILEIO *)f;
1975 OPNABase::SaveState(f);
1976 // state_fio->FputUint32_BE(OPNA_STATE_VERSION);
1978 // OPNABase::SaveState(f);
1979 // for(int i = 0; i < 6; i++) {
1980 // state_fio->FputUint8(rhythm[i].pan);
1981 // state_fio->FputInt8(rhythm[i].level);
1982 // state_fio->FputUint32_BE(rhythm[i].pos);
1984 // state_fio->FputInt8(rhythmtl);
1985 // state_fio->FputInt32_BE(rhythmtvol_l);
1986 // state_fio->FputInt32_BE(rhythmtvol_r);
1987 // state_fio->FputUint8(rhythmkey);
1990 bool OPNA::LoadState(void *f)
1992 FILEIO *state_fio = (FILEIO *)f;
1995 mb = OPNABase::LoadState(f);
1996 if(!mb) return false;
1997 // if(state_fio->FgetUint32_BE() != OPNA_STATE_VERSION) {
2000 // if(!OPNABase::LoadState(f)) {
2003 // for(int i = 0; i < 6; i++) {
2004 // rhythm[i].pan = state_fio->FgetUint8();
2005 // rhythm[i].level = state_fio->FgetInt8();
2006 // rhythm[i].pos = state_fio->FgetUint32_BE();
2008 // rhythmtl = state_fio->FgetInt8();
2009 // rhythmtvol_l = state_fio->FgetInt32_BE();
2010 // rhythmtvol_r = state_fio->FgetInt32_BE();
2011 // rhythmkey = state_fio->FgetUint8();
2015 #endif // BUILD_OPNA
2017 // ---------------------------------------------------------------------------
2019 // ---------------------------------------------------------------------------
2023 // ---------------------------------------------------------------------------
2030 for (int i=0; i<6; i++)
2033 adpcma[i].level = 0;
2034 adpcma[i].volume_l = 0;
2035 adpcma[i].volume_r = 0;
2038 adpcma[i].start = 0;
2040 adpcma[i].adpcmx = 0;
2041 adpcma[i].adpcmd = 0;
2048 adpcmnotice = 0x8000;
2059 // ---------------------------------------------------------------------------
2062 bool OPNB::Init(uint c, uint r, bool ipflag,
2063 uint8 *_adpcma, int _adpcma_size,
2064 uint8 *_adpcmb, int _adpcmb_size)
2067 if (!SetRate(c, r, ipflag))
2069 if (!OPNABase::Init(c, r, ipflag))
2072 adpcmabuf = _adpcma;
2073 adpcmasize = _adpcma_size;
2076 for (i=0; i<=24; i++) // max 16M bytes
2078 if (_adpcmb_size <= (1 << i))
2080 adpcmmask = (1 << i) - 1;
2085 // adpcmmask = _adpcmb_size - 1;
2086 limitaddr = adpcmmask;
2092 SetVolumeADPCMB(0, 0);
2093 SetVolumeADPCMATotal(0, 0);
2095 SetVolumeADPCMA(i, 0, 0);
2100 // ---------------------------------------------------------------------------
2101 //
\83\8a\83Z
\83b
\83g
2111 for (int i=0; i<6; i++)
2114 adpcma[i].level = 0;
2115 adpcma[i].volume_l = 0;
2116 adpcma[i].volume_r = 0;
2119 adpcma[i].start = 0;
2121 adpcma[i].adpcmx = 0;
2122 adpcma[i].adpcmd = 0;
2126 // ---------------------------------------------------------------------------
2127 //
\83T
\83\93\83v
\83\8a\83\93\83O
\83\8c\81[
\83g
\95Ï
\8dX
2129 bool OPNB::SetRate(uint c, uint r, bool ipflag)
2131 if (!OPNABase::SetRate(c, r, ipflag))
2134 adpcmastep = int(double(c) / 54 * 8192 / r);
2138 // ---------------------------------------------------------------------------
2139 //
\83\8c\83W
\83X
\83^
\83A
\83\8c\83C
\82É
\83f
\81[
\83^
\82ð
\90Ý
\92è
2141 void OPNB::SetReg(uint addr, uint data)
2147 // omitted registers
2149 case 0x2d: case 0x2e: case 0x2f:
2152 // ADPCM A ---------------------------------------------------------------
2153 case 0x100: // DM/KEYON
2154 if (!(data & 0x80)) // KEY ON
2156 adpcmakey |= data & 0x3f;
2157 for (int c=0; c<6; c++)
2161 ResetStatus(0x100 << c);
2162 adpcma[c].pos = adpcma[c].start;
2163 // adpcma[c].step = 0x10000 - adpcma[c].step;
2165 adpcma[c].adpcmx = 0;
2166 adpcma[c].adpcmd = 0;
2167 adpcma[c].nibble = 0;
2178 adpcmatl = ~data & 63;
2181 case 0x108: case 0x109: case 0x10a:
2182 case 0x10b: case 0x10c: case 0x10d:
2183 adpcma[addr & 7].pan = (data >> 6) & 3;
2184 adpcma[addr & 7].level = ~data & 31;
2187 case 0x110: case 0x111: case 0x112: // START ADDRESS (L)
2188 case 0x113: case 0x114: case 0x115:
2189 case 0x118: case 0x119: case 0x11a: // START ADDRESS (H)
2190 case 0x11b: case 0x11c: case 0x11d:
2191 adpcmareg[addr - 0x110] = data;
2192 adpcma[addr & 7].pos = adpcma[addr & 7].start =
2193 (adpcmareg[(addr&7)+8]*256+adpcmareg[addr&7]) << 9;
2196 case 0x120: case 0x121: case 0x122: // END ADDRESS (L)
2197 case 0x123: case 0x124: case 0x125:
2198 case 0x128: case 0x129: case 0x12a: // END ADDRESS (H)
2199 case 0x12b: case 0x12c: case 0x12d:
2200 adpcmareg[addr - 0x110] = data;
2201 adpcma[addr & 7].stop =
2202 (adpcmareg[(addr&7)+24]*256+adpcmareg[(addr&7)+16] + 1) << 9;
2205 // ADPCMB -----------------------------------------------------------------
2207 if ((data & 0x80) && !adpcmplay)
2210 memaddr = startaddr;
2211 adpcmx = 0, adpcmd = 127;
2216 control1 = data & 0x91;
2220 case 0x11: // Control Register 2
2221 control2 = data & 0xc0;
2224 case 0x12: // Start Address L
2225 case 0x13: // Start Address H
2226 adpcmreg[addr - 0x12 + 0] = data;
2227 startaddr = (adpcmreg[1]*256+adpcmreg[0]) << 9;
2228 memaddr = startaddr;
2231 case 0x14: // Stop Address L
2232 case 0x15: // Stop Address H
2233 adpcmreg[addr - 0x14 + 2] = data;
2234 stopaddr = (adpcmreg[3]*256+adpcmreg[2] + 1) << 9;
2235 // LOG1(" stopaddr %.6x", stopaddr);
2238 case 0x19: // delta-N L
2239 case 0x1a: // delta-N H
2240 adpcmreg[addr - 0x19 + 4] = data;
2241 deltan = adpcmreg[5]*256+adpcmreg[4];
2242 deltan = Max(256, deltan);
2243 adpld = deltan * adplbase >> 16;
2246 case 0x1b: // Level Control
2248 adpcmvolume_l = (adpcmvol_l * adpcmlevel) >> 12;
2249 adpcmvolume_r = (adpcmvol_r * adpcmlevel) >> 12;
2252 case 0x1c: // Flag Control
2253 stmask = ~((data & 0xbf) << 8);
2259 OPNABase::SetReg(addr, data);
2265 // ---------------------------------------------------------------------------
2266 //
\83\8c\83W
\83X
\83^
\8eæ
\93¾
2268 uint OPNB::GetReg(uint addr)
2271 return psg.GetReg(addr);
2276 // ---------------------------------------------------------------------------
2277 //
\8ag
\92£
\83X
\83e
\81[
\83^
\83X
\82ð
\93Ç
\82Ý
\82±
\82Þ
2279 uint OPNB::ReadStatusEx()
2281 return (status & stmask) >> 8;
2284 // ---------------------------------------------------------------------------
2287 int OPNB::jedi_table[(48+1)*16];
2289 void OPNB::InitADPCMATable()
2291 const static int8 table2[] =
2293 1, 3, 5, 7, 9, 11, 13, 15,
2294 -1, -3, -5, -7, -9,-11,-13,-15,
2297 for (int i=0; i<=48; i++)
2299 int s = int(16.0 * pow (1.1, i) * 3);
2300 for (int j=0; j<16; j++)
2302 jedi_table[i*16+j] = s * table2[j] / 8;
2307 // ---------------------------------------------------------------------------
2308 // ADPCMA
\8d\87\90¬
2310 void OPNB::ADPCMAMix(Sample* buffer, uint count)
2312 const static int decode_tableA1[16] =
2314 -1*16, -1*16, -1*16, -1*16, 2*16, 5*16, 7*16, 9*16,
2315 -1*16, -1*16, -1*16, -1*16, 2*16, 5*16, 7*16, 9*16
2318 if ((adpcmatvol_l < 128 || adpcmatvol_r < 128) && (adpcmakey & 0x3f))
2320 Sample* limit = buffer + count * 2;
2321 for (int i=0; i<6; i++)
2323 ADPCMA& r = adpcma[i];
2324 if ((adpcmakey & (1 << i)) && r.level < 128)
2326 uint mask_l = r.pan & 2 ? -1 : 0;
2327 uint mask_r = r.pan & 1 ? -1 : 0;
2328 if (rhythmmask_ & (1 << i))
2330 mask_l = mask_r = 0;
2333 int db_l = Limit(adpcmatl+adpcmatvol_l+r.level+r.volume_l, 127, -31);
2334 int db_r = Limit(adpcmatl+adpcmatvol_r+r.level+r.volume_r, 127, -31);
2335 int vol_l = tltable[FM_TLPOS+(db_l << (FM_TLBITS-7))] >> 4;
2336 int vol_r = tltable[FM_TLPOS+(db_r << (FM_TLBITS-7))] >> 4;
2338 Sample* dest = buffer;
2339 for ( ; dest<limit; dest+=2)
2341 r.step += adpcmastep;
2342 if (r.pos >= r.stop)
2344 SetStatus(0x100 << i);
2345 adpcmakey &= ~(1<<i);
2349 for (; r.step > 0x10000; r.step -= 0x10000)
2354 r.nibble = adpcmabuf[r.pos>>1];
2355 data = r.nibble >> 4;
2359 data = r.nibble & 0x0f;
2363 r.adpcmx += jedi_table[r.adpcmd + data];
2364 r.adpcmx = Limit(r.adpcmx, 2048*3-1, -2048*3);
2365 r.adpcmd += decode_tableA1[data];
2366 r.adpcmd = Limit(r.adpcmd, 48*16, 0);
2368 int sample_l = (r.adpcmx * vol_l) >> 10;
2369 int sample_r = (r.adpcmx * vol_r) >> 10;
2370 StoreSample(dest[0], sample_l & mask_l);
2371 StoreSample(dest[1], sample_r & mask_r);
2378 // ---------------------------------------------------------------------------
2381 void OPNB::SetVolumeADPCMATotal(int db_l, int db_r)
2383 db_l = Min(db_l, 20);
2384 db_r = Min(db_r, 20);
2386 adpcmatvol_l = -(db_l * 2 / 3);
2387 adpcmatvol_r = -(db_r * 2 / 3);
2390 void OPNB::SetVolumeADPCMA(int index, int db_l, int db_r)
2392 db_l = Min(db_l, 20);
2393 db_r = Min(db_r, 20);
2395 adpcma[index].volume_l = -(db_l * 2 / 3);
2396 adpcma[index].volume_r = -(db_r * 2 / 3);
2399 void OPNB::SetVolumeADPCMB(int db_l, int db_r)
2401 db_l = Min(db_l, 20);
2402 db_r = Min(db_r, 20);
2405 adpcmvol_l = int(65536.0 * pow(10.0, db_l / 40.0));
2409 adpcmvol_r = int(65536.0 * pow(10.0, db_r / 40.0));
2414 // ---------------------------------------------------------------------------
2416 // in: buffer
\8d\87\90¬
\90æ
2417 // nsamples
\8d\87\90¬
\83T
\83\93\83v
\83\8b\90\94
2419 void OPNB::Mix(Sample* buffer, int nsamples)
2421 FMMix(buffer, nsamples);
2422 psg.Mix(buffer, nsamples);
2423 ADPCMBMix(buffer, nsamples);
2424 ADPCMAMix(buffer, nsamples);
2427 #endif // BUILD_OPNB