
#include "grp3.h"
#define XSIZE 320

int SPR_init(void);
int SPR_display(int, int);
int SPR_define(int, int, int, int, char *);
int SPR_setPosition(int, int, int, int, int, int);
int SPR_setAttribute(int, int, int, int, int);
int SPR_setMotion(int, int, int, int, int);
int SPR_setOffset(int, int);

struct spch {
    int hsize;
    int vsize;
}

sp_set[1023];

int U_sp_char = 0;
int U_set = 0;
unsigned short int *spbuf;

void sprite_screen(char *data)
{
    int i;

    spbuf = (unsigned short int *) data;

    graphix();
    screen(1, 5);
    screen(0, 10);

    /* page 0 : 320*240 32768 */
    wpage(0);
    zoom(2, 2);
    width(256, 240);
    view(0, 0, 511, 255);
    sposition((320 - 256) / 2, 0);
    color(0x8000);
    paint_color(0x8000);
    paint_mode(0x22);
    box(0, 0, 511, 255);

    /*page 1 : sprite */
    wpage(1);
    zoom(2, 2);
    width(256, 240);
    view(0, 0, 255, 255);
    sposition((320 - 256) / 2, 0);
    scroll(0, 2);

    wpage(0);
    SPR_init();
    for (i = 0; i < 1024; i++) {
        SPR_setPosition(0, i, 1, 1, 0, 258);
    }
}

int spset(int x, int y, int h, int v)
{
    int a = 0, b, i, j, k, l;
    unsigned short spp[65535];

    if (h < 1 || h > 16 || v < 1 || v > 16) {
        return -1;
    }
    if (U_sp_char + h * v > 223) {
        return -1;
    }
    for (j = 0; j < v; j++) {
        for (i = 0; i < h; i++) {

            for (k = 0; k < 16; k++) {
                for (l = 0; l < 16; l++) {
                    spp[a * 256 + l * 16 + k]
                        = spbuf[((y + j) * 16 + l) * XSIZE
                                + (x + i) * 16 + k];
                }
            }
            a++;
        }
    }

    for (i = 0; i < h * v * 256; i++) {
        if (spp[i] == 0) {
            spp[i] = 0x8000;
        }
    }

    SPR_define(1, 128 + U_sp_char * 4, h, v, (char *) spp);

    b = U_sp_char;
    sp_set[b].hsize = h;
    sp_set[b].vsize = v;
    U_sp_char += a;
    return b;
}

void spput(int sc, int pt, int x, int y, int of)
{
    int h, v;
    h = sp_set[pt].hsize;
    v = sp_set[pt].vsize;
    SPR_setAttribute(1023 - sc - h * v + 1, h, v, (128 + pt * 4) | (of << 15), 0);
    SPR_setPosition(0, 1023 - sc - h * v + 1, h, v, x, y + 2);
}

void sprite_on(int max)
{
    SPR_display(1, max);
}

void sprite_off(int max)
{
    SPR_display(0, max);
}

void sprite_wait(int max)
{
    SPR_display(2, max);
}

void spoffset(int x, int y)
{
    SPR_setOffset(x, y);
}

void dotscroll(int x)
{
    /* wpage : 0 */
    sposition(32 - (x & 1), 0);
    flame_address(0, (x >> 1));
}

void makechip(unsigned short c[], unsigned short pt[], int ysize)
{
    int i, j, k, l, a, d;
    a = 0;
    for (j = 0; j < ysize / 16; j++) {
        for (i = 0; i < XSIZE / 16; i++) {
            for (k = 0; k < 16; k++) {
                for (l = 0; l < 16; l++) {
                    d = pt[(j * 16 + l) * XSIZE + i * 16 + k];
                    if (d == 0) {
                        d = 0x8000;
                    }
                    c[a * 256 + l * 16 + k] = d;
                }
            }
            a++;
        }
    }
}

void putchip(unsigned short *c, unsigned int a, int x, int y)
{
    put_block((char *) (c + a * 256),
              x * 16, y * 16
              ,x * 16 + 15, y * 16 + 15,
              0, 0);
}

void chiptobit(short *bitmap, short *chip, short *data, int x, int y)
{
    int i, j, k, l;
    int a, d, h, v;

    for (j = 0; j < x; j++) {
        for (i = 0; i < y; i++) {
            a = data[j * y + i];
            h = (a % 20) * 16;
            v = (a / 20) * 16;
            for (l = 0; l < 16; l++) {
                for (k = 0; k < 16; k++) {
                    d = chip[(l + v) * 320 + (k + h)];
                    bitmap[(i * 16 + l) * (x * 16) + (j * 16 + k)] = d;
                }
            }
        }
    }
}
