<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>http://try-as400.pocnet.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=PoC</id>
	<title>Try-AS/400 - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="http://try-as400.pocnet.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=PoC"/>
	<link rel="alternate" type="text/html" href="http://try-as400.pocnet.net/wiki/Special:Contributions/PoC"/>
	<updated>2026-09-12T09:15:20Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.9</generator>
	<entry>
		<id>http://try-as400.pocnet.net/index.php?title=ZuluSCSI&amp;diff=1838</id>
		<title>ZuluSCSI</title>
		<link rel="alternate" type="text/html" href="http://try-as400.pocnet.net/index.php?title=ZuluSCSI&amp;diff=1838"/>
		<updated>2026-09-10T16:10:32Z</updated>

		<summary type="html">&lt;p&gt;PoC: /* Tape drive support */ missing word&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;ZuluSCSI&#039;&#039;&#039; by Rabbit Hole Computing is a comparatively new family of SCSI device emulators featuring an SD card based backing store. Distinct features to older, similar devices is support for Wide-SCSI, Ultra-Speed, and a fast CPU.&lt;br /&gt;
&lt;br /&gt;
ZuluSCSI also features an OpenSource firmware, so it can be extended comparatively easily.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
For most AS/400 machines, you actually want a ZuluSCSI wide, because it offers the best performance.&lt;br /&gt;
&lt;br /&gt;
The ZuluSCSI firmware can emulate multiple devices at once. There is no real need to add multiple Zulus to a given SCSI bus. One Zulu can easily saturate even the UltraWide SCSI bus of a 9401-150, and due to the SD card, delays are minimal. You can gain more performance with bigger machines, if they have multiple SCSI buses, though.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&#039;&#039;&#039;Note:&#039;&#039;&#039; Current state of affairs is that at least for writes, the SD card itself is a considerable brake shoe for writes, presumably because of so called &#039;Write Amplification&#039;&#039;. This is not meant to stay like this forever. Optimizations are possible and will be implemented eventually.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hardware overview ==&lt;br /&gt;
Depending on the exact model, boards themselves have three DIP switches and tiny push buttons:&lt;br /&gt;
* 1: switch to initator mode,&lt;br /&gt;
* 2: enable debug log,&lt;br /&gt;
* 3: enable SCSI termination.&lt;br /&gt;
&lt;br /&gt;
The push buttons call the functions:&lt;br /&gt;
* Bootloader, for firmware-recovery,&lt;br /&gt;
* Eject.&lt;br /&gt;
&lt;br /&gt;
Also, three LEDs are provided, for indication of&lt;br /&gt;
* 2.8&amp;amp;thinsp;V power OK,&lt;br /&gt;
* 3.3&amp;amp;thinsp;V power OK,&lt;br /&gt;
* SD-card activity.&lt;br /&gt;
&lt;br /&gt;
The device itself needs 5&amp;amp;thinsp;V power, and can be powered by:&lt;br /&gt;
* the USB port,&lt;br /&gt;
* the termpower line of the SCSI bus,&lt;br /&gt;
* molex style power connectors.&lt;br /&gt;
&lt;br /&gt;
Usually, the integrated USB port is configured as USB modem, for usage with a terminal emulator. You can use the Linux or macOS &#039;&#039;screen&#039;&#039; command for that. Depending on your operating system, you need to find out what device file is created when plugging the Zulu&#039;s USB port. On Linux, it&#039;s &amp;lt;tt&amp;gt;/dev/ttyACM&#039;&#039;n&#039;&#039;&amp;lt;/tt&amp;gt; — &#039;&#039;n&#039;&#039; being a digit, usually 0. On macOS, it&#039;s &amp;lt;tt&amp;gt;/dev/tty.usbmodem*&amp;lt;/tt&amp;gt;, with a row of digits appended on behalf of the &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The firmware presents a simple menu driven UI for some tasks.&lt;br /&gt;
&lt;br /&gt;
There is no need to shut down the device itself, it&#039;s safe to &amp;quot;pull the plug&amp;quot; when there is no activity. The Operating System running on the attached computer should be orderly shut down, though.&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
Configuration itself is usually automatic, according to the files and directories found on the SD card. The SD card has either a FAT32&amp;lt;ref&amp;gt;Limiting files to max. 4&amp;amp;thinsp;GiB in size&amp;lt;/ref&amp;gt; or exFAT file system, the firmware understands both. It&#039;s easier to use the SD card with a card reader on a newer computer to create configurations, and files. The SD card is hotplug capable, and upon reinsertation, the ZuluSCSI reinitializes itself according to the SD card&#039;s content.&lt;br /&gt;
&lt;br /&gt;
Three devices classes are of general interest in the AS/400 world:&lt;br /&gt;
* Disk (DASD),&lt;br /&gt;
* CD/DVD (Optical),&lt;br /&gt;
* Tape.&lt;br /&gt;
&lt;br /&gt;
=== Files ===&lt;br /&gt;
File names are composed as follows:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;TT&amp;gt;&amp;lt;ID&amp;gt;[any text].&amp;lt;ext&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
  ^^   ^&lt;br /&gt;
  |    +-------------- SCSI ID character (byte offset 2)&lt;br /&gt;
  +------------------- two-character type prefix (case-insensitive)&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;TT&#039;&#039;&#039;:&lt;br /&gt;
:{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!TT&lt;br /&gt;
!Device type&lt;br /&gt;
!Default block size&lt;br /&gt;
|-&lt;br /&gt;
|HD&lt;br /&gt;
|Hard disk (fixed)&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|512&amp;amp;thinsp;Bytes&lt;br /&gt;
|-&lt;br /&gt;
|CD&lt;br /&gt;
|CD-ROM (optical)&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|2048&amp;amp;thinsp;Bytes&lt;br /&gt;
|-&lt;br /&gt;
|TP&lt;br /&gt;
|Sequential (tape)&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|512&amp;amp;thinsp;Bytes&lt;br /&gt;
|}&lt;br /&gt;
* The &#039;&#039;&#039;ID&#039;&#039;&#039; is exactly one char, and must be given in hexadecimal. This matters only for IDs ≥ 10.&lt;br /&gt;
* &#039;&#039;&#039;any text&#039;&#039;&#039; is entirely optional.&lt;br /&gt;
* The &#039;&#039;&#039;file extension&#039;&#039;&#039; doesn&#039;t matter.&lt;br /&gt;
&lt;br /&gt;
=== Directories ===&lt;br /&gt;
For a device usually allowing dynamic addition and removal of media — CD-ROM-, and tape drives, you can create a directory instead of a file. The naming scheme follows the same structure as files, but &#039;&#039;[any text]&#039;&#039; must be omitted.&lt;br /&gt;
&lt;br /&gt;
Files within the directories can be freely named. The &#039;&#039;Eject&#039;&#039; button loads and inserts the next image in order. Individual images can be inserted through the menu via USB.&lt;br /&gt;
&lt;br /&gt;
=== Configuration file ===&lt;br /&gt;
In addition, a configuration file can be supplied to provide additional information to either all or one emulated device. Having a &#039;&#039;zuluscsi.ini&#039;&#039; is normally optional, but for enabling AS/400 quirks, it&#039;s mandatory.&lt;br /&gt;
&lt;br /&gt;
The configuration file must be named &#039;&#039;zuluscsi.ini&#039;&#039;, and is in a simple ini-style format. It has a global &amp;lt;tt&amp;gt;[SCSI]&amp;lt;/tt&amp;gt; section to apply settings to all devices, and &amp;lt;tt&amp;gt;[SCSI&#039;&#039;n&#039;&#039;]&amp;lt;/tt&amp;gt;, where &#039;&#039;n&#039;&#039; is the ID of the given SCSI devices.&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
These are in the scope of AS/400.&lt;br /&gt;
&lt;br /&gt;
=== Tape drive support ===&lt;br /&gt;
Currently, two tape drives are emulated:&lt;br /&gt;
* &amp;lt;code&amp;gt;Device = &amp;quot;AS400_CISC&amp;quot;&amp;lt;/code&amp;gt;, a CISC era QIC1000, FC #6343,&lt;br /&gt;
* &amp;lt;code&amp;gt;Device = &amp;quot;AS400_PPC&amp;quot;&amp;lt;/code&amp;gt;, a PCI/RISC era SLR5 drive.&lt;br /&gt;
&lt;br /&gt;
To use,&lt;br /&gt;
* create directory &amp;lt;code&amp;gt;TP0&amp;lt;/code&amp;gt;,&lt;br /&gt;
* populate with one or more 0&amp;amp;thinsp;byte files named &amp;lt;code&amp;gt;*.tap&amp;lt;/code&amp;gt; files, e. g. by using the Unix &amp;lt;code&amp;gt;touch&amp;lt;/code&amp;gt; command,&lt;br /&gt;
* use the serial console to attach image(s) to the drive.&lt;br /&gt;
&lt;br /&gt;
Without any &#039;&#039;Device&#039;&#039; parameter, a standard tape drive is emulated, with no special AS/400 quirks. This works with many PPC/PCI machines. However, the presence of a &#039;&#039;TapeDensity&#039;&#039; parameter seems necessary in &#039;&#039;zuluscsi.ini&#039;&#039;.&lt;br /&gt;
 [SCSI0]&lt;br /&gt;
 TapeDensity = 0x25&lt;br /&gt;
&lt;br /&gt;
For trying an emulated SLR5 drive:&lt;br /&gt;
* &#039;&#039;zuluscsi.ini&#039;&#039;:&lt;br /&gt;
 [SCSI0]&lt;br /&gt;
 Device = &amp;quot;AS400_PPC&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Caveats:&lt;br /&gt;
* When you choose an image file through the USB port&#039;s media menu, make sure that you not only choose an image file, but afterwards &#039;&#039;insert&#039;&#039; it!&lt;br /&gt;
* If you replace a hardware tape drive, make sure to delete your old tape device file first, then IPL, check/set the new device name in DST, and have auto-configuration create the new device file during the following IPL.&lt;br /&gt;
* The amended (with an explicit &#039;&#039;Device&#039;&#039; statement) tape code as of v2026.08.28 has not yet undergone extensive testing. Initial tests yield mixed results.&lt;br /&gt;
&lt;br /&gt;
=== CD drive support ===&lt;br /&gt;
* create directory &amp;lt;code&amp;gt;CD0&amp;lt;/code&amp;gt;,&lt;br /&gt;
* populate with one or more readymade ISO images,&lt;br /&gt;
* use the serial console to attach image(s) to the drive.&lt;br /&gt;
&lt;br /&gt;
No special handling for the ID in &#039;&#039;zuluscsi.ini&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Caveats:&lt;br /&gt;
* When you choose an image file through the USB port&#039;s media menu, make sure that you not only choose an image file, but afterwards &#039;&#039;insert&#039;&#039; it!&lt;br /&gt;
* If you replace a hardware CD drive, make sure to delete your old CD device file first, then IPL, check/set the new device name in DST, and have auto-configuration create the new device file during the following IPL.&lt;br /&gt;
&lt;br /&gt;
Tested with Firmware 2026-08-07, 9401-150, V4R4, V5R2: IPL only so far, but that works. &#039;&#039;&#039;Note:&#039;&#039;&#039; CISC era OS/400 has no CD-ROM support whatsoever.&lt;br /&gt;
&lt;br /&gt;
=== Disk drive support ===&lt;br /&gt;
The officially released code base is able to present multiple disk drives to the system, initialize, and install SLIC + base OS/400 + LPPs + PTFs.&lt;br /&gt;
&lt;br /&gt;
* Copy &#039;&#039;as400_disk_definitions.txt&#039;&#039; from the official GitHub repository to the SD card.&lt;br /&gt;
** Because of serial numbers currently being hard coded, only one disk per type should be used for now!&lt;br /&gt;
* &#039;&#039;zuluscsi.ini&#039;&#039;:&lt;br /&gt;
 [SCSI]&lt;br /&gt;
 System = AS400_PPC&lt;br /&gt;
 &lt;br /&gt;
 [SCSI6]&lt;br /&gt;
 AS400_DiskProfile = &amp;quot;09L4044&amp;quot;&lt;br /&gt;
 PrefetchBytes = 0&lt;br /&gt;
&lt;br /&gt;
When a &#039;&#039;AS400_DiskProfile&#039;&#039; is configured for a given SCSI ID, and the associated image cannot be found on the SD card, a new one is generated automatically, with the correct size. This takes some time, so wait until the activity LED stays unlit.&lt;br /&gt;
&lt;br /&gt;
There is a shell-script &amp;lt;code&amp;gt;utils/extract_as400_disk_data.sh&amp;lt;/code&amp;gt; in the original source tree on GitHub to generate more &#039;&#039;as400_disk_definitions.txt&#039;&#039; entries from real disks connected to a SCSI controller when ran under Linux.&lt;br /&gt;
&lt;br /&gt;
Caveats:&lt;br /&gt;
* Writes to the emulated disk are very slow compared to reads.&lt;br /&gt;
&lt;br /&gt;
Fully tested with Firmware v2026.08.27RC1, 9401-150, V4R4, V5R2.&lt;br /&gt;
&lt;br /&gt;
== Current state ==&lt;br /&gt;
We have to differ three hardware generations when considering Zulu vs. AS/400:&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&amp;amp;nbsp;&lt;br /&gt;
!CISC/IMPI, 520&amp;amp;thinsp;bytes/block disks&lt;br /&gt;
!RISC/SPD, 520/522&amp;amp;thinsp;bytes/block disks&lt;br /&gt;
!RISC/PCI, 522&amp;amp;thinsp;bytes/block disks&lt;br /&gt;
|-&lt;br /&gt;
!CD-ROM&lt;br /&gt;
|Not supported&lt;br /&gt;
|Untested&lt;br /&gt;
|Works&lt;br /&gt;
|-&lt;br /&gt;
!Tape&lt;br /&gt;
|Fails, hangs with SRC early.&lt;br /&gt;
|Untested&lt;br /&gt;
|Works&lt;br /&gt;
|-&lt;br /&gt;
!Disk&lt;br /&gt;
|Fails, hangs with SRC early.&lt;br /&gt;
|Untested&lt;br /&gt;
|Works&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
All successful tests so far have been based on a ZuluSCSI wide board on a 9401-150, while the CISC tests have been done with a ZuluSCSI Blaster on a 9401-P02.&lt;br /&gt;
&lt;br /&gt;
There are success reports of more 150&#039;s working, and one of a 9406-270 becoming stuck with A6000244, &#039;&#039;Contact was lost with device indicated&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Ordinary Harddisks on the AS/400]]&lt;br /&gt;
* [[Tape Drives on old AS/400]]&lt;br /&gt;
* [[SRC]], aka System Reference Code&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [https://zuluscsi.com ZuluSCSI Website] — see the &amp;lt;tt&amp;gt;☰&amp;lt;/tt&amp;gt; button top right for more details&lt;br /&gt;
* [https://github.com/ZuluSCSI/ZuluSCSI-firmware ZuluSCSI-firmware], GitHub&lt;br /&gt;
&lt;br /&gt;
== Footnotes ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Hardware Configuration Guide]]&lt;/div&gt;</summary>
		<author><name>PoC</name></author>
	</entry>
	<entry>
		<id>http://try-as400.pocnet.net/index.php?title=ZuluSCSI&amp;diff=1837</id>
		<title>ZuluSCSI</title>
		<link rel="alternate" type="text/html" href="http://try-as400.pocnet.net/index.php?title=ZuluSCSI&amp;diff=1837"/>
		<updated>2026-09-10T16:09:38Z</updated>

		<summary type="html">&lt;p&gt;PoC: /* Tape drive support */ Rework&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;ZuluSCSI&#039;&#039;&#039; by Rabbit Hole Computing is a comparatively new family of SCSI device emulators featuring an SD card based backing store. Distinct features to older, similar devices is support for Wide-SCSI, Ultra-Speed, and a fast CPU.&lt;br /&gt;
&lt;br /&gt;
ZuluSCSI also features an OpenSource firmware, so it can be extended comparatively easily.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
For most AS/400 machines, you actually want a ZuluSCSI wide, because it offers the best performance.&lt;br /&gt;
&lt;br /&gt;
The ZuluSCSI firmware can emulate multiple devices at once. There is no real need to add multiple Zulus to a given SCSI bus. One Zulu can easily saturate even the UltraWide SCSI bus of a 9401-150, and due to the SD card, delays are minimal. You can gain more performance with bigger machines, if they have multiple SCSI buses, though.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&#039;&#039;&#039;Note:&#039;&#039;&#039; Current state of affairs is that at least for writes, the SD card itself is a considerable brake shoe for writes, presumably because of so called &#039;Write Amplification&#039;&#039;. This is not meant to stay like this forever. Optimizations are possible and will be implemented eventually.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hardware overview ==&lt;br /&gt;
Depending on the exact model, boards themselves have three DIP switches and tiny push buttons:&lt;br /&gt;
* 1: switch to initator mode,&lt;br /&gt;
* 2: enable debug log,&lt;br /&gt;
* 3: enable SCSI termination.&lt;br /&gt;
&lt;br /&gt;
The push buttons call the functions:&lt;br /&gt;
* Bootloader, for firmware-recovery,&lt;br /&gt;
* Eject.&lt;br /&gt;
&lt;br /&gt;
Also, three LEDs are provided, for indication of&lt;br /&gt;
* 2.8&amp;amp;thinsp;V power OK,&lt;br /&gt;
* 3.3&amp;amp;thinsp;V power OK,&lt;br /&gt;
* SD-card activity.&lt;br /&gt;
&lt;br /&gt;
The device itself needs 5&amp;amp;thinsp;V power, and can be powered by:&lt;br /&gt;
* the USB port,&lt;br /&gt;
* the termpower line of the SCSI bus,&lt;br /&gt;
* molex style power connectors.&lt;br /&gt;
&lt;br /&gt;
Usually, the integrated USB port is configured as USB modem, for usage with a terminal emulator. You can use the Linux or macOS &#039;&#039;screen&#039;&#039; command for that. Depending on your operating system, you need to find out what device file is created when plugging the Zulu&#039;s USB port. On Linux, it&#039;s &amp;lt;tt&amp;gt;/dev/ttyACM&#039;&#039;n&#039;&#039;&amp;lt;/tt&amp;gt; — &#039;&#039;n&#039;&#039; being a digit, usually 0. On macOS, it&#039;s &amp;lt;tt&amp;gt;/dev/tty.usbmodem*&amp;lt;/tt&amp;gt;, with a row of digits appended on behalf of the &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The firmware presents a simple menu driven UI for some tasks.&lt;br /&gt;
&lt;br /&gt;
There is no need to shut down the device itself, it&#039;s safe to &amp;quot;pull the plug&amp;quot; when there is no activity. The Operating System running on the attached computer should be orderly shut down, though.&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
Configuration itself is usually automatic, according to the files and directories found on the SD card. The SD card has either a FAT32&amp;lt;ref&amp;gt;Limiting files to max. 4&amp;amp;thinsp;GiB in size&amp;lt;/ref&amp;gt; or exFAT file system, the firmware understands both. It&#039;s easier to use the SD card with a card reader on a newer computer to create configurations, and files. The SD card is hotplug capable, and upon reinsertation, the ZuluSCSI reinitializes itself according to the SD card&#039;s content.&lt;br /&gt;
&lt;br /&gt;
Three devices classes are of general interest in the AS/400 world:&lt;br /&gt;
* Disk (DASD),&lt;br /&gt;
* CD/DVD (Optical),&lt;br /&gt;
* Tape.&lt;br /&gt;
&lt;br /&gt;
=== Files ===&lt;br /&gt;
File names are composed as follows:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;TT&amp;gt;&amp;lt;ID&amp;gt;[any text].&amp;lt;ext&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
  ^^   ^&lt;br /&gt;
  |    +-------------- SCSI ID character (byte offset 2)&lt;br /&gt;
  +------------------- two-character type prefix (case-insensitive)&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;TT&#039;&#039;&#039;:&lt;br /&gt;
:{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!TT&lt;br /&gt;
!Device type&lt;br /&gt;
!Default block size&lt;br /&gt;
|-&lt;br /&gt;
|HD&lt;br /&gt;
|Hard disk (fixed)&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|512&amp;amp;thinsp;Bytes&lt;br /&gt;
|-&lt;br /&gt;
|CD&lt;br /&gt;
|CD-ROM (optical)&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|2048&amp;amp;thinsp;Bytes&lt;br /&gt;
|-&lt;br /&gt;
|TP&lt;br /&gt;
|Sequential (tape)&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|512&amp;amp;thinsp;Bytes&lt;br /&gt;
|}&lt;br /&gt;
* The &#039;&#039;&#039;ID&#039;&#039;&#039; is exactly one char, and must be given in hexadecimal. This matters only for IDs ≥ 10.&lt;br /&gt;
* &#039;&#039;&#039;any text&#039;&#039;&#039; is entirely optional.&lt;br /&gt;
* The &#039;&#039;&#039;file extension&#039;&#039;&#039; doesn&#039;t matter.&lt;br /&gt;
&lt;br /&gt;
=== Directories ===&lt;br /&gt;
For a device usually allowing dynamic addition and removal of media — CD-ROM-, and tape drives, you can create a directory instead of a file. The naming scheme follows the same structure as files, but &#039;&#039;[any text]&#039;&#039; must be omitted.&lt;br /&gt;
&lt;br /&gt;
Files within the directories can be freely named. The &#039;&#039;Eject&#039;&#039; button loads and inserts the next image in order. Individual images can be inserted through the menu via USB.&lt;br /&gt;
&lt;br /&gt;
=== Configuration file ===&lt;br /&gt;
In addition, a configuration file can be supplied to provide additional information to either all or one emulated device. Having a &#039;&#039;zuluscsi.ini&#039;&#039; is normally optional, but for enabling AS/400 quirks, it&#039;s mandatory.&lt;br /&gt;
&lt;br /&gt;
The configuration file must be named &#039;&#039;zuluscsi.ini&#039;&#039;, and is in a simple ini-style format. It has a global &amp;lt;tt&amp;gt;[SCSI]&amp;lt;/tt&amp;gt; section to apply settings to all devices, and &amp;lt;tt&amp;gt;[SCSI&#039;&#039;n&#039;&#039;]&amp;lt;/tt&amp;gt;, where &#039;&#039;n&#039;&#039; is the ID of the given SCSI devices.&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
These are in the scope of AS/400.&lt;br /&gt;
&lt;br /&gt;
=== Tape drive support ===&lt;br /&gt;
Currently, two tape drives are emulated:&lt;br /&gt;
* &amp;lt;code&amp;gt;Device = &amp;quot;AS400_CISC&amp;quot;&amp;lt;/code&amp;gt;, a CISC era QIC1000, FC #6343,&lt;br /&gt;
* &amp;lt;code&amp;gt;Device = &amp;quot;AS400_PPC&amp;quot;&amp;lt;/code&amp;gt;, a PCI/RISC era SLR5 drive.&lt;br /&gt;
&lt;br /&gt;
To use,&lt;br /&gt;
* create directory &amp;lt;code&amp;gt;TP0&amp;lt;/code&amp;gt;,&lt;br /&gt;
* populate with one or more 0&amp;amp;thinsp;byte files named &amp;lt;code&amp;gt;*.tap&amp;lt;/code&amp;gt; files, e. g. by using the Unix &amp;lt;code&amp;gt;touch&amp;lt;/code&amp;gt;,&lt;br /&gt;
* use the serial console to attach image(s) to the drive.&lt;br /&gt;
&lt;br /&gt;
Without any &#039;&#039;Device&#039;&#039; parameter, a standard tape drive is emulated, with no special AS/400 quirks. This works with many PPC/PCI machines. However, the presence of a &#039;&#039;TapeDensity&#039;&#039; parameter seems necessary in &#039;&#039;zuluscsi.ini&#039;&#039;.&lt;br /&gt;
 [SCSI0]&lt;br /&gt;
 TapeDensity = 0x25&lt;br /&gt;
&lt;br /&gt;
For trying an emulated SLR5 drive:&lt;br /&gt;
* &#039;&#039;zuluscsi.ini&#039;&#039;:&lt;br /&gt;
 [SCSI0]&lt;br /&gt;
 Device = &amp;quot;AS400_PPC&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Caveats:&lt;br /&gt;
* When you choose an image file through the USB port&#039;s media menu, make sure that you not only choose an image file, but afterwards &#039;&#039;insert&#039;&#039; it!&lt;br /&gt;
* If you replace a hardware tape drive, make sure to delete your old tape device file first, then IPL, check/set the new device name in DST, and have auto-configuration create the new device file during the following IPL.&lt;br /&gt;
* The amended (with an explicit &#039;&#039;Device&#039;&#039; statement) tape code as of v2026.08.28 has not yet undergone extensive testing. Initial tests yield mixed results.&lt;br /&gt;
&lt;br /&gt;
=== CD drive support ===&lt;br /&gt;
* create directory &amp;lt;code&amp;gt;CD0&amp;lt;/code&amp;gt;,&lt;br /&gt;
* populate with one or more readymade ISO images,&lt;br /&gt;
* use the serial console to attach image(s) to the drive.&lt;br /&gt;
&lt;br /&gt;
No special handling for the ID in &#039;&#039;zuluscsi.ini&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Caveats:&lt;br /&gt;
* When you choose an image file through the USB port&#039;s media menu, make sure that you not only choose an image file, but afterwards &#039;&#039;insert&#039;&#039; it!&lt;br /&gt;
* If you replace a hardware CD drive, make sure to delete your old CD device file first, then IPL, check/set the new device name in DST, and have auto-configuration create the new device file during the following IPL.&lt;br /&gt;
&lt;br /&gt;
Tested with Firmware 2026-08-07, 9401-150, V4R4, V5R2: IPL only so far, but that works. &#039;&#039;&#039;Note:&#039;&#039;&#039; CISC era OS/400 has no CD-ROM support whatsoever.&lt;br /&gt;
&lt;br /&gt;
=== Disk drive support ===&lt;br /&gt;
The officially released code base is able to present multiple disk drives to the system, initialize, and install SLIC + base OS/400 + LPPs + PTFs.&lt;br /&gt;
&lt;br /&gt;
* Copy &#039;&#039;as400_disk_definitions.txt&#039;&#039; from the official GitHub repository to the SD card.&lt;br /&gt;
** Because of serial numbers currently being hard coded, only one disk per type should be used for now!&lt;br /&gt;
* &#039;&#039;zuluscsi.ini&#039;&#039;:&lt;br /&gt;
 [SCSI]&lt;br /&gt;
 System = AS400_PPC&lt;br /&gt;
 &lt;br /&gt;
 [SCSI6]&lt;br /&gt;
 AS400_DiskProfile = &amp;quot;09L4044&amp;quot;&lt;br /&gt;
 PrefetchBytes = 0&lt;br /&gt;
&lt;br /&gt;
When a &#039;&#039;AS400_DiskProfile&#039;&#039; is configured for a given SCSI ID, and the associated image cannot be found on the SD card, a new one is generated automatically, with the correct size. This takes some time, so wait until the activity LED stays unlit.&lt;br /&gt;
&lt;br /&gt;
There is a shell-script &amp;lt;code&amp;gt;utils/extract_as400_disk_data.sh&amp;lt;/code&amp;gt; in the original source tree on GitHub to generate more &#039;&#039;as400_disk_definitions.txt&#039;&#039; entries from real disks connected to a SCSI controller when ran under Linux.&lt;br /&gt;
&lt;br /&gt;
Caveats:&lt;br /&gt;
* Writes to the emulated disk are very slow compared to reads.&lt;br /&gt;
&lt;br /&gt;
Fully tested with Firmware v2026.08.27RC1, 9401-150, V4R4, V5R2.&lt;br /&gt;
&lt;br /&gt;
== Current state ==&lt;br /&gt;
We have to differ three hardware generations when considering Zulu vs. AS/400:&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&amp;amp;nbsp;&lt;br /&gt;
!CISC/IMPI, 520&amp;amp;thinsp;bytes/block disks&lt;br /&gt;
!RISC/SPD, 520/522&amp;amp;thinsp;bytes/block disks&lt;br /&gt;
!RISC/PCI, 522&amp;amp;thinsp;bytes/block disks&lt;br /&gt;
|-&lt;br /&gt;
!CD-ROM&lt;br /&gt;
|Not supported&lt;br /&gt;
|Untested&lt;br /&gt;
|Works&lt;br /&gt;
|-&lt;br /&gt;
!Tape&lt;br /&gt;
|Fails, hangs with SRC early.&lt;br /&gt;
|Untested&lt;br /&gt;
|Works&lt;br /&gt;
|-&lt;br /&gt;
!Disk&lt;br /&gt;
|Fails, hangs with SRC early.&lt;br /&gt;
|Untested&lt;br /&gt;
|Works&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
All successful tests so far have been based on a ZuluSCSI wide board on a 9401-150, while the CISC tests have been done with a ZuluSCSI Blaster on a 9401-P02.&lt;br /&gt;
&lt;br /&gt;
There are success reports of more 150&#039;s working, and one of a 9406-270 becoming stuck with A6000244, &#039;&#039;Contact was lost with device indicated&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Ordinary Harddisks on the AS/400]]&lt;br /&gt;
* [[Tape Drives on old AS/400]]&lt;br /&gt;
* [[SRC]], aka System Reference Code&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [https://zuluscsi.com ZuluSCSI Website] — see the &amp;lt;tt&amp;gt;☰&amp;lt;/tt&amp;gt; button top right for more details&lt;br /&gt;
* [https://github.com/ZuluSCSI/ZuluSCSI-firmware ZuluSCSI-firmware], GitHub&lt;br /&gt;
&lt;br /&gt;
== Footnotes ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Hardware Configuration Guide]]&lt;/div&gt;</summary>
		<author><name>PoC</name></author>
	</entry>
	<entry>
		<id>http://try-as400.pocnet.net/index.php?title=IBM_BOOK_format&amp;diff=1836</id>
		<title>IBM BOOK format</title>
		<link rel="alternate" type="text/html" href="http://try-as400.pocnet.net/index.php?title=IBM_BOOK_format&amp;diff=1836"/>
		<updated>2026-09-10T08:57:47Z</updated>

		<summary type="html">&lt;p&gt;PoC: Updated page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;IBM BookManager Softcopy&#039;&#039;&#039; is IBM&#039;s legacy online documentation system, created in the 1980s. It was historically used mostly on mainframes, midrange (AS/400) and OS/2, although it also saw some use in other areas including AIX.&lt;br /&gt;
&lt;br /&gt;
IBM no longer uses it for new documentations of its products, but there is an immense quantity of legacy electronic documentation from the period when IBM actively used it (from the 1980s thru 2010s), particularly documentation CD-ROMs/DVD-ROMs and images thereof.&lt;br /&gt;
&lt;br /&gt;
The file-internal style (?) format apparently is called IBMIDDOC.&lt;br /&gt;
&lt;br /&gt;
The standard DOS style extension is &amp;lt;code&amp;gt;BOO&amp;lt;/code&amp;gt;, and &amp;quot;application/book&amp;quot; is sometimes used as MIME type, but was never officially registered.&lt;br /&gt;
&lt;br /&gt;
== Internal structure ==&lt;br /&gt;
The internal structure is fully documented as a part of the &#039;&#039;Geist&#039;&#039; reference implementation on GitHub.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Reviving InfoSeeker]]&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [https://github.com/cyberdotgent/geist Geist IBM Book format reference implementation]&lt;br /&gt;
** [https://github.com/cyberdotgent/geist/tree/main/doc/boo-spec Geist Book format documentation]&lt;br /&gt;
* [http://www.edm2.com/index.php/BookManager BookManager Releases] contains history of IBM BookManager releases&lt;br /&gt;
* [https://www.ibm.com/support/pages/using-pdfs-and-bookmanager-books-your-workstation-or-mainframe Using PDFs and BookManager Books on your workstation or mainframe], IBM.com&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Terse_(file_format) Terse (file format)], Wikipedia&lt;br /&gt;
* [https://en.wikipedia.org/wiki/LZ77_and_LZ78 LZ77 and LZ78] compression algorithms, Wikipedia&lt;br /&gt;
* [https://patents.google.com/patent/US4814746A/en?oq=4814746 Data compression method] for TERSE, patents.google.com&lt;br /&gt;
* [http://fileformats.archiveteam.org/wiki/ZIP ZIP archive file format], archiveteam.org, mentions TERSE.&lt;br /&gt;
* [https://hercules-390.yahoogroups.narkive.com/gYwJ3QUu/terse-for-pcs-windows-aix-linux terse for PCs (Windows, AIX, Linux ....)], hercules-390@yahoogroups.com&lt;br /&gt;
* [https://bit.listserv.ibm-main.narkive.com/82nDDwrh/trsmain-question TRSMAIN question], IBM-Main mailing list&lt;br /&gt;
* [https://share.confex.com/share/121/webprogram/Handout/Session14242/14242-%20zOS%20Documentation%20Search%20Strategies%20%28Final%20Edition%29.pdf 14242: z/OS Documentation Search Strategies], presentation slides in PDF format&lt;br /&gt;
&lt;br /&gt;
== Footnotes ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category: System Internals]]&lt;/div&gt;</summary>
		<author><name>PoC</name></author>
	</entry>
	<entry>
		<id>http://try-as400.pocnet.net/index.php?title=ZuluSCSI&amp;diff=1835</id>
		<title>ZuluSCSI</title>
		<link rel="alternate" type="text/html" href="http://try-as400.pocnet.net/index.php?title=ZuluSCSI&amp;diff=1835"/>
		<updated>2026-09-08T12:15:29Z</updated>

		<summary type="html">&lt;p&gt;PoC: /* Examples */ More precise on tapes&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;ZuluSCSI&#039;&#039;&#039; by Rabbit Hole Computing is a comparatively new family of SCSI device emulators featuring an SD card based backing store. Distinct features to older, similar devices is support for Wide-SCSI, Ultra-Speed, and a fast CPU.&lt;br /&gt;
&lt;br /&gt;
ZuluSCSI also features an OpenSource firmware, so it can be extended comparatively easily.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
For most AS/400 machines, you actually want a ZuluSCSI wide, because it offers the best performance.&lt;br /&gt;
&lt;br /&gt;
The ZuluSCSI firmware can emulate multiple devices at once. There is no real need to add multiple Zulus to a given SCSI bus. One Zulu can easily saturate even the UltraWide SCSI bus of a 9401-150, and due to the SD card, delays are minimal. You can gain more performance with bigger machines, if they have multiple SCSI buses, though.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&#039;&#039;&#039;Note:&#039;&#039;&#039; Current state of affairs is that at least for writes, the SD card itself is a considerable brake shoe for writes, presumably because of so called &#039;Write Amplification&#039;&#039;. This is not meant to stay like this forever. Optimizations are possible and will be implemented eventually.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hardware overview ==&lt;br /&gt;
Depending on the exact model, boards themselves have three DIP switches and tiny push buttons:&lt;br /&gt;
* 1: switch to initator mode,&lt;br /&gt;
* 2: enable debug log,&lt;br /&gt;
* 3: enable SCSI termination.&lt;br /&gt;
&lt;br /&gt;
The push buttons call the functions:&lt;br /&gt;
* Bootloader, for firmware-recovery,&lt;br /&gt;
* Eject.&lt;br /&gt;
&lt;br /&gt;
Also, three LEDs are provided, for indication of&lt;br /&gt;
* 2.8&amp;amp;thinsp;V power OK,&lt;br /&gt;
* 3.3&amp;amp;thinsp;V power OK,&lt;br /&gt;
* SD-card activity.&lt;br /&gt;
&lt;br /&gt;
The device itself needs 5&amp;amp;thinsp;V power, and can be powered by:&lt;br /&gt;
* the USB port,&lt;br /&gt;
* the termpower line of the SCSI bus,&lt;br /&gt;
* molex style power connectors.&lt;br /&gt;
&lt;br /&gt;
Usually, the integrated USB port is configured as USB modem, for usage with a terminal emulator. You can use the Linux or macOS &#039;&#039;screen&#039;&#039; command for that. Depending on your operating system, you need to find out what device file is created when plugging the Zulu&#039;s USB port. On Linux, it&#039;s &amp;lt;tt&amp;gt;/dev/ttyACM&#039;&#039;n&#039;&#039;&amp;lt;/tt&amp;gt; — &#039;&#039;n&#039;&#039; being a digit, usually 0. On macOS, it&#039;s &amp;lt;tt&amp;gt;/dev/tty.usbmodem*&amp;lt;/tt&amp;gt;, with a row of digits appended on behalf of the &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The firmware presents a simple menu driven UI for some tasks.&lt;br /&gt;
&lt;br /&gt;
There is no need to shut down the device itself, it&#039;s safe to &amp;quot;pull the plug&amp;quot; when there is no activity. The Operating System running on the attached computer should be orderly shut down, though.&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
Configuration itself is usually automatic, according to the files and directories found on the SD card. The SD card has either a FAT32&amp;lt;ref&amp;gt;Limiting files to max. 4&amp;amp;thinsp;GiB in size&amp;lt;/ref&amp;gt; or exFAT file system, the firmware understands both. It&#039;s easier to use the SD card with a card reader on a newer computer to create configurations, and files. The SD card is hotplug capable, and upon reinsertation, the ZuluSCSI reinitializes itself according to the SD card&#039;s content.&lt;br /&gt;
&lt;br /&gt;
Three devices classes are of general interest in the AS/400 world:&lt;br /&gt;
* Disk (DASD),&lt;br /&gt;
* CD/DVD (Optical),&lt;br /&gt;
* Tape.&lt;br /&gt;
&lt;br /&gt;
=== Files ===&lt;br /&gt;
File names are composed as follows:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;TT&amp;gt;&amp;lt;ID&amp;gt;[any text].&amp;lt;ext&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
  ^^   ^&lt;br /&gt;
  |    +-------------- SCSI ID character (byte offset 2)&lt;br /&gt;
  +------------------- two-character type prefix (case-insensitive)&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;TT&#039;&#039;&#039;:&lt;br /&gt;
:{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!TT&lt;br /&gt;
!Device type&lt;br /&gt;
!Default block size&lt;br /&gt;
|-&lt;br /&gt;
|HD&lt;br /&gt;
|Hard disk (fixed)&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|512&amp;amp;thinsp;Bytes&lt;br /&gt;
|-&lt;br /&gt;
|CD&lt;br /&gt;
|CD-ROM (optical)&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|2048&amp;amp;thinsp;Bytes&lt;br /&gt;
|-&lt;br /&gt;
|TP&lt;br /&gt;
|Sequential (tape)&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|512&amp;amp;thinsp;Bytes&lt;br /&gt;
|}&lt;br /&gt;
* The &#039;&#039;&#039;ID&#039;&#039;&#039; is exactly one char, and must be given in hexadecimal. This matters only for IDs ≥ 10.&lt;br /&gt;
* &#039;&#039;&#039;any text&#039;&#039;&#039; is entirely optional.&lt;br /&gt;
* The &#039;&#039;&#039;file extension&#039;&#039;&#039; doesn&#039;t matter.&lt;br /&gt;
&lt;br /&gt;
=== Directories ===&lt;br /&gt;
For a device usually allowing dynamic addition and removal of media — CD-ROM-, and tape drives, you can create a directory instead of a file. The naming scheme follows the same structure as files, but &#039;&#039;[any text]&#039;&#039; must be omitted.&lt;br /&gt;
&lt;br /&gt;
Files within the directories can be freely named. The &#039;&#039;Eject&#039;&#039; button loads and inserts the next image in order. Individual images can be inserted through the menu via USB.&lt;br /&gt;
&lt;br /&gt;
=== Configuration file ===&lt;br /&gt;
In addition, a configuration file can be supplied to provide additional information to either all or one emulated device. Having a &#039;&#039;zuluscsi.ini&#039;&#039; is normally optional, but for enabling AS/400 quirks, it&#039;s mandatory.&lt;br /&gt;
&lt;br /&gt;
The configuration file must be named &#039;&#039;zuluscsi.ini&#039;&#039;, and is in a simple ini-style format. It has a global &amp;lt;tt&amp;gt;[SCSI]&amp;lt;/tt&amp;gt; section to apply settings to all devices, and &amp;lt;tt&amp;gt;[SCSI&#039;&#039;n&#039;&#039;]&amp;lt;/tt&amp;gt;, where &#039;&#039;n&#039;&#039; is the ID of the given SCSI devices.&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
These are in the scope of AS/400.&lt;br /&gt;
&lt;br /&gt;
=== Tape drive support ===&lt;br /&gt;
Currently, two tape drives are emulated:&lt;br /&gt;
* a CISC era QIC1000, FC #6343,&lt;br /&gt;
* a PCI/RISC era SLR5 drive.&lt;br /&gt;
&lt;br /&gt;
* create directory &amp;lt;code&amp;gt;TP0&amp;lt;/code&amp;gt;,&lt;br /&gt;
* populate with one or more 0&amp;amp;thinsp;byte files named &amp;lt;code&amp;gt;*.tap&amp;lt;/code&amp;gt; files, e. g. by using the Unix &amp;lt;code&amp;gt;touch&amp;lt;/code&amp;gt;,&lt;br /&gt;
* use the serial console to attach image(s) to the drive.&lt;br /&gt;
* &#039;&#039;zuluscsi.ini&#039;&#039;:&lt;br /&gt;
 [SCSI0]&lt;br /&gt;
 Device = &amp;quot;AS400_PPC&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Caveats:&lt;br /&gt;
* When you choose an image file through the USB port&#039;s media menu, make sure that you not only choose an image file, but afterwards &#039;&#039;insert&#039;&#039; it!&lt;br /&gt;
* If you replace a hardware tape drive, make sure to delete your old tape device file first, then IPL, check/set the new device name in DST, and have auto-configuration create the new device file during the following IPL.&lt;br /&gt;
* The amended (with an explicit &#039;&#039;Device&#039;&#039; statement) tape code as of v2026.08.28 has not yet undergone extensive testing. Initial tests yield mixed results.&lt;br /&gt;
&lt;br /&gt;
=== CD drive support ===&lt;br /&gt;
* create directory &amp;lt;code&amp;gt;CD0&amp;lt;/code&amp;gt;,&lt;br /&gt;
* populate with one or more readymade ISO images,&lt;br /&gt;
* use the serial console to attach image(s) to the drive.&lt;br /&gt;
&lt;br /&gt;
No special handling for the ID in &#039;&#039;zuluscsi.ini&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Caveats:&lt;br /&gt;
* When you choose an image file through the USB port&#039;s media menu, make sure that you not only choose an image file, but afterwards &#039;&#039;insert&#039;&#039; it!&lt;br /&gt;
* If you replace a hardware CD drive, make sure to delete your old CD device file first, then IPL, check/set the new device name in DST, and have auto-configuration create the new device file during the following IPL.&lt;br /&gt;
&lt;br /&gt;
Tested with Firmware 2026-08-07, 9401-150, V4R4, V5R2: IPL only so far, but that works. &#039;&#039;&#039;Note:&#039;&#039;&#039; CISC era OS/400 has no CD-ROM support whatsoever.&lt;br /&gt;
&lt;br /&gt;
=== Disk drive support ===&lt;br /&gt;
The officially released code base is able to present multiple disk drives to the system, initialize, and install SLIC + base OS/400 + LPPs + PTFs.&lt;br /&gt;
&lt;br /&gt;
* Copy &#039;&#039;as400_disk_definitions.txt&#039;&#039; from the official GitHub repository to the SD card.&lt;br /&gt;
** Because of serial numbers currently being hard coded, only one disk per type should be used for now!&lt;br /&gt;
* &#039;&#039;zuluscsi.ini&#039;&#039;:&lt;br /&gt;
 [SCSI]&lt;br /&gt;
 System = AS400_PPC&lt;br /&gt;
 &lt;br /&gt;
 [SCSI6]&lt;br /&gt;
 AS400_DiskProfile = &amp;quot;09L4044&amp;quot;&lt;br /&gt;
 PrefetchBytes = 0&lt;br /&gt;
&lt;br /&gt;
When a &#039;&#039;AS400_DiskProfile&#039;&#039; is configured for a given SCSI ID, and the associated image cannot be found on the SD card, a new one is generated automatically, with the correct size. This takes some time, so wait until the activity LED stays unlit.&lt;br /&gt;
&lt;br /&gt;
There is a shell-script &amp;lt;code&amp;gt;utils/extract_as400_disk_data.sh&amp;lt;/code&amp;gt; in the original source tree on GitHub to generate more &#039;&#039;as400_disk_definitions.txt&#039;&#039; entries from real disks connected to a SCSI controller when ran under Linux.&lt;br /&gt;
&lt;br /&gt;
Caveats:&lt;br /&gt;
* Writes to the emulated disk are very slow compared to reads.&lt;br /&gt;
&lt;br /&gt;
Fully tested with Firmware v2026.08.27RC1, 9401-150, V4R4, V5R2.&lt;br /&gt;
&lt;br /&gt;
== Current state ==&lt;br /&gt;
We have to differ three hardware generations when considering Zulu vs. AS/400:&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&amp;amp;nbsp;&lt;br /&gt;
!CISC/IMPI, 520&amp;amp;thinsp;bytes/block disks&lt;br /&gt;
!RISC/SPD, 520/522&amp;amp;thinsp;bytes/block disks&lt;br /&gt;
!RISC/PCI, 522&amp;amp;thinsp;bytes/block disks&lt;br /&gt;
|-&lt;br /&gt;
!CD-ROM&lt;br /&gt;
|Not supported&lt;br /&gt;
|Untested&lt;br /&gt;
|Works&lt;br /&gt;
|-&lt;br /&gt;
!Tape&lt;br /&gt;
|Fails, hangs with SRC early.&lt;br /&gt;
|Untested&lt;br /&gt;
|Works&lt;br /&gt;
|-&lt;br /&gt;
!Disk&lt;br /&gt;
|Fails, hangs with SRC early.&lt;br /&gt;
|Untested&lt;br /&gt;
|Works&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
All successful tests so far have been based on a ZuluSCSI wide board on a 9401-150, while the CISC tests have been done with a ZuluSCSI Blaster on a 9401-P02.&lt;br /&gt;
&lt;br /&gt;
There are success reports of more 150&#039;s working, and one of a 9406-270 becoming stuck with A6000244, &#039;&#039;Contact was lost with device indicated&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Ordinary Harddisks on the AS/400]]&lt;br /&gt;
* [[Tape Drives on old AS/400]]&lt;br /&gt;
* [[SRC]], aka System Reference Code&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [https://zuluscsi.com ZuluSCSI Website] — see the &amp;lt;tt&amp;gt;☰&amp;lt;/tt&amp;gt; button top right for more details&lt;br /&gt;
* [https://github.com/ZuluSCSI/ZuluSCSI-firmware ZuluSCSI-firmware], GitHub&lt;br /&gt;
&lt;br /&gt;
== Footnotes ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Hardware Configuration Guide]]&lt;/div&gt;</summary>
		<author><name>PoC</name></author>
	</entry>
	<entry>
		<id>http://try-as400.pocnet.net/index.php?title=Panel_Usage&amp;diff=1834</id>
		<title>Panel Usage</title>
		<link rel="alternate" type="text/html" href="http://try-as400.pocnet.net/index.php?title=Panel_Usage&amp;diff=1834"/>
		<updated>2026-09-06T19:42:13Z</updated>

		<summary type="html">&lt;p&gt;PoC: /* Elements */ Amber LED&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Every AS/400 or later machines have a &#039;&#039;&#039;panel&#039;&#039;&#039;, either as hardware, or emulated in Software (for logical partitions, &#039;&#039;LPAR&#039;&#039;s).&lt;br /&gt;
&lt;br /&gt;
== Elements ==&lt;br /&gt;
The panel is comprised of these elements:&lt;br /&gt;
* Pushbutton ↑&lt;br /&gt;
* Pushbutton ↓&lt;br /&gt;
* Pushbutton &#039;&#039;Enter&#039;&#039; often colored blue,&lt;br /&gt;
* LC-Display, for output of System Reference Codes (SRC),&lt;br /&gt;
* Power pushbutton ⌽,&lt;br /&gt;
* LED (green) for showing the power state,&lt;br /&gt;
* LED (green), with a pictogram reminding of stairs (main processor activity),&amp;lt;ref&amp;gt;It is not the disk activity LED as it was usual with PCs was into the 2000s.&amp;lt;/ref&amp;gt;&lt;br /&gt;
* LED (amber) with a vertical bar, cut in half and one half moved slightly horizontal (error&amp;lt;ref&amp;gt;In other words: System activity is halted and will not try to recover until a reset is issued. Reset means power cycle.&amp;lt;/ref&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Usually after plugging the power, the LCD will light up green.&lt;br /&gt;
&lt;br /&gt;
== Changing settings ==&lt;br /&gt;
Normally, the LCD shows two chars and two digits, like&lt;br /&gt;
 01   B N&lt;br /&gt;
The meaning is:&lt;br /&gt;
* 01 - Show current IPL-Parameters&lt;br /&gt;
* B - (A B C D) IPL-Source&lt;br /&gt;
* N (N M) IPL-Mode&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Beware, the panel allows to set a multitude of parameters to the system service processor card. Please don&#039;t wildly push buttons to see what will happen. Chances are you will change a setting and the machine will no longer IPL, or console connection is broken, or probably worse things.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Setting IPL Mode to source D, and mode manual ===&lt;br /&gt;
This example setting is needed to make the machine IPL from install media, such as tape or optical.&lt;br /&gt;
&lt;br /&gt;
* Push ↑ once to set the digit display from 01 to 02. Confirm with &#039;&#039;Enter&#039;&#039;.&lt;br /&gt;
* Push ↑ oder ↓ until the character display is showing &amp;lt;code&amp;gt;D M&amp;lt;/code&amp;gt;.&amp;lt;ref&amp;gt;Older machines support concurrent setting of Source and Mode, newer support setting Source and Mode separately.&amp;lt;/ref&amp;gt; Confirm with &#039;&#039;Enter&#039;&#039;.&lt;br /&gt;
* Push the power button ⌽. You can now insert the I_BASE-CD into the optical drive.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[SRC 0000BBBB]]&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [https://www.ibm.com/docs/en/i/7.5.0?topic=functions-normal-control-panel Normal control panel functions], IBM.com&lt;br /&gt;
&lt;br /&gt;
== Footnotes ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Basic Knowledge]]&lt;/div&gt;</summary>
		<author><name>PoC</name></author>
	</entry>
	<entry>
		<id>http://try-as400.pocnet.net/index.php?title=Post-Install_Optimizations&amp;diff=1833</id>
		<title>Post-Install Optimizations</title>
		<link rel="alternate" type="text/html" href="http://try-as400.pocnet.net/index.php?title=Post-Install_Optimizations&amp;diff=1833"/>
		<updated>2026-09-03T16:23:04Z</updated>

		<summary type="html">&lt;p&gt;PoC: /* Security System Values */ Typo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;OS/400 provides a lot of default values for variables (affecting the run-time environment) and program options. Some of these make sense, some of them are kept consistent with earlier versions of the OS because of compatibility reasons by IBM.&lt;br /&gt;
&lt;br /&gt;
Some of these recommendations might not be appropriate for you by various reasons. Don&#039;t apply blindly. Know what you do, use the online help to retrieve background information on the topic in question.&lt;br /&gt;
&lt;br /&gt;
The findings below are based on V4R5 with annotated exceptions for newer releases.&lt;br /&gt;
&lt;br /&gt;
== Housekeeping ==&lt;br /&gt;
These are settings and scheduled jobs to keep your system uncluttered.&lt;br /&gt;
&lt;br /&gt;
=== Change unneeded programs to not run ===&lt;br /&gt;
We most likely don&#039;t need to run &#039;&#039;lpd&#039;&#039; and &#039;&#039;smtpd&#039;&#039; to run per default.&lt;br /&gt;
 CHGLPDA    AUTOSTART(*NO)&lt;br /&gt;
 CHGSMTPA   AUTOSTART(*NO)&lt;br /&gt;
&lt;br /&gt;
You can easily check all settings at once by using &amp;lt;code&amp;gt;UPDDTA QUSRSYS/QATOCSTART&amp;lt;/code&amp;gt;. These are not needed in general.&lt;br /&gt;
* *DIRSRV&lt;br /&gt;
* *NETSVR&lt;br /&gt;
* *SLP&lt;br /&gt;
&lt;br /&gt;
Depending on OS version, not all entries may be available.&lt;br /&gt;
&lt;br /&gt;
=== Change uninstalled programs to not run ===&lt;br /&gt;
If you did not install the Ultimedia package, you can remove the pre started job from the QSYSWRK subsystem description to make it not generate an error message at IPL time.&lt;br /&gt;
 RMVPJE SBSD(QSYSWRK) PGM(QUMEDIA/QUMBPJTC)&lt;br /&gt;
&lt;br /&gt;
If you did not install the Directory Services package (aka LDAP), you can remove the auto started jobs from the QSYSWRK subsystem description to make them not generate an error message at IPL time.&lt;br /&gt;
 RMVAJE SBSD(QSYSWRK) JOB(QGLDPUBA)&lt;br /&gt;
 RMVAJE SBSD(QSYSWRK) JOB(QGLDPUBE)&lt;br /&gt;
&lt;br /&gt;
Both is valid and tested for V4R5. Note that newer releases moved the background jobs to the base OS so there is no error message when starting them. I have not tested if they&#039;re required to run, though.&lt;br /&gt;
&lt;br /&gt;
If you did not install the performance tools, you don&#039;t need trying to start the performance data collector:&lt;br /&gt;
 RMVAJE SBSD(QCTL) JOB(QPFRCOL)&lt;br /&gt;
&lt;br /&gt;
I can&#039;t remember if the latter is valid for V4R5. It&#039;s valid for V3R2, though.&lt;br /&gt;
&lt;br /&gt;
=== Cleanup unneeded stuff ===&lt;br /&gt;
These objects come by default at OS install time, are not needed to my knowledge, and thus can be safely deleted:&lt;br /&gt;
 DLTOUTQ    OUTQ(QDKT)&lt;br /&gt;
 DLTOUTQ    OUTQ(QPFROUTQ)&lt;br /&gt;
 DLTOUTQ    OUTQ(QPRINTS)&lt;br /&gt;
 DLTF       FILE(QPRINTS)&lt;br /&gt;
 DLTOUTQ    OUTQ(QPRINT2)&lt;br /&gt;
 DLTF       FILE(QPRINT2)&lt;br /&gt;
 DLTOUTQ    OUTQ(QTPPPOUTQ)&lt;br /&gt;
 DLTDEVD    DEVD(QESPAP)&lt;br /&gt;
 DLTDEVD    DEVD(QIADSP)&lt;br /&gt;
 DLTDEVD    DEVD(QIAPRT)&lt;br /&gt;
 DLTDEVD    DEVD(QQAHOST)&lt;br /&gt;
 DLTDEVD    DEVD(QTIDA)&lt;br /&gt;
 DLTDEVD    DEVD(QTIDA2)&lt;br /&gt;
 DLTCTLD    CTLD(QESCTL)&lt;br /&gt;
 DLTCTLD    CTLD(QTICTL)&lt;br /&gt;
 DLTLIND    LIND(QESLINE)&lt;br /&gt;
 DLTLIND    LIND(QTILINE)&lt;br /&gt;
&lt;br /&gt;
== System Values ==&lt;br /&gt;
System values are like environment variables as known from common operating systems. They influence system operation. I recommend the following changes.&lt;br /&gt;
&lt;br /&gt;
=== System Control ===&lt;br /&gt;
* Change work environment to separate subsystems for different kind of jobs. This also makes it easy to introduce your own subsystems.&lt;br /&gt;
 CHGSYSVAL SYSVAL(QCTLSBSD) VALUE(&#039;QCTL QSYS&#039;)&lt;br /&gt;
* Set automatic DST adjustment, and UTC offset. This value is valid for Central Europe (Berlin, Paris, …) &#039;&#039;&#039;Note!&#039;&#039;&#039; This variable is not available in V4R5. See [[#Weblinks|Weblinks]] below.&lt;br /&gt;
 CHGSYSVAL SYSVAL(QTIMZON) VALUE(&#039;QP0100CET2&#039;)&lt;br /&gt;
* Adjust time to automatically end disconnected interactive jobs (sessions) to one day.&lt;br /&gt;
 CHGSYSVAL SYSVAL(QDSCJOBITV) VALUE(&#039;1440&#039;)&lt;br /&gt;
&lt;br /&gt;
=== (Memory) Allocation ===&lt;br /&gt;
* Adjust automatic performance values only at runtime, not at IPL.&amp;lt;ref&amp;gt;If you change the amount of memory for the machine, temporarily adjust the value to &#039;2&#039;, make the memory change and then change the value back to &#039;3&#039; — no further IPL needed.&amp;lt;/ref&amp;gt; This allows the system to automatically adjust memory allocations and activity levels to minimize paging (disk I/O).&lt;br /&gt;
 CHGSYSVAL SYSVAL(QPFRADJ) VALUE(&#039;3&#039;)&lt;br /&gt;
* Allow memory pools to self adjust the paging block size depending on jobs running. This is called &#039;&#039;Expert Cache&#039;&#039;. You can adjust the maximum active jobs per pool in the &amp;lt;code&amp;gt;WRKSHRPOOL&amp;lt;/code&amp;gt; display.&amp;lt;ref&amp;gt;Press &amp;lt;code&amp;gt;F21&amp;lt;/code&amp;gt; to switch to view 2 or 3 to have adjustment possibilities.&amp;lt;/ref&amp;gt;&lt;br /&gt;
 CHGSHRPOOL POOL(*BASE) PAGING(*CALC)&lt;br /&gt;
 CHGSHRPOOL POOL(*INTERACT) PAGING(*CALC)&lt;br /&gt;
 CHGSHRPOOL POOL(*SPOOL) PAGING(*CALC)&lt;br /&gt;
* Reservations for job related data structures at IPL time. See &amp;lt;code&amp;gt;DSPSYSSTS&amp;lt;/code&amp;gt; and set to slightly more than the &#039;&#039;Jobs in System&#039;&#039; value to be seen there when the system is working &amp;quot;normal&amp;quot;.&amp;lt;ref&amp;gt;Press &amp;lt;code&amp;gt;F21&amp;lt;/code&amp;gt; to switch to view 2 or 3 to see the overall job count.&amp;lt;/ref&amp;gt;&lt;br /&gt;
 CHGSYSVAL SYSVAL(QTOTJOB) VALUE(100)&lt;br /&gt;
* Reservations for job related data structures at IPL time. See &amp;lt;code&amp;gt;WRKACTJOB&amp;lt;/code&amp;gt; and set to slightly more than the &#039;&#039;Active Jobs&#039;&#039; value to be seen there when the system is working &amp;quot;normal&amp;quot;.&lt;br /&gt;
 CHGSYSVAL SYSVAL(QACTJOB) VALUE(95)&lt;br /&gt;
* Maximize TCP buffers for maximum performance, especially on faster links.&lt;br /&gt;
 CHGTCPA TCPRCVBUF(8388608) TCPSNDBUF(8388608)&lt;br /&gt;
* Make sure, database tasks can use system resources as needed.&lt;br /&gt;
 CHGSYSVAL SYSVAL(QQRYDEGREE) VALUE(*OPTIMIZE)&lt;br /&gt;
* When interactive jobs require more CPU time than being allowed by default (2 seconds),&amp;lt;ref&amp;gt;This is set in *CLS objects.&amp;lt;/ref&amp;gt; to finish a block of processing, allow that memory to be taken from the *BASE pool. Advantage: The QINTER subsystem pool will not be subject to auto adjustment because of jobs which are supposed to run in batch.&lt;br /&gt;
 CHGSYSVAL SYSVAL(QTSEPOOL) VALUE(*BASE)&lt;br /&gt;
&lt;br /&gt;
=== Message-and-Logging ===&lt;br /&gt;
* Allow immediate deletion of problem reports.&lt;br /&gt;
 CHGSYSVAL SYSVAL(QPRBHLDITV) VALUE(0)&lt;br /&gt;
* Do not log software errors. We can&#039;t do much about these anyway, seen from a hobbyist viewpoint.&lt;br /&gt;
 CHGSYSVAL SYSVAL(QSFWERRLOG) VALUE(*NOLOG)&lt;br /&gt;
* Maximize Central Syslog (viewable with &amp;lt;code&amp;gt;DSPLOG&amp;lt;/code&amp;gt; size to lessen rotation frequency. Depending on OS version only &#039;&#039;VALUE(32767)&#039;&#039; may be valid.&lt;br /&gt;
 CHGSYSVAL SYSVAL(QHSTLOGSIZ) VALUE(*DAILY)&lt;br /&gt;
* Raise allowed unsuccessful sign on tries before taking action.&lt;br /&gt;
 CHGSYSVAL SYSVAL(QMAXSIGN) VALUE(&#039;15&#039;)&lt;br /&gt;
* Minimize logging for sessions disconnected beause of device errors.&lt;br /&gt;
 CHGSYSVAL SYSVAL(QDEVRCYACN) VALUE(*ENDJOBNOLIST)&lt;br /&gt;
&lt;br /&gt;
=== Security System Values ===&lt;br /&gt;
* Unrestrict automatic creation of system objects triggered by external (network) requests.&lt;br /&gt;
 CHGSYSVAL SYSVAL(QAUTOVRT) VALUE(*NOMAX)&lt;br /&gt;
* Allow restore with all security relevant flags.&lt;br /&gt;
 CHGSYSVAL SYSVAL(QALWOBJRST) VALUE(*ALL)&lt;br /&gt;
* For TCP connections to work, we need encrypted passwords.&lt;br /&gt;
 CHGDDMTCPA PWDRQD(*ENCRYPTED)&lt;br /&gt;
* Allow &#039;&#039;QSYSOPR&#039;&#039; sign-on to all devices.&lt;br /&gt;
 CHGSYSVAL SYSVAL(QLMTSECOFR) VALUE(&#039;0&#039;)&lt;br /&gt;
* Raise maximum password length to maximum value.&amp;lt;ref&amp;gt;In newer OS versions, an additional variable &#039;&#039;QPWDLVL&#039;&#039; allows even longer passwords.&amp;lt;/ref&amp;gt;&lt;br /&gt;
 CHGSYSVAL SYSVAL(QPWDMAXLEN) VALUE(10)&lt;br /&gt;
* Raise minimum  passsword length for security reasons.&lt;br /&gt;
 CHGSYSVAL SYSVAL(QPWDMINLEN) VALUE(8)&lt;br /&gt;
&lt;br /&gt;
=== Misc ===&lt;br /&gt;
* PTF install shall be done on unattended IPL time, and don&#039;t try to report problems to IBM directly.&amp;lt;ref&amp;gt;Needs prior setup for &#039;&#039;Electronic Customer Support&#039;&#039;.&amp;lt;/ref&amp;gt;&lt;br /&gt;
 CHGSRVA PTFINSTYP(*DLYALL) RPTPRBAUTO(*NO)&lt;br /&gt;
* Provide European style formatting.&lt;br /&gt;
 CHGSYSVAL SYSVAL(QCURSYM) VALUE(&#039;€&#039;)&lt;br /&gt;
 CHGSYSVAL SYSVAL(QDECFMT) VALUE(&#039;J&#039;)&lt;br /&gt;
 CHGSYSVAL SYSVAL(QSRTSEQ) VALUE(*LANGIDUNQ)&amp;lt;ref&amp;gt;This value isn&#039;t available with V4R5. You can use &#039;&#039;*LANGIDSHR&#039;&#039; there.&amp;lt;/ref&amp;gt;&lt;br /&gt;
 CHGSYSVAL SYSVAL(QDATFMT) VALUE(&#039;DMY&#039;)&amp;lt;ref&amp;gt;Default value for 2924 (US English) is MDY.&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Allow background compiling in PDM as ordinary user, and submitting batch jobs in general.&lt;br /&gt;
 GRTOBJAUT OBJ(QGPL/QBATCH) OBJTYPE(*JOBD) USER(*PUBLIC) AUT(*USE)&lt;br /&gt;
* Tweaking automatic cleanup (like &#039;&#039;logrotate&#039;&#039;).&lt;br /&gt;
 CHGCLNUP  ALWCLNUP(*YES) STRTIME(&#039;02:22:22&#039;) USRMSG(7) SYSMSG(3) SYSPRT(7) SYSLOG(14) CALITM(*KEEP)&lt;br /&gt;
* Change general SNA networking attributes.  This is one &#039;&#039;&#039;long&#039;&#039;&#039; line. Take care to get it completely.&lt;br /&gt;
 CHGNETA JOBACN(*SEARCH) VRTAUTODEV(254) MDMCNTRYID(DE)&lt;br /&gt;
&lt;br /&gt;
=== Charset Conversion ===&lt;br /&gt;
In addition, OS/400 has a default value of 65535 for &amp;lt;code&amp;gt;QCCSID&amp;lt;/code&amp;gt;. It should be set to a value being dependent on the installed language, to enable automatic translation of data on disk to the display device, and back. For Germany, the correct value is 273, and for US, it&#039;s 37. A good hint is to check your 5250 emulator program for possible values.&lt;br /&gt;
&lt;br /&gt;
== IPL Customization ==&lt;br /&gt;
With this procedure, the current startup program for the OS can be retrieved for easy customization.&lt;br /&gt;
 RTVCLSRC   PGM(QSTRUP) SRCFILE(QCLSRC)&lt;br /&gt;
 WRKMBRPDM  FILE(QCLSRC) MBR(QSTRUP) MBRTYPE(CLP)&lt;br /&gt;
 CRTCLPGM   PGM(QGPL/QSTRUP)&lt;br /&gt;
&lt;br /&gt;
To activate your changes, run &amp;lt;code&amp;gt;WRKSYSVAL SYSVAL(QSTRUPPGM)&amp;lt;/code&amp;gt; and change the values to reflect the new program object in QGPL. &#039;&#039;&#039;Note&#039;&#039;&#039;: On a used system&#039;s install, the previous owner might have already done a customized QSTRUP. See &amp;lt;code&amp;gt;DSPSYSVAL QSTRUPPGM&amp;lt;/code&amp;gt; which one is the currently set startup program before accidentally overwriting!&lt;br /&gt;
&lt;br /&gt;
Notable use cases for changing &amp;lt;code&amp;gt;QSTRUP&amp;lt;/code&amp;gt; would be to make SNA Distribution Services, and TCP/IP (on older releases than V4R5) start at IPL time.&lt;br /&gt;
&lt;br /&gt;
New entries must be located after the &#039;&#039;IF COND&#039;&#039; statement and &#039;&#039;DONE:&#039;&#039; label. Always put a &#039;&#039;MONMSG MSGID(CPF0000)&#039;&#039; after each statement. Failing to do so will not ignore any errors but make the IPL script terminate abnormally in case of an error and possibly leave you with an inaccessible system.&lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
* Start TCP/IP:&lt;br /&gt;
 QSYS/STRTCP&lt;br /&gt;
 MONMSG MSGID(CPF0000)&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&#039;&#039;&#039;Note:&#039;&#039;&#039; TCP/IP on V4R5 and later is by IBM provided default automatically started with an appropriate autostart entry &amp;lt;code&amp;gt;struptcpip&amp;lt;/code&amp;gt; in the &amp;lt;code&amp;gt;qsyswrk&amp;lt;/code&amp;gt; subsystem description. No action is necessary in the startup CL!&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Start SNADS:&lt;br /&gt;
 QSYS/STRSBS SBSD(QSNADS)&lt;br /&gt;
 MONMSG MSGID(CPF0000)&lt;br /&gt;
&lt;br /&gt;
== Change Program Defaults ==&lt;br /&gt;
This establishes different default behavior of some programs which makes life somewhat easier.&amp;lt;ref&amp;gt;Some people highly oppose against changing default values because the default values have been provided for a reason. But then, the &amp;lt;code&amp;gt;CHGCMDDFT&amp;lt;/code&amp;gt; also has been provided for a reason.&amp;lt;/ref&amp;gt; At least noting down the changed programs and their former values is recommended, for example in &amp;lt;code&amp;gt;QGPL/QTXTSRC.CMDDFT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&#039;&#039;&#039;Note:&#039;&#039;&#039; CL applications might run a command with the changed default values, in turn combining (new) defaults and submitted parameters into an invalid combination of parameters which might lead to run-time errors. As far as I&#039;m aware, my proposed changes are compatible with such situations.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* File creation and change defaults:&lt;br /&gt;
** Enforce immediate return to program error handling instead of make programs seem to hang (&amp;lt;code&amp;gt;wait…&amp;lt;/code&amp;gt;),&lt;br /&gt;
** Enforce reusing deleted record space,&amp;lt;ref&amp;gt;If there is no access path defined, sequentially read records are no longer guaranteed to *be in timely order (FIFO)!&amp;lt;/ref&amp;gt;&lt;br /&gt;
** Remove sizing restrictions,&amp;lt;ref&amp;gt;A runaway process filling the disks to 100&amp;amp;thinsp;% is not stopped prior!&amp;lt;/ref&amp;gt;&lt;br /&gt;
** Use a smaller access path size for probably increased performance,&lt;br /&gt;
** Allow automatic LF rebuild when running &amp;lt;code&amp;gt;chgpf&amp;lt;/code&amp;gt;.&lt;br /&gt;
 CHGCMDDFT  CMD(CRTPF) NEWDFT(&#039;SIZE(*NOMAX *N *N) WAITFILE(*IMMED) WAITRCD(*IMMED) REUSEDLT(*YES)&#039;)&lt;br /&gt;
 CHGCMDDFT  CMD(CRTSRCPF) NEWDFT(&#039;SIZE(*NOMAX *N *N) ACCPTHSIZ(*MAX4GB)&#039;)&lt;br /&gt;
 CHGCMDDFT  CMD(CHGPF) NEWDFT(&#039;DLTDEPLF(*YES) SIZE(*NOMAX *N *N) WAITFILE(*IMMED) WAITRCD(*IMMED) REUSEDLT(*YES)&#039;)&lt;br /&gt;
 CHGCMDDFT  CMD(CRTLF) NEWDFT(&#039;WAITFILE(*IMMED) WAITRCD(*IMMED) ACCPTHSIZ(*MAX4GB)&#039;)&lt;br /&gt;
 CHGCMDDFT  CMD(CHGLF) NEWDFT(&#039;WAITFILE(*IMMED) WAITRCD(*IMMED) ACCPTHSIZ(*MAX4GB)&#039;)&lt;br /&gt;
* Menus usually go into the library with the application&#039;s other objects. Change current library to there, so applications can find their objects.&amp;lt;ref&amp;gt;It might be beneficial to individually use &amp;lt;code&amp;gt;CURLIB(*NOCHG)&amp;lt;/code&amp;gt; for higher level menu objects being put into libraries which are part of the default library search list (&#039;&#039;*LIBL&#039;&#039;) — such as &#039;&#039;QGPL&#039;&#039; — to not needlessly change the default library in a for some users unexpected way.&amp;lt;/ref&amp;gt;&lt;br /&gt;
 CHGCMDDFT  CMD(CRTMNU) NEWDFT(&#039;CURLIB(*MNULIB)&#039;)&lt;br /&gt;
* No unnecessary wait for power down. &amp;lt;code&amp;gt;CONFIRM(*NO)&amp;lt;/code&amp;gt; can be added for newer releases to suppress prompting.&lt;br /&gt;
 CHGCMDDFT  CMD(PWRDWNSYS) NEWDFT(&#039;OPTION(*IMMED) ENDSBSOPT(*NOJOBLOG)&#039;)&lt;br /&gt;
* Don&#039;t waste time displaying a not so very much interesting screen prior to connection.&lt;br /&gt;
 CHGCMDDFT CMD(STRPASTHR) NEWDFT(&#039;PASTHRSCN(*NO)&#039;)&lt;br /&gt;
&lt;br /&gt;
Be aware that reinstalls, or applying PTFs can overwrite command objects and thus their changed default values. Also note, hat installing a secondary language on a system also installs a separate set of &amp;lt;code&amp;gt;*cmd&amp;lt;/code&amp;gt; objects for that language. You may want to apply the defaults with qualified object names to these, too.&lt;br /&gt;
&lt;br /&gt;
== Regular Cleanup jobs ==&lt;br /&gt;
See job comment TEXT for details. These are &#039;&#039;&#039;long&#039;&#039;&#039; lines. Take care to get it completely.&lt;br /&gt;
 ADDJOBSCDE JOB(PRGPRB) CMD(DLTPRB STATUS(*CLOSED)) FRQ(*WEEKLY) SCDDATE(*NONE) SCDDAY(*ALL) SCDTIME(&#039;13:22:00&#039;) MSGQ(*LIBL/QSYSOPR) TEXT(&#039;Purge closed and deletable problem entries&#039;)&lt;br /&gt;
 ADDJOBSCDE JOB(RCLTMPSTG) CMD(RCLTMPSTG DAYS(30)) FRQ(*MONTHLY) SCDDATE(*MONTHSTR) SCDDAY(*NONE) SCDTIME(&#039;13:24:00&#039;) MSGQ(*LIBL/QSYSOPR) TEXT(&#039;Reclaim temporary storage&#039;)&lt;br /&gt;
 ADDJOBSCDE JOB(RTVDSKINF) CMD(RTVDSKINF) FRQ(*MONTHLY) SCDDATE(*MONTHSTR) SCDDAY(*NONE) SCDTIME(&#039;13:34:00&#039;) MSGQ(*LIBL/QSYSOPR) TEXT(&#039;Retrieve disk space stats&#039;)&lt;br /&gt;
 ADDJOBSCDE JOB(QPGMRCLR) CMD(CLRMSGQ MSGQ(QPGMR) CLEAR(*KEEPUNANS)) FRQ(*WEEKLY) SCDDATE(*NONE) SCDDAY(*ALL) SCDTIME(&#039;07:07:07&#039;) RCYACN(*NOSBM) MSGQ(*NONE) TEXT(&#039;Delete uninteresting messages&#039;)&lt;br /&gt;
&lt;br /&gt;
== PTF handling ==&lt;br /&gt;
To save space on disk and backup media, you may want to consider applying all PTFs permanently. You cannot remove them afterwards, but that largely doesn&#039;t really matter for older and hobbyist systems.&lt;br /&gt;
&lt;br /&gt;
From a console, first run an `ENDSYS (*IMMED)` to get the system into restricted, state. Then run&lt;br /&gt;
 APYPTF LICPGM(*ALL) SELECT(*ALL) APY(*PERM) DELAYED(*YES) IPLAPY(*YES)&lt;br /&gt;
&lt;br /&gt;
This will apply all PTFs permanently upon next normal IPL. Note you should IPL from the A-side to allow changes to the B side being made.&lt;br /&gt;
&lt;br /&gt;
A final IPL to the B side gets you the fully PTF&#039;d system.&lt;br /&gt;
&lt;br /&gt;
== Re-Enable InfoSeeker ==&lt;br /&gt;
Only necessary for newer V4R4 and newer. If the command isn&#039;t known, don&#039;t bother: Then your release is so new that it&#039;s gone entirely.&lt;br /&gt;
&lt;br /&gt;
See also: [[Reviving InfoSeeker]]&lt;br /&gt;
&lt;br /&gt;
 CRTDTAARA DTAARA(QUSRSYS/QBMGINFSKR) TYPE(*CHAR) LEN(8)&amp;lt;ref&amp;gt;Works in V4R5. The &amp;lt;code&amp;gt;STRINFSKR&amp;lt;/code&amp;gt; command is not included anymore in IBM i 7.1, and probably earlier releases.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Additional Steps tested with V7R2 ==&lt;br /&gt;
After trying to enter SST, one gets the message that the password has expired. But the password cannot be changed. Re-IPL &#039;&#039;&#039;in manual mode&#039;&#039;&#039;, do not IPL but enter DST, and change password as directed.&lt;br /&gt;
&lt;br /&gt;
* Choose &#039;&#039;5. Work with DST environment&#039;&#039; and &#039;&#039;3. Service tools user IDs&#039;&#039;.&lt;br /&gt;
** Disable the &amp;quot;backdoor&amp;quot; profile &#039;&#039;11111111&#039;&#039;,&lt;br /&gt;
** &#039;&#039;Change password&#039;&#039; for &#039;&#039;QSECOFR&#039;&#039;, &#039;&#039;Set password to expired&#039;&#039; to &#039;&#039;2=No&#039;&#039;.&lt;br /&gt;
* Press F12 and choose &#039;&#039;6. Service tools security data&#039;&#039;.&lt;br /&gt;
** Enter 0 into the field &#039;&#039;8. Password expiration interval in days&#039;&#039;, 8 into the &#039;&#039;Selection&#039;&#039; field, and press return.&lt;br /&gt;
** Enter a high number (like 12) into the field &#039;&#039;9. Maximum sign-on attempts allowed&#039;&#039;, 9 into the &#039;&#039;Selection&#039;&#039; field, and press return.&lt;br /&gt;
** Enter 0 into the field &#039;&#039;10. Duplicate password control&#039;&#039;, 10 into the &#039;&#039;Selection&#039;&#039; field, and press return.&lt;br /&gt;
&lt;br /&gt;
Now exit DST.&lt;br /&gt;
&lt;br /&gt;
You may choose to enter SST, enter 7 for &#039;&#039;Work with system security&#039;&#039;, and set &#039;&#039;Allow a service tools user ID with a default and expired password to change its own password&#039;&#039; to &#039;&#039;1=Yes&#039;&#039;. Since we changed password expiry to &#039;&#039;never&#039;&#039;, this step is entirely optional.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Change Command Defaults for File-Commands]]&lt;br /&gt;
* [[How to properly shut down your AS/400]]&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [https://archive.midrange.com/midrange-l/199912/msg01738.html STRINFSKR], Midrange Mailing-List&lt;br /&gt;
* [https://github.com/PoC-dev/as400-autodst as400-autodst], GitHub&lt;br /&gt;
&lt;br /&gt;
== Footnotes ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category: System Administration]]&lt;/div&gt;</summary>
		<author><name>PoC</name></author>
	</entry>
	<entry>
		<id>http://try-as400.pocnet.net/index.php?title=ZuluSCSI&amp;diff=1832</id>
		<title>ZuluSCSI</title>
		<link rel="alternate" type="text/html" href="http://try-as400.pocnet.net/index.php?title=ZuluSCSI&amp;diff=1832"/>
		<updated>2026-08-29T20:59:40Z</updated>

		<summary type="html">&lt;p&gt;PoC: /* Tape drive support */ Removed inert entry&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;ZuluSCSI&#039;&#039;&#039; by Rabbit Hole Computing is a comparatively new family of SCSI device emulators featuring an SD card based backing store. Distinct features to older, similar devices is support for Wide-SCSI, Ultra-Speed, and a fast CPU.&lt;br /&gt;
&lt;br /&gt;
ZuluSCSI also features an OpenSource firmware, so it can be extended comparatively easily.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
For most AS/400 machines, you actually want a ZuluSCSI wide, because it offers the best performance.&lt;br /&gt;
&lt;br /&gt;
The ZuluSCSI firmware can emulate multiple devices at once. There is no real need to add multiple Zulus to a given SCSI bus. One Zulu can easily saturate even the UltraWide SCSI bus of a 9401-150, and due to the SD card, delays are minimal. You can gain more performance with bigger machines, if they have multiple SCSI buses, though.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&#039;&#039;&#039;Note:&#039;&#039;&#039; Current state of affairs is that at least for writes, the SD card itself is a considerable brake shoe for writes, presumably because of so called &#039;Write Amplification&#039;&#039;. This is not meant to stay like this forever. Optimizations are possible and will be implemented eventually.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hardware overview ==&lt;br /&gt;
Depending on the exact model, boards themselves have three DIP switches and tiny push buttons:&lt;br /&gt;
* 1: switch to initator mode,&lt;br /&gt;
* 2: enable debug log,&lt;br /&gt;
* 3: enable SCSI termination.&lt;br /&gt;
&lt;br /&gt;
The push buttons call the functions:&lt;br /&gt;
* Bootloader, for firmware-recovery,&lt;br /&gt;
* Eject.&lt;br /&gt;
&lt;br /&gt;
Also, three LEDs are provided, for indication of&lt;br /&gt;
* 2.8&amp;amp;thinsp;V power OK,&lt;br /&gt;
* 3.3&amp;amp;thinsp;V power OK,&lt;br /&gt;
* SD-card activity.&lt;br /&gt;
&lt;br /&gt;
The device itself needs 5&amp;amp;thinsp;V power, and can be powered by:&lt;br /&gt;
* the USB port,&lt;br /&gt;
* the termpower line of the SCSI bus,&lt;br /&gt;
* molex style power connectors.&lt;br /&gt;
&lt;br /&gt;
Usually, the integrated USB port is configured as USB modem, for usage with a terminal emulator. You can use the Linux or macOS &#039;&#039;screen&#039;&#039; command for that. Depending on your operating system, you need to find out what device file is created when plugging the Zulu&#039;s USB port. On Linux, it&#039;s &amp;lt;tt&amp;gt;/dev/ttyACM&#039;&#039;n&#039;&#039;&amp;lt;/tt&amp;gt; — &#039;&#039;n&#039;&#039; being a digit, usually 0. On macOS, it&#039;s &amp;lt;tt&amp;gt;/dev/tty.usbmodem*&amp;lt;/tt&amp;gt;, with a row of digits appended on behalf of the &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The firmware presents a simple menu driven UI for some tasks.&lt;br /&gt;
&lt;br /&gt;
There is no need to shut down the device itself, it&#039;s safe to &amp;quot;pull the plug&amp;quot; when there is no activity. The Operating System running on the attached computer should be orderly shut down, though.&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
Configuration itself is usually automatic, according to the files and directories found on the SD card. The SD card has either a FAT32&amp;lt;ref&amp;gt;Limiting files to max. 4&amp;amp;thinsp;GiB in size&amp;lt;/ref&amp;gt; or exFAT file system, the firmware understands both. It&#039;s easier to use the SD card with a card reader on a newer computer to create configurations, and files. The SD card is hotplug capable, and upon reinsertation, the ZuluSCSI reinitializes itself according to the SD card&#039;s content.&lt;br /&gt;
&lt;br /&gt;
Three devices classes are of general interest in the AS/400 world:&lt;br /&gt;
* Disk (DASD),&lt;br /&gt;
* CD/DVD (Optical),&lt;br /&gt;
* Tape.&lt;br /&gt;
&lt;br /&gt;
=== Files ===&lt;br /&gt;
File names are composed as follows:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;TT&amp;gt;&amp;lt;ID&amp;gt;[any text].&amp;lt;ext&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
  ^^   ^&lt;br /&gt;
  |    +-------------- SCSI ID character (byte offset 2)&lt;br /&gt;
  +------------------- two-character type prefix (case-insensitive)&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;TT&#039;&#039;&#039;:&lt;br /&gt;
:{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!TT&lt;br /&gt;
!Device type&lt;br /&gt;
!Default block size&lt;br /&gt;
|-&lt;br /&gt;
|HD&lt;br /&gt;
|Hard disk (fixed)&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|512&amp;amp;thinsp;Bytes&lt;br /&gt;
|-&lt;br /&gt;
|CD&lt;br /&gt;
|CD-ROM (optical)&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|2048&amp;amp;thinsp;Bytes&lt;br /&gt;
|-&lt;br /&gt;
|TP&lt;br /&gt;
|Sequential (tape)&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|512&amp;amp;thinsp;Bytes&lt;br /&gt;
|}&lt;br /&gt;
* The &#039;&#039;&#039;ID&#039;&#039;&#039; is exactly one char, and must be given in hexadecimal. This matters only for IDs ≥ 10.&lt;br /&gt;
* &#039;&#039;&#039;any text&#039;&#039;&#039; is entirely optional.&lt;br /&gt;
* The &#039;&#039;&#039;file extension&#039;&#039;&#039; doesn&#039;t matter.&lt;br /&gt;
&lt;br /&gt;
=== Directories ===&lt;br /&gt;
For a device usually allowing dynamic addition and removal of media — CD-ROM-, and tape drives, you can create a directory instead of a file. The naming scheme follows the same structure as files, but &#039;&#039;[any text]&#039;&#039; must be omitted.&lt;br /&gt;
&lt;br /&gt;
Files within the directories can be freely named. The &#039;&#039;Eject&#039;&#039; button loads and inserts the next image in order. Individual images can be inserted through the menu via USB.&lt;br /&gt;
&lt;br /&gt;
=== Configuration file ===&lt;br /&gt;
In addition, a configuration file can be supplied to provide additional information to either all or one emulated device. Having a &#039;&#039;zuluscsi.ini&#039;&#039; is normally optional, but for enabling AS/400 quirks, it&#039;s mandatory.&lt;br /&gt;
&lt;br /&gt;
The configuration file must be named &#039;&#039;zuluscsi.ini&#039;&#039;, and is in a simple ini-style format. It has a global &amp;lt;tt&amp;gt;[SCSI]&amp;lt;/tt&amp;gt; section to apply settings to all devices, and &amp;lt;tt&amp;gt;[SCSI&#039;&#039;n&#039;&#039;]&amp;lt;/tt&amp;gt;, where &#039;&#039;n&#039;&#039; is the ID of the given SCSI devices.&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
These are in the scope of AS/400.&lt;br /&gt;
&lt;br /&gt;
=== Tape drive support ===&lt;br /&gt;
* create directory &amp;lt;code&amp;gt;TP0&amp;lt;/code&amp;gt;,&lt;br /&gt;
* populate with one or more 0&amp;amp;thinsp;byte files named &amp;lt;code&amp;gt;*.tap&amp;lt;/code&amp;gt; files, e. g. by using the Unix &amp;lt;code&amp;gt;touch&amp;lt;/code&amp;gt;,&lt;br /&gt;
* use the serial console to attach image(s) to the drive.&lt;br /&gt;
* &#039;&#039;zuluscsi.ini&#039;&#039;:&lt;br /&gt;
 [SCSI0]&lt;br /&gt;
 Device = &amp;quot;AS400_PPC&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Caveats:&lt;br /&gt;
* When you choose an image file through the USB port&#039;s media menu, make sure that you not only choose an image file, but afterwards &#039;&#039;insert&#039;&#039; it!&lt;br /&gt;
* If you replace a hardware tape drive, make sure to delete your old tape device file first, then IPL, check/set the new device name in DST, and have auto-configuration create the new device file during the following IPL.&lt;br /&gt;
* The amended (with an explicit &#039;&#039;Device&#039;&#039; statement) tape code as of v2026.08.28 has not yet undergone extensive testing.&lt;br /&gt;
&lt;br /&gt;
=== CD drive support ===&lt;br /&gt;
* create directory &amp;lt;code&amp;gt;CD0&amp;lt;/code&amp;gt;,&lt;br /&gt;
* populate with one or more readymade ISO images,&lt;br /&gt;
* use the serial console to attach image(s) to the drive.&lt;br /&gt;
&lt;br /&gt;
No special handling for the ID in &#039;&#039;zuluscsi.ini&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Caveats:&lt;br /&gt;
* When you choose an image file through the USB port&#039;s media menu, make sure that you not only choose an image file, but afterwards &#039;&#039;insert&#039;&#039; it!&lt;br /&gt;
* If you replace a hardware CD drive, make sure to delete your old CD device file first, then IPL, check/set the new device name in DST, and have auto-configuration create the new device file during the following IPL.&lt;br /&gt;
&lt;br /&gt;
Tested with Firmware 2026-08-07, 9401-150, V4R4, V5R2: IPL only so far, but that works.&lt;br /&gt;
&lt;br /&gt;
=== Disk drive support ===&lt;br /&gt;
The officially released code base is able to present multiple disk drives to the system, initialize, and install SLIC + base OS/400 + LPPs + PTFs.&lt;br /&gt;
&lt;br /&gt;
* Copy &#039;&#039;as400_disk_definitions.txt&#039;&#039; from the official GitHub repository to the SD card.&lt;br /&gt;
** Because of serial numbers currently being hard coded, only one disk per type should be used for now!&lt;br /&gt;
* &#039;&#039;zuluscsi.ini&#039;&#039;:&lt;br /&gt;
 [SCSI]&lt;br /&gt;
 System = AS400_PPC&lt;br /&gt;
 &lt;br /&gt;
 [SCSI6]&lt;br /&gt;
 AS400_DiskProfile = &amp;quot;09L4044&amp;quot;&lt;br /&gt;
 PrefetchBytes = 0&lt;br /&gt;
&lt;br /&gt;
When a &#039;&#039;AS400_DiskProfile&#039;&#039; is configured for a given SCSI ID, and the associated image cannot be found on the SD card, a new one is generated automatically, with the correct size. This takes some time, so wait until the activity LED stays unlit.&lt;br /&gt;
&lt;br /&gt;
There is a shell-script &amp;lt;code&amp;gt;utils/extract_as400_disk_data.sh&amp;lt;/code&amp;gt; in the original source tree on GitHub to generate more &#039;&#039;as400_disk_definitions.txt&#039;&#039; entries from real disks connected to a SCSI controller when ran under Linux.&lt;br /&gt;
&lt;br /&gt;
Caveats:&lt;br /&gt;
* Writes to the emulated disk are very slow compared to reads.&lt;br /&gt;
&lt;br /&gt;
Fully tested with Firmware v2026.08.27RC1, 9401-150, V4R4, V5R2.&lt;br /&gt;
&lt;br /&gt;
== Current state ==&lt;br /&gt;
We have to differ three hardware generations when considering Zulu vs. AS/400:&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&amp;amp;nbsp;&lt;br /&gt;
!CISC/IMPI, 520&amp;amp;thinsp;bytes/block disks&lt;br /&gt;
!RISC/SPD, 520/522&amp;amp;thinsp;bytes/block disks&lt;br /&gt;
!RISC/PCI, 522&amp;amp;thinsp;bytes/block disks&lt;br /&gt;
|-&lt;br /&gt;
!CD-ROM&lt;br /&gt;
|Not supported&lt;br /&gt;
|Untested&lt;br /&gt;
|Works&lt;br /&gt;
|-&lt;br /&gt;
!Tape&lt;br /&gt;
|Fails, hangs with SRC early.&lt;br /&gt;
|Untested&lt;br /&gt;
|Works&lt;br /&gt;
|-&lt;br /&gt;
!Disk&lt;br /&gt;
|Fails, hangs with SRC early.&lt;br /&gt;
|Untested&lt;br /&gt;
|Works&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
All successful tests so far have been based on a ZuluSCSI wide board on a 9401-150, while the CISC tests have been done with a ZuluSCSI Blaster on a 9401-P02.&lt;br /&gt;
&lt;br /&gt;
There are success reports of more 150&#039;s working, and one of a 9406-270 becoming stuck with A6000244, &#039;&#039;Contact was lost with device indicated&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Ordinary Harddisks on the AS/400]]&lt;br /&gt;
* [[Tape Drives on old AS/400]]&lt;br /&gt;
* [[SRC]], aka System Reference Code&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [https://zuluscsi.com ZuluSCSI Website] — see the &amp;lt;tt&amp;gt;☰&amp;lt;/tt&amp;gt; button top right for more details&lt;br /&gt;
* [https://github.com/ZuluSCSI/ZuluSCSI-firmware ZuluSCSI-firmware], GitHub&lt;br /&gt;
&lt;br /&gt;
== Footnotes ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Hardware Configuration Guide]]&lt;/div&gt;</summary>
		<author><name>PoC</name></author>
	</entry>
	<entry>
		<id>http://try-as400.pocnet.net/index.php?title=ZuluSCSI&amp;diff=1831</id>
		<title>ZuluSCSI</title>
		<link rel="alternate" type="text/html" href="http://try-as400.pocnet.net/index.php?title=ZuluSCSI&amp;diff=1831"/>
		<updated>2026-08-29T20:58:27Z</updated>

		<summary type="html">&lt;p&gt;PoC: /* Tape drive support */ Typo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;ZuluSCSI&#039;&#039;&#039; by Rabbit Hole Computing is a comparatively new family of SCSI device emulators featuring an SD card based backing store. Distinct features to older, similar devices is support for Wide-SCSI, Ultra-Speed, and a fast CPU.&lt;br /&gt;
&lt;br /&gt;
ZuluSCSI also features an OpenSource firmware, so it can be extended comparatively easily.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
For most AS/400 machines, you actually want a ZuluSCSI wide, because it offers the best performance.&lt;br /&gt;
&lt;br /&gt;
The ZuluSCSI firmware can emulate multiple devices at once. There is no real need to add multiple Zulus to a given SCSI bus. One Zulu can easily saturate even the UltraWide SCSI bus of a 9401-150, and due to the SD card, delays are minimal. You can gain more performance with bigger machines, if they have multiple SCSI buses, though.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&#039;&#039;&#039;Note:&#039;&#039;&#039; Current state of affairs is that at least for writes, the SD card itself is a considerable brake shoe for writes, presumably because of so called &#039;Write Amplification&#039;&#039;. This is not meant to stay like this forever. Optimizations are possible and will be implemented eventually.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hardware overview ==&lt;br /&gt;
Depending on the exact model, boards themselves have three DIP switches and tiny push buttons:&lt;br /&gt;
* 1: switch to initator mode,&lt;br /&gt;
* 2: enable debug log,&lt;br /&gt;
* 3: enable SCSI termination.&lt;br /&gt;
&lt;br /&gt;
The push buttons call the functions:&lt;br /&gt;
* Bootloader, for firmware-recovery,&lt;br /&gt;
* Eject.&lt;br /&gt;
&lt;br /&gt;
Also, three LEDs are provided, for indication of&lt;br /&gt;
* 2.8&amp;amp;thinsp;V power OK,&lt;br /&gt;
* 3.3&amp;amp;thinsp;V power OK,&lt;br /&gt;
* SD-card activity.&lt;br /&gt;
&lt;br /&gt;
The device itself needs 5&amp;amp;thinsp;V power, and can be powered by:&lt;br /&gt;
* the USB port,&lt;br /&gt;
* the termpower line of the SCSI bus,&lt;br /&gt;
* molex style power connectors.&lt;br /&gt;
&lt;br /&gt;
Usually, the integrated USB port is configured as USB modem, for usage with a terminal emulator. You can use the Linux or macOS &#039;&#039;screen&#039;&#039; command for that. Depending on your operating system, you need to find out what device file is created when plugging the Zulu&#039;s USB port. On Linux, it&#039;s &amp;lt;tt&amp;gt;/dev/ttyACM&#039;&#039;n&#039;&#039;&amp;lt;/tt&amp;gt; — &#039;&#039;n&#039;&#039; being a digit, usually 0. On macOS, it&#039;s &amp;lt;tt&amp;gt;/dev/tty.usbmodem*&amp;lt;/tt&amp;gt;, with a row of digits appended on behalf of the &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The firmware presents a simple menu driven UI for some tasks.&lt;br /&gt;
&lt;br /&gt;
There is no need to shut down the device itself, it&#039;s safe to &amp;quot;pull the plug&amp;quot; when there is no activity. The Operating System running on the attached computer should be orderly shut down, though.&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
Configuration itself is usually automatic, according to the files and directories found on the SD card. The SD card has either a FAT32&amp;lt;ref&amp;gt;Limiting files to max. 4&amp;amp;thinsp;GiB in size&amp;lt;/ref&amp;gt; or exFAT file system, the firmware understands both. It&#039;s easier to use the SD card with a card reader on a newer computer to create configurations, and files. The SD card is hotplug capable, and upon reinsertation, the ZuluSCSI reinitializes itself according to the SD card&#039;s content.&lt;br /&gt;
&lt;br /&gt;
Three devices classes are of general interest in the AS/400 world:&lt;br /&gt;
* Disk (DASD),&lt;br /&gt;
* CD/DVD (Optical),&lt;br /&gt;
* Tape.&lt;br /&gt;
&lt;br /&gt;
=== Files ===&lt;br /&gt;
File names are composed as follows:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;TT&amp;gt;&amp;lt;ID&amp;gt;[any text].&amp;lt;ext&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
  ^^   ^&lt;br /&gt;
  |    +-------------- SCSI ID character (byte offset 2)&lt;br /&gt;
  +------------------- two-character type prefix (case-insensitive)&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;TT&#039;&#039;&#039;:&lt;br /&gt;
:{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!TT&lt;br /&gt;
!Device type&lt;br /&gt;
!Default block size&lt;br /&gt;
|-&lt;br /&gt;
|HD&lt;br /&gt;
|Hard disk (fixed)&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|512&amp;amp;thinsp;Bytes&lt;br /&gt;
|-&lt;br /&gt;
|CD&lt;br /&gt;
|CD-ROM (optical)&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|2048&amp;amp;thinsp;Bytes&lt;br /&gt;
|-&lt;br /&gt;
|TP&lt;br /&gt;
|Sequential (tape)&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|512&amp;amp;thinsp;Bytes&lt;br /&gt;
|}&lt;br /&gt;
* The &#039;&#039;&#039;ID&#039;&#039;&#039; is exactly one char, and must be given in hexadecimal. This matters only for IDs ≥ 10.&lt;br /&gt;
* &#039;&#039;&#039;any text&#039;&#039;&#039; is entirely optional.&lt;br /&gt;
* The &#039;&#039;&#039;file extension&#039;&#039;&#039; doesn&#039;t matter.&lt;br /&gt;
&lt;br /&gt;
=== Directories ===&lt;br /&gt;
For a device usually allowing dynamic addition and removal of media — CD-ROM-, and tape drives, you can create a directory instead of a file. The naming scheme follows the same structure as files, but &#039;&#039;[any text]&#039;&#039; must be omitted.&lt;br /&gt;
&lt;br /&gt;
Files within the directories can be freely named. The &#039;&#039;Eject&#039;&#039; button loads and inserts the next image in order. Individual images can be inserted through the menu via USB.&lt;br /&gt;
&lt;br /&gt;
=== Configuration file ===&lt;br /&gt;
In addition, a configuration file can be supplied to provide additional information to either all or one emulated device. Having a &#039;&#039;zuluscsi.ini&#039;&#039; is normally optional, but for enabling AS/400 quirks, it&#039;s mandatory.&lt;br /&gt;
&lt;br /&gt;
The configuration file must be named &#039;&#039;zuluscsi.ini&#039;&#039;, and is in a simple ini-style format. It has a global &amp;lt;tt&amp;gt;[SCSI]&amp;lt;/tt&amp;gt; section to apply settings to all devices, and &amp;lt;tt&amp;gt;[SCSI&#039;&#039;n&#039;&#039;]&amp;lt;/tt&amp;gt;, where &#039;&#039;n&#039;&#039; is the ID of the given SCSI devices.&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
These are in the scope of AS/400.&lt;br /&gt;
&lt;br /&gt;
=== Tape drive support ===&lt;br /&gt;
* create directory &amp;lt;code&amp;gt;TP0&amp;lt;/code&amp;gt;,&lt;br /&gt;
* populate with one or more 0&amp;amp;thinsp;byte files named &amp;lt;code&amp;gt;*.tap&amp;lt;/code&amp;gt; files, e. g. by using the Unix &amp;lt;code&amp;gt;touch&amp;lt;/code&amp;gt;,&lt;br /&gt;
* use the serial console to attach image(s) to the drive.&lt;br /&gt;
* &#039;&#039;zuluscsi.ini&#039;&#039;:&lt;br /&gt;
 [SCSI]&lt;br /&gt;
 System = &amp;quot;AS400_PPC&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 [SCSI0]&lt;br /&gt;
 Device = &amp;quot;AS400_PPC&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Caveats:&lt;br /&gt;
* When you choose an image file through the USB port&#039;s media menu, make sure that you not only choose an image file, but afterwards &#039;&#039;insert&#039;&#039; it!&lt;br /&gt;
* If you replace a hardware tape drive, make sure to delete your old tape device file first, then IPL, check/set the new device name in DST, and have auto-configuration create the new device file during the following IPL.&lt;br /&gt;
* The amended (with an explicit &#039;&#039;Device&#039;&#039; statement) tape code as of v2026.08.28 has not yet undergone extensive testing.&lt;br /&gt;
&lt;br /&gt;
=== CD drive support ===&lt;br /&gt;
* create directory &amp;lt;code&amp;gt;CD0&amp;lt;/code&amp;gt;,&lt;br /&gt;
* populate with one or more readymade ISO images,&lt;br /&gt;
* use the serial console to attach image(s) to the drive.&lt;br /&gt;
&lt;br /&gt;
No special handling for the ID in &#039;&#039;zuluscsi.ini&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Caveats:&lt;br /&gt;
* When you choose an image file through the USB port&#039;s media menu, make sure that you not only choose an image file, but afterwards &#039;&#039;insert&#039;&#039; it!&lt;br /&gt;
* If you replace a hardware CD drive, make sure to delete your old CD device file first, then IPL, check/set the new device name in DST, and have auto-configuration create the new device file during the following IPL.&lt;br /&gt;
&lt;br /&gt;
Tested with Firmware 2026-08-07, 9401-150, V4R4, V5R2: IPL only so far, but that works.&lt;br /&gt;
&lt;br /&gt;
=== Disk drive support ===&lt;br /&gt;
The officially released code base is able to present multiple disk drives to the system, initialize, and install SLIC + base OS/400 + LPPs + PTFs.&lt;br /&gt;
&lt;br /&gt;
* Copy &#039;&#039;as400_disk_definitions.txt&#039;&#039; from the official GitHub repository to the SD card.&lt;br /&gt;
** Because of serial numbers currently being hard coded, only one disk per type should be used for now!&lt;br /&gt;
* &#039;&#039;zuluscsi.ini&#039;&#039;:&lt;br /&gt;
 [SCSI]&lt;br /&gt;
 System = AS400_PPC&lt;br /&gt;
 &lt;br /&gt;
 [SCSI6]&lt;br /&gt;
 AS400_DiskProfile = &amp;quot;09L4044&amp;quot;&lt;br /&gt;
 PrefetchBytes = 0&lt;br /&gt;
&lt;br /&gt;
When a &#039;&#039;AS400_DiskProfile&#039;&#039; is configured for a given SCSI ID, and the associated image cannot be found on the SD card, a new one is generated automatically, with the correct size. This takes some time, so wait until the activity LED stays unlit.&lt;br /&gt;
&lt;br /&gt;
There is a shell-script &amp;lt;code&amp;gt;utils/extract_as400_disk_data.sh&amp;lt;/code&amp;gt; in the original source tree on GitHub to generate more &#039;&#039;as400_disk_definitions.txt&#039;&#039; entries from real disks connected to a SCSI controller when ran under Linux.&lt;br /&gt;
&lt;br /&gt;
Caveats:&lt;br /&gt;
* Writes to the emulated disk are very slow compared to reads.&lt;br /&gt;
&lt;br /&gt;
Fully tested with Firmware v2026.08.27RC1, 9401-150, V4R4, V5R2.&lt;br /&gt;
&lt;br /&gt;
== Current state ==&lt;br /&gt;
We have to differ three hardware generations when considering Zulu vs. AS/400:&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&amp;amp;nbsp;&lt;br /&gt;
!CISC/IMPI, 520&amp;amp;thinsp;bytes/block disks&lt;br /&gt;
!RISC/SPD, 520/522&amp;amp;thinsp;bytes/block disks&lt;br /&gt;
!RISC/PCI, 522&amp;amp;thinsp;bytes/block disks&lt;br /&gt;
|-&lt;br /&gt;
!CD-ROM&lt;br /&gt;
|Not supported&lt;br /&gt;
|Untested&lt;br /&gt;
|Works&lt;br /&gt;
|-&lt;br /&gt;
!Tape&lt;br /&gt;
|Fails, hangs with SRC early.&lt;br /&gt;
|Untested&lt;br /&gt;
|Works&lt;br /&gt;
|-&lt;br /&gt;
!Disk&lt;br /&gt;
|Fails, hangs with SRC early.&lt;br /&gt;
|Untested&lt;br /&gt;
|Works&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
All successful tests so far have been based on a ZuluSCSI wide board on a 9401-150, while the CISC tests have been done with a ZuluSCSI Blaster on a 9401-P02.&lt;br /&gt;
&lt;br /&gt;
There are success reports of more 150&#039;s working, and one of a 9406-270 becoming stuck with A6000244, &#039;&#039;Contact was lost with device indicated&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Ordinary Harddisks on the AS/400]]&lt;br /&gt;
* [[Tape Drives on old AS/400]]&lt;br /&gt;
* [[SRC]], aka System Reference Code&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [https://zuluscsi.com ZuluSCSI Website] — see the &amp;lt;tt&amp;gt;☰&amp;lt;/tt&amp;gt; button top right for more details&lt;br /&gt;
* [https://github.com/ZuluSCSI/ZuluSCSI-firmware ZuluSCSI-firmware], GitHub&lt;br /&gt;
&lt;br /&gt;
== Footnotes ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Hardware Configuration Guide]]&lt;/div&gt;</summary>
		<author><name>PoC</name></author>
	</entry>
	<entry>
		<id>http://try-as400.pocnet.net/index.php?title=ZuluSCSI&amp;diff=1830</id>
		<title>ZuluSCSI</title>
		<link rel="alternate" type="text/html" href="http://try-as400.pocnet.net/index.php?title=ZuluSCSI&amp;diff=1830"/>
		<updated>2026-08-29T20:51:58Z</updated>

		<summary type="html">&lt;p&gt;PoC: /* Disk drive support */ Typo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;ZuluSCSI&#039;&#039;&#039; by Rabbit Hole Computing is a comparatively new family of SCSI device emulators featuring an SD card based backing store. Distinct features to older, similar devices is support for Wide-SCSI, Ultra-Speed, and a fast CPU.&lt;br /&gt;
&lt;br /&gt;
ZuluSCSI also features an OpenSource firmware, so it can be extended comparatively easily.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
For most AS/400 machines, you actually want a ZuluSCSI wide, because it offers the best performance.&lt;br /&gt;
&lt;br /&gt;
The ZuluSCSI firmware can emulate multiple devices at once. There is no real need to add multiple Zulus to a given SCSI bus. One Zulu can easily saturate even the UltraWide SCSI bus of a 9401-150, and due to the SD card, delays are minimal. You can gain more performance with bigger machines, if they have multiple SCSI buses, though.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&#039;&#039;&#039;Note:&#039;&#039;&#039; Current state of affairs is that at least for writes, the SD card itself is a considerable brake shoe for writes, presumably because of so called &#039;Write Amplification&#039;&#039;. This is not meant to stay like this forever. Optimizations are possible and will be implemented eventually.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hardware overview ==&lt;br /&gt;
Depending on the exact model, boards themselves have three DIP switches and tiny push buttons:&lt;br /&gt;
* 1: switch to initator mode,&lt;br /&gt;
* 2: enable debug log,&lt;br /&gt;
* 3: enable SCSI termination.&lt;br /&gt;
&lt;br /&gt;
The push buttons call the functions:&lt;br /&gt;
* Bootloader, for firmware-recovery,&lt;br /&gt;
* Eject.&lt;br /&gt;
&lt;br /&gt;
Also, three LEDs are provided, for indication of&lt;br /&gt;
* 2.8&amp;amp;thinsp;V power OK,&lt;br /&gt;
* 3.3&amp;amp;thinsp;V power OK,&lt;br /&gt;
* SD-card activity.&lt;br /&gt;
&lt;br /&gt;
The device itself needs 5&amp;amp;thinsp;V power, and can be powered by:&lt;br /&gt;
* the USB port,&lt;br /&gt;
* the termpower line of the SCSI bus,&lt;br /&gt;
* molex style power connectors.&lt;br /&gt;
&lt;br /&gt;
Usually, the integrated USB port is configured as USB modem, for usage with a terminal emulator. You can use the Linux or macOS &#039;&#039;screen&#039;&#039; command for that. Depending on your operating system, you need to find out what device file is created when plugging the Zulu&#039;s USB port. On Linux, it&#039;s &amp;lt;tt&amp;gt;/dev/ttyACM&#039;&#039;n&#039;&#039;&amp;lt;/tt&amp;gt; — &#039;&#039;n&#039;&#039; being a digit, usually 0. On macOS, it&#039;s &amp;lt;tt&amp;gt;/dev/tty.usbmodem*&amp;lt;/tt&amp;gt;, with a row of digits appended on behalf of the &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The firmware presents a simple menu driven UI for some tasks.&lt;br /&gt;
&lt;br /&gt;
There is no need to shut down the device itself, it&#039;s safe to &amp;quot;pull the plug&amp;quot; when there is no activity. The Operating System running on the attached computer should be orderly shut down, though.&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
Configuration itself is usually automatic, according to the files and directories found on the SD card. The SD card has either a FAT32&amp;lt;ref&amp;gt;Limiting files to max. 4&amp;amp;thinsp;GiB in size&amp;lt;/ref&amp;gt; or exFAT file system, the firmware understands both. It&#039;s easier to use the SD card with a card reader on a newer computer to create configurations, and files. The SD card is hotplug capable, and upon reinsertation, the ZuluSCSI reinitializes itself according to the SD card&#039;s content.&lt;br /&gt;
&lt;br /&gt;
Three devices classes are of general interest in the AS/400 world:&lt;br /&gt;
* Disk (DASD),&lt;br /&gt;
* CD/DVD (Optical),&lt;br /&gt;
* Tape.&lt;br /&gt;
&lt;br /&gt;
=== Files ===&lt;br /&gt;
File names are composed as follows:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;TT&amp;gt;&amp;lt;ID&amp;gt;[any text].&amp;lt;ext&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
  ^^   ^&lt;br /&gt;
  |    +-------------- SCSI ID character (byte offset 2)&lt;br /&gt;
  +------------------- two-character type prefix (case-insensitive)&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;TT&#039;&#039;&#039;:&lt;br /&gt;
:{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!TT&lt;br /&gt;
!Device type&lt;br /&gt;
!Default block size&lt;br /&gt;
|-&lt;br /&gt;
|HD&lt;br /&gt;
|Hard disk (fixed)&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|512&amp;amp;thinsp;Bytes&lt;br /&gt;
|-&lt;br /&gt;
|CD&lt;br /&gt;
|CD-ROM (optical)&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|2048&amp;amp;thinsp;Bytes&lt;br /&gt;
|-&lt;br /&gt;
|TP&lt;br /&gt;
|Sequential (tape)&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|512&amp;amp;thinsp;Bytes&lt;br /&gt;
|}&lt;br /&gt;
* The &#039;&#039;&#039;ID&#039;&#039;&#039; is exactly one char, and must be given in hexadecimal. This matters only for IDs ≥ 10.&lt;br /&gt;
* &#039;&#039;&#039;any text&#039;&#039;&#039; is entirely optional.&lt;br /&gt;
* The &#039;&#039;&#039;file extension&#039;&#039;&#039; doesn&#039;t matter.&lt;br /&gt;
&lt;br /&gt;
=== Directories ===&lt;br /&gt;
For a device usually allowing dynamic addition and removal of media — CD-ROM-, and tape drives, you can create a directory instead of a file. The naming scheme follows the same structure as files, but &#039;&#039;[any text]&#039;&#039; must be omitted.&lt;br /&gt;
&lt;br /&gt;
Files within the directories can be freely named. The &#039;&#039;Eject&#039;&#039; button loads and inserts the next image in order. Individual images can be inserted through the menu via USB.&lt;br /&gt;
&lt;br /&gt;
=== Configuration file ===&lt;br /&gt;
In addition, a configuration file can be supplied to provide additional information to either all or one emulated device. Having a &#039;&#039;zuluscsi.ini&#039;&#039; is normally optional, but for enabling AS/400 quirks, it&#039;s mandatory.&lt;br /&gt;
&lt;br /&gt;
The configuration file must be named &#039;&#039;zuluscsi.ini&#039;&#039;, and is in a simple ini-style format. It has a global &amp;lt;tt&amp;gt;[SCSI]&amp;lt;/tt&amp;gt; section to apply settings to all devices, and &amp;lt;tt&amp;gt;[SCSI&#039;&#039;n&#039;&#039;]&amp;lt;/tt&amp;gt;, where &#039;&#039;n&#039;&#039; is the ID of the given SCSI devices.&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
These are in the scope of AS/400.&lt;br /&gt;
&lt;br /&gt;
=== Tape drive support ===&lt;br /&gt;
* create directory &amp;lt;code&amp;gt;TP0&amp;lt;/code&amp;gt;,&lt;br /&gt;
* populate with one or more 0&amp;amp;thinsp;byte files named &amp;lt;code&amp;gt;*.tap&amp;lt;/code&amp;gt; files, e. g. by using the Unix &amp;lt;code&amp;gt;touch&amp;lt;/code&amp;gt;,&lt;br /&gt;
* use the serial console to attach image(s) to the drive.&lt;br /&gt;
* &#039;&#039;zuluscsi.ini&#039;&#039;:&lt;br /&gt;
 [SCSI]&lt;br /&gt;
 System=&amp;quot;AS400_PPC&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 [SCSI0]&lt;br /&gt;
 Device = &amp;quot;AS400_PPC&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Caveats:&lt;br /&gt;
* When you choose an image file through the USB port&#039;s media menu, make sure that you not only choose an image file, but afterwards &#039;&#039;insert&#039;&#039; it!&lt;br /&gt;
* If you replace a hardware tape drive, make sure to delete your old tape device file first, then IPL, check/set the new device name in DST, and have auto-configuration create the new device file during the following IPL.&lt;br /&gt;
* The amended (with an explicit &#039;&#039;Device&#039;&#039; statement) tape code as of v2026.08.28 has not yet undergone extensive testing.&lt;br /&gt;
&lt;br /&gt;
=== CD drive support ===&lt;br /&gt;
* create directory &amp;lt;code&amp;gt;CD0&amp;lt;/code&amp;gt;,&lt;br /&gt;
* populate with one or more readymade ISO images,&lt;br /&gt;
* use the serial console to attach image(s) to the drive.&lt;br /&gt;
&lt;br /&gt;
No special handling for the ID in &#039;&#039;zuluscsi.ini&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Caveats:&lt;br /&gt;
* When you choose an image file through the USB port&#039;s media menu, make sure that you not only choose an image file, but afterwards &#039;&#039;insert&#039;&#039; it!&lt;br /&gt;
* If you replace a hardware CD drive, make sure to delete your old CD device file first, then IPL, check/set the new device name in DST, and have auto-configuration create the new device file during the following IPL.&lt;br /&gt;
&lt;br /&gt;
Tested with Firmware 2026-08-07, 9401-150, V4R4, V5R2: IPL only so far, but that works.&lt;br /&gt;
&lt;br /&gt;
=== Disk drive support ===&lt;br /&gt;
The officially released code base is able to present multiple disk drives to the system, initialize, and install SLIC + base OS/400 + LPPs + PTFs.&lt;br /&gt;
&lt;br /&gt;
* Copy &#039;&#039;as400_disk_definitions.txt&#039;&#039; from the official GitHub repository to the SD card.&lt;br /&gt;
** Because of serial numbers currently being hard coded, only one disk per type should be used for now!&lt;br /&gt;
* &#039;&#039;zuluscsi.ini&#039;&#039;:&lt;br /&gt;
 [SCSI]&lt;br /&gt;
 System = AS400_PPC&lt;br /&gt;
 &lt;br /&gt;
 [SCSI6]&lt;br /&gt;
 AS400_DiskProfile = &amp;quot;09L4044&amp;quot;&lt;br /&gt;
 PrefetchBytes = 0&lt;br /&gt;
&lt;br /&gt;
When a &#039;&#039;AS400_DiskProfile&#039;&#039; is configured for a given SCSI ID, and the associated image cannot be found on the SD card, a new one is generated automatically, with the correct size. This takes some time, so wait until the activity LED stays unlit.&lt;br /&gt;
&lt;br /&gt;
There is a shell-script &amp;lt;code&amp;gt;utils/extract_as400_disk_data.sh&amp;lt;/code&amp;gt; in the original source tree on GitHub to generate more &#039;&#039;as400_disk_definitions.txt&#039;&#039; entries from real disks connected to a SCSI controller when ran under Linux.&lt;br /&gt;
&lt;br /&gt;
Caveats:&lt;br /&gt;
* Writes to the emulated disk are very slow compared to reads.&lt;br /&gt;
&lt;br /&gt;
Fully tested with Firmware v2026.08.27RC1, 9401-150, V4R4, V5R2.&lt;br /&gt;
&lt;br /&gt;
== Current state ==&lt;br /&gt;
We have to differ three hardware generations when considering Zulu vs. AS/400:&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&amp;amp;nbsp;&lt;br /&gt;
!CISC/IMPI, 520&amp;amp;thinsp;bytes/block disks&lt;br /&gt;
!RISC/SPD, 520/522&amp;amp;thinsp;bytes/block disks&lt;br /&gt;
!RISC/PCI, 522&amp;amp;thinsp;bytes/block disks&lt;br /&gt;
|-&lt;br /&gt;
!CD-ROM&lt;br /&gt;
|Not supported&lt;br /&gt;
|Untested&lt;br /&gt;
|Works&lt;br /&gt;
|-&lt;br /&gt;
!Tape&lt;br /&gt;
|Fails, hangs with SRC early.&lt;br /&gt;
|Untested&lt;br /&gt;
|Works&lt;br /&gt;
|-&lt;br /&gt;
!Disk&lt;br /&gt;
|Fails, hangs with SRC early.&lt;br /&gt;
|Untested&lt;br /&gt;
|Works&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
All successful tests so far have been based on a ZuluSCSI wide board on a 9401-150, while the CISC tests have been done with a ZuluSCSI Blaster on a 9401-P02.&lt;br /&gt;
&lt;br /&gt;
There are success reports of more 150&#039;s working, and one of a 9406-270 becoming stuck with A6000244, &#039;&#039;Contact was lost with device indicated&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Ordinary Harddisks on the AS/400]]&lt;br /&gt;
* [[Tape Drives on old AS/400]]&lt;br /&gt;
* [[SRC]], aka System Reference Code&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [https://zuluscsi.com ZuluSCSI Website] — see the &amp;lt;tt&amp;gt;☰&amp;lt;/tt&amp;gt; button top right for more details&lt;br /&gt;
* [https://github.com/ZuluSCSI/ZuluSCSI-firmware ZuluSCSI-firmware], GitHub&lt;br /&gt;
&lt;br /&gt;
== Footnotes ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Hardware Configuration Guide]]&lt;/div&gt;</summary>
		<author><name>PoC</name></author>
	</entry>
	<entry>
		<id>http://try-as400.pocnet.net/index.php?title=ZuluSCSI&amp;diff=1829</id>
		<title>ZuluSCSI</title>
		<link rel="alternate" type="text/html" href="http://try-as400.pocnet.net/index.php?title=ZuluSCSI&amp;diff=1829"/>
		<updated>2026-08-29T20:51:30Z</updated>

		<summary type="html">&lt;p&gt;PoC: Reworked after release&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;ZuluSCSI&#039;&#039;&#039; by Rabbit Hole Computing is a comparatively new family of SCSI device emulators featuring an SD card based backing store. Distinct features to older, similar devices is support for Wide-SCSI, Ultra-Speed, and a fast CPU.&lt;br /&gt;
&lt;br /&gt;
ZuluSCSI also features an OpenSource firmware, so it can be extended comparatively easily.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
For most AS/400 machines, you actually want a ZuluSCSI wide, because it offers the best performance.&lt;br /&gt;
&lt;br /&gt;
The ZuluSCSI firmware can emulate multiple devices at once. There is no real need to add multiple Zulus to a given SCSI bus. One Zulu can easily saturate even the UltraWide SCSI bus of a 9401-150, and due to the SD card, delays are minimal. You can gain more performance with bigger machines, if they have multiple SCSI buses, though.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&#039;&#039;&#039;Note:&#039;&#039;&#039; Current state of affairs is that at least for writes, the SD card itself is a considerable brake shoe for writes, presumably because of so called &#039;Write Amplification&#039;&#039;. This is not meant to stay like this forever. Optimizations are possible and will be implemented eventually.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hardware overview ==&lt;br /&gt;
Depending on the exact model, boards themselves have three DIP switches and tiny push buttons:&lt;br /&gt;
* 1: switch to initator mode,&lt;br /&gt;
* 2: enable debug log,&lt;br /&gt;
* 3: enable SCSI termination.&lt;br /&gt;
&lt;br /&gt;
The push buttons call the functions:&lt;br /&gt;
* Bootloader, for firmware-recovery,&lt;br /&gt;
* Eject.&lt;br /&gt;
&lt;br /&gt;
Also, three LEDs are provided, for indication of&lt;br /&gt;
* 2.8&amp;amp;thinsp;V power OK,&lt;br /&gt;
* 3.3&amp;amp;thinsp;V power OK,&lt;br /&gt;
* SD-card activity.&lt;br /&gt;
&lt;br /&gt;
The device itself needs 5&amp;amp;thinsp;V power, and can be powered by:&lt;br /&gt;
* the USB port,&lt;br /&gt;
* the termpower line of the SCSI bus,&lt;br /&gt;
* molex style power connectors.&lt;br /&gt;
&lt;br /&gt;
Usually, the integrated USB port is configured as USB modem, for usage with a terminal emulator. You can use the Linux or macOS &#039;&#039;screen&#039;&#039; command for that. Depending on your operating system, you need to find out what device file is created when plugging the Zulu&#039;s USB port. On Linux, it&#039;s &amp;lt;tt&amp;gt;/dev/ttyACM&#039;&#039;n&#039;&#039;&amp;lt;/tt&amp;gt; — &#039;&#039;n&#039;&#039; being a digit, usually 0. On macOS, it&#039;s &amp;lt;tt&amp;gt;/dev/tty.usbmodem*&amp;lt;/tt&amp;gt;, with a row of digits appended on behalf of the &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The firmware presents a simple menu driven UI for some tasks.&lt;br /&gt;
&lt;br /&gt;
There is no need to shut down the device itself, it&#039;s safe to &amp;quot;pull the plug&amp;quot; when there is no activity. The Operating System running on the attached computer should be orderly shut down, though.&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
Configuration itself is usually automatic, according to the files and directories found on the SD card. The SD card has either a FAT32&amp;lt;ref&amp;gt;Limiting files to max. 4&amp;amp;thinsp;GiB in size&amp;lt;/ref&amp;gt; or exFAT file system, the firmware understands both. It&#039;s easier to use the SD card with a card reader on a newer computer to create configurations, and files. The SD card is hotplug capable, and upon reinsertation, the ZuluSCSI reinitializes itself according to the SD card&#039;s content.&lt;br /&gt;
&lt;br /&gt;
Three devices classes are of general interest in the AS/400 world:&lt;br /&gt;
* Disk (DASD),&lt;br /&gt;
* CD/DVD (Optical),&lt;br /&gt;
* Tape.&lt;br /&gt;
&lt;br /&gt;
=== Files ===&lt;br /&gt;
File names are composed as follows:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;TT&amp;gt;&amp;lt;ID&amp;gt;[any text].&amp;lt;ext&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
  ^^   ^&lt;br /&gt;
  |    +-------------- SCSI ID character (byte offset 2)&lt;br /&gt;
  +------------------- two-character type prefix (case-insensitive)&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;TT&#039;&#039;&#039;:&lt;br /&gt;
:{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!TT&lt;br /&gt;
!Device type&lt;br /&gt;
!Default block size&lt;br /&gt;
|-&lt;br /&gt;
|HD&lt;br /&gt;
|Hard disk (fixed)&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|512&amp;amp;thinsp;Bytes&lt;br /&gt;
|-&lt;br /&gt;
|CD&lt;br /&gt;
|CD-ROM (optical)&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|2048&amp;amp;thinsp;Bytes&lt;br /&gt;
|-&lt;br /&gt;
|TP&lt;br /&gt;
|Sequential (tape)&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|512&amp;amp;thinsp;Bytes&lt;br /&gt;
|}&lt;br /&gt;
* The &#039;&#039;&#039;ID&#039;&#039;&#039; is exactly one char, and must be given in hexadecimal. This matters only for IDs ≥ 10.&lt;br /&gt;
* &#039;&#039;&#039;any text&#039;&#039;&#039; is entirely optional.&lt;br /&gt;
* The &#039;&#039;&#039;file extension&#039;&#039;&#039; doesn&#039;t matter.&lt;br /&gt;
&lt;br /&gt;
=== Directories ===&lt;br /&gt;
For a device usually allowing dynamic addition and removal of media — CD-ROM-, and tape drives, you can create a directory instead of a file. The naming scheme follows the same structure as files, but &#039;&#039;[any text]&#039;&#039; must be omitted.&lt;br /&gt;
&lt;br /&gt;
Files within the directories can be freely named. The &#039;&#039;Eject&#039;&#039; button loads and inserts the next image in order. Individual images can be inserted through the menu via USB.&lt;br /&gt;
&lt;br /&gt;
=== Configuration file ===&lt;br /&gt;
In addition, a configuration file can be supplied to provide additional information to either all or one emulated device. Having a &#039;&#039;zuluscsi.ini&#039;&#039; is normally optional, but for enabling AS/400 quirks, it&#039;s mandatory.&lt;br /&gt;
&lt;br /&gt;
The configuration file must be named &#039;&#039;zuluscsi.ini&#039;&#039;, and is in a simple ini-style format. It has a global &amp;lt;tt&amp;gt;[SCSI]&amp;lt;/tt&amp;gt; section to apply settings to all devices, and &amp;lt;tt&amp;gt;[SCSI&#039;&#039;n&#039;&#039;]&amp;lt;/tt&amp;gt;, where &#039;&#039;n&#039;&#039; is the ID of the given SCSI devices.&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
These are in the scope of AS/400.&lt;br /&gt;
&lt;br /&gt;
=== Tape drive support ===&lt;br /&gt;
* create directory &amp;lt;code&amp;gt;TP0&amp;lt;/code&amp;gt;,&lt;br /&gt;
* populate with one or more 0&amp;amp;thinsp;byte files named &amp;lt;code&amp;gt;*.tap&amp;lt;/code&amp;gt; files, e. g. by using the Unix &amp;lt;code&amp;gt;touch&amp;lt;/code&amp;gt;,&lt;br /&gt;
* use the serial console to attach image(s) to the drive.&lt;br /&gt;
* &#039;&#039;zuluscsi.ini&#039;&#039;:&lt;br /&gt;
 [SCSI]&lt;br /&gt;
 System=&amp;quot;AS400_PPC&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 [SCSI0]&lt;br /&gt;
 Device = &amp;quot;AS400_PPC&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Caveats:&lt;br /&gt;
* When you choose an image file through the USB port&#039;s media menu, make sure that you not only choose an image file, but afterwards &#039;&#039;insert&#039;&#039; it!&lt;br /&gt;
* If you replace a hardware tape drive, make sure to delete your old tape device file first, then IPL, check/set the new device name in DST, and have auto-configuration create the new device file during the following IPL.&lt;br /&gt;
* The amended (with an explicit &#039;&#039;Device&#039;&#039; statement) tape code as of v2026.08.28 has not yet undergone extensive testing.&lt;br /&gt;
&lt;br /&gt;
=== CD drive support ===&lt;br /&gt;
* create directory &amp;lt;code&amp;gt;CD0&amp;lt;/code&amp;gt;,&lt;br /&gt;
* populate with one or more readymade ISO images,&lt;br /&gt;
* use the serial console to attach image(s) to the drive.&lt;br /&gt;
&lt;br /&gt;
No special handling for the ID in &#039;&#039;zuluscsi.ini&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Caveats:&lt;br /&gt;
* When you choose an image file through the USB port&#039;s media menu, make sure that you not only choose an image file, but afterwards &#039;&#039;insert&#039;&#039; it!&lt;br /&gt;
* If you replace a hardware CD drive, make sure to delete your old CD device file first, then IPL, check/set the new device name in DST, and have auto-configuration create the new device file during the following IPL.&lt;br /&gt;
&lt;br /&gt;
Tested with Firmware 2026-08-07, 9401-150, V4R4, V5R2: IPL only so far, but that works.&lt;br /&gt;
&lt;br /&gt;
=== Disk drive support ===&lt;br /&gt;
The officially released code base is able to present multiple disk drives to the system, initialize, and install SLIC + base OS/400 + LPPs + PTFs.&lt;br /&gt;
&lt;br /&gt;
* Copy &#039;&#039;as400_disk_definitions.txt&#039;&#039; from the official GitHub repository to the SD card.&lt;br /&gt;
** Because of serial numbers currently being hard coded, only one disk per type should be used for now!&lt;br /&gt;
* &#039;&#039;zuluscsi.ini&#039;&#039;:&lt;br /&gt;
 [SCSI]&lt;br /&gt;
 System = AS400_PPC&lt;br /&gt;
&lt;br /&gt;
 [SCSI6]&lt;br /&gt;
 AS400_DiskProfile = &amp;quot;09L4044&amp;quot;&lt;br /&gt;
 PrefetchBytes = 0&lt;br /&gt;
&lt;br /&gt;
When a &#039;&#039;AS400_DiskProfile&#039;&#039; is configured for a given SCSI ID, and the associated image cannot be found on the SD card, a new one is generated automatically, with the correct size. This takes some time, so wait until the activity LED stays unlit.&lt;br /&gt;
&lt;br /&gt;
There is a shell-script &amp;lt;code&amp;gt;utils/extract_as400_disk_data.sh&amp;lt;/code&amp;gt; in the original source tree on GitHub to generate more &#039;&#039;as400_disk_definitions.txt&#039;&#039; entries from real disks connected to a SCSI controller when ran under Linux.&lt;br /&gt;
&lt;br /&gt;
Caveats:&lt;br /&gt;
* Writes to the emulated disk are very slow compared to reads.&lt;br /&gt;
&lt;br /&gt;
Fully tested with Firmware v2026.08.27RC1, 9401-150, V4R4, V5R2.&lt;br /&gt;
&lt;br /&gt;
== Current state ==&lt;br /&gt;
We have to differ three hardware generations when considering Zulu vs. AS/400:&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&amp;amp;nbsp;&lt;br /&gt;
!CISC/IMPI, 520&amp;amp;thinsp;bytes/block disks&lt;br /&gt;
!RISC/SPD, 520/522&amp;amp;thinsp;bytes/block disks&lt;br /&gt;
!RISC/PCI, 522&amp;amp;thinsp;bytes/block disks&lt;br /&gt;
|-&lt;br /&gt;
!CD-ROM&lt;br /&gt;
|Not supported&lt;br /&gt;
|Untested&lt;br /&gt;
|Works&lt;br /&gt;
|-&lt;br /&gt;
!Tape&lt;br /&gt;
|Fails, hangs with SRC early.&lt;br /&gt;
|Untested&lt;br /&gt;
|Works&lt;br /&gt;
|-&lt;br /&gt;
!Disk&lt;br /&gt;
|Fails, hangs with SRC early.&lt;br /&gt;
|Untested&lt;br /&gt;
|Works&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
All successful tests so far have been based on a ZuluSCSI wide board on a 9401-150, while the CISC tests have been done with a ZuluSCSI Blaster on a 9401-P02.&lt;br /&gt;
&lt;br /&gt;
There are success reports of more 150&#039;s working, and one of a 9406-270 becoming stuck with A6000244, &#039;&#039;Contact was lost with device indicated&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Ordinary Harddisks on the AS/400]]&lt;br /&gt;
* [[Tape Drives on old AS/400]]&lt;br /&gt;
* [[SRC]], aka System Reference Code&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [https://zuluscsi.com ZuluSCSI Website] — see the &amp;lt;tt&amp;gt;☰&amp;lt;/tt&amp;gt; button top right for more details&lt;br /&gt;
* [https://github.com/ZuluSCSI/ZuluSCSI-firmware ZuluSCSI-firmware], GitHub&lt;br /&gt;
&lt;br /&gt;
== Footnotes ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Hardware Configuration Guide]]&lt;/div&gt;</summary>
		<author><name>PoC</name></author>
	</entry>
	<entry>
		<id>http://try-as400.pocnet.net/index.php?title=ZuluSCSI&amp;diff=1828</id>
		<title>ZuluSCSI</title>
		<link rel="alternate" type="text/html" href="http://try-as400.pocnet.net/index.php?title=ZuluSCSI&amp;diff=1828"/>
		<updated>2026-08-29T19:54:09Z</updated>

		<summary type="html">&lt;p&gt;PoC: Reworked&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;ZuluSCSI&#039;&#039;&#039; by Rabbit Hole Computing is a comparatively new family of SCSI device emulators featuring an SD card based backing store. Distinct features to older, similar devices is support for Wide-SCSI, Ultra-Speed, and a fast CPU.&lt;br /&gt;
&lt;br /&gt;
ZuluSCSI also features an OpenSource firmware, so it can be extended comparatively easily.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
For most AS/400 machines, you actually want a ZuluSCSI wide, because it offers the best performance.&lt;br /&gt;
&lt;br /&gt;
The ZuluSCSI firmware can emulate multiple devices at once. There is no real need to add multiple Zulus to a given SCSI bus. One Zulu can easily saturate even the UltraWide SCSI bus of a 9401-150, and due to the SD card, delays are minimal. You can gain more performance with bigger machines, if they have multiple SCSI buses, though.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&#039;&#039;&#039;Note:&#039;&#039;&#039; Current state of affairs is that at least for writes, the SD card itself is a considerable brake shoe for writes, presumably because of so called &#039;Write Amplification&#039;&#039;. This is not meant to stay like this forever. Optimizations are possible and will be implemented eventually.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hardware overview ==&lt;br /&gt;
Depending on the exact model, boards themselves have three DIP switches and tiny push buttons:&lt;br /&gt;
* 1: switch to initator mode,&lt;br /&gt;
* 2: enable debug log,&lt;br /&gt;
* 3: enable SCSI termination.&lt;br /&gt;
&lt;br /&gt;
The push buttons call the functions:&lt;br /&gt;
* Bootloader, for firmware-recovery,&lt;br /&gt;
* Eject.&lt;br /&gt;
&lt;br /&gt;
Also, three LEDs are provided, for indication of&lt;br /&gt;
* 2.8&amp;amp;thinsp;V power OK,&lt;br /&gt;
* 3.3&amp;amp;thinsp;V power OK,&lt;br /&gt;
* SD-card activity.&lt;br /&gt;
&lt;br /&gt;
The device itself needs 5&amp;amp;thinsp;V power, and can be powered by:&lt;br /&gt;
* the USB port,&lt;br /&gt;
* the termpower line of the SCSI bus,&lt;br /&gt;
* molex style power connectors.&lt;br /&gt;
&lt;br /&gt;
Usually, the integrated USB port is configured as USB modem, for usage with a terminal emulator. You can use the Linux or macOS &#039;&#039;screen&#039;&#039; command for that. Depending on your operating system, you need to find out what device file is created when plugging the Zulu&#039;s USB port. On Linux, it&#039;s &amp;lt;tt&amp;gt;/dev/ttyACM&#039;&#039;n&#039;&#039;&amp;lt;/tt&amp;gt; — &#039;&#039;n&#039;&#039; being a digit, usually 0. On macOS, it&#039;s &amp;lt;tt&amp;gt;/dev/tty.usbmodem*&amp;lt;/tt&amp;gt;, with a row of digits appended on behalf of the &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The firmware presents a simple menu driven UI for some tasks.&lt;br /&gt;
&lt;br /&gt;
There is no need to shut down the device itself, it&#039;s safe to &amp;quot;pull the plug&amp;quot; when there is no activity. The Operating System running on the attached computer should be orderly shut down, though.&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
Configuration itself is usually automatic, according to the files and directories found on the SD card. The SD card has either a FAT32&amp;lt;ref&amp;gt;Limiting files to max. 4&amp;amp;thinsp;GiB in size&amp;lt;/ref&amp;gt; or exFAT file system, the firmware understands both. It&#039;s easier to use the SD card with a card reader on a newer computer to create configurations, and files. The SD card is hotplug capable, and upon reinsertation, the ZuluSCSI reinitializes itself according to the SD card&#039;s content.&lt;br /&gt;
&lt;br /&gt;
Three devices classes are of general interest in the AS/400 world:&lt;br /&gt;
* Disk (DASD),&lt;br /&gt;
* CD/DVD (Optical),&lt;br /&gt;
* Tape.&lt;br /&gt;
&lt;br /&gt;
=== Files ===&lt;br /&gt;
File names are composed as follows:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;TT&amp;gt;&amp;lt;ID&amp;gt;[any text].&amp;lt;ext&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
  ^^   ^&lt;br /&gt;
  |    +-------------- SCSI ID character (byte offset 2)&lt;br /&gt;
  +------------------- two-character type prefix (case-insensitive)&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;TT&#039;&#039;&#039;:&lt;br /&gt;
:{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!TT&lt;br /&gt;
!Device type&lt;br /&gt;
!Default block size&lt;br /&gt;
|-&lt;br /&gt;
|HD&lt;br /&gt;
|Hard disk (fixed)&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|512&amp;amp;thinsp;Bytes&lt;br /&gt;
|-&lt;br /&gt;
|CD&lt;br /&gt;
|CD-ROM (optical)&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|2048&amp;amp;thinsp;Bytes&lt;br /&gt;
|-&lt;br /&gt;
|TP&lt;br /&gt;
|Sequential (tape)&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|512&amp;amp;thinsp;Bytes&lt;br /&gt;
|}&lt;br /&gt;
* The &#039;&#039;&#039;ID&#039;&#039;&#039; is exactly one char, and must be given in hexadecimal. This matters only for IDs ≥ 10.&lt;br /&gt;
* &#039;&#039;&#039;any text&#039;&#039;&#039; is entirely optional.&lt;br /&gt;
* The &#039;&#039;&#039;file extension&#039;&#039;&#039; doesn&#039;t matter.&lt;br /&gt;
&lt;br /&gt;
=== Directories ===&lt;br /&gt;
For a device usually allowing dynamic addition and removal of media — CD-ROM-, and tape drives, you can create a directory instead of a file. The naming scheme follows the same structure as files, but &#039;&#039;[any text]&#039;&#039; must be omitted.&lt;br /&gt;
&lt;br /&gt;
Files within the directories can be freely named. The &#039;&#039;Eject&#039;&#039; button loads and inserts the next image in order. Individual images can be inserted through the menu via USB.&lt;br /&gt;
&lt;br /&gt;
=== Configuration file ===&lt;br /&gt;
In addition, a configuration file can be supplied to provide additional information to either all or one emulated device. Having a &#039;&#039;zuluscsi.ini&#039;&#039; is normally optional, but for enabling AS/400 quirks, it&#039;s mandatory.&lt;br /&gt;
&lt;br /&gt;
The configuration file must be named &#039;&#039;zuluscsi.ini&#039;&#039;, and is in a simple ini-style format. It has a global &amp;lt;tt&amp;gt;[SCSI]&amp;lt;/tt&amp;gt; section to apply settings to all devices, and &amp;lt;tt&amp;gt;[SCSI&#039;&#039;n&#039;&#039;]&amp;lt;/tt&amp;gt;, where &#039;&#039;n&#039;&#039; is the ID of the given SCSI devices.&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
These are in the scope of AS/400.&lt;br /&gt;
&lt;br /&gt;
=== Tape drive support ===&lt;br /&gt;
* create directory &amp;lt;code&amp;gt;TP0&amp;lt;/code&amp;gt;,&lt;br /&gt;
* populate with one or more 0&amp;amp;thinsp;byte files named &amp;lt;code&amp;gt;*.tap&amp;lt;/code&amp;gt; files, e. g. by using the Unix &amp;lt;code&amp;gt;touch&amp;lt;/code&amp;gt;,&lt;br /&gt;
* use the serial console to attach image(s) to the drive.&lt;br /&gt;
* &#039;&#039;zuluscsi.ini&#039;&#039;:&lt;br /&gt;
 [SCSI]&lt;br /&gt;
 System=&amp;quot;AS400_PPC&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 [SCSI0]&lt;br /&gt;
 TapeDensity = 0x25&lt;br /&gt;
&lt;br /&gt;
Caveats:&lt;br /&gt;
* When you choose an image file through the USB port&#039;s media menu, make sure that you not only choose an image file, but afterwards &#039;&#039;insert&#039;&#039; it!&lt;br /&gt;
* If you replace a hardware tape drive, make sure to delete your old tape device file first, then IPL, check/set the new device name in DST, and have auto-configuration create the new device file during the following IPL.&lt;br /&gt;
&lt;br /&gt;
This configuration has been tested over the course of multiple weeks:&lt;br /&gt;
* Occasional &amp;lt;tt&amp;gt;go save&amp;lt;/tt&amp;gt; 21,&lt;br /&gt;
* daily differential backups,&lt;br /&gt;
* occasional single file restores.&lt;br /&gt;
&lt;br /&gt;
Tested with Firmware 2026-06-12, 9401-150, V4R5.&lt;br /&gt;
&lt;br /&gt;
=== CD drive support ===&lt;br /&gt;
* create directory &amp;lt;code&amp;gt;CD0&amp;lt;/code&amp;gt;,&lt;br /&gt;
* populate with one or more readymade ISO images,&lt;br /&gt;
* use the serial console to attach image(s) to the drive.&lt;br /&gt;
&lt;br /&gt;
No special handling for the ID in &#039;&#039;zuluscsi.ini&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Caveats:&lt;br /&gt;
* When you choose an image file through the USB port&#039;s media menu, make sure that you not only choose an image file, but afterwards &#039;&#039;insert&#039;&#039; it!&lt;br /&gt;
* If you replace a hardware CD drive, make sure to delete your old CD device file first, then IPL, check/set the new device name in DST, and have auto-configuration create the new device file during the following IPL.&lt;br /&gt;
&lt;br /&gt;
Tested with Firmware 2026-08-07, 9401-150, V4R4: IPL only so far.&lt;br /&gt;
&lt;br /&gt;
=== Disk drive support ===&lt;br /&gt;
The officially released code base is able to present a singular #6717, 8.5&amp;amp;thinsp;GiB disk drive to the system, initialize, and install SLIC + base OS/400 + LPPs + PTFs.&lt;br /&gt;
&lt;br /&gt;
* Generate disk image:&lt;br /&gt;
 dd if=/dev/zero of=HD6.img bs=522 count=17177940 status=progress&lt;br /&gt;
* &#039;&#039;zuluscsi.ini&#039;&#039;:&lt;br /&gt;
 [SCSI]&lt;br /&gt;
 System = AS400_PPC&lt;br /&gt;
&lt;br /&gt;
 [SCSI6]&lt;br /&gt;
 PrefetchBytes = 0&lt;br /&gt;
&lt;br /&gt;
Caveats:&lt;br /&gt;
* Writes to the emulated disk are very slow compared to reads.&lt;br /&gt;
* One user with a RP2040 reported failure for the disk to be recognized. Prerelease firmware solved the issue.&lt;br /&gt;
&lt;br /&gt;
Fully tested with Firmware 2026-08-21, 9401-150, V4R4, V5R2.&lt;br /&gt;
&lt;br /&gt;
== Current state ==&lt;br /&gt;
We have to differ three hardware generations when considering Zulu vs. AS/400:&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&amp;amp;nbsp;&lt;br /&gt;
!CISC/IMPI, 520&amp;amp;thinsp;bytes/block disks&lt;br /&gt;
!RISC/SPD, 520/522&amp;amp;thinsp;bytes/block disks&lt;br /&gt;
!RISC/PCI, 522&amp;amp;thinsp;bytes/block disks&lt;br /&gt;
|-&lt;br /&gt;
!CD-ROM&lt;br /&gt;
|Not supported&lt;br /&gt;
|Untested&lt;br /&gt;
|Works&lt;br /&gt;
|-&lt;br /&gt;
!Tape&lt;br /&gt;
|Fails, hangs with SRC early.&lt;br /&gt;
|Untested&lt;br /&gt;
|Works&lt;br /&gt;
|-&lt;br /&gt;
!Disk&lt;br /&gt;
|Fails, hangs with SRC early.&lt;br /&gt;
|Untested&lt;br /&gt;
|Works&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
All successful tests so far have been based on a ZuluSCSI wide board on a 9401-150, while the CISC tests have been done with a ZuluSCSI Blaster on a 9401-P02.&lt;br /&gt;
&lt;br /&gt;
There are success reports of more 150&#039;s working, and one of a 9406-270 becoming stuck with A6000244, &#039;&#039;Contact was lost with device indicated&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Next ==&lt;br /&gt;
These features are completed, partially tested, but did not make it to the official releases yet:&lt;br /&gt;
* More disk profiles, loadable in &#039;&#039;zuluscsi.ini&#039;&#039; via external file &#039;&#039;as400_disk_definitions.txt&#039;&#039;, so different types than the built-in 522&amp;amp;thinsp;bytes, 8.5&amp;amp;thinsp;GiB #6717 can be assigned.&lt;br /&gt;
** Shellscript to generate more &#039;&#039;as400_disk_definitions.txt&#039;&#039; entries from real disks connected to a SCSI controller when ran under Linux&lt;br /&gt;
** Because of serial numbers currently being hard coded, only one disk per type should be used&lt;br /&gt;
* Allowed more memory to accommodate the necessary VPD SCSI pages for multiple disks&lt;br /&gt;
* Present captured real tape VPD/SCSI data from IBM SLR5/QIC1000 when using &amp;lt;code&amp;gt;Device = &amp;quot;AS400_PPC&amp;quot;&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;Device = &amp;quot;AS400_CISC&amp;quot;&amp;lt;/code&amp;gt; in an ID stanza&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Ordinary Harddisks on the AS/400]]&lt;br /&gt;
* [[Tape Drives on old AS/400]]&lt;br /&gt;
* [[SRC]], aka System Reference Code&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [https://zuluscsi.com ZuluSCSI Website] — see the &amp;lt;tt&amp;gt;☰&amp;lt;/tt&amp;gt; button top right for more details&lt;br /&gt;
* [https://github.com/ZuluSCSI/ZuluSCSI-firmware ZuluSCSI-firmware], GitHub&lt;br /&gt;
&lt;br /&gt;
== Footnotes ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Hardware Configuration Guide]]&lt;/div&gt;</summary>
		<author><name>PoC</name></author>
	</entry>
	<entry>
		<id>http://try-as400.pocnet.net/index.php?title=ZuluSCSI&amp;diff=1827</id>
		<title>ZuluSCSI</title>
		<link rel="alternate" type="text/html" href="http://try-as400.pocnet.net/index.php?title=ZuluSCSI&amp;diff=1827"/>
		<updated>2026-08-28T08:01:13Z</updated>

		<summary type="html">&lt;p&gt;PoC: /* Current state */ updates&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;ZuluSCSI&#039;&#039;&#039; by Rabbit Hole Computing is a comparatively new family of SCSI device emulators featuring an SD card based backing store. Distinct features to older, similar devices is support for Wide-SCSI, Ultra-Speed, and a fast CPU.&lt;br /&gt;
&lt;br /&gt;
ZuluSCSI also features an OpenSource firmware, so it can be extended comparatively easily.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
For most AS/400 machines, you actually want a ZuluSCSI wide, because it offers the best performance.&lt;br /&gt;
&lt;br /&gt;
The ZuluSCSI firmware can emulate multiple devices at once. There is no real need to add multiple Zulus to a given SCSI bus. One Zulu can easily saturate even the UltraWide SCSI bus of a 9401-150, and due to the SD card, delays are minimal. You can gain more performance with bigger machines, if they have multiple SCSI buses, though.&lt;br /&gt;
&lt;br /&gt;
== Hardware overview ==&lt;br /&gt;
Depending on the exact model, boards themselves have three DIP switches and tiny push buttons:&lt;br /&gt;
* 1: switch to initator mode,&lt;br /&gt;
* 2: enable debug log,&lt;br /&gt;
* 3: enable SCSI termination.&lt;br /&gt;
&lt;br /&gt;
The push buttons call the functions:&lt;br /&gt;
* Bootloader, for firmware-recovery,&lt;br /&gt;
* Eject.&lt;br /&gt;
&lt;br /&gt;
Also, three LEDs are provided, for indication of&lt;br /&gt;
* 2.8&amp;amp;thinsp;V power OK,&lt;br /&gt;
* 3.3&amp;amp;thinsp;V power OK,&lt;br /&gt;
* SD-card activity.&lt;br /&gt;
&lt;br /&gt;
The device itself needs 5&amp;amp;thinsp;V power, and can be powered by:&lt;br /&gt;
* the USB port,&lt;br /&gt;
* the termpower line of the SCSI bus,&lt;br /&gt;
* molex style power connectors.&lt;br /&gt;
&lt;br /&gt;
Usually, the integrated USB port is configured as USB modem, for usage with a terminal emulator. You can use the Linux or macOS &#039;&#039;screen&#039;&#039; command for that. Depending on your operating system, you need to find out what device file is created when plugging the Zulu&#039;s USB port. On Linux, it&#039;s &amp;lt;tt&amp;gt;/dev/ttyACM&#039;&#039;n&#039;&#039;&amp;lt;/tt&amp;gt; — &#039;&#039;n&#039;&#039; being a digit, usually 0. On macOS, it&#039;s &amp;lt;tt&amp;gt;/dev/tty.usbmodem*&amp;lt;/tt&amp;gt;, with a row of digits appended on behalf of the &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The firmware presents a simple menu driven UI for some tasks.&lt;br /&gt;
&lt;br /&gt;
There is no need to shut down the device itself, it&#039;s safe to &amp;quot;pull the plug&amp;quot; when there is no activity. The Operating System running on the attached computer should, though.&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
Configuration itself is usually automatic, according to the files and directories found on the SD card. The SD card has either a FAT32&amp;lt;ref&amp;gt;Limiting files to max. 4&amp;amp;thinsp;GiB in size&amp;lt;/ref&amp;gt; or exFAT file system, the firmware understands both. It&#039;s easier to use the SD card with a card reader on a newer computer to create configurations, and files. The SD card is hotplug capable, and upon reinsertation, the ZuluSCSI reinitializes itself according to the SD card&#039;s content.&lt;br /&gt;
&lt;br /&gt;
Three devices classes are of general interest in the AS/400 world:&lt;br /&gt;
* Disk (DASD),&lt;br /&gt;
* CD/DVD (Optical),&lt;br /&gt;
* Tape.&lt;br /&gt;
&lt;br /&gt;
=== Files ===&lt;br /&gt;
File names are composed as follows:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;TT&amp;gt;&amp;lt;ID&amp;gt;[any text].&amp;lt;ext&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
  ^^   ^&lt;br /&gt;
  |    +-------------- SCSI ID character (byte offset 2)&lt;br /&gt;
  +------------------- two-character type prefix (case-insensitive)&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;TT&#039;&#039;&#039;:&lt;br /&gt;
:{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!TT&lt;br /&gt;
!Device type&lt;br /&gt;
!Default block size&lt;br /&gt;
|-&lt;br /&gt;
|HD&lt;br /&gt;
|Hard disk (fixed)&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|512&amp;amp;thinsp;Bytes&lt;br /&gt;
|-&lt;br /&gt;
|CD&lt;br /&gt;
|CD-ROM (optical)&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|2048&amp;amp;thinsp;Bytes&lt;br /&gt;
|-&lt;br /&gt;
|TP&lt;br /&gt;
|Sequential (tape)&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|512&amp;amp;thinsp;Bytes&lt;br /&gt;
|}&lt;br /&gt;
* The &#039;&#039;&#039;ID&#039;&#039;&#039; is exactly one char, and must be given in hexadecimal. This matters only for IDs ≥ 10.&lt;br /&gt;
* &#039;&#039;&#039;any text&#039;&#039;&#039; is entirely optional.&lt;br /&gt;
* The &#039;&#039;&#039;file extension&#039;&#039;&#039; doesn&#039;t matter.&lt;br /&gt;
&lt;br /&gt;
=== Directories ===&lt;br /&gt;
For a device usually allowing dynamic addition and removal of media — CD-ROM-, and tape drives. The naming scheme follows the same structure as files, but &#039;&#039;[any text]&#039;&#039; must be omitted.&lt;br /&gt;
&lt;br /&gt;
Files within the directories can be freely named, and are used in alphabetical order.&amp;lt;ref&amp;gt;Either through the &#039;&#039;Eject&#039;&#039; button, or the media menu.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Configuration file ===&lt;br /&gt;
In addition, a configuration file can be supplied to provide additional information to either all or one emulated device. Having a &#039;&#039;zuluscsi.ini&#039;&#039; is normally optional, but for enabling AS/400 quirks, it&#039;s mandatory.&lt;br /&gt;
&lt;br /&gt;
The configuration file must be named &#039;&#039;zuluscsi.ini&#039;&#039;, and is in a simple ini-style format. It has a global &amp;lt;tt&amp;gt;[SCSI]&amp;lt;/tt&amp;gt; section to apply settings to all devices, and &amp;lt;tt&amp;gt;[SCSI&#039;&#039;n&#039;&#039;]&amp;lt;/tt&amp;gt;, where &#039;&#039;n&#039;&#039; is the ID of the given SCSI devices.&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
These are in the scope of AS/400.&lt;br /&gt;
&lt;br /&gt;
=== Tape drive support ===&lt;br /&gt;
* create directory &amp;lt;code&amp;gt;TP0&amp;lt;/code&amp;gt;,&lt;br /&gt;
* populate with one or more 0&amp;amp;thinsp;byte files named &amp;lt;code&amp;gt;*.tap&amp;lt;/code&amp;gt; files, e. g. by using the Unix &amp;lt;code&amp;gt;touch&amp;lt;/code&amp;gt;,&lt;br /&gt;
* use the serial console to attach image(s) to the drive.&lt;br /&gt;
* &#039;&#039;zuluscsi.ini&#039;&#039;:&lt;br /&gt;
 [SCSI]&lt;br /&gt;
 System=&amp;quot;AS400_PPC&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 [SCSI0]&lt;br /&gt;
 TapeDensity = 0x25&lt;br /&gt;
&lt;br /&gt;
Caveats:&lt;br /&gt;
* When you choose an image file through the USB port&#039;s media menu, make sure that you not only choose an image file, but afterwards &#039;&#039;insert&#039;&#039; it!&lt;br /&gt;
* If you replace a hardware tape drive, make sure to delete your old tape device file first, then IPL, check/set the new device name in DST, and have auto-configuration create the new device file during the following IPL.&lt;br /&gt;
&lt;br /&gt;
This configuration has been tested over the course of multiple weeks:&lt;br /&gt;
* Occasional &amp;lt;tt&amp;gt;go save&amp;lt;/tt&amp;gt; 21,&lt;br /&gt;
* daily differential backups,&lt;br /&gt;
* occasional single file restores.&lt;br /&gt;
&lt;br /&gt;
Tested with Firmware 2026-06-12, 9401-150, V4R5.&lt;br /&gt;
&lt;br /&gt;
=== CD drive support ===&lt;br /&gt;
* create directory &amp;lt;code&amp;gt;CD0&amp;lt;/code&amp;gt;,&lt;br /&gt;
* populate with one or more readymade ISO images,&lt;br /&gt;
* use the serial console to attach image(s) to the drive.&lt;br /&gt;
&lt;br /&gt;
No special handling for the ID in &#039;&#039;zuluscsi.ini&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Caveats:&lt;br /&gt;
* When you choose an image file through the USB port&#039;s media menu, make sure that you not only choose an image file, but afterwards &#039;&#039;insert&#039;&#039; it!&lt;br /&gt;
* If you replace a hardware CD drive, make sure to delete your old CD device file first, then IPL, check/set the new device name in DST, and have auto-configuration create the new device file during the following IPL.&lt;br /&gt;
&lt;br /&gt;
Tested with Firmware 2026-08-07, 9401-150, V4R4: IPL only so far.&lt;br /&gt;
&lt;br /&gt;
=== Disk drive support ===&lt;br /&gt;
The officially released code base is able to present a singular #6717, 8.5&amp;amp;thinsp;GiB disk drive to the system, initialize, and install SLIC + base OS/400 + LPPs + PTFs.&lt;br /&gt;
&lt;br /&gt;
* Generate disk image:&lt;br /&gt;
 dd if=/dev/zero of=HD6.img bs=522 count=17177940 status=progress&lt;br /&gt;
* &#039;&#039;zuluscsi.ini&#039;&#039;:&lt;br /&gt;
 [SCSI]&lt;br /&gt;
 System = AS400_PPC&lt;br /&gt;
&lt;br /&gt;
 [SCSI6]&lt;br /&gt;
 PrefetchBytes = 0&lt;br /&gt;
&lt;br /&gt;
Caveats:&lt;br /&gt;
* Writes to the emulated disk are very slow compared to reads.&lt;br /&gt;
* One user with a RP2040 reported failure for the disk to be recognized. Prerelease firmware solved the issue.&lt;br /&gt;
&lt;br /&gt;
Fully tested with Firmware 2026-08-21, 9401-150, V4R4.&lt;br /&gt;
&lt;br /&gt;
== Current state ==&lt;br /&gt;
We have to differ three hardware generations when considering Zulu vs. AS/400:&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&amp;amp;nbsp;&lt;br /&gt;
!CISC/IMPI, 520&amp;amp;thinsp;bytes/block disks&lt;br /&gt;
!RISC/SPD, 520/522&amp;amp;thinsp;bytes/block disks&lt;br /&gt;
!RISC/PCI, 522&amp;amp;thinsp;bytes/block disks&lt;br /&gt;
|-&lt;br /&gt;
!CD-ROM&lt;br /&gt;
|Not supported&lt;br /&gt;
|Untested&lt;br /&gt;
|Works&lt;br /&gt;
|-&lt;br /&gt;
!Tape&lt;br /&gt;
|Fails, hangs with SRC early.&lt;br /&gt;
|Untested&lt;br /&gt;
|Works&lt;br /&gt;
|-&lt;br /&gt;
!Disk&lt;br /&gt;
|Fails, hangs with SRC early.&lt;br /&gt;
|Untested&lt;br /&gt;
|Works&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
All successful tests so far have been based on a ZuluSCSI wide board on a 9401-150, while the CISC tests have been done with a ZuluSCSI Blaster on a 9401-P02.&lt;br /&gt;
&lt;br /&gt;
There are success reports of more 150&#039;s working, and one of a 9406-270 becoming stuck with A6000244, &#039;&#039;Contact was lost with device indicated&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Next ==&lt;br /&gt;
These features are completed, partially tested, but did not make it to the official releases yet:&lt;br /&gt;
* More disk profiles, loadable in &#039;&#039;zuluscsi.ini&#039;&#039; via external file &#039;&#039;as400_disk_definitions.txt&#039;&#039;, so different types than the built-in 522&amp;amp;thinsp;bytes, 8.5&amp;amp;thinsp;GiB #6717 can be assigned.&lt;br /&gt;
** Shellscript to generate more &#039;&#039;as400_disk_definitions.txt&#039;&#039; entries from real disks connected to a SCSI controller when ran under Linux&lt;br /&gt;
** Because of serial numbers currently being hard coded, only one disk per type should be used&lt;br /&gt;
* Allowed more memory to accommodate the necessary VPD SCSI pages for multiple disks&lt;br /&gt;
* Present captured real tape VPD/SCSI data from IBM SLR5/QIC1000 when using &amp;lt;code&amp;gt;Device = &amp;quot;AS400_PPC&amp;quot;&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;Device = &amp;quot;AS400_CISC&amp;quot;&amp;lt;/code&amp;gt; in an ID stanza&lt;br /&gt;
&lt;br /&gt;
Currently contained in v2026.08.27-RC1.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Ordinary Harddisks on the AS/400]]&lt;br /&gt;
* [[Tape Drives on old AS/400]]&lt;br /&gt;
* [[SRC]], aka System Reference Code&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [https://zuluscsi.com ZuluSCSI Website] — see the &amp;lt;tt&amp;gt;☰&amp;lt;/tt&amp;gt; button top right for more details&lt;br /&gt;
* [https://github.com/ZuluSCSI/ZuluSCSI-firmware ZuluSCSI-firmware], GitHub&lt;br /&gt;
&lt;br /&gt;
== Footnotes ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Hardware Configuration Guide]]&lt;/div&gt;</summary>
		<author><name>PoC</name></author>
	</entry>
	<entry>
		<id>http://try-as400.pocnet.net/index.php?title=ZuluSCSI&amp;diff=1826</id>
		<title>ZuluSCSI</title>
		<link rel="alternate" type="text/html" href="http://try-as400.pocnet.net/index.php?title=ZuluSCSI&amp;diff=1826"/>
		<updated>2026-08-28T07:39:26Z</updated>

		<summary type="html">&lt;p&gt;PoC: /* Next */ Updated things&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;ZuluSCSI&#039;&#039;&#039; by Rabbit Hole Computing is a comparatively new family of SCSI device emulators featuring an SD card based backing store. Distinct features to older, similar devices is support for Wide-SCSI, Ultra-Speed, and a fast CPU.&lt;br /&gt;
&lt;br /&gt;
ZuluSCSI also features an OpenSource firmware, so it can be extended comparatively easily.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
For most AS/400 machines, you actually want a ZuluSCSI wide, because it offers the best performance.&lt;br /&gt;
&lt;br /&gt;
The ZuluSCSI firmware can emulate multiple devices at once. There is no real need to add multiple Zulus to a given SCSI bus. One Zulu can easily saturate even the UltraWide SCSI bus of a 9401-150, and due to the SD card, delays are minimal. You can gain more performance with bigger machines, if they have multiple SCSI buses, though.&lt;br /&gt;
&lt;br /&gt;
== Hardware overview ==&lt;br /&gt;
Depending on the exact model, boards themselves have three DIP switches and tiny push buttons:&lt;br /&gt;
* 1: switch to initator mode,&lt;br /&gt;
* 2: enable debug log,&lt;br /&gt;
* 3: enable SCSI termination.&lt;br /&gt;
&lt;br /&gt;
The push buttons call the functions:&lt;br /&gt;
* Bootloader, for firmware-recovery,&lt;br /&gt;
* Eject.&lt;br /&gt;
&lt;br /&gt;
Also, three LEDs are provided, for indication of&lt;br /&gt;
* 2.8&amp;amp;thinsp;V power OK,&lt;br /&gt;
* 3.3&amp;amp;thinsp;V power OK,&lt;br /&gt;
* SD-card activity.&lt;br /&gt;
&lt;br /&gt;
The device itself needs 5&amp;amp;thinsp;V power, and can be powered by:&lt;br /&gt;
* the USB port,&lt;br /&gt;
* the termpower line of the SCSI bus,&lt;br /&gt;
* molex style power connectors.&lt;br /&gt;
&lt;br /&gt;
Usually, the integrated USB port is configured as USB modem, for usage with a terminal emulator. You can use the Linux or macOS &#039;&#039;screen&#039;&#039; command for that. Depending on your operating system, you need to find out what device file is created when plugging the Zulu&#039;s USB port. On Linux, it&#039;s &amp;lt;tt&amp;gt;/dev/ttyACM&#039;&#039;n&#039;&#039;&amp;lt;/tt&amp;gt; — &#039;&#039;n&#039;&#039; being a digit, usually 0. On macOS, it&#039;s &amp;lt;tt&amp;gt;/dev/tty.usbmodem*&amp;lt;/tt&amp;gt;, with a row of digits appended on behalf of the &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The firmware presents a simple menu driven UI for some tasks.&lt;br /&gt;
&lt;br /&gt;
There is no need to shut down the device itself, it&#039;s safe to &amp;quot;pull the plug&amp;quot; when there is no activity. The Operating System running on the attached computer should, though.&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
Configuration itself is usually automatic, according to the files and directories found on the SD card. The SD card has either a FAT32&amp;lt;ref&amp;gt;Limiting files to max. 4&amp;amp;thinsp;GiB in size&amp;lt;/ref&amp;gt; or exFAT file system, the firmware understands both. It&#039;s easier to use the SD card with a card reader on a newer computer to create configurations, and files. The SD card is hotplug capable, and upon reinsertation, the ZuluSCSI reinitializes itself according to the SD card&#039;s content.&lt;br /&gt;
&lt;br /&gt;
Three devices classes are of general interest in the AS/400 world:&lt;br /&gt;
* Disk (DASD),&lt;br /&gt;
* CD/DVD (Optical),&lt;br /&gt;
* Tape.&lt;br /&gt;
&lt;br /&gt;
=== Files ===&lt;br /&gt;
File names are composed as follows:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;TT&amp;gt;&amp;lt;ID&amp;gt;[any text].&amp;lt;ext&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
  ^^   ^&lt;br /&gt;
  |    +-------------- SCSI ID character (byte offset 2)&lt;br /&gt;
  +------------------- two-character type prefix (case-insensitive)&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;TT&#039;&#039;&#039;:&lt;br /&gt;
:{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!TT&lt;br /&gt;
!Device type&lt;br /&gt;
!Default block size&lt;br /&gt;
|-&lt;br /&gt;
|HD&lt;br /&gt;
|Hard disk (fixed)&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|512&amp;amp;thinsp;Bytes&lt;br /&gt;
|-&lt;br /&gt;
|CD&lt;br /&gt;
|CD-ROM (optical)&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|2048&amp;amp;thinsp;Bytes&lt;br /&gt;
|-&lt;br /&gt;
|TP&lt;br /&gt;
|Sequential (tape)&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|512&amp;amp;thinsp;Bytes&lt;br /&gt;
|}&lt;br /&gt;
* The &#039;&#039;&#039;ID&#039;&#039;&#039; is exactly one char, and must be given in hexadecimal. This matters only for IDs ≥ 10.&lt;br /&gt;
* &#039;&#039;&#039;any text&#039;&#039;&#039; is entirely optional.&lt;br /&gt;
* The &#039;&#039;&#039;file extension&#039;&#039;&#039; doesn&#039;t matter.&lt;br /&gt;
&lt;br /&gt;
=== Directories ===&lt;br /&gt;
For a device usually allowing dynamic addition and removal of media — CD-ROM-, and tape drives. The naming scheme follows the same structure as files, but &#039;&#039;[any text]&#039;&#039; must be omitted.&lt;br /&gt;
&lt;br /&gt;
Files within the directories can be freely named, and are used in alphabetical order.&amp;lt;ref&amp;gt;Either through the &#039;&#039;Eject&#039;&#039; button, or the media menu.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Configuration file ===&lt;br /&gt;
In addition, a configuration file can be supplied to provide additional information to either all or one emulated device. Having a &#039;&#039;zuluscsi.ini&#039;&#039; is normally optional, but for enabling AS/400 quirks, it&#039;s mandatory.&lt;br /&gt;
&lt;br /&gt;
The configuration file must be named &#039;&#039;zuluscsi.ini&#039;&#039;, and is in a simple ini-style format. It has a global &amp;lt;tt&amp;gt;[SCSI]&amp;lt;/tt&amp;gt; section to apply settings to all devices, and &amp;lt;tt&amp;gt;[SCSI&#039;&#039;n&#039;&#039;]&amp;lt;/tt&amp;gt;, where &#039;&#039;n&#039;&#039; is the ID of the given SCSI devices.&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
These are in the scope of AS/400.&lt;br /&gt;
&lt;br /&gt;
=== Tape drive support ===&lt;br /&gt;
* create directory &amp;lt;code&amp;gt;TP0&amp;lt;/code&amp;gt;,&lt;br /&gt;
* populate with one or more 0&amp;amp;thinsp;byte files named &amp;lt;code&amp;gt;*.tap&amp;lt;/code&amp;gt; files, e. g. by using the Unix &amp;lt;code&amp;gt;touch&amp;lt;/code&amp;gt;,&lt;br /&gt;
* use the serial console to attach image(s) to the drive.&lt;br /&gt;
* &#039;&#039;zuluscsi.ini&#039;&#039;:&lt;br /&gt;
 [SCSI]&lt;br /&gt;
 System=&amp;quot;AS400_PPC&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 [SCSI0]&lt;br /&gt;
 TapeDensity = 0x25&lt;br /&gt;
&lt;br /&gt;
Caveats:&lt;br /&gt;
* When you choose an image file through the USB port&#039;s media menu, make sure that you not only choose an image file, but afterwards &#039;&#039;insert&#039;&#039; it!&lt;br /&gt;
* If you replace a hardware tape drive, make sure to delete your old tape device file first, then IPL, check/set the new device name in DST, and have auto-configuration create the new device file during the following IPL.&lt;br /&gt;
&lt;br /&gt;
This configuration has been tested over the course of multiple weeks:&lt;br /&gt;
* Occasional &amp;lt;tt&amp;gt;go save&amp;lt;/tt&amp;gt; 21,&lt;br /&gt;
* daily differential backups,&lt;br /&gt;
* occasional single file restores.&lt;br /&gt;
&lt;br /&gt;
Tested with Firmware 2026-06-12, 9401-150, V4R5.&lt;br /&gt;
&lt;br /&gt;
=== CD drive support ===&lt;br /&gt;
* create directory &amp;lt;code&amp;gt;CD0&amp;lt;/code&amp;gt;,&lt;br /&gt;
* populate with one or more readymade ISO images,&lt;br /&gt;
* use the serial console to attach image(s) to the drive.&lt;br /&gt;
&lt;br /&gt;
No special handling for the ID in &#039;&#039;zuluscsi.ini&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Caveats:&lt;br /&gt;
* When you choose an image file through the USB port&#039;s media menu, make sure that you not only choose an image file, but afterwards &#039;&#039;insert&#039;&#039; it!&lt;br /&gt;
* If you replace a hardware CD drive, make sure to delete your old CD device file first, then IPL, check/set the new device name in DST, and have auto-configuration create the new device file during the following IPL.&lt;br /&gt;
&lt;br /&gt;
Tested with Firmware 2026-08-07, 9401-150, V4R4: IPL only so far.&lt;br /&gt;
&lt;br /&gt;
=== Disk drive support ===&lt;br /&gt;
The officially released code base is able to present a singular #6717, 8.5&amp;amp;thinsp;GiB disk drive to the system, initialize, and install SLIC + base OS/400 + LPPs + PTFs.&lt;br /&gt;
&lt;br /&gt;
* Generate disk image:&lt;br /&gt;
 dd if=/dev/zero of=HD6.img bs=522 count=17177940 status=progress&lt;br /&gt;
* &#039;&#039;zuluscsi.ini&#039;&#039;:&lt;br /&gt;
 [SCSI]&lt;br /&gt;
 System = AS400_PPC&lt;br /&gt;
&lt;br /&gt;
 [SCSI6]&lt;br /&gt;
 PrefetchBytes = 0&lt;br /&gt;
&lt;br /&gt;
Caveats:&lt;br /&gt;
* Writes to the emulated disk are very slow compared to reads.&lt;br /&gt;
* One user with a RP2040 reported failure for the disk to be recognized. Prerelease firmware solved the issue.&lt;br /&gt;
&lt;br /&gt;
Fully tested with Firmware 2026-08-21, 9401-150, V4R4.&lt;br /&gt;
&lt;br /&gt;
== Current state ==&lt;br /&gt;
We have to differ three hardware generations when considering Zulu vs. AS/400:&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&amp;amp;nbsp;&lt;br /&gt;
!CISC/IMPI, 520&amp;amp;thinsp;bytes/block disks&lt;br /&gt;
!RISC/SPD, 520/522&amp;amp;thinsp;bytes/block disks&lt;br /&gt;
!RISC/PCI, 522&amp;amp;thinsp;bytes/block disks&lt;br /&gt;
|-&lt;br /&gt;
!CD-ROM&lt;br /&gt;
|Not supported&lt;br /&gt;
|Untested&lt;br /&gt;
|Works&lt;br /&gt;
|-&lt;br /&gt;
!Tape&lt;br /&gt;
|Fails, hangs with SRC early.&lt;br /&gt;
|Untested&lt;br /&gt;
|Works&lt;br /&gt;
|-&lt;br /&gt;
!Disk&lt;br /&gt;
|Fails, hangs with SRC early.&lt;br /&gt;
|Untested&lt;br /&gt;
|Works&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
All successful tests so far have been based on a ZuluSCSI wide board, while the CISC tests have been done with a ZuluSCSI Blaster.&lt;br /&gt;
&lt;br /&gt;
== Next ==&lt;br /&gt;
These features are completed, partially tested, but did not make it to the official releases yet:&lt;br /&gt;
* More disk profiles, loadable in &#039;&#039;zuluscsi.ini&#039;&#039; via external file &#039;&#039;as400_disk_definitions.txt&#039;&#039;, so different types than the built-in 522&amp;amp;thinsp;bytes, 8.5&amp;amp;thinsp;GiB #6717 can be assigned.&lt;br /&gt;
** Shellscript to generate more &#039;&#039;as400_disk_definitions.txt&#039;&#039; entries from real disks connected to a SCSI controller when ran under Linux&lt;br /&gt;
** Because of serial numbers currently being hard coded, only one disk per type should be used&lt;br /&gt;
* Allowed more memory to accommodate the necessary VPD SCSI pages for multiple disks&lt;br /&gt;
* Present captured real tape VPD/SCSI data from IBM SLR5/QIC1000 when using &amp;lt;code&amp;gt;Device = &amp;quot;AS400_PPC&amp;quot;&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;Device = &amp;quot;AS400_CISC&amp;quot;&amp;lt;/code&amp;gt; in an ID stanza&lt;br /&gt;
&lt;br /&gt;
Currently contained in v2026.08.27-RC1.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Ordinary Harddisks on the AS/400]]&lt;br /&gt;
* [[Tape Drives on old AS/400]]&lt;br /&gt;
* [[SRC]], aka System Reference Code&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [https://zuluscsi.com ZuluSCSI Website] — see the &amp;lt;tt&amp;gt;☰&amp;lt;/tt&amp;gt; button top right for more details&lt;br /&gt;
* [https://github.com/ZuluSCSI/ZuluSCSI-firmware ZuluSCSI-firmware], GitHub&lt;br /&gt;
&lt;br /&gt;
== Footnotes ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Hardware Configuration Guide]]&lt;/div&gt;</summary>
		<author><name>PoC</name></author>
	</entry>
	<entry>
		<id>http://try-as400.pocnet.net/index.php?title=Serial_networking_scenarios_with_Cisco-Routers&amp;diff=1825</id>
		<title>Serial networking scenarios with Cisco-Routers</title>
		<link rel="alternate" type="text/html" href="http://try-as400.pocnet.net/index.php?title=Serial_networking_scenarios_with_Cisco-Routers&amp;diff=1825"/>
		<updated>2026-08-25T21:17:59Z</updated>

		<summary type="html">&lt;p&gt;PoC: /* Configuration: OS/400 (Fiona) */ Fixed inconsistency&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Sometimes, older, donated hardware comes without LAN I/O-adapters. Sometimes it has serial, synchronous capable communication I/O-adapters, though. This article shows several ways how to &amp;quot;network&amp;quot; AS/400 machines through these, with the help of (older) Cisco hard- and software, and points out pros and cons.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&#039;&#039;&#039;Note:&#039;&#039;&#039; This article is probably more about Cisco configuration than AS/400.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cisco has provided a lot of configuration options to support different networking scenarios. Emphasis is to multiplex once separated IBM SNA and PC-/Workstation based traffic onto the same physical wiring. Expectably, huge cost savings for recurring bills resulted, because expensive leased lines could now be shared.&amp;lt;br&amp;gt;&lt;br /&gt;
Decades later, the focus shifted from commercial applications to hobbyist uses, with their own set of use cases.&lt;br /&gt;
&lt;br /&gt;
Technologies exploited for the desired outcomes are:&lt;br /&gt;
* SDLC as transport protocol for SNA,&lt;br /&gt;
* X.25 as transport protocol for higher-level protocols (SNA, IP),&lt;br /&gt;
* Data Link Switching Plus (DLSw+) for transport of SNA over IP based links,&lt;br /&gt;
* Local or remote media conversion between LANs and SDLC or QLLC (X.25).&lt;br /&gt;
&lt;br /&gt;
This article does intentionally not cover SNASw, a reduced SNA &amp;quot;routing&amp;quot; stack within Cisco IOS. Depending on use case, it has proven to be awfully slow, may even crash routers in some scenarios, and may be of limited use because it&#039;s configuration is fixed as a Branch Extender (BEX) node.&lt;br /&gt;
&lt;br /&gt;
For clarity, the scenarios mentioned later always refer to two machines:&lt;br /&gt;
* An existing AS/400 with LAN attachment (Token Ring, Ethernet), already established as APPN Network Node in the local LAN. This is the 9401-150 shown on the network plan&#039;s right side. This machine&#039;s name is &#039;&#039;Nibbler&#039;&#039;.&lt;br /&gt;
* An additional machine with no LAN I/O adapters, which is meant to establish a network connection of sorts to the existing AS/400. This is the 9401-P03 shown on the network plan&#039;s left side. This machine&#039;s Name is &#039;&#039;Fiona&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Additional information is provided in the individual scenario descriptions.&lt;br /&gt;
&lt;br /&gt;
== Physical Layer Requirements ==&lt;br /&gt;
[[File:IBM 2652.jpg|thumb|right|#6152 serial IOA (SPD), located in a P02]]&lt;br /&gt;
[[File:IBM 2609.jpg|thumb|right|#2609 serial IOA (SPD), located in a P03]]&lt;br /&gt;
[[File:IBM 2609 Brick.jpg|thumb|right|2609 Breakout-Brick — note that the Cisco cable is plugged directly which is &#039;&#039;&#039;wrong&#039;&#039;&#039;, and only shown for illustrational purposes.]]&lt;br /&gt;
[[File:IBM-2720-Base-PCI-WAN-Twinaxial-IOA.jpg|thumb|right|IBM #2720 combined twinax- and serial IOA (PCI)]]&lt;br /&gt;
[[File:IBM-2721-PCI-Two-Line-WAN-IOA.jpg|thumb|right|IBM #2721 dual serial IOA (PCI)]]&lt;br /&gt;
&lt;br /&gt;
On the physical layer, some kind of serial connection is required. In earlier times, AS/400&#039;s often had an external modem, providing remote diagnostics capabilities through &#039;&#039;ECS&#039;&#039; (Electronic Customer Support), connected to a serial port. For the sake of simplicity, the AS/400 in question is assumed to already have a serial port, RS-232 style.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&#039;&#039;&#039;Note:&#039;&#039;&#039; DE-9 or DB-25 connectors directly screwed to the chassis are meant for diagnostics and UPS connection. These are &#039;&#039;&#039;not&#039;&#039;&#039; normal serial ports!&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Matching IBM V.24 Modem Cables for your particular hardware can be sourced e.&amp;amp;thinsp;g. through shops on the internet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Cable designations:&#039;&#039;&#039;&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Description&lt;br /&gt;
!Length&lt;br /&gt;
!Part Number&lt;br /&gt;
!Feature Code&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|RS232 Cable DB-25F to DB-25M&lt;br /&gt;
|valign=&amp;quot;top&amp;quot; rowspan=&amp;quot;6&amp;quot;|6.1&amp;amp;thinsp;m&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|22F0149&lt;br /&gt;
|valign=&amp;quot;top&amp;quot; rowspan=&amp;quot;3&amp;quot;|#9022&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|(Germany)&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|22F0150&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|(Japan)&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|22F0151&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|RS232 PCI Communications Cable Mini-Centronics to DB-25M&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|44H7480&lt;br /&gt;
|valign=&amp;quot;top&amp;quot; rowspan=&amp;quot;3&amp;quot;|#0348&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|(Germany)&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| 44H7482&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|(Japan)&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| 44H7484&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
There are other serial connectivity options but these are very rare.&lt;br /&gt;
&lt;br /&gt;
On the Cisco-side of affairs, just two things are necessary:&lt;br /&gt;
* Cisco 16xx, 25xx, 26xx or similar router model with T-Type serial interface (card),&lt;br /&gt;
* Cisco CAB-232 FC.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&#039;&#039;&#039;Note!&#039;&#039;&#039; It is of utmost importance to keep in mind that the AS/400 serial ports have &#039;&#039;sense pins&#039;&#039;, to know which kind of cable is attached. If you plug in an ordinary PC serial cable, and vary on the line description, you’ll eventually find the succinct message in the QSYSOPR message queue, that a cable could not be found. Therefore the requirement of an &#039;&#039;IBM V.24 Modem Cable&#039;&#039;, or a self made cable, or adapter, providing the necessary sense pin connectivity.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;For this reason, you&#039;ll need to plug the DB-25F socket connector of the Cisco cable to the modem cable, and not directly to the AS/400’s port.&#039;&#039;&#039;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It seems desirable to also provide means of Integration of serial only machinery into LANs. Cisco IOS provides functionality for such scenarios.&lt;br /&gt;
&lt;br /&gt;
== Software Requirements ==&lt;br /&gt;
Basically:&lt;br /&gt;
* Some flavor of OS/400,&lt;br /&gt;
* Cisco IOS for your particular model with a certain feature set.&lt;br /&gt;
&lt;br /&gt;
See the &#039;&#039;Cisco Feature Navigator&#039;&#039; weblink for additional information. Over a long time, Cisco has flooded the market with many different Cisco routers. They fall into broad generation groups, but there are still differences which model can (may) run which IOS feature set. Also, there is the definition of &amp;quot;officially supported&amp;quot; of &amp;quot;works&amp;quot;, and the unofficial &amp;quot;works anyway in certain scenarios&amp;quot;. Bottom line: The resulting combinations are way too many to be described here. A general rule of thumb: The bigger the image, and the more characters the classic feature set description has, the more likely it will have what you need.&lt;br /&gt;
&lt;br /&gt;
It&#039;s important to understand the roles of the different involved components.&lt;br /&gt;
* the serial-only machine &#039;&#039;Fiona&#039;&#039; is an &#039;&#039;APPN end node&#039;&#039;,&lt;br /&gt;
* the protocol to running over the serial cable is either SDLC, or X.25,&lt;br /&gt;
* the Cisco router converts the SDLC (SDLLC) or X.25 (QLLC) frames to a format being compatible with Token Ring,&lt;br /&gt;
* Fiona&#039;s APPN session terminates on &#039;&#039;Nibbler&#039;&#039;.&amp;lt;ref&amp;gt;This can be another AS/400 but is not necessarily so.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuration preparations ==&lt;br /&gt;
Obtain the resource names of the serial ports.&lt;br /&gt;
&lt;br /&gt;
On the AS/400 systems, type &amp;lt;code&amp;gt;wrkhdwrsc *cmn&amp;lt;/code&amp;gt; to get a list of communication hardware, and associated ports. Examples:&lt;br /&gt;
&lt;br /&gt;
* V3/SPD:&lt;br /&gt;
 &#039;&#039;&#039;Resource        Type  Text&#039;&#039;&#039;&lt;br /&gt;
 CMB01           917B  Combined function IOP&lt;br /&gt;
   LIN01         2609  Comm Adapter&lt;br /&gt;
     LIN011      2609  V.24 Port&lt;br /&gt;
     LIN012      2609  V.24 Port&lt;br /&gt;
&lt;br /&gt;
* V4/PCI:&lt;br /&gt;
 &#039;&#039;&#039;Resource      Type  Status                Text&#039;&#039;&#039;&lt;br /&gt;
 LIN01         2720  Operational           Comm Adapter&lt;br /&gt;
   CMN01       2720  Operational           V.24 Port   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&#039;&#039;&#039;Note!&#039;&#039;&#039; OS/400 V3 seems to not designate ports as &#039;&#039;CMN&#039;&#039;, but as &#039;&#039;LIN&#039;&#039; with three digits. Newer releases designate ports on an adapter as &#039;&#039;CMN&#039;&#039;.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On Cisco IOS, type &amp;lt;code&amp;gt;show interfaces description&amp;lt;/code&amp;gt; to get a list of interfaces. Serial interfaces are designated by starting with &#039;&#039;Se&#039;&#039;.&lt;br /&gt;
 Interface                      Status         Protocol Description&lt;br /&gt;
 Et0                            up             up&lt;br /&gt;
 Se0                            down           down&lt;br /&gt;
&lt;br /&gt;
Apart from this, components are expected to have some basic configuration settings applied:&lt;br /&gt;
* OS/400:&lt;br /&gt;
** Basic network settings reviewed in &amp;lt;code&amp;gt;dspneta&amp;lt;/code&amp;gt; and subsequently &amp;lt;code&amp;gt;chgneta&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;QAUTOCFG&amp;lt;/code&amp;gt; system variable switched to &#039;&#039;on&#039;&#039;&lt;br /&gt;
** LAN configuration established for LAN capable machines&lt;br /&gt;
* Cisco IOS:&lt;br /&gt;
** Basic settings applied&lt;br /&gt;
** Basic network configuration established&lt;br /&gt;
&lt;br /&gt;
== Scenario 1: Purely local SNA APPN connection over SDLC ==&lt;br /&gt;
[[File:AS400-SDLC-Cisco-Ring-AS400.png|frame|center|Network Plan]]&lt;br /&gt;
&lt;br /&gt;
This scenario is for when all involved components are reasonably close together physically, e.&amp;amp;thinsp;g. in the same room.&lt;br /&gt;
&lt;br /&gt;
* Pro: Fairly easy to configure, applicable to other machinery than just AS/400&#039;s,&lt;br /&gt;
* Con: Maximum speed is 19200&amp;amp;thinsp;bps.&lt;br /&gt;
&lt;br /&gt;
=== Configuration: Cisco IOS (2612) ===&lt;br /&gt;
 source-bridge ring-group 512&lt;br /&gt;
 dlsw local-peer&lt;br /&gt;
 !&lt;br /&gt;
 interface Serial0/0&lt;br /&gt;
  bandwidth 19&lt;br /&gt;
  no ip address&lt;br /&gt;
  encapsulation sdlc&lt;br /&gt;
  load-interval 60&lt;br /&gt;
  clock rate 19200&lt;br /&gt;
  sdlc role prim-xid-poll&lt;br /&gt;
  sdlc vmac 0004.acad.5900&lt;br /&gt;
  sdlc address C0&lt;br /&gt;
  sdlc partner 0004.acad.50d5 C0&lt;br /&gt;
  sdlc line-speed 19200&lt;br /&gt;
  sdlc simultaneous full-datmode&lt;br /&gt;
  sdlc dlsw C0&lt;br /&gt;
  hold-queue 128 out&lt;br /&gt;
  no shutdown&lt;br /&gt;
 !&lt;br /&gt;
 interface TokenRing0/0&lt;br /&gt;
  […]&lt;br /&gt;
  source-bridge 59 1 512&lt;br /&gt;
&lt;br /&gt;
=== Configuration: OS/400 (Fiona) ===&lt;br /&gt;
 crtctlappc ctld(nibbler) linktype(*sdlc) maxframe(1033) rmtcpname(nibbler) stnadr(c0) nodetype(*calc) tmsgrpnbr(*calc) autodltdev(*no) cmnrcylmt(10 1)&lt;br /&gt;
&lt;br /&gt;
 crtlinsdlc lind(sdlclin) rsrcname(lin011) nrzi(*no) linespeed(19200) maxframe(1033) duplex(*full) linkspeed(19200) ctl(nibbler) cmnrcylmt(10 1)&lt;br /&gt;
&lt;br /&gt;
=== Notes ===&lt;br /&gt;
* The number in &amp;lt;code&amp;gt;source-bridge ring-group 512&amp;lt;/code&amp;gt; is completely arbitrary.&lt;br /&gt;
* &amp;lt;code&amp;gt;sdlc vmac&amp;lt;/code&amp;gt; is the virtual MAC address Fiona is assigned on the Token Ring. The last byte &#039;&#039;&#039;must&#039;&#039;&#039; be 00, while IOS sets the last byte to the SDLC station address being given later.&lt;br /&gt;
* &amp;lt;code&amp;gt;sdlc address&amp;lt;/code&amp;gt; must be the same value as the &amp;lt;code&amp;gt;STNADR&amp;lt;/code&amp;gt; parameter in the controller description.&lt;br /&gt;
* &amp;lt;code&amp;gt;sdlc partner&amp;lt;/code&amp;gt; creates an association from Nibbler’s MAC address on the Token Ring to the SDLC address of Fiona.&lt;br /&gt;
* &amp;lt;code&amp;gt;clock rate&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;sdlc line-speed&amp;lt;/code&amp;gt; must match each other, and the &amp;lt;code&amp;gt;LINESPEED&amp;lt;/code&amp;gt; parameter of the line description.&lt;br /&gt;
* &amp;lt;code&amp;gt;sdlc simultaneous full-datmode&amp;lt;/code&amp;gt; corresponds (most likely&amp;lt;ref&amp;gt;There are also &#039;&#039;half-duplex&#039;&#039; and &#039;&#039;full-duplex&#039;&#039; commands to configure an interface which aren&#039;t used here.&amp;lt;/ref&amp;gt;) to the line description&#039;s &#039;&#039;DUPLEX(*FULL)&#039;&#039;.&lt;br /&gt;
* The &amp;lt;code&amp;gt;source-bridge&amp;lt;/code&amp;gt; statement in the physical Token Ring interface assigns the attached ring the number 59, designates it to the source bridge number 1, and bridges traffic to the virtual ring (group) number 512.&lt;br /&gt;
* Because auto configuration is enabled, the controller- and device descriptions for Fiona system will be created automatically at the first successful connection attempt to Nibbler.&lt;br /&gt;
&lt;br /&gt;
Unclear:&lt;br /&gt;
* How is the serial interface’s traffic redirected to the ring group 512? The group number is referenced globally, and in the Token Ring interface, which hints to the fact that you can’t use this in a complex configuration with more than one ring group, probably?&lt;br /&gt;
&lt;br /&gt;
Proven to work:&lt;br /&gt;
* Cisco 2612 with added WIC-1T, and image C2600-BINO3S3, Version 12.3(26)&lt;br /&gt;
* Cisco 1601-R, and image C1600-BNR2SY, Version 12.3(26)&lt;br /&gt;
&lt;br /&gt;
=== Initiation, and function verification ===&lt;br /&gt;
* On Fiona, vary on line and controller descriptions:&lt;br /&gt;
 vrycfg cfgobj(sdlclin) cfgtype(*lin) status(*on)&lt;br /&gt;
* After a brief pause, the Cisco console should indicate that the serial port goes up:&amp;lt;ref&amp;gt;If you’re connected remotely, make sure you’ve set &amp;lt;code&amp;gt;term moni&amp;lt;/code&amp;gt;.&amp;lt;/ref&amp;gt;&lt;br /&gt;
 %LINK-3-UPDOWN: Interface Serial0/0, changed state to up&lt;br /&gt;
 %LINEPROTO-5-UPDOWN: Line protocol on Interface Serial0/0, changed state to up&lt;br /&gt;
* On Fiona, looking into the QSYSOPR-Message Queue should show that the line has successfully been varied on, and a connection to the controller &#039;&#039;NIBBLER&#039;&#039; has been established through SDLCLIN.&lt;br /&gt;
* On the Cisco Router, you should see output of &amp;lt;code&amp;gt;show interface ser0/0&amp;lt;/code&amp;gt; similar to the following:&lt;br /&gt;
 Serial0/0 is up, line protocol is up &lt;br /&gt;
   Hardware is PowerQUICC Serial&lt;br /&gt;
   MTU 1500 bytes, BW 19 Kbit, DLY 20000 usec, &lt;br /&gt;
      reliability 255/255, txload 1/255, rxload 1/255&lt;br /&gt;
   Encapsulation SDLC, loopback not set&lt;br /&gt;
     Router link station role: PRIMARY (DCE)&lt;br /&gt;
     Router link station metrics:&lt;br /&gt;
       slow-poll not configured&lt;br /&gt;
       T1 (reply time out) 300 milliseconds&lt;br /&gt;
       N1 (max frame size) 16472 bits&lt;br /&gt;
       N2 (retry count) 7 &lt;br /&gt;
       poll-pause-timer 10 milliseconds&lt;br /&gt;
       poll-limit-value 1&lt;br /&gt;
       k (windowsize) 7&lt;br /&gt;
       modulo 8&lt;br /&gt;
       sdlc vmac: 0004.ACAD.59--&lt;br /&gt;
   sdlc addr C0 state is CONNECT&lt;br /&gt;
       cls_state is CLS_IN_SESSION&lt;br /&gt;
       VS 5, VR 6, Remote VR 5, Current retransmit count 0&lt;br /&gt;
       Hold queue: 0/200 IFRAMEs 1109/1325&lt;br /&gt;
       TESTs 0/0 XIDs 2258/19, DMs 0/0 FRMRs 0/1&lt;br /&gt;
       RNRs 1/0 SNRMs 10/0 DISC/RDs 3/1 REJs 0/0&lt;br /&gt;
       Poll: clear, Poll count: 0, ready for poll, chain: C0/C0&lt;br /&gt;
   Last input never, output 00:00:00, output hang never&lt;br /&gt;
   Last clearing of &amp;quot;show interface&amp;quot; counters 1d17h&lt;br /&gt;
   Input queue: 0/75/0/0 (size/max/drops/flushes); Total output drops: 0&lt;br /&gt;
   Queueing strategy: fifo&lt;br /&gt;
   Output queue: 0/128 (size/max)&lt;br /&gt;
   1 minute input rate 0 bits/sec, 49 packets/sec&lt;br /&gt;
   1 minute output rate 0 bits/sec, 49 packets/sec&lt;br /&gt;
      7467200 packets input, 15548792 bytes, 0 no buffer&lt;br /&gt;
      Received 0 broadcasts, 0 runts, 21 giants, 0 throttles&lt;br /&gt;
      21 input errors, 0 CRC, 0 frame, 0 overrun, 0 ignored, 0 abort&lt;br /&gt;
      7468810 packets output, 15116960 bytes, 0 underruns&lt;br /&gt;
      0 output errors, 0 collisions, 26 interface resets&lt;br /&gt;
      0 output buffer failures, 0 output buffers swapped out&lt;br /&gt;
      10 carrier transitions&lt;br /&gt;
      DCD=up  DSR=up  DTR=up  RTS=up  CTS=up&lt;br /&gt;
* On the Cisco Router, you should see output of &amp;lt;code&amp;gt;show dlsw local-circuit&amp;lt;/code&amp;gt; similar to the following:&lt;br /&gt;
  key         mac-addr    sap    state        port 	rif&lt;br /&gt;
 2197187452   0004.acad.59c0 04  CONNECTED      Se0/0 	--no rif--&lt;br /&gt;
                  PCEP: 82AB8B88  UCEP: 82F66B7C&lt;br /&gt;
           0004.acad.50d5 04  CONNECTED      To0/0 	0600.2001.03B0&lt;br /&gt;
                  PCEP: 82F511AC  UCEP: 82F66B7C&lt;br /&gt;
 &lt;br /&gt;
* On Nibbler, you should see Fiona in &amp;lt;code&amp;gt;wrkappnsts option(*loc)&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;Note that this command doesn&#039;t exist in V3.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Configuration corrections ===&lt;br /&gt;
The APPC Controller on Nibbler has been automatically created with default values. This includes &amp;lt;code&amp;gt;maxframe&amp;lt;/code&amp;gt; being set to the default for Token Ring, aka 16393&amp;amp;thinsp;Bytes. This &#039;&#039;&#039;will&#039;&#039;&#039; result in connection instabilities, if not corrected.&lt;br /&gt;
* On Fiona vary off line and controller descriptions (optional):&lt;br /&gt;
 vrycfg cfgobj(sdlclin) cfgtype(*lin) status(*off)&lt;br /&gt;
* On the Token Ring-AS/400 vary off the controller description:&lt;br /&gt;
 vrycfg cfgobj(fiona) cfgtype(*ctl) status(*off)&lt;br /&gt;
* Change configuration to match parameters:&lt;br /&gt;
 chgctlappc ctld(fiona) maxframe(1033) inlcnn(*ans) nodetype(*calc) autodltdev(*no) cmnrcylmt(10 1) ctlown(*user)&lt;br /&gt;
* I suggest to run &amp;lt;code&amp;gt;wrkctld&amp;lt;/code&amp;gt; and manually set &amp;lt;code&amp;gt;swtdsc&amp;lt;/code&amp;gt; (press F11) to &#039;&#039;*no&#039;&#039;. Otherwise, you&#039;ll get a log of unneeded messages about torn down connections. It depends on the OS release if this option shows up.&lt;br /&gt;
* Vary on configuration objects on both AS/400, starting with Nibbler.&lt;br /&gt;
 vrycfg cfgobj(fiona) cfgtype(*ctl) status(*on)&lt;br /&gt;
 vrycfg cfgobj(sdlclin) cfgtype(*lin) status(*on)&lt;br /&gt;
&lt;br /&gt;
You now should be able to enjoy a stable, albeit somewhat slow connection to your incarnation of Fiona, with each and every service running over SNA.&lt;br /&gt;
&lt;br /&gt;
== Scenario 2: Remote SNA APPN connection over SDLC and DLSw ==&lt;br /&gt;
[[File:AS400-SDLC-Cisco-DLSw-Ring-AS400.png|frame|center|Network Plan]]&lt;br /&gt;
&lt;br /&gt;
This scenario shows a configuration when connectivity between the two involved AS/400&#039;s is limited to TCP/IP, e.&amp;amp;thinsp;g. Ethernet or even WAN/VPN. An additional Router is required, here this is a Cisco 1601-R. This scenario uses DLSw transport for passing traffic between the involved routers. Otherwise, the configuration on Fiona and Nibbler is the same. Hence, this isn&#039;t repeated here.&lt;br /&gt;
&lt;br /&gt;
* Pro: Still fairly easy to configure, applicable to other machinery than just AS/400&#039;s,&lt;br /&gt;
* Con: Maximum speed is still 19200&amp;amp;thinsp;bps.&lt;br /&gt;
&lt;br /&gt;
The main differences for the Cisco configuration is the establishment of &#039;&#039;Data Link Switching&#039;&#039; (DLSw), because of this, only configuration differences are pointed out.&lt;br /&gt;
&lt;br /&gt;
=== Configuration: Cisco IOS (2612) ===&lt;br /&gt;
This one has the IP address 192.168.1.5.&lt;br /&gt;
 no dlsw local-peer&lt;br /&gt;
 source-bridge fst-peername 192.168.1.5&lt;br /&gt;
 source-bridge keepalive 12&lt;br /&gt;
 source-bridge ring-group 512&lt;br /&gt;
 dlsw local-peer peer-id 192.168.1.5 lf 1500 keepalive 12 biu-segment&lt;br /&gt;
 dlsw remote-peer 0 tcp 192.168.1.97&lt;br /&gt;
&lt;br /&gt;
=== Configuration: Cisco IOS (1601-R) ===&lt;br /&gt;
This one has the IP address 192.168.1.97.&lt;br /&gt;
 source-bridge fst-peername 192.168.1.97&lt;br /&gt;
 source-bridge keepalive 12&lt;br /&gt;
 source-bridge ring-group 512&lt;br /&gt;
 dlsw local-peer peer-id 192.168.1.97 lf 1500 keepalive 12 biu-segment&lt;br /&gt;
 dlsw remote-peer 0 tcp 192.168.1.5&lt;br /&gt;
&lt;br /&gt;
=== Notes ===&lt;br /&gt;
The purely router-local ring-group 512 has now been connected through a TCP-Session over DLSw between both involved routers.&lt;br /&gt;
&lt;br /&gt;
If both routers are located in the same L2 segment, one can use FST instead of TCP. I didn&#039;t get this to work, most likely because I&#039;m using Ethernet Subinterfaces with Vlan-Tags on my 2612.&lt;br /&gt;
&lt;br /&gt;
Proven to work:&lt;br /&gt;
* Cisco 2612 with added WIC-1T, and image C2600-BINO3S3, Version 12.3(26)&lt;br /&gt;
* Cisco 1601-R, and image C1600-BNR2SY, Version 12.3(26)&lt;br /&gt;
&lt;br /&gt;
=== Initiation, and function verification ===&lt;br /&gt;
Initiation procedure is the same as noted above.&lt;br /&gt;
&lt;br /&gt;
You should see output akin to the following for the &amp;lt;code&amp;gt;show dlsw peers&amp;lt;/code&amp;gt; command.&lt;br /&gt;
 Peers:                state     pkts_rx   pkts_tx  type  drops ckts TCP   uptime&lt;br /&gt;
  TCP 192.168.1.5     CONNECT        131       131  conf      0    1   0 00:19:47&lt;br /&gt;
 Total number of connected peers: 1&lt;br /&gt;
 Total number of connections:     1&lt;br /&gt;
&lt;br /&gt;
=== Configuration corrections ===&lt;br /&gt;
Corrections procedure is the same as noted above, if the controller description has been created automatically.&lt;br /&gt;
&lt;br /&gt;
== Scenario 3: Remote SNA APPN connection over X.25 and DLSw ==&lt;br /&gt;
[[File:AS400-X25-Cisco-DLSw-Ring-AS400.png|frame|center|Network Plan]]&lt;br /&gt;
&lt;br /&gt;
This scenario builds on the previously established DLSw scenario. The main difference is that instead of SDLC, X.25 is used as transport protocol on the serial link. All other configurations are the same.&lt;br /&gt;
&lt;br /&gt;
* Pro: Maximum speed is 64&amp;amp;thinsp;kbps, more than three times SDLC,&lt;br /&gt;
* Con: More complicated to configure, possibly not applicable to other machinery than just AS/400&#039;s&lt;br /&gt;
&lt;br /&gt;
The main differences for the Cisco configuration is the establishment of &#039;&#039;X.25&#039;&#039;, because of this, only configuration differences are pointed out.&lt;br /&gt;
&lt;br /&gt;
=== Configuration: Cisco IOS (1601-R) ===&lt;br /&gt;
First, you need to reset the serial interface to its default values, to get rid of the SDLC configuration quickly.&lt;br /&gt;
 default interface Serial0&lt;br /&gt;
&lt;br /&gt;
Next, the new configuration is established.&lt;br /&gt;
 interface Serial0&lt;br /&gt;
  description Fiona LIN011&lt;br /&gt;
  bandwidth 64&lt;br /&gt;
  no ip address&lt;br /&gt;
  encapsulation x25 dce&lt;br /&gt;
  load-interval 60&lt;br /&gt;
  x25 modulo 128&lt;br /&gt;
  x25 ltc 100&lt;br /&gt;
  x25 win 8&lt;br /&gt;
  x25 wout 8&lt;br /&gt;
  x25 ips 1024&lt;br /&gt;
  x25 ops 1024&lt;br /&gt;
  x25 pvc 1 qllc 0004.acad.59c0&lt;br /&gt;
  ignore-dcd&lt;br /&gt;
  clock rate 64000&lt;br /&gt;
  qllc dlsw pvc 1 vmacaddr 0004.acad.59c0 partner 0004.acad.50d5 &lt;br /&gt;
&lt;br /&gt;
=== Configuration: OS/400 (Fiona) ===&lt;br /&gt;
 crtlinx25 lind(x25line) rsrcname(lin011) lglchle((001 *pvc)) netadr(00000000000000) cnninit(*local) interface(*rs232v24) linespeed(19200) dftpktsize(1024) modulus(128) dftwdwsize(8) linkspeed(64000) cmnrcylmt(10 1)&lt;br /&gt;
&lt;br /&gt;
 crtctlappc ctld(nibbler) linktype(*x25) line(x25line) maxframe(1024) rmtcpname(nibbler) exchid(05641700) netlvl(1984) lglchlid(001) nodetype(*calc) tmsgrpnbr(*calc) autodltdev(*no) cmnrcylmt(10 1)&lt;br /&gt;
&lt;br /&gt;
=== Notes ===&lt;br /&gt;
* The &amp;lt;code&amp;gt;x25 pvc&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;qllc dlsw pvc 1&amp;lt;/code&amp;gt; work together to establish a virtual MAC address for the X.25 virtual circuit, and the eventual Token Ring peer.&lt;br /&gt;
* You cannot create the line description with the full speed outright due to error CPD26DC (Maximum line speed for RS-232/V.24 is 19200&amp;amp;thinsp;bps.). Create the line with &amp;lt;code&amp;gt;linespeed(19200)&amp;lt;/code&amp;gt;, and subsequently edit the lind again, setting the desired speed of 64&amp;amp;thinsp;kbps.&lt;br /&gt;
* The &#039;&#039;exchid&#039;&#039; of Nibbler can be found by viewing its line description for the Token Ring IOA.&lt;br /&gt;
&lt;br /&gt;
Proven to work:&lt;br /&gt;
* Cisco 2612 with added WIC-1T, and image C2600-BINO3S3, Version 12.3(26)&lt;br /&gt;
* Cisco 1601-R, and image C1600-BNR2SY, Version 12.3(26)&lt;br /&gt;
&lt;br /&gt;
=== Initiation, and function verification ===&lt;br /&gt;
Initiation procedure is the same as noted above.&lt;br /&gt;
&lt;br /&gt;
You should see output akin to the following for the &amp;lt;code&amp;gt;show x25 interface serial0&amp;lt;/code&amp;gt; command.&lt;br /&gt;
 PVC 1,  State: D1,  Interface: Serial0&lt;br /&gt;
   Started 00:20:54, last input 00:10:30, output 00:10:31&lt;br /&gt;
      qllc 0004.acad.59c0&lt;br /&gt;
   Window size input: 8, output: 8&lt;br /&gt;
   Packet size input: 1024, output: 1024&lt;br /&gt;
   PS: 80  PR: 80  ACK: 79  Remote PR: 80  RCNT: 1  RNR: no&lt;br /&gt;
   P/D state timeouts: 0  timer (secs): 0&lt;br /&gt;
   data bytes 21173/110662 packets 208/209 Resets 1/0 RNRs 0/0 REJs 0/0 INTs 0/0&lt;br /&gt;
&lt;br /&gt;
You should see output akin to the following for the &amp;lt;code&amp;gt;show qllc serial0&amp;lt;/code&amp;gt; command.&lt;br /&gt;
 Interface Serial0&lt;br /&gt;
  vc 1&lt;br /&gt;
    Circuit State P4/D1, Logical Link State QLOpened 0004.acad.59c0(04)-&amp;gt;0004.acad.50d5(04)&lt;br /&gt;
    0 packets held &lt;br /&gt;
&lt;br /&gt;
=== Configuration corrections ===&lt;br /&gt;
Corrections procedure is the same as noted for Scenario 1, if the controller description has been created automatically.&lt;br /&gt;
&lt;br /&gt;
== Scenario 3a: IP over X.25 ==&lt;br /&gt;
This scenario builds on the previously established X.25 scenario. It adds TCP/IP transport over a secondary X.25 virtual circuit.&lt;br /&gt;
&lt;br /&gt;
* 192.168.1.246 is the IP address for Fiona,&lt;br /&gt;
* 192.168.1.245 is the IP address for the Cisco 1601-R.&lt;br /&gt;
&lt;br /&gt;
=== Configuration: Cisco IOS (1601-R) ===&lt;br /&gt;
Only parameters to be changed are mentioned.&lt;br /&gt;
 interface Serial0&lt;br /&gt;
  ip address 192.168.1.245 255.255.255.252&lt;br /&gt;
  x25 pvc 2 ip 192.168.1.246&lt;br /&gt;
&lt;br /&gt;
=== Configuration: OS/400 (Fiona) ===&lt;br /&gt;
First, you need to add another virtual circuit to the line description. You can&#039;t do that remotely, because you must vary off the line.&lt;br /&gt;
 vrycfg cfgobj(x25lin011) cfgtype(*lin) status(*off)&lt;br /&gt;
 chglinx25 lind(x25line) lglchle((001 *pvc) (002 *pvc))&lt;br /&gt;
 vrycfg cfgobj(x25lin011) cfgtype(*lin) status(*on)&lt;br /&gt;
&lt;br /&gt;
Then you can add the according TCP/IP interface configuration.&lt;br /&gt;
 addtcpifc intnetadr(&#039;192.168.1.246&#039;) lind(x25line) subnetmask(&#039;255.255.255.252&#039;) mtu(1024) pvclglchli(002)&lt;br /&gt;
 addtcprte rtedest(*dftroute) subnetmask(*none) nexthop(&#039;192.168.1.245&#039;) mtu(1024)&lt;br /&gt;
 addtcprsi intnetadr(&#039;192.168.1.245&#039;) pvclglchli(002)&lt;br /&gt;
&lt;br /&gt;
=== Notes ===&lt;br /&gt;
Proven to work:&lt;br /&gt;
* Cisco 1601-R, and image C1600-BNR2SY, Version 12.3(26)&lt;br /&gt;
&lt;br /&gt;
=== Initiation, and function verification ===&lt;br /&gt;
Depending on if you have started TCP/IP before, you need to issue either &amp;lt;code&amp;gt;strtcp&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;strtcpifc intnetadr(&#039;192.168.1.246&#039;)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
You should see output akin to the following for the &amp;lt;code&amp;gt;show x25 interface serial0&amp;lt;/code&amp;gt; command.&lt;br /&gt;
 PVC 1,  State: D1,  Interface: Serial0&lt;br /&gt;
   Started 03:07:34, last input 00:09:47, output 00:09:47&lt;br /&gt;
      qllc 0004.acad.59c0&lt;br /&gt;
   Window size input: 8, output: 8&lt;br /&gt;
   Packet size input: 1024, output: 1024&lt;br /&gt;
   PS: 122  PR: 36  ACK: 35  Remote PR: 122  RCNT: 1  RNR: no&lt;br /&gt;
   P/D state timeouts: 0  timer (secs): 0&lt;br /&gt;
   data bytes 2915564/2073274 packets 3733/2832 Resets 3/0 RNRs 0/0 REJs 0/0 INTs 0/0&lt;br /&gt;
 PVC 2,  State: D1,  Interface: Serial0&lt;br /&gt;
   Started 00:22:29, last input 00:18:33, output 00:18:33&lt;br /&gt;
   Connects &amp;lt;no address&amp;gt; &amp;lt;-&amp;gt; ip 192.168.59.246&lt;br /&gt;
   Data PID none&lt;br /&gt;
   Window size input: 8, output: 8&lt;br /&gt;
   Packet size input: 1024, output: 1024&lt;br /&gt;
   PS: 29  PR: 24  ACK: 23  Remote PR: 29  RCNT: 1  RNR: no&lt;br /&gt;
   P/D state timeouts: 0  timer (secs): 0&lt;br /&gt;
   data bytes 1965/1917 packets 29/24 Resets 0/1 RNRs 0/0 REJs 0/0 INTs 0/0&lt;br /&gt;
&lt;br /&gt;
=== Configuration corrections ===&lt;br /&gt;
How to establish routing within your local LAN for the example subnet being described above is not within the scope of this article.&lt;br /&gt;
&lt;br /&gt;
Also, issue &amp;lt;code&amp;gt;go cfgtcp&amp;lt;/code&amp;gt;, and check/correct configurations, such as DNS information, services to be started at IPL time, etc.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Serial Cables IDs]]&lt;br /&gt;
* [[RS-232 Modem Cable Pinout]]&lt;br /&gt;
* [[Integrating LAN-less Machines into a local Token Ring]]&lt;br /&gt;
* [[Configuring X.25 link through Cisco IP network]]&lt;br /&gt;
* [[Configuring TCP/IP and SLIP with Cisco-Router and V3R2]]&lt;br /&gt;
* [[Start TCP/IP at IPL]]&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [https://en.wikipedia.org/wiki/RS-232#Timing_signals RS-232 timing signals], Wikipedia&lt;br /&gt;
* [https://www.cisco.com/c/en/us/support/docs/routers/10000-series-routers/46800-cab232mtfc.html#cab-232fc Serial Cable CAB-232FC], Cisco.com&lt;br /&gt;
* [https://cfnng.cisco.com/archived-data Cisco Feature Navigator], Cisco.com&lt;br /&gt;
* [https://www.cisco.com/c/en/us/td/docs/ios/bridging/configuration/guide/15-s/br-15-s-book/br_dlsw_plus.html#wp1075136 DLSw+ translation between SDLC and Token Ring media example], Cisco.com&lt;br /&gt;
* [https://en.wikipedia.org/wiki/RS-232#Timing_signals RS-232 timing signals], Wikipedia&lt;br /&gt;
* [https://www.cisco.com/c/en/us/td/docs/ios/bridging/configuration/guide/15SY/br_15_sy_book.html Bridging and IBM Networking Configuration Guide], Cisco IOS Release 15SY&lt;br /&gt;
* [https://website.fis.agh.edu.pl/complab/doc/Cisco_IOS_11.0/cbook/cx25.htm Configuring X.25 and LAPB] on Cisco IOS, Faculty of Physics and Applied Computer Science Poland&amp;lt;ref&amp;gt;Very old documentation linked intentionally. Note: The configuration option &#039;&#039;tunnel&#039;&#039; was renamed to &#039;&#039;xot&#039;&#039; in newer IOS releases.&amp;lt;/ref&amp;gt;&lt;br /&gt;
* [https://public.dhe.ibm.com/systems/power/docs/systemi/v6r1/en_US/sc415405.pdf X.25 Network Support] for OS/400, IBM.com&lt;br /&gt;
&lt;br /&gt;
== Footnotes ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Acknowledgements ==&lt;br /&gt;
Thanks to Dave Brown for initial pointers.&lt;br /&gt;
&lt;br /&gt;
[[Category: Hardware Configuration Guide‏]]&lt;br /&gt;
[[Category: Software Configuration Guide‏]]&lt;/div&gt;</summary>
		<author><name>PoC</name></author>
	</entry>
	<entry>
		<id>http://try-as400.pocnet.net/index.php?title=ZuluSCSI&amp;diff=1824</id>
		<title>ZuluSCSI</title>
		<link rel="alternate" type="text/html" href="http://try-as400.pocnet.net/index.php?title=ZuluSCSI&amp;diff=1824"/>
		<updated>2026-08-25T11:40:00Z</updated>

		<summary type="html">&lt;p&gt;PoC: /* Disk drive support */ Caveat added&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;ZuluSCSI&#039;&#039;&#039; by Rabbit Hole Computing is a comparatively new family of SCSI device emulators featuring an SD card based backing store. Distinct features to older, similar devices is support for Wide-SCSI, Ultra-Speed, and a fast CPU.&lt;br /&gt;
&lt;br /&gt;
ZuluSCSI also features an OpenSource firmware, so it can be extended comparatively easily.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
For most AS/400 machines, you actually want a ZuluSCSI wide, because it offers the best performance.&lt;br /&gt;
&lt;br /&gt;
The ZuluSCSI firmware can emulate multiple devices at once. There is no real need to add multiple Zulus to a given SCSI bus. One Zulu can easily saturate even the UltraWide SCSI bus of a 9401-150, and due to the SD card, delays are minimal. You can gain more performance with bigger machines, if they have multiple SCSI buses, though.&lt;br /&gt;
&lt;br /&gt;
== Hardware overview ==&lt;br /&gt;
Depending on the exact model, boards themselves have three DIP switches and tiny push buttons:&lt;br /&gt;
* 1: switch to initator mode,&lt;br /&gt;
* 2: enable debug log,&lt;br /&gt;
* 3: enable SCSI termination.&lt;br /&gt;
&lt;br /&gt;
The push buttons call the functions:&lt;br /&gt;
* Bootloader, for firmware-recovery,&lt;br /&gt;
* Eject.&lt;br /&gt;
&lt;br /&gt;
Also, three LEDs are provided, for indication of&lt;br /&gt;
* 2.8&amp;amp;thinsp;V power OK,&lt;br /&gt;
* 3.3&amp;amp;thinsp;V power OK,&lt;br /&gt;
* SD-card activity.&lt;br /&gt;
&lt;br /&gt;
The device itself needs 5&amp;amp;thinsp;V power, and can be powered by:&lt;br /&gt;
* the USB port,&lt;br /&gt;
* the termpower line of the SCSI bus,&lt;br /&gt;
* molex style power connectors.&lt;br /&gt;
&lt;br /&gt;
Usually, the integrated USB port is configured as USB modem, for usage with a terminal emulator. You can use the Linux or macOS &#039;&#039;screen&#039;&#039; command for that. Depending on your operating system, you need to find out what device file is created when plugging the Zulu&#039;s USB port. On Linux, it&#039;s &amp;lt;tt&amp;gt;/dev/ttyACM&#039;&#039;n&#039;&#039;&amp;lt;/tt&amp;gt; — &#039;&#039;n&#039;&#039; being a digit, usually 0. On macOS, it&#039;s &amp;lt;tt&amp;gt;/dev/tty.usbmodem*&amp;lt;/tt&amp;gt;, with a row of digits appended on behalf of the &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The firmware presents a simple menu driven UI for some tasks.&lt;br /&gt;
&lt;br /&gt;
There is no need to shut down the device itself, it&#039;s safe to &amp;quot;pull the plug&amp;quot; when there is no activity. The Operating System running on the attached computer should, though.&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
Configuration itself is usually automatic, according to the files and directories found on the SD card. The SD card has either a FAT32&amp;lt;ref&amp;gt;Limiting files to max. 4&amp;amp;thinsp;GiB in size&amp;lt;/ref&amp;gt; or exFAT file system, the firmware understands both. It&#039;s easier to use the SD card with a card reader on a newer computer to create configurations, and files. The SD card is hotplug capable, and upon reinsertation, the ZuluSCSI reinitializes itself according to the SD card&#039;s content.&lt;br /&gt;
&lt;br /&gt;
Three devices classes are of general interest in the AS/400 world:&lt;br /&gt;
* Disk (DASD),&lt;br /&gt;
* CD/DVD (Optical),&lt;br /&gt;
* Tape.&lt;br /&gt;
&lt;br /&gt;
=== Files ===&lt;br /&gt;
File names are composed as follows:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;TT&amp;gt;&amp;lt;ID&amp;gt;[any text].&amp;lt;ext&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
  ^^   ^&lt;br /&gt;
  |    +-------------- SCSI ID character (byte offset 2)&lt;br /&gt;
  +------------------- two-character type prefix (case-insensitive)&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;TT&#039;&#039;&#039;:&lt;br /&gt;
:{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!TT&lt;br /&gt;
!Device type&lt;br /&gt;
!Default block size&lt;br /&gt;
|-&lt;br /&gt;
|HD&lt;br /&gt;
|Hard disk (fixed)&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|512&amp;amp;thinsp;Bytes&lt;br /&gt;
|-&lt;br /&gt;
|CD&lt;br /&gt;
|CD-ROM (optical)&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|2048&amp;amp;thinsp;Bytes&lt;br /&gt;
|-&lt;br /&gt;
|TP&lt;br /&gt;
|Sequential (tape)&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|512&amp;amp;thinsp;Bytes&lt;br /&gt;
|}&lt;br /&gt;
* The &#039;&#039;&#039;ID&#039;&#039;&#039; is exactly one char, and must be given in hexadecimal. This matters only for IDs ≥ 10.&lt;br /&gt;
* &#039;&#039;&#039;any text&#039;&#039;&#039; is entirely optional.&lt;br /&gt;
* The &#039;&#039;&#039;file extension&#039;&#039;&#039; doesn&#039;t matter.&lt;br /&gt;
&lt;br /&gt;
=== Directories ===&lt;br /&gt;
For a device usually allowing dynamic addition and removal of media — CD-ROM-, and tape drives. The naming scheme follows the same structure as files, but &#039;&#039;[any text]&#039;&#039; must be omitted.&lt;br /&gt;
&lt;br /&gt;
Files within the directories can be freely named, and are used in alphabetical order.&amp;lt;ref&amp;gt;Either through the &#039;&#039;Eject&#039;&#039; button, or the media menu.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Configuration file ===&lt;br /&gt;
In addition, a configuration file can be supplied to provide additional information to either all or one emulated device. Having a &#039;&#039;zuluscsi.ini&#039;&#039; is normally optional, but for enabling AS/400 quirks, it&#039;s mandatory.&lt;br /&gt;
&lt;br /&gt;
The configuration file must be named &#039;&#039;zuluscsi.ini&#039;&#039;, and is in a simple ini-style format. It has a global &amp;lt;tt&amp;gt;[SCSI]&amp;lt;/tt&amp;gt; section to apply settings to all devices, and &amp;lt;tt&amp;gt;[SCSI&#039;&#039;n&#039;&#039;]&amp;lt;/tt&amp;gt;, where &#039;&#039;n&#039;&#039; is the ID of the given SCSI devices.&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
These are in the scope of AS/400.&lt;br /&gt;
&lt;br /&gt;
=== Tape drive support ===&lt;br /&gt;
* create directory &amp;lt;code&amp;gt;TP0&amp;lt;/code&amp;gt;,&lt;br /&gt;
* populate with one or more 0&amp;amp;thinsp;byte files named &amp;lt;code&amp;gt;*.tap&amp;lt;/code&amp;gt; files, e. g. by using the Unix &amp;lt;code&amp;gt;touch&amp;lt;/code&amp;gt;,&lt;br /&gt;
* use the serial console to attach image(s) to the drive.&lt;br /&gt;
* &#039;&#039;zuluscsi.ini&#039;&#039;:&lt;br /&gt;
 [SCSI]&lt;br /&gt;
 System=&amp;quot;AS400_PPC&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 [SCSI0]&lt;br /&gt;
 TapeDensity = 0x25&lt;br /&gt;
&lt;br /&gt;
Caveats:&lt;br /&gt;
* When you choose an image file through the USB port&#039;s media menu, make sure that you not only choose an image file, but afterwards &#039;&#039;insert&#039;&#039; it!&lt;br /&gt;
* If you replace a hardware tape drive, make sure to delete your old tape device file first, then IPL, check/set the new device name in DST, and have auto-configuration create the new device file during the following IPL.&lt;br /&gt;
&lt;br /&gt;
This configuration has been tested over the course of multiple weeks:&lt;br /&gt;
* Occasional &amp;lt;tt&amp;gt;go save&amp;lt;/tt&amp;gt; 21,&lt;br /&gt;
* daily differential backups,&lt;br /&gt;
* occasional single file restores.&lt;br /&gt;
&lt;br /&gt;
Tested with Firmware 2026-06-12, 9401-150, V4R5.&lt;br /&gt;
&lt;br /&gt;
=== CD drive support ===&lt;br /&gt;
* create directory &amp;lt;code&amp;gt;CD0&amp;lt;/code&amp;gt;,&lt;br /&gt;
* populate with one or more readymade ISO images,&lt;br /&gt;
* use the serial console to attach image(s) to the drive.&lt;br /&gt;
&lt;br /&gt;
No special handling for the ID in &#039;&#039;zuluscsi.ini&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Caveats:&lt;br /&gt;
* When you choose an image file through the USB port&#039;s media menu, make sure that you not only choose an image file, but afterwards &#039;&#039;insert&#039;&#039; it!&lt;br /&gt;
* If you replace a hardware CD drive, make sure to delete your old CD device file first, then IPL, check/set the new device name in DST, and have auto-configuration create the new device file during the following IPL.&lt;br /&gt;
&lt;br /&gt;
Tested with Firmware 2026-08-07, 9401-150, V4R4: IPL only so far.&lt;br /&gt;
&lt;br /&gt;
=== Disk drive support ===&lt;br /&gt;
The officially released code base is able to present a singular #6717, 8.5&amp;amp;thinsp;GiB disk drive to the system, initialize, and install SLIC + base OS/400 + LPPs + PTFs.&lt;br /&gt;
&lt;br /&gt;
* Generate disk image:&lt;br /&gt;
 dd if=/dev/zero of=HD6.img bs=522 count=17177940 status=progress&lt;br /&gt;
* &#039;&#039;zuluscsi.ini&#039;&#039;:&lt;br /&gt;
 [SCSI]&lt;br /&gt;
 System = AS400_PPC&lt;br /&gt;
&lt;br /&gt;
 [SCSI6]&lt;br /&gt;
 PrefetchBytes = 0&lt;br /&gt;
&lt;br /&gt;
Caveats:&lt;br /&gt;
* Writes to the emulated disk are very slow compared to reads.&lt;br /&gt;
* One user with a RP2040 reported failure for the disk to be recognized. Prerelease firmware solved the issue.&lt;br /&gt;
&lt;br /&gt;
Fully tested with Firmware 2026-08-21, 9401-150, V4R4.&lt;br /&gt;
&lt;br /&gt;
== Current state ==&lt;br /&gt;
We have to differ three hardware generations when considering Zulu vs. AS/400:&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&amp;amp;nbsp;&lt;br /&gt;
!CISC/IMPI, 520&amp;amp;thinsp;bytes/block disks&lt;br /&gt;
!RISC/SPD, 520/522&amp;amp;thinsp;bytes/block disks&lt;br /&gt;
!RISC/PCI, 522&amp;amp;thinsp;bytes/block disks&lt;br /&gt;
|-&lt;br /&gt;
!CD-ROM&lt;br /&gt;
|Not supported&lt;br /&gt;
|Untested&lt;br /&gt;
|Works&lt;br /&gt;
|-&lt;br /&gt;
!Tape&lt;br /&gt;
|Fails, hangs with SRC early.&lt;br /&gt;
|Untested&lt;br /&gt;
|Works&lt;br /&gt;
|-&lt;br /&gt;
!Disk&lt;br /&gt;
|Fails, hangs with SRC early.&lt;br /&gt;
|Untested&lt;br /&gt;
|Works&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
All successful tests so far have been based on a ZuluSCSI wide board, while the CISC tests have been done with a ZuluSCSI Blaster.&lt;br /&gt;
&lt;br /&gt;
== Next ==&lt;br /&gt;
These features are completed, partially tested, but did not make it to the official releases yet:&lt;br /&gt;
* More disk profiles, loadable in &#039;&#039;zuluscsi.ini&#039;&#039; via external file &#039;&#039;as400_disk_definitions.txt&#039;&#039;, so different types than the built-in 522&amp;amp;thinsp;bytes, 8.5&amp;amp;thinsp;GiB #6717 can be assigned.&lt;br /&gt;
** Shellscript to generate more &#039;&#039;as400_disk_definitions.txt&#039;&#039; entries from real disks connected to a SCSI controller when ran under Linux&lt;br /&gt;
** Because of serial numbers currently being hard coded, only one disk per type should be used&lt;br /&gt;
* Allowed more memory to accommodate the necessary VPD SCSI pages for multiple disks&lt;br /&gt;
* Present captured real tape VPD/SCSI data from IBM SLR5/QIC1000 when using &amp;lt;code&amp;gt;Device = &amp;quot;AS400_PPC&amp;quot;&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;Device = &amp;quot;AS400_CISC&amp;quot;&amp;lt;/code&amp;gt; in an ID stanza&lt;br /&gt;
* Created a new build profile for the ZuluSCSI Blaster, removing all the add-on code being unneeded when used with AS/400&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Ordinary Harddisks on the AS/400]]&lt;br /&gt;
* [[Tape Drives on old AS/400]]&lt;br /&gt;
* [[SRC]], aka System Reference Code&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [https://zuluscsi.com ZuluSCSI Website] — see the &amp;lt;tt&amp;gt;☰&amp;lt;/tt&amp;gt; button top right for more details&lt;br /&gt;
* [https://github.com/ZuluSCSI/ZuluSCSI-firmware ZuluSCSI-firmware], GitHub&lt;br /&gt;
&lt;br /&gt;
== Footnotes ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Hardware Configuration Guide]]&lt;/div&gt;</summary>
		<author><name>PoC</name></author>
	</entry>
	<entry>
		<id>http://try-as400.pocnet.net/index.php?title=ZuluSCSI&amp;diff=1823</id>
		<title>ZuluSCSI</title>
		<link rel="alternate" type="text/html" href="http://try-as400.pocnet.net/index.php?title=ZuluSCSI&amp;diff=1823"/>
		<updated>2026-08-25T10:45:14Z</updated>

		<summary type="html">&lt;p&gt;PoC: Next&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;ZuluSCSI&#039;&#039;&#039; by Rabbit Hole Computing is a comparatively new family of SCSI device emulators featuring an SD card based backing store. Distinct features to older, similar devices is support for Wide-SCSI, Ultra-Speed, and a fast CPU.&lt;br /&gt;
&lt;br /&gt;
ZuluSCSI also features an OpenSource firmware, so it can be extended comparatively easily.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
For most AS/400 machines, you actually want a ZuluSCSI wide, because it offers the best performance.&lt;br /&gt;
&lt;br /&gt;
The ZuluSCSI firmware can emulate multiple devices at once. There is no real need to add multiple Zulus to a given SCSI bus. One Zulu can easily saturate even the UltraWide SCSI bus of a 9401-150, and due to the SD card, delays are minimal. You can gain more performance with bigger machines, if they have multiple SCSI buses, though.&lt;br /&gt;
&lt;br /&gt;
== Hardware overview ==&lt;br /&gt;
Depending on the exact model, boards themselves have three DIP switches and tiny push buttons:&lt;br /&gt;
* 1: switch to initator mode,&lt;br /&gt;
* 2: enable debug log,&lt;br /&gt;
* 3: enable SCSI termination.&lt;br /&gt;
&lt;br /&gt;
The push buttons call the functions:&lt;br /&gt;
* Bootloader, for firmware-recovery,&lt;br /&gt;
* Eject.&lt;br /&gt;
&lt;br /&gt;
Also, three LEDs are provided, for indication of&lt;br /&gt;
* 2.8&amp;amp;thinsp;V power OK,&lt;br /&gt;
* 3.3&amp;amp;thinsp;V power OK,&lt;br /&gt;
* SD-card activity.&lt;br /&gt;
&lt;br /&gt;
The device itself needs 5&amp;amp;thinsp;V power, and can be powered by:&lt;br /&gt;
* the USB port,&lt;br /&gt;
* the termpower line of the SCSI bus,&lt;br /&gt;
* molex style power connectors.&lt;br /&gt;
&lt;br /&gt;
Usually, the integrated USB port is configured as USB modem, for usage with a terminal emulator. You can use the Linux or macOS &#039;&#039;screen&#039;&#039; command for that. Depending on your operating system, you need to find out what device file is created when plugging the Zulu&#039;s USB port. On Linux, it&#039;s &amp;lt;tt&amp;gt;/dev/ttyACM&#039;&#039;n&#039;&#039;&amp;lt;/tt&amp;gt; — &#039;&#039;n&#039;&#039; being a digit, usually 0. On macOS, it&#039;s &amp;lt;tt&amp;gt;/dev/tty.usbmodem*&amp;lt;/tt&amp;gt;, with a row of digits appended on behalf of the &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The firmware presents a simple menu driven UI for some tasks.&lt;br /&gt;
&lt;br /&gt;
There is no need to shut down the device itself, it&#039;s safe to &amp;quot;pull the plug&amp;quot; when there is no activity. The Operating System running on the attached computer should, though.&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
Configuration itself is usually automatic, according to the files and directories found on the SD card. The SD card has either a FAT32&amp;lt;ref&amp;gt;Limiting files to max. 4&amp;amp;thinsp;GiB in size&amp;lt;/ref&amp;gt; or exFAT file system, the firmware understands both. It&#039;s easier to use the SD card with a card reader on a newer computer to create configurations, and files. The SD card is hotplug capable, and upon reinsertation, the ZuluSCSI reinitializes itself according to the SD card&#039;s content.&lt;br /&gt;
&lt;br /&gt;
Three devices classes are of general interest in the AS/400 world:&lt;br /&gt;
* Disk (DASD),&lt;br /&gt;
* CD/DVD (Optical),&lt;br /&gt;
* Tape.&lt;br /&gt;
&lt;br /&gt;
=== Files ===&lt;br /&gt;
File names are composed as follows:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;TT&amp;gt;&amp;lt;ID&amp;gt;[any text].&amp;lt;ext&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
  ^^   ^&lt;br /&gt;
  |    +-------------- SCSI ID character (byte offset 2)&lt;br /&gt;
  +------------------- two-character type prefix (case-insensitive)&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;TT&#039;&#039;&#039;:&lt;br /&gt;
:{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!TT&lt;br /&gt;
!Device type&lt;br /&gt;
!Default block size&lt;br /&gt;
|-&lt;br /&gt;
|HD&lt;br /&gt;
|Hard disk (fixed)&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|512&amp;amp;thinsp;Bytes&lt;br /&gt;
|-&lt;br /&gt;
|CD&lt;br /&gt;
|CD-ROM (optical)&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|2048&amp;amp;thinsp;Bytes&lt;br /&gt;
|-&lt;br /&gt;
|TP&lt;br /&gt;
|Sequential (tape)&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|512&amp;amp;thinsp;Bytes&lt;br /&gt;
|}&lt;br /&gt;
* The &#039;&#039;&#039;ID&#039;&#039;&#039; is exactly one char, and must be given in hexadecimal. This matters only for IDs ≥ 10.&lt;br /&gt;
* &#039;&#039;&#039;any text&#039;&#039;&#039; is entirely optional.&lt;br /&gt;
* The &#039;&#039;&#039;file extension&#039;&#039;&#039; doesn&#039;t matter.&lt;br /&gt;
&lt;br /&gt;
=== Directories ===&lt;br /&gt;
For a device usually allowing dynamic addition and removal of media — CD-ROM-, and tape drives. The naming scheme follows the same structure as files, but &#039;&#039;[any text]&#039;&#039; must be omitted.&lt;br /&gt;
&lt;br /&gt;
Files within the directories can be freely named, and are used in alphabetical order.&amp;lt;ref&amp;gt;Either through the &#039;&#039;Eject&#039;&#039; button, or the media menu.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Configuration file ===&lt;br /&gt;
In addition, a configuration file can be supplied to provide additional information to either all or one emulated device. Having a &#039;&#039;zuluscsi.ini&#039;&#039; is normally optional, but for enabling AS/400 quirks, it&#039;s mandatory.&lt;br /&gt;
&lt;br /&gt;
The configuration file must be named &#039;&#039;zuluscsi.ini&#039;&#039;, and is in a simple ini-style format. It has a global &amp;lt;tt&amp;gt;[SCSI]&amp;lt;/tt&amp;gt; section to apply settings to all devices, and &amp;lt;tt&amp;gt;[SCSI&#039;&#039;n&#039;&#039;]&amp;lt;/tt&amp;gt;, where &#039;&#039;n&#039;&#039; is the ID of the given SCSI devices.&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
These are in the scope of AS/400.&lt;br /&gt;
&lt;br /&gt;
=== Tape drive support ===&lt;br /&gt;
* create directory &amp;lt;code&amp;gt;TP0&amp;lt;/code&amp;gt;,&lt;br /&gt;
* populate with one or more 0&amp;amp;thinsp;byte files named &amp;lt;code&amp;gt;*.tap&amp;lt;/code&amp;gt; files, e. g. by using the Unix &amp;lt;code&amp;gt;touch&amp;lt;/code&amp;gt;,&lt;br /&gt;
* use the serial console to attach image(s) to the drive.&lt;br /&gt;
* &#039;&#039;zuluscsi.ini&#039;&#039;:&lt;br /&gt;
 [SCSI]&lt;br /&gt;
 System=&amp;quot;AS400_PPC&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 [SCSI0]&lt;br /&gt;
 TapeDensity = 0x25&lt;br /&gt;
&lt;br /&gt;
Caveats:&lt;br /&gt;
* When you choose an image file through the USB port&#039;s media menu, make sure that you not only choose an image file, but afterwards &#039;&#039;insert&#039;&#039; it!&lt;br /&gt;
* If you replace a hardware tape drive, make sure to delete your old tape device file first, then IPL, check/set the new device name in DST, and have auto-configuration create the new device file during the following IPL.&lt;br /&gt;
&lt;br /&gt;
This configuration has been tested over the course of multiple weeks:&lt;br /&gt;
* Occasional &amp;lt;tt&amp;gt;go save&amp;lt;/tt&amp;gt; 21,&lt;br /&gt;
* daily differential backups,&lt;br /&gt;
* occasional single file restores.&lt;br /&gt;
&lt;br /&gt;
Tested with Firmware 2026-06-12, 9401-150, V4R5.&lt;br /&gt;
&lt;br /&gt;
=== CD drive support ===&lt;br /&gt;
* create directory &amp;lt;code&amp;gt;CD0&amp;lt;/code&amp;gt;,&lt;br /&gt;
* populate with one or more readymade ISO images,&lt;br /&gt;
* use the serial console to attach image(s) to the drive.&lt;br /&gt;
&lt;br /&gt;
No special handling for the ID in &#039;&#039;zuluscsi.ini&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Caveats:&lt;br /&gt;
* When you choose an image file through the USB port&#039;s media menu, make sure that you not only choose an image file, but afterwards &#039;&#039;insert&#039;&#039; it!&lt;br /&gt;
* If you replace a hardware CD drive, make sure to delete your old CD device file first, then IPL, check/set the new device name in DST, and have auto-configuration create the new device file during the following IPL.&lt;br /&gt;
&lt;br /&gt;
Tested with Firmware 2026-08-07, 9401-150, V4R4: IPL only so far.&lt;br /&gt;
&lt;br /&gt;
=== Disk drive support ===&lt;br /&gt;
The officially released code base is able to present a singular #6717, 8.5&amp;amp;thinsp;GiB disk drive to the system, initialize, and install SLIC + base OS/400 + LPPs + PTFs.&lt;br /&gt;
&lt;br /&gt;
* Generate disk image:&lt;br /&gt;
 dd if=/dev/zero of=HD6.img bs=522 count=17177940 status=progress&lt;br /&gt;
* &#039;&#039;zuluscsi.ini&#039;&#039;:&lt;br /&gt;
 [SCSI]&lt;br /&gt;
 System = AS400_PPC&lt;br /&gt;
&lt;br /&gt;
 [SCSI6]&lt;br /&gt;
 PrefetchBytes = 0&lt;br /&gt;
&lt;br /&gt;
Caveats:&lt;br /&gt;
* Writes to the emulated disk are very slow compared to reads.&lt;br /&gt;
&lt;br /&gt;
Fully tested with Firmware 2026-08-21, 9401-150, V4R4.&lt;br /&gt;
&lt;br /&gt;
== Current state ==&lt;br /&gt;
We have to differ three hardware generations when considering Zulu vs. AS/400:&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&amp;amp;nbsp;&lt;br /&gt;
!CISC/IMPI, 520&amp;amp;thinsp;bytes/block disks&lt;br /&gt;
!RISC/SPD, 520/522&amp;amp;thinsp;bytes/block disks&lt;br /&gt;
!RISC/PCI, 522&amp;amp;thinsp;bytes/block disks&lt;br /&gt;
|-&lt;br /&gt;
!CD-ROM&lt;br /&gt;
|Not supported&lt;br /&gt;
|Untested&lt;br /&gt;
|Works&lt;br /&gt;
|-&lt;br /&gt;
!Tape&lt;br /&gt;
|Fails, hangs with SRC early.&lt;br /&gt;
|Untested&lt;br /&gt;
|Works&lt;br /&gt;
|-&lt;br /&gt;
!Disk&lt;br /&gt;
|Fails, hangs with SRC early.&lt;br /&gt;
|Untested&lt;br /&gt;
|Works&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
All successful tests so far have been based on a ZuluSCSI wide board, while the CISC tests have been done with a ZuluSCSI Blaster.&lt;br /&gt;
&lt;br /&gt;
== Next ==&lt;br /&gt;
These features are completed, partially tested, but did not make it to the official releases yet:&lt;br /&gt;
* More disk profiles, loadable in &#039;&#039;zuluscsi.ini&#039;&#039; via external file &#039;&#039;as400_disk_definitions.txt&#039;&#039;, so different types than the built-in 522&amp;amp;thinsp;bytes, 8.5&amp;amp;thinsp;GiB #6717 can be assigned.&lt;br /&gt;
** Shellscript to generate more &#039;&#039;as400_disk_definitions.txt&#039;&#039; entries from real disks connected to a SCSI controller when ran under Linux&lt;br /&gt;
** Because of serial numbers currently being hard coded, only one disk per type should be used&lt;br /&gt;
* Allowed more memory to accommodate the necessary VPD SCSI pages for multiple disks&lt;br /&gt;
* Present captured real tape VPD/SCSI data from IBM SLR5/QIC1000 when using &amp;lt;code&amp;gt;Device = &amp;quot;AS400_PPC&amp;quot;&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;Device = &amp;quot;AS400_CISC&amp;quot;&amp;lt;/code&amp;gt; in an ID stanza&lt;br /&gt;
* Created a new build profile for the ZuluSCSI Blaster, removing all the add-on code being unneeded when used with AS/400&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Ordinary Harddisks on the AS/400]]&lt;br /&gt;
* [[Tape Drives on old AS/400]]&lt;br /&gt;
* [[SRC]], aka System Reference Code&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [https://zuluscsi.com ZuluSCSI Website] — see the &amp;lt;tt&amp;gt;☰&amp;lt;/tt&amp;gt; button top right for more details&lt;br /&gt;
* [https://github.com/ZuluSCSI/ZuluSCSI-firmware ZuluSCSI-firmware], GitHub&lt;br /&gt;
&lt;br /&gt;
== Footnotes ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Hardware Configuration Guide]]&lt;/div&gt;</summary>
		<author><name>PoC</name></author>
	</entry>
	<entry>
		<id>http://try-as400.pocnet.net/index.php?title=ZuluSCSI&amp;diff=1822</id>
		<title>ZuluSCSI</title>
		<link rel="alternate" type="text/html" href="http://try-as400.pocnet.net/index.php?title=ZuluSCSI&amp;diff=1822"/>
		<updated>2026-08-25T10:21:23Z</updated>

		<summary type="html">&lt;p&gt;PoC: /* Examples */ Disk support&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;ZuluSCSI&#039;&#039;&#039; by Rabbit Hole Computing is a comparatively new family of SCSI device emulators featuring an SD card based backing store. Distinct features to older, similar devices is support for Wide-SCSI, Ultra-Speed, and a fast CPU.&lt;br /&gt;
&lt;br /&gt;
ZuluSCSI also features an OpenSource firmware, so it can be extended comparatively easily.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
For most AS/400 machines, you actually want a ZuluSCSI wide, because it offers the best performance.&lt;br /&gt;
&lt;br /&gt;
The ZuluSCSI firmware can emulate multiple devices at once. There is no real need to add multiple Zulus to a given SCSI bus. One Zulu can easily saturate even the UltraWide SCSI bus of a 9401-150, and due to the SD card, delays are minimal. You can gain more performance with bigger machines, if they have multiple SCSI buses, though.&lt;br /&gt;
&lt;br /&gt;
== Hardware overview ==&lt;br /&gt;
Depending on the exact model, boards themselves have three DIP switches and tiny push buttons:&lt;br /&gt;
* 1: switch to initator mode,&lt;br /&gt;
* 2: enable debug log,&lt;br /&gt;
* 3: enable SCSI termination.&lt;br /&gt;
&lt;br /&gt;
The push buttons call the functions:&lt;br /&gt;
* Bootloader, for firmware-recovery,&lt;br /&gt;
* Eject.&lt;br /&gt;
&lt;br /&gt;
Also, three LEDs are provided, for indication of&lt;br /&gt;
* 2.8&amp;amp;thinsp;V power OK,&lt;br /&gt;
* 3.3&amp;amp;thinsp;V power OK,&lt;br /&gt;
* SD-card activity.&lt;br /&gt;
&lt;br /&gt;
The device itself needs 5&amp;amp;thinsp;V power, and can be powered by:&lt;br /&gt;
* the USB port,&lt;br /&gt;
* the termpower line of the SCSI bus,&lt;br /&gt;
* molex style power connectors.&lt;br /&gt;
&lt;br /&gt;
Usually, the integrated USB port is configured as USB modem, for usage with a terminal emulator. You can use the Linux or macOS &#039;&#039;screen&#039;&#039; command for that. Depending on your operating system, you need to find out what device file is created when plugging the Zulu&#039;s USB port. On Linux, it&#039;s &amp;lt;tt&amp;gt;/dev/ttyACM&#039;&#039;n&#039;&#039;&amp;lt;/tt&amp;gt; — &#039;&#039;n&#039;&#039; being a digit, usually 0. On macOS, it&#039;s &amp;lt;tt&amp;gt;/dev/tty.usbmodem*&amp;lt;/tt&amp;gt;, with a row of digits appended on behalf of the &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The firmware presents a simple menu driven UI for some tasks.&lt;br /&gt;
&lt;br /&gt;
There is no need to shut down the device itself, it&#039;s safe to &amp;quot;pull the plug&amp;quot; when there is no activity. The Operating System running on the attached computer should, though.&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
Configuration itself is usually automatic, according to the files and directories found on the SD card. The SD card has either a FAT32&amp;lt;ref&amp;gt;Limiting files to max. 4&amp;amp;thinsp;GiB in size&amp;lt;/ref&amp;gt; or exFAT file system, the firmware understands both. It&#039;s easier to use the SD card with a card reader on a newer computer to create configurations, and files. The SD card is hotplug capable, and upon reinsertation, the ZuluSCSI reinitializes itself according to the SD card&#039;s content.&lt;br /&gt;
&lt;br /&gt;
Three devices classes are of general interest in the AS/400 world:&lt;br /&gt;
* Disk (DASD),&lt;br /&gt;
* CD/DVD (Optical),&lt;br /&gt;
* Tape.&lt;br /&gt;
&lt;br /&gt;
=== Files ===&lt;br /&gt;
File names are composed as follows:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;TT&amp;gt;&amp;lt;ID&amp;gt;[any text].&amp;lt;ext&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
  ^^   ^&lt;br /&gt;
  |    +-------------- SCSI ID character (byte offset 2)&lt;br /&gt;
  +------------------- two-character type prefix (case-insensitive)&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;TT&#039;&#039;&#039;:&lt;br /&gt;
:{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!TT&lt;br /&gt;
!Device type&lt;br /&gt;
!Default block size&lt;br /&gt;
|-&lt;br /&gt;
|HD&lt;br /&gt;
|Hard disk (fixed)&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|512&amp;amp;thinsp;Bytes&lt;br /&gt;
|-&lt;br /&gt;
|CD&lt;br /&gt;
|CD-ROM (optical)&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|2048&amp;amp;thinsp;Bytes&lt;br /&gt;
|-&lt;br /&gt;
|TP&lt;br /&gt;
|Sequential (tape)&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|512&amp;amp;thinsp;Bytes&lt;br /&gt;
|}&lt;br /&gt;
* The &#039;&#039;&#039;ID&#039;&#039;&#039; is exactly one char, and must be given in hexadecimal. This matters only for IDs ≥ 10.&lt;br /&gt;
* &#039;&#039;&#039;any text&#039;&#039;&#039; is entirely optional.&lt;br /&gt;
* The &#039;&#039;&#039;file extension&#039;&#039;&#039; doesn&#039;t matter.&lt;br /&gt;
&lt;br /&gt;
=== Directories ===&lt;br /&gt;
For a device usually allowing dynamic addition and removal of media — CD-ROM-, and tape drives. The naming scheme follows the same structure as files, but &#039;&#039;[any text]&#039;&#039; must be omitted.&lt;br /&gt;
&lt;br /&gt;
Files within the directories can be freely named, and are used in alphabetical order.&amp;lt;ref&amp;gt;Either through the &#039;&#039;Eject&#039;&#039; button, or the media menu.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Configuration file ===&lt;br /&gt;
In addition, a configuration file can be supplied to provide additional information to either all or one emulated device. Having a &#039;&#039;zuluscsi.ini&#039;&#039; is normally optional, but for enabling AS/400 quirks, it&#039;s mandatory.&lt;br /&gt;
&lt;br /&gt;
The configuration file must be named &#039;&#039;zuluscsi.ini&#039;&#039;, and is in a simple ini-style format. It has a global &amp;lt;tt&amp;gt;[SCSI]&amp;lt;/tt&amp;gt; section to apply settings to all devices, and &amp;lt;tt&amp;gt;[SCSI&#039;&#039;n&#039;&#039;]&amp;lt;/tt&amp;gt;, where &#039;&#039;n&#039;&#039; is the ID of the given SCSI devices.&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
These are in the scope of AS/400.&lt;br /&gt;
&lt;br /&gt;
=== Tape drive support ===&lt;br /&gt;
* create directory &amp;lt;code&amp;gt;TP0&amp;lt;/code&amp;gt;,&lt;br /&gt;
* populate with one or more 0&amp;amp;thinsp;byte files named &amp;lt;code&amp;gt;*.tap&amp;lt;/code&amp;gt; files, e. g. by using the Unix &amp;lt;code&amp;gt;touch&amp;lt;/code&amp;gt;,&lt;br /&gt;
* use the serial console to attach image(s) to the drive.&lt;br /&gt;
* &#039;&#039;zuluscsi.ini&#039;&#039;:&lt;br /&gt;
 [SCSI]&lt;br /&gt;
 System=&amp;quot;AS400_PPC&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 [SCSI0]&lt;br /&gt;
 TapeDensity = 0x25&lt;br /&gt;
&lt;br /&gt;
Caveats:&lt;br /&gt;
* When you choose an image file through the USB port&#039;s media menu, make sure that you not only choose an image file, but afterwards &#039;&#039;insert&#039;&#039; it!&lt;br /&gt;
* If you replace a hardware tape drive, make sure to delete your old tape device file first, then IPL, check/set the new device name in DST, and have auto-configuration create the new device file during the following IPL.&lt;br /&gt;
&lt;br /&gt;
This configuration has been tested over the course of multiple weeks:&lt;br /&gt;
* Occasional &amp;lt;tt&amp;gt;go save&amp;lt;/tt&amp;gt; 21,&lt;br /&gt;
* daily differential backups,&lt;br /&gt;
* occasional single file restores.&lt;br /&gt;
&lt;br /&gt;
Tested with Firmware 2026-06-12, 9401-150, V4R5.&lt;br /&gt;
&lt;br /&gt;
=== CD drive support ===&lt;br /&gt;
* create directory &amp;lt;code&amp;gt;CD0&amp;lt;/code&amp;gt;,&lt;br /&gt;
* populate with one or more readymade ISO images,&lt;br /&gt;
* use the serial console to attach image(s) to the drive.&lt;br /&gt;
&lt;br /&gt;
No special handling for the ID in &#039;&#039;zuluscsi.ini&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Caveats:&lt;br /&gt;
* When you choose an image file through the USB port&#039;s media menu, make sure that you not only choose an image file, but afterwards &#039;&#039;insert&#039;&#039; it!&lt;br /&gt;
* If you replace a hardware CD drive, make sure to delete your old CD device file first, then IPL, check/set the new device name in DST, and have auto-configuration create the new device file during the following IPL.&lt;br /&gt;
&lt;br /&gt;
Tested with Firmware 2026-08-07, 9401-150, V4R4: IPL only so far.&lt;br /&gt;
&lt;br /&gt;
=== Disk drive support ===&lt;br /&gt;
The officially released code base is able to present a singular #6717, 8.5&amp;amp;thinsp;GiB disk drive to the system, initialize, and install SLIC + base OS/400 + LPPs + PTFs.&lt;br /&gt;
&lt;br /&gt;
* Generate disk image:&lt;br /&gt;
 dd if=/dev/zero of=HD6.img bs=522 count=17177940 status=progress&lt;br /&gt;
* &#039;&#039;zuluscsi.ini&#039;&#039;:&lt;br /&gt;
 [SCSI]&lt;br /&gt;
 System = AS400_PPC&lt;br /&gt;
&lt;br /&gt;
 [SCSI6]&lt;br /&gt;
 PrefetchBytes = 0&lt;br /&gt;
&lt;br /&gt;
Caveats:&lt;br /&gt;
* Writes to the emulated disk are very slow compared to reads.&lt;br /&gt;
&lt;br /&gt;
Fully tested with Firmware 2026-08-21, 9401-150, V4R4.&lt;br /&gt;
&lt;br /&gt;
== Current state ==&lt;br /&gt;
We have to differ three hardware generations when considering Zulu vs. AS/400:&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&amp;amp;nbsp;&lt;br /&gt;
!CISC/IMPI, 520&amp;amp;thinsp;bytes/block disks&lt;br /&gt;
!RISC/SPD, 520/522&amp;amp;thinsp;bytes/block disks&lt;br /&gt;
!RISC/PCI, 522&amp;amp;thinsp;bytes/block disks&lt;br /&gt;
|-&lt;br /&gt;
!CD-ROM&lt;br /&gt;
|Not supported&lt;br /&gt;
|Untested&lt;br /&gt;
|Works&lt;br /&gt;
|-&lt;br /&gt;
!Tape&lt;br /&gt;
|Fails, hangs with SRC early.&lt;br /&gt;
|Untested&lt;br /&gt;
|Works&lt;br /&gt;
|-&lt;br /&gt;
!Disk&lt;br /&gt;
|Fails, hangs with SRC early.&lt;br /&gt;
|Untested&lt;br /&gt;
|Works&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
All successful tests so far have been based on a ZuluSCSI wide board, while the CISC tests have been done with a ZuluSCSI Blaster.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Ordinary Harddisks on the AS/400]]&lt;br /&gt;
* [[Tape Drives on old AS/400]]&lt;br /&gt;
* [[SRC]], aka System Reference Code&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [https://zuluscsi.com ZuluSCSI Website] — see the &amp;lt;tt&amp;gt;☰&amp;lt;/tt&amp;gt; button top right for more details&lt;br /&gt;
* [https://github.com/ZuluSCSI/ZuluSCSI-firmware ZuluSCSI-firmware], GitHub&lt;br /&gt;
&lt;br /&gt;
== Footnotes ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Hardware Configuration Guide]]&lt;/div&gt;</summary>
		<author><name>PoC</name></author>
	</entry>
	<entry>
		<id>http://try-as400.pocnet.net/index.php?title=ZuluSCSI&amp;diff=1821</id>
		<title>ZuluSCSI</title>
		<link rel="alternate" type="text/html" href="http://try-as400.pocnet.net/index.php?title=ZuluSCSI&amp;diff=1821"/>
		<updated>2026-08-25T10:08:52Z</updated>

		<summary type="html">&lt;p&gt;PoC: /* Current state */ Reworked&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;ZuluSCSI&#039;&#039;&#039; by Rabbit Hole Computing is a comparatively new family of SCSI device emulators featuring an SD card based backing store. Distinct features to older, similar devices is support for Wide-SCSI, Ultra-Speed, and a fast CPU.&lt;br /&gt;
&lt;br /&gt;
ZuluSCSI also features an OpenSource firmware, so it can be extended comparatively easily.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
For most AS/400 machines, you actually want a ZuluSCSI wide, because it offers the best performance.&lt;br /&gt;
&lt;br /&gt;
The ZuluSCSI firmware can emulate multiple devices at once. There is no real need to add multiple Zulus to a given SCSI bus. One Zulu can easily saturate even the UltraWide SCSI bus of a 9401-150, and due to the SD card, delays are minimal. You can gain more performance with bigger machines, if they have multiple SCSI buses, though.&lt;br /&gt;
&lt;br /&gt;
== Hardware overview ==&lt;br /&gt;
Depending on the exact model, boards themselves have three DIP switches and tiny push buttons:&lt;br /&gt;
* 1: switch to initator mode,&lt;br /&gt;
* 2: enable debug log,&lt;br /&gt;
* 3: enable SCSI termination.&lt;br /&gt;
&lt;br /&gt;
The push buttons call the functions:&lt;br /&gt;
* Bootloader, for firmware-recovery,&lt;br /&gt;
* Eject.&lt;br /&gt;
&lt;br /&gt;
Also, three LEDs are provided, for indication of&lt;br /&gt;
* 2.8&amp;amp;thinsp;V power OK,&lt;br /&gt;
* 3.3&amp;amp;thinsp;V power OK,&lt;br /&gt;
* SD-card activity.&lt;br /&gt;
&lt;br /&gt;
The device itself needs 5&amp;amp;thinsp;V power, and can be powered by:&lt;br /&gt;
* the USB port,&lt;br /&gt;
* the termpower line of the SCSI bus,&lt;br /&gt;
* molex style power connectors.&lt;br /&gt;
&lt;br /&gt;
Usually, the integrated USB port is configured as USB modem, for usage with a terminal emulator. You can use the Linux or macOS &#039;&#039;screen&#039;&#039; command for that. Depending on your operating system, you need to find out what device file is created when plugging the Zulu&#039;s USB port. On Linux, it&#039;s &amp;lt;tt&amp;gt;/dev/ttyACM&#039;&#039;n&#039;&#039;&amp;lt;/tt&amp;gt; — &#039;&#039;n&#039;&#039; being a digit, usually 0. On macOS, it&#039;s &amp;lt;tt&amp;gt;/dev/tty.usbmodem*&amp;lt;/tt&amp;gt;, with a row of digits appended on behalf of the &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The firmware presents a simple menu driven UI for some tasks.&lt;br /&gt;
&lt;br /&gt;
There is no need to shut down the device itself, it&#039;s safe to &amp;quot;pull the plug&amp;quot; when there is no activity. The Operating System running on the attached computer should, though.&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
Configuration itself is usually automatic, according to the files and directories found on the SD card. The SD card has either a FAT32&amp;lt;ref&amp;gt;Limiting files to max. 4&amp;amp;thinsp;GiB in size&amp;lt;/ref&amp;gt; or exFAT file system, the firmware understands both. It&#039;s easier to use the SD card with a card reader on a newer computer to create configurations, and files. The SD card is hotplug capable, and upon reinsertation, the ZuluSCSI reinitializes itself according to the SD card&#039;s content.&lt;br /&gt;
&lt;br /&gt;
Three devices classes are of general interest in the AS/400 world:&lt;br /&gt;
* Disk (DASD),&lt;br /&gt;
* CD/DVD (Optical),&lt;br /&gt;
* Tape.&lt;br /&gt;
&lt;br /&gt;
=== Files ===&lt;br /&gt;
File names are composed as follows:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;TT&amp;gt;&amp;lt;ID&amp;gt;[any text].&amp;lt;ext&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
  ^^   ^&lt;br /&gt;
  |    +-------------- SCSI ID character (byte offset 2)&lt;br /&gt;
  +------------------- two-character type prefix (case-insensitive)&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;TT&#039;&#039;&#039;:&lt;br /&gt;
:{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!TT&lt;br /&gt;
!Device type&lt;br /&gt;
!Default block size&lt;br /&gt;
|-&lt;br /&gt;
|HD&lt;br /&gt;
|Hard disk (fixed)&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|512&amp;amp;thinsp;Bytes&lt;br /&gt;
|-&lt;br /&gt;
|CD&lt;br /&gt;
|CD-ROM (optical)&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|2048&amp;amp;thinsp;Bytes&lt;br /&gt;
|-&lt;br /&gt;
|TP&lt;br /&gt;
|Sequential (tape)&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|512&amp;amp;thinsp;Bytes&lt;br /&gt;
|}&lt;br /&gt;
* The &#039;&#039;&#039;ID&#039;&#039;&#039; is exactly one char, and must be given in hexadecimal. This matters only for IDs ≥ 10.&lt;br /&gt;
* &#039;&#039;&#039;any text&#039;&#039;&#039; is entirely optional.&lt;br /&gt;
* The &#039;&#039;&#039;file extension&#039;&#039;&#039; doesn&#039;t matter.&lt;br /&gt;
&lt;br /&gt;
=== Directories ===&lt;br /&gt;
For a device usually allowing dynamic addition and removal of media — CD-ROM-, and tape drives. The naming scheme follows the same structure as files, but &#039;&#039;[any text]&#039;&#039; must be omitted.&lt;br /&gt;
&lt;br /&gt;
Files within the directories can be freely named, and are used in alphabetical order.&amp;lt;ref&amp;gt;Either through the &#039;&#039;Eject&#039;&#039; button, or the media menu.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Configuration file ===&lt;br /&gt;
In addition, a configuration file can be supplied to provide additional information to either all or one emulated device. Having a &#039;&#039;zuluscsi.ini&#039;&#039; is normally optional, but for enabling AS/400 quirks, it&#039;s mandatory.&lt;br /&gt;
&lt;br /&gt;
The configuration file must be named &#039;&#039;zuluscsi.ini&#039;&#039;, and is in a simple ini-style format. It has a global &amp;lt;tt&amp;gt;[SCSI]&amp;lt;/tt&amp;gt; section to apply settings to all devices, and &amp;lt;tt&amp;gt;[SCSI&#039;&#039;n&#039;&#039;]&amp;lt;/tt&amp;gt;, where &#039;&#039;n&#039;&#039; is the ID of the given SCSI devices.&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
These are in the scope of AS/400.&lt;br /&gt;
&lt;br /&gt;
=== Tape drive support ===&lt;br /&gt;
* create directory &amp;lt;code&amp;gt;TP0&amp;lt;/code&amp;gt;,&lt;br /&gt;
* populate with one or more 0&amp;amp;thinsp;byte files named &amp;lt;code&amp;gt;*.tap&amp;lt;/code&amp;gt; files, e. g. by using the Unix &amp;lt;code&amp;gt;touch&amp;lt;/code&amp;gt;,&lt;br /&gt;
* use the serial console to attach image(s) to the drive.&lt;br /&gt;
* &#039;&#039;zuluscsi.ini&#039;&#039;:&lt;br /&gt;
 [SCSI]&lt;br /&gt;
 System=&amp;quot;AS400_PPC&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 [SCSI0]&lt;br /&gt;
 TapeDensity = 0x25&lt;br /&gt;
&lt;br /&gt;
Caveats:&lt;br /&gt;
* When you choose an image file through the USB port&#039;s media menu, make sure that you not only choose an image file, but afterwards &#039;&#039;insert&#039;&#039; it!&lt;br /&gt;
* If you replace a hardware tape drive, make sure to delete your old tape device file first, then IPL, check/set the new device name in DST, and have auto-configuration create the new device file during the following IPL.&lt;br /&gt;
&lt;br /&gt;
This configuration has been tested over the course of multiple weeks:&lt;br /&gt;
* Occasional &amp;lt;tt&amp;gt;go save&amp;lt;/tt&amp;gt; 21,&lt;br /&gt;
* daily differential backups,&lt;br /&gt;
* occasional single file restores.&lt;br /&gt;
&lt;br /&gt;
Tested with Firmware 2026-06-12, 9401-150, V4R5.&lt;br /&gt;
&lt;br /&gt;
=== CD drive support ===&lt;br /&gt;
* create directory &amp;lt;code&amp;gt;CD0&amp;lt;/code&amp;gt;,&lt;br /&gt;
* populate with one or more readymade ISO images,&lt;br /&gt;
* use the serial console to attach image(s) to the drive.&lt;br /&gt;
&lt;br /&gt;
No special handling for the ID in &#039;&#039;zuluscsi.ini&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Caveats:&lt;br /&gt;
* When you choose an image file through the USB port&#039;s media menu, make sure that you not only choose an image file, but afterwards &#039;&#039;insert&#039;&#039; it!&lt;br /&gt;
* If you replace a hardware CD drive, make sure to delete your old CD device file first, then IPL, check/set the new device name in DST, and have auto-configuration create the new device file during the following IPL.&lt;br /&gt;
&lt;br /&gt;
Tested with Firmware 2026-08-07, 9401-150, V4R4: IPL only so far.&lt;br /&gt;
&lt;br /&gt;
== Current state ==&lt;br /&gt;
We have to differ three hardware generations when considering Zulu vs. AS/400:&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&amp;amp;nbsp;&lt;br /&gt;
!CISC/IMPI, 520&amp;amp;thinsp;bytes/block disks&lt;br /&gt;
!RISC/SPD, 520/522&amp;amp;thinsp;bytes/block disks&lt;br /&gt;
!RISC/PCI, 522&amp;amp;thinsp;bytes/block disks&lt;br /&gt;
|-&lt;br /&gt;
!CD-ROM&lt;br /&gt;
|Not supported&lt;br /&gt;
|Untested&lt;br /&gt;
|Works&lt;br /&gt;
|-&lt;br /&gt;
!Tape&lt;br /&gt;
|Fails, hangs with SRC early.&lt;br /&gt;
|Untested&lt;br /&gt;
|Works&lt;br /&gt;
|-&lt;br /&gt;
!Disk&lt;br /&gt;
|Fails, hangs with SRC early.&lt;br /&gt;
|Untested&lt;br /&gt;
|Works&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
All successful tests so far have been based on a ZuluSCSI wide board, while the CISC tests have been done with a ZuluSCSI Blaster.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Ordinary Harddisks on the AS/400]]&lt;br /&gt;
* [[Tape Drives on old AS/400]]&lt;br /&gt;
* [[SRC]], aka System Reference Code&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [https://zuluscsi.com ZuluSCSI Website] — see the &amp;lt;tt&amp;gt;☰&amp;lt;/tt&amp;gt; button top right for more details&lt;br /&gt;
* [https://github.com/ZuluSCSI/ZuluSCSI-firmware ZuluSCSI-firmware], GitHub&lt;br /&gt;
&lt;br /&gt;
== Footnotes ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Hardware Configuration Guide]]&lt;/div&gt;</summary>
		<author><name>PoC</name></author>
	</entry>
	<entry>
		<id>http://try-as400.pocnet.net/index.php?title=Post-Install_Optimizations&amp;diff=1820</id>
		<title>Post-Install Optimizations</title>
		<link rel="alternate" type="text/html" href="http://try-as400.pocnet.net/index.php?title=Post-Install_Optimizations&amp;diff=1820"/>
		<updated>2026-08-22T16:02:13Z</updated>

		<summary type="html">&lt;p&gt;PoC: PTF handling&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;OS/400 provides a lot of default values for variables (affecting the run-time environment) and program options. Some of these make sense, some of them are kept consistent with earlier versions of the OS because of compatibility reasons by IBM.&lt;br /&gt;
&lt;br /&gt;
Some of these recommendations might not be appropriate for you by various reasons. Don&#039;t apply blindly. Know what you do, use the online help to retrieve background information on the topic in question.&lt;br /&gt;
&lt;br /&gt;
The findings below are based on V4R5 with annotated exceptions for newer releases.&lt;br /&gt;
&lt;br /&gt;
== Housekeeping ==&lt;br /&gt;
These are settings and scheduled jobs to keep your system uncluttered.&lt;br /&gt;
&lt;br /&gt;
=== Change unneeded programs to not run ===&lt;br /&gt;
We most likely don&#039;t need to run &#039;&#039;lpd&#039;&#039; and &#039;&#039;smtpd&#039;&#039; to run per default.&lt;br /&gt;
 CHGLPDA    AUTOSTART(*NO)&lt;br /&gt;
 CHGSMTPA   AUTOSTART(*NO)&lt;br /&gt;
&lt;br /&gt;
You can easily check all settings at once by using &amp;lt;code&amp;gt;UPDDTA QUSRSYS/QATOCSTART&amp;lt;/code&amp;gt;. These are not needed in general.&lt;br /&gt;
* *DIRSRV&lt;br /&gt;
* *NETSVR&lt;br /&gt;
* *SLP&lt;br /&gt;
&lt;br /&gt;
Depending on OS version, not all entries may be available.&lt;br /&gt;
&lt;br /&gt;
=== Change uninstalled programs to not run ===&lt;br /&gt;
If you did not install the Ultimedia package, you can remove the pre started job from the QSYSWRK subsystem description to make it not generate an error message at IPL time.&lt;br /&gt;
 RMVPJE SBSD(QSYSWRK) PGM(QUMEDIA/QUMBPJTC)&lt;br /&gt;
&lt;br /&gt;
If you did not install the Directory Services package (aka LDAP), you can remove the auto started jobs from the QSYSWRK subsystem description to make them not generate an error message at IPL time.&lt;br /&gt;
 RMVAJE SBSD(QSYSWRK) JOB(QGLDPUBA)&lt;br /&gt;
 RMVAJE SBSD(QSYSWRK) JOB(QGLDPUBE)&lt;br /&gt;
&lt;br /&gt;
Both is valid and tested for V4R5. Note that newer releases moved the background jobs to the base OS so there is no error message when starting them. I have not tested if they&#039;re required to run, though.&lt;br /&gt;
&lt;br /&gt;
If you did not install the performance tools, you don&#039;t need trying to start the performance data collector:&lt;br /&gt;
 RMVAJE SBSD(QCTL) JOB(QPFRCOL)&lt;br /&gt;
&lt;br /&gt;
I can&#039;t remember if the latter is valid for V4R5. It&#039;s valid for V3R2, though.&lt;br /&gt;
&lt;br /&gt;
=== Cleanup unneeded stuff ===&lt;br /&gt;
These objects come by default at OS install time, are not needed to my knowledge, and thus can be safely deleted:&lt;br /&gt;
 DLTOUTQ    OUTQ(QDKT)&lt;br /&gt;
 DLTOUTQ    OUTQ(QPFROUTQ)&lt;br /&gt;
 DLTOUTQ    OUTQ(QPRINTS)&lt;br /&gt;
 DLTF       FILE(QPRINTS)&lt;br /&gt;
 DLTOUTQ    OUTQ(QPRINT2)&lt;br /&gt;
 DLTF       FILE(QPRINT2)&lt;br /&gt;
 DLTOUTQ    OUTQ(QTPPPOUTQ)&lt;br /&gt;
 DLTDEVD    DEVD(QESPAP)&lt;br /&gt;
 DLTDEVD    DEVD(QIADSP)&lt;br /&gt;
 DLTDEVD    DEVD(QIAPRT)&lt;br /&gt;
 DLTDEVD    DEVD(QQAHOST)&lt;br /&gt;
 DLTDEVD    DEVD(QTIDA)&lt;br /&gt;
 DLTDEVD    DEVD(QTIDA2)&lt;br /&gt;
 DLTCTLD    CTLD(QESCTL)&lt;br /&gt;
 DLTCTLD    CTLD(QTICTL)&lt;br /&gt;
 DLTLIND    LIND(QESLINE)&lt;br /&gt;
 DLTLIND    LIND(QTILINE)&lt;br /&gt;
&lt;br /&gt;
== System Values ==&lt;br /&gt;
System values are like environment variables as known from common operating systems. They influence system operation. I recommend the following changes.&lt;br /&gt;
&lt;br /&gt;
=== System Control ===&lt;br /&gt;
* Change work environment to separate subsystems for different kind of jobs. This also makes it easy to introduce your own subsystems.&lt;br /&gt;
 CHGSYSVAL SYSVAL(QCTLSBSD) VALUE(&#039;QCTL QSYS&#039;)&lt;br /&gt;
* Set automatic DST adjustment, and UTC offset. This value is valid for Central Europe (Berlin, Paris, …) &#039;&#039;&#039;Note!&#039;&#039;&#039; This variable is not available in V4R5. See [[#Weblinks|Weblinks]] below.&lt;br /&gt;
 CHGSYSVAL SYSVAL(QTIMZON) VALUE(&#039;QP0100CET2&#039;)&lt;br /&gt;
* Adjust time to automatically end disconnected interactive jobs (sessions) to one day.&lt;br /&gt;
 CHGSYSVAL SYSVAL(QDSCJOBITV) VALUE(&#039;1440&#039;)&lt;br /&gt;
&lt;br /&gt;
=== (Memory) Allocation ===&lt;br /&gt;
* Adjust automatic performance values only at runtime, not at IPL.&amp;lt;ref&amp;gt;If you change the amount of memory for the machine, temporarily adjust the value to &#039;2&#039;, make the memory change and then change the value back to &#039;3&#039; — no further IPL needed.&amp;lt;/ref&amp;gt; This allows the system to automatically adjust memory allocations and activity levels to minimize paging (disk I/O).&lt;br /&gt;
 CHGSYSVAL SYSVAL(QPFRADJ) VALUE(&#039;3&#039;)&lt;br /&gt;
* Allow memory pools to self adjust the paging block size depending on jobs running. This is called &#039;&#039;Expert Cache&#039;&#039;. You can adjust the maximum active jobs per pool in the &amp;lt;code&amp;gt;WRKSHRPOOL&amp;lt;/code&amp;gt; display.&amp;lt;ref&amp;gt;Press &amp;lt;code&amp;gt;F21&amp;lt;/code&amp;gt; to switch to view 2 or 3 to have adjustment possibilities.&amp;lt;/ref&amp;gt;&lt;br /&gt;
 CHGSHRPOOL POOL(*BASE) PAGING(*CALC)&lt;br /&gt;
 CHGSHRPOOL POOL(*INTERACT) PAGING(*CALC)&lt;br /&gt;
 CHGSHRPOOL POOL(*SPOOL) PAGING(*CALC)&lt;br /&gt;
* Reservations for job related data structures at IPL time. See &amp;lt;code&amp;gt;DSPSYSSTS&amp;lt;/code&amp;gt; and set to slightly more than the &#039;&#039;Jobs in System&#039;&#039; value to be seen there when the system is working &amp;quot;normal&amp;quot;.&amp;lt;ref&amp;gt;Press &amp;lt;code&amp;gt;F21&amp;lt;/code&amp;gt; to switch to view 2 or 3 to see the overall job count.&amp;lt;/ref&amp;gt;&lt;br /&gt;
 CHGSYSVAL SYSVAL(QTOTJOB) VALUE(100)&lt;br /&gt;
* Reservations for job related data structures at IPL time. See &amp;lt;code&amp;gt;WRKACTJOB&amp;lt;/code&amp;gt; and set to slightly more than the &#039;&#039;Active Jobs&#039;&#039; value to be seen there when the system is working &amp;quot;normal&amp;quot;.&lt;br /&gt;
 CHGSYSVAL SYSVAL(QACTJOB) VALUE(95)&lt;br /&gt;
* Maximize TCP buffers for maximum performance, especially on faster links.&lt;br /&gt;
 CHGTCPA TCPRCVBUF(8388608) TCPSNDBUF(8388608)&lt;br /&gt;
* Make sure, database tasks can use system resources as needed.&lt;br /&gt;
 CHGSYSVAL SYSVAL(QQRYDEGREE) VALUE(*OPTIMIZE)&lt;br /&gt;
* When interactive jobs require more CPU time than being allowed by default (2 seconds),&amp;lt;ref&amp;gt;This is set in *CLS objects.&amp;lt;/ref&amp;gt; to finish a block of processing, allow that memory to be taken from the *BASE pool. Advantage: The QINTER subsystem pool will not be subject to auto adjustment because of jobs which are supposed to run in batch.&lt;br /&gt;
 CHGSYSVAL SYSVAL(QTSEPOOL) VALUE(*BASE)&lt;br /&gt;
&lt;br /&gt;
=== Message-and-Logging ===&lt;br /&gt;
* Allow immediate deletion of problem reports.&lt;br /&gt;
 CHGSYSVAL SYSVAL(QPRBHLDITV) VALUE(0)&lt;br /&gt;
* Do not log software errors. We can&#039;t do much about these anyway, seen from a hobbyist viewpoint.&lt;br /&gt;
 CHGSYSVAL SYSVAL(QSFWERRLOG) VALUE(*NOLOG)&lt;br /&gt;
* Maximize Central Syslog (viewable with &amp;lt;code&amp;gt;DSPLOG&amp;lt;/code&amp;gt; size to lessen rotation frequency. Depending on OS version only &#039;&#039;VALUE(32767)&#039;&#039; may be valid.&lt;br /&gt;
 CHGSYSVAL SYSVAL(QHSTLOGSIZ) VALUE(*DAILY)&lt;br /&gt;
* Raise allowed unsuccessful sign on tries before taking action.&lt;br /&gt;
 CHGSYSVAL SYSVAL(QMAXSIGN) VALUE(&#039;15&#039;)&lt;br /&gt;
* Minimize logging for sessions disconnected beause of device errors.&lt;br /&gt;
 CHGSYSVAL SYSVAL(QDEVRCYACN) VALUE(*ENDJOBNOLIST)&lt;br /&gt;
&lt;br /&gt;
=== Security System Values ===&lt;br /&gt;
* Unrestrict automatic creation of system objects triggered by external (network) requests.&lt;br /&gt;
 CHGSYSVAL SYSVAL(QAUTOVRT) VALUE(*NOMAX)&lt;br /&gt;
* Allow restore with all security relevant flags.&lt;br /&gt;
 CHGSYSVAL SYSVAL(QALWOBJRST) VALUE(*ALL)&lt;br /&gt;
* For TCP connections to work, we need encrypted passwords.&lt;br /&gt;
 CHGDDMTCPA PWDRQD(*ENCRYPTED)&lt;br /&gt;
* Allow &#039;&#039;QSYSOPR&#039;&#039; signon to all devices.&lt;br /&gt;
 CHGSYSVAL SYSVAL(QLMTSECOFR) VALUE(&#039;0&#039;)&lt;br /&gt;
* Raise maximum password length to maximum value.&amp;lt;ref&amp;gt;In newer OS versions, an additional variable &#039;&#039;QPWDLVL&#039;&#039; allows even longer passwords.&amp;lt;/ref&amp;gt;&lt;br /&gt;
 CHGSYSVAL SYSVAL(QPWDMAXLEN) VALUE(10)&lt;br /&gt;
* Raise minimum  passsword length for security reasons.&lt;br /&gt;
 CHGSYSVAL SYSVAL(QPWDMINLEN) VALUE(8)&lt;br /&gt;
&lt;br /&gt;
=== Misc ===&lt;br /&gt;
* PTF install shall be done on unattended IPL time, and don&#039;t try to report problems to IBM directly.&amp;lt;ref&amp;gt;Needs prior setup for &#039;&#039;Electronic Customer Support&#039;&#039;.&amp;lt;/ref&amp;gt;&lt;br /&gt;
 CHGSRVA PTFINSTYP(*DLYALL) RPTPRBAUTO(*NO)&lt;br /&gt;
* Provide European style formatting.&lt;br /&gt;
 CHGSYSVAL SYSVAL(QCURSYM) VALUE(&#039;€&#039;)&lt;br /&gt;
 CHGSYSVAL SYSVAL(QDECFMT) VALUE(&#039;J&#039;)&lt;br /&gt;
 CHGSYSVAL SYSVAL(QSRTSEQ) VALUE(*LANGIDUNQ)&amp;lt;ref&amp;gt;This value isn&#039;t available with V4R5. You can use &#039;&#039;*LANGIDSHR&#039;&#039; there.&amp;lt;/ref&amp;gt;&lt;br /&gt;
 CHGSYSVAL SYSVAL(QDATFMT) VALUE(&#039;DMY&#039;)&amp;lt;ref&amp;gt;Default value for 2924 (US English) is MDY.&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Allow background compiling in PDM as ordinary user, and submitting batch jobs in general.&lt;br /&gt;
 GRTOBJAUT OBJ(QGPL/QBATCH) OBJTYPE(*JOBD) USER(*PUBLIC) AUT(*USE)&lt;br /&gt;
* Tweaking automatic cleanup (like &#039;&#039;logrotate&#039;&#039;).&lt;br /&gt;
 CHGCLNUP  ALWCLNUP(*YES) STRTIME(&#039;02:22:22&#039;) USRMSG(7) SYSMSG(3) SYSPRT(7) SYSLOG(14) CALITM(*KEEP)&lt;br /&gt;
* Change general SNA networking attributes.  This is one &#039;&#039;&#039;long&#039;&#039;&#039; line. Take care to get it completely.&lt;br /&gt;
 CHGNETA JOBACN(*SEARCH) VRTAUTODEV(254) MDMCNTRYID(DE)&lt;br /&gt;
&lt;br /&gt;
=== Charset Conversion ===&lt;br /&gt;
In addition, OS/400 has a default value of 65535 for &amp;lt;code&amp;gt;QCCSID&amp;lt;/code&amp;gt;. It should be set to a value being dependent on the installed language, to enable automatic translation of data on disk to the display device, and back. For Germany, the correct value is 273, and for US, it&#039;s 37. A good hint is to check your 5250 emulator program for possible values.&lt;br /&gt;
&lt;br /&gt;
== IPL Customization ==&lt;br /&gt;
With this procedure, the current startup program for the OS can be retrieved for easy customization.&lt;br /&gt;
 RTVCLSRC   PGM(QSTRUP) SRCFILE(QCLSRC)&lt;br /&gt;
 WRKMBRPDM  FILE(QCLSRC) MBR(QSTRUP) MBRTYPE(CLP)&lt;br /&gt;
 CRTCLPGM   PGM(QGPL/QSTRUP)&lt;br /&gt;
&lt;br /&gt;
To activate your changes, run &amp;lt;code&amp;gt;WRKSYSVAL SYSVAL(QSTRUPPGM)&amp;lt;/code&amp;gt; and change the values to reflect the new program object in QGPL. &#039;&#039;&#039;Note&#039;&#039;&#039;: On a used system&#039;s install, the previous owner might have already done a customized QSTRUP. See &amp;lt;code&amp;gt;DSPSYSVAL QSTRUPPGM&amp;lt;/code&amp;gt; which one is the currently set startup program before accidentally overwriting!&lt;br /&gt;
&lt;br /&gt;
Notable use cases for changing &amp;lt;code&amp;gt;QSTRUP&amp;lt;/code&amp;gt; would be to make SNA Distribution Services, and TCP/IP (on older releases than V4R5) start at IPL time.&lt;br /&gt;
&lt;br /&gt;
New entries must be located after the &#039;&#039;IF COND&#039;&#039; statement and &#039;&#039;DONE:&#039;&#039; label. Always put a &#039;&#039;MONMSG MSGID(CPF0000)&#039;&#039; after each statement. Failing to do so will not ignore any errors but make the IPL script terminate abnormally in case of an error and possibly leave you with an inaccessible system.&lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
* Start TCP/IP:&lt;br /&gt;
 QSYS/STRTCP&lt;br /&gt;
 MONMSG MSGID(CPF0000)&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&#039;&#039;&#039;Note:&#039;&#039;&#039; TCP/IP on V4R5 and later is by IBM provided default automatically started with an appropriate autostart entry &amp;lt;code&amp;gt;struptcpip&amp;lt;/code&amp;gt; in the &amp;lt;code&amp;gt;qsyswrk&amp;lt;/code&amp;gt; subsystem description. No action is necessary in the startup CL!&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Start SNADS:&lt;br /&gt;
 QSYS/STRSBS SBSD(QSNADS)&lt;br /&gt;
 MONMSG MSGID(CPF0000)&lt;br /&gt;
&lt;br /&gt;
== Change Program Defaults ==&lt;br /&gt;
This establishes different default behavior of some programs which makes life somewhat easier.&amp;lt;ref&amp;gt;Some people highly oppose against changing default values because the default values have been provided for a reason. But then, the &amp;lt;code&amp;gt;CHGCMDDFT&amp;lt;/code&amp;gt; also has been provided for a reason.&amp;lt;/ref&amp;gt; At least noting down the changed programs and their former values is recommended, for example in &amp;lt;code&amp;gt;QGPL/QTXTSRC.CMDDFT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&#039;&#039;&#039;Note:&#039;&#039;&#039; CL applications might run a command with the changed default values, in turn combining (new) defaults and submitted parameters into an invalid combination of parameters which might lead to run-time errors. As far as I&#039;m aware, my proposed changes are compatible with such situations.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* File creation and change defaults:&lt;br /&gt;
** Enforce immediate return to program error handling instead of make programs seem to hang (&amp;lt;code&amp;gt;wait…&amp;lt;/code&amp;gt;),&lt;br /&gt;
** Enforce reusing deleted record space,&amp;lt;ref&amp;gt;If there is no access path defined, sequentially read records are no longer guaranteed to *be in timely order (FIFO)!&amp;lt;/ref&amp;gt;&lt;br /&gt;
** Remove sizing restrictions,&amp;lt;ref&amp;gt;A runaway process filling the disks to 100&amp;amp;thinsp;% is not stopped prior!&amp;lt;/ref&amp;gt;&lt;br /&gt;
** Use a smaller access path size for probably increased performance,&lt;br /&gt;
** Allow automatic LF rebuild when running &amp;lt;code&amp;gt;chgpf&amp;lt;/code&amp;gt;.&lt;br /&gt;
 CHGCMDDFT  CMD(CRTPF) NEWDFT(&#039;SIZE(*NOMAX *N *N) WAITFILE(*IMMED) WAITRCD(*IMMED) REUSEDLT(*YES)&#039;)&lt;br /&gt;
 CHGCMDDFT  CMD(CRTSRCPF) NEWDFT(&#039;SIZE(*NOMAX *N *N) ACCPTHSIZ(*MAX4GB)&#039;)&lt;br /&gt;
 CHGCMDDFT  CMD(CHGPF) NEWDFT(&#039;DLTDEPLF(*YES) SIZE(*NOMAX *N *N) WAITFILE(*IMMED) WAITRCD(*IMMED) REUSEDLT(*YES)&#039;)&lt;br /&gt;
 CHGCMDDFT  CMD(CRTLF) NEWDFT(&#039;WAITFILE(*IMMED) WAITRCD(*IMMED) ACCPTHSIZ(*MAX4GB)&#039;)&lt;br /&gt;
 CHGCMDDFT  CMD(CHGLF) NEWDFT(&#039;WAITFILE(*IMMED) WAITRCD(*IMMED) ACCPTHSIZ(*MAX4GB)&#039;)&lt;br /&gt;
* Menus usually go into the library with the application&#039;s other objects. Change current library to there, so applications can find their objects.&amp;lt;ref&amp;gt;It might be beneficial to individually use &amp;lt;code&amp;gt;CURLIB(*NOCHG)&amp;lt;/code&amp;gt; for higher level menu objects being put into libraries which are part of the default library search list (&#039;&#039;*LIBL&#039;&#039;) — such as &#039;&#039;QGPL&#039;&#039; — to not needlessly change the default library in a for some users unexpected way.&amp;lt;/ref&amp;gt;&lt;br /&gt;
 CHGCMDDFT  CMD(CRTMNU) NEWDFT(&#039;CURLIB(*MNULIB)&#039;)&lt;br /&gt;
* No unnecessary wait for power down. &amp;lt;code&amp;gt;CONFIRM(*NO)&amp;lt;/code&amp;gt; can be added for newer releases to suppress prompting.&lt;br /&gt;
 CHGCMDDFT  CMD(PWRDWNSYS) NEWDFT(&#039;OPTION(*IMMED) ENDSBSOPT(*NOJOBLOG)&#039;)&lt;br /&gt;
* Don&#039;t waste time displaying a not so very much interesting screen prior to connection.&lt;br /&gt;
 CHGCMDDFT CMD(STRPASTHR) NEWDFT(&#039;PASTHRSCN(*NO)&#039;)&lt;br /&gt;
&lt;br /&gt;
Be aware that reinstalls, or applying PTFs can overwrite command objects and thus their changed default values. Also note, hat installing a secondary language on a system also installs a separate set of &amp;lt;code&amp;gt;*cmd&amp;lt;/code&amp;gt; objects for that language. You may want to apply the defaults with qualified object names to these, too.&lt;br /&gt;
&lt;br /&gt;
== Regular Cleanup jobs ==&lt;br /&gt;
See job comment TEXT for details. These are &#039;&#039;&#039;long&#039;&#039;&#039; lines. Take care to get it completely.&lt;br /&gt;
 ADDJOBSCDE JOB(PRGPRB) CMD(DLTPRB STATUS(*CLOSED)) FRQ(*WEEKLY) SCDDATE(*NONE) SCDDAY(*ALL) SCDTIME(&#039;13:22:00&#039;) MSGQ(*LIBL/QSYSOPR) TEXT(&#039;Purge closed and deletable problem entries&#039;)&lt;br /&gt;
 ADDJOBSCDE JOB(RCLTMPSTG) CMD(RCLTMPSTG DAYS(30)) FRQ(*MONTHLY) SCDDATE(*MONTHSTR) SCDDAY(*NONE) SCDTIME(&#039;13:24:00&#039;) MSGQ(*LIBL/QSYSOPR) TEXT(&#039;Reclaim temporary storage&#039;)&lt;br /&gt;
 ADDJOBSCDE JOB(RTVDSKINF) CMD(RTVDSKINF) FRQ(*MONTHLY) SCDDATE(*MONTHSTR) SCDDAY(*NONE) SCDTIME(&#039;13:34:00&#039;) MSGQ(*LIBL/QSYSOPR) TEXT(&#039;Retrieve disk space stats&#039;)&lt;br /&gt;
 ADDJOBSCDE JOB(QPGMRCLR) CMD(CLRMSGQ MSGQ(QPGMR) CLEAR(*KEEPUNANS)) FRQ(*WEEKLY) SCDDATE(*NONE) SCDDAY(*ALL) SCDTIME(&#039;07:07:07&#039;) RCYACN(*NOSBM) MSGQ(*NONE) TEXT(&#039;Delete uninteresting messages&#039;)&lt;br /&gt;
&lt;br /&gt;
== PTF handling ==&lt;br /&gt;
To save space on disk and backup media, you may want to consider applying all PTFs permanently. You cannot remove them afterwards, but that largely doesn&#039;t really matter for older and hobbyist systems.&lt;br /&gt;
&lt;br /&gt;
From a console, first run an `ENDSYS (*IMMED)` to get the system into restricted, state. Then run&lt;br /&gt;
 APYPTF LICPGM(*ALL) SELECT(*ALL) APY(*PERM) DELAYED(*YES) IPLAPY(*YES)&lt;br /&gt;
&lt;br /&gt;
This will apply all PTFs permanently upon next normal IPL. Note you should IPL from the A-side to allow changes to the B side being made.&lt;br /&gt;
&lt;br /&gt;
A final IPL to the B side gets you the fully PTF&#039;d system.&lt;br /&gt;
&lt;br /&gt;
== Re-Enable InfoSeeker ==&lt;br /&gt;
Only necessary for newer V4R4 and newer. If the command isn&#039;t known, don&#039;t bother: Then your release is so new that it&#039;s gone entirely.&lt;br /&gt;
&lt;br /&gt;
See also: [[Reviving InfoSeeker]]&lt;br /&gt;
&lt;br /&gt;
 CRTDTAARA DTAARA(QUSRSYS/QBMGINFSKR) TYPE(*CHAR) LEN(8)&amp;lt;ref&amp;gt;Works in V4R5. The &amp;lt;code&amp;gt;STRINFSKR&amp;lt;/code&amp;gt; command is not included anymore in IBM i 7.1, and probably earlier releases.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Additional Steps tested with V7R2 ==&lt;br /&gt;
After trying to enter SST, one gets the message that the password has expired. But the password cannot be changed. Re-IPL &#039;&#039;&#039;in manual mode&#039;&#039;&#039;, do not IPL but enter DST, and change password as directed.&lt;br /&gt;
&lt;br /&gt;
* Choose &#039;&#039;5. Work with DST environment&#039;&#039; and &#039;&#039;3. Service tools user IDs&#039;&#039;.&lt;br /&gt;
** Disable the &amp;quot;backdoor&amp;quot; profile &#039;&#039;11111111&#039;&#039;,&lt;br /&gt;
** &#039;&#039;Change password&#039;&#039; for &#039;&#039;QSECOFR&#039;&#039;, &#039;&#039;Set password to expired&#039;&#039; to &#039;&#039;2=No&#039;&#039;.&lt;br /&gt;
* Press F12 and choose &#039;&#039;6. Service tools security data&#039;&#039;.&lt;br /&gt;
** Enter 0 into the field &#039;&#039;8. Password expiration interval in days&#039;&#039;, 8 into the &#039;&#039;Selection&#039;&#039; field, and press return.&lt;br /&gt;
** Enter a high number (like 12) into the field &#039;&#039;9. Maximum sign-on attempts allowed&#039;&#039;, 9 into the &#039;&#039;Selection&#039;&#039; field, and press return.&lt;br /&gt;
** Enter 0 into the field &#039;&#039;10. Duplicate password control&#039;&#039;, 10 into the &#039;&#039;Selection&#039;&#039; field, and press return.&lt;br /&gt;
&lt;br /&gt;
Now exit DST.&lt;br /&gt;
&lt;br /&gt;
You may choose to enter SST, enter 7 for &#039;&#039;Work with system security&#039;&#039;, and set &#039;&#039;Allow a service tools user ID with a default and expired password to change its own password&#039;&#039; to &#039;&#039;1=Yes&#039;&#039;. Since we changed password expiry to &#039;&#039;never&#039;&#039;, this step is entirely optional.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Change Command Defaults for File-Commands]]&lt;br /&gt;
* [[How to properly shut down your AS/400]]&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [https://archive.midrange.com/midrange-l/199912/msg01738.html STRINFSKR], Midrange Mailing-List&lt;br /&gt;
* [https://github.com/PoC-dev/as400-autodst as400-autodst], GitHub&lt;br /&gt;
&lt;br /&gt;
== Footnotes ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category: System Administration]]&lt;/div&gt;</summary>
		<author><name>PoC</name></author>
	</entry>
	<entry>
		<id>http://try-as400.pocnet.net/index.php?title=Post-Install_Optimizations&amp;diff=1819</id>
		<title>Post-Install Optimizations</title>
		<link rel="alternate" type="text/html" href="http://try-as400.pocnet.net/index.php?title=Post-Install_Optimizations&amp;diff=1819"/>
		<updated>2026-08-22T14:29:41Z</updated>

		<summary type="html">&lt;p&gt;PoC: /* Housekeeping */ Short cut&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;OS/400 provides a lot of default values for variables (affecting the run-time environment) and program options. Some of these make sense, some of them are kept consistent with earlier versions of the OS because of compatibility reasons by IBM.&lt;br /&gt;
&lt;br /&gt;
Some of these recommendations might not be appropriate for you by various reasons. Don&#039;t apply blindly. Know what you do, use the online help to retrieve background information on the topic in question.&lt;br /&gt;
&lt;br /&gt;
The findings below are based on V4R5 with annotated exceptions for newer releases.&lt;br /&gt;
&lt;br /&gt;
== Housekeeping ==&lt;br /&gt;
These are settings and scheduled jobs to keep your system uncluttered.&lt;br /&gt;
&lt;br /&gt;
=== Change unneeded programs to not run ===&lt;br /&gt;
We most likely don&#039;t need to run &#039;&#039;lpd&#039;&#039; and &#039;&#039;smtpd&#039;&#039; to run per default.&lt;br /&gt;
 CHGLPDA    AUTOSTART(*NO)&lt;br /&gt;
 CHGSMTPA   AUTOSTART(*NO)&lt;br /&gt;
&lt;br /&gt;
You can easily check all settings at once by using &amp;lt;code&amp;gt;UPDDTA QUSRSYS/QATOCSTART&amp;lt;/code&amp;gt;. These are not needed in general.&lt;br /&gt;
* *DIRSRV&lt;br /&gt;
* *NETSVR&lt;br /&gt;
* *SLP&lt;br /&gt;
&lt;br /&gt;
Depending on OS version, not all entries may be available.&lt;br /&gt;
&lt;br /&gt;
=== Change uninstalled programs to not run ===&lt;br /&gt;
If you did not install the Ultimedia package, you can remove the pre started job from the QSYSWRK subsystem description to make it not generate an error message at IPL time.&lt;br /&gt;
 RMVPJE SBSD(QSYSWRK) PGM(QUMEDIA/QUMBPJTC)&lt;br /&gt;
&lt;br /&gt;
If you did not install the Directory Services package (aka LDAP), you can remove the auto started jobs from the QSYSWRK subsystem description to make them not generate an error message at IPL time.&lt;br /&gt;
 RMVAJE SBSD(QSYSWRK) JOB(QGLDPUBA)&lt;br /&gt;
 RMVAJE SBSD(QSYSWRK) JOB(QGLDPUBE)&lt;br /&gt;
&lt;br /&gt;
Both is valid and tested for V4R5. Note that newer releases moved the background jobs to the base OS so there is no error message when starting them. I have not tested if they&#039;re required to run, though.&lt;br /&gt;
&lt;br /&gt;
If you did not install the performance tools, you don&#039;t need trying to start the performance data collector:&lt;br /&gt;
 RMVAJE SBSD(QCTL) JOB(QPFRCOL)&lt;br /&gt;
&lt;br /&gt;
I can&#039;t remember if the latter is valid for V4R5. It&#039;s valid for V3R2, though.&lt;br /&gt;
&lt;br /&gt;
=== Cleanup unneeded stuff ===&lt;br /&gt;
These objects come by default at OS install time, are not needed to my knowledge, and thus can be safely deleted:&lt;br /&gt;
 DLTOUTQ    OUTQ(QDKT)&lt;br /&gt;
 DLTOUTQ    OUTQ(QPFROUTQ)&lt;br /&gt;
 DLTOUTQ    OUTQ(QPRINTS)&lt;br /&gt;
 DLTF       FILE(QPRINTS)&lt;br /&gt;
 DLTOUTQ    OUTQ(QPRINT2)&lt;br /&gt;
 DLTF       FILE(QPRINT2)&lt;br /&gt;
 DLTOUTQ    OUTQ(QTPPPOUTQ)&lt;br /&gt;
 DLTDEVD    DEVD(QESPAP)&lt;br /&gt;
 DLTDEVD    DEVD(QIADSP)&lt;br /&gt;
 DLTDEVD    DEVD(QIAPRT)&lt;br /&gt;
 DLTDEVD    DEVD(QQAHOST)&lt;br /&gt;
 DLTDEVD    DEVD(QTIDA)&lt;br /&gt;
 DLTDEVD    DEVD(QTIDA2)&lt;br /&gt;
 DLTCTLD    CTLD(QESCTL)&lt;br /&gt;
 DLTCTLD    CTLD(QTICTL)&lt;br /&gt;
 DLTLIND    LIND(QESLINE)&lt;br /&gt;
 DLTLIND    LIND(QTILINE)&lt;br /&gt;
&lt;br /&gt;
== System Values ==&lt;br /&gt;
System values are like environment variables as known from common operating systems. They influence system operation. I recommend the following changes.&lt;br /&gt;
&lt;br /&gt;
=== System Control ===&lt;br /&gt;
* Change work environment to separate subsystems for different kind of jobs. This also makes it easy to introduce your own subsystems.&lt;br /&gt;
 CHGSYSVAL SYSVAL(QCTLSBSD) VALUE(&#039;QCTL QSYS&#039;)&lt;br /&gt;
* Set automatic DST adjustment, and UTC offset. This value is valid for Central Europe (Berlin, Paris, …) &#039;&#039;&#039;Note!&#039;&#039;&#039; This variable is not available in V4R5. See [[#Weblinks|Weblinks]] below.&lt;br /&gt;
 CHGSYSVAL SYSVAL(QTIMZON) VALUE(&#039;QP0100CET2&#039;)&lt;br /&gt;
* Adjust time to automatically end disconnected interactive jobs (sessions) to one day.&lt;br /&gt;
 CHGSYSVAL SYSVAL(QDSCJOBITV) VALUE(&#039;1440&#039;)&lt;br /&gt;
&lt;br /&gt;
=== (Memory) Allocation ===&lt;br /&gt;
* Adjust automatic performance values only at runtime, not at IPL.&amp;lt;ref&amp;gt;If you change the amount of memory for the machine, temporarily adjust the value to &#039;2&#039;, make the memory change and then change the value back to &#039;3&#039; — no further IPL needed.&amp;lt;/ref&amp;gt; This allows the system to automatically adjust memory allocations and activity levels to minimize paging (disk I/O).&lt;br /&gt;
 CHGSYSVAL SYSVAL(QPFRADJ) VALUE(&#039;3&#039;)&lt;br /&gt;
* Allow memory pools to self adjust the paging block size depending on jobs running. This is called &#039;&#039;Expert Cache&#039;&#039;. You can adjust the maximum active jobs per pool in the &amp;lt;code&amp;gt;WRKSHRPOOL&amp;lt;/code&amp;gt; display.&amp;lt;ref&amp;gt;Press &amp;lt;code&amp;gt;F21&amp;lt;/code&amp;gt; to switch to view 2 or 3 to have adjustment possibilities.&amp;lt;/ref&amp;gt;&lt;br /&gt;
 CHGSHRPOOL POOL(*BASE) PAGING(*CALC)&lt;br /&gt;
 CHGSHRPOOL POOL(*INTERACT) PAGING(*CALC)&lt;br /&gt;
 CHGSHRPOOL POOL(*SPOOL) PAGING(*CALC)&lt;br /&gt;
* Reservations for job related data structures at IPL time. See &amp;lt;code&amp;gt;DSPSYSSTS&amp;lt;/code&amp;gt; and set to slightly more than the &#039;&#039;Jobs in System&#039;&#039; value to be seen there when the system is working &amp;quot;normal&amp;quot;.&amp;lt;ref&amp;gt;Press &amp;lt;code&amp;gt;F21&amp;lt;/code&amp;gt; to switch to view 2 or 3 to see the overall job count.&amp;lt;/ref&amp;gt;&lt;br /&gt;
 CHGSYSVAL SYSVAL(QTOTJOB) VALUE(100)&lt;br /&gt;
* Reservations for job related data structures at IPL time. See &amp;lt;code&amp;gt;WRKACTJOB&amp;lt;/code&amp;gt; and set to slightly more than the &#039;&#039;Active Jobs&#039;&#039; value to be seen there when the system is working &amp;quot;normal&amp;quot;.&lt;br /&gt;
 CHGSYSVAL SYSVAL(QACTJOB) VALUE(95)&lt;br /&gt;
* Maximize TCP buffers for maximum performance, especially on faster links.&lt;br /&gt;
 CHGTCPA TCPRCVBUF(8388608) TCPSNDBUF(8388608)&lt;br /&gt;
* Make sure, database tasks can use system resources as needed.&lt;br /&gt;
 CHGSYSVAL SYSVAL(QQRYDEGREE) VALUE(*OPTIMIZE)&lt;br /&gt;
* When interactive jobs require more CPU time than being allowed by default (2 seconds),&amp;lt;ref&amp;gt;This is set in *CLS objects.&amp;lt;/ref&amp;gt; to finish a block of processing, allow that memory to be taken from the *BASE pool. Advantage: The QINTER subsystem pool will not be subject to auto adjustment because of jobs which are supposed to run in batch.&lt;br /&gt;
 CHGSYSVAL SYSVAL(QTSEPOOL) VALUE(*BASE)&lt;br /&gt;
&lt;br /&gt;
=== Message-and-Logging ===&lt;br /&gt;
* Allow immediate deletion of problem reports.&lt;br /&gt;
 CHGSYSVAL SYSVAL(QPRBHLDITV) VALUE(0)&lt;br /&gt;
* Do not log software errors. We can&#039;t do much about these anyway, seen from a hobbyist viewpoint.&lt;br /&gt;
 CHGSYSVAL SYSVAL(QSFWERRLOG) VALUE(*NOLOG)&lt;br /&gt;
* Maximize Central Syslog (viewable with &amp;lt;code&amp;gt;DSPLOG&amp;lt;/code&amp;gt; size to lessen rotation frequency. Depending on OS version only &#039;&#039;VALUE(32767)&#039;&#039; may be valid.&lt;br /&gt;
 CHGSYSVAL SYSVAL(QHSTLOGSIZ) VALUE(*DAILY)&lt;br /&gt;
* Raise allowed unsuccessful sign on tries before taking action.&lt;br /&gt;
 CHGSYSVAL SYSVAL(QMAXSIGN) VALUE(&#039;15&#039;)&lt;br /&gt;
* Minimize logging for sessions disconnected beause of device errors.&lt;br /&gt;
 CHGSYSVAL SYSVAL(QDEVRCYACN) VALUE(*ENDJOBNOLIST)&lt;br /&gt;
&lt;br /&gt;
=== Security System Values ===&lt;br /&gt;
* Unrestrict automatic creation of system objects triggered by external (network) requests.&lt;br /&gt;
 CHGSYSVAL SYSVAL(QAUTOVRT) VALUE(*NOMAX)&lt;br /&gt;
* Allow restore with all security relevant flags.&lt;br /&gt;
 CHGSYSVAL SYSVAL(QALWOBJRST) VALUE(*ALL)&lt;br /&gt;
* For TCP connections to work, we need encrypted passwords.&lt;br /&gt;
 CHGDDMTCPA PWDRQD(*ENCRYPTED)&lt;br /&gt;
* Allow &#039;&#039;QSYSOPR&#039;&#039; signon to all devices.&lt;br /&gt;
 CHGSYSVAL SYSVAL(QLMTSECOFR) VALUE(&#039;0&#039;)&lt;br /&gt;
* Raise maximum password length to maximum value.&amp;lt;ref&amp;gt;In newer OS versions, an additional variable &#039;&#039;QPWDLVL&#039;&#039; allows even longer passwords.&amp;lt;/ref&amp;gt;&lt;br /&gt;
 CHGSYSVAL SYSVAL(QPWDMAXLEN) VALUE(10)&lt;br /&gt;
* Raise minimum  passsword length for security reasons.&lt;br /&gt;
 CHGSYSVAL SYSVAL(QPWDMINLEN) VALUE(8)&lt;br /&gt;
&lt;br /&gt;
=== Misc ===&lt;br /&gt;
* PTF install shall be done on unattended IPL time, and don&#039;t try to report problems to IBM directly.&amp;lt;ref&amp;gt;Needs prior setup for &#039;&#039;Electronic Customer Support&#039;&#039;.&amp;lt;/ref&amp;gt;&lt;br /&gt;
 CHGSRVA PTFINSTYP(*DLYALL) RPTPRBAUTO(*NO)&lt;br /&gt;
* Provide European style formatting.&lt;br /&gt;
 CHGSYSVAL SYSVAL(QCURSYM) VALUE(&#039;€&#039;)&lt;br /&gt;
 CHGSYSVAL SYSVAL(QDECFMT) VALUE(&#039;J&#039;)&lt;br /&gt;
 CHGSYSVAL SYSVAL(QSRTSEQ) VALUE(*LANGIDUNQ)&amp;lt;ref&amp;gt;This value isn&#039;t available with V4R5. You can use &#039;&#039;*LANGIDSHR&#039;&#039; there.&amp;lt;/ref&amp;gt;&lt;br /&gt;
 CHGSYSVAL SYSVAL(QDATFMT) VALUE(&#039;DMY&#039;)&amp;lt;ref&amp;gt;Default value for 2924 (US English) is MDY.&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Allow background compiling in PDM as ordinary user, and submitting batch jobs in general.&lt;br /&gt;
 GRTOBJAUT OBJ(QGPL/QBATCH) OBJTYPE(*JOBD) USER(*PUBLIC) AUT(*USE)&lt;br /&gt;
* Tweaking automatic cleanup (like &#039;&#039;logrotate&#039;&#039;).&lt;br /&gt;
 CHGCLNUP  ALWCLNUP(*YES) STRTIME(&#039;02:22:22&#039;) USRMSG(7) SYSMSG(3) SYSPRT(7) SYSLOG(14) CALITM(*KEEP)&lt;br /&gt;
* Change general SNA networking attributes.  This is one &#039;&#039;&#039;long&#039;&#039;&#039; line. Take care to get it completely.&lt;br /&gt;
 CHGNETA JOBACN(*SEARCH) VRTAUTODEV(254) MDMCNTRYID(DE)&lt;br /&gt;
&lt;br /&gt;
=== Charset Conversion ===&lt;br /&gt;
In addition, OS/400 has a default value of 65535 for &amp;lt;code&amp;gt;QCCSID&amp;lt;/code&amp;gt;. It should be set to a value being dependent on the installed language, to enable automatic translation of data on disk to the display device, and back. For Germany, the correct value is 273, and for US, it&#039;s 37. A good hint is to check your 5250 emulator program for possible values.&lt;br /&gt;
&lt;br /&gt;
== IPL Customization ==&lt;br /&gt;
With this procedure, the current startup program for the OS can be retrieved for easy customization.&lt;br /&gt;
 RTVCLSRC   PGM(QSTRUP) SRCFILE(QCLSRC)&lt;br /&gt;
 WRKMBRPDM  FILE(QCLSRC) MBR(QSTRUP) MBRTYPE(CLP)&lt;br /&gt;
 CRTCLPGM   PGM(QGPL/QSTRUP)&lt;br /&gt;
&lt;br /&gt;
To activate your changes, run &amp;lt;code&amp;gt;WRKSYSVAL SYSVAL(QSTRUPPGM)&amp;lt;/code&amp;gt; and change the values to reflect the new program object in QGPL. &#039;&#039;&#039;Note&#039;&#039;&#039;: On a used system&#039;s install, the previous owner might have already done a customized QSTRUP. See &amp;lt;code&amp;gt;DSPSYSVAL QSTRUPPGM&amp;lt;/code&amp;gt; which one is the currently set startup program before accidentally overwriting!&lt;br /&gt;
&lt;br /&gt;
Notable use cases for changing &amp;lt;code&amp;gt;QSTRUP&amp;lt;/code&amp;gt; would be to make SNA Distribution Services, and TCP/IP (on older releases than V4R5) start at IPL time.&lt;br /&gt;
&lt;br /&gt;
New entries must be located after the &#039;&#039;IF COND&#039;&#039; statement and &#039;&#039;DONE:&#039;&#039; label. Always put a &#039;&#039;MONMSG MSGID(CPF0000)&#039;&#039; after each statement. Failing to do so will not ignore any errors but make the IPL script terminate abnormally in case of an error and possibly leave you with an inaccessible system.&lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
* Start TCP/IP:&lt;br /&gt;
 QSYS/STRTCP&lt;br /&gt;
 MONMSG MSGID(CPF0000)&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&#039;&#039;&#039;Note:&#039;&#039;&#039; TCP/IP on V4R5 and later is by IBM provided default automatically started with an appropriate autostart entry &amp;lt;code&amp;gt;struptcpip&amp;lt;/code&amp;gt; in the &amp;lt;code&amp;gt;qsyswrk&amp;lt;/code&amp;gt; subsystem description. No action is necessary in the startup CL!&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Start SNADS:&lt;br /&gt;
 QSYS/STRSBS SBSD(QSNADS)&lt;br /&gt;
 MONMSG MSGID(CPF0000)&lt;br /&gt;
&lt;br /&gt;
== Change Program Defaults ==&lt;br /&gt;
This establishes different default behavior of some programs which makes life somewhat easier.&amp;lt;ref&amp;gt;Some people highly oppose against changing default values because the default values have been provided for a reason. But then, the &amp;lt;code&amp;gt;CHGCMDDFT&amp;lt;/code&amp;gt; also has been provided for a reason.&amp;lt;/ref&amp;gt; At least noting down the changed programs and their former values is recommended, for example in &amp;lt;code&amp;gt;QGPL/QTXTSRC.CMDDFT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&#039;&#039;&#039;Note:&#039;&#039;&#039; CL applications might run a command with the changed default values, in turn combining (new) defaults and submitted parameters into an invalid combination of parameters which might lead to run-time errors. As far as I&#039;m aware, my proposed changes are compatible with such situations.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* File creation and change defaults:&lt;br /&gt;
** Enforce immediate return to program error handling instead of make programs seem to hang (&amp;lt;code&amp;gt;wait…&amp;lt;/code&amp;gt;),&lt;br /&gt;
** Enforce reusing deleted record space,&amp;lt;ref&amp;gt;If there is no access path defined, sequentially read records are no longer guaranteed to *be in timely order (FIFO)!&amp;lt;/ref&amp;gt;&lt;br /&gt;
** Remove sizing restrictions,&amp;lt;ref&amp;gt;A runaway process filling the disks to 100&amp;amp;thinsp;% is not stopped prior!&amp;lt;/ref&amp;gt;&lt;br /&gt;
** Use a smaller access path size for probably increased performance,&lt;br /&gt;
** Allow automatic LF rebuild when running &amp;lt;code&amp;gt;chgpf&amp;lt;/code&amp;gt;.&lt;br /&gt;
 CHGCMDDFT  CMD(CRTPF) NEWDFT(&#039;SIZE(*NOMAX *N *N) WAITFILE(*IMMED) WAITRCD(*IMMED) REUSEDLT(*YES)&#039;)&lt;br /&gt;
 CHGCMDDFT  CMD(CRTSRCPF) NEWDFT(&#039;SIZE(*NOMAX *N *N) ACCPTHSIZ(*MAX4GB)&#039;)&lt;br /&gt;
 CHGCMDDFT  CMD(CHGPF) NEWDFT(&#039;DLTDEPLF(*YES) SIZE(*NOMAX *N *N) WAITFILE(*IMMED) WAITRCD(*IMMED) REUSEDLT(*YES)&#039;)&lt;br /&gt;
 CHGCMDDFT  CMD(CRTLF) NEWDFT(&#039;WAITFILE(*IMMED) WAITRCD(*IMMED) ACCPTHSIZ(*MAX4GB)&#039;)&lt;br /&gt;
 CHGCMDDFT  CMD(CHGLF) NEWDFT(&#039;WAITFILE(*IMMED) WAITRCD(*IMMED) ACCPTHSIZ(*MAX4GB)&#039;)&lt;br /&gt;
* Menus usually go into the library with the application&#039;s other objects. Change current library to there, so applications can find their objects.&amp;lt;ref&amp;gt;It might be beneficial to individually use &amp;lt;code&amp;gt;CURLIB(*NOCHG)&amp;lt;/code&amp;gt; for higher level menu objects being put into libraries which are part of the default library search list (&#039;&#039;*LIBL&#039;&#039;) — such as &#039;&#039;QGPL&#039;&#039; — to not needlessly change the default library in a for some users unexpected way.&amp;lt;/ref&amp;gt;&lt;br /&gt;
 CHGCMDDFT  CMD(CRTMNU) NEWDFT(&#039;CURLIB(*MNULIB)&#039;)&lt;br /&gt;
* No unnecessary wait for power down. &amp;lt;code&amp;gt;CONFIRM(*NO)&amp;lt;/code&amp;gt; can be added for newer releases to suppress prompting.&lt;br /&gt;
 CHGCMDDFT  CMD(PWRDWNSYS) NEWDFT(&#039;OPTION(*IMMED) ENDSBSOPT(*NOJOBLOG)&#039;)&lt;br /&gt;
* Don&#039;t waste time displaying a not so very much interesting screen prior to connection.&lt;br /&gt;
 CHGCMDDFT CMD(STRPASTHR) NEWDFT(&#039;PASTHRSCN(*NO)&#039;)&lt;br /&gt;
&lt;br /&gt;
Be aware that reinstalls, or applying PTFs can overwrite command objects and thus their changed default values. Also note, hat installing a secondary language on a system also installs a separate set of &amp;lt;code&amp;gt;*cmd&amp;lt;/code&amp;gt; objects for that language. You may want to apply the defaults with qualified object names to these, too.&lt;br /&gt;
&lt;br /&gt;
== Regular Cleanup jobs ==&lt;br /&gt;
See job comment TEXT for details. These are &#039;&#039;&#039;long&#039;&#039;&#039; lines. Take care to get it completely.&lt;br /&gt;
 ADDJOBSCDE JOB(PRGPRB) CMD(DLTPRB STATUS(*CLOSED)) FRQ(*WEEKLY) SCDDATE(*NONE) SCDDAY(*ALL) SCDTIME(&#039;13:22:00&#039;) MSGQ(*LIBL/QSYSOPR) TEXT(&#039;Purge closed and deletable problem entries&#039;)&lt;br /&gt;
 ADDJOBSCDE JOB(RCLTMPSTG) CMD(RCLTMPSTG DAYS(30)) FRQ(*MONTHLY) SCDDATE(*MONTHSTR) SCDDAY(*NONE) SCDTIME(&#039;13:24:00&#039;) MSGQ(*LIBL/QSYSOPR) TEXT(&#039;Reclaim temporary storage&#039;)&lt;br /&gt;
 ADDJOBSCDE JOB(RTVDSKINF) CMD(RTVDSKINF) FRQ(*MONTHLY) SCDDATE(*MONTHSTR) SCDDAY(*NONE) SCDTIME(&#039;13:34:00&#039;) MSGQ(*LIBL/QSYSOPR) TEXT(&#039;Retrieve disk space stats&#039;)&lt;br /&gt;
 ADDJOBSCDE JOB(QPGMRCLR) CMD(CLRMSGQ MSGQ(QPGMR) CLEAR(*KEEPUNANS)) FRQ(*WEEKLY) SCDDATE(*NONE) SCDDAY(*ALL) SCDTIME(&#039;07:07:07&#039;) RCYACN(*NOSBM) MSGQ(*NONE) TEXT(&#039;Delete uninteresting messages&#039;)&lt;br /&gt;
&lt;br /&gt;
== Re-Enable InfoSeeker ==&lt;br /&gt;
Only necessary for newer V4R4 and newer. If the command isn&#039;t known, don&#039;t bother: Then your release is so new that it&#039;s gone entirely.&lt;br /&gt;
&lt;br /&gt;
See also: [[Reviving InfoSeeker]]&lt;br /&gt;
&lt;br /&gt;
 CRTDTAARA DTAARA(QUSRSYS/QBMGINFSKR) TYPE(*CHAR) LEN(8)&amp;lt;ref&amp;gt;Works in V4R5. The &amp;lt;code&amp;gt;STRINFSKR&amp;lt;/code&amp;gt; command is not included anymore in IBM i 7.1, and probably earlier releases.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Additional Steps tested with V7R2 ==&lt;br /&gt;
After trying to enter SST, one gets the message that the password has expired. But the password cannot be changed. Re-IPL &#039;&#039;&#039;in manual mode&#039;&#039;&#039;, do not IPL but enter DST, and change password as directed.&lt;br /&gt;
&lt;br /&gt;
* Choose &#039;&#039;5. Work with DST environment&#039;&#039; and &#039;&#039;3. Service tools user IDs&#039;&#039;.&lt;br /&gt;
** Disable the &amp;quot;backdoor&amp;quot; profile &#039;&#039;11111111&#039;&#039;,&lt;br /&gt;
** &#039;&#039;Change password&#039;&#039; for &#039;&#039;QSECOFR&#039;&#039;, &#039;&#039;Set password to expired&#039;&#039; to &#039;&#039;2=No&#039;&#039;.&lt;br /&gt;
* Press F12 and choose &#039;&#039;6. Service tools security data&#039;&#039;.&lt;br /&gt;
** Enter 0 into the field &#039;&#039;8. Password expiration interval in days&#039;&#039;, 8 into the &#039;&#039;Selection&#039;&#039; field, and press return.&lt;br /&gt;
** Enter a high number (like 12) into the field &#039;&#039;9. Maximum sign-on attempts allowed&#039;&#039;, 9 into the &#039;&#039;Selection&#039;&#039; field, and press return.&lt;br /&gt;
** Enter 0 into the field &#039;&#039;10. Duplicate password control&#039;&#039;, 10 into the &#039;&#039;Selection&#039;&#039; field, and press return.&lt;br /&gt;
&lt;br /&gt;
Now exit DST.&lt;br /&gt;
&lt;br /&gt;
You may choose to enter SST, enter 7 for &#039;&#039;Work with system security&#039;&#039;, and set &#039;&#039;Allow a service tools user ID with a default and expired password to change its own password&#039;&#039; to &#039;&#039;1=Yes&#039;&#039;. Since we changed password expiry to &#039;&#039;never&#039;&#039;, this step is entirely optional.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Change Command Defaults for File-Commands]]&lt;br /&gt;
* [[How to properly shut down your AS/400]]&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [https://archive.midrange.com/midrange-l/199912/msg01738.html STRINFSKR], Midrange Mailing-List&lt;br /&gt;
* [https://github.com/PoC-dev/as400-autodst as400-autodst], GitHub&lt;br /&gt;
&lt;br /&gt;
== Footnotes ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category: System Administration]]&lt;/div&gt;</summary>
		<author><name>PoC</name></author>
	</entry>
	<entry>
		<id>http://try-as400.pocnet.net/index.php?title=System_Internals:SLIC_DASD_device_recognition&amp;diff=1818</id>
		<title>System Internals:SLIC DASD device recognition</title>
		<link rel="alternate" type="text/html" href="http://try-as400.pocnet.net/index.php?title=System_Internals:SLIC_DASD_device_recognition&amp;diff=1818"/>
		<updated>2026-08-21T14:09:55Z</updated>

		<summary type="html">&lt;p&gt;PoC: Removed erroneous information&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{AI generated not reviewed}}&lt;br /&gt;
The &#039;&#039;&#039;SLIC DASD device recognition&#039;&#039;&#039; table is the static list, inside the OS/400 Licensed Internal Code (SLIC), of which SCSI disk drives the system will accept as a DASD (disk) unit. This page describes how that recognition works, how to find and decode the table in a SLIC image, and — as a worked example — the complete list a V4R4 machine accepts. The method generalises to any release and to other SLIC device tables.&lt;br /&gt;
&lt;br /&gt;
Understanding it matters for preservation: OS/400 refuses ordinary SCSI disks, so keeping a machine alive after a disk failure means presenting a drive (real or emulated) that answers the SCSI bus the way SLIC expects.&lt;br /&gt;
&lt;br /&gt;
== How SLIC decides a disk is acceptable ==&lt;br /&gt;
&lt;br /&gt;
A disk becomes an eligible DASD unit only if it passes three independent gates, all implemented in the SLIC disk device driver:&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;SCSI INQUIRY must match a static table.&#039;&#039;&#039; SLIC compares the drive&#039;s INQUIRY vendor id (bytes 8–15) and product id (bytes 16–31) against a built-in table. Only IBM-badged units qualify: the vendor id is normally &amp;lt;code&amp;gt;IBMAS400&amp;lt;/code&amp;gt; (a handful of early units use &amp;lt;code&amp;gt;IBM␠␠␠␠␠&amp;lt;/code&amp;gt; and two OEM units use &amp;lt;code&amp;gt;QUANTUM␠&amp;lt;/code&amp;gt;). An off-the-shelf drive reports its own vendor and is rejected. This is exactly what the &amp;quot;custom firmware&amp;quot; on IBM&#039;s 660x/671x disks does: IBM reflashed standard Ultrastar/Corsair mechanisms to answer INQUIRY with an IBM vendor id and an IBM product id.&lt;br /&gt;
# &#039;&#039;&#039;Vendor-unique SKIP READ / SKIP WRITE.&#039;&#039;&#039; The driver issues IBM vendor-unique SCSI commands that read or write a run of sectors while skipping masked ones, used by the Single-Level Store paging path. A faithful drive must implement these, not just standard READ/WRITE.&lt;br /&gt;
# &#039;&#039;&#039;Capacity from VPD.&#039;&#039;&#039; The unit&#039;s size is taken at run time from the drive&#039;s Vital Product Data / &amp;lt;code&amp;gt;READ CAPACITY&amp;lt;/code&amp;gt;, not from the table — the table has no capacity column. An impersonating drive must report a capacity that is legal for the feature type it claims.&lt;br /&gt;
&lt;br /&gt;
== Finding and decoding the table ==&lt;br /&gt;
&lt;br /&gt;
In a SLIC image the table is a run of fixed-size records. On V4R4 each record is 40 bytes:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bytes  0- 3  feature type    EBCDIC digits, e.g. F6F6F0F7 = &amp;quot;6607&amp;quot;&lt;br /&gt;
bytes  4- 5  model           EBCDIC, e.g. &amp;quot;1 &amp;quot;&lt;br /&gt;
byte      6  class flag      0x00 normal; 0x80 on the 18 GB Ultra2/LVD units&lt;br /&gt;
bytes  7-15  reserved        0x40 (EBCDIC space) padding&lt;br /&gt;
bytes 16-23  INQUIRY vendor  ASCII, matched against INQUIRY bytes 8-15&lt;br /&gt;
bytes 24-39  INQUIRY product ASCII, matched against INQUIRY bytes 16-31&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The type and model are EBCDIC (digit &#039;&#039;n&#039;&#039; = byte &amp;lt;code&amp;gt;0xF&#039;&#039;n&#039;&#039;&amp;lt;/code&amp;gt;); the INQUIRY strings are ASCII. To locate the table, search the image for the ASCII vendor strings &amp;lt;code&amp;gt;IBMAS400&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;QUANTUM␠&amp;lt;/code&amp;gt;: the records sit at a fixed 40-byte stride around them. The same trick — anchor on a known ASCII string, then read the fixed-width record around it — recovers other SLIC hardware tables (IOP/controller CCIN tables, adapter tables, and so on).&lt;br /&gt;
&lt;br /&gt;
== The V4R4 list ==&lt;br /&gt;
&lt;br /&gt;
Every drive a V4R4 system accepts, decoded from the image.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Feature/Model&lt;br /&gt;
|-&lt;br /&gt;
| 6109 / 0&lt;br /&gt;
|-&lt;br /&gt;
| 6109 / 1&lt;br /&gt;
|-&lt;br /&gt;
| 6105 / 0&lt;br /&gt;
|-&lt;br /&gt;
| 6107 / 0&lt;br /&gt;
|-&lt;br /&gt;
| 6603 / 0&lt;br /&gt;
|-&lt;br /&gt;
| 6603 / 1&lt;br /&gt;
|-&lt;br /&gt;
| 6602 / 0&lt;br /&gt;
|-&lt;br /&gt;
| 6602 / 1&lt;br /&gt;
|-&lt;br /&gt;
| 6605 / 1&lt;br /&gt;
|-&lt;br /&gt;
| 6606 / 1&lt;br /&gt;
|-&lt;br /&gt;
| 6607 / 1&lt;br /&gt;
|-&lt;br /&gt;
| 6713 / 1&lt;br /&gt;
|-&lt;br /&gt;
| 6714 / 1&lt;br /&gt;
|-&lt;br /&gt;
| 6717 / 1&lt;br /&gt;
|-&lt;br /&gt;
| 6730 / 0&lt;br /&gt;
|-&lt;br /&gt;
| 6731 / 0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;Ide&amp;quot; in SLIC symbol names (e.g. the driver classes handling these disks) is the disk device-driver namespace, &#039;&#039;&#039;not&#039;&#039;&#039; ATA/IDE.&lt;br /&gt;
* Numbers like 2748, 6502, 6512, 6751, 6753, 6754 that appear on other SLIC symbols are IOP / disk-controller CCINs, not drive models.&lt;br /&gt;
* An emulated target (for example on open SCSI-emulator firmware) must present one of the vendor+product pairs above verbatim, space-padded to the SCSI field widths, implement the vendor-unique SKIP commands, and report a legal capacity via &amp;lt;code&amp;gt;READ CAPACITY&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Category:System Internals]]&lt;/div&gt;</summary>
		<author><name>PoC</name></author>
	</entry>
	<entry>
		<id>http://try-as400.pocnet.net/index.php?title=ZuluSCSI&amp;diff=1817</id>
		<title>ZuluSCSI</title>
		<link rel="alternate" type="text/html" href="http://try-as400.pocnet.net/index.php?title=ZuluSCSI&amp;diff=1817"/>
		<updated>2026-08-17T19:00:23Z</updated>

		<summary type="html">&lt;p&gt;PoC: +CD&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;ZuluSCSI&#039;&#039;&#039; by Rabbit Hole Computing is a comparatively new family of SCSI device emulators featuring an SD card based backing store. Distinct features to older, similar devices is support for Wide-SCSI, Ultra-Speed, and a fast CPU.&lt;br /&gt;
&lt;br /&gt;
ZuluSCSI also features an OpenSource firmware, so it can be extended comparatively easily.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
For most AS/400 machines, you actually want a ZuluSCSI wide, because it offers the best performance.&lt;br /&gt;
&lt;br /&gt;
The ZuluSCSI firmware can emulate multiple devices at once. There is no real need to add multiple Zulus to a given SCSI bus. One Zulu can easily saturate even the UltraWide SCSI bus of a 9401-150, and due to the SD card, delays are minimal. You can gain more performance with bigger machines, if they have multiple SCSI buses, though.&lt;br /&gt;
&lt;br /&gt;
== Hardware overview ==&lt;br /&gt;
Depending on the exact model, boards themselves have three DIP switches and tiny push buttons:&lt;br /&gt;
* 1: switch to initator mode,&lt;br /&gt;
* 2: enable debug log,&lt;br /&gt;
* 3: enable SCSI termination.&lt;br /&gt;
&lt;br /&gt;
The push buttons call the functions:&lt;br /&gt;
* Bootloader, for firmware-recovery,&lt;br /&gt;
* Eject.&lt;br /&gt;
&lt;br /&gt;
Also, three LEDs are provided, for indication of&lt;br /&gt;
* 2.8&amp;amp;thinsp;V power OK,&lt;br /&gt;
* 3.3&amp;amp;thinsp;V power OK,&lt;br /&gt;
* SD-card activity.&lt;br /&gt;
&lt;br /&gt;
The device itself needs 5&amp;amp;thinsp;V power, and can be powered by:&lt;br /&gt;
* the USB port,&lt;br /&gt;
* the termpower line of the SCSI bus,&lt;br /&gt;
* molex style power connectors.&lt;br /&gt;
&lt;br /&gt;
Usually, the integrated USB port is configured as USB modem, for usage with a terminal emulator. You can use the Linux or macOS &#039;&#039;screen&#039;&#039; command for that. Depending on your operating system, you need to find out what device file is created when plugging the Zulu&#039;s USB port. On Linux, it&#039;s &amp;lt;tt&amp;gt;/dev/ttyACM&#039;&#039;n&#039;&#039;&amp;lt;/tt&amp;gt; — &#039;&#039;n&#039;&#039; being a digit, usually 0. On macOS, it&#039;s &amp;lt;tt&amp;gt;/dev/tty.usbmodem*&amp;lt;/tt&amp;gt;, with a row of digits appended on behalf of the &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The firmware presents a simple menu driven UI for some tasks.&lt;br /&gt;
&lt;br /&gt;
There is no need to shut down the device itself, it&#039;s safe to &amp;quot;pull the plug&amp;quot; when there is no activity. The Operating System running on the attached computer should, though.&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
Configuration itself is usually automatic, according to the files and directories found on the SD card. The SD card has either a FAT32&amp;lt;ref&amp;gt;Limiting files to max. 4&amp;amp;thinsp;GiB in size&amp;lt;/ref&amp;gt; or exFAT file system, the firmware understands both. It&#039;s easier to use the SD card with a card reader on a newer computer to create configurations, and files. The SD card is hotplug capable, and upon reinsertation, the ZuluSCSI reinitializes itself according to the SD card&#039;s content.&lt;br /&gt;
&lt;br /&gt;
Three devices classes are of general interest in the AS/400 world:&lt;br /&gt;
* Disk (DASD),&lt;br /&gt;
* CD/DVD (Optical),&lt;br /&gt;
* Tape.&lt;br /&gt;
&lt;br /&gt;
=== Files ===&lt;br /&gt;
File names are composed as follows:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;TT&amp;gt;&amp;lt;ID&amp;gt;[any text].&amp;lt;ext&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
  ^^   ^&lt;br /&gt;
  |    +-------------- SCSI ID character (byte offset 2)&lt;br /&gt;
  +------------------- two-character type prefix (case-insensitive)&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;TT&#039;&#039;&#039;:&lt;br /&gt;
:{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!TT&lt;br /&gt;
!Device type&lt;br /&gt;
!Default block size&lt;br /&gt;
|-&lt;br /&gt;
|HD&lt;br /&gt;
|Hard disk (fixed)&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|512&amp;amp;thinsp;Bytes&lt;br /&gt;
|-&lt;br /&gt;
|CD&lt;br /&gt;
|CD-ROM (optical)&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|2048&amp;amp;thinsp;Bytes&lt;br /&gt;
|-&lt;br /&gt;
|TP&lt;br /&gt;
|Sequential (tape)&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|512&amp;amp;thinsp;Bytes&lt;br /&gt;
|}&lt;br /&gt;
* The &#039;&#039;&#039;ID&#039;&#039;&#039; is exactly one char, and must be given in hexadecimal. This matters only for IDs ≥ 10.&lt;br /&gt;
* &#039;&#039;&#039;any text&#039;&#039;&#039; is entirely optional.&lt;br /&gt;
* The &#039;&#039;&#039;file extension&#039;&#039;&#039; doesn&#039;t matter.&lt;br /&gt;
&lt;br /&gt;
=== Directories ===&lt;br /&gt;
For a device usually allowing dynamic addition and removal of media — CD-ROM-, and tape drives. The naming scheme follows the same structure as files, but &#039;&#039;[any text]&#039;&#039; must be omitted.&lt;br /&gt;
&lt;br /&gt;
Files within the directories can be freely named, and are used in alphabetical order.&amp;lt;ref&amp;gt;Either through the &#039;&#039;Eject&#039;&#039; button, or the media menu.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Configuration file ===&lt;br /&gt;
In addition, a configuration file can be supplied to provide additional information to either all or one emulated device. Having a &#039;&#039;zuluscsi.ini&#039;&#039; is normally optional, but for enabling AS/400 quirks, it&#039;s mandatory.&lt;br /&gt;
&lt;br /&gt;
The configuration file must be named &#039;&#039;zuluscsi.ini&#039;&#039;, and is in a simple ini-style format. It has a global &amp;lt;tt&amp;gt;[SCSI]&amp;lt;/tt&amp;gt; section to apply settings to all devices, and &amp;lt;tt&amp;gt;[SCSI&#039;&#039;n&#039;&#039;]&amp;lt;/tt&amp;gt;, where &#039;&#039;n&#039;&#039; is the ID of the given SCSI devices.&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
These are in the scope of AS/400.&lt;br /&gt;
&lt;br /&gt;
=== Tape drive support ===&lt;br /&gt;
* create directory &amp;lt;code&amp;gt;TP0&amp;lt;/code&amp;gt;,&lt;br /&gt;
* populate with one or more 0&amp;amp;thinsp;byte files named &amp;lt;code&amp;gt;*.tap&amp;lt;/code&amp;gt; files, e. g. by using the Unix &amp;lt;code&amp;gt;touch&amp;lt;/code&amp;gt;,&lt;br /&gt;
* use the serial console to attach image(s) to the drive.&lt;br /&gt;
* &#039;&#039;zuluscsi.ini&#039;&#039;:&lt;br /&gt;
 [SCSI]&lt;br /&gt;
 System=&amp;quot;AS400_PPC&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 [SCSI0]&lt;br /&gt;
 TapeDensity = 0x25&lt;br /&gt;
&lt;br /&gt;
Caveats:&lt;br /&gt;
* When you choose an image file through the USB port&#039;s media menu, make sure that you not only choose an image file, but afterwards &#039;&#039;insert&#039;&#039; it!&lt;br /&gt;
* If you replace a hardware tape drive, make sure to delete your old tape device file first, then IPL, check/set the new device name in DST, and have auto-configuration create the new device file during the following IPL.&lt;br /&gt;
&lt;br /&gt;
This configuration has been tested over the course of multiple weeks:&lt;br /&gt;
* Occasional &amp;lt;tt&amp;gt;go save&amp;lt;/tt&amp;gt; 21,&lt;br /&gt;
* daily differential backups,&lt;br /&gt;
* occasional single file restores.&lt;br /&gt;
&lt;br /&gt;
Tested with Firmware 2026-06-12, 9401-150, V4R5.&lt;br /&gt;
&lt;br /&gt;
=== CD drive support ===&lt;br /&gt;
* create directory &amp;lt;code&amp;gt;CD0&amp;lt;/code&amp;gt;,&lt;br /&gt;
* populate with one or more readymade ISO images,&lt;br /&gt;
* use the serial console to attach image(s) to the drive.&lt;br /&gt;
&lt;br /&gt;
No special handling for the ID in &#039;&#039;zuluscsi.ini&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Caveats:&lt;br /&gt;
* When you choose an image file through the USB port&#039;s media menu, make sure that you not only choose an image file, but afterwards &#039;&#039;insert&#039;&#039; it!&lt;br /&gt;
* If you replace a hardware CD drive, make sure to delete your old CD device file first, then IPL, check/set the new device name in DST, and have auto-configuration create the new device file during the following IPL.&lt;br /&gt;
&lt;br /&gt;
Tested with Firmware 2026-08-07, 9401-150, V4R4: IPL only so far.&lt;br /&gt;
&lt;br /&gt;
== Current state ==&lt;br /&gt;
In the scope of AS/400&#039;s, ZuluSCSI&#039;s disk support is still incomplete, while CD- and tape emulation are seemingly solid. Some progress has been made, but there are still some rough edges, normally leading to crash of the Operating System with a given &#039;&#039;System Reference Code&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
At the moment, the firmware supports only a single AS/400 specific DASD device type for PPC-AS (522&amp;amp;thinsp;Bytes per sector).&lt;br /&gt;
&lt;br /&gt;
=== Reports ===&lt;br /&gt;
* 2026-08-16, mikerm, 9406-170, Zulu firmware 2026-08-07. Trying to install V4R4 on the Zulu emulated DASD. Disk was created with &amp;lt;code&amp;gt;dd if=/dev/zero of=HD6.img bs=522 count=17177940 status=progress&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;Per directions of one of the firmware developers.&amp;lt;/ref&amp;gt;&lt;br /&gt;
** First try, &#039;&#039;prefetch&#039;&#039; setting at default (8k): halts at &amp;lt;code&amp;gt;B1934505&amp;lt;/code&amp;gt; after IPL takes place from DASD&lt;br /&gt;
** Second try, &#039;&#039;prefetch&#039;&#039; set to 0: &amp;lt;code&amp;gt;B6080801&amp;lt;/code&amp;gt; after IPL takes place from DASD. More progress, and much quicker LIC install, though.&lt;br /&gt;
** Configuration file used:&lt;br /&gt;
 [SCSI]&lt;br /&gt;
 LogModeData = 1 &lt;br /&gt;
 System = AS400_BS522&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Ordinary Harddisks on the AS/400]]&lt;br /&gt;
* [[Tape Drives on old AS/400]]&lt;br /&gt;
* [[SRC]], aka System Reference Code&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [https://zuluscsi.com ZuluSCSI Website] — see the &amp;lt;tt&amp;gt;☰&amp;lt;/tt&amp;gt; button top right for more details&lt;br /&gt;
* [https://github.com/ZuluSCSI/ZuluSCSI-firmware ZuluSCSI-firmware], GitHub&lt;br /&gt;
&lt;br /&gt;
== Footnotes ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Hardware Configuration Guide]]&lt;/div&gt;</summary>
		<author><name>PoC</name></author>
	</entry>
	<entry>
		<id>http://try-as400.pocnet.net/index.php?title=ZuluSCSI&amp;diff=1816</id>
		<title>ZuluSCSI</title>
		<link rel="alternate" type="text/html" href="http://try-as400.pocnet.net/index.php?title=ZuluSCSI&amp;diff=1816"/>
		<updated>2026-08-16T21:28:06Z</updated>

		<summary type="html">&lt;p&gt;PoC: /* Hardware overview */ finished sentence&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;ZuluSCSI&#039;&#039;&#039; by Rabbit Hole Computing is a comparatively new family of SCSI device emulators featuring an SD card based backing store. Distinct features to older, similar devices is support for Wide-SCSI, Ultra-Speed, and a fast CPU.&lt;br /&gt;
&lt;br /&gt;
ZuluSCSI also features an OpenSource firmware, so it can be extended comparatively easily.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
For most AS/400 machines, you actually want a ZuluSCSI wide, because it offers the best performance.&lt;br /&gt;
&lt;br /&gt;
The ZuluSCSI firmware can emulate multiple devices at once. There is no real need to add multiple Zulus to a given SCSI bus. One Zulu can easily saturate even the UltraWide SCSI bus of a 9401-150, and due to the SD card, delays are minimal. You can gain more performance with bigger machines, if they have multiple SCSI buses, though.&lt;br /&gt;
&lt;br /&gt;
== Hardware overview ==&lt;br /&gt;
Depending on the exact model, boards themselves have three DIP switches and tiny push buttons:&lt;br /&gt;
* 1: switch to initator mode,&lt;br /&gt;
* 2: enable debug log,&lt;br /&gt;
* 3: enable SCSI termination.&lt;br /&gt;
&lt;br /&gt;
The push buttons call the functions:&lt;br /&gt;
* Bootloader, for firmware-recovery,&lt;br /&gt;
* Eject.&lt;br /&gt;
&lt;br /&gt;
Also, three LEDs are provided, for indication of&lt;br /&gt;
* 2.8&amp;amp;thinsp;V power OK,&lt;br /&gt;
* 3.3&amp;amp;thinsp;V power OK,&lt;br /&gt;
* SD-card activity.&lt;br /&gt;
&lt;br /&gt;
The device itself needs 5&amp;amp;thinsp;V power, and can be powered by:&lt;br /&gt;
* the USB port,&lt;br /&gt;
* the termpower line of the SCSI bus,&lt;br /&gt;
* molex style power connectors.&lt;br /&gt;
&lt;br /&gt;
Usually, the integrated USB port is configured as USB modem, for usage with a terminal emulator. You can use the Linux or macOS &#039;&#039;screen&#039;&#039; command for that. Depending on your operating system, you need to find out what device file is created when plugging the Zulu&#039;s USB port. On Linux, it&#039;s &amp;lt;tt&amp;gt;/dev/ttyACM&#039;&#039;n&#039;&#039;&amp;lt;/tt&amp;gt; — &#039;&#039;n&#039;&#039; being a digit, usually 0. On macOS, it&#039;s &amp;lt;tt&amp;gt;/dev/tty.usbmodem*&amp;lt;/tt&amp;gt;, with a row of digits appended on behalf of the &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The firmware presents a simple menu driven UI for some tasks.&lt;br /&gt;
&lt;br /&gt;
There is no need to shut down the device itself, it&#039;s safe to &amp;quot;pull the plug&amp;quot; when there is no activity. The Operating System running on the attached computer should, though.&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
Configuration itself is usually automatic, according to the files and directories found on the SD card. The SD card has either a FAT32&amp;lt;ref&amp;gt;Limiting files to max. 4&amp;amp;thinsp;GiB in size&amp;lt;/ref&amp;gt; or exFAT file system, the firmware understands both. It&#039;s easier to use the SD card with a card reader on a newer computer to create configurations, and files. The SD card is hotplug capable, and upon reinsertation, the ZuluSCSI reinitializes itself according to the SD card&#039;s content.&lt;br /&gt;
&lt;br /&gt;
Three devices classes are of general interest in the AS/400 world:&lt;br /&gt;
* Disk (DASD),&lt;br /&gt;
* CD/DVD (Optical),&lt;br /&gt;
* Tape.&lt;br /&gt;
&lt;br /&gt;
=== Files ===&lt;br /&gt;
File names are composed as follows:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;TT&amp;gt;&amp;lt;ID&amp;gt;[any text].&amp;lt;ext&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
  ^^   ^&lt;br /&gt;
  |    +-------------- SCSI ID character (byte offset 2)&lt;br /&gt;
  +------------------- two-character type prefix (case-insensitive)&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;TT&#039;&#039;&#039;:&lt;br /&gt;
:{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!TT&lt;br /&gt;
!Device type&lt;br /&gt;
!Default block size&lt;br /&gt;
|-&lt;br /&gt;
|HD&lt;br /&gt;
|Hard disk (fixed)&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|512&amp;amp;thinsp;Bytes&lt;br /&gt;
|-&lt;br /&gt;
|CD&lt;br /&gt;
|CD-ROM (optical)&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|2048&amp;amp;thinsp;Bytes&lt;br /&gt;
|-&lt;br /&gt;
|TP&lt;br /&gt;
|Sequential (tape)&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|512&amp;amp;thinsp;Bytes&lt;br /&gt;
|}&lt;br /&gt;
* The &#039;&#039;&#039;ID&#039;&#039;&#039; is exactly one char, and must be given in hexadecimal. This matters only for IDs ≥ 10.&lt;br /&gt;
* &#039;&#039;&#039;any text&#039;&#039;&#039; is entirely optional.&lt;br /&gt;
* The &#039;&#039;&#039;file extension&#039;&#039;&#039; doesn&#039;t matter.&lt;br /&gt;
&lt;br /&gt;
=== Directories ===&lt;br /&gt;
For a device usually allowing dynamic addition and removal of media — CD-ROM-, and tape drives. The naming scheme follows the same structure as files, but &#039;&#039;[any text]&#039;&#039; must be omitted.&lt;br /&gt;
&lt;br /&gt;
Files within the directories can be freely named, and are used in alphabetical order.&amp;lt;ref&amp;gt;Either through the &#039;&#039;Eject&#039;&#039; button, or the media menu.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Configuration file ===&lt;br /&gt;
In addition, a configuration file can be supplied to provide additional information to either all or one emulated device. Having a &#039;&#039;zuluscsi.ini&#039;&#039; is normally optional, but for enabling AS/400 quirks, it&#039;s mandatory.&lt;br /&gt;
&lt;br /&gt;
The configuration file must be named &#039;&#039;zuluscsi.ini&#039;&#039;, and is in a simple ini-style format. It has a global &amp;lt;tt&amp;gt;[SCSI]&amp;lt;/tt&amp;gt; section to apply settings to all devices, and &amp;lt;tt&amp;gt;[SCSI&#039;&#039;n&#039;&#039;]&amp;lt;/tt&amp;gt;, where &#039;&#039;n&#039;&#039; is the ID of the given SCSI devices.&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
These are in the scope of AS/400.&lt;br /&gt;
&lt;br /&gt;
=== Tape drive support ===&lt;br /&gt;
* create directory &amp;lt;code&amp;gt;TP0&amp;lt;/code&amp;gt;,&lt;br /&gt;
* populate with one or more 0&amp;amp;thinsp;byte files named &amp;lt;code&amp;gt;*.tap&amp;lt;/code&amp;gt; files, e. g. by using the Unix &amp;lt;code&amp;gt;touch&amp;lt;/code&amp;gt;,&lt;br /&gt;
* use the serial console to attach image(s) to the drive.&lt;br /&gt;
* &#039;&#039;zuluscsi.ini&#039;&#039;:&lt;br /&gt;
 [SCSI]&lt;br /&gt;
 System=&amp;quot;AS400_PPC&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 [SCSI0]&lt;br /&gt;
 TapeDensity = 0x25&lt;br /&gt;
&lt;br /&gt;
Caveats:&lt;br /&gt;
* When you choose an image file through the USB port&#039;s media menu, make sure that you not only choose an image file, but afterwards &#039;&#039;insert&#039;&#039; it!&lt;br /&gt;
* If you replace a hardware tape drive, make sure to delete your old tape device file first, then IPL, check/set the new device name in DST, and have auto-configuration create the new device file during the following IPL.&lt;br /&gt;
&lt;br /&gt;
This configuration has been tested on a 9401-150 running V4R5 over the course of multiple weeks:&lt;br /&gt;
* Occasional &amp;lt;tt&amp;gt;go save&amp;lt;/tt&amp;gt; 21,&lt;br /&gt;
* daily differential backups,&lt;br /&gt;
* occasional single file restores.&lt;br /&gt;
&lt;br /&gt;
== Current state ==&lt;br /&gt;
In the scope of AS/400&#039;s, ZuluSCSI&#039;s disk support is still incomplete, while CD- and tape emulation are seemingly solid. Some progress has been made, but there are still some rough edges, normally leading to crash of the Operating System with a given &#039;&#039;System Reference Code&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
At the moment, the firmware supports only a single AS/400 specific DASD device type for PPC-AS (522&amp;amp;thinsp;Bytes per sector).&lt;br /&gt;
&lt;br /&gt;
=== Reports ===&lt;br /&gt;
* 2026-08-16, mikerm, 9406-170, Zulu firmware 2026-08-07. Trying to install V4R4 on the Zulu emulated DASD. Disk was created with &amp;lt;code&amp;gt;dd if=/dev/zero of=HD6.img bs=522 count=17177940 status=progress&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;Per directions of one of the firmware developers.&amp;lt;/ref&amp;gt;&lt;br /&gt;
** First try, &#039;&#039;prefetch&#039;&#039; setting at default (8k): halts at &amp;lt;code&amp;gt;B1934505&amp;lt;/code&amp;gt; after IPL takes place from DASD&lt;br /&gt;
** Second try, &#039;&#039;prefetch&#039;&#039; set to 0: &amp;lt;code&amp;gt;B6080801&amp;lt;/code&amp;gt; after IPL takes place from DASD. More progress, and much quicker LIC install, though.&lt;br /&gt;
** Configuration file used:&lt;br /&gt;
 [SCSI]&lt;br /&gt;
 LogModeData = 1 &lt;br /&gt;
 System = AS400_BS522&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Ordinary Harddisks on the AS/400]]&lt;br /&gt;
* [[Tape Drives on old AS/400]]&lt;br /&gt;
* [[SRC]], aka System Reference Code&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [https://zuluscsi.com ZuluSCSI Website] — see the &amp;lt;tt&amp;gt;☰&amp;lt;/tt&amp;gt; button top right for more details&lt;br /&gt;
* [https://github.com/ZuluSCSI/ZuluSCSI-firmware ZuluSCSI-firmware], GitHub&lt;br /&gt;
&lt;br /&gt;
== Footnotes ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Hardware Configuration Guide]]&lt;/div&gt;</summary>
		<author><name>PoC</name></author>
	</entry>
	<entry>
		<id>http://try-as400.pocnet.net/index.php?title=ZuluSCSI&amp;diff=1815</id>
		<title>ZuluSCSI</title>
		<link rel="alternate" type="text/html" href="http://try-as400.pocnet.net/index.php?title=ZuluSCSI&amp;diff=1815"/>
		<updated>2026-08-16T21:26:21Z</updated>

		<summary type="html">&lt;p&gt;PoC: /* Examples */ typo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;ZuluSCSI&#039;&#039;&#039; by Rabbit Hole Computing is a comparatively new family of SCSI device emulators featuring an SD card based backing store. Distinct features to older, similar devices is support for Wide-SCSI, Ultra-Speed, and a fast CPU.&lt;br /&gt;
&lt;br /&gt;
ZuluSCSI also features an OpenSource firmware, so it can be extended comparatively easily.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
For most AS/400 machines, you actually want a ZuluSCSI wide, because it offers the best performance.&lt;br /&gt;
&lt;br /&gt;
The ZuluSCSI firmware can emulate multiple devices at once. There is no real need to add multiple Zulus to a given SCSI bus. One Zulu can easily saturate even the UltraWide SCSI bus of a 9401-150, and due to the SD card, delays are minimal. You can gain more performance with bigger machines, if they have multiple SCSI buses, though.&lt;br /&gt;
&lt;br /&gt;
== Hardware overview ==&lt;br /&gt;
Depending on the exact model, boards themselves have three DIP switches and tiny push buttons:&lt;br /&gt;
* 1: switch to initator mode,&lt;br /&gt;
* 2: enable debug log,&lt;br /&gt;
* 3: enable SCSI termination.&lt;br /&gt;
&lt;br /&gt;
The push buttons call the functions:&lt;br /&gt;
* Bootloader, for firmware-recovery,&lt;br /&gt;
* Eject.&lt;br /&gt;
&lt;br /&gt;
Also, three LEDs are provided, for indication of&lt;br /&gt;
* 2.8&amp;amp;thinsp;V power OK,&lt;br /&gt;
* 3.3&amp;amp;thinsp;V power OK,&lt;br /&gt;
* SD-card activity.&lt;br /&gt;
&lt;br /&gt;
The device itself needs 5&amp;amp;thinsp;V power, and can be powered by:&lt;br /&gt;
* the USB port,&lt;br /&gt;
* the termpower line of the SCSI bus,&lt;br /&gt;
* molex style power connectors.&lt;br /&gt;
&lt;br /&gt;
Usually, the integrated USB port is configured as USB modem, for usage with a terminal emulator. You can use the Linux or macOS &#039;&#039;screen&#039;&#039; command for that. Depending on your operating system, you need to find out what device file is created when plugging the Zulu&#039;s USB port. On Linux, it&#039;s &amp;lt;tt&amp;gt;/dev/ttyACM&#039;&#039;n&#039;&#039;&amp;lt;/tt&amp;gt; — &#039;&#039;n&#039;&#039; being a digit, usually 0. On macOS, it&#039;s &amp;lt;tt&amp;gt;/dev/tty.usbmodem*&amp;lt;/tt&amp;gt;, with a row of digits appended on behalf of the &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The firmware presents a simple menu driven UI for &lt;br /&gt;
&lt;br /&gt;
There is no need to shut down the device itself, it&#039;s safe to &amp;quot;pull the plug&amp;quot; when there is no activity. The Operating System running on the attached computer should, though.&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
Configuration itself is usually automatic, according to the files and directories found on the SD card. The SD card has either a FAT32&amp;lt;ref&amp;gt;Limiting files to max. 4&amp;amp;thinsp;GiB in size&amp;lt;/ref&amp;gt; or exFAT file system, the firmware understands both. It&#039;s easier to use the SD card with a card reader on a newer computer to create configurations, and files. The SD card is hotplug capable, and upon reinsertation, the ZuluSCSI reinitializes itself according to the SD card&#039;s content.&lt;br /&gt;
&lt;br /&gt;
Three devices classes are of general interest in the AS/400 world:&lt;br /&gt;
* Disk (DASD),&lt;br /&gt;
* CD/DVD (Optical),&lt;br /&gt;
* Tape.&lt;br /&gt;
&lt;br /&gt;
=== Files ===&lt;br /&gt;
File names are composed as follows:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;TT&amp;gt;&amp;lt;ID&amp;gt;[any text].&amp;lt;ext&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
  ^^   ^&lt;br /&gt;
  |    +-------------- SCSI ID character (byte offset 2)&lt;br /&gt;
  +------------------- two-character type prefix (case-insensitive)&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;TT&#039;&#039;&#039;:&lt;br /&gt;
:{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!TT&lt;br /&gt;
!Device type&lt;br /&gt;
!Default block size&lt;br /&gt;
|-&lt;br /&gt;
|HD&lt;br /&gt;
|Hard disk (fixed)&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|512&amp;amp;thinsp;Bytes&lt;br /&gt;
|-&lt;br /&gt;
|CD&lt;br /&gt;
|CD-ROM (optical)&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|2048&amp;amp;thinsp;Bytes&lt;br /&gt;
|-&lt;br /&gt;
|TP&lt;br /&gt;
|Sequential (tape)&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|512&amp;amp;thinsp;Bytes&lt;br /&gt;
|}&lt;br /&gt;
* The &#039;&#039;&#039;ID&#039;&#039;&#039; is exactly one char, and must be given in hexadecimal. This matters only for IDs ≥ 10.&lt;br /&gt;
* &#039;&#039;&#039;any text&#039;&#039;&#039; is entirely optional.&lt;br /&gt;
* The &#039;&#039;&#039;file extension&#039;&#039;&#039; doesn&#039;t matter.&lt;br /&gt;
&lt;br /&gt;
=== Directories ===&lt;br /&gt;
For a device usually allowing dynamic addition and removal of media — CD-ROM-, and tape drives. The naming scheme follows the same structure as files, but &#039;&#039;[any text]&#039;&#039; must be omitted.&lt;br /&gt;
&lt;br /&gt;
Files within the directories can be freely named, and are used in alphabetical order.&amp;lt;ref&amp;gt;Either through the &#039;&#039;Eject&#039;&#039; button, or the media menu.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Configuration file ===&lt;br /&gt;
In addition, a configuration file can be supplied to provide additional information to either all or one emulated device. Having a &#039;&#039;zuluscsi.ini&#039;&#039; is normally optional, but for enabling AS/400 quirks, it&#039;s mandatory.&lt;br /&gt;
&lt;br /&gt;
The configuration file must be named &#039;&#039;zuluscsi.ini&#039;&#039;, and is in a simple ini-style format. It has a global &amp;lt;tt&amp;gt;[SCSI]&amp;lt;/tt&amp;gt; section to apply settings to all devices, and &amp;lt;tt&amp;gt;[SCSI&#039;&#039;n&#039;&#039;]&amp;lt;/tt&amp;gt;, where &#039;&#039;n&#039;&#039; is the ID of the given SCSI devices.&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
These are in the scope of AS/400.&lt;br /&gt;
&lt;br /&gt;
=== Tape drive support ===&lt;br /&gt;
* create directory &amp;lt;code&amp;gt;TP0&amp;lt;/code&amp;gt;,&lt;br /&gt;
* populate with one or more 0&amp;amp;thinsp;byte files named &amp;lt;code&amp;gt;*.tap&amp;lt;/code&amp;gt; files, e. g. by using the Unix &amp;lt;code&amp;gt;touch&amp;lt;/code&amp;gt;,&lt;br /&gt;
* use the serial console to attach image(s) to the drive.&lt;br /&gt;
* &#039;&#039;zuluscsi.ini&#039;&#039;:&lt;br /&gt;
 [SCSI]&lt;br /&gt;
 System=&amp;quot;AS400_PPC&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 [SCSI0]&lt;br /&gt;
 TapeDensity = 0x25&lt;br /&gt;
&lt;br /&gt;
Caveats:&lt;br /&gt;
* When you choose an image file through the USB port&#039;s media menu, make sure that you not only choose an image file, but afterwards &#039;&#039;insert&#039;&#039; it!&lt;br /&gt;
* If you replace a hardware tape drive, make sure to delete your old tape device file first, then IPL, check/set the new device name in DST, and have auto-configuration create the new device file during the following IPL.&lt;br /&gt;
&lt;br /&gt;
This configuration has been tested on a 9401-150 running V4R5 over the course of multiple weeks:&lt;br /&gt;
* Occasional &amp;lt;tt&amp;gt;go save&amp;lt;/tt&amp;gt; 21,&lt;br /&gt;
* daily differential backups,&lt;br /&gt;
* occasional single file restores.&lt;br /&gt;
&lt;br /&gt;
== Current state ==&lt;br /&gt;
In the scope of AS/400&#039;s, ZuluSCSI&#039;s disk support is still incomplete, while CD- and tape emulation are seemingly solid. Some progress has been made, but there are still some rough edges, normally leading to crash of the Operating System with a given &#039;&#039;System Reference Code&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
At the moment, the firmware supports only a single AS/400 specific DASD device type for PPC-AS (522&amp;amp;thinsp;Bytes per sector).&lt;br /&gt;
&lt;br /&gt;
=== Reports ===&lt;br /&gt;
* 2026-08-16, mikerm, 9406-170, Zulu firmware 2026-08-07. Trying to install V4R4 on the Zulu emulated DASD. Disk was created with &amp;lt;code&amp;gt;dd if=/dev/zero of=HD6.img bs=522 count=17177940 status=progress&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;Per directions of one of the firmware developers.&amp;lt;/ref&amp;gt;&lt;br /&gt;
** First try, &#039;&#039;prefetch&#039;&#039; setting at default (8k): halts at &amp;lt;code&amp;gt;B1934505&amp;lt;/code&amp;gt; after IPL takes place from DASD&lt;br /&gt;
** Second try, &#039;&#039;prefetch&#039;&#039; set to 0: &amp;lt;code&amp;gt;B6080801&amp;lt;/code&amp;gt; after IPL takes place from DASD. More progress, and much quicker LIC install, though.&lt;br /&gt;
** Configuration file used:&lt;br /&gt;
 [SCSI]&lt;br /&gt;
 LogModeData = 1 &lt;br /&gt;
 System = AS400_BS522&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Ordinary Harddisks on the AS/400]]&lt;br /&gt;
* [[Tape Drives on old AS/400]]&lt;br /&gt;
* [[SRC]], aka System Reference Code&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [https://zuluscsi.com ZuluSCSI Website] — see the &amp;lt;tt&amp;gt;☰&amp;lt;/tt&amp;gt; button top right for more details&lt;br /&gt;
* [https://github.com/ZuluSCSI/ZuluSCSI-firmware ZuluSCSI-firmware], GitHub&lt;br /&gt;
&lt;br /&gt;
== Footnotes ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Hardware Configuration Guide]]&lt;/div&gt;</summary>
		<author><name>PoC</name></author>
	</entry>
	<entry>
		<id>http://try-as400.pocnet.net/index.php?title=ZuluSCSI&amp;diff=1814</id>
		<title>ZuluSCSI</title>
		<link rel="alternate" type="text/html" href="http://try-as400.pocnet.net/index.php?title=ZuluSCSI&amp;diff=1814"/>
		<updated>2026-08-16T21:25:30Z</updated>

		<summary type="html">&lt;p&gt;PoC: Expanded article&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;ZuluSCSI&#039;&#039;&#039; by Rabbit Hole Computing is a comparatively new family of SCSI device emulators featuring an SD card based backing store. Distinct features to older, similar devices is support for Wide-SCSI, Ultra-Speed, and a fast CPU.&lt;br /&gt;
&lt;br /&gt;
ZuluSCSI also features an OpenSource firmware, so it can be extended comparatively easily.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
For most AS/400 machines, you actually want a ZuluSCSI wide, because it offers the best performance.&lt;br /&gt;
&lt;br /&gt;
The ZuluSCSI firmware can emulate multiple devices at once. There is no real need to add multiple Zulus to a given SCSI bus. One Zulu can easily saturate even the UltraWide SCSI bus of a 9401-150, and due to the SD card, delays are minimal. You can gain more performance with bigger machines, if they have multiple SCSI buses, though.&lt;br /&gt;
&lt;br /&gt;
== Hardware overview ==&lt;br /&gt;
Depending on the exact model, boards themselves have three DIP switches and tiny push buttons:&lt;br /&gt;
* 1: switch to initator mode,&lt;br /&gt;
* 2: enable debug log,&lt;br /&gt;
* 3: enable SCSI termination.&lt;br /&gt;
&lt;br /&gt;
The push buttons call the functions:&lt;br /&gt;
* Bootloader, for firmware-recovery,&lt;br /&gt;
* Eject.&lt;br /&gt;
&lt;br /&gt;
Also, three LEDs are provided, for indication of&lt;br /&gt;
* 2.8&amp;amp;thinsp;V power OK,&lt;br /&gt;
* 3.3&amp;amp;thinsp;V power OK,&lt;br /&gt;
* SD-card activity.&lt;br /&gt;
&lt;br /&gt;
The device itself needs 5&amp;amp;thinsp;V power, and can be powered by:&lt;br /&gt;
* the USB port,&lt;br /&gt;
* the termpower line of the SCSI bus,&lt;br /&gt;
* molex style power connectors.&lt;br /&gt;
&lt;br /&gt;
Usually, the integrated USB port is configured as USB modem, for usage with a terminal emulator. You can use the Linux or macOS &#039;&#039;screen&#039;&#039; command for that. Depending on your operating system, you need to find out what device file is created when plugging the Zulu&#039;s USB port. On Linux, it&#039;s &amp;lt;tt&amp;gt;/dev/ttyACM&#039;&#039;n&#039;&#039;&amp;lt;/tt&amp;gt; — &#039;&#039;n&#039;&#039; being a digit, usually 0. On macOS, it&#039;s &amp;lt;tt&amp;gt;/dev/tty.usbmodem*&amp;lt;/tt&amp;gt;, with a row of digits appended on behalf of the &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The firmware presents a simple menu driven UI for &lt;br /&gt;
&lt;br /&gt;
There is no need to shut down the device itself, it&#039;s safe to &amp;quot;pull the plug&amp;quot; when there is no activity. The Operating System running on the attached computer should, though.&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
Configuration itself is usually automatic, according to the files and directories found on the SD card. The SD card has either a FAT32&amp;lt;ref&amp;gt;Limiting files to max. 4&amp;amp;thinsp;GiB in size&amp;lt;/ref&amp;gt; or exFAT file system, the firmware understands both. It&#039;s easier to use the SD card with a card reader on a newer computer to create configurations, and files. The SD card is hotplug capable, and upon reinsertation, the ZuluSCSI reinitializes itself according to the SD card&#039;s content.&lt;br /&gt;
&lt;br /&gt;
Three devices classes are of general interest in the AS/400 world:&lt;br /&gt;
* Disk (DASD),&lt;br /&gt;
* CD/DVD (Optical),&lt;br /&gt;
* Tape.&lt;br /&gt;
&lt;br /&gt;
=== Files ===&lt;br /&gt;
File names are composed as follows:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;TT&amp;gt;&amp;lt;ID&amp;gt;[any text].&amp;lt;ext&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
  ^^   ^&lt;br /&gt;
  |    +-------------- SCSI ID character (byte offset 2)&lt;br /&gt;
  +------------------- two-character type prefix (case-insensitive)&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;TT&#039;&#039;&#039;:&lt;br /&gt;
:{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!TT&lt;br /&gt;
!Device type&lt;br /&gt;
!Default block size&lt;br /&gt;
|-&lt;br /&gt;
|HD&lt;br /&gt;
|Hard disk (fixed)&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|512&amp;amp;thinsp;Bytes&lt;br /&gt;
|-&lt;br /&gt;
|CD&lt;br /&gt;
|CD-ROM (optical)&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|2048&amp;amp;thinsp;Bytes&lt;br /&gt;
|-&lt;br /&gt;
|TP&lt;br /&gt;
|Sequential (tape)&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|512&amp;amp;thinsp;Bytes&lt;br /&gt;
|}&lt;br /&gt;
* The &#039;&#039;&#039;ID&#039;&#039;&#039; is exactly one char, and must be given in hexadecimal. This matters only for IDs ≥ 10.&lt;br /&gt;
* &#039;&#039;&#039;any text&#039;&#039;&#039; is entirely optional.&lt;br /&gt;
* The &#039;&#039;&#039;file extension&#039;&#039;&#039; doesn&#039;t matter.&lt;br /&gt;
&lt;br /&gt;
=== Directories ===&lt;br /&gt;
For a device usually allowing dynamic addition and removal of media — CD-ROM-, and tape drives. The naming scheme follows the same structure as files, but &#039;&#039;[any text]&#039;&#039; must be omitted.&lt;br /&gt;
&lt;br /&gt;
Files within the directories can be freely named, and are used in alphabetical order.&amp;lt;ref&amp;gt;Either through the &#039;&#039;Eject&#039;&#039; button, or the media menu.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Configuration file ===&lt;br /&gt;
In addition, a configuration file can be supplied to provide additional information to either all or one emulated device. Having a &#039;&#039;zuluscsi.ini&#039;&#039; is normally optional, but for enabling AS/400 quirks, it&#039;s mandatory.&lt;br /&gt;
&lt;br /&gt;
The configuration file must be named &#039;&#039;zuluscsi.ini&#039;&#039;, and is in a simple ini-style format. It has a global &amp;lt;tt&amp;gt;[SCSI]&amp;lt;/tt&amp;gt; section to apply settings to all devices, and &amp;lt;tt&amp;gt;[SCSI&#039;&#039;n&#039;&#039;]&amp;lt;/tt&amp;gt;, where &#039;&#039;n&#039;&#039; is the ID of the given SCSI devices.&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
These are in the scope of AS/400.&lt;br /&gt;
&lt;br /&gt;
=== Tape drive support ===&lt;br /&gt;
* create directory &amp;lt;code&amp;gt;TP0&amp;lt;/code&amp;gt;,&lt;br /&gt;
* populate with one or more 0&amp;amp;thinsp;byte files named &amp;lt;code&amp;gt;*.tap&amp;lt;/code&amp;gt; files, e. g. by using the Unix &amp;lt;code&amp;gt;touch&amp;lt;/command&amp;gt;,&lt;br /&gt;
* use the serial console to attach image(s) to the drive.&lt;br /&gt;
* &#039;&#039;zuluscsi.ini&#039;&#039;:&lt;br /&gt;
 [SCSI]&lt;br /&gt;
 System=&amp;quot;AS400_PPC&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 [SCSI0]&lt;br /&gt;
 TapeDensity = 0x25&lt;br /&gt;
&lt;br /&gt;
Caveats:&lt;br /&gt;
* When you choose an image file through the USB port&#039;s media menu, make sure that you not only choose an image file, but afterwards &#039;&#039;insert&#039;&#039; it!&lt;br /&gt;
* If you replace a hardware tape drive, make sure to delete your old tape device file first, then IPL, check/set the new device name in DST, and have auto-configuration create the new device file during the following IPL.&lt;br /&gt;
&lt;br /&gt;
This configuration has been tested on a 9401-150 running V4R5 over the course of multiple weeks:&lt;br /&gt;
* Occasional &amp;lt;tt&amp;gt;go save&amp;lt;/tt&amp;gt; 21,&lt;br /&gt;
* daily differential backups,&lt;br /&gt;
* occasional single file restores.&lt;br /&gt;
&lt;br /&gt;
== Current state ==&lt;br /&gt;
In the scope of AS/400&#039;s, ZuluSCSI&#039;s disk support is still incomplete, while CD- and tape emulation are seemingly solid. Some progress has been made, but there are still some rough edges, normally leading to crash of the Operating System with a given &#039;&#039;System Reference Code&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
At the moment, the firmware supports only a single AS/400 specific DASD device type for PPC-AS (522&amp;amp;thinsp;Bytes per sector).&lt;br /&gt;
&lt;br /&gt;
=== Reports ===&lt;br /&gt;
* 2026-08-16, mikerm, 9406-170, Zulu firmware 2026-08-07. Trying to install V4R4 on the Zulu emulated DASD. Disk was created with &amp;lt;code&amp;gt;dd if=/dev/zero of=HD6.img bs=522 count=17177940 status=progress&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;Per directions of one of the firmware developers.&amp;lt;/ref&amp;gt;&lt;br /&gt;
** First try, &#039;&#039;prefetch&#039;&#039; setting at default (8k): halts at &amp;lt;code&amp;gt;B1934505&amp;lt;/code&amp;gt; after IPL takes place from DASD&lt;br /&gt;
** Second try, &#039;&#039;prefetch&#039;&#039; set to 0: &amp;lt;code&amp;gt;B6080801&amp;lt;/code&amp;gt; after IPL takes place from DASD. More progress, and much quicker LIC install, though.&lt;br /&gt;
** Configuration file used:&lt;br /&gt;
 [SCSI]&lt;br /&gt;
 LogModeData = 1 &lt;br /&gt;
 System = AS400_BS522&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Ordinary Harddisks on the AS/400]]&lt;br /&gt;
* [[Tape Drives on old AS/400]]&lt;br /&gt;
* [[SRC]], aka System Reference Code&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [https://zuluscsi.com ZuluSCSI Website] — see the &amp;lt;tt&amp;gt;☰&amp;lt;/tt&amp;gt; button top right for more details&lt;br /&gt;
* [https://github.com/ZuluSCSI/ZuluSCSI-firmware ZuluSCSI-firmware], GitHub&lt;br /&gt;
&lt;br /&gt;
== Footnotes ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Hardware Configuration Guide]]&lt;/div&gt;</summary>
		<author><name>PoC</name></author>
	</entry>
	<entry>
		<id>http://try-as400.pocnet.net/index.php?title=ZuluSCSI&amp;diff=1813</id>
		<title>ZuluSCSI</title>
		<link rel="alternate" type="text/html" href="http://try-as400.pocnet.net/index.php?title=ZuluSCSI&amp;diff=1813"/>
		<updated>2026-08-16T19:56:28Z</updated>

		<summary type="html">&lt;p&gt;PoC: Moore precise&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;ZuluSCSI&#039;&#039; is a comparatively new family of SCSI device emulators. Distinct features to older, similar devices is support for Wide-SCSI, Ultra-Speed, and a fast CPU.&lt;br /&gt;
&lt;br /&gt;
ZuluSCSI also features an OpenSource firmware, so it can be extended comparatively easily.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Current state ==&lt;br /&gt;
In the scope of AS/400&#039;s, ZuluSCSI&#039;s disk support is still in its infancy, while CD- and tape emulation are seemingly solid. Some progress has been made, but there are still some rough edges, normally leading to crash of the Operating System with a given &#039;&#039;System Reference Code&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
At the moment, the firmware supports only a single DASD device type.&lt;br /&gt;
&lt;br /&gt;
=== Reports ===&lt;br /&gt;
* 2026-08-16, mikerm, 9406-170, Zulu firmware 2026-08-07. Trying to install V4R4 on the Zulu emulated DASD. Disk was created with &amp;lt;code&amp;gt;dd if=/dev/zero of=HD6.img bs=522 count=17177940 status=progress&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;Per directions of one of the firmware developers.&amp;lt;/ref&amp;gt;&lt;br /&gt;
** First try, &#039;&#039;prefetch&#039;&#039; setting at default (8k): halts at &amp;lt;code&amp;gt;B1934505&amp;lt;/code&amp;gt; after IPL takes place from DASD&lt;br /&gt;
** Second try, &#039;&#039;prefetch&#039;&#039; set to 0: &amp;lt;code&amp;gt;B6080801&amp;lt;/code&amp;gt; after IPL takes place from DASD. More progress, and much quicker LIC install, though.&lt;br /&gt;
** Configuration file used:&lt;br /&gt;
 [SCSI]&lt;br /&gt;
 LogModeData = 1 &lt;br /&gt;
 System = AS400_BS522&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Ordinary Harddisks on the AS/400]]&lt;br /&gt;
* [[Tape Drives on old AS/400]]&lt;br /&gt;
* [[SRC]], aka System Reference Code&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [https://zuluscsi.com ZuluSCSI Website] — see the &amp;lt;tt&amp;gt;☰&amp;lt;/tt&amp;gt; button top right for more details&lt;br /&gt;
* [https://github.com/ZuluSCSI/ZuluSCSI-firmware ZuluSCSI-firmware], GitHub&lt;br /&gt;
&lt;br /&gt;
== Footnotes ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Hardware Configuration Guide]]&lt;/div&gt;</summary>
		<author><name>PoC</name></author>
	</entry>
	<entry>
		<id>http://try-as400.pocnet.net/index.php?title=ZuluSCSI&amp;diff=1812</id>
		<title>ZuluSCSI</title>
		<link rel="alternate" type="text/html" href="http://try-as400.pocnet.net/index.php?title=ZuluSCSI&amp;diff=1812"/>
		<updated>2026-08-16T19:49:26Z</updated>

		<summary type="html">&lt;p&gt;PoC: Preliminary&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;ZuluSCSI&#039;&#039; is a comparatively new family of SCSI device emulators. Distinct features to older, similar devices is support for Wide-SCSI, Ultra-Speed, and a fast CPU.&lt;br /&gt;
&lt;br /&gt;
ZuluSCSI also features an OpenSource firmware, so it can be extended comparatively easily.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Current state ==&lt;br /&gt;
In the scope of AS/400&#039;s, ZuluSCSI&#039;s disk support is still in its infancy. Some progress has been made, but there are still some rough edges, normally leading to crash of the Operating System with a given &#039;&#039;System Reference Code&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
At the moment, the firmware supports only a single DASD device.&lt;br /&gt;
&lt;br /&gt;
=== Reports ===&lt;br /&gt;
* 2026-08-16, mikerm, 9406-170, Zulu firmware 2026-08-07. Trying to install V4R4 on the Zulu emulated DASD.&lt;br /&gt;
** First try, &#039;&#039;prefetch&#039;&#039; setting at default (8k): halts at &amp;lt;code&amp;gt;B1934505&amp;lt;/code&amp;gt;&lt;br /&gt;
** Second try, &#039;&#039;prefetch&#039;&#039; set to 0: &amp;lt;code&amp;gt;B6080801&amp;lt;/code&amp;gt;. More progress, and much quicker LIC install, though.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Ordinary Harddisks on the AS/400]]&lt;br /&gt;
* [[Tape Drives on old AS/400]]&lt;br /&gt;
* [[SRC]], aka System Reference Code&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [https://zuluscsi.com ZuluSCSI Website] — see the &amp;lt;tt&amp;gt;☰&amp;lt;/tt&amp;gt; button top right for more details&lt;br /&gt;
* [https://github.com/ZuluSCSI/ZuluSCSI-firmware ZuluSCSI-firmware], GitHub&lt;br /&gt;
&lt;br /&gt;
[[Category:Hardware Configuration Guide]]&lt;/div&gt;</summary>
		<author><name>PoC</name></author>
	</entry>
	<entry>
		<id>http://try-as400.pocnet.net/index.php?title=System_Internals:SLIC_DASD_device_recognition&amp;diff=1811</id>
		<title>System Internals:SLIC DASD device recognition</title>
		<link rel="alternate" type="text/html" href="http://try-as400.pocnet.net/index.php?title=System_Internals:SLIC_DASD_device_recognition&amp;diff=1811"/>
		<updated>2026-08-16T19:22:48Z</updated>

		<summary type="html">&lt;p&gt;PoC: ±Cat/AI heading&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{AI generated not reviewed}}&lt;br /&gt;
The &#039;&#039;&#039;SLIC DASD device recognition&#039;&#039;&#039; table is the static list, inside the OS/400 Licensed Internal Code (SLIC), of which SCSI disk drives the system will accept as a DASD (disk) unit. This page describes how that recognition works, how to find and decode the table in a SLIC image, and — as a worked example — the complete list a V4R4 machine accepts. The method generalises to any release and to other SLIC device tables.&lt;br /&gt;
&lt;br /&gt;
Understanding it matters for preservation: OS/400 refuses ordinary SCSI disks, so keeping a machine alive after a disk failure means presenting a drive (real or emulated) that answers the SCSI bus the way SLIC expects.&lt;br /&gt;
&lt;br /&gt;
== How SLIC decides a disk is acceptable ==&lt;br /&gt;
&lt;br /&gt;
A disk becomes an eligible DASD unit only if it passes three independent gates, all implemented in the SLIC disk device driver:&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;SCSI INQUIRY must match a static table.&#039;&#039;&#039; SLIC compares the drive&#039;s INQUIRY vendor id (bytes 8–15) and product id (bytes 16–31) against a built-in table. Only IBM-badged units qualify: the vendor id is normally &amp;lt;code&amp;gt;IBMAS400&amp;lt;/code&amp;gt; (a handful of early units use &amp;lt;code&amp;gt;IBM␠␠␠␠␠&amp;lt;/code&amp;gt; and two OEM units use &amp;lt;code&amp;gt;QUANTUM␠&amp;lt;/code&amp;gt;). An off-the-shelf drive reports its own vendor and is rejected. This is exactly what the &amp;quot;custom firmware&amp;quot; on IBM&#039;s 660x/671x disks does: IBM reflashed standard Ultrastar/Corsair mechanisms to answer INQUIRY with an IBM vendor id and an IBM product id.&lt;br /&gt;
# &#039;&#039;&#039;Vendor-unique SKIP READ / SKIP WRITE.&#039;&#039;&#039; The driver issues IBM vendor-unique SCSI commands that read or write a run of sectors while skipping masked ones, used by the Single-Level Store paging path. A faithful drive must implement these, not just standard READ/WRITE.&lt;br /&gt;
# &#039;&#039;&#039;Capacity from VPD.&#039;&#039;&#039; The unit&#039;s size is taken at run time from the drive&#039;s Vital Product Data / &amp;lt;code&amp;gt;READ CAPACITY&amp;lt;/code&amp;gt;, not from the table — the table has no capacity column. An impersonating drive must report a capacity that is legal for the feature type it claims.&lt;br /&gt;
&lt;br /&gt;
== Finding and decoding the table ==&lt;br /&gt;
&lt;br /&gt;
In a SLIC image the table is a run of fixed-size records. On V4R4 each record is 40 bytes:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bytes  0- 3  feature type    EBCDIC digits, e.g. F6F6F0F7 = &amp;quot;6607&amp;quot;&lt;br /&gt;
bytes  4- 5  model           EBCDIC, e.g. &amp;quot;1 &amp;quot;&lt;br /&gt;
byte      6  class flag      0x00 normal; 0x80 on the 18 GB Ultra2/LVD units&lt;br /&gt;
bytes  7-15  reserved        0x40 (EBCDIC space) padding&lt;br /&gt;
bytes 16-23  INQUIRY vendor  ASCII, matched against INQUIRY bytes 8-15&lt;br /&gt;
bytes 24-39  INQUIRY product ASCII, matched against INQUIRY bytes 16-31&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The type and model are EBCDIC (digit &#039;&#039;n&#039;&#039; = byte &amp;lt;code&amp;gt;0xF&#039;&#039;n&#039;&#039;&amp;lt;/code&amp;gt;); the INQUIRY strings are ASCII. To locate the table, search the image for the ASCII vendor strings &amp;lt;code&amp;gt;IBMAS400&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;QUANTUM␠&amp;lt;/code&amp;gt;: the records sit at a fixed 40-byte stride around them. The same trick — anchor on a known ASCII string, then read the fixed-width record around it — recovers other SLIC hardware tables (IOP/controller CCIN tables, adapter tables, and so on).&lt;br /&gt;
&lt;br /&gt;
== The V4R4 list ==&lt;br /&gt;
&lt;br /&gt;
Every drive a V4R4 system accepts, decoded from the image. &amp;quot;Physical drive&amp;quot; is identification from IBM/Quantum model nomenclature, not read from the binary; the feature type, model and INQUIRY strings are.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Feature/Model !! INQUIRY vendor !! INQUIRY product !! Physical drive&lt;br /&gt;
|-&lt;br /&gt;
| 6109 / 0 || &amp;lt;code&amp;gt;IBM␠␠␠␠␠&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0663H12&amp;lt;/code&amp;gt; || IBM 0663 &amp;quot;Corsair&amp;quot;, ~2 GB&lt;br /&gt;
|-&lt;br /&gt;
| 6109 / 1 || &amp;lt;code&amp;gt;IBM␠␠␠␠␠&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0661371&amp;lt;/code&amp;gt; || IBM 0661 &amp;quot;Pixie&amp;quot;, ~0.37 GB&lt;br /&gt;
|-&lt;br /&gt;
| 6105 / 0 || &amp;lt;code&amp;gt;IBM␠␠␠␠␠&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0661467&amp;lt;/code&amp;gt; || IBM 0661 &amp;quot;Pixie&amp;quot;, ~0.47 GB&lt;br /&gt;
|-&lt;br /&gt;
| 6107 / 0 || &amp;lt;code&amp;gt;IBMAS400&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0664M1H&amp;lt;/code&amp;gt; || IBM 0664 &amp;quot;Corsair-4&amp;quot;, ~4 GB&lt;br /&gt;
|-&lt;br /&gt;
| 6603 / 0 || &amp;lt;code&amp;gt;IBMAS400&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0664N1H&amp;lt;/code&amp;gt; || IBM 0664 &amp;quot;Corsair-4&amp;quot;, ~4 GB&lt;br /&gt;
|-&lt;br /&gt;
| 6603 / 1 || &amp;lt;code&amp;gt;IBMAS400&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0662S12&amp;lt;/code&amp;gt; || IBM 0662 &amp;quot;Corsair&amp;quot;, ~1.2 GB&lt;br /&gt;
|-&lt;br /&gt;
| 6602 / 0 || &amp;lt;code&amp;gt;IBMAS400&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0662SW1&amp;lt;/code&amp;gt; || IBM 0662 &amp;quot;Corsair&amp;quot;, ~1.0 GB&lt;br /&gt;
|-&lt;br /&gt;
| 6602 / 1 || &amp;lt;code&amp;gt;IBMAS400&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;DFHSS1W&amp;lt;/code&amp;gt; || IBM Ultrastar XP, ~1 GB&lt;br /&gt;
|-&lt;br /&gt;
| 6605 / 1 || &amp;lt;code&amp;gt;IBMAS400&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;DFHSS2W&amp;lt;/code&amp;gt; || IBM Ultrastar XP, ~2 GB&lt;br /&gt;
|-&lt;br /&gt;
| 6606 / 1 || &amp;lt;code&amp;gt;IBMAS400&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;DFHSS4W&amp;lt;/code&amp;gt; || IBM Ultrastar XP, ~4 GB&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;6607 / 1&#039;&#039;&#039; || &amp;lt;code&amp;gt;IBMAS400&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;DCHS09W&amp;lt;/code&amp;gt; || IBM Ultrastar 2XP, ~9 GB&lt;br /&gt;
|-&lt;br /&gt;
| 6713 / 1 || &amp;lt;code&amp;gt;IBMAS400&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;DGHS18U&amp;lt;/code&amp;gt; || IBM Ultrastar 18XP, ~18 GB&lt;br /&gt;
|-&lt;br /&gt;
| 6714 / 1 || &amp;lt;code&amp;gt;IBMAS400&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;DGVS09U&amp;lt;/code&amp;gt; || IBM Ultrastar 9ES/9LZX, ~9 GB&lt;br /&gt;
|-&lt;br /&gt;
| 6717 / 1 || &amp;lt;code&amp;gt;QUANTUM␠&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;SSQD107&amp;lt;/code&amp;gt; || Quantum, ~10.7 GB&lt;br /&gt;
|-&lt;br /&gt;
| 6730 / 0 || &amp;lt;code&amp;gt;QUANTUM␠&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;SSQD160&amp;lt;/code&amp;gt; || Quantum, ~16.0 GB&lt;br /&gt;
|-&lt;br /&gt;
| 6731 / 0 || &amp;lt;code&amp;gt;IBMAS400&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;DRVS18D&amp;lt;/code&amp;gt; || IBM Ultrastar 18ES/18LZX, ~18 GB, Ultra2/LVD&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Feature-type numbers do not track capacity linearly: the type encodes the AS/400 usable-capacity class (after 520-byte-sector overhead), not the drive&#039;s native size. The much-cited 6607 is here as &amp;lt;code&amp;gt;IBMAS400&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;DCHS09W&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;Ide&amp;quot; in SLIC symbol names (e.g. the driver classes handling these disks) is the disk device-driver namespace, &#039;&#039;&#039;not&#039;&#039;&#039; ATA/IDE.&lt;br /&gt;
* Numbers like 2748, 6502, 6512, 6751, 6753, 6754 that appear on other SLIC symbols are IOP / disk-controller CCINs, not drive models.&lt;br /&gt;
* An emulated target (for example on open SCSI-emulator firmware) must present one of the vendor+product pairs above verbatim, space-padded to the SCSI field widths, implement the vendor-unique SKIP commands, and report a legal capacity via &amp;lt;code&amp;gt;READ CAPACITY&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Category:System Internals]]&lt;/div&gt;</summary>
		<author><name>PoC</name></author>
	</entry>
	<entry>
		<id>http://try-as400.pocnet.net/index.php?title=System_Files:QFILEMCD&amp;diff=1810</id>
		<title>System Files:QFILEMCD</title>
		<link rel="alternate" type="text/html" href="http://try-as400.pocnet.net/index.php?title=System_Files:QFILEMCD&amp;diff=1810"/>
		<updated>2026-08-16T19:22:17Z</updated>

		<summary type="html">&lt;p&gt;PoC: ±Cat/AI heading&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{AI generated not reviewed}}&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;code&amp;gt;QFILEMCD&amp;lt;/code&amp;gt;&#039;&#039;&#039; is the larger of the two container files found on AS/400 SAVSYS and Licensed Internal Code installation media. It is a backup of &#039;&#039;&#039;SLIC&#039;&#039;&#039; itself — the System Licensed Internal Code that sits below OS/400 — stored as a small number of very large memory segments. Its internal format is called &#039;&#039;&#039;&amp;lt;code&amp;gt;COPYDIR&amp;lt;/code&amp;gt;&#039;&#039;&#039; after the eyecatcher at offset zero.&lt;br /&gt;
&lt;br /&gt;
Practically, this is the file to reach for if you want to read the machine&#039;s own code without touching a running system. Its segments are a byte-for-byte image of what the link loader maps into memory, so an address recovered from a crash, a trace or a [[SRC|system reference code]] can be looked up directly in a file on your workstation. The companion file [[System Files:QFILEIML]] carries the loadable IOP, adapter and service processor microcode instead.&lt;br /&gt;
&lt;br /&gt;
Both files are containers of [[Data Structures:LID|LIDs]], but at different granularities, and the relationship between them is described under &#039;&#039;Two directories, two granularities&#039;&#039; below.&lt;br /&gt;
&lt;br /&gt;
The figures quoted here come from one V4R4 image of 472,846,336 bytes (451&amp;amp;thinsp;MiB). Treat structure as general and numbers as release-specific; the format is unchanged from V4R4 through V7R4, across install media and SAVSYS output alike.&lt;br /&gt;
&lt;br /&gt;
== Header ==&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Contents&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;0x00&amp;lt;/code&amp;gt;&lt;br /&gt;
|Eyecatcher &amp;lt;code&amp;gt;COPYDIR&amp;amp;nbsp;&amp;lt;/code&amp;gt; in EBCDIC (&amp;lt;code&amp;gt;C3 D6 D7 E8 C4 C9 D9 40&amp;lt;/code&amp;gt;), a zero byte, then the two EBCDIC characters &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;0x1C&amp;lt;/code&amp;gt;&lt;br /&gt;
|32-bit total size of the payload area — see below. Confirmed on three independent samples&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;0x26&amp;lt;/code&amp;gt;&lt;br /&gt;
|Release level, then the &#039;&#039;&#039;system serial number&#039;&#039;&#039;, EBCDIC&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;0x50&amp;lt;/code&amp;gt;&lt;br /&gt;
|Licensed Internal Code banner, EBCDIC, in 48-character chunks&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;0x1C0&amp;lt;/code&amp;gt;&lt;br /&gt;
|Start of the directory&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The string in a V4R4 image reads:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
V4R4M044-C6295  2606071417&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and in a V7R4 one taken by SAVSYS from a running machine:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
V7R4M021-7886W&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The first field is the release and modification level. &#039;&#039;&#039;The five characters after the hyphen are the system serial number.&#039;&#039;&#039; That is not an inference: the owner of the V7R4 machine confirms its serial is &amp;lt;code&amp;gt;7886W&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
On &#039;&#039;&#039;installation media&#039;&#039;&#039; the same field carries a build or media tag instead — a V7R4 install ISO reads &amp;lt;code&amp;gt;V7R4M021-821BV&amp;lt;/code&amp;gt; — so what the field means depends on how the image was produced. Both forms are five characters, which makes them easy to confuse.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&#039;&#039;&#039;Note!&#039;&#039;&#039; A LIC backup is therefore &#039;&#039;&#039;not anonymous&#039;&#039;&#039;: it records the serial number of the machine it came from. The serial is also one of the values the system password is keyed on (see [[CISC AS/400 LIC Tapes]]), so treat these files as identifying if you share them.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the V4R4 sample the ten digits after the serial parse naturally as a timestamp of the form &amp;lt;code&amp;gt;YYMMDDHHMM&amp;lt;/code&amp;gt;, making that backup 2026-06-07 14:17. That part &#039;&#039;&#039;is&#039;&#039;&#039; an inference from the shape of the field, and the V7R4 sample carries binary rather than digits in the same place, so the layout after the serial is not fixed.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&#039;&#039;&#039;Note!&#039;&#039;&#039; The header is &#039;&#039;&#039;not&#039;&#039;&#039; a fixed 192 (&amp;lt;code&amp;gt;0xC0&amp;lt;/code&amp;gt;) bytes, despite older format notes saying so. The IBM legal banner runs on well past that point, and in this V4R4 image the directory does not begin until &amp;lt;code&amp;gt;0x1C0&amp;lt;/code&amp;gt;. A parser should locate the directory by scanning for the first 64-byte-aligned block that has the shape of an entry, rather than seeking to a constant.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The 32-bit field at &amp;lt;code&amp;gt;0x1C&amp;lt;/code&amp;gt; holds &amp;lt;code&amp;gt;0x1C2F0000&amp;lt;/code&amp;gt;, which is exactly the end of the last segment&#039;s data. It is a total-payload-size field and makes a good consistency check after parsing the directory: accumulate the entries and you should arrive at the same number.&lt;br /&gt;
&lt;br /&gt;
== The directory ==&lt;br /&gt;
The directory is a run of 64-byte entries beginning at &amp;lt;code&amp;gt;0x1C0&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Size&lt;br /&gt;
!Field&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x00&amp;lt;/code&amp;gt;&lt;br /&gt;
|8&lt;br /&gt;
|Always zero in observed data&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x08&amp;lt;/code&amp;gt;&lt;br /&gt;
|8&lt;br /&gt;
|Flags. See the bit-numbering warning below&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x10&amp;lt;/code&amp;gt;&lt;br /&gt;
|8&lt;br /&gt;
|SLS address of the saved segment&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x18&amp;lt;/code&amp;gt;&lt;br /&gt;
|8&lt;br /&gt;
|Segment attributes; the top 16 bits carry the useful value&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x20&amp;lt;/code&amp;gt;&lt;br /&gt;
|8&lt;br /&gt;
|Always zero in observed data&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x28&amp;lt;/code&amp;gt;&lt;br /&gt;
|8&lt;br /&gt;
|Offset to the segment data, &#039;&#039;&#039;absolute from the start of the file&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x30&amp;lt;/code&amp;gt;&lt;br /&gt;
|4&lt;br /&gt;
|Segment length, in &#039;&#039;&#039;raw bytes&#039;&#039;&#039; — not blocks&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x34&amp;lt;/code&amp;gt;&lt;br /&gt;
|4&lt;br /&gt;
|Always zero in observed data&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x38&amp;lt;/code&amp;gt;&lt;br /&gt;
|8&lt;br /&gt;
|Always zero in observed data&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Two details cause most of the trouble people have with this structure, and both were originally got wrong here:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Flags use IBM&#039;s MSB-first bit numbering.&#039;&#039;&#039; Older notes describe the field as &amp;lt;code&amp;gt;bbt 0:3&amp;lt;/code&amp;gt;, and a reader used to LSB-first numbering will look in the bottom nibble and find nothing. Bit 0 is the &#039;&#039;most&#039;&#039; significant bit, so the value lives in the &#039;&#039;&#039;top&#039;&#039;&#039; nibble of the 8-byte field. A normal entry reads &amp;lt;code&amp;gt;0x1000000000000000&amp;lt;/code&amp;gt;; the end-of-directory marker reads &amp;lt;code&amp;gt;0xF000000000000000&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;The data offset is absolute.&#039;&#039;&#039; It is measured from the start of the file, not from the end of the directory. Reading it as relative shifts every extracted segment by the size of the directory, which produces code that disassembles almost plausibly and is wrong everywhere.&lt;br /&gt;
&lt;br /&gt;
In this image the directory holds &#039;&#039;&#039;32 entries&#039;&#039;&#039;, with the terminator at &amp;lt;code&amp;gt;0x9C0&amp;lt;/code&amp;gt; and the directory ending at &amp;lt;code&amp;gt;0xA00&amp;lt;/code&amp;gt;. The first entry has a data offset of zero, which means the header and directory physically occupy the first &amp;lt;code&amp;gt;0xA00&amp;lt;/code&amp;gt; bytes of the first segment&#039;s stored image. This is expected rather than a bug, but a tool that extracts that segment will see the container&#039;s own header at the front of it.&lt;br /&gt;
&lt;br /&gt;
Segment lengths are consistently a whole number of 4&amp;amp;thinsp;KiB pages less than a power-of-two boundary: &amp;lt;code&amp;gt;0xFFF000&amp;lt;/code&amp;gt; is 16&amp;amp;thinsp;MiB minus one page, &amp;lt;code&amp;gt;0x7FF000&amp;lt;/code&amp;gt; is 8&amp;amp;thinsp;MiB minus one page, and so on.&lt;br /&gt;
&lt;br /&gt;
== Contents of a typical backup ==&lt;br /&gt;
The 32 segments of this image, with names from a community-maintained SLS address reference. Where the name column is blank, the segment&#039;s purpose has not been established.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!SLS address&lt;br /&gt;
!Length&lt;br /&gt;
!Name&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;FFFFFFFFB1 000000&amp;lt;/code&amp;gt;&lt;br /&gt;
|16&amp;amp;thinsp;MiB&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;FFFFFFFFB2 000000&amp;lt;/code&amp;gt;&lt;br /&gt;
|16&amp;amp;thinsp;MiB&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;FFFFFFFFB3 000000&amp;lt;/code&amp;gt;&lt;br /&gt;
|16&amp;amp;thinsp;MiB&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;FFFFFFFFB5 000000&amp;lt;/code&amp;gt;&lt;br /&gt;
|16&amp;amp;thinsp;MiB&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;FFFFFFFFC1 000000&amp;lt;/code&amp;gt;&lt;br /&gt;
|16&amp;amp;thinsp;MiB&lt;br /&gt;
|Link Loader — LIC Code&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;FFFFFFFFC2 000000&amp;lt;/code&amp;gt;&lt;br /&gt;
|16&amp;amp;thinsp;MiB&lt;br /&gt;
|Link Loader — LIC Data&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;FFFFFFFFC3 000000&amp;lt;/code&amp;gt;&lt;br /&gt;
|16&amp;amp;thinsp;MiB&lt;br /&gt;
|Link Loader — LIC Code (2)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;FFFFFFFFC4 000000&amp;lt;/code&amp;gt;&lt;br /&gt;
|16&amp;amp;thinsp;MiB&lt;br /&gt;
|Link Loader — LIC Code (3)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;FFFFFFFFC5 000000&amp;lt;/code&amp;gt;&lt;br /&gt;
|16&amp;amp;thinsp;MiB&lt;br /&gt;
|Link Loader — LIC Code (4)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;FFFFFFFFC6 000000&amp;lt;/code&amp;gt;&lt;br /&gt;
|8&amp;amp;thinsp;MiB&lt;br /&gt;
|Link Loader — LIC Code (5)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;FFFFFFFFC7 000000&amp;lt;/code&amp;gt;&lt;br /&gt;
|16&amp;amp;thinsp;MiB&lt;br /&gt;
|Mixed — component code and NLS text pools&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;FFFFFFFFC8 000000&amp;lt;/code&amp;gt;&lt;br /&gt;
|8&amp;amp;thinsp;MiB&lt;br /&gt;
|Mixed — bignum/JVM code and NLS text pools&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;FFFFFFFFF1 000000&amp;lt;/code&amp;gt;&lt;br /&gt;
|4&amp;amp;thinsp;MiB&lt;br /&gt;
|Link Loader TOC&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;FFFFFFFFF2 000000&amp;lt;/code&amp;gt;&lt;br /&gt;
|16&amp;amp;thinsp;MiB&lt;br /&gt;
|Service LID&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;FFFFFFFFF4 000000&amp;lt;/code&amp;gt;&lt;br /&gt;
|16&amp;amp;thinsp;MiB&lt;br /&gt;
|Service LID (2)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;FFFFFFFFFE 000000&amp;lt;/code&amp;gt;&lt;br /&gt;
|15&amp;amp;thinsp;MiB&lt;br /&gt;
|Pageable BLA&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;FFFFFFFFD1 000000&amp;lt;/code&amp;gt;&lt;br /&gt;
|16&amp;amp;thinsp;MiB&lt;br /&gt;
|Link Loader Information&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;FFFFFFFFD2 000000&amp;lt;/code&amp;gt;&lt;br /&gt;
|16&amp;amp;thinsp;MiB&lt;br /&gt;
|Link Loader Information, Code, Data&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;FFFFFFFFD3 000000&amp;lt;/code&amp;gt;&lt;br /&gt;
|16&amp;amp;thinsp;MiB&lt;br /&gt;
|Link Loader Information (2)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;FFFFFFFFD4 000000&amp;lt;/code&amp;gt;&lt;br /&gt;
|16&amp;amp;thinsp;MiB&lt;br /&gt;
|Mixed — JVM strings and DST debug symbol table&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;FFFFFFFF90 010000&amp;lt;/code&amp;gt;&lt;br /&gt;
|60&amp;amp;thinsp;KiB&lt;br /&gt;
|LID Directory&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;FFFFFFFF91 000000&amp;lt;/code&amp;gt;&lt;br /&gt;
|16&amp;amp;thinsp;MiB&lt;br /&gt;
|LID NUC2 A-Side&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;FFFFFFFF92 000000&amp;lt;/code&amp;gt;&lt;br /&gt;
|16&amp;amp;thinsp;MiB&lt;br /&gt;
|LID NUC2 B-Side&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;FFFFFFFF93 000000&amp;lt;/code&amp;gt;&lt;br /&gt;
|16&amp;amp;thinsp;MiB&lt;br /&gt;
|LID NUC1 A-Side&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;FFFFFFFF94 000000&amp;lt;/code&amp;gt;&lt;br /&gt;
|16&amp;amp;thinsp;MiB&lt;br /&gt;
|LID NUC1 B-Side&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;FFFFFFFF95 000000&amp;lt;/code&amp;gt;&lt;br /&gt;
|16&amp;amp;thinsp;MiB&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;FFFFFFFF96 000000&amp;lt;/code&amp;gt;&lt;br /&gt;
|16&amp;amp;thinsp;MiB&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;FFFFFFFF9A 000000&amp;lt;/code&amp;gt;&lt;br /&gt;
|8&amp;amp;thinsp;MiB&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;FFFFFFFF9B 000000&amp;lt;/code&amp;gt;&lt;br /&gt;
|8&amp;amp;thinsp;MiB&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;FFFFFFFFA1 000000&amp;lt;/code&amp;gt;&lt;br /&gt;
|16&amp;amp;thinsp;MiB&lt;br /&gt;
|LID Manager&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;FFFFFFFFA2 000000&amp;lt;/code&amp;gt;&lt;br /&gt;
|16&amp;amp;thinsp;MiB&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;FFFFFFFF69 000000&amp;lt;/code&amp;gt;&lt;br /&gt;
|16&amp;amp;thinsp;MiB&lt;br /&gt;
|IDE&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
So a backup of this shape is the SLIC boot and loader nucleus: link loader code and data, the loader&#039;s table of contents, the LID subsystem&#039;s own bookkeeping, and both IPL sides of the two nucleus LIDs. It is not the whole of the machine&#039;s code.&lt;br /&gt;
&lt;br /&gt;
=== A and B sides ===&lt;br /&gt;
Several segments appear twice, distinguished as &#039;&#039;A-side&#039;&#039; and &#039;&#039;B-side&#039;&#039;. An AS/400 keeps two copies of its Licensed Internal Code so that an update can be applied to one while the other remains a fallback. A normal, unattended IPL runs the &#039;&#039;&#039;B side&#039;&#039;&#039;, so B is what a running machine is executing and B is what static analysis should be done against. Because the two sides are normally near-identical, a byte comparison against the A side is not evidence that A is the live one — the test only means something on a segment that actually differs between them.&lt;br /&gt;
&lt;br /&gt;
== Two directories, two granularities ==&lt;br /&gt;
A common source of confusion is that &amp;lt;code&amp;gt;QFILEMCD&amp;lt;/code&amp;gt; appears to have two completely different directory formats. It does, and they nest:&lt;br /&gt;
&lt;br /&gt;
* The &#039;&#039;&#039;coarse&#039;&#039;&#039; level is &amp;lt;code&amp;gt;COPYDIR&amp;lt;/code&amp;gt;&#039;s own directory, documented above: 64-byte entries, one per 16&amp;amp;thinsp;MiB-class memory segment, 32 of them.&lt;br /&gt;
* The &#039;&#039;&#039;fine&#039;&#039;&#039; level is a catalogue of individual LIDs, thousands of entries, using the 32-byte record described at [[Data Structures:LID]].&lt;br /&gt;
&lt;br /&gt;
The fine level is not a second header in the file. It is simply &#039;&#039;&#039;the contents of one particular segment&#039;&#039;&#039; — the one named &#039;&#039;LID Directory&#039;&#039;, at &amp;lt;code&amp;gt;FFFFFFFF90 010000&amp;lt;/code&amp;gt;. Extract that segment and you find, after a preamble of about 1536 bytes, an EBCDIC &amp;lt;code&amp;gt;Directory.&amp;lt;/code&amp;gt; eyecatcher, a version label, and then the records. In this image the label reads &amp;lt;code&amp;gt;v4r4m01204.0.03&amp;lt;/code&amp;gt;, which is the same label carried by [[System Files:QFILEIML]] — a quick way to confirm that two files came off the same media.&lt;br /&gt;
&lt;br /&gt;
That is also why tools which dump this file emit two dissimilar-looking listings: a short table of large memory extents, and a long list of LIDs. They are two levels of one structure, not two formats.&lt;br /&gt;
&lt;br /&gt;
== Extracting a segment ==&lt;br /&gt;
The practical recipe, and the reason this file is worth knowing about:&lt;br /&gt;
&lt;br /&gt;
# Read the &amp;lt;code&amp;gt;COPYDIR&amp;lt;/code&amp;gt; eyecatcher at offset 0 to confirm the format.&lt;br /&gt;
# Find the directory by scanning 64-byte-aligned offsets for the first entry-shaped block, rather than assuming &amp;lt;code&amp;gt;0xC0&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;0x1C0&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Walk entries until the flags field has &amp;lt;code&amp;gt;0xF&amp;lt;/code&amp;gt; in its &#039;&#039;&#039;top&#039;&#039;&#039; nibble.&lt;br /&gt;
# For the segment you want, seek to the data offset &#039;&#039;&#039;as an absolute file offset&#039;&#039;&#039; and read &#039;&#039;length&#039;&#039; raw bytes.&lt;br /&gt;
# Load the result at its SLS address in a disassembler. The bytes are what the link loader maps, so addresses match.&lt;br /&gt;
&lt;br /&gt;
Step 5 is the payoff. A 64-bit address such as &amp;lt;code&amp;gt;FFFFFFFFC6 1F1690&amp;lt;/code&amp;gt; can be typed straight into the DST &#039;&#039;Display/Alter storage&#039;&#039; panel on a live machine of the same build, and the sixteen rows it displays will match the extracted file byte for byte. Static and live analysis share one address space, which means you can do the slow work offline and use the machine only for confirmation.&lt;br /&gt;
&lt;br /&gt;
Two caveats on addresses. They are per-&#039;&#039;&#039;build&#039;&#039;&#039;, not per-release, so comparisons are only meaningful between identical builds; the same class sits at a quite different address on a V5R4 machine. And the SLS address recorded in the directory is the address the segment was &#039;&#039;&#039;saved from&#039;&#039;&#039;, which is not always where it runs — the resident nucleus segment, for instance, is stored in the container under the SID of the B-side nucleus LID rather than its runtime SID.&lt;br /&gt;
&lt;br /&gt;
== Reading the code ==&lt;br /&gt;
Once a segment is loaded, two structures make it navigable, and both are worth knowing because they turn addresses into names:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Traceback trailers.&#039;&#039;&#039; Every compilation unit ends its code with a &amp;lt;code&amp;gt;TBTB&amp;lt;/code&amp;gt; trailer, and many carry the module&#039;s name. A trailer names a whole compilation unit rather than a single function, so a hit means &amp;quot;this address is inside module X&amp;quot;, not &amp;quot;this address is function X&amp;quot;.&lt;br /&gt;
* &#039;&#039;&#039;Link-loader descriptor blocks.&#039;&#039;&#039; Considerably richer: one block per procedure, carrying the entry address at &amp;lt;code&amp;gt;+0x08&amp;lt;/code&amp;gt; and the name in EBCDIC at &amp;lt;code&amp;gt;+0x38&amp;lt;/code&amp;gt;. Names beginning with &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt; are SLIC-internal modules; the rest are C++ mangled symbols.&lt;br /&gt;
&lt;br /&gt;
Merging both across every segment of this V4R4 image yields roughly 184,000 named records, which is enough to name a substantial fraction of any address you encounter. See [[SRC]] for how to use that to get from a reference code back to a module.&lt;br /&gt;
&lt;br /&gt;
Calls between modules do not go through a conventional dispatch table, which surprises people disassembling SLIC for the first time. An external call is a two-instruction sequence — &amp;lt;code&amp;gt;ori r11,r13,&#039;&#039;ordinal&#039;&#039;&amp;lt;/code&amp;gt; followed by &amp;lt;code&amp;gt;bla&amp;lt;/code&amp;gt; into a transfer vector at the very top of the address space — and the 16-byte stub it lands on computes the target arithmetically. There is no table to read off; the ordinal &#039;&#039;is&#039;&#039; the callee&#039;s word offset within a window, and the stub supplies the window. The stub constants cannot be derived and must be read from a dump of the transfer vector.&lt;br /&gt;
&lt;br /&gt;
== The trailing page ==&lt;br /&gt;
The payload area ends at &amp;lt;code&amp;gt;0x1C2F0000&amp;lt;/code&amp;gt;, but the file is one 4&amp;amp;thinsp;KiB page longer than that. The final page is not padding: it holds 468 non-zero 8-byte records, which appear to be address-and-value pairs.&lt;br /&gt;
&lt;br /&gt;
They fall into two clear populations. The first 110 are in ascending address order with a value of 8, addressing the &#039;&#039;Link Loader — LIC Data&#039;&#039; segment among others. The remaining 256 are identical to each other: the same address &amp;lt;code&amp;gt;0xFE911220&amp;lt;/code&amp;gt;, in the &#039;&#039;Pageable BLA&#039;&#039; segment, paired with the value &amp;lt;code&amp;gt;0x48000002&amp;lt;/code&amp;gt; — which as PowerPC is a branch-absolute to zero, the shape of a deliberately poisoned entry.&lt;br /&gt;
&lt;br /&gt;
This has the flavour of a fixup or relocation list applied after the segments are restored, but that is a guess from shape alone. It is recorded here because it is real, reproducible and unexplained, and because a parser that assumes the file ends with the payload will silently ignore it.&lt;br /&gt;
&lt;br /&gt;
== Open questions ==&lt;br /&gt;
* The purpose of the trailing page.&lt;br /&gt;
* The header bytes other than the eyecatcher, size field, release string and banner.&lt;br /&gt;
* The meaning of the segment attribute field&#039;s top 16 bits, which take values &amp;lt;code&amp;gt;0x0001&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;0x0040&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;0x0080&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;0x0100&amp;lt;/code&amp;gt; and correlate loosely with segment size.&lt;br /&gt;
* Names for the nine segments left blank in the table above.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[System Files:QFILEIML]]&lt;br /&gt;
* [[Data Structures:LID]]&lt;br /&gt;
* [[SRC]]&lt;br /&gt;
* [[CISC AS/400 LIC Tapes]]&lt;br /&gt;
&lt;br /&gt;
[[Category: System Internals]]&lt;/div&gt;</summary>
		<author><name>PoC</name></author>
	</entry>
	<entry>
		<id>http://try-as400.pocnet.net/index.php?title=System_Files:QFILEIML&amp;diff=1809</id>
		<title>System Files:QFILEIML</title>
		<link rel="alternate" type="text/html" href="http://try-as400.pocnet.net/index.php?title=System_Files:QFILEIML&amp;diff=1809"/>
		<updated>2026-08-16T19:21:56Z</updated>

		<summary type="html">&lt;p&gt;PoC: ±Cat/AI heading&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{AI generated not reviewed}}&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;code&amp;gt;QFILEIML&amp;lt;/code&amp;gt;&#039;&#039;&#039; is one of the two large container files found on AS/400 SAVSYS and Licensed Internal Code installation media. It holds the machine&#039;s &#039;&#039;loadable&#039;&#039; microcode: IOP and adapter firmware, service processor firmware, and a quantity of SLIC modules. Its internal format is identified by the four-byte magic &#039;&#039;&#039;&amp;lt;code&amp;gt;IMD1&amp;lt;/code&amp;gt;&#039;&#039;&#039; and is a container of [[Data Structures:LID|LIDs]].&lt;br /&gt;
&lt;br /&gt;
The companion file &amp;lt;code&amp;gt;QFILEMCD&amp;lt;/code&amp;gt; holds SLIC proper, via a directory called &amp;lt;code&amp;gt;COPYDIR&amp;lt;/code&amp;gt;. Both files use the same 32-byte [[Data Structures:LID|LID directory record]], and a record present in both is byte-for-byte identical, so the two are two views of one packaging scheme rather than two unrelated formats.&lt;br /&gt;
&lt;br /&gt;
The name is not documented by IBM as far as is known here. &amp;lt;code&amp;gt;IML&amp;lt;/code&amp;gt; almost certainly stands for &#039;&#039;Initial Microprogram Load&#039;&#039; — the phase in which the machine&#039;s microcode is brought up, before OS/400 itself exists — which matches the file&#039;s contents. Treat the expansion as an inference.&lt;br /&gt;
&lt;br /&gt;
This description is based on two samples: a V4R4 image of 81,287,680 bytes (77.5&amp;amp;thinsp;MiB), build label &amp;lt;code&amp;gt;v4r4m01204.0.03&amp;lt;/code&amp;gt;, and a V7R2 one of 288.7&amp;amp;thinsp;MiB, label &amp;lt;code&amp;gt;v7r2m00000.0.00&amp;lt;/code&amp;gt;, taken from an installation ISO. Unless a figure is attributed to a release, it comes from the V4R4 sample; the section &#039;&#039;Across releases&#039;&#039; sets out what is format and what merely happened to be true of one image.&lt;br /&gt;
&lt;br /&gt;
== File layout ==&lt;br /&gt;
The layout is &#039;&#039;&#039;not at fixed offsets&#039;&#039;&#039;. It is carried in the header, and it differs between releases — a decoder that assumes the V4R4 offsets will read a V7R2 container as having no entries at all, without reporting an error.&lt;br /&gt;
&lt;br /&gt;
The field at &amp;lt;code&amp;gt;+0x08&amp;lt;/code&amp;gt;, low 24 bits, is the offset to the Licensed Internal Code banner. The directory header sits at exactly &#039;&#039;&#039;twice&#039;&#039;&#039; that offset, its records &amp;lt;code&amp;gt;0x20&amp;lt;/code&amp;gt; further on, and the build label at header &amp;lt;code&amp;gt;+0x10&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Release&lt;br /&gt;
!&amp;lt;code&amp;gt;+0x08&amp;lt;/code&amp;gt;&lt;br /&gt;
!Banner&lt;br /&gt;
!Directory header&lt;br /&gt;
!Records&lt;br /&gt;
!Build label&lt;br /&gt;
|-&lt;br /&gt;
|V4R4&lt;br /&gt;
|&amp;lt;code&amp;gt;ff000200&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;0x200&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;0x400&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;0x420&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;v4r4m01204.0.03&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|V7R2&lt;br /&gt;
|&amp;lt;code&amp;gt;ff000800&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;0x800&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;0x1000&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;0x1020&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;v7r2m00000.0.00&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
So the general layout is:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Contents&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;0x000&amp;lt;/code&amp;gt;&lt;br /&gt;
|Magic &amp;lt;code&amp;gt;C9 D4 C4 F1&amp;lt;/code&amp;gt;, which is &amp;lt;code&amp;gt;IMD1&amp;lt;/code&amp;gt; in EBCDIC&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;0x008&amp;lt;/code&amp;gt;&lt;br /&gt;
|Low 24 bits: offset to the banner. The rest of the header is not understood&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;banner&#039;&#039;&lt;br /&gt;
|Licensed Internal Code banner in EBCDIC, carrying the LIC product identifiers&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;banner&#039;&#039;&amp;amp;nbsp;×&amp;amp;nbsp;2&lt;br /&gt;
|Directory header: a four-byte preamble, the literal string &amp;lt;code&amp;gt;Directory.&amp;lt;/code&amp;gt;, two zero bytes, then a 16-byte build label&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;banner&#039;&#039;&amp;amp;nbsp;×&amp;amp;nbsp;2&amp;amp;nbsp;+&amp;amp;nbsp;&amp;lt;code&amp;gt;0x20&amp;lt;/code&amp;gt;&lt;br /&gt;
|The directory: a run of 32-byte LID records&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;varies&#039;&#039;&lt;br /&gt;
|Terminator record, identifier &amp;lt;code&amp;gt;0xC5D5C440&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;END&amp;amp;nbsp;&amp;lt;/code&amp;gt; in EBCDIC)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The first sixteen bytes of a V4R4 container are:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
00000000: c9d4 c4f1 0000 0000 ff00 0200 00e0 0000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and of a V7R2 one:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
00000000: c9d4 c4f1 0000 0000 ff00 0800 0010 0000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The banner reads, in EBCDIC:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LICENSED INTERNAL CODE - PROPERTY OF IBM 5763999, 5716999, 5769999&lt;br /&gt;
(C) COPYRIGHT IBM CORP. 1980, 1998. ALL RIGHTS RESERVED. ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The seven-digit numbers are LIC product identifiers, and the same ones appear in &amp;lt;code&amp;gt;QFILEMCD&amp;lt;/code&amp;gt;. The build label is likewise identical between the two container files from the same media, which is a convenient way to confirm that a given &amp;lt;code&amp;gt;QFILEIML&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;QFILEMCD&amp;lt;/code&amp;gt; belong together.&lt;br /&gt;
&lt;br /&gt;
The field at &amp;lt;code&amp;gt;+0x0C&amp;lt;/code&amp;gt; differs between the two samples (&amp;lt;code&amp;gt;00e00000&amp;lt;/code&amp;gt; against &amp;lt;code&amp;gt;00100000&amp;lt;/code&amp;gt;) and is not understood. Two samples are not enough to fit it.&lt;br /&gt;
&lt;br /&gt;
== The directory ==&lt;br /&gt;
The directory begins at &amp;lt;code&amp;gt;0x420&amp;lt;/code&amp;gt; and runs, in this image, for 632 records before the &amp;lt;code&amp;gt;END&amp;amp;nbsp;&amp;lt;/code&amp;gt; terminator at &amp;lt;code&amp;gt;0x5320&amp;lt;/code&amp;gt;. The record layout is documented at [[Data Structures:LID]] and is not repeated here.&lt;br /&gt;
&lt;br /&gt;
Of the 632 records:&lt;br /&gt;
* 341 carry the compressed flag.&lt;br /&gt;
* 631 name an SLS staging address in the &amp;lt;code&amp;gt;FFFFFFFFxx&amp;lt;/code&amp;gt; band. Exactly one does not: LID &amp;lt;code&amp;gt;80900818&amp;lt;/code&amp;gt; stages at &amp;lt;code&amp;gt;000000024A 000000&amp;lt;/code&amp;gt;.&lt;br /&gt;
* 7 have payloads that are themselves runs of LID records — see &#039;&#039;Directory extents&#039;&#039; below.&lt;br /&gt;
&lt;br /&gt;
== Payload addressing ==&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&#039;&#039;&#039;Note!&#039;&#039;&#039; This is the single point on which it is easiest to go wrong, and doing so silently produces plausible-looking nonsense.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;offset&amp;lt;/code&amp;gt; field in each record is &#039;&#039;&#039;not&#039;&#039;&#039; an offset into the container. It is a load-source LBA, describing where the payload sits on the installation medium, and it has no useful meaning inside the file.&lt;br /&gt;
&lt;br /&gt;
Reading it as a file offset is superficially attractive and definitively wrong. Doing so on a V4R4 image yields 608 overlapping extents out of 632, a maximum extent of 34,550 blocks against a 158,765-block file, and a minimum offset of block 3, which lands inside the header. That the lengths happen to sum to approximately the file size is a coincidence and should not be taken as confirmation.&lt;br /&gt;
&lt;br /&gt;
The actual rule is simpler: &#039;&#039;&#039;payloads are stored sequentially, in directory order, immediately after the directory&#039;&#039;&#039;, each one &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; blocks long. There are no gaps and no padding between them.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Payloads begin at the next 512-byte block boundary after the directory terminator.&#039;&#039;&#039; That is block 42 for the V4R4 sample and block 69 for the V7R2 one. This rule needs only the directory, so it also works on a container embedded in a larger image — an install ISO, for instance — where the file size is not a meaningful quantity.&lt;br /&gt;
&lt;br /&gt;
An older formulation, &#039;&#039;file size in blocks minus the sum of all lengths&#039;&#039;, gives the same answer for a standalone file and is a useful cross-check: on the V4R4 sample the two agree exactly, and the implied container size matches the real file size to the byte at 81,287,680. But it cannot be used on an embedded container, so prefer the terminator rule.&lt;br /&gt;
&lt;br /&gt;
To locate a payload, therefore, walk the directory from the beginning and accumulate lengths; do not index by the offset field.&lt;br /&gt;
&lt;br /&gt;
== Contents ==&lt;br /&gt;
Laid out correctly, the payloads fall into two clear populations, distinguishable without decompression by looking for 32-bit &amp;lt;code&amp;gt;stwu r1,-x(r1)&amp;lt;/code&amp;gt; prologues versus 64-bit &amp;lt;code&amp;gt;std&amp;lt;/code&amp;gt; stores:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Population&lt;br /&gt;
!Count&lt;br /&gt;
!Identification&lt;br /&gt;
|-&lt;br /&gt;
|32-bit PowerPC&lt;br /&gt;
|75&lt;br /&gt;
|&amp;lt;code&amp;gt;stwu&amp;lt;/code&amp;gt; prologues present, no &amp;lt;code&amp;gt;std&amp;lt;/code&amp;gt; at all&lt;br /&gt;
|-&lt;br /&gt;
|64-bit PowerPC AS (SLIC)&lt;br /&gt;
|210&lt;br /&gt;
|&amp;lt;code&amp;gt;std&amp;lt;/code&amp;gt; present, no &amp;lt;code&amp;gt;stwu&amp;lt;/code&amp;gt; at all&lt;br /&gt;
|-&lt;br /&gt;
|Neither&lt;br /&gt;
|347&lt;br /&gt;
|Compressed payloads, data, tables, and directory extents&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The split is clean — no payload shows both — which is what makes the heuristic trustworthy. The 32-bit population is the interesting one: the main processor of these machines is 64-bit PowerPC AS, so 32-bit code in this file is by definition destined for something else. That is the IOP, adapter and service processor microcode.&lt;br /&gt;
&lt;br /&gt;
=== Service processor firmware ===&lt;br /&gt;
LID &amp;lt;code&amp;gt;80900702&amp;lt;/code&amp;gt; is service processor Licensed Internal Code: 128&amp;amp;thinsp;KiB, stored uncompressed, staged at SLS &amp;lt;code&amp;gt;FFFFFFFF9A 001000&amp;lt;/code&amp;gt;. Its EBCDIC strings include a &#039;&#039;9400 Licensed Internal Code&#039;&#039; banner and a 1998 copyright, and its code is unambiguously 32-bit.&lt;br /&gt;
&lt;br /&gt;
This confirms a long-standing claim in the trade press that AS/400 service processor firmware is loaded from the load source rather than residing wholly in flash on the card. As the rest of this section shows, that turns out to be only half true.&lt;br /&gt;
&lt;br /&gt;
About 30 payloads carry an &amp;lt;code&amp;gt;AJS&amp;lt;/code&amp;gt; build identifier and are service-processor code, ranging from a few tens of kilobytes to a few hundred. A further handful carry &amp;lt;code&amp;gt;AJG&amp;lt;/code&amp;gt; identifiers and are I/O offload (MFIOP) code instead; several of those carry an &amp;lt;code&amp;gt;ATM&amp;lt;/code&amp;gt; marker, i.e. ATM networking, which is not something a service processor does. The two families are &#039;&#039;mostly&#039;&#039; disjoint but not perfectly: at least one payload contains both identifiers.&lt;br /&gt;
&lt;br /&gt;
==== Module headers ====&lt;br /&gt;
Each of these images is not a monolithic firmware blob but a collection of &#039;&#039;&#039;linkable modules&#039;&#039;&#039;, each introduced by a header with the EBCDIC eyecatcher &#039;&#039;&#039;&amp;lt;code&amp;gt;PGPM&amp;lt;/code&amp;gt;&#039;&#039;&#039; (&amp;lt;code&amp;gt;D7 C7 D7 D4&amp;lt;/code&amp;gt;) — 119 of them in a V4R4 container and 104 in a V7R2 one, decoding identically. The useful fields are:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Contents&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x00&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;PGPM&amp;lt;/code&amp;gt; eyecatcher&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x04&amp;lt;/code&amp;gt;&lt;br /&gt;
|A LID identifier — but see the caveat below&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x24&amp;lt;/code&amp;gt;&lt;br /&gt;
|EBCDIC version string, e.g. &amp;lt;code&amp;gt;0100&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x30&amp;lt;/code&amp;gt;&lt;br /&gt;
|8-byte build identifier, e.g. &amp;lt;code&amp;gt;AJSFGVB3&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x54&amp;lt;/code&amp;gt;&lt;br /&gt;
|8-byte name of the module this header &#039;&#039;&#039;defines&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x60&amp;lt;/code&amp;gt;&lt;br /&gt;
|Slot table, 4-byte values&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0xC0&amp;lt;/code&amp;gt;&lt;br /&gt;
|Import table: 12-byte entries, each an 8-byte name and a 4-byte linkage slot, terminated by eight EBCDIC &amp;lt;code&amp;gt;F&amp;lt;/code&amp;gt; characters&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&#039;&#039;&#039;Note!&#039;&#039;&#039; Strings such as &amp;lt;code&amp;gt;SP MOPT1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SP SPCI3&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;SP WT&amp;lt;/code&amp;gt; are &#039;&#039;&#039;module names in a link table&#039;&#039;&#039;, not feature or capability tags. An earlier version of this article described them as component tags whose differing sets indicated capability tiers across the hardware range. That reading was wrong: the sets differ because different modules import different things.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Worked example, from the header at &amp;lt;code&amp;gt;+0x59C&amp;lt;/code&amp;gt; of LID &amp;lt;code&amp;gt;A07008C2&amp;lt;/code&amp;gt;: build &amp;lt;code&amp;gt;AJSFGVB3&amp;lt;/code&amp;gt;, defines &amp;lt;code&amp;gt;SP SB&amp;lt;/code&amp;gt;, and imports &amp;lt;code&amp;gt;SP SPCI1&amp;lt;/code&amp;gt; through &amp;lt;code&amp;gt;SP SPCI5&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;CUANSI&amp;lt;/code&amp;gt;, with the import table running to its terminator at &amp;lt;code&amp;gt;+0x1B4&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Both families share a common utility layer, which is why their vocabulary overlaps: &amp;lt;code&amp;gt;CUANSI&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;CUCONV&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;CUIO&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;CUMEMORY&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;CUMISC&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;CUSTO&amp;lt;/code&amp;gt;, plus &amp;lt;code&amp;gt;SRASCOMN&amp;lt;/code&amp;gt; for RAS common code.&lt;br /&gt;
&lt;br /&gt;
==== Reading the dependency graph ====&lt;br /&gt;
Because every module declares what it defines and what it imports, the link tables can simply be read off as a dependency graph — which is more informative than any amount of disassembly, and is the main reason the &amp;lt;code&amp;gt;PGPM&amp;lt;/code&amp;gt; header is worth knowing about.&lt;br /&gt;
&lt;br /&gt;
Doing so reveals a clean pattern. The &#039;&#039;&#039;numbered&#039;&#039;&#039; names — &amp;lt;code&amp;gt;SP SPCI1&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;SPCI5&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SP MOPT1&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;MOPT9&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SP MOPD1&amp;lt;/code&amp;gt; — are imported by many modules and &#039;&#039;&#039;defined by none&#039;&#039;&#039;. The &#039;&#039;&#039;lettered&#039;&#039;&#039; members of the same families — &amp;lt;code&amp;gt;MOPTA&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MOPTB&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MOPTC&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MOPD2&amp;lt;/code&amp;gt; — each import their immediate predecessor and are present as real modules.&lt;br /&gt;
&lt;br /&gt;
The natural reading is that numbered names are resident firmware on the card and lettered ones are downloadable extensions layered on top. Which is exactly what the following section establishes by a completely independent route.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&#039;&#039;&#039;Caveat.&#039;&#039;&#039; The LID identifier at &amp;lt;code&amp;gt;+0x04&amp;lt;/code&amp;gt; of a &amp;lt;code&amp;gt;PGPM&amp;lt;/code&amp;gt; header frequently disagrees with the container LID that the sequential payload layout assigns to that region. Most of these values are valid LID identifiers from the directory, and in one region a run of 21 consecutive modules is spaced exactly by the directory lengths of the LIDs they name. Either the layout is displaced there, or modules are stored under a delivery LID distinct from their own. Findings about module &#039;&#039;contents&#039;&#039; are unaffected, since they come from the headers themselves — but do not quote a byte offset against a specific LID until this is resolved.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== What is not in the file ===&lt;br /&gt;
Notably, the service processor&#039;s own &#039;&#039;&#039;supervisor is absent&#039;&#039;&#039;. Two independent lines of evidence agree on this.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;From the instruction stream.&#039;&#039;&#039; All payloads were searched for &amp;lt;code&amp;gt;rfi&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;0x4C000064&amp;lt;/code&amp;gt;), which any PowerPC exception-returning kernel must contain, and for exception vector tables at the architectural &amp;lt;code&amp;gt;0x100&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;0x200&amp;lt;/code&amp;gt; and subsequent offsets of every 4&amp;amp;thinsp;KiB boundary. Across 4.1&amp;amp;thinsp;MB of service-processor code there is not one &amp;lt;code&amp;gt;rfi&amp;lt;/code&amp;gt;, and no payload has a vector table. Privileged operations are almost as scarce: six instructions of the &amp;lt;code&amp;gt;mtmsr&amp;lt;/code&amp;gt; family and four cache or TLB operations in the whole set.&lt;br /&gt;
&lt;br /&gt;
Consistent with that, LID &amp;lt;code&amp;gt;80900702&amp;lt;/code&amp;gt; begins mid-function, with a function &#039;&#039;tail&#039;&#039; rather than an entry point, and manipulates no privileged state at all — only LR, CTR and XER are touched. It does contain 31 &amp;lt;code&amp;gt;sc&amp;lt;/code&amp;gt; supervisor calls.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;From the link tables.&#039;&#039;&#039; As described above, the numbered module names are imported by many modules and defined by none. The code that provides them is therefore not on this medium.&lt;br /&gt;
&lt;br /&gt;
The conclusion is that the service processor runs a resident supervisor of its own, held in flash on the card, and that this file supplies only loadable task modules that sit on top of it. That is consistent with the hardware — the operator panel carries its own flash, and SLIC has an explicit message for instructing the service processor to IPL itself.&lt;br /&gt;
&lt;br /&gt;
==== The supervisor call interface ====&lt;br /&gt;
Since the supervisor itself is absent, the &amp;lt;code&amp;gt;sc&amp;lt;/code&amp;gt; instructions are the entire visible boundary between these modules and the firmware they run on. Across the family there are 668 supervisor calls using just 9 distinct call numbers, with the number in &amp;lt;code&amp;gt;r0&amp;lt;/code&amp;gt; and arguments from &amp;lt;code&amp;gt;r3&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Call&lt;br /&gt;
!Count&lt;br /&gt;
!Observed arguments&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;0x020C&amp;lt;/code&amp;gt;&lt;br /&gt;
|262&lt;br /&gt;
|—&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;0x0208&amp;lt;/code&amp;gt;&lt;br /&gt;
|131&lt;br /&gt;
|&amp;lt;code&amp;gt;r3 = 0x16&amp;lt;/code&amp;gt; in every instance&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;0x03A4&amp;lt;/code&amp;gt;&lt;br /&gt;
|106&lt;br /&gt;
|&amp;lt;code&amp;gt;r3 = 0x64&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;r4 = 5&amp;lt;/code&amp;gt;; unique to one module&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;0x0358&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&amp;lt;code&amp;gt;r3&amp;lt;/code&amp;gt; is one of exactly three values: &amp;lt;code&amp;gt;0x83010000&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;0x83020000&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;0x83030000&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The first two are the interesting pair: &amp;lt;code&amp;gt;0x0208&amp;lt;/code&amp;gt; occurs exactly half as often as &amp;lt;code&amp;gt;0x020C&amp;lt;/code&amp;gt;, and always on the same resource number, which is the signature of an acquire/release pair around a critical section. The &amp;lt;code&amp;gt;0x0358&amp;lt;/code&amp;gt; window is the only region passed explicitly to a supervisor call, which is what registering or mapping a device or shared-memory window looks like.&lt;br /&gt;
&lt;br /&gt;
Beyond that the call numbers cannot be decoded, because the code that implements them is not on this medium.&lt;br /&gt;
&lt;br /&gt;
==== A caution about what this firmware does ====&lt;br /&gt;
It is tempting to assume this firmware covers the obvious service-processor duties — power control, thermal and fan management, SPCN, driving the panel and its LCD, VPD storage, error logging and SRC posting. &#039;&#039;&#039;No such claim is supported by this file.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
These modules contain almost no descriptive text. The complete inventory of readable strings is the Licensed Internal Code banner, the copyright boilerplate, the EBCDIC-to-ASCII translation tables, and the &amp;lt;code&amp;gt;PGPM&amp;lt;/code&amp;gt; link names. A search for the entire relevant vocabulary — &amp;lt;code&amp;gt;POWER&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;FAN&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;THERMAL&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SPCN&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;VPD&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;PASSWORD&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SECUR&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SERIAL&amp;lt;/code&amp;gt; and more, in both EBCDIC and ASCII, over every byte — returns nothing in any service-processor module. The same vocabulary &#039;&#039;is&#039;&#039; present elsewhere in the container, but only inside SLIC payloads.&lt;br /&gt;
&lt;br /&gt;
So the honest position is that the functional surface visible here is nine supervisor call numbers into firmware nobody has. What the service processor actually does is implemented on the other side of that boundary.&lt;br /&gt;
&lt;br /&gt;
One bound on that negative: readable code averages about 46&amp;amp;thinsp;% of 1&amp;amp;thinsp;KiB blocks across these images, and one 119&amp;amp;thinsp;KiB payload is entirely opaque. The supported statement is that nothing is visible in the readable portion, not that nothing exists.&lt;br /&gt;
&lt;br /&gt;
=== Directory extents ===&lt;br /&gt;
Seven payloads are not data but further runs of 32-byte LID records, largely duplicating entries from the root directory byte for byte. The two largest hold 294 and 133 records. They appear to be indexes rather than nested containers, and a tool walking this file should recognise them so as not to mistake an index for a firmware image. A payload whose first few records parse as plausible LID records, with identifiers matching known LIDs, is an extent.&lt;br /&gt;
&lt;br /&gt;
== Compression ==&lt;br /&gt;
341 of the 632 payloads are flagged compressed. The codec is the LZW variant used throughout SLIC and is described at [[Data Structures:LID#The compressed flag]]. It has not been needed to read the service processor firmware, which is stored plain, but it stands between the reader and roughly half the file.&lt;br /&gt;
&lt;br /&gt;
== Tooling ==&lt;br /&gt;
No IBM-supplied tool for reading this file outside the machine is known. A parser must, at minimum:&lt;br /&gt;
# check the &amp;lt;code&amp;gt;IMD1&amp;lt;/code&amp;gt; magic at offset 0;&lt;br /&gt;
# read the banner offset from &amp;lt;code&amp;gt;+0x08&amp;lt;/code&amp;gt; and &#039;&#039;&#039;derive&#039;&#039;&#039; the directory position from it, rather than assuming a constant;&lt;br /&gt;
# read 32-byte records until an identifier of &amp;lt;code&amp;gt;0xC5D5C440&amp;lt;/code&amp;gt; or zero;&lt;br /&gt;
# place the payload area at the next block boundary after that terminator;&lt;br /&gt;
# lay payloads out sequentially in directory order.&lt;br /&gt;
&lt;br /&gt;
Step 2 is the one that catches people. An implementation that hardcodes the V4R4 directory offset of &amp;lt;code&amp;gt;0x420&amp;lt;/code&amp;gt; does not fail loudly on a V7R2 container — it reports zero records and a nonsensical payload start. Deriving the offsets costs nothing and works on both.&lt;br /&gt;
&lt;br /&gt;
== Across releases ==&lt;br /&gt;
Comparing a V4R4 image with a V7R2 one shows how much of this is format and how much was accident of a single sample.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&lt;br /&gt;
!V4R4&lt;br /&gt;
!V7R2&lt;br /&gt;
|-&lt;br /&gt;
|Records&lt;br /&gt;
|632&lt;br /&gt;
|961&lt;br /&gt;
|-&lt;br /&gt;
|Compressed&lt;br /&gt;
|341&lt;br /&gt;
|557&lt;br /&gt;
|-&lt;br /&gt;
|Payload&lt;br /&gt;
|77.5&amp;amp;thinsp;MiB&lt;br /&gt;
|288.7&amp;amp;thinsp;MiB&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;PGPM&amp;lt;/code&amp;gt; module headers&lt;br /&gt;
|119&lt;br /&gt;
|104&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The record format, the &amp;lt;code&amp;gt;PGPM&amp;lt;/code&amp;gt; module header and its field offsets, the payload tiling rule and the &amp;lt;code&amp;gt;END&amp;amp;nbsp;&amp;lt;/code&amp;gt; terminator are all unchanged. What varies is the header offsets, which the header itself declares.&lt;br /&gt;
&lt;br /&gt;
The service processor module namespace is also strikingly stable. Fourteen &amp;lt;code&amp;gt;SP&amp;lt;/code&amp;gt; module names are defined in both releases, and the pattern of numbered names being imported but never defined — the evidence that they live in flash on the card — reproduces exactly sixteen years apart. So does the supervisor call vocabulary, with V7R2 adding one new call number.&lt;br /&gt;
&lt;br /&gt;
What did change is on the SLIC side, and it is what you would expect once the service processor and panel stop being discrete cards. The concrete hardware driver classes are simply gone in V7R2, while the message protocol and resource model that sat on top of them survive and grow. In their place, the panel and service processor objects are constructed from new &#039;&#039;virtual&#039;&#039; VPD providers. The interface is preserved and the implementation behind it is virtualised — which is why code written against the older message classes still reads as recognisable on a modern machine.&lt;br /&gt;
&lt;br /&gt;
== Open questions ==&lt;br /&gt;
* The header field at &amp;lt;code&amp;gt;+0x0C&amp;lt;/code&amp;gt;, which differs between samples (&amp;lt;code&amp;gt;00e00000&amp;lt;/code&amp;gt; against &amp;lt;code&amp;gt;00100000&amp;lt;/code&amp;gt;).&lt;br /&gt;
* The rest of the header between &amp;lt;code&amp;gt;+0x0C&amp;lt;/code&amp;gt; and the banner.&lt;br /&gt;
* The meaning of most LID identifier families.&lt;br /&gt;
* Why some payloads carry the compressed flag yet begin with plainly readable 32-bit code.&lt;br /&gt;
* Whether the load-source LBAs in the offset field can be used to reconstruct the physical layout of the original installation medium.&lt;br /&gt;
* The &amp;lt;code&amp;gt;PGPM&amp;lt;/code&amp;gt; identifier discrepancy described above.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Data Structures:LID]]&lt;br /&gt;
* [[CISC AS/400 LIC Tapes]]&lt;br /&gt;
* [[Copying disks with Linux]]&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [https://www.mcpressonline.com/ MC Press Online], which carries older documentation describing service processor microcode as being loaded from the load source&lt;br /&gt;
&lt;br /&gt;
[[Category: System Internals]]&lt;/div&gt;</summary>
		<author><name>PoC</name></author>
	</entry>
	<entry>
		<id>http://try-as400.pocnet.net/index.php?title=SRC&amp;diff=1808</id>
		<title>SRC</title>
		<link rel="alternate" type="text/html" href="http://try-as400.pocnet.net/index.php?title=SRC&amp;diff=1808"/>
		<updated>2026-08-16T19:21:35Z</updated>

		<summary type="html">&lt;p&gt;PoC: ±Cat/AI heading&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{AI generated not reviewed}}&lt;br /&gt;
A &#039;&#039;&#039;system reference code&#039;&#039;&#039; (&#039;&#039;&#039;SRC&#039;&#039;&#039;) is the AS/400&#039;s primary way of telling you what it is doing or what went wrong. It is the string of hexadecimal characters shown on the operator panel&#039;s display, and the same codes appear in the system&#039;s logs and on the console. Because the platform is designed to be serviced by someone who may not have a working console, the SRC is deliberately the lowest-common-denominator channel: it works when nothing else does.&lt;br /&gt;
&lt;br /&gt;
This article covers what an SRC &#039;&#039;is&#039;&#039; and, more usefully, &#039;&#039;&#039;how to work back from one to the piece of Licensed Internal Code that produced it&#039;&#039;&#039;. Individual codes are catalogued elsewhere — see [[Disk device related system reference codes]], [[Tape device related system reference codes]] and [[SRC 0000BBBB]] for worked cases.&lt;br /&gt;
&lt;br /&gt;
== What an SRC looks like ==&lt;br /&gt;
The panel displays eight hexadecimal characters. That display is only the first of several &#039;&#039;words&#039;&#039; the machine has available; the remainder are reached with the panel&#039;s extended functions, and all of them are recorded in the logs.&lt;br /&gt;
&lt;br /&gt;
The leading character is the most informative part, because it identifies what kind of event you are looking at:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Leading character&lt;br /&gt;
!Meaning&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt;&lt;br /&gt;
|Attended IPL — the machine is waiting for you&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;B&amp;lt;/code&amp;gt;&lt;br /&gt;
|A problem was detected, most often by Licensed Internal Code&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt;&lt;br /&gt;
|IPL progress; the machine is working normally&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt;&lt;br /&gt;
|Power-down progress&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The distinction that matters when something appears stuck is between &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;B&amp;lt;/code&amp;gt;. A &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt; code is a progress report, and a machine sitting on one for a long time may simply be doing something slow. A &amp;lt;code&amp;gt;B&amp;lt;/code&amp;gt; code is a failure, and it will not clear itself.&lt;br /&gt;
&lt;br /&gt;
Progress codes are genuinely informative about sequence. The IPL-time verification sequence, for instance, runs:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!SRC&lt;br /&gt;
!Meaning&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;C600 4500&amp;lt;/code&amp;gt;&lt;br /&gt;
|Verifying network attributes&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;C600 4504&amp;lt;/code&amp;gt;&lt;br /&gt;
|Verifying system serial number&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;C600 4505&amp;lt;/code&amp;gt;&lt;br /&gt;
|Verifying system type&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;C600 4506&amp;lt;/code&amp;gt;&lt;br /&gt;
|Verifying system-unique ID&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;C600 4507&amp;lt;/code&amp;gt;&lt;br /&gt;
|Starting &#039;before DST&#039; DASD checker&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;C600 4508&amp;lt;/code&amp;gt;&lt;br /&gt;
|Verifying system password&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;C600 450A&amp;lt;/code&amp;gt;&lt;br /&gt;
|Starting &#039;after DST&#039; DASD checker&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Read as a whole, that tells you the order of dependency inside the IPL — serial number, then type, then unique ID, then disk state, then the system password — which is information you will not find stated anywhere as prose. Progress codes are a free execution trace of the boot path, and reading a long capture of them is a cheap way to understand a sequence you cannot otherwise observe.&lt;br /&gt;
&lt;br /&gt;
== Where SRCs are recorded ==&lt;br /&gt;
The panel shows the current one. Everything else is in the machine:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Panel extended functions&#039;&#039;&#039; step through the additional words of the current SRC.&lt;br /&gt;
* The &#039;&#039;&#039;Product Activity Log&#039;&#039;&#039;, under DST or SST, holds hardware-detected events with their full word set and timestamps.&lt;br /&gt;
* The &#039;&#039;&#039;Licensed Internal Code log&#039;&#039;&#039; holds LIC-detected events. This is the one that matters for the technique below, because for a LIC-detected error it records the failing &#039;&#039;&#039;module&#039;&#039;&#039; — not just a code.&lt;br /&gt;
* &#039;&#039;&#039;Main storage dumps&#039;&#039;&#039; capture machine state at the point of failure.&lt;br /&gt;
&lt;br /&gt;
If you are trying to understand a failure rather than merely clear it, go to the logs. The panel gives you one word of what may be a nine-word record.&lt;br /&gt;
&lt;br /&gt;
== How SRCs are produced ==&lt;br /&gt;
Inside SLIC there is a family of classes that construct reference codes, one per flavour of event:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
IoMFSystemRefCode                 base&lt;br /&gt;
IoMFGenericSystemRefCode          generic&lt;br /&gt;
IoMFAttentionSystemRefCode        attention&lt;br /&gt;
IoMFIplStatusSystemRefCode        IPL status&lt;br /&gt;
IoMFRunStatusSystemRefCode        run-time status&lt;br /&gt;
IoMFTerminalSystemRefCode         terminal&lt;br /&gt;
IoMFExtendedSrc / IoMFExtendedSrcHyp&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
alongside a set of categories that amount to the machine&#039;s error taxonomy — &amp;lt;code&amp;gt;IoMFSrcDeviceFailure&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IoMFSrcIoError&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IoMFSrcIopCodeDetectedFailure&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IoMFSrcSlicDetectedError&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IoMFSrcIopFailureNoDeviceVpd&amp;lt;/code&amp;gt; and several more. Persistent logging goes through an entry point named &amp;lt;code&amp;gt;putSrc&amp;lt;/code&amp;gt; on the persistent-machine class.&lt;br /&gt;
&lt;br /&gt;
Getting the code onto the panel is a separate step, handled by a request/acknowledge message protocol to the service processor. The panel-related messages include &amp;lt;code&amp;gt;IoMFCEMessageSRCDisplay&amp;lt;/code&amp;gt; to display a code and &amp;lt;code&amp;gt;IoMFCEMessagePNLClearSRC&amp;lt;/code&amp;gt; to clear it, in among messages for panel button notifications, power control and IPL mode. The panel is a small subassembly with its own microcontroller, driven over what appears from the software side to be a simple serial link.&lt;br /&gt;
&lt;br /&gt;
The practical consequence is that &#039;&#039;&#039;posting an SRC is an ordinary function call&#039;&#039;&#039; made from ordinary code. It is not a hardware trap or a magic register. So the code that posted a given SRC is findable by the same means as any other caller.&lt;br /&gt;
&lt;br /&gt;
== Working back from an SRC to a LIC module ==&lt;br /&gt;
This is the part worth generalising, because the same route serves any question of the form &amp;quot;which code did this?&amp;quot; — not only SRCs.&lt;br /&gt;
&lt;br /&gt;
=== On the machine ===&lt;br /&gt;
For a LIC-detected error, the Licensed Internal Code log entry names the failing module directly. That is the short path and should always be tried first: DST or SST, the LIC log, then the detailed display for the entry in question. You are looking for a module name and an offset within it.&lt;br /&gt;
&lt;br /&gt;
Module names follow visible conventions once you have seen a few. Names beginning with &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt; are SLIC-internal modules; the rest are C++ symbols and are mangled, so a name like &amp;lt;code&amp;gt;putSrc__16NuPersistMachineFUtPv&amp;lt;/code&amp;gt; decomposes into a method &amp;lt;code&amp;gt;putSrc&amp;lt;/code&amp;gt; on class &amp;lt;code&amp;gt;NuPersistMachine&amp;lt;/code&amp;gt; taking an unsigned halfword and a pointer.&lt;br /&gt;
&lt;br /&gt;
=== Offline, from installation media ===&lt;br /&gt;
When the log does not name a module, or when you want to read the code rather than just identify it, the route runs through [[System Files:QFILEMCD]]:&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;Extract the segments.&#039;&#039;&#039; &amp;lt;code&amp;gt;QFILEMCD&amp;lt;/code&amp;gt; contains SLIC as large memory segments stored at the addresses the link loader maps them to.&lt;br /&gt;
# &#039;&#039;&#039;Build a name index.&#039;&#039;&#039; Two structures in the code give you addresses paired with names. Every compilation unit ends with a &amp;lt;code&amp;gt;TBTB&amp;lt;/code&amp;gt; traceback trailer, many carrying the unit&#039;s name; and the link loader leaves a descriptor block per procedure, with the entry address at &amp;lt;code&amp;gt;+0x08&amp;lt;/code&amp;gt; and the name in EBCDIC at &amp;lt;code&amp;gt;+0x38&amp;lt;/code&amp;gt;. Merging both across every segment of a V4R4 image gives on the order of 184,000 named records.&lt;br /&gt;
# &#039;&#039;&#039;Look the address up.&#039;&#039;&#039; Prefer descriptor hits, which name exactly one procedure, over traceback hits, which cover a whole compilation unit and so only tell you which module an address is in.&lt;br /&gt;
# &#039;&#039;&#039;Find who posts the code.&#039;&#039;&#039; Because SRC posting is a normal call, you can find every site that posts one by resolving the calls to the &amp;lt;code&amp;gt;IoMF*SystemRefCode&amp;lt;/code&amp;gt; constructors and reading what the caller places in the code fields just beforehand.&lt;br /&gt;
&lt;br /&gt;
Step 4 needs one piece of SLIC-specific knowledge. External calls do not go through a dispatch table you can read off. A call is &amp;lt;code&amp;gt;ori r11,r13,&#039;&#039;ordinal&#039;&#039;&amp;lt;/code&amp;gt; followed by &amp;lt;code&amp;gt;bla&amp;lt;/code&amp;gt; into a transfer vector at the top of the address space, and the 16-byte stub it lands on computes the target arithmetically from the ordinal. To resolve calls you need the stub constants, which are not derivable and must be read from a dump of the transfer vector segment. With them, every external call in a segment resolves mechanically.&lt;br /&gt;
&lt;br /&gt;
=== A worked example ===&lt;br /&gt;
The DST module that verifies the system password illustrates the whole path. Immediately before it calls &amp;lt;code&amp;gt;IoMFGenericSystemRefCode&amp;lt;/code&amp;gt;, it does this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
li    r0,  0x12                  ; 18&lt;br /&gt;
li    r31, 0x21                  ; 33&lt;br /&gt;
lhz   r6,  0x18(r29)             ; the password status halfword&lt;br /&gt;
cmpwi r6,  0x30&lt;br /&gt;
bne   ...&lt;br /&gt;
sth   r0,  0x44(r1)              ; status == 0x30 -&amp;gt; code 0x12&lt;br /&gt;
b     ...&lt;br /&gt;
sth   r31, 0x44(r1)              ; otherwise      -&amp;gt; code 0x21&lt;br /&gt;
ori   r11, r13, 0xd45c&lt;br /&gt;
bla   ...                        ; IoMFGenericSystemRefCode&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Read backwards, this is exactly the inference you want to be able to make. The reference code is chosen from a status halfword; a status of &amp;lt;code&amp;gt;0x30&amp;lt;/code&amp;gt; produces one code and anything else produces another. So the two codes are not two unrelated faults but two branches of one test, and knowing which one appeared tells you which branch was taken. Working &#039;&#039;forward&#039;&#039; from the SRC list would never reveal that relationship.&lt;br /&gt;
&lt;br /&gt;
=== What the method will not give you ===&lt;br /&gt;
Two honest limits. A traceback trailer names a compilation unit, which may contain many entry points, so it localises rather than pinpoints. And addresses are per-&#039;&#039;&#039;build&#039;&#039;&#039;, not per-release: the same class sits at a completely different address on a machine of another build, so a name index is only valid against the media it was built from. Always match your extracted image to the machine you are investigating, using the build label carried in both container files.&lt;br /&gt;
&lt;br /&gt;
== Why this is worth learning ==&lt;br /&gt;
The technique generalises well beyond diagnosing faults. An SRC sequence is an execution trace with names attached, and the machine emits one on every IPL whether or not anything is wrong. Combined with a name index over the LIC image, it lets you ask questions the documentation does not answer — what the machine checks and in what order, which subsystem owns a given behaviour, where a slow phase is actually spending its time — using only a panel display and a copy of the installation media.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[System Files:QFILEMCD]]&lt;br /&gt;
* [[System Files:QFILEIML]]&lt;br /&gt;
* [[Data Structures:LID]]&lt;br /&gt;
* [[SRC 0000BBBB]]&lt;br /&gt;
* [[Disk device related system reference codes]]&lt;br /&gt;
* [[Tape device related system reference codes]]&lt;br /&gt;
* [[Panel Usage]]&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [https://www.ibm.com/docs/en/i/7.4.0?topic=finder-system-reference-code-list System reference code list], IBM Documentation&lt;br /&gt;
* [https://www.ibm.com/resources/publications/OutputPubsDetails?PubID=SY44590100 AS/400e Service Functions], which documents the panel functions and the IPL progress code sequences&lt;br /&gt;
&lt;br /&gt;
[[Category: System Internals]]&lt;/div&gt;</summary>
		<author><name>PoC</name></author>
	</entry>
	<entry>
		<id>http://try-as400.pocnet.net/index.php?title=Reverse_engineering_SLIC&amp;diff=1807</id>
		<title>Reverse engineering SLIC</title>
		<link rel="alternate" type="text/html" href="http://try-as400.pocnet.net/index.php?title=Reverse_engineering_SLIC&amp;diff=1807"/>
		<updated>2026-08-16T19:21:11Z</updated>

		<summary type="html">&lt;p&gt;PoC: ±Cat/AI heading&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{AI generated not reviewed}}&lt;br /&gt;
&lt;br /&gt;
Reverse engineering &#039;&#039;&#039;SLIC&#039;&#039;&#039; — the Licensed Internal Code below the Machine Interface — is mostly a problem of turning addresses into names and getting bytes off the machine. This article collects the techniques that work, in the order you would actually use them, and the traps that cost the most time.&lt;br /&gt;
&lt;br /&gt;
It assumes access to a machine&#039;s DST or SST service tools, and installation media or a SAVSYS for offline work.&lt;br /&gt;
&lt;br /&gt;
== Start with the machine&#039;s own link map ==&lt;br /&gt;
Before writing any tooling, get the &#039;&#039;&#039;SLIC link map&#039;&#039;&#039; from the machine. It is reached through Display/Alter/Dump and can be printed to a spooled file, then exported.&lt;br /&gt;
&lt;br /&gt;
The printed format is one row per module:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
NICKNAME    ADDRESS(10+6)   PART NAME    VERSION RELEASE  REL DATE/TIME  INST DATE/TIME&lt;br /&gt;
###FLITE    FFFFFFFFF4 C29820   SRVC_MACRO_FLIGHTLOG   0007 0400 20190217 094024 ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A V7R4 machine yields around 21,000 distinct modules. This single artefact answers &amp;quot;what is at this address&amp;quot; and &amp;quot;where is this module&amp;quot; authoritatively, for that machine, and it is the first thing to obtain.&lt;br /&gt;
&lt;br /&gt;
Two properties make it more useful than it first appears:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;The spacing between consecutive entries equals the module&#039;s text length.&#039;&#039;&#039; Verified against the lengths &#039;&#039;Find LIC Module&#039;&#039; reports — exact matches. So the map gives extents as well as bases, which means any address can be resolved to a module &#039;&#039;and&#039;&#039; an offset within it.&lt;br /&gt;
* &#039;&#039;&#039;Module names are stable across PTFs; addresses are not.&#039;&#039;&#039; Look modules up by name whenever possible.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&#039;&#039;&#039;Note!&#039;&#039;&#039; Part names are upper-cased in the printout but the &#039;&#039;Find LIC Module by name&#039;&#039; panel is &#039;&#039;&#039;case-sensitive&#039;&#039;&#039;. &amp;lt;code&amp;gt;IoHriTaggedVpd&amp;lt;/code&amp;gt; resolves; &amp;lt;code&amp;gt;IOHRITAGGEDVPD&amp;lt;/code&amp;gt; does not. Take the spelling from the on-screen display, not the print.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Getting bytes off the machine ==&lt;br /&gt;
Display/Alter/Dump can print a storage range to a spooled file. Exported as PDF and run through &amp;lt;code&amp;gt;pdftotext -layout&amp;lt;/code&amp;gt;, each line is an address and 32 bytes:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   FFFFFFFFC5 943160     3C40CC4DFBC1FFF0 FBE1FFF87C0802A6   F8010028F821FF01  3C000010F8010008&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&#039;&#039;&#039;Note!&#039;&#039;&#039; The formatter &#039;&#039;&#039;collapses repeated lines&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        127 LINES    FFFFFFFF84 11B020   TO   FFFFFFFF84 11BFE0   SAME AS ABOVE&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
A naive parser silently sees a fraction of the data — in one case 44&amp;amp;thinsp;% of a 1&amp;amp;thinsp;MiB region — and reports no error. Any parser must expand these runs.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dumping a whole module at once is usually better than dumping the function you think you want: module extents are known from the link map, and the surrounding code frequently answers the next question.&lt;br /&gt;
&lt;br /&gt;
== Addresses ==&lt;br /&gt;
An SLS address is a &#039;&#039;&#039;40-bit segment identifier and a 24-bit offset&#039;&#039;&#039;, which is exactly how the &#039;&#039;Specify Address&#039;&#039; panel splits it, so segments are 16&amp;amp;thinsp;MiB.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Probe before dumping.&#039;&#039;&#039; Entering an address in an unmapped segment returns&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
80 exception, segment does not exist.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is a free existence oracle. But probe the &#039;&#039;&#039;address you actually care about&#039;&#039;&#039;, not offset zero of its segment — segments are sparsely populated, and offset 0 being unmapped says nothing about the rest. A segment can be mapped at &amp;lt;code&amp;gt;0x010000&amp;lt;/code&amp;gt; and raise the exception at &amp;lt;code&amp;gt;0x120000&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
For a mapped address, the &#039;&#039;&#039;ADDRESSINFO&#039;&#039;&#039; Advanced Analysis command reports the page-directory entry and hardware page-table entries, confirming backing and page size.&lt;br /&gt;
&lt;br /&gt;
=== Runtime and staged addresses differ ===&lt;br /&gt;
The same module may appear at one address in the link map and another as its runtime text. Where these differ, &#039;&#039;&#039;module-relative offsets are stable&#039;&#039;&#039;: a symbol at &amp;lt;code&amp;gt;+0x26d0&amp;lt;/code&amp;gt; in the staged image is at &amp;lt;code&amp;gt;+0x26d0&amp;lt;/code&amp;gt; in the runtime image. Deriving runtime addresses this way works reliably; assuming a constant delta between two images does not.&lt;br /&gt;
&lt;br /&gt;
== Names from the code ==&lt;br /&gt;
Two structures let a container image be turned into a link map offline.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Traceback trailers.&#039;&#039;&#039; Every compilation unit ends with a &amp;lt;code&amp;gt;TBTB&amp;lt;/code&amp;gt; eyecatcher (&amp;lt;code&amp;gt;E3C2E3C2&amp;lt;/code&amp;gt;) followed by a pointer to a descriptor. A trailer covers a whole compilation unit, so it localises rather than pinpoints — and a forward scan for &amp;quot;the next trailer&amp;quot; will silently attribute a &#039;&#039;later&#039;&#039; function&#039;s name if the target has no trailer of its own.&lt;br /&gt;
* &#039;&#039;&#039;Link-loader descriptors.&#039;&#039;&#039; Richer: one per procedure, with the entry address at &amp;lt;code&amp;gt;+0x08&amp;lt;/code&amp;gt; and the name at &amp;lt;code&amp;gt;+0x38&amp;lt;/code&amp;gt;. Names beginning &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt; are SLIC-internal modules; the rest are C++ mangled symbols.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&#039;&#039;&#039;Note!&#039;&#039;&#039; Two mistakes here are expensive. First, &#039;&#039;&#039;do not require the entry address to fall inside a segment the container carries&#039;&#039;&#039; — runtime-only segments exist, and filtering on containment silently drops every module in them. Second, the name is not always at a fixed offset from the descriptor; scanning for the longest identifier run within the descriptor is more robust than assuming one.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Module metadata ==&lt;br /&gt;
&#039;&#039;Find LIC Module&#039;&#039; reports, for any address: module name, nickname, compile and link/load timestamps, version and release level, &#039;&#039;&#039;PTF level&#039;&#039;&#039;, and the text, data and BSS extents plus the TOC address.&lt;br /&gt;
&lt;br /&gt;
The same record exists on media, anchored by the EBCDIC PTF-level string (&amp;lt;code&amp;gt;SYSBASE&amp;lt;/code&amp;gt; for an unpatched module):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
+0x00  PTF level     7 bytes    &amp;quot;SYSBASE&amp;quot;&lt;br /&gt;
+0x07  version       4 bytes    &amp;quot;0007&amp;quot; = V7&lt;br /&gt;
+0x0B  release/mod   4 bytes    &amp;quot;0400&amp;quot; = R4M0&lt;br /&gt;
+0x0F  nickname      8 bytes&lt;br /&gt;
+0x27  build id      7 bytes    &amp;quot;AJDG301&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
These records cluster in their own segments rather than sitting beside the code they describe. A V7R4 SAVSYS yields about 34,000 of them.&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;PTF level&#039;&#039;&#039; field is the useful one: it distinguishes base modules from patched ones without a changelog, which is exactly what you need when a running machine and its install media disagree on addresses.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&#039;&#039;&#039;Note!&#039;&#039;&#039; &amp;lt;code&amp;gt;SYSBASE&amp;lt;/code&amp;gt; means &amp;quot;no PTF applied to this module&amp;quot; — &#039;&#039;&#039;not&#039;&#039;&#039; &amp;quot;identical to your install media&amp;quot;. Two machines can both report &amp;lt;code&amp;gt;SYSBASE&amp;lt;/code&amp;gt; and differ, because base levels themselves differ between RS releases. Compile and link dates make this checkable.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Calls between modules ==&lt;br /&gt;
External calls do not go through a table you can read off.&lt;br /&gt;
&lt;br /&gt;
A call is a two-instruction sequence — an ordinal loaded into &amp;lt;code&amp;gt;r11&amp;lt;/code&amp;gt;, then a &amp;lt;code&amp;gt;bla&amp;lt;/code&amp;gt; into the &#039;&#039;&#039;BLA vector&#039;&#039;&#039; at the top of the address space. IBM&#039;s own term, from the Static Directory, is &#039;&#039;Pageable BLA&#039;&#039; for the pageable half.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
V4R4   ori r11,r13,&amp;lt;ordinal&amp;gt; ; bla &amp;lt;vector&amp;gt;&lt;br /&gt;
V7R4   li  r11,&amp;lt;ordinal&amp;gt;     ; bla &amp;lt;vector&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The stub reached by the &amp;lt;code&amp;gt;bla&amp;lt;/code&amp;gt; computes the target arithmetically:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rldicr r11,r11,sh,59      ; ordinal x 4 (V4R4) or x 16 (V7R4)&lt;br /&gt;
addis  r11,r11,&amp;lt;simm&amp;gt;&lt;br /&gt;
mtctr  r11&lt;br /&gt;
bctr&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
so &amp;lt;code&amp;gt;callee = (sext16(simm) &amp;lt;&amp;lt; 16) + (ordinal &amp;lt;&amp;lt; sh)&amp;lt;/code&amp;gt;. The &amp;lt;code&amp;gt;simm&amp;lt;/code&amp;gt; values are not derivable and must be read from the vector — which is not carried in any container, so a dump is required once per build.&lt;br /&gt;
&lt;br /&gt;
The stub array is findable &#039;&#039;&#039;structurally&#039;&#039;&#039; — runs of 16-byte blocks with three constant words and one varying — which locates it without knowing the shift. Searching for a specific opcode pattern from another release will not find it.&lt;br /&gt;
&lt;br /&gt;
== Reading conditional branches ==&lt;br /&gt;
&lt;br /&gt;
Every policy decision in SLIC is a conditional branch, and getting one backwards silently inverts whatever it decides — the listing looks the same either way. The encoding is ordinary PowerPC, but two things about it are easy to get wrong when reading a listing rather than writing an assembler.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;code&amp;gt;BO&amp;lt;/code&amp;gt; selects the sense, &amp;lt;code&amp;gt;BI&amp;lt;/code&amp;gt; selects the bit.&#039;&#039;&#039; &amp;lt;code&amp;gt;BO = 12&amp;lt;/code&amp;gt; is branch-if-true and &amp;lt;code&amp;gt;BO = 4&amp;lt;/code&amp;gt; is branch-if-false. &amp;lt;code&amp;gt;BI&amp;lt;/code&amp;gt; numbers the condition register&#039;s bits end to end — &amp;lt;code&amp;gt;BI = 4 × field + bit&amp;lt;/code&amp;gt; — and the four bits of a field are, in order, &#039;&#039;&#039;LT, GT, EQ, SO&#039;&#039;&#039;. So within &amp;lt;code&amp;gt;CR0&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;BI = 0&amp;lt;/code&amp;gt; is LT, &#039;&#039;&#039;&amp;lt;code&amp;gt;BI = 1&amp;lt;/code&amp;gt; is GT&#039;&#039;&#039; and &amp;lt;code&amp;gt;BI = 2&amp;lt;/code&amp;gt; is EQ; within &amp;lt;code&amp;gt;CR1&amp;lt;/code&amp;gt; the EQ bit is &amp;lt;code&amp;gt;BI = 6&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
That matters most after the idiom SLIC tests a policy bit with:&lt;br /&gt;
&lt;br /&gt;
 LWZ      4, 1148(16)     ; a flag byte out of an object&lt;br /&gt;
 RLDICL.  3, 4, 0, 63     ; r3 = byte &amp;amp;amp; 0x01, and set CR0&lt;br /&gt;
 BC       4, 1, ...       ; BO=4 branch-if-false, BI=1 GT&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;RLDICL.&amp;lt;/code&amp;gt; leaves 0 or 1 and sets &amp;lt;code&amp;gt;CR0&amp;lt;/code&amp;gt; by comparing it against zero, so GT is set exactly when the bit is on, and &#039;&#039;&#039;branch-if-not-GT is taken when the bit is CLEAR&#039;&#039;&#039;. Read &amp;lt;code&amp;gt;BI = 1&amp;lt;/code&amp;gt; as EQ instead and the same branch appears to be taken when the bit is &#039;&#039;&#039;set&#039;&#039;&#039; — the exact opposite, with nothing in the listing to show which reading is in force.&lt;br /&gt;
&lt;br /&gt;
A routine that uses two condition register fields settles the numbering without any external reference: a dispatch chain alternating &amp;lt;code&amp;gt;CMPI 0,…&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;BCLR 12,2&amp;lt;/code&amp;gt; with &amp;lt;code&amp;gt;CMPI 1,…&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;BCLR 12,6&amp;lt;/code&amp;gt; is comparing a value against a series of constants and returning on each match, which is only a dispatch if &amp;lt;code&amp;gt;BI&amp;lt;/code&amp;gt; 2 and 6 are the EQ bits of &amp;lt;code&amp;gt;CR0&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;CR1&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Two rendering traps make listings read backwards.&#039;&#039;&#039; Both apply to any disassembler that prints raw encoding fields instead of assembler syntax:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;The destination is not always the first operand.&#039;&#039;&#039; &amp;lt;code&amp;gt;ADDI&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ADD&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SUBF&amp;lt;/code&amp;gt; print it first; the logical forms &amp;lt;code&amp;gt;ORI&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;AND&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;ANDC&amp;lt;/code&amp;gt; print &amp;lt;code&amp;gt;rS&amp;lt;/code&amp;gt; first and the destination &amp;lt;code&amp;gt;rA&amp;lt;/code&amp;gt; &#039;&#039;&#039;second&#039;&#039;&#039;. A load/modify/store triple is the giveaway: &amp;lt;code&amp;gt;LBZ 27,28(28)&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;ORI 27,26,1&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;STB 26,28(28)&amp;lt;/code&amp;gt; only makes sense as &amp;quot;load into r27, or in 1 giving r26, store r26&amp;quot;. Read left to right, whole routines look like a run of dead stores.&lt;br /&gt;
* &#039;&#039;&#039;The &amp;lt;code&amp;gt;Rc&amp;lt;/code&amp;gt; dot can go missing.&#039;&#039;&#039; &amp;lt;code&amp;gt;rlwinm.&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;rlwimi.&amp;lt;/code&amp;gt; do set &amp;lt;code&amp;gt;CR0&amp;lt;/code&amp;gt;, but a decoder that appends the dot only for primary opcode 31 prints them without it — and then the branch after them looks like it is testing a condition register nothing wrote. Check bit 31 of the raw word before concluding a test is stale.&lt;br /&gt;
&lt;br /&gt;
== Traps worth knowing ==&lt;br /&gt;
* &#039;&#039;&#039;Never resolve a live pointer against a container image.&#039;&#039;&#039; A pointer read from a running machine names a runtime address; dereferencing it in a saved image lands on unrelated data and produces a plausible, wrong answer.&lt;br /&gt;
* &#039;&#039;&#039;Verify cross-image mappings by content, at the address you intend to use.&#039;&#039;&#039; A delta confirmed at one address does not hold across a segment.&lt;br /&gt;
* &#039;&#039;&#039;A positional coincidence looks exactly like a structural fact.&#039;&#039;&#039; Runs of plausible-looking pointers, matching offsets and familiar constants all occur by chance in images this size. Confirm with bytes.&lt;br /&gt;
* &#039;&#039;&#039;TOC contents are filled in at IPL.&#039;&#039;&#039; Container images hold unrelocated placeholders, so a TOC walk is only meaningful against live storage.&lt;br /&gt;
* &#039;&#039;&#039;Decode &amp;lt;code&amp;gt;BO&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;BI&amp;lt;/code&amp;gt; from the raw word before believing a branch, and record the sense you decoded.&#039;&#039;&#039; A branch that decides a policy bit is worth the thirty seconds; getting it wrong produces working-looking code that does the opposite of what the machine does, and the mistake survives review because the reasoning around it was written to match. See [[#Reading conditional branches]].&lt;br /&gt;
* &#039;&#039;&#039;A field the machine rebuilds at startup is an output, not an input.&#039;&#039;&#039; Configuration areas on disk are often regenerated from the machine&#039;s live configuration during power-on, and the code that later reads one may also stamp it on the way past. Reading such a field back as though it decided something is the same tautology as a model agreeing with its only caller, moved from code into data — and it is unusually convincing, because the value really is there and really is self-consistent. Establish who last wrote a field before deciding what it means.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[System Files:QFILEMCD]]&lt;br /&gt;
* [[System Files:QFILEIML]]&lt;br /&gt;
* [[Data Structures:LID]]&lt;br /&gt;
* [[SRC]]&lt;br /&gt;
&lt;br /&gt;
[[Category: System Internals]]&lt;br /&gt;
[[Category:AI generated not reviewed]]&lt;/div&gt;</summary>
		<author><name>PoC</name></author>
	</entry>
	<entry>
		<id>http://try-as400.pocnet.net/index.php?title=File_Formats:SAVF&amp;diff=1806</id>
		<title>File Formats:SAVF</title>
		<link rel="alternate" type="text/html" href="http://try-as400.pocnet.net/index.php?title=File_Formats:SAVF&amp;diff=1806"/>
		<updated>2026-08-16T19:20:59Z</updated>

		<summary type="html">&lt;p&gt;PoC: ±Cat/AI heading&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{AI generated not reviewed}}&lt;br /&gt;
A &#039;&#039;&#039;SAVF&#039;&#039;&#039; (&#039;&#039;save file&#039;&#039;) is the container OS/400 and IBM i write with &amp;lt;code&amp;gt;SAVOBJ&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SAVLIB&amp;lt;/code&amp;gt;, and read back with &amp;lt;code&amp;gt;RSTOBJ&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;RSTLIB&amp;lt;/code&amp;gt;. It holds Machine Interface objects — programs, files, data areas, libraries — in the form they have on disk, together with a catalogue describing what was saved and from which machine.&lt;br /&gt;
&lt;br /&gt;
Understanding the format is useful well beyond restoring a save file on a machine. It is the only practical way to get at the bytes of an MI object &#039;&#039;offline&#039;&#039;: the same byte stream also appears inside optical images and tape images, so a distribution medium, a PTF, or a backup is an extractable archive of real MI objects. What can be done with one once it is extracted is described in [[File Formats:PGM]] for programs.&lt;br /&gt;
&lt;br /&gt;
Everything below is big endian, and every text field is EBCDIC.&lt;br /&gt;
&lt;br /&gt;
== Three layers ==&lt;br /&gt;
It helps to separate three things that are often run together:&lt;br /&gt;
&lt;br /&gt;
* the &#039;&#039;&#039;chunk&#039;&#039;&#039; layer, which wraps the save stream in 528-byte units with a checksum on each;&lt;br /&gt;
* the &#039;&#039;&#039;item&#039;&#039;&#039; layer, which is a chain of saved objects, each a 512-byte descriptor followed by that object&#039;s segments;&lt;br /&gt;
* the &#039;&#039;&#039;catalogue&#039;&#039;&#039;, a single special item per save that lists the library and its objects.&lt;br /&gt;
&lt;br /&gt;
Only the chunk layer is specific to a save file held in &amp;lt;code&amp;gt;QSYS&amp;lt;/code&amp;gt;. When the same save is carried on optical or tape media, the chunk wrapper is absent and the item chain sits in the medium directly. A reader that separates the layers handles all three media with one item parser.&lt;br /&gt;
&lt;br /&gt;
== The chunk layer ==&lt;br /&gt;
A save file is exactly &#039;&#039;chunk count&#039;&#039; × 528 bytes. Chunk &#039;&#039;n&#039;&#039;, counting from zero, begins at file offset &amp;lt;code&amp;gt;n × 528&amp;lt;/code&amp;gt; and consists of 512 bytes of save-stream data followed by a 16-byte checksum. The logical save stream is the concatenation of the data halves, so translating a stream offset to a file offset is&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
file_offset = (stream_offset / 512) * 528 + (stream_offset % 512)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== File header ===&lt;br /&gt;
The first 512 bytes of the stream — which are also the data half of chunk 1 — describe the container.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Size&lt;br /&gt;
!Field&lt;br /&gt;
!Notes&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x00&amp;lt;/code&amp;gt;&lt;br /&gt;
|8&lt;br /&gt;
|MI creation timestamp&lt;br /&gt;
|Also the seed for every chunk checksum.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x08&amp;lt;/code&amp;gt;&lt;br /&gt;
|4&lt;br /&gt;
|Chunk count&lt;br /&gt;
|32-bit form.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x10&amp;lt;/code&amp;gt;&lt;br /&gt;
|8&lt;br /&gt;
|Machine type and model&lt;br /&gt;
|EBCDIC, model first: &amp;lt;code&amp;gt;42A 8286&amp;lt;/code&amp;gt; is an 8286-42A.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x30&amp;lt;/code&amp;gt;&lt;br /&gt;
|4&lt;br /&gt;
|Release level&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x34&amp;lt;/code&amp;gt;&lt;br /&gt;
|4&lt;br /&gt;
|Header length&lt;br /&gt;
|The first item starts here. Zero means 512.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x38&amp;lt;/code&amp;gt;&lt;br /&gt;
|8&lt;br /&gt;
|Chunk count&lt;br /&gt;
|64-bit form, used when the 32-bit field would overflow.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x40&amp;lt;/code&amp;gt;&lt;br /&gt;
|16&lt;br /&gt;
|Global checksum backup&lt;br /&gt;
|See below.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
A valid file satisfies &amp;lt;code&amp;gt;chunk count == file size / 528&amp;lt;/code&amp;gt;; anything else means truncation. Because the header is itself chunk 1, verifying its checksum is the cheapest reliable test of whether a file is a save file at all.&lt;br /&gt;
&lt;br /&gt;
=== The global checksum displaces real data ===&lt;br /&gt;
This is the trap worth knowing about before writing any extractor. The last 16 bytes of the &#039;&#039;logical&#039;&#039; stream, at &amp;lt;code&amp;gt;chunk count × 512 − 16&amp;lt;/code&amp;gt;, are overwritten with a whole-file checksum. The data bytes they replaced are preserved in the file header at &amp;lt;code&amp;gt;+0x40&amp;lt;/code&amp;gt;, and a reader must put them back. A reader that does not will silently corrupt the tail of the last object it extracts, in a way that no chunk checksum will catch, because the chunk checksums are computed over the overwritten bytes.&lt;br /&gt;
&lt;br /&gt;
=== The chunk checksum ===&lt;br /&gt;
Each chunk&#039;s 16-byte trailer is the chunk number, counting from one, as a 4-byte big-endian integer, followed by a 12-byte digest. The digest is two folding passes built from a single primitive:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
chkadd(a, b):          # b is exactly one byte longer than a&lt;br /&gt;
    b[1:] += a &amp;lt;&amp;lt; 1    # big-endian magnitudes, carry propagated&lt;br /&gt;
    b[0]  += carry + (the bit shifted out of the top of a)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The first pass takes the chunk number followed by the 512 data bytes and cuts them into eight parts of 61, 62, 63, 64, 65, 66, 67 and 68 bytes, then folds them in ascending order: &amp;lt;code&amp;gt;chkadd&amp;lt;/code&amp;gt; of the 61-byte part into the 62-byte part, that into the 63-byte part, and so on. The second pass takes the resulting 68 bytes, cuts them into parts of 5, 6, 7, 8, 9, 10, 11 and 12 bytes, and folds them the same way, leaving 12 bytes. The first 8 of those are then XORed with the file header&#039;s MI timestamp.&lt;br /&gt;
&lt;br /&gt;
There is one non-obvious detail. In both passes the parts are &#039;&#039;filled&#039;&#039; from the input in the order 61, 62, 63, 64, 65, 66, &#039;&#039;&#039;68, 67&#039;&#039;&#039; — and 5, 6, 7, 8, 9, 10, &#039;&#039;&#039;12, 11&#039;&#039;&#039; — while being &#039;&#039;folded&#039;&#039; in ascending order. An implementation that fills them in plain ascending order produces a plausible-looking wrong answer.&lt;br /&gt;
&lt;br /&gt;
The construction is a checksum, not a cryptographic hash. It detects media damage. It is not a tamper seal, and it carries no secret beyond a timestamp printed in the same header.&lt;br /&gt;
&lt;br /&gt;
== The item layer ==&lt;br /&gt;
Items are chained: parse the descriptor at the header length, add the item&#039;s computed length, repeat, and stop when the next item would begin past &amp;lt;code&amp;gt;(chunk count − 1) × 512&amp;lt;/code&amp;gt;. Every descriptor begins with &amp;lt;code&amp;gt;FFFFFFFF&amp;lt;/code&amp;gt;, which makes resynchronising after damage feasible.&lt;br /&gt;
&lt;br /&gt;
=== Item descriptor ===&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Size&lt;br /&gt;
!Field&lt;br /&gt;
!Notes&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x00&amp;lt;/code&amp;gt;&lt;br /&gt;
|4&lt;br /&gt;
|&amp;lt;code&amp;gt;FFFFFFFF&amp;lt;/code&amp;gt;&lt;br /&gt;
|Eyecatcher.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x04&amp;lt;/code&amp;gt;&lt;br /&gt;
|10&lt;br /&gt;
|Object name&lt;br /&gt;
|EBCDIC. Replaced by a file ID for integrated file system objects.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x0E&amp;lt;/code&amp;gt;&lt;br /&gt;
|20&lt;br /&gt;
|Member name&lt;br /&gt;
|Empty unless the object has members.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x22&amp;lt;/code&amp;gt;&lt;br /&gt;
|2&lt;br /&gt;
|MI object type&lt;br /&gt;
|The same code space used throughout the machine: &amp;lt;code&amp;gt;0x0201&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;*PGM&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;0x0401&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;*LIB&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;0x1901&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;*FILE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;0x19DB&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;*SRDS&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x24&amp;lt;/code&amp;gt;&lt;br /&gt;
|1&lt;br /&gt;
|Flags&lt;br /&gt;
|Bit &amp;lt;code&amp;gt;0x40&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;0x80&amp;lt;/code&amp;gt; means the item is an IFS object.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x25&amp;lt;/code&amp;gt;&lt;br /&gt;
|3&lt;br /&gt;
|Catalogue offset&lt;br /&gt;
|Where this object&#039;s entry sits inside the catalogue.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x44&amp;lt;/code&amp;gt;&lt;br /&gt;
|4&lt;br /&gt;
|Header occupation&lt;br /&gt;
|Bytes of the descriptor page actually used.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x48&amp;lt;/code&amp;gt;&lt;br /&gt;
|4&lt;br /&gt;
|Stored length&lt;br /&gt;
|In 512-byte units, minus one.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x54&amp;lt;/code&amp;gt;&lt;br /&gt;
|2&lt;br /&gt;
|Release created for&lt;br /&gt;
|Governs the section-entry layout below.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x56&amp;lt;/code&amp;gt;&lt;br /&gt;
|4&lt;br /&gt;
|Metadata length&lt;br /&gt;
|For a catalogue item, the size of the catalogue.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x64&amp;lt;/code&amp;gt;&lt;br /&gt;
|4&lt;br /&gt;
|Section count&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0xC0&amp;lt;/code&amp;gt;&lt;br /&gt;
|8&lt;br /&gt;
|Save timestamp&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0xCC&amp;lt;/code&amp;gt;&lt;br /&gt;
|4&lt;br /&gt;
|Total length&lt;br /&gt;
|In 512-byte units.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0xD4&amp;lt;/code&amp;gt;&lt;br /&gt;
|4&lt;br /&gt;
|Data length&lt;br /&gt;
|In 512-byte units. Always the total length less 4096 bytes.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x100&amp;lt;/code&amp;gt;&lt;br /&gt;
|14 × 8&lt;br /&gt;
|Pointer array&lt;br /&gt;
|See below.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x170&amp;lt;/code&amp;gt;&lt;br /&gt;
|8&lt;br /&gt;
|Packed length&lt;br /&gt;
|Stored as the length less 512.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The pointer array holds single-level store addresses, but only the low 24 bits matter: they are an offset into the item, biased by 4096, so &amp;lt;code&amp;gt;(pointer &amp;amp;amp; 0xFFFFFF) − 4096&amp;lt;/code&amp;gt; gives an offset within the descriptor page. Index 1 locates the section length table and index 8 the section type table.&lt;br /&gt;
&lt;br /&gt;
=== Sections ===&lt;br /&gt;
A saved MI object is a set of segments, and each segment is one &#039;&#039;section&#039;&#039; of the item. Sections start at the first 4096-byte boundary after the descriptor and run consecutively, which is why the data length is always the total length less one page.&lt;br /&gt;
&lt;br /&gt;
The length table has one entry per section. On any modern release — when the &#039;&#039;release created for&#039;&#039; field exceeds 32 — an entry is 16 bytes: capacity, length, and the segment&#039;s single-level store address. Older saves use a 10-byte entry with a shifted 6-byte address and no separate length.&lt;br /&gt;
&lt;br /&gt;
The type table has one 8-byte entry per section, of which the first halfword is the segment type. This is the &#039;&#039;&#039;same value as the first halfword of the segment&#039;s own segment header&#039;&#039;&#039;, which is a useful consistency check when extracting: the item&#039;s idea of what a section is must agree with the segment&#039;s own.&lt;br /&gt;
&lt;br /&gt;
=== Item length and compression ===&lt;br /&gt;
An uncompressed item occupies its stored length. A packed item records a non-zero packed length, and the writer then realigns the following item on the enclosing 512-byte boundary, so the step from one item to the next is&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if packed == 512:        step = stored&lt;br /&gt;
elif packed &amp;gt; stored:    step = packed&lt;br /&gt;
else:&lt;br /&gt;
    slack  = stored - packed&lt;br /&gt;
    within = item_offset % 512&lt;br /&gt;
    if within == 0:      step = stored&lt;br /&gt;
    elif within &amp;lt; slack: step = packed + slack - within&lt;br /&gt;
    else:                step = stored + 512 - within&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The compression method is identifiable from the first six bytes of the packed data, which are EBCDIC eyecatchers:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Bytes&lt;br /&gt;
!EBCDIC&lt;br /&gt;
!&amp;lt;code&amp;gt;DTACPR&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;D3C46DE3D9E2&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;LD_TRS&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;*MEDIUM&amp;lt;/code&amp;gt;, the TERSE algorithm&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;D3C46DD3E9F1&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;LD_LZ1&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;*HIGH&amp;lt;/code&amp;gt;, IBM&#039;s LZ1&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;D3C46DE9D3C2&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;LD_ZLB&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;*ZLIB&amp;lt;/code&amp;gt;; the deflate stream begins 12 bytes in&lt;br /&gt;
|-&lt;br /&gt;
|none&lt;br /&gt;
|&lt;br /&gt;
|&amp;lt;code&amp;gt;*LOW&amp;lt;/code&amp;gt;, an SNA-style run-length scheme, recognisable only by decoding it&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Note that these are &#039;&#039;not&#039;&#039; the compression used for a compressed LID payload; see [[Data Structures:LID]], where all four of these were tried and rejected.&lt;br /&gt;
&lt;br /&gt;
== The catalogue ==&lt;br /&gt;
Every save writes one save/restore descriptor space item, MI type &amp;lt;code&amp;gt;0x19DB&amp;lt;/code&amp;gt;, named &amp;lt;code&amp;gt;QSRDSSPC.&#039;&#039;n&#039;&#039;&amp;lt;/code&amp;gt;, ahead of the objects it describes. Items named &amp;lt;code&amp;gt;QSR.ADDITIONAL_INFO.*&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;QSRDSSPC.EA&amp;amp;nbsp;SRD*&amp;lt;/code&amp;gt; are continuation blocks belonging to the preceding descriptor, not new saves.&lt;br /&gt;
&lt;br /&gt;
The catalogue itself is the &#039;&#039;&#039;last&#039;&#039;&#039; &#039;&#039;metadata length&#039;&#039; bytes of that item&#039;s data. Its first byte is the save command, and that selects the shape: a library save has the layout below, while a save of the integrated file system produces a different, tree-structured descriptor.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Size&lt;br /&gt;
!Field&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x00&amp;lt;/code&amp;gt;&lt;br /&gt;
|1&lt;br /&gt;
|Save command&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x01&amp;lt;/code&amp;gt;&lt;br /&gt;
|1&lt;br /&gt;
|Target release&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x02&amp;lt;/code&amp;gt;&lt;br /&gt;
|30&lt;br /&gt;
|Saved library name&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x20&amp;lt;/code&amp;gt;&lt;br /&gt;
|2&lt;br /&gt;
|Base object type, &amp;lt;code&amp;gt;0x0401&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x22&amp;lt;/code&amp;gt;&lt;br /&gt;
|8&lt;br /&gt;
|Save timestamp&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x2A&amp;lt;/code&amp;gt;&lt;br /&gt;
|4&lt;br /&gt;
|Object count&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x34&amp;lt;/code&amp;gt;&lt;br /&gt;
|8&lt;br /&gt;
|System serial number&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x3C&amp;lt;/code&amp;gt;&lt;br /&gt;
|2&lt;br /&gt;
|ASP number&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x3E&amp;lt;/code&amp;gt;&lt;br /&gt;
|10&lt;br /&gt;
|Create authority&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x4C&amp;lt;/code&amp;gt;&lt;br /&gt;
|1&lt;br /&gt;
|Save-while-active indicator&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x50&amp;lt;/code&amp;gt;&lt;br /&gt;
|10&lt;br /&gt;
|ASP name, target release 66 and later only&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Object descriptors follow, at &amp;lt;code&amp;gt;+0x50&amp;lt;/code&amp;gt; or at &amp;lt;code&amp;gt;+0x70&amp;lt;/code&amp;gt; when the ASP name is present. Each is 151 bytes on target release 49 and later, and 87 bytes before that. The first fields are the object name at &amp;lt;code&amp;gt;+0x00&amp;lt;/code&amp;gt; for 30 bytes, the MI object type at &amp;lt;code&amp;gt;+0x1E&amp;lt;/code&amp;gt;, and the owning user profile at &amp;lt;code&amp;gt;+0x20&amp;lt;/code&amp;gt; for 10 bytes. The size is a 4-byte field at &amp;lt;code&amp;gt;+0x43&amp;lt;/code&amp;gt;, multiplied by a second 4-byte field at &amp;lt;code&amp;gt;+0x79&amp;lt;/code&amp;gt; when that is non-zero. The remainder of the descriptor holds offsets, into the same buffer, of chains of length-prefixed records carrying the object&#039;s text description, service description, usage information, work-unit references and user information.&lt;br /&gt;
&lt;br /&gt;
Worth noticing for its own sake: the catalogue records the &#039;&#039;&#039;serial number of the machine that produced the save&#039;&#039;&#039;. A save file is not anonymous.&lt;br /&gt;
&lt;br /&gt;
== Practical consequences ==&lt;br /&gt;
* Any MI object can be lifted out of a save file byte for byte, with its segments separated and their segment identifiers intact. That is what makes offline analysis of a program object possible without console access to a machine and without printing a storage dump.&lt;br /&gt;
* Verifying the chunk checksums is a genuine integrity check on an archived save file, and can be done without a machine.&lt;br /&gt;
* The item chain and the catalogue are independent descriptions of the same set of objects. Where they disagree, the file has been damaged or truncated.&lt;br /&gt;
* Because the chunk layer is only present for a save file held in &amp;lt;code&amp;gt;QSYS&amp;lt;/code&amp;gt;, a save carved out of an optical or tape image is parsed by the same code with the chunk translation switched off.&lt;br /&gt;
&lt;br /&gt;
== Scope of this description ==&lt;br /&gt;
The layout was mapped with reference to jSAVF, an independently developed third-party reader, and then verified field by field against a real V7R4 save file. Where an object in that file also had a printed Display/Alter/Dump available, the bytes extracted here matched the printout exactly. The chunk checksum was reimplemented from scratch and verifies every chunk of the test file.&lt;br /&gt;
&lt;br /&gt;
Not established: the meaning of the 4-byte field at &amp;lt;code&amp;gt;+0x0C&amp;lt;/code&amp;gt; of the file header, the layout of the integrated file system catalogue, and the LZ1 and TERSE decompressors.&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [https://www.anerty.net/software/file/jSAVF/?lang=en jSAVF] — a maintained third-party reader for save files, and the starting point for the layout described here.&lt;br /&gt;
&lt;br /&gt;
[[Category: System Internals]]&lt;/div&gt;</summary>
		<author><name>PoC</name></author>
	</entry>
	<entry>
		<id>http://try-as400.pocnet.net/index.php?title=File_Formats:PGM&amp;diff=1805</id>
		<title>File Formats:PGM</title>
		<link rel="alternate" type="text/html" href="http://try-as400.pocnet.net/index.php?title=File_Formats:PGM&amp;diff=1805"/>
		<updated>2026-08-16T19:20:34Z</updated>

		<summary type="html">&lt;p&gt;PoC: ±Cat/AI heading&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{AI generated not reviewed}}&lt;br /&gt;
A &#039;&#039;&#039;&amp;lt;code&amp;gt;*PGM&amp;lt;/code&amp;gt;&#039;&#039;&#039; is a Machine Interface &#039;&#039;program object&#039;&#039;. It is not a file with a text section and a symbol table. It is a set of single-level store &#039;&#039;&#039;segments&#039;&#039;&#039;, chained together by 8-byte SLS pointers, with the executable instructions embedded in the first segment among the metadata that describes them.&lt;br /&gt;
&lt;br /&gt;
This page describes enough of that structure to walk a program object offline — that is, without a console session and without printing a storage dump for every object of interest. The bytes can come from a [[File Formats:SAVF|save file]], which makes any distribution medium, PTF or backup a source of real program objects to examine.&lt;br /&gt;
&lt;br /&gt;
Everything below is big endian, and text fields are EBCDIC.&lt;br /&gt;
&lt;br /&gt;
== Addressing ==&lt;br /&gt;
Pointers are 8 bytes: a 40-bit segment identifier in the high bits and a 24-bit offset in the low bits, so a segment is 16&amp;amp;thinsp;MiB. This is the same split used throughout the machine, including by the DST &#039;&#039;Display/Alter storage&#039;&#039; panel and by the SLS address field of a [[Data Structures:LID|LID]] directory record.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
segment = pointer &amp;gt;&amp;gt; 24&lt;br /&gt;
offset  = pointer &amp;amp; 0xFFFFFF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
An all-zero pointer means the object has no data for that structure. That is precisely what the &amp;lt;code&amp;gt;###INFO: OBJECT DOES NOT CONTAIN DATA FOR THIS SECTION&amp;lt;/code&amp;gt; line in a Display/Alter/Dump printout is reporting.&lt;br /&gt;
&lt;br /&gt;
Some fields are not pointers but &#039;&#039;&#039;&amp;lt;code&amp;gt;SEGOFF&amp;lt;/code&amp;gt;&#039;&#039;&#039; pairs: a 4-byte segment &#039;&#039;index&#039;&#039;, counting from one into the object&#039;s own segment table, followed by a 4-byte offset. These appear where a genuine pointer would have to be relocated when the object moves.&lt;br /&gt;
&lt;br /&gt;
The segments of one program have unrelated segment identifiers. A decoder therefore needs the whole set: a single segment cannot resolve its own pointers.&lt;br /&gt;
&lt;br /&gt;
== Segments ==&lt;br /&gt;
A single-module bound program typically has four segments, distinguished by the type field in each segment&#039;s own header:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Type&lt;br /&gt;
!Role&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;0x0001&amp;lt;/code&amp;gt;&lt;br /&gt;
|The program object proper: all headers, tables, and the instruction stream.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;0x0022&amp;lt;/code&amp;gt;&lt;br /&gt;
|Module constants and the module string directory.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;0x0018&amp;lt;/code&amp;gt;&lt;br /&gt;
|Static storage.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;0x0028&amp;lt;/code&amp;gt;&lt;br /&gt;
|Trace-back and mapping data.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Note that a program&#039;s segment table records a segment &#039;&#039;use&#039;&#039; code, while each segment&#039;s own header records a &#039;&#039;type&#039;&#039;. They are different numberings and should not be conflated.&lt;br /&gt;
&lt;br /&gt;
=== Segment header ===&lt;br /&gt;
Every MI segment opens with a header, called &amp;lt;code&amp;gt;YYSGHDR&amp;lt;/code&amp;gt; in IBM&#039;s own dump formatting.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Size&lt;br /&gt;
!Field&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x00&amp;lt;/code&amp;gt;&lt;br /&gt;
|2&lt;br /&gt;
|Segment type&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x02&amp;lt;/code&amp;gt;&lt;br /&gt;
|2&lt;br /&gt;
|Size, in 512-byte units&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x04&amp;lt;/code&amp;gt;&lt;br /&gt;
|1&lt;br /&gt;
|New flags&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x05&amp;lt;/code&amp;gt;&lt;br /&gt;
|1&lt;br /&gt;
|Flags&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x08&amp;lt;/code&amp;gt;&lt;br /&gt;
|8&lt;br /&gt;
|Address of the owning object&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x18&amp;lt;/code&amp;gt;&lt;br /&gt;
|8&lt;br /&gt;
|Space address&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Object header ===&lt;br /&gt;
Immediately after it, at &amp;lt;code&amp;gt;+0x20&amp;lt;/code&amp;gt; of the first segment, sits the object header, &amp;lt;code&amp;gt;YYEPAHDR&amp;lt;/code&amp;gt;. Offsets below are relative to it.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Size&lt;br /&gt;
!Field&lt;br /&gt;
!Notes&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x02&amp;lt;/code&amp;gt;&lt;br /&gt;
|1&lt;br /&gt;
|MI object type&lt;br /&gt;
|Together with the next byte, &amp;lt;code&amp;gt;0x0201&amp;lt;/code&amp;gt; for a program.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x03&amp;lt;/code&amp;gt;&lt;br /&gt;
|1&lt;br /&gt;
|MI object subtype&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x04&amp;lt;/code&amp;gt;&lt;br /&gt;
|30&lt;br /&gt;
|Object name&lt;br /&gt;
|EBCDIC.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x24&amp;lt;/code&amp;gt;&lt;br /&gt;
|4&lt;br /&gt;
|Space size&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x30&amp;lt;/code&amp;gt;&lt;br /&gt;
|8&lt;br /&gt;
|Creation timestamp&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x38&amp;lt;/code&amp;gt;&lt;br /&gt;
|8&lt;br /&gt;
|Owning user profile&lt;br /&gt;
|A pointer to the profile object.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x48&amp;lt;/code&amp;gt;&lt;br /&gt;
|8&lt;br /&gt;
|Context&lt;br /&gt;
|That is, the library.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x50&amp;lt;/code&amp;gt;&lt;br /&gt;
|8&lt;br /&gt;
|Object space&lt;br /&gt;
|&#039;&#039;&#039;The pointer to the program header.&#039;&#039;&#039; Everything else hangs off this.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x5A&amp;lt;/code&amp;gt;&lt;br /&gt;
|2&lt;br /&gt;
|ASP&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x60&amp;lt;/code&amp;gt;&lt;br /&gt;
|8&lt;br /&gt;
|Last-modified timestamp&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The type and subtype pair uses the same code space as the item descriptors in a save file, so one table of MI type codes serves both.&lt;br /&gt;
&lt;br /&gt;
== The program header ==&lt;br /&gt;
Found through the object header&#039;s object-space pointer; in practice it sits at offset &amp;lt;code&amp;gt;0x1000&amp;lt;/code&amp;gt; of the first segment.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Size&lt;br /&gt;
!Field&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x00&amp;lt;/code&amp;gt;&lt;br /&gt;
|8&lt;br /&gt;
|Program attributes&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x08&amp;lt;/code&amp;gt;&lt;br /&gt;
|8&lt;br /&gt;
|Pointer to the version table&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x10&amp;lt;/code&amp;gt;&lt;br /&gt;
|8&lt;br /&gt;
|Pointer to the segment table&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x18&amp;lt;/code&amp;gt;&lt;br /&gt;
|8&lt;br /&gt;
|Pointer to the activation header&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x20&amp;lt;/code&amp;gt;&lt;br /&gt;
|8&lt;br /&gt;
|Pointer to the signature table&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x28&amp;lt;/code&amp;gt;&lt;br /&gt;
|8&lt;br /&gt;
|Pointer to the program string directory&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x30&amp;lt;/code&amp;gt;&lt;br /&gt;
|8&lt;br /&gt;
|Pointer to activation group information&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x40&amp;lt;/code&amp;gt;&lt;br /&gt;
|8&lt;br /&gt;
|Activation start&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x48&amp;lt;/code&amp;gt;&lt;br /&gt;
|8&lt;br /&gt;
|Activation end&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x50&amp;lt;/code&amp;gt;&lt;br /&gt;
|8&lt;br /&gt;
|&#039;&#039;&#039;Activation and PEP end&#039;&#039;&#039; — the last byte of the code&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x58&amp;lt;/code&amp;gt;&lt;br /&gt;
|2&lt;br /&gt;
|Flags&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x5C&amp;lt;/code&amp;gt;&lt;br /&gt;
|2&lt;br /&gt;
|Program state&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x90&amp;lt;/code&amp;gt;&lt;br /&gt;
|1&lt;br /&gt;
|Program type&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x94&amp;lt;/code&amp;gt;&lt;br /&gt;
|4&lt;br /&gt;
|Program entry procedure module number&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x9C&amp;lt;/code&amp;gt;&lt;br /&gt;
|4&lt;br /&gt;
|Program entry procedure string ID&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0xA0&amp;lt;/code&amp;gt;&lt;br /&gt;
|2&lt;br /&gt;
|Minimum parameters&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0xA2&amp;lt;/code&amp;gt;&lt;br /&gt;
|2&lt;br /&gt;
|Maximum parameters&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0xD0&amp;lt;/code&amp;gt;&lt;br /&gt;
|8&lt;br /&gt;
|Pointer to the program header extension&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0xD8&amp;lt;/code&amp;gt;&lt;br /&gt;
|8&lt;br /&gt;
|Pointer to the trace-back locator&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0xE0&amp;lt;/code&amp;gt;&lt;br /&gt;
|8&lt;br /&gt;
|Pointer to the module table&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0xE8&amp;lt;/code&amp;gt;&lt;br /&gt;
|8&lt;br /&gt;
|Pointer to observability information&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0xF0&amp;lt;/code&amp;gt;&lt;br /&gt;
|8&lt;br /&gt;
|Pointer to the maintenance header&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The header extension adds a pointer to the GLU code list, &amp;lt;code&amp;gt;SEGOFF&amp;lt;/code&amp;gt; pairs for the program history and the segment table extension, and a 16-byte hardware feature set at &amp;lt;code&amp;gt;+0x50&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Version table ===&lt;br /&gt;
Forty bytes of packed version-release-modification halfwords, where &amp;lt;code&amp;gt;0x0740&amp;lt;/code&amp;gt; reads as V7R4M0. Among them are the binder&#039;s internal and MI levels at &amp;lt;code&amp;gt;+0x02&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;+0x04&amp;lt;/code&amp;gt;, the &#039;&#039;&#039;target&#039;&#039;&#039; release at &amp;lt;code&amp;gt;+0x06&amp;lt;/code&amp;gt;, the &#039;&#039;&#039;created-on&#039;&#039;&#039; release at &amp;lt;code&amp;gt;+0x08&amp;lt;/code&amp;gt;, the language release at &amp;lt;code&amp;gt;+0x10&amp;lt;/code&amp;gt;, the CCSID at &amp;lt;code&amp;gt;+0x1E&amp;lt;/code&amp;gt; and the low and high optimisation levels at &amp;lt;code&amp;gt;+0x20&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;+0x22&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The target and created-on values here are what decide whether an object will restore onto a given release, so they are worth reading before attempting a restore that might fail.&lt;br /&gt;
&lt;br /&gt;
=== Segment table ===&lt;br /&gt;
A header of allocated size, entry count and version, then the entries beginning at &amp;lt;code&amp;gt;+0x10&amp;lt;/code&amp;gt;. &#039;&#039;&#039;Entries are a fixed 48 bytes&#039;&#039;&#039;; the size field is the allocation, not header plus count times entry, so deriving the stride from it gives the wrong answer.&lt;br /&gt;
&lt;br /&gt;
Each entry holds the segment address at &amp;lt;code&amp;gt;+0x00&amp;lt;/code&amp;gt;, a limbo address at &amp;lt;code&amp;gt;+0x08&amp;lt;/code&amp;gt;, a declared page count at &amp;lt;code&amp;gt;+0x10&amp;lt;/code&amp;gt;, and a one-byte &#039;&#039;segment use&#039;&#039; at &amp;lt;code&amp;gt;+0x12&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;0x01&amp;lt;/code&amp;gt; static storage, &amp;lt;code&amp;gt;0x02&amp;lt;/code&amp;gt; the program object, &amp;lt;code&amp;gt;0x04&amp;lt;/code&amp;gt; constants, &amp;lt;code&amp;gt;0x06&amp;lt;/code&amp;gt; trace-back.&lt;br /&gt;
&lt;br /&gt;
A parallel &#039;&#039;segment table extension&#039;&#039;, reached by a &amp;lt;code&amp;gt;SEGOFF&amp;lt;/code&amp;gt; in the program header extension, records how much of each segment is actually used as opposed to allocated. Its entries begin at &amp;lt;code&amp;gt;+0x18&amp;lt;/code&amp;gt; and are 24 bytes, of which the first four are the byte count.&lt;br /&gt;
&lt;br /&gt;
=== Activation header ===&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Size&lt;br /&gt;
!Field&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x00&amp;lt;/code&amp;gt;&lt;br /&gt;
|8&lt;br /&gt;
|&#039;&#039;&#039;Program entry procedure entry point&#039;&#039;&#039; — the first instruction&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x08&amp;lt;/code&amp;gt;&lt;br /&gt;
|4&lt;br /&gt;
|PBV size&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x10&amp;lt;/code&amp;gt;&lt;br /&gt;
|8&lt;br /&gt;
|Pointer to the PBV relocation array&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x18&amp;lt;/code&amp;gt;&lt;br /&gt;
|8&lt;br /&gt;
|Pointer to the static PBV array&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x20&amp;lt;/code&amp;gt;&lt;br /&gt;
|4&lt;br /&gt;
|PBV relocation count&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x24&amp;lt;/code&amp;gt;&lt;br /&gt;
|4&lt;br /&gt;
|Dependent service program count&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x28&amp;lt;/code&amp;gt;&lt;br /&gt;
|8&lt;br /&gt;
|Pointer to the dependent service program array&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x4C&amp;lt;/code&amp;gt;&lt;br /&gt;
|4&lt;br /&gt;
|Constant frame count&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x50&amp;lt;/code&amp;gt;&lt;br /&gt;
|8&lt;br /&gt;
|Pointer to the constant frame definition array&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x58&amp;lt;/code&amp;gt;&lt;br /&gt;
|8&lt;br /&gt;
|Pointer to the program export array&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x60&amp;lt;/code&amp;gt;&lt;br /&gt;
|4&lt;br /&gt;
|Export count&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For a bound program with no exports most of these are zero. For a service program they are the published interface, and the dependent service program array is the object&#039;s dependency list — which makes it possible to work out what a program binds to without a machine to run &amp;lt;code&amp;gt;DSPPGM&amp;lt;/code&amp;gt; on.&lt;br /&gt;
&lt;br /&gt;
=== Maintenance header ===&lt;br /&gt;
Holds the copyright list size and count and a &amp;lt;code&amp;gt;SEGOFF&amp;lt;/code&amp;gt; to the copyright text — a 4-byte length followed by EBCDIC — along with &amp;lt;code&amp;gt;SEGOFF&amp;lt;/code&amp;gt; pairs for the external object list, static activation and export information, the last non-observable segment and size, and the lowest and highest PBV identifiers.&lt;br /&gt;
&lt;br /&gt;
== Modules ==&lt;br /&gt;
The module table has the same shape as the segment table: header, then 48-byte entries from &amp;lt;code&amp;gt;+0x10&amp;lt;/code&amp;gt;, each giving a pointer to a module header, a module domain and a module subtype.&lt;br /&gt;
&lt;br /&gt;
A module header is a long run of pointers: to the program header it belongs to, the copyright table, the module version table, binding information, static information, the end-of-line table, observability information, the module string directory, the entry point table, the VLIC table, the procedure table, module constants, and the module header extension. It also carries the module type at &amp;lt;code&amp;gt;+0x01&amp;lt;/code&amp;gt; — &amp;lt;code&amp;gt;0x01&amp;lt;/code&amp;gt; for OPM and &amp;lt;code&amp;gt;0x03&amp;lt;/code&amp;gt; for ILE — the module attributes at &amp;lt;code&amp;gt;+0xA8&amp;lt;/code&amp;gt;, and the program entry procedure&#039;s dictionary ID, string ID, procedure number and parameter counts from &amp;lt;code&amp;gt;+0xAC&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;+0xBC&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Two of its pointers characteristically leave the program segment: the module string directory and the module constants both live in the &amp;lt;code&amp;gt;0x0022&amp;lt;/code&amp;gt; segment. When hunting for literal data referenced by the code — message identifiers, format names, table constants — that is the segment to search, and these two pointers give its exact extent.&lt;br /&gt;
&lt;br /&gt;
=== Module version table ===&lt;br /&gt;
This is the most immediately informative structure in the whole object.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Size&lt;br /&gt;
!Field&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x02&amp;lt;/code&amp;gt;&lt;br /&gt;
|2&lt;br /&gt;
|Language release&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x0A&amp;lt;/code&amp;gt;&lt;br /&gt;
|2&lt;br /&gt;
|Instruction release&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x0C&amp;lt;/code&amp;gt;&lt;br /&gt;
|2&lt;br /&gt;
|Target release&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x0E&amp;lt;/code&amp;gt;&lt;br /&gt;
|2&lt;br /&gt;
|Created-on release&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x10&amp;lt;/code&amp;gt;&lt;br /&gt;
|2&lt;br /&gt;
|Optimisation level&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x14&amp;lt;/code&amp;gt;&lt;br /&gt;
|30&lt;br /&gt;
|Source module name&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x32&amp;lt;/code&amp;gt;&lt;br /&gt;
|30&lt;br /&gt;
|Source module qualifier&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x50&amp;lt;/code&amp;gt;&lt;br /&gt;
|20&lt;br /&gt;
|Compiler name&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x64&amp;lt;/code&amp;gt;&lt;br /&gt;
|2&lt;br /&gt;
|Earliest compiler release&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Read the compiler name before spending any time on a disassembly. A module reporting &amp;lt;code&amp;gt;MX CONVERTED&amp;lt;/code&amp;gt; was &#039;&#039;translated&#039;&#039; from an older object rather than compiled from source at this release, and the generated code will not resemble what a current compiler emits.&lt;br /&gt;
&lt;br /&gt;
== The instruction stream ==&lt;br /&gt;
The code is a single contiguous run inside the first segment, bounded by two fields already listed above:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
start = activation header, program entry procedure entry point&lt;br /&gt;
end   = program header, activation and PEP end        (inclusive)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It is 64-bit big-endian &#039;&#039;&#039;PowerPC AS&#039;&#039;&#039;. A stock disassembler invoked as &amp;lt;code&amp;gt;objdump -D -b binary -m powerpc:common64 -EB&amp;lt;/code&amp;gt;, with the load address adjusted to the start offset, will produce a listing whose addresses line up with anything printed by Display/Alter/Dump.&lt;br /&gt;
&lt;br /&gt;
Two caveats apply, and both matter.&lt;br /&gt;
&lt;br /&gt;
PowerPC AS is not plain PowerPC. The tagged-pointer instructions and other AS-only operations have no encoding in a stock PowerPC disassembler and will appear as invalid, or worse, as an unrelated mnemonic that looks plausible. Treat such a listing as a starting point rather than as authority.&lt;br /&gt;
&lt;br /&gt;
The run is also not pure code. Trace-back tables and constants are interleaved with instructions, so a linear sweep will decode data as code somewhere. For an object that still has its observability information, the trace-back locator and the module tables provide the boundaries needed to separate the two; for an object whose observability has been removed, they do not, and the separation has to be inferred from the code itself.&lt;br /&gt;
&lt;br /&gt;
== Scope of this description ==&lt;br /&gt;
Field offsets were derived by lining a printed Display/Alter/Dump of a program object up against the same object&#039;s bytes extracted from a save file, and then checked by decoding the object independently and comparing every field against the printout. Structures that the dump prints but that were empty in the object used — the signature table, the export and import arrays, the service program tables and the secondary entry point table — are located by pointer but their contents are not described here; establishing those needs a service program to work from.&lt;br /&gt;
&lt;br /&gt;
Only &amp;lt;code&amp;gt;*PGM&amp;lt;/code&amp;gt; is covered. &amp;lt;code&amp;gt;*SRVPGM&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;*MODULE&amp;lt;/code&amp;gt; share much of this layout but have additional tables of their own.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[File Formats:SAVF]] — how to get a program object&#039;s bytes off a machine or out of a distribution medium&lt;br /&gt;
* [[Data Structures:LID]] — the same single-level store address split, in a different container&lt;br /&gt;
&lt;br /&gt;
[[Category: System Internals]]&lt;/div&gt;</summary>
		<author><name>PoC</name></author>
	</entry>
	<entry>
		<id>http://try-as400.pocnet.net/index.php?title=Data_Structures:LID&amp;diff=1804</id>
		<title>Data Structures:LID</title>
		<link rel="alternate" type="text/html" href="http://try-as400.pocnet.net/index.php?title=Data_Structures:LID&amp;diff=1804"/>
		<updated>2026-08-16T19:20:11Z</updated>

		<summary type="html">&lt;p&gt;PoC: ±Cat/AI heading&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{AI generated not reviewed}}&lt;br /&gt;
A &#039;&#039;&#039;LID&#039;&#039;&#039; (&#039;&#039;Load ID&#039;&#039;) is IBM&#039;s general-purpose container for shipping a blob of code or data to a machine. It is not specific to any one file, release, or processor architecture: the same 32-byte directory record describes SLIC modules, IOP and adapter microcode, and service processor firmware, and the same idea survives into modern POWER hardware.&lt;br /&gt;
&lt;br /&gt;
Because the record format is shared between several container files, it is documented here once rather than repeated in each. The container that uses it is described in [[System Files:QFILEIML]].&lt;br /&gt;
&lt;br /&gt;
== The directory record ==&lt;br /&gt;
A LID container consists of a header, a directory of fixed 32-byte records, and the payloads. Every record has the following layout. All fields are big endian.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Size&lt;br /&gt;
!Field&lt;br /&gt;
!Notes&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x00&amp;lt;/code&amp;gt;&lt;br /&gt;
|4&lt;br /&gt;
|LID identifier&lt;br /&gt;
|Not a sequence number. The high halfword is a &#039;&#039;family&#039;&#039; — see below.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x04&amp;lt;/code&amp;gt;&lt;br /&gt;
|4&lt;br /&gt;
|Offset&lt;br /&gt;
|In 512-byte blocks. &#039;&#039;&#039;Base and meaning depend on the container&#039;&#039;&#039; — see the warning below.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x08&amp;lt;/code&amp;gt;&lt;br /&gt;
|4&lt;br /&gt;
|Length&lt;br /&gt;
|In 512-byte blocks.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x0C&amp;lt;/code&amp;gt;&lt;br /&gt;
|4&lt;br /&gt;
|Flags&lt;br /&gt;
|&amp;lt;code&amp;gt;0x80000000&amp;lt;/code&amp;gt; = compressed. No other bit has been observed set.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x10&amp;lt;/code&amp;gt;&lt;br /&gt;
|8&lt;br /&gt;
|SLS address&lt;br /&gt;
|Where the payload is to be staged in single-level store.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x18&amp;lt;/code&amp;gt;&lt;br /&gt;
|4&lt;br /&gt;
|Time&lt;br /&gt;
|Packed BCD &amp;lt;code&amp;gt;HHMM&amp;lt;/code&amp;gt;; read the field as hexadecimal to display it. &amp;lt;code&amp;gt;0x00001757&amp;lt;/code&amp;gt; is 17:57.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x1C&amp;lt;/code&amp;gt;&lt;br /&gt;
|4&lt;br /&gt;
|Date&lt;br /&gt;
|Packed BCD &amp;lt;code&amp;gt;YYYYMMDD&amp;lt;/code&amp;gt;, likewise. &amp;lt;code&amp;gt;0x19970318&amp;lt;/code&amp;gt; is 1997-03-18.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The directory is terminated by a record whose identifier field is &amp;lt;code&amp;gt;0xC5D5C440&amp;lt;/code&amp;gt;, which is the EBCDIC string &amp;lt;code&amp;gt;END&amp;amp;nbsp;&amp;lt;/code&amp;gt;. A zero identifier also terminates.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&#039;&#039;&#039;Note!&#039;&#039;&#039; The &#039;&#039;&#039;offset&#039;&#039;&#039; field is the field most likely to mislead. It is &#039;&#039;not&#039;&#039; universally a byte or block offset into the container file. In the &amp;lt;code&amp;gt;IMD1&amp;lt;/code&amp;gt; container it is a load-source LBA — an address on the installation medium — and is meaningless as a file offset; payloads there are instead laid out sequentially in directory order. See [[System Files:QFILEIML]] for the worked case. Always establish the addressing base for a given container before extracting anything.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Worked example ===&lt;br /&gt;
The first record of the &amp;lt;code&amp;gt;IMD1&amp;lt;/code&amp;gt; directory in a V4R4 &amp;lt;code&amp;gt;QFILEIML&amp;lt;/code&amp;gt;, at file offset &amp;lt;code&amp;gt;0x420&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
00000420: 8070 0830 0000 0210 0000 0004 0000 0000&lt;br /&gt;
00000430: ffff ffff 9300 1000 0000 1757 1997 0318&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
decodes as LID &amp;lt;code&amp;gt;80700830&amp;lt;/code&amp;gt;, offset block 528, length 4 blocks (2&amp;amp;thinsp;KiB), flags 0 (not compressed), SLS address &amp;lt;code&amp;gt;FFFFFFFF93 001000&amp;lt;/code&amp;gt;, timestamp 1997-03-18 17:57.&lt;br /&gt;
&lt;br /&gt;
That same record appears byte for byte as the sixth LID of &amp;lt;code&amp;gt;QFILEMCD&amp;lt;/code&amp;gt;&#039;s nested &amp;lt;code&amp;gt;COPYDIR&amp;lt;/code&amp;gt; LID directory, which is what establishes that the two containers share one record format.&lt;br /&gt;
&lt;br /&gt;
== The SLS address field ==&lt;br /&gt;
The 8-byte address is a single-level store address, split 40/24 into a segment identifier and a byte offset within the segment, so segments are 16&amp;amp;thinsp;MiB. Printed with that split, the example above is segment &amp;lt;code&amp;gt;FFFFFFFF93&amp;lt;/code&amp;gt;, offset &amp;lt;code&amp;gt;0x001000&amp;lt;/code&amp;gt;. This is the same notation the DST &#039;&#039;Display/Alter storage&#039;&#039; panel accepts.&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;FFFFFFFFxx&amp;lt;/code&amp;gt; band is resident Licensed Internal Code. Note that a segment identifier recorded in a directory is the &#039;&#039;load source&#039;&#039; segment — where the payload was saved from, or is staged into — which is not necessarily the segment the code eventually executes in. Payloads destined for an IOP or the service processor are staged into a SLIC segment first and then transferred over the bus to the target card, so an &amp;lt;code&amp;gt;FFFFFFFFxx&amp;lt;/code&amp;gt; address does &#039;&#039;&#039;not&#039;&#039;&#039; imply the payload is SLIC code.&lt;br /&gt;
&lt;br /&gt;
== LID identifier families ==&lt;br /&gt;
The identifier is structured rather than sequential: the high halfword groups LIDs into families, and members of a family share a purpose. In a V4R4 &amp;lt;code&amp;gt;QFILEIML&amp;lt;/code&amp;gt; the most populous families are:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Family&lt;br /&gt;
!Records&lt;br /&gt;
!Observed contents&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;a170&amp;lt;/code&amp;gt;&lt;br /&gt;
|144&lt;br /&gt;
|Not established&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;a0b0&amp;lt;/code&amp;gt;&lt;br /&gt;
|66&lt;br /&gt;
|Not established&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;a100&amp;lt;/code&amp;gt;&lt;br /&gt;
|56&lt;br /&gt;
|Not established&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;8190&amp;lt;/code&amp;gt;&lt;br /&gt;
|54&lt;br /&gt;
|Not established&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;a0c0&amp;lt;/code&amp;gt;&lt;br /&gt;
|37&lt;br /&gt;
|Not established&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;8390&amp;lt;/code&amp;gt;&lt;br /&gt;
|36&lt;br /&gt;
|Not established&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;a090&amp;lt;/code&amp;gt;&lt;br /&gt;
|33&lt;br /&gt;
|Largely 32-bit PowerPC firmware images&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;8590&amp;lt;/code&amp;gt;&lt;br /&gt;
|30&lt;br /&gt;
|Largely 32-bit PowerPC firmware images&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;8090&amp;lt;/code&amp;gt;&lt;br /&gt;
|29&lt;br /&gt;
|Mixed; includes the service processor firmware and the two large SLIC LIDs&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The purpose of most families has not been established. The &amp;lt;code&amp;gt;80xxxxxx&amp;lt;/code&amp;gt; range is the only one &amp;lt;code&amp;gt;QFILEMCD&amp;lt;/code&amp;gt; uses.&lt;br /&gt;
&lt;br /&gt;
== The compressed flag ==&lt;br /&gt;
Bit &amp;lt;code&amp;gt;0x80000000&amp;lt;/code&amp;gt; marks a payload as compressed. The codec is the LZW variant implemented in SLIC by the routines &amp;lt;code&amp;gt;LZdcomp&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;cpdcomp&amp;lt;/code&amp;gt;, which supports 9-, 10- and 12-bit codes and dispatches on a leading format byte of &amp;lt;code&amp;gt;0x11&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;0x21&amp;lt;/code&amp;gt;. It is &#039;&#039;&#039;not&#039;&#039;&#039; any of the OS/400 &amp;lt;code&amp;gt;*LOW&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;*MEDIUM&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;*HIGH&amp;lt;/code&amp;gt; save-file compression methods, nor zlib or raw deflate; all of those have been tried against real payloads and fail immediately.&lt;br /&gt;
&lt;br /&gt;
The flag should be treated as advisory rather than exact. In one V4R4 &amp;lt;code&amp;gt;QFILEIML&amp;lt;/code&amp;gt;, 31 payloads carry the compressed flag yet begin with clean, plainly readable 32-bit PowerPC function prologues. Whatever the flag governs, it is not a simple &amp;quot;this entire payload is one compressed stream&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Containers and consumers ==&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;COPYDIR&amp;lt;/code&amp;gt;&#039;&#039;&#039;, the directory in &amp;lt;code&amp;gt;QFILEMCD&amp;lt;/code&amp;gt;, carries SLIC itself as a nested LID directory.&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;IMD1&amp;lt;/code&amp;gt;&#039;&#039;&#039;, the format of [[System Files:QFILEIML]], carries IOP, adapter and service processor microcode alongside SLIC modules.&lt;br /&gt;
* SLIC contains an interactive &#039;&#039;&#039;LID filesystem&#039;&#039;&#039;. The commands &amp;lt;code&amp;gt;IdeLidFileSystem&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IdeCopyLidCmd&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IdeFindLidCmd&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IdeVerifyLid&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IdeCompressLidCmd&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IdeDecompressLidCmd&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IdeLidListCmd&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;IdeMakeTempLidCmd&amp;lt;/code&amp;gt; all appear in a V4R4 name index, so a LID is a first-class object to the machine rather than merely an installation-media artefact.&lt;br /&gt;
* Adapter and IOP classes in SLIC expose a &amp;lt;code&amp;gt;downLoadLid&amp;lt;/code&amp;gt; method, which is the mechanism by which a staged LID reaches the card.&lt;br /&gt;
* On modern POWER hardware the &#039;&#039;&#039;flexible service processor&#039;&#039;&#039; holds a filesystem of LIDs containing the hypervisor, the Open Firmware image used by AIX and Linux partitions, the component that replaces the physical front panel, and adapter firmware for several third-party network and storage cards.&amp;lt;ref&amp;gt;Reported by a machine owner familiar with FSP internals; not independently verified here, but consistent with IBM&#039;s evident reuse of the container across generations.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Scope of this description ==&lt;br /&gt;
Everything above was read from a single V4R4 installation image and cross-checked between its two container files. Field offsets, sizes and the terminator are considered established. Family meanings, and the exact semantics of the compressed flag, are not.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[System Files:QFILEIML]]&lt;br /&gt;
* [[CISC AS/400 LIC Tapes]]&lt;br /&gt;
&lt;br /&gt;
== Footnotes ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category: System Internals]]&lt;/div&gt;</summary>
		<author><name>PoC</name></author>
	</entry>
	<entry>
		<id>http://try-as400.pocnet.net/index.php?title=Template:AI_generated_not_reviewed&amp;diff=1803</id>
		<title>Template:AI generated not reviewed</title>
		<link rel="alternate" type="text/html" href="http://try-as400.pocnet.net/index.php?title=Template:AI_generated_not_reviewed&amp;diff=1803"/>
		<updated>2026-08-16T19:17:42Z</updated>

		<summary type="html">&lt;p&gt;PoC: New&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div id=&amp;quot;Template_AI&amp;quot;&amp;gt;&lt;br /&gt;
{|width=&amp;quot;100%&amp;quot; border=&amp;quot;0&amp;quot; cellspacing=&amp;quot;8&amp;quot; cellpadding=&amp;quot;0&amp;quot; style=&amp;quot;border: 1px solid #e94949; font-size: 95%; margin-top: 2px; margin-bottom: 2px; clear: both&amp;quot;&lt;br /&gt;
|style=&amp;quot;width: 24px&amp;quot; | [[File:Qsicon Fixme.png|24px]]&lt;br /&gt;
|This article has been generated or amended by AI and not yet been checked for correctness.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
[[Category:AI generated not reviewed]]&lt;/div&gt;</summary>
		<author><name>PoC</name></author>
	</entry>
	<entry>
		<id>http://try-as400.pocnet.net/index.php?title=Data_Structures:LID&amp;diff=1802</id>
		<title>Data Structures:LID</title>
		<link rel="alternate" type="text/html" href="http://try-as400.pocnet.net/index.php?title=Data_Structures:LID&amp;diff=1802"/>
		<updated>2026-08-16T19:09:09Z</updated>

		<summary type="html">&lt;p&gt;PoC: +cat&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;A &#039;&#039;&#039;LID&#039;&#039;&#039; (&#039;&#039;Load ID&#039;&#039;) is IBM&#039;s general-purpose container for shipping a blob of code or data to a machine. It is not specific to any one file, release, or processor architecture: the same 32-byte directory record describes SLIC modules, IOP and adapter microcode, and service processor firmware, and the same idea survives into modern POWER hardware.&lt;br /&gt;
&lt;br /&gt;
Because the record format is shared between several container files, it is documented here once rather than repeated in each. The container that uses it is described in [[System Files:QFILEIML]].&lt;br /&gt;
&lt;br /&gt;
== The directory record ==&lt;br /&gt;
A LID container consists of a header, a directory of fixed 32-byte records, and the payloads. Every record has the following layout. All fields are big endian.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Size&lt;br /&gt;
!Field&lt;br /&gt;
!Notes&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x00&amp;lt;/code&amp;gt;&lt;br /&gt;
|4&lt;br /&gt;
|LID identifier&lt;br /&gt;
|Not a sequence number. The high halfword is a &#039;&#039;family&#039;&#039; — see below.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x04&amp;lt;/code&amp;gt;&lt;br /&gt;
|4&lt;br /&gt;
|Offset&lt;br /&gt;
|In 512-byte blocks. &#039;&#039;&#039;Base and meaning depend on the container&#039;&#039;&#039; — see the warning below.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x08&amp;lt;/code&amp;gt;&lt;br /&gt;
|4&lt;br /&gt;
|Length&lt;br /&gt;
|In 512-byte blocks.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x0C&amp;lt;/code&amp;gt;&lt;br /&gt;
|4&lt;br /&gt;
|Flags&lt;br /&gt;
|&amp;lt;code&amp;gt;0x80000000&amp;lt;/code&amp;gt; = compressed. No other bit has been observed set.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x10&amp;lt;/code&amp;gt;&lt;br /&gt;
|8&lt;br /&gt;
|SLS address&lt;br /&gt;
|Where the payload is to be staged in single-level store.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x18&amp;lt;/code&amp;gt;&lt;br /&gt;
|4&lt;br /&gt;
|Time&lt;br /&gt;
|Packed BCD &amp;lt;code&amp;gt;HHMM&amp;lt;/code&amp;gt;; read the field as hexadecimal to display it. &amp;lt;code&amp;gt;0x00001757&amp;lt;/code&amp;gt; is 17:57.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x1C&amp;lt;/code&amp;gt;&lt;br /&gt;
|4&lt;br /&gt;
|Date&lt;br /&gt;
|Packed BCD &amp;lt;code&amp;gt;YYYYMMDD&amp;lt;/code&amp;gt;, likewise. &amp;lt;code&amp;gt;0x19970318&amp;lt;/code&amp;gt; is 1997-03-18.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The directory is terminated by a record whose identifier field is &amp;lt;code&amp;gt;0xC5D5C440&amp;lt;/code&amp;gt;, which is the EBCDIC string &amp;lt;code&amp;gt;END&amp;amp;nbsp;&amp;lt;/code&amp;gt;. A zero identifier also terminates.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&#039;&#039;&#039;Note!&#039;&#039;&#039; The &#039;&#039;&#039;offset&#039;&#039;&#039; field is the field most likely to mislead. It is &#039;&#039;not&#039;&#039; universally a byte or block offset into the container file. In the &amp;lt;code&amp;gt;IMD1&amp;lt;/code&amp;gt; container it is a load-source LBA — an address on the installation medium — and is meaningless as a file offset; payloads there are instead laid out sequentially in directory order. See [[System Files:QFILEIML]] for the worked case. Always establish the addressing base for a given container before extracting anything.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Worked example ===&lt;br /&gt;
The first record of the &amp;lt;code&amp;gt;IMD1&amp;lt;/code&amp;gt; directory in a V4R4 &amp;lt;code&amp;gt;QFILEIML&amp;lt;/code&amp;gt;, at file offset &amp;lt;code&amp;gt;0x420&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
00000420: 8070 0830 0000 0210 0000 0004 0000 0000&lt;br /&gt;
00000430: ffff ffff 9300 1000 0000 1757 1997 0318&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
decodes as LID &amp;lt;code&amp;gt;80700830&amp;lt;/code&amp;gt;, offset block 528, length 4 blocks (2&amp;amp;thinsp;KiB), flags 0 (not compressed), SLS address &amp;lt;code&amp;gt;FFFFFFFF93 001000&amp;lt;/code&amp;gt;, timestamp 1997-03-18 17:57.&lt;br /&gt;
&lt;br /&gt;
That same record appears byte for byte as the sixth LID of &amp;lt;code&amp;gt;QFILEMCD&amp;lt;/code&amp;gt;&#039;s nested &amp;lt;code&amp;gt;COPYDIR&amp;lt;/code&amp;gt; LID directory, which is what establishes that the two containers share one record format.&lt;br /&gt;
&lt;br /&gt;
== The SLS address field ==&lt;br /&gt;
The 8-byte address is a single-level store address, split 40/24 into a segment identifier and a byte offset within the segment, so segments are 16&amp;amp;thinsp;MiB. Printed with that split, the example above is segment &amp;lt;code&amp;gt;FFFFFFFF93&amp;lt;/code&amp;gt;, offset &amp;lt;code&amp;gt;0x001000&amp;lt;/code&amp;gt;. This is the same notation the DST &#039;&#039;Display/Alter storage&#039;&#039; panel accepts.&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;FFFFFFFFxx&amp;lt;/code&amp;gt; band is resident Licensed Internal Code. Note that a segment identifier recorded in a directory is the &#039;&#039;load source&#039;&#039; segment — where the payload was saved from, or is staged into — which is not necessarily the segment the code eventually executes in. Payloads destined for an IOP or the service processor are staged into a SLIC segment first and then transferred over the bus to the target card, so an &amp;lt;code&amp;gt;FFFFFFFFxx&amp;lt;/code&amp;gt; address does &#039;&#039;&#039;not&#039;&#039;&#039; imply the payload is SLIC code.&lt;br /&gt;
&lt;br /&gt;
== LID identifier families ==&lt;br /&gt;
The identifier is structured rather than sequential: the high halfword groups LIDs into families, and members of a family share a purpose. In a V4R4 &amp;lt;code&amp;gt;QFILEIML&amp;lt;/code&amp;gt; the most populous families are:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Family&lt;br /&gt;
!Records&lt;br /&gt;
!Observed contents&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;a170&amp;lt;/code&amp;gt;&lt;br /&gt;
|144&lt;br /&gt;
|Not established&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;a0b0&amp;lt;/code&amp;gt;&lt;br /&gt;
|66&lt;br /&gt;
|Not established&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;a100&amp;lt;/code&amp;gt;&lt;br /&gt;
|56&lt;br /&gt;
|Not established&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;8190&amp;lt;/code&amp;gt;&lt;br /&gt;
|54&lt;br /&gt;
|Not established&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;a0c0&amp;lt;/code&amp;gt;&lt;br /&gt;
|37&lt;br /&gt;
|Not established&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;8390&amp;lt;/code&amp;gt;&lt;br /&gt;
|36&lt;br /&gt;
|Not established&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;a090&amp;lt;/code&amp;gt;&lt;br /&gt;
|33&lt;br /&gt;
|Largely 32-bit PowerPC firmware images&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;8590&amp;lt;/code&amp;gt;&lt;br /&gt;
|30&lt;br /&gt;
|Largely 32-bit PowerPC firmware images&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;8090&amp;lt;/code&amp;gt;&lt;br /&gt;
|29&lt;br /&gt;
|Mixed; includes the service processor firmware and the two large SLIC LIDs&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The purpose of most families has not been established. The &amp;lt;code&amp;gt;80xxxxxx&amp;lt;/code&amp;gt; range is the only one &amp;lt;code&amp;gt;QFILEMCD&amp;lt;/code&amp;gt; uses.&lt;br /&gt;
&lt;br /&gt;
== The compressed flag ==&lt;br /&gt;
Bit &amp;lt;code&amp;gt;0x80000000&amp;lt;/code&amp;gt; marks a payload as compressed. The codec is the LZW variant implemented in SLIC by the routines &amp;lt;code&amp;gt;LZdcomp&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;cpdcomp&amp;lt;/code&amp;gt;, which supports 9-, 10- and 12-bit codes and dispatches on a leading format byte of &amp;lt;code&amp;gt;0x11&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;0x21&amp;lt;/code&amp;gt;. It is &#039;&#039;&#039;not&#039;&#039;&#039; any of the OS/400 &amp;lt;code&amp;gt;*LOW&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;*MEDIUM&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;*HIGH&amp;lt;/code&amp;gt; save-file compression methods, nor zlib or raw deflate; all of those have been tried against real payloads and fail immediately.&lt;br /&gt;
&lt;br /&gt;
The flag should be treated as advisory rather than exact. In one V4R4 &amp;lt;code&amp;gt;QFILEIML&amp;lt;/code&amp;gt;, 31 payloads carry the compressed flag yet begin with clean, plainly readable 32-bit PowerPC function prologues. Whatever the flag governs, it is not a simple &amp;quot;this entire payload is one compressed stream&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Containers and consumers ==&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;COPYDIR&amp;lt;/code&amp;gt;&#039;&#039;&#039;, the directory in &amp;lt;code&amp;gt;QFILEMCD&amp;lt;/code&amp;gt;, carries SLIC itself as a nested LID directory.&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;IMD1&amp;lt;/code&amp;gt;&#039;&#039;&#039;, the format of [[System Files:QFILEIML]], carries IOP, adapter and service processor microcode alongside SLIC modules.&lt;br /&gt;
* SLIC contains an interactive &#039;&#039;&#039;LID filesystem&#039;&#039;&#039;. The commands &amp;lt;code&amp;gt;IdeLidFileSystem&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IdeCopyLidCmd&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IdeFindLidCmd&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IdeVerifyLid&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IdeCompressLidCmd&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IdeDecompressLidCmd&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IdeLidListCmd&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;IdeMakeTempLidCmd&amp;lt;/code&amp;gt; all appear in a V4R4 name index, so a LID is a first-class object to the machine rather than merely an installation-media artefact.&lt;br /&gt;
* Adapter and IOP classes in SLIC expose a &amp;lt;code&amp;gt;downLoadLid&amp;lt;/code&amp;gt; method, which is the mechanism by which a staged LID reaches the card.&lt;br /&gt;
* On modern POWER hardware the &#039;&#039;&#039;flexible service processor&#039;&#039;&#039; holds a filesystem of LIDs containing the hypervisor, the Open Firmware image used by AIX and Linux partitions, the component that replaces the physical front panel, and adapter firmware for several third-party network and storage cards.&amp;lt;ref&amp;gt;Reported by a machine owner familiar with FSP internals; not independently verified here, but consistent with IBM&#039;s evident reuse of the container across generations.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Scope of this description ==&lt;br /&gt;
Everything above was read from a single V4R4 installation image and cross-checked between its two container files. Field offsets, sizes and the terminator are considered established. Family meanings, and the exact semantics of the compressed flag, are not.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[System Files:QFILEIML]]&lt;br /&gt;
* [[CISC AS/400 LIC Tapes]]&lt;br /&gt;
&lt;br /&gt;
== Footnotes ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category: System Internals]]&lt;br /&gt;
[[Category:AI generated not reviewed]]&lt;/div&gt;</summary>
		<author><name>PoC</name></author>
	</entry>
	<entry>
		<id>http://try-as400.pocnet.net/index.php?title=SRC&amp;diff=1801</id>
		<title>SRC</title>
		<link rel="alternate" type="text/html" href="http://try-as400.pocnet.net/index.php?title=SRC&amp;diff=1801"/>
		<updated>2026-08-16T19:08:48Z</updated>

		<summary type="html">&lt;p&gt;PoC: +cat&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;A &#039;&#039;&#039;system reference code&#039;&#039;&#039; (&#039;&#039;&#039;SRC&#039;&#039;&#039;) is the AS/400&#039;s primary way of telling you what it is doing or what went wrong. It is the string of hexadecimal characters shown on the operator panel&#039;s display, and the same codes appear in the system&#039;s logs and on the console. Because the platform is designed to be serviced by someone who may not have a working console, the SRC is deliberately the lowest-common-denominator channel: it works when nothing else does.&lt;br /&gt;
&lt;br /&gt;
This article covers what an SRC &#039;&#039;is&#039;&#039; and, more usefully, &#039;&#039;&#039;how to work back from one to the piece of Licensed Internal Code that produced it&#039;&#039;&#039;. Individual codes are catalogued elsewhere — see [[Disk device related system reference codes]], [[Tape device related system reference codes]] and [[SRC 0000BBBB]] for worked cases.&lt;br /&gt;
&lt;br /&gt;
== What an SRC looks like ==&lt;br /&gt;
The panel displays eight hexadecimal characters. That display is only the first of several &#039;&#039;words&#039;&#039; the machine has available; the remainder are reached with the panel&#039;s extended functions, and all of them are recorded in the logs.&lt;br /&gt;
&lt;br /&gt;
The leading character is the most informative part, because it identifies what kind of event you are looking at:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Leading character&lt;br /&gt;
!Meaning&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt;&lt;br /&gt;
|Attended IPL — the machine is waiting for you&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;B&amp;lt;/code&amp;gt;&lt;br /&gt;
|A problem was detected, most often by Licensed Internal Code&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt;&lt;br /&gt;
|IPL progress; the machine is working normally&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt;&lt;br /&gt;
|Power-down progress&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The distinction that matters when something appears stuck is between &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;B&amp;lt;/code&amp;gt;. A &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt; code is a progress report, and a machine sitting on one for a long time may simply be doing something slow. A &amp;lt;code&amp;gt;B&amp;lt;/code&amp;gt; code is a failure, and it will not clear itself.&lt;br /&gt;
&lt;br /&gt;
Progress codes are genuinely informative about sequence. The IPL-time verification sequence, for instance, runs:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!SRC&lt;br /&gt;
!Meaning&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;C600 4500&amp;lt;/code&amp;gt;&lt;br /&gt;
|Verifying network attributes&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;C600 4504&amp;lt;/code&amp;gt;&lt;br /&gt;
|Verifying system serial number&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;C600 4505&amp;lt;/code&amp;gt;&lt;br /&gt;
|Verifying system type&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;C600 4506&amp;lt;/code&amp;gt;&lt;br /&gt;
|Verifying system-unique ID&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;C600 4507&amp;lt;/code&amp;gt;&lt;br /&gt;
|Starting &#039;before DST&#039; DASD checker&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;C600 4508&amp;lt;/code&amp;gt;&lt;br /&gt;
|Verifying system password&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;C600 450A&amp;lt;/code&amp;gt;&lt;br /&gt;
|Starting &#039;after DST&#039; DASD checker&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Read as a whole, that tells you the order of dependency inside the IPL — serial number, then type, then unique ID, then disk state, then the system password — which is information you will not find stated anywhere as prose. Progress codes are a free execution trace of the boot path, and reading a long capture of them is a cheap way to understand a sequence you cannot otherwise observe.&lt;br /&gt;
&lt;br /&gt;
== Where SRCs are recorded ==&lt;br /&gt;
The panel shows the current one. Everything else is in the machine:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Panel extended functions&#039;&#039;&#039; step through the additional words of the current SRC.&lt;br /&gt;
* The &#039;&#039;&#039;Product Activity Log&#039;&#039;&#039;, under DST or SST, holds hardware-detected events with their full word set and timestamps.&lt;br /&gt;
* The &#039;&#039;&#039;Licensed Internal Code log&#039;&#039;&#039; holds LIC-detected events. This is the one that matters for the technique below, because for a LIC-detected error it records the failing &#039;&#039;&#039;module&#039;&#039;&#039; — not just a code.&lt;br /&gt;
* &#039;&#039;&#039;Main storage dumps&#039;&#039;&#039; capture machine state at the point of failure.&lt;br /&gt;
&lt;br /&gt;
If you are trying to understand a failure rather than merely clear it, go to the logs. The panel gives you one word of what may be a nine-word record.&lt;br /&gt;
&lt;br /&gt;
== How SRCs are produced ==&lt;br /&gt;
Inside SLIC there is a family of classes that construct reference codes, one per flavour of event:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
IoMFSystemRefCode                 base&lt;br /&gt;
IoMFGenericSystemRefCode          generic&lt;br /&gt;
IoMFAttentionSystemRefCode        attention&lt;br /&gt;
IoMFIplStatusSystemRefCode        IPL status&lt;br /&gt;
IoMFRunStatusSystemRefCode        run-time status&lt;br /&gt;
IoMFTerminalSystemRefCode         terminal&lt;br /&gt;
IoMFExtendedSrc / IoMFExtendedSrcHyp&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
alongside a set of categories that amount to the machine&#039;s error taxonomy — &amp;lt;code&amp;gt;IoMFSrcDeviceFailure&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IoMFSrcIoError&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IoMFSrcIopCodeDetectedFailure&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IoMFSrcSlicDetectedError&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IoMFSrcIopFailureNoDeviceVpd&amp;lt;/code&amp;gt; and several more. Persistent logging goes through an entry point named &amp;lt;code&amp;gt;putSrc&amp;lt;/code&amp;gt; on the persistent-machine class.&lt;br /&gt;
&lt;br /&gt;
Getting the code onto the panel is a separate step, handled by a request/acknowledge message protocol to the service processor. The panel-related messages include &amp;lt;code&amp;gt;IoMFCEMessageSRCDisplay&amp;lt;/code&amp;gt; to display a code and &amp;lt;code&amp;gt;IoMFCEMessagePNLClearSRC&amp;lt;/code&amp;gt; to clear it, in among messages for panel button notifications, power control and IPL mode. The panel is a small subassembly with its own microcontroller, driven over what appears from the software side to be a simple serial link.&lt;br /&gt;
&lt;br /&gt;
The practical consequence is that &#039;&#039;&#039;posting an SRC is an ordinary function call&#039;&#039;&#039; made from ordinary code. It is not a hardware trap or a magic register. So the code that posted a given SRC is findable by the same means as any other caller.&lt;br /&gt;
&lt;br /&gt;
== Working back from an SRC to a LIC module ==&lt;br /&gt;
This is the part worth generalising, because the same route serves any question of the form &amp;quot;which code did this?&amp;quot; — not only SRCs.&lt;br /&gt;
&lt;br /&gt;
=== On the machine ===&lt;br /&gt;
For a LIC-detected error, the Licensed Internal Code log entry names the failing module directly. That is the short path and should always be tried first: DST or SST, the LIC log, then the detailed display for the entry in question. You are looking for a module name and an offset within it.&lt;br /&gt;
&lt;br /&gt;
Module names follow visible conventions once you have seen a few. Names beginning with &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt; are SLIC-internal modules; the rest are C++ symbols and are mangled, so a name like &amp;lt;code&amp;gt;putSrc__16NuPersistMachineFUtPv&amp;lt;/code&amp;gt; decomposes into a method &amp;lt;code&amp;gt;putSrc&amp;lt;/code&amp;gt; on class &amp;lt;code&amp;gt;NuPersistMachine&amp;lt;/code&amp;gt; taking an unsigned halfword and a pointer.&lt;br /&gt;
&lt;br /&gt;
=== Offline, from installation media ===&lt;br /&gt;
When the log does not name a module, or when you want to read the code rather than just identify it, the route runs through [[System Files:QFILEMCD]]:&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;Extract the segments.&#039;&#039;&#039; &amp;lt;code&amp;gt;QFILEMCD&amp;lt;/code&amp;gt; contains SLIC as large memory segments stored at the addresses the link loader maps them to.&lt;br /&gt;
# &#039;&#039;&#039;Build a name index.&#039;&#039;&#039; Two structures in the code give you addresses paired with names. Every compilation unit ends with a &amp;lt;code&amp;gt;TBTB&amp;lt;/code&amp;gt; traceback trailer, many carrying the unit&#039;s name; and the link loader leaves a descriptor block per procedure, with the entry address at &amp;lt;code&amp;gt;+0x08&amp;lt;/code&amp;gt; and the name in EBCDIC at &amp;lt;code&amp;gt;+0x38&amp;lt;/code&amp;gt;. Merging both across every segment of a V4R4 image gives on the order of 184,000 named records.&lt;br /&gt;
# &#039;&#039;&#039;Look the address up.&#039;&#039;&#039; Prefer descriptor hits, which name exactly one procedure, over traceback hits, which cover a whole compilation unit and so only tell you which module an address is in.&lt;br /&gt;
# &#039;&#039;&#039;Find who posts the code.&#039;&#039;&#039; Because SRC posting is a normal call, you can find every site that posts one by resolving the calls to the &amp;lt;code&amp;gt;IoMF*SystemRefCode&amp;lt;/code&amp;gt; constructors and reading what the caller places in the code fields just beforehand.&lt;br /&gt;
&lt;br /&gt;
Step 4 needs one piece of SLIC-specific knowledge. External calls do not go through a dispatch table you can read off. A call is &amp;lt;code&amp;gt;ori r11,r13,&#039;&#039;ordinal&#039;&#039;&amp;lt;/code&amp;gt; followed by &amp;lt;code&amp;gt;bla&amp;lt;/code&amp;gt; into a transfer vector at the top of the address space, and the 16-byte stub it lands on computes the target arithmetically from the ordinal. To resolve calls you need the stub constants, which are not derivable and must be read from a dump of the transfer vector segment. With them, every external call in a segment resolves mechanically.&lt;br /&gt;
&lt;br /&gt;
=== A worked example ===&lt;br /&gt;
The DST module that verifies the system password illustrates the whole path. Immediately before it calls &amp;lt;code&amp;gt;IoMFGenericSystemRefCode&amp;lt;/code&amp;gt;, it does this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
li    r0,  0x12                  ; 18&lt;br /&gt;
li    r31, 0x21                  ; 33&lt;br /&gt;
lhz   r6,  0x18(r29)             ; the password status halfword&lt;br /&gt;
cmpwi r6,  0x30&lt;br /&gt;
bne   ...&lt;br /&gt;
sth   r0,  0x44(r1)              ; status == 0x30 -&amp;gt; code 0x12&lt;br /&gt;
b     ...&lt;br /&gt;
sth   r31, 0x44(r1)              ; otherwise      -&amp;gt; code 0x21&lt;br /&gt;
ori   r11, r13, 0xd45c&lt;br /&gt;
bla   ...                        ; IoMFGenericSystemRefCode&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Read backwards, this is exactly the inference you want to be able to make. The reference code is chosen from a status halfword; a status of &amp;lt;code&amp;gt;0x30&amp;lt;/code&amp;gt; produces one code and anything else produces another. So the two codes are not two unrelated faults but two branches of one test, and knowing which one appeared tells you which branch was taken. Working &#039;&#039;forward&#039;&#039; from the SRC list would never reveal that relationship.&lt;br /&gt;
&lt;br /&gt;
=== What the method will not give you ===&lt;br /&gt;
Two honest limits. A traceback trailer names a compilation unit, which may contain many entry points, so it localises rather than pinpoints. And addresses are per-&#039;&#039;&#039;build&#039;&#039;&#039;, not per-release: the same class sits at a completely different address on a machine of another build, so a name index is only valid against the media it was built from. Always match your extracted image to the machine you are investigating, using the build label carried in both container files.&lt;br /&gt;
&lt;br /&gt;
== Why this is worth learning ==&lt;br /&gt;
The technique generalises well beyond diagnosing faults. An SRC sequence is an execution trace with names attached, and the machine emits one on every IPL whether or not anything is wrong. Combined with a name index over the LIC image, it lets you ask questions the documentation does not answer — what the machine checks and in what order, which subsystem owns a given behaviour, where a slow phase is actually spending its time — using only a panel display and a copy of the installation media.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[System Files:QFILEMCD]]&lt;br /&gt;
* [[System Files:QFILEIML]]&lt;br /&gt;
* [[Data Structures:LID]]&lt;br /&gt;
* [[SRC 0000BBBB]]&lt;br /&gt;
* [[Disk device related system reference codes]]&lt;br /&gt;
* [[Tape device related system reference codes]]&lt;br /&gt;
* [[Panel Usage]]&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [https://www.ibm.com/docs/en/i/7.4.0?topic=finder-system-reference-code-list System reference code list], IBM Documentation&lt;br /&gt;
* [https://www.ibm.com/resources/publications/OutputPubsDetails?PubID=SY44590100 AS/400e Service Functions], which documents the panel functions and the IPL progress code sequences&lt;br /&gt;
&lt;br /&gt;
[[Category: System Internals]]&lt;br /&gt;
[[Category:AI generated not reviewed]]&lt;/div&gt;</summary>
		<author><name>PoC</name></author>
	</entry>
	<entry>
		<id>http://try-as400.pocnet.net/index.php?title=System_Files:QFILEIML&amp;diff=1800</id>
		<title>System Files:QFILEIML</title>
		<link rel="alternate" type="text/html" href="http://try-as400.pocnet.net/index.php?title=System_Files:QFILEIML&amp;diff=1800"/>
		<updated>2026-08-16T19:08:14Z</updated>

		<summary type="html">&lt;p&gt;PoC: +cat&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;&amp;lt;code&amp;gt;QFILEIML&amp;lt;/code&amp;gt;&#039;&#039;&#039; is one of the two large container files found on AS/400 SAVSYS and Licensed Internal Code installation media. It holds the machine&#039;s &#039;&#039;loadable&#039;&#039; microcode: IOP and adapter firmware, service processor firmware, and a quantity of SLIC modules. Its internal format is identified by the four-byte magic &#039;&#039;&#039;&amp;lt;code&amp;gt;IMD1&amp;lt;/code&amp;gt;&#039;&#039;&#039; and is a container of [[Data Structures:LID|LIDs]].&lt;br /&gt;
&lt;br /&gt;
The companion file &amp;lt;code&amp;gt;QFILEMCD&amp;lt;/code&amp;gt; holds SLIC proper, via a directory called &amp;lt;code&amp;gt;COPYDIR&amp;lt;/code&amp;gt;. Both files use the same 32-byte [[Data Structures:LID|LID directory record]], and a record present in both is byte-for-byte identical, so the two are two views of one packaging scheme rather than two unrelated formats.&lt;br /&gt;
&lt;br /&gt;
The name is not documented by IBM as far as is known here. &amp;lt;code&amp;gt;IML&amp;lt;/code&amp;gt; almost certainly stands for &#039;&#039;Initial Microprogram Load&#039;&#039; — the phase in which the machine&#039;s microcode is brought up, before OS/400 itself exists — which matches the file&#039;s contents. Treat the expansion as an inference.&lt;br /&gt;
&lt;br /&gt;
This description is based on two samples: a V4R4 image of 81,287,680 bytes (77.5&amp;amp;thinsp;MiB), build label &amp;lt;code&amp;gt;v4r4m01204.0.03&amp;lt;/code&amp;gt;, and a V7R2 one of 288.7&amp;amp;thinsp;MiB, label &amp;lt;code&amp;gt;v7r2m00000.0.00&amp;lt;/code&amp;gt;, taken from an installation ISO. Unless a figure is attributed to a release, it comes from the V4R4 sample; the section &#039;&#039;Across releases&#039;&#039; sets out what is format and what merely happened to be true of one image.&lt;br /&gt;
&lt;br /&gt;
== File layout ==&lt;br /&gt;
The layout is &#039;&#039;&#039;not at fixed offsets&#039;&#039;&#039;. It is carried in the header, and it differs between releases — a decoder that assumes the V4R4 offsets will read a V7R2 container as having no entries at all, without reporting an error.&lt;br /&gt;
&lt;br /&gt;
The field at &amp;lt;code&amp;gt;+0x08&amp;lt;/code&amp;gt;, low 24 bits, is the offset to the Licensed Internal Code banner. The directory header sits at exactly &#039;&#039;&#039;twice&#039;&#039;&#039; that offset, its records &amp;lt;code&amp;gt;0x20&amp;lt;/code&amp;gt; further on, and the build label at header &amp;lt;code&amp;gt;+0x10&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Release&lt;br /&gt;
!&amp;lt;code&amp;gt;+0x08&amp;lt;/code&amp;gt;&lt;br /&gt;
!Banner&lt;br /&gt;
!Directory header&lt;br /&gt;
!Records&lt;br /&gt;
!Build label&lt;br /&gt;
|-&lt;br /&gt;
|V4R4&lt;br /&gt;
|&amp;lt;code&amp;gt;ff000200&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;0x200&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;0x400&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;0x420&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;v4r4m01204.0.03&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|V7R2&lt;br /&gt;
|&amp;lt;code&amp;gt;ff000800&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;0x800&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;0x1000&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;0x1020&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;v7r2m00000.0.00&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
So the general layout is:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Contents&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;0x000&amp;lt;/code&amp;gt;&lt;br /&gt;
|Magic &amp;lt;code&amp;gt;C9 D4 C4 F1&amp;lt;/code&amp;gt;, which is &amp;lt;code&amp;gt;IMD1&amp;lt;/code&amp;gt; in EBCDIC&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;0x008&amp;lt;/code&amp;gt;&lt;br /&gt;
|Low 24 bits: offset to the banner. The rest of the header is not understood&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;banner&#039;&#039;&lt;br /&gt;
|Licensed Internal Code banner in EBCDIC, carrying the LIC product identifiers&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;banner&#039;&#039;&amp;amp;nbsp;×&amp;amp;nbsp;2&lt;br /&gt;
|Directory header: a four-byte preamble, the literal string &amp;lt;code&amp;gt;Directory.&amp;lt;/code&amp;gt;, two zero bytes, then a 16-byte build label&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;banner&#039;&#039;&amp;amp;nbsp;×&amp;amp;nbsp;2&amp;amp;nbsp;+&amp;amp;nbsp;&amp;lt;code&amp;gt;0x20&amp;lt;/code&amp;gt;&lt;br /&gt;
|The directory: a run of 32-byte LID records&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;varies&#039;&#039;&lt;br /&gt;
|Terminator record, identifier &amp;lt;code&amp;gt;0xC5D5C440&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;END&amp;amp;nbsp;&amp;lt;/code&amp;gt; in EBCDIC)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The first sixteen bytes of a V4R4 container are:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
00000000: c9d4 c4f1 0000 0000 ff00 0200 00e0 0000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and of a V7R2 one:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
00000000: c9d4 c4f1 0000 0000 ff00 0800 0010 0000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The banner reads, in EBCDIC:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LICENSED INTERNAL CODE - PROPERTY OF IBM 5763999, 5716999, 5769999&lt;br /&gt;
(C) COPYRIGHT IBM CORP. 1980, 1998. ALL RIGHTS RESERVED. ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The seven-digit numbers are LIC product identifiers, and the same ones appear in &amp;lt;code&amp;gt;QFILEMCD&amp;lt;/code&amp;gt;. The build label is likewise identical between the two container files from the same media, which is a convenient way to confirm that a given &amp;lt;code&amp;gt;QFILEIML&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;QFILEMCD&amp;lt;/code&amp;gt; belong together.&lt;br /&gt;
&lt;br /&gt;
The field at &amp;lt;code&amp;gt;+0x0C&amp;lt;/code&amp;gt; differs between the two samples (&amp;lt;code&amp;gt;00e00000&amp;lt;/code&amp;gt; against &amp;lt;code&amp;gt;00100000&amp;lt;/code&amp;gt;) and is not understood. Two samples are not enough to fit it.&lt;br /&gt;
&lt;br /&gt;
== The directory ==&lt;br /&gt;
The directory begins at &amp;lt;code&amp;gt;0x420&amp;lt;/code&amp;gt; and runs, in this image, for 632 records before the &amp;lt;code&amp;gt;END&amp;amp;nbsp;&amp;lt;/code&amp;gt; terminator at &amp;lt;code&amp;gt;0x5320&amp;lt;/code&amp;gt;. The record layout is documented at [[Data Structures:LID]] and is not repeated here.&lt;br /&gt;
&lt;br /&gt;
Of the 632 records:&lt;br /&gt;
* 341 carry the compressed flag.&lt;br /&gt;
* 631 name an SLS staging address in the &amp;lt;code&amp;gt;FFFFFFFFxx&amp;lt;/code&amp;gt; band. Exactly one does not: LID &amp;lt;code&amp;gt;80900818&amp;lt;/code&amp;gt; stages at &amp;lt;code&amp;gt;000000024A 000000&amp;lt;/code&amp;gt;.&lt;br /&gt;
* 7 have payloads that are themselves runs of LID records — see &#039;&#039;Directory extents&#039;&#039; below.&lt;br /&gt;
&lt;br /&gt;
== Payload addressing ==&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&#039;&#039;&#039;Note!&#039;&#039;&#039; This is the single point on which it is easiest to go wrong, and doing so silently produces plausible-looking nonsense.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;offset&amp;lt;/code&amp;gt; field in each record is &#039;&#039;&#039;not&#039;&#039;&#039; an offset into the container. It is a load-source LBA, describing where the payload sits on the installation medium, and it has no useful meaning inside the file.&lt;br /&gt;
&lt;br /&gt;
Reading it as a file offset is superficially attractive and definitively wrong. Doing so on a V4R4 image yields 608 overlapping extents out of 632, a maximum extent of 34,550 blocks against a 158,765-block file, and a minimum offset of block 3, which lands inside the header. That the lengths happen to sum to approximately the file size is a coincidence and should not be taken as confirmation.&lt;br /&gt;
&lt;br /&gt;
The actual rule is simpler: &#039;&#039;&#039;payloads are stored sequentially, in directory order, immediately after the directory&#039;&#039;&#039;, each one &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; blocks long. There are no gaps and no padding between them.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Payloads begin at the next 512-byte block boundary after the directory terminator.&#039;&#039;&#039; That is block 42 for the V4R4 sample and block 69 for the V7R2 one. This rule needs only the directory, so it also works on a container embedded in a larger image — an install ISO, for instance — where the file size is not a meaningful quantity.&lt;br /&gt;
&lt;br /&gt;
An older formulation, &#039;&#039;file size in blocks minus the sum of all lengths&#039;&#039;, gives the same answer for a standalone file and is a useful cross-check: on the V4R4 sample the two agree exactly, and the implied container size matches the real file size to the byte at 81,287,680. But it cannot be used on an embedded container, so prefer the terminator rule.&lt;br /&gt;
&lt;br /&gt;
To locate a payload, therefore, walk the directory from the beginning and accumulate lengths; do not index by the offset field.&lt;br /&gt;
&lt;br /&gt;
== Contents ==&lt;br /&gt;
Laid out correctly, the payloads fall into two clear populations, distinguishable without decompression by looking for 32-bit &amp;lt;code&amp;gt;stwu r1,-x(r1)&amp;lt;/code&amp;gt; prologues versus 64-bit &amp;lt;code&amp;gt;std&amp;lt;/code&amp;gt; stores:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Population&lt;br /&gt;
!Count&lt;br /&gt;
!Identification&lt;br /&gt;
|-&lt;br /&gt;
|32-bit PowerPC&lt;br /&gt;
|75&lt;br /&gt;
|&amp;lt;code&amp;gt;stwu&amp;lt;/code&amp;gt; prologues present, no &amp;lt;code&amp;gt;std&amp;lt;/code&amp;gt; at all&lt;br /&gt;
|-&lt;br /&gt;
|64-bit PowerPC AS (SLIC)&lt;br /&gt;
|210&lt;br /&gt;
|&amp;lt;code&amp;gt;std&amp;lt;/code&amp;gt; present, no &amp;lt;code&amp;gt;stwu&amp;lt;/code&amp;gt; at all&lt;br /&gt;
|-&lt;br /&gt;
|Neither&lt;br /&gt;
|347&lt;br /&gt;
|Compressed payloads, data, tables, and directory extents&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The split is clean — no payload shows both — which is what makes the heuristic trustworthy. The 32-bit population is the interesting one: the main processor of these machines is 64-bit PowerPC AS, so 32-bit code in this file is by definition destined for something else. That is the IOP, adapter and service processor microcode.&lt;br /&gt;
&lt;br /&gt;
=== Service processor firmware ===&lt;br /&gt;
LID &amp;lt;code&amp;gt;80900702&amp;lt;/code&amp;gt; is service processor Licensed Internal Code: 128&amp;amp;thinsp;KiB, stored uncompressed, staged at SLS &amp;lt;code&amp;gt;FFFFFFFF9A 001000&amp;lt;/code&amp;gt;. Its EBCDIC strings include a &#039;&#039;9400 Licensed Internal Code&#039;&#039; banner and a 1998 copyright, and its code is unambiguously 32-bit.&lt;br /&gt;
&lt;br /&gt;
This confirms a long-standing claim in the trade press that AS/400 service processor firmware is loaded from the load source rather than residing wholly in flash on the card. As the rest of this section shows, that turns out to be only half true.&lt;br /&gt;
&lt;br /&gt;
About 30 payloads carry an &amp;lt;code&amp;gt;AJS&amp;lt;/code&amp;gt; build identifier and are service-processor code, ranging from a few tens of kilobytes to a few hundred. A further handful carry &amp;lt;code&amp;gt;AJG&amp;lt;/code&amp;gt; identifiers and are I/O offload (MFIOP) code instead; several of those carry an &amp;lt;code&amp;gt;ATM&amp;lt;/code&amp;gt; marker, i.e. ATM networking, which is not something a service processor does. The two families are &#039;&#039;mostly&#039;&#039; disjoint but not perfectly: at least one payload contains both identifiers.&lt;br /&gt;
&lt;br /&gt;
==== Module headers ====&lt;br /&gt;
Each of these images is not a monolithic firmware blob but a collection of &#039;&#039;&#039;linkable modules&#039;&#039;&#039;, each introduced by a header with the EBCDIC eyecatcher &#039;&#039;&#039;&amp;lt;code&amp;gt;PGPM&amp;lt;/code&amp;gt;&#039;&#039;&#039; (&amp;lt;code&amp;gt;D7 C7 D7 D4&amp;lt;/code&amp;gt;) — 119 of them in a V4R4 container and 104 in a V7R2 one, decoding identically. The useful fields are:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Contents&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x00&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;PGPM&amp;lt;/code&amp;gt; eyecatcher&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x04&amp;lt;/code&amp;gt;&lt;br /&gt;
|A LID identifier — but see the caveat below&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x24&amp;lt;/code&amp;gt;&lt;br /&gt;
|EBCDIC version string, e.g. &amp;lt;code&amp;gt;0100&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x30&amp;lt;/code&amp;gt;&lt;br /&gt;
|8-byte build identifier, e.g. &amp;lt;code&amp;gt;AJSFGVB3&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x54&amp;lt;/code&amp;gt;&lt;br /&gt;
|8-byte name of the module this header &#039;&#039;&#039;defines&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x60&amp;lt;/code&amp;gt;&lt;br /&gt;
|Slot table, 4-byte values&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0xC0&amp;lt;/code&amp;gt;&lt;br /&gt;
|Import table: 12-byte entries, each an 8-byte name and a 4-byte linkage slot, terminated by eight EBCDIC &amp;lt;code&amp;gt;F&amp;lt;/code&amp;gt; characters&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&#039;&#039;&#039;Note!&#039;&#039;&#039; Strings such as &amp;lt;code&amp;gt;SP MOPT1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SP SPCI3&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;SP WT&amp;lt;/code&amp;gt; are &#039;&#039;&#039;module names in a link table&#039;&#039;&#039;, not feature or capability tags. An earlier version of this article described them as component tags whose differing sets indicated capability tiers across the hardware range. That reading was wrong: the sets differ because different modules import different things.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Worked example, from the header at &amp;lt;code&amp;gt;+0x59C&amp;lt;/code&amp;gt; of LID &amp;lt;code&amp;gt;A07008C2&amp;lt;/code&amp;gt;: build &amp;lt;code&amp;gt;AJSFGVB3&amp;lt;/code&amp;gt;, defines &amp;lt;code&amp;gt;SP SB&amp;lt;/code&amp;gt;, and imports &amp;lt;code&amp;gt;SP SPCI1&amp;lt;/code&amp;gt; through &amp;lt;code&amp;gt;SP SPCI5&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;CUANSI&amp;lt;/code&amp;gt;, with the import table running to its terminator at &amp;lt;code&amp;gt;+0x1B4&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Both families share a common utility layer, which is why their vocabulary overlaps: &amp;lt;code&amp;gt;CUANSI&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;CUCONV&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;CUIO&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;CUMEMORY&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;CUMISC&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;CUSTO&amp;lt;/code&amp;gt;, plus &amp;lt;code&amp;gt;SRASCOMN&amp;lt;/code&amp;gt; for RAS common code.&lt;br /&gt;
&lt;br /&gt;
==== Reading the dependency graph ====&lt;br /&gt;
Because every module declares what it defines and what it imports, the link tables can simply be read off as a dependency graph — which is more informative than any amount of disassembly, and is the main reason the &amp;lt;code&amp;gt;PGPM&amp;lt;/code&amp;gt; header is worth knowing about.&lt;br /&gt;
&lt;br /&gt;
Doing so reveals a clean pattern. The &#039;&#039;&#039;numbered&#039;&#039;&#039; names — &amp;lt;code&amp;gt;SP SPCI1&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;SPCI5&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SP MOPT1&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;MOPT9&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SP MOPD1&amp;lt;/code&amp;gt; — are imported by many modules and &#039;&#039;&#039;defined by none&#039;&#039;&#039;. The &#039;&#039;&#039;lettered&#039;&#039;&#039; members of the same families — &amp;lt;code&amp;gt;MOPTA&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MOPTB&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MOPTC&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MOPD2&amp;lt;/code&amp;gt; — each import their immediate predecessor and are present as real modules.&lt;br /&gt;
&lt;br /&gt;
The natural reading is that numbered names are resident firmware on the card and lettered ones are downloadable extensions layered on top. Which is exactly what the following section establishes by a completely independent route.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&#039;&#039;&#039;Caveat.&#039;&#039;&#039; The LID identifier at &amp;lt;code&amp;gt;+0x04&amp;lt;/code&amp;gt; of a &amp;lt;code&amp;gt;PGPM&amp;lt;/code&amp;gt; header frequently disagrees with the container LID that the sequential payload layout assigns to that region. Most of these values are valid LID identifiers from the directory, and in one region a run of 21 consecutive modules is spaced exactly by the directory lengths of the LIDs they name. Either the layout is displaced there, or modules are stored under a delivery LID distinct from their own. Findings about module &#039;&#039;contents&#039;&#039; are unaffected, since they come from the headers themselves — but do not quote a byte offset against a specific LID until this is resolved.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== What is not in the file ===&lt;br /&gt;
Notably, the service processor&#039;s own &#039;&#039;&#039;supervisor is absent&#039;&#039;&#039;. Two independent lines of evidence agree on this.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;From the instruction stream.&#039;&#039;&#039; All payloads were searched for &amp;lt;code&amp;gt;rfi&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;0x4C000064&amp;lt;/code&amp;gt;), which any PowerPC exception-returning kernel must contain, and for exception vector tables at the architectural &amp;lt;code&amp;gt;0x100&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;0x200&amp;lt;/code&amp;gt; and subsequent offsets of every 4&amp;amp;thinsp;KiB boundary. Across 4.1&amp;amp;thinsp;MB of service-processor code there is not one &amp;lt;code&amp;gt;rfi&amp;lt;/code&amp;gt;, and no payload has a vector table. Privileged operations are almost as scarce: six instructions of the &amp;lt;code&amp;gt;mtmsr&amp;lt;/code&amp;gt; family and four cache or TLB operations in the whole set.&lt;br /&gt;
&lt;br /&gt;
Consistent with that, LID &amp;lt;code&amp;gt;80900702&amp;lt;/code&amp;gt; begins mid-function, with a function &#039;&#039;tail&#039;&#039; rather than an entry point, and manipulates no privileged state at all — only LR, CTR and XER are touched. It does contain 31 &amp;lt;code&amp;gt;sc&amp;lt;/code&amp;gt; supervisor calls.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;From the link tables.&#039;&#039;&#039; As described above, the numbered module names are imported by many modules and defined by none. The code that provides them is therefore not on this medium.&lt;br /&gt;
&lt;br /&gt;
The conclusion is that the service processor runs a resident supervisor of its own, held in flash on the card, and that this file supplies only loadable task modules that sit on top of it. That is consistent with the hardware — the operator panel carries its own flash, and SLIC has an explicit message for instructing the service processor to IPL itself.&lt;br /&gt;
&lt;br /&gt;
==== The supervisor call interface ====&lt;br /&gt;
Since the supervisor itself is absent, the &amp;lt;code&amp;gt;sc&amp;lt;/code&amp;gt; instructions are the entire visible boundary between these modules and the firmware they run on. Across the family there are 668 supervisor calls using just 9 distinct call numbers, with the number in &amp;lt;code&amp;gt;r0&amp;lt;/code&amp;gt; and arguments from &amp;lt;code&amp;gt;r3&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Call&lt;br /&gt;
!Count&lt;br /&gt;
!Observed arguments&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;0x020C&amp;lt;/code&amp;gt;&lt;br /&gt;
|262&lt;br /&gt;
|—&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;0x0208&amp;lt;/code&amp;gt;&lt;br /&gt;
|131&lt;br /&gt;
|&amp;lt;code&amp;gt;r3 = 0x16&amp;lt;/code&amp;gt; in every instance&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;0x03A4&amp;lt;/code&amp;gt;&lt;br /&gt;
|106&lt;br /&gt;
|&amp;lt;code&amp;gt;r3 = 0x64&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;r4 = 5&amp;lt;/code&amp;gt;; unique to one module&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;0x0358&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&amp;lt;code&amp;gt;r3&amp;lt;/code&amp;gt; is one of exactly three values: &amp;lt;code&amp;gt;0x83010000&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;0x83020000&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;0x83030000&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The first two are the interesting pair: &amp;lt;code&amp;gt;0x0208&amp;lt;/code&amp;gt; occurs exactly half as often as &amp;lt;code&amp;gt;0x020C&amp;lt;/code&amp;gt;, and always on the same resource number, which is the signature of an acquire/release pair around a critical section. The &amp;lt;code&amp;gt;0x0358&amp;lt;/code&amp;gt; window is the only region passed explicitly to a supervisor call, which is what registering or mapping a device or shared-memory window looks like.&lt;br /&gt;
&lt;br /&gt;
Beyond that the call numbers cannot be decoded, because the code that implements them is not on this medium.&lt;br /&gt;
&lt;br /&gt;
==== A caution about what this firmware does ====&lt;br /&gt;
It is tempting to assume this firmware covers the obvious service-processor duties — power control, thermal and fan management, SPCN, driving the panel and its LCD, VPD storage, error logging and SRC posting. &#039;&#039;&#039;No such claim is supported by this file.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
These modules contain almost no descriptive text. The complete inventory of readable strings is the Licensed Internal Code banner, the copyright boilerplate, the EBCDIC-to-ASCII translation tables, and the &amp;lt;code&amp;gt;PGPM&amp;lt;/code&amp;gt; link names. A search for the entire relevant vocabulary — &amp;lt;code&amp;gt;POWER&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;FAN&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;THERMAL&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SPCN&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;VPD&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;PASSWORD&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SECUR&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SERIAL&amp;lt;/code&amp;gt; and more, in both EBCDIC and ASCII, over every byte — returns nothing in any service-processor module. The same vocabulary &#039;&#039;is&#039;&#039; present elsewhere in the container, but only inside SLIC payloads.&lt;br /&gt;
&lt;br /&gt;
So the honest position is that the functional surface visible here is nine supervisor call numbers into firmware nobody has. What the service processor actually does is implemented on the other side of that boundary.&lt;br /&gt;
&lt;br /&gt;
One bound on that negative: readable code averages about 46&amp;amp;thinsp;% of 1&amp;amp;thinsp;KiB blocks across these images, and one 119&amp;amp;thinsp;KiB payload is entirely opaque. The supported statement is that nothing is visible in the readable portion, not that nothing exists.&lt;br /&gt;
&lt;br /&gt;
=== Directory extents ===&lt;br /&gt;
Seven payloads are not data but further runs of 32-byte LID records, largely duplicating entries from the root directory byte for byte. The two largest hold 294 and 133 records. They appear to be indexes rather than nested containers, and a tool walking this file should recognise them so as not to mistake an index for a firmware image. A payload whose first few records parse as plausible LID records, with identifiers matching known LIDs, is an extent.&lt;br /&gt;
&lt;br /&gt;
== Compression ==&lt;br /&gt;
341 of the 632 payloads are flagged compressed. The codec is the LZW variant used throughout SLIC and is described at [[Data Structures:LID#The compressed flag]]. It has not been needed to read the service processor firmware, which is stored plain, but it stands between the reader and roughly half the file.&lt;br /&gt;
&lt;br /&gt;
== Tooling ==&lt;br /&gt;
No IBM-supplied tool for reading this file outside the machine is known. A parser must, at minimum:&lt;br /&gt;
# check the &amp;lt;code&amp;gt;IMD1&amp;lt;/code&amp;gt; magic at offset 0;&lt;br /&gt;
# read the banner offset from &amp;lt;code&amp;gt;+0x08&amp;lt;/code&amp;gt; and &#039;&#039;&#039;derive&#039;&#039;&#039; the directory position from it, rather than assuming a constant;&lt;br /&gt;
# read 32-byte records until an identifier of &amp;lt;code&amp;gt;0xC5D5C440&amp;lt;/code&amp;gt; or zero;&lt;br /&gt;
# place the payload area at the next block boundary after that terminator;&lt;br /&gt;
# lay payloads out sequentially in directory order.&lt;br /&gt;
&lt;br /&gt;
Step 2 is the one that catches people. An implementation that hardcodes the V4R4 directory offset of &amp;lt;code&amp;gt;0x420&amp;lt;/code&amp;gt; does not fail loudly on a V7R2 container — it reports zero records and a nonsensical payload start. Deriving the offsets costs nothing and works on both.&lt;br /&gt;
&lt;br /&gt;
== Across releases ==&lt;br /&gt;
Comparing a V4R4 image with a V7R2 one shows how much of this is format and how much was accident of a single sample.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&lt;br /&gt;
!V4R4&lt;br /&gt;
!V7R2&lt;br /&gt;
|-&lt;br /&gt;
|Records&lt;br /&gt;
|632&lt;br /&gt;
|961&lt;br /&gt;
|-&lt;br /&gt;
|Compressed&lt;br /&gt;
|341&lt;br /&gt;
|557&lt;br /&gt;
|-&lt;br /&gt;
|Payload&lt;br /&gt;
|77.5&amp;amp;thinsp;MiB&lt;br /&gt;
|288.7&amp;amp;thinsp;MiB&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;PGPM&amp;lt;/code&amp;gt; module headers&lt;br /&gt;
|119&lt;br /&gt;
|104&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The record format, the &amp;lt;code&amp;gt;PGPM&amp;lt;/code&amp;gt; module header and its field offsets, the payload tiling rule and the &amp;lt;code&amp;gt;END&amp;amp;nbsp;&amp;lt;/code&amp;gt; terminator are all unchanged. What varies is the header offsets, which the header itself declares.&lt;br /&gt;
&lt;br /&gt;
The service processor module namespace is also strikingly stable. Fourteen &amp;lt;code&amp;gt;SP&amp;lt;/code&amp;gt; module names are defined in both releases, and the pattern of numbered names being imported but never defined — the evidence that they live in flash on the card — reproduces exactly sixteen years apart. So does the supervisor call vocabulary, with V7R2 adding one new call number.&lt;br /&gt;
&lt;br /&gt;
What did change is on the SLIC side, and it is what you would expect once the service processor and panel stop being discrete cards. The concrete hardware driver classes are simply gone in V7R2, while the message protocol and resource model that sat on top of them survive and grow. In their place, the panel and service processor objects are constructed from new &#039;&#039;virtual&#039;&#039; VPD providers. The interface is preserved and the implementation behind it is virtualised — which is why code written against the older message classes still reads as recognisable on a modern machine.&lt;br /&gt;
&lt;br /&gt;
== Open questions ==&lt;br /&gt;
* The header field at &amp;lt;code&amp;gt;+0x0C&amp;lt;/code&amp;gt;, which differs between samples (&amp;lt;code&amp;gt;00e00000&amp;lt;/code&amp;gt; against &amp;lt;code&amp;gt;00100000&amp;lt;/code&amp;gt;).&lt;br /&gt;
* The rest of the header between &amp;lt;code&amp;gt;+0x0C&amp;lt;/code&amp;gt; and the banner.&lt;br /&gt;
* The meaning of most LID identifier families.&lt;br /&gt;
* Why some payloads carry the compressed flag yet begin with plainly readable 32-bit code.&lt;br /&gt;
* Whether the load-source LBAs in the offset field can be used to reconstruct the physical layout of the original installation medium.&lt;br /&gt;
* The &amp;lt;code&amp;gt;PGPM&amp;lt;/code&amp;gt; identifier discrepancy described above.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Data Structures:LID]]&lt;br /&gt;
* [[CISC AS/400 LIC Tapes]]&lt;br /&gt;
* [[Copying disks with Linux]]&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [https://www.mcpressonline.com/ MC Press Online], which carries older documentation describing service processor microcode as being loaded from the load source&lt;br /&gt;
&lt;br /&gt;
[[Category: System Internals]]&lt;br /&gt;
[[Category:AI generated not reviewed]]&lt;/div&gt;</summary>
		<author><name>PoC</name></author>
	</entry>
	<entry>
		<id>http://try-as400.pocnet.net/index.php?title=System_Files:QFILEMCD&amp;diff=1799</id>
		<title>System Files:QFILEMCD</title>
		<link rel="alternate" type="text/html" href="http://try-as400.pocnet.net/index.php?title=System_Files:QFILEMCD&amp;diff=1799"/>
		<updated>2026-08-16T19:07:53Z</updated>

		<summary type="html">&lt;p&gt;PoC: +cat&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;&amp;lt;code&amp;gt;QFILEMCD&amp;lt;/code&amp;gt;&#039;&#039;&#039; is the larger of the two container files found on AS/400 SAVSYS and Licensed Internal Code installation media. It is a backup of &#039;&#039;&#039;SLIC&#039;&#039;&#039; itself — the System Licensed Internal Code that sits below OS/400 — stored as a small number of very large memory segments. Its internal format is called &#039;&#039;&#039;&amp;lt;code&amp;gt;COPYDIR&amp;lt;/code&amp;gt;&#039;&#039;&#039; after the eyecatcher at offset zero.&lt;br /&gt;
&lt;br /&gt;
Practically, this is the file to reach for if you want to read the machine&#039;s own code without touching a running system. Its segments are a byte-for-byte image of what the link loader maps into memory, so an address recovered from a crash, a trace or a [[SRC|system reference code]] can be looked up directly in a file on your workstation. The companion file [[System Files:QFILEIML]] carries the loadable IOP, adapter and service processor microcode instead.&lt;br /&gt;
&lt;br /&gt;
Both files are containers of [[Data Structures:LID|LIDs]], but at different granularities, and the relationship between them is described under &#039;&#039;Two directories, two granularities&#039;&#039; below.&lt;br /&gt;
&lt;br /&gt;
The figures quoted here come from one V4R4 image of 472,846,336 bytes (451&amp;amp;thinsp;MiB). Treat structure as general and numbers as release-specific; the format is unchanged from V4R4 through V7R4, across install media and SAVSYS output alike.&lt;br /&gt;
&lt;br /&gt;
== Header ==&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Contents&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;0x00&amp;lt;/code&amp;gt;&lt;br /&gt;
|Eyecatcher &amp;lt;code&amp;gt;COPYDIR&amp;amp;nbsp;&amp;lt;/code&amp;gt; in EBCDIC (&amp;lt;code&amp;gt;C3 D6 D7 E8 C4 C9 D9 40&amp;lt;/code&amp;gt;), a zero byte, then the two EBCDIC characters &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;0x1C&amp;lt;/code&amp;gt;&lt;br /&gt;
|32-bit total size of the payload area — see below. Confirmed on three independent samples&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;0x26&amp;lt;/code&amp;gt;&lt;br /&gt;
|Release level, then the &#039;&#039;&#039;system serial number&#039;&#039;&#039;, EBCDIC&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;0x50&amp;lt;/code&amp;gt;&lt;br /&gt;
|Licensed Internal Code banner, EBCDIC, in 48-character chunks&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;0x1C0&amp;lt;/code&amp;gt;&lt;br /&gt;
|Start of the directory&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The string in a V4R4 image reads:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
V4R4M044-C6295  2606071417&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and in a V7R4 one taken by SAVSYS from a running machine:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
V7R4M021-7886W&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The first field is the release and modification level. &#039;&#039;&#039;The five characters after the hyphen are the system serial number.&#039;&#039;&#039; That is not an inference: the owner of the V7R4 machine confirms its serial is &amp;lt;code&amp;gt;7886W&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
On &#039;&#039;&#039;installation media&#039;&#039;&#039; the same field carries a build or media tag instead — a V7R4 install ISO reads &amp;lt;code&amp;gt;V7R4M021-821BV&amp;lt;/code&amp;gt; — so what the field means depends on how the image was produced. Both forms are five characters, which makes them easy to confuse.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&#039;&#039;&#039;Note!&#039;&#039;&#039; A LIC backup is therefore &#039;&#039;&#039;not anonymous&#039;&#039;&#039;: it records the serial number of the machine it came from. The serial is also one of the values the system password is keyed on (see [[CISC AS/400 LIC Tapes]]), so treat these files as identifying if you share them.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the V4R4 sample the ten digits after the serial parse naturally as a timestamp of the form &amp;lt;code&amp;gt;YYMMDDHHMM&amp;lt;/code&amp;gt;, making that backup 2026-06-07 14:17. That part &#039;&#039;&#039;is&#039;&#039;&#039; an inference from the shape of the field, and the V7R4 sample carries binary rather than digits in the same place, so the layout after the serial is not fixed.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&#039;&#039;&#039;Note!&#039;&#039;&#039; The header is &#039;&#039;&#039;not&#039;&#039;&#039; a fixed 192 (&amp;lt;code&amp;gt;0xC0&amp;lt;/code&amp;gt;) bytes, despite older format notes saying so. The IBM legal banner runs on well past that point, and in this V4R4 image the directory does not begin until &amp;lt;code&amp;gt;0x1C0&amp;lt;/code&amp;gt;. A parser should locate the directory by scanning for the first 64-byte-aligned block that has the shape of an entry, rather than seeking to a constant.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The 32-bit field at &amp;lt;code&amp;gt;0x1C&amp;lt;/code&amp;gt; holds &amp;lt;code&amp;gt;0x1C2F0000&amp;lt;/code&amp;gt;, which is exactly the end of the last segment&#039;s data. It is a total-payload-size field and makes a good consistency check after parsing the directory: accumulate the entries and you should arrive at the same number.&lt;br /&gt;
&lt;br /&gt;
== The directory ==&lt;br /&gt;
The directory is a run of 64-byte entries beginning at &amp;lt;code&amp;gt;0x1C0&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Size&lt;br /&gt;
!Field&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x00&amp;lt;/code&amp;gt;&lt;br /&gt;
|8&lt;br /&gt;
|Always zero in observed data&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x08&amp;lt;/code&amp;gt;&lt;br /&gt;
|8&lt;br /&gt;
|Flags. See the bit-numbering warning below&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x10&amp;lt;/code&amp;gt;&lt;br /&gt;
|8&lt;br /&gt;
|SLS address of the saved segment&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x18&amp;lt;/code&amp;gt;&lt;br /&gt;
|8&lt;br /&gt;
|Segment attributes; the top 16 bits carry the useful value&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x20&amp;lt;/code&amp;gt;&lt;br /&gt;
|8&lt;br /&gt;
|Always zero in observed data&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x28&amp;lt;/code&amp;gt;&lt;br /&gt;
|8&lt;br /&gt;
|Offset to the segment data, &#039;&#039;&#039;absolute from the start of the file&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x30&amp;lt;/code&amp;gt;&lt;br /&gt;
|4&lt;br /&gt;
|Segment length, in &#039;&#039;&#039;raw bytes&#039;&#039;&#039; — not blocks&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x34&amp;lt;/code&amp;gt;&lt;br /&gt;
|4&lt;br /&gt;
|Always zero in observed data&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x38&amp;lt;/code&amp;gt;&lt;br /&gt;
|8&lt;br /&gt;
|Always zero in observed data&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Two details cause most of the trouble people have with this structure, and both were originally got wrong here:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Flags use IBM&#039;s MSB-first bit numbering.&#039;&#039;&#039; Older notes describe the field as &amp;lt;code&amp;gt;bbt 0:3&amp;lt;/code&amp;gt;, and a reader used to LSB-first numbering will look in the bottom nibble and find nothing. Bit 0 is the &#039;&#039;most&#039;&#039; significant bit, so the value lives in the &#039;&#039;&#039;top&#039;&#039;&#039; nibble of the 8-byte field. A normal entry reads &amp;lt;code&amp;gt;0x1000000000000000&amp;lt;/code&amp;gt;; the end-of-directory marker reads &amp;lt;code&amp;gt;0xF000000000000000&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;The data offset is absolute.&#039;&#039;&#039; It is measured from the start of the file, not from the end of the directory. Reading it as relative shifts every extracted segment by the size of the directory, which produces code that disassembles almost plausibly and is wrong everywhere.&lt;br /&gt;
&lt;br /&gt;
In this image the directory holds &#039;&#039;&#039;32 entries&#039;&#039;&#039;, with the terminator at &amp;lt;code&amp;gt;0x9C0&amp;lt;/code&amp;gt; and the directory ending at &amp;lt;code&amp;gt;0xA00&amp;lt;/code&amp;gt;. The first entry has a data offset of zero, which means the header and directory physically occupy the first &amp;lt;code&amp;gt;0xA00&amp;lt;/code&amp;gt; bytes of the first segment&#039;s stored image. This is expected rather than a bug, but a tool that extracts that segment will see the container&#039;s own header at the front of it.&lt;br /&gt;
&lt;br /&gt;
Segment lengths are consistently a whole number of 4&amp;amp;thinsp;KiB pages less than a power-of-two boundary: &amp;lt;code&amp;gt;0xFFF000&amp;lt;/code&amp;gt; is 16&amp;amp;thinsp;MiB minus one page, &amp;lt;code&amp;gt;0x7FF000&amp;lt;/code&amp;gt; is 8&amp;amp;thinsp;MiB minus one page, and so on.&lt;br /&gt;
&lt;br /&gt;
== Contents of a typical backup ==&lt;br /&gt;
The 32 segments of this image, with names from a community-maintained SLS address reference. Where the name column is blank, the segment&#039;s purpose has not been established.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!SLS address&lt;br /&gt;
!Length&lt;br /&gt;
!Name&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;FFFFFFFFB1 000000&amp;lt;/code&amp;gt;&lt;br /&gt;
|16&amp;amp;thinsp;MiB&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;FFFFFFFFB2 000000&amp;lt;/code&amp;gt;&lt;br /&gt;
|16&amp;amp;thinsp;MiB&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;FFFFFFFFB3 000000&amp;lt;/code&amp;gt;&lt;br /&gt;
|16&amp;amp;thinsp;MiB&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;FFFFFFFFB5 000000&amp;lt;/code&amp;gt;&lt;br /&gt;
|16&amp;amp;thinsp;MiB&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;FFFFFFFFC1 000000&amp;lt;/code&amp;gt;&lt;br /&gt;
|16&amp;amp;thinsp;MiB&lt;br /&gt;
|Link Loader — LIC Code&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;FFFFFFFFC2 000000&amp;lt;/code&amp;gt;&lt;br /&gt;
|16&amp;amp;thinsp;MiB&lt;br /&gt;
|Link Loader — LIC Data&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;FFFFFFFFC3 000000&amp;lt;/code&amp;gt;&lt;br /&gt;
|16&amp;amp;thinsp;MiB&lt;br /&gt;
|Link Loader — LIC Code (2)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;FFFFFFFFC4 000000&amp;lt;/code&amp;gt;&lt;br /&gt;
|16&amp;amp;thinsp;MiB&lt;br /&gt;
|Link Loader — LIC Code (3)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;FFFFFFFFC5 000000&amp;lt;/code&amp;gt;&lt;br /&gt;
|16&amp;amp;thinsp;MiB&lt;br /&gt;
|Link Loader — LIC Code (4)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;FFFFFFFFC6 000000&amp;lt;/code&amp;gt;&lt;br /&gt;
|8&amp;amp;thinsp;MiB&lt;br /&gt;
|Link Loader — LIC Code (5)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;FFFFFFFFC7 000000&amp;lt;/code&amp;gt;&lt;br /&gt;
|16&amp;amp;thinsp;MiB&lt;br /&gt;
|Mixed — component code and NLS text pools&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;FFFFFFFFC8 000000&amp;lt;/code&amp;gt;&lt;br /&gt;
|8&amp;amp;thinsp;MiB&lt;br /&gt;
|Mixed — bignum/JVM code and NLS text pools&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;FFFFFFFFF1 000000&amp;lt;/code&amp;gt;&lt;br /&gt;
|4&amp;amp;thinsp;MiB&lt;br /&gt;
|Link Loader TOC&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;FFFFFFFFF2 000000&amp;lt;/code&amp;gt;&lt;br /&gt;
|16&amp;amp;thinsp;MiB&lt;br /&gt;
|Service LID&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;FFFFFFFFF4 000000&amp;lt;/code&amp;gt;&lt;br /&gt;
|16&amp;amp;thinsp;MiB&lt;br /&gt;
|Service LID (2)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;FFFFFFFFFE 000000&amp;lt;/code&amp;gt;&lt;br /&gt;
|15&amp;amp;thinsp;MiB&lt;br /&gt;
|Pageable BLA&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;FFFFFFFFD1 000000&amp;lt;/code&amp;gt;&lt;br /&gt;
|16&amp;amp;thinsp;MiB&lt;br /&gt;
|Link Loader Information&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;FFFFFFFFD2 000000&amp;lt;/code&amp;gt;&lt;br /&gt;
|16&amp;amp;thinsp;MiB&lt;br /&gt;
|Link Loader Information, Code, Data&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;FFFFFFFFD3 000000&amp;lt;/code&amp;gt;&lt;br /&gt;
|16&amp;amp;thinsp;MiB&lt;br /&gt;
|Link Loader Information (2)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;FFFFFFFFD4 000000&amp;lt;/code&amp;gt;&lt;br /&gt;
|16&amp;amp;thinsp;MiB&lt;br /&gt;
|Mixed — JVM strings and DST debug symbol table&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;FFFFFFFF90 010000&amp;lt;/code&amp;gt;&lt;br /&gt;
|60&amp;amp;thinsp;KiB&lt;br /&gt;
|LID Directory&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;FFFFFFFF91 000000&amp;lt;/code&amp;gt;&lt;br /&gt;
|16&amp;amp;thinsp;MiB&lt;br /&gt;
|LID NUC2 A-Side&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;FFFFFFFF92 000000&amp;lt;/code&amp;gt;&lt;br /&gt;
|16&amp;amp;thinsp;MiB&lt;br /&gt;
|LID NUC2 B-Side&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;FFFFFFFF93 000000&amp;lt;/code&amp;gt;&lt;br /&gt;
|16&amp;amp;thinsp;MiB&lt;br /&gt;
|LID NUC1 A-Side&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;FFFFFFFF94 000000&amp;lt;/code&amp;gt;&lt;br /&gt;
|16&amp;amp;thinsp;MiB&lt;br /&gt;
|LID NUC1 B-Side&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;FFFFFFFF95 000000&amp;lt;/code&amp;gt;&lt;br /&gt;
|16&amp;amp;thinsp;MiB&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;FFFFFFFF96 000000&amp;lt;/code&amp;gt;&lt;br /&gt;
|16&amp;amp;thinsp;MiB&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;FFFFFFFF9A 000000&amp;lt;/code&amp;gt;&lt;br /&gt;
|8&amp;amp;thinsp;MiB&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;FFFFFFFF9B 000000&amp;lt;/code&amp;gt;&lt;br /&gt;
|8&amp;amp;thinsp;MiB&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;FFFFFFFFA1 000000&amp;lt;/code&amp;gt;&lt;br /&gt;
|16&amp;amp;thinsp;MiB&lt;br /&gt;
|LID Manager&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;FFFFFFFFA2 000000&amp;lt;/code&amp;gt;&lt;br /&gt;
|16&amp;amp;thinsp;MiB&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;FFFFFFFF69 000000&amp;lt;/code&amp;gt;&lt;br /&gt;
|16&amp;amp;thinsp;MiB&lt;br /&gt;
|IDE&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
So a backup of this shape is the SLIC boot and loader nucleus: link loader code and data, the loader&#039;s table of contents, the LID subsystem&#039;s own bookkeeping, and both IPL sides of the two nucleus LIDs. It is not the whole of the machine&#039;s code.&lt;br /&gt;
&lt;br /&gt;
=== A and B sides ===&lt;br /&gt;
Several segments appear twice, distinguished as &#039;&#039;A-side&#039;&#039; and &#039;&#039;B-side&#039;&#039;. An AS/400 keeps two copies of its Licensed Internal Code so that an update can be applied to one while the other remains a fallback. A normal, unattended IPL runs the &#039;&#039;&#039;B side&#039;&#039;&#039;, so B is what a running machine is executing and B is what static analysis should be done against. Because the two sides are normally near-identical, a byte comparison against the A side is not evidence that A is the live one — the test only means something on a segment that actually differs between them.&lt;br /&gt;
&lt;br /&gt;
== Two directories, two granularities ==&lt;br /&gt;
A common source of confusion is that &amp;lt;code&amp;gt;QFILEMCD&amp;lt;/code&amp;gt; appears to have two completely different directory formats. It does, and they nest:&lt;br /&gt;
&lt;br /&gt;
* The &#039;&#039;&#039;coarse&#039;&#039;&#039; level is &amp;lt;code&amp;gt;COPYDIR&amp;lt;/code&amp;gt;&#039;s own directory, documented above: 64-byte entries, one per 16&amp;amp;thinsp;MiB-class memory segment, 32 of them.&lt;br /&gt;
* The &#039;&#039;&#039;fine&#039;&#039;&#039; level is a catalogue of individual LIDs, thousands of entries, using the 32-byte record described at [[Data Structures:LID]].&lt;br /&gt;
&lt;br /&gt;
The fine level is not a second header in the file. It is simply &#039;&#039;&#039;the contents of one particular segment&#039;&#039;&#039; — the one named &#039;&#039;LID Directory&#039;&#039;, at &amp;lt;code&amp;gt;FFFFFFFF90 010000&amp;lt;/code&amp;gt;. Extract that segment and you find, after a preamble of about 1536 bytes, an EBCDIC &amp;lt;code&amp;gt;Directory.&amp;lt;/code&amp;gt; eyecatcher, a version label, and then the records. In this image the label reads &amp;lt;code&amp;gt;v4r4m01204.0.03&amp;lt;/code&amp;gt;, which is the same label carried by [[System Files:QFILEIML]] — a quick way to confirm that two files came off the same media.&lt;br /&gt;
&lt;br /&gt;
That is also why tools which dump this file emit two dissimilar-looking listings: a short table of large memory extents, and a long list of LIDs. They are two levels of one structure, not two formats.&lt;br /&gt;
&lt;br /&gt;
== Extracting a segment ==&lt;br /&gt;
The practical recipe, and the reason this file is worth knowing about:&lt;br /&gt;
&lt;br /&gt;
# Read the &amp;lt;code&amp;gt;COPYDIR&amp;lt;/code&amp;gt; eyecatcher at offset 0 to confirm the format.&lt;br /&gt;
# Find the directory by scanning 64-byte-aligned offsets for the first entry-shaped block, rather than assuming &amp;lt;code&amp;gt;0xC0&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;0x1C0&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Walk entries until the flags field has &amp;lt;code&amp;gt;0xF&amp;lt;/code&amp;gt; in its &#039;&#039;&#039;top&#039;&#039;&#039; nibble.&lt;br /&gt;
# For the segment you want, seek to the data offset &#039;&#039;&#039;as an absolute file offset&#039;&#039;&#039; and read &#039;&#039;length&#039;&#039; raw bytes.&lt;br /&gt;
# Load the result at its SLS address in a disassembler. The bytes are what the link loader maps, so addresses match.&lt;br /&gt;
&lt;br /&gt;
Step 5 is the payoff. A 64-bit address such as &amp;lt;code&amp;gt;FFFFFFFFC6 1F1690&amp;lt;/code&amp;gt; can be typed straight into the DST &#039;&#039;Display/Alter storage&#039;&#039; panel on a live machine of the same build, and the sixteen rows it displays will match the extracted file byte for byte. Static and live analysis share one address space, which means you can do the slow work offline and use the machine only for confirmation.&lt;br /&gt;
&lt;br /&gt;
Two caveats on addresses. They are per-&#039;&#039;&#039;build&#039;&#039;&#039;, not per-release, so comparisons are only meaningful between identical builds; the same class sits at a quite different address on a V5R4 machine. And the SLS address recorded in the directory is the address the segment was &#039;&#039;&#039;saved from&#039;&#039;&#039;, which is not always where it runs — the resident nucleus segment, for instance, is stored in the container under the SID of the B-side nucleus LID rather than its runtime SID.&lt;br /&gt;
&lt;br /&gt;
== Reading the code ==&lt;br /&gt;
Once a segment is loaded, two structures make it navigable, and both are worth knowing because they turn addresses into names:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Traceback trailers.&#039;&#039;&#039; Every compilation unit ends its code with a &amp;lt;code&amp;gt;TBTB&amp;lt;/code&amp;gt; trailer, and many carry the module&#039;s name. A trailer names a whole compilation unit rather than a single function, so a hit means &amp;quot;this address is inside module X&amp;quot;, not &amp;quot;this address is function X&amp;quot;.&lt;br /&gt;
* &#039;&#039;&#039;Link-loader descriptor blocks.&#039;&#039;&#039; Considerably richer: one block per procedure, carrying the entry address at &amp;lt;code&amp;gt;+0x08&amp;lt;/code&amp;gt; and the name in EBCDIC at &amp;lt;code&amp;gt;+0x38&amp;lt;/code&amp;gt;. Names beginning with &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt; are SLIC-internal modules; the rest are C++ mangled symbols.&lt;br /&gt;
&lt;br /&gt;
Merging both across every segment of this V4R4 image yields roughly 184,000 named records, which is enough to name a substantial fraction of any address you encounter. See [[SRC]] for how to use that to get from a reference code back to a module.&lt;br /&gt;
&lt;br /&gt;
Calls between modules do not go through a conventional dispatch table, which surprises people disassembling SLIC for the first time. An external call is a two-instruction sequence — &amp;lt;code&amp;gt;ori r11,r13,&#039;&#039;ordinal&#039;&#039;&amp;lt;/code&amp;gt; followed by &amp;lt;code&amp;gt;bla&amp;lt;/code&amp;gt; into a transfer vector at the very top of the address space — and the 16-byte stub it lands on computes the target arithmetically. There is no table to read off; the ordinal &#039;&#039;is&#039;&#039; the callee&#039;s word offset within a window, and the stub supplies the window. The stub constants cannot be derived and must be read from a dump of the transfer vector.&lt;br /&gt;
&lt;br /&gt;
== The trailing page ==&lt;br /&gt;
The payload area ends at &amp;lt;code&amp;gt;0x1C2F0000&amp;lt;/code&amp;gt;, but the file is one 4&amp;amp;thinsp;KiB page longer than that. The final page is not padding: it holds 468 non-zero 8-byte records, which appear to be address-and-value pairs.&lt;br /&gt;
&lt;br /&gt;
They fall into two clear populations. The first 110 are in ascending address order with a value of 8, addressing the &#039;&#039;Link Loader — LIC Data&#039;&#039; segment among others. The remaining 256 are identical to each other: the same address &amp;lt;code&amp;gt;0xFE911220&amp;lt;/code&amp;gt;, in the &#039;&#039;Pageable BLA&#039;&#039; segment, paired with the value &amp;lt;code&amp;gt;0x48000002&amp;lt;/code&amp;gt; — which as PowerPC is a branch-absolute to zero, the shape of a deliberately poisoned entry.&lt;br /&gt;
&lt;br /&gt;
This has the flavour of a fixup or relocation list applied after the segments are restored, but that is a guess from shape alone. It is recorded here because it is real, reproducible and unexplained, and because a parser that assumes the file ends with the payload will silently ignore it.&lt;br /&gt;
&lt;br /&gt;
== Open questions ==&lt;br /&gt;
* The purpose of the trailing page.&lt;br /&gt;
* The header bytes other than the eyecatcher, size field, release string and banner.&lt;br /&gt;
* The meaning of the segment attribute field&#039;s top 16 bits, which take values &amp;lt;code&amp;gt;0x0001&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;0x0040&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;0x0080&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;0x0100&amp;lt;/code&amp;gt; and correlate loosely with segment size.&lt;br /&gt;
* Names for the nine segments left blank in the table above.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[System Files:QFILEIML]]&lt;br /&gt;
* [[Data Structures:LID]]&lt;br /&gt;
* [[SRC]]&lt;br /&gt;
* [[CISC AS/400 LIC Tapes]]&lt;br /&gt;
&lt;br /&gt;
[[Category: System Internals]]&lt;br /&gt;
[[Category:AI generated not reviewed]]&lt;/div&gt;</summary>
		<author><name>PoC</name></author>
	</entry>
	<entry>
		<id>http://try-as400.pocnet.net/index.php?title=File_Formats:SAVF&amp;diff=1798</id>
		<title>File Formats:SAVF</title>
		<link rel="alternate" type="text/html" href="http://try-as400.pocnet.net/index.php?title=File_Formats:SAVF&amp;diff=1798"/>
		<updated>2026-08-16T19:07:34Z</updated>

		<summary type="html">&lt;p&gt;PoC: +cat&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;A &#039;&#039;&#039;SAVF&#039;&#039;&#039; (&#039;&#039;save file&#039;&#039;) is the container OS/400 and IBM i write with &amp;lt;code&amp;gt;SAVOBJ&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SAVLIB&amp;lt;/code&amp;gt;, and read back with &amp;lt;code&amp;gt;RSTOBJ&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;RSTLIB&amp;lt;/code&amp;gt;. It holds Machine Interface objects — programs, files, data areas, libraries — in the form they have on disk, together with a catalogue describing what was saved and from which machine.&lt;br /&gt;
&lt;br /&gt;
Understanding the format is useful well beyond restoring a save file on a machine. It is the only practical way to get at the bytes of an MI object &#039;&#039;offline&#039;&#039;: the same byte stream also appears inside optical images and tape images, so a distribution medium, a PTF, or a backup is an extractable archive of real MI objects. What can be done with one once it is extracted is described in [[File Formats:PGM]] for programs.&lt;br /&gt;
&lt;br /&gt;
Everything below is big endian, and every text field is EBCDIC.&lt;br /&gt;
&lt;br /&gt;
== Three layers ==&lt;br /&gt;
It helps to separate three things that are often run together:&lt;br /&gt;
&lt;br /&gt;
* the &#039;&#039;&#039;chunk&#039;&#039;&#039; layer, which wraps the save stream in 528-byte units with a checksum on each;&lt;br /&gt;
* the &#039;&#039;&#039;item&#039;&#039;&#039; layer, which is a chain of saved objects, each a 512-byte descriptor followed by that object&#039;s segments;&lt;br /&gt;
* the &#039;&#039;&#039;catalogue&#039;&#039;&#039;, a single special item per save that lists the library and its objects.&lt;br /&gt;
&lt;br /&gt;
Only the chunk layer is specific to a save file held in &amp;lt;code&amp;gt;QSYS&amp;lt;/code&amp;gt;. When the same save is carried on optical or tape media, the chunk wrapper is absent and the item chain sits in the medium directly. A reader that separates the layers handles all three media with one item parser.&lt;br /&gt;
&lt;br /&gt;
== The chunk layer ==&lt;br /&gt;
A save file is exactly &#039;&#039;chunk count&#039;&#039; × 528 bytes. Chunk &#039;&#039;n&#039;&#039;, counting from zero, begins at file offset &amp;lt;code&amp;gt;n × 528&amp;lt;/code&amp;gt; and consists of 512 bytes of save-stream data followed by a 16-byte checksum. The logical save stream is the concatenation of the data halves, so translating a stream offset to a file offset is&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
file_offset = (stream_offset / 512) * 528 + (stream_offset % 512)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== File header ===&lt;br /&gt;
The first 512 bytes of the stream — which are also the data half of chunk 1 — describe the container.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Size&lt;br /&gt;
!Field&lt;br /&gt;
!Notes&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x00&amp;lt;/code&amp;gt;&lt;br /&gt;
|8&lt;br /&gt;
|MI creation timestamp&lt;br /&gt;
|Also the seed for every chunk checksum.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x08&amp;lt;/code&amp;gt;&lt;br /&gt;
|4&lt;br /&gt;
|Chunk count&lt;br /&gt;
|32-bit form.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x10&amp;lt;/code&amp;gt;&lt;br /&gt;
|8&lt;br /&gt;
|Machine type and model&lt;br /&gt;
|EBCDIC, model first: &amp;lt;code&amp;gt;42A 8286&amp;lt;/code&amp;gt; is an 8286-42A.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x30&amp;lt;/code&amp;gt;&lt;br /&gt;
|4&lt;br /&gt;
|Release level&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x34&amp;lt;/code&amp;gt;&lt;br /&gt;
|4&lt;br /&gt;
|Header length&lt;br /&gt;
|The first item starts here. Zero means 512.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x38&amp;lt;/code&amp;gt;&lt;br /&gt;
|8&lt;br /&gt;
|Chunk count&lt;br /&gt;
|64-bit form, used when the 32-bit field would overflow.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x40&amp;lt;/code&amp;gt;&lt;br /&gt;
|16&lt;br /&gt;
|Global checksum backup&lt;br /&gt;
|See below.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
A valid file satisfies &amp;lt;code&amp;gt;chunk count == file size / 528&amp;lt;/code&amp;gt;; anything else means truncation. Because the header is itself chunk 1, verifying its checksum is the cheapest reliable test of whether a file is a save file at all.&lt;br /&gt;
&lt;br /&gt;
=== The global checksum displaces real data ===&lt;br /&gt;
This is the trap worth knowing about before writing any extractor. The last 16 bytes of the &#039;&#039;logical&#039;&#039; stream, at &amp;lt;code&amp;gt;chunk count × 512 − 16&amp;lt;/code&amp;gt;, are overwritten with a whole-file checksum. The data bytes they replaced are preserved in the file header at &amp;lt;code&amp;gt;+0x40&amp;lt;/code&amp;gt;, and a reader must put them back. A reader that does not will silently corrupt the tail of the last object it extracts, in a way that no chunk checksum will catch, because the chunk checksums are computed over the overwritten bytes.&lt;br /&gt;
&lt;br /&gt;
=== The chunk checksum ===&lt;br /&gt;
Each chunk&#039;s 16-byte trailer is the chunk number, counting from one, as a 4-byte big-endian integer, followed by a 12-byte digest. The digest is two folding passes built from a single primitive:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
chkadd(a, b):          # b is exactly one byte longer than a&lt;br /&gt;
    b[1:] += a &amp;lt;&amp;lt; 1    # big-endian magnitudes, carry propagated&lt;br /&gt;
    b[0]  += carry + (the bit shifted out of the top of a)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The first pass takes the chunk number followed by the 512 data bytes and cuts them into eight parts of 61, 62, 63, 64, 65, 66, 67 and 68 bytes, then folds them in ascending order: &amp;lt;code&amp;gt;chkadd&amp;lt;/code&amp;gt; of the 61-byte part into the 62-byte part, that into the 63-byte part, and so on. The second pass takes the resulting 68 bytes, cuts them into parts of 5, 6, 7, 8, 9, 10, 11 and 12 bytes, and folds them the same way, leaving 12 bytes. The first 8 of those are then XORed with the file header&#039;s MI timestamp.&lt;br /&gt;
&lt;br /&gt;
There is one non-obvious detail. In both passes the parts are &#039;&#039;filled&#039;&#039; from the input in the order 61, 62, 63, 64, 65, 66, &#039;&#039;&#039;68, 67&#039;&#039;&#039; — and 5, 6, 7, 8, 9, 10, &#039;&#039;&#039;12, 11&#039;&#039;&#039; — while being &#039;&#039;folded&#039;&#039; in ascending order. An implementation that fills them in plain ascending order produces a plausible-looking wrong answer.&lt;br /&gt;
&lt;br /&gt;
The construction is a checksum, not a cryptographic hash. It detects media damage. It is not a tamper seal, and it carries no secret beyond a timestamp printed in the same header.&lt;br /&gt;
&lt;br /&gt;
== The item layer ==&lt;br /&gt;
Items are chained: parse the descriptor at the header length, add the item&#039;s computed length, repeat, and stop when the next item would begin past &amp;lt;code&amp;gt;(chunk count − 1) × 512&amp;lt;/code&amp;gt;. Every descriptor begins with &amp;lt;code&amp;gt;FFFFFFFF&amp;lt;/code&amp;gt;, which makes resynchronising after damage feasible.&lt;br /&gt;
&lt;br /&gt;
=== Item descriptor ===&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Size&lt;br /&gt;
!Field&lt;br /&gt;
!Notes&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x00&amp;lt;/code&amp;gt;&lt;br /&gt;
|4&lt;br /&gt;
|&amp;lt;code&amp;gt;FFFFFFFF&amp;lt;/code&amp;gt;&lt;br /&gt;
|Eyecatcher.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x04&amp;lt;/code&amp;gt;&lt;br /&gt;
|10&lt;br /&gt;
|Object name&lt;br /&gt;
|EBCDIC. Replaced by a file ID for integrated file system objects.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x0E&amp;lt;/code&amp;gt;&lt;br /&gt;
|20&lt;br /&gt;
|Member name&lt;br /&gt;
|Empty unless the object has members.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x22&amp;lt;/code&amp;gt;&lt;br /&gt;
|2&lt;br /&gt;
|MI object type&lt;br /&gt;
|The same code space used throughout the machine: &amp;lt;code&amp;gt;0x0201&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;*PGM&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;0x0401&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;*LIB&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;0x1901&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;*FILE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;0x19DB&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;*SRDS&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x24&amp;lt;/code&amp;gt;&lt;br /&gt;
|1&lt;br /&gt;
|Flags&lt;br /&gt;
|Bit &amp;lt;code&amp;gt;0x40&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;0x80&amp;lt;/code&amp;gt; means the item is an IFS object.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x25&amp;lt;/code&amp;gt;&lt;br /&gt;
|3&lt;br /&gt;
|Catalogue offset&lt;br /&gt;
|Where this object&#039;s entry sits inside the catalogue.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x44&amp;lt;/code&amp;gt;&lt;br /&gt;
|4&lt;br /&gt;
|Header occupation&lt;br /&gt;
|Bytes of the descriptor page actually used.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x48&amp;lt;/code&amp;gt;&lt;br /&gt;
|4&lt;br /&gt;
|Stored length&lt;br /&gt;
|In 512-byte units, minus one.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x54&amp;lt;/code&amp;gt;&lt;br /&gt;
|2&lt;br /&gt;
|Release created for&lt;br /&gt;
|Governs the section-entry layout below.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x56&amp;lt;/code&amp;gt;&lt;br /&gt;
|4&lt;br /&gt;
|Metadata length&lt;br /&gt;
|For a catalogue item, the size of the catalogue.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x64&amp;lt;/code&amp;gt;&lt;br /&gt;
|4&lt;br /&gt;
|Section count&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0xC0&amp;lt;/code&amp;gt;&lt;br /&gt;
|8&lt;br /&gt;
|Save timestamp&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0xCC&amp;lt;/code&amp;gt;&lt;br /&gt;
|4&lt;br /&gt;
|Total length&lt;br /&gt;
|In 512-byte units.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0xD4&amp;lt;/code&amp;gt;&lt;br /&gt;
|4&lt;br /&gt;
|Data length&lt;br /&gt;
|In 512-byte units. Always the total length less 4096 bytes.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x100&amp;lt;/code&amp;gt;&lt;br /&gt;
|14 × 8&lt;br /&gt;
|Pointer array&lt;br /&gt;
|See below.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x170&amp;lt;/code&amp;gt;&lt;br /&gt;
|8&lt;br /&gt;
|Packed length&lt;br /&gt;
|Stored as the length less 512.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The pointer array holds single-level store addresses, but only the low 24 bits matter: they are an offset into the item, biased by 4096, so &amp;lt;code&amp;gt;(pointer &amp;amp;amp; 0xFFFFFF) − 4096&amp;lt;/code&amp;gt; gives an offset within the descriptor page. Index 1 locates the section length table and index 8 the section type table.&lt;br /&gt;
&lt;br /&gt;
=== Sections ===&lt;br /&gt;
A saved MI object is a set of segments, and each segment is one &#039;&#039;section&#039;&#039; of the item. Sections start at the first 4096-byte boundary after the descriptor and run consecutively, which is why the data length is always the total length less one page.&lt;br /&gt;
&lt;br /&gt;
The length table has one entry per section. On any modern release — when the &#039;&#039;release created for&#039;&#039; field exceeds 32 — an entry is 16 bytes: capacity, length, and the segment&#039;s single-level store address. Older saves use a 10-byte entry with a shifted 6-byte address and no separate length.&lt;br /&gt;
&lt;br /&gt;
The type table has one 8-byte entry per section, of which the first halfword is the segment type. This is the &#039;&#039;&#039;same value as the first halfword of the segment&#039;s own segment header&#039;&#039;&#039;, which is a useful consistency check when extracting: the item&#039;s idea of what a section is must agree with the segment&#039;s own.&lt;br /&gt;
&lt;br /&gt;
=== Item length and compression ===&lt;br /&gt;
An uncompressed item occupies its stored length. A packed item records a non-zero packed length, and the writer then realigns the following item on the enclosing 512-byte boundary, so the step from one item to the next is&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if packed == 512:        step = stored&lt;br /&gt;
elif packed &amp;gt; stored:    step = packed&lt;br /&gt;
else:&lt;br /&gt;
    slack  = stored - packed&lt;br /&gt;
    within = item_offset % 512&lt;br /&gt;
    if within == 0:      step = stored&lt;br /&gt;
    elif within &amp;lt; slack: step = packed + slack - within&lt;br /&gt;
    else:                step = stored + 512 - within&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The compression method is identifiable from the first six bytes of the packed data, which are EBCDIC eyecatchers:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Bytes&lt;br /&gt;
!EBCDIC&lt;br /&gt;
!&amp;lt;code&amp;gt;DTACPR&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;D3C46DE3D9E2&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;LD_TRS&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;*MEDIUM&amp;lt;/code&amp;gt;, the TERSE algorithm&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;D3C46DD3E9F1&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;LD_LZ1&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;*HIGH&amp;lt;/code&amp;gt;, IBM&#039;s LZ1&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;D3C46DE9D3C2&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;LD_ZLB&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;*ZLIB&amp;lt;/code&amp;gt;; the deflate stream begins 12 bytes in&lt;br /&gt;
|-&lt;br /&gt;
|none&lt;br /&gt;
|&lt;br /&gt;
|&amp;lt;code&amp;gt;*LOW&amp;lt;/code&amp;gt;, an SNA-style run-length scheme, recognisable only by decoding it&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Note that these are &#039;&#039;not&#039;&#039; the compression used for a compressed LID payload; see [[Data Structures:LID]], where all four of these were tried and rejected.&lt;br /&gt;
&lt;br /&gt;
== The catalogue ==&lt;br /&gt;
Every save writes one save/restore descriptor space item, MI type &amp;lt;code&amp;gt;0x19DB&amp;lt;/code&amp;gt;, named &amp;lt;code&amp;gt;QSRDSSPC.&#039;&#039;n&#039;&#039;&amp;lt;/code&amp;gt;, ahead of the objects it describes. Items named &amp;lt;code&amp;gt;QSR.ADDITIONAL_INFO.*&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;QSRDSSPC.EA&amp;amp;nbsp;SRD*&amp;lt;/code&amp;gt; are continuation blocks belonging to the preceding descriptor, not new saves.&lt;br /&gt;
&lt;br /&gt;
The catalogue itself is the &#039;&#039;&#039;last&#039;&#039;&#039; &#039;&#039;metadata length&#039;&#039; bytes of that item&#039;s data. Its first byte is the save command, and that selects the shape: a library save has the layout below, while a save of the integrated file system produces a different, tree-structured descriptor.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Size&lt;br /&gt;
!Field&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x00&amp;lt;/code&amp;gt;&lt;br /&gt;
|1&lt;br /&gt;
|Save command&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x01&amp;lt;/code&amp;gt;&lt;br /&gt;
|1&lt;br /&gt;
|Target release&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x02&amp;lt;/code&amp;gt;&lt;br /&gt;
|30&lt;br /&gt;
|Saved library name&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x20&amp;lt;/code&amp;gt;&lt;br /&gt;
|2&lt;br /&gt;
|Base object type, &amp;lt;code&amp;gt;0x0401&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x22&amp;lt;/code&amp;gt;&lt;br /&gt;
|8&lt;br /&gt;
|Save timestamp&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x2A&amp;lt;/code&amp;gt;&lt;br /&gt;
|4&lt;br /&gt;
|Object count&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x34&amp;lt;/code&amp;gt;&lt;br /&gt;
|8&lt;br /&gt;
|System serial number&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x3C&amp;lt;/code&amp;gt;&lt;br /&gt;
|2&lt;br /&gt;
|ASP number&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x3E&amp;lt;/code&amp;gt;&lt;br /&gt;
|10&lt;br /&gt;
|Create authority&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x4C&amp;lt;/code&amp;gt;&lt;br /&gt;
|1&lt;br /&gt;
|Save-while-active indicator&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x50&amp;lt;/code&amp;gt;&lt;br /&gt;
|10&lt;br /&gt;
|ASP name, target release 66 and later only&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Object descriptors follow, at &amp;lt;code&amp;gt;+0x50&amp;lt;/code&amp;gt; or at &amp;lt;code&amp;gt;+0x70&amp;lt;/code&amp;gt; when the ASP name is present. Each is 151 bytes on target release 49 and later, and 87 bytes before that. The first fields are the object name at &amp;lt;code&amp;gt;+0x00&amp;lt;/code&amp;gt; for 30 bytes, the MI object type at &amp;lt;code&amp;gt;+0x1E&amp;lt;/code&amp;gt;, and the owning user profile at &amp;lt;code&amp;gt;+0x20&amp;lt;/code&amp;gt; for 10 bytes. The size is a 4-byte field at &amp;lt;code&amp;gt;+0x43&amp;lt;/code&amp;gt;, multiplied by a second 4-byte field at &amp;lt;code&amp;gt;+0x79&amp;lt;/code&amp;gt; when that is non-zero. The remainder of the descriptor holds offsets, into the same buffer, of chains of length-prefixed records carrying the object&#039;s text description, service description, usage information, work-unit references and user information.&lt;br /&gt;
&lt;br /&gt;
Worth noticing for its own sake: the catalogue records the &#039;&#039;&#039;serial number of the machine that produced the save&#039;&#039;&#039;. A save file is not anonymous.&lt;br /&gt;
&lt;br /&gt;
== Practical consequences ==&lt;br /&gt;
* Any MI object can be lifted out of a save file byte for byte, with its segments separated and their segment identifiers intact. That is what makes offline analysis of a program object possible without console access to a machine and without printing a storage dump.&lt;br /&gt;
* Verifying the chunk checksums is a genuine integrity check on an archived save file, and can be done without a machine.&lt;br /&gt;
* The item chain and the catalogue are independent descriptions of the same set of objects. Where they disagree, the file has been damaged or truncated.&lt;br /&gt;
* Because the chunk layer is only present for a save file held in &amp;lt;code&amp;gt;QSYS&amp;lt;/code&amp;gt;, a save carved out of an optical or tape image is parsed by the same code with the chunk translation switched off.&lt;br /&gt;
&lt;br /&gt;
== Scope of this description ==&lt;br /&gt;
The layout was mapped with reference to jSAVF, an independently developed third-party reader, and then verified field by field against a real V7R4 save file. Where an object in that file also had a printed Display/Alter/Dump available, the bytes extracted here matched the printout exactly. The chunk checksum was reimplemented from scratch and verifies every chunk of the test file.&lt;br /&gt;
&lt;br /&gt;
Not established: the meaning of the 4-byte field at &amp;lt;code&amp;gt;+0x0C&amp;lt;/code&amp;gt; of the file header, the layout of the integrated file system catalogue, and the LZ1 and TERSE decompressors.&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [https://www.anerty.net/software/file/jSAVF/?lang=en jSAVF] — a maintained third-party reader for save files, and the starting point for the layout described here.&lt;br /&gt;
&lt;br /&gt;
[[Category: System Internals]]&lt;br /&gt;
[[Category:AI generated not reviewed]]&lt;/div&gt;</summary>
		<author><name>PoC</name></author>
	</entry>
	<entry>
		<id>http://try-as400.pocnet.net/index.php?title=File_Formats:PGM&amp;diff=1797</id>
		<title>File Formats:PGM</title>
		<link rel="alternate" type="text/html" href="http://try-as400.pocnet.net/index.php?title=File_Formats:PGM&amp;diff=1797"/>
		<updated>2026-08-16T19:07:22Z</updated>

		<summary type="html">&lt;p&gt;PoC: /* See also */ +cat&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;A &#039;&#039;&#039;&amp;lt;code&amp;gt;*PGM&amp;lt;/code&amp;gt;&#039;&#039;&#039; is a Machine Interface &#039;&#039;program object&#039;&#039;. It is not a file with a text section and a symbol table. It is a set of single-level store &#039;&#039;&#039;segments&#039;&#039;&#039;, chained together by 8-byte SLS pointers, with the executable instructions embedded in the first segment among the metadata that describes them.&lt;br /&gt;
&lt;br /&gt;
This page describes enough of that structure to walk a program object offline — that is, without a console session and without printing a storage dump for every object of interest. The bytes can come from a [[File Formats:SAVF|save file]], which makes any distribution medium, PTF or backup a source of real program objects to examine.&lt;br /&gt;
&lt;br /&gt;
Everything below is big endian, and text fields are EBCDIC.&lt;br /&gt;
&lt;br /&gt;
== Addressing ==&lt;br /&gt;
Pointers are 8 bytes: a 40-bit segment identifier in the high bits and a 24-bit offset in the low bits, so a segment is 16&amp;amp;thinsp;MiB. This is the same split used throughout the machine, including by the DST &#039;&#039;Display/Alter storage&#039;&#039; panel and by the SLS address field of a [[Data Structures:LID|LID]] directory record.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
segment = pointer &amp;gt;&amp;gt; 24&lt;br /&gt;
offset  = pointer &amp;amp; 0xFFFFFF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
An all-zero pointer means the object has no data for that structure. That is precisely what the &amp;lt;code&amp;gt;###INFO: OBJECT DOES NOT CONTAIN DATA FOR THIS SECTION&amp;lt;/code&amp;gt; line in a Display/Alter/Dump printout is reporting.&lt;br /&gt;
&lt;br /&gt;
Some fields are not pointers but &#039;&#039;&#039;&amp;lt;code&amp;gt;SEGOFF&amp;lt;/code&amp;gt;&#039;&#039;&#039; pairs: a 4-byte segment &#039;&#039;index&#039;&#039;, counting from one into the object&#039;s own segment table, followed by a 4-byte offset. These appear where a genuine pointer would have to be relocated when the object moves.&lt;br /&gt;
&lt;br /&gt;
The segments of one program have unrelated segment identifiers. A decoder therefore needs the whole set: a single segment cannot resolve its own pointers.&lt;br /&gt;
&lt;br /&gt;
== Segments ==&lt;br /&gt;
A single-module bound program typically has four segments, distinguished by the type field in each segment&#039;s own header:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Type&lt;br /&gt;
!Role&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;0x0001&amp;lt;/code&amp;gt;&lt;br /&gt;
|The program object proper: all headers, tables, and the instruction stream.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;0x0022&amp;lt;/code&amp;gt;&lt;br /&gt;
|Module constants and the module string directory.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;0x0018&amp;lt;/code&amp;gt;&lt;br /&gt;
|Static storage.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;0x0028&amp;lt;/code&amp;gt;&lt;br /&gt;
|Trace-back and mapping data.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Note that a program&#039;s segment table records a segment &#039;&#039;use&#039;&#039; code, while each segment&#039;s own header records a &#039;&#039;type&#039;&#039;. They are different numberings and should not be conflated.&lt;br /&gt;
&lt;br /&gt;
=== Segment header ===&lt;br /&gt;
Every MI segment opens with a header, called &amp;lt;code&amp;gt;YYSGHDR&amp;lt;/code&amp;gt; in IBM&#039;s own dump formatting.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Size&lt;br /&gt;
!Field&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x00&amp;lt;/code&amp;gt;&lt;br /&gt;
|2&lt;br /&gt;
|Segment type&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x02&amp;lt;/code&amp;gt;&lt;br /&gt;
|2&lt;br /&gt;
|Size, in 512-byte units&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x04&amp;lt;/code&amp;gt;&lt;br /&gt;
|1&lt;br /&gt;
|New flags&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x05&amp;lt;/code&amp;gt;&lt;br /&gt;
|1&lt;br /&gt;
|Flags&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x08&amp;lt;/code&amp;gt;&lt;br /&gt;
|8&lt;br /&gt;
|Address of the owning object&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x18&amp;lt;/code&amp;gt;&lt;br /&gt;
|8&lt;br /&gt;
|Space address&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Object header ===&lt;br /&gt;
Immediately after it, at &amp;lt;code&amp;gt;+0x20&amp;lt;/code&amp;gt; of the first segment, sits the object header, &amp;lt;code&amp;gt;YYEPAHDR&amp;lt;/code&amp;gt;. Offsets below are relative to it.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Size&lt;br /&gt;
!Field&lt;br /&gt;
!Notes&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x02&amp;lt;/code&amp;gt;&lt;br /&gt;
|1&lt;br /&gt;
|MI object type&lt;br /&gt;
|Together with the next byte, &amp;lt;code&amp;gt;0x0201&amp;lt;/code&amp;gt; for a program.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x03&amp;lt;/code&amp;gt;&lt;br /&gt;
|1&lt;br /&gt;
|MI object subtype&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x04&amp;lt;/code&amp;gt;&lt;br /&gt;
|30&lt;br /&gt;
|Object name&lt;br /&gt;
|EBCDIC.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x24&amp;lt;/code&amp;gt;&lt;br /&gt;
|4&lt;br /&gt;
|Space size&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x30&amp;lt;/code&amp;gt;&lt;br /&gt;
|8&lt;br /&gt;
|Creation timestamp&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x38&amp;lt;/code&amp;gt;&lt;br /&gt;
|8&lt;br /&gt;
|Owning user profile&lt;br /&gt;
|A pointer to the profile object.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x48&amp;lt;/code&amp;gt;&lt;br /&gt;
|8&lt;br /&gt;
|Context&lt;br /&gt;
|That is, the library.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x50&amp;lt;/code&amp;gt;&lt;br /&gt;
|8&lt;br /&gt;
|Object space&lt;br /&gt;
|&#039;&#039;&#039;The pointer to the program header.&#039;&#039;&#039; Everything else hangs off this.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x5A&amp;lt;/code&amp;gt;&lt;br /&gt;
|2&lt;br /&gt;
|ASP&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x60&amp;lt;/code&amp;gt;&lt;br /&gt;
|8&lt;br /&gt;
|Last-modified timestamp&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The type and subtype pair uses the same code space as the item descriptors in a save file, so one table of MI type codes serves both.&lt;br /&gt;
&lt;br /&gt;
== The program header ==&lt;br /&gt;
Found through the object header&#039;s object-space pointer; in practice it sits at offset &amp;lt;code&amp;gt;0x1000&amp;lt;/code&amp;gt; of the first segment.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Size&lt;br /&gt;
!Field&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x00&amp;lt;/code&amp;gt;&lt;br /&gt;
|8&lt;br /&gt;
|Program attributes&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x08&amp;lt;/code&amp;gt;&lt;br /&gt;
|8&lt;br /&gt;
|Pointer to the version table&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x10&amp;lt;/code&amp;gt;&lt;br /&gt;
|8&lt;br /&gt;
|Pointer to the segment table&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x18&amp;lt;/code&amp;gt;&lt;br /&gt;
|8&lt;br /&gt;
|Pointer to the activation header&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x20&amp;lt;/code&amp;gt;&lt;br /&gt;
|8&lt;br /&gt;
|Pointer to the signature table&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x28&amp;lt;/code&amp;gt;&lt;br /&gt;
|8&lt;br /&gt;
|Pointer to the program string directory&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x30&amp;lt;/code&amp;gt;&lt;br /&gt;
|8&lt;br /&gt;
|Pointer to activation group information&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x40&amp;lt;/code&amp;gt;&lt;br /&gt;
|8&lt;br /&gt;
|Activation start&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x48&amp;lt;/code&amp;gt;&lt;br /&gt;
|8&lt;br /&gt;
|Activation end&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x50&amp;lt;/code&amp;gt;&lt;br /&gt;
|8&lt;br /&gt;
|&#039;&#039;&#039;Activation and PEP end&#039;&#039;&#039; — the last byte of the code&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x58&amp;lt;/code&amp;gt;&lt;br /&gt;
|2&lt;br /&gt;
|Flags&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x5C&amp;lt;/code&amp;gt;&lt;br /&gt;
|2&lt;br /&gt;
|Program state&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x90&amp;lt;/code&amp;gt;&lt;br /&gt;
|1&lt;br /&gt;
|Program type&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x94&amp;lt;/code&amp;gt;&lt;br /&gt;
|4&lt;br /&gt;
|Program entry procedure module number&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x9C&amp;lt;/code&amp;gt;&lt;br /&gt;
|4&lt;br /&gt;
|Program entry procedure string ID&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0xA0&amp;lt;/code&amp;gt;&lt;br /&gt;
|2&lt;br /&gt;
|Minimum parameters&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0xA2&amp;lt;/code&amp;gt;&lt;br /&gt;
|2&lt;br /&gt;
|Maximum parameters&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0xD0&amp;lt;/code&amp;gt;&lt;br /&gt;
|8&lt;br /&gt;
|Pointer to the program header extension&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0xD8&amp;lt;/code&amp;gt;&lt;br /&gt;
|8&lt;br /&gt;
|Pointer to the trace-back locator&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0xE0&amp;lt;/code&amp;gt;&lt;br /&gt;
|8&lt;br /&gt;
|Pointer to the module table&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0xE8&amp;lt;/code&amp;gt;&lt;br /&gt;
|8&lt;br /&gt;
|Pointer to observability information&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0xF0&amp;lt;/code&amp;gt;&lt;br /&gt;
|8&lt;br /&gt;
|Pointer to the maintenance header&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The header extension adds a pointer to the GLU code list, &amp;lt;code&amp;gt;SEGOFF&amp;lt;/code&amp;gt; pairs for the program history and the segment table extension, and a 16-byte hardware feature set at &amp;lt;code&amp;gt;+0x50&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Version table ===&lt;br /&gt;
Forty bytes of packed version-release-modification halfwords, where &amp;lt;code&amp;gt;0x0740&amp;lt;/code&amp;gt; reads as V7R4M0. Among them are the binder&#039;s internal and MI levels at &amp;lt;code&amp;gt;+0x02&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;+0x04&amp;lt;/code&amp;gt;, the &#039;&#039;&#039;target&#039;&#039;&#039; release at &amp;lt;code&amp;gt;+0x06&amp;lt;/code&amp;gt;, the &#039;&#039;&#039;created-on&#039;&#039;&#039; release at &amp;lt;code&amp;gt;+0x08&amp;lt;/code&amp;gt;, the language release at &amp;lt;code&amp;gt;+0x10&amp;lt;/code&amp;gt;, the CCSID at &amp;lt;code&amp;gt;+0x1E&amp;lt;/code&amp;gt; and the low and high optimisation levels at &amp;lt;code&amp;gt;+0x20&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;+0x22&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The target and created-on values here are what decide whether an object will restore onto a given release, so they are worth reading before attempting a restore that might fail.&lt;br /&gt;
&lt;br /&gt;
=== Segment table ===&lt;br /&gt;
A header of allocated size, entry count and version, then the entries beginning at &amp;lt;code&amp;gt;+0x10&amp;lt;/code&amp;gt;. &#039;&#039;&#039;Entries are a fixed 48 bytes&#039;&#039;&#039;; the size field is the allocation, not header plus count times entry, so deriving the stride from it gives the wrong answer.&lt;br /&gt;
&lt;br /&gt;
Each entry holds the segment address at &amp;lt;code&amp;gt;+0x00&amp;lt;/code&amp;gt;, a limbo address at &amp;lt;code&amp;gt;+0x08&amp;lt;/code&amp;gt;, a declared page count at &amp;lt;code&amp;gt;+0x10&amp;lt;/code&amp;gt;, and a one-byte &#039;&#039;segment use&#039;&#039; at &amp;lt;code&amp;gt;+0x12&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;0x01&amp;lt;/code&amp;gt; static storage, &amp;lt;code&amp;gt;0x02&amp;lt;/code&amp;gt; the program object, &amp;lt;code&amp;gt;0x04&amp;lt;/code&amp;gt; constants, &amp;lt;code&amp;gt;0x06&amp;lt;/code&amp;gt; trace-back.&lt;br /&gt;
&lt;br /&gt;
A parallel &#039;&#039;segment table extension&#039;&#039;, reached by a &amp;lt;code&amp;gt;SEGOFF&amp;lt;/code&amp;gt; in the program header extension, records how much of each segment is actually used as opposed to allocated. Its entries begin at &amp;lt;code&amp;gt;+0x18&amp;lt;/code&amp;gt; and are 24 bytes, of which the first four are the byte count.&lt;br /&gt;
&lt;br /&gt;
=== Activation header ===&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Size&lt;br /&gt;
!Field&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x00&amp;lt;/code&amp;gt;&lt;br /&gt;
|8&lt;br /&gt;
|&#039;&#039;&#039;Program entry procedure entry point&#039;&#039;&#039; — the first instruction&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x08&amp;lt;/code&amp;gt;&lt;br /&gt;
|4&lt;br /&gt;
|PBV size&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x10&amp;lt;/code&amp;gt;&lt;br /&gt;
|8&lt;br /&gt;
|Pointer to the PBV relocation array&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x18&amp;lt;/code&amp;gt;&lt;br /&gt;
|8&lt;br /&gt;
|Pointer to the static PBV array&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x20&amp;lt;/code&amp;gt;&lt;br /&gt;
|4&lt;br /&gt;
|PBV relocation count&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x24&amp;lt;/code&amp;gt;&lt;br /&gt;
|4&lt;br /&gt;
|Dependent service program count&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x28&amp;lt;/code&amp;gt;&lt;br /&gt;
|8&lt;br /&gt;
|Pointer to the dependent service program array&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x4C&amp;lt;/code&amp;gt;&lt;br /&gt;
|4&lt;br /&gt;
|Constant frame count&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x50&amp;lt;/code&amp;gt;&lt;br /&gt;
|8&lt;br /&gt;
|Pointer to the constant frame definition array&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x58&amp;lt;/code&amp;gt;&lt;br /&gt;
|8&lt;br /&gt;
|Pointer to the program export array&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x60&amp;lt;/code&amp;gt;&lt;br /&gt;
|4&lt;br /&gt;
|Export count&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For a bound program with no exports most of these are zero. For a service program they are the published interface, and the dependent service program array is the object&#039;s dependency list — which makes it possible to work out what a program binds to without a machine to run &amp;lt;code&amp;gt;DSPPGM&amp;lt;/code&amp;gt; on.&lt;br /&gt;
&lt;br /&gt;
=== Maintenance header ===&lt;br /&gt;
Holds the copyright list size and count and a &amp;lt;code&amp;gt;SEGOFF&amp;lt;/code&amp;gt; to the copyright text — a 4-byte length followed by EBCDIC — along with &amp;lt;code&amp;gt;SEGOFF&amp;lt;/code&amp;gt; pairs for the external object list, static activation and export information, the last non-observable segment and size, and the lowest and highest PBV identifiers.&lt;br /&gt;
&lt;br /&gt;
== Modules ==&lt;br /&gt;
The module table has the same shape as the segment table: header, then 48-byte entries from &amp;lt;code&amp;gt;+0x10&amp;lt;/code&amp;gt;, each giving a pointer to a module header, a module domain and a module subtype.&lt;br /&gt;
&lt;br /&gt;
A module header is a long run of pointers: to the program header it belongs to, the copyright table, the module version table, binding information, static information, the end-of-line table, observability information, the module string directory, the entry point table, the VLIC table, the procedure table, module constants, and the module header extension. It also carries the module type at &amp;lt;code&amp;gt;+0x01&amp;lt;/code&amp;gt; — &amp;lt;code&amp;gt;0x01&amp;lt;/code&amp;gt; for OPM and &amp;lt;code&amp;gt;0x03&amp;lt;/code&amp;gt; for ILE — the module attributes at &amp;lt;code&amp;gt;+0xA8&amp;lt;/code&amp;gt;, and the program entry procedure&#039;s dictionary ID, string ID, procedure number and parameter counts from &amp;lt;code&amp;gt;+0xAC&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;+0xBC&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Two of its pointers characteristically leave the program segment: the module string directory and the module constants both live in the &amp;lt;code&amp;gt;0x0022&amp;lt;/code&amp;gt; segment. When hunting for literal data referenced by the code — message identifiers, format names, table constants — that is the segment to search, and these two pointers give its exact extent.&lt;br /&gt;
&lt;br /&gt;
=== Module version table ===&lt;br /&gt;
This is the most immediately informative structure in the whole object.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Size&lt;br /&gt;
!Field&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x02&amp;lt;/code&amp;gt;&lt;br /&gt;
|2&lt;br /&gt;
|Language release&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x0A&amp;lt;/code&amp;gt;&lt;br /&gt;
|2&lt;br /&gt;
|Instruction release&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x0C&amp;lt;/code&amp;gt;&lt;br /&gt;
|2&lt;br /&gt;
|Target release&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x0E&amp;lt;/code&amp;gt;&lt;br /&gt;
|2&lt;br /&gt;
|Created-on release&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x10&amp;lt;/code&amp;gt;&lt;br /&gt;
|2&lt;br /&gt;
|Optimisation level&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x14&amp;lt;/code&amp;gt;&lt;br /&gt;
|30&lt;br /&gt;
|Source module name&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x32&amp;lt;/code&amp;gt;&lt;br /&gt;
|30&lt;br /&gt;
|Source module qualifier&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x50&amp;lt;/code&amp;gt;&lt;br /&gt;
|20&lt;br /&gt;
|Compiler name&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+0x64&amp;lt;/code&amp;gt;&lt;br /&gt;
|2&lt;br /&gt;
|Earliest compiler release&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Read the compiler name before spending any time on a disassembly. A module reporting &amp;lt;code&amp;gt;MX CONVERTED&amp;lt;/code&amp;gt; was &#039;&#039;translated&#039;&#039; from an older object rather than compiled from source at this release, and the generated code will not resemble what a current compiler emits.&lt;br /&gt;
&lt;br /&gt;
== The instruction stream ==&lt;br /&gt;
The code is a single contiguous run inside the first segment, bounded by two fields already listed above:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
start = activation header, program entry procedure entry point&lt;br /&gt;
end   = program header, activation and PEP end        (inclusive)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It is 64-bit big-endian &#039;&#039;&#039;PowerPC AS&#039;&#039;&#039;. A stock disassembler invoked as &amp;lt;code&amp;gt;objdump -D -b binary -m powerpc:common64 -EB&amp;lt;/code&amp;gt;, with the load address adjusted to the start offset, will produce a listing whose addresses line up with anything printed by Display/Alter/Dump.&lt;br /&gt;
&lt;br /&gt;
Two caveats apply, and both matter.&lt;br /&gt;
&lt;br /&gt;
PowerPC AS is not plain PowerPC. The tagged-pointer instructions and other AS-only operations have no encoding in a stock PowerPC disassembler and will appear as invalid, or worse, as an unrelated mnemonic that looks plausible. Treat such a listing as a starting point rather than as authority.&lt;br /&gt;
&lt;br /&gt;
The run is also not pure code. Trace-back tables and constants are interleaved with instructions, so a linear sweep will decode data as code somewhere. For an object that still has its observability information, the trace-back locator and the module tables provide the boundaries needed to separate the two; for an object whose observability has been removed, they do not, and the separation has to be inferred from the code itself.&lt;br /&gt;
&lt;br /&gt;
== Scope of this description ==&lt;br /&gt;
Field offsets were derived by lining a printed Display/Alter/Dump of a program object up against the same object&#039;s bytes extracted from a save file, and then checked by decoding the object independently and comparing every field against the printout. Structures that the dump prints but that were empty in the object used — the signature table, the export and import arrays, the service program tables and the secondary entry point table — are located by pointer but their contents are not described here; establishing those needs a service program to work from.&lt;br /&gt;
&lt;br /&gt;
Only &amp;lt;code&amp;gt;*PGM&amp;lt;/code&amp;gt; is covered. &amp;lt;code&amp;gt;*SRVPGM&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;*MODULE&amp;lt;/code&amp;gt; share much of this layout but have additional tables of their own.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[File Formats:SAVF]] — how to get a program object&#039;s bytes off a machine or out of a distribution medium&lt;br /&gt;
* [[Data Structures:LID]] — the same single-level store address split, in a different container&lt;br /&gt;
&lt;br /&gt;
[[Category: System Internals]]&lt;br /&gt;
[[Category:AI generated not reviewed]]&lt;/div&gt;</summary>
		<author><name>PoC</name></author>
	</entry>
	<entry>
		<id>http://try-as400.pocnet.net/index.php?title=Reverse_engineering_SLIC&amp;diff=1796</id>
		<title>Reverse engineering SLIC</title>
		<link rel="alternate" type="text/html" href="http://try-as400.pocnet.net/index.php?title=Reverse_engineering_SLIC&amp;diff=1796"/>
		<updated>2026-08-16T19:06:58Z</updated>

		<summary type="html">&lt;p&gt;PoC: /* See also */ +cat&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Reverse engineering &#039;&#039;&#039;SLIC&#039;&#039;&#039; — the Licensed Internal Code below the Machine Interface — is mostly a problem of turning addresses into names and getting bytes off the machine. This article collects the techniques that work, in the order you would actually use them, and the traps that cost the most time.&lt;br /&gt;
&lt;br /&gt;
It assumes access to a machine&#039;s DST or SST service tools, and installation media or a SAVSYS for offline work.&lt;br /&gt;
&lt;br /&gt;
== Start with the machine&#039;s own link map ==&lt;br /&gt;
Before writing any tooling, get the &#039;&#039;&#039;SLIC link map&#039;&#039;&#039; from the machine. It is reached through Display/Alter/Dump and can be printed to a spooled file, then exported.&lt;br /&gt;
&lt;br /&gt;
The printed format is one row per module:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
NICKNAME    ADDRESS(10+6)   PART NAME    VERSION RELEASE  REL DATE/TIME  INST DATE/TIME&lt;br /&gt;
###FLITE    FFFFFFFFF4 C29820   SRVC_MACRO_FLIGHTLOG   0007 0400 20190217 094024 ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A V7R4 machine yields around 21,000 distinct modules. This single artefact answers &amp;quot;what is at this address&amp;quot; and &amp;quot;where is this module&amp;quot; authoritatively, for that machine, and it is the first thing to obtain.&lt;br /&gt;
&lt;br /&gt;
Two properties make it more useful than it first appears:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;The spacing between consecutive entries equals the module&#039;s text length.&#039;&#039;&#039; Verified against the lengths &#039;&#039;Find LIC Module&#039;&#039; reports — exact matches. So the map gives extents as well as bases, which means any address can be resolved to a module &#039;&#039;and&#039;&#039; an offset within it.&lt;br /&gt;
* &#039;&#039;&#039;Module names are stable across PTFs; addresses are not.&#039;&#039;&#039; Look modules up by name whenever possible.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&#039;&#039;&#039;Note!&#039;&#039;&#039; Part names are upper-cased in the printout but the &#039;&#039;Find LIC Module by name&#039;&#039; panel is &#039;&#039;&#039;case-sensitive&#039;&#039;&#039;. &amp;lt;code&amp;gt;IoHriTaggedVpd&amp;lt;/code&amp;gt; resolves; &amp;lt;code&amp;gt;IOHRITAGGEDVPD&amp;lt;/code&amp;gt; does not. Take the spelling from the on-screen display, not the print.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Getting bytes off the machine ==&lt;br /&gt;
Display/Alter/Dump can print a storage range to a spooled file. Exported as PDF and run through &amp;lt;code&amp;gt;pdftotext -layout&amp;lt;/code&amp;gt;, each line is an address and 32 bytes:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   FFFFFFFFC5 943160     3C40CC4DFBC1FFF0 FBE1FFF87C0802A6   F8010028F821FF01  3C000010F8010008&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&#039;&#039;&#039;Note!&#039;&#039;&#039; The formatter &#039;&#039;&#039;collapses repeated lines&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        127 LINES    FFFFFFFF84 11B020   TO   FFFFFFFF84 11BFE0   SAME AS ABOVE&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
A naive parser silently sees a fraction of the data — in one case 44&amp;amp;thinsp;% of a 1&amp;amp;thinsp;MiB region — and reports no error. Any parser must expand these runs.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dumping a whole module at once is usually better than dumping the function you think you want: module extents are known from the link map, and the surrounding code frequently answers the next question.&lt;br /&gt;
&lt;br /&gt;
== Addresses ==&lt;br /&gt;
An SLS address is a &#039;&#039;&#039;40-bit segment identifier and a 24-bit offset&#039;&#039;&#039;, which is exactly how the &#039;&#039;Specify Address&#039;&#039; panel splits it, so segments are 16&amp;amp;thinsp;MiB.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Probe before dumping.&#039;&#039;&#039; Entering an address in an unmapped segment returns&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
80 exception, segment does not exist.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is a free existence oracle. But probe the &#039;&#039;&#039;address you actually care about&#039;&#039;&#039;, not offset zero of its segment — segments are sparsely populated, and offset 0 being unmapped says nothing about the rest. A segment can be mapped at &amp;lt;code&amp;gt;0x010000&amp;lt;/code&amp;gt; and raise the exception at &amp;lt;code&amp;gt;0x120000&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
For a mapped address, the &#039;&#039;&#039;ADDRESSINFO&#039;&#039;&#039; Advanced Analysis command reports the page-directory entry and hardware page-table entries, confirming backing and page size.&lt;br /&gt;
&lt;br /&gt;
=== Runtime and staged addresses differ ===&lt;br /&gt;
The same module may appear at one address in the link map and another as its runtime text. Where these differ, &#039;&#039;&#039;module-relative offsets are stable&#039;&#039;&#039;: a symbol at &amp;lt;code&amp;gt;+0x26d0&amp;lt;/code&amp;gt; in the staged image is at &amp;lt;code&amp;gt;+0x26d0&amp;lt;/code&amp;gt; in the runtime image. Deriving runtime addresses this way works reliably; assuming a constant delta between two images does not.&lt;br /&gt;
&lt;br /&gt;
== Names from the code ==&lt;br /&gt;
Two structures let a container image be turned into a link map offline.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Traceback trailers.&#039;&#039;&#039; Every compilation unit ends with a &amp;lt;code&amp;gt;TBTB&amp;lt;/code&amp;gt; eyecatcher (&amp;lt;code&amp;gt;E3C2E3C2&amp;lt;/code&amp;gt;) followed by a pointer to a descriptor. A trailer covers a whole compilation unit, so it localises rather than pinpoints — and a forward scan for &amp;quot;the next trailer&amp;quot; will silently attribute a &#039;&#039;later&#039;&#039; function&#039;s name if the target has no trailer of its own.&lt;br /&gt;
* &#039;&#039;&#039;Link-loader descriptors.&#039;&#039;&#039; Richer: one per procedure, with the entry address at &amp;lt;code&amp;gt;+0x08&amp;lt;/code&amp;gt; and the name at &amp;lt;code&amp;gt;+0x38&amp;lt;/code&amp;gt;. Names beginning &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt; are SLIC-internal modules; the rest are C++ mangled symbols.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&#039;&#039;&#039;Note!&#039;&#039;&#039; Two mistakes here are expensive. First, &#039;&#039;&#039;do not require the entry address to fall inside a segment the container carries&#039;&#039;&#039; — runtime-only segments exist, and filtering on containment silently drops every module in them. Second, the name is not always at a fixed offset from the descriptor; scanning for the longest identifier run within the descriptor is more robust than assuming one.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Module metadata ==&lt;br /&gt;
&#039;&#039;Find LIC Module&#039;&#039; reports, for any address: module name, nickname, compile and link/load timestamps, version and release level, &#039;&#039;&#039;PTF level&#039;&#039;&#039;, and the text, data and BSS extents plus the TOC address.&lt;br /&gt;
&lt;br /&gt;
The same record exists on media, anchored by the EBCDIC PTF-level string (&amp;lt;code&amp;gt;SYSBASE&amp;lt;/code&amp;gt; for an unpatched module):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
+0x00  PTF level     7 bytes    &amp;quot;SYSBASE&amp;quot;&lt;br /&gt;
+0x07  version       4 bytes    &amp;quot;0007&amp;quot; = V7&lt;br /&gt;
+0x0B  release/mod   4 bytes    &amp;quot;0400&amp;quot; = R4M0&lt;br /&gt;
+0x0F  nickname      8 bytes&lt;br /&gt;
+0x27  build id      7 bytes    &amp;quot;AJDG301&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
These records cluster in their own segments rather than sitting beside the code they describe. A V7R4 SAVSYS yields about 34,000 of them.&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;PTF level&#039;&#039;&#039; field is the useful one: it distinguishes base modules from patched ones without a changelog, which is exactly what you need when a running machine and its install media disagree on addresses.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&#039;&#039;&#039;Note!&#039;&#039;&#039; &amp;lt;code&amp;gt;SYSBASE&amp;lt;/code&amp;gt; means &amp;quot;no PTF applied to this module&amp;quot; — &#039;&#039;&#039;not&#039;&#039;&#039; &amp;quot;identical to your install media&amp;quot;. Two machines can both report &amp;lt;code&amp;gt;SYSBASE&amp;lt;/code&amp;gt; and differ, because base levels themselves differ between RS releases. Compile and link dates make this checkable.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Calls between modules ==&lt;br /&gt;
External calls do not go through a table you can read off.&lt;br /&gt;
&lt;br /&gt;
A call is a two-instruction sequence — an ordinal loaded into &amp;lt;code&amp;gt;r11&amp;lt;/code&amp;gt;, then a &amp;lt;code&amp;gt;bla&amp;lt;/code&amp;gt; into the &#039;&#039;&#039;BLA vector&#039;&#039;&#039; at the top of the address space. IBM&#039;s own term, from the Static Directory, is &#039;&#039;Pageable BLA&#039;&#039; for the pageable half.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
V4R4   ori r11,r13,&amp;lt;ordinal&amp;gt; ; bla &amp;lt;vector&amp;gt;&lt;br /&gt;
V7R4   li  r11,&amp;lt;ordinal&amp;gt;     ; bla &amp;lt;vector&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The stub reached by the &amp;lt;code&amp;gt;bla&amp;lt;/code&amp;gt; computes the target arithmetically:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rldicr r11,r11,sh,59      ; ordinal x 4 (V4R4) or x 16 (V7R4)&lt;br /&gt;
addis  r11,r11,&amp;lt;simm&amp;gt;&lt;br /&gt;
mtctr  r11&lt;br /&gt;
bctr&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
so &amp;lt;code&amp;gt;callee = (sext16(simm) &amp;lt;&amp;lt; 16) + (ordinal &amp;lt;&amp;lt; sh)&amp;lt;/code&amp;gt;. The &amp;lt;code&amp;gt;simm&amp;lt;/code&amp;gt; values are not derivable and must be read from the vector — which is not carried in any container, so a dump is required once per build.&lt;br /&gt;
&lt;br /&gt;
The stub array is findable &#039;&#039;&#039;structurally&#039;&#039;&#039; — runs of 16-byte blocks with three constant words and one varying — which locates it without knowing the shift. Searching for a specific opcode pattern from another release will not find it.&lt;br /&gt;
&lt;br /&gt;
== Reading conditional branches ==&lt;br /&gt;
&lt;br /&gt;
Every policy decision in SLIC is a conditional branch, and getting one backwards silently inverts whatever it decides — the listing looks the same either way. The encoding is ordinary PowerPC, but two things about it are easy to get wrong when reading a listing rather than writing an assembler.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;code&amp;gt;BO&amp;lt;/code&amp;gt; selects the sense, &amp;lt;code&amp;gt;BI&amp;lt;/code&amp;gt; selects the bit.&#039;&#039;&#039; &amp;lt;code&amp;gt;BO = 12&amp;lt;/code&amp;gt; is branch-if-true and &amp;lt;code&amp;gt;BO = 4&amp;lt;/code&amp;gt; is branch-if-false. &amp;lt;code&amp;gt;BI&amp;lt;/code&amp;gt; numbers the condition register&#039;s bits end to end — &amp;lt;code&amp;gt;BI = 4 × field + bit&amp;lt;/code&amp;gt; — and the four bits of a field are, in order, &#039;&#039;&#039;LT, GT, EQ, SO&#039;&#039;&#039;. So within &amp;lt;code&amp;gt;CR0&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;BI = 0&amp;lt;/code&amp;gt; is LT, &#039;&#039;&#039;&amp;lt;code&amp;gt;BI = 1&amp;lt;/code&amp;gt; is GT&#039;&#039;&#039; and &amp;lt;code&amp;gt;BI = 2&amp;lt;/code&amp;gt; is EQ; within &amp;lt;code&amp;gt;CR1&amp;lt;/code&amp;gt; the EQ bit is &amp;lt;code&amp;gt;BI = 6&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
That matters most after the idiom SLIC tests a policy bit with:&lt;br /&gt;
&lt;br /&gt;
 LWZ      4, 1148(16)     ; a flag byte out of an object&lt;br /&gt;
 RLDICL.  3, 4, 0, 63     ; r3 = byte &amp;amp;amp; 0x01, and set CR0&lt;br /&gt;
 BC       4, 1, ...       ; BO=4 branch-if-false, BI=1 GT&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;RLDICL.&amp;lt;/code&amp;gt; leaves 0 or 1 and sets &amp;lt;code&amp;gt;CR0&amp;lt;/code&amp;gt; by comparing it against zero, so GT is set exactly when the bit is on, and &#039;&#039;&#039;branch-if-not-GT is taken when the bit is CLEAR&#039;&#039;&#039;. Read &amp;lt;code&amp;gt;BI = 1&amp;lt;/code&amp;gt; as EQ instead and the same branch appears to be taken when the bit is &#039;&#039;&#039;set&#039;&#039;&#039; — the exact opposite, with nothing in the listing to show which reading is in force.&lt;br /&gt;
&lt;br /&gt;
A routine that uses two condition register fields settles the numbering without any external reference: a dispatch chain alternating &amp;lt;code&amp;gt;CMPI 0,…&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;BCLR 12,2&amp;lt;/code&amp;gt; with &amp;lt;code&amp;gt;CMPI 1,…&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;BCLR 12,6&amp;lt;/code&amp;gt; is comparing a value against a series of constants and returning on each match, which is only a dispatch if &amp;lt;code&amp;gt;BI&amp;lt;/code&amp;gt; 2 and 6 are the EQ bits of &amp;lt;code&amp;gt;CR0&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;CR1&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Two rendering traps make listings read backwards.&#039;&#039;&#039; Both apply to any disassembler that prints raw encoding fields instead of assembler syntax:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;The destination is not always the first operand.&#039;&#039;&#039; &amp;lt;code&amp;gt;ADDI&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ADD&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SUBF&amp;lt;/code&amp;gt; print it first; the logical forms &amp;lt;code&amp;gt;ORI&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;AND&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;ANDC&amp;lt;/code&amp;gt; print &amp;lt;code&amp;gt;rS&amp;lt;/code&amp;gt; first and the destination &amp;lt;code&amp;gt;rA&amp;lt;/code&amp;gt; &#039;&#039;&#039;second&#039;&#039;&#039;. A load/modify/store triple is the giveaway: &amp;lt;code&amp;gt;LBZ 27,28(28)&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;ORI 27,26,1&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;STB 26,28(28)&amp;lt;/code&amp;gt; only makes sense as &amp;quot;load into r27, or in 1 giving r26, store r26&amp;quot;. Read left to right, whole routines look like a run of dead stores.&lt;br /&gt;
* &#039;&#039;&#039;The &amp;lt;code&amp;gt;Rc&amp;lt;/code&amp;gt; dot can go missing.&#039;&#039;&#039; &amp;lt;code&amp;gt;rlwinm.&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;rlwimi.&amp;lt;/code&amp;gt; do set &amp;lt;code&amp;gt;CR0&amp;lt;/code&amp;gt;, but a decoder that appends the dot only for primary opcode 31 prints them without it — and then the branch after them looks like it is testing a condition register nothing wrote. Check bit 31 of the raw word before concluding a test is stale.&lt;br /&gt;
&lt;br /&gt;
== Traps worth knowing ==&lt;br /&gt;
* &#039;&#039;&#039;Never resolve a live pointer against a container image.&#039;&#039;&#039; A pointer read from a running machine names a runtime address; dereferencing it in a saved image lands on unrelated data and produces a plausible, wrong answer.&lt;br /&gt;
* &#039;&#039;&#039;Verify cross-image mappings by content, at the address you intend to use.&#039;&#039;&#039; A delta confirmed at one address does not hold across a segment.&lt;br /&gt;
* &#039;&#039;&#039;A positional coincidence looks exactly like a structural fact.&#039;&#039;&#039; Runs of plausible-looking pointers, matching offsets and familiar constants all occur by chance in images this size. Confirm with bytes.&lt;br /&gt;
* &#039;&#039;&#039;TOC contents are filled in at IPL.&#039;&#039;&#039; Container images hold unrelocated placeholders, so a TOC walk is only meaningful against live storage.&lt;br /&gt;
* &#039;&#039;&#039;Decode &amp;lt;code&amp;gt;BO&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;BI&amp;lt;/code&amp;gt; from the raw word before believing a branch, and record the sense you decoded.&#039;&#039;&#039; A branch that decides a policy bit is worth the thirty seconds; getting it wrong produces working-looking code that does the opposite of what the machine does, and the mistake survives review because the reasoning around it was written to match. See [[#Reading conditional branches]].&lt;br /&gt;
* &#039;&#039;&#039;A field the machine rebuilds at startup is an output, not an input.&#039;&#039;&#039; Configuration areas on disk are often regenerated from the machine&#039;s live configuration during power-on, and the code that later reads one may also stamp it on the way past. Reading such a field back as though it decided something is the same tautology as a model agreeing with its only caller, moved from code into data — and it is unusually convincing, because the value really is there and really is self-consistent. Establish who last wrote a field before deciding what it means.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[System Files:QFILEMCD]]&lt;br /&gt;
* [[System Files:QFILEIML]]&lt;br /&gt;
* [[Data Structures:LID]]&lt;br /&gt;
* [[SRC]]&lt;br /&gt;
&lt;br /&gt;
[[Category: System Internals]]&lt;br /&gt;
[[Category:AI generated not reviewed]]&lt;/div&gt;</summary>
		<author><name>PoC</name></author>
	</entry>
	<entry>
		<id>http://try-as400.pocnet.net/index.php?title=System_Internals:SLIC_DASD_device_recognition&amp;diff=1795</id>
		<title>System Internals:SLIC DASD device recognition</title>
		<link rel="alternate" type="text/html" href="http://try-as400.pocnet.net/index.php?title=System_Internals:SLIC_DASD_device_recognition&amp;diff=1795"/>
		<updated>2026-08-16T19:06:47Z</updated>

		<summary type="html">&lt;p&gt;PoC: +cat&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &#039;&#039;&#039;SLIC DASD device recognition&#039;&#039;&#039; table is the static list, inside the OS/400 Licensed Internal Code (SLIC), of which SCSI disk drives the system will accept as a DASD (disk) unit. This page describes how that recognition works, how to find and decode the table in a SLIC image, and — as a worked example — the complete list a V4R4 machine accepts. The method generalises to any release and to other SLIC device tables.&lt;br /&gt;
&lt;br /&gt;
Understanding it matters for preservation: OS/400 refuses ordinary SCSI disks, so keeping a machine alive after a disk failure means presenting a drive (real or emulated) that answers the SCSI bus the way SLIC expects.&lt;br /&gt;
&lt;br /&gt;
== How SLIC decides a disk is acceptable ==&lt;br /&gt;
&lt;br /&gt;
A disk becomes an eligible DASD unit only if it passes three independent gates, all implemented in the SLIC disk device driver:&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;SCSI INQUIRY must match a static table.&#039;&#039;&#039; SLIC compares the drive&#039;s INQUIRY vendor id (bytes 8–15) and product id (bytes 16–31) against a built-in table. Only IBM-badged units qualify: the vendor id is normally &amp;lt;code&amp;gt;IBMAS400&amp;lt;/code&amp;gt; (a handful of early units use &amp;lt;code&amp;gt;IBM␠␠␠␠␠&amp;lt;/code&amp;gt; and two OEM units use &amp;lt;code&amp;gt;QUANTUM␠&amp;lt;/code&amp;gt;). An off-the-shelf drive reports its own vendor and is rejected. This is exactly what the &amp;quot;custom firmware&amp;quot; on IBM&#039;s 660x/671x disks does: IBM reflashed standard Ultrastar/Corsair mechanisms to answer INQUIRY with an IBM vendor id and an IBM product id.&lt;br /&gt;
# &#039;&#039;&#039;Vendor-unique SKIP READ / SKIP WRITE.&#039;&#039;&#039; The driver issues IBM vendor-unique SCSI commands that read or write a run of sectors while skipping masked ones, used by the Single-Level Store paging path. A faithful drive must implement these, not just standard READ/WRITE.&lt;br /&gt;
# &#039;&#039;&#039;Capacity from VPD.&#039;&#039;&#039; The unit&#039;s size is taken at run time from the drive&#039;s Vital Product Data / &amp;lt;code&amp;gt;READ CAPACITY&amp;lt;/code&amp;gt;, not from the table — the table has no capacity column. An impersonating drive must report a capacity that is legal for the feature type it claims.&lt;br /&gt;
&lt;br /&gt;
== Finding and decoding the table ==&lt;br /&gt;
&lt;br /&gt;
In a SLIC image the table is a run of fixed-size records. On V4R4 each record is 40 bytes:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bytes  0- 3  feature type    EBCDIC digits, e.g. F6F6F0F7 = &amp;quot;6607&amp;quot;&lt;br /&gt;
bytes  4- 5  model           EBCDIC, e.g. &amp;quot;1 &amp;quot;&lt;br /&gt;
byte      6  class flag      0x00 normal; 0x80 on the 18 GB Ultra2/LVD units&lt;br /&gt;
bytes  7-15  reserved        0x40 (EBCDIC space) padding&lt;br /&gt;
bytes 16-23  INQUIRY vendor  ASCII, matched against INQUIRY bytes 8-15&lt;br /&gt;
bytes 24-39  INQUIRY product ASCII, matched against INQUIRY bytes 16-31&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The type and model are EBCDIC (digit &#039;&#039;n&#039;&#039; = byte &amp;lt;code&amp;gt;0xF&#039;&#039;n&#039;&#039;&amp;lt;/code&amp;gt;); the INQUIRY strings are ASCII. To locate the table, search the image for the ASCII vendor strings &amp;lt;code&amp;gt;IBMAS400&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;QUANTUM␠&amp;lt;/code&amp;gt;: the records sit at a fixed 40-byte stride around them. The same trick — anchor on a known ASCII string, then read the fixed-width record around it — recovers other SLIC hardware tables (IOP/controller CCIN tables, adapter tables, and so on).&lt;br /&gt;
&lt;br /&gt;
== The V4R4 list ==&lt;br /&gt;
&lt;br /&gt;
Every drive a V4R4 system accepts, decoded from the image. &amp;quot;Physical drive&amp;quot; is identification from IBM/Quantum model nomenclature, not read from the binary; the feature type, model and INQUIRY strings are.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Feature/Model !! INQUIRY vendor !! INQUIRY product !! Physical drive&lt;br /&gt;
|-&lt;br /&gt;
| 6109 / 0 || &amp;lt;code&amp;gt;IBM␠␠␠␠␠&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0663H12&amp;lt;/code&amp;gt; || IBM 0663 &amp;quot;Corsair&amp;quot;, ~2 GB&lt;br /&gt;
|-&lt;br /&gt;
| 6109 / 1 || &amp;lt;code&amp;gt;IBM␠␠␠␠␠&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0661371&amp;lt;/code&amp;gt; || IBM 0661 &amp;quot;Pixie&amp;quot;, ~0.37 GB&lt;br /&gt;
|-&lt;br /&gt;
| 6105 / 0 || &amp;lt;code&amp;gt;IBM␠␠␠␠␠&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0661467&amp;lt;/code&amp;gt; || IBM 0661 &amp;quot;Pixie&amp;quot;, ~0.47 GB&lt;br /&gt;
|-&lt;br /&gt;
| 6107 / 0 || &amp;lt;code&amp;gt;IBMAS400&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0664M1H&amp;lt;/code&amp;gt; || IBM 0664 &amp;quot;Corsair-4&amp;quot;, ~4 GB&lt;br /&gt;
|-&lt;br /&gt;
| 6603 / 0 || &amp;lt;code&amp;gt;IBMAS400&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0664N1H&amp;lt;/code&amp;gt; || IBM 0664 &amp;quot;Corsair-4&amp;quot;, ~4 GB&lt;br /&gt;
|-&lt;br /&gt;
| 6603 / 1 || &amp;lt;code&amp;gt;IBMAS400&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0662S12&amp;lt;/code&amp;gt; || IBM 0662 &amp;quot;Corsair&amp;quot;, ~1.2 GB&lt;br /&gt;
|-&lt;br /&gt;
| 6602 / 0 || &amp;lt;code&amp;gt;IBMAS400&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0662SW1&amp;lt;/code&amp;gt; || IBM 0662 &amp;quot;Corsair&amp;quot;, ~1.0 GB&lt;br /&gt;
|-&lt;br /&gt;
| 6602 / 1 || &amp;lt;code&amp;gt;IBMAS400&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;DFHSS1W&amp;lt;/code&amp;gt; || IBM Ultrastar XP, ~1 GB&lt;br /&gt;
|-&lt;br /&gt;
| 6605 / 1 || &amp;lt;code&amp;gt;IBMAS400&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;DFHSS2W&amp;lt;/code&amp;gt; || IBM Ultrastar XP, ~2 GB&lt;br /&gt;
|-&lt;br /&gt;
| 6606 / 1 || &amp;lt;code&amp;gt;IBMAS400&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;DFHSS4W&amp;lt;/code&amp;gt; || IBM Ultrastar XP, ~4 GB&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;6607 / 1&#039;&#039;&#039; || &amp;lt;code&amp;gt;IBMAS400&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;DCHS09W&amp;lt;/code&amp;gt; || IBM Ultrastar 2XP, ~9 GB&lt;br /&gt;
|-&lt;br /&gt;
| 6713 / 1 || &amp;lt;code&amp;gt;IBMAS400&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;DGHS18U&amp;lt;/code&amp;gt; || IBM Ultrastar 18XP, ~18 GB&lt;br /&gt;
|-&lt;br /&gt;
| 6714 / 1 || &amp;lt;code&amp;gt;IBMAS400&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;DGVS09U&amp;lt;/code&amp;gt; || IBM Ultrastar 9ES/9LZX, ~9 GB&lt;br /&gt;
|-&lt;br /&gt;
| 6717 / 1 || &amp;lt;code&amp;gt;QUANTUM␠&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;SSQD107&amp;lt;/code&amp;gt; || Quantum, ~10.7 GB&lt;br /&gt;
|-&lt;br /&gt;
| 6730 / 0 || &amp;lt;code&amp;gt;QUANTUM␠&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;SSQD160&amp;lt;/code&amp;gt; || Quantum, ~16.0 GB&lt;br /&gt;
|-&lt;br /&gt;
| 6731 / 0 || &amp;lt;code&amp;gt;IBMAS400&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;DRVS18D&amp;lt;/code&amp;gt; || IBM Ultrastar 18ES/18LZX, ~18 GB, Ultra2/LVD&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Feature-type numbers do not track capacity linearly: the type encodes the AS/400 usable-capacity class (after 520-byte-sector overhead), not the drive&#039;s native size. The much-cited 6607 is here as &amp;lt;code&amp;gt;IBMAS400&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;DCHS09W&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;Ide&amp;quot; in SLIC symbol names (e.g. the driver classes handling these disks) is the disk device-driver namespace, &#039;&#039;&#039;not&#039;&#039;&#039; ATA/IDE.&lt;br /&gt;
* Numbers like 2748, 6502, 6512, 6751, 6753, 6754 that appear on other SLIC symbols are IOP / disk-controller CCINs, not drive models.&lt;br /&gt;
* An emulated target (for example on open SCSI-emulator firmware) must present one of the vendor+product pairs above verbatim, space-padded to the SCSI field widths, implement the vendor-unique SKIP commands, and report a legal capacity via &amp;lt;code&amp;gt;READ CAPACITY&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Category:System Internals]]&lt;br /&gt;
[[Category:AI generated not reviewed]]&lt;/div&gt;</summary>
		<author><name>PoC</name></author>
	</entry>
	<entry>
		<id>http://try-as400.pocnet.net/index.php?title=Category:AI_generated_not_reviewed&amp;diff=1794</id>
		<title>Category:AI generated not reviewed</title>
		<link rel="alternate" type="text/html" href="http://try-as400.pocnet.net/index.php?title=Category:AI_generated_not_reviewed&amp;diff=1794"/>
		<updated>2026-08-16T19:04:13Z</updated>

		<summary type="html">&lt;p&gt;PoC: New&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Pages in this category are generated by AI and have not been examined for correctness.&lt;/div&gt;</summary>
		<author><name>PoC</name></author>
	</entry>
	<entry>
		<id>http://try-as400.pocnet.net/index.php?title=Configuring_X.25_link_through_Cisco_IP_network&amp;diff=1787</id>
		<title>Configuring X.25 link through Cisco IP network</title>
		<link rel="alternate" type="text/html" href="http://try-as400.pocnet.net/index.php?title=Configuring_X.25_link_through_Cisco_IP_network&amp;diff=1787"/>
		<updated>2026-08-12T18:55:40Z</updated>

		<summary type="html">&lt;p&gt;PoC: typo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Sometimes, older, donated hardware comes without LAN I/O-adapters. Sometimes it has serial communication I/O-adapters, though. This article points out how to network two AS/400&#039;s with the help of (older) Cisco hard- and software through the [[wikipedia:X.25|X.25]] protocol, and XOT. This example does not make use of switched virtual circuits (SVC), but permanent virtual circuits (PVC).&lt;br /&gt;
&lt;br /&gt;
== Motivation ==&lt;br /&gt;
[[File:Cisco_1005_disassembled.jpg|thumb|right|Cisco 1005, disassembled for de-dusting, and power connector replacement]]&lt;br /&gt;
I wanted my 9401-P03 to be optically present on my desk instead in a dusty corner. The dusty corner had a Cisco 2513 nearby for SDLC network integration, but the new place just has Ethernet. So, another router was needed. Because this machine already generates considerable noise, a fanless router was desired.&lt;br /&gt;
&lt;br /&gt;
First try was with a very old 1005. But even with the latest IOS release 12.0(28d), that model doesn&#039;t support SDLC encapsulation on its serial interface. Hence I decided to switch to a common protocol both machines understand: X.25, or Frame Relay. Using &#039;&#039;Frame Relay&#039;&#039; was not feasible, because OS/400 supports Frame Relay only with certain cabling options and IO-Adapters I don&#039;t have. Hence I chose X.25 as the last common denominator for RS-232/V.24.&lt;br /&gt;
&lt;br /&gt;
Sadly, the 1005 makes the connection fail as soon as actual transfers are attempted. I tested line speeds down to 9600&amp;amp;thinsp;bps without success. For fault isolation, I grabbed an old Cisco 1601-R, and copied over the configuration. Connection was working at the first try with 9600&amp;amp;thinsp;bps. I increased the line speed to 64&amp;amp;thinsp;Kbps — the same speed the 2612 connected to the other Machine showed was possible without problems. Most notable benefit to use X.25 compared to a direct SLDC link is that serial speeds up to 64&amp;amp;thinsp;Kbps are allowed and apparently possible, instead of just 19200&amp;amp;thinsp;bps with SDLC.&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
[[File:IBM 2652.jpg|thumb|right|6152 Adapter, located in a P02]]&lt;br /&gt;
[[File:IBM 2609.jpg|thumb|right|2609 Adapter socket, located in a P03]]&lt;br /&gt;
[[File:IBM 2609-plugged.jpg|thumb|right|2609 Plug with heavy cable]]&lt;br /&gt;
[[File:IBM 2609 Brick.jpg|thumb|right|2609 Breakout-Brick — note that the Cisco cable is plugged directly which is &#039;&#039;&#039;wrong&#039;&#039;&#039;, and only shown for illustration purposes.]]&lt;br /&gt;
* Two AS/400 machines, complete and functioning&lt;br /&gt;
** &amp;lt;code&amp;gt;QAUTOCFG&amp;lt;/code&amp;gt; system variable switched to on&lt;br /&gt;
** Local serial port with required breakouts, such as a #2609, #2652, #2720, etc.&lt;br /&gt;
** Matching IBM V.24 Modem Cable&amp;lt;ref&amp;gt;If the machine was attached to a modem in earlier times, and you obtained all the cables, all requirements are satisfied.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&#039;&#039;&#039;Note!&#039;&#039;&#039; It is of utmost importance to keep in mind that the AS/400 serial ports have &#039;&#039;sense pins&#039;&#039;, to know which kind of cable is attached. If you plug in just an ordinary PC serial cable, you’ll eventually find the succinct message in the QSYSOPR message queue, that a cable could not be found. Therefore the requirement of an &#039;&#039;IBM V.24 Modem Cable&#039;&#039;, or a self made cable, or adapter, providing the necessary sense pin connectivity.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;For this reason, you&#039;ll need to plug the DB-25F socket connector of the Cisco cable to the modem cable, and not directly to the AS/400’s port.&#039;&#039;&#039;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Cisco 16xx, 26xx or similar router model with T-Type serial interface (card),&lt;br /&gt;
** Cisco CAB-232 FC,&lt;br /&gt;
** Router LAN ports configured so they can reach each other via IP.&lt;br /&gt;
&lt;br /&gt;
The basic network topology is symmetric. Both AS/400s are connected to their respective Cisco routers through their serial port, and both Cisco routers are connected to each other with some LAN technology, presumably Ethernet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Fiona&#039;&#039; → Cisco 1601-R (192.168.1.97) → Cisco 2612 (192.168.1.5) → &#039;&#039;Nibbler&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
Assumption is that the routers already have a basic configuration applied.&lt;br /&gt;
&lt;br /&gt;
After plugging everything together like pointed out above, obtain the resource names of the serial ports. Type &amp;lt;code&amp;gt;wrkhdwrsc *cmn&amp;lt;/code&amp;gt; to get a list of communication hardware, and associated ports. Example:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Resource        Type  Text&#039;&#039;&#039;&lt;br /&gt;
 CMB01           917B  Combined function IOP&lt;br /&gt;
   LIN01         2609  Comm Adapter&lt;br /&gt;
     LIN011      2609  V.24 Port&lt;br /&gt;
     LIN012      2609  V.24 Port&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&#039;&#039;&#039;Note!&#039;&#039;&#039; OS/400 V3 seems to not designate ports as &#039;&#039;CMN&#039;&#039;, but as &#039;&#039;LIN&#039;&#039; with three digits. Newer releases designate ports on an adapter as &#039;&#039;CMN&#039;&#039;.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After you have created the line description, run &amp;lt;code&amp;gt;dsplind x25line&amp;lt;/code&amp;gt; to find the generated Exchange-ID.&lt;br /&gt;
&lt;br /&gt;
Here is a table to help configuring what, where, and in which order.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Configuration&lt;br /&gt;
!Cisco 1601-R (192.168.1.97)&lt;br /&gt;
!Cisco 2612 (192.168.1.5)&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|&#039;&#039;&#039;Cisco IOS&#039;&#039;&#039;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|&lt;br /&gt;
 x25 routing&lt;br /&gt;
&lt;br /&gt;
 interface Serial0&lt;br /&gt;
  description Fiona LIN011&lt;br /&gt;
  encapsulation x25 dce&lt;br /&gt;
  x25 modulo 128&lt;br /&gt;
  x25 ltc 100&lt;br /&gt;
  x25 pvc 6 xot 192.168.1.5 interface Serial 0/1 pvc 5 packetsize 512 512&lt;br /&gt;
  clockrate 64000&lt;br /&gt;
&lt;br /&gt;
 interface Ethernet0&lt;br /&gt;
  ip address 192.168.1.97 255.255.255.0&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|&lt;br /&gt;
 x25 routing&lt;br /&gt;
&lt;br /&gt;
 interface Serial0/1&lt;br /&gt;
  description Nibbler CMN01&lt;br /&gt;
  encapsulation x25 dce&lt;br /&gt;
  load-interval 60&lt;br /&gt;
  x25 modulo 128&lt;br /&gt;
  x25 ltc 100&lt;br /&gt;
  x25 pvc 5 xot 192.168.1.97 interface Serial 0 pvc 6 packetsize 512 512&lt;br /&gt;
  clock rate 64000&lt;br /&gt;
&lt;br /&gt;
 interface FastEthernet1/0&lt;br /&gt;
  ip address 192.168.1.5 255.255.255.0&lt;br /&gt;
|-&lt;br /&gt;
!&amp;amp;nbsp;&lt;br /&gt;
!Fiona (V3R2)&lt;br /&gt;
!Nibbler (V4R5)&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|&#039;&#039;&#039;Serial resource&#039;&#039;&#039;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|LIN011&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|CMN01&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|&#039;&#039;&#039;Line description&#039;&#039;&#039;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|&amp;lt;code&amp;gt;crtlinx25 lind(x25line) rsrcname(lin011) lglchle((006 *pvc)) netadr(00000000000000) cnninit(*local) interface(*rs232v24) linespeed(19200) dftpktsize(512) modulus(128) adrinsert(*no) linkspeed(64000) cmnrcylmt(1 10)&amp;lt;/code&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|&amp;lt;code&amp;gt;crtlinx25 lind(x25line) rsrcname(cmn01) lglchle((005 *pvc)) netadr(00000000000000) cnninit(*local) interface(*rs232v24) linespeed(19200) dftpktsize(512) modulus(128) adrinsert(*no) linkspeed(64000) cmnrcylmt(1 10)&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|&#039;&#039;&#039;Exchange-ID&#039;&#039;&#039;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|05608945&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|05641700&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|&#039;&#039;&#039;Controller description&#039;&#039;&#039;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|&amp;lt;code&amp;gt;crtctlappc ctld(nibbler) linktype(*x25) line(x25line) maxframe(512) rmtcpname(nibbler) exchid(05641700) netlvl(1984) lglchlid(006) nodetype(*calc) tmsgrpnbr(*calc) autodltdev(*no) cmnrcylmt(10 1)&amp;lt;/code&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|&amp;lt;code&amp;gt;crtctlappc ctld(fiona) linktype(*x25) line(x25line) maxframe(512) rmtcpname(fiona) exchid(05608945) netlvl(1984) lglchlid(005) nodetype(*calc) tmsgrpnbr(*calc) autodltdev(*no) cmnrcylmt(10 1)&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Notes ===&lt;br /&gt;
* If you change the serial encapsulation value, all X.25 related configuration is discarded!&lt;br /&gt;
* The PVC-ID for Cisco IOS is a decimal value, and for OS/400, it&#039;s a hex value!&lt;br /&gt;
* You can use the same PVC on both sides.&lt;br /&gt;
* You cannot create the line description with the full speed outright due to error CPD26DC (Maximum line speed for RS-232/V.24 is 19200&amp;amp;thinsp;bps.). Create the line with &amp;lt;code&amp;gt;linespeed(19200)&amp;lt;/code&amp;gt;, and edit the lind again, setting the desired speed of 64&amp;amp;thinsp;kbps.&lt;br /&gt;
&lt;br /&gt;
Proven to work:&lt;br /&gt;
* Cisco 2612 with added WIC-1T, and image C2600-BINO3S3, Version 12.3(26)&lt;br /&gt;
* Cisco 1601-R, and image C1600-BNR2SY, Version 12.3(26)&lt;br /&gt;
&lt;br /&gt;
When one side is powered down, the other side frequently posts error messages to the &#039;&#039;qsysopr&#039;&#039; message queue and problem reporting facility.&lt;br /&gt;
&lt;br /&gt;
== Initiation, and function verification ==&lt;br /&gt;
Turn on debugging on the Cisco routers:&lt;br /&gt;
 term moni&lt;br /&gt;
 debug x25&lt;br /&gt;
&lt;br /&gt;
Run &amp;lt;code&amp;gt;wrkcfgsts *lin x25line&amp;lt;/code&amp;gt; and use the interactive screen to vary on the line on both sides. You should see the lines coming up.&lt;br /&gt;
 %LINK-3-UPDOWN: Interface Serial0/0, changed state to up&lt;br /&gt;
 %LINEPROTO-5-UPDOWN: Line protocol on Interface Serial0/0, changed state to up&lt;br /&gt;
&lt;br /&gt;
On the Cisco Router(s), you should see output of &amp;lt;code&amp;gt;show int ser0/1&amp;lt;/code&amp;gt; similar to the following:&lt;br /&gt;
 Serial0/1 is up, line protocol is up &lt;br /&gt;
   Hardware is PowerQUICC Serial&lt;br /&gt;
   Description: Nibbler CMN01&lt;br /&gt;
   MTU 1500 bytes, BW 19200 Kbit, DLY 20000 usec, &lt;br /&gt;
      reliability 255/255, txload 1/255, rxload 1/255&lt;br /&gt;
   Encapsulation X25, loopback not set&lt;br /&gt;
   X.25 DCE, version 1984, address &amp;lt;none&amp;gt;, state R1, modulo 128, timer 0&lt;br /&gt;
       Defaults: idle VC timeout 0&lt;br /&gt;
         cisco encapsulation&lt;br /&gt;
         input/output window sizes 2/2, packet sizes 128/128&lt;br /&gt;
       Timers: T10 60, T11 180, T12 60, T13 60&lt;br /&gt;
       Channels: Incoming-only none, Two-way 100-1024, Outgoing-only none&lt;br /&gt;
       RESTARTs 32/0 CALLs 0+0/0+0/0+0 DIAGs 34/0&lt;br /&gt;
   LAPB DCE, state CONNECT, modulo 8, k 7, N1 12056, N2 20&lt;br /&gt;
       T1 3000, T2 0, interface outage (partial T3) 0, T4 0&lt;br /&gt;
       VS 6, VR 4, tx NR 4, Remote VR 6, Retransmissions 0&lt;br /&gt;
       Queues: U/S frames 0, I frames 0, unack. 0, reTx 0&lt;br /&gt;
       IFRAMEs 1664/1953 RNRs 0/0 REJs 0/0 SABM/Es 55/0 FRMRs 0/0 DISCs 0/24&lt;br /&gt;
   Last input never, output 00:50:34, output hang never&lt;br /&gt;
   Last clearing of &amp;quot;show interface&amp;quot; counters 23:57:07&lt;br /&gt;
   Input queue: 0/75/0/0 (size/max/drops/flushes); Total output drops: 0&lt;br /&gt;
   Queueing strategy: fifo&lt;br /&gt;
   Output queue: 0/40 (size/max)&lt;br /&gt;
   1 minute input rate 0 bits/sec, 0 packets/sec&lt;br /&gt;
   1 minute output rate 0 bits/sec, 0 packets/sec&lt;br /&gt;
      3654 packets input, 76438 bytes, 0 no buffer&lt;br /&gt;
      Received 0 broadcasts, 0 runts, 0 giants, 0 throttles&lt;br /&gt;
      29 input errors, 0 CRC, 29 frame, 0 overrun, 0 ignored, 0 abort&lt;br /&gt;
      3526 packets output, 81439 bytes, 0 underruns&lt;br /&gt;
      0 output errors, 0 collisions, 917 interface resets&lt;br /&gt;
      0 output buffer failures, 0 output buffers swapped out&lt;br /&gt;
      51 carrier transitions&lt;br /&gt;
      DCD=up  DSR=up  DTR=up  RTS=up  CTS=up&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Serial Cables IDs]]&lt;br /&gt;
* [[RS-232 Modem Cable Pinout]]&lt;br /&gt;
* [[Integrating LAN-less Machines into a local Token Ring]]&lt;br /&gt;
* [[Configuring TCP/IP and SLIP with Cisco-Router and V3R2]]&lt;br /&gt;
* [[Serial networking scenarios with Cisco-Routers]]&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [https://website.fis.agh.edu.pl/complab/doc/Cisco_IOS_11.0/cbook/cx25.htm Configuring X.25 and LAPB] on Cisco IOS, Faculty of Physics and Applied Computer Science Poland&amp;lt;ref&amp;gt;Very old documentation linked intentionally. Note: The configuration option &#039;&#039;tunnel&#039;&#039; was renamed to &#039;&#039;xot&#039;&#039; in newer IOS releases.&amp;lt;/ref&amp;gt;&lt;br /&gt;
* [https://public.dhe.ibm.com/systems/power/docs/systemi/v6r1/en_US/sc415405.pdf X.25 Network Support]&lt;br /&gt;
* [https://en.wikipedia.org/wiki/RS-232#Timing_signals RS-232 timing signals], Wikipedia&lt;br /&gt;
* [https://www.cisco.com/c/en/us/support/docs/routers/10000-series-routers/46800-cab232mtfc.html#cab-232fc Serial Cable CAB-232FC], Cisco.com&lt;br /&gt;
* [https://www.ibm.com/resources/publications/OutputPubsDetails?PubID=SY44590203 AS/400 Service Functions], SY44-5902-03&amp;lt;ref&amp;gt;PDF page 245, Table 51, bottom line on that page displays the cable-id connected pins. See also the notes on the top of the next page.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Footnotes ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category: Hardware Configuration Guide‏]]&lt;br /&gt;
[[Category: Software Configuration Guide‏]]&lt;/div&gt;</summary>
		<author><name>PoC</name></author>
	</entry>
	<entry>
		<id>http://try-as400.pocnet.net/index.php?title=Apple_SNA%E2%80%A2ps&amp;diff=1786</id>
		<title>Apple SNA•ps</title>
		<link rel="alternate" type="text/html" href="http://try-as400.pocnet.net/index.php?title=Apple_SNA%E2%80%A2ps&amp;diff=1786"/>
		<updated>2026-08-09T21:18:56Z</updated>

		<summary type="html">&lt;p&gt;PoC: Precise naming&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Apple SNAps Carton.jpg|thumb|right|Package]]&lt;br /&gt;
[[File:5250term.gif|thumb|right|Active 5250 client connection]]&lt;br /&gt;
[[File:Snagw-run.gif|thumb|right|SNA•ps Gateway information windows]]&lt;br /&gt;
&#039;&#039;&#039;Apple SNA•ps&#039;&#039;&#039; is an application software package for Apple Macintosh computers running System 7. Its purpose is to provide Macintosh users access to resources located on IBM Midrange and Mainframe computers. It is the result of a collaboration between Apple and IBM in the early 1990s and has been developed by &#039;&#039;Orion Network Systems, Inc.&#039;&#039; SNA•ps is short for &#039;&#039;Systems Networking Architecture protocols and services&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
SNA•ps uses IBMs proprietary &#039;&#039;Systems Network Architecture&#039;&#039; family of network protocols to talk to the IBM side of affairs,&amp;lt;ref&amp;gt;Newer versions of the SNA•ps 5250 client also support IP/tn5250 as alternate network transport.&amp;lt;/ref&amp;gt; and Apple’s proprietary AppleTalk on the Macintosh side.&lt;br /&gt;
&lt;br /&gt;
So far, only two publicly available releases are known: version 1.1 from 1992, and version 2.0.1 from 1994. The beta-level release of SNA•ps 1.1 was available during 1991 and was the primary testing level for the &#039;&#039;IBM/Apple IBM Enterprise Networking Guide for SNA Products&#039;&#039; guide.&lt;br /&gt;
&lt;br /&gt;
The main differences between version 1.0, and version 1.1 are the introduction of 3287 printer emulation, and 16&amp;amp;thinsp;Mbps Token Ring support.&lt;br /&gt;
&lt;br /&gt;
SNA•ps comprises of a client and server component. Both can run on the same Macintosh computer, though.&lt;br /&gt;
* &#039;&#039;Gateway&#039;&#039; software with a license dependent maximum count of&lt;br /&gt;
** 8, 32, or 64 [[wikipedia:IBM Systems Network Architecture#Logical Unit (LU)|LU]]-sessions for version 1.1&lt;br /&gt;
** 10, 35, or 70 users for version 2.0.1&lt;br /&gt;
* &#039;&#039;Gateway Client&#039;&#039;&amp;lt;ref&amp;gt;Designated &#039;&#039;GC&#039;&#039; in product descriptions.&amp;lt;/ref&amp;gt; for 3270 and 5250 terminal services, as well as printing services.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&#039;&#039;&#039;Note:&#039;&#039;&#039; Further restrictions in terms of session count may apply depending on selected transport option technology, and available memory on said transport option.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This article focuses on AS/400 and thus on 5250 connectivity. Since the AS/400 platform also has 3270 compatibility support, the SNA•ps 3270 client for 3270 sessions can be used when required, and with an appropriately configured AS/400 system. See below for Macintosh System Software version requirements.&lt;br /&gt;
&lt;br /&gt;
Different versions of &#039;&#039;SNA•ps&#039;&#039; are available on Apple’s [https://macintoshgarden.org/apps/apple-cdsn-computers-connectivity-demonstration-and-support-network-reference-cd &#039;&#039;Computer&#039;s Connectivity Demonstration and Support Network&#039;&#039; Reference CD] at Macintosh Garden. Note that version 2.0.1 requires a serial number to be entered at install time.&lt;br /&gt;
&lt;br /&gt;
== General overview ==&lt;br /&gt;
The &#039;&#039;SNA•ps Gateway&#039;&#039; makes resources provided by the mainframe or the AS/400 via [[wikipedia:Systems Network Architecture#Physical Unit (PU)|SNA PUs]]/LUs or [[wikipedia:IBM Advanced Peer-to-Peer Networking|APPN]]/[[wikipedia:IBM Advanced Program-to-Program Communication|APPC]] available to AppleTalk connected Macs. This means that an (expensive) card for connecting to the mainframe does not have to be installed in every Mac, but one can be shared by many users. Also, adding such a card is not possible in some cases: Compact Macs like the Mac Plus or Mac SE have no or only limited expansion options. In addition, the required network cabling may not exist.&lt;br /&gt;
&lt;br /&gt;
Examples of clients are the terminal emulations [[wikipedia:IBM 3270|3270]], and [[wikipedia:IBM 5250|5250]]). These allow Macs that are connected to the [[[wikipedia:AppleTalk|AppleTalk]] network (e.&amp;amp;thinsp;g. via [[wikipedia:LocalTalk|LocalTalk]]) to establish terminal sessions to a SNA host.&lt;br /&gt;
&lt;br /&gt;
An example of reverse direction is printing support. The &#039;&#039;SNA•ps Print&#039;&#039; client emulates an IBM 8312 printer. Print jobs spooled into a printer queue on the AS/400 are picked up by &#039;&#039;SNA•ps Print&#039;&#039;, to be printed using the default (AppleTalk) printer, set in the [[wikipedia:Chooser (Mac_OS)|Chooser]], or saved as text in a file.&amp;lt;br&amp;gt;&lt;br /&gt;
This was a way of making the Apple [[wikipedia:LaserWriter|LaserWriter]] usable from midrange, and indirectly from mainframe computers. The LaserWriter was very expensive at its introduction time.&lt;br /&gt;
&lt;br /&gt;
The counterpart to the &#039;&#039;SNA•ps Gateway&#039;&#039; is a system extension called &#039;&#039;SNA•ps Access&#039;&#039;. Client applications use API routines provided by this extension. The SNA•ps API can also be used by third parties; examples have been published by Apple through their developer CDs. An example of this is [[wikipedia:Database abstraction layer|DAL]] for the Macintosh. It can utilize several ways to connect to the actual database; such as IP (via MacTCP) and SNA (via SNA•ps Access).&lt;br /&gt;
&lt;br /&gt;
In the 1990s, IBM made LocalTalk add-on cards for the older AS/400&#039;s SPD slots, and released additional software for OS/400 to implement the AppleTalk protocol stack on the AS/400 as well. The implementation on the AS/400 corresponded roughly to the SNA•ps gateway, so that no Mac was required as a gateway: the necessary software ran only on the AS/400. It was only meant to provide display and print functions instead of full APPC capabilities, though. This enabled Macs to function as a console device to the AS/400, but made it impossible to use APPC based services, such as DAL, over the integrated LocalTalk connection.&lt;br /&gt;
&lt;br /&gt;
The IBM document &#039;&#039;Using Apple Macintosh with the AS/400&#039;&#039;, Document Number GG24-4071-00 (March 1994) provides detailed insight about SNA•ps, and AS/400 configuration. Unfortunately, this document is no longer available publicly.&lt;br /&gt;
&lt;br /&gt;
== System compatibility ==&lt;br /&gt;
The SNA•ps 5250 client requires System 7.0 or higher. Launching it on System 6 gets you a corresponding error message, and the client does not open. Saying that, the 3270 terminal client officially runs under System 6.0.5, and later, though.&lt;br /&gt;
&lt;br /&gt;
The client works on Mac operating system versions up to, and including 8.1. OpenTransport compatibility seems sufficient to support that old software without changes. The client crashes upon connecting via a SNA•ps gateway when ran on PowerPC Macs, though.&lt;br /&gt;
&lt;br /&gt;
A connection via TCP (possible with client version 1.1) provokes the message that the other party doesn’t use the 5250 protocol. This is reproducible under System 7.6.1/OT/PPC as well as under 7.1/MacTCP/68k. Reasons are unknown.&lt;br /&gt;
&lt;br /&gt;
The gateway software requires special hardware for the SNA network connection and is therefore limited to NuBus systems. Documentation states, the gateway needs at least System 7.0 to run. This has not yet been verified. Testing of the gateway software on the first generation NuBus equipped PowerMacs also hasn’t been done, yet.&lt;br /&gt;
&lt;br /&gt;
== Performance ==&lt;br /&gt;
Comfortable performance can be attained by running at least the client on 68040 equipped Macs, connected to the gateway through Ethernet.&amp;lt;ref&amp;gt;AppleTalk and IP performance for AFP transfers over the &#039;&#039;Apple Token Ring 4/16 NB Card&#039;&#039; do not exceed 200&amp;amp;thinsp;kiB/s. In this regard, attainable performance is less than optimal.&amp;lt;/ref&amp;gt; This provides answer times of less than a second, e.&amp;amp;thinsp;g. when scrolling through help texts, etc. Measuring of answer times for the gateway running on different classes Macs has not been done, yet.&lt;br /&gt;
&lt;br /&gt;
Running the client on Low End Macs such as the SE/30 yields answer times of around two seconds. All in all, fluid work is not attainable. Comparing LocalTalk and Ethernet with the SE/30 shows no significant differences in answer time, hinting towards the network not being the bottleneck.&lt;br /&gt;
&lt;br /&gt;
== Network transport options ==&lt;br /&gt;
The following options to connect to IBM machinery are supported in general:&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Phy&lt;br /&gt;
! Hardware&lt;br /&gt;
|-&lt;br /&gt;
|Serial/SDLC&lt;br /&gt;
|Apple Serial NB Card&lt;br /&gt;
|-&lt;br /&gt;
|Token Ring&lt;br /&gt;
|Apple Token Ring 4/16 NB Card, Apple TokenTalk NB Card&amp;lt;ref&amp;gt;This is a pure 4&amp;amp;thinsp;Mbps card, but already designed according to MCP specs.&amp;lt;/ref&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;s&amp;gt;Twinax&amp;lt;/s&amp;gt;&amp;lt;ref&amp;gt;5250 sessions over Twinax are not supported. Implementation was planned, but never was put into code before development ceased. The Enterprise Networking Guide mentions third party products having been &#039;&#039;available which can utilize the twinax feature on this adapter.&#039;&#039;&amp;lt;/ref&amp;gt;&lt;br /&gt;
|Apple Coax/Twinax Card&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
All of these cards feature their own 68000 CPU, and local memory. They conform to the &#039;&#039;Macintosh Coprocessor Platform&#039;&#039; specification. A more or less small process runs on the card, which exchanges data via message passing with its counterpart &#039;&#039;A/ROSE&#039;&#039; in the Mac OS.&lt;br /&gt;
&lt;br /&gt;
As a novel feature, part of the &#039;&#039;SNA•ps&#039;&#039; gateway software runs on the processor of the respective MCP card. Along with the rest of the software running on the Mac’s main CPU, APPC sessions are encapsulated in AppleTalk, and available to other Macs connected to the network, including LocalTalk. The minimum amount of memory for SNA•ps use is 1&amp;amp;thinsp;MB. For the 64&amp;amp;thinsp;LU- and 70 user license, 2.5&amp;amp;thinsp;MB are required.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed&amp;quot;&amp;gt;&lt;br /&gt;
File:Apple-Token-Ring-NB-Compside.jpg|Apple Token Ring 4/16 NB card, front&lt;br /&gt;
File:Apple-Token-Ring-NB-Solderside.jpg|Apple Token Ring 4/16 NB card, back&lt;br /&gt;
File:Apple-Coax-Twinax-Compside.jpg|Apple Coax/Twinax card, front&lt;br /&gt;
File:Apple-Coax-Twinax-Solderside.jpg|Apple Coax/Twinax card, back&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
I do not own an Apple Serial NB card, yet.&lt;br /&gt;
&lt;br /&gt;
== AS/400 configuration ==&lt;br /&gt;
On the AS/400 side, autoconfiguration for controller, and device descriptions should&amp;amp;nbsp;— at least temporarily&amp;amp;nbsp;— be allowed. See the &amp;lt;code&amp;gt;WRKSYSVAL&amp;lt;/code&amp;gt; command and the &#039;&#039;QAUTOCFG&#039;&#039;, &#039;&#039;QAUTORMT&#039;&#039; and &#039;&#039;QAUTOVRT&#039;&#039; variables. Maybe also adjust the variables &#039;&#039;QLMTDEVSSN&#039;&#039; and &#039;&#039;QLMTSECOFR&#039;&#039;. See help texts for details.&lt;br /&gt;
&lt;br /&gt;
The setting of the network attribute &#039;&#039;ALWVRTAPPN&#039;&#039; doesn&#039;t matter.&lt;br /&gt;
&lt;br /&gt;
A working Token Ring connection is also required. In its line description, the &#039;&#039;AUTOCRTCTL&#039;&#039; parameter should (temporarily) be set to &#039;&#039;*YES&#039;&#039;. It is recommended that the associated &#039;&#039;AUTODLTCTL&#039;&#039; parameter be set to &#039;&#039;*NONE&#039;&#039; if &amp;lt;code&amp;gt;AUTOCRTCTL(*YES)&amp;lt;/code&amp;gt; is to be retained.&lt;br /&gt;
&lt;br /&gt;
This preparation saves the tedious and error-prone configuration of the OS/400 controller (*CTLD) and device (*DEVD) descriptions for communication with the gateway on the Mac side.&lt;br /&gt;
&lt;br /&gt;
In addition, the &#039;&#039;IBM/Apple IBM Enterprise Networking Guide&#039;&#039; contains detailed configuration for configuring 3270 sessions to an AS/400 starting page 30 (PDF page 40).&lt;br /&gt;
&lt;br /&gt;
== Gateway configuration ==&lt;br /&gt;
[[File:Cfg-snaps.gif|thumb|right|Overview of the filled configuration window]]&lt;br /&gt;
The configuration is created with the &#039;&#039;SNA•ps Config&#039;&#039; program and built layer by layer.&lt;br /&gt;
&lt;br /&gt;
It is easily possible to configure several AS/400 peers in one configuration document. To do this, each machine must have its own definitions created for&lt;br /&gt;
* Lines,&lt;br /&gt;
* Partners,&lt;br /&gt;
* Remote 6.2 LUs,&lt;br /&gt;
* Modes.&lt;br /&gt;
&lt;br /&gt;
Contrary, &#039;&#039;Local 6.2 LUs&#039;&#039; und &#039;&#039;Transaction Points&#039;&#039; apply to all configured peers.&lt;br /&gt;
&lt;br /&gt;
If several AS/400’s are already internetworked via APPN, the gateway configuration can be made much easier. Just configure the AS/400 designated as APPN &#039;&#039;Network Node&#039;&#039; as partner connection. APPC sessions originating on the Macs are forwarded by the gateway to the (directly adjacent) Network Node AS/400. This one in turn forwards the LU sessions to the destination machines.&amp;lt;br&amp;gt;&lt;br /&gt;
Note that the &#039;&#039;Network Node&#039;&#039; machine needs to have adjacencies to the desired other machines for this to work. SNA•ps can only use connections being already configured.&lt;br /&gt;
&lt;br /&gt;
=== Lines ===&lt;br /&gt;
[[File:Cfg-line.gif|thumb|right|Line configuration]]&lt;br /&gt;
First, the Line configuration needs to be created. The name can be chosen relatively freely.&amp;lt;ref&amp;gt;Only CAPS, may not start with a number, and may only contain these special chars: #$_&amp;lt;/ref&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Increasing the &#039;&#039;Maximum I-Field Length&#039;&#039; parameter increases the data throughput and thus the speed at which data is forwarded through the gateway. The highest accepted value is 4105 bytes. Use of the maximum value is recommended. The line description of the AS/400&amp;amp;nbsp;— corresponding to the line configuration of SNA•ps&amp;amp;nbsp;— usually contains 16393 bytes. The actual value used is negotiated dynamically at session establishment time.&lt;br /&gt;
&lt;br /&gt;
Leave the other settings at default values.&lt;br /&gt;
&lt;br /&gt;
=== Partners ===&lt;br /&gt;
[[File:Cfg-peer.gif|thumb|right|Partner configuration]]&lt;br /&gt;
As long as the just created &#039;&#039;line&#039;&#039; is highlighted, the description for the actual network connection to the AS/400 can be defined in the &#039;&#039;partners&#039;&#039; field next to it.&amp;lt;br&amp;gt;&lt;br /&gt;
The following table shows parameters of the &#039;&#039;partner&#039;&#039; configuration and the related parameters on the AS/400:&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Partner setting&lt;br /&gt;
!Corresponding AS/400 setting&lt;br /&gt;
!Remark&lt;br /&gt;
|-&lt;br /&gt;
|Name&lt;br /&gt;
|&amp;lt;code&amp;gt;DSPNETA&amp;lt;/code&amp;gt;, local control point name (LCLCPNAME)&lt;br /&gt;
|Naming restrictions as in the line configuration apply.&lt;br /&gt;
|-&lt;br /&gt;
|Link Address&lt;br /&gt;
|&amp;lt;code&amp;gt;DSPLIND&amp;lt;/code&amp;gt;, local adapter address (ADPTADR)&lt;br /&gt;
|&amp;amp;nbsp;&lt;br /&gt;
|-&lt;br /&gt;
|Partner XID&lt;br /&gt;
|&amp;lt;code&amp;gt;DSPLIND&amp;lt;/code&amp;gt;, exchange identifier (EXCHID)&lt;br /&gt;
|&amp;amp;nbsp;&lt;br /&gt;
|-&lt;br /&gt;
|Gateway XID&lt;br /&gt;
|&amp;amp;nbsp;&lt;br /&gt;
|Generate yourself. Has to start with &#039;&#039;056&#039;&#039;, and must be unique at least on both sides of the adjacency-link.&amp;lt;ref&amp;gt;This value is copied to the AS/400’s controller description at the connection’s first start by auto configuration.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;XID exchanges stay local to directly adjacent hosts, thus XID duplicates should not matter network-wide.&amp;lt;/ref&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Gateway Network Name&lt;br /&gt;
|&amp;amp;nbsp;&lt;br /&gt;
|Generate yourself. You can probably use the name from the &#039;&#039;Sharing&#039;&#039; control panel. Naming restrictions as in the line configuration apply.&lt;br /&gt;
|-&lt;br /&gt;
|Gateway Network Qualifier&lt;br /&gt;
|&amp;lt;code&amp;gt;DSPNETA&amp;lt;/code&amp;gt;, local network ID (LCLNETID)&lt;br /&gt;
|&amp;amp;nbsp;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Other necessary &#039;&#039;Characteristics&#039;&#039; settings are:&lt;br /&gt;
* Peer: Set to Node Type 2.1,&lt;br /&gt;
* SAP address, (remains at) 4.&lt;br /&gt;
&lt;br /&gt;
=== Local 6.2 LUs ===&lt;br /&gt;
[[File:Cfg-loclu.gif|thumb|right|Local 6.2 LUs]]&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!LU setting&lt;br /&gt;
!Corresponding AS/400 setting&lt;br /&gt;
!Remark&lt;br /&gt;
|-&lt;br /&gt;
|Name&lt;br /&gt;
|&amp;amp;nbsp;&lt;br /&gt;
|Must be &#039;&#039;PASSTHRU&#039;&#039;. Corresponds to the &#039;&#039;SNA•ps Access&#039;&#039; Control Panel setting on the SNA•ps clients.&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;Network LU Name&#039;&#039;&lt;br /&gt;
|&amp;amp;nbsp;&lt;br /&gt;
|Desired name for the gateway on the APPN network. Naming restrictions as in the line configuration apply.&lt;br /&gt;
|-&lt;br /&gt;
|Network Qualifier&lt;br /&gt;
|&amp;lt;code&amp;gt;DSPNETA&amp;lt;/code&amp;gt;, local network ID (LCLNETID)&lt;br /&gt;
|&amp;amp;nbsp;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Transaction points (TPs) ===&lt;br /&gt;
[[File:Cfg-tp.gif|thumb|right|Transaction Points]]&lt;br /&gt;
The &#039;&#039;Local 6.2 LU&#039;&#039; just defined must be highlighted so a new &#039;&#039;transaction point&#039;&#039; can be created.&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!TP setting&lt;br /&gt;
!Corresponding AS/400 setting&lt;br /&gt;
!Remark&lt;br /&gt;
|-&lt;br /&gt;
|Name&lt;br /&gt;
|&amp;amp;nbsp;&lt;br /&gt;
|Must be &#039;&#039;*&#039;&#039; (asterisk).&lt;br /&gt;
|-&lt;br /&gt;
|Network LU name&lt;br /&gt;
|&amp;lt;code&amp;gt;DSPNETA&amp;lt;/code&amp;gt;, local control point name (LCLCPNAME)&lt;br /&gt;
|&amp;amp;nbsp;&lt;br /&gt;
|-&lt;br /&gt;
|Network name&lt;br /&gt;
|&amp;lt;code&amp;gt;DSPNETA&amp;lt;/code&amp;gt;, local network ID (LCLNETID)&lt;br /&gt;
|&amp;amp;nbsp;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Leave the other settings at default.&lt;br /&gt;
&lt;br /&gt;
=== Remote 6.2 LUs ===&lt;br /&gt;
[[File:Cfg-remlu.gif|thumb|right|Remote 6.2 LUs]]&lt;br /&gt;
The &#039;&#039;partner&#039;&#039; created above must be highlighted in order to create an associated LU configuration.&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!LU setting&lt;br /&gt;
!Corresponding AS/400 setting&lt;br /&gt;
!Remark&lt;br /&gt;
|-&lt;br /&gt;
|Name&lt;br /&gt;
|&amp;lt;code&amp;gt;DSPNETA&amp;lt;/code&amp;gt;, local control point name (LCLCPNAME)&lt;br /&gt;
|&amp;amp;nbsp;&lt;br /&gt;
|-&lt;br /&gt;
|Network LU name&lt;br /&gt;
|&amp;lt;code&amp;gt;DSPNETA&amp;lt;/code&amp;gt;, local control point name (LCLCPNAME)&lt;br /&gt;
|&amp;amp;nbsp;&lt;br /&gt;
|-&lt;br /&gt;
|Network Qualifier&lt;br /&gt;
|&amp;lt;code&amp;gt;DSPNETA&amp;lt;/code&amp;gt;, local network ID (LCLNETID)&lt;br /&gt;
|&amp;amp;nbsp;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Leave the other settings at default.&lt;br /&gt;
&lt;br /&gt;
If you have more than one AS/400 in an APPN network, just add the corresponding LU names and Network Qualifiers from the other AS/400’s in the same manner. This enables session forwarding by the &#039;&#039;Network Node&#039;&#039; AS/400 as described above.&lt;br /&gt;
&lt;br /&gt;
=== Modes ===&lt;br /&gt;
[[File:Cfg-mode.gif|thumb|right|APLSNAPS mode description]]&lt;br /&gt;
The Remote 6.2 LU(s) created above must be highlighted in order to create an associated mode description.&lt;br /&gt;
&lt;br /&gt;
Since there is no &#039;&#039;good enough&#039;&#039; mode description on the AS/400 by default, create a custom mode &#039;&#039;APLSNAPS&#039;&#039;:&lt;br /&gt;
 CRTMODD MODD(APLSNAPS) COS(#CONNECT) MAXSSN(32) MAXCNV(32) LCLCTLSSN(0) INPACING(7) OUTPACING(7) TEXT(&#039;For Apple SNA.ps&#039;)&lt;br /&gt;
&lt;br /&gt;
Now, set the values of the fields on the right side in the &#039;&#039;Characteristics&#039;&#039; pane in the Window as follows:&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Mode setting&lt;br /&gt;
!Value&lt;br /&gt;
!Corresponding AS/400 setting&lt;br /&gt;
|-&lt;br /&gt;
|Maximum Sessions&lt;br /&gt;
|32&lt;br /&gt;
|Maximum sessions (MAXSSN)&lt;br /&gt;
|-&lt;br /&gt;
|Contention Winner&lt;br /&gt;
|32&lt;br /&gt;
|Maximum conversations (MAXCNV)&lt;br /&gt;
|-&lt;br /&gt;
|Prebound Sessions&lt;br /&gt;
|0&lt;br /&gt;
|Pre-established sessions (PREESTSSN)&lt;br /&gt;
|-&lt;br /&gt;
|Send Pacing&lt;br /&gt;
|7&lt;br /&gt;
|Inbound pacing value (INPACING)&lt;br /&gt;
|-&lt;br /&gt;
|Receive Pacing&lt;br /&gt;
|7&lt;br /&gt;
|Outbound pacing value (OUTPACING)&lt;br /&gt;
|-&lt;br /&gt;
|Maximum RU Upper&lt;br /&gt;
|4096&lt;br /&gt;
|&amp;amp;nbsp;&lt;br /&gt;
|-&lt;br /&gt;
|Maximum RU Lower&lt;br /&gt;
|256&lt;br /&gt;
|&amp;amp;nbsp;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Leave the other settings at default.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; Modes aren’t shared. For each remote LU, you need to re-enter the values outlined above.&lt;br /&gt;
&lt;br /&gt;
It may happen that the gateway refuses to start because it claims there isn’t not enough memory (on the MCP card). Recommended action is to lower &#039;&#039;Maximum Sessions&#039;&#039;, and &#039;&#039;Contention Winner&#039;&#039; settings locally, and on the AS/400 with the &amp;lt;code&amp;gt;CHGMODD&amp;lt;/code&amp;gt; command.&lt;br /&gt;
&lt;br /&gt;
== Gateway Activation ==&lt;br /&gt;
After the gateway configuration has been saved, it is assigned to the existing physical connection using the &#039;&#039;SNA•ps Admin&#039;&#039; application. Launch it. The &#039;&#039;Network Gateway Status&#039;&#039; window appears. One line is displayed for each SNA capable card in the Mac, as shown in the second screen shot above.&lt;br /&gt;
&lt;br /&gt;
Highlight the desired card’s entry, and choose &#039;&#039;Select configuration…&#039;&#039; from the &#039;&#039;Gateway&#039;&#039; menu. Use the dialog box to locate and select the configuration file you&#039;ve created and saved before.&amp;lt;br&amp;gt;&lt;br /&gt;
In the same menu, select &#039;&#039;Change Settings …&#039;&#039; and&lt;br /&gt;
* probably assign a nicer AppleTalk name to the gateway, and&lt;br /&gt;
* in &#039;&#039;Characteristics&#039;&#039; tick all checkboxes except &#039;&#039;Initially Log Line Trace&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
The gateway can then be started in the Gateway menu with &#039;&#039;Start Gateway …&#039;&#039;. A dialog window is shown with a summary. Click &#039;&#039;Start&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&#039;&#039;&#039;Note:&#039;&#039;&#039; It has been shown that&amp;amp;nbsp;— at least with &#039;&#039;SNA•ps Gateway&#039;&#039; version 1.1&amp;amp;nbsp;— trying out configuration settings with manual stop and start sometimes provokes the message that there is insufficient memory. This statement refers to the memory on the corresponding MCP card. Apparently, resources there are not reliably freed. After restarting the computer, the error message is gone.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also in the &#039;&#039;Gateway&#039;&#039; menu, an overview of the available resources can now be displayed with &#039;&#039;Show Gateway …&#039;&#039;. An example can be seen in the second screen shot above.&lt;br /&gt;
&lt;br /&gt;
=== Screenshots ===&lt;br /&gt;
These screenshots show examples of all entities being displayed in short in the &#039;&#039;Show Gateway…&#039;&#039; window, in the second screen shot above.&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;nolines&amp;quot;&amp;gt;&lt;br /&gt;
File:Stat-line.gif&lt;br /&gt;
File:Stat-peer.gif&lt;br /&gt;
File:Stat-loclu.gif&lt;br /&gt;
File:Stat-tp.gif&lt;br /&gt;
File:Stat-remlu.gif&lt;br /&gt;
File:Stat-mode-snasvcmg.gif&lt;br /&gt;
File:Stat-mode-aplsnaps.gif&lt;br /&gt;
File:Stat-sess-snasvcmg.gif&lt;br /&gt;
File:Stat-sess-aplsnaps.gif&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Client configuration: SNA•ps 5250 ==&lt;br /&gt;
In the &#039;&#039;SNA•ps Access/5250&#039;&#039; control panel, switch to &#039;&#039;Virtual Controller&#039;&#039; in the &#039;&#039;Display Configuration&#039;&#039;. The controller name is usually &#039;&#039;QPACTL01&#039;&#039;; the default entry has way too many zeros. Close the control panel to save the changes.&lt;br /&gt;
&lt;br /&gt;
[[File:Dft-connsel.gif|right|thumb|Dialog window to select a default session ]]&lt;br /&gt;
The minimal client configuration just requires the selection of the default connection in the &#039;&#039;Pref(erence)s&#039;&#039; menu. Alternatively, the desired session can be configured directly in the client: Menu &#039;&#039;Session&#039;&#039; → &#039;&#039;Connection …&#039;&#039;. Both ways show a dialog window to select a gateway resource in the AppleTalk network.&lt;br /&gt;
&lt;br /&gt;
Finally, the connection to the SNA gateway selected above is established by selecting &#039;&#039;Connect&#039;&#039; from the &#039;&#039;Session&#039;&#039; menu. After a few seconds, the familiar AS/400 sign-on screen should appear.&lt;br /&gt;
&lt;br /&gt;
Other parameters can then also be set: Larger font for large monitors, alternative key assignments for small Mac keyboards: the numeric keypad is ideal here as a substitute for the lack of function keys, etc. The settings then can be saved in a connection document. When opening such a document, the session is established automatically.&lt;br /&gt;
&lt;br /&gt;
All other settings can be made according to taste.&lt;br /&gt;
&lt;br /&gt;
== Client configuration: SNA•ps Print ==&lt;br /&gt;
Before using this function, a printer on the AS/400 must be configured in the &#039;&#039;SNA•ps Access&#039;&#039; control panel.&lt;br /&gt;
&lt;br /&gt;
In the &#039;&#039;Printer Configuration&#039;&#039; section of the Control Panel, click &#039;&#039;Printer Device List…&#039;&#039; and type in a valid AS/400 style print queue name. This name should &#039;&#039;&#039;not&#039;&#039;&#039; exist on the AS/400, it will be automatically created with the correct settings.&lt;br /&gt;
&lt;br /&gt;
Close the control panel to save the settings. If you get an error message stating the control panel can&#039;t be opened, you probably have the &#039;&#039;SNA•ps 5250&#039;&#039; client running in the background. Close it, and try again.&lt;br /&gt;
&lt;br /&gt;
After launching &#039;&#039;SNA•ps Print&#039;&#039; you will be asked for a file name for the newly to-be-created printer connection. Simply save this document with a meaningful name.&lt;br /&gt;
&lt;br /&gt;
The minimal configuration just requires the selection of the default connection in the &#039;&#039;Pref(erence)s&#039;&#039; menu. Alternatively, the desired session can be configured directly in the client: Menu &#039;&#039;Session&#039;&#039; → &#039;&#039;Connection …&#039;&#039;. Both ways show a dialog window to select a gateway resource in the AppleTalk network.&lt;br /&gt;
&lt;br /&gt;
Finally, the connection to the previously selected SNA gateway is established in the &#039;&#039;Session&#039;&#039; menu by selecting &#039;&#039;Connect&#039;&#039;. The AS/400 creates a printer device file (*DEVD) and a corresponding output queue (*OUTQ) which can then be used by applications on the system.&lt;br /&gt;
&lt;br /&gt;
An IBM 3812 Model 1 printer in SCS mode is emulated.&lt;br /&gt;
&lt;br /&gt;
Everything that is spooled to this new queue ends up in the print routine of &#039;&#039;SNA•ps Print&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
See the other menu items for the mostly self-explaining further functions of &#039;&#039;SNA•ps Print&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Pitfalls ==&lt;br /&gt;
* Neither SNA•ps 5250, nor SNA•ps print can be used on PowerPC machines when connecting via a &#039;&#039;SNA•ps gateway&#039;&#039;. As soon as the connection is to be set, the client crashes with an &#039;&#039;illegal instruction&#039;&#039; error.&amp;lt;ref&amp;gt;This is the first and so far only (productivity) 68k program I’m aware of not running on PowerPC.&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Using the AppleTalk diagnostic tool &#039;&#039;Trawl&#039;&#039; on the gateway Mac itself somehow messes up the AppleTalk stack on it, so that the gateway no longer appears in the manager application. Only a reboot of the gateway computer fixes that error.&lt;br /&gt;
&lt;br /&gt;
== External links ==&lt;br /&gt;
* Wikipedia:&lt;br /&gt;
** [https://en.wikipedia.org/wiki/IBM_Systems_Network_Architecture IBM Systems Network Architecture]&lt;br /&gt;
** [https://en.wikipedia.org/wiki/IBM_Advanced_Program-to-Program_Communication IBM Advanced Program-to-Program Communication]&lt;br /&gt;
** [https://en.wikipedia.org/wiki/IBM_Advanced_Peer-to-Peer_Networking IBM Advanced Peer-to-Peer Networking]&lt;br /&gt;
** [https://en.wikipedia.org/wiki/Synchronous_Data_Link_Control Synchronous Data Link Control]&lt;br /&gt;
** [https://en.wikipedia.org/wiki/A/ROSE Apple Real-time Operating System Environment]&lt;br /&gt;
** [https://en.wikipedia.org/wiki/Message_passing Message Passing]&lt;br /&gt;
** [https://en.wikipedia.org/wiki/AppleTalk AppleTalk]&lt;br /&gt;
** [https://en.wikipedia.org/wiki/LocalTalk LocalTalk]&lt;br /&gt;
* [http://www.mactech.com/articles/develop/issue_04/coprocessor.html Inside The Macintosh Coprocessor Platform And A/ROSE]&lt;br /&gt;
* [https://www.computerwoche.de/a/terminalemulation-bindet-apple-welt-an-as-400-mac-user-haben-direkten-zugriff-auf-as-400-daten,1128406 Terminalemulation bindet Apple-Welt an AS/400], Computerwoche 1993-06-11 (German)&lt;br /&gt;
* [https://www.ibm.com/support/knowledgecenter/en/SSEQ5Y_5.9.0/com.ibm.pcomm.doc/books/html/admin_guide19.htm Administrator&#039;s Guide and Reference, SNA Client/Server Concepts], IBM&lt;br /&gt;
* [https://www.ibm.com/support/knowledgecenter/zosbasics/com.ibm.zos.znetwork/znetwork_6.htm Introduction to networking on the mainframe], IBM&lt;br /&gt;
* [https://web.archive.org/web/20181229140138/http://docwiki.cisco.com/wiki/IBM_Systems_Network_Architecture_Protocols IBM Systems Network Architecture Protocols], Cisco Docwiki (aus dem Archiv)&lt;br /&gt;
* [https://bitsavers.org/pdf/ibm/sna/Z325-6027-0_IBM-Apple_Enterprise_Networking_Guide_for_SNA_Products_199110.pdf Z325-6027-00] IBM/Apple IBM Enterprise Networking Guide for SNA Products, IBM&lt;br /&gt;
* [https://www.ibm.com/common/ssi/cgi-bin/ssialias?infotype=DD&amp;amp;subtype=SM&amp;amp;htmlfid=897/ENUS5733-CSR 5733-CSR IBM AS/400 Client Series End User Products], IBM&lt;br /&gt;
* [https://www.buriedbits.org/macintosh-networking-pre-osx Macintosh networking (pre-OSX)], buriedbits.org&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category: Software Configuration Guide]]&lt;br /&gt;
[[Category: System Administration]]&lt;/div&gt;</summary>
		<author><name>PoC</name></author>
	</entry>
	<entry>
		<id>http://try-as400.pocnet.net/index.php?title=Main_Page&amp;diff=1779</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="http://try-as400.pocnet.net/index.php?title=Main_Page&amp;diff=1779"/>
		<updated>2026-08-08T18:53:44Z</updated>

		<summary type="html">&lt;p&gt;PoC: +S/3x&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This Wiki is intended to help average computer users (probably you) who also are curious about &#039;&#039;&#039;AS/400&#039;&#039;&#039;, &#039;&#039;&#039;iSeries&#039;&#039;&#039;, or &#039;&#039;&#039;IBM i&#039;&#039;&#039; to get started with the system. The platform is in parts dramatically different from many you&#039;ve probably learned about before. This makes it hard to understand the underlying concepts. Additionally, there&#039;s a certain amount of &#039;&#039;slang&#039;&#039;. Without proper translation into terms we know, it&#039;s even more complicated to get going.&lt;br /&gt;
&lt;br /&gt;
Fortunately, there&#039;s a wealth of online resources available in the web. Unfortunately, these are scattered around, sometimes providing insight to special topics while omitting basic information for helping novice users to just get started.&lt;br /&gt;
&lt;br /&gt;
The intention of this information resource is trying to explain the platform in terms of, and comparison to, stuff you might be more familiar with.&lt;br /&gt;
&lt;br /&gt;
Lately, this Wiki will also showcase information regarding other IBM midrange platforms, such as S/36 and S/38.&lt;br /&gt;
&lt;br /&gt;
== Why? ==&lt;br /&gt;
The AS/400 is a huge area to explore. As you probably wouldn’t expect to learn &#039;&#039;everything Linux&#039;&#039; from reading three Wikipedia articles, the same is true for the AS/400 platform. This Wiki has a lot of content but maybe never enough. But it&#039;s slowly growing. Also, existing content is prone to being enhanced and corrected of errors. You may help with this by writing me to &amp;lt;[mailto:webhamster@pocnet.net webhamster@pocnet.net]&amp;gt; and submit correction requests, enhancement requests, or even ask for write access.&lt;br /&gt;
&lt;br /&gt;
The basic motivation for this Wiki is: I had a hard time to learn the basics, and I want to make it easier for you to just get started.&lt;br /&gt;
&lt;br /&gt;
Most content in this Wiki is based on my own experiences with an older 9401-150 machine, running OS/400 V4R5 with latest patches from the early 2000’s. When I describe different machines or OS releases, I‘ll indicate that in the respective text.&lt;br /&gt;
&lt;br /&gt;
Please read &#039;&#039;&#039;[[The Naming of the System]]&#039;&#039;&#039; for my thoughts regarding the regularly fought battle about &#039;&#039;It’s not an AS/400 anymore!&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Evolution ===&lt;br /&gt;
&amp;lt;blockquote&amp;gt;But why should you care for V4? The current version is V7.something!&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Every OS does evolve over time. So does OS/400, or IBM i, as it’s called today. Windows Server 20something bears a certain resemblance to Windows 2000 (not counting the UI changes!). Much stuff you learned in the 2000’s era is outdated and never needed again in modern systems, though. Mac OS 9 from 2001 bears only a slight resemblance to today’s OS X (or &#039;&#039;macOS&#039;&#039; as it’s now called). Most conventional platforms don’t just evolve, they change, often in incompatible ways.&lt;br /&gt;
&lt;br /&gt;
This is different with OS/400. Newer releases of OS/400 carry over &#039;&#039;almost&#039;&#039; all stuff you&#039;d know from V4. Most knowledge you acquired with just V4 isn’t worthless with V7. V7 has &#039;&#039;&#039;additional&#039;&#039;&#039; capabilities to learn.&lt;br /&gt;
&lt;br /&gt;
If you are interested in background information how and by whom the system was developed, see &#039;&#039;&#039;[[History]]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Getting started ==&lt;br /&gt;
If you are interested in getting to know (more) about AS/400 basics, you may read &#039;&#039;&#039;[[About Green Screens and mouse-clickable UIs]]&#039;&#039;&#039; as well as about &#039;&#039;&#039;[[Features that separate the AS/400 from common computer systems]]&#039;&#039;&#039; to get a first glance what makes this platform so unique. This might provide a better decision-making about if you want to continue exploring the AS/400 beyond theoretical statements.&lt;br /&gt;
&lt;br /&gt;
Want to dive deep? You should decide if you want your own machine or if it’s sufficient to have remote access to a machine to start exploring as an ordinary user, without administrative rights. You may start with the latter and get your own machine at a later point in time, though.&lt;br /&gt;
&lt;br /&gt;
* [http://www.rzkh.de &#039;&#039;Holger Scherer&#039;&#039;] has been providing free access to an [http://pub400.com IBM i installation] hosted in his company’s bunker, for people to explore the system, learn and perhaps start programming.&lt;br /&gt;
* If you decide having your own machine is the way to go, I encourage you to start looking at internet auction sites and companies with IBM i expertise for a used box to eventually call [[Your own AS/400|your own]].&lt;br /&gt;
&lt;br /&gt;
The ever growing &#039;&#039;&#039;[[UNIX-User&#039;s Cheater Table]]&#039;&#039;&#039; could probably be helpful in finding out a certain command when you know the command in UNIX, or Linux.&lt;br /&gt;
&lt;br /&gt;
If you’re coming from the IBM mainframe world, you’ll be relieved that many concepts are borrowed from the predecessors of z/OS. If there’s demand, I’ll probably add an extra article for an overview of similarities and differences.&lt;br /&gt;
&lt;br /&gt;
== A word on virtualization ==&lt;br /&gt;
Currently there is no known way to run OS/400 on (virtual) x86 platforms. OS/400 &#039;&#039;can&#039;&#039; be virtualized – on appropriate hardware, driven by IBM POWER CPUs. That is, some kind of IBM POWER based system. But if you have this hardware in the first place, virtualization is probably superfluous.&lt;br /&gt;
&lt;br /&gt;
OS/400 in recent versions can host LPARs for Linux, AIX, and itself, so it’s quite possible to have a good deal of integration the other way &#039;round.&amp;lt;ref&amp;gt;POWER 8 is the first CPU with complete little endian support, which is required by most free and current Linux distros like Debian (ppc64el). For older machines you need to find an appropriately older distro version that still supports big endian (PPC64) CPUs. Currently, Debian PPC64 support is unofficial. See [https://wiki.debian.org/SupportedArchitectures SupportedArchitectures] in the Debian Wiki.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Further Reading ==&lt;br /&gt;
This selection of initial reading may be not applicable to your particular situation, maybe because you’re not (yet) owning an AS/400 or your box came with OS/400 preinstalled.&lt;br /&gt;
&lt;br /&gt;
* [[Getting started with the hardware]], and how to boot the system&lt;br /&gt;
* [[How to access your AS/400]]&lt;br /&gt;
* [[Basic Usage Instructions]]&lt;br /&gt;
* [[How to properly shut down your AS/400]]&lt;br /&gt;
&lt;br /&gt;
A little more advanced topics:&lt;br /&gt;
* [[Installing OS/400]]&lt;br /&gt;
* [[Basic System Administration Tasks explained]]&lt;br /&gt;
* [[Getting Data in and out of your AS/400]]&lt;br /&gt;
* [[Basic Software Development]]&lt;br /&gt;
&lt;br /&gt;
Regarding software development, it might be of interest to have a look at my [https://github.com/PoC-dev GitHub Projects Page].&lt;br /&gt;
&lt;br /&gt;
=== Links to IBM documentation ===&lt;br /&gt;
In the beginning of 2023 I was forced by IBM UK to take offline my publicly available [https://ibmdocs.pocnet.net IBM documents collection]. No opportunity was given to challenge that decision. In addition, it proved to be impossible for me to find/identify a responsible person within IBM to overturn that decision.&lt;br /&gt;
&lt;br /&gt;
Links in this Wiki thus point directly to the [https://www.ibm.com/resources/publications/searchInput IBM Publications Center]. If the list of results is empty, this means IBM doesn&#039;t publish the linked document any longer. Since I&#039;m not allowed to publicly publish &#039;&#039;IBM copyrighted material&#039;&#039;, you probably need to find the linked documents [https://web.archive.org/web/20220221081333/https://ibmdocs.pocnet.net/ elsewhere].&lt;br /&gt;
&lt;br /&gt;
=== See also ===&lt;br /&gt;
* From the English Wikipedia:&lt;br /&gt;
** [[wikipedia:IBM_System_i|IBM System i]]&lt;br /&gt;
** [[wikipedia:IBM_i|IBM i]]&lt;br /&gt;
&lt;br /&gt;
== Restrictions regarding this Wiki ==&lt;br /&gt;
This Wiki is &#039;&#039;read only&#039;&#039; for guest users because of frequent vandalism and spamming. Also, self-creating user accounts isn’t allowed for the very same reasons.&lt;br /&gt;
&lt;br /&gt;
Volunteers are very welcome, especially for correcting my possibly numerous syntactic errors and misplaced commas. Feel free write an e-mail to &amp;lt;[mailto:webhamster@pocnet.net webhamster@pocnet.net]&amp;gt; and I’ll add an account for you.&lt;br /&gt;
&lt;br /&gt;
I’m also happy with any feedback. Even if it’s only to say &#039;&#039;thank you&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Rules regarding this Wiki ==&lt;br /&gt;
Quality of the content comes before quantity. Also, to provide reasonable understandability and searchability for articles, please adhere to the following points:&lt;br /&gt;
* Keep a high quality of language,&lt;br /&gt;
** avoid spelling errors, slipshod procedure descriptions, and abstruse language.&lt;br /&gt;
* Name articles concise and distinctly (Wikis don’t provide a hierarchy),&lt;br /&gt;
** avoid repeating terms in several article names that are better used as a category name.&lt;br /&gt;
* Always add category-tags at end of articles. This permits automatic grouping of related articles and better retrieval if the search function doesn’t provide expected results.&lt;br /&gt;
* Add images sparsely and as additional reference only. Main explanation must be actual text, so&lt;br /&gt;
** automatic translation services can actually translate content,&lt;br /&gt;
** disabled persons can make better use of this Wiki.&lt;br /&gt;
* Don’t flood/plaster articles with full-size pictures. It strains the eyes to read!&lt;br /&gt;
* Adhere to Wikipedia Style when outlining articles:&lt;br /&gt;
** Begin articles with a sentence or two that roughly describes what the article is about, highlight keywords also appearing in the article name,&lt;br /&gt;
** Use separate sections for Weblink collections and footnotes at the very end of the article,&lt;br /&gt;
** Don’t use the Single-Equals sign for sections, this is already implied by the article heading.&lt;br /&gt;
* Be precise when mentioning actual products.&lt;br /&gt;
&lt;br /&gt;
Please consult me before introducing new categories.&lt;br /&gt;
&lt;br /&gt;
== Footnotes ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category: Musings]]&lt;/div&gt;</summary>
		<author><name>PoC</name></author>
	</entry>
	<entry>
		<id>http://try-as400.pocnet.net/index.php?title=UNIX-User%27s_Cheater_Table&amp;diff=1768</id>
		<title>UNIX-User&#039;s Cheater Table</title>
		<link rel="alternate" type="text/html" href="http://try-as400.pocnet.net/index.php?title=UNIX-User%27s_Cheater_Table&amp;diff=1768"/>
		<updated>2026-08-07T12:48:22Z</updated>

		<summary type="html">&lt;p&gt;PoC: Precise command&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This table lists commands available in the &#039;&#039;CL-Environment&#039;&#039;, the classical OS/400-Shell, so to say. These do &#039;&#039;&#039;not&#039;&#039;&#039; apply to &#039;&#039;QSH&#039;&#039; or &#039;&#039;PASE&#039;&#039;, that are UNIX-like environments within OS/400.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!UNIX Command&lt;br /&gt;
!OS/400 Equivalent&lt;br /&gt;
!Remarks&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;|&#039;&#039;&#039;Files and File System&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|&amp;lt;code&amp;gt;cat&amp;lt;/code&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|&amp;lt;code&amp;gt;cpyf&amp;lt;/code&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|Since OS/400 has no concept of stdin/stdout, these functions of cat don&#039;t apply here.&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|&amp;lt;code&amp;gt;cd&amp;lt;/code&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|&amp;lt;code&amp;gt;chgcurlib&amp;lt;/code&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|&amp;amp;nbsp;&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|&amp;lt;code&amp;gt;chmod&amp;lt;/code&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|&amp;lt;code&amp;gt;chgaut&amp;lt;/code&amp;gt;,&amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;grtobjaut&amp;lt;/code&amp;gt;,&amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;rvkobjaut&amp;lt;/code&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|&amp;amp;nbsp;&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|&amp;lt;code&amp;gt;chown&amp;lt;/code&amp;gt;,&amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;chgrp&amp;lt;/code&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|&amp;lt;code&amp;gt;chgobjown&amp;lt;/code&amp;gt;,&amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;chgobjpgp&amp;lt;/code&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|&amp;amp;nbsp;&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|&amp;lt;code&amp;gt;cp&amp;lt;/code&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|&amp;lt;code&amp;gt;crtdupobj&amp;lt;/code&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|&amp;amp;nbsp;&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|&amp;lt;code&amp;gt;dump&amp;lt;/code&amp;gt;,&amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;tar c&amp;lt;/code&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|&amp;lt;code&amp;gt;sav(lib|obj| )&amp;lt;/code&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|&amp;amp;nbsp;&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|&amp;lt;code&amp;gt;ls&amp;lt;/code&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|&amp;lt;code&amp;gt;dspobjaut&amp;lt;/code&amp;gt;,&amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;wrklib&amp;lt;/code&amp;gt;,&amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;wrkobj&amp;lt;/code&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|Shows a scrollable list of selected objects, helps in modifying access rights.&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|&amp;lt;code&amp;gt;mv&amp;lt;/code&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|&amp;lt;code&amp;gt;rnmobj&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;movobj&amp;lt;/code&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|&amp;amp;nbsp;&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|&amp;lt;code&amp;gt;restore&amp;lt;/code&amp;gt;,&amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;tar [x|t]&amp;lt;/code&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|&amp;lt;code&amp;gt;rst(lib|obj| )&amp;lt;/code&amp;gt;,&amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;dspsavf&amp;lt;/code&amp;gt;,&amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;dsptap&amp;lt;/code&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|&amp;amp;nbsp;&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|&amp;lt;code&amp;gt;test -f&amp;lt;/code&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|&amp;lt;code&amp;gt;chkobj&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;chkifsobj&amp;lt;/code&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|&amp;amp;nbsp;&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|&amp;lt;code&amp;gt;vi&amp;lt;/code&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|&amp;lt;code&amp;gt;strseu&amp;lt;/code&amp;gt; for source physical files,&amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;edtf&amp;lt;/code&amp;gt; for stream files,&amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;upddta&amp;lt;/code&amp;gt; for database files.&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|See [[Filesystems and Files on the AS/400]] for details. See [[IBM HTTP-Server for AS/400 Configuration]] for specialised command regarding web server config.&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;|&#039;&#039;&#039;Memory and Processes&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|&amp;lt;code&amp;gt;free&amp;lt;/code&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|&amp;lt;code&amp;gt;wrkshrpool&amp;lt;/code&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|This is for displaying the amount of built-in RAM.&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|&amp;lt;code&amp;gt;crontab -e&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;at&amp;lt;/code&amp;gt; (scheduler)&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|&amp;lt;code&amp;gt;wrkjobscde&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;sbmjob&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;wrkjobq qbatch&amp;lt;/code&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|&amp;amp;nbsp;&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|&amp;lt;code&amp;gt;ps aux&amp;lt;/code&amp;gt;,&amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;ps -edf&amp;lt;/code&amp;gt;,&amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;top&amp;lt;/code&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|&amp;lt;code&amp;gt;wrkactjob&amp;lt;/code&amp;gt;,&amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;wrksysact&amp;lt;/code&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|&amp;amp;nbsp;&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;|&#039;&#039;&#039;Disk and I/O&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|&amp;lt;code&amp;gt;df&amp;lt;/code&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|&amp;lt;code&amp;gt;strsst&amp;lt;/code&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|Access to precise disk space stats is available within &#039;&#039;system service tools&#039;&#039; only.&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|&amp;lt;code&amp;gt;fsck&amp;lt;/code&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|&amp;lt;code&amp;gt;rclstg&amp;lt;/code&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|System needs to be in restricted mode.&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|&amp;lt;code&amp;gt;iostat -x&amp;lt;/code&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|&amp;lt;code&amp;gt;wrkdsksts&amp;lt;/code&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|&amp;amp;nbsp;&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|&amp;lt;code&amp;gt;vmstat&amp;lt;/code&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|&amp;lt;code&amp;gt;dspsyssts&amp;lt;/code&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|Choose view option &#039;&#039;3&#039;&#039; after pressing &amp;lt;code&amp;gt;F19&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;|&#039;&#039;&#039;Networking&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|&amp;lt;code&amp;gt;ping&amp;lt;/code&amp;gt;,&amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;aping&amp;lt;/code&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|&amp;lt;code&amp;gt;ping&amp;lt;/code&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|Surprise, command has same name!&amp;lt;br /&amp;gt;The latter is for SNA APPN.&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|&amp;lt;code&amp;gt;netstat&amp;lt;/code&amp;gt;,&amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;wrkappnsts&amp;lt;/code&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|&amp;lt;code&amp;gt;netstat&amp;lt;/code&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|Surprise, command has same name!&amp;lt;br /&amp;gt;The latter is for SNA APPN.&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;|&#039;&#039;&#039;Development&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|&amp;lt;code&amp;gt;cc&amp;lt;/code&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|&amp;lt;code&amp;gt;crtcmod&amp;lt;/code&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|Create Object File from C-Source.&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|&amp;lt;code&amp;gt;ld&amp;lt;/code&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|&amp;lt;code&amp;gt;crtpgm&amp;lt;/code&amp;gt;,&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;crtsrvpgm&amp;lt;/code&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|Create runnable Program from Object File(s),&amp;lt;br&amp;gt;create Service Program (&amp;quot;Shared Library&amp;quot;) from Object File(s).&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|&amp;lt;code&amp;gt;make&amp;lt;/code&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|&amp;amp;nbsp;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|There is a crude port of &#039;&#039;make&#039;&#039; in the QUSRTOOLS library called [[Setting up TMKMAKE|TMKMAKE]]. See &#039;&#039;QUSRTOOLS/QATTINFO.TMKINFO&#039;&#039; for details.&amp;lt;ref&amp;gt;See also [https://www.mcpressonline.com/programming-other/general/programming-with-make-on-the-as400-part-i Programming with Make on the AS/400, Part I], and [https://www.mcpressonline.com/programming-other/general/programming-with-make-on-the-as400-part-2 Programming with Make on the AS/400, Part 2] on McPress Online.&amp;lt;/ref&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|&amp;lt;code&amp;gt;configure&amp;lt;/code&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|&amp;amp;thinsp;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|No equivalent to GNU autoconf. Possible workaround: Manually tailored, static, universal &#039;&#039;config.h&#039;&#039; for each OS-Release (Compiler Version) based on existing documentation and/or manual tests.&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|&amp;lt;code&amp;gt;diff&amp;lt;/code&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|&amp;lt;code&amp;gt;cmppfm&amp;lt;/code&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|&amp;amp;nbsp;&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|&amp;lt;code&amp;gt;patch&amp;lt;/code&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|&amp;lt;code&amp;gt;mrgsrc&amp;lt;/code&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|&amp;amp;nbsp;&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;|&#039;&#039;&#039;Other Topics&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|&amp;lt;code&amp;gt;lpq&amp;lt;/code&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|&amp;lt;code&amp;gt;wrkoutq&amp;lt;/code&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|Displays all configured printer queues and count of entries.&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|&amp;lt;code&amp;gt;mailx&amp;lt;/code&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|&amp;lt;code&amp;gt;dspmsg&amp;lt;/code&amp;gt;,&amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;snddst&amp;lt;/code&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|Cron and at send mail if there was output. OS/400 sends &#039;&#039;messages&#039;&#039; and generates printer output (spooled file). Sending (SMTP) mail from the command line utilises a completely different facility.&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|&amp;lt;code&amp;gt;mt&amp;lt;/code&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|&amp;lt;code&amp;gt;dsptap&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;chktap&amp;lt;/code&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|&amp;amp;nbsp;&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|&amp;lt;code&amp;gt;mysql&amp;lt;/code&amp;gt;,&amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;isql&amp;lt;/code&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|&amp;lt;code&amp;gt;strsql&amp;lt;/code&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|Not limited to &#039;&#039;mysql&#039;&#039;, but more like a placeholder for any command line client accessing a database for entering SQL queries directly.&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|&amp;lt;code&amp;gt;whoami&amp;lt;/code&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|&amp;lt;code&amp;gt;dspjob&amp;lt;/code&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|&amp;amp;nbsp;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The table will be expanded over time.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Basic Commands]]&lt;br /&gt;
&lt;br /&gt;
== Footnotes ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category: Basic Knowledge‏]]&lt;/div&gt;</summary>
		<author><name>PoC</name></author>
	</entry>
	<entry>
		<id>http://try-as400.pocnet.net/index.php?title=Post-Install_Optimizations&amp;diff=1767</id>
		<title>Post-Install Optimizations</title>
		<link rel="alternate" type="text/html" href="http://try-as400.pocnet.net/index.php?title=Post-Install_Optimizations&amp;diff=1767"/>
		<updated>2026-08-05T23:58:16Z</updated>

		<summary type="html">&lt;p&gt;PoC: /* Change Program Defaults */ Secondary Language&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;OS/400 provides a lot of default values for variables (affecting the run-time environment) and program options. Some of these make sense, some of them are kept consistent with earlier versions of the OS because of compatibility reasons by IBM.&lt;br /&gt;
&lt;br /&gt;
Some of these recommendations might not be appropriate for you by various reasons. Don&#039;t apply blindly. Know what you do, use the online help to retrieve background information on the topic in question.&lt;br /&gt;
&lt;br /&gt;
The findings below are based on V4R5 with annotated exceptions for newer releases.&lt;br /&gt;
&lt;br /&gt;
== Housekeeping ==&lt;br /&gt;
These are settings and scheduled jobs to keep your system uncluttered.&lt;br /&gt;
&lt;br /&gt;
=== Change unneeded programs to not run ===&lt;br /&gt;
We most likely don&#039;t need to run &#039;&#039;lpd&#039;&#039; and &#039;&#039;smtpd&#039;&#039; to run per default.&lt;br /&gt;
 CHGLPDA    AUTOSTART(*NO)&lt;br /&gt;
 CHGSMTPA   AUTOSTART(*NO)&lt;br /&gt;
&lt;br /&gt;
You can easily check all settings at once by using &amp;lt;code&amp;gt;STRDFU OPTION(5)&amp;lt;/code&amp;gt; on the file &#039;&#039;QUSRSYS/QATOCSTART&#039;&#039;. These are not needed in general. Depending on OS version, not all entries may be available.&lt;br /&gt;
* *DIRSRV&lt;br /&gt;
* *NETSVR&lt;br /&gt;
* *SLP&lt;br /&gt;
&lt;br /&gt;
=== Change uninstalled programs to not run ===&lt;br /&gt;
If you did not install the Ultimedia package, you can remove the pre started job from the QSYSWRK subsystem description to make it not generate an error message at IPL time.&lt;br /&gt;
 RMVPJE SBSD(QSYSWRK) PGM(QUMEDIA/QUMBPJTC)&lt;br /&gt;
&lt;br /&gt;
If you did not install the Directory Services package (aka LDAP), you can remove the auto started jobs from the QSYSWRK subsystem description to make them not generate an error message at IPL time.&lt;br /&gt;
 RMVAJE SBSD(QSYSWRK) JOB(QGLDPUBA)&lt;br /&gt;
 RMVAJE SBSD(QSYSWRK) JOB(QGLDPUBE)&lt;br /&gt;
&lt;br /&gt;
Both is valid and tested for V4R5. Note that newer releases moved the background jobs to the base OS so there is no error message when starting them. I have not tested if they&#039;re required to run, though.&lt;br /&gt;
&lt;br /&gt;
If you did not install the performance tools, you don&#039;t need trying to start the performance data collector:&lt;br /&gt;
 RMVAJE SBSD(QCTL) JOB(QPFRCOL)&lt;br /&gt;
&lt;br /&gt;
I can&#039;t remember if the latter is valid for V4R5. It&#039;s valid for V3R2, though.&lt;br /&gt;
&lt;br /&gt;
=== Cleanup unneeded stuff ===&lt;br /&gt;
These objects come by default at OS install time, are not needed to my knowledge, and thus can be safely deleted:&lt;br /&gt;
 DLTOUTQ    OUTQ(QDKT)&lt;br /&gt;
 DLTOUTQ    OUTQ(QPFROUTQ)&lt;br /&gt;
 DLTOUTQ    OUTQ(QPRINTS)&lt;br /&gt;
 DLTF       FILE(QPRINTS)&lt;br /&gt;
 DLTOUTQ    OUTQ(QPRINT2)&lt;br /&gt;
 DLTF       FILE(QPRINT2)&lt;br /&gt;
 DLTOUTQ    OUTQ(QTPPPOUTQ)&lt;br /&gt;
 DLTDEVD    DEVD(QESPAP)&lt;br /&gt;
 DLTDEVD    DEVD(QIADSP)&lt;br /&gt;
 DLTDEVD    DEVD(QIAPRT)&lt;br /&gt;
 DLTDEVD    DEVD(QQAHOST)&lt;br /&gt;
 DLTDEVD    DEVD(QTIDA)&lt;br /&gt;
 DLTDEVD    DEVD(QTIDA2)&lt;br /&gt;
 DLTCTLD    CTLD(QESCTL)&lt;br /&gt;
 DLTCTLD    CTLD(QTICTL)&lt;br /&gt;
 DLTLIND    LIND(QESLINE)&lt;br /&gt;
 DLTLIND    LIND(QTILINE)&lt;br /&gt;
&lt;br /&gt;
== System Values ==&lt;br /&gt;
System values are like environment variables as known from common operating systems. They influence system operation. I recommend the following changes.&lt;br /&gt;
&lt;br /&gt;
=== System Control ===&lt;br /&gt;
* Change work environment to separate subsystems for different kind of jobs. This also makes it easy to introduce your own subsystems.&lt;br /&gt;
 CHGSYSVAL SYSVAL(QCTLSBSD) VALUE(&#039;QCTL QSYS&#039;)&lt;br /&gt;
* Set automatic DST adjustment, and UTC offset. This value is valid for Central Europe (Berlin, Paris, …) &#039;&#039;&#039;Note!&#039;&#039;&#039; This variable is not available in V4R5. See [[#Weblinks|Weblinks]] below.&lt;br /&gt;
 CHGSYSVAL SYSVAL(QTIMZON) VALUE(&#039;QP0100CET2&#039;)&lt;br /&gt;
* Adjust time to automatically end disconnected interactive jobs (sessions) to one day.&lt;br /&gt;
 CHGSYSVAL SYSVAL(QDSCJOBITV) VALUE(&#039;1440&#039;)&lt;br /&gt;
&lt;br /&gt;
=== (Memory) Allocation ===&lt;br /&gt;
* Adjust automatic performance values only at runtime, not at IPL.&amp;lt;ref&amp;gt;If you change the amount of memory for the machine, temporarily adjust the value to &#039;2&#039;, make the memory change and then change the value back to &#039;3&#039; — no further IPL needed.&amp;lt;/ref&amp;gt; This allows the system to automatically adjust memory allocations and activity levels to minimize paging (disk I/O).&lt;br /&gt;
 CHGSYSVAL SYSVAL(QPFRADJ) VALUE(&#039;3&#039;)&lt;br /&gt;
* Allow memory pools to self adjust the paging block size depending on jobs running. This is called &#039;&#039;Expert Cache&#039;&#039;. You can adjust the maximum active jobs per pool in the &amp;lt;code&amp;gt;WRKSHRPOOL&amp;lt;/code&amp;gt; display.&amp;lt;ref&amp;gt;Press &amp;lt;code&amp;gt;F21&amp;lt;/code&amp;gt; to switch to view 2 or 3 to have adjustment possibilities.&amp;lt;/ref&amp;gt;&lt;br /&gt;
 CHGSHRPOOL POOL(*BASE) PAGING(*CALC)&lt;br /&gt;
 CHGSHRPOOL POOL(*INTERACT) PAGING(*CALC)&lt;br /&gt;
 CHGSHRPOOL POOL(*SPOOL) PAGING(*CALC)&lt;br /&gt;
* Reservations for job related data structures at IPL time. See &amp;lt;code&amp;gt;DSPSYSSTS&amp;lt;/code&amp;gt; and set to slightly more than the &#039;&#039;Jobs in System&#039;&#039; value to be seen there when the system is working &amp;quot;normal&amp;quot;.&amp;lt;ref&amp;gt;Press &amp;lt;code&amp;gt;F21&amp;lt;/code&amp;gt; to switch to view 2 or 3 to see the overall job count.&amp;lt;/ref&amp;gt;&lt;br /&gt;
 CHGSYSVAL SYSVAL(QTOTJOB) VALUE(100)&lt;br /&gt;
* Reservations for job related data structures at IPL time. See &amp;lt;code&amp;gt;WRKACTJOB&amp;lt;/code&amp;gt; and set to slightly more than the &#039;&#039;Active Jobs&#039;&#039; value to be seen there when the system is working &amp;quot;normal&amp;quot;.&lt;br /&gt;
 CHGSYSVAL SYSVAL(QACTJOB) VALUE(95)&lt;br /&gt;
* Maximize TCP buffers for maximum performance, especially on faster links.&lt;br /&gt;
 CHGTCPA TCPRCVBUF(8388608) TCPSNDBUF(8388608)&lt;br /&gt;
* Make sure, database tasks can use system resources as needed.&lt;br /&gt;
 CHGSYSVAL SYSVAL(QQRYDEGREE) VALUE(*OPTIMIZE)&lt;br /&gt;
* When interactive jobs require more CPU time than being allowed by default (2 seconds),&amp;lt;ref&amp;gt;This is set in *CLS objects.&amp;lt;/ref&amp;gt; to finish a block of processing, allow that memory to be taken from the *BASE pool. Advantage: The QINTER subsystem pool will not be subject to auto adjustment because of jobs which are supposed to run in batch.&lt;br /&gt;
 CHGSYSVAL SYSVAL(QTSEPOOL) VALUE(*BASE)&lt;br /&gt;
&lt;br /&gt;
=== Message-and-Logging ===&lt;br /&gt;
* Allow immediate deletion of problem reports.&lt;br /&gt;
 CHGSYSVAL SYSVAL(QPRBHLDITV) VALUE(0)&lt;br /&gt;
* Do not log software errors. We can&#039;t do much about these anyway, seen from a hobbyist viewpoint.&lt;br /&gt;
 CHGSYSVAL SYSVAL(QSFWERRLOG) VALUE(*NOLOG)&lt;br /&gt;
* Maximize Central Syslog (viewable with &amp;lt;code&amp;gt;DSPLOG&amp;lt;/code&amp;gt; size to lessen rotation frequency. Depending on OS version only &#039;&#039;VALUE(32767)&#039;&#039; may be valid.&lt;br /&gt;
 CHGSYSVAL SYSVAL(QHSTLOGSIZ) VALUE(*DAILY)&lt;br /&gt;
* Raise allowed unsuccessful sign on tries before taking action.&lt;br /&gt;
 CHGSYSVAL SYSVAL(QMAXSIGN) VALUE(&#039;15&#039;)&lt;br /&gt;
* Minimize logging for sessions disconnected beause of device errors.&lt;br /&gt;
 CHGSYSVAL SYSVAL(QDEVRCYACN) VALUE(*ENDJOBNOLIST)&lt;br /&gt;
&lt;br /&gt;
=== Security System Values ===&lt;br /&gt;
* Unrestrict automatic creation of system objects triggered by external (network) requests.&lt;br /&gt;
 CHGSYSVAL SYSVAL(QAUTOVRT) VALUE(*NOMAX)&lt;br /&gt;
* Allow restore with all security relevant flags.&lt;br /&gt;
 CHGSYSVAL SYSVAL(QALWOBJRST) VALUE(*ALL)&lt;br /&gt;
* For TCP connections to work, we need encrypted passwords.&lt;br /&gt;
 CHGDDMTCPA PWDRQD(*ENCRYPTED)&lt;br /&gt;
* Allow &#039;&#039;QSYSOPR&#039;&#039; signon to all devices.&lt;br /&gt;
 CHGSYSVAL SYSVAL(QLMTSECOFR) VALUE(&#039;0&#039;)&lt;br /&gt;
* Raise maximum password length to maximum value.&amp;lt;ref&amp;gt;In newer OS versions, an additional variable &#039;&#039;QPWDLVL&#039;&#039; allows even longer passwords.&amp;lt;/ref&amp;gt;&lt;br /&gt;
 CHGSYSVAL SYSVAL(QPWDMAXLEN) VALUE(10)&lt;br /&gt;
* Raise minimum  passsword length for security reasons.&lt;br /&gt;
 CHGSYSVAL SYSVAL(QPWDMINLEN) VALUE(8)&lt;br /&gt;
&lt;br /&gt;
=== Misc ===&lt;br /&gt;
* PTF install shall be done on unattended IPL time, and don&#039;t try to report problems to IBM directly.&amp;lt;ref&amp;gt;Needs prior setup for &#039;&#039;Electronic Customer Support&#039;&#039;.&amp;lt;/ref&amp;gt;&lt;br /&gt;
 CHGSRVA PTFINSTYP(*DLYALL) RPTPRBAUTO(*NO)&lt;br /&gt;
* Provide European style formatting.&lt;br /&gt;
 CHGSYSVAL SYSVAL(QCURSYM) VALUE(&#039;€&#039;)&lt;br /&gt;
 CHGSYSVAL SYSVAL(QDECFMT) VALUE(&#039;J&#039;)&lt;br /&gt;
 CHGSYSVAL SYSVAL(QSRTSEQ) VALUE(*LANGIDUNQ)&amp;lt;ref&amp;gt;This value isn&#039;t available with V4R5. You can use &#039;&#039;*LANGIDSHR&#039;&#039; there.&amp;lt;/ref&amp;gt;&lt;br /&gt;
 CHGSYSVAL SYSVAL(QDATFMT) VALUE(&#039;DMY&#039;)&amp;lt;ref&amp;gt;Default value for 2924 (US English) is MDY.&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Allow background compiling in PDM as ordinary user, and submitting batch jobs in general.&lt;br /&gt;
 GRTOBJAUT OBJ(QGPL/QBATCH) OBJTYPE(*JOBD) USER(*PUBLIC) AUT(*USE)&lt;br /&gt;
* Tweaking automatic cleanup (like &#039;&#039;logrotate&#039;&#039;).&lt;br /&gt;
 CHGCLNUP  ALWCLNUP(*YES) STRTIME(&#039;02:22:22&#039;) USRMSG(7) SYSMSG(3) SYSPRT(7) SYSLOG(14) CALITM(*KEEP)&lt;br /&gt;
* Change general SNA networking attributes.  This is one &#039;&#039;&#039;long&#039;&#039;&#039; line. Take care to get it completely.&lt;br /&gt;
 CHGNETA JOBACN(*SEARCH) VRTAUTODEV(254) MDMCNTRYID(DE)&lt;br /&gt;
&lt;br /&gt;
=== Charset Conversion ===&lt;br /&gt;
In addition, OS/400 has a default value of 65535 for &amp;lt;code&amp;gt;QCCSID&amp;lt;/code&amp;gt;. It should be set to a value being dependent on the installed language, to enable automatic translation of data on disk to the display device, and back. For Germany, the correct value is 273, and for US, it&#039;s 37. A good hint is to check your 5250 emulator program for possible values.&lt;br /&gt;
&lt;br /&gt;
== IPL Customization ==&lt;br /&gt;
With this procedure, the current startup program for the OS can be retrieved for easy customization.&lt;br /&gt;
 RTVCLSRC   PGM(QSTRUP) SRCFILE(QCLSRC)&lt;br /&gt;
 WRKMBRPDM  FILE(QCLSRC) MBR(QSTRUP) MBRTYPE(CLP)&lt;br /&gt;
 CRTCLPGM   PGM(QGPL/QSTRUP)&lt;br /&gt;
&lt;br /&gt;
To activate your changes, run &amp;lt;code&amp;gt;WRKSYSVAL SYSVAL(QSTRUPPGM)&amp;lt;/code&amp;gt; and change the values to reflect the new program object in QGPL. &#039;&#039;&#039;Note&#039;&#039;&#039;: On a used system&#039;s install, the previous owner might have already done a customized QSTRUP. See &amp;lt;code&amp;gt;DSPSYSVAL QSTRUPPGM&amp;lt;/code&amp;gt; which one is the currently set startup program before accidentally overwriting!&lt;br /&gt;
&lt;br /&gt;
Notable use cases for changing &amp;lt;code&amp;gt;QSTRUP&amp;lt;/code&amp;gt; would be to make SNA Distribution Services, and TCP/IP (on older releases than V4R5) start at IPL time.&lt;br /&gt;
&lt;br /&gt;
New entries must be located after the &#039;&#039;IF COND&#039;&#039; statement and &#039;&#039;DONE:&#039;&#039; label. Always put a &#039;&#039;MONMSG MSGID(CPF0000)&#039;&#039; after each statement. Failing to do so will not ignore any errors but make the IPL script terminate abnormally in case of an error and possibly leave you with an inaccessible system.&lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
* Start TCP/IP:&lt;br /&gt;
 QSYS/STRTCP&lt;br /&gt;
 MONMSG MSGID(CPF0000)&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&#039;&#039;&#039;Note:&#039;&#039;&#039; TCP/IP on V4R5 and later is by IBM provided default automatically started with an appropriate autostart entry &amp;lt;code&amp;gt;struptcpip&amp;lt;/code&amp;gt; in the &amp;lt;code&amp;gt;qsyswrk&amp;lt;/code&amp;gt; subsystem description. No action is necessary in the startup CL!&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Start SNADS:&lt;br /&gt;
 QSYS/STRSBS SBSD(QSNADS)&lt;br /&gt;
 MONMSG MSGID(CPF0000)&lt;br /&gt;
&lt;br /&gt;
== Change Program Defaults ==&lt;br /&gt;
This establishes different default behavior of some programs which makes life somewhat easier.&amp;lt;ref&amp;gt;Some people highly oppose against changing default values because the default values have been provided for a reason. But then, the &amp;lt;code&amp;gt;CHGCMDDFT&amp;lt;/code&amp;gt; also has been provided for a reason.&amp;lt;/ref&amp;gt; At least noting down the changed programs and their former values is recommended, for example in &amp;lt;code&amp;gt;QGPL/QTXTSRC.CMDDFT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&#039;&#039;&#039;Note:&#039;&#039;&#039; CL applications might run a command with the changed default values, in turn combining (new) defaults and submitted parameters into an invalid combination of parameters which might lead to run-time errors. As far as I&#039;m aware, my proposed changes are compatible with such situations.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* File creation and change defaults:&lt;br /&gt;
** Enforce immediate return to program error handling instead of make programs seem to hang (&amp;lt;code&amp;gt;wait…&amp;lt;/code&amp;gt;),&lt;br /&gt;
** Enforce reusing deleted record space,&amp;lt;ref&amp;gt;If there is no access path defined, sequentially read records are no longer guaranteed to *be in timely order (FIFO)!&amp;lt;/ref&amp;gt;&lt;br /&gt;
** Remove sizing restrictions,&amp;lt;ref&amp;gt;A runaway process filling the disks to 100&amp;amp;thinsp;% is not stopped prior!&amp;lt;/ref&amp;gt;&lt;br /&gt;
** Use a smaller access path size for probably increased performance,&lt;br /&gt;
** Allow automatic LF rebuild when running &amp;lt;code&amp;gt;chgpf&amp;lt;/code&amp;gt;.&lt;br /&gt;
 CHGCMDDFT  CMD(CRTPF) NEWDFT(&#039;SIZE(*NOMAX *N *N) WAITFILE(*IMMED) WAITRCD(*IMMED) REUSEDLT(*YES)&#039;)&lt;br /&gt;
 CHGCMDDFT  CMD(CRTSRCPF) NEWDFT(&#039;SIZE(*NOMAX *N *N) ACCPTHSIZ(*MAX4GB)&#039;)&lt;br /&gt;
 CHGCMDDFT  CMD(CHGPF) NEWDFT(&#039;DLTDEPLF(*YES) SIZE(*NOMAX *N *N) WAITFILE(*IMMED) WAITRCD(*IMMED) REUSEDLT(*YES)&#039;)&lt;br /&gt;
 CHGCMDDFT  CMD(CRTLF) NEWDFT(&#039;WAITFILE(*IMMED) WAITRCD(*IMMED) ACCPTHSIZ(*MAX4GB)&#039;)&lt;br /&gt;
 CHGCMDDFT  CMD(CHGLF) NEWDFT(&#039;WAITFILE(*IMMED) WAITRCD(*IMMED) ACCPTHSIZ(*MAX4GB)&#039;)&lt;br /&gt;
* Menus usually go into the library with the application&#039;s other objects. Change current library to there, so applications can find their objects.&amp;lt;ref&amp;gt;It might be beneficial to individually use &amp;lt;code&amp;gt;CURLIB(*NOCHG)&amp;lt;/code&amp;gt; for higher level menu objects being put into libraries which are part of the default library search list (&#039;&#039;*LIBL&#039;&#039;) — such as &#039;&#039;QGPL&#039;&#039; — to not needlessly change the default library in a for some users unexpected way.&amp;lt;/ref&amp;gt;&lt;br /&gt;
 CHGCMDDFT  CMD(CRTMNU) NEWDFT(&#039;CURLIB(*MNULIB)&#039;)&lt;br /&gt;
* No unnecessary wait for power down. &amp;lt;code&amp;gt;CONFIRM(*NO)&amp;lt;/code&amp;gt; can be added for newer releases to suppress prompting.&lt;br /&gt;
 CHGCMDDFT  CMD(PWRDWNSYS) NEWDFT(&#039;OPTION(*IMMED) ENDSBSOPT(*NOJOBLOG)&#039;)&lt;br /&gt;
* Don&#039;t waste time displaying a not so very much interesting screen prior to connection.&lt;br /&gt;
 CHGCMDDFT CMD(STRPASTHR) NEWDFT(&#039;PASTHRSCN(*NO)&#039;)&lt;br /&gt;
&lt;br /&gt;
Be aware that reinstalls, or applying PTFs can overwrite command objects and thus their changed default values. Also note, hat installing a secondary language on a system also installs a separate set of &amp;lt;code&amp;gt;*cmd&amp;lt;/code&amp;gt; objects for that language. You may want to apply the defaults with qualified object names to these, too.&lt;br /&gt;
&lt;br /&gt;
== Regular Cleanup jobs ==&lt;br /&gt;
See job comment TEXT for details. These are &#039;&#039;&#039;long&#039;&#039;&#039; lines. Take care to get it completely.&lt;br /&gt;
 ADDJOBSCDE JOB(PRGPRB) CMD(DLTPRB STATUS(*CLOSED)) FRQ(*WEEKLY) SCDDATE(*NONE) SCDDAY(*ALL) SCDTIME(&#039;13:22:00&#039;) MSGQ(*LIBL/QSYSOPR) TEXT(&#039;Purge closed and deletable problem entries&#039;)&lt;br /&gt;
 ADDJOBSCDE JOB(RCLTMPSTG) CMD(RCLTMPSTG DAYS(30)) FRQ(*MONTHLY) SCDDATE(*MONTHSTR) SCDDAY(*NONE) SCDTIME(&#039;13:24:00&#039;) MSGQ(*LIBL/QSYSOPR) TEXT(&#039;Reclaim temporary storage&#039;)&lt;br /&gt;
 ADDJOBSCDE JOB(RTVDSKINF) CMD(RTVDSKINF) FRQ(*MONTHLY) SCDDATE(*MONTHSTR) SCDDAY(*NONE) SCDTIME(&#039;13:34:00&#039;) MSGQ(*LIBL/QSYSOPR) TEXT(&#039;Retrieve disk space stats&#039;)&lt;br /&gt;
 ADDJOBSCDE JOB(QPGMRCLR) CMD(CLRMSGQ MSGQ(QPGMR) CLEAR(*KEEPUNANS)) FRQ(*WEEKLY) SCDDATE(*NONE) SCDDAY(*ALL) SCDTIME(&#039;07:07:07&#039;) RCYACN(*NOSBM) MSGQ(*NONE) TEXT(&#039;Delete uninteresting messages&#039;)&lt;br /&gt;
&lt;br /&gt;
== Re-Enable InfoSeeker ==&lt;br /&gt;
Only necessary for newer V4R4 and newer. If the command isn&#039;t known, don&#039;t bother: Then your release is so new that it&#039;s gone entirely.&lt;br /&gt;
&lt;br /&gt;
See also: [[Reviving InfoSeeker]]&lt;br /&gt;
&lt;br /&gt;
 CRTDTAARA DTAARA(QUSRSYS/QBMGINFSKR) TYPE(*CHAR) LEN(8)&amp;lt;ref&amp;gt;Works in V4R5. The &amp;lt;code&amp;gt;STRINFSKR&amp;lt;/code&amp;gt; command is not included anymore in IBM i 7.1, and probably earlier releases.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Additional Steps tested with V7R2 ==&lt;br /&gt;
After trying to enter SST, one gets the message that the password has expired. But the password cannot be changed. Re-IPL &#039;&#039;&#039;in manual mode&#039;&#039;&#039;, do not IPL but enter DST, and change password as directed.&lt;br /&gt;
&lt;br /&gt;
* Choose &#039;&#039;5. Work with DST environment&#039;&#039; and &#039;&#039;3. Service tools user IDs&#039;&#039;.&lt;br /&gt;
** Disable the &amp;quot;backdoor&amp;quot; profile &#039;&#039;11111111&#039;&#039;,&lt;br /&gt;
** &#039;&#039;Change password&#039;&#039; for &#039;&#039;QSECOFR&#039;&#039;, &#039;&#039;Set password to expired&#039;&#039; to &#039;&#039;2=No&#039;&#039;.&lt;br /&gt;
* Press F12 and choose &#039;&#039;6. Service tools security data&#039;&#039;.&lt;br /&gt;
** Enter 0 into the field &#039;&#039;8. Password expiration interval in days&#039;&#039;, 8 into the &#039;&#039;Selection&#039;&#039; field, and press return.&lt;br /&gt;
** Enter a high number (like 12) into the field &#039;&#039;9. Maximum sign-on attempts allowed&#039;&#039;, 9 into the &#039;&#039;Selection&#039;&#039; field, and press return.&lt;br /&gt;
** Enter 0 into the field &#039;&#039;10. Duplicate password control&#039;&#039;, 10 into the &#039;&#039;Selection&#039;&#039; field, and press return.&lt;br /&gt;
&lt;br /&gt;
Now exit DST.&lt;br /&gt;
&lt;br /&gt;
You may choose to enter SST, enter 7 for &#039;&#039;Work with system security&#039;&#039;, and set &#039;&#039;Allow a service tools user ID with a default and expired password to change its own password&#039;&#039; to &#039;&#039;1=Yes&#039;&#039;. Since we changed password expiry to &#039;&#039;never&#039;&#039;, this step is entirely optional.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Change Command Defaults for File-Commands]]&lt;br /&gt;
* [[How to properly shut down your AS/400]]&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [https://archive.midrange.com/midrange-l/199912/msg01738.html STRINFSKR], Midrange Mailing-List&lt;br /&gt;
* [https://github.com/PoC-dev/as400-autodst as400-autodst], GitHub&lt;br /&gt;
&lt;br /&gt;
== Footnotes ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category: System Administration]]&lt;/div&gt;</summary>
		<author><name>PoC</name></author>
	</entry>
</feed>