|
|
| version 1.2, 2003/10/21 11:22:05 | version 1.7, 2005/02/07 14:46:08 |
|---|---|
| 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 17 | Line 17 |
| const UINT32 pc9861k_speed[11] = {75, 150, 300, 600, 1200, 2400, 4800, | const UINT32 pc9861k_speed[11] = {75, 150, 300, 600, 1200, 2400, 4800, |
| 9600, 19200, 38400, 76800}; | 9600, 19200, 38400, 76800}; |
| static const BYTE ch1_irq[4] = {IRQ_INT0, IRQ_INT1, IRQ_INT2, IRQ_INT3}; | static const UINT8 ch1_irq[4] = {IRQ_INT0, IRQ_INT1, IRQ_INT2, IRQ_INT3}; |
| static const BYTE ch2_irq[4] = {IRQ_INT0, IRQ_INT41, IRQ_INT5, IRQ_INT6}; | static const UINT8 ch2_irq[4] = {IRQ_INT0, IRQ_INT41, IRQ_INT5, IRQ_INT6}; |
| static const _PC9861CH pc9861def = | static const _PC9861CH pc9861def = |
| {0x05, 0xff, 7, 1, | {0x05, 0xff, 7, 1, |
| 0, 0, 2400, NEVENT_MAXCLOCK, 0, 0, 0}; | 0, 0, 2400, NEVENT_MAXCLOCK, 0, 0, 0}; |
| Line 38 static void pc9861k_callback(COMMNG cm, | Line 38 static void pc9861k_callback(COMMNG cm, |
| } | } |
| } | } |
| else { | else { |
| m->result &= (BYTE)~2; | m->result &= ~2; |
| } | } |
| if (m->signal & 4) { | if (m->signal & 4) { |
| if (m->send) { | if (m->send) { |
| 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(BYTE dip) { | static UINT32 pc9861k_getspeed(REG8 dip) { |
| UINT speed; | UINT speed; |
| Line 82 static UINT32 pc9861k_getspeed(BYTE dip) | Line 82 static UINT32 pc9861k_getspeed(BYTE 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); | |
| } | } |
| // ------------------------------------------------------------------------- | // ------------------------------------------------------------------------- |
| static void IOOUTCALL pc9861data_w8(COMMNG cm, PC9861CH m, | static void IOOUTCALL pc9861data_w8(COMMNG cm, PC9861CH m, |
| UINT port, BYTE value) { | UINT port, REG8 value) { |
| UINT32 mul2; | UINT32 mul2; |
| switch(port & 0x3) { | switch(port & 0x3) { |
| case 0x01: | case 0x01: |
| cm->write(cm, 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 187 static void IOOUTCALL pc9861data_w8(COMM | Line 189 static void IOOUTCALL pc9861data_w8(COMM |
| } | } |
| } | } |
| static BYTE IOINPCALL pc9861data_r8(COMMNG cm, PC9861CH m, UINT port) { | static REG8 IOINPCALL pc9861data_r8(COMMNG cm, PC9861CH m, UINT port) { |
| switch(port & 0x3) { | switch(port & 0x3) { |
| case 0x01: | case 0x01: |
| Line 203 static BYTE IOINPCALL pc9861data_r8(COMM | Line 205 static BYTE IOINPCALL pc9861data_r8(COMM |
| } | } |
| static void IOOUTCALL pc9861k_ob0(UINT port, BYTE dat) { | static void IOOUTCALL pc9861k_ob0(UINT port, REG8 dat) { |
| if (cm_pc9861ch1 == NULL) { | if (cm_pc9861ch1 == NULL) { |
| pc9861ch1_open(); | pc9861ch1_open(); |
| } | } |
| pc9861ch1.signal = dat; | pc9861k.ch1.signal = dat; |
| (void)port; | (void)port; |
| } | } |
| static void IOOUTCALL pc9861k_ob2(UINT port, BYTE dat) { | static void IOOUTCALL pc9861k_ob2(UINT port, REG8 dat) { |
| if (cm_pc9861ch2 == NULL) { | if (cm_pc9861ch2 == NULL) { |
| pc9861ch2_open(); | pc9861ch2_open(); |
| } | } |
| pc9861ch2.signal = dat; | pc9861k.ch2.signal = dat; |
| (void)port; | (void)port; |
| } | } |
| static BYTE IOINPCALL pc9861k_ib0(UINT port) { | static REG8 IOINPCALL pc9861k_ib0(UINT port) { |
| if (cm_pc9861ch1 == NULL) { | if (cm_pc9861ch1 == NULL) { |
| 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 BYTE IOINPCALL pc9861k_ib2(UINT port) { | static REG8 IOINPCALL pc9861k_ib2(UINT port) { |
| if (cm_pc9861ch2 == NULL) { | if (cm_pc9861ch2 == NULL) { |
| 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); |
| } | } |
| static void IOOUTCALL pc9861k_ob1(UINT port, BYTE dat) { | static void IOOUTCALL pc9861k_ob1(UINT port, REG8 dat) { |
| 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 BYTE IOINPCALL pc9861k_ib1(UINT port) { | static REG8 IOINPCALL pc9861k_ib1(UINT port) { |
| 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)); |
| } | } |
| static void IOOUTCALL pc9861k_ob9(UINT port, BYTE dat) { | static void IOOUTCALL pc9861k_ob9(UINT port, REG8 dat) { |
| 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 BYTE IOINPCALL pc9861k_ib9(UINT port) { | static REG8 IOINPCALL pc9861k_ib9(UINT port) { |
| 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 297 void pc9861k_reset(void) { | Line 299 void pc9861k_reset(void) { |
| 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 = np2cfg.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 | |