|
9#
楼主 |
发表于 2012-1-18 22:19:42
|
只看该作者
刚刚看了ZXW大大的FD2HD批处理,觉得很有意思。试着加点注释,不过有不少地方不懂,请Z大及各位大侠指点。
!BAT
debug 0
checkrange 20111009:-1 read 0x8278 || clear && echo Error: Not supported $[0003]grub4dos version! && exit
#0x8278为grub4dos版本在内存中的地址。
#$[0003] 未解。
calc *0x8280&0xff/2 || debug 1 && command | call :zip_fix *0x8280&0xff= && exit
#由后面的zip_fix子程序可判断 *0x8280&0xff取(bd)设备号。
#计算*0x8280 的值是否为0x80/0x23(fb启动)/0x21(PXE)/0xXX(光驱,更大于硬盘设备号),是则继续,不是就调用zip_fix。
#启动时如果为zip,则为(fd0)或者(fd0,0),此时设备号为0。
calc *0x82b8 && calc *0x82b9&0xff/2 || debug 1 && command | call :zip_fix *0x82b9&0xff=
#如果为UD启动,则判断是否存在(fd0)、(fd0,0)
#0x82b8 、0x82b9与UD有关,具体来讲干什么用的?
#*0x82b9&0xff取(ud)还是可见分区的设备号?
debug 0
exit
:zip_fix
debug 0
setlocal
set /a zip.mod=%1
call :movedisk + || exit
#调用movedisk子程序,才HD号依次后移。
map (%zip.mod%) (hd0) > nul || exit
#加上> nul 屏蔽写屏。
map --hook > nul
map --floppies=0
#既然将FD给形成HD了,最后要去掉FD。
endlocal && call :cpath_fix %zip.mod% %~5
#调用cpath_fix修正路径
clear
exit
:cpath_fix
if "%~d2"=="(fd%1)" command --set-path=(hd0)%~p2 || if "%~d2"=="(fd%1,0)" command --set-path=(hd0,0)%~p2
calc *0x8280-%1 || calc *0x8280=0x80 > nul
#calc *0x8280-%1一定为0,这句可以砍掉吧?
calc *0x82b8 && calc *0x82b9=*0x82b9&0xffffff00|0x80 > nul
#这个红色部分不明白,另外请解释下那个|
calc *0x82a0-%1 || calc *0x82a0=0x80 > nul
exit
:movedisk
set /a hd0=*0x475&0xff+0x7f
if "%hd0%"=="127" exit
if "%1"=="-" || goto :move
map (hd0) (hd-1) > nul
:move
set /a hd1=%hd0%%%1 1
if "%hd1%"=="127" exit
map (%hd0%) (%hd1%) > nul
if "%hd0%"=="128" exit
set /a hd0=%hd0%-1
goto :move
[ 本帖最后由 2011seeu 于 2012-1-18 22:41 编辑 ] |
|