--- xmil/io/subcpu.c 2004/08/11 12:08:16 1.3 +++ xmil/io/subcpu.c 2004/08/20 08:54:39 1.8 @@ -10,18 +10,31 @@ // e3 e4 e5 e6 e7 e8 e9 ea eb ec ed ee ef -static const UINT8 CMD_TBL[] = { 0, 1, 0, 0, 1, 0, 1, 0, 0, 3, 0, 3, 0}; -static const UINT8 DAT_TBL[] = { 3, 0, 0, 2, 0, 1, 0, 1, 1, 0, 3, 0, 3}; +static const UINT8 cmdtbl[] = { 0, 1, 0, 0, 1, 0, 1, 0, 0, 3, 0, 3, 0}; +static const UINT8 dattbl[] = { 3, 0, 0, 2, 0, 1, 0, 1, 1, 0, 3, 0, 3}; -//********************************************************************** +// ---- void neitem_scpu(UINT id) { + BRESULT intr; + nevent_repeat(id); + intr = FALSE; + // こうすると同時押しが判定できないのでキーバッファを持つべし if (keystat.req_int) { - TRACEOUT(("keystat.req_int")); keystat.req_int = 0; + intr = TRUE; + } + else if (subcpu.keydata) { + subcpu.keycount++; + if (subcpu.keycount >= subcpu.keycountrep) { + subcpu.keycount = 0; + intr = TRUE; + } + } + if (intr) { ievent_set(IEVENT_SUBCPU); } } @@ -29,33 +42,31 @@ void neitem_scpu(UINT id) { BRESULT ieitem_scpu(UINT id) { UINT key; + UINT8 keydata; - TRACEOUT(("ieitem_scpu")); if ((subcpu.cmdcnt) || (subcpu.datacnt)) { - ievent_set(IEVENT_SUBCPU); + keystat.req_int = 1; // 再送しる return(FALSE); } if (!subcpu.Ex[4][0]) { // 割り込み不要だったら捨てる return(FALSE); } - if (keystat.shift & 0x40) { // キーが押された場合 - key = keystat_getflag(); - subcpu.Ex[0x06][0] = (UINT8)(key >> 0); - subcpu.Ex[0x06][1] = (UINT8)(key >> 8); - if (!subcpu.Ex[0x06][1]) { // 無効なキーだったら捨てる - return(FALSE); - } - subcpu.INT_SW = 1; + key = keystat_getflag(); + keydata = (UINT8)(key >> 8); + if (subcpu.keydata != keydata) { + subcpu.keydata = keydata; + subcpu.keycount = 0; + subcpu.keycountrep = 480; } else { - if (!subcpu.INT_SW) { // 何も押されてなかったら割り込まない + if (keydata == 0) { return(FALSE); } - subcpu.INT_SW = 0; - key = keystat_getflag(); - subcpu.Ex[0x06][0] = (UINT8)(key >> 0); - subcpu.Ex[0x06][1] = (UINT8)(key >> 8); + key = key & (~0x20); // rep + subcpu.keycountrep = 48; // 0.1sec } + subcpu.Ex[0x06][0] = (UINT8)key; + subcpu.Ex[0x06][1] = keydata; subcpu.mode = 0xe6; subcpu.cmdcnt = 0; subcpu.datacnt = 2; @@ -63,57 +74,12 @@ BRESULT ieitem_scpu(UINT id) { subcpu.OBF = 0; subcpu.IBF = 1; - Z80_INT(subcpu.Ex[4][0]); + Z80_INTERRUPT(subcpu.Ex[4][0]); (void)id; return(TRUE); } -#if 0 -// キーボード割り込み -short x1_sub_int(void) { // 990922 - - UINT key; - - if ((!keystat.req_int) || (subcpu.cmdcnt) || (subcpu.datacnt) || - (!Z80_ABLEINTERRUPT())) { // 割り込めなかったら - return(1); // また来週〜 - } - keystat.req_int = 0; - if (!subcpu.Ex[4][0]) { // 割り込み不要だったら捨てる - return(1); - } - if (keystat.shift & 0x40) { // キーが押された場合 - key = keystat_getflag(); - subcpu.Ex[0x06][0] = (UINT8)(key >> 0); - subcpu.Ex[0x06][1] = (UINT8)(key >> 8); - if (!subcpu.Ex[0x06][1]) { // 無効なキーだったら捨てる - return(1); - } - subcpu.INT_SW = 1; - } - else { - if (!subcpu.INT_SW) { // 何も押されてなかったら割り込まない - return(1); - } - subcpu.INT_SW = 0; - key = keystat_getflag(); - subcpu.Ex[0x06][0] = (UINT8)(key >> 0); - subcpu.Ex[0x06][1] = (UINT8)(key >> 8); - } - subcpu.mode = 0xe6; - subcpu.cmdcnt = 0; - subcpu.datacnt = 2; - subcpu.dataptr = offsetof(SUBCPU, Ex[0xe6 - 0xe0][0]); - subcpu.OBF = 0; - subcpu.IBF = 1; - - Z80_INT2(subcpu.Ex[4][0]); - return(0); -} -#endif - - // ---- void IOOUTCALL subcpu_o(UINT port, REG8 value) { @@ -127,17 +93,17 @@ void IOOUTCALL subcpu_o(UINT port, REG8 subcpu.mode = (UINT8)value; subcpu.cmdcnt = 0; subcpu.datacnt = 0; - if (value >= 0xd0 && value <= 0xd7) { + if ((value >= 0xd0) && (value <= 0xd7)) { subcpu.cmdcnt = 6; subcpu.datacnt = 0; } - else if (value >= 0xd8 && value <= 0xdf) { + else if ((value >= 0xd8) && (value <= 0xdf)) { subcpu.cmdcnt = 0; subcpu.datacnt = 6; } - else if (value >= 0xe3 && value <= 0xef) { - subcpu.cmdcnt = CMD_TBL[value - 0xe3]; - subcpu.datacnt = DAT_TBL[value - 0xe3]; + else if ((value >= 0xe3) && (value <= 0xef)) { + subcpu.cmdcnt = cmdtbl[value - 0xe3]; + subcpu.datacnt = dattbl[value - 0xe3]; } if (value < 0xe0) { subcpu.dataptr = offsetof(SUBCPU, Dx[value - 0xd0][0]); @@ -285,7 +251,7 @@ void subcpu_reset(void) { ZeroMemory(&subcpu, sizeof(subcpu)); subcpu.OBF = 1; - nevent_set(NEVENT_SUBCPU, pccore.realclock / 400, + nevent_set(NEVENT_SUBCPU, pccore.realclock / 480, neitem_scpu, NEVENT_ABSOLUTE); }