<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://computers.huntertur.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Huntertur</id>
	<title>Computers Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://computers.huntertur.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Huntertur"/>
	<link rel="alternate" type="text/html" href="https://computers.huntertur.net/index.php/Special:Contributions/Huntertur"/>
	<updated>2026-06-02T20:07:15Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://computers.huntertur.net/index.php?title=Porosus&amp;diff=1100</id>
		<title>Porosus</title>
		<link rel="alternate" type="text/html" href="https://computers.huntertur.net/index.php?title=Porosus&amp;diff=1100"/>
		<updated>2025-12-15T17:00:48Z</updated>

		<summary type="html">&lt;p&gt;Huntertur: /* Quirks */ Note the keyed power cable&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Lowercase title}}&lt;br /&gt;
The &#039;&#039;&#039;HP Visualize j5600 UNIX Workstation&#039;&#039;&#039; uses a processor I had not heard of before receiving it (PA-8600).&lt;br /&gt;
&lt;br /&gt;
== Specs ==&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
== Quirks ==&lt;br /&gt;
[[Image:HP UNIX Cord.jpg|thumb|right|The keyed power cable]]&lt;br /&gt;
* The power cable is keyed. There needs to be a notch in the plug end of the power cable.&lt;br /&gt;
&lt;br /&gt;
== Notes from &amp;lt;code&amp;gt;Xav101&amp;lt;/code&amp;gt; ==&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
idk if you&#039;ve ever used any HP-UX gear before but there are a few quirks while using it:&lt;br /&gt;
&lt;br /&gt;
1. There&#039;s a safety interlock that prevents the machine from powering up if the side panel is removed (probably to keep it from overheating or to keep you from shocking yourself on the large bus bars). One of the thumbscrews on the rear basically just screws into the PSU. If you need to bypass the interlock for some reason just thread the screw back in.&lt;br /&gt;
&lt;br /&gt;
2. HP-UX is weird about HID peripherals. The machine uses USB connectors but due to being rather old it can behave somewhat strangely. I would recommend trying to use the most basic USB keyboard and mouse you can find.&lt;br /&gt;
If it gets confused for some reason (or no peripherals plugged in) the video will still come up and it will eventually start the desktop but the boot log will be redirected to the serial console. For example if I plug in my G502 this will happen because I think it also detects it as a second keyboard or something.&lt;br /&gt;
&lt;br /&gt;
3. The video connector on the GPUs is an &amp;quot;EVC&amp;quot; connector which was this weird HP thing where I think it was supposed to bundle like video+power+peripherals into a single cable. I&#039;m including an EVC to VGA adapter with it.&lt;br /&gt;
&lt;br /&gt;
4. IIRC the SCSI terminators definitely need to be plugged into the external SCSI ports. I don&#039;t think it has any type of old auto-termination thing. I&#039;m including those also.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Documentation ==&lt;br /&gt;
* https://unixhq.com/wp-content/uploads/j5600.pdf&lt;br /&gt;
&lt;br /&gt;
== History ==&lt;br /&gt;
* 2025-07-22: I receive the computer from &amp;lt;code&amp;gt;Xav101&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Category:Unix]]&lt;/div&gt;</summary>
		<author><name>Huntertur</name></author>
	</entry>
	<entry>
		<id>https://computers.huntertur.net/index.php?title=File:HP_UNIX_Cord.jpg&amp;diff=1099</id>
		<title>File:HP UNIX Cord.jpg</title>
		<link rel="alternate" type="text/html" href="https://computers.huntertur.net/index.php?title=File:HP_UNIX_Cord.jpg&amp;diff=1099"/>
		<updated>2025-12-15T16:58:34Z</updated>

		<summary type="html">&lt;p&gt;Huntertur: The keyed power connector for a HP Visualize j5600 UNIX Workstation.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Summary ==&lt;br /&gt;
The keyed power connector for a [[porosus|HP Visualize j5600 UNIX Workstation]].&lt;/div&gt;</summary>
		<author><name>Huntertur</name></author>
	</entry>
	<entry>
		<id>https://computers.huntertur.net/index.php?title=System_Error_Alert_Table&amp;diff=1098</id>
		<title>System Error Alert Table</title>
		<link rel="alternate" type="text/html" href="https://computers.huntertur.net/index.php?title=System_Error_Alert_Table&amp;diff=1098"/>
		<updated>2025-11-10T20:12:48Z</updated>

		<summary type="html">&lt;p&gt;Huntertur: /* Reading it */ Add line numbers&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &#039;&#039;&#039;System Error Alert Table&#039;&#039;&#039; (resource type &#039;&#039;&#039;&amp;lt;code&amp;gt;DSAT&amp;lt;/code&amp;gt;&#039;&#039;&#039;, allegedly short for &#039;&#039;&#039;Deep Shit Alert Table&#039;&#039;&#039;) describes startup text and fatal error dialogs for the classic Mac OS.&lt;br /&gt;
&lt;br /&gt;
== Specification ==&lt;br /&gt;
&lt;br /&gt;
See [https://preterhuman.net/macstuff/insidemac/OSUtilities/OSUtilities-36.html Inside Macintosh: Operating System Utilities, Chapter 2 - System Error Handler, The System Error Alert Table Resource].&lt;br /&gt;
&lt;br /&gt;
== Reading it ==&lt;br /&gt;
&lt;br /&gt;
ResEdit doesn&#039;t support &amp;lt;code&amp;gt;DSAT&amp;lt;/code&amp;gt; and only shows a hex editor despite having a custom icon for the resource type.&lt;br /&gt;
&lt;br /&gt;
Here is an extremely rough Python script for dumping the alerts, their IDs, and their error messages. Despite DSAT definitions being polymorphic, there is no type information, so this script determines what is an alert by process of elimination (correct size, text pointers are valid, pointed-to text is ASCII). Copy-paste the hex editor output from ResEdit into a text file, then pass its filename to this script:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;code&amp;gt;dsat.py&amp;lt;/code&amp;gt; contents&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
from argparse import ArgumentParser&lt;br /&gt;
from pathlib import Path&lt;br /&gt;
import struct&lt;br /&gt;
from typing import NamedTuple&lt;br /&gt;
&lt;br /&gt;
parser = ArgumentParser()&lt;br /&gt;
parser.add_argument(&#039;hexfilepath&#039;)&lt;br /&gt;
buffer = bytes.fromhex(Path(parser.parse_args().hexfilepath).read_text())&lt;br /&gt;
offset = 0&lt;br /&gt;
&lt;br /&gt;
def read_short():&lt;br /&gt;
    global offset&lt;br /&gt;
    number = int.from_bytes(buffer[offset:offset + 2])&lt;br /&gt;
    offset += 2&lt;br /&gt;
    return number&lt;br /&gt;
&lt;br /&gt;
definition_count = read_short()&lt;br /&gt;
definitions: dict[int, &#039;Definition&#039;]&lt;br /&gt;
&lt;br /&gt;
class Alert(NamedTuple):&lt;br /&gt;
    text1_id: int&lt;br /&gt;
    text2_id: int&lt;br /&gt;
    icon_id: int&lt;br /&gt;
    proc_id: int&lt;br /&gt;
    button_layout_id: int&lt;br /&gt;
&lt;br /&gt;
    @property&lt;br /&gt;
    def text1(self):&lt;br /&gt;
        return definitions[self.text1_id].as_text().replace(&#039;/&#039;, &#039;\n&#039;) if self.text1_id else None&lt;br /&gt;
&lt;br /&gt;
    @property&lt;br /&gt;
    def text2(self):&lt;br /&gt;
        return definitions[self.text2_id].as_text().replace(&#039;/&#039;, &#039;\n&#039;) if self.text2_id else None&lt;br /&gt;
&lt;br /&gt;
    @property&lt;br /&gt;
    def text(self):&lt;br /&gt;
        if not self.text1:&lt;br /&gt;
            return None&lt;br /&gt;
&lt;br /&gt;
        if self.text2:&lt;br /&gt;
            return self.text1 + &#039;\n&#039; + self.text2&lt;br /&gt;
&lt;br /&gt;
        return self.text1&lt;br /&gt;
&lt;br /&gt;
class Definition(NamedTuple):&lt;br /&gt;
    id: int&lt;br /&gt;
    data: bytes&lt;br /&gt;
&lt;br /&gt;
    def as_alert(self):&lt;br /&gt;
        return Alert(*struct.unpack(&#039;&amp;gt;HHHHH&#039;, self.data))&lt;br /&gt;
&lt;br /&gt;
    def as_text(self):&lt;br /&gt;
        return self.data[4:-1].decode(&#039;ascii&#039;)&lt;br /&gt;
&lt;br /&gt;
def read_definition():&lt;br /&gt;
    global offset&lt;br /&gt;
    id = read_short()&lt;br /&gt;
    length = read_short()&lt;br /&gt;
    data = buffer[offset:offset + length]&lt;br /&gt;
    offset += length&lt;br /&gt;
    return Definition(id, data)&lt;br /&gt;
&lt;br /&gt;
default_alert = read_definition().as_alert()&lt;br /&gt;
definitions = {(definition := read_definition()).id: definition&lt;br /&gt;
               for _ in range(definition_count)}&lt;br /&gt;
&lt;br /&gt;
for error_id, definition in definitions.items():&lt;br /&gt;
    if len(definition.data) == 10:&lt;br /&gt;
        alert = definition.as_alert()&lt;br /&gt;
        try:&lt;br /&gt;
            print(error_id, &#039;-&#039;, alert.text)&lt;br /&gt;
        except (KeyError, UnicodeDecodeError):&lt;br /&gt;
            pass&lt;br /&gt;
&lt;br /&gt;
print(&#039;Default - &#039;, default_alert.text)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
&lt;br /&gt;
* The System Error Alert Table isn&#039;t just for fatal errors! The text below shows that the Force Quit dialog, among other things, is implemented here.&lt;br /&gt;
* Sometimes, there is no error text, or the text is cut off; this is due to a custom procedure being used for that alert.&lt;br /&gt;
** Post-boot (when {{Resource|DSAT|2}} is loaded), &amp;quot;out of memory&amp;quot;, &amp;quot;unimplemented trap&amp;quot;, and friends are printed by a procedure.&lt;br /&gt;
* Entries in the table are not in order.&lt;br /&gt;
* The &amp;quot;Power PC&amp;quot; and &amp;quot;System&amp;quot; (instead of Mac OS for &amp;gt;= 7.6) typos are in the original text.&lt;br /&gt;
* The PC Card warning exists on the PowerBook version of Mac OS 8.6 but not the generic version of Mac OS 7.6.1 (on a PowerBook 5300c) or Mac OS 9.2.2 (on a Power Mac G4).&lt;br /&gt;
** Is this a one-off for this version, or does this table get dynamically generated at install time?&lt;br /&gt;
* Mac OS 7.6.1 has a beta message in {{Resource|DSAT|0}} despite being the production release.&lt;br /&gt;
* In System 7.1.2, both the System suitcase and PowerPC Enabler have {{Resource|DSAT}} resources, but only the PowerPC Enabler version has the &amp;quot;Welcome to Power Macintosh&amp;quot; text.&lt;br /&gt;
&lt;br /&gt;
== Contents in different system versions ==&lt;br /&gt;
&lt;br /&gt;
=== System Software 6.0.8 ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+ {{Resource|DSAT|0}}&lt;br /&gt;
|-&lt;br /&gt;
! Error ID !! Text&lt;br /&gt;
|-&lt;br /&gt;
| 65526 || MacsBug installed.&lt;br /&gt;
|-&lt;br /&gt;
| 65525 ||&lt;br /&gt;
|-&lt;br /&gt;
| 102 || This startup disk will not work on this Macintosh model.  Use the latest Installer to update this disk for this model.  (System 6.0.8 does not work on this model; you need a newer version that does.)&lt;br /&gt;
|-&lt;br /&gt;
| 103 || This Macintosh is set for 32-bit addressing.  You may switch to 24-bit addressing and use this disk or restart and use a newer startup disk.  (System 6.0.8 does not work with 32-bit addressing.)&lt;br /&gt;
|-&lt;br /&gt;
| 101 || Sorry, a system error occurred.&lt;br /&gt;
&lt;br /&gt;
RAM parity&lt;br /&gt;
|-&lt;br /&gt;
| Default || Welcome to Macintosh.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+ {{Resource|DSAT|2}}&lt;br /&gt;
|-&lt;br /&gt;
! Error ID !! Text&lt;br /&gt;
|-&lt;br /&gt;
| 30 || Please insert the disk:&lt;br /&gt;
|-&lt;br /&gt;
| 28 || Sorry, a system error occurred.&lt;br /&gt;
|-&lt;br /&gt;
| 26 || The following application is busy or damaged:&lt;br /&gt;
|-&lt;br /&gt;
| 42 || You may now switch off your Macintosh safely.&lt;br /&gt;
|-&lt;br /&gt;
| 20000 || If you wish to continue using your Macintosh, press Restart.  If not, press Shut Down.&lt;br /&gt;
|-&lt;br /&gt;
| 20001 || You may now switch off your Macintosh safely. If you wish to continue using your Macintosh, press Restart.&lt;br /&gt;
|-&lt;br /&gt;
| 20002 || Unsaved changes will be lost.&lt;br /&gt;
|-&lt;br /&gt;
| 101 || Sorry, a system error occurred.&lt;br /&gt;
&lt;br /&gt;
RAM parity&lt;br /&gt;
|-&lt;br /&gt;
| Default || Sorry, a system error occurred.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Mac OS 7.6.1 ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+ {{Resource|DSAT|0}}&lt;br /&gt;
|-&lt;br /&gt;
! Error ID !! Text&lt;br /&gt;
|-&lt;br /&gt;
| 40 || Just figured out what BETA stands for.&lt;br /&gt;
|-&lt;br /&gt;
| 65526 ||&lt;br /&gt;
|-&lt;br /&gt;
| 65525 ||&lt;br /&gt;
|-&lt;br /&gt;
| 65523 ||&lt;br /&gt;
|-&lt;br /&gt;
| 102 || This startup disk will not work on this Macintosh model.  Use the latest Installer to update this disk for this model.&lt;br /&gt;
|-&lt;br /&gt;
| 104 || This disk must be unlocked in order to perform one-time housekeeping.  If you wish to use this disk to start your Macintosh, unlock it.&lt;br /&gt;
|-&lt;br /&gt;
| 105 || System 7.6.1 needs more memory to start up.&lt;br /&gt;
|-&lt;br /&gt;
| Default || Sorry, a system error occurred.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+ {{Resource|DSAT|2}}&lt;br /&gt;
|-&lt;br /&gt;
! Error ID !! Text&lt;br /&gt;
|-&lt;br /&gt;
| 28 || Sorry, a system error occurred.&lt;br /&gt;
|-&lt;br /&gt;
| 25 || Not enough memory is available while using&lt;br /&gt;
|-&lt;br /&gt;
| 42 || It is now safe to switch off your Macintosh.&lt;br /&gt;
|-&lt;br /&gt;
| 20000 || If you wish to continue using your Macintosh, press Restart.  If not, press Shut Down.&lt;br /&gt;
|-&lt;br /&gt;
| 20001 || It is now safe to switch off your Macintosh. If you wish to continue using your Macintosh, press Restart.&lt;br /&gt;
|-&lt;br /&gt;
| 20002 || Unsaved changes will be lost.&lt;br /&gt;
|-&lt;br /&gt;
| 99 || The System file on this startup disk may be damaged.  The Installer can be used to repair this disk.&lt;br /&gt;
|-&lt;br /&gt;
| 98 || The System file on this startup device does not contain the resources necessary to boot this Macintosh.  Please use the Installer to update the System file.&lt;br /&gt;
|-&lt;br /&gt;
| 101 || Sorry, a system error occurred.&lt;br /&gt;
&lt;br /&gt;
RAM parity&lt;br /&gt;
|-&lt;br /&gt;
| 20010 || Hard Disk Cable Warning&lt;br /&gt;
&lt;br /&gt;
You must first shutdown the Macintosh before attaching any SCSI hard disk cables.  Disconnect the cable from the back of the machine right now.&lt;br /&gt;
|-&lt;br /&gt;
| 1010 || Code Fragment could not be prepared.&lt;br /&gt;
|-&lt;br /&gt;
| 1011 || Internal Mixed Mode failure.&lt;br /&gt;
|-&lt;br /&gt;
| Default || Sorry, a system error occurred.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Mac OS 8.6 (PowerBook G3) ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+ {{Resource|DSAT|0}}&lt;br /&gt;
|-&lt;br /&gt;
! Error ID !! Text&lt;br /&gt;
|-&lt;br /&gt;
| 102 || This startup disk will not work on this Macintosh model.  Use the latest Installer to update this disk for this model.&lt;br /&gt;
|-&lt;br /&gt;
| 104 || This disk must be unlocked in order to perform one-time housekeeping.  If you wish to use this disk to start your Macintosh, unlock it.&lt;br /&gt;
|-&lt;br /&gt;
| 116 || This startup disk will not work on this computer. A Power PC based computer is required to startup from this disk.&lt;br /&gt;
|-&lt;br /&gt;
| 118 || The system software on the startup disk only functions on the original media, not if copied to another drive.&lt;br /&gt;
|-&lt;br /&gt;
| 105 || System 8.6 needs more memory to start up.&lt;br /&gt;
|-&lt;br /&gt;
| Default || Sorry, a system error occurred.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+ {{Resource|DSAT|2}}&lt;br /&gt;
|-&lt;br /&gt;
! Error ID !! Text&lt;br /&gt;
|-&lt;br /&gt;
| 28 || Sorry, a system error occurred.&lt;br /&gt;
|-&lt;br /&gt;
| 25 || Not enough memory is available while using&lt;br /&gt;
|-&lt;br /&gt;
| 42 ||&lt;br /&gt;
|-&lt;br /&gt;
| 20000 || If you wish to continue using your Macintosh, press Restart.  If not, press Shut Down.&lt;br /&gt;
|-&lt;br /&gt;
| 20001 || It is now safe to switch off your Macintosh. If you wish to continue using your Macintosh, press Restart.&lt;br /&gt;
|-&lt;br /&gt;
| 20002 || Clicking Force Quit causes you to lose any unsaved changes. To avoid further problems, restart your computer after you click Force Quit.&lt;br /&gt;
|-&lt;br /&gt;
| 99 || The System file on this startup disk may be damaged.  The Installer can be used to repair this disk.&lt;br /&gt;
|-&lt;br /&gt;
| 98 || The System file on this startup device does not contain the resources necessary to boot this Macintosh.  Please use the Installer to update the System file.&lt;br /&gt;
|-&lt;br /&gt;
| 101 || Sorry, a system error occurred.&lt;br /&gt;
&lt;br /&gt;
RAM parity&lt;br /&gt;
|-&lt;br /&gt;
| 20010 || Hard Disk Cable Warning&lt;br /&gt;
&lt;br /&gt;
You must first shutdown the Macintosh before attaching any SCSI hard disk cables.  Disconnect the cable from the back of the machine right now.&lt;br /&gt;
|-&lt;br /&gt;
| 29205 || Please reinsert the PC Card&lt;br /&gt;
&lt;br /&gt;
It is currently in use and must be reinserted immediately to prevent damaging a document, file or the card.&lt;br /&gt;
&lt;br /&gt;
Before ejecting a PC Card, you must close all documents and applications using the PC Card.&lt;br /&gt;
|-&lt;br /&gt;
| 1010 || Code Fragment could not be prepared.&lt;br /&gt;
|-&lt;br /&gt;
| 1011 || Internal Mixed Mode failure.&lt;br /&gt;
|-&lt;br /&gt;
| Default || Sorry, a system error occurred.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Mac OS 9.2.2 ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+ {{Resource|DSAT|0}}&lt;br /&gt;
|-&lt;br /&gt;
! Error ID !! Text&lt;br /&gt;
|-&lt;br /&gt;
| 102 || This startup disk will not work on this Macintosh model.  Use the latest Installer to update this disk for this model.&lt;br /&gt;
|-&lt;br /&gt;
| 104 || This disk must be unlocked in order to perform one-time housekeeping.  If you wish to use this disk to start your Macintosh, unlock it.&lt;br /&gt;
|-&lt;br /&gt;
| 116 || This startup disk will not work on this computer. A Power PC based computer is required to startup from this disk.&lt;br /&gt;
|-&lt;br /&gt;
| 118 || The system software on the startup disk only functions on the original media, not if copied to another drive.&lt;br /&gt;
|-&lt;br /&gt;
| 105 || System 9.2.2 needs more memory to start up.&lt;br /&gt;
|-&lt;br /&gt;
| Default || Sorry, a system error occurred.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+ {{Resource|DSAT|2}}&lt;br /&gt;
|-&lt;br /&gt;
! Error ID !! Text&lt;br /&gt;
|-&lt;br /&gt;
| 28 || Sorry, a system error occurred.&lt;br /&gt;
|-&lt;br /&gt;
| 25 || Not enough memory is available while using&lt;br /&gt;
|-&lt;br /&gt;
| 42 ||&lt;br /&gt;
|-&lt;br /&gt;
| 20000 || If you wish to continue using your Macintosh, press Restart.  If not, press Shut Down.&lt;br /&gt;
|-&lt;br /&gt;
| 20001 || It is now safe to switch off your Macintosh. If you wish to continue using your Macintosh, press Restart.&lt;br /&gt;
|-&lt;br /&gt;
| 20002 || Clicking Force Quit causes you to lose any unsaved changes. To avoid further problems, restart your computer after you click Force Quit.&lt;br /&gt;
|-&lt;br /&gt;
| 99 || The System file on this startup disk may be damaged.  The Installer can be used to repair this disk.&lt;br /&gt;
|-&lt;br /&gt;
| 98 || The System file on this startup device does not contain the resources necessary to boot this Macintosh.  Please use the Installer to update the System file.&lt;br /&gt;
|-&lt;br /&gt;
| 101 || Sorry, a system error occurred.&lt;br /&gt;
&lt;br /&gt;
RAM parity&lt;br /&gt;
|-&lt;br /&gt;
| 20010 || Hard Disk Cable Warning&lt;br /&gt;
&lt;br /&gt;
You must first shutdown the Macintosh before attaching any SCSI hard disk cables.  Disconnect the cable from the back of the machine right now.&lt;br /&gt;
|-&lt;br /&gt;
| 1010 || Code Fragment could not be prepared.&lt;br /&gt;
|-&lt;br /&gt;
| 1011 || Internal Mixed Mode failure.&lt;br /&gt;
|-&lt;br /&gt;
| Default || Sorry, a system error occurred.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:Classic Mac OS]]&lt;/div&gt;</summary>
		<author><name>Huntertur</name></author>
	</entry>
	<entry>
		<id>https://computers.huntertur.net/index.php?title=Netatalk_3.x_and_4.x_Setup&amp;diff=1097</id>
		<title>Netatalk 3.x and 4.x Setup</title>
		<link rel="alternate" type="text/html" href="https://computers.huntertur.net/index.php?title=Netatalk_3.x_and_4.x_Setup&amp;diff=1097"/>
		<updated>2025-10-02T01:35:27Z</updated>

		<summary type="html">&lt;p&gt;Huntertur: Warn against keychain use&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== &amp;lt;code&amp;gt;/etc/netatalk/afp.conf&amp;lt;/code&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[Global]&lt;br /&gt;
uam list = uams_dhx2.so uams_dhx.so&lt;br /&gt;
&lt;br /&gt;
[Homes]&lt;br /&gt;
basedir regex = /home&lt;br /&gt;
&lt;br /&gt;
[Software]&lt;br /&gt;
path = /mnt/data/software&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
&lt;br /&gt;
* This configuration works for both Netatalk 3.x and 4.x.&lt;br /&gt;
* The first UAM is used for Mac OS X. The second is used for Mac OS 9.&lt;br /&gt;
* You probably shouldn&#039;t serve this on the public internet.&lt;br /&gt;
* If you need to use the other UAMs, some will require your Unix password to be eight or fewer characters in length, and the others will need to use passwords set through &amp;lt;code&amp;gt;afppasswd&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Don&#039;t use the guest UAM if you want to be able to write to anything.&lt;br /&gt;
* On Classic Mac OS, if using a password UAM, do not save anything to the user keychain. Whatever value gets stored there seems to become invalidated on next login.&lt;br /&gt;
&lt;br /&gt;
[[Category:Guides]]&lt;/div&gt;</summary>
		<author><name>Huntertur</name></author>
	</entry>
	<entry>
		<id>https://computers.huntertur.net/index.php?title=Macintosh_Classic_Boot_ROM_hidden_credits&amp;diff=1096</id>
		<title>Macintosh Classic Boot ROM hidden credits</title>
		<link rel="alternate" type="text/html" href="https://computers.huntertur.net/index.php?title=Macintosh_Classic_Boot_ROM_hidden_credits&amp;diff=1096"/>
		<updated>2025-09-28T19:35:07Z</updated>

		<summary type="html">&lt;p&gt;Huntertur: Create page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Hidden credits in the Macintosh Classic Boot ROM&#039;&#039;&#039; (hold Command-Option-X-O while booting).&lt;br /&gt;
&lt;br /&gt;
You can view these by bringing up a Standard File Open dialog and switching to the &amp;quot;Boot Disk&amp;quot;, which is only visible if you booted from the ROM. I used ResEdit since I don&#039;t think there are any filters applied to the list, there. These don&#039;t appear in the Finder.&lt;br /&gt;
&lt;br /&gt;
== The credits list ==&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;leaf&amp;quot; nodes (the names) are still folders, just without any contents.&lt;br /&gt;
&lt;br /&gt;
* Boot Disk&lt;br /&gt;
** System Folder&lt;br /&gt;
*** Brought to you by&lt;br /&gt;
**** Bruce Leak&lt;br /&gt;
**** Gary Davidian&lt;br /&gt;
**** Gary Rensberger&lt;br /&gt;
**** Hardware&lt;br /&gt;
***** Steve Smith&lt;br /&gt;
***** Earl Edwards&lt;br /&gt;
***** H.L. Cheung&lt;br /&gt;
***** John Neil&lt;br /&gt;
***** Peter Krause&lt;br /&gt;
***** S.L. Chok&lt;br /&gt;
**** Software&lt;br /&gt;
***** Amy Rapport&lt;br /&gt;
***** Dave Wong&lt;br /&gt;
***** John Cary&lt;br /&gt;
***** K.C. Chin&lt;br /&gt;
***** Paul Mercer&lt;br /&gt;
&lt;br /&gt;
[[Category:Classic Mac OS]]&lt;/div&gt;</summary>
		<author><name>Huntertur</name></author>
	</entry>
	<entry>
		<id>https://computers.huntertur.net/index.php?title=System_Error_Alert_Table&amp;diff=1095</id>
		<title>System Error Alert Table</title>
		<link rel="alternate" type="text/html" href="https://computers.huntertur.net/index.php?title=System_Error_Alert_Table&amp;diff=1095"/>
		<updated>2025-09-28T18:36:19Z</updated>

		<summary type="html">&lt;p&gt;Huntertur: /* Notes */ Note the Power Macintosh text location&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &#039;&#039;&#039;System Error Alert Table&#039;&#039;&#039; (resource type &#039;&#039;&#039;&amp;lt;code&amp;gt;DSAT&amp;lt;/code&amp;gt;&#039;&#039;&#039;, allegedly short for &#039;&#039;&#039;Deep Shit Alert Table&#039;&#039;&#039;) describes startup text and fatal error dialogs for the classic Mac OS.&lt;br /&gt;
&lt;br /&gt;
== Specification ==&lt;br /&gt;
&lt;br /&gt;
See [https://preterhuman.net/macstuff/insidemac/OSUtilities/OSUtilities-36.html Inside Macintosh: Operating System Utilities, Chapter 2 - System Error Handler, The System Error Alert Table Resource].&lt;br /&gt;
&lt;br /&gt;
== Reading it ==&lt;br /&gt;
&lt;br /&gt;
ResEdit doesn&#039;t support &amp;lt;code&amp;gt;DSAT&amp;lt;/code&amp;gt; and only shows a hex editor despite having a custom icon for the resource type.&lt;br /&gt;
&lt;br /&gt;
Here is an extremely rough Python script for dumping the alerts, their IDs, and their error messages. Despite DSAT definitions being polymorphic, there is no type information, so this script determines what is an alert by process of elimination (correct size, text pointers are valid, pointed-to text is ASCII). Copy-paste the hex editor output from ResEdit into a text file, then pass its filename to this script:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;code&amp;gt;dsat.py&amp;lt;/code&amp;gt; contents&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
from argparse import ArgumentParser&lt;br /&gt;
from pathlib import Path&lt;br /&gt;
import struct&lt;br /&gt;
from typing import NamedTuple&lt;br /&gt;
&lt;br /&gt;
parser = ArgumentParser()&lt;br /&gt;
parser.add_argument(&#039;hexfilepath&#039;)&lt;br /&gt;
buffer = bytes.fromhex(Path(parser.parse_args().hexfilepath).read_text())&lt;br /&gt;
offset = 0&lt;br /&gt;
&lt;br /&gt;
def read_short():&lt;br /&gt;
    global offset&lt;br /&gt;
    number = int.from_bytes(buffer[offset:offset + 2])&lt;br /&gt;
    offset += 2&lt;br /&gt;
    return number&lt;br /&gt;
&lt;br /&gt;
definition_count = read_short()&lt;br /&gt;
definitions: dict[int, &#039;Definition&#039;]&lt;br /&gt;
&lt;br /&gt;
class Alert(NamedTuple):&lt;br /&gt;
    text1_id: int&lt;br /&gt;
    text2_id: int&lt;br /&gt;
    icon_id: int&lt;br /&gt;
    proc_id: int&lt;br /&gt;
    button_layout_id: int&lt;br /&gt;
&lt;br /&gt;
    @property&lt;br /&gt;
    def text1(self):&lt;br /&gt;
        return definitions[self.text1_id].as_text().replace(&#039;/&#039;, &#039;\n&#039;) if self.text1_id else None&lt;br /&gt;
&lt;br /&gt;
    @property&lt;br /&gt;
    def text2(self):&lt;br /&gt;
        return definitions[self.text2_id].as_text().replace(&#039;/&#039;, &#039;\n&#039;) if self.text2_id else None&lt;br /&gt;
&lt;br /&gt;
    @property&lt;br /&gt;
    def text(self):&lt;br /&gt;
        if not self.text1:&lt;br /&gt;
            return None&lt;br /&gt;
&lt;br /&gt;
        if self.text2:&lt;br /&gt;
            return self.text1 + &#039;\n&#039; + self.text2&lt;br /&gt;
&lt;br /&gt;
        return self.text1&lt;br /&gt;
&lt;br /&gt;
class Definition(NamedTuple):&lt;br /&gt;
    id: int&lt;br /&gt;
    data: bytes&lt;br /&gt;
&lt;br /&gt;
    def as_alert(self):&lt;br /&gt;
        return Alert(*struct.unpack(&#039;&amp;gt;HHHHH&#039;, self.data))&lt;br /&gt;
&lt;br /&gt;
    def as_text(self):&lt;br /&gt;
        return self.data[4:-1].decode(&#039;ascii&#039;)&lt;br /&gt;
&lt;br /&gt;
def read_definition():&lt;br /&gt;
    global offset&lt;br /&gt;
    id = read_short()&lt;br /&gt;
    length = read_short()&lt;br /&gt;
    data = buffer[offset:offset + length]&lt;br /&gt;
    offset += length&lt;br /&gt;
    return Definition(id, data)&lt;br /&gt;
&lt;br /&gt;
default_alert = read_definition().as_alert()&lt;br /&gt;
definitions = {(definition := read_definition()).id: definition&lt;br /&gt;
               for _ in range(definition_count)}&lt;br /&gt;
&lt;br /&gt;
for error_id, definition in definitions.items():&lt;br /&gt;
    if len(definition.data) == 10:&lt;br /&gt;
        alert = definition.as_alert()&lt;br /&gt;
        try:&lt;br /&gt;
            print(error_id, &#039;-&#039;, alert.text)&lt;br /&gt;
        except (KeyError, UnicodeDecodeError):&lt;br /&gt;
            pass&lt;br /&gt;
&lt;br /&gt;
print(&#039;Default - &#039;, default_alert.text)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
&lt;br /&gt;
* The System Error Alert Table isn&#039;t just for fatal errors! The text below shows that the Force Quit dialog, among other things, is implemented here.&lt;br /&gt;
* Sometimes, there is no error text, or the text is cut off; this is due to a custom procedure being used for that alert.&lt;br /&gt;
** Post-boot (when {{Resource|DSAT|2}} is loaded), &amp;quot;out of memory&amp;quot;, &amp;quot;unimplemented trap&amp;quot;, and friends are printed by a procedure.&lt;br /&gt;
* Entries in the table are not in order.&lt;br /&gt;
* The &amp;quot;Power PC&amp;quot; and &amp;quot;System&amp;quot; (instead of Mac OS for &amp;gt;= 7.6) typos are in the original text.&lt;br /&gt;
* The PC Card warning exists on the PowerBook version of Mac OS 8.6 but not the generic version of Mac OS 7.6.1 (on a PowerBook 5300c) or Mac OS 9.2.2 (on a Power Mac G4).&lt;br /&gt;
** Is this a one-off for this version, or does this table get dynamically generated at install time?&lt;br /&gt;
* Mac OS 7.6.1 has a beta message in {{Resource|DSAT|0}} despite being the production release.&lt;br /&gt;
* In System 7.1.2, both the System suitcase and PowerPC Enabler have {{Resource|DSAT}} resources, but only the PowerPC Enabler version has the &amp;quot;Welcome to Power Macintosh&amp;quot; text.&lt;br /&gt;
&lt;br /&gt;
== Contents in different system versions ==&lt;br /&gt;
&lt;br /&gt;
=== System Software 6.0.8 ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+ {{Resource|DSAT|0}}&lt;br /&gt;
|-&lt;br /&gt;
! Error ID !! Text&lt;br /&gt;
|-&lt;br /&gt;
| 65526 || MacsBug installed.&lt;br /&gt;
|-&lt;br /&gt;
| 65525 ||&lt;br /&gt;
|-&lt;br /&gt;
| 102 || This startup disk will not work on this Macintosh model.  Use the latest Installer to update this disk for this model.  (System 6.0.8 does not work on this model; you need a newer version that does.)&lt;br /&gt;
|-&lt;br /&gt;
| 103 || This Macintosh is set for 32-bit addressing.  You may switch to 24-bit addressing and use this disk or restart and use a newer startup disk.  (System 6.0.8 does not work with 32-bit addressing.)&lt;br /&gt;
|-&lt;br /&gt;
| 101 || Sorry, a system error occurred.&lt;br /&gt;
&lt;br /&gt;
RAM parity&lt;br /&gt;
|-&lt;br /&gt;
| Default || Welcome to Macintosh.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+ {{Resource|DSAT|2}}&lt;br /&gt;
|-&lt;br /&gt;
! Error ID !! Text&lt;br /&gt;
|-&lt;br /&gt;
| 30 || Please insert the disk:&lt;br /&gt;
|-&lt;br /&gt;
| 28 || Sorry, a system error occurred.&lt;br /&gt;
|-&lt;br /&gt;
| 26 || The following application is busy or damaged:&lt;br /&gt;
|-&lt;br /&gt;
| 42 || You may now switch off your Macintosh safely.&lt;br /&gt;
|-&lt;br /&gt;
| 20000 || If you wish to continue using your Macintosh, press Restart.  If not, press Shut Down.&lt;br /&gt;
|-&lt;br /&gt;
| 20001 || You may now switch off your Macintosh safely. If you wish to continue using your Macintosh, press Restart.&lt;br /&gt;
|-&lt;br /&gt;
| 20002 || Unsaved changes will be lost.&lt;br /&gt;
|-&lt;br /&gt;
| 101 || Sorry, a system error occurred.&lt;br /&gt;
&lt;br /&gt;
RAM parity&lt;br /&gt;
|-&lt;br /&gt;
| Default || Sorry, a system error occurred.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Mac OS 7.6.1 ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+ {{Resource|DSAT|0}}&lt;br /&gt;
|-&lt;br /&gt;
! Error ID !! Text&lt;br /&gt;
|-&lt;br /&gt;
| 40 || Just figured out what BETA stands for.&lt;br /&gt;
|-&lt;br /&gt;
| 65526 ||&lt;br /&gt;
|-&lt;br /&gt;
| 65525 ||&lt;br /&gt;
|-&lt;br /&gt;
| 65523 ||&lt;br /&gt;
|-&lt;br /&gt;
| 102 || This startup disk will not work on this Macintosh model.  Use the latest Installer to update this disk for this model.&lt;br /&gt;
|-&lt;br /&gt;
| 104 || This disk must be unlocked in order to perform one-time housekeeping.  If you wish to use this disk to start your Macintosh, unlock it.&lt;br /&gt;
|-&lt;br /&gt;
| 105 || System 7.6.1 needs more memory to start up.&lt;br /&gt;
|-&lt;br /&gt;
| Default || Sorry, a system error occurred.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+ {{Resource|DSAT|2}}&lt;br /&gt;
|-&lt;br /&gt;
! Error ID !! Text&lt;br /&gt;
|-&lt;br /&gt;
| 28 || Sorry, a system error occurred.&lt;br /&gt;
|-&lt;br /&gt;
| 25 || Not enough memory is available while using&lt;br /&gt;
|-&lt;br /&gt;
| 42 || It is now safe to switch off your Macintosh.&lt;br /&gt;
|-&lt;br /&gt;
| 20000 || If you wish to continue using your Macintosh, press Restart.  If not, press Shut Down.&lt;br /&gt;
|-&lt;br /&gt;
| 20001 || It is now safe to switch off your Macintosh. If you wish to continue using your Macintosh, press Restart.&lt;br /&gt;
|-&lt;br /&gt;
| 20002 || Unsaved changes will be lost.&lt;br /&gt;
|-&lt;br /&gt;
| 99 || The System file on this startup disk may be damaged.  The Installer can be used to repair this disk.&lt;br /&gt;
|-&lt;br /&gt;
| 98 || The System file on this startup device does not contain the resources necessary to boot this Macintosh.  Please use the Installer to update the System file.&lt;br /&gt;
|-&lt;br /&gt;
| 101 || Sorry, a system error occurred.&lt;br /&gt;
&lt;br /&gt;
RAM parity&lt;br /&gt;
|-&lt;br /&gt;
| 20010 || Hard Disk Cable Warning&lt;br /&gt;
&lt;br /&gt;
You must first shutdown the Macintosh before attaching any SCSI hard disk cables.  Disconnect the cable from the back of the machine right now.&lt;br /&gt;
|-&lt;br /&gt;
| 1010 || Code Fragment could not be prepared.&lt;br /&gt;
|-&lt;br /&gt;
| 1011 || Internal Mixed Mode failure.&lt;br /&gt;
|-&lt;br /&gt;
| Default || Sorry, a system error occurred.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Mac OS 8.6 (PowerBook G3) ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+ {{Resource|DSAT|0}}&lt;br /&gt;
|-&lt;br /&gt;
! Error ID !! Text&lt;br /&gt;
|-&lt;br /&gt;
| 102 || This startup disk will not work on this Macintosh model.  Use the latest Installer to update this disk for this model.&lt;br /&gt;
|-&lt;br /&gt;
| 104 || This disk must be unlocked in order to perform one-time housekeeping.  If you wish to use this disk to start your Macintosh, unlock it.&lt;br /&gt;
|-&lt;br /&gt;
| 116 || This startup disk will not work on this computer. A Power PC based computer is required to startup from this disk.&lt;br /&gt;
|-&lt;br /&gt;
| 118 || The system software on the startup disk only functions on the original media, not if copied to another drive.&lt;br /&gt;
|-&lt;br /&gt;
| 105 || System 8.6 needs more memory to start up.&lt;br /&gt;
|-&lt;br /&gt;
| Default || Sorry, a system error occurred.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+ {{Resource|DSAT|2}}&lt;br /&gt;
|-&lt;br /&gt;
! Error ID !! Text&lt;br /&gt;
|-&lt;br /&gt;
| 28 || Sorry, a system error occurred.&lt;br /&gt;
|-&lt;br /&gt;
| 25 || Not enough memory is available while using&lt;br /&gt;
|-&lt;br /&gt;
| 42 ||&lt;br /&gt;
|-&lt;br /&gt;
| 20000 || If you wish to continue using your Macintosh, press Restart.  If not, press Shut Down.&lt;br /&gt;
|-&lt;br /&gt;
| 20001 || It is now safe to switch off your Macintosh. If you wish to continue using your Macintosh, press Restart.&lt;br /&gt;
|-&lt;br /&gt;
| 20002 || Clicking Force Quit causes you to lose any unsaved changes. To avoid further problems, restart your computer after you click Force Quit.&lt;br /&gt;
|-&lt;br /&gt;
| 99 || The System file on this startup disk may be damaged.  The Installer can be used to repair this disk.&lt;br /&gt;
|-&lt;br /&gt;
| 98 || The System file on this startup device does not contain the resources necessary to boot this Macintosh.  Please use the Installer to update the System file.&lt;br /&gt;
|-&lt;br /&gt;
| 101 || Sorry, a system error occurred.&lt;br /&gt;
&lt;br /&gt;
RAM parity&lt;br /&gt;
|-&lt;br /&gt;
| 20010 || Hard Disk Cable Warning&lt;br /&gt;
&lt;br /&gt;
You must first shutdown the Macintosh before attaching any SCSI hard disk cables.  Disconnect the cable from the back of the machine right now.&lt;br /&gt;
|-&lt;br /&gt;
| 29205 || Please reinsert the PC Card&lt;br /&gt;
&lt;br /&gt;
It is currently in use and must be reinserted immediately to prevent damaging a document, file or the card.&lt;br /&gt;
&lt;br /&gt;
Before ejecting a PC Card, you must close all documents and applications using the PC Card.&lt;br /&gt;
|-&lt;br /&gt;
| 1010 || Code Fragment could not be prepared.&lt;br /&gt;
|-&lt;br /&gt;
| 1011 || Internal Mixed Mode failure.&lt;br /&gt;
|-&lt;br /&gt;
| Default || Sorry, a system error occurred.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Mac OS 9.2.2 ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+ {{Resource|DSAT|0}}&lt;br /&gt;
|-&lt;br /&gt;
! Error ID !! Text&lt;br /&gt;
|-&lt;br /&gt;
| 102 || This startup disk will not work on this Macintosh model.  Use the latest Installer to update this disk for this model.&lt;br /&gt;
|-&lt;br /&gt;
| 104 || This disk must be unlocked in order to perform one-time housekeeping.  If you wish to use this disk to start your Macintosh, unlock it.&lt;br /&gt;
|-&lt;br /&gt;
| 116 || This startup disk will not work on this computer. A Power PC based computer is required to startup from this disk.&lt;br /&gt;
|-&lt;br /&gt;
| 118 || The system software on the startup disk only functions on the original media, not if copied to another drive.&lt;br /&gt;
|-&lt;br /&gt;
| 105 || System 9.2.2 needs more memory to start up.&lt;br /&gt;
|-&lt;br /&gt;
| Default || Sorry, a system error occurred.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+ {{Resource|DSAT|2}}&lt;br /&gt;
|-&lt;br /&gt;
! Error ID !! Text&lt;br /&gt;
|-&lt;br /&gt;
| 28 || Sorry, a system error occurred.&lt;br /&gt;
|-&lt;br /&gt;
| 25 || Not enough memory is available while using&lt;br /&gt;
|-&lt;br /&gt;
| 42 ||&lt;br /&gt;
|-&lt;br /&gt;
| 20000 || If you wish to continue using your Macintosh, press Restart.  If not, press Shut Down.&lt;br /&gt;
|-&lt;br /&gt;
| 20001 || It is now safe to switch off your Macintosh. If you wish to continue using your Macintosh, press Restart.&lt;br /&gt;
|-&lt;br /&gt;
| 20002 || Clicking Force Quit causes you to lose any unsaved changes. To avoid further problems, restart your computer after you click Force Quit.&lt;br /&gt;
|-&lt;br /&gt;
| 99 || The System file on this startup disk may be damaged.  The Installer can be used to repair this disk.&lt;br /&gt;
|-&lt;br /&gt;
| 98 || The System file on this startup device does not contain the resources necessary to boot this Macintosh.  Please use the Installer to update the System file.&lt;br /&gt;
|-&lt;br /&gt;
| 101 || Sorry, a system error occurred.&lt;br /&gt;
&lt;br /&gt;
RAM parity&lt;br /&gt;
|-&lt;br /&gt;
| 20010 || Hard Disk Cable Warning&lt;br /&gt;
&lt;br /&gt;
You must first shutdown the Macintosh before attaching any SCSI hard disk cables.  Disconnect the cable from the back of the machine right now.&lt;br /&gt;
|-&lt;br /&gt;
| 1010 || Code Fragment could not be prepared.&lt;br /&gt;
|-&lt;br /&gt;
| 1011 || Internal Mixed Mode failure.&lt;br /&gt;
|-&lt;br /&gt;
| Default || Sorry, a system error occurred.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:Classic Mac OS]]&lt;/div&gt;</summary>
		<author><name>Huntertur</name></author>
	</entry>
	<entry>
		<id>https://computers.huntertur.net/index.php?title=Raptor&amp;diff=1094</id>
		<title>Raptor</title>
		<link rel="alternate" type="text/html" href="https://computers.huntertur.net/index.php?title=Raptor&amp;diff=1094"/>
		<updated>2025-09-27T23:25:30Z</updated>

		<summary type="html">&lt;p&gt;Huntertur: /* Quirks */ Note how to reliably boot Copland&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{lowercase title}}&lt;br /&gt;
[[Image:raptor disassembly.jpg|thumb|right|&amp;quot;Removing the clock battery won&#039;t be so bad, right?&amp;quot;]]&lt;br /&gt;
The &#039;&#039;&#039;Power Macintosh 7100/66&#039;&#039;&#039; is one of the first PowerPC-based Macs. It also has a horrible internal design.&lt;br /&gt;
&lt;br /&gt;
== Specs ==&lt;br /&gt;
; Machine ID : 112&lt;br /&gt;
; CPU : PowerPC 601 @ 66 MHz&lt;br /&gt;
; L2 Cache : None&lt;br /&gt;
; RAM : 40 MiB (8 MiB soldered, 2x 16 MiB SIMMs)&lt;br /&gt;
; ROM Revision : $77D.20F2&lt;br /&gt;
; Floppy Disk Drive : 3.5 inch, 1.4 MB&lt;br /&gt;
; GPU : &amp;quot;Card ID 96&amp;quot;&lt;br /&gt;
; VRAM : 1 MiB&lt;br /&gt;
; Storage : 270.73 MB Quantum LPS270S (SCSI ID 0)&lt;br /&gt;
; Optical Drive : Matshita CD-ROM CD-8004&lt;br /&gt;
&lt;br /&gt;
== Quirks ==&lt;br /&gt;
* If you are trying to boot into [[Copland]], you can&#039;t start holding down the Caps Lock key too early or it won&#039;t be detected, and you can&#039;t start holding it down too late or you&#039;ll already be booting into System 7.5.&lt;br /&gt;
** The trick is to start pressing it immediately when you see the Happy Mac icon.&lt;br /&gt;
* If you set the DB-15 adapter to VGA mode, the video adapter flips a coin on reboot to see if the display is detected as 1024x768 @ 70 Hz, 640x480 @ 60 Hz, or as something that is definitely incompatible with [[Hitachi SuperScan 812|my monitor]].&lt;br /&gt;
* It doesn&#039;t like booting from certain Classic Mac OS CD-ROMs that should be bootable.&lt;br /&gt;
* Whether or not the speaker works is decided by a coin flip on each reboot.&lt;br /&gt;
&lt;br /&gt;
== History ==&lt;br /&gt;
* 2021-12-17: The computer arrives at my apartment from an eBay seller.&lt;br /&gt;
* 2021-12-21: {{Downgrade|The clock battery is removed.}}&lt;br /&gt;
* 2021-12-21: {{Damage|Three small pieces of plastic, which look like part of hooks, break off from the inside of the case.}} I am unable to determine where they broke off from, but the computer does not feel any more fragile after reassembling.&lt;br /&gt;
* 2023-07-26: The computer is temporarily transported back to my parents&#039; place.&lt;br /&gt;
* 2023-07-26: The decaying rubber feet are removed.&lt;br /&gt;
* 2023-08-06: {{Upgrade|The hard disk is replaced with a BlueSCSI v2.}}&lt;br /&gt;
* 2023-09-27: The computer is transported to the new home.&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
* [[Media:Apple_Service_Source_-_Power_Macintosh_7100_Series.pdf]] (good luck disassembling without this)&lt;br /&gt;
* [https://support.apple.com/kb/SP336?locale=en_US Power Macintosh 7100/66: Technical Specifications]&lt;br /&gt;
* [https://everymac.com/systems/apple/powermac/specs/powermac_7100_66.html Power Macintosh 7100/66 Specs: EveryMac.com]&lt;br /&gt;
&lt;br /&gt;
[[Category:Computers]]&lt;br /&gt;
[[Category:PowerPC Macs]]&lt;/div&gt;</summary>
		<author><name>Huntertur</name></author>
	</entry>
	<entry>
		<id>https://computers.huntertur.net/index.php?title=System_Error_Alert_Table&amp;diff=1093</id>
		<title>System Error Alert Table</title>
		<link rel="alternate" type="text/html" href="https://computers.huntertur.net/index.php?title=System_Error_Alert_Table&amp;diff=1093"/>
		<updated>2025-09-27T23:00:33Z</updated>

		<summary type="html">&lt;p&gt;Huntertur: /* Reading it */ s/it/this script/ for clarity&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &#039;&#039;&#039;System Error Alert Table&#039;&#039;&#039; (resource type &#039;&#039;&#039;&amp;lt;code&amp;gt;DSAT&amp;lt;/code&amp;gt;&#039;&#039;&#039;, allegedly short for &#039;&#039;&#039;Deep Shit Alert Table&#039;&#039;&#039;) describes startup text and fatal error dialogs for the classic Mac OS.&lt;br /&gt;
&lt;br /&gt;
== Specification ==&lt;br /&gt;
&lt;br /&gt;
See [https://preterhuman.net/macstuff/insidemac/OSUtilities/OSUtilities-36.html Inside Macintosh: Operating System Utilities, Chapter 2 - System Error Handler, The System Error Alert Table Resource].&lt;br /&gt;
&lt;br /&gt;
== Reading it ==&lt;br /&gt;
&lt;br /&gt;
ResEdit doesn&#039;t support &amp;lt;code&amp;gt;DSAT&amp;lt;/code&amp;gt; and only shows a hex editor despite having a custom icon for the resource type.&lt;br /&gt;
&lt;br /&gt;
Here is an extremely rough Python script for dumping the alerts, their IDs, and their error messages. Despite DSAT definitions being polymorphic, there is no type information, so this script determines what is an alert by process of elimination (correct size, text pointers are valid, pointed-to text is ASCII). Copy-paste the hex editor output from ResEdit into a text file, then pass its filename to this script:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;code&amp;gt;dsat.py&amp;lt;/code&amp;gt; contents&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
from argparse import ArgumentParser&lt;br /&gt;
from pathlib import Path&lt;br /&gt;
import struct&lt;br /&gt;
from typing import NamedTuple&lt;br /&gt;
&lt;br /&gt;
parser = ArgumentParser()&lt;br /&gt;
parser.add_argument(&#039;hexfilepath&#039;)&lt;br /&gt;
buffer = bytes.fromhex(Path(parser.parse_args().hexfilepath).read_text())&lt;br /&gt;
offset = 0&lt;br /&gt;
&lt;br /&gt;
def read_short():&lt;br /&gt;
    global offset&lt;br /&gt;
    number = int.from_bytes(buffer[offset:offset + 2])&lt;br /&gt;
    offset += 2&lt;br /&gt;
    return number&lt;br /&gt;
&lt;br /&gt;
definition_count = read_short()&lt;br /&gt;
definitions: dict[int, &#039;Definition&#039;]&lt;br /&gt;
&lt;br /&gt;
class Alert(NamedTuple):&lt;br /&gt;
    text1_id: int&lt;br /&gt;
    text2_id: int&lt;br /&gt;
    icon_id: int&lt;br /&gt;
    proc_id: int&lt;br /&gt;
    button_layout_id: int&lt;br /&gt;
&lt;br /&gt;
    @property&lt;br /&gt;
    def text1(self):&lt;br /&gt;
        return definitions[self.text1_id].as_text().replace(&#039;/&#039;, &#039;\n&#039;) if self.text1_id else None&lt;br /&gt;
&lt;br /&gt;
    @property&lt;br /&gt;
    def text2(self):&lt;br /&gt;
        return definitions[self.text2_id].as_text().replace(&#039;/&#039;, &#039;\n&#039;) if self.text2_id else None&lt;br /&gt;
&lt;br /&gt;
    @property&lt;br /&gt;
    def text(self):&lt;br /&gt;
        if not self.text1:&lt;br /&gt;
            return None&lt;br /&gt;
&lt;br /&gt;
        if self.text2:&lt;br /&gt;
            return self.text1 + &#039;\n&#039; + self.text2&lt;br /&gt;
&lt;br /&gt;
        return self.text1&lt;br /&gt;
&lt;br /&gt;
class Definition(NamedTuple):&lt;br /&gt;
    id: int&lt;br /&gt;
    data: bytes&lt;br /&gt;
&lt;br /&gt;
    def as_alert(self):&lt;br /&gt;
        return Alert(*struct.unpack(&#039;&amp;gt;HHHHH&#039;, self.data))&lt;br /&gt;
&lt;br /&gt;
    def as_text(self):&lt;br /&gt;
        return self.data[4:-1].decode(&#039;ascii&#039;)&lt;br /&gt;
&lt;br /&gt;
def read_definition():&lt;br /&gt;
    global offset&lt;br /&gt;
    id = read_short()&lt;br /&gt;
    length = read_short()&lt;br /&gt;
    data = buffer[offset:offset + length]&lt;br /&gt;
    offset += length&lt;br /&gt;
    return Definition(id, data)&lt;br /&gt;
&lt;br /&gt;
default_alert = read_definition().as_alert()&lt;br /&gt;
definitions = {(definition := read_definition()).id: definition&lt;br /&gt;
               for _ in range(definition_count)}&lt;br /&gt;
&lt;br /&gt;
for error_id, definition in definitions.items():&lt;br /&gt;
    if len(definition.data) == 10:&lt;br /&gt;
        alert = definition.as_alert()&lt;br /&gt;
        try:&lt;br /&gt;
            print(error_id, &#039;-&#039;, alert.text)&lt;br /&gt;
        except (KeyError, UnicodeDecodeError):&lt;br /&gt;
            pass&lt;br /&gt;
&lt;br /&gt;
print(&#039;Default - &#039;, default_alert.text)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
&lt;br /&gt;
* The System Error Alert Table isn&#039;t just for fatal errors! The text below shows that the Force Quit dialog, among other things, is implemented here.&lt;br /&gt;
* Sometimes, there is no error text, or the text is cut off; this is due to a custom procedure being used for that alert.&lt;br /&gt;
** Post-boot (when {{Resource|DSAT|2}} is loaded), &amp;quot;out of memory&amp;quot;, &amp;quot;unimplemented trap&amp;quot;, and friends are printed by a procedure.&lt;br /&gt;
* Entries in the table are not in order.&lt;br /&gt;
* The &amp;quot;Power PC&amp;quot; and &amp;quot;System&amp;quot; (instead of Mac OS for &amp;gt;= 7.6) typos are in the original text.&lt;br /&gt;
* The PC Card warning exists on the PowerBook version of Mac OS 8.6 but not the generic version of Mac OS 7.6.1 (on a PowerBook 5300c) or Mac OS 9.2.2 (on a Power Mac G4).&lt;br /&gt;
** Is this a one-off for this version, or does this table get dynamically generated at install time?&lt;br /&gt;
* Mac OS 7.6.1 has a beta message in {{Resource|DSAT|0}} despite being the production release.&lt;br /&gt;
&lt;br /&gt;
== Contents in different system versions ==&lt;br /&gt;
&lt;br /&gt;
=== System Software 6.0.8 ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+ {{Resource|DSAT|0}}&lt;br /&gt;
|-&lt;br /&gt;
! Error ID !! Text&lt;br /&gt;
|-&lt;br /&gt;
| 65526 || MacsBug installed.&lt;br /&gt;
|-&lt;br /&gt;
| 65525 ||&lt;br /&gt;
|-&lt;br /&gt;
| 102 || This startup disk will not work on this Macintosh model.  Use the latest Installer to update this disk for this model.  (System 6.0.8 does not work on this model; you need a newer version that does.)&lt;br /&gt;
|-&lt;br /&gt;
| 103 || This Macintosh is set for 32-bit addressing.  You may switch to 24-bit addressing and use this disk or restart and use a newer startup disk.  (System 6.0.8 does not work with 32-bit addressing.)&lt;br /&gt;
|-&lt;br /&gt;
| 101 || Sorry, a system error occurred.&lt;br /&gt;
&lt;br /&gt;
RAM parity&lt;br /&gt;
|-&lt;br /&gt;
| Default || Welcome to Macintosh.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+ {{Resource|DSAT|2}}&lt;br /&gt;
|-&lt;br /&gt;
! Error ID !! Text&lt;br /&gt;
|-&lt;br /&gt;
| 30 || Please insert the disk:&lt;br /&gt;
|-&lt;br /&gt;
| 28 || Sorry, a system error occurred.&lt;br /&gt;
|-&lt;br /&gt;
| 26 || The following application is busy or damaged:&lt;br /&gt;
|-&lt;br /&gt;
| 42 || You may now switch off your Macintosh safely.&lt;br /&gt;
|-&lt;br /&gt;
| 20000 || If you wish to continue using your Macintosh, press Restart.  If not, press Shut Down.&lt;br /&gt;
|-&lt;br /&gt;
| 20001 || You may now switch off your Macintosh safely. If you wish to continue using your Macintosh, press Restart.&lt;br /&gt;
|-&lt;br /&gt;
| 20002 || Unsaved changes will be lost.&lt;br /&gt;
|-&lt;br /&gt;
| 101 || Sorry, a system error occurred.&lt;br /&gt;
&lt;br /&gt;
RAM parity&lt;br /&gt;
|-&lt;br /&gt;
| Default || Sorry, a system error occurred.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Mac OS 7.6.1 ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+ {{Resource|DSAT|0}}&lt;br /&gt;
|-&lt;br /&gt;
! Error ID !! Text&lt;br /&gt;
|-&lt;br /&gt;
| 40 || Just figured out what BETA stands for.&lt;br /&gt;
|-&lt;br /&gt;
| 65526 ||&lt;br /&gt;
|-&lt;br /&gt;
| 65525 ||&lt;br /&gt;
|-&lt;br /&gt;
| 65523 ||&lt;br /&gt;
|-&lt;br /&gt;
| 102 || This startup disk will not work on this Macintosh model.  Use the latest Installer to update this disk for this model.&lt;br /&gt;
|-&lt;br /&gt;
| 104 || This disk must be unlocked in order to perform one-time housekeeping.  If you wish to use this disk to start your Macintosh, unlock it.&lt;br /&gt;
|-&lt;br /&gt;
| 105 || System 7.6.1 needs more memory to start up.&lt;br /&gt;
|-&lt;br /&gt;
| Default || Sorry, a system error occurred.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+ {{Resource|DSAT|2}}&lt;br /&gt;
|-&lt;br /&gt;
! Error ID !! Text&lt;br /&gt;
|-&lt;br /&gt;
| 28 || Sorry, a system error occurred.&lt;br /&gt;
|-&lt;br /&gt;
| 25 || Not enough memory is available while using&lt;br /&gt;
|-&lt;br /&gt;
| 42 || It is now safe to switch off your Macintosh.&lt;br /&gt;
|-&lt;br /&gt;
| 20000 || If you wish to continue using your Macintosh, press Restart.  If not, press Shut Down.&lt;br /&gt;
|-&lt;br /&gt;
| 20001 || It is now safe to switch off your Macintosh. If you wish to continue using your Macintosh, press Restart.&lt;br /&gt;
|-&lt;br /&gt;
| 20002 || Unsaved changes will be lost.&lt;br /&gt;
|-&lt;br /&gt;
| 99 || The System file on this startup disk may be damaged.  The Installer can be used to repair this disk.&lt;br /&gt;
|-&lt;br /&gt;
| 98 || The System file on this startup device does not contain the resources necessary to boot this Macintosh.  Please use the Installer to update the System file.&lt;br /&gt;
|-&lt;br /&gt;
| 101 || Sorry, a system error occurred.&lt;br /&gt;
&lt;br /&gt;
RAM parity&lt;br /&gt;
|-&lt;br /&gt;
| 20010 || Hard Disk Cable Warning&lt;br /&gt;
&lt;br /&gt;
You must first shutdown the Macintosh before attaching any SCSI hard disk cables.  Disconnect the cable from the back of the machine right now.&lt;br /&gt;
|-&lt;br /&gt;
| 1010 || Code Fragment could not be prepared.&lt;br /&gt;
|-&lt;br /&gt;
| 1011 || Internal Mixed Mode failure.&lt;br /&gt;
|-&lt;br /&gt;
| Default || Sorry, a system error occurred.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Mac OS 8.6 (PowerBook G3) ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+ {{Resource|DSAT|0}}&lt;br /&gt;
|-&lt;br /&gt;
! Error ID !! Text&lt;br /&gt;
|-&lt;br /&gt;
| 102 || This startup disk will not work on this Macintosh model.  Use the latest Installer to update this disk for this model.&lt;br /&gt;
|-&lt;br /&gt;
| 104 || This disk must be unlocked in order to perform one-time housekeeping.  If you wish to use this disk to start your Macintosh, unlock it.&lt;br /&gt;
|-&lt;br /&gt;
| 116 || This startup disk will not work on this computer. A Power PC based computer is required to startup from this disk.&lt;br /&gt;
|-&lt;br /&gt;
| 118 || The system software on the startup disk only functions on the original media, not if copied to another drive.&lt;br /&gt;
|-&lt;br /&gt;
| 105 || System 8.6 needs more memory to start up.&lt;br /&gt;
|-&lt;br /&gt;
| Default || Sorry, a system error occurred.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+ {{Resource|DSAT|2}}&lt;br /&gt;
|-&lt;br /&gt;
! Error ID !! Text&lt;br /&gt;
|-&lt;br /&gt;
| 28 || Sorry, a system error occurred.&lt;br /&gt;
|-&lt;br /&gt;
| 25 || Not enough memory is available while using&lt;br /&gt;
|-&lt;br /&gt;
| 42 ||&lt;br /&gt;
|-&lt;br /&gt;
| 20000 || If you wish to continue using your Macintosh, press Restart.  If not, press Shut Down.&lt;br /&gt;
|-&lt;br /&gt;
| 20001 || It is now safe to switch off your Macintosh. If you wish to continue using your Macintosh, press Restart.&lt;br /&gt;
|-&lt;br /&gt;
| 20002 || Clicking Force Quit causes you to lose any unsaved changes. To avoid further problems, restart your computer after you click Force Quit.&lt;br /&gt;
|-&lt;br /&gt;
| 99 || The System file on this startup disk may be damaged.  The Installer can be used to repair this disk.&lt;br /&gt;
|-&lt;br /&gt;
| 98 || The System file on this startup device does not contain the resources necessary to boot this Macintosh.  Please use the Installer to update the System file.&lt;br /&gt;
|-&lt;br /&gt;
| 101 || Sorry, a system error occurred.&lt;br /&gt;
&lt;br /&gt;
RAM parity&lt;br /&gt;
|-&lt;br /&gt;
| 20010 || Hard Disk Cable Warning&lt;br /&gt;
&lt;br /&gt;
You must first shutdown the Macintosh before attaching any SCSI hard disk cables.  Disconnect the cable from the back of the machine right now.&lt;br /&gt;
|-&lt;br /&gt;
| 29205 || Please reinsert the PC Card&lt;br /&gt;
&lt;br /&gt;
It is currently in use and must be reinserted immediately to prevent damaging a document, file or the card.&lt;br /&gt;
&lt;br /&gt;
Before ejecting a PC Card, you must close all documents and applications using the PC Card.&lt;br /&gt;
|-&lt;br /&gt;
| 1010 || Code Fragment could not be prepared.&lt;br /&gt;
|-&lt;br /&gt;
| 1011 || Internal Mixed Mode failure.&lt;br /&gt;
|-&lt;br /&gt;
| Default || Sorry, a system error occurred.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Mac OS 9.2.2 ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+ {{Resource|DSAT|0}}&lt;br /&gt;
|-&lt;br /&gt;
! Error ID !! Text&lt;br /&gt;
|-&lt;br /&gt;
| 102 || This startup disk will not work on this Macintosh model.  Use the latest Installer to update this disk for this model.&lt;br /&gt;
|-&lt;br /&gt;
| 104 || This disk must be unlocked in order to perform one-time housekeeping.  If you wish to use this disk to start your Macintosh, unlock it.&lt;br /&gt;
|-&lt;br /&gt;
| 116 || This startup disk will not work on this computer. A Power PC based computer is required to startup from this disk.&lt;br /&gt;
|-&lt;br /&gt;
| 118 || The system software on the startup disk only functions on the original media, not if copied to another drive.&lt;br /&gt;
|-&lt;br /&gt;
| 105 || System 9.2.2 needs more memory to start up.&lt;br /&gt;
|-&lt;br /&gt;
| Default || Sorry, a system error occurred.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+ {{Resource|DSAT|2}}&lt;br /&gt;
|-&lt;br /&gt;
! Error ID !! Text&lt;br /&gt;
|-&lt;br /&gt;
| 28 || Sorry, a system error occurred.&lt;br /&gt;
|-&lt;br /&gt;
| 25 || Not enough memory is available while using&lt;br /&gt;
|-&lt;br /&gt;
| 42 ||&lt;br /&gt;
|-&lt;br /&gt;
| 20000 || If you wish to continue using your Macintosh, press Restart.  If not, press Shut Down.&lt;br /&gt;
|-&lt;br /&gt;
| 20001 || It is now safe to switch off your Macintosh. If you wish to continue using your Macintosh, press Restart.&lt;br /&gt;
|-&lt;br /&gt;
| 20002 || Clicking Force Quit causes you to lose any unsaved changes. To avoid further problems, restart your computer after you click Force Quit.&lt;br /&gt;
|-&lt;br /&gt;
| 99 || The System file on this startup disk may be damaged.  The Installer can be used to repair this disk.&lt;br /&gt;
|-&lt;br /&gt;
| 98 || The System file on this startup device does not contain the resources necessary to boot this Macintosh.  Please use the Installer to update the System file.&lt;br /&gt;
|-&lt;br /&gt;
| 101 || Sorry, a system error occurred.&lt;br /&gt;
&lt;br /&gt;
RAM parity&lt;br /&gt;
|-&lt;br /&gt;
| 20010 || Hard Disk Cable Warning&lt;br /&gt;
&lt;br /&gt;
You must first shutdown the Macintosh before attaching any SCSI hard disk cables.  Disconnect the cable from the back of the machine right now.&lt;br /&gt;
|-&lt;br /&gt;
| 1010 || Code Fragment could not be prepared.&lt;br /&gt;
|-&lt;br /&gt;
| 1011 || Internal Mixed Mode failure.&lt;br /&gt;
|-&lt;br /&gt;
| Default || Sorry, a system error occurred.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:Classic Mac OS]]&lt;/div&gt;</summary>
		<author><name>Huntertur</name></author>
	</entry>
	<entry>
		<id>https://computers.huntertur.net/index.php?title=System_Error_Alert_Table&amp;diff=1092</id>
		<title>System Error Alert Table</title>
		<link rel="alternate" type="text/html" href="https://computers.huntertur.net/index.php?title=System_Error_Alert_Table&amp;diff=1092"/>
		<updated>2025-09-27T22:00:13Z</updated>

		<summary type="html">&lt;p&gt;Huntertur: /* Notes */ Add notes from 7.6.1&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &#039;&#039;&#039;System Error Alert Table&#039;&#039;&#039; (resource type &#039;&#039;&#039;&amp;lt;code&amp;gt;DSAT&amp;lt;/code&amp;gt;&#039;&#039;&#039;, allegedly short for &#039;&#039;&#039;Deep Shit Alert Table&#039;&#039;&#039;) describes startup text and fatal error dialogs for the classic Mac OS.&lt;br /&gt;
&lt;br /&gt;
== Specification ==&lt;br /&gt;
&lt;br /&gt;
See [https://preterhuman.net/macstuff/insidemac/OSUtilities/OSUtilities-36.html Inside Macintosh: Operating System Utilities, Chapter 2 - System Error Handler, The System Error Alert Table Resource].&lt;br /&gt;
&lt;br /&gt;
== Reading it ==&lt;br /&gt;
&lt;br /&gt;
ResEdit doesn&#039;t support &amp;lt;code&amp;gt;DSAT&amp;lt;/code&amp;gt; and only shows a hex editor despite having a custom icon for the resource type.&lt;br /&gt;
&lt;br /&gt;
Here is an extremely rough Python script for dumping the alerts, their IDs, and their error messages. Despite DSAT definitions being polymorphic, there is no type information, so it determines what is an alert by process of elimination (correct size, text pointers are valid, pointed-to text is ASCII). Copy-paste the hex editor output from ResEdit into a text file, then pass its filename to this script:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;code&amp;gt;dsat.py&amp;lt;/code&amp;gt; contents&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
from argparse import ArgumentParser&lt;br /&gt;
from pathlib import Path&lt;br /&gt;
import struct&lt;br /&gt;
from typing import NamedTuple&lt;br /&gt;
&lt;br /&gt;
parser = ArgumentParser()&lt;br /&gt;
parser.add_argument(&#039;hexfilepath&#039;)&lt;br /&gt;
buffer = bytes.fromhex(Path(parser.parse_args().hexfilepath).read_text())&lt;br /&gt;
offset = 0&lt;br /&gt;
&lt;br /&gt;
def read_short():&lt;br /&gt;
    global offset&lt;br /&gt;
    number = int.from_bytes(buffer[offset:offset + 2])&lt;br /&gt;
    offset += 2&lt;br /&gt;
    return number&lt;br /&gt;
&lt;br /&gt;
definition_count = read_short()&lt;br /&gt;
definitions: dict[int, &#039;Definition&#039;]&lt;br /&gt;
&lt;br /&gt;
class Alert(NamedTuple):&lt;br /&gt;
    text1_id: int&lt;br /&gt;
    text2_id: int&lt;br /&gt;
    icon_id: int&lt;br /&gt;
    proc_id: int&lt;br /&gt;
    button_layout_id: int&lt;br /&gt;
&lt;br /&gt;
    @property&lt;br /&gt;
    def text1(self):&lt;br /&gt;
        return definitions[self.text1_id].as_text().replace(&#039;/&#039;, &#039;\n&#039;) if self.text1_id else None&lt;br /&gt;
&lt;br /&gt;
    @property&lt;br /&gt;
    def text2(self):&lt;br /&gt;
        return definitions[self.text2_id].as_text().replace(&#039;/&#039;, &#039;\n&#039;) if self.text2_id else None&lt;br /&gt;
&lt;br /&gt;
    @property&lt;br /&gt;
    def text(self):&lt;br /&gt;
        if not self.text1:&lt;br /&gt;
            return None&lt;br /&gt;
&lt;br /&gt;
        if self.text2:&lt;br /&gt;
            return self.text1 + &#039;\n&#039; + self.text2&lt;br /&gt;
&lt;br /&gt;
        return self.text1&lt;br /&gt;
&lt;br /&gt;
class Definition(NamedTuple):&lt;br /&gt;
    id: int&lt;br /&gt;
    data: bytes&lt;br /&gt;
&lt;br /&gt;
    def as_alert(self):&lt;br /&gt;
        return Alert(*struct.unpack(&#039;&amp;gt;HHHHH&#039;, self.data))&lt;br /&gt;
&lt;br /&gt;
    def as_text(self):&lt;br /&gt;
        return self.data[4:-1].decode(&#039;ascii&#039;)&lt;br /&gt;
&lt;br /&gt;
def read_definition():&lt;br /&gt;
    global offset&lt;br /&gt;
    id = read_short()&lt;br /&gt;
    length = read_short()&lt;br /&gt;
    data = buffer[offset:offset + length]&lt;br /&gt;
    offset += length&lt;br /&gt;
    return Definition(id, data)&lt;br /&gt;
&lt;br /&gt;
default_alert = read_definition().as_alert()&lt;br /&gt;
definitions = {(definition := read_definition()).id: definition&lt;br /&gt;
               for _ in range(definition_count)}&lt;br /&gt;
&lt;br /&gt;
for error_id, definition in definitions.items():&lt;br /&gt;
    if len(definition.data) == 10:&lt;br /&gt;
        alert = definition.as_alert()&lt;br /&gt;
        try:&lt;br /&gt;
            print(error_id, &#039;-&#039;, alert.text)&lt;br /&gt;
        except (KeyError, UnicodeDecodeError):&lt;br /&gt;
            pass&lt;br /&gt;
&lt;br /&gt;
print(&#039;Default - &#039;, default_alert.text)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
&lt;br /&gt;
* The System Error Alert Table isn&#039;t just for fatal errors! The text below shows that the Force Quit dialog, among other things, is implemented here.&lt;br /&gt;
* Sometimes, there is no error text, or the text is cut off; this is due to a custom procedure being used for that alert.&lt;br /&gt;
** Post-boot (when {{Resource|DSAT|2}} is loaded), &amp;quot;out of memory&amp;quot;, &amp;quot;unimplemented trap&amp;quot;, and friends are printed by a procedure.&lt;br /&gt;
* Entries in the table are not in order.&lt;br /&gt;
* The &amp;quot;Power PC&amp;quot; and &amp;quot;System&amp;quot; (instead of Mac OS for &amp;gt;= 7.6) typos are in the original text.&lt;br /&gt;
* The PC Card warning exists on the PowerBook version of Mac OS 8.6 but not the generic version of Mac OS 7.6.1 (on a PowerBook 5300c) or Mac OS 9.2.2 (on a Power Mac G4).&lt;br /&gt;
** Is this a one-off for this version, or does this table get dynamically generated at install time?&lt;br /&gt;
* Mac OS 7.6.1 has a beta message in {{Resource|DSAT|0}} despite being the production release.&lt;br /&gt;
&lt;br /&gt;
== Contents in different system versions ==&lt;br /&gt;
&lt;br /&gt;
=== System Software 6.0.8 ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+ {{Resource|DSAT|0}}&lt;br /&gt;
|-&lt;br /&gt;
! Error ID !! Text&lt;br /&gt;
|-&lt;br /&gt;
| 65526 || MacsBug installed.&lt;br /&gt;
|-&lt;br /&gt;
| 65525 ||&lt;br /&gt;
|-&lt;br /&gt;
| 102 || This startup disk will not work on this Macintosh model.  Use the latest Installer to update this disk for this model.  (System 6.0.8 does not work on this model; you need a newer version that does.)&lt;br /&gt;
|-&lt;br /&gt;
| 103 || This Macintosh is set for 32-bit addressing.  You may switch to 24-bit addressing and use this disk or restart and use a newer startup disk.  (System 6.0.8 does not work with 32-bit addressing.)&lt;br /&gt;
|-&lt;br /&gt;
| 101 || Sorry, a system error occurred.&lt;br /&gt;
&lt;br /&gt;
RAM parity&lt;br /&gt;
|-&lt;br /&gt;
| Default || Welcome to Macintosh.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+ {{Resource|DSAT|2}}&lt;br /&gt;
|-&lt;br /&gt;
! Error ID !! Text&lt;br /&gt;
|-&lt;br /&gt;
| 30 || Please insert the disk:&lt;br /&gt;
|-&lt;br /&gt;
| 28 || Sorry, a system error occurred.&lt;br /&gt;
|-&lt;br /&gt;
| 26 || The following application is busy or damaged:&lt;br /&gt;
|-&lt;br /&gt;
| 42 || You may now switch off your Macintosh safely.&lt;br /&gt;
|-&lt;br /&gt;
| 20000 || If you wish to continue using your Macintosh, press Restart.  If not, press Shut Down.&lt;br /&gt;
|-&lt;br /&gt;
| 20001 || You may now switch off your Macintosh safely. If you wish to continue using your Macintosh, press Restart.&lt;br /&gt;
|-&lt;br /&gt;
| 20002 || Unsaved changes will be lost.&lt;br /&gt;
|-&lt;br /&gt;
| 101 || Sorry, a system error occurred.&lt;br /&gt;
&lt;br /&gt;
RAM parity&lt;br /&gt;
|-&lt;br /&gt;
| Default || Sorry, a system error occurred.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Mac OS 7.6.1 ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+ {{Resource|DSAT|0}}&lt;br /&gt;
|-&lt;br /&gt;
! Error ID !! Text&lt;br /&gt;
|-&lt;br /&gt;
| 40 || Just figured out what BETA stands for.&lt;br /&gt;
|-&lt;br /&gt;
| 65526 ||&lt;br /&gt;
|-&lt;br /&gt;
| 65525 ||&lt;br /&gt;
|-&lt;br /&gt;
| 65523 ||&lt;br /&gt;
|-&lt;br /&gt;
| 102 || This startup disk will not work on this Macintosh model.  Use the latest Installer to update this disk for this model.&lt;br /&gt;
|-&lt;br /&gt;
| 104 || This disk must be unlocked in order to perform one-time housekeeping.  If you wish to use this disk to start your Macintosh, unlock it.&lt;br /&gt;
|-&lt;br /&gt;
| 105 || System 7.6.1 needs more memory to start up.&lt;br /&gt;
|-&lt;br /&gt;
| Default || Sorry, a system error occurred.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+ {{Resource|DSAT|2}}&lt;br /&gt;
|-&lt;br /&gt;
! Error ID !! Text&lt;br /&gt;
|-&lt;br /&gt;
| 28 || Sorry, a system error occurred.&lt;br /&gt;
|-&lt;br /&gt;
| 25 || Not enough memory is available while using&lt;br /&gt;
|-&lt;br /&gt;
| 42 || It is now safe to switch off your Macintosh.&lt;br /&gt;
|-&lt;br /&gt;
| 20000 || If you wish to continue using your Macintosh, press Restart.  If not, press Shut Down.&lt;br /&gt;
|-&lt;br /&gt;
| 20001 || It is now safe to switch off your Macintosh. If you wish to continue using your Macintosh, press Restart.&lt;br /&gt;
|-&lt;br /&gt;
| 20002 || Unsaved changes will be lost.&lt;br /&gt;
|-&lt;br /&gt;
| 99 || The System file on this startup disk may be damaged.  The Installer can be used to repair this disk.&lt;br /&gt;
|-&lt;br /&gt;
| 98 || The System file on this startup device does not contain the resources necessary to boot this Macintosh.  Please use the Installer to update the System file.&lt;br /&gt;
|-&lt;br /&gt;
| 101 || Sorry, a system error occurred.&lt;br /&gt;
&lt;br /&gt;
RAM parity&lt;br /&gt;
|-&lt;br /&gt;
| 20010 || Hard Disk Cable Warning&lt;br /&gt;
&lt;br /&gt;
You must first shutdown the Macintosh before attaching any SCSI hard disk cables.  Disconnect the cable from the back of the machine right now.&lt;br /&gt;
|-&lt;br /&gt;
| 1010 || Code Fragment could not be prepared.&lt;br /&gt;
|-&lt;br /&gt;
| 1011 || Internal Mixed Mode failure.&lt;br /&gt;
|-&lt;br /&gt;
| Default || Sorry, a system error occurred.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Mac OS 8.6 (PowerBook G3) ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+ {{Resource|DSAT|0}}&lt;br /&gt;
|-&lt;br /&gt;
! Error ID !! Text&lt;br /&gt;
|-&lt;br /&gt;
| 102 || This startup disk will not work on this Macintosh model.  Use the latest Installer to update this disk for this model.&lt;br /&gt;
|-&lt;br /&gt;
| 104 || This disk must be unlocked in order to perform one-time housekeeping.  If you wish to use this disk to start your Macintosh, unlock it.&lt;br /&gt;
|-&lt;br /&gt;
| 116 || This startup disk will not work on this computer. A Power PC based computer is required to startup from this disk.&lt;br /&gt;
|-&lt;br /&gt;
| 118 || The system software on the startup disk only functions on the original media, not if copied to another drive.&lt;br /&gt;
|-&lt;br /&gt;
| 105 || System 8.6 needs more memory to start up.&lt;br /&gt;
|-&lt;br /&gt;
| Default || Sorry, a system error occurred.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+ {{Resource|DSAT|2}}&lt;br /&gt;
|-&lt;br /&gt;
! Error ID !! Text&lt;br /&gt;
|-&lt;br /&gt;
| 28 || Sorry, a system error occurred.&lt;br /&gt;
|-&lt;br /&gt;
| 25 || Not enough memory is available while using&lt;br /&gt;
|-&lt;br /&gt;
| 42 ||&lt;br /&gt;
|-&lt;br /&gt;
| 20000 || If you wish to continue using your Macintosh, press Restart.  If not, press Shut Down.&lt;br /&gt;
|-&lt;br /&gt;
| 20001 || It is now safe to switch off your Macintosh. If you wish to continue using your Macintosh, press Restart.&lt;br /&gt;
|-&lt;br /&gt;
| 20002 || Clicking Force Quit causes you to lose any unsaved changes. To avoid further problems, restart your computer after you click Force Quit.&lt;br /&gt;
|-&lt;br /&gt;
| 99 || The System file on this startup disk may be damaged.  The Installer can be used to repair this disk.&lt;br /&gt;
|-&lt;br /&gt;
| 98 || The System file on this startup device does not contain the resources necessary to boot this Macintosh.  Please use the Installer to update the System file.&lt;br /&gt;
|-&lt;br /&gt;
| 101 || Sorry, a system error occurred.&lt;br /&gt;
&lt;br /&gt;
RAM parity&lt;br /&gt;
|-&lt;br /&gt;
| 20010 || Hard Disk Cable Warning&lt;br /&gt;
&lt;br /&gt;
You must first shutdown the Macintosh before attaching any SCSI hard disk cables.  Disconnect the cable from the back of the machine right now.&lt;br /&gt;
|-&lt;br /&gt;
| 29205 || Please reinsert the PC Card&lt;br /&gt;
&lt;br /&gt;
It is currently in use and must be reinserted immediately to prevent damaging a document, file or the card.&lt;br /&gt;
&lt;br /&gt;
Before ejecting a PC Card, you must close all documents and applications using the PC Card.&lt;br /&gt;
|-&lt;br /&gt;
| 1010 || Code Fragment could not be prepared.&lt;br /&gt;
|-&lt;br /&gt;
| 1011 || Internal Mixed Mode failure.&lt;br /&gt;
|-&lt;br /&gt;
| Default || Sorry, a system error occurred.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Mac OS 9.2.2 ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+ {{Resource|DSAT|0}}&lt;br /&gt;
|-&lt;br /&gt;
! Error ID !! Text&lt;br /&gt;
|-&lt;br /&gt;
| 102 || This startup disk will not work on this Macintosh model.  Use the latest Installer to update this disk for this model.&lt;br /&gt;
|-&lt;br /&gt;
| 104 || This disk must be unlocked in order to perform one-time housekeeping.  If you wish to use this disk to start your Macintosh, unlock it.&lt;br /&gt;
|-&lt;br /&gt;
| 116 || This startup disk will not work on this computer. A Power PC based computer is required to startup from this disk.&lt;br /&gt;
|-&lt;br /&gt;
| 118 || The system software on the startup disk only functions on the original media, not if copied to another drive.&lt;br /&gt;
|-&lt;br /&gt;
| 105 || System 9.2.2 needs more memory to start up.&lt;br /&gt;
|-&lt;br /&gt;
| Default || Sorry, a system error occurred.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+ {{Resource|DSAT|2}}&lt;br /&gt;
|-&lt;br /&gt;
! Error ID !! Text&lt;br /&gt;
|-&lt;br /&gt;
| 28 || Sorry, a system error occurred.&lt;br /&gt;
|-&lt;br /&gt;
| 25 || Not enough memory is available while using&lt;br /&gt;
|-&lt;br /&gt;
| 42 ||&lt;br /&gt;
|-&lt;br /&gt;
| 20000 || If you wish to continue using your Macintosh, press Restart.  If not, press Shut Down.&lt;br /&gt;
|-&lt;br /&gt;
| 20001 || It is now safe to switch off your Macintosh. If you wish to continue using your Macintosh, press Restart.&lt;br /&gt;
|-&lt;br /&gt;
| 20002 || Clicking Force Quit causes you to lose any unsaved changes. To avoid further problems, restart your computer after you click Force Quit.&lt;br /&gt;
|-&lt;br /&gt;
| 99 || The System file on this startup disk may be damaged.  The Installer can be used to repair this disk.&lt;br /&gt;
|-&lt;br /&gt;
| 98 || The System file on this startup device does not contain the resources necessary to boot this Macintosh.  Please use the Installer to update the System file.&lt;br /&gt;
|-&lt;br /&gt;
| 101 || Sorry, a system error occurred.&lt;br /&gt;
&lt;br /&gt;
RAM parity&lt;br /&gt;
|-&lt;br /&gt;
| 20010 || Hard Disk Cable Warning&lt;br /&gt;
&lt;br /&gt;
You must first shutdown the Macintosh before attaching any SCSI hard disk cables.  Disconnect the cable from the back of the machine right now.&lt;br /&gt;
|-&lt;br /&gt;
| 1010 || Code Fragment could not be prepared.&lt;br /&gt;
|-&lt;br /&gt;
| 1011 || Internal Mixed Mode failure.&lt;br /&gt;
|-&lt;br /&gt;
| Default || Sorry, a system error occurred.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:Classic Mac OS]]&lt;/div&gt;</summary>
		<author><name>Huntertur</name></author>
	</entry>
	<entry>
		<id>https://computers.huntertur.net/index.php?title=System_Error_Alert_Table&amp;diff=1091</id>
		<title>System Error Alert Table</title>
		<link rel="alternate" type="text/html" href="https://computers.huntertur.net/index.php?title=System_Error_Alert_Table&amp;diff=1091"/>
		<updated>2025-09-27T21:58:26Z</updated>

		<summary type="html">&lt;p&gt;Huntertur: /* Contents in different system versions */ Add Mac OS 7.6.1&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &#039;&#039;&#039;System Error Alert Table&#039;&#039;&#039; (resource type &#039;&#039;&#039;&amp;lt;code&amp;gt;DSAT&amp;lt;/code&amp;gt;&#039;&#039;&#039;, allegedly short for &#039;&#039;&#039;Deep Shit Alert Table&#039;&#039;&#039;) describes startup text and fatal error dialogs for the classic Mac OS.&lt;br /&gt;
&lt;br /&gt;
== Specification ==&lt;br /&gt;
&lt;br /&gt;
See [https://preterhuman.net/macstuff/insidemac/OSUtilities/OSUtilities-36.html Inside Macintosh: Operating System Utilities, Chapter 2 - System Error Handler, The System Error Alert Table Resource].&lt;br /&gt;
&lt;br /&gt;
== Reading it ==&lt;br /&gt;
&lt;br /&gt;
ResEdit doesn&#039;t support &amp;lt;code&amp;gt;DSAT&amp;lt;/code&amp;gt; and only shows a hex editor despite having a custom icon for the resource type.&lt;br /&gt;
&lt;br /&gt;
Here is an extremely rough Python script for dumping the alerts, their IDs, and their error messages. Despite DSAT definitions being polymorphic, there is no type information, so it determines what is an alert by process of elimination (correct size, text pointers are valid, pointed-to text is ASCII). Copy-paste the hex editor output from ResEdit into a text file, then pass its filename to this script:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;code&amp;gt;dsat.py&amp;lt;/code&amp;gt; contents&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
from argparse import ArgumentParser&lt;br /&gt;
from pathlib import Path&lt;br /&gt;
import struct&lt;br /&gt;
from typing import NamedTuple&lt;br /&gt;
&lt;br /&gt;
parser = ArgumentParser()&lt;br /&gt;
parser.add_argument(&#039;hexfilepath&#039;)&lt;br /&gt;
buffer = bytes.fromhex(Path(parser.parse_args().hexfilepath).read_text())&lt;br /&gt;
offset = 0&lt;br /&gt;
&lt;br /&gt;
def read_short():&lt;br /&gt;
    global offset&lt;br /&gt;
    number = int.from_bytes(buffer[offset:offset + 2])&lt;br /&gt;
    offset += 2&lt;br /&gt;
    return number&lt;br /&gt;
&lt;br /&gt;
definition_count = read_short()&lt;br /&gt;
definitions: dict[int, &#039;Definition&#039;]&lt;br /&gt;
&lt;br /&gt;
class Alert(NamedTuple):&lt;br /&gt;
    text1_id: int&lt;br /&gt;
    text2_id: int&lt;br /&gt;
    icon_id: int&lt;br /&gt;
    proc_id: int&lt;br /&gt;
    button_layout_id: int&lt;br /&gt;
&lt;br /&gt;
    @property&lt;br /&gt;
    def text1(self):&lt;br /&gt;
        return definitions[self.text1_id].as_text().replace(&#039;/&#039;, &#039;\n&#039;) if self.text1_id else None&lt;br /&gt;
&lt;br /&gt;
    @property&lt;br /&gt;
    def text2(self):&lt;br /&gt;
        return definitions[self.text2_id].as_text().replace(&#039;/&#039;, &#039;\n&#039;) if self.text2_id else None&lt;br /&gt;
&lt;br /&gt;
    @property&lt;br /&gt;
    def text(self):&lt;br /&gt;
        if not self.text1:&lt;br /&gt;
            return None&lt;br /&gt;
&lt;br /&gt;
        if self.text2:&lt;br /&gt;
            return self.text1 + &#039;\n&#039; + self.text2&lt;br /&gt;
&lt;br /&gt;
        return self.text1&lt;br /&gt;
&lt;br /&gt;
class Definition(NamedTuple):&lt;br /&gt;
    id: int&lt;br /&gt;
    data: bytes&lt;br /&gt;
&lt;br /&gt;
    def as_alert(self):&lt;br /&gt;
        return Alert(*struct.unpack(&#039;&amp;gt;HHHHH&#039;, self.data))&lt;br /&gt;
&lt;br /&gt;
    def as_text(self):&lt;br /&gt;
        return self.data[4:-1].decode(&#039;ascii&#039;)&lt;br /&gt;
&lt;br /&gt;
def read_definition():&lt;br /&gt;
    global offset&lt;br /&gt;
    id = read_short()&lt;br /&gt;
    length = read_short()&lt;br /&gt;
    data = buffer[offset:offset + length]&lt;br /&gt;
    offset += length&lt;br /&gt;
    return Definition(id, data)&lt;br /&gt;
&lt;br /&gt;
default_alert = read_definition().as_alert()&lt;br /&gt;
definitions = {(definition := read_definition()).id: definition&lt;br /&gt;
               for _ in range(definition_count)}&lt;br /&gt;
&lt;br /&gt;
for error_id, definition in definitions.items():&lt;br /&gt;
    if len(definition.data) == 10:&lt;br /&gt;
        alert = definition.as_alert()&lt;br /&gt;
        try:&lt;br /&gt;
            print(error_id, &#039;-&#039;, alert.text)&lt;br /&gt;
        except (KeyError, UnicodeDecodeError):&lt;br /&gt;
            pass&lt;br /&gt;
&lt;br /&gt;
print(&#039;Default - &#039;, default_alert.text)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
&lt;br /&gt;
* The System Error Alert Table isn&#039;t just for fatal errors! The text below shows that the Force Quit dialog, among other things, is implemented here.&lt;br /&gt;
* Sometimes, there is no error text, or the text is cut off; this is due to a custom procedure being used for that alert.&lt;br /&gt;
** Post-boot (when &amp;lt;code&amp;gt;DSAT&amp;lt;/code&amp;gt; ID = 2 is loaded), &amp;quot;out of memory&amp;quot;, &amp;quot;unimplemented trap&amp;quot;, and friends are printed by a procedure.&lt;br /&gt;
* Entries in the table are not in order.&lt;br /&gt;
* The &amp;quot;Power PC&amp;quot; and &amp;quot;System&amp;quot; (instead of Mac OS for &amp;gt;= 7.6) typos are in the original text.&lt;br /&gt;
* The PC Card warning exists on the PowerBook version of Mac OS 8.6 but not the generic version of Mac OS 9.2.2 (on a Power Mac G4). Is this a one-off for this version, or does this table get dynamically generated at install time?&lt;br /&gt;
&lt;br /&gt;
== Contents in different system versions ==&lt;br /&gt;
&lt;br /&gt;
=== System Software 6.0.8 ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+ {{Resource|DSAT|0}}&lt;br /&gt;
|-&lt;br /&gt;
! Error ID !! Text&lt;br /&gt;
|-&lt;br /&gt;
| 65526 || MacsBug installed.&lt;br /&gt;
|-&lt;br /&gt;
| 65525 ||&lt;br /&gt;
|-&lt;br /&gt;
| 102 || This startup disk will not work on this Macintosh model.  Use the latest Installer to update this disk for this model.  (System 6.0.8 does not work on this model; you need a newer version that does.)&lt;br /&gt;
|-&lt;br /&gt;
| 103 || This Macintosh is set for 32-bit addressing.  You may switch to 24-bit addressing and use this disk or restart and use a newer startup disk.  (System 6.0.8 does not work with 32-bit addressing.)&lt;br /&gt;
|-&lt;br /&gt;
| 101 || Sorry, a system error occurred.&lt;br /&gt;
&lt;br /&gt;
RAM parity&lt;br /&gt;
|-&lt;br /&gt;
| Default || Welcome to Macintosh.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+ {{Resource|DSAT|2}}&lt;br /&gt;
|-&lt;br /&gt;
! Error ID !! Text&lt;br /&gt;
|-&lt;br /&gt;
| 30 || Please insert the disk:&lt;br /&gt;
|-&lt;br /&gt;
| 28 || Sorry, a system error occurred.&lt;br /&gt;
|-&lt;br /&gt;
| 26 || The following application is busy or damaged:&lt;br /&gt;
|-&lt;br /&gt;
| 42 || You may now switch off your Macintosh safely.&lt;br /&gt;
|-&lt;br /&gt;
| 20000 || If you wish to continue using your Macintosh, press Restart.  If not, press Shut Down.&lt;br /&gt;
|-&lt;br /&gt;
| 20001 || You may now switch off your Macintosh safely. If you wish to continue using your Macintosh, press Restart.&lt;br /&gt;
|-&lt;br /&gt;
| 20002 || Unsaved changes will be lost.&lt;br /&gt;
|-&lt;br /&gt;
| 101 || Sorry, a system error occurred.&lt;br /&gt;
&lt;br /&gt;
RAM parity&lt;br /&gt;
|-&lt;br /&gt;
| Default || Sorry, a system error occurred.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Mac OS 7.6.1 ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+ {{Resource|DSAT|0}}&lt;br /&gt;
|-&lt;br /&gt;
! Error ID !! Text&lt;br /&gt;
|-&lt;br /&gt;
| 40 || Just figured out what BETA stands for.&lt;br /&gt;
|-&lt;br /&gt;
| 65526 ||&lt;br /&gt;
|-&lt;br /&gt;
| 65525 ||&lt;br /&gt;
|-&lt;br /&gt;
| 65523 ||&lt;br /&gt;
|-&lt;br /&gt;
| 102 || This startup disk will not work on this Macintosh model.  Use the latest Installer to update this disk for this model.&lt;br /&gt;
|-&lt;br /&gt;
| 104 || This disk must be unlocked in order to perform one-time housekeeping.  If you wish to use this disk to start your Macintosh, unlock it.&lt;br /&gt;
|-&lt;br /&gt;
| 105 || System 7.6.1 needs more memory to start up.&lt;br /&gt;
|-&lt;br /&gt;
| Default || Sorry, a system error occurred.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+ {{Resource|DSAT|2}}&lt;br /&gt;
|-&lt;br /&gt;
! Error ID !! Text&lt;br /&gt;
|-&lt;br /&gt;
| 28 || Sorry, a system error occurred.&lt;br /&gt;
|-&lt;br /&gt;
| 25 || Not enough memory is available while using&lt;br /&gt;
|-&lt;br /&gt;
| 42 || It is now safe to switch off your Macintosh.&lt;br /&gt;
|-&lt;br /&gt;
| 20000 || If you wish to continue using your Macintosh, press Restart.  If not, press Shut Down.&lt;br /&gt;
|-&lt;br /&gt;
| 20001 || It is now safe to switch off your Macintosh. If you wish to continue using your Macintosh, press Restart.&lt;br /&gt;
|-&lt;br /&gt;
| 20002 || Unsaved changes will be lost.&lt;br /&gt;
|-&lt;br /&gt;
| 99 || The System file on this startup disk may be damaged.  The Installer can be used to repair this disk.&lt;br /&gt;
|-&lt;br /&gt;
| 98 || The System file on this startup device does not contain the resources necessary to boot this Macintosh.  Please use the Installer to update the System file.&lt;br /&gt;
|-&lt;br /&gt;
| 101 || Sorry, a system error occurred.&lt;br /&gt;
&lt;br /&gt;
RAM parity&lt;br /&gt;
|-&lt;br /&gt;
| 20010 || Hard Disk Cable Warning&lt;br /&gt;
&lt;br /&gt;
You must first shutdown the Macintosh before attaching any SCSI hard disk cables.  Disconnect the cable from the back of the machine right now.&lt;br /&gt;
|-&lt;br /&gt;
| 1010 || Code Fragment could not be prepared.&lt;br /&gt;
|-&lt;br /&gt;
| 1011 || Internal Mixed Mode failure.&lt;br /&gt;
|-&lt;br /&gt;
| Default || Sorry, a system error occurred.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Mac OS 8.6 (PowerBook G3) ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+ {{Resource|DSAT|0}}&lt;br /&gt;
|-&lt;br /&gt;
! Error ID !! Text&lt;br /&gt;
|-&lt;br /&gt;
| 102 || This startup disk will not work on this Macintosh model.  Use the latest Installer to update this disk for this model.&lt;br /&gt;
|-&lt;br /&gt;
| 104 || This disk must be unlocked in order to perform one-time housekeeping.  If you wish to use this disk to start your Macintosh, unlock it.&lt;br /&gt;
|-&lt;br /&gt;
| 116 || This startup disk will not work on this computer. A Power PC based computer is required to startup from this disk.&lt;br /&gt;
|-&lt;br /&gt;
| 118 || The system software on the startup disk only functions on the original media, not if copied to another drive.&lt;br /&gt;
|-&lt;br /&gt;
| 105 || System 8.6 needs more memory to start up.&lt;br /&gt;
|-&lt;br /&gt;
| Default || Sorry, a system error occurred.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+ {{Resource|DSAT|2}}&lt;br /&gt;
|-&lt;br /&gt;
! Error ID !! Text&lt;br /&gt;
|-&lt;br /&gt;
| 28 || Sorry, a system error occurred.&lt;br /&gt;
|-&lt;br /&gt;
| 25 || Not enough memory is available while using&lt;br /&gt;
|-&lt;br /&gt;
| 42 ||&lt;br /&gt;
|-&lt;br /&gt;
| 20000 || If you wish to continue using your Macintosh, press Restart.  If not, press Shut Down.&lt;br /&gt;
|-&lt;br /&gt;
| 20001 || It is now safe to switch off your Macintosh. If you wish to continue using your Macintosh, press Restart.&lt;br /&gt;
|-&lt;br /&gt;
| 20002 || Clicking Force Quit causes you to lose any unsaved changes. To avoid further problems, restart your computer after you click Force Quit.&lt;br /&gt;
|-&lt;br /&gt;
| 99 || The System file on this startup disk may be damaged.  The Installer can be used to repair this disk.&lt;br /&gt;
|-&lt;br /&gt;
| 98 || The System file on this startup device does not contain the resources necessary to boot this Macintosh.  Please use the Installer to update the System file.&lt;br /&gt;
|-&lt;br /&gt;
| 101 || Sorry, a system error occurred.&lt;br /&gt;
&lt;br /&gt;
RAM parity&lt;br /&gt;
|-&lt;br /&gt;
| 20010 || Hard Disk Cable Warning&lt;br /&gt;
&lt;br /&gt;
You must first shutdown the Macintosh before attaching any SCSI hard disk cables.  Disconnect the cable from the back of the machine right now.&lt;br /&gt;
|-&lt;br /&gt;
| 29205 || Please reinsert the PC Card&lt;br /&gt;
&lt;br /&gt;
It is currently in use and must be reinserted immediately to prevent damaging a document, file or the card.&lt;br /&gt;
&lt;br /&gt;
Before ejecting a PC Card, you must close all documents and applications using the PC Card.&lt;br /&gt;
|-&lt;br /&gt;
| 1010 || Code Fragment could not be prepared.&lt;br /&gt;
|-&lt;br /&gt;
| 1011 || Internal Mixed Mode failure.&lt;br /&gt;
|-&lt;br /&gt;
| Default || Sorry, a system error occurred.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Mac OS 9.2.2 ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+ {{Resource|DSAT|0}}&lt;br /&gt;
|-&lt;br /&gt;
! Error ID !! Text&lt;br /&gt;
|-&lt;br /&gt;
| 102 || This startup disk will not work on this Macintosh model.  Use the latest Installer to update this disk for this model.&lt;br /&gt;
|-&lt;br /&gt;
| 104 || This disk must be unlocked in order to perform one-time housekeeping.  If you wish to use this disk to start your Macintosh, unlock it.&lt;br /&gt;
|-&lt;br /&gt;
| 116 || This startup disk will not work on this computer. A Power PC based computer is required to startup from this disk.&lt;br /&gt;
|-&lt;br /&gt;
| 118 || The system software on the startup disk only functions on the original media, not if copied to another drive.&lt;br /&gt;
|-&lt;br /&gt;
| 105 || System 9.2.2 needs more memory to start up.&lt;br /&gt;
|-&lt;br /&gt;
| Default || Sorry, a system error occurred.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+ {{Resource|DSAT|2}}&lt;br /&gt;
|-&lt;br /&gt;
! Error ID !! Text&lt;br /&gt;
|-&lt;br /&gt;
| 28 || Sorry, a system error occurred.&lt;br /&gt;
|-&lt;br /&gt;
| 25 || Not enough memory is available while using&lt;br /&gt;
|-&lt;br /&gt;
| 42 ||&lt;br /&gt;
|-&lt;br /&gt;
| 20000 || If you wish to continue using your Macintosh, press Restart.  If not, press Shut Down.&lt;br /&gt;
|-&lt;br /&gt;
| 20001 || It is now safe to switch off your Macintosh. If you wish to continue using your Macintosh, press Restart.&lt;br /&gt;
|-&lt;br /&gt;
| 20002 || Clicking Force Quit causes you to lose any unsaved changes. To avoid further problems, restart your computer after you click Force Quit.&lt;br /&gt;
|-&lt;br /&gt;
| 99 || The System file on this startup disk may be damaged.  The Installer can be used to repair this disk.&lt;br /&gt;
|-&lt;br /&gt;
| 98 || The System file on this startup device does not contain the resources necessary to boot this Macintosh.  Please use the Installer to update the System file.&lt;br /&gt;
|-&lt;br /&gt;
| 101 || Sorry, a system error occurred.&lt;br /&gt;
&lt;br /&gt;
RAM parity&lt;br /&gt;
|-&lt;br /&gt;
| 20010 || Hard Disk Cable Warning&lt;br /&gt;
&lt;br /&gt;
You must first shutdown the Macintosh before attaching any SCSI hard disk cables.  Disconnect the cable from the back of the machine right now.&lt;br /&gt;
|-&lt;br /&gt;
| 1010 || Code Fragment could not be prepared.&lt;br /&gt;
|-&lt;br /&gt;
| 1011 || Internal Mixed Mode failure.&lt;br /&gt;
|-&lt;br /&gt;
| Default || Sorry, a system error occurred.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:Classic Mac OS]]&lt;/div&gt;</summary>
		<author><name>Huntertur</name></author>
	</entry>
	<entry>
		<id>https://computers.huntertur.net/index.php?title=Compy&amp;diff=1090</id>
		<title>Compy</title>
		<link rel="alternate" type="text/html" href="https://computers.huntertur.net/index.php?title=Compy&amp;diff=1090"/>
		<updated>2025-09-27T21:32:35Z</updated>

		<summary type="html">&lt;p&gt;Huntertur: /* Specs */ Add specs&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{lowercase title}}&lt;br /&gt;
The &#039;&#039;&#039;PowerBook 5300c&#039;&#039;&#039; has a Floppy Disk Creator application, which allows me to recreate the system software installation disk set on 26 floppy disks. I don&#039;t have that many spare floppy disks.&lt;br /&gt;
&lt;br /&gt;
== Specs ==&lt;br /&gt;
; Machine ID : 128&lt;br /&gt;
; Processor : PowerPC 603e at 100 MHz&lt;br /&gt;
; RAM : 8 MiB&lt;br /&gt;
; Hard disk : 515.3 MB internal ATA IBM-DBOA-2540&lt;br /&gt;
; PC Card : Two slots&lt;br /&gt;
; Floppy drive : 1.44 MiB&lt;br /&gt;
; Display : 640x480 at 256 colors, or shorter (640x400?) at thousands of colors&lt;br /&gt;
&lt;br /&gt;
== Quirks ==&lt;br /&gt;
* The right hinge was damaged while in the seller&#039;s possession. When opening or closing the display, be slow, and physically hold the right hinge together.&lt;br /&gt;
* To boot from the Mac OS 8.0 floppy version disks, first format the drive using the Disk Tools 2 disk instead of the Disk Tools 1 disk.&lt;br /&gt;
* When the computer is plugged in but off, a noise similar to a modern laptop fan can be heard from the internal speaker.&lt;br /&gt;
&lt;br /&gt;
== History ==&lt;br /&gt;
* 2021-12-16: The computer arrives at my apartment from an eBay seller. The 3.5&amp;quot; floppy disk drive is impacted in the front left corner on the top. Disks must be inserted with great force at an odd angle. The disk drive tries to push out any disks that are inserted. When a disk is inserted, the drive doesn&#039;t click and secure the disk, and no reading happens.&lt;br /&gt;
* 2021-12-22: {{Upgrade|The 3.5&amp;quot; floppy disk drive is replaced with a working one.}}&lt;br /&gt;
* 2023-07-20: The computer is temporarily transported back to my parents&#039; place.&lt;br /&gt;
* 2023-09-18: The computer is transported to the new home.&lt;br /&gt;
&lt;br /&gt;
[[Category:Computers]]&lt;br /&gt;
[[Category:PowerPC Macs]]&lt;/div&gt;</summary>
		<author><name>Huntertur</name></author>
	</entry>
	<entry>
		<id>https://computers.huntertur.net/index.php?title=System_Error_Alert_Table&amp;diff=1089</id>
		<title>System Error Alert Table</title>
		<link rel="alternate" type="text/html" href="https://computers.huntertur.net/index.php?title=System_Error_Alert_Table&amp;diff=1089"/>
		<updated>2025-09-27T04:09:27Z</updated>

		<summary type="html">&lt;p&gt;Huntertur: /* Contents in different system versions */ Convert to Template:Resource&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &#039;&#039;&#039;System Error Alert Table&#039;&#039;&#039; (resource type &#039;&#039;&#039;&amp;lt;code&amp;gt;DSAT&amp;lt;/code&amp;gt;&#039;&#039;&#039;, allegedly short for &#039;&#039;&#039;Deep Shit Alert Table&#039;&#039;&#039;) describes startup text and fatal error dialogs for the classic Mac OS.&lt;br /&gt;
&lt;br /&gt;
== Specification ==&lt;br /&gt;
&lt;br /&gt;
See [https://preterhuman.net/macstuff/insidemac/OSUtilities/OSUtilities-36.html Inside Macintosh: Operating System Utilities, Chapter 2 - System Error Handler, The System Error Alert Table Resource].&lt;br /&gt;
&lt;br /&gt;
== Reading it ==&lt;br /&gt;
&lt;br /&gt;
ResEdit doesn&#039;t support &amp;lt;code&amp;gt;DSAT&amp;lt;/code&amp;gt; and only shows a hex editor despite having a custom icon for the resource type.&lt;br /&gt;
&lt;br /&gt;
Here is an extremely rough Python script for dumping the alerts, their IDs, and their error messages. Despite DSAT definitions being polymorphic, there is no type information, so it determines what is an alert by process of elimination (correct size, text pointers are valid, pointed-to text is ASCII). Copy-paste the hex editor output from ResEdit into a text file, then pass its filename to this script:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;code&amp;gt;dsat.py&amp;lt;/code&amp;gt; contents&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
from argparse import ArgumentParser&lt;br /&gt;
from pathlib import Path&lt;br /&gt;
import struct&lt;br /&gt;
from typing import NamedTuple&lt;br /&gt;
&lt;br /&gt;
parser = ArgumentParser()&lt;br /&gt;
parser.add_argument(&#039;hexfilepath&#039;)&lt;br /&gt;
buffer = bytes.fromhex(Path(parser.parse_args().hexfilepath).read_text())&lt;br /&gt;
offset = 0&lt;br /&gt;
&lt;br /&gt;
def read_short():&lt;br /&gt;
    global offset&lt;br /&gt;
    number = int.from_bytes(buffer[offset:offset + 2])&lt;br /&gt;
    offset += 2&lt;br /&gt;
    return number&lt;br /&gt;
&lt;br /&gt;
definition_count = read_short()&lt;br /&gt;
definitions: dict[int, &#039;Definition&#039;]&lt;br /&gt;
&lt;br /&gt;
class Alert(NamedTuple):&lt;br /&gt;
    text1_id: int&lt;br /&gt;
    text2_id: int&lt;br /&gt;
    icon_id: int&lt;br /&gt;
    proc_id: int&lt;br /&gt;
    button_layout_id: int&lt;br /&gt;
&lt;br /&gt;
    @property&lt;br /&gt;
    def text1(self):&lt;br /&gt;
        return definitions[self.text1_id].as_text().replace(&#039;/&#039;, &#039;\n&#039;) if self.text1_id else None&lt;br /&gt;
&lt;br /&gt;
    @property&lt;br /&gt;
    def text2(self):&lt;br /&gt;
        return definitions[self.text2_id].as_text().replace(&#039;/&#039;, &#039;\n&#039;) if self.text2_id else None&lt;br /&gt;
&lt;br /&gt;
    @property&lt;br /&gt;
    def text(self):&lt;br /&gt;
        if not self.text1:&lt;br /&gt;
            return None&lt;br /&gt;
&lt;br /&gt;
        if self.text2:&lt;br /&gt;
            return self.text1 + &#039;\n&#039; + self.text2&lt;br /&gt;
&lt;br /&gt;
        return self.text1&lt;br /&gt;
&lt;br /&gt;
class Definition(NamedTuple):&lt;br /&gt;
    id: int&lt;br /&gt;
    data: bytes&lt;br /&gt;
&lt;br /&gt;
    def as_alert(self):&lt;br /&gt;
        return Alert(*struct.unpack(&#039;&amp;gt;HHHHH&#039;, self.data))&lt;br /&gt;
&lt;br /&gt;
    def as_text(self):&lt;br /&gt;
        return self.data[4:-1].decode(&#039;ascii&#039;)&lt;br /&gt;
&lt;br /&gt;
def read_definition():&lt;br /&gt;
    global offset&lt;br /&gt;
    id = read_short()&lt;br /&gt;
    length = read_short()&lt;br /&gt;
    data = buffer[offset:offset + length]&lt;br /&gt;
    offset += length&lt;br /&gt;
    return Definition(id, data)&lt;br /&gt;
&lt;br /&gt;
default_alert = read_definition().as_alert()&lt;br /&gt;
definitions = {(definition := read_definition()).id: definition&lt;br /&gt;
               for _ in range(definition_count)}&lt;br /&gt;
&lt;br /&gt;
for error_id, definition in definitions.items():&lt;br /&gt;
    if len(definition.data) == 10:&lt;br /&gt;
        alert = definition.as_alert()&lt;br /&gt;
        try:&lt;br /&gt;
            print(error_id, &#039;-&#039;, alert.text)&lt;br /&gt;
        except (KeyError, UnicodeDecodeError):&lt;br /&gt;
            pass&lt;br /&gt;
&lt;br /&gt;
print(&#039;Default - &#039;, default_alert.text)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
&lt;br /&gt;
* The System Error Alert Table isn&#039;t just for fatal errors! The text below shows that the Force Quit dialog, among other things, is implemented here.&lt;br /&gt;
* Sometimes, there is no error text, or the text is cut off; this is due to a custom procedure being used for that alert.&lt;br /&gt;
** Post-boot (when &amp;lt;code&amp;gt;DSAT&amp;lt;/code&amp;gt; ID = 2 is loaded), &amp;quot;out of memory&amp;quot;, &amp;quot;unimplemented trap&amp;quot;, and friends are printed by a procedure.&lt;br /&gt;
* Entries in the table are not in order.&lt;br /&gt;
* The &amp;quot;Power PC&amp;quot; and &amp;quot;System&amp;quot; (instead of Mac OS for &amp;gt;= 7.6) typos are in the original text.&lt;br /&gt;
* The PC Card warning exists on the PowerBook version of Mac OS 8.6 but not the generic version of Mac OS 9.2.2 (on a Power Mac G4). Is this a one-off for this version, or does this table get dynamically generated at install time?&lt;br /&gt;
&lt;br /&gt;
== Contents in different system versions ==&lt;br /&gt;
&lt;br /&gt;
=== System Software 6.0.8 ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+ {{Resource|DSAT|0}}&lt;br /&gt;
|-&lt;br /&gt;
! Error ID !! Text&lt;br /&gt;
|-&lt;br /&gt;
| 65526 || MacsBug installed.&lt;br /&gt;
|-&lt;br /&gt;
| 65525 ||&lt;br /&gt;
|-&lt;br /&gt;
| 102 || This startup disk will not work on this Macintosh model.  Use the latest Installer to update this disk for this model.  (System 6.0.8 does not work on this model; you need a newer version that does.)&lt;br /&gt;
|-&lt;br /&gt;
| 103 || This Macintosh is set for 32-bit addressing.  You may switch to 24-bit addressing and use this disk or restart and use a newer startup disk.  (System 6.0.8 does not work with 32-bit addressing.)&lt;br /&gt;
|-&lt;br /&gt;
| 101 || Sorry, a system error occurred.&lt;br /&gt;
&lt;br /&gt;
RAM parity&lt;br /&gt;
|-&lt;br /&gt;
| Default || Welcome to Macintosh.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+ {{Resource|DSAT|2}}&lt;br /&gt;
|-&lt;br /&gt;
! Error ID !! Text&lt;br /&gt;
|-&lt;br /&gt;
| 30 || Please insert the disk:&lt;br /&gt;
|-&lt;br /&gt;
| 28 || Sorry, a system error occurred.&lt;br /&gt;
|-&lt;br /&gt;
| 26 || The following application is busy or damaged:&lt;br /&gt;
|-&lt;br /&gt;
| 42 || You may now switch off your Macintosh safely.&lt;br /&gt;
|-&lt;br /&gt;
| 20000 || If you wish to continue using your Macintosh, press Restart.  If not, press Shut Down.&lt;br /&gt;
|-&lt;br /&gt;
| 20001 || You may now switch off your Macintosh safely. If you wish to continue using your Macintosh, press Restart.&lt;br /&gt;
|-&lt;br /&gt;
| 20002 || Unsaved changes will be lost.&lt;br /&gt;
|-&lt;br /&gt;
| 101 || Sorry, a system error occurred.&lt;br /&gt;
&lt;br /&gt;
RAM parity&lt;br /&gt;
|-&lt;br /&gt;
| Default || Sorry, a system error occurred.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Mac OS 8.6 (PowerBook G3) ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+ {{Resource|DSAT|0}}&lt;br /&gt;
|-&lt;br /&gt;
! Error ID !! Text&lt;br /&gt;
|-&lt;br /&gt;
| 102 || This startup disk will not work on this Macintosh model.  Use the latest Installer to update this disk for this model.&lt;br /&gt;
|-&lt;br /&gt;
| 104 || This disk must be unlocked in order to perform one-time housekeeping.  If you wish to use this disk to start your Macintosh, unlock it.&lt;br /&gt;
|-&lt;br /&gt;
| 116 || This startup disk will not work on this computer. A Power PC based computer is required to startup from this disk.&lt;br /&gt;
|-&lt;br /&gt;
| 118 || The system software on the startup disk only functions on the original media, not if copied to another drive.&lt;br /&gt;
|-&lt;br /&gt;
| 105 || System 8.6 needs more memory to start up.&lt;br /&gt;
|-&lt;br /&gt;
| Default || Sorry, a system error occurred.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+ {{Resource|DSAT|2}}&lt;br /&gt;
|-&lt;br /&gt;
! Error ID !! Text&lt;br /&gt;
|-&lt;br /&gt;
| 28 || Sorry, a system error occurred.&lt;br /&gt;
|-&lt;br /&gt;
| 25 || Not enough memory is available while using&lt;br /&gt;
|-&lt;br /&gt;
| 42 ||&lt;br /&gt;
|-&lt;br /&gt;
| 20000 || If you wish to continue using your Macintosh, press Restart.  If not, press Shut Down.&lt;br /&gt;
|-&lt;br /&gt;
| 20001 || It is now safe to switch off your Macintosh. If you wish to continue using your Macintosh, press Restart.&lt;br /&gt;
|-&lt;br /&gt;
| 20002 || Clicking Force Quit causes you to lose any unsaved changes. To avoid further problems, restart your computer after you click Force Quit.&lt;br /&gt;
|-&lt;br /&gt;
| 99 || The System file on this startup disk may be damaged.  The Installer can be used to repair this disk.&lt;br /&gt;
|-&lt;br /&gt;
| 98 || The System file on this startup device does not contain the resources necessary to boot this Macintosh.  Please use the Installer to update the System file.&lt;br /&gt;
|-&lt;br /&gt;
| 101 || Sorry, a system error occurred.&lt;br /&gt;
&lt;br /&gt;
RAM parity&lt;br /&gt;
|-&lt;br /&gt;
| 20010 || Hard Disk Cable Warning&lt;br /&gt;
&lt;br /&gt;
You must first shutdown the Macintosh before attaching any SCSI hard disk cables.  Disconnect the cable from the back of the machine right now.&lt;br /&gt;
|-&lt;br /&gt;
| 29205 || Please reinsert the PC Card&lt;br /&gt;
&lt;br /&gt;
It is currently in use and must be reinserted immediately to prevent damaging a document, file or the card.&lt;br /&gt;
&lt;br /&gt;
Before ejecting a PC Card, you must close all documents and applications using the PC Card.&lt;br /&gt;
|-&lt;br /&gt;
| 1010 || Code Fragment could not be prepared.&lt;br /&gt;
|-&lt;br /&gt;
| 1011 || Internal Mixed Mode failure.&lt;br /&gt;
|-&lt;br /&gt;
| Default || Sorry, a system error occurred.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Mac OS 9.2.2 ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+ DSAT ID = {{Resource|DSAT|0}}&lt;br /&gt;
|-&lt;br /&gt;
! Error ID !! Text&lt;br /&gt;
|-&lt;br /&gt;
| 102 || This startup disk will not work on this Macintosh model.  Use the latest Installer to update this disk for this model.&lt;br /&gt;
|-&lt;br /&gt;
| 104 || This disk must be unlocked in order to perform one-time housekeeping.  If you wish to use this disk to start your Macintosh, unlock it.&lt;br /&gt;
|-&lt;br /&gt;
| 116 || This startup disk will not work on this computer. A Power PC based computer is required to startup from this disk.&lt;br /&gt;
|-&lt;br /&gt;
| 118 || The system software on the startup disk only functions on the original media, not if copied to another drive.&lt;br /&gt;
|-&lt;br /&gt;
| 105 || System 9.2.2 needs more memory to start up.&lt;br /&gt;
|-&lt;br /&gt;
| Default || Sorry, a system error occurred.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+ DSAT ID = {{Resource|DSAT|2}}&lt;br /&gt;
|-&lt;br /&gt;
! Error ID !! Text&lt;br /&gt;
|-&lt;br /&gt;
| 28 || Sorry, a system error occurred.&lt;br /&gt;
|-&lt;br /&gt;
| 25 || Not enough memory is available while using&lt;br /&gt;
|-&lt;br /&gt;
| 42 ||&lt;br /&gt;
|-&lt;br /&gt;
| 20000 || If you wish to continue using your Macintosh, press Restart.  If not, press Shut Down.&lt;br /&gt;
|-&lt;br /&gt;
| 20001 || It is now safe to switch off your Macintosh. If you wish to continue using your Macintosh, press Restart.&lt;br /&gt;
|-&lt;br /&gt;
| 20002 || Clicking Force Quit causes you to lose any unsaved changes. To avoid further problems, restart your computer after you click Force Quit.&lt;br /&gt;
|-&lt;br /&gt;
| 99 || The System file on this startup disk may be damaged.  The Installer can be used to repair this disk.&lt;br /&gt;
|-&lt;br /&gt;
| 98 || The System file on this startup device does not contain the resources necessary to boot this Macintosh.  Please use the Installer to update the System file.&lt;br /&gt;
|-&lt;br /&gt;
| 101 || Sorry, a system error occurred.&lt;br /&gt;
&lt;br /&gt;
RAM parity&lt;br /&gt;
|-&lt;br /&gt;
| 20010 || Hard Disk Cable Warning&lt;br /&gt;
&lt;br /&gt;
You must first shutdown the Macintosh before attaching any SCSI hard disk cables.  Disconnect the cable from the back of the machine right now.&lt;br /&gt;
|-&lt;br /&gt;
| 1010 || Code Fragment could not be prepared.&lt;br /&gt;
|-&lt;br /&gt;
| 1011 || Internal Mixed Mode failure.&lt;br /&gt;
|-&lt;br /&gt;
| Default || Sorry, a system error occurred.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:Classic Mac OS]]&lt;/div&gt;</summary>
		<author><name>Huntertur</name></author>
	</entry>
	<entry>
		<id>https://computers.huntertur.net/index.php?title=System_Error_Alert_Table&amp;diff=1088</id>
		<title>System Error Alert Table</title>
		<link rel="alternate" type="text/html" href="https://computers.huntertur.net/index.php?title=System_Error_Alert_Table&amp;diff=1088"/>
		<updated>2025-09-27T04:08:52Z</updated>

		<summary type="html">&lt;p&gt;Huntertur: /* Notes */ Add note&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &#039;&#039;&#039;System Error Alert Table&#039;&#039;&#039; (resource type &#039;&#039;&#039;&amp;lt;code&amp;gt;DSAT&amp;lt;/code&amp;gt;&#039;&#039;&#039;, allegedly short for &#039;&#039;&#039;Deep Shit Alert Table&#039;&#039;&#039;) describes startup text and fatal error dialogs for the classic Mac OS.&lt;br /&gt;
&lt;br /&gt;
== Specification ==&lt;br /&gt;
&lt;br /&gt;
See [https://preterhuman.net/macstuff/insidemac/OSUtilities/OSUtilities-36.html Inside Macintosh: Operating System Utilities, Chapter 2 - System Error Handler, The System Error Alert Table Resource].&lt;br /&gt;
&lt;br /&gt;
== Reading it ==&lt;br /&gt;
&lt;br /&gt;
ResEdit doesn&#039;t support &amp;lt;code&amp;gt;DSAT&amp;lt;/code&amp;gt; and only shows a hex editor despite having a custom icon for the resource type.&lt;br /&gt;
&lt;br /&gt;
Here is an extremely rough Python script for dumping the alerts, their IDs, and their error messages. Despite DSAT definitions being polymorphic, there is no type information, so it determines what is an alert by process of elimination (correct size, text pointers are valid, pointed-to text is ASCII). Copy-paste the hex editor output from ResEdit into a text file, then pass its filename to this script:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;code&amp;gt;dsat.py&amp;lt;/code&amp;gt; contents&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
from argparse import ArgumentParser&lt;br /&gt;
from pathlib import Path&lt;br /&gt;
import struct&lt;br /&gt;
from typing import NamedTuple&lt;br /&gt;
&lt;br /&gt;
parser = ArgumentParser()&lt;br /&gt;
parser.add_argument(&#039;hexfilepath&#039;)&lt;br /&gt;
buffer = bytes.fromhex(Path(parser.parse_args().hexfilepath).read_text())&lt;br /&gt;
offset = 0&lt;br /&gt;
&lt;br /&gt;
def read_short():&lt;br /&gt;
    global offset&lt;br /&gt;
    number = int.from_bytes(buffer[offset:offset + 2])&lt;br /&gt;
    offset += 2&lt;br /&gt;
    return number&lt;br /&gt;
&lt;br /&gt;
definition_count = read_short()&lt;br /&gt;
definitions: dict[int, &#039;Definition&#039;]&lt;br /&gt;
&lt;br /&gt;
class Alert(NamedTuple):&lt;br /&gt;
    text1_id: int&lt;br /&gt;
    text2_id: int&lt;br /&gt;
    icon_id: int&lt;br /&gt;
    proc_id: int&lt;br /&gt;
    button_layout_id: int&lt;br /&gt;
&lt;br /&gt;
    @property&lt;br /&gt;
    def text1(self):&lt;br /&gt;
        return definitions[self.text1_id].as_text().replace(&#039;/&#039;, &#039;\n&#039;) if self.text1_id else None&lt;br /&gt;
&lt;br /&gt;
    @property&lt;br /&gt;
    def text2(self):&lt;br /&gt;
        return definitions[self.text2_id].as_text().replace(&#039;/&#039;, &#039;\n&#039;) if self.text2_id else None&lt;br /&gt;
&lt;br /&gt;
    @property&lt;br /&gt;
    def text(self):&lt;br /&gt;
        if not self.text1:&lt;br /&gt;
            return None&lt;br /&gt;
&lt;br /&gt;
        if self.text2:&lt;br /&gt;
            return self.text1 + &#039;\n&#039; + self.text2&lt;br /&gt;
&lt;br /&gt;
        return self.text1&lt;br /&gt;
&lt;br /&gt;
class Definition(NamedTuple):&lt;br /&gt;
    id: int&lt;br /&gt;
    data: bytes&lt;br /&gt;
&lt;br /&gt;
    def as_alert(self):&lt;br /&gt;
        return Alert(*struct.unpack(&#039;&amp;gt;HHHHH&#039;, self.data))&lt;br /&gt;
&lt;br /&gt;
    def as_text(self):&lt;br /&gt;
        return self.data[4:-1].decode(&#039;ascii&#039;)&lt;br /&gt;
&lt;br /&gt;
def read_definition():&lt;br /&gt;
    global offset&lt;br /&gt;
    id = read_short()&lt;br /&gt;
    length = read_short()&lt;br /&gt;
    data = buffer[offset:offset + length]&lt;br /&gt;
    offset += length&lt;br /&gt;
    return Definition(id, data)&lt;br /&gt;
&lt;br /&gt;
default_alert = read_definition().as_alert()&lt;br /&gt;
definitions = {(definition := read_definition()).id: definition&lt;br /&gt;
               for _ in range(definition_count)}&lt;br /&gt;
&lt;br /&gt;
for error_id, definition in definitions.items():&lt;br /&gt;
    if len(definition.data) == 10:&lt;br /&gt;
        alert = definition.as_alert()&lt;br /&gt;
        try:&lt;br /&gt;
            print(error_id, &#039;-&#039;, alert.text)&lt;br /&gt;
        except (KeyError, UnicodeDecodeError):&lt;br /&gt;
            pass&lt;br /&gt;
&lt;br /&gt;
print(&#039;Default - &#039;, default_alert.text)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
&lt;br /&gt;
* The System Error Alert Table isn&#039;t just for fatal errors! The text below shows that the Force Quit dialog, among other things, is implemented here.&lt;br /&gt;
* Sometimes, there is no error text, or the text is cut off; this is due to a custom procedure being used for that alert.&lt;br /&gt;
** Post-boot (when &amp;lt;code&amp;gt;DSAT&amp;lt;/code&amp;gt; ID = 2 is loaded), &amp;quot;out of memory&amp;quot;, &amp;quot;unimplemented trap&amp;quot;, and friends are printed by a procedure.&lt;br /&gt;
* Entries in the table are not in order.&lt;br /&gt;
* The &amp;quot;Power PC&amp;quot; and &amp;quot;System&amp;quot; (instead of Mac OS for &amp;gt;= 7.6) typos are in the original text.&lt;br /&gt;
* The PC Card warning exists on the PowerBook version of Mac OS 8.6 but not the generic version of Mac OS 9.2.2 (on a Power Mac G4). Is this a one-off for this version, or does this table get dynamically generated at install time?&lt;br /&gt;
&lt;br /&gt;
== Contents in different system versions ==&lt;br /&gt;
&lt;br /&gt;
=== System Software 6.0.8 ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+ DSAT ID = 0&lt;br /&gt;
|-&lt;br /&gt;
! Error ID !! Text&lt;br /&gt;
|-&lt;br /&gt;
| 65526 || MacsBug installed.&lt;br /&gt;
|-&lt;br /&gt;
| 65525 ||&lt;br /&gt;
|-&lt;br /&gt;
| 102 || This startup disk will not work on this Macintosh model.  Use the latest Installer to update this disk for this model.  (System 6.0.8 does not work on this model; you need a newer version that does.)&lt;br /&gt;
|-&lt;br /&gt;
| 103 || This Macintosh is set for 32-bit addressing.  You may switch to 24-bit addressing and use this disk or restart and use a newer startup disk.  (System 6.0.8 does not work with 32-bit addressing.)&lt;br /&gt;
|-&lt;br /&gt;
| 101 || Sorry, a system error occurred.&lt;br /&gt;
&lt;br /&gt;
RAM parity&lt;br /&gt;
|-&lt;br /&gt;
| Default || Welcome to Macintosh.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+ DSAT ID = 2&lt;br /&gt;
|-&lt;br /&gt;
! Error ID !! Text&lt;br /&gt;
|-&lt;br /&gt;
| 30 || Please insert the disk:&lt;br /&gt;
|-&lt;br /&gt;
| 28 || Sorry, a system error occurred.&lt;br /&gt;
|-&lt;br /&gt;
| 26 || The following application is busy or damaged:&lt;br /&gt;
|-&lt;br /&gt;
| 42 || You may now switch off your Macintosh safely.&lt;br /&gt;
|-&lt;br /&gt;
| 20000 || If you wish to continue using your Macintosh, press Restart.  If not, press Shut Down.&lt;br /&gt;
|-&lt;br /&gt;
| 20001 || You may now switch off your Macintosh safely. If you wish to continue using your Macintosh, press Restart.&lt;br /&gt;
|-&lt;br /&gt;
| 20002 || Unsaved changes will be lost.&lt;br /&gt;
|-&lt;br /&gt;
| 101 || Sorry, a system error occurred.&lt;br /&gt;
&lt;br /&gt;
RAM parity&lt;br /&gt;
|-&lt;br /&gt;
| Default || Sorry, a system error occurred.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Mac OS 8.6 (PowerBook G3) ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+ {{Resource|DSAT|0}}&lt;br /&gt;
|-&lt;br /&gt;
! Error ID !! Text&lt;br /&gt;
|-&lt;br /&gt;
| 102 || This startup disk will not work on this Macintosh model.  Use the latest Installer to update this disk for this model.&lt;br /&gt;
|-&lt;br /&gt;
| 104 || This disk must be unlocked in order to perform one-time housekeeping.  If you wish to use this disk to start your Macintosh, unlock it.&lt;br /&gt;
|-&lt;br /&gt;
| 116 || This startup disk will not work on this computer. A Power PC based computer is required to startup from this disk.&lt;br /&gt;
|-&lt;br /&gt;
| 118 || The system software on the startup disk only functions on the original media, not if copied to another drive.&lt;br /&gt;
|-&lt;br /&gt;
| 105 || System 8.6 needs more memory to start up.&lt;br /&gt;
|-&lt;br /&gt;
| Default || Sorry, a system error occurred.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+ {{Resource|DSAT|2}}&lt;br /&gt;
|-&lt;br /&gt;
! Error ID !! Text&lt;br /&gt;
|-&lt;br /&gt;
| 28 || Sorry, a system error occurred.&lt;br /&gt;
|-&lt;br /&gt;
| 25 || Not enough memory is available while using&lt;br /&gt;
|-&lt;br /&gt;
| 42 ||&lt;br /&gt;
|-&lt;br /&gt;
| 20000 || If you wish to continue using your Macintosh, press Restart.  If not, press Shut Down.&lt;br /&gt;
|-&lt;br /&gt;
| 20001 || It is now safe to switch off your Macintosh. If you wish to continue using your Macintosh, press Restart.&lt;br /&gt;
|-&lt;br /&gt;
| 20002 || Clicking Force Quit causes you to lose any unsaved changes. To avoid further problems, restart your computer after you click Force Quit.&lt;br /&gt;
|-&lt;br /&gt;
| 99 || The System file on this startup disk may be damaged.  The Installer can be used to repair this disk.&lt;br /&gt;
|-&lt;br /&gt;
| 98 || The System file on this startup device does not contain the resources necessary to boot this Macintosh.  Please use the Installer to update the System file.&lt;br /&gt;
|-&lt;br /&gt;
| 101 || Sorry, a system error occurred.&lt;br /&gt;
&lt;br /&gt;
RAM parity&lt;br /&gt;
|-&lt;br /&gt;
| 20010 || Hard Disk Cable Warning&lt;br /&gt;
&lt;br /&gt;
You must first shutdown the Macintosh before attaching any SCSI hard disk cables.  Disconnect the cable from the back of the machine right now.&lt;br /&gt;
|-&lt;br /&gt;
| 29205 || Please reinsert the PC Card&lt;br /&gt;
&lt;br /&gt;
It is currently in use and must be reinserted immediately to prevent damaging a document, file or the card.&lt;br /&gt;
&lt;br /&gt;
Before ejecting a PC Card, you must close all documents and applications using the PC Card.&lt;br /&gt;
|-&lt;br /&gt;
| 1010 || Code Fragment could not be prepared.&lt;br /&gt;
|-&lt;br /&gt;
| 1011 || Internal Mixed Mode failure.&lt;br /&gt;
|-&lt;br /&gt;
| Default || Sorry, a system error occurred.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Mac OS 9.2.2 ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+ DSAT ID = 0&lt;br /&gt;
|-&lt;br /&gt;
! Error ID !! Text&lt;br /&gt;
|-&lt;br /&gt;
| 102 || This startup disk will not work on this Macintosh model.  Use the latest Installer to update this disk for this model.&lt;br /&gt;
|-&lt;br /&gt;
| 104 || This disk must be unlocked in order to perform one-time housekeeping.  If you wish to use this disk to start your Macintosh, unlock it.&lt;br /&gt;
|-&lt;br /&gt;
| 116 || This startup disk will not work on this computer. A Power PC based computer is required to startup from this disk.&lt;br /&gt;
|-&lt;br /&gt;
| 118 || The system software on the startup disk only functions on the original media, not if copied to another drive.&lt;br /&gt;
|-&lt;br /&gt;
| 105 || System 9.2.2 needs more memory to start up.&lt;br /&gt;
|-&lt;br /&gt;
| Default || Sorry, a system error occurred.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+ DSAT ID = 2&lt;br /&gt;
|-&lt;br /&gt;
! Error ID !! Text&lt;br /&gt;
|-&lt;br /&gt;
| 28 || Sorry, a system error occurred.&lt;br /&gt;
|-&lt;br /&gt;
| 25 || Not enough memory is available while using&lt;br /&gt;
|-&lt;br /&gt;
| 42 ||&lt;br /&gt;
|-&lt;br /&gt;
| 20000 || If you wish to continue using your Macintosh, press Restart.  If not, press Shut Down.&lt;br /&gt;
|-&lt;br /&gt;
| 20001 || It is now safe to switch off your Macintosh. If you wish to continue using your Macintosh, press Restart.&lt;br /&gt;
|-&lt;br /&gt;
| 20002 || Clicking Force Quit causes you to lose any unsaved changes. To avoid further problems, restart your computer after you click Force Quit.&lt;br /&gt;
|-&lt;br /&gt;
| 99 || The System file on this startup disk may be damaged.  The Installer can be used to repair this disk.&lt;br /&gt;
|-&lt;br /&gt;
| 98 || The System file on this startup device does not contain the resources necessary to boot this Macintosh.  Please use the Installer to update the System file.&lt;br /&gt;
|-&lt;br /&gt;
| 101 || Sorry, a system error occurred.&lt;br /&gt;
&lt;br /&gt;
RAM parity&lt;br /&gt;
|-&lt;br /&gt;
| 20010 || Hard Disk Cable Warning&lt;br /&gt;
&lt;br /&gt;
You must first shutdown the Macintosh before attaching any SCSI hard disk cables.  Disconnect the cable from the back of the machine right now.&lt;br /&gt;
|-&lt;br /&gt;
| 1010 || Code Fragment could not be prepared.&lt;br /&gt;
|-&lt;br /&gt;
| 1011 || Internal Mixed Mode failure.&lt;br /&gt;
|-&lt;br /&gt;
| Default || Sorry, a system error occurred.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:Classic Mac OS]]&lt;/div&gt;</summary>
		<author><name>Huntertur</name></author>
	</entry>
	<entry>
		<id>https://computers.huntertur.net/index.php?title=System_Error_Alert_Table&amp;diff=1087</id>
		<title>System Error Alert Table</title>
		<link rel="alternate" type="text/html" href="https://computers.huntertur.net/index.php?title=System_Error_Alert_Table&amp;diff=1087"/>
		<updated>2025-09-27T04:07:03Z</updated>

		<summary type="html">&lt;p&gt;Huntertur: /* Contents in different system versions */ Add 8.6 PowerBook version&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &#039;&#039;&#039;System Error Alert Table&#039;&#039;&#039; (resource type &#039;&#039;&#039;&amp;lt;code&amp;gt;DSAT&amp;lt;/code&amp;gt;&#039;&#039;&#039;, allegedly short for &#039;&#039;&#039;Deep Shit Alert Table&#039;&#039;&#039;) describes startup text and fatal error dialogs for the classic Mac OS.&lt;br /&gt;
&lt;br /&gt;
== Specification ==&lt;br /&gt;
&lt;br /&gt;
See [https://preterhuman.net/macstuff/insidemac/OSUtilities/OSUtilities-36.html Inside Macintosh: Operating System Utilities, Chapter 2 - System Error Handler, The System Error Alert Table Resource].&lt;br /&gt;
&lt;br /&gt;
== Reading it ==&lt;br /&gt;
&lt;br /&gt;
ResEdit doesn&#039;t support &amp;lt;code&amp;gt;DSAT&amp;lt;/code&amp;gt; and only shows a hex editor despite having a custom icon for the resource type.&lt;br /&gt;
&lt;br /&gt;
Here is an extremely rough Python script for dumping the alerts, their IDs, and their error messages. Despite DSAT definitions being polymorphic, there is no type information, so it determines what is an alert by process of elimination (correct size, text pointers are valid, pointed-to text is ASCII). Copy-paste the hex editor output from ResEdit into a text file, then pass its filename to this script:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;code&amp;gt;dsat.py&amp;lt;/code&amp;gt; contents&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
from argparse import ArgumentParser&lt;br /&gt;
from pathlib import Path&lt;br /&gt;
import struct&lt;br /&gt;
from typing import NamedTuple&lt;br /&gt;
&lt;br /&gt;
parser = ArgumentParser()&lt;br /&gt;
parser.add_argument(&#039;hexfilepath&#039;)&lt;br /&gt;
buffer = bytes.fromhex(Path(parser.parse_args().hexfilepath).read_text())&lt;br /&gt;
offset = 0&lt;br /&gt;
&lt;br /&gt;
def read_short():&lt;br /&gt;
    global offset&lt;br /&gt;
    number = int.from_bytes(buffer[offset:offset + 2])&lt;br /&gt;
    offset += 2&lt;br /&gt;
    return number&lt;br /&gt;
&lt;br /&gt;
definition_count = read_short()&lt;br /&gt;
definitions: dict[int, &#039;Definition&#039;]&lt;br /&gt;
&lt;br /&gt;
class Alert(NamedTuple):&lt;br /&gt;
    text1_id: int&lt;br /&gt;
    text2_id: int&lt;br /&gt;
    icon_id: int&lt;br /&gt;
    proc_id: int&lt;br /&gt;
    button_layout_id: int&lt;br /&gt;
&lt;br /&gt;
    @property&lt;br /&gt;
    def text1(self):&lt;br /&gt;
        return definitions[self.text1_id].as_text().replace(&#039;/&#039;, &#039;\n&#039;) if self.text1_id else None&lt;br /&gt;
&lt;br /&gt;
    @property&lt;br /&gt;
    def text2(self):&lt;br /&gt;
        return definitions[self.text2_id].as_text().replace(&#039;/&#039;, &#039;\n&#039;) if self.text2_id else None&lt;br /&gt;
&lt;br /&gt;
    @property&lt;br /&gt;
    def text(self):&lt;br /&gt;
        if not self.text1:&lt;br /&gt;
            return None&lt;br /&gt;
&lt;br /&gt;
        if self.text2:&lt;br /&gt;
            return self.text1 + &#039;\n&#039; + self.text2&lt;br /&gt;
&lt;br /&gt;
        return self.text1&lt;br /&gt;
&lt;br /&gt;
class Definition(NamedTuple):&lt;br /&gt;
    id: int&lt;br /&gt;
    data: bytes&lt;br /&gt;
&lt;br /&gt;
    def as_alert(self):&lt;br /&gt;
        return Alert(*struct.unpack(&#039;&amp;gt;HHHHH&#039;, self.data))&lt;br /&gt;
&lt;br /&gt;
    def as_text(self):&lt;br /&gt;
        return self.data[4:-1].decode(&#039;ascii&#039;)&lt;br /&gt;
&lt;br /&gt;
def read_definition():&lt;br /&gt;
    global offset&lt;br /&gt;
    id = read_short()&lt;br /&gt;
    length = read_short()&lt;br /&gt;
    data = buffer[offset:offset + length]&lt;br /&gt;
    offset += length&lt;br /&gt;
    return Definition(id, data)&lt;br /&gt;
&lt;br /&gt;
default_alert = read_definition().as_alert()&lt;br /&gt;
definitions = {(definition := read_definition()).id: definition&lt;br /&gt;
               for _ in range(definition_count)}&lt;br /&gt;
&lt;br /&gt;
for error_id, definition in definitions.items():&lt;br /&gt;
    if len(definition.data) == 10:&lt;br /&gt;
        alert = definition.as_alert()&lt;br /&gt;
        try:&lt;br /&gt;
            print(error_id, &#039;-&#039;, alert.text)&lt;br /&gt;
        except (KeyError, UnicodeDecodeError):&lt;br /&gt;
            pass&lt;br /&gt;
&lt;br /&gt;
print(&#039;Default - &#039;, default_alert.text)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
&lt;br /&gt;
* The System Error Alert Table isn&#039;t just for fatal errors! The text below shows that the Force Quit dialog, among other things, is implemented here.&lt;br /&gt;
* Sometimes, there is no error text, or the text is cut off; this is due to a custom procedure being used for that alert.&lt;br /&gt;
** Post-boot (when &amp;lt;code&amp;gt;DSAT&amp;lt;/code&amp;gt; ID = 2 is loaded), &amp;quot;out of memory&amp;quot;, &amp;quot;unimplemented trap&amp;quot;, and friends are printed by a procedure.&lt;br /&gt;
* Entries in the table are not in order.&lt;br /&gt;
* The &amp;quot;Power PC&amp;quot; and &amp;quot;System 9.2.2&amp;quot; typos are in the original text.&lt;br /&gt;
&lt;br /&gt;
== Contents in different system versions ==&lt;br /&gt;
&lt;br /&gt;
=== System Software 6.0.8 ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+ DSAT ID = 0&lt;br /&gt;
|-&lt;br /&gt;
! Error ID !! Text&lt;br /&gt;
|-&lt;br /&gt;
| 65526 || MacsBug installed.&lt;br /&gt;
|-&lt;br /&gt;
| 65525 ||&lt;br /&gt;
|-&lt;br /&gt;
| 102 || This startup disk will not work on this Macintosh model.  Use the latest Installer to update this disk for this model.  (System 6.0.8 does not work on this model; you need a newer version that does.)&lt;br /&gt;
|-&lt;br /&gt;
| 103 || This Macintosh is set for 32-bit addressing.  You may switch to 24-bit addressing and use this disk or restart and use a newer startup disk.  (System 6.0.8 does not work with 32-bit addressing.)&lt;br /&gt;
|-&lt;br /&gt;
| 101 || Sorry, a system error occurred.&lt;br /&gt;
&lt;br /&gt;
RAM parity&lt;br /&gt;
|-&lt;br /&gt;
| Default || Welcome to Macintosh.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+ DSAT ID = 2&lt;br /&gt;
|-&lt;br /&gt;
! Error ID !! Text&lt;br /&gt;
|-&lt;br /&gt;
| 30 || Please insert the disk:&lt;br /&gt;
|-&lt;br /&gt;
| 28 || Sorry, a system error occurred.&lt;br /&gt;
|-&lt;br /&gt;
| 26 || The following application is busy or damaged:&lt;br /&gt;
|-&lt;br /&gt;
| 42 || You may now switch off your Macintosh safely.&lt;br /&gt;
|-&lt;br /&gt;
| 20000 || If you wish to continue using your Macintosh, press Restart.  If not, press Shut Down.&lt;br /&gt;
|-&lt;br /&gt;
| 20001 || You may now switch off your Macintosh safely. If you wish to continue using your Macintosh, press Restart.&lt;br /&gt;
|-&lt;br /&gt;
| 20002 || Unsaved changes will be lost.&lt;br /&gt;
|-&lt;br /&gt;
| 101 || Sorry, a system error occurred.&lt;br /&gt;
&lt;br /&gt;
RAM parity&lt;br /&gt;
|-&lt;br /&gt;
| Default || Sorry, a system error occurred.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Mac OS 8.6 (PowerBook G3) ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+ {{Resource|DSAT|0}}&lt;br /&gt;
|-&lt;br /&gt;
! Error ID !! Text&lt;br /&gt;
|-&lt;br /&gt;
| 102 || This startup disk will not work on this Macintosh model.  Use the latest Installer to update this disk for this model.&lt;br /&gt;
|-&lt;br /&gt;
| 104 || This disk must be unlocked in order to perform one-time housekeeping.  If you wish to use this disk to start your Macintosh, unlock it.&lt;br /&gt;
|-&lt;br /&gt;
| 116 || This startup disk will not work on this computer. A Power PC based computer is required to startup from this disk.&lt;br /&gt;
|-&lt;br /&gt;
| 118 || The system software on the startup disk only functions on the original media, not if copied to another drive.&lt;br /&gt;
|-&lt;br /&gt;
| 105 || System 8.6 needs more memory to start up.&lt;br /&gt;
|-&lt;br /&gt;
| Default || Sorry, a system error occurred.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+ {{Resource|DSAT|2}}&lt;br /&gt;
|-&lt;br /&gt;
! Error ID !! Text&lt;br /&gt;
|-&lt;br /&gt;
| 28 || Sorry, a system error occurred.&lt;br /&gt;
|-&lt;br /&gt;
| 25 || Not enough memory is available while using&lt;br /&gt;
|-&lt;br /&gt;
| 42 ||&lt;br /&gt;
|-&lt;br /&gt;
| 20000 || If you wish to continue using your Macintosh, press Restart.  If not, press Shut Down.&lt;br /&gt;
|-&lt;br /&gt;
| 20001 || It is now safe to switch off your Macintosh. If you wish to continue using your Macintosh, press Restart.&lt;br /&gt;
|-&lt;br /&gt;
| 20002 || Clicking Force Quit causes you to lose any unsaved changes. To avoid further problems, restart your computer after you click Force Quit.&lt;br /&gt;
|-&lt;br /&gt;
| 99 || The System file on this startup disk may be damaged.  The Installer can be used to repair this disk.&lt;br /&gt;
|-&lt;br /&gt;
| 98 || The System file on this startup device does not contain the resources necessary to boot this Macintosh.  Please use the Installer to update the System file.&lt;br /&gt;
|-&lt;br /&gt;
| 101 || Sorry, a system error occurred.&lt;br /&gt;
&lt;br /&gt;
RAM parity&lt;br /&gt;
|-&lt;br /&gt;
| 20010 || Hard Disk Cable Warning&lt;br /&gt;
&lt;br /&gt;
You must first shutdown the Macintosh before attaching any SCSI hard disk cables.  Disconnect the cable from the back of the machine right now.&lt;br /&gt;
|-&lt;br /&gt;
| 29205 || Please reinsert the PC Card&lt;br /&gt;
&lt;br /&gt;
It is currently in use and must be reinserted immediately to prevent damaging a document, file or the card.&lt;br /&gt;
&lt;br /&gt;
Before ejecting a PC Card, you must close all documents and applications using the PC Card.&lt;br /&gt;
|-&lt;br /&gt;
| 1010 || Code Fragment could not be prepared.&lt;br /&gt;
|-&lt;br /&gt;
| 1011 || Internal Mixed Mode failure.&lt;br /&gt;
|-&lt;br /&gt;
| Default || Sorry, a system error occurred.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Mac OS 9.2.2 ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+ DSAT ID = 0&lt;br /&gt;
|-&lt;br /&gt;
! Error ID !! Text&lt;br /&gt;
|-&lt;br /&gt;
| 102 || This startup disk will not work on this Macintosh model.  Use the latest Installer to update this disk for this model.&lt;br /&gt;
|-&lt;br /&gt;
| 104 || This disk must be unlocked in order to perform one-time housekeeping.  If you wish to use this disk to start your Macintosh, unlock it.&lt;br /&gt;
|-&lt;br /&gt;
| 116 || This startup disk will not work on this computer. A Power PC based computer is required to startup from this disk.&lt;br /&gt;
|-&lt;br /&gt;
| 118 || The system software on the startup disk only functions on the original media, not if copied to another drive.&lt;br /&gt;
|-&lt;br /&gt;
| 105 || System 9.2.2 needs more memory to start up.&lt;br /&gt;
|-&lt;br /&gt;
| Default || Sorry, a system error occurred.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+ DSAT ID = 2&lt;br /&gt;
|-&lt;br /&gt;
! Error ID !! Text&lt;br /&gt;
|-&lt;br /&gt;
| 28 || Sorry, a system error occurred.&lt;br /&gt;
|-&lt;br /&gt;
| 25 || Not enough memory is available while using&lt;br /&gt;
|-&lt;br /&gt;
| 42 ||&lt;br /&gt;
|-&lt;br /&gt;
| 20000 || If you wish to continue using your Macintosh, press Restart.  If not, press Shut Down.&lt;br /&gt;
|-&lt;br /&gt;
| 20001 || It is now safe to switch off your Macintosh. If you wish to continue using your Macintosh, press Restart.&lt;br /&gt;
|-&lt;br /&gt;
| 20002 || Clicking Force Quit causes you to lose any unsaved changes. To avoid further problems, restart your computer after you click Force Quit.&lt;br /&gt;
|-&lt;br /&gt;
| 99 || The System file on this startup disk may be damaged.  The Installer can be used to repair this disk.&lt;br /&gt;
|-&lt;br /&gt;
| 98 || The System file on this startup device does not contain the resources necessary to boot this Macintosh.  Please use the Installer to update the System file.&lt;br /&gt;
|-&lt;br /&gt;
| 101 || Sorry, a system error occurred.&lt;br /&gt;
&lt;br /&gt;
RAM parity&lt;br /&gt;
|-&lt;br /&gt;
| 20010 || Hard Disk Cable Warning&lt;br /&gt;
&lt;br /&gt;
You must first shutdown the Macintosh before attaching any SCSI hard disk cables.  Disconnect the cable from the back of the machine right now.&lt;br /&gt;
|-&lt;br /&gt;
| 1010 || Code Fragment could not be prepared.&lt;br /&gt;
|-&lt;br /&gt;
| 1011 || Internal Mixed Mode failure.&lt;br /&gt;
|-&lt;br /&gt;
| Default || Sorry, a system error occurred.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:Classic Mac OS]]&lt;/div&gt;</summary>
		<author><name>Huntertur</name></author>
	</entry>
	<entry>
		<id>https://computers.huntertur.net/index.php?title=Skink&amp;diff=1086</id>
		<title>Skink</title>
		<link rel="alternate" type="text/html" href="https://computers.huntertur.net/index.php?title=Skink&amp;diff=1086"/>
		<updated>2025-09-27T03:42:21Z</updated>

		<summary type="html">&lt;p&gt;Huntertur: /* History */ Note hinge damage&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{lowercase title}}&lt;br /&gt;
[[Image:skink right angle.png|thumb|right|The PowerBook G3 encourages you to see things from a different angle]]&lt;br /&gt;
The &#039;&#039;&#039;bronze keyboard 400 MHz PowerBook G3&#039;&#039;&#039; is a pretty nice machine. &#039;&#039;It also needs something in the physical battery slot!&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Specs ==&lt;br /&gt;
; Model ID : PowerBook1,1&lt;br /&gt;
; CPU : PowerPC 750 (83.0) @ 400 MHz&lt;br /&gt;
; L2 Cache : 1 MiB&lt;br /&gt;
; Bus Speed : 67 MHz&lt;br /&gt;
; Boot ROM Version : 2.1.0f1&lt;br /&gt;
; Storage : 6.05 GB IBM-DBCA-206480&lt;br /&gt;
; Optical Drive : Matshita DVD-ROM SR-8173&lt;br /&gt;
; GPU : ATI Rage Pro LT (ATY,LT-C)&lt;br /&gt;
; VRAM : 8 MiB&lt;br /&gt;
; Memory : 256 MiB (2x 128 MiB)&lt;br /&gt;
; Ethernet : 100 Mbps&lt;br /&gt;
; Wi-Fi : Not Supported&lt;br /&gt;
&lt;br /&gt;
== Quirks ==&lt;br /&gt;
* When the machine is plugged in, the power light and hard disk will turn on for about two seconds. Maybe some type of self-test?&lt;br /&gt;
* The optical drive is failing. Rotating the machine 90 degrees so that the optical drive door faces the top of the desk seems to be most effective. If the disc still fails to read, shut down the computer and let it sit for a few minutes before trying again.&lt;br /&gt;
* The manual eject for the optical drive doesn&#039;t require a paperclip and sheer force. Instead, there is a small button that can be pressed with the tip of a pen.&lt;br /&gt;
* Open Firmware can&#039;t boot from USB&lt;br /&gt;
&lt;br /&gt;
== History ==&lt;br /&gt;
* 2021-05-22: I acquire the computer from Tuesday. The computer is in great condition other than the missing battery.&lt;br /&gt;
* 2021-05-22: The computer is transported from Tuesday&#039;s apartment to my apartment.&lt;br /&gt;
* 2021-05-23: {{Damage|The eject button disintegrates when I press it.}}&lt;br /&gt;
* 2021-05-23: The remains of the eject button are disposed of.&lt;br /&gt;
* 2021-12-31: {{Upgrade|The RAM is upgraded (192 -&amp;gt; 256).}} I allegedly put in two 256 MiB sticks but it&#039;s possible I was lied to.&lt;br /&gt;
* 2021-12-31: The clock battery is removed.&lt;br /&gt;
* 2023-06-20: The computer is temporarily transported back to my parents&#039; place.&lt;br /&gt;
* 2023-09-18: The computer is transported to the new home.&lt;br /&gt;
* 2025-09-26: {{Damage|The hinge gives out, and now there is only a ~45° range that the screen can safely be angled at.}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Computers]]&lt;br /&gt;
[[Category:PowerPC Macs]]&lt;/div&gt;</summary>
		<author><name>Huntertur</name></author>
	</entry>
	<entry>
		<id>https://computers.huntertur.net/index.php?title=Classic_Mac_OS_debugging_output&amp;diff=1085</id>
		<title>Classic Mac OS debugging output</title>
		<link rel="alternate" type="text/html" href="https://computers.huntertur.net/index.php?title=Classic_Mac_OS_debugging_output&amp;diff=1085"/>
		<updated>2025-09-26T07:14:07Z</updated>

		<summary type="html">&lt;p&gt;Huntertur: /* Bitflags */ Note Mac OS 8.6&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;You can make the Classic Mac OS dump a bunch of debugging output during boot.&lt;br /&gt;
&lt;br /&gt;
== Instructions ==&lt;br /&gt;
&lt;br /&gt;
# Boot into Open Firmware (Command-Option-O-F).&lt;br /&gt;
# Since log output is massive, consider logging over the network instead of to the screen:&lt;br /&gt;
## Run &amp;lt;code&amp;gt;dev /packages/telnet&amp;lt;/code&amp;gt;.&lt;br /&gt;
## Run &amp;lt;code&amp;gt;&amp;quot; enet:telnet,192.168.18.10&amp;quot; io&amp;lt;/code&amp;gt;, substituting the IP address as necessary.&lt;br /&gt;
##* On-screen text input and output will end.&lt;br /&gt;
## On another computer, telnet into that IP address.&lt;br /&gt;
##* The screen will blank itself until booting begins.&lt;br /&gt;
# Use the [[#Bitflags]] table to choose a debugging configuration.&lt;br /&gt;
# Run &amp;lt;code&amp;gt;dev / 3013FFF encode-int &amp;quot; AAPL,debug&amp;quot; property&amp;lt;/code&amp;gt;, substituting the hexadecimal number as necessary.&lt;br /&gt;
# Run &amp;lt;code&amp;gt;mac-boot&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Telnet output will end before the Happy Mac even appears. When this happens, the following is printed to the screen: &amp;lt;code&amp;gt;Off to MacOS. The next (and last) call into OpenFirmware is quiesce().&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After telnet output ends, a separate NanoKernel Log will appear on screen, get covered by the Welcome to Mac OS dialog, then appear a second time before disappearing entirely with the &amp;quot;Starting up...&amp;quot; text.&lt;br /&gt;
&lt;br /&gt;
== Bitflags ==&lt;br /&gt;
From the beginning of the debugging output, but formatted as a proper table:&lt;br /&gt;
{| class=&amp;quot;wikitable&lt;br /&gt;
|+ AAPL,debug bit settings (-OR- bits together):&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: right;&amp;quot; |        1 || * || = Print general informative messages.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: right;&amp;quot; |        2 || * || = Print formatted Mac OS tables (except config/universal info).&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: right;&amp;quot; |        4 || * || = Print formatted config info table.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: right;&amp;quot; |        8 || * || = Dump Mac OS tables (except config/universal info).&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: right;&amp;quot; |       10 || * || = Print node names while copying the device tree.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: right;&amp;quot; |       20 || * || = Print property info while copying the device tree.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: right;&amp;quot; |       40 || * || = Print interrupt-related info.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: right;&amp;quot; |       80 || * || = Print interrupt tree traversal info.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: right;&amp;quot; |      100 || * || = Print address resolution info.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: right;&amp;quot; |      200 || * || = Print NV-RAM info.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: right;&amp;quot; |      400 || * || = Print Mac OS &amp;quot;universal&amp;quot; info.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: right;&amp;quot; |      800 || * || = Print &amp;quot;special&amp;quot; node info.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: right;&amp;quot; |     1000 || * || = Load EtherPrintf utility via parcel for post FCode debugging.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: right;&amp;quot; |     2000 || * || = Print BOOTP/DHCP/BSDP information.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: right;&amp;quot; |     4000 ||   || = Allocate writable ROM aperture.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: right;&amp;quot; |     8000 ||   || = Mark Toolbox image as non-cacheable.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: right;&amp;quot; |    10000 || * || = Print parcel info while copying the device tree.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: right;&amp;quot; |    20000 ||   || = Print information on device tree data checksums.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: right;&amp;quot; |  1000000 || * || = Enable the Nanokernel debugger.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: right;&amp;quot; |  2000000 || * || = Display the Nanokernel log during boot.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: right;&amp;quot; | 10000000 ||   || = Dont attempt to unhibernate system.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: right;&amp;quot; | 40000000 ||   || = Halt after end of FCode (useful if outputting to screen).&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Adding all the bitflags together that enable logging (anything with an asterisk) gives 3013FFF.&lt;br /&gt;
&lt;br /&gt;
0x2000, and all options from 0x8000 onwards, do not exist in Mac OS 8.6. 0x1000 is labeled &amp;quot;Enable debugging output AFTER Open Firmware is gone.&amp;quot; but it does not seem to do anything there.&lt;br /&gt;
&lt;br /&gt;
== NanoKernel Log sample ==&lt;br /&gt;
&lt;br /&gt;
Manually transcribed from a video I took of Mac OS 9.2.2 on [[crocodile]]:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
First initialization&lt;br /&gt;
&amp;lt;pre class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
              NanoKernel Log&lt;br /&gt;
              --------------&lt;br /&gt;
Hello from the builtin multitasking NanoKernel. Version: 0228&lt;br /&gt;
Kernel code base at 0x00f10000  Physical RAM size 0x17ffc000 bytes&lt;br /&gt;
Created motherboard coherence group. ID 00010001&lt;br /&gt;
NKCreateAddressSpaceSub - group at 0x177fc1c0 00010001&lt;br /&gt;
Created system address space. ID 00030001&lt;br /&gt;
 BATs ffc0007f 00c00043   6800001f 00f00043   00000000 00000000   00000000 00000000&lt;br /&gt;
Init ready queue 00000000 00000000 00004329&lt;br /&gt;
Init ready queue 00000001 00000000 00021948&lt;br /&gt;
Init ready queue 00000002 00000000 0010ca40&lt;br /&gt;
Init ready queue 00000003 00000000 00865200&lt;br /&gt;
System context at 0x177ff100  Vector save area at 0x00008000  SDR1 0x1780003f&lt;br /&gt;
Adding blue task 00050001 to the ready queue&lt;br /&gt;
Starting timeslicing&lt;br /&gt;
Adding idle task 00070001 to the ready queue&lt;br /&gt;
NKCreateAddressSpaceSub - group at 0x177fc1c0 00010001&lt;br /&gt;
Priming the system free list with 65 pages.&lt;br /&gt;
VMMaxVirtualPages: 0005fffe VMLogicalPages: 00000000&lt;br /&gt;
Interrupt handler kind: 0a&lt;br /&gt;
Converting PMDTs to areas&lt;br /&gt;
 CreateArea [ 00000000 177f4fff ] ID 000a0001 placed ... created&lt;br /&gt;
 CreateArea [ 5fffe000 5fffefff ] ID 000b0001 placed ... created&lt;br /&gt;
 CreateArea [ 64000000 6417ffff ] ID 000c0001 placed ... created&lt;br /&gt;
 CreateArea [ 68fef000 68feffff ] ID 000d0001 placed ... created&lt;br /&gt;
 CreateArea [ 68ff5000 68ffefff ] ID 000e0001 placed ... created&lt;br /&gt;
 CreateArea [ 68fff000 68ffffff ] ID 000f0001 placed ... created&lt;br /&gt;
 CreateArea [ 80800000 80800fff ] ID 00100001 placed ... created&lt;br /&gt;
 CreateArea [ 80801000 8087ffff ] ID 00110001 placed ... created&lt;br /&gt;
 CreateArea [ 80880000 80880fff ] ID 00120001 placed ... created&lt;br /&gt;
 CreateArea [ 80881000 80881fff ] ID 00130001 placed ... created&lt;br /&gt;
 CreateArea [ 81000000 81ffffff ] ID 00140001 placed ... created&lt;br /&gt;
 CreateArea [ f0000000 ffffffff ] ID 00150001 placed ... created&lt;br /&gt;
 CreateArea [ 68f16000 68f16fff ] ID 00160001 placed ... created&lt;br /&gt;
 CreateArea [ deadb000 deadbfff ] ID 00170001 placed ... created&lt;br /&gt;
Reset system - Into the 68K fire: 0000d032 6806e8c0&lt;br /&gt;
ResetSystem trap entered&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
After re-initialization&lt;br /&gt;
&amp;lt;pre class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
Kernel code base at 0x00f10000  Physical RAM size 0x17ffc000 bytes&lt;br /&gt;
Created motherboard coherence group. ID 00010001&lt;br /&gt;
NKCreateAddressSpaceSub - group at 0x177fc1c0 00010001&lt;br /&gt;
Created system address space. ID 00030001&lt;br /&gt;
 BATs ffc0007f 00c00043   6800001f 00f00043   00000000 00000000   00000000 00000000&lt;br /&gt;
Init ready queue 00000000 00000000 00004329&lt;br /&gt;
Init ready queue 00000001 00000000 00021948&lt;br /&gt;
Init ready queue 00000002 00000000 0010ca40&lt;br /&gt;
Init ready queue 00000003 00000000 00865200&lt;br /&gt;
System context at 0x177ff100  Vector save area at 0x00008000  SDR1 0x1780003f&lt;br /&gt;
Adding blue task 00050001 to the ready queue&lt;br /&gt;
Starting timeslicing&lt;br /&gt;
Adding idle task 00070001 to the ready queue&lt;br /&gt;
NKCreateAddressSpaceSub - group at 0x177fc1c0 00010001&lt;br /&gt;
Priming the system free list with 65 pages.&lt;br /&gt;
VMMaxVirtualPages: 0005fffe VMLogicalPages: 000177f5&lt;br /&gt;
Interrupt handler kind: 0a&lt;br /&gt;
Converting PMDTs to areas&lt;br /&gt;
 CreateArea [ 00000000 177f4fff ] ID 000a0001 placed ... created&lt;br /&gt;
 CreateArea [ 5fffe000 5fffefff ] ID 000b0001 placed ... created&lt;br /&gt;
 CreateArea [ 64000000 6417ffff ] ID 000c0001 placed ... created&lt;br /&gt;
 CreateArea [ 68fef000 68feffff ] ID 000d0001 placed ... created&lt;br /&gt;
 CreateArea [ 68ff5000 68ffefff ] ID 000e0001 placed ... created&lt;br /&gt;
 CreateArea [ 68fff000 68ffffff ] ID 000f0001 placed ... created&lt;br /&gt;
 CreateArea [ 80800000 80800fff ] ID 00100001 placed ... created&lt;br /&gt;
 CreateArea [ 80801000 8087ffff ] ID 00110001 placed ... created&lt;br /&gt;
 CreateArea [ 80880000 80880fff ] ID 00120001 placed ... created&lt;br /&gt;
 CreateArea [ 80881000 80881fff ] ID 00130001 placed ... created&lt;br /&gt;
 CreateArea [ 81000000 81ffffff ] ID 00140001 placed ... created&lt;br /&gt;
 CreateArea [ f0000000 ffffffff ] ID 00150001 placed ... created&lt;br /&gt;
 CreateArea [ 68f16000 68f16fff ] ID 00160001 placed ... created&lt;br /&gt;
 CreateArea [ deadb000 deadbfff ] ID 00170001 placed ... created&lt;br /&gt;
Reset system - Into the 68K fire: 0002d032 6806c9e8&lt;br /&gt;
 VMAllocateMemory - creating area at 0x69000000 00080000&lt;br /&gt;
 CreateArea [ 69000000 6907ffff ] ID 00180001 placed ... created&lt;br /&gt;
VMMakePageCacheable for I/O 00080881&lt;br /&gt;
CPU plugin registered&lt;br /&gt;
Extend free pool: 0x17fce000  virt 0x00000000  count: 1&lt;br /&gt;
Extend free pool: 0x17fcd000  virt 0x00000000  count: 2&lt;br /&gt;
Extend free pool: 0x17fcc000  virt 0x00000000  count: 3&lt;br /&gt;
Extend free pool: 0x17fcb000  virt 0x00000000  count: 4&lt;br /&gt;
Extend free pool: 0x17fca000  virt 0x00000000  count: 5&lt;br /&gt;
Extend free pool: 0x17fc9000  virt 0x00000000  count: 6&lt;br /&gt;
Extend free pool: 0x17fc8000  virt 0x00000000  count: 7&lt;br /&gt;
Extend free pool: 0x17fc7000  virt 0x00000000  count: 8&lt;br /&gt;
Legacy VMInit 0003ff00 003e4000&lt;br /&gt;
Adjusting area 000a0001 to size 3ff00000&lt;br /&gt;
Extend free pool: 0x17fc6000  virt 0x00000000  count: 9&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
* This does not work on a tray-loading iMac G3 because &amp;lt;code&amp;gt;/packages/telnet&amp;lt;/code&amp;gt; does not exist.&lt;br /&gt;
* The NanoKernel Log suggests that it initializes itself once without on-disk virtual memory support then immediately re-initializes itself with it enabled.&lt;br /&gt;
* It calls &amp;lt;code&amp;gt;CreateArea&amp;lt;/code&amp;gt; for the 4096-byte page containing &amp;lt;code&amp;gt;deadbeef&amp;lt;/code&amp;gt;, possibly so it is always a valid address? It shows up in [[PowerMacInfo]] for some preemptive tasks.&lt;br /&gt;
* From the NanoKernel Log, VMMaxVirtualPages (0x0005fffe) * 4096 = 1,610,604,544 (1,536 MiB - 8 KiB). Could this be the source of the max memory limit in the classic Mac OS?&lt;br /&gt;
&lt;br /&gt;
[[Category:Guides]]&lt;br /&gt;
[[Category:Open Firmware]]&lt;br /&gt;
[[Category:PowerPC Macs]]&lt;br /&gt;
[[Category:Classic Mac OS]]&lt;/div&gt;</summary>
		<author><name>Huntertur</name></author>
	</entry>
	<entry>
		<id>https://computers.huntertur.net/index.php?title=Classic_Mac_OS_debugging_output&amp;diff=1084</id>
		<title>Classic Mac OS debugging output</title>
		<link rel="alternate" type="text/html" href="https://computers.huntertur.net/index.php?title=Classic_Mac_OS_debugging_output&amp;diff=1084"/>
		<updated>2025-09-26T06:29:36Z</updated>

		<summary type="html">&lt;p&gt;Huntertur: /* Notes */ Be more specific&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;You can make the Classic Mac OS dump a bunch of debugging output during boot.&lt;br /&gt;
&lt;br /&gt;
== Instructions ==&lt;br /&gt;
&lt;br /&gt;
# Boot into Open Firmware (Command-Option-O-F).&lt;br /&gt;
# Since log output is massive, consider logging over the network instead of to the screen:&lt;br /&gt;
## Run &amp;lt;code&amp;gt;dev /packages/telnet&amp;lt;/code&amp;gt;.&lt;br /&gt;
## Run &amp;lt;code&amp;gt;&amp;quot; enet:telnet,192.168.18.10&amp;quot; io&amp;lt;/code&amp;gt;, substituting the IP address as necessary.&lt;br /&gt;
##* On-screen text input and output will end.&lt;br /&gt;
## On another computer, telnet into that IP address.&lt;br /&gt;
##* The screen will blank itself until booting begins.&lt;br /&gt;
# Use the [[#Bitflags]] table to choose a debugging configuration.&lt;br /&gt;
# Run &amp;lt;code&amp;gt;dev / 3013FFF encode-int &amp;quot; AAPL,debug&amp;quot; property&amp;lt;/code&amp;gt;, substituting the hexadecimal number as necessary.&lt;br /&gt;
# Run &amp;lt;code&amp;gt;mac-boot&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Telnet output will end before the Happy Mac even appears. When this happens, the following is printed to the screen: &amp;lt;code&amp;gt;Off to MacOS. The next (and last) call into OpenFirmware is quiesce().&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After telnet output ends, a separate NanoKernel Log will appear on screen, get covered by the Welcome to Mac OS dialog, then appear a second time before disappearing entirely with the &amp;quot;Starting up...&amp;quot; text.&lt;br /&gt;
&lt;br /&gt;
== Bitflags ==&lt;br /&gt;
From the beginning of the debugging output, but formatted as a proper table:&lt;br /&gt;
{| class=&amp;quot;wikitable&lt;br /&gt;
|+ AAPL,debug bit settings (-OR- bits together):&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: right;&amp;quot; |        1 || * || = Print general informative messages.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: right;&amp;quot; |        2 || * || = Print formatted Mac OS tables (except config/universal info).&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: right;&amp;quot; |        4 || * || = Print formatted config info table.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: right;&amp;quot; |        8 || * || = Dump Mac OS tables (except config/universal info).&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: right;&amp;quot; |       10 || * || = Print node names while copying the device tree.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: right;&amp;quot; |       20 || * || = Print property info while copying the device tree.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: right;&amp;quot; |       40 || * || = Print interrupt-related info.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: right;&amp;quot; |       80 || * || = Print interrupt tree traversal info.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: right;&amp;quot; |      100 || * || = Print address resolution info.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: right;&amp;quot; |      200 || * || = Print NV-RAM info.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: right;&amp;quot; |      400 || * || = Print Mac OS &amp;quot;universal&amp;quot; info.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: right;&amp;quot; |      800 || * || = Print &amp;quot;special&amp;quot; node info.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: right;&amp;quot; |     1000 || * || = Load EtherPrintf utility via parcel for post FCode debugging.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: right;&amp;quot; |     2000 || * || = Print BOOTP/DHCP/BSDP information.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: right;&amp;quot; |     4000 ||   || = Allocate writable ROM aperture.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: right;&amp;quot; |     8000 ||   || = Mark Toolbox image as non-cacheable.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: right;&amp;quot; |    10000 || * || = Print parcel info while copying the device tree.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: right;&amp;quot; |    20000 ||   || = Print information on device tree data checksums.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: right;&amp;quot; |  1000000 || * || = Enable the Nanokernel debugger.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: right;&amp;quot; |  2000000 || * || = Display the Nanokernel log during boot.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: right;&amp;quot; | 10000000 ||   || = Dont attempt to unhibernate system.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: right;&amp;quot; | 40000000 ||   || = Halt after end of FCode (useful if outputting to screen).&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Adding all the bitflags together that enable logging (anything with an asterisk) gives 3013FFF.&lt;br /&gt;
&lt;br /&gt;
== NanoKernel Log sample ==&lt;br /&gt;
&lt;br /&gt;
Manually transcribed from a video I took of Mac OS 9.2.2 on [[crocodile]]:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
First initialization&lt;br /&gt;
&amp;lt;pre class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
              NanoKernel Log&lt;br /&gt;
              --------------&lt;br /&gt;
Hello from the builtin multitasking NanoKernel. Version: 0228&lt;br /&gt;
Kernel code base at 0x00f10000  Physical RAM size 0x17ffc000 bytes&lt;br /&gt;
Created motherboard coherence group. ID 00010001&lt;br /&gt;
NKCreateAddressSpaceSub - group at 0x177fc1c0 00010001&lt;br /&gt;
Created system address space. ID 00030001&lt;br /&gt;
 BATs ffc0007f 00c00043   6800001f 00f00043   00000000 00000000   00000000 00000000&lt;br /&gt;
Init ready queue 00000000 00000000 00004329&lt;br /&gt;
Init ready queue 00000001 00000000 00021948&lt;br /&gt;
Init ready queue 00000002 00000000 0010ca40&lt;br /&gt;
Init ready queue 00000003 00000000 00865200&lt;br /&gt;
System context at 0x177ff100  Vector save area at 0x00008000  SDR1 0x1780003f&lt;br /&gt;
Adding blue task 00050001 to the ready queue&lt;br /&gt;
Starting timeslicing&lt;br /&gt;
Adding idle task 00070001 to the ready queue&lt;br /&gt;
NKCreateAddressSpaceSub - group at 0x177fc1c0 00010001&lt;br /&gt;
Priming the system free list with 65 pages.&lt;br /&gt;
VMMaxVirtualPages: 0005fffe VMLogicalPages: 00000000&lt;br /&gt;
Interrupt handler kind: 0a&lt;br /&gt;
Converting PMDTs to areas&lt;br /&gt;
 CreateArea [ 00000000 177f4fff ] ID 000a0001 placed ... created&lt;br /&gt;
 CreateArea [ 5fffe000 5fffefff ] ID 000b0001 placed ... created&lt;br /&gt;
 CreateArea [ 64000000 6417ffff ] ID 000c0001 placed ... created&lt;br /&gt;
 CreateArea [ 68fef000 68feffff ] ID 000d0001 placed ... created&lt;br /&gt;
 CreateArea [ 68ff5000 68ffefff ] ID 000e0001 placed ... created&lt;br /&gt;
 CreateArea [ 68fff000 68ffffff ] ID 000f0001 placed ... created&lt;br /&gt;
 CreateArea [ 80800000 80800fff ] ID 00100001 placed ... created&lt;br /&gt;
 CreateArea [ 80801000 8087ffff ] ID 00110001 placed ... created&lt;br /&gt;
 CreateArea [ 80880000 80880fff ] ID 00120001 placed ... created&lt;br /&gt;
 CreateArea [ 80881000 80881fff ] ID 00130001 placed ... created&lt;br /&gt;
 CreateArea [ 81000000 81ffffff ] ID 00140001 placed ... created&lt;br /&gt;
 CreateArea [ f0000000 ffffffff ] ID 00150001 placed ... created&lt;br /&gt;
 CreateArea [ 68f16000 68f16fff ] ID 00160001 placed ... created&lt;br /&gt;
 CreateArea [ deadb000 deadbfff ] ID 00170001 placed ... created&lt;br /&gt;
Reset system - Into the 68K fire: 0000d032 6806e8c0&lt;br /&gt;
ResetSystem trap entered&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
After re-initialization&lt;br /&gt;
&amp;lt;pre class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
Kernel code base at 0x00f10000  Physical RAM size 0x17ffc000 bytes&lt;br /&gt;
Created motherboard coherence group. ID 00010001&lt;br /&gt;
NKCreateAddressSpaceSub - group at 0x177fc1c0 00010001&lt;br /&gt;
Created system address space. ID 00030001&lt;br /&gt;
 BATs ffc0007f 00c00043   6800001f 00f00043   00000000 00000000   00000000 00000000&lt;br /&gt;
Init ready queue 00000000 00000000 00004329&lt;br /&gt;
Init ready queue 00000001 00000000 00021948&lt;br /&gt;
Init ready queue 00000002 00000000 0010ca40&lt;br /&gt;
Init ready queue 00000003 00000000 00865200&lt;br /&gt;
System context at 0x177ff100  Vector save area at 0x00008000  SDR1 0x1780003f&lt;br /&gt;
Adding blue task 00050001 to the ready queue&lt;br /&gt;
Starting timeslicing&lt;br /&gt;
Adding idle task 00070001 to the ready queue&lt;br /&gt;
NKCreateAddressSpaceSub - group at 0x177fc1c0 00010001&lt;br /&gt;
Priming the system free list with 65 pages.&lt;br /&gt;
VMMaxVirtualPages: 0005fffe VMLogicalPages: 000177f5&lt;br /&gt;
Interrupt handler kind: 0a&lt;br /&gt;
Converting PMDTs to areas&lt;br /&gt;
 CreateArea [ 00000000 177f4fff ] ID 000a0001 placed ... created&lt;br /&gt;
 CreateArea [ 5fffe000 5fffefff ] ID 000b0001 placed ... created&lt;br /&gt;
 CreateArea [ 64000000 6417ffff ] ID 000c0001 placed ... created&lt;br /&gt;
 CreateArea [ 68fef000 68feffff ] ID 000d0001 placed ... created&lt;br /&gt;
 CreateArea [ 68ff5000 68ffefff ] ID 000e0001 placed ... created&lt;br /&gt;
 CreateArea [ 68fff000 68ffffff ] ID 000f0001 placed ... created&lt;br /&gt;
 CreateArea [ 80800000 80800fff ] ID 00100001 placed ... created&lt;br /&gt;
 CreateArea [ 80801000 8087ffff ] ID 00110001 placed ... created&lt;br /&gt;
 CreateArea [ 80880000 80880fff ] ID 00120001 placed ... created&lt;br /&gt;
 CreateArea [ 80881000 80881fff ] ID 00130001 placed ... created&lt;br /&gt;
 CreateArea [ 81000000 81ffffff ] ID 00140001 placed ... created&lt;br /&gt;
 CreateArea [ f0000000 ffffffff ] ID 00150001 placed ... created&lt;br /&gt;
 CreateArea [ 68f16000 68f16fff ] ID 00160001 placed ... created&lt;br /&gt;
 CreateArea [ deadb000 deadbfff ] ID 00170001 placed ... created&lt;br /&gt;
Reset system - Into the 68K fire: 0002d032 6806c9e8&lt;br /&gt;
 VMAllocateMemory - creating area at 0x69000000 00080000&lt;br /&gt;
 CreateArea [ 69000000 6907ffff ] ID 00180001 placed ... created&lt;br /&gt;
VMMakePageCacheable for I/O 00080881&lt;br /&gt;
CPU plugin registered&lt;br /&gt;
Extend free pool: 0x17fce000  virt 0x00000000  count: 1&lt;br /&gt;
Extend free pool: 0x17fcd000  virt 0x00000000  count: 2&lt;br /&gt;
Extend free pool: 0x17fcc000  virt 0x00000000  count: 3&lt;br /&gt;
Extend free pool: 0x17fcb000  virt 0x00000000  count: 4&lt;br /&gt;
Extend free pool: 0x17fca000  virt 0x00000000  count: 5&lt;br /&gt;
Extend free pool: 0x17fc9000  virt 0x00000000  count: 6&lt;br /&gt;
Extend free pool: 0x17fc8000  virt 0x00000000  count: 7&lt;br /&gt;
Extend free pool: 0x17fc7000  virt 0x00000000  count: 8&lt;br /&gt;
Legacy VMInit 0003ff00 003e4000&lt;br /&gt;
Adjusting area 000a0001 to size 3ff00000&lt;br /&gt;
Extend free pool: 0x17fc6000  virt 0x00000000  count: 9&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
* This does not work on a tray-loading iMac G3 because &amp;lt;code&amp;gt;/packages/telnet&amp;lt;/code&amp;gt; does not exist.&lt;br /&gt;
* The NanoKernel Log suggests that it initializes itself once without on-disk virtual memory support then immediately re-initializes itself with it enabled.&lt;br /&gt;
* It calls &amp;lt;code&amp;gt;CreateArea&amp;lt;/code&amp;gt; for the 4096-byte page containing &amp;lt;code&amp;gt;deadbeef&amp;lt;/code&amp;gt;, possibly so it is always a valid address? It shows up in [[PowerMacInfo]] for some preemptive tasks.&lt;br /&gt;
* From the NanoKernel Log, VMMaxVirtualPages (0x0005fffe) * 4096 = 1,610,604,544 (1,536 MiB - 8 KiB). Could this be the source of the max memory limit in the classic Mac OS?&lt;br /&gt;
&lt;br /&gt;
[[Category:Guides]]&lt;br /&gt;
[[Category:Open Firmware]]&lt;br /&gt;
[[Category:PowerPC Macs]]&lt;br /&gt;
[[Category:Classic Mac OS]]&lt;/div&gt;</summary>
		<author><name>Huntertur</name></author>
	</entry>
	<entry>
		<id>https://computers.huntertur.net/index.php?title=Classic_Mac_OS_debugging_output&amp;diff=1083</id>
		<title>Classic Mac OS debugging output</title>
		<link rel="alternate" type="text/html" href="https://computers.huntertur.net/index.php?title=Classic_Mac_OS_debugging_output&amp;diff=1083"/>
		<updated>2025-09-26T06:27:14Z</updated>

		<summary type="html">&lt;p&gt;Huntertur: /* Bitflags */ Reformat as table&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;You can make the Classic Mac OS dump a bunch of debugging output during boot.&lt;br /&gt;
&lt;br /&gt;
== Instructions ==&lt;br /&gt;
&lt;br /&gt;
# Boot into Open Firmware (Command-Option-O-F).&lt;br /&gt;
# Since log output is massive, consider logging over the network instead of to the screen:&lt;br /&gt;
## Run &amp;lt;code&amp;gt;dev /packages/telnet&amp;lt;/code&amp;gt;.&lt;br /&gt;
## Run &amp;lt;code&amp;gt;&amp;quot; enet:telnet,192.168.18.10&amp;quot; io&amp;lt;/code&amp;gt;, substituting the IP address as necessary.&lt;br /&gt;
##* On-screen text input and output will end.&lt;br /&gt;
## On another computer, telnet into that IP address.&lt;br /&gt;
##* The screen will blank itself until booting begins.&lt;br /&gt;
# Use the [[#Bitflags]] table to choose a debugging configuration.&lt;br /&gt;
# Run &amp;lt;code&amp;gt;dev / 3013FFF encode-int &amp;quot; AAPL,debug&amp;quot; property&amp;lt;/code&amp;gt;, substituting the hexadecimal number as necessary.&lt;br /&gt;
# Run &amp;lt;code&amp;gt;mac-boot&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Telnet output will end before the Happy Mac even appears. When this happens, the following is printed to the screen: &amp;lt;code&amp;gt;Off to MacOS. The next (and last) call into OpenFirmware is quiesce().&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After telnet output ends, a separate NanoKernel Log will appear on screen, get covered by the Welcome to Mac OS dialog, then appear a second time before disappearing entirely with the &amp;quot;Starting up...&amp;quot; text.&lt;br /&gt;
&lt;br /&gt;
== Bitflags ==&lt;br /&gt;
From the beginning of the debugging output, but formatted as a proper table:&lt;br /&gt;
{| class=&amp;quot;wikitable&lt;br /&gt;
|+ AAPL,debug bit settings (-OR- bits together):&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: right;&amp;quot; |        1 || * || = Print general informative messages.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: right;&amp;quot; |        2 || * || = Print formatted Mac OS tables (except config/universal info).&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: right;&amp;quot; |        4 || * || = Print formatted config info table.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: right;&amp;quot; |        8 || * || = Dump Mac OS tables (except config/universal info).&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: right;&amp;quot; |       10 || * || = Print node names while copying the device tree.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: right;&amp;quot; |       20 || * || = Print property info while copying the device tree.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: right;&amp;quot; |       40 || * || = Print interrupt-related info.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: right;&amp;quot; |       80 || * || = Print interrupt tree traversal info.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: right;&amp;quot; |      100 || * || = Print address resolution info.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: right;&amp;quot; |      200 || * || = Print NV-RAM info.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: right;&amp;quot; |      400 || * || = Print Mac OS &amp;quot;universal&amp;quot; info.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: right;&amp;quot; |      800 || * || = Print &amp;quot;special&amp;quot; node info.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: right;&amp;quot; |     1000 || * || = Load EtherPrintf utility via parcel for post FCode debugging.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: right;&amp;quot; |     2000 || * || = Print BOOTP/DHCP/BSDP information.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: right;&amp;quot; |     4000 ||   || = Allocate writable ROM aperture.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: right;&amp;quot; |     8000 ||   || = Mark Toolbox image as non-cacheable.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: right;&amp;quot; |    10000 || * || = Print parcel info while copying the device tree.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: right;&amp;quot; |    20000 ||   || = Print information on device tree data checksums.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: right;&amp;quot; |  1000000 || * || = Enable the Nanokernel debugger.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: right;&amp;quot; |  2000000 || * || = Display the Nanokernel log during boot.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: right;&amp;quot; | 10000000 ||   || = Dont attempt to unhibernate system.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: right;&amp;quot; | 40000000 ||   || = Halt after end of FCode (useful if outputting to screen).&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Adding all the bitflags together that enable logging (anything with an asterisk) gives 3013FFF.&lt;br /&gt;
&lt;br /&gt;
== NanoKernel Log sample ==&lt;br /&gt;
&lt;br /&gt;
Manually transcribed from a video I took of Mac OS 9.2.2 on [[crocodile]]:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
First initialization&lt;br /&gt;
&amp;lt;pre class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
              NanoKernel Log&lt;br /&gt;
              --------------&lt;br /&gt;
Hello from the builtin multitasking NanoKernel. Version: 0228&lt;br /&gt;
Kernel code base at 0x00f10000  Physical RAM size 0x17ffc000 bytes&lt;br /&gt;
Created motherboard coherence group. ID 00010001&lt;br /&gt;
NKCreateAddressSpaceSub - group at 0x177fc1c0 00010001&lt;br /&gt;
Created system address space. ID 00030001&lt;br /&gt;
 BATs ffc0007f 00c00043   6800001f 00f00043   00000000 00000000   00000000 00000000&lt;br /&gt;
Init ready queue 00000000 00000000 00004329&lt;br /&gt;
Init ready queue 00000001 00000000 00021948&lt;br /&gt;
Init ready queue 00000002 00000000 0010ca40&lt;br /&gt;
Init ready queue 00000003 00000000 00865200&lt;br /&gt;
System context at 0x177ff100  Vector save area at 0x00008000  SDR1 0x1780003f&lt;br /&gt;
Adding blue task 00050001 to the ready queue&lt;br /&gt;
Starting timeslicing&lt;br /&gt;
Adding idle task 00070001 to the ready queue&lt;br /&gt;
NKCreateAddressSpaceSub - group at 0x177fc1c0 00010001&lt;br /&gt;
Priming the system free list with 65 pages.&lt;br /&gt;
VMMaxVirtualPages: 0005fffe VMLogicalPages: 00000000&lt;br /&gt;
Interrupt handler kind: 0a&lt;br /&gt;
Converting PMDTs to areas&lt;br /&gt;
 CreateArea [ 00000000 177f4fff ] ID 000a0001 placed ... created&lt;br /&gt;
 CreateArea [ 5fffe000 5fffefff ] ID 000b0001 placed ... created&lt;br /&gt;
 CreateArea [ 64000000 6417ffff ] ID 000c0001 placed ... created&lt;br /&gt;
 CreateArea [ 68fef000 68feffff ] ID 000d0001 placed ... created&lt;br /&gt;
 CreateArea [ 68ff5000 68ffefff ] ID 000e0001 placed ... created&lt;br /&gt;
 CreateArea [ 68fff000 68ffffff ] ID 000f0001 placed ... created&lt;br /&gt;
 CreateArea [ 80800000 80800fff ] ID 00100001 placed ... created&lt;br /&gt;
 CreateArea [ 80801000 8087ffff ] ID 00110001 placed ... created&lt;br /&gt;
 CreateArea [ 80880000 80880fff ] ID 00120001 placed ... created&lt;br /&gt;
 CreateArea [ 80881000 80881fff ] ID 00130001 placed ... created&lt;br /&gt;
 CreateArea [ 81000000 81ffffff ] ID 00140001 placed ... created&lt;br /&gt;
 CreateArea [ f0000000 ffffffff ] ID 00150001 placed ... created&lt;br /&gt;
 CreateArea [ 68f16000 68f16fff ] ID 00160001 placed ... created&lt;br /&gt;
 CreateArea [ deadb000 deadbfff ] ID 00170001 placed ... created&lt;br /&gt;
Reset system - Into the 68K fire: 0000d032 6806e8c0&lt;br /&gt;
ResetSystem trap entered&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
After re-initialization&lt;br /&gt;
&amp;lt;pre class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
Kernel code base at 0x00f10000  Physical RAM size 0x17ffc000 bytes&lt;br /&gt;
Created motherboard coherence group. ID 00010001&lt;br /&gt;
NKCreateAddressSpaceSub - group at 0x177fc1c0 00010001&lt;br /&gt;
Created system address space. ID 00030001&lt;br /&gt;
 BATs ffc0007f 00c00043   6800001f 00f00043   00000000 00000000   00000000 00000000&lt;br /&gt;
Init ready queue 00000000 00000000 00004329&lt;br /&gt;
Init ready queue 00000001 00000000 00021948&lt;br /&gt;
Init ready queue 00000002 00000000 0010ca40&lt;br /&gt;
Init ready queue 00000003 00000000 00865200&lt;br /&gt;
System context at 0x177ff100  Vector save area at 0x00008000  SDR1 0x1780003f&lt;br /&gt;
Adding blue task 00050001 to the ready queue&lt;br /&gt;
Starting timeslicing&lt;br /&gt;
Adding idle task 00070001 to the ready queue&lt;br /&gt;
NKCreateAddressSpaceSub - group at 0x177fc1c0 00010001&lt;br /&gt;
Priming the system free list with 65 pages.&lt;br /&gt;
VMMaxVirtualPages: 0005fffe VMLogicalPages: 000177f5&lt;br /&gt;
Interrupt handler kind: 0a&lt;br /&gt;
Converting PMDTs to areas&lt;br /&gt;
 CreateArea [ 00000000 177f4fff ] ID 000a0001 placed ... created&lt;br /&gt;
 CreateArea [ 5fffe000 5fffefff ] ID 000b0001 placed ... created&lt;br /&gt;
 CreateArea [ 64000000 6417ffff ] ID 000c0001 placed ... created&lt;br /&gt;
 CreateArea [ 68fef000 68feffff ] ID 000d0001 placed ... created&lt;br /&gt;
 CreateArea [ 68ff5000 68ffefff ] ID 000e0001 placed ... created&lt;br /&gt;
 CreateArea [ 68fff000 68ffffff ] ID 000f0001 placed ... created&lt;br /&gt;
 CreateArea [ 80800000 80800fff ] ID 00100001 placed ... created&lt;br /&gt;
 CreateArea [ 80801000 8087ffff ] ID 00110001 placed ... created&lt;br /&gt;
 CreateArea [ 80880000 80880fff ] ID 00120001 placed ... created&lt;br /&gt;
 CreateArea [ 80881000 80881fff ] ID 00130001 placed ... created&lt;br /&gt;
 CreateArea [ 81000000 81ffffff ] ID 00140001 placed ... created&lt;br /&gt;
 CreateArea [ f0000000 ffffffff ] ID 00150001 placed ... created&lt;br /&gt;
 CreateArea [ 68f16000 68f16fff ] ID 00160001 placed ... created&lt;br /&gt;
 CreateArea [ deadb000 deadbfff ] ID 00170001 placed ... created&lt;br /&gt;
Reset system - Into the 68K fire: 0002d032 6806c9e8&lt;br /&gt;
 VMAllocateMemory - creating area at 0x69000000 00080000&lt;br /&gt;
 CreateArea [ 69000000 6907ffff ] ID 00180001 placed ... created&lt;br /&gt;
VMMakePageCacheable for I/O 00080881&lt;br /&gt;
CPU plugin registered&lt;br /&gt;
Extend free pool: 0x17fce000  virt 0x00000000  count: 1&lt;br /&gt;
Extend free pool: 0x17fcd000  virt 0x00000000  count: 2&lt;br /&gt;
Extend free pool: 0x17fcc000  virt 0x00000000  count: 3&lt;br /&gt;
Extend free pool: 0x17fcb000  virt 0x00000000  count: 4&lt;br /&gt;
Extend free pool: 0x17fca000  virt 0x00000000  count: 5&lt;br /&gt;
Extend free pool: 0x17fc9000  virt 0x00000000  count: 6&lt;br /&gt;
Extend free pool: 0x17fc8000  virt 0x00000000  count: 7&lt;br /&gt;
Extend free pool: 0x17fc7000  virt 0x00000000  count: 8&lt;br /&gt;
Legacy VMInit 0003ff00 003e4000&lt;br /&gt;
Adjusting area 000a0001 to size 3ff00000&lt;br /&gt;
Extend free pool: 0x17fc6000  virt 0x00000000  count: 9&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
* This does not work on a tray-loading iMac G3 because &amp;lt;code&amp;gt;/packages/telnet&amp;lt;/code&amp;gt; does not exist.&lt;br /&gt;
* The NanoKernel Log suggests that it initializes itself once without on-disk virtual memory support then immediately re-initializes itself with it enabled.&lt;br /&gt;
* It calls &amp;lt;code&amp;gt;CreateArea&amp;lt;/code&amp;gt; for the 4096-byte page containing &amp;lt;code&amp;gt;deadbeef&amp;lt;/code&amp;gt;, possibly so it is always a valid address? It shows up in [[PowerMacInfo]] for some preemptive tasks.&lt;br /&gt;
* From the NanoKernel Log, VMMaxVirtualPages (0x0005fffe) * 4096 = 1,610,604,544 (1,536 MiB). Could this be the source of the max memory limit in the classic Mac OS?&lt;br /&gt;
&lt;br /&gt;
[[Category:Guides]]&lt;br /&gt;
[[Category:Open Firmware]]&lt;br /&gt;
[[Category:PowerPC Macs]]&lt;br /&gt;
[[Category:Classic Mac OS]]&lt;/div&gt;</summary>
		<author><name>Huntertur</name></author>
	</entry>
	<entry>
		<id>https://computers.huntertur.net/index.php?title=Classic_Mac_OS_debugging_output&amp;diff=1082</id>
		<title>Classic Mac OS debugging output</title>
		<link rel="alternate" type="text/html" href="https://computers.huntertur.net/index.php?title=Classic_Mac_OS_debugging_output&amp;diff=1082"/>
		<updated>2025-09-26T06:20:59Z</updated>

		<summary type="html">&lt;p&gt;Huntertur: Add note on VMMaxVirtualPages&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;You can make the Classic Mac OS dump a bunch of debugging output during boot.&lt;br /&gt;
&lt;br /&gt;
== Instructions ==&lt;br /&gt;
&lt;br /&gt;
# Boot into Open Firmware (Command-Option-O-F).&lt;br /&gt;
# Since log output is massive, consider logging over the network instead of to the screen:&lt;br /&gt;
## Run &amp;lt;code&amp;gt;dev /packages/telnet&amp;lt;/code&amp;gt;.&lt;br /&gt;
## Run &amp;lt;code&amp;gt;&amp;quot; enet:telnet,192.168.18.10&amp;quot; io&amp;lt;/code&amp;gt;, substituting the IP address as necessary.&lt;br /&gt;
##* On-screen text input and output will end.&lt;br /&gt;
## On another computer, telnet into that IP address.&lt;br /&gt;
##* The screen will blank itself until booting begins.&lt;br /&gt;
# Use the [[#Bitflags]] table to choose a debugging configuration.&lt;br /&gt;
# Run &amp;lt;code&amp;gt;dev / 3013FFF encode-int &amp;quot; AAPL,debug&amp;quot; property&amp;lt;/code&amp;gt;, substituting the hexadecimal number as necessary.&lt;br /&gt;
# Run &amp;lt;code&amp;gt;mac-boot&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Telnet output will end before the Happy Mac even appears. When this happens, the following is printed to the screen: &amp;lt;code&amp;gt;Off to MacOS. The next (and last) call into OpenFirmware is quiesce().&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After telnet output ends, a separate NanoKernel Log will appear on screen, get covered by the Welcome to Mac OS dialog, then appear a second time before disappearing entirely with the &amp;quot;Starting up...&amp;quot; text.&lt;br /&gt;
&lt;br /&gt;
== Bitflags ==&lt;br /&gt;
From the beginning of the debugging output:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
AAPL,debug bit settings (-OR- bits together):&lt;br /&gt;
       1 * = Print general informative messages.&lt;br /&gt;
       2 * = Print formatted Mac OS tables (except config/universal info).&lt;br /&gt;
       4 * = Print formatted config info table.&lt;br /&gt;
       8 * = Dump Mac OS tables (except config/universal info).&lt;br /&gt;
      10 * = Print node names while copying the device tree.&lt;br /&gt;
      20 * = Print property info while copying the device tree.&lt;br /&gt;
      40 * = Print interrupt-related info.&lt;br /&gt;
      80 * = Print interrupt tree traversal info.&lt;br /&gt;
     100 * = Print address resolution info.&lt;br /&gt;
     200 * = Print NV-RAM info.&lt;br /&gt;
     400 * = Print Mac OS &amp;quot;universal&amp;quot; info.&lt;br /&gt;
     800 * = Print &amp;quot;special&amp;quot; node info.&lt;br /&gt;
    1000 * = Load EtherPrintf utility via parcel for post FCode debugging.&lt;br /&gt;
    2000 * = Print BOOTP/DHCP/BSDP information.&lt;br /&gt;
    4000   = Allocate writable ROM aperture.&lt;br /&gt;
    8000   = Mark Toolbox image as non-cacheable.&lt;br /&gt;
   10000 * = Print parcel info while copying the device tree.&lt;br /&gt;
   20000   = Print information on device tree data checksums.&lt;br /&gt;
 1000000 * = Enable the Nanokernel debugger.&lt;br /&gt;
 2000000 * = Display the Nanokernel log during boot.&lt;br /&gt;
10000000   = Dont attempt to unhibernate system.&lt;br /&gt;
40000000   = Halt after end of FCode (useful if outputting to screen).&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Adding all the bitflags together that enable logging (anything with an asterisk) gives 3013FFF.&lt;br /&gt;
&lt;br /&gt;
== NanoKernel Log sample ==&lt;br /&gt;
&lt;br /&gt;
Manually transcribed from a video I took of Mac OS 9.2.2 on [[crocodile]]:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
First initialization&lt;br /&gt;
&amp;lt;pre class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
              NanoKernel Log&lt;br /&gt;
              --------------&lt;br /&gt;
Hello from the builtin multitasking NanoKernel. Version: 0228&lt;br /&gt;
Kernel code base at 0x00f10000  Physical RAM size 0x17ffc000 bytes&lt;br /&gt;
Created motherboard coherence group. ID 00010001&lt;br /&gt;
NKCreateAddressSpaceSub - group at 0x177fc1c0 00010001&lt;br /&gt;
Created system address space. ID 00030001&lt;br /&gt;
 BATs ffc0007f 00c00043   6800001f 00f00043   00000000 00000000   00000000 00000000&lt;br /&gt;
Init ready queue 00000000 00000000 00004329&lt;br /&gt;
Init ready queue 00000001 00000000 00021948&lt;br /&gt;
Init ready queue 00000002 00000000 0010ca40&lt;br /&gt;
Init ready queue 00000003 00000000 00865200&lt;br /&gt;
System context at 0x177ff100  Vector save area at 0x00008000  SDR1 0x1780003f&lt;br /&gt;
Adding blue task 00050001 to the ready queue&lt;br /&gt;
Starting timeslicing&lt;br /&gt;
Adding idle task 00070001 to the ready queue&lt;br /&gt;
NKCreateAddressSpaceSub - group at 0x177fc1c0 00010001&lt;br /&gt;
Priming the system free list with 65 pages.&lt;br /&gt;
VMMaxVirtualPages: 0005fffe VMLogicalPages: 00000000&lt;br /&gt;
Interrupt handler kind: 0a&lt;br /&gt;
Converting PMDTs to areas&lt;br /&gt;
 CreateArea [ 00000000 177f4fff ] ID 000a0001 placed ... created&lt;br /&gt;
 CreateArea [ 5fffe000 5fffefff ] ID 000b0001 placed ... created&lt;br /&gt;
 CreateArea [ 64000000 6417ffff ] ID 000c0001 placed ... created&lt;br /&gt;
 CreateArea [ 68fef000 68feffff ] ID 000d0001 placed ... created&lt;br /&gt;
 CreateArea [ 68ff5000 68ffefff ] ID 000e0001 placed ... created&lt;br /&gt;
 CreateArea [ 68fff000 68ffffff ] ID 000f0001 placed ... created&lt;br /&gt;
 CreateArea [ 80800000 80800fff ] ID 00100001 placed ... created&lt;br /&gt;
 CreateArea [ 80801000 8087ffff ] ID 00110001 placed ... created&lt;br /&gt;
 CreateArea [ 80880000 80880fff ] ID 00120001 placed ... created&lt;br /&gt;
 CreateArea [ 80881000 80881fff ] ID 00130001 placed ... created&lt;br /&gt;
 CreateArea [ 81000000 81ffffff ] ID 00140001 placed ... created&lt;br /&gt;
 CreateArea [ f0000000 ffffffff ] ID 00150001 placed ... created&lt;br /&gt;
 CreateArea [ 68f16000 68f16fff ] ID 00160001 placed ... created&lt;br /&gt;
 CreateArea [ deadb000 deadbfff ] ID 00170001 placed ... created&lt;br /&gt;
Reset system - Into the 68K fire: 0000d032 6806e8c0&lt;br /&gt;
ResetSystem trap entered&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
After re-initialization&lt;br /&gt;
&amp;lt;pre class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
Kernel code base at 0x00f10000  Physical RAM size 0x17ffc000 bytes&lt;br /&gt;
Created motherboard coherence group. ID 00010001&lt;br /&gt;
NKCreateAddressSpaceSub - group at 0x177fc1c0 00010001&lt;br /&gt;
Created system address space. ID 00030001&lt;br /&gt;
 BATs ffc0007f 00c00043   6800001f 00f00043   00000000 00000000   00000000 00000000&lt;br /&gt;
Init ready queue 00000000 00000000 00004329&lt;br /&gt;
Init ready queue 00000001 00000000 00021948&lt;br /&gt;
Init ready queue 00000002 00000000 0010ca40&lt;br /&gt;
Init ready queue 00000003 00000000 00865200&lt;br /&gt;
System context at 0x177ff100  Vector save area at 0x00008000  SDR1 0x1780003f&lt;br /&gt;
Adding blue task 00050001 to the ready queue&lt;br /&gt;
Starting timeslicing&lt;br /&gt;
Adding idle task 00070001 to the ready queue&lt;br /&gt;
NKCreateAddressSpaceSub - group at 0x177fc1c0 00010001&lt;br /&gt;
Priming the system free list with 65 pages.&lt;br /&gt;
VMMaxVirtualPages: 0005fffe VMLogicalPages: 000177f5&lt;br /&gt;
Interrupt handler kind: 0a&lt;br /&gt;
Converting PMDTs to areas&lt;br /&gt;
 CreateArea [ 00000000 177f4fff ] ID 000a0001 placed ... created&lt;br /&gt;
 CreateArea [ 5fffe000 5fffefff ] ID 000b0001 placed ... created&lt;br /&gt;
 CreateArea [ 64000000 6417ffff ] ID 000c0001 placed ... created&lt;br /&gt;
 CreateArea [ 68fef000 68feffff ] ID 000d0001 placed ... created&lt;br /&gt;
 CreateArea [ 68ff5000 68ffefff ] ID 000e0001 placed ... created&lt;br /&gt;
 CreateArea [ 68fff000 68ffffff ] ID 000f0001 placed ... created&lt;br /&gt;
 CreateArea [ 80800000 80800fff ] ID 00100001 placed ... created&lt;br /&gt;
 CreateArea [ 80801000 8087ffff ] ID 00110001 placed ... created&lt;br /&gt;
 CreateArea [ 80880000 80880fff ] ID 00120001 placed ... created&lt;br /&gt;
 CreateArea [ 80881000 80881fff ] ID 00130001 placed ... created&lt;br /&gt;
 CreateArea [ 81000000 81ffffff ] ID 00140001 placed ... created&lt;br /&gt;
 CreateArea [ f0000000 ffffffff ] ID 00150001 placed ... created&lt;br /&gt;
 CreateArea [ 68f16000 68f16fff ] ID 00160001 placed ... created&lt;br /&gt;
 CreateArea [ deadb000 deadbfff ] ID 00170001 placed ... created&lt;br /&gt;
Reset system - Into the 68K fire: 0002d032 6806c9e8&lt;br /&gt;
 VMAllocateMemory - creating area at 0x69000000 00080000&lt;br /&gt;
 CreateArea [ 69000000 6907ffff ] ID 00180001 placed ... created&lt;br /&gt;
VMMakePageCacheable for I/O 00080881&lt;br /&gt;
CPU plugin registered&lt;br /&gt;
Extend free pool: 0x17fce000  virt 0x00000000  count: 1&lt;br /&gt;
Extend free pool: 0x17fcd000  virt 0x00000000  count: 2&lt;br /&gt;
Extend free pool: 0x17fcc000  virt 0x00000000  count: 3&lt;br /&gt;
Extend free pool: 0x17fcb000  virt 0x00000000  count: 4&lt;br /&gt;
Extend free pool: 0x17fca000  virt 0x00000000  count: 5&lt;br /&gt;
Extend free pool: 0x17fc9000  virt 0x00000000  count: 6&lt;br /&gt;
Extend free pool: 0x17fc8000  virt 0x00000000  count: 7&lt;br /&gt;
Extend free pool: 0x17fc7000  virt 0x00000000  count: 8&lt;br /&gt;
Legacy VMInit 0003ff00 003e4000&lt;br /&gt;
Adjusting area 000a0001 to size 3ff00000&lt;br /&gt;
Extend free pool: 0x17fc6000  virt 0x00000000  count: 9&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
* This does not work on a tray-loading iMac G3 because &amp;lt;code&amp;gt;/packages/telnet&amp;lt;/code&amp;gt; does not exist.&lt;br /&gt;
* The NanoKernel Log suggests that it initializes itself once without on-disk virtual memory support then immediately re-initializes itself with it enabled.&lt;br /&gt;
* It calls &amp;lt;code&amp;gt;CreateArea&amp;lt;/code&amp;gt; for the 4096-byte page containing &amp;lt;code&amp;gt;deadbeef&amp;lt;/code&amp;gt;, possibly so it is always a valid address? It shows up in [[PowerMacInfo]] for some preemptive tasks.&lt;br /&gt;
* From the NanoKernel Log, VMMaxVirtualPages (0x0005fffe) * 4096 = 1,610,604,544 (1,536 MiB). Could this be the source of the max memory limit in the classic Mac OS?&lt;br /&gt;
&lt;br /&gt;
[[Category:Guides]]&lt;br /&gt;
[[Category:Open Firmware]]&lt;br /&gt;
[[Category:PowerPC Macs]]&lt;br /&gt;
[[Category:Classic Mac OS]]&lt;/div&gt;</summary>
		<author><name>Huntertur</name></author>
	</entry>
	<entry>
		<id>https://computers.huntertur.net/index.php?title=Classic_Mac_OS_debugging_output&amp;diff=1081</id>
		<title>Classic Mac OS debugging output</title>
		<link rel="alternate" type="text/html" href="https://computers.huntertur.net/index.php?title=Classic_Mac_OS_debugging_output&amp;diff=1081"/>
		<updated>2025-09-26T06:12:04Z</updated>

		<summary type="html">&lt;p&gt;Huntertur: Add NanoKernel Log&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;You can make the Classic Mac OS dump a bunch of debugging output during boot.&lt;br /&gt;
&lt;br /&gt;
== Instructions ==&lt;br /&gt;
&lt;br /&gt;
# Boot into Open Firmware (Command-Option-O-F).&lt;br /&gt;
# Since log output is massive, consider logging over the network instead of to the screen:&lt;br /&gt;
## Run &amp;lt;code&amp;gt;dev /packages/telnet&amp;lt;/code&amp;gt;.&lt;br /&gt;
## Run &amp;lt;code&amp;gt;&amp;quot; enet:telnet,192.168.18.10&amp;quot; io&amp;lt;/code&amp;gt;, substituting the IP address as necessary.&lt;br /&gt;
##* On-screen text input and output will end.&lt;br /&gt;
## On another computer, telnet into that IP address.&lt;br /&gt;
##* The screen will blank itself until booting begins.&lt;br /&gt;
# Use the [[#Bitflags]] table to choose a debugging configuration.&lt;br /&gt;
# Run &amp;lt;code&amp;gt;dev / 3013FFF encode-int &amp;quot; AAPL,debug&amp;quot; property&amp;lt;/code&amp;gt;, substituting the hexadecimal number as necessary.&lt;br /&gt;
# Run &amp;lt;code&amp;gt;mac-boot&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Telnet output will end before the Happy Mac even appears. When this happens, the following is printed to the screen: &amp;lt;code&amp;gt;Off to MacOS. The next (and last) call into OpenFirmware is quiesce().&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After telnet output ends, a separate NanoKernel Log will appear on screen, get covered by the Welcome to Mac OS dialog, then appear a second time before disappearing entirely with the &amp;quot;Starting up...&amp;quot; text.&lt;br /&gt;
&lt;br /&gt;
== Bitflags ==&lt;br /&gt;
From the beginning of the debugging output:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
AAPL,debug bit settings (-OR- bits together):&lt;br /&gt;
       1 * = Print general informative messages.&lt;br /&gt;
       2 * = Print formatted Mac OS tables (except config/universal info).&lt;br /&gt;
       4 * = Print formatted config info table.&lt;br /&gt;
       8 * = Dump Mac OS tables (except config/universal info).&lt;br /&gt;
      10 * = Print node names while copying the device tree.&lt;br /&gt;
      20 * = Print property info while copying the device tree.&lt;br /&gt;
      40 * = Print interrupt-related info.&lt;br /&gt;
      80 * = Print interrupt tree traversal info.&lt;br /&gt;
     100 * = Print address resolution info.&lt;br /&gt;
     200 * = Print NV-RAM info.&lt;br /&gt;
     400 * = Print Mac OS &amp;quot;universal&amp;quot; info.&lt;br /&gt;
     800 * = Print &amp;quot;special&amp;quot; node info.&lt;br /&gt;
    1000 * = Load EtherPrintf utility via parcel for post FCode debugging.&lt;br /&gt;
    2000 * = Print BOOTP/DHCP/BSDP information.&lt;br /&gt;
    4000   = Allocate writable ROM aperture.&lt;br /&gt;
    8000   = Mark Toolbox image as non-cacheable.&lt;br /&gt;
   10000 * = Print parcel info while copying the device tree.&lt;br /&gt;
   20000   = Print information on device tree data checksums.&lt;br /&gt;
 1000000 * = Enable the Nanokernel debugger.&lt;br /&gt;
 2000000 * = Display the Nanokernel log during boot.&lt;br /&gt;
10000000   = Dont attempt to unhibernate system.&lt;br /&gt;
40000000   = Halt after end of FCode (useful if outputting to screen).&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Adding all the bitflags together that enable logging (anything with an asterisk) gives 3013FFF.&lt;br /&gt;
&lt;br /&gt;
== NanoKernel Log sample ==&lt;br /&gt;
&lt;br /&gt;
Manually transcribed from a video I took of Mac OS 9.2.2 on [[crocodile]]:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
First initialization&lt;br /&gt;
&amp;lt;pre class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
              NanoKernel Log&lt;br /&gt;
              --------------&lt;br /&gt;
Hello from the builtin multitasking NanoKernel. Version: 0228&lt;br /&gt;
Kernel code base at 0x00f10000  Physical RAM size 0x17ffc000 bytes&lt;br /&gt;
Created motherboard coherence group. ID 00010001&lt;br /&gt;
NKCreateAddressSpaceSub - group at 0x177fc1c0 00010001&lt;br /&gt;
Created system address space. ID 00030001&lt;br /&gt;
 BATs ffc0007f 00c00043   6800001f 00f00043   00000000 00000000   00000000 00000000&lt;br /&gt;
Init ready queue 00000000 00000000 00004329&lt;br /&gt;
Init ready queue 00000001 00000000 00021948&lt;br /&gt;
Init ready queue 00000002 00000000 0010ca40&lt;br /&gt;
Init ready queue 00000003 00000000 00865200&lt;br /&gt;
System context at 0x177ff100  Vector save area at 0x00008000  SDR1 0x1780003f&lt;br /&gt;
Adding blue task 00050001 to the ready queue&lt;br /&gt;
Starting timeslicing&lt;br /&gt;
Adding idle task 00070001 to the ready queue&lt;br /&gt;
NKCreateAddressSpaceSub - group at 0x177fc1c0 00010001&lt;br /&gt;
Priming the system free list with 65 pages.&lt;br /&gt;
VMMaxVirtualPages: 0005fffe VMLogicalPages: 00000000&lt;br /&gt;
Interrupt handler kind: 0a&lt;br /&gt;
Converting PMDTs to areas&lt;br /&gt;
 CreateArea [ 00000000 177f4fff ] ID 000a0001 placed ... created&lt;br /&gt;
 CreateArea [ 5fffe000 5fffefff ] ID 000b0001 placed ... created&lt;br /&gt;
 CreateArea [ 64000000 6417ffff ] ID 000c0001 placed ... created&lt;br /&gt;
 CreateArea [ 68fef000 68feffff ] ID 000d0001 placed ... created&lt;br /&gt;
 CreateArea [ 68ff5000 68ffefff ] ID 000e0001 placed ... created&lt;br /&gt;
 CreateArea [ 68fff000 68ffffff ] ID 000f0001 placed ... created&lt;br /&gt;
 CreateArea [ 80800000 80800fff ] ID 00100001 placed ... created&lt;br /&gt;
 CreateArea [ 80801000 8087ffff ] ID 00110001 placed ... created&lt;br /&gt;
 CreateArea [ 80880000 80880fff ] ID 00120001 placed ... created&lt;br /&gt;
 CreateArea [ 80881000 80881fff ] ID 00130001 placed ... created&lt;br /&gt;
 CreateArea [ 81000000 81ffffff ] ID 00140001 placed ... created&lt;br /&gt;
 CreateArea [ f0000000 ffffffff ] ID 00150001 placed ... created&lt;br /&gt;
 CreateArea [ 68f16000 68f16fff ] ID 00160001 placed ... created&lt;br /&gt;
 CreateArea [ deadb000 deadbfff ] ID 00170001 placed ... created&lt;br /&gt;
Reset system - Into the 68K fire: 0000d032 6806e8c0&lt;br /&gt;
ResetSystem trap entered&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
After re-initialization&lt;br /&gt;
&amp;lt;pre class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
Kernel code base at 0x00f10000  Physical RAM size 0x17ffc000 bytes&lt;br /&gt;
Created motherboard coherence group. ID 00010001&lt;br /&gt;
NKCreateAddressSpaceSub - group at 0x177fc1c0 00010001&lt;br /&gt;
Created system address space. ID 00030001&lt;br /&gt;
 BATs ffc0007f 00c00043   6800001f 00f00043   00000000 00000000   00000000 00000000&lt;br /&gt;
Init ready queue 00000000 00000000 00004329&lt;br /&gt;
Init ready queue 00000001 00000000 00021948&lt;br /&gt;
Init ready queue 00000002 00000000 0010ca40&lt;br /&gt;
Init ready queue 00000003 00000000 00865200&lt;br /&gt;
System context at 0x177ff100  Vector save area at 0x00008000  SDR1 0x1780003f&lt;br /&gt;
Adding blue task 00050001 to the ready queue&lt;br /&gt;
Starting timeslicing&lt;br /&gt;
Adding idle task 00070001 to the ready queue&lt;br /&gt;
NKCreateAddressSpaceSub - group at 0x177fc1c0 00010001&lt;br /&gt;
Priming the system free list with 65 pages.&lt;br /&gt;
VMMaxVirtualPages: 0005fffe VMLogicalPages: 000177f5&lt;br /&gt;
Interrupt handler kind: 0a&lt;br /&gt;
Converting PMDTs to areas&lt;br /&gt;
 CreateArea [ 00000000 177f4fff ] ID 000a0001 placed ... created&lt;br /&gt;
 CreateArea [ 5fffe000 5fffefff ] ID 000b0001 placed ... created&lt;br /&gt;
 CreateArea [ 64000000 6417ffff ] ID 000c0001 placed ... created&lt;br /&gt;
 CreateArea [ 68fef000 68feffff ] ID 000d0001 placed ... created&lt;br /&gt;
 CreateArea [ 68ff5000 68ffefff ] ID 000e0001 placed ... created&lt;br /&gt;
 CreateArea [ 68fff000 68ffffff ] ID 000f0001 placed ... created&lt;br /&gt;
 CreateArea [ 80800000 80800fff ] ID 00100001 placed ... created&lt;br /&gt;
 CreateArea [ 80801000 8087ffff ] ID 00110001 placed ... created&lt;br /&gt;
 CreateArea [ 80880000 80880fff ] ID 00120001 placed ... created&lt;br /&gt;
 CreateArea [ 80881000 80881fff ] ID 00130001 placed ... created&lt;br /&gt;
 CreateArea [ 81000000 81ffffff ] ID 00140001 placed ... created&lt;br /&gt;
 CreateArea [ f0000000 ffffffff ] ID 00150001 placed ... created&lt;br /&gt;
 CreateArea [ 68f16000 68f16fff ] ID 00160001 placed ... created&lt;br /&gt;
 CreateArea [ deadb000 deadbfff ] ID 00170001 placed ... created&lt;br /&gt;
Reset system - Into the 68K fire: 0002d032 6806c9e8&lt;br /&gt;
 VMAllocateMemory - creating area at 0x69000000 00080000&lt;br /&gt;
 CreateArea [ 69000000 6907ffff ] ID 00180001 placed ... created&lt;br /&gt;
VMMakePageCacheable for I/O 00080881&lt;br /&gt;
CPU plugin registered&lt;br /&gt;
Extend free pool: 0x17fce000  virt 0x00000000  count: 1&lt;br /&gt;
Extend free pool: 0x17fcd000  virt 0x00000000  count: 2&lt;br /&gt;
Extend free pool: 0x17fcc000  virt 0x00000000  count: 3&lt;br /&gt;
Extend free pool: 0x17fcb000  virt 0x00000000  count: 4&lt;br /&gt;
Extend free pool: 0x17fca000  virt 0x00000000  count: 5&lt;br /&gt;
Extend free pool: 0x17fc9000  virt 0x00000000  count: 6&lt;br /&gt;
Extend free pool: 0x17fc8000  virt 0x00000000  count: 7&lt;br /&gt;
Extend free pool: 0x17fc7000  virt 0x00000000  count: 8&lt;br /&gt;
Legacy VMInit 0003ff00 003e4000&lt;br /&gt;
Adjusting area 000a0001 to size 3ff00000&lt;br /&gt;
Extend free pool: 0x17fc6000  virt 0x00000000  count: 9&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
* This does not work on a tray-loading iMac G3 because &amp;lt;code&amp;gt;/packages/telnet&amp;lt;/code&amp;gt; does not exist.&lt;br /&gt;
* The NanoKernel Log suggests that it initializes itself once without virtual memory then immediately re-initializes itself with virtual memory.&lt;br /&gt;
* It calls &amp;lt;code&amp;gt;CreateArea&amp;lt;/code&amp;gt; for the 4096-byte page containing &amp;lt;code&amp;gt;deadbeef&amp;lt;/code&amp;gt;, possibly so it is always a valid address? It shows up in [[PowerMacInfo]] for some preemptive tasks.&lt;br /&gt;
&lt;br /&gt;
[[Category:Guides]]&lt;br /&gt;
[[Category:Open Firmware]]&lt;br /&gt;
[[Category:PowerPC Macs]]&lt;br /&gt;
[[Category:Classic Mac OS]]&lt;/div&gt;</summary>
		<author><name>Huntertur</name></author>
	</entry>
	<entry>
		<id>https://computers.huntertur.net/index.php?title=Classic_Mac_OS_debugging_output&amp;diff=1080</id>
		<title>Classic Mac OS debugging output</title>
		<link rel="alternate" type="text/html" href="https://computers.huntertur.net/index.php?title=Classic_Mac_OS_debugging_output&amp;diff=1080"/>
		<updated>2025-09-26T05:40:35Z</updated>

		<summary type="html">&lt;p&gt;Huntertur: Move log phases out of Notes section&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;You can make the Classic Mac OS dump a bunch of debugging output during boot.&lt;br /&gt;
&lt;br /&gt;
== Instructions ==&lt;br /&gt;
&lt;br /&gt;
# Boot into Open Firmware (Command-Option-O-F).&lt;br /&gt;
# Since log output is massive, consider logging over the network instead of to the screen:&lt;br /&gt;
## Run &amp;lt;code&amp;gt;dev /packages/telnet&amp;lt;/code&amp;gt;.&lt;br /&gt;
## Run &amp;lt;code&amp;gt;&amp;quot; enet:telnet,192.168.18.10&amp;quot; io&amp;lt;/code&amp;gt;, substituting the IP address as necessary.&lt;br /&gt;
##* On-screen text input and output will end.&lt;br /&gt;
## On another computer, telnet into that IP address.&lt;br /&gt;
##* The screen will blank itself until booting begins.&lt;br /&gt;
# Use the [[#Bitflags]] table to choose a debugging configuration.&lt;br /&gt;
# Run &amp;lt;code&amp;gt;dev / 3013FFF encode-int &amp;quot; AAPL,debug&amp;quot; property&amp;lt;/code&amp;gt;, substituting the hexadecimal number as necessary.&lt;br /&gt;
# Run &amp;lt;code&amp;gt;mac-boot&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Telnet output will end before the Happy Mac even appears. When this happens, the following is printed to the screen: &amp;lt;code&amp;gt;Off to MacOS. The next (and last) call into OpenFirmware is quiesce().&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After telnet output ends, a separate NanoKernel Log will appear on screen, get covered by the Welcome to Mac OS dialog, then appear a second time before disappearing entirely with the &amp;quot;Starting up...&amp;quot; text.&lt;br /&gt;
&lt;br /&gt;
== Bitflags ==&lt;br /&gt;
From the beginning of the debugging output:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
AAPL,debug bit settings (-OR- bits together):&lt;br /&gt;
       1 * = Print general informative messages.&lt;br /&gt;
       2 * = Print formatted Mac OS tables (except config/universal info).&lt;br /&gt;
       4 * = Print formatted config info table.&lt;br /&gt;
       8 * = Dump Mac OS tables (except config/universal info).&lt;br /&gt;
      10 * = Print node names while copying the device tree.&lt;br /&gt;
      20 * = Print property info while copying the device tree.&lt;br /&gt;
      40 * = Print interrupt-related info.&lt;br /&gt;
      80 * = Print interrupt tree traversal info.&lt;br /&gt;
     100 * = Print address resolution info.&lt;br /&gt;
     200 * = Print NV-RAM info.&lt;br /&gt;
     400 * = Print Mac OS &amp;quot;universal&amp;quot; info.&lt;br /&gt;
     800 * = Print &amp;quot;special&amp;quot; node info.&lt;br /&gt;
    1000 * = Load EtherPrintf utility via parcel for post FCode debugging.&lt;br /&gt;
    2000 * = Print BOOTP/DHCP/BSDP information.&lt;br /&gt;
    4000   = Allocate writable ROM aperture.&lt;br /&gt;
    8000   = Mark Toolbox image as non-cacheable.&lt;br /&gt;
   10000 * = Print parcel info while copying the device tree.&lt;br /&gt;
   20000   = Print information on device tree data checksums.&lt;br /&gt;
 1000000 * = Enable the Nanokernel debugger.&lt;br /&gt;
 2000000 * = Display the Nanokernel log during boot.&lt;br /&gt;
10000000   = Dont attempt to unhibernate system.&lt;br /&gt;
40000000   = Halt after end of FCode (useful if outputting to screen).&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Adding all the bitflags together that enable logging (anything with an asterisk) gives 3013FFF.&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
* This does not work on a tray-loading iMac G3 because &amp;lt;code&amp;gt;/packages/telnet&amp;lt;/code&amp;gt; does not exist.&lt;br /&gt;
&lt;br /&gt;
[[Category:Guides]]&lt;br /&gt;
[[Category:Open Firmware]]&lt;br /&gt;
[[Category:PowerPC Macs]]&lt;br /&gt;
[[Category:Classic Mac OS]]&lt;/div&gt;</summary>
		<author><name>Huntertur</name></author>
	</entry>
	<entry>
		<id>https://computers.huntertur.net/index.php?title=Classic_Mac_OS_debugging_output&amp;diff=1079</id>
		<title>Classic Mac OS debugging output</title>
		<link rel="alternate" type="text/html" href="https://computers.huntertur.net/index.php?title=Classic_Mac_OS_debugging_output&amp;diff=1079"/>
		<updated>2025-09-26T05:35:48Z</updated>

		<summary type="html">&lt;p&gt;Huntertur: Rewrite instructions&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;You can make the Classic Mac OS dump a bunch of debugging output during boot.&lt;br /&gt;
&lt;br /&gt;
== Instructions ==&lt;br /&gt;
&lt;br /&gt;
# Boot into Open Firmware (Command-Option-O-F).&lt;br /&gt;
# Since log output is massive, consider logging over the network instead of to the screen:&lt;br /&gt;
## Run &amp;lt;code&amp;gt;dev /packages/telnet&amp;lt;/code&amp;gt;.&lt;br /&gt;
## Run &amp;lt;code&amp;gt;&amp;quot; enet:telnet,192.168.18.10&amp;quot; io&amp;lt;/code&amp;gt;, substituting the IP address as necessary.&lt;br /&gt;
##* On-screen text input and output will end.&lt;br /&gt;
## On another computer, telnet into that IP address.&lt;br /&gt;
##* The screen will blank itself until booting begins.&lt;br /&gt;
# Use the [[#Bitflags]] table to choose a debugging configuration.&lt;br /&gt;
# Run &amp;lt;code&amp;gt;dev / 3013FFF encode-int &amp;quot; AAPL,debug&amp;quot; property&amp;lt;/code&amp;gt;, substituting the hexadecimal number as necessary.&lt;br /&gt;
# Run &amp;lt;code&amp;gt;mac-boot&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Bitflags ==&lt;br /&gt;
From the beginning of the debugging output:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
AAPL,debug bit settings (-OR- bits together):&lt;br /&gt;
       1 * = Print general informative messages.&lt;br /&gt;
       2 * = Print formatted Mac OS tables (except config/universal info).&lt;br /&gt;
       4 * = Print formatted config info table.&lt;br /&gt;
       8 * = Dump Mac OS tables (except config/universal info).&lt;br /&gt;
      10 * = Print node names while copying the device tree.&lt;br /&gt;
      20 * = Print property info while copying the device tree.&lt;br /&gt;
      40 * = Print interrupt-related info.&lt;br /&gt;
      80 * = Print interrupt tree traversal info.&lt;br /&gt;
     100 * = Print address resolution info.&lt;br /&gt;
     200 * = Print NV-RAM info.&lt;br /&gt;
     400 * = Print Mac OS &amp;quot;universal&amp;quot; info.&lt;br /&gt;
     800 * = Print &amp;quot;special&amp;quot; node info.&lt;br /&gt;
    1000 * = Load EtherPrintf utility via parcel for post FCode debugging.&lt;br /&gt;
    2000 * = Print BOOTP/DHCP/BSDP information.&lt;br /&gt;
    4000   = Allocate writable ROM aperture.&lt;br /&gt;
    8000   = Mark Toolbox image as non-cacheable.&lt;br /&gt;
   10000 * = Print parcel info while copying the device tree.&lt;br /&gt;
   20000   = Print information on device tree data checksums.&lt;br /&gt;
 1000000 * = Enable the Nanokernel debugger.&lt;br /&gt;
 2000000 * = Display the Nanokernel log during boot.&lt;br /&gt;
10000000   = Dont attempt to unhibernate system.&lt;br /&gt;
40000000   = Halt after end of FCode (useful if outputting to screen).&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Adding all the bitflags together that enable logging (anything with an asterisk) gives 3013FFF.&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
* This does not work on a tray-loading iMac G3 because &amp;lt;code&amp;gt;/packages/telnet&amp;lt;/code&amp;gt; does not exist.&lt;br /&gt;
* Telnet output starts about two seconds after the screen turns gray. Output then ends, before the Happy Mac even appears.&lt;br /&gt;
** When this happens, the following is printed to the screen: &amp;lt;code&amp;gt;Off to MacOS. The next (and last) call into OpenFirmware is quiesce().&amp;lt;/code&amp;gt;&lt;br /&gt;
* After telnet output ends, a separate NanoKernel Log will appear on screen, get covered by the Welcome to Mac OS dialog, then appear a second time before disappearing entirely with the &amp;quot;Starting up...&amp;quot; text.&lt;br /&gt;
&lt;br /&gt;
[[Category:Guides]]&lt;br /&gt;
[[Category:Open Firmware]]&lt;br /&gt;
[[Category:PowerPC Macs]]&lt;br /&gt;
[[Category:Classic Mac OS]]&lt;/div&gt;</summary>
		<author><name>Huntertur</name></author>
	</entry>
	<entry>
		<id>https://computers.huntertur.net/index.php?title=Classic_Mac_OS_debugging_output&amp;diff=1078</id>
		<title>Classic Mac OS debugging output</title>
		<link rel="alternate" type="text/html" href="https://computers.huntertur.net/index.php?title=Classic_Mac_OS_debugging_output&amp;diff=1078"/>
		<updated>2025-09-26T05:27:45Z</updated>

		<summary type="html">&lt;p&gt;Huntertur: /* Notes */ Note the &amp;quot;Off to MacOS.&amp;quot; message&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;You can make the Classic Mac OS dump a bunch of debugging output to Open Firmware during boot and sometimes the screen after boot.&lt;br /&gt;
&lt;br /&gt;
To do this, open Open Firmware during boot with Command-Option-O-F and enter &amp;lt;code&amp;gt;dev / 3013FFF encode-int &amp;quot; AAPL,debug&amp;quot; property&amp;lt;/code&amp;gt;. Then, boot with &amp;lt;code&amp;gt;mac-boot&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If you want a log of this output, you should hook your machine up to the local network, then run this, replacing the IP address with whatever is available for the machine to use:&lt;br /&gt;
&lt;br /&gt;
 dev /packages/telnet&lt;br /&gt;
 &amp;quot; enet:telnet,192.168.18.10&amp;quot; io&lt;br /&gt;
&lt;br /&gt;
Then connect to your machine via Telnet before booting.&lt;br /&gt;
&lt;br /&gt;
== Bitflags ==&lt;br /&gt;
From the beginning of the debugging output:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
AAPL,debug bit settings (-OR- bits together):&lt;br /&gt;
       1 * = Print general informative messages.&lt;br /&gt;
       2 * = Print formatted Mac OS tables (except config/universal info).&lt;br /&gt;
       4 * = Print formatted config info table.&lt;br /&gt;
       8 * = Dump Mac OS tables (except config/universal info).&lt;br /&gt;
      10 * = Print node names while copying the device tree.&lt;br /&gt;
      20 * = Print property info while copying the device tree.&lt;br /&gt;
      40 * = Print interrupt-related info.&lt;br /&gt;
      80 * = Print interrupt tree traversal info.&lt;br /&gt;
     100 * = Print address resolution info.&lt;br /&gt;
     200 * = Print NV-RAM info.&lt;br /&gt;
     400 * = Print Mac OS &amp;quot;universal&amp;quot; info.&lt;br /&gt;
     800 * = Print &amp;quot;special&amp;quot; node info.&lt;br /&gt;
    1000 * = Load EtherPrintf utility via parcel for post FCode debugging.&lt;br /&gt;
    2000 * = Print BOOTP/DHCP/BSDP information.&lt;br /&gt;
    4000   = Allocate writable ROM aperture.&lt;br /&gt;
    8000   = Mark Toolbox image as non-cacheable.&lt;br /&gt;
   10000 * = Print parcel info while copying the device tree.&lt;br /&gt;
   20000   = Print information on device tree data checksums.&lt;br /&gt;
 1000000 * = Enable the Nanokernel debugger.&lt;br /&gt;
 2000000 * = Display the Nanokernel log during boot.&lt;br /&gt;
10000000   = Dont attempt to unhibernate system.&lt;br /&gt;
40000000   = Halt after end of FCode (useful if outputting to screen).&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Adding all the bitflags together that enable logging (anything with an asterisk) gives 3013FFF.&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
* This does not work on a tray-loading iMac G3 because &amp;lt;code&amp;gt;/packages/telnet&amp;lt;/code&amp;gt; does not exist.&lt;br /&gt;
* The screen will become blank after connecting from the client machine. The screen will come back to life once booting begins.&lt;br /&gt;
* Telnet output starts about two seconds after the screen turns gray. Output then ends, before the Happy Mac even appears.&lt;br /&gt;
** When this happens, the following is printed to the screen: &amp;lt;code&amp;gt;Off to MacOS. The next (and last) call into OpenFirmware is quiesce().&amp;lt;/code&amp;gt;&lt;br /&gt;
* After telnet output ends, a separate NanoKernel Log will appear on screen, get covered by the Welcome to Mac OS dialog, then appear a second time before disappearing entirely with the &amp;quot;Starting up...&amp;quot; text.&lt;br /&gt;
&lt;br /&gt;
[[Category:Guides]]&lt;br /&gt;
[[Category:Open Firmware]]&lt;br /&gt;
[[Category:PowerPC Macs]]&lt;br /&gt;
[[Category:Classic Mac OS]]&lt;/div&gt;</summary>
		<author><name>Huntertur</name></author>
	</entry>
	<entry>
		<id>https://computers.huntertur.net/index.php?title=Classic_Mac_OS_debugging_output&amp;diff=1077</id>
		<title>Classic Mac OS debugging output</title>
		<link rel="alternate" type="text/html" href="https://computers.huntertur.net/index.php?title=Classic_Mac_OS_debugging_output&amp;diff=1077"/>
		<updated>2025-09-26T04:57:05Z</updated>

		<summary type="html">&lt;p&gt;Huntertur: /* Notes */ Note NanoKernel Log&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;You can make the Classic Mac OS dump a bunch of debugging output to Open Firmware during boot and sometimes the screen after boot.&lt;br /&gt;
&lt;br /&gt;
To do this, open Open Firmware during boot with Command-Option-O-F and enter &amp;lt;code&amp;gt;dev / 3013FFF encode-int &amp;quot; AAPL,debug&amp;quot; property&amp;lt;/code&amp;gt;. Then, boot with &amp;lt;code&amp;gt;mac-boot&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If you want a log of this output, you should hook your machine up to the local network, then run this, replacing the IP address with whatever is available for the machine to use:&lt;br /&gt;
&lt;br /&gt;
 dev /packages/telnet&lt;br /&gt;
 &amp;quot; enet:telnet,192.168.18.10&amp;quot; io&lt;br /&gt;
&lt;br /&gt;
Then connect to your machine via Telnet before booting.&lt;br /&gt;
&lt;br /&gt;
== Bitflags ==&lt;br /&gt;
From the beginning of the debugging output:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
AAPL,debug bit settings (-OR- bits together):&lt;br /&gt;
       1 * = Print general informative messages.&lt;br /&gt;
       2 * = Print formatted Mac OS tables (except config/universal info).&lt;br /&gt;
       4 * = Print formatted config info table.&lt;br /&gt;
       8 * = Dump Mac OS tables (except config/universal info).&lt;br /&gt;
      10 * = Print node names while copying the device tree.&lt;br /&gt;
      20 * = Print property info while copying the device tree.&lt;br /&gt;
      40 * = Print interrupt-related info.&lt;br /&gt;
      80 * = Print interrupt tree traversal info.&lt;br /&gt;
     100 * = Print address resolution info.&lt;br /&gt;
     200 * = Print NV-RAM info.&lt;br /&gt;
     400 * = Print Mac OS &amp;quot;universal&amp;quot; info.&lt;br /&gt;
     800 * = Print &amp;quot;special&amp;quot; node info.&lt;br /&gt;
    1000 * = Load EtherPrintf utility via parcel for post FCode debugging.&lt;br /&gt;
    2000 * = Print BOOTP/DHCP/BSDP information.&lt;br /&gt;
    4000   = Allocate writable ROM aperture.&lt;br /&gt;
    8000   = Mark Toolbox image as non-cacheable.&lt;br /&gt;
   10000 * = Print parcel info while copying the device tree.&lt;br /&gt;
   20000   = Print information on device tree data checksums.&lt;br /&gt;
 1000000 * = Enable the Nanokernel debugger.&lt;br /&gt;
 2000000 * = Display the Nanokernel log during boot.&lt;br /&gt;
10000000   = Dont attempt to unhibernate system.&lt;br /&gt;
40000000   = Halt after end of FCode (useful if outputting to screen).&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Adding all the bitflags together that enable logging (anything with an asterisk) gives 3013FFF.&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
* This does not work on a tray-loading iMac G3 because &amp;lt;code&amp;gt;/packages/telnet&amp;lt;/code&amp;gt; does not exist.&lt;br /&gt;
* The screen will become blank after connecting from the client machine. The screen will come back to life once booting begins.&lt;br /&gt;
* Telnet output starts about two seconds after the screen turns gray. Output then ends, before the Happy Mac even appears.&lt;br /&gt;
* After telnet output ends, a separate NanoKernel Log will appear on screen, get covered by the Welcome to Mac OS dialog, then appear a second time before disappearing entirely with the &amp;quot;Starting up...&amp;quot; text.&lt;br /&gt;
&lt;br /&gt;
[[Category:Guides]]&lt;br /&gt;
[[Category:Open Firmware]]&lt;br /&gt;
[[Category:PowerPC Macs]]&lt;br /&gt;
[[Category:Classic Mac OS]]&lt;/div&gt;</summary>
		<author><name>Huntertur</name></author>
	</entry>
	<entry>
		<id>https://computers.huntertur.net/index.php?title=Classic_Mac_OS_debugging_output&amp;diff=1076</id>
		<title>Classic Mac OS debugging output</title>
		<link rel="alternate" type="text/html" href="https://computers.huntertur.net/index.php?title=Classic_Mac_OS_debugging_output&amp;diff=1076"/>
		<updated>2025-09-26T04:51:55Z</updated>

		<summary type="html">&lt;p&gt;Huntertur: /* Bitflags */ Explain 3103FFF&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;You can make the Classic Mac OS dump a bunch of debugging output to Open Firmware during boot and sometimes the screen after boot.&lt;br /&gt;
&lt;br /&gt;
To do this, open Open Firmware during boot with Command-Option-O-F and enter &amp;lt;code&amp;gt;dev / 3013FFF encode-int &amp;quot; AAPL,debug&amp;quot; property&amp;lt;/code&amp;gt;. Then, boot with &amp;lt;code&amp;gt;mac-boot&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If you want a log of this output, you should hook your machine up to the local network, then run this, replacing the IP address with whatever is available for the machine to use:&lt;br /&gt;
&lt;br /&gt;
 dev /packages/telnet&lt;br /&gt;
 &amp;quot; enet:telnet,192.168.18.10&amp;quot; io&lt;br /&gt;
&lt;br /&gt;
Then connect to your machine via Telnet before booting.&lt;br /&gt;
&lt;br /&gt;
== Bitflags ==&lt;br /&gt;
From the beginning of the debugging output:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
AAPL,debug bit settings (-OR- bits together):&lt;br /&gt;
       1 * = Print general informative messages.&lt;br /&gt;
       2 * = Print formatted Mac OS tables (except config/universal info).&lt;br /&gt;
       4 * = Print formatted config info table.&lt;br /&gt;
       8 * = Dump Mac OS tables (except config/universal info).&lt;br /&gt;
      10 * = Print node names while copying the device tree.&lt;br /&gt;
      20 * = Print property info while copying the device tree.&lt;br /&gt;
      40 * = Print interrupt-related info.&lt;br /&gt;
      80 * = Print interrupt tree traversal info.&lt;br /&gt;
     100 * = Print address resolution info.&lt;br /&gt;
     200 * = Print NV-RAM info.&lt;br /&gt;
     400 * = Print Mac OS &amp;quot;universal&amp;quot; info.&lt;br /&gt;
     800 * = Print &amp;quot;special&amp;quot; node info.&lt;br /&gt;
    1000 * = Load EtherPrintf utility via parcel for post FCode debugging.&lt;br /&gt;
    2000 * = Print BOOTP/DHCP/BSDP information.&lt;br /&gt;
    4000   = Allocate writable ROM aperture.&lt;br /&gt;
    8000   = Mark Toolbox image as non-cacheable.&lt;br /&gt;
   10000 * = Print parcel info while copying the device tree.&lt;br /&gt;
   20000   = Print information on device tree data checksums.&lt;br /&gt;
 1000000 * = Enable the Nanokernel debugger.&lt;br /&gt;
 2000000 * = Display the Nanokernel log during boot.&lt;br /&gt;
10000000   = Dont attempt to unhibernate system.&lt;br /&gt;
40000000   = Halt after end of FCode (useful if outputting to screen).&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Adding all the bitflags together that enable logging (anything with an asterisk) gives 3013FFF.&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
* This does not work on a tray-loading iMac G3 because &amp;lt;code&amp;gt;/packages/telnet&amp;lt;/code&amp;gt; does not exist.&lt;br /&gt;
* The screen will become blank after connecting from the client machine. The screen will come back to life once booting begins.&lt;br /&gt;
* &lt;br /&gt;
&lt;br /&gt;
[[Category:Guides]]&lt;br /&gt;
[[Category:Open Firmware]]&lt;br /&gt;
[[Category:PowerPC Macs]]&lt;br /&gt;
[[Category:Classic Mac OS]]&lt;/div&gt;</summary>
		<author><name>Huntertur</name></author>
	</entry>
	<entry>
		<id>https://computers.huntertur.net/index.php?title=Classic_Mac_OS_debugging_output&amp;diff=1075</id>
		<title>Classic Mac OS debugging output</title>
		<link rel="alternate" type="text/html" href="https://computers.huntertur.net/index.php?title=Classic_Mac_OS_debugging_output&amp;diff=1075"/>
		<updated>2025-09-26T04:50:04Z</updated>

		<summary type="html">&lt;p&gt;Huntertur: /* Notes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;You can make the Classic Mac OS dump a bunch of debugging output to Open Firmware during boot and sometimes the screen after boot.&lt;br /&gt;
&lt;br /&gt;
To do this, open Open Firmware during boot with Command-Option-O-F and enter &amp;lt;code&amp;gt;dev / 3013FFF encode-int &amp;quot; AAPL,debug&amp;quot; property&amp;lt;/code&amp;gt;. Then, boot with &amp;lt;code&amp;gt;mac-boot&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If you want a log of this output, you should hook your machine up to the local network, then run this, replacing the IP address with whatever is available for the machine to use:&lt;br /&gt;
&lt;br /&gt;
 dev /packages/telnet&lt;br /&gt;
 &amp;quot; enet:telnet,192.168.18.10&amp;quot; io&lt;br /&gt;
&lt;br /&gt;
Then connect to your machine via Telnet before booting.&lt;br /&gt;
&lt;br /&gt;
== Bitflags ==&lt;br /&gt;
From the beginning of the debugging output:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
AAPL,debug bit settings (-OR- bits together):&lt;br /&gt;
       1 * = Print general informative messages.&lt;br /&gt;
       2 * = Print formatted Mac OS tables (except config/universal info).&lt;br /&gt;
       4 * = Print formatted config info table.&lt;br /&gt;
       8 * = Dump Mac OS tables (except config/universal info).&lt;br /&gt;
      10 * = Print node names while copying the device tree.&lt;br /&gt;
      20 * = Print property info while copying the device tree.&lt;br /&gt;
      40 * = Print interrupt-related info.&lt;br /&gt;
      80 * = Print interrupt tree traversal info.&lt;br /&gt;
     100 * = Print address resolution info.&lt;br /&gt;
     200 * = Print NV-RAM info.&lt;br /&gt;
     400 * = Print Mac OS &amp;quot;universal&amp;quot; info.&lt;br /&gt;
     800 * = Print &amp;quot;special&amp;quot; node info.&lt;br /&gt;
    1000 * = Load EtherPrintf utility via parcel for post FCode debugging.&lt;br /&gt;
    2000 * = Print BOOTP/DHCP/BSDP information.&lt;br /&gt;
    4000   = Allocate writable ROM aperture.&lt;br /&gt;
    8000   = Mark Toolbox image as non-cacheable.&lt;br /&gt;
   10000 * = Print parcel info while copying the device tree.&lt;br /&gt;
   20000   = Print information on device tree data checksums.&lt;br /&gt;
 1000000 * = Enable the Nanokernel debugger.&lt;br /&gt;
 2000000 * = Display the Nanokernel log during boot.&lt;br /&gt;
10000000   = Dont attempt to unhibernate system.&lt;br /&gt;
40000000   = Halt after end of FCode (useful if outputting to screen).&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
* This does not work on a tray-loading iMac G3 because &amp;lt;code&amp;gt;/packages/telnet&amp;lt;/code&amp;gt; does not exist.&lt;br /&gt;
* The screen will become blank after connecting from the client machine. The screen will come back to life once booting begins.&lt;br /&gt;
* &lt;br /&gt;
&lt;br /&gt;
[[Category:Guides]]&lt;br /&gt;
[[Category:Open Firmware]]&lt;br /&gt;
[[Category:PowerPC Macs]]&lt;br /&gt;
[[Category:Classic Mac OS]]&lt;/div&gt;</summary>
		<author><name>Huntertur</name></author>
	</entry>
	<entry>
		<id>https://computers.huntertur.net/index.php?title=Classic_Mac_OS_debugging_output&amp;diff=1074</id>
		<title>Classic Mac OS debugging output</title>
		<link rel="alternate" type="text/html" href="https://computers.huntertur.net/index.php?title=Classic_Mac_OS_debugging_output&amp;diff=1074"/>
		<updated>2025-09-26T04:41:08Z</updated>

		<summary type="html">&lt;p&gt;Huntertur: Add bitflags&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;You can make the Classic Mac OS dump a bunch of debugging output to Open Firmware during boot and sometimes the screen after boot.&lt;br /&gt;
&lt;br /&gt;
To do this, open Open Firmware during boot with Command-Option-O-F and enter &amp;lt;code&amp;gt;dev / 3013FFF encode-int &amp;quot; AAPL,debug&amp;quot; property&amp;lt;/code&amp;gt;. Then, boot with &amp;lt;code&amp;gt;mac-boot&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If you want a log of this output, you should hook your machine up to the local network, then run this, replacing the IP address with whatever is available for the machine to use:&lt;br /&gt;
&lt;br /&gt;
 dev /packages/telnet&lt;br /&gt;
 &amp;quot; enet:telnet,192.168.18.10&amp;quot; io&lt;br /&gt;
&lt;br /&gt;
Then connect to your machine via Telnet before booting.&lt;br /&gt;
&lt;br /&gt;
== Bitflags ==&lt;br /&gt;
From the beginning of the debugging output:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
AAPL,debug bit settings (-OR- bits together):&lt;br /&gt;
       1 * = Print general informative messages.&lt;br /&gt;
       2 * = Print formatted Mac OS tables (except config/universal info).&lt;br /&gt;
       4 * = Print formatted config info table.&lt;br /&gt;
       8 * = Dump Mac OS tables (except config/universal info).&lt;br /&gt;
      10 * = Print node names while copying the device tree.&lt;br /&gt;
      20 * = Print property info while copying the device tree.&lt;br /&gt;
      40 * = Print interrupt-related info.&lt;br /&gt;
      80 * = Print interrupt tree traversal info.&lt;br /&gt;
     100 * = Print address resolution info.&lt;br /&gt;
     200 * = Print NV-RAM info.&lt;br /&gt;
     400 * = Print Mac OS &amp;quot;universal&amp;quot; info.&lt;br /&gt;
     800 * = Print &amp;quot;special&amp;quot; node info.&lt;br /&gt;
    1000 * = Load EtherPrintf utility via parcel for post FCode debugging.&lt;br /&gt;
    2000 * = Print BOOTP/DHCP/BSDP information.&lt;br /&gt;
    4000   = Allocate writable ROM aperture.&lt;br /&gt;
    8000   = Mark Toolbox image as non-cacheable.&lt;br /&gt;
   10000 * = Print parcel info while copying the device tree.&lt;br /&gt;
   20000   = Print information on device tree data checksums.&lt;br /&gt;
 1000000 * = Enable the Nanokernel debugger.&lt;br /&gt;
 2000000 * = Display the Nanokernel log during boot.&lt;br /&gt;
10000000   = Dont attempt to unhibernate system.&lt;br /&gt;
40000000   = Halt after end of FCode (useful if outputting to screen).&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
* This does not work on a tray-loading iMac G3 because &amp;lt;code&amp;gt;/packages/telnet&amp;lt;/code&amp;gt; does not exist.&lt;br /&gt;
* The screen will become blank after connecting from the client machine.&lt;br /&gt;
&lt;br /&gt;
[[Category:Guides]]&lt;br /&gt;
[[Category:Open Firmware]]&lt;br /&gt;
[[Category:PowerPC Macs]]&lt;br /&gt;
[[Category:Classic Mac OS]]&lt;/div&gt;</summary>
		<author><name>Huntertur</name></author>
	</entry>
	<entry>
		<id>https://computers.huntertur.net/index.php?title=Classic_Mac_OS_debugging_output&amp;diff=1073</id>
		<title>Classic Mac OS debugging output</title>
		<link rel="alternate" type="text/html" href="https://computers.huntertur.net/index.php?title=Classic_Mac_OS_debugging_output&amp;diff=1073"/>
		<updated>2025-09-26T04:35:23Z</updated>

		<summary type="html">&lt;p&gt;Huntertur: Change example IP&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;You can make the Classic Mac OS dump a bunch of debugging output to Open Firmware during boot and sometimes the screen after boot.&lt;br /&gt;
&lt;br /&gt;
To do this, open Open Firmware during boot with Command-Option-O-F and enter &amp;lt;code&amp;gt;dev / 3013FFF encode-int &amp;quot; AAPL,debug&amp;quot; property&amp;lt;/code&amp;gt;. Then, boot with &amp;lt;code&amp;gt;mac-boot&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If you want a log of this output, you should hook your machine up to the local network, then run this, replacing the IP address with whatever is available for the machine to use:&lt;br /&gt;
&lt;br /&gt;
 dev /packages/telnet&lt;br /&gt;
 &amp;quot; enet:telnet,192.168.18.10&amp;quot; io&lt;br /&gt;
&lt;br /&gt;
Then connect to your machine via Telnet before booting.&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
* This does not work on a tray-loading iMac G3 because &amp;lt;code&amp;gt;/packages/telnet&amp;lt;/code&amp;gt; does not exist.&lt;br /&gt;
* The screen will become blank after connecting from the client machine.&lt;br /&gt;
&lt;br /&gt;
[[Category:Guides]]&lt;br /&gt;
[[Category:Open Firmware]]&lt;br /&gt;
[[Category:PowerPC Macs]]&lt;br /&gt;
[[Category:Classic Mac OS]]&lt;/div&gt;</summary>
		<author><name>Huntertur</name></author>
	</entry>
	<entry>
		<id>https://computers.huntertur.net/index.php?title=Classic_Mac_OS_debugging_output&amp;diff=1072</id>
		<title>Classic Mac OS debugging output</title>
		<link rel="alternate" type="text/html" href="https://computers.huntertur.net/index.php?title=Classic_Mac_OS_debugging_output&amp;diff=1072"/>
		<updated>2025-09-26T04:33:54Z</updated>

		<summary type="html">&lt;p&gt;Huntertur: Change dev command to better one&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;You can make the Classic Mac OS dump a bunch of debugging output to Open Firmware during boot and sometimes the screen after boot.&lt;br /&gt;
&lt;br /&gt;
To do this, open Open Firmware during boot with Command-Option-O-F and enter &amp;lt;code&amp;gt;dev / 3013FFF encode-int &amp;quot; AAPL,debug&amp;quot; property&amp;lt;/code&amp;gt;. Then, boot with &amp;lt;code&amp;gt;mac-boot&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If you want a log of this output, you should hook your machine up to the local network, then run this, replacing the IP address with whatever is available for the machine to use:&lt;br /&gt;
&lt;br /&gt;
 dev /packages/telnet&lt;br /&gt;
 &amp;quot; enet:telnet,10.42.0.10&amp;quot; io&lt;br /&gt;
&lt;br /&gt;
Then connect to your machine via Telnet before booting.&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
* This does not work on a tray-loading iMac G3 because &amp;lt;code&amp;gt;/packages/telnet&amp;lt;/code&amp;gt; does not exist.&lt;br /&gt;
* The screen will become blank after connecting from the client machine.&lt;br /&gt;
&lt;br /&gt;
[[Category:Guides]]&lt;br /&gt;
[[Category:Open Firmware]]&lt;br /&gt;
[[Category:PowerPC Macs]]&lt;br /&gt;
[[Category:Classic Mac OS]]&lt;/div&gt;</summary>
		<author><name>Huntertur</name></author>
	</entry>
	<entry>
		<id>https://computers.huntertur.net/index.php?title=Classic_Mac_OS_debugging_output&amp;diff=1071</id>
		<title>Classic Mac OS debugging output</title>
		<link rel="alternate" type="text/html" href="https://computers.huntertur.net/index.php?title=Classic_Mac_OS_debugging_output&amp;diff=1071"/>
		<updated>2025-09-26T04:33:25Z</updated>

		<summary type="html">&lt;p&gt;Huntertur: /* Notes */ Note screen blanking&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;You can make the Classic Mac OS dump a bunch of debugging output to Open Firmware during boot and sometimes the screen after boot.&lt;br /&gt;
&lt;br /&gt;
To do this, open Open Firmware during boot with Command-Option-O-F and enter &amp;lt;code&amp;gt;dev / 3013FFF encode-int &amp;quot; AAPL,debug&amp;quot; property&amp;lt;/code&amp;gt;. Then, boot with &amp;lt;code&amp;gt;mac-boot&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If you want a log of this output, you should hook your machine up to the local network, then run this, replacing the IP address with whatever is available for the machine to use:&lt;br /&gt;
&lt;br /&gt;
 dev /packages ls&lt;br /&gt;
 &amp;quot; enet:telnet,10.42.0.10&amp;quot; io&lt;br /&gt;
&lt;br /&gt;
Then connect to your machine via Telnet before booting.&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
* This does not work on a tray-loading iMac G3 because &amp;lt;code&amp;gt;/packages/telnet&amp;lt;/code&amp;gt; does not exist.&lt;br /&gt;
* The screen will become blank after connecting from the client machine.&lt;br /&gt;
&lt;br /&gt;
[[Category:Guides]]&lt;br /&gt;
[[Category:Open Firmware]]&lt;br /&gt;
[[Category:PowerPC Macs]]&lt;br /&gt;
[[Category:Classic Mac OS]]&lt;/div&gt;</summary>
		<author><name>Huntertur</name></author>
	</entry>
	<entry>
		<id>https://computers.huntertur.net/index.php?title=Classic_Mac_OS_debugging_output&amp;diff=1070</id>
		<title>Classic Mac OS debugging output</title>
		<link rel="alternate" type="text/html" href="https://computers.huntertur.net/index.php?title=Classic_Mac_OS_debugging_output&amp;diff=1070"/>
		<updated>2025-09-26T04:27:48Z</updated>

		<summary type="html">&lt;p&gt;Huntertur: Note failure on tray-loading iMac G3&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;You can make the Classic Mac OS dump a bunch of debugging output to Open Firmware during boot and sometimes the screen after boot.&lt;br /&gt;
&lt;br /&gt;
To do this, open Open Firmware during boot with Command-Option-O-F and enter &amp;lt;code&amp;gt;dev / 3013FFF encode-int &amp;quot; AAPL,debug&amp;quot; property&amp;lt;/code&amp;gt;. Then, boot with &amp;lt;code&amp;gt;mac-boot&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If you want a log of this output, you should hook your machine up to the local network, then run this, replacing the IP address with whatever is available for the machine to use:&lt;br /&gt;
&lt;br /&gt;
 dev /packages ls&lt;br /&gt;
 &amp;quot; enet:telnet,10.42.0.10&amp;quot; io&lt;br /&gt;
&lt;br /&gt;
Then connect to your machine via Telnet before booting.&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
* This does not work on a tray-loading iMac G3 because &amp;lt;code&amp;gt;/packages/telnet&amp;lt;/code&amp;gt; does not exist.&lt;br /&gt;
&lt;br /&gt;
[[Category:Guides]]&lt;br /&gt;
[[Category:Open Firmware]]&lt;br /&gt;
[[Category:PowerPC Macs]]&lt;br /&gt;
[[Category:Classic Mac OS]]&lt;/div&gt;</summary>
		<author><name>Huntertur</name></author>
	</entry>
	<entry>
		<id>https://computers.huntertur.net/index.php?title=Mac_OS_9_Software_Update&amp;diff=1069</id>
		<title>Mac OS 9 Software Update</title>
		<link rel="alternate" type="text/html" href="https://computers.huntertur.net/index.php?title=Mac_OS_9_Software_Update&amp;diff=1069"/>
		<updated>2025-09-26T04:00:36Z</updated>

		<summary type="html">&lt;p&gt;Huntertur: /* Log format */ Convert to Template:Resource&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Scattered notes on reverse engineering how the &#039;&#039;&#039;Mac OS 9 Software Update&#039;&#039;&#039; system works.&lt;br /&gt;
&lt;br /&gt;
== URL? ==&lt;br /&gt;
&lt;br /&gt;
In the Software Update Engine extension, resource {{Resource|ulsu|128}} has this URL:&lt;br /&gt;
&lt;br /&gt;
* http://si.info.apple.com/updates/scanningpoints1_2.xml&lt;br /&gt;
&lt;br /&gt;
Unfortunately, no samples of this XML file seem to be archived anywhere.&lt;br /&gt;
&lt;br /&gt;
== XML templates ==&lt;br /&gt;
[[Image:Software Update Engine 30090.png|thumb|right|Pieces of a possible request or response format]]&lt;br /&gt;
Hints at the data structures used for requests, responses, and logging.&lt;br /&gt;
&lt;br /&gt;
=== Log format ===&lt;br /&gt;
&lt;br /&gt;
From {{Resource|STR#|20000}}, then prettyprinted. Caret-prefixed numbers are template placeholders.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;DOCUMENT&amp;gt;&lt;br /&gt;
    &amp;lt;VERSION&amp;gt;0&amp;lt;/VERSION&amp;gt;&lt;br /&gt;
    &amp;lt;LOG&amp;gt;&lt;br /&gt;
        &amp;lt;DATE&amp;gt;^0&amp;lt;/DATE&amp;gt;&lt;br /&gt;
        &amp;lt;NAME&amp;gt;^1&amp;lt;/NAME&amp;gt;&lt;br /&gt;
        &amp;lt;VERSION&amp;gt;^2&amp;lt;/VERSION&amp;gt;&lt;br /&gt;
        &amp;lt;STATUS&amp;gt;^3&amp;lt;/STATUS&amp;gt;&lt;br /&gt;
    &amp;lt;/LOG&amp;gt;&lt;br /&gt;
    &amp;lt;!-- additional log entries... --&amp;gt;&lt;br /&gt;
&amp;lt;/DOCUMENT&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Network traffic? ==&lt;br /&gt;
&lt;br /&gt;
I have not done any disassembly yet, so these notes come from poking around in ResEdit.&lt;br /&gt;
&lt;br /&gt;
* Files may have used binhex, StuffIt, and self-extracting archives.&amp;lt;ref&amp;gt;Software Update Extension, resource {{Resource|STR#|-20905|Status Strings}}, string 14: &amp;quot;Debinhexing...&amp;quot;&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Software Update Extension, resource {{Resource|STR#|2110}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Though the baked-in URL is &amp;lt;code&amp;gt;http://&amp;lt;/code&amp;gt;, the following are likely also supported: &amp;lt;code&amp;gt;ftp://&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;https://&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;urlproxy:&amp;lt;/code&amp;gt; (?), and &amp;lt;code&amp;gt;file:///&amp;lt;/code&amp;gt;.&amp;lt;ref&amp;gt;Software Update Extension, resource {{Resource|STR#|-20902|Subwoofer Schemes}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
* User-Agent is &amp;quot;URL_Access/2.1 (Macintosh; PPC)&amp;quot;&amp;lt;ref&amp;gt;Software Update Extension, resource {{Resource|STR |-20902|User Agent String}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Classic Mac OS]]&lt;/div&gt;</summary>
		<author><name>Huntertur</name></author>
	</entry>
	<entry>
		<id>https://computers.huntertur.net/index.php?title=Mac_OS_9_Software_Update&amp;diff=1068</id>
		<title>Mac OS 9 Software Update</title>
		<link rel="alternate" type="text/html" href="https://computers.huntertur.net/index.php?title=Mac_OS_9_Software_Update&amp;diff=1068"/>
		<updated>2025-09-26T03:59:08Z</updated>

		<summary type="html">&lt;p&gt;Huntertur: Use Template:Resource&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Scattered notes on reverse engineering how the &#039;&#039;&#039;Mac OS 9 Software Update&#039;&#039;&#039; system works.&lt;br /&gt;
&lt;br /&gt;
== URL? ==&lt;br /&gt;
&lt;br /&gt;
In the Software Update Engine extension, resource {{Resource|ulsu|128}} has this URL:&lt;br /&gt;
&lt;br /&gt;
* http://si.info.apple.com/updates/scanningpoints1_2.xml&lt;br /&gt;
&lt;br /&gt;
Unfortunately, no samples of this XML file seem to be archived anywhere.&lt;br /&gt;
&lt;br /&gt;
== XML templates ==&lt;br /&gt;
[[Image:Software Update Engine 30090.png|thumb|right|Pieces of a possible request or response format]]&lt;br /&gt;
Hints at the data structures used for requests, responses, and logging.&lt;br /&gt;
&lt;br /&gt;
=== Log format ===&lt;br /&gt;
&lt;br /&gt;
From &amp;lt;code&amp;gt;STR#&amp;lt;/code&amp;gt; ID = 20000, then prettyprinted. Caret-prefixed numbers are template placeholders.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;DOCUMENT&amp;gt;&lt;br /&gt;
    &amp;lt;VERSION&amp;gt;0&amp;lt;/VERSION&amp;gt;&lt;br /&gt;
    &amp;lt;LOG&amp;gt;&lt;br /&gt;
        &amp;lt;DATE&amp;gt;^0&amp;lt;/DATE&amp;gt;&lt;br /&gt;
        &amp;lt;NAME&amp;gt;^1&amp;lt;/NAME&amp;gt;&lt;br /&gt;
        &amp;lt;VERSION&amp;gt;^2&amp;lt;/VERSION&amp;gt;&lt;br /&gt;
        &amp;lt;STATUS&amp;gt;^3&amp;lt;/STATUS&amp;gt;&lt;br /&gt;
    &amp;lt;/LOG&amp;gt;&lt;br /&gt;
    &amp;lt;!-- additional log entries... --&amp;gt;&lt;br /&gt;
&amp;lt;/DOCUMENT&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Network traffic? ==&lt;br /&gt;
&lt;br /&gt;
I have not done any disassembly yet, so these notes come from poking around in ResEdit.&lt;br /&gt;
&lt;br /&gt;
* Files may have used binhex, StuffIt, and self-extracting archives.&amp;lt;ref&amp;gt;Software Update Extension, resource {{Resource|STR#|-20905|Status Strings}}, string 14: &amp;quot;Debinhexing...&amp;quot;&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Software Update Extension, resource {{Resource|STR#|2110}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Though the baked-in URL is &amp;lt;code&amp;gt;http://&amp;lt;/code&amp;gt;, the following are likely also supported: &amp;lt;code&amp;gt;ftp://&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;https://&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;urlproxy:&amp;lt;/code&amp;gt; (?), and &amp;lt;code&amp;gt;file:///&amp;lt;/code&amp;gt;.&amp;lt;ref&amp;gt;Software Update Extension, resource {{Resource|STR#|-20902|Subwoofer Schemes}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
* User-Agent is &amp;quot;URL_Access/2.1 (Macintosh; PPC)&amp;quot;&amp;lt;ref&amp;gt;Software Update Extension, resource {{Resource|STR |-20902|User Agent String}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Classic Mac OS]]&lt;/div&gt;</summary>
		<author><name>Huntertur</name></author>
	</entry>
	<entry>
		<id>https://computers.huntertur.net/index.php?title=Template:Resource&amp;diff=1067</id>
		<title>Template:Resource</title>
		<link rel="alternate" type="text/html" href="https://computers.huntertur.net/index.php?title=Template:Resource&amp;diff=1067"/>
		<updated>2025-09-26T03:58:52Z</updated>

		<summary type="html">&lt;p&gt;Huntertur: Fix display of small resource names&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;code&amp;gt;{{padright:{{{1}}}|4| }}&amp;lt;/code&amp;gt; {{#if:{{{2|}}}|ID = {{{2}}}}} {{#if:{{{3|}}}|({{{3}}})}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
&amp;lt;templatedata&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	&amp;quot;params&amp;quot;: {&lt;br /&gt;
		&amp;quot;1&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;Resource type&amp;quot;,&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;The four-character resource type&amp;quot;,&lt;br /&gt;
			&amp;quot;example&amp;quot;: &amp;quot;STR#&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
			&amp;quot;required&amp;quot;: true&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;2&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;Resource ID&amp;quot;,&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;Numeric ID of this resource&amp;quot;,&lt;br /&gt;
			&amp;quot;example&amp;quot;: &amp;quot;-20905&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;number&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;3&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;Resource name&amp;quot;,&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;Name for this resource ID&amp;quot;,&lt;br /&gt;
			&amp;quot;example&amp;quot;: &amp;quot;Status Strings&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
		}&lt;br /&gt;
	},&lt;br /&gt;
	&amp;quot;description&amp;quot;: &amp;quot;Display classic Mac OS resource IDs in a consistent way.&amp;quot;,&lt;br /&gt;
	&amp;quot;paramOrder&amp;quot;: [&lt;br /&gt;
		&amp;quot;1&amp;quot;,&lt;br /&gt;
		&amp;quot;2&amp;quot;,&lt;br /&gt;
		&amp;quot;3&amp;quot;&lt;br /&gt;
	],&lt;br /&gt;
	&amp;quot;format&amp;quot;: &amp;quot;inline&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/templatedata&amp;gt;&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Huntertur</name></author>
	</entry>
	<entry>
		<id>https://computers.huntertur.net/index.php?title=Template:Resource&amp;diff=1066</id>
		<title>Template:Resource</title>
		<link rel="alternate" type="text/html" href="https://computers.huntertur.net/index.php?title=Template:Resource&amp;diff=1066"/>
		<updated>2025-09-26T03:50:03Z</updated>

		<summary type="html">&lt;p&gt;Huntertur: Move spaces outside if-blocks&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;code&amp;gt;{{{1}}}&amp;lt;/code&amp;gt; {{#if:{{{2|}}}|ID = {{{2}}}}} {{#if:{{{3|}}}|({{{3}}})}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
&amp;lt;templatedata&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	&amp;quot;params&amp;quot;: {&lt;br /&gt;
		&amp;quot;1&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;Resource type&amp;quot;,&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;The four-character resource type&amp;quot;,&lt;br /&gt;
			&amp;quot;example&amp;quot;: &amp;quot;STR#&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
			&amp;quot;required&amp;quot;: true&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;2&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;Resource ID&amp;quot;,&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;Numeric ID of this resource&amp;quot;,&lt;br /&gt;
			&amp;quot;example&amp;quot;: &amp;quot;-20905&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;number&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;3&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;Resource name&amp;quot;,&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;Name for this resource ID&amp;quot;,&lt;br /&gt;
			&amp;quot;example&amp;quot;: &amp;quot;Status Strings&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
		}&lt;br /&gt;
	},&lt;br /&gt;
	&amp;quot;description&amp;quot;: &amp;quot;Display classic Mac OS resource IDs in a consistent way.&amp;quot;,&lt;br /&gt;
	&amp;quot;paramOrder&amp;quot;: [&lt;br /&gt;
		&amp;quot;1&amp;quot;,&lt;br /&gt;
		&amp;quot;2&amp;quot;,&lt;br /&gt;
		&amp;quot;3&amp;quot;&lt;br /&gt;
	],&lt;br /&gt;
	&amp;quot;format&amp;quot;: &amp;quot;inline&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/templatedata&amp;gt;&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Huntertur</name></author>
	</entry>
	<entry>
		<id>https://computers.huntertur.net/index.php?title=Template:Resource&amp;diff=1065</id>
		<title>Template:Resource</title>
		<link rel="alternate" type="text/html" href="https://computers.huntertur.net/index.php?title=Template:Resource&amp;diff=1065"/>
		<updated>2025-09-26T03:48:47Z</updated>

		<summary type="html">&lt;p&gt;Huntertur: Create template&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;code&amp;gt;{{{1}}}&amp;lt;/code&amp;gt;{{#if:{{{2|}}}| ID = {{{2}}}}}{{#if:{{{3|}}}| ({{{3}}})}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
&amp;lt;templatedata&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	&amp;quot;params&amp;quot;: {&lt;br /&gt;
		&amp;quot;1&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;Resource type&amp;quot;,&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;The four-character resource type&amp;quot;,&lt;br /&gt;
			&amp;quot;example&amp;quot;: &amp;quot;STR#&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
			&amp;quot;required&amp;quot;: true&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;2&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;Resource ID&amp;quot;,&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;Numeric ID of this resource&amp;quot;,&lt;br /&gt;
			&amp;quot;example&amp;quot;: &amp;quot;-20905&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;number&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;3&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;Resource name&amp;quot;,&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;Name for this resource ID&amp;quot;,&lt;br /&gt;
			&amp;quot;example&amp;quot;: &amp;quot;Status Strings&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
		}&lt;br /&gt;
	},&lt;br /&gt;
	&amp;quot;description&amp;quot;: &amp;quot;Display classic Mac OS resource IDs in a consistent way.&amp;quot;,&lt;br /&gt;
	&amp;quot;paramOrder&amp;quot;: [&lt;br /&gt;
		&amp;quot;1&amp;quot;,&lt;br /&gt;
		&amp;quot;2&amp;quot;,&lt;br /&gt;
		&amp;quot;3&amp;quot;&lt;br /&gt;
	],&lt;br /&gt;
	&amp;quot;format&amp;quot;: &amp;quot;inline&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/templatedata&amp;gt;&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Huntertur</name></author>
	</entry>
	<entry>
		<id>https://computers.huntertur.net/index.php?title=System_Error_Alert_Table&amp;diff=1064</id>
		<title>System Error Alert Table</title>
		<link rel="alternate" type="text/html" href="https://computers.huntertur.net/index.php?title=System_Error_Alert_Table&amp;diff=1064"/>
		<updated>2025-09-26T03:38:19Z</updated>

		<summary type="html">&lt;p&gt;Huntertur: /* Notes */ Improve note on text&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &#039;&#039;&#039;System Error Alert Table&#039;&#039;&#039; (resource type &#039;&#039;&#039;&amp;lt;code&amp;gt;DSAT&amp;lt;/code&amp;gt;&#039;&#039;&#039;, allegedly short for &#039;&#039;&#039;Deep Shit Alert Table&#039;&#039;&#039;) describes startup text and fatal error dialogs for the classic Mac OS.&lt;br /&gt;
&lt;br /&gt;
== Specification ==&lt;br /&gt;
&lt;br /&gt;
See [https://preterhuman.net/macstuff/insidemac/OSUtilities/OSUtilities-36.html Inside Macintosh: Operating System Utilities, Chapter 2 - System Error Handler, The System Error Alert Table Resource].&lt;br /&gt;
&lt;br /&gt;
== Reading it ==&lt;br /&gt;
&lt;br /&gt;
ResEdit doesn&#039;t support &amp;lt;code&amp;gt;DSAT&amp;lt;/code&amp;gt; and only shows a hex editor despite having a custom icon for the resource type.&lt;br /&gt;
&lt;br /&gt;
Here is an extremely rough Python script for dumping the alerts, their IDs, and their error messages. Despite DSAT definitions being polymorphic, there is no type information, so it determines what is an alert by process of elimination (correct size, text pointers are valid, pointed-to text is ASCII). Copy-paste the hex editor output from ResEdit into a text file, then pass its filename to this script:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;code&amp;gt;dsat.py&amp;lt;/code&amp;gt; contents&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
from argparse import ArgumentParser&lt;br /&gt;
from pathlib import Path&lt;br /&gt;
import struct&lt;br /&gt;
from typing import NamedTuple&lt;br /&gt;
&lt;br /&gt;
parser = ArgumentParser()&lt;br /&gt;
parser.add_argument(&#039;hexfilepath&#039;)&lt;br /&gt;
buffer = bytes.fromhex(Path(parser.parse_args().hexfilepath).read_text())&lt;br /&gt;
offset = 0&lt;br /&gt;
&lt;br /&gt;
def read_short():&lt;br /&gt;
    global offset&lt;br /&gt;
    number = int.from_bytes(buffer[offset:offset + 2])&lt;br /&gt;
    offset += 2&lt;br /&gt;
    return number&lt;br /&gt;
&lt;br /&gt;
definition_count = read_short()&lt;br /&gt;
definitions: dict[int, &#039;Definition&#039;]&lt;br /&gt;
&lt;br /&gt;
class Alert(NamedTuple):&lt;br /&gt;
    text1_id: int&lt;br /&gt;
    text2_id: int&lt;br /&gt;
    icon_id: int&lt;br /&gt;
    proc_id: int&lt;br /&gt;
    button_layout_id: int&lt;br /&gt;
&lt;br /&gt;
    @property&lt;br /&gt;
    def text1(self):&lt;br /&gt;
        return definitions[self.text1_id].as_text().replace(&#039;/&#039;, &#039;\n&#039;) if self.text1_id else None&lt;br /&gt;
&lt;br /&gt;
    @property&lt;br /&gt;
    def text2(self):&lt;br /&gt;
        return definitions[self.text2_id].as_text().replace(&#039;/&#039;, &#039;\n&#039;) if self.text2_id else None&lt;br /&gt;
&lt;br /&gt;
    @property&lt;br /&gt;
    def text(self):&lt;br /&gt;
        if not self.text1:&lt;br /&gt;
            return None&lt;br /&gt;
&lt;br /&gt;
        if self.text2:&lt;br /&gt;
            return self.text1 + &#039;\n&#039; + self.text2&lt;br /&gt;
&lt;br /&gt;
        return self.text1&lt;br /&gt;
&lt;br /&gt;
class Definition(NamedTuple):&lt;br /&gt;
    id: int&lt;br /&gt;
    data: bytes&lt;br /&gt;
&lt;br /&gt;
    def as_alert(self):&lt;br /&gt;
        return Alert(*struct.unpack(&#039;&amp;gt;HHHHH&#039;, self.data))&lt;br /&gt;
&lt;br /&gt;
    def as_text(self):&lt;br /&gt;
        return self.data[4:-1].decode(&#039;ascii&#039;)&lt;br /&gt;
&lt;br /&gt;
def read_definition():&lt;br /&gt;
    global offset&lt;br /&gt;
    id = read_short()&lt;br /&gt;
    length = read_short()&lt;br /&gt;
    data = buffer[offset:offset + length]&lt;br /&gt;
    offset += length&lt;br /&gt;
    return Definition(id, data)&lt;br /&gt;
&lt;br /&gt;
default_alert = read_definition().as_alert()&lt;br /&gt;
definitions = {(definition := read_definition()).id: definition&lt;br /&gt;
               for _ in range(definition_count)}&lt;br /&gt;
&lt;br /&gt;
for error_id, definition in definitions.items():&lt;br /&gt;
    if len(definition.data) == 10:&lt;br /&gt;
        alert = definition.as_alert()&lt;br /&gt;
        try:&lt;br /&gt;
            print(error_id, &#039;-&#039;, alert.text)&lt;br /&gt;
        except (KeyError, UnicodeDecodeError):&lt;br /&gt;
            pass&lt;br /&gt;
&lt;br /&gt;
print(&#039;Default - &#039;, default_alert.text)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
&lt;br /&gt;
* The System Error Alert Table isn&#039;t just for fatal errors! The text below shows that the Force Quit dialog, among other things, is implemented here.&lt;br /&gt;
* Sometimes, there is no error text, or the text is cut off; this is due to a custom procedure being used for that alert.&lt;br /&gt;
** Post-boot (when &amp;lt;code&amp;gt;DSAT&amp;lt;/code&amp;gt; ID = 2 is loaded), &amp;quot;out of memory&amp;quot;, &amp;quot;unimplemented trap&amp;quot;, and friends are printed by a procedure.&lt;br /&gt;
* Entries in the table are not in order.&lt;br /&gt;
* The &amp;quot;Power PC&amp;quot; and &amp;quot;System 9.2.2&amp;quot; typos are in the original text.&lt;br /&gt;
&lt;br /&gt;
== Contents in different system versions ==&lt;br /&gt;
&lt;br /&gt;
=== System Software 6.0.8 ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+ DSAT ID = 0&lt;br /&gt;
|-&lt;br /&gt;
! Error ID !! Text&lt;br /&gt;
|-&lt;br /&gt;
| 65526 || MacsBug installed.&lt;br /&gt;
|-&lt;br /&gt;
| 65525 ||&lt;br /&gt;
|-&lt;br /&gt;
| 102 || This startup disk will not work on this Macintosh model.  Use the latest Installer to update this disk for this model.  (System 6.0.8 does not work on this model; you need a newer version that does.)&lt;br /&gt;
|-&lt;br /&gt;
| 103 || This Macintosh is set for 32-bit addressing.  You may switch to 24-bit addressing and use this disk or restart and use a newer startup disk.  (System 6.0.8 does not work with 32-bit addressing.)&lt;br /&gt;
|-&lt;br /&gt;
| 101 || Sorry, a system error occurred.&lt;br /&gt;
&lt;br /&gt;
RAM parity&lt;br /&gt;
|-&lt;br /&gt;
| Default || Welcome to Macintosh.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+ DSAT ID = 2&lt;br /&gt;
|-&lt;br /&gt;
! Error ID !! Text&lt;br /&gt;
|-&lt;br /&gt;
| 30 || Please insert the disk:&lt;br /&gt;
|-&lt;br /&gt;
| 28 || Sorry, a system error occurred.&lt;br /&gt;
|-&lt;br /&gt;
| 26 || The following application is busy or damaged:&lt;br /&gt;
|-&lt;br /&gt;
| 42 || You may now switch off your Macintosh safely.&lt;br /&gt;
|-&lt;br /&gt;
| 20000 || If you wish to continue using your Macintosh, press Restart.  If not, press Shut Down.&lt;br /&gt;
|-&lt;br /&gt;
| 20001 || You may now switch off your Macintosh safely. If you wish to continue using your Macintosh, press Restart.&lt;br /&gt;
|-&lt;br /&gt;
| 20002 || Unsaved changes will be lost.&lt;br /&gt;
|-&lt;br /&gt;
| 101 || Sorry, a system error occurred.&lt;br /&gt;
&lt;br /&gt;
RAM parity&lt;br /&gt;
|-&lt;br /&gt;
| Default || Sorry, a system error occurred.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Mac OS 9.2.2 ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+ DSAT ID = 0&lt;br /&gt;
|-&lt;br /&gt;
! Error ID !! Text&lt;br /&gt;
|-&lt;br /&gt;
| 102 || This startup disk will not work on this Macintosh model.  Use the latest Installer to update this disk for this model.&lt;br /&gt;
|-&lt;br /&gt;
| 104 || This disk must be unlocked in order to perform one-time housekeeping.  If you wish to use this disk to start your Macintosh, unlock it.&lt;br /&gt;
|-&lt;br /&gt;
| 116 || This startup disk will not work on this computer. A Power PC based computer is required to startup from this disk.&lt;br /&gt;
|-&lt;br /&gt;
| 118 || The system software on the startup disk only functions on the original media, not if copied to another drive.&lt;br /&gt;
|-&lt;br /&gt;
| 105 || System 9.2.2 needs more memory to start up.&lt;br /&gt;
|-&lt;br /&gt;
| Default || Sorry, a system error occurred.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+ DSAT ID = 2&lt;br /&gt;
|-&lt;br /&gt;
! Error ID !! Text&lt;br /&gt;
|-&lt;br /&gt;
| 28 || Sorry, a system error occurred.&lt;br /&gt;
|-&lt;br /&gt;
| 25 || Not enough memory is available while using&lt;br /&gt;
|-&lt;br /&gt;
| 42 ||&lt;br /&gt;
|-&lt;br /&gt;
| 20000 || If you wish to continue using your Macintosh, press Restart.  If not, press Shut Down.&lt;br /&gt;
|-&lt;br /&gt;
| 20001 || It is now safe to switch off your Macintosh. If you wish to continue using your Macintosh, press Restart.&lt;br /&gt;
|-&lt;br /&gt;
| 20002 || Clicking Force Quit causes you to lose any unsaved changes. To avoid further problems, restart your computer after you click Force Quit.&lt;br /&gt;
|-&lt;br /&gt;
| 99 || The System file on this startup disk may be damaged.  The Installer can be used to repair this disk.&lt;br /&gt;
|-&lt;br /&gt;
| 98 || The System file on this startup device does not contain the resources necessary to boot this Macintosh.  Please use the Installer to update the System file.&lt;br /&gt;
|-&lt;br /&gt;
| 101 || Sorry, a system error occurred.&lt;br /&gt;
&lt;br /&gt;
RAM parity&lt;br /&gt;
|-&lt;br /&gt;
| 20010 || Hard Disk Cable Warning&lt;br /&gt;
&lt;br /&gt;
You must first shutdown the Macintosh before attaching any SCSI hard disk cables.  Disconnect the cable from the back of the machine right now.&lt;br /&gt;
|-&lt;br /&gt;
| 1010 || Code Fragment could not be prepared.&lt;br /&gt;
|-&lt;br /&gt;
| 1011 || Internal Mixed Mode failure.&lt;br /&gt;
|-&lt;br /&gt;
| Default || Sorry, a system error occurred.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:Classic Mac OS]]&lt;/div&gt;</summary>
		<author><name>Huntertur</name></author>
	</entry>
	<entry>
		<id>https://computers.huntertur.net/index.php?title=Mac_OS_9_Software_Update&amp;diff=1063</id>
		<title>Mac OS 9 Software Update</title>
		<link rel="alternate" type="text/html" href="https://computers.huntertur.net/index.php?title=Mac_OS_9_Software_Update&amp;diff=1063"/>
		<updated>2025-09-25T19:48:48Z</updated>

		<summary type="html">&lt;p&gt;Huntertur: /* Network traffic? */ Add User-Agent&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Scattered notes on reverse engineering how the &#039;&#039;&#039;Mac OS 9 Software Update&#039;&#039;&#039; system works.&lt;br /&gt;
&lt;br /&gt;
== URL? ==&lt;br /&gt;
&lt;br /&gt;
In the Software Update Engine extension, resource &amp;lt;code&amp;gt;ulsu&amp;lt;/code&amp;gt; ID = 128 has this URL:&lt;br /&gt;
&lt;br /&gt;
* http://si.info.apple.com/updates/scanningpoints1_2.xml&lt;br /&gt;
&lt;br /&gt;
Unfortunately, no samples of this XML file seem to be archived anywhere.&lt;br /&gt;
&lt;br /&gt;
== XML templates ==&lt;br /&gt;
[[Image:Software Update Engine 30090.png|thumb|right|Pieces of a possible request or response format]]&lt;br /&gt;
Hints at the data structures used for requests, responses, and logging.&lt;br /&gt;
&lt;br /&gt;
=== Log format ===&lt;br /&gt;
&lt;br /&gt;
From &amp;lt;code&amp;gt;STR#&amp;lt;/code&amp;gt; ID = 20000, then prettyprinted. Caret-prefixed numbers are template placeholders.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;DOCUMENT&amp;gt;&lt;br /&gt;
    &amp;lt;VERSION&amp;gt;0&amp;lt;/VERSION&amp;gt;&lt;br /&gt;
    &amp;lt;LOG&amp;gt;&lt;br /&gt;
        &amp;lt;DATE&amp;gt;^0&amp;lt;/DATE&amp;gt;&lt;br /&gt;
        &amp;lt;NAME&amp;gt;^1&amp;lt;/NAME&amp;gt;&lt;br /&gt;
        &amp;lt;VERSION&amp;gt;^2&amp;lt;/VERSION&amp;gt;&lt;br /&gt;
        &amp;lt;STATUS&amp;gt;^3&amp;lt;/STATUS&amp;gt;&lt;br /&gt;
    &amp;lt;/LOG&amp;gt;&lt;br /&gt;
    &amp;lt;!-- additional log entries... --&amp;gt;&lt;br /&gt;
&amp;lt;/DOCUMENT&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Network traffic? ==&lt;br /&gt;
&lt;br /&gt;
I have not done any disassembly yet, so these notes come from poking around in ResEdit.&lt;br /&gt;
&lt;br /&gt;
* Files may have used binhex, StuffIt, and self-extracting archives.&amp;lt;ref&amp;gt;Software Update Extension, resource &amp;lt;code&amp;gt;STR#&amp;lt;/code&amp;gt;, ID = -20905 (Status Strings), string 14: &amp;quot;Debinhexing...&amp;quot;&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Software Update Extension, resource &amp;lt;code&amp;gt;STR#&amp;lt;/code&amp;gt;, ID = 2110&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Though the baked-in URL is &amp;lt;code&amp;gt;http://&amp;lt;/code&amp;gt;, the following are likely also supported: &amp;lt;code&amp;gt;ftp://&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;https://&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;urlproxy:&amp;lt;/code&amp;gt; (?), and &amp;lt;code&amp;gt;file:///&amp;lt;/code&amp;gt;.&amp;lt;ref&amp;gt;Software Update Extension, resource &amp;lt;code&amp;gt;STR#&amp;lt;/code&amp;gt;, ID = -20902 (Subwoofer Schemes)&amp;lt;/ref&amp;gt;&lt;br /&gt;
* User-Agent is &amp;quot;URL_Access/2.1 (Macintosh; PPC)&amp;quot;&amp;lt;ref&amp;gt;Software Update Extension, resource &amp;lt;code&amp;gt;STR &amp;lt;/code&amp;gt;, ID = -20902 (User Agent String)&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Classic Mac OS]]&lt;/div&gt;</summary>
		<author><name>Huntertur</name></author>
	</entry>
	<entry>
		<id>https://computers.huntertur.net/index.php?title=Mac_OS_9_Software_Update&amp;diff=1062</id>
		<title>Mac OS 9 Software Update</title>
		<link rel="alternate" type="text/html" href="https://computers.huntertur.net/index.php?title=Mac_OS_9_Software_Update&amp;diff=1062"/>
		<updated>2025-09-25T19:38:21Z</updated>

		<summary type="html">&lt;p&gt;Huntertur: /* XML templates */ Add screenshot&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Scattered notes on reverse engineering how the &#039;&#039;&#039;Mac OS 9 Software Update&#039;&#039;&#039; system works.&lt;br /&gt;
&lt;br /&gt;
== URL? ==&lt;br /&gt;
&lt;br /&gt;
In the Software Update Engine extension, resource &amp;lt;code&amp;gt;ulsu&amp;lt;/code&amp;gt; ID = 128 has this URL:&lt;br /&gt;
&lt;br /&gt;
* http://si.info.apple.com/updates/scanningpoints1_2.xml&lt;br /&gt;
&lt;br /&gt;
Unfortunately, no samples of this XML file seem to be archived anywhere.&lt;br /&gt;
&lt;br /&gt;
== XML templates ==&lt;br /&gt;
[[Image:Software Update Engine 30090.png|thumb|right|Pieces of a possible request or response format]]&lt;br /&gt;
Hints at the data structures used for requests, responses, and logging.&lt;br /&gt;
&lt;br /&gt;
=== Log format ===&lt;br /&gt;
&lt;br /&gt;
From &amp;lt;code&amp;gt;STR#&amp;lt;/code&amp;gt; ID = 20000, then prettyprinted. Caret-prefixed numbers are template placeholders.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;DOCUMENT&amp;gt;&lt;br /&gt;
    &amp;lt;VERSION&amp;gt;0&amp;lt;/VERSION&amp;gt;&lt;br /&gt;
    &amp;lt;LOG&amp;gt;&lt;br /&gt;
        &amp;lt;DATE&amp;gt;^0&amp;lt;/DATE&amp;gt;&lt;br /&gt;
        &amp;lt;NAME&amp;gt;^1&amp;lt;/NAME&amp;gt;&lt;br /&gt;
        &amp;lt;VERSION&amp;gt;^2&amp;lt;/VERSION&amp;gt;&lt;br /&gt;
        &amp;lt;STATUS&amp;gt;^3&amp;lt;/STATUS&amp;gt;&lt;br /&gt;
    &amp;lt;/LOG&amp;gt;&lt;br /&gt;
    &amp;lt;!-- additional log entries... --&amp;gt;&lt;br /&gt;
&amp;lt;/DOCUMENT&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Network traffic? ==&lt;br /&gt;
&lt;br /&gt;
I have not done any disassembly yet, so these notes come from poking around in ResEdit.&lt;br /&gt;
&lt;br /&gt;
* Files may have used binhex, StuffIt, and self-extracting archives.&amp;lt;ref&amp;gt;Software Update Extension, resource &amp;lt;code&amp;gt;STR#&amp;lt;/code&amp;gt;, ID = -20905 (Status Strings), string 14: &amp;quot;Debinhexing...&amp;quot;&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Software Update Extension, resource &amp;lt;code&amp;gt;STR#&amp;lt;/code&amp;gt;, ID = 2110&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Though the baked-in URL is &amp;lt;code&amp;gt;http://&amp;lt;/code&amp;gt;, the following are likely also supported: &amp;lt;code&amp;gt;ftp://&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;https://&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;urlproxy:&amp;lt;/code&amp;gt; (?), and &amp;lt;code&amp;gt;file:///&amp;lt;/code&amp;gt;.&amp;lt;ref&amp;gt;Software Update Extension, resource &amp;lt;code&amp;gt;STR#&amp;lt;/code&amp;gt;, ID = -20902 (Subwoofer Schemes)&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Classic Mac OS]]&lt;/div&gt;</summary>
		<author><name>Huntertur</name></author>
	</entry>
	<entry>
		<id>https://computers.huntertur.net/index.php?title=File:Software_Update_Engine_30090.png&amp;diff=1061</id>
		<title>File:Software Update Engine 30090.png</title>
		<link rel="alternate" type="text/html" href="https://computers.huntertur.net/index.php?title=File:Software_Update_Engine_30090.png&amp;diff=1061"/>
		<updated>2025-09-25T19:36:36Z</updated>

		<summary type="html">&lt;p&gt;Huntertur: A screenshot of ResEdit for the Mac OS 9 Software Update Engine extension, &amp;lt;code&amp;gt;STR#&amp;lt;/code&amp;gt; ID = 30090.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Summary ==&lt;br /&gt;
A screenshot of ResEdit for the Mac OS 9 Software Update Engine extension, &amp;lt;code&amp;gt;STR#&amp;lt;/code&amp;gt; ID = 30090.&lt;/div&gt;</summary>
		<author><name>Huntertur</name></author>
	</entry>
	<entry>
		<id>https://computers.huntertur.net/index.php?title=Mac_OS_9_Software_Update&amp;diff=1060</id>
		<title>Mac OS 9 Software Update</title>
		<link rel="alternate" type="text/html" href="https://computers.huntertur.net/index.php?title=Mac_OS_9_Software_Update&amp;diff=1060"/>
		<updated>2025-09-25T19:01:30Z</updated>

		<summary type="html">&lt;p&gt;Huntertur: /* XML-ish templates */ Add log format&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Scattered notes on reverse engineering how the &#039;&#039;&#039;Mac OS 9 Software Update&#039;&#039;&#039; system works.&lt;br /&gt;
&lt;br /&gt;
== URL? ==&lt;br /&gt;
&lt;br /&gt;
In the Software Update Engine extension, resource &amp;lt;code&amp;gt;ulsu&amp;lt;/code&amp;gt; ID = 128 has this URL:&lt;br /&gt;
&lt;br /&gt;
* http://si.info.apple.com/updates/scanningpoints1_2.xml&lt;br /&gt;
&lt;br /&gt;
Unfortunately, no samples of this XML file seem to be archived anywhere.&lt;br /&gt;
&lt;br /&gt;
== XML templates ==&lt;br /&gt;
&lt;br /&gt;
Hints at the data structures used for requests, responses, and logging.&lt;br /&gt;
&lt;br /&gt;
=== Log format ===&lt;br /&gt;
&lt;br /&gt;
From &amp;lt;code&amp;gt;STR#&amp;lt;/code&amp;gt; ID = 20000, then prettyprinted. Caret-prefixed numbers are template placeholders.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;DOCUMENT&amp;gt;&lt;br /&gt;
    &amp;lt;VERSION&amp;gt;0&amp;lt;/VERSION&amp;gt;&lt;br /&gt;
    &amp;lt;LOG&amp;gt;&lt;br /&gt;
        &amp;lt;DATE&amp;gt;^0&amp;lt;/DATE&amp;gt;&lt;br /&gt;
        &amp;lt;NAME&amp;gt;^1&amp;lt;/NAME&amp;gt;&lt;br /&gt;
        &amp;lt;VERSION&amp;gt;^2&amp;lt;/VERSION&amp;gt;&lt;br /&gt;
        &amp;lt;STATUS&amp;gt;^3&amp;lt;/STATUS&amp;gt;&lt;br /&gt;
    &amp;lt;/LOG&amp;gt;&lt;br /&gt;
    &amp;lt;!-- additional log entries... --&amp;gt;&lt;br /&gt;
&amp;lt;/DOCUMENT&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Network traffic? ==&lt;br /&gt;
&lt;br /&gt;
I have not done any disassembly yet, so these notes come from poking around in ResEdit.&lt;br /&gt;
&lt;br /&gt;
* Files may have used binhex, StuffIt, and self-extracting archives.&amp;lt;ref&amp;gt;Software Update Extension, resource &amp;lt;code&amp;gt;STR#&amp;lt;/code&amp;gt;, ID = -20905 (Status Strings), string 14: &amp;quot;Debinhexing...&amp;quot;&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Software Update Extension, resource &amp;lt;code&amp;gt;STR#&amp;lt;/code&amp;gt;, ID = 2110&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Though the baked-in URL is &amp;lt;code&amp;gt;http://&amp;lt;/code&amp;gt;, the following are likely also supported: &amp;lt;code&amp;gt;ftp://&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;https://&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;urlproxy:&amp;lt;/code&amp;gt; (?), and &amp;lt;code&amp;gt;file:///&amp;lt;/code&amp;gt;.&amp;lt;ref&amp;gt;Software Update Extension, resource &amp;lt;code&amp;gt;STR#&amp;lt;/code&amp;gt;, ID = -20902 (Subwoofer Schemes)&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Classic Mac OS]]&lt;/div&gt;</summary>
		<author><name>Huntertur</name></author>
	</entry>
	<entry>
		<id>https://computers.huntertur.net/index.php?title=Mac_OS_9_Software_Update&amp;diff=1059</id>
		<title>Mac OS 9 Software Update</title>
		<link rel="alternate" type="text/html" href="https://computers.huntertur.net/index.php?title=Mac_OS_9_Software_Update&amp;diff=1059"/>
		<updated>2025-09-25T18:50:52Z</updated>

		<summary type="html">&lt;p&gt;Huntertur: Create page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Scattered notes on reverse engineering how the &#039;&#039;&#039;Mac OS 9 Software Update&#039;&#039;&#039; system works.&lt;br /&gt;
&lt;br /&gt;
== URL? ==&lt;br /&gt;
&lt;br /&gt;
In the Software Update Engine extension, resource &amp;lt;code&amp;gt;ulsu&amp;lt;/code&amp;gt; ID = 128 has this URL:&lt;br /&gt;
&lt;br /&gt;
* http://si.info.apple.com/updates/scanningpoints1_2.xml&lt;br /&gt;
&lt;br /&gt;
Unfortunately, no samples of this XML file seem to be archived anywhere.&lt;br /&gt;
&lt;br /&gt;
== XML-ish templates ==&lt;br /&gt;
&lt;br /&gt;
Hints at the data structures used for requests, responses, and logging.&lt;br /&gt;
&lt;br /&gt;
== Network traffic? ==&lt;br /&gt;
&lt;br /&gt;
I have not done any disassembly yet, so these notes come from poking around in ResEdit.&lt;br /&gt;
&lt;br /&gt;
* Files may have used binhex, StuffIt, and self-extracting archives.&amp;lt;ref&amp;gt;Software Update Extension, resource &amp;lt;code&amp;gt;STR#&amp;lt;/code&amp;gt;, ID = -20905 (Status Strings), string 14: &amp;quot;Debinhexing...&amp;quot;&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Software Update Extension, resource &amp;lt;code&amp;gt;STR#&amp;lt;/code&amp;gt;, ID = 2110&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Though the baked-in URL is &amp;lt;code&amp;gt;http://&amp;lt;/code&amp;gt;, the following are likely also supported: &amp;lt;code&amp;gt;ftp://&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;https://&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;urlproxy:&amp;lt;/code&amp;gt; (?), and &amp;lt;code&amp;gt;file:///&amp;lt;/code&amp;gt;.&amp;lt;ref&amp;gt;Software Update Extension, resource &amp;lt;code&amp;gt;STR#&amp;lt;/code&amp;gt;, ID = -20902 (Subwoofer Schemes)&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Classic Mac OS]]&lt;/div&gt;</summary>
		<author><name>Huntertur</name></author>
	</entry>
	<entry>
		<id>https://computers.huntertur.net/index.php?title=System_Error_Alert_Table&amp;diff=1058</id>
		<title>System Error Alert Table</title>
		<link rel="alternate" type="text/html" href="https://computers.huntertur.net/index.php?title=System_Error_Alert_Table&amp;diff=1058"/>
		<updated>2025-09-25T14:39:20Z</updated>

		<summary type="html">&lt;p&gt;Huntertur: /* Notes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &#039;&#039;&#039;System Error Alert Table&#039;&#039;&#039; (resource type &#039;&#039;&#039;&amp;lt;code&amp;gt;DSAT&amp;lt;/code&amp;gt;&#039;&#039;&#039;, allegedly short for &#039;&#039;&#039;Deep Shit Alert Table&#039;&#039;&#039;) describes startup text and fatal error dialogs for the classic Mac OS.&lt;br /&gt;
&lt;br /&gt;
== Specification ==&lt;br /&gt;
&lt;br /&gt;
See [https://preterhuman.net/macstuff/insidemac/OSUtilities/OSUtilities-36.html Inside Macintosh: Operating System Utilities, Chapter 2 - System Error Handler, The System Error Alert Table Resource].&lt;br /&gt;
&lt;br /&gt;
== Reading it ==&lt;br /&gt;
&lt;br /&gt;
ResEdit doesn&#039;t support &amp;lt;code&amp;gt;DSAT&amp;lt;/code&amp;gt; and only shows a hex editor despite having a custom icon for the resource type.&lt;br /&gt;
&lt;br /&gt;
Here is an extremely rough Python script for dumping the alerts, their IDs, and their error messages. Despite DSAT definitions being polymorphic, there is no type information, so it determines what is an alert by process of elimination (correct size, text pointers are valid, pointed-to text is ASCII). Copy-paste the hex editor output from ResEdit into a text file, then pass its filename to this script:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;code&amp;gt;dsat.py&amp;lt;/code&amp;gt; contents&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
from argparse import ArgumentParser&lt;br /&gt;
from pathlib import Path&lt;br /&gt;
import struct&lt;br /&gt;
from typing import NamedTuple&lt;br /&gt;
&lt;br /&gt;
parser = ArgumentParser()&lt;br /&gt;
parser.add_argument(&#039;hexfilepath&#039;)&lt;br /&gt;
buffer = bytes.fromhex(Path(parser.parse_args().hexfilepath).read_text())&lt;br /&gt;
offset = 0&lt;br /&gt;
&lt;br /&gt;
def read_short():&lt;br /&gt;
    global offset&lt;br /&gt;
    number = int.from_bytes(buffer[offset:offset + 2])&lt;br /&gt;
    offset += 2&lt;br /&gt;
    return number&lt;br /&gt;
&lt;br /&gt;
definition_count = read_short()&lt;br /&gt;
definitions: dict[int, &#039;Definition&#039;]&lt;br /&gt;
&lt;br /&gt;
class Alert(NamedTuple):&lt;br /&gt;
    text1_id: int&lt;br /&gt;
    text2_id: int&lt;br /&gt;
    icon_id: int&lt;br /&gt;
    proc_id: int&lt;br /&gt;
    button_layout_id: int&lt;br /&gt;
&lt;br /&gt;
    @property&lt;br /&gt;
    def text1(self):&lt;br /&gt;
        return definitions[self.text1_id].as_text().replace(&#039;/&#039;, &#039;\n&#039;) if self.text1_id else None&lt;br /&gt;
&lt;br /&gt;
    @property&lt;br /&gt;
    def text2(self):&lt;br /&gt;
        return definitions[self.text2_id].as_text().replace(&#039;/&#039;, &#039;\n&#039;) if self.text2_id else None&lt;br /&gt;
&lt;br /&gt;
    @property&lt;br /&gt;
    def text(self):&lt;br /&gt;
        if not self.text1:&lt;br /&gt;
            return None&lt;br /&gt;
&lt;br /&gt;
        if self.text2:&lt;br /&gt;
            return self.text1 + &#039;\n&#039; + self.text2&lt;br /&gt;
&lt;br /&gt;
        return self.text1&lt;br /&gt;
&lt;br /&gt;
class Definition(NamedTuple):&lt;br /&gt;
    id: int&lt;br /&gt;
    data: bytes&lt;br /&gt;
&lt;br /&gt;
    def as_alert(self):&lt;br /&gt;
        return Alert(*struct.unpack(&#039;&amp;gt;HHHHH&#039;, self.data))&lt;br /&gt;
&lt;br /&gt;
    def as_text(self):&lt;br /&gt;
        return self.data[4:-1].decode(&#039;ascii&#039;)&lt;br /&gt;
&lt;br /&gt;
def read_definition():&lt;br /&gt;
    global offset&lt;br /&gt;
    id = read_short()&lt;br /&gt;
    length = read_short()&lt;br /&gt;
    data = buffer[offset:offset + length]&lt;br /&gt;
    offset += length&lt;br /&gt;
    return Definition(id, data)&lt;br /&gt;
&lt;br /&gt;
default_alert = read_definition().as_alert()&lt;br /&gt;
definitions = {(definition := read_definition()).id: definition&lt;br /&gt;
               for _ in range(definition_count)}&lt;br /&gt;
&lt;br /&gt;
for error_id, definition in definitions.items():&lt;br /&gt;
    if len(definition.data) == 10:&lt;br /&gt;
        alert = definition.as_alert()&lt;br /&gt;
        try:&lt;br /&gt;
            print(error_id, &#039;-&#039;, alert.text)&lt;br /&gt;
        except (KeyError, UnicodeDecodeError):&lt;br /&gt;
            pass&lt;br /&gt;
&lt;br /&gt;
print(&#039;Default - &#039;, default_alert.text)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
&lt;br /&gt;
* The System Error Alert Table isn&#039;t just for fatal errors! The text below shows that the Force Quit dialog, among other things, is implemented here.&lt;br /&gt;
* Sometimes, there is no error text, or the text is cut off; I assume this is due to a custom procedure being used for that alert.&lt;br /&gt;
* Entries in the table are not in order.&lt;br /&gt;
* The &amp;quot;Power PC&amp;quot; and &amp;quot;System 9.2.2&amp;quot; typos are in the original text.&lt;br /&gt;
&lt;br /&gt;
== Contents in different system versions ==&lt;br /&gt;
&lt;br /&gt;
=== System Software 6.0.8 ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+ DSAT ID = 0&lt;br /&gt;
|-&lt;br /&gt;
! Error ID !! Text&lt;br /&gt;
|-&lt;br /&gt;
| 65526 || MacsBug installed.&lt;br /&gt;
|-&lt;br /&gt;
| 65525 ||&lt;br /&gt;
|-&lt;br /&gt;
| 102 || This startup disk will not work on this Macintosh model.  Use the latest Installer to update this disk for this model.  (System 6.0.8 does not work on this model; you need a newer version that does.)&lt;br /&gt;
|-&lt;br /&gt;
| 103 || This Macintosh is set for 32-bit addressing.  You may switch to 24-bit addressing and use this disk or restart and use a newer startup disk.  (System 6.0.8 does not work with 32-bit addressing.)&lt;br /&gt;
|-&lt;br /&gt;
| 101 || Sorry, a system error occurred.&lt;br /&gt;
&lt;br /&gt;
RAM parity&lt;br /&gt;
|-&lt;br /&gt;
| Default || Welcome to Macintosh.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+ DSAT ID = 2&lt;br /&gt;
|-&lt;br /&gt;
! Error ID !! Text&lt;br /&gt;
|-&lt;br /&gt;
| 30 || Please insert the disk:&lt;br /&gt;
|-&lt;br /&gt;
| 28 || Sorry, a system error occurred.&lt;br /&gt;
|-&lt;br /&gt;
| 26 || The following application is busy or damaged:&lt;br /&gt;
|-&lt;br /&gt;
| 42 || You may now switch off your Macintosh safely.&lt;br /&gt;
|-&lt;br /&gt;
| 20000 || If you wish to continue using your Macintosh, press Restart.  If not, press Shut Down.&lt;br /&gt;
|-&lt;br /&gt;
| 20001 || You may now switch off your Macintosh safely. If you wish to continue using your Macintosh, press Restart.&lt;br /&gt;
|-&lt;br /&gt;
| 20002 || Unsaved changes will be lost.&lt;br /&gt;
|-&lt;br /&gt;
| 101 || Sorry, a system error occurred.&lt;br /&gt;
&lt;br /&gt;
RAM parity&lt;br /&gt;
|-&lt;br /&gt;
| Default || Sorry, a system error occurred.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Mac OS 9.2.2 ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+ DSAT ID = 0&lt;br /&gt;
|-&lt;br /&gt;
! Error ID !! Text&lt;br /&gt;
|-&lt;br /&gt;
| 102 || This startup disk will not work on this Macintosh model.  Use the latest Installer to update this disk for this model.&lt;br /&gt;
|-&lt;br /&gt;
| 104 || This disk must be unlocked in order to perform one-time housekeeping.  If you wish to use this disk to start your Macintosh, unlock it.&lt;br /&gt;
|-&lt;br /&gt;
| 116 || This startup disk will not work on this computer. A Power PC based computer is required to startup from this disk.&lt;br /&gt;
|-&lt;br /&gt;
| 118 || The system software on the startup disk only functions on the original media, not if copied to another drive.&lt;br /&gt;
|-&lt;br /&gt;
| 105 || System 9.2.2 needs more memory to start up.&lt;br /&gt;
|-&lt;br /&gt;
| Default || Sorry, a system error occurred.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+ DSAT ID = 2&lt;br /&gt;
|-&lt;br /&gt;
! Error ID !! Text&lt;br /&gt;
|-&lt;br /&gt;
| 28 || Sorry, a system error occurred.&lt;br /&gt;
|-&lt;br /&gt;
| 25 || Not enough memory is available while using&lt;br /&gt;
|-&lt;br /&gt;
| 42 ||&lt;br /&gt;
|-&lt;br /&gt;
| 20000 || If you wish to continue using your Macintosh, press Restart.  If not, press Shut Down.&lt;br /&gt;
|-&lt;br /&gt;
| 20001 || It is now safe to switch off your Macintosh. If you wish to continue using your Macintosh, press Restart.&lt;br /&gt;
|-&lt;br /&gt;
| 20002 || Clicking Force Quit causes you to lose any unsaved changes. To avoid further problems, restart your computer after you click Force Quit.&lt;br /&gt;
|-&lt;br /&gt;
| 99 || The System file on this startup disk may be damaged.  The Installer can be used to repair this disk.&lt;br /&gt;
|-&lt;br /&gt;
| 98 || The System file on this startup device does not contain the resources necessary to boot this Macintosh.  Please use the Installer to update the System file.&lt;br /&gt;
|-&lt;br /&gt;
| 101 || Sorry, a system error occurred.&lt;br /&gt;
&lt;br /&gt;
RAM parity&lt;br /&gt;
|-&lt;br /&gt;
| 20010 || Hard Disk Cable Warning&lt;br /&gt;
&lt;br /&gt;
You must first shutdown the Macintosh before attaching any SCSI hard disk cables.  Disconnect the cable from the back of the machine right now.&lt;br /&gt;
|-&lt;br /&gt;
| 1010 || Code Fragment could not be prepared.&lt;br /&gt;
|-&lt;br /&gt;
| 1011 || Internal Mixed Mode failure.&lt;br /&gt;
|-&lt;br /&gt;
| Default || Sorry, a system error occurred.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:Classic Mac OS]]&lt;/div&gt;</summary>
		<author><name>Huntertur</name></author>
	</entry>
	<entry>
		<id>https://computers.huntertur.net/index.php?title=System_Error_Alert_Table&amp;diff=1057</id>
		<title>System Error Alert Table</title>
		<link rel="alternate" type="text/html" href="https://computers.huntertur.net/index.php?title=System_Error_Alert_Table&amp;diff=1057"/>
		<updated>2025-09-25T01:24:57Z</updated>

		<summary type="html">&lt;p&gt;Huntertur: /* Contents in different system versions */ Add 6.0.8&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &#039;&#039;&#039;System Error Alert Table&#039;&#039;&#039; (resource type &#039;&#039;&#039;&amp;lt;code&amp;gt;DSAT&amp;lt;/code&amp;gt;&#039;&#039;&#039;, allegedly short for &#039;&#039;&#039;Deep Shit Alert Table&#039;&#039;&#039;) describes startup text and fatal error dialogs for the classic Mac OS.&lt;br /&gt;
&lt;br /&gt;
== Specification ==&lt;br /&gt;
&lt;br /&gt;
See [https://preterhuman.net/macstuff/insidemac/OSUtilities/OSUtilities-36.html Inside Macintosh: Operating System Utilities, Chapter 2 - System Error Handler, The System Error Alert Table Resource].&lt;br /&gt;
&lt;br /&gt;
== Reading it ==&lt;br /&gt;
&lt;br /&gt;
ResEdit doesn&#039;t support &amp;lt;code&amp;gt;DSAT&amp;lt;/code&amp;gt; and only shows a hex editor despite having a custom icon for the resource type.&lt;br /&gt;
&lt;br /&gt;
Here is an extremely rough Python script for dumping the alerts, their IDs, and their error messages. Despite DSAT definitions being polymorphic, there is no type information, so it determines what is an alert by process of elimination (correct size, text pointers are valid, pointed-to text is ASCII). Copy-paste the hex editor output from ResEdit into a text file, then pass its filename to this script:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;code&amp;gt;dsat.py&amp;lt;/code&amp;gt; contents&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
from argparse import ArgumentParser&lt;br /&gt;
from pathlib import Path&lt;br /&gt;
import struct&lt;br /&gt;
from typing import NamedTuple&lt;br /&gt;
&lt;br /&gt;
parser = ArgumentParser()&lt;br /&gt;
parser.add_argument(&#039;hexfilepath&#039;)&lt;br /&gt;
buffer = bytes.fromhex(Path(parser.parse_args().hexfilepath).read_text())&lt;br /&gt;
offset = 0&lt;br /&gt;
&lt;br /&gt;
def read_short():&lt;br /&gt;
    global offset&lt;br /&gt;
    number = int.from_bytes(buffer[offset:offset + 2])&lt;br /&gt;
    offset += 2&lt;br /&gt;
    return number&lt;br /&gt;
&lt;br /&gt;
definition_count = read_short()&lt;br /&gt;
definitions: dict[int, &#039;Definition&#039;]&lt;br /&gt;
&lt;br /&gt;
class Alert(NamedTuple):&lt;br /&gt;
    text1_id: int&lt;br /&gt;
    text2_id: int&lt;br /&gt;
    icon_id: int&lt;br /&gt;
    proc_id: int&lt;br /&gt;
    button_layout_id: int&lt;br /&gt;
&lt;br /&gt;
    @property&lt;br /&gt;
    def text1(self):&lt;br /&gt;
        return definitions[self.text1_id].as_text().replace(&#039;/&#039;, &#039;\n&#039;) if self.text1_id else None&lt;br /&gt;
&lt;br /&gt;
    @property&lt;br /&gt;
    def text2(self):&lt;br /&gt;
        return definitions[self.text2_id].as_text().replace(&#039;/&#039;, &#039;\n&#039;) if self.text2_id else None&lt;br /&gt;
&lt;br /&gt;
    @property&lt;br /&gt;
    def text(self):&lt;br /&gt;
        if not self.text1:&lt;br /&gt;
            return None&lt;br /&gt;
&lt;br /&gt;
        if self.text2:&lt;br /&gt;
            return self.text1 + &#039;\n&#039; + self.text2&lt;br /&gt;
&lt;br /&gt;
        return self.text1&lt;br /&gt;
&lt;br /&gt;
class Definition(NamedTuple):&lt;br /&gt;
    id: int&lt;br /&gt;
    data: bytes&lt;br /&gt;
&lt;br /&gt;
    def as_alert(self):&lt;br /&gt;
        return Alert(*struct.unpack(&#039;&amp;gt;HHHHH&#039;, self.data))&lt;br /&gt;
&lt;br /&gt;
    def as_text(self):&lt;br /&gt;
        return self.data[4:-1].decode(&#039;ascii&#039;)&lt;br /&gt;
&lt;br /&gt;
def read_definition():&lt;br /&gt;
    global offset&lt;br /&gt;
    id = read_short()&lt;br /&gt;
    length = read_short()&lt;br /&gt;
    data = buffer[offset:offset + length]&lt;br /&gt;
    offset += length&lt;br /&gt;
    return Definition(id, data)&lt;br /&gt;
&lt;br /&gt;
default_alert = read_definition().as_alert()&lt;br /&gt;
definitions = {(definition := read_definition()).id: definition&lt;br /&gt;
               for _ in range(definition_count)}&lt;br /&gt;
&lt;br /&gt;
for error_id, definition in definitions.items():&lt;br /&gt;
    if len(definition.data) == 10:&lt;br /&gt;
        alert = definition.as_alert()&lt;br /&gt;
        try:&lt;br /&gt;
            print(error_id, &#039;-&#039;, alert.text)&lt;br /&gt;
        except (KeyError, UnicodeDecodeError):&lt;br /&gt;
            pass&lt;br /&gt;
&lt;br /&gt;
print(&#039;Default - &#039;, default_alert.text)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
&lt;br /&gt;
* The System Error Alert Table isn&#039;t just for fatal errors! The text below shows that the Force Quit dialog, among other things, is implemented here.&lt;br /&gt;
* Sometimes, there is no error text, or the text is cut off; I assume this is due to a custom procedure being used for that alert.&lt;br /&gt;
* Entries in the table are not in order.&lt;br /&gt;
* The &amp;quot;Power PC&amp;quot; typo is in the original text.&lt;br /&gt;
&lt;br /&gt;
== Contents in different system versions ==&lt;br /&gt;
&lt;br /&gt;
=== System Software 6.0.8 ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+ DSAT ID = 0&lt;br /&gt;
|-&lt;br /&gt;
! Error ID !! Text&lt;br /&gt;
|-&lt;br /&gt;
| 65526 || MacsBug installed.&lt;br /&gt;
|-&lt;br /&gt;
| 65525 ||&lt;br /&gt;
|-&lt;br /&gt;
| 102 || This startup disk will not work on this Macintosh model.  Use the latest Installer to update this disk for this model.  (System 6.0.8 does not work on this model; you need a newer version that does.)&lt;br /&gt;
|-&lt;br /&gt;
| 103 || This Macintosh is set for 32-bit addressing.  You may switch to 24-bit addressing and use this disk or restart and use a newer startup disk.  (System 6.0.8 does not work with 32-bit addressing.)&lt;br /&gt;
|-&lt;br /&gt;
| 101 || Sorry, a system error occurred.&lt;br /&gt;
&lt;br /&gt;
RAM parity&lt;br /&gt;
|-&lt;br /&gt;
| Default || Welcome to Macintosh.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+ DSAT ID = 2&lt;br /&gt;
|-&lt;br /&gt;
! Error ID !! Text&lt;br /&gt;
|-&lt;br /&gt;
| 30 || Please insert the disk:&lt;br /&gt;
|-&lt;br /&gt;
| 28 || Sorry, a system error occurred.&lt;br /&gt;
|-&lt;br /&gt;
| 26 || The following application is busy or damaged:&lt;br /&gt;
|-&lt;br /&gt;
| 42 || You may now switch off your Macintosh safely.&lt;br /&gt;
|-&lt;br /&gt;
| 20000 || If you wish to continue using your Macintosh, press Restart.  If not, press Shut Down.&lt;br /&gt;
|-&lt;br /&gt;
| 20001 || You may now switch off your Macintosh safely. If you wish to continue using your Macintosh, press Restart.&lt;br /&gt;
|-&lt;br /&gt;
| 20002 || Unsaved changes will be lost.&lt;br /&gt;
|-&lt;br /&gt;
| 101 || Sorry, a system error occurred.&lt;br /&gt;
&lt;br /&gt;
RAM parity&lt;br /&gt;
|-&lt;br /&gt;
| Default || Sorry, a system error occurred.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Mac OS 9.2.2 ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+ DSAT ID = 0&lt;br /&gt;
|-&lt;br /&gt;
! Error ID !! Text&lt;br /&gt;
|-&lt;br /&gt;
| 102 || This startup disk will not work on this Macintosh model.  Use the latest Installer to update this disk for this model.&lt;br /&gt;
|-&lt;br /&gt;
| 104 || This disk must be unlocked in order to perform one-time housekeeping.  If you wish to use this disk to start your Macintosh, unlock it.&lt;br /&gt;
|-&lt;br /&gt;
| 116 || This startup disk will not work on this computer. A Power PC based computer is required to startup from this disk.&lt;br /&gt;
|-&lt;br /&gt;
| 118 || The system software on the startup disk only functions on the original media, not if copied to another drive.&lt;br /&gt;
|-&lt;br /&gt;
| 105 || System 9.2.2 needs more memory to start up.&lt;br /&gt;
|-&lt;br /&gt;
| Default || Sorry, a system error occurred.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+ DSAT ID = 2&lt;br /&gt;
|-&lt;br /&gt;
! Error ID !! Text&lt;br /&gt;
|-&lt;br /&gt;
| 28 || Sorry, a system error occurred.&lt;br /&gt;
|-&lt;br /&gt;
| 25 || Not enough memory is available while using&lt;br /&gt;
|-&lt;br /&gt;
| 42 ||&lt;br /&gt;
|-&lt;br /&gt;
| 20000 || If you wish to continue using your Macintosh, press Restart.  If not, press Shut Down.&lt;br /&gt;
|-&lt;br /&gt;
| 20001 || It is now safe to switch off your Macintosh. If you wish to continue using your Macintosh, press Restart.&lt;br /&gt;
|-&lt;br /&gt;
| 20002 || Clicking Force Quit causes you to lose any unsaved changes. To avoid further problems, restart your computer after you click Force Quit.&lt;br /&gt;
|-&lt;br /&gt;
| 99 || The System file on this startup disk may be damaged.  The Installer can be used to repair this disk.&lt;br /&gt;
|-&lt;br /&gt;
| 98 || The System file on this startup device does not contain the resources necessary to boot this Macintosh.  Please use the Installer to update the System file.&lt;br /&gt;
|-&lt;br /&gt;
| 101 || Sorry, a system error occurred.&lt;br /&gt;
&lt;br /&gt;
RAM parity&lt;br /&gt;
|-&lt;br /&gt;
| 20010 || Hard Disk Cable Warning&lt;br /&gt;
&lt;br /&gt;
You must first shutdown the Macintosh before attaching any SCSI hard disk cables.  Disconnect the cable from the back of the machine right now.&lt;br /&gt;
|-&lt;br /&gt;
| 1010 || Code Fragment could not be prepared.&lt;br /&gt;
|-&lt;br /&gt;
| 1011 || Internal Mixed Mode failure.&lt;br /&gt;
|-&lt;br /&gt;
| Default || Sorry, a system error occurred.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:Classic Mac OS]]&lt;/div&gt;</summary>
		<author><name>Huntertur</name></author>
	</entry>
	<entry>
		<id>https://computers.huntertur.net/index.php?title=System_Error_Alert_Table&amp;diff=1056</id>
		<title>System Error Alert Table</title>
		<link rel="alternate" type="text/html" href="https://computers.huntertur.net/index.php?title=System_Error_Alert_Table&amp;diff=1056"/>
		<updated>2025-09-25T00:59:00Z</updated>

		<summary type="html">&lt;p&gt;Huntertur: /* Notes */ Note the typo is real&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &#039;&#039;&#039;System Error Alert Table&#039;&#039;&#039; (resource type &#039;&#039;&#039;&amp;lt;code&amp;gt;DSAT&amp;lt;/code&amp;gt;&#039;&#039;&#039;, allegedly short for &#039;&#039;&#039;Deep Shit Alert Table&#039;&#039;&#039;) describes startup text and fatal error dialogs for the classic Mac OS.&lt;br /&gt;
&lt;br /&gt;
== Specification ==&lt;br /&gt;
&lt;br /&gt;
See [https://preterhuman.net/macstuff/insidemac/OSUtilities/OSUtilities-36.html Inside Macintosh: Operating System Utilities, Chapter 2 - System Error Handler, The System Error Alert Table Resource].&lt;br /&gt;
&lt;br /&gt;
== Reading it ==&lt;br /&gt;
&lt;br /&gt;
ResEdit doesn&#039;t support &amp;lt;code&amp;gt;DSAT&amp;lt;/code&amp;gt; and only shows a hex editor despite having a custom icon for the resource type.&lt;br /&gt;
&lt;br /&gt;
Here is an extremely rough Python script for dumping the alerts, their IDs, and their error messages. Despite DSAT definitions being polymorphic, there is no type information, so it determines what is an alert by process of elimination (correct size, text pointers are valid, pointed-to text is ASCII). Copy-paste the hex editor output from ResEdit into a text file, then pass its filename to this script:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;code&amp;gt;dsat.py&amp;lt;/code&amp;gt; contents&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
from argparse import ArgumentParser&lt;br /&gt;
from pathlib import Path&lt;br /&gt;
import struct&lt;br /&gt;
from typing import NamedTuple&lt;br /&gt;
&lt;br /&gt;
parser = ArgumentParser()&lt;br /&gt;
parser.add_argument(&#039;hexfilepath&#039;)&lt;br /&gt;
buffer = bytes.fromhex(Path(parser.parse_args().hexfilepath).read_text())&lt;br /&gt;
offset = 0&lt;br /&gt;
&lt;br /&gt;
def read_short():&lt;br /&gt;
    global offset&lt;br /&gt;
    number = int.from_bytes(buffer[offset:offset + 2])&lt;br /&gt;
    offset += 2&lt;br /&gt;
    return number&lt;br /&gt;
&lt;br /&gt;
definition_count = read_short()&lt;br /&gt;
definitions: dict[int, &#039;Definition&#039;]&lt;br /&gt;
&lt;br /&gt;
class Alert(NamedTuple):&lt;br /&gt;
    text1_id: int&lt;br /&gt;
    text2_id: int&lt;br /&gt;
    icon_id: int&lt;br /&gt;
    proc_id: int&lt;br /&gt;
    button_layout_id: int&lt;br /&gt;
&lt;br /&gt;
    @property&lt;br /&gt;
    def text1(self):&lt;br /&gt;
        return definitions[self.text1_id].as_text().replace(&#039;/&#039;, &#039;\n&#039;) if self.text1_id else None&lt;br /&gt;
&lt;br /&gt;
    @property&lt;br /&gt;
    def text2(self):&lt;br /&gt;
        return definitions[self.text2_id].as_text().replace(&#039;/&#039;, &#039;\n&#039;) if self.text2_id else None&lt;br /&gt;
&lt;br /&gt;
    @property&lt;br /&gt;
    def text(self):&lt;br /&gt;
        if not self.text1:&lt;br /&gt;
            return None&lt;br /&gt;
&lt;br /&gt;
        if self.text2:&lt;br /&gt;
            return self.text1 + &#039;\n&#039; + self.text2&lt;br /&gt;
&lt;br /&gt;
        return self.text1&lt;br /&gt;
&lt;br /&gt;
class Definition(NamedTuple):&lt;br /&gt;
    id: int&lt;br /&gt;
    data: bytes&lt;br /&gt;
&lt;br /&gt;
    def as_alert(self):&lt;br /&gt;
        return Alert(*struct.unpack(&#039;&amp;gt;HHHHH&#039;, self.data))&lt;br /&gt;
&lt;br /&gt;
    def as_text(self):&lt;br /&gt;
        return self.data[4:-1].decode(&#039;ascii&#039;)&lt;br /&gt;
&lt;br /&gt;
def read_definition():&lt;br /&gt;
    global offset&lt;br /&gt;
    id = read_short()&lt;br /&gt;
    length = read_short()&lt;br /&gt;
    data = buffer[offset:offset + length]&lt;br /&gt;
    offset += length&lt;br /&gt;
    return Definition(id, data)&lt;br /&gt;
&lt;br /&gt;
default_alert = read_definition().as_alert()&lt;br /&gt;
definitions = {(definition := read_definition()).id: definition&lt;br /&gt;
               for _ in range(definition_count)}&lt;br /&gt;
&lt;br /&gt;
for error_id, definition in definitions.items():&lt;br /&gt;
    if len(definition.data) == 10:&lt;br /&gt;
        alert = definition.as_alert()&lt;br /&gt;
        try:&lt;br /&gt;
            print(error_id, &#039;-&#039;, alert.text)&lt;br /&gt;
        except (KeyError, UnicodeDecodeError):&lt;br /&gt;
            pass&lt;br /&gt;
&lt;br /&gt;
print(&#039;Default - &#039;, default_alert.text)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
&lt;br /&gt;
* The System Error Alert Table isn&#039;t just for fatal errors! The text below shows that the Force Quit dialog, among other things, is implemented here.&lt;br /&gt;
* Sometimes, there is no error text, or the text is cut off; I assume this is due to a custom procedure being used for that alert.&lt;br /&gt;
* Entries in the table are not in order.&lt;br /&gt;
* The &amp;quot;Power PC&amp;quot; typo is in the original text.&lt;br /&gt;
&lt;br /&gt;
== Contents in different system versions ==&lt;br /&gt;
&lt;br /&gt;
=== Mac OS 9.2.2 ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+ DSAT ID = 0&lt;br /&gt;
|-&lt;br /&gt;
! Error ID !! Text&lt;br /&gt;
|-&lt;br /&gt;
| 102 || This startup disk will not work on this Macintosh model.  Use the latest Installer to update this disk for this model.&lt;br /&gt;
|-&lt;br /&gt;
| 104 || This disk must be unlocked in order to perform one-time housekeeping.  If you wish to use this disk to start your Macintosh, unlock it.&lt;br /&gt;
|-&lt;br /&gt;
| 116 || This startup disk will not work on this computer. A Power PC based computer is required to startup from this disk.&lt;br /&gt;
|-&lt;br /&gt;
| 118 || The system software on the startup disk only functions on the original media, not if copied to another drive.&lt;br /&gt;
|-&lt;br /&gt;
| 105 || System 9.2.2 needs more memory to start up.&lt;br /&gt;
|-&lt;br /&gt;
| Default || Sorry, a system error occurred.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+ DSAT ID = 2&lt;br /&gt;
|-&lt;br /&gt;
! Error ID !! Text&lt;br /&gt;
|-&lt;br /&gt;
| 28 || Sorry, a system error occurred.&lt;br /&gt;
|-&lt;br /&gt;
| 25 || Not enough memory is available while using&lt;br /&gt;
|-&lt;br /&gt;
| 42 ||&lt;br /&gt;
|-&lt;br /&gt;
| 20000 || If you wish to continue using your Macintosh, press Restart.  If not, press Shut Down.&lt;br /&gt;
|-&lt;br /&gt;
| 20001 || It is now safe to switch off your Macintosh. If you wish to continue using your Macintosh, press Restart.&lt;br /&gt;
|-&lt;br /&gt;
| 20002 || Clicking Force Quit causes you to lose any unsaved changes. To avoid further problems, restart your computer after you click Force Quit.&lt;br /&gt;
|-&lt;br /&gt;
| 99 || The System file on this startup disk may be damaged.  The Installer can be used to repair this disk.&lt;br /&gt;
|-&lt;br /&gt;
| 98 || The System file on this startup device does not contain the resources necessary to boot this Macintosh.  Please use the Installer to update the System file.&lt;br /&gt;
|-&lt;br /&gt;
| 101 || Sorry, a system error occurred.&lt;br /&gt;
&lt;br /&gt;
RAM parity&lt;br /&gt;
|-&lt;br /&gt;
| 20010 || Hard Disk Cable Warning&lt;br /&gt;
&lt;br /&gt;
You must first shutdown the Macintosh before attaching any SCSI hard disk cables.  Disconnect the cable from the back of the machine right now.&lt;br /&gt;
|-&lt;br /&gt;
| 1010 || Code Fragment could not be prepared.&lt;br /&gt;
|-&lt;br /&gt;
| 1011 || Internal Mixed Mode failure.&lt;br /&gt;
|-&lt;br /&gt;
| Default || Sorry, a system error occurred.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:Classic Mac OS]]&lt;/div&gt;</summary>
		<author><name>Huntertur</name></author>
	</entry>
	<entry>
		<id>https://computers.huntertur.net/index.php?title=System_Error_Alert_Table&amp;diff=1055</id>
		<title>System Error Alert Table</title>
		<link rel="alternate" type="text/html" href="https://computers.huntertur.net/index.php?title=System_Error_Alert_Table&amp;diff=1055"/>
		<updated>2025-09-25T00:58:36Z</updated>

		<summary type="html">&lt;p&gt;Huntertur: Add notes&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &#039;&#039;&#039;System Error Alert Table&#039;&#039;&#039; (resource type &#039;&#039;&#039;&amp;lt;code&amp;gt;DSAT&amp;lt;/code&amp;gt;&#039;&#039;&#039;, allegedly short for &#039;&#039;&#039;Deep Shit Alert Table&#039;&#039;&#039;) describes startup text and fatal error dialogs for the classic Mac OS.&lt;br /&gt;
&lt;br /&gt;
== Specification ==&lt;br /&gt;
&lt;br /&gt;
See [https://preterhuman.net/macstuff/insidemac/OSUtilities/OSUtilities-36.html Inside Macintosh: Operating System Utilities, Chapter 2 - System Error Handler, The System Error Alert Table Resource].&lt;br /&gt;
&lt;br /&gt;
== Reading it ==&lt;br /&gt;
&lt;br /&gt;
ResEdit doesn&#039;t support &amp;lt;code&amp;gt;DSAT&amp;lt;/code&amp;gt; and only shows a hex editor despite having a custom icon for the resource type.&lt;br /&gt;
&lt;br /&gt;
Here is an extremely rough Python script for dumping the alerts, their IDs, and their error messages. Despite DSAT definitions being polymorphic, there is no type information, so it determines what is an alert by process of elimination (correct size, text pointers are valid, pointed-to text is ASCII). Copy-paste the hex editor output from ResEdit into a text file, then pass its filename to this script:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;code&amp;gt;dsat.py&amp;lt;/code&amp;gt; contents&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
from argparse import ArgumentParser&lt;br /&gt;
from pathlib import Path&lt;br /&gt;
import struct&lt;br /&gt;
from typing import NamedTuple&lt;br /&gt;
&lt;br /&gt;
parser = ArgumentParser()&lt;br /&gt;
parser.add_argument(&#039;hexfilepath&#039;)&lt;br /&gt;
buffer = bytes.fromhex(Path(parser.parse_args().hexfilepath).read_text())&lt;br /&gt;
offset = 0&lt;br /&gt;
&lt;br /&gt;
def read_short():&lt;br /&gt;
    global offset&lt;br /&gt;
    number = int.from_bytes(buffer[offset:offset + 2])&lt;br /&gt;
    offset += 2&lt;br /&gt;
    return number&lt;br /&gt;
&lt;br /&gt;
definition_count = read_short()&lt;br /&gt;
definitions: dict[int, &#039;Definition&#039;]&lt;br /&gt;
&lt;br /&gt;
class Alert(NamedTuple):&lt;br /&gt;
    text1_id: int&lt;br /&gt;
    text2_id: int&lt;br /&gt;
    icon_id: int&lt;br /&gt;
    proc_id: int&lt;br /&gt;
    button_layout_id: int&lt;br /&gt;
&lt;br /&gt;
    @property&lt;br /&gt;
    def text1(self):&lt;br /&gt;
        return definitions[self.text1_id].as_text().replace(&#039;/&#039;, &#039;\n&#039;) if self.text1_id else None&lt;br /&gt;
&lt;br /&gt;
    @property&lt;br /&gt;
    def text2(self):&lt;br /&gt;
        return definitions[self.text2_id].as_text().replace(&#039;/&#039;, &#039;\n&#039;) if self.text2_id else None&lt;br /&gt;
&lt;br /&gt;
    @property&lt;br /&gt;
    def text(self):&lt;br /&gt;
        if not self.text1:&lt;br /&gt;
            return None&lt;br /&gt;
&lt;br /&gt;
        if self.text2:&lt;br /&gt;
            return self.text1 + &#039;\n&#039; + self.text2&lt;br /&gt;
&lt;br /&gt;
        return self.text1&lt;br /&gt;
&lt;br /&gt;
class Definition(NamedTuple):&lt;br /&gt;
    id: int&lt;br /&gt;
    data: bytes&lt;br /&gt;
&lt;br /&gt;
    def as_alert(self):&lt;br /&gt;
        return Alert(*struct.unpack(&#039;&amp;gt;HHHHH&#039;, self.data))&lt;br /&gt;
&lt;br /&gt;
    def as_text(self):&lt;br /&gt;
        return self.data[4:-1].decode(&#039;ascii&#039;)&lt;br /&gt;
&lt;br /&gt;
def read_definition():&lt;br /&gt;
    global offset&lt;br /&gt;
    id = read_short()&lt;br /&gt;
    length = read_short()&lt;br /&gt;
    data = buffer[offset:offset + length]&lt;br /&gt;
    offset += length&lt;br /&gt;
    return Definition(id, data)&lt;br /&gt;
&lt;br /&gt;
default_alert = read_definition().as_alert()&lt;br /&gt;
definitions = {(definition := read_definition()).id: definition&lt;br /&gt;
               for _ in range(definition_count)}&lt;br /&gt;
&lt;br /&gt;
for error_id, definition in definitions.items():&lt;br /&gt;
    if len(definition.data) == 10:&lt;br /&gt;
        alert = definition.as_alert()&lt;br /&gt;
        try:&lt;br /&gt;
            print(error_id, &#039;-&#039;, alert.text)&lt;br /&gt;
        except (KeyError, UnicodeDecodeError):&lt;br /&gt;
            pass&lt;br /&gt;
&lt;br /&gt;
print(&#039;Default - &#039;, default_alert.text)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
&lt;br /&gt;
* The System Error Alert Table isn&#039;t just for fatal errors! The text below shows that the Force Quit dialog, among other things, is implemented here.&lt;br /&gt;
* Sometimes, there is no error text, or the text is cut off; I assume this is due to a custom procedure being used for that alert.&lt;br /&gt;
* Entries in the table are not in order.&lt;br /&gt;
&lt;br /&gt;
== Contents in different system versions ==&lt;br /&gt;
&lt;br /&gt;
=== Mac OS 9.2.2 ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+ DSAT ID = 0&lt;br /&gt;
|-&lt;br /&gt;
! Error ID !! Text&lt;br /&gt;
|-&lt;br /&gt;
| 102 || This startup disk will not work on this Macintosh model.  Use the latest Installer to update this disk for this model.&lt;br /&gt;
|-&lt;br /&gt;
| 104 || This disk must be unlocked in order to perform one-time housekeeping.  If you wish to use this disk to start your Macintosh, unlock it.&lt;br /&gt;
|-&lt;br /&gt;
| 116 || This startup disk will not work on this computer. A Power PC based computer is required to startup from this disk.&lt;br /&gt;
|-&lt;br /&gt;
| 118 || The system software on the startup disk only functions on the original media, not if copied to another drive.&lt;br /&gt;
|-&lt;br /&gt;
| 105 || System 9.2.2 needs more memory to start up.&lt;br /&gt;
|-&lt;br /&gt;
| Default || Sorry, a system error occurred.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+ DSAT ID = 2&lt;br /&gt;
|-&lt;br /&gt;
! Error ID !! Text&lt;br /&gt;
|-&lt;br /&gt;
| 28 || Sorry, a system error occurred.&lt;br /&gt;
|-&lt;br /&gt;
| 25 || Not enough memory is available while using&lt;br /&gt;
|-&lt;br /&gt;
| 42 ||&lt;br /&gt;
|-&lt;br /&gt;
| 20000 || If you wish to continue using your Macintosh, press Restart.  If not, press Shut Down.&lt;br /&gt;
|-&lt;br /&gt;
| 20001 || It is now safe to switch off your Macintosh. If you wish to continue using your Macintosh, press Restart.&lt;br /&gt;
|-&lt;br /&gt;
| 20002 || Clicking Force Quit causes you to lose any unsaved changes. To avoid further problems, restart your computer after you click Force Quit.&lt;br /&gt;
|-&lt;br /&gt;
| 99 || The System file on this startup disk may be damaged.  The Installer can be used to repair this disk.&lt;br /&gt;
|-&lt;br /&gt;
| 98 || The System file on this startup device does not contain the resources necessary to boot this Macintosh.  Please use the Installer to update the System file.&lt;br /&gt;
|-&lt;br /&gt;
| 101 || Sorry, a system error occurred.&lt;br /&gt;
&lt;br /&gt;
RAM parity&lt;br /&gt;
|-&lt;br /&gt;
| 20010 || Hard Disk Cable Warning&lt;br /&gt;
&lt;br /&gt;
You must first shutdown the Macintosh before attaching any SCSI hard disk cables.  Disconnect the cable from the back of the machine right now.&lt;br /&gt;
|-&lt;br /&gt;
| 1010 || Code Fragment could not be prepared.&lt;br /&gt;
|-&lt;br /&gt;
| 1011 || Internal Mixed Mode failure.&lt;br /&gt;
|-&lt;br /&gt;
| Default || Sorry, a system error occurred.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:Classic Mac OS]]&lt;/div&gt;</summary>
		<author><name>Huntertur</name></author>
	</entry>
	<entry>
		<id>https://computers.huntertur.net/index.php?title=System_Error_Alert_Table&amp;diff=1054</id>
		<title>System Error Alert Table</title>
		<link rel="alternate" type="text/html" href="https://computers.huntertur.net/index.php?title=System_Error_Alert_Table&amp;diff=1054"/>
		<updated>2025-09-25T00:55:17Z</updated>

		<summary type="html">&lt;p&gt;Huntertur: /* Contents in different system versions */ Add Mac OS 9.2.2 values&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &#039;&#039;&#039;System Error Alert Table&#039;&#039;&#039; (resource type &#039;&#039;&#039;&amp;lt;code&amp;gt;DSAT&amp;lt;/code&amp;gt;&#039;&#039;&#039;, allegedly short for &#039;&#039;&#039;Deep Shit Alert Table&#039;&#039;&#039;) describes startup text and fatal error dialogs for the classic Mac OS.&lt;br /&gt;
&lt;br /&gt;
== Specification ==&lt;br /&gt;
&lt;br /&gt;
See [https://preterhuman.net/macstuff/insidemac/OSUtilities/OSUtilities-36.html Inside Macintosh: Operating System Utilities, Chapter 2 - System Error Handler, The System Error Alert Table Resource].&lt;br /&gt;
&lt;br /&gt;
== Reading it ==&lt;br /&gt;
&lt;br /&gt;
ResEdit doesn&#039;t support &amp;lt;code&amp;gt;DSAT&amp;lt;/code&amp;gt; and only shows a hex editor despite having a custom icon for the resource type.&lt;br /&gt;
&lt;br /&gt;
Here is an extremely rough Python script for dumping the alerts, their IDs, and their error messages. Despite DSAT definitions being polymorphic, there is no type information, so it determines what is an alert by process of elimination (correct size, text pointers are valid, pointed-to text is ASCII). Copy-paste the hex editor output from ResEdit into a text file, then pass its filename to this script:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;code&amp;gt;dsat.py&amp;lt;/code&amp;gt; contents&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
from argparse import ArgumentParser&lt;br /&gt;
from pathlib import Path&lt;br /&gt;
import struct&lt;br /&gt;
from typing import NamedTuple&lt;br /&gt;
&lt;br /&gt;
parser = ArgumentParser()&lt;br /&gt;
parser.add_argument(&#039;hexfilepath&#039;)&lt;br /&gt;
buffer = bytes.fromhex(Path(parser.parse_args().hexfilepath).read_text())&lt;br /&gt;
offset = 0&lt;br /&gt;
&lt;br /&gt;
def read_short():&lt;br /&gt;
    global offset&lt;br /&gt;
    number = int.from_bytes(buffer[offset:offset + 2])&lt;br /&gt;
    offset += 2&lt;br /&gt;
    return number&lt;br /&gt;
&lt;br /&gt;
definition_count = read_short()&lt;br /&gt;
definitions: dict[int, &#039;Definition&#039;]&lt;br /&gt;
&lt;br /&gt;
class Alert(NamedTuple):&lt;br /&gt;
    text1_id: int&lt;br /&gt;
    text2_id: int&lt;br /&gt;
    icon_id: int&lt;br /&gt;
    proc_id: int&lt;br /&gt;
    button_layout_id: int&lt;br /&gt;
&lt;br /&gt;
    @property&lt;br /&gt;
    def text1(self):&lt;br /&gt;
        return definitions[self.text1_id].as_text().replace(&#039;/&#039;, &#039;\n&#039;) if self.text1_id else None&lt;br /&gt;
&lt;br /&gt;
    @property&lt;br /&gt;
    def text2(self):&lt;br /&gt;
        return definitions[self.text2_id].as_text().replace(&#039;/&#039;, &#039;\n&#039;) if self.text2_id else None&lt;br /&gt;
&lt;br /&gt;
    @property&lt;br /&gt;
    def text(self):&lt;br /&gt;
        if not self.text1:&lt;br /&gt;
            return None&lt;br /&gt;
&lt;br /&gt;
        if self.text2:&lt;br /&gt;
            return self.text1 + &#039;\n&#039; + self.text2&lt;br /&gt;
&lt;br /&gt;
        return self.text1&lt;br /&gt;
&lt;br /&gt;
class Definition(NamedTuple):&lt;br /&gt;
    id: int&lt;br /&gt;
    data: bytes&lt;br /&gt;
&lt;br /&gt;
    def as_alert(self):&lt;br /&gt;
        return Alert(*struct.unpack(&#039;&amp;gt;HHHHH&#039;, self.data))&lt;br /&gt;
&lt;br /&gt;
    def as_text(self):&lt;br /&gt;
        return self.data[4:-1].decode(&#039;ascii&#039;)&lt;br /&gt;
&lt;br /&gt;
def read_definition():&lt;br /&gt;
    global offset&lt;br /&gt;
    id = read_short()&lt;br /&gt;
    length = read_short()&lt;br /&gt;
    data = buffer[offset:offset + length]&lt;br /&gt;
    offset += length&lt;br /&gt;
    return Definition(id, data)&lt;br /&gt;
&lt;br /&gt;
default_alert = read_definition().as_alert()&lt;br /&gt;
definitions = {(definition := read_definition()).id: definition&lt;br /&gt;
               for _ in range(definition_count)}&lt;br /&gt;
&lt;br /&gt;
for error_id, definition in definitions.items():&lt;br /&gt;
    if len(definition.data) == 10:&lt;br /&gt;
        alert = definition.as_alert()&lt;br /&gt;
        try:&lt;br /&gt;
            print(error_id, &#039;-&#039;, alert.text)&lt;br /&gt;
        except (KeyError, UnicodeDecodeError):&lt;br /&gt;
            pass&lt;br /&gt;
&lt;br /&gt;
print(&#039;Default - &#039;, default_alert.text)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Contents in different system versions ==&lt;br /&gt;
&lt;br /&gt;
=== Mac OS 9.2.2 ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+ DSAT ID = 0&lt;br /&gt;
|-&lt;br /&gt;
! Error ID !! Text&lt;br /&gt;
|-&lt;br /&gt;
| 102 || This startup disk will not work on this Macintosh model.  Use the latest Installer to update this disk for this model.&lt;br /&gt;
|-&lt;br /&gt;
| 104 || This disk must be unlocked in order to perform one-time housekeeping.  If you wish to use this disk to start your Macintosh, unlock it.&lt;br /&gt;
|-&lt;br /&gt;
| 116 || This startup disk will not work on this computer. A Power PC based computer is required to startup from this disk.&lt;br /&gt;
|-&lt;br /&gt;
| 118 || The system software on the startup disk only functions on the original media, not if copied to another drive.&lt;br /&gt;
|-&lt;br /&gt;
| 105 || System 9.2.2 needs more memory to start up.&lt;br /&gt;
|-&lt;br /&gt;
| Default || Sorry, a system error occurred.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+ DSAT ID = 2&lt;br /&gt;
|-&lt;br /&gt;
! Error ID !! Text&lt;br /&gt;
|-&lt;br /&gt;
| 28 || Sorry, a system error occurred.&lt;br /&gt;
|-&lt;br /&gt;
| 25 || Not enough memory is available while using&lt;br /&gt;
|-&lt;br /&gt;
| 42 ||&lt;br /&gt;
|-&lt;br /&gt;
| 20000 || If you wish to continue using your Macintosh, press Restart.  If not, press Shut Down.&lt;br /&gt;
|-&lt;br /&gt;
| 20001 || It is now safe to switch off your Macintosh. If you wish to continue using your Macintosh, press Restart.&lt;br /&gt;
|-&lt;br /&gt;
| 20002 || Clicking Force Quit causes you to lose any unsaved changes. To avoid further problems, restart your computer after you click Force Quit.&lt;br /&gt;
|-&lt;br /&gt;
| 99 || The System file on this startup disk may be damaged.  The Installer can be used to repair this disk.&lt;br /&gt;
|-&lt;br /&gt;
| 98 || The System file on this startup device does not contain the resources necessary to boot this Macintosh.  Please use the Installer to update the System file.&lt;br /&gt;
|-&lt;br /&gt;
| 101 || Sorry, a system error occurred.&lt;br /&gt;
&lt;br /&gt;
RAM parity&lt;br /&gt;
|-&lt;br /&gt;
| 20010 || Hard Disk Cable Warning&lt;br /&gt;
&lt;br /&gt;
You must first shutdown the Macintosh before attaching any SCSI hard disk cables.  Disconnect the cable from the back of the machine right now.&lt;br /&gt;
|-&lt;br /&gt;
| 1010 || Code Fragment could not be prepared.&lt;br /&gt;
|-&lt;br /&gt;
| 1011 || Internal Mixed Mode failure.&lt;br /&gt;
|-&lt;br /&gt;
| Default || Sorry, a system error occurred.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:Classic Mac OS]]&lt;/div&gt;</summary>
		<author><name>Huntertur</name></author>
	</entry>
	<entry>
		<id>https://computers.huntertur.net/index.php?title=System_Error_Alert_Table&amp;diff=1053</id>
		<title>System Error Alert Table</title>
		<link rel="alternate" type="text/html" href="https://computers.huntertur.net/index.php?title=System_Error_Alert_Table&amp;diff=1053"/>
		<updated>2025-09-25T00:45:15Z</updated>

		<summary type="html">&lt;p&gt;Huntertur: /* Reading it */ Display default&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &#039;&#039;&#039;System Error Alert Table&#039;&#039;&#039; (resource type &#039;&#039;&#039;&amp;lt;code&amp;gt;DSAT&amp;lt;/code&amp;gt;&#039;&#039;&#039;, allegedly short for &#039;&#039;&#039;Deep Shit Alert Table&#039;&#039;&#039;) describes startup text and fatal error dialogs for the classic Mac OS.&lt;br /&gt;
&lt;br /&gt;
== Specification ==&lt;br /&gt;
&lt;br /&gt;
See [https://preterhuman.net/macstuff/insidemac/OSUtilities/OSUtilities-36.html Inside Macintosh: Operating System Utilities, Chapter 2 - System Error Handler, The System Error Alert Table Resource].&lt;br /&gt;
&lt;br /&gt;
== Reading it ==&lt;br /&gt;
&lt;br /&gt;
ResEdit doesn&#039;t support &amp;lt;code&amp;gt;DSAT&amp;lt;/code&amp;gt; and only shows a hex editor despite having a custom icon for the resource type.&lt;br /&gt;
&lt;br /&gt;
Here is an extremely rough Python script for dumping the alerts, their IDs, and their error messages. Despite DSAT definitions being polymorphic, there is no type information, so it determines what is an alert by process of elimination (correct size, text pointers are valid, pointed-to text is ASCII). Copy-paste the hex editor output from ResEdit into a text file, then pass its filename to this script:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;code&amp;gt;dsat.py&amp;lt;/code&amp;gt; contents&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
from argparse import ArgumentParser&lt;br /&gt;
from pathlib import Path&lt;br /&gt;
import struct&lt;br /&gt;
from typing import NamedTuple&lt;br /&gt;
&lt;br /&gt;
parser = ArgumentParser()&lt;br /&gt;
parser.add_argument(&#039;hexfilepath&#039;)&lt;br /&gt;
buffer = bytes.fromhex(Path(parser.parse_args().hexfilepath).read_text())&lt;br /&gt;
offset = 0&lt;br /&gt;
&lt;br /&gt;
def read_short():&lt;br /&gt;
    global offset&lt;br /&gt;
    number = int.from_bytes(buffer[offset:offset + 2])&lt;br /&gt;
    offset += 2&lt;br /&gt;
    return number&lt;br /&gt;
&lt;br /&gt;
definition_count = read_short()&lt;br /&gt;
definitions: dict[int, &#039;Definition&#039;]&lt;br /&gt;
&lt;br /&gt;
class Alert(NamedTuple):&lt;br /&gt;
    text1_id: int&lt;br /&gt;
    text2_id: int&lt;br /&gt;
    icon_id: int&lt;br /&gt;
    proc_id: int&lt;br /&gt;
    button_layout_id: int&lt;br /&gt;
&lt;br /&gt;
    @property&lt;br /&gt;
    def text1(self):&lt;br /&gt;
        return definitions[self.text1_id].as_text().replace(&#039;/&#039;, &#039;\n&#039;) if self.text1_id else None&lt;br /&gt;
&lt;br /&gt;
    @property&lt;br /&gt;
    def text2(self):&lt;br /&gt;
        return definitions[self.text2_id].as_text().replace(&#039;/&#039;, &#039;\n&#039;) if self.text2_id else None&lt;br /&gt;
&lt;br /&gt;
    @property&lt;br /&gt;
    def text(self):&lt;br /&gt;
        if not self.text1:&lt;br /&gt;
            return None&lt;br /&gt;
&lt;br /&gt;
        if self.text2:&lt;br /&gt;
            return self.text1 + &#039;\n&#039; + self.text2&lt;br /&gt;
&lt;br /&gt;
        return self.text1&lt;br /&gt;
&lt;br /&gt;
class Definition(NamedTuple):&lt;br /&gt;
    id: int&lt;br /&gt;
    data: bytes&lt;br /&gt;
&lt;br /&gt;
    def as_alert(self):&lt;br /&gt;
        return Alert(*struct.unpack(&#039;&amp;gt;HHHHH&#039;, self.data))&lt;br /&gt;
&lt;br /&gt;
    def as_text(self):&lt;br /&gt;
        return self.data[4:-1].decode(&#039;ascii&#039;)&lt;br /&gt;
&lt;br /&gt;
def read_definition():&lt;br /&gt;
    global offset&lt;br /&gt;
    id = read_short()&lt;br /&gt;
    length = read_short()&lt;br /&gt;
    data = buffer[offset:offset + length]&lt;br /&gt;
    offset += length&lt;br /&gt;
    return Definition(id, data)&lt;br /&gt;
&lt;br /&gt;
default_alert = read_definition().as_alert()&lt;br /&gt;
definitions = {(definition := read_definition()).id: definition&lt;br /&gt;
               for _ in range(definition_count)}&lt;br /&gt;
&lt;br /&gt;
for error_id, definition in definitions.items():&lt;br /&gt;
    if len(definition.data) == 10:&lt;br /&gt;
        alert = definition.as_alert()&lt;br /&gt;
        try:&lt;br /&gt;
            print(error_id, &#039;-&#039;, alert.text)&lt;br /&gt;
        except (KeyError, UnicodeDecodeError):&lt;br /&gt;
            pass&lt;br /&gt;
&lt;br /&gt;
print(&#039;Default - &#039;, default_alert.text)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Contents in different system versions ==&lt;br /&gt;
&lt;br /&gt;
TODO: make that utility first&lt;br /&gt;
&lt;br /&gt;
[[Category:Classic Mac OS]]&lt;/div&gt;</summary>
		<author><name>Huntertur</name></author>
	</entry>
	<entry>
		<id>https://computers.huntertur.net/index.php?title=System_Error_Alert_Table&amp;diff=1052</id>
		<title>System Error Alert Table</title>
		<link rel="alternate" type="text/html" href="https://computers.huntertur.net/index.php?title=System_Error_Alert_Table&amp;diff=1052"/>
		<updated>2025-09-25T00:30:10Z</updated>

		<summary type="html">&lt;p&gt;Huntertur: /* Reading it */ Explain script weirdness&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &#039;&#039;&#039;System Error Alert Table&#039;&#039;&#039; (resource type &#039;&#039;&#039;&amp;lt;code&amp;gt;DSAT&amp;lt;/code&amp;gt;&#039;&#039;&#039;, allegedly short for &#039;&#039;&#039;Deep Shit Alert Table&#039;&#039;&#039;) describes startup text and fatal error dialogs for the classic Mac OS.&lt;br /&gt;
&lt;br /&gt;
== Specification ==&lt;br /&gt;
&lt;br /&gt;
See [https://preterhuman.net/macstuff/insidemac/OSUtilities/OSUtilities-36.html Inside Macintosh: Operating System Utilities, Chapter 2 - System Error Handler, The System Error Alert Table Resource].&lt;br /&gt;
&lt;br /&gt;
== Reading it ==&lt;br /&gt;
&lt;br /&gt;
ResEdit doesn&#039;t support &amp;lt;code&amp;gt;DSAT&amp;lt;/code&amp;gt; and only shows a hex editor despite having a custom icon for the resource type.&lt;br /&gt;
&lt;br /&gt;
Here is an extremely rough Python script for dumping the alerts, their IDs, and their error messages. Despite DSAT definitions being polymorphic, there is no type information, so it determines what is an alert by process of elimination (correct size, text pointers are valid, pointed-to text is ASCII). Copy-paste the hex editor output from ResEdit into a text file, then pass its filename to this script:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;code&amp;gt;dsat.py&amp;lt;/code&amp;gt; contents&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
from argparse import ArgumentParser&lt;br /&gt;
from pathlib import Path&lt;br /&gt;
import struct&lt;br /&gt;
from typing import NamedTuple&lt;br /&gt;
&lt;br /&gt;
parser = ArgumentParser()&lt;br /&gt;
parser.add_argument(&#039;hexfilepath&#039;)&lt;br /&gt;
buffer = bytes.fromhex(Path(parser.parse_args().hexfilepath).read_text())&lt;br /&gt;
offset = 0&lt;br /&gt;
&lt;br /&gt;
def read_short():&lt;br /&gt;
    global offset&lt;br /&gt;
    number = int.from_bytes(buffer[offset:offset + 2])&lt;br /&gt;
    offset += 2&lt;br /&gt;
    return number&lt;br /&gt;
&lt;br /&gt;
definition_count = read_short()&lt;br /&gt;
definitions: dict[int, &#039;Definition&#039;]&lt;br /&gt;
&lt;br /&gt;
class Alert(NamedTuple):&lt;br /&gt;
    text1_id: int&lt;br /&gt;
    text2_id: int&lt;br /&gt;
    icon_id: int&lt;br /&gt;
    proc_id: int&lt;br /&gt;
    button_layout_id: int&lt;br /&gt;
&lt;br /&gt;
    @property&lt;br /&gt;
    def text1(self):&lt;br /&gt;
        return definitions[self.text1_id].as_text().replace(&#039;/&#039;, &#039;\n&#039;) if self.text1_id else None&lt;br /&gt;
&lt;br /&gt;
    @property&lt;br /&gt;
    def text2(self):&lt;br /&gt;
        return definitions[self.text2_id].as_text().replace(&#039;/&#039;, &#039;\n&#039;) if self.text2_id else None&lt;br /&gt;
&lt;br /&gt;
    @property&lt;br /&gt;
    def text(self):&lt;br /&gt;
        if not self.text1:&lt;br /&gt;
            return None&lt;br /&gt;
&lt;br /&gt;
        if self.text2:&lt;br /&gt;
            return self.text1 + &#039;\n&#039; + self.text2&lt;br /&gt;
&lt;br /&gt;
        return self.text1&lt;br /&gt;
&lt;br /&gt;
class Definition(NamedTuple):&lt;br /&gt;
    id: int&lt;br /&gt;
    data: bytes&lt;br /&gt;
&lt;br /&gt;
    def as_alert(self):&lt;br /&gt;
        return Alert(*struct.unpack(&#039;&amp;gt;HHHHH&#039;, self.data))&lt;br /&gt;
&lt;br /&gt;
    def as_text(self):&lt;br /&gt;
        return self.data[4:-1].decode(&#039;ascii&#039;)&lt;br /&gt;
&lt;br /&gt;
def read_definition():&lt;br /&gt;
    global offset&lt;br /&gt;
    id = read_short()&lt;br /&gt;
    length = read_short()&lt;br /&gt;
    data = buffer[offset:offset + length]&lt;br /&gt;
    offset += length&lt;br /&gt;
    return Definition(id, data)&lt;br /&gt;
&lt;br /&gt;
default_alert = read_definition().as_alert()&lt;br /&gt;
definitions = {(definition := read_definition()).id: definition&lt;br /&gt;
               for _ in range(definition_count)}&lt;br /&gt;
&lt;br /&gt;
for error_id, definition in definitions.items():&lt;br /&gt;
    if len(definition.data) == 10:&lt;br /&gt;
        alert = definition.as_alert()&lt;br /&gt;
        try:&lt;br /&gt;
            print(error_id, &#039;-&#039;, alert.text)&lt;br /&gt;
        except (KeyError, UnicodeDecodeError):&lt;br /&gt;
            pass&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Contents in different system versions ==&lt;br /&gt;
&lt;br /&gt;
TODO: make that utility first&lt;br /&gt;
&lt;br /&gt;
[[Category:Classic Mac OS]]&lt;/div&gt;</summary>
		<author><name>Huntertur</name></author>
	</entry>
	<entry>
		<id>https://computers.huntertur.net/index.php?title=System_Error_Alert_Table&amp;diff=1051</id>
		<title>System Error Alert Table</title>
		<link rel="alternate" type="text/html" href="https://computers.huntertur.net/index.php?title=System_Error_Alert_Table&amp;diff=1051"/>
		<updated>2025-09-25T00:27:53Z</updated>

		<summary type="html">&lt;p&gt;Huntertur: Create script for reading DSAT&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &#039;&#039;&#039;System Error Alert Table&#039;&#039;&#039; (resource type &#039;&#039;&#039;&amp;lt;code&amp;gt;DSAT&amp;lt;/code&amp;gt;&#039;&#039;&#039;, allegedly short for &#039;&#039;&#039;Deep Shit Alert Table&#039;&#039;&#039;) describes startup text and fatal error dialogs for the classic Mac OS.&lt;br /&gt;
&lt;br /&gt;
== Specification ==&lt;br /&gt;
&lt;br /&gt;
See [https://preterhuman.net/macstuff/insidemac/OSUtilities/OSUtilities-36.html Inside Macintosh: Operating System Utilities, Chapter 2 - System Error Handler, The System Error Alert Table Resource].&lt;br /&gt;
&lt;br /&gt;
== Reading it ==&lt;br /&gt;
&lt;br /&gt;
ResEdit doesn&#039;t support &amp;lt;code&amp;gt;DSAT&amp;lt;/code&amp;gt; and only shows a hex editor despite having a custom icon for the resource type.&lt;br /&gt;
&lt;br /&gt;
Here is an extremely rough Python script for dumping the alerts, their IDs, and their error messages. Copy-paste the hex editor output from ResEdit into a text file, then pass its filename to this script:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;code&amp;gt;dsat.py&amp;lt;/code&amp;gt; contents&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
from argparse import ArgumentParser&lt;br /&gt;
from pathlib import Path&lt;br /&gt;
import struct&lt;br /&gt;
from typing import NamedTuple&lt;br /&gt;
&lt;br /&gt;
parser = ArgumentParser()&lt;br /&gt;
parser.add_argument(&#039;hexfilepath&#039;)&lt;br /&gt;
buffer = bytes.fromhex(Path(parser.parse_args().hexfilepath).read_text())&lt;br /&gt;
offset = 0&lt;br /&gt;
&lt;br /&gt;
def read_short():&lt;br /&gt;
    global offset&lt;br /&gt;
    number = int.from_bytes(buffer[offset:offset + 2])&lt;br /&gt;
    offset += 2&lt;br /&gt;
    return number&lt;br /&gt;
&lt;br /&gt;
definition_count = read_short()&lt;br /&gt;
definitions: dict[int, &#039;Definition&#039;]&lt;br /&gt;
&lt;br /&gt;
class Alert(NamedTuple):&lt;br /&gt;
    text1_id: int&lt;br /&gt;
    text2_id: int&lt;br /&gt;
    icon_id: int&lt;br /&gt;
    proc_id: int&lt;br /&gt;
    button_layout_id: int&lt;br /&gt;
&lt;br /&gt;
    @property&lt;br /&gt;
    def text1(self):&lt;br /&gt;
        return definitions[self.text1_id].as_text().replace(&#039;/&#039;, &#039;\n&#039;) if self.text1_id else None&lt;br /&gt;
&lt;br /&gt;
    @property&lt;br /&gt;
    def text2(self):&lt;br /&gt;
        return definitions[self.text2_id].as_text().replace(&#039;/&#039;, &#039;\n&#039;) if self.text2_id else None&lt;br /&gt;
&lt;br /&gt;
    @property&lt;br /&gt;
    def text(self):&lt;br /&gt;
        if not self.text1:&lt;br /&gt;
            return None&lt;br /&gt;
&lt;br /&gt;
        if self.text2:&lt;br /&gt;
            return self.text1 + &#039;\n&#039; + self.text2&lt;br /&gt;
&lt;br /&gt;
        return self.text1&lt;br /&gt;
&lt;br /&gt;
class Definition(NamedTuple):&lt;br /&gt;
    id: int&lt;br /&gt;
    data: bytes&lt;br /&gt;
&lt;br /&gt;
    def as_alert(self):&lt;br /&gt;
        return Alert(*struct.unpack(&#039;&amp;gt;HHHHH&#039;, self.data))&lt;br /&gt;
&lt;br /&gt;
    def as_text(self):&lt;br /&gt;
        return self.data[4:-1].decode(&#039;ascii&#039;)&lt;br /&gt;
&lt;br /&gt;
def read_definition():&lt;br /&gt;
    global offset&lt;br /&gt;
    id = read_short()&lt;br /&gt;
    length = read_short()&lt;br /&gt;
    data = buffer[offset:offset + length]&lt;br /&gt;
    offset += length&lt;br /&gt;
    return Definition(id, data)&lt;br /&gt;
&lt;br /&gt;
default_alert = read_definition().as_alert()&lt;br /&gt;
definitions = {(definition := read_definition()).id: definition&lt;br /&gt;
               for _ in range(definition_count)}&lt;br /&gt;
&lt;br /&gt;
for error_id, definition in definitions.items():&lt;br /&gt;
    if len(definition.data) == 10:&lt;br /&gt;
        alert = definition.as_alert()&lt;br /&gt;
        try:&lt;br /&gt;
            print(error_id, &#039;-&#039;, alert.text)&lt;br /&gt;
        except (KeyError, UnicodeDecodeError):&lt;br /&gt;
            pass&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Contents in different system versions ==&lt;br /&gt;
&lt;br /&gt;
TODO: make that utility first&lt;br /&gt;
&lt;br /&gt;
[[Category:Classic Mac OS]]&lt;/div&gt;</summary>
		<author><name>Huntertur</name></author>
	</entry>
</feed>