/* :ts=8 bk=0 * memview: A window into memory. * Jon would call this a parlor trick, too. * * Leo L. Schwab 8608.5 */ /* I shouldn't have to include graphics/copper.h myself */ #include #include #include #include #include #include #include #include #define REV 0L #define DEPTH 1L #define WIDTH 320L #define HEIGHT 200L #define ever (;;) extern void *OpenLibrary(), *AllocMem(), *GetColorMap(), *CreateStdIO(), *CreatePort(); extern long OpenDevice(), DoIO(); struct GamePortTrigger gpt = { GPTF_UPKEYS | GPTF_DOWNKEYS, 0, 1, 1 }; UWORD colors[] = { 0, 0xfff }; struct View v, *oldview; struct ViewPort vp; struct ColorMap *cm; struct RasInfo ri; struct BitMap *bm; struct GfxBase *GfxBase; struct InputEvent joyreport; struct IOStdReq *gameio; struct MsgPort *gameport; main () { int inc = 40, lx; openstuff (); makescreen (); /* NOT Intuition call */ initjoystick (); SendIO (gameio); for ever { WaitIO (gameio); if (joyreport.ie_Code == IECODE_LBUTTON) /* Fire button pressed; exit program */ break; if (joyreport.ie_X != lx) { lx = joyreport.ie_X; if (joyreport.ie_X < 0) inc = 40; else if (joyreport.ie_X > 0) inc = 80; if (lx) remakedisp (inc); } if (joyreport.ie_Y) { if (joyreport.ie_Y > 0) bm -> Planes[0] += inc; else if (joyreport.ie_Y < 0) bm -> Planes[0] -= inc; WaitTOF (); ScrollVPort (&vp); } SendIO (gameio); } closeeverything (); } openstuff () { long err; if (!(GfxBase = OpenLibrary ("graphics.library", REV))) die ("Art shop closed.\n"); if (!(gameport = CreatePort (0L, 0L))) die ("Can't make msgport.\n"); if (!(gameio = CreateStdIO (gameport))) die ("Can't make IO packet.\n"); if (err = OpenDevice ("gameport.device", 1L, gameio, 0L)) die ("Games closed.\n"); if (!(bm = AllocMem ((long) sizeof (*bm), MEMF_CHIP | MEMF_CLEAR))) die ("Can't allocate BitMap.\n"); } makescreen () { InitView (&v); InitVPort (&vp); InitBitMap (bm, DEPTH, WIDTH, HEIGHT); v.ViewPort = &vp; ri.BitMap = bm; ri.RxOffset = ri.RyOffset = ri.Next = NULL; vp.DWidth = WIDTH; vp.DHeight = HEIGHT; vp.RasInfo = &ri; vp.ColorMap = GetColorMap (2L); bm -> Planes[0] = NULL; /* Start looking at address 0 */ MakeVPort (&v, &vp); MrgCop (&v); LoadRGB4 (&vp, colors, 2L); oldview = GfxBase -> ActiView; LoadView (&v); } closeeverything () { register int i; if (oldview) { LoadView (oldview); WaitTOF (); /* Make sure copper is using old view */ FreeVPortCopLists (&vp); FreeCprList (v.LOFCprList); } if (vp.ColorMap) FreeColorMap (vp.ColorMap); if (bm) FreeMem (bm, (long) sizeof (*bm)); if (gameio) { if (gameio -> io_Device) CloseDevice (gameio); DeleteStdIO (gameio); } if (gameport) DeletePort (gameport); if (GfxBase) CloseLibrary (GfxBase); } die (str) char *str; { puts (str); closeeverything (); exit (100); } initjoystick () { UBYTE type = GPCT_RELJOYSTICK; gameio -> io_Command = GPD_SETCTYPE; gameio -> io_Length = 1; gameio -> io_Data = &type; if (DoIO (gameio)) die ("Error in setting controller type.\n"); gameio -> io_Command = GPD_SETTRIGGER; gameio -> io_Length = sizeof (gpt); gameio -> io_Data = &gpt; if (DoIO (gameio)) die ("Error in setting trigger values.\n"); gameio -> io_Command = GPD_READEVENT; gameio -> io_Length = sizeof (joyreport); gameio -> io_Data = &joyreport; } remakedisp (line) int line; { void *sav1, *sav2; LoadView (oldview); WaitTOF (); /* Make sure copper is using old view */ FreeVPortCopLists (&vp); FreeCprList (v.LOFCprList); sav1 = bm -> Planes[0]; sav2 = vp.ColorMap; InitView (&v); InitVPort (&vp); v.ViewPort = &vp; vp.DHeight = HEIGHT; vp.RasInfo = &ri; vp.ColorMap = sav2; if (line == 80) { InitBitMap (bm, DEPTH, WIDTH+WIDTH, HEIGHT); vp.Modes |= HIRES; vp.DWidth = WIDTH + WIDTH; } else { InitBitMap (bm, DEPTH, WIDTH, HEIGHT); vp.Modes &= ~HIRES; vp.DWidth = WIDTH; } bm -> Planes[0] = sav1; MakeVPort (&v, &vp); MrgCop (&v); LoadRGB4 (&vp, colors, 2L); oldview = GfxBase -> ActiView; LoadView (&v); }