|
|
| version 1.1, 2003/10/16 17:58:08 | version 1.7, 2004/01/13 05:30:59 |
|---|---|
| Line 1 | Line 1 |
| #include "compiler.h" | #include "compiler.h" |
| #include "memory.h" | |
| #include "pccore.h" | #include "pccore.h" |
| #include "iocore.h" | #include "iocore.h" |
| #include "sound.h" | #include "sound.h" |
| #include "fmboard.h" | #include "fmboard.h" |
| CS4231CFG cs4231cfg; | |
| static const UINT16 cs4231samprate[] = { | static const UINT16 cs4231samprate[] = { |
| 8000, 5510, 16000, 11025, | 8000, 5510, 16000, 11025, |
| 27420, 18900, 32000, 22050, | 27420, 18900, 32000, 22050, |
| 54840, 37800, 64000, 44100, | 54840, 37800, 64000, 44100, |
| 48000, 33075, 9600, 6620}; | 48000, 33075, 9600, 6620}; |
| static const BYTE dmach[] = {0xff, 0x00, 0x01, 0x03, 0xff, 0xff, 0xff, 0xff}; | |
| static const BYTE dmairq[] = {0xff, 0x03, 0x06, 0x0a, 0x0c, 0xff, 0xff, 0xff}; | |
| void cs4231_initialize(UINT rate) { | void cs4231_initialize(UINT rate) { |
| (void)rate; | cs4231cfg.rate = rate; |
| } | } |
| void cs4231_setvol(UINT vol) { | void cs4231_setvol(UINT vol) { |
| Line 29 void cs4231_setvol(UINT vol) { | Line 28 void cs4231_setvol(UINT vol) { |
| void cs4231_dma(NEVENTITEM item) { | void cs4231_dma(NEVENTITEM item) { |
| BYTE ret; | DMACH dmach; |
| REG8 ret; | |
| SINT32 cnt; | SINT32 cnt; |
| if (item->flag & NEVENT_SETEVENT) { | if (item->flag & NEVENT_SETEVENT) { |
| if (dmac.dmach[0].leng.w) { | if (cs4231.dmach != 0xff) { |
| sound_sync(); | dmach = dmac.dmach + cs4231.dmach; |
| ret = cs4231.proc(); | if (dmach->leng.w) { |
| if ((ret) && (cs4231.reg.pinctrl & 2)) { | sound_sync(); |
| dmac.dmach[0].leng.w = 0; | ret = cs4231.proc(dmach); |
| cs4231.intflag = 1; | if ((ret) && (cs4231.reg.pinctrl & 2)) { |
| pic_setirq(0x0c); | dmach->leng.w = 0; |
| if (cs4231.dmairq != 0xff) { | |
| cs4231.intflag = 1; | |
| pic_setirq(cs4231.dmairq); | |
| } | |
| } | |
| } | } |
| } | } |
| cnt = pc.realclock * 16 / opna_rate; | if (cs4231cfg.rate) { |
| nevent_set(NEVENT_CS4231, cnt, cs4231_dma, NEVENT_RELATIVE); | cnt = pccore.realclock * 16 / cs4231cfg.rate; |
| nevent_set(NEVENT_CS4231, cnt, cs4231_dma, NEVENT_RELATIVE); | |
| } | |
| } | } |
| (void)item; | (void)item; |
| } | } |
| BYTE DMACCALL cs4231dmafunc(BYTE func) { | REG8 DMACCALL cs4231dmafunc(REG8 func) { |
| SINT32 cnt; | SINT32 cnt; |
| switch(func) { | switch(func) { |
| case DMAEXT_START: | case DMAEXT_START: |
| cnt = pc.realclock * 16 / opna_rate; | if (cs4231cfg.rate) { |
| nevent_set(NEVENT_CS4231, cnt, cs4231_dma, NEVENT_ABSOLUTE); | cnt = pccore.realclock * 16 / cs4231cfg.rate; |
| nevent_set(NEVENT_CS4231, cnt, cs4231_dma, NEVENT_ABSOLUTE); | |
| } | |
| break; | break; |
| case DMAEXT_BREAK: | case DMAEXT_BREAK: |
| Line 78 void cs4231_update(void) { | Line 87 void cs4231_update(void) { |
| } | } |
| void cs4231_control(UINT index, BYTE value) { | void cs4231_control(UINT index, REG8 value) { |
| DMACH dmach; | |
| *(((BYTE *)(&cs4231.reg)) + index) = value; | *(((BYTE *)(&cs4231.reg)) + index) = value; |
| switch(index) { | switch(index) { |
| Line 88 void cs4231_control(UINT index, BYTE val | Line 99 void cs4231_control(UINT index, BYTE val |
| break; | break; |
| case 9: | case 9: |
| if ((value & 0x5) == 0x5) { | if (cs4231.dmach != 0xff) { |
| dmac.dmach[0].ready = 1; | dmach = dmac.dmach + cs4231.dmach; |
| } | if ((value & 0x5) == 0x5) { |
| else { | dmach->ready = 1; |
| dmac.dmach[0].ready = 0; | } |
| else { | |
| dmach->ready = 0; | |
| } | |
| dmac_check(); | |
| } | } |
| dmac_check(); | |
| break; | break; |
| } | } |
| } | } |