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.
On Sun, May 01, 2016 at 11:13:47PM -0400, Programmingkid wrote:
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.
[ line is over five times too long ]
That is the
load-base load-size + 12 - 12 ['] eval catch
in the boot script. The last 12 bytes of your Mac OS ROM are actual hex text holding the adler32 of the payload. If you just replace that text with dup (and a bunch of spaces, 12 chars total) the checksum will always match.
You can try slowing down your printing, maybe you won't lose most output that way.
Segher