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