|
|
| version 1.2, 2003/10/18 00:35:35 | version 1.9, 2004/02/19 11:32:12 |
|---|---|
| Line 1 | Line 1 |
| #include "compiler.h" | #include "compiler.h" |
| #include "cpucore.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" |
| static const BYTE irqtable[4] = {0x03, 0x0d, 0x0a, 0x0c}; | static const UINT8 irqtable[4] = {0x03, 0x0d, 0x0a, 0x0c}; |
| void fmport_a(NEVENTITEM item) { | void fmport_a(NEVENTITEM item) { |
| Line 26 void fmport_a(NEVENTITEM item) { | Line 27 void fmport_a(NEVENTITEM item) { |
| if (intreq) { | if (intreq) { |
| pcm86.write = 1; | pcm86.write = 1; |
| pic_setirq(fmtimer.irq); | pic_setirq(fmtimer.irq); |
| // TRACEOUT(("fm int-A")); | |
| } | } |
| // TRACE_("A: fifo = ", pcm86.fifo); | // TRACE_("A: fifo = ", pcm86.fifo); |
| // TRACE_("A: virbuf = ", pcm86.virbuf); | // TRACE_("A: virbuf = ", pcm86.virbuf); |
| Line 51 void fmport_b(NEVENTITEM item) { | Line 53 void fmport_b(NEVENTITEM item) { |
| if (intreq) { | if (intreq) { |
| pcm86.write = 1; | pcm86.write = 1; |
| pic_setirq(fmtimer.irq); | pic_setirq(fmtimer.irq); |
| // TRACEOUT(("fm int-B")); | |
| } | } |
| // TRACE_("B: fifo = ", pcm86.fifo); | // TRACE_("B: fifo = ", pcm86.fifo); |
| // TRACE_("B: virbuf = ", pcm86.virbuf); | // TRACE_("B: virbuf = ", pcm86.virbuf); |
| Line 63 static void set_fmtimeraevent(BOOL absol | Line 66 static void set_fmtimeraevent(BOOL absol |
| SINT32 l; | SINT32 l; |
| l = 18 * (1024 - fmtimer.timera); | l = 18 * (1024 - fmtimer.timera); |
| if (pc.cpumode & CPUMODE_8MHz) { // 4MHz | if (pccore.cpumode & CPUMODE_8MHZ) { // 4MHz |
| l = (l * 1248 / 625) * pc.multiple; | l = (l * 1248 / 625) * pccore.multiple; |
| } | } |
| else { // 5MHz | else { // 5MHz |
| l = (l * 1536 / 625) * pc.multiple; | l = (l * 1536 / 625) * pccore.multiple; |
| } | } |
| nevent_set(NEVENT_FMTIMERA, l, fmport_a, absolute); | nevent_set(NEVENT_FMTIMERA, l, fmport_a, absolute); |
| } | } |
| Line 77 static void set_fmtimerbevent(BOOL absol | Line 80 static void set_fmtimerbevent(BOOL absol |
| SINT32 l; | SINT32 l; |
| l = 288 * (256 - fmtimer.timerb); | l = 288 * (256 - fmtimer.timerb); |
| if (pc.cpumode & CPUMODE_8MHz) { // 4MHz | if (pccore.cpumode & CPUMODE_8MHZ) { // 4MHz |
| l = (l * 1248 / 625) * pc.multiple; | l = (l * 1248 / 625) * pccore.multiple; |
| } | } |
| else { // 5MHz | else { // 5MHz |
| l = (l * 1536 / 625) * pc.multiple; | l = (l * 1536 / 625) * pccore.multiple; |
| } | } |
| nevent_set(NEVENT_FMTIMERB, l, fmport_b, absolute); | nevent_set(NEVENT_FMTIMERB, l, fmport_b, absolute); |
| } | } |
| void fmtimer_reset(BYTE irq) { | void fmtimer_reset(UINT irq) { |
| ZeroMemory(&fmtimer, sizeof(fmtimer)); | ZeroMemory(&fmtimer, sizeof(fmtimer)); |
| #if 1 | |
| fmtimer.reg = 0x3f; // !! | |
| set_fmtimeraevent(NEVENT_ABSOLUTE); | |
| set_fmtimerbevent(NEVENT_ABSOLUTE); | |
| #endif | |
| fmtimer.intr = irq & 0xc0; | fmtimer.intr = irq & 0xc0; |
| fmtimer.intdisabel = irq & 0x10; | fmtimer.intdisabel = irq & 0x10; |
| fmtimer.irq = irqtable[irq >> 6]; | fmtimer.irq = irqtable[irq >> 6]; |
| pic_registext(fmtimer.irq); | // pic_registext(fmtimer.irq); |
| } | } |
| void fmtimer_setreg(BYTE reg, BYTE value) { | void fmtimer_setreg(REG8 reg, REG8 value) { |
| // TRACEOUT(("fm %x %x [%.4x:%.4x]", reg, value, CPU_CS, CPU_IP)); | |
| switch(reg) { | switch(reg) { |
| case 0x24: | case 0x24: |
| Line 117 void fmtimer_setreg(BYTE reg, BYTE value | Line 116 void fmtimer_setreg(BYTE reg, BYTE value |
| break; | break; |
| case 0x27: | case 0x27: |
| #if 1 | |
| fmtimer.reg = value; | fmtimer.reg = value; |
| fmtimer.status &= ~((value & 0x30) >> 4); | fmtimer.status &= ~((value & 0x30) >> 4); |
| if (value & 0x01) { | if (value & 0x01) { |
| Line 139 void fmtimer_setreg(BYTE reg, BYTE value | Line 137 void fmtimer_setreg(BYTE reg, BYTE value |
| if (!(value & 0x03)) { | if (!(value & 0x03)) { |
| pic_resetirq(fmtimer.irq); | pic_resetirq(fmtimer.irq); |
| } | } |
| #else | |
| fmtimer.reg = value; | |
| fmtimer.status &= ~((value & 0x30) >> 4); | |
| if ((value & 0x10) && (!nevent_iswork(NEVENT_FMTIMERA))) { | |
| set_fmtimeraevent(NEVENT_ABSOLUTE); | |
| } | |
| if ((value & 0x20) && (!nevent_iswork(NEVENT_FMTIMERB))) { | |
| set_fmtimerbevent(NEVENT_ABSOLUTE); | |
| } | |
| #endif | |
| break; | break; |
| } | } |
| } | } |