|
|
| version 1.2, 2004/08/11 13:53:53 | version 1.4, 2008/06/02 20:07:31 |
|---|---|
| Line 5 | Line 5 |
| #include "iocore.h" | #include "iocore.h" |
| // sw ... 割り込み 1=かける 0=かけない | /* sw ... 割り込み 1=かける 0=かけない */ |
| static void fifo_w(SIOFIFO *sf, REG8 data, REG8 sw) { | static void fifo_w(SIOFIFO *sf, REG8 data, REG8 sw) { |
| UINT off; | UINT off; |
| Line 93 static void mouse_read(SIOCH *ch) { | Line 93 static void mouse_read(SIOCH *ch) { |
| SINT16 mx; | SINT16 mx; |
| SINT16 my; | SINT16 my; |
| BYTE dat0, dat1, dat2; | UINT8 dat0, dat1, dat2; |
| dat0 = mousemng_getstat(&mx, &my, TRUE) & 3; | dat0 = mousemng_getstat(&mx, &my, TRUE) & 3; |
| Line 106 static void mouse_read(SIOCH *ch) { | Line 106 static void mouse_read(SIOCH *ch) { |
| dat0 |= 0x20; | dat0 |= 0x20; |
| } | } |
| else { | else { |
| dat1 = (char)mx; | dat1 = (UINT8)mx; |
| } | } |
| if (my > 127) { | if (my > 127) { |
| dat2 = 0x7f; | dat2 = 0x7f; |
| Line 117 static void mouse_read(SIOCH *ch) { | Line 117 static void mouse_read(SIOCH *ch) { |
| dat0 |= 0x80; | dat0 |= 0x80; |
| } | } |
| else { | else { |
| dat2 = (char)my; | dat2 = (UINT8)my; |
| } | } |
| if ((ch->wr[1] & 0x18) == 0x08) { | if ((ch->wr[1] & 0x18) == 0x08) { |
| fifo_w(&ch->RxD, dat0, 1); // 最初の1バイトだけ受信割り込み | fifo_w(&ch->RxD, dat0, 1); /* 最初の1バイトだけ受信割り込み */ |
| fifo_w(&ch->RxD, dat1, 0); | fifo_w(&ch->RxD, dat1, 0); |
| fifo_w(&ch->RxD, dat2, 0); | fifo_w(&ch->RxD, dat2, 0); |
| } | } |
| else { | else { |
| fifo_w(&ch->RxD, dat0, 1); // 1バイト毎に割り込み | fifo_w(&ch->RxD, dat0, 1); /* 1バイト毎に割り込み */ |
| fifo_w(&ch->RxD, dat1, 1); | fifo_w(&ch->RxD, dat1, 1); |
| fifo_w(&ch->RxD, dat2, 1); | fifo_w(&ch->RxD, dat2, 1); |
| } | } |
| } | } |
| // ---- | /* ---- */ |
| void IOOUTCALL sio_o(UINT port, REG8 value) { | void IOOUTCALL sio_o(UINT port, REG8 value) { |
| switch(port) { | switch(port) { |
| case 0x1f90: // CH-A データ | case 0x1f90: /* CH-A データ */ |
| if (sio.ch[SIOCH_A].wr[3] & 0x08) { | if (sio.ch[SIOCH_A].wr[3] & 0x08) { |
| fifo_w(&sio.ch[SIOCH_A].TxD, value, 0); | fifo_w(&sio.ch[SIOCH_A].TxD, value, 0); |
| } | } |
| break; | break; |
| case 0x1f91: // CH-A コントロール | case 0x1f91: /* CH-A コントロール */ |
| sio.ch[SIOCH_A].wr[sio.ch[SIOCH_A].num] = value; | sio.ch[SIOCH_A].wr[sio.ch[SIOCH_A].num] = value; |
| if (sio.ch[SIOCH_A].num) { | if (sio.ch[SIOCH_A].num) { |
| sio.ch[SIOCH_A].num = 0; | sio.ch[SIOCH_A].num = 0; |
| Line 153 void IOOUTCALL sio_o(UINT port, REG8 val | Line 153 void IOOUTCALL sio_o(UINT port, REG8 val |
| } | } |
| break; | break; |
| #if 0 | #if 0 |
| case 0x1f92: // CH-B データ (Mouse) | case 0x1f92: /* CH-B データ (Mouse) */ |
| if (CH_B.wr[3] & 0x08) { | if (CH_B.wr[3] & 0x08) { |
| fifo_w(&CH_B.T_D, value, 0); | fifo_w(&CH_B.T_D, value, 0); |
| } | } |
| break; | break; |
| #endif | #endif |
| case 0x1f93: // CH-B コントロール (Mouse) | case 0x1f93: /* CH-B コントロール (Mouse) */ |
| if (sio.ch[SIOCH_B].num == 5) { | if (sio.ch[SIOCH_B].num == 5) { |
| // RTS(WR5:BIT1)を0から1へ変化させると | /* RTS(WR5:BIT1)を0から1へ変化させると */ |
| // マウスから3バイトのデータが送られてくる | /* マウスから3バイトのデータが送られてくる */ |
| if (!(sio.ch[SIOCH_B].wr[5] & 2) && (value & 2)) { | if (!(sio.ch[SIOCH_B].wr[5] & 2) && (value & 2)) { |
| mouse_read(sio.ch + SIOCH_B); | mouse_read(sio.ch + SIOCH_B); |
| } | } |
| Line 184 REG8 IOINPCALL sio_i(UINT port) { | Line 184 REG8 IOINPCALL sio_i(UINT port) { |
| ret = 0; | ret = 0; |
| switch(port) { | switch(port) { |
| case 0x1f90: // CH-A データ | case 0x1f90: /* CH-A データ */ |
| if (sio.ch[SIOCH_A].RxD.cnt) { | if (sio.ch[SIOCH_A].RxD.cnt) { |
| return(fifo_r(&sio.ch[SIOCH_A].RxD)); | return(fifo_r(&sio.ch[SIOCH_A].RxD)); |
| } | } |
| break; | break; |
| case 0x1f91: // CH-A コントロール | case 0x1f91: /* CH-A コントロール */ |
| if (sio.ch[SIOCH_A].num == 0) { | if (sio.ch[SIOCH_A].num == 0) { |
| if (sio.ch[SIOCH_A].RxD.cnt != 0) { | if (sio.ch[SIOCH_A].RxD.cnt != 0) { |
| ret |= 1; | ret |= 1; |
| Line 201 REG8 IOINPCALL sio_i(UINT port) { | Line 201 REG8 IOINPCALL sio_i(UINT port) { |
| } | } |
| break; | break; |
| case 0x1f92: // CH-B データ (Mouse) | case 0x1f92: /* CH-B データ (Mouse) */ |
| if (sio.ch[SIOCH_B].RxD.cnt) { | if (sio.ch[SIOCH_B].RxD.cnt) { |
| return(fifo_r(&sio.ch[SIOCH_B].RxD)); | return(fifo_r(&sio.ch[SIOCH_B].RxD)); |
| } | } |
| break; | break; |
| case 0x1f93: // CH-B コントロール (Mouse) | case 0x1f93: /* CH-B コントロール (Mouse) */ |
| if (sio.ch[SIOCH_B].num == 0) { // ?? | if (sio.ch[SIOCH_B].num == 0) { /* ?? */ |
| if (sio.ch[SIOCH_B].RxD.cnt != 0) { | if (sio.ch[SIOCH_B].RxD.cnt != 0) { |
| ret |= 1; | ret |= 1; |
| } | } |
| Line 222 REG8 IOINPCALL sio_i(UINT port) { | Line 222 REG8 IOINPCALL sio_i(UINT port) { |
| } | } |
| // ---- | /* reset */ |
| void sio_reset(void) { | void sio_reset(void) { |