|
|
| version 1.6, 2004/02/07 21:23:21 | version 1.7, 2005/02/04 05:32:23 |
|---|---|
| Line 1 | Line 1 |
| // emulation MPU-401 CPU Version 1.3 ('84/07/07) | |
| #include "compiler.h" | #include "compiler.h" |
| #include "commng.h" | #include "commng.h" |
| #include "pccore.h" | #include "pccore.h" |
| Line 12 enum { | Line 15 enum { |
| MIDIIN_AVAIL = 0x80, | MIDIIN_AVAIL = 0x80, |
| MIDIOUT_BUSY = 0x40, | MIDIOUT_BUSY = 0x40, |
| MPU_INT = 0xfd, | MPUMSG_TRACKDATAREQ = 0xf0, |
| MPU_ACK = 0xfe, | MPUMSG_OVERFLOW = 0xf8, |
| MPUMSG_REQCOND = 0xf9, | |
| MPUMSG_DATAEND = 0xfc, | |
| MPUMSG_HCLK = 0xfd, | |
| MPUMSG_ACK = 0xfe, | |
| MPUMSG_SYS = 0xff, | |
| MIDITIMEOUTCLOCK = 3000, | MIDITIMEOUTCLOCK = 3000, |
| MIDITIMEOUTCLOCK2 = 300 | MIDITIMEOUTCLOCK2 = 300 |
| }; | }; |
| enum { | enum { |
| MIDIE_STEP = 0x01, | MIDIE_STEP = 0x01, |
| MIDIE_2NDPARA = 0x02, | MIDIE_EVENT = 0x02, |
| MIDIE_EVENT = 0x04, | MIDIE_DATA = 0x04, |
| MIDIE_DATA = 0x08, | |
| MIDIE_F9DATA = 0x10, | |
| MIDIE_F9CMD = 0x20, | |
| MIDIE_F9PARA = 0x40 | |
| }; | }; |
| enum { | enum { |
| MPU1FLAG_A = 0x01, | MPUCMDP_IDLE = 0x00, |
| MPU1FLAG_B = 0x02, | MPUCMDP_STEP = 0x01, |
| MPU1FLAG_F9 = 0x04 | MPUCMDP_CMD = 0x02, |
| MPUCMDP_REQ = 0x04, | |
| MPUCMDP_FOLLOWBYTE = 0x08, | |
| MPUCMDP_SHORT = 0x10, | |
| MPUCMDP_LONG = 0x20, | |
| MPUCMDP_INIT = 0x80 | |
| }; | |
| enum { | |
| MPUSYNCMODE_INT = 0x00, | |
| MPUSYNCMODE_FSK = 0x01, | |
| MPUSYNCMODE_MIDI = 0x02, | |
| MPUMETROMODE_ACC = 0x00, | |
| MPUMETROMODE_OFF = 0x01, | |
| MPUMETROMODE_ON = 0x02, | |
| MPUFLAG1_PLAY = 0x01, | |
| MPUFLAG1_BENDERTOHOST = 0x08, | |
| MPUFLAG1_THRU = 0x10, | |
| MPUFLAG1_DATAINSTOP = 0x20, | |
| MPUFLAG1_SENDME = 0x40, | |
| MPUFLAG1_CONDUCTOR = 0x80, | |
| MPUFLAG2_RTAFF = 0x01, | |
| MPUFLAG2_FSKRESO = 0x02, | |
| MPUFLAG2_CLKTOHOST = 0x04, | |
| MPUFLAG2_EXECLUTOHOST = 0x08, | |
| MPUFLAG2_REFA = 0x10, | |
| MPUFLAG2_REFB = 0x20, | |
| MPUFLAG2_REFC = 0x40, | |
| MPUFLAG2_REFD = 0x80 | |
| }; | }; |
| Line 42 enum { | Line 77 enum { |
| static const UINT8 mpuirqnum[4] = {3, 5, 6, 12}; | static const UINT8 mpuirqnum[4] = {3, 5, 6, 12}; |
| static const UINT8 fd_step1[4][4] = {{0, 0, 0, 0}, {1, 0, 0, 0}, | static const UINT8 shortmsgleng[0x10] = { |
| 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 2, 2, 3, 1}; | |
| static const UINT8 hclk_step1[4][4] = {{0, 0, 0, 0}, {1, 0, 0, 0}, | |
| {1, 0, 1, 0}, {1, 1, 1, 0}}; | {1, 0, 1, 0}, {1, 1, 1, 0}}; |
| static void makeintclock(void) { | static void makeintclock(void) { |
| UINT32 l; | UINT32 l; |
| UINT curtempo; | |
| l = mpu98.tempo * 2 * mpu98.tempos / 0x40; | l = mpu98.tempo * 2 * mpu98.reltempo / 0x40; |
| if (l < 5*2) { | if (l < 5 * 2) { |
| l = 5*2; | l = 5 * 2; |
| } | |
| curtempo = l >> 1; | |
| if (curtempo > 250) { | |
| curtempo = 250; | |
| } | |
| mpu98.curtempo = curtempo; | |
| if (!(mpu98.flag2 & MPUFLAG2_FSKRESO)) { | |
| l *= mpu98.inttimebase; // *12 | |
| } | } |
| l *= mpu98.timebase; // *12 | |
| mpu98.stepclock = (pccore.realclock * 5 / l); // /12 | mpu98.stepclock = (pccore.realclock * 5 / l); // /12 |
| } | } |
| static void sendallclocks(REG8 data) { | static void sethclk(REG8 data) { |
| REG8 quarter; | REG8 quarter; |
| int i; | int i; |
| Line 68 static void sendallclocks(REG8 data) { | Line 114 static void sendallclocks(REG8 data) { |
| quarter = 64; | quarter = 64; |
| } | } |
| for (i=0; i<4; i++) { | for (i=0; i<4; i++) { |
| mpu98.fd_step[i] = quarter + fd_step1[data & 3][i]; | mpu98.hclk_step[i] = quarter + hclk_step1[data & 3][i]; |
| } | } |
| mpu98.fd_remain = 0; | mpu98.hclk_rem = 0; |
| } | |
| static void setdefaultcondition(void) { | |
| mpu98.recvevent = 0; | |
| mpu98.remainstep = 0; | |
| mpu98.intreq = 0; | |
| ZeroMemory(&mpu98.cmd, sizeof(mpu98.cmd)); | |
| ZeroMemory(mpu98.tr, sizeof(mpu98.tr)); | |
| ZeroMemory(&mpu98.cond, sizeof(mpu98.cond)); | |
| mpu98.syncmode = MPUSYNCMODE_INT; | |
| mpu98.metromode = MPUMETROMODE_OFF; | |
| mpu98.flag1 = MPUFLAG1_THRU | MPUFLAG1_SENDME; | |
| mpu98.flag2 = MPUFLAG2_RTAFF; | |
| mpu98.inttimebase = 120 / 24; | |
| mpu98.tempo = 100; | |
| mpu98.reltempo = 0x40; | |
| makeintclock(); | |
| mpu98.midipermetero = 12; | |
| mpu98.meteropermeas = 8; | |
| sethclk(240); | |
| mpu98.acttr = 0x00; | |
| mpu98.sendplaycnt = 0; | |
| mpu98.accch = 0xffff; | |
| } | } |
| static void setrecvdata(REG8 data) { | static void setrecvdata(REG8 data) { |
| Line 84 static void setrecvdata(REG8 data) { | Line 157 static void setrecvdata(REG8 data) { |
| } | } |
| } | } |
| static void sendmpushortmsg(const UINT8 *dat, UINT count) { | |
| UINT i; | |
| #if 0 | |
| if (!(mpu98.flag1 & MPUFLAG1_BENDERTOHOST)) { | |
| switch(dat[0] >> 4) { | |
| case 0x0a: | |
| case 0x0d: | |
| case 0x0e: | |
| return; | |
| case 0x0b: | |
| if (dat[1] < 0x40) { | |
| return; | |
| } | |
| break; | |
| } | |
| } | |
| #endif | |
| for (i=0; i<count; i++) { | |
| cm_mpu98->write(cm_mpu98, dat[i]); | |
| } | |
| } | |
| static void sendmpulongmsg(const UINT8 *dat, UINT count) { | |
| UINT i; | |
| for (i=0; i<count; i++) { | |
| cm_mpu98->write(cm_mpu98, dat[i]); | |
| } | |
| } | |
| static void mpu98ii_int(void) { | static void mpu98ii_int(void) { |
| pic_setirq(mpu98.irqnum); | pic_setirq(mpu98.irqnum); |
| } | } |
| static void ch_step(void) { | static void tr_step(void) { |
| int i; | int i; |
| REG8 bit; | REG8 bit; |
| if (mpu98.flag1 & MPU1FLAG_F9) { | if (mpu98.flag1 & MPUFLAG1_CONDUCTOR) { |
| if (mpu98.f9.step) { | if (mpu98.cond.step) { |
| mpu98.f9.step--; | mpu98.cond.step--; |
| } | } |
| } | } |
| for (i=0, bit=1; i<8; bit<<=1, i++) { | for (i=0, bit=1; i<8; bit<<=1, i++) { |
| if (mpu98.intch & bit) { | if (mpu98.acttr & bit) { |
| if (mpu98.ch[i].step) { | if (mpu98.tr[i].step) { |
| mpu98.ch[i].step--; | mpu98.tr[i].step--; |
| } | } |
| } | } |
| } | } |
| } | } |
| static BOOL ch_nextsearch(void) { | static BOOL tr_nextsearch(void) { |
| int i; | int i; |
| REG8 bit; | REG8 bit; |
| ch_nextsearch_more: | tr_nextsearch_more: |
| if (mpu98.intreq == 9) { | if (mpu98.intreq == 9) { |
| if (mpu98.flag1 & MPU1FLAG_F9) { | if (mpu98.flag1 & MPUFLAG1_CONDUCTOR) { |
| if (!mpu98.f9.step) { | if (!mpu98.cond.step) { |
| setrecvdata(0xf9); | setrecvdata(MPUMSG_REQCOND); |
| mpu98ii_int(); | mpu98ii_int(); |
| mpu98.f9.datas = 0; | mpu98.cond.phase |= MPUCMDP_STEP | MPUCMDP_CMD; |
| mpu98.f9.remain = MPU98_EXCVBUFS; | |
| mpu98.recvevent |= MIDIE_F9DATA; | |
| return(TRUE); | return(TRUE); |
| } | } |
| } | } |
| Line 129 ch_nextsearch_more: | Line 234 ch_nextsearch_more: |
| } | } |
| bit = 1 << mpu98.intreq; | bit = 1 << mpu98.intreq; |
| for (; bit; bit>>=1) { | for (; bit; bit>>=1) { |
| if (mpu98.intch & bit) { | if (mpu98.acttr & bit) { |
| MPUCH *ch; | MPUTR *tr; |
| ch = mpu98.ch + mpu98.intreq; | tr = mpu98.tr + mpu98.intreq; |
| if (!ch->step) { | if (!tr->step) { |
| if ((ch->datas) && (ch->remain == 0)) { | if ((tr->datas) && (tr->remain == 0)) { |
| if (cm_mpu98 == NULL) { | if (cm_mpu98 == NULL) { |
| cm_mpu98 = commng_create(COMCREATE_MPU98II); | cm_mpu98 = commng_create(COMCREATE_MPU98II); |
| } | } |
| if (ch->data[0] == MIDI_STOP) { | if (tr->data[0] == MIDI_STOP) { |
| ch->datas = 0; | tr->datas = 0; |
| cm_mpu98->write(cm_mpu98, MIDI_STOP); | cm_mpu98->write(cm_mpu98, MIDI_STOP); |
| setrecvdata(MIDI_STOP); | setrecvdata(MIDI_STOP); |
| mpu98ii_int(); | mpu98ii_int(); |
| return(TRUE); | return(TRUE); |
| } | } |
| for (i=0; i<ch->datas; i++) { | for (i=0; i<tr->datas; i++) { |
| cm_mpu98->write(cm_mpu98, ch->data[i]); | cm_mpu98->write(cm_mpu98, tr->data[i]); |
| } | } |
| ch->datas = 0; | tr->datas = 0; |
| } | } |
| setrecvdata((REG8)(0xf0 + mpu98.intreq)); | setrecvdata((REG8)(0xf0 + mpu98.intreq)); |
| mpu98ii_int(); | mpu98ii_int(); |
| Line 159 ch_nextsearch_more: | Line 264 ch_nextsearch_more: |
| } | } |
| mpu98.remainstep--; | mpu98.remainstep--; |
| if (mpu98.remainstep) { | if (mpu98.remainstep) { |
| ch_step(); | tr_step(); |
| mpu98.intreq = 9; | mpu98.intreq = 9; |
| goto ch_nextsearch_more; | goto tr_nextsearch_more; |
| } | } |
| return(FALSE); | return(FALSE); |
| } | } |
| Line 170 void midiint(NEVENTITEM item) { | Line 275 void midiint(NEVENTITEM item) { |
| nevent_set(NEVENT_MIDIINT, mpu98.stepclock, midiint, NEVENT_RELATIVE); | nevent_set(NEVENT_MIDIINT, mpu98.stepclock, midiint, NEVENT_RELATIVE); |
| if (mpu98.flag1 & MPU1FLAG_A) { | if (mpu98.flag2 & MPUFLAG2_CLKTOHOST) { |
| if (!mpu98.fd_remain) { | if (!mpu98.hclk_rem) { |
| mpu98.fd_remain = mpu98.fd_step[mpu98.fd_cnt & 3]; | mpu98.hclk_rem = mpu98.hclk_step[mpu98.hclk_cnt & 3]; |
| mpu98.fd_cnt++; | mpu98.hclk_cnt++; |
| } | } |
| mpu98.fd_remain--; | mpu98.hclk_rem--; |
| if (!mpu98.fd_remain) { | if (!mpu98.hclk_rem) { |
| setrecvdata(MPU_INT); | setrecvdata(MPUMSG_HCLK); |
| mpu98ii_int(); | mpu98ii_int(); |
| } | } |
| } | } |
| if (mpu98.flag1 & MPU1FLAG_B) { | if (mpu98.flag1 & MPUFLAG1_PLAY) { |
| if (!mpu98.remainstep++) { | if (!mpu98.remainstep++) { |
| ch_step(); | tr_step(); |
| mpu98.intreq = 9; | mpu98.intreq = 9; |
| ch_nextsearch(); | tr_nextsearch(); |
| } | } |
| } | } |
| (void)item; | (void)item; |
| Line 206 static void midiwait(SINT32 waitclock) { | Line 311 static void midiwait(SINT32 waitclock) { |
| } | } |
| } | } |
| static BOOL sendcmd(REG8 cmd) { | |
| REG8 work; | // ---- |
| mpu98.cmd = cmd; | typedef REG8 (*MPUCMDFN)(REG8 cmd); |
| switch(cmd & 0xf0) { | |
| case 0xe0: // send 2nddata | |
| mpu98.recvevent |= MIDIE_2NDPARA; | |
| return(TRUE); | |
| case 0xa0: // recv data | static REG8 mpucmd_xx(REG8 cmd) { |
| return(TRUE); | |
| case 0xc0: // timebase | // TRACEOUT(("unknown MPU commands: %.2x", cmd)); |
| work = cmd & 0x0f; | (void)cmd; |
| if ((!work) || (work > MPU98_MAXTIMEBASE)) { | return(MPUCMDP_IDLE); |
| return(FALSE); | } |
| } | |
| mpu98.timebase = work; | |
| makeintclock(); | |
| return(TRUE); | |
| } | |
| switch(cmd) { | static REG8 mpucmd_md(REG8 cmd) { // 00-2F: Mode |
| case 0xd0: // send short | |
| case 0xd1: | |
| case 0xd2: | |
| case 0xd3: | |
| case 0xd4: | |
| case 0xd5: | |
| case 0xd6: | |
| case 0xd7: | |
| case 0xdf: // send long | |
| break; | |
| case 0xff: // reset | #if 0 |
| cm_mpu98->msg(cm_mpu98, COMMSG_MIDIRESET, 0); | switch((cmd >> 0) & 3) { |
| mpu98.intch = 0; | case 1: // MIDI Stop |
| case 2: // MIDI Start | |
| case 3: // MIDI Cont | |
| break; | |
| } | |
| #endif | |
| switch((cmd >> 2) & 3) { | |
| case 1: // Stop Play | |
| mpu98.flag1 &= ~MPUFLAG1_PLAY; | |
| mpu98.recvevent = 0; | mpu98.recvevent = 0; |
| mpu98.intreq = 0; | mpu98.intreq = 0; |
| mpu98.flag1 = 0; | ZeroMemory(mpu98.tr, sizeof(mpu98.tr)); |
| mpu98.remainstep = 0; | ZeroMemory(&mpu98.cond, sizeof(mpu98.cond)); |
| ZeroMemory(mpu98.ch, sizeof(mpu98.ch)); | if (!(mpu98.flag2 & MPUFLAG2_CLKTOHOST)) { |
| ZeroMemory(&mpu98.f9, sizeof(mpu98.f9)); | nevent_reset(NEVENT_MIDIINT); |
| nevent_reset(NEVENT_MIDIINT); | } |
| break; | |
| mpu98.tempo = 120; | case 2: // Start Play |
| mpu98.tempos = 0x40; | mpu98.flag1 |= MPUFLAG1_PLAY; |
| makeintclock(); | mpu98.remainstep = 0; |
| if (!nevent_iswork(NEVENT_MIDIINT)) { | |
| nevent_set(NEVENT_MIDIINT, mpu98.stepclock, | |
| midiint, NEVENT_ABSOLUTE); | |
| } | |
| break; | break; |
| } | |
| #if 0 | |
| switch((cmd >> 4) & 3) { | |
| case 1: // Stop Rec | |
| case 2: // Rec | |
| break; | |
| } | |
| #endif | |
| return(MPUCMDP_IDLE); | |
| } | |
| static REG8 mpucmd_3f(REG8 cmd) { // 3F: UART | |
| mpu98.mode = 1; | |
| cm_mpu98->msg(cm_mpu98, COMMSG_MIDIRESET, 0); | |
| (void)cmd; | |
| return(MPUCMDP_IDLE); | |
| } | |
| static REG8 mpucmd_sr(REG8 cmd) { // 40-7F: Set ch of Ref table | |
| (void)cmd; | |
| return(MPUCMDP_IDLE); | |
| } | |
| static REG8 mpucmd_sm(REG8 cmd) { // 80-82: Clock Sync/Mode | |
| mpu98.syncmode = cmd - 0x80; | |
| return(MPUCMDP_IDLE); | |
| } | |
| case 0x3f: // uart mode on | static REG8 mpucmd_mm(REG8 cmd) { // 83-85: Metronome |
| mpu98.mode = 1; | |
| cm_mpu98->msg(cm_mpu98, COMMSG_MIDIRESET, 0); | mpu98.metromode = cmd - 0x83; |
| return(MPUCMDP_IDLE); | |
| } | |
| static REG8 mpucmd_8x(REG8 cmd) { // 86-8F: Flag1 | |
| REG8 bit; | |
| bit = 1 << ((cmd >> 1) & 7); | |
| if (cmd & 1) { | |
| mpu98.flag1 |= bit; | |
| } | |
| else { | |
| mpu98.flag1 &= ~bit; | |
| } | |
| #if 0 | |
| switch(cmd & 0x0f) { | |
| case 0x06: // 86: Bender to Host / off | |
| case 0x07: // 87: Bender to Host / on | |
| case 0x08: // 88: THRU / off | |
| case 0x09: // 89: THRU / on | |
| case 0x0a: // 8A: Data in Stop / off | |
| case 0x0b: // 8B: Data in Stop / on | |
| case 0x0c: // 8C: Send Me / off | |
| case 0x0d: // 8D: Send Me / on | |
| case 0x0e: // 8E: Conductor / off | |
| case 0x0f: // 8F: Conductor / on | |
| break; | break; |
| } | |
| #endif | |
| return(MPUCMDP_IDLE); | |
| } | |
| case 0x94: // disable clock to host | static REG8 mpucmd_9x(REG8 cmd) { // 90-9F: Flag2 |
| mpu98.flag1 &= ~MPU1FLAG_A; | |
| if (!(mpu98.flag1 & MPU1FLAG_B)) { | REG8 bit; |
| nevent_reset(NEVENT_MIDIINT); | |
| } | bit = 1 << ((cmd >> 1) & 7); |
| if (cmd & 1) { | |
| mpu98.flag2 |= bit; | |
| } | |
| else { | |
| mpu98.flag2 &= ~bit; | |
| } | |
| switch(cmd & 0x0f) { | |
| #if 0 | |
| case 0x00: // 90: RT Aff / off | |
| case 0x01: // 91: RT Aff / on | |
| case 0x02: // 92: FSK Reso / INT | |
| case 0x03: // 93: FSK Reso / 24 | |
| break; | break; |
| #endif | |
| case 0x05: | case 0x04: // 94: CLK to Host / off |
| mpu98.flag1 &= ~MPU1FLAG_B; | if (!(mpu98.flag1 & MPUFLAG1_PLAY)) { |
| mpu98.recvevent = 0; | |
| mpu98.intreq = 0; | |
| ZeroMemory(mpu98.ch, sizeof(mpu98.ch)); | |
| ZeroMemory(&mpu98.f9, sizeof(mpu98.f9)); | |
| if (!(mpu98.flag1 & MPU1FLAG_A)) { | |
| nevent_reset(NEVENT_MIDIINT); | nevent_reset(NEVENT_MIDIINT); |
| } | } |
| break; | break; |
| case 0x95: // enable clock to host | case 0x05: // 95: CLK to Host / on |
| mpu98.flag1 |= MPU1FLAG_A; | |
| if (!nevent_iswork(NEVENT_MIDIINT)) { | if (!nevent_iswork(NEVENT_MIDIINT)) { |
| nevent_set(NEVENT_MIDIINT, mpu98.stepclock, | nevent_set(NEVENT_MIDIINT, mpu98.stepclock, |
| midiint, NEVENT_ABSOLUTE); | midiint, NEVENT_ABSOLUTE); |
| } | } |
| break; | break; |
| case 0x0a: | #if 0 |
| mpu98.flag1 |= MPU1FLAG_B; | case 0x06: // 96: Exclu to Host / off |
| mpu98.remainstep = 0; | case 0x07: // 97: Exclu to Host / on |
| if (!nevent_iswork(NEVENT_MIDIINT)) { | case 0x08: // 98: Ref A / off |
| nevent_set(NEVENT_MIDIINT, mpu98.stepclock, | case 0x09: // 99: Ref A / on |
| midiint, NEVENT_ABSOLUTE); | case 0x0a: // 9A: Ref B / off |
| } | case 0x0b: // 9B: Ref B / on |
| case 0x0c: // 9C: Ref C / off | |
| case 0x0d: // 9D: Ref C / on | |
| case 0x0e: // 9E: Ref D / off | |
| case 0x0f: // 9F: Ref D / on | |
| break; | break; |
| #endif | |
| } | |
| return(MPUCMDP_IDLE); | |
| } | |
| case 0x8e: // disable f9 | static REG8 mpucmd_rq(REG8 cmd) { // A0-AF: Req |
| mpu98.flag1 &= ~MPU1FLAG_F9; | |
| break; | |
| case 0x8f: // enable f9 | (void)cmd; |
| mpu98.flag1 |= MPU1FLAG_F9; | return(MPUCMDP_REQ); |
| break; | } |
| static REG8 mpucmd_b1(REG8 cmd) { // B1: Clear Rel | |
| mpu98.reltempo = 0x40; | |
| makeintclock(); | |
| (void)cmd; | |
| return(MPUCMDP_IDLE); | |
| } | |
| static REG8 mpucmd_b8(REG8 cmd) { // B8: Clear PC | |
| int i; | |
| for (i=0; i<8; i++) { | |
| mpu98.tr[i].step = 0; | |
| } | |
| (void)cmd; | |
| return(MPUCMDP_IDLE); | |
| } | |
| static REG8 mpucmd_tb(REG8 cmd) { // C2-C8: .INT Time Base | |
| mpu98.inttimebase = cmd & 0x0f; | |
| makeintclock(); | |
| (void)cmd; | |
| return(MPUCMDP_IDLE); | |
| } | |
| static REG8 mpucmd_ws(REG8 cmd) { // D0-D7: Want to Send Data | |
| (void)cmd; | |
| return(MPUCMDP_SHORT | MPUCMDP_INIT); | |
| } | |
| static REG8 mpucmd_df(REG8 cmd) { // DF: WSD System | |
| (void)cmd; | |
| return(MPUCMDP_LONG | MPUCMDP_INIT); | |
| } | |
| static REG8 mpucmd_fo(REG8 cmd) { // E0-EF: Following Byte | |
| #if 0 // ÌÌÅݤʤΤǥ³¥Þ¥ó¥É¥Á¥§¥Ã¥¯¤·¤Ê¤¤¡Ä | (void)cmd; |
| case 0x01: // send MIDI stop | return(MPUCMDP_FOLLOWBYTE); |
| case 0x02: // send MIDI start | } |
| case 0x03: // send MIDI continue | |
| static REG8 mpucmd_ff(REG8 cmd) { // FF: Reset | |
| cm_mpu98->msg(cm_mpu98, COMMSG_MIDIRESET, 0); | |
| nevent_reset(NEVENT_MIDIINT); | |
| setdefaultcondition(); | |
| (void)cmd; | |
| return(MPUCMDP_IDLE); | |
| } | |
| static const MPUCMDFN mpucmds[0x100] = { | |
| mpucmd_xx, mpucmd_md, mpucmd_md, mpucmd_md, // 00 | |
| mpucmd_xx, mpucmd_md, mpucmd_md, mpucmd_md, | |
| mpucmd_xx, mpucmd_md, mpucmd_md, mpucmd_md, | |
| mpucmd_xx, mpucmd_xx, mpucmd_xx, mpucmd_xx, | |
| mpucmd_xx, mpucmd_md, mpucmd_md, mpucmd_md, // 10 | |
| mpucmd_xx, mpucmd_md, mpucmd_md, mpucmd_md, | |
| mpucmd_xx, mpucmd_md, mpucmd_md, mpucmd_md, | |
| mpucmd_xx, mpucmd_xx, mpucmd_xx, mpucmd_xx, | |
| mpucmd_xx, mpucmd_md, mpucmd_md, mpucmd_md, // 20 | |
| mpucmd_xx, mpucmd_md, mpucmd_md, mpucmd_md, | |
| mpucmd_xx, mpucmd_md, mpucmd_md, mpucmd_md, | |
| mpucmd_xx, mpucmd_xx, mpucmd_xx, mpucmd_xx, | |
| mpucmd_xx, mpucmd_xx, mpucmd_xx, mpucmd_xx, // 30 | |
| mpucmd_xx, mpucmd_xx, mpucmd_xx, mpucmd_xx, | |
| mpucmd_xx, mpucmd_xx, mpucmd_xx, mpucmd_xx, | |
| mpucmd_xx, mpucmd_xx, mpucmd_xx, mpucmd_3f, | |
| mpucmd_sr, mpucmd_sr, mpucmd_sr, mpucmd_sr, // 40 | |
| mpucmd_sr, mpucmd_sr, mpucmd_sr, mpucmd_sr, | |
| mpucmd_sr, mpucmd_sr, mpucmd_sr, mpucmd_sr, | |
| mpucmd_sr, mpucmd_sr, mpucmd_sr, mpucmd_sr, | |
| mpucmd_sr, mpucmd_sr, mpucmd_sr, mpucmd_sr, // 50 | |
| mpucmd_sr, mpucmd_sr, mpucmd_sr, mpucmd_sr, | |
| mpucmd_sr, mpucmd_sr, mpucmd_sr, mpucmd_sr, | |
| mpucmd_sr, mpucmd_sr, mpucmd_sr, mpucmd_sr, | |
| mpucmd_sr, mpucmd_sr, mpucmd_sr, mpucmd_sr, // 60 | |
| mpucmd_sr, mpucmd_sr, mpucmd_sr, mpucmd_sr, | |
| mpucmd_sr, mpucmd_sr, mpucmd_sr, mpucmd_sr, | |
| mpucmd_sr, mpucmd_sr, mpucmd_sr, mpucmd_sr, | |
| mpucmd_sr, mpucmd_sr, mpucmd_sr, mpucmd_sr, // 70 | |
| mpucmd_sr, mpucmd_sr, mpucmd_sr, mpucmd_sr, | |
| mpucmd_sr, mpucmd_sr, mpucmd_sr, mpucmd_sr, | |
| mpucmd_sr, mpucmd_sr, mpucmd_sr, mpucmd_sr, | |
| mpucmd_sm, mpucmd_sm, mpucmd_sm, mpucmd_mm, // 80 | |
| mpucmd_mm, mpucmd_mm, mpucmd_8x, mpucmd_8x, | |
| mpucmd_8x, mpucmd_8x, mpucmd_8x, mpucmd_8x, | |
| mpucmd_8x, mpucmd_8x, mpucmd_8x, mpucmd_8x, | |
| mpucmd_9x, mpucmd_9x, mpucmd_9x, mpucmd_9x, // 90 | |
| mpucmd_9x, mpucmd_9x, mpucmd_9x, mpucmd_9x, | |
| mpucmd_9x, mpucmd_9x, mpucmd_9x, mpucmd_9x, | |
| mpucmd_9x, mpucmd_9x, mpucmd_9x, mpucmd_9x, | |
| case 0x15: // stop recording, playback and MIDI | mpucmd_rq, mpucmd_rq, mpucmd_rq, mpucmd_rq, // a0 |
| mpucmd_rq, mpucmd_rq, mpucmd_rq, mpucmd_rq, | |
| mpucmd_xx, mpucmd_xx, mpucmd_xx, mpucmd_rq, | |
| mpucmd_rq, mpucmd_rq, mpucmd_xx, mpucmd_rq, | |
| case 0x32: // ? | mpucmd_xx, mpucmd_b1, mpucmd_xx, mpucmd_xx, // b0 |
| case 0x34: // return timing bytes in stop mode | mpucmd_xx, mpucmd_xx, mpucmd_xx, mpucmd_xx, |
| case 0x35: // enable mode messages to PC | mpucmd_b8, mpucmd_xx, mpucmd_xx, mpucmd_xx, |
| case 0x38: // enable sys common messages to PC | mpucmd_xx, mpucmd_xx, mpucmd_xx, mpucmd_xx, |
| case 0x39: // Enable real time messages to PC | |
| case 0x3c: // use CLS sync | |
| case 0x3d: // use SMPTE sync | |
| case 0x80: // use MIDI sync | mpucmd_xx, mpucmd_xx, mpucmd_tb, mpucmd_tb, // c0 |
| case 0x81: // use FSK sync | mpucmd_tb, mpucmd_tb, mpucmd_tb, mpucmd_tb, |
| case 0x82: // use MIDI sync | mpucmd_tb, mpucmd_xx, mpucmd_xx, mpucmd_xx, |
| case 0x83: // enable metronome without accents | mpucmd_xx, mpucmd_xx, mpucmd_xx, mpucmd_xx, |
| case 0x84: // disable metronome | |
| case 0x8a: // disable data in stopped mode | |
| case 0x8b: // enable data in stop mode | |
| case 0x8c: // disable measure end messages to host | |
| case 0x91: // enable ext MIDI ctrl | mpucmd_ws, mpucmd_ws, mpucmd_ws, mpucmd_ws, // d0 |
| case 0x97: // enable system exclusive messages to PC | mpucmd_ws, mpucmd_ws, mpucmd_ws, mpucmd_ws, |
| mpucmd_xx, mpucmd_xx, mpucmd_xx, mpucmd_xx, | |
| mpucmd_xx, mpucmd_xx, mpucmd_xx, mpucmd_df, | |
| mpucmd_fo, mpucmd_fo, mpucmd_fo, mpucmd_xx, // e0 | |
| mpucmd_fo, mpucmd_xx, mpucmd_fo, mpucmd_fo, | |
| mpucmd_xx, mpucmd_xx, mpucmd_xx, mpucmd_xx, | |
| mpucmd_fo, mpucmd_fo, mpucmd_fo, mpucmd_fo, | |
| mpucmd_xx, mpucmd_xx, mpucmd_xx, mpucmd_xx, // f0 | |
| mpucmd_xx, mpucmd_xx, mpucmd_xx, mpucmd_xx, | |
| mpucmd_xx, mpucmd_xx, mpucmd_xx, mpucmd_xx, | |
| mpucmd_xx, mpucmd_xx, mpucmd_xx, mpucmd_ff}; | |
| static void reqmpucmdgroupd(REG8 cmd) { | |
| switch(cmd) { | |
| case 0xa0: // A0: Req Play Cnt Tr1 | |
| case 0xa1: // A1: Req Play Cnt Tr2 | |
| case 0xa2: // A2: Req Play Cnt Tr3 | |
| case 0xa3: // A3: Req Play Cnt Tr4 | |
| case 0xa4: // A4: Req Play Cnt Tr5 | |
| case 0xa5: // A5: Req Play Cnt Tr6 | |
| case 0xa6: // A6: Req Play Cnt Tr7 | |
| case 0xa7: // A7: Req Play Cnt Tr8 | |
| setrecvdata(mpu98.tr[cmd - 0xa0].step); | |
| break; | break; |
| default: | case 0xab: // AB: Read & Clear RC |
| return(FALSE); | setrecvdata(0); |
| #endif | break; |
| case 0xac: // AC: Req Major Version | |
| setrecvdata(1); | |
| break; | |
| case 0xad: // AD: Req Minor Version | |
| setrecvdata(0); | |
| break; | |
| case 0xaf: // AF: Req Tempo | |
| setrecvdata(mpu98.curtempo); | |
| break; | |
| } | } |
| return(TRUE); | |
| } | } |
| static void group_ex(REG8 cmd, REG8 data) { | static void setmpucmdgroupe(REG8 cmd, REG8 data) { |
| switch(cmd) { | switch(cmd) { |
| case 0xe0: // tempo | case 0xe0: // Set Tempo |
| mpu98.tempo = data; | mpu98.tempo = data; |
| mpu98.tempos = 0x40; | mpu98.reltempo = 0x40; |
| makeintclock(); | makeintclock(); |
| break; | break; |
| case 0xe1: // ? ÁêÂХƥó¥Ý¤Ã¤Ý¤¤¤±¤É¡Ä | case 0xe1: // Rel Tempo |
| mpu98.tempos = data; | mpu98.reltempo = data; |
| makeintclock(); | makeintclock(); |
| break; | break; |
| case 0xe2: // ? | case 0xe2: // Graduation |
| break; | break; |
| case 0xe4: // clocks/click | case 0xe4: // MIDI/Metro |
| mpu98.midipermetero = data; | |
| break; | break; |
| case 0xe6: // beats/measure | case 0xe6: // Metro/Meas |
| // TRACE_("beat/measure:", data); | mpu98.meteropermeas = data; |
| break; | break; |
| case 0xe7: // send all clocks to host | case 0xe7: // INTx4/H.CLK |
| sendallclocks(data); | sethclk(data); |
| break; | break; |
| case 0xec: // channel mask? | case 0xec: // Act Tr |
| mpu98.intch = data; | mpu98.acttr = data; |
| break; | |
| case 0xed: // Send Play CNT | |
| mpu98.sendplaycnt = data; | |
| break; | |
| case 0xee: // Acc CH 1-8 | |
| mpu98.accch = (mpu98.accch & 0xff00) | data; | |
| break; | |
| case 0xef: // Acc CH 9-16 | |
| mpu98.accch = (mpu98.accch & 0x00ff) | (data << 8); | |
| break; | break; |
| } | } |
| } | } |
| static void senddat(REG8 data) { | static BOOL sendmpumsg(MPUCMDS *cmd, REG8 data) { |
| if (cmd->phase & MPUCMDP_SHORT) { | |
| if (cmd->phase & MPUCMDP_INIT) { | |
| cmd->phase &= ~MPUCMDP_INIT; | |
| if (!(data & 0x80)) { | |
| cmd->data[0] = cmd->rstat; | |
| cmd->datapos = 1; | |
| cmd->datacnt = shortmsgleng[cmd->rstat >> 4]; | |
| } | |
| else { | |
| if ((data & 0xf0) != 0xf0) { | |
| cmd->rstat = data; | |
| } | |
| cmd->datapos = 0; | |
| cmd->datacnt = shortmsgleng[data >> 4]; | |
| } | |
| } | |
| cmd->data[cmd->datapos] = data; | |
| cmd->datapos++; | |
| if (cmd->datapos >= cmd->datacnt) { | |
| sendmpushortmsg(cmd->data, cmd->datacnt); | |
| cmd->phase &= ~MPUCMDP_SHORT; | |
| } | |
| return(TRUE); | |
| } | |
| else if (cmd->phase & MPUCMDP_LONG) { | |
| if (cmd->phase & MPUCMDP_INIT) { | |
| cmd->phase &= ~MPUCMDP_INIT; | |
| cmd->datapos = 0; | |
| cmd->datacnt = sizeof(cmd->data); | |
| } | |
| if (cmd->datapos < cmd->datacnt) { | |
| cmd->data[cmd->datapos] = data; | |
| cmd->datapos++; | |
| } | |
| switch(cmd->data[0]) { | |
| case 0xf0: | |
| if (data == 0xf7) { | |
| cmd->phase &= ~MPUCMDP_LONG; | |
| sendmpulongmsg(cmd->data, cmd->datapos); | |
| } | |
| break; | |
| case 0xf2: | |
| case 0xf3: | |
| if (cmd->datapos >= 3) { | |
| cmd->phase &= ~MPUCMDP_LONG; | |
| } | |
| break; | |
| case 0xf6: | |
| default: | |
| cmd->phase &= ~MPUCMDP_LONG; | |
| break; | |
| } | |
| return(TRUE); | |
| } | |
| return(FALSE); | |
| } | |
| MPUCH *ch; | static BRESULT sendmpucmd(MPUCMDS *cmd, REG8 data) { |
| if (mpu98.recvevent & MIDIE_2NDPARA) { | if (cmd->phase & MPUCMDP_FOLLOWBYTE) { |
| mpu98.recvevent ^= MIDIE_2NDPARA; | cmd->phase &= ~MPUCMDP_FOLLOWBYTE; |
| group_ex(mpu98.cmd, data); | setmpucmdgroupe(cmd->cmd, data); |
| if (mpu98.recvevent & MIDIE_EVENT) { | return(SUCCESS); |
| mpu98.recvevent ^= MIDIE_EVENT; | } |
| ch_nextsearch(); | else if (cmd->phase & (MPUCMDP_SHORT | MPUCMDP_LONG)) { |
| sendmpumsg(cmd, data); | |
| return(SUCCESS); | |
| } | |
| else { | |
| cmd->phase = 0; | |
| return(FAILURE); | |
| } | |
| } | |
| static BRESULT sendmpucond(MPUCMDS *cmd, REG8 data) { | |
| if (cmd->phase & (MPUCMDP_SHORT | MPUCMDP_LONG)) { | |
| sendmpumsg(cmd, data); | |
| return(SUCCESS); | |
| } | |
| else if (cmd->phase & MPUCMDP_STEP) { | |
| if (data < 0xf0) { | |
| cmd->step = data; | |
| cmd->phase &= ~MPUCMDP_STEP; | |
| } | |
| else { | |
| cmd->step = 0xf0; | |
| cmd->phase &= ~(MPUCMDP_STEP | MPUCMDP_CMD); | |
| } | |
| return(SUCCESS); | |
| } | |
| else if (cmd->phase & MPUCMDP_CMD) { | |
| cmd->phase &= ~MPUCMDP_CMD; | |
| cmd->cmd = data; | |
| if (data < 0xf0) { | |
| REG8 phase; | |
| phase = (*mpucmds[data])(data); | |
| if (phase & MPUCMDP_REQ) { | |
| phase &= ~MPUCMDP_REQ; | |
| reqmpucmdgroupd(data); | |
| } | |
| cmd->phase = phase; | |
| if (!(phase & MPUCMDP_FOLLOWBYTE)) { | |
| tr_nextsearch(); | |
| } | |
| } | } |
| else { | |
| cmd->phase = 0; | |
| if (data == MIDI_STOP) { | |
| cm_mpu98->write(cm_mpu98, MIDI_STOP); | |
| setrecvdata(MIDI_STOP); | |
| mpu98ii_int(); | |
| } | |
| tr_nextsearch(); | |
| } | |
| return(SUCCESS); | |
| } | |
| else if (cmd->phase & MPUCMDP_FOLLOWBYTE) { | |
| cmd->phase &= ~MPUCMDP_FOLLOWBYTE; | |
| setmpucmdgroupe(cmd->cmd, data); | |
| tr_nextsearch(); | |
| return(SUCCESS); | |
| } | |
| else { | |
| cmd->phase = 0; | |
| return(FAILURE); | |
| } | |
| } | |
| static void sendmpudata(REG8 data) { | |
| if (mpu98.cmd.phase) { | |
| sendmpucmd(&mpu98.cmd, data); | |
| return; | return; |
| } | } |
| if (mpu98.recvevent & MIDIE_STEP) { | if (mpu98.recvevent & MIDIE_STEP) { |
| MPUTR *tr; | |
| mpu98.recvevent ^= MIDIE_STEP; | mpu98.recvevent ^= MIDIE_STEP; |
| ch = mpu98.ch + mpu98.intreq; | tr = mpu98.tr + mpu98.intreq; |
| ch->datas = 0; | tr->datas = 0; |
| if (data < 0xf0) { | if (data < 0xf0) { |
| mpu98.recvevent ^= MIDIE_EVENT; | mpu98.recvevent ^= MIDIE_EVENT; |
| ch->step = data; | tr->step = data; |
| } | } |
| else { | else { |
| ch->step = 0xf0; | tr->step = 0xf0; |
| ch->remain = 0; | tr->remain = 0; |
| ch->datas = 0; | tr->datas = 0; |
| ch_nextsearch(); | tr_nextsearch(); |
| } | } |
| return; | return; |
| } | } |
| if (mpu98.recvevent & MIDIE_EVENT) { | if (mpu98.recvevent & MIDIE_EVENT) { |
| MPUCH *ch; | MPUTR *tr; |
| mpu98.recvevent ^= MIDIE_EVENT; | mpu98.recvevent ^= MIDIE_EVENT; |
| mpu98.recvevent |= MIDIE_DATA; | mpu98.recvevent |= MIDIE_DATA; |
| ch = mpu98.ch + mpu98.intreq; | tr = mpu98.tr + mpu98.intreq; |
| switch(data & 0xf0) { | switch(data & 0xf0) { |
| case 0xc0: | case 0xc0: |
| case 0xd0: | case 0xd0: |
| ch->remain = 2; | tr->remain = 2; |
| ch->rstat = data; | tr->rstat = data; |
| break; | break; |
| case 0x80: | case 0x80: |
| Line 420 static void senddat(REG8 data) { | Line 864 static void senddat(REG8 data) { |
| case 0xa0: | case 0xa0: |
| case 0xb0: | case 0xb0: |
| case 0xe0: | case 0xe0: |
| ch->remain = 3; | tr->remain = 3; |
| ch->rstat = data; | tr->rstat = data; |
| break; | break; |
| case 0xf0: | case 0xf0: |
| ch->remain = 1; | tr->remain = 1; |
| break; | break; |
| default: | default: |
| ch->data[0] = ch->rstat; | tr->data[0] = tr->rstat; |
| ch->datas = 1; | tr->datas = 1; |
| ch->remain = 2; | tr->remain = 2; |
| if ((ch->rstat & 0xe0) == 0xc0) { | if ((tr->rstat & 0xe0) == 0xc0) { |
| ch->remain--; | tr->remain--; |
| } | } |
| break; | break; |
| } | } |
| } | } |
| if (mpu98.recvevent & MIDIE_DATA) { | if (mpu98.recvevent & MIDIE_DATA) { |
| MPUCH *ch; | MPUTR *tr; |
| ch = mpu98.ch + mpu98.intreq; | tr = mpu98.tr + mpu98.intreq; |
| if (ch->remain) { | if (tr->remain) { |
| ch->data[ch->datas] = data; | tr->data[tr->datas] = data; |
| ch->datas++; | tr->datas++; |
| ch->remain--; | tr->remain--; |
| } | } |
| if (!ch->remain) { | if (!tr->remain) { |
| mpu98.recvevent ^= MIDIE_DATA; | mpu98.recvevent ^= MIDIE_DATA; |
| ch_nextsearch(); | tr_nextsearch(); |
| } | } |
| return; | return; |
| } | } |
| if (mpu98.recvevent & MIDIE_F9DATA) { | #if 1 |
| switch(mpu98.f9.cmd) { | if (mpu98.cond.phase) |
| case 0xdf: // long message | #else |
| if (mpu98.f9.remain) { | if (mpu98.cond.phase & (MPUCMDP_CMD | MPUCMDP_FOLLOWBYTE)) |
| mpu98.f9.remain--; | #endif |
| mpu98.f9.data[mpu98.f9.datas++] = data; | { |
| } | sendmpucond(&mpu98.cond, data); |
| if (data == 0xf7) { | |
| int i; | |
| for (i=0; i<mpu98.f9.datas; i++) { | |
| cm_mpu98->write(cm_mpu98, mpu98.f9.data[i]); | |
| } | |
| mpu98.f9.datas = 0; | |
| mpu98.f9.remain = 0; | |
| mpu98.f9.cmd = 0xf8; | |
| return; | |
| } | |
| break; | |
| default: | |
| mpu98.recvevent ^= MIDIE_F9DATA; | |
| mpu98.recvevent |= MIDIE_F9CMD; | |
| mpu98.f9.step = data; | |
| break; | |
| } | |
| return; | |
| } | |
| if (mpu98.recvevent & MIDIE_F9CMD) { | |
| mpu98.recvevent ^= MIDIE_F9CMD; | |
| if (data == MIDI_STOP) { | |
| cm_mpu98->write(cm_mpu98, MIDI_STOP); | |
| setrecvdata(MIDI_STOP); | |
| mpu98ii_int(); | |
| } | |
| else { | |
| mpu98.f9.cmd = data; | |
| if ((data & 0xf0) == 0xe0) { | |
| mpu98.recvevent |= MIDIE_F9PARA; | |
| } | |
| else { | |
| ch_nextsearch(); | |
| } | |
| } | |
| return; | |
| } | |
| if (mpu98.recvevent & MIDIE_F9PARA) { | |
| mpu98.recvevent ^= MIDIE_F9PARA; | |
| group_ex(mpu98.f9.cmd, data); | |
| ch_nextsearch(); | |
| return; | return; |
| } | } |
| } | } |
| static void IOOUTCALL mpu98ii_o0(UINT port, REG8 dat) { | static void IOOUTCALL mpu98ii_o0(UINT port, REG8 dat) { |
| UINT sent; | UINT sent; |
| Line 515 static void IOOUTCALL mpu98ii_o0(UINT po | Line 916 static void IOOUTCALL mpu98ii_o0(UINT po |
| cm_mpu98 = commng_create(COMCREATE_MPU98II); | cm_mpu98 = commng_create(COMCREATE_MPU98II); |
| } | } |
| if (cm_mpu98->connect != COMCONNECT_OFF) { | if (cm_mpu98->connect != COMCONNECT_OFF) { |
| if (mpu98.mode) { | if (mpu98.mode) { |
| sent = cm_mpu98->write(cm_mpu98, (BYTE)dat); | sent = cm_mpu98->write(cm_mpu98, (UINT8)dat); |
| } | } |
| else { | else { |
| if ((mpu98.cmd == 0xd0) || (mpu98.cmd == 0xdf)) { | // TRACEOUT(("send data->%.2x", dat)); |
| sent = cm_mpu98->write(cm_mpu98, (BYTE)dat); | sendmpudata(dat); |
| } | sent = 1; |
| else { | |
| senddat(dat); | |
| sent = 1; | |
| } | |
| } | } |
| if (sent) { | if (sent) { |
| midiwait(mpu98.xferclock * sent); | midiwait(mpu98.xferclock * sent); |
| Line 542 static void IOOUTCALL mpu98ii_o2(UINT po | Line 938 static void IOOUTCALL mpu98ii_o2(UINT po |
| } | } |
| if (cm_mpu98->connect != COMCONNECT_OFF) { | if (cm_mpu98->connect != COMCONNECT_OFF) { |
| if (!mpu98.mode) { | if (!mpu98.mode) { |
| if (sendcmd(dat)) { | REG8 phase; |
| setrecvdata(MPU_ACK); | // TRACEOUT(("send cmd->%.2x", dat)); |
| mpu98ii_int(); | mpu98.cmd.cmd = dat; |
| switch(dat) { | phase = (*mpucmds[dat])(dat); |
| case 0xac: // get mpu major version? | setrecvdata(MPUMSG_ACK); |
| setrecvdata(1); | mpu98ii_int(); |
| break; | if (phase & MPUCMDP_REQ) { |
| case 0xad: // get mpu minor version? | phase &= ~MPUCMDP_REQ; |
| setrecvdata(0); | reqmpucmdgroupd(dat); |
| break; | |
| } | |
| } | } |
| mpu98.cmd.phase = phase; | |
| } | } |
| else { | else { |
| if (dat == 0xff) { | if (dat == 0xff) { |
| mpu98.mode = 0; | mpu98.mode = 0; |
| setrecvdata(MPU_ACK); | setrecvdata(MPUMSG_ACK); |
| } | } |
| } | } |
| midiwait(pccore.realclock / 10000); | midiwait(pccore.realclock / 10000); |
| Line 583 static REG8 IOINPCALL mpu98ii_i0(UINT po | Line 978 static REG8 IOINPCALL mpu98ii_i0(UINT po |
| mpu98.data = mpu98.r.buf[mpu98.r.pos]; | mpu98.data = mpu98.r.buf[mpu98.r.pos]; |
| mpu98.r.pos = (mpu98.r.pos + 1) & (MPU98_RECVBUFS - 1); | mpu98.r.pos = (mpu98.r.pos + 1) & (MPU98_RECVBUFS - 1); |
| } | } |
| // TRACEOUT(("recv data->%.2x", mpu98.data)); | |
| return(mpu98.data); | return(mpu98.data); |
| } | } |
| (void)port; | (void)port; |
| Line 627 void mpu98ii_reset(void) { | Line 1023 void mpu98ii_reset(void) { |
| cm_mpu98 = NULL; | cm_mpu98 = NULL; |
| ZeroMemory(&mpu98, sizeof(mpu98)); | ZeroMemory(&mpu98, sizeof(mpu98)); |
| mpu98.data = MPU_ACK; | mpu98.data = MPUMSG_ACK; |
| mpu98.tempo = 120; | |
| mpu98.tempos = 0x40; | |
| mpu98.timebase = 2; | |
| mpu98.port = 0xc0d0 | ((np2cfg.mpuopt & 0xf0) << 6); | mpu98.port = 0xc0d0 | ((np2cfg.mpuopt & 0xf0) << 6); |
| mpu98.irqnum = mpuirqnum[np2cfg.mpuopt & 3]; | mpu98.irqnum = mpuirqnum[np2cfg.mpuopt & 3]; |
| setdefaultcondition(); | |
| // pic_registext(mpu98.irqnum); | // pic_registext(mpu98.irqnum); |
| } | } |
| Line 652 void mpu98ii_bind(void) { | Line 1046 void mpu98ii_bind(void) { |
| void mpu98ii_callback(void) { | void mpu98ii_callback(void) { |
| BYTE data; | UINT8 data; |
| if (cm_mpu98) { | if (cm_mpu98) { |
| while((mpu98.r.cnt < MPU98_RECVBUFS) && | while((mpu98.r.cnt < MPU98_RECVBUFS) && |