mirror of
https://github.com/robmcmullen/apple2.git
synced 2024-06-02 08:41:36 +00:00
First steps towards making config window/settings stick.
This commit is contained in:
parent
6508be6bbd
commit
f8d9fa1865
|
@ -118,7 +118,15 @@ static const char slotNum[7][(5 * 5) + 1] =
|
||||||
};
|
};
|
||||||
|
|
||||||
//static uint8_t card1[(96 * 11) + 1] = { 0 };
|
//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)
|
void Config::Init(SDL_Renderer * renderer)
|
||||||
{
|
{
|
||||||
|
@ -158,7 +166,7 @@ void Config::Init(SDL_Renderer * renderer)
|
||||||
SDL_SetRenderTarget(renderer, cardTex[2]);
|
SDL_SetRenderTarget(renderer, cardTex[2]);
|
||||||
GUI::DrawString(renderer, 6, 0, "SCSI");
|
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_SetTextureBlendMode(cardBay, SDL_BLENDMODE_BLEND);
|
||||||
SDL_SetRenderTarget(renderer, cardBay);
|
SDL_SetRenderTarget(renderer, cardBay);
|
||||||
SDL_SetRenderDrawColor(renderer, 0x00, 0x00, 0x00, 0x00);
|
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 CheckBox(1, 27, &cbnChecked, cbnText));
|
||||||
|
|
||||||
objList.push_back(new LineEdit(1, 6, le1, 48, le1Text));
|
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, 8 * FONT_HEIGHT, 96, 11, &settings.cardSlot[0], 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, 9 * FONT_HEIGHT, 96, 11, &settings.cardSlot[1], 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, 10 * FONT_HEIGHT, 96, 11, &settings.cardSlot[2], 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, 11 * FONT_HEIGHT, 96, 11, &settings.cardSlot[3], 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, 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;
|
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.x = 120;
|
||||||
d->r.y = (7 + d->spot) * FONT_HEIGHT;
|
d->r.y = (7 + *(d->spot)) * FONT_HEIGHT;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
d->r.x = d->homex;
|
d->r.x = d->homex;
|
||||||
d->r.y = d->homey;
|
d->r.y = d->homey;
|
||||||
d->spot = 0;
|
*(d->spot) = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
refresh = true;
|
refresh = true;
|
||||||
|
|
|
@ -115,6 +115,7 @@ SDL_Texture * scrollLeftIcon = NULL;
|
||||||
SDL_Texture * scrollRightIcon = NULL;
|
SDL_Texture * scrollRightIcon = NULL;
|
||||||
bool DiskSelector::showWindow = false;
|
bool DiskSelector::showWindow = false;
|
||||||
std::vector<FileStruct> fsList;
|
std::vector<FileStruct> fsList;
|
||||||
|
std::vector<FileStruct> hdList;
|
||||||
|
|
||||||
|
|
||||||
void DiskSelector::Init(SDL_Renderer * renderer)
|
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));
|
SDL_UpdateTexture(window, NULL, windowPixels, DS_WIDTH * sizeof(Uint32));
|
||||||
FindDisks();
|
FindDisks();
|
||||||
|
FindHardDisks();
|
||||||
DrawFilenames(renderer);
|
DrawFilenames(renderer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -156,8 +158,12 @@ void DiskSelector::FindDisks(void)
|
||||||
WriteLog("GUI (DiskSelector)::FindDisks(): # of columns is %i (%i files)\n", numColumns, fsList.size());
|
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)
|
// 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)
|
void DiskSelector::DrawFilenames(SDL_Renderer * renderer)
|
||||||
{
|
{
|
||||||
if (SDL_SetRenderTarget(renderer, window) < 0)
|
if (SDL_SetRenderTarget(renderer, window) < 0)
|
||||||
|
|
|
@ -20,6 +20,8 @@ class DiskSelector
|
||||||
static void ReadManifest(FILE *, DiskSet *);
|
static void ReadManifest(FILE *, DiskSet *);
|
||||||
static bool CheckManifest(const char *, DiskSet *);
|
static bool CheckManifest(const char *, DiskSet *);
|
||||||
static bool HasLegalExtension(const char *);
|
static bool HasLegalExtension(const char *);
|
||||||
|
static void FindHardDisks();
|
||||||
|
static void FindHardDisks(const char *);
|
||||||
static void DrawFilenames(SDL_Renderer *);
|
static void DrawFilenames(SDL_Renderer *);
|
||||||
static void ShowWindow(int);
|
static void ShowWindow(int);
|
||||||
static void HideWindow(void);
|
static void HideWindow(void);
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
|
|
||||||
#include <SDL2/SDL.h>
|
#include <SDL2/SDL.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
#include "font10pt.h"
|
||||||
|
|
||||||
enum ObjectType { OTNone = 0, OTCheckBox, OTLineEdit, OTDraggable, OTCount };
|
enum ObjectType { OTNone = 0, OTCheckBox, OTLineEdit, OTDraggable, OTCount };
|
||||||
|
|
||||||
|
@ -36,14 +37,26 @@ struct LineEdit {
|
||||||
|
|
||||||
struct Draggable {
|
struct Draggable {
|
||||||
OBJECT_COMMON;
|
OBJECT_COMMON;
|
||||||
|
uint8_t * spot;
|
||||||
int32_t homex, homey;
|
int32_t homex, homey;
|
||||||
bool dragging;
|
bool dragging;
|
||||||
SDL_Texture * img;
|
SDL_Texture * img;
|
||||||
SDL_Rect dest;
|
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(): 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, 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(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__
|
#endif // __ELEMENTS_H__
|
||||||
|
|
|
@ -626,7 +626,7 @@ void InstallHardDrive(uint8_t slot)
|
||||||
hdData = ReadFile(fnBuf, &size);
|
hdData = ReadFile(fnBuf, &size);
|
||||||
|
|
||||||
if (hdData)
|
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
|
else
|
||||||
WriteLog("HD: Could not read Hard Drive image file!\n");
|
WriteLog("HD: Could not read Hard Drive image file!\n");
|
||||||
}
|
}
|
||||||
|
|
|
@ -68,7 +68,7 @@ void LoadSettings(void)
|
||||||
|
|
||||||
// strcpy(settings.BIOSPath, sdlemu_getval_string("BIOSROM", "./ROMs/apple2e-enhanced.rom"));
|
// strcpy(settings.BIOSPath, sdlemu_getval_string("BIOSROM", "./ROMs/apple2e-enhanced.rom"));
|
||||||
strcpy(settings.disksPath, GetValue("disks", "./disks/"));
|
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[1], GetValue("harddrive2", ""));
|
||||||
strcpy(settings.hd[2], GetValue("harddrive3", ""));
|
strcpy(settings.hd[2], GetValue("harddrive3", ""));
|
||||||
strcpy(settings.hd[3], GetValue("harddrive4", ""));
|
strcpy(settings.hd[3], GetValue("harddrive4", ""));
|
||||||
|
@ -77,6 +77,12 @@ void LoadSettings(void)
|
||||||
strcpy(settings.hd[6], GetValue("harddrive7", ""));
|
strcpy(settings.hd[6], GetValue("harddrive7", ""));
|
||||||
strcpy(settings.autoStatePath, GetValue("autoStateFilename", "./apple2auto.state"));
|
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);
|
CheckForTrailingSlash(settings.disksPath);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -107,6 +113,11 @@ void SaveSettings(void)
|
||||||
SetValue("harddrive5", settings.hd[4]);
|
SetValue("harddrive5", settings.hd[4]);
|
||||||
SetValue("harddrive6", settings.hd[5]);
|
SetValue("harddrive6", settings.hd[5]);
|
||||||
SetValue("harddrive7", settings.hd[6]);
|
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();
|
UpdateConfigFile();
|
||||||
}
|
}
|
||||||
|
|
|
@ -41,6 +41,9 @@ struct Settings
|
||||||
char disksPath[MAX_PATH + 1];
|
char disksPath[MAX_PATH + 1];
|
||||||
char autoStatePath[MAX_PATH + 1];
|
char autoStatePath[MAX_PATH + 1];
|
||||||
char hd[7][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
|
// Render types
|
||||||
|
|
|
@ -2287,6 +2287,7 @@ uint8_t btQueueInst[BACKTRACE_SIZE][4];
|
||||||
//
|
//
|
||||||
// Function to execute 65C02 for "cycles" cycles
|
// Function to execute 65C02 for "cycles" cycles
|
||||||
//
|
//
|
||||||
|
//static bool first = true;
|
||||||
void Execute65C02(V65C02REGS * context, uint32_t cycles)
|
void Execute65C02(V65C02REGS * context, uint32_t cycles)
|
||||||
{
|
{
|
||||||
regs = context;
|
regs = context;
|
||||||
|
@ -2296,6 +2297,29 @@ void Execute65C02(V65C02REGS * context, uint32_t cycles)
|
||||||
|
|
||||||
while (regs->clock < endCycles)
|
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
|
#if 0
|
||||||
//Epoch
|
//Epoch
|
||||||
if (regs->pc == 0x0518)
|
if (regs->pc == 0x0518)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user