📄 agdi.cpp
字号:
}
/*
* Read 'nMany' sfr values out of sfr-data space into buffer 'pB'
* return: 0:=Ok, else 'ErrorAddress | (amDATA << 24)'
*/
UL32 ReadSFR (BYTE *pB, DWORD nAdr, DWORD nMany) {
if (CacheValid (pB, nAdr, nMany)) { // use cache, if possible
return (0);
}
//---TODO:
//---if Ok, then return 0, else error-address
// adr |= (amDATA << 24); // make address uVision2 conforming
return (0); // say Ok.
}
/*
* Read 'nMany' bytes out of the xdata space into buffer 'pB'
* return: 0:=Ok, else 'ErrorAddress | (amXDATA << 24)'
*/
UL32 ReadXdata (BYTE *pB, DWORD nAdr, DWORD nMany) {
if (CacheValid (pB, nAdr, nMany)) { // use cache, if possible
return (0);
}
//---TODO:
//---if Ok, then return 0, else error-address
// adr |= (amIDATA << 24); // make address uVision2 conforming
return (0); // say Ok.
}
/*
* Read 'nMany' bytes out of the code space into buffer 'pB'
* return: 0:=Ok, else 'ErrorAddress | (amCODE << 24)'
*/
UL32 ReadCode (BYTE *pB, DWORD nAdr, DWORD nMany) {
if (CacheValid (pB, nAdr, nMany)) { // use cache, if possible
return (0);
}
else {
memset (pB, 0, nMany); // for now, we return 0 bytes (NOP's)
}
//---TODO:
//---if Ok, then return 0, else error-address
// adr |= (amCODE << 24); // make address uVision2 conforming
return (0); // say Ok.
}
/*
* Write 'nMany' bytes of code into target
* return: 0:=Ok, else 'ErrorAddress | (amCODE << 24)'
*/
UL32 WriteCode (BYTE *pB, DWORD nAdr, DWORD nMany) {
//---TODO:
//---if Ok, then return 0, else error-address
// adr |= (amCODE << 24); // make address uVision2 conforming
return (0); // say Ok.
}
/*
* Write 'nMany' bytes of xdata into target
* return: 0:=Ok, else 'ErrorAddress | (amXDATA << 24)'
*/
UL32 WriteXdata (BYTE *pB, DWORD nAdr, DWORD nMany) {
//---TODO:
//---if Ok, then return 0, else error-address
// adr |= (amXDATA << 24); // make address uVision2 conforming
return (0); // say Ok.
}
/*
* Write 'nMany' bytes of idata into target
* return: 0:=Ok, else 'ErrorAddress | (amIDATA << 24)'
*/
UL32 WriteIdata (BYTE *pB, DWORD nAdr, DWORD nMany) {
//---TODO:
//---if Ok, then return 0, else error-address
// adr |= (amIDATA << 24); // make address uVision2 conforming
return (0); // say Ok.
}
/*
* Write 'nMany' bytes of data into target
* return: 0:=Ok, else 'ErrorAddress | (amDATA << 24)'
*/
UL32 WriteData (BYTE *pB, DWORD nAdr, DWORD nMany) {
//---TODO:
//---if Ok, then return 0, else error-address
// adr |= (amDATA << 24); // make address uVision2 conforming
return (0); // say Ok.
}
/*
* Write 'nMany' sfr's to target
* return: 0:=Ok, else 'ErrorAddress | (amDATA << 24)'
*/
UL32 WriteSFR (BYTE *pB, DWORD nAdr, DWORD nMany) {
//---TODO:
//---if Ok, then return 0, else error-address
// adr |= (amDATA << 24); // make address uVision2 conforming
return (0); // say Ok.
}
/*
* Initialize your target communication
* Return 0 if Ok, 1 if failed.
*/
U32 InitTarget (void) {
//---TODO:
return (0); // say 'Ok.'
}
/*
* Target settings have changed (Baudrate or ComPort for example)
* Return 0 if Ok, 1 if failed.
*/
U32 ReInitTarget (void) {
//---TODO: shutdown target
//--- reinit communication with current 'MonConf' values
return (0); // say 'Ok.'
}
/*
* Stop your target communication
* Free all resources (dynamic memory, ...)
*/
void StopTarget (void) {
FreeCache(); // free allocated cache memory.
//---TODO: add code for cleanup
}
/*
* Reset your target. Set PC to whatever required value
*/
void ResetTarget (void) {
//---TODO: add code for target reset
}
/*
* Read PC out of target
*/
UL32 ReadPC (void) {
UL32 nPC;
//---TODO: read PC out of target
nPC = REG51.nPC & 0xFFFF; // we use shadow PC for now...
nPC |= (amCODE << 24); // C:0xnnnn
return (nPC);
}
/*
* Write PC out to target
*/
void WritePC (UL32 nPC) {
//---TODO: write PC to target
REG51.nPC = nPC; // keep in shadow registers
}
/*
* Read all registers out of target and fill the REG51 structure
*/
void GetRegs (void) {
if (RegUpToDate) return; // already up to date
if (iRun) return; // currently executing, can't access
curPC = REG51.nPC = ReadPC();
//---TODO: fetch regs from target and put them into REG51
//---if connection is broken for some reason, then set PlayDead:=1 !
}
/*
* Write all registers to target
*/
void SetRegs (RG51 *pR) {
//--- write pR->Rn[0] ... pR->Rn[7]
//--- write pR->sp, pR->psw, pR->b, pR->acc, pR->dpl, pR->dph, pR->nPC
WritePC (pR->nPC);
REG51 = *pR;
//---if connection is broken for some reason, then set PlayDead:=1 !
}
/*
* Stop execution of user program
*/
U32 StopExec (void) {
if (iRun) { // if currently executing
//---TODO: Stop exec
//---if successful, return (1), else (0)
}
return (1); // 'Stopped'
}
/*
* Invalidate everything which may be invalid after Go or Step
* (Registers, Caches, etc.)
*/
void Invalidate (void) {
RegUpToDate = 0; // invalidate Registers
InvalCache(); // invalidate cached memory
}
/*
* Execute a single instruction, return 1 if ok, else 0
*/
UL32 Step (void) {
return (1);
}
/*
* Start execution. Stop when a Bp is reached
*/
void GoCmd (void) {
}
/*
* Set/Clear Breakpoint at address pB->Adr
*/
int SetClrBp (int set, AG_BP *pB) {
int nR;
nR = 1;
if (set) { // set address break
//---TODO: give target a message about Set-Bp at address 'pB->Adr'
//--- if ok, then return (1), else (0)
// if (failed) {
// MessageBeep (MB_OK);
// txtout ((char *) szNBP, pB->Adr);
// nR = 0;
// }
}
else { // clear address break
//---TODO: give target a message about Clear-Bp at address 'pB->Adr'
//--- if ok, then return (1), else (0)
}
return (nR);
}
/*
*----------- AGDI Basic Functions -----------------
*/
/*
* AGDI-Init Function
*/
U32 _EXPO_ AG_Init (U16 nCode, void *vp) {
U32 nE;
nE = 0;
switch (nCode & 0xFF00) {
case AG_INITFEATURES: // Initialize & start the target
PlayDead = 0; // clear some variables...
//---We don't have special features here, so all variables are cleared.
//---uVision2 will query these features lateron.
//---Note: the 'supp' structure is defined in 'AGDI.H'
supp.MemAccR = 0; // memory-access while running
supp.RegAccR = 0; // register-access while running
supp.hTrace = 0; // trace support
supp.hCover = 0; // code coverage support
supp.hPaLyze = 0; // Performance-Analyzer support
supp.hMemMap = 0; // Memory-Map support
supp.ResetR = 0; // Reset while running support
//---Note: if InitTarget() fails, then set nE=1, else nE=0.
// if 1 is returned, then uVision will cancel using this driver
InitCache(); // init Cache
//----------------------------------------------------------
//--- get a copy of all memory slots from uVision/s8051.dll:
pCbFunc (AG_CB_GETSLOTS, (void *) &mslots[0]);
//----------------------------------------------------------
bootflag = 1;
nE = InitTarget(); // Initialize your target...
bootflag = 0;
if (nE == 0) { // initialization was Ok.
InitRegs(); // define register layout for RegWindow
}
if (nE == 0) { // everything is ok so far
pCbFunc (AG_CB_EXECCMD, "U $\n"); // force disassemble @curPC
}
break;
case AG_INITITEM: // init item
switch (nCode & 0x00FF) {
case AG_INITMENU: // init extension menu
*((DYMENU **) vp) = (DYMENU *) Menu;
break;
case AG_INITEXTDLGUPD: // init modeless extesion dlg update function
*((UC8 **) vp) = (UC8 *) DlgUpdate;
break;
case AG_INITMHANDLEP: // setup ptr to HWND of active modeless dlg
pHwnd = (HWND *) vp;
break;
case AG_INITPHANDLEP: // pointer to parent handle (MainFrame)
hMfrm = (HWND) vp;
break;
case AG_INITINSTHANDLE: // pointer to Agdi-instance handle
hInst = (HMODULE) vp;
break;
case AG_INITBPHEAD: // pointer to head of Bp-List
pBhead = (AG_BP **) vp;
break;
case AG_INITCURPC: // pointer to program counter
pCURPC = (UL32 *) vp;
break;
case AG_INITDOEVENTS: // DoEvents function pointer
//--- this is no longer relevant due to uVision's threading.
break;
case AG_INITUSRMSG: // Registered Message for SendMessage
Uv2Msg = (DWORD) vp; // (Serial-Window, TextOut messages)
break;
case AG_INITCALLBACK: // pointer to callback function
pCbFunc = (pCBF) vp; // call-back function of s166
break;
}
break;
case AG_GETFEATURE: // uVision2 want's details about features...
switch (nCode & 0x00FF) {
case AG_F_MEMACCR: nE = supp.MemAccR; break;
case AG_F_REGACCR: nE = supp.RegAccR; break;
case AG_F_TRACE: nE = supp.hTrace; break;
case AG_F_COVERAGE: nE = supp.hCover; break;
case AG_F_PALYZE: nE = supp.hPaLyze; break;
case AG_F_MEMMAP: nE = supp.hMemMap; break;
case AG_F_RESETR: nE = supp.ResetR; break;
}
break;
case AG_EXECITEM: // execute various commands
switch (nCode & 0x00FF) {
case AG_UNINIT: // Clean up target system settings
PlayDead = 1; // mark target as disconnected.
CloseAllDlg(); // close all open dialogs
StopTarget(); // shutdown target & communication
WriteMonParms (pdbg->TargArgs); // update argument string
break;
case AG_RESET: // perform a reset on the target system
if (PlayDead || hMfrm == NULL) break; // target is disconnected
ResetTarget(); // reset the target
pCbFunc (AG_CB_EXECCMD, "U $\n"); // dasm $
break;
}
break;
}
if (PlayDead) { // driver is disconnected
StopTarget(); // shut down driver
PostMessage (hMfrm, Uv2Msg, MSG_UV2_TERMINATE, 0); // unload this driver
}
return (nE);
}
/*
* Memory Interface functions
*/
static DWORD ReadMem (DWORD nAdr, BYTE *pB, DWORD nMany) {
DWORD n1, n, ErrAdr;
DWORD nA, nM;
BYTE *p1;
nA = nAdr; // save values for caching...
p1 = pB;
nM = nMany;
while (nMany != 0) {
n = (nMany > 256) ? 256 : nMany;
nMany -= n;
switch (nAdr >> 24) { // extract mSpace from address.
case amDATA:
if ((nAdr & 0xFF) >= 0x80) { // Sfr-area: D:0x80...D:0xFF
if (((nAdr & 0xFF) + n) > 0x100) n1 = 0x100 - (nAdr & 0xFF);
else n1 = n;
ErrAdr = ReadSFR (pB, nAdr & 0xFF0000FF, n1);
}
else { // Data-area: D:0x00...D:0x7F
if (((nAdr & 0xFF) + n) > 0x100) n1 = 0x100 - (nAdr & 0xFF);
else n1 = n;
ErrAdr = ReadData (pB, nAdr & 0xFF0000FF, n1);
}
break;
case amIDATA: // Idata
if (((nAdr & 0xFF) + n) > 0x100) n1 = 0x100 - (nAdr & 0xFF);
else n1 = n;
ErrAdr = ReadIdata (pB, nAdr & 0xFF0000FF, n1);
break;
case amXDATA: // Xdata
case amPDATA:
ErrAdr = ReadXdata (pB, nAdr, n);
break;
// case amCODE: // Code
default: // anything else assumed to be c-address
ErrAdr = ReadCode (pB, nAdr, n);
break;
}
pB += n;
nAdr += n;
}
#if 0 // Remove '#if 0' if Memory interface is running...
if (ErrAdr == 0) { // read was Ok.
CacheData (p1, nA, nM); // put write data into cache
}
else { // write failed...
ClearCaR (nA, nM); // invalidate cache range
}
#endif
return (ErrAdr);
}
static DWORD WriteMem (DWORD nAdr, BYTE *pB, DWORD nMany) {
DWORD n1, n, ErrAdr;
BYTE *p1;
DWORD nA, nM;
nA = nAdr; // save values for caching...
p1 = pB;
nM = nMany;
n = nAdr >> 24;
if (n == amDATA || n == amIDATA) { // write to data/idata
if ((nAdr & 0xFF) < 0x20) { // register bank area
RegUpToDate = 0; // regs might be written...
}
}
while (nMany != 0) {
n = (nMany > 256) ? 256 : nMany;
nMany -= n;
switch (nAdr >> 24) {
case amDATA:
if ((nAdr & 0xFF) >= 0x80) {
if (((nAdr & 0xFF) + n) > 0x100) n1 = 0x100 - (nAdr & 0xFF);
else n1 = n;
ErrAdr = WriteSFR (pB, nAdr & 0xFF0000FF, n1);
}
else {
if (((nAdr & 0xFF) + n) > 0x100) n1 = 0x100 - (nAdr & 0xFF);
else n1 = n;
ErrAdr = WriteData (pB, nAdr & 0xFF0000FF, n1);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -