--- np2/lio/gcircle.c 2004/06/03 13:35:28 1.1 +++ np2/lio/gcircle.c 2005/05/20 13:59:47 1.5 @@ -2,3 +2,91 @@ #include "cpucore.h" #include "lio.h" +typedef struct { + UINT8 cx[2]; + UINT8 cy[2]; + UINT8 rx[2]; + UINT8 ry[2]; + UINT8 pal; + UINT8 flag; + UINT8 sx[2]; + UINT8 sy[2]; + UINT8 ex[2]; + UINT8 ey[2]; + UINT8 pat; + UINT8 off[2]; + UINT8 seg[2]; +} GCIRCLE; + + +// ---- GCIRCLE + +static void draw4(const _GLIO *lio, SINT16 x, SINT16 y, + SINT16 d1, SINT16 d2, REG8 pal) { + + SINT16 x1; + SINT16 x2; + SINT16 y1; + SINT16 y2; + + x1 = x - d1; + x2 = x + d1; + y1 = y - d2; + y2 = y + d2; + lio_pset(lio, x1, y1, pal); + lio_pset(lio, x1, y2, pal); + lio_pset(lio, x2, y1, pal); + lio_pset(lio, x2, y2, pal); +} + +REG8 lio_gcircle(GLIO lio) { + + GCIRCLE dat; + SINT16 cx; + SINT16 cy; + SINT16 rx; + SINT16 ry; + REG8 pal; + SINT16 d1; + SINT16 d2; + SINT16 d3; + + lio_updatedraw(lio); + MEMR_READS(CPU_DS, CPU_BX, &dat, sizeof(dat)); + + // チェック + if (dat.flag & 0x7f) { + TRACEOUT(("LIO GCIRCLE not support flags: %.2x", dat.flag)); + } + cx = (SINT16)LOADINTELWORD(dat.cx); + cy = (SINT16)LOADINTELWORD(dat.cy); + rx = (SINT16)LOADINTELWORD(dat.rx); + ry = (SINT16)LOADINTELWORD(dat.ry); + pal = dat.pal; + if (pal == 0xff) { + pal = lio->work.fgcolor; + } + + if (rx != ry) { + TRACEOUT(("LIO GCIRCLE not support ellipse")); + return(LIO_SUCCESS); + } + + // 単純な円の描画 + d1 = 0; + d2 = ry; + d3 = 0 - ry; + while(d1 <= d2) { + draw4(lio, cx, cy, d1, d2, pal); + draw4(lio, cx, cy, d2, d1, pal); + lio->wait += 8 * (10 + 10 + 10); + d1++; + d3 += (d1 * 2) - 1; + if (d3 >= 0) { + d2--; + d3 -= d2 * 2; + } + } + return(LIO_SUCCESS); +} +