1 #include <ctype.h>
2 #ifdef _MSC_EXTENSIONS
3 #include <excpt.h>
4 #endif
5 #include <math.h>
6 #include <stdio.h>
7 #include <stdlib.h>
8 #include <string.h>
9 
10 #include "sapGlobals.h"
11 
12 #define NAMESPACENAME	POKEY0_NAMESPACE
13 #define POKEY_INIT_FUNC			void pokeyInit0( void )
14 #define POKEY_RESET_FUNC		void pokeyReset0( void )
15 #define POKEY_UPDATESOUND_FUNC	void pokeyUpdateSound0( int n )
16 #define POKEY_UPDATECOUNT_FUNC	void pokeyUpdateSoundCounters0( void )
17 #define POKEY_WRITE_FUNC		void pokeyWriteByte0( short unsigned int address, BYTE value )
18 #define POKEY_WRITE_2FUNC(a,v)	pokeyWriteByte0(a,v)
19 #include "pokeyNamespace.h"
20 
21 bool *generateIRQ0 = &POKEY0_NAMESPACE::generateIRQ0;
22 
23 POKEY_WRITE_FUNC
24 {
25 	address&=0x0F;
26 
27 	switch( address )
28 	{
29 		case 0x00:
30 			divideByN_Latch[0] = value;
31 			SetupChannels01;
32 			break;
33 		case 0x01:
34 			audioControl_Latch[0] = value;
35 			audioControl_Latch2[0] = value&15;
36 			audioControl_Latch_Digi[0] = (value>>4)&1 ? 15:0;
37 			Channel0Distortion = channelsDistorionTable0[ (value>>4)&15 ];
38 			if( !(value&0x10) )
39 				SetupChannels01;
40 			break;
41 		case 0x02:
42 			divideByN_Latch[1] = value;
43 			SetupChannels01;
44 			break;
45 		case 0x03:
46 			audioControl_Latch[1] = value;
47 			audioControl_Latch2[1] = value&15;
48 			audioControl_Latch_Digi[1] = (value>>4)&1 ? 15:0;
49 			Channel1Distortion = channelsDistorionTable1[ (value>>4)&15 ];
50 			if( !(value&0x10) )
51 				SetupChannels01;
52 			break;
53 		case 0x04:
54 			divideByN_Latch[2] = value;
55 			SetupChannels23;
56 			break;
57 		case 0x05:
58 			audioControl_Latch[2] = value;
59 			audioControl_Latch2[2] = value&15;
60 			audioControl_Latch_Digi[2] = (value>>4)&1 ? 15:0;
61 			Channel2Distortion = channelsDistorionTable2[ (value>>4)&15 ];
62 			if( !(value&0x10) )
63 				SetupChannels23;
64 			break;
65 		case 0x06:
66 			divideByN_Latch[3] = value;
67 			SetupChannels23;
68 			break;
69 		case 0x07:
70 			audioControl_Latch[3] = value;
71 			audioControl_Latch2[3] = value&15;
72 			audioControl_Latch_Digi[3] = (value>>4)&1 ? 15:0;
73 			Channel3Distortion = channelsDistorionTable3[ (value>>4)&15 ];
74 			if( !(value&0x10) )
75 				SetupChannels23;
76 			break;
77 		case 0x08:
78 		{
79 			BYTE prevAUDCTL;
80 			prevAUDCTL = AUDCTL;
81 			AUDCTL = value;
82 			pcc1564 = value & 1 ? 112:28;
83 
84 			noiseAND = AUDCTL & 128 ? 0x1FF:0x1FFFF;
85 
86 			switch_J3_Q_stateAND[0] = AUDCTL&4 ? 15:0;
87 			switch_J3_Q_stateAND[1] = AUDCTL&2 ? 15:0;
88 
89 			SetupChannels01;
90 			SetupChannels23;
91 
92 			if( (prevAUDCTL^AUDCTL)&0x10 )
93 				divideByN[1] = 2;
94 			if( (prevAUDCTL^AUDCTL)&0x8 )
95 				divideByN[3] = 2;
96 
97 			break;
98 		}
99 		case 0x0D:
100 			break;
101 		case 0x0E:
102 			// najpierw czyscimy status przerwan IRQ_ST. Tam gdzie we wpisywanej wartosci jest 0,
103 			// status tego przerwania jest zerowany
104 			IRQ_ST = IRQ_ST&value;
105 			IRQ_EN = value;
106 			// teraz sprawdzamy czy musimy ustawic linie IRQ
107 			IRQ_line = ((IRQ_ST&IRQ_EN)!=0x00) ? 0x01:0x00;
108 			break;
109 		case 0x0F:
110 			break;
111 	}
112 }
113 
114 void pokeyGenerateCheckIRQline( void )
115 {
116 	if( ((cpuFlag_I&1)==0) && IRQ_line )
117 	{
118 		BYTE fl,lsb,msb;
119 		atariMem[0x100 + cpuReg_S] = (cpuReg_PC>>8)&0xFF; cpuReg_S--;
120 		atariMem[0x100 + cpuReg_S] = cpuReg_PC&0xFF; cpuReg_S--;
121 		atariMem[0x100 + cpuReg_S] = fl = cpuGetFlags(); cpuReg_S--;
122 		lsb = atariMem[0xFFFE]; msb = atariMem[0xFFFF];
123 		cpuReg_PC = ((WORD)lsb) + ((WORD)msb)*256;
124 	}
125 }
126 
pokeyGenerateIRQ(BYTE irqMask)127 void pokeyGenerateIRQ( BYTE irqMask )
128 {
129 	IRQ_ST |= irqMask;
130 	IRQ_line = ((IRQ_ST&IRQ_EN)!=0x00) ? 0x01:0x00;
131 	pokeyGenerateCheckIRQline();
132 }
133 
134 
135