|
|
| version 1.1, 2003/10/16 17:58:19 | version 1.8, 2011/01/15 18:04:42 |
|---|---|
| Line 1 | Line 1 |
| #include "compiler.h" | #include "compiler.h" |
| #include "i286.h" | #include "cpucore.h" |
| #include "memory.h" | |
| #include "pccore.h" | #include "pccore.h" |
| #include "iocore.h" | #include "iocore.h" |
| #include "bios.h" | #include "bios.h" |
| Line 12 void bios0x0c(void) { | Line 11 void bios0x0c(void) { |
| UINT16 doff; | UINT16 doff; |
| UINT16 dseg; | UINT16 dseg; |
| BYTE flag; | REG8 flag; |
| BYTE data; | UINT8 data; |
| BYTE stat; | UINT8 status; |
| UINT16 pos; | REG16 pos; |
| UINT16 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 = i286_membyte_read(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 62 void bios0x0c(void) { | Line 61 void bios0x0c(void) { |
| } | } |
| } | } |
| // データ投棄 | // データ投棄 |
| pos = i286_memword_read(dseg, doff + R_PUTP); | pos = MEMR_READ16(dseg, doff + R_PUTP); |
| i286_memword_write(dseg, pos, (UINT16)((data << 8) | stat)); | MEMR_WRITE16(dseg, pos, (UINT16)((data << 8) | status)); |
| // 次のポインタをストア | // 次のポインタをストア |
| pos += 2; | pos = (UINT16)(pos + 2); |
| if (pos >= i286_memword_read(dseg, doff + R_TAILP)) { | if (pos >= MEMR_READ16(dseg, doff + R_TAILP)) { |
| pos = i286_memword_read(dseg, doff + R_HEADP); | pos = MEMR_READ16(dseg, doff + R_HEADP); |
| } | } |
| i286_memword_write(dseg, doff + R_PUTP, pos); | MEMR_WRITE16(dseg, doff + R_PUTP, pos); |
| // カウンタのインクリメント | // カウンタのインクリメント |
| cnt = i286_memword_read(dseg, doff + R_CNT) + 1; | cnt = (UINT16)(MEMR_READ16(dseg, doff + R_CNT) + 1); |
| i286_memword_write(dseg, doff + R_CNT, cnt); | MEMR_WRITE16(dseg, doff + R_CNT, cnt); |
| // オーバーフローを見張る | // オーバーフローを見張る |
| if (pos == i286_memword_read(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 >= i286_memword_read(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 { |
| i286_membyte_write(dseg, doff + R_CMD, | MEMR_WRITE8(dseg, doff + R_CMD, |
| (BYTE)(i286_membyte_read(dseg, doff + R_CMD) | RFLAG_BOVF)); | (REG8)(MEMR_READ8(dseg, doff + R_CMD) | RFLAG_BOVF)); |
| } | } |
| i286_membyte_write(dseg, doff + R_INT, | MEMR_WRITE8(dseg, doff + R_INT, |
| (BYTE)(i286_membyte_read(dseg, doff + R_INT) | RINT_INT)); | (REG8)(MEMR_READ8(dseg, doff + R_INT) | RINT_INT)); |
| i286_membyte_write(dseg, doff + R_FLAG, flag); | MEMR_WRITE8(dseg, doff + R_FLAG, flag); |
| iocore_out8(0x00, 0x20); | iocore_out8(0x00, 0x20); |
| } | } |