const minisrv_service_file = true; let client_caps = null; if (socket.ssid != null) { if (session_data.capabilities) { client_caps = session_data.capabilities.get(); } } headers = `200 OK Content-Type: text/html`; const versionMap = [ { build: 0, vers: `1.0` }, { build: 200, vers: `1.1` }, { build: 300, vers: `1.2` }, { build: 1000, vers: `1.3` }, { build: 1090, vers: `1.3Retail` }, { build: 1127, vers: `1.4Retail` }, { build: 1150, vers: `1.4` }, { build: 2000, vers: `2.0` }, { build: 2100, vers: `2.0J` }, { build: 2150, vers: `2.0.1J` }, { build: 2200, vers: `2.0.1` }, { build: 2300, vers: `2.0.3` }, { build: 2500, vers: `2.0.5` }, { build: 3000, vers: `2.1` }, { build: 3065, vers: `2.1.1` }, { build: 3070, vers: `2.1.5` }, { build: 3250, vers: `2.1.7` }, { build: 3450, vers: `Springboard2.2` }, { build: 3600, vers: `2.0.2J` }, { build: 3700, vers: `2.2.1J` }, { build: 3800, vers: `2.2.5` }, { build: 5000, vers: `2.3` }, { build: 5200, vers: `Fiji` }, { build: 5500, vers: `2.3.5` }, { build: 5700, vers: `2.3.7` }, { build: 5750, vers: `2.3.8` }, { build: 5759, vers: `2.3.8-NAND` }, { build: 6000, vers: `3.0` }, // WNI actually did this, i'm pretty sure they gave up { build: 32767, vers: `Private` }, ]; function getVersion(givenBuild) { return (versionMap.at(versionMap.findIndex(({ build }) => build > givenBuild) - 1).vers); } const serviceIP = minisrv_config.config.service_ip; const zTitle = `WebTV Services, (${minisrv_version_string})`; const systemVersion = session_data.get("wtv-system-version"); const bootromVersion = session_data.get("wtv-client-bootrom-version"); const SSID = wtvshared.filterSSID( session_data.get("wtv-client-serial-number") ); const romType = session_data.get("wtv-client-rom-type"); const chipVersionStr = "0x0" + parseInt(session_data.get("wtv-system-chipversion")).toString(16); const sysConfigHex = "0x" + parseInt(session_data.get("wtv-system-sysconfig")).toString(16); const capabilitiesTable = new WTVClientCapabilities().capabilities_table; // halen's sysconfig/chipversion stuff const soloVersion = (chipVersionStr & 0xf00000) >> 0x14; const soloFab = (chipVersionStr & 0xf0000) >> 0x10; const boardType = (sysConfigHex & 0x7000) >> 0xc; const boardRev = (sysConfigHex & 0xf00) >> 8; const boardRevB = (sysConfigHex & 0xf0) >> 4; // determine box ASIC type let chip; switch (chipVersionStr >> 0x18) { case 1: chip = "FIDO1"; break; case 3: chip = `SOLO-${soloVersion}, fab ${soloFab}`; break; case 4: chip = `SOLO2-${soloVersion}, fab ${soloFab}`; // don't know much about this one break; default: chip = "?"; } // ========================= LC2 SYSCONFIG DECODE START ========================= // determine box video type let video; if ((sysConfigHex & 8) == 0) video = "NTSC"; else video = "PAL"; // determine box storage type let storage; if ((sysConfigHex & 4) == 0) storage = "disk"; else storage = "flash"; // determine box CPU endianness let endianness; if ((sysConfigHex & 0x80000) == 0) endianness = "little"; else endianness = "big"; // determine box CPU type let cpu; if ((sysConfigHex & 0x100000) == 0) cpu = 5230; else cpu = 4640; // determine box CPU clock multiplier let cpuMult; if ((sysConfigHex & 0x20000) == 0) cpuMult = 3; else cpuMult = 2; // determine smartcard 0 support let sc0; if ((sysConfigHex & 0x400000) == 0) sc0 = "supported"; else sc0 = "not supported"; //determine smartcard 1 support let sc1; if ((sysConfigHex & 0x200000) == 0) sc1 = "supported"; else sc1 = "not supported"; // ========================= FCS SYSCONFIG DECODE START ========================= /* "I don't even know how it works." -Bruce Leak, Thursday, October 12, 1995 1:53:28 AM */ // determine box CPU output bufs let outputBufs; if ((sysConfigHex & 0x2000) == 0) outputBufs = 100; else outputBufs = 50; // determine box SGRAM speed function getSGSpeed() { const SGRAMand = sysConfigHex & 0xc00000; if (SGRAMand == 0x400000) return 66; else if (0x400000 < SGRAMand) if (SGRAMand == 0x800000) return 77; else if (SGRAMand == 0xc00000) return 83; // potentially incorrect but looks like it should return 83MHz on known existing hardware else if (SGRAMand == 0) return 100; } // determine box audio chip type let audio; if ((sysConfigHex & 0xc0000) == 0xc0000) audio = "AKM4310/4309"; else audio = "Unknown"; // determine box audio clock source let audioClk; if ((sysConfigHex & 0x20000) == 0) audioClk = "SPOT"; else audioClk = "External"; // determine box video chip function getVideoChip() { const videoChipAnd = sysConfigHex & 0x600; if (videoChipAnd == 0x200) return "Bt851"; else if (videoChipAnd < 0x201 && videoChipAnd !== 0) return "Unknown"; else if (videoChipAnd == 0x400) return "Bt852"; else return "Philips7187/Bt866"; } // determine box video type let videoB; if ((sysConfigHex & 0x800) == 0) videoB = "PAL"; else videoB = "NTSC"; // determine box video clock source let videoClk; if ((sysConfigHex & 0x10000) == 0) videoClk = "External"; else videoClk = "SPOT"; // determine box board type let boardTypeB; switch (sysConfigHex & 0xc) { case 8: boardTypeB = "Trial"; break; case 0xc: boardTypeB = "FCS"; break; default: boardTypeB = "Unknown Type"; } // determine bank 0 type let bank0Type; if (sysConfigHex < 0) bank0Type = "Mask"; else bank0Type = "Flash"; // determine bank 0 mode let bank0Mode; if ((sysConfigHex & 0x40000000) == 0) bank0Mode = "Normal"; else bank0Mode = "PageMode"; // determine bank 1 type let bank1Type; if ((sysConfigHex & 0x8000000) == 0) bank1Type = "Flash"; else bank1Type = "Mask"; // determine bank 1 mode let bank1Mode; if ((sysConfigHex & 0x40000000) == 0) bank1Mode = "Normal"; else bank1Mode = "PageMode"; data = ` ${minisrv_config.config.service_name} Info


${minisrv_config.config.service_name} Info

Connected to: ${minisrv_config.config.service_name} Service
Host/Port: ${serviceIP}/${minisrv_config.services[service_name].port}
Service: ${zTitle}
Client: &vers; (Build ${systemVersion} [${getVersion(systemVersion)}])
Boot: &wtv-bootvers; (Build ${bootromVersion} [${getVersion(bootromVersion)}])
Silicon serial ID: ${SSID}
Connected at: &rate;
POP Number:
Client IP number: ${socket.remoteAddress} `; if (session_data.getSessionData("registered")) { data += `
Subscriber Name: ${session_data.getSessionData("subscriber_name")}
Subscriber Username: ${session_data.getSessionData("subscriber_username")}`; } data += `
ROM type: ${romType}
Modem f/w (when available): &modem;
Chip version: ${chipVersionStr} (${chip})`; if (sysConfigHex !== "0xNaN") data += `
SysConfig: ${sysConfigHex}`; data += `
Client capabilities:
`; // start loop Object.keys(capabilitiesTable).forEach(function (k) { data += `
${capabilitiesTable[k][1]} `; if (client_caps[capabilitiesTable[k][0]]) data += "True\n"; else data += "False\n"; }); // end loop data += `
`
    // TODO: finish FCS decode
    if (romType == "bf0app" && sysConfigHex !== "0xNaN") {
        data += `CPU Clk Mult = 2x Bus Clk, CPU output bufs @ ${outputBufs}%
ROM Bank 0:  ${bank0Type}, ${bank0Mode}, 120ns/60ns
ROM Bank 1:  ${bank1Type}, ${bank1Mode}, 150ns/75ns
SGRAM:  ${getSGSpeed()}MHz
Audio:  ${audio}, ${audioClk} Clk
Video:  ${getVideoChip()}, ${videoB}, ${videoClk} Clk
Board:  ${boardTypeB}, Rev = ${0xf - (boardRevB)} (${boardRevB})`;
    } else if (sysConfigHex !== "0xNaN") {
        data += `Video = ${video}, storage = ${storage}
CPU type = ${cpu}, ${endianness}-endian
CPU clock mult = ${cpuMult}x
SmartCard 0 ${sc0}, SmartCard 1 ${sc1}
Board type = ${boardType}, board rev = ${boardRev}`;
    }
    data += `

`;