#include <proto/dos.h>
#include <workbench/startup.h>
#include <clib/expansion_protos.h>
+#include <libraries/reqtools.h>
+#include <clib/reqtools_protos.h>
#include "pistorm_dev.h"
#include "../pistorm-dev-enums.h"
#include <stdio.h>
#include <string.h>
-
+#include <stdlib.h>
extern unsigned int pistorm_base_addr;
+struct ReqToolsBase *ReqToolsBase;
-#define VERSION "v0.1"
+#define VERSION "v0.3.4"
#define button1w 54
-#define button1h 20
+#define button1h 11
#define button2w 87
-#define button2h 20
+#define button2h 11
#define button3w 100
-#define button3h 20
+#define button3h 11
#define tbox1w 130
-#define tbox1h 18
+#define tbox1h 10
+
+#define tbox2w 132
+#define tbox2h 12
+
+#define statusbarw 507
+#define statusbarh 10
+
+struct TextAttr font =
+{
+ "topaz.font",
+ 8,
+ FS_NORMAL,
+ 0
+};
SHORT SharedBordersPairs0[] =
{
-1, tbox1h - 1, tbox1w - 2, tbox1h - 1, tbox1w - 2, 0, tbox1w - 1, -1, tbox1w - 1, tbox1h - 1
};
+SHORT SharedBordersPairs8[] =
+{
+ 0, 0, statusbarw - 2, 0, statusbarw - 2, 0, 0, 0, 0, 0
+};
+
+SHORT SharedBordersPairs9[] =
+{
+ 0, 0, 0, tbox2h - 1, 1, tbox2h - 2, 1, 0, tbox2w - 2, 0
+};
+SHORT SharedBordersPairs10[] =
+{
+ 1, tbox2h - 1, tbox2w - 2, tbox2h - 1, tbox2w - 2, 1, tbox2w - 1, 0, tbox2w - 1, tbox2h - 1
+};
+
+
struct Border SharedBorders[] =
{
0, 0, 2, 0, JAM2, 5, (SHORT *) &SharedBordersPairs0[0], &SharedBorders[1], // Button 1
0, 0, 1, 0, JAM2, 5, (SHORT *) &SharedBordersPairs5[0], NULL,
0, 0, 1, 0, JAM2, 5, (SHORT *) &SharedBordersPairs6[0], &SharedBorders[7], // TBox
0, 0, 2, 0, JAM2, 5, (SHORT *) &SharedBordersPairs7[0], NULL,
+ 0, 0, 1, 0, JAM2, 5, (SHORT *) &SharedBordersPairs8[0], NULL, // Statusbar
+ 0, 0, 2, 0, JAM2, 5, (SHORT *) &SharedBordersPairs9[0], &SharedBorders[10], // TBox inverted
+ 0, 0, 1, 0, JAM2, 5, (SHORT *) &SharedBordersPairs10[0], NULL,
};
struct Border SharedBordersInvert[] =
0, 0, 2, 0, JAM2, 5, (SHORT *) &SharedBordersPairs3[0], NULL,
0, 0, 1, 0, JAM2, 5, (SHORT *) &SharedBordersPairs4[0], &SharedBordersInvert[5], // Button 2
0, 0, 2, 0, JAM2, 5, (SHORT *) &SharedBordersPairs5[0], NULL,
+ 0, 0, 1, 0, JAM2, 5, (SHORT *) &SharedBordersPairs9[0], &SharedBordersInvert[7], // TBox inverted
+ 0, 0, 2, 0, JAM2, 5, (SHORT *) &SharedBordersPairs10[0], NULL,
+};
+
+struct IntuiText KickstartCommit_text =
+{
+ 1, 0, JAM2, 2, 2, &font, (UBYTE *)"Commit", NULL
+};
+
+#define GADKICKSTARTCOMMIT 14
+
+struct Gadget KickstartCommit =
+{
+ NULL, 401, 49, button1w, button1h,
+ GADGHIMAGE,
+ RELVERIFY,
+ BOOLGADGET,
+ (APTR) &SharedBorders[0], (APTR) &SharedBordersInvert[0],
+ &KickstartCommit_text, 0, NULL, GADKICKSTARTCOMMIT, NULL
+};
+
+
+UBYTE KickstartFileValue_buf[255];
+
+struct StringInfo KickstartFileValue =
+{
+ KickstartFileValue_buf, NULL, 0, 255, 0, 0, 0, 0, 4, 4, NULL, 0, NULL
+};
+
+struct IntuiText KickstartFile_text =
+{
+ 1, 0, JAM2, 0, -10, &font, "Kickstart file:", NULL
+};
+
+#define GADKICKSTARTFILE 13
+
+struct Gadget KickstartFile =
+{
+ &KickstartCommit, 266, 50, tbox1w, tbox1h,
+ GADGHIMAGE,
+ 0,
+ STRGADGET,
+ (APTR) &SharedBorders[6], NULL,
+ &KickstartFile_text, 0, (APTR)&KickstartFileValue, GADKICKSTARTFILE, NULL
+};
+
+struct IntuiText ShutdownButton_text =
+{
+ 1, 0, JAM2, 2, 2, &font, (UBYTE *)"Shutdown Pi", NULL
+};
+
+#define GADSHUTDOWN 12
+
+struct Gadget ShutdownButton =
+{
+ &KickstartFile, 60, 166, button3w, button3h,
+ GADGHIMAGE,
+ RELVERIFY,
+ BOOLGADGET,
+ (APTR) &SharedBorders[2], (APTR) &SharedBordersInvert[2],
+ &ShutdownButton_text, 0, NULL, GADSHUTDOWN, NULL
+};
+
+
+UBYTE DestinationValue_buf[255];
+
+struct IntuiText Destination_text[] =
+{
+ 1, 0, JAM2, -98, 1, &font, "Destination:", &Destination_text[1],
+ 1, 0, JAM2, 1, 1, &font, DestinationValue_buf, NULL,
+};
+
+#define GADGETDESTINATION 11
+
+struct Gadget GetDestination =
+{
+ &ShutdownButton, 107, 105, tbox2w, tbox2h,
+ GADGHIMAGE,
+ RELVERIFY,
+ BOOLGADGET,
+ (APTR) &SharedBorders[9], (APTR) &SharedBordersInvert[6],
+ Destination_text, 0, NULL, GADGETDESTINATION, NULL
+};
+
+struct IntuiText RebootButton_text =
+{
+ 1, 0, JAM2, 2, 2, &font, (UBYTE *)"Reboot", NULL
+};
+
+#define GADREBOOT 10
+
+struct Gadget RebootButton =
+{
+ &GetDestination, 4, 166, button1w, button1h,
+ GADGHIMAGE,
+ RELVERIFY,
+ BOOLGADGET,
+ (APTR) &SharedBorders[0], (APTR) &SharedBordersInvert[0],
+ &RebootButton_text, 0, NULL, GADREBOOT, NULL
+};
+
+UBYTE StatusBar_buf[128] = "Reticulating splines...";
+
+struct IntuiText StatusBar_text =
+{
+ 1, 0, JAM2, 4, 2, &font, (UBYTE *)StatusBar_buf, NULL
+};
+
+#define GADSTATUSBAR 9
+
+struct Gadget StatusBar =
+{
+ &RebootButton, 3, 188, 508, 10,
+ GADGHIMAGE,
+ 0,
+ BOOLGADGET,
+ (APTR) &SharedBorders[8], NULL,
+ &StatusBar_text, 0, NULL, GADSTATUSBAR, NULL
+};
+
+
+struct IntuiText RetrieveButton_text =
+{
+ 1, 0, JAM2, 10, 2, &font, (UBYTE *)"Retrieve", NULL
+};
+
+#define GADRETRIEVEBUTTON 8
+
+struct Gadget RetrieveButton =
+{
+ &StatusBar, 244, 99, button2w, button2h,
+ GADGHIMAGE,
+ RELVERIFY,
+ BOOLGADGET,
+ (APTR) &SharedBorders[4], (APTR) &SharedBordersInvert[4],
+ &RetrieveButton_text, 0, NULL, GADRETRIEVEBUTTON, NULL
+};
+
+UBYTE GetFileValue_buf[255];
+
+struct StringInfo GetFileValue =
+{
+ GetFileValue_buf, NULL, 0, 255, 0, 0, 0, 0, 4, 4, NULL, 0, NULL
+};
+
+struct IntuiText GetFile_text[] =
+{
+ 1, 0, JAM2, -98, -10, &font, "Get file from PiStorm:", &GetFile_text[1],
+ 1, 0, JAM2, -59, 1, &font, "Source:", NULL,
+};
+
+#define GADGETFILE 7
+
+struct Gadget GetFile =
+{
+ &RetrieveButton, 108, 93, tbox1w, tbox1h,
+ GADGHIMAGE,
+ 0,
+ STRGADGET,
+ (APTR) &SharedBorders[6], NULL,
+ GetFile_text, 0, (APTR)&GetFileValue, GADGETFILE, NULL
};
struct IntuiText ConfigDefault_text =
{
- 1, 0, JAM2, 2, 6, NULL, (UBYTE *)"Load Default", NULL
+ 1, 0, JAM2, 2, 2, &font, (UBYTE *)"Load Default", NULL
};
#define GADCONFIGDEFAULT 6
struct Gadget ConfigDefault =
{
- NULL, 304, 39, button3w, button3h,
+ &GetFile, 9, 62, button3w, button3h,
GADGHIMAGE,
RELVERIFY,
BOOLGADGET,
struct IntuiText ConfigCommit_text =
{
- 1, 0, JAM2, 2, 6, NULL, (UBYTE *)"Commit", NULL
+ 1, 0, JAM2, 2, 2, &font, (UBYTE *)"Commit", NULL
};
#define GADCONFIGCOMMIT 5
struct Gadget ConfigCommit =
{
- &ConfigDefault, 244, 39, button1w, button1h,
+ &ConfigDefault, 144, 49, button1w, button1h,
GADGHIMAGE,
RELVERIFY,
BOOLGADGET,
struct IntuiText ConfigFile_text =
{
- 1, 0, JAM2, -98, 4, NULL, "Config file:", NULL
+ 1, 0, JAM2, 0, -10, &font, "Config file:", NULL
};
#define GADCONFIGFILE 4
struct Gadget ConfigFile =
{
- &ConfigCommit, 108, 41, tbox1w, tbox1h,
+ &ConfigCommit, 10, 50, tbox1w, tbox1h,
GADGHIMAGE,
0,
STRGADGET,
struct IntuiText RTGStatus_text =
{
- 1, 0, JAM2, 4, 4, NULL, (UBYTE *)RTGStatus_buf, NULL
+ 1, 0, JAM2, 1, 1, &font, (UBYTE *)RTGStatus_buf, NULL
};
#define GADRTGSTATUS 3
struct Gadget RTGStatus =
{
- &ConfigFile, 14, 15, tbox1w, tbox1h,
+ &ConfigFile, 10, 20, tbox1w, tbox1h,
GADGHIMAGE,
0,
BOOLGADGET,
struct IntuiText RTG_text =
{
- 1, 0, JAM2, 8, 6, NULL, (UBYTE *)RTG_buf, NULL
+ 1, 0, JAM2, 8, 2, &font, (UBYTE *)RTG_buf, NULL
};
#define GADRTGBUTTON 2
struct Gadget RTGButton =
{
- &RTGStatus, 150, 13, button3w, button3h,
+ &RTGStatus, 144, 19, button3w, button3h,
GADGHIMAGE,
RELVERIFY,
BOOLGADGET,
struct IntuiText AboutButton_text =
{
- 1, 0, JAM2, 8, 6, NULL, (UBYTE *)"About", NULL
+ 1, 0, JAM2, 8, 2, &font, (UBYTE *)"About", NULL
};
#define GADABOUT 1
struct Gadget AboutButton =
{
- &RTGButton, 356, 170, button1w, button1h,
+ &RTGButton, 356, 166, button1w, button1h,
GADGHIMAGE,
RELVERIFY,
BOOLGADGET,
struct IntuiText QuitButton_text =
{
- 1, 0, JAM2, 12, 6, NULL, (UBYTE *)"Quit", NULL
+ 1, 0, JAM2, 12, 2, &font, (UBYTE *)"Quit", NULL
};
#define GADQUIT 0
struct Gadget QuitButton =
{
- &AboutButton, 438, 170, button1w, button1h,
+ &AboutButton, 438, 166, button1w, button1h,
GADGHIMAGE,
RELVERIFY,
BOOLGADGET,
struct NewWindow winlayout =
{
- 20, 20,
+ 0, 0,
512, 200,
-1, -1,
CLOSEWINDOW | GADGETUP | GADGETDOWN,
}
}
+static char *GetSavePath()
+{
+ struct rtFileRequester *filereq;
+ char filename[128];
+ char *fullpath = malloc(256 * sizeof(char));
+ UBYTE *buf = NULL;
+
+ if ((filereq = (struct rtFileRequester*)rtAllocRequestA (RT_FILEREQ, NULL)))
+ {
+ filename[0] = 0;
+
+ if (!rtFileRequest(filereq, filename, "Pick a destination directory",
+ RTFI_Flags, FREQF_NOFILES, TAG_END))
+ {
+ free(fullpath);
+ return NULL;
+ }
+
+ }
+ else
+ {
+ rtEZRequest("Out of memory!", "Oh no!", NULL, NULL);
+ return NULL;
+ }
+
+ strncpy(fullpath, (char*)filereq->Dir, 256);
+ rtFreeRequest((APTR)filereq);
+ return fullpath;
+}
+
+int questionReboot()
+{
+ int res = rtEZRequest("This will restart the emulator, rebooting the Amiga\n"
+ "Continue anyway?",
+ "Yes|No", NULL, NULL);
+ return res;
+}
+
int main()
{
struct Window *myWindow;
return RETURN_FAIL;
}
+ if (!(ReqToolsBase = (struct ReqToolsBase *)
+ OpenLibrary (REQTOOLSNAME, REQTOOLSVERSION)))
+ {
+ static struct IntuiText pos;
+ struct IntuiText msg[] =
+ {
+ 1, 0, JAM2, 0, 0, &font, "You need reqtools.library V38 or higher!.", &msg[1],
+ 1, 0, JAM2, 0, 10, &font, "Please install it in your Libs: drirectory.", NULL,
+ };
+ AutoRequest(NULL, msg, NULL, &pos, 0, 0, 0, 0);
+ return RETURN_FAIL;
+ }
+
pistorm_base_addr = pi_find_pistorm();
myWindow = OpenWindow(&winlayout);
BOOL no_board = FALSE;
if (pistorm_base_addr == 0xFFFFFFFF)
{
- static struct IntuiText msg, pos;
- msg.IText = "Unable to find PiStorm autoconf device.";
- pos.IText = "OK";
- AutoRequest(myWindow, &msg, NULL, &pos, 0, 0, 0, 0);
+ rtEZRequest("Unable to find PiStorm autoconf device.",
+ "OK", NULL, NULL);
no_board = TRUE;
+ WriteGadgetText("PiStorm not found", StatusBar_buf, myWindow, &StatusBar);
+ }
+ else
+ {
+ WriteGadgetText("PiStorm found!", StatusBar_buf, myWindow, &StatusBar);
}
if (!no_board)
{
case GADABOUT:
{
static struct IntuiText pos;
- UBYTE buf[64], buf2[64], buf3[64];
+ char buf2[64], buf3[64];
if (!no_board)
{
unsigned short hw_rev = pi_get_hw_rev();
unsigned short sw_rev = pi_get_sw_rev();
- snprintf((char*)buf2, 64, "PiStorm hardware: %d.%d", (hw_rev >> 8), (hw_rev & 0xFF));
- snprintf((char*)buf3, 64, "PiStorm software: %d.%d", (sw_rev >> 8), (sw_rev & 0xFF));
+ snprintf(buf2, 64, "PiStorm hardware: %d.%d", (hw_rev >> 8), (hw_rev & 0xFF));
+ snprintf(buf3, 64, "PiStorm software: %d.%d", (sw_rev >> 8), (sw_rev & 0xFF));
}
else
{
- snprintf((char*)buf2, 64, "PiStorm hardware not found!");
+ snprintf(buf2, 64, "PiStorm hardware not found!");
}
- struct IntuiText msg[] =
- {
- 1, 0, JAM2, 0, 0, NULL, (UBYTE *)buf, &msg[1],
- 1, 0, JAM2, 0, 10, NULL, "Tool written by beeanyew and LinuxJedi", &msg[2],
- 1, 0, JAM2, 0, 20, NULL, (UBYTE*)buf2, &msg[3],
- 1, 0, JAM2, 0, 30, NULL, (UBYTE*)buf3, &msg[4],
- 1, 0, JAM2, 0, 50, NULL, "Now with 53% more Nibbles!", NULL,
- };
- snprintf(buf, 64, "PiStorm Interaction Tool %s", VERSION);
- pos.IText = "OK";
- AutoRequest(myWindow, msg, NULL, &pos, 0, 0, 0, 0);
+ rtEZRequest("PiStorm Interaction Tool %s\n"
+ "Tool written by beeanyew and LinuxJedi\n"
+ "%s\n%s\n\n"
+ "Now with 53%% more Nibbles!",
+ "More Nibbles!", NULL, NULL, VERSION, buf2, buf3);
break;
}
case GADRTGBUTTON:
}
case GADCONFIGCOMMIT:
{
+ if (!questionReboot())
+ {
+ break;
+ }
+ Disable();
unsigned short ret = pi_handle_config(PICFG_LOAD, ConfigFileValue_buf);
if (ret == PI_RES_FILENOTFOUND)
{
- static struct IntuiText msg, pos;
- msg.IText = "PiStorm says \"file not found\"";
- pos.IText = "OK";
- AutoRequest(myWindow, &msg, NULL, &pos, 0, 0, 0, 0);
+ rtEZRequest("PiStorm says: \"file not found\"",
+ "OK", NULL, NULL);
}
break;
}
case GADCONFIGDEFAULT:
{
+ if (!questionReboot())
+ {
+ break;
+ }
pi_handle_config(PICFG_DEFAULT, NULL);
break;
}
+ case GADRETRIEVEBUTTON:
+ {
+ unsigned int filesize = 0;
+ char outpath[128];
+ unsigned char *buf;
+
+ if (pi_get_filesize(GetFileValue_buf, &filesize) == PI_RES_FILENOTFOUND)
+ {
+ rtEZRequest("PiStorm says: \"file not found\"",
+ "OK", NULL, NULL);
+ break;
+ }
+ buf = malloc(filesize);
+ if (buf == NULL)
+ {
+ rtEZRequest("Could not allocate enough memory to transfer file",
+ "OK", NULL, NULL);
+ break;
+ }
+ WriteGadgetText("Retrieving file...", StatusBar_buf, myWindow, &StatusBar);
+ if (pi_transfer_file(GetFileValue_buf, buf) != PI_RES_OK)
+ {
+ rtEZRequest("PiStorm says: \"something went wrong with the file transfer\"",
+ "OK", NULL, NULL);
+ WriteGadgetText("File transfer failed", StatusBar_buf, myWindow, &StatusBar);
+ free(buf);
+ break;
+ }
+ char *fname = strrchr(GetFileValue_buf, '/');
+ if (!fname)
+ {
+ fname = GetFileValue_buf;
+ }
+ char *destfile = malloc(256);
+ // Turns out WB doesn't like DF0:/filename.ext
+ if (DestinationValue_buf[(strlen(DestinationValue_buf) - 1)] == ':')
+ {
+ snprintf(destfile, 255, "%s%s", DestinationValue_buf, GetFileValue_buf);
+ }
+ else if (!strlen(DestinationValue_buf))
+ {
+ snprintf(destfile, 255, "%s", GetFileValue_buf);
+ }
+ else
+ {
+ snprintf(destfile, 255, "%s/%s", DestinationValue_buf, GetFileValue_buf);
+ }
+ BPTR fh = Open(destfile, MODE_NEWFILE);
+ if (!fh)
+ {
+ char errbuf[64];
+ snprintf(errbuf, 64, "Error code: %ld", IoErr());
+ rtEZRequest("Could not open file for writing\n"
+ "%s\n%s",
+ "OK", NULL, NULL, destfile, errbuf);
+ WriteGadgetText("File transfer failed", StatusBar_buf, myWindow, &StatusBar);
+ free(buf);
+ free(destfile);
+ break;
+ }
+ Write(fh, buf, filesize);
+ Close(fh);
+ free(destfile);
+ WriteGadgetText("File transfer complete", StatusBar_buf, myWindow, &StatusBar);
+ free(buf);
+ break;
+ }
+ case GADREBOOT:
+ {
+ WriteGadgetText("Rebooting Amiga", StatusBar_buf, myWindow, &StatusBar);
+ pi_reset_amiga(0);
+ break;
+ }
+ case GADGETDESTINATION:
+ {
+ char *fileName = GetSavePath();
+ if (fileName)
+ {
+ WriteGadgetText(fileName, DestinationValue_buf, myWindow, &GetDestination);
+ free(fileName);
+ }
+ break;
+ }
+ case GADSHUTDOWN:
+ {
+ int res = rtEZRequest("This will shutdown the Pi and cause the Amiga to freeze\n"
+ "Continue anyway?",
+ "Yes|No", NULL, NULL);
+ if (!res)
+ {
+ break;
+ }
+ WriteGadgetText("Shuttting down PiStorm...", StatusBar_buf, myWindow, &StatusBar);
+ int confirm = pi_shutdown_pi(0);
+ pi_confirm_shutdown(confirm);
+ break;
+ }
+ case GADKICKSTARTCOMMIT:
+ {
+ if (!questionReboot())
+ {
+ break;
+ }
+ Disable();
+ unsigned short ret = pi_remap_kickrom(KickstartFileValue_buf);
+ if (ret == PI_RES_FILENOTFOUND)
+ {
+ rtEZRequest("PiStorm says: \"file not found\"",
+ "OK", NULL, NULL);
+ }
+ break;
+ }
}
}
if (closewin)
}
};
if (myWindow) CloseWindow(myWindow);
+ CloseLibrary((struct Library*)ReqToolsBase);
return 0;
}