<?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-11-12T01:22:58Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.9</generator>
	<entry>
		<id>http://try-as400.pocnet.net/index.php?title=Tape_device_related_system_reference_codes&amp;diff=1858</id>
		<title>Tape device related system reference codes</title>
		<link rel="alternate" type="text/html" href="http://try-as400.pocnet.net/index.php?title=Tape_device_related_system_reference_codes&amp;diff=1858"/>
		<updated>2026-10-24T20:16:42Z</updated>

		<summary type="html">&lt;p&gt;PoC: Added codes seen with tape drives, too&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Older hardware might suffer from &#039;&#039;&#039;tape device related&#039;&#039;&#039; errors more frequently. Interestingly, detailed information is hard to find. This is because &#039;&#039;&#039;system reference codes&#039;&#039;&#039; often refer to a certain piece of hardware (Feature Code) or FC and the actual error code. Because IBM over time released a multitude of tape devices, the possible combinations are plenty. This means, querying an internet search engine most likely will not turn up the desired results.&lt;br /&gt;
&lt;br /&gt;
The following table lists the documented second half of SRCs&amp;lt;ref&amp;gt;System Reference Codes&amp;lt;/ref&amp;gt; for the tape device &#039;&#039;&#039;63A0&#039;&#039;&#039;, which is originally assigned to IBM LTO cartridge tape drives, but is very likely also assigned to similar, generic cartridge drives:&lt;br /&gt;
* Generic HP LTO drives,&lt;br /&gt;
* Quantum DLT drives,&lt;br /&gt;
* HP DDS DAT drives,&lt;br /&gt;
* possibly more.&lt;br /&gt;
&lt;br /&gt;
Interestingly, the subsequent drive itself is shown as type 6382, the SLR/QIC 4&amp;amp;thinsp;GiB drive.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!SRC&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|3010&lt;br /&gt;
|Disk device returned wrong/unexpected response to IOP&lt;br /&gt;
|-&lt;br /&gt;
|3100&lt;br /&gt;
|Tape/CD or disk bus interface error occurred&lt;br /&gt;
|-&lt;br /&gt;
|9020&lt;br /&gt;
|I/O processor detected a SCSI bus configuration error&lt;br /&gt;
|-&lt;br /&gt;
|9100&lt;br /&gt;
|Interface error detected by I/O processor or by tape unit&lt;br /&gt;
|-&lt;br /&gt;
|9101&lt;br /&gt;
|Fibre Channel interface error detected&lt;br /&gt;
|-&lt;br /&gt;
|9102&lt;br /&gt;
|Gateway device&amp;lt;ref&amp;gt;This is related to IBM SAN.&amp;lt;/ref&amp;gt; detected a SCSI interface error&lt;br /&gt;
|-&lt;br /&gt;
|9200&lt;br /&gt;
|I/O processor addressed the tape unit; no response&lt;br /&gt;
|-&lt;br /&gt;
|9201&lt;br /&gt;
|Tape unit command timeout&lt;br /&gt;
|-&lt;br /&gt;
|9202&lt;br /&gt;
|Tape unit failed after Licensed Internal Code was loaded&lt;br /&gt;
|-&lt;br /&gt;
|9210&lt;br /&gt;
|Illegal or unsupported tape unit response&lt;br /&gt;
|-&lt;br /&gt;
|9211&lt;br /&gt;
|Gateway device detected a bus protocol error&lt;br /&gt;
|-&lt;br /&gt;
|9300&lt;br /&gt;
|Tape unit failure&lt;br /&gt;
|-&lt;br /&gt;
|9301&lt;br /&gt;
|Tape device failure, redundancy lost&lt;br /&gt;
|-&lt;br /&gt;
|9302&lt;br /&gt;
|Tape device failure or media error&lt;br /&gt;
|-&lt;br /&gt;
|9303&lt;br /&gt;
|Gateway device failure&lt;br /&gt;
|-&lt;br /&gt;
|9310&lt;br /&gt;
|Licensed Internal Code for the tape unit is not correct&lt;br /&gt;
|-&lt;br /&gt;
|9320&lt;br /&gt;
|Tape device Licensed Internal Code failure&lt;br /&gt;
|-&lt;br /&gt;
|9321&lt;br /&gt;
|Gateway device Licensed Internal Code error&lt;br /&gt;
|-&lt;br /&gt;
|9350&lt;br /&gt;
|Tape unit detected a read or write error on tape medium&lt;br /&gt;
|-&lt;br /&gt;
|9351&lt;br /&gt;
|Tape with excessive error rate was mounted in tape device&lt;br /&gt;
|-&lt;br /&gt;
|9355&lt;br /&gt;
|The data format is incorrect; the tape cannot be read&lt;br /&gt;
|-&lt;br /&gt;
|9500&lt;br /&gt;
|I/O processor Licensed Internal Code error&lt;br /&gt;
|-&lt;br /&gt;
|9800 - 9803&lt;br /&gt;
|I/O processor successfully recovered from temporary error&lt;br /&gt;
|-&lt;br /&gt;
|9810&lt;br /&gt;
|Problem analysis has determined a part should be replaced&lt;br /&gt;
|-&lt;br /&gt;
|9899&lt;br /&gt;
|Problem analysis completed, the problem has been corrected&lt;br /&gt;
|-&lt;br /&gt;
|9900&lt;br /&gt;
|Licensed Internal Code for tape unit was not upgraded&lt;br /&gt;
|-&lt;br /&gt;
|FFF6&lt;br /&gt;
|Tape volume statistics logged (no action required)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Tape Drives on old AS/400]]&lt;br /&gt;
* [[Disk device related system reference codes]]&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [https://www.ibm.com/resources/publications/OutputPubsDetails?PubID=SY44591501 iSeries 270, 800, 810, 820, 825, 830, 840, 870, 890, SB2, and SB3 Analyze Hardware Problems (System Reference Codes)], SY44-5915-01&lt;br /&gt;
&lt;br /&gt;
== Footnotes ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category: Hardware Documentation‏‎]]&lt;br /&gt;
[[Category: System Administration]]&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=Performance_adjustment_for_Solid_State_Memory&amp;diff=1857</id>
		<title>Performance adjustment for Solid State Memory</title>
		<link rel="alternate" type="text/html" href="http://try-as400.pocnet.net/index.php?title=Performance_adjustment_for_Solid_State_Memory&amp;diff=1857"/>
		<updated>2026-10-15T09:18:17Z</updated>

		<summary type="html">&lt;p&gt;PoC: /* Thread multiplier */ Better formatting&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;OS/400 &#039;&#039;&#039;Performance adjustment for Solid State Memory&#039;&#039;&#039; sheds some light on how to tune a system in regard to the almost zero latency for this type of secondary storage.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
OS/400 is an &#039;&#039;paged virtual memory&#039;&#039; platform. There&#039;s no direct &#039;&#039;open a file and read the content into RAM&#039;&#039; system function. All data between secondary and primary storage (historically disk, and RAM) flows through the [[wikipedia:Memory paging|paging code]].&lt;br /&gt;
&lt;br /&gt;
Today, disks are largely replaced with solid state, &#039;&#039;&#039;[[wikipedia:Flash memory|flash based memory]]&#039;&#039;&#039;. It has no moving mechanical parts, eliminates the accompanying access latency, generates no noise, draws less power, generates less heat, and often uses less physical space. Older AS/400 systems can benefit from the [[ZuluSCSI]] parallel SCSI disk emulator.&lt;br /&gt;
&lt;br /&gt;
OS/400 features a so called &#039;&#039;&#039;performance adjustment&#039;&#039;&#039; function, which automatically splits and shifts available memory around between memory pools according to the current workload, the goal is to minimize paging activity. The default threshold values when, and how much memory is moved around are based on the relatively high latency of rotating disk drives. One particular data point is the &#039;&#039;faulting rate&#039;&#039;, essentially how quickly the system tries to bring in data from secondary storage (disk) into primary storage (RAM) for processing. The higher the faulting rate, the more aggressive memory is moved between pools.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&#039;&#039;&#039;Note:&#039;&#039;&#039; Despite the word &#039;&#039;fault&#039;&#039; seemingly indicating a fatal condition, it isn&#039;t. A [[wikipedia:Page fault|page fault]] is a mere indicator that a requested memory location isn&#039;t in main storage and a different code path has to be taken to bring it into main storage before processing can commence. Also, a single page fault can result in multiple memory pages being copied into main storage at once.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Solid state memory allows very high paging rates, impossible with spinning disk drives, but without introducing excessive latency. The performance adjust doesn&#039;t base adjustment calculations on latency, but on faulting rate. On a system with much disk activity, this can lead to memory starvation of less active pools, and frequent invalidation of in-memory cached data due to quick reassignments of memory.&lt;br /&gt;
&lt;br /&gt;
== Work with Shared Pools ==&lt;br /&gt;
The &amp;lt;code&amp;gt;wrkshrpool&amp;lt;/code&amp;gt; command allows to adjust threshold values for the performance adjuster by pressing &amp;lt;code&amp;gt;F11&amp;lt;/code&amp;gt;. You&#039;ll be presented with a table akin to the following. This table shows default values (for V4R5):&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|&amp;amp;nbsp;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Size (%)&lt;br /&gt;
!colspan=&amp;quot;3&amp;quot;|Faults/Second&lt;br /&gt;
|-&lt;br /&gt;
!Pool&lt;br /&gt;
!Priority&lt;br /&gt;
!Minimum&lt;br /&gt;
!Maximum&lt;br /&gt;
!Minimum&lt;br /&gt;
!Thread&lt;br /&gt;
!Maximum&lt;br /&gt;
|-&lt;br /&gt;
|*MACHINE&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|1&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|~25&amp;lt;ref&amp;gt;This value is actually calculated by the system.&amp;lt;/ref&amp;gt;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|100&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|10&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|0&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|10&lt;br /&gt;
|-&lt;br /&gt;
|*BASE&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|1&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|4.99&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|100&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|5&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|0.5&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|2000&lt;br /&gt;
|-&lt;br /&gt;
|*INTERACT&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|2&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|5&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|100&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|10&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|2&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|100&lt;br /&gt;
|-&lt;br /&gt;
|*SPOOL&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|2&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|1&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|100&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|5&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|1&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|100&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
A pool&#039;s &#039;&#039;priority&#039;&#039; is a relative number from 1 to 14. Lower numbers mean higher priority for pools to be served with additional memory, while higher numbered pools are stripped from excess memory earlier.&lt;br /&gt;
&lt;br /&gt;
Some explanation to the meaning of the &#039;&#039;Faults/Second&#039;&#039; values:&lt;br /&gt;
* &#039;&#039;&#039;Minimum&#039;&#039;&#039;: If a pool&#039;s faulting rate drops below this value, the adjuster views the pool as over-allocated and will begin to strip memory away from it to feed other pools.&lt;br /&gt;
* &#039;&#039;&#039;Thread&#039;&#039;&#039;: A multiplier per (active) thread.&lt;br /&gt;
* &#039;&#039;&#039;Maximum&#039;&#039;&#039;: If the pool&#039;s faulting rate exceeds this value, the adjuster considers the pool starved and starts aggressively moving memory into it from other pools.&lt;br /&gt;
&lt;br /&gt;
=== Thread multiplier ===&lt;br /&gt;
Explanation by example: If one user is running an application in the *INTERACT pool and causing 50 faults/second, that single user is experiencing a performance bottleneck. Contrary, if 100 people are using *INTERACT simultaneously and causing the same 50 faults/second, that means each user is only experiencing 0.5 faults/second. No bottleneck.&lt;br /&gt;
&lt;br /&gt;
The system calculates a &#039;&#039;Dynamic Acceptable Fault Target Threshold = Minimum + (Thread Multiplier × Active Threads)&#039;&#039;. If that value exceeds the absolute Maximum value, the latter is considered. Let&#039;s take an example of &#039;&#039;multiplier = 2&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==== Scenario A ====&lt;br /&gt;
The system is quiet (5 active threads)&amp;lt;br&amp;gt;&lt;br /&gt;
50 + (2 × 5) = 60 faults/s&amp;lt;br&amp;gt;&lt;br /&gt;
Because only 5 threads are active, the baseline is 60 faults/s. If overall pool activity exceeds 60 faults/s, adjustment will kick in.&lt;br /&gt;
&lt;br /&gt;
==== Scenario B ====&lt;br /&gt;
Peak hours (200 active threads)&amp;lt;br&amp;gt;&lt;br /&gt;
50 + (2 × 200) = 450 faults/s&amp;lt;br&amp;gt;&lt;br /&gt;
Now 200 threads are actively sharing the pool, and adjustment scales its tolerance up to 450 faults/sec before it considers the pool &amp;quot;starved&amp;quot; enough to warrant moving memory from elsewhere.&lt;br /&gt;
&lt;br /&gt;
==== Scenario C ====&lt;br /&gt;
Extreme burst (600 active threads)&amp;lt;br&amp;gt;&lt;br /&gt;
50 + (2 × 600) = 1250 faults/s&amp;lt;br&amp;gt;&lt;br /&gt;
Because the absolute Maximum is capped at 1000, the math is clipped. The threshold stops scaling and locks firmly at 1000 faults/s.&lt;br /&gt;
&lt;br /&gt;
=== Recommended adjustments ===&lt;br /&gt;
Values printed in &#039;&#039;bold&#039;&#039; are changed (non-default) values.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&#039;&#039;&#039;Note:&#039;&#039;&#039; These values are intended for small scale, or hobbyist systems. If these values hold up for heavy usage has not been established. Expect these values to change over time when additional experience has been gained.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|&amp;amp;nbsp;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Size (%)&lt;br /&gt;
!colspan=&amp;quot;3&amp;quot;|Faults/Second&lt;br /&gt;
|-&lt;br /&gt;
!Pool&lt;br /&gt;
!Priority&lt;br /&gt;
!Minimum&lt;br /&gt;
!Maximum&lt;br /&gt;
!Minimum&lt;br /&gt;
!Thread&lt;br /&gt;
!Maximum&lt;br /&gt;
|-&lt;br /&gt;
|*MACHINE&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|1&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|*DFT&amp;lt;ref&amp;gt;A literal &amp;lt;tt&amp;gt;*DFT&amp;lt;/tt&amp;gt; isn&#039;t actually printed but can be used to reset to the default value if it has been changed prior.&amp;lt;/ref&amp;gt;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;50&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;100&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|0&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;100&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|*BASE&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|1&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|4.99&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|100&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;25&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;5&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;2000&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|*INTERACT&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|2&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|5&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;25&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;50&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;10&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;1000&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|*SPOOL&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;3&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|1&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;10&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;25&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;5&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;1000&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The primary goals behind the suggested values are:&lt;br /&gt;
* Establish hard &#039;&#039;Size %&#039;&#039; limits to prevent pool starvation.&lt;br /&gt;
* Allow for much higher faulting rates (&#039;&#039;Faults/Second&#039;&#039;) before taking action.&lt;br /&gt;
* Using higher scaling values still considers dynamic adjustment up to the raised &#039;&#039;Acceptable Fault Target Threshold&#039;&#039; values, and keeps the basic adjustment logic active.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Post-Install Optimizations]]&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;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=UNIX-User%27s_Cheater_Table&amp;diff=1856</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=1856"/>
		<updated>2026-10-11T21:26:17Z</updated>

		<summary type="html">&lt;p&gt;PoC: Moved to correct column&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;&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;|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;&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;|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=Start_TCP/IP_at_IPL&amp;diff=1855</id>
		<title>Start TCP/IP at IPL</title>
		<link rel="alternate" type="text/html" href="http://try-as400.pocnet.net/index.php?title=Start_TCP/IP_at_IPL&amp;diff=1855"/>
		<updated>2026-10-06T19:28:04Z</updated>

		<summary type="html">&lt;p&gt;PoC: A new V4R5 install revealed that the SBS entry is required with V4R5, too.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;To &#039;&#039;&#039;Start TCP/IP at IPL&#039;&#039;&#039;, you have two options, you need to add a pre-start job entry to the appropriate subsystem description.&lt;br /&gt;
&lt;br /&gt;
For V3, there is no appropriate job description for adding the entry, so it must be created prior.&lt;br /&gt;
 crtjobd jobd(qgpl/qtocstrtcp) jobq(qsys/qsysnomax) TEXT(&#039;ADDAJE QSYSWRK to Start TCP/IP at IPL&#039;) user(qpgmr) rtgdta(&#039;runpty25&#039;) rqsdta(&#039;qsys/strtcp&#039;) log(2 0 *seclvl) jobmsgqmx(*sysval) jobmsgqfl(*wrap)&lt;br /&gt;
&lt;br /&gt;
For V4, an appropriate job queue must be assigned to the already existing job description:&lt;br /&gt;
 chgjobd jobd(qsys/qtocstrtcp) jobq(qsys/qsysnomax)&lt;br /&gt;
&lt;br /&gt;
Next, fix authorities. This applies to all releases up to V4R4.&lt;br /&gt;
 chgobjown obj(qtocstrtcp) objtype(*jobd) newown(qsys)&lt;br /&gt;
 grtobjaut obj(qtocstrtcp) objtype(*jobd) user(qpgmr) aut(*use)&lt;br /&gt;
 rvkobjaut obj(qtocstrtcp) objtype(*jobd) user(*public) aut(*all)&lt;br /&gt;
&lt;br /&gt;
Finally, add the SBS entry. This also applies to all releases.&lt;br /&gt;
 addaje sbsd(qsyswrk) job(struptcpip) jobd(*libl/qtocstrtcp)&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=1854</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=1854"/>
		<updated>2026-10-06T13:03:32Z</updated>

		<summary type="html">&lt;p&gt;PoC: /* See also */ +link&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;
* [[Performance adjustment for Solid State Memory]]&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=Performance_adjustment_for_Solid_State_Memory&amp;diff=1853</id>
		<title>Performance adjustment for Solid State Memory</title>
		<link rel="alternate" type="text/html" href="http://try-as400.pocnet.net/index.php?title=Performance_adjustment_for_Solid_State_Memory&amp;diff=1853"/>
		<updated>2026-10-06T08:51:39Z</updated>

		<summary type="html">&lt;p&gt;PoC: /* Recommended adjustments */ Better wording&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;OS/400 &#039;&#039;&#039;Performance adjustment for Solid State Memory&#039;&#039;&#039; sheds some light on how to tune a system in regard to the almost zero latency for this type of secondary storage.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
OS/400 is an &#039;&#039;paged virtual memory&#039;&#039; platform. There&#039;s no direct &#039;&#039;open a file and read the content into RAM&#039;&#039; system function. All data between secondary and primary storage (historically disk, and RAM) flows through the [[wikipedia:Memory paging|paging code]].&lt;br /&gt;
&lt;br /&gt;
Today, disks are largely replaced with solid state, &#039;&#039;&#039;[[wikipedia:Flash memory|flash based memory]]&#039;&#039;&#039;. It has no moving mechanical parts, eliminates the accompanying access latency, generates no noise, draws less power, generates less heat, and often uses less physical space. Older AS/400 systems can benefit from the [[ZuluSCSI]] parallel SCSI disk emulator.&lt;br /&gt;
&lt;br /&gt;
OS/400 features a so called &#039;&#039;&#039;performance adjustment&#039;&#039;&#039; function, which automatically splits and shifts available memory around between memory pools according to the current workload, the goal is to minimize paging activity. The default threshold values when, and how much memory is moved around are based on the relatively high latency of rotating disk drives. One particular data point is the &#039;&#039;faulting rate&#039;&#039;, essentially how quickly the system tries to bring in data from secondary storage (disk) into primary storage (RAM) for processing. The higher the faulting rate, the more aggressive memory is moved between pools.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&#039;&#039;&#039;Note:&#039;&#039;&#039; Despite the word &#039;&#039;fault&#039;&#039; seemingly indicating a fatal condition, it isn&#039;t. A [[wikipedia:Page fault|page fault]] is a mere indicator that a requested memory location isn&#039;t in main storage and a different code path has to be taken to bring it into main storage before processing can commence. Also, a single page fault can result in multiple memory pages being copied into main storage at once.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Solid state memory allows very high paging rates, impossible with spinning disk drives, but without introducing excessive latency. The performance adjust doesn&#039;t base adjustment calculations on latency, but on faulting rate. On a system with much disk activity, this can lead to memory starvation of less active pools, and frequent invalidation of in-memory cached data due to quick reassignments of memory.&lt;br /&gt;
&lt;br /&gt;
== Work with Shared Pools ==&lt;br /&gt;
The &amp;lt;code&amp;gt;wrkshrpool&amp;lt;/code&amp;gt; command allows to adjust threshold values for the performance adjuster by pressing &amp;lt;code&amp;gt;F11&amp;lt;/code&amp;gt;. You&#039;ll be presented with a table akin to the following. This table shows default values (for V4R5):&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|&amp;amp;nbsp;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Size (%)&lt;br /&gt;
!colspan=&amp;quot;3&amp;quot;|Faults/Second&lt;br /&gt;
|-&lt;br /&gt;
!Pool&lt;br /&gt;
!Priority&lt;br /&gt;
!Minimum&lt;br /&gt;
!Maximum&lt;br /&gt;
!Minimum&lt;br /&gt;
!Thread&lt;br /&gt;
!Maximum&lt;br /&gt;
|-&lt;br /&gt;
|*MACHINE&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|1&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|~25&amp;lt;ref&amp;gt;This value is actually calculated by the system.&amp;lt;/ref&amp;gt;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|100&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|10&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|0&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|10&lt;br /&gt;
|-&lt;br /&gt;
|*BASE&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|1&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|4.99&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|100&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|5&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|0.5&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|2000&lt;br /&gt;
|-&lt;br /&gt;
|*INTERACT&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|2&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|5&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|100&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|10&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|2&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|100&lt;br /&gt;
|-&lt;br /&gt;
|*SPOOL&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|2&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|1&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|100&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|5&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|1&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|100&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
A pool&#039;s &#039;&#039;priority&#039;&#039; is a relative number from 1 to 14. Lower numbers mean higher priority for pools to be served with additional memory, while higher numbered pools are stripped from excess memory earlier.&lt;br /&gt;
&lt;br /&gt;
Some explanation to the meaning of the &#039;&#039;Faults/Second&#039;&#039; values:&lt;br /&gt;
* &#039;&#039;&#039;Minimum&#039;&#039;&#039;: If a pool&#039;s faulting rate drops below this value, the adjuster views the pool as over-allocated and will begin to strip memory away from it to feed other pools.&lt;br /&gt;
* &#039;&#039;&#039;Thread&#039;&#039;&#039;: A multiplier per (active) thread.&lt;br /&gt;
* &#039;&#039;&#039;Maximum&#039;&#039;&#039;: If the pool&#039;s faulting rate exceeds this value, the adjuster considers the pool starved and starts aggressively moving memory into it from other pools.&lt;br /&gt;
&lt;br /&gt;
=== Thread multiplier ===&lt;br /&gt;
Explanation by example: If one user is running an application in the *INTERACT pool and causing 50 faults/second, that single user is experiencing a performance bottleneck. Contrary, if 100 people are using *INTERACT simultaneously and causing the same 50 faults/second, that means each user is only experiencing 0.5 faults/second. No bottleneck.&lt;br /&gt;
&lt;br /&gt;
The system calculates a &#039;&#039;Dynamic Acceptable Fault Target Threshold = Minimum + (Thread Multiplier × Active Threads)&#039;&#039;. If that value exceeds the absolute Maximum value, the latter is considered. Let&#039;s take an example of &#039;&#039;multiplier = 2&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* Scenario A: The system is quiet (5 active threads)&amp;lt;br&amp;gt;&lt;br /&gt;
50 + (2 × 5) = 60 faults/s&amp;lt;br&amp;gt;&lt;br /&gt;
Because only 5 threads are active, the baseline is 60 faults/s. If overall pool activity exceeds 60 faults/s, adjustment will kick in.&lt;br /&gt;
* Scenario B: Peak hours (200 active threads)&amp;lt;br&amp;gt;&lt;br /&gt;
50 + (2 × 200) = 450 faults/s&amp;lt;br&amp;gt;&lt;br /&gt;
Now 200 threads are actively sharing the pool, and adjustment scales its tolerance up to 450 faults/sec before it considers the pool &amp;quot;starved&amp;quot; enough to warrant moving memory from elsewhere.&lt;br /&gt;
* Scenario C: Extreme burst (600 active threads)&amp;lt;br&amp;gt;&lt;br /&gt;
50 + (2 × 600) = 1250 faults/s&amp;lt;br&amp;gt;&lt;br /&gt;
Because the absolute Maximum is capped at 1000, the math is clipped. The threshold stops scaling and locks firmly at 1000 faults/s.&lt;br /&gt;
&lt;br /&gt;
=== Recommended adjustments ===&lt;br /&gt;
Values printed in &#039;&#039;bold&#039;&#039; are changed (non-default) values.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&#039;&#039;&#039;Note:&#039;&#039;&#039; These values are intended for small scale, or hobbyist systems. If these values hold up for heavy usage has not been established. Expect these values to change over time when additional experience has been gained.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|&amp;amp;nbsp;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Size (%)&lt;br /&gt;
!colspan=&amp;quot;3&amp;quot;|Faults/Second&lt;br /&gt;
|-&lt;br /&gt;
!Pool&lt;br /&gt;
!Priority&lt;br /&gt;
!Minimum&lt;br /&gt;
!Maximum&lt;br /&gt;
!Minimum&lt;br /&gt;
!Thread&lt;br /&gt;
!Maximum&lt;br /&gt;
|-&lt;br /&gt;
|*MACHINE&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|1&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|*DFT&amp;lt;ref&amp;gt;A literal &amp;lt;tt&amp;gt;*DFT&amp;lt;/tt&amp;gt; isn&#039;t actually printed but can be used to reset to the default value if it has been changed prior.&amp;lt;/ref&amp;gt;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;50&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;100&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|0&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;100&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|*BASE&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|1&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|4.99&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|100&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;25&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;5&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;2000&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|*INTERACT&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|2&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|5&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;25&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;50&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;10&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;1000&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|*SPOOL&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;3&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|1&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;10&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;25&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;5&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;1000&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The primary goals behind the suggested values are:&lt;br /&gt;
* Establish hard &#039;&#039;Size %&#039;&#039; limits to prevent pool starvation.&lt;br /&gt;
* Allow for much higher faulting rates (&#039;&#039;Faults/Second&#039;&#039;) before taking action.&lt;br /&gt;
* Using higher scaling values still considers dynamic adjustment up to the raised &#039;&#039;Acceptable Fault Target Threshold&#039;&#039; values, and keeps the basic adjustment logic active.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Post-Install Optimizations]]&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;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=Performance_adjustment_for_Solid_State_Memory&amp;diff=1852</id>
		<title>Performance adjustment for Solid State Memory</title>
		<link rel="alternate" type="text/html" href="http://try-as400.pocnet.net/index.php?title=Performance_adjustment_for_Solid_State_Memory&amp;diff=1852"/>
		<updated>2026-10-06T08:43:50Z</updated>

		<summary type="html">&lt;p&gt;PoC: /* Work with Shared Pools */ Better wording&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;OS/400 &#039;&#039;&#039;Performance adjustment for Solid State Memory&#039;&#039;&#039; sheds some light on how to tune a system in regard to the almost zero latency for this type of secondary storage.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
OS/400 is an &#039;&#039;paged virtual memory&#039;&#039; platform. There&#039;s no direct &#039;&#039;open a file and read the content into RAM&#039;&#039; system function. All data between secondary and primary storage (historically disk, and RAM) flows through the [[wikipedia:Memory paging|paging code]].&lt;br /&gt;
&lt;br /&gt;
Today, disks are largely replaced with solid state, &#039;&#039;&#039;[[wikipedia:Flash memory|flash based memory]]&#039;&#039;&#039;. It has no moving mechanical parts, eliminates the accompanying access latency, generates no noise, draws less power, generates less heat, and often uses less physical space. Older AS/400 systems can benefit from the [[ZuluSCSI]] parallel SCSI disk emulator.&lt;br /&gt;
&lt;br /&gt;
OS/400 features a so called &#039;&#039;&#039;performance adjustment&#039;&#039;&#039; function, which automatically splits and shifts available memory around between memory pools according to the current workload, the goal is to minimize paging activity. The default threshold values when, and how much memory is moved around are based on the relatively high latency of rotating disk drives. One particular data point is the &#039;&#039;faulting rate&#039;&#039;, essentially how quickly the system tries to bring in data from secondary storage (disk) into primary storage (RAM) for processing. The higher the faulting rate, the more aggressive memory is moved between pools.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&#039;&#039;&#039;Note:&#039;&#039;&#039; Despite the word &#039;&#039;fault&#039;&#039; seemingly indicating a fatal condition, it isn&#039;t. A [[wikipedia:Page fault|page fault]] is a mere indicator that a requested memory location isn&#039;t in main storage and a different code path has to be taken to bring it into main storage before processing can commence. Also, a single page fault can result in multiple memory pages being copied into main storage at once.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Solid state memory allows very high paging rates, impossible with spinning disk drives, but without introducing excessive latency. The performance adjust doesn&#039;t base adjustment calculations on latency, but on faulting rate. On a system with much disk activity, this can lead to memory starvation of less active pools, and frequent invalidation of in-memory cached data due to quick reassignments of memory.&lt;br /&gt;
&lt;br /&gt;
== Work with Shared Pools ==&lt;br /&gt;
The &amp;lt;code&amp;gt;wrkshrpool&amp;lt;/code&amp;gt; command allows to adjust threshold values for the performance adjuster by pressing &amp;lt;code&amp;gt;F11&amp;lt;/code&amp;gt;. You&#039;ll be presented with a table akin to the following. This table shows default values (for V4R5):&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|&amp;amp;nbsp;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Size (%)&lt;br /&gt;
!colspan=&amp;quot;3&amp;quot;|Faults/Second&lt;br /&gt;
|-&lt;br /&gt;
!Pool&lt;br /&gt;
!Priority&lt;br /&gt;
!Minimum&lt;br /&gt;
!Maximum&lt;br /&gt;
!Minimum&lt;br /&gt;
!Thread&lt;br /&gt;
!Maximum&lt;br /&gt;
|-&lt;br /&gt;
|*MACHINE&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|1&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|~25&amp;lt;ref&amp;gt;This value is actually calculated by the system.&amp;lt;/ref&amp;gt;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|100&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|10&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|0&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|10&lt;br /&gt;
|-&lt;br /&gt;
|*BASE&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|1&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|4.99&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|100&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|5&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|0.5&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|2000&lt;br /&gt;
|-&lt;br /&gt;
|*INTERACT&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|2&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|5&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|100&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|10&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|2&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|100&lt;br /&gt;
|-&lt;br /&gt;
|*SPOOL&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|2&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|1&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|100&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|5&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|1&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|100&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
A pool&#039;s &#039;&#039;priority&#039;&#039; is a relative number from 1 to 14. Lower numbers mean higher priority for pools to be served with additional memory, while higher numbered pools are stripped from excess memory earlier.&lt;br /&gt;
&lt;br /&gt;
Some explanation to the meaning of the &#039;&#039;Faults/Second&#039;&#039; values:&lt;br /&gt;
* &#039;&#039;&#039;Minimum&#039;&#039;&#039;: If a pool&#039;s faulting rate drops below this value, the adjuster views the pool as over-allocated and will begin to strip memory away from it to feed other pools.&lt;br /&gt;
* &#039;&#039;&#039;Thread&#039;&#039;&#039;: A multiplier per (active) thread.&lt;br /&gt;
* &#039;&#039;&#039;Maximum&#039;&#039;&#039;: If the pool&#039;s faulting rate exceeds this value, the adjuster considers the pool starved and starts aggressively moving memory into it from other pools.&lt;br /&gt;
&lt;br /&gt;
=== Thread multiplier ===&lt;br /&gt;
Explanation by example: If one user is running an application in the *INTERACT pool and causing 50 faults/second, that single user is experiencing a performance bottleneck. Contrary, if 100 people are using *INTERACT simultaneously and causing the same 50 faults/second, that means each user is only experiencing 0.5 faults/second. No bottleneck.&lt;br /&gt;
&lt;br /&gt;
The system calculates a &#039;&#039;Dynamic Acceptable Fault Target Threshold = Minimum + (Thread Multiplier × Active Threads)&#039;&#039;. If that value exceeds the absolute Maximum value, the latter is considered. Let&#039;s take an example of &#039;&#039;multiplier = 2&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* Scenario A: The system is quiet (5 active threads)&amp;lt;br&amp;gt;&lt;br /&gt;
50 + (2 × 5) = 60 faults/s&amp;lt;br&amp;gt;&lt;br /&gt;
Because only 5 threads are active, the baseline is 60 faults/s. If overall pool activity exceeds 60 faults/s, adjustment will kick in.&lt;br /&gt;
* Scenario B: Peak hours (200 active threads)&amp;lt;br&amp;gt;&lt;br /&gt;
50 + (2 × 200) = 450 faults/s&amp;lt;br&amp;gt;&lt;br /&gt;
Now 200 threads are actively sharing the pool, and adjustment scales its tolerance up to 450 faults/sec before it considers the pool &amp;quot;starved&amp;quot; enough to warrant moving memory from elsewhere.&lt;br /&gt;
* Scenario C: Extreme burst (600 active threads)&amp;lt;br&amp;gt;&lt;br /&gt;
50 + (2 × 600) = 1250 faults/s&amp;lt;br&amp;gt;&lt;br /&gt;
Because the absolute Maximum is capped at 1000, the math is clipped. The threshold stops scaling and locks firmly at 1000 faults/s.&lt;br /&gt;
&lt;br /&gt;
=== Recommended adjustments ===&lt;br /&gt;
Values printed in &#039;&#039;bold&#039;&#039; are changed (non-default) values.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&#039;&#039;&#039;Note:&#039;&#039;&#039; These values are intended for small scale, or hobbyist systems. If these values hold up for heavy usage has not been established.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|&amp;amp;nbsp;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Size (%)&lt;br /&gt;
!colspan=&amp;quot;3&amp;quot;|Faults/Second&lt;br /&gt;
|-&lt;br /&gt;
!Pool&lt;br /&gt;
!Priority&lt;br /&gt;
!Minimum&lt;br /&gt;
!Maximum&lt;br /&gt;
!Minimum&lt;br /&gt;
!Thread&lt;br /&gt;
!Maximum&lt;br /&gt;
|-&lt;br /&gt;
|*MACHINE&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|1&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|*DFT&amp;lt;ref&amp;gt;A literal &amp;lt;tt&amp;gt;*DFT&amp;lt;/tt&amp;gt; isn&#039;t actually printed but can be used to reset to the default value if it has been changed prior.&amp;lt;/ref&amp;gt;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;50&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;100&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|0&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;100&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|*BASE&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|1&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|4.99&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|100&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;25&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;5&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;2000&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|*INTERACT&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|2&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|5&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;25&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;50&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;10&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;1000&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|*SPOOL&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;3&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|1&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;10&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;25&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;5&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;1000&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The primary goals behind the suggested values are:&lt;br /&gt;
* Establish hard &#039;&#039;Size %&#039;&#039; limits to prevent pool starvation.&lt;br /&gt;
* Allow for much higher faulting rates (&#039;&#039;Faults/Second&#039;&#039;) before taking action.&lt;br /&gt;
* Using higher scaling values still considers dynamic adjustment up to the raised &#039;&#039;Acceptable Fault Target Threshold&#039;&#039; values, and keeps the basic adjustment logic active.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Post-Install Optimizations]]&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;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=Performance_adjustment_for_Solid_State_Memory&amp;diff=1851</id>
		<title>Performance adjustment for Solid State Memory</title>
		<link rel="alternate" type="text/html" href="http://try-as400.pocnet.net/index.php?title=Performance_adjustment_for_Solid_State_Memory&amp;diff=1851"/>
		<updated>2026-10-06T08:42:50Z</updated>

		<summary type="html">&lt;p&gt;PoC: /* Recommended adjustments */ Footnote&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;OS/400 &#039;&#039;&#039;Performance adjustment for Solid State Memory&#039;&#039;&#039; sheds some light on how to tune a system in regard to the almost zero latency for this type of secondary storage.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
OS/400 is an &#039;&#039;paged virtual memory&#039;&#039; platform. There&#039;s no direct &#039;&#039;open a file and read the content into RAM&#039;&#039; system function. All data between secondary and primary storage (historically disk, and RAM) flows through the [[wikipedia:Memory paging|paging code]].&lt;br /&gt;
&lt;br /&gt;
Today, disks are largely replaced with solid state, &#039;&#039;&#039;[[wikipedia:Flash memory|flash based memory]]&#039;&#039;&#039;. It has no moving mechanical parts, eliminates the accompanying access latency, generates no noise, draws less power, generates less heat, and often uses less physical space. Older AS/400 systems can benefit from the [[ZuluSCSI]] parallel SCSI disk emulator.&lt;br /&gt;
&lt;br /&gt;
OS/400 features a so called &#039;&#039;&#039;performance adjustment&#039;&#039;&#039; function, which automatically splits and shifts available memory around between memory pools according to the current workload, the goal is to minimize paging activity. The default threshold values when, and how much memory is moved around are based on the relatively high latency of rotating disk drives. One particular data point is the &#039;&#039;faulting rate&#039;&#039;, essentially how quickly the system tries to bring in data from secondary storage (disk) into primary storage (RAM) for processing. The higher the faulting rate, the more aggressive memory is moved between pools.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&#039;&#039;&#039;Note:&#039;&#039;&#039; Despite the word &#039;&#039;fault&#039;&#039; seemingly indicating a fatal condition, it isn&#039;t. A [[wikipedia:Page fault|page fault]] is a mere indicator that a requested memory location isn&#039;t in main storage and a different code path has to be taken to bring it into main storage before processing can commence. Also, a single page fault can result in multiple memory pages being copied into main storage at once.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Solid state memory allows very high paging rates, impossible with spinning disk drives, but without introducing excessive latency. The performance adjust doesn&#039;t base adjustment calculations on latency, but on faulting rate. On a system with much disk activity, this can lead to memory starvation of less active pools, and frequent invalidation of in-memory cached data due to quick reassignments of memory.&lt;br /&gt;
&lt;br /&gt;
== Work with Shared Pools ==&lt;br /&gt;
The &amp;lt;code&amp;gt;wrkshrpool&amp;lt;/code&amp;gt; command allows to adjust threshold values for the performance adjuster by pressing &amp;lt;code&amp;gt;F11&amp;lt;/code&amp;gt;. You&#039;ll be presented with a table akin to the following. This table shows default values (for V4R5):&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|&amp;amp;nbsp;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Size (%)&lt;br /&gt;
!colspan=&amp;quot;3&amp;quot;|Faults/Second&lt;br /&gt;
|-&lt;br /&gt;
!Pool&lt;br /&gt;
!Priority&lt;br /&gt;
!Minimum&lt;br /&gt;
!Maximum&lt;br /&gt;
!Minimum&lt;br /&gt;
!Thread&lt;br /&gt;
!Maximum&lt;br /&gt;
|-&lt;br /&gt;
|*MACHINE&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|1&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|~25&amp;lt;ref&amp;gt;This value is calculated by the system.&amp;lt;/ref&amp;gt;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|100&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|10&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|0&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|10&lt;br /&gt;
|-&lt;br /&gt;
|*BASE&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|1&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|4.99&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|100&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|5&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|0.5&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|2000&lt;br /&gt;
|-&lt;br /&gt;
|*INTERACT&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|2&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|5&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|100&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|10&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|2&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|100&lt;br /&gt;
|-&lt;br /&gt;
|*SPOOL&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|2&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|1&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|100&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|5&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|1&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|100&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
A pool&#039;s &#039;&#039;priority&#039;&#039; is a relative number from 1 to 14. Lower numbers mean higher priority for pools to be served with additional memory, while higher numbered pools are stripped from excess memory earlier.&lt;br /&gt;
&lt;br /&gt;
Some explanation to the meaning of the &#039;&#039;Faults/Second&#039;&#039; values:&lt;br /&gt;
* &#039;&#039;&#039;Minimum&#039;&#039;&#039;: If a pool&#039;s faulting rate drops below this value, the adjuster views the pool as over-allocated and will begin to strip memory away from it to feed other pools.&lt;br /&gt;
* &#039;&#039;&#039;Thread&#039;&#039;&#039;: A multiplier per (active) thread.&lt;br /&gt;
* &#039;&#039;&#039;Maximum&#039;&#039;&#039;: If the pool&#039;s faulting rate exceeds this value, the adjuster considers the pool starved and starts aggressively moving memory into it from other pools.&lt;br /&gt;
&lt;br /&gt;
=== Thread multiplier ===&lt;br /&gt;
Explanation by example: If one user is running an application in the *INTERACT pool and causing 50 faults/second, that single user is experiencing a performance bottleneck. Contrary, if 100 people are using *INTERACT simultaneously and causing the same 50 faults/second, that means each user is only experiencing 0.5 faults/second. No bottleneck.&lt;br /&gt;
&lt;br /&gt;
The system calculates a &#039;&#039;Dynamic Acceptable Fault Target Threshold = Minimum + (Thread Multiplier × Active Threads)&#039;&#039;. If that value exceeds the absolute Maximum value, the latter is considered. Let&#039;s take an example of &#039;&#039;multiplier = 2&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* Scenario A: The system is quiet (5 active threads)&amp;lt;br&amp;gt;&lt;br /&gt;
50 + (2 × 5) = 60 faults/s&amp;lt;br&amp;gt;&lt;br /&gt;
Because only 5 threads are active, the baseline is 60 faults/s. If overall pool activity exceeds 60 faults/s, adjustment will kick in.&lt;br /&gt;
* Scenario B: Peak hours (200 active threads)&amp;lt;br&amp;gt;&lt;br /&gt;
50 + (2 × 200) = 450 faults/s&amp;lt;br&amp;gt;&lt;br /&gt;
Now 200 threads are actively sharing the pool, and adjustment scales its tolerance up to 450 faults/sec before it considers the pool &amp;quot;starved&amp;quot; enough to warrant moving memory from elsewhere.&lt;br /&gt;
* Scenario C: Extreme burst (600 active threads)&amp;lt;br&amp;gt;&lt;br /&gt;
50 + (2 × 600) = 1250 faults/s&amp;lt;br&amp;gt;&lt;br /&gt;
Because the absolute Maximum is capped at 1000, the math is clipped. The threshold stops scaling and locks firmly at 1000 faults/s.&lt;br /&gt;
&lt;br /&gt;
=== Recommended adjustments ===&lt;br /&gt;
Values printed in &#039;&#039;bold&#039;&#039; are changed (non-default) values.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&#039;&#039;&#039;Note:&#039;&#039;&#039; These values are intended for small scale, or hobbyist systems. If these values hold up for heavy usage has not been established.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|&amp;amp;nbsp;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Size (%)&lt;br /&gt;
!colspan=&amp;quot;3&amp;quot;|Faults/Second&lt;br /&gt;
|-&lt;br /&gt;
!Pool&lt;br /&gt;
!Priority&lt;br /&gt;
!Minimum&lt;br /&gt;
!Maximum&lt;br /&gt;
!Minimum&lt;br /&gt;
!Thread&lt;br /&gt;
!Maximum&lt;br /&gt;
|-&lt;br /&gt;
|*MACHINE&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|1&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|*DFT&amp;lt;ref&amp;gt;A literal &amp;lt;tt&amp;gt;*DFT&amp;lt;/tt&amp;gt; isn&#039;t actually printed but can be used if the value has been changed prior.&amp;lt;/ref&amp;gt;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;50&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;100&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|0&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;100&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|*BASE&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|1&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|4.99&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|100&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;25&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;5&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;2000&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|*INTERACT&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|2&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|5&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;25&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;50&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;10&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;1000&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|*SPOOL&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;3&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|1&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;10&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;25&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;5&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;1000&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The primary goals behind the suggested values are:&lt;br /&gt;
* Establish hard &#039;&#039;Size %&#039;&#039; limits to prevent pool starvation.&lt;br /&gt;
* Allow for much higher faulting rates (&#039;&#039;Faults/Second&#039;&#039;) before taking action.&lt;br /&gt;
* Using higher scaling values still considers dynamic adjustment up to the raised &#039;&#039;Acceptable Fault Target Threshold&#039;&#039; values, and keeps the basic adjustment logic active.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Post-Install Optimizations]]&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;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=Performance_adjustment_for_Solid_State_Memory&amp;diff=1850</id>
		<title>Performance adjustment for Solid State Memory</title>
		<link rel="alternate" type="text/html" href="http://try-as400.pocnet.net/index.php?title=Performance_adjustment_for_Solid_State_Memory&amp;diff=1850"/>
		<updated>2026-10-06T08:39:00Z</updated>

		<summary type="html">&lt;p&gt;PoC: Ready&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;OS/400 &#039;&#039;&#039;Performance adjustment for Solid State Memory&#039;&#039;&#039; sheds some light on how to tune a system in regard to the almost zero latency for this type of secondary storage.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
OS/400 is an &#039;&#039;paged virtual memory&#039;&#039; platform. There&#039;s no direct &#039;&#039;open a file and read the content into RAM&#039;&#039; system function. All data between secondary and primary storage (historically disk, and RAM) flows through the [[wikipedia:Memory paging|paging code]].&lt;br /&gt;
&lt;br /&gt;
Today, disks are largely replaced with solid state, &#039;&#039;&#039;[[wikipedia:Flash memory|flash based memory]]&#039;&#039;&#039;. It has no moving mechanical parts, eliminates the accompanying access latency, generates no noise, draws less power, generates less heat, and often uses less physical space. Older AS/400 systems can benefit from the [[ZuluSCSI]] parallel SCSI disk emulator.&lt;br /&gt;
&lt;br /&gt;
OS/400 features a so called &#039;&#039;&#039;performance adjustment&#039;&#039;&#039; function, which automatically splits and shifts available memory around between memory pools according to the current workload, the goal is to minimize paging activity. The default threshold values when, and how much memory is moved around are based on the relatively high latency of rotating disk drives. One particular data point is the &#039;&#039;faulting rate&#039;&#039;, essentially how quickly the system tries to bring in data from secondary storage (disk) into primary storage (RAM) for processing. The higher the faulting rate, the more aggressive memory is moved between pools.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&#039;&#039;&#039;Note:&#039;&#039;&#039; Despite the word &#039;&#039;fault&#039;&#039; seemingly indicating a fatal condition, it isn&#039;t. A [[wikipedia:Page fault|page fault]] is a mere indicator that a requested memory location isn&#039;t in main storage and a different code path has to be taken to bring it into main storage before processing can commence. Also, a single page fault can result in multiple memory pages being copied into main storage at once.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Solid state memory allows very high paging rates, impossible with spinning disk drives, but without introducing excessive latency. The performance adjust doesn&#039;t base adjustment calculations on latency, but on faulting rate. On a system with much disk activity, this can lead to memory starvation of less active pools, and frequent invalidation of in-memory cached data due to quick reassignments of memory.&lt;br /&gt;
&lt;br /&gt;
== Work with Shared Pools ==&lt;br /&gt;
The &amp;lt;code&amp;gt;wrkshrpool&amp;lt;/code&amp;gt; command allows to adjust threshold values for the performance adjuster by pressing &amp;lt;code&amp;gt;F11&amp;lt;/code&amp;gt;. You&#039;ll be presented with a table akin to the following. This table shows default values (for V4R5):&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|&amp;amp;nbsp;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Size (%)&lt;br /&gt;
!colspan=&amp;quot;3&amp;quot;|Faults/Second&lt;br /&gt;
|-&lt;br /&gt;
!Pool&lt;br /&gt;
!Priority&lt;br /&gt;
!Minimum&lt;br /&gt;
!Maximum&lt;br /&gt;
!Minimum&lt;br /&gt;
!Thread&lt;br /&gt;
!Maximum&lt;br /&gt;
|-&lt;br /&gt;
|*MACHINE&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|1&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|~25&amp;lt;ref&amp;gt;This value is calculated by the system.&amp;lt;/ref&amp;gt;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|100&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|10&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|0&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|10&lt;br /&gt;
|-&lt;br /&gt;
|*BASE&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|1&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|4.99&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|100&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|5&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|0.5&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|2000&lt;br /&gt;
|-&lt;br /&gt;
|*INTERACT&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|2&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|5&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|100&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|10&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|2&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|100&lt;br /&gt;
|-&lt;br /&gt;
|*SPOOL&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|2&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|1&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|100&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|5&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|1&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|100&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
A pool&#039;s &#039;&#039;priority&#039;&#039; is a relative number from 1 to 14. Lower numbers mean higher priority for pools to be served with additional memory, while higher numbered pools are stripped from excess memory earlier.&lt;br /&gt;
&lt;br /&gt;
Some explanation to the meaning of the &#039;&#039;Faults/Second&#039;&#039; values:&lt;br /&gt;
* &#039;&#039;&#039;Minimum&#039;&#039;&#039;: If a pool&#039;s faulting rate drops below this value, the adjuster views the pool as over-allocated and will begin to strip memory away from it to feed other pools.&lt;br /&gt;
* &#039;&#039;&#039;Thread&#039;&#039;&#039;: A multiplier per (active) thread.&lt;br /&gt;
* &#039;&#039;&#039;Maximum&#039;&#039;&#039;: If the pool&#039;s faulting rate exceeds this value, the adjuster considers the pool starved and starts aggressively moving memory into it from other pools.&lt;br /&gt;
&lt;br /&gt;
=== Thread multiplier ===&lt;br /&gt;
Explanation by example: If one user is running an application in the *INTERACT pool and causing 50 faults/second, that single user is experiencing a performance bottleneck. Contrary, if 100 people are using *INTERACT simultaneously and causing the same 50 faults/second, that means each user is only experiencing 0.5 faults/second. No bottleneck.&lt;br /&gt;
&lt;br /&gt;
The system calculates a &#039;&#039;Dynamic Acceptable Fault Target Threshold = Minimum + (Thread Multiplier × Active Threads)&#039;&#039;. If that value exceeds the absolute Maximum value, the latter is considered. Let&#039;s take an example of &#039;&#039;multiplier = 2&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* Scenario A: The system is quiet (5 active threads)&amp;lt;br&amp;gt;&lt;br /&gt;
50 + (2 × 5) = 60 faults/s&amp;lt;br&amp;gt;&lt;br /&gt;
Because only 5 threads are active, the baseline is 60 faults/s. If overall pool activity exceeds 60 faults/s, adjustment will kick in.&lt;br /&gt;
* Scenario B: Peak hours (200 active threads)&amp;lt;br&amp;gt;&lt;br /&gt;
50 + (2 × 200) = 450 faults/s&amp;lt;br&amp;gt;&lt;br /&gt;
Now 200 threads are actively sharing the pool, and adjustment scales its tolerance up to 450 faults/sec before it considers the pool &amp;quot;starved&amp;quot; enough to warrant moving memory from elsewhere.&lt;br /&gt;
* Scenario C: Extreme burst (600 active threads)&amp;lt;br&amp;gt;&lt;br /&gt;
50 + (2 × 600) = 1250 faults/s&amp;lt;br&amp;gt;&lt;br /&gt;
Because the absolute Maximum is capped at 1000, the math is clipped. The threshold stops scaling and locks firmly at 1000 faults/s.&lt;br /&gt;
&lt;br /&gt;
=== Recommended adjustments ===&lt;br /&gt;
Values printed in &#039;&#039;bold&#039;&#039; are changed (non-default) values.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&#039;&#039;&#039;Note:&#039;&#039;&#039; These values are intended for small scale, or hobbyist systems. If these values hold up for heavy usage has not been established.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|&amp;amp;nbsp;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Size (%)&lt;br /&gt;
!colspan=&amp;quot;3&amp;quot;|Faults/Second&lt;br /&gt;
|-&lt;br /&gt;
!Pool&lt;br /&gt;
!Priority&lt;br /&gt;
!Minimum&lt;br /&gt;
!Maximum&lt;br /&gt;
!Minimum&lt;br /&gt;
!Thread&lt;br /&gt;
!Maximum&lt;br /&gt;
|-&lt;br /&gt;
|*MACHINE&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|1&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|25.49&amp;lt;ref&amp;gt;Use literal &amp;lt;tt&amp;gt;*DFT&amp;lt;/tt&amp;gt; to reset to default, if unsure.&amp;lt;/ref&amp;gt;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;50&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;100&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|0&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;100&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|*BASE&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|1&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|4.99&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|100&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;25&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;5&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;2000&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|*INTERACT&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|2&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|5&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;25&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;50&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;10&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;1000&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|*SPOOL&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;3&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|1&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;10&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;25&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;5&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;1000&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The primary goals behind the suggested values are:&lt;br /&gt;
* Establish hard &#039;&#039;Size %&#039;&#039; limits to prevent pool starvation.&lt;br /&gt;
* Allow for much higher faulting rates (&#039;&#039;Faults/Second&#039;&#039;) before taking action.&lt;br /&gt;
* Using higher scaling values still considers dynamic adjustment up to the raised &#039;&#039;Acceptable Fault Target Threshold&#039;&#039; values, and keeps the basic adjustment logic active.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Post-Install Optimizations]]&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;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=Performance_adjustment_for_Solid_State_Memory&amp;diff=1849</id>
		<title>Performance adjustment for Solid State Memory</title>
		<link rel="alternate" type="text/html" href="http://try-as400.pocnet.net/index.php?title=Performance_adjustment_for_Solid_State_Memory&amp;diff=1849"/>
		<updated>2026-10-06T08:38:38Z</updated>

		<summary type="html">&lt;p&gt;PoC: /* Recommended adjustments */ Better wording&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{FIXME|Finish article}}&lt;br /&gt;
OS/400 &#039;&#039;&#039;Performance adjustment for Solid State Memory&#039;&#039;&#039; sheds some light on how to tune a system in regard to the almost zero latency for this type of secondary storage.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
OS/400 is an &#039;&#039;paged virtual memory&#039;&#039; platform. There&#039;s no direct &#039;&#039;open a file and read the content into RAM&#039;&#039; system function. All data between secondary and primary storage (historically disk, and RAM) flows through the [[wikipedia:Memory paging|paging code]].&lt;br /&gt;
&lt;br /&gt;
Today, disks are largely replaced with solid state, &#039;&#039;&#039;[[wikipedia:Flash memory|flash based memory]]&#039;&#039;&#039;. It has no moving mechanical parts, eliminates the accompanying access latency, generates no noise, draws less power, generates less heat, and often uses less physical space. Older AS/400 systems can benefit from the [[ZuluSCSI]] parallel SCSI disk emulator.&lt;br /&gt;
&lt;br /&gt;
OS/400 features a so called &#039;&#039;&#039;performance adjustment&#039;&#039;&#039; function, which automatically splits and shifts available memory around between memory pools according to the current workload, the goal is to minimize paging activity. The default threshold values when, and how much memory is moved around are based on the relatively high latency of rotating disk drives. One particular data point is the &#039;&#039;faulting rate&#039;&#039;, essentially how quickly the system tries to bring in data from secondary storage (disk) into primary storage (RAM) for processing. The higher the faulting rate, the more aggressive memory is moved between pools.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&#039;&#039;&#039;Note:&#039;&#039;&#039; Despite the word &#039;&#039;fault&#039;&#039; seemingly indicating a fatal condition, it isn&#039;t. A [[wikipedia:Page fault|page fault]] is a mere indicator that a requested memory location isn&#039;t in main storage and a different code path has to be taken to bring it into main storage before processing can commence. Also, a single page fault can result in multiple memory pages being copied into main storage at once.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Solid state memory allows very high paging rates, impossible with spinning disk drives, but without introducing excessive latency. The performance adjust doesn&#039;t base adjustment calculations on latency, but on faulting rate. On a system with much disk activity, this can lead to memory starvation of less active pools, and frequent invalidation of in-memory cached data due to quick reassignments of memory.&lt;br /&gt;
&lt;br /&gt;
== Work with Shared Pools ==&lt;br /&gt;
The &amp;lt;code&amp;gt;wrkshrpool&amp;lt;/code&amp;gt; command allows to adjust threshold values for the performance adjuster by pressing &amp;lt;code&amp;gt;F11&amp;lt;/code&amp;gt;. You&#039;ll be presented with a table akin to the following. This table shows default values (for V4R5):&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|&amp;amp;nbsp;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Size (%)&lt;br /&gt;
!colspan=&amp;quot;3&amp;quot;|Faults/Second&lt;br /&gt;
|-&lt;br /&gt;
!Pool&lt;br /&gt;
!Priority&lt;br /&gt;
!Minimum&lt;br /&gt;
!Maximum&lt;br /&gt;
!Minimum&lt;br /&gt;
!Thread&lt;br /&gt;
!Maximum&lt;br /&gt;
|-&lt;br /&gt;
|*MACHINE&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|1&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|~25&amp;lt;ref&amp;gt;This value is calculated by the system.&amp;lt;/ref&amp;gt;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|100&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|10&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|0&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|10&lt;br /&gt;
|-&lt;br /&gt;
|*BASE&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|1&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|4.99&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|100&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|5&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|0.5&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|2000&lt;br /&gt;
|-&lt;br /&gt;
|*INTERACT&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|2&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|5&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|100&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|10&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|2&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|100&lt;br /&gt;
|-&lt;br /&gt;
|*SPOOL&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|2&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|1&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|100&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|5&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|1&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|100&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
A pool&#039;s &#039;&#039;priority&#039;&#039; is a relative number from 1 to 14. Lower numbers mean higher priority for pools to be served with additional memory, while higher numbered pools are stripped from excess memory earlier.&lt;br /&gt;
&lt;br /&gt;
Some explanation to the meaning of the &#039;&#039;Faults/Second&#039;&#039; values:&lt;br /&gt;
* &#039;&#039;&#039;Minimum&#039;&#039;&#039;: If a pool&#039;s faulting rate drops below this value, the adjuster views the pool as over-allocated and will begin to strip memory away from it to feed other pools.&lt;br /&gt;
* &#039;&#039;&#039;Thread&#039;&#039;&#039;: A multiplier per (active) thread.&lt;br /&gt;
* &#039;&#039;&#039;Maximum&#039;&#039;&#039;: If the pool&#039;s faulting rate exceeds this value, the adjuster considers the pool starved and starts aggressively moving memory into it from other pools.&lt;br /&gt;
&lt;br /&gt;
=== Thread multiplier ===&lt;br /&gt;
Explanation by example: If one user is running an application in the *INTERACT pool and causing 50 faults/second, that single user is experiencing a performance bottleneck. Contrary, if 100 people are using *INTERACT simultaneously and causing the same 50 faults/second, that means each user is only experiencing 0.5 faults/second. No bottleneck.&lt;br /&gt;
&lt;br /&gt;
The system calculates a &#039;&#039;Dynamic Acceptable Fault Target Threshold = Minimum + (Thread Multiplier × Active Threads)&#039;&#039;. If that value exceeds the absolute Maximum value, the latter is considered. Let&#039;s take an example of &#039;&#039;multiplier = 2&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* Scenario A: The system is quiet (5 active threads)&amp;lt;br&amp;gt;&lt;br /&gt;
50 + (2 × 5) = 60 faults/s&amp;lt;br&amp;gt;&lt;br /&gt;
Because only 5 threads are active, the baseline is 60 faults/s. If overall pool activity exceeds 60 faults/s, adjustment will kick in.&lt;br /&gt;
* Scenario B: Peak hours (200 active threads)&amp;lt;br&amp;gt;&lt;br /&gt;
50 + (2 × 200) = 450 faults/s&amp;lt;br&amp;gt;&lt;br /&gt;
Now 200 threads are actively sharing the pool, and adjustment scales its tolerance up to 450 faults/sec before it considers the pool &amp;quot;starved&amp;quot; enough to warrant moving memory from elsewhere.&lt;br /&gt;
* Scenario C: Extreme burst (600 active threads)&amp;lt;br&amp;gt;&lt;br /&gt;
50 + (2 × 600) = 1250 faults/s&amp;lt;br&amp;gt;&lt;br /&gt;
Because the absolute Maximum is capped at 1000, the math is clipped. The threshold stops scaling and locks firmly at 1000 faults/s.&lt;br /&gt;
&lt;br /&gt;
=== Recommended adjustments ===&lt;br /&gt;
Values printed in &#039;&#039;bold&#039;&#039; are changed (non-default) values.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&#039;&#039;&#039;Note:&#039;&#039;&#039; These values are intended for small scale, or hobbyist systems. If these values hold up for heavy usage has not been established.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|&amp;amp;nbsp;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Size (%)&lt;br /&gt;
!colspan=&amp;quot;3&amp;quot;|Faults/Second&lt;br /&gt;
|-&lt;br /&gt;
!Pool&lt;br /&gt;
!Priority&lt;br /&gt;
!Minimum&lt;br /&gt;
!Maximum&lt;br /&gt;
!Minimum&lt;br /&gt;
!Thread&lt;br /&gt;
!Maximum&lt;br /&gt;
|-&lt;br /&gt;
|*MACHINE&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|1&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|25.49&amp;lt;ref&amp;gt;Use literal &amp;lt;tt&amp;gt;*DFT&amp;lt;/tt&amp;gt; to reset to default, if unsure.&amp;lt;/ref&amp;gt;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;50&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;100&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|0&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;100&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|*BASE&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|1&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|4.99&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|100&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;25&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;5&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;2000&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|*INTERACT&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|2&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|5&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;25&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;50&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;10&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;1000&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|*SPOOL&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;3&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|1&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;10&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;25&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;5&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;1000&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The primary goals behind the suggested values are:&lt;br /&gt;
* Establish hard &#039;&#039;Size %&#039;&#039; limits to prevent pool starvation.&lt;br /&gt;
* Allow for much higher faulting rates (&#039;&#039;Faults/Second&#039;&#039;) before taking action.&lt;br /&gt;
* Using higher scaling values still considers dynamic adjustment up to the raised &#039;&#039;Acceptable Fault Target Threshold&#039;&#039; values, and keeps the basic adjustment logic active.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Post-Install Optimizations]]&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;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=Performance_adjustment_for_Solid_State_Memory&amp;diff=1848</id>
		<title>Performance adjustment for Solid State Memory</title>
		<link rel="alternate" type="text/html" href="http://try-as400.pocnet.net/index.php?title=Performance_adjustment_for_Solid_State_Memory&amp;diff=1848"/>
		<updated>2026-10-06T08:36:48Z</updated>

		<summary type="html">&lt;p&gt;PoC: /* Work with Shared Pools */ Reworked&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{FIXME|Finish article}}&lt;br /&gt;
OS/400 &#039;&#039;&#039;Performance adjustment for Solid State Memory&#039;&#039;&#039; sheds some light on how to tune a system in regard to the almost zero latency for this type of secondary storage.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
OS/400 is an &#039;&#039;paged virtual memory&#039;&#039; platform. There&#039;s no direct &#039;&#039;open a file and read the content into RAM&#039;&#039; system function. All data between secondary and primary storage (historically disk, and RAM) flows through the [[wikipedia:Memory paging|paging code]].&lt;br /&gt;
&lt;br /&gt;
Today, disks are largely replaced with solid state, &#039;&#039;&#039;[[wikipedia:Flash memory|flash based memory]]&#039;&#039;&#039;. It has no moving mechanical parts, eliminates the accompanying access latency, generates no noise, draws less power, generates less heat, and often uses less physical space. Older AS/400 systems can benefit from the [[ZuluSCSI]] parallel SCSI disk emulator.&lt;br /&gt;
&lt;br /&gt;
OS/400 features a so called &#039;&#039;&#039;performance adjustment&#039;&#039;&#039; function, which automatically splits and shifts available memory around between memory pools according to the current workload, the goal is to minimize paging activity. The default threshold values when, and how much memory is moved around are based on the relatively high latency of rotating disk drives. One particular data point is the &#039;&#039;faulting rate&#039;&#039;, essentially how quickly the system tries to bring in data from secondary storage (disk) into primary storage (RAM) for processing. The higher the faulting rate, the more aggressive memory is moved between pools.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&#039;&#039;&#039;Note:&#039;&#039;&#039; Despite the word &#039;&#039;fault&#039;&#039; seemingly indicating a fatal condition, it isn&#039;t. A [[wikipedia:Page fault|page fault]] is a mere indicator that a requested memory location isn&#039;t in main storage and a different code path has to be taken to bring it into main storage before processing can commence. Also, a single page fault can result in multiple memory pages being copied into main storage at once.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Solid state memory allows very high paging rates, impossible with spinning disk drives, but without introducing excessive latency. The performance adjust doesn&#039;t base adjustment calculations on latency, but on faulting rate. On a system with much disk activity, this can lead to memory starvation of less active pools, and frequent invalidation of in-memory cached data due to quick reassignments of memory.&lt;br /&gt;
&lt;br /&gt;
== Work with Shared Pools ==&lt;br /&gt;
The &amp;lt;code&amp;gt;wrkshrpool&amp;lt;/code&amp;gt; command allows to adjust threshold values for the performance adjuster by pressing &amp;lt;code&amp;gt;F11&amp;lt;/code&amp;gt;. You&#039;ll be presented with a table akin to the following. This table shows default values (for V4R5):&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|&amp;amp;nbsp;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Size (%)&lt;br /&gt;
!colspan=&amp;quot;3&amp;quot;|Faults/Second&lt;br /&gt;
|-&lt;br /&gt;
!Pool&lt;br /&gt;
!Priority&lt;br /&gt;
!Minimum&lt;br /&gt;
!Maximum&lt;br /&gt;
!Minimum&lt;br /&gt;
!Thread&lt;br /&gt;
!Maximum&lt;br /&gt;
|-&lt;br /&gt;
|*MACHINE&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|1&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|~25&amp;lt;ref&amp;gt;This value is calculated by the system.&amp;lt;/ref&amp;gt;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|100&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|10&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|0&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|10&lt;br /&gt;
|-&lt;br /&gt;
|*BASE&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|1&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|4.99&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|100&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|5&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|0.5&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|2000&lt;br /&gt;
|-&lt;br /&gt;
|*INTERACT&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|2&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|5&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|100&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|10&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|2&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|100&lt;br /&gt;
|-&lt;br /&gt;
|*SPOOL&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|2&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|1&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|100&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|5&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|1&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|100&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
A pool&#039;s &#039;&#039;priority&#039;&#039; is a relative number from 1 to 14. Lower numbers mean higher priority for pools to be served with additional memory, while higher numbered pools are stripped from excess memory earlier.&lt;br /&gt;
&lt;br /&gt;
Some explanation to the meaning of the &#039;&#039;Faults/Second&#039;&#039; values:&lt;br /&gt;
* &#039;&#039;&#039;Minimum&#039;&#039;&#039;: If a pool&#039;s faulting rate drops below this value, the adjuster views the pool as over-allocated and will begin to strip memory away from it to feed other pools.&lt;br /&gt;
* &#039;&#039;&#039;Thread&#039;&#039;&#039;: A multiplier per (active) thread.&lt;br /&gt;
* &#039;&#039;&#039;Maximum&#039;&#039;&#039;: If the pool&#039;s faulting rate exceeds this value, the adjuster considers the pool starved and starts aggressively moving memory into it from other pools.&lt;br /&gt;
&lt;br /&gt;
=== Thread multiplier ===&lt;br /&gt;
Explanation by example: If one user is running an application in the *INTERACT pool and causing 50 faults/second, that single user is experiencing a performance bottleneck. Contrary, if 100 people are using *INTERACT simultaneously and causing the same 50 faults/second, that means each user is only experiencing 0.5 faults/second. No bottleneck.&lt;br /&gt;
&lt;br /&gt;
The system calculates a &#039;&#039;Dynamic Acceptable Fault Target Threshold = Minimum + (Thread Multiplier × Active Threads)&#039;&#039;. If that value exceeds the absolute Maximum value, the latter is considered. Let&#039;s take an example of &#039;&#039;multiplier = 2&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* Scenario A: The system is quiet (5 active threads)&amp;lt;br&amp;gt;&lt;br /&gt;
50 + (2 × 5) = 60 faults/s&amp;lt;br&amp;gt;&lt;br /&gt;
Because only 5 threads are active, the baseline is 60 faults/s. If overall pool activity exceeds 60 faults/s, adjustment will kick in.&lt;br /&gt;
* Scenario B: Peak hours (200 active threads)&amp;lt;br&amp;gt;&lt;br /&gt;
50 + (2 × 200) = 450 faults/s&amp;lt;br&amp;gt;&lt;br /&gt;
Now 200 threads are actively sharing the pool, and adjustment scales its tolerance up to 450 faults/sec before it considers the pool &amp;quot;starved&amp;quot; enough to warrant moving memory from elsewhere.&lt;br /&gt;
* Scenario C: Extreme burst (600 active threads)&amp;lt;br&amp;gt;&lt;br /&gt;
50 + (2 × 600) = 1250 faults/s&amp;lt;br&amp;gt;&lt;br /&gt;
Because the absolute Maximum is capped at 1000, the math is clipped. The threshold stops scaling and locks firmly at 1000 faults/s.&lt;br /&gt;
&lt;br /&gt;
=== Recommended adjustments ===&lt;br /&gt;
Values printed in &#039;&#039;bold&#039;&#039; are changed (non-default) values.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&#039;&#039;&#039;Note:&#039;&#039;&#039; These values are intended for small scale, or hobbyist systems. If these values hold up for heavy usage has not been established.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|&amp;amp;nbsp;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Size (%)&lt;br /&gt;
!colspan=&amp;quot;3&amp;quot;|Faults/Second&lt;br /&gt;
|-&lt;br /&gt;
!Pool&lt;br /&gt;
!Priority&lt;br /&gt;
!Minimum&lt;br /&gt;
!Maximum&lt;br /&gt;
!Minimum&lt;br /&gt;
!Thread&lt;br /&gt;
!Maximum&lt;br /&gt;
|-&lt;br /&gt;
|*MACHINE&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|1&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|25.49&amp;lt;ref&amp;gt;Use literal &amp;lt;tt&amp;gt;*DFT&amp;lt;/tt&amp;gt; to reset to default, if unsure.&amp;lt;/ref&amp;gt;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;50&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;100&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|0&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;100&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|*BASE&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|1&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|4.99&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|100&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;25&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;5&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;2000&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|*INTERACT&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|2&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|5&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;25&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;50&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;10&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;1000&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|*SPOOL&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;3&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|1&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;10&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;25&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;5&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;1000&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The primary goals behind the suggested values are:&lt;br /&gt;
* Establish hard &#039;&#039;Size %&#039;&#039; limits to prevent pool starvation.&lt;br /&gt;
* Allow for much higher faulting rates (&#039;&#039;Faults/Second&#039;&#039;) before taking action.&lt;br /&gt;
* Using higher scaling values still considers dynamic adjustment up to the raised absolute maximum values, and keeps the basic adjustment logic active.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Post-Install Optimizations]]&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;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=Performance_adjustment_for_Solid_State_Memory&amp;diff=1847</id>
		<title>Performance adjustment for Solid State Memory</title>
		<link rel="alternate" type="text/html" href="http://try-as400.pocnet.net/index.php?title=Performance_adjustment_for_Solid_State_Memory&amp;diff=1847"/>
		<updated>2026-10-06T08:05:43Z</updated>

		<summary type="html">&lt;p&gt;PoC: /* Work with Shared Pools */ Priority&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{FIXME|Finish article}}&lt;br /&gt;
OS/400 &#039;&#039;&#039;Performance adjustment for Solid State Memory&#039;&#039;&#039; sheds some light on how to tune a system in regard to the almost zero latency for this type of secondary storage.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
OS/400 is an &#039;&#039;paged virtual memory&#039;&#039; platform. There&#039;s no direct &#039;&#039;open a file and read the content into RAM&#039;&#039; system function. All data between secondary and primary storage (historically disk, and RAM) flows through the [[wikipedia:Memory paging|paging code]].&lt;br /&gt;
&lt;br /&gt;
Today, disks are largely replaced with solid state, &#039;&#039;&#039;[[wikipedia:Flash memory|flash based memory]]&#039;&#039;&#039;. It has no moving mechanical parts, eliminates the accompanying access latency, generates no noise, draws less power, generates less heat, and often uses less physical space. Older AS/400 systems can benefit from the [[ZuluSCSI]] parallel SCSI disk emulator.&lt;br /&gt;
&lt;br /&gt;
OS/400 features a so called &#039;&#039;&#039;performance adjustment&#039;&#039;&#039; function, which automatically splits and shifts available memory around between memory pools according to the current workload, the goal is to minimize paging activity. The default threshold values when, and how much memory is moved around are based on the relatively high latency of rotating disk drives. One particular data point is the &#039;&#039;faulting rate&#039;&#039;, essentially how quickly the system tries to bring in data from secondary storage (disk) into primary storage (RAM) for processing. The higher the faulting rate, the more aggressive memory is moved between pools.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&#039;&#039;&#039;Note:&#039;&#039;&#039; Despite the word &#039;&#039;fault&#039;&#039; seemingly indicating a fatal condition, it isn&#039;t. A [[wikipedia:Page fault|page fault]] is a mere indicator that a requested memory location isn&#039;t in main storage and a different code path has to be taken to bring it into main storage before processing can commence. Also, a single page fault can result in multiple memory pages being copied into main storage at once.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Solid state memory allows very high paging rates, impossible with spinning disk drives, but without introducing excessive latency. The performance adjust doesn&#039;t base adjustment calculations on latency, but on faulting rate. On a system with much disk activity, this can lead to memory starvation of less active pools, and frequent invalidation of in-memory cached data due to quick reassignments of memory.&lt;br /&gt;
&lt;br /&gt;
== Work with Shared Pools ==&lt;br /&gt;
The &amp;lt;code&amp;gt;wrkshrpool&amp;lt;/code&amp;gt; command allows to adjust threshold values for the performance adjuster by pressing &amp;lt;code&amp;gt;F11&amp;lt;/code&amp;gt;. You&#039;ll be presented with a table akin to the following. Suggested adjustment values are shown below. Values printed in &#039;&#039;bold&#039;&#039; are changed (non-default) values.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|&amp;amp;nbsp;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Size (%)&lt;br /&gt;
!colspan=&amp;quot;3&amp;quot;|Faults/Second&lt;br /&gt;
|-&lt;br /&gt;
!Pool&lt;br /&gt;
!Priority&lt;br /&gt;
!Minimum&lt;br /&gt;
!Maximum&lt;br /&gt;
!Minimum&lt;br /&gt;
!Thread&lt;br /&gt;
!Maximum&lt;br /&gt;
|-&lt;br /&gt;
|*MACHINE&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|1&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|25.49&amp;lt;ref&amp;gt;Use literal &amp;lt;tt&amp;gt;*DFT&amp;lt;/tt&amp;gt; to reset to default, if unsure.&amp;lt;/ref&amp;gt;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;50&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;100&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|0&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;100&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|*BASE&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|1&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|4.99&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|100&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;25&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;5&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;2000&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|*INTERACT&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|2&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|5&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;25&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;50&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;10&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;1000&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|*SPOOL&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;3&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|1&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;10&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;25&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;5&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;1000&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
A pool&#039;s &#039;&#039;priority&#039;&#039; is a relative number from 1 to 14. Lower numbers mean higher priority for pools to be served with additional memory, while higher numbered pools are stripped from excess memory earlier.&lt;br /&gt;
&lt;br /&gt;
Some explanation to the meaning of the &#039;&#039;Faults/Second&#039;&#039; values:&lt;br /&gt;
* &#039;&#039;&#039;Minimum&#039;&#039;&#039;: If a pool&#039;s faulting rate drops below this value, the adjuster views the pool as over-allocated and will begin to strip memory away from it to feed other pools.&lt;br /&gt;
* &#039;&#039;&#039;Thread&#039;&#039;&#039;: A multiplier per (active) thread.&lt;br /&gt;
* &#039;&#039;&#039;Maximum&#039;&#039;&#039;: If the pool&#039;s faulting rate exceeds this value, the adjuster considers the pool starved and starts aggressively moving memory into it from other pools.&lt;br /&gt;
&lt;br /&gt;
The primary goals behind the suggested values are&lt;br /&gt;
* Establish hard &#039;&#039;Size %&#039;&#039; limits to prevent pool starvation&lt;br /&gt;
* Allow for much higher faulting rates (&#039;&#039;Faults/Second&#039;&#039;) before taking action&lt;br /&gt;
&lt;br /&gt;
=== Thread multiplier ===&lt;br /&gt;
Explanation by example: If one user is running an application in the *INTERACT pool and causing 50 faults/second, that single user is experiencing a performance bottleneck. Contrary, if 100 people are using *INTERACT simultaneously and causing the same 50 faults/second, that means each user is only experiencing 0.5 faults/second. No bottleneck.&lt;br /&gt;
&lt;br /&gt;
The system calculates a &#039;&#039;Dynamic Acceptable Fault Target Threshold = Minimum + (Thread Multiplier × Active Threads)&#039;&#039;. If that value exceeds the absolute Maximum value, the latter is considered. Let&#039;s take an example of &#039;&#039;multiplier = 2&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* Scenario A: The system is quiet (5 active threads)&amp;lt;br&amp;gt;&lt;br /&gt;
50 + (2 × 5) = 60 faults/s&amp;lt;br&amp;gt;&lt;br /&gt;
Because only 5 threads are active, the baseline is 60 faults/s. If overall pool activity exceeds 60 faults/s, adjustment will kick in.&lt;br /&gt;
* Scenario B: Peak hours (200 active threads)&amp;lt;br&amp;gt;&lt;br /&gt;
50 + (2 × 200) = 450 faults/s&amp;lt;br&amp;gt;&lt;br /&gt;
Now 200 threads are actively sharing the pool, and adjustment scales its tolerance up to 450 faults/sec before it considers the pool &amp;quot;starved&amp;quot; enough to warrant moving memory from elsewhere.&lt;br /&gt;
* Scenario C: Extreme burst (600 active threads)&amp;lt;br&amp;gt;&lt;br /&gt;
50 + (2 × 600) = 1250 faults/s&amp;lt;br&amp;gt;&lt;br /&gt;
Because the absolute Maximum is capped at 1000, the math is clipped. The threshold stops scaling and locks firmly at 1000 faults/s.&lt;br /&gt;
&lt;br /&gt;
Using higher scaling values still considers dynamic adjustment up to the raised absolute maximum values, and keeps the basic adjustment logic active.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Post-Install Optimizations]]&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;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=Performance_adjustment_for_Solid_State_Memory&amp;diff=1846</id>
		<title>Performance adjustment for Solid State Memory</title>
		<link rel="alternate" type="text/html" href="http://try-as400.pocnet.net/index.php?title=Performance_adjustment_for_Solid_State_Memory&amp;diff=1846"/>
		<updated>2026-10-06T07:54:48Z</updated>

		<summary type="html">&lt;p&gt;PoC: /* Thread multiplier */ Better wording&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{FIXME|Finish article}}&lt;br /&gt;
OS/400 &#039;&#039;&#039;Performance adjustment for Solid State Memory&#039;&#039;&#039; sheds some light on how to tune a system in regard to the almost zero latency for this type of secondary storage.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
OS/400 is an &#039;&#039;paged virtual memory&#039;&#039; platform. There&#039;s no direct &#039;&#039;open a file and read the content into RAM&#039;&#039; system function. All data between secondary and primary storage (historically disk, and RAM) flows through the [[wikipedia:Memory paging|paging code]].&lt;br /&gt;
&lt;br /&gt;
Today, disks are largely replaced with solid state, &#039;&#039;&#039;[[wikipedia:Flash memory|flash based memory]]&#039;&#039;&#039;. It has no moving mechanical parts, eliminates the accompanying access latency, generates no noise, draws less power, generates less heat, and often uses less physical space. Older AS/400 systems can benefit from the [[ZuluSCSI]] parallel SCSI disk emulator.&lt;br /&gt;
&lt;br /&gt;
OS/400 features a so called &#039;&#039;&#039;performance adjustment&#039;&#039;&#039; function, which automatically splits and shifts available memory around between memory pools according to the current workload, the goal is to minimize paging activity. The default threshold values when, and how much memory is moved around are based on the relatively high latency of rotating disk drives. One particular data point is the &#039;&#039;faulting rate&#039;&#039;, essentially how quickly the system tries to bring in data from secondary storage (disk) into primary storage (RAM) for processing. The higher the faulting rate, the more aggressive memory is moved between pools.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&#039;&#039;&#039;Note:&#039;&#039;&#039; Despite the word &#039;&#039;fault&#039;&#039; seemingly indicating a fatal condition, it isn&#039;t. A [[wikipedia:Page fault|page fault]] is a mere indicator that a requested memory location isn&#039;t in main storage and a different code path has to be taken to bring it into main storage before processing can commence. Also, a single page fault can result in multiple memory pages being copied into main storage at once.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Solid state memory allows very high paging rates, impossible with spinning disk drives, but without introducing excessive latency. The performance adjust doesn&#039;t base adjustment calculations on latency, but on faulting rate. On a system with much disk activity, this can lead to memory starvation of less active pools, and frequent invalidation of in-memory cached data due to quick reassignments of memory.&lt;br /&gt;
&lt;br /&gt;
== Work with Shared Pools ==&lt;br /&gt;
The &amp;lt;code&amp;gt;wrkshrpool&amp;lt;/code&amp;gt; command allows to adjust threshold values for the performance adjuster by pressing &amp;lt;code&amp;gt;F11&amp;lt;/code&amp;gt;. You&#039;ll be presented with a table akin to the following. Suggested adjustment values are shown below. Values printed in &#039;&#039;bold&#039;&#039; are changed (non-default) values.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|&amp;amp;nbsp;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Size (%)&lt;br /&gt;
!colspan=&amp;quot;3&amp;quot;|Faults/Second&lt;br /&gt;
|-&lt;br /&gt;
!Pool&lt;br /&gt;
!Priority&lt;br /&gt;
!Minimum&lt;br /&gt;
!Maximum&lt;br /&gt;
!Minimum&lt;br /&gt;
!Thread&lt;br /&gt;
!Maximum&lt;br /&gt;
|-&lt;br /&gt;
|*MACHINE&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|1&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|25.49&amp;lt;ref&amp;gt;Use literal &amp;lt;tt&amp;gt;*DFT&amp;lt;/tt&amp;gt; to reset to default, if unsure.&amp;lt;/ref&amp;gt;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;50&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;100&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|0&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;100&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|*BASE&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|1&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|4.99&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|100&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;25&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;5&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;2000&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|*INTERACT&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|2&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|5&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;25&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;50&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;10&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;1000&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|*SPOOL&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;3&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|1&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;10&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;25&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;5&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;1000&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Some explanation to the meaning of the &#039;&#039;Faults/Second&#039;&#039; values:&lt;br /&gt;
* &#039;&#039;&#039;Minimum&#039;&#039;&#039;: If a pool&#039;s faulting rate drops below this value, the adjuster views the pool as over-allocated and will begin to strip memory away from it to feed other pools.&lt;br /&gt;
* &#039;&#039;&#039;Thread&#039;&#039;&#039;: A multiplier per (active) thread.&lt;br /&gt;
* &#039;&#039;&#039;Maximum&#039;&#039;&#039;: If the pool&#039;s faulting rate exceeds this value, the adjuster considers the pool starved and starts aggressively moving memory into it from other pools.&lt;br /&gt;
&lt;br /&gt;
The primary goals behind the suggested values are&lt;br /&gt;
* Establish hard &#039;&#039;Size %&#039;&#039; limits to prevent pool starvation&lt;br /&gt;
* Allow for much higher faulting rates (&#039;&#039;Faults/Second&#039;&#039;) before taking action&lt;br /&gt;
&lt;br /&gt;
=== Thread multiplier ===&lt;br /&gt;
Explanation by example: If one user is running an application in the *INTERACT pool and causing 50 faults/second, that single user is experiencing a performance bottleneck. Contrary, if 100 people are using *INTERACT simultaneously and causing the same 50 faults/second, that means each user is only experiencing 0.5 faults/second. No bottleneck.&lt;br /&gt;
&lt;br /&gt;
The system calculates a &#039;&#039;Dynamic Acceptable Fault Target Threshold = Minimum + (Thread Multiplier × Active Threads)&#039;&#039;. If that value exceeds the absolute Maximum value, the latter is considered. Let&#039;s take an example of &#039;&#039;multiplier = 2&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* Scenario A: The system is quiet (5 active threads)&amp;lt;br&amp;gt;&lt;br /&gt;
50 + (2 × 5) = 60 faults/s&amp;lt;br&amp;gt;&lt;br /&gt;
Because only 5 threads are active, the baseline is 60 faults/s. If overall pool activity exceeds 60 faults/s, adjustment will kick in.&lt;br /&gt;
* Scenario B: Peak hours (200 active threads)&amp;lt;br&amp;gt;&lt;br /&gt;
50 + (2 × 200) = 450 faults/s&amp;lt;br&amp;gt;&lt;br /&gt;
Now 200 threads are actively sharing the pool, and adjustment scales its tolerance up to 450 faults/sec before it considers the pool &amp;quot;starved&amp;quot; enough to warrant moving memory from elsewhere.&lt;br /&gt;
* Scenario C: Extreme burst (600 active threads)&amp;lt;br&amp;gt;&lt;br /&gt;
50 + (2 × 600) = 1250 faults/s&amp;lt;br&amp;gt;&lt;br /&gt;
Because the absolute Maximum is capped at 1000, the math is clipped. The threshold stops scaling and locks firmly at 1000 faults/s.&lt;br /&gt;
&lt;br /&gt;
Using higher scaling values still considers dynamic adjustment up to the raised absolute maximum values, and keeps the basic adjustment logic active.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Post-Install Optimizations]]&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;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=Performance_adjustment_for_Solid_State_Memory&amp;diff=1845</id>
		<title>Performance adjustment for Solid State Memory</title>
		<link rel="alternate" type="text/html" href="http://try-as400.pocnet.net/index.php?title=Performance_adjustment_for_Solid_State_Memory&amp;diff=1845"/>
		<updated>2026-10-06T07:51:45Z</updated>

		<summary type="html">&lt;p&gt;PoC: /* Work with Shared Pools */ Thread multiplier explained&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{FIXME|Finish article}}&lt;br /&gt;
OS/400 &#039;&#039;&#039;Performance adjustment for Solid State Memory&#039;&#039;&#039; sheds some light on how to tune a system in regard to the almost zero latency for this type of secondary storage.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
OS/400 is an &#039;&#039;paged virtual memory&#039;&#039; platform. There&#039;s no direct &#039;&#039;open a file and read the content into RAM&#039;&#039; system function. All data between secondary and primary storage (historically disk, and RAM) flows through the [[wikipedia:Memory paging|paging code]].&lt;br /&gt;
&lt;br /&gt;
Today, disks are largely replaced with solid state, &#039;&#039;&#039;[[wikipedia:Flash memory|flash based memory]]&#039;&#039;&#039;. It has no moving mechanical parts, eliminates the accompanying access latency, generates no noise, draws less power, generates less heat, and often uses less physical space. Older AS/400 systems can benefit from the [[ZuluSCSI]] parallel SCSI disk emulator.&lt;br /&gt;
&lt;br /&gt;
OS/400 features a so called &#039;&#039;&#039;performance adjustment&#039;&#039;&#039; function, which automatically splits and shifts available memory around between memory pools according to the current workload, the goal is to minimize paging activity. The default threshold values when, and how much memory is moved around are based on the relatively high latency of rotating disk drives. One particular data point is the &#039;&#039;faulting rate&#039;&#039;, essentially how quickly the system tries to bring in data from secondary storage (disk) into primary storage (RAM) for processing. The higher the faulting rate, the more aggressive memory is moved between pools.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&#039;&#039;&#039;Note:&#039;&#039;&#039; Despite the word &#039;&#039;fault&#039;&#039; seemingly indicating a fatal condition, it isn&#039;t. A [[wikipedia:Page fault|page fault]] is a mere indicator that a requested memory location isn&#039;t in main storage and a different code path has to be taken to bring it into main storage before processing can commence. Also, a single page fault can result in multiple memory pages being copied into main storage at once.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Solid state memory allows very high paging rates, impossible with spinning disk drives, but without introducing excessive latency. The performance adjust doesn&#039;t base adjustment calculations on latency, but on faulting rate. On a system with much disk activity, this can lead to memory starvation of less active pools, and frequent invalidation of in-memory cached data due to quick reassignments of memory.&lt;br /&gt;
&lt;br /&gt;
== Work with Shared Pools ==&lt;br /&gt;
The &amp;lt;code&amp;gt;wrkshrpool&amp;lt;/code&amp;gt; command allows to adjust threshold values for the performance adjuster by pressing &amp;lt;code&amp;gt;F11&amp;lt;/code&amp;gt;. You&#039;ll be presented with a table akin to the following. Suggested adjustment values are shown below. Values printed in &#039;&#039;bold&#039;&#039; are changed (non-default) values.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|&amp;amp;nbsp;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Size (%)&lt;br /&gt;
!colspan=&amp;quot;3&amp;quot;|Faults/Second&lt;br /&gt;
|-&lt;br /&gt;
!Pool&lt;br /&gt;
!Priority&lt;br /&gt;
!Minimum&lt;br /&gt;
!Maximum&lt;br /&gt;
!Minimum&lt;br /&gt;
!Thread&lt;br /&gt;
!Maximum&lt;br /&gt;
|-&lt;br /&gt;
|*MACHINE&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|1&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|25.49&amp;lt;ref&amp;gt;Use literal &amp;lt;tt&amp;gt;*DFT&amp;lt;/tt&amp;gt; to reset to default, if unsure.&amp;lt;/ref&amp;gt;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;50&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;100&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|0&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;100&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|*BASE&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|1&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|4.99&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|100&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;25&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;5&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;2000&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|*INTERACT&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|2&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|5&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;25&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;50&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;10&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;1000&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|*SPOOL&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;3&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|1&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;10&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;25&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;5&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;1000&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Some explanation to the meaning of the &#039;&#039;Faults/Second&#039;&#039; values:&lt;br /&gt;
* &#039;&#039;&#039;Minimum&#039;&#039;&#039;: If a pool&#039;s faulting rate drops below this value, the adjuster views the pool as over-allocated and will begin to strip memory away from it to feed other pools.&lt;br /&gt;
* &#039;&#039;&#039;Thread&#039;&#039;&#039;: A multiplier per (active) thread.&lt;br /&gt;
* &#039;&#039;&#039;Maximum&#039;&#039;&#039;: If the pool&#039;s faulting rate exceeds this value, the adjuster considers the pool starved and starts aggressively moving memory into it from other pools.&lt;br /&gt;
&lt;br /&gt;
The primary goals behind the suggested values are&lt;br /&gt;
* Establish hard &#039;&#039;Size %&#039;&#039; limits to prevent pool starvation&lt;br /&gt;
* Allow for much higher faulting rates (&#039;&#039;Faults/Second&#039;&#039;) before taking action&lt;br /&gt;
&lt;br /&gt;
=== Thread multiplier ===&lt;br /&gt;
Explanation by example: If one user is running an application in the *INTERACT pool and causing 50 faults/second, that single user is experiencing a performance bottleneck. Contrary, if 100 people are using *INTERACT simultaneously and causing the same 50 faults/second, that means each user is only experiencing 0.5 faults/second. No bottleneck.&lt;br /&gt;
&lt;br /&gt;
The system calculates a &#039;&#039;dynamic Maximum = Minimum + (Thread Multiplier × Active Threads)&#039;&#039;. If that value exceeds the absolute Maximum value, the latter is considered. Let&#039;s take an example of &#039;&#039;multiplier = 2&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* Scenario A: The system is quiet (5 active threads)&amp;lt;br&amp;gt;&lt;br /&gt;
50 + (2 × 5) = 60 faults/s&amp;lt;br&amp;gt;&lt;br /&gt;
Because only 5 threads are active, the baseline is 60 faults/s. If overall pool activity exceeds 60 faults/s, adjustment will kick in.&lt;br /&gt;
* Scenario B: Peak hours (200 active threads)&amp;lt;br&amp;gt;&lt;br /&gt;
50 + (2 × 200) = 450 faults/s&amp;lt;br&amp;gt;&lt;br /&gt;
Now 200 threads are actively sharing the pool, and adjustment scales its tolerance up to 450 faults/sec before it considers the pool &amp;quot;starved&amp;quot; enough to warrant moving memory from elsewhere.&lt;br /&gt;
* Scenario C: Extreme burst (600 active threads)&amp;lt;br&amp;gt;&lt;br /&gt;
50 + (2 × 600) = 1250 faults/s&amp;lt;br&amp;gt;&lt;br /&gt;
Because the absolute Maximum is capped at 1000, the math is clipped. The threshold stops scaling and locks firmly at 1000 faults/s.&lt;br /&gt;
&lt;br /&gt;
Using higher scaling values still considers dynamic adjustment up to the raised absolute maximum values, and keeps the basic adjustment logic active.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Post-Install Optimizations]]&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;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=Performance_adjustment_for_Solid_State_Memory&amp;diff=1844</id>
		<title>Performance adjustment for Solid State Memory</title>
		<link rel="alternate" type="text/html" href="http://try-as400.pocnet.net/index.php?title=Performance_adjustment_for_Solid_State_Memory&amp;diff=1844"/>
		<updated>2026-10-06T07:30:25Z</updated>

		<summary type="html">&lt;p&gt;PoC: Better wording: Paging ≠ Faulting&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{FIXME|Finish article}}&lt;br /&gt;
OS/400 &#039;&#039;&#039;Performance adjustment for Solid State Memory&#039;&#039;&#039; sheds some light on how to tune a system in regard to the almost zero latency for this type of secondary storage.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
OS/400 is an &#039;&#039;paged virtual memory&#039;&#039; platform. There&#039;s no direct &#039;&#039;open a file and read the content into RAM&#039;&#039; system function. All data between secondary and primary storage (historically disk, and RAM) flows through the [[wikipedia:Memory paging|paging code]].&lt;br /&gt;
&lt;br /&gt;
Today, disks are largely replaced with solid state, &#039;&#039;&#039;[[wikipedia:Flash memory|flash based memory]]&#039;&#039;&#039;. It has no moving mechanical parts, eliminates the accompanying access latency, generates no noise, draws less power, generates less heat, and often uses less physical space. Older AS/400 systems can benefit from the [[ZuluSCSI]] parallel SCSI disk emulator.&lt;br /&gt;
&lt;br /&gt;
OS/400 features a so called &#039;&#039;&#039;performance adjustment&#039;&#039;&#039; function, which automatically splits and shifts available memory around between memory pools according to the current workload, the goal is to minimize paging activity. The default threshold values when, and how much memory is moved around are based on the relatively high latency of rotating disk drives. One particular data point is the &#039;&#039;faulting rate&#039;&#039;, essentially how quickly the system tries to bring in data from secondary storage (disk) into primary storage (RAM) for processing. The higher the faulting rate, the more aggressive memory is moved between pools.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&#039;&#039;&#039;Note:&#039;&#039;&#039; Despite the word &#039;&#039;fault&#039;&#039; seemingly indicating a fatal condition, it isn&#039;t. A [[wikipedia:Page fault|page fault]] is a mere indicator that a requested memory location isn&#039;t in main storage and a different code path has to be taken to bring it into main storage before processing can commence. Also, a single page fault can result in multiple memory pages being copied into main storage at once.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Solid state memory allows very high paging rates, impossible with spinning disk drives, but without introducing excessive latency. The performance adjust doesn&#039;t base adjustment calculations on latency, but on faulting rate. On a system with much disk activity, this can lead to memory starvation of less active pools, and frequent invalidation of in-memory cached data due to quick reassignments of memory.&lt;br /&gt;
&lt;br /&gt;
== Work with Shared Pools ==&lt;br /&gt;
The &amp;lt;code&amp;gt;wrkshrpool&amp;lt;/code&amp;gt; command allows to adjust threshold values for the performance adjuster by pressing &amp;lt;code&amp;gt;F11&amp;lt;/code&amp;gt;. You&#039;ll be presented with a table akin to the following. Suggested adjustment values are shown below. Values printed in &#039;&#039;bold&#039;&#039; are changed (non-default) values.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|&amp;amp;nbsp;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Size (%)&lt;br /&gt;
!colspan=&amp;quot;3&amp;quot;|Faults/Second&lt;br /&gt;
|-&lt;br /&gt;
!Pool&lt;br /&gt;
!Priority&lt;br /&gt;
!Minimum&lt;br /&gt;
!Maximum&lt;br /&gt;
!Minimum&lt;br /&gt;
!Thread&lt;br /&gt;
!Maximum&lt;br /&gt;
|-&lt;br /&gt;
|*MACHINE&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|1&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|25.49&amp;lt;ref&amp;gt;Use literal &amp;lt;tt&amp;gt;*DFT&amp;lt;/tt&amp;gt; to reset to default, if unsure.&amp;lt;/ref&amp;gt;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;50&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;100&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|0&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;100&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|*BASE&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|1&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|4.99&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|100&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;25&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|0.5&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;2000&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|*INTERACT&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|2&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|5&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;25&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;50&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|2&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;1000&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|*SPOOL&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;3&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|1&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;10&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;25&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|1&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;1000&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Some explanation to the meaning of the &#039;&#039;Faults/Second&#039;&#039; values:&lt;br /&gt;
* &#039;&#039;&#039;Minimum&#039;&#039;&#039;: If a pool&#039;s faulting rate drops below this value, the adjuster views the pool as over-allocated and will begin to strip memory away from it to feed other pools.&lt;br /&gt;
* &#039;&#039;&#039;Thread&#039;&#039;&#039;: The multiplier allocated per active thread. The OS calculates active threads by evaluating only threads that have actually consumed CPU slices during the most recent tuning interval.&lt;br /&gt;
* &#039;&#039;&#039;Maximum&#039;&#039;&#039;: If the pool&#039;s faulting rate exceeds this value, the adjuster considers the pool starved and starts aggressively moving memory into it from other pools.&lt;br /&gt;
&lt;br /&gt;
The primary goals behind the suggested values are&lt;br /&gt;
* Establish hard &#039;&#039;Size %&#039;&#039; limits to prevent pool starvation&lt;br /&gt;
* Allow for much higher faulting rates (&#039;&#039;Faults/Second&#039;&#039;) before taking action&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Post-Install Optimizations]]&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;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=Performance_adjustment_for_Solid_State_Memory&amp;diff=1843</id>
		<title>Performance adjustment for Solid State Memory</title>
		<link rel="alternate" type="text/html" href="http://try-as400.pocnet.net/index.php?title=Performance_adjustment_for_Solid_State_Memory&amp;diff=1843"/>
		<updated>2026-10-05T23:16:16Z</updated>

		<summary type="html">&lt;p&gt;PoC: New&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{FIXME|Finish article}}&lt;br /&gt;
OS/400 &#039;&#039;&#039;Performance adjustment for Solid State Memory&#039;&#039;&#039; sheds some light on how to tune a system in regard to the almost zero latency for this type of secondary storage.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
OS/400 is an &#039;&#039;paged virtual memory&#039;&#039; platform. There&#039;s no direct &#039;&#039;open a file and read the content into RAM&#039;&#039; system function. All data between secondary and primary storage (historically disk, and RAM) flows through the [[wikipedia:Memory paging|paging code]].&lt;br /&gt;
&lt;br /&gt;
Today, disks are largely replaced with solid state, &#039;&#039;&#039;[[wikipedia:Flash memory|flash based memory]]&#039;&#039;&#039;. It has no moving mechanical parts, eliminates the accompanying access latency, generates no noise, draws less power, generates less heat, and often uses less physical space. Older AS/400 systems can benefit from the [[ZuluSCSI]] parallel SCSI disk emulator.&lt;br /&gt;
&lt;br /&gt;
OS/400 features a so called &#039;&#039;&#039;performance adjustment&#039;&#039;&#039; function, which automatically splits and shifts available memory around between memory pools according to the current workload, the goal is to minimize paging activtiy. The default threshold values when, and how much memory is moved around are based on the relatively high latency of rotating disk drives. One particular data point is the &#039;&#039;paging rate&#039;&#039;, essentially how quickly the system tries to bring in data from secondary storage (disk) into primary storage (RAM) for processing. The higher the paging rate, the more aggressive memory is moved between pools.&lt;br /&gt;
&lt;br /&gt;
Solid state memory allows very high paging rates, impossible with spinning disk drives, but without introducing excessive latency. The performance adjust doesn&#039;t base adjustment calculations on latency, but on paging rate. On a system with much disk activity, this can lead to memory starvation of less active pools, and frequent invalidation of in-memory cached data due to quick reassignments of memory.&lt;br /&gt;
&lt;br /&gt;
== Work with Shared Pools ==&lt;br /&gt;
The &amp;lt;code&amp;gt;wrkshrpool&amp;lt;/code&amp;gt; command allows to adjust threshold values for the performance adjuster by pressing &amp;lt;code&amp;gt;F11&amp;lt;/code&amp;gt;. You&#039;ll be presented with a table akin to the following. Suggested adjustment values are shown below. Values printed in &#039;&#039;bold&#039;&#039; are changed (non-default) values.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|&amp;amp;nbsp;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Size (%)&lt;br /&gt;
!colspan=&amp;quot;3&amp;quot;|Faults/Second&lt;br /&gt;
|-&lt;br /&gt;
!Pool&lt;br /&gt;
!Priority&lt;br /&gt;
!Minimum&lt;br /&gt;
!Maximum&lt;br /&gt;
!Minimum&lt;br /&gt;
!Thread&lt;br /&gt;
!Maximum&lt;br /&gt;
|-&lt;br /&gt;
|*MACHINE&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|1&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|25.49&amp;lt;ref&amp;gt;Use literal &amp;lt;tt&amp;gt;*DFT&amp;lt;/tt&amp;gt; to reset to default, if unsure.&amp;lt;/ref&amp;gt;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;50&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;100&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|0&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;100&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|*BASE&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|1&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|4.99&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|100&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;25&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|0.5&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;2000&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|*INTERACT&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|2&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|5&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;25&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;50&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|2&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;1000&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|*SPOOL&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;3&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|1&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;10&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;25&#039;&#039;&#039;&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|1&lt;br /&gt;
|align=&amp;quot;right&amp;quot;|&#039;&#039;&#039;1000&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Some explanation to the meaning of the &#039;&#039;Faults/Second&#039;&#039; values:&lt;br /&gt;
* &#039;&#039;&#039;Minimum&#039;&#039;&#039;: If a pool&#039;s paging rate drops below this value, the adjuster views the pool as over-allocated and will begin to strip memory away from it to feed other pools.&lt;br /&gt;
* &#039;&#039;&#039;Thread&#039;&#039;&#039;: The multiplier allocated per active thread. The OS calculates active threads by evaluating only threads that have actually consumed CPU slices during the most recent tuning interval.&lt;br /&gt;
* &#039;&#039;&#039;Maximum&#039;&#039;&#039;: If the pool&#039;s paging rate exceeds this value, the adjuster considers the pool starved and starts aggressively moving memory into it from other pools.&lt;br /&gt;
&lt;br /&gt;
The primary goals behind the suggested values are&lt;br /&gt;
* Establish hard &#039;&#039;Size %&#039;&#039; limits to prevent pool starvation&lt;br /&gt;
* Allow for much higher paging rates (&#039;&#039;Faults/Second&#039;&#039;) before taking action&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Post-Install Optimizations]]&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;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=ZuluSCSI&amp;diff=1842</id>
		<title>ZuluSCSI</title>
		<link rel="alternate" type="text/html" href="http://try-as400.pocnet.net/index.php?title=ZuluSCSI&amp;diff=1842"/>
		<updated>2026-09-22T19:52:21Z</updated>

		<summary type="html">&lt;p&gt;PoC: Moved content to GitHub repo&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;
For details, refer to the web links below.&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://github.com/ZuluSCSI/ZuluSCSI-firmware/blob/main/README-as400.md README-as400.md], ZuluSCSI-firmware, GitHub&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=Terminal_graphics_support&amp;diff=1841</id>
		<title>Terminal graphics support</title>
		<link rel="alternate" type="text/html" href="http://try-as400.pocnet.net/index.php?title=Terminal_graphics_support&amp;diff=1841"/>
		<updated>2026-09-18T16:25:16Z</updated>

		<summary type="html">&lt;p&gt;PoC: typo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;There are three modes of &#039;&#039;&#039;graphics support&#039;&#039;&#039; in OS/400 regarding &#039;&#039;&#039;terminals&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== GDDM ==&lt;br /&gt;
A subset of the mainframe &#039;&#039;Graphical Data Display Manager&#039;&#039; was ported to OS/400.&lt;br /&gt;
&lt;br /&gt;
GDDM needs special support regarding terminals. The only existing twinax terminal supporting GDDM was the 5292 model 2.&lt;br /&gt;
&lt;br /&gt;
Emulators supporting GDDM:&lt;br /&gt;
* IBM PC support for DOS (not verified), with special drivers, resolutions up to 1024×768 might be possible,&lt;br /&gt;
* an older IDEAcomm release for Windows 3.1 (16 bit), precise version not known.&lt;br /&gt;
&lt;br /&gt;
In later times, it was presumably meant as a way to create graphics for printing.&lt;br /&gt;
&lt;br /&gt;
== Enhanced display ==&lt;br /&gt;
This is a function of the 5250 controller in tandem with a hardware terminal, or a feature of the emulator itself. It provides automatic replacement of on-screen objects with a more or less graphical representation of an object. This includes, but is not limited to:&lt;br /&gt;
* Window borders&lt;br /&gt;
* DDS&amp;lt;ref&amp;gt;Should also work with UIM panels, but not real life tested.&amp;lt;/ref&amp;gt; &amp;lt;code&amp;gt;MLTCHCFLD&amp;lt;/code&amp;gt; as check boxes&lt;br /&gt;
* DDS &amp;lt;code&amp;gt;SNGCHCFLD&amp;lt;/code&amp;gt; as radio buttons&lt;br /&gt;
* DDS &amp;lt;code&amp;gt;SFLEND(*SCRBAR)&amp;lt;/code&amp;gt; for load-all subfiles&lt;br /&gt;
&lt;br /&gt;
Enhanced display needs special support regarding terminals. It is present at least in the twinax 3486 terminal, but presumably in all 348x terminals.&lt;br /&gt;
&lt;br /&gt;
Emulators supporting Enhanced Display:&lt;br /&gt;
* all (newer?) IBM provided 5250 emulators&lt;br /&gt;
** iACS&lt;br /&gt;
** Client Access&lt;br /&gt;
* tn5250j (seems to be broken)&lt;br /&gt;
&lt;br /&gt;
== APA ==&lt;br /&gt;
&#039;&#039;All Points Addressable&#039;&#039; is IBM lingo for pixel graphics support. Little is known about this mode at all, and its sole use case was the &amp;lt;code&amp;gt;dspfax&amp;lt;/code&amp;gt; command, to see received Faxes in TIFFG4 format.&lt;br /&gt;
&lt;br /&gt;
According to documentation, the 3489 is the only hardware terminal supporting this display mode.&lt;br /&gt;
&lt;br /&gt;
No known emulators support APA.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[IBM Twinax-Terminals Overview]]&lt;br /&gt;
* [[Communications Traces]]&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [https://www.ibm.com/docs/en/i/7.4.0?topic=device-application-display-programming Application Display Programming] (PDF download), IBM.com&lt;br /&gt;
&lt;br /&gt;
== Footnotes ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category: History]]&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=Terminal_graphics_support&amp;diff=1840</id>
		<title>Terminal graphics support</title>
		<link rel="alternate" type="text/html" href="http://try-as400.pocnet.net/index.php?title=Terminal_graphics_support&amp;diff=1840"/>
		<updated>2026-09-18T16:24:26Z</updated>

		<summary type="html">&lt;p&gt;PoC: /* APA */ typo, not md&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;There are three modes of &#039;&#039;&#039;graphics support&#039;&#039;&#039; in OS/400 regarding &#039;&#039;&#039;terminals&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== GDDM ==&lt;br /&gt;
A subset of the mainframe &#039;&#039;Graphical Data Display Manager&#039;&#039; was ported to OS/400.&lt;br /&gt;
&lt;br /&gt;
GDDM needs special support regarding terminals. The only existing twinax terminal supporting GDDM was the 5292 model 2.&lt;br /&gt;
&lt;br /&gt;
Emulators supporting GDDM:&lt;br /&gt;
* IBM PC support for DOS (not verified), with special drivers, resolutions up to 1024×768 might be possible,&lt;br /&gt;
* an older IDEAcomm release for Windows 3.1 (16 bit), precise version not known.&lt;br /&gt;
&lt;br /&gt;
In later times, it was presumably meant as a way to create graphics for printing.&lt;br /&gt;
&lt;br /&gt;
== Enhanced display ==&lt;br /&gt;
This is a function of the 5250 controller in tandem with a hardware terminal, or a feature of the emulator itself. It provides automatic replacement of on-screen objects with a more or less graphical representation of an object. This includes, but is not limited to:&lt;br /&gt;
* Window borders&lt;br /&gt;
* DDS&amp;lt;ref&amp;gt;Should also work with UIM tags, but not real life tested.&amp;lt;/ref&amp;gt; &amp;lt;code&amp;gt;MLTCHCFLD&amp;lt;/code&amp;gt; as check boxes&lt;br /&gt;
* DDS &amp;lt;code&amp;gt;SNGCHCFLD&amp;lt;/code&amp;gt; as radio buttons&lt;br /&gt;
* DDS &amp;lt;code&amp;gt;SFLEND(*SCRBAR)&amp;lt;/code&amp;gt; for load-all subfiles&lt;br /&gt;
&lt;br /&gt;
Enhanced display needs special support regarding terminals. It is present at least in the twinax 3486 terminal, but presumably in all 348x terminals.&lt;br /&gt;
&lt;br /&gt;
Emulators supporting Enhanced Display:&lt;br /&gt;
* all (newer?) IBM provided 5250 emulators&lt;br /&gt;
** iACS&lt;br /&gt;
** Client Access&lt;br /&gt;
* tn5250j (seems to be broken)&lt;br /&gt;
&lt;br /&gt;
== APA ==&lt;br /&gt;
&#039;&#039;All Points Addressable&#039;&#039; is IBM lingo for pixel graphics support. Little is known about this mode at all, and its sole use case was the &amp;lt;code&amp;gt;dspfax&amp;lt;/code&amp;gt; command, to see received Faxes in TIFFG4 format.&lt;br /&gt;
&lt;br /&gt;
According to documentation, the 3489 is the only hardware terminal supporting this display mode.&lt;br /&gt;
&lt;br /&gt;
No known emulators support APA.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[IBM Twinax-Terminals Overview]]&lt;br /&gt;
* [[Communications Traces]]&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [https://www.ibm.com/docs/en/i/7.4.0?topic=device-application-display-programming Application Display Programming] (PDF download), IBM.com&lt;br /&gt;
&lt;br /&gt;
== Footnotes ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category: History]]&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=Terminal_graphics_support&amp;diff=1839</id>
		<title>Terminal graphics support</title>
		<link rel="alternate" type="text/html" href="http://try-as400.pocnet.net/index.php?title=Terminal_graphics_support&amp;diff=1839"/>
		<updated>2026-09-18T16:23:29Z</updated>

		<summary type="html">&lt;p&gt;PoC: New&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;There are three modes of &#039;&#039;&#039;graphics support&#039;&#039;&#039; in OS/400 regarding &#039;&#039;&#039;terminals&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== GDDM ==&lt;br /&gt;
A subset of the mainframe &#039;&#039;Graphical Data Display Manager&#039;&#039; was ported to OS/400.&lt;br /&gt;
&lt;br /&gt;
GDDM needs special support regarding terminals. The only existing twinax terminal supporting GDDM was the 5292 model 2.&lt;br /&gt;
&lt;br /&gt;
Emulators supporting GDDM:&lt;br /&gt;
* IBM PC support for DOS (not verified), with special drivers, resolutions up to 1024×768 might be possible,&lt;br /&gt;
* an older IDEAcomm release for Windows 3.1 (16 bit), precise version not known.&lt;br /&gt;
&lt;br /&gt;
In later times, it was presumably meant as a way to create graphics for printing.&lt;br /&gt;
&lt;br /&gt;
== Enhanced display ==&lt;br /&gt;
This is a function of the 5250 controller in tandem with a hardware terminal, or a feature of the emulator itself. It provides automatic replacement of on-screen objects with a more or less graphical representation of an object. This includes, but is not limited to:&lt;br /&gt;
* Window borders&lt;br /&gt;
* DDS&amp;lt;ref&amp;gt;Should also work with UIM tags, but not real life tested.&amp;lt;/ref&amp;gt; &amp;lt;code&amp;gt;MLTCHCFLD&amp;lt;/code&amp;gt; as check boxes&lt;br /&gt;
* DDS &amp;lt;code&amp;gt;SNGCHCFLD&amp;lt;/code&amp;gt; as radio buttons&lt;br /&gt;
* DDS &amp;lt;code&amp;gt;SFLEND(*SCRBAR)&amp;lt;/code&amp;gt; for load-all subfiles&lt;br /&gt;
&lt;br /&gt;
Enhanced display needs special support regarding terminals. It is present at least in the twinax 3486 terminal, but presumably in all 348x terminals.&lt;br /&gt;
&lt;br /&gt;
Emulators supporting Enhanced Display:&lt;br /&gt;
* all (newer?) IBM provided 5250 emulators&lt;br /&gt;
** iACS&lt;br /&gt;
** Client Access&lt;br /&gt;
* tn5250j (seems to be broken)&lt;br /&gt;
&lt;br /&gt;
== APA ==&lt;br /&gt;
&#039;&#039;All Points Addressable&#039;&#039; is IBM lingo for pixel graphics support. Little is known about this mode at all, and its sole use case was the `dspfax` command, to see received Faxes in TIFFG4 format.&lt;br /&gt;
&lt;br /&gt;
According to documentation, the 3489 is the only hardware terminal supporting this display mode.&lt;br /&gt;
&lt;br /&gt;
No known emulators support APA.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[IBM Twinax-Terminals Overview]]&lt;br /&gt;
* [[Communications Traces]]&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [https://www.ibm.com/docs/en/i/7.4.0?topic=device-application-display-programming Application Display Programming] (PDF download), IBM.com&lt;br /&gt;
&lt;br /&gt;
== Footnotes ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category: History]]&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=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>
</feed>