]> Shamusworld >> Repos - apple2/commitdiff
First steps towards making config window/settings stick.
authorShamus Hammons <jlhamm@acm.org>
Tue, 8 Sep 2020 22:01:44 +0000 (17:01 -0500)
committerShamus Hammons <jlhamm@acm.org>
Tue, 8 Sep 2020 22:01:44 +0000 (17:01 -0500)
src/gui/config.cpp
src/gui/diskselector.cpp
src/gui/diskselector.h
src/gui/elements.h
src/harddrive.cpp
src/settings.cpp
src/settings.h
src/v65c02.cpp

index 2fba40d4473df1cd83b932ca125d35663d00925f..20db97f906470d58e5c8a8d17f0fbe5039ba9f1b 100644 (file)
@@ -118,7 +118,15 @@ static const char slotNum[7][(5 * 5) + 1] =
 };
 
 //static uint8_t card1[(96 * 11) + 1] = { 0 };
+/*
+0123456789ABCDEF
+----------------
+@ABCDEFGHIJKLMNO
+PQRSTUVWXYZ
 
+m zorched to D ($6D -> $44) [0110 1101 -> 0100 0100]
+
+*/
 
 void Config::Init(SDL_Renderer * renderer)
 {
@@ -158,7 +166,7 @@ void Config::Init(SDL_Renderer * renderer)
        SDL_SetRenderTarget(renderer, cardTex[2]);
        GUI::DrawString(renderer, 6, 0, "SCSI");
 
-       cardBay =  SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, 123, 99);
+       cardBay = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, 123, 99);
        SDL_SetTextureBlendMode(cardBay, SDL_BLENDMODE_BLEND);
        SDL_SetRenderTarget(renderer, cardBay);
        SDL_SetRenderDrawColor(renderer, 0x00, 0x00, 0x00, 0x00);
@@ -183,11 +191,11 @@ void Config::Init(SDL_Renderer * renderer)
        objList.push_back(new CheckBox(1, 27, &cbnChecked, cbnText));
 
        objList.push_back(new LineEdit(1, 6, le1, 48, le1Text));
-       objList.push_back(new Draggable(1 * FONT_WIDTH, 8 * FONT_HEIGHT, 96, 11, cardTex[0]));
-       objList.push_back(new Draggable(1 * FONT_WIDTH, 9 * FONT_HEIGHT, 96, 11, cardTex[0]));
-       objList.push_back(new Draggable(1 * FONT_WIDTH, 10 * FONT_HEIGHT, 96, 11, cardTex[1]));
-       objList.push_back(new Draggable(1 * FONT_WIDTH, 11 * FONT_HEIGHT, 96, 11, cardTex[1]));
-       objList.push_back(new Draggable(1 * FONT_WIDTH, 12 * FONT_HEIGHT, 96, 11, cardTex[2]));
+       objList.push_back(new Draggable(1 * FONT_WIDTH, 8 * FONT_HEIGHT, 96, 11, &settings.cardSlot[0], cardTex[0]));
+       objList.push_back(new Draggable(1 * FONT_WIDTH, 9 * FONT_HEIGHT, 96, 11, &settings.cardSlot[1], cardTex[0]));
+       objList.push_back(new Draggable(1 * FONT_WIDTH, 10 * FONT_HEIGHT, 96, 11, &settings.cardSlot[2], cardTex[1]));
+       objList.push_back(new Draggable(1 * FONT_WIDTH, 11 * FONT_HEIGHT, 96, 11, &settings.cardSlot[3], cardTex[1]));
+       objList.push_back(new Draggable(1 * FONT_WIDTH, 12 * FONT_HEIGHT, 96, 11, &settings.cardSlot[4], cardTex[2]));
 }
 
 
@@ -275,17 +283,19 @@ void Config::MouseUp(int32_t x, int32_t y, uint32_t buttons)
                        {
                                d->dragging = false;
 
-                               if ((d->r.x > 120) && (d->r.x < 220) && (d->r.y > (8 * FONT_HEIGHT)) && (d->r.y < (15 * FONT_HEIGHT)))
+                               if ((d->r.x > 120) && (d->r.x < 220)
+                                       && (d->r.y > (8 * FONT_HEIGHT))
+                                       && (d->r.y < (15 * FONT_HEIGHT)))
                                {
-                                       d->spot = ((d->r.y - (8 * FONT_HEIGHT)) / FONT_HEIGHT) + 1;
+                                       *(d->spot) = ((d->r.y - (8 * FONT_HEIGHT)) / FONT_HEIGHT) + 1;
                                        d->r.x = 120;
-                                       d->r.y = (7 + d->spot) * FONT_HEIGHT;
+                                       d->r.y = (7 + *(d->spot)) * FONT_HEIGHT;
                                }
                                else
                                {
                                        d->r.x = d->homex;
                                        d->r.y = d->homey;
-                                       d->spot = 0;
+                                       *(d->spot) = 0;
                                }
 
                                refresh = true;
index 8e7820fdc9a7d4dde1a567cfa34f7cda4bfe8d97..ac3ec44682f8b3993bc8137f13491bc3b71a0cab 100644 (file)
@@ -115,6 +115,7 @@ SDL_Texture * scrollLeftIcon = NULL;
 SDL_Texture * scrollRightIcon = NULL;
 bool DiskSelector::showWindow = false;
 std::vector<FileStruct> fsList;
+std::vector<FileStruct> hdList;
 
 
 void DiskSelector::Init(SDL_Renderer * renderer)
@@ -139,6 +140,7 @@ void DiskSelector::Init(SDL_Renderer * renderer)
 
        SDL_UpdateTexture(window, NULL, windowPixels, DS_WIDTH * sizeof(Uint32));
        FindDisks();
+       FindHardDisks();
        DrawFilenames(renderer);
 }
 
@@ -156,8 +158,12 @@ void DiskSelector::FindDisks(void)
        WriteLog("GUI (DiskSelector)::FindDisks(): # of columns is %i (%i files)\n", numColumns, fsList.size());
 }
 
+
 /*
-OK, so the way that you can determine if a file is a directory in a cross-platform way is to do an opendir() call on a discovered filename.  If it returns NULL, then it's a regular file and not a directory.  Though I think the Linux method is more elegant.  :-P
+OK, so the way that you can determine if a file is a directory in a cross-
+platform way is to do an opendir() call on a discovered filename.  If it
+returns NULL, then it's a regular file and not a directory.  Though I think the
+Linux method is more elegant.  :-P
 */
 //
 // Find all disks images within path (recursive call does depth first search)
@@ -356,6 +362,71 @@ bool DiskSelector::HasLegalExtension(const char * name)
 }
 
 
