Advertisement
atreyu187

Dreamcast Guides : winnar1up's Linux Selfboot Script

Dec 23rd, 2012
391
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 23.58 KB | None | 0 0
  1. #!/bin/bash
  2.  
  3. # usage: rip.sh tosec.7z
  4. # burns a cd-r rip from a tosec archive
  5. # only works for simple games at the moment
  6. # no cdda, under 616mb data
  7. # does 45000 lba data/data sao/tao, 80 min
  8.  
  9. # required software: cdrkit/cdrtools, sed, 7z, xorriso, sfk, binhack, isofix,
  10. # pngtomr, imagemagick, pvr2png, disc juggler, logoinsert, dd, sox, fslint,
  11. # perl, awk, bash, bincon, dc_afsshrink
  12.  
  13.  
  14. #if file exists, continue
  15. if [ -f "$@" ]
  16. then
  17.  
  18. CDDA=""
  19. CDDA=$(7z l "$@" | grep "track05.raw")
  20. if [ "$CDDA" != "" ]
  21. then
  22. echo "$@" >> ~/dcrips.cdda.txt
  23. exit 2
  24. fi
  25.  
  26. # sync writes before we start
  27. sync
  28.  
  29. FILEPATH=$@
  30. FILE=${FILEPATH##*/}
  31. BASENAME=$(echo "$FILE" | sed -e 's/...$//')
  32.  
  33. # set cd-r options
  34. CDR_MINS=80
  35. LBA=45000
  36. CDROM_ID="/dev/sr2"
  37.  
  38. # 2gb required in tmp, 3gb required in tmp2
  39. # put tmp on ram drive & tmp2 on different drive
  40. # to tosec gd-rom storage for speed
  41. # both in ram if you have it
  42. TMP_DIR="/tmp"
  43. TMP2_DIR="/tmp"
  44.  
  45. # clean old dirs
  46. rm -rf "$TMP_DIR"/dcrip
  47. rm -rf "$TMP2_DIR"/gd
  48. mkdir "$TMP_DIR"/dcrip
  49. mkdir "$TMP_DIR"/gd
  50.  
  51. TMP_DIR="$TMP_DIR"/dcrip/"$BASENAME"
  52. TMP2_DIR="$TMP2_DIR"/gd/"$BASENAME"
  53. mkdir "$TMP_DIR"
  54. mkdir "$TMP2_DIR"
  55. mkdir "$TMP_DIR"/dcrip
  56. mkdir "$TMP2_DIR"/gd
  57.  
  58. # set default sox options
  59. export SOX_OPTS="-V1 --no-clobber --multi-threaded --buffer 134217728"
  60.  
  61. # extract zip (command line parameter) to "$TMP2_DIR"
  62. 7z x -mmt=2 "$@" -o"$TMP2_DIR"/gd
  63. cd "$TMP2_DIR"/gd
  64.  
  65. # Extract gd data to "$TMP_DIR"/
  66. if [ -f ./track05.bin ]
  67. then
  68. # rebuild iso for gd-roms with 5 tracks
  69. dd bs=352800 count=1 if=/dev/zero of="$TMP_DIR"/dcrip/pregap
  70. cat track03.bin "$TMP_DIR"/dcrip/pregap track04.raw "$TMP_DIR"/dcrip/pregap track05.bin > tmp.bin
  71. rm -rf track04.raw
  72. rm -rf track03.bin
  73. rm -rf track05.bin
  74. rm -rf "$TMP_DIR"/dcrip/pregap
  75. isofix tmp.bin 45000 > /dev/null
  76. rm -rf tmp.bin
  77. else
  78. # assume 3 tracks, cdda not handled yet
  79. isofix track03.bin 45000 > /dev/null
  80. rm -rf track03.bin
  81. fi
  82.  
  83. rm -rf ./header.iso
  84.  
  85. # get volume id & other metadata from iso
  86. VOL_ID=`file -s ./fixed.iso | sed "s/^.*'\(.*\)'.*$/\1/" | sed 's/^ *//;s/ *$//'`
  87. SYSTEM_ID=`isoinfo -d -i ./fixed.iso | grep "System id: " | sed -n "/System id: /s/System id: //p"`
  88. VOLUME_ID=`isoinfo -d -i ./fixed.iso | grep "Volume id: " | sed -n "/Volume id: /s/Volume id: //p"`
  89. VOLUME_SET_ID=`isoinfo -d -i ./fixed.iso | grep "Volume set id: " | sed -n "/Volume set id: /s/Volume set id: //p"`
  90. PUBLISHER_ID=`isoinfo -d -i ./fixed.iso | grep "Publisher id: " | sed -n "/Publisher id: /s/Publisher id: //p"`
  91. DATA_PREPARER_ID=`isoinfo -d -i ./fixed.iso | grep "Data preparer id: " | sed -n "/Data preparer id: /s/Data preparer id: //p"`
  92. APPLICATION_ID=`isoinfo -d -i ./fixed.iso | grep "Application id: " | sed -n "/Application id: /s/Application id: //p"`
  93. COPYRIGHT_FILE_ID=`isoinfo -d -i ./fixed.iso | grep "Copyright File id: " | sed -n "/Copyright File id: /s/Copyright File id: //p"`
  94. ABSTRACT_FILE_ID=`isoinfo -d -i ./fixed.iso | grep "Abstract File id: " | sed -n "/Abstract File id: /s/Abstract File id: //p"`
  95. BIBLIOGRAPHIC_FILE_ID=`isoinfo -d -i ./fixed.iso | grep "Bibliographic File id: " | sed -n "/Bibliographic File id: /s/Bibliographic File id: //p"`
  96. VOLUME_SET_SIZE=`isoinfo -d -i ./fixed.iso | grep "Volume set size is: " | sed -n "/Volume set size is: /s/Volume set size is: //p"`
  97. VOLUME_SET_NUMBER=`isoinfo -d -i ./fixed.iso | grep "Volume set sequence number is: " | sed -n "/Volume set sequence number is: /s/Volume set sequence number is: //p"`
  98.  
  99. # bin 2 iso track01
  100. bchunk track01.bin /home//dc.cue track > /dev/null
  101.  
  102. # Check if we have a custom file sort & copy it, else copy the gd-rom file sort.
  103. if [ -f /home//dcrip/filesort/$VOL_ID-filesort.txt ]
  104. then
  105. cp /home//dcrip/filesort/$VOL_ID-filesort.txt "$TMP_DIR"/dcrip/$VOL_ID-filesort.txt
  106. cp /home//dcrip/filesort/$VOL_ID-1-filesort.txt "$TMP_DIR"/dcrip/$VOL_ID-1-filesort.txt
  107. else
  108. # generate $VOL_ID-filesort.txt
  109. echo "DATA1/00.0 100000" > "$TMP_DIR/dcrip/$VOL_ID-1-filesort.txt"
  110. echo "DATA1/AUTORUN.INF 9900" >> "$TMP_DIR/dcrip/$VOL_ID-1-filesort.txt"
  111. echo "DATA1/0GDTEX.BMP 9800" >> "$TMP_DIR/dcrip/$VOL_ID-1-filesort.txt"
  112. echo "DATA1/0GDTEX.PVR 9600" >> "$TMP_DIR/dcrip/$VOL_ID-1-filesort.txt"
  113. echo "DATA2/0.0 10000" > "$TMP_DIR/dcrip/$VOL_ID-filesort.txt"
  114. # this hacky line of sed commands transforms the output of xorriso into a sort.txt that mkisofs can use
  115. # so the original gd-rom file order is preseved.
  116. xorriso -report_about SORRY -indev ./track01.iso -find . -sort_lba | grep -v "0GDTEX" | sed "s/'//g" | sed 's/^/DATA1/' | sed 's/$/\t-/' | awk '{print $0,FNR}' | sed 's/ //g' >> "$TMP_DIR/dcrip/$VOL_ID-1-filesort.txt"
  117. xorriso -report_about SORRY -indev ./fixed.iso -find . -sort_lba | grep -v "0GDTEX" | sed "s/'//g" | sed 's/^/DATA2/' | sed 's/$/\t-/' | awk '{print $0,FNR}' | sed 's/ //g' | sed 's/$/00/' >> "$TMP_DIR/dcrip/$VOL_ID-filesort.txt"
  118.  
  119. # these lines will give a plain unnumbered sort, useful for creating custom orders
  120. # xorriso -report_about SORRY -indev ./track01.iso -find . -sort_lba > "$TMP_DIR/dcrip/$VOL_ID-1-rawsort.txt"
  121. # xorriso -report_about SORRY -indev ./fixed.iso -find . -sort_lba >> "$TMP_DIR/dcrip/$VOL_ID-rawsort.txt"
  122.  
  123. fi
  124.  
  125. # extract track01
  126. xorriso -report_about SORRY -indev ./track01.iso -osirrox "on" -extract . "$TMP_DIR/dcrip/DATA1/"
  127. # set write permission, xorriso sets the dir to read only
  128. chmod +w -R "$TMP_DIR/dcrip/DATA1"
  129. # extract gd data
  130. xorriso -report_about SORRY -indev ./fixed.iso -osirrox "on" -extract . "$TMP_DIR/dcrip/DATA2/"
  131. # set write permission, xorriso sets the dir to read only
  132. chmod +w -R "$TMP_DIR/dcrip/DATA2"
  133.  
  134. # set default $FIRST_READ get name from ip.bin, trim spaces, then get modification date & remove temp file
  135. sfk partcopy bootfile.bin -fromto 0x60 0x6F "$TMP_DIR"/dcrip/1st_read.txt -yes
  136. FIRST_READ=`cat "$TMP_DIR"/dcrip/1st_read.txt | sed 's/ //g'`
  137. FIRST_DATE=`date -r "$TMP_DIR"/dcrip/DATA2/$FIRST_READ +%Y%m%d%H%M.%S`
  138. rm -f "$TMP_DIR"/dcrip/1st_read.txt
  139. if [ $FIRST_READ = "0WINCEOS.BIN" ]
  140. then
  141. # echo "Wince!! - $*" >> /home/hdd//dcrips/errors.txt
  142. # exit
  143. bincon "$TMP_DIR"/dcrip/DATA2/$FIRST_READ "$TMP_DIR"/dcrip/DATA2/$FIRST_READ.tmp
  144. rm -rf "$TMP_DIR"/dcrip/DATA2/$FIRST_READ
  145. mv "$TMP_DIR"/dcrip/DATA2/$FIRST_READ.tmp "$TMP_DIR"/dcrip/DATA2/$FIRST_READ
  146. touch -t $FIRST_DATE "$TMP_DIR"/dcrip/DATA2/$FIRST_READ
  147. fi
  148.  
  149. if [ $VOL_ID = "VIRTUA_TENNIS_2__" ]
  150. then
  151. # copy toc info for dummy file protection
  152. OFFSET1=`perl -ln0777e 'print pos() while /BIG512.BIN/g' fixed.iso`
  153. OFFSET=`expr $OFFSET1 - 42`
  154. sfk partcopy fixed.iso $OFFSET 32 "$TMP_DIR"/dcrip/toc.dat -yes
  155. sfk rep -binary /CDE4436A/09000900/ -dir "$TMP_DIR"/dcrip/DATA2/ -file 1ST_READ.BIN -yes
  156. rm -rf "$TMP_DIR"/dcrip/DATA2/BIG512.BIN
  157. touch "$TMP_DIR"/dcrip/DATA2/BIG512.BIN
  158. touch -t $FIRST_DATE "$TMP_DIR"/dcrip/DATA2/$FIRST_READ
  159. elif [ $VOL_ID = "TENNIS_2K2_______" ]
  160. then
  161. # copy toc info for dummy file protection
  162. OFFSET1=`perl -ln0777e 'print pos() while /BIG512.BIN/g' fixed.iso`
  163. OFFSET=`expr $OFFSET1 - 42`
  164. sfk partcopy fixed.iso $OFFSET 32 "$TMP_DIR"/dcrip/toc.dat -yes
  165. sfk rep -binary /CDE4436A/09000900/ -dir "$TMP_DIR"/dcrip/DATA2/ -file 1ST_READ.BIN -yes
  166. rm -rf "$TMP_DIR"/dcrip/DATA2/BIG512.BIN
  167. touch "$TMP_DIR"/dcrip/DATA2/BIG512.BIN
  168. touch -t $FIRST_DATE "$TMP_DIR"/dcrip/DATA2/$FIRST_READ
  169. elif [ $VOL_ID = "POWER_SMASH_2____" ]
  170. then
  171. # copy toc info for dummy file protection
  172. OFFSET1=`perl -ln0777e 'print pos() while /BIG512.BIN/g' fixed.iso`
  173. OFFSET=`expr $OFFSET1 - 42`
  174. sfk partcopy fixed.iso $OFFSET 32 "$TMP_DIR"/dcrip/toc.dat -yes
  175. # protection fix
  176. sfk rep -binary /CDE4436A/09000900/ -dir "$TMP_DIR"/dcrip/DATA2/ -file 1ST_READ.BIN -yes
  177. # replace dummy with 0 byte file
  178. rm -rf "$TMP_DIR"/dcrip/DATA2/BIG512.BIN
  179. touch "$TMP_DIR"/dcrip/DATA2/BIG512.BIN
  180. # set 1ST_READ modification time to the original
  181. touch -t $FIRST_DATE "$TMP_DIR"/dcrip/DATA2/$FIRST_READ
  182. elif [ $VOL_ID = "SILENT_SCOPE" ]
  183. then
  184. # copy toc info for dummy file protection
  185. OFFSET1=`perl -ln0777e 'print pos() while /SPECIAL.BIN/g' fixed.iso`
  186. OFFSET=`expr $OFFSET1 - 43`
  187. sfk partcopy fixed.iso $OFFSET 32 "$TMP_DIR"/dcrip/toc.dat -yes
  188. rm -rf "$TMP_DIR"/dcrip/DATA2/SPECIAL.BIN
  189. touch "$TMP_DIR"/dcrip/DATA2/SPECIAL.BIN
  190. fi
  191.  
  192. rm -rf fixed.iso
  193.  
  194. # generate audio track, use track 2 audio from gd & pad it for 45000 lba
  195. # convert to wav by piping through sox.
  196. AUDIO_SIZE=`stat -c %s track02.raw`
  197. SESSION_SECTORS=`expr $LBA - 11400`
  198. SESSION_SIZE=`expr $SESSION_SECTORS \* 2352`
  199. #DUMMY_SIZE=`expr $SESSION_SIZE - $AUDIO_SIZE`
  200. #dd bs=$DUMMY_SIZE count=1 if=/dev/zero of="$TMP_DIR"/dcrip/tmp.raw
  201. #cat track02.raw "$TMP_DIR"/dcrip/tmp.raw | sox -r 44100 -e signed -b 16 -c 2 -t raw - \
  202. # -r 44100 -e signed -b 16 -c 2 -t wav "$TMP_DIR"/dcrip/$VOL_ID-audio.wav
  203. #rm -rf "$TMP_DIR"/dcrip/tmp.raw
  204. rm -rf track*.*
  205. #echo "CD_ROM_XA" > "$TMP_DIR"/dcrip/$VOL_ID-audio.toc
  206. #echo "" >> "$TMP_DIR"/dcrip/$VOL_ID-audio.toc
  207. #echo "TRACK AUDIO" >> "$TMP_DIR"/dcrip/$VOL_ID-audio.toc
  208. #echo "AUDIOFILE \"$VOL_ID-audio.wav\" 0" >> "$TMP_DIR"/dcrip/$VOL_ID-audio.toc
  209.  
  210. # remove warning & useless files
  211. rm -rf "$TMP_DIR"/dcrip/DATA2/*.DA
  212. rm -rf "$TMP_DIR"/dcrip/DATA2/IP.BIN
  213. rm -rf "$TMP_DIR"/dcrip/DATA2/IP0000.BIN
  214. rm -rf "$TMP_DIR"/dcrip/DATA1/*.DA
  215. rm -rf "$TMP_DIR"/dcrip/DATA1/IP.BIN
  216. rm -rf "$TMP_DIR"/dcrip/DATA1/IP0000.BIN
  217.  
  218. # copy bootfile
  219. mv ./bootfile.bin "$TMP_DIR"/dcrip/IP.BIN
  220. cd "$TMP_DIR"/dcrip/
  221.  
  222. # remove "$TMP2_DIR"
  223. rm -rf "$TMP2_DIR"/gd
  224.  
  225. # game specific hacks
  226. if [ $VOL_ID = "THE_TYPING_OF_THE_DEAD" ]
  227. then
  228. # remove garbage data
  229. rm -rf ./DATA2/PJWJFCFF.ADX
  230. rm -rf ./DATA2/QJVLTRPQ.ADX
  231. rm -rf ./DATA2/QKEFIBMS.ADX
  232. rm -rf ./DATA2/QLHLCGXO.ADX
  233. rm -rf ./DATA2/ROWCOUFN.ADX
  234. rm -rf ./DATA2/RSVTSJTR.ADX
  235. rm -rf ./DATA2/RVBMIRHK.ADX
  236. rm -rf ./DATA2/SOPLDNMI.ADX
  237. rm -rf ./DATA2/THQAFGPU.ADX
  238. rm -rf ./DATA2/TIEROMCA.ADX
  239. rm -rf ./DATA2/UMLPTBTL.ADX
  240. rm -rf ./DATA2/UPPBWOJU.ADX
  241. rm -rf ./DATA2/VDEPEXIN.ADX
  242. rm -rf ./DATA2/VFJHWIHT.ADX
  243. rm -rf ./DATA2/VYXPMFPI.ADX
  244. rm -rf ./DATA2/WGENOWNJ.ADX
  245. rm -rf ./DATA2/WRTCWGJV.ADX
  246. rm -rf ./DATA2/WVFJYHTA.ADX
  247. rm -rf ./DATA2/XGJLSFXY.ADX
  248. rm -rf ./DATA2/XICOOGBL.ADX
  249. rm -rf ./DATA2/XTMQXIIJ.ADX
  250. rm -rf ./DATA2/ZOMBIE01.AFS
  251. rm -rf ./DATA2/ZOMBIE02.AFS
  252. rm -rf ./DATA2/ZOMBIE03.AFS
  253. rm -rf ./DATA2/ZOMBIE04.AFS
  254. rm -rf ./DATA2/ZOMBIE05.AFS
  255. rm -rf ./DATA2/ZOMBIE06.AFS
  256. rm -rf ./DATA2/ZOMBIE07.AFS
  257. rm -rf ./DATA2/ZOMBIE08.AFS
  258. rm -rf ./DATA2/ZOMBIE09.AFS
  259. rm -rf ./DATA2/ZOMBIE10.AFS
  260. rm -rf ./DATA2/ZOMBIE11.AFS
  261. rm -rf ./DATA2/ZOMBIE12.AFS
  262. rm -rf ./DATA2/ZOMBIE13.AFS
  263. rm -rf ./DATA2/ZOMBIE14.AFS
  264. rm -rf ./DATA2/ZOMBIE15.AFS
  265. rm -rf ./DATA2/ZOMBIE16.AFS
  266. rm -rf ./DATA2/ZOMBIE17.AFS
  267. rm -rf ./DATA2/ZOMBIE18.AFS
  268. rm -rf ./DATA2/ZOMBIE19.AFS
  269. rm -rf ./DATA2/ZOMBIE20.AFS
  270. rm -rf ./DATA2/ZOMBIE21.AFS
  271. rm -rf ./DATA2/STAGE1.AFS
  272. rm -rf ./DATA2/STAGE2.AFS
  273. rm -rf ./DATA2/STAGE3.AFS
  274. rm -rf ./DATA2/STAGE4.AFS
  275. rm -rf ./DATA2/STAGE5.AFS
  276. rm -rf ./DATA2/STAGE6.AFS
  277. rm -rf ./DATA2/STAGE_TRN.AFS
  278. rm -rf ./DATA2/AJLAJOPT.AFS
  279. rm -rf ./DATA2/ALIKXTCI.AFS
  280. rm -rf ./DATA2/EKKPVIDS.AFS
  281. rm -rf ./DATA2/EVTEUEUH.AFS
  282. rm -rf ./DATA2/GMJPVVLO.AFS
  283. rm -rf ./DATA2/GNCTCVIH.AFS
  284. rm -rf ./DATA2/HBGDEPFL.AFS
  285. rm -rf ./DATA2/HSIJULRG.AFS
  286. rm -rf ./DATA2/KANWAIHO.AFS
  287. rm -rf ./DATA2/KMKWWCTS.AFS
  288. rm -rf ./DATA2/KTMIGQHX.AFS
  289. rm -rf ./DATA2/LIHKFEXJ.AFS
  290. rm -rf ./DATA2/OBPAAIKC.AFS
  291. rm -rf ./DATA2/OSXDIRXU.AFS
  292. rm -rf ./DATA2/PHQDVGCE.AFS
  293. rm -rf ./DATA2/PJWJFCFF.AFS
  294. rm -rf ./DATA2/QLHLCGXO.AFS
  295. rm -rf ./DATA2/TIEROMCA.AFS
  296. rm -rf ./DATA2/VDEPEXIN.AFS
  297. rm -rf ./DATA2/WVFJYHTA.AFS
  298. rm -rf ./DATA2/XGJLSFXY.AFS
  299.  
  300. elif [ $VOL_ID = "OUTTRIGGER" ]
  301. then
  302. # protection fix
  303. sfk rep -binary /CDEB22D1/090022D1/ -dir ./DATA2/ -file "$FIRST_READ" -yes
  304. touch -t $FIRST_DATE ./DATA2/$FIRST_READ
  305.  
  306. elif [ $VOL_ID = "UFCPAL10001" ]
  307. then
  308. # protection fix
  309. sfk rep -binary /15D330300189/15D318000189/ -dir ./DATA2/ -file "$FIRST_READ" -yes
  310. sfk rep -binary /406320330189/406318000189/ -dir ./DATA2/ -file "$FIRST_READ" -yes
  311. touch -t $FIRST_DATE ./DATA2/$FIRST_READ
  312. rm -rf /tmp/dcrip/DATA2/Z500MB.ZZZ
  313. dd bs=1908900 count=1 if=/dev/zero of=./DATA2/Z500MB.ZZZ
  314. elif [ $VOL_ID = "ULTIMATE_FIGHTING_CHAMPIONSHIP" ]
  315. then
  316. # japan
  317. # protection fix
  318. sfk rep -binary /15D330300189/15D318000189/ -dir ./DATA2/ -file "$FIRST_READ" -yes
  319. sfk rep -binary /406320330189/406318000189/ -dir ./DATA2/ -file "$FIRST_READ" -yes
  320. touch -t $FIRST_DATE ./DATA2/$FIRST_READ
  321. dd bs=2710814 count=1 if=/dev/zero of=./DATA2/Z700MB.ZZZ
  322. touch -t $FIRST_DATE ./DATA2/$FIRST_READ
  323. elif [ $VOL_ID = "UFCMASTER10011" ]
  324. then
  325. # USA
  326. # protection fix
  327. sfk rep -binary /15D330300189/15D318000189/ -dir ./DATA2/ -file "$FIRST_READ" -yes
  328. sfk rep -binary /406320330189/406318000189/ -dir ./DATA2/ -file "$FIRST_READ" -yes
  329. touch -t $FIRST_DATE ./DATA2/$FIRST_READ
  330. dd bs=2710814 count=1 if=/dev/zero of=./DATA2/Z700MB.ZZZ
  331. touch -t $FIRST_DATE ./DATA2/$FIRST_READ
  332.  
  333. elif [ $VOL_ID = "SOULCALIBUR" ]
  334. then
  335. cd ./DATA2/
  336. # find P16 audio files
  337. # raw pcm signed le 16bit 44.1khz
  338. for fl in *R.P16
  339. do
  340. # downmix 16bit audio to mono
  341. SIZE=`stat -c %s $fl`
  342. if [ $SIZE -gt 1 ]
  343. then
  344. # strip last chars from file name
  345. pr=$(echo $fl | sed -e 's/.....$//')
  346. # use sox to mix both channels into a mono channel
  347. # need to specify file format, because these are raw files, no header
  348. # use mix-power to maintain same volume as input
  349. # dither with noise shaping to reduce effect of downsampling
  350. sox -G --combine mix-power \
  351. -r 44100 -e signed -b 16 -c 1 -t raw "$pr"L.P16 \
  352. -r 44100 -e signed -b 16 -c 1 -t raw "$pr"R.P16 \
  353. -r 44100 -e signed -b 16 -c 1 -t raw "$pr"M.P16 dither -s
  354. # remove old files
  355. RDATE=`date -r "$pr"R.P16 +%Y%m%d%H%M.%S`
  356. LDATE=`date -r "$pr"L.P16 +%Y%m%d%H%M.%S`
  357. rm -f "$pr"R.P16
  358. rm -f "$pr"L.P16
  359. mv "$pr"M.P16 "$pr"L.P16
  360. ln "$pr"L.P16 "$pr"R.P16
  361. touch -t $LDATE "$pr"L.P16
  362. touch -t $RDATE "$pr"R.P16
  363. fi
  364. done
  365. # find P08 audio file
  366. # raw pcm signed le 8bit 44.1khz
  367. # there's only one & it's repeated in 16bit,
  368. # probably a dummy, but downmix it anyway
  369. for fl in *R.P08
  370. do
  371. # strip last chars from file name
  372. pr=$(echo $fl | sed -e 's/.....$//')
  373. # use sox to mix both channels into a mono channel
  374. # need to specify file format, because these are raw files, no header
  375. # use mix-power to maintain same volume as input
  376. # dither with noise shaping to reduce effect of downsampling
  377. sox -G --combine mix-power \
  378. -r 44100 -e signed -b 8 -c 1 -t raw "$pr"L.P08 \
  379. -r 44100 -e signed -b 8 -c 1 -t raw "$pr"R.P08 \
  380. -r 44100 -e signed -b 8 -c 1 -t raw "$pr"M.P08 dither -s
  381. # remove old files
  382. RDATE=`date -r "$pr"R.P08 +%Y%m%d%H%M.%S`
  383. LDATE=`date -r "$pr"L.P08 +%Y%m%d%H%M.%S`
  384. rm -f "$pr"R.P08
  385. rm -f "$pr"L.P08
  386. mv "$pr"M.P08 "$pr"L.P08
  387. ln "$pr"L.P08 "$pr"R.P08
  388. touch -t $LDATE "$pr"L.P08
  389. touch -t $RDATE "$pr"R.P08
  390. done
  391. cd ..
  392.  
  393. elif [ $VOL_ID = "DONALD_DUCK_QUACK_ATTACK" ]
  394. then
  395. # data/data german & italian intro videos to first session
  396. mv ./DATA2/INTROAL.SFD ./DATA1/INTROAL.SFD
  397. mv ./DATA2/INTROIT.SFD ./DATA1/INTROIT.SFD
  398. elif [ $VOL_ID = "DONALD1" ]
  399. then
  400. # usa version - goin' quackers
  401. mv ./DATA2/INTROAL.SFD ./DATA1/INTROAL.SFD
  402. mv ./DATA2/INTROIT.SFD ./DATA1/INTROIT.SFD
  403.  
  404. elif [ $VOL_ID = "CANNON_SPIKE" ]
  405. then
  406. rm ./DATA1/DMY.BIN
  407.  
  408. elif [ $VOL_ID = "JIMMY_WHITES_2_CUEBALL" ]
  409. then
  410. rm ./DATA1/PADDINGA.PAD
  411.  
  412. elif [ $VOL_ID = "CHICKENRUN" ]
  413. then
  414. rm ./DATA1/PAD.DAT
  415.  
  416. elif [ $VOL_ID = "GUNBIRD2" ]
  417. then
  418. rm ./DATA1/DUMMY.DAT
  419.  
  420. elif [ $VOL_ID = "JOJO" ]
  421. then
  422. rm ./DATA1/DUMMY.DAT
  423.  
  424. elif [ $VOL_ID = "MTVSKATE" ]
  425. then
  426. rm ./DATA1/DCVOICE.DA
  427. mv ./DATA2/MTV_LRV.SFD ./DATA1/
  428. mv ./DATA2/FLH_LRV.SFD ./DATA1/
  429. echo "DATA1/MTV_LRV.SFD -100" >> "$TMP_DIR/dcrip/$VOL_ID-1-filesort.txt"
  430. echo "DATA1/FLH_LRV.SFD -110" >> "$TMP_DIR/dcrip/$VOL_ID-1-filesort.txt"
  431. fi
  432.  
  433. # shrink .afs files
  434. find ./ -name *.AFS -type f -exec /home//bin/afsshrink.sh '{}' \;
  435.  
  436. # deduplicate & relink files
  437. /usr/share/fslint/fslint/findup -m
  438.  
  439. # 60hz pal patch if game isn't pal...
  440. PAL=""
  441. PAL=$(grep "EUROPE" IP.BIN)
  442. if [ "$PAL" = "" ]
  443. then
  444. echo "60hz PAL Patch"
  445. sfk rep -binary /A001E403A002E401A003/A000E403A000E401A000/ -dir ./DATA2/ -file "$FIRST_READ" -yes
  446. touch -t $FIRST_DATE ./DATA2/$FIRST_READ
  447. fi
  448.  
  449. # copy "$FIRST_READ" so binhack works, don't use binhacked copy, no need
  450. cp ./DATA2/"$FIRST_READ" .
  451.  
  452. # binhack, this is just for the IP.BIN so we remove "$FIRST_READ" after
  453. echo -e "$FIRST_READ\nIP.BIN\n$LBA\n" | binhack32
  454. rm -rf ./$FIRST_READ
  455.  
  456. #if [ -f "./DATA2/0GDTEX.PVR" ]
  457. if [ true = false ]
  458. then
  459. # convert disc icon with pvr2png & image magick, then generate autorun.inf
  460. cd ./DATA2/
  461. OGD_DATE=`date -r ./0GDTEX.PVR +%Y%m%d%H%M.%S`
  462. wine /home//Downloads/Pvr2Png.exe 0GDTEX.PVR 0GDTEX.PNG > /dev/null
  463. convert 0GDTEX.PNG -background "#FFFFFF" ../DATA1/0GDTEX.BMP
  464. # flip it
  465. ### convert 0GDTEX.PNG -background "#FFFFFF" -flip -flop ../DATA1/0GDTEX.BMP
  466. touch -t $OGD_DATE ../DATA1/0GDTEX.BMP
  467. LABEL=`echo $VOL_ID | sed 's/_/ /g' | sed 's/\(.*\)/\L\1/' | sed 's/\<./\U&/g'`
  468. echo -e "[autorun]\r\nlabel=$LABEL\r\nicon=0GDTEX.BMP\r\n" > ../DATA1/AUTORUN.INF
  469. touch -t $FIRST_DATE ../DATA1/AUTORUN.INF
  470. # convert 0gdtex into a logo.mr to insert into ip.bin
  471. convert 0GDTEX.PNG -background "#C3C3C3" -filter Lanczos -distort Resize 90X90 -alpha Remove -colors 128 ../logo.png
  472. # flip it
  473. ### convert 0GDTEX.PNG -background "#C3C3C3" -filter Lanczos -distort Resize 90X90 -alpha Remove -flip -flop -colors 128 ../logo.png
  474.  
  475. rm -rf 0GDTEX.PNG
  476. mv 0GDTEX.PVR ../DATA1/
  477. cd ..
  478. pngtomr logo.png logo.mr
  479. logoinsert logo.mr IP.BIN
  480. rm -rf logo.*
  481. fi
  482.  
  483.  
  484. #### BUILD SESSION 1 (DATA)
  485.  
  486. echo "CD_ROM_XA" > "$TMP_DIR"/dcrip/$VOL_ID-data1.toc
  487. echo "" >> "$TMP_DIR"/dcrip/$VOL_ID-data1.toc
  488. echo "TRACK MODE2_FORM1" >> "$TMP_DIR"/dcrip/$VOL_ID-data1.toc
  489. echo "DATAFILE \"$VOL_ID-data1.iso\"" >> "$TMP_DIR"/dcrip/$VOL_ID-data1.toc
  490. # create first test iso to see how big the dummy should be
  491. mkisofs -quiet -G IP.BIN -sort $VOL_ID-1-filesort.txt -hide 00.0 -l -V "$VOLUME_ID" -sysid "$SYSTEM_ID" -A "$APPLICATION_ID" -volset "$VOLUME_SET_ID" -volset-size "$VOLUME_SET_SIZE" -volset-seqno "$VOLUME_SET_NUMBER" -publisher "$PUBLISHER_ID" -p "$DATA_PREPARER_ID" -copyright "$COPYRIGHT_FILE_ID" -abstract "$ABSTRACT_FILE_ID" -biblio "$BIBLIOGRAPHIC_FILE_ID" -o $VOL_ID-data1.iso DATA1/
  492.  
  493. # get test iso size
  494. GAME_SIZE=`stat -c %s $VOL_ID-data1.iso`
  495. # delete temporary iso with no dummy, we're done with it
  496. rm -rf ./$VOL_ID-data1.iso
  497. # convert size to cd sectors
  498. GAME_SECTORS=`expr $GAME_SIZE / 2048`
  499. DUMMY_SECTORS=`expr $SESSION_SECTORS - $GAME_SECTORS`
  500. # multiply by 2048 to find out how big the dummy file should be in bytes
  501. DUMMY_SIZE=`expr $DUMMY_SECTORS \* 2048`
  502.  
  503. if [ $DUMMY_SIZE -lt 0 ]
  504. then
  505. echo "1st session too big! - $@ = $GAME_SIZE bytes, need to lose $DUMMY_SIZE bytes"
  506. exit 1
  507. fi
  508.  
  509. # create dummy file
  510. dd bs=$DUMMY_SIZE count=1 if=/dev/zero of=./DATA1/00.0
  511.  
  512. # make real iso
  513. mkisofs -quiet -G IP.BIN -sort $VOL_ID-1-filesort.txt -hide 00.0 -l -V "$VOLUME_ID" -sysid "$SYSTEM_ID" -A "$APPLICATION_ID" -volset "$VOLUME_SET_ID" -volset-size "$VOLUME_SET_SIZE" -volset-seqno "$VOLUME_SET_NUMBER" -publisher "$PUBLISHER_ID" -p "$DATA_PREPARER_ID" -copyright "$COPYRIGHT_FILE_ID" -abstract "$ABSTRACT_FILE_ID" -biblio "$BIBLIOGRAPHIC_FILE_ID" -o $VOL_ID-data1.iso DATA1/
  514.  
  515. DATADATA="-M $VOL_ID-data1.iso"
  516.  
  517.  
  518. #### BUILD SESSION 2 (DATA)
  519.  
  520. # create first test iso to see how big the dummy should be
  521. mkisofs -quiet -G IP.BIN -sort $VOL_ID-filesort.txt -hide 0.0 -C 0,45000 $DATADATA -l -V "$VOLUME_ID" -sysid "$SYSTEM_ID" -A "$APPLICATION_ID" -volset "$VOLUME_SET_ID" -volset-size "$VOLUME_SET_SIZE" -volset-seqno "$VOLUME_SET_NUMBER" -publisher "$PUBLISHER_ID" -p "$DATA_PREPARER_ID" -copyright "$COPYRIGHT_FILE_ID" -abstract "$ABSTRACT_FILE_ID" -biblio "$BIBLIOGRAPHIC_FILE_ID" -o $VOL_ID-data.iso DATA2/
  522.  
  523. # get test iso size
  524. GAME_SIZE=`stat -c %s $VOL_ID-data.iso`
  525. # delete temporary iso with no dummy, we're done with it
  526. #rm -rf ./$VOL_ID-data.iso
  527. # maximum possible sectors, 4500 sectors per minute of audio
  528. CDR_SECTORS=`expr $CDR_MINS \* 4500`
  529. # more realistic, most manufacturers leave you a few sectors short
  530. # 20 should be safe
  531. CDR_SECTORS=`expr $CDR_SECTORS - 20`
  532. # convert that to cd sectors
  533. GAME_SECTORS=`expr $GAME_SIZE / 2048`
  534. # add session start, pregap & 2
  535. DISC_SECTORS=`expr $GAME_SECTORS + $LBA + 150 + 2`
  536. # difference between maximum space allowed & what we have so far, in cd sectors
  537. DUMMY_SECTORS=`expr $CDR_SECTORS - $DISC_SECTORS`
  538. # multiply by 2048 to find out how big the dummy file should be in bytes
  539. DUMMY_SIZE=`expr $DUMMY_SECTORS \* 2048`
  540.  
  541. if [ $DUMMY_SIZE -lt 0 ]
  542. then
  543. if [ $DUMMY_SIZE -lt -68000000 ]
  544. then
  545. SIZE=`expr $DUMMY_SIZE + 68000000`
  546. echo "$@ Game too big! = $GAME_SIZE bytes, need to lose $SIZE bytes" >> ~/dcrips.bad.txt
  547. else
  548. echo "$@ 2nd session too big! = $GAME_SIZE bytes, move $DUMMY_SIZE bytes to first session" >> ~/dcrips.fix.txt
  549. fi
  550. exit 1
  551. else
  552. echo "$@ OK, game fits = $GAME_SIZE bytes, dummy is $DUMMY_SIZE bytes" >> ~/dcrips.txt
  553. exit
  554. fi
  555.  
  556. # create dummy file
  557. dd bs=$DUMMY_SIZE count=1 if=/dev/zero of=./DATA2/0.0
  558.  
  559. # make real iso
  560. mkisofs -quiet -G IP.BIN -sort $VOL_ID-filesort.txt -hide 0.0 -C 0,45000 $DATADATA -l -V "$VOLUME_ID" -sysid "$SYSTEM_ID" -A "$APPLICATION_ID" -volset "$VOLUME_SET_ID" -volset-size "$VOLUME_SET_SIZE" -volset-seqno "$VOLUME_SET_NUMBER" -publisher "$PUBLISHER_ID" -p "$DATA_PREPARER_ID" -copyright "$COPYRIGHT_FILE_ID" -abstract "$ABSTRACT_FILE_ID" -biblio "$BIBLIOGRAPHIC_FILE_ID" -o $VOL_ID-data.iso DATA2/
  561.  
  562. exit
  563.  
  564. # remove files
  565. rm -rf "$TMP_DIR"/dcrip/DATA2
  566. rm -rf "$TMP_DIR"/dcrip/DATA1
  567. rm -rf "$TMP_DIR"/dcrip/IP.BIN
  568.  
  569. if [ $VOL_ID = "VIRTUA_TENNIS_2__" ]
  570. then
  571. # copy toc info for dummy file protection
  572. OFFSET1=`perl -ln0777e 'print pos() while /BIG512.BIN/g' $VOL_ID-data.iso`
  573. # above command gets us the offset of the end of the filename
  574. # we need the 32 bytes from before the start of the filename
  575. OFFSET=`expr $OFFSET1 - 42`
  576. sfk partcopy toc.dat 0 32 $VOL_ID-data.iso $OFFSET -yes
  577. rm -rf toc.dat
  578. elif [ $VOL_ID = "TENNIS_2K2_______" ]
  579. then
  580. # copy toc info for dummy file protection
  581. OFFSET1=`perl -ln0777e 'print pos() while /BIG512.BIN/g' $VOL_ID-data.iso`
  582. OFFSET=`expr $OFFSET1 - 42`
  583. sfk partcopy toc.dat 0 32 $VOL_ID-data.iso $OFFSET -yes
  584. rm -rf toc.dat
  585. elif [ $VOL_ID = "POWER_SMASH_2____" ]
  586. then
  587. # copy toc info for dummy file protection
  588. OFFSET1=`perl -ln0777e 'print pos() while /BIG512.BIN/g' $VOL_ID-data.iso`
  589. OFFSET=`expr $OFFSET1 - 42`
  590. sfk partcopy toc.dat 0 32 $VOL_ID-data.iso $OFFSET -yes
  591. rm -rf toc.dat
  592. elif [ $VOL_ID = "SILENT_SCOPE" ]
  593. then
  594. # copy toc info for dummy file protection
  595. OFFSET1=`perl -ln0777e 'print pos() while /SPECIAL.BIN/g' $VOL_ID-data.iso`
  596. OFFSET=`expr $OFFSET1 - 43`
  597. sfk partcopy toc.dat 0 32 $VOL_ID-data.iso $OFFSET -yes
  598. rm -rf toc.dat
  599. fi
  600.  
  601. umount /run/media//*
  602.  
  603. if [ -f "$VOL_ID-data1.iso" ]
  604. then
  605. # burn data 1st session, sao mode
  606. echo "data"
  607. #### cdrecord dev=$CDROM_ID driveropts=noburnfree -multi -xa $VOL_ID-data1.iso speed=24
  608. cdrdao write --multi --speed 32 --device $CDROM_ID $VOL_ID-data1.toc
  609. elif [ -f $VOL_ID-audio.wav ]
  610. then
  611. # burn audio 1st session
  612. echo "audio"
  613. ### cdrecord dev=$CDROM_ID driveropts=noburnfree -multi -audio $VOL_ID-audio.wav speed=24
  614. cdrdao write --multi --speed 32 --device $CDROM_ID $VOL_ID-audio.toc
  615. fi
  616.  
  617. # burn data 2nd session, tao mode - needed for some writers
  618. cdrecord dev=$CDROM_ID -tao driveropts=noburnfree -xa $VOL_ID-data.iso speed=32
  619.  
  620. # remove temp directory
  621. cd /home//dcrips
  622. rm -rf "$TMP_DIR"/
  623. rm -rf "$TMP2_DIR"/
  624.  
  625. cd ../..
  626.  
  627. # start disc juggler
  628. wine /home/hdd//.wine/drive_c/Program\ Files\ \(x86\)/Padus/DiscJuggler/Cdj.exe
  629. fi
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement