aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlec Murphy <alec@checksum.fail>2017-07-09 00:10:58 -0400
committerAlec Murphy <alec@checksum.fail>2017-07-09 00:10:58 -0400
commit750376b125d3e43b1e995596707d94e68ed4c7a7 (patch)
tree8067af397195c69814d254ab94040467e3038414
parent235bda6a582099e134af299ce592796b520668b6 (diff)
Add Sound Channel toggle for PC Speaker sound
-rw-r--r--Load.HC57
-rw-r--r--README.md6
-rwxr-xr-xSound.HC43
3 files changed, 81 insertions, 25 deletions
diff --git a/Load.HC b/Load.HC
index a70ed1b..fb55fad 100644
--- a/Load.HC
+++ b/Load.HC
@@ -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);
diff --git a/README.md b/README.md
index 1eca7dd..ac831f4 100644
--- a/README.md
+++ b/README.md
@@ -31,3 +31,9 @@ Load State: `5`
Save State: `7`
+Sound Channel 1: `Q`
+
+Sound Channel 2: `W`
+
+Sound Channel Auto Toggle: `E`
+
diff --git a/Sound.HC b/Sound.HC
index 0fd9a31..45dd9e8 100755
--- a/Sound.HC
+++ b/Sound.HC
@@ -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; };
};
}