|
|
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.