diff src/sap/saplib/pokey0.cxx @ 145:7804476ba85a trunk

[svn] - C++ files -> .cxx - build saplib inline - remove version.h and chase removal issues
author nenolod
date Mon, 30 Oct 2006 17:47:41 -0800
parents src/sap/saplib/pokey0.cpp@c0b31cf2c7cd
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/sap/saplib/pokey0.cxx	Mon Oct 30 17:47:41 2006 -0800
@@ -0,0 +1,132 @@
+#include <ctype.h>
+#include <math.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "sapGlobals.h"
+
+#define NAMESPACENAME			POKEY0_NAMESPACE
+#define POKEY_INIT_FUNC			void pokeyInit0( void )
+#define POKEY_RESET_FUNC		void pokeyReset0( void )
+#define POKEY_UPDATESOUND_FUNC		void pokeyUpdateSound0( int n )
+#define POKEY_UPDATECOUNT_FUNC		void pokeyUpdateSoundCounters0( void )
+#define POKEY_WRITE_FUNC		void pokeyWriteByte0( short unsigned int address, BYTE value )
+#define POKEY_WRITE_2FUNC(a,v)		pokeyWriteByte0(a,v)
+
+#include "pokeyNamespace.h"
+
+bool *generateIRQ0 = &POKEY0_NAMESPACE::generateIRQ0;
+
+POKEY_WRITE_FUNC
+{
+	address&=0x0F;
+
+	switch( address )
+	{
+		case 0x00:
+			divideByN_Latch[0] = value;
+			SetupChannels01;
+			break;
+		case 0x01:
+			audioControl_Latch[0] = value;
+			audioControl_Latch2[0] = value&15;
+			audioControl_Latch_Digi[0] = (value>>4)&1 ? 15:0;
+			Channel0Distortion = channelsDistorionTable0[ (value>>4)&15 ];
+			if( !(value&0x10) )
+				SetupChannels01;
+			break;
+		case 0x02:
+			divideByN_Latch[1] = value;
+			SetupChannels01;
+			break;
+		case 0x03:
+			audioControl_Latch[1] = value;
+			audioControl_Latch2[1] = value&15;
+			audioControl_Latch_Digi[1] = (value>>4)&1 ? 15:0;
+			Channel1Distortion = channelsDistorionTable1[ (value>>4)&15 ];
+			if( !(value&0x10) )
+				SetupChannels01;
+			break;
+		case 0x04:
+			divideByN_Latch[2] = value;
+			SetupChannels23;
+			break;
+		case 0x05:
+			audioControl_Latch[2] = value;
+			audioControl_Latch2[2] = value&15;
+			audioControl_Latch_Digi[2] = (value>>4)&1 ? 15:0;
+			Channel2Distortion = channelsDistorionTable2[ (value>>4)&15 ];
+			if( !(value&0x10) )
+				SetupChannels23;
+			break;
+		case 0x06:
+			divideByN_Latch[3] = value;
+			SetupChannels23;
+			break;
+		case 0x07:
+			audioControl_Latch[3] = value;
+			audioControl_Latch2[3] = value&15;
+			audioControl_Latch_Digi[3] = (value>>4)&1 ? 15:0;
+			Channel3Distortion = channelsDistorionTable3[ (value>>4)&15 ];
+			if( !(value&0x10) )
+				SetupChannels23;
+			break;
+		case 0x08:
+		{
+			BYTE prevAUDCTL;
+			prevAUDCTL = AUDCTL;
+			AUDCTL = value;
+			pcc1564 = value & 1 ? 112:28;
+
+			noiseAND = AUDCTL & 128 ? 0x1FF:0x1FFFF;
+
+			switch_J3_Q_stateAND[0] = AUDCTL&4 ? 15:0;
+			switch_J3_Q_stateAND[1] = AUDCTL&2 ? 15:0;
+
+			SetupChannels01;
+			SetupChannels23;
+
+			if( (prevAUDCTL^AUDCTL)&0x10 )
+				divideByN[1] = 2;
+			if( (prevAUDCTL^AUDCTL)&0x8 )
+				divideByN[3] = 2;
+
+			break;
+		}
+		case 0x0D:
+			break;
+		case 0x0E:
+			// najpierw czyscimy status przerwan IRQ_ST. Tam gdzie we wpisywanej wartosci jest 0,
+			// status tego przerwania jest zerowany
+			IRQ_ST = IRQ_ST&value;
+			IRQ_EN = value;
+			// teraz sprawdzamy czy musimy ustawic linie IRQ
+			IRQ_line = ((IRQ_ST&IRQ_EN)!=0x00) ? 0x01:0x00;
+			break;
+		case 0x0F:
+			break;
+	}
+}
+
+void pokeyGenerateCheckIRQline( void )
+{
+	if( ((cpuFlag_I&1)==0) && IRQ_line )
+	{
+		BYTE fl,lsb,msb;
+		atariMem[0x100 + cpuReg_S] = (cpuReg_PC>>8)&0xFF; cpuReg_S--;
+		atariMem[0x100 + cpuReg_S] = cpuReg_PC&0xFF; cpuReg_S--;
+		atariMem[0x100 + cpuReg_S] = fl = cpuGetFlags(); cpuReg_S--;
+		lsb = atariMem[0xFFFE]; msb = atariMem[0xFFFF];
+		cpuReg_PC = ((WORD)lsb) + ((WORD)msb)*256;
+	}
+}
+
+void pokeyGenerateIRQ( BYTE irqMask )
+{
+	IRQ_ST |= irqMask;
+	IRQ_line = ((IRQ_ST&IRQ_EN)!=0x00) ? 0x01:0x00;
+	pokeyGenerateCheckIRQline();
+}
+
+