/*
  MemoryViewer.c
  Aufruf mit DICE: dcc MemoryViewer.c -o MemoryViewer
                   MemoryViewer
*/
#include <intuition/intuitionbase.h>
#include <graphics/gfxbase.h>
#include <graphics/view.h>
#include <graphics/rastport.h>
#include <hardware/custom.h>
#include <hardware/cia.h>
#define custom (*((struct Custom *)0xdff000))
#define ciaa (*((struct CIA *)0xbfe001))
#define MOD(a,b) (a-a/b*b)
struct IntuitionBase *IntuitionBase;
struct GfxBase *GfxBase;
struct ViewPort *ViewPort;
PLANEPTR OldPlanes[4];

void main()
{
 struct BitMap *BitMap;
 USHORT i,width,joydat,button;
 GfxBase=(struct GfxBase *)OpenLibrary("graphics.library",0);
	/* Libraries öffnen */
 IntuitionBase=(struct IntuitionBase *)OpenLibrary("intuition.library",0);
 ViewPort=(struct ViewPort *)ViewPortAddress(IntuitionBase->ActiveWindow);
	/* BitMap des Screens ermitteln */
 BitMap=ViewPort->RasInfo->BitMap;
 for (i=0;i<4;i++) OldPlanes[i]=ViewPort->RasInfo->BitMap->Planes[i];
	/* Adressen der ursprünglichen Bitplanes sichern */
 if (MOD(ViewPort->DWidth,16)) width=(ViewPort->DWidth/16+1)*4;
  else width=ViewPort->DWidth/4;/* Breite der Planes in Bytes bestimmen */
 Forbid();			/* nicht mehr in Planes schreiben */
 do
 {
  joydat=custom.joy1dat;	/* Datenregister für Joystick 1 auslesen */
  if (joydat&2)			/* Bewegung nach rechts ? */
  {
   ViewPort->DxOffset++;	/* Viewport um einen Pixel verschieben */
   if (ViewPort->DxOffset==16)	/* beim nächsten Datenwort Adresse der Planes */
   {				/* ändern */
    for (i=0;i<4;i++) BitMap->Planes[i]-=2;
    ViewPort->DxOffset=0;
   }
  }
  if (joydat&512)		/* Bewegung nach links ? */
  {  
   ViewPort->DxOffset--;
   if (ViewPort->DxOffset==-16)
   {
    ViewPort->DxOffset=0;
    for (i=0;i<4;i++) BitMap->Planes[i]+=2;
   }
  }
  if (((joydat&1)==1)^((custom.joy1dat&2)==2))	/* Bewegung nach unten */
   for (i=0;i<4;i++) ViewPort->RasInfo->BitMap->Planes[i]-=width;
  if (((joydat&256)==256)^((joydat&512)==512))	/* Bewegung nach oben */
   for (i=0;i<4;i++) ViewPort->RasInfo->BitMap->Planes[i]+=width;
  ScrollVPort(ViewPort);			/* Viewport neu darstellen */
  button=ciaa.ciapra;
 } while (button&CIAF_GAMEPORT1);		/* Feuerknopf ? */
 for (i=0;i<4;i++) ViewPort->RasInfo->BitMap->Planes[i]=OldPlanes[i];
	/* Ausgangszustand wieder herstellen */
 ViewPort->DxOffset=0;
 ViewPort->DyOffset=0;
 ScrollVPort(ViewPort);
 Permit();
} 
