| version 1.4, 2003/11/28 08:01:33 | version 1.12, 2005/02/07 14:46:13 | 
| Line 1 | Line 1 | 
 | #include        "compiler.h" | #include        "compiler.h" | 
| #include        "memory.h" | #include        "cpucore.h" | 
 | #include        "pccore.h" | #include        "pccore.h" | 
 | #include        "iocore.h" | #include        "iocore.h" | 
 | #include        "vram.h" | #include        "vram.h" | 
| Line 14  static UINT32 text_table[512]; | Line 14  static UINT32 text_table[512]; | 
 | static  UINT32  text_tblx2[512][2]; | static  UINT32  text_tblx2[512][2]; | 
 |  |  | 
 |  |  | 
| void maketext_reset(void) { | void maketext_initialize(void) { | 
|  |  | 
| ZeroMemory(&tramflag, sizeof(tramflag)); |  | 
| } |  | 
|  |  | 
| void maketext_init(void) { |  | 
 |  |  | 
 | int             i; | int             i; | 
 | int             j; | int             j; | 
| BYTE    bit; | UINT8   bit; | 
 |  |  | 
 | ZeroMemory(text_table, sizeof(text_table)); | ZeroMemory(text_table, sizeof(text_table)); | 
 | for (i=0; i<8; i++) { | for (i=0; i<8; i++) { | 
| Line 67  void maketext_init(void) { | Line 62  void maketext_init(void) { | 
 | } | } | 
 | } | } | 
 |  |  | 
| static BYTE dirtyonblink(void) { | void maketext_reset(void) { | 
|  |  | 
|  | ZeroMemory(&tramflag, sizeof(tramflag)); | 
|  | } | 
|  |  | 
|  | static UINT8 dirtyonblink(void) { | 
 |  |  | 
| BYTE    ret; | UINT8   ret; | 
 | int             i; | int             i; | 
 |  |  | 
 | ret = 0; | ret = 0; | 
| Line 82  static BYTE dirtyonblink(void) { | Line 82  static BYTE dirtyonblink(void) { | 
 | return(ret); | return(ret); | 
 | } | } | 
 |  |  | 
| BYTE maketext_curblink(void) { | UINT8 maketext_curblink(void) { | 
 |  |  | 
| BYTE    ret; | UINT8   ret; | 
 | UINT16  csrw; | UINT16  csrw; | 
 |  |  | 
 | ret = 0; | ret = 0; | 
| Line 125  BYTE maketext_curblink(void) { | Line 125  BYTE maketext_curblink(void) { | 
 |  |  | 
 | void maketext(int text_renewal) { | void maketext(int text_renewal) { | 
 |  |  | 
| BYTE    TEXT_LR; | UINT8   multiple; | 
|  | UINT8   TEXT_LR; | 
 | int             TEXT_PL; | int             TEXT_PL; | 
 | int             TEXT_BL; | int             TEXT_BL; | 
 | int             TEXT_CL; | int             TEXT_CL; | 
| Line 134  void maketext(int text_renewal) { | Line 135  void maketext(int text_renewal) { | 
 | int     topline; | int     topline; | 
 | int             lines; | int             lines; | 
 | int             nowline; | int             nowline; | 
| BYTE    wait2; | UINT8   wait2; | 
 | UINT    pitch; | UINT    pitch; | 
 | UINT    csrw; | UINT    csrw; | 
 | UINT    esi; | UINT    esi; | 
 | UINT    scroll; | UINT    scroll; | 
 | int             scrp; | int             scrp; | 
| BYTE    wait1; | UINT8   wait1; | 
| BYTE    LRcnt; | UINT8   LRcnt; | 
 | BOOL    reloadline; | BOOL    reloadline; | 
 | int             new_flag; | int             new_flag; | 
 | int             cur_line; | int             cur_line; | 
 | int             linecnt; | int             linecnt; | 
| BYTE    *q; | UINT8   *q; | 
 | UINT    y; | UINT    y; | 
| BYTE    line_effect = 0;                // for gcc | UINT8   line_effect = 0;                // for gcc | 
 | int             x; | int             x; | 
 | UINT32  bitmap[TEXTXMAX]; | UINT32  bitmap[TEXTXMAX]; | 
| BYTE    curx[TEXTXMAX+1]; | UINT8   curx[TEXTXMAX+1]; | 
 | UINT16  color[TEXTXMAX]; | UINT16  color[TEXTXMAX]; | 
 |  |  | 
 | if (text_renewal) { | if (text_renewal) { | 
 | tramflag.gaiji = 0; | tramflag.gaiji = 0; | 
 | } | } | 
 |  |  | 
 |  | multiple = ((!(gdc.mode1 & 8)) && (!(gdc.crt15khz & 1)))?0x20:0x00; | 
 | TEXT_LR = gdc.m.para[GDC_CSRFORM] & 0x1f; | TEXT_LR = gdc.m.para[GDC_CSRFORM] & 0x1f; | 
 | TEXT_PL = crtc.reg.pl; | TEXT_PL = crtc.reg.pl; | 
 | TEXT_BL = crtc.reg.bl + 1; | TEXT_BL = crtc.reg.bl + 1; | 
| Line 237  void maketext(int text_renewal) { | Line 239  void maketext(int text_renewal) { | 
 | edi = esi; | edi = esi; | 
 | gaiji1st = 0; | gaiji1st = 0; | 
 | kanji2nd = FALSE; | kanji2nd = FALSE; | 
| lastbitp = 0;                                                                           // ver0.28 | lastbitp = 0; | 
 | for (x=0; x<TEXTXMAX; x++) {                                            // width80 | for (x=0; x<TEXTXMAX; x++) {                                            // width80 | 
 | if (edi == csrw) { | if (edi == csrw) { | 
 | cur_line = x; | cur_line = x; | 
| Line 250  void maketext(int text_renewal) { | Line 252  void maketext(int text_renewal) { | 
 | } | } | 
 | if (kanji2nd) { | if (kanji2nd) { | 
 | kanji2nd = FALSE; | kanji2nd = FALSE; | 
| bitmap[x] = lastbitp + 0x800;                           // ver0.28 | bitmap[x] = lastbitp + 0x800; | 
 | curx[x-1] |= 0x80; | curx[x-1] |= 0x80; | 
| curx[x] |= curx[x-1] & 0x20;                            // ver0.28 | curx[x] |= curx[x-1] & 0x20; | 
 | } | } | 
 | else if (!(mem[0xa0001 + edi*2] & gdc.bitac)) { | else if (!(mem[0xa0001 + edi*2] & gdc.bitac)) { | 
 | gaiji1st = 0; | gaiji1st = 0; | 
| Line 265  void maketext(int text_renewal) { | Line 267  void maketext(int text_renewal) { | 
 | } | } | 
 | else { | else { | 
 | bitmap[x] = 0x82000 + | bitmap[x] = 0x82000 + | 
| (mem[0xa0000 + edi*2] << 3); | (mem[0xa0000 + edi*2] << 4); | 
| curx[x] |= 0x20;                                                // ver0.28 | curx[x] |= multiple;                                    // ver0.74 | 
 | if ((curx[x] & TXTATR_BG) && (gdc.mode1 & 1)) { | if ((curx[x] & TXTATR_BG) && (gdc.mode1 & 1)) { | 
| bitmap[x] += 0x800; | bitmap[x] += 8; | 
 | } | } | 
 | } | } | 
 | } | } | 
| Line 276  void maketext(int text_renewal) { | Line 278  void maketext(int text_renewal) { | 
 | UINT kc; | UINT kc; | 
 | kc = LOADINTELWORD(mem + 0xa0000 + edi*2); | kc = LOADINTELWORD(mem + 0xa0000 + edi*2); | 
 | bitmap[x] = (kc & 0x7f7f) << 4; | bitmap[x] = (kc & 0x7f7f) << 4; | 
| kc &= 0x7e; | kc &= 0x7f;                                                                     // ver0.78 | 
| if (kc == 0x56) {                                                       // ver0.28 | if ((kc == 0x56) || (kc == 0x57)) { | 
 | tramflag.gaiji = 1; | tramflag.gaiji = 1; | 
 | if ((gaiji1st) && | if ((gaiji1st) && | 
 | (bitmap[x] == (lastbitp & (~15)))) { | (bitmap[x] == (lastbitp & (~15)))) { | 
| Line 288  void maketext(int text_renewal) { | Line 290  void maketext(int text_renewal) { | 
 | } | } | 
 | else { | else { | 
 | gaiji1st = 0; | gaiji1st = 0; | 
| if ((kc < 0x08) || (kc >= 0x0c)) { | if ((kc < 0x09) || (kc >= 0x0c)) { | 
 | kanji2nd = TRUE; | kanji2nd = TRUE; | 
 | } | } | 
 | } | } | 
 | // ver0.28 |  | 
 | if ((curx[x] & TXTATR_BG) && (gdc.mode1 & 1)) { | if ((curx[x] & TXTATR_BG) && (gdc.mode1 & 1)) { | 
 | curx[x] |= 0x20; | curx[x] |= 0x20; | 
 | bitmap[x] += 8; | bitmap[x] += 8; | 
 | } | } | 
 | else if (!(gdc.mode1 & 8)) { | else if (!(gdc.mode1 & 8)) { | 
| curx[x] |= 0x20; | curx[x] |= multiple; | 
 | } | } | 
 | } | } | 
 | lastbitp = bitmap[x]; | lastbitp = bitmap[x]; | 
| Line 333  void maketext(int text_renewal) { | Line 334  void maketext(int text_renewal) { | 
 | if ((nowline >= (gdc.m.para[GDC_CSRFORM+1] & 0x1f)) && | if ((nowline >= (gdc.m.para[GDC_CSRFORM+1] & 0x1f)) && | 
 | (nowline <= (gdc.m.para[GDC_CSRFORM+2] >> 3))) { | (nowline <= (gdc.m.para[GDC_CSRFORM+2] >> 3))) { | 
 | color[cur_line] |= 256; | color[cur_line] |= 256; | 
| if (curx[cur_line] & 0x80) {                            // ver0.28 | if (curx[cur_line] & 0x80) { | 
 | color[cur_line+1] |= 256; | color[cur_line+1] |= 256; | 
 | } | } | 
 | } | } | 
 | else { | else { | 
 | color[cur_line] &= ~(256); | color[cur_line] &= ~(256); | 
| if (curx[cur_line] & 0x80) {                            // ver0.28 | if (curx[cur_line] & 0x80) { | 
 | color[cur_line+1] &= ~(256); | color[cur_line+1] &= ~(256); | 
 | } | } | 
 | } | } | 
| Line 348  void maketext(int text_renewal) { | Line 349  void maketext(int text_renewal) { | 
 | // width80 | // width80 | 
 | for (x=0; x<TEXTXMAX; x++) { | for (x=0; x<TEXTXMAX; x++) { | 
 | int fntline; | int fntline; | 
| BYTE data; | UINT8 data; | 
| fntline = nowline & 0x0f; | fntline = nowline; | 
 | if (curx[x] & 0x20) { | if (curx[x] & 0x20) { | 
 | fntline >>= 1; | fntline >>= 1; | 
 | } | } | 
| data = fontrom[bitmap[x] + fntline]; | data = fontrom[bitmap[x] + (fntline & 0x0f)]; | 
 | *(UINT32 *)(q+0) = text_table[color[x] + (data >> 4)]; | *(UINT32 *)(q+0) = text_table[color[x] + (data >> 4)]; | 
 | *(UINT32 *)(q+4) = text_table[color[x] + (data & 15)]; | *(UINT32 *)(q+4) = text_table[color[x] + (data & 15)]; | 
 | q += 8; | q += 8; | 
| Line 387  void maketext(int text_renewal) { | Line 388  void maketext(int text_renewal) { | 
 | } | } | 
 | q += 4; | q += 4; | 
 | } | } | 
 | // virtical line ver0.27 |  | 
 | if ((line_effect & TXTATR_VL) && (!(gdc.mode1 & 1))) { | if ((line_effect & TXTATR_VL) && (!(gdc.mode1 & 1))) { | 
 | // width80 | // width80 | 
 | q -= TEXTXMAX * 8; | q -= TEXTXMAX * 8; | 
| Line 434  void maketext(int text_renewal) { | Line 434  void maketext(int text_renewal) { | 
 |  |  | 
 | void maketext40(int text_renewal) { | void maketext40(int text_renewal) { | 
 |  |  | 
| BYTE    TEXT_LR; | UINT8   multiple; | 
|  | UINT8   TEXT_LR; | 
 | int             TEXT_PL; | int             TEXT_PL; | 
 | int             TEXT_BL; | int             TEXT_BL; | 
 | int             TEXT_CL; | int             TEXT_CL; | 
| Line 443  void maketext40(int text_renewal) { | Line 444  void maketext40(int text_renewal) { | 
 | int             topline; | int             topline; | 
 | int             lines; | int             lines; | 
 | int             nowline; | int             nowline; | 
| BYTE    wait2; | UINT8   wait2; | 
 | UINT    pitch; | UINT    pitch; | 
 | UINT    csrw; | UINT    csrw; | 
 | UINT    esi; | UINT    esi; | 
 | UINT    scroll; | UINT    scroll; | 
 | int             scrp; | int             scrp; | 
| BYTE    wait1; | UINT8   wait1; | 
| BYTE    LRcnt; | UINT8   LRcnt; | 
 | BOOL    reloadline; | BOOL    reloadline; | 
 | int             new_flag; | int             new_flag; | 
 | int             cur_line; | int             cur_line; | 
 | int             linecnt; | int             linecnt; | 
| BYTE    *q; | UINT8   *q; | 
 | UINT    y; | UINT    y; | 
| BYTE    line_effect = 0;                // for gcc | UINT8   line_effect = 0;                // for gcc | 
 | int             x; | int             x; | 
 | UINT32  bitmap[TEXTXMAX]; | UINT32  bitmap[TEXTXMAX]; | 
| BYTE    curx[TEXTXMAX+1]; | UINT8   curx[TEXTXMAX+1]; | 
 | UINT16  color[TEXTXMAX]; | UINT16  color[TEXTXMAX]; | 
 |  |  | 
 | if (text_renewal) { | if (text_renewal) { | 
 | tramflag.gaiji = 0; | tramflag.gaiji = 0; | 
 | } | } | 
 |  |  | 
 |  | multiple = ((!(gdc.mode1 & 8)) && (!(gdc.crt15khz & 1)))?0x20:0x00; | 
 | TEXT_LR = gdc.m.para[GDC_CSRFORM] & 0x1f; | TEXT_LR = gdc.m.para[GDC_CSRFORM] & 0x1f; | 
 | TEXT_PL = crtc.reg.pl; | TEXT_PL = crtc.reg.pl; | 
 | TEXT_BL = crtc.reg.bl + 1; | TEXT_BL = crtc.reg.bl + 1; | 
| Line 546  void maketext40(int text_renewal) { | Line 548  void maketext40(int text_renewal) { | 
 | edi = esi; | edi = esi; | 
 | gaiji1st = 0; | gaiji1st = 0; | 
 | kanji2nd = 0; | kanji2nd = 0; | 
| lastbitp = 0;                                                                           // ver0.28 | lastbitp = 0; | 
 | for (x=0; x<(TEXTXMAX/2); x++) {                                        // width40 | for (x=0; x<(TEXTXMAX/2); x++) {                                        // width40 | 
 | if (edi == csrw) { | if (edi == csrw) { | 
 | cur_line = x; | cur_line = x; | 
| Line 559  void maketext40(int text_renewal) { | Line 561  void maketext40(int text_renewal) { | 
 | } | } | 
 | if (kanji2nd) { | if (kanji2nd) { | 
 | kanji2nd = FALSE; | kanji2nd = FALSE; | 
| bitmap[x] = lastbitp + 0x800;                           // ver0.28 | bitmap[x] = lastbitp + 0x800; | 
 | curx[x-1] |= 0x80; | curx[x-1] |= 0x80; | 
| curx[x] |= curx[x-1] & 0x20;                            // ver0.28 | curx[x] |= curx[x-1] & 0x20; | 
 | } | } | 
 | else if (!(mem[0xa0001 + edi*2] & gdc.bitac)) { | else if (!(mem[0xa0001 + edi*2] & gdc.bitac)) { | 
 | gaiji1st = 0; | gaiji1st = 0; | 
| Line 574  void maketext40(int text_renewal) { | Line 576  void maketext40(int text_renewal) { | 
 | } | } | 
 | else { | else { | 
 | bitmap[x] = 0x82000 + | bitmap[x] = 0x82000 + | 
| (mem[0xa0000 + edi*2] << 3); | (mem[0xa0000 + edi*2] << 4); | 
| curx[x] |= 0x20;                                                // ver0.28 | curx[x] |= multiple;                                    // ver0.74 | 
 | if ((curx[x] & TXTATR_BG) && (gdc.mode1 & 1)) { | if ((curx[x] & TXTATR_BG) && (gdc.mode1 & 1)) { | 
| bitmap[x] += 0x800; | bitmap[x] += 8; | 
 | } | } | 
 | } | } | 
 | } | } | 
| Line 585  void maketext40(int text_renewal) { | Line 587  void maketext40(int text_renewal) { | 
 | UINT kc; | UINT kc; | 
 | kc = LOADINTELWORD(mem + 0xa0000 + edi*2); | kc = LOADINTELWORD(mem + 0xa0000 + edi*2); | 
 | bitmap[x] = (kc & 0x7f7f) << 4; | bitmap[x] = (kc & 0x7f7f) << 4; | 
| kc &= 0x7e; | kc &= 0x7f;                                                                     // ver0.78 | 
| if (kc == 0x56) {                                                       // ver0.28 | if ((kc == 0x56) || (kc == 0x57)) { | 
 | tramflag.gaiji = 1; | tramflag.gaiji = 1; | 
 | if ((gaiji1st) && | if ((gaiji1st) && | 
 | (bitmap[x] == (lastbitp & (~15)))) { | (bitmap[x] == (lastbitp & (~15)))) { | 
| Line 597  void maketext40(int text_renewal) { | Line 599  void maketext40(int text_renewal) { | 
 | } | } | 
 | else { | else { | 
 | gaiji1st = 0; | gaiji1st = 0; | 
| if ((kc < 0x08) || (kc >= 0x0c)) { | if ((kc < 0x09) || (kc >= 0x0c)) { | 
 | kanji2nd = TRUE; | kanji2nd = TRUE; | 
 | } | } | 
 | } | } | 
 | // ver0.28 |  | 
 | if ((curx[x] & TXTATR_BG) && (gdc.mode1 & 1)) { | if ((curx[x] & TXTATR_BG) && (gdc.mode1 & 1)) { | 
 | curx[x] |= 0x20; | curx[x] |= 0x20; | 
 | bitmap[x] += 8; | bitmap[x] += 8; | 
 | } | } | 
 | else if (!(gdc.mode1 & 8)) { | else if (!(gdc.mode1 & 8)) { | 
| curx[x] |= 0x20; | curx[x] |= multiple; | 
 | } | } | 
 | } | } | 
 | lastbitp = bitmap[x]; | lastbitp = bitmap[x]; | 
| Line 642  void maketext40(int text_renewal) { | Line 643  void maketext40(int text_renewal) { | 
 | if ((nowline >= (gdc.m.para[GDC_CSRFORM+1] & 0x1f)) && | if ((nowline >= (gdc.m.para[GDC_CSRFORM+1] & 0x1f)) && | 
 | (nowline <= (gdc.m.para[GDC_CSRFORM+2] >> 3))) { | (nowline <= (gdc.m.para[GDC_CSRFORM+2] >> 3))) { | 
 | color[cur_line] |= 256; | color[cur_line] |= 256; | 
| if (curx[cur_line] & 0x80) {                            // ver0.28 | if (curx[cur_line] & 0x80) { | 
 | color[cur_line+1] |= 256; | color[cur_line+1] |= 256; | 
 | } | } | 
 | } | } | 
 | else { | else { | 
 | color[cur_line] &= ~(256); | color[cur_line] &= ~(256); | 
| if (curx[cur_line] & 0x80) {                            // ver0.28 | if (curx[cur_line] & 0x80) { | 
 | color[cur_line+1] &= ~(256); | color[cur_line+1] &= ~(256); | 
 | } | } | 
 | } | } | 
| Line 657  void maketext40(int text_renewal) { | Line 658  void maketext40(int text_renewal) { | 
 | // width40 | // width40 | 
 | for (x=0; x<(TEXTXMAX/2); x++) { | for (x=0; x<(TEXTXMAX/2); x++) { | 
 | int fntline; | int fntline; | 
| BYTE data; | UINT8 data; | 
| fntline = nowline & 0x0f; | fntline = nowline; | 
 | if (curx[x] & 0x20) { | if (curx[x] & 0x20) { | 
 | fntline >>= 1; | fntline >>= 1; | 
 | } | } | 
| data = fontrom[bitmap[x] + fntline]; | data = fontrom[bitmap[x] + (fntline & 0x0f)]; | 
 | *(UINT32 *)(q+ 0) = text_tblx2[color[x] + | *(UINT32 *)(q+ 0) = text_tblx2[color[x] + | 
 | (data>>4)][0]; | (data>>4)][0]; | 
 | *(UINT32 *)(q+ 4) = text_tblx2[color[x] + | *(UINT32 *)(q+ 4) = text_tblx2[color[x] + | 
| Line 712  void maketext40(int text_renewal) { | Line 713  void maketext40(int text_renewal) { | 
 | } | } | 
 | q += 12; | q += 12; | 
 | } | } | 
 | // virtical line ver0.27 |  | 
 | if ((line_effect & TXTATR_VL) && (!(gdc.mode1 & 1))) { | if ((line_effect & TXTATR_VL) && (!(gdc.mode1 & 1))) { | 
 | // width40 | // width40 | 
 | q -= TEXTXMAX * 8; | q -= TEXTXMAX * 8; |