mirror of
https://github.com/ISpillMyDrink/OpenSuperClone.git
synced 2026-09-28 21:15:36 +00:00
146 lines
3.7 KiB
Plaintext
146 lines
3.7 KiB
Plaintext
|
|
|
|
seti $printhelp = $printhelp
|
|
seti $help = $help
|
|
if $help = 1
|
|
echo 'Western Digital ROYL check ram.'
|
|
echo 'This requires the text variable "file" to be set.'
|
|
echo '"file" is the name of the ram file.'
|
|
|
|
if $printhelp = 1
|
|
exit 0
|
|
endif
|
|
echo 'Hit ENTER to continue...'
|
|
userinput $choicestring
|
|
previousscript
|
|
endif
|
|
|
|
include good_subroutines.osc
|
|
|
|
# set a blank string variable to compare with user input
|
|
# make sure not to set this anyplace else
|
|
sets $null = ""
|
|
|
|
# set this to itself for use with the menu system
|
|
# make sure not to set this anyplace else
|
|
# if it was not previously set it will = 0
|
|
seti $using_menu = $using_menu
|
|
|
|
# set the file name to be read
|
|
while 1 = 1
|
|
variablecheck $file
|
|
if $error_level < 16
|
|
seti $ask = 1
|
|
elseif $using_menu = 1
|
|
seti $ask = 1
|
|
endif
|
|
if $ask = 1
|
|
echo "Enter file name:"
|
|
userinput $choicestring
|
|
if $choicestring != $null
|
|
sets $file = $choicestring
|
|
break
|
|
else
|
|
echo "Choice cannot be blank!"
|
|
endif
|
|
else
|
|
break
|
|
endif
|
|
done
|
|
|
|
getfilesize $file
|
|
seti $file_size = $error_level
|
|
if $file_size < 0
|
|
echo "ERROR! File " $file " not found!"
|
|
previousscript
|
|
endif
|
|
echo "Reading the ram file"
|
|
seti $ram_size = $file_size
|
|
scratchpadsize $ram_size
|
|
clearscratchpad
|
|
readscratchpad $file 0 0 $ram_size
|
|
|
|
gosub process_ram
|
|
|
|
|
|
previousscript
|
|
end
|
|
|
|
|
|
|
|
|
|
subroutine process_ram
|
|
echo "processing ram"
|
|
|
|
# search for modules and check them
|
|
echo "Searching for modules."
|
|
sets $header_check = "ROYL"
|
|
seti $position = 0
|
|
seti $search_end = $ram_size - 4
|
|
while $position < $search_end
|
|
sets $header = scratchpad $position 4
|
|
if $header = $header_check
|
|
# process the module
|
|
seti $working_offset = $position
|
|
#echo "Header:"
|
|
#printscratchpad $working_offset 4
|
|
seti $working_offset = $position + 8
|
|
seti $mod_id = scratchpad $working_offset w
|
|
hex
|
|
#echo "Module ID = 0x" $mod_id
|
|
|
|
# find how many sectors the module contains
|
|
seti $working_offset = $position + 0xa
|
|
seti $mod_length_sectors = scratchpad $working_offset
|
|
seti $working_offset = $position + 0xb
|
|
seti $tempnum = scratchpad $working_offset
|
|
seti $tempnum = $tempnum > 8
|
|
seti $mod_length_sectors = $mod_length_sectors + $tempnum
|
|
|
|
#echo "Size in sectors = 0x" $mod_length_sectors
|
|
seti $working_offset = $position + 0xc
|
|
seti $checksum = scratchpad $working_offset dw
|
|
#echo "32 bit checksum = 0x" $checksum
|
|
seti $working_offset = $position + 0x10
|
|
#echo "Mod version:"
|
|
#printscratchpad $working_offset 8
|
|
decimal
|
|
|
|
seti $module_size = $mod_length_sectors * 512
|
|
seti $calculated_checksum = 0
|
|
seti $count = 0
|
|
while $count < $module_size
|
|
seti $working_offset = $position + $count
|
|
if $working_offset > $search_end
|
|
echo "end of module is past end of rom"
|
|
break
|
|
endif
|
|
seti $dword = scratchpad $working_offset dw
|
|
seti $calculated_checksum = $calculated_checksum + $dword
|
|
seti $count = $count + 4
|
|
# skip the actual checksum bytes
|
|
if $count = 0xc
|
|
seti $count = $count + 4
|
|
endif
|
|
done
|
|
seti $calculated_checksum = $calculated_checksum & 0xffffffff
|
|
seti $calculated_checksum = 0xffffffff - $calculated_checksum
|
|
seti $calculated_checksum = $calculated_checksum + 1
|
|
|
|
hex
|
|
if $checksum = $calculated_checksum
|
|
sets $checkstring = " calulated=0x" $calculated_checksum " (good)"
|
|
else
|
|
sets $checkstring = " calulated=0x" $calculated_checksum " (bad)"
|
|
endif
|
|
echo "pos=0x" $position " ModID=0x" $mod_id " size=0x" $module_size $checkstring
|
|
decimal
|
|
endif
|
|
seti $position = $position + 512
|
|
done
|
|
endsubroutine
|
|
|
|
|
|
|
|
|