diff options
author | Alec Murphy <alec@checksum.fail> | 2017-07-09 00:10:58 -0400 |
---|---|---|
committer | Alec Murphy <alec@checksum.fail> | 2017-07-09 00:10:58 -0400 |
commit | 750376b125d3e43b1e995596707d94e68ed4c7a7 (patch) | |
tree | 8067af397195c69814d254ab94040467e3038414 | |
parent | 235bda6a582099e134af299ce592796b520668b6 (diff) |
Add Sound Channel toggle for PC Speaker sound
-rw-r--r-- | Load.HC | 57 | ||||
-rw-r--r-- | README.md | 6 | ||||
-rwxr-xr-x | Sound.HC | 43 |
3 files changed, 81 insertions, 25 deletions
@@ -10,6 +10,12 @@ I64 obp03,obp02,obp01,obp00; I64 obp13,obp12,obp11,obp10; I64 jp_state[8]; +I64 apuCtr=0; +I64 apuToggle=1; +I64 kAPUChan1=0; +I64 kAPUChan2=0; +I64 kAPUChan3=0; + I64 kLoad=0; I64 kReset=0; I64 kSave=0; @@ -1018,6 +1024,17 @@ U0 runInterrupt() U0 updateCore() { + if (apuToggle==1) + { + apuCtr++; + if(apuCtr>1000) + { + memory[0xFEED]++; + if(memory[0xFEED]>1) { memory[0xFEED]=0; }; + apuCtr=0; + }; + }; + // DIV control DIVTicks += CPUTicks; if (DIVTicks >= 0x40) { @@ -1118,6 +1135,45 @@ U0 executeIteration() //Keyboard switch(sc) { + + case 0x10: + kAPUChan1=0; + break; + case 0x10 + 0x80: + if(!kAPUChan1) { + kAPUChan1=1; + apuToggle=0; + memory[0xFEED]=0; + StrCpy(DisplayMsg,"APU Ch 01"); + DisplayMsgTicks=1; + }; + break; + + case 0x11: + kAPUChan2=0; + break; + case 0x11 + 0x80: + if(!kAPUChan2) { + kAPUChan2=1; + apuToggle=0; + memory[0xFEED]=1; + StrCpy(DisplayMsg,"APU Ch 02"); + DisplayMsgTicks=1; + }; + break; + + case 0x12: + kAPUChan3=0; + break; + case 0x12 + 0x80: + if(!kAPUChan3) { + kAPUChan3=1; + apuToggle=1; + StrCpy(DisplayMsg,"APU Ch Auto"); + DisplayMsgTicks=1; + }; + break; + case 0x13: kReset=0; break; @@ -1302,6 +1358,7 @@ U0 start() initCart; // init cartridge bank type setupRAMBanks; initLCD; // init LCD + memory[0xFEED]=1; CTask *snd_task=Spawn(&GBSoundTask,&memory,,2); // BG Palette $$FF47 SetPal(memory[0xFF47],&bgp0,&bgp1,&bgp2,&bgp3); @@ -31,3 +31,9 @@ Load State: `5` Save State: `7` +Sound Channel 1: `Q` + +Sound Channel 2: `W` + +Sound Channel Auto Toggle: `E` + @@ -1,45 +1,45 @@ - U0 GBSoundTask(U8 *regs) { - - I64 ch=0; - I64 chP=0; I64 div; I64 freq; I64 x; - I64 prevX; + + I64 prevA=0; + I64 prevB=0; + while (TRUE) { - if(ch==0 && chP==FALSE) - { - + + if(memory[0xFEED]==0) + { if (memory[0xFF12]>0b10000) { x = memory[0xFF13]; x += ((memory[0xFF14] & 0b00000111)<<8); - if (x!=prevX) + if (x!=prevA) { freq=131072/(2048-x); div=1193180/freq; + // I wanted to use Snd(Freq2Ona(freq)); here + // instead of I/O port writes, but the + // conversion isn't right...? OutU8(0x43, 0xB6); OutU8(0x42, div); OutU8(0x42, div>>8); OutU8(0x61,3|InU8(0x61)); - prevX=x; + prevA=x; }; } else { - //SndRst; - } + }; }; - if(ch==1) - { - + if(memory[0xFEED]==1) + { if (memory[0xFF17]>0b10000) { x = memory[0xFF18]; x += ((memory[0xFF19] & 0b00000111)<<8); - if (x!=prevX) + if (x!=prevB) { freq=131072/(2048-x); div=1193180/freq; @@ -47,19 +47,12 @@ U0 GBSoundTask(U8 *regs) OutU8(0x42, div); OutU8(0x42, div>>8); OutU8(0x61,3|InU8(0x61)); - prevX=x; - chP=TRUE; + prevB=x; }; } else { - chP=FALSE; - } + }; }; - - Sleep(2); - - ch++; - if (ch>3) { ch=0; }; }; } |