More hacking.
[mknbi.git] / mknbi.pl
index ad02c56..f28effa 100644 (file)
--- a/mknbi.pl
+++ b/mknbi.pl
@@ -18,6 +18,7 @@ use Elf;
 
 use constant;
 use constant DEBUG => 0;
+use constant LUA_VERSION => 0x04000000;        # 4.0.0.0
 
 use vars qw($libdir $version $format $target $output $module $relocseg $relocsegstr
        $progreturns $param $append $rootdir $rootmode $ip $ramdisk $rdbase
@@ -400,13 +401,13 @@ sub mknbi_menu ($)
        $module->add_pm_header("mknbi-menu-$version", $relocseg + 0x0, 0x60000, 1);
        $menudesc = { file => "$libdir/menu",
                segment => 0x6000,
-               maxlen => 0x20000,
+               maxlen => 0x10000,
                id => 16 };
        $module->add_segment($menudesc);
        if ($#ARGV >= 0) {
                return unless check_file($ARGV[0]);
                $datadesc = { file => $ARGV[0],
-                       segment => 0x8000,
+                       segment => 0x7000,
                        maxlen => 0x10000,
                        id => 17,
                        end => 1 };
@@ -431,13 +432,13 @@ sub mknbi_nfl ($)
        $module->add_pm_header("mknbi-nfl-$version", $relocseg + 0x0, 0x60000, 1);
        $menudesc = { file => "$libdir/nfl",
                segment => 0x6000,
-               maxlen => 0x20000,
+               maxlen => 0x10000,
                id => 16 };
        $module->add_segment($menudesc);
        if ($#ARGV >= 0) {
                return unless check_file($ARGV[0]);
                $datadesc = { file => $ARGV[0],
-                       segment => 0x8000,
+                       segment => 0x7000,
                        maxlen => 0x10000,
                        id => 17,
                        end => 1 };
@@ -450,36 +451,54 @@ sub mknbi_nfl ($)
        $module->copy_file($datadesc) if ($#ARGV >= 0);
 }
 
+#
+#      Packing of LUA program:
+#      LUA version as network int32, i.e. 4.0.0.0
+#      progname rounded to int32 boundary
+#      length of program as network int32
+#      program
+#
+sub read_lua_prog ($) {
+       my ($progfile) = @_;
+
+       open(P, $progfile) or die "Shouldn't happen, we already did check_file!\n";
+       # remove all but last component of filename
+       $progfile =~ s:.*/::;
+       $progfile .= "\x00";
+       local $/;
+       local $_ = <P>;
+       close(P);
+       my $len = length($progfile);
+       $len = ($len + 3) & ~0x3;
+       return (pack("Na${len}Na*", LUA_VERSION, $progfile, length($_), $_));
+}
+
 sub mkelf_lua ($)
 {
        my ($module) = @_;
        my ($menudesc, $datadesc);
 
        $format eq 'elf' or die "Only ELF images are catered for\n";
-       $#ARGV >= -1 or die "Usage: mkelf-lua [luaprog]\n";
+       $#ARGV >= 0 or die "Usage: mkelf-lua luaprog\n";
        print STDERR "Warning: mkelf-lua requires Etherboot 5.0 or later\n";
-       return unless check_file("$libdir/lua");
+       return unless check_file("$libdir/lua", $ARGV[0]);
        # $progreturns == 1
-       $module->add_pm_header("mkelf-lua-$version", $relocseg + 0x0, 0x60000, 1);
+       $module->add_pm_header("mkelf-lua-$version", 0x7c0, 0x60000, 1);
        $menudesc = { file => "$libdir/lua",
                segment => 0x6000,
                maxlen => 0x20000,
                id => 16 };
        $module->add_segment($menudesc);
-       if ($#ARGV >= 0) {
-               return unless check_file($ARGV[0]);
-               $datadesc = { file => $ARGV[0],
-                       segment => 0x8000,
-                       maxlen => 0x10000,
-                       id => 17,
-                       end => 1 };
-               $module->add_segment($datadesc);
-       } else {
-               $$menudesc{'end'} = 1;
-       }
+       my $progstring = &read_lua_prog($ARGV[0]);
+       my $progdesc = { string => $progstring,
+               segment => 0x8000,
+               maxlen => 0x4000,
+               id => 17,
+               end => 1 };
+       $module->add_segment($progdesc);
        $module->dump_segments();
        $module->copy_file($menudesc);
-       $module->copy_file($datadesc) if ($#ARGV >= 0);
+       $module->copy_string($progdesc);
 }
 
 $libdir = '@@LIBDIR@@';                # where config and auxiliary files are stored
@@ -588,6 +607,8 @@ B<mknbi-nfl> [--output=I<outputfile>] [I<dataimage>]
 
 B<mkelf-nfl> [--output=I<outputfile>] [I<dataimage>]
 
+B<mkelf-lua> [--output=I<outputfile>] I<luabin>
+
 B<mknbi-fdos> [--output=I<outputfile>] I<kernel.sys floppyimage>
 
 B<mknbi-dos> [--output=I<outputfile>] I<floppyimage>
@@ -852,6 +873,22 @@ image. Chaining to other menus works.
 Enhancements to the menu format accepted to specify other features such
 as titles, timeout, colours, and so forth are highly encouraged.
 
+=head1 MKELF-LUA
+
+B<mkelf-lua> makes an ELF image from a precompiled Lua
+(C<http://www.tecgraf.puc-rio.br/lua/>) program.
+
+Typical usage is:
+
+C<mkelf-lua> C<hello.lb> > C<luaprog.nb>
+
+where C<hello.lb> was generated from a Lua program by:
+
+C<luac -o hello.lb hello.lua>
+
+The functions available to Lua programs in this environment is described
+in a separate document.
+
 =head1 MKNBI-FDOS
 
 B<mknbi-fdos> makes a tagged image from a FreeDOS kernel file and a