home *** CD-ROM | disk | FTP | other *** search
/ The Fred Fish Collection 1.5 / ffcollection-1-5-1992-11.iso / ff_disks / 200-299 / ff298.lzh / DClock / DClock-Handler.c < prev    next >
C/C++ Source or Header  |  1989-12-29  |  50KB  |  1,641 lines

  1. /* DClock-Handler.c *********************************************************
  2. *
  3. *    DClock-Handler --------    Dumb clock main handler routine,
  4. *                displays clock data and handles
  5. *                DisplayBeep.
  6. *
  7. *                Copy DClock-Handler to L:
  8. *                DClock will expect it there.
  9. *
  10. *    Author ----------------    Olaf 'Olsen' Barthel, ED Hannover
  11. *                Brabeckstrasse 35
  12. *                D-3000 Hannover 71
  13. *
  14. *                Federal Republic of Germany
  15. *
  16. *    This program truly is in the PUBLIC DOMAIN. Written on a cold
  17. *    and damp September evening, hoping the next morning would  be
  18. *    better.
  19. *
  20. *    Compiled using Aztec C 3.6a, CygnusEd Professional & ARexx.
  21. *
  22. ****************************************************************************/
  23.  
  24. #include "DClock.h"
  25.  
  26. #define SIG_CLICK SIGBREAKF_CTRL_C
  27. #define SIG_CLOSE SIGBREAKF_CTRL_D
  28. #define SIG_TIMER SIGBREAKF_CTRL_E
  29. #define SIG_TOGGL SIGBREAKF_CTRL_F
  30.  
  31.     /* Some global data. */
  32.  
  33. struct IntuitionBase    *IntuitionBase;
  34. struct GfxBase        *GfxBase;
  35. struct Window        *Window;
  36. struct DSeg        *DSeg;
  37. extern struct ExecBase    *SysBase;
  38.  
  39.     /* Default font for clock text. */
  40.  
  41. struct TextAttr DefaultFont =
  42. {
  43.     (UBYTE *)"topaz.font",
  44.     8,
  45.     FS_NORMAL,
  46.     FPF_ROMFONT
  47. };
  48.  
  49.     /* IntuiText to print clock text. */
  50.  
  51. struct IntuiText TimeString =
  52. {
  53.     0,1,
  54.     JAM2,
  55.     0,0,
  56.     (struct TextAttr *)&DefaultFont,
  57.     (UBYTE *)NULL,
  58.     (struct IntuiText *)NULL
  59. };
  60.  
  61. struct NewWindow NewWindow =
  62. {
  63.     409,1,
  64.     176,8,
  65.     0,1,
  66.     MOUSEBUTTONS,
  67.     BORDERLESS | BACKDROP | RMBTRAP,
  68.     (struct Gadget *)NULL,
  69.     (struct Image *)NULL,
  70.     (STRPTR)NULL,
  71.     (struct Screen *)NULL,
  72.     (struct BitMap *)NULL,
  73.     0,0,
  74.     0,0,
  75.     WBENCHSCREEN
  76. };
  77.  
  78.     /* Some static imagery. */
  79.  
  80. USHORT MapF[16] =
  81. {
  82.     0x0000,0x3FC0,0x3000,0x3FC0,0x3000,0x3000,0x3000,0x0000,
  83.     0xFFF0,0xC030,0xCFF0,0xC030,0xCFF0,0xCFF0,0xCFF0,0xFFF0
  84. };
  85.  
  86. USHORT MapE[16] =
  87. {
  88.     0x0000,0x3FC0,0x3000,0x3FC0,0x3000,0x3000,0x3FC0,0x0000,
  89.     0xFFF0,0xC030,0xCFF0,0xC030,0xCFF0,0xCFF0,0xC030,0xFFF0
  90. };
  91.  
  92. struct Image ImageF =
  93. {
  94.     164,0,
  95.     12,8,2,
  96.     (USHORT *)MapF,
  97.     0x03,0x00,
  98.     (struct Image *)NULL
  99. };
  100.  
  101. struct Image ImageE =
  102. {
  103.     0,0,
  104.     12,8,2,
  105.     (USHORT *)MapE,
  106.     0x03,0x00,
  107.     (struct Image *)&ImageF
  108. };
  109.  
  110.     /* Here comes the click data. */
  111.  
  112. #define LEFT0F  1
  113. #define RIGHT0F  2
  114. #define RIGHT1F  4
  115. #define LEFT1F  8
  116.  
  117. UBYTE AnyChannel[4] =
  118. {
  119.     LEFT0F,
  120.     LEFT1F,
  121.     RIGHT0F,
  122.     RIGHT1F,
  123. };
  124.  
  125.     /* Audio.device control structures. */
  126.  
  127. struct MsgPort        *AudioPort;
  128. struct IOAudio        *Audio;
  129.  
  130.     /* Input.device control structures. */
  131.  
  132. struct MsgPort        *InputDevPort;
  133. struct IOStdReq        *InputRequestBlock;
  134.  
  135.     /* The interrupt handler control. */
  136.  
  137. struct Interrupt    HandlerStuff;
  138.  
  139.     /* Console.device control structures. */
  140.  
  141. long            ConsoleDevice = NULL;
  142. struct IOStdReq        ConStdReq;
  143. struct InputEvent    CopyEvent;
  144.  
  145.     /* This noise was borrowed from Mike Oldfield's
  146.      * "Taurus 2". Sampled with AudioMaster, converted
  147.      * to 'C' sourcecode using a program of mine
  148.      * called "SaveSound".
  149.      */
  150.  
  151. ULONG SoundData[67] =
  152. {
  153.     0xFB0F190A,0xDDB9B4F1,0x377F651E,0xC4B4D323,0x3CEC3274,0x5B0AE2DD,
  154.     0xF105D8E2,0x1937561E,0x00E7DDDD,0xCE9BD3F6,0x0F2D1EEC,0xF1F1D8BE,
  155.     0xAAC4E2FB,0x192D3232,0x05F6DDCE,0xD3F6FB0F,0x234C3C1E,0x0AFBF6DD,
  156.     0xC4DDFB0F,0x1E282319,0x0AFBE2C4,0xD3E2F1F1,0xFB1E370A,0xE7F6F6E2,
  157.     0xC9C9D8FB,0x0FFBFBFB,0x0A05F1C9,0xC9F6F6E7,0xECFB1914,0xF1D8ECFB,
  158.     0xECD8D3DD,0xFB14F1DD,0xECFBF6E2,0xCEC9ECFB,0xE7D8E7FB,0xFBECD3D3,
  159.     0xF1F6E2D3,0xE2F600F6,0xE2E2FBFB,0xECE2E7F1,0xFBFBE7EC,0xFBFBF1EC,
  160.     0xE7F1FBF1,0xE7ECF6F6,0xF1E7ECFB,0xFBFBECE7,0xE7ECECE7,0xF6FBFBF6,
  161.     0xF6F6F6F6,0xF1F6F6F6,0xFBFBFBFB,0xFBFB05FB,0xFBFBFBFB,0xFBFB050A,
  162.     0x0505050A,0x0505FBFB,0xFBFBFBFB,0x0A0A0A05,0x05000505,0x05050505,
  163.     0x05050A0A,0x0A0A0505,0x05050005,0x05050A0A,0x0505050A,0x05050005,
  164.     0x05050505
  165. };
  166.  
  167.     /* Sound run-dump for the ringing alarm clock. Sampled with
  168.      * AudioMaster II, taken from the introduction to "Time"
  169.      * by Pink Floyd (album: "The Dark Side of the Moon").
  170.      */
  171.  
  172. ULONG RingData[1831] =
  173. {
  174.     0xAFA30D00,0x3FDF95D9,0x153D27CD,0xC1E7EFE9,0x3FF9B5DF,0xD73F1DBF,
  175.     0x95B7E12D,0x0DD1E9DB,0xDB4D0BF1,0xE7CF0F37,0x3FE5CFC5,0x17652FF1,
  176.     0xA9E7332D,0x00E1BFE9,0xFF150003,0x93D93F37,0x1FD7B5F1,0x3D17FFB9,
  177.     0xA9EF1D17,0x1FAFDBDF,0xFF1F15DF,0xB5D71F53,0xF9B5D9DF,0x2925CD03,
  178.     0xD7CFF155,0x1FD7BDE1,0x4D4DF7D1,0xBF0BFF0D,0x1FE9E7C7,0x1D1F1FBB,
  179.     0xB7093335,0x1FBDD1FF,0x2D3527E9,0xCB1DEF2F,0x09D7B7D9,0x1F371DE1,
  180.     0xB50B351D,0xD9E909EF,0x2DF129F9,0xB7CB333B,0xF7CFC1DF,0x39EFDDE9,
  181.     0xE1FFFF43,0xF10BCBE7,0x2F27FFDB,0xCFE10D3F,0xD9D1F10D,0x2D071FC1,
  182.     0xFFD9E937,0x29CFD1E7,0x252507AB,0xFD0DCB17,0x000BDFD7,0x07352DD9,
  183.     0xBB00090D,0xE10FD1E9,0x15DD3700,0xAFC5FF17,0x1DF7C1E1,0x27D539E9,
  184.     0xE5F3FF2B,0x0F0DE1DF,0xE9173500,0xE5C9F745,0xE700E5CF,0x05150000,
  185.     0x15ABE74B,0x1721CBC1,0x2D1523C7,0xDDD1EF15,0x0F1FB7D7,0xDBFF27D7,
  186.     0xC5E1E737,0x37F9ADF1,0xDF353BC1,0xE1EBEF00,0x1DE1BBD7,0xE13D43C9,
  187.     0xCFBF2535,0xFFF1C1E7,0xF11D0FF1,0xBFB73541,0x0F039FD3,0x212D2F00,
  188.     0xC5D9452F,0x2FF5B705,0xE7FF2D01,0x0FA71D1B,0x1307E90F,0xE90717FD,
  189.     0xE7B5E123,0x552700D1,0xBDFFEF00,0x0BDF2507,0x5707BFD5,0xC92B3329,
  190.     0xE5D5F1FF,0x1BB9C917,0xFF05D107,0xE1E7CF00,0x45FFBF9D,0xC523F7C7,
  191.     0xD1F11BDF,0x23E1E9CD,0xE7390D1D,0xF7C7E105,0x35E1C9F5,0x0D35E51F,
  192.     0xC1BFD5F3,0x0F17EFC1,0xEF211DD5,0xA5D10DF7,0x1FD900DB,0xCF173735,
  193.     0xEFDFD917,0x11CBD1C1,0xFD4BFF1F,0xE5E7D70D,0xE9130DBF,0xF30F313F,
  194.     0xBFC5133D,0x35DDF9C9,0x0DEF0023,0xDDCFEB27,0x2715B3AB,0xFF3F250D,
  195.     0xC100B73D,0x1FF1E1FF,0xFF1F5103,0xF3BFBB1F,0x4DE3D1C7,0x173529B1,
  196.     0xE1F7EF39,0x0F00C1B7,0xCD1F2703,0xBFD50B3D,0xFFE991BD,0x191D3F00,
  197.     0xD1C7EF07,0x2F11B9C7,0x1B2543CD,0xB1C91D4D,0x2B23E1EB,0xDF193F00,
  198.     0xBFBF0757,0x2507A5C9,0x1D4929E9,0xEDB3FF27,0x00F1BDBF,0x1B4B37E7,
  199.     0xC7A1FF3D,0x1BDDB1F5,0xFF3D0FD5,0xDFDBFF5B,0x43FDA7D1,0xF5613FC1,
  200.     0xE1F53D2F,0x19D1AFEF,0xFF3F47CB,0xC1CD333B,0x3DEBAB1D,0x153D07C1,
  201.     0xA9CF2D2B,0x27E59FFF,0xDF3F1BDB,0xADCD532F,0xEFB1A1EF,0x2D430FFD,
  202.     0xD3AD1D07,0x27C7ABFB,0x3F51E9CF,0xC1BF0D1B,0x2F03AFF9,0xF34FF9BF,
  203.     0xADDB393F,0x19C1B7E9,0xEF510FD1,0x0BFF3B00,0x1FA9CFCD,0xF55901C1,
  204.     0xADEB1F15,0x00E1EF1F,0xFF31E1F1,0x9BDF411F,0x33C1CFF1,0x1DFFFFE3,
  205.     0xB10D45FD,0x0FA5CFFF,0x2317131F,0xA715F92F,0xF9BFDB39,0x41E115FF,
  206.     0xF717CF39,0x00F1E90D,0x13B5C50B,0xFFF7D937,0x0BEF0001,0x00D3FFDB,
  207.     0x3713DBFF,0xEB230BEF,0x03C90017,0x2DE1FF07,0xDD15E1E1,0x21EFD9E1,
  208.     0x1907DFE1,0x074BF3D7,0xC9E11BDF,0xE7071311,0xBFFD0019,0xEBE743DD,
  209.     0x25FDE1E1,0xFFFFFBF5,0x0F0D1DC9,0x13DB0DF5,0xE1070B15,0xD1DF0F1F,
  210.     0xEFC7F113,0xD703C700,0xF1E7F300,0x2FE71DC3,0xE507EBDF,0xDBF117FF,
  211.     0xD9C917FF,0x1DEFE123,0xE7EFABE5,0x07EBDDE9,0x1FFBBF07,0xC31BFFEF,
  212.     0x27F125E1,0xF7D917FF,0xDD3D0F09,0xFFD700F7,0x1500E700,0x0F39D10F,
  213.     0xD911FFE7,0x0017EFE1,0xDFE5F11D,0xDB0033DB,0x1DBFBFF1,0x1BE7D1F9,
  214.     0xD12DEFD5,0xE90DF715,0xEF170DFF,0xBB13DB0F,0xFFEF0F07,0x3500DFE1,
  215.     0x1B1DEFF9,0x0BD71FDF,0xE9070DDB,0x0033001D,0xB9D923FF,0xEFEFDBE9,
  216.     0x15F1E907,0xE90D1DF1,0x2BDFEFB7,0xDF072DE7,0xE10F0F39,0x07C31315,
  217.     0xEF15E10F,0xDFEFE93F,0x13E519E9,0x1713FFE1,0xE7EB1519,0xE9D523D5,
  218.     0x27D31F1F,0xFFF7E929,0xE5EFD109,0x2FEBDD07,0xCF07F7FF,0x001BCFEF,
  219.     0x09B50DD5,0xDF001301,0x19F7D1FF,0x17BFE3CF,0x0F31DFE1,0xD92BC9FF,
  220.     0xF9130BD7,0x0D00EF00,0xE7F30005,0x1F17F5D9,0x33DF0DED,0xDF2D19DF,
  221.     0xE129E1CB,0x0F003109,0xB723FF15,0xBBF70013,0xFFE929E1,0xF9F3EF23,
  222.     0xE7EB23DF,0x00D90DC9,0x0FF3193D,0xC1E10FFF,0xD9DFE900,0xFFD1E13F,
  223.     0xC5FFDD1F,0x17F7FFE1,0x29D1FFE7,0xE900EB29,0x23CF0FFF,0x11E1FF0D,
  224.     0xFF27B317,0xF1CFF935,0xFF07F723,0x15FFE527,0xFF271F03,0x00F5FFD9,
  225.     0x350FF1EF,0xD123FDDB,0xF5D1F117,0xFFE1EBFB,0xBFF7AFD9,0x07BFC9E1,
  226.     0x00F9DFC5,0x073DEBF7,0xE1C105D7,0xF10F0DF9,0xEFF900FF,0xDBB9F9C7,
  227.     0x35FFC9D1,0xB70F1FDB,0xE91D1DC9,0x3BDFF9CF,0xBF1F4DEF,0xE1EF00F9,
  228.     0xFFAF1FFB,0xBD29FFE1,0xD9CBE11F,0x0F0035D7,0xE1230D11,0xABC7232D,
  229.     0xE3C1FFE1,0x1FDFF517,0xD7B7EFFF,0x1FCFBFD9,0x45F5193D,0xC5F9EFFF,
  230.     0x2FD7B5FF,0x1DF117E7,0xC90FCD3B,0x37DBE1D7,0x1537D7C9,0x0315D137,
  231.     0x1107EFB7,0x1339DBC1,0xBFE9031D,0xD107FFB5,0x311D0FED,0xBFD107E9,
  232.     0x00EFD1F1,0x1DE729BD,0xA911150F,0x07DFF90D,0xE9073DD3,0xBB15ED3F,
  233.     0xE3B7F115,0x000F2100,0x09EFE54D,0xEDE9EFFB,0x2FFFE7E9,0xFFF12B3D,
  234.     0xE107DFF7,0x2BE7E115,0xFFE92B27,0x001FBB0F,0x37FFF5DF,0xF107FFD1,
  235.     0xF10BD333,0x150003D7,0xEF030D0F,0xFFE3E131,0xEB17E1C7,0x211D0517,
  236.     0xFFF5DFEB,0xF13D05E1,0x3F003BFF,0xCFF1F7F5,0x00150003,0xFFD127EF,
  237.     0xF715E72F,0x15FFD1D7,0xD10029DD,0x0F0BCD0F,0xCFE50BEF,0xD90125D1,
  238.     0x1DBBD913,0xDF1F15EF,0x00FFD1D1,0xFFC3010B,0xF137F7F1,0xE5DF1715,
  239.     0xF7E91DE7,0xE9FFC70F,0xF7D72F19,0x17EDDFC9,0x1DFFDD35,0xD90325DF,
  240.     0xF1E3D701,0xFF00000D,0xB9F1EFF9,0x2BD3E913,0x1500E7C7,0xD9FFD707,
  241.     0x27B900C7,0xF917EFDB,0x010D001D,0xE1D1FFBF,0x1D35D90B,0xD7F500FF,
  242.     0x00F7DF00,0x451F00F9,0xB7271DF7,0x3FF7CB09,0x1B1917B7,0xE1F7FF17,
  243.     0x0FCFB7D7,0x251725E7,0xB7093311,0xFDB5CF0D,0x1D3F1DE1,0xEFEF1F2F,
  244.     0xDFD1BDD1,0x371BCFC1,0xC9ED25EF,0xC9E5BFC7,0x0F2700EF,0xBD074521,
  245.     0xCBA1A90D,0x0DE900E1,0xD7D7011F,0xF7B7BB05,0x4131EFA9,0xD1F7252F,
  246.     0xF1E1E7FF,0x073FF9B3,0xB3F9272D,0xC9B197FF,0x1DDBD1E1,0x9FD91F00,
  247.     0xF1BF9F0B,0x573DF9B7,0xC1232D00,0x00C1EB25,0x0D1FFDA7,0xAFFD1F4B,
  248.     0xE7AFE11D,0x494BD9E1,0xFFFF253F,0xD9DBCFF3,0x434DF9B3,0xCB1F4D0D,
  249.     0xD1C9D71B,0x3D0500D7,0xA7FF4937,0xFFCFB92F,0x3505D3B5,0xE1331D27,
  250.     0xF1B3D7FF,0x001FDF91,0xC5F73325,0xB7A9F3FF,0x3701C9D1,0xDFDF233F,
  251.     0xF5D7AF0B,0x3F1DB1A9,0xCB2F2D07,0xF1F5AF0B,0x152707BF,0xCF2B451F,
  252.     0xE7B3E12B,0x2D3F2FB9,0xFF0D0F1F,0xF5B5D905,0x2F4BF7C1,0xCDFF451D,
  253.     0xC9F1D7F7,0x171FF1FD,0xCFF15F3B,0xE7BDB707,0x39F3E9E1,0xE9FB2D03,
  254.     0x00CFB70D,0x2F3F0DD3,0xC100153F,0xF1C1F92D,0x112FCBB1,0xF7E70747,
  255.     0x25C1BFED,0x372DCDA5,0xEFFD2DF3,0xE9D1B7CB,0x2F4717C7,0xB30037EF,
  256.     0xE1D9CB23,0x1D2117CB,0x9BEF1D1F,0x1BC7C10B,0x1B370BC1,0xE1FF3D3F,
  257.     0x00C1DBE7,0x0F431FE1,0xCFCF473D,0xD9B9C709,0x452FE907,0xC7CB3551,
  258.     0x17DFBBF3,0x4333E1B3,0xC1F93533,0x27B9BBFF,0x1D2F0FAF,0xBFFB0F2F,
  259.     0x1799A9FF,0x2D45EB99,0xBFFFFD1F,0xF9D1B7E7,0x2743F5A5,0xB7DF1F1D,
  260.     0xFDFFC1BF,0x0B03F1E5,0xD5FF130F,0x00CFDFDB,0x152D1FF9,0xE1C7EF09,
  261.     0xED0BF7F3,0x1D0013FB,0xBDE10013,0x3FE7D5E7,0xFF151BB9,0xD9E9F723,
  262.     0x19E7CFDF,0xED2727E9,0xD9ED002F,0xE9C1D9E7,0x113B2B00,0xBFD70F3D,
  263.     0x05FDFFF5,0x0F2D03F1,0xADC92D35,0x1711AFF5,0x190017FF,0xB703293B,
  264.     0x1FAFA1F3,0xFF0037D1,0xF9DBC715,0x33C3C5D7,0x073FEFB9,0xE9BDDD1D,
  265.     0xE700CFAF,0xF11DC1E1,0xBBC12735,0x0723ABC1,0xFFFF07ED,0xBBE119E9,
  266.     0x07EFB9D3,0xFF2937CF,0xB1EFFB1F,0x1BD300FF,0xBF3735E5,0xC7CFE947,
  267.     0xF7B1CDD1,0xF12DFFE1,0xDFB71125,0x00C1BFBF,0x07092307,0xC7B71335,
  268.     0x1FCF9DE9,0x27FB0000,0xABDDEF1F,0x33079DE3,0x291F11CB,0xC1F1251F,
  269.     0x37D1C1CF,0x154727C7,0xE5DF0037,0x15D9D5CF,0x2F5D17E1,0xB7DF1139,
  270.     0xF50FDBD5,0x114D1FD5,0xAFD34549,0x13D5C7CD,0x0D0D27E1,0xC9EF3333,
  271.     0x0FB3A9DB,0x034537E1,0xC1E7FF3F,0x03C5CF19,0x1D3F03C1,0xA9CF1345,
  272.     0x29D1CBF5,0x3115F1C9,0xDBEF3D41,0x27D1AFD7,0x393D00E1,0xBFEF2115,
  273.     0xE1E1B3FF,0x494F00DD,0xAFDF251F,0x0FD9C3E5,0x391FF9AB,0xC3F73D2F,
  274.     0x0FC3D1DF,0x133717CD,0xD90D273D,0xE1B9C9FB,0x194B00E1,0xCDF32343,
  275.     0xFDE5DF05,0x432300C9,0xC5F53927,0x23D3C7EF,0x250317CB,0xD115312B,
  276.     0x15C1BDFF,0x092BFBD1,0xC7FFF51F,0xE9D5CFFF,0x2935F3C9,0xBFDB2117,
  277.     0xF1E5DFDB,0x250BF5D3,0xBFE33B23,0x00DFCBF1,0x151500F9,0xCD2D11F1,
  278.     0xDBF9D725,0xC70DFDDB,0x000FEFC9,0xD5FB0D15,0xF7E1F7FF,0x0F00E1DF,
  279.     0xFFDF1B05,0xEBFFE11F,0x21DFE9C1,0xC91B0DE7,0xF1F5EFFF,0xC1D90BCB,
  280.     0xC1002F0F,0xFFC10725,0xEBD9D1D1,0x19DFD90F,0xFFEBCB03,0x1FFFDBE1,
  281.     0x13000DFF,0xE1E9EB19,0x11F100EF,0xFFE11DDF,0x0BC5D50B,0x2BD7D1CF,
  282.     0x0D17DBC7,0x00EFB5FB,0xE100DDBF,0xF1270FED,0xE7C9F10D,0xF7E1C9D9,
  283.     0x11EF00D9,0xEFE5FFD3,0x0003CFCD,0xE1092FDF,0xC3001D0D,0xDFFFE511,
  284.     0xF7F92300,0xBDDFF900,0x1BE7E10B,0x07FFFFCD,0xF1BF2323,0xF1E9FDFB,
  285.     0xE91D070D,0xD7BF0031,0xC9E1D507,0x1DFFC100,0xFFCBEFE9,0xF1F9CBE1,
  286.     0x2317FDBB,0xD9F10DEF,0x00D1F10D,0xF70000DF,0xFF2D0023,0x25FBCF1F,
  287.     0xDB31EFD1,0x003D1300,0x0B0F19F7,0xEB271DE1,0xDFF9371D,0xF3E92111,
  288.     0x19F7E52D,0xE7DF00F1,0x00FFCB00,0x1F13EF15,0xD11315FB,0xF1E1E1FD,
  289.     0xEFF107FF,0xFFDBE90B,0xFFCFF1F1,0x0F1BD5E1,0x171DCD05,0xF9FFFFD7,
  290.     0xD927DBED,0xEF0B070D,0xE7E9FFE1,0xFFFF0000,0xEBF500D7,0x13FFFBE9,
  291.     0x0DFF23D5,0xC9210DE7,0x03110B19,0xCFE5350D,0xC1FBF933,0xFFD50019,
  292.     0xFFF90D1F,0x13DFE71F,0x0FE10FEF,0x171B0B0B,0x07D9152D,0xF107F1EB,
  293.     0x23FDE92B,0xFFE9EF2D,0x1F15C7D5,0x1DFFF1D9,0x000FFFE9,0x2703E5CF,
  294.     0xFB1F27BD,0xDD05E109,0x09F900EF,0xDF2D03C1,0xD7F7E517,0xDF0BEFC9,
  295.     0xF11D1BE1,0xBBD527FB,0xD1F1FFE9,0x0DDB27FF,0xB7C32523,0xE5D7C107,
  296.     0x03D5030D,0xE1F7F727,0x00D7C51D,0x130709DD,0xEDD9FF3B,0x15E9CDD7,
  297.     0x2100FFE1,0xE100CDEF,0xF701E5EB,0xFF1FE1F7,0xFFF90743,0x050DBBED,
  298.     0x0FFFF1E1,0xE52115F1,0xE9FFD5AF,0x11232BCB,0xE1D9190D,0xCFD30723,
  299.     0xEF001FE1,0xFFE7F327,0xFFEDADF5,0x1325E7D5,0xF10BFF25,0xE10BFFFB,
  300.     0x1F2337FF,0xF5D93B1D,0xEFC9E117,0x33F7E9F5,0xD7DFEBF1,0x0B15A9FD,
  301.     0x0F23EBBF,0xD10BFFFF,0xD1D1D5EF,0xE3001FBD,0xEFBD0303,0xEFB1B9ED,
  302.     0x231DCDC1,0xF1F715E3,0xD9F1DBE7,0xD13507E7,0xAFDD1715,0xEFD1BB13,
  303.     0x19EFD100,0xEDDF11E5,0x0FE7B7F3,0x27270DDF,0xD10F1D03,0xF9E1FF1D,
  304.     0xF73FFDF7,0xDFD70733,0xEFC1D9FD,0x291DC9D9,0xFFD7FBED,0x17F5CFC9,
  305.     0x0F390DBF,0xC3131DF7,0xE1C9DDFF,0xEF131F07,0xAFEF0F27,0x1DCFE12F,
  306.     0x1515F3E1,0xE1FFFF1F,0x33F5FFF5,0x0F33FFDD,0xC5EB3F3D,0x00E1EFFB,
  307.     0x15F3E127,0xDBD5072F,0x17DFB700,0x4B25C5E1,0xD50DFFF9,0x0FF1F9D7,
  308.     0x190FFDC7,0xBFEB1B2D,0x07C1E9EF,0x0D3F00E1,0xEFFFF933,0x11C9D7E1,
  309.     0x254D03E5,0xBB1D25FB,0x0003E7E1,0x0F2F39F9,0xA1FD4919,0x15C9E50B,
  310.     0x15E91F17,0xCBFF1927,0x17CFC1EF,0x1B27FFE5,0xC9FF0D43,0xE5C9FFFF,
  311.     0x1907ED00,0xDFD70753,0x15C7EFDF,0x470DC9E9,0xFFF50D1D,0x17FFD5D3,
  312.     0x3D2FF5EF,0xE713172B,0xEBDBC100,0x4D11F1C9,0x0B27FFF1,0x03FFCDFB,
  313.     0x170F0FA7,0xC92F151F,0xEFDBE119,0xF30D07B5,0xFF1D030F,0xDBD5C7E9,
  314.     0x1F15FFC1,0xC9EF31E3,0xC501F7FF,0x27DF1FED,0xBF0029E1,0x01E12BE5,
  315.     0xEFD1CFFF,0x1D0B13E9,0xF3F7E70B,0x23F5FF13,0x1323BFED,0xE1EFEF09,
  316.     0xDF1331DF,0xC507F11D,0xFFDD0F0B,0xEDB3E9E1,0xFFFFF113,0x05F7EDC1,
  317.     0x00FFF7D1,0x0707FFCF,0xC900FFFF,0xEFE1171B,0xDBE1F10F,0xF705E103,
  318.     0x09BFD5E9,0x13FFDFF1,0x0029FFC7,0xD5F113DF,0xF127CBF5,0xEFD1E515,
  319.     0xC5E10007,0xFFCDA5F7,0xEFFFD9E9,0x00F7D9D1,0x00FDFDCD,0xE12BEFC7,
  320.     0xD5D10FEF,0xD5E91BFF,0xEFFBE103,0xF7DFD917,0x13F7D7E1,0xF1FFEFF1,
  321.     0xD5171DF7,0xE1E9FF0D,0xEBEB0F2B,0xCF000003,0x15CFC927,0x25EFE9E1,
  322.     0xF1FFC7E1,0x2F0711FF,0xCDD9EFDF,0xE5ED001D,0xEFC3F1FD,0x09F7D10F,
  323.     0x29FDD1E9,0xD917EFF5,0x2F3DEBF1,0xDF0FFFE7,0xF1374D17,0xF70007F7,
  324.     0xDF001B27,0x15F70017,0xFFDD0B00,0x2729E307,0x05DFFFDF,0xD9270DE9,
  325.     0x00170BFF,0xBF003915,0xF9D50007,0xDFCD0F1D,0x21FFDD07,0x1DBFD5F9,
  326.     0x0019FFE9,0x1F15D7F7,0xF5E11DFF,0xE907E903,0xDFED001D,0xFFE1E5F1,
  327.     0x0DCFCD07,0x192B00D5,0x0F15DBD1,0x270305EF,0xE11F11CD,0xD90F1719,
  328.     0xFF000FFF,0xDBF5E307,0xFFEF0000,0x0505EFE1,0x2315F707,0xE1072DD7,
  329.     0x001F1D13,0x0D071FFF,0xC1E12713,0x15EF1739,0xFFF3E30D,0x0BFFFF2F,
  330.     0x31E9FBF9,0x0323EFFB,0x23090BFF,0xE3E10DEB,0x07170009,0xF3DD00F5,
  331.     0xF7DFE90F,0x1BF3D1EB,0xDF13E7DD,0x1BFFDFE1,0xDFEDEFD7,0xDB2717EB,
  332.     0xFBC100EF,0xDFE1FDF5,0xF9F7F1F9,0xF7CDFFFD,0x130DD700,0xE9FFF5ED,
  333.     0xF90FFDFF,0x15EB13AF,0xFFDBE10F,0x1FF5D1BF,0x0DEBEFF9,0x1FFF0D0F,
  334.     0x0907CFED,0xE519FBEF,0xD7F137E7,0xCB00D100,0x15FF00FF,0xEFC7EFE1,
  335.     0x00FFEBC1,0x00FFFBC7,0xE91119CF,0xE9D1F1EB,0xDFF10F1D,0xEBCD0007,
  336.     0xFDCFC10F,0xEF29EBE1,0xD9DFE100,0x1F070B0D,0xD127FFDF,0xD7CF0019,
  337.     0xFFD1D9E9,0x13EFCD0F,0xF3E7FBD3,0x00F3AFDD,0x031F15F5,0xA5F9FFDF,
  338.     0xE9D1D9FF,0xF3F1F1F7,0xAFE7EB17,0x0BBFC9D1,0xEF2BE5E1,0x000DFF17,
  339.     0x0FE9FBD7,0xF54B0DE7,0xCFF5133D,0xD9E1070D,0x2519D100,0xBFDFFF00,
  340.     0x0009DB00,0x390DF7BF,0xA70915FB,0x0FD1F1FB,0xDF001FF7,0xDBEFF129,
  341.     0xDFA9C903,0x2733E1E9,0xF9FFDF17,0xF90FFBFB,0x273FF3D1,0xCB00332D,
  342.     0xF7F105EF,0x1DEBE1F9,0xFFFF3F33,0x17F7CBF1,0x331DFBD9,0x0035FF0F,
  343.     0x00F5FFFF,0xF13315C7,0xCFF91735,0xE3E11F15,0x0DDFE5E1,0xFFFB071F,
  344.     0x00D5CDE9,0x1F1DEFDF,0xDD1F1DFF,0xCDF1DF19,0x13F1F9FB,0xDFE91B0F,
  345.     0xFFDFCF03,0x35E3E5D3,0x07211DF1,0x00FBEBFF,0xF907F1DB,0xE1030F17,
  346.     0xDFD7F12B,0x0D11E5D5,0x11FBEF00,0x01F519FD,0x0F27F7BF,0xF3F72F15,
  347.     0xE1F10F09,0xF109E917,0x150D1F21,0xF3EFDF00,0x1715FD00,0x011F2DDB,
  348.     0xF1EBFB11,0x19F11FF7,0xD1F70F00,0x17DFE92D,0xFFF5D1D9,0xE90DEF07,
  349.     0x07F1EDEF,0xE907DFD5,0xF3EB17FF,0xCFC1F5DD,0x1D0DE9FD,0xFBD3F9EB,
  350.     0xE1E7DBF1,0x2519CDE1,0xC30F0DFF,0xF100EF00,0xF7F100E3,0xDB1B2307,
  351.     0x0FBDE1F9,0x11FD05D5,0x0033F900,0xF9D9051D,0x001FFBCD,0xDB2B1307,
  352.     0xFF031D03,0xF100D1CF,0xF1E929D9,0xE7E9130B,0xFFBF0F19,0x070BE1F1,
  353.     0xF9CFF10B,0x0FFFDBE1,0xFB15EBC9,0xD9131DFB,0x07F1DFDF,0xBFE111EB,
  354.     0xCBDD1705,0xEFBB0011,0xFFE5E1E1,0xFDCBDF00,0x1BFFCFE9,0x0717DBBF,
  355.     0xE9E71DFF,0xE1E9E5CF,0xE90000FF,0xFFD9370D,0xEFB3C100,0x2DFF00F3,
  356.     0x0BFFD7C1,0x13E7B7F3,0x001FFBAB,0xC50F1B15,0xFFD107FF,0xE7E9D1E1,
  357.     0xFBEF170F,0xFFCDC7D1,0x1BFFD3F1,0x031943E5,0xE5F7DFDD,0x113713EB,
  358.     0xC9004513,0xF1E12739,0x1D0003F3,0xEFF70527,0x27B5F11F,0x1B1DDFD1,
  359.     0x271D0DEF,0xE1C9EBE7,0x071FF3DF,0xCFDD1FFF,0xDFC9E127,0x25E5E1F9,
  360.     0xF7FFFBE1,0x13DFC7ED,0x2313EFC5,0xF5332DDF,0xE1DD0BFF,0x05070F19,
  361.     0xE7FB0F0B,0xE7DB001B,0x2D15CBE1,0x010D0013,0x00192DE9,0x131BEBDF,
  362.     0xE3173B0D,0xE1D90D0B,0xEFE10FFF,0xF701F119,0x0BCBF123,0x1DFFE7E9,
  363.     0xF5FFCFD5,0x00F5FFFF,0x07070DDF,0xC7071BFF,0xF3E91709,0x0DC9E103,
  364.     0xFFFB0313,0xFDF7D7E5,0x230DDF13,0x1729FFEB,0xC9FFF7DD,0x111717FF,
  365.     0xD1E9FF0D,0xEFE72719,0xFFDBE9E1,0xF9FFE323,0x1FF7EBDF,0xEB0DF7DD,
  366.     0x001FF517,0xE9E9FFFF,0xFD0F19FB,0xFFE1E10B,0xFFEDEB00,0x330DFDE1,
  367.     0xE7FF09F7,0x0F25D9E7,0x07F913EF,0xCB1B2517,0xF3F5E1FB,0xF7001F00,
  368.     0xEFEFF10F,0xEDCFDDD9,0x131DFBC9,0xF1DF1923,0xE3FD09E7,0xF101F1D5,
  369.     0xD5E11F35,0xE5D9C907,0x15F7E51F,0x000D0F00,0x2FC5EBF7,0x2315F7DF,
  370.     0x00E90DFF,0xF5F53911,0x1D0000FF,0xBFF1030F,0x1DFDD500,0x25EFB900,
  371.     0x0F25EFF1,0xE1FBE7CF,0xD90F09DF,0xE50700DF,0xDFDD0F0D,0x0DEDF1F3,
  372.     0xF7E7E500,0x1DF7FBF1,0x0FFFCFE1,0x01451DF5,0xE90BEFDB,0xE10F190D,
  373.     0xDF172BEF,0xC7C50017,0x15D1F503,0xF7D7D1E9,0xF5D7E700,0x07F3BFBB,
  374.     0xD907EBFF,0xC9000DEF,0xC3D1E5FF,0xEFE50019,0xD7A5C900,0x13D7D1F1,
  375.     0x1BFFD5C3,0xF10DEFF5,0x2F0FFFEB,0xD70015EF,0xE3000027,0xFDC100FF,
  376.     0x1D15E907,0x1DEFE1F1,0x1F1DE7D1,0x1F1DFDD3,0xC50F15CF,0xE10701FF,
  377.     0xDFE107FF,0xBFF10F1F,0x11D7C5E9,0xF7EFDFE1,0x0015EFD1,0xE9FF19F7,
  378.     0x002F39F7,0xD3E90F21,0xE7E52713,0xFFEFD900,0x11EFF927,0x1F1BF7DB,
  379.     0x13FFFFF7,0xED1725EF,0xE1F1010D,0xF3E5271D,0xDFD1E117,0x1DEBF12F,
  380.     0x2BFFEBE1,0x07FBCFE5,0x13230BDF,0xD1F10DEF,0xFBF10F25,0xFFD9E1F9,
  381.     0x0DF7F50F,0x29EBCDD5,0x031DE7E1,0x172D09E3,0xD5000DEF,0xED331FFF,
  382.     0xE7E907FF,0xDDDB1327,0x19EFF1F9,0xEFEF0000,0x23FFDF00,0x0F0DFBDB,
  383.     0xF13D25ED,0xE9E3F7FF,0xE1032F0D,0xDDF9170F,0xE7C7003B,0x3103E100,
  384.     0x0BEFFD0F,0x0D0DFF00,0x1F17CFD9,0xF50F3D0D,0xE1F3FFFF,0x0DF1001D,
  385.     0xFF001F17,0xFDD7DD27,0x3D07CDD1,0x0015DBD9,0x00F50D15,0x0F0FEFBF,
  386.     0xE9190F0D,0xEBE10BFF,0xEFDDC9ED,0xFF050F03,0xDFE7D500,0x2BFFDDF5,
  387.     0xF125FFB9,0xD1F7EF07,0x0F00FFD7,0xC5171BFF,0xD3E92F29,0xF5E1E1FD,
  388.     0xFDE7F70F,0xE50FC7FF,0xDDED0F33,0x07E5EBFF,0xD7DDF141,0xFFFF1B17,
  389.     0x1FBFE9E9,0x11DF00F7,0x0F39CDC1,0x03E5CFFF,0x001FE7EF,0xB1F500FF,
  390.     0xF7F5030D,0xFDEDA3E9,0x0DFFE507,0x07F7C9BD,0x1F11FFDD,0x002925D7,
  391.     0xC5E90DC9,0x09130300,0xB7EB000F,0xEFF7FB17,0x25E5E9D9,0xD915EFE9,
  392.     0x27D7E5DB,0xD5F115CD,0xE93527FF,0xB9A1EFFF,0xDB00F900,0xCFD9E119,
  393.     0xB7AFDB0F,0x2DDFBBD1,0xCDD9EFDF,0xE9FFFBE3,0x3BE1FBDB,0xDD002D19,
  394.     0xF5B7E91D,0x0DE1F9DF,0x1515DF0F,0xFFC7E51B,0x2F37EFB1,0x191DFFEB,
  395.     0xCBE9350D,0x13E9D9DB,0xFBFD1F31,0xE7FBCDE1,0x0FD7C1F1,0x094729C5,
  396.     0xD1FFDFFF,0x1BF11DEB,0xE7172DC7,0xCBDF2749,0x1DE500CD,0xFFF7000F,
  397.     0xFFFF2729,0x0FFFBFD1,0x2B2D2117,0xD10F1DE7,0x0005FB15,0x15002FED,
  398.     0xAFC3FD2F,0x2DDF0009,0x19EFD7C9,0x0FFF0943,0x00E1DFCB,0x002BFFFF,
  399.     0xF7F10725,0xC1C1E909,0x451D0300,0x15CFE51F,0x23FFF7F9,0x3F0DF3B7,
  400.     0xF11F3935,0x0F13CD1D,0xF5EB1315,0xFF2F0F13,0x19EFB923,0x3D090FD1,
  401.     0x0011E3E1,0xFF15FFFB,0x1F1FFFB7,0xD1F32F0D,0xD91F13D7,0xD1F3E10D,
  402.     0xEFED2F27,0xB5FFD900,0x190D1327,0x13F1FFD1,0xD9F5FF17,0x0F0F2FDF,
  403.     0xD3D9F715,0x19E92F3D,0xD5DD00EF,0x1DEFE53D,0x15D9C3ED,0xD1EFDF17,
  404.     0x3907EFEB,0xED00BFD7,0x17ED0F0D,0xE3B1E1AF,0x1113C509,0x1DDBC9EB,
  405.     0xD1EBDFE1,0x3B3BC1D7,0xC707EFDF,0xF12505F1,0xFFF1F1BF,0xCF3F3D00,
  406.     0x21C7F1ED,0xDF002FE1,0x0B3D1FF1,0xC7EF0033,0xF1FFFBF5,0x153DE100,
  407.     0xC92500ED,0x0017EF0D,0x250F00DF,0xE1E927FF,0xE1DB1F2D,0xFFB303F1,
  408.     0xE9EFED00,0x47EBCBF9,0x0FF9D7C9,0xE91B1DF7,0xD1E9EFDF,0xD3F1F5FF,
  409.     0xDFE10013,0xD7ADC1FF,0x1BDFC5D9,0x0BCFE7D5,0x00FFEBBB,0x1713EBAF,
  410.     0xD7002BF7,0xC5C9E507,0xFFC9D1DF,0xEFFFD9E5,0xF1BFB9F5,0x1F1BD7B5,
  411.     0x072D15C9,0xC1F51DFF,0x000FFDB7,0xBFF52BFF,0xB7D5073D,0xFFDDE1FD,
  412.     0xEFE72F2F,0xF9DFE70F,0x33EFD1CD,0x0F3335E1,0xE1BDFF1D,0x00000BDB,
  413.     0xE31F2327,0xCDA90B5D,0x3BF3C5E9,0x15FF001F,0x11FBEB07,0x3FF7BBBD,
  414.     0x002F2DCD,0xC9F1EF15,0x1DE1F1FF,0xF70F27F1,0xCFCFE537,0x3DF7A9C1,
  415.     0x1D25EFC1,0xDDFF19F7,0x070FD7AB,0x003745F7,0xBFE5450D,0xE5F100FF,
  416.     0x15032F11,0xB7D7F92F,0x25DFD1E1,0xFD35FBD1,0xF5FFFF47,0x00E9F7CF,
  417.     0xE12F45FF,0xDFC91B3B,0xE5B1D907,0x19F70713,0xFFC7CF13,0x37F7CD00,
  418.     0x331905D9,0xE51FFFFF,0x3F1FD7FB,0xEF0731FF,0xEB17172B,0x1DDBD9DF,
  419.     0x250DE900,0x1DEFE5E1,0x032DDFC7,0x273DF7D5,0xC1E521F7,0xDB1F1FDF,
  420.     0xEFEF000D,0xEFC9071F,0x09E7E1D1,0xFFF71BE5,0x0F0DEFE1,0x00EF0DDF,
  421.     0xCB1F3DF3,0xD1E5DF0D,0xEFD92731,0xCFED1F1F,0xEFBFD11F,0x2DFFD7E9,
  422.     0x07DBFF0F,0x00F7FFDF,0x1F23EBD7,0xF1D92731,0xD1C1E1F7,0x190DC9F9,
  423.     0xFFDFE327,0xF9DFCFE1,0x3733E1BD,0x1D0FE7FF,0x0DFFF1AF,0x27D9E3D1,
  424.     0xFFFFC3FF,0x17FFF7BF,0x0F1D3D03,0x05C1D7FF,0xDF00EFE3,0x1DFF23E1,
  425.     0xEFDDB7F1,0x2729B1EB,0xD9EB0DBB,0xC10925ED,0xD30FF1EF,0xC5002FD3,
  426.     0xDBAF070B,0xEFD1F11B,0x15FD2307,0x0DDDEB3F,0xF71DE7F3,0xE90D05FD,
  427.     0xF1F11D3D,0x0023FF1D,0xE1D70711,0xFFC11527,0x3BDBBF07,0x09FF1DE5,
  428.     0x00E5DFE5,0x00F1CD15,0xC10FF9F7,0xD1A1C11F,0x0DC9C109,0xEF25C1D1,
  429.     0x00DFDFC1,0x3507EFAF,0xE5230DD9,0xE9C10711,0xEFE9E9DB,0xEF03D11F,
  430.     0xBFCFE109,0x1F29BFC9,0xFB2DF3D5,0xC1151DE7,0x17F10FBF,0xD70027EF,
  431.     0xB1D70025,0xFFB9E100,0xBF1D050F,0xDDDFC113,0x0705DFD1,0xE923FF0F,
  432.     0xA1D51DFF,0x00E5FFC5,0xFFE51F27,0xCFB90F0D,0x2FCFA9D1,0x2DFF071F,
  433.     0xE115F71B,0x1F15D7F7,0xFF271DF9,0xB9C9E93F,0x15CF00FD,0x3D1DEBD1,
  434.     0x0FEFEF47,0x2F0701CD,0x0F45FFCF,0xDF170D2D,0xD3D1D1EB,0x25311F00,
  435.     0xFFEDF93B,0x29DFDB00,0x631537B9,0xCF192D05,0x2F1DDB0D,0x07133FD7,
  436.     0xC12B435B,0xF5E5C1FF,0xFFF500E1,0xDFF7071F,0xD7E5BFC7,0x4725FBB9,
  437.     0xD1C12B09,0xC100FFDF,0x23FF00D7,0xB7C52347,0xC1CBC50F,0x0DF7F1EF,
  438.     0xED05FF27,0x00BBBD0F,0x071725B5,0x00F9FF1B,0x01C10735,0x13F90FC3,
  439.     0x1BEFF54B,0x25F1BB11,0x0F1DC7E1,0x131F2F11,0xF10FBFF3,0x3B0B0FEF,
  440.     0xEF003FD1,0x1511D10D,0x3D0500BF,0xE1FF05E5,0x1739E109,0xD943E7B7,
  441.     0xE915292F,0xC70F17DD,0xB93D21F1,0xFFD14319,0xC3C11D17,0x00FF2DF9,
  442.     0x1795EFF5,0x0FFD2D17,0xD1E1270D,0xC1C1000D,0x3D33110F,0x9DDBDD4B,
  443.     0x0FC7F70B,0x63079DD1,0xC9012D0D,0xE1CDBF9F,0x23D9C1DF,0xEFDDE923,
  444.     0xCB8B9307,0x491DB191,0xBF11CBD5,0x00F7D7D7,0x4F2FCF89,0xBB53111D,
  445.     0xE9D1F1DF,0x0D000FBF,0xD72B1F31,0xBFB3E1FD,0x432DD9C9,0xB72D25F1,
  446.     0xA9DDDFF9,0x472F25A7,0x93193D1D,0xB1AF0F2D,0x1BCD00C1,0x9FFF3F4F,
  447.     0xF1B7C52B,0x37F7D7B5,0x012FFF57,0xC9C5EF1D,0x3F1FDFA1,0xBF002B3D,
  448.     0xB1A9D11D,0x43C9B1AB,0xF7FF2717,0x00EF971B,0x55FFBBBF,0xE95B15F1,
  449.     0xA1C1C12D,0x2D07E19F,0xFF05000F,0xBFBBF135,0x6D3BC19D,0x0D0D0DE9,
  450.     0xA1EBEFEB,0x0F2BBD8B,0xDB535915,0xA9E5BF25,0xE30007DB,0xE7533D00,
  451.     0xB39FCB5F,0x4BF71FC1,0x07352D00,0xEFDF0D3D,0x2FEDE7A7,0xC905573D,
  452.     0xC3F1F94D,0x11CFBB13,0x1DFF4F07,0xBDF1C717,0x3FFFCFEB,0x27DD31C7,
  453.     0xA9C9F955,0x4F0FE1FF,0x19DF2927,0xEFE7EF4F,0x0D279BBF,0x37452D03,
  454.     0x11D11D11,0xFF2FE9DF,0x472727FB,0xFFAB153D,0x152DC1C1,0xFF1DE9E1,
  455.     0x1709FF37,0x0723BFB5,0xD7553FC9,0xF1D9EF0B,0x0DE50BEF,0xD71547AD,
  456.     0xEBBFE917,0x5327F11F,0xCD3D39C1,0xC1FF0921,0x1100B7FF,0xAF1D5D31,
  457.     0xDBC73DFD,0x1DE1BD00,0x1FFF5B37,0xD19F15E3,0x3B1FBFEB,0xE9090027,
  458.     0xA1A31D49,0x3D0FB3E7,0xDFF1E137,0xE99FFF27,0x3BB5A9A3,0x0D4509FF,
  459.     0x079DD72D,0x2FE1E9D3,0x135FF1EF,0xCBCFD51D,0x512F2DC5,0xCB1BDFEB,
  460.     0x091F0BFF,0x4B1300E1,0xDF2B2F1D,0xFF13A9BF,0x15DF00E1,0xE7571D1F,
  461.     0xD1FFCDBF,0xFD2721AF,0xCDC9FF0F,0x87CF1329,0x0DE50FB9,0xFBCF0037,
  462.     0xCFBFC1FF,0x00FDCFC9,0x070B114F,0xC5F5F71D,0x3F1B0F11,0xEFC11B0D,
  463.     0xABC1C737,0x4BDFC1C5,0xFFD3FFC5,0xF1FFAD31,0x2FE9DFBF,0xE1333D1D,
  464.     0xE7C5A90D,0xEBE1E9AB,0x2515F5E9,0xEF8993FF,0x3F2FCDB9,0x13E72DCF,
  465.     0xCD0FFFFF,0x1F2DD1A7,0xB7034FFF,0xC927AB1F,0xDFE500CF,0xC72D3F17,
  466.     0xFFB7BF37,0x15350DB3,0xF5E70DE1,0xD1C11F3D,0x0033FFCF,0xDBEF172F,
  467.     0xC7A5F14B,0x07098DD1,0xFBEB3927,0xC9D1D7E9,0x1721BBDF,0xE9073DE7,
  468.     0xC182B72D,0x1DF1E1EF,0xB5EF1307,0x07BFE171,0x2D2FA5AD,0xE93D0327,
  469.     0x3DDBEFFF,0x0027BFAB,0xE1295315,0xEBC1DFEF,0x4D17C9F5,0xDF092FC9,
  470.     0xF1DFBF23,0x6939A5C7,0x9D251DD5,0xE113FF1F,0xFF1FCFBF,0xAF39651F,
  471.     0xDBC50FF1,0x1D1FE1CB,0x1D4D4113,0xC1AB25FF,0x1F57D7C1,0xC93D232D,
  472.     0xA1B73D3B,0x07F1B1D1,0xBF093F4B,0xF1A31D07,0x1FB7CDCD,0xE75537E7,
  473.     0xC193DF55,0x4FC3070D,0xCF33DF01,0xCDBFF57B,0x63C9CBC3,0xFF3BFF00,
  474.     0x2DD7F51D,0x4FD1BBBF,0x4B65472B,0xC7E900FF,0x5F0FBD0F,0x55570F07,
  475.     0x9D15DFEF,0x6D35B1A5,0xFF1729C5,0xD1454BF9,0x1DCDE187,0xDF4F4500,
  476.     0xB9DF001B,0xABEF0F9D,0x115703F1,0x89AF1347,0xD52335B5,0xFF0925E9,
  477.     0x9FB93D51,0x07C71FD1,0xCD0F174B,0xC1BFCF0D,0x0525E9E5,0xD91937E1,
  478.     0x0F00CF39,0x671707BF,0xED076900,0xF7F10F65,0x29D500F9,0x0F0DF907,
  479.     0x2BCFB1FF
  480. };
  481.  
  482.     /* Clock image run-dump. */
  483.  
  484. USHORT ClockMap[456] =
  485. {
  486.     0xFFFF,0xFFFF,0x8000,0x0FFF,0xFFFF,0xFF80,0xFFFF,0xFFC0,
  487.     0x1FFF,0x801F,0xFFFF,0xFF80,0xFFFF,0xF80F,0x8000,0x0F80,
  488.     0xFFFF,0xFF80,0xFFFF,0xC1C0,0x3FFF,0xE01E,0x1FFF,0xFF80,
  489.     0xFFFE,0x081F,0xF9F0,0xFFC0,0x43FF,0xFF80,0xFFF0,0x81FF,
  490.     0xF1E6,0x7FFC,0x087F,0xFF80,0xFFC0,0x0FE7,0xF9FE,0x7F3F,
  491.     0x800F,0xFF80,0xFF00,0x7FF3,0xF9F8,0xFE7F,0xF005,0xFF80,
  492.     0xFE01,0xFFF9,0xF9F3,0xFCFC,0xFC02,0xFF80,0xF803,0xFFFF,
  493.     0xF9E6,0x7FF3,0xFE00,0x7F80,0xF00C,0x7FFF,0xE060,0x7FCF,
  494.     0xF180,0x2F80,0xE01F,0x8FFF,0xFFFF,0xFF3F,0x8FC0,0x1780,
  495.     0xC03F,0xFFFF,0xFFFF,0xFCFF,0xFFE0,0x0B80,0xC07F,0xFFFF,
  496.     0xFFFF,0xF3FF,0xFFF0,0x1580,0x80FF,0xFFFF,0xFFFF,0xCFFF,
  497.     0xFFF8,0x0B80,0x80C3,0xFFFF,0xFFFF,0x3FFF,0xFE18,0x0580,
  498.     0x0199,0xFFFF,0xFFFC,0xFFFF,0xFCCC,0x0280,0x0199,0xFFFF,
  499.     0xFFF3,0xFFFF,0xFFCC,0x0500,0x01C1,0xFFFF,0xFF8F,0xFFFF,
  500.     0xFF1C,0x0280,0x01F9,0xFFFF,0xF021,0xFFFF,0xFFCC,0x0500,
  501.     0x01F3,0xFFFE,0x01F8,0x7FFF,0xFCCC,0x0280,0x80C7,0xFFC0,
  502.     0x3FFE,0x1FFF,0xFE18,0x0500,0x80FF,0xFC01,0xFFFF,0x87FF,
  503.     0xFFF8,0x0A80,0x807F,0xF81F,0xFFFF,0xE0FF,0xFFF0,0x1580,
  504.     0xC03F,0xFFFF,0xFFFF,0xF83F,0xFFE0,0x0B80,0xE01F,0x8FFF,
  505.     0xFFFF,0xFE0F,0x8FC0,0x1580,0xF00C,0x7FFF,0xFFC7,0xFF03,
  506.     0xF180,0x2B80,0xF803,0xFFFF,0xFF9F,0xFFC1,0xFE00,0x5780,
  507.     0xFC01,0xFFF9,0xFF3F,0xFCFF,0xFC00,0xAF80,0xFE00,0x7FF3,
  508.     0xFF07,0xFE7F,0xF001,0x5F80,0xFFC0,0x0FE7,0xFF33,0xFF3F,
  509.     0x800A,0xBF80,0xFFF0,0x81FF,0xFF33,0xFFFC,0x0855,0xFF80,
  510.     0xFFFE,0x081F,0xFF87,0xFFC0,0x02AF,0xFF80,0xFFFF,0xC1C0,
  511.     0x3FFF,0xE012,0x157F,0xFF80,0xFFFF,0xF80F,0x8000,0x0F80,
  512.     0xABFF,0xFF80,0xFFFF,0xFFC0,0x18FF,0x8015,0x5FFF,0xFF80,
  513.     0xFFFF,0xFFFE,0x8000,0x0AAB,0xFFFF,0xFF80,0xFFFF,0xFFFF,
  514.     0xFD55,0x55FF,0xFFFF,0xFF80,
  515.  
  516.     0x0000,0x0000,0x7FFF,0xF000,0x0000,0x0000,0x0000,0x003F,
  517.     0xE000,0x7FE0,0x0000,0x0000,0x0000,0x07F0,0x7FFF,0xF07F,
  518.     0x0000,0x0000,0x0000,0x3E3F,0xC000,0x1FE1,0xE000,0x0000,
  519.     0x0001,0xF7E0,0x060F,0x003F,0xBC00,0x0000,0x000F,0x7E00,
  520.     0x0E19,0x8003,0xF780,0x0000,0x003F,0xF018,0x0601,0x80C0,
  521.     0x7FF0,0x0000,0x00FF,0x800C,0x0607,0x0180,0x0FFA,0x0000,
  522.     0x01FE,0x0006,0x060C,0x0303,0x03FD,0x0000,0x07FC,0x0000,
  523.     0x0619,0x800C,0x01FF,0x8000,0x0FF3,0x8000,0x1F9F,0x8030,
  524.     0x0E7F,0xD000,0x1FE0,0x7000,0x0000,0x00C0,0x703F,0xE800,
  525.     0x3FC0,0x0000,0x0000,0x0300,0x001F,0xF400,0x3F80,0x0000,
  526.     0x0000,0x0C00,0x000F,0xEA00,0x7F00,0x0000,0x0000,0x3000,
  527.     0x0007,0xF400,0x7F3C,0x0000,0x0000,0xC000,0x01E7,0xFA00,
  528.     0xFE66,0x0000,0x0003,0x0000,0x0333,0xFD00,0xFE66,0x0000,
  529.     0x000C,0x0000,0x0033,0xFA80,0xFE3E,0x0000,0x0070,0x0000,
  530.     0x00E3,0xFD00,0xFE06,0x0000,0x0FDE,0x0000,0x0033,0xFA80,
  531.     0xFE0C,0x0001,0xFE07,0x8000,0x0333,0xFD00,0x7F38,0x003F,
  532.     0xC001,0xE000,0x01E7,0xFA80,0x7F00,0x03FE,0x0000,0x7800,
  533.     0x0007,0xF500,0x7F80,0x07E0,0x0000,0x1F00,0x000F,0xEA00,
  534.     0x3FC0,0x0000,0x0000,0x07C0,0x001F,0xF400,0x1FE0,0x7000,
  535.     0x0000,0x01F0,0x703F,0xEA00,0x0FF3,0x8000,0x0038,0x00FC,
  536.     0x0E7F,0xD400,0x07FC,0x0000,0x0060,0x003E,0x01FF,0xA800,
  537.     0x03FE,0x0006,0x00C0,0x0300,0x03FF,0x5000,0x01FF,0x800C,
  538.     0x00F8,0x0180,0x0FFE,0xA000,0x003F,0xF018,0x00CC,0x00C0,
  539.     0x7FF5,0x4000,0x000F,0x7E00,0x00CC,0x0003,0xF7AA,0x0000,
  540.     0x0001,0xF7E0,0x0078,0x003F,0xFD50,0x0000,0x0000,0x3E3F,
  541.     0xC000,0x1FED,0xEA80,0x0000,0x0000,0x07F0,0x7FFF,0xF07F,
  542.     0x5400,0x0000,0x0000,0x003F,0xE700,0x7FEA,0xA000,0x0000,
  543.     0x0000,0x0001,0x7FFF,0xF554,0x0000,0x0000,0x0000,0x0000,
  544.     0x02AA,0xAA00,0x0000,0x0000
  545. };
  546.  
  547.     /* This one binds the clock image data. */
  548.  
  549. struct Image ClockImage =
  550. {
  551.     0,0,
  552.     89,38,2,
  553.     (USHORT *)ClockMap,
  554.     0x03,0x00,
  555.     (struct Image *)NULL
  556. };
  557.  
  558.     /* The gadgets for the clock window. */
  559.  
  560. struct Gadget ClockGadget[2] =
  561. {
  562.     &ClockGadget[1],4,2, 88,38,GADGIMAGE | GADGHBOX,GADGIMMEDIATE | RELVERIFY,BOOLGADGET,(APTR)&ClockImage,NULL,NULL,0,NULL,0,NULL,
  563.     NULL,           0,0,294,42,GADGHNONE,           GADGIMMEDIATE,            WDRAGGING, NULL,             NULL,NULL,0,NULL,1,NULL
  564. };
  565.  
  566.     /* The clock window definitions. */
  567.  
  568. struct NewWindow NewClockWindow =
  569. {
  570.     0,0,
  571.     294,42,
  572.     1,3,
  573.     GADGETUP,
  574.     ACTIVATE | RMBTRAP,
  575.     (struct Gadget *)&ClockGadget[0],
  576.     (struct Image *)NULL,
  577.     (STRPTR)NULL,
  578.     (struct Screen *)NULL,
  579.     (struct BitMap *)NULL,
  580.     0,0,
  581.     0,0,
  582.     WBENCHSCREEN
  583. };
  584.  
  585.     /* Some more information text. */
  586.  
  587. struct IntuiText ClockTxt[4] =
  588. {
  589.     {1,0,2,98, 2,&DefaultFont,(UBYTE *)"This is DClock trying to",&ClockTxt[1]},
  590.     {1,0,2,98,10,&DefaultFont,(UBYTE *)"wake you up.  Click  the",&ClockTxt[2]},
  591.     {1,0,2,98,18,&DefaultFont,(UBYTE *)"clock to proceed.",       &ClockTxt[3]},
  592.     {3,0,0,98,31,&DefaultFont,(UBYTE *)"Alarm time » 12:12:12 « ", NULL}
  593. };
  594.  
  595.     /* Define the handler code as a function. */
  596.  
  597. extern void Handler();
  598.  
  599.     /* Some inline assembly code to deal with the
  600.      * input.device handler interrupt.
  601.      */
  602.  
  603. #asm
  604. _Handler:    MOVEM.L    A4,-(A7)    ; Save base register
  605.         MOVEM.L    A0/A1,-(A7)    ; Push both arguments onto stack
  606.  
  607.         JSR    _geta4#        ; Adjust the base register
  608.         JSR    _MyHandler    ; Call the handler routine
  609.  
  610.         ADDQ.L    #8,A7        ; Clear the contents of the stack
  611.  
  612.         MOVEM.L    (A7)+,A4    ; Restore the original base register
  613.  
  614.         RTS            ; Pass it to the next handler...
  615. #endasm
  616.  
  617.     /* MyHandler(Event,MyData) :
  618.      *
  619.      *    This is the main interface to the handler
  620.      *    routine.
  621.      */
  622.  
  623. struct InputEvent *
  624. MyHandler(Event)
  625. struct InputEvent *Event;
  626. {
  627.         /* User wants to toggle text and memory mode. */
  628.  
  629.     if(Event -> ie_Class == IECLASS_RAWKEY && Event -> ie_Code == 0x5F && Event -> ie_Qualifier == 0x8080)
  630.     {
  631.         Event -> ie_Class = IECLASS_NULL;
  632.  
  633.         if(DSeg -> Child)
  634.             Signal(DSeg -> Child,SIG_TOGGL);
  635.     }
  636.  
  637.         /* If we can use it, initialize the copyevent and signal
  638.          * the main process to produce a click.
  639.          */
  640.  
  641.     if(Event -> ie_Class == IECLASS_RAWKEY && !(Event -> ie_Code & IECODE_UP_PREFIX) && DSeg -> Click)
  642.     {
  643.         CopyEvent . ie_Class    = Event -> ie_Class;
  644.         CopyEvent . ie_Code    = Event -> ie_Code;
  645.         CopyEvent . ie_Qualifier= Event -> ie_Qualifier;
  646.  
  647.             /* This is safe from interrupt code, or
  648.              * at least should be.
  649.              */
  650.  
  651.         if(DSeg -> Child)
  652.             Signal(DSeg -> Child,SIG_CLICK);
  653.     }
  654.  
  655.         /* I had a lot of trouble getting DClock-Handler to
  656.          * work with timer.device. Well, the only thing
  657.          * happening in time were system crashes, so I
  658.          * decided to use the timer entries of the
  659.          * InputEvent structures. Don't be confused by the
  660.          * strange way I check the time (< and >). This is
  661.          * due to the fact that the time may have been adjusted
  662.          * to a point of time which has already passed.
  663.          * In this case you would have had to wait for
  664.          * about one minute to see the time string update (this
  665.          * bug was removed in version 1.4).
  666.          */
  667.  
  668.     if(Event -> ie_TimeStamp . tv_secs > DSeg -> LastSecs || Event -> ie_TimeStamp . tv_secs < DSeg -> LastSecs)
  669.     {
  670.         DSeg -> LastSecs = Event -> ie_TimeStamp . tv_secs;
  671.  
  672.         if(DSeg -> Child)
  673.             Signal(DSeg -> Child,SIG_TIMER);
  674.     }
  675.  
  676.     return(Event);
  677. }
  678.  
  679.     /* Click() :
  680.      *
  681.      *    Produces the click (or what did you expect?).
  682.      */
  683.  
  684. void
  685. Click()
  686. {
  687.     struct Message *AudioMsg;
  688.     char PrimaryBuffer[11];    /* Rawkey conversion buffer. */
  689.     register short i;
  690.  
  691.         /* Erase the buffer. */
  692.  
  693.     for(i = 0 ; i < 11 ; i++)
  694.         PrimaryBuffer[i] = 0;
  695.  
  696.         /* Convert the input event according to the
  697.          * current keymap settings.
  698.          */
  699.  
  700.     RawKeyConvert(&CopyEvent,PrimaryBuffer,10,NULL);
  701.  
  702.         /* If it didn't produce a sensible result,
  703.          * don't click.
  704.          */
  705.  
  706.     if(!PrimaryBuffer[0])
  707.         return;
  708.  
  709.     Audio -> ioa_Volume = DSeg -> ClickVolume;
  710.  
  711.         /* If it's still resounding, abort it. */
  712.  
  713. Tick:    if(!CheckIO(Audio))
  714.         AbortIO(Audio);
  715.  
  716.         /* Let it click. */
  717.  
  718.     BeginIO(Audio);
  719. }
  720.  
  721.     /* FlushSound() :
  722.      *
  723.      *    Send the sound control data to NIL:
  724.      */
  725.  
  726. void
  727. FlushSound()
  728. {
  729.         /* Audio device still open? */
  730.  
  731.     if(Audio -> ioa_Request . io_Device)
  732.     {
  733.         if(!CheckIO(Audio))
  734.             WaitIO(Audio);
  735.  
  736.             /* Free the channel(s). */
  737.  
  738.         Audio -> ioa_Request . io_Command = ADCMD_FREE;
  739.         DoIO(Audio);
  740.  
  741.         CloseDevice(Audio);
  742.     }
  743.  
  744.         /* Free the audio control block. */
  745.  
  746.     if(Audio)
  747.         FreeMem(Audio,sizeof(struct IOAudio));
  748.  
  749.         /* Delete the replyport. */
  750.  
  751.     if(AudioPort)
  752.         DeletePort(AudioPort);
  753. }
  754.  
  755.     /* InitSound() :
  756.      *
  757.      *    Sets up the audio control structures.
  758.      */
  759.  
  760. BOOL
  761. InitSound()
  762. {
  763.     if(!(Audio = (struct IOAudio *)AllocMem(sizeof(struct IOAudio),MEMF_PUBLIC | MEMF_CLEAR)))
  764.         return(FALSE);
  765.  
  766.     if(!(AudioPort = (struct MsgPort *)CreatePort(NULL,0)))
  767.         return(FALSE);
  768.  
  769.         /* Try to allocate a vacant channel. Sam Dicker suggests
  770.          * channel allocation precedence 90 for annunciators.
  771.          */
  772.  
  773.     Audio -> ioa_Request . io_Command            = ADCMD_ALLOCATE;
  774.     Audio -> ioa_Request . io_Message . mn_Node . ln_Pri    = 90;
  775.     Audio -> ioa_Request . io_Message . mn_ReplyPort    = AudioPort;
  776.     Audio -> ioa_Data                    = AnyChannel;
  777.     Audio -> ioa_Length                    = 4;
  778.  
  779.         /* Open the channel. */
  780.  
  781.     if(OpenDevice(AUDIONAME,0,Audio,0))
  782.         return(FALSE);
  783.  
  784.         /* Prepare it for the click. */
  785.  
  786.     Audio -> ioa_Request . io_Flags        = ADIOF_PERVOL | ADIOF_NOWAIT;
  787.     Audio -> ioa_Request . io_Command    = CMD_WRITE;
  788.     Audio -> ioa_Period            = 180;
  789.     Audio -> ioa_Volume            = 0;
  790.     Audio -> ioa_Length            = 270;
  791.     Audio -> ioa_Data            = (UBYTE *)SoundData;
  792.     Audio -> ioa_Cycles            = 1;
  793.  
  794.         /* This first sound will not be heard since
  795.          * the audio.device needs a sound to be played
  796.          * at least once to work properly. Since there
  797.          * was no keypress yet, don't confuse the user.
  798.          */
  799.  
  800.     BeginIO(Audio);
  801.     WaitIO(Audio);
  802.  
  803.         /* Adjust the volume now. */
  804.  
  805.     Audio -> ioa_Volume = 64;
  806.  
  807.     return(TRUE);
  808. }
  809.  
  810.     /* InitHandler() :
  811.      *
  812.      *    Open the console.device for keymap translation
  813.      *    and add the input.device handler.
  814.      */
  815.  
  816. BOOL
  817. InitHandler()
  818. {
  819.     if(OpenDevice("console.device",-1,&ConStdReq,0))
  820.         return(FALSE);
  821.  
  822.     ConsoleDevice = (long)ConStdReq . io_Device;
  823.  
  824.     if(!(InputDevPort = (struct MsgPort *)CreatePort(NULL,0)))
  825.         return(FALSE);
  826.  
  827.     if(!(InputRequestBlock = (struct IOStdReq *)CreateStdIO(InputDevPort)))
  828.         return(FALSE);
  829.  
  830.     if(OpenDevice("input.device",0,InputRequestBlock,0))
  831.         return(FALSE);
  832.  
  833.     HandlerStuff . is_Code        = Handler;
  834.     HandlerStuff . is_Node . ln_Pri    = 60;
  835.     HandlerStuff . is_Node . ln_Name= "DClock-Handler";
  836.  
  837.     InputRequestBlock -> io_Command    = IND_ADDHANDLER;
  838.     InputRequestBlock -> io_Data    = (APTR)&HandlerStuff;
  839.  
  840.     DoIO(InputRequestBlock);
  841.  
  842.     return(TRUE);
  843. }
  844.  
  845.     /* FlushHandler() :
  846.      *
  847.      *    Closes the console.device and removes the
  848.      *    input.device handler from the chain.
  849.      */     
  850.  
  851. void
  852. FlushHandler()
  853. {
  854.     if(ConsoleDevice)
  855.         CloseDevice(&ConStdReq);
  856.  
  857.     if(InputRequestBlock -> io_Device)
  858.     {
  859.         InputRequestBlock -> io_Command    = IND_REMHANDLER;
  860.         InputRequestBlock -> io_Data    = (APTR)&HandlerStuff;
  861.  
  862.         DoIO(InputRequestBlock);
  863.  
  864.         CloseDevice(InputRequestBlock);
  865.     }
  866.  
  867.     if(InputRequestBlock)
  868.         DeleteStdIO(InputRequestBlock);
  869.  
  870.     if(InputDevPort)
  871.         DeletePort(InputDevPort);
  872. }
  873.  
  874.     /* Define these externally to make the SetFunction() calls
  875.      * possible.
  876.      */
  877.  
  878. extern void NewDisplayBeep();
  879.  
  880.     /* Embedded assembly fragment, handles our replacement call
  881.      * for DisplayBeep().
  882.      */
  883.  
  884. #asm
  885. _NewDisplayBeep:MOVEM.L    D2/D3/A4/A6,-(SP)    ; Save some registers
  886.  
  887.         MOVE.L    A0,-(SP)        ; Push NewWindow onto stack
  888.  
  889.         JSR    _geta4#            ; Tickle the base register
  890.         JSR    _ModifiedDisplayBeep    ; Call our magic creation
  891.  
  892.         ADD.W    #4,SP            ; Clean the stack up
  893.  
  894.         CLR.L    D0            ; Just in case...
  895.  
  896.         MOVEM.L    (SP)+,D2/D3/A4/A6    ; Restore some registers
  897.  
  898.         RTS                ; Bye...
  899. #endasm
  900.  
  901.     /* AudioBeep():
  902.      *
  903.      *    Funny beep routine, originally developed by
  904.      *    John Hodgson as a NewZAP support routine.
  905.      *    Carefully rewritten to be reentrant beyond
  906.      *    any measure (Yechh!).
  907.      */
  908.  
  909. void
  910. AudioBeep()
  911. {
  912.     register struct IOAudio    *AudioBlock;
  913.     register struct MsgPort    *ReplyPort;
  914.     register UBYTE        *WaveMap;
  915.  
  916.         /* No beeping? */
  917.  
  918.     if(!DSeg -> Beep)
  919.         return;
  920.  
  921.         /* Eight bytes for channel allocation and
  922.          * square wave? Not bad, what do you think?
  923.          */
  924.  
  925.     if(WaveMap = (UBYTE *)AllocMem(8,MEMF_CHIP))
  926.     {
  927.             /* Cheapo square wave. */
  928.  
  929.         WaveMap[0] = ~127;
  930.         WaveMap[1] = ~127;
  931.         WaveMap[2] =  127;
  932.         WaveMap[3] =  127;
  933.  
  934.             /* This will give us any audio channel. */
  935.  
  936.         WaveMap[4] = 1;
  937.         WaveMap[5] = 2;
  938.         WaveMap[6] = 4;
  939.         WaveMap[7] = 8;
  940.  
  941.             /* Allocate some driver memory. */
  942.  
  943.         if(AudioBlock = (struct IOAudio *)AllocMem(sizeof(struct IOAudio),MEMF_PUBLIC | MEMF_CLEAR))
  944.         {
  945.                 /* Time for a replyport? */
  946.  
  947.             if(ReplyPort = (struct MsgPort *)CreatePort(NULL,0))
  948.             {
  949.                     /* Setup initial driver data. */
  950.  
  951.                 AudioBlock -> ioa_Data                    = &WaveMap[4];
  952.                 AudioBlock -> ioa_Length                = 4;
  953.                 AudioBlock -> ioa_Request . io_Message . mn_ReplyPort    = ReplyPort;
  954.                 AudioBlock -> ioa_Request . io_Message . mn_Node.ln_Pri    = 90;
  955.  
  956.                     /* Allocate the channels on the fly. */
  957.  
  958.                 if(!OpenDevice("audio.device",0,AudioBlock,0))
  959.                 {
  960.                     AudioBlock -> ioa_Request . io_Command    = CMD_WRITE;
  961.                     AudioBlock -> ioa_Request . io_Flags    = ADIOF_PERVOL;
  962.                     AudioBlock -> ioa_Period        = 447;
  963.                     AudioBlock -> ioa_Volume        = 64 / 2;
  964.                     AudioBlock -> ioa_Cycles        = 150;
  965.                     AudioBlock -> ioa_Data            = &WaveMap[0];
  966.                     AudioBlock -> ioa_Length        = 4;
  967.  
  968.                         /* Beeep! */
  969.  
  970.                     BeginIO(AudioBlock);
  971.                     WaitIO(AudioBlock);
  972.  
  973.                         /* Tick! */
  974.  
  975.                     CloseDevice(AudioBlock);
  976.                 }
  977.  
  978.                 DeletePort(ReplyPort);
  979.             }
  980.  
  981.             FreeMem(AudioBlock,sizeof(struct IOAudio));
  982.         }
  983.  
  984.         FreeMem(WaveMap,8);
  985.     }
  986. }
  987.  
  988.     /* VideoBeep(Screen,Perform):
  989.      *
  990.      *    Handles the visual part of the DisplayBeep,
  991.      *    flashes a particular screen or restores its
  992.      *    original colour (well, hope so).
  993.      */
  994.  
  995. void
  996. VideoBeep(Screen,Perform)
  997. register struct Screen *Screen;
  998. register BOOL Perform;
  999. {
  1000.         /* Beep this screen? */
  1001.  
  1002.     if(Perform)
  1003.     {
  1004.             /* Is it already beeping? */
  1005.  
  1006.         if(!(Screen -> Flags & BEEPING))
  1007.         {
  1008.             register UBYTE R,G,B;
  1009.  
  1010.                 /* This one's beeping. */
  1011.  
  1012.             Screen -> Flags |= BEEPING;
  1013.  
  1014.                 /* Don't forget this one. */
  1015.  
  1016.             Screen -> SaveColor0 = GetRGB4(Screen -> ViewPort . ColorMap,0);
  1017.  
  1018.                 /* Reverse the colour. */
  1019.  
  1020.             R = ((Screen -> SaveColor0 >> 8) & 0xF) ^ 0xF;
  1021.             G = ((Screen -> SaveColor0 >> 4) & 0xF) ^ 0xF;
  1022.             B = ((Screen -> SaveColor0     ) & 0xF) ^ 0xF;
  1023.  
  1024.                 /* Set it. */
  1025.  
  1026.             SetRGB4(&Screen -> ViewPort,0,R,G,B);
  1027.         }
  1028.     }
  1029.     else
  1030.     {
  1031.             /* Is this one beeping? */
  1032.  
  1033.         if(Screen -> Flags & BEEPING)
  1034.         {
  1035.             register UBYTE R,G,B;
  1036.  
  1037.                 /* This one isn't beeping any longer. */
  1038.  
  1039.             Screen -> Flags &= ~BEEPING;
  1040.  
  1041.                 /* Restore the saved colour. */
  1042.  
  1043.             R = ((Screen -> SaveColor0 >> 8) & 0xF);
  1044.             G = ((Screen -> SaveColor0 >> 4) & 0xF);
  1045.             B = ((Screen -> SaveColor0     ) & 0xF);
  1046.  
  1047.             SetRGB4(&Screen -> ViewPort,0,R,G,B);
  1048.         }
  1049.     }
  1050. }
  1051.  
  1052.     /* ModifiedDisplayBeep(Screen):
  1053.      *
  1054.      *    Magic replacement for usual DisplayBeep()
  1055.      *    function.
  1056.      */
  1057.  
  1058. void
  1059. ModifiedDisplayBeep(Screen)
  1060. register struct Screen *Screen;
  1061. {
  1062.         /* Flash a particular screen. */
  1063.  
  1064.     if(Screen)
  1065.     {
  1066.         VideoBeep(Screen,TRUE);
  1067.         AudioBeep();
  1068.         VideoBeep(Screen,FALSE);
  1069.     }
  1070.     else
  1071.     {
  1072.             /* Flash all screens. */
  1073.  
  1074.         register ULONG IntuiLock;
  1075.  
  1076.         Forbid();
  1077.  
  1078.             /* Where's the first one? Has anybody
  1079.              * used the LockIBase() function so
  1080.              * far (save me)?
  1081.              */
  1082.  
  1083.         IntuiLock = LockIBase(NULL);
  1084.         Screen = IntuitionBase -> FirstScreen;
  1085.         UnlockIBase(IntuiLock);
  1086.  
  1087.             /* Walk through the screens flashing them all. */
  1088.  
  1089.         do
  1090.             VideoBeep(Screen,TRUE);
  1091.         while(Screen = Screen -> NextScreen);
  1092.  
  1093.             /* Let it resound. */
  1094.  
  1095.         AudioBeep();
  1096.  
  1097.             /* Again: where's the first screen? */
  1098.  
  1099.         IntuiLock = LockIBase(NULL);
  1100.         Screen = IntuitionBase -> FirstScreen;
  1101.         UnlockIBase(IntuiLock);
  1102.  
  1103.         do
  1104.             VideoBeep(Screen,FALSE);
  1105.         while(Screen = Screen -> NextScreen);
  1106.  
  1107.         Permit();
  1108.     }
  1109. }
  1110.  
  1111.     /* PrintIt(TimeBuff):
  1112.      *
  1113.      *    Prints the formatted string into the Workbench title bar.
  1114.      */
  1115.  
  1116. void
  1117. PrintIt(TimeBuff)
  1118. UBYTE *TimeBuff;
  1119. {
  1120.     TimeString . IText = TimeBuff;
  1121.  
  1122.     TimeString . FrontPen    = DSeg -> TextColour;
  1123.     TimeString . BackPen    = DSeg -> BackColour;
  1124.  
  1125.     PrintIText(Window -> RPort,&TimeString,0,0);
  1126. }
  1127.  
  1128.     /* Some more embedded assembly language code, originally
  1129.      * written by Justin V. McCormick. Uses the ROM printf
  1130.      * routine to generate a formatted string, then calls
  1131.      * PrintIt to print it somewhere. This fragment once was
  1132.      * part of Justin's 'Emit' program.
  1133.      */
  1134.  
  1135. #asm
  1136. _LVORawDoFmt    EQU    $FFFFFDF6
  1137.  
  1138. stuffchar:    MOVE.B    D0,(A3)+
  1139.         RTS
  1140.  
  1141.         XDEF    _Format
  1142.  
  1143. _Format:    MOVE.L     4(SP),D1
  1144.         MOVE.L     8(SP),D0
  1145.         LEA    12(SP),A1
  1146.  
  1147.         MOVEM.L    A0-A3,-(SP)
  1148.  
  1149.         MOVE.L    D1,A3
  1150.         MOVE.L    D0,A0
  1151.         LEA    stuffchar(PC),A2
  1152.         MOVE.L    4,A6
  1153.         JSR    _LVORawDoFmt(A6)
  1154.  
  1155.         MOVEM.L    (SP)+,A0-A3
  1156.         CLR.L    D0
  1157.  
  1158.         RTS
  1159. #endasm
  1160.  
  1161.     /* Ring():
  1162.      *
  1163.      *    This one rings the bell of the alarm clock.
  1164.      */
  1165.  
  1166. void
  1167. Ring()
  1168. {
  1169.     register struct IOAudio    *AudioBlock;
  1170.     register struct MsgPort    *ReplyPort;
  1171.  
  1172.     struct Screen        PublicScreen;
  1173.     struct Window        *ClockWindow;
  1174.     struct IntuiMessage    *Massage;
  1175.  
  1176.     ULONG        Class;
  1177.     USHORT        Code;
  1178.     struct Gadget    *ID;
  1179.  
  1180.     ULONG IntuiLock;
  1181.     struct View *ViewLord;
  1182.  
  1183.     short DyOffset,PlusY;
  1184.  
  1185.         /* No alarm? */
  1186.  
  1187.     if(!DSeg -> Alarm)
  1188.         return;
  1189.  
  1190.         /* Center the clock window. */
  1191.  
  1192.     GetScreenData(&PublicScreen,sizeof(struct Screen),WBENCHSCREEN,NULL);
  1193.  
  1194.     NewClockWindow . LeftEdge = (PublicScreen . Width - NewClockWindow . Width) / 2;
  1195.     NewClockWindow . TopEdge = (PublicScreen . Height - NewClockWindow . Height) / 2;
  1196.  
  1197.         /* Open it and paint the background. */
  1198.  
  1199.     if(!(ClockWindow = (struct Window *)OpenWindow(&NewClockWindow)))
  1200.         return;
  1201.  
  1202.     SetAPen(ClockWindow -> RPort,1);
  1203.  
  1204.     RectFill(ClockWindow -> RPort,2,1,ClockWindow -> Width - 3,ClockWindow -> Height - 2);
  1205.  
  1206.     RefreshGadgets(&ClockGadget[0],ClockWindow,NULL);
  1207.  
  1208.         /* Adjust the contents of the alarm time string. */
  1209.  
  1210.     Format(ClockTxt[3] . IText,"Alarm time » %2ld:%2ld:%2ld «",DSeg -> AlarmHour,DSeg -> AlarmMinute,DSeg -> AlarmSecond);
  1211.  
  1212.     PrintIText(ClockWindow -> RPort,&ClockTxt[0],0,0);
  1213.  
  1214.         /* Allocate some driver memory. */
  1215.  
  1216.     if(AudioBlock = (struct IOAudio *)AllocMem(sizeof(struct IOAudio),MEMF_PUBLIC | MEMF_CLEAR))
  1217.     {
  1218.             /* Time for a replyport? */
  1219.  
  1220.         if(ReplyPort = (struct MsgPort *)CreatePort(NULL,0))
  1221.         {
  1222.                 /* Setup initial driver data. */
  1223.  
  1224.             AudioBlock -> ioa_Data                    = &AnyChannel[0];
  1225.             AudioBlock -> ioa_Length                = 4;
  1226.             AudioBlock -> ioa_Request . io_Message . mn_ReplyPort    = ReplyPort;
  1227.             AudioBlock -> ioa_Request . io_Message . mn_Node.ln_Pri    = 90;
  1228.  
  1229.                 /* Allocate the channels on the fly. */
  1230.  
  1231.             if(!OpenDevice("audio.device",0,AudioBlock,0))
  1232.             {
  1233.                 AudioBlock -> ioa_Request . io_Command    = CMD_WRITE;
  1234.                 AudioBlock -> ioa_Request . io_Flags    = ADIOF_PERVOL;
  1235.                 AudioBlock -> ioa_Period        = 308;
  1236.                 AudioBlock -> ioa_Volume        = 64;
  1237.                 AudioBlock -> ioa_Cycles        = 8;
  1238.                 AudioBlock -> ioa_Data            = (UBYTE *)&RingData[0];
  1239.                 AudioBlock -> ioa_Length        = 7326;
  1240.  
  1241.                 IntuiLock = LockIBase(NULL);
  1242.                 ViewLord = &IntuitionBase -> ViewLord;
  1243.                 UnlockIBase(IntuiLock);
  1244.  
  1245.                 DyOffset = ViewLord -> DyOffset;
  1246.  
  1247.                     /* Ring! */
  1248.  
  1249.                 BeginIO(AudioBlock);
  1250.  
  1251.                 WBenchToFront();
  1252.  
  1253.                     /* Ring until somebody clicked our window. */
  1254.  
  1255.                 FOREVER
  1256.                 {
  1257.                         /* Cycles already finished. */
  1258.  
  1259.                     if(CheckIO(AudioBlock))
  1260.                         BeginIO(AudioBlock);
  1261.  
  1262.                     Class = Code = NULL;
  1263.  
  1264.                     if(Massage = (struct IntuiMessage *)GetMsg(ClockWindow -> UserPort))
  1265.                     {
  1266.                         Class = Massage -> Class;
  1267.                         Code  = Massage -> Code;
  1268.                         ID    = (struct Gadget *)Massage -> IAddress;
  1269.  
  1270.                         ReplyMsg(Massage);
  1271.  
  1272.                         if(Class == GADGETUP && !ID -> GadgetID)
  1273.                             break;
  1274.                     }
  1275.  
  1276.                     PlusY = 1 - RangeRand(3);
  1277.  
  1278.                         /* Make the view vibrate. */
  1279.  
  1280.                     if(DyOffset + PlusY >= 0)
  1281.                         ViewLord -> DyOffset = DyOffset + PlusY;
  1282.  
  1283.                     RethinkDisplay();
  1284.  
  1285.                         /* Wait a tick. */
  1286.  
  1287.                     Delay(1);
  1288.                 }
  1289.  
  1290.                 ViewLord -> DyOffset = DyOffset;
  1291.                 RethinkDisplay();
  1292.  
  1293.                     /* Still ringing? */
  1294.  
  1295.                 if(!CheckIO(AudioBlock))
  1296.                     AbortIO(AudioBlock);
  1297.  
  1298.                     /* Tick! */
  1299.  
  1300.                 CloseDevice(AudioBlock);
  1301.             }
  1302.  
  1303.             DeletePort(ReplyPort);
  1304.         }
  1305.  
  1306.         FreeMem(AudioBlock,sizeof(struct IOAudio));
  1307.     }
  1308.  
  1309.     CloseWindow(ClockWindow);
  1310. }
  1311.  
  1312.     /* ShowTime():
  1313.      *
  1314.      *    Yes, it's Showtime! This one compiles the date/timestring
  1315.      *    and prints it.
  1316.      */
  1317.  
  1318. void
  1319. ShowTime()
  1320. {
  1321.     UBYTE TempBuff[30];
  1322.  
  1323.     static char *Months[12] =
  1324.     {
  1325.         "Jan","Feb","Mar",
  1326.         "Apr","May","Jun",
  1327.         "Jul","Aug","Sep",
  1328.         "Oct","Nov","Dec"
  1329.     };
  1330.  
  1331.     static char *Days[7] =
  1332.     {
  1333.         "Sun",    /* Note: these have to appear right in this order. */
  1334.         "Mon",
  1335.         "Tue",
  1336.         "Wed",
  1337.         "Thu",
  1338.         "Fri",
  1339.         "Sat"
  1340.     };
  1341.  
  1342.     struct DateStamp Date;
  1343.  
  1344.     long n,Month,Day,Year;
  1345.  
  1346.     DateStamp(&Date);
  1347.  
  1348.         /* Credits go to Tom Rokicki for his DateStamp
  1349.          * conversion routine.
  1350.          */
  1351.  
  1352.     n = Date . ds_Days - 2251;
  1353.     Year = (4 * n + 3) / 1461;
  1354.     n -= 1461 * Year / 4;
  1355.     Year += 1984;
  1356.     Month = (5 * n + 2) / 153;
  1357.     Day = n - (153 * Month + 2) / 5 + 1;
  1358.     Month += 3;
  1359.  
  1360.     if(Month > 12)
  1361.     {
  1362.         Year++;
  1363.         Month -= 12;
  1364.     }
  1365.  
  1366.         /* Took some time to develop the weekday conversion.
  1367.          * Please don't ask me how it works, I really don't know.
  1368.          * The formula was translated from BASIC, which was
  1369.          * quite a tricky thing to do: I haven't done anything
  1370.          * in BASIC for at least 2 years.
  1371.          */
  1372.  
  1373.     Format(TempBuff,"%s %02ld-%s-%2ld %02ld:%02ld:%02ld",
  1374.         Days[(Day + Year + (Year - (Month < 3)) / 4 + 3 * Month - 2 * (Month > 2) - (Month - 1 - (Month > 8)) / 2 + 2) % 7],
  1375.         Day,
  1376.         Months[Month - 1],
  1377.         Year - 1900,
  1378.         Date . ds_Minute / 60,
  1379.         Date . ds_Minute % 60,
  1380.         Date . ds_Tick / TICKS_PER_SECOND);
  1381.  
  1382.     PrintIt(TempBuff);
  1383. }
  1384.  
  1385.     /* MaxMemSize(MemType):
  1386.      *
  1387.      *    Returns the length of memory block of a special
  1388.      *    kind. Borrowed from Louis A. Mamakos' GfxMem 0.4.
  1389.      */
  1390.  
  1391. ULONG
  1392. MaxMemSize(MemType)
  1393. ULONG MemType;
  1394. {
  1395.     ULONG BlockSize = 0;
  1396.     struct MemHeader *MemHeader;
  1397.     extern struct ExecBase *SysBase;
  1398.  
  1399.     Forbid();
  1400.  
  1401.         /* Walk through the memory lists adding the
  1402.          * amount of memory bound to them.
  1403.          */
  1404.  
  1405.     for(MemHeader = (struct MemHeader *)SysBase -> MemList . lh_Head ; MemHeader -> mh_Node . ln_Succ ; MemHeader = (struct MemHeader *)MemHeader -> mh_Node . ln_Succ)
  1406.         if(MemHeader -> mh_Attributes & MemType)
  1407.             BlockSize += ((ULONG)MemHeader -> mh_Upper - (ULONG)MemHeader -> mh_Lower);
  1408.  
  1409.     Permit();
  1410.  
  1411.     return(BlockSize);
  1412. }
  1413.  
  1414.     /* _main():
  1415.      *
  1416.      *    Modified Aztec C startup-routine, no CLI parsing,
  1417.      *    no Workbench parsing, absolutely nothing.
  1418.      */
  1419.  
  1420. long
  1421. _main()
  1422. {
  1423.     long OldDisplayBeep;
  1424.     ULONG SignalSet,MemSize,MaxSize;
  1425.     short TextMode = 0;
  1426.     struct DateStamp Date;
  1427.  
  1428.     register struct Process *ThatsMe = (struct Process *)FindTask(NULL);
  1429.  
  1430.         /* If somebody called us from CLI... */
  1431.  
  1432.     if(ThatsMe -> pr_CLI)
  1433.         return(10);
  1434.  
  1435.         /* Is the DSeg structure anywhere? */
  1436.  
  1437.     if(!(DSeg = (struct DSeg *)FindPort(PORTNAME)))
  1438.         return(10);
  1439.  
  1440.         /* Check if it's below our current revision
  1441.          * number (probably doesn't support some
  1442.          * structure tags).
  1443.          */
  1444.  
  1445.     if(DSeg -> Revision < REVISION)
  1446.         return(10);
  1447.  
  1448.         /* Open those libraries. */
  1449.  
  1450.     if(!(IntuitionBase = (struct IntuitionBase *)OpenLibrary("intuition.library",0)))
  1451.         return(20);
  1452.  
  1453.     if(!(GfxBase = (struct GfxBase *)OpenLibrary("graphics.library",0)))
  1454.     {
  1455.         CloseLibrary(IntuitionBase);
  1456.  
  1457.         return(20);
  1458.     }
  1459.  
  1460.         /* Open the backdrop window. */
  1461.  
  1462.     if(!(Window = (struct Window *)OpenWindow(&NewWindow)))
  1463.     {
  1464.         CloseLibrary(IntuitionBase);
  1465.         CloseLibrary(GfxBase);
  1466.  
  1467.         return(20);
  1468.     }
  1469.  
  1470.         /* Initialize the click sound data. */
  1471.  
  1472.     if(!InitSound())
  1473.     {
  1474.         FlushSound();
  1475.  
  1476.         CloseWindow(Window);
  1477.         CloseLibrary(IntuitionBase);
  1478.         CloseLibrary(GfxBase);
  1479.  
  1480.         return(20);
  1481.     }
  1482.  
  1483.         /* Install the handler code. */
  1484.  
  1485.     if(!InitHandler())
  1486.     {
  1487.         FlushHandler();
  1488.         FlushSound();
  1489.  
  1490.         CloseWindow(Window);
  1491.         CloseLibrary(IntuitionBase);
  1492.         CloseLibrary(GfxBase);
  1493.  
  1494.         return(20);
  1495.     }
  1496.  
  1497.         /* Just a short info... */
  1498.  
  1499.     SetWindowTitles(Window,-1,"DClock v1.5 © Copyright 1989 by ED Hannover");
  1500.  
  1501.         /* Fill the window and bring it to the front. */
  1502.  
  1503.     ShowTime();
  1504.     ShowTitle(Window -> WScreen,FALSE);
  1505.  
  1506.         /* Patch system function. */
  1507.  
  1508.     Forbid();
  1509.     OldDisplayBeep = SetFunction(IntuitionBase,-0x60,NewDisplayBeep);
  1510.     Permit();
  1511.  
  1512.         /* Now we are truly running. */
  1513.  
  1514.     DSeg -> Child = (struct Task *)FindTask(NULL);
  1515.  
  1516.         /* How much memory is there around in this
  1517.          * Amiga?
  1518.          */
  1519.  
  1520.     MaxSize = MaxMemSize(MEMF_CHIP) + MaxMemSize(MEMF_FAST);
  1521.  
  1522.         /* Go into infinite loop waiting for signals. */
  1523.  
  1524.     FOREVER
  1525.     {
  1526.         register struct IntuiMessage *TempMessage;
  1527.  
  1528.         SignalSet = Wait(SIG_TIMER | SIG_CLOSE | SIG_CLICK | SIG_TOGGL);
  1529.  
  1530.             /* Remove any window event, this happens each second. */
  1531.  
  1532.         if(TempMessage = (struct IntuiMessage *)GetMsg(Window -> UserPort))
  1533.             ReplyMsg(TempMessage);
  1534.  
  1535.             /* Change the display mode? */
  1536.  
  1537.         if(SignalSet & SIG_TOGGL)
  1538.         {
  1539.             TextMode++;
  1540.  
  1541.             SetRast(Window -> RPort,1);
  1542.             DrawImage(Window -> RPort,&ImageE,0,0);
  1543.  
  1544.             if(TextMode == 3)
  1545.                 TextMode = 0;
  1546.         }
  1547.  
  1548.             /* Are we to click? */
  1549.  
  1550.         if((SignalSet & SIG_CLICK) && DSeg -> Click)
  1551.             Click();
  1552.  
  1553.             /* Are we to shut down? */
  1554.  
  1555.         if(SignalSet & SIG_CLOSE)
  1556.         {
  1557.             SetRast(Window -> RPort,1);
  1558.  
  1559.                 /* Restore system function. */
  1560.  
  1561.             Forbid();
  1562.             SetFunction(IntuitionBase,-0x60,OldDisplayBeep);
  1563.             Permit();
  1564.  
  1565.             ShowTitle(Window -> WScreen,TRUE);
  1566.  
  1567.             FlushHandler();
  1568.             FlushSound();
  1569.  
  1570.             CloseWindow(Window);
  1571.             CloseLibrary(IntuitionBase);
  1572.             CloseLibrary(GfxBase);
  1573.  
  1574.                 /* Goodbye father. */
  1575.  
  1576.             if(DSeg -> Father)
  1577.                 Signal(DSeg -> Father,SIGBREAKF_CTRL_D);
  1578.  
  1579.                 /* Sneak out before someone can
  1580.                  * UnLoadPrg() us.
  1581.                  */
  1582.  
  1583.             Forbid();
  1584.  
  1585.             return(0);
  1586.         }
  1587.  
  1588.             /* Just a time check... */
  1589.  
  1590.         DateStamp(&Date);
  1591.  
  1592.             /* Ready to ring the bell? */
  1593.  
  1594.         if((Date . ds_Minute / 60 == DSeg -> AlarmHour) &&
  1595.            (Date . ds_Minute % 60 == DSeg -> AlarmMinute) &&
  1596.            (Date . ds_Tick / TICKS_PER_SECOND == DSeg -> AlarmSecond) &&
  1597.             DSeg -> Alarm)
  1598.             Ring();
  1599.  
  1600.             /* Show time and date. */
  1601.  
  1602.         if(TextMode == 0)
  1603.             ShowTime();
  1604.  
  1605.             /* Show memory display. */
  1606.  
  1607.         if(TextMode == 1)
  1608.         {
  1609.             long BarLength;
  1610.  
  1611.                 /* How much memory is still available? */
  1612.  
  1613.             MemSize = AvailMem(MEMF_CHIP) + AvailMem(MEMF_FAST);
  1614.  
  1615.                 /* How long will the bar be? */
  1616.  
  1617.             BarLength = (152 * MemSize) / MaxSize;
  1618.  
  1619.                 /* Draw the full part. */
  1620.  
  1621.             SetAPen(Window -> RPort,3);
  1622.             RectFill(Window -> RPort,12,0,164 - BarLength,7);
  1623.  
  1624.                 /* Add the empty part. */
  1625.  
  1626.             SetAPen(Window -> RPort,2);
  1627.             RectFill(Window -> RPort,165 - BarLength,0,163,7);
  1628.         }
  1629.  
  1630.             /* Numeric memory display. */
  1631.  
  1632.         if(TextMode == 2)
  1633.         {
  1634.             UBYTE TempBuff[30];
  1635.  
  1636.             Format(TempBuff,"C: %07ld  F: %07ld",AvailMem(MEMF_CHIP),AvailMem(MEMF_FAST));
  1637.             PrintIt(TempBuff);
  1638.         }
  1639.     }
  1640. }
  1641.