Code : Tout sélectionner
//////////////////////////////////////////////////////////////////////////////
// DCVG5Kdebug.c - Debugger
// Author : Daniel Coulom - danielcoulom@gmail.com
// Creation : July 2005
//////////////////////////////////////////////////////////////////////////////
#include <windows.h>
#include <commctrl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BYTE_TYPE_DEFINED
#include "Z80.h"
#include "dcvg5k.h"
#define GET8 c = Newcar(string, a++)
#define GET16 GET8; x = c << 8; GET8; x += c
// global variables //////////////////////////////////////////////////////////
HWND hwnddebug; //handle for debug window
HFONT hfont; //handle for dump and disassembly listbox font
int loadaddress; // adresse de chargement fichier ou octets
int loadbyte; // valeur des octets a charger
int dumpaddress; // adresse dump memoire et desassemblage
int breakaddress; // adresse du breakpoint affiche
int breakpoint; // adresse du breakpoint courant
int nextbreak; // adresse du breakpoint suivant
int breaktype; // nature du point d'arret
char ligne[80]; // chaine de travail
char text[5]; // chaine de travail
int pausestatus; // sauvegarde du flag pause
// external variables ////////////////////////////////////////////////////////
extern HWND hwndstatus; //handle for status window
extern int xbitmap, ybitmap;
extern char ram[];
//extern char rom[];
extern char *rom;
extern char progdir[];
extern char filename[];
extern int pause;
extern Z80 CPU;
extern int language;
extern char *msg_string[][2];
//Acquisition d'un nouveau caractere
int Newcar(char *string, int address)
{
char work[3];
int c = 0xff & RdZ80(address);
//ajout dans ligne (en hexadecimal)
sprintf(work, "%02x", c);
strcat(string, work);
return c;
}
// Desassembly ///////////////////////////////////////////////////////////////
int DasmZ80(char *string, int a)
/*
string = pointeur vers une chaine recevant la ligne desassemblee
a = adresse des caracteres a desassembler
retour = nombre d'octets desassembles
*/
{
char *depart;
char instruction[80];
int i, j, nbytes;
//initialisation de la ligne avec l'adresse de l'instruction
sprintf(string, "%04x ", a);
//desassemblage
depart = (a < 0x4000) ? rom + a : ram + a - 0x4000;
nbytes = DAsm(instruction, depart);
//code hexadecimal
for(i = 0; i < 4; i++)
{
if(i < nbytes) sprintf(string + 6 + 2 * i, "%02x", RdZ80(a++));
else strcat(string, " ");
}
strcat(string, " \t");
//code operation
for(i = 1; i < 10; i++)
{
if(instruction[i] == 0x00) {instruction[i + 1] = 0; break;}
if(instruction[i] == 0x20) {instruction[i] = 0; break;}
}
strcat(string, instruction);
for(j = i; j < 7; j++) strcat(string, " ");
strcat(string, "\t");
//operande
strcat(string, instruction + i + 1);
return nbytes;
}
// memory dump ///////////////////////////////////////////////////////////////
int Dump(char *string, int address)
/*
string = pointeur vers une chaine recevant la ligne dumpee
address = adresse des caracteres a dumper
retour = nombre d'octets dumpes
*/
{
int i;
char work[3];
char text20[20] = {"\t "};
sprintf(string, "%04x", address);
//strupr(string); //en majuscule, pb de tabulation si adresse DDDD
for(i = 0; i < 16; i++)
{
int c = 0xff & RdZ80(address++);
//dump hexadecimal
sprintf(work, "\t%02x", c);
strcat(string, work);
//dump caracteres
if((c < 0x20) || (c > 0x7f)) strcat(text20, ".");
else {sprintf(work, "%c", c); strcat(text20, work);}
}
strcat(string, text20);
return 16;
}
// video dump ///////////////////////////////////////////////////////////////
int Dumpvideo(char *string, int address)
/*
string = pointeur vers une chaine recevant la ligne dumpee
address = adresse des caracteres a dumper
retour = nombre d'octets dumpes
*/
{
int i;
char work[3];
char text20[20] = {"\t "};
extern char EF9345ram[];
sprintf(string, "%04x", address);
//strupr(string); //en majuscule, pb de tabulation si adresse DDDD
for(i = 0; i < 16; i++)
{
int c = 0xff & EF9345ram[address++];
//dump hexadecimal
sprintf(work, "\t%02x", c);
strcat(string, work);
//dump caracteres
if((c < 0x20) || (c > 0x7f)) strcat(text20, ".");
else {sprintf(work, "%c", c); strcat(text20, work);}
}
strcat(string, text20);
return 16;
}
// I/O ports dump /////////////////////////////////////////////////////////////
int DumpIO(char *string, int address)
/*
string = pointeur vers une chaine recevant la ligne dumpee
address = adresse des caracteres a dumper
retour = nombre d'octets dumpes
*/
{
int i;
char work[3];
char text20[20] = {"\t "};
extern char ioport[];
sprintf(string, "%04x", address);
//strupr(string); //en majuscule, pb de tabulation si adresse DDDD
for(i = 0; i < 16; i++)
{
int c = 0xff & ioport[address++];
//dump hexadecimal
sprintf(work, "\t%02x", c);
strcat(string, work);
//dump caracteres
if((c < 0x20) || (c > 0x7f)) strcat(text20, ".");
else {sprintf(work, "%c", c); strcat(text20, work);}
}
strcat(string, text20);
return 16;
}
// Modify registers //////////////////////////////////////////////////////////
void Registermodify(HWND hwnd)
{
//get new values
//GetDlgItemText(hwnd, 911, text, 5); X = strtol(text, NULL, 16);
//GetDlgItemText(hwnd, 912, text, 5); Y = strtol(text, NULL, 16);
//GetDlgItemText(hwnd, 913, text, 5); S = strtol(text, NULL, 16);
//GetDlgItemText(hwnd, 914, text, 5); U = strtol(text, NULL, 16);
//GetDlgItemText(hwnd, 915, text, 5); PC = strtol(text, NULL, 16);
//GetDlgItemText(hwnd, 916, text, 3); *A = strtol(text, NULL, 16);
//GetDlgItemText(hwnd, 917, text, 3); *B = strtol(text, NULL, 16);
//GetDlgItemText(hwnd, 918, text, 3); *DP = strtol(text, NULL, 16);
//GetDlgItemText(hwnd, 919, text, 3); CC = strtol(text, NULL, 16);
}
// Display registers and cycles ///////////////////////////////////////////////
void Registerdisplay(HWND hwnd)
{
HWND hdumpbox = GetDlgItem(hwnd, 961); //handle hardware dump
int i, a = 0x80;
int tab[1] = {11}; //tabulation pour le dump
extern Z80 CPU;
extern char EF9345reg[]; //registres R0 à R7
extern char EF9345status; //registre status
extern int cycleirq, cycleline, nline;
extern int Indexram(int r);
//extern int EF9345index; //index ram EF9345
//extern int videolinenumber, videolinecycle;
//Z80 registers
sprintf(text,"%04x", CPU.PC.W & 0xffff); SetDlgItemText(hwnd, 911, text);
sprintf(text,"%04x", CPU.SP.W & 0xffff); SetDlgItemText(hwnd, 912, text);
sprintf(text,"%04x", CPU.IY.W & 0xffff); SetDlgItemText(hwnd, 913, text);
sprintf(text,"%04x", CPU.IX.W & 0xffff); SetDlgItemText(hwnd, 914, text);
sprintf(text,"%02x", CPU.I & 0xff ); SetDlgItemText(hwnd, 915, text);
sprintf(text,"%02x", CPU.R & 0xff ); SetDlgItemText(hwnd, 916, text);
sprintf(text,"%04x", CPU.AF.W & 0xffff); SetDlgItemText(hwnd, 917, text);
sprintf(text,"%04x", CPU.BC.W & 0xffff); SetDlgItemText(hwnd, 918, text);
sprintf(text,"%04x", CPU.DE.W & 0xffff); SetDlgItemText(hwnd, 919, text);
sprintf(text,"%04x", CPU.HL.W & 0xffff); SetDlgItemText(hwnd, 920, text);
sprintf(text,"%04x", CPU.AF1.W & 0xffff); SetDlgItemText(hwnd, 921, text);
sprintf(text,"%04x", CPU.BC1.W & 0xffff); SetDlgItemText(hwnd, 922, text);
sprintf(text,"%04x", CPU.DE1.W & 0xffff); SetDlgItemText(hwnd, 923, text);
sprintf(text,"%04x", CPU.HL1.W & 0xffff); SetDlgItemText(hwnd, 924, text);
sprintf(text,"%02x", CPU.IFF & 0xff ); SetDlgItemText(hwnd, 925, text);
//EF9345 registers
sprintf(text,"%02x", EF9345reg[0] & 0xff); SetDlgItemText(hwnd, 980, text);
sprintf(text,"%02x", EF9345reg[1] & 0xff); SetDlgItemText(hwnd, 981, text);
sprintf(text,"%02x", EF9345reg[2] & 0xff); SetDlgItemText(hwnd, 982, text);
sprintf(text,"%02x", EF9345reg[3] & 0xff); SetDlgItemText(hwnd, 983, text);
sprintf(text,"%02x", EF9345reg[4] & 0xff); SetDlgItemText(hwnd, 984, text);
sprintf(text,"%02x", EF9345reg[5] & 0xff); SetDlgItemText(hwnd, 985, text);
sprintf(text,"%02x", EF9345reg[6] & 0xff); SetDlgItemText(hwnd, 986, text);
sprintf(text,"%02x", EF9345reg[7] & 0xff); SetDlgItemText(hwnd, 987, text);
sprintf(text,"%02x", EF9345status & 0xff); SetDlgItemText(hwnd, 905, text);
sprintf(text,"%04x", EF9345_ramindex(7) & 0xffff); SetDlgItemText(hwnd, 906, text);
sprintf(text,"%02x", EF9345reg[8] & 0xff); SetDlgItemText(hwnd, 900, text);
sprintf(text,"%02x", EF9345reg[9] & 0xff); SetDlgItemText(hwnd, 901, text);
sprintf(text,"%02x", EF9345reg[10] & 0xff); SetDlgItemText(hwnd, 902, text);
sprintf(text,"%02x", EF9345reg[11] & 0xff); SetDlgItemText(hwnd, 903, text);
sprintf(text,"%02x", EF9345reg[12] & 0xff); SetDlgItemText(hwnd, 904, text);
//hardware registers
SendMessage(hdumpbox, LB_RESETCONTENT, 0, 0);
SendMessage(hdumpbox, LB_SETTABSTOPS, 1, (LPARAM)tab);
for(i = 0; i < 3; i++)
{
a += DumpIO(ligne, a) + 16;
SendMessage(hdumpbox, LB_ADDSTRING, 0, (LPARAM)ligne);
}
SendMessage(hdumpbox, LB_SETSEL, TRUE, 0);
//cycles
//sprintf(text, "%d", videolinenumber); SetDlgItemText(hwnd, 962, text);
//sprintf(text, "%d", videolinecycle); SetDlgItemText(hwnd, 964, text);
//compteurs
sprintf(text,"%i", cycleirq); SetDlgItemText(hwnd, 991, text);
sprintf(text,"%i", cycleline); SetDlgItemText(hwnd, 992, text);
sprintf(text,"%i", nline); SetDlgItemText(hwnd, 993, text);
}
// Set next breakpoint ///////////////////////////////////////////////////////
void Setnextbreak()
{
int address;
address = CPU.PC.W & 0xffff;
address += DasmZ80(ligne, address);
nextbreak = -1;
if(strstr(ligne, "CALL")) nextbreak = address & 0xffff;
if(strstr(ligne, "HALT")) nextbreak = address & 0xffff;
}
// Disassembly at PC address /////////////////////////////////////////////////
void PCdasdisplay(HWND hwnd)
{
HWND hpcdasbox = GetDlgItem(hwnd, 971); //handle listbox dasm PC
int i, address;
Setnextbreak();
SendMessage(hpcdasbox, LB_RESETCONTENT, 0, 0);
address = CPU.PC.W & 0xffff;
for(i = 0; i < 20; i++)
{
address += DasmZ80(ligne, address);
/*
if(i == 0)
{
nextbreak = -1;
if(strstr(ligne, "CALL")) nextbreak = address & 0xffff;
if(strstr(ligne, "HALT")) nextbreak = address & 0xffff;
}
*/
SendMessage(hpcdasbox, LB_ADDSTRING, 0, (LPARAM)strupr(ligne));
}
SendMessage(hpcdasbox, LB_SETSEL, TRUE, 0);
}
// Display Break Point ///////////////////////////////////////////////////////
void BPdisplay(HWND hwnd)
{
sprintf(text,"%04x", breakaddress & 0xffff);
SetDlgItemText(hwnd, 932, text);
CheckRadioButton(hwnd, 935, 938, 935 + breaktype);
}
// Display das and dump + copy to clipboard ///////////////////////////////////
void Dasdisplay(HWND hwnd)
{
int address, addressmax;
int tab[1]; //tabulation pour le dump
HWND hdasbox = GetDlgItem(hwnd, 941); //handle listbox dasm BP
HWND hdumpbox = GetDlgItem(hwnd, 942); //handle listbox dump BP
HWND hvideobox = GetDlgItem(hwnd, 959); //handle listbox dump video
sprintf(text, "%04x", dumpaddress & 0xffff);
SetDlgItemText(hwnd, 944, text);
sprintf(text,"%02x", RdZ80(dumpaddress) & 0xff);
SetDlgItemText(hwnd, 947, text);
sprintf(text, "%04x", loadaddress & 0xffff);
SetDlgItemText(hwnd, 950, text);
sprintf(text, "%02x", loadbyte & 0xff);
SetDlgItemText(hwnd, 953, text);
//Desassembly 0x1000 bytes at dasaddress
address = dumpaddress;
addressmax = dumpaddress + 0x1000;
if(addressmax > 0xffff) addressmax = 0xffff;
SendMessage(hdasbox, LB_RESETCONTENT, 0, 0);
while(address < addressmax)
{
address += DasmZ80(ligne, address);
SendMessage(hdasbox, LB_ADDSTRING, 0, (LPARAM)strupr(ligne));
}
SendMessage(hdasbox, LB_SETSEL, TRUE, 0);
//Dump at dasaddress
tab[0] = 10;
address = dumpaddress;
SendMessage(hdumpbox, LB_RESETCONTENT, 0, 0);
SendMessage(hdumpbox, LB_SETTABSTOPS, 1, (LPARAM)tab);
//sprintf(text, "%04x", address);
//MessageBox(NULL, text, "rammax", MB_OK);
while(address < addressmax)
{
address += Dump(ligne, address);
SendMessage(hdumpbox, LB_ADDSTRING, 0, (LPARAM)ligne);
}
SendMessage(hdumpbox, LB_SETSEL, TRUE, 0);
//Dump video memory
address = 0;
SendMessage(hvideobox, LB_RESETCONTENT, 0, 0);
SendMessage(hvideobox, LB_SETTABSTOPS, 1, (LPARAM)tab);
while(address < 0x4000)
{
address += Dumpvideo(ligne, address);
SendMessage(hvideobox, LB_ADDSTRING, 0, (LPARAM)ligne);
}
SendMessage(hvideobox, LB_SETSEL, TRUE, 0);
}
// Run one program step //////////////////////////////////////////////////////
void Stepbystep(HWND hwnd)
{
KillTimer(hwnd, 1);
Run(1);
Registerdisplay(hwnd);
PCdasdisplay(hwnd);
Refreshdisplay();
}
// Copy selected items to clipboard //////////////////////////////////////////
void Copytoclipboard(HWND hlistbox)
{
HGLOBAL hClipboard; // handle for the clipboard data
LPTSTR lpClipboard; // pointer to the clipboard text
int clipmax = 65000; // taille maxi du clipboard
int cliplength; // taille du clipboard
int j, i, imax;
//choix de l'utilisateur
i = MessageBox(NULL, msg_string[M_CLIPBOARD][language],
msg_string[M_ACKNOWLEDGE][language],
MB_OKCANCEL|MB_TOPMOST|MB_ICONWARNING);
if(i == IDCANCEL) return;
//int Prompt(int t, int m);
//if(Prompt(2130, 2260) == IDNO) return;
//Empty clipboard
if(OpenClipboard(hlistbox)) EmptyClipboard();
else{MessageBox(NULL, "OpenClipboard failed", "Error", MB_OK); return;}
//Allocate global memory
if((hClipboard = GlobalAlloc(GMEM_MOVEABLE, clipmax)) == NULL)
{MessageBox(NULL, "GlobalAlloc failed", "Error", MB_OK); return;}
//Lock global memory
if((lpClipboard = GlobalLock(hClipboard)) == NULL)
{MessageBox(NULL, "GlobalLock failed", "Error", MB_OK); return;}
//Copy selected lines
cliplength = 0;
imax = SendMessage(hlistbox, LB_GETCOUNT, 0, 0);
for(i = 0; i < imax; i++)
{
if(!SendMessage(hlistbox, LB_GETSEL, (WPARAM)i, 0)) continue;
SendMessage(hlistbox, LB_GETTEXT, (WPARAM)i, (LPARAM)ligne);
if((cliplength + lstrlen(ligne) + 3) >= clipmax) break;
for(j = 0; j < lstrlen(ligne); j++) if(ligne[j] == 0x09) ligne[j] = 32;
memcpy(lpClipboard + cliplength, ligne, lstrlen(ligne));
cliplength += lstrlen(ligne);
memcpy(lpClipboard + cliplength, "\r\n", 2); //add CR-LF
cliplength += 2;
}
memcpy(lpClipboard + cliplength, "", 1); //end of clipbord text
//send to clipboard
GlobalUnlock(hClipboard);
SetClipboardData(CF_TEXT, hClipboard);
CloseClipboard();
}
// Chargement d'un fichier binaire ////////////////////////////////////////////
void Loadbinaryfile()
{
FILE *fp;
int i, c;
if(Getnewfilename(7) < 0) return;
fp = fopen(filename, "rb");
if(fp == NULL) return;
i = loadaddress;
while((c = getc(fp)) != EOF) WrZ80(i++, c);
fclose(fp);
}
// Initialisation des texte de la boite de dialogue ///////////////////////////
void Initdialogtext(HWND hwnd)
{
SetWindowText(hwnd, msg_string[90][language]);
SetDlgItemText(hwnd, 910, msg_string[91][language]);
SetDlgItemText(hwnd, 928, msg_string[92][language]);
SetDlgItemText(hwnd, 929, msg_string[93][language]);
SetDlgItemText(hwnd, 960, msg_string[94][language]);
SetDlgItemText(hwnd, 970, msg_string[95][language]);
SetDlgItemText(hwnd, 930, msg_string[96][language]);
SetDlgItemText(hwnd, 931, msg_string[97][language]);
SetDlgItemText(hwnd, 933, msg_string[98][language]);
SetDlgItemText(hwnd, 934, msg_string[99][language]);
SetDlgItemText(hwnd, 935, msg_string[100][language]);
SetDlgItemText(hwnd, 936, msg_string[101][language]);
SetDlgItemText(hwnd, 937, msg_string[102][language]);
SetDlgItemText(hwnd, 938, msg_string[103][language]);
SetDlgItemText(hwnd, 940, msg_string[104][language]);
SetDlgItemText(hwnd, 943, msg_string[105][language]);
SetDlgItemText(hwnd, 945, msg_string[107][language]);
SetDlgItemText(hwnd, 946, msg_string[106][language]);
SetDlgItemText(hwnd, 949, msg_string[105][language]);
SetDlgItemText(hwnd, 948, msg_string[108][language]);
SetDlgItemText(hwnd, 951, msg_string[109][language]);
SetDlgItemText(hwnd, 952, msg_string[110][language]);
SetDlgItemText(hwnd, 954, msg_string[111][language]);
SetDlgItemText(hwnd, 956, msg_string[112][language]);
}
// Callback for debug dialog /////////////////////////////////////////////////
INT_PTR CALLBACK DebugDlgProc
(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
HWND hlistbox;
int i;
switch(msg)
{
case WM_INITDIALOG:
pausestatus = pause;
Pause(1); //arret du processeur
breaktype = 2; //pas à pas
Initdialogtext(hwnd);
//font listbox
hfont = CreateFont(14,8,0,0,0,0,0,0,ANSI_CHARSET,0,0,0,0, "Courier New");
hlistbox = FindWindowEx(hwnd, NULL, "LISTBOX", NULL);
SendMessage(hlistbox, WM_SETFONT, (WPARAM)hfont, TRUE);
hlistbox = FindWindowEx(hwnd, hlistbox, "LISTBOX", NULL);
SendMessage(hlistbox, WM_SETFONT, (WPARAM)hfont, TRUE);
hlistbox = FindWindowEx(hwnd, hlistbox, "LISTBOX", NULL);
SendMessage(hlistbox, WM_SETFONT, (WPARAM)hfont, TRUE);
hlistbox = FindWindowEx(hwnd, hlistbox, "LISTBOX", NULL);
SendMessage(hlistbox, WM_SETFONT, (WPARAM)hfont, TRUE);
hlistbox = FindWindowEx(hwnd, hlistbox, "LISTBOX", NULL);
SendMessage(hlistbox, WM_SETFONT, (WPARAM)hfont, TRUE);
//variables
Registerdisplay(hwnd);
PCdasdisplay(hwnd);
BPdisplay(hwnd);
Dasdisplay(hwnd);
return TRUE;
case WM_COMMAND: switch(LOWORD(wParam))
{
case 961: case 971: case 941: case 942: case 959:
if(HIWORD(wParam) == LBN_DBLCLK) Copytoclipboard((HWND)lParam);
break;
case 928: //Confirm change
Registermodify(hwnd);
Registerdisplay(hwnd);
PCdasdisplay(hwnd);
break;
case 929: //Cancel change
Registerdisplay(hwnd);
break;
case 933: //Exec
if(IsDlgButtonChecked(hwnd, 935)) breaktype = 0; //No break
if(IsDlgButtonChecked(hwnd, 936)) breaktype = 1; //Static
if(IsDlgButtonChecked(hwnd, 937)) breaktype = 2; //Next step
if(IsDlgButtonChecked(hwnd, 938)) breaktype = 3; //Step over
GetDlgItemText(hwnd, 932, text, 5);
breakaddress = breakpoint = strtol(text, NULL, 16);
BPdisplay(hwnd); PCdasdisplay(hwnd);
switch(breaktype)
{
case 2: //step by step
Stepbystep(hwnd);
break;
case 3: //step over
//pas d'appel subroutine -> step by step
if(nextbreak < 0) {Stepbystep(hwnd); break;}
//appel de subroutine -> exécution jusqu'à nextbreak
breakpoint = nextbreak;
BPdisplay(hwnd);
SetTimer(hwnd, 1, 100, NULL);
break;
default: //execution jusqu'à breakpoint (si actif)
SetTimer(hwnd, 1, 100, NULL);
break;
}
break;
case 934: //Stop
KillTimer(hwnd, 1);
PCdasdisplay(hwnd);
break;
case 945: //Display
GetDlgItemText(hwnd, 944, text, 5);
dumpaddress = strtol(text, NULL, 16);
Dasdisplay(hwnd);
//{extern int cycle;
// extern char message[];
// sprintf(message, "%d", cycle);
// MessageBox(NULL, message, "Cycle", MB_OK);}
break;
case 948: //Modify
GetDlgItemText(hwnd, 944, text, 5); //Address
dumpaddress = strtol(text, NULL, 16);
GetDlgItemText(hwnd, 947, text, 3); //Value
WrZ80(dumpaddress, strtol(text, NULL, 16));
dumpaddress++;
Dasdisplay(hwnd);
break;
case 951: //Load binary file
GetDlgItemText(hwnd, 950, text, 5);
loadaddress = strtol(text, NULL, 16);
Loadbinaryfile();
break;
case 954: //Load 4Kbytes
GetDlgItemText(hwnd, 950, text, 5);
loadaddress = strtol(text, NULL, 16);
GetDlgItemText(hwnd, 953, text, 3);
loadbyte = strtol(text, NULL, 16);
for(i = 0; i < 0x1000; i++) WrZ80(loadaddress + i, loadbyte);
break;
case IDCANCEL:
//if(OpenClipboard(hwnd)) {EmptyClipboard(); CloseClipboard();}
//DeleteObject(hfont);
if(OpenClipboard(hwnd)) CloseClipboard();
GetDlgItemText(hwnd, 944, text, 5); //Address
dumpaddress = strtol(text, NULL, 16);
GetDlgItemText(hwnd, 950, text, 5);
loadaddress = strtol(text, NULL, 16);
GetDlgItemText(hwnd, 953, text, 3);
loadbyte = strtol(text, NULL, 16);
hwnddebug = NULL;
Pause(pausestatus);
DestroyWindow(hwnd);
break;
}
return TRUE;
case WM_TIMER:
i = 5000;
while(i--)
{
Run(1);
if(breaktype > 0)
if((CPU.PC.W & 0xffff) == (breakpoint & 0xffff))
{KillTimer(hwnd, 1); PCdasdisplay(hwnd); i = 0;}
}
Registerdisplay(hwnd);
return TRUE;
default: return FALSE;
}
}