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)127void pokeyGenerateIRQ( BYTE irqMask ) 128 { 129 IRQ_ST |= irqMask; 130 IRQ_line = ((IRQ_ST&IRQ_EN)!=0x00) ? 0x01:0x00; 131 pokeyGenerateCheckIRQline(); 132 } 133 134 135