lovemarsh
2008/9/17 8:13:01
(教程)BLOCK操作集锦
<div class=t_msgfont id=postmessage_4455643>BLOCK操作在以前用得少,所以大家都不太熟悉,最近补丁开始使用得多了。在这里做个归纳,包括本人才解决的一个难题。
一、从MMC加载到BLOCK
例子:云MM的“通过MMC卡文件加载每年的节日&节气数据”、本人的“一卡多号kvSIM_1.0”
通过MMC卡文件加载每年的节日&节气数据
;BIN文件样本 读取BIN数据的起始地址:0x56312C 长度:2D4
;执行功能部分(不能更改)
0x56312C: E00C88C0E00DE00E88E088D0E6FFA002;size:A002=672字节
0x563130: 88F0E6FC5C14E6FD3400E6FE2000E00F;block:5C14=5212
;3400用户资料开头,34h=52个字节,即从0x56312C至0x56315f共52个字节,从0x563160开始加载
0x563140: DAB44AFA06F00800E6FD1E05DAE6A804
0x563150: DB00CC00
;数据部分(自定义部分,可以定义56个节日)
0x563160: 171CC60FC552000000000000;11.28,农历,小寒
0x56316C: 180EC027C552000000000000;12.14,农历,大寒
调整3400可以指定从哪里开始加载,改为0000则包括执行功能部分(即文件头),如果超出了整个bin的长度,则清零。
二、从RAM加载到BLOCK
例子:云MM的“应用程序菜单设置数据保存在EEP中”、本人的“一卡多号kvSIM_1.2”
;保存159号码GSM 32:05B8到参数块5101 size:208。159saveV
0x1fc860: E00C88C0E00DE00E88E088D0E6FFD000; size:D000=208
0x1fc870: 88F0E6FCED13E6FDB805E6FE3200E00F; block:ED13=5101,offset:805E=5e8,page:3200=32
;比较一下从MMC加载到BLOCK,就可以发现两者的相同和不同处了。
0x1fc880: DAB44AFA06F00800E6FD1E05DAB55AD4; DAB55AD4振动函数
0x1fc890: DB00
;特别注意的是0x1fc87E:E00F,加载到BLOCK的开头处。你可以修改为E0xF,x就是从块的第几个字节开始加载。x取值范围为0~F,所以最多只能从第16个字节开始加载。
;销毁函数
0x1FCB70: E00C88C0E00DE00E88E088D0E6FFE001 ;size:E001=480
0x1FCB80: 88F0E6FC5014E6FD3400E6FE2000E00F ;block:5014=5200
0x1FCB90: DAB44AFA06F00800E6FD1E05DB00
;销毁函数就是从MMC加载到BLOCK的一个特例,没有需要加载的数据,清零。E00F从块的开头处开始清零。
三、从BLOCK加载到RAM
例子:云MM的多个补丁都有、本人的“一卡多号kvSIM_1.2”
;换号加载资料块5104数据到RAM地址:37:05A0,159change1V
0x1fc950: E6F4F6F9E00C88C088C088C0E6FC2001; size:2001=288
0x1fc960: 88C0E6FCF013E6FDA005E6FE3700E00F; block:F013=5104,offset:A005=5A0,page:3700=37
0x1fc970: E6F5B400DAC788EE06F00800DB00
;E00F,从BLOCK的开头处资料开始加载到RAM。你可以修改为E0xF,x就是从块的第几个字节开始加载。x取值范围为0~F,所以最多只能从第16个字节开始加载。
四、任意开始处加载
不管是从RAM加载到BLOCK还是从BLOCK加载到RAM,对以上的E00F作如下修改,就可以从任意位置开始加载:
E6FF xx00
例子:本人的“一卡多号kvSIM_1.6之3IN1版”
;保存2号序号 36:0D78到参数块5154,2save1V
0x1fc700: E00C88C0E00DE00E88E088D0E6FF0200; size:0200=2
0x1fc710: 88F0E6FC2214E6FD780DE6FE3600E6FF; block:2214=5154,offset:780D=D78,page:3600=3600
0x1fc720: 3000DAB44AFA06F00800E6FD1E05DB00
;0x1fc71E: E6FF3000,从第3行(48字节处)开始存入
;保存2号GSM 32:05B8到参数块5154,2save2V
0x1fc730: E00C88C0E00DE00E88E088D0E6FFD000; size:208
0x1fc740: 88F0E6FC2214E6FDB805E6FE3200E6FF;
0x1fc750: 3200DAB44AFA06F00800E6FD1E05DB00
;0x1fc75E: E6FF3200,从3000+0200=3200字节处开始存入,0200是0x1fc70e处的长度,3000是0x1fc720: 3000的位置。
利用BLOCK和RAM的操作,还有很多的应用。其中之一就是不用数据线,直接用MMC刷机。有时间再整理发布,希望在国庆节期间完成。
</div>