--- np2/lio/gput1.c 2004/02/20 16:20:41 1.6 +++ np2/lio/gput1.c 2004/06/04 13:01:31 1.13 @@ -5,6 +5,7 @@ #include "bios.h" #include "lio.h" #include "vram.h" +#include "liofont.res" typedef struct { @@ -57,6 +58,14 @@ typedef struct { UINT addr; UINT sft; UINT width; + UINT8 mask; +} GETCNTX; + +typedef struct { + BYTE *baseptr; + UINT addr; + UINT sft; + UINT width; UINT8 maskl; UINT8 maskr; UINT8 masklr; @@ -64,21 +73,19 @@ typedef struct { BYTE pat[84]; } PUTCNTX; -#if 0 -static void getvram(const PUTCNTX *pt) { + +static void getvram(const GETCNTX *gt, BYTE *dst) { BYTE *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) { @@ -86,12 +93,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) { @@ -316,10 +322,9 @@ const BYTE *src; // ---- -static REG8 putsub(LIOWORK lio, const LIOPUT *lput) { +static REG8 putsub(GLIO lio, const LIOPUT *lput) { UINT addr; - UINT8 sbit; PUTCNTX pt; UINT datacnt; UINT off; @@ -328,10 +333,10 @@ static REG8 putsub(LIOWORK lio, const LI 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)) { @@ -339,18 +344,12 @@ static REG8 putsub(LIOWORK lio, const LI } 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); @@ -360,31 +359,32 @@ static REG8 putsub(LIOWORK lio, const LI datacnt = (lput->width + 7) >> 3; off = 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(("mode = %d [%.x]", lput->mode, flag)); - // さて表示。 writecnt = 0; - 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; + 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 { @@ -394,13 +394,13 @@ static REG8 putsub(LIOWORK lio, const LI 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 { @@ -410,46 +410,45 @@ static REG8 putsub(LIOWORK lio, const LI 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))) { + if (!(flag & (8 << 4))) { putandn(&pt); writecnt++; } - if (!(flag & (1 << 8))) { + 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); } @@ -457,36 +456,107 @@ static REG8 putsub(LIOWORK lio, const LI // ---- GGET -REG8 lio_gget(LIOWORK lio) { +REG8 lio_gget(GLIO 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; + BYTE pat[84]; + UINT pl; - 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)); + 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); @@ -498,8 +568,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 { @@ -511,7 +581,7 @@ REG8 lio_gput1(LIOWORK lio) { else { lput.sw = 1; lput.fg = 0x0f; - lput.bg = 0x0f; + lput.bg = 0; } } return(putsub(lio, &lput)); @@ -520,15 +590,15 @@ REG8 lio_gput1(LIOWORK lio) { // ---- GPUT2 -REG8 lio_gput2(LIOWORK lio) { +REG8 lio_gput2(GLIO lio) { GPUT2 dat; LIOPUT lput; UINT16 jis; 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); jis = LOADINTELWORD(dat.chr); @@ -552,8 +622,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)); }