+//
+// Find all disks images top level call
+//
+void DiskSelector::FindHardDisks(void)
+{
+       hdList.clear();
+       FindHardDisks(settings.disksPath);
+       std::sort(hdList.begin(), hdList.end(), FileStruct());
+       WriteLog("GUI (DiskSelector)::FindHardDisks(): # of HDs is %i\n", hdList.size());
+}
+
+
+//
+// Find all hard disk images within path (recursive call does depth first search)
+//
+void DiskSelector::FindHardDisks(const char * path)
+{
+       DIR * dir = opendir(path);
+
+       if (!dir)
+       {
+               WriteLog("GUI (DiskSelector)::FindHardDisks: Could not open directory \"%s\%!\n", path);
+               return;
+       }
+
+       dirent * ent;
+
+       while ((ent = readdir(dir)) != NULL)
+       {
+               char buf[0x10000];
+               sprintf(buf, "%s/%s", path, ent->d_name);
+
+               // Cross-platform way to test if it's a directory (test = NULL -> file)
+               DIR * test = opendir(buf);
+
+               if (test == NULL)
+               {
+                       const char * ext = strrchr(ent->d_name, '.');
+
+                       if ((ext != NULL) && (strcasecmp(ext, ".2mg") == 0))
+                       {
+                               FileStruct fs;
+                               fs.image = ent->d_name;
+                               fs.fullPath = buf;
+                               hdList.push_back(fs);
+                       }
+               }
+               else
+               {
+                       // Make sure we close the thing, since it's a bona-fide dir!
+                       closedir(test);
+
+                       // Only recurse if the directory is not one of the special ones...
+                       if ((strcmp(ent->d_name, "..") != 0)
+                               && (strcmp(ent->d_name, ".") != 0))
+                       {
+                               FindHardDisks(buf);
+                       }
+               }
+       }
+
+       closedir(dir);
+}
+
+
 void DiskSelector::DrawFilenames(SDL_Renderer * renderer)
 {
        if (SDL_SetRenderTarget(renderer, window) < 0)
index 00086a5e6b22cb87710a929ef58dbccd9460e8bc..9b38711c1f43588e0c98bc507d787264da320344 100644 (file)
@@ -20,6 +20,8 @@ class DiskSelector
                static void ReadManifest(FILE *, DiskSet *);
                static bool CheckManifest(const char *, DiskSet *);
                static bool HasLegalExtension(const char *);
+               static void FindHardDisks();
+               static void FindHardDisks(const char *);
                static void DrawFilenames(SDL_Renderer *);
                static void ShowWindow(int);
                static void HideWindow(void);
index 102b72552b0110057d5bda70d8f9169042db71e8..1ec92069286b66dae717e593c3a7f945e8c76a34 100644 (file)
@@ -3,6 +3,7 @@
 
 #include <SDL2/SDL.h>
 #include <stdint.h>
+#include "font10pt.h"
 
 enum ObjectType { OTNone = 0, OTCheckBox, OTLineEdit, OTDraggable, OTCount };
 
@@ -36,14 +37,26 @@ struct LineEdit {
 
 struct Draggable {
        OBJECT_COMMON;
+       uint8_t * spot;
        int32_t homex, homey;
        bool dragging;
        SDL_Texture * img;
        SDL_Rect dest;
-       uint8_t spot;
 
-       Draggable(): type(OTDraggable), hovered(false), homex(0), homey(0), dragging(false), img(0), spot(0) { r.x = r.y = r.w = r.h = 0; }
-       Draggable(int32_t xx, int32_t yy, int32_t w, int32_t h, SDL_Texture * i = 0): type(OTDraggable), hovered(false), homex(xx), homey(yy), dragging(false), img(i), spot(0) { r.x = xx; r.y = yy; r.w = w; r.h = h; }
+       Draggable(): type(OTDraggable), hovered(false), spot(0), homex(0), homey(0), dragging(false), img(0) { r.x = r.y = r.w = r.h = 0; }
+       Draggable(int32_t xx, int32_t yy, int32_t w, int32_t h, uint8_t * s = 0, SDL_Texture * i = 0): type(OTDraggable), hovered(false), spot(s), homex(xx), homey(yy), dragging(false), img(i)
+       {
+               r.x = xx;
+               r.y = yy;
+               r.w = w;
+               r.h = h;
+
+               if ((s) && (*s != 0))
+               {
+                       r.x = 120;
+                       r.y = (7 + *(spot)) * FONT_HEIGHT;
+               }
+       }
 };
 
 #endif // __ELEMENTS_H__
index 0f06a500eafe85375a3d2ff055df1803c0881c47..66a750e9f8073ec5457524f1bf1bade6e089b4cb 100644 (file)
@@ -626,7 +626,7 @@ void InstallHardDrive(uint8_t slot)
        hdData = ReadFile(fnBuf, &size);
 
        if (hdData)
-               WriteLog("HD: Read Hard Drive image file, %u bytes ($%X)\n", size - 0x40, size - 0x40);
+               WriteLog("HD: Read Hard Drive image file '%s', %u bytes ($%X)\n", settings.hd[0], size - 0x40, size - 0x40);
        else
                WriteLog("HD: Could not read Hard Drive image file!\n");
 }
index cb287d9b946f4a7a742095ee046fdfffe6929a4c..5ff9f7f13a589a59562d5c5c3adbe9da1ed7721b 100644 (file)
@@ -68,7 +68,7 @@ void LoadSettings(void)
 
 //     strcpy(settings.BIOSPath, sdlemu_getval_string("BIOSROM", "./ROMs/apple2e-enhanced.rom"));
        strcpy(settings.disksPath, GetValue("disks", "./disks/"));
-       strcpy(settings.hd[0], GetValue("harddrive1", "./disks/Pitch-Dark-20180731.2mg"));
+       strcpy(settings.hd[0], GetValue("harddrive1", ""));
        strcpy(settings.hd[1], GetValue("harddrive2", ""));
        strcpy(settings.hd[2], GetValue("harddrive3", ""));
        strcpy(settings.hd[3], GetValue("harddrive4", ""));
@@ -77,6 +77,12 @@ void LoadSettings(void)
        strcpy(settings.hd[6], GetValue("harddrive7", ""));
        strcpy(settings.autoStatePath, GetValue("autoStateFilename", "./apple2auto.state"));
 
+       settings.cardSlot[0] = GetValue("card1", 6);    // Disk ][
+       settings.cardSlot[1] = GetValue("card2", 0);    // Disk ][
+       settings.cardSlot[2] = GetValue("card3", 4);    // Mockingboard
+       settings.cardSlot[3] = GetValue("card4", 0);    // Mockingboard
+       settings.cardSlot[4] = GetValue("card5", 0);    // AHSSCSI
+
        CheckForTrailingSlash(settings.disksPath);
 }
 
