|
|
| version 1.3, 2003/12/08 00:55:30 | version 1.8, 2007/11/03 00:00:19 |
|---|---|
| Line 1 | Line 1 |
| #include "compiler.h" | #include "compiler.h" |
| #if defined(SUPPORT_PC9861K) | |
| #include "commng.h" | #include "commng.h" |
| #include "pccore.h" | #include "pccore.h" |
| #include "iocore.h" | #include "iocore.h" |
| Line 6 | Line 9 |
| #include "pc9861k.h" | #include "pc9861k.h" |
| UINT pc9861en; | _PC9861K pc9861k; |
| _PC9861CH pc9861ch1; | |
| _PC9861CH pc9861ch2; | |
| COMMNG cm_pc9861ch1; | COMMNG cm_pc9861ch1; |
| COMMNG cm_pc9861ch2; | COMMNG cm_pc9861ch2; |
| Line 54 static void pc9861k_callback(COMMNG cm, | Line 54 static void pc9861k_callback(COMMNG cm, |
| void pc9861ch1cb(NEVENTITEM item) { | void pc9861ch1cb(NEVENTITEM item) { |
| if (item->flag & NEVENT_SETEVENT) { | if (item->flag & NEVENT_SETEVENT) { |
| nevent_set(NEVENT_PC9861CH1, pc9861ch1.clk, pc9861ch1cb, | nevent_set(NEVENT_PC9861CH1, pc9861k.ch1.clk, pc9861ch1cb, |
| NEVENT_RELATIVE); | NEVENT_RELATIVE); |
| } | } |
| pc9861k_callback(cm_pc9861ch1, &pc9861ch1); | pc9861k_callback(cm_pc9861ch1, &pc9861k.ch1); |
| } | } |
| void pc9861ch2cb(NEVENTITEM item) { | void pc9861ch2cb(NEVENTITEM item) { |
| if (item->flag & NEVENT_SETEVENT) { | if (item->flag & NEVENT_SETEVENT) { |
| nevent_set(NEVENT_PC9861CH2, pc9861ch2.clk, pc9861ch2cb, | nevent_set(NEVENT_PC9861CH2, pc9861k.ch2.clk, pc9861ch2cb, |
| NEVENT_RELATIVE); | NEVENT_RELATIVE); |
| } | } |
| pc9861k_callback(cm_pc9861ch2, &pc9861ch2); | pc9861k_callback(cm_pc9861ch2, &pc9861k.ch2); |
| } | } |
| static UINT32 pc9861k_getspeed(REG8 dip) { | static UINT32 pc9861k_getspeed(REG8 dip) { |
| Line 82 static UINT32 pc9861k_getspeed(REG8 dip) | Line 82 static UINT32 pc9861k_getspeed(REG8 dip) |
| speed = 0; | speed = 0; |
| } | } |
| } | } |
| if (speed > ((sizeof(pc9861k_speed) / sizeof(UINT32)) - 1)) { | if (speed > (NELEMENTS(pc9861k_speed) - 1)) { |
| speed = (sizeof(pc9861k_speed) / sizeof(UINT32)) - 1; | speed = NELEMENTS(pc9861k_speed) - 1; |
| } | } |
| return(pc9861k_speed[speed]); | return(pc9861k_speed[speed]); |
| } | } |
| static void pc9861_makeclk(PC9861CH m, UINT32 mul2) { | static void pc9861_makeclk(PC9861CH m, UINT32 mul2) { |
| m->clk = pc.realclock * mul2 / ((m->speed) * 2); | m->clk = pccore.realclock * mul2 / ((m->speed) * 2); |
| } | } |
| static void pc9861ch1_open(void) { | static void pc9861ch1_open(void) { |
| cm_pc9861ch1 = commng_create(COMCREATE_PC9861K1); | cm_pc9861ch1 = commng_create(COMCREATE_PC9861K1); |
| pc9861ch1.dip = np2cfg.pc9861sw[0]; | pc9861k.ch1.dip = np2cfg.pc9861sw[0]; |
| pc9861ch1.speed = pc9861k_getspeed(pc9861ch1.dip); | pc9861k.ch1.speed = pc9861k_getspeed(pc9861k.ch1.dip); |
| pc9861ch1.vect = ((np2cfg.pc9861sw[1] >> 1) & 1) | | pc9861k.ch1.vect = ((np2cfg.pc9861sw[1] >> 1) & 1) | |
| ((np2cfg.pc9861sw[1] << 1) & 2); | ((np2cfg.pc9861sw[1] << 1) & 2); |
| pc9861ch1.irq = ch1_irq[pc9861ch1.vect]; | pc9861k.ch1.irq = ch1_irq[pc9861k.ch1.vect]; |
| pc9861_makeclk(&pc9861ch1, 10*2); | pc9861_makeclk(&pc9861k.ch1, 10*2); |
| nevent_set(NEVENT_PC9861CH1, pc9861ch1.clk, pc9861ch1cb, NEVENT_ABSOLUTE); | nevent_set(NEVENT_PC9861CH1, pc9861k.ch1.clk, |
| pc9861ch1cb, NEVENT_ABSOLUTE); | |
| } | } |
| static void pc9861ch2_open(void) { | static void pc9861ch2_open(void) { |
| cm_pc9861ch2 = commng_create(COMCREATE_PC9861K2); | cm_pc9861ch2 = commng_create(COMCREATE_PC9861K2); |
| pc9861ch2.dip = np2cfg.pc9861sw[2]; | pc9861k.ch2.dip = np2cfg.pc9861sw[2]; |
| pc9861ch2.speed = pc9861k_getspeed(pc9861ch2.dip); | pc9861k.ch2.speed = pc9861k_getspeed(pc9861k.ch2.dip); |
| pc9861ch2.vect = ((np2cfg.pc9861sw[1] >> 3) & 1) | | pc9861k.ch2.vect = ((np2cfg.pc9861sw[1] >> 3) & 1) | |
| ((np2cfg.pc9861sw[1] >> 1) & 2); | ((np2cfg.pc9861sw[1] >> 1) & 2); |
| pc9861ch2.irq = ch1_irq[pc9861ch2.vect]; | pc9861k.ch2.irq = ch1_irq[pc9861k.ch2.vect]; |
| pc9861_makeclk(&pc9861ch2, 10*2); | pc9861_makeclk(&pc9861k.ch2, 10*2); |
| nevent_set(NEVENT_PC9861CH2, pc9861ch2.clk, pc9861ch2cb, NEVENT_ABSOLUTE); | nevent_set(NEVENT_PC9861CH2, pc9861k.ch2.clk, |
| pc9861ch2cb, NEVENT_ABSOLUTE); | |
| } | } |
| Line 129 static void IOOUTCALL pc9861data_w8(COMM | Line 131 static void IOOUTCALL pc9861data_w8(COMM |
| switch(port & 0x3) { | switch(port & 0x3) { |
| case 0x01: | case 0x01: |
| cm->write(cm, (BYTE)value); | cm->write(cm, (UINT8)value); |
| if (m->signal & 4) { | if (m->signal & 4) { |
| m->send = 0; | m->send = 0; |
| pic_setirq(m->irq); | pic_setirq(m->irq); |
| Line 208 static void IOOUTCALL pc9861k_ob0(UINT p | Line 210 static void IOOUTCALL pc9861k_ob0(UINT p |
| if (cm_pc9861ch1 == NULL) { | if (cm_pc9861ch1 == NULL) { |
| pc9861ch1_open(); | pc9861ch1_open(); |
| } | } |
| pc9861ch1.signal = dat; | pc9861k.ch1.signal = dat; |
| (void)port; | (void)port; |
| } | } |
| Line 217 static void IOOUTCALL pc9861k_ob2(UINT p | Line 219 static void IOOUTCALL pc9861k_ob2(UINT p |
| if (cm_pc9861ch2 == NULL) { | if (cm_pc9861ch2 == NULL) { |
| pc9861ch2_open(); | pc9861ch2_open(); |
| } | } |
| pc9861ch2.signal = dat; | pc9861k.ch2.signal = dat; |
| (void)port; | (void)port; |
| } | } |
| Line 227 static REG8 IOINPCALL pc9861k_ib0(UINT p | Line 229 static REG8 IOINPCALL pc9861k_ib0(UINT p |
| pc9861ch1_open(); | pc9861ch1_open(); |
| } | } |
| (void)port; | (void)port; |
| return(cm_pc9861ch1->getstat(cm_pc9861ch1) | pc9861ch1.vect); | return(cm_pc9861ch1->getstat(cm_pc9861ch1) | pc9861k.ch1.vect); |
| } | } |
| static REG8 IOINPCALL pc9861k_ib2(UINT port) { | static REG8 IOINPCALL pc9861k_ib2(UINT port) { |
| Line 236 static REG8 IOINPCALL pc9861k_ib2(UINT p | Line 238 static REG8 IOINPCALL pc9861k_ib2(UINT p |
| pc9861ch2_open(); | pc9861ch2_open(); |
| } | } |
| (void)port; | (void)port; |
| return(cm_pc9861ch2->getstat(cm_pc9861ch2) | pc9861ch2.vect); | return(cm_pc9861ch2->getstat(cm_pc9861ch2) | pc9861k.ch2.vect); |
| } | } |
| Line 245 static void IOOUTCALL pc9861k_ob1(UINT p | Line 247 static void IOOUTCALL pc9861k_ob1(UINT p |
| if (cm_pc9861ch1 == NULL) { | if (cm_pc9861ch1 == NULL) { |
| pc9861ch1_open(); | pc9861ch1_open(); |
| } | } |
| pc9861data_w8(cm_pc9861ch1, &pc9861ch1, port, dat); | pc9861data_w8(cm_pc9861ch1, &pc9861k.ch1, port, dat); |
| } | } |
| static REG8 IOINPCALL pc9861k_ib1(UINT port) { | static REG8 IOINPCALL pc9861k_ib1(UINT port) { |
| Line 253 static REG8 IOINPCALL pc9861k_ib1(UINT p | Line 255 static REG8 IOINPCALL pc9861k_ib1(UINT p |
| if (cm_pc9861ch2 == NULL) { | if (cm_pc9861ch2 == NULL) { |
| pc9861ch1_open(); | pc9861ch1_open(); |
| } | } |
| return(pc9861data_r8(cm_pc9861ch1, &pc9861ch1, port)); | return(pc9861data_r8(cm_pc9861ch1, &pc9861k.ch1, port)); |
| } | } |
| Line 262 static void IOOUTCALL pc9861k_ob9(UINT p | Line 264 static void IOOUTCALL pc9861k_ob9(UINT p |
| if (cm_pc9861ch2 == NULL) { | if (cm_pc9861ch2 == NULL) { |
| pc9861ch2_open(); | pc9861ch2_open(); |
| } | } |
| pc9861data_w8(cm_pc9861ch2, &pc9861ch2, port, dat); | pc9861data_w8(cm_pc9861ch2, &pc9861k.ch2, port, dat); |
| } | } |
| static REG8 IOINPCALL pc9861k_ib9(UINT port) { | static REG8 IOINPCALL pc9861k_ib9(UINT port) { |
| Line 270 static REG8 IOINPCALL pc9861k_ib9(UINT p | Line 272 static REG8 IOINPCALL pc9861k_ib9(UINT p |
| if (cm_pc9861ch2 == NULL) { | if (cm_pc9861ch2 == NULL) { |
| pc9861ch2_open(); | pc9861ch2_open(); |
| } | } |
| return(pc9861data_r8(cm_pc9861ch2, &pc9861ch2, port)); | return(pc9861data_r8(cm_pc9861ch2, &pc9861k.ch2, port)); |
| } | } |
| // ---- I/F | // ---- I/F |
| void pc9861k_construct(void) { | void pc9861k_initialize(void) { |
| cm_pc9861ch1 = NULL; | cm_pc9861ch1 = NULL; |
| cm_pc9861ch2 = NULL; | cm_pc9861ch2 = NULL; |
| } | } |
| void pc9861k_destruct(void) { | void pc9861k_deinitialize(void) { |
| commng_destroy(cm_pc9861ch1); | commng_destroy(cm_pc9861ch1); |
| cm_pc9861ch1 = NULL; | cm_pc9861ch1 = NULL; |
| Line 290 void pc9861k_destruct(void) { | Line 292 void pc9861k_destruct(void) { |
| cm_pc9861ch2 = NULL; | cm_pc9861ch2 = NULL; |
| } | } |
| void pc9861k_reset(void) { | void pc9861k_reset(const NP2CFG *pConfig) { |
| commng_destroy(cm_pc9861ch1); | commng_destroy(cm_pc9861ch1); |
| cm_pc9861ch1 = NULL; | cm_pc9861ch1 = NULL; |
| commng_destroy(cm_pc9861ch2); | commng_destroy(cm_pc9861ch2); |
| cm_pc9861ch2 = NULL; | cm_pc9861ch2 = NULL; |
| pc9861ch1 = pc9861def; | pc9861k.ch1 = pc9861def; |
| pc9861ch2 = pc9861def; | pc9861k.ch2 = pc9861def; |
| pc9861en = np2cfg.pc9861enable & 1; | pc9861k.en = pConfig->pc9861enable & 1; |
| } | } |
| void pc9861k_bind(void) { | void pc9861k_bind(void) { |
| if (pc9861en) { | pc9861k_deinitialize(); |
| if (pc9861k.en) { | |
| iocore_attachout(0xb0, pc9861k_ob0); | iocore_attachout(0xb0, pc9861k_ob0); |
| iocore_attachout(0xb2, pc9861k_ob2); | iocore_attachout(0xb2, pc9861k_ob2); |
| iocore_attachinp(0xb0, pc9861k_ib0); | iocore_attachinp(0xb0, pc9861k_ib0); |
| Line 332 void pc9861k_midipanic(void) { | Line 335 void pc9861k_midipanic(void) { |
| } | } |
| } | } |
| #endif | |