#ifndef __AGDI__INCED___
#define __AGDI__INCED___
//---Revision History: ----------------------------------------------
// 17.10.2000, added AG_SYM_SFR
//
//-------------------------------------------------------------------
#ifdef __cplusplus
extern "C" {
#endif
#include <Windows.h>
// wg. HWND, RECT, CALLBACK, HANDLE
#define _EXPO_ __declspec(dllexport)
/*
* Advanced GDI types
*/
typedef unsigned long UL32;
typedef signed long SL32;
typedef signed char SC8;
typedef unsigned char UC8;
typedef signed int I32;
typedef unsigned int U32;
typedef signed short int I16;
typedef unsigned short int U16;
typedef __int64 I64;
typedef unsigned __int64 U64;
typedef float F32;
typedef double F64;
typedef union {
U32 u32; // 32-Bit signed int
I32 i32;
// 32-Bit unsigned int
UL32 ul;
// 32-Bit unsigned long
SL32 sl;
// 32-Bit signed long
UC8 uc;
// 8-Bit unsigned char
SC8 sc;
// 8-Bit signed char
U16 u16;
// 16-Bit unsigned short int
I16 i16;
// 16-Bit signed short int
U64 u64;
// 64-Bit unsigned int
I64 i64;
// 64-Bit signed int
F32 f32;
// 32-Bit single precision float
F64 f64;
// 64-Bit single precision float
UL32 ul2 [
2];
SL32 sl2 [2];
U16 u16a [4];
I16 i16a [4];
UC8 uc8 [8];
SC8 sc8 [8];
SC8 *
pS;
UC8 *
pU;
U16 *
pW;
U32 *
pD;
} GVAL;
/*
* 166/167 specific's
*/
#define mWREG 0x100
// 0x100...0x10F := R0...R15
#define mBREG 0x200
// 0x200...0x20F := RL0...RH7
#define mDREG 0x300
// not used.
#define mDPP 0x400
// 0x400...0x403 := DPP0...DPP3
#define mPC 0x500
// PC
#define mPSW 0x600
// PSW
#define mSP 0x700
// SP
#define mCP 0x800
// CP
#define mCYC 0x900
// Cycles value
#define mEPTR 0xA00
#pragma pack(1)
typedef struct {
union {
U16 wregs [16];
// R0 ... R15
UC8 bregs [
16];
// RL0 ... RH7
} r;
U32 Ndpp[4];
// full linear base address values
U32 nPC;
// full address !
U16 cPsw;
// current Psw
U16 cSP;
U16 cMDL; // MDL
U16 cMDH;
// MDH
U32 cCP;
// CP
I64 nCycles;
// cycle counter (or time ???)
INT64 macc; // 40-Bit value
U16 mah;
// MAH MAC-Unit Accumulator High
U16 mal;
// MAL MAC-Unit Accumulator Low
U16 mas;
// MAS limited MAH/signed
U16 msw;
// MSW MAC-Unit Status Word
U16 mcw;
// MCW MAC-Unit Control Word
U16 mrw;
// MRW MAC-Unit Repeat Word
U16 idx0;
U16 idx1;
U16 qx0;
U16 qx1;
U16 qr0;
U16 qr1;
} RG166;
/*
* Sle66+ specific's
*/
#define nnR0 0x00
// R0
#define nnR1 0x01
// R1
#define nnR2 0x02
// R2
#define nnR3 0x03
// R3
#define nnR4 0x04
// R4
#define nnR5 0x05
// R5
#define nnR6 0x06
// R6
#define nnR7 0x07
// R7
//#define niR0 0x10 // @R0
//#define niR1 0x11 // @R1
//#define nrAB 0x12 // AB
#define nrCY 0x13
// C
#define nrA 0x14
// A
#define nrDPTR 0x18
// DPTR
#define nnPR0 0x1C
// PR0 (80C51MX)
#define nnPR1 0x1D
// PR1 (80C51MX)
typedef struct {
// iMCS51 - SLE66Cxx Registers
UL32 nPC;
I64 nCycles; // cycle counter
UC8 psw;
UC8 sp;
UC8 b;
UC8 acc;
UC8 dpl;
UC8 dph;
UC8 bregs [8];
UC8 dpsel;
UC8 adrxh; // page for MOVX @Ri
U16 dptx [
8];
// DPTR save area
} RGSLE66;
typedef struct {
// iMCS51-Registers
BYTE Rn [
16];
// R0 ... R7
DWORD nPC;
// full address !
BYTE sp;
// SP
BYTE psw;
// PSW-sfr
BYTE b;
// B-sfr
BYTE acc;
// ACC-sfr
BYTE dpl;
// DPL-sfr
BYTE dph;
// DPH-sfr
BYTE ports[
8];
I64 nCycles; // cycle counter
} RG51;
typedef struct {
// iMCSARM Registers
DWORD cur[
16];
// Current Mode: R0..R15(PC)
DWORD cpsr;
// CPSR
DWORD spsr;
// Current SPSR
DWORD usr[
7];
// User & System: R8..R14
DWORD fiq[
8];
// Fast Interrupt: R8..R14, SPSR
DWORD irq[
3];
// Interrupt: R13,R14, SPSR
DWORD svc[
3];
// Supervisor: R13,R14, SPSR
DWORD abt[
3];
// Abort: R13,R14, SPSR
DWORD und[
3];
// Undefined: R13,R14, SPSR
INT64 nCycles;
// cycle counter
} RgARM ;
typedef struct {
// SmartMX-Registers
BYTE Rn [
32];
// 7F:0000 .. 7F:001F (D:0 .. D:1F)
BYTE acc, pcl, pch, pcx, psw, pswh;
// System Mode Registers
BYTE s_B, s_EPL, s_EPM, s_EPH, s_DPL0, s_DPH0;
BYTE s_DPL1, s_DPH1, s_MXCON, s_AUXR1, s_XRAMP;
BYTE s_SP, s_SPE, s_SPLOW,s_SPELOW,s_SPHIGH,s_SPEHIGH;
//User Context Registers
BYTE u_B, u_EPL, u_EPM, u_EPH, u_DPL0, u_DPH0;
BYTE u_DPL1, u_DPH1, u_MXCON, u_AUXR1, u_XRAMP;
BYTE u_SP, u_SPE, u_SPLOW,u_SPELOW,u_SPHIGH,u_SPEHIGH;
// Physical PC Value
BYTE YPCL, YPCH, YPCX;
BYTE MMUCTRL;
BYTE MMUPTRL, MMUPTRM, MMUPTRH;
} RGSMX;
#pragma pack()
#pragma pack(1)
#define RGROUP struct rGroup
#define RITEM struct rItem
#define REGDSC struct RegDsc
struct rGroup {
// Register Group Descriptor
UC8 desc;
// always 0x00
UC8 ShEx;
// Bit.0 = 1 Show Group initially expanded
// Bit.1 = 1 Show Group description 'bold'
char *name;
// Group name
};
struct rItem {
// Register Item Descriptor
UC8 desc;
// always 0x01
U16 nGi;
// Group-Index (0...nGroups-1)
U16 nItem;
// Item indicator
char szReg[
16];
// Name of Register
UC8 isPC;
// is this the PC
UC8 canChg;
// can this Reg be changed in Reg-Window
UC8 iHigh;
// highlight the value
UC8 iDraw;
// item needs to be repainted
char szVal[
32];
// it's value in Ascii
GVAL v;
// it's binary item value
};
struct RegDsc {
I32 nGitems; // number of group items
I32 nRitems;
// number of register items
RGROUP *GrpArr;
// array of group descriptors
RITEM *RegArr;
// array of register descriptors
void (*RegGet) (RITEM *vp,
int nR);
// get RegItem's value
I32 (*RegSet) (RITEM *vp, GVAL *pV);
// set RegItem's value
};
#pragma pack()
#define UPR_NORMAL 0x80000000
// update normal registers
#define UPR_HIST 0x40000000
// update history registers
/*
* Advanced GDI Functions
*/
/*
* Error codes
*/
#define AG_OK 0
// Ok.
#define AG_NOACCESS 1
// Cannot access while running.
#define AG_RDFAILED 2
// memory read failed.
#define AG_INVALOP 3
// invalid operation code
#define AG_RO 4
// attempt to write Read-only item
#define AG_WRFAILED 5
// memory write failed.
#define AG_CANTMAP 6
// cannot map memory
/*
* 80x51 + Sle66(+) memory spaces, added 12/19/99
*/
#define amNONE 0x0000
// not spaced
#define amXDATA 0x0001
// XDATA
#define amBANK0 0x0080
// BANK0
#define amBANK31 0x009F
// BANK31
#define amDATA 0x00F0
// DATA
#define amBIT 0x00F1
// BIT
#define amEDATA 0x00F2
// EDATA (i251)
#define amIDATA 0x00F3
// IDATA
#define amECODE 0x00F4
// 251 ecode
#define amHDATA 0x00F5
// 251 hdata
#define amHCONS 0x00F6
// 251 hconst
#define amCONST 0x00F7
// 251 const
#define amPDATA 0x00FE
// PDATA (c51 macht das bei generic)
#define amCODE 0x00FF
// CODE
#define amPHYS 0x0100
// Physical SLE66+ Memory
#define amPHLIM 0x0110
// 1MB Physical Memory
#define amYMEM 0x0040
// Mifare ProX Y: (physical code 1MB)
#define amZMEM 0x0041
// Mifare ProX Z: (physical xdata)
#define amSMEM 0x0042
// Mifare ProX S: (physical sfr)
#define amU1MEM 0x00F8
// UsrMem #1 (E2-PROM)
#define amU2MEM 0x00F9
// UsrMem #2 (reserved for future use)
#define amU3MEM 0x00FA
// UsrMem #3 (reserved for future use)
#define amU4MEM 0x00FB
// UsrMem #4 (reserved for future use)
#define amU5MEM 0x00FC
// UsrMem #5 (reserved for future use)
#define mmU6MEM 0x00FD
// UsrMem #6 (reserved for future use)
/*
* Features
*/
typedef struct {
U32 MemAccR : 1;
// memory-access while running supported
U32 RegAccR :
1;
// register-access while running supported
U32 hTrace :
1;
// trace-recording supported
U32 hCover :
1;
// code coverage supported
U32 hPaLyze :
1;
// Performance-Analyzer support
U32 hMemMap :
1;
// Memory-Map support
U32 ResetR :
1;
// Reset possible while running
U32 ExtBrk :
1;
// OCDS/JTAG: Break in EXTx allowed /10.3.2003/
U32 LaSupp :
1;
// Logic-Analyzer supported
} SUPP;
#pragma pack(1)
typedef struct {
UL32 Adr; // linear address
UL32 ErrAdr;
// memory access failed address
UL32 nLen;
// address range, used for memory-map
U16 mSpace;
// memory space (not used on 166/167)
} GADR;
typedef struct {
// Assemble/Disassemble
UL32 Adr;
// linear address
UC8 Opc [
8];
// 167 needs max. 4 Opcode bytes
I32 OpcLen;
// Result length in assemble mode
SC8 szB [
256];
// DisAsm-result or Asm-input line
I32 Result;
// 0:=Ok, otherwise error
} DAAS;
typedef struct {
// 11.1.2005, DisAssemble Mixed-Mode into File
UL32 nStart;
// Start-Address for disassemble
UL32 nEnd;
// Stop-Address for disassemble
I32 Result;
// 0:=Ok, 1:=can't create file, 2:=file write error
I32 nMode;
// 0:=Asm-Mode, 1:=Mixed-Mode
UL32 nRes[
8];
// reserved
char szN [
300];
// name of file to create and write disassembly
} DAS_MIXED;
typedef struct {
// Memory-Range descriptor
UC8 mTyp;
// 0=RAM, 1=ROM
UL32 nStart;
// Memory start address
UL32 nSize;
// Size of memory block (0=unused)
} OCM;
typedef struct {
// 166/167 Device Info
UC8 Vendor [
64];
// Device-Vendor: example 'Siemens'
UC8 Device [
64];
// Device-Name: example 'C167CR-16FM'
UL32 Clock;
// clock frequency
UC8 RestoreBp;
// 1 := restore Breakpoints
UC8 Rtos;
// OS: 0:=none, 1:=RtxTiny, 2:=RtxFull
UC8 Mod167;
// 0:=166-Instr. Set 1:=167-Instr Set
UC8 useOnChipRom;
// 1:=use on chip Rom
UC8 useOnChipXper;
// 1:=use on chip X-peripherals (XRAM+CAN)
UC8 useMAC;
// 0:=no MACC, 1:=MACC instr. used
OCM ExtMem[6];
// up to 6 external memory ranges
OCM Ican;
// address range of on-chip CAN
OCM Irom;
// address range of on-chip internal Rom
OCM Xram1;
// address range of on-chip internal Xram
OCM Xram2;
// address range of on-chip internal Xram
OCM Iram;
// address range of on-chip internal Ram
UC8 PrjPath [260];
// path of project
UC8 AppName [
260];
// path and name of loaded application
} DEV_X66;
#pragma pack()
/*
* Symbol search masks (may be combined using |) :
*/
#define AG_SYM_VAR 0x0001
// search for non-bit Variables
#define AG_SYM_CON 0x0002
// search for named Constants
#define AG_SYM_BIT 0x0004
// search for Bit in Memory
#define AG_SYM_LOC 0x0008
// search for Function/Label
#define AG_SYM_SFR 0x0200
// search for SFR name
/*
* Type of found symbol:
*/
#define AG_TP_VOID 0
#define AG_TP_BIT 1
#define AG_TP_CHAR 2
#define AG_TP_UCHAR 3
#define AG_TP_INT 4
#define AG_TP_UINT 5
#define AG_TP_SHORT 6
#define AG_TP_USHORT 7
#define AG_TP_LONG 8
#define AG_TP_ULONG 9
#define AG_TP_FLOAT 10
#define AG_TP_DOUBLE 11
#define AG_TP_PTR 12
#define AG_TP_UNION 13
#define AG_TP_STRUCT 14
#define AG_TP_FUNC 15
#define AG_TP_STRING 16
#define AG_TP_ENUM 17
#define AG_TP_FIELD 18
#pragma pack(1)
typedef struct {
// Search for Sym by Name or Value.
UL32 nMask;
// search mask (AG_SYM_LOC | ...)
UC8 szName [
256];
// search/found name (zero-terminated
U64 val;
// search/found Adr/Value
UL32 type;
// type of found symbol (AG_TP_???)
UL32 Ok;
// 1:=Ok, else find failed.
} SYMDSC;
#pragma pack()
/*
* Progress-Control Structure
*/
#define PROGRESS_INIT 1
#define PROGRESS_KILL 2
#define PROGRESS_SETPOS 3
#define PROGRESS_INITTXT 4
// 15.3.2003, init progress in text mode
#define PROGRESS_SETTEXT 5
// =========
#pragma pack(1)
typedef struct PgRess {
// Progress-Setup and Control structure
I32 Job;
// PROGRESS_INIT/KILL/SETPOS
I32 pos;
// PROGRESS_SETPOS: position to set
I32 low;
// low percent (normally 0)
I32 hig;
// high percent (normally 100)
SC8 *label;
// text-label before progress-bar or NULL
SC8 *ctext;
// 15.3.2003, Text instead of % display
} OIL;
#pragma pack()
/*
* Flash-Parameter-Block, used in AG_CB_GETFLASHPARAM CallBack
*/
#pragma pack(1)
typedef struct FlashBlock {
UL32 start; // Start-Address
UL32 many;
// Number of Bytes
UC8 *image;
// Content
UL32 ActSize;
// total number of bytes
UL32 Stop :
1;
// cancel FlashDownLoad
UL32 Res [
16];
// reserved, unused
} FLASHPARM;
#pragma pack()
/*
* Init/Query Target features
*/
#define AG_INITFEATURES 0x0100
// Init target features
#define AG_GETFEATURE 0x0200
// extract a single feature
#define AG_INITITEM 0x0300
// Init item
#define AG_EXECITEM 0x0400
// Execute item
/*
* Supported Target Features:
*/
#define AG_F_MEMACCR 0x0001
// memory-access while running
#define AG_F_REGACCR 0x0002
// register-access while running
#define AG_F_TRACE 0x0003
// back-trace support
#define AG_F_COVERAGE 0x0004
// code-coverage support
#define AG_F_PALYZE 0x0005
// Performance-Analyzer support
#define AG_F_MEMMAP 0x0006
// Memory-Map support
#define AG_F_RESETR 0x0007
// Reset while running possible feature
#define AG_F_251MODE 0x0008
// 251: get mode (SRC_MODE/BIN_MODE)
#define AG_F_251FRMSZ 0x0009
// 251: get framesize (FRM_SIZE2/4)
#define AG_F_251CPU 0x000A
// 251: get CPU type (CPU_251/CPU_51)
#define AG_F_16XBIE 0x000B
// 167: brk within EXTx-Sequ allowed
// ret: 1:=yes, 0:=no
#define AG_F_LANALYZER 0x000C
// Logic-Analyzer support
/*
* Connection and Communication Items used for 'AG_INITITEM':
*/
#define AG_INITMENU 0x0007
// init extension menu
#define AG_INITEXTDLGUPD 0x0008
// init modeless extesion dlg update function
#define AG_INITMHANDLEP 0x0009
// setup ptr to HWND of active modeless dlg
#define AG_INITPHANDLEP 0x000A
// pointer to parent handle (MainFrame)
#define AG_INITINSTHANDLE 0x000B
// pointer to Agdi-instance handle
#define AG_INITBPHEAD 0x000E
// pointer to Bp-head
#define AG_INITCURPC 0x000F
// pointer to Program counter
#define AG_INITDOEVENTS 0x0010
// pointer do DoEvents()
#define AG_INITUSRMSG 0x0011
// Registered Message for SendMessage
#define AG_INITCALLBACK 0x0012
// pointer to callback function
//---19.7.2002: added for Flash DownLoad:
#define AG_INITFLASHLOAD 0x0013
// Prepare for Flash Download
#define AG_STARTFLASHLOAD 0x0014
// Start Flash DownLoad
//---2.11.2004: added for Hitex-AGDI:
#define AG_INITCWINAPP 0x0020
// sent Item is 'CWinApp *'
#define AG_INITSTARTLOAD 0x0021
// 'Load about to start' (item := 'LOADPARMS *')
#define AG_INITENDLOAD 0x0022
// 'Load finished' (item := NULL)
/*
* AG_EXECITEM items:
*/
#define AG_UNINIT 0x000C
// Clean up target
#define AG_RESET 0x000D
// Reset target system
#define AG_GETMODE 0x000E
// for S8051.DLL: Get Dallas Contigious Mode
//---26.10.2000: added for Hitex Emulators:
#define AG_RUNSTART 0x0010
// Announcement: Go/Step about to start
#define AG_RUNSTOP 0x0011
// : Go/Step completed.
#define AG_QUERY_LASIG 0x0012
// 27.1.2005
#define AG_KILLED_LASIG 0x0013
// 27.1.2005
//---
typedef struct agdi_la {
// Query LA-Signal /27.1.2005/
struct agdi_la *
next;
U64 nAdr; // LA-Signal: memory address
U64 nSize;
// LA-Signal: size of analyzed item in Bytes
GVAL v;
// value
U32 SigNo;
// internal LA signal number (don't change)
U32 killed;
//
U32 nRes[
16];
// reserved
char szDname[
128];
// Signal's display name
char szExp[
128];
// the expr.-text: LA CREATE <expr>
char szError[
256];
// Error-Text
} AGDI_LA;
typedef struct {
// Write-Data-Record
I64 tStamp;
// Time-Stamp of write
I64 totTime;
// total running time
U64 nPC;
// PC-value at time of write
U64 nAdr;
// Write-Address
GVAL v;
// Write-value @nAdr
U32 wType;
// 1:=Byte, 2:=W16, 4=U32, 8=U64
U32 SigNo;
// LASIG-Number (1...255)
U32 nRes[
16];
// reserved
} AGDI_LAREC;
//---TODO: define - tStamp/totTime uSec or cycles ???
/*
* Errors returned from AG_QUERY_LASIG:
*/
#define AGDI_LA_OK 1
// LA-Signal was accepted by target
#define AGDI_LA_NOTSUPPORTED (-10)
// LA-Sig Address-Range not accepted
/*
* 26.1.2005, Info given on AG_INITSTARTLOAD: (see example dated /26.1.2005/ in this file)
*/
typedef struct {
char szFile [
512];
// full path name of App to load
BYTE Incremental;
// 1:=incremental load
BYTE NoCode;
// 1:=no code
BYTE Reserved[
32];
} LOADPARMS;
#pragma pack(1)
typedef struct ag_line {
U16 line;
UL32 addr;
} AG_LINE;
typedef struct ag_scope {
DWORD AddrIn; // Input: Address to be mapped to Scope
// Output values:
const char *pModule;
// name of Module
const char *pFunc;
// name of Function
DWORD lowPC; // Scope-Block lower bound
DWORD higPC;
// Scope-Block upper bound
DWORD nLines;
// number of lines
DWORD curLine;
// current line (or 0 if none)
AG_LINE *pLines;
// Line-Number Array
char szPath[
512];
// full path name of source file
DWORD nRes[32];
// reserved
} AG_SCOPE;
typedef struct ag_block {
// App/Module/Func Enumeration
char const *pApp;
// App-Name (wg. incremental load)
char const *pModule;
// Module-Name
char const *pFunc;
// Function-Name
UL32 lowPC;
// Function starts at 'lowPC'
UL32 higPC;
// and extends up to and including 'higPC'
// ***DO NOT MODIFY these:
void *pA;
// internal reserved data /App/
void *pT;
// internal reserved data /Theadr/
void *pF;
// internal reserved data /Func/
UL32 m1:
1;
} AG_BLOCK;
#pragma pack()
/*
* Call-Back-Function in S166 and supported sub-functions
*/
typedef U32 (*pCBF) (U32 nCode,
void *
vp);
#define AG_CB_TRUEXPR 1
// vp := 'EXP *' (use for Bp->ep)
#define AG_CB_PROGRESS 2
// vp := 'struct PgRess *'
#define AG_CB_INITREGV 3
// vp := 'REGDSC *' (into RegView)
#define AG_CB_EXECCMD 4
// vp := 'char *' command string
#define AG_CB_FORCEUPDATE 5
// vp := NULL, force general windows update
#define AG_CB_DISASM 6
// vp := 'DAAS *', disasm opcodes
#define AG_CB_INLASM 7
// vp := 'DAAS *', assemble szB[] into Opc[]
#define AG_CB_MSGSTRING 8
// vp := 'char *' text for message pane
#define AG_CB_GETDEVINFO 9
// vp := 'DEV_X66 *', get device info
#define AG_CB_SYMBYVAL 10
// vp := 'SYMDESC *', find symbol by value
#define AG_CB_SYMBYNAME 11
// vp := 'SYMDESC *', find symbol by name
#define AG_CB_SLE66MM 12
// vp := &slots[0] out of [512]
#define AG_CB_PHYS2MMU 13
// vp := (void *) ((DWORD) physAdr)
#define AG_CB_MMU2PHYS 14
// vp := (void *) ((DWORD) logicalAdr)
#define AG_CB_GETFLASHPARAM 15
// vp := (FLASHPARM *) or NULL
#define AG_CB_GETBOMPTR 16
// vp := &ioc /5.3.2003/
// Note: special callback for DTC-Messaging
#define AG_CB_DCTMSG_WRITE 17
// vp := write-access address
#define AG_CB_DISASM_EXT 18
// vp := 'DAS_MIXED *', disasm to file
#define AG_CB_LAREC_DATA 19
// vp := 'AGDI_LAREC *', send data-record to Logic-Analyzer
#define AG_CB_SHUTDOWN 20
//
#define AG_CB_GETSCOPEINFO 21
// vp := 'AG_SCOPE *', get Scope Info
#define AG_CB_ENUMFUNCTIONS 22
// vp := 'AG_BLOCK *'. enumerate App/Modules/Functions
#ifdef _IN_TARG_ // define if used in Mon166,Emu...
extern _EXPO_ U32 AG_Init (U16 nCode,
void *
vp);
#else // S166
extern U32 (*AG_Init) (U16 nCode,
void *
vp);
#endif
/*
* Memory attributes
*/
#define AG_ATR_EXEC 0x01
// 'executable ' Attribute
#define AG_ATR_READ 0x02
// 'readable' Attribute
#define AG_ATR_WRITE 0x04
// 'writable' Attribute
#define AG_ATR_BREAK 0x08
// 'Exec-Break' Attribute
#define AG_ATR_EXECD 0x10
// 'Executed' Attribute
#define AG_ATR_WATCH 0x20
// Location has a Watch
#define AG_ATR_BPDIS 0x40
// 'disabled Exec-Break' Attribute
#define AG_ATR_PAP 0x80
// Location has a Perf.-Analyzer point
#define AG_ATR_WRBRK 0x100
// Loc has a write-access break
#define AG_ATR_RDBRK 0x200
// Loc has a read-access break
#define AG_ATR_COMC 0x400
// iMCS51/251: Common code marker
#define AG_ATR_VNM 0x800
// iMCS51: von Neumann mapped
#define AG_ATR_BEP 0x1000
// iMCS51: Bank-Entry Point
#define AG_ATR_EXTR 0x2000
// 166/167: within range of an EXTR sequence
#define AG_ATR_JTAKEN 0x4000
// Jump-taken attribute
/*
* ARM-specific attributes:
*/
#define AG_ATR_THUMB 0x00000080
// 'Thumb' code
#define AG_ATR_ARM 0x00008000
// 'ARM' code
#define AG_ATR_NOINST 0x00080000
// 'No instruction' Attribute
#define AG_MEMMAP 0x01
// map memory
#define AG_GETMEMATT 0x02
// get memory attribute
#define AG_SETMEMATT 0x03
// set memory attribute
#ifdef _IN_TARG_ // define if used in Mon166,Emu...
extern _EXPO_ U32 AG_MemAtt (U16 nCode, UL32 nAttr, GADR *
pA);
#else
extern U32 (*AG_MemAtt) (U16 nCode, UL32 nAttr, GADR *
pA);
#endif
/*
* Breakpoint query and access
*/
#define AG_ABREAK 0
// simple code address break
#define AG_CBREAK 1
// conditional break (check after each instr.)
#define AG_WBREAK 2
// data access break
#define AG_RBREAK 3
// Address-Range Break (currently not used)
#pragma pack(1)
struct AG_Bps {
struct AG_Bps *
next;
struct AG_Bps *
prev;
UL32 type : 4;
// ABREAK, CBREAK, WBREAK
UL32 enabled :
1;
// 1:=enabled, 0:=disabled
UL32 ReCalc :
1;
// recalc expr flag
UL32 BytObj :
1;
// WatchBrk: 0:=Bytes, 1:=Objects
UL32 Adr; // Address (or Range)
UL32 mSpace;
// memory-space
void *pV;
// used on VTR-access breakpoints
UL32 tsize; // WatchBrk: size of one object
UL32 many;
// WatchBrk: many objects or bytes
U16 acc;
// WatchBrk: 1:=Read, 2:=Write, 3:=ReadWrite
U16 BitPos;
// currently not used
UL32 number;
// BreakPoint-Number
I32 rcount;
// Break is taken when rcount = 1
I32 ocount; // Original Count
void *ep;
// conditional-Expression
char *cmd;
// Exec-Command
char *Line;
// Breakpoint-Expression Line for Display
char *pF;
// module file name
UL32 nLine;
// line number
UC8 Opc[
8];
// Opcode-Save Area for Monitors
};
#pragma pack()
#define AG_BP struct AG_Bps
#define AG_BPQUERY 0x01
#define AG_BPTOGGLE 0x02
// not sent to target
#define AG_BPINSREM 0x03
// not sent to target
#define AG_BPACTIVATE 0x04
// not sent to target
#define AG_BPDISALL 0x05
// Notification: all Bp's have been disabled
#define AG_BPKILLALL 0x06
// Notification: all Bp's have been killed
#define AG_BPEXQUERY 0x07
#define AG_CADRVALID 0x10
// Is code address valid ?
// added these /8.2.99/
#define AG_BPENABLE 0x08
// Notification: Enable Bp at address
#define AG_BPDISABLE 0x09
// Notification: Disable Bp at address
#define AG_BPKILL 0x0A
// Notification: Kill Bp at address
#define AG_BPSET 0x0B
// Notification: Set Bp at address
#ifdef _IN_TARG_ // define if used in Mon166,Emu...
extern _EXPO_ U32 AG_BpInfo (U16 nCode,
void *
vp);
extern _EXPO_ AG_BP *AG_BreakFunc (U16 nCode, U16 n1, GADR *pA, AG_BP *
pB);
#else
extern U32 (*AG_BpInfo) (U16 nCode,
void *
vp);
extern AG_BP *(*AG_BreakFunc) (U16 nCode, U16 n1, GADR *pA, AG_BP *
pB);
#endif
/*
* AG_BP *AG_BreakFunc (U16 nCode, U16 n1, GADR *pA, AG_BP *pB);
* nCode := AG_BPQUERY, AG_BPINSREM, ...
* n1 :=
*/
/*
* Go/Step function
*/
#define AG_STOPRUN 0x01
// force target to stop Go/Step.
#define AG_NSTEP 0x02
// exteute 'n' steps
#define AG_GOTILADR 0x03
// go til address
#define AG_GOFORBRK 0x04
// go forever or some Bp fires
#ifdef _IN_TARG_ // define if used in Mon166,Emu...
extern _EXPO_ U32 AG_GoStep (U16 nCode, U32 nSteps, GADR *
pA);
#else
extern U32 (*AG_GoStep) (U16 nCode, U32 nSteps, GADR *
pA);
#endif
/*
* Serial-Window I/O (thread-safe)
*/
struct SerAS {
DWORD n1;
DWORD n2;
DWORD n3;
DWORD n4;
GVAL v;
};
#define AG_SERBOUT 0x01
// write nMany bytes to Serial #1 Window
#define AG_SERWOUT 0x02
// write nMany words to Serial #1 Window
#define AG_SERXIN 0x03
// Key was pressed in Serial Window #1 or #2
#ifdef _IN_TARG_ // define if used in Mon166,Emu...
extern _EXPO_ U32 AG_Serial (U16 nCode, U32 nSerNo, U32 nMany,
void *
vp);
// nCode := AG_SER?OUT / AG_SERXIN
// nSerNo: 0:=Serial #1, 1:=Serial #2
// nMany: number of items
// vp: pointer to items (UC8 or U16)
#else
extern U32 (*AG_Serial) (U16 nCode, U32 nSerNo, U32 nMany,
void *
vp);
#endif
/*
* Register and Memory access functions
*/
#define AG_READ 0x01
// read operation
#define AG_WRITE 0x02
// write operation
#define AG_WROPC 0x03
// write opcodes
#define AG_RDOPC 0x04
// read opcodes
#define AG_RDMMU66 0x05
// 19.12.99, read Sle66 MMU content
#define AG_WRMMU66 0x06
// 19.12.99, write single Sle66 MMU-Descr.
#define AG_RCRC 0x07
// Sle66 read CRC
#define AG_RDSHIELD 0x08
// Sle66 read Shield
#define AG_RDACE 0x09
// Sle66 read ACE
//--- 8.7.2002: added for flash download, otherwise like 'AG_WRITE'
#define AG_F_WRITE 0x0A
// Write to Flash memory (download)
#define AG_F_VERIFY 0x0B
// Verify FLash Memory
#define AG_F_ERASE 0x0C
// Erase Flash
#define AG_F_RUN 0x0D
// Start flashed App.
//---2.4.2003: added for SmartMX Peripheral Access
#define AG_RD_XDES 0x10
// MXP: read DES (16 Bytes)
#define AG_RD_XAES 0x11
// MXP: read AES (16 Bytes)
#define AG_RD_XCRC 0x12
// MXP: read CRC (2 Bytes)
#define AG_RD_XVECT 0x13
// MXP: read Vectors (10 DWORDS, prepared)
//---22.7.2003: added for SLE66 RF Interface
#define AG_RDRF 0x14
// SLE66: Read RF Fifo registers
#define AG_WRRF 0x15
// SLE66: Write RF Fifo registers
#define AG_RDMOVB 0x16
// SLE66: Read SFR via MOVB
#define AG_WRMOVB 0x17
// SLE66: Write SFR via MOVB
//---26.8.2004: added for SLE66 Special Access
#define AG_BONVMREAD 0x18
// SLE66: BoNVMRead Macro
#define AG_BONVMWRITE 0x19
// SLE66: BoNVMWrite Macro
#pragma pack (1)
struct BoNvmFunc {
// for BoNVMRead/BoNVMWrite
unsigned
char Mode;
// access mode
unsigned
char buf[
85];
// read/write buffer
};
#pragma pack ()
#ifdef _IN_TARG_ // define if used in Mon166,Emu...
extern _EXPO_ U32 AG_MemAcc (U16 nCode, UC8 *pB, GADR *
pA, UL32 nMany);
extern _EXPO_ U32 AG_RegAcc (U16 nCode, U32 nReg, GVAL *
pV);
extern _EXPO_ U32 AG_AllReg (U16 nCode,
void *
pR);
#else
extern U32 (*AG_MemAcc) (U16 nCode, UC8 *pB, GADR *
pA, UL32 nMany);
extern U32 (*AG_RegAcc) (U16 nCode, U32 nReg, GVAL *
pV);
extern U32 (*AG_AllReg) (U16 nCode,
void *
pR);
#endif
/*
* extract trace history
*/
#ifdef _IN_TARG_ // define if used in Mon166,Emu...
extern _EXPO_ U32 AG_HistFunc (U32 nCode, I32 indx, I32 dir,
void *
vp);
#else
extern U32 (*AG_HistFunc) (U32 nCode, I32 indx, I32 dir,
void *
vp);
#endif
#pragma pack(1)
#define DIAD struct DlgD
struct DlgD {
// every dialog has it's own structure
UL32 iOpen;
// auto reopen dialog (pos := 'rc')
HWND hw;
// Hwnd of Dialog
BOOL (CALLBACK *
wp) (HWND hw, UINT msg, WPARAM wp, LPARAM lp);
RECT rc; // Position rectangle
void (*Update) (
void);
// Update dialog content
void (*Kill) (DIAD *pM);
// Kill dialog
void *vp;
// reserved for C++ Dialogs (Dlg *this)
};
#define DYMENU struct DyMenu
struct DyMenu {
// Menu item data structure
I32 nDelim;
// Menu template delimiter
char *szText;
// Menu item text
void (*fp) (DYMENU *pM);
// create/bringDlgtoTop function
UL32 nID;
// uv3 assigned ID_xxxx
UL32 nDlgId;
// Dialog ID
DIAD *pDlg;
// link to dialog attributes
};
#pragma pack()
/*
* nDelim: 1 := normal Menu entry
* 2 := Popup-Entry (nested submenu)
* -2 := end of Popup-Group-List
* -1 := total end of Menu-List
* text: the name for the menu/popup-menu entry
* fp: Function to be activated on menu-selection
*/
#if 0
// ----- Examples for AGDI's CallBack functions -----
//--- Example for Force Update:
pCbFunc (AG_CB_EXECCMD,
"dir public");
// execute dir public command
//--- Note: almost any dScope command but 'Exit' can be given.
//--- The 'Exit' command should not be executed !
//--- Example for Force Update:
pCbFunc (AG_CB_FORCEUPDATE, NULL);
//--- Note: function returns when update is completed.
//--- Example for Set Message String:
pCbFunc (AG_CB_MSGSTRING,
"Running...");
// up to 20 characters
//--- up to 20 characters may be displayed in the statusbar pane.
//--- Example for DisAssemble Opcodes:
DAAS parms;
parms.Adr =
0x10000;
// disassemble address
parms.Opc[
0] =
0xC0;
parms.Opc[1] =
0xF0;
// MovBZ RH7,R0
parms.Opc[
2] =
0;
parms.Opc[3] =
0;
pCbFunc (AG_CB_DISASM, (void *) &parms);
// disassemble...
//--- on return: parms.OpcLen := length of opcode in bytes
//--- parms.szB[] := disassembled instruction in ascii
//--- Note: parms.Adr is used for ascii-address and relative jmps only.
//--- parms.Result always 0.
//---Example for DisAssemble to file: /11.1.2005/
DAS_MIXED parms;
memset (&parms,
0,
sizeof (parms));
// clear
parms.nStart = (amCODE <<
24) | (amCODE <<
16) |
0x0C6A;
// start at C:0x0C6A
parms.nEnd = (amCODE <<
24) | (amCODE <<
16) |
0x0DE7;
// end at C:0x0DE7
parms.nMode =
1;
// use 'mixed' mode
strcpy (parms.szN,
"MixDis.Dis");
// Name of file to create and write
pCbFunc (AG_CB_DISASM_EXT, (
void *) &parms);
// disassemble to file...
switch (parms.Result) {
case 0:
// Ok.
break;
case 1:
// could not create file
// TODO: error handling
break;
case 2:
// could not write to file (disk full etc.)
// TODO: error handling
break;
}
//------------------------------------------------
typedef struct {
// 11.1.2005, DisAssemble Mixed-Mode into File
UL32 nStart;
// Start-Address for disassemble
UL32 nEnd;
// Stop-Address for disassemble
I32 Result;
// 0:=Ok, 1:=can't create file, 2:=file write error
I32 nMode;
// 0:=Asm-Mode, 1:=Mixed-Mode
UL32 nRes[
8];
// reserved
char szN [
300];
// name of file to create and write disassembly
} DAS_MIXED;
//--- Example for Inline Assemble:
DAAS parms;
parms.Adr =
0x10000;
// inline assemble address
strcpy (parms.szB,
"MOV [R8+#0x1200],R1");
// instruction to assemble
pCbFunc (AG_CB_INLASM, (void *) &parms);
// assemble...
//--- on return:
//--- parms.Result = 0 if successful
//--- parms.OpcLen := length of opcode in bytes
//--- parms.Opc[] := 'parms.OpcLen' Opcode bytes
//--- parms.Result != 0 if inline assembly failed
//--- everything of parms but 'Result' is invalid.
//--- Example for GetDeviceInfo:
DEV_X66 parms;
memset (&parms,
0,
sizeof (parms));
pCbFunc (AG_CB_INLASM, (void *) &parms);
// get device info
//--- On return:
//--- values in DEV_X66 structure.
//--- Note:
//--- AppName[] may be used to store a project target specific ini file
//--- AppName[] should be renamed (example: strcat (AppName, "hitex")
//--- before read or write operations can take place.
//--- Example for Find Symbol by value:
SYMDSC parms;
parms.nMask = AG_SYM_LOC | AG_SYMCON;
// functions and constants
parms.val =
0x10000;
// some value
pCbFunc (AG_CB_SYMBYVAL, (
void *) &parms);
// search for symbol
//--- On return:
//--- parms.Ok = 1, search was successful
//--- parms.szName[] = name of symbol ('main' for example)
//--- parms.type = type of symbol (AG_TP_FUNC for example)
//--- parms.val = value of symbol
//--- parms.Ok = 0, search failed.
//--- Note: publics are searched only
//--- Example for Find Symbol by name:
SYMDSC parms;
strcpy (parms.szName, "main");
pCbFunc (AG_CB_SYMBYNAME, (void *) &parms);
// search for symbol by name
//--- On return:
//--- parms.Ok = 1, search was successful
//--- parms.szName[] = name of symbol ('main' for example)
//--- parms.type = type of symbol (AG_TP_FUNC for example)
//--- parms.val = value of symbol
//--- parms.Ok = 0, search failed.
//--- Note: publics are searched only
//--- Example for Progress-Bar handling:
static OIL ProgressBar;
//--- initialize progress bar
ProgressBar.pos =
0;
// initial position
ProgressBar.low =
0;
// low position percent (0%)
ProgressBar.hig =
100;
// high position percent (100%)
ProgressBar.label =
"Loading Monitor...";
// progress label text
ProgressBar.Job = PROGRESS_INIT;
// initialize
pCbFunc (AG_CB_PROGRESS, &ProgressBar);
// do initialization.
//--- Step 1: display progress bar position:
while (processing) {
// ...
ProgressBar.Job =
PROGRESS_SETPOS;
ProgressBar.pos++
;
pCbFunc (AG_CB_PROGRESS, &ProgressBar);
// set bar to position
// ...
}
//--- Step 2: remove progress bar:
ProgressBar.Job =
PROGRESS_KILL;
pCbFunc (AG_CB_PROGRESS, &ProgressBar);
// kill Progress Bar.
#endif // End of CallBack Samples.
#if 0
// /30.1.2005/ Logic-Analyzer Example
static DWORD SaveAdr;
I32 QueryLaSig (AGDI_LA *
pLA) {
DWORD nAdr;
DWORD nSize;
nAdr = (U32) pLA->nAdr;
// Memory-Address
nSize = (U32) pLA->nSize;
// Size in Bytes
SaveAdr = nAdr;
// Note: this is a hook for the example-code below.
//---TODO:
//if (cannot_set tracking-range nAdr...nAdr+nSize-1) {
// strcpy (pLA->szError, "Error-Text"); // Reason for 'not supported'
// return (AGDI_LA_NOTSUPPORTED);
//}
//---OK:
return (AGDI_LA_OK);
// LA-Signal accepted
}
/*
* Given LA-Signal has been killed.
*/
U32 KilledLaSig (AGDI_LA *
pLA) {
//---TODO: whatever cleanup is required.
return (AGDI_LA_OK);
}
/*
* Send a Data-Record to uVision
* uVision will look for the matching LA-Signal based on the write-address
* and assign the data record to that La-signal.
*/
U32 SendLaDataRecord (AGDI_LAREC *
pLA) {
U32 nE;
nE = pCbFunc (AG_CB_LAREC_DATA, (
void *) pLA);
// send data to uVision
switch (nE) {
default:
case 0:
// could not find a matching Signal (pLA->nAdr)
break;
case AGDI_LA_OK:
break;
}
return (nE);
}
//---TODO: whenever the target detects a write to an address
// specified by one or more LA-definition specifed address
// ranges, then a data record needs to be prepared and
// sent to uVision
// Here is an example which simulates a 1000 hertz sine wave. It is
// assumed that the loaded user program contains a float variable
// such as:
// float f32Test;
//
// That variable can then be specified for logic analyzer in uVision
// Debugging mode in the command window:
//
// LA f32Test; // some float variable in user application
//
// The hooked address 'SaveAdr' is the location of 'f32Test' in memory.
static AGDI_LAREC la;
static void SineSig (
void) {
int i;
double volts, frequ, offs, dur, val;
volts =
2.0;
// peak-to-peak voltage
offs =
2.5;
// voltage offset
frequ =
1000;
// frequency
dur =
0.2;
// duration in seconds
memset (&la,
0,
sizeof (la));
la.nAdr = SaveAdr;
// use the previously hooked memory address '&f32Test'
la.tStamp =
10;
// simulate the time-stamp
la.totTime =
10;
// simulate the total running time
for ( i =
0 ; i < (dur *
100000) ; ++
i ) {
val = (
float) sin (frequ * (((
double) la.totTime) / 33e6) *
2 *
3.14159);
la.v.f32 = (
float) ((val * volts) + offs);
// setup the 'written' value
SendLaDataRecord (&la);
// send data to uVision
la.totTime +=
10;
// and incrase 'total time'
la.tStamp +=
10;
// simulate next time-stamp
}
// Note: total Time and time-stamp
}
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...
...
case AG_EXECITEM:
// execute various commands
switch (nCode &
0x00FF) {
case AG_QUERY_LASIG:
// is LA-Signal acceptable ?
if (vp == NULL) {
// NOTE: just for Test...
//---NOTE: vp == NULL is just for test only, it is not a real case !!!
SineSig();
// generate a sine Wave for test data
break;
// LA should show the sine wave...
}
nE = QueryLaSig ((AGDI_LA *
) vp);
break;
case AG_KILLED_LASIG:
// LA-Signal was killed
nE = KilledLaSig ((AGDI_LA *
) vp);
break;
...
}
return (nE);
}
#endif
#if 0
// /26.1.2005/ LOADPARMS-Example
/*
* AG_INITSTARTLOAD with load-parameters Example
*/
LOADPARMS lParms; // LOAD-Parameters
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...
// ...
break;
case AG_INITITEM:
// init item
switch (nCode &
0x00FF) {
case AG_INITMENU:
// init extension menu
*((DYMENU **) vp) = (DYMENU *
) Menu;
break;
// ...
case AG_INITCALLBACK:
// pointer to callback function
pCbFunc = (pCBF) vp;
// call-back function of s166
break;
case AG_INITSTARTLOAD:
// about to start 'load file'
if (vp != NULL) {
// Load-Parameters specified
lParms = *((LOADPARMS *
) vp);
// lParms.szFile[] : full path name of App to load
// lParms.Incremental : 1:= incremental load
// lParms.NoCode : 1:= load debug info only, no code (currently not used by uVision)
// TODO: process the given load parameters if required...
}
break;
case AG_INITENDLOAD:
// Load is now completed.
break;
}
break;
// ...
case AG_GETFEATURE:
// uVision2 want's details about features...
// ...
}
return (nE);
}
#endif
// menu item identifiers for external target DLLs:
#define AG_EXT_CMD_DEBUG_VIEW_TRACE_RECORDING 32000
#define AG_EXT_CMD_DEBUG_ENA_DISA_BREAKPOINTS 32001
#define AG_EXT_CMD_DEBUG_BREAKPOINTS 32002
#ifdef __cplusplus
}
#endif
#endif // __AGDI__INCED___
转载于:https://www.cnblogs.com/shangdawei/p/3979315.html
相关资源:keil ARM AGDI