?? hexbin.h
字號:
///////////////////////////////////////////////////////////////////////
// 圓夢51!圓夢51!圓夢51!圓夢51!圓夢51!圓夢51!圓夢51!圓夢51!圓夢51!圓夢51!
// 1998.x.x 多少遺憾,多少淚水,路在何方?? 為什么失敗的總是我??夢想為什么這么遙遠
// ........學x86很久了,書本都翻了n遍了......
// 雖然x86很強大,但要做臺x86計算機真是太難了,8051單片機真的簡單了很多,我想做個8051的計算機.
// 沒有編程器的日子,真是不好受,自己又沒條件能做電路板,要是能有臺計算機模擬8051,那將是多莫令人興奮的事情啊
// 但是我什么都沒有............什么都沒有
// 1999.x.x草稿紙上完成基本的框架圖和基本算法,并完成部分核心代碼,并將項目名稱定為圓夢51
// .......飄啊搖啊,淡漠了生活,忘記了夢想,就這樣渾渾噩噩的活著........夢已死
// 2002.8.24 塵世間多少煩惱,從此不必再牽掛。為了夢想我終于可以從現實中解脫出來一段時間,不上學的日子真好,真令人懷念。
// 建立指令模擬代碼檔。
// 不懂windows C編程是我最大的障礙,......1年時間......我想應該是我這一生中最有價值的時間,以前沒有,以后可能更沒有了
// 2003.12.x
// 因為要上學,所以能夠靜下心來學習的時間基本再也找不到了
// 2004.9.2 基本初步完成,尚未完成中斷返回,尚未debug
// 2004.11.17 調試浮點程序通過,^_^ :) ^o^ ^0^ :( >_< 他的缺點就是他的優點,我無法權衡,指令類暫時先穩定下來吧
// 當學生真是無奈,我在倒退..............我在放棄夢想...............
// 2005.3.28 不管怎樣我要圓夢,我不能做個永遠失敗的人
// 效率低下,等出了1.0后是否大幅度修改
//////////////////////////////////////////////////////////////////////
// HEXBIN.h: interface for the HEXBIN class.
// HEX文件操作類1.0,暫時不支持擴展段和擴展線性地址
// 本代碼由桃源村編寫 2004.6.12
//
//////////////////////////////////////////////////////////////////////
/*
本文由AthlonxpX86(桃源村) 2004.6.11 翻譯<>中的內容為譯者加入的內容
問題:
什么是Intel HEX格式?
回答:
Intel HEX文件是記錄文本行的ASCII文本文件,下面是Intel HEX文件格式,在Intel HEX文件中,每一行是一個HEX記錄由十六進制數組成的機器碼或者靜態數據,Intel HEX文件經常被用于將程序或數據傳輸存儲到ROM.EPROM,大多數編程器和模擬器使用Intel HEX文件.
記錄格式:
一個Intel HEX文件可以包含任意多的十六進制記錄,每條記錄有五個域,下面是一個記錄的格式.
:llaaaatt[dd...]cc
每一組字母是獨立的一域,每一個字母是一個十六進制數字,每一域至少由兩個十六進制數字組成,下面是字節的描述.
: 冒號是每一條Intel HEX記錄的開始
ll 是這條記錄的長度域,他表示數據(dd)的字節數目.
aaaa 是地址域,他表示數據的起始地址<如果是數據記錄這表示將要燒錄的這條記錄中的數據在EPROM中的偏移地址,對于不支持擴展段地址和擴展線性地址的如89C51,這就是此條記錄的起始地址>
tt 這個域表示這條HEX記錄的類型,他有可能是下面這幾種類型
00 ----數據記錄<要分清楚這幾種記錄類型,后面會經常出現,不要搞混了>
01 ----文件結束記錄<HEX文件的最后一條記錄這個域是01>
02 ----擴展段地址記錄
04 ----擴展線性地址記錄
dd 是數據域,表示一個字節的數據,一個記錄可能有多個數據字節,字節數目可以查看ll域的說明
cc 是效驗和域,表示記錄的效驗和,計算方法是將本條記錄冒號開始的所有對字母<不包括本效驗字和冒號>所表示的十六進制數字<一對字母表示一個十六進制數,這樣的一個十六進制數為一個字節>都加起來然后模除256得到的余數最后求出余數的補碼即是本效驗字節cc.
<例如:
:0300000002005E9D
cc=0x01+NOT((0x03+0x00+0x00+0x00+0x02+0x00+0x5E)%0x100)=0x01+0x9C=0x9D
C語言描述:
UCHAR cc;
cc=(UCHAR)~(0x03+0x00+0x00+0x00+0x02+0x00+0x5E);
cc++;
>
一
數據記錄
Intel HEX文件由若干個數據記錄組成,一個數據記錄以一個回車和一個換行結束<回車為0x0D換行為0x0A>
比如下面的一條數據記錄
:10246200464C5549442050524F46494C4500464C33
10是此行記錄數據的字節數目
2462是數據在內存<將要燒寫的EPROM地址>中的起始地址
00是記錄類型00(是一個數據記錄)
464C到464C是數據
33是此行記錄的效驗和
二
擴展線性地址記錄(HEX386)
擴展線性地址記錄也可以認為是32為地址記錄和HEX386記錄,這個紀錄包含高16(16-31位)位數據地址,這種擴展的線性記錄總是有兩個字節數據,像下面這樣:
:02000004FFFFFC
02是記錄的數據字節數目
0000是地址域這在擴展地址記錄中總是0000
04是記錄類型04(擴展地址記錄)
FFFF是高16位地址
FC是記錄效驗和,計算方法如下:
01h + NOT(02h + 00h + 00h + 04h + FFh + FFh)
當一個擴展線性地址記錄被讀到后,擴展線性地址記錄的數據區域將被保存并應用到后面從Intel HEX文件中讀出的記錄,這個擴展線性記錄一直有效,直到讀到下一個擴展線性記錄.
絕對內存地址 = 數據記錄中的地址 + 移位后的擴展線性地址
| |
數據記錄中的地址域 移位后擴展線性地址記錄中的地址域
下面舉例說明這個過程
從數據記錄的地址域得到地址 2462
從擴展線性地址記錄的地址域得到地址 FFFF
--------
絕對內存地址 FFFF2462
三
擴展段地址記錄 (HEX86)
擴展段地址記錄也可以認為是包含地址中4-19位的數據地址段,這個擴展段地址記錄總是有兩字節數據,如下:
:020000021200EA
02是記錄中的數據字節數目
0000是地址域,在擴展段地址記錄中,這個域總是0000
02是記錄類型02(擴展段地址的標示)
1200是該段的地址
EA是效驗和計算如下:
01h + NOT(02h + 00h + 00h + 02h + 12h + 00h).
當擴展段地址記錄被讀后,擴展段地址將被存儲并應用到以后從Intel HEX文件讀出的記錄,這個段地址一直有效直到讀到下一個擴展段地址記錄
絕對內存地址 = 數據記錄中的地址 + 移位后的擴展段地址
| |
數據記錄中的地址域 移位后擴展段地址記錄中的地址域
下面舉例說明這個過程
從數據記錄的地址域得到地址 2462
從擴展段地址記錄的地址域得到地址 1200
--------
絕對內存地址 00014462
四
文件結束記錄(EOF)
一個Intel HEX文件必須有一個文件結束記錄,這個記錄的類型域必須是01,一個EOF記錄總是這樣:
:00000001FF
00是記錄中數據字節的數目
0000這個地址對于EOF記錄來說無任何意義
01記錄類型是01(文件結束記錄標示)
FF是效驗和計算如下
01h + NOT(00h + 00h + 00h + 01h).
*/
#if !defined(AFX_HEXBIN_H__773948CC_061A_44EC_966D_55B2753BD48A__INCLUDED_)
#define AFX_HEXBIN_H__773948CC_061A_44EC_966D_55B2753BD48A__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#define DEOF 0x00
#define NODEOF 0x01
struct Data
{
UINT address;
UCHAR data;
UCHAR DataEOF; //數據燒錄結束,0表結束,1表未結束
};
struct record
{
UCHAR ll;//此行數據記錄長度
UINT aaaa;//地址域
UCHAR tt;//記錄類型
UCHAR * dd;//數據指針
UCHAR cc;//效驗和
record * next;//下一個記錄指針
};
class HEXBIN
{
public:
UINT GetMaxAddr();
UINT GetHexDataSize();
record * head;
record * noncep;//當前記錄指針
Data * pData;
UCHAR * Databuf;
UINT HEXSIZE;//數據域大小
UINT MAXADDR;//HEX最大地址
Data * GetNextData();//得到下一個數據
int HEXTOBIN(TCHAR * pPath);//HEX轉BIN文件
int HEXTOBINBUF(BYTE * pBUF,DWORD Size);//HEX轉BIN緩沖
int LoadHEXFile(TCHAR * pPath);//加載HEX文件
HEXBIN();
HextoDec(TCHAR * p);//十六進制字符串轉數字
virtual ~HEXBIN();
protected:
UINT offset;//記錄中數據域相對偏移
};
#endif // !defined(AFX_HEXBIN_H__773948CC_061A_44EC_966D_55B2753BD48A__INCLUDED_)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -