Support multiple files on the command line (they're catted together).

Ditch a.out support while we're here (to save updating it).
This commit is contained in:
bjh21 2000-11-25 18:30:23 +00:00
parent fe63c77e86
commit 70562420ce

View File

@ -1,5 +1,5 @@
REM>BBBB
REM $NetBSD: BBBB,v 1.1 2000/11/25 13:32:52 bjh21 Exp $
REM $NetBSD: BBBB,v 1.2 2000/11/25 18:30:23 bjh21 Exp $
REM
REM Copyright (c) 1998, 1999, 2000 Ben Harris
REM All rights reserved.
@ -30,7 +30,7 @@ REM This file is part of NetBSD/arm26 -- a port of NetBSD to ARM2/3 machines.
REM
REM Ben's BASIC BSD Booter (allegedly)
debug% = 1
PRINT ">> BBBB, Revision 0.32"
PRINT ">> BBBB, Revision 0.40"
SYS "OS_ReadMemMapInfo" TO nbpp%, npages%
IF debug% THEN
PRINT "Machine has ";npages%;" pages of ";nbpp% DIV 1024;"K each. ";
@ -44,6 +44,9 @@ twirl% = 0
DIM vaddr%(npages%-1), access%(npages%-1), pgok%(npages%-1)
pgok%() = FALSE
maxfiles% = 10
DIM file$(maxfiles%), file%(maxfiles%), fsiz%(maxfiles%)
nfiles% = 0
PROCget_mem_map
SYS "OS_GetEnv" TO A$
@ -77,20 +80,30 @@ WHILE LEN(A$) > 0
WHEN " "
A$ = MID$(A$, 2)
OTHERWISE
IF file$ <> "" THEN ERROR EXT 0, "Too many files!"
IF nfiles% = maxfiles% THEN ERROR EXT 0, "Too many files!"
WHILE LEFT$(A$, 1) <> " " AND LEN(A$) > 0
file$ += LEFT$(A$,1)
file$(nfiles%) += LEFT$(A$,1)
A$ = MID$(A$, 2)
ENDWHILE
nfiles% += 1
ENDCASE
ENDWHILE
IF file$ = "" AND (howto% AND &01) THEN
INPUT "boot: "file$
INPUT "boot: "file$(0)
nfiles% = 1
ELSE
IF file$ = "" THEN file$ = "netbsd"
IF nfiles% = 0 THEN
file$(0) = "netbsd"
nfiles% = 1
ENDIF
ENDIF
PRINT "Booting "; file$; " (howto = 0x"; ~howto%; ")"
PROCload_kernel(file$)
PRINT "Booting ";
FOR i% = 0 TO nfiles% - 1
PRINT file$(i%);
IF i% < nfiles% - 1 THEN PRINT '" ";
NEXT
PRINT " (howto = 0x"; ~howto%; ")"
PROCload_kernel
DIM P% 1023
REM
[ OPT 2
@ -173,26 +186,23 @@ DEF PROCget_mem_map
NEXT
ENDPROC
DEF PROCload_kernel(file$)
LOCAL file%, magic%
file% = OPENIN(file$)
IF file% = 0 THEN ERROR 1, "Can't open kernel"
DEF PROCload_kernel
LOCAL magic%
DIM magic% 3
SYS "OS_GBPB", 3, file%, magic%, 4, 0
PROCread(magic%, 4, 0)
IF magic%?0 = 127 AND magic%?1 = ASC("E") AND magic%?2 = ASC("L") AND magic%?3 = ASC("F") THEN
PROCload_kernel_elf(file%)
PROCload_kernel_elf
ELSE
PROCload_kernel_aout(file%)
ERROR 1, "Not an ELF kernel"
ENDIF
CLOSE#file%
ENDPROC
DEF PROCload_kernel_elf(file%)
DEF PROCload_kernel_elf
LOCAL hdr%, phoff%, phentsize%, phnum%, phdrs%, ph%
LOCAL offset%, vaddr%, filesz%, memsz%, flags%, first%
LOCAL shoff%, shentsize%, shnum%, shdrs%, sh%, havesyms%, mshdrs%
DIM hdr% 51
SYS "OS_GBPB", 3, file%, hdr%, 52, 0
PROCread(hdr%, 52, 0)
IF hdr%?4 <> 1 THEN ERROR 1, "Not a 32-bit ELF file"
IF hdr%?5 <> 1 THEN ERROR 1, "Not an LSB ELF file"
IF hdr%?6 <> 1 THEN ERROR 1, "Not a version-1 ELF file"
@ -207,7 +217,7 @@ DEF PROCload_kernel_elf(file%)
shentsize% = hdr%!46 AND &FFFF
shnum% = hdr%!48 AND &FFFF
DIM phdrs% phnum% * phentsize% - 1
SYS "OS_GBPB", 3, file%, phdrs%, phnum% * phentsize%, phoff%
PROCread(phdrs%, phnum% * phentsize%, phoff%)
IF phnum% = 0 THEN ERROR 1, "No program headers"
first% = TRUE
FOR ph% = phdrs% TO phdrs% + (phnum% - 1) * phentsize% STEP phentsize%
@ -231,7 +241,7 @@ DEF PROCload_kernel_elf(file%)
ssym% = 0
esym% = 0
DIM shdrs% shnum% * shentsize% - 1
SYS "OS_GBPB", 3, file%, shdrs%, shnum% * shentsize%, shoff%
PROCread(shdrs%, shnum% * shentsize%, shoff%)
IF shnum% <> 0 THEN
havesyms% = FALSE
FOR sh% = shdrs% TO shdrs% + (shnum% - 1) * shentsize% STEP shentsize%
@ -265,6 +275,30 @@ DEF PROCload_kernel_elf(file%)
REM XXX
ENDPROC
DEF PROCread(addr%, size%, offset%)
LOCAL i%
FOR i% = 0 TO nfiles%
IF file%(i%) = 0 THEN
file%(i%) = OPENIN(file$(i%))
IF file%(i%) = 0 THEN ERROR 1, "Couldn't open " + file$(i%)
fsiz%(i%) = EXT#file%(i%)
ENDIF
IF offset% > fsiz%(i%) THEN
offset% -= fsiz%(i%)
ELSE
IF offset% + size% <= fsiz%(i%) THEN
SYS "OS_GBPB", 3, file%(i%), addr%, size%, offset%
ENDPROC
ELSE
SYS "OS_GBPB", 3, file%(i%), addr%, fsiz%(i%) - offset%, offset%
size% -= fsiz%(i%) - offset%
offset% = 0
ENDIF
ENDIF
NEXT
ERROR 1, "Ran off end of last file"
ENDPROC
DEF PROCload_chunk(file%, offset%, vaddr%, filesz%, memsz%)
LOCAL paddr%, ppn%, fragaddr%, fragsz%
PRINT ;filesz%;
@ -275,7 +309,7 @@ DEF PROCload_chunk(file%, offset%, vaddr%, filesz%, memsz%)
fragaddr% = vaddr%(ppn%) + paddr% MOD nbpp%
fragsz% = nbpp% - (paddr% MOD nbpp%)
IF fragsz% > filesz% THEN fragsz% = filesz%
SYS "OS_GBPB", 3, file%, fragaddr%, fragsz%, offset%
PROCread(fragaddr%, fragsz%, offset%)
PROCtwirl
offset% += fragsz%
vaddr% += fragsz%
@ -303,74 +337,6 @@ DEF PROCwrite_word(paddr%, val%)
!(vaddr%(paddr% DIV nbpp%) + paddr% MOD nbpp%) = val%
ENDPROC
DEF PROCload_kernel_aout(file%)
LOCAL hdr%
DIM hdr% 32
ssym% = 0 : esym% = 0
SYS "OS_GBPB", 3, file%, hdr%, 32, 0
bemagic% = (hdr%?0 << 24) OR (hdr%?1 <<16) OR (hdr%?2 << 8) OR hdr%?3
IF debug% THEN
CASE bemagic% AND &0000FFFF OF
WHEN &0107
PRINT "(OMAGIC)";
WHEN &0108
PRINT "(NMAGIC)";
WHEN &010B
PRINT "(ZMAGIC)";
WHEN &00CC
PRINT "(QMAGIC)";
ENDCASE
ENDIF
REM XXX: Assume ZMAGIC
REM foooff% is byte offset in file. foobasepage% is base page in RAM.
txtoff% = nbpp%
txtbase% = &98000
txtbasepage% = txtbase% DIV nbpp%
txtsize% = hdr%!4
IF txtsize% MOD nbpp% <> 0 THEN
ERROR EXT 1, "Text size not a multiple of page size"
ENDIF
txtpages% = txtsize% DIV nbpp%
dataoff% = txtoff% + txtsize%
databasepage% = txtbasepage% + txtpages%
database% = databasepage% * nbpp%
datasize% = hdr%!8
IF datasize% MOD nbpp% <> 0 THEN
ERROR EXT 1, "Data size not a multiple of page size"
ENDIF
datapages% = datasize% DIV nbpp%
bssbasepage% = databasepage% + datapages%
bssbase% = bssbasepage% * nbpp%
bsssize% = hdr%!12
freebase% = bssbase% + bsssize%
entry% = hdr%!20
PRINT ;txtsize%;
FOR pg% = 0 TO txtpages%-1
IF NOT pgok%(txtbasepage% + pg%) THEN ERROR 0,"Page not mine!"
SYS "OS_GBPB", 3, file%, vaddr%(txtbasepage%+pg%), nbpp%, txtoff% + pg%*nbpp%
PROCtwirl
NEXT
PRINT "+";datasize%;
FOR pg% = 0 TO datapages%-1
IF NOT pgok%(databasepage% + pg%) THEN ERROR 0,"Page not mine!"
SYS "OS_GBPB", 3, file%, vaddr%(databasepage%+pg%), nbpp%, dataoff% + pg%*nbpp%
PROCtwirl
NEXT
PRINT "+";bsssize%;
FOR pg% = 0 TO bsssize% DIV nbpp% : REM overshoot is safe
IF NOT pgok%(bssbasepage% + pg%) THEN ERROR 0,"Page not mine!"
PROCbzero(vaddr%(bssbasepage%+pg%), nbpp%)
PROCtwirl
NEXT
PRINT " "
ENDPROC
DEF PROCtwirl
PRINT MID$("|/-\", twirl%+1, 1)+CHR$(8);
twirl% += 1