/* !RunImage.c
Provides a demo of TMT at work
by N. Douglas
Started: 30-11-1996
Last updated: ?

Requires TMTMod to be linked in with it as this provides the Win32 thunking
layer
*/

#include "TMTMod.h"
#include "kernel.h"

static BOOL quit=FALSE;
static char indir[256];
static char templ[256];
static char menus[256];

int codeshandler(int, int);
/*void CreateNewWindow(void);*/

int main(void)
{
  ROINITIALISEBLK blk;
  char taskname[]="TMT Demo";
  char q[256];
  _kernel_swi_regs r;
  int icbarh;

  blk.rovers=200;
  blk.wimpvers=200;
  blk.tnvers=010;
  blk.taskname=taskname;
  blk.handler=(function) codeshandler;

  ROInitialise(&blk);

  /* Now we're being preempted */

  /* Load some templates */
  {
    const char templatenm[]="<TMTDemo$Dir>.Templates";
    const char main[]="main";

    r.r[1]=(int) templatenm;
    _kernel_swi(0x400d9/*Wimp_OpenTemplate*/, &r, &r);

    r.r[1]=(int) templ;
    r.r[2]=(int) indir;
    r.r[3]=(int) indir+256;
    r.r[4]=-1;
    r.r[5]=(int) main;
    r.r[6]=0;
    _kernel_swi(0x400db/*Wimp_LoadTemplate*/, &r, &r);

    _kernel_swi(0x400da/*Wimp_CloseTemplate*/, &r, &r);
  }

  /* Put an icon on the icbar */
  {
    const char icname[]="!tmtdemo";

    *(int *)(q+0)=-1;
    *(int *)(q+4)=0;
    *(int *)(q+8)=0;
    *(int *)(q+12)=68;
    *(int *)(q+16)=68;
    *(int *)(q+20)=0x1700301a;
    *(int *)(q+24)=*(int *) (icname+0);
    *(int *)(q+28)=*(int *) (icname+4);
    *(int *)(q+32)=*(int *) (icname+8);
    r.r[1]=(int) q;
    _kernel_swi(0x400c2/*Wimp_CreateIcon*/, &r, &r);
    icbarh=r.r[0];
  }

  /*CreateNewWindow();*/

  /* Enter main message loop */
  do
  {
    r.r[1]=(int) q;
    _kernel_swi(Tornado_Poll, &r, &r);
    switch(r.r[0])
    {
      case 0:
      /* Do nothing */
      break;
      case 6:
      if((*(int *)(q+8) & 2)==2)
      {
        const char quit[]="Quit";

        /*Open a quit menu */
        *(int *)(menus+0)=*(int *)(taskname+0);
        *(int *)(menus+4)=*(int *)(taskname+4);
        *(int *)(menus+8)=*(int *)(taskname+8);
        *(char *)(menus+12)=7;
        *(char *)(menus+13)=2;
        *(char *)(menus+14)=7;
        *(char *)(menus+15)=0;
        *(int *)(menus+16)=70;
        *(int *)(menus+20)=44;
        *(int *)(menus+24)=0;
        *(int *)(menus+28)=0x80;
        *(int *)(menus+32)=-1;
        *(int *)(menus+36)=0x7005031;
        *(int *)(menus+40)=*(int *)(quit+0);
        *(int *)(menus+44)=*(int *)(quit+4);
        *(int *)(menus+48)=*(int *)(quit+8);
        r.r[1]=(int) menus;
        r.r[2]=(*(int *)(q+0))-64;
        r.r[3]=96+48;
        _kernel_swi(0x400d4/*Wimp_CreateMenu*/, &r, &r);
      }
      else
      {
        _kernel_swi(0x107, &r, &r);
      }
      break;
      case 9:
      if((*(int *)(q+0))==0)
        quit=TRUE;
      break;
      default:
      break;
    }
  }
  while(!quit);

  /* Shut her down */
  ROClosedown(blk.taskh);

  return 0;
}

int codeshandler(int msgno, int msgblk)
{
  switch(*(int *) (msgblk+16))
  {
    case 0:
    quit=TRUE;
    return MSG_HANDLED;
    default:
    return MSG_PASSON;
  }
}

#if 0
void CreateNewWindow(void)
{
  char q[256];
  int windh;
  _kernel_swi_regs r;
  int *sp;
  const char spname[]="sprite";

  sp=malloc(320*256+1024);
  *(sp+0)=320*256+1024;
  *(sp+8)=16;
  r.r[0]=9;
  r.r[1]=(int) sp;
  _kernel_swi(0x2e/*OS_SpriteOp*/, &r, &r);
  r.r[0]=256+15;
  r.r[2]=(int) spname;
  r.r[3]=0;
  r.r[4]=320;
  r.r[5]=256;
  r.r[6]=20;
  _kernel_swi(0x2e, &r, &r);

  {
    _kernel_swi_regs r2;

    r2.r[0]=256+60;
    r2.r[1]=(int) sp;
    r2.r[2]=(int) spname;
    r2.r[3]=0;
    _kernel_swi(0x2e, &r, &r);

    r.r[0]=


  r.r[1]=(int) templ;
  _kernel_swi(0x400c1/*Wimp_CreateWindow*/, &r, &r);
  windh=r.r[0];

  *(sp+0)=
#endif
