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