home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Fred Fish Collection 1.5
/
ffcollection-1-5-1992-11.iso
/
ff_disks
/
200-299
/
ff274.lzh
/
HP11
/
amiga
/
menus.c
< prev
next >
Wrap
C/C++ Source or Header
|
1989-11-16
|
16KB
|
627 lines
char message[] =
"HP11, by David Gay(86-87). You may freely copy & distribute this program.";
char message2[] =
"Vous pouvez librement copier & distribuer ce programme.";
#include "exec/types.h"
#include "graphics/text.h"
#include "intuition/intuition.h"
#include "workbench/workbench.h"
#include "workbench/startup.h"
#include "libraries/dos.h"
#include "libraries/arpbase.h"
#include "proto/arp.h"
#define NODOS
#include "libraries/arp_pragmas.h"
#include "proto/exec.h"
#include "proto/graphics.h"
#include "proto/intuition.h"
#include "proto/icon.h"
#include "proto/dos.h"
#include "string.h"
#include "math.h"
#include "hp11/hp11.h"
#include "hp11/io.h"
#include "hp11/ins.h"
#include "hp11/amiga/menus.h"
#include "hp11/amiga/internal.h"
#include "hp11/amiga/cbio.h"
#define PROJECTWIDTH (75 + COMMWIDTH) /* Width of Project menu options */
#define EDITWIDTH (65 + COMMWIDTH)
#define OPTIONSWIDTH 80
#define DECIMALWIDTH (CHECKWIDTH + 65 + COMMWIDTH)
#define SPEEDWIDTH (CHECKWIDTH + 55)
static struct TextAttr topaz9attr = { "topaz.font", 9, 0, 0 }; /* The text font desired */
static struct TextFont *topaz9;
/* Texts for menu options */
static struct IntuiText hp11text[] = {
{ 2, 1, JAM1, 4, 1, NULL, "New", NULL },
{ 2, 1, JAM1, 4, 1, NULL, "Open", NULL },
{ 2, 1, JAM1, 4, 1, NULL, "Save", NULL },
{ 2, 1, JAM1, 4, 1, NULL, "Save as", NULL },
{ 2, 1, JAM1, 4, 1, NULL, "Print", NULL },
{ 2, 1, JAM1, 4, 1, NULL, "Quit", NULL },
{ 2, 1, JAM1, 4, 1, NULL, "Copy", NULL },
{ 2, 1, JAM1, 4, 1, NULL, "Paste", NULL },
{ 2, 1, JAM1, CHECKWIDTH, 1, NULL, "Radix", NULL },
{ 2, 1, JAM1, CHECKWIDTH, 1, NULL, "Point", NULL },
{ 2, 1, JAM1, CHECKWIDTH, 1, NULL, "Comma", NULL },
{ 2, 1, JAM1, CHECKWIDTH, 1, NULL, "Speed", NULL },
{ 2, 1, JAM1, CHECKWIDTH, 1, NULL, "Slow", NULL },
{ 2, 1, JAM1, CHECKWIDTH, 1, NULL, "Fast", NULL },
{ 2, 1, JAM1, CHECKWIDTH, 1, NULL, "Icons", NULL }
};
/* The various menu items */
static struct MenuItem hp11item[] = {
{ &hp11item[1], 0, 0, PROJECTWIDTH, 10, /* New */
ITEMTEXT | ITEMENABLED | HIGHCOMP, 0,
(APTR)&hp11text[0], NULL, 0, NULL },
{ &hp11item[2], 0, 10, PROJECTWIDTH, 10, /* Open */
ITEMTEXT | ITEMENABLED | HIGHCOMP | COMMSEQ, 0,
(APTR)&hp11text[1], NULL, 'O', NULL },
{ &hp11item[3], 0, 20, PROJECTWIDTH, 10, /* Save */
ITEMTEXT | ITEMENABLED | HIGHCOMP, 0,
(APTR)&hp11text[2], NULL, 0, NULL },
{ &hp11item[4], 0, 30, PROJECTWIDTH, 10, /* Save as */
ITEMTEXT | ITEMENABLED | HIGHCOMP | COMMSEQ, 0,
(APTR)&hp11text[3], NULL, 'S', NULL },
{ &hp11item[5], 0, 40, PROJECTWIDTH, 10, /* Print */
ITEMTEXT | ITEMENABLED | HIGHCOMP, 0,
(APTR)&hp11text[4], 0, NULL },
{ NULL, 0, 50, PROJECTWIDTH, 10, /* Quit */
ITEMTEXT | ITEMENABLED | HIGHCOMP, 0,
(APTR)&hp11text[5], NULL, 0, NULL },
{ &hp11item[7], 0, 0, EDITWIDTH, 10, /* Copy */
ITEMTEXT | ITEMENABLED | HIGHCOMP | COMMSEQ, 0,
(APTR)&hp11text[6], NULL, 'C', NULL },
{ NULL, 0, 10, EDITWIDTH, 10, /* Paste */
ITEMTEXT | ITEMENABLED | HIGHCOMP | COMMSEQ, 0,
(APTR)&hp11text[7], NULL, 'P', NULL },
{ &hp11item[11], 0, 0, OPTIONSWIDTH, 10, /* Radix */
ITEMTEXT | ITEMENABLED | HIGHCOMP, 0,
(APTR)&hp11text[8], NULL, 0, &hp11item[9] },
{ &hp11item[10], 50, 9, DECIMALWIDTH, 10, /* Point */
ITEMTEXT | ITEMENABLED | HIGHCOMP | CHECKIT | CHECKED | COMMSEQ, 2,
(APTR)&hp11text[9], NULL, '.', NULL },
{ NULL, 50, 19, DECIMALWIDTH, 10, /* Comma */
ITEMTEXT | ITEMENABLED | HIGHCOMP | CHECKIT | COMMSEQ, 1,
(APTR)&hp11text[10], NULL, ',', NULL },
{ &hp11item[14], 0, 10, OPTIONSWIDTH, 10, /* Speed */
ITEMTEXT | ITEMENABLED | HIGHCOMP, 0,
(APTR)&hp11text[11], NULL, 0, &hp11item[12] },
{ &hp11item[13], 50, 9, SPEEDWIDTH, 10, /* Slow */
ITEMTEXT | ITEMENABLED | HIGHCOMP | CHECKIT | CHECKED, 2,
(APTR)&hp11text[12], NULL, 0, NULL },
{ NULL, 50, 19, SPEEDWIDTH, 10, /* Fast */
ITEMTEXT | ITEMENABLED | HIGHCOMP | CHECKIT, 1,
(APTR)&hp11text[13], NULL, 0, NULL },
{ NULL, 0, 20, SPEEDWIDTH, 10, /* Icons */
ITEMTEXT | ITEMENABLED | HIGHCOMP | CHECKIT | CHECKED, 0,
(APTR)&hp11text[14], NULL, 0, NULL }
};
/* The main menu options */
struct Menu hp11menu[] = {
{ &hp11menu[1], 0, 0, 80, 9, MENUENABLED, "Project", &hp11item[0] },
{ &hp11menu[2], 100, 0, 50, 9, MENUENABLED, "Edit", &hp11item[6] },
{ NULL, 170, 0, 80, 9, MENUENABLED, "Options", &hp11item[8] }
};
/* state of Icons menu option */
static BOOL icons_on = TRUE;
/* filename for save & open, window title */
static char filename[100], undo[100], winname[110];
/* Structures for file requester */
/* ----------------------------- */
static WORD shadowvert[] = { /* Points for shadow of ok/cancel box */
2, 15,
2, 17,
82, 17,
82, 1,
80, 1
};
static struct Border cancelshadow = { 0, 0, 2, 0, JAM1, 5, shadowvert, NULL };
static WORD cancelvert[] = { /* Actual box */
-1, -1,
80, -1,
80, 15,
-1, 15,
-1, -1
};
/* This defines a box with shadow 80 points wide */
static struct Border cancelborder = { 0, 0, 2, 0, JAM1, 5, cancelvert, &cancelshadow };
/* The cancel gadget */
static struct IntuiText canceltext = { 2, 1, JAM1, 10, 4, &topaz9attr, "Cancel", NULL };
static struct Gadget cancelgadget = {
NULL,
-100, -25, 80, 15, /* it is 100 points from the right, 25 points from
the bottom & measures 80x15 */
GADGHCOMP | GRELRIGHT | GRELBOTTOM,
RELVERIFY | TOGGLESELECT | ENDGADGET,
BOOLGADGET | REQGADGET,
(APTR)&cancelborder,
NULL,
&canceltext
};
static WORD okvert[] = { /* Box thickening */
0, 0,
79, 0,
79, 14,
0, 14,
0, 0
};
static struct Border okborder = { 0, 0, 2, 0, JAM1, 5, okvert, &cancelborder };
/* Ok gadget */
static struct IntuiText oktext = { 2, 1, JAM1, 30, 4, &topaz9attr, "Ok", NULL };
static struct Gadget okgadget = {
&cancelgadget,
20, -25, 80, 15,
GADGHCOMP | GRELBOTTOM,
RELVERIFY | TOGGLESELECT | ENDGADGET,
BOOLGADGET | REQGADGET,
(APTR)&okborder,
NULL,
&oktext
};
static WORD bluevert[] = {
0, 8,
199, 8
};
static struct Border blueline = { 0, 0, 0, 0, JAM1, 2, bluevert, NULL };
static WORD namevert[] = { /* for filename box */
-1, -1,
200, -1,
200, 9,
-1, 9,
-1, -1
};
static struct Border nameborder = { 0, 0, 2, 0, JAM1, 5, namevert, &blueline };
static struct StringInfo nameinfo = {
filename, undo,
0, 100, 0
};
static struct IntuiText nametext = { 2, 1, JAM1, -55, 0, &topaz9attr, NULL, NULL };
/* filename gadget */
static struct Gadget namegadget = {
&okgadget,
62, 10, 200, 9,
GADGHCOMP,
ENDGADGET,
STRGADGET | REQGADGET,
(APTR)&nameborder,
NULL,
&nametext,
0,
(APTR)&nameinfo
};
static WORD filevert[] = { /* for the complete requester */
0, 0,
269, 0,
269, 59,
0, 59,
0, 0
};
static struct Border fileborder = { 0, 0, 2, 0, JAM1, 5, filevert, NULL };
/* The actual requester */
static struct Requester filereq = {
NULL,
25, 65,
270, 60,
0, 0,
&namegadget,
&fileborder,
NULL,
0,
1
};
/* Message requester */
/* ----------------- */
static struct IntuiText msgtext = { 2, 1, JAM1, 10, 10, &topaz9attr, NULL, NULL };
static struct Gadget msgokgadget = {
NULL,
20, -25, 80, 15, /* Message inits LeftEdge */
GADGHCOMP | GRELBOTTOM,
RELVERIFY | TOGGLESELECT | ENDGADGET,
BOOLGADGET | REQGADGET,
(APTR)&okborder,
NULL,
&oktext
};
static WORD msgvert[][2] = {
0, 0,
0, 0,
0, 59,
0, 59,
0, 0
};
static struct Border msgborder = { 0, 0, 2, 0, JAM1, 5, msgvert, NULL };
static struct Requester msgreq = {
NULL,
0, 65, /* LeftEdge is initialised by Message */
0, 60, /* Width also */
0, 0,
&msgokgadget,
&msgborder,
&msgtext,
0,
1
};
/* struct DiskObject {
int a;
}; Little problem: DiskObject def lost !!! */
struct Library *IconBase; /* for the icon library */
struct ArpBase *ArpBase; /* Arp lib */
extern char tool[]; /* Path to hp11 program */
extern struct DiskObject prog_icon;
static BOOL clip;
void LoadProg(void), OpenProg(void), StoreProg(void), SaveProg(void), Copy(void), Paste(void);
BOOL MenusInit(argc, argv)
int argc;
APTR argv;
#define argw ((struct WBStartup *)argv)
#define arg1 (argw->sm_ArgList[1])
{
char path[PATHLEN];
topaz9 = OpenFont(&topaz9attr); /* Open the desired font */
IconBase = OpenLibrary("icon.library", 0);
if (!IconBase) { /* no icon library, disable icons */
icons_on = FALSE;
hp11item[14].Flags &= ~(CHECKED | ITEMENABLED);
}
ArpBase = OpenLibrary("arp.library", 0);
/* Set up tool path */
strcat(strcpy(tool, hp11path), hp11name);
if (!(clip = !CBOpen(0))) /* Disable clip options if no clipboard */
hp11menu[1].Flags = NULL;
SetMenuStrip(hp11, hp11menu);
if (argc != 0) { /* CLI */
icons_on = FALSE;
hp11item[14].Flags &= ~CHECKED; /* by default, no icons from cli */
if (argc > 1) { /* argument */
strcpy(filename, ((char **)argv)[1]);
LoadProg();
}
}
else if (argw->sm_NumArgs > 1) { /* workbench, with argument */
if (!mygetpath(path, arg1.wa_Lock)) path[0] = '\0';
strcpy(filename, strcat(path, arg1.wa_Name));
LoadProg();
}
return(TRUE);
}
#undef arg1
#undef argw
void MenusCleanUp()
{
if (hp11) ClearMenuStrip(hp11);
if (clip) CBClose();
if (ArpBase) CloseLibrary(ArpBase);
if (IconBase) CloseLibrary(IconBase);
if (topaz9) CloseFont(topaz9);
}
/* Enable menus */
void MenusOn(void)
{
SetMenuStrip(hp11, hp11menu);
}
/* Disable menus */
void MenusOff(void)
{
ClearMenuStrip(hp11);
}
void EditOn(void)
{
if (clip) OnMenu(hp11, SHIFTMENU(1) | SHIFTITEM(NOITEM));
}
void EditOff(void)
{
OffMenu(hp11, SHIFTMENU(1) | SHIFTITEM(NOITEM));
}
/* The menu handler, number represents the chosen option */
int MenuHandler(UWORD number)
{
register struct MenuItem *item;
register int key = -1;
MenusOff(); /* Disable menus */
while (number != MENUNULL) {
switch (MENUNUM(number)) {
case 0: /* Project */
switch (ITEMNUM(number)) {
case 0: /* New */ HP11ColdReset(); key = BRESET; break; /* back to main loop */
case 1: /* Open */ OpenProg(); key = BRESET; break;
case 2: /* Save */ StoreProg(); break;
case 3: /* Save as */ SaveProg(); break;
case 4: /* Print */ break;
case 5: /* Quit */ quit = TRUE; key = BRESET; break;
}
break;
case 1: /* Edit */
switch (ITEMNUM(number)) {
case 0: /* Copy */ Copy(); break;
case 1: /* Paste */ Paste(); key = BDISPLAY; break;
}
break;
case 2: /* Options */
switch (ITEMNUM(number)) {
case 0: /* Radix */
comma = SUBNUM(number); /* false for Point, true for Comma */
key = BDISPLAY; /* Redisplay */
break;
case 1: /* Speed */
fast = SUBNUM(number); /* false for Slow, true for Fast */
break;
case 2: /* Icons */
icons_on = !icons_on;
/* Toggle flag */
if (icons_on) hp11item[14].Flags |= CHECKED;
else hp11item[14].Flags &= ~CHECKED;
break;
}
break;
}
item = ItemAddress(hp11menu, (long)number);
number = item->NextSelect;
}
MenusOn();
return(key);
}
/* Display an error message */
void Message(text)
char *text;
{
register int width;
msgtext.IText = text;
width = IntuiTextLength(&msgtext) + 20; /* width of requester */
if (width < 100) width = 100; /* min width */
msgokgadget.Flags &= ~SELECTED;
msgreq.Width = width;
msgreq.LeftEdge = (HP11WIDTH - width) >> 1; /* center rqeuester */
msgokgadget.LeftEdge = (width >> 1) - 40; /* center OK */
msgvert[1][0] = width - 1;
msgvert[2][0] = width - 1;
Request(&msgreq, hp11);
}
/* Read a file name, text is displayed to the left of the name box.
Return FALSE if cancel selected, TRUE otherwise */
static BOOL GetFile(char *text)
{
ULONG saveIDCMP;
struct IntuiMessage *msg;
int done;
if (ArpBase) /* Use arp file req */
{
static char directory[DSIZE + 1];
static struct FileRequester FR;
filename[0] = '\0';
FR.fr_Hail = text;
FR.fr_File = filename;
FR.fr_Dir = directory;
if (FileRequest(&FR))
{
long lock = Lock(directory, SHARED_LOCK);
if (lock)
{
CurrentDir(lock);
return TRUE;
}
}
return FALSE;
}
else
{
nametext.IText = text;
okgadget.Flags &= ~SELECTED;
cancelgadget.Flags &= ~SELECTED;
saveIDCMP = hp11->IDCMPFlags;
ModifyIDCMP(hp11, REQCLEAR | REQSET);
Request(&filereq, hp11);
do {
WaitPort(hp11->UserPort); /* Wait for requester to appear */
msg = GetMsg(hp11->UserPort);
done = msg->Class == REQSET;
ReplyMsg(msg);
} while (!done);
ActivateGadget(&namegadget, hp11, &filereq);
do {
WaitPort(hp11->UserPort); /* Wait for requester to disappear */
msg = GetMsg(hp11->UserPort);
done = msg->Class == REQCLEAR;
ReplyMsg(msg);
} while (!done);
ModifyIDCMP(hp11, saveIDCMP);
if (!(cancelgadget.Flags & SELECTED))
{
CurrentDir(DupLock(CurrentDir(0)));
return TRUE;
}
else
return FALSE;
}
}
static void SetTitle(void)
{
SetWindowTitles(hp11, strcat(strcpy(winname, "HP11C - "), filename), (char *)(long)-1);
}
static int FileType(struct DiskObject *icon, char *type)
{
char *value;
if (!(value = FindToolType(icon->do_ToolTypes, "FILETYPE"))) return(FALSE);
return((int)MatchToolValue(value, type));
}
static void LoadProg()
{
LONG file;
struct Regs newhp11;
struct DiskObject *icon = NULL;
BYTE dummy;
if (IconBase && (icon = GetDiskObject(filename)) &&
!FileType(icon, "HP11")) {
Message("This isn't an HP11 program");
goto exit;
}
if (file = Open(filename, MODE_OLDFILE)) {
if ((Read(file, (char *)&newhp11, sizeof(struct Regs)) == sizeof(struct Regs))
&& (Read(file, &dummy, 1) != 1)) { /* dummy read to check file size */
hp11r = newhp11; /* Set new internal state */
running = FALSE; /* Interrupt program */
PC = 0;
retCnt = 0;
ENABLE();
SetTitle();
}
else Message("This isn't an HP11 program");
Close(file);
}
else Message("Couldn't open file");
exit: if (icon) FreeDiskObject(icon);
}
/* Save current state under current filename */
static void StoreProg()
{
LONG file;
struct DiskObject *temp_icon;
file = Open(filename, MODE_NEWFILE);
if (!file) Message("Couldn't open file");
else {
if (Write(file, (char *)&hp11r, sizeof(struct Regs)) != sizeof(struct Regs))
Message("Error writing the file");
else {
SetTitle();
if (icons_on)
if (!(temp_icon = GetDiskObject(filename)))
PutDiskObject(filename, &prog_icon);
else FreeDiskObject(temp_icon);
}
Close(file);
}
}
/* Save current state under a filename */
static void SaveProg()
{
BPTR cdir, new;
CurrentDir(cdir = CurrentDir(0));
if (GetFile("Save:"))
{
StoreProg();
if (new = CurrentDir(cdir)) UnLock(new);
}
}
/* Load the hp11 state */
static void OpenProg()
{
BPTR cdir, new;
CurrentDir(cdir = CurrentDir(0));
if (GetFile("Open:")) /* Get file name */
{
LoadProg();
if (new = CurrentDir(cdir)) UnLock(new);
}
}
static void Copy()
{
CBCut(NbStr(X));
}
static void Paste()
{
char buf[256];
if (CBPaste(buf)) {
Enter(); ENABLE();
X = Check(atof(buf));
}
}