home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 160.lha / asctiny.c < prev    next >
C/C++ Source or Header  |  1988-04-27  |  3KB  |  165 lines

  1. #include <exec/types.h>
  2. #include <exec/execbase.h>
  3. #include <graphics/gfxbase.h>
  4. #include <intuition/intuition.h>
  5.  
  6. IMPORT struct ExecBase *SysBase;
  7.  
  8. extern long _savsp, _stkbase;
  9.  
  10. struct GfxBase *GfxBase = NULL;
  11. struct IntuitionBase *IntuitionBase = NULL;
  12. struct Window *Window = NULL;
  13. struct RastPort *RP;
  14.  
  15. UBYTE HexDigits[] = "0123456789ABCDEF";
  16.  
  17. UBYTE ASCIITop = 0;
  18. UBYTE InActive = 1;
  19. UBYTE TinyMode = 0xff;
  20.  
  21. _main()
  22. {
  23.  VOID Wait(), ReplyMsg(), *OpenLibrary(), *OpenWindow();
  24.  char tst;
  25.  struct NewWindow nw;
  26.  struct IntuiMessage *msg, *GetMsg();
  27.  
  28.  _stkbase = _savsp - *((long *)_savsp+1) + 8;
  29.  *(long *)_stkbase = 0x4d414e58L;
  30.  
  31.  if (!(GfxBase = OpenLibrary("graphics.library", 0L))) CleanUp();
  32.  if (!(IntuitionBase = OpenLibrary("intuition.library", 0L))) CleanUp();
  33.  nw.LeftEdge = 0; /* 557; */
  34.  nw.TopEdge = 0;
  35.  nw.Width = 83;
  36.  nw.Height = 10;
  37.  nw.DetailPen = -1;
  38.  nw.BlockPen = -1;
  39.  nw.IDCMPFlags = RAWKEY | REFRESHWINDOW | ACTIVEWINDOW | INACTIVEWINDOW;
  40.  nw.Flags = WINDOWDRAG | WINDOWDEPTH | SIMPLE_REFRESH;
  41.  nw.FirstGadget = NULL;
  42.  nw.CheckMark = NULL;
  43.  nw.Title = NULL;
  44.  nw.Type = WBENCHSCREEN;
  45.  if (!(Window = OpenWindow(&nw))) CleanUp();
  46.  RP = Window->RPort;
  47.  SetAPen(RP, 1L);
  48.  SetDrMd(RP, JAM2);
  49.  FOREVER {
  50.   Wait(1L << Window->UserPort->mp_SigBit);
  51.   while (msg = GetMsg(Window->UserPort)) {
  52.    ULONG class;
  53.    UWORD code;
  54.    class = msg->Class;
  55.    code = msg->Code;
  56.    ReplyMsg(msg);
  57.    switch (class) {
  58.    case REFRESHWINDOW:
  59.     ListASCII();
  60.     break;
  61.    case ACTIVEWINDOW:
  62.     InActive = 0;
  63.     if (TinyMode) SizeWindow(Window, 0L, 131L);
  64.     break;
  65.    case INACTIVEWINDOW:
  66.     InActive = 1;
  67.     if (TinyMode) SizeWindow(Window, 0L, -131L);
  68.    case RAWKEY:
  69.     tst = 1;
  70.     switch (code) {
  71.     case 0x45: /* ESC */
  72.      CleanUp();
  73.      break;
  74.     case 0x46: /* DEL */
  75.      TinyMode = ~TinyMode;
  76.      break;
  77.     case 0x4c: /* Up Arrow */
  78.      ASCIITop--;
  79.      break;
  80.     case 0x4d: /* Down Arrow */
  81.      ASCIITop++;
  82.      break;
  83.     case 0x4e: /* Right Arrow */
  84.      ASCIITop += 16;
  85.      break;
  86.     case 0x4f: /* Left Arrow */
  87.      ASCIITop -= 16;
  88.      break;
  89.     default:
  90.      tst = 0;
  91.      break;
  92.     }
  93.     if (tst) ListASCII();
  94.     break;
  95.    } /* switch */
  96.   } /* while */
  97.  } /* FOREVER */
  98. }
  99. ListASCII()
  100. {
  101.  UBYTE i, j;
  102.  UBYTE sbuff[4];
  103.  
  104.  if (InActive && TinyMode)
  105.   return;
  106.  for (i = 17, j = ASCIITop; i < 145; i += 8, j++) {
  107.   DecToString(sbuff, j);
  108.   Move(RP, 5L, (long)i);
  109.   Text(RP, sbuff, 3L);
  110.   Move(RP, 37L, (long)i);
  111.   Text(RP, "$", 1L);
  112.    sbuff[1] = HexDigits[j & 0x0f];
  113.    sbuff[0] = HexDigits[j >> 4];
  114.   Text(RP, sbuff, 2L);
  115.   Move(RP, 69L, (long)i);
  116.   Text(RP, &j, 1L);
  117.  }
  118. }
  119.  
  120. DecToString(buf, val)
  121. UBYTE *buf;
  122. UBYTE val;
  123. {
  124.     UBYTE i;
  125.     UBYTE c, hitval;
  126.     UBYTE temp, value;
  127.     UBYTE divider;
  128.  
  129.     value = val;
  130.     i = 0;
  131.     hitval = 0;
  132.     divider = 100;
  133.     while (divider != 1) {
  134.         temp = value / divider;
  135.         value %= divider;
  136.         c = (UBYTE)temp + 0x30;
  137.         if (c != 0x30)
  138.             hitval = 1;
  139.         if (hitval == 0 && c == 0x30)
  140.             buf[i] = 0x20;
  141.         else
  142.             buf[i] = c;
  143.         i++;
  144.         divider /= 10;
  145.     }
  146.     buf[2] = (val % 10) + 0x30;
  147. }
  148.  
  149. CleanUp()
  150. {
  151.  VOID CloseWindow(), CloseLibrary();
  152.  if (Window) CloseWindow(Window);
  153.  if (IntuitionBase) CloseLibrary(IntuitionBase);
  154.  if (GfxBase) CloseLibrary(GfxBase);
  155.  
  156.     {
  157. #asm
  158.         moveq.l    #0,d0
  159.         move.l    __savsp#,sp        ;get back original stack pointer
  160.         rts                        ;and exit
  161. #endasm
  162.     }
  163. }
  164.  
  165.