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 "../../fileio.h"
17 #if defined(_USE_AGAR)
19 # define MAX_PATH AG_PATHNAME_MAX
25 # define MAX_PATH 2048
31 // OPN ch3
\82ª
\8fí
\82ÉPrepare
\82Ì
\91Î
\8fÛ
\82Æ
\82È
\82Á
\82Ä
\82µ
\82Ü
\82¤
\8fá
\8aQ
34 // ---------------------------------------------------------------------------
35 // 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¢
36 //
\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ª
37 //
\91½
\8f
\8cy
\82
\82È
\82é
\82©
\82à
39 //#define NO_BITTYPE_EMULATION
42 #include "../../fileio.h"
48 // ---------------------------------------------------------------------------
51 #if defined(BUILD_OPN) || defined(BUILD_OPNA) || defined (BUILD_OPNB)
53 uint32 OPNBase::lfotable[8]; // OPNA/B
\97p
60 //
\83p
\83\89\83\81\81[
\83^
\83Z
\83b
\83g
61 void OPNBase::SetParameter(Channel4* ch, uint addr, uint data)
63 const static uint slottable[4] = { 0, 2, 1, 3 };
64 const static uint8 sltable[16] =
66 0, 4, 8, 12, 16, 20, 24, 28,
67 32, 36, 40, 44, 48, 52, 56, 124,
72 uint slot = slottable[(addr >> 2) & 3];
73 Operator* op = &ch->op[slot];
75 switch ((addr >> 4) & 15)
77 case 3: // 30-3E DT/MULTI
78 op->SetDT((data >> 4) & 0x07);
79 op->SetMULTI(data & 0x0f);
83 op->SetTL(data & 0x7f, ((regtc & 0xc0) == 0x80) && (csmch == ch));
86 case 5: // 50-5E KS/AR
87 op->SetKS((data >> 6) & 3);
88 op->SetAR((data & 0x1f) * 2);
91 case 6: // 60-6E DR/AMON
92 op->SetDR((data & 0x1f) * 2);
93 op->SetAMON((data & 0x80) != 0);
97 op->SetSR((data & 0x1f) * 2);
100 case 8: // 80-8E SL/RR
101 op->SetSL(sltable[(data >> 4) & 15]);
102 op->SetRR((data & 0x0f) * 4 + 2);
105 case 9: // 90-9E SSG-EC
106 op->SetSSGEC(data & 0x0f);
112 //
\83\8a\83Z
\83b
\83g
113 void OPNBase::Reset()
122 //
\8a\84\82è
\8d\9e\82Ý
\90M
\8d\86\82Ì
\8eæ
\93¾
123 bool OPNBase::ReadIRQ()
128 //
\83v
\83\8a\83X
\83P
\81[
\83\89\90Ý
\92è
129 void OPNBase::SetPrescaler(uint p)
131 static const char table[3][2] = { { 6, 4 }, { 3, 2 }, { 2, 1 } };
132 static const uint8 table2[8] = { 108, 77, 71, 67, 62, 44, 8, 5 };
137 assert(0 <= prescale && prescale < 3);
139 uint fmclock = clock / table[p][0] / 12;
143 //
\8d\87\90¬
\8eü
\94g
\90\94\82Æ
\8fo
\97Í
\8eü
\94g
\90\94\82Ì
\94ä
144 assert(fmclock < (0x80000000 >> FM_RATIOBITS));
145 uint ratio = ((fmclock << FM_RATIOBITS) + rate/2) / rate;
147 SetTimerPrescaler(table[p][0] * 12);
148 // MakeTimeTable(ratio);
149 chip.SetRatio(ratio);
150 psg.SetClock(clock / table[p][1], psgrate);
152 for (int i=0; i<8; i++)
154 lfotable[i] = (ratio << (2+FM_LFOCBITS-FM_RATIOBITS)) / table2[i];
160 bool OPNBase::Init(uint c, uint r)
169 void OPNBase::SetVolumeFM(int db)
173 fmvolume = int(16384.0 * pow(10.0, db / 40.0));
178 //
\83^
\83C
\83}
\81[
\8e\9e\8aÔ
\8f\88\97\9d
179 void OPNBase::TimerA()
181 if ((regtc & 0xc0) == 0x80)
183 csmch->KeyControl(0x00);
184 csmch->KeyControl(0x0f);
188 //
\8a\84\82è
\8d\9e\82Ý
\90M
\8d\86\82Ì
\90Ý
\92è
189 void OPNBase::Intr(bool value)
194 // ---------------------------------------------------------------------------
195 //
\83X
\83e
\81[
\83g
\83Z
\81[
\83u
197 #define OPN_BASE_STATE_VERSION 1
199 void OPNBase::SaveState(void *f)
201 FILEIO *state_fio = (FILEIO *)f;
203 state_fio->FputUint32(OPN_BASE_STATE_VERSION);
206 state_fio->FputInt32(fmvolume);
207 state_fio->FputUint32(clock);
208 state_fio->FputUint32(rate);
209 state_fio->FputUint32(psgrate);
210 state_fio->FputUint32(status);
211 state_fio->FputBool(interrupt);
212 state_fio->FputUint8(prescale);
217 bool OPNBase::LoadState(void *f)
219 FILEIO *state_fio = (FILEIO *)f;
221 if(state_fio->FgetUint32() != OPN_BASE_STATE_VERSION) {
224 if(!Timer::LoadState(f)) {
227 fmvolume = state_fio->FgetInt32();
228 clock = state_fio->FgetUint32();
229 rate = state_fio->FgetUint32();
230 psgrate = state_fio->FgetUint32();
231 status = state_fio->FgetUint32();
232 interrupt = state_fio->FgetBool();
233 prescale = state_fio->FgetUint8();
234 if(!chip.LoadState(f)) {
237 if(!psg.LoadState(f)) {
243 #endif // defined(BUILD_OPN) || defined(BUILD_OPNA) || defined (BUILD_OPNB)
245 // ---------------------------------------------------------------------------
257 for (int i=0; i<3; i++)
259 ch[i].SetChip(&chip);
260 ch[i].SetType(typeN);
265 bool OPN::Init(uint c, uint r, bool ip, const char*)
267 if (!SetRate(c, r, ip))
278 //
\83T
\83\93\83v
\83\8a\83\93\83O
\83\8c\81[
\83g
\95Ï
\8dX
279 bool OPN::SetRate(uint c, uint r, bool)
287 //
\83\8a\83Z
\83b
\83g
291 for (i=0x20; i<0x28; i++) SetReg(i, 0);
292 for (i=0x30; i<0xc0; i++) SetReg(i, 0);
300 //
\83\8c\83W
\83X
\83^
\93Ç
\82Ý
\8d\9e\82Ý
301 uint OPN::GetReg(uint addr)
304 return psg.GetReg(addr);
310 //
\83\8c\83W
\83X
\83^
\83A
\83\8c\83C
\82É
\83f
\81[
\83^
\82ð
\90Ý
\92è
311 void OPN::SetReg(uint addr, uint data)
313 // LOG2("reg[%.2x] <- %.2x\n", addr, data);
321 case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7:
322 case 8: case 9: case 10: case 11: case 12: case 13: case 14: case 15:
323 psg.SetReg(addr, data);
326 case 0x24: case 0x25:
327 SetTimerA(addr, data);
335 SetTimerControl(data);
338 case 0x28: // Key On/Off
339 if ((data & 3) < 3) ch[data & 3].KeyControl(data >> 4);
342 case 0x2d: case 0x2e: case 0x2f:
343 SetPrescaler(addr-0x2d);
347 case 0xa0: case 0xa1: case 0xa2:
348 if (c <= 2) fnum[c] = data + fnum2[c] * 0x100;
351 case 0xa4: case 0xa5: case 0xa6:
352 fnum2[c] = uint8(data);
355 case 0xa8: case 0xa9: case 0xaa:
356 if(c < 3) fnum3[c] = data + fnum2[c+3] * 0x100;
359 case 0xac: case 0xad: case 0xae:
360 fnum2[c+3] = uint8(data);
363 case 0xb0: case 0xb1: case 0xb2:
364 ch[c].SetFB((data >> 3) & 7);
365 ch[c].SetAlgorithm(data & 7);
371 if ((addr & 0xf0) == 0x60)
373 OPNBase::SetParameter(&ch[c], addr, data);
379 //
\83X
\83e
\81[
\83^
\83X
\83t
\83\89\83O
\90Ý
\92è
380 void OPN::SetStatus(uint bits)
382 if (!(status & bits))
389 void OPN::ResetStatus(uint bit)
396 //
\83}
\83X
\83N
\90Ý
\92è
397 void OPN::SetChannelMask(uint mask)
399 for (int i=0; i<3; i++)
400 ch[i].Mute(!!(mask & (1 << i)));
401 psg.SetChannelMask(mask >> 6);
406 void OPN::Mix(Sample* buffer, int nsamples)
408 #define IStoSample(s) ((Limit(s, 0x7fff, -0x8000) * fmvolume) >> 14)
410 psg.Mix(buffer, nsamples);
413 ch[0].SetFNum(fnum[0]);
414 ch[1].SetFNum(fnum[1]);
416 ch[2].SetFNum(fnum[2]);
419 ch[2].op[0].SetFNum(fnum3[1]);
420 ch[2].op[1].SetFNum(fnum3[2]);
421 ch[2].op[2].SetFNum(fnum3[0]);
422 ch[2].op[3].SetFNum(fnum[2]);
425 int actch = (((ch[2].Prepare() << 2) | ch[1].Prepare()) << 2) | ch[0].Prepare();
428 Sample* limit = buffer + nsamples * 2;
429 for (Sample* dest = buffer; dest < limit; dest+=2)
432 if (actch & 0x01) s = ch[0].Calc();
433 if (actch & 0x04) s += ch[1].Calc();
434 if (actch & 0x10) s += ch[2].Calc();
436 StoreSample(dest[0], s);
437 StoreSample(dest[1], s);
443 // ---------------------------------------------------------------------------
444 //
\83X
\83e
\81[
\83g
\83Z
\81[
\83u
446 #define OPN_STATE_VERSION 1
448 void OPN::SaveState(void *f)
450 FILEIO *state_fio = (FILEIO *)f;
452 state_fio->FputUint32(OPN_STATE_VERSION);
454 OPNBase::SaveState(f);
455 state_fio->Fwrite(fnum, sizeof(fnum), 1);
456 state_fio->Fwrite(fnum3, sizeof(fnum3), 1);
457 state_fio->Fwrite(fnum2, sizeof(fnum2), 1);
458 for(int i = 0; i < 3; i++) {
463 bool OPN::LoadState(void *f)
465 FILEIO *state_fio = (FILEIO *)f;
467 if(state_fio->FgetUint32() != OPN_STATE_VERSION) {
470 if(!OPNBase::LoadState(f)) {
473 state_fio->Fread(fnum, sizeof(fnum), 1);
474 state_fio->Fread(fnum3, sizeof(fnum3), 1);
475 state_fio->Fread(fnum2, sizeof(fnum2), 1);
476 for(int i = 0; i < 3; i++) {
477 if(!ch[i].LoadState(f)) {
486 // ---------------------------------------------------------------------------
487 // YM2608/2610 common part
488 // ---------------------------------------------------------------------------
490 #if defined(BUILD_OPNA) || defined(BUILD_OPNB)
492 int OPNABase::amtable[FM_LFOENTS] = { -1, };
493 int OPNABase::pmtable[FM_LFOENTS];
495 int32 OPNABase::tltable[FM_TLENTS+FM_TLPOS];
496 bool OPNABase::tablehasmade = false;
510 for (int i=0; i<6; i++)
512 ch[i].SetChip(&chip);
513 ch[i].SetType(typeN);
517 OPNABase::~OPNABase()
521 // ---------------------------------------------------------------------------
524 bool OPNABase::Init(uint c, uint r, bool)
536 // ---------------------------------------------------------------------------
537 //
\83e
\81[
\83u
\83\8b\8dì
\90¬
539 void OPNABase::MakeTable2()
543 for (int i=-FM_TLPOS; i<FM_TLENTS; i++)
545 tltable[i+FM_TLPOS] = uint(65536. * pow(2.0, i * -16. / FM_TLENTS))-1;
552 // ---------------------------------------------------------------------------
553 //
\83\8a\83Z
\83b
\83g
555 void OPNABase::Reset()
560 for (i=0x20; i<0x28; i++) SetReg(i, 0);
561 for (i=0x30; i<0xc0; i++) SetReg(i, 0);
562 for (i=0x130; i<0x1c0; i++) SetReg(i, 0);
563 for (i=0x100; i<0x110; i++) SetReg(i, 0);
564 for (i=0x10; i<0x20; i++) SetReg(i, 0);
578 apout0 = apout1 = adpcmout = 0;
587 // ---------------------------------------------------------------------------
588 //
\83T
\83\93\83v
\83\8a\83\93\83O
\83\8c\81[
\83g
\95Ï
\8dX
590 bool OPNABase::SetRate(uint c, uint r, bool)
592 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¤
596 adplbase = int(8192. * (clock/72.) / r);
597 adpld = deltan * adplbase >> 16;
601 lfodcount = reg22 & 0x08 ? lfotable[reg22 & 7] : 0;
606 // ---------------------------------------------------------------------------
607 //
\83`
\83\83\83\93\83l
\83\8b\83}
\83X
\83N
\82Ì
\90Ý
\92è
609 void OPNABase::SetChannelMask(uint mask)
611 for (int i=0; i<6; i++)
612 ch[i].Mute(!!(mask & (1 << i)));
613 psg.SetChannelMask(mask >> 6);
614 adpcmmask_ = (mask & (1 << 9)) != 0;
615 rhythmmask_ = (mask >> 10) & ((1 << 6) - 1);
618 // ---------------------------------------------------------------------------
619 //
\83\8c\83W
\83X
\83^
\83A
\83\8c\83C
\82É
\83f
\81[
\83^
\82ð
\90Ý
\92è
621 void OPNABase::SetReg(uint addr, uint data)
628 // Timer -----------------------------------------------------------------
629 case 0x24: case 0x25:
630 SetTimerA(addr, data);
638 SetTimerControl(data);
641 // Misc ------------------------------------------------------------------
642 case 0x28: // Key On/Off
645 c = (data & 3) + (data & 4 ? 3 : 0);
646 ch[c].KeyControl(data >> 4);
650 // Status Mask -----------------------------------------------------------
653 // UpdateStatus(); //?
656 // Prescaler -------------------------------------------------------------
657 case 0x2d: case 0x2e: case 0x2f:
658 SetPrescaler(addr-0x2d);
661 // F-Number --------------------------------------------------------------
662 case 0x1a0: case 0x1a1: case 0x1a2:
664 case 0xa0: case 0xa1: case 0xa2:
665 fnum[c] = data + fnum2[c] * 0x100;
666 ch[c].SetFNum(fnum[c]);
669 case 0x1a4: case 0x1a5: case 0x1a6:
671 case 0xa4 : case 0xa5: case 0xa6:
672 fnum2[c] = uint8(data);
675 case 0xa8: case 0xa9: case 0xaa:
676 fnum3[c] = data + fnum2[c+6] * 0x100;
679 case 0xac : case 0xad: case 0xae:
680 fnum2[c+6] = uint8(data);
683 // Algorithm -------------------------------------------------------------
685 case 0x1b0: case 0x1b1: case 0x1b2:
687 case 0xb0: case 0xb1: case 0xb2:
688 ch[c].SetFB((data >> 3) & 7);
689 ch[c].SetAlgorithm(data & 7);
692 case 0x1b4: case 0x1b5: case 0x1b6:
694 case 0xb4: case 0xb5: case 0xb6:
695 pan[c] = (data >> 6) & 3;
699 // LFO -------------------------------------------------------------------
701 modified = reg22 ^ data;
705 lfodcount = reg22 & 8 ? lfotable[reg22 & 7] : 0;
708 // PSG -------------------------------------------------------------------
709 case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7:
710 case 8: case 9: case 10: case 11: case 12: case 13: case 14: case 15:
711 psg.SetReg(addr, data);
714 //
\89¹
\90F ------------------------------------------------------------------
720 OPNBase::SetParameter(&ch[c], addr, data);
726 // ---------------------------------------------------------------------------
729 void OPNABase::SetADPCMBReg(uint addr, uint data)
733 case 0x00: // Control Register 1
734 if ((data & 0x80) && !adpcmplay)
738 adpcmx = 0, adpcmd = 127;
748 case 0x01: // Control Register 2
750 granuality = control2 & 2 ? 1 : 4;
753 case 0x02: // Start Address L
754 case 0x03: // Start Address H
755 adpcmreg[addr - 0x02 + 0] = data;
756 startaddr = (adpcmreg[1]*256+adpcmreg[0]) << 6;
758 // LOG1(" startaddr %.6x", startaddr);
761 case 0x04: // Stop Address L
762 case 0x05: // Stop Address H
763 adpcmreg[addr - 0x04 + 2] = data;
764 stopaddr = (adpcmreg[3]*256+adpcmreg[2] + 1) << 6;
765 // LOG1(" stopaddr %.6x", stopaddr);
768 case 0x08: // ADPCM data
769 if ((control1 & 0x60) == 0x60)
771 // LOG2(" Wr [0x%.5x] = %.2x", memaddr, data);
776 case 0x09: // delta-N L
777 case 0x0a: // delta-N H
778 adpcmreg[addr - 0x09 + 4] = data;
779 deltan = adpcmreg[5]*256+adpcmreg[4];
780 deltan = Max(256, deltan);
781 adpld = deltan * adplbase >> 16;
784 case 0x0b: // Level Control
786 adpcmvolume = (adpcmvol * adpcmlevel) >> 12;
789 case 0x0c: // Limit Address L
790 case 0x0d: // Limit Address H
791 adpcmreg[addr - 0x0c + 6] = data;
792 limitaddr = (adpcmreg[7]*256+adpcmreg[6] + 1) << 6;
793 // LOG1(" limitaddr %.6x", limitaddr);
796 case 0x10: // Flag Control
804 stmask = ~(data & 0x1f);
805 // UpdateStatus(); //???
812 // ---------------------------------------------------------------------------
813 //
\83\8c\83W
\83X
\83^
\8eæ
\93¾
815 uint OPNA::GetReg(uint addr)
818 return psg.GetReg(addr);
822 // LOG1("%d:reg[108] -> ", Diag::GetCPUTick());
824 uint data = adpcmreadbuf & 0xff;
826 if ((control1 & 0x60) == 0x20)
828 adpcmreadbuf |= ReadRAM() << 8;
829 // LOG2("Rd [0x%.6x:%.2x] ", memaddr, adpcmreadbuf >> 8);
844 // ---------------------------------------------------------------------------
845 //
\83X
\83e
\81[
\83^
\83X
\83t
\83\89\83O
\90Ý
\92è
847 void OPNABase::SetStatus(uint bits)
849 if (!(status & bits))
851 // LOG2("SetStatus(%.2x %.2x)\n", bits, stmask);
852 status |= bits & stmask;
856 // LOG1("SetStatus(%.2x) - ignored\n", bits);
859 void OPNABase::ResetStatus(uint bits)
862 // LOG1("ResetStatus(%.2x)\n", bits);
866 inline void OPNABase::UpdateStatus()
868 // LOG2("%d:INT = %d\n", Diag::GetCPUTick(), (status & stmask & reg29) != 0);
869 Intr((status & stmask & reg29) != 0);
872 // ---------------------------------------------------------------------------
873 // ADPCM RAM
\82Ö
\82Ì
\8f\91\8d\9e\82Ý
\91\80\8dì
875 void OPNABase::WriteRAM(uint data)
877 #ifndef NO_BITTYPE_EMULATION
881 adpcmbuf[(memaddr >> 4) & 0x3ffff] = data;
887 uint8* p = &adpcmbuf[(memaddr >> 4) & 0x7fff];
888 uint bank = (memaddr >> 1) & 7;
889 uint8 mask = 1 << bank;
892 p[0x00000] = (p[0x00000] & ~mask) | (uint8(data) & mask); data >>= 1;
893 p[0x08000] = (p[0x08000] & ~mask) | (uint8(data) & mask); data >>= 1;
894 p[0x10000] = (p[0x10000] & ~mask) | (uint8(data) & mask); data >>= 1;
895 p[0x18000] = (p[0x18000] & ~mask) | (uint8(data) & mask); data >>= 1;
896 p[0x20000] = (p[0x20000] & ~mask) | (uint8(data) & mask); data >>= 1;
897 p[0x28000] = (p[0x28000] & ~mask) | (uint8(data) & mask); data >>= 1;
898 p[0x30000] = (p[0x30000] & ~mask) | (uint8(data) & mask); data >>= 1;
899 p[0x38000] = (p[0x38000] & ~mask) | (uint8(data) & mask);
903 adpcmbuf[(memaddr >> granuality) & 0x3ffff] = data;
904 memaddr += 1 << granuality;
907 if (memaddr == stopaddr)
910 statusnext = 0x04; // EOS
913 if (memaddr == limitaddr)
915 // LOG1("Limit ! (%.8x)\n", limitaddr);
921 // ---------------------------------------------------------------------------
922 // ADPCM RAM
\82©
\82ç
\82Ì
\93Ç
\82Ý
\8d\9e\82Ý
\91\80\8dì
924 uint OPNABase::ReadRAM()
927 #ifndef NO_BITTYPE_EMULATION
931 data = adpcmbuf[(memaddr >> 4) & 0x3ffff];
937 uint8* p = &adpcmbuf[(memaddr >> 4) & 0x7fff];
938 uint bank = (memaddr >> 1) & 7;
939 uint8 mask = 1 << bank;
941 data = (p[0x38000] & mask);
942 data = data * 2 + (p[0x30000] & mask);
943 data = data * 2 + (p[0x28000] & mask);
944 data = data * 2 + (p[0x20000] & mask);
945 data = data * 2 + (p[0x18000] & mask);
946 data = data * 2 + (p[0x10000] & mask);
947 data = data * 2 + (p[0x08000] & mask);
948 data = data * 2 + (p[0x00000] & mask);
953 data = adpcmbuf[(memaddr >> granuality) & 0x3ffff];
954 memaddr += 1 << granuality;
956 if (memaddr == stopaddr)
959 statusnext = 0x04; // EOS
962 if (memaddr == limitaddr)
964 // LOG1("Limit ! (%.8x)\n", limitaddr);
967 if (memaddr < stopaddr)
973 inline int OPNABase::DecodeADPCMBSample(uint data)
975 static const int table1[16] =
977 1, 3, 5, 7, 9, 11, 13, 15,
978 -1, -3, -5, -7, -9, -11, -13, -15,
980 static const int table2[16] =
982 57, 57, 57, 57, 77, 102, 128, 153,
983 57, 57, 57, 57, 77, 102, 128, 153,
985 adpcmx = Limit(adpcmx + table1[data] * adpcmd / 8, 32767, -32768);
986 adpcmd = Limit(adpcmd * table2[data] / 64, 24576, 127);
991 // ---------------------------------------------------------------------------
992 // ADPCM RAM
\82©
\82ç
\82Ì nibble
\93Ç
\82Ý
\8d\9e\82Ý
\8by
\82Ñ ADPCM
\93W
\8aJ
994 int OPNABase::ReadRAMN()
999 #ifndef NO_BITTYPE_EMULATION
1000 if (!(control2 & 2))
1002 data = adpcmbuf[(memaddr >> 4) & 0x3ffff];
1005 return DecodeADPCMBSample(data >> 4);
1010 uint8* p = &adpcmbuf[(memaddr >> 4) & 0x7fff] + ((~memaddr & 1) << 17);
1011 uint bank = (memaddr >> 1) & 7;
1012 uint8 mask = 1 << bank;
1014 data = (p[0x18000] & mask);
1015 data = data * 2 + (p[0x10000] & mask);
1016 data = data * 2 + (p[0x08000] & mask);
1017 data = data * 2 + (p[0x00000] & mask);
1021 return DecodeADPCMBSample(data);
1024 data = adpcmbuf[(memaddr >> granuality) & adpcmmask];
1025 memaddr += 1 << (granuality-1);
1026 if (memaddr & (1 << (granuality-1)))
1027 return DecodeADPCMBSample(data >> 4);
1033 data = adpcmbuf[(memaddr >> 1) & adpcmmask];
1036 return DecodeADPCMBSample(data >> 4);
1040 DecodeADPCMBSample(data);
1043 if (memaddr == stopaddr)
1045 if (control1 & 0x10)
1047 memaddr = startaddr;
1049 adpcmx = 0, adpcmd = 127;
1054 memaddr &= adpcmmask; //0x3fffff;
1055 SetStatus(adpcmnotice);
1060 if (memaddr == limitaddr)
1066 // ---------------------------------------------------------------------------
1067 //
\8ag
\92£
\83X
\83e
\81[
\83^
\83X
\82ð
\93Ç
\82Ý
\82±
\82Þ
1069 uint OPNABase::ReadStatusEx()
1071 uint r = ((status | 8) & stmask) | (adpcmplay ? 0x20 : 0);
1072 status |= statusnext;
1077 // ---------------------------------------------------------------------------
1080 inline void OPNABase::DecodeADPCMB()
1083 int n = (ReadRAMN() * adpcmvolume) >> 13;
1084 apout1 = adpcmout + n;
1088 // ---------------------------------------------------------------------------
1091 void OPNABase::ADPCMBMix(Sample* dest, uint count)
1093 uint maskl = control2 & 0x80 ? -1 : 0;
1094 uint maskr = control2 & 0x40 ? -1 : 0;
1102 // LOG2("ADPCM Play: %d DeltaN: %d\n", adpld, deltan);
1103 if (adpld <= 8192) // fplay < fsamp
1105 for (; count>0; count--)
1114 int s = (adplc * apout0 + (8192-adplc) * apout1) >> 13;
1115 StoreSample(dest[0], s & maskl);
1116 StoreSample(dest[1], s & maskr);
1120 for (; count>0 && apout0; count--)
1124 apout0 = apout1, apout1 = 0;
1127 int s = (adplc * apout1) >> 13;
1128 StoreSample(dest[0], s & maskl);
1129 StoreSample(dest[1], s & maskr);
1134 else // fplay > fsamp (adpld = fplay/famp*8192)
1136 int t = (-8192*8192)/adpld;
1137 for (; count>0; count--)
1139 int s = apout0 * (8192+adplc);
1145 s -= apout0 * Max(adplc, t);
1150 StoreSample(dest[0], s & maskl);
1151 StoreSample(dest[1], s & maskr);
1160 apout0 = apout1 = adpcmout = 0;
1165 // ---------------------------------------------------------------------------
1167 // in: buffer
\8d\87\90¬
\90æ
1168 // nsamples
\8d\87\90¬
\83T
\83\93\83v
\83\8b\90\94
1170 void OPNABase::FMMix(Sample* buffer, int nsamples)
1176 if (!(regtc & 0xc0))
1177 csmch->SetFNum(fnum[csmch-ch]);
1180 //
\8cø
\89Ê
\89¹
\83\82\81[
\83h
1181 csmch->op[0].SetFNum(fnum3[1]); csmch->op[1].SetFNum(fnum3[2]);
1182 csmch->op[2].SetFNum(fnum3[0]); csmch->op[3].SetFNum(fnum[2]);
1185 int act = (((ch[2].Prepare() << 2) | ch[1].Prepare()) << 2) | ch[0].Prepare();
1187 act |= (ch[3].Prepare() | ((ch[4].Prepare() | (ch[5].Prepare() << 2)) << 2)) << 6;
1188 if (!(reg22 & 0x08))
1193 Mix6(buffer, nsamples, act);
1198 // ---------------------------------------------------------------------------
1200 void OPNABase::MixSubSL(int activech, ISample** dest)
1202 if (activech & 0x001) (*dest[0] = ch[0].CalcL());
1203 if (activech & 0x004) (*dest[1] += ch[1].CalcL());
1204 if (activech & 0x010) (*dest[2] += ch[2].CalcL());
1205 if (activech & 0x040) (*dest[3] += ch[3].CalcL());
1206 if (activech & 0x100) (*dest[4] += ch[4].CalcL());
1207 if (activech & 0x400) (*dest[5] += ch[5].CalcL());
1210 inline void OPNABase::MixSubS(int activech, ISample** dest)
1212 if (activech & 0x001) (*dest[0] = ch[0].Calc());
1213 if (activech & 0x004) (*dest[1] += ch[1].Calc());
1214 if (activech & 0x010) (*dest[2] += ch[2].Calc());
1215 if (activech & 0x040) (*dest[3] += ch[3].Calc());
1216 if (activech & 0x100) (*dest[4] += ch[4].Calc());
1217 if (activech & 0x400) (*dest[5] += ch[5].Calc());
1220 // ---------------------------------------------------------------------------
1222 void OPNABase::BuildLFOTable()
1224 if (amtable[0] == -1)
1226 for (int c=0; c<256; c++)
1229 if (c < 0x40) v = c * 2 + 0x80;
1230 else if (c < 0xc0) v = 0x7f - (c - 0x40) * 2 + 0x80;
1231 else v = (c - 0xc0) * 2;
1234 if (c < 0x80) v = 0xff - c * 2;
1235 else v = (c - 0x80) * 2;
1236 amtable[c] = v & ~3;
1241 // ---------------------------------------------------------------------------
1243 inline void OPNABase::LFO()
1245 // LOG3("%4d - %8d, %8d\n", c, lfocount, lfodcount);
1247 // Operator::SetPML(pmtable[(lfocount >> (FM_LFOCBITS+1)) & 0xff]);
1248 // Operator::SetAML(amtable[(lfocount >> (FM_LFOCBITS+1)) & 0xff]);
1249 chip.SetPML(pmtable[(lfocount >> (FM_LFOCBITS+1)) & 0xff]);
1250 chip.SetAML(amtable[(lfocount >> (FM_LFOCBITS+1)) & 0xff]);
1251 lfocount += lfodcount;
1254 // ---------------------------------------------------------------------------
1257 #define IStoSample(s) ((Limit(s, 0x7fff, -0x8000) * fmvolume) >> 14)
1259 void OPNABase::Mix6(Sample* buffer, int nsamples, int activech)
1264 idest[0] = &ibuf[pan[0]];
1265 idest[1] = &ibuf[pan[1]];
1266 idest[2] = &ibuf[pan[2]];
1267 idest[3] = &ibuf[pan[3]];
1268 idest[4] = &ibuf[pan[4]];
1269 idest[5] = &ibuf[pan[5]];
1271 Sample* limit = buffer + nsamples * 2;
1272 for (Sample* dest = buffer; dest < limit; dest+=2)
1274 ibuf[1] = ibuf[2] = ibuf[3] = 0;
1275 if (activech & 0xaaa)
1276 LFO(), MixSubSL(activech, idest);
1278 MixSubS(activech, idest);
1279 StoreSample(dest[0], IStoSample(ibuf[2] + ibuf[3]));
1280 StoreSample(dest[1], IStoSample(ibuf[1] + ibuf[3]));
1284 // ---------------------------------------------------------------------------
1285 //
\83X
\83e
\81[
\83g
\83Z
\81[
\83u
1287 #define OPNA_BASE_STATE_VERSION 1
1289 void OPNABase::SaveState(void *f)
1291 FILEIO *state_fio = (FILEIO *)f;
1293 state_fio->FputUint32(OPNA_BASE_STATE_VERSION);
1295 OPNBase::SaveState(f);
1296 state_fio->Fwrite(pan, sizeof(pan), 1);
1297 state_fio->Fwrite(fnum2, sizeof(fnum2), 1);
1298 state_fio->FputUint8(reg22);
1299 state_fio->FputUint32(reg29);
1300 state_fio->FputUint32(stmask);
1301 state_fio->FputUint32(statusnext);
1302 state_fio->FputUint32(lfocount);
1303 state_fio->FputUint32(lfodcount);
1304 state_fio->Fwrite(fnum, sizeof(fnum), 1);
1305 state_fio->Fwrite(fnum3, sizeof(fnum3), 1);
1306 state_fio->Fwrite(adpcmbuf, 0x40000, 1);
1307 state_fio->FputUint32(adpcmmask);
1308 state_fio->FputUint32(adpcmnotice);
1309 state_fio->FputUint32(startaddr);
1310 state_fio->FputUint32(stopaddr);
1311 state_fio->FputUint32(memaddr);
1312 state_fio->FputUint32(limitaddr);
1313 state_fio->FputInt32(adpcmlevel);
1314 state_fio->FputInt32(adpcmvolume);
1315 state_fio->FputInt32(adpcmvol);
1316 state_fio->FputUint32(deltan);
1317 state_fio->FputInt32(adplc);
1318 state_fio->FputInt32(adpld);
1319 state_fio->FputUint32(adplbase);
1320 state_fio->FputInt32(adpcmx);
1321 state_fio->FputInt32(adpcmd);
1322 state_fio->FputInt32(adpcmout);
1323 state_fio->FputInt32(apout0);
1324 state_fio->FputInt32(apout1);
1325 state_fio->FputUint32(adpcmreadbuf);
1326 state_fio->FputBool(adpcmplay);
1327 state_fio->FputInt8(granuality);
1328 state_fio->FputBool(adpcmmask_);
1329 state_fio->FputUint8(control1);
1330 state_fio->FputUint8(control2);
1331 state_fio->Fwrite(adpcmreg, sizeof(adpcmreg), 1);
1332 state_fio->FputInt32(rhythmmask_);
1333 for(int i = 0; i < 6; i++) {
1338 bool OPNABase::LoadState(void *f)
1340 FILEIO *state_fio = (FILEIO *)f;
1342 if(state_fio->FgetUint32() != OPNA_BASE_STATE_VERSION) {
1345 if(!OPNBase::LoadState(f)) {
1348 state_fio->Fread(pan, sizeof(pan), 1);
1349 state_fio->Fread(fnum2, sizeof(fnum2), 1);
1350 reg22 = state_fio->FgetUint8();
1351 reg29 = state_fio->FgetUint32();
1352 stmask = state_fio->FgetUint32();
1353 statusnext = state_fio->FgetUint32();
1354 lfocount = state_fio->FgetUint32();
1355 lfodcount = state_fio->FgetUint32();
1356 state_fio->Fread(fnum, sizeof(fnum), 1);
1357 state_fio->Fread(fnum3, sizeof(fnum3), 1);
1358 state_fio->Fread(adpcmbuf, 0x40000, 1);
1359 adpcmmask = state_fio->FgetUint32();
1360 adpcmnotice = state_fio->FgetUint32();
1361 startaddr = state_fio->FgetUint32();
1362 stopaddr = state_fio->FgetUint32();
1363 memaddr = state_fio->FgetUint32();
1364 limitaddr = state_fio->FgetUint32();
1365 adpcmlevel = state_fio->FgetInt32();
1366 adpcmvolume = state_fio->FgetInt32();
1367 adpcmvol = state_fio->FgetInt32();
1368 deltan = state_fio->FgetUint32();
1369 adplc = state_fio->FgetInt32();
1370 adpld = state_fio->FgetInt32();
1371 adplbase = state_fio->FgetUint32();
1372 adpcmx = state_fio->FgetInt32();
1373 adpcmd = state_fio->FgetInt32();
1374 adpcmout = state_fio->FgetInt32();
1375 apout0 = state_fio->FgetInt32();
1376 apout1 = state_fio->FgetInt32();
1377 adpcmreadbuf = state_fio->FgetUint32();
1378 adpcmplay = state_fio->FgetBool();
1379 granuality = state_fio->FgetInt8();
1380 adpcmmask_ = state_fio->FgetBool();
1381 control1 = state_fio->FgetUint8();
1382 control2 = state_fio->FgetUint8();
1383 state_fio->Fread(adpcmreg, sizeof(adpcmreg), 1);
1384 rhythmmask_ = state_fio->FgetInt32();
1385 for(int i = 0; i < 6; i++) {
1386 if(!ch[i].LoadState(f)) {
1393 #endif // defined(BUILD_OPNA) || defined(BUILD_OPNB)
1395 // ---------------------------------------------------------------------------
1397 // ---------------------------------------------------------------------------
1401 // ---------------------------------------------------------------------------
1406 for (int i=0; i<6; i++)
1408 rhythm[i].sample = 0;
1411 rhythm[i].volume = 0;
1412 rhythm[i].level = 0;
1416 adpcmmask = 0x3ffff;
1421 // ---------------------------------------------------------------------------
1426 for (int i=0; i<6; i++)
1427 delete[] rhythm[i].sample;
1432 // ---------------------------------------------------------------------------
1435 bool OPNA::Init(uint c, uint r, bool ipflag, const _TCHAR* path)
1438 LoadRhythmSample(path);
1441 adpcmbuf = new uint8[0x40000];
1445 if (!SetRate(c, r, ipflag))
1447 if (!OPNABase::Init(c, r, ipflag))
1453 SetVolumeRhythmTotal(0);
1454 for (int i=0; i<6; i++)
1455 SetVolumeRhythm(i, 0);
1459 // ---------------------------------------------------------------------------
1460 //
\83\8a\83Z
\83b
\83g
1467 limitaddr = 0x3ffff;
1471 // ---------------------------------------------------------------------------
1472 //
\83T
\83\93\83v
\83\8a\83\93\83O
\83\8c\81[
\83g
\95Ï
\8dX
1474 bool OPNA::SetRate(uint c, uint r, bool ipflag)
1476 if (!OPNABase::SetRate(c, r, ipflag))
1479 for (int i=0; i<6; i++)
1481 rhythm[i].step = rhythm[i].rate * 1024 / r;
1487 // ---------------------------------------------------------------------------
1488 //
\83\8a\83Y
\83\80\89¹
\82ð
\93Ç
\82Ý
\82±
\82Þ
1490 bool OPNA::LoadRhythmSample(const _TCHAR* path)
1492 static const _TCHAR* rhythmname[6] =
1494 _T("BD"), _T("SD"), _T("TOP"), _T("HH"), _T("TOM"), _T("RIM"),
1505 _TCHAR buf[MAX_PATH] = _T("");
1507 _tcsncpy(buf, path, MAX_PATH);
1508 _tcsncat(buf, _T("2608_"), MAX_PATH);
1509 _tcsncat(buf, rhythmname[i], MAX_PATH);
1510 _tcsncat(buf, _T(".WAV"), MAX_PATH);
1512 if (!file.Fopen(buf, FILEIO_READ_BINARY))
1517 _tcsncpy(buf, path, MAX_PATH);
1518 _tcsncpy(buf, _T("2608_RYM.WAV"), MAX_PATH);
1519 if (!file.Fopen(buf, FILEIO_READ_BINARY))
1535 file.Fseek(0x10, FILEIO_SEEK_SET);
1536 file.Fread(&whdr, sizeof(whdr), 1);
1538 uint8 subchunkname[4];
1539 fsize = 4 + whdr.chunksize - sizeof(whdr);
1542 file.Fseek(fsize, FILEIO_SEEK_CUR);
1543 file.Fread(&subchunkname, 4, 1);
1544 file.Fread(&fsize, 4, 1);
1545 } while (memcmp("data", subchunkname, 4));
1548 if (fsize >= 0x100000 || whdr.tag != 1 || whdr.nch != 1)
1550 fsize = Max(fsize, (1<<31)/1024);
1552 delete rhythm[i].sample;
1553 rhythm[i].sample = new int16[fsize];
1554 if (!rhythm[i].sample)
1557 file.Fread(rhythm[i].sample, fsize * 2, 1);
1559 rhythm[i].rate = whdr.rate;
1560 rhythm[i].step = rhythm[i].rate * 1024 / rate;
1561 rhythm[i].pos = rhythm[i].size = fsize * 1024;
1567 delete[] rhythm[i].sample;
1568 rhythm[i].sample = 0;
1577 // ---------------------------------------------------------------------------
1578 //
\83\8c\83W
\83X
\83^
\83A
\83\8c\83C
\82É
\83f
\81[
\83^
\82ð
\90Ý
\92è
1580 void OPNA::SetReg(uint addr, uint data)
1588 // UpdateStatus(); //?
1591 // Rhythm ----------------------------------------------------------------
1592 case 0x10: // DM/KEYON
1593 if (!(data & 0x80)) // KEY ON
1595 rhythmkey |= data & 0x3f;
1596 if (data & 0x01) rhythm[0].pos = 0;
1597 if (data & 0x02) rhythm[1].pos = 0;
1598 if (data & 0x04) rhythm[2].pos = 0;
1599 if (data & 0x08) rhythm[3].pos = 0;
1600 if (data & 0x10) rhythm[4].pos = 0;
1601 if (data & 0x20) rhythm[5].pos = 0;
1610 rhythmtl = ~data & 63;
1613 case 0x18: // Bass Drum
1614 case 0x19: // Snare Drum
1615 case 0x1a: // Top Cymbal
1617 case 0x1c: // Tom-tom
1618 case 0x1d: // Rim shot
1619 rhythm[addr & 7].pan = (data >> 6) & 3;
1620 rhythm[addr & 7].level = ~data & 31;
1623 case 0x100: case 0x101:
1624 case 0x102: case 0x103:
1625 case 0x104: case 0x105:
1626 case 0x108: case 0x109:
1627 case 0x10a: case 0x10b:
1628 case 0x10c: case 0x10d:
1630 OPNABase::SetADPCMBReg(addr - 0x100, data);
1634 OPNABase::SetReg(addr, data);
1640 // ---------------------------------------------------------------------------
1641 //
\83\8a\83Y
\83\80\8d\87\90¬
1643 void OPNA::RhythmMix(Sample* buffer, uint count)
1645 if (rhythmtvol < 128 && rhythm[0].sample && (rhythmkey & 0x3f))
1647 Sample* limit = buffer + count * 2;
1648 for (int i=0; i<6; i++)
1650 Rhythm& r = rhythm[i];
1651 if ((rhythmkey & (1 << i)) && r.level < 128)
1653 int db = Limit(rhythmtl+rhythmtvol+r.level+r.volume, 127, -31);
1654 int vol = tltable[FM_TLPOS+(db << (FM_TLBITS-7))] >> 4;
1655 int maskl = -((r.pan >> 1) & 1);
1656 int maskr = -(r.pan & 1);
1658 if (rhythmmask_ & (1 << i))
1663 for (Sample* dest = buffer; dest<limit && r.pos < r.size; dest+=2)
1665 int sample = (r.sample[r.pos / 1024] * vol) >> 12;
1667 StoreSample(dest[0], sample & maskl);
1668 StoreSample(dest[1], sample & maskr);
1675 // ---------------------------------------------------------------------------
1678 void OPNA::SetVolumeRhythmTotal(int db)
1681 rhythmtvol = -(db * 2 / 3);
1684 void OPNA::SetVolumeRhythm(int index, int db)
1687 rhythm[index].volume = -(db * 2 / 3);
1690 void OPNA::SetVolumeADPCM(int db)
1694 adpcmvol = int(65536.0 * pow(10.0, db / 40.0));
1698 adpcmvolume = (adpcmvol * adpcmlevel) >> 12;
1701 // ---------------------------------------------------------------------------
1703 // in: buffer
\8d\87\90¬
\90æ
1704 // nsamples
\8d\87\90¬
\83T
\83\93\83v
\83\8b\90\94
1706 void OPNA::Mix(Sample* buffer, int nsamples)
1708 FMMix(buffer, nsamples);
1709 psg.Mix(buffer, nsamples);
1710 ADPCMBMix(buffer, nsamples);
1711 RhythmMix(buffer, nsamples);
1714 // ---------------------------------------------------------------------------
1715 //
\83X
\83e
\81[
\83g
\83Z
\81[
\83u
1717 #define OPNA_STATE_VERSION 1
1719 void OPNA::SaveState(void *f)
1721 FILEIO *state_fio = (FILEIO *)f;
1723 state_fio->FputUint32(OPNA_STATE_VERSION);
1725 OPNABase::SaveState(f);
1726 for(int i = 0; i < 6; i++) {
1727 state_fio->FputUint8(rhythm[i].pan);
1728 state_fio->FputInt8(rhythm[i].level);
1729 state_fio->FputUint32(rhythm[i].pos);
1731 state_fio->FputInt8(rhythmtl);
1732 state_fio->FputInt32(rhythmtvol);
1733 state_fio->FputUint8(rhythmkey);
1736 bool OPNA::LoadState(void *f)
1738 FILEIO *state_fio = (FILEIO *)f;
1740 if(state_fio->FgetUint32() != OPNA_STATE_VERSION) {
1743 if(!OPNABase::LoadState(f)) {
1746 for(int i = 0; i < 6; i++) {
1747 rhythm[i].pan = state_fio->FgetUint8();
1748 rhythm[i].level = state_fio->FgetInt8();
1749 rhythm[i].pos = state_fio->FgetUint32();
1751 rhythmtl = state_fio->FgetInt8();
1752 rhythmtvol = state_fio->FgetInt32();
1753 rhythmkey = state_fio->FgetUint8();
1757 #endif // BUILD_OPNA
1759 // ---------------------------------------------------------------------------
1761 // ---------------------------------------------------------------------------
1765 // ---------------------------------------------------------------------------
1772 for (int i=0; i<6; i++)
1775 adpcma[i].level = 0;
1776 adpcma[i].volume = 0;
1779 adpcma[i].volume = 0;
1780 adpcma[i].start = 0;
1782 adpcma[i].adpcmx = 0;
1783 adpcma[i].adpcmd = 0;
1789 adpcmnotice = 0x8000;
1800 // ---------------------------------------------------------------------------
1803 bool OPNB::Init(uint c, uint r, bool ipflag,
1804 uint8 *_adpcma, int _adpcma_size,
1805 uint8 *_adpcmb, int _adpcmb_size)
1808 if (!SetRate(c, r, ipflag))
1810 if (!OPNABase::Init(c, r, ipflag))
1813 adpcmabuf = _adpcma;
1814 adpcmasize = _adpcma_size;
1817 for (i=0; i<=24; i++) // max 16M bytes
1819 if (_adpcmb_size <= (1 << i))
1821 adpcmmask = (1 << i) - 1;
1826 // adpcmmask = _adpcmb_size - 1;
1827 limitaddr = adpcmmask;
1834 SetVolumeADPCMATotal(0);
1836 SetVolumeADPCMA(i, 0);
1841 // ---------------------------------------------------------------------------
1842 //
\83\8a\83Z
\83b
\83g
1852 for (int i=0; i<6; i++)
1855 adpcma[i].level = 0;
1856 adpcma[i].volume = 0;
1859 adpcma[i].volume = 0;
1860 adpcma[i].start = 0;
1862 adpcma[i].adpcmx = 0;
1863 adpcma[i].adpcmd = 0;
1867 // ---------------------------------------------------------------------------
1868 //
\83T
\83\93\83v
\83\8a\83\93\83O
\83\8c\81[
\83g
\95Ï
\8dX
1870 bool OPNB::SetRate(uint c, uint r, bool ipflag)
1872 if (!OPNABase::SetRate(c, r, ipflag))
1875 adpcmastep = int(double(c) / 54 * 8192 / r);
1879 // ---------------------------------------------------------------------------
1880 //
\83\8c\83W
\83X
\83^
\83A
\83\8c\83C
\82É
\83f
\81[
\83^
\82ð
\90Ý
\92è
1882 void OPNB::SetReg(uint addr, uint data)
1888 // omitted registers
1890 case 0x2d: case 0x2e: case 0x2f:
1893 // ADPCM A ---------------------------------------------------------------
1894 case 0x100: // DM/KEYON
1895 if (!(data & 0x80)) // KEY ON
1897 adpcmakey |= data & 0x3f;
1898 for (int c=0; c<6; c++)
1902 ResetStatus(0x100 << c);
1903 adpcma[c].pos = adpcma[c].start;
1904 // adpcma[c].step = 0x10000 - adpcma[c].step;
1906 adpcma[c].adpcmx = 0;
1907 adpcma[c].adpcmd = 0;
1908 adpcma[c].nibble = 0;
1919 adpcmatl = ~data & 63;
1922 case 0x108: case 0x109: case 0x10a:
1923 case 0x10b: case 0x10c: case 0x10d:
1924 adpcma[addr & 7].pan = (data >> 6) & 3;
1925 adpcma[addr & 7].level = ~data & 31;
1928 case 0x110: case 0x111: case 0x112: // START ADDRESS (L)
1929 case 0x113: case 0x114: case 0x115:
1930 case 0x118: case 0x119: case 0x11a: // START ADDRESS (H)
1931 case 0x11b: case 0x11c: case 0x11d:
1932 adpcmareg[addr - 0x110] = data;
1933 adpcma[addr & 7].pos = adpcma[addr & 7].start =
1934 (adpcmareg[(addr&7)+8]*256+adpcmareg[addr&7]) << 9;
1937 case 0x120: case 0x121: case 0x122: // END ADDRESS (L)
1938 case 0x123: case 0x124: case 0x125:
1939 case 0x128: case 0x129: case 0x12a: // END ADDRESS (H)
1940 case 0x12b: case 0x12c: case 0x12d:
1941 adpcmareg[addr - 0x110] = data;
1942 adpcma[addr & 7].stop =
1943 (adpcmareg[(addr&7)+24]*256+adpcmareg[(addr&7)+16] + 1) << 9;
1946 // ADPCMB -----------------------------------------------------------------
1948 if ((data & 0x80) && !adpcmplay)
1951 memaddr = startaddr;
1952 adpcmx = 0, adpcmd = 127;
1957 control1 = data & 0x91;
1961 case 0x11: // Control Register 2
1962 control2 = data & 0xc0;
1965 case 0x12: // Start Address L
1966 case 0x13: // Start Address H
1967 adpcmreg[addr - 0x12 + 0] = data;
1968 startaddr = (adpcmreg[1]*256+adpcmreg[0]) << 9;
1969 memaddr = startaddr;
1972 case 0x14: // Stop Address L
1973 case 0x15: // Stop Address H
1974 adpcmreg[addr - 0x14 + 2] = data;
1975 stopaddr = (adpcmreg[3]*256+adpcmreg[2] + 1) << 9;
1976 // LOG1(" stopaddr %.6x", stopaddr);
1979 case 0x19: // delta-N L
1980 case 0x1a: // delta-N H
1981 adpcmreg[addr - 0x19 + 4] = data;
1982 deltan = adpcmreg[5]*256+adpcmreg[4];
1983 deltan = Max(256, deltan);
1984 adpld = deltan * adplbase >> 16;
1987 case 0x1b: // Level Control
1989 adpcmvolume = (adpcmvol * adpcmlevel) >> 12;
1992 case 0x1c: // Flag Control
1993 stmask = ~((data & 0xbf) << 8);
1999 OPNABase::SetReg(addr, data);
2005 // ---------------------------------------------------------------------------
2006 //
\83\8c\83W
\83X
\83^
\8eæ
\93¾
2008 uint OPNB::GetReg(uint addr)
2011 return psg.GetReg(addr);
2016 // ---------------------------------------------------------------------------
2017 //
\8ag
\92£
\83X
\83e
\81[
\83^
\83X
\82ð
\93Ç
\82Ý
\82±
\82Þ
2019 uint OPNB::ReadStatusEx()
2021 return (status & stmask) >> 8;
2024 // ---------------------------------------------------------------------------
2027 int OPNB::jedi_table[(48+1)*16];
2029 void OPNB::InitADPCMATable()
2031 const static int8 table2[] =
2033 1, 3, 5, 7, 9, 11, 13, 15,
2034 -1, -3, -5, -7, -9,-11,-13,-15,
2037 for (int i=0; i<=48; i++)
2039 int s = int(16.0 * pow (1.1, i) * 3);
2040 for (int j=0; j<16; j++)
2042 jedi_table[i*16+j] = s * table2[j] / 8;
2047 // ---------------------------------------------------------------------------
2048 // ADPCMA
\8d\87\90¬
2050 void OPNB::ADPCMAMix(Sample* buffer, uint count)
2052 const static int decode_tableA1[16] =
2054 -1*16, -1*16, -1*16, -1*16, 2*16, 5*16, 7*16, 9*16,
2055 -1*16, -1*16, -1*16, -1*16, 2*16, 5*16, 7*16, 9*16
2058 if (adpcmatvol < 128 && (adpcmakey & 0x3f))
2060 Sample* limit = buffer + count * 2;
2061 for (int i=0; i<6; i++)
2063 ADPCMA& r = adpcma[i];
2064 if ((adpcmakey & (1 << i)) && r.level < 128)
2066 uint maskl = r.pan & 2 ? -1 : 0;
2067 uint maskr = r.pan & 1 ? -1 : 0;
2068 if (rhythmmask_ & (1 << i))
2073 int db = Limit(adpcmatl+adpcmatvol+r.level+r.volume, 127, -31);
2074 int vol = tltable[FM_TLPOS+(db << (FM_TLBITS-7))] >> 4;
2076 Sample* dest = buffer;
2077 for ( ; dest<limit; dest+=2)
2079 r.step += adpcmastep;
2080 if (r.pos >= r.stop)
2082 SetStatus(0x100 << i);
2083 adpcmakey &= ~(1<<i);
2087 for (; r.step > 0x10000; r.step -= 0x10000)
2092 r.nibble = adpcmabuf[r.pos>>1];
2093 data = r.nibble >> 4;
2097 data = r.nibble & 0x0f;
2101 r.adpcmx += jedi_table[r.adpcmd + data];
2102 r.adpcmx = Limit(r.adpcmx, 2048*3-1, -2048*3);
2103 r.adpcmd += decode_tableA1[data];
2104 r.adpcmd = Limit(r.adpcmd, 48*16, 0);
2106 int sample = (r.adpcmx * vol) >> 10;
2107 StoreSample(dest[0], sample & maskl);
2108 StoreSample(dest[1], sample & maskr);
2115 // ---------------------------------------------------------------------------
2118 void OPNB::SetVolumeADPCMATotal(int db)
2121 adpcmatvol = -(db * 2 / 3);
2124 void OPNB::SetVolumeADPCMA(int index, int db)
2127 adpcma[index].volume = -(db * 2 / 3);
2130 void OPNB::SetVolumeADPCMB(int db)
2134 adpcmvol = int(65536.0 * pow(10.0, db / 40.0));
2139 // ---------------------------------------------------------------------------
2141 // in: buffer
\8d\87\90¬
\90æ
2142 // nsamples
\8d\87\90¬
\83T
\83\93\83v
\83\8b\90\94
2144 void OPNB::Mix(Sample* buffer, int nsamples)
2146 FMMix(buffer, nsamples);
2147 psg.Mix(buffer, nsamples);
2148 ADPCMBMix(buffer, nsamples);
2149 ADPCMAMix(buffer, nsamples);
2152 #endif // BUILD_OPNB