diff options
-rw-r--r-- | src/Makefile | 13 | ||||
-rw-r--r-- | src/memmenu.c | 142 | ||||
-rw-r--r-- | src/spec.c | 13 | ||||
-rw-r--r-- | src/spec.h | 4 | ||||
-rw-r--r-- | src/util.c | 17 | ||||
-rw-r--r-- | src/util.h | 7 |
6 files changed, 158 insertions, 38 deletions
diff --git a/src/Makefile b/src/Makefile index 5d98ed7..ffb9c8f 100644 --- a/src/Makefile +++ b/src/Makefile @@ -18,7 +18,7 @@ # # ------------------------------------------------------------------------- # -# $Id: Makefile,v 1.6 2004-01-14 01:50:20 ianc Exp $ +# $Id: Makefile,v 1.7 2004-01-15 18:53:51 ianc Exp $ # @@ -56,7 +56,6 @@ CFLAGS += -Iz80 `sdl-config --cflags` LIBS = $(Z80LIB) `sdl-config --libs` - $(TARGET): $(OBJECTS) $(Z80LIB) $(CC) $(CFLAGS) -o $(TARGET) $(OBJECTS) $(LIBS) @@ -117,7 +116,7 @@ spec.o: /usr/local/include/SDL/SDL_keysym.h spec.o: /usr/local/include/SDL/SDL_mouse.h /usr/local/include/SDL/SDL_video.h spec.o: /usr/local/include/SDL/SDL_mutex.h /usr/local/include/SDL/SDL_quit.h spec.o: /usr/local/include/SDL/SDL_version.h snap.h gfx.h gui.h config.h -spec.o: exit.h +spec.o: exit.h util.h snap.o: snap.h /usr/include/stdlib.h /usr/include/sys/cdefs.h snap.o: /usr/include/sys/_types.h /usr/include/machine/_types.h snap.o: /usr/include/stdio.h z80/z80.h @@ -163,7 +162,7 @@ gui.o: /usr/local/include/SDL/SDL_keyboard.h gui.o: /usr/local/include/SDL/SDL_keysym.h /usr/local/include/SDL/SDL_mouse.h gui.o: /usr/local/include/SDL/SDL_video.h /usr/local/include/SDL/SDL_mutex.h gui.o: /usr/local/include/SDL/SDL_quit.h /usr/local/include/SDL/SDL_version.h -gui.o: exit.h +gui.o: exit.h util.h memmenu.o: /usr/include/stdlib.h /usr/include/sys/cdefs.h memmenu.o: /usr/include/sys/_types.h /usr/include/machine/_types.h memmenu.o: /usr/include/stdio.h /usr/include/string.h /usr/include/strings.h @@ -189,11 +188,11 @@ memmenu.o: /usr/local/include/SDL/SDL_mouse.h memmenu.o: /usr/local/include/SDL/SDL_video.h memmenu.o: /usr/local/include/SDL/SDL_mutex.h memmenu.o: /usr/local/include/SDL/SDL_quit.h -memmenu.o: /usr/local/include/SDL/SDL_version.h gfx.h gui.h +memmenu.o: /usr/local/include/SDL/SDL_version.h gfx.h gui.h util.h util.o: /usr/include/stdio.h /usr/include/sys/cdefs.h util.o: /usr/include/sys/_types.h /usr/include/machine/_types.h -util.o: /usr/include/string.h /usr/include/strings.h util.h -util.o: /usr/include/stdlib.h exit.h +util.o: /usr/include/string.h /usr/include/strings.h /usr/include/stdarg.h +util.o: util.h /usr/include/stdlib.h exit.h exit.o: /usr/include/stdlib.h /usr/include/sys/cdefs.h exit.o: /usr/include/sys/_types.h /usr/include/machine/_types.h exit.o: /usr/include/stdarg.h exit.h /usr/local/include/SDL/SDL.h diff --git a/src/memmenu.c b/src/memmenu.c index dfce66d..41a18b3 100644 --- a/src/memmenu.c +++ b/src/memmenu.c @@ -41,20 +41,21 @@ static const char ident[]="$Id$"; static const char ident_h[]=ESPEC_MEMMENU_H; #ifndef TRUE -#define TRUE 1 +#define TRUE 1 #endif #ifndef FALSE -#define FALSE 0 +#define FALSE 0 #endif -#define WHITE GFXRGB(255,255,255) -#define BLACK GFXRGB(0,0,0) -#define RED GFXRGB(255,100,100) -#define GREEN GFXRGB(100,255,100) -#define BLUE GFXRGB(100,100,255) +#define WHITE GFXRGB(255,255,255) +#define BLACK GFXRGB(0,0,0) +#define RED GFXRGB(255,100,100) +#define GREEN GFXRGB(100,255,100) +#define BLUE GFXRGB(100,100,255) -#define TRACE "trace" +#define TRACE "trace" +#define TRACEMEM_WIN 10 /* ---------------------------------------- TYPES @@ -66,10 +67,26 @@ typedef struct } Breakpoint; +typedef struct +{ + Z80Word addr; + Z80Word val; +} MemTrace; + + +typedef struct +{ + Z80State s; + MemTrace hl[TRACEMEM_WIN]; + MemTrace de[TRACEMEM_WIN]; + MemTrace sp[TRACEMEM_WIN]; +} Trace; + + /* ---------------------------------------- STATIC DATA */ static FILE *trace=NULL; -static Breakpoint bpoint={NULL,0}; +static Breakpoint bpoint={0,NULL}; static const char *brk=NULL; static int lodged=FALSE; @@ -111,15 +128,16 @@ static void DisplayMenu(void) { static const char *menu[]= { - "1. Disassemble/Hex dump ", - "2. Disassemble to file ", - "3. Start/Stop trace log ", - "4. Playback trace log ", - "5. Add a new breakpoint ", - "6. Clear a breakpoint ", - "7. Display breakpoints ", - "8. Clear all breakpoints", - "9. Return ", + "1 - Disassemble/Hex dump ", + "2 - Disassemble to file ", + "3 - Start/Stop trace log ", + "4 - Playback trace log ", + "5 - Add a new breakpoint ", + "6 -Clear a breakpoint ", + "7 - Display breakpoints ", + "8 - Clear all breakpoints", + "R - Reset ", + "ESC - Return ", NULL }; @@ -171,6 +189,10 @@ void DisplayZ80State(Z80State *s, int y, Uint32 col) s->IX,s->IY,s->SP); y+=8; GFXPrintPaper(0,y,col,BLACK, + "AF'=%4.4x BC'=%4.4x DE'=%4.4x HL'=%4.4x", + s->AF_,s->BC_,s->DE_,s->HL_); + y+=8; + GFXPrintPaper(0,y,col,BLACK, "I=%2.2x IM=%2.2x R=%2.2x", s->I,s->IM,s->R); y+=8; @@ -396,17 +418,43 @@ static void DoDisassemFile(Z80 *z80, const Z80State *s) } +static void GetMemTrace(Z80 *z80, MemTrace *t, Z80Word from, int count) +{ + int f; + + f=0; + + while(f<count) + { + Z80Word w; + + w=(Z80Word)SPECReadForDisassem(z80,from)| + (Z80Word)SPECReadForDisassem(z80,from+1)<<8; + + t[f].addr=from; + t[f].val=w; + + from+=2; + f++; + } +} + + static int Instruction(Z80 *z80, Z80Val data) { int f; if (trace) { - Z80State s; + Trace t; - Z80GetState(z80,&s); + Z80GetState(z80,&t.s); - fwrite(&s,sizeof s,1,trace); + GetMemTrace(z80,t.hl,t.s.HL-(TRACEMEM_WIN/2+1),TRACEMEM_WIN); + GetMemTrace(z80,t.de,t.s.DE-(TRACEMEM_WIN/2+1),TRACEMEM_WIN); + GetMemTrace(z80,t.sp,t.s.SP-(TRACEMEM_WIN/2+1),TRACEMEM_WIN); + + fwrite(&t,sizeof t,1,trace); } for(f=0;f<bpoint.no;f++) @@ -455,6 +503,27 @@ static void DisableTrace(Z80 *z80) } +static void DisplayTraceMem(int x, int y, const char *name, + MemTrace *m, Z80Word expect) +{ + int f; + + GFXPrint(x,y,GREEN,"%s",name); + + for(f=0;f<TRACEMEM_WIN;f++) + { + Uint32 paper; + + if (m[f].addr==expect) + paper=RED; + else + paper=BLACK; + + GFXPrintPaper(x,y+f*8+12,GREEN,paper,"%4.4x",m[f].addr); + GFXPrintPaper(x+32,y+f*8+12,WHITE,paper," %4.4x",m[f].val); + } +} + static void PlaybackTrace(Z80 *z80) { FILE *fp; @@ -463,7 +532,7 @@ static void PlaybackTrace(Z80 *z80) long pos; long max_pos; Z80Word pc; - Z80State s; + Trace t; fp=fopen(TRACE,"rb"); @@ -475,7 +544,7 @@ static void PlaybackTrace(Z80 *z80) fseek(fp,0,SEEK_END); - max_pos=ftell(fp)/sizeof s; + max_pos=ftell(fp)/sizeof t; if (max_pos==0) { @@ -500,10 +569,14 @@ static void PlaybackTrace(Z80 *z80) Centre("TRACE PLAYBACK",0,WHITE); Centre("Press F1 for help",9,RED); - fseek(fp,pos*sizeof s,SEEK_SET); - fread(&s,sizeof s,1,fp); + fseek(fp,pos*sizeof t,SEEK_SET); + fread(&t,sizeof t,1,fp); - DisplayZ80State(&s,136,WHITE); + DisplayZ80State(&t.s,136,WHITE); + + DisplayTraceMem(0,192,"MEM (SP)",t.sp,t.s.SP); + DisplayTraceMem(100,192,"MEM (HL)",t.hl,t.s.HL); + DisplayTraceMem(200,192,"MEM (DE)",t.de,t.s.DE); for(f=0;f<10;f++) { @@ -519,9 +592,9 @@ static void PlaybackTrace(Z80 *z80) else paper=BLACK; - GFXPrintPaper(0,y,GREEN,paper,"%4.4x ",s.PC); + GFXPrintPaper(0,y,GREEN,paper,"%4.4x ",t.s.PC); - strcpy(str,Z80Disassemble(z80,&s.PC)); + strcpy(str,Z80Disassemble(z80,&t.s.PC)); p=strtok(str,";"); GFXPrintPaper(40,y,WHITE,paper,"%s",str); } @@ -565,10 +638,10 @@ static void PlaybackTrace(Z80 *z80) case SDLK_p: if (EnterAddress("PC to search for?",z80,&pc)) { - while((rd=fread(&s,sizeof s,1,fp))==1) + while((rd=fread(&t,sizeof t,1,fp))==1) { pos++; - if (s.PC==pc) + if (t.s.PC==pc) break; } @@ -783,8 +856,15 @@ void MemoryMenu(Z80 *z80) DoClearBreakpoint(z80); break; + case SDLK_r: + if (GUIMessage(eYesNoBox,"RESET","Sure?")) + { + Z80Reset(z80); + SPECReset(z80); + } + break; + case SDLK_ESCAPE: - case SDLK_9: quit=TRUE; break; @@ -34,6 +34,7 @@ static const char ident[]="$Id$"; #include "gui.h" #include "config.h" #include "exit.h" +#include "util.h" static const char ident_h[]=ESPEC_SPECH; @@ -545,6 +546,13 @@ Z80Word SPECReadWord(Z80 *z80, Z80Word addr) void SPECWriteWord(Z80 *z80, Z80Word addr, Z80Word val) { + if (addr==0xff4e && val==0) + { + Z80State s; + Z80GetState(z80,&s); + Debug("Wrote %4.4x to %4.4x @%4.4x\n",val,addr,s.PC); + } + if (addr>=ROMLEN) mem[addr]=val&0xff; @@ -822,6 +830,11 @@ const char *SPECInfo(Z80 *z80) } +void SPECReset(Z80 *z80) +{ +} + + void SPECMount(SPECMountType type, const char *path) { switch(type) @@ -57,6 +57,10 @@ const Z80Label *SPECGetLabel(void); */ const char *SPECInfo(Z80 *z80); +/* Called when the machine is reset +*/ +void SPECReset(Z80 *z80); + /* Interfaces for snapshot and device control */ @@ -27,6 +27,7 @@ static const char ident[]="$Id$"; #include <stdio.h> #include <string.h> +#include <stdarg.h> #include "util.h" #include "exit.h" @@ -108,4 +109,20 @@ const char *Dirname(const char *path) } +void Debug(const char *format, ...) +{ + static FILE *fp=NULL; + va_list ap; + + if (!fp) + fp=fopen("debug.txt","w"); + + if (!fp) + return; + + va_start(ap,format); + vfprintf(fp,format,ap); + va_end(ap); +} + /* END OF FILE */ @@ -60,6 +60,13 @@ const char *Basename(const char *path); const char *Dirname(const char *path); +/* Writes the passed text to debug.txt. Note this is interface is not + able to be switched on/off, so debug is only used in a transient way + (once the bug is fixed, calls to this should be removed). +*/ +void Debug(const char *format,...); + + #endif |