|
|
| version 1.33, 2004/03/14 23:45:43 | version 1.41, 2005/03/16 09:33:53 |
|---|---|
| Line 8 | Line 8 |
| #include "font.h" | #include "font.h" |
| static int sti_waiting = 0; | |
| typedef struct { | typedef struct { |
| BYTE GBON_PTN; | UINT8 GBON_PTN; |
| BYTE GBBCC; | UINT8 GBBCC; |
| BYTE GBDOTU; | UINT8 GBDOTU; |
| BYTE GBDSP; | UINT8 GBDSP; |
| BYTE GBCPC[4]; | UINT8 GBCPC[4]; |
| BYTE GBSX1[2]; | UINT8 GBSX1[2]; |
| BYTE GBSY1[2]; | UINT8 GBSY1[2]; |
| BYTE GBLNG1[2]; | UINT8 GBLNG1[2]; |
| BYTE GBWDPA[2]; | UINT8 GBWDPA[2]; |
| BYTE GBRBUF[2][3]; | UINT8 GBRBUF[2][3]; |
| BYTE GBSX2[2]; | UINT8 GBSX2[2]; |
| BYTE GBSY2[2]; | UINT8 GBSY2[2]; |
| BYTE GBMDOT[2]; | UINT8 GBMDOT[2]; |
| BYTE GBCIR[2]; | UINT8 GBCIR[2]; |
| BYTE GBLNG2[2]; | UINT8 GBLNG2[2]; |
| BYTE GBMDOTI[8]; | UINT8 GBMDOTI[8]; |
| BYTE GBDTYP; | UINT8 GBDTYP; |
| BYTE GBFILL; | UINT8 GBFILL; |
| } UCWTBL; | } UCWTBL; |
| typedef struct { | typedef struct { |
| Line 145 void bios0x18_0c(void) { | Line 143 void bios0x18_0c(void) { |
| static void bios0x18_0f(UINT seg, UINT off, REG8 num, REG8 cnt) { | static void bios0x18_0f(UINT seg, UINT off, REG8 num, REG8 cnt) { |
| BYTE *p; | UINT8 *p; |
| UINT raster; | UINT raster; |
| UINT t; | UINT t; |
| Line 209 void bios0x18_10(REG8 curdel) { | Line 207 void bios0x18_10(REG8 curdel) { |
| REG16 bios0x18_14(REG16 seg, REG16 off, REG16 code) { | REG16 bios0x18_14(REG16 seg, REG16 off, REG16 code) { |
| UINT16 size; | UINT16 size; |
| const BYTE *p; | const UINT8 *p; |
| BYTE buf[32]; | UINT8 buf[32]; |
| UINT i; | UINT i; |
| switch(code >> 8) { | switch(code >> 8) { |
| Line 221 const BYTE *p; | Line 219 const BYTE *p; |
| MEML_WRITESTR(seg, off + 2, p, 8); | MEML_WRITESTR(seg, off + 2, p, 8); |
| break; | break; |
| case 0x28: // 8x16 KANJI | // case 0x28: |
| case 0x29: | case 0x29: // 8x16 KANJI |
| case 0x2a: | case 0x2a: |
| case 0x2b: | case 0x2b: |
| size = 0x0102; | size = 0x0102; |
| Line 257 const BYTE *p; | Line 255 const BYTE *p; |
| static void bios0x18_1a(REG16 seg, REG16 off, REG16 code) { | static void bios0x18_1a(REG16 seg, REG16 off, REG16 code) { |
| BYTE *p; | UINT8 *p; |
| BYTE buf[32]; | UINT8 buf[32]; |
| UINT i; | UINT i; |
| if (((code >> 8) & 0x7e) == 0x76) { | if (((code >> 8) & 0x7e) == 0x76) { |
| Line 356 const CRTDATA *p; | Line 354 const CRTDATA *p; |
| } | } |
| CopyMemory(gdc.m.para + GDC_SYNC, gdcmastersync[master], 8); | CopyMemory(gdc.m.para + GDC_SYNC, gdcmastersync[master], 8); |
| ZeroMemory(gdc.m.para + GDC_SCROLL, 8); | ZeroMemory(gdc.m.para + GDC_SCROLL, 4); |
| gdc.m.para[GDC_PITCH] = 80; | gdc.m.para[GDC_PITCH] = 80; |
| p = crtdata + crt; | p = crtdata + crt; |
| Line 371 const CRTDATA *p; | Line 369 const CRTDATA *p; |
| crtc.reg.sdr = 0; | crtc.reg.sdr = 0; |
| CopyMemory(gdc.s.para + GDC_SYNC, gdcslavesync[slave], 8); | CopyMemory(gdc.s.para + GDC_SYNC, gdcslavesync[slave], 8); |
| ZeroMemory(gdc.s.para + GDC_SCROLL, 8); | ZeroMemory(gdc.s.para + GDC_SCROLL, 4); |
| if (slave & 1) { | if (slave & 1) { |
| gdc.s.para[GDC_PITCH] = 80; | gdc.s.para[GDC_PITCH] = 80; |
| gdc.clock |= 3; | gdc.clock |= 3; |
| mem[MEMB_PRXDUPD] |= 0x04; | mem[MEMB_PRXDUPD] |= 0x04; |
| gdc.s.para[GDC_SCROLL+3] = 0x40; | |
| } | } |
| else { | else { |
| gdc.s.para[GDC_PITCH] = 40; | gdc.s.para[GDC_PITCH] = 40; |
| Line 476 void bios0x18_42(REG8 mode) { | Line 475 void bios0x18_42(REG8 mode) { |
| scrn = bios0x18_31bh(); | scrn = bios0x18_31bh(); |
| if ((mem[MEMB_CRT_BIOS] & 0x80) && | if ((mem[MEMB_CRT_BIOS] & 0x80) && |
| (((scrn & 0x30) == 0x30) || (crtmode == 3))) { | (((scrn & 0x30) == 0x30) || (crtmode == 3))) { |
| bios0x18_30(rate, (crtmode << 4) + 1); | bios0x18_30(rate, (REG8)((crtmode << 4) + 1)); |
| } | } |
| else { | else { |
| #endif | #endif |
| ZeroMemory(gdc.s.para + GDC_SCROLL, 8); | ZeroMemory(gdc.s.para + GDC_SCROLL, 4); |
| if (crtmode == 2) { // ALL | if (crtmode == 2) { // ALL |
| crtmode = 2; | crtmode = 2; |
| if ((mem[MEMB_PRXDUPD] & 0x24) == 0x20) { | if ((mem[MEMB_PRXDUPD] & 0x24) == 0x20) { |
| Line 511 void bios0x18_42(REG8 mode) { | Line 510 void bios0x18_42(REG8 mode) { |
| gdc.s.para[GDC_SCROLL+1] = (200*40) >> 8; | gdc.s.para[GDC_SCROLL+1] = (200*40) >> 8; |
| } | } |
| } | } |
| if (mem[MEMB_PRXDUPD] & 4) { | |
| gdc.s.para[GDC_SCROLL+3] = 0x40; | |
| } | |
| if ((crtmode == 2) || (!(mem[MEMB_PRXCRT] & 0x40))) { | if ((crtmode == 2) || (!(mem[MEMB_PRXCRT] & 0x40))) { |
| gdc.mode1 &= ~(0x10); | gdc.mode1 &= ~(0x10); |
| gdc.s.para[GDC_CSRFORM] = 0; | gdc.s.para[GDC_CSRFORM] = 0; |
| Line 528 void bios0x18_42(REG8 mode) { | Line 530 void bios0x18_42(REG8 mode) { |
| gdcs.disp = (mode >> 4) & 1; | gdcs.disp = (mode >> 4) & 1; |
| } | } |
| if (!(mode & 0x20)) { | if (!(mode & 0x20)) { |
| gdc.mode1 &= ~0x04; | gdc.mode2 &= ~0x04; |
| } | } |
| else { | else { |
| gdc.mode2 |= 0x04; | gdc.mode2 |= 0x04; |
| } | } |
| gdcs.mode2 = gdc.mode2; | |
| gdcs.grphdisp |= GDCSCRN_ALLDRAW2; | gdcs.grphdisp |= GDCSCRN_ALLDRAW2; |
| screenupdate |= 2; | screenupdate |= 2; |
| } | } |
| static void setbiosgdc(UINT32 csrw, const GDCVECT *vect, UINT8 ope) { | static void setbiosgdc(UINT32 csrw, const GDCVECT *vect, UINT8 ope) { |
| gdc.s.para[GDC_CSRW + 0] = (BYTE)csrw; | gdc.s.para[GDC_CSRW + 0] = (UINT8)csrw; |
| gdc.s.para[GDC_CSRW + 1] = (BYTE)(csrw >> 8); | gdc.s.para[GDC_CSRW + 1] = (UINT8)(csrw >> 8); |
| gdc.s.para[GDC_CSRW + 2] = (BYTE)(csrw >> 16); | gdc.s.para[GDC_CSRW + 2] = (UINT8)(csrw >> 16); |
| gdc.s.para[GDC_VECTW] = vect->ope; | gdc.s.para[GDC_VECTW] = vect->ope; |
| gdc_vectreset(&gdc.s); | gdc_vectreset(&gdc.s); |
| Line 628 static void bios0x18_47(void) { | Line 631 static void bios0x18_47(void) { |
| vect.ope = 0x20 + (ucw.GBDSP & 7); | vect.ope = 0x20 + (ucw.GBDSP & 7); |
| vect.DC[0] = ucw.GBLNG1[0]; | vect.DC[0] = ucw.GBLNG1[0]; |
| vect.DC[1] = ucw.GBLNG1[1]; | vect.DC[1] = ucw.GBLNG1[1]; |
| data = LOADINTELWORD(ucw.GBLNG2) - 1; | // data = LOADINTELWORD(ucw.GBLNG2) - 1; |
| data = LOADINTELWORD(ucw.GBCIR) - 1; | |
| STOREINTELWORD(vect.D, data); | STOREINTELWORD(vect.D, data); |
| data >>= 1; | data >>= 1; |
| STOREINTELWORD(vect.D2, data); | STOREINTELWORD(vect.D2, data); |
| Line 670 static void bios0x18_49(void) { | Line 674 static void bios0x18_49(void) { |
| UCWTBL ucw; | UCWTBL ucw; |
| UINT i; | UINT i; |
| BYTE pat[8]; | UINT8 pat[8]; |
| UINT16 tmp; | UINT16 tmp; |
| GDCVECT vect; | GDCVECT vect; |
| UINT16 GBSX1; | UINT16 GBSX1; |
| Line 762 void bios0x18(void) { | Line 766 void bios0x18(void) { |
| } tmp; | } tmp; |
| int i; | int i; |
| #if 0 | #if 1 |
| TRACEOUT(("int18 AX=%.4x %.4x:%.4x", CPU_AX, | TRACEOUT(("int18 AX=%.4x %.4x:%.4x", CPU_AX, |
| MEML_READ16(CPU_SS, CPU_SP+2), | MEML_READ16(CPU_SS, CPU_SP+2), |
| MEML_READ16(CPU_SS, CPU_SP))); | MEML_READ16(CPU_SS, CPU_SP))); |
| #endif | #endif |
| sti_waiting ^= 1; | |
| if (sti_waiting) { // 割込み許可の遊び | |
| CPU_STI; | |
| if (PICEXISTINTR) { | |
| CPU_IP--; | |
| nevent_forceexit(); | |
| return; | |
| } | |
| } | |
| sti_waiting = 0; | |
| switch(CPU_AH) { | switch(CPU_AH) { |
| case 0x00: // キー・データの読みだし | case 0x00: // キー・データの読みだし |
| if (mem[MEMB_KB_COUNT]) { | if (mem[MEMB_KB_COUNT]) { |
| Line 811 void bios0x18(void) { | Line 804 void bios0x18(void) { |
| break; | break; |
| case 0x04: // キー入力状態のセンス | case 0x04: // キー入力状態のセンス |
| CPU_AH = mem[0x00052a + (CPU_AL & 0x0f)]; | CPU_AH = mem[MEMX_KB_KY_STS + (CPU_AL & 0x0f)]; |
| break; | break; |
| case 0x05: // キー入力センス | case 0x05: // キー入力センス |
| Line 945 void bios0x18(void) { | Line 938 void bios0x18(void) { |
| if (tmp.r8 == 0x05) { | if (tmp.r8 == 0x05) { |
| CPU_AL = 0; | CPU_AL = 0; |
| CPU_BH = 0; | CPU_BH = 0; |
| TRACEOUT(("success")); | |
| } | } |
| else { | else { |
| CPU_AL = 1; | CPU_AL = 1; |
| CPU_BH = 1; | CPU_BH = 1; |
| TRACEOUT(("failure")); | |
| } | } |
| } | } |
| break; | break; |