<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://darkrealm-wiki.darkrealm.dyndns.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Chris</id>
	<title>darkrealm Wiki - Benutzerbeiträge [de]</title>
	<link rel="self" type="application/atom+xml" href="https://darkrealm-wiki.darkrealm.dyndns.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Chris"/>
	<link rel="alternate" type="text/html" href="https://darkrealm-wiki.darkrealm.dyndns.org/index.php/Spezial:Beitr%C3%A4ge/Chris"/>
	<updated>2026-05-10T15:01:47Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.45.1</generator>
	<entry>
		<id>https://darkrealm-wiki.darkrealm.dyndns.org/index.php?title=Dreamcast&amp;diff=4877</id>
		<title>Dreamcast</title>
		<link rel="alternate" type="text/html" href="https://darkrealm-wiki.darkrealm.dyndns.org/index.php?title=Dreamcast&amp;diff=4877"/>
		<updated>2026-05-05T21:55:50Z</updated>

		<summary type="html">&lt;p&gt;Chris: /* Draft */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== CDR Sizes ==&lt;br /&gt;
&lt;br /&gt;
80min/700MB: 1st Session 674MB Maximum&lt;br /&gt;
&lt;br /&gt;
90min/800MB: max 748MB when 45000 Sectors in 1st Session with dummy burn&lt;br /&gt;
&lt;br /&gt;
90min/800MB: max ~735MB when 45000 Sectors in 1st Session&lt;br /&gt;
&lt;br /&gt;
== Access Files on CDI Images ==&lt;br /&gt;
&lt;br /&gt;
# Extract the seperate Track first&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cdirip &amp;lt;CDIFILE&amp;gt;.cdi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# In case of 2nd Data Track, fix the LBA first&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
isofix &amp;lt;TRACK02&amp;gt;.iso &amp;lt;LBA Value reported by cdirip&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== What binhack does ==&lt;br /&gt;
&lt;br /&gt;
Changes LBA Value at offset 1461904 ( 8 Bytes before CD001 string) from 6EB0 (45166) to LBA Value+166 specified during binhack.&lt;br /&gt;
&lt;br /&gt;
Adds Region Codes for JAP,EUR and USA and strings for that.&lt;br /&gt;
Adds some bootcode, probably SH4 ASM to make the GDROM accept CDRs.&lt;br /&gt;
&lt;br /&gt;
== What cdda does ==&lt;br /&gt;
&lt;br /&gt;
Changes some bytes, probably SH4 ASM to enable playback of CDDA tracks.&lt;br /&gt;
&lt;br /&gt;
== What dahack does ==&lt;br /&gt;
&lt;br /&gt;
Changes LBA Values at offsets 1301408,1302380 and 1461904. First 2 offsets get rewritten from 5EB0 (45150) to 9600 (150). Third offset gets rewritten from 6EB0 (45166) to LBA Value+166 specified during dahack. 3rd offset change is basically the same what binhack does.&lt;br /&gt;
&lt;br /&gt;
== What hack3 does ==&lt;br /&gt;
&lt;br /&gt;
Changes LBA Values at offsets 1301408,1302380 and 1461904. First 2 offsets get rewritten from 5EB0 (45150) to LBA Value+150 specified during dahack. Third offset gets rewritten from 6EB0 (45166) to LBA Value+166 specified during dahack. 3rd offset change is basically the same what binhack does.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Another Copy Protection ==&lt;br /&gt;
&lt;br /&gt;
Searching for CDE4 036A (or CDE4 436A) and replacing with 0900 0900 is another Copy Protection defeat.&lt;br /&gt;
&lt;br /&gt;
CDE4 436A -&amp;gt; 0900 0900&lt;br /&gt;
1032 0D8B -&amp;gt; 0800 0D8B&lt;br /&gt;
&lt;br /&gt;
== LBA 45000 Trick ==&lt;br /&gt;
&lt;br /&gt;
69120000 bytes in first session will result in LBA 45000.&lt;br /&gt;
&lt;br /&gt;
== Fill 1st Session ISO File to 69120000 bytes with zeros ==&lt;br /&gt;
&lt;br /&gt;
6912000 bytes = 33750 2048-byte-sectors&lt;br /&gt;
&lt;br /&gt;
CORRECTION : Must be 33598 Sectors !!! = 68808703 bytes&lt;br /&gt;
&lt;br /&gt;
1st Session Leadout = 11250 Sectors = 23040000 Bytes&lt;br /&gt;
&lt;br /&gt;
2nd Session will start at Sector 45000&lt;br /&gt;
&lt;br /&gt;
When using extract.exe, add 150 Sectors to LBA reported in gdinfo_FG.exe track05&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dd if=/dev/zero of=&amp;lt;ISOFILE&amp;gt; bs=1 count=1 seek=69119999&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Creating &amp;amp; Burning DATA/DATA ISOs ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Merging track03 &amp;amp; track05 into one file ==&lt;br /&gt;
&lt;br /&gt;
Create dummy file first&lt;br /&gt;
Calculate 1185760800 - &amp;lt;SIZE OF track03.bin + SIZE OF track05.bin&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dd if=/dev/zero bs=1 count=0 seek=&amp;lt;RESULT&amp;gt; of=dummy.bin&lt;br /&gt;
cat track03.bin dummy.bin track05.bin &amp;gt; combined.bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This also helps when extract.exe only outputs garbage out of track03.iso along with track05.iso. This way only the combined.iso needs to be extracted.&lt;br /&gt;
&lt;br /&gt;
== Burning DATA/DATA CDIs ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cdirip &amp;lt;CDIFile&amp;gt; &amp;lt;Destination Directory&amp;gt;&lt;br /&gt;
cdrecord dev=/dev/sr0 -v -multi -tao -xa tdata01.iso&lt;br /&gt;
cdrecord dev=/dev/sr0 -v -tao -xa tdata02.iso&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Full rip process from GD-ROM to CD-ROM ==&lt;br /&gt;
&lt;br /&gt;
=== Get GDROM Data from Dreamcast with http-ack ===&lt;br /&gt;
&lt;br /&gt;
https://www.gotwalls.com&lt;br /&gt;
&lt;br /&gt;
https://github.com/sega-dreamcast/httpd-ack&lt;br /&gt;
&lt;br /&gt;
# Boot HTTP-ack from CD&lt;br /&gt;
# Swap HTTP-ack CD with Original GD-ROm&lt;br /&gt;
# Connect via Browser to http://192.168.1.30&lt;br /&gt;
# Download all files starting with track03.bin&lt;br /&gt;
# Download disc.gdi&lt;br /&gt;
&lt;br /&gt;
=== Extract Data from Tracks ===&lt;br /&gt;
&lt;br /&gt;
==== Use gditools ====&lt;br /&gt;
&lt;br /&gt;
https://sourceforge.net/projects/dcisotools/&lt;br /&gt;
&lt;br /&gt;
Either use GUI or gditools.py&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
python2.7 ./gditools.py &lt;br /&gt;
Usage: ./gditools.py -i input_gdi [options]&lt;br /&gt;
&lt;br /&gt;
  -h, --help             Display this help&lt;br /&gt;
  -l, --list             List all files in the filesystem and exit&lt;br /&gt;
  -o [outdir]            Output directory. Default: gdi folder&lt;br /&gt;
  -s [filename]          Create a sorttxt file with custom name&lt;br /&gt;
                           (It uses *data-folder* as prefix)&lt;br /&gt;
  -b [ipname]            Dump the ip.bin with custom name&lt;br /&gt;
  -e [filename]          Dump a single file from the filesystem&lt;br /&gt;
  --extract-all          Dump all the files in the *data-folder*&lt;br /&gt;
  --data-folder [name]   *data-folder* subfolder. Default: data&lt;br /&gt;
                           (__volume_label__ --&amp;gt; Use ISO9660 volume label)&lt;br /&gt;
  --sort-spacer [num]    Sorttxt entries are sperated by num&lt;br /&gt;
  --silent               Minimal verbosity mode&lt;br /&gt;
  [no option]            Display gdi infos if not silent&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
gditools.py by FamilyGuy, http://sourceforge.net/p/dcisotools/&lt;br /&gt;
    Licensed under GPLv3, see licences folder.&lt;br /&gt;
&lt;br /&gt;
iso9660.py  by Barney Gale, http://github.com/barneygale&lt;br /&gt;
    Licensed under a BSD-based license, see licences folder.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
python2.7 ./gditools.py -i &amp;lt;disc.gdi&amp;gt; --extract-all -o /mnt/development/dreamcast/rips/orgs/&amp;lt;GAME_NAME&amp;gt;/&amp;lt;CD Number&amp;gt; --data-folder __volume_label__ -s sort.txt -b ip.bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Old way ====&lt;br /&gt;
# If the game contains more than track03.bin, combine the 2 binfiles into 1:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cat track03.bin dummy.bin track05.bin &amp;gt; &amp;lt;BINFILE&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
# Convert .BIN Files to .ISO Files first with bin2iso.exe&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bin2iso.exe &amp;lt;BINFILE&amp;gt; &amp;lt;ISOFILE&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
# Extract Data from .ISO files&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
extract.exe &amp;lt;ISOFILE&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
If extracted 1ST_READ.BIN has filesize of 0, LBA of track05 is wrong.&lt;br /&gt;
&lt;br /&gt;
=== Downsampling ===&lt;br /&gt;
&lt;br /&gt;
==== AFS Files ====&lt;br /&gt;
&lt;br /&gt;
https://sizious.com/download/dreamcast/&lt;br /&gt;
&lt;br /&gt;
AFS files contain multiple ADX files combined into one AFS file.&lt;br /&gt;
&lt;br /&gt;
compact AFS with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
AFSCompactor.exe&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
for Alone in the Dark - The New Nightmare .XA files are AFS files, rename first with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rename .XA .afs *.XA&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
then compact and rename back to .XA:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rename .afs .XA *.afs&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
AFSCompactor.exe will rename files inside .afs to file0001 etc... AITD4 doesnt seem to care.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
extract AFS with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
afs_extract.exe *.afs|*.XA&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
or&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
afsextract.exe -sc afsfile|XAfile&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
or&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
afsutils_v2.exe | rename .XA files to .afs beforehand.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== SFD Movies ====&lt;br /&gt;
&lt;br /&gt;
http://www.dc-swat.ru/page/download/&lt;br /&gt;
&lt;br /&gt;
Demux video to .m1v and audio to .wav first&lt;br /&gt;
&lt;br /&gt;
Example (play around with bitrates):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for f in &amp;lt;SFD Files&amp;gt;; do ffmpeg -i $f -vcodec mpeg1video -b:v 2600k -minrate 2600k -maxrate 3600k -y $f.m1v -acodec adpcm_ima_wav -y $f.wav ; done&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Open all .wavs in single Audacity project and mass export again, 16bit and 44100 Hz.&lt;br /&gt;
&lt;br /&gt;
Start Dreamcast Movie Converter and remux/reencode to .SFD. Dont use batch processing, videos get truncated!&lt;br /&gt;
&lt;br /&gt;
==== 4XM Movies ====&lt;br /&gt;
&lt;br /&gt;
http://samples.mplayerhq.hu/game-formats/4xm/&lt;br /&gt;
&lt;br /&gt;
Convert to AVI first with ffmpeg&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for i in ../rips/unmodified/aitd4/cd2/AITD4_GD_2/MOVIES/*.4XM; do ffmpeg -i &amp;quot;$i&amp;quot; -vf scale=320x160 -y &amp;quot;${i%.*}.avi&amp;quot;; done&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Downsample with 4xm_comp.exe&lt;br /&gt;
&lt;br /&gt;
Speed : 30 fps&lt;br /&gt;
Data Rate : 110000&lt;br /&gt;
Resize Width 320 Height 160&lt;br /&gt;
&lt;br /&gt;
=== CDDA Audio ===&lt;br /&gt;
&lt;br /&gt;
Generate file list starting in GD-ROM HD Area after first data Track&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for f in ../backups/GDI/Mortal\ Kombat\ Gold/track*.raw; do   f=&amp;quot;${f}&amp;quot;;   [[ &amp;quot;$f&amp;quot; == *track04.raw ]] &amp;amp;&amp;amp; start=1;   [[ $start -eq 1 ]] &amp;amp;&amp;amp; files+=(&amp;quot;$f&amp;quot;); done&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Burn CDDA Tracks first&lt;br /&gt;
Note: -swab is only neccessary when CDDA is static, depends on the burner.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cdrecord -v -multi -tao -audio -swab &amp;quot;${files[@]}&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then get MSINFO Value for 2nd Session.&lt;br /&gt;
&lt;br /&gt;
=== Create ISO Images ===&lt;br /&gt;
&lt;br /&gt;
For the 1st Session, chosen files must not exceed total of 69120000 bytes!&lt;br /&gt;
&lt;br /&gt;
==== 1st Session ====&lt;br /&gt;
&lt;br /&gt;
===== Create first ISOFile =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkisofs -l -duplicates-once -no-allow-lowercase -graft-points -V &amp;lt;DISCNAME&amp;gt; -o &amp;lt;OUTPUT1.ISO&amp;gt; &amp;lt;CHOSEN FILE&amp;gt; &amp;lt;CHOSEN FILE&amp;gt; &amp;lt;CHOSEN FILE&amp;gt;...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fill first ISOFile with zeros so it takes up exactly 68808703 bytes = LBA 45000&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dd if=/dev/zero of=&amp;lt;OUTPUT1.ISO&amp;gt; bs=1 count=1 seek=68808703&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Burn 1st session =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cdrecord -v -multi -tao -xa &amp;lt;OUTPUT1.ISO&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Check MSINFO value &amp;amp; TOC&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cdrecord -msinfo&lt;br /&gt;
&lt;br /&gt;
0,45000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cdrecord -toc&lt;br /&gt;
&lt;br /&gt;
first: 1 last 1&lt;br /&gt;
track:   1 lba:         0 (        0) 00:02:00 adr: 1 control: 4 mode: -1&lt;br /&gt;
track:lout lba:     33600 (   134400) 07:30:00 adr: 1 control: 4 mode: -1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To include subdirectories into the root directory of the CD, use&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkisofs -l -duplicates-once -no-allow-lowercase -graft-points -V &amp;lt;DISCNAME&amp;gt; -o &amp;lt;OUTPUT1.ISO&amp;gt; &amp;lt;SUBDIRECTORY&amp;gt;/=&amp;lt;PATH_OF_SUBDIRECTORY&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkisofs -no-allow-lowercase -graft-points -l -duplicates-once -V AITD4_GD_2 -o aitd4_d2_1.iso MOVIES/=../rips/modified/aitd4/cd2/AITD4_GD_2/MOVIES/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 2nd Session ====&lt;br /&gt;
&lt;br /&gt;
===== Hack 1ST_READ.BIN &amp;amp; IP.BIN =====&lt;br /&gt;
&lt;br /&gt;
Get MSINFO Value&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cdrecord -msinfo&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
binhack&lt;br /&gt;
&lt;br /&gt;
Enter name of binary: 1ST_READ.BIN&lt;br /&gt;
Enter name of bootsector: ip.bin&lt;br /&gt;
Enter msinfo value: &amp;lt;MSINFO Value&amp;gt;&lt;br /&gt;
File 1ST_READ.BIN successfully hacked. &lt;br /&gt;
Bincon detected, OS flag set to 0.&lt;br /&gt;
File ip.bin successfully created.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Insert custom Logo =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
logoinsert darkrealm.mr IP.BIN&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Burn 2nd Session =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkisofs -sort sort.txt -no-allow-lowercase -l -duplicates-once -V &amp;lt;DISCNAME&amp;gt; -G &amp;lt;IP.BIN&amp;gt; -M &amp;lt;OUTPUT1.ISO&amp;gt; -C &amp;lt;MSINFO VALUE&amp;gt; -o &amp;lt;OUTPUT2.ISO&amp;gt; &amp;lt;GAME_DATA_DIRECTORY&amp;gt;&lt;br /&gt;
cdrecord -v -tao -xa &amp;lt;OUTPUT2.ISO&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
&lt;br /&gt;
* Burn whole stuff to a CD-RW&lt;br /&gt;
* Generate CDI from CD-RW&lt;br /&gt;
** Launch DiscJuggler from emulated Windows Machine and connect via iSCSI&lt;br /&gt;
* Test CDI with ReiCast oder ReDream&lt;br /&gt;
&lt;br /&gt;
== Create CDI Images from ISO ==&lt;br /&gt;
&lt;br /&gt;
* Create ISO first&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkisofs -l -duplicates-once -graft-points -V &amp;lt;DISCNAME&amp;gt; -G &amp;lt;IP.BIN&amp;gt; -o &amp;lt;GAME.ISO&amp;gt; &amp;lt;GAME DIRECTORY&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Create DATA/DATA CDI&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wine cdi4dc.exe &amp;lt;GAME.ISO&amp;gt; /media/chris/development/dreamcast/backups/CDI/tests/&amp;lt;GAME.CDI&amp;gt; -d&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* or create AUDIO/DATA CDI, with 2nd Session starting at LBA 11702&lt;br /&gt;
** Note: 1ST_READ.BIN must eventually be binhacked to LBA 11702&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wine cdi4dc.exe &amp;lt;GAME.ISO&amp;gt; /media/chris/development/dreamcast/backups/CDI/tests/&amp;lt;GAME.CDI&amp;gt; -d&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 60Hz &amp;lt;-&amp;gt; 50Hz Binary Comparisations ==&lt;br /&gt;
&lt;br /&gt;
=== Dino Crisis GER ===&lt;br /&gt;
&lt;br /&gt;
1ST_READ.BIN:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Offset : 0x001545C0&lt;br /&gt;
50Hz : 01 E4 03 A0 02 E4 01 A0 03&lt;br /&gt;
60Hz : 00 E4 03 A0 00 E4 01 A0 00&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tools ==&lt;br /&gt;
&lt;br /&gt;
=== Efficient 1st Session Filler ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
# Prüfen, ob ein Verzeichnis übergeben wurde&lt;br /&gt;
if [ -z &amp;quot;$1&amp;quot; ]; then&lt;br /&gt;
    echo &amp;quot;Usage: $0 &amp;lt;Verzeichnis&amp;gt;&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Prüfen, ob es ein gültiges Verzeichnis ist&lt;br /&gt;
if [ ! -d &amp;quot;$DIR&amp;quot; ]; then&lt;br /&gt;
    echo &amp;quot;Fehler: &#039;$DIR&#039; ist kein gültiges Verzeichnis.&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Maximal erlaubte Größe in Bytes&lt;br /&gt;
MAX_SIZE=68808703&lt;br /&gt;
&lt;br /&gt;
# Ausgabedatei für die Liste&lt;br /&gt;
OUTPUT=&amp;quot;dateiliste.txt&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Leere die Ausgabedatei&lt;br /&gt;
&amp;gt; &amp;quot;$OUTPUT&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Variable für die aktuelle Gesamtsumme&lt;br /&gt;
total_size=0&lt;br /&gt;
&lt;br /&gt;
# Durchlaufe die Dateien im Verzeichnis, sortiert nach Größe absteigend&lt;br /&gt;
while IFS= read -r file; do&lt;br /&gt;
    filesize=$(stat -c%s &amp;quot;$file&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    if (( total_size + filesize &amp;lt;= MAX_SIZE )); then&lt;br /&gt;
#        echo &amp;quot;$filesize $file&amp;quot; &amp;gt;&amp;gt; &amp;quot;$OUTPUT&amp;quot;&lt;br /&gt;
        echo &amp;quot;$file&amp;quot; &amp;gt;&amp;gt; &amp;quot;$OUTPUT&amp;quot;&lt;br /&gt;
        total_size=$((total_size + filesize))&lt;br /&gt;
    fi&lt;br /&gt;
done &amp;lt; &amp;lt;(find &amp;quot;$DIR&amp;quot; -maxdepth 1 -type f -printf &amp;quot;%s %p\n&amp;quot; | sort -nr | awk &#039;{print $2}&#039;)&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Liste erstellt: $OUTPUT&amp;quot;&lt;br /&gt;
echo &amp;quot;Gesamtgröße: $total_size Bytes&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Draft ==&lt;br /&gt;
&lt;br /&gt;
* ./find1stsessionfiles.sh ~/media/development/dreamcast/Rips/modified/aitd4/cd2/AITD4_GD_2/MOVIES&lt;br /&gt;
* mkisofs -l -duplicates-once -no-allow-lowercase -graft-points -V AITD4_GD2 -o aitd4_cd2_s1.iso -path-list ~/media/chris/development/dreamcast/tools/dateiliste.txt&lt;br /&gt;
* dd if=/dev/zero of=aitd4_d2_s1.iso bs=1 count=1 seek=68808703&lt;br /&gt;
* cdrecord -v -tao -multi -xa aitd4_d2_s1.iso&lt;br /&gt;
* binhack64 1ST_READ.BIN &amp;amp; IP.BIN to LBA 45000&lt;br /&gt;
* mkisofs -l -duplicates-once -no-allow-lowercase -graft-points -V AITD4_GD2 -G ip.bin -sort ../Rips/unmodified/aitd4/cd2/sort.txt -M aitd4_d2_s1.iso -C 0,45000 -o aitd4_d2_s2.iso ../Rips/modified/aitd4/cd2/AITD4_GD_2/ 1ST_READ.BIN&lt;br /&gt;
* cdrecord -v -tao -xa aitd4_d2_s2.iso&lt;/div&gt;</summary>
		<author><name>Chris</name></author>
	</entry>
	<entry>
		<id>https://darkrealm-wiki.darkrealm.dyndns.org/index.php?title=Dreamcast&amp;diff=4876</id>
		<title>Dreamcast</title>
		<link rel="alternate" type="text/html" href="https://darkrealm-wiki.darkrealm.dyndns.org/index.php?title=Dreamcast&amp;diff=4876"/>
		<updated>2026-05-05T21:34:31Z</updated>

		<summary type="html">&lt;p&gt;Chris: /* Draft */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== CDR Sizes ==&lt;br /&gt;
&lt;br /&gt;
80min/700MB: 1st Session 674MB Maximum&lt;br /&gt;
&lt;br /&gt;
90min/800MB: max 748MB when 45000 Sectors in 1st Session with dummy burn&lt;br /&gt;
&lt;br /&gt;
90min/800MB: max ~735MB when 45000 Sectors in 1st Session&lt;br /&gt;
&lt;br /&gt;
== Access Files on CDI Images ==&lt;br /&gt;
&lt;br /&gt;
# Extract the seperate Track first&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cdirip &amp;lt;CDIFILE&amp;gt;.cdi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# In case of 2nd Data Track, fix the LBA first&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
isofix &amp;lt;TRACK02&amp;gt;.iso &amp;lt;LBA Value reported by cdirip&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== What binhack does ==&lt;br /&gt;
&lt;br /&gt;
Changes LBA Value at offset 1461904 ( 8 Bytes before CD001 string) from 6EB0 (45166) to LBA Value+166 specified during binhack.&lt;br /&gt;
&lt;br /&gt;
Adds Region Codes for JAP,EUR and USA and strings for that.&lt;br /&gt;
Adds some bootcode, probably SH4 ASM to make the GDROM accept CDRs.&lt;br /&gt;
&lt;br /&gt;
== What cdda does ==&lt;br /&gt;
&lt;br /&gt;
Changes some bytes, probably SH4 ASM to enable playback of CDDA tracks.&lt;br /&gt;
&lt;br /&gt;
== What dahack does ==&lt;br /&gt;
&lt;br /&gt;
Changes LBA Values at offsets 1301408,1302380 and 1461904. First 2 offsets get rewritten from 5EB0 (45150) to 9600 (150). Third offset gets rewritten from 6EB0 (45166) to LBA Value+166 specified during dahack. 3rd offset change is basically the same what binhack does.&lt;br /&gt;
&lt;br /&gt;
== What hack3 does ==&lt;br /&gt;
&lt;br /&gt;
Changes LBA Values at offsets 1301408,1302380 and 1461904. First 2 offsets get rewritten from 5EB0 (45150) to LBA Value+150 specified during dahack. Third offset gets rewritten from 6EB0 (45166) to LBA Value+166 specified during dahack. 3rd offset change is basically the same what binhack does.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Another Copy Protection ==&lt;br /&gt;
&lt;br /&gt;
Searching for CDE4 036A (or CDE4 436A) and replacing with 0900 0900 is another Copy Protection defeat.&lt;br /&gt;
&lt;br /&gt;
CDE4 436A -&amp;gt; 0900 0900&lt;br /&gt;
1032 0D8B -&amp;gt; 0800 0D8B&lt;br /&gt;
&lt;br /&gt;
== LBA 45000 Trick ==&lt;br /&gt;
&lt;br /&gt;
69120000 bytes in first session will result in LBA 45000.&lt;br /&gt;
&lt;br /&gt;
== Fill 1st Session ISO File to 69120000 bytes with zeros ==&lt;br /&gt;
&lt;br /&gt;
6912000 bytes = 33750 2048-byte-sectors&lt;br /&gt;
&lt;br /&gt;
CORRECTION : Must be 33598 Sectors !!! = 68808703 bytes&lt;br /&gt;
&lt;br /&gt;
1st Session Leadout = 11250 Sectors = 23040000 Bytes&lt;br /&gt;
&lt;br /&gt;
2nd Session will start at Sector 45000&lt;br /&gt;
&lt;br /&gt;
When using extract.exe, add 150 Sectors to LBA reported in gdinfo_FG.exe track05&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dd if=/dev/zero of=&amp;lt;ISOFILE&amp;gt; bs=1 count=1 seek=69119999&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Creating &amp;amp; Burning DATA/DATA ISOs ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Merging track03 &amp;amp; track05 into one file ==&lt;br /&gt;
&lt;br /&gt;
Create dummy file first&lt;br /&gt;
Calculate 1185760800 - &amp;lt;SIZE OF track03.bin + SIZE OF track05.bin&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dd if=/dev/zero bs=1 count=0 seek=&amp;lt;RESULT&amp;gt; of=dummy.bin&lt;br /&gt;
cat track03.bin dummy.bin track05.bin &amp;gt; combined.bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This also helps when extract.exe only outputs garbage out of track03.iso along with track05.iso. This way only the combined.iso needs to be extracted.&lt;br /&gt;
&lt;br /&gt;
== Burning DATA/DATA CDIs ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cdirip &amp;lt;CDIFile&amp;gt; &amp;lt;Destination Directory&amp;gt;&lt;br /&gt;
cdrecord dev=/dev/sr0 -v -multi -tao -xa tdata01.iso&lt;br /&gt;
cdrecord dev=/dev/sr0 -v -tao -xa tdata02.iso&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Full rip process from GD-ROM to CD-ROM ==&lt;br /&gt;
&lt;br /&gt;
=== Get GDROM Data from Dreamcast with http-ack ===&lt;br /&gt;
&lt;br /&gt;
https://www.gotwalls.com&lt;br /&gt;
&lt;br /&gt;
https://github.com/sega-dreamcast/httpd-ack&lt;br /&gt;
&lt;br /&gt;
# Boot HTTP-ack from CD&lt;br /&gt;
# Swap HTTP-ack CD with Original GD-ROm&lt;br /&gt;
# Connect via Browser to http://192.168.1.30&lt;br /&gt;
# Download all files starting with track03.bin&lt;br /&gt;
# Download disc.gdi&lt;br /&gt;
&lt;br /&gt;
=== Extract Data from Tracks ===&lt;br /&gt;
&lt;br /&gt;
==== Use gditools ====&lt;br /&gt;
&lt;br /&gt;
https://sourceforge.net/projects/dcisotools/&lt;br /&gt;
&lt;br /&gt;
Either use GUI or gditools.py&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
python2.7 ./gditools.py &lt;br /&gt;
Usage: ./gditools.py -i input_gdi [options]&lt;br /&gt;
&lt;br /&gt;
  -h, --help             Display this help&lt;br /&gt;
  -l, --list             List all files in the filesystem and exit&lt;br /&gt;
  -o [outdir]            Output directory. Default: gdi folder&lt;br /&gt;
  -s [filename]          Create a sorttxt file with custom name&lt;br /&gt;
                           (It uses *data-folder* as prefix)&lt;br /&gt;
  -b [ipname]            Dump the ip.bin with custom name&lt;br /&gt;
  -e [filename]          Dump a single file from the filesystem&lt;br /&gt;
  --extract-all          Dump all the files in the *data-folder*&lt;br /&gt;
  --data-folder [name]   *data-folder* subfolder. Default: data&lt;br /&gt;
                           (__volume_label__ --&amp;gt; Use ISO9660 volume label)&lt;br /&gt;
  --sort-spacer [num]    Sorttxt entries are sperated by num&lt;br /&gt;
  --silent               Minimal verbosity mode&lt;br /&gt;
  [no option]            Display gdi infos if not silent&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
gditools.py by FamilyGuy, http://sourceforge.net/p/dcisotools/&lt;br /&gt;
    Licensed under GPLv3, see licences folder.&lt;br /&gt;
&lt;br /&gt;
iso9660.py  by Barney Gale, http://github.com/barneygale&lt;br /&gt;
    Licensed under a BSD-based license, see licences folder.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
python2.7 ./gditools.py -i &amp;lt;disc.gdi&amp;gt; --extract-all -o /mnt/development/dreamcast/rips/orgs/&amp;lt;GAME_NAME&amp;gt;/&amp;lt;CD Number&amp;gt; --data-folder __volume_label__ -s sort.txt -b ip.bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Old way ====&lt;br /&gt;
# If the game contains more than track03.bin, combine the 2 binfiles into 1:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cat track03.bin dummy.bin track05.bin &amp;gt; &amp;lt;BINFILE&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
# Convert .BIN Files to .ISO Files first with bin2iso.exe&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bin2iso.exe &amp;lt;BINFILE&amp;gt; &amp;lt;ISOFILE&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
# Extract Data from .ISO files&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
extract.exe &amp;lt;ISOFILE&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
If extracted 1ST_READ.BIN has filesize of 0, LBA of track05 is wrong.&lt;br /&gt;
&lt;br /&gt;
=== Downsampling ===&lt;br /&gt;
&lt;br /&gt;
==== AFS Files ====&lt;br /&gt;
&lt;br /&gt;
https://sizious.com/download/dreamcast/&lt;br /&gt;
&lt;br /&gt;
AFS files contain multiple ADX files combined into one AFS file.&lt;br /&gt;
&lt;br /&gt;
compact AFS with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
AFSCompactor.exe&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
for Alone in the Dark - The New Nightmare .XA files are AFS files, rename first with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rename .XA .afs *.XA&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
then compact and rename back to .XA:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rename .afs .XA *.afs&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
AFSCompactor.exe will rename files inside .afs to file0001 etc... AITD4 doesnt seem to care.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
extract AFS with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
afs_extract.exe *.afs|*.XA&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
or&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
afsextract.exe -sc afsfile|XAfile&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
or&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
afsutils_v2.exe | rename .XA files to .afs beforehand.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== SFD Movies ====&lt;br /&gt;
&lt;br /&gt;
http://www.dc-swat.ru/page/download/&lt;br /&gt;
&lt;br /&gt;
Demux video to .m1v and audio to .wav first&lt;br /&gt;
&lt;br /&gt;
Example (play around with bitrates):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for f in &amp;lt;SFD Files&amp;gt;; do ffmpeg -i $f -vcodec mpeg1video -b:v 2600k -minrate 2600k -maxrate 3600k -y $f.m1v -acodec adpcm_ima_wav -y $f.wav ; done&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Open all .wavs in single Audacity project and mass export again, 16bit and 44100 Hz.&lt;br /&gt;
&lt;br /&gt;
Start Dreamcast Movie Converter and remux/reencode to .SFD. Dont use batch processing, videos get truncated!&lt;br /&gt;
&lt;br /&gt;
==== 4XM Movies ====&lt;br /&gt;
&lt;br /&gt;
http://samples.mplayerhq.hu/game-formats/4xm/&lt;br /&gt;
&lt;br /&gt;
Convert to AVI first with ffmpeg&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for i in ../rips/unmodified/aitd4/cd2/AITD4_GD_2/MOVIES/*.4XM; do ffmpeg -i &amp;quot;$i&amp;quot; -vf scale=320x160 -y &amp;quot;${i%.*}.avi&amp;quot;; done&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Downsample with 4xm_comp.exe&lt;br /&gt;
&lt;br /&gt;
Speed : 30 fps&lt;br /&gt;
Data Rate : 110000&lt;br /&gt;
Resize Width 320 Height 160&lt;br /&gt;
&lt;br /&gt;
=== CDDA Audio ===&lt;br /&gt;
&lt;br /&gt;
Generate file list starting in GD-ROM HD Area after first data Track&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for f in ../backups/GDI/Mortal\ Kombat\ Gold/track*.raw; do   f=&amp;quot;${f}&amp;quot;;   [[ &amp;quot;$f&amp;quot; == *track04.raw ]] &amp;amp;&amp;amp; start=1;   [[ $start -eq 1 ]] &amp;amp;&amp;amp; files+=(&amp;quot;$f&amp;quot;); done&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Burn CDDA Tracks first&lt;br /&gt;
Note: -swab is only neccessary when CDDA is static, depends on the burner.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cdrecord -v -multi -tao -audio -swab &amp;quot;${files[@]}&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then get MSINFO Value for 2nd Session.&lt;br /&gt;
&lt;br /&gt;
=== Create ISO Images ===&lt;br /&gt;
&lt;br /&gt;
For the 1st Session, chosen files must not exceed total of 69120000 bytes!&lt;br /&gt;
&lt;br /&gt;
==== 1st Session ====&lt;br /&gt;
&lt;br /&gt;
===== Create first ISOFile =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkisofs -l -duplicates-once -no-allow-lowercase -graft-points -V &amp;lt;DISCNAME&amp;gt; -o &amp;lt;OUTPUT1.ISO&amp;gt; &amp;lt;CHOSEN FILE&amp;gt; &amp;lt;CHOSEN FILE&amp;gt; &amp;lt;CHOSEN FILE&amp;gt;...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fill first ISOFile with zeros so it takes up exactly 68808703 bytes = LBA 45000&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dd if=/dev/zero of=&amp;lt;OUTPUT1.ISO&amp;gt; bs=1 count=1 seek=68808703&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Burn 1st session =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cdrecord -v -multi -tao -xa &amp;lt;OUTPUT1.ISO&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Check MSINFO value &amp;amp; TOC&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cdrecord -msinfo&lt;br /&gt;
&lt;br /&gt;
0,45000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cdrecord -toc&lt;br /&gt;
&lt;br /&gt;
first: 1 last 1&lt;br /&gt;
track:   1 lba:         0 (        0) 00:02:00 adr: 1 control: 4 mode: -1&lt;br /&gt;
track:lout lba:     33600 (   134400) 07:30:00 adr: 1 control: 4 mode: -1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To include subdirectories into the root directory of the CD, use&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkisofs -l -duplicates-once -no-allow-lowercase -graft-points -V &amp;lt;DISCNAME&amp;gt; -o &amp;lt;OUTPUT1.ISO&amp;gt; &amp;lt;SUBDIRECTORY&amp;gt;/=&amp;lt;PATH_OF_SUBDIRECTORY&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkisofs -no-allow-lowercase -graft-points -l -duplicates-once -V AITD4_GD_2 -o aitd4_d2_1.iso MOVIES/=../rips/modified/aitd4/cd2/AITD4_GD_2/MOVIES/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 2nd Session ====&lt;br /&gt;
&lt;br /&gt;
===== Hack 1ST_READ.BIN &amp;amp; IP.BIN =====&lt;br /&gt;
&lt;br /&gt;
Get MSINFO Value&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cdrecord -msinfo&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
binhack&lt;br /&gt;
&lt;br /&gt;
Enter name of binary: 1ST_READ.BIN&lt;br /&gt;
Enter name of bootsector: ip.bin&lt;br /&gt;
Enter msinfo value: &amp;lt;MSINFO Value&amp;gt;&lt;br /&gt;
File 1ST_READ.BIN successfully hacked. &lt;br /&gt;
Bincon detected, OS flag set to 0.&lt;br /&gt;
File ip.bin successfully created.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Insert custom Logo =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
logoinsert darkrealm.mr IP.BIN&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Burn 2nd Session =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkisofs -sort sort.txt -no-allow-lowercase -l -duplicates-once -V &amp;lt;DISCNAME&amp;gt; -G &amp;lt;IP.BIN&amp;gt; -M &amp;lt;OUTPUT1.ISO&amp;gt; -C &amp;lt;MSINFO VALUE&amp;gt; -o &amp;lt;OUTPUT2.ISO&amp;gt; &amp;lt;GAME_DATA_DIRECTORY&amp;gt;&lt;br /&gt;
cdrecord -v -tao -xa &amp;lt;OUTPUT2.ISO&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
&lt;br /&gt;
* Burn whole stuff to a CD-RW&lt;br /&gt;
* Generate CDI from CD-RW&lt;br /&gt;
** Launch DiscJuggler from emulated Windows Machine and connect via iSCSI&lt;br /&gt;
* Test CDI with ReiCast oder ReDream&lt;br /&gt;
&lt;br /&gt;
== Create CDI Images from ISO ==&lt;br /&gt;
&lt;br /&gt;
* Create ISO first&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkisofs -l -duplicates-once -graft-points -V &amp;lt;DISCNAME&amp;gt; -G &amp;lt;IP.BIN&amp;gt; -o &amp;lt;GAME.ISO&amp;gt; &amp;lt;GAME DIRECTORY&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Create DATA/DATA CDI&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wine cdi4dc.exe &amp;lt;GAME.ISO&amp;gt; /media/chris/development/dreamcast/backups/CDI/tests/&amp;lt;GAME.CDI&amp;gt; -d&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* or create AUDIO/DATA CDI, with 2nd Session starting at LBA 11702&lt;br /&gt;
** Note: 1ST_READ.BIN must eventually be binhacked to LBA 11702&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wine cdi4dc.exe &amp;lt;GAME.ISO&amp;gt; /media/chris/development/dreamcast/backups/CDI/tests/&amp;lt;GAME.CDI&amp;gt; -d&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 60Hz &amp;lt;-&amp;gt; 50Hz Binary Comparisations ==&lt;br /&gt;
&lt;br /&gt;
=== Dino Crisis GER ===&lt;br /&gt;
&lt;br /&gt;
1ST_READ.BIN:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Offset : 0x001545C0&lt;br /&gt;
50Hz : 01 E4 03 A0 02 E4 01 A0 03&lt;br /&gt;
60Hz : 00 E4 03 A0 00 E4 01 A0 00&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tools ==&lt;br /&gt;
&lt;br /&gt;
=== Efficient 1st Session Filler ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
# Prüfen, ob ein Verzeichnis übergeben wurde&lt;br /&gt;
if [ -z &amp;quot;$1&amp;quot; ]; then&lt;br /&gt;
    echo &amp;quot;Usage: $0 &amp;lt;Verzeichnis&amp;gt;&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Prüfen, ob es ein gültiges Verzeichnis ist&lt;br /&gt;
if [ ! -d &amp;quot;$DIR&amp;quot; ]; then&lt;br /&gt;
    echo &amp;quot;Fehler: &#039;$DIR&#039; ist kein gültiges Verzeichnis.&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Maximal erlaubte Größe in Bytes&lt;br /&gt;
MAX_SIZE=68808703&lt;br /&gt;
&lt;br /&gt;
# Ausgabedatei für die Liste&lt;br /&gt;
OUTPUT=&amp;quot;dateiliste.txt&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Leere die Ausgabedatei&lt;br /&gt;
&amp;gt; &amp;quot;$OUTPUT&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Variable für die aktuelle Gesamtsumme&lt;br /&gt;
total_size=0&lt;br /&gt;
&lt;br /&gt;
# Durchlaufe die Dateien im Verzeichnis, sortiert nach Größe absteigend&lt;br /&gt;
while IFS= read -r file; do&lt;br /&gt;
    filesize=$(stat -c%s &amp;quot;$file&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    if (( total_size + filesize &amp;lt;= MAX_SIZE )); then&lt;br /&gt;
#        echo &amp;quot;$filesize $file&amp;quot; &amp;gt;&amp;gt; &amp;quot;$OUTPUT&amp;quot;&lt;br /&gt;
        echo &amp;quot;$file&amp;quot; &amp;gt;&amp;gt; &amp;quot;$OUTPUT&amp;quot;&lt;br /&gt;
        total_size=$((total_size + filesize))&lt;br /&gt;
    fi&lt;br /&gt;
done &amp;lt; &amp;lt;(find &amp;quot;$DIR&amp;quot; -maxdepth 1 -type f -printf &amp;quot;%s %p\n&amp;quot; | sort -nr | awk &#039;{print $2}&#039;)&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Liste erstellt: $OUTPUT&amp;quot;&lt;br /&gt;
echo &amp;quot;Gesamtgröße: $total_size Bytes&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Draft ==&lt;br /&gt;
&lt;br /&gt;
* ./find1stsessionfiles.sh ~/media/development/dreamcast/Rips/modified/aitd4/cd2/AITD4_GD_2/MOVIES&lt;br /&gt;
* mkisofs -l -duplicates-once -no-allow-lowercase -graft-points -V AITD4_GD2 -o aitd4_cd2_s1.iso -path-list ~/media/chris/development/dreamcast/tools/dateiliste.txt&lt;br /&gt;
* dd if=/dev/zero of=aitd4_d2_s1.iso bs=1 count=1 seek=68808703&lt;br /&gt;
* cdrecord -v -tao -multi -xa aitd4_d2_s1.iso&lt;/div&gt;</summary>
		<author><name>Chris</name></author>
	</entry>
	<entry>
		<id>https://darkrealm-wiki.darkrealm.dyndns.org/index.php?title=Dreamcast&amp;diff=4875</id>
		<title>Dreamcast</title>
		<link rel="alternate" type="text/html" href="https://darkrealm-wiki.darkrealm.dyndns.org/index.php?title=Dreamcast&amp;diff=4875"/>
		<updated>2026-05-05T21:22:59Z</updated>

		<summary type="html">&lt;p&gt;Chris: /* Draft */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== CDR Sizes ==&lt;br /&gt;
&lt;br /&gt;
80min/700MB: 1st Session 674MB Maximum&lt;br /&gt;
&lt;br /&gt;
90min/800MB: max 748MB when 45000 Sectors in 1st Session with dummy burn&lt;br /&gt;
&lt;br /&gt;
90min/800MB: max ~735MB when 45000 Sectors in 1st Session&lt;br /&gt;
&lt;br /&gt;
== Access Files on CDI Images ==&lt;br /&gt;
&lt;br /&gt;
# Extract the seperate Track first&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cdirip &amp;lt;CDIFILE&amp;gt;.cdi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# In case of 2nd Data Track, fix the LBA first&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
isofix &amp;lt;TRACK02&amp;gt;.iso &amp;lt;LBA Value reported by cdirip&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== What binhack does ==&lt;br /&gt;
&lt;br /&gt;
Changes LBA Value at offset 1461904 ( 8 Bytes before CD001 string) from 6EB0 (45166) to LBA Value+166 specified during binhack.&lt;br /&gt;
&lt;br /&gt;
Adds Region Codes for JAP,EUR and USA and strings for that.&lt;br /&gt;
Adds some bootcode, probably SH4 ASM to make the GDROM accept CDRs.&lt;br /&gt;
&lt;br /&gt;
== What cdda does ==&lt;br /&gt;
&lt;br /&gt;
Changes some bytes, probably SH4 ASM to enable playback of CDDA tracks.&lt;br /&gt;
&lt;br /&gt;
== What dahack does ==&lt;br /&gt;
&lt;br /&gt;
Changes LBA Values at offsets 1301408,1302380 and 1461904. First 2 offsets get rewritten from 5EB0 (45150) to 9600 (150). Third offset gets rewritten from 6EB0 (45166) to LBA Value+166 specified during dahack. 3rd offset change is basically the same what binhack does.&lt;br /&gt;
&lt;br /&gt;
== What hack3 does ==&lt;br /&gt;
&lt;br /&gt;
Changes LBA Values at offsets 1301408,1302380 and 1461904. First 2 offsets get rewritten from 5EB0 (45150) to LBA Value+150 specified during dahack. Third offset gets rewritten from 6EB0 (45166) to LBA Value+166 specified during dahack. 3rd offset change is basically the same what binhack does.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Another Copy Protection ==&lt;br /&gt;
&lt;br /&gt;
Searching for CDE4 036A (or CDE4 436A) and replacing with 0900 0900 is another Copy Protection defeat.&lt;br /&gt;
&lt;br /&gt;
CDE4 436A -&amp;gt; 0900 0900&lt;br /&gt;
1032 0D8B -&amp;gt; 0800 0D8B&lt;br /&gt;
&lt;br /&gt;
== LBA 45000 Trick ==&lt;br /&gt;
&lt;br /&gt;
69120000 bytes in first session will result in LBA 45000.&lt;br /&gt;
&lt;br /&gt;
== Fill 1st Session ISO File to 69120000 bytes with zeros ==&lt;br /&gt;
&lt;br /&gt;
6912000 bytes = 33750 2048-byte-sectors&lt;br /&gt;
&lt;br /&gt;
CORRECTION : Must be 33598 Sectors !!! = 68808703 bytes&lt;br /&gt;
&lt;br /&gt;
1st Session Leadout = 11250 Sectors = 23040000 Bytes&lt;br /&gt;
&lt;br /&gt;
2nd Session will start at Sector 45000&lt;br /&gt;
&lt;br /&gt;
When using extract.exe, add 150 Sectors to LBA reported in gdinfo_FG.exe track05&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dd if=/dev/zero of=&amp;lt;ISOFILE&amp;gt; bs=1 count=1 seek=69119999&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Creating &amp;amp; Burning DATA/DATA ISOs ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Merging track03 &amp;amp; track05 into one file ==&lt;br /&gt;
&lt;br /&gt;
Create dummy file first&lt;br /&gt;
Calculate 1185760800 - &amp;lt;SIZE OF track03.bin + SIZE OF track05.bin&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dd if=/dev/zero bs=1 count=0 seek=&amp;lt;RESULT&amp;gt; of=dummy.bin&lt;br /&gt;
cat track03.bin dummy.bin track05.bin &amp;gt; combined.bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This also helps when extract.exe only outputs garbage out of track03.iso along with track05.iso. This way only the combined.iso needs to be extracted.&lt;br /&gt;
&lt;br /&gt;
== Burning DATA/DATA CDIs ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cdirip &amp;lt;CDIFile&amp;gt; &amp;lt;Destination Directory&amp;gt;&lt;br /&gt;
cdrecord dev=/dev/sr0 -v -multi -tao -xa tdata01.iso&lt;br /&gt;
cdrecord dev=/dev/sr0 -v -tao -xa tdata02.iso&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Full rip process from GD-ROM to CD-ROM ==&lt;br /&gt;
&lt;br /&gt;
=== Get GDROM Data from Dreamcast with http-ack ===&lt;br /&gt;
&lt;br /&gt;
https://www.gotwalls.com&lt;br /&gt;
&lt;br /&gt;
https://github.com/sega-dreamcast/httpd-ack&lt;br /&gt;
&lt;br /&gt;
# Boot HTTP-ack from CD&lt;br /&gt;
# Swap HTTP-ack CD with Original GD-ROm&lt;br /&gt;
# Connect via Browser to http://192.168.1.30&lt;br /&gt;
# Download all files starting with track03.bin&lt;br /&gt;
# Download disc.gdi&lt;br /&gt;
&lt;br /&gt;
=== Extract Data from Tracks ===&lt;br /&gt;
&lt;br /&gt;
==== Use gditools ====&lt;br /&gt;
&lt;br /&gt;
https://sourceforge.net/projects/dcisotools/&lt;br /&gt;
&lt;br /&gt;
Either use GUI or gditools.py&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
python2.7 ./gditools.py &lt;br /&gt;
Usage: ./gditools.py -i input_gdi [options]&lt;br /&gt;
&lt;br /&gt;
  -h, --help             Display this help&lt;br /&gt;
  -l, --list             List all files in the filesystem and exit&lt;br /&gt;
  -o [outdir]            Output directory. Default: gdi folder&lt;br /&gt;
  -s [filename]          Create a sorttxt file with custom name&lt;br /&gt;
                           (It uses *data-folder* as prefix)&lt;br /&gt;
  -b [ipname]            Dump the ip.bin with custom name&lt;br /&gt;
  -e [filename]          Dump a single file from the filesystem&lt;br /&gt;
  --extract-all          Dump all the files in the *data-folder*&lt;br /&gt;
  --data-folder [name]   *data-folder* subfolder. Default: data&lt;br /&gt;
                           (__volume_label__ --&amp;gt; Use ISO9660 volume label)&lt;br /&gt;
  --sort-spacer [num]    Sorttxt entries are sperated by num&lt;br /&gt;
  --silent               Minimal verbosity mode&lt;br /&gt;
  [no option]            Display gdi infos if not silent&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
gditools.py by FamilyGuy, http://sourceforge.net/p/dcisotools/&lt;br /&gt;
    Licensed under GPLv3, see licences folder.&lt;br /&gt;
&lt;br /&gt;
iso9660.py  by Barney Gale, http://github.com/barneygale&lt;br /&gt;
    Licensed under a BSD-based license, see licences folder.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
python2.7 ./gditools.py -i &amp;lt;disc.gdi&amp;gt; --extract-all -o /mnt/development/dreamcast/rips/orgs/&amp;lt;GAME_NAME&amp;gt;/&amp;lt;CD Number&amp;gt; --data-folder __volume_label__ -s sort.txt -b ip.bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Old way ====&lt;br /&gt;
# If the game contains more than track03.bin, combine the 2 binfiles into 1:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cat track03.bin dummy.bin track05.bin &amp;gt; &amp;lt;BINFILE&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
# Convert .BIN Files to .ISO Files first with bin2iso.exe&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bin2iso.exe &amp;lt;BINFILE&amp;gt; &amp;lt;ISOFILE&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
# Extract Data from .ISO files&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
extract.exe &amp;lt;ISOFILE&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
If extracted 1ST_READ.BIN has filesize of 0, LBA of track05 is wrong.&lt;br /&gt;
&lt;br /&gt;
=== Downsampling ===&lt;br /&gt;
&lt;br /&gt;
==== AFS Files ====&lt;br /&gt;
&lt;br /&gt;
https://sizious.com/download/dreamcast/&lt;br /&gt;
&lt;br /&gt;
AFS files contain multiple ADX files combined into one AFS file.&lt;br /&gt;
&lt;br /&gt;
compact AFS with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
AFSCompactor.exe&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
for Alone in the Dark - The New Nightmare .XA files are AFS files, rename first with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rename .XA .afs *.XA&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
then compact and rename back to .XA:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rename .afs .XA *.afs&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
AFSCompactor.exe will rename files inside .afs to file0001 etc... AITD4 doesnt seem to care.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
extract AFS with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
afs_extract.exe *.afs|*.XA&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
or&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
afsextract.exe -sc afsfile|XAfile&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
or&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
afsutils_v2.exe | rename .XA files to .afs beforehand.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== SFD Movies ====&lt;br /&gt;
&lt;br /&gt;
http://www.dc-swat.ru/page/download/&lt;br /&gt;
&lt;br /&gt;
Demux video to .m1v and audio to .wav first&lt;br /&gt;
&lt;br /&gt;
Example (play around with bitrates):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for f in &amp;lt;SFD Files&amp;gt;; do ffmpeg -i $f -vcodec mpeg1video -b:v 2600k -minrate 2600k -maxrate 3600k -y $f.m1v -acodec adpcm_ima_wav -y $f.wav ; done&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Open all .wavs in single Audacity project and mass export again, 16bit and 44100 Hz.&lt;br /&gt;
&lt;br /&gt;
Start Dreamcast Movie Converter and remux/reencode to .SFD. Dont use batch processing, videos get truncated!&lt;br /&gt;
&lt;br /&gt;
==== 4XM Movies ====&lt;br /&gt;
&lt;br /&gt;
http://samples.mplayerhq.hu/game-formats/4xm/&lt;br /&gt;
&lt;br /&gt;
Convert to AVI first with ffmpeg&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for i in ../rips/unmodified/aitd4/cd2/AITD4_GD_2/MOVIES/*.4XM; do ffmpeg -i &amp;quot;$i&amp;quot; -vf scale=320x160 -y &amp;quot;${i%.*}.avi&amp;quot;; done&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Downsample with 4xm_comp.exe&lt;br /&gt;
&lt;br /&gt;
Speed : 30 fps&lt;br /&gt;
Data Rate : 110000&lt;br /&gt;
Resize Width 320 Height 160&lt;br /&gt;
&lt;br /&gt;
=== CDDA Audio ===&lt;br /&gt;
&lt;br /&gt;
Generate file list starting in GD-ROM HD Area after first data Track&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for f in ../backups/GDI/Mortal\ Kombat\ Gold/track*.raw; do   f=&amp;quot;${f}&amp;quot;;   [[ &amp;quot;$f&amp;quot; == *track04.raw ]] &amp;amp;&amp;amp; start=1;   [[ $start -eq 1 ]] &amp;amp;&amp;amp; files+=(&amp;quot;$f&amp;quot;); done&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Burn CDDA Tracks first&lt;br /&gt;
Note: -swab is only neccessary when CDDA is static, depends on the burner.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cdrecord -v -multi -tao -audio -swab &amp;quot;${files[@]}&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then get MSINFO Value for 2nd Session.&lt;br /&gt;
&lt;br /&gt;
=== Create ISO Images ===&lt;br /&gt;
&lt;br /&gt;
For the 1st Session, chosen files must not exceed total of 69120000 bytes!&lt;br /&gt;
&lt;br /&gt;
==== 1st Session ====&lt;br /&gt;
&lt;br /&gt;
===== Create first ISOFile =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkisofs -l -duplicates-once -no-allow-lowercase -graft-points -V &amp;lt;DISCNAME&amp;gt; -o &amp;lt;OUTPUT1.ISO&amp;gt; &amp;lt;CHOSEN FILE&amp;gt; &amp;lt;CHOSEN FILE&amp;gt; &amp;lt;CHOSEN FILE&amp;gt;...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fill first ISOFile with zeros so it takes up exactly 68808703 bytes = LBA 45000&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dd if=/dev/zero of=&amp;lt;OUTPUT1.ISO&amp;gt; bs=1 count=1 seek=68808703&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Burn 1st session =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cdrecord -v -multi -tao -xa &amp;lt;OUTPUT1.ISO&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Check MSINFO value &amp;amp; TOC&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cdrecord -msinfo&lt;br /&gt;
&lt;br /&gt;
0,45000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cdrecord -toc&lt;br /&gt;
&lt;br /&gt;
first: 1 last 1&lt;br /&gt;
track:   1 lba:         0 (        0) 00:02:00 adr: 1 control: 4 mode: -1&lt;br /&gt;
track:lout lba:     33600 (   134400) 07:30:00 adr: 1 control: 4 mode: -1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To include subdirectories into the root directory of the CD, use&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkisofs -l -duplicates-once -no-allow-lowercase -graft-points -V &amp;lt;DISCNAME&amp;gt; -o &amp;lt;OUTPUT1.ISO&amp;gt; &amp;lt;SUBDIRECTORY&amp;gt;/=&amp;lt;PATH_OF_SUBDIRECTORY&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkisofs -no-allow-lowercase -graft-points -l -duplicates-once -V AITD4_GD_2 -o aitd4_d2_1.iso MOVIES/=../rips/modified/aitd4/cd2/AITD4_GD_2/MOVIES/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 2nd Session ====&lt;br /&gt;
&lt;br /&gt;
===== Hack 1ST_READ.BIN &amp;amp; IP.BIN =====&lt;br /&gt;
&lt;br /&gt;
Get MSINFO Value&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cdrecord -msinfo&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
binhack&lt;br /&gt;
&lt;br /&gt;
Enter name of binary: 1ST_READ.BIN&lt;br /&gt;
Enter name of bootsector: ip.bin&lt;br /&gt;
Enter msinfo value: &amp;lt;MSINFO Value&amp;gt;&lt;br /&gt;
File 1ST_READ.BIN successfully hacked. &lt;br /&gt;
Bincon detected, OS flag set to 0.&lt;br /&gt;
File ip.bin successfully created.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Insert custom Logo =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
logoinsert darkrealm.mr IP.BIN&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Burn 2nd Session =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkisofs -sort sort.txt -no-allow-lowercase -l -duplicates-once -V &amp;lt;DISCNAME&amp;gt; -G &amp;lt;IP.BIN&amp;gt; -M &amp;lt;OUTPUT1.ISO&amp;gt; -C &amp;lt;MSINFO VALUE&amp;gt; -o &amp;lt;OUTPUT2.ISO&amp;gt; &amp;lt;GAME_DATA_DIRECTORY&amp;gt;&lt;br /&gt;
cdrecord -v -tao -xa &amp;lt;OUTPUT2.ISO&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
&lt;br /&gt;
* Burn whole stuff to a CD-RW&lt;br /&gt;
* Generate CDI from CD-RW&lt;br /&gt;
** Launch DiscJuggler from emulated Windows Machine and connect via iSCSI&lt;br /&gt;
* Test CDI with ReiCast oder ReDream&lt;br /&gt;
&lt;br /&gt;
== Create CDI Images from ISO ==&lt;br /&gt;
&lt;br /&gt;
* Create ISO first&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkisofs -l -duplicates-once -graft-points -V &amp;lt;DISCNAME&amp;gt; -G &amp;lt;IP.BIN&amp;gt; -o &amp;lt;GAME.ISO&amp;gt; &amp;lt;GAME DIRECTORY&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Create DATA/DATA CDI&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wine cdi4dc.exe &amp;lt;GAME.ISO&amp;gt; /media/chris/development/dreamcast/backups/CDI/tests/&amp;lt;GAME.CDI&amp;gt; -d&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* or create AUDIO/DATA CDI, with 2nd Session starting at LBA 11702&lt;br /&gt;
** Note: 1ST_READ.BIN must eventually be binhacked to LBA 11702&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wine cdi4dc.exe &amp;lt;GAME.ISO&amp;gt; /media/chris/development/dreamcast/backups/CDI/tests/&amp;lt;GAME.CDI&amp;gt; -d&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 60Hz &amp;lt;-&amp;gt; 50Hz Binary Comparisations ==&lt;br /&gt;
&lt;br /&gt;
=== Dino Crisis GER ===&lt;br /&gt;
&lt;br /&gt;
1ST_READ.BIN:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Offset : 0x001545C0&lt;br /&gt;
50Hz : 01 E4 03 A0 02 E4 01 A0 03&lt;br /&gt;
60Hz : 00 E4 03 A0 00 E4 01 A0 00&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tools ==&lt;br /&gt;
&lt;br /&gt;
=== Efficient 1st Session Filler ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
# Prüfen, ob ein Verzeichnis übergeben wurde&lt;br /&gt;
if [ -z &amp;quot;$1&amp;quot; ]; then&lt;br /&gt;
    echo &amp;quot;Usage: $0 &amp;lt;Verzeichnis&amp;gt;&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Prüfen, ob es ein gültiges Verzeichnis ist&lt;br /&gt;
if [ ! -d &amp;quot;$DIR&amp;quot; ]; then&lt;br /&gt;
    echo &amp;quot;Fehler: &#039;$DIR&#039; ist kein gültiges Verzeichnis.&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Maximal erlaubte Größe in Bytes&lt;br /&gt;
MAX_SIZE=68808703&lt;br /&gt;
&lt;br /&gt;
# Ausgabedatei für die Liste&lt;br /&gt;
OUTPUT=&amp;quot;dateiliste.txt&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Leere die Ausgabedatei&lt;br /&gt;
&amp;gt; &amp;quot;$OUTPUT&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Variable für die aktuelle Gesamtsumme&lt;br /&gt;
total_size=0&lt;br /&gt;
&lt;br /&gt;
# Durchlaufe die Dateien im Verzeichnis, sortiert nach Größe absteigend&lt;br /&gt;
while IFS= read -r file; do&lt;br /&gt;
    filesize=$(stat -c%s &amp;quot;$file&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    if (( total_size + filesize &amp;lt;= MAX_SIZE )); then&lt;br /&gt;
#        echo &amp;quot;$filesize $file&amp;quot; &amp;gt;&amp;gt; &amp;quot;$OUTPUT&amp;quot;&lt;br /&gt;
        echo &amp;quot;$file&amp;quot; &amp;gt;&amp;gt; &amp;quot;$OUTPUT&amp;quot;&lt;br /&gt;
        total_size=$((total_size + filesize))&lt;br /&gt;
    fi&lt;br /&gt;
done &amp;lt; &amp;lt;(find &amp;quot;$DIR&amp;quot; -maxdepth 1 -type f -printf &amp;quot;%s %p\n&amp;quot; | sort -nr | awk &#039;{print $2}&#039;)&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Liste erstellt: $OUTPUT&amp;quot;&lt;br /&gt;
echo &amp;quot;Gesamtgröße: $total_size Bytes&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Draft ==&lt;br /&gt;
&lt;br /&gt;
* ./find1stsessionfiles.sh ~/media/development/dreamcast/Rips/modified/aitd4/cd2/AITD4_GD_2/MOVIES&lt;br /&gt;
* mkisofs -l -duplicates-once -no-allow-lowercase -graft-points -V AITD4_GD2 -o aitd4_cd2_s1.iso -path-list ~/media/chris/development/dreamcast/tools/dateiliste.txt&lt;br /&gt;
* cdrecord -v -tao -multi -xa aitd4_d2_s1.iso&lt;br /&gt;
* dd if=/dev/zero of=aitd4_d2_s1.iso bs=1 count=1 seek=68808703&lt;/div&gt;</summary>
		<author><name>Chris</name></author>
	</entry>
	<entry>
		<id>https://darkrealm-wiki.darkrealm.dyndns.org/index.php?title=Dreamcast&amp;diff=4874</id>
		<title>Dreamcast</title>
		<link rel="alternate" type="text/html" href="https://darkrealm-wiki.darkrealm.dyndns.org/index.php?title=Dreamcast&amp;diff=4874"/>
		<updated>2026-05-05T21:21:23Z</updated>

		<summary type="html">&lt;p&gt;Chris: /* Draft */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== CDR Sizes ==&lt;br /&gt;
&lt;br /&gt;
80min/700MB: 1st Session 674MB Maximum&lt;br /&gt;
&lt;br /&gt;
90min/800MB: max 748MB when 45000 Sectors in 1st Session with dummy burn&lt;br /&gt;
&lt;br /&gt;
90min/800MB: max ~735MB when 45000 Sectors in 1st Session&lt;br /&gt;
&lt;br /&gt;
== Access Files on CDI Images ==&lt;br /&gt;
&lt;br /&gt;
# Extract the seperate Track first&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cdirip &amp;lt;CDIFILE&amp;gt;.cdi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# In case of 2nd Data Track, fix the LBA first&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
isofix &amp;lt;TRACK02&amp;gt;.iso &amp;lt;LBA Value reported by cdirip&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== What binhack does ==&lt;br /&gt;
&lt;br /&gt;
Changes LBA Value at offset 1461904 ( 8 Bytes before CD001 string) from 6EB0 (45166) to LBA Value+166 specified during binhack.&lt;br /&gt;
&lt;br /&gt;
Adds Region Codes for JAP,EUR and USA and strings for that.&lt;br /&gt;
Adds some bootcode, probably SH4 ASM to make the GDROM accept CDRs.&lt;br /&gt;
&lt;br /&gt;
== What cdda does ==&lt;br /&gt;
&lt;br /&gt;
Changes some bytes, probably SH4 ASM to enable playback of CDDA tracks.&lt;br /&gt;
&lt;br /&gt;
== What dahack does ==&lt;br /&gt;
&lt;br /&gt;
Changes LBA Values at offsets 1301408,1302380 and 1461904. First 2 offsets get rewritten from 5EB0 (45150) to 9600 (150). Third offset gets rewritten from 6EB0 (45166) to LBA Value+166 specified during dahack. 3rd offset change is basically the same what binhack does.&lt;br /&gt;
&lt;br /&gt;
== What hack3 does ==&lt;br /&gt;
&lt;br /&gt;
Changes LBA Values at offsets 1301408,1302380 and 1461904. First 2 offsets get rewritten from 5EB0 (45150) to LBA Value+150 specified during dahack. Third offset gets rewritten from 6EB0 (45166) to LBA Value+166 specified during dahack. 3rd offset change is basically the same what binhack does.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Another Copy Protection ==&lt;br /&gt;
&lt;br /&gt;
Searching for CDE4 036A (or CDE4 436A) and replacing with 0900 0900 is another Copy Protection defeat.&lt;br /&gt;
&lt;br /&gt;
CDE4 436A -&amp;gt; 0900 0900&lt;br /&gt;
1032 0D8B -&amp;gt; 0800 0D8B&lt;br /&gt;
&lt;br /&gt;
== LBA 45000 Trick ==&lt;br /&gt;
&lt;br /&gt;
69120000 bytes in first session will result in LBA 45000.&lt;br /&gt;
&lt;br /&gt;
== Fill 1st Session ISO File to 69120000 bytes with zeros ==&lt;br /&gt;
&lt;br /&gt;
6912000 bytes = 33750 2048-byte-sectors&lt;br /&gt;
&lt;br /&gt;
CORRECTION : Must be 33598 Sectors !!! = 68808703 bytes&lt;br /&gt;
&lt;br /&gt;
1st Session Leadout = 11250 Sectors = 23040000 Bytes&lt;br /&gt;
&lt;br /&gt;
2nd Session will start at Sector 45000&lt;br /&gt;
&lt;br /&gt;
When using extract.exe, add 150 Sectors to LBA reported in gdinfo_FG.exe track05&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dd if=/dev/zero of=&amp;lt;ISOFILE&amp;gt; bs=1 count=1 seek=69119999&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Creating &amp;amp; Burning DATA/DATA ISOs ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Merging track03 &amp;amp; track05 into one file ==&lt;br /&gt;
&lt;br /&gt;
Create dummy file first&lt;br /&gt;
Calculate 1185760800 - &amp;lt;SIZE OF track03.bin + SIZE OF track05.bin&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dd if=/dev/zero bs=1 count=0 seek=&amp;lt;RESULT&amp;gt; of=dummy.bin&lt;br /&gt;
cat track03.bin dummy.bin track05.bin &amp;gt; combined.bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This also helps when extract.exe only outputs garbage out of track03.iso along with track05.iso. This way only the combined.iso needs to be extracted.&lt;br /&gt;
&lt;br /&gt;
== Burning DATA/DATA CDIs ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cdirip &amp;lt;CDIFile&amp;gt; &amp;lt;Destination Directory&amp;gt;&lt;br /&gt;
cdrecord dev=/dev/sr0 -v -multi -tao -xa tdata01.iso&lt;br /&gt;
cdrecord dev=/dev/sr0 -v -tao -xa tdata02.iso&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Full rip process from GD-ROM to CD-ROM ==&lt;br /&gt;
&lt;br /&gt;
=== Get GDROM Data from Dreamcast with http-ack ===&lt;br /&gt;
&lt;br /&gt;
https://www.gotwalls.com&lt;br /&gt;
&lt;br /&gt;
https://github.com/sega-dreamcast/httpd-ack&lt;br /&gt;
&lt;br /&gt;
# Boot HTTP-ack from CD&lt;br /&gt;
# Swap HTTP-ack CD with Original GD-ROm&lt;br /&gt;
# Connect via Browser to http://192.168.1.30&lt;br /&gt;
# Download all files starting with track03.bin&lt;br /&gt;
# Download disc.gdi&lt;br /&gt;
&lt;br /&gt;
=== Extract Data from Tracks ===&lt;br /&gt;
&lt;br /&gt;
==== Use gditools ====&lt;br /&gt;
&lt;br /&gt;
https://sourceforge.net/projects/dcisotools/&lt;br /&gt;
&lt;br /&gt;
Either use GUI or gditools.py&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
python2.7 ./gditools.py &lt;br /&gt;
Usage: ./gditools.py -i input_gdi [options]&lt;br /&gt;
&lt;br /&gt;
  -h, --help             Display this help&lt;br /&gt;
  -l, --list             List all files in the filesystem and exit&lt;br /&gt;
  -o [outdir]            Output directory. Default: gdi folder&lt;br /&gt;
  -s [filename]          Create a sorttxt file with custom name&lt;br /&gt;
                           (It uses *data-folder* as prefix)&lt;br /&gt;
  -b [ipname]            Dump the ip.bin with custom name&lt;br /&gt;
  -e [filename]          Dump a single file from the filesystem&lt;br /&gt;
  --extract-all          Dump all the files in the *data-folder*&lt;br /&gt;
  --data-folder [name]   *data-folder* subfolder. Default: data&lt;br /&gt;
                           (__volume_label__ --&amp;gt; Use ISO9660 volume label)&lt;br /&gt;
  --sort-spacer [num]    Sorttxt entries are sperated by num&lt;br /&gt;
  --silent               Minimal verbosity mode&lt;br /&gt;
  [no option]            Display gdi infos if not silent&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
gditools.py by FamilyGuy, http://sourceforge.net/p/dcisotools/&lt;br /&gt;
    Licensed under GPLv3, see licences folder.&lt;br /&gt;
&lt;br /&gt;
iso9660.py  by Barney Gale, http://github.com/barneygale&lt;br /&gt;
    Licensed under a BSD-based license, see licences folder.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
python2.7 ./gditools.py -i &amp;lt;disc.gdi&amp;gt; --extract-all -o /mnt/development/dreamcast/rips/orgs/&amp;lt;GAME_NAME&amp;gt;/&amp;lt;CD Number&amp;gt; --data-folder __volume_label__ -s sort.txt -b ip.bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Old way ====&lt;br /&gt;
# If the game contains more than track03.bin, combine the 2 binfiles into 1:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cat track03.bin dummy.bin track05.bin &amp;gt; &amp;lt;BINFILE&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
# Convert .BIN Files to .ISO Files first with bin2iso.exe&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bin2iso.exe &amp;lt;BINFILE&amp;gt; &amp;lt;ISOFILE&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
# Extract Data from .ISO files&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
extract.exe &amp;lt;ISOFILE&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
If extracted 1ST_READ.BIN has filesize of 0, LBA of track05 is wrong.&lt;br /&gt;
&lt;br /&gt;
=== Downsampling ===&lt;br /&gt;
&lt;br /&gt;
==== AFS Files ====&lt;br /&gt;
&lt;br /&gt;
https://sizious.com/download/dreamcast/&lt;br /&gt;
&lt;br /&gt;
AFS files contain multiple ADX files combined into one AFS file.&lt;br /&gt;
&lt;br /&gt;
compact AFS with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
AFSCompactor.exe&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
for Alone in the Dark - The New Nightmare .XA files are AFS files, rename first with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rename .XA .afs *.XA&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
then compact and rename back to .XA:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rename .afs .XA *.afs&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
AFSCompactor.exe will rename files inside .afs to file0001 etc... AITD4 doesnt seem to care.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
extract AFS with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
afs_extract.exe *.afs|*.XA&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
or&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
afsextract.exe -sc afsfile|XAfile&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
or&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
afsutils_v2.exe | rename .XA files to .afs beforehand.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== SFD Movies ====&lt;br /&gt;
&lt;br /&gt;
http://www.dc-swat.ru/page/download/&lt;br /&gt;
&lt;br /&gt;
Demux video to .m1v and audio to .wav first&lt;br /&gt;
&lt;br /&gt;
Example (play around with bitrates):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for f in &amp;lt;SFD Files&amp;gt;; do ffmpeg -i $f -vcodec mpeg1video -b:v 2600k -minrate 2600k -maxrate 3600k -y $f.m1v -acodec adpcm_ima_wav -y $f.wav ; done&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Open all .wavs in single Audacity project and mass export again, 16bit and 44100 Hz.&lt;br /&gt;
&lt;br /&gt;
Start Dreamcast Movie Converter and remux/reencode to .SFD. Dont use batch processing, videos get truncated!&lt;br /&gt;
&lt;br /&gt;
==== 4XM Movies ====&lt;br /&gt;
&lt;br /&gt;
http://samples.mplayerhq.hu/game-formats/4xm/&lt;br /&gt;
&lt;br /&gt;
Convert to AVI first with ffmpeg&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for i in ../rips/unmodified/aitd4/cd2/AITD4_GD_2/MOVIES/*.4XM; do ffmpeg -i &amp;quot;$i&amp;quot; -vf scale=320x160 -y &amp;quot;${i%.*}.avi&amp;quot;; done&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Downsample with 4xm_comp.exe&lt;br /&gt;
&lt;br /&gt;
Speed : 30 fps&lt;br /&gt;
Data Rate : 110000&lt;br /&gt;
Resize Width 320 Height 160&lt;br /&gt;
&lt;br /&gt;
=== CDDA Audio ===&lt;br /&gt;
&lt;br /&gt;
Generate file list starting in GD-ROM HD Area after first data Track&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for f in ../backups/GDI/Mortal\ Kombat\ Gold/track*.raw; do   f=&amp;quot;${f}&amp;quot;;   [[ &amp;quot;$f&amp;quot; == *track04.raw ]] &amp;amp;&amp;amp; start=1;   [[ $start -eq 1 ]] &amp;amp;&amp;amp; files+=(&amp;quot;$f&amp;quot;); done&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Burn CDDA Tracks first&lt;br /&gt;
Note: -swab is only neccessary when CDDA is static, depends on the burner.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cdrecord -v -multi -tao -audio -swab &amp;quot;${files[@]}&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then get MSINFO Value for 2nd Session.&lt;br /&gt;
&lt;br /&gt;
=== Create ISO Images ===&lt;br /&gt;
&lt;br /&gt;
For the 1st Session, chosen files must not exceed total of 69120000 bytes!&lt;br /&gt;
&lt;br /&gt;
==== 1st Session ====&lt;br /&gt;
&lt;br /&gt;
===== Create first ISOFile =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkisofs -l -duplicates-once -no-allow-lowercase -graft-points -V &amp;lt;DISCNAME&amp;gt; -o &amp;lt;OUTPUT1.ISO&amp;gt; &amp;lt;CHOSEN FILE&amp;gt; &amp;lt;CHOSEN FILE&amp;gt; &amp;lt;CHOSEN FILE&amp;gt;...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fill first ISOFile with zeros so it takes up exactly 68808703 bytes = LBA 45000&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dd if=/dev/zero of=&amp;lt;OUTPUT1.ISO&amp;gt; bs=1 count=1 seek=68808703&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Burn 1st session =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cdrecord -v -multi -tao -xa &amp;lt;OUTPUT1.ISO&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Check MSINFO value &amp;amp; TOC&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cdrecord -msinfo&lt;br /&gt;
&lt;br /&gt;
0,45000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cdrecord -toc&lt;br /&gt;
&lt;br /&gt;
first: 1 last 1&lt;br /&gt;
track:   1 lba:         0 (        0) 00:02:00 adr: 1 control: 4 mode: -1&lt;br /&gt;
track:lout lba:     33600 (   134400) 07:30:00 adr: 1 control: 4 mode: -1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To include subdirectories into the root directory of the CD, use&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkisofs -l -duplicates-once -no-allow-lowercase -graft-points -V &amp;lt;DISCNAME&amp;gt; -o &amp;lt;OUTPUT1.ISO&amp;gt; &amp;lt;SUBDIRECTORY&amp;gt;/=&amp;lt;PATH_OF_SUBDIRECTORY&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkisofs -no-allow-lowercase -graft-points -l -duplicates-once -V AITD4_GD_2 -o aitd4_d2_1.iso MOVIES/=../rips/modified/aitd4/cd2/AITD4_GD_2/MOVIES/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 2nd Session ====&lt;br /&gt;
&lt;br /&gt;
===== Hack 1ST_READ.BIN &amp;amp; IP.BIN =====&lt;br /&gt;
&lt;br /&gt;
Get MSINFO Value&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cdrecord -msinfo&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
binhack&lt;br /&gt;
&lt;br /&gt;
Enter name of binary: 1ST_READ.BIN&lt;br /&gt;
Enter name of bootsector: ip.bin&lt;br /&gt;
Enter msinfo value: &amp;lt;MSINFO Value&amp;gt;&lt;br /&gt;
File 1ST_READ.BIN successfully hacked. &lt;br /&gt;
Bincon detected, OS flag set to 0.&lt;br /&gt;
File ip.bin successfully created.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Insert custom Logo =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
logoinsert darkrealm.mr IP.BIN&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Burn 2nd Session =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkisofs -sort sort.txt -no-allow-lowercase -l -duplicates-once -V &amp;lt;DISCNAME&amp;gt; -G &amp;lt;IP.BIN&amp;gt; -M &amp;lt;OUTPUT1.ISO&amp;gt; -C &amp;lt;MSINFO VALUE&amp;gt; -o &amp;lt;OUTPUT2.ISO&amp;gt; &amp;lt;GAME_DATA_DIRECTORY&amp;gt;&lt;br /&gt;
cdrecord -v -tao -xa &amp;lt;OUTPUT2.ISO&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
&lt;br /&gt;
* Burn whole stuff to a CD-RW&lt;br /&gt;
* Generate CDI from CD-RW&lt;br /&gt;
** Launch DiscJuggler from emulated Windows Machine and connect via iSCSI&lt;br /&gt;
* Test CDI with ReiCast oder ReDream&lt;br /&gt;
&lt;br /&gt;
== Create CDI Images from ISO ==&lt;br /&gt;
&lt;br /&gt;
* Create ISO first&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkisofs -l -duplicates-once -graft-points -V &amp;lt;DISCNAME&amp;gt; -G &amp;lt;IP.BIN&amp;gt; -o &amp;lt;GAME.ISO&amp;gt; &amp;lt;GAME DIRECTORY&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Create DATA/DATA CDI&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wine cdi4dc.exe &amp;lt;GAME.ISO&amp;gt; /media/chris/development/dreamcast/backups/CDI/tests/&amp;lt;GAME.CDI&amp;gt; -d&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* or create AUDIO/DATA CDI, with 2nd Session starting at LBA 11702&lt;br /&gt;
** Note: 1ST_READ.BIN must eventually be binhacked to LBA 11702&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wine cdi4dc.exe &amp;lt;GAME.ISO&amp;gt; /media/chris/development/dreamcast/backups/CDI/tests/&amp;lt;GAME.CDI&amp;gt; -d&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 60Hz &amp;lt;-&amp;gt; 50Hz Binary Comparisations ==&lt;br /&gt;
&lt;br /&gt;
=== Dino Crisis GER ===&lt;br /&gt;
&lt;br /&gt;
1ST_READ.BIN:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Offset : 0x001545C0&lt;br /&gt;
50Hz : 01 E4 03 A0 02 E4 01 A0 03&lt;br /&gt;
60Hz : 00 E4 03 A0 00 E4 01 A0 00&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tools ==&lt;br /&gt;
&lt;br /&gt;
=== Efficient 1st Session Filler ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
# Prüfen, ob ein Verzeichnis übergeben wurde&lt;br /&gt;
if [ -z &amp;quot;$1&amp;quot; ]; then&lt;br /&gt;
    echo &amp;quot;Usage: $0 &amp;lt;Verzeichnis&amp;gt;&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Prüfen, ob es ein gültiges Verzeichnis ist&lt;br /&gt;
if [ ! -d &amp;quot;$DIR&amp;quot; ]; then&lt;br /&gt;
    echo &amp;quot;Fehler: &#039;$DIR&#039; ist kein gültiges Verzeichnis.&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Maximal erlaubte Größe in Bytes&lt;br /&gt;
MAX_SIZE=68808703&lt;br /&gt;
&lt;br /&gt;
# Ausgabedatei für die Liste&lt;br /&gt;
OUTPUT=&amp;quot;dateiliste.txt&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Leere die Ausgabedatei&lt;br /&gt;
&amp;gt; &amp;quot;$OUTPUT&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Variable für die aktuelle Gesamtsumme&lt;br /&gt;
total_size=0&lt;br /&gt;
&lt;br /&gt;
# Durchlaufe die Dateien im Verzeichnis, sortiert nach Größe absteigend&lt;br /&gt;
while IFS= read -r file; do&lt;br /&gt;
    filesize=$(stat -c%s &amp;quot;$file&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    if (( total_size + filesize &amp;lt;= MAX_SIZE )); then&lt;br /&gt;
#        echo &amp;quot;$filesize $file&amp;quot; &amp;gt;&amp;gt; &amp;quot;$OUTPUT&amp;quot;&lt;br /&gt;
        echo &amp;quot;$file&amp;quot; &amp;gt;&amp;gt; &amp;quot;$OUTPUT&amp;quot;&lt;br /&gt;
        total_size=$((total_size + filesize))&lt;br /&gt;
    fi&lt;br /&gt;
done &amp;lt; &amp;lt;(find &amp;quot;$DIR&amp;quot; -maxdepth 1 -type f -printf &amp;quot;%s %p\n&amp;quot; | sort -nr | awk &#039;{print $2}&#039;)&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Liste erstellt: $OUTPUT&amp;quot;&lt;br /&gt;
echo &amp;quot;Gesamtgröße: $total_size Bytes&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Draft ==&lt;br /&gt;
&lt;br /&gt;
* ./find1stsessionfiles.sh ~/media/development/dreamcast/Rips/modified/aitd4/cd2/AITD4_GD_2/MOVIES&lt;br /&gt;
* mkisofs -l -duplicates-once -no-allow-lowercase -graft-points -V AITD4_GD2 -o aitd4_cd2_s1.iso -path-list ~/media/chris/development/dreamcast/tools/dateiliste.txt&lt;br /&gt;
* cdrecord -v -tao -multi -xa aitd4_d2_s1.iso&lt;br /&gt;
* dd if=/dev/zero of=aitd4_d2_s1.iso bs=1 count=1 seek=69119999&lt;/div&gt;</summary>
		<author><name>Chris</name></author>
	</entry>
	<entry>
		<id>https://darkrealm-wiki.darkrealm.dyndns.org/index.php?title=Dreamcast&amp;diff=4873</id>
		<title>Dreamcast</title>
		<link rel="alternate" type="text/html" href="https://darkrealm-wiki.darkrealm.dyndns.org/index.php?title=Dreamcast&amp;diff=4873"/>
		<updated>2026-05-05T21:15:11Z</updated>

		<summary type="html">&lt;p&gt;Chris: /* Draft */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== CDR Sizes ==&lt;br /&gt;
&lt;br /&gt;
80min/700MB: 1st Session 674MB Maximum&lt;br /&gt;
&lt;br /&gt;
90min/800MB: max 748MB when 45000 Sectors in 1st Session with dummy burn&lt;br /&gt;
&lt;br /&gt;
90min/800MB: max ~735MB when 45000 Sectors in 1st Session&lt;br /&gt;
&lt;br /&gt;
== Access Files on CDI Images ==&lt;br /&gt;
&lt;br /&gt;
# Extract the seperate Track first&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cdirip &amp;lt;CDIFILE&amp;gt;.cdi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# In case of 2nd Data Track, fix the LBA first&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
isofix &amp;lt;TRACK02&amp;gt;.iso &amp;lt;LBA Value reported by cdirip&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== What binhack does ==&lt;br /&gt;
&lt;br /&gt;
Changes LBA Value at offset 1461904 ( 8 Bytes before CD001 string) from 6EB0 (45166) to LBA Value+166 specified during binhack.&lt;br /&gt;
&lt;br /&gt;
Adds Region Codes for JAP,EUR and USA and strings for that.&lt;br /&gt;
Adds some bootcode, probably SH4 ASM to make the GDROM accept CDRs.&lt;br /&gt;
&lt;br /&gt;
== What cdda does ==&lt;br /&gt;
&lt;br /&gt;
Changes some bytes, probably SH4 ASM to enable playback of CDDA tracks.&lt;br /&gt;
&lt;br /&gt;
== What dahack does ==&lt;br /&gt;
&lt;br /&gt;
Changes LBA Values at offsets 1301408,1302380 and 1461904. First 2 offsets get rewritten from 5EB0 (45150) to 9600 (150). Third offset gets rewritten from 6EB0 (45166) to LBA Value+166 specified during dahack. 3rd offset change is basically the same what binhack does.&lt;br /&gt;
&lt;br /&gt;
== What hack3 does ==&lt;br /&gt;
&lt;br /&gt;
Changes LBA Values at offsets 1301408,1302380 and 1461904. First 2 offsets get rewritten from 5EB0 (45150) to LBA Value+150 specified during dahack. Third offset gets rewritten from 6EB0 (45166) to LBA Value+166 specified during dahack. 3rd offset change is basically the same what binhack does.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Another Copy Protection ==&lt;br /&gt;
&lt;br /&gt;
Searching for CDE4 036A (or CDE4 436A) and replacing with 0900 0900 is another Copy Protection defeat.&lt;br /&gt;
&lt;br /&gt;
CDE4 436A -&amp;gt; 0900 0900&lt;br /&gt;
1032 0D8B -&amp;gt; 0800 0D8B&lt;br /&gt;
&lt;br /&gt;
== LBA 45000 Trick ==&lt;br /&gt;
&lt;br /&gt;
69120000 bytes in first session will result in LBA 45000.&lt;br /&gt;
&lt;br /&gt;
== Fill 1st Session ISO File to 69120000 bytes with zeros ==&lt;br /&gt;
&lt;br /&gt;
6912000 bytes = 33750 2048-byte-sectors&lt;br /&gt;
&lt;br /&gt;
CORRECTION : Must be 33598 Sectors !!! = 68808703 bytes&lt;br /&gt;
&lt;br /&gt;
1st Session Leadout = 11250 Sectors = 23040000 Bytes&lt;br /&gt;
&lt;br /&gt;
2nd Session will start at Sector 45000&lt;br /&gt;
&lt;br /&gt;
When using extract.exe, add 150 Sectors to LBA reported in gdinfo_FG.exe track05&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dd if=/dev/zero of=&amp;lt;ISOFILE&amp;gt; bs=1 count=1 seek=69119999&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Creating &amp;amp; Burning DATA/DATA ISOs ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Merging track03 &amp;amp; track05 into one file ==&lt;br /&gt;
&lt;br /&gt;
Create dummy file first&lt;br /&gt;
Calculate 1185760800 - &amp;lt;SIZE OF track03.bin + SIZE OF track05.bin&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dd if=/dev/zero bs=1 count=0 seek=&amp;lt;RESULT&amp;gt; of=dummy.bin&lt;br /&gt;
cat track03.bin dummy.bin track05.bin &amp;gt; combined.bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This also helps when extract.exe only outputs garbage out of track03.iso along with track05.iso. This way only the combined.iso needs to be extracted.&lt;br /&gt;
&lt;br /&gt;
== Burning DATA/DATA CDIs ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cdirip &amp;lt;CDIFile&amp;gt; &amp;lt;Destination Directory&amp;gt;&lt;br /&gt;
cdrecord dev=/dev/sr0 -v -multi -tao -xa tdata01.iso&lt;br /&gt;
cdrecord dev=/dev/sr0 -v -tao -xa tdata02.iso&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Full rip process from GD-ROM to CD-ROM ==&lt;br /&gt;
&lt;br /&gt;
=== Get GDROM Data from Dreamcast with http-ack ===&lt;br /&gt;
&lt;br /&gt;
https://www.gotwalls.com&lt;br /&gt;
&lt;br /&gt;
https://github.com/sega-dreamcast/httpd-ack&lt;br /&gt;
&lt;br /&gt;
# Boot HTTP-ack from CD&lt;br /&gt;
# Swap HTTP-ack CD with Original GD-ROm&lt;br /&gt;
# Connect via Browser to http://192.168.1.30&lt;br /&gt;
# Download all files starting with track03.bin&lt;br /&gt;
# Download disc.gdi&lt;br /&gt;
&lt;br /&gt;
=== Extract Data from Tracks ===&lt;br /&gt;
&lt;br /&gt;
==== Use gditools ====&lt;br /&gt;
&lt;br /&gt;
https://sourceforge.net/projects/dcisotools/&lt;br /&gt;
&lt;br /&gt;
Either use GUI or gditools.py&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
python2.7 ./gditools.py &lt;br /&gt;
Usage: ./gditools.py -i input_gdi [options]&lt;br /&gt;
&lt;br /&gt;
  -h, --help             Display this help&lt;br /&gt;
  -l, --list             List all files in the filesystem and exit&lt;br /&gt;
  -o [outdir]            Output directory. Default: gdi folder&lt;br /&gt;
  -s [filename]          Create a sorttxt file with custom name&lt;br /&gt;
                           (It uses *data-folder* as prefix)&lt;br /&gt;
  -b [ipname]            Dump the ip.bin with custom name&lt;br /&gt;
  -e [filename]          Dump a single file from the filesystem&lt;br /&gt;
  --extract-all          Dump all the files in the *data-folder*&lt;br /&gt;
  --data-folder [name]   *data-folder* subfolder. Default: data&lt;br /&gt;
                           (__volume_label__ --&amp;gt; Use ISO9660 volume label)&lt;br /&gt;
  --sort-spacer [num]    Sorttxt entries are sperated by num&lt;br /&gt;
  --silent               Minimal verbosity mode&lt;br /&gt;
  [no option]            Display gdi infos if not silent&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
gditools.py by FamilyGuy, http://sourceforge.net/p/dcisotools/&lt;br /&gt;
    Licensed under GPLv3, see licences folder.&lt;br /&gt;
&lt;br /&gt;
iso9660.py  by Barney Gale, http://github.com/barneygale&lt;br /&gt;
    Licensed under a BSD-based license, see licences folder.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
python2.7 ./gditools.py -i &amp;lt;disc.gdi&amp;gt; --extract-all -o /mnt/development/dreamcast/rips/orgs/&amp;lt;GAME_NAME&amp;gt;/&amp;lt;CD Number&amp;gt; --data-folder __volume_label__ -s sort.txt -b ip.bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Old way ====&lt;br /&gt;
# If the game contains more than track03.bin, combine the 2 binfiles into 1:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cat track03.bin dummy.bin track05.bin &amp;gt; &amp;lt;BINFILE&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
# Convert .BIN Files to .ISO Files first with bin2iso.exe&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bin2iso.exe &amp;lt;BINFILE&amp;gt; &amp;lt;ISOFILE&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
# Extract Data from .ISO files&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
extract.exe &amp;lt;ISOFILE&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
If extracted 1ST_READ.BIN has filesize of 0, LBA of track05 is wrong.&lt;br /&gt;
&lt;br /&gt;
=== Downsampling ===&lt;br /&gt;
&lt;br /&gt;
==== AFS Files ====&lt;br /&gt;
&lt;br /&gt;
https://sizious.com/download/dreamcast/&lt;br /&gt;
&lt;br /&gt;
AFS files contain multiple ADX files combined into one AFS file.&lt;br /&gt;
&lt;br /&gt;
compact AFS with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
AFSCompactor.exe&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
for Alone in the Dark - The New Nightmare .XA files are AFS files, rename first with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rename .XA .afs *.XA&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
then compact and rename back to .XA:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rename .afs .XA *.afs&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
AFSCompactor.exe will rename files inside .afs to file0001 etc... AITD4 doesnt seem to care.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
extract AFS with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
afs_extract.exe *.afs|*.XA&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
or&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
afsextract.exe -sc afsfile|XAfile&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
or&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
afsutils_v2.exe | rename .XA files to .afs beforehand.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== SFD Movies ====&lt;br /&gt;
&lt;br /&gt;
http://www.dc-swat.ru/page/download/&lt;br /&gt;
&lt;br /&gt;
Demux video to .m1v and audio to .wav first&lt;br /&gt;
&lt;br /&gt;
Example (play around with bitrates):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for f in &amp;lt;SFD Files&amp;gt;; do ffmpeg -i $f -vcodec mpeg1video -b:v 2600k -minrate 2600k -maxrate 3600k -y $f.m1v -acodec adpcm_ima_wav -y $f.wav ; done&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Open all .wavs in single Audacity project and mass export again, 16bit and 44100 Hz.&lt;br /&gt;
&lt;br /&gt;
Start Dreamcast Movie Converter and remux/reencode to .SFD. Dont use batch processing, videos get truncated!&lt;br /&gt;
&lt;br /&gt;
==== 4XM Movies ====&lt;br /&gt;
&lt;br /&gt;
http://samples.mplayerhq.hu/game-formats/4xm/&lt;br /&gt;
&lt;br /&gt;
Convert to AVI first with ffmpeg&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for i in ../rips/unmodified/aitd4/cd2/AITD4_GD_2/MOVIES/*.4XM; do ffmpeg -i &amp;quot;$i&amp;quot; -vf scale=320x160 -y &amp;quot;${i%.*}.avi&amp;quot;; done&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Downsample with 4xm_comp.exe&lt;br /&gt;
&lt;br /&gt;
Speed : 30 fps&lt;br /&gt;
Data Rate : 110000&lt;br /&gt;
Resize Width 320 Height 160&lt;br /&gt;
&lt;br /&gt;
=== CDDA Audio ===&lt;br /&gt;
&lt;br /&gt;
Generate file list starting in GD-ROM HD Area after first data Track&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for f in ../backups/GDI/Mortal\ Kombat\ Gold/track*.raw; do   f=&amp;quot;${f}&amp;quot;;   [[ &amp;quot;$f&amp;quot; == *track04.raw ]] &amp;amp;&amp;amp; start=1;   [[ $start -eq 1 ]] &amp;amp;&amp;amp; files+=(&amp;quot;$f&amp;quot;); done&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Burn CDDA Tracks first&lt;br /&gt;
Note: -swab is only neccessary when CDDA is static, depends on the burner.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cdrecord -v -multi -tao -audio -swab &amp;quot;${files[@]}&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then get MSINFO Value for 2nd Session.&lt;br /&gt;
&lt;br /&gt;
=== Create ISO Images ===&lt;br /&gt;
&lt;br /&gt;
For the 1st Session, chosen files must not exceed total of 69120000 bytes!&lt;br /&gt;
&lt;br /&gt;
==== 1st Session ====&lt;br /&gt;
&lt;br /&gt;
===== Create first ISOFile =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkisofs -l -duplicates-once -no-allow-lowercase -graft-points -V &amp;lt;DISCNAME&amp;gt; -o &amp;lt;OUTPUT1.ISO&amp;gt; &amp;lt;CHOSEN FILE&amp;gt; &amp;lt;CHOSEN FILE&amp;gt; &amp;lt;CHOSEN FILE&amp;gt;...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fill first ISOFile with zeros so it takes up exactly 68808703 bytes = LBA 45000&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dd if=/dev/zero of=&amp;lt;OUTPUT1.ISO&amp;gt; bs=1 count=1 seek=68808703&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Burn 1st session =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cdrecord -v -multi -tao -xa &amp;lt;OUTPUT1.ISO&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Check MSINFO value &amp;amp; TOC&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cdrecord -msinfo&lt;br /&gt;
&lt;br /&gt;
0,45000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cdrecord -toc&lt;br /&gt;
&lt;br /&gt;
first: 1 last 1&lt;br /&gt;
track:   1 lba:         0 (        0) 00:02:00 adr: 1 control: 4 mode: -1&lt;br /&gt;
track:lout lba:     33600 (   134400) 07:30:00 adr: 1 control: 4 mode: -1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To include subdirectories into the root directory of the CD, use&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkisofs -l -duplicates-once -no-allow-lowercase -graft-points -V &amp;lt;DISCNAME&amp;gt; -o &amp;lt;OUTPUT1.ISO&amp;gt; &amp;lt;SUBDIRECTORY&amp;gt;/=&amp;lt;PATH_OF_SUBDIRECTORY&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkisofs -no-allow-lowercase -graft-points -l -duplicates-once -V AITD4_GD_2 -o aitd4_d2_1.iso MOVIES/=../rips/modified/aitd4/cd2/AITD4_GD_2/MOVIES/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 2nd Session ====&lt;br /&gt;
&lt;br /&gt;
===== Hack 1ST_READ.BIN &amp;amp; IP.BIN =====&lt;br /&gt;
&lt;br /&gt;
Get MSINFO Value&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cdrecord -msinfo&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
binhack&lt;br /&gt;
&lt;br /&gt;
Enter name of binary: 1ST_READ.BIN&lt;br /&gt;
Enter name of bootsector: ip.bin&lt;br /&gt;
Enter msinfo value: &amp;lt;MSINFO Value&amp;gt;&lt;br /&gt;
File 1ST_READ.BIN successfully hacked. &lt;br /&gt;
Bincon detected, OS flag set to 0.&lt;br /&gt;
File ip.bin successfully created.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Insert custom Logo =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
logoinsert darkrealm.mr IP.BIN&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Burn 2nd Session =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkisofs -sort sort.txt -no-allow-lowercase -l -duplicates-once -V &amp;lt;DISCNAME&amp;gt; -G &amp;lt;IP.BIN&amp;gt; -M &amp;lt;OUTPUT1.ISO&amp;gt; -C &amp;lt;MSINFO VALUE&amp;gt; -o &amp;lt;OUTPUT2.ISO&amp;gt; &amp;lt;GAME_DATA_DIRECTORY&amp;gt;&lt;br /&gt;
cdrecord -v -tao -xa &amp;lt;OUTPUT2.ISO&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
&lt;br /&gt;
* Burn whole stuff to a CD-RW&lt;br /&gt;
* Generate CDI from CD-RW&lt;br /&gt;
** Launch DiscJuggler from emulated Windows Machine and connect via iSCSI&lt;br /&gt;
* Test CDI with ReiCast oder ReDream&lt;br /&gt;
&lt;br /&gt;
== Create CDI Images from ISO ==&lt;br /&gt;
&lt;br /&gt;
* Create ISO first&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkisofs -l -duplicates-once -graft-points -V &amp;lt;DISCNAME&amp;gt; -G &amp;lt;IP.BIN&amp;gt; -o &amp;lt;GAME.ISO&amp;gt; &amp;lt;GAME DIRECTORY&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Create DATA/DATA CDI&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wine cdi4dc.exe &amp;lt;GAME.ISO&amp;gt; /media/chris/development/dreamcast/backups/CDI/tests/&amp;lt;GAME.CDI&amp;gt; -d&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* or create AUDIO/DATA CDI, with 2nd Session starting at LBA 11702&lt;br /&gt;
** Note: 1ST_READ.BIN must eventually be binhacked to LBA 11702&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wine cdi4dc.exe &amp;lt;GAME.ISO&amp;gt; /media/chris/development/dreamcast/backups/CDI/tests/&amp;lt;GAME.CDI&amp;gt; -d&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 60Hz &amp;lt;-&amp;gt; 50Hz Binary Comparisations ==&lt;br /&gt;
&lt;br /&gt;
=== Dino Crisis GER ===&lt;br /&gt;
&lt;br /&gt;
1ST_READ.BIN:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Offset : 0x001545C0&lt;br /&gt;
50Hz : 01 E4 03 A0 02 E4 01 A0 03&lt;br /&gt;
60Hz : 00 E4 03 A0 00 E4 01 A0 00&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tools ==&lt;br /&gt;
&lt;br /&gt;
=== Efficient 1st Session Filler ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
# Prüfen, ob ein Verzeichnis übergeben wurde&lt;br /&gt;
if [ -z &amp;quot;$1&amp;quot; ]; then&lt;br /&gt;
    echo &amp;quot;Usage: $0 &amp;lt;Verzeichnis&amp;gt;&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Prüfen, ob es ein gültiges Verzeichnis ist&lt;br /&gt;
if [ ! -d &amp;quot;$DIR&amp;quot; ]; then&lt;br /&gt;
    echo &amp;quot;Fehler: &#039;$DIR&#039; ist kein gültiges Verzeichnis.&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Maximal erlaubte Größe in Bytes&lt;br /&gt;
MAX_SIZE=68808703&lt;br /&gt;
&lt;br /&gt;
# Ausgabedatei für die Liste&lt;br /&gt;
OUTPUT=&amp;quot;dateiliste.txt&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Leere die Ausgabedatei&lt;br /&gt;
&amp;gt; &amp;quot;$OUTPUT&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Variable für die aktuelle Gesamtsumme&lt;br /&gt;
total_size=0&lt;br /&gt;
&lt;br /&gt;
# Durchlaufe die Dateien im Verzeichnis, sortiert nach Größe absteigend&lt;br /&gt;
while IFS= read -r file; do&lt;br /&gt;
    filesize=$(stat -c%s &amp;quot;$file&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    if (( total_size + filesize &amp;lt;= MAX_SIZE )); then&lt;br /&gt;
#        echo &amp;quot;$filesize $file&amp;quot; &amp;gt;&amp;gt; &amp;quot;$OUTPUT&amp;quot;&lt;br /&gt;
        echo &amp;quot;$file&amp;quot; &amp;gt;&amp;gt; &amp;quot;$OUTPUT&amp;quot;&lt;br /&gt;
        total_size=$((total_size + filesize))&lt;br /&gt;
    fi&lt;br /&gt;
done &amp;lt; &amp;lt;(find &amp;quot;$DIR&amp;quot; -maxdepth 1 -type f -printf &amp;quot;%s %p\n&amp;quot; | sort -nr | awk &#039;{print $2}&#039;)&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Liste erstellt: $OUTPUT&amp;quot;&lt;br /&gt;
echo &amp;quot;Gesamtgröße: $total_size Bytes&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Draft ==&lt;br /&gt;
&lt;br /&gt;
* ./find1stsessionfiles.sh ~/media/development/dreamcast/Rips/modified/aitd4/cd2/AITD4_GD_2/MOVIES&lt;br /&gt;
* mkisofs -l -duplicates-once -no-allow-lowercase -graft-points -V AITD4_GD2 -o aitd4_cd2_s1.iso -path-list ~/media/chris/development/dreamcast/tools/dateiliste.txt&lt;br /&gt;
* cdrecord -v -tao -multi -xa aitd4_d2_s1.iso&lt;/div&gt;</summary>
		<author><name>Chris</name></author>
	</entry>
	<entry>
		<id>https://darkrealm-wiki.darkrealm.dyndns.org/index.php?title=Dreamcast&amp;diff=4872</id>
		<title>Dreamcast</title>
		<link rel="alternate" type="text/html" href="https://darkrealm-wiki.darkrealm.dyndns.org/index.php?title=Dreamcast&amp;diff=4872"/>
		<updated>2026-05-05T21:08:27Z</updated>

		<summary type="html">&lt;p&gt;Chris: /* Tools */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== CDR Sizes ==&lt;br /&gt;
&lt;br /&gt;
80min/700MB: 1st Session 674MB Maximum&lt;br /&gt;
&lt;br /&gt;
90min/800MB: max 748MB when 45000 Sectors in 1st Session with dummy burn&lt;br /&gt;
&lt;br /&gt;
90min/800MB: max ~735MB when 45000 Sectors in 1st Session&lt;br /&gt;
&lt;br /&gt;
== Access Files on CDI Images ==&lt;br /&gt;
&lt;br /&gt;
# Extract the seperate Track first&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cdirip &amp;lt;CDIFILE&amp;gt;.cdi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# In case of 2nd Data Track, fix the LBA first&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
isofix &amp;lt;TRACK02&amp;gt;.iso &amp;lt;LBA Value reported by cdirip&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== What binhack does ==&lt;br /&gt;
&lt;br /&gt;
Changes LBA Value at offset 1461904 ( 8 Bytes before CD001 string) from 6EB0 (45166) to LBA Value+166 specified during binhack.&lt;br /&gt;
&lt;br /&gt;
Adds Region Codes for JAP,EUR and USA and strings for that.&lt;br /&gt;
Adds some bootcode, probably SH4 ASM to make the GDROM accept CDRs.&lt;br /&gt;
&lt;br /&gt;
== What cdda does ==&lt;br /&gt;
&lt;br /&gt;
Changes some bytes, probably SH4 ASM to enable playback of CDDA tracks.&lt;br /&gt;
&lt;br /&gt;
== What dahack does ==&lt;br /&gt;
&lt;br /&gt;
Changes LBA Values at offsets 1301408,1302380 and 1461904. First 2 offsets get rewritten from 5EB0 (45150) to 9600 (150). Third offset gets rewritten from 6EB0 (45166) to LBA Value+166 specified during dahack. 3rd offset change is basically the same what binhack does.&lt;br /&gt;
&lt;br /&gt;
== What hack3 does ==&lt;br /&gt;
&lt;br /&gt;
Changes LBA Values at offsets 1301408,1302380 and 1461904. First 2 offsets get rewritten from 5EB0 (45150) to LBA Value+150 specified during dahack. Third offset gets rewritten from 6EB0 (45166) to LBA Value+166 specified during dahack. 3rd offset change is basically the same what binhack does.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Another Copy Protection ==&lt;br /&gt;
&lt;br /&gt;
Searching for CDE4 036A (or CDE4 436A) and replacing with 0900 0900 is another Copy Protection defeat.&lt;br /&gt;
&lt;br /&gt;
CDE4 436A -&amp;gt; 0900 0900&lt;br /&gt;
1032 0D8B -&amp;gt; 0800 0D8B&lt;br /&gt;
&lt;br /&gt;
== LBA 45000 Trick ==&lt;br /&gt;
&lt;br /&gt;
69120000 bytes in first session will result in LBA 45000.&lt;br /&gt;
&lt;br /&gt;
== Fill 1st Session ISO File to 69120000 bytes with zeros ==&lt;br /&gt;
&lt;br /&gt;
6912000 bytes = 33750 2048-byte-sectors&lt;br /&gt;
&lt;br /&gt;
CORRECTION : Must be 33598 Sectors !!! = 68808703 bytes&lt;br /&gt;
&lt;br /&gt;
1st Session Leadout = 11250 Sectors = 23040000 Bytes&lt;br /&gt;
&lt;br /&gt;
2nd Session will start at Sector 45000&lt;br /&gt;
&lt;br /&gt;
When using extract.exe, add 150 Sectors to LBA reported in gdinfo_FG.exe track05&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dd if=/dev/zero of=&amp;lt;ISOFILE&amp;gt; bs=1 count=1 seek=69119999&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Creating &amp;amp; Burning DATA/DATA ISOs ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Merging track03 &amp;amp; track05 into one file ==&lt;br /&gt;
&lt;br /&gt;
Create dummy file first&lt;br /&gt;
Calculate 1185760800 - &amp;lt;SIZE OF track03.bin + SIZE OF track05.bin&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dd if=/dev/zero bs=1 count=0 seek=&amp;lt;RESULT&amp;gt; of=dummy.bin&lt;br /&gt;
cat track03.bin dummy.bin track05.bin &amp;gt; combined.bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This also helps when extract.exe only outputs garbage out of track03.iso along with track05.iso. This way only the combined.iso needs to be extracted.&lt;br /&gt;
&lt;br /&gt;
== Burning DATA/DATA CDIs ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cdirip &amp;lt;CDIFile&amp;gt; &amp;lt;Destination Directory&amp;gt;&lt;br /&gt;
cdrecord dev=/dev/sr0 -v -multi -tao -xa tdata01.iso&lt;br /&gt;
cdrecord dev=/dev/sr0 -v -tao -xa tdata02.iso&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Full rip process from GD-ROM to CD-ROM ==&lt;br /&gt;
&lt;br /&gt;
=== Get GDROM Data from Dreamcast with http-ack ===&lt;br /&gt;
&lt;br /&gt;
https://www.gotwalls.com&lt;br /&gt;
&lt;br /&gt;
https://github.com/sega-dreamcast/httpd-ack&lt;br /&gt;
&lt;br /&gt;
# Boot HTTP-ack from CD&lt;br /&gt;
# Swap HTTP-ack CD with Original GD-ROm&lt;br /&gt;
# Connect via Browser to http://192.168.1.30&lt;br /&gt;
# Download all files starting with track03.bin&lt;br /&gt;
# Download disc.gdi&lt;br /&gt;
&lt;br /&gt;
=== Extract Data from Tracks ===&lt;br /&gt;
&lt;br /&gt;
==== Use gditools ====&lt;br /&gt;
&lt;br /&gt;
https://sourceforge.net/projects/dcisotools/&lt;br /&gt;
&lt;br /&gt;
Either use GUI or gditools.py&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
python2.7 ./gditools.py &lt;br /&gt;
Usage: ./gditools.py -i input_gdi [options]&lt;br /&gt;
&lt;br /&gt;
  -h, --help             Display this help&lt;br /&gt;
  -l, --list             List all files in the filesystem and exit&lt;br /&gt;
  -o [outdir]            Output directory. Default: gdi folder&lt;br /&gt;
  -s [filename]          Create a sorttxt file with custom name&lt;br /&gt;
                           (It uses *data-folder* as prefix)&lt;br /&gt;
  -b [ipname]            Dump the ip.bin with custom name&lt;br /&gt;
  -e [filename]          Dump a single file from the filesystem&lt;br /&gt;
  --extract-all          Dump all the files in the *data-folder*&lt;br /&gt;
  --data-folder [name]   *data-folder* subfolder. Default: data&lt;br /&gt;
                           (__volume_label__ --&amp;gt; Use ISO9660 volume label)&lt;br /&gt;
  --sort-spacer [num]    Sorttxt entries are sperated by num&lt;br /&gt;
  --silent               Minimal verbosity mode&lt;br /&gt;
  [no option]            Display gdi infos if not silent&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
gditools.py by FamilyGuy, http://sourceforge.net/p/dcisotools/&lt;br /&gt;
    Licensed under GPLv3, see licences folder.&lt;br /&gt;
&lt;br /&gt;
iso9660.py  by Barney Gale, http://github.com/barneygale&lt;br /&gt;
    Licensed under a BSD-based license, see licences folder.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
python2.7 ./gditools.py -i &amp;lt;disc.gdi&amp;gt; --extract-all -o /mnt/development/dreamcast/rips/orgs/&amp;lt;GAME_NAME&amp;gt;/&amp;lt;CD Number&amp;gt; --data-folder __volume_label__ -s sort.txt -b ip.bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Old way ====&lt;br /&gt;
# If the game contains more than track03.bin, combine the 2 binfiles into 1:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cat track03.bin dummy.bin track05.bin &amp;gt; &amp;lt;BINFILE&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
# Convert .BIN Files to .ISO Files first with bin2iso.exe&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bin2iso.exe &amp;lt;BINFILE&amp;gt; &amp;lt;ISOFILE&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
# Extract Data from .ISO files&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
extract.exe &amp;lt;ISOFILE&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
If extracted 1ST_READ.BIN has filesize of 0, LBA of track05 is wrong.&lt;br /&gt;
&lt;br /&gt;
=== Downsampling ===&lt;br /&gt;
&lt;br /&gt;
==== AFS Files ====&lt;br /&gt;
&lt;br /&gt;
https://sizious.com/download/dreamcast/&lt;br /&gt;
&lt;br /&gt;
AFS files contain multiple ADX files combined into one AFS file.&lt;br /&gt;
&lt;br /&gt;
compact AFS with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
AFSCompactor.exe&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
for Alone in the Dark - The New Nightmare .XA files are AFS files, rename first with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rename .XA .afs *.XA&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
then compact and rename back to .XA:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rename .afs .XA *.afs&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
AFSCompactor.exe will rename files inside .afs to file0001 etc... AITD4 doesnt seem to care.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
extract AFS with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
afs_extract.exe *.afs|*.XA&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
or&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
afsextract.exe -sc afsfile|XAfile&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
or&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
afsutils_v2.exe | rename .XA files to .afs beforehand.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== SFD Movies ====&lt;br /&gt;
&lt;br /&gt;
http://www.dc-swat.ru/page/download/&lt;br /&gt;
&lt;br /&gt;
Demux video to .m1v and audio to .wav first&lt;br /&gt;
&lt;br /&gt;
Example (play around with bitrates):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for f in &amp;lt;SFD Files&amp;gt;; do ffmpeg -i $f -vcodec mpeg1video -b:v 2600k -minrate 2600k -maxrate 3600k -y $f.m1v -acodec adpcm_ima_wav -y $f.wav ; done&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Open all .wavs in single Audacity project and mass export again, 16bit and 44100 Hz.&lt;br /&gt;
&lt;br /&gt;
Start Dreamcast Movie Converter and remux/reencode to .SFD. Dont use batch processing, videos get truncated!&lt;br /&gt;
&lt;br /&gt;
==== 4XM Movies ====&lt;br /&gt;
&lt;br /&gt;
http://samples.mplayerhq.hu/game-formats/4xm/&lt;br /&gt;
&lt;br /&gt;
Convert to AVI first with ffmpeg&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for i in ../rips/unmodified/aitd4/cd2/AITD4_GD_2/MOVIES/*.4XM; do ffmpeg -i &amp;quot;$i&amp;quot; -vf scale=320x160 -y &amp;quot;${i%.*}.avi&amp;quot;; done&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Downsample with 4xm_comp.exe&lt;br /&gt;
&lt;br /&gt;
Speed : 30 fps&lt;br /&gt;
Data Rate : 110000&lt;br /&gt;
Resize Width 320 Height 160&lt;br /&gt;
&lt;br /&gt;
=== CDDA Audio ===&lt;br /&gt;
&lt;br /&gt;
Generate file list starting in GD-ROM HD Area after first data Track&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for f in ../backups/GDI/Mortal\ Kombat\ Gold/track*.raw; do   f=&amp;quot;${f}&amp;quot;;   [[ &amp;quot;$f&amp;quot; == *track04.raw ]] &amp;amp;&amp;amp; start=1;   [[ $start -eq 1 ]] &amp;amp;&amp;amp; files+=(&amp;quot;$f&amp;quot;); done&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Burn CDDA Tracks first&lt;br /&gt;
Note: -swab is only neccessary when CDDA is static, depends on the burner.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cdrecord -v -multi -tao -audio -swab &amp;quot;${files[@]}&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then get MSINFO Value for 2nd Session.&lt;br /&gt;
&lt;br /&gt;
=== Create ISO Images ===&lt;br /&gt;
&lt;br /&gt;
For the 1st Session, chosen files must not exceed total of 69120000 bytes!&lt;br /&gt;
&lt;br /&gt;
==== 1st Session ====&lt;br /&gt;
&lt;br /&gt;
===== Create first ISOFile =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkisofs -l -duplicates-once -no-allow-lowercase -graft-points -V &amp;lt;DISCNAME&amp;gt; -o &amp;lt;OUTPUT1.ISO&amp;gt; &amp;lt;CHOSEN FILE&amp;gt; &amp;lt;CHOSEN FILE&amp;gt; &amp;lt;CHOSEN FILE&amp;gt;...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fill first ISOFile with zeros so it takes up exactly 68808703 bytes = LBA 45000&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dd if=/dev/zero of=&amp;lt;OUTPUT1.ISO&amp;gt; bs=1 count=1 seek=68808703&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Burn 1st session =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cdrecord -v -multi -tao -xa &amp;lt;OUTPUT1.ISO&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Check MSINFO value &amp;amp; TOC&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cdrecord -msinfo&lt;br /&gt;
&lt;br /&gt;
0,45000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cdrecord -toc&lt;br /&gt;
&lt;br /&gt;
first: 1 last 1&lt;br /&gt;
track:   1 lba:         0 (        0) 00:02:00 adr: 1 control: 4 mode: -1&lt;br /&gt;
track:lout lba:     33600 (   134400) 07:30:00 adr: 1 control: 4 mode: -1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To include subdirectories into the root directory of the CD, use&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkisofs -l -duplicates-once -no-allow-lowercase -graft-points -V &amp;lt;DISCNAME&amp;gt; -o &amp;lt;OUTPUT1.ISO&amp;gt; &amp;lt;SUBDIRECTORY&amp;gt;/=&amp;lt;PATH_OF_SUBDIRECTORY&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkisofs -no-allow-lowercase -graft-points -l -duplicates-once -V AITD4_GD_2 -o aitd4_d2_1.iso MOVIES/=../rips/modified/aitd4/cd2/AITD4_GD_2/MOVIES/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 2nd Session ====&lt;br /&gt;
&lt;br /&gt;
===== Hack 1ST_READ.BIN &amp;amp; IP.BIN =====&lt;br /&gt;
&lt;br /&gt;
Get MSINFO Value&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cdrecord -msinfo&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
binhack&lt;br /&gt;
&lt;br /&gt;
Enter name of binary: 1ST_READ.BIN&lt;br /&gt;
Enter name of bootsector: ip.bin&lt;br /&gt;
Enter msinfo value: &amp;lt;MSINFO Value&amp;gt;&lt;br /&gt;
File 1ST_READ.BIN successfully hacked. &lt;br /&gt;
Bincon detected, OS flag set to 0.&lt;br /&gt;
File ip.bin successfully created.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Insert custom Logo =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
logoinsert darkrealm.mr IP.BIN&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Burn 2nd Session =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkisofs -sort sort.txt -no-allow-lowercase -l -duplicates-once -V &amp;lt;DISCNAME&amp;gt; -G &amp;lt;IP.BIN&amp;gt; -M &amp;lt;OUTPUT1.ISO&amp;gt; -C &amp;lt;MSINFO VALUE&amp;gt; -o &amp;lt;OUTPUT2.ISO&amp;gt; &amp;lt;GAME_DATA_DIRECTORY&amp;gt;&lt;br /&gt;
cdrecord -v -tao -xa &amp;lt;OUTPUT2.ISO&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
&lt;br /&gt;
* Burn whole stuff to a CD-RW&lt;br /&gt;
* Generate CDI from CD-RW&lt;br /&gt;
** Launch DiscJuggler from emulated Windows Machine and connect via iSCSI&lt;br /&gt;
* Test CDI with ReiCast oder ReDream&lt;br /&gt;
&lt;br /&gt;
== Create CDI Images from ISO ==&lt;br /&gt;
&lt;br /&gt;
* Create ISO first&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkisofs -l -duplicates-once -graft-points -V &amp;lt;DISCNAME&amp;gt; -G &amp;lt;IP.BIN&amp;gt; -o &amp;lt;GAME.ISO&amp;gt; &amp;lt;GAME DIRECTORY&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Create DATA/DATA CDI&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wine cdi4dc.exe &amp;lt;GAME.ISO&amp;gt; /media/chris/development/dreamcast/backups/CDI/tests/&amp;lt;GAME.CDI&amp;gt; -d&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* or create AUDIO/DATA CDI, with 2nd Session starting at LBA 11702&lt;br /&gt;
** Note: 1ST_READ.BIN must eventually be binhacked to LBA 11702&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wine cdi4dc.exe &amp;lt;GAME.ISO&amp;gt; /media/chris/development/dreamcast/backups/CDI/tests/&amp;lt;GAME.CDI&amp;gt; -d&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 60Hz &amp;lt;-&amp;gt; 50Hz Binary Comparisations ==&lt;br /&gt;
&lt;br /&gt;
=== Dino Crisis GER ===&lt;br /&gt;
&lt;br /&gt;
1ST_READ.BIN:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Offset : 0x001545C0&lt;br /&gt;
50Hz : 01 E4 03 A0 02 E4 01 A0 03&lt;br /&gt;
60Hz : 00 E4 03 A0 00 E4 01 A0 00&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tools ==&lt;br /&gt;
&lt;br /&gt;
=== Efficient 1st Session Filler ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
# Prüfen, ob ein Verzeichnis übergeben wurde&lt;br /&gt;
if [ -z &amp;quot;$1&amp;quot; ]; then&lt;br /&gt;
    echo &amp;quot;Usage: $0 &amp;lt;Verzeichnis&amp;gt;&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Prüfen, ob es ein gültiges Verzeichnis ist&lt;br /&gt;
if [ ! -d &amp;quot;$DIR&amp;quot; ]; then&lt;br /&gt;
    echo &amp;quot;Fehler: &#039;$DIR&#039; ist kein gültiges Verzeichnis.&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Maximal erlaubte Größe in Bytes&lt;br /&gt;
MAX_SIZE=68808703&lt;br /&gt;
&lt;br /&gt;
# Ausgabedatei für die Liste&lt;br /&gt;
OUTPUT=&amp;quot;dateiliste.txt&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Leere die Ausgabedatei&lt;br /&gt;
&amp;gt; &amp;quot;$OUTPUT&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Variable für die aktuelle Gesamtsumme&lt;br /&gt;
total_size=0&lt;br /&gt;
&lt;br /&gt;
# Durchlaufe die Dateien im Verzeichnis, sortiert nach Größe absteigend&lt;br /&gt;
while IFS= read -r file; do&lt;br /&gt;
    filesize=$(stat -c%s &amp;quot;$file&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    if (( total_size + filesize &amp;lt;= MAX_SIZE )); then&lt;br /&gt;
#        echo &amp;quot;$filesize $file&amp;quot; &amp;gt;&amp;gt; &amp;quot;$OUTPUT&amp;quot;&lt;br /&gt;
        echo &amp;quot;$file&amp;quot; &amp;gt;&amp;gt; &amp;quot;$OUTPUT&amp;quot;&lt;br /&gt;
        total_size=$((total_size + filesize))&lt;br /&gt;
    fi&lt;br /&gt;
done &amp;lt; &amp;lt;(find &amp;quot;$DIR&amp;quot; -maxdepth 1 -type f -printf &amp;quot;%s %p\n&amp;quot; | sort -nr | awk &#039;{print $2}&#039;)&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Liste erstellt: $OUTPUT&amp;quot;&lt;br /&gt;
echo &amp;quot;Gesamtgröße: $total_size Bytes&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Draft ==&lt;/div&gt;</summary>
		<author><name>Chris</name></author>
	</entry>
	<entry>
		<id>https://darkrealm-wiki.darkrealm.dyndns.org/index.php?title=Dreamcast&amp;diff=4871</id>
		<title>Dreamcast</title>
		<link rel="alternate" type="text/html" href="https://darkrealm-wiki.darkrealm.dyndns.org/index.php?title=Dreamcast&amp;diff=4871"/>
		<updated>2026-05-05T21:03:36Z</updated>

		<summary type="html">&lt;p&gt;Chris: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== CDR Sizes ==&lt;br /&gt;
&lt;br /&gt;
80min/700MB: 1st Session 674MB Maximum&lt;br /&gt;
&lt;br /&gt;
90min/800MB: max 748MB when 45000 Sectors in 1st Session with dummy burn&lt;br /&gt;
&lt;br /&gt;
90min/800MB: max ~735MB when 45000 Sectors in 1st Session&lt;br /&gt;
&lt;br /&gt;
== Access Files on CDI Images ==&lt;br /&gt;
&lt;br /&gt;
# Extract the seperate Track first&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cdirip &amp;lt;CDIFILE&amp;gt;.cdi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# In case of 2nd Data Track, fix the LBA first&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
isofix &amp;lt;TRACK02&amp;gt;.iso &amp;lt;LBA Value reported by cdirip&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== What binhack does ==&lt;br /&gt;
&lt;br /&gt;
Changes LBA Value at offset 1461904 ( 8 Bytes before CD001 string) from 6EB0 (45166) to LBA Value+166 specified during binhack.&lt;br /&gt;
&lt;br /&gt;
Adds Region Codes for JAP,EUR and USA and strings for that.&lt;br /&gt;
Adds some bootcode, probably SH4 ASM to make the GDROM accept CDRs.&lt;br /&gt;
&lt;br /&gt;
== What cdda does ==&lt;br /&gt;
&lt;br /&gt;
Changes some bytes, probably SH4 ASM to enable playback of CDDA tracks.&lt;br /&gt;
&lt;br /&gt;
== What dahack does ==&lt;br /&gt;
&lt;br /&gt;
Changes LBA Values at offsets 1301408,1302380 and 1461904. First 2 offsets get rewritten from 5EB0 (45150) to 9600 (150). Third offset gets rewritten from 6EB0 (45166) to LBA Value+166 specified during dahack. 3rd offset change is basically the same what binhack does.&lt;br /&gt;
&lt;br /&gt;
== What hack3 does ==&lt;br /&gt;
&lt;br /&gt;
Changes LBA Values at offsets 1301408,1302380 and 1461904. First 2 offsets get rewritten from 5EB0 (45150) to LBA Value+150 specified during dahack. Third offset gets rewritten from 6EB0 (45166) to LBA Value+166 specified during dahack. 3rd offset change is basically the same what binhack does.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Another Copy Protection ==&lt;br /&gt;
&lt;br /&gt;
Searching for CDE4 036A (or CDE4 436A) and replacing with 0900 0900 is another Copy Protection defeat.&lt;br /&gt;
&lt;br /&gt;
CDE4 436A -&amp;gt; 0900 0900&lt;br /&gt;
1032 0D8B -&amp;gt; 0800 0D8B&lt;br /&gt;
&lt;br /&gt;
== LBA 45000 Trick ==&lt;br /&gt;
&lt;br /&gt;
69120000 bytes in first session will result in LBA 45000.&lt;br /&gt;
&lt;br /&gt;
== Fill 1st Session ISO File to 69120000 bytes with zeros ==&lt;br /&gt;
&lt;br /&gt;
6912000 bytes = 33750 2048-byte-sectors&lt;br /&gt;
&lt;br /&gt;
CORRECTION : Must be 33598 Sectors !!! = 68808703 bytes&lt;br /&gt;
&lt;br /&gt;
1st Session Leadout = 11250 Sectors = 23040000 Bytes&lt;br /&gt;
&lt;br /&gt;
2nd Session will start at Sector 45000&lt;br /&gt;
&lt;br /&gt;
When using extract.exe, add 150 Sectors to LBA reported in gdinfo_FG.exe track05&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dd if=/dev/zero of=&amp;lt;ISOFILE&amp;gt; bs=1 count=1 seek=69119999&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Creating &amp;amp; Burning DATA/DATA ISOs ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Merging track03 &amp;amp; track05 into one file ==&lt;br /&gt;
&lt;br /&gt;
Create dummy file first&lt;br /&gt;
Calculate 1185760800 - &amp;lt;SIZE OF track03.bin + SIZE OF track05.bin&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dd if=/dev/zero bs=1 count=0 seek=&amp;lt;RESULT&amp;gt; of=dummy.bin&lt;br /&gt;
cat track03.bin dummy.bin track05.bin &amp;gt; combined.bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This also helps when extract.exe only outputs garbage out of track03.iso along with track05.iso. This way only the combined.iso needs to be extracted.&lt;br /&gt;
&lt;br /&gt;
== Burning DATA/DATA CDIs ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cdirip &amp;lt;CDIFile&amp;gt; &amp;lt;Destination Directory&amp;gt;&lt;br /&gt;
cdrecord dev=/dev/sr0 -v -multi -tao -xa tdata01.iso&lt;br /&gt;
cdrecord dev=/dev/sr0 -v -tao -xa tdata02.iso&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Full rip process from GD-ROM to CD-ROM ==&lt;br /&gt;
&lt;br /&gt;
=== Get GDROM Data from Dreamcast with http-ack ===&lt;br /&gt;
&lt;br /&gt;
https://www.gotwalls.com&lt;br /&gt;
&lt;br /&gt;
https://github.com/sega-dreamcast/httpd-ack&lt;br /&gt;
&lt;br /&gt;
# Boot HTTP-ack from CD&lt;br /&gt;
# Swap HTTP-ack CD with Original GD-ROm&lt;br /&gt;
# Connect via Browser to http://192.168.1.30&lt;br /&gt;
# Download all files starting with track03.bin&lt;br /&gt;
# Download disc.gdi&lt;br /&gt;
&lt;br /&gt;
=== Extract Data from Tracks ===&lt;br /&gt;
&lt;br /&gt;
==== Use gditools ====&lt;br /&gt;
&lt;br /&gt;
https://sourceforge.net/projects/dcisotools/&lt;br /&gt;
&lt;br /&gt;
Either use GUI or gditools.py&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
python2.7 ./gditools.py &lt;br /&gt;
Usage: ./gditools.py -i input_gdi [options]&lt;br /&gt;
&lt;br /&gt;
  -h, --help             Display this help&lt;br /&gt;
  -l, --list             List all files in the filesystem and exit&lt;br /&gt;
  -o [outdir]            Output directory. Default: gdi folder&lt;br /&gt;
  -s [filename]          Create a sorttxt file with custom name&lt;br /&gt;
                           (It uses *data-folder* as prefix)&lt;br /&gt;
  -b [ipname]            Dump the ip.bin with custom name&lt;br /&gt;
  -e [filename]          Dump a single file from the filesystem&lt;br /&gt;
  --extract-all          Dump all the files in the *data-folder*&lt;br /&gt;
  --data-folder [name]   *data-folder* subfolder. Default: data&lt;br /&gt;
                           (__volume_label__ --&amp;gt; Use ISO9660 volume label)&lt;br /&gt;
  --sort-spacer [num]    Sorttxt entries are sperated by num&lt;br /&gt;
  --silent               Minimal verbosity mode&lt;br /&gt;
  [no option]            Display gdi infos if not silent&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
gditools.py by FamilyGuy, http://sourceforge.net/p/dcisotools/&lt;br /&gt;
    Licensed under GPLv3, see licences folder.&lt;br /&gt;
&lt;br /&gt;
iso9660.py  by Barney Gale, http://github.com/barneygale&lt;br /&gt;
    Licensed under a BSD-based license, see licences folder.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
python2.7 ./gditools.py -i &amp;lt;disc.gdi&amp;gt; --extract-all -o /mnt/development/dreamcast/rips/orgs/&amp;lt;GAME_NAME&amp;gt;/&amp;lt;CD Number&amp;gt; --data-folder __volume_label__ -s sort.txt -b ip.bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Old way ====&lt;br /&gt;
# If the game contains more than track03.bin, combine the 2 binfiles into 1:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cat track03.bin dummy.bin track05.bin &amp;gt; &amp;lt;BINFILE&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
# Convert .BIN Files to .ISO Files first with bin2iso.exe&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bin2iso.exe &amp;lt;BINFILE&amp;gt; &amp;lt;ISOFILE&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
# Extract Data from .ISO files&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
extract.exe &amp;lt;ISOFILE&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
If extracted 1ST_READ.BIN has filesize of 0, LBA of track05 is wrong.&lt;br /&gt;
&lt;br /&gt;
=== Downsampling ===&lt;br /&gt;
&lt;br /&gt;
==== AFS Files ====&lt;br /&gt;
&lt;br /&gt;
https://sizious.com/download/dreamcast/&lt;br /&gt;
&lt;br /&gt;
AFS files contain multiple ADX files combined into one AFS file.&lt;br /&gt;
&lt;br /&gt;
compact AFS with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
AFSCompactor.exe&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
for Alone in the Dark - The New Nightmare .XA files are AFS files, rename first with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rename .XA .afs *.XA&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
then compact and rename back to .XA:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rename .afs .XA *.afs&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
AFSCompactor.exe will rename files inside .afs to file0001 etc... AITD4 doesnt seem to care.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
extract AFS with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
afs_extract.exe *.afs|*.XA&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
or&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
afsextract.exe -sc afsfile|XAfile&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
or&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
afsutils_v2.exe | rename .XA files to .afs beforehand.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== SFD Movies ====&lt;br /&gt;
&lt;br /&gt;
http://www.dc-swat.ru/page/download/&lt;br /&gt;
&lt;br /&gt;
Demux video to .m1v and audio to .wav first&lt;br /&gt;
&lt;br /&gt;
Example (play around with bitrates):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for f in &amp;lt;SFD Files&amp;gt;; do ffmpeg -i $f -vcodec mpeg1video -b:v 2600k -minrate 2600k -maxrate 3600k -y $f.m1v -acodec adpcm_ima_wav -y $f.wav ; done&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Open all .wavs in single Audacity project and mass export again, 16bit and 44100 Hz.&lt;br /&gt;
&lt;br /&gt;
Start Dreamcast Movie Converter and remux/reencode to .SFD. Dont use batch processing, videos get truncated!&lt;br /&gt;
&lt;br /&gt;
==== 4XM Movies ====&lt;br /&gt;
&lt;br /&gt;
http://samples.mplayerhq.hu/game-formats/4xm/&lt;br /&gt;
&lt;br /&gt;
Convert to AVI first with ffmpeg&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for i in ../rips/unmodified/aitd4/cd2/AITD4_GD_2/MOVIES/*.4XM; do ffmpeg -i &amp;quot;$i&amp;quot; -vf scale=320x160 -y &amp;quot;${i%.*}.avi&amp;quot;; done&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Downsample with 4xm_comp.exe&lt;br /&gt;
&lt;br /&gt;
Speed : 30 fps&lt;br /&gt;
Data Rate : 110000&lt;br /&gt;
Resize Width 320 Height 160&lt;br /&gt;
&lt;br /&gt;
=== CDDA Audio ===&lt;br /&gt;
&lt;br /&gt;
Generate file list starting in GD-ROM HD Area after first data Track&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for f in ../backups/GDI/Mortal\ Kombat\ Gold/track*.raw; do   f=&amp;quot;${f}&amp;quot;;   [[ &amp;quot;$f&amp;quot; == *track04.raw ]] &amp;amp;&amp;amp; start=1;   [[ $start -eq 1 ]] &amp;amp;&amp;amp; files+=(&amp;quot;$f&amp;quot;); done&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Burn CDDA Tracks first&lt;br /&gt;
Note: -swab is only neccessary when CDDA is static, depends on the burner.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cdrecord -v -multi -tao -audio -swab &amp;quot;${files[@]}&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then get MSINFO Value for 2nd Session.&lt;br /&gt;
&lt;br /&gt;
=== Create ISO Images ===&lt;br /&gt;
&lt;br /&gt;
For the 1st Session, chosen files must not exceed total of 69120000 bytes!&lt;br /&gt;
&lt;br /&gt;
==== 1st Session ====&lt;br /&gt;
&lt;br /&gt;
===== Create first ISOFile =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkisofs -l -duplicates-once -no-allow-lowercase -graft-points -V &amp;lt;DISCNAME&amp;gt; -o &amp;lt;OUTPUT1.ISO&amp;gt; &amp;lt;CHOSEN FILE&amp;gt; &amp;lt;CHOSEN FILE&amp;gt; &amp;lt;CHOSEN FILE&amp;gt;...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fill first ISOFile with zeros so it takes up exactly 68808703 bytes = LBA 45000&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dd if=/dev/zero of=&amp;lt;OUTPUT1.ISO&amp;gt; bs=1 count=1 seek=68808703&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Burn 1st session =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cdrecord -v -multi -tao -xa &amp;lt;OUTPUT1.ISO&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Check MSINFO value &amp;amp; TOC&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cdrecord -msinfo&lt;br /&gt;
&lt;br /&gt;
0,45000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cdrecord -toc&lt;br /&gt;
&lt;br /&gt;
first: 1 last 1&lt;br /&gt;
track:   1 lba:         0 (        0) 00:02:00 adr: 1 control: 4 mode: -1&lt;br /&gt;
track:lout lba:     33600 (   134400) 07:30:00 adr: 1 control: 4 mode: -1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To include subdirectories into the root directory of the CD, use&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkisofs -l -duplicates-once -no-allow-lowercase -graft-points -V &amp;lt;DISCNAME&amp;gt; -o &amp;lt;OUTPUT1.ISO&amp;gt; &amp;lt;SUBDIRECTORY&amp;gt;/=&amp;lt;PATH_OF_SUBDIRECTORY&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkisofs -no-allow-lowercase -graft-points -l -duplicates-once -V AITD4_GD_2 -o aitd4_d2_1.iso MOVIES/=../rips/modified/aitd4/cd2/AITD4_GD_2/MOVIES/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 2nd Session ====&lt;br /&gt;
&lt;br /&gt;
===== Hack 1ST_READ.BIN &amp;amp; IP.BIN =====&lt;br /&gt;
&lt;br /&gt;
Get MSINFO Value&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cdrecord -msinfo&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
binhack&lt;br /&gt;
&lt;br /&gt;
Enter name of binary: 1ST_READ.BIN&lt;br /&gt;
Enter name of bootsector: ip.bin&lt;br /&gt;
Enter msinfo value: &amp;lt;MSINFO Value&amp;gt;&lt;br /&gt;
File 1ST_READ.BIN successfully hacked. &lt;br /&gt;
Bincon detected, OS flag set to 0.&lt;br /&gt;
File ip.bin successfully created.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Insert custom Logo =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
logoinsert darkrealm.mr IP.BIN&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Burn 2nd Session =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkisofs -sort sort.txt -no-allow-lowercase -l -duplicates-once -V &amp;lt;DISCNAME&amp;gt; -G &amp;lt;IP.BIN&amp;gt; -M &amp;lt;OUTPUT1.ISO&amp;gt; -C &amp;lt;MSINFO VALUE&amp;gt; -o &amp;lt;OUTPUT2.ISO&amp;gt; &amp;lt;GAME_DATA_DIRECTORY&amp;gt;&lt;br /&gt;
cdrecord -v -tao -xa &amp;lt;OUTPUT2.ISO&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
&lt;br /&gt;
* Burn whole stuff to a CD-RW&lt;br /&gt;
* Generate CDI from CD-RW&lt;br /&gt;
** Launch DiscJuggler from emulated Windows Machine and connect via iSCSI&lt;br /&gt;
* Test CDI with ReiCast oder ReDream&lt;br /&gt;
&lt;br /&gt;
== Create CDI Images from ISO ==&lt;br /&gt;
&lt;br /&gt;
* Create ISO first&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkisofs -l -duplicates-once -graft-points -V &amp;lt;DISCNAME&amp;gt; -G &amp;lt;IP.BIN&amp;gt; -o &amp;lt;GAME.ISO&amp;gt; &amp;lt;GAME DIRECTORY&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Create DATA/DATA CDI&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wine cdi4dc.exe &amp;lt;GAME.ISO&amp;gt; /media/chris/development/dreamcast/backups/CDI/tests/&amp;lt;GAME.CDI&amp;gt; -d&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* or create AUDIO/DATA CDI, with 2nd Session starting at LBA 11702&lt;br /&gt;
** Note: 1ST_READ.BIN must eventually be binhacked to LBA 11702&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wine cdi4dc.exe &amp;lt;GAME.ISO&amp;gt; /media/chris/development/dreamcast/backups/CDI/tests/&amp;lt;GAME.CDI&amp;gt; -d&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 60Hz &amp;lt;-&amp;gt; 50Hz Binary Comparisations ==&lt;br /&gt;
&lt;br /&gt;
=== Dino Crisis GER ===&lt;br /&gt;
&lt;br /&gt;
1ST_READ.BIN:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Offset : 0x001545C0&lt;br /&gt;
50Hz : 01 E4 03 A0 02 E4 01 A0 03&lt;br /&gt;
60Hz : 00 E4 03 A0 00 E4 01 A0 00&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tools ==&lt;br /&gt;
&lt;br /&gt;
=== Efficient 1st Session Filler ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
# Prüfen, ob ein Verzeichnis übergeben wurde&lt;br /&gt;
if [ -z &amp;quot;$1&amp;quot; ]; then&lt;br /&gt;
    echo &amp;quot;Usage: $0 &amp;lt;Verzeichnis&amp;gt;&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Prüfen, ob es ein gültiges Verzeichnis ist&lt;br /&gt;
if [ ! -d &amp;quot;$DIR&amp;quot; ]; then&lt;br /&gt;
    echo &amp;quot;Fehler: &#039;$DIR&#039; ist kein gültiges Verzeichnis.&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Maximal erlaubte Größe in Bytes&lt;br /&gt;
MAX_SIZE=68808703&lt;br /&gt;
&lt;br /&gt;
# Ausgabedatei für die Liste&lt;br /&gt;
OUTPUT=&amp;quot;dateiliste.txt&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Leere die Ausgabedatei&lt;br /&gt;
&amp;gt; &amp;quot;$OUTPUT&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Variable für die aktuelle Gesamtsumme&lt;br /&gt;
total_size=0&lt;br /&gt;
&lt;br /&gt;
# Durchlaufe die Dateien im Verzeichnis, sortiert nach Größe absteigend&lt;br /&gt;
while IFS= read -r file; do&lt;br /&gt;
    filesize=$(stat -c%s &amp;quot;$file&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    if (( total_size + filesize &amp;lt;= MAX_SIZE )); then&lt;br /&gt;
#        echo &amp;quot;$filesize $file&amp;quot; &amp;gt;&amp;gt; &amp;quot;$OUTPUT&amp;quot;&lt;br /&gt;
        echo &amp;quot;$file&amp;quot; &amp;gt;&amp;gt; &amp;quot;$OUTPUT&amp;quot;&lt;br /&gt;
        total_size=$((total_size + filesize))&lt;br /&gt;
    fi&lt;br /&gt;
done &amp;lt; &amp;lt;(find &amp;quot;$DIR&amp;quot; -maxdepth 1 -type f -printf &amp;quot;%s %p\n&amp;quot; | sort -nr | awk &#039;{print $2}&#039;)&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Liste erstellt: $OUTPUT&amp;quot;&lt;br /&gt;
echo &amp;quot;Gesamtgröße: $total_size Bytes&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chris</name></author>
	</entry>
	<entry>
		<id>https://darkrealm-wiki.darkrealm.dyndns.org/index.php?title=Dreamcast&amp;diff=4870</id>
		<title>Dreamcast</title>
		<link rel="alternate" type="text/html" href="https://darkrealm-wiki.darkrealm.dyndns.org/index.php?title=Dreamcast&amp;diff=4870"/>
		<updated>2026-04-25T19:56:17Z</updated>

		<summary type="html">&lt;p&gt;Chris: /* Full rip process from GD-ROM to CD-ROM */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== CDR Sizes ==&lt;br /&gt;
&lt;br /&gt;
80min/700MB: 1st Session 674MB Maximum&lt;br /&gt;
&lt;br /&gt;
90min/800MB: max 748MB when 45000 Sectors in 1st Session with dummy burn&lt;br /&gt;
&lt;br /&gt;
90min/800MB: max ~735MB when 45000 Sectors in 1st Session&lt;br /&gt;
&lt;br /&gt;
== Access Files on CDI Images ==&lt;br /&gt;
&lt;br /&gt;
# Extract the seperate Track first&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cdirip &amp;lt;CDIFILE&amp;gt;.cdi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# In case of 2nd Data Track, fix the LBA first&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
isofix &amp;lt;TRACK02&amp;gt;.iso &amp;lt;LBA Value reported by cdirip&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== What binhack does ==&lt;br /&gt;
&lt;br /&gt;
Changes LBA Value at offset 1461904 ( 8 Bytes before CD001 string) from 6EB0 (45166) to LBA Value+166 specified during binhack.&lt;br /&gt;
&lt;br /&gt;
Adds Region Codes for JAP,EUR and USA and strings for that.&lt;br /&gt;
Adds some bootcode, probably SH4 ASM to make the GDROM accept CDRs.&lt;br /&gt;
&lt;br /&gt;
== What cdda does ==&lt;br /&gt;
&lt;br /&gt;
Changes some bytes, probably SH4 ASM to enable playback of CDDA tracks.&lt;br /&gt;
&lt;br /&gt;
== What dahack does ==&lt;br /&gt;
&lt;br /&gt;
Changes LBA Values at offsets 1301408,1302380 and 1461904. First 2 offsets get rewritten from 5EB0 (45150) to 9600 (150). Third offset gets rewritten from 6EB0 (45166) to LBA Value+166 specified during dahack. 3rd offset change is basically the same what binhack does.&lt;br /&gt;
&lt;br /&gt;
== What hack3 does ==&lt;br /&gt;
&lt;br /&gt;
Changes LBA Values at offsets 1301408,1302380 and 1461904. First 2 offsets get rewritten from 5EB0 (45150) to LBA Value+150 specified during dahack. Third offset gets rewritten from 6EB0 (45166) to LBA Value+166 specified during dahack. 3rd offset change is basically the same what binhack does.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Another Copy Protection ==&lt;br /&gt;
&lt;br /&gt;
Searching for CDE4 036A (or CDE4 436A) and replacing with 0900 0900 is another Copy Protection defeat.&lt;br /&gt;
&lt;br /&gt;
CDE4 436A -&amp;gt; 0900 0900&lt;br /&gt;
1032 0D8B -&amp;gt; 0800 0D8B&lt;br /&gt;
&lt;br /&gt;
== LBA 45000 Trick ==&lt;br /&gt;
&lt;br /&gt;
69120000 bytes in first session will result in LBA 45000.&lt;br /&gt;
&lt;br /&gt;
== Fill 1st Session ISO File to 69120000 bytes with zeros ==&lt;br /&gt;
&lt;br /&gt;
6912000 bytes = 33750 2048-byte-sectors&lt;br /&gt;
&lt;br /&gt;
CORRECTION : Must be 33598 Sectors !!! = 68808703 bytes&lt;br /&gt;
&lt;br /&gt;
1st Session Leadout = 11250 Sectors = 23040000 Bytes&lt;br /&gt;
&lt;br /&gt;
2nd Session will start at Sector 45000&lt;br /&gt;
&lt;br /&gt;
When using extract.exe, add 150 Sectors to LBA reported in gdinfo_FG.exe track05&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dd if=/dev/zero of=&amp;lt;ISOFILE&amp;gt; bs=1 count=1 seek=69119999&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Creating &amp;amp; Burning DATA/DATA ISOs ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Merging track03 &amp;amp; track05 into one file ==&lt;br /&gt;
&lt;br /&gt;
Create dummy file first&lt;br /&gt;
Calculate 1185760800 - &amp;lt;SIZE OF track03.bin + SIZE OF track05.bin&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dd if=/dev/zero bs=1 count=0 seek=&amp;lt;RESULT&amp;gt; of=dummy.bin&lt;br /&gt;
cat track03.bin dummy.bin track05.bin &amp;gt; combined.bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This also helps when extract.exe only outputs garbage out of track03.iso along with track05.iso. This way only the combined.iso needs to be extracted.&lt;br /&gt;
&lt;br /&gt;
== Burning DATA/DATA CDIs ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cdirip &amp;lt;CDIFile&amp;gt; &amp;lt;Destination Directory&amp;gt;&lt;br /&gt;
cdrecord dev=/dev/sr0 -v -multi -tao -xa tdata01.iso&lt;br /&gt;
cdrecord dev=/dev/sr0 -v -tao -xa tdata02.iso&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Full rip process from GD-ROM to CD-ROM ==&lt;br /&gt;
&lt;br /&gt;
=== Get GDROM Data from Dreamcast with http-ack ===&lt;br /&gt;
&lt;br /&gt;
https://www.gotwalls.com&lt;br /&gt;
&lt;br /&gt;
https://github.com/sega-dreamcast/httpd-ack&lt;br /&gt;
&lt;br /&gt;
# Boot HTTP-ack from CD&lt;br /&gt;
# Swap HTTP-ack CD with Original GD-ROm&lt;br /&gt;
# Connect via Browser to http://192.168.1.30&lt;br /&gt;
# Download all files starting with track03.bin&lt;br /&gt;
# Download disc.gdi&lt;br /&gt;
&lt;br /&gt;
=== Extract Data from Tracks ===&lt;br /&gt;
&lt;br /&gt;
==== Use gditools ====&lt;br /&gt;
&lt;br /&gt;
https://sourceforge.net/projects/dcisotools/&lt;br /&gt;
&lt;br /&gt;
Either use GUI or gditools.py&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
python2.7 ./gditools.py &lt;br /&gt;
Usage: ./gditools.py -i input_gdi [options]&lt;br /&gt;
&lt;br /&gt;
  -h, --help             Display this help&lt;br /&gt;
  -l, --list             List all files in the filesystem and exit&lt;br /&gt;
  -o [outdir]            Output directory. Default: gdi folder&lt;br /&gt;
  -s [filename]          Create a sorttxt file with custom name&lt;br /&gt;
                           (It uses *data-folder* as prefix)&lt;br /&gt;
  -b [ipname]            Dump the ip.bin with custom name&lt;br /&gt;
  -e [filename]          Dump a single file from the filesystem&lt;br /&gt;
  --extract-all          Dump all the files in the *data-folder*&lt;br /&gt;
  --data-folder [name]   *data-folder* subfolder. Default: data&lt;br /&gt;
                           (__volume_label__ --&amp;gt; Use ISO9660 volume label)&lt;br /&gt;
  --sort-spacer [num]    Sorttxt entries are sperated by num&lt;br /&gt;
  --silent               Minimal verbosity mode&lt;br /&gt;
  [no option]            Display gdi infos if not silent&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
gditools.py by FamilyGuy, http://sourceforge.net/p/dcisotools/&lt;br /&gt;
    Licensed under GPLv3, see licences folder.&lt;br /&gt;
&lt;br /&gt;
iso9660.py  by Barney Gale, http://github.com/barneygale&lt;br /&gt;
    Licensed under a BSD-based license, see licences folder.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
python2.7 ./gditools.py -i &amp;lt;disc.gdi&amp;gt; --extract-all -o /mnt/development/dreamcast/rips/orgs/&amp;lt;GAME_NAME&amp;gt;/&amp;lt;CD Number&amp;gt; --data-folder __volume_label__ -s sort.txt -b ip.bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Old way ====&lt;br /&gt;
# If the game contains more than track03.bin, combine the 2 binfiles into 1:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cat track03.bin dummy.bin track05.bin &amp;gt; &amp;lt;BINFILE&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
# Convert .BIN Files to .ISO Files first with bin2iso.exe&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bin2iso.exe &amp;lt;BINFILE&amp;gt; &amp;lt;ISOFILE&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
# Extract Data from .ISO files&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
extract.exe &amp;lt;ISOFILE&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
If extracted 1ST_READ.BIN has filesize of 0, LBA of track05 is wrong.&lt;br /&gt;
&lt;br /&gt;
=== Downsampling ===&lt;br /&gt;
&lt;br /&gt;
==== AFS Files ====&lt;br /&gt;
&lt;br /&gt;
https://sizious.com/download/dreamcast/&lt;br /&gt;
&lt;br /&gt;
AFS files contain multiple ADX files combined into one AFS file.&lt;br /&gt;
&lt;br /&gt;
compact AFS with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
AFSCompactor.exe&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
for Alone in the Dark - The New Nightmare .XA files are AFS files, rename first with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rename .XA .afs *.XA&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
then compact and rename back to .XA:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rename .afs .XA *.afs&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
AFSCompactor.exe will rename files inside .afs to file0001 etc... AITD4 doesnt seem to care.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
extract AFS with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
afs_extract.exe *.afs|*.XA&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
or&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
afsextract.exe -sc afsfile|XAfile&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
or&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
afsutils_v2.exe | rename .XA files to .afs beforehand.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== SFD Movies ====&lt;br /&gt;
&lt;br /&gt;
http://www.dc-swat.ru/page/download/&lt;br /&gt;
&lt;br /&gt;
Demux video to .m1v and audio to .wav first&lt;br /&gt;
&lt;br /&gt;
Example (play around with bitrates):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for f in &amp;lt;SFD Files&amp;gt;; do ffmpeg -i $f -vcodec mpeg1video -b:v 2600k -minrate 2600k -maxrate 3600k -y $f.m1v -acodec adpcm_ima_wav -y $f.wav ; done&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Open all .wavs in single Audacity project and mass export again, 16bit and 44100 Hz.&lt;br /&gt;
&lt;br /&gt;
Start Dreamcast Movie Converter and remux/reencode to .SFD. Dont use batch processing, videos get truncated!&lt;br /&gt;
&lt;br /&gt;
==== 4XM Movies ====&lt;br /&gt;
&lt;br /&gt;
http://samples.mplayerhq.hu/game-formats/4xm/&lt;br /&gt;
&lt;br /&gt;
Convert to AVI first with ffmpeg&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for i in ../rips/unmodified/aitd4/cd2/AITD4_GD_2/MOVIES/*.4XM; do ffmpeg -i &amp;quot;$i&amp;quot; -vf scale=320x160 -y &amp;quot;${i%.*}.avi&amp;quot;; done&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Downsample with 4xm_comp.exe&lt;br /&gt;
&lt;br /&gt;
Speed : 30 fps&lt;br /&gt;
Data Rate : 110000&lt;br /&gt;
Resize Width 320 Height 160&lt;br /&gt;
&lt;br /&gt;
=== CDDA Audio ===&lt;br /&gt;
&lt;br /&gt;
Generate file list starting in GD-ROM HD Area after first data Track&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for f in ../backups/GDI/Mortal\ Kombat\ Gold/track*.raw; do   f=&amp;quot;${f}&amp;quot;;   [[ &amp;quot;$f&amp;quot; == *track04.raw ]] &amp;amp;&amp;amp; start=1;   [[ $start -eq 1 ]] &amp;amp;&amp;amp; files+=(&amp;quot;$f&amp;quot;); done&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Burn CDDA Tracks first&lt;br /&gt;
Note: -swab is only neccessary when CDDA is static, depends on the burner.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cdrecord -v -multi -tao -audio -swab &amp;quot;${files[@]}&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then get MSINFO Value for 2nd Session.&lt;br /&gt;
&lt;br /&gt;
=== Create ISO Images ===&lt;br /&gt;
&lt;br /&gt;
For the 1st Session, chosen files must not exceed total of 69120000 bytes!&lt;br /&gt;
&lt;br /&gt;
==== 1st Session ====&lt;br /&gt;
&lt;br /&gt;
===== Create first ISOFile =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkisofs -l -duplicates-once -no-allow-lowercase -graft-points -V &amp;lt;DISCNAME&amp;gt; -o &amp;lt;OUTPUT1.ISO&amp;gt; &amp;lt;CHOSEN FILE&amp;gt; &amp;lt;CHOSEN FILE&amp;gt; &amp;lt;CHOSEN FILE&amp;gt;...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fill first ISOFile with zeros so it takes up exactly 68808703 bytes = LBA 45000&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dd if=/dev/zero of=&amp;lt;OUTPUT1.ISO&amp;gt; bs=1 count=1 seek=68808703&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Burn 1st session =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cdrecord -v -multi -tao -xa &amp;lt;OUTPUT1.ISO&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Check MSINFO value &amp;amp; TOC&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cdrecord -msinfo&lt;br /&gt;
&lt;br /&gt;
0,45000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cdrecord -toc&lt;br /&gt;
&lt;br /&gt;
first: 1 last 1&lt;br /&gt;
track:   1 lba:         0 (        0) 00:02:00 adr: 1 control: 4 mode: -1&lt;br /&gt;
track:lout lba:     33600 (   134400) 07:30:00 adr: 1 control: 4 mode: -1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To include subdirectories into the root directory of the CD, use&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkisofs -l -duplicates-once -no-allow-lowercase -graft-points -V &amp;lt;DISCNAME&amp;gt; -o &amp;lt;OUTPUT1.ISO&amp;gt; &amp;lt;SUBDIRECTORY&amp;gt;/=&amp;lt;PATH_OF_SUBDIRECTORY&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkisofs -no-allow-lowercase -graft-points -l -duplicates-once -V AITD4_GD_2 -o aitd4_d2_1.iso MOVIES/=../rips/modified/aitd4/cd2/AITD4_GD_2/MOVIES/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 2nd Session ====&lt;br /&gt;
&lt;br /&gt;
===== Hack 1ST_READ.BIN &amp;amp; IP.BIN =====&lt;br /&gt;
&lt;br /&gt;
Get MSINFO Value&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cdrecord -msinfo&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
binhack&lt;br /&gt;
&lt;br /&gt;
Enter name of binary: 1ST_READ.BIN&lt;br /&gt;
Enter name of bootsector: ip.bin&lt;br /&gt;
Enter msinfo value: &amp;lt;MSINFO Value&amp;gt;&lt;br /&gt;
File 1ST_READ.BIN successfully hacked. &lt;br /&gt;
Bincon detected, OS flag set to 0.&lt;br /&gt;
File ip.bin successfully created.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Insert custom Logo =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
logoinsert darkrealm.mr IP.BIN&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Burn 2nd Session =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkisofs -sort sort.txt -no-allow-lowercase -l -duplicates-once -V &amp;lt;DISCNAME&amp;gt; -G &amp;lt;IP.BIN&amp;gt; -M &amp;lt;OUTPUT1.ISO&amp;gt; -C &amp;lt;MSINFO VALUE&amp;gt; -o &amp;lt;OUTPUT2.ISO&amp;gt; &amp;lt;GAME_DATA_DIRECTORY&amp;gt;&lt;br /&gt;
cdrecord -v -tao -xa &amp;lt;OUTPUT2.ISO&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
&lt;br /&gt;
* Burn whole stuff to a CD-RW&lt;br /&gt;
* Generate CDI from CD-RW&lt;br /&gt;
** Launch DiscJuggler from emulated Windows Machine and connect via iSCSI&lt;br /&gt;
* Test CDI with ReiCast oder ReDream&lt;br /&gt;
&lt;br /&gt;
== Create CDI Images from ISO ==&lt;br /&gt;
&lt;br /&gt;
* Create ISO first&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkisofs -l -duplicates-once -graft-points -V &amp;lt;DISCNAME&amp;gt; -G &amp;lt;IP.BIN&amp;gt; -o &amp;lt;GAME.ISO&amp;gt; &amp;lt;GAME DIRECTORY&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Create DATA/DATA CDI&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wine cdi4dc.exe &amp;lt;GAME.ISO&amp;gt; /media/chris/development/dreamcast/backups/CDI/tests/&amp;lt;GAME.CDI&amp;gt; -d&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* or create AUDIO/DATA CDI, with 2nd Session starting at LBA 11702&lt;br /&gt;
** Note: 1ST_READ.BIN must eventually be binhacked to LBA 11702&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wine cdi4dc.exe &amp;lt;GAME.ISO&amp;gt; /media/chris/development/dreamcast/backups/CDI/tests/&amp;lt;GAME.CDI&amp;gt; -d&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 60Hz &amp;lt;-&amp;gt; 50Hz Binary Comparisations ==&lt;br /&gt;
&lt;br /&gt;
=== Dino Crisis GER ===&lt;br /&gt;
&lt;br /&gt;
1ST_READ.BIN:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Offset : 0x001545C0&lt;br /&gt;
50Hz : 01 E4 03 A0 02 E4 01 A0 03&lt;br /&gt;
60Hz : 00 E4 03 A0 00 E4 01 A0 00&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chris</name></author>
	</entry>
	<entry>
		<id>https://darkrealm-wiki.darkrealm.dyndns.org/index.php?title=Dreamcast&amp;diff=4869</id>
		<title>Dreamcast</title>
		<link rel="alternate" type="text/html" href="https://darkrealm-wiki.darkrealm.dyndns.org/index.php?title=Dreamcast&amp;diff=4869"/>
		<updated>2026-04-25T19:54:20Z</updated>

		<summary type="html">&lt;p&gt;Chris: /* 4XM Movies */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== CDR Sizes ==&lt;br /&gt;
&lt;br /&gt;
80min/700MB: 1st Session 674MB Maximum&lt;br /&gt;
&lt;br /&gt;
90min/800MB: max 748MB when 45000 Sectors in 1st Session with dummy burn&lt;br /&gt;
&lt;br /&gt;
90min/800MB: max ~735MB when 45000 Sectors in 1st Session&lt;br /&gt;
&lt;br /&gt;
== Access Files on CDI Images ==&lt;br /&gt;
&lt;br /&gt;
# Extract the seperate Track first&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cdirip &amp;lt;CDIFILE&amp;gt;.cdi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# In case of 2nd Data Track, fix the LBA first&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
isofix &amp;lt;TRACK02&amp;gt;.iso &amp;lt;LBA Value reported by cdirip&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== What binhack does ==&lt;br /&gt;
&lt;br /&gt;
Changes LBA Value at offset 1461904 ( 8 Bytes before CD001 string) from 6EB0 (45166) to LBA Value+166 specified during binhack.&lt;br /&gt;
&lt;br /&gt;
Adds Region Codes for JAP,EUR and USA and strings for that.&lt;br /&gt;
Adds some bootcode, probably SH4 ASM to make the GDROM accept CDRs.&lt;br /&gt;
&lt;br /&gt;
== What cdda does ==&lt;br /&gt;
&lt;br /&gt;
Changes some bytes, probably SH4 ASM to enable playback of CDDA tracks.&lt;br /&gt;
&lt;br /&gt;
== What dahack does ==&lt;br /&gt;
&lt;br /&gt;
Changes LBA Values at offsets 1301408,1302380 and 1461904. First 2 offsets get rewritten from 5EB0 (45150) to 9600 (150). Third offset gets rewritten from 6EB0 (45166) to LBA Value+166 specified during dahack. 3rd offset change is basically the same what binhack does.&lt;br /&gt;
&lt;br /&gt;
== What hack3 does ==&lt;br /&gt;
&lt;br /&gt;
Changes LBA Values at offsets 1301408,1302380 and 1461904. First 2 offsets get rewritten from 5EB0 (45150) to LBA Value+150 specified during dahack. Third offset gets rewritten from 6EB0 (45166) to LBA Value+166 specified during dahack. 3rd offset change is basically the same what binhack does.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Another Copy Protection ==&lt;br /&gt;
&lt;br /&gt;
Searching for CDE4 036A (or CDE4 436A) and replacing with 0900 0900 is another Copy Protection defeat.&lt;br /&gt;
&lt;br /&gt;
CDE4 436A -&amp;gt; 0900 0900&lt;br /&gt;
1032 0D8B -&amp;gt; 0800 0D8B&lt;br /&gt;
&lt;br /&gt;
== LBA 45000 Trick ==&lt;br /&gt;
&lt;br /&gt;
69120000 bytes in first session will result in LBA 45000.&lt;br /&gt;
&lt;br /&gt;
== Fill 1st Session ISO File to 69120000 bytes with zeros ==&lt;br /&gt;
&lt;br /&gt;
6912000 bytes = 33750 2048-byte-sectors&lt;br /&gt;
&lt;br /&gt;
CORRECTION : Must be 33598 Sectors !!! = 68808703 bytes&lt;br /&gt;
&lt;br /&gt;
1st Session Leadout = 11250 Sectors = 23040000 Bytes&lt;br /&gt;
&lt;br /&gt;
2nd Session will start at Sector 45000&lt;br /&gt;
&lt;br /&gt;
When using extract.exe, add 150 Sectors to LBA reported in gdinfo_FG.exe track05&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dd if=/dev/zero of=&amp;lt;ISOFILE&amp;gt; bs=1 count=1 seek=69119999&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Creating &amp;amp; Burning DATA/DATA ISOs ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Merging track03 &amp;amp; track05 into one file ==&lt;br /&gt;
&lt;br /&gt;
Create dummy file first&lt;br /&gt;
Calculate 1185760800 - &amp;lt;SIZE OF track03.bin + SIZE OF track05.bin&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dd if=/dev/zero bs=1 count=0 seek=&amp;lt;RESULT&amp;gt; of=dummy.bin&lt;br /&gt;
cat track03.bin dummy.bin track05.bin &amp;gt; combined.bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This also helps when extract.exe only outputs garbage out of track03.iso along with track05.iso. This way only the combined.iso needs to be extracted.&lt;br /&gt;
&lt;br /&gt;
== Burning DATA/DATA CDIs ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cdirip &amp;lt;CDIFile&amp;gt; &amp;lt;Destination Directory&amp;gt;&lt;br /&gt;
cdrecord dev=/dev/sr0 -v -multi -tao -xa tdata01.iso&lt;br /&gt;
cdrecord dev=/dev/sr0 -v -tao -xa tdata02.iso&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Full rip process from GD-ROM to CD-ROM ==&lt;br /&gt;
&lt;br /&gt;
=== Get GDROM Data from Dreamcast with http-ack ===&lt;br /&gt;
&lt;br /&gt;
https://www.gotwalls.com&lt;br /&gt;
&lt;br /&gt;
https://github.com/sega-dreamcast/httpd-ack&lt;br /&gt;
&lt;br /&gt;
# Boot HTTP-ack from CD&lt;br /&gt;
# Swap HTTP-ack CD with Original GD-ROm&lt;br /&gt;
# Connect via Browser to http://192.168.1.30&lt;br /&gt;
# Download all files starting with track03.bin&lt;br /&gt;
# Download disc.gdi&lt;br /&gt;
&lt;br /&gt;
=== Extract Data from Tracks ===&lt;br /&gt;
&lt;br /&gt;
==== Use gditools ====&lt;br /&gt;
&lt;br /&gt;
https://sourceforge.net/projects/dcisotools/&lt;br /&gt;
&lt;br /&gt;
Either use GUI or gditools.py&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
python2.7 ./gditools.py &lt;br /&gt;
Usage: ./gditools.py -i input_gdi [options]&lt;br /&gt;
&lt;br /&gt;
  -h, --help             Display this help&lt;br /&gt;
  -l, --list             List all files in the filesystem and exit&lt;br /&gt;
  -o [outdir]            Output directory. Default: gdi folder&lt;br /&gt;
  -s [filename]          Create a sorttxt file with custom name&lt;br /&gt;
                           (It uses *data-folder* as prefix)&lt;br /&gt;
  -b [ipname]            Dump the ip.bin with custom name&lt;br /&gt;
  -e [filename]          Dump a single file from the filesystem&lt;br /&gt;
  --extract-all          Dump all the files in the *data-folder*&lt;br /&gt;
  --data-folder [name]   *data-folder* subfolder. Default: data&lt;br /&gt;
                           (__volume_label__ --&amp;gt; Use ISO9660 volume label)&lt;br /&gt;
  --sort-spacer [num]    Sorttxt entries are sperated by num&lt;br /&gt;
  --silent               Minimal verbosity mode&lt;br /&gt;
  [no option]            Display gdi infos if not silent&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
gditools.py by FamilyGuy, http://sourceforge.net/p/dcisotools/&lt;br /&gt;
    Licensed under GPLv3, see licences folder.&lt;br /&gt;
&lt;br /&gt;
iso9660.py  by Barney Gale, http://github.com/barneygale&lt;br /&gt;
    Licensed under a BSD-based license, see licences folder.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
python2.7 ./gditools.py -i &amp;lt;disc.gdi&amp;gt; --extract-all -o /mnt/development/dreamcast/rips/orgs/&amp;lt;GAME_NAME&amp;gt;/&amp;lt;CD Number&amp;gt; --data-folder __volume_label__ -s sort.txt -b ip.bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Old way ====&lt;br /&gt;
# If the game contains more than track03.bin, combine the 2 binfiles into 1:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cat track03.bin dummy.bin track05.bin &amp;gt; &amp;lt;BINFILE&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
# Convert .BIN Files to .ISO Files first with bin2iso.exe&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bin2iso.exe &amp;lt;BINFILE&amp;gt; &amp;lt;ISOFILE&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
# Extract Data from .ISO files&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
extract.exe &amp;lt;ISOFILE&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
If extracted 1ST_READ.BIN has filesize of 0, LBA of track05 is wrong.&lt;br /&gt;
&lt;br /&gt;
=== Downsampling ===&lt;br /&gt;
&lt;br /&gt;
==== AFS Files ====&lt;br /&gt;
&lt;br /&gt;
https://sizious.com/download/dreamcast/&lt;br /&gt;
&lt;br /&gt;
AFS files contain multiple ADX files combined into one AFS file.&lt;br /&gt;
&lt;br /&gt;
compact AFS with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
AFSCompactor.exe&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
for Alone in the Dark - The New Nightmare .XA files are AFS files, rename first with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rename .XA .afs *.XA&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
then compact and rename back to .XA:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rename .afs .XA *.afs&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
AFSCompactor.exe will rename files inside .afs to file0001 etc... AITD4 doesnt seem to care.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
extract AFS with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
afs_extract.exe *.afs|*.XA&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
or&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
afsextract.exe -sc afsfile|XAfile&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
or&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
afsutils_v2.exe | rename .XA files to .afs beforehand.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== SFD Movies ====&lt;br /&gt;
&lt;br /&gt;
http://www.dc-swat.ru/page/download/&lt;br /&gt;
&lt;br /&gt;
Demux video to .m1v and audio to .wav first&lt;br /&gt;
&lt;br /&gt;
Example (play around with bitrates):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for f in &amp;lt;SFD Files&amp;gt;; do ffmpeg -i $f -vcodec mpeg1video -b:v 2600k -minrate 2600k -maxrate 3600k -y $f.m1v -acodec adpcm_ima_wav -y $f.wav ; done&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Open all .wavs in single Audacity project and mass export again, 16bit and 44100 Hz.&lt;br /&gt;
&lt;br /&gt;
Start Dreamcast Movie Converter and remux/reencode to .SFD. Dont use batch processing, videos get truncated!&lt;br /&gt;
&lt;br /&gt;
==== 4XM Movies ====&lt;br /&gt;
&lt;br /&gt;
http://samples.mplayerhq.hu/game-formats/4xm/&lt;br /&gt;
&lt;br /&gt;
Convert to AVI first with ffmpeg&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for i in ../rips/unmodified/aitd4/cd2/AITD4_GD_2/MOVIES/*.4XM; do ffmpeg -i &amp;quot;$i&amp;quot; -vf scale=320x160 -y &amp;quot;${i%.*}.avi&amp;quot;; done&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Downsample with 4xm_comp.exe&lt;br /&gt;
&lt;br /&gt;
Speed : 30 fps&lt;br /&gt;
Data Rate : 110000&lt;br /&gt;
Resize Width 320 Height 160&lt;br /&gt;
&lt;br /&gt;
==== CDDA Audio ====&lt;br /&gt;
&lt;br /&gt;
Generate file list starting in GD-ROM HD Area after first data Track&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for f in ../backups/GDI/Mortal\ Kombat\ Gold/track*.raw; do   f=&amp;quot;${f}&amp;quot;;   [[ &amp;quot;$f&amp;quot; == *track04.raw ]] &amp;amp;&amp;amp; start=1;   [[ $start -eq 1 ]] &amp;amp;&amp;amp; files+=(&amp;quot;$f&amp;quot;); done&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Burn CDDA Tracks first&lt;br /&gt;
Note: -swab is only neccessary when CDDA is static, depends on the burner.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cdrecord -v -multi -tao -audio -swab &amp;quot;${files[@]}&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then get MSINFO Value for 2nd Session.&lt;br /&gt;
&lt;br /&gt;
=== Create ISO Images ===&lt;br /&gt;
&lt;br /&gt;
For the 1st Session, chosen files must not exceed total of 69120000 bytes!&lt;br /&gt;
&lt;br /&gt;
==== 1st Session ====&lt;br /&gt;
&lt;br /&gt;
===== Create first ISOFile =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkisofs -l -duplicates-once -no-allow-lowercase -graft-points -V &amp;lt;DISCNAME&amp;gt; -o &amp;lt;OUTPUT1.ISO&amp;gt; &amp;lt;CHOSEN FILE&amp;gt; &amp;lt;CHOSEN FILE&amp;gt; &amp;lt;CHOSEN FILE&amp;gt;...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fill first ISOFile with zeros so it takes up exactly 68808703 bytes = LBA 45000&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dd if=/dev/zero of=&amp;lt;OUTPUT1.ISO&amp;gt; bs=1 count=1 seek=68808703&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Burn 1st session =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cdrecord -v -multi -tao -xa &amp;lt;OUTPUT1.ISO&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Check MSINFO value &amp;amp; TOC&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cdrecord -msinfo&lt;br /&gt;
&lt;br /&gt;
0,45000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cdrecord -toc&lt;br /&gt;
&lt;br /&gt;
first: 1 last 1&lt;br /&gt;
track:   1 lba:         0 (        0) 00:02:00 adr: 1 control: 4 mode: -1&lt;br /&gt;
track:lout lba:     33600 (   134400) 07:30:00 adr: 1 control: 4 mode: -1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To include subdirectories into the root directory of the CD, use&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkisofs -l -duplicates-once -no-allow-lowercase -graft-points -V &amp;lt;DISCNAME&amp;gt; -o &amp;lt;OUTPUT1.ISO&amp;gt; &amp;lt;SUBDIRECTORY&amp;gt;/=&amp;lt;PATH_OF_SUBDIRECTORY&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkisofs -no-allow-lowercase -graft-points -l -duplicates-once -V AITD4_GD_2 -o aitd4_d2_1.iso MOVIES/=../rips/modified/aitd4/cd2/AITD4_GD_2/MOVIES/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 2nd Session ====&lt;br /&gt;
&lt;br /&gt;
===== Hack 1ST_READ.BIN &amp;amp; IP.BIN =====&lt;br /&gt;
&lt;br /&gt;
Get MSINFO Value&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cdrecord -msinfo&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
binhack&lt;br /&gt;
&lt;br /&gt;
Enter name of binary: 1ST_READ.BIN&lt;br /&gt;
Enter name of bootsector: ip.bin&lt;br /&gt;
Enter msinfo value: &amp;lt;MSINFO Value&amp;gt;&lt;br /&gt;
File 1ST_READ.BIN successfully hacked. &lt;br /&gt;
Bincon detected, OS flag set to 0.&lt;br /&gt;
File ip.bin successfully created.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Insert custom Logo =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
logoinsert darkrealm.mr IP.BIN&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Burn 2nd Session =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkisofs -sort sort.txt -no-allow-lowercase -l -duplicates-once -V &amp;lt;DISCNAME&amp;gt; -G &amp;lt;IP.BIN&amp;gt; -M &amp;lt;OUTPUT1.ISO&amp;gt; -C &amp;lt;MSINFO VALUE&amp;gt; -o &amp;lt;OUTPUT2.ISO&amp;gt; &amp;lt;GAME_DATA_DIRECTORY&amp;gt;&lt;br /&gt;
cdrecord -v -tao -xa &amp;lt;OUTPUT2.ISO&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
&lt;br /&gt;
* Burn whole stuff to a CD-RW&lt;br /&gt;
* Generate CDI from CD-RW&lt;br /&gt;
** Launch DiscJuggler from emulated Windows Machine and connect via iSCSI&lt;br /&gt;
* Test CDI with ReiCast oder ReDream&lt;br /&gt;
&lt;br /&gt;
== Create CDI Images from ISO ==&lt;br /&gt;
&lt;br /&gt;
* Create ISO first&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkisofs -l -duplicates-once -graft-points -V &amp;lt;DISCNAME&amp;gt; -G &amp;lt;IP.BIN&amp;gt; -o &amp;lt;GAME.ISO&amp;gt; &amp;lt;GAME DIRECTORY&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Create DATA/DATA CDI&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wine cdi4dc.exe &amp;lt;GAME.ISO&amp;gt; /media/chris/development/dreamcast/backups/CDI/tests/&amp;lt;GAME.CDI&amp;gt; -d&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* or create AUDIO/DATA CDI, with 2nd Session starting at LBA 11702&lt;br /&gt;
** Note: 1ST_READ.BIN must eventually be binhacked to LBA 11702&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wine cdi4dc.exe &amp;lt;GAME.ISO&amp;gt; /media/chris/development/dreamcast/backups/CDI/tests/&amp;lt;GAME.CDI&amp;gt; -d&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 60Hz &amp;lt;-&amp;gt; 50Hz Binary Comparisations ==&lt;br /&gt;
&lt;br /&gt;
=== Dino Crisis GER ===&lt;br /&gt;
&lt;br /&gt;
1ST_READ.BIN:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Offset : 0x001545C0&lt;br /&gt;
50Hz : 01 E4 03 A0 02 E4 01 A0 03&lt;br /&gt;
60Hz : 00 E4 03 A0 00 E4 01 A0 00&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chris</name></author>
	</entry>
	<entry>
		<id>https://darkrealm-wiki.darkrealm.dyndns.org/index.php?title=Dreamcast&amp;diff=4868</id>
		<title>Dreamcast</title>
		<link rel="alternate" type="text/html" href="https://darkrealm-wiki.darkrealm.dyndns.org/index.php?title=Dreamcast&amp;diff=4868"/>
		<updated>2026-04-25T13:44:56Z</updated>

		<summary type="html">&lt;p&gt;Chris: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== CDR Sizes ==&lt;br /&gt;
&lt;br /&gt;
80min/700MB: 1st Session 674MB Maximum&lt;br /&gt;
&lt;br /&gt;
90min/800MB: max 748MB when 45000 Sectors in 1st Session with dummy burn&lt;br /&gt;
&lt;br /&gt;
90min/800MB: max ~735MB when 45000 Sectors in 1st Session&lt;br /&gt;
&lt;br /&gt;
== Access Files on CDI Images ==&lt;br /&gt;
&lt;br /&gt;
# Extract the seperate Track first&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cdirip &amp;lt;CDIFILE&amp;gt;.cdi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# In case of 2nd Data Track, fix the LBA first&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
isofix &amp;lt;TRACK02&amp;gt;.iso &amp;lt;LBA Value reported by cdirip&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== What binhack does ==&lt;br /&gt;
&lt;br /&gt;
Changes LBA Value at offset 1461904 ( 8 Bytes before CD001 string) from 6EB0 (45166) to LBA Value+166 specified during binhack.&lt;br /&gt;
&lt;br /&gt;
Adds Region Codes for JAP,EUR and USA and strings for that.&lt;br /&gt;
Adds some bootcode, probably SH4 ASM to make the GDROM accept CDRs.&lt;br /&gt;
&lt;br /&gt;
== What cdda does ==&lt;br /&gt;
&lt;br /&gt;
Changes some bytes, probably SH4 ASM to enable playback of CDDA tracks.&lt;br /&gt;
&lt;br /&gt;
== What dahack does ==&lt;br /&gt;
&lt;br /&gt;
Changes LBA Values at offsets 1301408,1302380 and 1461904. First 2 offsets get rewritten from 5EB0 (45150) to 9600 (150). Third offset gets rewritten from 6EB0 (45166) to LBA Value+166 specified during dahack. 3rd offset change is basically the same what binhack does.&lt;br /&gt;
&lt;br /&gt;
== What hack3 does ==&lt;br /&gt;
&lt;br /&gt;
Changes LBA Values at offsets 1301408,1302380 and 1461904. First 2 offsets get rewritten from 5EB0 (45150) to LBA Value+150 specified during dahack. Third offset gets rewritten from 6EB0 (45166) to LBA Value+166 specified during dahack. 3rd offset change is basically the same what binhack does.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Another Copy Protection ==&lt;br /&gt;
&lt;br /&gt;
Searching for CDE4 036A (or CDE4 436A) and replacing with 0900 0900 is another Copy Protection defeat.&lt;br /&gt;
&lt;br /&gt;
CDE4 436A -&amp;gt; 0900 0900&lt;br /&gt;
1032 0D8B -&amp;gt; 0800 0D8B&lt;br /&gt;
&lt;br /&gt;
== LBA 45000 Trick ==&lt;br /&gt;
&lt;br /&gt;
69120000 bytes in first session will result in LBA 45000.&lt;br /&gt;
&lt;br /&gt;
== Fill 1st Session ISO File to 69120000 bytes with zeros ==&lt;br /&gt;
&lt;br /&gt;
6912000 bytes = 33750 2048-byte-sectors&lt;br /&gt;
&lt;br /&gt;
CORRECTION : Must be 33598 Sectors !!! = 68808703 bytes&lt;br /&gt;
&lt;br /&gt;
1st Session Leadout = 11250 Sectors = 23040000 Bytes&lt;br /&gt;
&lt;br /&gt;
2nd Session will start at Sector 45000&lt;br /&gt;
&lt;br /&gt;
When using extract.exe, add 150 Sectors to LBA reported in gdinfo_FG.exe track05&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dd if=/dev/zero of=&amp;lt;ISOFILE&amp;gt; bs=1 count=1 seek=69119999&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Creating &amp;amp; Burning DATA/DATA ISOs ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Merging track03 &amp;amp; track05 into one file ==&lt;br /&gt;
&lt;br /&gt;
Create dummy file first&lt;br /&gt;
Calculate 1185760800 - &amp;lt;SIZE OF track03.bin + SIZE OF track05.bin&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dd if=/dev/zero bs=1 count=0 seek=&amp;lt;RESULT&amp;gt; of=dummy.bin&lt;br /&gt;
cat track03.bin dummy.bin track05.bin &amp;gt; combined.bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This also helps when extract.exe only outputs garbage out of track03.iso along with track05.iso. This way only the combined.iso needs to be extracted.&lt;br /&gt;
&lt;br /&gt;
== Burning DATA/DATA CDIs ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cdirip &amp;lt;CDIFile&amp;gt; &amp;lt;Destination Directory&amp;gt;&lt;br /&gt;
cdrecord dev=/dev/sr0 -v -multi -tao -xa tdata01.iso&lt;br /&gt;
cdrecord dev=/dev/sr0 -v -tao -xa tdata02.iso&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Full rip process from GD-ROM to CD-ROM ==&lt;br /&gt;
&lt;br /&gt;
=== Get GDROM Data from Dreamcast with http-ack ===&lt;br /&gt;
&lt;br /&gt;
https://www.gotwalls.com&lt;br /&gt;
&lt;br /&gt;
https://github.com/sega-dreamcast/httpd-ack&lt;br /&gt;
&lt;br /&gt;
# Boot HTTP-ack from CD&lt;br /&gt;
# Swap HTTP-ack CD with Original GD-ROm&lt;br /&gt;
# Connect via Browser to http://192.168.1.30&lt;br /&gt;
# Download all files starting with track03.bin&lt;br /&gt;
# Download disc.gdi&lt;br /&gt;
&lt;br /&gt;
=== Extract Data from Tracks ===&lt;br /&gt;
&lt;br /&gt;
==== Use gditools ====&lt;br /&gt;
&lt;br /&gt;
https://sourceforge.net/projects/dcisotools/&lt;br /&gt;
&lt;br /&gt;
Either use GUI or gditools.py&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
python2.7 ./gditools.py &lt;br /&gt;
Usage: ./gditools.py -i input_gdi [options]&lt;br /&gt;
&lt;br /&gt;
  -h, --help             Display this help&lt;br /&gt;
  -l, --list             List all files in the filesystem and exit&lt;br /&gt;
  -o [outdir]            Output directory. Default: gdi folder&lt;br /&gt;
  -s [filename]          Create a sorttxt file with custom name&lt;br /&gt;
                           (It uses *data-folder* as prefix)&lt;br /&gt;
  -b [ipname]            Dump the ip.bin with custom name&lt;br /&gt;
  -e [filename]          Dump a single file from the filesystem&lt;br /&gt;
  --extract-all          Dump all the files in the *data-folder*&lt;br /&gt;
  --data-folder [name]   *data-folder* subfolder. Default: data&lt;br /&gt;
                           (__volume_label__ --&amp;gt; Use ISO9660 volume label)&lt;br /&gt;
  --sort-spacer [num]    Sorttxt entries are sperated by num&lt;br /&gt;
  --silent               Minimal verbosity mode&lt;br /&gt;
  [no option]            Display gdi infos if not silent&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
gditools.py by FamilyGuy, http://sourceforge.net/p/dcisotools/&lt;br /&gt;
    Licensed under GPLv3, see licences folder.&lt;br /&gt;
&lt;br /&gt;
iso9660.py  by Barney Gale, http://github.com/barneygale&lt;br /&gt;
    Licensed under a BSD-based license, see licences folder.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
python2.7 ./gditools.py -i &amp;lt;disc.gdi&amp;gt; --extract-all -o /mnt/development/dreamcast/rips/orgs/&amp;lt;GAME_NAME&amp;gt;/&amp;lt;CD Number&amp;gt; --data-folder __volume_label__ -s sort.txt -b ip.bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Old way ====&lt;br /&gt;
# If the game contains more than track03.bin, combine the 2 binfiles into 1:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cat track03.bin dummy.bin track05.bin &amp;gt; &amp;lt;BINFILE&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
# Convert .BIN Files to .ISO Files first with bin2iso.exe&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bin2iso.exe &amp;lt;BINFILE&amp;gt; &amp;lt;ISOFILE&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
# Extract Data from .ISO files&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
extract.exe &amp;lt;ISOFILE&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
If extracted 1ST_READ.BIN has filesize of 0, LBA of track05 is wrong.&lt;br /&gt;
&lt;br /&gt;
=== Downsampling ===&lt;br /&gt;
&lt;br /&gt;
==== AFS Files ====&lt;br /&gt;
&lt;br /&gt;
https://sizious.com/download/dreamcast/&lt;br /&gt;
&lt;br /&gt;
AFS files contain multiple ADX files combined into one AFS file.&lt;br /&gt;
&lt;br /&gt;
compact AFS with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
AFSCompactor.exe&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
for Alone in the Dark - The New Nightmare .XA files are AFS files, rename first with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rename .XA .afs *.XA&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
then compact and rename back to .XA:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rename .afs .XA *.afs&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
AFSCompactor.exe will rename files inside .afs to file0001 etc... AITD4 doesnt seem to care.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
extract AFS with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
afs_extract.exe *.afs|*.XA&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
or&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
afsextract.exe -sc afsfile|XAfile&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
or&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
afsutils_v2.exe | rename .XA files to .afs beforehand.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== SFD Movies ====&lt;br /&gt;
&lt;br /&gt;
http://www.dc-swat.ru/page/download/&lt;br /&gt;
&lt;br /&gt;
Demux video to .m1v and audio to .wav first&lt;br /&gt;
&lt;br /&gt;
Example (play around with bitrates):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for f in &amp;lt;SFD Files&amp;gt;; do ffmpeg -i $f -vcodec mpeg1video -b:v 2600k -minrate 2600k -maxrate 3600k -y $f.m1v -acodec adpcm_ima_wav -y $f.wav ; done&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Open all .wavs in single Audacity project and mass export again, 16bit and 44100 Hz.&lt;br /&gt;
&lt;br /&gt;
Start Dreamcast Movie Converter and remux/reencode to .SFD. Dont use batch processing, videos get truncated!&lt;br /&gt;
&lt;br /&gt;
==== 4XM Movies ====&lt;br /&gt;
&lt;br /&gt;
http://samples.mplayerhq.hu/game-formats/4xm/&lt;br /&gt;
&lt;br /&gt;
Convert to AVI first with ffmpeg&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for i in ../rips/unmodified/aitd4/cd2/AITD4_GD_2/MOVIES/*.4XM; do ffmpeg -i &amp;quot;$i&amp;quot; -vf scale=320x160 -y &amp;quot;${i%.*}.avi&amp;quot;; done&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Downsample with 4xm_comp.exe&lt;br /&gt;
&lt;br /&gt;
Speed : 30 fps&lt;br /&gt;
Data Rate : 110000&lt;br /&gt;
Resize Width 320 Height 160&lt;br /&gt;
&lt;br /&gt;
=== Create ISO Images ===&lt;br /&gt;
&lt;br /&gt;
For the 1st Session, chosen files must not exceed total of 69120000 bytes!&lt;br /&gt;
&lt;br /&gt;
==== 1st Session ====&lt;br /&gt;
&lt;br /&gt;
===== Create first ISOFile =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkisofs -l -duplicates-once -no-allow-lowercase -graft-points -V &amp;lt;DISCNAME&amp;gt; -o &amp;lt;OUTPUT1.ISO&amp;gt; &amp;lt;CHOSEN FILE&amp;gt; &amp;lt;CHOSEN FILE&amp;gt; &amp;lt;CHOSEN FILE&amp;gt;...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fill first ISOFile with zeros so it takes up exactly 68808703 bytes = LBA 45000&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dd if=/dev/zero of=&amp;lt;OUTPUT1.ISO&amp;gt; bs=1 count=1 seek=68808703&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Burn 1st session =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cdrecord -v -multi -tao -xa &amp;lt;OUTPUT1.ISO&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Check MSINFO value &amp;amp; TOC&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cdrecord -msinfo&lt;br /&gt;
&lt;br /&gt;
0,45000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cdrecord -toc&lt;br /&gt;
&lt;br /&gt;
first: 1 last 1&lt;br /&gt;
track:   1 lba:         0 (        0) 00:02:00 adr: 1 control: 4 mode: -1&lt;br /&gt;
track:lout lba:     33600 (   134400) 07:30:00 adr: 1 control: 4 mode: -1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To include subdirectories into the root directory of the CD, use&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkisofs -l -duplicates-once -no-allow-lowercase -graft-points -V &amp;lt;DISCNAME&amp;gt; -o &amp;lt;OUTPUT1.ISO&amp;gt; &amp;lt;SUBDIRECTORY&amp;gt;/=&amp;lt;PATH_OF_SUBDIRECTORY&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkisofs -no-allow-lowercase -graft-points -l -duplicates-once -V AITD4_GD_2 -o aitd4_d2_1.iso MOVIES/=../rips/modified/aitd4/cd2/AITD4_GD_2/MOVIES/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 2nd Session ====&lt;br /&gt;
&lt;br /&gt;
===== Hack 1ST_READ.BIN &amp;amp; IP.BIN =====&lt;br /&gt;
&lt;br /&gt;
Get MSINFO Value&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cdrecord -msinfo&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
binhack&lt;br /&gt;
&lt;br /&gt;
Enter name of binary: 1ST_READ.BIN&lt;br /&gt;
Enter name of bootsector: ip.bin&lt;br /&gt;
Enter msinfo value: &amp;lt;MSINFO Value&amp;gt;&lt;br /&gt;
File 1ST_READ.BIN successfully hacked. &lt;br /&gt;
Bincon detected, OS flag set to 0.&lt;br /&gt;
File ip.bin successfully created.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Insert custom Logo =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
logoinsert darkrealm.mr IP.BIN&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Burn 2nd Session =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkisofs -sort sort.txt -no-allow-lowercase -l -duplicates-once -V &amp;lt;DISCNAME&amp;gt; -G &amp;lt;IP.BIN&amp;gt; -M &amp;lt;OUTPUT1.ISO&amp;gt; -C &amp;lt;MSINFO VALUE&amp;gt; -o &amp;lt;OUTPUT2.ISO&amp;gt; &amp;lt;GAME_DATA_DIRECTORY&amp;gt;&lt;br /&gt;
cdrecord -v -tao -xa &amp;lt;OUTPUT2.ISO&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
&lt;br /&gt;
* Burn whole stuff to a CD-RW&lt;br /&gt;
* Generate CDI from CD-RW&lt;br /&gt;
** Launch DiscJuggler from emulated Windows Machine and connect via iSCSI&lt;br /&gt;
* Test CDI with ReiCast oder ReDream&lt;br /&gt;
&lt;br /&gt;
== Create CDI Images from ISO ==&lt;br /&gt;
&lt;br /&gt;
* Create ISO first&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkisofs -l -duplicates-once -graft-points -V &amp;lt;DISCNAME&amp;gt; -G &amp;lt;IP.BIN&amp;gt; -o &amp;lt;GAME.ISO&amp;gt; &amp;lt;GAME DIRECTORY&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Create DATA/DATA CDI&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wine cdi4dc.exe &amp;lt;GAME.ISO&amp;gt; /media/chris/development/dreamcast/backups/CDI/tests/&amp;lt;GAME.CDI&amp;gt; -d&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* or create AUDIO/DATA CDI, with 2nd Session starting at LBA 11702&lt;br /&gt;
** Note: 1ST_READ.BIN must eventually be binhacked to LBA 11702&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wine cdi4dc.exe &amp;lt;GAME.ISO&amp;gt; /media/chris/development/dreamcast/backups/CDI/tests/&amp;lt;GAME.CDI&amp;gt; -d&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 60Hz &amp;lt;-&amp;gt; 50Hz Binary Comparisations ==&lt;br /&gt;
&lt;br /&gt;
=== Dino Crisis GER ===&lt;br /&gt;
&lt;br /&gt;
1ST_READ.BIN:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Offset : 0x001545C0&lt;br /&gt;
50Hz : 01 E4 03 A0 02 E4 01 A0 03&lt;br /&gt;
60Hz : 00 E4 03 A0 00 E4 01 A0 00&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chris</name></author>
	</entry>
	<entry>
		<id>https://darkrealm-wiki.darkrealm.dyndns.org/index.php?title=Dreamcast&amp;diff=4867</id>
		<title>Dreamcast</title>
		<link rel="alternate" type="text/html" href="https://darkrealm-wiki.darkrealm.dyndns.org/index.php?title=Dreamcast&amp;diff=4867"/>
		<updated>2026-04-25T10:52:31Z</updated>

		<summary type="html">&lt;p&gt;Chris: /* Burn 2nd Session */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== CDR Sizes ==&lt;br /&gt;
&lt;br /&gt;
80min/700MB: 1st Session 674MB Maximum&lt;br /&gt;
&lt;br /&gt;
90min/800MB: max 748MB when 45000 Sectors in 1st Session with dummy burn&lt;br /&gt;
&lt;br /&gt;
90min/800MB: max ~735MB when 45000 Sectors in 1st Session&lt;br /&gt;
&lt;br /&gt;
== Access Files on CDI Images ==&lt;br /&gt;
&lt;br /&gt;
# Extract the seperate Track first&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cdirip &amp;lt;CDIFILE&amp;gt;.cdi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# In case of 2nd Data Track, fix the LBA first&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
isofix &amp;lt;TRACK02&amp;gt;.iso &amp;lt;LBA Value reported by cdirip&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== What binhack does ==&lt;br /&gt;
&lt;br /&gt;
Changes LBA Value at offset 1461904 ( 8 Bytes before CD001 string) from 6EB0 (45166) to LBA Value+166 specified during binhack.&lt;br /&gt;
&lt;br /&gt;
Adds Region Codes for JAP,EUR and USA and strings for that.&lt;br /&gt;
Adds some bootcode, probably SH4 ASM to make the GDROM accept CDRs.&lt;br /&gt;
&lt;br /&gt;
== What cdda does ==&lt;br /&gt;
&lt;br /&gt;
Changes some bytes, probably SH4 ASM to enable playback of CDDA tracks.&lt;br /&gt;
&lt;br /&gt;
== What dahack does ==&lt;br /&gt;
&lt;br /&gt;
Changes LBA Values at offsets 1301408,1302380 and 1461904. First 2 offsets get rewritten from 5EB0 (45150) to 9600 (150). Third offset gets rewritten from 6EB0 (45166) to LBA Value+166 specified during dahack. 3rd offset change is basically the same what binhack does.&lt;br /&gt;
&lt;br /&gt;
== What hack3 does ==&lt;br /&gt;
&lt;br /&gt;
Changes LBA Values at offsets 1301408,1302380 and 1461904. First 2 offsets get rewritten from 5EB0 (45150) to LBA Value+150 specified during dahack. Third offset gets rewritten from 6EB0 (45166) to LBA Value+166 specified during dahack. 3rd offset change is basically the same what binhack does.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Another Copy Protection ==&lt;br /&gt;
&lt;br /&gt;
Searching for CDE4 036A (or CDE4 436A) and replacing with 0900 0900 is another Copy Protection defeat.&lt;br /&gt;
&lt;br /&gt;
CDE4 436A -&amp;gt; 0900 0900&lt;br /&gt;
1032 0D8B -&amp;gt; 0800 0D8B&lt;br /&gt;
&lt;br /&gt;
== LBA 45000 Trick ==&lt;br /&gt;
&lt;br /&gt;
69120000 bytes in first session will result in LBA 45000.&lt;br /&gt;
&lt;br /&gt;
== Fill 1st Session ISO File to 69120000 bytes with zeros ==&lt;br /&gt;
&lt;br /&gt;
6912000 bytes = 33750 2048-byte-sectors&lt;br /&gt;
&lt;br /&gt;
CORRECTION : Must be 33598 Sectors !!! = 68808703 bytes&lt;br /&gt;
&lt;br /&gt;
1st Session Leadout = 11250 Sectors = 23040000 Bytes&lt;br /&gt;
&lt;br /&gt;
2nd Session will start at Sector 45000&lt;br /&gt;
&lt;br /&gt;
When using extract.exe, add 150 Sectors to LBA reported in gdinfo_FG.exe track05&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dd if=/dev/zero of=&amp;lt;ISOFILE&amp;gt; bs=1 count=1 seek=69119999&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Creating &amp;amp; Burning DATA/DATA ISOs ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Merging track03 &amp;amp; track05 into one file ==&lt;br /&gt;
&lt;br /&gt;
Create dummy file first&lt;br /&gt;
Calculate 1185760800 - &amp;lt;SIZE OF track03.bin + SIZE OF track05.bin&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dd if=/dev/zero bs=1 count=0 seek=&amp;lt;RESULT&amp;gt; of=dummy.bin&lt;br /&gt;
cat track03.bin dummy.bin track05.bin &amp;gt; combined.bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This also helps when extract.exe only outputs garbage out of track03.iso along with track05.iso. This way only the combined.iso needs to be extracted.&lt;br /&gt;
&lt;br /&gt;
== Burning DATA/DATA CDIs ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cdirip &amp;lt;CDIFile&amp;gt; &amp;lt;Destination Directory&amp;gt;&lt;br /&gt;
cdrecord dev=/dev/sr0 -v -multi -tao -xa tdata01.iso&lt;br /&gt;
cdrecord dev=/dev/sr0 -v -tao -xa tdata02.iso&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Full rip process from GD-ROM to CD-ROM ==&lt;br /&gt;
&lt;br /&gt;
=== Get GDROM Data from Dreamcast with http-ack ===&lt;br /&gt;
&lt;br /&gt;
https://www.gotwalls.com&lt;br /&gt;
&lt;br /&gt;
https://github.com/sega-dreamcast/httpd-ack&lt;br /&gt;
&lt;br /&gt;
# Boot HTTP-ack from CD&lt;br /&gt;
# Swap HTTP-ack CD with Original GD-ROm&lt;br /&gt;
# Connect via Browser to http://192.168.1.30&lt;br /&gt;
# Download all files starting with track03.bin&lt;br /&gt;
# Download disc.gdi&lt;br /&gt;
&lt;br /&gt;
=== Extract Data from Tracks ===&lt;br /&gt;
&lt;br /&gt;
==== Use gditools ====&lt;br /&gt;
&lt;br /&gt;
https://sourceforge.net/projects/dcisotools/&lt;br /&gt;
&lt;br /&gt;
Either use GUI or gditools.py&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
python2.7 ./gditools.py &lt;br /&gt;
Usage: ./gditools.py -i input_gdi [options]&lt;br /&gt;
&lt;br /&gt;
  -h, --help             Display this help&lt;br /&gt;
  -l, --list             List all files in the filesystem and exit&lt;br /&gt;
  -o [outdir]            Output directory. Default: gdi folder&lt;br /&gt;
  -s [filename]          Create a sorttxt file with custom name&lt;br /&gt;
                           (It uses *data-folder* as prefix)&lt;br /&gt;
  -b [ipname]            Dump the ip.bin with custom name&lt;br /&gt;
  -e [filename]          Dump a single file from the filesystem&lt;br /&gt;
  --extract-all          Dump all the files in the *data-folder*&lt;br /&gt;
  --data-folder [name]   *data-folder* subfolder. Default: data&lt;br /&gt;
                           (__volume_label__ --&amp;gt; Use ISO9660 volume label)&lt;br /&gt;
  --sort-spacer [num]    Sorttxt entries are sperated by num&lt;br /&gt;
  --silent               Minimal verbosity mode&lt;br /&gt;
  [no option]            Display gdi infos if not silent&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
gditools.py by FamilyGuy, http://sourceforge.net/p/dcisotools/&lt;br /&gt;
    Licensed under GPLv3, see licences folder.&lt;br /&gt;
&lt;br /&gt;
iso9660.py  by Barney Gale, http://github.com/barneygale&lt;br /&gt;
    Licensed under a BSD-based license, see licences folder.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
python2.7 ./gditools.py -i &amp;lt;disc.gdi&amp;gt; --extract-all -o /mnt/development/dreamcast/rips/orgs/&amp;lt;GAME_NAME&amp;gt;/&amp;lt;CD Number&amp;gt; --data-folder __volume_label__ -s sort.txt -b ip.bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Old way ====&lt;br /&gt;
# If the game contains more than track03.bin, combine the 2 binfiles into 1:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cat track03.bin dummy.bin track05.bin &amp;gt; &amp;lt;BINFILE&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
# Convert .BIN Files to .ISO Files first with bin2iso.exe&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bin2iso.exe &amp;lt;BINFILE&amp;gt; &amp;lt;ISOFILE&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
# Extract Data from .ISO files&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
extract.exe &amp;lt;ISOFILE&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
If extracted 1ST_READ.BIN has filesize of 0, LBA of track05 is wrong.&lt;br /&gt;
&lt;br /&gt;
=== Downsampling ===&lt;br /&gt;
&lt;br /&gt;
==== AFS Files ====&lt;br /&gt;
&lt;br /&gt;
https://sizious.com/download/dreamcast/&lt;br /&gt;
&lt;br /&gt;
AFS files contain multiple ADX files combined into one AFS file.&lt;br /&gt;
&lt;br /&gt;
compact AFS with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
AFSCompactor.exe&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
for Alone in the Dark - The New Nightmare .XA files are AFS files, rename first with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rename .XA .afs *.XA&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
then compact and rename back to .XA:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rename .afs .XA *.afs&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
AFSCompactor.exe will rename files inside .afs to file0001 etc... AITD4 doesnt seem to care.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
extract AFS with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
afs_extract.exe *.afs|*.XA&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
or&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
afsextract.exe -sc afsfile|XAfile&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
or&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
afsutils_v2.exe | rename .XA files to .afs beforehand.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== SFD Movies ====&lt;br /&gt;
&lt;br /&gt;
http://www.dc-swat.ru/page/download/&lt;br /&gt;
&lt;br /&gt;
Demux video to .m1v and audio to .wav first&lt;br /&gt;
&lt;br /&gt;
Example (play around with bitrates):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for f in &amp;lt;SFD Files&amp;gt;; do ffmpeg -i $f -vcodec mpeg1video -b:v 2600k -minrate 2600k -maxrate 3600k -y $f.m1v -acodec adpcm_ima_wav -y $f.wav ; done&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Open all .wavs in single Audacity project and mass export again, 16bit and 44100 Hz.&lt;br /&gt;
&lt;br /&gt;
Start Dreamcast Movie Converter and remux/reencode to .SFD. Dont use batch processing, videos get truncated!&lt;br /&gt;
&lt;br /&gt;
==== 4XM Movies ====&lt;br /&gt;
&lt;br /&gt;
http://samples.mplayerhq.hu/game-formats/4xm/&lt;br /&gt;
&lt;br /&gt;
Convert to AVI first with ffmpeg&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for i in ../rips/unmodified/aitd4/cd2/AITD4_GD_2/MOVIES/*.4XM; do ffmpeg -i &amp;quot;$i&amp;quot; -vf scale=320x160 -y &amp;quot;${i%.*}.avi&amp;quot;; done&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Downsample with 4xm_comp.exe&lt;br /&gt;
&lt;br /&gt;
Speed : 30 fps&lt;br /&gt;
Data Rate : 110000&lt;br /&gt;
Resize Width 320 Height 160&lt;br /&gt;
&lt;br /&gt;
=== Create ISO Images ===&lt;br /&gt;
&lt;br /&gt;
For the 1st Session, chosen files must not exceed total of 69120000 bytes!&lt;br /&gt;
&lt;br /&gt;
==== 1st Session ====&lt;br /&gt;
&lt;br /&gt;
===== Create first ISOFile =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkisofs -l -duplicates-once -no-allow-lowercase -graft-points -V &amp;lt;DISCNAME&amp;gt; -o &amp;lt;OUTPUT1.ISO&amp;gt; &amp;lt;CHOSEN FILE&amp;gt; &amp;lt;CHOSEN FILE&amp;gt; &amp;lt;CHOSEN FILE&amp;gt;...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fill first ISOFile with zeros so it takes up exactly 68808703 bytes = LBA 45000&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dd if=/dev/zero of=&amp;lt;OUTPUT1.ISO&amp;gt; bs=1 count=1 seek=68808703&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Burn 1st session =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cdrecord -v -multi -tao -xa &amp;lt;OUTPUT1.ISO&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Check MSINFO value &amp;amp; TOC&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cdrecord -msinfo&lt;br /&gt;
&lt;br /&gt;
0,45000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cdrecord -toc&lt;br /&gt;
&lt;br /&gt;
first: 1 last 1&lt;br /&gt;
track:   1 lba:         0 (        0) 00:02:00 adr: 1 control: 4 mode: -1&lt;br /&gt;
track:lout lba:     33600 (   134400) 07:30:00 adr: 1 control: 4 mode: -1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To include subdirectories into the root directory of the CD, use&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkisofs -l -duplicates-once -no-allow-lowercase -graft-points -V &amp;lt;DISCNAME&amp;gt; -o &amp;lt;OUTPUT1.ISO&amp;gt; &amp;lt;SUBDIRECTORY&amp;gt;/=&amp;lt;PATH_OF_SUBDIRECTORY&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkisofs -no-allow-lowercase -graft-points -l -duplicates-once -V AITD4_GD_2 -o aitd4_d2_1.iso MOVIES/=../rips/modified/aitd4/cd2/AITD4_GD_2/MOVIES/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 2nd Session ====&lt;br /&gt;
&lt;br /&gt;
===== Hack 1ST_READ.BIN &amp;amp; IP.BIN =====&lt;br /&gt;
&lt;br /&gt;
Get MSINFO Value&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cdrecord -msinfo&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
binhack&lt;br /&gt;
&lt;br /&gt;
Enter name of binary: 1ST_READ.BIN&lt;br /&gt;
Enter name of bootsector: ip.bin&lt;br /&gt;
Enter msinfo value: &amp;lt;MSINFO Value&amp;gt;&lt;br /&gt;
File 1ST_READ.BIN successfully hacked. &lt;br /&gt;
Bincon detected, OS flag set to 0.&lt;br /&gt;
File ip.bin successfully created.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Insert custom Logo =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
logoinsert darkrealm.mr IP.BIN&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Burn 2nd Session =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkisofs -sort sort.txt -no-allow-lowercase -l -duplicates-once -V &amp;lt;DISCNAME&amp;gt; -G &amp;lt;IP.BIN&amp;gt; -M &amp;lt;OUTPUT1.ISO&amp;gt; -C &amp;lt;MSINFO VALUE&amp;gt; -o &amp;lt;OUTPUT2.ISO&amp;gt; &amp;lt;GAME_DATA_DIRECTORY&amp;gt;&lt;br /&gt;
cdrecord -v -tao -xa &amp;lt;OUTPUT2.ISO&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
&lt;br /&gt;
* Burn whole stuff to a CD-RW&lt;br /&gt;
* Generate CDI from CD-RW&lt;br /&gt;
** Launch DiscJuggler from emulated Windows Machine and connect via iSCSI&lt;br /&gt;
* Test CDI with ReiCast oder ReDream&lt;br /&gt;
&lt;br /&gt;
== Create CDI Images from ISO ==&lt;br /&gt;
&lt;br /&gt;
* Create ISO first&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkisofs -l -duplicates-once -graft-points -V &amp;lt;DISCNAME&amp;gt; -G &amp;lt;IP.BIN&amp;gt; -o &amp;lt;GAME.ISO&amp;gt; &amp;lt;GAME DIRECTORY&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Create DATA/DATA CDI&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wine cdi4dc.exe &amp;lt;GAME.ISO&amp;gt; /media/chris/development/dreamcast/backups/CDI/tests/&amp;lt;GAME.CDI&amp;gt; -d&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* or create AUDIO/DATA CDI, with 2nd Session starting at LBA 11702&lt;br /&gt;
** Note: 1ST_READ.BIN must eventually be binhacked to LBA 11702&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wine cdi4dc.exe &amp;lt;GAME.ISO&amp;gt; /media/chris/development/dreamcast/backups/CDI/tests/&amp;lt;GAME.CDI&amp;gt; -d&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chris</name></author>
	</entry>
	<entry>
		<id>https://darkrealm-wiki.darkrealm.dyndns.org/index.php?title=Multicast&amp;diff=4866</id>
		<title>Multicast</title>
		<link rel="alternate" type="text/html" href="https://darkrealm-wiki.darkrealm.dyndns.org/index.php?title=Multicast&amp;diff=4866"/>
		<updated>2026-04-18T20:20:57Z</updated>

		<summary type="html">&lt;p&gt;Chris: /* VXLAN Interface an Bridge attachen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Multicast üver VPN ==&lt;br /&gt;
&lt;br /&gt;
=== Multicast über Wireguard (Level 3 / Routing) ===&lt;br /&gt;
&lt;br /&gt;
Voraussetzungen:&lt;br /&gt;
&lt;br /&gt;
* Multicast muss für das WG Interface aktiviert sein&lt;br /&gt;
* Über Kommanzozeile:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ip l set WG multicast on&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Über systemd-networkd:&lt;br /&gt;
&lt;br /&gt;
WG.network&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Link]&lt;br /&gt;
Multicast=true&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Multicast-IP-Adressen müssen bei den AllowedIPs dabei sein:&lt;br /&gt;
&lt;br /&gt;
WG.netdev&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
AllowedIPs=224.0.0.0/4,ff00::/8&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Achtung: Wird im .netdev-File etwas geändert muss das Interface erst gelöscht und wieder erstellt werden damit die Änderungen greifen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
networkctl delete WG&lt;br /&gt;
networkctl reload&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== mDNS ===&lt;br /&gt;
&lt;br /&gt;
Über Avahi können mDNS-Abfragen &amp;quot;reflektiert&amp;quot; (in andere Subnetze weitergeleitet) werden. Wenn es sich beim dem Interface um ein Point-to-Point Interface handelt (Wireguard-Interfaces sind Point-to-Point Interfaces) muss dies auch noch erlaubt werden.&lt;br /&gt;
&lt;br /&gt;
/etc/avahi/avahi-daemon.conf:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[server]&lt;br /&gt;
allow-point-to-point=yes # Bei Point-to-Point Interfaces nötig&lt;br /&gt;
&lt;br /&gt;
[reflector]&lt;br /&gt;
enable-reflector=yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Netzwerk A möchte die mDNS-Geräte in Netzwerk B sehen:&lt;br /&gt;
&lt;br /&gt;
reflector auf Host B aktivieren.&lt;br /&gt;
&lt;br /&gt;
Netzwerk B möchte die mDNS-Geräte in Netzwerk A sehen:&lt;br /&gt;
&lt;br /&gt;
reflector auf Host A aktivieren.&lt;br /&gt;
&lt;br /&gt;
Damit die Geräte auch auf den Hosts hinter dem Gateway gesehen werden können muss auf dem jeweiligen Gateway auch der Reflector aktiviert werden.&lt;br /&gt;
&lt;br /&gt;
=== SSDP / UPnP / DLNA ===&lt;br /&gt;
&lt;br /&gt;
SSDP hat mit mDNS nichts zu tun, kann also auch nicht über den avahi-daemon reflector weitergeleitet werden. Es muss ein Multicast-Router verwendet werden, hier: smcroute&lt;br /&gt;
&lt;br /&gt;
/etc/smcroute.conf:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
phyint WG enable&lt;br /&gt;
phyint BRIDGE_LAN enable&lt;br /&gt;
&lt;br /&gt;
# SSDP&lt;br /&gt;
mgroup from BRIDGE_LAN group 239.255.255.250&lt;br /&gt;
mroute from BRIDGE_LAN group 239.255.255.250 to WG&lt;br /&gt;
mgroup from WG group 239.255.255.250&lt;br /&gt;
mroute from WG group 239.255.255.250 to BRIDGE_LAN&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Netzwerk A möchte die UPnP-Geräte in Netzwerk B sehen:&lt;br /&gt;
&lt;br /&gt;
smcroute auf Host A starten.&lt;br /&gt;
&lt;br /&gt;
Netzwerk B möchte die UPnP-Geräte in Netzwerk A sehen:&lt;br /&gt;
&lt;br /&gt;
smcroute auf Host B starten.&lt;br /&gt;
&lt;br /&gt;
=== Geräte hinter dem Router ===&lt;br /&gt;
&lt;br /&gt;
Damit die Geräte hinter dem Router von den Multicast-Paketen erreicht werden können:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ip r add 192.168.1.0/24 dev WG&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ip r add 192.168.178.0/24 dev WG&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
IPv4 Forwarding muss aktiviert sein, sowie forwarding in the Firewall muss akzeptiert werden!&lt;br /&gt;
&lt;br /&gt;
=== Wireguard Debugging aktivieren ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo module wireguard +p &amp;gt; /sys/kernel/debug/dynamic_debug/control&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Multicast über VXLAN (Level 2 / Bridging) ===&lt;br /&gt;
&lt;br /&gt;
==== VXLAN Interface auf beiden Hosts erstellen ====&lt;br /&gt;
&lt;br /&gt;
Auf Host A:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ip link add vxlan0 type vxlan id 42 dev WG remote 172.31.0.2 dstport 4789&lt;br /&gt;
ip link set vxlan0 up&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auf Host B:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ip link add vxlan0 type vxlan id 42 dev WG remote 172.31.0.1 dstport 4789&lt;br /&gt;
ip link set vxlan0 up&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== VXLAN Interface an Bridge attachen ====&lt;br /&gt;
&lt;br /&gt;
Auf Host B:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ip link add br-vxlan type bridge&lt;br /&gt;
ip link set br-vxlan up&lt;br /&gt;
ip link set vxlan0 master br-vxlan&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auf Host A:&lt;br /&gt;
&lt;br /&gt;
Dies attached das vxlan0-Interface an die BRIDGE_LAN-Bridge. Wenn jetzt ein Rechner auf Site B eine DHCP-Anfrage auf dem br-vxlan-Interface stellt bekommt das Interface eine IP aus dem Adressbereich von Site A, und zwar auf dem Interface wo das vxlan0-Interface attached ist, also BRIDGE_LAN.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ip link set vxlan0 master BRIDGE_LAN&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die MTU evtl. noch ein wenig heruntersetzen:&lt;br /&gt;
&lt;br /&gt;
Auf Host A und B:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ip link set vxlan0 mtu 1280&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chris</name></author>
	</entry>
	<entry>
		<id>https://darkrealm-wiki.darkrealm.dyndns.org/index.php?title=Multicast&amp;diff=4865</id>
		<title>Multicast</title>
		<link rel="alternate" type="text/html" href="https://darkrealm-wiki.darkrealm.dyndns.org/index.php?title=Multicast&amp;diff=4865"/>
		<updated>2026-04-18T19:26:23Z</updated>

		<summary type="html">&lt;p&gt;Chris: /* Multicast über VXLAN (Level 2 / Bridging) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Multicast üver VPN ==&lt;br /&gt;
&lt;br /&gt;
=== Multicast über Wireguard (Level 3 / Routing) ===&lt;br /&gt;
&lt;br /&gt;
Voraussetzungen:&lt;br /&gt;
&lt;br /&gt;
* Multicast muss für das WG Interface aktiviert sein&lt;br /&gt;
* Über Kommanzozeile:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ip l set WG multicast on&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Über systemd-networkd:&lt;br /&gt;
&lt;br /&gt;
WG.network&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Link]&lt;br /&gt;
Multicast=true&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Multicast-IP-Adressen müssen bei den AllowedIPs dabei sein:&lt;br /&gt;
&lt;br /&gt;
WG.netdev&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
AllowedIPs=224.0.0.0/4,ff00::/8&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Achtung: Wird im .netdev-File etwas geändert muss das Interface erst gelöscht und wieder erstellt werden damit die Änderungen greifen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
networkctl delete WG&lt;br /&gt;
networkctl reload&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== mDNS ===&lt;br /&gt;
&lt;br /&gt;
Über Avahi können mDNS-Abfragen &amp;quot;reflektiert&amp;quot; (in andere Subnetze weitergeleitet) werden. Wenn es sich beim dem Interface um ein Point-to-Point Interface handelt (Wireguard-Interfaces sind Point-to-Point Interfaces) muss dies auch noch erlaubt werden.&lt;br /&gt;
&lt;br /&gt;
/etc/avahi/avahi-daemon.conf:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[server]&lt;br /&gt;
allow-point-to-point=yes # Bei Point-to-Point Interfaces nötig&lt;br /&gt;
&lt;br /&gt;
[reflector]&lt;br /&gt;
enable-reflector=yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Netzwerk A möchte die mDNS-Geräte in Netzwerk B sehen:&lt;br /&gt;
&lt;br /&gt;
reflector auf Host B aktivieren.&lt;br /&gt;
&lt;br /&gt;
Netzwerk B möchte die mDNS-Geräte in Netzwerk A sehen:&lt;br /&gt;
&lt;br /&gt;
reflector auf Host A aktivieren.&lt;br /&gt;
&lt;br /&gt;
Damit die Geräte auch auf den Hosts hinter dem Gateway gesehen werden können muss auf dem jeweiligen Gateway auch der Reflector aktiviert werden.&lt;br /&gt;
&lt;br /&gt;
=== SSDP / UPnP / DLNA ===&lt;br /&gt;
&lt;br /&gt;
SSDP hat mit mDNS nichts zu tun, kann also auch nicht über den avahi-daemon reflector weitergeleitet werden. Es muss ein Multicast-Router verwendet werden, hier: smcroute&lt;br /&gt;
&lt;br /&gt;
/etc/smcroute.conf:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
phyint WG enable&lt;br /&gt;
phyint BRIDGE_LAN enable&lt;br /&gt;
&lt;br /&gt;
# SSDP&lt;br /&gt;
mgroup from BRIDGE_LAN group 239.255.255.250&lt;br /&gt;
mroute from BRIDGE_LAN group 239.255.255.250 to WG&lt;br /&gt;
mgroup from WG group 239.255.255.250&lt;br /&gt;
mroute from WG group 239.255.255.250 to BRIDGE_LAN&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Netzwerk A möchte die UPnP-Geräte in Netzwerk B sehen:&lt;br /&gt;
&lt;br /&gt;
smcroute auf Host A starten.&lt;br /&gt;
&lt;br /&gt;
Netzwerk B möchte die UPnP-Geräte in Netzwerk A sehen:&lt;br /&gt;
&lt;br /&gt;
smcroute auf Host B starten.&lt;br /&gt;
&lt;br /&gt;
=== Geräte hinter dem Router ===&lt;br /&gt;
&lt;br /&gt;
Damit die Geräte hinter dem Router von den Multicast-Paketen erreicht werden können:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ip r add 192.168.1.0/24 dev WG&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ip r add 192.168.178.0/24 dev WG&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
IPv4 Forwarding muss aktiviert sein, sowie forwarding in the Firewall muss akzeptiert werden!&lt;br /&gt;
&lt;br /&gt;
=== Wireguard Debugging aktivieren ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo module wireguard +p &amp;gt; /sys/kernel/debug/dynamic_debug/control&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Multicast über VXLAN (Level 2 / Bridging) ===&lt;br /&gt;
&lt;br /&gt;
==== VXLAN Interface auf beiden Hosts erstellen ====&lt;br /&gt;
&lt;br /&gt;
Auf Host A:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ip link add vxlan0 type vxlan id 42 dev WG remote 172.31.0.2 dstport 4789&lt;br /&gt;
ip link set vxlan0 up&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auf Host B:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ip link add vxlan0 type vxlan id 42 dev WG remote 172.31.0.1 dstport 4789&lt;br /&gt;
ip link set vxlan0 up&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== VXLAN Interface an Bridge attachen ====&lt;br /&gt;
&lt;br /&gt;
Auf Host B:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ip link add br-vxlan type bridge&lt;br /&gt;
ip link set br-vxlan up&lt;br /&gt;
ip link set vxlan0 master br-vxlan&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auf Host A:&lt;br /&gt;
&lt;br /&gt;
Dies attached das vxlan0-Interface an die BRIDGE_LAN-Bridge. Wenn jetzt ein Rechner auf Site B eine DHCP-Anfrage auf dem br-vxlan-Interface stellt bekommt das Interface eine IP aus dem Adressbereich von Site A, und zwar auf dem Interface wo das vxlan0-Interface attached ist, also BRIDGE_LAN.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ip link set vxlan0 master BRIDGE_LAN&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die MTU noch ein wenig heruntersetzen:&lt;br /&gt;
&lt;br /&gt;
Auf Host A und B:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ip link set vxlan0 mtu 1280&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chris</name></author>
	</entry>
	<entry>
		<id>https://darkrealm-wiki.darkrealm.dyndns.org/index.php?title=Multicast&amp;diff=4864</id>
		<title>Multicast</title>
		<link rel="alternate" type="text/html" href="https://darkrealm-wiki.darkrealm.dyndns.org/index.php?title=Multicast&amp;diff=4864"/>
		<updated>2026-04-18T19:18:37Z</updated>

		<summary type="html">&lt;p&gt;Chris: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Multicast üver VPN ==&lt;br /&gt;
&lt;br /&gt;
=== Multicast über Wireguard (Level 3 / Routing) ===&lt;br /&gt;
&lt;br /&gt;
Voraussetzungen:&lt;br /&gt;
&lt;br /&gt;
* Multicast muss für das WG Interface aktiviert sein&lt;br /&gt;
* Über Kommanzozeile:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ip l set WG multicast on&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Über systemd-networkd:&lt;br /&gt;
&lt;br /&gt;
WG.network&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Link]&lt;br /&gt;
Multicast=true&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Multicast-IP-Adressen müssen bei den AllowedIPs dabei sein:&lt;br /&gt;
&lt;br /&gt;
WG.netdev&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
AllowedIPs=224.0.0.0/4,ff00::/8&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Achtung: Wird im .netdev-File etwas geändert muss das Interface erst gelöscht und wieder erstellt werden damit die Änderungen greifen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
networkctl delete WG&lt;br /&gt;
networkctl reload&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== mDNS ===&lt;br /&gt;
&lt;br /&gt;
Über Avahi können mDNS-Abfragen &amp;quot;reflektiert&amp;quot; (in andere Subnetze weitergeleitet) werden. Wenn es sich beim dem Interface um ein Point-to-Point Interface handelt (Wireguard-Interfaces sind Point-to-Point Interfaces) muss dies auch noch erlaubt werden.&lt;br /&gt;
&lt;br /&gt;
/etc/avahi/avahi-daemon.conf:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[server]&lt;br /&gt;
allow-point-to-point=yes # Bei Point-to-Point Interfaces nötig&lt;br /&gt;
&lt;br /&gt;
[reflector]&lt;br /&gt;
enable-reflector=yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Netzwerk A möchte die mDNS-Geräte in Netzwerk B sehen:&lt;br /&gt;
&lt;br /&gt;
reflector auf Host B aktivieren.&lt;br /&gt;
&lt;br /&gt;
Netzwerk B möchte die mDNS-Geräte in Netzwerk A sehen:&lt;br /&gt;
&lt;br /&gt;
reflector auf Host A aktivieren.&lt;br /&gt;
&lt;br /&gt;
Damit die Geräte auch auf den Hosts hinter dem Gateway gesehen werden können muss auf dem jeweiligen Gateway auch der Reflector aktiviert werden.&lt;br /&gt;
&lt;br /&gt;
=== SSDP / UPnP / DLNA ===&lt;br /&gt;
&lt;br /&gt;
SSDP hat mit mDNS nichts zu tun, kann also auch nicht über den avahi-daemon reflector weitergeleitet werden. Es muss ein Multicast-Router verwendet werden, hier: smcroute&lt;br /&gt;
&lt;br /&gt;
/etc/smcroute.conf:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
phyint WG enable&lt;br /&gt;
phyint BRIDGE_LAN enable&lt;br /&gt;
&lt;br /&gt;
# SSDP&lt;br /&gt;
mgroup from BRIDGE_LAN group 239.255.255.250&lt;br /&gt;
mroute from BRIDGE_LAN group 239.255.255.250 to WG&lt;br /&gt;
mgroup from WG group 239.255.255.250&lt;br /&gt;
mroute from WG group 239.255.255.250 to BRIDGE_LAN&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Netzwerk A möchte die UPnP-Geräte in Netzwerk B sehen:&lt;br /&gt;
&lt;br /&gt;
smcroute auf Host A starten.&lt;br /&gt;
&lt;br /&gt;
Netzwerk B möchte die UPnP-Geräte in Netzwerk A sehen:&lt;br /&gt;
&lt;br /&gt;
smcroute auf Host B starten.&lt;br /&gt;
&lt;br /&gt;
=== Geräte hinter dem Router ===&lt;br /&gt;
&lt;br /&gt;
Damit die Geräte hinter dem Router von den Multicast-Paketen erreicht werden können:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ip r add 192.168.1.0/24 dev WG&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ip r add 192.168.178.0/24 dev WG&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
IPv4 Forwarding muss aktiviert sein, sowie forwarding in the Firewall muss akzeptiert werden!&lt;br /&gt;
&lt;br /&gt;
=== Wireguard Debugging aktivieren ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo module wireguard +p &amp;gt; /sys/kernel/debug/dynamic_debug/control&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Multicast über VXLAN (Level 2 / Bridging) ===&lt;/div&gt;</summary>
		<author><name>Chris</name></author>
	</entry>
	<entry>
		<id>https://darkrealm-wiki.darkrealm.dyndns.org/index.php?title=Funktionierende_Toolchains&amp;diff=4863</id>
		<title>Funktionierende Toolchains</title>
		<link rel="alternate" type="text/html" href="https://darkrealm-wiki.darkrealm.dyndns.org/index.php?title=Funktionierende_Toolchains&amp;diff=4863"/>
		<updated>2026-01-13T23:46:20Z</updated>

		<summary type="html">&lt;p&gt;Chris: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== KallistiOS Toolchain ==&lt;br /&gt;
&lt;br /&gt;
Voraussetzungen:&lt;br /&gt;
&lt;br /&gt;
* Wenn die Toolchain innerhalb eines CIFS-Mounts installiert wird müssen &#039;&#039;&#039;mfsymlinks&#039;&#039;&#039; in den Mountoptions aktiviert sein!&lt;br /&gt;
* 2026-01-14: Nur die Crosscompiler auf shodan bauen, KOS und KOS-Ports auf cortexreaver&lt;br /&gt;
&lt;br /&gt;
=== Crosscompiler bauen ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /mnt/storage/development/dreamcast/toolchains&lt;br /&gt;
cd /mnt/storage/development/dreamcast/toolchains&lt;br /&gt;
git clone https://github.com/KallistiOS/KallistiOS.git kos&lt;br /&gt;
cd kos/utils/dc-chain/&lt;br /&gt;
cp -av Makefile.default.cfg Makefile.cfg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Makefile.cfg bearbeiten ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Sega Dreamcast Toolchains Maker (dc-chain)&lt;br /&gt;
# This file is part of KallistiOS.&lt;br /&gt;
&lt;br /&gt;
#########################&lt;br /&gt;
### TOOLCHAIN PROFILE ###&lt;br /&gt;
#########################&lt;br /&gt;
&lt;br /&gt;
# Choose a toolchain profile from the following available options:&lt;br /&gt;
# No longer supported upstream:&lt;br /&gt;
# - 9.3.0-legacy: Former &#039;stable&#039; option, based on GCC 9.3.0 and Newlib 3.3.0.&lt;br /&gt;
# - 9.5.0-winxp:  Most recent versions of tools which run on Windows XP.&lt;br /&gt;
# - 10.5.0:       Last release in the GCC 10 series, released 2023-07-07.&lt;br /&gt;
# - 11.5.0:       Last release in the GCC 11 series, released 2024-07-19.&lt;br /&gt;
# Supported upstream:&lt;br /&gt;
# - 12.4.0:       Latest release in the GCC 12 series, released 2024-06-20.&lt;br /&gt;
# - stable:       Tested stable; based on GCC 13.2.0, released 2023-07-27.&lt;br /&gt;
# - 13.3.0:       Latest release in the GCC 13 series, released 2024-05-21.&lt;br /&gt;
# - 14.2.0:       Latest release in the GCC 14 series, released 2024-08-01.&lt;br /&gt;
# Development versions:&lt;br /&gt;
# - 13.3.1-dev    Bleeding edge GCC 13 series from git.&lt;br /&gt;
# - 14.2.1-dev    Bleeding edge GCC 14 series from git.&lt;br /&gt;
# - 15.0.0-dev    Bleeding edge GCC 15 series from git.&lt;br /&gt;
# - gccrs-dev:    GCC fork for development of the GCCRS Rust compiler.&lt;br /&gt;
# - rustc-dev:    GCC fork for development of the libgccjit rustc GCC codegen.&lt;br /&gt;
# If unsure, select stable. See README.md for more detailed descriptions.&lt;br /&gt;
toolchain_profile=stable&lt;br /&gt;
&lt;br /&gt;
########################&lt;br /&gt;
### DOWNLOAD OPTIONS ###&lt;br /&gt;
########################&lt;br /&gt;
&lt;br /&gt;
### Download protocol (http|https|ftp)&lt;br /&gt;
# Specify the protocol you want to use for downloading package files.&lt;br /&gt;
download_protocol=https&lt;br /&gt;
&lt;br /&gt;
### Force downloader (curl|wget)&lt;br /&gt;
# Specify here if you&#039;d prefer to use &#039;wget&#039; or &#039;curl&#039;. If neither is specified,&lt;br /&gt;
# a web downloader tool will be auto-detected in the following order: cURL, Wget&lt;br /&gt;
# You must have either Wget or cURL installed to use dc-chain.&lt;br /&gt;
#force_downloader=wget&lt;br /&gt;
&lt;br /&gt;
### Specify GNU mirror override&lt;br /&gt;
# The default mirror for GNU sources is &#039;ftpmirror.gnu.org&#039;&lt;br /&gt;
# This setting overrides the default mirror with a preferred mirror.&lt;br /&gt;
#gnu_mirror=mirrors.kernel.org&lt;br /&gt;
&lt;br /&gt;
#####################&lt;br /&gt;
### BUILD OPTIONS ###&lt;br /&gt;
#####################&lt;br /&gt;
&lt;br /&gt;
### SH toolchain install path&lt;br /&gt;
# Specify the directory where the SH toolchain will be installed. This setting&lt;br /&gt;
# must match the KOS_CC_BASE setting in your KOS &amp;quot;environ.sh&amp;quot; configuration.&lt;br /&gt;
sh_toolchain_path=/media/chris/development/dreamcast/toolchains/sh-elf&lt;br /&gt;
&lt;br /&gt;
### ARM toolchain install path&lt;br /&gt;
# Specify the directory where the ARM toolchain will be installed. This setting&lt;br /&gt;
# must match the DC_ARM_BASE setting in your KOS &amp;quot;environ.sh&amp;quot; configuration.&lt;br /&gt;
arm_toolchain_path=/media/chris/development/dreamcast/toolchains/arm-eabi&lt;br /&gt;
&lt;br /&gt;
### Make jobs (n|&amp;lt;empty&amp;gt;)&lt;br /&gt;
# Set this value to the number of parallel jobs you want to run with make.&lt;br /&gt;
# For fastest toolchain building, set to the number of CPU threads available.&lt;br /&gt;
# Using multiple jobs may cause issues in certain environments and may be&lt;br /&gt;
# automatically disabled. If you encounter errors building your toolchain,&lt;br /&gt;
# reduce the number of jobs to 1 to avoid issues and ease troubleshooting.&lt;br /&gt;
makejobs=16&lt;br /&gt;
&lt;br /&gt;
### Verbose (1|0)&lt;br /&gt;
# Choose whether to actively display compilation messages on the screen.&lt;br /&gt;
# Messages are saved to the build log files regardless of this setting.&lt;br /&gt;
verbose=1&lt;br /&gt;
&lt;br /&gt;
### Erase (1|0)&lt;br /&gt;
# Erase build directories as toolchain components are installed to save space.&lt;br /&gt;
erase=1&lt;br /&gt;
&lt;br /&gt;
### Install toolchain debug symbols (1|0)&lt;br /&gt;
# Choose whether to keep the debugging symbols for the toolchain.&lt;br /&gt;
# This is only useful if you wish to debug the toolchain itself.&lt;br /&gt;
#toolchain_debug=1&lt;br /&gt;
&lt;br /&gt;
########################&lt;br /&gt;
### LANGUAGE OPTIONS ###&lt;br /&gt;
########################&lt;br /&gt;
&lt;br /&gt;
### Enable C++&lt;br /&gt;
# Builds C++ support, including the C++ compiler and its standard library. The&lt;br /&gt;
# vast majority of language features are supported, with C++23 and early C++26&lt;br /&gt;
# support included. KallistiOS provides several examples with C++ support, so it&lt;br /&gt;
# is enabled by default. Adding C++ support requires extra disk space and&lt;br /&gt;
# compilation time, so you may disable it here if you do not plan on using C++.&lt;br /&gt;
enable_cpp=1&lt;br /&gt;
&lt;br /&gt;
### Enable Objective-C&lt;br /&gt;
# Builds Objective-C support. Currently, this builds the Obj-C compiler and&lt;br /&gt;
# runtime, but does not build a standard library. The GNUStep Base Library is&lt;br /&gt;
# currently in active development for future inclusion in the kos-ports library.&lt;br /&gt;
# KallistiOS provides examples with Obj-C support, so it is enabled by default.&lt;br /&gt;
enable_objc=1&lt;br /&gt;
&lt;br /&gt;
### Enable Objective C++&lt;br /&gt;
# Builds Objective C++ support. This hybrid language allows both C++ and Obj-C&lt;br /&gt;
# methods to be called from both contexts. Enabled by default as both the C++&lt;br /&gt;
# and Obj-C languages are already enabled by default.&lt;br /&gt;
enable_objcpp=1&lt;br /&gt;
&lt;br /&gt;
### Enable D&lt;br /&gt;
# Builds D support. This will build the D compiler, but does not build the&lt;br /&gt;
# Phobos Runtime Library. D support may only be enabled on POSIX platforms which&lt;br /&gt;
# have its external dependencies provided through a host DMD, GDC, or LDC&lt;br /&gt;
# compiler installation.&lt;br /&gt;
#enable_d=1&lt;br /&gt;
&lt;br /&gt;
### Enable Ada&lt;br /&gt;
# Builds Ada support. This will build the GNAT Ada compiler and tools but does&lt;br /&gt;
# not build the libada runtime library. In order for this build to succeed, the&lt;br /&gt;
# host&#039;s GCC version must match the target Dreamcast version, plus the same&lt;br /&gt;
# version of GNAT and its tools must be preinstalled (and in your path).&lt;br /&gt;
#enable_ada=1&lt;br /&gt;
&lt;br /&gt;
### Enable Rust&lt;br /&gt;
# Builds the work-in-progress GCCRS Rust compiler frontend for GCC. Requires a&lt;br /&gt;
# development version of GCC. Use with the gccrs-dev toolchain profile for the&lt;br /&gt;
# most recent updates to the GCCRS compiler. This option is not to be confused&lt;br /&gt;
# with using this toolchain as a backend for rustc; see libgccjit below.&lt;br /&gt;
#enable_rust=1&lt;br /&gt;
&lt;br /&gt;
### Enable libgccjit&lt;br /&gt;
# Enables the libgccjit embeddable GCC library. This is most commonly enabled to&lt;br /&gt;
# allow using this toolchain as a backend for the official rustc compiler. Use&lt;br /&gt;
# with the rustc-dev toolchain profile if this is your use case.&lt;br /&gt;
#enable_libgccjit=1&lt;br /&gt;
&lt;br /&gt;
###################&lt;br /&gt;
### GCC OPTIONS ###&lt;br /&gt;
###################&lt;br /&gt;
&lt;br /&gt;
### Floating point precision support (m4-single-only|m4-single|m4)&lt;br /&gt;
# Build support for various SH4 floating-point operation ABIs. KallistiOS only&lt;br /&gt;
# officially supports single-precision-only mode (m4-single-only); however,&lt;br /&gt;
# experimental support for single-precision-default mode (m4-single) has been&lt;br /&gt;
# added to allow for the use of full 64-bit doubles. You may also include&lt;br /&gt;
# double-precision-default (m4) which is untested and unsupported, or you may&lt;br /&gt;
# choose to specify only m4-single-only to save disk space.&lt;br /&gt;
precision_modes=m4-single-only,m4-single&lt;br /&gt;
&lt;br /&gt;
### Default floating point mode (m4|m4-single|m4-single-only)&lt;br /&gt;
# Choose the default floating point precision ABI used when GCC is invoked. This&lt;br /&gt;
# may be overridden by passing -m4-single-only, -m4-single, or -m4 to GCC.&lt;br /&gt;
# KOS currently only officially supports m4-single-only, so it is the default.&lt;br /&gt;
default_precision=m4-single-only&lt;br /&gt;
&lt;br /&gt;
### GCC threading model (single|kos)&lt;br /&gt;
# KallistiOS patches to GCC provide a &#039;kos&#039; thread model, which should be used.&lt;br /&gt;
# If you want to disable threading support for C++, Objective-C, and so forth,&lt;br /&gt;
# you can set this option to &#039;single&#039;.&lt;br /&gt;
thread_model=kos&lt;br /&gt;
&lt;br /&gt;
### Automatic patching for KallistiOS (1|0)&lt;br /&gt;
# Uncomment this option if you want to disable applying KallistiOS patches to&lt;br /&gt;
# toolchain source files before building. This will disable usage of the &#039;kos&#039;&lt;br /&gt;
# thread model. Only do this if you understand what you are doing.&lt;br /&gt;
#use_kos_patches=0&lt;br /&gt;
&lt;br /&gt;
### Disable GCC Native Language Support (1|0)&lt;br /&gt;
# By default, NLS allows GCC to output diagnostics in non-English languages.&lt;br /&gt;
# Uncomment this option to disable NLS and force GCC to output in English.&lt;br /&gt;
#disable_nls=1&lt;br /&gt;
&lt;br /&gt;
######################&lt;br /&gt;
### NEWLIB OPTIONS ###&lt;br /&gt;
######################&lt;br /&gt;
&lt;br /&gt;
### Automatic patching for Newlib (1|0)&lt;br /&gt;
# Uncomment this option if you want to disable the automatic patching of Newlib&lt;br /&gt;
# needed by KallistiOS. This will keep the generated toolchain completely raw.&lt;br /&gt;
# This will also disable the &#039;kos&#039; thread model. Only do this if you understand&lt;br /&gt;
# what you are doing.&lt;br /&gt;
#auto_fixup_sh4_newlib=0&lt;br /&gt;
&lt;br /&gt;
### C99 format specifier support (1|0)&lt;br /&gt;
# Define this to build Newlib with additional support for the C99 format&lt;br /&gt;
# specifiers, used by printf and friends. These include support for size_t,&lt;br /&gt;
# ptrdiff_t, intmax_t, and sized integral types.&lt;br /&gt;
newlib_c99_formats=1&lt;br /&gt;
&lt;br /&gt;
### Multibyte character set support (1|0)&lt;br /&gt;
# Define this to build Newlib with additional multibyte support. This enables&lt;br /&gt;
# three special locales: &amp;quot;C-JIS&amp;quot;, &amp;quot;C-SJIS&amp;quot;, and &amp;quot;C-EUCJP&amp;quot;. The multibyte&lt;br /&gt;
# support extends to the mb and wc functions in stdlib as well as format&lt;br /&gt;
# characters for the printf and scanf family of routines.&lt;br /&gt;
#newlib_multibyte=1&lt;br /&gt;
&lt;br /&gt;
### iconv() character encoding conversions support (encoding list)&lt;br /&gt;
# Define a list here to enable support for the iconv() function and &amp;lt;iconv.h&amp;gt;&lt;br /&gt;
# header file. The given comma separated list defines for which encoding types&lt;br /&gt;
# to include bidirectional conversion support. For the full list of available&lt;br /&gt;
# encodings, see the Newlib configuration documentation.&lt;br /&gt;
#newlib_iconv_encodings=us_ascii,utf8,utf16,ucs_2_internal,ucs_4_internal&lt;br /&gt;
&lt;br /&gt;
### Optimize Newlib for space (1|0)&lt;br /&gt;
# Uncomment this option to optimize for space when building Newlib. This will&lt;br /&gt;
# build Newlib with compiler flags which favor smaller code sizes over faster&lt;br /&gt;
# performance.&lt;br /&gt;
#newlib_opt_space=1&lt;br /&gt;
&lt;br /&gt;
###################&lt;br /&gt;
### C++ OPTIONS ###&lt;br /&gt;
###################&lt;br /&gt;
&lt;br /&gt;
### Timezone database support (1|0|path)&lt;br /&gt;
# Uncomment this option to enable building support for C++&#039;s std::chrono::tzdb&lt;br /&gt;
# into your C++ standard library by using a combination of the system&#039;s local&lt;br /&gt;
# timezone DB and one dynamically fetched from the &amp;quot;IANA Time Zone Database.&amp;quot;&lt;br /&gt;
# Without support enabled, only the &amp;quot;UTC&amp;quot; and &amp;quot;GMT&amp;quot; timezones will be defined.&lt;br /&gt;
# You can optionally provide the path to a directory with a custom &amp;quot;tzdata.zi&amp;quot;&lt;br /&gt;
# database file. NOTE: Enabling this will result in larger C++ binaries!&lt;br /&gt;
#libstdcxx_tzdb=1&lt;br /&gt;
&lt;br /&gt;
#######################&lt;br /&gt;
### WINDOWS OPTIONS ###&lt;br /&gt;
#######################&lt;br /&gt;
&lt;br /&gt;
### MinGW/MSYS&lt;br /&gt;
# Standalone binaries (1|0)&lt;br /&gt;
# Uncomment this option if you want static binaries that are standalone and&lt;br /&gt;
# require no dependencies. When this option is used, binaries can be run outside&lt;br /&gt;
# the MinGW/MSYS environment. This is NOT recommended; only do this if you know&lt;br /&gt;
# what you are doing.&lt;br /&gt;
#standalone_binary=1&lt;br /&gt;
&lt;br /&gt;
### Force installation of BFD for SH (1|0)&lt;br /&gt;
# Uncomment this option if you want to force installation of &#039;libbfd&#039; for the SH&lt;br /&gt;
# toolchain. This is required for MinGW/MSYS and can&#039;t be disabled in this&lt;br /&gt;
# scenario. This option is here mainly if you want to force the installation of&lt;br /&gt;
# &#039;libbfd&#039; under other environments, but this won&#039;t be necessary in most cases,&lt;br /&gt;
# as &#039;libelf&#039; is used almost everywhere. Please note, &#039;libbfd&#039; is not portable&lt;br /&gt;
# if you built it on another environment. Only use this flag if you understand&lt;br /&gt;
# what you are doing.&lt;br /&gt;
#sh_force_libbfd_installation=1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Make durchführen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PATH=/usr/bin make all&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== KOS bauen ====&lt;br /&gt;
&lt;br /&gt;
eviron.sh:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# KallistiOS Environment Settings&lt;br /&gt;
#&lt;br /&gt;
# This is a sample script for configuring and customizing your&lt;br /&gt;
# KOS build environment. Modify it to suit your setup. Several&lt;br /&gt;
# settings may be enabled optionally or are provided with&lt;br /&gt;
# alternative values.&lt;br /&gt;
#&lt;br /&gt;
# This script is typically sourced in your current shell environment&lt;br /&gt;
# (probably by .bashrc, .bash_profile, or something similar), so that&lt;br /&gt;
# the KOS environment is set up automatically for each shell session.&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
# Build Architecture&lt;br /&gt;
#&lt;br /&gt;
# Set the major architecture you&#039;ll be building for.&lt;br /&gt;
# The only option here is &amp;quot;dreamcast&amp;quot; as of KOS 2.0.0.&lt;br /&gt;
#&lt;br /&gt;
export KOS_ARCH=&amp;quot;dreamcast&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Build Sub-Architecture&lt;br /&gt;
#&lt;br /&gt;
# Defines the sub architecture your configuration&lt;br /&gt;
# is targeting or uses an existing value that&lt;br /&gt;
# can be set externally via your IDE.&lt;br /&gt;
#&lt;br /&gt;
# Valid values:&lt;br /&gt;
#   &amp;quot;pristine&amp;quot; - Dreamcast console or HKT-0120 devkit (default)&lt;br /&gt;
#   &amp;quot;naomi&amp;quot;    - NAOMI or NAOMI 2 arcade board&lt;br /&gt;
#&lt;br /&gt;
if [ -z &amp;quot;${KOS_SUBARCH}&amp;quot; ] ; then&lt;br /&gt;
    export KOS_SUBARCH=&amp;quot;pristine&amp;quot;&lt;br /&gt;
else&lt;br /&gt;
    export KOS_SUBARCH&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# KOS Root Path&lt;br /&gt;
#&lt;br /&gt;
# Specifies the path to the KOS root directory&lt;br /&gt;
#&lt;br /&gt;
export KOS_BASE=&amp;quot;/media/chris/development/dreamcast/toolchains/kos&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# KOS-Ports Path&lt;br /&gt;
#&lt;br /&gt;
# Specifies the path to the KOS-ports directory&lt;br /&gt;
#&lt;br /&gt;
export KOS_PORTS=&amp;quot;${KOS_BASE}/../kos-ports&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# SH Compiler Prefixes&lt;br /&gt;
#&lt;br /&gt;
# Specifies the path to and prefix for the main SH&lt;br /&gt;
# GCC toolchain used to target the Dreamcast&#039;s SH4 CPU.&lt;br /&gt;
#&lt;br /&gt;
export KOS_CC_BASE=&amp;quot;/media/chris/development/dreamcast/toolchains/sh-elf&amp;quot;&lt;br /&gt;
export KOS_CC_PREFIX=&amp;quot;sh-elf&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# ARM Compiler Prefixes&lt;br /&gt;
#&lt;br /&gt;
# Specifies the path to and prefix for the additional ARM&lt;br /&gt;
# GCC toolchain used to target the Dreamcast&#039;s AICA SPU.&lt;br /&gt;
#&lt;br /&gt;
export DC_ARM_BASE=&amp;quot;/media/chris/development/dreamcast/toolchains/arm-eabi&amp;quot;&lt;br /&gt;
export DC_ARM_PREFIX=&amp;quot;arm-eabi&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# External Dreamcast Tools Path&lt;br /&gt;
#&lt;br /&gt;
# Specifies the path where Dreamcast tools that are not part of KOS are to be&lt;br /&gt;
# installed. This includes, for example, dc-tool-ip, dc-tool-serial, and the&lt;br /&gt;
# mrbc bytecode compiler. This directory, along with SH and ARM compiler&lt;br /&gt;
# toolchains, will be added to your PATH environment variable.&lt;br /&gt;
#&lt;br /&gt;
export DC_TOOLS_BASE=&amp;quot;/media/chris/development/dreamcast/tools&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# CMake Toolchain Path&lt;br /&gt;
#&lt;br /&gt;
# Specifies the path to the toolchain file used to target&lt;br /&gt;
# KOS with the &amp;quot;cmake&amp;quot; build utility.&lt;br /&gt;
#&lt;br /&gt;
export KOS_CMAKE_TOOLCHAIN=&amp;quot;${KOS_BASE}/utils/cmake/dreamcast.toolchain.cmake&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Genromfs Utility Path&lt;br /&gt;
#&lt;br /&gt;
# Specifies the path to the utility which is used by KOS&lt;br /&gt;
# to create romdisk filesystem images.&lt;br /&gt;
#&lt;br /&gt;
export KOS_GENROMFS=&amp;quot;${KOS_BASE}/utils/genromfs/genromfs&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Make Utility&lt;br /&gt;
#&lt;br /&gt;
# Configures the tool to be used as the main &amp;quot;make&amp;quot; utility&lt;br /&gt;
# for building GNU Makefiles. On a platform such as BSD,&lt;br /&gt;
# the default can be changed to &amp;quot;gmake,&amp;quot; for the GNU&lt;br /&gt;
# implementation.&lt;br /&gt;
#&lt;br /&gt;
export KOS_MAKE=&amp;quot;make&amp;quot;&lt;br /&gt;
#export KOS_MAKE=&amp;quot;gmake&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Loader Utility&lt;br /&gt;
#&lt;br /&gt;
# Specifies the loader to be used with the &amp;quot;make run&amp;quot; targets&lt;br /&gt;
# in the KOS examples. Defaults to using a preconfigured version&lt;br /&gt;
# of dc-tool. Use one of the other options for a manual dc-tool-ip&lt;br /&gt;
# or dc-tool-serial configuration, remembering to change the values&lt;br /&gt;
# for the Dreamcast&#039;s IP address or the serial port interface.&lt;br /&gt;
#&lt;br /&gt;
#export KOS_LOADER=&amp;quot;dc-tool -x&amp;quot;&lt;br /&gt;
export KOS_LOADER=&amp;quot;dc-tool-ip -t dreamcast -x&amp;quot;&lt;br /&gt;
#export KOS_LOADER=&amp;quot;dc-tool-ser -t /dev/ttyS0 -x&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Default Compiler Flags&lt;br /&gt;
#&lt;br /&gt;
# Resets build flags. You can also initialize them to some preset&lt;br /&gt;
# default values here if you wish.&lt;br /&gt;
#&lt;br /&gt;
export KOS_INC_PATHS=&amp;quot;&amp;quot;&lt;br /&gt;
export KOS_CFLAGS=&amp;quot;&amp;quot;&lt;br /&gt;
export KOS_CPPFLAGS=&amp;quot;&amp;quot;&lt;br /&gt;
export KOS_LDFLAGS=&amp;quot;&amp;quot;&lt;br /&gt;
export KOS_AFLAGS=&amp;quot;&amp;quot;&lt;br /&gt;
export DC_ARM_LDFLAGS=&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Debug Builds&lt;br /&gt;
#&lt;br /&gt;
# Controls whether to disable additional debugging checks and assertions,&lt;br /&gt;
# such as for parameter validation or internal errors. Uncomment this if&lt;br /&gt;
# you do not wish to compile with this additional logic enabled.&lt;br /&gt;
#&lt;br /&gt;
#export KOS_CFLAGS=&amp;quot;${KOS_CFLAGS} -DNDEBUG&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Optimization Level&lt;br /&gt;
#&lt;br /&gt;
# Controls the baseline optimization level to use when building.&lt;br /&gt;
# Typically this is -Og (debugging), -O0, -O1, -O2, or -O3.&lt;br /&gt;
# NOTE: For our target, -O4 is a valid optimization level that has&lt;br /&gt;
# been seen to have some performance impact as well.&lt;br /&gt;
#&lt;br /&gt;
export KOS_CFLAGS=&amp;quot;${KOS_CFLAGS} -O2&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Additional Optimizations&lt;br /&gt;
#&lt;br /&gt;
# Uncomment this to enable what has been found empirically to be&lt;br /&gt;
# the optimal set of additional flags for release build performance&lt;br /&gt;
# on the current stable toolchain. NOTE: Certain KOS-ports and examples&lt;br /&gt;
# do not work properly with &amp;quot;-flto=auto&amp;quot;!&lt;br /&gt;
#&lt;br /&gt;
#export KOS_CFLAGS=&amp;quot;${KOS_CFLAGS} -freorder-blocks-algorithm=simple -flto=auto&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Frame Pointers&lt;br /&gt;
#&lt;br /&gt;
# Controls whether frame pointers are emitted or not. Disabled by&lt;br /&gt;
# default. Enable them if you plan to use GDB for debugging.&lt;br /&gt;
#&lt;br /&gt;
export KOS_CFLAGS=&amp;quot;${KOS_CFLAGS} -fomit-frame-pointer&amp;quot;&lt;br /&gt;
#export KOS_CFLAGS=&amp;quot;${KOS_CFLAGS} -fno-omit-frame-pointer -DFRAME_POINTERS&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Stack Protector&lt;br /&gt;
#&lt;br /&gt;
# Controls whether GCC emits extra code to check for buffer overflows or stack&lt;br /&gt;
# smashing, which can be very useful for debugging. -fstack-protector only&lt;br /&gt;
# covers vulnerable objects, while -fstack-protector-strong provides medium&lt;br /&gt;
# coverage, and -fstack-protector-all provides full coverage. You may also&lt;br /&gt;
# override the default stack excepton handler by providing your own&lt;br /&gt;
# implementation of &amp;quot;void __stack_chk_fail(void).&amp;quot;&lt;br /&gt;
#&lt;br /&gt;
#export KOS_CFLAGS=&amp;quot;${KOS_CFLAGS} -fstack-protector-all&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# GCC Builtin Functions&lt;br /&gt;
#&lt;br /&gt;
# Comment out this line to enable GCC to use its own builtin implementations of&lt;br /&gt;
# certain standard library functions. Under certain conditions, this can allow&lt;br /&gt;
# compiler-optimized implementations to replace standard function invocations.&lt;br /&gt;
# The downside of this is that it COULD interfere with Newlib or KOS implementations&lt;br /&gt;
# of these functions, and it has not been tested thoroughly to ensure compatibility.&lt;br /&gt;
#&lt;br /&gt;
export KOS_CFLAGS=&amp;quot;${KOS_CFLAGS} -fno-builtin&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Fast Math Instructions&lt;br /&gt;
#&lt;br /&gt;
# Uncomment this line to enable the optimized fast-math instructions (FSSRA,&lt;br /&gt;
# FSCA, and FSQRT) for calculating sin/cos, inverse square root, and square roots.&lt;br /&gt;
# These can result in substantial performance gains for these kinds of operations;&lt;br /&gt;
# however, they do so at the price of accuracy and are not IEEE compliant.&lt;br /&gt;
# NOTE: Enabling this option will also override -fno-builtin!&lt;br /&gt;
#&lt;br /&gt;
#export KOS_CFLAGS=&amp;quot;${KOS_CFLAGS} -fbuiltin -ffast-math -ffp-contract=fast&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# SH4 Floating-Point Arithmetic Precision&lt;br /&gt;
#&lt;br /&gt;
# KallistiOS supports both the single-precision-default ABI (m4-single) and the&lt;br /&gt;
# single-precision-only ABI (m4-single-only). When using m4-single, the SH4 will&lt;br /&gt;
# be in single-precision mode upon function entry but will switch to double-&lt;br /&gt;
# precision mode if 64-bit doubles are used. When using m4-single-only, the SH4&lt;br /&gt;
# will always be in single-precision mode and 64-bit doubles will be truncated to&lt;br /&gt;
# 32-bit floats. Historically, m4-single-only was used in both official and&lt;br /&gt;
# homebrew Dreamcast software, but m4-single is the default as of KOS 2.2.0 to&lt;br /&gt;
# increase compatibility with newer libraries which require 64-bit doubles.&lt;br /&gt;
#&lt;br /&gt;
# WARNING: When adjusting this setting, make sure all software, including&lt;br /&gt;
#          kos-ports and linked external libraries, are rebuilt using the same&lt;br /&gt;
#          floating-point precision ABI setting!&lt;br /&gt;
#&lt;br /&gt;
export KOS_SH4_PRECISION=&amp;quot;-m4-single&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Use LRA (Local Register Allocator) Pass&lt;br /&gt;
#&lt;br /&gt;
# Uncomment this line to use the modern Local Register Allocator pass during&lt;br /&gt;
# code generation instead of the default older reload pass. This option is&lt;br /&gt;
# known to be unstable or less performant for SH at this time, but will likely&lt;br /&gt;
# become mandatory in future versions of GCC, so feel free to help us test.&lt;br /&gt;
# Only enable this setting if you understand what you are doing!&lt;br /&gt;
#&lt;br /&gt;
#export KOS_CFLAGS=&amp;quot;${KOS_CFLAGS} -mlra&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Shared Compiler Configuration&lt;br /&gt;
#&lt;br /&gt;
# Include sub architecture-independent configuration file for shared&lt;br /&gt;
# environment settings. If you want to configure additional compiler&lt;br /&gt;
# options or see where other build flags are set, look at this file.&lt;br /&gt;
#&lt;br /&gt;
. ${KOS_BASE}/environ_base.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
. environ.sh&lt;br /&gt;
make&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== KOS-ports bauen ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone --recursive https://github.com/KallistiOS/kos-ports kos-ports&lt;br /&gt;
kos-ports/utils/build-all.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chris</name></author>
	</entry>
	<entry>
		<id>https://darkrealm-wiki.darkrealm.dyndns.org/index.php?title=Miniupnpd&amp;diff=4862</id>
		<title>Miniupnpd</title>
		<link rel="alternate" type="text/html" href="https://darkrealm-wiki.darkrealm.dyndns.org/index.php?title=Miniupnpd&amp;diff=4862"/>
		<updated>2025-12-03T20:15:46Z</updated>

		<summary type="html">&lt;p&gt;Chris: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== miniupnpd compilen ==&lt;br /&gt;
&lt;br /&gt;
* git clone --recurse-submodules  https://github.com/miniupnp/miniupnp.git&lt;br /&gt;
* ./configure --ipv6 --leasefile --portinuse --firewall=nftables --systemd&lt;br /&gt;
* make all&lt;br /&gt;
* sudo make install&lt;br /&gt;
* config anpassen:&lt;br /&gt;
&lt;br /&gt;
/etc/miniupnpd/miniupnpd.conf:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# miniupnpd.conf: MiniUPnP IGD &amp;amp; PCP/NAT-PMP daemon configuration file&lt;br /&gt;
# More information at https://miniupnp.tuxfamily.org or http://miniupnp.free.fr&lt;br /&gt;
&lt;br /&gt;
# CAUTION: mixing up WAN and LAN interfaces may introduce security risks!&lt;br /&gt;
# Be sure to assign the correct interfaces to LAN and WAN and consider&lt;br /&gt;
# implementing UPnP permission rules at the bottom of this configuration file&lt;br /&gt;
&lt;br /&gt;
# WAN network interface&lt;br /&gt;
ext_ifname=WAN&lt;br /&gt;
&lt;br /&gt;
# if the WAN network interface for IPv6 is different than for IPv4,&lt;br /&gt;
# set ext_ifname6&lt;br /&gt;
#ext_ifname6=eth2&lt;br /&gt;
&lt;br /&gt;
# If the WAN interface has several IP addresses, you&lt;br /&gt;
# can specify the one to use below.&lt;br /&gt;
# Setting ext_ip is also useful in double NAT setup, you can declare here&lt;br /&gt;
# the public IP address.&lt;br /&gt;
#ext_ip=192.168.3.251&lt;br /&gt;
#ext_ip=146.52.237.239&lt;br /&gt;
&lt;br /&gt;
# The WAN interface must have a public IP address. Otherwise it is behind NAT&lt;br /&gt;
# and port forwarding is impossible. In some cases WAN interface can be&lt;br /&gt;
# behind unrestricted full-cone NAT 1:1 when all incoming traffic is NAT-ed and&lt;br /&gt;
# routed to WAN interfaces without any filtering. In this cases miniupnpd&lt;br /&gt;
# needs to know the public IP address and it can be learnt by asking external&lt;br /&gt;
# server via STUN protocol. Following option enable retrieving external&lt;br /&gt;
# public IP address from STUN server and detection of NAT type. You need&lt;br /&gt;
# to specify also external STUN server in stun_host option below.&lt;br /&gt;
# This option is disabled by default.&lt;br /&gt;
ext_perform_stun=yes&lt;br /&gt;
#ext_perform_stun=allow-filtered&lt;br /&gt;
&lt;br /&gt;
# Specify STUN server, either hostname or IP address&lt;br /&gt;
# Some public STUN servers:&lt;br /&gt;
#  stunserver.stunprotocol.org&lt;br /&gt;
#  stun.sipgate.net&lt;br /&gt;
#  stun.xten.com&lt;br /&gt;
#  stun.l.google.com (on non standard port 19302)&lt;br /&gt;
#ext_stun_host=stunserver.stunprotocol.org&lt;br /&gt;
ext_stun_host=stun.xten.com&lt;br /&gt;
# Specify STUN UDP port, by default it is standard port 3478.&lt;br /&gt;
#ext_stun_port=3478&lt;br /&gt;
&lt;br /&gt;
# LAN network interfaces IPs / networks&lt;br /&gt;
# There can be multiple listening IPs for SSDP traffic, in that case&lt;br /&gt;
# use multiple &#039;listening_ip=...&#039; lines, one for each network interface.&lt;br /&gt;
# It can be IP address or network interface name (ie. &amp;quot;eth0&amp;quot;)&lt;br /&gt;
# It is mandatory to use the network interface name in order to enable IPv6&lt;br /&gt;
# HTTP is available on all interfaces.&lt;br /&gt;
# When MULTIPLE_EXTERNAL_IP is enabled, the external IP&lt;br /&gt;
# address associated with the subnet follows. For example:&lt;br /&gt;
#  listening_ip=192.168.0.1/24 88.22.44.13&lt;br /&gt;
# When MULTIPLE_EXTERNAL_IP is disabled, you can list associated network&lt;br /&gt;
# interfaces (for bridges)&lt;br /&gt;
#  listening_ip=bridge0 em0 wlan0&lt;br /&gt;
#listening_ip=192.168.0.1/24&lt;br /&gt;
#listening_ip=10.5.0.0/16&lt;br /&gt;
listening_ip=BRIDGE_LAN&lt;br /&gt;
&lt;br /&gt;
# Port for HTTP (descriptions and SOAP) traffic. Set to 0 for autoselect.&lt;br /&gt;
#http_port=0&lt;br /&gt;
&lt;br /&gt;
# Port for HTTPS. Set to 0 for autoselect (default)&lt;br /&gt;
#https_port=0&lt;br /&gt;
&lt;br /&gt;
# Path to the UNIX socket used to communicate with MiniSSDPd&lt;br /&gt;
# If running, MiniSSDPd will manage M-SEARCH answering.&lt;br /&gt;
# default is /var/run/minissdpd.sock&lt;br /&gt;
#minissdpdsocket=/var/run/minissdpd.sock&lt;br /&gt;
&lt;br /&gt;
# Disable IPv6 (default is no : IPv6 enabled if enabled at build time)&lt;br /&gt;
#ipv6_disable=yes&lt;br /&gt;
&lt;br /&gt;
# Enable NAT-PMP and PCP support (default is no)&lt;br /&gt;
enable_pcp_pmp=yes&lt;br /&gt;
&lt;br /&gt;
# Enable UPNP support (default is yes)&lt;br /&gt;
enable_upnp=yes&lt;br /&gt;
&lt;br /&gt;
# PCP&lt;br /&gt;
# Configure the minimum and maximum lifetime of a port mapping in seconds&lt;br /&gt;
# 120s and 86400s (24h) are suggested values from PCP-base&lt;br /&gt;
#min_lifetime=120&lt;br /&gt;
#max_lifetime=86400&lt;br /&gt;
# allow THIRD_PARTY Option for MAP and PEER Opcodes (default is no)&lt;br /&gt;
#pcp_allow_thirdparty=yes&lt;br /&gt;
&lt;br /&gt;
# table names for netfilter nft. Default is &amp;quot;filter&amp;quot; for both&lt;br /&gt;
#upnp_table_name=filter&lt;br /&gt;
#upnp_nat_table_name=filter&lt;br /&gt;
# chain names for netfilter and netfilter nft&lt;br /&gt;
# netfilter : default are MINIUPNPD, MINIUPNPD, MINIUPNPD-POSTROUTING&lt;br /&gt;
# netfilter nft : default are miniupnpd, prerouting_miniupnpd, postrouting_miniupnpd&lt;br /&gt;
#upnp_forward_chain=forward&lt;br /&gt;
#upnp_nat_chain=nat&lt;br /&gt;
#upnp_nat_postrouting_chain=postrouting&lt;br /&gt;
upnp_nftables_family_split=yes&lt;br /&gt;
&lt;br /&gt;
# Lease file location&lt;br /&gt;
#lease_file=/var/log/upnp.leases&lt;br /&gt;
&lt;br /&gt;
# To enable the next few runtime options, see compile time&lt;br /&gt;
# ENABLE_MANUFACTURER_INFO_CONFIGURATION (config.h)&lt;br /&gt;
&lt;br /&gt;
# Name of this service, default is &amp;quot;`uname -s` router&amp;quot;&lt;br /&gt;
#friendly_name=MiniUPnPd router&lt;br /&gt;
&lt;br /&gt;
# Manufacturer name, default is &amp;quot;`uname -s`&amp;quot;&lt;br /&gt;
#manufacturer_name=Manufacturer corp&lt;br /&gt;
&lt;br /&gt;
# Manufacturer URL, default is URL of OS vendor&lt;br /&gt;
#manufacturer_url=https://miniupnp.tuxfamily.org/&lt;br /&gt;
&lt;br /&gt;
# Model name, default is &amp;quot;`uname -s` router&amp;quot;&lt;br /&gt;
#model_name=Router Model&lt;br /&gt;
&lt;br /&gt;
# Model description, default is &amp;quot;`uname -s` router&amp;quot;&lt;br /&gt;
#model_description=Very Secure Router - Model&lt;br /&gt;
&lt;br /&gt;
# Model URL, default is URL of OS vendor&lt;br /&gt;
#model_url=https://miniupnp.tuxfamily.org/&lt;br /&gt;
&lt;br /&gt;
# Bitrates reported by daemon in bits per second&lt;br /&gt;
# by default miniupnpd tries to get WAN interface speed&lt;br /&gt;
#bitrate_up=1000000&lt;br /&gt;
#bitrate_down=10000000&lt;br /&gt;
&lt;br /&gt;
# Secure Mode, UPnP clients can only add mappings to their own IP&lt;br /&gt;
# Enabled by default&lt;br /&gt;
#secure_mode=no&lt;br /&gt;
&lt;br /&gt;
# Default presentation URL is HTTP address on port 80&lt;br /&gt;
# If set to an empty string, no presentationURL element will appear&lt;br /&gt;
# in the XML description of the device, which prevents MS Windows&lt;br /&gt;
# from displaying an icon in the &amp;quot;Network Connections&amp;quot; panel.&lt;br /&gt;
#presentation_url=http://www.mylan/index.php&lt;br /&gt;
&lt;br /&gt;
# Report system uptime instead of daemon uptime&lt;br /&gt;
system_uptime=yes&lt;br /&gt;
&lt;br /&gt;
# Notify interval in seconds. default is 900 seconds.&lt;br /&gt;
# As advised in the standard, announcement have a lifetime double of this value.&lt;br /&gt;
notify_interval=900&lt;br /&gt;
&lt;br /&gt;
# Unused rules cleaning.&lt;br /&gt;
# never remove any rule before this threshold for the number&lt;br /&gt;
# of redirections is exceeded. default to 20&lt;br /&gt;
#clean_ruleset_threshold=10&lt;br /&gt;
# Clean process work interval in seconds. default to 0 (disabled).&lt;br /&gt;
# a 600 seconds (10 minutes) interval makes sense&lt;br /&gt;
clean_ruleset_interval=600&lt;br /&gt;
&lt;br /&gt;
# Log packets in pf (default is no)&lt;br /&gt;
#packet_log=yes&lt;br /&gt;
&lt;br /&gt;
# Anchor name in pf (default is miniupnpd)&lt;br /&gt;
#anchor=miniupnpd&lt;br /&gt;
&lt;br /&gt;
# ALTQ queue in pf&lt;br /&gt;
# Filter rules must be used for this to be used.&lt;br /&gt;
# compile with PF_ENABLE_FILTER_RULES (see config.h file)&lt;br /&gt;
#queue=queue_name1&lt;br /&gt;
&lt;br /&gt;
# Tag name in pf&lt;br /&gt;
#tag=tag_name1&lt;br /&gt;
&lt;br /&gt;
# Make filter rules in pf quick or not. default is yes&lt;br /&gt;
# active when compiled with PF_ENABLE_FILTER_RULES (see config.h file)&lt;br /&gt;
#quickrules=no&lt;br /&gt;
&lt;br /&gt;
# UUID, generate your own UUID with &amp;quot;make genuuid&amp;quot;&lt;br /&gt;
uuid=00000000-0000-0000-0000-000000000000&lt;br /&gt;
&lt;br /&gt;
# Daemon&#039;s serial and model number when reporting to clients&lt;br /&gt;
# (in XML description)&lt;br /&gt;
#serial=12345678&lt;br /&gt;
#model_number=1&lt;br /&gt;
&lt;br /&gt;
# If compiled with IGD_V2 defined, force reporting IGDv1 in rootDesc (default&lt;br /&gt;
# is no)&lt;br /&gt;
#force_igd_desc_v1=no&lt;br /&gt;
&lt;br /&gt;
# UPnP permission rules (also enforced for NAT-PMP and PCP) for IPv4&lt;br /&gt;
# (allow|deny) (external port range) IP/mask (internal port range) (optional regex filter)&lt;br /&gt;
# A port range is &amp;lt;min port&amp;gt;-&amp;lt;max port&amp;gt; or &amp;lt;port&amp;gt; if there is only&lt;br /&gt;
# one port in the range.&lt;br /&gt;
# IP/mask format must be nnn.nnn.nnn.nnn/nn&lt;br /&gt;
# Regex support must be enabled at build time : ./configure --regex&lt;br /&gt;
# It is advised to only allow redirection of ports &amp;gt;= 1024&lt;br /&gt;
# and end the rule set with &amp;quot;deny 0-65535 0.0.0.0/0 0-65535&amp;quot;&lt;br /&gt;
# The following default ruleset allows specific LAN side IP addresses&lt;br /&gt;
# to request only ephemeral ports. It is recommended that users&lt;br /&gt;
# modify the IP ranges to match their own internal networks, and&lt;br /&gt;
# also consider implementing network-specific restrictions&lt;br /&gt;
# CAUTION: failure to enforce any rules may permit insecure requests to be made!&lt;br /&gt;
allow 1024-65535 192.168.1.0/24 1024-65535&lt;br /&gt;
# disallow requests whose description string matches the given regex&lt;br /&gt;
# deny 1024-65535 192.168.1.0/24 1024-65535 &amp;quot;My evil app ver [[:digit:]]*&amp;quot;&lt;br /&gt;
deny 0-65535 0.0.0.0/0 0-65535&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* miniupnpd_functions.sh-Script nach /etc/miniupnpd/ kopieren (fehlt bei nftables-Variante im Makefile):&lt;br /&gt;
** sudo cp netfilter_nft/scripts/miniupnpd_functions.sh /etc/miniupnpd/&lt;br /&gt;
* evtl. editieren: af=inet in af=ip ändern&lt;br /&gt;
* systemctl daemon-reload&lt;br /&gt;
* systemctl start miniupnpd&lt;br /&gt;
&lt;br /&gt;
Damit STUN funktioniert folgende iptables/nft Regel einfügen:&lt;br /&gt;
&lt;br /&gt;
* nftables:&lt;br /&gt;
** add rule ip filter input meta l4proto udp @th,96,32 0x2112A442 counter accept&lt;br /&gt;
&lt;br /&gt;
* iptables:&lt;br /&gt;
** iptables -A INPUT -i WAN -p udp -m u32 --u32 &amp;quot;32=0x2112A442&amp;quot; -j ACCEPT&lt;/div&gt;</summary>
		<author><name>Chris</name></author>
	</entry>
	<entry>
		<id>https://darkrealm-wiki.darkrealm.dyndns.org/index.php?title=Miniupnpd&amp;diff=4861</id>
		<title>Miniupnpd</title>
		<link rel="alternate" type="text/html" href="https://darkrealm-wiki.darkrealm.dyndns.org/index.php?title=Miniupnpd&amp;diff=4861"/>
		<updated>2025-12-03T20:00:55Z</updated>

		<summary type="html">&lt;p&gt;Chris: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== miniupnpd compilen ==&lt;br /&gt;
&lt;br /&gt;
* git clone --recurse-submodules  https://github.com/miniupnp/miniupnp.git&lt;br /&gt;
* ./configure --ipv6 --leasefile --portinuse --firewall=nftables --systemd&lt;br /&gt;
* make all&lt;br /&gt;
* sudo make install&lt;br /&gt;
* config anpassen:&lt;br /&gt;
&lt;br /&gt;
/etc/miniupnpd/miniupnpd.conf:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# miniupnpd.conf: MiniUPnP IGD &amp;amp; PCP/NAT-PMP daemon configuration file&lt;br /&gt;
# More information at https://miniupnp.tuxfamily.org or http://miniupnp.free.fr&lt;br /&gt;
&lt;br /&gt;
# CAUTION: mixing up WAN and LAN interfaces may introduce security risks!&lt;br /&gt;
# Be sure to assign the correct interfaces to LAN and WAN and consider&lt;br /&gt;
# implementing UPnP permission rules at the bottom of this configuration file&lt;br /&gt;
&lt;br /&gt;
# WAN network interface&lt;br /&gt;
ext_ifname=WAN&lt;br /&gt;
&lt;br /&gt;
# if the WAN network interface for IPv6 is different than for IPv4,&lt;br /&gt;
# set ext_ifname6&lt;br /&gt;
#ext_ifname6=eth2&lt;br /&gt;
&lt;br /&gt;
# If the WAN interface has several IP addresses, you&lt;br /&gt;
# can specify the one to use below.&lt;br /&gt;
# Setting ext_ip is also useful in double NAT setup, you can declare here&lt;br /&gt;
# the public IP address.&lt;br /&gt;
#ext_ip=192.168.3.251&lt;br /&gt;
#ext_ip=146.52.237.239&lt;br /&gt;
&lt;br /&gt;
# The WAN interface must have a public IP address. Otherwise it is behind NAT&lt;br /&gt;
# and port forwarding is impossible. In some cases WAN interface can be&lt;br /&gt;
# behind unrestricted full-cone NAT 1:1 when all incoming traffic is NAT-ed and&lt;br /&gt;
# routed to WAN interfaces without any filtering. In this cases miniupnpd&lt;br /&gt;
# needs to know the public IP address and it can be learnt by asking external&lt;br /&gt;
# server via STUN protocol. Following option enable retrieving external&lt;br /&gt;
# public IP address from STUN server and detection of NAT type. You need&lt;br /&gt;
# to specify also external STUN server in stun_host option below.&lt;br /&gt;
# This option is disabled by default.&lt;br /&gt;
ext_perform_stun=yes&lt;br /&gt;
#ext_perform_stun=allow-filtered&lt;br /&gt;
&lt;br /&gt;
# Specify STUN server, either hostname or IP address&lt;br /&gt;
# Some public STUN servers:&lt;br /&gt;
#  stunserver.stunprotocol.org&lt;br /&gt;
#  stun.sipgate.net&lt;br /&gt;
#  stun.xten.com&lt;br /&gt;
#  stun.l.google.com (on non standard port 19302)&lt;br /&gt;
#ext_stun_host=stunserver.stunprotocol.org&lt;br /&gt;
ext_stun_host=stun.xten.com&lt;br /&gt;
# Specify STUN UDP port, by default it is standard port 3478.&lt;br /&gt;
#ext_stun_port=3478&lt;br /&gt;
&lt;br /&gt;
# LAN network interfaces IPs / networks&lt;br /&gt;
# There can be multiple listening IPs for SSDP traffic, in that case&lt;br /&gt;
# use multiple &#039;listening_ip=...&#039; lines, one for each network interface.&lt;br /&gt;
# It can be IP address or network interface name (ie. &amp;quot;eth0&amp;quot;)&lt;br /&gt;
# It is mandatory to use the network interface name in order to enable IPv6&lt;br /&gt;
# HTTP is available on all interfaces.&lt;br /&gt;
# When MULTIPLE_EXTERNAL_IP is enabled, the external IP&lt;br /&gt;
# address associated with the subnet follows. For example:&lt;br /&gt;
#  listening_ip=192.168.0.1/24 88.22.44.13&lt;br /&gt;
# When MULTIPLE_EXTERNAL_IP is disabled, you can list associated network&lt;br /&gt;
# interfaces (for bridges)&lt;br /&gt;
#  listening_ip=bridge0 em0 wlan0&lt;br /&gt;
#listening_ip=192.168.0.1/24&lt;br /&gt;
#listening_ip=10.5.0.0/16&lt;br /&gt;
listening_ip=BRIDGE_LAN&lt;br /&gt;
&lt;br /&gt;
# Port for HTTP (descriptions and SOAP) traffic. Set to 0 for autoselect.&lt;br /&gt;
#http_port=0&lt;br /&gt;
&lt;br /&gt;
# Port for HTTPS. Set to 0 for autoselect (default)&lt;br /&gt;
#https_port=0&lt;br /&gt;
&lt;br /&gt;
# Path to the UNIX socket used to communicate with MiniSSDPd&lt;br /&gt;
# If running, MiniSSDPd will manage M-SEARCH answering.&lt;br /&gt;
# default is /var/run/minissdpd.sock&lt;br /&gt;
#minissdpdsocket=/var/run/minissdpd.sock&lt;br /&gt;
&lt;br /&gt;
# Disable IPv6 (default is no : IPv6 enabled if enabled at build time)&lt;br /&gt;
#ipv6_disable=yes&lt;br /&gt;
&lt;br /&gt;
# Enable NAT-PMP and PCP support (default is no)&lt;br /&gt;
enable_pcp_pmp=yes&lt;br /&gt;
&lt;br /&gt;
# Enable UPNP support (default is yes)&lt;br /&gt;
enable_upnp=yes&lt;br /&gt;
&lt;br /&gt;
# PCP&lt;br /&gt;
# Configure the minimum and maximum lifetime of a port mapping in seconds&lt;br /&gt;
# 120s and 86400s (24h) are suggested values from PCP-base&lt;br /&gt;
#min_lifetime=120&lt;br /&gt;
#max_lifetime=86400&lt;br /&gt;
# allow THIRD_PARTY Option for MAP and PEER Opcodes (default is no)&lt;br /&gt;
#pcp_allow_thirdparty=yes&lt;br /&gt;
&lt;br /&gt;
# table names for netfilter nft. Default is &amp;quot;filter&amp;quot; for both&lt;br /&gt;
#upnp_table_name=filter&lt;br /&gt;
#upnp_nat_table_name=filter&lt;br /&gt;
# chain names for netfilter and netfilter nft&lt;br /&gt;
# netfilter : default are MINIUPNPD, MINIUPNPD, MINIUPNPD-POSTROUTING&lt;br /&gt;
# netfilter nft : default are miniupnpd, prerouting_miniupnpd, postrouting_miniupnpd&lt;br /&gt;
#upnp_forward_chain=forward&lt;br /&gt;
#upnp_nat_chain=nat&lt;br /&gt;
#upnp_nat_postrouting_chain=postrouting&lt;br /&gt;
upnp_nftables_family_split=yes&lt;br /&gt;
&lt;br /&gt;
# Lease file location&lt;br /&gt;
#lease_file=/var/log/upnp.leases&lt;br /&gt;
&lt;br /&gt;
# To enable the next few runtime options, see compile time&lt;br /&gt;
# ENABLE_MANUFACTURER_INFO_CONFIGURATION (config.h)&lt;br /&gt;
&lt;br /&gt;
# Name of this service, default is &amp;quot;`uname -s` router&amp;quot;&lt;br /&gt;
#friendly_name=MiniUPnPd router&lt;br /&gt;
&lt;br /&gt;
# Manufacturer name, default is &amp;quot;`uname -s`&amp;quot;&lt;br /&gt;
#manufacturer_name=Manufacturer corp&lt;br /&gt;
&lt;br /&gt;
# Manufacturer URL, default is URL of OS vendor&lt;br /&gt;
#manufacturer_url=https://miniupnp.tuxfamily.org/&lt;br /&gt;
&lt;br /&gt;
# Model name, default is &amp;quot;`uname -s` router&amp;quot;&lt;br /&gt;
#model_name=Router Model&lt;br /&gt;
&lt;br /&gt;
# Model description, default is &amp;quot;`uname -s` router&amp;quot;&lt;br /&gt;
#model_description=Very Secure Router - Model&lt;br /&gt;
&lt;br /&gt;
# Model URL, default is URL of OS vendor&lt;br /&gt;
#model_url=https://miniupnp.tuxfamily.org/&lt;br /&gt;
&lt;br /&gt;
# Bitrates reported by daemon in bits per second&lt;br /&gt;
# by default miniupnpd tries to get WAN interface speed&lt;br /&gt;
#bitrate_up=1000000&lt;br /&gt;
#bitrate_down=10000000&lt;br /&gt;
&lt;br /&gt;
# Secure Mode, UPnP clients can only add mappings to their own IP&lt;br /&gt;
# Enabled by default&lt;br /&gt;
#secure_mode=no&lt;br /&gt;
&lt;br /&gt;
# Default presentation URL is HTTP address on port 80&lt;br /&gt;
# If set to an empty string, no presentationURL element will appear&lt;br /&gt;
# in the XML description of the device, which prevents MS Windows&lt;br /&gt;
# from displaying an icon in the &amp;quot;Network Connections&amp;quot; panel.&lt;br /&gt;
#presentation_url=http://www.mylan/index.php&lt;br /&gt;
&lt;br /&gt;
# Report system uptime instead of daemon uptime&lt;br /&gt;
system_uptime=yes&lt;br /&gt;
&lt;br /&gt;
# Notify interval in seconds. default is 900 seconds.&lt;br /&gt;
# As advised in the standard, announcement have a lifetime double of this value.&lt;br /&gt;
notify_interval=900&lt;br /&gt;
&lt;br /&gt;
# Unused rules cleaning.&lt;br /&gt;
# never remove any rule before this threshold for the number&lt;br /&gt;
# of redirections is exceeded. default to 20&lt;br /&gt;
#clean_ruleset_threshold=10&lt;br /&gt;
# Clean process work interval in seconds. default to 0 (disabled).&lt;br /&gt;
# a 600 seconds (10 minutes) interval makes sense&lt;br /&gt;
clean_ruleset_interval=600&lt;br /&gt;
&lt;br /&gt;
# Log packets in pf (default is no)&lt;br /&gt;
#packet_log=yes&lt;br /&gt;
&lt;br /&gt;
# Anchor name in pf (default is miniupnpd)&lt;br /&gt;
#anchor=miniupnpd&lt;br /&gt;
&lt;br /&gt;
# ALTQ queue in pf&lt;br /&gt;
# Filter rules must be used for this to be used.&lt;br /&gt;
# compile with PF_ENABLE_FILTER_RULES (see config.h file)&lt;br /&gt;
#queue=queue_name1&lt;br /&gt;
&lt;br /&gt;
# Tag name in pf&lt;br /&gt;
#tag=tag_name1&lt;br /&gt;
&lt;br /&gt;
# Make filter rules in pf quick or not. default is yes&lt;br /&gt;
# active when compiled with PF_ENABLE_FILTER_RULES (see config.h file)&lt;br /&gt;
#quickrules=no&lt;br /&gt;
&lt;br /&gt;
# UUID, generate your own UUID with &amp;quot;make genuuid&amp;quot;&lt;br /&gt;
uuid=00000000-0000-0000-0000-000000000000&lt;br /&gt;
&lt;br /&gt;
# Daemon&#039;s serial and model number when reporting to clients&lt;br /&gt;
# (in XML description)&lt;br /&gt;
#serial=12345678&lt;br /&gt;
#model_number=1&lt;br /&gt;
&lt;br /&gt;
# If compiled with IGD_V2 defined, force reporting IGDv1 in rootDesc (default&lt;br /&gt;
# is no)&lt;br /&gt;
#force_igd_desc_v1=no&lt;br /&gt;
&lt;br /&gt;
# UPnP permission rules (also enforced for NAT-PMP and PCP) for IPv4&lt;br /&gt;
# (allow|deny) (external port range) IP/mask (internal port range) (optional regex filter)&lt;br /&gt;
# A port range is &amp;lt;min port&amp;gt;-&amp;lt;max port&amp;gt; or &amp;lt;port&amp;gt; if there is only&lt;br /&gt;
# one port in the range.&lt;br /&gt;
# IP/mask format must be nnn.nnn.nnn.nnn/nn&lt;br /&gt;
# Regex support must be enabled at build time : ./configure --regex&lt;br /&gt;
# It is advised to only allow redirection of ports &amp;gt;= 1024&lt;br /&gt;
# and end the rule set with &amp;quot;deny 0-65535 0.0.0.0/0 0-65535&amp;quot;&lt;br /&gt;
# The following default ruleset allows specific LAN side IP addresses&lt;br /&gt;
# to request only ephemeral ports. It is recommended that users&lt;br /&gt;
# modify the IP ranges to match their own internal networks, and&lt;br /&gt;
# also consider implementing network-specific restrictions&lt;br /&gt;
# CAUTION: failure to enforce any rules may permit insecure requests to be made!&lt;br /&gt;
allow 1024-65535 192.168.1.0/24 1024-65535&lt;br /&gt;
# disallow requests whose description string matches the given regex&lt;br /&gt;
# deny 1024-65535 192.168.1.0/24 1024-65535 &amp;quot;My evil app ver [[:digit:]]*&amp;quot;&lt;br /&gt;
deny 0-65535 0.0.0.0/0 0-65535&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* miniupnpd_functions.sh-Script nach /etc/miniupnpd/ kopieren (fehlt bei nftables-Variante im Makefile):&lt;br /&gt;
** sudo cp netfilter_nft/scripts/miniupnpd_functions.sh /etc/miniupnpd/&lt;br /&gt;
* evtl. editieren: af=inet in af=ip ändern&lt;br /&gt;
* systemctl daemon-reload&lt;br /&gt;
* systemctl start miniupnpd&lt;/div&gt;</summary>
		<author><name>Chris</name></author>
	</entry>
	<entry>
		<id>https://darkrealm-wiki.darkrealm.dyndns.org/index.php?title=Miniupnpd&amp;diff=4860</id>
		<title>Miniupnpd</title>
		<link rel="alternate" type="text/html" href="https://darkrealm-wiki.darkrealm.dyndns.org/index.php?title=Miniupnpd&amp;diff=4860"/>
		<updated>2025-12-03T19:01:21Z</updated>

		<summary type="html">&lt;p&gt;Chris: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== miniupnpd compilen ==&lt;br /&gt;
&lt;br /&gt;
* git clone --recurse-submodules  https://github.com/miniupnp/miniupnp.git&lt;br /&gt;
* ./configure --ipv6 --leasefile --portinuse --firewall=nftables --systemd&lt;br /&gt;
* make all&lt;br /&gt;
* sudo make install&lt;br /&gt;
* config anpassen:&lt;br /&gt;
&lt;br /&gt;
/etc/miniupnpd/miniupnpd.conf:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# miniupnpd.conf: MiniUPnP IGD &amp;amp; PCP/NAT-PMP daemon configuration file&lt;br /&gt;
# More information at https://miniupnp.tuxfamily.org or http://miniupnp.free.fr&lt;br /&gt;
&lt;br /&gt;
# CAUTION: mixing up WAN and LAN interfaces may introduce security risks!&lt;br /&gt;
# Be sure to assign the correct interfaces to LAN and WAN and consider&lt;br /&gt;
# implementing UPnP permission rules at the bottom of this configuration file&lt;br /&gt;
&lt;br /&gt;
# WAN network interface&lt;br /&gt;
ext_ifname=WAN&lt;br /&gt;
&lt;br /&gt;
# if the WAN network interface for IPv6 is different than for IPv4,&lt;br /&gt;
# set ext_ifname6&lt;br /&gt;
#ext_ifname6=eth2&lt;br /&gt;
&lt;br /&gt;
# If the WAN interface has several IP addresses, you&lt;br /&gt;
# can specify the one to use below.&lt;br /&gt;
# Setting ext_ip is also useful in double NAT setup, you can declare here&lt;br /&gt;
# the public IP address.&lt;br /&gt;
#ext_ip=192.168.3.251&lt;br /&gt;
#ext_ip=146.52.237.239&lt;br /&gt;
&lt;br /&gt;
# The WAN interface must have a public IP address. Otherwise it is behind NAT&lt;br /&gt;
# and port forwarding is impossible. In some cases WAN interface can be&lt;br /&gt;
# behind unrestricted full-cone NAT 1:1 when all incoming traffic is NAT-ed and&lt;br /&gt;
# routed to WAN interfaces without any filtering. In this cases miniupnpd&lt;br /&gt;
# needs to know the public IP address and it can be learnt by asking external&lt;br /&gt;
# server via STUN protocol. Following option enable retrieving external&lt;br /&gt;
# public IP address from STUN server and detection of NAT type. You need&lt;br /&gt;
# to specify also external STUN server in stun_host option below.&lt;br /&gt;
# This option is disabled by default.&lt;br /&gt;
ext_perform_stun=yes&lt;br /&gt;
#ext_perform_stun=allow-filtered&lt;br /&gt;
&lt;br /&gt;
# Specify STUN server, either hostname or IP address&lt;br /&gt;
# Some public STUN servers:&lt;br /&gt;
#  stunserver.stunprotocol.org&lt;br /&gt;
#  stun.sipgate.net&lt;br /&gt;
#  stun.xten.com&lt;br /&gt;
#  stun.l.google.com (on non standard port 19302)&lt;br /&gt;
#ext_stun_host=stunserver.stunprotocol.org&lt;br /&gt;
ext_stun_host=stun.xten.com&lt;br /&gt;
# Specify STUN UDP port, by default it is standard port 3478.&lt;br /&gt;
#ext_stun_port=3478&lt;br /&gt;
&lt;br /&gt;
# LAN network interfaces IPs / networks&lt;br /&gt;
# There can be multiple listening IPs for SSDP traffic, in that case&lt;br /&gt;
# use multiple &#039;listening_ip=...&#039; lines, one for each network interface.&lt;br /&gt;
# It can be IP address or network interface name (ie. &amp;quot;eth0&amp;quot;)&lt;br /&gt;
# It is mandatory to use the network interface name in order to enable IPv6&lt;br /&gt;
# HTTP is available on all interfaces.&lt;br /&gt;
# When MULTIPLE_EXTERNAL_IP is enabled, the external IP&lt;br /&gt;
# address associated with the subnet follows. For example:&lt;br /&gt;
#  listening_ip=192.168.0.1/24 88.22.44.13&lt;br /&gt;
# When MULTIPLE_EXTERNAL_IP is disabled, you can list associated network&lt;br /&gt;
# interfaces (for bridges)&lt;br /&gt;
#  listening_ip=bridge0 em0 wlan0&lt;br /&gt;
#listening_ip=192.168.0.1/24&lt;br /&gt;
#listening_ip=10.5.0.0/16&lt;br /&gt;
listening_ip=BRIDGE_LAN&lt;br /&gt;
&lt;br /&gt;
# Port for HTTP (descriptions and SOAP) traffic. Set to 0 for autoselect.&lt;br /&gt;
#http_port=0&lt;br /&gt;
&lt;br /&gt;
# Port for HTTPS. Set to 0 for autoselect (default)&lt;br /&gt;
#https_port=0&lt;br /&gt;
&lt;br /&gt;
# Path to the UNIX socket used to communicate with MiniSSDPd&lt;br /&gt;
# If running, MiniSSDPd will manage M-SEARCH answering.&lt;br /&gt;
# default is /var/run/minissdpd.sock&lt;br /&gt;
#minissdpdsocket=/var/run/minissdpd.sock&lt;br /&gt;
&lt;br /&gt;
# Disable IPv6 (default is no : IPv6 enabled if enabled at build time)&lt;br /&gt;
#ipv6_disable=yes&lt;br /&gt;
&lt;br /&gt;
# Enable NAT-PMP and PCP support (default is no)&lt;br /&gt;
enable_pcp_pmp=yes&lt;br /&gt;
&lt;br /&gt;
# Enable UPNP support (default is yes)&lt;br /&gt;
enable_upnp=yes&lt;br /&gt;
&lt;br /&gt;
# PCP&lt;br /&gt;
# Configure the minimum and maximum lifetime of a port mapping in seconds&lt;br /&gt;
# 120s and 86400s (24h) are suggested values from PCP-base&lt;br /&gt;
#min_lifetime=120&lt;br /&gt;
#max_lifetime=86400&lt;br /&gt;
# allow THIRD_PARTY Option for MAP and PEER Opcodes (default is no)&lt;br /&gt;
#pcp_allow_thirdparty=yes&lt;br /&gt;
&lt;br /&gt;
# table names for netfilter nft. Default is &amp;quot;filter&amp;quot; for both&lt;br /&gt;
#upnp_table_name=filter&lt;br /&gt;
#upnp_nat_table_name=filter&lt;br /&gt;
# chain names for netfilter and netfilter nft&lt;br /&gt;
# netfilter : default are MINIUPNPD, MINIUPNPD, MINIUPNPD-POSTROUTING&lt;br /&gt;
# netfilter nft : default are miniupnpd, prerouting_miniupnpd, postrouting_miniupnpd&lt;br /&gt;
#upnp_forward_chain=forward&lt;br /&gt;
#upnp_nat_chain=nat&lt;br /&gt;
#upnp_nat_postrouting_chain=postrouting&lt;br /&gt;
upnp_nftables_family_split=yes&lt;br /&gt;
&lt;br /&gt;
# Lease file location&lt;br /&gt;
#lease_file=/var/log/upnp.leases&lt;br /&gt;
&lt;br /&gt;
# To enable the next few runtime options, see compile time&lt;br /&gt;
# ENABLE_MANUFACTURER_INFO_CONFIGURATION (config.h)&lt;br /&gt;
&lt;br /&gt;
# Name of this service, default is &amp;quot;`uname -s` router&amp;quot;&lt;br /&gt;
#friendly_name=MiniUPnPd router&lt;br /&gt;
&lt;br /&gt;
# Manufacturer name, default is &amp;quot;`uname -s`&amp;quot;&lt;br /&gt;
#manufacturer_name=Manufacturer corp&lt;br /&gt;
&lt;br /&gt;
# Manufacturer URL, default is URL of OS vendor&lt;br /&gt;
#manufacturer_url=https://miniupnp.tuxfamily.org/&lt;br /&gt;
&lt;br /&gt;
# Model name, default is &amp;quot;`uname -s` router&amp;quot;&lt;br /&gt;
#model_name=Router Model&lt;br /&gt;
&lt;br /&gt;
# Model description, default is &amp;quot;`uname -s` router&amp;quot;&lt;br /&gt;
#model_description=Very Secure Router - Model&lt;br /&gt;
&lt;br /&gt;
# Model URL, default is URL of OS vendor&lt;br /&gt;
#model_url=https://miniupnp.tuxfamily.org/&lt;br /&gt;
&lt;br /&gt;
# Bitrates reported by daemon in bits per second&lt;br /&gt;
# by default miniupnpd tries to get WAN interface speed&lt;br /&gt;
#bitrate_up=1000000&lt;br /&gt;
#bitrate_down=10000000&lt;br /&gt;
&lt;br /&gt;
# Secure Mode, UPnP clients can only add mappings to their own IP&lt;br /&gt;
# Enabled by default&lt;br /&gt;
#secure_mode=no&lt;br /&gt;
&lt;br /&gt;
# Default presentation URL is HTTP address on port 80&lt;br /&gt;
# If set to an empty string, no presentationURL element will appear&lt;br /&gt;
# in the XML description of the device, which prevents MS Windows&lt;br /&gt;
# from displaying an icon in the &amp;quot;Network Connections&amp;quot; panel.&lt;br /&gt;
#presentation_url=http://www.mylan/index.php&lt;br /&gt;
&lt;br /&gt;
# Report system uptime instead of daemon uptime&lt;br /&gt;
system_uptime=yes&lt;br /&gt;
&lt;br /&gt;
# Notify interval in seconds. default is 900 seconds.&lt;br /&gt;
# As advised in the standard, announcement have a lifetime double of this value.&lt;br /&gt;
notify_interval=900&lt;br /&gt;
&lt;br /&gt;
# Unused rules cleaning.&lt;br /&gt;
# never remove any rule before this threshold for the number&lt;br /&gt;
# of redirections is exceeded. default to 20&lt;br /&gt;
#clean_ruleset_threshold=10&lt;br /&gt;
# Clean process work interval in seconds. default to 0 (disabled).&lt;br /&gt;
# a 600 seconds (10 minutes) interval makes sense&lt;br /&gt;
clean_ruleset_interval=600&lt;br /&gt;
&lt;br /&gt;
# Log packets in pf (default is no)&lt;br /&gt;
#packet_log=yes&lt;br /&gt;
&lt;br /&gt;
# Anchor name in pf (default is miniupnpd)&lt;br /&gt;
#anchor=miniupnpd&lt;br /&gt;
&lt;br /&gt;
# ALTQ queue in pf&lt;br /&gt;
# Filter rules must be used for this to be used.&lt;br /&gt;
# compile with PF_ENABLE_FILTER_RULES (see config.h file)&lt;br /&gt;
#queue=queue_name1&lt;br /&gt;
&lt;br /&gt;
# Tag name in pf&lt;br /&gt;
#tag=tag_name1&lt;br /&gt;
&lt;br /&gt;
# Make filter rules in pf quick or not. default is yes&lt;br /&gt;
# active when compiled with PF_ENABLE_FILTER_RULES (see config.h file)&lt;br /&gt;
#quickrules=no&lt;br /&gt;
&lt;br /&gt;
# UUID, generate your own UUID with &amp;quot;make genuuid&amp;quot;&lt;br /&gt;
uuid=00000000-0000-0000-0000-000000000000&lt;br /&gt;
&lt;br /&gt;
# Daemon&#039;s serial and model number when reporting to clients&lt;br /&gt;
# (in XML description)&lt;br /&gt;
#serial=12345678&lt;br /&gt;
#model_number=1&lt;br /&gt;
&lt;br /&gt;
# If compiled with IGD_V2 defined, force reporting IGDv1 in rootDesc (default&lt;br /&gt;
# is no)&lt;br /&gt;
#force_igd_desc_v1=no&lt;br /&gt;
&lt;br /&gt;
# UPnP permission rules (also enforced for NAT-PMP and PCP) for IPv4&lt;br /&gt;
# (allow|deny) (external port range) IP/mask (internal port range) (optional regex filter)&lt;br /&gt;
# A port range is &amp;lt;min port&amp;gt;-&amp;lt;max port&amp;gt; or &amp;lt;port&amp;gt; if there is only&lt;br /&gt;
# one port in the range.&lt;br /&gt;
# IP/mask format must be nnn.nnn.nnn.nnn/nn&lt;br /&gt;
# Regex support must be enabled at build time : ./configure --regex&lt;br /&gt;
# It is advised to only allow redirection of ports &amp;gt;= 1024&lt;br /&gt;
# and end the rule set with &amp;quot;deny 0-65535 0.0.0.0/0 0-65535&amp;quot;&lt;br /&gt;
# The following default ruleset allows specific LAN side IP addresses&lt;br /&gt;
# to request only ephemeral ports. It is recommended that users&lt;br /&gt;
# modify the IP ranges to match their own internal networks, and&lt;br /&gt;
# also consider implementing network-specific restrictions&lt;br /&gt;
# CAUTION: failure to enforce any rules may permit insecure requests to be made!&lt;br /&gt;
allow 1024-65535 192.168.1.0/24 1024-65535&lt;br /&gt;
# disallow requests whose description string matches the given regex&lt;br /&gt;
# deny 1024-65535 192.168.1.0/24 1024-65535 &amp;quot;My evil app ver [[:digit:]]*&amp;quot;&lt;br /&gt;
deny 0-65535 0.0.0.0/0 0-65535&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* miniupnpd_functions.sh-Script nach /etc/miniupnpd/ kopieren (fehlt bei nftables-Variante im Makefile):&lt;br /&gt;
** sudo cp netfilter_nft/scripts/miniupnpd_functions.sh /etc/miniupnpd/&lt;br /&gt;
* systemctl daemon-reload&lt;br /&gt;
* systemctl start miniupnpd&lt;/div&gt;</summary>
		<author><name>Chris</name></author>
	</entry>
	<entry>
		<id>https://darkrealm-wiki.darkrealm.dyndns.org/index.php?title=Miniupnpd&amp;diff=4859</id>
		<title>Miniupnpd</title>
		<link rel="alternate" type="text/html" href="https://darkrealm-wiki.darkrealm.dyndns.org/index.php?title=Miniupnpd&amp;diff=4859"/>
		<updated>2025-12-03T18:52:40Z</updated>

		<summary type="html">&lt;p&gt;Chris: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== miniupnpd compilen ==&lt;br /&gt;
&lt;br /&gt;
* git clone --recurse-submodules  https://github.com/miniupnp/miniupnp.git&lt;br /&gt;
* ./configure --ipv6 --leasefile --portinuse --firewall=nftables --systemd&lt;br /&gt;
* make all&lt;br /&gt;
* sudo make install&lt;br /&gt;
* config anpassen:&lt;br /&gt;
&lt;br /&gt;
/etc/miniupnpd/miniupnpd.conf:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# miniupnpd.conf: MiniUPnP IGD &amp;amp; PCP/NAT-PMP daemon configuration file&lt;br /&gt;
# More information at https://miniupnp.tuxfamily.org or http://miniupnp.free.fr&lt;br /&gt;
&lt;br /&gt;
# CAUTION: mixing up WAN and LAN interfaces may introduce security risks!&lt;br /&gt;
# Be sure to assign the correct interfaces to LAN and WAN and consider&lt;br /&gt;
# implementing UPnP permission rules at the bottom of this configuration file&lt;br /&gt;
&lt;br /&gt;
# WAN network interface&lt;br /&gt;
ext_ifname=WAN&lt;br /&gt;
&lt;br /&gt;
# if the WAN network interface for IPv6 is different than for IPv4,&lt;br /&gt;
# set ext_ifname6&lt;br /&gt;
#ext_ifname6=eth2&lt;br /&gt;
&lt;br /&gt;
# If the WAN interface has several IP addresses, you&lt;br /&gt;
# can specify the one to use below.&lt;br /&gt;
# Setting ext_ip is also useful in double NAT setup, you can declare here&lt;br /&gt;
# the public IP address.&lt;br /&gt;
#ext_ip=192.168.3.251&lt;br /&gt;
#ext_ip=146.52.237.239&lt;br /&gt;
&lt;br /&gt;
# The WAN interface must have a public IP address. Otherwise it is behind NAT&lt;br /&gt;
# and port forwarding is impossible. In some cases WAN interface can be&lt;br /&gt;
# behind unrestricted full-cone NAT 1:1 when all incoming traffic is NAT-ed and&lt;br /&gt;
# routed to WAN interfaces without any filtering. In this cases miniupnpd&lt;br /&gt;
# needs to know the public IP address and it can be learnt by asking external&lt;br /&gt;
# server via STUN protocol. Following option enable retrieving external&lt;br /&gt;
# public IP address from STUN server and detection of NAT type. You need&lt;br /&gt;
# to specify also external STUN server in stun_host option below.&lt;br /&gt;
# This option is disabled by default.&lt;br /&gt;
ext_perform_stun=yes&lt;br /&gt;
#ext_perform_stun=allow-filtered&lt;br /&gt;
&lt;br /&gt;
# Specify STUN server, either hostname or IP address&lt;br /&gt;
# Some public STUN servers:&lt;br /&gt;
#  stunserver.stunprotocol.org&lt;br /&gt;
#  stun.sipgate.net&lt;br /&gt;
#  stun.xten.com&lt;br /&gt;
#  stun.l.google.com (on non standard port 19302)&lt;br /&gt;
#ext_stun_host=stunserver.stunprotocol.org&lt;br /&gt;
ext_stun_host=stun.xten.com&lt;br /&gt;
# Specify STUN UDP port, by default it is standard port 3478.&lt;br /&gt;
#ext_stun_port=3478&lt;br /&gt;
&lt;br /&gt;
# LAN network interfaces IPs / networks&lt;br /&gt;
# There can be multiple listening IPs for SSDP traffic, in that case&lt;br /&gt;
# use multiple &#039;listening_ip=...&#039; lines, one for each network interface.&lt;br /&gt;
# It can be IP address or network interface name (ie. &amp;quot;eth0&amp;quot;)&lt;br /&gt;
# It is mandatory to use the network interface name in order to enable IPv6&lt;br /&gt;
# HTTP is available on all interfaces.&lt;br /&gt;
# When MULTIPLE_EXTERNAL_IP is enabled, the external IP&lt;br /&gt;
# address associated with the subnet follows. For example:&lt;br /&gt;
#  listening_ip=192.168.0.1/24 88.22.44.13&lt;br /&gt;
# When MULTIPLE_EXTERNAL_IP is disabled, you can list associated network&lt;br /&gt;
# interfaces (for bridges)&lt;br /&gt;
#  listening_ip=bridge0 em0 wlan0&lt;br /&gt;
#listening_ip=192.168.0.1/24&lt;br /&gt;
#listening_ip=10.5.0.0/16&lt;br /&gt;
listening_ip=BRIDGE_LAN&lt;br /&gt;
&lt;br /&gt;
# Port for HTTP (descriptions and SOAP) traffic. Set to 0 for autoselect.&lt;br /&gt;
#http_port=0&lt;br /&gt;
&lt;br /&gt;
# Port for HTTPS. Set to 0 for autoselect (default)&lt;br /&gt;
#https_port=0&lt;br /&gt;
&lt;br /&gt;
# Path to the UNIX socket used to communicate with MiniSSDPd&lt;br /&gt;
# If running, MiniSSDPd will manage M-SEARCH answering.&lt;br /&gt;
# default is /var/run/minissdpd.sock&lt;br /&gt;
#minissdpdsocket=/var/run/minissdpd.sock&lt;br /&gt;
&lt;br /&gt;
# Disable IPv6 (default is no : IPv6 enabled if enabled at build time)&lt;br /&gt;
#ipv6_disable=yes&lt;br /&gt;
&lt;br /&gt;
# Enable NAT-PMP and PCP support (default is no)&lt;br /&gt;
enable_pcp_pmp=yes&lt;br /&gt;
&lt;br /&gt;
# Enable UPNP support (default is yes)&lt;br /&gt;
enable_upnp=yes&lt;br /&gt;
&lt;br /&gt;
# PCP&lt;br /&gt;
# Configure the minimum and maximum lifetime of a port mapping in seconds&lt;br /&gt;
# 120s and 86400s (24h) are suggested values from PCP-base&lt;br /&gt;
#min_lifetime=120&lt;br /&gt;
#max_lifetime=86400&lt;br /&gt;
# allow THIRD_PARTY Option for MAP and PEER Opcodes (default is no)&lt;br /&gt;
#pcp_allow_thirdparty=yes&lt;br /&gt;
&lt;br /&gt;
# table names for netfilter nft. Default is &amp;quot;filter&amp;quot; for both&lt;br /&gt;
#upnp_table_name=filter&lt;br /&gt;
#upnp_nat_table_name=filter&lt;br /&gt;
# chain names for netfilter and netfilter nft&lt;br /&gt;
# netfilter : default are MINIUPNPD, MINIUPNPD, MINIUPNPD-POSTROUTING&lt;br /&gt;
# netfilter nft : default are miniupnpd, prerouting_miniupnpd, postrouting_miniupnpd&lt;br /&gt;
#upnp_forward_chain=forward&lt;br /&gt;
#upnp_nat_chain=nat&lt;br /&gt;
#upnp_nat_postrouting_chain=postrouting&lt;br /&gt;
upnp_nftables_family_split=yes&lt;br /&gt;
&lt;br /&gt;
# Lease file location&lt;br /&gt;
#lease_file=/var/log/upnp.leases&lt;br /&gt;
&lt;br /&gt;
# To enable the next few runtime options, see compile time&lt;br /&gt;
# ENABLE_MANUFACTURER_INFO_CONFIGURATION (config.h)&lt;br /&gt;
&lt;br /&gt;
# Name of this service, default is &amp;quot;`uname -s` router&amp;quot;&lt;br /&gt;
#friendly_name=MiniUPnPd router&lt;br /&gt;
&lt;br /&gt;
# Manufacturer name, default is &amp;quot;`uname -s`&amp;quot;&lt;br /&gt;
#manufacturer_name=Manufacturer corp&lt;br /&gt;
&lt;br /&gt;
# Manufacturer URL, default is URL of OS vendor&lt;br /&gt;
#manufacturer_url=https://miniupnp.tuxfamily.org/&lt;br /&gt;
&lt;br /&gt;
# Model name, default is &amp;quot;`uname -s` router&amp;quot;&lt;br /&gt;
#model_name=Router Model&lt;br /&gt;
&lt;br /&gt;
# Model description, default is &amp;quot;`uname -s` router&amp;quot;&lt;br /&gt;
#model_description=Very Secure Router - Model&lt;br /&gt;
&lt;br /&gt;
# Model URL, default is URL of OS vendor&lt;br /&gt;
#model_url=https://miniupnp.tuxfamily.org/&lt;br /&gt;
&lt;br /&gt;
# Bitrates reported by daemon in bits per second&lt;br /&gt;
# by default miniupnpd tries to get WAN interface speed&lt;br /&gt;
#bitrate_up=1000000&lt;br /&gt;
#bitrate_down=10000000&lt;br /&gt;
&lt;br /&gt;
# Secure Mode, UPnP clients can only add mappings to their own IP&lt;br /&gt;
# Enabled by default&lt;br /&gt;
#secure_mode=no&lt;br /&gt;
&lt;br /&gt;
# Default presentation URL is HTTP address on port 80&lt;br /&gt;
# If set to an empty string, no presentationURL element will appear&lt;br /&gt;
# in the XML description of the device, which prevents MS Windows&lt;br /&gt;
# from displaying an icon in the &amp;quot;Network Connections&amp;quot; panel.&lt;br /&gt;
#presentation_url=http://www.mylan/index.php&lt;br /&gt;
&lt;br /&gt;
# Report system uptime instead of daemon uptime&lt;br /&gt;
system_uptime=yes&lt;br /&gt;
&lt;br /&gt;
# Notify interval in seconds. default is 900 seconds.&lt;br /&gt;
# As advised in the standard, announcement have a lifetime double of this value.&lt;br /&gt;
notify_interval=900&lt;br /&gt;
&lt;br /&gt;
# Unused rules cleaning.&lt;br /&gt;
# never remove any rule before this threshold for the number&lt;br /&gt;
# of redirections is exceeded. default to 20&lt;br /&gt;
#clean_ruleset_threshold=10&lt;br /&gt;
# Clean process work interval in seconds. default to 0 (disabled).&lt;br /&gt;
# a 600 seconds (10 minutes) interval makes sense&lt;br /&gt;
clean_ruleset_interval=600&lt;br /&gt;
&lt;br /&gt;
# Log packets in pf (default is no)&lt;br /&gt;
#packet_log=yes&lt;br /&gt;
&lt;br /&gt;
# Anchor name in pf (default is miniupnpd)&lt;br /&gt;
#anchor=miniupnpd&lt;br /&gt;
&lt;br /&gt;
# ALTQ queue in pf&lt;br /&gt;
# Filter rules must be used for this to be used.&lt;br /&gt;
# compile with PF_ENABLE_FILTER_RULES (see config.h file)&lt;br /&gt;
#queue=queue_name1&lt;br /&gt;
&lt;br /&gt;
# Tag name in pf&lt;br /&gt;
#tag=tag_name1&lt;br /&gt;
&lt;br /&gt;
# Make filter rules in pf quick or not. default is yes&lt;br /&gt;
# active when compiled with PF_ENABLE_FILTER_RULES (see config.h file)&lt;br /&gt;
#quickrules=no&lt;br /&gt;
&lt;br /&gt;
# UUID, generate your own UUID with &amp;quot;make genuuid&amp;quot;&lt;br /&gt;
uuid=00000000-0000-0000-0000-000000000000&lt;br /&gt;
&lt;br /&gt;
# Daemon&#039;s serial and model number when reporting to clients&lt;br /&gt;
# (in XML description)&lt;br /&gt;
#serial=12345678&lt;br /&gt;
#model_number=1&lt;br /&gt;
&lt;br /&gt;
# If compiled with IGD_V2 defined, force reporting IGDv1 in rootDesc (default&lt;br /&gt;
# is no)&lt;br /&gt;
#force_igd_desc_v1=no&lt;br /&gt;
&lt;br /&gt;
# UPnP permission rules (also enforced for NAT-PMP and PCP) for IPv4&lt;br /&gt;
# (allow|deny) (external port range) IP/mask (internal port range) (optional regex filter)&lt;br /&gt;
# A port range is &amp;lt;min port&amp;gt;-&amp;lt;max port&amp;gt; or &amp;lt;port&amp;gt; if there is only&lt;br /&gt;
# one port in the range.&lt;br /&gt;
# IP/mask format must be nnn.nnn.nnn.nnn/nn&lt;br /&gt;
# Regex support must be enabled at build time : ./configure --regex&lt;br /&gt;
# It is advised to only allow redirection of ports &amp;gt;= 1024&lt;br /&gt;
# and end the rule set with &amp;quot;deny 0-65535 0.0.0.0/0 0-65535&amp;quot;&lt;br /&gt;
# The following default ruleset allows specific LAN side IP addresses&lt;br /&gt;
# to request only ephemeral ports. It is recommended that users&lt;br /&gt;
# modify the IP ranges to match their own internal networks, and&lt;br /&gt;
# also consider implementing network-specific restrictions&lt;br /&gt;
# CAUTION: failure to enforce any rules may permit insecure requests to be made!&lt;br /&gt;
allow 1024-65535 192.168.1.0/24 1024-65535&lt;br /&gt;
# disallow requests whose description string matches the given regex&lt;br /&gt;
# deny 1024-65535 192.168.1.0/24 1024-65535 &amp;quot;My evil app ver [[:digit:]]*&amp;quot;&lt;br /&gt;
deny 0-65535 0.0.0.0/0 0-65535&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&lt;/div&gt;</summary>
		<author><name>Chris</name></author>
	</entry>
	<entry>
		<id>https://darkrealm-wiki.darkrealm.dyndns.org/index.php?title=Miniupnpd&amp;diff=4858</id>
		<title>Miniupnpd</title>
		<link rel="alternate" type="text/html" href="https://darkrealm-wiki.darkrealm.dyndns.org/index.php?title=Miniupnpd&amp;diff=4858"/>
		<updated>2025-12-03T18:41:32Z</updated>

		<summary type="html">&lt;p&gt;Chris: Die Seite wurde neu angelegt: „/etc/miniupnpd/miniupnpd.conf:  &amp;lt;pre&amp;gt; # miniupnpd.conf: MiniUPnP IGD &amp;amp; PCP/NAT-PMP daemon configuration file # More information at https://miniupnp.tuxfamily.org or http://miniupnp.free.fr  # CAUTION: mixing up WAN and LAN interfaces may introduce security risks! # Be sure to assign the correct interfaces to LAN and WAN and consider # implementing UPnP permission rules at the bottom of this configuration file  # WAN network interface ext_ifname=WAN  # if…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/etc/miniupnpd/miniupnpd.conf:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# miniupnpd.conf: MiniUPnP IGD &amp;amp; PCP/NAT-PMP daemon configuration file&lt;br /&gt;
# More information at https://miniupnp.tuxfamily.org or http://miniupnp.free.fr&lt;br /&gt;
&lt;br /&gt;
# CAUTION: mixing up WAN and LAN interfaces may introduce security risks!&lt;br /&gt;
# Be sure to assign the correct interfaces to LAN and WAN and consider&lt;br /&gt;
# implementing UPnP permission rules at the bottom of this configuration file&lt;br /&gt;
&lt;br /&gt;
# WAN network interface&lt;br /&gt;
ext_ifname=WAN&lt;br /&gt;
&lt;br /&gt;
# if the WAN network interface for IPv6 is different than for IPv4,&lt;br /&gt;
# set ext_ifname6&lt;br /&gt;
#ext_ifname6=eth2&lt;br /&gt;
&lt;br /&gt;
# If the WAN interface has several IP addresses, you&lt;br /&gt;
# can specify the one to use below.&lt;br /&gt;
# Setting ext_ip is also useful in double NAT setup, you can declare here&lt;br /&gt;
# the public IP address.&lt;br /&gt;
#ext_ip=192.168.3.251&lt;br /&gt;
#ext_ip=146.52.237.239&lt;br /&gt;
&lt;br /&gt;
# The WAN interface must have a public IP address. Otherwise it is behind NAT&lt;br /&gt;
# and port forwarding is impossible. In some cases WAN interface can be&lt;br /&gt;
# behind unrestricted full-cone NAT 1:1 when all incoming traffic is NAT-ed and&lt;br /&gt;
# routed to WAN interfaces without any filtering. In this cases miniupnpd&lt;br /&gt;
# needs to know the public IP address and it can be learnt by asking external&lt;br /&gt;
# server via STUN protocol. Following option enable retrieving external&lt;br /&gt;
# public IP address from STUN server and detection of NAT type. You need&lt;br /&gt;
# to specify also external STUN server in stun_host option below.&lt;br /&gt;
# This option is disabled by default.&lt;br /&gt;
ext_perform_stun=yes&lt;br /&gt;
#ext_perform_stun=allow-filtered&lt;br /&gt;
&lt;br /&gt;
# Specify STUN server, either hostname or IP address&lt;br /&gt;
# Some public STUN servers:&lt;br /&gt;
#  stunserver.stunprotocol.org&lt;br /&gt;
#  stun.sipgate.net&lt;br /&gt;
#  stun.xten.com&lt;br /&gt;
#  stun.l.google.com (on non standard port 19302)&lt;br /&gt;
#ext_stun_host=stunserver.stunprotocol.org&lt;br /&gt;
ext_stun_host=stun.xten.com&lt;br /&gt;
# Specify STUN UDP port, by default it is standard port 3478.&lt;br /&gt;
#ext_stun_port=3478&lt;br /&gt;
&lt;br /&gt;
# LAN network interfaces IPs / networks&lt;br /&gt;
# There can be multiple listening IPs for SSDP traffic, in that case&lt;br /&gt;
# use multiple &#039;listening_ip=...&#039; lines, one for each network interface.&lt;br /&gt;
# It can be IP address or network interface name (ie. &amp;quot;eth0&amp;quot;)&lt;br /&gt;
# It is mandatory to use the network interface name in order to enable IPv6&lt;br /&gt;
# HTTP is available on all interfaces.&lt;br /&gt;
# When MULTIPLE_EXTERNAL_IP is enabled, the external IP&lt;br /&gt;
# address associated with the subnet follows. For example:&lt;br /&gt;
#  listening_ip=192.168.0.1/24 88.22.44.13&lt;br /&gt;
# When MULTIPLE_EXTERNAL_IP is disabled, you can list associated network&lt;br /&gt;
# interfaces (for bridges)&lt;br /&gt;
#  listening_ip=bridge0 em0 wlan0&lt;br /&gt;
#listening_ip=192.168.0.1/24&lt;br /&gt;
#listening_ip=10.5.0.0/16&lt;br /&gt;
listening_ip=BRIDGE_LAN&lt;br /&gt;
&lt;br /&gt;
# Port for HTTP (descriptions and SOAP) traffic. Set to 0 for autoselect.&lt;br /&gt;
#http_port=0&lt;br /&gt;
&lt;br /&gt;
# Port for HTTPS. Set to 0 for autoselect (default)&lt;br /&gt;
#https_port=0&lt;br /&gt;
&lt;br /&gt;
# Path to the UNIX socket used to communicate with MiniSSDPd&lt;br /&gt;
# If running, MiniSSDPd will manage M-SEARCH answering.&lt;br /&gt;
# default is /var/run/minissdpd.sock&lt;br /&gt;
#minissdpdsocket=/var/run/minissdpd.sock&lt;br /&gt;
&lt;br /&gt;
# Disable IPv6 (default is no : IPv6 enabled if enabled at build time)&lt;br /&gt;
#ipv6_disable=yes&lt;br /&gt;
&lt;br /&gt;
# Enable NAT-PMP and PCP support (default is no)&lt;br /&gt;
enable_pcp_pmp=yes&lt;br /&gt;
&lt;br /&gt;
# Enable UPNP support (default is yes)&lt;br /&gt;
enable_upnp=yes&lt;br /&gt;
&lt;br /&gt;
# PCP&lt;br /&gt;
# Configure the minimum and maximum lifetime of a port mapping in seconds&lt;br /&gt;
# 120s and 86400s (24h) are suggested values from PCP-base&lt;br /&gt;
#min_lifetime=120&lt;br /&gt;
#max_lifetime=86400&lt;br /&gt;
# allow THIRD_PARTY Option for MAP and PEER Opcodes (default is no)&lt;br /&gt;
#pcp_allow_thirdparty=yes&lt;br /&gt;
&lt;br /&gt;
# table names for netfilter nft. Default is &amp;quot;filter&amp;quot; for both&lt;br /&gt;
#upnp_table_name=filter&lt;br /&gt;
#upnp_nat_table_name=filter&lt;br /&gt;
# chain names for netfilter and netfilter nft&lt;br /&gt;
# netfilter : default are MINIUPNPD, MINIUPNPD, MINIUPNPD-POSTROUTING&lt;br /&gt;
# netfilter nft : default are miniupnpd, prerouting_miniupnpd, postrouting_miniupnpd&lt;br /&gt;
#upnp_forward_chain=forward&lt;br /&gt;
#upnp_nat_chain=nat&lt;br /&gt;
#upnp_nat_postrouting_chain=postrouting&lt;br /&gt;
upnp_nftables_family_split=yes&lt;br /&gt;
&lt;br /&gt;
# Lease file location&lt;br /&gt;
#lease_file=/var/log/upnp.leases&lt;br /&gt;
&lt;br /&gt;
# To enable the next few runtime options, see compile time&lt;br /&gt;
# ENABLE_MANUFACTURER_INFO_CONFIGURATION (config.h)&lt;br /&gt;
&lt;br /&gt;
# Name of this service, default is &amp;quot;`uname -s` router&amp;quot;&lt;br /&gt;
#friendly_name=MiniUPnPd router&lt;br /&gt;
&lt;br /&gt;
# Manufacturer name, default is &amp;quot;`uname -s`&amp;quot;&lt;br /&gt;
#manufacturer_name=Manufacturer corp&lt;br /&gt;
&lt;br /&gt;
# Manufacturer URL, default is URL of OS vendor&lt;br /&gt;
#manufacturer_url=https://miniupnp.tuxfamily.org/&lt;br /&gt;
&lt;br /&gt;
# Model name, default is &amp;quot;`uname -s` router&amp;quot;&lt;br /&gt;
#model_name=Router Model&lt;br /&gt;
&lt;br /&gt;
# Model description, default is &amp;quot;`uname -s` router&amp;quot;&lt;br /&gt;
#model_description=Very Secure Router - Model&lt;br /&gt;
&lt;br /&gt;
# Model URL, default is URL of OS vendor&lt;br /&gt;
#model_url=https://miniupnp.tuxfamily.org/&lt;br /&gt;
&lt;br /&gt;
# Bitrates reported by daemon in bits per second&lt;br /&gt;
# by default miniupnpd tries to get WAN interface speed&lt;br /&gt;
#bitrate_up=1000000&lt;br /&gt;
#bitrate_down=10000000&lt;br /&gt;
&lt;br /&gt;
# Secure Mode, UPnP clients can only add mappings to their own IP&lt;br /&gt;
# Enabled by default&lt;br /&gt;
#secure_mode=no&lt;br /&gt;
&lt;br /&gt;
# Default presentation URL is HTTP address on port 80&lt;br /&gt;
# If set to an empty string, no presentationURL element will appear&lt;br /&gt;
# in the XML description of the device, which prevents MS Windows&lt;br /&gt;
# from displaying an icon in the &amp;quot;Network Connections&amp;quot; panel.&lt;br /&gt;
#presentation_url=http://www.mylan/index.php&lt;br /&gt;
&lt;br /&gt;
# Report system uptime instead of daemon uptime&lt;br /&gt;
system_uptime=yes&lt;br /&gt;
&lt;br /&gt;
# Notify interval in seconds. default is 900 seconds.&lt;br /&gt;
# As advised in the standard, announcement have a lifetime double of this value.&lt;br /&gt;
notify_interval=900&lt;br /&gt;
&lt;br /&gt;
# Unused rules cleaning.&lt;br /&gt;
# never remove any rule before this threshold for the number&lt;br /&gt;
# of redirections is exceeded. default to 20&lt;br /&gt;
#clean_ruleset_threshold=10&lt;br /&gt;
# Clean process work interval in seconds. default to 0 (disabled).&lt;br /&gt;
# a 600 seconds (10 minutes) interval makes sense&lt;br /&gt;
clean_ruleset_interval=600&lt;br /&gt;
&lt;br /&gt;
# Log packets in pf (default is no)&lt;br /&gt;
#packet_log=yes&lt;br /&gt;
&lt;br /&gt;
# Anchor name in pf (default is miniupnpd)&lt;br /&gt;
#anchor=miniupnpd&lt;br /&gt;
&lt;br /&gt;
# ALTQ queue in pf&lt;br /&gt;
# Filter rules must be used for this to be used.&lt;br /&gt;
# compile with PF_ENABLE_FILTER_RULES (see config.h file)&lt;br /&gt;
#queue=queue_name1&lt;br /&gt;
&lt;br /&gt;
# Tag name in pf&lt;br /&gt;
#tag=tag_name1&lt;br /&gt;
&lt;br /&gt;
# Make filter rules in pf quick or not. default is yes&lt;br /&gt;
# active when compiled with PF_ENABLE_FILTER_RULES (see config.h file)&lt;br /&gt;
#quickrules=no&lt;br /&gt;
&lt;br /&gt;
# UUID, generate your own UUID with &amp;quot;make genuuid&amp;quot;&lt;br /&gt;
uuid=00000000-0000-0000-0000-000000000000&lt;br /&gt;
&lt;br /&gt;
# Daemon&#039;s serial and model number when reporting to clients&lt;br /&gt;
# (in XML description)&lt;br /&gt;
#serial=12345678&lt;br /&gt;
#model_number=1&lt;br /&gt;
&lt;br /&gt;
# If compiled with IGD_V2 defined, force reporting IGDv1 in rootDesc (default&lt;br /&gt;
# is no)&lt;br /&gt;
#force_igd_desc_v1=no&lt;br /&gt;
&lt;br /&gt;
# UPnP permission rules (also enforced for NAT-PMP and PCP) for IPv4&lt;br /&gt;
# (allow|deny) (external port range) IP/mask (internal port range) (optional regex filter)&lt;br /&gt;
# A port range is &amp;lt;min port&amp;gt;-&amp;lt;max port&amp;gt; or &amp;lt;port&amp;gt; if there is only&lt;br /&gt;
# one port in the range.&lt;br /&gt;
# IP/mask format must be nnn.nnn.nnn.nnn/nn&lt;br /&gt;
# Regex support must be enabled at build time : ./configure --regex&lt;br /&gt;
# It is advised to only allow redirection of ports &amp;gt;= 1024&lt;br /&gt;
# and end the rule set with &amp;quot;deny 0-65535 0.0.0.0/0 0-65535&amp;quot;&lt;br /&gt;
# The following default ruleset allows specific LAN side IP addresses&lt;br /&gt;
# to request only ephemeral ports. It is recommended that users&lt;br /&gt;
# modify the IP ranges to match their own internal networks, and&lt;br /&gt;
# also consider implementing network-specific restrictions&lt;br /&gt;
# CAUTION: failure to enforce any rules may permit insecure requests to be made!&lt;br /&gt;
allow 1024-65535 192.168.1.0/24 1024-65535&lt;br /&gt;
# disallow requests whose description string matches the given regex&lt;br /&gt;
# deny 1024-65535 192.168.1.0/24 1024-65535 &amp;quot;My evil app ver [[:digit:]]*&amp;quot;&lt;br /&gt;
deny 0-65535 0.0.0.0/0 0-65535&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chris</name></author>
	</entry>
	<entry>
		<id>https://darkrealm-wiki.darkrealm.dyndns.org/index.php?title=Kerberos&amp;diff=4857</id>
		<title>Kerberos</title>
		<link rel="alternate" type="text/html" href="https://darkrealm-wiki.darkrealm.dyndns.org/index.php?title=Kerberos&amp;diff=4857"/>
		<updated>2025-09-27T00:48:20Z</updated>

		<summary type="html">&lt;p&gt;Chris: /* Tests */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= MIT-KRB HowTo =&lt;br /&gt;
&lt;br /&gt;
== KDC konfigurieren und KDC Datenbank erstellen ==&lt;br /&gt;
&lt;br /&gt;
# /var/lib/krb5kdc/kdc.conf erstellen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[kdcdefaults]&lt;br /&gt;
        kdc_ports = 89&lt;br /&gt;
        kdc_tcp_ports = 89&lt;br /&gt;
        kadmind_port = 750&lt;br /&gt;
        kpasswd_port = 466&lt;br /&gt;
&lt;br /&gt;
[realms]&lt;br /&gt;
        INTERN.NEOREALM.DYNDNS.ORG = {&lt;br /&gt;
                database_name = /var/lib/krb5kdc/principal&lt;br /&gt;
                acl_file = /var/lib/krb5kdc/kadm5.acl&lt;br /&gt;
                key_stash_file = /var/lib/krb5kdc/.k5.INTERN.NEOREALM.DYNDNS.ORG&lt;br /&gt;
                kadmind_port = 750&lt;br /&gt;
                kpasswd_port = 466&lt;br /&gt;
                max_life = 10h 0m 0s&lt;br /&gt;
                max_renewable_life = 7d 0h 0m 0s&lt;br /&gt;
                #default_principal_flags = +preauth                                                                                            &lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
[logging]&lt;br /&gt;
              kdc = CONSOLE&lt;br /&gt;
              kdc = SYSLOG:INFO:DAEMON&lt;br /&gt;
              kdc = FILE:/var/log/kdc.log&lt;br /&gt;
              admin_server = FILE:/var/log/kadmin.log&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Datenbank erstellen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kdb5_util create -r &amp;lt;REALMNAME&amp;gt; -s&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# kadmin Prinzipal erstellen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kadmin.local&lt;br /&gt;
addprinc admin/admin@INTERN.NEOREALM.DYNDNS.ORG&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
*/admin@INTERN.DARKREALM.DYNDNS.ORG	*&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== DNS einrichten ==&lt;br /&gt;
&lt;br /&gt;
Folgende RR&#039;s in die Zone eintragen&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
_kerberos.intern.darkrealm.dyndns.org		TXT	&amp;quot;INTERN.DARKREALM.DYNDNS.ORG&amp;quot;&lt;br /&gt;
_kerberos.intern.darkrealm.dyndns.org		SRV	1 0 89 shodan.intern.darkrealm.dyndns.org.&lt;br /&gt;
_kerberos-adm.intern.darkrealm.dyndns.org	SRV	1 0 777 shodan.intern.darkrealm.dyndns.org. (wird noch? nicht ausgewertet) &lt;br /&gt;
_kerberos.intern.darkrealm.dyndns.org		SRV	1 0 89 shodan.intern.darkrealm.dyndns.org.&lt;br /&gt;
_kpasswd.intern.darkrealm.dyndns.org		SRV	1 0 464 shodan.intern.darkrealm.dyndns.org.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Das reicht um Rechner ohne /etc/krb5.conf auf den default realm hinzuweisen. Weil _kerberos-adm zurzeit noch nicht ausgewertet wird muss man folgendes in der /etc/krb5.conf eintragen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[realms]&lt;br /&gt;
	INTERN.DARKREALM.DYNDNS.ORG = {&lt;br /&gt;
		admin_server = shodan.intern.darkrealm.dyndns.org:777&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2. NFS mit sec=krb5p ==&lt;br /&gt;
&lt;br /&gt;
Mount : mount shodan:/home /home -o sec=krb5p&lt;br /&gt;
&lt;br /&gt;
Server:&lt;br /&gt;
rpc.svcgssd braucht keytab /etc/krb5.keytab&lt;br /&gt;
&lt;br /&gt;
rpc.svcgssd braucht explizit nfs/&amp;lt;fqdn&amp;gt; principal (erstmal egal welcher FQDN, aber der client kann nicht connecten wenn fqdn vom server nicht drinsteht)&lt;br /&gt;
&lt;br /&gt;
Also in die keytab:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nfs/shodan.intern.darkrealm.dyndns.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Client:&lt;br /&gt;
Client sucht laut man rpc.gssd folgende Einträge in der keytab: (scheinbar geht es hier nur um machine credentials, egal wie der principal heisst)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
          &amp;lt;HOSTNAME&amp;gt;$@&amp;lt;REALM&amp;gt;&lt;br /&gt;
          root/&amp;lt;hostname&amp;gt;@&amp;lt;REALM&amp;gt;&lt;br /&gt;
          nfs/&amp;lt;hostname&amp;gt;@&amp;lt;REALM&amp;gt;&lt;br /&gt;
          host/&amp;lt;hostname&amp;gt;@&amp;lt;REALM&amp;gt;&lt;br /&gt;
          root/&amp;lt;anyname&amp;gt;@&amp;lt;REALM&amp;gt;&lt;br /&gt;
          nfs/&amp;lt;anyname&amp;gt;@&amp;lt;REALM&amp;gt;&lt;br /&gt;
          host/&amp;lt;anyname&amp;gt;@&amp;lt;REALM&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Also in die keytab:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
host/rasmatazz.intern.darkrealm.dyndns.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
KVNO&#039;s müssen auf jedem Rechner gleich sein !&lt;br /&gt;
&lt;br /&gt;
Keytab auf dem Server :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
slot KVNO Principal&lt;br /&gt;
---- ---- ---------------------------------------------------------------------&lt;br /&gt;
   1    2 nfs/shodan.intern.darkrealm.dyndns.org@INTERN.DARKREALM.DYNDNS.ORG&lt;br /&gt;
   2    2 nfs/shodan.intern.darkrealm.dyndns.org@INTERN.DARKREALM.DYNDNS.ORG&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Keytab auf dem Client :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
slot KVNO Principal&lt;br /&gt;
---- ---- ---------------------------------------------------------------------&lt;br /&gt;
   1    2 host/rasmatazz.intern.darkrealm.dyndns.org@INTERN.DARKREALM.DYNDNS.ORG&lt;br /&gt;
   2    2 host/rasmatazz.intern.darkrealm.dyndns.org@INTERN.DARKREALM.DYNDNS.ORG&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 3. SSH mit kerberos (-K) ==&lt;br /&gt;
&lt;br /&gt;
In der Server-Keytab reicht :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
host/shodan.intern.darkrealm.dyndns.org@INTERN.DARKREALM.DYNDNS.ORG&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aber in der /etc/krb5.conf auf dem Server muss stehen :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;libdefaults&amp;gt;&lt;br /&gt;
ignore_acceptor_hostname = true&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
ansonsten meldet der SSH-Server daß kein keytab-entry für host/shodan@ vorhanden ist.&lt;br /&gt;
&lt;br /&gt;
== 4. samba mit kerberos ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kinit chris@HERRMANN.AD&lt;br /&gt;
sudo mount //shodan.intern.darkrealm.dyndns.org/temporary /mnt/tmp -o vers=3.02,sec=krb5i,cruid=chris,user=chris,cifsacl&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Crossrealm AD &amp;lt;-&amp;gt; MIT-KRB5 ==&lt;br /&gt;
&lt;br /&gt;
Funktioniert momentan nur mit einem Windows Server als Domain Controller!&lt;br /&gt;
&lt;br /&gt;
=== Auf dem MIT-KRB5 KDC ===&lt;br /&gt;
&lt;br /&gt;
* Mit kadmin 2 Principals hinzufügen (bei beiden gleiches Passwort setzen):&lt;br /&gt;
** addprinc krbtgt/INTERN.DARKREALM.DYNDNS.ORG@TESTDOMAIN.AD&lt;br /&gt;
** krbtgt/TESTDOMAIN.AD@INTERN.DARKREALM.DYNDNS.ORG&lt;br /&gt;
&lt;br /&gt;
=== Auf dem Windows-Domaincontroller ===&lt;br /&gt;
&lt;br /&gt;
* Active Directory-Domänen und -Vertrauensstellungen öffnen&lt;br /&gt;
* Neue Vertrauensstellung&lt;br /&gt;
* Name: INTERN.DARKREALM.DYNDNS.ORG&lt;br /&gt;
* Vertrauenstyp: Bereichsvertrauensstellung&lt;br /&gt;
* Nicht transitiv oder Transitiv, ist egal&lt;br /&gt;
* Bidirektional&lt;br /&gt;
* Vertrauensstellungskennwort eingeben (gleiches wie auf der MIT-KRB5 Seite)&lt;br /&gt;
&lt;br /&gt;
* Zuständigen KDC für INTERN.DARKREALM.DYNDNS.ORG festlegen:&lt;br /&gt;
** ksetup /addkdc INTERN.DARKREALM.DYNDNS.ORG shodan.intern.darkrealm.dyndns.org&lt;br /&gt;
* Rechnernamen zu dem Realm zuordnen:&lt;br /&gt;
** ksetup /addhosttorealmmap shodan.intern.darkrealm.dyndns.org INTERN.DARKREALM.DYNDNS.ORG&lt;br /&gt;
&lt;br /&gt;
=== Tests ===&lt;br /&gt;
&lt;br /&gt;
* Ticket aus dem INTERN.DARKREALM.DYNDNS.ORG-Realm heraus vom TESTDOMAIN.AD-Realm holen&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kinit chris@INTERN.DARKREALM.DYNDNS.ORG&lt;br /&gt;
kvno HTTP/testdomain.ad@TESTDOMAIN.AD&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Fehler ====&lt;br /&gt;
&lt;br /&gt;
Bekommt man einen Fehler &amp;quot;kvno: Generic error (see e-text) while getting credentials for HTTP/vm-winserver2025.testdomain.ad@TESTDOMAIN.AD&amp;quot; o.ä., dann entweder:&lt;br /&gt;
&lt;br /&gt;
* modprinc +no_auth_data_required krbtgt/TESTDOMAIN.AD@INTERN.DARKREALM.DYNDNS.ORG&lt;br /&gt;
&lt;br /&gt;
oder in /var/lib/krb5kdc/kdc.conf im [realms]-Abschnitt für den INTERN.DARKREALM.DYNDNS.ORG-Realms folgende Zeile einfügen:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;disable_pac = true&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Quelle: https://bugzilla.redhat.com/show_bug.cgi?id=2016312&lt;br /&gt;
&lt;br /&gt;
=== Beispiel-LDIF eines Trusts ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dn: CN=INTERN.DARKREALM.DYNDNS.ORG,CN=System,DC=testdomain,DC=ad&lt;br /&gt;
objectClass: top&lt;br /&gt;
objectClass: leaf&lt;br /&gt;
objectClass: trustedDomain&lt;br /&gt;
cn: INTERN.DARKREALM.DYNDNS.ORG&lt;br /&gt;
distinguishedName: CN=INTERN.DARKREALM.DYNDNS.ORG,CN=System,DC=testdomain,DC=a&lt;br /&gt;
 d&lt;br /&gt;
instanceType: 4&lt;br /&gt;
whenCreated: 20250926000103.0Z&lt;br /&gt;
whenChanged: 20250926000103.0Z&lt;br /&gt;
uSNCreated: 16453&lt;br /&gt;
uSNChanged: 16454&lt;br /&gt;
showInAdvancedViewOnly: TRUE&lt;br /&gt;
name: INTERN.DARKREALM.DYNDNS.ORG&lt;br /&gt;
objectGUID:: ojk5Xjs+Z0ieoCAx6wEjsA==&lt;br /&gt;
trustDirection: 3&lt;br /&gt;
trustPartner: INTERN.DARKREALM.DYNDNS.ORG&lt;br /&gt;
trustPosixOffset: 0&lt;br /&gt;
trustType: 3&lt;br /&gt;
trustAttributes: 0&lt;br /&gt;
flatName: INTERN.DARKREALM.DYNDNS.ORG&lt;br /&gt;
objectCategory: CN=Trusted-Domain,CN=Schema,CN=Configuration,DC=testdomain,DC=&lt;br /&gt;
 ad&lt;br /&gt;
isCriticalSystemObject: TRUE&lt;br /&gt;
dSCorePropagationData: 16010101000000.0Z&lt;br /&gt;
trustAuthIncoming:&lt;br /&gt;
trustAuthOutgoing:&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dn: CN=INTERN.DARKREALM.DYNDNS.ORG$,CN=Users,DC=testdomain,DC=ad&lt;br /&gt;
objectClass: top&lt;br /&gt;
objectClass: person&lt;br /&gt;
objectClass: organizationalPerson&lt;br /&gt;
objectClass: user&lt;br /&gt;
cn: INTERN.DARKREALM.DYNDNS.ORG$&lt;br /&gt;
distinguishedName: CN=INTERN.DARKREALM.DYNDNS.ORG$,CN=Users,DC=testdomain,DC=a&lt;br /&gt;
 d&lt;br /&gt;
instanceType: 4&lt;br /&gt;
whenCreated: 20250926005246.0Z&lt;br /&gt;
whenChanged: 20250926005247.0Z&lt;br /&gt;
uSNCreated: 24597&lt;br /&gt;
uSNChanged: 24599&lt;br /&gt;
name: INTERN.DARKREALM.DYNDNS.ORG$&lt;br /&gt;
objectGUID:: HPPriJ7qRU+1bDWJWV9Yvw==&lt;br /&gt;
userAccountControl: 2082&lt;br /&gt;
badPwdCount: 0&lt;br /&gt;
codePage: 0&lt;br /&gt;
countryCode: 0&lt;br /&gt;
badPasswordTime: 0&lt;br /&gt;
lastLogoff: 0&lt;br /&gt;
lastLogon: 0&lt;br /&gt;
pwdLastSet: 0&lt;br /&gt;
primaryGroupID: 529&lt;br /&gt;
objectSid:: AQUAAAAAAAUVAAAAjZWqvXpflmUzfrM8UgQAAA==&lt;br /&gt;
accountExpires: 9223372036854775807&lt;br /&gt;
logonCount: 0&lt;br /&gt;
sAMAccountName: INTERN.DARKREALM.DYNDNS.ORG$&lt;br /&gt;
sAMAccountType: 805306370&lt;br /&gt;
objectCategory: CN=Person,CN=Schema,CN=Configuration,DC=testdomain,DC=ad&lt;br /&gt;
isCriticalSystemObject: TRUE&lt;br /&gt;
dSCorePropagationData: 16010101000000.0Z&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Squid Crossrealm ==&lt;br /&gt;
&lt;br /&gt;
Kein Plan wie und warum es funktioniert. Ist auch noch nicht wirklich crossrealm.&lt;br /&gt;
&lt;br /&gt;
In /etc/squid/squid.conf folgende Zeile einfügen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
auth_param negotiate program /usr/libexec/squid/negotiate_kerberos_auth -k /etc/squid.smb.keytab -i&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
msktutil -c -s HTTP/shodan.intern.darkrealm.dyndns.org -h shodan.intern.darkrealm.dyndns.org -k squid.smb.keytab --computer-name squid-http --upn HTTP/shodan.intern.darkrealm.dyndns.org --verbose --realm AD.INTERN.DARKREALM.DYNDNS.ORG --no-reverse-lookups --use-service-account&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann erstellte Keytab nach /etc/squid.smb.keytab kopieren und squid neustarten.&lt;/div&gt;</summary>
		<author><name>Chris</name></author>
	</entry>
	<entry>
		<id>https://darkrealm-wiki.darkrealm.dyndns.org/index.php?title=Kerberos&amp;diff=4856</id>
		<title>Kerberos</title>
		<link rel="alternate" type="text/html" href="https://darkrealm-wiki.darkrealm.dyndns.org/index.php?title=Kerberos&amp;diff=4856"/>
		<updated>2025-09-27T00:45:17Z</updated>

		<summary type="html">&lt;p&gt;Chris: /* Auf dem Windows-Domaincontroller */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= MIT-KRB HowTo =&lt;br /&gt;
&lt;br /&gt;
== KDC konfigurieren und KDC Datenbank erstellen ==&lt;br /&gt;
&lt;br /&gt;
# /var/lib/krb5kdc/kdc.conf erstellen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[kdcdefaults]&lt;br /&gt;
        kdc_ports = 89&lt;br /&gt;
        kdc_tcp_ports = 89&lt;br /&gt;
        kadmind_port = 750&lt;br /&gt;
        kpasswd_port = 466&lt;br /&gt;
&lt;br /&gt;
[realms]&lt;br /&gt;
        INTERN.NEOREALM.DYNDNS.ORG = {&lt;br /&gt;
                database_name = /var/lib/krb5kdc/principal&lt;br /&gt;
                acl_file = /var/lib/krb5kdc/kadm5.acl&lt;br /&gt;
                key_stash_file = /var/lib/krb5kdc/.k5.INTERN.NEOREALM.DYNDNS.ORG&lt;br /&gt;
                kadmind_port = 750&lt;br /&gt;
                kpasswd_port = 466&lt;br /&gt;
                max_life = 10h 0m 0s&lt;br /&gt;
                max_renewable_life = 7d 0h 0m 0s&lt;br /&gt;
                #default_principal_flags = +preauth                                                                                            &lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
[logging]&lt;br /&gt;
              kdc = CONSOLE&lt;br /&gt;
              kdc = SYSLOG:INFO:DAEMON&lt;br /&gt;
              kdc = FILE:/var/log/kdc.log&lt;br /&gt;
              admin_server = FILE:/var/log/kadmin.log&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Datenbank erstellen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kdb5_util create -r &amp;lt;REALMNAME&amp;gt; -s&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# kadmin Prinzipal erstellen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kadmin.local&lt;br /&gt;
addprinc admin/admin@INTERN.NEOREALM.DYNDNS.ORG&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
*/admin@INTERN.DARKREALM.DYNDNS.ORG	*&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== DNS einrichten ==&lt;br /&gt;
&lt;br /&gt;
Folgende RR&#039;s in die Zone eintragen&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
_kerberos.intern.darkrealm.dyndns.org		TXT	&amp;quot;INTERN.DARKREALM.DYNDNS.ORG&amp;quot;&lt;br /&gt;
_kerberos.intern.darkrealm.dyndns.org		SRV	1 0 89 shodan.intern.darkrealm.dyndns.org.&lt;br /&gt;
_kerberos-adm.intern.darkrealm.dyndns.org	SRV	1 0 777 shodan.intern.darkrealm.dyndns.org. (wird noch? nicht ausgewertet) &lt;br /&gt;
_kerberos.intern.darkrealm.dyndns.org		SRV	1 0 89 shodan.intern.darkrealm.dyndns.org.&lt;br /&gt;
_kpasswd.intern.darkrealm.dyndns.org		SRV	1 0 464 shodan.intern.darkrealm.dyndns.org.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Das reicht um Rechner ohne /etc/krb5.conf auf den default realm hinzuweisen. Weil _kerberos-adm zurzeit noch nicht ausgewertet wird muss man folgendes in der /etc/krb5.conf eintragen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[realms]&lt;br /&gt;
	INTERN.DARKREALM.DYNDNS.ORG = {&lt;br /&gt;
		admin_server = shodan.intern.darkrealm.dyndns.org:777&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2. NFS mit sec=krb5p ==&lt;br /&gt;
&lt;br /&gt;
Mount : mount shodan:/home /home -o sec=krb5p&lt;br /&gt;
&lt;br /&gt;
Server:&lt;br /&gt;
rpc.svcgssd braucht keytab /etc/krb5.keytab&lt;br /&gt;
&lt;br /&gt;
rpc.svcgssd braucht explizit nfs/&amp;lt;fqdn&amp;gt; principal (erstmal egal welcher FQDN, aber der client kann nicht connecten wenn fqdn vom server nicht drinsteht)&lt;br /&gt;
&lt;br /&gt;
Also in die keytab:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nfs/shodan.intern.darkrealm.dyndns.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Client:&lt;br /&gt;
Client sucht laut man rpc.gssd folgende Einträge in der keytab: (scheinbar geht es hier nur um machine credentials, egal wie der principal heisst)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
          &amp;lt;HOSTNAME&amp;gt;$@&amp;lt;REALM&amp;gt;&lt;br /&gt;
          root/&amp;lt;hostname&amp;gt;@&amp;lt;REALM&amp;gt;&lt;br /&gt;
          nfs/&amp;lt;hostname&amp;gt;@&amp;lt;REALM&amp;gt;&lt;br /&gt;
          host/&amp;lt;hostname&amp;gt;@&amp;lt;REALM&amp;gt;&lt;br /&gt;
          root/&amp;lt;anyname&amp;gt;@&amp;lt;REALM&amp;gt;&lt;br /&gt;
          nfs/&amp;lt;anyname&amp;gt;@&amp;lt;REALM&amp;gt;&lt;br /&gt;
          host/&amp;lt;anyname&amp;gt;@&amp;lt;REALM&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Also in die keytab:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
host/rasmatazz.intern.darkrealm.dyndns.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
KVNO&#039;s müssen auf jedem Rechner gleich sein !&lt;br /&gt;
&lt;br /&gt;
Keytab auf dem Server :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
slot KVNO Principal&lt;br /&gt;
---- ---- ---------------------------------------------------------------------&lt;br /&gt;
   1    2 nfs/shodan.intern.darkrealm.dyndns.org@INTERN.DARKREALM.DYNDNS.ORG&lt;br /&gt;
   2    2 nfs/shodan.intern.darkrealm.dyndns.org@INTERN.DARKREALM.DYNDNS.ORG&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Keytab auf dem Client :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
slot KVNO Principal&lt;br /&gt;
---- ---- ---------------------------------------------------------------------&lt;br /&gt;
   1    2 host/rasmatazz.intern.darkrealm.dyndns.org@INTERN.DARKREALM.DYNDNS.ORG&lt;br /&gt;
   2    2 host/rasmatazz.intern.darkrealm.dyndns.org@INTERN.DARKREALM.DYNDNS.ORG&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 3. SSH mit kerberos (-K) ==&lt;br /&gt;
&lt;br /&gt;
In der Server-Keytab reicht :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
host/shodan.intern.darkrealm.dyndns.org@INTERN.DARKREALM.DYNDNS.ORG&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aber in der /etc/krb5.conf auf dem Server muss stehen :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;libdefaults&amp;gt;&lt;br /&gt;
ignore_acceptor_hostname = true&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
ansonsten meldet der SSH-Server daß kein keytab-entry für host/shodan@ vorhanden ist.&lt;br /&gt;
&lt;br /&gt;
== 4. samba mit kerberos ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kinit chris@HERRMANN.AD&lt;br /&gt;
sudo mount //shodan.intern.darkrealm.dyndns.org/temporary /mnt/tmp -o vers=3.02,sec=krb5i,cruid=chris,user=chris,cifsacl&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Crossrealm AD &amp;lt;-&amp;gt; MIT-KRB5 ==&lt;br /&gt;
&lt;br /&gt;
Funktioniert momentan nur mit einem Windows Server als Domain Controller!&lt;br /&gt;
&lt;br /&gt;
=== Auf dem MIT-KRB5 KDC ===&lt;br /&gt;
&lt;br /&gt;
* Mit kadmin 2 Principals hinzufügen (bei beiden gleiches Passwort setzen):&lt;br /&gt;
** addprinc krbtgt/INTERN.DARKREALM.DYNDNS.ORG@TESTDOMAIN.AD&lt;br /&gt;
** krbtgt/TESTDOMAIN.AD@INTERN.DARKREALM.DYNDNS.ORG&lt;br /&gt;
&lt;br /&gt;
=== Auf dem Windows-Domaincontroller ===&lt;br /&gt;
&lt;br /&gt;
* Active Directory-Domänen und -Vertrauensstellungen öffnen&lt;br /&gt;
* Neue Vertrauensstellung&lt;br /&gt;
* Name: INTERN.DARKREALM.DYNDNS.ORG&lt;br /&gt;
* Vertrauenstyp: Bereichsvertrauensstellung&lt;br /&gt;
* Nicht transitiv oder Transitiv, ist egal&lt;br /&gt;
* Bidirektional&lt;br /&gt;
* Vertrauensstellungskennwort eingeben (gleiches wie auf der MIT-KRB5 Seite)&lt;br /&gt;
&lt;br /&gt;
* Zuständigen KDC für INTERN.DARKREALM.DYNDNS.ORG festlegen:&lt;br /&gt;
** ksetup /addkdc INTERN.DARKREALM.DYNDNS.ORG shodan.intern.darkrealm.dyndns.org&lt;br /&gt;
* Rechnernamen zu dem Realm zuordnen:&lt;br /&gt;
** ksetup /addhosttorealmmap shodan.intern.darkrealm.dyndns.org INTERN.DARKREALM.DYNDNS.ORG&lt;br /&gt;
&lt;br /&gt;
=== Tests ===&lt;br /&gt;
&lt;br /&gt;
* Ticket aus dem INTERN.DARKREALM.DYNDNS.ORG-Realm heraus vom TESTDOMAIN.AD-Realm holen&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kinit chris@INTERN.DARKREALM.DYNDNS.ORG&lt;br /&gt;
kvno HTTP/testdomain.ad@TESTDOMAIN.AD&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Beispiel-LDIF eines Trusts ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dn: CN=INTERN.DARKREALM.DYNDNS.ORG,CN=System,DC=testdomain,DC=ad&lt;br /&gt;
objectClass: top&lt;br /&gt;
objectClass: leaf&lt;br /&gt;
objectClass: trustedDomain&lt;br /&gt;
cn: INTERN.DARKREALM.DYNDNS.ORG&lt;br /&gt;
distinguishedName: CN=INTERN.DARKREALM.DYNDNS.ORG,CN=System,DC=testdomain,DC=a&lt;br /&gt;
 d&lt;br /&gt;
instanceType: 4&lt;br /&gt;
whenCreated: 20250926000103.0Z&lt;br /&gt;
whenChanged: 20250926000103.0Z&lt;br /&gt;
uSNCreated: 16453&lt;br /&gt;
uSNChanged: 16454&lt;br /&gt;
showInAdvancedViewOnly: TRUE&lt;br /&gt;
name: INTERN.DARKREALM.DYNDNS.ORG&lt;br /&gt;
objectGUID:: ojk5Xjs+Z0ieoCAx6wEjsA==&lt;br /&gt;
trustDirection: 3&lt;br /&gt;
trustPartner: INTERN.DARKREALM.DYNDNS.ORG&lt;br /&gt;
trustPosixOffset: 0&lt;br /&gt;
trustType: 3&lt;br /&gt;
trustAttributes: 0&lt;br /&gt;
flatName: INTERN.DARKREALM.DYNDNS.ORG&lt;br /&gt;
objectCategory: CN=Trusted-Domain,CN=Schema,CN=Configuration,DC=testdomain,DC=&lt;br /&gt;
 ad&lt;br /&gt;
isCriticalSystemObject: TRUE&lt;br /&gt;
dSCorePropagationData: 16010101000000.0Z&lt;br /&gt;
trustAuthIncoming:&lt;br /&gt;
trustAuthOutgoing:&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dn: CN=INTERN.DARKREALM.DYNDNS.ORG$,CN=Users,DC=testdomain,DC=ad&lt;br /&gt;
objectClass: top&lt;br /&gt;
objectClass: person&lt;br /&gt;
objectClass: organizationalPerson&lt;br /&gt;
objectClass: user&lt;br /&gt;
cn: INTERN.DARKREALM.DYNDNS.ORG$&lt;br /&gt;
distinguishedName: CN=INTERN.DARKREALM.DYNDNS.ORG$,CN=Users,DC=testdomain,DC=a&lt;br /&gt;
 d&lt;br /&gt;
instanceType: 4&lt;br /&gt;
whenCreated: 20250926005246.0Z&lt;br /&gt;
whenChanged: 20250926005247.0Z&lt;br /&gt;
uSNCreated: 24597&lt;br /&gt;
uSNChanged: 24599&lt;br /&gt;
name: INTERN.DARKREALM.DYNDNS.ORG$&lt;br /&gt;
objectGUID:: HPPriJ7qRU+1bDWJWV9Yvw==&lt;br /&gt;
userAccountControl: 2082&lt;br /&gt;
badPwdCount: 0&lt;br /&gt;
codePage: 0&lt;br /&gt;
countryCode: 0&lt;br /&gt;
badPasswordTime: 0&lt;br /&gt;
lastLogoff: 0&lt;br /&gt;
lastLogon: 0&lt;br /&gt;
pwdLastSet: 0&lt;br /&gt;
primaryGroupID: 529&lt;br /&gt;
objectSid:: AQUAAAAAAAUVAAAAjZWqvXpflmUzfrM8UgQAAA==&lt;br /&gt;
accountExpires: 9223372036854775807&lt;br /&gt;
logonCount: 0&lt;br /&gt;
sAMAccountName: INTERN.DARKREALM.DYNDNS.ORG$&lt;br /&gt;
sAMAccountType: 805306370&lt;br /&gt;
objectCategory: CN=Person,CN=Schema,CN=Configuration,DC=testdomain,DC=ad&lt;br /&gt;
isCriticalSystemObject: TRUE&lt;br /&gt;
dSCorePropagationData: 16010101000000.0Z&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Squid Crossrealm ==&lt;br /&gt;
&lt;br /&gt;
Kein Plan wie und warum es funktioniert. Ist auch noch nicht wirklich crossrealm.&lt;br /&gt;
&lt;br /&gt;
In /etc/squid/squid.conf folgende Zeile einfügen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
auth_param negotiate program /usr/libexec/squid/negotiate_kerberos_auth -k /etc/squid.smb.keytab -i&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
msktutil -c -s HTTP/shodan.intern.darkrealm.dyndns.org -h shodan.intern.darkrealm.dyndns.org -k squid.smb.keytab --computer-name squid-http --upn HTTP/shodan.intern.darkrealm.dyndns.org --verbose --realm AD.INTERN.DARKREALM.DYNDNS.ORG --no-reverse-lookups --use-service-account&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann erstellte Keytab nach /etc/squid.smb.keytab kopieren und squid neustarten.&lt;/div&gt;</summary>
		<author><name>Chris</name></author>
	</entry>
	<entry>
		<id>https://darkrealm-wiki.darkrealm.dyndns.org/index.php?title=Kerberos&amp;diff=4855</id>
		<title>Kerberos</title>
		<link rel="alternate" type="text/html" href="https://darkrealm-wiki.darkrealm.dyndns.org/index.php?title=Kerberos&amp;diff=4855"/>
		<updated>2025-09-26T23:29:46Z</updated>

		<summary type="html">&lt;p&gt;Chris: /* Crossrealm AD  MIT-KRB5 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= MIT-KRB HowTo =&lt;br /&gt;
&lt;br /&gt;
== KDC konfigurieren und KDC Datenbank erstellen ==&lt;br /&gt;
&lt;br /&gt;
# /var/lib/krb5kdc/kdc.conf erstellen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[kdcdefaults]&lt;br /&gt;
        kdc_ports = 89&lt;br /&gt;
        kdc_tcp_ports = 89&lt;br /&gt;
        kadmind_port = 750&lt;br /&gt;
        kpasswd_port = 466&lt;br /&gt;
&lt;br /&gt;
[realms]&lt;br /&gt;
        INTERN.NEOREALM.DYNDNS.ORG = {&lt;br /&gt;
                database_name = /var/lib/krb5kdc/principal&lt;br /&gt;
                acl_file = /var/lib/krb5kdc/kadm5.acl&lt;br /&gt;
                key_stash_file = /var/lib/krb5kdc/.k5.INTERN.NEOREALM.DYNDNS.ORG&lt;br /&gt;
                kadmind_port = 750&lt;br /&gt;
                kpasswd_port = 466&lt;br /&gt;
                max_life = 10h 0m 0s&lt;br /&gt;
                max_renewable_life = 7d 0h 0m 0s&lt;br /&gt;
                #default_principal_flags = +preauth                                                                                            &lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
[logging]&lt;br /&gt;
              kdc = CONSOLE&lt;br /&gt;
              kdc = SYSLOG:INFO:DAEMON&lt;br /&gt;
              kdc = FILE:/var/log/kdc.log&lt;br /&gt;
              admin_server = FILE:/var/log/kadmin.log&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Datenbank erstellen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kdb5_util create -r &amp;lt;REALMNAME&amp;gt; -s&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# kadmin Prinzipal erstellen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kadmin.local&lt;br /&gt;
addprinc admin/admin@INTERN.NEOREALM.DYNDNS.ORG&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
*/admin@INTERN.DARKREALM.DYNDNS.ORG	*&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== DNS einrichten ==&lt;br /&gt;
&lt;br /&gt;
Folgende RR&#039;s in die Zone eintragen&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
_kerberos.intern.darkrealm.dyndns.org		TXT	&amp;quot;INTERN.DARKREALM.DYNDNS.ORG&amp;quot;&lt;br /&gt;
_kerberos.intern.darkrealm.dyndns.org		SRV	1 0 89 shodan.intern.darkrealm.dyndns.org.&lt;br /&gt;
_kerberos-adm.intern.darkrealm.dyndns.org	SRV	1 0 777 shodan.intern.darkrealm.dyndns.org. (wird noch? nicht ausgewertet) &lt;br /&gt;
_kerberos.intern.darkrealm.dyndns.org		SRV	1 0 89 shodan.intern.darkrealm.dyndns.org.&lt;br /&gt;
_kpasswd.intern.darkrealm.dyndns.org		SRV	1 0 464 shodan.intern.darkrealm.dyndns.org.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Das reicht um Rechner ohne /etc/krb5.conf auf den default realm hinzuweisen. Weil _kerberos-adm zurzeit noch nicht ausgewertet wird muss man folgendes in der /etc/krb5.conf eintragen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[realms]&lt;br /&gt;
	INTERN.DARKREALM.DYNDNS.ORG = {&lt;br /&gt;
		admin_server = shodan.intern.darkrealm.dyndns.org:777&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2. NFS mit sec=krb5p ==&lt;br /&gt;
&lt;br /&gt;
Mount : mount shodan:/home /home -o sec=krb5p&lt;br /&gt;
&lt;br /&gt;
Server:&lt;br /&gt;
rpc.svcgssd braucht keytab /etc/krb5.keytab&lt;br /&gt;
&lt;br /&gt;
rpc.svcgssd braucht explizit nfs/&amp;lt;fqdn&amp;gt; principal (erstmal egal welcher FQDN, aber der client kann nicht connecten wenn fqdn vom server nicht drinsteht)&lt;br /&gt;
&lt;br /&gt;
Also in die keytab:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nfs/shodan.intern.darkrealm.dyndns.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Client:&lt;br /&gt;
Client sucht laut man rpc.gssd folgende Einträge in der keytab: (scheinbar geht es hier nur um machine credentials, egal wie der principal heisst)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
          &amp;lt;HOSTNAME&amp;gt;$@&amp;lt;REALM&amp;gt;&lt;br /&gt;
          root/&amp;lt;hostname&amp;gt;@&amp;lt;REALM&amp;gt;&lt;br /&gt;
          nfs/&amp;lt;hostname&amp;gt;@&amp;lt;REALM&amp;gt;&lt;br /&gt;
          host/&amp;lt;hostname&amp;gt;@&amp;lt;REALM&amp;gt;&lt;br /&gt;
          root/&amp;lt;anyname&amp;gt;@&amp;lt;REALM&amp;gt;&lt;br /&gt;
          nfs/&amp;lt;anyname&amp;gt;@&amp;lt;REALM&amp;gt;&lt;br /&gt;
          host/&amp;lt;anyname&amp;gt;@&amp;lt;REALM&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Also in die keytab:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
host/rasmatazz.intern.darkrealm.dyndns.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
KVNO&#039;s müssen auf jedem Rechner gleich sein !&lt;br /&gt;
&lt;br /&gt;
Keytab auf dem Server :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
slot KVNO Principal&lt;br /&gt;
---- ---- ---------------------------------------------------------------------&lt;br /&gt;
   1    2 nfs/shodan.intern.darkrealm.dyndns.org@INTERN.DARKREALM.DYNDNS.ORG&lt;br /&gt;
   2    2 nfs/shodan.intern.darkrealm.dyndns.org@INTERN.DARKREALM.DYNDNS.ORG&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Keytab auf dem Client :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
slot KVNO Principal&lt;br /&gt;
---- ---- ---------------------------------------------------------------------&lt;br /&gt;
   1    2 host/rasmatazz.intern.darkrealm.dyndns.org@INTERN.DARKREALM.DYNDNS.ORG&lt;br /&gt;
   2    2 host/rasmatazz.intern.darkrealm.dyndns.org@INTERN.DARKREALM.DYNDNS.ORG&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 3. SSH mit kerberos (-K) ==&lt;br /&gt;
&lt;br /&gt;
In der Server-Keytab reicht :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
host/shodan.intern.darkrealm.dyndns.org@INTERN.DARKREALM.DYNDNS.ORG&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aber in der /etc/krb5.conf auf dem Server muss stehen :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;libdefaults&amp;gt;&lt;br /&gt;
ignore_acceptor_hostname = true&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
ansonsten meldet der SSH-Server daß kein keytab-entry für host/shodan@ vorhanden ist.&lt;br /&gt;
&lt;br /&gt;
== 4. samba mit kerberos ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kinit chris@HERRMANN.AD&lt;br /&gt;
sudo mount //shodan.intern.darkrealm.dyndns.org/temporary /mnt/tmp -o vers=3.02,sec=krb5i,cruid=chris,user=chris,cifsacl&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Crossrealm AD &amp;lt;-&amp;gt; MIT-KRB5 ==&lt;br /&gt;
&lt;br /&gt;
Funktioniert momentan nur mit einem Windows Server als Domain Controller!&lt;br /&gt;
&lt;br /&gt;
=== Auf dem MIT-KRB5 KDC ===&lt;br /&gt;
&lt;br /&gt;
* Mit kadmin 2 Principals hinzufügen (bei beiden gleiches Passwort setzen):&lt;br /&gt;
** addprinc krbtgt/INTERN.DARKREALM.DYNDNS.ORG@TESTDOMAIN.AD&lt;br /&gt;
** krbtgt/TESTDOMAIN.AD@INTERN.DARKREALM.DYNDNS.ORG&lt;br /&gt;
&lt;br /&gt;
=== Auf dem Windows-Domaincontroller ===&lt;br /&gt;
&lt;br /&gt;
* Active Directory-Domänen und -Vertrauensstellungen öffnen&lt;br /&gt;
* Neue Vertrauensstellung&lt;br /&gt;
* Name: INTERN.DARKREALM.DYNDNS.ORG&lt;br /&gt;
* Vertrauenstyp: Bereichsvertrauensstellung&lt;br /&gt;
* Nicht transitiv oder Transitiv, ist egal&lt;br /&gt;
* Bidirektional&lt;br /&gt;
* Vertrauensstellungskennwort eingeben (gleiches wie auf der MIT-KRB5 Seite)&lt;br /&gt;
&lt;br /&gt;
* Zuständigen KDC für INTERN.DARKREALM.DYNDNS.ORG festlegen:&lt;br /&gt;
** ksetup /addkdc INTERN.DARKREALM.DYNDNS.ORG shodan.intern.darkrealm.dyndns.org&lt;br /&gt;
* Rechnernamen zu dem Realm zuordnen:&lt;br /&gt;
** ksetup /addhosttorealmmap shodan.intern.darkrealm.dyndns.org INTERN.DARKREALM.DYNDNS.ORG&lt;br /&gt;
&lt;br /&gt;
Achtung: &lt;br /&gt;
&lt;br /&gt;
=== Tests ===&lt;br /&gt;
&lt;br /&gt;
* Ticket aus dem INTERN.DARKREALM.DYNDNS.ORG-Realm heraus vom TESTDOMAIN.AD-Realm holen&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kinit chris@INTERN.DARKREALM.DYNDNS.ORG&lt;br /&gt;
kvno HTTP/testdomain.ad@TESTDOMAIN.AD&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Beispiel-LDIF eines Trusts ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dn: CN=INTERN.DARKREALM.DYNDNS.ORG,CN=System,DC=testdomain,DC=ad&lt;br /&gt;
objectClass: top&lt;br /&gt;
objectClass: leaf&lt;br /&gt;
objectClass: trustedDomain&lt;br /&gt;
cn: INTERN.DARKREALM.DYNDNS.ORG&lt;br /&gt;
distinguishedName: CN=INTERN.DARKREALM.DYNDNS.ORG,CN=System,DC=testdomain,DC=a&lt;br /&gt;
 d&lt;br /&gt;
instanceType: 4&lt;br /&gt;
whenCreated: 20250926000103.0Z&lt;br /&gt;
whenChanged: 20250926000103.0Z&lt;br /&gt;
uSNCreated: 16453&lt;br /&gt;
uSNChanged: 16454&lt;br /&gt;
showInAdvancedViewOnly: TRUE&lt;br /&gt;
name: INTERN.DARKREALM.DYNDNS.ORG&lt;br /&gt;
objectGUID:: ojk5Xjs+Z0ieoCAx6wEjsA==&lt;br /&gt;
trustDirection: 3&lt;br /&gt;
trustPartner: INTERN.DARKREALM.DYNDNS.ORG&lt;br /&gt;
trustPosixOffset: 0&lt;br /&gt;
trustType: 3&lt;br /&gt;
trustAttributes: 0&lt;br /&gt;
flatName: INTERN.DARKREALM.DYNDNS.ORG&lt;br /&gt;
objectCategory: CN=Trusted-Domain,CN=Schema,CN=Configuration,DC=testdomain,DC=&lt;br /&gt;
 ad&lt;br /&gt;
isCriticalSystemObject: TRUE&lt;br /&gt;
dSCorePropagationData: 16010101000000.0Z&lt;br /&gt;
trustAuthIncoming:&lt;br /&gt;
trustAuthOutgoing:&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dn: CN=INTERN.DARKREALM.DYNDNS.ORG$,CN=Users,DC=testdomain,DC=ad&lt;br /&gt;
objectClass: top&lt;br /&gt;
objectClass: person&lt;br /&gt;
objectClass: organizationalPerson&lt;br /&gt;
objectClass: user&lt;br /&gt;
cn: INTERN.DARKREALM.DYNDNS.ORG$&lt;br /&gt;
distinguishedName: CN=INTERN.DARKREALM.DYNDNS.ORG$,CN=Users,DC=testdomain,DC=a&lt;br /&gt;
 d&lt;br /&gt;
instanceType: 4&lt;br /&gt;
whenCreated: 20250926005246.0Z&lt;br /&gt;
whenChanged: 20250926005247.0Z&lt;br /&gt;
uSNCreated: 24597&lt;br /&gt;
uSNChanged: 24599&lt;br /&gt;
name: INTERN.DARKREALM.DYNDNS.ORG$&lt;br /&gt;
objectGUID:: HPPriJ7qRU+1bDWJWV9Yvw==&lt;br /&gt;
userAccountControl: 2082&lt;br /&gt;
badPwdCount: 0&lt;br /&gt;
codePage: 0&lt;br /&gt;
countryCode: 0&lt;br /&gt;
badPasswordTime: 0&lt;br /&gt;
lastLogoff: 0&lt;br /&gt;
lastLogon: 0&lt;br /&gt;
pwdLastSet: 0&lt;br /&gt;
primaryGroupID: 529&lt;br /&gt;
objectSid:: AQUAAAAAAAUVAAAAjZWqvXpflmUzfrM8UgQAAA==&lt;br /&gt;
accountExpires: 9223372036854775807&lt;br /&gt;
logonCount: 0&lt;br /&gt;
sAMAccountName: INTERN.DARKREALM.DYNDNS.ORG$&lt;br /&gt;
sAMAccountType: 805306370&lt;br /&gt;
objectCategory: CN=Person,CN=Schema,CN=Configuration,DC=testdomain,DC=ad&lt;br /&gt;
isCriticalSystemObject: TRUE&lt;br /&gt;
dSCorePropagationData: 16010101000000.0Z&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Squid Crossrealm ==&lt;br /&gt;
&lt;br /&gt;
Kein Plan wie und warum es funktioniert. Ist auch noch nicht wirklich crossrealm.&lt;br /&gt;
&lt;br /&gt;
In /etc/squid/squid.conf folgende Zeile einfügen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
auth_param negotiate program /usr/libexec/squid/negotiate_kerberos_auth -k /etc/squid.smb.keytab -i&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
msktutil -c -s HTTP/shodan.intern.darkrealm.dyndns.org -h shodan.intern.darkrealm.dyndns.org -k squid.smb.keytab --computer-name squid-http --upn HTTP/shodan.intern.darkrealm.dyndns.org --verbose --realm AD.INTERN.DARKREALM.DYNDNS.ORG --no-reverse-lookups --use-service-account&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann erstellte Keytab nach /etc/squid.smb.keytab kopieren und squid neustarten.&lt;/div&gt;</summary>
		<author><name>Chris</name></author>
	</entry>
	<entry>
		<id>https://darkrealm-wiki.darkrealm.dyndns.org/index.php?title=Kerberos&amp;diff=4854</id>
		<title>Kerberos</title>
		<link rel="alternate" type="text/html" href="https://darkrealm-wiki.darkrealm.dyndns.org/index.php?title=Kerberos&amp;diff=4854"/>
		<updated>2025-09-26T01:23:02Z</updated>

		<summary type="html">&lt;p&gt;Chris: /* Crossrealm AD  MIT-KRB5 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= MIT-KRB HowTo =&lt;br /&gt;
&lt;br /&gt;
== KDC konfigurieren und KDC Datenbank erstellen ==&lt;br /&gt;
&lt;br /&gt;
# /var/lib/krb5kdc/kdc.conf erstellen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[kdcdefaults]&lt;br /&gt;
        kdc_ports = 89&lt;br /&gt;
        kdc_tcp_ports = 89&lt;br /&gt;
        kadmind_port = 750&lt;br /&gt;
        kpasswd_port = 466&lt;br /&gt;
&lt;br /&gt;
[realms]&lt;br /&gt;
        INTERN.NEOREALM.DYNDNS.ORG = {&lt;br /&gt;
                database_name = /var/lib/krb5kdc/principal&lt;br /&gt;
                acl_file = /var/lib/krb5kdc/kadm5.acl&lt;br /&gt;
                key_stash_file = /var/lib/krb5kdc/.k5.INTERN.NEOREALM.DYNDNS.ORG&lt;br /&gt;
                kadmind_port = 750&lt;br /&gt;
                kpasswd_port = 466&lt;br /&gt;
                max_life = 10h 0m 0s&lt;br /&gt;
                max_renewable_life = 7d 0h 0m 0s&lt;br /&gt;
                #default_principal_flags = +preauth                                                                                            &lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
[logging]&lt;br /&gt;
              kdc = CONSOLE&lt;br /&gt;
              kdc = SYSLOG:INFO:DAEMON&lt;br /&gt;
              kdc = FILE:/var/log/kdc.log&lt;br /&gt;
              admin_server = FILE:/var/log/kadmin.log&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Datenbank erstellen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kdb5_util create -r &amp;lt;REALMNAME&amp;gt; -s&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# kadmin Prinzipal erstellen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kadmin.local&lt;br /&gt;
addprinc admin/admin@INTERN.NEOREALM.DYNDNS.ORG&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
*/admin@INTERN.DARKREALM.DYNDNS.ORG	*&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== DNS einrichten ==&lt;br /&gt;
&lt;br /&gt;
Folgende RR&#039;s in die Zone eintragen&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
_kerberos.intern.darkrealm.dyndns.org		TXT	&amp;quot;INTERN.DARKREALM.DYNDNS.ORG&amp;quot;&lt;br /&gt;
_kerberos.intern.darkrealm.dyndns.org		SRV	1 0 89 shodan.intern.darkrealm.dyndns.org.&lt;br /&gt;
_kerberos-adm.intern.darkrealm.dyndns.org	SRV	1 0 777 shodan.intern.darkrealm.dyndns.org. (wird noch? nicht ausgewertet) &lt;br /&gt;
_kerberos.intern.darkrealm.dyndns.org		SRV	1 0 89 shodan.intern.darkrealm.dyndns.org.&lt;br /&gt;
_kpasswd.intern.darkrealm.dyndns.org		SRV	1 0 464 shodan.intern.darkrealm.dyndns.org.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Das reicht um Rechner ohne /etc/krb5.conf auf den default realm hinzuweisen. Weil _kerberos-adm zurzeit noch nicht ausgewertet wird muss man folgendes in der /etc/krb5.conf eintragen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[realms]&lt;br /&gt;
	INTERN.DARKREALM.DYNDNS.ORG = {&lt;br /&gt;
		admin_server = shodan.intern.darkrealm.dyndns.org:777&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2. NFS mit sec=krb5p ==&lt;br /&gt;
&lt;br /&gt;
Mount : mount shodan:/home /home -o sec=krb5p&lt;br /&gt;
&lt;br /&gt;
Server:&lt;br /&gt;
rpc.svcgssd braucht keytab /etc/krb5.keytab&lt;br /&gt;
&lt;br /&gt;
rpc.svcgssd braucht explizit nfs/&amp;lt;fqdn&amp;gt; principal (erstmal egal welcher FQDN, aber der client kann nicht connecten wenn fqdn vom server nicht drinsteht)&lt;br /&gt;
&lt;br /&gt;
Also in die keytab:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nfs/shodan.intern.darkrealm.dyndns.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Client:&lt;br /&gt;
Client sucht laut man rpc.gssd folgende Einträge in der keytab: (scheinbar geht es hier nur um machine credentials, egal wie der principal heisst)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
          &amp;lt;HOSTNAME&amp;gt;$@&amp;lt;REALM&amp;gt;&lt;br /&gt;
          root/&amp;lt;hostname&amp;gt;@&amp;lt;REALM&amp;gt;&lt;br /&gt;
          nfs/&amp;lt;hostname&amp;gt;@&amp;lt;REALM&amp;gt;&lt;br /&gt;
          host/&amp;lt;hostname&amp;gt;@&amp;lt;REALM&amp;gt;&lt;br /&gt;
          root/&amp;lt;anyname&amp;gt;@&amp;lt;REALM&amp;gt;&lt;br /&gt;
          nfs/&amp;lt;anyname&amp;gt;@&amp;lt;REALM&amp;gt;&lt;br /&gt;
          host/&amp;lt;anyname&amp;gt;@&amp;lt;REALM&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Also in die keytab:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
host/rasmatazz.intern.darkrealm.dyndns.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
KVNO&#039;s müssen auf jedem Rechner gleich sein !&lt;br /&gt;
&lt;br /&gt;
Keytab auf dem Server :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
slot KVNO Principal&lt;br /&gt;
---- ---- ---------------------------------------------------------------------&lt;br /&gt;
   1    2 nfs/shodan.intern.darkrealm.dyndns.org@INTERN.DARKREALM.DYNDNS.ORG&lt;br /&gt;
   2    2 nfs/shodan.intern.darkrealm.dyndns.org@INTERN.DARKREALM.DYNDNS.ORG&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Keytab auf dem Client :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
slot KVNO Principal&lt;br /&gt;
---- ---- ---------------------------------------------------------------------&lt;br /&gt;
   1    2 host/rasmatazz.intern.darkrealm.dyndns.org@INTERN.DARKREALM.DYNDNS.ORG&lt;br /&gt;
   2    2 host/rasmatazz.intern.darkrealm.dyndns.org@INTERN.DARKREALM.DYNDNS.ORG&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 3. SSH mit kerberos (-K) ==&lt;br /&gt;
&lt;br /&gt;
In der Server-Keytab reicht :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
host/shodan.intern.darkrealm.dyndns.org@INTERN.DARKREALM.DYNDNS.ORG&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aber in der /etc/krb5.conf auf dem Server muss stehen :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;libdefaults&amp;gt;&lt;br /&gt;
ignore_acceptor_hostname = true&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
ansonsten meldet der SSH-Server daß kein keytab-entry für host/shodan@ vorhanden ist.&lt;br /&gt;
&lt;br /&gt;
== 4. samba mit kerberos ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kinit chris@HERRMANN.AD&lt;br /&gt;
sudo mount //shodan.intern.darkrealm.dyndns.org/temporary /mnt/tmp -o vers=3.02,sec=krb5i,cruid=chris,user=chris,cifsacl&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Crossrealm AD &amp;lt;-&amp;gt; MIT-KRB5 ==&lt;br /&gt;
&lt;br /&gt;
Funktioniert momentan nur mit einem Windows Server als Domain Controller!&lt;br /&gt;
&lt;br /&gt;
=== Auf dem MIT-KRB5 KDC ===&lt;br /&gt;
&lt;br /&gt;
* Mit kadmin 2 Principals hinzufügen (bei beiden gleiches Passwort setzen):&lt;br /&gt;
** addprinc krbtgt/INTERN.DARKREALM.DYNDNS.ORG@TESTDOMAIN.AD&lt;br /&gt;
** krbtgt/TESTDOMAIN.AD@INTERN.DARKREALM.DYNDNS.ORG&lt;br /&gt;
&lt;br /&gt;
=== Auf dem Windows-Domaincontroller ===&lt;br /&gt;
&lt;br /&gt;
* Active Directory-Domänen und -Vertrauensstellungen öffnen&lt;br /&gt;
* Neue Vertrauensstellung&lt;br /&gt;
* Name: INTERN.DARKREALM.DYNDNS.ORG&lt;br /&gt;
* Vertrauenstyp: Bereichsvertrauensstellung&lt;br /&gt;
* Nicht transitiv oder Transitiv, ist egal&lt;br /&gt;
* Bidirektional&lt;br /&gt;
* Vertrauensstellungskennwort eingeben (gleiches wie auf der MIT-KRB5 Seite)&lt;br /&gt;
&lt;br /&gt;
* Zuständigen KDC für INTERN.DARKREALM.DYNDNS.ORG festlegen:&lt;br /&gt;
** ksetup /addkdc INTERN.DARKREALM.DYNDNS.ORG shodan.intern.darkrealm.dyndns.org&lt;br /&gt;
* Rechnernamen zu dem Realm zuordnen:&lt;br /&gt;
** ksetup /addhosttorealmmap shodan.intern.darkrealm.dyndns.org INTERN.DARKREALM.DYNDNS.ORG&lt;br /&gt;
&lt;br /&gt;
=== Beispiel-LDIF eines Trusts ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dn: CN=INTERN.DARKREALM.DYNDNS.ORG,CN=System,DC=testdomain,DC=ad&lt;br /&gt;
objectClass: top&lt;br /&gt;
objectClass: leaf&lt;br /&gt;
objectClass: trustedDomain&lt;br /&gt;
cn: INTERN.DARKREALM.DYNDNS.ORG&lt;br /&gt;
distinguishedName: CN=INTERN.DARKREALM.DYNDNS.ORG,CN=System,DC=testdomain,DC=a&lt;br /&gt;
 d&lt;br /&gt;
instanceType: 4&lt;br /&gt;
whenCreated: 20250926000103.0Z&lt;br /&gt;
whenChanged: 20250926000103.0Z&lt;br /&gt;
uSNCreated: 16453&lt;br /&gt;
uSNChanged: 16454&lt;br /&gt;
showInAdvancedViewOnly: TRUE&lt;br /&gt;
name: INTERN.DARKREALM.DYNDNS.ORG&lt;br /&gt;
objectGUID:: ojk5Xjs+Z0ieoCAx6wEjsA==&lt;br /&gt;
trustDirection: 3&lt;br /&gt;
trustPartner: INTERN.DARKREALM.DYNDNS.ORG&lt;br /&gt;
trustPosixOffset: 0&lt;br /&gt;
trustType: 3&lt;br /&gt;
trustAttributes: 0&lt;br /&gt;
flatName: INTERN.DARKREALM.DYNDNS.ORG&lt;br /&gt;
objectCategory: CN=Trusted-Domain,CN=Schema,CN=Configuration,DC=testdomain,DC=&lt;br /&gt;
 ad&lt;br /&gt;
isCriticalSystemObject: TRUE&lt;br /&gt;
dSCorePropagationData: 16010101000000.0Z&lt;br /&gt;
trustAuthIncoming:&lt;br /&gt;
trustAuthOutgoing:&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dn: CN=INTERN.DARKREALM.DYNDNS.ORG$,CN=Users,DC=testdomain,DC=ad&lt;br /&gt;
objectClass: top&lt;br /&gt;
objectClass: person&lt;br /&gt;
objectClass: organizationalPerson&lt;br /&gt;
objectClass: user&lt;br /&gt;
cn: INTERN.DARKREALM.DYNDNS.ORG$&lt;br /&gt;
distinguishedName: CN=INTERN.DARKREALM.DYNDNS.ORG$,CN=Users,DC=testdomain,DC=a&lt;br /&gt;
 d&lt;br /&gt;
instanceType: 4&lt;br /&gt;
whenCreated: 20250926005246.0Z&lt;br /&gt;
whenChanged: 20250926005247.0Z&lt;br /&gt;
uSNCreated: 24597&lt;br /&gt;
uSNChanged: 24599&lt;br /&gt;
name: INTERN.DARKREALM.DYNDNS.ORG$&lt;br /&gt;
objectGUID:: HPPriJ7qRU+1bDWJWV9Yvw==&lt;br /&gt;
userAccountControl: 2082&lt;br /&gt;
badPwdCount: 0&lt;br /&gt;
codePage: 0&lt;br /&gt;
countryCode: 0&lt;br /&gt;
badPasswordTime: 0&lt;br /&gt;
lastLogoff: 0&lt;br /&gt;
lastLogon: 0&lt;br /&gt;
pwdLastSet: 0&lt;br /&gt;
primaryGroupID: 529&lt;br /&gt;
objectSid:: AQUAAAAAAAUVAAAAjZWqvXpflmUzfrM8UgQAAA==&lt;br /&gt;
accountExpires: 9223372036854775807&lt;br /&gt;
logonCount: 0&lt;br /&gt;
sAMAccountName: INTERN.DARKREALM.DYNDNS.ORG$&lt;br /&gt;
sAMAccountType: 805306370&lt;br /&gt;
objectCategory: CN=Person,CN=Schema,CN=Configuration,DC=testdomain,DC=ad&lt;br /&gt;
isCriticalSystemObject: TRUE&lt;br /&gt;
dSCorePropagationData: 16010101000000.0Z&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Squid Crossrealm ==&lt;br /&gt;
&lt;br /&gt;
Kein Plan wie und warum es funktioniert. Ist auch noch nicht wirklich crossrealm.&lt;br /&gt;
&lt;br /&gt;
In /etc/squid/squid.conf folgende Zeile einfügen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
auth_param negotiate program /usr/libexec/squid/negotiate_kerberos_auth -k /etc/squid.smb.keytab -i&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
msktutil -c -s HTTP/shodan.intern.darkrealm.dyndns.org -h shodan.intern.darkrealm.dyndns.org -k squid.smb.keytab --computer-name squid-http --upn HTTP/shodan.intern.darkrealm.dyndns.org --verbose --realm AD.INTERN.DARKREALM.DYNDNS.ORG --no-reverse-lookups --use-service-account&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann erstellte Keytab nach /etc/squid.smb.keytab kopieren und squid neustarten.&lt;/div&gt;</summary>
		<author><name>Chris</name></author>
	</entry>
	<entry>
		<id>https://darkrealm-wiki.darkrealm.dyndns.org/index.php?title=Kerberos&amp;diff=4853</id>
		<title>Kerberos</title>
		<link rel="alternate" type="text/html" href="https://darkrealm-wiki.darkrealm.dyndns.org/index.php?title=Kerberos&amp;diff=4853"/>
		<updated>2025-09-26T00:07:02Z</updated>

		<summary type="html">&lt;p&gt;Chris: /* Auf dem Windows-Domaincontroller */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= MIT-KRB HowTo =&lt;br /&gt;
&lt;br /&gt;
== KDC konfigurieren und KDC Datenbank erstellen ==&lt;br /&gt;
&lt;br /&gt;
# /var/lib/krb5kdc/kdc.conf erstellen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[kdcdefaults]&lt;br /&gt;
        kdc_ports = 89&lt;br /&gt;
        kdc_tcp_ports = 89&lt;br /&gt;
        kadmind_port = 750&lt;br /&gt;
        kpasswd_port = 466&lt;br /&gt;
&lt;br /&gt;
[realms]&lt;br /&gt;
        INTERN.NEOREALM.DYNDNS.ORG = {&lt;br /&gt;
                database_name = /var/lib/krb5kdc/principal&lt;br /&gt;
                acl_file = /var/lib/krb5kdc/kadm5.acl&lt;br /&gt;
                key_stash_file = /var/lib/krb5kdc/.k5.INTERN.NEOREALM.DYNDNS.ORG&lt;br /&gt;
                kadmind_port = 750&lt;br /&gt;
                kpasswd_port = 466&lt;br /&gt;
                max_life = 10h 0m 0s&lt;br /&gt;
                max_renewable_life = 7d 0h 0m 0s&lt;br /&gt;
                #default_principal_flags = +preauth                                                                                            &lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
[logging]&lt;br /&gt;
              kdc = CONSOLE&lt;br /&gt;
              kdc = SYSLOG:INFO:DAEMON&lt;br /&gt;
              kdc = FILE:/var/log/kdc.log&lt;br /&gt;
              admin_server = FILE:/var/log/kadmin.log&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Datenbank erstellen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kdb5_util create -r &amp;lt;REALMNAME&amp;gt; -s&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# kadmin Prinzipal erstellen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kadmin.local&lt;br /&gt;
addprinc admin/admin@INTERN.NEOREALM.DYNDNS.ORG&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
*/admin@INTERN.DARKREALM.DYNDNS.ORG	*&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== DNS einrichten ==&lt;br /&gt;
&lt;br /&gt;
Folgende RR&#039;s in die Zone eintragen&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
_kerberos.intern.darkrealm.dyndns.org		TXT	&amp;quot;INTERN.DARKREALM.DYNDNS.ORG&amp;quot;&lt;br /&gt;
_kerberos.intern.darkrealm.dyndns.org		SRV	1 0 89 shodan.intern.darkrealm.dyndns.org.&lt;br /&gt;
_kerberos-adm.intern.darkrealm.dyndns.org	SRV	1 0 777 shodan.intern.darkrealm.dyndns.org. (wird noch? nicht ausgewertet) &lt;br /&gt;
_kerberos.intern.darkrealm.dyndns.org		SRV	1 0 89 shodan.intern.darkrealm.dyndns.org.&lt;br /&gt;
_kpasswd.intern.darkrealm.dyndns.org		SRV	1 0 464 shodan.intern.darkrealm.dyndns.org.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Das reicht um Rechner ohne /etc/krb5.conf auf den default realm hinzuweisen. Weil _kerberos-adm zurzeit noch nicht ausgewertet wird muss man folgendes in der /etc/krb5.conf eintragen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[realms]&lt;br /&gt;
	INTERN.DARKREALM.DYNDNS.ORG = {&lt;br /&gt;
		admin_server = shodan.intern.darkrealm.dyndns.org:777&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2. NFS mit sec=krb5p ==&lt;br /&gt;
&lt;br /&gt;
Mount : mount shodan:/home /home -o sec=krb5p&lt;br /&gt;
&lt;br /&gt;
Server:&lt;br /&gt;
rpc.svcgssd braucht keytab /etc/krb5.keytab&lt;br /&gt;
&lt;br /&gt;
rpc.svcgssd braucht explizit nfs/&amp;lt;fqdn&amp;gt; principal (erstmal egal welcher FQDN, aber der client kann nicht connecten wenn fqdn vom server nicht drinsteht)&lt;br /&gt;
&lt;br /&gt;
Also in die keytab:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nfs/shodan.intern.darkrealm.dyndns.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Client:&lt;br /&gt;
Client sucht laut man rpc.gssd folgende Einträge in der keytab: (scheinbar geht es hier nur um machine credentials, egal wie der principal heisst)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
          &amp;lt;HOSTNAME&amp;gt;$@&amp;lt;REALM&amp;gt;&lt;br /&gt;
          root/&amp;lt;hostname&amp;gt;@&amp;lt;REALM&amp;gt;&lt;br /&gt;
          nfs/&amp;lt;hostname&amp;gt;@&amp;lt;REALM&amp;gt;&lt;br /&gt;
          host/&amp;lt;hostname&amp;gt;@&amp;lt;REALM&amp;gt;&lt;br /&gt;
          root/&amp;lt;anyname&amp;gt;@&amp;lt;REALM&amp;gt;&lt;br /&gt;
          nfs/&amp;lt;anyname&amp;gt;@&amp;lt;REALM&amp;gt;&lt;br /&gt;
          host/&amp;lt;anyname&amp;gt;@&amp;lt;REALM&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Also in die keytab:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
host/rasmatazz.intern.darkrealm.dyndns.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
KVNO&#039;s müssen auf jedem Rechner gleich sein !&lt;br /&gt;
&lt;br /&gt;
Keytab auf dem Server :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
slot KVNO Principal&lt;br /&gt;
---- ---- ---------------------------------------------------------------------&lt;br /&gt;
   1    2 nfs/shodan.intern.darkrealm.dyndns.org@INTERN.DARKREALM.DYNDNS.ORG&lt;br /&gt;
   2    2 nfs/shodan.intern.darkrealm.dyndns.org@INTERN.DARKREALM.DYNDNS.ORG&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Keytab auf dem Client :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
slot KVNO Principal&lt;br /&gt;
---- ---- ---------------------------------------------------------------------&lt;br /&gt;
   1    2 host/rasmatazz.intern.darkrealm.dyndns.org@INTERN.DARKREALM.DYNDNS.ORG&lt;br /&gt;
   2    2 host/rasmatazz.intern.darkrealm.dyndns.org@INTERN.DARKREALM.DYNDNS.ORG&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 3. SSH mit kerberos (-K) ==&lt;br /&gt;
&lt;br /&gt;
In der Server-Keytab reicht :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
host/shodan.intern.darkrealm.dyndns.org@INTERN.DARKREALM.DYNDNS.ORG&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aber in der /etc/krb5.conf auf dem Server muss stehen :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;libdefaults&amp;gt;&lt;br /&gt;
ignore_acceptor_hostname = true&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
ansonsten meldet der SSH-Server daß kein keytab-entry für host/shodan@ vorhanden ist.&lt;br /&gt;
&lt;br /&gt;
== 4. samba mit kerberos ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kinit chris@HERRMANN.AD&lt;br /&gt;
sudo mount //shodan.intern.darkrealm.dyndns.org/temporary /mnt/tmp -o vers=3.02,sec=krb5i,cruid=chris,user=chris,cifsacl&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Crossrealm AD &amp;lt;-&amp;gt; MIT-KRB5 ==&lt;br /&gt;
&lt;br /&gt;
Funktioniert momentan nur mit einem Windows Server als Domain Controller!&lt;br /&gt;
&lt;br /&gt;
=== Auf dem MIT-KRB5 KDC ===&lt;br /&gt;
&lt;br /&gt;
* Mit kadmin 2 Principals hinzufügen (bei beiden gleiches Passwort setzen):&lt;br /&gt;
** addprinc krbtgt/INTERN.DARKREALM.DYNDNS.ORG@TESTDOMAIN.AD&lt;br /&gt;
** krbtgt/TESTDOMAIN.AD@INTERN.DARKREALM.DYNDNS.ORG&lt;br /&gt;
&lt;br /&gt;
=== Auf dem Windows-Domaincontroller ===&lt;br /&gt;
&lt;br /&gt;
* Active Directory-Domänen und -Vertrauensstellungen öffnen&lt;br /&gt;
* Neue Vertrauensstellung&lt;br /&gt;
* Name: INTERN.DARKREALM.DYNDNS.ORG&lt;br /&gt;
* Vertrauenstyp: Bereichsvertrauensstellung&lt;br /&gt;
* Nicht transitiv oder Transitiv, ist egal&lt;br /&gt;
* Bidirektional&lt;br /&gt;
* Vertrauensstellungskennwort eingeben (gleiches wie auf der MIT-KRB5 Seite)&lt;br /&gt;
&lt;br /&gt;
* Zuständigen KDC für INTERN.DARKREALM.DYNDNS.ORG festlegen:&lt;br /&gt;
** ksetup /addkdc INTERN.DARKREALM.DYNDNS.ORG shodan.intern.darkrealm.dyndns.org&lt;br /&gt;
* Rechnernamen zu dem Realm zuordnen:&lt;br /&gt;
** ksetup /addhosttorealmmap shodan.intern.darkrealm.dyndns.org INTERN.DARKREALM.DYNDNS.ORG&lt;br /&gt;
&lt;br /&gt;
== Squid Crossrealm ==&lt;br /&gt;
&lt;br /&gt;
Kein Plan wie und warum es funktioniert. Ist auch noch nicht wirklich crossrealm.&lt;br /&gt;
&lt;br /&gt;
In /etc/squid/squid.conf folgende Zeile einfügen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
auth_param negotiate program /usr/libexec/squid/negotiate_kerberos_auth -k /etc/squid.smb.keytab -i&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
msktutil -c -s HTTP/shodan.intern.darkrealm.dyndns.org -h shodan.intern.darkrealm.dyndns.org -k squid.smb.keytab --computer-name squid-http --upn HTTP/shodan.intern.darkrealm.dyndns.org --verbose --realm AD.INTERN.DARKREALM.DYNDNS.ORG --no-reverse-lookups --use-service-account&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann erstellte Keytab nach /etc/squid.smb.keytab kopieren und squid neustarten.&lt;/div&gt;</summary>
		<author><name>Chris</name></author>
	</entry>
	<entry>
		<id>https://darkrealm-wiki.darkrealm.dyndns.org/index.php?title=Kerberos&amp;diff=4852</id>
		<title>Kerberos</title>
		<link rel="alternate" type="text/html" href="https://darkrealm-wiki.darkrealm.dyndns.org/index.php?title=Kerberos&amp;diff=4852"/>
		<updated>2025-09-26T00:04:07Z</updated>

		<summary type="html">&lt;p&gt;Chris: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= MIT-KRB HowTo =&lt;br /&gt;
&lt;br /&gt;
== KDC konfigurieren und KDC Datenbank erstellen ==&lt;br /&gt;
&lt;br /&gt;
# /var/lib/krb5kdc/kdc.conf erstellen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[kdcdefaults]&lt;br /&gt;
        kdc_ports = 89&lt;br /&gt;
        kdc_tcp_ports = 89&lt;br /&gt;
        kadmind_port = 750&lt;br /&gt;
        kpasswd_port = 466&lt;br /&gt;
&lt;br /&gt;
[realms]&lt;br /&gt;
        INTERN.NEOREALM.DYNDNS.ORG = {&lt;br /&gt;
                database_name = /var/lib/krb5kdc/principal&lt;br /&gt;
                acl_file = /var/lib/krb5kdc/kadm5.acl&lt;br /&gt;
                key_stash_file = /var/lib/krb5kdc/.k5.INTERN.NEOREALM.DYNDNS.ORG&lt;br /&gt;
                kadmind_port = 750&lt;br /&gt;
                kpasswd_port = 466&lt;br /&gt;
                max_life = 10h 0m 0s&lt;br /&gt;
                max_renewable_life = 7d 0h 0m 0s&lt;br /&gt;
                #default_principal_flags = +preauth                                                                                            &lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
[logging]&lt;br /&gt;
              kdc = CONSOLE&lt;br /&gt;
              kdc = SYSLOG:INFO:DAEMON&lt;br /&gt;
              kdc = FILE:/var/log/kdc.log&lt;br /&gt;
              admin_server = FILE:/var/log/kadmin.log&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Datenbank erstellen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kdb5_util create -r &amp;lt;REALMNAME&amp;gt; -s&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# kadmin Prinzipal erstellen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kadmin.local&lt;br /&gt;
addprinc admin/admin@INTERN.NEOREALM.DYNDNS.ORG&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
*/admin@INTERN.DARKREALM.DYNDNS.ORG	*&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== DNS einrichten ==&lt;br /&gt;
&lt;br /&gt;
Folgende RR&#039;s in die Zone eintragen&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
_kerberos.intern.darkrealm.dyndns.org		TXT	&amp;quot;INTERN.DARKREALM.DYNDNS.ORG&amp;quot;&lt;br /&gt;
_kerberos.intern.darkrealm.dyndns.org		SRV	1 0 89 shodan.intern.darkrealm.dyndns.org.&lt;br /&gt;
_kerberos-adm.intern.darkrealm.dyndns.org	SRV	1 0 777 shodan.intern.darkrealm.dyndns.org. (wird noch? nicht ausgewertet) &lt;br /&gt;
_kerberos.intern.darkrealm.dyndns.org		SRV	1 0 89 shodan.intern.darkrealm.dyndns.org.&lt;br /&gt;
_kpasswd.intern.darkrealm.dyndns.org		SRV	1 0 464 shodan.intern.darkrealm.dyndns.org.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Das reicht um Rechner ohne /etc/krb5.conf auf den default realm hinzuweisen. Weil _kerberos-adm zurzeit noch nicht ausgewertet wird muss man folgendes in der /etc/krb5.conf eintragen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[realms]&lt;br /&gt;
	INTERN.DARKREALM.DYNDNS.ORG = {&lt;br /&gt;
		admin_server = shodan.intern.darkrealm.dyndns.org:777&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2. NFS mit sec=krb5p ==&lt;br /&gt;
&lt;br /&gt;
Mount : mount shodan:/home /home -o sec=krb5p&lt;br /&gt;
&lt;br /&gt;
Server:&lt;br /&gt;
rpc.svcgssd braucht keytab /etc/krb5.keytab&lt;br /&gt;
&lt;br /&gt;
rpc.svcgssd braucht explizit nfs/&amp;lt;fqdn&amp;gt; principal (erstmal egal welcher FQDN, aber der client kann nicht connecten wenn fqdn vom server nicht drinsteht)&lt;br /&gt;
&lt;br /&gt;
Also in die keytab:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nfs/shodan.intern.darkrealm.dyndns.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Client:&lt;br /&gt;
Client sucht laut man rpc.gssd folgende Einträge in der keytab: (scheinbar geht es hier nur um machine credentials, egal wie der principal heisst)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
          &amp;lt;HOSTNAME&amp;gt;$@&amp;lt;REALM&amp;gt;&lt;br /&gt;
          root/&amp;lt;hostname&amp;gt;@&amp;lt;REALM&amp;gt;&lt;br /&gt;
          nfs/&amp;lt;hostname&amp;gt;@&amp;lt;REALM&amp;gt;&lt;br /&gt;
          host/&amp;lt;hostname&amp;gt;@&amp;lt;REALM&amp;gt;&lt;br /&gt;
          root/&amp;lt;anyname&amp;gt;@&amp;lt;REALM&amp;gt;&lt;br /&gt;
          nfs/&amp;lt;anyname&amp;gt;@&amp;lt;REALM&amp;gt;&lt;br /&gt;
          host/&amp;lt;anyname&amp;gt;@&amp;lt;REALM&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Also in die keytab:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
host/rasmatazz.intern.darkrealm.dyndns.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
KVNO&#039;s müssen auf jedem Rechner gleich sein !&lt;br /&gt;
&lt;br /&gt;
Keytab auf dem Server :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
slot KVNO Principal&lt;br /&gt;
---- ---- ---------------------------------------------------------------------&lt;br /&gt;
   1    2 nfs/shodan.intern.darkrealm.dyndns.org@INTERN.DARKREALM.DYNDNS.ORG&lt;br /&gt;
   2    2 nfs/shodan.intern.darkrealm.dyndns.org@INTERN.DARKREALM.DYNDNS.ORG&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Keytab auf dem Client :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
slot KVNO Principal&lt;br /&gt;
---- ---- ---------------------------------------------------------------------&lt;br /&gt;
   1    2 host/rasmatazz.intern.darkrealm.dyndns.org@INTERN.DARKREALM.DYNDNS.ORG&lt;br /&gt;
   2    2 host/rasmatazz.intern.darkrealm.dyndns.org@INTERN.DARKREALM.DYNDNS.ORG&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 3. SSH mit kerberos (-K) ==&lt;br /&gt;
&lt;br /&gt;
In der Server-Keytab reicht :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
host/shodan.intern.darkrealm.dyndns.org@INTERN.DARKREALM.DYNDNS.ORG&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aber in der /etc/krb5.conf auf dem Server muss stehen :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;libdefaults&amp;gt;&lt;br /&gt;
ignore_acceptor_hostname = true&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
ansonsten meldet der SSH-Server daß kein keytab-entry für host/shodan@ vorhanden ist.&lt;br /&gt;
&lt;br /&gt;
== 4. samba mit kerberos ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kinit chris@HERRMANN.AD&lt;br /&gt;
sudo mount //shodan.intern.darkrealm.dyndns.org/temporary /mnt/tmp -o vers=3.02,sec=krb5i,cruid=chris,user=chris,cifsacl&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Crossrealm AD &amp;lt;-&amp;gt; MIT-KRB5 ==&lt;br /&gt;
&lt;br /&gt;
Funktioniert momentan nur mit einem Windows Server als Domain Controller!&lt;br /&gt;
&lt;br /&gt;
=== Auf dem MIT-KRB5 KDC ===&lt;br /&gt;
&lt;br /&gt;
* Mit kadmin 2 Principals hinzufügen (bei beiden gleiches Passwort setzen):&lt;br /&gt;
** addprinc krbtgt/INTERN.DARKREALM.DYNDNS.ORG@TESTDOMAIN.AD&lt;br /&gt;
** krbtgt/TESTDOMAIN.AD@INTERN.DARKREALM.DYNDNS.ORG&lt;br /&gt;
&lt;br /&gt;
=== Auf dem Windows-Domaincontroller ===&lt;br /&gt;
&lt;br /&gt;
* Active Directory-Domänen und -Vertrauensstellungen öffnen#&lt;br /&gt;
* Neue Vertrauensstellung&lt;br /&gt;
* Name: INTERN.DARKREALM.DYNDNS.ORG&lt;br /&gt;
* Vertrauenstyp: Bereichsvertrauensstellung&lt;br /&gt;
* Nicht transitiv oder Transitiv, ist egal&lt;br /&gt;
* Bidirektional&lt;br /&gt;
* Vertrauensstellungskennwort eingeben (gleiches wie auf der MIT-KRB5 Seite)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Squid Crossrealm ==&lt;br /&gt;
&lt;br /&gt;
Kein Plan wie und warum es funktioniert. Ist auch noch nicht wirklich crossrealm.&lt;br /&gt;
&lt;br /&gt;
In /etc/squid/squid.conf folgende Zeile einfügen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
auth_param negotiate program /usr/libexec/squid/negotiate_kerberos_auth -k /etc/squid.smb.keytab -i&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
msktutil -c -s HTTP/shodan.intern.darkrealm.dyndns.org -h shodan.intern.darkrealm.dyndns.org -k squid.smb.keytab --computer-name squid-http --upn HTTP/shodan.intern.darkrealm.dyndns.org --verbose --realm AD.INTERN.DARKREALM.DYNDNS.ORG --no-reverse-lookups --use-service-account&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann erstellte Keytab nach /etc/squid.smb.keytab kopieren und squid neustarten.&lt;/div&gt;</summary>
		<author><name>Chris</name></author>
	</entry>
	<entry>
		<id>https://darkrealm-wiki.darkrealm.dyndns.org/index.php?title=Steam_Games_Directories&amp;diff=4851</id>
		<title>Steam Games Directories</title>
		<link rel="alternate" type="text/html" href="https://darkrealm-wiki.darkrealm.dyndns.org/index.php?title=Steam_Games_Directories&amp;diff=4851"/>
		<updated>2025-09-06T13:56:23Z</updated>

		<summary type="html">&lt;p&gt;Chris: /* Resident Evil 3 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Resident Evil 0 HD Remaster ==&lt;br /&gt;
&lt;br /&gt;
%SystemDrive%\Users\%USERNAME%\AppData\Roaming\Steam\CODEX\339340\remote&lt;br /&gt;
&lt;br /&gt;
Verknüpfung erstellen :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mklink /D 339340 &amp;quot;c:\Users\chris\Saved Games\Resident Evil 0&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Resident Evil HD Remaster ==&lt;br /&gt;
&lt;br /&gt;
Default : %SystemDrive%\Users\%USERNAME%\AppData\Roaming\Steam\CODEX\304240\remote&lt;br /&gt;
&lt;br /&gt;
Verknüpfung erstellen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mklink /D 304240 &amp;quot;c:\Users\chris\Saved Games\Resident Evil&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Resident Evil 2 ==&lt;br /&gt;
&lt;br /&gt;
%SystemDrive%\Users\Public\Documents\Steam\CODEX\883710&lt;br /&gt;
&lt;br /&gt;
Verknüpfung erstellen :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mklink /d 883710 &amp;quot;c:\Users\chris\Saved Games\Resident Evil 2&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Resident Evil 3 ==&lt;br /&gt;
&lt;br /&gt;
%SystemDrive%\Users\Public\Documents\Steam\CODEX\254700&lt;br /&gt;
&lt;br /&gt;
Verknüpfung erstellen :&lt;br /&gt;
&lt;br /&gt;
Windows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mklink /d 254700 &amp;quot;c:\Users\chris\Saved Games\Resident Evil 3&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Linux:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ln -s /media/chris/Saved\ Games/Resident\ Evil\ 3/ ~/.wine/drive_c/users/Public/Documents/Steam/CODEX/254700&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Resident Evil 4 ==&lt;br /&gt;
&lt;br /&gt;
Default : C:\ProgramData\Steam\%UserName%\%Appid%\&lt;br /&gt;
&lt;br /&gt;
Verknüpfung erstellen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mklink /d Delacroix &amp;quot;c:\Users\chris\Saved Games\Resident Evil 4&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Resident Evil 5 Gold ==&lt;br /&gt;
&lt;br /&gt;
%SystemDrive%\Users\%USERNAME%\AppData\Roaming\Steam\CODEX\21690\remote&lt;br /&gt;
&lt;br /&gt;
Verknüpfung erstellen :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mklink /D 21690 &amp;quot;c:\Users\chris\Saved Games\Resident Evil 5&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Resident Evil 6 ==&lt;br /&gt;
&lt;br /&gt;
Savegames müssen beim Importieren auf neuen Rechnern / Maschinen hexeditiert werden, sonst werden sie als korrupt gemeldet.&lt;br /&gt;
&lt;br /&gt;
* Neue Speicherdaten erstellen&lt;br /&gt;
* Neu erstellte savegame.bin mit hexeditor öffnen&lt;br /&gt;
* Offset 16-23 (Hex 10-17) kopieren&lt;br /&gt;
* alte savegame.bin mit hexeditor öffnen&lt;br /&gt;
* An Offset 16-23 (Hex 10-17) Werte von neu erstellter savegame.bin einfügen&lt;br /&gt;
&lt;br /&gt;
Version 1.0.6 (Ali123)&lt;br /&gt;
&lt;br /&gt;
c:\Resident Evil 6\Profile&lt;br /&gt;
&lt;br /&gt;
Verknüpfung erstellen :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mklink /D Profile &amp;quot;c:\Users\chris\Saved Games\Resident Evil 6&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Version 1.0.6 (RLD)&lt;br /&gt;
&lt;br /&gt;
C:\ProgramData\Steam\Delacroix&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mklink /D 221040 &amp;quot;C:\Users\chris\Saved Games\Resident Evil 6&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Resident Evil 7 ==&lt;br /&gt;
&lt;br /&gt;
Default : %DEFAULT_CPY_DIR% = %USERNAME%\Documents\CPY_SAVES\&amp;lt;PlayerName&amp;gt;\418370&lt;br /&gt;
&lt;br /&gt;
SavePath in c:\Resident Evil 7\cpy.ini ändern.&lt;br /&gt;
&lt;br /&gt;
== Resident Evil 7 Gold ==&lt;br /&gt;
&lt;br /&gt;
%SystemDrive%\Users\Public\Documents\Steam\CODEX\418370&lt;br /&gt;
&lt;br /&gt;
Verknüpfung erstellen :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mklink /D 418370 &amp;quot;c:\Users\chris\Saved Games\Resident Evil 7&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Resident Evil Revelations ==&lt;br /&gt;
&lt;br /&gt;
Windows&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
C:\users\chris\Local Settings\Application Data\FLT\Steam\222480\remote&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Linux&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~/.wine/drive_c/users/chris/AppData/Local/FLT/Steam/222480/remote&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Resident Evil Revelations 2 ==&lt;br /&gt;
&lt;br /&gt;
%SystemDrive%\Users\%USERNAME%\AppData\Roaming\Steam\CODEX\287290\remote&lt;br /&gt;
&lt;br /&gt;
Verknüpfung erstellen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mklink /D 287290 &amp;quot;c:\Users\chris\Saved Games\Resident Evil Revelations 2&amp;quot;&lt;br /&gt;
ln -s ~/WINE/Saved\ Games/Resident\ Evil\ Revelations\ 2 287290&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit Folder Redirections alles von Linux aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ln -s ../AppData/Roaming/Steam/CODEX/287290 Resident\ Evil\ Revelations\ 2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Linux&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~/.wine/drive_c/users/chris/AppData/Roaming/Steam/CODEX/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chris</name></author>
	</entry>
	<entry>
		<id>https://darkrealm-wiki.darkrealm.dyndns.org/index.php?title=Steam_Games_Directories&amp;diff=4850</id>
		<title>Steam Games Directories</title>
		<link rel="alternate" type="text/html" href="https://darkrealm-wiki.darkrealm.dyndns.org/index.php?title=Steam_Games_Directories&amp;diff=4850"/>
		<updated>2025-09-06T13:55:59Z</updated>

		<summary type="html">&lt;p&gt;Chris: /* Resident Evil 3 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Resident Evil 0 HD Remaster ==&lt;br /&gt;
&lt;br /&gt;
%SystemDrive%\Users\%USERNAME%\AppData\Roaming\Steam\CODEX\339340\remote&lt;br /&gt;
&lt;br /&gt;
Verknüpfung erstellen :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mklink /D 339340 &amp;quot;c:\Users\chris\Saved Games\Resident Evil 0&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Resident Evil HD Remaster ==&lt;br /&gt;
&lt;br /&gt;
Default : %SystemDrive%\Users\%USERNAME%\AppData\Roaming\Steam\CODEX\304240\remote&lt;br /&gt;
&lt;br /&gt;
Verknüpfung erstellen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mklink /D 304240 &amp;quot;c:\Users\chris\Saved Games\Resident Evil&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Resident Evil 2 ==&lt;br /&gt;
&lt;br /&gt;
%SystemDrive%\Users\Public\Documents\Steam\CODEX\883710&lt;br /&gt;
&lt;br /&gt;
Verknüpfung erstellen :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mklink /d 883710 &amp;quot;c:\Users\chris\Saved Games\Resident Evil 2&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Resident Evil 3 ==&lt;br /&gt;
&lt;br /&gt;
%SystemDrive%\Users\Public\Documents\Steam\CODEX\254700&lt;br /&gt;
&lt;br /&gt;
Verknüpfung erstellen :&lt;br /&gt;
&lt;br /&gt;
Windows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mklink /d 254700 &amp;quot;c:\Users\chris\Saved Games\Resident Evil 2&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Linux:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ln -s /media/chris/Saved\ Games/Resident\ Evil\ 3/ ~/.wine/drive_c/users/Public/Documents/Steam/CODEX/254700&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Resident Evil 4 ==&lt;br /&gt;
&lt;br /&gt;
Default : C:\ProgramData\Steam\%UserName%\%Appid%\&lt;br /&gt;
&lt;br /&gt;
Verknüpfung erstellen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mklink /d Delacroix &amp;quot;c:\Users\chris\Saved Games\Resident Evil 4&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Resident Evil 5 Gold ==&lt;br /&gt;
&lt;br /&gt;
%SystemDrive%\Users\%USERNAME%\AppData\Roaming\Steam\CODEX\21690\remote&lt;br /&gt;
&lt;br /&gt;
Verknüpfung erstellen :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mklink /D 21690 &amp;quot;c:\Users\chris\Saved Games\Resident Evil 5&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Resident Evil 6 ==&lt;br /&gt;
&lt;br /&gt;
Savegames müssen beim Importieren auf neuen Rechnern / Maschinen hexeditiert werden, sonst werden sie als korrupt gemeldet.&lt;br /&gt;
&lt;br /&gt;
* Neue Speicherdaten erstellen&lt;br /&gt;
* Neu erstellte savegame.bin mit hexeditor öffnen&lt;br /&gt;
* Offset 16-23 (Hex 10-17) kopieren&lt;br /&gt;
* alte savegame.bin mit hexeditor öffnen&lt;br /&gt;
* An Offset 16-23 (Hex 10-17) Werte von neu erstellter savegame.bin einfügen&lt;br /&gt;
&lt;br /&gt;
Version 1.0.6 (Ali123)&lt;br /&gt;
&lt;br /&gt;
c:\Resident Evil 6\Profile&lt;br /&gt;
&lt;br /&gt;
Verknüpfung erstellen :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mklink /D Profile &amp;quot;c:\Users\chris\Saved Games\Resident Evil 6&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Version 1.0.6 (RLD)&lt;br /&gt;
&lt;br /&gt;
C:\ProgramData\Steam\Delacroix&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mklink /D 221040 &amp;quot;C:\Users\chris\Saved Games\Resident Evil 6&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Resident Evil 7 ==&lt;br /&gt;
&lt;br /&gt;
Default : %DEFAULT_CPY_DIR% = %USERNAME%\Documents\CPY_SAVES\&amp;lt;PlayerName&amp;gt;\418370&lt;br /&gt;
&lt;br /&gt;
SavePath in c:\Resident Evil 7\cpy.ini ändern.&lt;br /&gt;
&lt;br /&gt;
== Resident Evil 7 Gold ==&lt;br /&gt;
&lt;br /&gt;
%SystemDrive%\Users\Public\Documents\Steam\CODEX\418370&lt;br /&gt;
&lt;br /&gt;
Verknüpfung erstellen :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mklink /D 418370 &amp;quot;c:\Users\chris\Saved Games\Resident Evil 7&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Resident Evil Revelations ==&lt;br /&gt;
&lt;br /&gt;
Windows&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
C:\users\chris\Local Settings\Application Data\FLT\Steam\222480\remote&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Linux&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~/.wine/drive_c/users/chris/AppData/Local/FLT/Steam/222480/remote&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Resident Evil Revelations 2 ==&lt;br /&gt;
&lt;br /&gt;
%SystemDrive%\Users\%USERNAME%\AppData\Roaming\Steam\CODEX\287290\remote&lt;br /&gt;
&lt;br /&gt;
Verknüpfung erstellen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mklink /D 287290 &amp;quot;c:\Users\chris\Saved Games\Resident Evil Revelations 2&amp;quot;&lt;br /&gt;
ln -s ~/WINE/Saved\ Games/Resident\ Evil\ Revelations\ 2 287290&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit Folder Redirections alles von Linux aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ln -s ../AppData/Roaming/Steam/CODEX/287290 Resident\ Evil\ Revelations\ 2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Linux&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~/.wine/drive_c/users/chris/AppData/Roaming/Steam/CODEX/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chris</name></author>
	</entry>
	<entry>
		<id>https://darkrealm-wiki.darkrealm.dyndns.org/index.php?title=Steam_Games_Directories&amp;diff=4849</id>
		<title>Steam Games Directories</title>
		<link rel="alternate" type="text/html" href="https://darkrealm-wiki.darkrealm.dyndns.org/index.php?title=Steam_Games_Directories&amp;diff=4849"/>
		<updated>2025-09-06T13:52:41Z</updated>

		<summary type="html">&lt;p&gt;Chris: /* Resident Evil 2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Resident Evil 0 HD Remaster ==&lt;br /&gt;
&lt;br /&gt;
%SystemDrive%\Users\%USERNAME%\AppData\Roaming\Steam\CODEX\339340\remote&lt;br /&gt;
&lt;br /&gt;
Verknüpfung erstellen :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mklink /D 339340 &amp;quot;c:\Users\chris\Saved Games\Resident Evil 0&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Resident Evil HD Remaster ==&lt;br /&gt;
&lt;br /&gt;
Default : %SystemDrive%\Users\%USERNAME%\AppData\Roaming\Steam\CODEX\304240\remote&lt;br /&gt;
&lt;br /&gt;
Verknüpfung erstellen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mklink /D 304240 &amp;quot;c:\Users\chris\Saved Games\Resident Evil&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Resident Evil 2 ==&lt;br /&gt;
&lt;br /&gt;
%SystemDrive%\Users\Public\Documents\Steam\CODEX\883710&lt;br /&gt;
&lt;br /&gt;
Verknüpfung erstellen :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mklink /d 883710 &amp;quot;c:\Users\chris\Saved Games\Resident Evil 2&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Resident Evil 3 ==&lt;br /&gt;
&lt;br /&gt;
%SystemDrive%\Users\Public\Documents\Steam\CODEX\254700&lt;br /&gt;
&lt;br /&gt;
Verknüpfung erstellen :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mklink /d 254700 &amp;quot;c:\Users\chris\Saved Games\Resident Evil 2&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Resident Evil 4 ==&lt;br /&gt;
&lt;br /&gt;
Default : C:\ProgramData\Steam\%UserName%\%Appid%\&lt;br /&gt;
&lt;br /&gt;
Verknüpfung erstellen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mklink /d Delacroix &amp;quot;c:\Users\chris\Saved Games\Resident Evil 4&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Resident Evil 5 Gold ==&lt;br /&gt;
&lt;br /&gt;
%SystemDrive%\Users\%USERNAME%\AppData\Roaming\Steam\CODEX\21690\remote&lt;br /&gt;
&lt;br /&gt;
Verknüpfung erstellen :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mklink /D 21690 &amp;quot;c:\Users\chris\Saved Games\Resident Evil 5&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Resident Evil 6 ==&lt;br /&gt;
&lt;br /&gt;
Savegames müssen beim Importieren auf neuen Rechnern / Maschinen hexeditiert werden, sonst werden sie als korrupt gemeldet.&lt;br /&gt;
&lt;br /&gt;
* Neue Speicherdaten erstellen&lt;br /&gt;
* Neu erstellte savegame.bin mit hexeditor öffnen&lt;br /&gt;
* Offset 16-23 (Hex 10-17) kopieren&lt;br /&gt;
* alte savegame.bin mit hexeditor öffnen&lt;br /&gt;
* An Offset 16-23 (Hex 10-17) Werte von neu erstellter savegame.bin einfügen&lt;br /&gt;
&lt;br /&gt;
Version 1.0.6 (Ali123)&lt;br /&gt;
&lt;br /&gt;
c:\Resident Evil 6\Profile&lt;br /&gt;
&lt;br /&gt;
Verknüpfung erstellen :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mklink /D Profile &amp;quot;c:\Users\chris\Saved Games\Resident Evil 6&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Version 1.0.6 (RLD)&lt;br /&gt;
&lt;br /&gt;
C:\ProgramData\Steam\Delacroix&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mklink /D 221040 &amp;quot;C:\Users\chris\Saved Games\Resident Evil 6&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Resident Evil 7 ==&lt;br /&gt;
&lt;br /&gt;
Default : %DEFAULT_CPY_DIR% = %USERNAME%\Documents\CPY_SAVES\&amp;lt;PlayerName&amp;gt;\418370&lt;br /&gt;
&lt;br /&gt;
SavePath in c:\Resident Evil 7\cpy.ini ändern.&lt;br /&gt;
&lt;br /&gt;
== Resident Evil 7 Gold ==&lt;br /&gt;
&lt;br /&gt;
%SystemDrive%\Users\Public\Documents\Steam\CODEX\418370&lt;br /&gt;
&lt;br /&gt;
Verknüpfung erstellen :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mklink /D 418370 &amp;quot;c:\Users\chris\Saved Games\Resident Evil 7&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Resident Evil Revelations ==&lt;br /&gt;
&lt;br /&gt;
Windows&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
C:\users\chris\Local Settings\Application Data\FLT\Steam\222480\remote&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Linux&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~/.wine/drive_c/users/chris/AppData/Local/FLT/Steam/222480/remote&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Resident Evil Revelations 2 ==&lt;br /&gt;
&lt;br /&gt;
%SystemDrive%\Users\%USERNAME%\AppData\Roaming\Steam\CODEX\287290\remote&lt;br /&gt;
&lt;br /&gt;
Verknüpfung erstellen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mklink /D 287290 &amp;quot;c:\Users\chris\Saved Games\Resident Evil Revelations 2&amp;quot;&lt;br /&gt;
ln -s ~/WINE/Saved\ Games/Resident\ Evil\ Revelations\ 2 287290&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit Folder Redirections alles von Linux aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ln -s ../AppData/Roaming/Steam/CODEX/287290 Resident\ Evil\ Revelations\ 2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Linux&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~/.wine/drive_c/users/chris/AppData/Roaming/Steam/CODEX/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chris</name></author>
	</entry>
	<entry>
		<id>https://darkrealm-wiki.darkrealm.dyndns.org/index.php?title=Visual_Pinball&amp;diff=4848</id>
		<title>Visual Pinball</title>
		<link rel="alternate" type="text/html" href="https://darkrealm-wiki.darkrealm.dyndns.org/index.php?title=Visual_Pinball&amp;diff=4848"/>
		<updated>2025-08-28T00:03:04Z</updated>

		<summary type="html">&lt;p&gt;Chris: /* BGFX Backend */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Linux Settings ==&lt;br /&gt;
&lt;br /&gt;
=== BGFX Backend ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PlayfieldDisplay = 2&lt;br /&gt;
BGSet = 1&lt;br /&gt;
ViewDTRotation = 90&lt;br /&gt;
ViewCabRotation = 90&lt;br /&gt;
&lt;br /&gt;
; Nudge&lt;br /&gt;
LRAxis = 0&lt;br /&gt;
LRAxisFlip = 0&lt;br /&gt;
UDAxis = 0&lt;br /&gt;
UDAxisFlip = 0&lt;br /&gt;
PBWEnabled = 0&lt;br /&gt;
PBWNormalMount = 0&lt;br /&gt;
PBWDefaultLayout = 1&lt;br /&gt;
PBWRotationCB = 0&lt;br /&gt;
PBWRotationvalue = 0&lt;br /&gt;
PBWAccelGainX = 0&lt;br /&gt;
PBWAccelGainY = 0&lt;br /&gt;
PBWAccelMaxX = 0&lt;br /&gt;
PBWAccelMaxY = 0&lt;br /&gt;
EnableNudgeFilter = 0&lt;br /&gt;
EnableLegacyNudge = 0&lt;br /&gt;
LegacyNudgeStrength = 0&lt;br /&gt;
AccelVelocityInput = 0&lt;br /&gt;
&lt;br /&gt;
; Tilt plumb&lt;br /&gt;
TiltSensCB = 0&lt;br /&gt;
TiltSensValue = 0&lt;br /&gt;
TiltInertia = 0&lt;br /&gt;
&lt;br /&gt;
; Plunger&lt;br /&gt;
PlungerAxis = 0&lt;br /&gt;
ReversePlungerAxis = 0&lt;br /&gt;
DeadZone = 0&lt;br /&gt;
PlungerRetract = 0&lt;br /&gt;
&lt;br /&gt;
; Joystick input mappings&lt;br /&gt;
JoyLFlipKey = 10&lt;br /&gt;
JoyRFlipKey = 11&lt;br /&gt;
JoyStagedLFlipKey = 0&lt;br /&gt;
JoyStagedRFlipKey = 0&lt;br /&gt;
JoyPlungerKey = 1&lt;br /&gt;
JoyAddCreditKey = 3&lt;br /&gt;
JoyAddCredit2Key = 0&lt;br /&gt;
JoyLMagnaSave = 0&lt;br /&gt;
JoyRMagnaSave = 0&lt;br /&gt;
JoyStartGameKey = 7&lt;br /&gt;
JoyExitGameKey = 0&lt;br /&gt;
JoyFrameCount = 0&lt;br /&gt;
JoyVolumeUp = 0&lt;br /&gt;
JoyVolumeDown = 0&lt;br /&gt;
JoyLTiltKey = 0&lt;br /&gt;
JoyCTiltKey = 0&lt;br /&gt;
JoyRTiltKey = 0&lt;br /&gt;
JoyMechTiltKey = 0&lt;br /&gt;
JoyDebugKey = 0&lt;br /&gt;
JoyDebuggerKey = 0&lt;br /&gt;
JoyCustom1 = &lt;br /&gt;
JoyCustom2 = &lt;br /&gt;
JoyCustom3 = &lt;br /&gt;
JoyCustom4 = &lt;br /&gt;
JoyPMBuyIn = &lt;br /&gt;
JoyPMCoin3 = &lt;br /&gt;
JoyPMCoin4 = &lt;br /&gt;
JoyPMCoinDoor = 5&lt;br /&gt;
JoyPMCancel = 14&lt;br /&gt;
JoyPMDown = 13&lt;br /&gt;
JoyPMUp = 12&lt;br /&gt;
JoyPMEnter = 15&lt;br /&gt;
JoyLockbarKey = 0&lt;br /&gt;
JoyTableRecenterKey = 0&lt;br /&gt;
JoyTableUpKey = 0&lt;br /&gt;
JoyTableDownKey = 0&lt;br /&gt;
JoyPauseKey = 0&lt;br /&gt;
JoyTweakKey = 0&lt;br /&gt;
&lt;br /&gt;
[ScoreView]&lt;br /&gt;
ScoreViewDisplay = &lt;br /&gt;
ScoreViewFullScreen = 0&lt;br /&gt;
; Output mode&lt;br /&gt;
; 0 - Disabled&lt;br /&gt;
; 1 - Embedded in another output&lt;br /&gt;
; 2 - Native system window (maybe a window, exclusive fullscreen, VR headset,...)&lt;br /&gt;
ScoreViewOutput = 2&lt;br /&gt;
ScoreViewWndX = 1920&lt;br /&gt;
ScoreViewWndY = 0&lt;br /&gt;
ScoreViewWidth = 1600&lt;br /&gt;
ScoreViewHeight = 900&lt;br /&gt;
; ScoreView Priority (Highest wins)&lt;br /&gt;
Priority.B2SLegacyDMD = &lt;br /&gt;
Priority.ScoreView = &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chris</name></author>
	</entry>
	<entry>
		<id>https://darkrealm-wiki.darkrealm.dyndns.org/index.php?title=Visual_Pinball&amp;diff=4847</id>
		<title>Visual Pinball</title>
		<link rel="alternate" type="text/html" href="https://darkrealm-wiki.darkrealm.dyndns.org/index.php?title=Visual_Pinball&amp;diff=4847"/>
		<updated>2025-08-27T22:59:06Z</updated>

		<summary type="html">&lt;p&gt;Chris: /* BGFX Backend */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Linux Settings ==&lt;br /&gt;
&lt;br /&gt;
=== BGFX Backend ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PlayfieldDisplay = 2&lt;br /&gt;
BGSet = 1&lt;br /&gt;
ViewDTRotation = 90&lt;br /&gt;
ViewCabRotation = 90&lt;br /&gt;
&lt;br /&gt;
; Nudge&lt;br /&gt;
LRAxis = 0&lt;br /&gt;
LRAxisFlip = 0&lt;br /&gt;
UDAxis = 0&lt;br /&gt;
UDAxisFlip = 0&lt;br /&gt;
PBWEnabled = 0&lt;br /&gt;
PBWNormalMount = 0&lt;br /&gt;
PBWDefaultLayout = 1&lt;br /&gt;
PBWRotationCB = 0&lt;br /&gt;
PBWRotationvalue = 0&lt;br /&gt;
PBWAccelGainX = 0&lt;br /&gt;
PBWAccelGainY = 0&lt;br /&gt;
PBWAccelMaxX = 0&lt;br /&gt;
PBWAccelMaxY = 0&lt;br /&gt;
EnableNudgeFilter = 0&lt;br /&gt;
EnableLegacyNudge = 0&lt;br /&gt;
LegacyNudgeStrength = 0&lt;br /&gt;
AccelVelocityInput = 0&lt;br /&gt;
&lt;br /&gt;
; Tilt plumb&lt;br /&gt;
TiltSensCB = 0&lt;br /&gt;
TiltSensValue = 0&lt;br /&gt;
TiltInertia = 0&lt;br /&gt;
&lt;br /&gt;
; Plunger&lt;br /&gt;
PlungerAxis = 0&lt;br /&gt;
ReversePlungerAxis = 0&lt;br /&gt;
DeadZone = 0&lt;br /&gt;
PlungerRetract = 0&lt;br /&gt;
&lt;br /&gt;
; Joystick input mappings&lt;br /&gt;
JoyLFlipKey = 10&lt;br /&gt;
JoyRFlipKey = 11&lt;br /&gt;
JoyStagedLFlipKey = 0&lt;br /&gt;
JoyStagedRFlipKey = 0&lt;br /&gt;
JoyPlungerKey = 1&lt;br /&gt;
JoyAddCreditKey = 3&lt;br /&gt;
JoyAddCredit2Key = 0&lt;br /&gt;
JoyLMagnaSave = 0&lt;br /&gt;
JoyRMagnaSave = 0&lt;br /&gt;
JoyStartGameKey = 7&lt;br /&gt;
JoyExitGameKey = 0&lt;br /&gt;
JoyFrameCount = 0&lt;br /&gt;
JoyVolumeUp = 0&lt;br /&gt;
JoyVolumeDown = 0&lt;br /&gt;
JoyLTiltKey = 0&lt;br /&gt;
JoyCTiltKey = 0&lt;br /&gt;
JoyRTiltKey = 0&lt;br /&gt;
JoyMechTiltKey = 0&lt;br /&gt;
JoyDebugKey = 0&lt;br /&gt;
JoyDebuggerKey = 0&lt;br /&gt;
JoyCustom1 = &lt;br /&gt;
JoyCustom2 = &lt;br /&gt;
JoyCustom3 = &lt;br /&gt;
JoyCustom4 = &lt;br /&gt;
JoyPMBuyIn = &lt;br /&gt;
JoyPMCoin3 = &lt;br /&gt;
JoyPMCoin4 = &lt;br /&gt;
JoyPMCoinDoor = 5&lt;br /&gt;
JoyPMCancel = 14&lt;br /&gt;
JoyPMDown = 13&lt;br /&gt;
JoyPMUp = 12&lt;br /&gt;
JoyPMEnter = 15&lt;br /&gt;
JoyLockbarKey = 0&lt;br /&gt;
JoyTableRecenterKey = 0&lt;br /&gt;
JoyTableUpKey = 0&lt;br /&gt;
JoyTableDownKey = 0&lt;br /&gt;
JoyPauseKey = 0&lt;br /&gt;
JoyTweakKey = 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chris</name></author>
	</entry>
	<entry>
		<id>https://darkrealm-wiki.darkrealm.dyndns.org/index.php?title=Visual_Pinball&amp;diff=4846</id>
		<title>Visual Pinball</title>
		<link rel="alternate" type="text/html" href="https://darkrealm-wiki.darkrealm.dyndns.org/index.php?title=Visual_Pinball&amp;diff=4846"/>
		<updated>2025-08-27T22:14:51Z</updated>

		<summary type="html">&lt;p&gt;Chris: /* BGFX Backend */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Linux Settings ==&lt;br /&gt;
&lt;br /&gt;
=== BGFX Backend ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PlayfieldDisplay = 2&lt;br /&gt;
BGSet = 1&lt;br /&gt;
ViewDTRotation = 90&lt;br /&gt;
ViewCabRotation = 90&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chris</name></author>
	</entry>
	<entry>
		<id>https://darkrealm-wiki.darkrealm.dyndns.org/index.php?title=Visual_Pinball&amp;diff=4845</id>
		<title>Visual Pinball</title>
		<link rel="alternate" type="text/html" href="https://darkrealm-wiki.darkrealm.dyndns.org/index.php?title=Visual_Pinball&amp;diff=4845"/>
		<updated>2025-08-27T22:14:25Z</updated>

		<summary type="html">&lt;p&gt;Chris: Die Seite wurde neu angelegt: „== Linux Settings ==  === BGFX Backend ===  PlayfieldDisplay = 2 BGSet = 1 ViewDTRotation = 90 ViewCabRotation = 90“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Linux Settings ==&lt;br /&gt;
&lt;br /&gt;
=== BGFX Backend ===&lt;br /&gt;
&lt;br /&gt;
PlayfieldDisplay = 2&lt;br /&gt;
BGSet = 1&lt;br /&gt;
ViewDTRotation = 90&lt;br /&gt;
ViewCabRotation = 90&lt;/div&gt;</summary>
		<author><name>Chris</name></author>
	</entry>
	<entry>
		<id>https://darkrealm-wiki.darkrealm.dyndns.org/index.php?title=Paperless-ngx&amp;diff=4844</id>
		<title>Paperless-ngx</title>
		<link rel="alternate" type="text/html" href="https://darkrealm-wiki.darkrealm.dyndns.org/index.php?title=Paperless-ngx&amp;diff=4844"/>
		<updated>2025-08-17T22:36:47Z</updated>

		<summary type="html">&lt;p&gt;Chris: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Installation ==&lt;br /&gt;
&lt;br /&gt;
* sudo lxc-create -n paperless-ngx -B zfs -t download -- --dist debian --release bookworm --arch amd64&lt;br /&gt;
&lt;br /&gt;
* dpkg-reconfigure tzdata&lt;br /&gt;
* dpkg-reconfigure locales&lt;br /&gt;
* apt install python3 python3-pip python3-dev imagemagick fonts-liberation gnupg libpq-dev default-libmysqlclient-dev pkg-config libmagic-dev mime-support libzbar0 poppler-utils apt-transport-https man-db vim bash-completion openssh-server unpaper ghostscript icc-profiles-free qpdf liblept5 libxml2 pngquant zlib1g tesseract-ocr redis tesseract-ocr-deu git locate curl wget python3.11-venv emacs-nox autoconf libtool libleptonica-dev curl wget vim sudo mariadb-server&lt;br /&gt;
* adduser paperless --system --home /opt/paperless-ngx --group&lt;br /&gt;
* curl -O -L https://github.com/paperless-ngx/paperless-ngx/releases/download/v2.1.3/paperless-ngx-v2.1.3.tar.xz&lt;br /&gt;
* tar -xf paperless-ngx-v2.1.3.tar.xz -C/opt/&lt;br /&gt;
* cd /opt/paperless-ngx&lt;br /&gt;
* mkdir media&lt;br /&gt;
* mkdir data&lt;br /&gt;
* mkdir consume&lt;br /&gt;
* chown -R paperless:paperless .&lt;br /&gt;
* chown paperless:paperless media&lt;br /&gt;
* chown paperless:paperless data&lt;br /&gt;
* chown paperless:paperless consume&lt;br /&gt;
* sudo -Hu paperless python3 -m venv venv-paperless-ngx&lt;br /&gt;
* sudo -Hu paperless -s&lt;br /&gt;
* . venv-paperless-ngx/bin/activate&lt;br /&gt;
* pip3 install -r requirements.txt&lt;br /&gt;
* cd src&lt;br /&gt;
* vim /opt/paperless-ngx/paperless.conf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Have a look at the docs for documentation.&lt;br /&gt;
# https://docs.paperless-ngx.com/configuration/&lt;br /&gt;
&lt;br /&gt;
# Debug. Only enable this for development.&lt;br /&gt;
&lt;br /&gt;
#PAPERLESS_DEBUG=false&lt;br /&gt;
&lt;br /&gt;
# Required services&lt;br /&gt;
&lt;br /&gt;
PAPERLESS_REDIS=redis://localhost:6379&lt;br /&gt;
PAPERLESS_DBENGINE=mariadb&lt;br /&gt;
PAPERLESS_DBHOST=shodan.intern.darkrealm.dyndns.org&lt;br /&gt;
PAPERLESS_DBPORT=3306&lt;br /&gt;
PAPERLESS_DBNAME=paperless&lt;br /&gt;
PAPERLESS_DBUSER=paperless&lt;br /&gt;
PAPERLESS_DBPASS=paperless&lt;br /&gt;
PAPERLESS_DBSSLMODE=DISABLED&lt;br /&gt;
&lt;br /&gt;
# Paths and folders&lt;br /&gt;
&lt;br /&gt;
#PAPERLESS_CONSUMPTION_DIR=../consume&lt;br /&gt;
#PAPERLESS_DATA_DIR=../data&lt;br /&gt;
#PAPERLESS_TRASH_DIR=../trash&lt;br /&gt;
#PAPERLESS_MEDIA_ROOT=../media&lt;br /&gt;
PAPERLESS_CONSUMPTION_DIR=/mnt/storage/dms/consume&lt;br /&gt;
PAPERLESS_DATA_DIR=/mnt/storage/dms/data&lt;br /&gt;
PAPERLESS_TRASH_DIR=/mnt/storage/dms/trash&lt;br /&gt;
PAPERLESS_MEDIA_ROOT=/mnt/storage/dms/media&lt;br /&gt;
PAPERLESS_STATICDIR=../static&lt;br /&gt;
#PAPERLESS_FILENAME_FORMAT=&lt;br /&gt;
PAPERLESS_FILENAME_FORMAT={{owner_username}}/{{correspondent}}/{{document_type}}/{{created_year}}/{{title}}&lt;br /&gt;
PAPERLESS_FILENAME_FORMAT_REMOVE_NONE=true&lt;br /&gt;
&lt;br /&gt;
# Security and hosting&lt;br /&gt;
&lt;br /&gt;
PAPERLESS_SECRET_KEY=Peem7AhD&lt;br /&gt;
PAPERLESS_URL=https://paperless.darkrealm.dyndns.org&lt;br /&gt;
#PAPERLESS_CSRF_TRUSTED_ORIGINS=https://example.com # can be set using PAPERLESS_URL&lt;br /&gt;
#PAPERLESS_ALLOWED_HOSTS=example.com,www.example.com # can be set using PAPERLESS_URL&lt;br /&gt;
#PAPERLESS_CORS_ALLOWED_HOSTS=https://localhost:8080,https://example.com # can be set using PAPERLESS_URL&lt;br /&gt;
#PAPERLESS_FORCE_SCRIPT_NAME=&lt;br /&gt;
#PAPERLESS_STATIC_URL=/static/&lt;br /&gt;
#PAPERLESS_AUTO_LOGIN_USERNAME=&lt;br /&gt;
#PAPERLESS_COOKIE_PREFIX=&lt;br /&gt;
#PAPERLESS_ENABLE_HTTP_REMOTE_USER=false&lt;br /&gt;
&lt;br /&gt;
# OCR settings&lt;br /&gt;
&lt;br /&gt;
PAPERLESS_OCR_LANGUAGE=eng+deu&lt;br /&gt;
#PAPERLESS_OCR_MODE=skip&lt;br /&gt;
#PAPERLESS_OCR_SKIP_ARCHIVE_FILE=never&lt;br /&gt;
#PAPERLESS_OCR_OUTPUT_TYPE=pdfa&lt;br /&gt;
#PAPERLESS_OCR_PAGES=1&lt;br /&gt;
#PAPERLESS_OCR_IMAGE_DPI=300&lt;br /&gt;
#PAPERLESS_OCR_CLEAN=clean&lt;br /&gt;
#PAPERLESS_OCR_DESKEW=true&lt;br /&gt;
#PAPERLESS_OCR_ROTATE_PAGES=true&lt;br /&gt;
#PAPERLESS_OCR_ROTATE_PAGES_THRESHOLD=4&lt;br /&gt;
#PAPERLESS_OCR_USER_ARGS={}&lt;br /&gt;
#PAPERLESS_CONVERT_MEMORY_LIMIT=0&lt;br /&gt;
#PAPERLESS_CONVERT_TMPDIR=/var/tmp/paperless&lt;br /&gt;
&lt;br /&gt;
PAPERLESS_ENABLE_NLTK=true&lt;br /&gt;
#PAPERLESS_NLTK_DIR=../nltk_data&lt;br /&gt;
PAPERLESS_NLTK_DIR=/mnt/storage/dms/nltk_data&lt;br /&gt;
# Software tweaks&lt;br /&gt;
&lt;br /&gt;
#PAPERLESS_TASK_WORKERS=1&lt;br /&gt;
#PAPERLESS_THREADS_PER_WORKER=1&lt;br /&gt;
PAPERLESS_TIME_ZONE=Europe/Berlin&lt;br /&gt;
#PAPERLESS_CONSUMER_POLLING=10&lt;br /&gt;
#PAPERLESS_CONSUMER_DELETE_DUPLICATES=false&lt;br /&gt;
PAPERLESS_CONSUMER_RECURSIVE=true&lt;br /&gt;
#PAPERLESS_CONSUMER_IGNORE_PATTERNS=[&amp;quot;.DS_STORE/*&amp;quot;, &amp;quot;._*&amp;quot;, &amp;quot;.stfolder/*&amp;quot;, &amp;quot;.stversions/*&amp;quot;, &amp;quot;.localized/*&amp;quot;, &amp;quot;desktop.ini&amp;quot;]&lt;br /&gt;
#PAPERLESS_CONSUMER_SUBDIRS_AS_TAGS=false&lt;br /&gt;
PAPERLESS_CONSUMER_ENABLE_BARCODES=true&lt;br /&gt;
#PAPERLESS_CONSUMER_BARCODE_STRING=PATCHT&lt;br /&gt;
#PAPERLESS_CONSUMER_BARCODE_UPSCALE=0.0&lt;br /&gt;
#PAPERLESS_CONSUMER_BARCODE_DPI=300&lt;br /&gt;
#PAPERLESS_CONSUMER_ENABLE_COLLATE_DOUBLE_SIDED=false&lt;br /&gt;
#PAPERLESS_CONSUMER_COLLATE_DOUBLE_SIDED_SUBDIR_NAME=double-sided&lt;br /&gt;
#PAPERLESS_CONSUMER_COLLATE_DOUBLE_SIDED_TIFF_SUPPORT=false&lt;br /&gt;
#PAPERLESS_PRE_CONSUME_SCRIPT=/path/to/an/arbitrary/script.sh&lt;br /&gt;
#PAPERLESS_POST_CONSUME_SCRIPT=/path/to/an/arbitrary/script.sh&lt;br /&gt;
#PAPERLESS_FILENAME_DATE_ORDER=YMD&lt;br /&gt;
#PAPERLESS_FILENAME_PARSE_TRANSFORMS=[]&lt;br /&gt;
#PAPERLESS_NUMBER_OF_SUGGESTED_DATES=5&lt;br /&gt;
#PAPERLESS_THUMBNAIL_FONT_NAME=&lt;br /&gt;
#PAPERLESS_IGNORE_DATES=&lt;br /&gt;
#PAPERLESS_ENABLE_UPDATE_CHECK=&lt;br /&gt;
&lt;br /&gt;
# Tika settings&lt;br /&gt;
&lt;br /&gt;
PAPERLESS_TIKA_ENABLED=true&lt;br /&gt;
PAPERLESS_TIKA_ENDPOINT=http://localhost:9998&lt;br /&gt;
PAPERLESS_TIKA_GOTENBERG_ENDPOINT=http://localhost:3000&lt;br /&gt;
&lt;br /&gt;
# Binaries&lt;br /&gt;
&lt;br /&gt;
#PAPERLESS_CONVERT_BINARY=/usr/bin/convert&lt;br /&gt;
#PAPERLESS_GS_BINARY=/usr/bin/gs&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* DB und User erstellen&lt;br /&gt;
&lt;br /&gt;
* sudo -Hu paperless python3 manage.py migrate&lt;br /&gt;
* sudo -Hu paperless python3 manage.py createsuperuser&lt;br /&gt;
* cp -av ../scripts/*.service /etc/systemd/system/&lt;br /&gt;
* cp -av ../scripts/*.socket /etc/systemd/system/&lt;br /&gt;
* systemctl daemon-reload&lt;br /&gt;
&lt;br /&gt;
ImageMagick Policy in /etc/ImageMagick-6/policy.xml anpassen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  &amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;read|write&amp;quot; pattern=&amp;quot;PDF&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
JBIG2ENC compilen:&lt;br /&gt;
* git clone https://github.com/agl/jbig2enc&lt;br /&gt;
* cd jbig2enc&lt;br /&gt;
* ./autogen.sh&lt;br /&gt;
* ./configure&lt;br /&gt;
* make&lt;br /&gt;
* make install&lt;br /&gt;
&lt;br /&gt;
NLTK installieren&lt;br /&gt;
* sudo -Hu paperless -s&lt;br /&gt;
* . venv-paperless-ngx/bin/activate&lt;br /&gt;
* python3&lt;br /&gt;
* import nltk&lt;br /&gt;
* nltk.download() (Nach /opt/paperless-ngx/nltk_data herunterladen)&lt;br /&gt;
* punkt, snowball_data und stopwords runterladen&lt;br /&gt;
&lt;br /&gt;
Apache Tika und Gotenberg installieren (momentan über Docker)&lt;br /&gt;
* apt install docker-compose&lt;br /&gt;
* docker run -d -p 127.0.0.1:9998:9998 apache/tika&lt;br /&gt;
* docker run -d -p 127.0.0.1:3000:3000 gotenberg/gotenberg:8&lt;br /&gt;
&lt;br /&gt;
== Update ==&lt;br /&gt;
&lt;br /&gt;
* wget aktuellstes tar.xz&lt;br /&gt;
* systemctl stop paperless-*&lt;br /&gt;
* tar -xf &amp;lt;release.tar.xz&amp;gt; -C/opt/&lt;br /&gt;
* cd /opt/paperless-ngx&lt;br /&gt;
* cp -av paperless.conf.keep paperless.conf&lt;br /&gt;
* chown paperless:paperless . -R&lt;br /&gt;
* sudo -Hu paperless -s&lt;br /&gt;
* source /opt/paperless-ngx/venv-paperless-ngx/bin/activate&lt;br /&gt;
* pip install -r requirements.txt&lt;br /&gt;
* cd src&lt;br /&gt;
* python3 manage.py migrate&lt;br /&gt;
&lt;br /&gt;
== Fixes ==&lt;br /&gt;
&lt;br /&gt;
=== NLTK Fix ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo -Hu paperless -s&lt;br /&gt;
source /opt/paperless-ngx/venv-paperless-ngx/bin/activate&lt;br /&gt;
cd src&lt;br /&gt;
python3 -W ignore::RuntimeWarning -m nltk.downloader -d &amp;quot;/mnt/storage/dms/nltk_data&amp;quot; punkt_tab&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Logs show &amp;quot;possible incompatible database column&amp;quot; when deleting documents ===&lt;br /&gt;
&lt;br /&gt;
You may see errors when deleting documents like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Data too long for column &#039;transaction_id&#039; at row 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This error can occur in installations which have upgraded from a version of Paperless-ngx that used Django 4 (Paperless-ngx versions prior to v2.13.0) with a MariaDB/MySQL database. Due to the backawards-incompatible change in Django 5, the column &amp;quot;documents_document.transaction_id&amp;quot; will need to be re-created, which can be done with a one-time run of the following management command:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo -Hu paperless -s&lt;br /&gt;
source /opt/paperless-ngx/venv-paperless-ngx/bin/activate&lt;br /&gt;
cd src&lt;br /&gt;
python3 manage.py convert_mariadb_uuid&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Komplette Neuinstallation inkl. Komplettrestore ==&lt;br /&gt;
&lt;br /&gt;
* lxc init images:debian/12 paperless-ngx&lt;br /&gt;
* lxc start papalass&lt;br /&gt;
* lxc shell papalass&lt;br /&gt;
* passwd&lt;br /&gt;
&lt;br /&gt;
Anschliessend vorgehen wie bei [[#Installation]]&lt;br /&gt;
&lt;br /&gt;
* die gesicherte ZIP-Datei des exports auf den neuen Paperless-Server kopieren und nach /temp entpacken&lt;br /&gt;
* sudo -Hu paperless -s&lt;br /&gt;
* source /opt/paperless-ngx/venv-paperless-ngx/bin/activate&lt;br /&gt;
* cd src&lt;br /&gt;
* python3 manage.py document_importer /temp/&lt;/div&gt;</summary>
		<author><name>Chris</name></author>
	</entry>
	<entry>
		<id>https://darkrealm-wiki.darkrealm.dyndns.org/index.php?title=Multicast&amp;diff=4843</id>
		<title>Multicast</title>
		<link rel="alternate" type="text/html" href="https://darkrealm-wiki.darkrealm.dyndns.org/index.php?title=Multicast&amp;diff=4843"/>
		<updated>2025-07-21T19:00:02Z</updated>

		<summary type="html">&lt;p&gt;Chris: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Multicast über Wireguard ==&lt;br /&gt;
&lt;br /&gt;
Voraussetzungen:&lt;br /&gt;
&lt;br /&gt;
* Multicast muss für das WG Interface aktiviert sein&lt;br /&gt;
* Über Kommanzozeile:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ip l set WG multicast on&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Über systemd-networkd:&lt;br /&gt;
&lt;br /&gt;
WG.network&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Link]&lt;br /&gt;
Multicast=true&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Multicast-IP-Adressen müssen bei den AllowedIPs dabei sein:&lt;br /&gt;
&lt;br /&gt;
WG.netdev&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
AllowedIPs=224.0.0.0/4,ff00::/8&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Achtung: Wird im .netdev-File etwas geändert muss das Interface erst gelöscht und wieder erstellt werden damit die Änderungen greifen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
networkctl delete WG&lt;br /&gt;
networkctl reload&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== mDNS ===&lt;br /&gt;
&lt;br /&gt;
Über Avahi können mDNS-Abfragen &amp;quot;reflektiert&amp;quot; (in andere Subnetze weitergeleitet) werden. Wenn es sich beim dem Interface um ein Point-to-Point Interface handelt (Wireguard-Interfaces sind Point-to-Point Interfaces) muss dies auch noch erlaubt werden.&lt;br /&gt;
&lt;br /&gt;
/etc/avahi/avahi-daemon.conf:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[server]&lt;br /&gt;
allow-point-to-point=yes # Bei Point-to-Point Interfaces nötig&lt;br /&gt;
&lt;br /&gt;
[reflector]&lt;br /&gt;
enable-reflector=yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Netzwerk A möchte die mDNS-Geräte in Netzwerk B sehen:&lt;br /&gt;
&lt;br /&gt;
reflector auf Host B aktivieren.&lt;br /&gt;
&lt;br /&gt;
Netzwerk B möchte die mDNS-Geräte in Netzwerk A sehen:&lt;br /&gt;
&lt;br /&gt;
reflector auf Host A aktivieren.&lt;br /&gt;
&lt;br /&gt;
Damit die Geräte auch auf den Hosts hinter dem Gateway gesehen werden können muss auf dem jeweiligen Gateway auch der Reflector aktiviert werden.&lt;br /&gt;
&lt;br /&gt;
=== SSDP / UPnP / DLNA ===&lt;br /&gt;
&lt;br /&gt;
SSDP hat mit mDNS nichts zu tun, kann also auch nicht über den avahi-daemon reflector weitergeleitet werden. Es muss ein Multicast-Router verwendet werden, hier: smcroute&lt;br /&gt;
&lt;br /&gt;
/etc/smcroute.conf:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
phyint WG enable&lt;br /&gt;
phyint BRIDGE_LAN enable&lt;br /&gt;
&lt;br /&gt;
# SSDP&lt;br /&gt;
mgroup from BRIDGE_LAN group 239.255.255.250&lt;br /&gt;
mroute from BRIDGE_LAN group 239.255.255.250 to WG&lt;br /&gt;
mgroup from WG group 239.255.255.250&lt;br /&gt;
mroute from WG group 239.255.255.250 to BRIDGE_LAN&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Netzwerk A möchte die UPnP-Geräte in Netzwerk B sehen:&lt;br /&gt;
&lt;br /&gt;
smcroute auf Host A starten.&lt;br /&gt;
&lt;br /&gt;
Netzwerk B möchte die UPnP-Geräte in Netzwerk A sehen:&lt;br /&gt;
&lt;br /&gt;
smcroute auf Host B starten.&lt;br /&gt;
&lt;br /&gt;
=== Geräte hinter dem Router ===&lt;br /&gt;
&lt;br /&gt;
Damit die Geräte hinter dem Router von den Multicast-Paketen erreicht werden können:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ip r add 192.168.1.0/24 dev WG&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ip r add 192.168.178.0/24 dev WG&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
IPv4 Forwarding muss aktiviert sein, sowie forwarding in the Firewall muss akzeptiert werden!&lt;br /&gt;
&lt;br /&gt;
=== Wireguard Debugging aktivieren ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo module wireguard +p &amp;gt; /sys/kernel/debug/dynamic_debug/control&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chris</name></author>
	</entry>
	<entry>
		<id>https://darkrealm-wiki.darkrealm.dyndns.org/index.php?title=Multicast&amp;diff=4842</id>
		<title>Multicast</title>
		<link rel="alternate" type="text/html" href="https://darkrealm-wiki.darkrealm.dyndns.org/index.php?title=Multicast&amp;diff=4842"/>
		<updated>2025-07-19T02:38:47Z</updated>

		<summary type="html">&lt;p&gt;Chris: /* Geräte hinter dem Router */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Multicast über Wireguard ==&lt;br /&gt;
&lt;br /&gt;
Voraussetzungen:&lt;br /&gt;
&lt;br /&gt;
* Multicast muss für das WG Interface aktiviert sein&lt;br /&gt;
* Über Kommanzozeile:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ip l set WG multicast on&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Über systemd-networkd:&lt;br /&gt;
&lt;br /&gt;
WG.network&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Link]&lt;br /&gt;
Multicast=true&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Multicast-IP-Adressen müssen bei den AllowedIPs dabei sein:&lt;br /&gt;
&lt;br /&gt;
WG.netdev&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
AllowedIPs=224.0.0.0/4,ff00::/8&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Achtung: Wird im .netdev-File etwas geändert muss das Interface erst gelöscht und wieder erstellt werden damit die Änderungen greifen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
networkctl delete WG&lt;br /&gt;
networkctl reload&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== mDNS ===&lt;br /&gt;
&lt;br /&gt;
Über Avahi können mDNS-Abfragen &amp;quot;reflektiert&amp;quot; (in andere Subnetze weitergeleitet) werden. Wenn es sich beim dem Interface um ein Point-to-Point Interface handelt (Wireguard-Interfaces sind Point-to-Point Interfaces) muss dies auch noch erlaubt werden.&lt;br /&gt;
&lt;br /&gt;
/etc/avahi/avahi-daemon.conf:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[server]&lt;br /&gt;
allow-point-to-point=yes # Bei Point-to-Point Interfaces nötig&lt;br /&gt;
&lt;br /&gt;
[reflector]&lt;br /&gt;
enable-reflector=yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Netzwerk A möchte die mDNS-Geräte in Netzwerk B sehen:&lt;br /&gt;
&lt;br /&gt;
reflector auf Host B aktivieren.&lt;br /&gt;
&lt;br /&gt;
Netzwerk B möchte die mDNS-Geräte in Netzwerk A sehen:&lt;br /&gt;
&lt;br /&gt;
reflector auf Host A aktivieren.&lt;br /&gt;
&lt;br /&gt;
Damit die Geräte auch auf den Hosts hinter dem Gateway gesehen werden können muss auf dem jeweiligen Gateway auch der Reflector aktiviert werden.&lt;br /&gt;
&lt;br /&gt;
=== SSDP / UPnP / DLNA ===&lt;br /&gt;
&lt;br /&gt;
SSDP hat mit mDNS nichts zu tun, kann also auch nicht über den avahi-daemon reflector weitergeleitet werden. Es muss ein Multicast-Router verwendet werden, hier: smcroute&lt;br /&gt;
&lt;br /&gt;
/etc/smcroute.conf:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
phyint WG enable&lt;br /&gt;
phyint BRIDGE_LAN enable&lt;br /&gt;
&lt;br /&gt;
# SSDP&lt;br /&gt;
mgroup from BRIDGE_LAN group 239.255.255.250&lt;br /&gt;
mroute from BRIDGE_LAN group 239.255.255.250 to WG&lt;br /&gt;
mgroup from WG group 239.255.255.250&lt;br /&gt;
mroute from WG group 239.255.255.250 to BRIDGE_LAN&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Netzwerk A möchte die UPnP-Geräte in Netzwerk B sehen:&lt;br /&gt;
&lt;br /&gt;
smcroute auf Host A starten.&lt;br /&gt;
&lt;br /&gt;
Netzwerk B möchte die UPnP-Geräte in Netzwerk A sehen:&lt;br /&gt;
&lt;br /&gt;
smcroute auf Host B starten.&lt;br /&gt;
&lt;br /&gt;
=== Geräte hinter dem Router ===&lt;br /&gt;
&lt;br /&gt;
Damit die Geräte hinter dem Router von den Multicast-Paketen erreicht werden können:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ip r add 192.168.1.0/24 dev WG&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ip r add 192.168.178.0/24 dev WG&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
IPv4 Forwarding muss aktiviert sein, sowie forwarding in the Firewall muss akzeptiert werden!&lt;/div&gt;</summary>
		<author><name>Chris</name></author>
	</entry>
	<entry>
		<id>https://darkrealm-wiki.darkrealm.dyndns.org/index.php?title=Multicast&amp;diff=4841</id>
		<title>Multicast</title>
		<link rel="alternate" type="text/html" href="https://darkrealm-wiki.darkrealm.dyndns.org/index.php?title=Multicast&amp;diff=4841"/>
		<updated>2025-07-18T23:34:13Z</updated>

		<summary type="html">&lt;p&gt;Chris: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Multicast über Wireguard ==&lt;br /&gt;
&lt;br /&gt;
Voraussetzungen:&lt;br /&gt;
&lt;br /&gt;
* Multicast muss für das WG Interface aktiviert sein&lt;br /&gt;
* Über Kommanzozeile:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ip l set WG multicast on&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Über systemd-networkd:&lt;br /&gt;
&lt;br /&gt;
WG.network&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Link]&lt;br /&gt;
Multicast=true&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Multicast-IP-Adressen müssen bei den AllowedIPs dabei sein:&lt;br /&gt;
&lt;br /&gt;
WG.netdev&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
AllowedIPs=224.0.0.0/4,ff00::/8&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Achtung: Wird im .netdev-File etwas geändert muss das Interface erst gelöscht und wieder erstellt werden damit die Änderungen greifen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
networkctl delete WG&lt;br /&gt;
networkctl reload&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== mDNS ===&lt;br /&gt;
&lt;br /&gt;
Über Avahi können mDNS-Abfragen &amp;quot;reflektiert&amp;quot; (in andere Subnetze weitergeleitet) werden. Wenn es sich beim dem Interface um ein Point-to-Point Interface handelt (Wireguard-Interfaces sind Point-to-Point Interfaces) muss dies auch noch erlaubt werden.&lt;br /&gt;
&lt;br /&gt;
/etc/avahi/avahi-daemon.conf:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[server]&lt;br /&gt;
allow-point-to-point=yes # Bei Point-to-Point Interfaces nötig&lt;br /&gt;
&lt;br /&gt;
[reflector]&lt;br /&gt;
enable-reflector=yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Netzwerk A möchte die mDNS-Geräte in Netzwerk B sehen:&lt;br /&gt;
&lt;br /&gt;
reflector auf Host B aktivieren.&lt;br /&gt;
&lt;br /&gt;
Netzwerk B möchte die mDNS-Geräte in Netzwerk A sehen:&lt;br /&gt;
&lt;br /&gt;
reflector auf Host A aktivieren.&lt;br /&gt;
&lt;br /&gt;
Damit die Geräte auch auf den Hosts hinter dem Gateway gesehen werden können muss auf dem jeweiligen Gateway auch der Reflector aktiviert werden.&lt;br /&gt;
&lt;br /&gt;
=== SSDP / UPnP / DLNA ===&lt;br /&gt;
&lt;br /&gt;
SSDP hat mit mDNS nichts zu tun, kann also auch nicht über den avahi-daemon reflector weitergeleitet werden. Es muss ein Multicast-Router verwendet werden, hier: smcroute&lt;br /&gt;
&lt;br /&gt;
/etc/smcroute.conf:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
phyint WG enable&lt;br /&gt;
phyint BRIDGE_LAN enable&lt;br /&gt;
&lt;br /&gt;
# SSDP&lt;br /&gt;
mgroup from BRIDGE_LAN group 239.255.255.250&lt;br /&gt;
mroute from BRIDGE_LAN group 239.255.255.250 to WG&lt;br /&gt;
mgroup from WG group 239.255.255.250&lt;br /&gt;
mroute from WG group 239.255.255.250 to BRIDGE_LAN&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Netzwerk A möchte die UPnP-Geräte in Netzwerk B sehen:&lt;br /&gt;
&lt;br /&gt;
smcroute auf Host A starten.&lt;br /&gt;
&lt;br /&gt;
Netzwerk B möchte die UPnP-Geräte in Netzwerk A sehen:&lt;br /&gt;
&lt;br /&gt;
smcroute auf Host B starten.&lt;br /&gt;
&lt;br /&gt;
=== Geräte hinter dem Router ===&lt;br /&gt;
&lt;br /&gt;
Damit die Geräte hinter dem Router von den Multicast-Paketen erreicht werden können:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ip r add 192.168.1.0/24 dev WG&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ip r add 192.168.178.0/24 dev WG&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
IPv4 Forwarding muss aktiviert sein!&lt;/div&gt;</summary>
		<author><name>Chris</name></author>
	</entry>
	<entry>
		<id>https://darkrealm-wiki.darkrealm.dyndns.org/index.php?title=Initramfs&amp;diff=4840</id>
		<title>Initramfs</title>
		<link rel="alternate" type="text/html" href="https://darkrealm-wiki.darkrealm.dyndns.org/index.php?title=Initramfs&amp;diff=4840"/>
		<updated>2025-07-15T22:28:03Z</updated>

		<summary type="html">&lt;p&gt;Chris: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Inhalt anzeigen ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lsinitrd &amp;lt;INITRAMFS&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Entpacken ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lsinitrd --unpack &amp;lt;INITRAMFS&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== CPIO ==&lt;br /&gt;
&lt;br /&gt;
=== Inhalt anzeigen ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cpio -t &amp;lt; &amp;lt;INITRAMFS&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Inhalt entpacken ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cpio -i &amp;lt; &amp;lt;INITRAMFS&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chris</name></author>
	</entry>
	<entry>
		<id>https://darkrealm-wiki.darkrealm.dyndns.org/index.php?title=Unix_Helper_Stuff&amp;diff=4839</id>
		<title>Unix Helper Stuff</title>
		<link rel="alternate" type="text/html" href="https://darkrealm-wiki.darkrealm.dyndns.org/index.php?title=Unix_Helper_Stuff&amp;diff=4839"/>
		<updated>2025-06-19T17:38:59Z</updated>

		<summary type="html">&lt;p&gt;Chris: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Little UNIX Helpers =&lt;br /&gt;
&lt;br /&gt;
== Verzeichnisse nach Größe sortieren ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
du -d 1 | sort -n&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*du -d 1 = Nur in ein tieferliegendes Verzeichnis absteigen&lt;br /&gt;
*sort -n = Aufsteigend nach Nummern sortieren&lt;br /&gt;
&lt;br /&gt;
[http://en.wikipedia.org/wiki/Sort_%28Unix%29]&lt;br /&gt;
&lt;br /&gt;
== Nur Dateien listen die NACH dem &amp;lt;Datum&amp;gt; modifiziert wurden ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
find -newermt &amp;quot;YYYY-MM-DD HH:MM&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== locate-Ergebnisse nach String durchsuchen ==&lt;br /&gt;
=== Achtung: Funktioniert bis jetzt nur bei Dateinamen OHNE Leerzeichen !===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
locate &amp;lt;Dateinamen&amp;gt; | xargs grep &amp;lt;string&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ACLs nur für Directories setzen ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
find . -type d -exec setfacl -m u::rwx,u::rwx,o::rx {} \;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* -type : Typ angeben ( f=Datei, d=Directory)&lt;br /&gt;
* -exec : Befehl ausführen&lt;br /&gt;
* {}    : Platzhalter für die find-Ergebniss&lt;br /&gt;
* \;    : Muss ESCaped werden&lt;br /&gt;
&lt;br /&gt;
== Alle extended attributes aus Verzeichnisbaum entfernen ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
getfattr -h -R * | grep &amp;quot;file:&amp;quot; | cut -d &amp;quot; &amp;quot; -f 3- | sed -e &#039;s/.*/\&amp;quot;&amp;amp;\&amp;quot;/&#039; | xargs setfattr -x user.DOSATTRIB --&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
getfattr:&lt;br /&gt;
* -h : Symbolische links nicht dereferenzieren&lt;br /&gt;
* -R : Rekursiv&lt;br /&gt;
&lt;br /&gt;
grep: gibt nur die Zeilen aus, die &amp;quot;file:&amp;quot; enthalten&lt;br /&gt;
&lt;br /&gt;
cut:&lt;br /&gt;
* -d &amp;quot; &amp;quot;: Feldtrenner ist in dem Fall das Leerzeichen (&amp;quot; &amp;quot;)&lt;br /&gt;
* -f 3-  : Alles wegschneiden bis zum dritten Feld (in dem Fall bis zum dritten Leerzeichen)&lt;br /&gt;
&lt;br /&gt;
sed:&lt;br /&gt;
* -e :&lt;br /&gt;
* &#039;s/.*/\&amp;quot;&amp;amp;\&amp;quot;/&#039; : umschließt den stdout mit Anführungszeichen&lt;br /&gt;
&lt;br /&gt;
xargs:&lt;br /&gt;
&lt;br /&gt;
== Nach bestimmten ACLs suchen ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
getfacl -nRs . | awk -v RS= -v ORS=&#039;\n\n&#039; &#039;/group:3000040/&#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Verzeichnisse, Unterverzeichnisse und Dateien nach uppercase umwandeln ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
find . -exec perl-rename &#039;y/a-z/A-Z/&#039; {} \;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chris</name></author>
	</entry>
	<entry>
		<id>https://darkrealm-wiki.darkrealm.dyndns.org/index.php?title=Paperless-ngx&amp;diff=4838</id>
		<title>Paperless-ngx</title>
		<link rel="alternate" type="text/html" href="https://darkrealm-wiki.darkrealm.dyndns.org/index.php?title=Paperless-ngx&amp;diff=4838"/>
		<updated>2025-05-26T20:55:53Z</updated>

		<summary type="html">&lt;p&gt;Chris: /* Installation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Installation ==&lt;br /&gt;
&lt;br /&gt;
* sudo lxc-create -n paperless-ngx -B zfs -t download -- --dist debian --release bookworm --arch amd64&lt;br /&gt;
&lt;br /&gt;
* dpkg-reconfigure tzdata&lt;br /&gt;
* dpkg-reconfigure locales&lt;br /&gt;
* apt install python3 python3-pip python3-dev imagemagick fonts-liberation gnupg libpq-dev default-libmysqlclient-dev pkg-config libmagic-dev mime-support libzbar0 poppler-utils apt-transport-https man-db vim bash-completion openssh-server unpaper ghostscript icc-profiles-free qpdf liblept5 libxml2 pngquant zlib1g tesseract-ocr redis tesseract-ocr-deu git locate curl wget python3.11-venv emacs-nox autoconf libtool libleptonica-dev curl wget vim sudo mariadb-server&lt;br /&gt;
* adduser paperless --system --home /opt/paperless-ngx --group&lt;br /&gt;
* curl -O -L https://github.com/paperless-ngx/paperless-ngx/releases/download/v2.1.3/paperless-ngx-v2.1.3.tar.xz&lt;br /&gt;
* tar -xf paperless-ngx-v2.1.3.tar.xz -C/opt/&lt;br /&gt;
* cd /opt/paperless-ngx&lt;br /&gt;
* mkdir media&lt;br /&gt;
* mkdir data&lt;br /&gt;
* mkdir consume&lt;br /&gt;
* chown -R paperless:paperless .&lt;br /&gt;
* chown paperless:paperless media&lt;br /&gt;
* chown paperless:paperless data&lt;br /&gt;
* chown paperless:paperless consume&lt;br /&gt;
* sudo -Hu paperless python3 -m venv venv-paperless-ngx&lt;br /&gt;
* sudo -Hu paperless -s&lt;br /&gt;
* . venv-paperless-ngx/bin/activate&lt;br /&gt;
* pip3 install -r requirements.txt&lt;br /&gt;
* cd src&lt;br /&gt;
* vim /opt/paperless-ngx/paperless.conf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Have a look at the docs for documentation.&lt;br /&gt;
# https://docs.paperless-ngx.com/configuration/&lt;br /&gt;
&lt;br /&gt;
# Debug. Only enable this for development.&lt;br /&gt;
&lt;br /&gt;
#PAPERLESS_DEBUG=false&lt;br /&gt;
&lt;br /&gt;
# Required services&lt;br /&gt;
&lt;br /&gt;
PAPERLESS_REDIS=redis://localhost:6379&lt;br /&gt;
PAPERLESS_DBENGINE=mariadb&lt;br /&gt;
PAPERLESS_DBHOST=shodan.intern.darkrealm.dyndns.org&lt;br /&gt;
PAPERLESS_DBPORT=3306&lt;br /&gt;
PAPERLESS_DBNAME=paperless&lt;br /&gt;
PAPERLESS_DBUSER=paperless&lt;br /&gt;
PAPERLESS_DBPASS=paperless&lt;br /&gt;
PAPERLESS_DBSSLMODE=DISABLED&lt;br /&gt;
&lt;br /&gt;
# Paths and folders&lt;br /&gt;
&lt;br /&gt;
#PAPERLESS_CONSUMPTION_DIR=../consume&lt;br /&gt;
#PAPERLESS_DATA_DIR=../data&lt;br /&gt;
#PAPERLESS_TRASH_DIR=../trash&lt;br /&gt;
#PAPERLESS_MEDIA_ROOT=../media&lt;br /&gt;
PAPERLESS_CONSUMPTION_DIR=/mnt/storage/dms/consume&lt;br /&gt;
PAPERLESS_DATA_DIR=/mnt/storage/dms/data&lt;br /&gt;
PAPERLESS_TRASH_DIR=/mnt/storage/dms/trash&lt;br /&gt;
PAPERLESS_MEDIA_ROOT=/mnt/storage/dms/media&lt;br /&gt;
PAPERLESS_STATICDIR=../static&lt;br /&gt;
#PAPERLESS_FILENAME_FORMAT=&lt;br /&gt;
PAPERLESS_FILENAME_FORMAT={{owner_username}}/{{correspondent}}/{{document_type}}/{{created_year}}/{{title}}&lt;br /&gt;
PAPERLESS_FILENAME_FORMAT_REMOVE_NONE=true&lt;br /&gt;
&lt;br /&gt;
# Security and hosting&lt;br /&gt;
&lt;br /&gt;
PAPERLESS_SECRET_KEY=Peem7AhD&lt;br /&gt;
PAPERLESS_URL=https://paperless.darkrealm.dyndns.org&lt;br /&gt;
#PAPERLESS_CSRF_TRUSTED_ORIGINS=https://example.com # can be set using PAPERLESS_URL&lt;br /&gt;
#PAPERLESS_ALLOWED_HOSTS=example.com,www.example.com # can be set using PAPERLESS_URL&lt;br /&gt;
#PAPERLESS_CORS_ALLOWED_HOSTS=https://localhost:8080,https://example.com # can be set using PAPERLESS_URL&lt;br /&gt;
#PAPERLESS_FORCE_SCRIPT_NAME=&lt;br /&gt;
#PAPERLESS_STATIC_URL=/static/&lt;br /&gt;
#PAPERLESS_AUTO_LOGIN_USERNAME=&lt;br /&gt;
#PAPERLESS_COOKIE_PREFIX=&lt;br /&gt;
#PAPERLESS_ENABLE_HTTP_REMOTE_USER=false&lt;br /&gt;
&lt;br /&gt;
# OCR settings&lt;br /&gt;
&lt;br /&gt;
PAPERLESS_OCR_LANGUAGE=eng+deu&lt;br /&gt;
#PAPERLESS_OCR_MODE=skip&lt;br /&gt;
#PAPERLESS_OCR_SKIP_ARCHIVE_FILE=never&lt;br /&gt;
#PAPERLESS_OCR_OUTPUT_TYPE=pdfa&lt;br /&gt;
#PAPERLESS_OCR_PAGES=1&lt;br /&gt;
#PAPERLESS_OCR_IMAGE_DPI=300&lt;br /&gt;
#PAPERLESS_OCR_CLEAN=clean&lt;br /&gt;
#PAPERLESS_OCR_DESKEW=true&lt;br /&gt;
#PAPERLESS_OCR_ROTATE_PAGES=true&lt;br /&gt;
#PAPERLESS_OCR_ROTATE_PAGES_THRESHOLD=4&lt;br /&gt;
#PAPERLESS_OCR_USER_ARGS={}&lt;br /&gt;
#PAPERLESS_CONVERT_MEMORY_LIMIT=0&lt;br /&gt;
#PAPERLESS_CONVERT_TMPDIR=/var/tmp/paperless&lt;br /&gt;
&lt;br /&gt;
PAPERLESS_ENABLE_NLTK=true&lt;br /&gt;
#PAPERLESS_NLTK_DIR=../nltk_data&lt;br /&gt;
PAPERLESS_NLTK_DIR=/mnt/storage/dms/nltk_data&lt;br /&gt;
# Software tweaks&lt;br /&gt;
&lt;br /&gt;
#PAPERLESS_TASK_WORKERS=1&lt;br /&gt;
#PAPERLESS_THREADS_PER_WORKER=1&lt;br /&gt;
PAPERLESS_TIME_ZONE=Europe/Berlin&lt;br /&gt;
#PAPERLESS_CONSUMER_POLLING=10&lt;br /&gt;
#PAPERLESS_CONSUMER_DELETE_DUPLICATES=false&lt;br /&gt;
PAPERLESS_CONSUMER_RECURSIVE=true&lt;br /&gt;
#PAPERLESS_CONSUMER_IGNORE_PATTERNS=[&amp;quot;.DS_STORE/*&amp;quot;, &amp;quot;._*&amp;quot;, &amp;quot;.stfolder/*&amp;quot;, &amp;quot;.stversions/*&amp;quot;, &amp;quot;.localized/*&amp;quot;, &amp;quot;desktop.ini&amp;quot;]&lt;br /&gt;
#PAPERLESS_CONSUMER_SUBDIRS_AS_TAGS=false&lt;br /&gt;
PAPERLESS_CONSUMER_ENABLE_BARCODES=true&lt;br /&gt;
#PAPERLESS_CONSUMER_BARCODE_STRING=PATCHT&lt;br /&gt;
#PAPERLESS_CONSUMER_BARCODE_UPSCALE=0.0&lt;br /&gt;
#PAPERLESS_CONSUMER_BARCODE_DPI=300&lt;br /&gt;
#PAPERLESS_CONSUMER_ENABLE_COLLATE_DOUBLE_SIDED=false&lt;br /&gt;
#PAPERLESS_CONSUMER_COLLATE_DOUBLE_SIDED_SUBDIR_NAME=double-sided&lt;br /&gt;
#PAPERLESS_CONSUMER_COLLATE_DOUBLE_SIDED_TIFF_SUPPORT=false&lt;br /&gt;
#PAPERLESS_PRE_CONSUME_SCRIPT=/path/to/an/arbitrary/script.sh&lt;br /&gt;
#PAPERLESS_POST_CONSUME_SCRIPT=/path/to/an/arbitrary/script.sh&lt;br /&gt;
#PAPERLESS_FILENAME_DATE_ORDER=YMD&lt;br /&gt;
#PAPERLESS_FILENAME_PARSE_TRANSFORMS=[]&lt;br /&gt;
#PAPERLESS_NUMBER_OF_SUGGESTED_DATES=5&lt;br /&gt;
#PAPERLESS_THUMBNAIL_FONT_NAME=&lt;br /&gt;
#PAPERLESS_IGNORE_DATES=&lt;br /&gt;
#PAPERLESS_ENABLE_UPDATE_CHECK=&lt;br /&gt;
&lt;br /&gt;
# Tika settings&lt;br /&gt;
&lt;br /&gt;
PAPERLESS_TIKA_ENABLED=true&lt;br /&gt;
PAPERLESS_TIKA_ENDPOINT=http://localhost:9998&lt;br /&gt;
PAPERLESS_TIKA_GOTENBERG_ENDPOINT=http://localhost:3000&lt;br /&gt;
&lt;br /&gt;
# Binaries&lt;br /&gt;
&lt;br /&gt;
#PAPERLESS_CONVERT_BINARY=/usr/bin/convert&lt;br /&gt;
#PAPERLESS_GS_BINARY=/usr/bin/gs&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* DB und User erstellen&lt;br /&gt;
&lt;br /&gt;
* sudo -Hu paperless python3 manage.py migrate&lt;br /&gt;
* sudo -Hu paperless python3 manage.py createsuperuser&lt;br /&gt;
* cp -av ../scripts/*.service /etc/systemd/system/&lt;br /&gt;
* cp -av ../scripts/*.socket /etc/systemd/system/&lt;br /&gt;
* systemctl daemon-reload&lt;br /&gt;
&lt;br /&gt;
ImageMagick Policy in /etc/ImageMagick-6/policy.xml anpassen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  &amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;read|write&amp;quot; pattern=&amp;quot;PDF&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
JBIG2ENC compilen:&lt;br /&gt;
* git clone https://github.com/agl/jbig2enc&lt;br /&gt;
* cd jbig2enc&lt;br /&gt;
* ./autogen.sh&lt;br /&gt;
* ./configure&lt;br /&gt;
* make&lt;br /&gt;
* make install&lt;br /&gt;
&lt;br /&gt;
NLTK installieren&lt;br /&gt;
* sudo -Hu paperless -s&lt;br /&gt;
* . venv-paperless-ngx/bin/activate&lt;br /&gt;
* python3&lt;br /&gt;
* import nltk&lt;br /&gt;
* nltk.download() (Nach /opt/paperless-ngx/nltk_data herunterladen)&lt;br /&gt;
* punkt, snowball_data und stopwords runterladen&lt;br /&gt;
&lt;br /&gt;
Apache Tika und Gotenberg installieren (momentan über Docker)&lt;br /&gt;
* apt install docker-compose&lt;br /&gt;
* docker run -d -p 127.0.0.1:9998:9998 apache/tika&lt;br /&gt;
* docker run -d -p 127.0.0.1:3000:3000 gotenberg/gotenberg:8&lt;br /&gt;
&lt;br /&gt;
== Update ==&lt;br /&gt;
&lt;br /&gt;
* wget aktuellstes tar.xf&lt;br /&gt;
* systemctl stop paperless-*&lt;br /&gt;
* tar -xf &amp;lt;release.tar.xf&amp;gt; -C/opt/&lt;br /&gt;
* cd /opt/paperless-ngx&lt;br /&gt;
* cp -av paperless.conf.keep paperless.conf&lt;br /&gt;
* chown paperless:paperless . -R&lt;br /&gt;
* sudo -Hu paperless -s&lt;br /&gt;
* source /opt/paperless-ngx/venv-paperless-ngx/bin/activate&lt;br /&gt;
* pip install -r requirements.txt&lt;br /&gt;
* cd src&lt;br /&gt;
* python3 manage.py migrate&lt;br /&gt;
&lt;br /&gt;
== Fixes ==&lt;br /&gt;
&lt;br /&gt;
=== NLTK Fix ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo -Hu paperless -s&lt;br /&gt;
source /opt/paperless-ngx/venv-paperless-ngx/bin/activate&lt;br /&gt;
cd src&lt;br /&gt;
python3 -W ignore::RuntimeWarning -m nltk.downloader -d &amp;quot;/mnt/storage/dms/nltk_data&amp;quot; punkt_tab&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Logs show &amp;quot;possible incompatible database column&amp;quot; when deleting documents ===&lt;br /&gt;
&lt;br /&gt;
You may see errors when deleting documents like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Data too long for column &#039;transaction_id&#039; at row 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This error can occur in installations which have upgraded from a version of Paperless-ngx that used Django 4 (Paperless-ngx versions prior to v2.13.0) with a MariaDB/MySQL database. Due to the backawards-incompatible change in Django 5, the column &amp;quot;documents_document.transaction_id&amp;quot; will need to be re-created, which can be done with a one-time run of the following management command:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo -Hu paperless -s&lt;br /&gt;
source /opt/paperless-ngx/venv-paperless-ngx/bin/activate&lt;br /&gt;
cd src&lt;br /&gt;
python3 manage.py convert_mariadb_uuid&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Komplette Neuinstallation inkl. Komplettrestore ==&lt;br /&gt;
&lt;br /&gt;
* lxc init images:debian/12 paperless-ngx&lt;br /&gt;
* lxc start papalass&lt;br /&gt;
* lxc shell papalass&lt;br /&gt;
* passwd&lt;br /&gt;
&lt;br /&gt;
Anschliessend vorgehen wie bei [[#Installation]]&lt;br /&gt;
&lt;br /&gt;
* die gesicherte ZIP-Datei des exports auf den neuen Paperless-Server kopieren und nach /temp entpacken&lt;br /&gt;
* sudo -Hu paperless -s&lt;br /&gt;
* source /opt/paperless-ngx/venv-paperless-ngx/bin/activate&lt;br /&gt;
* cd src&lt;br /&gt;
* python3 manage.py document_importer /temp/&lt;/div&gt;</summary>
		<author><name>Chris</name></author>
	</entry>
	<entry>
		<id>https://darkrealm-wiki.darkrealm.dyndns.org/index.php?title=Tomb_Raider_Times_Exclusive_Level_DC_Conversion&amp;diff=4837</id>
		<title>Tomb Raider Times Exclusive Level DC Conversion</title>
		<link rel="alternate" type="text/html" href="https://darkrealm-wiki.darkrealm.dyndns.org/index.php?title=Tomb_Raider_Times_Exclusive_Level_DC_Conversion&amp;diff=4837"/>
		<updated>2025-05-14T19:26:12Z</updated>

		<summary type="html">&lt;p&gt;Chris: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Files replaced ==&lt;br /&gt;
&lt;br /&gt;
* script.dat&lt;br /&gt;
* data/cutseq.pak&lt;br /&gt;
&lt;br /&gt;
== Files inserted ==&lt;br /&gt;
&lt;br /&gt;
* english.dat&lt;br /&gt;
* data/office.tr4&lt;br /&gt;
* data/times.tr4&lt;br /&gt;
&lt;br /&gt;
== Dummy Texture Files ==&lt;br /&gt;
&lt;br /&gt;
* data/office.tex&lt;br /&gt;
* data/times.tex&lt;/div&gt;</summary>
		<author><name>Chris</name></author>
	</entry>
	<entry>
		<id>https://darkrealm-wiki.darkrealm.dyndns.org/index.php?title=Tomb_Raider_Times_Exclusive_Level_DC_Conversion&amp;diff=4836</id>
		<title>Tomb Raider Times Exclusive Level DC Conversion</title>
		<link rel="alternate" type="text/html" href="https://darkrealm-wiki.darkrealm.dyndns.org/index.php?title=Tomb_Raider_Times_Exclusive_Level_DC_Conversion&amp;diff=4836"/>
		<updated>2025-05-14T19:22:00Z</updated>

		<summary type="html">&lt;p&gt;Chris: /* Files inserted */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Files replaced ==&lt;br /&gt;
&lt;br /&gt;
* script.dat&lt;br /&gt;
* data/cutseq.pak&lt;br /&gt;
&lt;br /&gt;
== Files inserted ==&lt;br /&gt;
&lt;br /&gt;
* english.dat&lt;br /&gt;
* data/office.tr4&lt;br /&gt;
* data/times.tr4&lt;/div&gt;</summary>
		<author><name>Chris</name></author>
	</entry>
	<entry>
		<id>https://darkrealm-wiki.darkrealm.dyndns.org/index.php?title=Tomb_Raider_Times_Exclusive_Level_DC_Conversion&amp;diff=4835</id>
		<title>Tomb Raider Times Exclusive Level DC Conversion</title>
		<link rel="alternate" type="text/html" href="https://darkrealm-wiki.darkrealm.dyndns.org/index.php?title=Tomb_Raider_Times_Exclusive_Level_DC_Conversion&amp;diff=4835"/>
		<updated>2025-05-14T19:20:22Z</updated>

		<summary type="html">&lt;p&gt;Chris: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Files replaced ==&lt;br /&gt;
&lt;br /&gt;
* script.dat&lt;br /&gt;
* data/cutseq.pak&lt;br /&gt;
&lt;br /&gt;
== Files inserted ==&lt;br /&gt;
&lt;br /&gt;
* english.dat&lt;/div&gt;</summary>
		<author><name>Chris</name></author>
	</entry>
	<entry>
		<id>https://darkrealm-wiki.darkrealm.dyndns.org/index.php?title=Tomb_Raider_Times_Exclusive_Level_DC_Conversion&amp;diff=4834</id>
		<title>Tomb Raider Times Exclusive Level DC Conversion</title>
		<link rel="alternate" type="text/html" href="https://darkrealm-wiki.darkrealm.dyndns.org/index.php?title=Tomb_Raider_Times_Exclusive_Level_DC_Conversion&amp;diff=4834"/>
		<updated>2025-05-14T19:20:05Z</updated>

		<summary type="html">&lt;p&gt;Chris: Die Seite wurde neu angelegt: „== Files replaced ==  script.dat data/cutseq.pak  == Files inserted ==  english.dat“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Files replaced ==&lt;br /&gt;
&lt;br /&gt;
script.dat&lt;br /&gt;
data/cutseq.pak&lt;br /&gt;
&lt;br /&gt;
== Files inserted ==&lt;br /&gt;
&lt;br /&gt;
english.dat&lt;/div&gt;</summary>
		<author><name>Chris</name></author>
	</entry>
	<entry>
		<id>https://darkrealm-wiki.darkrealm.dyndns.org/index.php?title=Dreamcast&amp;diff=4833</id>
		<title>Dreamcast</title>
		<link rel="alternate" type="text/html" href="https://darkrealm-wiki.darkrealm.dyndns.org/index.php?title=Dreamcast&amp;diff=4833"/>
		<updated>2025-05-14T18:29:21Z</updated>

		<summary type="html">&lt;p&gt;Chris: /* Create CDI Images from ISO */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== CDR Sizes ==&lt;br /&gt;
&lt;br /&gt;
80min/700MB: 1st Session 674MB Maximum&lt;br /&gt;
&lt;br /&gt;
90min/800MB: max 748MB when 45000 Sectors in 1st Session with dummy burn&lt;br /&gt;
&lt;br /&gt;
90min/800MB: max ~735MB when 45000 Sectors in 1st Session&lt;br /&gt;
&lt;br /&gt;
== Access Files on CDI Images ==&lt;br /&gt;
&lt;br /&gt;
# Extract the seperate Track first&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cdirip &amp;lt;CDIFILE&amp;gt;.cdi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# In case of 2nd Data Track, fix the LBA first&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
isofix &amp;lt;TRACK02&amp;gt;.iso &amp;lt;LBA Value reported by cdirip&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== What binhack does ==&lt;br /&gt;
&lt;br /&gt;
Changes LBA Value at offset 1461904 ( 8 Bytes before CD001 string) from 6EB0 (45166) to LBA Value+166 specified during binhack.&lt;br /&gt;
&lt;br /&gt;
Adds Region Codes for JAP,EUR and USA and strings for that.&lt;br /&gt;
Adds some bootcode, probably SH4 ASM to make the GDROM accept CDRs.&lt;br /&gt;
&lt;br /&gt;
== What cdda does ==&lt;br /&gt;
&lt;br /&gt;
Changes some bytes, probably SH4 ASM to enable playback of CDDA tracks.&lt;br /&gt;
&lt;br /&gt;
== What dahack does ==&lt;br /&gt;
&lt;br /&gt;
Changes LBA Values at offsets 1301408,1302380 and 1461904. First 2 offsets get rewritten from 5EB0 (45150) to 9600 (150). Third offset gets rewritten from 6EB0 (45166) to LBA Value+166 specified during dahack. 3rd offset change is basically the same what binhack does.&lt;br /&gt;
&lt;br /&gt;
== What hack3 does ==&lt;br /&gt;
&lt;br /&gt;
Changes LBA Values at offsets 1301408,1302380 and 1461904. First 2 offsets get rewritten from 5EB0 (45150) to LBA Value+150 specified during dahack. Third offset gets rewritten from 6EB0 (45166) to LBA Value+166 specified during dahack. 3rd offset change is basically the same what binhack does.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Another Copy Protection ==&lt;br /&gt;
&lt;br /&gt;
Searching for CDE4 036A (or CDE4 436A) and replacing with 0900 0900 is another Copy Protection defeat.&lt;br /&gt;
&lt;br /&gt;
CDE4 436A -&amp;gt; 0900 0900&lt;br /&gt;
1032 0D8B -&amp;gt; 0800 0D8B&lt;br /&gt;
&lt;br /&gt;
== LBA 45000 Trick ==&lt;br /&gt;
&lt;br /&gt;
69120000 bytes in first session will result in LBA 45000.&lt;br /&gt;
&lt;br /&gt;
== Fill 1st Session ISO File to 69120000 bytes with zeros ==&lt;br /&gt;
&lt;br /&gt;
6912000 bytes = 33750 2048-byte-sectors&lt;br /&gt;
&lt;br /&gt;
CORRECTION : Must be 33598 Sectors !!! = 68808703 bytes&lt;br /&gt;
&lt;br /&gt;
1st Session Leadout = 11250 Sectors = 23040000 Bytes&lt;br /&gt;
&lt;br /&gt;
2nd Session will start at Sector 45000&lt;br /&gt;
&lt;br /&gt;
When using extract.exe, add 150 Sectors to LBA reported in gdinfo_FG.exe track05&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dd if=/dev/zero of=&amp;lt;ISOFILE&amp;gt; bs=1 count=1 seek=69119999&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Creating &amp;amp; Burning DATA/DATA ISOs ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Merging track03 &amp;amp; track05 into one file ==&lt;br /&gt;
&lt;br /&gt;
Create dummy file first&lt;br /&gt;
Calculate 1185760800 - &amp;lt;SIZE OF track03.bin + SIZE OF track05.bin&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dd if=/dev/zero bs=1 count=0 seek=&amp;lt;RESULT&amp;gt; of=dummy.bin&lt;br /&gt;
cat track03.bin dummy.bin track05.bin &amp;gt; combined.bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This also helps when extract.exe only outputs garbage out of track03.iso along with track05.iso. This way only the combined.iso needs to be extracted.&lt;br /&gt;
&lt;br /&gt;
== Burning DATA/DATA CDIs ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cdirip &amp;lt;CDIFile&amp;gt; &amp;lt;Destination Directory&amp;gt;&lt;br /&gt;
cdrecord dev=/dev/sr0 -v -multi -tao -xa tdata01.iso&lt;br /&gt;
cdrecord dev=/dev/sr0 -v -tao -xa tdata02.iso&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Full rip process from GD-ROM to CD-ROM ==&lt;br /&gt;
&lt;br /&gt;
=== Get GDROM Data from Dreamcast with http-ack ===&lt;br /&gt;
&lt;br /&gt;
https://www.gotwalls.com&lt;br /&gt;
&lt;br /&gt;
https://github.com/sega-dreamcast/httpd-ack&lt;br /&gt;
&lt;br /&gt;
# Boot HTTP-ack from CD&lt;br /&gt;
# Swap HTTP-ack CD with Original GD-ROm&lt;br /&gt;
# Connect via Browser to http://192.168.1.30&lt;br /&gt;
# Download all files starting with track03.bin&lt;br /&gt;
# Download disc.gdi&lt;br /&gt;
&lt;br /&gt;
=== Extract Data from Tracks ===&lt;br /&gt;
&lt;br /&gt;
==== Use gditools ====&lt;br /&gt;
&lt;br /&gt;
https://sourceforge.net/projects/dcisotools/&lt;br /&gt;
&lt;br /&gt;
Either use GUI or gditools.py&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
python2.7 ./gditools.py &lt;br /&gt;
Usage: ./gditools.py -i input_gdi [options]&lt;br /&gt;
&lt;br /&gt;
  -h, --help             Display this help&lt;br /&gt;
  -l, --list             List all files in the filesystem and exit&lt;br /&gt;
  -o [outdir]            Output directory. Default: gdi folder&lt;br /&gt;
  -s [filename]          Create a sorttxt file with custom name&lt;br /&gt;
                           (It uses *data-folder* as prefix)&lt;br /&gt;
  -b [ipname]            Dump the ip.bin with custom name&lt;br /&gt;
  -e [filename]          Dump a single file from the filesystem&lt;br /&gt;
  --extract-all          Dump all the files in the *data-folder*&lt;br /&gt;
  --data-folder [name]   *data-folder* subfolder. Default: data&lt;br /&gt;
                           (__volume_label__ --&amp;gt; Use ISO9660 volume label)&lt;br /&gt;
  --sort-spacer [num]    Sorttxt entries are sperated by num&lt;br /&gt;
  --silent               Minimal verbosity mode&lt;br /&gt;
  [no option]            Display gdi infos if not silent&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
gditools.py by FamilyGuy, http://sourceforge.net/p/dcisotools/&lt;br /&gt;
    Licensed under GPLv3, see licences folder.&lt;br /&gt;
&lt;br /&gt;
iso9660.py  by Barney Gale, http://github.com/barneygale&lt;br /&gt;
    Licensed under a BSD-based license, see licences folder.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
python2.7 ./gditools.py -i &amp;lt;disc.gdi&amp;gt; --extract-all -o /mnt/development/dreamcast/rips/orgs/&amp;lt;GAME_NAME&amp;gt;/&amp;lt;CD Number&amp;gt; --data-folder __volume_label__ -s sort.txt -b ip.bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Old way ====&lt;br /&gt;
# If the game contains more than track03.bin, combine the 2 binfiles into 1:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cat track03.bin dummy.bin track05.bin &amp;gt; &amp;lt;BINFILE&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
# Convert .BIN Files to .ISO Files first with bin2iso.exe&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bin2iso.exe &amp;lt;BINFILE&amp;gt; &amp;lt;ISOFILE&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
# Extract Data from .ISO files&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
extract.exe &amp;lt;ISOFILE&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
If extracted 1ST_READ.BIN has filesize of 0, LBA of track05 is wrong.&lt;br /&gt;
&lt;br /&gt;
=== Downsampling ===&lt;br /&gt;
&lt;br /&gt;
==== AFS Files ====&lt;br /&gt;
&lt;br /&gt;
https://sizious.com/download/dreamcast/&lt;br /&gt;
&lt;br /&gt;
AFS files contain multiple ADX files combined into one AFS file.&lt;br /&gt;
&lt;br /&gt;
compact AFS with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
AFSCompactor.exe&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
for Alone in the Dark - The New Nightmare .XA files are AFS files, rename first with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rename .XA .afs *.XA&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
then compact and rename back to .XA:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rename .afs .XA *.afs&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
AFSCompactor.exe will rename files inside .afs to file0001 etc... AITD4 doesnt seem to care.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
extract AFS with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
afs_extract.exe *.afs|*.XA&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
or&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
afsextract.exe -sc afsfile|XAfile&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
or&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
afsutils_v2.exe | rename .XA files to .afs beforehand.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== SFD Movies ====&lt;br /&gt;
&lt;br /&gt;
http://www.dc-swat.ru/page/download/&lt;br /&gt;
&lt;br /&gt;
Demux video to .m1v and audio to .wav first&lt;br /&gt;
&lt;br /&gt;
Example (play around with bitrates):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for f in &amp;lt;SFD Files&amp;gt;; do ffmpeg -i $f -vcodec mpeg1video -b:v 2600k -minrate 2600k -maxrate 3600k -y $f.m1v -acodec adpcm_ima_wav -y $f.wav ; done&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Open all .wavs in single Audacity project and mass export again, 16bit and 44100 Hz.&lt;br /&gt;
&lt;br /&gt;
Start Dreamcast Movie Converter and remux/reencode to .SFD. Dont use batch processing, videos get truncated!&lt;br /&gt;
&lt;br /&gt;
==== 4XM Movies ====&lt;br /&gt;
&lt;br /&gt;
http://samples.mplayerhq.hu/game-formats/4xm/&lt;br /&gt;
&lt;br /&gt;
Convert to AVI first with ffmpeg&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for i in ../rips/unmodified/aitd4/cd2/AITD4_GD_2/MOVIES/*.4XM; do ffmpeg -i &amp;quot;$i&amp;quot; -vf scale=320x160 -y &amp;quot;${i%.*}.avi&amp;quot;; done&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Downsample with 4xm_comp.exe&lt;br /&gt;
&lt;br /&gt;
Speed : 30 fps&lt;br /&gt;
Data Rate : 110000&lt;br /&gt;
Resize Width 320 Height 160&lt;br /&gt;
&lt;br /&gt;
=== Create ISO Images ===&lt;br /&gt;
&lt;br /&gt;
For the 1st Session, chosen files must not exceed total of 69120000 bytes!&lt;br /&gt;
&lt;br /&gt;
==== 1st Session ====&lt;br /&gt;
&lt;br /&gt;
===== Create first ISOFile =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkisofs -l -duplicates-once -no-allow-lowercase -graft-points -V &amp;lt;DISCNAME&amp;gt; -o &amp;lt;OUTPUT1.ISO&amp;gt; &amp;lt;CHOSEN FILE&amp;gt; &amp;lt;CHOSEN FILE&amp;gt; &amp;lt;CHOSEN FILE&amp;gt;...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fill first ISOFile with zeros so it takes up exactly 68808703 bytes = LBA 45000&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dd if=/dev/zero of=&amp;lt;OUTPUT1.ISO&amp;gt; bs=1 count=1 seek=68808703&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Burn 1st session =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cdrecord -v -multi -tao -xa &amp;lt;OUTPUT1.ISO&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Check MSINFO value &amp;amp; TOC&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cdrecord -msinfo&lt;br /&gt;
&lt;br /&gt;
0,45000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cdrecord -toc&lt;br /&gt;
&lt;br /&gt;
first: 1 last 1&lt;br /&gt;
track:   1 lba:         0 (        0) 00:02:00 adr: 1 control: 4 mode: -1&lt;br /&gt;
track:lout lba:     33600 (   134400) 07:30:00 adr: 1 control: 4 mode: -1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To include subdirectories into the root directory of the CD, use&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkisofs -l -duplicates-once -no-allow-lowercase -graft-points -V &amp;lt;DISCNAME&amp;gt; -o &amp;lt;OUTPUT1.ISO&amp;gt; &amp;lt;SUBDIRECTORY&amp;gt;/=&amp;lt;PATH_OF_SUBDIRECTORY&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkisofs -no-allow-lowercase -graft-points -l -duplicates-once -V AITD4_GD_2 -o aitd4_d2_1.iso MOVIES/=../rips/modified/aitd4/cd2/AITD4_GD_2/MOVIES/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 2nd Session ====&lt;br /&gt;
&lt;br /&gt;
===== Hack 1ST_READ.BIN &amp;amp; IP.BIN =====&lt;br /&gt;
&lt;br /&gt;
Get MSINFO Value&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cdrecord -msinfo&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
binhack&lt;br /&gt;
&lt;br /&gt;
Enter name of binary: 1ST_READ.BIN&lt;br /&gt;
Enter name of bootsector: ip.bin&lt;br /&gt;
Enter msinfo value: &amp;lt;MSINFO Value&amp;gt;&lt;br /&gt;
File 1ST_READ.BIN successfully hacked. &lt;br /&gt;
Bincon detected, OS flag set to 0.&lt;br /&gt;
File ip.bin successfully created.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Insert custom Logo =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
logoinsert darkrealm.mr IP.BIN&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Burn 2nd Session =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkisofs -no-allow-lowercase -l -duplicates-once -V &amp;lt;DISCNAME&amp;gt; -G &amp;lt;IP.BIN&amp;gt; -M &amp;lt;OUTPUT1.ISO&amp;gt; -C &amp;lt;MSINFO VALUE&amp;gt; -o &amp;lt;OUTPUT2.ISO&amp;gt; &amp;lt;GAME_DATA_DIRECTORY&amp;gt;&lt;br /&gt;
cdrecord -v -tao -xa &amp;lt;OUTPUT2.ISO&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
&lt;br /&gt;
* Burn whole stuff to a CD-RW&lt;br /&gt;
* Generate CDI from CD-RW&lt;br /&gt;
** Launch DiscJuggler from emulated Windows Machine and connect via iSCSI&lt;br /&gt;
* Test CDI with ReiCast oder ReDream&lt;br /&gt;
&lt;br /&gt;
== Create CDI Images from ISO ==&lt;br /&gt;
&lt;br /&gt;
* Create ISO first&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkisofs -l -duplicates-once -graft-points -V &amp;lt;DISCNAME&amp;gt; -G &amp;lt;IP.BIN&amp;gt; -o &amp;lt;GAME.ISO&amp;gt; &amp;lt;GAME DIRECTORY&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Create DATA/DATA CDI&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wine cdi4dc.exe &amp;lt;GAME.ISO&amp;gt; /media/chris/development/dreamcast/backups/CDI/tests/&amp;lt;GAME.CDI&amp;gt; -d&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* or create AUDIO/DATA CDI, with 2nd Session starting at LBA 11702&lt;br /&gt;
** Note: 1ST_READ.BIN must eventually be binhacked to LBA 11702&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wine cdi4dc.exe &amp;lt;GAME.ISO&amp;gt; /media/chris/development/dreamcast/backups/CDI/tests/&amp;lt;GAME.CDI&amp;gt; -d&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chris</name></author>
	</entry>
	<entry>
		<id>https://darkrealm-wiki.darkrealm.dyndns.org/index.php?title=Dreamcast&amp;diff=4832</id>
		<title>Dreamcast</title>
		<link rel="alternate" type="text/html" href="https://darkrealm-wiki.darkrealm.dyndns.org/index.php?title=Dreamcast&amp;diff=4832"/>
		<updated>2025-05-14T18:28:55Z</updated>

		<summary type="html">&lt;p&gt;Chris: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== CDR Sizes ==&lt;br /&gt;
&lt;br /&gt;
80min/700MB: 1st Session 674MB Maximum&lt;br /&gt;
&lt;br /&gt;
90min/800MB: max 748MB when 45000 Sectors in 1st Session with dummy burn&lt;br /&gt;
&lt;br /&gt;
90min/800MB: max ~735MB when 45000 Sectors in 1st Session&lt;br /&gt;
&lt;br /&gt;
== Access Files on CDI Images ==&lt;br /&gt;
&lt;br /&gt;
# Extract the seperate Track first&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cdirip &amp;lt;CDIFILE&amp;gt;.cdi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# In case of 2nd Data Track, fix the LBA first&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
isofix &amp;lt;TRACK02&amp;gt;.iso &amp;lt;LBA Value reported by cdirip&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== What binhack does ==&lt;br /&gt;
&lt;br /&gt;
Changes LBA Value at offset 1461904 ( 8 Bytes before CD001 string) from 6EB0 (45166) to LBA Value+166 specified during binhack.&lt;br /&gt;
&lt;br /&gt;
Adds Region Codes for JAP,EUR and USA and strings for that.&lt;br /&gt;
Adds some bootcode, probably SH4 ASM to make the GDROM accept CDRs.&lt;br /&gt;
&lt;br /&gt;
== What cdda does ==&lt;br /&gt;
&lt;br /&gt;
Changes some bytes, probably SH4 ASM to enable playback of CDDA tracks.&lt;br /&gt;
&lt;br /&gt;
== What dahack does ==&lt;br /&gt;
&lt;br /&gt;
Changes LBA Values at offsets 1301408,1302380 and 1461904. First 2 offsets get rewritten from 5EB0 (45150) to 9600 (150). Third offset gets rewritten from 6EB0 (45166) to LBA Value+166 specified during dahack. 3rd offset change is basically the same what binhack does.&lt;br /&gt;
&lt;br /&gt;
== What hack3 does ==&lt;br /&gt;
&lt;br /&gt;
Changes LBA Values at offsets 1301408,1302380 and 1461904. First 2 offsets get rewritten from 5EB0 (45150) to LBA Value+150 specified during dahack. Third offset gets rewritten from 6EB0 (45166) to LBA Value+166 specified during dahack. 3rd offset change is basically the same what binhack does.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Another Copy Protection ==&lt;br /&gt;
&lt;br /&gt;
Searching for CDE4 036A (or CDE4 436A) and replacing with 0900 0900 is another Copy Protection defeat.&lt;br /&gt;
&lt;br /&gt;
CDE4 436A -&amp;gt; 0900 0900&lt;br /&gt;
1032 0D8B -&amp;gt; 0800 0D8B&lt;br /&gt;
&lt;br /&gt;
== LBA 45000 Trick ==&lt;br /&gt;
&lt;br /&gt;
69120000 bytes in first session will result in LBA 45000.&lt;br /&gt;
&lt;br /&gt;
== Fill 1st Session ISO File to 69120000 bytes with zeros ==&lt;br /&gt;
&lt;br /&gt;
6912000 bytes = 33750 2048-byte-sectors&lt;br /&gt;
&lt;br /&gt;
CORRECTION : Must be 33598 Sectors !!! = 68808703 bytes&lt;br /&gt;
&lt;br /&gt;
1st Session Leadout = 11250 Sectors = 23040000 Bytes&lt;br /&gt;
&lt;br /&gt;
2nd Session will start at Sector 45000&lt;br /&gt;
&lt;br /&gt;
When using extract.exe, add 150 Sectors to LBA reported in gdinfo_FG.exe track05&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dd if=/dev/zero of=&amp;lt;ISOFILE&amp;gt; bs=1 count=1 seek=69119999&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Creating &amp;amp; Burning DATA/DATA ISOs ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Merging track03 &amp;amp; track05 into one file ==&lt;br /&gt;
&lt;br /&gt;
Create dummy file first&lt;br /&gt;
Calculate 1185760800 - &amp;lt;SIZE OF track03.bin + SIZE OF track05.bin&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dd if=/dev/zero bs=1 count=0 seek=&amp;lt;RESULT&amp;gt; of=dummy.bin&lt;br /&gt;
cat track03.bin dummy.bin track05.bin &amp;gt; combined.bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This also helps when extract.exe only outputs garbage out of track03.iso along with track05.iso. This way only the combined.iso needs to be extracted.&lt;br /&gt;
&lt;br /&gt;
== Burning DATA/DATA CDIs ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cdirip &amp;lt;CDIFile&amp;gt; &amp;lt;Destination Directory&amp;gt;&lt;br /&gt;
cdrecord dev=/dev/sr0 -v -multi -tao -xa tdata01.iso&lt;br /&gt;
cdrecord dev=/dev/sr0 -v -tao -xa tdata02.iso&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Full rip process from GD-ROM to CD-ROM ==&lt;br /&gt;
&lt;br /&gt;
=== Get GDROM Data from Dreamcast with http-ack ===&lt;br /&gt;
&lt;br /&gt;
https://www.gotwalls.com&lt;br /&gt;
&lt;br /&gt;
https://github.com/sega-dreamcast/httpd-ack&lt;br /&gt;
&lt;br /&gt;
# Boot HTTP-ack from CD&lt;br /&gt;
# Swap HTTP-ack CD with Original GD-ROm&lt;br /&gt;
# Connect via Browser to http://192.168.1.30&lt;br /&gt;
# Download all files starting with track03.bin&lt;br /&gt;
# Download disc.gdi&lt;br /&gt;
&lt;br /&gt;
=== Extract Data from Tracks ===&lt;br /&gt;
&lt;br /&gt;
==== Use gditools ====&lt;br /&gt;
&lt;br /&gt;
https://sourceforge.net/projects/dcisotools/&lt;br /&gt;
&lt;br /&gt;
Either use GUI or gditools.py&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
python2.7 ./gditools.py &lt;br /&gt;
Usage: ./gditools.py -i input_gdi [options]&lt;br /&gt;
&lt;br /&gt;
  -h, --help             Display this help&lt;br /&gt;
  -l, --list             List all files in the filesystem and exit&lt;br /&gt;
  -o [outdir]            Output directory. Default: gdi folder&lt;br /&gt;
  -s [filename]          Create a sorttxt file with custom name&lt;br /&gt;
                           (It uses *data-folder* as prefix)&lt;br /&gt;
  -b [ipname]            Dump the ip.bin with custom name&lt;br /&gt;
  -e [filename]          Dump a single file from the filesystem&lt;br /&gt;
  --extract-all          Dump all the files in the *data-folder*&lt;br /&gt;
  --data-folder [name]   *data-folder* subfolder. Default: data&lt;br /&gt;
                           (__volume_label__ --&amp;gt; Use ISO9660 volume label)&lt;br /&gt;
  --sort-spacer [num]    Sorttxt entries are sperated by num&lt;br /&gt;
  --silent               Minimal verbosity mode&lt;br /&gt;
  [no option]            Display gdi infos if not silent&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
gditools.py by FamilyGuy, http://sourceforge.net/p/dcisotools/&lt;br /&gt;
    Licensed under GPLv3, see licences folder.&lt;br /&gt;
&lt;br /&gt;
iso9660.py  by Barney Gale, http://github.com/barneygale&lt;br /&gt;
    Licensed under a BSD-based license, see licences folder.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
python2.7 ./gditools.py -i &amp;lt;disc.gdi&amp;gt; --extract-all -o /mnt/development/dreamcast/rips/orgs/&amp;lt;GAME_NAME&amp;gt;/&amp;lt;CD Number&amp;gt; --data-folder __volume_label__ -s sort.txt -b ip.bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Old way ====&lt;br /&gt;
# If the game contains more than track03.bin, combine the 2 binfiles into 1:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cat track03.bin dummy.bin track05.bin &amp;gt; &amp;lt;BINFILE&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
# Convert .BIN Files to .ISO Files first with bin2iso.exe&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bin2iso.exe &amp;lt;BINFILE&amp;gt; &amp;lt;ISOFILE&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
# Extract Data from .ISO files&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
extract.exe &amp;lt;ISOFILE&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
If extracted 1ST_READ.BIN has filesize of 0, LBA of track05 is wrong.&lt;br /&gt;
&lt;br /&gt;
=== Downsampling ===&lt;br /&gt;
&lt;br /&gt;
==== AFS Files ====&lt;br /&gt;
&lt;br /&gt;
https://sizious.com/download/dreamcast/&lt;br /&gt;
&lt;br /&gt;
AFS files contain multiple ADX files combined into one AFS file.&lt;br /&gt;
&lt;br /&gt;
compact AFS with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
AFSCompactor.exe&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
for Alone in the Dark - The New Nightmare .XA files are AFS files, rename first with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rename .XA .afs *.XA&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
then compact and rename back to .XA:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rename .afs .XA *.afs&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
AFSCompactor.exe will rename files inside .afs to file0001 etc... AITD4 doesnt seem to care.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
extract AFS with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
afs_extract.exe *.afs|*.XA&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
or&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
afsextract.exe -sc afsfile|XAfile&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
or&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
afsutils_v2.exe | rename .XA files to .afs beforehand.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== SFD Movies ====&lt;br /&gt;
&lt;br /&gt;
http://www.dc-swat.ru/page/download/&lt;br /&gt;
&lt;br /&gt;
Demux video to .m1v and audio to .wav first&lt;br /&gt;
&lt;br /&gt;
Example (play around with bitrates):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for f in &amp;lt;SFD Files&amp;gt;; do ffmpeg -i $f -vcodec mpeg1video -b:v 2600k -minrate 2600k -maxrate 3600k -y $f.m1v -acodec adpcm_ima_wav -y $f.wav ; done&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Open all .wavs in single Audacity project and mass export again, 16bit and 44100 Hz.&lt;br /&gt;
&lt;br /&gt;
Start Dreamcast Movie Converter and remux/reencode to .SFD. Dont use batch processing, videos get truncated!&lt;br /&gt;
&lt;br /&gt;
==== 4XM Movies ====&lt;br /&gt;
&lt;br /&gt;
http://samples.mplayerhq.hu/game-formats/4xm/&lt;br /&gt;
&lt;br /&gt;
Convert to AVI first with ffmpeg&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for i in ../rips/unmodified/aitd4/cd2/AITD4_GD_2/MOVIES/*.4XM; do ffmpeg -i &amp;quot;$i&amp;quot; -vf scale=320x160 -y &amp;quot;${i%.*}.avi&amp;quot;; done&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Downsample with 4xm_comp.exe&lt;br /&gt;
&lt;br /&gt;
Speed : 30 fps&lt;br /&gt;
Data Rate : 110000&lt;br /&gt;
Resize Width 320 Height 160&lt;br /&gt;
&lt;br /&gt;
=== Create ISO Images ===&lt;br /&gt;
&lt;br /&gt;
For the 1st Session, chosen files must not exceed total of 69120000 bytes!&lt;br /&gt;
&lt;br /&gt;
==== 1st Session ====&lt;br /&gt;
&lt;br /&gt;
===== Create first ISOFile =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkisofs -l -duplicates-once -no-allow-lowercase -graft-points -V &amp;lt;DISCNAME&amp;gt; -o &amp;lt;OUTPUT1.ISO&amp;gt; &amp;lt;CHOSEN FILE&amp;gt; &amp;lt;CHOSEN FILE&amp;gt; &amp;lt;CHOSEN FILE&amp;gt;...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fill first ISOFile with zeros so it takes up exactly 68808703 bytes = LBA 45000&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dd if=/dev/zero of=&amp;lt;OUTPUT1.ISO&amp;gt; bs=1 count=1 seek=68808703&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Burn 1st session =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cdrecord -v -multi -tao -xa &amp;lt;OUTPUT1.ISO&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Check MSINFO value &amp;amp; TOC&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cdrecord -msinfo&lt;br /&gt;
&lt;br /&gt;
0,45000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cdrecord -toc&lt;br /&gt;
&lt;br /&gt;
first: 1 last 1&lt;br /&gt;
track:   1 lba:         0 (        0) 00:02:00 adr: 1 control: 4 mode: -1&lt;br /&gt;
track:lout lba:     33600 (   134400) 07:30:00 adr: 1 control: 4 mode: -1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To include subdirectories into the root directory of the CD, use&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkisofs -l -duplicates-once -no-allow-lowercase -graft-points -V &amp;lt;DISCNAME&amp;gt; -o &amp;lt;OUTPUT1.ISO&amp;gt; &amp;lt;SUBDIRECTORY&amp;gt;/=&amp;lt;PATH_OF_SUBDIRECTORY&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkisofs -no-allow-lowercase -graft-points -l -duplicates-once -V AITD4_GD_2 -o aitd4_d2_1.iso MOVIES/=../rips/modified/aitd4/cd2/AITD4_GD_2/MOVIES/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 2nd Session ====&lt;br /&gt;
&lt;br /&gt;
===== Hack 1ST_READ.BIN &amp;amp; IP.BIN =====&lt;br /&gt;
&lt;br /&gt;
Get MSINFO Value&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cdrecord -msinfo&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
binhack&lt;br /&gt;
&lt;br /&gt;
Enter name of binary: 1ST_READ.BIN&lt;br /&gt;
Enter name of bootsector: ip.bin&lt;br /&gt;
Enter msinfo value: &amp;lt;MSINFO Value&amp;gt;&lt;br /&gt;
File 1ST_READ.BIN successfully hacked. &lt;br /&gt;
Bincon detected, OS flag set to 0.&lt;br /&gt;
File ip.bin successfully created.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Insert custom Logo =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
logoinsert darkrealm.mr IP.BIN&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Burn 2nd Session =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkisofs -no-allow-lowercase -l -duplicates-once -V &amp;lt;DISCNAME&amp;gt; -G &amp;lt;IP.BIN&amp;gt; -M &amp;lt;OUTPUT1.ISO&amp;gt; -C &amp;lt;MSINFO VALUE&amp;gt; -o &amp;lt;OUTPUT2.ISO&amp;gt; &amp;lt;GAME_DATA_DIRECTORY&amp;gt;&lt;br /&gt;
cdrecord -v -tao -xa &amp;lt;OUTPUT2.ISO&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
&lt;br /&gt;
* Burn whole stuff to a CD-RW&lt;br /&gt;
* Generate CDI from CD-RW&lt;br /&gt;
** Launch DiscJuggler from emulated Windows Machine and connect via iSCSI&lt;br /&gt;
* Test CDI with ReiCast oder ReDream&lt;br /&gt;
&lt;br /&gt;
== Create CDI Images from ISO ==&lt;br /&gt;
&lt;br /&gt;
* Create ISO first&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkisofs -l -duplicates-once -graft-points -V &amp;lt;DISCNAME&amp;gt; -G &amp;lt;IP.BIN&amp;gt; -o &amp;lt;GAME.ISO&amp;gt; &amp;lt;GAME DIRECTORY&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Create DATA/DATA CDI&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wine cdi4dc.exe &amp;lt;GAME.ISO&amp;gt; /media/chris/development/dreamcast/backups/CDI/tests/&amp;lt;GAME.CDI&amp;gt; -d&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* or create AUDIO/DATA CDI, with 2nd Session starting at LBA 11702&lt;br /&gt;
** Note: 1ST_READ.BIN must eventually be binacked to LBA 11702&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wine cdi4dc.exe &amp;lt;GAME.ISO&amp;gt; /media/chris/development/dreamcast/backups/CDI/tests/&amp;lt;GAME.CDI&amp;gt; -d&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chris</name></author>
	</entry>
	<entry>
		<id>https://darkrealm-wiki.darkrealm.dyndns.org/index.php?title=Funktionierende_Toolchains&amp;diff=4831</id>
		<title>Funktionierende Toolchains</title>
		<link rel="alternate" type="text/html" href="https://darkrealm-wiki.darkrealm.dyndns.org/index.php?title=Funktionierende_Toolchains&amp;diff=4831"/>
		<updated>2025-04-18T22:17:58Z</updated>

		<summary type="html">&lt;p&gt;Chris: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== KallistiOS Toolchain ==&lt;br /&gt;
&lt;br /&gt;
Voraussetzungen:&lt;br /&gt;
&lt;br /&gt;
* Wenn die Toolchain innerhalb eines CIFS-Mounts installiert wird müssen &#039;&#039;&#039;mfsymlinks&#039;&#039;&#039; in den Mountoptions aktiviert sein!&lt;br /&gt;
&lt;br /&gt;
=== Crosscompiler bauen ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /media/chris/development/dreamcast/toolchains&lt;br /&gt;
cd /media/chris/development/dreamcast/toolchains&lt;br /&gt;
git clone https://github.com/KallistiOS/KallistiOS.git kos&lt;br /&gt;
cd kos/utils/dc-chain/&lt;br /&gt;
cp -av Makefile.default.cfg Makefile.cfg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Makefile.cfg bearbeiten ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Sega Dreamcast Toolchains Maker (dc-chain)&lt;br /&gt;
# This file is part of KallistiOS.&lt;br /&gt;
&lt;br /&gt;
#########################&lt;br /&gt;
### TOOLCHAIN PROFILE ###&lt;br /&gt;
#########################&lt;br /&gt;
&lt;br /&gt;
# Choose a toolchain profile from the following available options:&lt;br /&gt;
# No longer supported upstream:&lt;br /&gt;
# - 9.3.0-legacy: Former &#039;stable&#039; option, based on GCC 9.3.0 and Newlib 3.3.0.&lt;br /&gt;
# - 9.5.0-winxp:  Most recent versions of tools which run on Windows XP.&lt;br /&gt;
# - 10.5.0:       Last release in the GCC 10 series, released 2023-07-07.&lt;br /&gt;
# - 11.5.0:       Last release in the GCC 11 series, released 2024-07-19.&lt;br /&gt;
# Supported upstream:&lt;br /&gt;
# - 12.4.0:       Latest release in the GCC 12 series, released 2024-06-20.&lt;br /&gt;
# - stable:       Tested stable; based on GCC 13.2.0, released 2023-07-27.&lt;br /&gt;
# - 13.3.0:       Latest release in the GCC 13 series, released 2024-05-21.&lt;br /&gt;
# - 14.2.0:       Latest release in the GCC 14 series, released 2024-08-01.&lt;br /&gt;
# Development versions:&lt;br /&gt;
# - 13.3.1-dev    Bleeding edge GCC 13 series from git.&lt;br /&gt;
# - 14.2.1-dev    Bleeding edge GCC 14 series from git.&lt;br /&gt;
# - 15.0.0-dev    Bleeding edge GCC 15 series from git.&lt;br /&gt;
# - gccrs-dev:    GCC fork for development of the GCCRS Rust compiler.&lt;br /&gt;
# - rustc-dev:    GCC fork for development of the libgccjit rustc GCC codegen.&lt;br /&gt;
# If unsure, select stable. See README.md for more detailed descriptions.&lt;br /&gt;
toolchain_profile=stable&lt;br /&gt;
&lt;br /&gt;
########################&lt;br /&gt;
### DOWNLOAD OPTIONS ###&lt;br /&gt;
########################&lt;br /&gt;
&lt;br /&gt;
### Download protocol (http|https|ftp)&lt;br /&gt;
# Specify the protocol you want to use for downloading package files.&lt;br /&gt;
download_protocol=https&lt;br /&gt;
&lt;br /&gt;
### Force downloader (curl|wget)&lt;br /&gt;
# Specify here if you&#039;d prefer to use &#039;wget&#039; or &#039;curl&#039;. If neither is specified,&lt;br /&gt;
# a web downloader tool will be auto-detected in the following order: cURL, Wget&lt;br /&gt;
# You must have either Wget or cURL installed to use dc-chain.&lt;br /&gt;
#force_downloader=wget&lt;br /&gt;
&lt;br /&gt;
### Specify GNU mirror override&lt;br /&gt;
# The default mirror for GNU sources is &#039;ftpmirror.gnu.org&#039;&lt;br /&gt;
# This setting overrides the default mirror with a preferred mirror.&lt;br /&gt;
#gnu_mirror=mirrors.kernel.org&lt;br /&gt;
&lt;br /&gt;
#####################&lt;br /&gt;
### BUILD OPTIONS ###&lt;br /&gt;
#####################&lt;br /&gt;
&lt;br /&gt;
### SH toolchain install path&lt;br /&gt;
# Specify the directory where the SH toolchain will be installed. This setting&lt;br /&gt;
# must match the KOS_CC_BASE setting in your KOS &amp;quot;environ.sh&amp;quot; configuration.&lt;br /&gt;
sh_toolchain_path=/media/chris/development/dreamcast/toolchains/sh-elf&lt;br /&gt;
&lt;br /&gt;
### ARM toolchain install path&lt;br /&gt;
# Specify the directory where the ARM toolchain will be installed. This setting&lt;br /&gt;
# must match the DC_ARM_BASE setting in your KOS &amp;quot;environ.sh&amp;quot; configuration.&lt;br /&gt;
arm_toolchain_path=/media/chris/development/dreamcast/toolchains/arm-eabi&lt;br /&gt;
&lt;br /&gt;
### Make jobs (n|&amp;lt;empty&amp;gt;)&lt;br /&gt;
# Set this value to the number of parallel jobs you want to run with make.&lt;br /&gt;
# For fastest toolchain building, set to the number of CPU threads available.&lt;br /&gt;
# Using multiple jobs may cause issues in certain environments and may be&lt;br /&gt;
# automatically disabled. If you encounter errors building your toolchain,&lt;br /&gt;
# reduce the number of jobs to 1 to avoid issues and ease troubleshooting.&lt;br /&gt;
makejobs=16&lt;br /&gt;
&lt;br /&gt;
### Verbose (1|0)&lt;br /&gt;
# Choose whether to actively display compilation messages on the screen.&lt;br /&gt;
# Messages are saved to the build log files regardless of this setting.&lt;br /&gt;
verbose=1&lt;br /&gt;
&lt;br /&gt;
### Erase (1|0)&lt;br /&gt;
# Erase build directories as toolchain components are installed to save space.&lt;br /&gt;
erase=1&lt;br /&gt;
&lt;br /&gt;
### Install toolchain debug symbols (1|0)&lt;br /&gt;
# Choose whether to keep the debugging symbols for the toolchain.&lt;br /&gt;
# This is only useful if you wish to debug the toolchain itself.&lt;br /&gt;
#toolchain_debug=1&lt;br /&gt;
&lt;br /&gt;
########################&lt;br /&gt;
### LANGUAGE OPTIONS ###&lt;br /&gt;
########################&lt;br /&gt;
&lt;br /&gt;
### Enable C++&lt;br /&gt;
# Builds C++ support, including the C++ compiler and its standard library. The&lt;br /&gt;
# vast majority of language features are supported, with C++23 and early C++26&lt;br /&gt;
# support included. KallistiOS provides several examples with C++ support, so it&lt;br /&gt;
# is enabled by default. Adding C++ support requires extra disk space and&lt;br /&gt;
# compilation time, so you may disable it here if you do not plan on using C++.&lt;br /&gt;
enable_cpp=1&lt;br /&gt;
&lt;br /&gt;
### Enable Objective-C&lt;br /&gt;
# Builds Objective-C support. Currently, this builds the Obj-C compiler and&lt;br /&gt;
# runtime, but does not build a standard library. The GNUStep Base Library is&lt;br /&gt;
# currently in active development for future inclusion in the kos-ports library.&lt;br /&gt;
# KallistiOS provides examples with Obj-C support, so it is enabled by default.&lt;br /&gt;
enable_objc=1&lt;br /&gt;
&lt;br /&gt;
### Enable Objective C++&lt;br /&gt;
# Builds Objective C++ support. This hybrid language allows both C++ and Obj-C&lt;br /&gt;
# methods to be called from both contexts. Enabled by default as both the C++&lt;br /&gt;
# and Obj-C languages are already enabled by default.&lt;br /&gt;
enable_objcpp=1&lt;br /&gt;
&lt;br /&gt;
### Enable D&lt;br /&gt;
# Builds D support. This will build the D compiler, but does not build the&lt;br /&gt;
# Phobos Runtime Library. D support may only be enabled on POSIX platforms which&lt;br /&gt;
# have its external dependencies provided through a host DMD, GDC, or LDC&lt;br /&gt;
# compiler installation.&lt;br /&gt;
#enable_d=1&lt;br /&gt;
&lt;br /&gt;
### Enable Ada&lt;br /&gt;
# Builds Ada support. This will build the GNAT Ada compiler and tools but does&lt;br /&gt;
# not build the libada runtime library. In order for this build to succeed, the&lt;br /&gt;
# host&#039;s GCC version must match the target Dreamcast version, plus the same&lt;br /&gt;
# version of GNAT and its tools must be preinstalled (and in your path).&lt;br /&gt;
#enable_ada=1&lt;br /&gt;
&lt;br /&gt;
### Enable Rust&lt;br /&gt;
# Builds the work-in-progress GCCRS Rust compiler frontend for GCC. Requires a&lt;br /&gt;
# development version of GCC. Use with the gccrs-dev toolchain profile for the&lt;br /&gt;
# most recent updates to the GCCRS compiler. This option is not to be confused&lt;br /&gt;
# with using this toolchain as a backend for rustc; see libgccjit below.&lt;br /&gt;
#enable_rust=1&lt;br /&gt;
&lt;br /&gt;
### Enable libgccjit&lt;br /&gt;
# Enables the libgccjit embeddable GCC library. This is most commonly enabled to&lt;br /&gt;
# allow using this toolchain as a backend for the official rustc compiler. Use&lt;br /&gt;
# with the rustc-dev toolchain profile if this is your use case.&lt;br /&gt;
#enable_libgccjit=1&lt;br /&gt;
&lt;br /&gt;
###################&lt;br /&gt;
### GCC OPTIONS ###&lt;br /&gt;
###################&lt;br /&gt;
&lt;br /&gt;
### Floating point precision support (m4-single-only|m4-single|m4)&lt;br /&gt;
# Build support for various SH4 floating-point operation ABIs. KallistiOS only&lt;br /&gt;
# officially supports single-precision-only mode (m4-single-only); however,&lt;br /&gt;
# experimental support for single-precision-default mode (m4-single) has been&lt;br /&gt;
# added to allow for the use of full 64-bit doubles. You may also include&lt;br /&gt;
# double-precision-default (m4) which is untested and unsupported, or you may&lt;br /&gt;
# choose to specify only m4-single-only to save disk space.&lt;br /&gt;
precision_modes=m4-single-only,m4-single&lt;br /&gt;
&lt;br /&gt;
### Default floating point mode (m4|m4-single|m4-single-only)&lt;br /&gt;
# Choose the default floating point precision ABI used when GCC is invoked. This&lt;br /&gt;
# may be overridden by passing -m4-single-only, -m4-single, or -m4 to GCC.&lt;br /&gt;
# KOS currently only officially supports m4-single-only, so it is the default.&lt;br /&gt;
default_precision=m4-single-only&lt;br /&gt;
&lt;br /&gt;
### GCC threading model (single|kos)&lt;br /&gt;
# KallistiOS patches to GCC provide a &#039;kos&#039; thread model, which should be used.&lt;br /&gt;
# If you want to disable threading support for C++, Objective-C, and so forth,&lt;br /&gt;
# you can set this option to &#039;single&#039;.&lt;br /&gt;
thread_model=kos&lt;br /&gt;
&lt;br /&gt;
### Automatic patching for KallistiOS (1|0)&lt;br /&gt;
# Uncomment this option if you want to disable applying KallistiOS patches to&lt;br /&gt;
# toolchain source files before building. This will disable usage of the &#039;kos&#039;&lt;br /&gt;
# thread model. Only do this if you understand what you are doing.&lt;br /&gt;
#use_kos_patches=0&lt;br /&gt;
&lt;br /&gt;
### Disable GCC Native Language Support (1|0)&lt;br /&gt;
# By default, NLS allows GCC to output diagnostics in non-English languages.&lt;br /&gt;
# Uncomment this option to disable NLS and force GCC to output in English.&lt;br /&gt;
#disable_nls=1&lt;br /&gt;
&lt;br /&gt;
######################&lt;br /&gt;
### NEWLIB OPTIONS ###&lt;br /&gt;
######################&lt;br /&gt;
&lt;br /&gt;
### Automatic patching for Newlib (1|0)&lt;br /&gt;
# Uncomment this option if you want to disable the automatic patching of Newlib&lt;br /&gt;
# needed by KallistiOS. This will keep the generated toolchain completely raw.&lt;br /&gt;
# This will also disable the &#039;kos&#039; thread model. Only do this if you understand&lt;br /&gt;
# what you are doing.&lt;br /&gt;
#auto_fixup_sh4_newlib=0&lt;br /&gt;
&lt;br /&gt;
### C99 format specifier support (1|0)&lt;br /&gt;
# Define this to build Newlib with additional support for the C99 format&lt;br /&gt;
# specifiers, used by printf and friends. These include support for size_t,&lt;br /&gt;
# ptrdiff_t, intmax_t, and sized integral types.&lt;br /&gt;
newlib_c99_formats=1&lt;br /&gt;
&lt;br /&gt;
### Multibyte character set support (1|0)&lt;br /&gt;
# Define this to build Newlib with additional multibyte support. This enables&lt;br /&gt;
# three special locales: &amp;quot;C-JIS&amp;quot;, &amp;quot;C-SJIS&amp;quot;, and &amp;quot;C-EUCJP&amp;quot;. The multibyte&lt;br /&gt;
# support extends to the mb and wc functions in stdlib as well as format&lt;br /&gt;
# characters for the printf and scanf family of routines.&lt;br /&gt;
#newlib_multibyte=1&lt;br /&gt;
&lt;br /&gt;
### iconv() character encoding conversions support (encoding list)&lt;br /&gt;
# Define a list here to enable support for the iconv() function and &amp;lt;iconv.h&amp;gt;&lt;br /&gt;
# header file. The given comma separated list defines for which encoding types&lt;br /&gt;
# to include bidirectional conversion support. For the full list of available&lt;br /&gt;
# encodings, see the Newlib configuration documentation.&lt;br /&gt;
#newlib_iconv_encodings=us_ascii,utf8,utf16,ucs_2_internal,ucs_4_internal&lt;br /&gt;
&lt;br /&gt;
### Optimize Newlib for space (1|0)&lt;br /&gt;
# Uncomment this option to optimize for space when building Newlib. This will&lt;br /&gt;
# build Newlib with compiler flags which favor smaller code sizes over faster&lt;br /&gt;
# performance.&lt;br /&gt;
#newlib_opt_space=1&lt;br /&gt;
&lt;br /&gt;
###################&lt;br /&gt;
### C++ OPTIONS ###&lt;br /&gt;
###################&lt;br /&gt;
&lt;br /&gt;
### Timezone database support (1|0|path)&lt;br /&gt;
# Uncomment this option to enable building support for C++&#039;s std::chrono::tzdb&lt;br /&gt;
# into your C++ standard library by using a combination of the system&#039;s local&lt;br /&gt;
# timezone DB and one dynamically fetched from the &amp;quot;IANA Time Zone Database.&amp;quot;&lt;br /&gt;
# Without support enabled, only the &amp;quot;UTC&amp;quot; and &amp;quot;GMT&amp;quot; timezones will be defined.&lt;br /&gt;
# You can optionally provide the path to a directory with a custom &amp;quot;tzdata.zi&amp;quot;&lt;br /&gt;
# database file. NOTE: Enabling this will result in larger C++ binaries!&lt;br /&gt;
#libstdcxx_tzdb=1&lt;br /&gt;
&lt;br /&gt;
#######################&lt;br /&gt;
### WINDOWS OPTIONS ###&lt;br /&gt;
#######################&lt;br /&gt;
&lt;br /&gt;
### MinGW/MSYS&lt;br /&gt;
# Standalone binaries (1|0)&lt;br /&gt;
# Uncomment this option if you want static binaries that are standalone and&lt;br /&gt;
# require no dependencies. When this option is used, binaries can be run outside&lt;br /&gt;
# the MinGW/MSYS environment. This is NOT recommended; only do this if you know&lt;br /&gt;
# what you are doing.&lt;br /&gt;
#standalone_binary=1&lt;br /&gt;
&lt;br /&gt;
### Force installation of BFD for SH (1|0)&lt;br /&gt;
# Uncomment this option if you want to force installation of &#039;libbfd&#039; for the SH&lt;br /&gt;
# toolchain. This is required for MinGW/MSYS and can&#039;t be disabled in this&lt;br /&gt;
# scenario. This option is here mainly if you want to force the installation of&lt;br /&gt;
# &#039;libbfd&#039; under other environments, but this won&#039;t be necessary in most cases,&lt;br /&gt;
# as &#039;libelf&#039; is used almost everywhere. Please note, &#039;libbfd&#039; is not portable&lt;br /&gt;
# if you built it on another environment. Only use this flag if you understand&lt;br /&gt;
# what you are doing.&lt;br /&gt;
#sh_force_libbfd_installation=1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Make durchführen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PATH=/usr/bin make all&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== KOS bauen ====&lt;br /&gt;
&lt;br /&gt;
eviron.sh:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# KallistiOS Environment Settings&lt;br /&gt;
#&lt;br /&gt;
# This is a sample script for configuring and customizing your&lt;br /&gt;
# KOS build environment. Modify it to suit your setup. Several&lt;br /&gt;
# settings may be enabled optionally or are provided with&lt;br /&gt;
# alternative values.&lt;br /&gt;
#&lt;br /&gt;
# This script is typically sourced in your current shell environment&lt;br /&gt;
# (probably by .bashrc, .bash_profile, or something similar), so that&lt;br /&gt;
# the KOS environment is set up automatically for each shell session.&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
# Build Architecture&lt;br /&gt;
#&lt;br /&gt;
# Set the major architecture you&#039;ll be building for.&lt;br /&gt;
# The only option here is &amp;quot;dreamcast&amp;quot; as of KOS 2.0.0.&lt;br /&gt;
#&lt;br /&gt;
export KOS_ARCH=&amp;quot;dreamcast&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Build Sub-Architecture&lt;br /&gt;
#&lt;br /&gt;
# Defines the sub architecture your configuration&lt;br /&gt;
# is targeting or uses an existing value that&lt;br /&gt;
# can be set externally via your IDE.&lt;br /&gt;
#&lt;br /&gt;
# Valid values:&lt;br /&gt;
#   &amp;quot;pristine&amp;quot; - Dreamcast console or HKT-0120 devkit (default)&lt;br /&gt;
#   &amp;quot;naomi&amp;quot;    - NAOMI or NAOMI 2 arcade board&lt;br /&gt;
#&lt;br /&gt;
if [ -z &amp;quot;${KOS_SUBARCH}&amp;quot; ] ; then&lt;br /&gt;
    export KOS_SUBARCH=&amp;quot;pristine&amp;quot;&lt;br /&gt;
else&lt;br /&gt;
    export KOS_SUBARCH&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# KOS Root Path&lt;br /&gt;
#&lt;br /&gt;
# Specifies the path to the KOS root directory&lt;br /&gt;
#&lt;br /&gt;
export KOS_BASE=&amp;quot;/media/chris/development/dreamcast/toolchains/kos&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# KOS-Ports Path&lt;br /&gt;
#&lt;br /&gt;
# Specifies the path to the KOS-ports directory&lt;br /&gt;
#&lt;br /&gt;
export KOS_PORTS=&amp;quot;${KOS_BASE}/../kos-ports&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# SH Compiler Prefixes&lt;br /&gt;
#&lt;br /&gt;
# Specifies the path to and prefix for the main SH&lt;br /&gt;
# GCC toolchain used to target the Dreamcast&#039;s SH4 CPU.&lt;br /&gt;
#&lt;br /&gt;
export KOS_CC_BASE=&amp;quot;/media/chris/development/dreamcast/toolchains/sh-elf&amp;quot;&lt;br /&gt;
export KOS_CC_PREFIX=&amp;quot;sh-elf&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# ARM Compiler Prefixes&lt;br /&gt;
#&lt;br /&gt;
# Specifies the path to and prefix for the additional ARM&lt;br /&gt;
# GCC toolchain used to target the Dreamcast&#039;s AICA SPU.&lt;br /&gt;
#&lt;br /&gt;
export DC_ARM_BASE=&amp;quot;/media/chris/development/dreamcast/toolchains/arm-eabi&amp;quot;&lt;br /&gt;
export DC_ARM_PREFIX=&amp;quot;arm-eabi&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# External Dreamcast Tools Path&lt;br /&gt;
#&lt;br /&gt;
# Specifies the path where Dreamcast tools that are not part of KOS are to be&lt;br /&gt;
# installed. This includes, for example, dc-tool-ip, dc-tool-serial, and the&lt;br /&gt;
# mrbc bytecode compiler. This directory, along with SH and ARM compiler&lt;br /&gt;
# toolchains, will be added to your PATH environment variable.&lt;br /&gt;
#&lt;br /&gt;
export DC_TOOLS_BASE=&amp;quot;/media/chris/development/dreamcast/tools&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# CMake Toolchain Path&lt;br /&gt;
#&lt;br /&gt;
# Specifies the path to the toolchain file used to target&lt;br /&gt;
# KOS with the &amp;quot;cmake&amp;quot; build utility.&lt;br /&gt;
#&lt;br /&gt;
export KOS_CMAKE_TOOLCHAIN=&amp;quot;${KOS_BASE}/utils/cmake/dreamcast.toolchain.cmake&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Genromfs Utility Path&lt;br /&gt;
#&lt;br /&gt;
# Specifies the path to the utility which is used by KOS&lt;br /&gt;
# to create romdisk filesystem images.&lt;br /&gt;
#&lt;br /&gt;
export KOS_GENROMFS=&amp;quot;${KOS_BASE}/utils/genromfs/genromfs&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Make Utility&lt;br /&gt;
#&lt;br /&gt;
# Configures the tool to be used as the main &amp;quot;make&amp;quot; utility&lt;br /&gt;
# for building GNU Makefiles. On a platform such as BSD,&lt;br /&gt;
# the default can be changed to &amp;quot;gmake,&amp;quot; for the GNU&lt;br /&gt;
# implementation.&lt;br /&gt;
#&lt;br /&gt;
export KOS_MAKE=&amp;quot;make&amp;quot;&lt;br /&gt;
#export KOS_MAKE=&amp;quot;gmake&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Loader Utility&lt;br /&gt;
#&lt;br /&gt;
# Specifies the loader to be used with the &amp;quot;make run&amp;quot; targets&lt;br /&gt;
# in the KOS examples. Defaults to using a preconfigured version&lt;br /&gt;
# of dc-tool. Use one of the other options for a manual dc-tool-ip&lt;br /&gt;
# or dc-tool-serial configuration, remembering to change the values&lt;br /&gt;
# for the Dreamcast&#039;s IP address or the serial port interface.&lt;br /&gt;
#&lt;br /&gt;
#export KOS_LOADER=&amp;quot;dc-tool -x&amp;quot;&lt;br /&gt;
export KOS_LOADER=&amp;quot;dc-tool-ip -t dreamcast -x&amp;quot;&lt;br /&gt;
#export KOS_LOADER=&amp;quot;dc-tool-ser -t /dev/ttyS0 -x&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Default Compiler Flags&lt;br /&gt;
#&lt;br /&gt;
# Resets build flags. You can also initialize them to some preset&lt;br /&gt;
# default values here if you wish.&lt;br /&gt;
#&lt;br /&gt;
export KOS_INC_PATHS=&amp;quot;&amp;quot;&lt;br /&gt;
export KOS_CFLAGS=&amp;quot;&amp;quot;&lt;br /&gt;
export KOS_CPPFLAGS=&amp;quot;&amp;quot;&lt;br /&gt;
export KOS_LDFLAGS=&amp;quot;&amp;quot;&lt;br /&gt;
export KOS_AFLAGS=&amp;quot;&amp;quot;&lt;br /&gt;
export DC_ARM_LDFLAGS=&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Debug Builds&lt;br /&gt;
#&lt;br /&gt;
# Controls whether to disable additional debugging checks and assertions,&lt;br /&gt;
# such as for parameter validation or internal errors. Uncomment this if&lt;br /&gt;
# you do not wish to compile with this additional logic enabled.&lt;br /&gt;
#&lt;br /&gt;
#export KOS_CFLAGS=&amp;quot;${KOS_CFLAGS} -DNDEBUG&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Optimization Level&lt;br /&gt;
#&lt;br /&gt;
# Controls the baseline optimization level to use when building.&lt;br /&gt;
# Typically this is -Og (debugging), -O0, -O1, -O2, or -O3.&lt;br /&gt;
# NOTE: For our target, -O4 is a valid optimization level that has&lt;br /&gt;
# been seen to have some performance impact as well.&lt;br /&gt;
#&lt;br /&gt;
export KOS_CFLAGS=&amp;quot;${KOS_CFLAGS} -O2&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Additional Optimizations&lt;br /&gt;
#&lt;br /&gt;
# Uncomment this to enable what has been found empirically to be&lt;br /&gt;
# the optimal set of additional flags for release build performance&lt;br /&gt;
# on the current stable toolchain. NOTE: Certain KOS-ports and examples&lt;br /&gt;
# do not work properly with &amp;quot;-flto=auto&amp;quot;!&lt;br /&gt;
#&lt;br /&gt;
#export KOS_CFLAGS=&amp;quot;${KOS_CFLAGS} -freorder-blocks-algorithm=simple -flto=auto&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Frame Pointers&lt;br /&gt;
#&lt;br /&gt;
# Controls whether frame pointers are emitted or not. Disabled by&lt;br /&gt;
# default. Enable them if you plan to use GDB for debugging.&lt;br /&gt;
#&lt;br /&gt;
export KOS_CFLAGS=&amp;quot;${KOS_CFLAGS} -fomit-frame-pointer&amp;quot;&lt;br /&gt;
#export KOS_CFLAGS=&amp;quot;${KOS_CFLAGS} -fno-omit-frame-pointer -DFRAME_POINTERS&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Stack Protector&lt;br /&gt;
#&lt;br /&gt;
# Controls whether GCC emits extra code to check for buffer overflows or stack&lt;br /&gt;
# smashing, which can be very useful for debugging. -fstack-protector only&lt;br /&gt;
# covers vulnerable objects, while -fstack-protector-strong provides medium&lt;br /&gt;
# coverage, and -fstack-protector-all provides full coverage. You may also&lt;br /&gt;
# override the default stack excepton handler by providing your own&lt;br /&gt;
# implementation of &amp;quot;void __stack_chk_fail(void).&amp;quot;&lt;br /&gt;
#&lt;br /&gt;
#export KOS_CFLAGS=&amp;quot;${KOS_CFLAGS} -fstack-protector-all&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# GCC Builtin Functions&lt;br /&gt;
#&lt;br /&gt;
# Comment out this line to enable GCC to use its own builtin implementations of&lt;br /&gt;
# certain standard library functions. Under certain conditions, this can allow&lt;br /&gt;
# compiler-optimized implementations to replace standard function invocations.&lt;br /&gt;
# The downside of this is that it COULD interfere with Newlib or KOS implementations&lt;br /&gt;
# of these functions, and it has not been tested thoroughly to ensure compatibility.&lt;br /&gt;
#&lt;br /&gt;
export KOS_CFLAGS=&amp;quot;${KOS_CFLAGS} -fno-builtin&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Fast Math Instructions&lt;br /&gt;
#&lt;br /&gt;
# Uncomment this line to enable the optimized fast-math instructions (FSSRA,&lt;br /&gt;
# FSCA, and FSQRT) for calculating sin/cos, inverse square root, and square roots.&lt;br /&gt;
# These can result in substantial performance gains for these kinds of operations;&lt;br /&gt;
# however, they do so at the price of accuracy and are not IEEE compliant.&lt;br /&gt;
# NOTE: Enabling this option will also override -fno-builtin!&lt;br /&gt;
#&lt;br /&gt;
#export KOS_CFLAGS=&amp;quot;${KOS_CFLAGS} -fbuiltin -ffast-math -ffp-contract=fast&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# SH4 Floating-Point Arithmetic Precision&lt;br /&gt;
#&lt;br /&gt;
# KallistiOS supports both the single-precision-default ABI (m4-single) and the&lt;br /&gt;
# single-precision-only ABI (m4-single-only). When using m4-single, the SH4 will&lt;br /&gt;
# be in single-precision mode upon function entry but will switch to double-&lt;br /&gt;
# precision mode if 64-bit doubles are used. When using m4-single-only, the SH4&lt;br /&gt;
# will always be in single-precision mode and 64-bit doubles will be truncated to&lt;br /&gt;
# 32-bit floats. Historically, m4-single-only was used in both official and&lt;br /&gt;
# homebrew Dreamcast software, but m4-single is the default as of KOS 2.2.0 to&lt;br /&gt;
# increase compatibility with newer libraries which require 64-bit doubles.&lt;br /&gt;
#&lt;br /&gt;
# WARNING: When adjusting this setting, make sure all software, including&lt;br /&gt;
#          kos-ports and linked external libraries, are rebuilt using the same&lt;br /&gt;
#          floating-point precision ABI setting!&lt;br /&gt;
#&lt;br /&gt;
export KOS_SH4_PRECISION=&amp;quot;-m4-single&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Use LRA (Local Register Allocator) Pass&lt;br /&gt;
#&lt;br /&gt;
# Uncomment this line to use the modern Local Register Allocator pass during&lt;br /&gt;
# code generation instead of the default older reload pass. This option is&lt;br /&gt;
# known to be unstable or less performant for SH at this time, but will likely&lt;br /&gt;
# become mandatory in future versions of GCC, so feel free to help us test.&lt;br /&gt;
# Only enable this setting if you understand what you are doing!&lt;br /&gt;
#&lt;br /&gt;
#export KOS_CFLAGS=&amp;quot;${KOS_CFLAGS} -mlra&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Shared Compiler Configuration&lt;br /&gt;
#&lt;br /&gt;
# Include sub architecture-independent configuration file for shared&lt;br /&gt;
# environment settings. If you want to configure additional compiler&lt;br /&gt;
# options or see where other build flags are set, look at this file.&lt;br /&gt;
#&lt;br /&gt;
. ${KOS_BASE}/environ_base.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
. environ.sh&lt;br /&gt;
make&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== KOS-ports bauen ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone --recursive https://github.com/KallistiOS/kos-ports kos-ports&lt;br /&gt;
kos-ports/utils/build-all.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chris</name></author>
	</entry>
	<entry>
		<id>https://darkrealm-wiki.darkrealm.dyndns.org/index.php?title=Funktionierende_Toolchains&amp;diff=4830</id>
		<title>Funktionierende Toolchains</title>
		<link rel="alternate" type="text/html" href="https://darkrealm-wiki.darkrealm.dyndns.org/index.php?title=Funktionierende_Toolchains&amp;diff=4830"/>
		<updated>2025-04-18T22:17:16Z</updated>

		<summary type="html">&lt;p&gt;Chris: /* KallistiOS Toolchain */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== KallistiOS Toolchain ==&lt;br /&gt;
&lt;br /&gt;
Voraussetzungen:&lt;br /&gt;
&lt;br /&gt;
* Wenn die Toolchain innerhalb eines CIFS-Mounts installiert wird müssen *mfsymlinks in den Mountoptions aktiviert sein!&lt;br /&gt;
&lt;br /&gt;
=== Crosscompiler bauen ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /media/chris/development/dreamcast/toolchains&lt;br /&gt;
cd /media/chris/development/dreamcast/toolchains&lt;br /&gt;
git clone https://github.com/KallistiOS/KallistiOS.git kos&lt;br /&gt;
cd kos/utils/dc-chain/&lt;br /&gt;
cp -av Makefile.default.cfg Makefile.cfg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Makefile.cfg bearbeiten ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Sega Dreamcast Toolchains Maker (dc-chain)&lt;br /&gt;
# This file is part of KallistiOS.&lt;br /&gt;
&lt;br /&gt;
#########################&lt;br /&gt;
### TOOLCHAIN PROFILE ###&lt;br /&gt;
#########################&lt;br /&gt;
&lt;br /&gt;
# Choose a toolchain profile from the following available options:&lt;br /&gt;
# No longer supported upstream:&lt;br /&gt;
# - 9.3.0-legacy: Former &#039;stable&#039; option, based on GCC 9.3.0 and Newlib 3.3.0.&lt;br /&gt;
# - 9.5.0-winxp:  Most recent versions of tools which run on Windows XP.&lt;br /&gt;
# - 10.5.0:       Last release in the GCC 10 series, released 2023-07-07.&lt;br /&gt;
# - 11.5.0:       Last release in the GCC 11 series, released 2024-07-19.&lt;br /&gt;
# Supported upstream:&lt;br /&gt;
# - 12.4.0:       Latest release in the GCC 12 series, released 2024-06-20.&lt;br /&gt;
# - stable:       Tested stable; based on GCC 13.2.0, released 2023-07-27.&lt;br /&gt;
# - 13.3.0:       Latest release in the GCC 13 series, released 2024-05-21.&lt;br /&gt;
# - 14.2.0:       Latest release in the GCC 14 series, released 2024-08-01.&lt;br /&gt;
# Development versions:&lt;br /&gt;
# - 13.3.1-dev    Bleeding edge GCC 13 series from git.&lt;br /&gt;
# - 14.2.1-dev    Bleeding edge GCC 14 series from git.&lt;br /&gt;
# - 15.0.0-dev    Bleeding edge GCC 15 series from git.&lt;br /&gt;
# - gccrs-dev:    GCC fork for development of the GCCRS Rust compiler.&lt;br /&gt;
# - rustc-dev:    GCC fork for development of the libgccjit rustc GCC codegen.&lt;br /&gt;
# If unsure, select stable. See README.md for more detailed descriptions.&lt;br /&gt;
toolchain_profile=stable&lt;br /&gt;
&lt;br /&gt;
########################&lt;br /&gt;
### DOWNLOAD OPTIONS ###&lt;br /&gt;
########################&lt;br /&gt;
&lt;br /&gt;
### Download protocol (http|https|ftp)&lt;br /&gt;
# Specify the protocol you want to use for downloading package files.&lt;br /&gt;
download_protocol=https&lt;br /&gt;
&lt;br /&gt;
### Force downloader (curl|wget)&lt;br /&gt;
# Specify here if you&#039;d prefer to use &#039;wget&#039; or &#039;curl&#039;. If neither is specified,&lt;br /&gt;
# a web downloader tool will be auto-detected in the following order: cURL, Wget&lt;br /&gt;
# You must have either Wget or cURL installed to use dc-chain.&lt;br /&gt;
#force_downloader=wget&lt;br /&gt;
&lt;br /&gt;
### Specify GNU mirror override&lt;br /&gt;
# The default mirror for GNU sources is &#039;ftpmirror.gnu.org&#039;&lt;br /&gt;
# This setting overrides the default mirror with a preferred mirror.&lt;br /&gt;
#gnu_mirror=mirrors.kernel.org&lt;br /&gt;
&lt;br /&gt;
#####################&lt;br /&gt;
### BUILD OPTIONS ###&lt;br /&gt;
#####################&lt;br /&gt;
&lt;br /&gt;
### SH toolchain install path&lt;br /&gt;
# Specify the directory where the SH toolchain will be installed. This setting&lt;br /&gt;
# must match the KOS_CC_BASE setting in your KOS &amp;quot;environ.sh&amp;quot; configuration.&lt;br /&gt;
sh_toolchain_path=/media/chris/development/dreamcast/toolchains/sh-elf&lt;br /&gt;
&lt;br /&gt;
### ARM toolchain install path&lt;br /&gt;
# Specify the directory where the ARM toolchain will be installed. This setting&lt;br /&gt;
# must match the DC_ARM_BASE setting in your KOS &amp;quot;environ.sh&amp;quot; configuration.&lt;br /&gt;
arm_toolchain_path=/media/chris/development/dreamcast/toolchains/arm-eabi&lt;br /&gt;
&lt;br /&gt;
### Make jobs (n|&amp;lt;empty&amp;gt;)&lt;br /&gt;
# Set this value to the number of parallel jobs you want to run with make.&lt;br /&gt;
# For fastest toolchain building, set to the number of CPU threads available.&lt;br /&gt;
# Using multiple jobs may cause issues in certain environments and may be&lt;br /&gt;
# automatically disabled. If you encounter errors building your toolchain,&lt;br /&gt;
# reduce the number of jobs to 1 to avoid issues and ease troubleshooting.&lt;br /&gt;
makejobs=16&lt;br /&gt;
&lt;br /&gt;
### Verbose (1|0)&lt;br /&gt;
# Choose whether to actively display compilation messages on the screen.&lt;br /&gt;
# Messages are saved to the build log files regardless of this setting.&lt;br /&gt;
verbose=1&lt;br /&gt;
&lt;br /&gt;
### Erase (1|0)&lt;br /&gt;
# Erase build directories as toolchain components are installed to save space.&lt;br /&gt;
erase=1&lt;br /&gt;
&lt;br /&gt;
### Install toolchain debug symbols (1|0)&lt;br /&gt;
# Choose whether to keep the debugging symbols for the toolchain.&lt;br /&gt;
# This is only useful if you wish to debug the toolchain itself.&lt;br /&gt;
#toolchain_debug=1&lt;br /&gt;
&lt;br /&gt;
########################&lt;br /&gt;
### LANGUAGE OPTIONS ###&lt;br /&gt;
########################&lt;br /&gt;
&lt;br /&gt;
### Enable C++&lt;br /&gt;
# Builds C++ support, including the C++ compiler and its standard library. The&lt;br /&gt;
# vast majority of language features are supported, with C++23 and early C++26&lt;br /&gt;
# support included. KallistiOS provides several examples with C++ support, so it&lt;br /&gt;
# is enabled by default. Adding C++ support requires extra disk space and&lt;br /&gt;
# compilation time, so you may disable it here if you do not plan on using C++.&lt;br /&gt;
enable_cpp=1&lt;br /&gt;
&lt;br /&gt;
### Enable Objective-C&lt;br /&gt;
# Builds Objective-C support. Currently, this builds the Obj-C compiler and&lt;br /&gt;
# runtime, but does not build a standard library. The GNUStep Base Library is&lt;br /&gt;
# currently in active development for future inclusion in the kos-ports library.&lt;br /&gt;
# KallistiOS provides examples with Obj-C support, so it is enabled by default.&lt;br /&gt;
enable_objc=1&lt;br /&gt;
&lt;br /&gt;
### Enable Objective C++&lt;br /&gt;
# Builds Objective C++ support. This hybrid language allows both C++ and Obj-C&lt;br /&gt;
# methods to be called from both contexts. Enabled by default as both the C++&lt;br /&gt;
# and Obj-C languages are already enabled by default.&lt;br /&gt;
enable_objcpp=1&lt;br /&gt;
&lt;br /&gt;
### Enable D&lt;br /&gt;
# Builds D support. This will build the D compiler, but does not build the&lt;br /&gt;
# Phobos Runtime Library. D support may only be enabled on POSIX platforms which&lt;br /&gt;
# have its external dependencies provided through a host DMD, GDC, or LDC&lt;br /&gt;
# compiler installation.&lt;br /&gt;
#enable_d=1&lt;br /&gt;
&lt;br /&gt;
### Enable Ada&lt;br /&gt;
# Builds Ada support. This will build the GNAT Ada compiler and tools but does&lt;br /&gt;
# not build the libada runtime library. In order for this build to succeed, the&lt;br /&gt;
# host&#039;s GCC version must match the target Dreamcast version, plus the same&lt;br /&gt;
# version of GNAT and its tools must be preinstalled (and in your path).&lt;br /&gt;
#enable_ada=1&lt;br /&gt;
&lt;br /&gt;
### Enable Rust&lt;br /&gt;
# Builds the work-in-progress GCCRS Rust compiler frontend for GCC. Requires a&lt;br /&gt;
# development version of GCC. Use with the gccrs-dev toolchain profile for the&lt;br /&gt;
# most recent updates to the GCCRS compiler. This option is not to be confused&lt;br /&gt;
# with using this toolchain as a backend for rustc; see libgccjit below.&lt;br /&gt;
#enable_rust=1&lt;br /&gt;
&lt;br /&gt;
### Enable libgccjit&lt;br /&gt;
# Enables the libgccjit embeddable GCC library. This is most commonly enabled to&lt;br /&gt;
# allow using this toolchain as a backend for the official rustc compiler. Use&lt;br /&gt;
# with the rustc-dev toolchain profile if this is your use case.&lt;br /&gt;
#enable_libgccjit=1&lt;br /&gt;
&lt;br /&gt;
###################&lt;br /&gt;
### GCC OPTIONS ###&lt;br /&gt;
###################&lt;br /&gt;
&lt;br /&gt;
### Floating point precision support (m4-single-only|m4-single|m4)&lt;br /&gt;
# Build support for various SH4 floating-point operation ABIs. KallistiOS only&lt;br /&gt;
# officially supports single-precision-only mode (m4-single-only); however,&lt;br /&gt;
# experimental support for single-precision-default mode (m4-single) has been&lt;br /&gt;
# added to allow for the use of full 64-bit doubles. You may also include&lt;br /&gt;
# double-precision-default (m4) which is untested and unsupported, or you may&lt;br /&gt;
# choose to specify only m4-single-only to save disk space.&lt;br /&gt;
precision_modes=m4-single-only,m4-single&lt;br /&gt;
&lt;br /&gt;
### Default floating point mode (m4|m4-single|m4-single-only)&lt;br /&gt;
# Choose the default floating point precision ABI used when GCC is invoked. This&lt;br /&gt;
# may be overridden by passing -m4-single-only, -m4-single, or -m4 to GCC.&lt;br /&gt;
# KOS currently only officially supports m4-single-only, so it is the default.&lt;br /&gt;
default_precision=m4-single-only&lt;br /&gt;
&lt;br /&gt;
### GCC threading model (single|kos)&lt;br /&gt;
# KallistiOS patches to GCC provide a &#039;kos&#039; thread model, which should be used.&lt;br /&gt;
# If you want to disable threading support for C++, Objective-C, and so forth,&lt;br /&gt;
# you can set this option to &#039;single&#039;.&lt;br /&gt;
thread_model=kos&lt;br /&gt;
&lt;br /&gt;
### Automatic patching for KallistiOS (1|0)&lt;br /&gt;
# Uncomment this option if you want to disable applying KallistiOS patches to&lt;br /&gt;
# toolchain source files before building. This will disable usage of the &#039;kos&#039;&lt;br /&gt;
# thread model. Only do this if you understand what you are doing.&lt;br /&gt;
#use_kos_patches=0&lt;br /&gt;
&lt;br /&gt;
### Disable GCC Native Language Support (1|0)&lt;br /&gt;
# By default, NLS allows GCC to output diagnostics in non-English languages.&lt;br /&gt;
# Uncomment this option to disable NLS and force GCC to output in English.&lt;br /&gt;
#disable_nls=1&lt;br /&gt;
&lt;br /&gt;
######################&lt;br /&gt;
### NEWLIB OPTIONS ###&lt;br /&gt;
######################&lt;br /&gt;
&lt;br /&gt;
### Automatic patching for Newlib (1|0)&lt;br /&gt;
# Uncomment this option if you want to disable the automatic patching of Newlib&lt;br /&gt;
# needed by KallistiOS. This will keep the generated toolchain completely raw.&lt;br /&gt;
# This will also disable the &#039;kos&#039; thread model. Only do this if you understand&lt;br /&gt;
# what you are doing.&lt;br /&gt;
#auto_fixup_sh4_newlib=0&lt;br /&gt;
&lt;br /&gt;
### C99 format specifier support (1|0)&lt;br /&gt;
# Define this to build Newlib with additional support for the C99 format&lt;br /&gt;
# specifiers, used by printf and friends. These include support for size_t,&lt;br /&gt;
# ptrdiff_t, intmax_t, and sized integral types.&lt;br /&gt;
newlib_c99_formats=1&lt;br /&gt;
&lt;br /&gt;
### Multibyte character set support (1|0)&lt;br /&gt;
# Define this to build Newlib with additional multibyte support. This enables&lt;br /&gt;
# three special locales: &amp;quot;C-JIS&amp;quot;, &amp;quot;C-SJIS&amp;quot;, and &amp;quot;C-EUCJP&amp;quot;. The multibyte&lt;br /&gt;
# support extends to the mb and wc functions in stdlib as well as format&lt;br /&gt;
# characters for the printf and scanf family of routines.&lt;br /&gt;
#newlib_multibyte=1&lt;br /&gt;
&lt;br /&gt;
### iconv() character encoding conversions support (encoding list)&lt;br /&gt;
# Define a list here to enable support for the iconv() function and &amp;lt;iconv.h&amp;gt;&lt;br /&gt;
# header file. The given comma separated list defines for which encoding types&lt;br /&gt;
# to include bidirectional conversion support. For the full list of available&lt;br /&gt;
# encodings, see the Newlib configuration documentation.&lt;br /&gt;
#newlib_iconv_encodings=us_ascii,utf8,utf16,ucs_2_internal,ucs_4_internal&lt;br /&gt;
&lt;br /&gt;
### Optimize Newlib for space (1|0)&lt;br /&gt;
# Uncomment this option to optimize for space when building Newlib. This will&lt;br /&gt;
# build Newlib with compiler flags which favor smaller code sizes over faster&lt;br /&gt;
# performance.&lt;br /&gt;
#newlib_opt_space=1&lt;br /&gt;
&lt;br /&gt;
###################&lt;br /&gt;
### C++ OPTIONS ###&lt;br /&gt;
###################&lt;br /&gt;
&lt;br /&gt;
### Timezone database support (1|0|path)&lt;br /&gt;
# Uncomment this option to enable building support for C++&#039;s std::chrono::tzdb&lt;br /&gt;
# into your C++ standard library by using a combination of the system&#039;s local&lt;br /&gt;
# timezone DB and one dynamically fetched from the &amp;quot;IANA Time Zone Database.&amp;quot;&lt;br /&gt;
# Without support enabled, only the &amp;quot;UTC&amp;quot; and &amp;quot;GMT&amp;quot; timezones will be defined.&lt;br /&gt;
# You can optionally provide the path to a directory with a custom &amp;quot;tzdata.zi&amp;quot;&lt;br /&gt;
# database file. NOTE: Enabling this will result in larger C++ binaries!&lt;br /&gt;
#libstdcxx_tzdb=1&lt;br /&gt;
&lt;br /&gt;
#######################&lt;br /&gt;
### WINDOWS OPTIONS ###&lt;br /&gt;
#######################&lt;br /&gt;
&lt;br /&gt;
### MinGW/MSYS&lt;br /&gt;
# Standalone binaries (1|0)&lt;br /&gt;
# Uncomment this option if you want static binaries that are standalone and&lt;br /&gt;
# require no dependencies. When this option is used, binaries can be run outside&lt;br /&gt;
# the MinGW/MSYS environment. This is NOT recommended; only do this if you know&lt;br /&gt;
# what you are doing.&lt;br /&gt;
#standalone_binary=1&lt;br /&gt;
&lt;br /&gt;
### Force installation of BFD for SH (1|0)&lt;br /&gt;
# Uncomment this option if you want to force installation of &#039;libbfd&#039; for the SH&lt;br /&gt;
# toolchain. This is required for MinGW/MSYS and can&#039;t be disabled in this&lt;br /&gt;
# scenario. This option is here mainly if you want to force the installation of&lt;br /&gt;
# &#039;libbfd&#039; under other environments, but this won&#039;t be necessary in most cases,&lt;br /&gt;
# as &#039;libelf&#039; is used almost everywhere. Please note, &#039;libbfd&#039; is not portable&lt;br /&gt;
# if you built it on another environment. Only use this flag if you understand&lt;br /&gt;
# what you are doing.&lt;br /&gt;
#sh_force_libbfd_installation=1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Make durchführen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PATH=/usr/bin make all&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== KOS bauen ====&lt;br /&gt;
&lt;br /&gt;
eviron.sh:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# KallistiOS Environment Settings&lt;br /&gt;
#&lt;br /&gt;
# This is a sample script for configuring and customizing your&lt;br /&gt;
# KOS build environment. Modify it to suit your setup. Several&lt;br /&gt;
# settings may be enabled optionally or are provided with&lt;br /&gt;
# alternative values.&lt;br /&gt;
#&lt;br /&gt;
# This script is typically sourced in your current shell environment&lt;br /&gt;
# (probably by .bashrc, .bash_profile, or something similar), so that&lt;br /&gt;
# the KOS environment is set up automatically for each shell session.&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
# Build Architecture&lt;br /&gt;
#&lt;br /&gt;
# Set the major architecture you&#039;ll be building for.&lt;br /&gt;
# The only option here is &amp;quot;dreamcast&amp;quot; as of KOS 2.0.0.&lt;br /&gt;
#&lt;br /&gt;
export KOS_ARCH=&amp;quot;dreamcast&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Build Sub-Architecture&lt;br /&gt;
#&lt;br /&gt;
# Defines the sub architecture your configuration&lt;br /&gt;
# is targeting or uses an existing value that&lt;br /&gt;
# can be set externally via your IDE.&lt;br /&gt;
#&lt;br /&gt;
# Valid values:&lt;br /&gt;
#   &amp;quot;pristine&amp;quot; - Dreamcast console or HKT-0120 devkit (default)&lt;br /&gt;
#   &amp;quot;naomi&amp;quot;    - NAOMI or NAOMI 2 arcade board&lt;br /&gt;
#&lt;br /&gt;
if [ -z &amp;quot;${KOS_SUBARCH}&amp;quot; ] ; then&lt;br /&gt;
    export KOS_SUBARCH=&amp;quot;pristine&amp;quot;&lt;br /&gt;
else&lt;br /&gt;
    export KOS_SUBARCH&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# KOS Root Path&lt;br /&gt;
#&lt;br /&gt;
# Specifies the path to the KOS root directory&lt;br /&gt;
#&lt;br /&gt;
export KOS_BASE=&amp;quot;/media/chris/development/dreamcast/toolchains/kos&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# KOS-Ports Path&lt;br /&gt;
#&lt;br /&gt;
# Specifies the path to the KOS-ports directory&lt;br /&gt;
#&lt;br /&gt;
export KOS_PORTS=&amp;quot;${KOS_BASE}/../kos-ports&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# SH Compiler Prefixes&lt;br /&gt;
#&lt;br /&gt;
# Specifies the path to and prefix for the main SH&lt;br /&gt;
# GCC toolchain used to target the Dreamcast&#039;s SH4 CPU.&lt;br /&gt;
#&lt;br /&gt;
export KOS_CC_BASE=&amp;quot;/media/chris/development/dreamcast/toolchains/sh-elf&amp;quot;&lt;br /&gt;
export KOS_CC_PREFIX=&amp;quot;sh-elf&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# ARM Compiler Prefixes&lt;br /&gt;
#&lt;br /&gt;
# Specifies the path to and prefix for the additional ARM&lt;br /&gt;
# GCC toolchain used to target the Dreamcast&#039;s AICA SPU.&lt;br /&gt;
#&lt;br /&gt;
export DC_ARM_BASE=&amp;quot;/media/chris/development/dreamcast/toolchains/arm-eabi&amp;quot;&lt;br /&gt;
export DC_ARM_PREFIX=&amp;quot;arm-eabi&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# External Dreamcast Tools Path&lt;br /&gt;
#&lt;br /&gt;
# Specifies the path where Dreamcast tools that are not part of KOS are to be&lt;br /&gt;
# installed. This includes, for example, dc-tool-ip, dc-tool-serial, and the&lt;br /&gt;
# mrbc bytecode compiler. This directory, along with SH and ARM compiler&lt;br /&gt;
# toolchains, will be added to your PATH environment variable.&lt;br /&gt;
#&lt;br /&gt;
export DC_TOOLS_BASE=&amp;quot;/media/chris/development/dreamcast/tools&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# CMake Toolchain Path&lt;br /&gt;
#&lt;br /&gt;
# Specifies the path to the toolchain file used to target&lt;br /&gt;
# KOS with the &amp;quot;cmake&amp;quot; build utility.&lt;br /&gt;
#&lt;br /&gt;
export KOS_CMAKE_TOOLCHAIN=&amp;quot;${KOS_BASE}/utils/cmake/dreamcast.toolchain.cmake&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Genromfs Utility Path&lt;br /&gt;
#&lt;br /&gt;
# Specifies the path to the utility which is used by KOS&lt;br /&gt;
# to create romdisk filesystem images.&lt;br /&gt;
#&lt;br /&gt;
export KOS_GENROMFS=&amp;quot;${KOS_BASE}/utils/genromfs/genromfs&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Make Utility&lt;br /&gt;
#&lt;br /&gt;
# Configures the tool to be used as the main &amp;quot;make&amp;quot; utility&lt;br /&gt;
# for building GNU Makefiles. On a platform such as BSD,&lt;br /&gt;
# the default can be changed to &amp;quot;gmake,&amp;quot; for the GNU&lt;br /&gt;
# implementation.&lt;br /&gt;
#&lt;br /&gt;
export KOS_MAKE=&amp;quot;make&amp;quot;&lt;br /&gt;
#export KOS_MAKE=&amp;quot;gmake&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Loader Utility&lt;br /&gt;
#&lt;br /&gt;
# Specifies the loader to be used with the &amp;quot;make run&amp;quot; targets&lt;br /&gt;
# in the KOS examples. Defaults to using a preconfigured version&lt;br /&gt;
# of dc-tool. Use one of the other options for a manual dc-tool-ip&lt;br /&gt;
# or dc-tool-serial configuration, remembering to change the values&lt;br /&gt;
# for the Dreamcast&#039;s IP address or the serial port interface.&lt;br /&gt;
#&lt;br /&gt;
#export KOS_LOADER=&amp;quot;dc-tool -x&amp;quot;&lt;br /&gt;
export KOS_LOADER=&amp;quot;dc-tool-ip -t dreamcast -x&amp;quot;&lt;br /&gt;
#export KOS_LOADER=&amp;quot;dc-tool-ser -t /dev/ttyS0 -x&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Default Compiler Flags&lt;br /&gt;
#&lt;br /&gt;
# Resets build flags. You can also initialize them to some preset&lt;br /&gt;
# default values here if you wish.&lt;br /&gt;
#&lt;br /&gt;
export KOS_INC_PATHS=&amp;quot;&amp;quot;&lt;br /&gt;
export KOS_CFLAGS=&amp;quot;&amp;quot;&lt;br /&gt;
export KOS_CPPFLAGS=&amp;quot;&amp;quot;&lt;br /&gt;
export KOS_LDFLAGS=&amp;quot;&amp;quot;&lt;br /&gt;
export KOS_AFLAGS=&amp;quot;&amp;quot;&lt;br /&gt;
export DC_ARM_LDFLAGS=&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Debug Builds&lt;br /&gt;
#&lt;br /&gt;
# Controls whether to disable additional debugging checks and assertions,&lt;br /&gt;
# such as for parameter validation or internal errors. Uncomment this if&lt;br /&gt;
# you do not wish to compile with this additional logic enabled.&lt;br /&gt;
#&lt;br /&gt;
#export KOS_CFLAGS=&amp;quot;${KOS_CFLAGS} -DNDEBUG&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Optimization Level&lt;br /&gt;
#&lt;br /&gt;
# Controls the baseline optimization level to use when building.&lt;br /&gt;
# Typically this is -Og (debugging), -O0, -O1, -O2, or -O3.&lt;br /&gt;
# NOTE: For our target, -O4 is a valid optimization level that has&lt;br /&gt;
# been seen to have some performance impact as well.&lt;br /&gt;
#&lt;br /&gt;
export KOS_CFLAGS=&amp;quot;${KOS_CFLAGS} -O2&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Additional Optimizations&lt;br /&gt;
#&lt;br /&gt;
# Uncomment this to enable what has been found empirically to be&lt;br /&gt;
# the optimal set of additional flags for release build performance&lt;br /&gt;
# on the current stable toolchain. NOTE: Certain KOS-ports and examples&lt;br /&gt;
# do not work properly with &amp;quot;-flto=auto&amp;quot;!&lt;br /&gt;
#&lt;br /&gt;
#export KOS_CFLAGS=&amp;quot;${KOS_CFLAGS} -freorder-blocks-algorithm=simple -flto=auto&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Frame Pointers&lt;br /&gt;
#&lt;br /&gt;
# Controls whether frame pointers are emitted or not. Disabled by&lt;br /&gt;
# default. Enable them if you plan to use GDB for debugging.&lt;br /&gt;
#&lt;br /&gt;
export KOS_CFLAGS=&amp;quot;${KOS_CFLAGS} -fomit-frame-pointer&amp;quot;&lt;br /&gt;
#export KOS_CFLAGS=&amp;quot;${KOS_CFLAGS} -fno-omit-frame-pointer -DFRAME_POINTERS&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Stack Protector&lt;br /&gt;
#&lt;br /&gt;
# Controls whether GCC emits extra code to check for buffer overflows or stack&lt;br /&gt;
# smashing, which can be very useful for debugging. -fstack-protector only&lt;br /&gt;
# covers vulnerable objects, while -fstack-protector-strong provides medium&lt;br /&gt;
# coverage, and -fstack-protector-all provides full coverage. You may also&lt;br /&gt;
# override the default stack excepton handler by providing your own&lt;br /&gt;
# implementation of &amp;quot;void __stack_chk_fail(void).&amp;quot;&lt;br /&gt;
#&lt;br /&gt;
#export KOS_CFLAGS=&amp;quot;${KOS_CFLAGS} -fstack-protector-all&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# GCC Builtin Functions&lt;br /&gt;
#&lt;br /&gt;
# Comment out this line to enable GCC to use its own builtin implementations of&lt;br /&gt;
# certain standard library functions. Under certain conditions, this can allow&lt;br /&gt;
# compiler-optimized implementations to replace standard function invocations.&lt;br /&gt;
# The downside of this is that it COULD interfere with Newlib or KOS implementations&lt;br /&gt;
# of these functions, and it has not been tested thoroughly to ensure compatibility.&lt;br /&gt;
#&lt;br /&gt;
export KOS_CFLAGS=&amp;quot;${KOS_CFLAGS} -fno-builtin&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Fast Math Instructions&lt;br /&gt;
#&lt;br /&gt;
# Uncomment this line to enable the optimized fast-math instructions (FSSRA,&lt;br /&gt;
# FSCA, and FSQRT) for calculating sin/cos, inverse square root, and square roots.&lt;br /&gt;
# These can result in substantial performance gains for these kinds of operations;&lt;br /&gt;
# however, they do so at the price of accuracy and are not IEEE compliant.&lt;br /&gt;
# NOTE: Enabling this option will also override -fno-builtin!&lt;br /&gt;
#&lt;br /&gt;
#export KOS_CFLAGS=&amp;quot;${KOS_CFLAGS} -fbuiltin -ffast-math -ffp-contract=fast&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# SH4 Floating-Point Arithmetic Precision&lt;br /&gt;
#&lt;br /&gt;
# KallistiOS supports both the single-precision-default ABI (m4-single) and the&lt;br /&gt;
# single-precision-only ABI (m4-single-only). When using m4-single, the SH4 will&lt;br /&gt;
# be in single-precision mode upon function entry but will switch to double-&lt;br /&gt;
# precision mode if 64-bit doubles are used. When using m4-single-only, the SH4&lt;br /&gt;
# will always be in single-precision mode and 64-bit doubles will be truncated to&lt;br /&gt;
# 32-bit floats. Historically, m4-single-only was used in both official and&lt;br /&gt;
# homebrew Dreamcast software, but m4-single is the default as of KOS 2.2.0 to&lt;br /&gt;
# increase compatibility with newer libraries which require 64-bit doubles.&lt;br /&gt;
#&lt;br /&gt;
# WARNING: When adjusting this setting, make sure all software, including&lt;br /&gt;
#          kos-ports and linked external libraries, are rebuilt using the same&lt;br /&gt;
#          floating-point precision ABI setting!&lt;br /&gt;
#&lt;br /&gt;
export KOS_SH4_PRECISION=&amp;quot;-m4-single&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Use LRA (Local Register Allocator) Pass&lt;br /&gt;
#&lt;br /&gt;
# Uncomment this line to use the modern Local Register Allocator pass during&lt;br /&gt;
# code generation instead of the default older reload pass. This option is&lt;br /&gt;
# known to be unstable or less performant for SH at this time, but will likely&lt;br /&gt;
# become mandatory in future versions of GCC, so feel free to help us test.&lt;br /&gt;
# Only enable this setting if you understand what you are doing!&lt;br /&gt;
#&lt;br /&gt;
#export KOS_CFLAGS=&amp;quot;${KOS_CFLAGS} -mlra&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Shared Compiler Configuration&lt;br /&gt;
#&lt;br /&gt;
# Include sub architecture-independent configuration file for shared&lt;br /&gt;
# environment settings. If you want to configure additional compiler&lt;br /&gt;
# options or see where other build flags are set, look at this file.&lt;br /&gt;
#&lt;br /&gt;
. ${KOS_BASE}/environ_base.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
. environ.sh&lt;br /&gt;
make&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== KOS-ports bauen ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone --recursive https://github.com/KallistiOS/kos-ports kos-ports&lt;br /&gt;
kos-ports/utils/build-all.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chris</name></author>
	</entry>
	<entry>
		<id>https://darkrealm-wiki.darkrealm.dyndns.org/index.php?title=Funktionierende_Toolchains&amp;diff=4829</id>
		<title>Funktionierende Toolchains</title>
		<link rel="alternate" type="text/html" href="https://darkrealm-wiki.darkrealm.dyndns.org/index.php?title=Funktionierende_Toolchains&amp;diff=4829"/>
		<updated>2025-04-18T22:16:59Z</updated>

		<summary type="html">&lt;p&gt;Chris: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== KallistiOS Toolchain ==&lt;br /&gt;
&lt;br /&gt;
Voraussetzungen:&lt;br /&gt;
&lt;br /&gt;
* Wenn die Toolchain innerhalb eines CIFS-Mounts installiert wird müssen *mfsymlinks* in den Mountoptions aktiviert sein!&lt;br /&gt;
&lt;br /&gt;
=== Crosscompiler bauen ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /media/chris/development/dreamcast/toolchains&lt;br /&gt;
cd /media/chris/development/dreamcast/toolchains&lt;br /&gt;
git clone https://github.com/KallistiOS/KallistiOS.git kos&lt;br /&gt;
cd kos/utils/dc-chain/&lt;br /&gt;
cp -av Makefile.default.cfg Makefile.cfg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Makefile.cfg bearbeiten ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Sega Dreamcast Toolchains Maker (dc-chain)&lt;br /&gt;
# This file is part of KallistiOS.&lt;br /&gt;
&lt;br /&gt;
#########################&lt;br /&gt;
### TOOLCHAIN PROFILE ###&lt;br /&gt;
#########################&lt;br /&gt;
&lt;br /&gt;
# Choose a toolchain profile from the following available options:&lt;br /&gt;
# No longer supported upstream:&lt;br /&gt;
# - 9.3.0-legacy: Former &#039;stable&#039; option, based on GCC 9.3.0 and Newlib 3.3.0.&lt;br /&gt;
# - 9.5.0-winxp:  Most recent versions of tools which run on Windows XP.&lt;br /&gt;
# - 10.5.0:       Last release in the GCC 10 series, released 2023-07-07.&lt;br /&gt;
# - 11.5.0:       Last release in the GCC 11 series, released 2024-07-19.&lt;br /&gt;
# Supported upstream:&lt;br /&gt;
# - 12.4.0:       Latest release in the GCC 12 series, released 2024-06-20.&lt;br /&gt;
# - stable:       Tested stable; based on GCC 13.2.0, released 2023-07-27.&lt;br /&gt;
# - 13.3.0:       Latest release in the GCC 13 series, released 2024-05-21.&lt;br /&gt;
# - 14.2.0:       Latest release in the GCC 14 series, released 2024-08-01.&lt;br /&gt;
# Development versions:&lt;br /&gt;
# - 13.3.1-dev    Bleeding edge GCC 13 series from git.&lt;br /&gt;
# - 14.2.1-dev    Bleeding edge GCC 14 series from git.&lt;br /&gt;
# - 15.0.0-dev    Bleeding edge GCC 15 series from git.&lt;br /&gt;
# - gccrs-dev:    GCC fork for development of the GCCRS Rust compiler.&lt;br /&gt;
# - rustc-dev:    GCC fork for development of the libgccjit rustc GCC codegen.&lt;br /&gt;
# If unsure, select stable. See README.md for more detailed descriptions.&lt;br /&gt;
toolchain_profile=stable&lt;br /&gt;
&lt;br /&gt;
########################&lt;br /&gt;
### DOWNLOAD OPTIONS ###&lt;br /&gt;
########################&lt;br /&gt;
&lt;br /&gt;
### Download protocol (http|https|ftp)&lt;br /&gt;
# Specify the protocol you want to use for downloading package files.&lt;br /&gt;
download_protocol=https&lt;br /&gt;
&lt;br /&gt;
### Force downloader (curl|wget)&lt;br /&gt;
# Specify here if you&#039;d prefer to use &#039;wget&#039; or &#039;curl&#039;. If neither is specified,&lt;br /&gt;
# a web downloader tool will be auto-detected in the following order: cURL, Wget&lt;br /&gt;
# You must have either Wget or cURL installed to use dc-chain.&lt;br /&gt;
#force_downloader=wget&lt;br /&gt;
&lt;br /&gt;
### Specify GNU mirror override&lt;br /&gt;
# The default mirror for GNU sources is &#039;ftpmirror.gnu.org&#039;&lt;br /&gt;
# This setting overrides the default mirror with a preferred mirror.&lt;br /&gt;
#gnu_mirror=mirrors.kernel.org&lt;br /&gt;
&lt;br /&gt;
#####################&lt;br /&gt;
### BUILD OPTIONS ###&lt;br /&gt;
#####################&lt;br /&gt;
&lt;br /&gt;
### SH toolchain install path&lt;br /&gt;
# Specify the directory where the SH toolchain will be installed. This setting&lt;br /&gt;
# must match the KOS_CC_BASE setting in your KOS &amp;quot;environ.sh&amp;quot; configuration.&lt;br /&gt;
sh_toolchain_path=/media/chris/development/dreamcast/toolchains/sh-elf&lt;br /&gt;
&lt;br /&gt;
### ARM toolchain install path&lt;br /&gt;
# Specify the directory where the ARM toolchain will be installed. This setting&lt;br /&gt;
# must match the DC_ARM_BASE setting in your KOS &amp;quot;environ.sh&amp;quot; configuration.&lt;br /&gt;
arm_toolchain_path=/media/chris/development/dreamcast/toolchains/arm-eabi&lt;br /&gt;
&lt;br /&gt;
### Make jobs (n|&amp;lt;empty&amp;gt;)&lt;br /&gt;
# Set this value to the number of parallel jobs you want to run with make.&lt;br /&gt;
# For fastest toolchain building, set to the number of CPU threads available.&lt;br /&gt;
# Using multiple jobs may cause issues in certain environments and may be&lt;br /&gt;
# automatically disabled. If you encounter errors building your toolchain,&lt;br /&gt;
# reduce the number of jobs to 1 to avoid issues and ease troubleshooting.&lt;br /&gt;
makejobs=16&lt;br /&gt;
&lt;br /&gt;
### Verbose (1|0)&lt;br /&gt;
# Choose whether to actively display compilation messages on the screen.&lt;br /&gt;
# Messages are saved to the build log files regardless of this setting.&lt;br /&gt;
verbose=1&lt;br /&gt;
&lt;br /&gt;
### Erase (1|0)&lt;br /&gt;
# Erase build directories as toolchain components are installed to save space.&lt;br /&gt;
erase=1&lt;br /&gt;
&lt;br /&gt;
### Install toolchain debug symbols (1|0)&lt;br /&gt;
# Choose whether to keep the debugging symbols for the toolchain.&lt;br /&gt;
# This is only useful if you wish to debug the toolchain itself.&lt;br /&gt;
#toolchain_debug=1&lt;br /&gt;
&lt;br /&gt;
########################&lt;br /&gt;
### LANGUAGE OPTIONS ###&lt;br /&gt;
########################&lt;br /&gt;
&lt;br /&gt;
### Enable C++&lt;br /&gt;
# Builds C++ support, including the C++ compiler and its standard library. The&lt;br /&gt;
# vast majority of language features are supported, with C++23 and early C++26&lt;br /&gt;
# support included. KallistiOS provides several examples with C++ support, so it&lt;br /&gt;
# is enabled by default. Adding C++ support requires extra disk space and&lt;br /&gt;
# compilation time, so you may disable it here if you do not plan on using C++.&lt;br /&gt;
enable_cpp=1&lt;br /&gt;
&lt;br /&gt;
### Enable Objective-C&lt;br /&gt;
# Builds Objective-C support. Currently, this builds the Obj-C compiler and&lt;br /&gt;
# runtime, but does not build a standard library. The GNUStep Base Library is&lt;br /&gt;
# currently in active development for future inclusion in the kos-ports library.&lt;br /&gt;
# KallistiOS provides examples with Obj-C support, so it is enabled by default.&lt;br /&gt;
enable_objc=1&lt;br /&gt;
&lt;br /&gt;
### Enable Objective C++&lt;br /&gt;
# Builds Objective C++ support. This hybrid language allows both C++ and Obj-C&lt;br /&gt;
# methods to be called from both contexts. Enabled by default as both the C++&lt;br /&gt;
# and Obj-C languages are already enabled by default.&lt;br /&gt;
enable_objcpp=1&lt;br /&gt;
&lt;br /&gt;
### Enable D&lt;br /&gt;
# Builds D support. This will build the D compiler, but does not build the&lt;br /&gt;
# Phobos Runtime Library. D support may only be enabled on POSIX platforms which&lt;br /&gt;
# have its external dependencies provided through a host DMD, GDC, or LDC&lt;br /&gt;
# compiler installation.&lt;br /&gt;
#enable_d=1&lt;br /&gt;
&lt;br /&gt;
### Enable Ada&lt;br /&gt;
# Builds Ada support. This will build the GNAT Ada compiler and tools but does&lt;br /&gt;
# not build the libada runtime library. In order for this build to succeed, the&lt;br /&gt;
# host&#039;s GCC version must match the target Dreamcast version, plus the same&lt;br /&gt;
# version of GNAT and its tools must be preinstalled (and in your path).&lt;br /&gt;
#enable_ada=1&lt;br /&gt;
&lt;br /&gt;
### Enable Rust&lt;br /&gt;
# Builds the work-in-progress GCCRS Rust compiler frontend for GCC. Requires a&lt;br /&gt;
# development version of GCC. Use with the gccrs-dev toolchain profile for the&lt;br /&gt;
# most recent updates to the GCCRS compiler. This option is not to be confused&lt;br /&gt;
# with using this toolchain as a backend for rustc; see libgccjit below.&lt;br /&gt;
#enable_rust=1&lt;br /&gt;
&lt;br /&gt;
### Enable libgccjit&lt;br /&gt;
# Enables the libgccjit embeddable GCC library. This is most commonly enabled to&lt;br /&gt;
# allow using this toolchain as a backend for the official rustc compiler. Use&lt;br /&gt;
# with the rustc-dev toolchain profile if this is your use case.&lt;br /&gt;
#enable_libgccjit=1&lt;br /&gt;
&lt;br /&gt;
###################&lt;br /&gt;
### GCC OPTIONS ###&lt;br /&gt;
###################&lt;br /&gt;
&lt;br /&gt;
### Floating point precision support (m4-single-only|m4-single|m4)&lt;br /&gt;
# Build support for various SH4 floating-point operation ABIs. KallistiOS only&lt;br /&gt;
# officially supports single-precision-only mode (m4-single-only); however,&lt;br /&gt;
# experimental support for single-precision-default mode (m4-single) has been&lt;br /&gt;
# added to allow for the use of full 64-bit doubles. You may also include&lt;br /&gt;
# double-precision-default (m4) which is untested and unsupported, or you may&lt;br /&gt;
# choose to specify only m4-single-only to save disk space.&lt;br /&gt;
precision_modes=m4-single-only,m4-single&lt;br /&gt;
&lt;br /&gt;
### Default floating point mode (m4|m4-single|m4-single-only)&lt;br /&gt;
# Choose the default floating point precision ABI used when GCC is invoked. This&lt;br /&gt;
# may be overridden by passing -m4-single-only, -m4-single, or -m4 to GCC.&lt;br /&gt;
# KOS currently only officially supports m4-single-only, so it is the default.&lt;br /&gt;
default_precision=m4-single-only&lt;br /&gt;
&lt;br /&gt;
### GCC threading model (single|kos)&lt;br /&gt;
# KallistiOS patches to GCC provide a &#039;kos&#039; thread model, which should be used.&lt;br /&gt;
# If you want to disable threading support for C++, Objective-C, and so forth,&lt;br /&gt;
# you can set this option to &#039;single&#039;.&lt;br /&gt;
thread_model=kos&lt;br /&gt;
&lt;br /&gt;
### Automatic patching for KallistiOS (1|0)&lt;br /&gt;
# Uncomment this option if you want to disable applying KallistiOS patches to&lt;br /&gt;
# toolchain source files before building. This will disable usage of the &#039;kos&#039;&lt;br /&gt;
# thread model. Only do this if you understand what you are doing.&lt;br /&gt;
#use_kos_patches=0&lt;br /&gt;
&lt;br /&gt;
### Disable GCC Native Language Support (1|0)&lt;br /&gt;
# By default, NLS allows GCC to output diagnostics in non-English languages.&lt;br /&gt;
# Uncomment this option to disable NLS and force GCC to output in English.&lt;br /&gt;
#disable_nls=1&lt;br /&gt;
&lt;br /&gt;
######################&lt;br /&gt;
### NEWLIB OPTIONS ###&lt;br /&gt;
######################&lt;br /&gt;
&lt;br /&gt;
### Automatic patching for Newlib (1|0)&lt;br /&gt;
# Uncomment this option if you want to disable the automatic patching of Newlib&lt;br /&gt;
# needed by KallistiOS. This will keep the generated toolchain completely raw.&lt;br /&gt;
# This will also disable the &#039;kos&#039; thread model. Only do this if you understand&lt;br /&gt;
# what you are doing.&lt;br /&gt;
#auto_fixup_sh4_newlib=0&lt;br /&gt;
&lt;br /&gt;
### C99 format specifier support (1|0)&lt;br /&gt;
# Define this to build Newlib with additional support for the C99 format&lt;br /&gt;
# specifiers, used by printf and friends. These include support for size_t,&lt;br /&gt;
# ptrdiff_t, intmax_t, and sized integral types.&lt;br /&gt;
newlib_c99_formats=1&lt;br /&gt;
&lt;br /&gt;
### Multibyte character set support (1|0)&lt;br /&gt;
# Define this to build Newlib with additional multibyte support. This enables&lt;br /&gt;
# three special locales: &amp;quot;C-JIS&amp;quot;, &amp;quot;C-SJIS&amp;quot;, and &amp;quot;C-EUCJP&amp;quot;. The multibyte&lt;br /&gt;
# support extends to the mb and wc functions in stdlib as well as format&lt;br /&gt;
# characters for the printf and scanf family of routines.&lt;br /&gt;
#newlib_multibyte=1&lt;br /&gt;
&lt;br /&gt;
### iconv() character encoding conversions support (encoding list)&lt;br /&gt;
# Define a list here to enable support for the iconv() function and &amp;lt;iconv.h&amp;gt;&lt;br /&gt;
# header file. The given comma separated list defines for which encoding types&lt;br /&gt;
# to include bidirectional conversion support. For the full list of available&lt;br /&gt;
# encodings, see the Newlib configuration documentation.&lt;br /&gt;
#newlib_iconv_encodings=us_ascii,utf8,utf16,ucs_2_internal,ucs_4_internal&lt;br /&gt;
&lt;br /&gt;
### Optimize Newlib for space (1|0)&lt;br /&gt;
# Uncomment this option to optimize for space when building Newlib. This will&lt;br /&gt;
# build Newlib with compiler flags which favor smaller code sizes over faster&lt;br /&gt;
# performance.&lt;br /&gt;
#newlib_opt_space=1&lt;br /&gt;
&lt;br /&gt;
###################&lt;br /&gt;
### C++ OPTIONS ###&lt;br /&gt;
###################&lt;br /&gt;
&lt;br /&gt;
### Timezone database support (1|0|path)&lt;br /&gt;
# Uncomment this option to enable building support for C++&#039;s std::chrono::tzdb&lt;br /&gt;
# into your C++ standard library by using a combination of the system&#039;s local&lt;br /&gt;
# timezone DB and one dynamically fetched from the &amp;quot;IANA Time Zone Database.&amp;quot;&lt;br /&gt;
# Without support enabled, only the &amp;quot;UTC&amp;quot; and &amp;quot;GMT&amp;quot; timezones will be defined.&lt;br /&gt;
# You can optionally provide the path to a directory with a custom &amp;quot;tzdata.zi&amp;quot;&lt;br /&gt;
# database file. NOTE: Enabling this will result in larger C++ binaries!&lt;br /&gt;
#libstdcxx_tzdb=1&lt;br /&gt;
&lt;br /&gt;
#######################&lt;br /&gt;
### WINDOWS OPTIONS ###&lt;br /&gt;
#######################&lt;br /&gt;
&lt;br /&gt;
### MinGW/MSYS&lt;br /&gt;
# Standalone binaries (1|0)&lt;br /&gt;
# Uncomment this option if you want static binaries that are standalone and&lt;br /&gt;
# require no dependencies. When this option is used, binaries can be run outside&lt;br /&gt;
# the MinGW/MSYS environment. This is NOT recommended; only do this if you know&lt;br /&gt;
# what you are doing.&lt;br /&gt;
#standalone_binary=1&lt;br /&gt;
&lt;br /&gt;
### Force installation of BFD for SH (1|0)&lt;br /&gt;
# Uncomment this option if you want to force installation of &#039;libbfd&#039; for the SH&lt;br /&gt;
# toolchain. This is required for MinGW/MSYS and can&#039;t be disabled in this&lt;br /&gt;
# scenario. This option is here mainly if you want to force the installation of&lt;br /&gt;
# &#039;libbfd&#039; under other environments, but this won&#039;t be necessary in most cases,&lt;br /&gt;
# as &#039;libelf&#039; is used almost everywhere. Please note, &#039;libbfd&#039; is not portable&lt;br /&gt;
# if you built it on another environment. Only use this flag if you understand&lt;br /&gt;
# what you are doing.&lt;br /&gt;
#sh_force_libbfd_installation=1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Make durchführen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PATH=/usr/bin make all&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== KOS bauen ====&lt;br /&gt;
&lt;br /&gt;
eviron.sh:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# KallistiOS Environment Settings&lt;br /&gt;
#&lt;br /&gt;
# This is a sample script for configuring and customizing your&lt;br /&gt;
# KOS build environment. Modify it to suit your setup. Several&lt;br /&gt;
# settings may be enabled optionally or are provided with&lt;br /&gt;
# alternative values.&lt;br /&gt;
#&lt;br /&gt;
# This script is typically sourced in your current shell environment&lt;br /&gt;
# (probably by .bashrc, .bash_profile, or something similar), so that&lt;br /&gt;
# the KOS environment is set up automatically for each shell session.&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
# Build Architecture&lt;br /&gt;
#&lt;br /&gt;
# Set the major architecture you&#039;ll be building for.&lt;br /&gt;
# The only option here is &amp;quot;dreamcast&amp;quot; as of KOS 2.0.0.&lt;br /&gt;
#&lt;br /&gt;
export KOS_ARCH=&amp;quot;dreamcast&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Build Sub-Architecture&lt;br /&gt;
#&lt;br /&gt;
# Defines the sub architecture your configuration&lt;br /&gt;
# is targeting or uses an existing value that&lt;br /&gt;
# can be set externally via your IDE.&lt;br /&gt;
#&lt;br /&gt;
# Valid values:&lt;br /&gt;
#   &amp;quot;pristine&amp;quot; - Dreamcast console or HKT-0120 devkit (default)&lt;br /&gt;
#   &amp;quot;naomi&amp;quot;    - NAOMI or NAOMI 2 arcade board&lt;br /&gt;
#&lt;br /&gt;
if [ -z &amp;quot;${KOS_SUBARCH}&amp;quot; ] ; then&lt;br /&gt;
    export KOS_SUBARCH=&amp;quot;pristine&amp;quot;&lt;br /&gt;
else&lt;br /&gt;
    export KOS_SUBARCH&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# KOS Root Path&lt;br /&gt;
#&lt;br /&gt;
# Specifies the path to the KOS root directory&lt;br /&gt;
#&lt;br /&gt;
export KOS_BASE=&amp;quot;/media/chris/development/dreamcast/toolchains/kos&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# KOS-Ports Path&lt;br /&gt;
#&lt;br /&gt;
# Specifies the path to the KOS-ports directory&lt;br /&gt;
#&lt;br /&gt;
export KOS_PORTS=&amp;quot;${KOS_BASE}/../kos-ports&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# SH Compiler Prefixes&lt;br /&gt;
#&lt;br /&gt;
# Specifies the path to and prefix for the main SH&lt;br /&gt;
# GCC toolchain used to target the Dreamcast&#039;s SH4 CPU.&lt;br /&gt;
#&lt;br /&gt;
export KOS_CC_BASE=&amp;quot;/media/chris/development/dreamcast/toolchains/sh-elf&amp;quot;&lt;br /&gt;
export KOS_CC_PREFIX=&amp;quot;sh-elf&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# ARM Compiler Prefixes&lt;br /&gt;
#&lt;br /&gt;
# Specifies the path to and prefix for the additional ARM&lt;br /&gt;
# GCC toolchain used to target the Dreamcast&#039;s AICA SPU.&lt;br /&gt;
#&lt;br /&gt;
export DC_ARM_BASE=&amp;quot;/media/chris/development/dreamcast/toolchains/arm-eabi&amp;quot;&lt;br /&gt;
export DC_ARM_PREFIX=&amp;quot;arm-eabi&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# External Dreamcast Tools Path&lt;br /&gt;
#&lt;br /&gt;
# Specifies the path where Dreamcast tools that are not part of KOS are to be&lt;br /&gt;
# installed. This includes, for example, dc-tool-ip, dc-tool-serial, and the&lt;br /&gt;
# mrbc bytecode compiler. This directory, along with SH and ARM compiler&lt;br /&gt;
# toolchains, will be added to your PATH environment variable.&lt;br /&gt;
#&lt;br /&gt;
export DC_TOOLS_BASE=&amp;quot;/media/chris/development/dreamcast/tools&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# CMake Toolchain Path&lt;br /&gt;
#&lt;br /&gt;
# Specifies the path to the toolchain file used to target&lt;br /&gt;
# KOS with the &amp;quot;cmake&amp;quot; build utility.&lt;br /&gt;
#&lt;br /&gt;
export KOS_CMAKE_TOOLCHAIN=&amp;quot;${KOS_BASE}/utils/cmake/dreamcast.toolchain.cmake&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Genromfs Utility Path&lt;br /&gt;
#&lt;br /&gt;
# Specifies the path to the utility which is used by KOS&lt;br /&gt;
# to create romdisk filesystem images.&lt;br /&gt;
#&lt;br /&gt;
export KOS_GENROMFS=&amp;quot;${KOS_BASE}/utils/genromfs/genromfs&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Make Utility&lt;br /&gt;
#&lt;br /&gt;
# Configures the tool to be used as the main &amp;quot;make&amp;quot; utility&lt;br /&gt;
# for building GNU Makefiles. On a platform such as BSD,&lt;br /&gt;
# the default can be changed to &amp;quot;gmake,&amp;quot; for the GNU&lt;br /&gt;
# implementation.&lt;br /&gt;
#&lt;br /&gt;
export KOS_MAKE=&amp;quot;make&amp;quot;&lt;br /&gt;
#export KOS_MAKE=&amp;quot;gmake&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Loader Utility&lt;br /&gt;
#&lt;br /&gt;
# Specifies the loader to be used with the &amp;quot;make run&amp;quot; targets&lt;br /&gt;
# in the KOS examples. Defaults to using a preconfigured version&lt;br /&gt;
# of dc-tool. Use one of the other options for a manual dc-tool-ip&lt;br /&gt;
# or dc-tool-serial configuration, remembering to change the values&lt;br /&gt;
# for the Dreamcast&#039;s IP address or the serial port interface.&lt;br /&gt;
#&lt;br /&gt;
#export KOS_LOADER=&amp;quot;dc-tool -x&amp;quot;&lt;br /&gt;
export KOS_LOADER=&amp;quot;dc-tool-ip -t dreamcast -x&amp;quot;&lt;br /&gt;
#export KOS_LOADER=&amp;quot;dc-tool-ser -t /dev/ttyS0 -x&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Default Compiler Flags&lt;br /&gt;
#&lt;br /&gt;
# Resets build flags. You can also initialize them to some preset&lt;br /&gt;
# default values here if you wish.&lt;br /&gt;
#&lt;br /&gt;
export KOS_INC_PATHS=&amp;quot;&amp;quot;&lt;br /&gt;
export KOS_CFLAGS=&amp;quot;&amp;quot;&lt;br /&gt;
export KOS_CPPFLAGS=&amp;quot;&amp;quot;&lt;br /&gt;
export KOS_LDFLAGS=&amp;quot;&amp;quot;&lt;br /&gt;
export KOS_AFLAGS=&amp;quot;&amp;quot;&lt;br /&gt;
export DC_ARM_LDFLAGS=&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Debug Builds&lt;br /&gt;
#&lt;br /&gt;
# Controls whether to disable additional debugging checks and assertions,&lt;br /&gt;
# such as for parameter validation or internal errors. Uncomment this if&lt;br /&gt;
# you do not wish to compile with this additional logic enabled.&lt;br /&gt;
#&lt;br /&gt;
#export KOS_CFLAGS=&amp;quot;${KOS_CFLAGS} -DNDEBUG&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Optimization Level&lt;br /&gt;
#&lt;br /&gt;
# Controls the baseline optimization level to use when building.&lt;br /&gt;
# Typically this is -Og (debugging), -O0, -O1, -O2, or -O3.&lt;br /&gt;
# NOTE: For our target, -O4 is a valid optimization level that has&lt;br /&gt;
# been seen to have some performance impact as well.&lt;br /&gt;
#&lt;br /&gt;
export KOS_CFLAGS=&amp;quot;${KOS_CFLAGS} -O2&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Additional Optimizations&lt;br /&gt;
#&lt;br /&gt;
# Uncomment this to enable what has been found empirically to be&lt;br /&gt;
# the optimal set of additional flags for release build performance&lt;br /&gt;
# on the current stable toolchain. NOTE: Certain KOS-ports and examples&lt;br /&gt;
# do not work properly with &amp;quot;-flto=auto&amp;quot;!&lt;br /&gt;
#&lt;br /&gt;
#export KOS_CFLAGS=&amp;quot;${KOS_CFLAGS} -freorder-blocks-algorithm=simple -flto=auto&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Frame Pointers&lt;br /&gt;
#&lt;br /&gt;
# Controls whether frame pointers are emitted or not. Disabled by&lt;br /&gt;
# default. Enable them if you plan to use GDB for debugging.&lt;br /&gt;
#&lt;br /&gt;
export KOS_CFLAGS=&amp;quot;${KOS_CFLAGS} -fomit-frame-pointer&amp;quot;&lt;br /&gt;
#export KOS_CFLAGS=&amp;quot;${KOS_CFLAGS} -fno-omit-frame-pointer -DFRAME_POINTERS&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Stack Protector&lt;br /&gt;
#&lt;br /&gt;
# Controls whether GCC emits extra code to check for buffer overflows or stack&lt;br /&gt;
# smashing, which can be very useful for debugging. -fstack-protector only&lt;br /&gt;
# covers vulnerable objects, while -fstack-protector-strong provides medium&lt;br /&gt;
# coverage, and -fstack-protector-all provides full coverage. You may also&lt;br /&gt;
# override the default stack excepton handler by providing your own&lt;br /&gt;
# implementation of &amp;quot;void __stack_chk_fail(void).&amp;quot;&lt;br /&gt;
#&lt;br /&gt;
#export KOS_CFLAGS=&amp;quot;${KOS_CFLAGS} -fstack-protector-all&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# GCC Builtin Functions&lt;br /&gt;
#&lt;br /&gt;
# Comment out this line to enable GCC to use its own builtin implementations of&lt;br /&gt;
# certain standard library functions. Under certain conditions, this can allow&lt;br /&gt;
# compiler-optimized implementations to replace standard function invocations.&lt;br /&gt;
# The downside of this is that it COULD interfere with Newlib or KOS implementations&lt;br /&gt;
# of these functions, and it has not been tested thoroughly to ensure compatibility.&lt;br /&gt;
#&lt;br /&gt;
export KOS_CFLAGS=&amp;quot;${KOS_CFLAGS} -fno-builtin&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Fast Math Instructions&lt;br /&gt;
#&lt;br /&gt;
# Uncomment this line to enable the optimized fast-math instructions (FSSRA,&lt;br /&gt;
# FSCA, and FSQRT) for calculating sin/cos, inverse square root, and square roots.&lt;br /&gt;
# These can result in substantial performance gains for these kinds of operations;&lt;br /&gt;
# however, they do so at the price of accuracy and are not IEEE compliant.&lt;br /&gt;
# NOTE: Enabling this option will also override -fno-builtin!&lt;br /&gt;
#&lt;br /&gt;
#export KOS_CFLAGS=&amp;quot;${KOS_CFLAGS} -fbuiltin -ffast-math -ffp-contract=fast&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# SH4 Floating-Point Arithmetic Precision&lt;br /&gt;
#&lt;br /&gt;
# KallistiOS supports both the single-precision-default ABI (m4-single) and the&lt;br /&gt;
# single-precision-only ABI (m4-single-only). When using m4-single, the SH4 will&lt;br /&gt;
# be in single-precision mode upon function entry but will switch to double-&lt;br /&gt;
# precision mode if 64-bit doubles are used. When using m4-single-only, the SH4&lt;br /&gt;
# will always be in single-precision mode and 64-bit doubles will be truncated to&lt;br /&gt;
# 32-bit floats. Historically, m4-single-only was used in both official and&lt;br /&gt;
# homebrew Dreamcast software, but m4-single is the default as of KOS 2.2.0 to&lt;br /&gt;
# increase compatibility with newer libraries which require 64-bit doubles.&lt;br /&gt;
#&lt;br /&gt;
# WARNING: When adjusting this setting, make sure all software, including&lt;br /&gt;
#          kos-ports and linked external libraries, are rebuilt using the same&lt;br /&gt;
#          floating-point precision ABI setting!&lt;br /&gt;
#&lt;br /&gt;
export KOS_SH4_PRECISION=&amp;quot;-m4-single&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Use LRA (Local Register Allocator) Pass&lt;br /&gt;
#&lt;br /&gt;
# Uncomment this line to use the modern Local Register Allocator pass during&lt;br /&gt;
# code generation instead of the default older reload pass. This option is&lt;br /&gt;
# known to be unstable or less performant for SH at this time, but will likely&lt;br /&gt;
# become mandatory in future versions of GCC, so feel free to help us test.&lt;br /&gt;
# Only enable this setting if you understand what you are doing!&lt;br /&gt;
#&lt;br /&gt;
#export KOS_CFLAGS=&amp;quot;${KOS_CFLAGS} -mlra&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Shared Compiler Configuration&lt;br /&gt;
#&lt;br /&gt;
# Include sub architecture-independent configuration file for shared&lt;br /&gt;
# environment settings. If you want to configure additional compiler&lt;br /&gt;
# options or see where other build flags are set, look at this file.&lt;br /&gt;
#&lt;br /&gt;
. ${KOS_BASE}/environ_base.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
. environ.sh&lt;br /&gt;
make&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== KOS-ports bauen ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone --recursive https://github.com/KallistiOS/kos-ports kos-ports&lt;br /&gt;
kos-ports/utils/build-all.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chris</name></author>
	</entry>
	<entry>
		<id>https://darkrealm-wiki.darkrealm.dyndns.org/index.php?title=Funktionierende_Toolchains&amp;diff=4828</id>
		<title>Funktionierende Toolchains</title>
		<link rel="alternate" type="text/html" href="https://darkrealm-wiki.darkrealm.dyndns.org/index.php?title=Funktionierende_Toolchains&amp;diff=4828"/>
		<updated>2025-04-18T22:15:05Z</updated>

		<summary type="html">&lt;p&gt;Chris: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== KallistiOS Toolchain ==&lt;br /&gt;
&lt;br /&gt;
=== Crosscompiler bauen ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /media/chris/development/dreamcast/toolchains&lt;br /&gt;
cd /media/chris/development/dreamcast/toolchains&lt;br /&gt;
git clone https://github.com/KallistiOS/KallistiOS.git kos&lt;br /&gt;
cd kos/utils/dc-chain/&lt;br /&gt;
cp -av Makefile.default.cfg Makefile.cfg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Makefile.cfg bearbeiten ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Sega Dreamcast Toolchains Maker (dc-chain)&lt;br /&gt;
# This file is part of KallistiOS.&lt;br /&gt;
&lt;br /&gt;
#########################&lt;br /&gt;
### TOOLCHAIN PROFILE ###&lt;br /&gt;
#########################&lt;br /&gt;
&lt;br /&gt;
# Choose a toolchain profile from the following available options:&lt;br /&gt;
# No longer supported upstream:&lt;br /&gt;
# - 9.3.0-legacy: Former &#039;stable&#039; option, based on GCC 9.3.0 and Newlib 3.3.0.&lt;br /&gt;
# - 9.5.0-winxp:  Most recent versions of tools which run on Windows XP.&lt;br /&gt;
# - 10.5.0:       Last release in the GCC 10 series, released 2023-07-07.&lt;br /&gt;
# - 11.5.0:       Last release in the GCC 11 series, released 2024-07-19.&lt;br /&gt;
# Supported upstream:&lt;br /&gt;
# - 12.4.0:       Latest release in the GCC 12 series, released 2024-06-20.&lt;br /&gt;
# - stable:       Tested stable; based on GCC 13.2.0, released 2023-07-27.&lt;br /&gt;
# - 13.3.0:       Latest release in the GCC 13 series, released 2024-05-21.&lt;br /&gt;
# - 14.2.0:       Latest release in the GCC 14 series, released 2024-08-01.&lt;br /&gt;
# Development versions:&lt;br /&gt;
# - 13.3.1-dev    Bleeding edge GCC 13 series from git.&lt;br /&gt;
# - 14.2.1-dev    Bleeding edge GCC 14 series from git.&lt;br /&gt;
# - 15.0.0-dev    Bleeding edge GCC 15 series from git.&lt;br /&gt;
# - gccrs-dev:    GCC fork for development of the GCCRS Rust compiler.&lt;br /&gt;
# - rustc-dev:    GCC fork for development of the libgccjit rustc GCC codegen.&lt;br /&gt;
# If unsure, select stable. See README.md for more detailed descriptions.&lt;br /&gt;
toolchain_profile=stable&lt;br /&gt;
&lt;br /&gt;
########################&lt;br /&gt;
### DOWNLOAD OPTIONS ###&lt;br /&gt;
########################&lt;br /&gt;
&lt;br /&gt;
### Download protocol (http|https|ftp)&lt;br /&gt;
# Specify the protocol you want to use for downloading package files.&lt;br /&gt;
download_protocol=https&lt;br /&gt;
&lt;br /&gt;
### Force downloader (curl|wget)&lt;br /&gt;
# Specify here if you&#039;d prefer to use &#039;wget&#039; or &#039;curl&#039;. If neither is specified,&lt;br /&gt;
# a web downloader tool will be auto-detected in the following order: cURL, Wget&lt;br /&gt;
# You must have either Wget or cURL installed to use dc-chain.&lt;br /&gt;
#force_downloader=wget&lt;br /&gt;
&lt;br /&gt;
### Specify GNU mirror override&lt;br /&gt;
# The default mirror for GNU sources is &#039;ftpmirror.gnu.org&#039;&lt;br /&gt;
# This setting overrides the default mirror with a preferred mirror.&lt;br /&gt;
#gnu_mirror=mirrors.kernel.org&lt;br /&gt;
&lt;br /&gt;
#####################&lt;br /&gt;
### BUILD OPTIONS ###&lt;br /&gt;
#####################&lt;br /&gt;
&lt;br /&gt;
### SH toolchain install path&lt;br /&gt;
# Specify the directory where the SH toolchain will be installed. This setting&lt;br /&gt;
# must match the KOS_CC_BASE setting in your KOS &amp;quot;environ.sh&amp;quot; configuration.&lt;br /&gt;
sh_toolchain_path=/media/chris/development/dreamcast/toolchains/sh-elf&lt;br /&gt;
&lt;br /&gt;
### ARM toolchain install path&lt;br /&gt;
# Specify the directory where the ARM toolchain will be installed. This setting&lt;br /&gt;
# must match the DC_ARM_BASE setting in your KOS &amp;quot;environ.sh&amp;quot; configuration.&lt;br /&gt;
arm_toolchain_path=/media/chris/development/dreamcast/toolchains/arm-eabi&lt;br /&gt;
&lt;br /&gt;
### Make jobs (n|&amp;lt;empty&amp;gt;)&lt;br /&gt;
# Set this value to the number of parallel jobs you want to run with make.&lt;br /&gt;
# For fastest toolchain building, set to the number of CPU threads available.&lt;br /&gt;
# Using multiple jobs may cause issues in certain environments and may be&lt;br /&gt;
# automatically disabled. If you encounter errors building your toolchain,&lt;br /&gt;
# reduce the number of jobs to 1 to avoid issues and ease troubleshooting.&lt;br /&gt;
makejobs=16&lt;br /&gt;
&lt;br /&gt;
### Verbose (1|0)&lt;br /&gt;
# Choose whether to actively display compilation messages on the screen.&lt;br /&gt;
# Messages are saved to the build log files regardless of this setting.&lt;br /&gt;
verbose=1&lt;br /&gt;
&lt;br /&gt;
### Erase (1|0)&lt;br /&gt;
# Erase build directories as toolchain components are installed to save space.&lt;br /&gt;
erase=1&lt;br /&gt;
&lt;br /&gt;
### Install toolchain debug symbols (1|0)&lt;br /&gt;
# Choose whether to keep the debugging symbols for the toolchain.&lt;br /&gt;
# This is only useful if you wish to debug the toolchain itself.&lt;br /&gt;
#toolchain_debug=1&lt;br /&gt;
&lt;br /&gt;
########################&lt;br /&gt;
### LANGUAGE OPTIONS ###&lt;br /&gt;
########################&lt;br /&gt;
&lt;br /&gt;
### Enable C++&lt;br /&gt;
# Builds C++ support, including the C++ compiler and its standard library. The&lt;br /&gt;
# vast majority of language features are supported, with C++23 and early C++26&lt;br /&gt;
# support included. KallistiOS provides several examples with C++ support, so it&lt;br /&gt;
# is enabled by default. Adding C++ support requires extra disk space and&lt;br /&gt;
# compilation time, so you may disable it here if you do not plan on using C++.&lt;br /&gt;
enable_cpp=1&lt;br /&gt;
&lt;br /&gt;
### Enable Objective-C&lt;br /&gt;
# Builds Objective-C support. Currently, this builds the Obj-C compiler and&lt;br /&gt;
# runtime, but does not build a standard library. The GNUStep Base Library is&lt;br /&gt;
# currently in active development for future inclusion in the kos-ports library.&lt;br /&gt;
# KallistiOS provides examples with Obj-C support, so it is enabled by default.&lt;br /&gt;
enable_objc=1&lt;br /&gt;
&lt;br /&gt;
### Enable Objective C++&lt;br /&gt;
# Builds Objective C++ support. This hybrid language allows both C++ and Obj-C&lt;br /&gt;
# methods to be called from both contexts. Enabled by default as both the C++&lt;br /&gt;
# and Obj-C languages are already enabled by default.&lt;br /&gt;
enable_objcpp=1&lt;br /&gt;
&lt;br /&gt;
### Enable D&lt;br /&gt;
# Builds D support. This will build the D compiler, but does not build the&lt;br /&gt;
# Phobos Runtime Library. D support may only be enabled on POSIX platforms which&lt;br /&gt;
# have its external dependencies provided through a host DMD, GDC, or LDC&lt;br /&gt;
# compiler installation.&lt;br /&gt;
#enable_d=1&lt;br /&gt;
&lt;br /&gt;
### Enable Ada&lt;br /&gt;
# Builds Ada support. This will build the GNAT Ada compiler and tools but does&lt;br /&gt;
# not build the libada runtime library. In order for this build to succeed, the&lt;br /&gt;
# host&#039;s GCC version must match the target Dreamcast version, plus the same&lt;br /&gt;
# version of GNAT and its tools must be preinstalled (and in your path).&lt;br /&gt;
#enable_ada=1&lt;br /&gt;
&lt;br /&gt;
### Enable Rust&lt;br /&gt;
# Builds the work-in-progress GCCRS Rust compiler frontend for GCC. Requires a&lt;br /&gt;
# development version of GCC. Use with the gccrs-dev toolchain profile for the&lt;br /&gt;
# most recent updates to the GCCRS compiler. This option is not to be confused&lt;br /&gt;
# with using this toolchain as a backend for rustc; see libgccjit below.&lt;br /&gt;
#enable_rust=1&lt;br /&gt;
&lt;br /&gt;
### Enable libgccjit&lt;br /&gt;
# Enables the libgccjit embeddable GCC library. This is most commonly enabled to&lt;br /&gt;
# allow using this toolchain as a backend for the official rustc compiler. Use&lt;br /&gt;
# with the rustc-dev toolchain profile if this is your use case.&lt;br /&gt;
#enable_libgccjit=1&lt;br /&gt;
&lt;br /&gt;
###################&lt;br /&gt;
### GCC OPTIONS ###&lt;br /&gt;
###################&lt;br /&gt;
&lt;br /&gt;
### Floating point precision support (m4-single-only|m4-single|m4)&lt;br /&gt;
# Build support for various SH4 floating-point operation ABIs. KallistiOS only&lt;br /&gt;
# officially supports single-precision-only mode (m4-single-only); however,&lt;br /&gt;
# experimental support for single-precision-default mode (m4-single) has been&lt;br /&gt;
# added to allow for the use of full 64-bit doubles. You may also include&lt;br /&gt;
# double-precision-default (m4) which is untested and unsupported, or you may&lt;br /&gt;
# choose to specify only m4-single-only to save disk space.&lt;br /&gt;
precision_modes=m4-single-only,m4-single&lt;br /&gt;
&lt;br /&gt;
### Default floating point mode (m4|m4-single|m4-single-only)&lt;br /&gt;
# Choose the default floating point precision ABI used when GCC is invoked. This&lt;br /&gt;
# may be overridden by passing -m4-single-only, -m4-single, or -m4 to GCC.&lt;br /&gt;
# KOS currently only officially supports m4-single-only, so it is the default.&lt;br /&gt;
default_precision=m4-single-only&lt;br /&gt;
&lt;br /&gt;
### GCC threading model (single|kos)&lt;br /&gt;
# KallistiOS patches to GCC provide a &#039;kos&#039; thread model, which should be used.&lt;br /&gt;
# If you want to disable threading support for C++, Objective-C, and so forth,&lt;br /&gt;
# you can set this option to &#039;single&#039;.&lt;br /&gt;
thread_model=kos&lt;br /&gt;
&lt;br /&gt;
### Automatic patching for KallistiOS (1|0)&lt;br /&gt;
# Uncomment this option if you want to disable applying KallistiOS patches to&lt;br /&gt;
# toolchain source files before building. This will disable usage of the &#039;kos&#039;&lt;br /&gt;
# thread model. Only do this if you understand what you are doing.&lt;br /&gt;
#use_kos_patches=0&lt;br /&gt;
&lt;br /&gt;
### Disable GCC Native Language Support (1|0)&lt;br /&gt;
# By default, NLS allows GCC to output diagnostics in non-English languages.&lt;br /&gt;
# Uncomment this option to disable NLS and force GCC to output in English.&lt;br /&gt;
#disable_nls=1&lt;br /&gt;
&lt;br /&gt;
######################&lt;br /&gt;
### NEWLIB OPTIONS ###&lt;br /&gt;
######################&lt;br /&gt;
&lt;br /&gt;
### Automatic patching for Newlib (1|0)&lt;br /&gt;
# Uncomment this option if you want to disable the automatic patching of Newlib&lt;br /&gt;
# needed by KallistiOS. This will keep the generated toolchain completely raw.&lt;br /&gt;
# This will also disable the &#039;kos&#039; thread model. Only do this if you understand&lt;br /&gt;
# what you are doing.&lt;br /&gt;
#auto_fixup_sh4_newlib=0&lt;br /&gt;
&lt;br /&gt;
### C99 format specifier support (1|0)&lt;br /&gt;
# Define this to build Newlib with additional support for the C99 format&lt;br /&gt;
# specifiers, used by printf and friends. These include support for size_t,&lt;br /&gt;
# ptrdiff_t, intmax_t, and sized integral types.&lt;br /&gt;
newlib_c99_formats=1&lt;br /&gt;
&lt;br /&gt;
### Multibyte character set support (1|0)&lt;br /&gt;
# Define this to build Newlib with additional multibyte support. This enables&lt;br /&gt;
# three special locales: &amp;quot;C-JIS&amp;quot;, &amp;quot;C-SJIS&amp;quot;, and &amp;quot;C-EUCJP&amp;quot;. The multibyte&lt;br /&gt;
# support extends to the mb and wc functions in stdlib as well as format&lt;br /&gt;
# characters for the printf and scanf family of routines.&lt;br /&gt;
#newlib_multibyte=1&lt;br /&gt;
&lt;br /&gt;
### iconv() character encoding conversions support (encoding list)&lt;br /&gt;
# Define a list here to enable support for the iconv() function and &amp;lt;iconv.h&amp;gt;&lt;br /&gt;
# header file. The given comma separated list defines for which encoding types&lt;br /&gt;
# to include bidirectional conversion support. For the full list of available&lt;br /&gt;
# encodings, see the Newlib configuration documentation.&lt;br /&gt;
#newlib_iconv_encodings=us_ascii,utf8,utf16,ucs_2_internal,ucs_4_internal&lt;br /&gt;
&lt;br /&gt;
### Optimize Newlib for space (1|0)&lt;br /&gt;
# Uncomment this option to optimize for space when building Newlib. This will&lt;br /&gt;
# build Newlib with compiler flags which favor smaller code sizes over faster&lt;br /&gt;
# performance.&lt;br /&gt;
#newlib_opt_space=1&lt;br /&gt;
&lt;br /&gt;
###################&lt;br /&gt;
### C++ OPTIONS ###&lt;br /&gt;
###################&lt;br /&gt;
&lt;br /&gt;
### Timezone database support (1|0|path)&lt;br /&gt;
# Uncomment this option to enable building support for C++&#039;s std::chrono::tzdb&lt;br /&gt;
# into your C++ standard library by using a combination of the system&#039;s local&lt;br /&gt;
# timezone DB and one dynamically fetched from the &amp;quot;IANA Time Zone Database.&amp;quot;&lt;br /&gt;
# Without support enabled, only the &amp;quot;UTC&amp;quot; and &amp;quot;GMT&amp;quot; timezones will be defined.&lt;br /&gt;
# You can optionally provide the path to a directory with a custom &amp;quot;tzdata.zi&amp;quot;&lt;br /&gt;
# database file. NOTE: Enabling this will result in larger C++ binaries!&lt;br /&gt;
#libstdcxx_tzdb=1&lt;br /&gt;
&lt;br /&gt;
#######################&lt;br /&gt;
### WINDOWS OPTIONS ###&lt;br /&gt;
#######################&lt;br /&gt;
&lt;br /&gt;
### MinGW/MSYS&lt;br /&gt;
# Standalone binaries (1|0)&lt;br /&gt;
# Uncomment this option if you want static binaries that are standalone and&lt;br /&gt;
# require no dependencies. When this option is used, binaries can be run outside&lt;br /&gt;
# the MinGW/MSYS environment. This is NOT recommended; only do this if you know&lt;br /&gt;
# what you are doing.&lt;br /&gt;
#standalone_binary=1&lt;br /&gt;
&lt;br /&gt;
### Force installation of BFD for SH (1|0)&lt;br /&gt;
# Uncomment this option if you want to force installation of &#039;libbfd&#039; for the SH&lt;br /&gt;
# toolchain. This is required for MinGW/MSYS and can&#039;t be disabled in this&lt;br /&gt;
# scenario. This option is here mainly if you want to force the installation of&lt;br /&gt;
# &#039;libbfd&#039; under other environments, but this won&#039;t be necessary in most cases,&lt;br /&gt;
# as &#039;libelf&#039; is used almost everywhere. Please note, &#039;libbfd&#039; is not portable&lt;br /&gt;
# if you built it on another environment. Only use this flag if you understand&lt;br /&gt;
# what you are doing.&lt;br /&gt;
#sh_force_libbfd_installation=1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Make durchführen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PATH=/usr/bin make all&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== KOS bauen ====&lt;br /&gt;
&lt;br /&gt;
eviron.sh:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# KallistiOS Environment Settings&lt;br /&gt;
#&lt;br /&gt;
# This is a sample script for configuring and customizing your&lt;br /&gt;
# KOS build environment. Modify it to suit your setup. Several&lt;br /&gt;
# settings may be enabled optionally or are provided with&lt;br /&gt;
# alternative values.&lt;br /&gt;
#&lt;br /&gt;
# This script is typically sourced in your current shell environment&lt;br /&gt;
# (probably by .bashrc, .bash_profile, or something similar), so that&lt;br /&gt;
# the KOS environment is set up automatically for each shell session.&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
# Build Architecture&lt;br /&gt;
#&lt;br /&gt;
# Set the major architecture you&#039;ll be building for.&lt;br /&gt;
# The only option here is &amp;quot;dreamcast&amp;quot; as of KOS 2.0.0.&lt;br /&gt;
#&lt;br /&gt;
export KOS_ARCH=&amp;quot;dreamcast&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Build Sub-Architecture&lt;br /&gt;
#&lt;br /&gt;
# Defines the sub architecture your configuration&lt;br /&gt;
# is targeting or uses an existing value that&lt;br /&gt;
# can be set externally via your IDE.&lt;br /&gt;
#&lt;br /&gt;
# Valid values:&lt;br /&gt;
#   &amp;quot;pristine&amp;quot; - Dreamcast console or HKT-0120 devkit (default)&lt;br /&gt;
#   &amp;quot;naomi&amp;quot;    - NAOMI or NAOMI 2 arcade board&lt;br /&gt;
#&lt;br /&gt;
if [ -z &amp;quot;${KOS_SUBARCH}&amp;quot; ] ; then&lt;br /&gt;
    export KOS_SUBARCH=&amp;quot;pristine&amp;quot;&lt;br /&gt;
else&lt;br /&gt;
    export KOS_SUBARCH&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# KOS Root Path&lt;br /&gt;
#&lt;br /&gt;
# Specifies the path to the KOS root directory&lt;br /&gt;
#&lt;br /&gt;
export KOS_BASE=&amp;quot;/media/chris/development/dreamcast/toolchains/kos&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# KOS-Ports Path&lt;br /&gt;
#&lt;br /&gt;
# Specifies the path to the KOS-ports directory&lt;br /&gt;
#&lt;br /&gt;
export KOS_PORTS=&amp;quot;${KOS_BASE}/../kos-ports&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# SH Compiler Prefixes&lt;br /&gt;
#&lt;br /&gt;
# Specifies the path to and prefix for the main SH&lt;br /&gt;
# GCC toolchain used to target the Dreamcast&#039;s SH4 CPU.&lt;br /&gt;
#&lt;br /&gt;
export KOS_CC_BASE=&amp;quot;/media/chris/development/dreamcast/toolchains/sh-elf&amp;quot;&lt;br /&gt;
export KOS_CC_PREFIX=&amp;quot;sh-elf&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# ARM Compiler Prefixes&lt;br /&gt;
#&lt;br /&gt;
# Specifies the path to and prefix for the additional ARM&lt;br /&gt;
# GCC toolchain used to target the Dreamcast&#039;s AICA SPU.&lt;br /&gt;
#&lt;br /&gt;
export DC_ARM_BASE=&amp;quot;/media/chris/development/dreamcast/toolchains/arm-eabi&amp;quot;&lt;br /&gt;
export DC_ARM_PREFIX=&amp;quot;arm-eabi&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# External Dreamcast Tools Path&lt;br /&gt;
#&lt;br /&gt;
# Specifies the path where Dreamcast tools that are not part of KOS are to be&lt;br /&gt;
# installed. This includes, for example, dc-tool-ip, dc-tool-serial, and the&lt;br /&gt;
# mrbc bytecode compiler. This directory, along with SH and ARM compiler&lt;br /&gt;
# toolchains, will be added to your PATH environment variable.&lt;br /&gt;
#&lt;br /&gt;
export DC_TOOLS_BASE=&amp;quot;/media/chris/development/dreamcast/tools&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# CMake Toolchain Path&lt;br /&gt;
#&lt;br /&gt;
# Specifies the path to the toolchain file used to target&lt;br /&gt;
# KOS with the &amp;quot;cmake&amp;quot; build utility.&lt;br /&gt;
#&lt;br /&gt;
export KOS_CMAKE_TOOLCHAIN=&amp;quot;${KOS_BASE}/utils/cmake/dreamcast.toolchain.cmake&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Genromfs Utility Path&lt;br /&gt;
#&lt;br /&gt;
# Specifies the path to the utility which is used by KOS&lt;br /&gt;
# to create romdisk filesystem images.&lt;br /&gt;
#&lt;br /&gt;
export KOS_GENROMFS=&amp;quot;${KOS_BASE}/utils/genromfs/genromfs&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Make Utility&lt;br /&gt;
#&lt;br /&gt;
# Configures the tool to be used as the main &amp;quot;make&amp;quot; utility&lt;br /&gt;
# for building GNU Makefiles. On a platform such as BSD,&lt;br /&gt;
# the default can be changed to &amp;quot;gmake,&amp;quot; for the GNU&lt;br /&gt;
# implementation.&lt;br /&gt;
#&lt;br /&gt;
export KOS_MAKE=&amp;quot;make&amp;quot;&lt;br /&gt;
#export KOS_MAKE=&amp;quot;gmake&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Loader Utility&lt;br /&gt;
#&lt;br /&gt;
# Specifies the loader to be used with the &amp;quot;make run&amp;quot; targets&lt;br /&gt;
# in the KOS examples. Defaults to using a preconfigured version&lt;br /&gt;
# of dc-tool. Use one of the other options for a manual dc-tool-ip&lt;br /&gt;
# or dc-tool-serial configuration, remembering to change the values&lt;br /&gt;
# for the Dreamcast&#039;s IP address or the serial port interface.&lt;br /&gt;
#&lt;br /&gt;
#export KOS_LOADER=&amp;quot;dc-tool -x&amp;quot;&lt;br /&gt;
export KOS_LOADER=&amp;quot;dc-tool-ip -t dreamcast -x&amp;quot;&lt;br /&gt;
#export KOS_LOADER=&amp;quot;dc-tool-ser -t /dev/ttyS0 -x&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Default Compiler Flags&lt;br /&gt;
#&lt;br /&gt;
# Resets build flags. You can also initialize them to some preset&lt;br /&gt;
# default values here if you wish.&lt;br /&gt;
#&lt;br /&gt;
export KOS_INC_PATHS=&amp;quot;&amp;quot;&lt;br /&gt;
export KOS_CFLAGS=&amp;quot;&amp;quot;&lt;br /&gt;
export KOS_CPPFLAGS=&amp;quot;&amp;quot;&lt;br /&gt;
export KOS_LDFLAGS=&amp;quot;&amp;quot;&lt;br /&gt;
export KOS_AFLAGS=&amp;quot;&amp;quot;&lt;br /&gt;
export DC_ARM_LDFLAGS=&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Debug Builds&lt;br /&gt;
#&lt;br /&gt;
# Controls whether to disable additional debugging checks and assertions,&lt;br /&gt;
# such as for parameter validation or internal errors. Uncomment this if&lt;br /&gt;
# you do not wish to compile with this additional logic enabled.&lt;br /&gt;
#&lt;br /&gt;
#export KOS_CFLAGS=&amp;quot;${KOS_CFLAGS} -DNDEBUG&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Optimization Level&lt;br /&gt;
#&lt;br /&gt;
# Controls the baseline optimization level to use when building.&lt;br /&gt;
# Typically this is -Og (debugging), -O0, -O1, -O2, or -O3.&lt;br /&gt;
# NOTE: For our target, -O4 is a valid optimization level that has&lt;br /&gt;
# been seen to have some performance impact as well.&lt;br /&gt;
#&lt;br /&gt;
export KOS_CFLAGS=&amp;quot;${KOS_CFLAGS} -O2&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Additional Optimizations&lt;br /&gt;
#&lt;br /&gt;
# Uncomment this to enable what has been found empirically to be&lt;br /&gt;
# the optimal set of additional flags for release build performance&lt;br /&gt;
# on the current stable toolchain. NOTE: Certain KOS-ports and examples&lt;br /&gt;
# do not work properly with &amp;quot;-flto=auto&amp;quot;!&lt;br /&gt;
#&lt;br /&gt;
#export KOS_CFLAGS=&amp;quot;${KOS_CFLAGS} -freorder-blocks-algorithm=simple -flto=auto&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Frame Pointers&lt;br /&gt;
#&lt;br /&gt;
# Controls whether frame pointers are emitted or not. Disabled by&lt;br /&gt;
# default. Enable them if you plan to use GDB for debugging.&lt;br /&gt;
#&lt;br /&gt;
export KOS_CFLAGS=&amp;quot;${KOS_CFLAGS} -fomit-frame-pointer&amp;quot;&lt;br /&gt;
#export KOS_CFLAGS=&amp;quot;${KOS_CFLAGS} -fno-omit-frame-pointer -DFRAME_POINTERS&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Stack Protector&lt;br /&gt;
#&lt;br /&gt;
# Controls whether GCC emits extra code to check for buffer overflows or stack&lt;br /&gt;
# smashing, which can be very useful for debugging. -fstack-protector only&lt;br /&gt;
# covers vulnerable objects, while -fstack-protector-strong provides medium&lt;br /&gt;
# coverage, and -fstack-protector-all provides full coverage. You may also&lt;br /&gt;
# override the default stack excepton handler by providing your own&lt;br /&gt;
# implementation of &amp;quot;void __stack_chk_fail(void).&amp;quot;&lt;br /&gt;
#&lt;br /&gt;
#export KOS_CFLAGS=&amp;quot;${KOS_CFLAGS} -fstack-protector-all&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# GCC Builtin Functions&lt;br /&gt;
#&lt;br /&gt;
# Comment out this line to enable GCC to use its own builtin implementations of&lt;br /&gt;
# certain standard library functions. Under certain conditions, this can allow&lt;br /&gt;
# compiler-optimized implementations to replace standard function invocations.&lt;br /&gt;
# The downside of this is that it COULD interfere with Newlib or KOS implementations&lt;br /&gt;
# of these functions, and it has not been tested thoroughly to ensure compatibility.&lt;br /&gt;
#&lt;br /&gt;
export KOS_CFLAGS=&amp;quot;${KOS_CFLAGS} -fno-builtin&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Fast Math Instructions&lt;br /&gt;
#&lt;br /&gt;
# Uncomment this line to enable the optimized fast-math instructions (FSSRA,&lt;br /&gt;
# FSCA, and FSQRT) for calculating sin/cos, inverse square root, and square roots.&lt;br /&gt;
# These can result in substantial performance gains for these kinds of operations;&lt;br /&gt;
# however, they do so at the price of accuracy and are not IEEE compliant.&lt;br /&gt;
# NOTE: Enabling this option will also override -fno-builtin!&lt;br /&gt;
#&lt;br /&gt;
#export KOS_CFLAGS=&amp;quot;${KOS_CFLAGS} -fbuiltin -ffast-math -ffp-contract=fast&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# SH4 Floating-Point Arithmetic Precision&lt;br /&gt;
#&lt;br /&gt;
# KallistiOS supports both the single-precision-default ABI (m4-single) and the&lt;br /&gt;
# single-precision-only ABI (m4-single-only). When using m4-single, the SH4 will&lt;br /&gt;
# be in single-precision mode upon function entry but will switch to double-&lt;br /&gt;
# precision mode if 64-bit doubles are used. When using m4-single-only, the SH4&lt;br /&gt;
# will always be in single-precision mode and 64-bit doubles will be truncated to&lt;br /&gt;
# 32-bit floats. Historically, m4-single-only was used in both official and&lt;br /&gt;
# homebrew Dreamcast software, but m4-single is the default as of KOS 2.2.0 to&lt;br /&gt;
# increase compatibility with newer libraries which require 64-bit doubles.&lt;br /&gt;
#&lt;br /&gt;
# WARNING: When adjusting this setting, make sure all software, including&lt;br /&gt;
#          kos-ports and linked external libraries, are rebuilt using the same&lt;br /&gt;
#          floating-point precision ABI setting!&lt;br /&gt;
#&lt;br /&gt;
export KOS_SH4_PRECISION=&amp;quot;-m4-single&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Use LRA (Local Register Allocator) Pass&lt;br /&gt;
#&lt;br /&gt;
# Uncomment this line to use the modern Local Register Allocator pass during&lt;br /&gt;
# code generation instead of the default older reload pass. This option is&lt;br /&gt;
# known to be unstable or less performant for SH at this time, but will likely&lt;br /&gt;
# become mandatory in future versions of GCC, so feel free to help us test.&lt;br /&gt;
# Only enable this setting if you understand what you are doing!&lt;br /&gt;
#&lt;br /&gt;
#export KOS_CFLAGS=&amp;quot;${KOS_CFLAGS} -mlra&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Shared Compiler Configuration&lt;br /&gt;
#&lt;br /&gt;
# Include sub architecture-independent configuration file for shared&lt;br /&gt;
# environment settings. If you want to configure additional compiler&lt;br /&gt;
# options or see where other build flags are set, look at this file.&lt;br /&gt;
#&lt;br /&gt;
. ${KOS_BASE}/environ_base.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
. environ.sh&lt;br /&gt;
make&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== KOS-ports bauen ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone --recursive https://github.com/KallistiOS/kos-ports kos-ports&lt;br /&gt;
kos-ports/utils/build-all.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chris</name></author>
	</entry>
</feed>