1 line
2.9 KiB
Plaintext
Executable File
1 line
2.9 KiB
Plaintext
Executable File
<CHRP-BOOT>
|
||
<COMPATIBLE>
|
||
MacRISC
|
||
</COMPATIBLE>
|
||
<DESCRIPTION>
|
||
Pre-bootloader clips visible RAM to allocate a RAM disk.
|
||
</DESCRIPTION>
|
||
<BOOT-SCRIPT>
|
||
hex 70.0.74.77.a
|
||
|
||
unselect-dev
|
||
|
||
" /options" find-package drop constant _options
|
||
" /memory" find-package drop constant _memory
|
||
|
||
2.00000 constant reboot-reserved-space
|
||
|
||
: boot-tbxj
|
||
" &device;:&partition;,"(5c):tbxj"
|
||
2dup open-dev if
|
||
$boot
|
||
then
|
||
." RAMBoot: Deferring to selected physical disk.
|
||
2drop mac-boot
|
||
;
|
||
|
||
struct
|
||
4 field >next-run
|
||
4 field >start-addr
|
||
4 field >byte-count
|
||
constant /phys-run
|
||
variable first-phys-run
|
||
|
||
first-phys-run
|
||
" reg" _memory get-package-property drop
|
||
|
||
begin ( run addr len )
|
||
dup while
|
||
decode-int >r ( run addr len )
|
||
|
||
rot ( addr len run )
|
||
/phys-run alloc-mem dup >r ( addr len run newrun )
|
||
swap ! ( addr len )
|
||
|
||
r> ( addr len newrun )
|
||
r> over >start-addr ! ( addr len newrun )
|
||
-rot
|
||
|
||
decode-int >r ( newrun addr len )
|
||
|
||
rot ( addr len newrun )
|
||
|
||
r> over >byte-count !
|
||
dup >start-addr @ ." Encoded range " .
|
||
dup >byte-count @ ." , " . cr
|
||
>next-run
|
||
-rot
|
||
|
||
repeat
|
||
2drop off
|
||
|
||
first-phys-run @
|
||
begin
|
||
dup >next-run @ ?dup while
|
||
nip
|
||
repeat
|
||
|
||
>r
|
||
r@ >byte-count @ reboot-reserved-space -
|
||
dup r@ >byte-count !
|
||
r> >start-addr @
|
||
+ constant reserved-run-start
|
||
|
||
0
|
||
first-phys-run @
|
||
|
||
begin
|
||
tuck >byte-count @ +
|
||
swap
|
||
>next-run @ ?dup 0= until
|
||
|
||
constant total-ram
|
||
" ramboot-disk-size" _options get-package-property
|
||
if
|
||
." RAMBoot: could not get prefs from NVRAM"
|
||
boot-tbxj
|
||
then
|
||
|
||
\ decode-int
|
||
decode-string $number drop
|
||
constant disk-ram 2drop
|
||
|
||
: encode-int+ encode-int encode+ ;
|
||
: encode-start >start-addr @ encode-int+ ;
|
||
: encode-count >byte-count @ encode-int+ ;
|
||
|
||
0 0 encode-bytes
|
||
total-ram disk-ram -
|
||
dup 0< if
|
||
3drop
|
||
." RAMBoot: specified size larger than installed memory."
|
||
boot-tbxj
|
||
then
|
||
|
||
first-phys-run @
|
||
begin ( addr len rem run )
|
||
tuck >byte-count @ ( addr len run rem count )
|
||
over < while ( addr len run rem )
|
||
>r >r ( addr len )
|
||
r@ encode-start
|
||
r@ encode-count
|
||
r> r> ( addr len run rem )
|
||
over >byte-count @ -
|
||
swap ( addr len rem run )
|
||
>next-run @
|
||
repeat
|
||
|
||
swap >r -rot ( rem addr len )
|
||
r@ encode-start
|
||
2 pick encode-int+
|
||
|
||
reserved-run-start encode-int+
|
||
reboot-reserved-space encode-int+
|
||
|
||
" /memory" find-device " reg" 2dup delete-property property unselect-dev ( rem )
|
||
." done with /memory" cr
|
||
|
||
dup r@ >start-addr @ + encode-int rot ( addr len rem )
|
||
r@ >byte-count @ swap - ?dup 0<> if
|
||
encode-int+
|
||
else
|
||
2drop 0 0 encode-bytes
|
||
then
|
||
|
||
r> >next-run @ ( addr len run )
|
||
begin
|
||
?dup while
|
||
>r
|
||
r@ encode-start
|
||
r@ encode-count
|
||
r> >next-run @
|
||
repeat
|
||
|
||
" /chosen" find-device " ramboot-phys-ranges" property unselect-dev
|
||
|
||
" /options" find-device
|
||
" ramboot-checksum" _options get-package-property 0= if
|
||
" ramboot-checksum" 2dup delete-property
|
||
property
|
||
then
|
||
unselect-dev
|
||
|
||
boot-tbxj
|
||
</BOOT-SCRIPT>
|
||
</CHRP-BOOT>
|
||
|