|
|
| version 1.5, 2004/03/07 23:04:50 | version 1.8, 2011/01/15 18:04:42 |
|---|---|
| Line 12 void bios0x0c(void) { | Line 12 void bios0x0c(void) { |
| UINT16 doff; | UINT16 doff; |
| UINT16 dseg; | UINT16 dseg; |
| REG8 flag; | REG8 flag; |
| BYTE data; | UINT8 data; |
| BYTE stat; | UINT8 status; |
| REG16 pos; | REG16 pos; |
| REG16 cnt; | REG16 cnt; |
| doff = GETBIOSMEM16(MEMW_RS_CH0_OFST); | doff = GETBIOSMEM16(MEMW_RS_CH0_OFST); |
| dseg = GETBIOSMEM16(MEMW_RS_CH0_SEG); | dseg = GETBIOSMEM16(MEMW_RS_CH0_SEG); |
| flag = MEML_READ8(dseg, doff + R_FLAG); | flag = MEMR_READ8(dseg, doff + R_FLAG); |
| data = iocore_inp8(0x30); // データ引き取り | data = iocore_inp8(0x30); // データ引き取り |
| stat = iocore_inp8(0x32) & 0xfc; // ステータス | status = iocore_inp8(0x32) & 0xfc; // ステータス |
| stat |= (iocore_inp8(0x33) & 3); | status |= (iocore_inp8(0x33) & 3); |
| #if 0 | #if 0 |
| if (stat & 0x38) { | if (status & 0x38) { |
| iocore_out8(0x32, flag | 0x10); | iocore_out8(0x32, flag | 0x10); |
| } | } |
| #endif | #endif |
| Line 61 void bios0x0c(void) { | Line 61 void bios0x0c(void) { |
| } | } |
| } | } |
| // データ投棄 | // データ投棄 |
| pos = MEML_READ16(dseg, doff + R_PUTP); | pos = MEMR_READ16(dseg, doff + R_PUTP); |
| MEML_WRITE16(dseg, pos, (UINT16)((data << 8) | stat)); | MEMR_WRITE16(dseg, pos, (UINT16)((data << 8) | status)); |
| // 次のポインタをストア | // 次のポインタをストア |
| pos = (UINT16)(pos + 2); | pos = (UINT16)(pos + 2); |
| if (pos >= MEML_READ16(dseg, doff + R_TAILP)) { | if (pos >= MEMR_READ16(dseg, doff + R_TAILP)) { |
| pos = MEML_READ16(dseg, doff + R_HEADP); | pos = MEMR_READ16(dseg, doff + R_HEADP); |
| } | } |
| MEML_WRITE16(dseg, doff + R_PUTP, pos); | MEMR_WRITE16(dseg, doff + R_PUTP, pos); |
| // カウンタのインクリメント | // カウンタのインクリメント |
| cnt = (UINT16)(MEML_READ16(dseg, doff + R_CNT) + 1); | cnt = (UINT16)(MEMR_READ16(dseg, doff + R_CNT) + 1); |
| MEML_WRITE16(dseg, doff + R_CNT, cnt); | MEMR_WRITE16(dseg, doff + R_CNT, cnt); |
| // オーバーフローを見張る | // オーバーフローを見張る |
| if (pos == MEML_READ16(dseg, doff + R_GETP)) { | if (pos == MEMR_READ16(dseg, doff + R_GETP)) { |
| flag |= RFLAG_BFULL; | flag |= RFLAG_BFULL; |
| } | } |
| // XOFFを送信? | // XOFFを送信? |
| if (((flag & (RFLAG_XON | RFLAG_XOFF)) == RFLAG_XON) && | if (((flag & (RFLAG_XON | RFLAG_XOFF)) == RFLAG_XON) && |
| (cnt >= MEML_READ16(dseg, doff + R_XON))) { | (cnt >= MEMR_READ16(dseg, doff + R_XON))) { |
| iocore_out8(0x30, RSCODE_XOFF); | iocore_out8(0x30, RSCODE_XOFF); |
| flag |= RFLAG_XOFF; | flag |= RFLAG_XOFF; |
| } | } |
| } | } |
| else { | else { |
| MEML_WRITE8(dseg, doff + R_CMD, | MEMR_WRITE8(dseg, doff + R_CMD, |
| (REG8)(MEML_READ8(dseg, doff + R_CMD) | RFLAG_BOVF)); | (REG8)(MEMR_READ8(dseg, doff + R_CMD) | RFLAG_BOVF)); |
| } | } |
| MEML_WRITE8(dseg, doff + R_INT, | MEMR_WRITE8(dseg, doff + R_INT, |
| (REG8)(MEML_READ8(dseg, doff + R_INT) | RINT_INT)); | (REG8)(MEMR_READ8(dseg, doff + R_INT) | RINT_INT)); |
| MEML_WRITE8(dseg, doff + R_FLAG, flag); | MEMR_WRITE8(dseg, doff + R_FLAG, flag); |
| iocore_out8(0x00, 0x20); | iocore_out8(0x00, 0x20); |
| } | } |