--- np2/lio/gput1.c 2004/02/20 15:20:30 1.5 +++ np2/lio/gput1.c 2005/02/07 14:46:12 1.16 @@ -8,25 +8,35 @@ typedef struct { - BYTE x[2]; - BYTE y[2]; - BYTE off[2]; - BYTE seg[2]; - BYTE leng[2]; - BYTE mode; - BYTE colorsw; - BYTE fg; - BYTE bg; + UINT8 x1[2]; + UINT8 y1[2]; + UINT8 x2[2]; + UINT8 y2[2]; + UINT8 off[2]; + UINT8 seg[2]; + UINT8 leng[2]; +} GGET; + +typedef struct { + UINT8 x[2]; + UINT8 y[2]; + UINT8 off[2]; + UINT8 seg[2]; + UINT8 leng[2]; + UINT8 mode; + UINT8 colorsw; + UINT8 fg; + UINT8 bg; } GPUT1; typedef struct { - BYTE x[2]; - BYTE y[2]; - BYTE chr[2]; - BYTE mode; - BYTE colorsw; - BYTE fg; - BYTE bg; + UINT8 x[2]; + UINT8 y[2]; + UINT8 chr[2]; + UINT8 mode; + UINT8 colorsw; + UINT8 fg; + UINT8 bg; } GPUT2; typedef struct { @@ -43,7 +53,15 @@ typedef struct { } LIOPUT; typedef struct { - BYTE *baseptr; + UINT8 *baseptr; + UINT addr; + UINT sft; + UINT width; + UINT8 mask; +} GETCNTX; + +typedef struct { + UINT8 *baseptr; UINT addr; UINT sft; UINT width; @@ -51,24 +69,22 @@ typedef struct { UINT8 maskr; UINT8 masklr; UINT8 mask; - BYTE pat[84]; + UINT8 pat[84]; } PUTCNTX; -#if 0 -static void getvram(const PUTCNTX *pt) { - BYTE *baseptr; +static void getvram(const GETCNTX *gt, UINT8 *dst) { + + UINT8 *baseptr; UINT addr; - BYTE *dst; UINT width; UINT dat; UINT sft; - baseptr = pt->baseptr; - addr = pt->addr; - src = pt->pat; - width = pt->width; - sft = 8 - pt->sft; + baseptr = gt->baseptr; + addr = gt->addr; + width = gt->width; + sft = 8 - gt->sft; dat = baseptr[LOW15(addr)]; addr++; while(width > 8) { @@ -76,12 +92,11 @@ static void getvram(const PUTCNTX *pt) { dat = (dat << 8) + baseptr[LOW15(addr)]; addr++; *dst = (UINT8)(dat >> sft); - dst++ + dst++; } dat = (dat << 8) + baseptr[LOW15(addr)]; - *dst = (UINT8)((dat >> sft) & pt->mask); + *dst = (UINT8)((dat >> sft) & gt->mask); } -#endif static void setdirty(UINT addr, UINT width, UINT height, REG8 bit) { @@ -101,9 +116,9 @@ static void setdirty(UINT addr, UINT wid static void putor(const PUTCNTX *pt) { - BYTE *baseptr; + UINT8 *baseptr; UINT addr; -const BYTE *src; +const UINT8 *src; UINT width; UINT dat; @@ -135,9 +150,9 @@ const BYTE *src; static void putorn(const PUTCNTX *pt) { - BYTE *baseptr; + UINT8 *baseptr; UINT addr; -const BYTE *src; +const UINT8 *src; UINT width; UINT dat; @@ -169,9 +184,9 @@ const BYTE *src; static void putand(const PUTCNTX *pt) { - BYTE *baseptr; + UINT8 *baseptr; UINT addr; -const BYTE *src; +const UINT8 *src; UINT width; UINT dat; @@ -203,9 +218,9 @@ const BYTE *src; static void putandn(const PUTCNTX *pt) { - BYTE *baseptr; + UINT8 *baseptr; UINT addr; -const BYTE *src; +const UINT8 *src; UINT width; UINT dat; @@ -237,9 +252,9 @@ const BYTE *src; static void putxor(const PUTCNTX *pt) { - BYTE *baseptr; + UINT8 *baseptr; UINT addr; -const BYTE *src; +const UINT8 *src; UINT width; UINT dat; @@ -271,9 +286,9 @@ const BYTE *src; static void putxorn(const PUTCNTX *pt) { - BYTE *baseptr; + UINT8 *baseptr; UINT addr; -const BYTE *src; +const UINT8 *src; UINT width; UINT dat; @@ -306,21 +321,21 @@ const BYTE *src; // ---- -static REG8 putsub(const _LIOWORK *lio, const LIOPUT *lput) { +static REG8 putsub(GLIO lio, const LIOPUT *lput) { UINT addr; - UINT8 sbit; PUTCNTX pt; UINT datacnt; UINT off; UINT height; UINT flag; UINT pl; + UINT writecnt; - if ((lput->x < lio->range.x1) || - (lput->y < lio->range.y1) || - ((lput->x + lput->width) > lio->range.x2) || - ((lput->y + lput->height) > lio->range.y2)) { + if ((lput->x < lio->draw.x1) || + (lput->y < lio->draw.y1) || + ((lput->x + lput->width - 1) > lio->draw.x2) || + ((lput->y + lput->height - 1) > lio->draw.y2)) { return(LIO_ILLEGALFUNC); } if ((lput->width <= 0) || (lput->height <= 0)) { @@ -328,142 +343,219 @@ static REG8 putsub(const _LIOWORK *lio, } addr = (lput->x >> 3) + (lput->y * 80); - if (lio->scrn.top) { + if (lio->draw.flag & LIODRAW_UPPER) { addr += 16000; } - if (!lio->scrn.bank) { - sbit = 1; - } - else { - addr += VRAM_STEP; - sbit = 2; - } - setdirty(addr, (lput->x & 7) + lput->width, lput->height, sbit); + setdirty(addr, (lput->x & 7) + lput->width, lput->height, lio->draw.sbit); + pt.addr = addr; pt.sft = lput->x & 7; pt.width = lput->width; pt.maskl = (UINT8)(0xff >> pt.sft); pt.maskr = (UINT8)((~0x7f) >> ((pt.width + pt.sft - 1) & 7)); pt.masklr = (UINT8)(pt.maskl >> pt.sft); - TRACEOUT(("mask - %.2x %.2x %.2x", pt.maskl, pt.maskr, pt.masklr)); datacnt = (lput->width + 7) >> 3; off = lput->off; - TRACEOUT(("datacnt %d - %.4x %.4x", datacnt, lput->seg, lput->off)); - flag = (lio->gcolor1.palmode == 2)?0x0f:0x07; + flag = (lio->draw.flag & LIODRAW_4BPP)?0x0f:0x07; flag |= (lput->fg & 15) << 4; flag |= (lput->bg & 15) << 8; // さて表示。 - TRACEOUT(("gput mode = %d", lput->mode)); - for (pl=0; pl<4; pl++) { - if (flag & 1) { - pt.baseptr = mem + lioplaneadrs[pl]; - pt.addr = addr; - height = lput->height; - do { - i286_memstr_read(lput->seg, off, pt.pat, datacnt); - off += datacnt; + writecnt = 0; + height = lput->height; + do { + flag <<= 4; + for (pl=0; pl<4; pl++) { + flag >>= 1; + if (flag & 8) { + pt.baseptr = mem + lio->draw.base + lioplaneadrs[pl]; + MEML_READSTR(lput->seg, off, pt.pat, datacnt); + if (lput->sw) { + off += datacnt; + } switch(lput->mode) { case 0: // PSET - if (flag & (1 << 4)) { + if (flag & (8 << 4)) { putor(&pt); } else { putandn(&pt); } - if (flag & (1 << 8)) { + if (flag & (8 << 8)) { putorn(&pt); } else { putand(&pt); } + writecnt += 2; break; case 1: // NOT - if (!(flag & (1 << 4))) { + if (!(flag & (8 << 4))) { putor(&pt); } else { putandn(&pt); } - if (!(flag & (1 << 8))) { + if (!(flag & (8 << 8))) { putorn(&pt); } else { putand(&pt); } + writecnt += 2; break; case 2: // OR - if (flag & (1 << 4)) { + if (flag & (8 << 4)) { putor(&pt); + writecnt++; } - if (flag & (1 << 8)) { + if (flag & (8 << 8)) { putorn(&pt); + writecnt++; } break; case 3: // AND - if (flag & (1 << 4)) { - putand(&pt); - } - if (flag & (1 << 8)) { + if (!(flag & (8 << 4))) { putandn(&pt); + writecnt++; + } + if (!(flag & (8 << 8))) { + putand(&pt); + writecnt++; } break; case 4: // XOR - if (flag & (1 << 4)) { + if (flag & (8 << 4)) { putxor(&pt); + writecnt++; } - if (flag & (1 << 8)) { + if (flag & (8 << 8)) { putxorn(&pt); + writecnt++; } break; } - pt.addr += 80; - } while(--height); - if (!lput->sw) { - off = lput->off; } } - flag >>= 1; - } + pt.addr += 80; + if (!lput->sw) { + off += datacnt; + } + } while(--height); + lio->wait += writecnt * datacnt * (10 + 10 + 10); return(LIO_SUCCESS); } // ---- GGET -REG8 lio_gget(LIOWORK lio) { +REG8 lio_gget(GLIO lio) { - lio_updaterange(lio); + GGET dat; + SINT32 x; + SINT32 y; + int x2; + int y2; + UINT off; + UINT seg; + UINT32 leng; + UINT32 size; + UINT datacnt; + UINT mask; + GETCNTX gt; + UINT8 pat[84]; + UINT pl; + + lio_updatedraw(lio); + MEML_READSTR(CPU_DS, CPU_BX, &dat, sizeof(dat)); + x = (SINT16)LOADINTELWORD(dat.x1); + y = (SINT16)LOADINTELWORD(dat.y1); + x2 = (SINT16)LOADINTELWORD(dat.x2); + y2 = (SINT16)LOADINTELWORD(dat.y2); + if ((x < lio->draw.x1) || (y < lio->draw.y1) || + (x2 > lio->draw.x2) || (y2 > lio->draw.y2)) { + return(LIO_ILLEGALFUNC); + } + x2 = x2 - x + 1; + y2 = y2 - y + 1; + if ((x2 <= 0) || (y2 <= 0)) { + return(LIO_ILLEGALFUNC); + } + off = LOADINTELWORD(dat.off); + seg = (SINT16)LOADINTELWORD(dat.seg); - return(0); + datacnt = (x2 + 7) >> 3; + size = datacnt * y2; + leng = LOADINTELWORD(dat.leng); + if (!(lio->draw.flag & LIODRAW_MONO)) { + if (lio->draw.flag & LIODRAW_4BPP) { + size *= 4; + mask = 0x0f; + } + else { + size *= 3; + mask = 0x07; + } + } + else { + mask = 1 << (lio->draw.flag & LIODRAW_PMASK); + } + if (leng < (size + 4)) { + return(LIO_ILLEGALFUNC); + } + MEML_WRITE16(seg, off, (REG16)x2); + MEML_WRITE16(seg, off+2, (REG16)y2); + off += 4; + gt.addr = (x >> 3) + (y * 80); + if (lio->draw.flag & LIODRAW_UPPER) { + gt.addr += 16000; + } + gt.sft = x & 7; + gt.width = x2; + gt.mask = (UINT8)((~0x7f) >> ((x2 - 1) & 7)); + do { + mask <<= 4; + for (pl=0; pl<4; pl++) { + mask >>= 1; + if (mask & 8) { + gt.baseptr = mem + lio->draw.base + lioplaneadrs[pl]; + getvram(>, pat); + MEML_WRITESTR(seg, off, pat, datacnt); + off += datacnt; + } + } + gt.addr += 80; + } while(--y2); + lio->wait = size * 12; + return(LIO_SUCCESS); } // ---- GPUT1 -REG8 lio_gput1(LIOWORK lio) { +REG8 lio_gput1(GLIO lio) { GPUT1 dat; LIOPUT lput; UINT leng; UINT size; - lio_updaterange(lio); - i286_memstr_read(CPU_DS, CPU_BX, &dat, sizeof(dat)); + lio_updatedraw(lio); + MEML_READSTR(CPU_DS, CPU_BX, &dat, sizeof(dat)); lput.x = (SINT16)LOADINTELWORD(dat.x); lput.y = (SINT16)LOADINTELWORD(dat.y); lput.off = (UINT16)(LOADINTELWORD(dat.off) + 4); lput.seg = LOADINTELWORD(dat.seg); lput.mode = dat.mode; leng = LOADINTELWORD(dat.leng); - lput.width = i286_memword_read(lput.seg, lput.off - 4); - lput.height = i286_memword_read(lput.seg, lput.off - 2); + lput.width = MEML_READ16(lput.seg, lput.off - 4); + lput.height = MEML_READ16(lput.seg, lput.off - 2); size = ((lput.width + 7) >> 3) * lput.height; if (leng < (size + 4)) { return(LIO_ILLEGALFUNC); @@ -475,8 +567,8 @@ REG8 lio_gput1(LIOWORK lio) { lput.bg = dat.bg; } else { - lput.fg = lio->gcolor1.fgcolor; - lput.bg = lio->gcolor1.bgcolor; + lput.fg = lio->work.fgcolor; + lput.bg = lio->work.bgcolor; } } else { @@ -488,7 +580,7 @@ REG8 lio_gput1(LIOWORK lio) { else { lput.sw = 1; lput.fg = 0x0f; - lput.bg = 0x0f; + lput.bg = 0; } } return(putsub(lio, &lput)); @@ -497,31 +589,56 @@ REG8 lio_gput1(LIOWORK lio) { // ---- GPUT2 -REG8 lio_gput2(LIOWORK lio) { +REG8 lio_gput2(GLIO lio) { GPUT2 dat; LIOPUT lput; UINT16 jis; + int pat; REG16 size; - lio_updaterange(lio); - i286_memstr_read(CPU_DS, CPU_BX, &dat, sizeof(dat)); + lio_updatedraw(lio); + MEML_READSTR(CPU_DS, CPU_BX, &dat, sizeof(dat)); lput.x = (SINT16)LOADINTELWORD(dat.x); lput.y = (SINT16)LOADINTELWORD(dat.y); + lput.off = 0x104e; + lput.seg = CPU_DS; jis = LOADINTELWORD(dat.chr); - if (jis & 0xff00) { - lput.off = 0x104e; - lput.seg = CPU_DS; - if (jis < 0x200) { // 1/4ANK + pat = 0; + if (jis < 0x200) { + if (jis < 0x80) { + if (jis == 0x7c) { + pat = 1; + } + else if (jis == 0x7e) { + pat = 2; + } + else { + jis += 0x2900; + } + } + else if (jis < 0x100) { + if ((jis - 0x20) & 0x40) { + pat = (jis & 0x3f) + 3; + } + else { + jis += 0x2980; + } + } + else { jis &= 0xff; } + } + if (!pat) { size = bios0x18_14(lput.seg, 0x104c, jis); - lput.width = (size & 0xff00) >> (8 - 3); - lput.height = (size & 0xff) << 3; } else { - return(0); + MEML_WRITESTR(lput.seg, lput.off, mem + (LIO_SEGMENT << 4) + + LIO_FONT + ((pat - 1) << 4), 0x10); + size = 0x0102; } + lput.width = (size & 0xff00) >> (8 - 3); + lput.height = (size & 0xff) << 3; lput.mode = dat.mode; lput.sw = 0; if (dat.colorsw) { @@ -529,8 +646,8 @@ REG8 lio_gput2(LIOWORK lio) { lput.bg = dat.bg; } else { - lput.fg = lio->gcolor1.fgcolor; - lput.bg = lio->gcolor1.bgcolor; + lput.fg = lio->work.fgcolor; + lput.bg = lio->work.bgcolor; } return(putsub(lio, &lput)); }