#include <stdio.h>
#include <stdlib.h>
#include "kernel.h"
#include "swis.h"
#include "flux.h"

int buffer[512];
int vram;
/*==================================================================*/
static void fill_buffer(unsigned a, unsigned b, int stepa, int stepb)
{
        int i;
        for (i=0; i<512; i++)
        {
                int v = sin(a) + sin(b);
                buffer[i]= 128 + (v>>17);
                a += stepa;
                b += stepb;
        }
}
/*==================================================================*/
static void initialise(void)
{
        _kernel_swi_regs arm;
        int block[]={ 148, 150, -1};
        _kernel_swi(OS_WriteI + 22, &arm, &arm);
        _kernel_swi(OS_WriteI + 13, &arm, &arm);    /* select mode 13 */
        _kernel_swi(OS_RemoveCursors, &arm, &arm);
        _kernel_oscli("*pointer");
        arm.r[0] = (int)block;
        arm.r[1] = (int)block;
        _kernel_swi(OS_ReadVduVariables, &arm, &arm);
        vram = block[0];
        if (block[1] < 80*1024)
        {
                fprintf(stderr, "At least 80k screen memory needed\n");
                exit(1);
        }
}
/*==================================================================*/
static void incdec(int *p, int y, char *desc, int Default)
{
        _kernel_swi_regs arm;
        int mx,my,mb;
        _kernel_swi(OS_Mouse, &arm, &arm);
        mx = arm.r[0], my = arm.r[1], mb = arm.r[2];
        if (my/32==y)
        {
                switch (mb)
                {
                case 1: *p += 1;        /* ADJUST increases */
                        break;
                case 2: *p = Default;   /* MENU sets default value */
                        break;
                case 4: *p -= 1;        /* SELECT decreases */
                        break;
                }
        }
        _kernel_swi(OS_WriteI + 31, &arm, &arm);
        _kernel_swi(OS_WriteI + 0, &arm, &arm);
        _kernel_swi(OS_WriteI + 31-y, &arm, &arm);
        printf("%s:%d", desc, *p);
}
/*==================================================================*/
int main(void)
{
        int counter=0;
        int a=0, b=0;
        int sa=2, sb=3, da=3, db=6;
        int c=512, d=512;
        int sc=3, sd=2, dc=6, dd=3;

        initialise();
        while (!_kernel_escape_seen())
        {
                fill_buffer(a,b, da,db);
                a += sa, b += sb;

                draw_flux(c,d, dc,dd);
                c += sc, d += sd;

                mirror(vram);
                if (counter++ % 100==0) RemapRGB(vram);

                incdec(&sa, 8, "sa", 2);
                incdec(&sb, 7, "sb", 3);
                incdec(&da, 6, "da", 3);
                incdec(&db, 5, "db", 6);

                incdec(&sc, 3, "sc", 3);
                incdec(&sd, 2, "sd", 2);
                incdec(&dc, 1, "dc", 6);
                incdec(&dd, 0, "dd", 3);

                _kernel_osbyte(19,0,0);
        }
}
