|
|
| version 1.1, 2003/10/16 17:58:21 | version 1.4, 2004/01/22 01:10:03 |
|---|---|
| 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 28 void bios0x19(void) { | Line 27 void bios0x19(void) { |
| UINT16 dseg; | UINT16 dseg; |
| BYTE flag; | BYTE flag; |
| if (I286_AH < 2) { | if (CPU_AH < 2) { |
| // 通信速度… | // 通信速度… |
| mode = I286_CH | 0x02; | mode = CPU_CH | 0x02; |
| speed = I286_AL; | speed = CPU_AL; |
| if (speed >= 8) { | if (speed >= 8) { |
| speed = 4; // 1200bps | speed = 4; // 1200bps |
| } | } |
| if (mem[MEMB_BIOS_FLAG] & 0x80) { // 4MHz? | if (mem[MEMB_BIOS_FLAG1] & 0x80) { // 4MHz? |
| speed += 12; | speed += 12; |
| } | } |
| Line 56 void bios0x19(void) { | Line 55 void bios0x19(void) { |
| iocore_out8(0x32, 0x00); // dummy instruction | iocore_out8(0x32, 0x00); // dummy instruction |
| iocore_out8(0x32, 0x40); // reset | iocore_out8(0x32, 0x40); // reset |
| iocore_out8(0x32, mode); // mode | iocore_out8(0x32, mode); // mode |
| iocore_out8(0x32, I286_CL); // cmd | iocore_out8(0x32, CPU_CL); // cmd |
| #endif | #endif |
| iocore_out8(0x77, 0xb6); | iocore_out8(0x77, 0xb6); |
| iocore_out8(0x75, (BYTE)rs_speed[speed]); | iocore_out8(0x75, (BYTE)rs_speed[speed]); |
| iocore_out8(0x75, (BYTE)(rs_speed[speed] >> 8)); | iocore_out8(0x75, (BYTE)(rs_speed[speed] >> 8)); |
| ZeroMemory(&rsb, sizeof(rsb)); | ZeroMemory(&rsb, sizeof(rsb)); |
| rsb.FLAG = (I286_AH << 4); | rsb.FLAG = (CPU_AH << 4); |
| rsb.CMD = I286_CL; | rsb.CMD = CPU_CL; |
| sysport.c &= ~7; | sysport.c &= ~7; |
| if (!(I286_CL & RCMD_IR)) { | if (!(CPU_CL & RCMD_IR)) { |
| rsb.FLAG |= RFLAG_INIT; | rsb.FLAG |= RFLAG_INIT; |
| if (I286_CL & RCMD_RXE) { | if (CPU_CL & RCMD_RXE) { |
| sysport.c |= 1; | sysport.c |= 1; |
| pic.pi[0].imr &= ~PIC_RS232C; | pic.pi[0].imr &= ~PIC_RS232C; |
| } | } |
| } | } |
| rsb.STIME = I286_BH; | rsb.STIME = CPU_BH; |
| if (!rsb.STIME) { | if (!rsb.STIME) { |
| rsb.STIME = 0x04; | rsb.STIME = 0x04; |
| } | } |
| rsb.RTIME = I286_BL; | rsb.RTIME = CPU_BL; |
| if (!rsb.RTIME) { | if (!rsb.RTIME) { |
| rsb.RTIME = 0x40; | rsb.RTIME = 0x40; |
| } | } |
| doff = I286_DI + sizeof(RSBIOS); | doff = CPU_DI + sizeof(RSBIOS); |
| STOREINTELWORD(rsb.HEADP, doff); | STOREINTELWORD(rsb.HEADP, doff); |
| STOREINTELWORD(rsb.PUTP, doff); | STOREINTELWORD(rsb.PUTP, doff); |
| STOREINTELWORD(rsb.GETP, doff); | STOREINTELWORD(rsb.GETP, doff); |
| doff += I286_DX; | doff += CPU_DX; |
| STOREINTELWORD(rsb.TAILP, doff); | STOREINTELWORD(rsb.TAILP, doff); |
| cnt = I286_DX >> 3; | cnt = CPU_DX >> 3; |
| STOREINTELWORD(rsb.XOFF, cnt); | STOREINTELWORD(rsb.XOFF, cnt); |
| cnt += I286_DX >> 2; | cnt += CPU_DX >> 2; |
| STOREINTELWORD(rsb.XON, cnt); | STOREINTELWORD(rsb.XON, cnt); |
| // ポインタ〜 | // ポインタ〜 |
| SETBIOSMEM16(MEMW_RS_CH0_OFST, I286_DI); | SETBIOSMEM16(MEMW_RS_CH0_OFST, CPU_DI); |
| SETBIOSMEM16(MEMW_RS_CH0_SEG, I286_ES); | SETBIOSMEM16(MEMW_RS_CH0_SEG, CPU_ES); |
| i286_memstr_write(I286_ES, I286_DI, &rsb, sizeof(rsb)); | i286_memstr_write(CPU_ES, CPU_DI, &rsb, sizeof(rsb)); |
| I286_AH = 0; | CPU_AH = 0; |
| } | } |
| else if (I286_AH < 7) { | else if (CPU_AH < 7) { |
| doff = GETBIOSMEM16(MEMW_RS_CH0_OFST); | doff = GETBIOSMEM16(MEMW_RS_CH0_OFST); |
| dseg = GETBIOSMEM16(MEMW_RS_CH0_SEG); | dseg = GETBIOSMEM16(MEMW_RS_CH0_SEG); |
| if ((!doff) && (!dseg)) { | if ((!doff) && (!dseg)) { |
| I286_AH = 1; | CPU_AH = 1; |
| return; | return; |
| } | } |
| flag = i286_membyte_read(dseg, doff + R_FLAG); | flag = i286_membyte_read(dseg, doff + R_FLAG); |
| if (!(flag & RFLAG_INIT)) { | if (!(flag & RFLAG_INIT)) { |
| I286_AH = 1; | CPU_AH = 1; |
| return; | return; |
| } | } |
| switch(I286_AH) { | switch(CPU_AH) { |
| case 0x02: | case 0x02: |
| I286_CX = i286_memword_read(dseg, doff + R_CNT); | CPU_CX = i286_memword_read(dseg, doff + R_CNT); |
| break; | break; |
| case 0x03: | case 0x03: |
| iocore_out8(0x30, I286_AL); | iocore_out8(0x30, CPU_AL); |
| break; | break; |
| case 0x04: | case 0x04: |
| Line 128 void bios0x19(void) { | Line 127 void bios0x19(void) { |
| // データ引き取り | // データ引き取り |
| pos = i286_memword_read(dseg, doff + R_GETP); | pos = i286_memword_read(dseg, doff + R_GETP); |
| I286_CX = i286_memword_read(dseg, pos); | CPU_CX = i286_memword_read(dseg, pos); |
| // 次のポインタをストア | // 次のポインタをストア |
| pos += 2; | pos += 2; |
| Line 148 void bios0x19(void) { | Line 147 void bios0x19(void) { |
| flag &= ~RFLAG_XOFF; | flag &= ~RFLAG_XOFF; |
| } | } |
| flag &= ~RFLAG_BOVF; | flag &= ~RFLAG_BOVF; |
| I286_AH = 0; | CPU_AH = 0; |
| i286_membyte_write(dseg, doff + R_FLAG, flag); | i286_membyte_write(dseg, doff + R_FLAG, flag); |
| return; | return; |
| } | } |
| else { | else { |
| I286_AH = 3; | CPU_AH = 3; |
| } | } |
| break; | break; |
| case 0x05: | case 0x05: |
| iocore_out8(0x32, I286_AL); | iocore_out8(0x32, CPU_AL); |
| if (I286_AL & RCMD_IR) { | if (CPU_AL & RCMD_IR) { |
| flag &= ~RFLAG_INIT; | flag &= ~RFLAG_INIT; |
| i286_membyte_write(dseg, doff + R_FLAG, flag); | i286_membyte_write(dseg, doff + R_FLAG, flag); |
| sysport.c &= ~1; | sysport.c &= ~1; |
| pic.pi[0].imr |= PIC_RS232C; | pic.pi[0].imr |= PIC_RS232C; |
| } | } |
| else if (!(I286_AL & RCMD_RXE)) { | else if (!(CPU_AL & RCMD_RXE)) { |
| sysport.c &= ~1; | sysport.c &= ~1; |
| pic.pi[0].imr |= PIC_RS232C; | pic.pi[0].imr |= PIC_RS232C; |
| } | } |
| Line 173 void bios0x19(void) { | Line 172 void bios0x19(void) { |
| sysport.c |= 1; | sysport.c |= 1; |
| pic.pi[0].imr &= ~PIC_RS232C; | pic.pi[0].imr &= ~PIC_RS232C; |
| } | } |
| i286_membyte_write(dseg, doff + R_CMD, I286_AL); | i286_membyte_write(dseg, doff + R_CMD, CPU_AL); |
| break; | break; |
| case 0x06: | case 0x06: |
| I286_CH = iocore_inp8(0x32); | CPU_CH = iocore_inp8(0x32); |
| I286_CL = iocore_inp8(0x33); | CPU_CL = iocore_inp8(0x33); |
| break; | break; |
| } | } |
| I286_AH = 0; | CPU_AH = 0; |
| if (flag & RFLAG_BOVF) { | if (flag & RFLAG_BOVF) { |
| i286_membyte_write(dseg, doff + R_FLAG, | i286_membyte_write(dseg, doff + R_FLAG, |
| (BYTE)(flag & (~RFLAG_BOVF))); | (BYTE)(flag & (~RFLAG_BOVF))); |
| I286_AH = 2; | CPU_AH = 2; |
| } | } |
| } | } |
| else { | else { |
| I286_AH = 0; | CPU_AH = 0; |
| } | } |
| } | } |