[OpenBIOS] Findings on booting Mac OS 9.2

Programmingkid programmingkidx at gmail.com
Mon May 2 05:13:47 CEST 2016


I made a patch that prints everything that (evaluate) does, hoping it would tell me where execution stopped in the boot script. Here is the patch:

Index: forth/bootstrap/interpreter.fs
===================================================================
--- forth/bootstrap/interpreter.fs	(revision 1395)
+++ forth/bootstrap/interpreter.fs	(working copy)
@@ -151,6 +151,7 @@
   ;
 
 : (evaluate) ( str len -- ??? )
+   2dup fprintk
   save-source
   -1 ['] source-id (to)
   dup
Index: kernel/bootstrap.c
===================================================================
--- kernel/bootstrap.c	(revision 1395)
+++ kernel/bootstrap.c	(working copy)
@@ -89,7 +89,7 @@
 	"here", "here!", "dobranch", "do?branch", "unaligned-w@",
 	"unaligned-w!", "unaligned-l@", "unaligned-l!", "ioc@", "iow@",
 	"iol@", "ioc!", "iow!", "iol!", "i", "j", "call", "sys-debug",
-	"$include", "$encode-file", "(debug", "(debug-off)"
+	"$include", "$encode-file", "(debug", "(debug-off)", "fprintk"
 };
 
 /*
Index: kernel/forth.c
===================================================================
--- kernel/forth.c	(revision 1395)
+++ kernel/forth.c	(working copy)
@@ -1848,6 +1848,26 @@
 	PUSH(rstack[rstackcnt - 2]);
 }
 
+/*
+ *  fprintk  ( addr len -- )
+ *  writes a forth string to the serial output
+ */
+
+static void fprintk(void)
+{       
+    int len = POP();
+    int addr = POP();
+    char *message = malloc(sizeof(char) * 5000);
+    snprintf(message, len + 1, "%s", addr);
+    int i;
+    for (i = 0; i < len; i++) {
+        if (message[i] == '\r')
+            message[i] = ' ';
+    }
+    printk(message);
+    free(message);
+}
+
 /* words[] is a function array of all native code functions used by
  * the dictionary, i.e. CFAs and primitives.
  * Any change here needs a matching change in the primitive word's
@@ -1963,4 +1983,5 @@
     do_encode_file,         /* $encode-file */
     do_debug_xt,            /* (debug  */
     do_debug_off,           /* (debug-off) */
+    fprintk,                /* fprintk  */
 };
Index: libc/extra.c
===================================================================
--- libc/extra.c	(revision 1395)
+++ libc/extra.c	(working copy)
@@ -31,7 +31,7 @@
 
 int forth_printf( const char *fmt, ... )
 {
-	char buf[512];
+	char buf[5000];
 	va_list args;
 	int i;
 

Well after trying to run Mac OS 9.2 several times, this was the output:

['] display-ih cell+['] frame-buffer-adr cell+['] openbios-video-width cell+['] openbios-video-height cell+['] depth-bits cell+['] line-bytes cell+['] color-palette cell+to fb8-blitmaskto fb8-fillrectto fb8-invertrectto (romfont)to (romfont-height)to (romfont-width)['] vga-driver-fcode 2 cells + 1 byte-load: write dup >r bounds do i c@ fb-emit loop r> ; : draw-logo draw-logo ; : restore reset-screen ; fcode-debug?
>> =============================================================
>> OpenBIOS 1.1 [May 2 2016 02:45]
>> Configuration device id QEMU version 1 machine id 1
>> CPUs: 1
>> Memory: 384M
>> UUID: 00000000-0000-0000-0000-000000000000
>> CPU type PowerPC,750
milliseconds isn't unique.
>> bootstrdup encode-string " selected-partition-args" propertystrdup encode-string " selected-partition-args" propertyload-baseload-baseload-baseload-size here >r dev / " model" active-package get-package-property abort" can't find MODEL" decode-string 2swap 2drop " iMac,1" $= ?dup 0= if  " compatible" active-package get-package-property abort" can't find COMPATIBLE"  false >r  begin   dup while   decode-string here over 2swap bounds ?do    i c@ dup [char] A [char] Z between if h# 20 xor then c,    loop   2dup " macrisc" $= r> or >r   2drop   repeat  2drop r>   then r> here - allot 0= abort" this image is not for this platform" decimal 1 load-base load-size 14 - adler32    load-base load-size + 12 - 12 ['] eval catch if  2drop ." , bad checksum value" -1   then  <> if  ." , checksum error"  abort   then hex dev /openprom 0 0 " supports-bootinfo" property  device-end " /chosen" find-package 0= abort" can't find '/chosen'" constant /chosen " memory" /chosen get-package-property abort" memory??" decode-int constant xmem 2drop " mmu" /chosen get-package-property abort" mmu??" decode-int constant xmmu 2drop " AAPL,debug" " /" find-package 0= abort" can't find '/'"


I don't know if I can trust this output because there appears to be a limit to how much can be printed to the serial console. Sometimes I would see at the end "h# C864630D". I'm not sure why. This text is located at the very end of the boot script file. Past the forth section. I don't think the abort" word is the problem because there is no indication that it aborted the script. Hopefully someone will find this information useful. 


More information about the OpenBIOS mailing list