|
|
| version 1.5, 2003/11/29 00:36:00 | version 1.7, 2003/12/12 01:04:39 |
|---|---|
| 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 37 static void init_fdd_equip(void) { | Line 36 static void init_fdd_equip(void) { |
| static void biosfd_setchrn(void) { | static void biosfd_setchrn(void) { |
| fdc.C = I286_CL; | fdc.C = CPU_CL; |
| fdc.H = I286_DH; | fdc.H = CPU_DH; |
| fdc.R = I286_DL; | fdc.R = CPU_DL; |
| fdc.N = I286_CH; | fdc.N = CPU_CH; |
| } | } |
| #if 0 | #if 0 |
| Line 102 static UINT16 fdfmt_biospara(BYTE fmt, B | Line 101 static UINT16 fdfmt_biospara(BYTE fmt, B |
| off += fdc.us * 2; | off += fdc.us * 2; |
| off = i286_memword_read(seg, off); | off = i286_memword_read(seg, off); |
| off += n * 8; | off += n * 8; |
| if (!(I286_AH & 0x40)) { | if (!(CPU_AH & 0x40)) { |
| off += 4; | off += 4; |
| } | } |
| if (fmt) { | if (fmt) { |
| Line 137 static void fdd_int(int result) { | Line 136 static void fdd_int(int result) { |
| if (result == FDCBIOS_NORESULT) { // ver0.29 | if (result == FDCBIOS_NORESULT) { // ver0.29 |
| return; | return; |
| } | } |
| switch(I286_AH & 0x0f) { | switch(CPU_AH & 0x0f) { |
| case 0x00: // シーク | case 0x00: // シーク |
| case 0x01: // ベリファイ | case 0x01: // ベリファイ |
| case 0x02: // 診断の為の読み込み | case 0x02: // 診断の為の読み込み |
| Line 197 static struct { | Line 196 static struct { |
| static void b0patch(void) { | static void b0patch(void) { |
| if ((!b0p.flg) || (b0p.cx != I286_CX) || (b0p.dx != I286_DX)) { | if ((!b0p.flg) || (b0p.cx != CPU_CX) || (b0p.dx != CPU_DX)) { |
| b0p.flg = TRUE; | b0p.flg = TRUE; |
| b0p.pos = 0; | b0p.pos = 0; |
| b0p.cx = I286_CX; | b0p.cx = CPU_CX; |
| b0p.dx = I286_DX; | b0p.dx = CPU_DX; |
| } | } |
| else { | else { |
| if (!b0p.pos) { | if (!b0p.pos) { |
| Line 211 static void b0patch(void) { | Line 210 static void b0patch(void) { |
| REG8 c; | REG8 c; |
| REG8 cl; | REG8 cl; |
| REG8 last; | REG8 last; |
| addr = ES_BASE + I286_BP; | addr = ES_BASE + CPU_BP; |
| size = I286_BX; | size = CPU_BX; |
| cnt = 0; | cnt = 0; |
| last = 0; | last = 0; |
| while(size--) { | while(size--) { |
| Line 239 static void b0patch(void) { | Line 238 static void b0patch(void) { |
| } | } |
| } | } |
| } | } |
| if ((b0p.pos >> 3) < I286_BX) { | if ((b0p.pos >> 3) < CPU_BX) { |
| UINT32 addr; | UINT32 addr; |
| REG8 c; | REG8 c; |
| addr = ES_BASE + I286_BP + (b0p.pos >> 3); | addr = ES_BASE + CPU_BP + (b0p.pos >> 3); |
| c = i286_memoryread(addr); | c = i286_memoryread(addr); |
| c ^= (1 << (b0p.pos & 7)); | c ^= (1 << (b0p.pos & 7)); |
| b0p.pos++; | b0p.pos++; |
| Line 277 static BYTE fdd_operate(BYTE type, BOOL | Line 276 static BYTE fdd_operate(BYTE type, BOOL |
| // とりあえずBIOSの時は無視する | // とりあえずBIOSの時は無視する |
| fdc.mf = 0xff; // ver0.29 | fdc.mf = 0xff; // ver0.29 |
| // TRACE_("int 1Bh", I286_AH); | // TRACE_("int 1Bh", CPU_AH); |
| change_rpm(rpm); // ver0.31 | change_rpm(rpm); // ver0.31 |
| if ((I286_AH & 0x0f) != 0x0a) { | if ((CPU_AH & 0x0f) != 0x0a) { |
| fdc.crcn = 0; | fdc.crcn = 0; |
| } | } |
| if ((I286_AH & 0x0f) != 0x03) { | if ((CPU_AH & 0x0f) != 0x03) { |
| CTRL_FDMEDIA = type; | CTRL_FDMEDIA = type; |
| switch(type) { | switch(type) { |
| case DISKTYPE_2HD: | case DISKTYPE_2HD: |
| Line 297 static BYTE fdd_operate(BYTE type, BOOL | Line 296 static BYTE fdd_operate(BYTE type, BOOL |
| } | } |
| break; | break; |
| } | } |
| if (fdc.us != (I286_AL & 0x03)) { | if (fdc.us != (CPU_AL & 0x03)) { |
| fdc.us = I286_AL & 0x03; | fdc.us = CPU_AL & 0x03; |
| fdc.crcn = 0; | fdc.crcn = 0; |
| } | } |
| hd = ((I286_DH) ^ (I286_AL >> 2)) & 1; | hd = ((CPU_DH) ^ (CPU_AL >> 2)) & 1; |
| if (fdc.hd != hd) { | if (fdc.hd != hd) { |
| fdc.hd = hd; | fdc.hd = hd; |
| fdc.crcn = 0; | fdc.crcn = 0; |
| } | } |
| if (!fdd_diskready(fdc.us)) { | if (!fdd_diskready(fdc.us)) { |
| fdd_int(FDCBIOS_NONREADY); | fdd_int(FDCBIOS_NONREADY); |
| if (I286_AH == 0x84) { // ver0.28 | if (CPU_AH == 0x84) { // ver0.28 |
| return(0x68); // 新センスは 両用ドライブ情報も | return(0x68); // 新センスは 両用ドライブ情報も |
| } | } |
| if (I286_AH == 0xc4) { // ver0.31 | if (CPU_AH == 0xc4) { // ver0.31 |
| if (np2cfg.usefd144) { | if (np2cfg.usefd144) { |
| return(0x6c); | return(0x6c); |
| } | } |
| Line 328 static BYTE fdd_operate(BYTE type, BOOL | Line 327 static BYTE fdd_operate(BYTE type, BOOL |
| } | } |
| } | } |
| switch(I286_AH & 0x0f) { | switch(CPU_AH & 0x0f) { |
| case 0x00: // シーク | case 0x00: // シーク |
| if (I286_AH & 0x10) { | if (CPU_AH & 0x10) { |
| if (!biosfd_seek(I286_CL, ndensity)) { | if (!biosfd_seek(CPU_CL, ndensity)) { |
| result = FDCBIOS_SEEKSUCCESS; | result = FDCBIOS_SEEKSUCCESS; |
| } | } |
| else { | else { |
| Line 342 static BYTE fdd_operate(BYTE type, BOOL | Line 341 static BYTE fdd_operate(BYTE type, BOOL |
| break; | break; |
| case 0x01: // ベリファイ | case 0x01: // ベリファイ |
| if (I286_AH & 0x10) { | if (CPU_AH & 0x10) { |
| if (!biosfd_seek(I286_CL, ndensity)) { | if (!biosfd_seek(CPU_CL, ndensity)) { |
| result = FDCBIOS_SEEKSUCCESS; | result = FDCBIOS_SEEKSUCCESS; |
| } | } |
| else { | else { |
| Line 364 static BYTE fdd_operate(BYTE type, BOOL | Line 363 static BYTE fdd_operate(BYTE type, BOOL |
| else { | else { |
| secsize = 128 << 8; | secsize = 128 << 8; |
| } | } |
| size = I286_BX; | size = CPU_BX; |
| while(size) { | while(size) { |
| if (size > secsize) { | if (size > secsize) { |
| accesssize = secsize; | accesssize = secsize; |
| Line 377 static BYTE fdd_operate(BYTE type, BOOL | Line 376 static BYTE fdd_operate(BYTE type, BOOL |
| } | } |
| size -= accesssize; | size -= accesssize; |
| mtr_r += accesssize; // ver0.26 | mtr_r += accesssize; // ver0.26 |
| if ((fdc.R++ == (BYTE)para) && (I286_AH & 0x80) && (!fdc.hd)) { | if ((fdc.R++ == (BYTE)para) && (CPU_AH & 0x80) && (!fdc.hd)) { |
| fdc.hd = 1; | fdc.hd = 1; |
| fdc.H = 1; | fdc.H = 1; |
| fdc.R = 1; | fdc.R = 1; |
| Line 409 static BYTE fdd_operate(BYTE type, BOOL | Line 408 static BYTE fdd_operate(BYTE type, BOOL |
| else if (fdd_diskprotect(fdc.us)) { | else if (fdd_diskprotect(fdc.us)) { |
| ret_ah = 0x10; | ret_ah = 0x10; |
| } | } |
| if (I286_AL & 0x80) { // 2HD | if (CPU_AL & 0x80) { // 2HD |
| ret_ah |= 0x01; | ret_ah |= 0x01; |
| } | } |
| else { // 2DD | else { // 2DD |
| Line 420 static BYTE fdd_operate(BYTE type, BOOL | Line 419 static BYTE fdd_operate(BYTE type, BOOL |
| ret_ah |= 0x04; | ret_ah |= 0x04; |
| } | } |
| } | } |
| if (I286_AH & 0x80) { // ver0.30 | if (CPU_AH & 0x80) { // ver0.30 |
| ret_ah |= 8; // 1MB/640KB両用ドライブ | ret_ah |= 8; // 1MB/640KB両用ドライブ |
| if ((I286_AH & 0x40) && | if ((CPU_AH & 0x40) && |
| (np2cfg.usefd144)) { // ver0.31 | (np2cfg.usefd144)) { // ver0.31 |
| ret_ah |= 4; // 1.44対応ドライブ | ret_ah |= 4; // 1.44対応ドライブ |
| } | } |
| Line 430 static BYTE fdd_operate(BYTE type, BOOL | Line 429 static BYTE fdd_operate(BYTE type, BOOL |
| break; | break; |
| case 0x05: // データの書き込み | case 0x05: // データの書き込み |
| if (I286_AH & 0x10) { | if (CPU_AH & 0x10) { |
| if (!biosfd_seek(I286_CL, ndensity)) { | if (!biosfd_seek(CPU_CL, ndensity)) { |
| result = FDCBIOS_SEEKSUCCESS; | result = FDCBIOS_SEEKSUCCESS; |
| } | } |
| else { | else { |
| Line 457 static BYTE fdd_operate(BYTE type, BOOL | Line 456 static BYTE fdd_operate(BYTE type, BOOL |
| else { | else { |
| secsize = 128 << 8; | secsize = 128 << 8; |
| } | } |
| size = I286_BX; | size = CPU_BX; |
| addr = ES_BASE + I286_BP; | addr = ES_BASE + CPU_BP; |
| while(size) { | while(size) { |
| if (size > secsize) { | if (size > secsize) { |
| accesssize = secsize; | accesssize = secsize; |
| Line 473 static BYTE fdd_operate(BYTE type, BOOL | Line 472 static BYTE fdd_operate(BYTE type, BOOL |
| addr += accesssize; | addr += accesssize; |
| size -= accesssize; | size -= accesssize; |
| mtr_r += accesssize; // ver0.26 | mtr_r += accesssize; // ver0.26 |
| if ((fdc.R++ == (BYTE)para) && (I286_AH & 0x80) && (!fdc.hd)) { | if ((fdc.R++ == (BYTE)para) && (CPU_AH & 0x80) && (!fdc.hd)) { |
| fdc.hd = 1; | fdc.hd = 1; |
| fdc.H = 1; | fdc.H = 1; |
| fdc.R = 1; | fdc.R = 1; |
| Line 494 static BYTE fdd_operate(BYTE type, BOOL | Line 493 static BYTE fdd_operate(BYTE type, BOOL |
| case 0x02: // 診断の為の読み込み | case 0x02: // 診断の為の読み込み |
| case 0x06: // データの読み込み | case 0x06: // データの読み込み |
| if (I286_AH & 0x10) { | if (CPU_AH & 0x10) { |
| if (!biosfd_seek(I286_CL, ndensity)) { | if (!biosfd_seek(CPU_CL, ndensity)) { |
| result = FDCBIOS_SEEKSUCCESS; | result = FDCBIOS_SEEKSUCCESS; |
| } | } |
| else { | else { |
| Line 522 static BYTE fdd_operate(BYTE type, BOOL | Line 521 static BYTE fdd_operate(BYTE type, BOOL |
| else { | else { |
| secsize = 128 << 8; | secsize = 128 << 8; |
| } | } |
| size = I286_BX; | size = CPU_BX; |
| addr = ES_BASE + I286_BP; | addr = ES_BASE + CPU_BP; |
| while(size) { | while(size) { |
| if (size > secsize) { | if (size > secsize) { |
| accesssize = secsize; | accesssize = secsize; |
| Line 539 static BYTE fdd_operate(BYTE type, BOOL | Line 538 static BYTE fdd_operate(BYTE type, BOOL |
| size -= accesssize; | size -= accesssize; |
| mtr_r += accesssize; // ver0.26 | mtr_r += accesssize; // ver0.26 |
| if (fdc.R++ == (BYTE)para) { | if (fdc.R++ == (BYTE)para) { |
| if ((I286_AH & 0x80) && (!fdc.hd)) { | if ((CPU_AH & 0x80) && (!fdc.hd)) { |
| fdc.hd = 1; | fdc.hd = 1; |
| fdc.H = 1; | fdc.H = 1; |
| fdc.R = 1; | fdc.R = 1; |
| Line 569 static BYTE fdd_operate(BYTE type, BOOL | Line 568 static BYTE fdd_operate(BYTE type, BOOL |
| #endif | #endif |
| } | } |
| #if 1 | #if 1 |
| else if ((I286_AH & 0x0f) == 0x02) { // ARS対策… | else if ((CPU_AH & 0x0f) == 0x02) { // ARS対策… |
| ret_ah = 0x00; | ret_ah = 0x00; |
| result = FDCBIOS_READERROR; | result = FDCBIOS_READERROR; |
| } | } |
| Line 587 static BYTE fdd_operate(BYTE type, BOOL | Line 586 static BYTE fdd_operate(BYTE type, BOOL |
| break; | break; |
| case 0x0a: // READ ID | case 0x0a: // READ ID |
| fdc.mf = I286_AH & 0x40; // ver0.29 | fdc.mf = CPU_AH & 0x40; // ver0.29 |
| if (I286_AH & 0x10) { // ver0.28 | if (CPU_AH & 0x10) { // ver0.28 |
| if (!biosfd_seek(I286_CL, ndensity)) { | if (!biosfd_seek(CPU_CL, ndensity)) { |
| result = FDCBIOS_SEEKSUCCESS; | result = FDCBIOS_SEEKSUCCESS; |
| } | } |
| else { | else { |
| Line 609 static BYTE fdd_operate(BYTE type, BOOL | Line 608 static BYTE fdd_operate(BYTE type, BOOL |
| mtr_r += 128 << 8; | mtr_r += 128 << 8; |
| } | } |
| ret_ah = 0x00; | ret_ah = 0x00; |
| I286_CL = fdc.C; | CPU_CL = fdc.C; |
| I286_DH = fdc.H; | CPU_DH = fdc.H; |
| I286_DL = fdc.R; | CPU_DL = fdc.R; |
| I286_CH = fdc.N; | CPU_CH = fdc.N; |
| result = FDCBIOS_SUCCESS; | result = FDCBIOS_SUCCESS; |
| break; | break; |
| case 0x0d: // フォーマット | case 0x0d: // フォーマット |
| if (I286_AH & 0x10) { | if (CPU_AH & 0x10) { |
| biosfd_seek(I286_CL, ndensity); | biosfd_seek(CPU_CL, ndensity); |
| } | } |
| if (fdd_diskprotect(fdc.us)) { | if (fdd_diskprotect(fdc.us)) { |
| ret_ah = 0x70; | ret_ah = 0x70; |
| break; | break; |
| } | } |
| fdc.d = I286_DL; | fdc.d = CPU_DL; |
| fdc.N = I286_CH; | fdc.N = CPU_CH; |
| para = fdfmt_biospara(1, rpm); | para = fdfmt_biospara(1, rpm); |
| if (!para) { | if (!para) { |
| ret_ah = 0xd0; | ret_ah = 0xd0; |
| Line 633 static BYTE fdd_operate(BYTE type, BOOL | Line 632 static BYTE fdd_operate(BYTE type, BOOL |
| } | } |
| fdc.sc = (BYTE)para; | fdc.sc = (BYTE)para; |
| fdd_formatinit(); | fdd_formatinit(); |
| pos = I286_BP; | pos = CPU_BP; |
| for (s=0; s<fdc.sc; s++) { | for (s=0; s<fdc.sc; s++) { |
| i286_memstr_read(I286_ES, pos, ID, 4); | i286_memstr_read(CPU_ES, pos, ID, 4); |
| fdd_formating(ID); | fdd_formating(ID); |
| pos += 4; | pos += 4; |
| } | } |
| Line 644 static BYTE fdd_operate(BYTE type, BOOL | Line 643 static BYTE fdd_operate(BYTE type, BOOL |
| } | } |
| fdd_int(result); | fdd_int(result); |
| fddmtr_seek(fdc.us, mtr_c, mtr_r); | fddmtr_seek(fdc.us, mtr_c, mtr_r); |
| I286_IP = BIOSOFST_WAIT; // ver0.30 | CPU_IP = BIOSOFST_WAIT; // ver0.30 |
| return(ret_ah); | return(ret_ah); |
| } | } |
| Line 705 static BYTE sxsi_pos(long *pos) { | Line 704 static BYTE sxsi_pos(long *pos) { |
| int np2drv; | int np2drv; |
| *pos = 0; | *pos = 0; |
| np2drv = (I286_AL & 0x20) >> 4; | np2drv = (CPU_AL & 0x20) >> 4; |
| if ((I286_AL & 0x0f) >= 2) { | if ((CPU_AL & 0x0f) >= 2) { |
| return(0x60); | return(0x60); |
| } | } |
| np2drv |= (I286_AL & 1); | np2drv |= (CPU_AL & 1); |
| sxsi = &sxsi_hd[np2drv]; | sxsi = &sxsi_hd[np2drv]; |
| if (I286_AL & 0x80) { | if (CPU_AL & 0x80) { |
| if ((I286_DL >= sxsi->sectors) || | if ((CPU_DL >= sxsi->sectors) || |
| (I286_DH >= sxsi->surfaces) || | (CPU_DH >= sxsi->surfaces) || |
| (I286_CX >= sxsi->tracks)) { | (CPU_CX >= sxsi->tracks)) { |
| return(0xd0); | return(0xd0); |
| } | } |
| (*pos) = ((I286_CX * sxsi->surfaces) + I286_DH) * sxsi->sectors | (*pos) = ((CPU_CX * sxsi->surfaces) + CPU_DH) * sxsi->sectors |
| + I286_DL; | + CPU_DL; |
| } | } |
| else { | else { |
| *pos = (I286_DL << 16) | I286_CX; | *pos = (CPU_DL << 16) | CPU_CX; |
| if (!(I286_AL & 0x20)) { | if (!(CPU_AL & 0x20)) { |
| (*pos) &= 0x1fffff; | (*pos) &= 0x1fffff; |
| } | } |
| if ((*pos) >= sxsi->totals) { | if ((*pos) >= sxsi->totals) { |
| Line 740 static BYTE sxsi_operate(BYTE type) { | Line 739 static BYTE sxsi_operate(BYTE type) { |
| long pos; | long pos; |
| // int i; | // int i; |
| drv = (I286_AL & 0x20) >> 4; | drv = (CPU_AL & 0x20) >> 4; |
| if ((I286_AL & 0x0f) >= 2) { | if ((CPU_AL & 0x0f) >= 2) { |
| return(0x60); | return(0x60); |
| } | } |
| drv |= (I286_AL & 1); | drv |= (CPU_AL & 1); |
| switch(I286_AH & 0x0f) { | switch(CPU_AH & 0x0f) { |
| case 0x01: // ベリファイ | case 0x01: // ベリファイ |
| case 0x07: // リトラクト | case 0x07: // リトラクト |
| case 0x0f: // リトラクト | case 0x0f: // リトラクト |
| Line 763 static BYTE sxsi_operate(BYTE type) { | Line 762 static BYTE sxsi_operate(BYTE type) { |
| case 0x04: // センス | case 0x04: // センス |
| ret_ah = 0x00; | ret_ah = 0x00; |
| if ((I286_AH == 0x04) && (type == HDDTYPE_SASI)) { | if ((CPU_AH == 0x04) && (type == HDDTYPE_SASI)) { |
| ret_ah = 0x04; | ret_ah = 0x04; |
| } | } |
| else if ((I286_AH == 0x44) && (type == HDDTYPE_SCSI)) { | else if ((CPU_AH == 0x44) && (type == HDDTYPE_SCSI)) { |
| I286_BX = 1; | CPU_BX = 1; |
| } | } |
| else if (I286_AH == 0x84) { | else if (CPU_AH == 0x84) { |
| I286_BX = sxsi_hd[drv].size; | CPU_BX = sxsi_hd[drv].size; |
| I286_CX = sxsi_hd[drv].tracks; | CPU_CX = sxsi_hd[drv].tracks; |
| I286_DH = sxsi_hd[drv].surfaces; | CPU_DH = sxsi_hd[drv].surfaces; |
| I286_DL = sxsi_hd[drv].sectors; | CPU_DL = sxsi_hd[drv].sectors; |
| } | } |
| break; | break; |
| case 0x05: // データの書き込み | case 0x05: // データの書き込み |
| i286_memx_read(ES_BASE + I286_BP, work, I286_BX); | i286_memx_read(ES_BASE + CPU_BP, work, CPU_BX); |
| ret_ah = sxsi_pos(&pos); | ret_ah = sxsi_pos(&pos); |
| if (!ret_ah) { | if (!ret_ah) { |
| ret_ah = sxsi_write(I286_AL, pos, work, I286_BX); | ret_ah = sxsi_write(CPU_AL, pos, work, CPU_BX); |
| } | } |
| break; | break; |
| case 0x06: // データの読み込み | case 0x06: // データの読み込み |
| ret_ah = sxsi_pos(&pos); | ret_ah = sxsi_pos(&pos); |
| if (!ret_ah) { | if (!ret_ah) { |
| ret_ah = sxsi_read(I286_AL, pos, work, I286_BX); | ret_ah = sxsi_read(CPU_AL, pos, work, CPU_BX); |
| if (ret_ah < 0x20) { | if (ret_ah < 0x20) { |
| i286_memx_write(ES_BASE + I286_BP, work, I286_BX); | i286_memx_write(ES_BASE + CPU_BP, work, CPU_BX); |
| } | } |
| } | } |
| break; | break; |
| case 0x0d: // フォーマット | case 0x0d: // フォーマット |
| if (I286_DL) { | if (CPU_DL) { |
| ret_ah = 0x30; | ret_ah = 0x30; |
| break; | break; |
| } | } |
| i286_memstr_read(I286_ES, I286_BP, work, I286_BX); | i286_memstr_read(CPU_ES, CPU_BP, work, CPU_BX); |
| ret_ah = sxsi_pos(&pos); | ret_ah = sxsi_pos(&pos); |
| if (!ret_ah) { | if (!ret_ah) { |
| ret_ah = sxsi_format(I286_AL, pos); | ret_ah = sxsi_format(CPU_AL, pos); |
| } | } |
| break; | break; |
| Line 996 void bios0x1b(void) { | Line 995 void bios0x1b(void) { |
| BYTE ret_ah; | BYTE ret_ah; |
| REG8 flag; | REG8 flag; |
| switch(I286_AL & 0xf0) { | switch(CPU_AL & 0xf0) { |
| case 0x90: | case 0x90: |
| ret_ah = fdd_operate(DISKTYPE_2HD, 0, 0); | ret_ah = fdd_operate(DISKTYPE_2HD, 0, 0); |
| break; | break; |
| Line 1034 void bios0x1b(void) { | Line 1033 void bios0x1b(void) { |
| #if 0 | #if 0 |
| { | { |
| static BYTE p = 0; | static BYTE p = 0; |
| if ((I286_CL == 0x4d) && (ret_ah == 0xe0)) { | if ((CPU_CL == 0x4d) && (ret_ah == 0xe0)) { |
| if (!p) { | if (!p) { |
| trace_sw = 1; | trace_sw = 1; |
| p++; | p++; |
| Line 1047 void bios0x1b(void) { | Line 1046 void bios0x1b(void) { |
| #if 0 | #if 0 |
| TRACEOUT(("%04x:%04x AX=%04x BX=%04x %02x:%02x:%02x:%02x\n" \ | TRACEOUT(("%04x:%04x AX=%04x BX=%04x %02x:%02x:%02x:%02x\n" \ |
| "ES=%04x BP=%04x \nret=%02x", | "ES=%04x BP=%04x \nret=%02x", |
| i286_memword_read(I286_SS, I286_SP+2), | i286_memword_read(CPU_SS, CPU_SP+2), |
| i286_memword_read(I286_SS, I286_SP), | i286_memword_read(CPU_SS, CPU_SP), |
| I286_AX, I286_BX, I286_CL, I286_DH, I286_DL, I286_CH, | CPU_AX, CPU_BX, CPU_CL, CPU_DH, CPU_DL, CPU_CH, |
| I286_ES, I286_BP, ret_ah)); | CPU_ES, CPU_BP, ret_ah)); |
| #endif | #endif |
| I286_AH = ret_ah; | CPU_AH = ret_ah; |
| flag = i286_membyte_read(I286_SS, I286_SP+4) & 0xfe; | flag = i286_membyte_read(CPU_SS, CPU_SP+4) & 0xfe; |
| if (ret_ah >= 0x20) { | if (ret_ah >= 0x20) { |
| flag += 1; | flag += 1; |
| } | } |
| i286_membyte_write(I286_SS, I286_SP+4, flag); | i286_membyte_write(CPU_SS, CPU_SP + 4, flag); |
| } | } |