| version 1.3, 2004/08/11 12:08:16 | version 1.7, 2004/08/20 08:41:41 | 
| 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 = 96; | 
| 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); | 
 | } | } | 
 |  |  |