home *** CD-ROM | disk | FTP | other *** search
/ Magazyn Amiga 5 / MA_Cover_5.iso / ppc / atari / atari800-0.8.6 / atari_amiga.c < prev    next >
Encoding:
C/C++ Source or Header  |  1998-05-10  |  78.8 KB  |  3,694 lines

  1. /*
  2.  * ==========================
  3.  * Atari800 - Amiga Port Code
  4.  * ==========================
  5.  */
  6.  
  7. /*
  8.  * Revision     : v0.3.3
  9.  * Introduced   : NOT KNOWN (Before 2nd September 1995)
  10.  * Last updated : 7th March 1996
  11.  *
  12.  *
  13.  *
  14.  * Introduction:
  15.  *
  16.  * This file contains all the additional code required to get the Amiga
  17.  * port of the Atari800 emulator up and running.
  18.  *
  19.  * See "Atari800.guide" for info
  20.  */
  21.  
  22.  
  23.  
  24. #include <clib/asl_protos.h>
  25. #include <clib/exec_protos.h>
  26. #include <devices/gameport.h>
  27. #include <devices/inputevent.h>
  28. #include <dos/dos.h>
  29. #include <dos/dostags.h>
  30. #include <exec/libraries.h>
  31. #include <exec/memory.h>
  32. #include <exec/types.h>
  33. #include <intuition/intuition.h>
  34. #include <libraries/asl.h>
  35. #include <stdio.h>
  36. #include <string.h>
  37. #include <workbench/workbench.h>
  38.  
  39. static char *rcsid = "$Id: atari_amiga.c,v 1.7 1998/02/21 14:54:11 david Exp $";
  40.  
  41. #include "atari.h"
  42. #include "colours.h"
  43.  
  44. #define GAMEPORT0 0
  45. #define GAMEPORT1 1
  46.  
  47. #define OCS_ChipSet 0
  48. #define ECS_ChipSet 1
  49. #define AGA_ChipSet 2
  50.  
  51. #ifdef DICE_C
  52. static struct IntuitionBase *IntuitionBase = NULL;
  53. static struct GfxBase *GfxBase = NULL;
  54. static struct LayersBase *LayersBase = NULL;
  55. static struct Library *AslBase = NULL;
  56. #endif
  57.  
  58. #ifdef GNU_C
  59. struct IntuitionBase *IntuitionBase = NULL;
  60. struct GfxBase *GfxBase = NULL;
  61. struct LayersBase *LayersBase = NULL;
  62. struct Library *AslBase = NULL;
  63. #endif
  64.  
  65. extern int countdown_rate;
  66. extern int refresh_rate;
  67.  
  68. static struct Window *WindowMain = NULL;
  69. static struct Window *WindowAbout = NULL;
  70. static struct Window *WindowNotSupported = NULL;
  71. static struct Window *WindowSetup = NULL;
  72. static struct Window *WindowController = NULL;
  73. static struct Window *WindowYesNo = NULL;
  74. static struct Window *WindowIconified = NULL;
  75.  
  76. int old_stick_0 = 0x1f;
  77. int old_stick_1 = 0x1f;
  78.  
  79. static int consol;
  80. static int trig0;
  81. static int stick0;
  82.  
  83. struct InputEvent gameport_data;
  84. struct MsgPort *gameport_msg_port;
  85. struct IOStdReq *gameport_io_msg;
  86. BOOL gameport_error;
  87.  
  88. static UBYTE *image_data;
  89.  
  90. static UWORD ScreenType;
  91. static struct Screen *ScreenMain = NULL;
  92. static struct NewScreen NewScreen;
  93. static struct Image image_Screen;
  94. static int ScreenID;
  95. static int ScreenWidth;
  96. static int ScreenHeight;
  97. static int ScreenDepth;
  98. static int TotalColours;
  99.  
  100. struct AppWindow *AppWindow = NULL;
  101. struct AppMenuItem *AppMenuItem = NULL;
  102. struct AppIcon *AppIcon = NULL;
  103. struct DiskObject *AppDiskObject = NULL;
  104. struct MsgPort *AppMessagePort = NULL;
  105. struct AppMessage *AppMessage = NULL;
  106.  
  107. static struct Menu *menu_Project = NULL;
  108. static struct MenuItem *menu_Project00 = NULL;
  109. static struct MenuItem *menu_Project01 = NULL;
  110. static struct MenuItem *menu_Project02 = NULL;
  111. static struct MenuItem *menu_Project03 = NULL;
  112.  
  113. static struct Menu *menu_System = NULL;
  114. static struct MenuItem *menu_System00 = NULL;
  115. static struct MenuItem *menu_System01 = NULL;
  116. static struct MenuItem *menu_System01s00 = NULL;
  117. static struct MenuItem *menu_System01s01 = NULL;
  118. static struct MenuItem *menu_System01s02 = NULL;
  119. static struct MenuItem *menu_System01s03 = NULL;
  120. static struct MenuItem *menu_System01s04 = NULL;
  121. static struct MenuItem *menu_System01s05 = NULL;
  122. static struct MenuItem *menu_System01s06 = NULL;
  123. static struct MenuItem *menu_System01s07 = NULL;
  124. static struct MenuItem *menu_System02 = NULL;
  125. static struct MenuItem *menu_System02s00 = NULL;
  126. static struct MenuItem *menu_System02s01 = NULL;
  127. static struct MenuItem *menu_System02s02 = NULL;
  128. static struct MenuItem *menu_System02s03 = NULL;
  129. static struct MenuItem *menu_System02s04 = NULL;
  130. static struct MenuItem *menu_System02s05 = NULL;
  131. static struct MenuItem *menu_System02s06 = NULL;
  132. static struct MenuItem *menu_System02s07 = NULL;
  133. static struct MenuItem *menu_System03 = NULL;
  134. static struct MenuItem *menu_System03s00 = NULL;
  135. static struct MenuItem *menu_System03s01 = NULL;
  136. static struct MenuItem *menu_System03s02 = NULL;
  137. static struct MenuItem *menu_System04 = NULL;
  138. static struct MenuItem *menu_System05 = NULL;
  139. static struct MenuItem *menu_System06 = NULL;
  140. static struct MenuItem *menu_System07 = NULL;
  141. static struct MenuItem *menu_System08 = NULL;
  142. static struct MenuItem *menu_System09 = NULL;
  143.  
  144. static struct Menu *menu_Console = NULL;
  145. static struct MenuItem *menu_Console00 = NULL;
  146. static struct MenuItem *menu_Console01 = NULL;
  147. static struct MenuItem *menu_Console02 = NULL;
  148. static struct MenuItem *menu_Console03 = NULL;
  149. static struct MenuItem *menu_Console04 = NULL;
  150. static struct MenuItem *menu_Console05 = NULL;
  151. static struct MenuItem *menu_Console06 = NULL;
  152.  
  153. static struct Menu *menu_Prefs = NULL;
  154. static struct MenuItem *menu_Prefs00 = NULL;
  155. static struct MenuItem *menu_Prefs00s00 = NULL;
  156. static struct MenuItem *menu_Prefs00s01 = NULL;
  157. static struct MenuItem *menu_Prefs00s02 = NULL;
  158. static struct MenuItem *menu_Prefs00s03 = NULL;
  159. static struct MenuItem *menu_Prefs01 = NULL;
  160. static struct MenuItem *menu_Prefs01s00 = NULL;
  161. static struct MenuItem *menu_Prefs01s01 = NULL;
  162. static struct MenuItem *menu_Prefs02 = NULL;
  163. static struct MenuItem *menu_Prefs02s00 = NULL;
  164. static struct MenuItem *menu_Prefs02s01 = NULL;
  165. static struct MenuItem *menu_Prefs02s02 = NULL;
  166. static struct MenuItem *menu_Prefs02s03 = NULL;
  167. static struct MenuItem *menu_Prefs03 = NULL;
  168. static struct MenuItem *menu_Prefs03s00 = NULL;
  169. static struct MenuItem *menu_Prefs03s01 = NULL;
  170. static struct MenuItem *menu_Prefs03s02 = NULL;
  171. static struct MenuItem *menu_Prefs03s03 = NULL;
  172.  
  173. struct MemHeader MemHeader;
  174.  
  175. static UWORD *data_Screen;
  176.  
  177. static ChipSet;
  178. static ColourEnabled;
  179. static Controller;
  180. static CustomScreen;
  181.  
  182. static int PaddlePos;
  183.  
  184. static UpdatePalette;
  185.  
  186. static void DisplayAboutWindow();
  187. static void DisplayNotSupportedWindow();
  188. static void DisplaySetupWindow();
  189. static void DisplayControllerWindow();
  190. static int DisplayYesNoWindow();
  191. static int InsertDisk();
  192. static struct Gadget *MakeGadget();
  193. static struct MenuItem *MakeMenuItem();
  194. static struct Menu *MakeMenu();
  195. static void Rule();
  196. static void ShowText();
  197.  
  198. static int gui_GridWidth = 4;
  199. static int gui_GridHeight = 7;
  200. static int gui_WindowOffsetLeftEdge = 0;    /* 4 */
  201. static int gui_WindowOffsetTopEdge = 0;        /* 11 */
  202.  
  203. static int LibraryVersion;
  204.  
  205. #define gadget_Null 0
  206. #define gadget_Button 1
  207. #define gadget_Check 2
  208. #define gadget_String 3
  209. #define gadget_Mutual 4
  210.  
  211. #define controller_Null 0
  212. #define controller_Joystick 1
  213. #define controller_Paddle 2
  214.  
  215.  
  216.  
  217. /*
  218.  * ====================
  219.  * Define data_Button64
  220.  * ====================
  221.  */
  222.  
  223. UWORD data_Button64[] =
  224. {
  225.     0x0000, 0x0000, 0x0000, 0x0001,
  226.     0x0000, 0x0000, 0x0000, 0x0003,
  227.     0x0000, 0x0000, 0x0000, 0x0003,
  228.     0x0000, 0x0000, 0x0000, 0x0003,
  229.     0x0000, 0x0000, 0x0000, 0x0003,
  230.     0x0000, 0x0000, 0x0000, 0x0003,
  231.     0x0000, 0x0000, 0x0000, 0x0003,
  232.     0x0000, 0x0000, 0x0000, 0x0003,
  233.     0x0000, 0x0000, 0x0000, 0x0003,
  234.     0x0000, 0x0000, 0x0000, 0x0003,
  235.     0x0000, 0x0000, 0x0000, 0x0003,
  236.     0x0000, 0x0000, 0x0000, 0x0003,
  237.     0x0000, 0x0000, 0x0000, 0x0003,
  238.     0x7FFF, 0xFFFF, 0xFFFF, 0xFFFF,
  239.  
  240.     0xFFFF, 0xFFFF, 0xFFFF, 0xFFFE,
  241.     0xC000, 0x0000, 0x0000, 0x0000,
  242.     0xC000, 0x0000, 0x0000, 0x0000,
  243.     0xC000, 0x0000, 0x0000, 0x0000,
  244.     0xC000, 0x0000, 0x0000, 0x0000,
  245.     0xC000, 0x0000, 0x0000, 0x0000,
  246.     0xC000, 0x0000, 0x0000, 0x0000,
  247.     0xC000, 0x0000, 0x0000, 0x0000,
  248.     0xC000, 0x0000, 0x0000, 0x0000,
  249.     0xC000, 0x0000, 0x0000, 0x0000,
  250.     0xC000, 0x0000, 0x0000, 0x0000,
  251.     0xC000, 0x0000, 0x0000, 0x0000,
  252.     0xC000, 0x0000, 0x0000, 0x0000,
  253.     0x8000, 0x0000, 0x0000, 0x0000
  254. };
  255.  
  256.  
  257.  
  258. /*
  259.  * ============================
  260.  * Define data_Button64Selected
  261.  * ============================
  262.  */
  263.  
  264. UWORD data_Button64Selected[] =
  265. {
  266.     0xFFFF, 0xFFFF, 0xFFFF, 0xFFFE,
  267.     0xC000, 0x0000, 0x0000, 0x0000,
  268.     0xC000, 0x0000, 0x0000, 0x0000,
  269.     0xC000, 0x0000, 0x0000, 0x0000,
  270.     0xC000, 0x0000, 0x0000, 0x0000,
  271.     0xC000, 0x0000, 0x0000, 0x0000,
  272.     0xC000, 0x0000, 0x0000, 0x0000,
  273.     0xC000, 0x0000, 0x0000, 0x0000,
  274.     0xC000, 0x0000, 0x0000, 0x0000,
  275.     0xC000, 0x0000, 0x0000, 0x0000,
  276.     0xC000, 0x0000, 0x0000, 0x0000,
  277.     0xC000, 0x0000, 0x0000, 0x0000,
  278.     0xC000, 0x0000, 0x0000, 0x0000,
  279.     0x8000, 0x0000, 0x0000, 0x0000,
  280.  
  281.     0x0000, 0x0000, 0x0000, 0x0001,
  282.     0x0000, 0x0000, 0x0000, 0x0003,
  283.     0x0000, 0x0000, 0x0000, 0x0003,
  284.     0x0000, 0x0000, 0x0000, 0x0003,
  285.     0x0000, 0x0000, 0x0000, 0x0003,
  286.     0x0000, 0x0000, 0x0000, 0x0003,
  287.     0x0000, 0x0000, 0x0000, 0x0003,
  288.     0x0000, 0x0000, 0x0000, 0x0003,
  289.     0x0000, 0x0000, 0x0000, 0x0003,
  290.     0x0000, 0x0000, 0x0000, 0x0003,
  291.     0x0000, 0x0000, 0x0000, 0x0003,
  292.     0x0000, 0x0000, 0x0000, 0x0003,
  293.     0x0000, 0x0000, 0x0000, 0x0003,
  294.     0x7FFF, 0xFFFF, 0xFFFF, 0xFFFF
  295. };
  296.  
  297.  
  298.  
  299. /*
  300.  * ========================
  301.  * Define data_MutualGadget
  302.  * ========================
  303.  */
  304.  
  305. UWORD data_MutualGadget[] =
  306. {
  307.     0x0000,
  308.     0x0000,
  309.     0x0004,
  310.     0x0006,
  311.     0x0006,
  312.     0x0003,
  313.     0x0003,
  314.     0x0003,
  315.     0x0003,
  316.     0x0006,
  317.     0x0006,
  318.     0x181C,
  319.     0x1FF8,
  320.     0x07E0,
  321.  
  322.     0x07E0,
  323.     0x1FF8,
  324.     0x3818,
  325.     0x6000,
  326.     0x6000,
  327.     0xC000,
  328.     0xC000,
  329.     0xC000,
  330.     0xC000,
  331.     0x6000,
  332.     0x6000,
  333.     0x2000,
  334.     0x0000,
  335.     0x0000
  336. };
  337.  
  338.  
  339.  
  340. /*
  341.  * ================================
  342.  * Define data_MutualGadgetSelected
  343.  * ================================
  344.  */
  345.  
  346. UWORD data_MutualGadgetSelected[] =
  347. {
  348.     0x07E0,
  349.     0x1FF8,
  350.     0x3818,
  351.     0x6180,
  352.     0x67E0,
  353.     0xC7E0,
  354.     0xCFF0,
  355.     0xCFF0,
  356.     0xC7E0,
  357.     0x67E0,
  358.     0x6180,
  359.     0x2000,
  360.     0x0000,
  361.     0x0000,
  362.  
  363.     0x0000,
  364.     0x0000,
  365.     0x0004,
  366.     0x0006,
  367.     0x0006,
  368.     0x0003,
  369.     0x0003,
  370.     0x0003,
  371.     0x0003,
  372.     0x0006,
  373.     0x0006,
  374.     0x181C,
  375.     0x1FF8,
  376.     0x07E0
  377. };
  378.  
  379.  
  380.  
  381. struct Image image_Button64;
  382. struct Image image_Button64Selected;
  383. struct Image image_MutualGadget;
  384. struct Image image_MutualGadgetSelected;
  385.  
  386. UWORD *chip_Button64 = NULL;
  387. UWORD *chip_Button64Selected = NULL;
  388. UWORD *chip_MutualGadget = NULL;
  389. UWORD *chip_MutualGadgetSelected = NULL;
  390.  
  391. /*
  392.  * ================
  393.  * Atari_Initialize
  394.  * ================
  395.  */
  396.  
  397. /*
  398.  * Revision     : v0.2.1
  399.  * Introduced   : NOT KNOWN (Before 2nd September 1995)
  400.  * Last updated : 12th October 1995
  401.  */
  402.  
  403. void Atari_Initialise(int *argc, char *argv[])
  404. {
  405.     struct NewWindow NewWindow;
  406.  
  407.     char *ptr;
  408.     int i;
  409.     int j;
  410.     struct IntuiMessage *IntuiMessage;
  411.  
  412.     ULONG Class;
  413.     USHORT Code;
  414.     APTR Address;
  415.  
  416.     int QuitRoutine;
  417.  
  418.     /*
  419.      * =========
  420.      * Zoom Data
  421.      * =========
  422.      */
  423.  
  424.     WORD Zoomdata[4] =
  425.     {
  426.         0, 11, 200, 15,
  427.     };
  428.  
  429.     /*
  430.  
  431.  
  432.  
  433.      */
  434.  
  435.     chip_Button64 = (UWORD *) AllocMem(sizeof(data_Button64), MEMF_CHIP);
  436.     chip_Button64Selected = (UWORD *) AllocMem(sizeof(data_Button64Selected), MEMF_CHIP);
  437.     chip_MutualGadget = (UWORD *) AllocMem(sizeof(data_MutualGadget), MEMF_CHIP);
  438.     chip_MutualGadgetSelected = (UWORD *) AllocMem(sizeof(data_MutualGadgetSelected), MEMF_CHIP);
  439.  
  440.     memcpy(chip_Button64, data_Button64, sizeof(data_Button64));
  441.     memcpy(chip_Button64Selected, data_Button64Selected, sizeof(data_Button64Selected));
  442.     memcpy(chip_MutualGadget, data_MutualGadget, sizeof(data_MutualGadget));
  443.     memcpy(chip_MutualGadgetSelected, data_MutualGadgetSelected, sizeof(data_MutualGadgetSelected));
  444.  
  445.     /*
  446.  
  447.  
  448.  
  449.      */
  450.  
  451.     image_Button64.LeftEdge = 0;
  452.     image_Button64.TopEdge = 0;
  453.     image_Button64.Width = 64;
  454.     image_Button64.Height = 14;
  455.     image_Button64.Depth = 2;
  456.     image_Button64.ImageData = chip_Button64;
  457.     image_Button64.PlanePick = 3;
  458.     image_Button64.PlaneOnOff = (UBYTE) NULL;
  459.     image_Button64.NextImage = NULL;
  460.  
  461.     image_Button64Selected.LeftEdge = 0;
  462.     image_Button64Selected.TopEdge = 0;
  463.     image_Button64Selected.Width = 64;
  464.     image_Button64Selected.Height = 14;
  465.     image_Button64Selected.Depth = 2;
  466.     image_Button64Selected.ImageData = chip_Button64Selected;
  467.     image_Button64Selected.PlanePick = 3;
  468.     image_Button64Selected.PlaneOnOff = (UBYTE) NULL;
  469.     image_Button64Selected.NextImage = NULL;
  470.  
  471.     image_MutualGadget.LeftEdge = 0;
  472.     image_MutualGadget.TopEdge = 0;
  473.     image_MutualGadget.Width = 16;
  474.     image_MutualGadget.Height = 14;
  475.     image_MutualGadget.Depth = 2;
  476.     image_MutualGadget.ImageData = chip_MutualGadget;
  477.     image_MutualGadget.PlanePick = 3;
  478.     image_MutualGadget.PlaneOnOff = (UBYTE) NULL;
  479.     image_MutualGadget.NextImage = NULL;
  480.  
  481.     image_MutualGadgetSelected.LeftEdge = 0;
  482.     image_MutualGadgetSelected.TopEdge = 0;
  483.     image_MutualGadgetSelected.Width = 16;
  484.     image_MutualGadgetSelected.Height = 14;
  485.     image_MutualGadgetSelected.Depth = 2;
  486.     image_MutualGadgetSelected.ImageData = chip_MutualGadgetSelected;
  487.     image_MutualGadgetSelected.PlanePick = 3;
  488.     image_MutualGadgetSelected.PlaneOnOff = (UBYTE) NULL;
  489.     image_MutualGadgetSelected.NextImage = NULL;
  490.  
  491.     /*
  492.      * =======================
  493.      * Process startup options
  494.      * =======================
  495.      */
  496.  
  497.     ChipSet = AGA_ChipSet;
  498.     ColourEnabled = TRUE;
  499.     UpdatePalette = TRUE;
  500.     CustomScreen = TRUE;
  501.     Controller = controller_Joystick;
  502.     PaddlePos = 228;
  503.     LibraryVersion = 39;
  504.  
  505.     for (i = j = 1; i < *argc; i++) {
  506. /*
  507.    printf("%d: %s\n", i,argv[i]);
  508.  */
  509.  
  510.         if (strcmp(argv[i], "-ocs") == 0) {
  511.             printf("Requested OCS graphics mode... Accepted!\n");
  512.             ChipSet = OCS_ChipSet;
  513.             LibraryVersion = 37;
  514.         }
  515.         else if (strcmp(argv[i], "-ecs") == 0) {
  516.             printf("Requested ECS graphics mode... Accepted!\n");
  517.             ChipSet = ECS_ChipSet;
  518.             LibraryVersion = 37;
  519.         }
  520.         else if (strcmp(argv[i], "-aga") == 0) {
  521.             printf("Requested AGA graphics mode... Accepted!\n");
  522.             printf("  Enabled custom screen automatically\n");
  523.             ChipSet = AGA_ChipSet;
  524.             CustomScreen = TRUE;
  525.             LibraryVersion = 39;
  526.         }
  527.         else if (strcmp(argv[i], "-grey") == 0) {
  528.             printf("Requested grey scale display... Accepted!\n");
  529.             ColourEnabled = FALSE;
  530.         }
  531.         else if (strcmp(argv[i], "-colour") == 0) {
  532.             printf("Requested colour display... Accepted!\n");
  533.             ColourEnabled = TRUE;
  534.         }
  535.         else if (strcmp(argv[i], "-wb") == 0) {
  536.             printf("Requested Workbench window... Accepted!\n");
  537.             CustomScreen = FALSE;
  538.             LibraryVersion = 37;
  539.             if (ChipSet == AGA_ChipSet) {
  540.                 printf("  ECS chip set automatically enabled\n");
  541.                 ChipSet = ECS_ChipSet;
  542.             }
  543.         }
  544.         else if (strcmp(argv[i], "-joystick") == 0) {
  545.             printf("Requested joystick controller... Accepted!\n");
  546.             Controller = controller_Joystick;
  547.         }
  548.         else if (strcmp(argv[i], "-paddle") == 0) {
  549.             printf("Requested paddle controller... Accepted!\n");
  550.             Controller = controller_Paddle;
  551.         }
  552.         else {
  553.             argv[j++] = argv[i];
  554.         }
  555.     }
  556.  
  557.     *argc = j;
  558.  
  559.     IntuitionBase = (struct IntuitionBase *) OpenLibrary("intuition.library", LibraryVersion);
  560.     if (!IntuitionBase) {
  561.         printf("Failed to open intuition.library\n");
  562.         Atari_Exit(0);
  563.     }
  564.     GfxBase = (struct GfxBase *) OpenLibrary("graphics.library", LibraryVersion);
  565.     if (!GfxBase) {
  566.         printf("Failed to open graphics.library\n");
  567.         Atari_Exit(0);
  568.     }
  569.     LayersBase = (struct LayersBase *) OpenLibrary("layers.library", LibraryVersion);
  570.     if (!LayersBase) {
  571.         printf("Failed to open layers.library\n");
  572.         Atari_Exit(0);
  573.     }
  574.     AslBase = (struct Library *) OpenLibrary("asl.library", LibraryVersion);
  575.     if (!AslBase) {
  576.         printf("Failed to open asl.library\n");
  577.         Atari_Exit(0);
  578.     }
  579.     data_Screen = (UWORD *) AllocMem(46080 * 2, MEMF_CHIP);
  580.     if (!data_Screen) {
  581.         printf("Oh BUGGER!\n");
  582.     }
  583.     printf("data_Screen = %x\n", data_Screen);
  584.  
  585.     /*
  586.      * ==============
  587.      * Setup Joystick
  588.      * ==============
  589.      */
  590.  
  591.     gameport_msg_port = (struct MsgPort *) CreatePort(0, 0);
  592.     if (!gameport_msg_port) {
  593.         printf("Failed to create gameport_msg_port\n");
  594.         Atari_Exit(0);
  595.     }
  596.     gameport_io_msg = (struct IOStdReq *) CreateStdIO(gameport_msg_port);
  597.     if (!gameport_io_msg) {
  598.         printf("Failed to create gameport_io_msg\n");
  599.         Atari_Exit(0);
  600.     }
  601.     gameport_error = OpenDevice("gameport.device", GAMEPORT1, gameport_io_msg, 0xFFFF);
  602.     if (gameport_error) {
  603.         printf("Failed to open the gameport.device\n");
  604.         Atari_Exit(0);
  605.     } {
  606.         BYTE type = 0;
  607.  
  608.         gameport_io_msg->io_Command = GPD_ASKCTYPE;
  609.         gameport_io_msg->io_Length = 1;
  610.         gameport_io_msg->io_Data = (APTR) & type;
  611.  
  612.         DoIO(gameport_io_msg);
  613.  
  614.         if (type) {
  615.             printf("gameport already in use\n");
  616.             gameport_error = TRUE;
  617.         }
  618.     }
  619.  
  620.     {
  621.         BYTE type = GPCT_ABSJOYSTICK;
  622.  
  623.         gameport_io_msg->io_Command = GPD_SETCTYPE;
  624.         gameport_io_msg->io_Length = 1;
  625.         gameport_io_msg->io_Data = (APTR) & type;
  626.  
  627.         DoIO(gameport_io_msg);
  628.  
  629.         if (gameport_io_msg->io_Error) {
  630.             printf("Failed to set controller type\n");
  631.         }
  632.     }
  633.  
  634.     {
  635.         struct GamePortTrigger gpt;
  636.  
  637.         gpt.gpt_Keys = GPTF_DOWNKEYS | GPTF_UPKEYS;
  638.         gpt.gpt_Timeout = 0;
  639.         gpt.gpt_XDelta = 1;
  640.         gpt.gpt_YDelta = 1;
  641.  
  642.         gameport_io_msg->io_Command = GPD_SETTRIGGER;
  643.         gameport_io_msg->io_Length = sizeof(gpt);
  644.         gameport_io_msg->io_Data = (APTR) & gpt;
  645.  
  646.         DoIO(gameport_io_msg);
  647.  
  648.         if (gameport_io_msg->io_Error) {
  649.             printf("Failed to set controller trigger\n");
  650.         }
  651.     }
  652.  
  653.     {
  654.         struct InputEvent *Data;
  655.  
  656.         gameport_io_msg->io_Command = GPD_READEVENT;
  657.         gameport_io_msg->io_Length = sizeof(struct InputEvent);
  658.         gameport_io_msg->io_Data = (APTR) & gameport_data;
  659.         gameport_io_msg->io_Flags = 0;
  660.     }
  661.  
  662.     SendIO(gameport_io_msg);
  663.  
  664.     ScreenType = WBENCHSCREEN;
  665.  
  666.     if (ChipSet == AGA_ChipSet) {
  667.         DisplaySetupWindow();
  668.     }
  669.     SetupDisplay();
  670.  
  671.     DisplayAboutWindow();
  672.  
  673. /*
  674.  * Setup Project Menu
  675.  */
  676.  
  677.     menu_Project00 = MakeMenuItem(0, 0, 96, 10, "Iconify", NULL, NULL);
  678.     menu_Project01 = MakeMenuItem(0, 15, 96, 10, "Help", 'H', NULL);
  679.     menu_Project02 = MakeMenuItem(0, 30, 96, 10, "About", '?', NULL);
  680.     menu_Project03 = MakeMenuItem(0, 45, 96, 10, "Quit", 'N', NULL);
  681.  
  682.     menu_Project00->NextItem = menu_Project01;
  683.     menu_Project01->NextItem = menu_Project02;
  684.     menu_Project02->NextItem = menu_Project03;
  685.  
  686.     menu_Project = MakeMenu(0, 0, 48, "Amiga", menu_Project00);
  687.  
  688. /*
  689.  * Setup Disk Menu
  690.  */
  691.  
  692.     menu_System00 = MakeMenuItem(0, 0, 144, 10, "Boot disk", NULL, NULL);
  693.     menu_System01 = MakeMenuItem(0, 10, 144, 10, "Insert disk      »", NULL, NULL);
  694.     menu_System01s00 = MakeMenuItem(128, 0, 80, 10, "Drive 1...", NULL, NULL);
  695.     menu_System01s01 = MakeMenuItem(128, 10, 80, 10, "Drive 2...", NULL, NULL);
  696.     menu_System01s02 = MakeMenuItem(128, 20, 80, 10, "Drive 3...", NULL, NULL);
  697.     menu_System01s03 = MakeMenuItem(128, 30, 80, 10, "Drive 4...", NULL, NULL);
  698.     menu_System01s04 = MakeMenuItem(128, 40, 80, 10, "Drive 5...", NULL, NULL);
  699.     menu_System01s05 = MakeMenuItem(128, 50, 80, 10, "Drive 6...", NULL, NULL);
  700.     menu_System01s06 = MakeMenuItem(128, 60, 80, 10, "Drive 7...", NULL, NULL);
  701.     menu_System01s07 = MakeMenuItem(128, 70, 80, 10, "Drive 8...", NULL, NULL);
  702.  
  703.     menu_System01s00->NextItem = menu_System01s01;
  704.     menu_System01s01->NextItem = menu_System01s02;
  705.     menu_System01s02->NextItem = menu_System01s03;
  706.     menu_System01s03->NextItem = menu_System01s04;
  707.     menu_System01s04->NextItem = menu_System01s05;
  708.     menu_System01s05->NextItem = menu_System01s06;
  709.     menu_System01s06->NextItem = menu_System01s07;
  710.  
  711.     menu_System01->SubItem = menu_System01s00;
  712.  
  713.     menu_System02 = MakeMenuItem(0, 20, 144, 10, "Eject disk       »", NULL, NULL);
  714.     menu_System02s00 = MakeMenuItem(128, 0, 56, 10, "Drive 1", NULL, NULL);
  715.     menu_System02s01 = MakeMenuItem(128, 10, 56, 10, "Drive 2", NULL, NULL);
  716.     menu_System02s02 = MakeMenuItem(128, 20, 56, 10, "Drive 3", NULL, NULL);
  717.     menu_System02s03 = MakeMenuItem(128, 30, 56, 10, "Drive 4", NULL, NULL);
  718.     menu_System02s04 = MakeMenuItem(128, 40, 56, 10, "Drive 5", NULL, NULL);
  719.     menu_System02s05 = MakeMenuItem(128, 50, 56, 10, "Drive 6", NULL, NULL);
  720.     menu_System02s06 = MakeMenuItem(128, 60, 56, 10, "Drive 7", NULL, NULL);
  721.     menu_System02s07 = MakeMenuItem(128, 70, 56, 10, "Drive 8", NULL, NULL);
  722.  
  723.     menu_System02s00->NextItem = menu_System02s01;
  724.     menu_System02s01->NextItem = menu_System02s02;
  725.     menu_System02s02->NextItem = menu_System02s03;
  726.     menu_System02s03->NextItem = menu_System02s04;
  727.     menu_System02s04->NextItem = menu_System02s05;
  728.     menu_System02s05->NextItem = menu_System02s06;
  729.     menu_System02s06->NextItem = menu_System02s07;
  730.  
  731.     menu_System02->SubItem = menu_System02s00;
  732.  
  733.     menu_System03 = MakeMenuItem(0, 35, 144, 10, "Insert Cartridge »", NULL, NULL);
  734.     menu_System03s00 = MakeMenuItem(128, 0, 128, 10, "8K Cart...", NULL, NULL);
  735.     menu_System03s01 = MakeMenuItem(128, 10, 128, 10, "16K Cart...", NULL, NULL);
  736.     menu_System03s02 = MakeMenuItem(128, 20, 128, 10, "OSS SuperCart...", NULL, NULL);
  737.  
  738.     menu_System03s00->NextItem = menu_System03s01;
  739.     menu_System03s01->NextItem = menu_System03s02;
  740.  
  741.     menu_System03->SubItem = menu_System03s00;
  742.  
  743.     menu_System04 = MakeMenuItem(0, 45, 144, 10, "Remove Cartridge", NULL, NULL);
  744.     menu_System05 = MakeMenuItem(0, 60, 144, 10, "Enable PIL", NULL, NULL);
  745.     menu_System06 = MakeMenuItem(0, 75, 144, 10, "Atari 800 OS/A", NULL, NULL);
  746.     menu_System07 = MakeMenuItem(0, 85, 144, 10, "Atari 800 OS/B", NULL, NULL);
  747.     menu_System08 = MakeMenuItem(0, 95, 144, 10, "Atari 800XL", NULL, NULL);
  748.     menu_System09 = MakeMenuItem(0, 105, 144, 10, "Atari 130XE", NULL, NULL);
  749.  
  750.     menu_System00->NextItem = menu_System01;
  751.     menu_System01->NextItem = menu_System02;
  752.     menu_System02->NextItem = menu_System03;
  753.     menu_System03->NextItem = menu_System04;
  754.     menu_System04->NextItem = menu_System05;
  755.     menu_System05->NextItem = menu_System06;
  756.     menu_System06->NextItem = menu_System07;
  757.     menu_System07->NextItem = menu_System08;
  758.     menu_System08->NextItem = menu_System09;
  759.  
  760.     menu_System = MakeMenu(48, 0, 56, "System", menu_System00);
  761.  
  762. /*
  763.  * Setup Console Menu
  764.  */
  765.  
  766.     menu_Console00 = MakeMenuItem(0, 0, 80, 10, "Option", NULL, NULL);
  767.     menu_Console01 = MakeMenuItem(0, 10, 80, 10, "Select", NULL, NULL);
  768.     menu_Console02 = MakeMenuItem(0, 20, 80, 10, "Start", NULL, NULL);
  769.     menu_Console03 = MakeMenuItem(0, 30, 80, 10, "Help", NULL, NULL);
  770.  
  771.     if (machine == Atari) {
  772.         menu_Console03->Flags = ITEMTEXT | HIGHCOMP;
  773.     }
  774.     menu_Console04 = MakeMenuItem(0, 45, 80, 10, "Break", NULL, NULL);
  775.     menu_Console05 = MakeMenuItem(0, 60, 80, 10, "Reset", NULL, NULL);
  776.     menu_Console06 = MakeMenuItem(0, 75, 80, 10, "Cold Start", NULL, NULL);
  777.  
  778.     menu_Console00->NextItem = menu_Console01;
  779.     menu_Console01->NextItem = menu_Console02;
  780.     menu_Console02->NextItem = menu_Console03;
  781.     menu_Console03->NextItem = menu_Console04;
  782.     menu_Console04->NextItem = menu_Console05;
  783.     menu_Console05->NextItem = menu_Console06;
  784.  
  785.     menu_Console = MakeMenu(104, 0, 64, "Console", menu_Console00);
  786.  
  787. /*
  788.  * Setup Prefs Menu
  789.  */
  790.  
  791. /*
  792.    menu_Prefs00 = MakeMenuItem (0, 0, 96, 10, "Controller »", NULL, NULL);
  793.    menu_Prefs00s00 = MakeMenuItem (80, 0, 80, 10, "  Joystick", NULL, 2);
  794.    menu_Prefs00s01 = MakeMenuItem (80, 10, 80, 10, "  Paddle", NULL, 1);
  795.  
  796.    if (Controller == controller_Joystick)
  797.    {
  798.    menu_Prefs00s00->Flags = menu_Prefs00s00->Flags | CHECKED;
  799.    }
  800.    else if (Controller == controller_Paddle)
  801.    {
  802.    menu_Prefs00s01->Flags = menu_Prefs00s01->Flags | CHECKED;
  803.    }
  804.  
  805.    menu_Prefs00s00->NextItem = menu_Prefs00s01;
  806.  
  807.    menu_Prefs00->SubItem = menu_Prefs00s00;
  808.  */
  809.  
  810.     menu_Prefs00 = MakeMenuItem(0, 0, 96, 10, "Controller »", NULL, NULL);
  811.     menu_Prefs00s00 = MakeMenuItem(80, 0, 80, 10, "Port 1...", NULL, NULL);
  812.     menu_Prefs00s01 = MakeMenuItem(80, 10, 80, 10, "Port 2...", NULL, NULL);
  813.     menu_Prefs00s01->Flags = ITEMTEXT | HIGHCOMP;
  814.  
  815.     menu_Prefs00s02 = MakeMenuItem(80, 20, 80, 10, "Port 3...", NULL, NULL);
  816. /*
  817.    if (machine != Atari)
  818.    {
  819.    menu_Prefs00s02->Flags = ITEMTEXT | HIGHCOMP;
  820.    }
  821.  */
  822.     menu_Prefs00s02->Flags = ITEMTEXT | HIGHCOMP;
  823.  
  824.     menu_Prefs00s03 = MakeMenuItem(80, 30, 80, 10, "Port 4...", NULL, NULL);
  825. /*
  826.    if (machine != Atari)
  827.    {
  828.    menu_Prefs00s03->Flags = ITEMTEXT | HIGHCOMP;
  829.    }
  830.  */
  831.     menu_Prefs00s03->Flags = ITEMTEXT | HIGHCOMP;
  832.  
  833.     menu_Prefs00s00->NextItem = menu_Prefs00s01;
  834.     menu_Prefs00s01->NextItem = menu_Prefs00s02;
  835.     menu_Prefs00s02->NextItem = menu_Prefs00s03;
  836.  
  837.     menu_Prefs00->SubItem = menu_Prefs00s00;
  838.  
  839.     menu_Prefs01 = MakeMenuItem(0, 10, 96, 10, "Display    »", NULL, NULL);
  840.     menu_Prefs01s00 = MakeMenuItem(80, 0, 64, 10, "  Colour", NULL, 2);
  841.     menu_Prefs01s01 = MakeMenuItem(80, 10, 64, 10, "  Grey", NULL, 1);
  842.  
  843.     if (ColourEnabled) {
  844.         menu_Prefs01s00->Flags = menu_Prefs01s00->Flags | CHECKED;
  845.     }
  846.     else {
  847.         menu_Prefs01s01->Flags = menu_Prefs01s01->Flags | CHECKED;
  848.     }
  849.  
  850.     menu_Prefs01s00->NextItem = menu_Prefs01s01;
  851.  
  852.     menu_Prefs01->SubItem = menu_Prefs01s00;
  853.  
  854.     menu_Prefs02 = MakeMenuItem(0, 20, 96, 10, "Refresh    »", NULL, NULL);
  855.     menu_Prefs02s00 = MakeMenuItem(80, 0, 24, 10, "  1", NULL, 14);
  856.     menu_Prefs02s01 = MakeMenuItem(80, 10, 24, 10, "  2", NULL, 13);
  857.     menu_Prefs02s02 = MakeMenuItem(80, 20, 24, 10, "  4", NULL, 11);
  858.     menu_Prefs02s03 = MakeMenuItem(80, 30, 24, 10, "  8", NULL, 7);
  859.  
  860.     if (refresh_rate == 1) {
  861.         menu_Prefs02s00->Flags = menu_Prefs02s00->Flags | CHECKED;
  862.     }
  863.     else if (refresh_rate == 2) {
  864.         menu_Prefs02s01->Flags = menu_Prefs02s01->Flags | CHECKED;
  865.     }
  866.     else if (refresh_rate == 4) {
  867.         menu_Prefs02s02->Flags = menu_Prefs02s02->Flags | CHECKED;
  868.     }
  869.     else if (refresh_rate == 8) {
  870.         menu_Prefs02s03->Flags = menu_Prefs02s03->Flags | CHECKED;
  871.     }
  872.     menu_Prefs02s00->NextItem = menu_Prefs02s01;
  873.     menu_Prefs02s01->NextItem = menu_Prefs02s02;
  874.     menu_Prefs02s02->NextItem = menu_Prefs02s03;
  875.  
  876.     menu_Prefs02->SubItem = menu_Prefs02s00;
  877.  
  878.     menu_Prefs03 = MakeMenuItem(0, 30, 96, 10, "Countdown  »", NULL, NULL);
  879.     menu_Prefs03s00 = MakeMenuItem(80, 0, 56, 10, "  4000", NULL, 14);
  880.     menu_Prefs03s01 = MakeMenuItem(80, 10, 56, 10, "  8000", NULL, 13);
  881.     menu_Prefs03s02 = MakeMenuItem(80, 20, 56, 10, "  16000", NULL, 11);
  882.     menu_Prefs03s03 = MakeMenuItem(80, 30, 56, 10, "  32000", NULL, 7);
  883.  
  884.     if (countdown_rate == 4000) {
  885.         menu_Prefs03s00->Flags = menu_Prefs03s00->Flags | CHECKED;
  886.     }
  887.     else if (countdown_rate == 8000) {
  888.         menu_Prefs03s01->Flags = menu_Prefs03s01->Flags | CHECKED;
  889.     }
  890.     else if (countdown_rate == 16000) {
  891.         menu_Prefs03s02->Flags = menu_Prefs03s02->Flags | CHECKED;
  892.     }
  893.     else if (countdown_rate == 32000) {
  894.         menu_Prefs03s03->Flags = menu_Prefs03s03->Flags | CHECKED;
  895.     }
  896.     menu_Prefs03s00->NextItem = menu_Prefs03s01;
  897.     menu_Prefs03s01->NextItem = menu_Prefs03s02;
  898.     menu_Prefs03s02->NextItem = menu_Prefs03s03;
  899.  
  900.     menu_Prefs03->SubItem = menu_Prefs03s00;
  901.  
  902.     menu_Prefs00->NextItem = menu_Prefs01;
  903.     menu_Prefs01->NextItem = menu_Prefs02;
  904.     menu_Prefs02->NextItem = menu_Prefs03;
  905.  
  906.     menu_Prefs = MakeMenu(168, 0, 48, "Prefs", menu_Prefs00);
  907.  
  908. /*
  909.  * Link Menus
  910.  */
  911.  
  912.     menu_Project->NextMenu = menu_System;
  913.     menu_System->NextMenu = menu_Console;
  914.     menu_Console->NextMenu = menu_Prefs;
  915.  
  916.     SetMenuStrip(WindowMain, menu_Project);
  917.  
  918.     image_Screen.LeftEdge = 0;
  919.     image_Screen.TopEdge = 0;
  920.     image_Screen.Width = 384;
  921.     image_Screen.Height = 240;
  922.     image_Screen.Depth = 8;
  923.     image_Screen.ImageData = data_Screen;
  924.     image_Screen.PlanePick = 255;
  925.     image_Screen.PlaneOnOff = NULL;
  926.     image_Screen.NextImage = NULL;
  927.  
  928.     /*
  929.      * ============================
  930.      * Storage for Atari 800 Screen
  931.      * ============================
  932.      */
  933.  
  934.     image_data = (UBYTE *) malloc(ATARI_WIDTH * ATARI_HEIGHT);
  935.     if (!image_data) {
  936.         printf("Failed to allocate space for image\n");
  937.         Atari_Exit(0);
  938.     }
  939.     for (ptr = image_data, i = 0; i < ATARI_WIDTH * ATARI_HEIGHT; i++, ptr++)
  940.         *ptr = 0;
  941.     for (ptr = (char *) data_Screen, i = 0; i < ATARI_WIDTH * ATARI_HEIGHT; i++, ptr++)
  942.         *ptr = 0;
  943.  
  944.     trig0 = 1;
  945.     stick0 = 15;
  946.     consol = 7;
  947. }
  948.  
  949.  
  950.  
  951. /*
  952.  * ==========
  953.  * Atari_Exit
  954.  * ==========
  955.  */
  956.  
  957. /*
  958.  * Revision     : v0.2.0
  959.  * Introduced   : NOT KNOWN (Before 2nd September 1995)
  960.  * Last updated : 7th September 1995
  961.  */
  962.  
  963. int Atari_Exit(int run_monitor)
  964. {
  965.     if (run_monitor) {
  966.         if (monitor()) {
  967.             return TRUE;
  968.         }
  969.     }
  970.     AbortIO(gameport_io_msg);
  971.  
  972.     while (GetMsg(gameport_msg_port)) {
  973.     }
  974.  
  975.     if (!gameport_error) {
  976.         {
  977.             BYTE type = GPCT_NOCONTROLLER;
  978.  
  979.             gameport_io_msg->io_Command = GPD_SETCTYPE;
  980.             gameport_io_msg->io_Length = 1;
  981.             gameport_io_msg->io_Data = (APTR) & type;
  982.  
  983.             DoIO(gameport_io_msg);
  984.  
  985.             if (gameport_io_msg->io_Error) {
  986.                 printf("Failed to set controller type\n");
  987.             }
  988.         }
  989.  
  990.         CloseDevice(gameport_io_msg);
  991.     }
  992.     FreeMem(data_Screen, 46080 * 2);
  993.  
  994.     if (gameport_io_msg) {
  995.         DeleteStdIO(gameport_io_msg);
  996.     }
  997.     if (gameport_msg_port) {
  998.         DeletePort(gameport_msg_port);
  999.     }
  1000.     if (WindowMain) {
  1001.         CloseWindow(WindowMain);
  1002.     }
  1003.     if (ScreenMain) {
  1004.         CloseScreen(ScreenMain);
  1005.     }
  1006.     if (LayersBase) {
  1007.         CloseLibrary(LayersBase);
  1008.     }
  1009.     if (GfxBase) {
  1010.         CloseLibrary(GfxBase);
  1011.     }
  1012.     if (IntuitionBase) {
  1013.         CloseLibrary(IntuitionBase);
  1014.     }
  1015.     exit(1);
  1016.  
  1017. /*
  1018.    return FALSE;
  1019.  */
  1020. }
  1021.  
  1022.  
  1023.  
  1024. /*
  1025.  * ===================
  1026.  * Atari_DisplayScreen
  1027.  * ===================
  1028.  */
  1029.  
  1030. /*
  1031.  * Revision     : v0.2.0a
  1032.  * Introduced   : NOT KNOWN (Before 2nd September 1995)
  1033.  * Last updated : 7th September 1995
  1034.  */
  1035.  
  1036. void Atari_DisplayScreen(UBYTE * screen)
  1037. {
  1038. /*
  1039.    UWORD    *bitplane0;
  1040.    UWORD    *bitplane1;
  1041.    UWORD    *bitplane2;
  1042.    UWORD    *bitplane3;
  1043.    UWORD    *bitplane4;
  1044.  
  1045.    bitplane0 = WindowMain->RPort->BitMap->Planes[0];
  1046.    word0 = *bitplane0;
  1047.  
  1048.    bitplane1 = WindowMain->RPort->BitMap->Planes[1]; 
  1049.    word1 = *bitplane1;
  1050.  
  1051.    bitplane2 = WindowMain->RPort->BitMap->Planes[2];
  1052.    word2 = *bitplane2;
  1053.  
  1054.    bitplane3 = WindowMain->RPort->BitMap->Planes[3];
  1055.    word3 = *bitplane3;
  1056.  
  1057.    bitplane4 = WindowMain->RPort->BitMap->Planes[4];
  1058.    word4 = *bitplane4;
  1059.  */
  1060.  
  1061.     consol = 7;
  1062.  
  1063.     if (ChipSet == AGA_ChipSet) {
  1064.         ULONG *bitplane0;
  1065.  
  1066.         bitplane0 = &data_Screen[0];
  1067.  
  1068.         if (ColourEnabled)
  1069.             amiga_aga_colour(screen, bitplane0);
  1070.         else
  1071.             amiga_aga_bw(screen, bitplane0);
  1072.     }
  1073.     else {
  1074.         ULONG *bitplane0;
  1075.         ULONG *bitplane1;
  1076.         ULONG *bitplane2;
  1077.         ULONG *bitplane3;
  1078.         ULONG *bitplane4;
  1079.  
  1080.         ULONG word0, word1, word2, word3, word4;
  1081.  
  1082.         int ypos;
  1083.         int xpos;
  1084.         int tbit = 31;
  1085.         UBYTE *scanline_ptr;
  1086.  
  1087.         BYTE pens[256];
  1088.         int pen;
  1089.  
  1090.         scanline_ptr = image_data;
  1091.  
  1092.         bitplane0 = &data_Screen[0];
  1093.         word0 = *bitplane0;
  1094.  
  1095.         bitplane1 = &data_Screen[5760];
  1096.         word1 = *bitplane1;
  1097.  
  1098.         bitplane2 = &data_Screen[11520];
  1099.         word2 = *bitplane2;
  1100.  
  1101.         bitplane3 = &data_Screen[17280];
  1102.         word3 = *bitplane3;
  1103.  
  1104.         bitplane4 = &data_Screen[23040];
  1105.         word4 = *bitplane4;
  1106.  
  1107.         for (pen = 0; pen < 256; pen++) {
  1108.             pens[pen] = 0;
  1109.         }
  1110.  
  1111.         pen = 5;
  1112.  
  1113.         if (CustomScreen) {
  1114.             pen = 1;
  1115.         }
  1116.         if (ColourEnabled) {
  1117.             for (ypos = 0; ypos < ATARI_HEIGHT; ypos++) {
  1118.                 for (xpos = 0; xpos < ATARI_WIDTH; xpos++) {
  1119.                     UBYTE colour;
  1120.  
  1121.                     colour = *screen;
  1122.  
  1123.                     if (pens[colour] == 0) {
  1124.                         if (pen < 33) {
  1125.                             int rgb = colortable[colour];
  1126.                             int red;
  1127.                             int green;
  1128.                             int blue;
  1129.  
  1130.                             pens[colour] = pen;
  1131.                             pen++;
  1132.  
  1133.                             if (UpdatePalette) {
  1134.                                 red = (rgb & 0x00ff0000) >> 20;
  1135.                                 green = (rgb & 0x0000ff00) >> 12;
  1136.                                 blue = (rgb & 0x000000ff) >> 4;
  1137.  
  1138.                                 SetRGB4(&WindowMain->WScreen->ViewPort, pen - 1, red, green, blue);
  1139.                             }
  1140.                         }
  1141.                     }
  1142.                     colour = pens[*screen++];
  1143.  
  1144.                     if (colour != *scanline_ptr) {
  1145.                         ULONG mask;
  1146.  
  1147.                         mask = ~(1 << tbit);
  1148.  
  1149.                         word0 = (word0 & mask) | (((colour) & 1) << tbit);
  1150.                         word1 = (word1 & mask) | (((colour >> 1) & 1) << tbit);
  1151.                         word2 = (word2 & mask) | (((colour >> 2) & 1) << tbit);
  1152.                         word3 = (word3 & mask) | (((colour >> 3) & 1) << tbit);
  1153.                         word4 = (word4 & mask) | (((colour >> 4) & 1) << tbit);
  1154.  
  1155.                         *scanline_ptr++ = colour;
  1156.                     }
  1157.                     else {
  1158.                         scanline_ptr++;
  1159.                     }
  1160.  
  1161.                     if (--tbit == -1) {
  1162.                         *bitplane0++ = word0;
  1163.                         word0 = *bitplane0;
  1164.  
  1165.                         *bitplane1++ = word1;
  1166.                         word1 = *bitplane1;
  1167.  
  1168.                         *bitplane2++ = word2;
  1169.                         word2 = *bitplane2;
  1170.  
  1171.                         *bitplane3++ = word3;
  1172.                         word3 = *bitplane3;
  1173.  
  1174.                         *bitplane4++ = word4;
  1175.                         word4 = *bitplane4;
  1176.  
  1177.                         tbit = 31;
  1178.                     }
  1179.                 }
  1180.             }
  1181.         }
  1182.         else {
  1183.             for (ypos = 0; ypos < ATARI_HEIGHT; ypos++) {
  1184.                 for (xpos = 0; xpos < ATARI_WIDTH; xpos++) {
  1185.                     UBYTE colour;
  1186.  
  1187.                     colour = (*screen++ & 0x0f) + pen - 1;
  1188.  
  1189.                     if (colour != *scanline_ptr) {
  1190.                         ULONG mask;
  1191.  
  1192.                         mask = ~(1 << tbit);
  1193.  
  1194.                         word0 = (word0 & mask) | (((colour) & 1) << tbit);
  1195.                         word1 = (word1 & mask) | (((colour >> 1) & 1) << tbit);
  1196.                         word2 = (word2 & mask) | (((colour >> 2) & 1) << tbit);
  1197.                         word3 = (word3 & mask) | (((colour >> 3) & 1) << tbit);
  1198.                         word4 = (word4 & mask) | (((colour >> 4) & 1) << tbit);
  1199.  
  1200.                         *scanline_ptr++ = colour;
  1201.                     }
  1202.                     else {
  1203.                         scanline_ptr++;
  1204.                     }
  1205.  
  1206.                     if (--tbit == -1) {
  1207.                         *bitplane0++ = word0;
  1208.                         word0 = *bitplane0;
  1209.  
  1210.                         *bitplane1++ = word1;
  1211.                         word1 = *bitplane1;
  1212.  
  1213.                         *bitplane2++ = word2;
  1214.                         word2 = *bitplane2;
  1215.  
  1216.                         *bitplane3++ = word3;
  1217.                         word3 = *bitplane3;
  1218.  
  1219.                         *bitplane4++ = word4;
  1220.                         word4 = *bitplane4;
  1221.  
  1222.                         tbit = 31;
  1223.                     }
  1224.                 }
  1225.             }
  1226.         }
  1227.     }
  1228.  
  1229.     if (CustomScreen) {
  1230.         DrawImage(WindowMain->RPort, &image_Screen, -32, 0);
  1231.     }
  1232.     else {
  1233.         DrawImage(WindowMain->RPort, &image_Screen, 0, 0);
  1234.     }
  1235. }
  1236.  
  1237.  
  1238.  
  1239. /*
  1240.  * ==============
  1241.  * Atari_Keyboard
  1242.  * ==============
  1243.  */
  1244.  
  1245. /*
  1246.  * Revision     : v0.3.3
  1247.  * Introduced   : NOT KNOWN (Before 2nd September 1995)
  1248.  * Last updated : 7th March 1996
  1249.  *
  1250.  * Notes: Currently contains GUI monitoring code as well. At some time in
  1251.  * the future I intend on removing this from this code.
  1252.  */
  1253.  
  1254. int Atari_Keyboard(void)
  1255. {
  1256.     int keycode;
  1257.  
  1258.     struct IntuiMessage *IntuiMessage;
  1259.  
  1260.     ULONG Class;
  1261.     USHORT Code;
  1262.     APTR Address;
  1263.     SHORT MouseX;
  1264.     SHORT MouseY;
  1265.  
  1266.     USHORT MenuItem = NULL;
  1267.  
  1268.     int Menu = NULL;
  1269.     int Item = NULL;
  1270.     int SubItem = NULL;
  1271.  
  1272.     keycode = -1;
  1273.  
  1274.     while (IntuiMessage = (struct IntuiMessage *) GetMsg(WindowMain->UserPort)) {
  1275.         Class = IntuiMessage->Class;
  1276.         Code = IntuiMessage->Code;
  1277.         Address = IntuiMessage->IAddress;
  1278.         MouseX = IntuiMessage->MouseX;
  1279.         MouseY = IntuiMessage->MouseY;
  1280.  
  1281.         MenuItem = Code;
  1282.  
  1283.         Menu = MENUNUM(MenuItem);
  1284.         Item = ITEMNUM(MenuItem);
  1285.         SubItem = SUBNUM(MenuItem);
  1286.  
  1287.         if (Class == MENUVERIFY) {
  1288.             if (ChipSet == OCS_ChipSet || ChipSet == ECS_ChipSet) {
  1289.                 if (CustomScreen) {
  1290.                     int i;
  1291.  
  1292.                     UpdatePalette = FALSE;
  1293.  
  1294.                     for (i = 0; i < 16; i++) {
  1295.                         int rgb = colortable[i];
  1296.                         int red;
  1297.                         int green;
  1298.                         int blue;
  1299.  
  1300.                         red = (rgb & 0x00ff0000) >> 20;
  1301.                         green = (rgb & 0x0000ff00) >> 12;
  1302.                         blue = (rgb & 0x000000ff) >> 4;
  1303.  
  1304.                         SetRGB4(&WindowMain->WScreen->ViewPort, i, red, green, blue);
  1305.                     }
  1306.  
  1307.                     SetRGB4(&WindowMain->WScreen->ViewPort, 24, 6, 8, 11);
  1308.                 }
  1309.             }
  1310.         }
  1311.         ReplyMsg(IntuiMessage);
  1312.  
  1313.         switch (Class) {
  1314.         case VANILLAKEY:
  1315.             keycode = Code;
  1316.  
  1317.             switch (keycode) {
  1318.             case 0x01:
  1319.                 keycode = AKEY_CTRL_a;
  1320.                 break;
  1321.             case 0x02:
  1322.                 keycode = AKEY_CTRL_b;
  1323.                 break;
  1324.             case 0x03:
  1325.                 keycode = AKEY_CTRL_c;
  1326.                 break;
  1327.             case 0x04:
  1328.                 keycode = AKEY_CTRL_d;
  1329.                 break;
  1330.             case 0x05:
  1331.                 keycode = AKEY_CTRL_E;
  1332.                 break;
  1333.             case 0x06:
  1334.                 keycode = AKEY_CTRL_F;
  1335.                 break;
  1336.             case 0x07:
  1337.                 keycode = AKEY_CTRL_G;
  1338.                 break;
  1339. /*
  1340.    case 0x08 :
  1341.    keycode = AKEY_CTRL_H;
  1342.    break;
  1343.  */
  1344. /* TAB - see case '\t' :
  1345.    case 0x09 :
  1346.    keycode = AKEY_CTRL_I;
  1347.    break;
  1348.  */
  1349.             case 0x0a:
  1350.                 keycode = AKEY_CTRL_J;
  1351.                 break;
  1352.             case 0x0b:
  1353.                 keycode = AKEY_CTRL_K;
  1354.                 break;
  1355.             case 0x0c:
  1356.                 keycode = AKEY_CTRL_L;
  1357.                 break;
  1358. /*
  1359.    case 0x0d :
  1360.    keycode = AKEY_CTRL_M;
  1361.    break;
  1362.  */
  1363.             case 0x0e:
  1364.                 keycode = AKEY_CTRL_N;
  1365.                 break;
  1366.             case 0x0f:
  1367.                 keycode = AKEY_CTRL_O;
  1368.                 break;
  1369.             case 0x10:
  1370.                 keycode = AKEY_CTRL_P;
  1371.                 break;
  1372.             case 0x11:
  1373.                 keycode = AKEY_CTRL_Q;
  1374.                 break;
  1375.             case 0x12:
  1376.                 keycode = AKEY_CTRL_R;
  1377.                 break;
  1378.             case 0x13:
  1379.                 keycode = AKEY_CTRL_S;
  1380.                 break;
  1381.             case 0x14:
  1382.                 keycode = AKEY_CTRL_T;
  1383.                 break;
  1384.             case 0x15:
  1385.                 keycode = AKEY_CTRL_U;
  1386.                 break;
  1387.             case 0x16:
  1388.                 keycode = AKEY_CTRL_V;
  1389.                 break;
  1390.             case 0x17:
  1391.                 keycode = AKEY_CTRL_W;
  1392.                 break;
  1393.             case 0x18:
  1394.                 keycode = AKEY_CTRL_X;
  1395.                 break;
  1396.             case 0x19:
  1397.                 keycode = AKEY_CTRL_Y;
  1398.                 break;
  1399.             case 0x1a:
  1400.                 keycode = AKEY_CTRL_Z;
  1401.                 break;
  1402.             case 8:
  1403.                 keycode = AKEY_BACKSPACE;
  1404.                 break;
  1405.             case 13:
  1406.                 keycode = AKEY_RETURN;
  1407.                 break;
  1408.             case 0x1b:
  1409.                 keycode = AKEY_ESCAPE;
  1410.                 break;
  1411.             case '0':
  1412.                 keycode = AKEY_0;
  1413.                 break;
  1414.             case '1':
  1415.                 keycode = AKEY_1;
  1416.                 break;
  1417.             case '2':
  1418.                 keycode = AKEY_2;
  1419.                 break;
  1420.             case '3':
  1421.                 keycode = AKEY_3;
  1422.                 break;
  1423.             case '4':
  1424.                 keycode = AKEY_4;
  1425.                 break;
  1426.             case '5':
  1427.                 keycode = AKEY_5;
  1428.                 break;
  1429.             case '6':
  1430.                 keycode = AKEY_6;
  1431.                 break;
  1432.             case '7':
  1433.                 keycode = AKEY_7;
  1434.                 break;
  1435.             case '8':
  1436.                 keycode = AKEY_8;
  1437.                 break;
  1438.             case '9':
  1439.                 keycode = AKEY_9;
  1440.                 break;
  1441.             case 'A':
  1442.             case 'a':
  1443.                 keycode = AKEY_a;
  1444.                 break;
  1445.             case 'B':
  1446.             case 'b':
  1447.                 keycode = AKEY_b;
  1448.                 break;
  1449.             case 'C':
  1450.             case 'c':
  1451.                 keycode = AKEY_c;
  1452.                 break;
  1453.             case 'D':
  1454.             case 'd':
  1455.                 keycode = AKEY_d;
  1456.                 break;
  1457.             case 'E':
  1458.             case 'e':
  1459.                 keycode = AKEY_e;
  1460.                 break;
  1461.             case 'F':
  1462.             case 'f':
  1463.                 keycode = AKEY_f;
  1464.                 break;
  1465.             case 'G':
  1466.             case 'g':
  1467.                 keycode = AKEY_g;
  1468.                 break;
  1469.             case 'H':
  1470.             case 'h':
  1471.                 keycode = AKEY_h;
  1472.                 break;
  1473.             case 'I':
  1474.             case 'i':
  1475.                 keycode = AKEY_i;
  1476.                 break;
  1477.             case 'J':
  1478.             case 'j':
  1479.                 keycode = AKEY_j;
  1480.                 break;
  1481.             case 'K':
  1482.             case 'k':
  1483.                 keycode = AKEY_k;
  1484.                 break;
  1485.             case 'L':
  1486.             case 'l':
  1487.                 keycode = AKEY_l;
  1488.                 break;
  1489.             case 'M':
  1490.             case 'm':
  1491.                 keycode = AKEY_m;
  1492.                 break;
  1493.             case 'N':
  1494.             case 'n':
  1495.                 keycode = AKEY_n;
  1496.                 break;
  1497.             case 'O':
  1498.             case 'o':
  1499.                 keycode = AKEY_o;
  1500.                 break;
  1501.             case 'P':
  1502.             case 'p':
  1503.                 keycode = AKEY_p;
  1504.                 break;
  1505.             case 'Q':
  1506.             case 'q':
  1507.                 keycode = AKEY_q;
  1508.                 break;
  1509.             case 'R':
  1510.             case 'r':
  1511.                 keycode = AKEY_r;
  1512.                 break;
  1513.             case 'S':
  1514.             case 's':
  1515.                 keycode = AKEY_s;
  1516.                 break;
  1517.             case 'T':
  1518.             case 't':
  1519.                 keycode = AKEY_t;
  1520.                 break;
  1521.             case 'U':
  1522.             case 'u':
  1523.                 keycode = AKEY_u;
  1524.                 break;
  1525.             case 'V':
  1526.             case 'v':
  1527.                 keycode = AKEY_v;
  1528.                 break;
  1529.             case 'W':
  1530.             case 'w':
  1531.                 keycode = AKEY_w;
  1532.                 break;
  1533.             case 'X':
  1534.             case 'x':
  1535.                 keycode = AKEY_x;
  1536.                 break;
  1537.             case 'Y':
  1538.             case 'y':
  1539.                 keycode = AKEY_y;
  1540.                 break;
  1541.             case 'Z':
  1542.             case 'z':
  1543.                 keycode = AKEY_z;
  1544.                 break;
  1545.             case ' ':
  1546.                 keycode = AKEY_SPACE;
  1547.                 break;
  1548.             case '\t':
  1549.                 keycode = AKEY_TAB;
  1550.                 break;
  1551.             case '!':
  1552.                 keycode = AKEY_EXCLAMATION;
  1553.                 break;
  1554.             case '"':
  1555.                 keycode = AKEY_DBLQUOTE;
  1556.                 break;
  1557.             case '#':
  1558.                 keycode = AKEY_HASH;
  1559.                 break;
  1560.             case '$':
  1561.                 keycode = AKEY_DOLLAR;
  1562.                 break;
  1563.             case '%':
  1564.                 keycode = AKEY_PERCENT;
  1565.                 break;
  1566.             case '&':
  1567.                 keycode = AKEY_AMPERSAND;
  1568.                 break;
  1569.             case '\'':
  1570.                 keycode = AKEY_QUOTE;
  1571.                 break;
  1572.             case '@':
  1573.                 keycode = AKEY_AT;
  1574.                 break;
  1575.             case '(':
  1576.                 keycode = AKEY_PARENLEFT;
  1577.                 break;
  1578.             case ')':
  1579.                 keycode = AKEY_PARENRIGHT;
  1580.                 break;
  1581.             case '<':
  1582.                 keycode = AKEY_LESS;
  1583.                 break;
  1584.             case '>':
  1585.                 keycode = AKEY_GREATER;
  1586.                 break;
  1587.             case '=':
  1588.                 keycode = AKEY_EQUAL;
  1589.                 break;
  1590.             case '?':
  1591.                 keycode = AKEY_QUESTION;
  1592.                 break;
  1593.             case '-':
  1594.                 keycode = AKEY_MINUS;
  1595.                 break;
  1596.             case '+':
  1597.                 keycode = AKEY_PLUS;
  1598.                 break;
  1599.             case '*':
  1600.                 keycode = AKEY_ASTERISK;
  1601.                 break;
  1602.             case '/':
  1603.                 keycode = AKEY_SLASH;
  1604.                 break;
  1605.             case ':':
  1606.                 keycode = AKEY_COLON;
  1607.                 break;
  1608.             case ';':
  1609.                 keycode = AKEY_SEMICOLON;
  1610.                 break;
  1611.             case ',':
  1612.                 keycode = AKEY_COMMA;
  1613.                 break;
  1614.             case '.':
  1615.                 keycode = AKEY_FULLSTOP;
  1616.                 break;
  1617.             case '_':
  1618.                 keycode = AKEY_UNDERSCORE;
  1619.                 break;
  1620.             case '[':
  1621.                 keycode = AKEY_BRACKETLEFT;
  1622.                 break;
  1623.             case ']':
  1624.                 keycode = AKEY_BRACKETRIGHT;
  1625.                 break;
  1626.             case '^':
  1627.                 keycode = AKEY_CIRCUMFLEX;
  1628.                 break;
  1629.             case '\\':
  1630.                 keycode = AKEY_BACKSLASH;
  1631.                 break;
  1632.             case '|':
  1633.                 keycode = AKEY_BAR;
  1634.                 break;
  1635.             default:
  1636.                 keycode = AKEY_NONE;
  1637.                 break;
  1638.             }
  1639.             break;
  1640.         case RAWKEY:
  1641.             switch (Code) {
  1642.             case 0x51:
  1643.                 consol &= 0x03;
  1644.                 keycode = AKEY_NONE;
  1645.                 break;
  1646.             case 0x52:
  1647.                 consol &= 0x05;
  1648.                 keycode = AKEY_NONE;
  1649.                 break;
  1650.             case 0x53:
  1651.                 consol &= 0x06;
  1652.                 keycode = AKEY_NONE;
  1653.                 break;
  1654.             case 0x55:
  1655.                 keycode = AKEY_PIL;
  1656.                 break;
  1657.             case 0x56:
  1658.                 keycode = AKEY_BREAK;
  1659.                 break;
  1660.             case 0x59:
  1661.                 keycode = AKEY_NONE;
  1662.                 break;
  1663.             case 0x4f:
  1664.                 keycode = AKEY_LEFT;
  1665.                 break;
  1666.             case 0x4c:
  1667.                 keycode = AKEY_UP;
  1668.                 break;
  1669.             case 0x4e:
  1670.                 keycode = AKEY_RIGHT;
  1671.                 break;
  1672.             case 0x4d:
  1673.                 keycode = AKEY_DOWN;
  1674.                 break;
  1675.             default:
  1676.                 break;
  1677.             }
  1678.             break;
  1679.         case MOUSEBUTTONS:
  1680.             if (Controller == controller_Paddle) {
  1681.                 switch (Code) {
  1682.                 case SELECTDOWN:
  1683.                     stick0 = 251;
  1684.                     break;
  1685.                 case SELECTUP:
  1686.                     stick0 = 255;
  1687.                     break;
  1688.                 default:
  1689.                     break;
  1690.                 }
  1691.             }
  1692.             break;
  1693.         case MOUSEMOVE:
  1694.             if (Controller == controller_Paddle) {
  1695.                 if (MouseX > 57) {
  1696.                     if (MouseX < 287) {
  1697.                         PaddlePos = 228 - (MouseX - 58);
  1698.                     }
  1699.                     else {
  1700.                         PaddlePos = 0;
  1701.                     }
  1702.                 }
  1703.                 else {
  1704.                     PaddlePos = 228;
  1705.                 }
  1706.             }
  1707.             break;
  1708.         case CLOSEWINDOW:
  1709.             if (DisplayYesNoWindow()) {
  1710.                 keycode = AKEY_EXIT;
  1711.             }
  1712.             break;
  1713.         case MENUPICK:
  1714.             switch (Menu) {
  1715.             case 0:
  1716.                 switch (Item) {
  1717.                 case 0:
  1718.                     Iconify();
  1719. /*
  1720.    DisplayNotSupportedWindow ();
  1721.  */
  1722.                     break;
  1723.                 case 1:
  1724.                     SystemTags
  1725.                         (
  1726.                             "Run >Nil: <Nil: MultiView Atari800.guide",
  1727.                             SYS_Input, NULL,
  1728.                             SYS_Output, NULL,
  1729.                             TAG_DONE
  1730.                         );
  1731.                     break;
  1732.                 case 2:
  1733.                     DisplayAboutWindow();
  1734.                     break;
  1735.                 case 3:
  1736.                     if (DisplayYesNoWindow()) {
  1737.                         keycode = AKEY_EXIT;
  1738.                     }
  1739.                     break;
  1740.                 default:
  1741.                     break;
  1742.                 }
  1743.                 break;
  1744.             case 1:
  1745.                 switch (Item) {
  1746.                 case 0:
  1747.                     if (InsertDisk(1)) {
  1748.                         keycode = AKEY_COLDSTART;
  1749.                     }
  1750.                     break;
  1751.                 case 1:
  1752.                     switch (SubItem) {
  1753.                     case 0:
  1754.                         if (InsertDisk(1)) {
  1755.                         }
  1756.                         break;
  1757.                     case 1:
  1758.                         if (InsertDisk(2)) {
  1759.                         }
  1760.                         break;
  1761.                     case 2:
  1762.                         if (InsertDisk(3)) {
  1763.                         }
  1764.                         break;
  1765.                     case 3:
  1766.                         if (InsertDisk(4)) {
  1767.                         }
  1768.                         break;
  1769.                     case 4:
  1770.                         if (InsertDisk(5)) {
  1771.                         }
  1772.                         break;
  1773.                     case 5:
  1774.                         if (InsertDisk(6)) {
  1775.                         }
  1776.                         break;
  1777.                     case 6:
  1778.                         if (InsertDisk(7)) {
  1779.                         }
  1780.                         break;
  1781.                     case 7:
  1782.                         if (InsertDisk(8)) {
  1783.                         }
  1784.                         break;
  1785.                     default:
  1786.                         break;
  1787.                     }
  1788.                     break;
  1789.                 case 2:
  1790.                     switch (SubItem) {
  1791.                     case 0:
  1792.                         SIO_Dismount(1);
  1793.                         break;
  1794.                     case 1:
  1795.                         SIO_Dismount(2);
  1796.                         break;
  1797.                     case 2:
  1798.                         SIO_Dismount(3);
  1799.                         break;
  1800.                     case 3:
  1801.                         SIO_Dismount(4);
  1802.                         break;
  1803.                     case 4:
  1804.                         SIO_Dismount(5);
  1805.                         break;
  1806.                     case 5:
  1807.                         SIO_Dismount(6);
  1808.                         break;
  1809.                     case 6:
  1810.                         SIO_Dismount(7);
  1811.                         break;
  1812.                     case 7:
  1813.                         SIO_Dismount(8);
  1814.                         break;
  1815.                     default:
  1816.                         break;
  1817.                     }
  1818.                     break;
  1819.                 case 3:
  1820.                     switch (SubItem) {
  1821.                     case 0:
  1822.                         InsertROM(0);
  1823.                         break;
  1824.                     case 1:
  1825.                         InsertROM(1);
  1826.                         break;
  1827.                     case 2:
  1828.                         InsertROM(2);
  1829.                         break;
  1830.                     default:
  1831.                         break;
  1832.                     }
  1833.                     break;
  1834.                 case 4:
  1835.                     Remove_ROM();
  1836.                     Coldstart();
  1837.                     break;
  1838.                 case 5:
  1839.                     EnablePILL();
  1840.                     Coldstart();
  1841.                     break;
  1842.                 case 6:
  1843.                     /*
  1844.                      * Atari800 OS/A
  1845.                      */
  1846.  
  1847.                     {
  1848.                         int status;
  1849.  
  1850.                         status = Initialise_AtariOSA();
  1851.                         if (status) {
  1852.                             if (machine == Atari) {
  1853.                                 menu_Console03->Flags = ITEMTEXT | HIGHCOMP;
  1854.                             }
  1855.                             else {
  1856.                                 menu_Console03->Flags = ITEMTEXT | ITEMENABLED | HIGHCOMP;
  1857.                             }
  1858.                         }
  1859.                         else {
  1860.                         }
  1861.                     }
  1862.                     break;
  1863.                 case 7:
  1864.                     /*
  1865.                      * Atari800 OS/B
  1866.                      */
  1867.  
  1868.                     {
  1869.                         int status;
  1870.                         status = Initialise_AtariOSB();
  1871.                         if (status) {
  1872.                             if (machine == Atari) {
  1873.                                 menu_Console03->Flags = ITEMTEXT | HIGHCOMP;
  1874.                             }
  1875.                             else {
  1876.                                 menu_Console03->Flags = ITEMTEXT | ITEMENABLED | HIGHCOMP;
  1877.                             }
  1878.                         }
  1879.                         else {
  1880.                         }
  1881.                     }
  1882.                     break;
  1883.                 case 8:
  1884.                     /*
  1885.                      * Atari800 XL
  1886.                      */
  1887.  
  1888.                     {
  1889.                         int status;
  1890.  
  1891.                         status = Initialise_AtariXL();
  1892.                         if (status) {
  1893.                             if (machine == Atari) {
  1894.                                 menu_Console03->Flags = ITEMTEXT | HIGHCOMP;
  1895.                             }
  1896.                             else {
  1897.                                 menu_Console03->Flags = ITEMTEXT | ITEMENABLED | HIGHCOMP;
  1898.                             }
  1899.                         }
  1900.                         else {
  1901.                         }
  1902.                     }
  1903.                     break;
  1904.                 case 9:
  1905.                     /*
  1906.                      * Atari XE
  1907.                      */
  1908.  
  1909.                     {
  1910.                         int status;
  1911.  
  1912.                         status = Initialise_AtariXE();
  1913.                         if (status) {
  1914.                             if (machine == Atari) {
  1915.                                 menu_Console03->Flags = ITEMTEXT | HIGHCOMP;
  1916.                             }
  1917.                             else {
  1918.                                 menu_Console03->Flags = ITEMTEXT | ITEMENABLED | HIGHCOMP;
  1919.                             }
  1920.                         }
  1921.                         else {
  1922.                         }
  1923.                     }
  1924.                     break;
  1925.                 default:
  1926.                     break;
  1927.                 }
  1928.                 break;
  1929.             case 2:
  1930.                 switch (Item) {
  1931.                 case 0:
  1932.                     consol &= 0x03;
  1933.                     keycode = AKEY_NONE;
  1934.                     break;
  1935.                 case 1:
  1936.                     consol &= 0x05;
  1937.                     keycode = AKEY_NONE;
  1938.                     break;
  1939.                 case 2:
  1940.                     consol &= 0x06;
  1941.                     keycode = AKEY_NONE;
  1942.                     break;
  1943.                 case 3:
  1944.                     keycode = AKEY_HELP;
  1945.                     break;
  1946.                 case 4:
  1947.                     keycode = AKEY_BREAK;
  1948.                     break;
  1949.                 case 5:
  1950.                     if (DisplayYesNoWindow()) {
  1951.                         keycode = AKEY_WARMSTART;
  1952.                     }
  1953.                     break;
  1954.                 case 6:
  1955.                     if (DisplayYesNoWindow()) {
  1956.                         keycode = AKEY_COLDSTART;
  1957.                     }
  1958.                     break;
  1959.                 default:
  1960.                     break;
  1961.                 }
  1962.                 break;
  1963.             case 3:
  1964.                 switch (Item) {
  1965.                 case 0:
  1966.                     switch (SubItem) {
  1967.                     case 0:
  1968.                         DisplayControllerWindow(0);
  1969.                         break;
  1970.                     case 1:
  1971.                         DisplayControllerWindow(1);
  1972.                         break;
  1973.                     case 2:
  1974.                         DisplayControllerWindow(2);
  1975.                         break;
  1976.                     case 3:
  1977.                         DisplayControllerWindow(3);
  1978.                         break;
  1979.                     default:
  1980.                         break;
  1981.                     }
  1982.                     break;
  1983.                 case 1:
  1984.                     switch (SubItem) {
  1985.                     case 0:
  1986.                         ColourEnabled = TRUE;
  1987.                         break;
  1988.                     case 1:
  1989.                         {
  1990.                             int i;
  1991.  
  1992.                             ColourEnabled = FALSE;
  1993.  
  1994.                             for (i = 0; i < 16; i++) {
  1995.                                 int rgb = colortable[i];
  1996.                                 int red;
  1997.                                 int green;
  1998.                                 int blue;
  1999.  
  2000.                                 red = (rgb & 0x00ff0000) >> 20;
  2001.                                 green = (rgb & 0x0000ff00) >> 12;
  2002.                                 blue = (rgb & 0x000000ff) >> 4;
  2003.  
  2004.                                 if (CustomScreen) {
  2005.                                     SetRGB4(&WindowMain->WScreen->ViewPort, i, red, green, blue);
  2006.                                 }
  2007.                                 else {
  2008.                                     SetRGB4(&WindowMain->WScreen->ViewPort, i + 4, red, green, blue);
  2009.                                 }
  2010.                             }
  2011.                         }
  2012.                         break;
  2013.                     default:
  2014.                         break;
  2015.                     }
  2016.                     break;
  2017.                 case 2:
  2018.                     switch (SubItem) {
  2019.                     case 0:
  2020.                         refresh_rate = 1;
  2021.                         break;
  2022.                     case 1:
  2023.                         refresh_rate = 2;
  2024.                         break;
  2025.                     case 2:
  2026.                         refresh_rate = 4;
  2027.                         break;
  2028.                     case 3:
  2029.                         refresh_rate = 8;
  2030.                         break;
  2031.                     default:
  2032.                         break;
  2033.                     }
  2034.                     break;
  2035.                 case 3:
  2036.                     switch (SubItem) {
  2037.                     case 0:
  2038.                         countdown_rate = 4000;
  2039.                         break;
  2040.                     case 1:
  2041.                         countdown_rate = 8000;
  2042.                         break;
  2043.                     case 2:
  2044.                         countdown_rate = 16000;
  2045.                         break;
  2046.                     case 3:
  2047.                         countdown_rate = 32000;
  2048.                         break;
  2049.                     default:
  2050.                         break;
  2051.                     }
  2052.                     break;
  2053.                 default:
  2054.                     break;
  2055.                 }
  2056.             default:
  2057.                 break;
  2058.             }
  2059.  
  2060.             UpdatePalette = TRUE;
  2061.  
  2062.             break;
  2063.         default:
  2064.             break;
  2065.         }
  2066.     }
  2067.  
  2068.     return keycode;
  2069. }
  2070.  
  2071.  
  2072.  
  2073. /*
  2074.  * ==============
  2075.  * Atari_Joystick
  2076.  * ==============
  2077.  */
  2078.  
  2079. /*
  2080.  * Revision     : v0.1.9a
  2081.  * Introduced   : NOT KNOWN (Before 2nd September 1995)
  2082.  * Last updated : 2nd September 1995
  2083.  */
  2084.  
  2085. int Atari_Joystick()
  2086. {
  2087.     WORD x;
  2088.     WORD y;
  2089.     UWORD code;
  2090.  
  2091.     int stick = 0;
  2092.  
  2093.     if (GetMsg(gameport_msg_port)) {
  2094.         x = gameport_data.ie_X;
  2095.         y = gameport_data.ie_Y;
  2096.         code = gameport_data.ie_Code;
  2097.  
  2098.         switch (x) {
  2099.         case -1:
  2100.             switch (y) {
  2101.             case -1:
  2102.                 stick = 10;
  2103.                 break;
  2104.             case 0:
  2105.                 stick = 11;
  2106.                 break;
  2107.             case 1:
  2108.                 stick = 9;
  2109.                 break;
  2110.             default:
  2111.                 break;
  2112.             }
  2113.             break;
  2114.         case 0:
  2115.             switch (y) {
  2116.             case -1:
  2117.                 stick = 14;
  2118.                 break;
  2119.             case 0:
  2120.                 stick = 15;
  2121.                 break;
  2122.             case 1:
  2123.                 stick = 13;
  2124.                 break;
  2125.             default:
  2126.                 break;
  2127.             }
  2128.             break;
  2129.         case 1:
  2130.             switch (y) {
  2131.             case -1:
  2132.                 stick = 6;
  2133.                 break;
  2134.             case 0:
  2135.                 stick = 7;
  2136.                 break;
  2137.             case 1:
  2138.                 stick = 5;
  2139.                 break;
  2140.             default:
  2141.                 break;
  2142.             }
  2143.             break;
  2144.         default:
  2145.             break;
  2146.         }
  2147.  
  2148.         if (code == IECODE_LBUTTON) {
  2149.             if (stick == 0) {
  2150.                 stick = old_stick_0 & 15;
  2151.             }
  2152.             else {
  2153.                 stick = stick & 15;
  2154.             }
  2155.         }
  2156.         if (code == IECODE_LBUTTON + IECODE_UP_PREFIX) {
  2157.             if (stick == 0) {
  2158.                 stick = old_stick_0 | 16;
  2159.             }
  2160.             else {
  2161.                 stick = stick | 16;
  2162.             }
  2163.         }
  2164.         old_stick_0 = stick;
  2165.         SendIO(gameport_io_msg);
  2166.     }
  2167.     if (stick == 0) {
  2168.         stick = old_stick_0;
  2169.     }
  2170.     stick0 = stick & 0x0f;
  2171.     trig0 = (stick & 0x10) >> 4;
  2172.  
  2173. /*
  2174.    printf ("stick0 = %d   trig0 = %d\n", stick0, trig0);
  2175.    return stick;
  2176.  */
  2177. }
  2178.  
  2179.  
  2180.  
  2181. /*
  2182.  * ==========
  2183.  * Atari_PORT
  2184.  * ==========
  2185.  */
  2186.  
  2187. /*
  2188.  * Revision     : v0.2.0a
  2189.  * Introduced   : 2nd September 1995
  2190.  * Last updated : 3rd September 1995
  2191.  *
  2192.  * Notes: Hook required by v0.2.0. All the work is actually done in
  2193.  * Atari_Joystick and Atari_Paddle.
  2194.  */
  2195.  
  2196. int Atari_PORT(int num)
  2197. {
  2198.     if (num == 0) {
  2199.         if (Controller == controller_Joystick) {
  2200.             Atari_Joystick();
  2201.             return 0xf0 | stick0;
  2202.         }
  2203.         else {
  2204.             return stick0;
  2205.         }
  2206.     }
  2207.     else {
  2208.         return 0xff;
  2209.     }
  2210. }
  2211.  
  2212.  
  2213.  
  2214. /*
  2215.  * ==========
  2216.  * Atari_TRIG
  2217.  * ==========
  2218.  */
  2219.  
  2220. /*
  2221.  * Revision     : v0.1.9a
  2222.  * Introduced   : 2nd September 1995
  2223.  * Last updated : 2nd September 1995
  2224.  *
  2225.  * Notes: Hook required by v0.1.9. All the work is actually done in
  2226.  * Atari_Joystick.
  2227.  */
  2228.  
  2229. int Atari_TRIG(int num)
  2230. {
  2231.     if (num == 0) {
  2232.         Atari_Joystick();
  2233.         return trig0;
  2234.     }
  2235.     else
  2236.         return 1;
  2237. }
  2238.  
  2239.  
  2240.  
  2241. /*
  2242.  * =========
  2243.  * Atari_POT
  2244.  * =========
  2245.  */
  2246.  
  2247. /*
  2248.  * Revision     : v0.2.0a
  2249.  * Introduced   : 2nd September 1995
  2250.  * Last updated : 3rd September 1995
  2251.  *
  2252.  * Notes: Currently acts as nothing more than a hook.
  2253.  */
  2254.  
  2255. int Atari_POT(int num)
  2256. {
  2257.     return PaddlePos;
  2258. }
  2259.  
  2260.  
  2261.  
  2262. /*
  2263.  * ============
  2264.  * Atari_CONSOL
  2265.  * ============
  2266.  */
  2267.  
  2268. /*
  2269.  * Revision     : v0.1.9a
  2270.  * Introduced   : 2nd September 1995
  2271.  * Last updated : 2nd September 1995
  2272.  *
  2273.  * Notes: Hook required by v0.1.9. All the work is actually done in
  2274.  * Atari_Keyboard.
  2275.  */
  2276.  
  2277. int Atari_CONSOL(void)
  2278. {
  2279.     return consol;
  2280. }
  2281.  
  2282.  
  2283.  
  2284. /*
  2285.  * ==================
  2286.  * DisplayAboutWindow
  2287.  * ==================
  2288.  */
  2289.  
  2290. /*
  2291.  * Revision     : v0.3.3
  2292.  * Introduced   : 2nd September 1995
  2293.  * Last updated : 7th March 1996
  2294.  */
  2295.  
  2296. void DisplayAboutWindow(void)
  2297. {
  2298.     ULONG Class;
  2299.     USHORT Code;
  2300.     APTR Address;
  2301.  
  2302.     struct IntuiMessage *IntuiMessage;
  2303.  
  2304.     struct NewWindow NewWindow;
  2305.  
  2306.     struct Gadget *Gadget1 = NULL;
  2307.  
  2308.     int QuitRoutine;
  2309.  
  2310.     NewWindow.LeftEdge = 12;
  2311.     NewWindow.TopEdge = 46;
  2312.     NewWindow.Width = 296;
  2313.     NewWindow.Height = 148;
  2314.     NewWindow.DetailPen = 0;
  2315.     NewWindow.BlockPen = 15;
  2316.     NewWindow.IDCMPFlags = CLOSEWINDOW | GADGETUP;
  2317.     NewWindow.Flags = WINDOWCLOSE | GIMMEZEROZERO | WINDOWDRAG | SMART_REFRESH | ACTIVATE;
  2318.     NewWindow.FirstGadget = NULL;
  2319.     NewWindow.CheckMark = NULL;
  2320.     NewWindow.Title = ATARI_TITLE;
  2321.     NewWindow.Screen = ScreenMain;
  2322.     NewWindow.Type = ScreenType;
  2323.     NewWindow.BitMap = NULL;
  2324.     NewWindow.MinWidth = 92;
  2325.     NewWindow.MinHeight = 65;
  2326.     NewWindow.MaxWidth = 1280;
  2327.     NewWindow.MaxHeight = 512;
  2328.  
  2329.     WindowAbout = (struct Window *) OpenWindowTags
  2330.         (
  2331.             &NewWindow,
  2332.             WA_NewLookMenus, TRUE,
  2333.             WA_MenuHelp, TRUE,
  2334.             WA_ScreenTitle, ATARI_TITLE,
  2335.             TAG_DONE
  2336.         );
  2337.  
  2338.     if (ScreenType == CUSTOMSCREEN) {
  2339.         SetRast(WindowAbout->RPort, 6);
  2340.     }
  2341.     Rule(0, 15, 288, WindowAbout);
  2342.  
  2343.     {
  2344.         char temp[128];
  2345.         char *ptr;
  2346.  
  2347.         strcpy(temp, ATARI_TITLE);
  2348.         ptr = strchr(temp, ',');
  2349.         if (ptr) {
  2350.             int title_len;
  2351.             int version_len;
  2352.  
  2353.             *ptr++ = '\0';
  2354.             ptr++;
  2355.  
  2356.             title_len = strlen(temp);
  2357.             version_len = strlen(ptr);
  2358.  
  2359.             ShowText((36 - title_len), 1, WindowAbout, temp);
  2360.             ShowText((36 - version_len), 4, WindowAbout, ptr);
  2361.         }
  2362.         else {
  2363.             ShowText(19, 1, WindowAbout, "Atari800 Emulator");
  2364.             ShowText(21, 4, WindowAbout, "Version Unknown");
  2365.         }
  2366.  
  2367.         ShowText(17, 7, WindowAbout, "Original program by");
  2368.         ShowText(25, 9, WindowAbout, "David Firth");
  2369.         ShowText(18, 12, WindowAbout, "Amiga Module V8 by");
  2370.         ShowText(20, 14, WindowAbout, "Stephen A. Firth");
  2371.     }
  2372.  
  2373.     Gadget1 = MakeGadget(55, 17, 64, 14, 0, WindowAbout, "Ok", gadget_Button);
  2374.  
  2375.     QuitRoutine = FALSE;
  2376.  
  2377.     while (QuitRoutine == FALSE) {
  2378.         while (IntuiMessage = (struct IntuiMessage *) GetMsg(WindowAbout->UserPort)) {
  2379.             Class = IntuiMessage->Class;
  2380.             Code = IntuiMessage->Code;
  2381.             Address = IntuiMessage->IAddress;
  2382.  
  2383.             ReplyMsg(IntuiMessage);
  2384.  
  2385.             switch (Class) {
  2386.             case CLOSEWINDOW:
  2387.                 QuitRoutine = TRUE;
  2388.                 break;
  2389.             case GADGETUP:
  2390.                 if (Address == (APTR) Gadget1) {
  2391.                     QuitRoutine = TRUE;
  2392.                 }
  2393.                 break;
  2394.             default:
  2395.                 break;
  2396.             }
  2397.         }
  2398.     }
  2399.  
  2400.     CloseWindow(WindowAbout);
  2401. }
  2402.  
  2403.  
  2404.  
  2405. /*
  2406.  * ==================
  2407.  * DisplaySetupWindow
  2408.  * ==================
  2409.  */
  2410.  
  2411. /*
  2412.  * Revision     : v0.2.1
  2413.  * Introduced   : 3rd September 1995
  2414.  * Last updated : 12th October 1995
  2415.  */
  2416.  
  2417. void DisplaySetupWindow(void)
  2418. {
  2419.     ULONG Class;
  2420.     USHORT Code;
  2421.     APTR Address;
  2422.  
  2423.     struct IntuiMessage *IntuiMessage;
  2424.  
  2425.     struct NewWindow NewWindow;
  2426.  
  2427.     struct Gadget *Gadget1 = NULL;
  2428.     struct Gadget *Gadget2 = NULL;
  2429.     struct Gadget *Gadget3 = NULL;
  2430.     struct Gadget *Gadget4 = NULL;
  2431.     struct Gadget *Gadget5 = NULL;
  2432.     struct Gadget *Gadget6 = NULL;
  2433.     struct Gadget *Gadget7 = NULL;
  2434.  
  2435.     int QuitRoutine;
  2436.  
  2437.     NewWindow.LeftEdge = 0;
  2438.     NewWindow.TopEdge = 11;
  2439.     NewWindow.Width = 296;
  2440.     NewWindow.Height = 148;        /* 177 */
  2441.     NewWindow.DetailPen = 0;
  2442.     NewWindow.BlockPen = 15;
  2443.     NewWindow.IDCMPFlags = CLOSEWINDOW | GADGETUP;
  2444.     NewWindow.Flags = WINDOWCLOSE | GIMMEZEROZERO | WINDOWDRAG | SMART_REFRESH | ACTIVATE;
  2445.     NewWindow.FirstGadget = NULL;
  2446.     NewWindow.CheckMark = NULL;
  2447.     NewWindow.Title = ATARI_TITLE;
  2448.     NewWindow.Screen = NULL;
  2449.     NewWindow.Type = WBENCHSCREEN;
  2450.     NewWindow.BitMap = NULL;
  2451.     NewWindow.MinWidth = 92;
  2452.     NewWindow.MinHeight = 65;
  2453.     NewWindow.MaxWidth = 1280;
  2454.     NewWindow.MaxHeight = 512;
  2455.  
  2456.     WindowSetup = (struct Window *) OpenWindowTags
  2457.         (
  2458.             &NewWindow,
  2459.             WA_NewLookMenus, TRUE,
  2460.             WA_MenuHelp, TRUE,
  2461.             WA_ScreenTitle, ATARI_TITLE,
  2462.             TAG_DONE
  2463.         );
  2464.  
  2465.     Rule(0, 15, 288, WindowSetup);
  2466.  
  2467.     ShowText(1, 1, WindowSetup, "Display:");
  2468.  
  2469. /*
  2470.    ShowText (17, 1, WindowSetup, "CLI Startup Options");
  2471.  
  2472.    ShowText (2, 4, WindowSetup, "-ocs      OCS emulation module");
  2473.    ShowText (2, 6, WindowSetup, "-ecs      ECS emulation module");
  2474.    ShowText (2, 8, WindowSetup, "-aga      AGA emulation module");
  2475.  
  2476.    ShowText (2, 11, WindowSetup, "-wb       Open window on Workbench");
  2477.    ShowText (2, 13, WindowSetup, "          (forces ECS emulation)");
  2478.  
  2479.    ShowText (2, 16, WindowSetup, "-colour   Colour display");
  2480.    ShowText (2, 18, WindowSetup, "-grey     Grey scale display");
  2481.  */
  2482.  
  2483. /*
  2484.    Gadget1 = MakeGadget (0, 21, 64, 14, 0, WindowSetup, "AGA Screen", gadget_Button);
  2485.    Gadget2 = MakeGadget (24, 21, 64, 14, 0, WindowSetup, "ECS Screen", gadget_Button);
  2486.    Gadget3 = MakeGadget (48, 21, 64, 14, 0, WindowSetup, "OCS Screen", gadget_Button);
  2487.    Gadget4 = MakeGadget (0, 23, 64, 14, 0, WindowSetup, "AGA Window", gadget_Button);
  2488.    Gadget5 = MakeGadget (24, 23, 64, 14, 0, WindowSetup, "ECS Window", gadget_Button);
  2489.    Gadget6 = MakeGadget (48, 23, 64, 14, 0, WindowSetup, "OCS Window", gadget_Button);
  2490.  */
  2491.     Gadget1 = MakeGadget(3, 3, 16, 14, 0, WindowSetup, "AGA Screen", gadget_Mutual);
  2492.     Gadget1->Flags = GADGIMAGE | GADGHIMAGE | SELECTED;
  2493.     Gadget2 = MakeGadget(3, 5, 16, 14, 0, WindowSetup, "ECS Screen", gadget_Mutual);
  2494.     Gadget3 = MakeGadget(3, 7, 16, 14, 0, WindowSetup, "OCS Screen", gadget_Mutual);
  2495.     Gadget4 = MakeGadget(3, 9, 16, 14, 0, WindowSetup, "AGA Window", gadget_Mutual);
  2496.     Gadget5 = MakeGadget(3, 11, 16, 14, 0, WindowSetup, "ECS Window", gadget_Mutual);
  2497.     Gadget6 = MakeGadget(3, 13, 16, 14, 0, WindowSetup, "OCS Window", gadget_Mutual);
  2498.     Gadget7 = MakeGadget(55, 17, 64, 14, 0, WindowSetup, "Ok", gadget_Button);
  2499.  
  2500.     RefreshGadgets(Gadget1, WindowSetup, NULL);
  2501.  
  2502.     QuitRoutine = FALSE;
  2503.  
  2504.     while (QuitRoutine == FALSE) {
  2505.         while (IntuiMessage = (struct IntuiMessage *) GetMsg(WindowSetup->UserPort)) {
  2506.             Class = IntuiMessage->Class;
  2507.             Code = IntuiMessage->Code;
  2508.             Address = IntuiMessage->IAddress;
  2509.  
  2510.             ReplyMsg(IntuiMessage);
  2511.  
  2512.             switch (Class) {
  2513.             case CLOSEWINDOW:
  2514.                 QuitRoutine = TRUE;
  2515.                 break;
  2516.             case GADGETUP:
  2517.                 {
  2518.                     int NewFlagsForGadget1 = GADGIMAGE | GADGHIMAGE;
  2519.                     int NewFlagsForGadget2 = GADGIMAGE | GADGHIMAGE;
  2520.                     int NewFlagsForGadget3 = GADGIMAGE | GADGHIMAGE;
  2521.                     int NewFlagsForGadget4 = GADGIMAGE | GADGHIMAGE;
  2522.                     int NewFlagsForGadget5 = GADGIMAGE | GADGHIMAGE;
  2523.                     int NewFlagsForGadget6 = GADGIMAGE | GADGHIMAGE;
  2524.                     int NewFlags = FALSE;
  2525.  
  2526.                     if (Address == (APTR) Gadget1) {
  2527.                         ChipSet = AGA_ChipSet;
  2528.                         CustomScreen = TRUE;
  2529.                         NewFlagsForGadget1 = GADGIMAGE | GADGHIMAGE | SELECTED;
  2530.                         NewFlags = TRUE;
  2531.                     }
  2532.                     else if (Address == (APTR) Gadget2) {
  2533.                         ChipSet = ECS_ChipSet;
  2534.                         CustomScreen = TRUE;
  2535.                         NewFlagsForGadget2 = GADGIMAGE | GADGHIMAGE | SELECTED;
  2536.                         NewFlags = TRUE;
  2537.                     }
  2538.                     else if (Address == (APTR) Gadget3) {
  2539.                         ChipSet = OCS_ChipSet;
  2540.                         CustomScreen = TRUE;
  2541.                         NewFlagsForGadget3 = GADGIMAGE | GADGHIMAGE | SELECTED;
  2542.                         NewFlags = TRUE;
  2543.                     }
  2544.                     else if (Address == (APTR) Gadget4) {
  2545.                         /*
  2546.                          * NOTE: AGA Window Modes Currently Not Supported
  2547.                          */
  2548.  
  2549.                         DisplayNotSupportedWindow();
  2550.  
  2551.                         Gadget4->Flags = GADGIMAGE | GADGHIMAGE;
  2552.                         RefreshGadgets(Gadget1, WindowSetup, NULL);
  2553. /*
  2554.    QuitRoutine = TRUE;
  2555.    ChipSet = ECS_ChipSet;
  2556.    CustomScreen = FALSE;
  2557.  */
  2558.                     }
  2559.                     else if (Address == (APTR) Gadget5) {
  2560.                         ChipSet = ECS_ChipSet;
  2561.                         CustomScreen = FALSE;
  2562.                         NewFlagsForGadget5 = GADGIMAGE | GADGHIMAGE | SELECTED;
  2563.                         NewFlags = TRUE;
  2564.                     }
  2565.                     else if (Address == (APTR) Gadget6) {
  2566.                         ChipSet = OCS_ChipSet;
  2567.                         CustomScreen = FALSE;
  2568.                         NewFlagsForGadget6 = GADGIMAGE | GADGHIMAGE | SELECTED;
  2569.                         NewFlags = TRUE;
  2570.                     }
  2571.                     else if (Address == (APTR) Gadget7) {
  2572.                         QuitRoutine = TRUE;
  2573.                     }
  2574.                     if (NewFlags) {
  2575.                         Gadget1->Flags = NewFlagsForGadget1;
  2576.                         Gadget2->Flags = NewFlagsForGadget2;
  2577.                         Gadget3->Flags = NewFlagsForGadget3;
  2578.                         Gadget4->Flags = NewFlagsForGadget4;
  2579.                         Gadget5->Flags = NewFlagsForGadget5;
  2580.                         Gadget6->Flags = NewFlagsForGadget6;
  2581.                         RefreshGadgets(Gadget1, WindowSetup, NULL);
  2582.                     }
  2583.                 }
  2584.                 break;
  2585.             default:
  2586.                 break;
  2587.             }
  2588.         }
  2589.     }
  2590.  
  2591.     CloseWindow(WindowSetup);
  2592. }
  2593.  
  2594.  
  2595.  
  2596. /*
  2597.  * =======================
  2598.  * DisplayControllerWindow
  2599.  * =======================
  2600.  */
  2601.  
  2602. /*
  2603.  * Revision     : v0.2.1a
  2604.  * Introduced   : 3rd October 1995
  2605.  * Last updated : 12th October 1995
  2606.  */
  2607.  
  2608. void DisplayControllerWindow(int Port)
  2609. {
  2610.     ULONG Class;
  2611.     USHORT Code;
  2612.     APTR Address;
  2613.  
  2614.     struct IntuiMessage *IntuiMessage;
  2615.  
  2616.     struct NewWindow NewWindow;
  2617.  
  2618.     struct Gadget *Gadget1 = NULL;
  2619.     struct Gadget *Gadget2 = NULL;
  2620.     struct Gadget *Gadget3 = NULL;
  2621.     struct Gadget *Gadget4 = NULL;
  2622.     struct Gadget *Gadget5 = NULL;
  2623.     struct Gadget *Gadget6 = NULL;
  2624.     struct Gadget *Gadget7 = NULL;
  2625.     struct Gadget *Gadget8 = NULL;
  2626.     struct Gadget *Gadget9 = NULL;
  2627.  
  2628.     int QuitRoutine;
  2629.     int Accepted;
  2630.     int NewController;
  2631.  
  2632.     NewWindow.LeftEdge = 0;
  2633.     NewWindow.TopEdge = 11;
  2634.     NewWindow.Width = 296;
  2635. /* Re-insert for v.0.2.2
  2636.    NewWindow.Height = 155;
  2637.  */
  2638.     NewWindow.Height = 92;        /* 177 */
  2639.     NewWindow.DetailPen = 0;
  2640.     NewWindow.BlockPen = 15;
  2641.     NewWindow.IDCMPFlags = CLOSEWINDOW | GADGETUP;
  2642.     NewWindow.Flags = WINDOWCLOSE | GIMMEZEROZERO | WINDOWDRAG | SMART_REFRESH | ACTIVATE;
  2643.     NewWindow.FirstGadget = NULL;
  2644.     NewWindow.CheckMark = NULL;
  2645.     NewWindow.Title = "Controller Options";
  2646.     NewWindow.Screen = ScreenMain;
  2647.     NewWindow.Type = ScreenType;
  2648.     NewWindow.BitMap = NULL;
  2649.     NewWindow.MinWidth = 92;
  2650.     NewWindow.MinHeight = 65;
  2651.     NewWindow.MaxWidth = 1280;
  2652.     NewWindow.MaxHeight = 512;
  2653.  
  2654.     WindowController = (struct Window *) OpenWindowTags
  2655.         (
  2656.             &NewWindow,
  2657.             WA_NewLookMenus, TRUE,
  2658.             WA_MenuHelp, TRUE,
  2659.             WA_ScreenTitle, ATARI_TITLE,
  2660.             TAG_DONE
  2661.         );
  2662.  
  2663.     if (ScreenType == CUSTOMSCREEN) {
  2664.         SetRast(WindowController->RPort, 6);
  2665.     }
  2666. /* Re-insert for v0.2.2
  2667.    Rule (0, 16, 288, WindowController);
  2668.  */
  2669.     Rule(0, 7, 288, WindowController);
  2670.  
  2671.     ShowText(1, 1, WindowController, "Emulate:");
  2672.  
  2673.     Gadget1 = MakeGadget(3, 3, 16, 14, 0, WindowController, "Joystick", gadget_Mutual);
  2674.  
  2675.     if (Controller == controller_Joystick) {
  2676.         Gadget1->Flags = GADGIMAGE | GADGHIMAGE | SELECTED;
  2677.     }
  2678.     Gadget2 = MakeGadget(3, 5, 16, 14, 0, WindowController, "Paddle", gadget_Mutual);
  2679.  
  2680.     if (Controller == controller_Paddle) {
  2681.         Gadget2->Flags = GADGIMAGE | GADGHIMAGE | SELECTED;
  2682.     }
  2683. /* Re-insert for v0.2.2
  2684.    ShowText (36, 1, WindowController, "Via:");
  2685.  
  2686.    Gadget3 = MakeGadget (38, 3, 16, 14, 0, WindowController, "Joystick", gadget_Mutual);
  2687.    Gadget4 = MakeGadget (38, 5, 16, 14, 0, WindowController, "Mouse", gadget_Mutual);
  2688.  
  2689.    ShowText (1, 8, WindowController, "Amiga port:");
  2690.  
  2691.    Gadget5 = MakeGadget (3, 10, 16, 14, 0, WindowController, "0", gadget_Mutual);
  2692.    Gadget6 = MakeGadget (3, 12, 16, 14, 0, WindowController, "1", gadget_Mutual);
  2693.    Gadget7 = MakeGadget (3, 14, 16, 14, 0, WindowController, "None", gadget_Mutual);
  2694.  
  2695.    Gadget8 = MakeGadget (39, 18, 64, 14, 0, WindowController, "Ok", gadget_Button);
  2696.    Gadget9 = MakeGadget (55, 18, 64, 14, 0, WindowController, "Cancel", gadget_Button);
  2697.  */
  2698.  
  2699.     Gadget8 = MakeGadget(39, 9, 64, 14, 0, WindowController, "Ok", gadget_Button);
  2700.     Gadget9 = MakeGadget(55, 9, 64, 14, 0, WindowController, "Cancel", gadget_Button);
  2701.  
  2702.     RefreshGadgets(Gadget1, WindowController, NULL);
  2703.  
  2704.     QuitRoutine = FALSE;
  2705.     Accepted = FALSE;
  2706.  
  2707.     NewController = Controller;
  2708.  
  2709.     while (QuitRoutine == FALSE) {
  2710.         while (IntuiMessage = (struct IntuiMessage *) GetMsg(WindowController->UserPort)) {
  2711.             Class = IntuiMessage->Class;
  2712.             Code = IntuiMessage->Code;
  2713.             Address = IntuiMessage->IAddress;
  2714.  
  2715.             ReplyMsg(IntuiMessage);
  2716.  
  2717.             switch (Class) {
  2718.             case CLOSEWINDOW:
  2719.                 QuitRoutine = TRUE;
  2720.                 break;
  2721.             case GADGETUP:
  2722.                 if (Address == (APTR) Gadget1) {
  2723.                     Gadget1->Flags = GADGIMAGE | GADGHIMAGE | SELECTED;
  2724.                     Gadget2->Flags = GADGIMAGE | GADGHIMAGE;
  2725.                     RefreshGadgets(Gadget1, WindowController, NULL);
  2726.                     NewController = controller_Joystick;
  2727.                 }
  2728.                 else if (Address == (APTR) Gadget2) {
  2729.                     Gadget1->Flags = GADGIMAGE | GADGHIMAGE;
  2730.                     Gadget2->Flags = GADGIMAGE | GADGHIMAGE | SELECTED;
  2731.                     RefreshGadgets(Gadget1, WindowController, NULL);
  2732.                     NewController = controller_Paddle;
  2733.                 }
  2734. /* Re-insert for v0.2.2
  2735.    else if (Address == (APTR) Gadget3)
  2736.    {
  2737.    }
  2738.    else if (Address == (APTR) Gadget4)
  2739.    {
  2740.    }
  2741.    else if (Address == (APTR) Gadget5)
  2742.    {
  2743.    }
  2744.    else if (Address == (APTR) Gadget6)
  2745.    {
  2746.    }
  2747.    else if (Address == (APTR) Gadget7)
  2748.    {
  2749.    }
  2750.  */
  2751.                 else if (Address == (APTR) Gadget8) {
  2752.                     QuitRoutine = TRUE;
  2753.                     Accepted = TRUE;
  2754.                 }
  2755.                 else if (Address == (APTR) Gadget9) {
  2756.                     QuitRoutine = TRUE;
  2757.                 }
  2758.                 break;
  2759.             default:
  2760.                 break;
  2761.             }
  2762.         }
  2763.     }
  2764.  
  2765.     if (Accepted) {
  2766.         Controller = NewController;
  2767.     }
  2768.     CloseWindow(WindowController);
  2769. }
  2770.  
  2771.  
  2772.  
  2773. /*
  2774.  * =========================
  2775.  * DisplayNotSupportedWindow
  2776.  * =========================
  2777.  */
  2778.  
  2779. /*
  2780.  * Revision     : v0.2.0
  2781.  * Introduced   : 3rd September 1995
  2782.  * Last updated : 9th September 1995
  2783.  */
  2784.  
  2785. void DisplayNotSupportedWindow(void)
  2786. {
  2787.     ULONG Class;
  2788.     USHORT Code;
  2789.     APTR Address;
  2790.  
  2791.     struct IntuiMessage *IntuiMessage;
  2792.  
  2793.     struct NewWindow NewWindow;
  2794.  
  2795.     struct Gadget *Gadget1 = NULL;
  2796.  
  2797.     int QuitRoutine;
  2798.  
  2799.     NewWindow.LeftEdge = 12;
  2800.     NewWindow.TopEdge = 91;
  2801.     NewWindow.Width = 296;
  2802.     NewWindow.Height = 57;
  2803.     NewWindow.DetailPen = 0;
  2804.     NewWindow.BlockPen = 15;
  2805.     NewWindow.IDCMPFlags = CLOSEWINDOW | GADGETUP;
  2806.     NewWindow.Flags = WINDOWCLOSE | GIMMEZEROZERO | WINDOWDRAG | SMART_REFRESH | ACTIVATE;
  2807.     NewWindow.FirstGadget = NULL;
  2808.     NewWindow.CheckMark = NULL;
  2809.     NewWindow.Title = "Warning!";
  2810.     NewWindow.Screen = ScreenMain;
  2811.     NewWindow.Type = ScreenType;
  2812.     NewWindow.BitMap = NULL;
  2813.     NewWindow.MinWidth = 92;
  2814.     NewWindow.MinHeight = 65;
  2815.     NewWindow.MaxWidth = 1280;
  2816.     NewWindow.MaxHeight = 512;
  2817.  
  2818.     WindowNotSupported = (struct Window *) OpenWindowTags
  2819.         (
  2820.             &NewWindow,
  2821.             WA_NewLookMenus, TRUE,
  2822.             WA_MenuHelp, TRUE,
  2823.             WA_ScreenTitle, ATARI_TITLE,
  2824.             TAG_DONE
  2825.         );
  2826.  
  2827.     if (ScreenType == CUSTOMSCREEN) {
  2828.         SetRast(WindowNotSupported->RPort, 6);
  2829.     }
  2830.     Rule(0, 2, 288, WindowNotSupported);
  2831.  
  2832.     ShowText(15, 1, WindowNotSupported, "Feature not supported");
  2833.  
  2834.     Gadget1 = MakeGadget(55, 4, 64, 14, 0, WindowNotSupported, "Ok", gadget_Button);
  2835.  
  2836.     QuitRoutine = FALSE;
  2837.  
  2838.     while (QuitRoutine == FALSE) {
  2839.         while (IntuiMessage = (struct IntuiMessage *) GetMsg(WindowNotSupported->UserPort)) {
  2840.             Class = IntuiMessage->Class;
  2841.             Code = IntuiMessage->Code;
  2842.             Address = IntuiMessage->IAddress;
  2843.  
  2844.             ReplyMsg(IntuiMessage);
  2845.  
  2846.             switch (Class) {
  2847.             case CLOSEWINDOW:
  2848.                 QuitRoutine = TRUE;
  2849.                 break;
  2850.             case GADGETUP:
  2851.                 if (Address == (APTR) Gadget1) {
  2852.                     QuitRoutine = TRUE;
  2853.                 }
  2854.                 break;
  2855.             default:
  2856.                 break;
  2857.             }
  2858.         }
  2859.     }
  2860.  
  2861.     CloseWindow(WindowNotSupported);
  2862. }
  2863.  
  2864.  
  2865.  
  2866. /*
  2867.  * ==================
  2868.  * DisplayYesNoWindow
  2869.  * ==================
  2870.  */
  2871.  
  2872. /*
  2873.  * Revision     : v0.2.0a
  2874.  * Introduced   : 9th September 1995
  2875.  * Last updated : 9th September 1995
  2876.  */
  2877.  
  2878. int DisplayYesNoWindow(void)
  2879. {
  2880.     ULONG Class;
  2881.     USHORT Code;
  2882.     APTR Address;
  2883.  
  2884.     struct IntuiMessage *IntuiMessage;
  2885.  
  2886.     struct NewWindow NewWindow;
  2887.  
  2888.     struct Gadget *Gadget1 = NULL;
  2889.     struct Gadget *Gadget2 = NULL;
  2890.  
  2891.     int QuitRoutine;
  2892.     int Answer;
  2893.  
  2894.     Answer = FALSE;
  2895.  
  2896.     NewWindow.LeftEdge = 12;
  2897.     NewWindow.TopEdge = 91;
  2898.     NewWindow.Width = 296;
  2899.     NewWindow.Height = 57;
  2900.     NewWindow.DetailPen = 0;
  2901.     NewWindow.BlockPen = 15;
  2902.     NewWindow.IDCMPFlags = CLOSEWINDOW | GADGETUP;
  2903.     NewWindow.Flags = WINDOWCLOSE | GIMMEZEROZERO | WINDOWDRAG | SMART_REFRESH | ACTIVATE;
  2904.     NewWindow.FirstGadget = NULL;
  2905.     NewWindow.CheckMark = NULL;
  2906.     NewWindow.Title = "Warning!";
  2907.     NewWindow.Screen = ScreenMain;
  2908.     NewWindow.Type = ScreenType;
  2909.     NewWindow.BitMap = NULL;
  2910.     NewWindow.MinWidth = 92;
  2911.     NewWindow.MinHeight = 65;
  2912.     NewWindow.MaxWidth = 1280;
  2913.     NewWindow.MaxHeight = 512;
  2914.  
  2915.     WindowYesNo = (struct Window *) OpenWindowTags
  2916.         (
  2917.             &NewWindow,
  2918.             WA_NewLookMenus, TRUE,
  2919.             WA_MenuHelp, TRUE,
  2920.             WA_ScreenTitle, ATARI_TITLE,
  2921.             TAG_DONE
  2922.         );
  2923.  
  2924.     if (ScreenType == CUSTOMSCREEN) {
  2925.         SetRast(WindowYesNo->RPort, 6);
  2926.     }
  2927.     Rule(0, 2, 288, WindowYesNo);
  2928.  
  2929.     ShowText(1, 1, WindowYesNo, "Are you sure?");
  2930.  
  2931.     Gadget1 = MakeGadget(39, 4, 64, 14, 0, WindowYesNo, "Ok", gadget_Button);
  2932.     Gadget2 = MakeGadget(55, 4, 64, 14, 0, WindowYesNo, "Cancel", gadget_Button);
  2933.  
  2934.     QuitRoutine = FALSE;
  2935.  
  2936.     while (QuitRoutine == FALSE) {
  2937.         while (IntuiMessage = (struct IntuiMessage *) GetMsg(WindowYesNo->UserPort)) {
  2938.             Class = IntuiMessage->Class;
  2939.             Code = IntuiMessage->Code;
  2940.             Address = IntuiMessage->IAddress;
  2941.  
  2942.             ReplyMsg(IntuiMessage);
  2943.  
  2944.             switch (Class) {
  2945.             case CLOSEWINDOW:
  2946.                 QuitRoutine = TRUE;
  2947.                 break;
  2948.             case GADGETUP:
  2949.                 if (Address == (APTR) Gadget1) {
  2950.                     QuitRoutine = TRUE;
  2951.                     Answer = TRUE;
  2952.                 }
  2953.                 else if (Address == (APTR) Gadget2) {
  2954.                     QuitRoutine = TRUE;
  2955.                 }
  2956.                 break;
  2957.             default:
  2958.                 break;
  2959.             }
  2960.         }
  2961.     }
  2962.  
  2963.     CloseWindow(WindowYesNo);
  2964.  
  2965.     return Answer;
  2966. }
  2967.  
  2968.  
  2969.  
  2970. /*
  2971.  * ============
  2972.  * MakeMenuItem
  2973.  * ============
  2974.  */
  2975.  
  2976. /*
  2977.  * Revision     : v0.2.0
  2978.  * Introduced   : NOT KNOWN (Before 2nd September 1995)
  2979.  * Last updated : 9th September 1995
  2980.  *
  2981.  * Notes: A simple routine to help GUI development.
  2982.  */
  2983.  
  2984. struct MenuItem *MakeMenuItem(int LeftEdge, int TopEdge, int Width,
  2985.                            int Height, char *Title, int Key, int Exclude)
  2986. {
  2987.     struct IntuiText *IntuiText;
  2988.     struct MenuItem *MenuItem;
  2989.  
  2990.     IntuiText = (struct IntuiText *) malloc(sizeof(struct IntuiText));
  2991.     if (!IntuiText) {
  2992.     }
  2993.     IntuiText->FrontPen = 1;
  2994.     IntuiText->BackPen = 2;
  2995.     IntuiText->DrawMode = JAM1;
  2996.     IntuiText->LeftEdge = NULL;
  2997.     IntuiText->TopEdge = 1;
  2998.     IntuiText->ITextFont = NULL;
  2999.     IntuiText->IText = (UBYTE *) Title;
  3000.     IntuiText->NextText = NULL;
  3001.  
  3002.     MenuItem = (struct MenuItem *) malloc(sizeof(struct MenuItem));
  3003.     if (!MenuItem) {
  3004.     }
  3005.     MenuItem->NextItem = NULL;
  3006.     MenuItem->LeftEdge = LeftEdge;
  3007.     MenuItem->TopEdge = TopEdge;
  3008.     MenuItem->Width = Width;
  3009.     MenuItem->Height = Height;
  3010.  
  3011.     MenuItem->Flags = ITEMTEXT | ITEMENABLED | HIGHCOMP;
  3012.  
  3013.     if (Key) {
  3014.         MenuItem->Flags = MenuItem->Flags | COMMSEQ;
  3015.     }
  3016.     if (Exclude) {
  3017.         MenuItem->Flags = MenuItem->Flags | CHECKIT;
  3018.     }
  3019. /*
  3020.    if (Key==NULL)   
  3021.    {
  3022.    MenuItem->Flags = ITEMTEXT | ITEMENABLED | HIGHCOMP;
  3023.    }
  3024.    else
  3025.    {
  3026.    MenuItem->Flags = ITEMTEXT | ITEMENABLED | HIGHCOMP | COMMSEQ;
  3027.    }
  3028.  */
  3029.  
  3030.     MenuItem->MutualExclude = Exclude;
  3031.     MenuItem->ItemFill = (APTR) IntuiText;
  3032.     MenuItem->SelectFill = NULL;
  3033.     MenuItem->Command = (BYTE) Key;
  3034.     MenuItem->SubItem = NULL;
  3035.     MenuItem->NextSelect = MENUNULL;
  3036.  
  3037.     return MenuItem;
  3038. }
  3039.  
  3040.  
  3041.  
  3042. /*
  3043.  * ========
  3044.  * MakeMenu
  3045.  * ========
  3046.  */
  3047.  
  3048. /*
  3049.  * Revision     : v0.1.8
  3050.  * Introduced   : NOT KNOWN (Before 2nd September 1995)
  3051.  * Last updated : NOT KNOWN (Before 2nd September 1995)
  3052.  *
  3053.  * Notes: A simple routine to help GUI development.
  3054.  */
  3055.  
  3056. struct Menu *MakeMenu(int LeftEdge, int TopEdge, int Width, char *Title, struct MenuItem *MenuItem)
  3057. {
  3058.     struct Menu *Menu;
  3059.  
  3060.     Menu = (struct Menu *) malloc(sizeof(struct Menu));
  3061.     if (!Menu) {
  3062.     }
  3063.     Menu->NextMenu = NULL;
  3064.     Menu->LeftEdge = LeftEdge;
  3065.     Menu->TopEdge = TopEdge;
  3066.     Menu->Width = Width;
  3067.     Menu->Height = 0;
  3068.     Menu->Flags = MENUENABLED;
  3069.     Menu->MenuName = Title;
  3070.     Menu->FirstItem = MenuItem;
  3071.  
  3072.     return Menu;
  3073. }
  3074.  
  3075.  
  3076.  
  3077. /*
  3078.  * ==========
  3079.  * MakeGadget
  3080.  * ==========
  3081.  */
  3082.  
  3083. /*
  3084.  * Revision     : v0.2.1a
  3085.  * Introduced   : 2nd September 1995
  3086.  * Last updated : 9th October 1995
  3087.  *
  3088.  * Notes: Not complete yet. The Type argument is currently not supported so
  3089.  * routine is only capable of producing boring click-me-to-continue type
  3090.  * gadgets.
  3091.  */
  3092.  
  3093. struct Gadget *MakeGadget(int LeftEdge, int TopEdge, int Width, int Height, int Offset, struct Window *Window, char *Title, int Type)
  3094. {
  3095.     int Result;
  3096.     int TextX;
  3097.  
  3098.     struct IntuiText *NewTextAddress = NULL;
  3099.     struct Gadget *NewGadgetAddress = NULL;
  3100.  
  3101.     NewGadgetAddress = (struct Gadget *) malloc(sizeof(struct Gadget));
  3102.     if (!NewGadgetAddress) {
  3103.     }
  3104.     NewGadgetAddress->NextGadget = NULL;
  3105. /*
  3106.    NewGadgetAddress->LeftEdge = LeftEdge;
  3107.    NewGadgetAddress->TopEdge = TopEdge;
  3108.  */
  3109.     NewGadgetAddress->Width = Width;
  3110.     NewGadgetAddress->Height = Height;
  3111.  
  3112.     NewGadgetAddress->Flags = GADGIMAGE | GADGHIMAGE;
  3113.     NewGadgetAddress->Activation = RELVERIFY;
  3114.     NewGadgetAddress->GadgetType = BOOLGADGET;
  3115.     if (Type == gadget_Button) {
  3116.         NewGadgetAddress->GadgetRender = &image_Button64;
  3117.         NewGadgetAddress->SelectRender = &image_Button64Selected;
  3118.     }
  3119.     else if (Type == gadget_Mutual) {
  3120.         NewGadgetAddress->Activation = TOGGLESELECT | RELVERIFY;
  3121.         NewGadgetAddress->GadgetRender = &image_MutualGadget;
  3122.         NewGadgetAddress->SelectRender = &image_MutualGadgetSelected;
  3123.     }
  3124.     else {
  3125.         NewGadgetAddress->Flags = GADGHCOMP;
  3126.     }
  3127.  
  3128.     NewGadgetAddress->GadgetText = NULL;
  3129.     NewGadgetAddress->MutualExclude = NULL;
  3130.     NewGadgetAddress->SpecialInfo = NULL;
  3131.     NewGadgetAddress->GadgetID = 0;
  3132.     NewGadgetAddress->UserData = NULL;
  3133.  
  3134.     LeftEdge = (LeftEdge * gui_GridWidth) + gui_WindowOffsetLeftEdge;
  3135.     TopEdge = (TopEdge * gui_GridHeight) + gui_WindowOffsetTopEdge + 1 + ((gui_GridHeight - 7) * 2);
  3136.  
  3137.     NewGadgetAddress->LeftEdge = LeftEdge;
  3138.     NewGadgetAddress->TopEdge = TopEdge;
  3139.     NewGadgetAddress->Width = Width;
  3140.     NewGadgetAddress->Height = Height;
  3141.  
  3142.     if (Type == gadget_Button) {
  3143.         TextX = (Width / 2) - (strlen(Title) * 4);
  3144.     }
  3145.     else if (Type == gadget_Mutual) {
  3146.         TextX = 24;
  3147.     }
  3148.     NewTextAddress = (struct IntuiText *) malloc(sizeof(struct IntuiText));
  3149.     if (!NewTextAddress) {
  3150.     }
  3151.     NewTextAddress->FrontPen = 1;
  3152.     NewTextAddress->BackPen = 3;
  3153.     NewTextAddress->DrawMode = JAM1;
  3154.     NewTextAddress->LeftEdge = TextX;
  3155.     NewTextAddress->TopEdge = 3;
  3156.     NewTextAddress->ITextFont = NULL;
  3157.     NewTextAddress->IText = (UBYTE *) Title;
  3158.     NewTextAddress->NextText = NULL;
  3159.  
  3160.     NewGadgetAddress->GadgetText = NewTextAddress;
  3161.  
  3162.     if (NewGadgetAddress->Activation & TOGGLESELECT) {
  3163.         if (Title) {
  3164.             if (Offset) {
  3165.                 NewTextAddress->LeftEdge = Offset;
  3166.             }
  3167.         }
  3168.     }
  3169.     if (Window) {
  3170.         Result = AddGadget(Window, NewGadgetAddress, -1);
  3171.         RefreshGadgets(NewGadgetAddress, Window, NULL);
  3172.     }
  3173.     return NewGadgetAddress;
  3174. }
  3175.  
  3176.  
  3177.  
  3178. /*
  3179.  * ========
  3180.  * ShowText
  3181.  * ========
  3182.  */
  3183.  
  3184. /*
  3185.  * Revision     : v0.2.0
  3186.  * Introduced   : 2nd September 1995
  3187.  * Last updated : 9th September 1995
  3188.  *
  3189.  * Notes: A simple routine to help any future GUI development.
  3190.  */
  3191.  
  3192. void ShowText(int LeftEdge, int TopEdge, struct Window *Window, char *TextString)
  3193. {
  3194.     if (ScreenType == CUSTOMSCREEN) {
  3195.         SetAPen(Window->RPort, 0);
  3196.         SetBPen(Window->RPort, 6);
  3197.     }
  3198.     else {
  3199.         SetAPen(Window->RPort, 1);
  3200.         SetBPen(Window->RPort, 0);
  3201.     }
  3202.  
  3203.     LeftEdge = (LeftEdge * gui_GridWidth);
  3204.     TopEdge = (TopEdge * gui_GridHeight) + ((gui_GridHeight - 7) * 2);
  3205.  
  3206.     if (Window->Flags & GIMMEZEROZERO) {
  3207.         TopEdge = TopEdge + 8;
  3208.     }
  3209.     else {
  3210.         LeftEdge = LeftEdge + gui_WindowOffsetLeftEdge;
  3211.         TopEdge = TopEdge + gui_WindowOffsetTopEdge + 8;
  3212.     }
  3213.  
  3214.     Move(Window->RPort, LeftEdge, TopEdge);
  3215.     Text(Window->RPort, TextString, strlen(TextString));
  3216. }
  3217.  
  3218.  
  3219.  
  3220. /*
  3221.  * ====
  3222.  * Rule
  3223.  * ====
  3224.  */
  3225.  
  3226. /*
  3227.  * Revision     : v0.2.0
  3228.  * Introduced   : 2nd September 1995
  3229.  * Last updated : 9th September 1995
  3230.  *
  3231.  * Notes: A simple routine to help any future GUI development.
  3232.  */
  3233.  
  3234. void Rule(int LeftEdge, int TopEdge, int Width, struct Window *Window)
  3235. {
  3236.     int RightEdge;
  3237.  
  3238.     LeftEdge = (LeftEdge * gui_GridWidth) + gui_WindowOffsetLeftEdge;
  3239.     TopEdge = (TopEdge * gui_GridHeight) + 12 + gui_WindowOffsetTopEdge;    /* + 44 */
  3240.  
  3241.     RightEdge = Width + LeftEdge - 1;
  3242.  
  3243.     if (ScreenType == CUSTOMSCREEN) {
  3244.         SetAPen(Window->RPort, 0);
  3245.     }
  3246.     else {
  3247.         SetAPen(Window->RPort, 1);
  3248.     }
  3249.  
  3250.     Move(Window->RPort, LeftEdge, TopEdge);
  3251.     Draw(Window->RPort, RightEdge, TopEdge);
  3252.  
  3253.     if (ScreenType == CUSTOMSCREEN) {
  3254.         SetAPen(Window->RPort, 15);
  3255.     }
  3256.     else {
  3257.         SetAPen(Window->RPort, 2);
  3258.     }
  3259.  
  3260.     Move(Window->RPort, LeftEdge, TopEdge + 1);
  3261.     Draw(Window->RPort, RightEdge, TopEdge + 1);
  3262. }
  3263.  
  3264.  
  3265.  
  3266. /*
  3267.  * ==========
  3268.  * InsertDisk
  3269.  * ==========
  3270.  */
  3271.  
  3272. /*
  3273.  * Revision     : v0.2.1
  3274.  * Introduced   : 24th September 1995
  3275.  * Last updated : 24th September 1995
  3276.  *
  3277.  * Notes: A simple routine to help any future GUI development.
  3278.  */
  3279.  
  3280. int InsertDisk(int Drive)
  3281. {
  3282.     struct FileRequester *FileRequester = NULL;
  3283.     char Filename[256];
  3284.     int Success = FALSE;
  3285.  
  3286.     if (FileRequester = (struct FileRequester *) AllocAslRequestTags(ASL_FileRequest, TAG_DONE)) {
  3287.         if (AslRequestTags(FileRequester,
  3288.                            ASLFR_Screen, ScreenMain,
  3289.                            ASLFR_TitleText, "Select file",
  3290.                            ASLFR_PositiveText, "Ok",
  3291.                            ASLFR_NegativeText, "Cancel",
  3292.                            TAG_DONE)) {
  3293.             printf("File selected: %s/%s\n", FileRequester->rf_Dir, FileRequester->rf_File);
  3294.             printf("Number of files : %d\n", FileRequester->fr_NumArgs);
  3295.  
  3296.             SIO_Dismount(Drive);
  3297.  
  3298.             if (FileRequester->rf_Dir) {
  3299.                 sprintf(Filename, "%s/%s", FileRequester->rf_Dir, FileRequester->rf_File);
  3300.             }
  3301.             else {
  3302.                 sprintf(Filename, "%s", FileRequester->rf_File);
  3303.             }
  3304.  
  3305.             if (!SIO_Mount(Drive, Filename)) {
  3306.             }
  3307.             else {
  3308.                 Success = TRUE;
  3309.             }
  3310.         }
  3311.         else {
  3312.             /*
  3313.              * Cancelled
  3314.              */
  3315.         }
  3316.     }
  3317.     else {
  3318.         printf("Unable to create requester\n");
  3319.     }
  3320.  
  3321.     return Success;
  3322. }
  3323.  
  3324.  
  3325.  
  3326. /*
  3327.  * =========
  3328.  * InsertROM
  3329.  * =========
  3330.  */
  3331.  
  3332. /*
  3333.  * Revision     : v0.3.3
  3334.  * Introduced   : 10th March 1996
  3335.  * Last updated : 10th March 1996
  3336.  */
  3337.  
  3338. int InsertROM(int CartType)
  3339. {
  3340.     struct FileRequester *FileRequester = NULL;
  3341.     char Filename[256];
  3342.     int Success = FALSE;
  3343.  
  3344.     if (FileRequester = (struct FileRequester *) AllocAslRequestTags(ASL_FileRequest, TAG_DONE)) {
  3345.         if (AslRequestTags(FileRequester,
  3346.                            ASLFR_Screen, ScreenMain,
  3347.                            ASLFR_TitleText, "Select file",
  3348.                            ASLFR_PositiveText, "Ok",
  3349.                            ASLFR_NegativeText, "Cancel",
  3350.                            TAG_DONE)) {
  3351.             printf("File selected: %s/%s\n", FileRequester->rf_Dir, FileRequester->rf_File);
  3352.             printf("Number of files : %d\n", FileRequester->fr_NumArgs);
  3353.  
  3354.             if (FileRequester->rf_Dir) {
  3355.                 sprintf(Filename, "%s/%s", FileRequester->rf_Dir, FileRequester->rf_File);
  3356.             }
  3357.             else {
  3358.                 sprintf(Filename, "%s", FileRequester->rf_File);
  3359.             }
  3360.  
  3361.             if (CartType == 0) {
  3362.                 Remove_ROM();
  3363.                 if (Insert_8K_ROM(Filename)) {
  3364.                     Coldstart();
  3365.                 }
  3366.             }
  3367.             else if (CartType == 1) {
  3368.                 Remove_ROM();
  3369.                 if (Insert_16K_ROM(Filename)) {
  3370.                     Coldstart();
  3371.                 }
  3372.             }
  3373.             else if (CartType == 2) {
  3374.                 Remove_ROM();
  3375.                 if (Insert_OSS_ROM(Filename)) {
  3376.                     Coldstart();
  3377.                 }
  3378.             }
  3379.         }
  3380.         else {
  3381.             /*
  3382.              * Cancelled
  3383.              */
  3384.         }
  3385.     }
  3386.     else {
  3387.         printf("Unable to create requester\n");
  3388.     }
  3389.  
  3390.     return Success;
  3391. }
  3392.  
  3393.  
  3394.  
  3395. insert_rom_callback()
  3396. {
  3397. /*
  3398.    xv_set (chooser,
  3399.    FRAME_LABEL, "ROM Selector",
  3400.    FILE_CHOOSER_DIRECTORY, ATARI_ROM_DIR,
  3401.    FILE_CHOOSER_NOTIFY_FUNC, rom_change,
  3402.    XV_SHOW, TRUE,
  3403.    NULL);
  3404.  */
  3405. }
  3406.  
  3407.  
  3408.  
  3409. /*
  3410.  * ============
  3411.  * SetupDisplay
  3412.  * ============
  3413.  */
  3414.  
  3415. /*
  3416.  * Revision     : v0.3.3
  3417.  * Introduced   : 10th March 1996
  3418.  * Last updated : 10th March 1996
  3419.  */
  3420.  
  3421. SetupDisplay()
  3422. {
  3423.     struct NewWindow NewWindow;
  3424.     int i;
  3425.  
  3426.     /*
  3427.      * ===========
  3428.      * Screen Pens
  3429.      * ===========
  3430.      */
  3431.  
  3432.     WORD ScreenPens[13] =
  3433.     {
  3434.         15,                        /* Unknown */
  3435.         15,                        /* Unknown */
  3436.         0,                        /* Windows titlebar text when inactive */
  3437.         15,                        /* Windows bright edges */
  3438.         0,                        /* Windows dark edges */
  3439.         120,                    /* Windows titlebar when active */
  3440.         0,                        /* Windows titlebar text when active */
  3441.         4,                        /* Windows titlebar when inactive */
  3442.         15,                        /* Unknown */
  3443.         0,                        /* Menubar text */
  3444.         15,                        /* Menubar */
  3445.         0,                        /* Menubar base */
  3446.         -1
  3447.     };
  3448.  
  3449.     /*
  3450.      * =============
  3451.      * Create Screen
  3452.      * =============
  3453.      */
  3454.  
  3455.     if (CustomScreen) {
  3456.         ScreenType = CUSTOMSCREEN;
  3457.  
  3458.         ScreenWidth = ATARI_WIDTH - 64;        /* ATARI_WIDTH + 8; */
  3459.         ScreenHeight = ATARI_HEIGHT;    /* ATARI_HEIGHT + 13; */
  3460.  
  3461.         if (ChipSet == AGA_ChipSet) {
  3462.             ScreenDepth = 8;
  3463.         }
  3464.         else {
  3465.             ScreenDepth = 5;
  3466.         }
  3467.  
  3468.         NewScreen.LeftEdge = 0;
  3469.         NewScreen.TopEdge = 0;
  3470.         NewScreen.Width = ScreenWidth;
  3471.         NewScreen.Height = ScreenHeight;
  3472.         NewScreen.Depth = ScreenDepth;
  3473.         NewScreen.DetailPen = 1;
  3474.         NewScreen.BlockPen = 2;    /* 2 */
  3475.         NewScreen.ViewModes = NULL;
  3476.         NewScreen.Type = CUSTOMSCREEN;
  3477.         NewScreen.Font = NULL;
  3478.         NewScreen.DefaultTitle = ATARI_TITLE;
  3479.         NewScreen.Gadgets = NULL;
  3480.         NewScreen.CustomBitMap = NULL;
  3481.  
  3482.         ScreenMain = (struct Screen *) OpenScreenTags
  3483.             (
  3484.                 &NewScreen,
  3485.                 SA_Left, 0,
  3486.                 SA_Top, 0,
  3487.                 SA_Width, ScreenWidth,
  3488.                 SA_Height, ScreenHeight,
  3489.                 SA_Depth, ScreenDepth,
  3490.                 SA_DetailPen, 1,
  3491.                 SA_BlockPen, 2,    /* 2 */
  3492.                 SA_Pens, ScreenPens,
  3493.                 SA_Title, ATARI_TITLE,
  3494.                 SA_Type, CUSTOMSCREEN,
  3495. /*
  3496.    SA_Overscan, OSCAN_STANDARD,
  3497.  */
  3498. /*
  3499.    SA_DisplayID, ScreenID,
  3500.  */
  3501.                 SA_AutoScroll, TRUE,
  3502. /*
  3503.    SA_Interleaved, TRUE,
  3504.  */
  3505.                 TAG_DONE
  3506.             );
  3507.  
  3508.         if (ChipSet == AGA_ChipSet) {
  3509.             TotalColours = 256;
  3510.         }
  3511.         else {
  3512.             TotalColours = 16;
  3513.         }
  3514.  
  3515.         for (i = 0; i < TotalColours; i++) {
  3516.             int rgb = colortable[i];
  3517.             int red;
  3518.             int green;
  3519.             int blue;
  3520.  
  3521.             red = (rgb & 0x00ff0000) >> 20;
  3522.             green = (rgb & 0x0000ff00) >> 12;
  3523.             blue = (rgb & 0x000000ff) >> 4;
  3524.  
  3525.             SetRGB4(&ScreenMain->ViewPort, i, red, green, blue);
  3526.         }
  3527.  
  3528.         image_Button64.PlanePick = 9;
  3529.         image_Button64.PlaneOnOff = (UBYTE) 6;
  3530.         image_Button64Selected.PlanePick = 9;
  3531.         image_Button64Selected.PlaneOnOff = (UBYTE) 6;
  3532.         image_MutualGadget.PlanePick = 9;
  3533.         image_MutualGadget.PlaneOnOff = (UBYTE) 6;
  3534.         image_MutualGadgetSelected.PlanePick = 9;
  3535.         image_MutualGadgetSelected.PlaneOnOff = (UBYTE) 6;
  3536.     }
  3537.     else {
  3538.         ScreenType = WBENCHSCREEN;
  3539.  
  3540.         ScreenWidth = ATARI_WIDTH;    /* ATARI_WIDTH + 8; */
  3541.         ScreenHeight = ATARI_HEIGHT;    /* ATARI_HEIGHT + 13; */
  3542.     }
  3543.  
  3544.     /*
  3545.      * =============
  3546.      * Create Window
  3547.      * =============
  3548.      */
  3549.  
  3550.     NewWindow.DetailPen = 0;
  3551.     NewWindow.BlockPen = 148;
  3552.  
  3553.     if (CustomScreen) {
  3554.         NewWindow.LeftEdge = 0;
  3555.         NewWindow.TopEdge = 0;
  3556.         NewWindow.Width = ScreenWidth;    /* ATARI_WIDTH + 8; */
  3557.         NewWindow.Height = ScreenHeight;    /* ATARI_HEIGHT + 13; */
  3558.         NewWindow.IDCMPFlags = SELECTDOWN | SELECTUP | MOUSEBUTTONS | MOUSEMOVE | MENUPICK | MENUVERIFY | MOUSEBUTTONS | GADGETUP | RAWKEY | VANILLAKEY;
  3559.  
  3560.         /*
  3561.          * If you use the ClickToFront commodity it might be a good idea to
  3562.          * enable the BACKDROP option in the NewWindow.Flags line below.
  3563.          */
  3564.  
  3565.         NewWindow.Flags = /* BACKDROP | */ REPORTMOUSE | BORDERLESS | GIMMEZEROZERO | SMART_REFRESH | ACTIVATE;
  3566.         NewWindow.Title = NULL;
  3567.     }
  3568.     else {
  3569.         NewWindow.LeftEdge = 0;
  3570.         NewWindow.TopEdge = 11;
  3571.         NewWindow.Width = ScreenWidth + 8;    /* ATARI_WIDTH + 8; */
  3572.         NewWindow.Height = ScreenHeight + 13;    /* ATARI_HEIGHT + 13; */
  3573.         NewWindow.IDCMPFlags = SELECTDOWN | SELECTUP | MOUSEBUTTONS | MOUSEMOVE | CLOSEWINDOW | MENUPICK | MENUVERIFY | MOUSEBUTTONS | GADGETUP | RAWKEY | VANILLAKEY;
  3574.         NewWindow.Flags = REPORTMOUSE | WINDOWCLOSE | GIMMEZEROZERO | WINDOWDRAG | WINDOWDEPTH | SMART_REFRESH | ACTIVATE;
  3575.         NewWindow.Title = ATARI_TITLE;
  3576.     }
  3577.  
  3578.     NewWindow.FirstGadget = NULL;
  3579.     NewWindow.CheckMark = NULL;
  3580.     NewWindow.Screen = ScreenMain;
  3581.     NewWindow.Type = ScreenType;
  3582.     NewWindow.BitMap = NULL;
  3583.     NewWindow.MinWidth = 50;
  3584.     NewWindow.MinHeight = 11;
  3585.     NewWindow.MaxWidth = 1280;
  3586.     NewWindow.MaxHeight = 512;
  3587.  
  3588.     WindowMain = (struct Window *) OpenWindowTags
  3589.         (
  3590.             &NewWindow,
  3591.             WA_NewLookMenus, TRUE,
  3592.             WA_MenuHelp, TRUE,
  3593.             WA_ScreenTitle, ATARI_TITLE,
  3594. /*
  3595.    WA_Zoom, Zoomdata,
  3596.  */
  3597.             TAG_DONE
  3598.         );
  3599.  
  3600.     if (!WindowMain) {
  3601.         printf("Failed to create window\n");
  3602.         Atari_Exit(0);
  3603.     }
  3604. }
  3605.  
  3606.  
  3607.  
  3608. /*
  3609.  * =======
  3610.  * Iconify
  3611.  * =======
  3612.  */
  3613.  
  3614. /*
  3615.  * Revision     : v0.3.3
  3616.  * Introduced   : 10th March 1996
  3617.  * Last updated : 10th March 1996
  3618.  */
  3619.  
  3620. Iconify()
  3621. {
  3622.     ULONG Class;
  3623.     USHORT Code;
  3624.     APTR Address;
  3625.  
  3626.     struct IntuiMessage *IntuiMessage;
  3627.  
  3628.     struct NewWindow NewWindow;
  3629.  
  3630.     int QuitRoutine;
  3631.  
  3632.     ClearMenuStrip(WindowMain);
  3633.  
  3634.     if (WindowMain) {
  3635.         CloseWindow(WindowMain);
  3636.     }
  3637.     if (ScreenMain) {
  3638.         CloseScreen(ScreenMain);
  3639.     }
  3640.     NewWindow.LeftEdge = 0;
  3641.     NewWindow.TopEdge = 11;
  3642.     NewWindow.Width = 112;
  3643.     NewWindow.Height = 21;
  3644.     NewWindow.DetailPen = 0;
  3645.     NewWindow.BlockPen = 15;
  3646.     NewWindow.IDCMPFlags = CLOSEWINDOW;
  3647.     NewWindow.Flags = WINDOWCLOSE | WINDOWDRAG | ACTIVATE;
  3648.     NewWindow.FirstGadget = NULL;
  3649.     NewWindow.CheckMark = NULL;
  3650.     NewWindow.Title = "Atari800e";
  3651.     NewWindow.Screen = NULL;
  3652.     NewWindow.Type = WBENCHSCREEN;
  3653.     NewWindow.BitMap = NULL;
  3654.     NewWindow.MinWidth = 92;
  3655.     NewWindow.MinHeight = 21;
  3656.     NewWindow.MaxWidth = 1280;
  3657.     NewWindow.MaxHeight = 512;
  3658.  
  3659.     WindowIconified = (struct Window *) OpenWindowTags
  3660.         (
  3661.             &NewWindow,
  3662.             WA_NewLookMenus, TRUE,
  3663.             WA_MenuHelp, TRUE,
  3664.             WA_ScreenTitle, ATARI_TITLE,
  3665.             TAG_DONE
  3666.         );
  3667.  
  3668.     QuitRoutine = FALSE;
  3669.  
  3670.     while (QuitRoutine == FALSE) {
  3671.         while (IntuiMessage = (struct IntuiMessage *) GetMsg(WindowIconified->UserPort)) {
  3672.             Class = IntuiMessage->Class;
  3673.             Code = IntuiMessage->Code;
  3674.             Address = IntuiMessage->IAddress;
  3675.  
  3676.             ReplyMsg(IntuiMessage);
  3677.  
  3678.             switch (Class) {
  3679.             case CLOSEWINDOW:
  3680.                 QuitRoutine = TRUE;
  3681.                 break;
  3682.             default:
  3683.                 break;
  3684.             }
  3685.         }
  3686.     }
  3687.  
  3688.     CloseWindow(WindowIconified);
  3689.  
  3690.     SetupDisplay();
  3691.  
  3692.     SetMenuStrip(WindowMain, menu_Project);
  3693. }
  3694.