#include "compiler.h"
#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);
}
RetroPC.NET-CVS <cvs@retropc.net>