set talk off
set safe off
CREATE TABLE MODULE ( ;
instance N (2,0) ,;
class C (1) ,;
HeadLen N (2,0) ,;
Compr_type N (1,0) ,;
Offset N (10,0),;
Segment N (10,0),;
expand1_sz N (6,0),;
compr_sz N (6,0),;
footpr_sz N (6,0),;
expand2_sz N (6,0),;
prev_start N (11,0),;
start N (10,0),;
len N (10,0),;
end N (10,0),;
name C (12),;
switch C (30))
use module.dbf
append blank
bios="YU-V115.ABL"
=adir(ARRAY1,bios)
_bios=fopen(bios)
*? ARRAY1[1,2]
*********************************************
for a=0 to ARRAY1[1,2]
=fseek(_bios,a)
*****
_byte=fread(_bios,3)
if _byte=chr(00)+chr(49)+chr(49)"
*****
=fseek(_bios,a-4)
_prs4=fread(_bios,1)
=fseek(_bios,a-3)
_prs3=fread(_bios,1)
=fseek(_bios,a-2)
_prs2=fread(_bios,1)
=fseek(_bios,a-1)
_prs1=fread(_bios,1)
*****
=fseek(_bios,a+3)
_Instance=fread(_bios,1)
*****
=fseek(_bios,a+4)
_Class=fread(_bios,1)
*****
=fseek(_bios,a+5)
_HeadLen=fread(_bios,1)
=fseek(_bios,a+6)
_Compr_type=fread(_bios,1)
*****
=fseek(_bios,a+7)
_Offset2=fread(_bios,1)
=fseek(_bios,a+8)
_Offset1=fread(_bios,1)
*****
=fseek(_bios,a+9)
_Segment2=fread(_bios,1)
=fseek(_bios,a+10)
_Segment1=fread(_bios,1)
*****
=fseek(_bios,a+11)
_len2=fread(_bios,1)
=fseek(_bios,a+12)
_len1=fread(_bios,1)
*****
=fseek(_bios,a+15)
_len4=fread(_bios,1)
=fseek(_bios,a+16)
_len3=fread(_bios,1)
*****
=fseek(_bios,a+19)
_len6=fread(_bios,1)
=fseek(_bios,a+20)
_len5=fread(_bios,1)
*****
=fseek(_bios,a+23)
_len8=fread(_bios,1)
=fseek(_bios,a+24)
_len7=fread(_bios,1)
*****
=fseek(_bios,a)
? "Модуль: "+_Class
append blank
repl prev_start with hexstrword(_prs1+_prs2+_prs3+_prs4)-4294443008
repl Instance with hexstrword(_Instance)
repl class with _Class
repl HeadLen with hexstrword(_HeadLen)
repl Compr_type with hexstrword(_Compr_type)
repl offset with hexstrword(_offset1+_offset2)
repl segment with hexstrword(_segment1+_segment2)
repl expand1_sz with hexstrword(_len1+_len2)
repl compr_sz with hexstrword(_len3+_len4)
repl footpr_sz with hexstrword(_len5+_len6)
repl expand2_sz with hexstrword(_len7+_len8)
repl start with a-4
_st=start
skip -1
repl len with _st-start
repl end with module.start+module.len-1
skip 1
do case
*------------------------*
case _class="*"
repl name with "AUTOGEN"
case _class="$"
repl name with "MAC"
case _class="@"
repl name with "STARTUP"
case _class="C"
repl name with "UPDATE"
case _class="F"
repl name with "MARKS"
case _class="L"
repl name with "LOGO"
case _class="O"
repl name with "NETWORK"
case _class="S"
repl name with "STRINGS"
case _class="W"
repl name with "WAV"
case _class="A"
repl name with "ACPI"
case _class="D"
repl name with "DISPLAY"
case _class="G"
repl name with "DECOMPCODE"
case _class="M"
repl name with "MISER"
case _class="P"
repl name with "ROMPILOTINIT"
case _class="T"
repl name with "TEMPLATE"
case _class="X"
repl name with "ROMEXEC"
case _class="B"
repl name with "BIOSCODE"
case _class="E"
repl name with "SETUP"
case _class="I"
repl name with "BOOTBLOCK"
case _class="N"
repl name with "ROMPILOTLOAD"
case _class="R"
repl name with "OPROM"
case _class="U"
repl name with "USER"
*------------------------*
case _class="Q"
repl name with "MODULE"
repl switch with "-C:"+class+alltrim(str(instance))
case _class="H"
repl name with "MODULE"
repl switch with "-C:"+class+alltrim(str(instance))
case _class=chr(00)
repl name with "BOTTOM"
*------------------------*
otherwise
repl name with "UFO"
endcase
endif
endfor
*********************************************
=fclose(_bios)
******** Add switch -Z (Disable Shadow) ****
repl switch with alltrim(switch)+" -Z" for module.name="ROMEXEC" .and. module.instance=1
******** Add switch -X (Disable Compression) ****
repl switch with alltrim(switch)+" -X" for Compr_type=0
repl switch with strtran(switch,"-X","") for NAME="ROMEXEC"
repl switch with strtran(switch,"-X","") for NAME="DECOMPCODE"
repl switch with strtran(switch,"-X","") for NAME="UPDATE"
******** Find & Add Hole ******
append blank
repl Instance with 0
repl start with 491520
repl len with 32768
repl end with start+len-1
repl name with "BOOTBLOCK"
repl switch with "-S:32"
_end=start-1
_end2=end
go top
locate for name="DISPLAY" .and. instance=0
if found()=.t.
repl end with _end
repl len with _end-start+1
endif
go top
locate for end=_end2
if found()=.t.
delete
endif
*******************************
append blank
repl Instance with 0
repl start with 16384
repl len with 6144
repl end with start+len-1
repl name with "HOLE"
repl switch with "-A:0xFFF84000 -SB:6144"
*****
append blank
repl Instance with 1
repl start with 65536
repl len with 6144
repl end with start+len-1
repl name with "HOLE"
repl switch with "-A:0xFFF90000 -SB:6144"
_hl=len
go top
locate for name="BIOSCODE" .and. instance=3
if found()=.t.
repl end with end-_hl
repl len with end-start+1
endif
*****
append blank
repl Instance with 2
repl start with 131072
repl len with 2048
repl end with start+len-1
repl name with "HOLE"
repl switch with "-A:0xFFFA0000 -SB:2048"
_hl=len
go top
locate for name="BIOSCODE" .and. instance=2
if found()=.t.
repl end with end-_hl
repl len with end-start+1
endif
*****
*brow for compr_sz+headlen<>len
*repl len with compr_sz+headlen for name="ROMEXEC" .or. name="BIOSCODE"
go top
delete
pack
quit
********************************************************
Function Hex2Dec
********************************************************
*
* Written by: Ralph P. Morse Jr. (c) 1995
* RalphMorse@msn.com
*
* Parameter: Character string from "00" to "FF"
*
* Returns: Numeric value (0-255)
*
********************************************************
Parameter PCHexCode
Private JCHex1, JCHex2
Store Asc(Upper(SubStr(PCHexCode, 1, 1))) To JCHex1
Store Asc(Upper(SubStr(PCHexCode, 2, 1))) To JCHex2
Store JCHex1 - IIf(JCHex1 > 60, 55, 48) To JCHex1
Store JCHex2 - IIf(JCHex2 > 60, 55, 48) To JCHex2
Return JCHex1 * 16 + JCHex2
********************************************************
FUNCTION hexstrword
PARAMETER hexstr
PRIVATE hexword, inputstr, ch, i, ;
j
hexword = 0
inputstr = hexstr
FOR i = 1 TO LEN(inputstr)
ch = SUBSTR(inputstr, i, 1)
j = ASC(ch)
hexword = (hexword * 256) + ;
j
ENDFOR
RETURN hexword
********************************************************