mirror of
https://github.com/curioustorvald/tsvm.git
synced 2026-03-08 12:11:51 +09:00
168 lines
4.5 KiB
JavaScript
168 lines
4.5 KiB
JavaScript
let SKIP_MEMTEST = 1
|
|
let BOOT_OVERRIDE = undefined // undefined or port number (int)
|
|
|
|
con.reset_graphics();con.curs_set(0);con.clear()
|
|
graphics.resetPalette()
|
|
|
|
const BIOS_VERSION_STR = "1.0"
|
|
|
|
function probeBootable() {
|
|
let driveStatus = 0
|
|
let bootable = [0,0,0,0]
|
|
for (let portNumber = 0; portNumber < 4; portNumber++) {
|
|
if (com.areYouThere(portNumber)) {
|
|
com.sendMessage(portNumber, "LOADBOOT")
|
|
driveStatus = com.getStatusCode(portNumber)
|
|
if (driveStatus == 0) bootable[portNumber] = 1
|
|
}
|
|
}
|
|
return bootable
|
|
}
|
|
|
|
function bootFromPort(port) {
|
|
con.clear()
|
|
try {
|
|
com.sendMessage(port, "LOADBOOT")
|
|
let driveStatus = com.getStatusCode(port)
|
|
if (driveStatus == 0) {Function(`"use strict";var _BIOS={};_BIOS.FIRST_BOOTABLE_PORT=[${port},1];Object.freeze(_BIOS);`+com.fetchResponse(port).trimNull())()}
|
|
else throw "No Bootsector"
|
|
}
|
|
catch (e) {
|
|
if ("No Bootsector" == e)
|
|
printerrln(`No bootable medium on COM ${port+1}`)
|
|
else
|
|
printerrln(`Boot failed with errors:\n\n${e}`)
|
|
|
|
serial.printerr(e)
|
|
}
|
|
}
|
|
|
|
function showSplash() {
|
|
println(`OpenBIOS version ${BIOS_VERSION_STR}`)
|
|
}
|
|
|
|
function showHowtoEnterMenu() {
|
|
let s = `Hit Ctrl+Shift+S+Q or SysRq to enter boot menu`
|
|
let [h,w] = con.getmaxyx()
|
|
con.move(h, (w-s.length)/2)
|
|
print(s)
|
|
}
|
|
|
|
function bootFromFirst() {
|
|
con.clear()
|
|
let port = (BOOT_OVERRIDE != undefined) ? BOOT_OVERRIDE : bootable.findIndex(it=>it==1)
|
|
if (port < 0) printerrln("No bootable medium found.")
|
|
else bootFromPort(port)
|
|
}
|
|
|
|
function runConfigurator() {
|
|
sys.unsetSysrq()
|
|
con.clear()
|
|
con.move(2,2);print("Devices:")
|
|
for (let i = 0; i < 4; i++) {
|
|
con.move(i*2+4, 2)
|
|
let bootableMark = (bootable[i]) ? "* " : " "
|
|
|
|
let deviceName = undefined
|
|
try {
|
|
com.sendMessage(i, "DEVNAM\x17")
|
|
deviceName = com.fetchResponse(i).substring(0,40)
|
|
}
|
|
catch (e) {
|
|
deviceName = `(device not connected)`
|
|
}
|
|
|
|
println(bootableMark + `Serial port #${i+1}: ` + deviceName)
|
|
}
|
|
|
|
let bootnum = undefined
|
|
while (true) {
|
|
con.move(12,1)
|
|
con.curs_set(1)
|
|
print("\n Hit 1, 2, 3 or 4 to boot from the specified device: ")
|
|
let dev = Number(read())
|
|
serial.println(dev)
|
|
if (Number.isInteger(dev) && dev >= 1 && dev <= 4) {
|
|
bootnum = dev - 1
|
|
break
|
|
}
|
|
}
|
|
bootFromPort(bootnum)
|
|
}
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
// Perform memtest
|
|
|
|
if (!SKIP_MEMTEST) {
|
|
let memptr = 0
|
|
let reportedMemsize = system.maxmem()
|
|
const memtestptn = (reportedMemsize >= 4194304) ?
|
|
[
|
|
[0x00,0xFF,0xAA,0x55]
|
|
] : (reportedMemsize >= 1048576) ?
|
|
[
|
|
[0x00,0xFF,0xAA,0x55 , 0x69,0x0F,0xA5,0x1E]
|
|
] : (reportedMemsize >= 262144) ?
|
|
[
|
|
[0x00,0xFF,0xAA,0x55 , 0x69,0x0F,0xA5,0x1E , 0xC7,0x71,0x8E,0xE3 , 0xCA,0xFE,0xBA,0xBE]
|
|
] :
|
|
[
|
|
[0x00,0xFF,0xAA,0x55 , 0x69,0x0F,0xA5,0x1E , 0xC7,0x71,0x8E,0xE3 , 0xCA,0xFE,0xBA,0xBE],
|
|
[0xFF,0xFF,0xFF,0xFF , 0xFF,0xFF,0xFF,0xFF , 0xFF,0xFF,0xFF,0xFF , 0xFF,0xFF,0xFF,0xFF]
|
|
]
|
|
|
|
con.move(2,1)
|
|
print(" 000 KB OK")
|
|
|
|
try {
|
|
while (memptr < (8 << 20)) {
|
|
// just print a number
|
|
con.move(2,1)
|
|
var memptrtext = ""+(1 + ((memptr) >> 10))
|
|
print((memptrtext < 10) ? " 00"+memptrtext : (memptrtext < 100) ? " 0"+memptrtext : (memptrtext < 1000) ? " "+memptrtext : memptrtext)
|
|
|
|
// perform memory test
|
|
for (var ptn = 0; ptn < memtestptn.length; ptn++) {
|
|
for (var bi = 0; bi < memtestptn[ptn].length; bi++) {
|
|
sys.poke(memptr + bi, memtestptn[ptn][bi])
|
|
if (memtestptn[ptn][bi] != sys.peek(memptr + bi)) throw "Memory Error"
|
|
}
|
|
/*for (var bi = 0; bi < memtestptn[ptn].length; bi++) {
|
|
sys.poke(memptr + bi, 255 - memtestptn[ptn][bi])
|
|
if (255 - memtestptn[ptn][bi] != sys.peek(memptr + bi)) throw "Memory Error"
|
|
}*/
|
|
}
|
|
|
|
memptr += memtestptn[0].length
|
|
}
|
|
throw undefined
|
|
}
|
|
catch (e) {
|
|
if (e == "Memory Error")
|
|
println(" "+e)
|
|
else
|
|
println(" KB OK!")
|
|
}
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
showSplash()
|
|
showHowtoEnterMenu()
|
|
|
|
let bootable = probeBootable()
|
|
let sysRq = false
|
|
let tmr = sys.nanoTime()
|
|
while (sys.nanoTime() - tmr < 3 * 1000000000.0) {
|
|
sysRq = sys.getSysrq()
|
|
if (sysRq) break
|
|
sys.spin()
|
|
}
|
|
|
|
if (!sysRq) bootFromFirst()
|
|
else runConfigurator()
|