From 23143374790ea1a5efe44828cb3e3d538a7a74a1 Mon Sep 17 00:00:00 2001 From: minjaesong Date: Wed, 7 Jun 2023 13:48:21 +0900 Subject: [PATCH] bootable from encrypted bios --- assets/bios/tsvmbios.bin | Bin 0 -> 3446 bytes .../torvald/tsvm/peripheral/VMProgramRom.kt | 50 +++++++++++++++++- .../src/net/torvald/tsvm/VMEmuExecutable.kt | 2 +- 3 files changed, 49 insertions(+), 3 deletions(-) create mode 100644 assets/bios/tsvmbios.bin diff --git a/assets/bios/tsvmbios.bin b/assets/bios/tsvmbios.bin new file mode 100644 index 0000000000000000000000000000000000000000..2b023e2893cb5195d6f5f63d0eccd3b5176f1c64 GIT binary patch literal 3446 zcmV-+4TON^PJ;eNW<(mzfz z?#&^=MBx2ol%0v7qLQ^B9O*{;$x!fGr9$GwI@`|b`D_`fMl6|YOFw*H zAKT}W!S$rqCT&L=2orut+RvBPhuB%d$fs$nhnS=Ge2N~0ON7`x(#wV@LxX2kY%qgD z7DHe?m4#?>Xin->Ws=JuXPs`k_t9^%Kn`UoO959d(cO1Xwv&tbrAA6IUHURk8dWGj zs&983CjWHB2tegr8L~2){p$r9wlpoYbv}zsc3I&r|r~)=U@7 z!aBL#MPmp81yox0x@fz;wKq)u13+}}leNpc%>x=}Kf6MXLc*s45nFS^S^pPvb~+JG z7F#~Rdr&(VI?N!u9yfE4<`@i`>9Ka&c95RtqNSU0h@+q;NLy9V8=B_!SX1PLSpksy z(`Q7*uP4g06Z;B4(DI1c@2cCl{L3V28vh>{bBsi1%?`%m7!|WO3YT~X)@>Q$&N+QD z222J?XK6)AA&ij7S`}9*JaBUOvTLG@C0NAJt?sAThNnyl9ZBsT>H}iCA7TX-E>l9_ zv-`>vU2v5L|EA2Oiv@UKjcW;o=`?mzOHculE!}1tK)~(mjx)6yY7II#Oc!P_EY@Rr9WZj@2Up@*Tvc+ObMoX|=Ry5TjK_|1IM z*L8uUZ;joSP#I9I=x=}&l31xSz9C?&4Dp6Sy4hS5^zFU@S%+f#_k^B=ouRvxpS}gZ zT(LwmAu^I9A|v!(%m{SNK?V(mLlo190%Ku4p&OQM8_XW?co@i-%d;!jS1Blg}0dZO`fJrTM_aR)s`0M=j<@t?17-eKO<|o9|o=-lz=+jcr%xo&WZh#TE)d_{8mhZ ziiyVHhVZNT;*TV3j%H$)Yg~%=7l#gwX7O(I%xctw0GcW_f)HDKTc~8`RGA>(Tk!+I zoV3q6pemwIm_11Tv2$fLf&hOd46DD{5>J;Uzk4D6bJN!ax`N^&%4iIxv9R=Jfa_a;x<;>87QDPKw=1&K1bEJNT9OsKnS)62r6u_sU(?XX}82{9Hz2DynL$Q9a?q&znoHG zE2JODkOhl*fWF3vRq&YjqOYnwBXGN!4;sOYVS|J!!SYmU@;A zWW0{C<)tBPoh_8ietN~kQs;76m?|IlG;b)#(Ks^~>#ST79rE>`$-3+JH`AZrlL-Bb zNk%-IK+C84ILC((!}ujUh+7RJ;B9HgdPNQ4o4S8sjJet{hCKjYhOX>_$QS> z<#<3kNvF5F1$2t?#UFJHHTe6j|5`K2kA;8Y*dxXLnrp+2w|_o3%h|1fhKj1SfqYvA zUxkGuM;mad>z9n%gI&-A0L*&uQL1MZ!0)S~pe&=buzGpR#H-)IGaLg)vzDfYv3OtP ztjaV7i?aQZt#X{*@HkR@PwHpRZHXRtHFPeQi!Nvd9kf}A06s?qld47{Z#X8mnGb_~ zl`sj$@iJEuhFawnTgeQu_G!1cg4dekh+W^HJVo!|!Z5+&DHcdU_t)XnYQE^VVg?*G z6-KieKz6fbb$OL)%#G`3D-l$bI;I*7)I5g>&+5YgoLtG@?DVQN!Hm#+V^{H0!?I|D zIBL1&BP4i-`YRh}Jh8V*L~;FZngqnM;%PKWZG=Ok>?>GwOo%#tQ`9UE#=>4%o~;n% zO~W}HvJf#+qkRM#-`ai-+Lo`Ze7@*3SuQD$v84aioXidMKNbIZc}GKBM2YCDQ=bNI zD!C^+szQ7uHzG=W9m; zP5%`|7jgkpWLiHPQo4x^YEUa_YN^KV#NAv{{oQ^(!%4$~W>l-0yr`n%8~B=%4uUDJ z(rwC=(yJsL<$R*Ra=?2+rAdEFczLN?@>p_fobB&3QO63W+z7s0z<^NT6e+R~d>lpI^+(T!g&wX9 zx!e>CmS&ghUpdFuGCvOZw+y`P7 z5C0BS7@05Gf7S!f0+hFQHrdP3Ok|tFJu}U&&cKQ1j`|W8S0#O+o+E?F2TBYWMtQQA z*>N5u4@Vk=+FnZIv6cgR(2~POT@hZ-O01C%;a9t9O7%kb%qXRLD!ZZG*vDIu`B19F z7t&b$L_oNE0@WTBnimrb`_1gPZ9CY4O#M_Fm0Ok!sAnO{xBuNI)U@bY}ginP$&4TaJ?@*XQ!l)^8|87#o?Vj~qMqjNvtl>Y#lI ztLw${#9B;jJ-(qxujNf_Z$1xiYU-Pxrk-*a7%YKhRqE6gf@kWxa#-pCr%JN%F_n8& z>K(=LaM^@d$}rHV_sGuf9=p=kCq?BK>!ODRegEQL&NLfECI>?tXC zR|l5^E)F8BL)v{3*4>UK5oXu;$T9G?#!4>t{kVYCNQ)o&;zr~B%tZyVVoRsv%ln5e z(G@;dfZei8`RMJZ=_U$kE9}?k&W^o4@8j8=5MSTap0wOUk{=Pi&7k5a(Ttt7=*I7_ z-UX@%3oo&ny&b5_bI(VP>?M}mU0h?z^1xmV-1LPQ)ZE)bcM<^%9DpjB@wmk4^702H zv){xigYTbj!}q-42-A{#k1{0tQ`*YCj7$@oqpMOL3lj!nYZR{3WDb*YYE=|J0Jxdi!a&PK4xg`-Jq->Ae?U zy&owgtH+-=lG}8Y$J5wSpcS}OCRG3JY>(dAQiIFfNu;D5*oD3YOH=={$mpl)pZ-g2 zx6kg`z1igMTG)Um{*hZr>ELqge3pud||Zd)v8{)lgb|21`z>iuUQUFFH;@!EqcvUBV>bg z=gwLV+&Z_GWX~h%#15sFDs9s0XmgV4LAV>N;I>GN7TpgpT{z>{x%PnV2|?UGg?{}w Yjpb3}n2IP;)zSA}6OVWj)s_MyB1RwC4FCWD literal 0 HcmV?d00001 diff --git a/tsvm_core/src/net/torvald/tsvm/peripheral/VMProgramRom.kt b/tsvm_core/src/net/torvald/tsvm/peripheral/VMProgramRom.kt index 37a3a8a..91dfdc0 100644 --- a/tsvm_core/src/net/torvald/tsvm/peripheral/VMProgramRom.kt +++ b/tsvm_core/src/net/torvald/tsvm/peripheral/VMProgramRom.kt @@ -6,6 +6,7 @@ import net.torvald.tsvm.CompressorDelegate import net.torvald.tsvm.CompressorDelegate.Companion.GZIP_HEADER import net.torvald.tsvm.VM import java.io.File +import kotlin.experimental.xor open class VMProgramRom { private val contents: ByteArray @@ -26,13 +27,58 @@ open class VMProgramRom { fun readAll(): String { // check if bios is compressed in gzip - return if (contents.startsWith(GZIP_HEADER)) + return if (contents.startsWith(byteArrayOf(31, -85, 26))) + CompressorDelegate.decomp(dec(contents)).toString(VM.CHARSET) + else if (contents.startsWith(GZIP_HEADER)) CompressorDelegate.decomp(contents).toString(VM.CHARSET) else contents.toString(VM.CHARSET) } fun get(addr: Int): Byte = contents[addr] + + + private fun seq(s: String): String { + var out = "" + var cnt = 0 + var oldchar = s[0] + for (char in s) { + if (char == oldchar) { + cnt += 1 + } + else { + out += "$cnt$oldchar" + cnt = 1 + } + oldchar = char + } + return out + cnt + oldchar + } + + private data class EncState( + var key: String = "00", + var keyBytes: ByteArray = byteArrayOf(0), + var keyCursor: Int = 0 + ) + + private fun getNewKeySeq(s: EncState) { + s.key = seq(s.key) + s.keyCursor = 0 + s.keyBytes = ByteArray(s.key.length / 2) { + Integer.parseInt(s.key.substring(it*2, it*2 + 2), 16).toByte() + } + } + + private fun dec(b: ByteArray): ByteArray { + val s = EncState() + return ByteArray(b.size) { + (b[it] xor s.keyBytes[s.keyCursor++]).also { + if (s.keyCursor >= s.keyBytes.size) { + getNewKeySeq(s) + } + } + } + } } object GenericBios : VMProgramRom(File("./assets/bios/bios1.bin")) @@ -40,7 +86,7 @@ object OEMBios : VMProgramRom(File("./assets/bios/TBMBIOS.js")) object QuickBios : VMProgramRom(File("./assets/bios/quick.js")) object BasicBios : VMProgramRom(File("./assets/bios/basicbios.js")) object TandemBios : VMProgramRom(File("./assets/bios/tandemport.js")) -object TsvmBios : VMProgramRom(File("./assets/bios/tsvmbios.js")) +object TsvmBios : VMProgramRom(File("./assets/bios/tsvmbios.bin")) object BasicRom : VMProgramRom(File("./assets/bios/basic.bin")) object WPBios : VMProgramRom(File("./assets/bios/wp.js")) object OpenBios : VMProgramRom(File("./assets/bios/openbios.js")) diff --git a/tsvm_executable/src/net/torvald/tsvm/VMEmuExecutable.kt b/tsvm_executable/src/net/torvald/tsvm/VMEmuExecutable.kt index 8c3a56a..fbdb00d 100644 --- a/tsvm_executable/src/net/torvald/tsvm/VMEmuExecutable.kt +++ b/tsvm_executable/src/net/torvald/tsvm/VMEmuExecutable.kt @@ -556,7 +556,7 @@ class VMEmuExecutable(val windowWidth: Int, val windowHeight: Int, var panelsX: "assetsdir":"./assets", "ramsize":8388608, "cardslots":8, - "roms":["./assets/bios/tsvmbios.js"], + "roms":["./assets/bios/tsvmbios.bin"], "com1":{"cls":"net.torvald.tsvm.peripheral.TestDiskDrive", "args":[0, "./assets/disk0/"]}, "com2":{"cls":"net.torvald.tsvm.peripheral.HttpModem", "args":[1024, -1]}, "card4":{"cls":"net.torvald.tsvm.peripheral.RamBank", "args":[256]}