home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
AmigActive 13
/
AACD13.ISO
/
AACD
/
Games
/
WHDLoad
/
Src
/
gci
/
winmem.c
< prev
Wrap
C/C++ Source or Header
|
2000-08-10
|
9KB
|
340 lines
/*************************************************************************
; :Module. winmem.c
; :Author. Bert Jahn
; :EMail. wepl@whdload.org
; :Address. Franz-Liszt-Straße 16, Rudolstadt, 07404, Germany
; :Version. $Id: winmem.c 1.4 2000/08/10 21:38:10 jah Exp jah $
; :History. 21.03.00 separated from main
; :Copyright. All Rights Reserved
; :Language. C
; :Translator. GCC
*************************************************************************/
#include <stdlib.h>
#include <string.h>
#include <exec/execbase.h>
#include <libraries/mui.h>
#include <mui/HexEdit_mcc.h>
#include <clib/alib_protos.h>
#include <clib/gadtools_protos.h>
#include <clib/muimaster_protos.h>
#include <clib/utility_protos.h>
#include "whddump.h"
#include "WHDLoadGCI.h"
/************************************************************************/
/* Compiler Stuff */
/************************************************************************/
#define REG(x) register __ ## x
#define ASM __asm
#define SAVEDS __saveds
/************************************************************************/
/* defines */
/************************************************************************/
#define MAXWINMEM 10 /* amount of possible memory hexdump windows */
#define MUIA_HexEdit_My TAG_USER + 1
/************************************************************************/
/* extern variables */
/************************************************************************/
extern APTR app,win;
extern struct whddump_header *header;
extern struct Library *MUIMasterBase;
extern APTR mem,emem,slave;
extern const char* StringHexAccept;
/************************************************************************/
/* static variables */
/************************************************************************/
static APTR win_mem[MAXWINMEM]; /* memory hexdump windows */
static APTR gad_hex[MAXWINMEM]; /* hex display gadgets */
static APTR gad_goto[MAXWINMEM]; /* goto gadgets */
static struct MUI_CustomClass *HexClass;
static struct NewMenu MenuDataMem[] =
{
MENUBASE
{ NM_TITLE, "Memory" , 0 ,0 ,0 ,(APTR)MEN_MEMORY },\
{ NM_ITEM , "Goto" ,"G",0 ,0 ,(APTR)MEN_GOTO0 },\
{ NM_END,NULL,0,0,0,(APTR)0 },
};
/************************************************************************/
/* function declarations */
/************************************************************************/
void * wmem_init (void);
void wmem_finit (void);
/************************************************************************/
struct HexData {
int low_bound;
int high_bound;
int base_address;
int len_base;
int len_off;
};
SAVEDS ULONG
mNew(
struct IClass *cl,
Object *obj,
Msg msg
) {
struct TagItem *tags,*tag;
int i;
struct HexData tmp = {0,0,0,0,0};
for (tags=((struct opSet *)msg)->ops_AttrList; (tag=NextTagItem(&tags)); )
{
switch (tag->ti_Tag)
{
case MUIA_HexEdit_LowBound: tmp.low_bound = tag->ti_Data; break;
case MUIA_HexEdit_HighBound: tmp.high_bound = tag->ti_Data; break;
case MUIA_HexEdit_BaseAddressOffset: tmp.base_address = tag->ti_Data; break;
case MUIA_HexEdit_AddressChars:
i = tmp.high_bound + tmp.base_address;
tmp.len_base = i < 0x10000 ? 4 :
i < 0x100000 ? 5 :
i < 0x1000000 ? 6 :
i < 0x10000000 ? 7 : 8;
if (tmp.low_bound + tmp.base_address) {
i = tmp.high_bound - tmp.low_bound;
tmp.len_off = i < 0x1000 ? 3 :
i < 0x10000 ? 4 :
i < 0x100000 ? 5 : 6;
} else {
tmp.len_off = 0;
}
tag->ti_Data = tmp.len_base + (tmp.len_off ? 1 + tmp.len_off : 0);
break;
}
}
if (!(obj = (Object *)DoSuperMethodA(cl,obj,msg))) return(0);
memcpy(INST_DATA(cl,obj), &tmp, sizeof(tmp));
return ((ULONG)obj);
}
SAVEDS ULONG
mSet(
struct IClass *cl,
Object *obj,
Msg msg
) {
struct TagItem *tags,*tag;
char *s;
int i;
for (tags=((struct opSet *)msg)->ops_AttrList; (tag=NextTagItem(&tags)); )
{
switch (tag->ti_Tag)
{
case MUIA_HexEdit_My:
get( gad_goto[tag->ti_Data], MUIA_String_Contents, &s );
i = atoi( s );
set( obj, MUIA_HexEdit_CursorAddress, 1000 );
break;
}
}
return DoSuperMethodA(cl,obj,msg);
}
SAVEDS ULONG
mCreateDisplayAddress(
struct IClass *cl,
Object *obj,
struct MUIP_HexEdit_CreateDisplayAddress *msg
) {
struct HexData *d = INST_DATA(cl,obj);
ULONG address;
UBYTE i;
UBYTE *hextable = "0123456789ABCDEF";
address = (d->base_address + msg->address) << (32 - d->len_base * 4);
for(i = 0; i < d->len_base; i++)
{
*(*msg->cp)++ = hextable[address >> (32 - 4)];
address <<= 4;
}
address = (msg->address - d->low_bound) << (32 - d->len_off * 4);
if (d->len_off) {
*(*msg->cp)++ = (unsigned char) '·';
for(i = 0; i < d->len_off; i++)
{
*(*msg->cp)++ = hextable[address >> (32 - 4)];
address <<= 4;
}
}
return(TRUE);
}
/*
SAVEDS ASM ULONG
HexDispatcher(
REG(a0) struct IClass *cl,
REG(a2) Object *obj,
REG(a1) Msg msg
*/
SAVEDS ULONG
HexDispatcher(
struct IClass *cl __asm("a0"),
Object *obj __asm("a2"),
Msg msg __asm("a1")
) {
switch (msg->MethodID)
{
case OM_NEW : return(mNew (cl,obj,(APTR)msg));
case OM_SET : return(mSet (cl,obj,(APTR)msg));
case MUIM_HexEdit_CreateDisplayAddress : return(mCreateDisplayAddress (cl,obj,(APTR)msg));
}
return(DoSuperMethodA(cl,obj,msg));
}
/****************************************************************************/
void * wmem_init() {
return HexClass = MUI_CreateCustomClass(NULL,MUIC_HexEdit,NULL,sizeof(struct HexData),HexDispatcher);
}
void wmem_finit() {
if (HexClass) MUI_DeleteCustomClass(HexClass);
}
/****************************************************************************/
void
wmem_make(
int adr /* start address (logical) of memory to display */
) {
int n;
APTR prop;
ULONG open;
APTR low,high;
ULONG off,cur;
char *title;
/*
* check if there is a free window left
* if window closed dispose it
*/
for (n=0; (n<MAXWINMEM) && win_mem[n]; n++) {
get(win_mem[n],MUIA_Window_Open,&open);
if (!open) {
DoMethod(app,OM_REMMEMBER,win_mem[n]);
MUI_DisposeObject(win_mem[n]);
win_mem[n] = NULL;
break;
}
}
if (n==MAXWINMEM) {
MUI_Request(app,win,0,NULL,"Ok","Sorry, too many windows already open.");
return;
}
/*
* check which memory is requested
*/
if (adr < header->wdh_BaseMemSize) {
title = "Base Memory (Chip)";
low = mem;
high = ((UBYTE*)mem) + header->wdh_BaseMemSize - 1;
off = -(ULONG)mem;
cur = adr;
} else if ((adr >= header->wdh_ExpMemLog) && (adr < header->wdh_ExpMemLog + header->wdh_ExpMemLen)) {
title = "Expansion Memory (Fast)";
low = emem;
high = ((UBYTE*)emem) + header->wdh_ExpMemLen - 1;
off = header->wdh_ExpMemLog - (ULONG)emem;
cur = adr - header->wdh_ExpMemLog;
} else if ((adr >= header->wdh_SlaveLog) && (adr < header->wdh_SlaveLog + header->wdh_SlaveLen)) {
title = "Slave Memory";
low = slave;
high = ((UBYTE*)slave) + header->wdh_SlaveLen - 1;
off = header->wdh_SlaveLog - (ULONG)slave;
cur = adr - header->wdh_SlaveLog;
} else {
MUI_Request(app,win,0,NULL,"Ok","Sorry, address is outside the defined memory.");
return;
}
/*
* create the window
*/
win_mem[n] = WindowObject,
MUIA_Window_Title, title,
MUIA_Window_ID , n + MAKE_ID('M','E','M','0'),
MUIA_Window_Menustrip, MUI_MakeObject(MUIO_MenustripNM,MenuDataMem,0),
WindowContents, VGroup,
Child, HGroup,
Child, Label2("Goto Offset:"),
Child, gad_goto[n] = BetterStringObject,
StringFrame,
MUIA_String_Accept , StringHexAccept,
MUIA_String_MaxLen , 10,
MUIA_String_Format , MUIV_String_Format_Right,
MUIA_ShortHelp, "Goto Offset",
MUIA_String_Contents, "$",
End,
End,
Child, HGroup,
Child, gad_hex[n] = NewObject(HexClass->mcc_Class,0, VirtualFrame,
MUIA_HexEdit_LowBound, low,
MUIA_HexEdit_HighBound, high,
MUIA_HexEdit_BaseAddressOffset, off,
MUIA_HexEdit_AddressChars, 0, /* must be after Low, High and BaseAddressOffset! */
MUIA_HexEdit_EditMode, TRUE,
MUIA_HexEdit_SelectMode, MUIV_HexEdit_SelectMode_Byte,
//MUIA_HexEdit_CursorAddress, cur,
MUIA_CycleChain, 1,
End,
Child, prop = ScrollbarObject,
MUIA_Prop_UseWinBorder, MUIV_Prop_UseWinBorder_Right,
End,
End,
End,
End;
if (!win_mem[n]) {
MUI_Request(app,win,0,NULL,"Ok","Couldn't open window.");
return;
}
set(gad_hex[n],MUIA_HexEdit_BaseAddressOffset,off);
set(gad_hex[n],MUIA_HexEdit_AddressChars,2);
/*
* add window to application and open it
*/
DoMethod(app,OM_ADDMEMBER,win_mem[n]);
set(gad_hex[n],MUIA_HexEdit_PropObject,prop);
DoMethod(win_mem[n],MUIM_Notify,MUIA_Window_CloseRequest,TRUE,win_mem[n],3,MUIM_Set,MUIA_Window_Open,FALSE);
DoMethod(gad_goto[n],MUIM_Notify,MUIA_String_Accept,TRUE,gad_hex[n],3,MUIM_Set,MUIA_HexEdit_My,n);
set(win_mem[n],MUIA_Window_Open,TRUE);
}
/****************************************************************************/
void wmem_goto ( int num )
{
}
/****************************************************************************/