|
|
1.1 ! root 1: /* ! 2: Hatari ! 3: ! 4: Programmable Sound Generator (YM-2149) - PSG ! 5: */ ! 6: ! 7: #include "main.h" ! 8: #include "memAlloc.h" ! 9: #include "memorySnapShot.h" ! 10: #include "sound.h" ! 11: ! 12: unsigned char PSGRegisterSelect = 0; /* 0xff8800 (read/write) */ ! 13: unsigned char PSGRegisters[16] = { 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0 }; /* Register in PSG, see PSG_REG_xxxx */ ! 14: ! 15: ! 16: /*-----------------------------------------------------------------------*/ ! 17: /* ! 18: Reset variables used in PSG ! 19: */ ! 20: void PSG_Reset(void) ! 21: { ! 22: PSGRegisterSelect = 0; ! 23: Memory_Clear(PSGRegisters,sizeof(unsigned char)*16); ! 24: } ! 25: ! 26: //----------------------------------------------------------------------- ! 27: /* ! 28: Save/Restore snapshot of local variables('MemorySnapShot_Store' handles type) ! 29: */ ! 30: void PSG_MemorySnapShot_Capture(BOOL bSave) ! 31: { ! 32: // Save/Restore details ! 33: MemorySnapShot_Store(&PSGRegisterSelect,sizeof(PSGRegisterSelect)); ! 34: MemorySnapShot_Store(PSGRegisters,sizeof(PSGRegisters)); ! 35: } ! 36: ! 37: //----------------------------------------------------------------------- ! 38: /* ! 39: Write byte to 0xff88000, this is used as a selector for when we read/write to address 0xff8802 ! 40: */ ! 41: void PSG_WriteSelectRegister(unsigned short v) ! 42: { ! 43: PSGRegisterSelect = v & 0x0f; /* Store register to select (value in bits 0-3) */ ! 44: } ! 45: ! 46: //----------------------------------------------------------------------- ! 47: /* ! 48: Read byte from 0xff8800, returns to PSG data ! 49: */ ! 50: unsigned short PSG_ReadSelectRegister(void) ! 51: { ! 52: // Read data last selected by register ! 53: return PSGRegisters[PSGRegisterSelect]; /* Return value from PSGRegisters[] */ ! 54: } ! 55: ! 56: //----------------------------------------------------------------------- ! 57: /* ! 58: Write byte to 0xff8802, stores according to PSG select register(write 0xff8800) ! 59: */ ! 60: void PSG_WriteDataRegister(unsigned short bl) ! 61: { ! 62: Sound_Update(); /* Create samples up until this point with current values */ ! 63: PSGRegisters[PSGRegisterSelect]=bl; /* Write value to PSGRegisters[] */ ! 64: if( PSGRegisterSelect==13 ) /* Whenever 'write' to register 13, cause envelope to reset */ ! 65: { ! 66: bEnvelopeFreqFlag = TRUE; ! 67: bWriteEnvelopeFreq = TRUE; ! 68: } ! 69: /* Check registers 8,9 and 10 which are 'amplitude' for each channel and store if wrote to(to check for sample playback) */ ! 70: if( PSGRegisterSelect==8 ) ! 71: bWriteChannelAAmp=TRUE; ! 72: else if( PSGRegisterSelect==9 ) ! 73: bWriteChannelBAmp=TRUE; ! 74: else if( PSGRegisterSelect==10 ) ! 75: bWriteChannelCAmp=TRUE; ! 76: } ! 77: ! 78: //----------------------------------------------------------------------- ! 79: /* ! 80: Read byte from 0xff8802, returns 0xff ! 81: */ ! 82: unsigned short PSG_ReadDataRegister(void) ! 83: { ! 84: return 0xff; ! 85: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.