--- np2/cbus/mpu98ii.c 2003/10/16 17:58:00 1.1.1.1 +++ np2/cbus/mpu98ii.c 2004/02/07 21:23:21 1.6 @@ -1,6 +1,5 @@ #include "compiler.h" #include "commng.h" -#include "i286.h" #include "pccore.h" #include "iocore.h" #include "cbuscore.h" @@ -41,10 +40,10 @@ enum { COMMNG cm_mpu98; -static const BYTE mpuirqnum[4] = {3, 5, 6, 12}; +static const UINT8 mpuirqnum[4] = {3, 5, 6, 12}; -static const BYTE fd_step1[4][4] = {{0, 0, 0, 0}, {1, 0, 0, 0}, - {1, 0, 1, 0}, {1, 1, 1, 0}}; +static const UINT8 fd_step1[4][4] = {{0, 0, 0, 0}, {1, 0, 0, 0}, + {1, 0, 1, 0}, {1, 1, 1, 0}}; static void makeintclock(void) { @@ -55,13 +54,13 @@ static void makeintclock(void) { if (l < 5*2) { l = 5*2; } - l *= mpu98.timebase; // *12 - mpu98.clock = (pc.realclock * 5 / l); // /12 + l *= mpu98.timebase; // *12 + mpu98.stepclock = (pccore.realclock * 5 / l); // /12 } -static void sendallclocks(BYTE data) { +static void sendallclocks(REG8 data) { - BYTE quarter; + REG8 quarter; int i; quarter = data >> 2; @@ -69,17 +68,19 @@ static void sendallclocks(BYTE data) { quarter = 64; } for (i=0; i<4; i++) { - mpu98.fd_step[i] = fd_step1[data & 3][i]; - mpu98.fd_step[i] += quarter; + mpu98.fd_step[i] = quarter + fd_step1[data & 3][i]; } mpu98.fd_remain = 0; } -static void setrecvdata(BYTE data) { +static void setrecvdata(REG8 data) { - if (mpu98.cnt < MPU98_RECVBUFS) { - mpu98.buf[(mpu98.pos + mpu98.cnt) & (MPU98_RECVBUFS - 1)] = data; - mpu98.cnt++; + MPURECV *r; + + r = &mpu98.r; + if (r->cnt < MPU98_RECVBUFS) { + r->buf[(r->pos + r->cnt) & (MPU98_RECVBUFS - 1)] = data; + r->cnt++; } } @@ -91,14 +92,14 @@ static void mpu98ii_int(void) { static void ch_step(void) { int i; - BYTE bit; + REG8 bit; if (mpu98.flag1 & MPU1FLAG_F9) { if (mpu98.f9.step) { mpu98.f9.step--; } } - for (i=0, bit=1; bit; bit<<=1, i++) { + for (i=0, bit=1; i<8; bit<<=1, i++) { if (mpu98.intch & bit) { if (mpu98.ch[i].step) { mpu98.ch[i].step--; @@ -110,7 +111,7 @@ static void ch_step(void) { static BOOL ch_nextsearch(void) { int i; - BYTE bit; + REG8 bit; ch_nextsearch_more: if (mpu98.intreq == 9) { @@ -148,7 +149,7 @@ ch_nextsearch_more: } ch->datas = 0; } - setrecvdata((BYTE)(0xf0 + mpu98.intreq)); + setrecvdata((REG8)(0xf0 + mpu98.intreq)); mpu98ii_int(); mpu98.recvevent |= MIDIE_STEP; return(TRUE); @@ -167,7 +168,7 @@ ch_nextsearch_more: void midiint(NEVENTITEM item) { - nevent_set(NEVENT_MIDIINT, mpu98.clock, midiint, NEVENT_RELATIVE); + nevent_set(NEVENT_MIDIINT, mpu98.stepclock, midiint, NEVENT_RELATIVE); if (mpu98.flag1 & MPU1FLAG_A) { if (!mpu98.fd_remain) { @@ -205,9 +206,9 @@ static void midiwait(SINT32 waitclock) { } } -static BOOL sendcmd(BYTE cmd) { +static BOOL sendcmd(REG8 cmd) { - BYTE work; + REG8 work; mpu98.cmd = cmd; switch(cmd & 0xf0) { @@ -282,7 +283,7 @@ static BOOL sendcmd(BYTE cmd) { case 0x95: // enable clock to host mpu98.flag1 |= MPU1FLAG_A; if (!nevent_iswork(NEVENT_MIDIINT)) { - nevent_set(NEVENT_MIDIINT, mpu98.clock, + nevent_set(NEVENT_MIDIINT, mpu98.stepclock, midiint, NEVENT_ABSOLUTE); } break; @@ -291,7 +292,7 @@ static BOOL sendcmd(BYTE cmd) { mpu98.flag1 |= MPU1FLAG_B; mpu98.remainstep = 0; if (!nevent_iswork(NEVENT_MIDIINT)) { - nevent_set(NEVENT_MIDIINT, mpu98.clock, + nevent_set(NEVENT_MIDIINT, mpu98.stepclock, midiint, NEVENT_ABSOLUTE); } break; @@ -339,7 +340,7 @@ static BOOL sendcmd(BYTE cmd) { return(TRUE); } -static void group_ex(BYTE cmd, BYTE data) { +static void group_ex(REG8 cmd, REG8 data) { switch(cmd) { case 0xe0: // tempo @@ -373,7 +374,7 @@ static void group_ex(BYTE cmd, BYTE data } } -static void senddat(BYTE data) { +static void senddat(REG8 data) { MPUCH *ch; @@ -506,7 +507,7 @@ static void senddat(BYTE data) { } -static void IOOUTCALL mpu98ii_o0(UINT port, BYTE dat) { +static void IOOUTCALL mpu98ii_o0(UINT port, REG8 dat) { UINT sent; @@ -516,11 +517,11 @@ static void IOOUTCALL mpu98ii_o0(UINT po if (cm_mpu98->connect != COMCONNECT_OFF) { if (mpu98.mode) { - sent = cm_mpu98->write(cm_mpu98, dat); + sent = cm_mpu98->write(cm_mpu98, (BYTE)dat); } else { if ((mpu98.cmd == 0xd0) || (mpu98.cmd == 0xdf)) { - sent = cm_mpu98->write(cm_mpu98, dat); + sent = cm_mpu98->write(cm_mpu98, (BYTE)dat); } else { senddat(dat); @@ -528,13 +529,13 @@ static void IOOUTCALL mpu98ii_o0(UINT po } } if (sent) { - midiwait(pc.midiclock * sent); + midiwait(mpu98.xferclock * sent); } } (void)port; } -static void IOOUTCALL mpu98ii_o2(UINT port, BYTE dat) { +static void IOOUTCALL mpu98ii_o2(UINT port, REG8 dat) { if (cm_mpu98 == NULL) { cm_mpu98 = commng_create(COMCREATE_MPU98II); @@ -560,27 +561,27 @@ static void IOOUTCALL mpu98ii_o2(UINT po setrecvdata(MPU_ACK); } } - midiwait(pc.realclock / 10000); + midiwait(pccore.realclock / 10000); } (void)port; } -static BYTE IOINPCALL mpu98ii_i0(UINT port) { +static REG8 IOINPCALL mpu98ii_i0(UINT port) { if (cm_mpu98 == NULL) { cm_mpu98 = commng_create(COMCREATE_MPU98II); } if (cm_mpu98->connect != COMCONNECT_OFF) { - if (mpu98.cnt) { - mpu98.cnt--; - if (mpu98.cnt) { + if (mpu98.r.cnt) { + mpu98.r.cnt--; + if (mpu98.r.cnt) { mpu98ii_int(); } else { pic_resetirq(mpu98.irqnum); } - mpu98.data = mpu98.buf[mpu98.pos]; - mpu98.pos = (mpu98.pos + 1) & (MPU98_RECVBUFS - 1); + mpu98.data = mpu98.r.buf[mpu98.r.pos]; + mpu98.r.pos = (mpu98.r.pos + 1) & (MPU98_RECVBUFS - 1); } return(mpu98.data); } @@ -588,16 +589,16 @@ static BYTE IOINPCALL mpu98ii_i0(UINT po return(0xff); } -static BYTE IOINPCALL mpu98ii_i2(UINT port) { +static REG8 IOINPCALL mpu98ii_i2(UINT port) { - BYTE ret; + REG8 ret; if (cm_mpu98 == NULL) { cm_mpu98 = commng_create(COMCREATE_MPU98II); } if (cm_mpu98->connect != COMCONNECT_OFF) { ret = mpu98.status; - if (!mpu98.cnt) { + if (!mpu98.r.cnt) { ret |= MIDIIN_AVAIL; } return(ret); @@ -632,14 +633,15 @@ void mpu98ii_reset(void) { mpu98.timebase = 2; mpu98.port = 0xc0d0 | ((np2cfg.mpuopt & 0xf0) << 6); mpu98.irqnum = mpuirqnum[np2cfg.mpuopt & 3]; - pic_registext(mpu98.irqnum); - makeintclock(); +// pic_registext(mpu98.irqnum); } void mpu98ii_bind(void) { UINT port; + mpu98.xferclock = pccore.realclock / 3125; + makeintclock(); port = mpu98.port; iocore_attachout(port, mpu98ii_o0); iocore_attachinp(port, mpu98ii_i0); @@ -653,9 +655,9 @@ void mpu98ii_callback(void) { BYTE data; if (cm_mpu98) { - while((mpu98.cnt < MPU98_RECVBUFS) && + while((mpu98.r.cnt < MPU98_RECVBUFS) && (cm_mpu98->read(cm_mpu98, &data))) { - if (!mpu98.cnt) { + if (!mpu98.r.cnt) { mpu98ii_int(); } setrecvdata(data);