#include	<stdarg.h>
#include	<stdio.h>
#include	"display.h"

static int	font_y = 16;

int	DSP_fontSize(int x, int y)
{
    int	EGB_textZoom(char *, int, int, int);

    font_y = y;
    EGB_textZoom(DSP_work.EGB, 0, x / 2, y);
    EGB_textZoom(DSP_work.EGB, 1, x, y);
}

/*
  文字列を画面に表示
*/
int	DSP_putSjis(int x, int y, char *s)
{
    int	EGB_sjisString(char *, char *);
    int EGB_paintMode(char *, int);
    char para[300];
    int	len;
    
    if((len = strlen(s)) > 0) {
	EGB_paintMode(DSP_work.EGB, 0x22);
	WORD(para) = x;
	WORD(para + 2) = y + font_y - 1;
	WORD(para + 4) = len;
	memcpy(para + 6, s, len);
	EGB_sjisString(DSP_work.EGB, para);
    }
}

void    DSP_msg(char *str, const point_t * p,
	           const int font, const int forcol, const int bakcol)
{
    DSP_fontStyle(font);
    DSP_color(forcol, bakcol);
    DSP_putSjis(p->x, p->y, str);
}

void    DSP_gprintf(const point_t * p, const char *fmt,...)
{
    char    buf[256];
    va_list ap;

    va_start(ap, fmt);
    vsprintf(buf, fmt, ap);
    DSP_putSjis(p->x, p->y, buf);
    va_end(ap);
}

int	DSP_getWritePage(void)
{
    int	ret;
    
    asm("
	movl	$0, %%cx
	movb	$0x02, %%ah
	push	$0x0110
	pop	%%fs
	lcall	%%fs:(0x01c0)
	movl	%%eax, %0
    " : "=g"(ret): : "cx", "ax");
    
    return ret;
}

int	getds(void)
{
    unsigned short int ds;

    asm("movw	%%ds, %0": "=g"(ds));
    
    return ds;
}

int	DSP_viewport(box_t *b)
{
    signed short int param[4] = {b->x, b->y, b->mx, b->my};
    
    EGB_viewport(DSP_work.EGB, param);
    
    return 0;
}

void	DSP_getResolution(int *p0, int *p1)
{
    int	page0 = 0, page1 = 0;

    asm("
	movb	$0x01, %%ah
	push	$0x0110
	pop	%%fs
	lcall	%%fs:(0x01c0)
	movzbl	%%al, %%ecx
	movl	%%ecx, %0
	movzbl	%%ah, %%ecx
	movl	%%ecx, %1
    ": "=g"(page0), "=g"(page1): : "ax", "cx");
    
    if(p0 != NULL) *p0 = page0;
    if(p1 != NULL) *p1 = page1; 
}

int	DSP_getPalette(int page, void *pal)
{
    asm("
	movl	%0, %%eax
	movl	%1, %%edx
	push	$0x0110
	pop	%%fs
	lcall	%%fs:(0x01c0)
    ":: "g"(page), "g"(pal): "ax", "dx");

    return 0;
}

int	DSP_pic_size(int color, int x, int y)
{
    switch(color) {
    case 2:
	x = ((x + 7) / 8) * 8;
	return x * y / 8;
    case 16:
	x = ((x + 7) / 8) * 8;
	return x * y / 2;
    case 256:
	return x * y;
    case 32768:
    case 32000:
	return x * y * 2;
    }
    return 0;
}