@@ -107,6 +113,11 @@ void SaveSettings(void)
        SetValue("harddrive5", settings.hd[4]);
        SetValue("harddrive6", settings.hd[5]);
        SetValue("harddrive7", settings.hd[6]);
+       SetValue("card1", settings.cardSlot[0]);
+       SetValue("card2", settings.cardSlot[1]);
+       SetValue("card3", settings.cardSlot[2]);
+       SetValue("card4", settings.cardSlot[3]);
+       SetValue("card5", settings.cardSlot[4]);
 
        UpdateConfigFile();
 }
index 41be54d8c8b26ca9fd27f3d7b403179c116508a2..4fc1428f639b5cf7ea5776433769db312034d92e 100644 (file)
@@ -41,6 +41,9 @@ struct Settings
        char disksPath[MAX_PATH + 1];
        char autoStatePath[MAX_PATH + 1];
        char hd[7][MAX_PATH + 1];
+
+       // Card slots
+       uint8_t cardSlot[5];            // 0-1 = Disk ][, 2-3 = Mockingboard, 4 = AHSSCSI
 };
 
 // Render types
index 6a525b7147008b7a5b8c1b40bb60916e263d3bb1..05acaed04cc2cbc4c7af3bbe636ae46efba34cc0 100644 (file)
@@ -2287,6 +2287,7 @@ uint8_t btQueueInst[BACKTRACE_SIZE][4];
 //
 // Function to execute 65C02 for "cycles" cycles
 //
+//static bool first = true;
 void Execute65C02(V65C02REGS * context, uint32_t cycles)
 {
        regs = context;
@@ -2296,6 +2297,29 @@ void Execute65C02(V65C02REGS * context, uint32_t cycles)
 
        while (regs->clock < endCycles)
        {
+// Hard disk debugging
+#if 0
+if (first && (regs->pc == 0x801))
+{
+       regs->WrMem(0x42, 1);
+       regs->WrMem(0x44, 0);
+       first = false;
+}
+else if (regs->pc == 0x869)
+{
+/*     regs->WrMem(0x42, 1);
+       first = false;//*/
+/*     static char disbuf[80];
+       uint16_t pc=0x801;
+       while (pc < 0xA00)
+       {
+               pc += Decode65C02(regs, disbuf, pc);
+               WriteLog("%s\n", disbuf);
+       }*/
+/*     dumpDis = true;
+       WriteLog("\n>>> $42-7: %02X %02X %02X %02X %02X %02X\n\n", regs->RdMem(0x42), regs->RdMem(0x43), regs->RdMem(0x44), regs->RdMem(0x45), regs->RdMem(0x46), regs->RdMem(0x47));//*/
+}
+#endif
 #if 0
 //Epoch
 if (regs->pc == 0x0518)