start.sh 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301
  1. #!/bin/bash
  2. # Dependencies
  3. # perl
  4. # bc
  5. # hexdump
  6. # grep
  7. # sed
  8. rm temp temp1 >&- 2>&-
  9. echo ""
  10. echo "------------------------------------------------"
  11. echo " Riivolution XML to Gecko-code type file "
  12. echo "With aditional info printing for troubleshooting"
  13. echo "------------------------------------------------"
  14. echo ""
  15. echo XML file path? Example: \"folder/name.xml\"
  16. read xml
  17. if ! test -f $xml ; then
  18. echo ""
  19. echo No XML file found.
  20. echo Exiting...
  21. exit 0
  22. fi
  23. grep -e memory -e patch $xml > temp
  24. dos2unix temp >&- 2>&-
  25. sed -i 's/<!--.*-->//' temp
  26. sed -i '/^[[:space:]]*$/d' temp
  27. echo ""
  28. echo Does it come with an ASM binaries folder? \(y/n\)
  29. read asmyn
  30. echo ""
  31. if [ "$asmyn" = y ]; then
  32. echo ASM folder path? Example: \"folder/ASM/\"
  33. read asmpath
  34. if ! [ -d "$asmpath" ]; then
  35. echo ""
  36. echo ASM folder not found.
  37. echo Exiting...
  38. exit 0
  39. fi
  40. echo ""
  41. elif ! [ "$asmyn" = n ]; then
  42. echo Invalid option.
  43. echo Exiting...
  44. exit 0
  45. fi
  46. echo Keep aditional information? \(y/n\)
  47. read infoyn
  48. echo ""
  49. if ! [ "$infoyn" = n -o "$infoyn" = y ]; then
  50. echo Invalid option.
  51. echo Exiting...
  52. exit 0
  53. fi
  54. echo Detecting regions...
  55. grep "<region" $xml | grep -oP '(?<=").*?(?=")' > temp1
  56. regnum=$( cat temp1 | sed -n '$=' )
  57. reglist=$( cat temp1 | sed s/^$// )
  58. echo ""
  59. echo Detected $regnum regions: $reglist
  60. for b in $( eval echo {1..$regnum} )
  61. do
  62. reg=$( sed -n "$b"p temp1 )
  63. echo ""
  64. echo Starting $reg region...
  65. echo ""
  66. echo Creating output$reg.txt file...
  67. touch output$reg.txt
  68. lnum=$( sed -n '$=' temp )
  69. for i in $( eval echo {1..$lnum} )
  70. do
  71. line=$( sed -n "$i"p temp )
  72. set $line
  73. # tag is to check for the "memory" or "patch" lines on the riivolution XML file
  74. tag=$( echo $line | grep -oP "(?<=<).*?(?= )" )
  75. if [ "$tag" = 'memory' ]; then
  76. # tag finds "memory" line
  77. # check target region code to see if it matches the region of the gecko code list
  78. target=$( echo $line | grep -oP '(?<=target=").*?(?=")' )
  79. # if target is different than gecko code list region then skip the line
  80. if ! [ "$target" = "$reg" -o "$target" = "" ]; then continue; fi
  81. # if target is equal to gecko code list region or empty then proceed
  82. # valuefile name
  83. valuefile=$( echo $line | grep -oP '(?<=valuefile=").*?(?=")' | sed "s/^.*\///" | sed "s/{\$__region}/$reg/" )
  84. # offset value
  85. offset=$( echo $line | grep -oP '(?<=offset=").*?(?=")' | sed 's/0x80//' | sed 's/.*/&/' | tr [:lower:] [:upper:] )
  86. # value tag value
  87. value=$( echo $line | grep -oP '(?<=value=").*?(?=")' | tr [:lower:] [:upper:] )
  88. # original condition value
  89. original=$( echo $line | grep -oP '(?<=original=").*?(?=")' | tr [:lower:] [:upper:] )
  90. # if value is a pointer it starts with the 8000 digit
  91. pointer=$( echo $value | sed "s/8000.*/8000/" )
  92. # digit length of "value" variable
  93. valsize=${#value}
  94. # value greater than 8 digits
  95. if [ "$valsize" -gt 8 ]; then
  96. offset_for_value_gt8=$( echo "ibase=16;$offset+4000000" | bc )
  97. number_of_lines=$( sed -n '$=' output$reg.txt )
  98. # if first memory patch is a value longer than 8 digits
  99. if [ "$number_of_lines" == "" ]; then number_of_lines=0; fi
  100. echo "$value"| fold -w8 >> output$reg.txt
  101. after_fold_number_of_lines=$( sed -n '$=' output$reg.txt )
  102. echo Adding value = "$value"
  103. let valuefile_fold_line_length=$after_fold_number_of_lines-$number_of_lines
  104. for (( a = 0, number_of_lines++; a < valuefile_fold_line_length ; a++, number_of_lines++ ))
  105. do
  106. next_offset=$( echo "ibase=10;obase=16;$offset_for_value_gt8+($a)*4" | bc )
  107. set $next_offset
  108. sed -i "$number_of_lines s/^/0$next_offset /" output$reg.txt
  109. done
  110. # value is a valuefile (BIN)
  111. elif ! [ -z "$valuefile" ]; then
  112. offset_for_valuefile=$( echo "ibase=16;$offset+4000000" | bc )
  113. number_of_lines=$( sed -n '$=' output$reg.txt )
  114. # if first memory patch is a BIN file
  115. if [ "$number_of_lines" == "" ]; then number_of_lines=0; fi
  116. hexdump -e '16/1 "%02x ""\n"' -v $asmpath$valuefile | tr --delete ' ' | perl -ne 'print uc' | fold -w8 >> output$reg.txt
  117. after_fold_number_of_lines=$( sed -n '$=' output$reg.txt )
  118. let valuefile_fold_line_length=$after_fold_number_of_lines-$number_of_lines
  119. echo Adding $valuefile...
  120. for (( a = 0, number_of_lines++; a < valuefile_fold_line_length ; a++, number_of_lines++ ))
  121. do
  122. next_offset=$( echo "ibase=10;obase=16;$offset_for_valuefile+($a*4)" | bc )
  123. set $next_offset
  124. sed -i "$number_of_lines s/^/0$next_offset /" output$reg.txt
  125. done
  126. # value is 8 digits long
  127. elif [ "$valsize" -eq 8 ]; then
  128. offset_8digits=$( echo "04$offset" )
  129. value_8digits=$( echo $value )
  130. echo Adding value = "$value_8digits"
  131. echo "$offset_8digits $value_8digits" >> output$reg.txt
  132. # value is 4 digits long
  133. elif [ "$valsize" -eq 4 ]; then
  134. offset_4digits=$( echo "02$offset" )
  135. value_4digits=$( echo "0000$value" )
  136. echo Adding value = "$value_4digits"
  137. echo "$offset_4digits $value_4digits" >> output$reg.txt
  138. # value is 2 digits long
  139. elif [ "$valsize" -eq 2 ]; then
  140. offset_2digits=$( echo "00$offset" )
  141. value_2digits=$( echo "000000$value" )
  142. echo Adding value = "$value_2digits"
  143. echo "$offset_2digits $value_2digits" >> output$reg.txt
  144. fi
  145. lnum4=$( sed -n '$=' output$reg.txt )
  146. # original, pointer, and target condition checks to print more info
  147. if ! [ -z "$original" ]; then
  148. sed -i "$lnum4 s/$/ : Original condition = $original/" output$reg.txt
  149. fi
  150. if [ "$pointer" = "8000" ]; then
  151. if [ "$valsize" -gt 8 ]; then
  152. let fixln1=$lnum4-$lnum2+1
  153. sed -i "$fixln1 s/$/ : ASM pointer = $value/" output$reg.txt
  154. elif [ "$valsize" -eq 8 ]; then
  155. sed -i "$lnum4 s/$/ : ASM pointer = $value/" output$reg.txt
  156. fi
  157. fi
  158. if ! [ -z "$target" ]; then
  159. sed -i "$lnum4 s/$/ : Target = $target/" output$reg.txt
  160. fi
  161. elif [ "$tag" = 'patch' ]; then
  162. # tag finds "patch" line
  163. # is it the right "patch" line? "/>" must not be present on line
  164. patch_cond=$(echo $line | grep "/>")
  165. if ! [ "$patch_cond" = '' ]; then continue; fi
  166. patchid=$( echo $line | grep -oP '(?<=id=").*?(?=")' )
  167. echo ""
  168. echo "- Patch ID = $patchid"
  169. fi
  170. done
  171. echo ""
  172. echo -- output$reg.txt created.
  173. done
  174. echo ""
  175. if [ "$infoyn" = n ]; then
  176. echo Removing information...
  177. sed -i "s/ :.*//" *.txt
  178. echo ""
  179. fi
  180. unix2dos *.txt >&- 2>&-
  181. rm temp temp1
  182. echo 'Exiting...'
  183. exit 0