From 826e9654c9710d93e2abcfa2aca211ecd4091413 Mon Sep 17 00:00:00 2001 From: minjaesong Date: Fri, 17 Dec 2021 14:18:10 +0900 Subject: [PATCH] alphabetised hangul display test --- assets/FontROM7x14_HANGUL.kra | 3 + assets/FontROM7x14_HI__HANGUL.bmp | Bin 0 -> 49206 bytes assets/FontROM7x14_HI__HANGUL.png | Bin 0 -> 2001 bytes assets/disk0/home/hangultest.js | 188 ++++++++++++++++++ terranmon.txt | 1 + .../src/net/torvald/tsvm/AppLoader.java | 3 +- tsvm_executable/src/net/torvald/tsvm/VMGUI.kt | 5 +- 7 files changed, 196 insertions(+), 4 deletions(-) create mode 100644 assets/FontROM7x14_HANGUL.kra create mode 100644 assets/FontROM7x14_HI__HANGUL.bmp create mode 100644 assets/FontROM7x14_HI__HANGUL.png create mode 100644 assets/disk0/home/hangultest.js diff --git a/assets/FontROM7x14_HANGUL.kra b/assets/FontROM7x14_HANGUL.kra new file mode 100644 index 0000000..35e3b84 --- /dev/null +++ b/assets/FontROM7x14_HANGUL.kra @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8255f6691a10df15989d83f3fcf57b396919bf33a69b27bda401aa891d85eba3 +size 118843 diff --git a/assets/FontROM7x14_HI__HANGUL.bmp b/assets/FontROM7x14_HI__HANGUL.bmp new file mode 100644 index 0000000000000000000000000000000000000000..b7f60c7e30d730142b89c857154ade95f433fd63 GIT binary patch literal 49206 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 literal 0 HcmV?d00001 diff --git a/assets/FontROM7x14_HI__HANGUL.png b/assets/FontROM7x14_HI__HANGUL.png new file mode 100644 index 0000000000000000000000000000000000000000..6833c2efc50b04216c86d77e5f57993c0def78a1 GIT binary patch literal 2001 zcmV;?2QK)DP)%>ds3@f@?bL!2beY&n+TJ>oG| zmW#wE#8FNMB)%28;_;i{lE+_yc|NxY_(e~t)WJ#zvobe`XNV()US+NGh?|5|b7h(8 z1g%Nf$RUjsBq*q26FMBksG5{ncVE2eTSA3AjJ_6X;N&QwOx`G|RqCoz)ks%q>Zpm_ z|L19IiCM3ECI*z5)&|>105hfJ^+B3@c9LI9~U*wvaxdwM_wq^IhSR&TR|+Db7C6%X9uHH z!M$*l(nb-H(HE_rHrdhfQDv|5OJ2VLLVB$j{f3+qKDe@%guK3t`|Ww*tg^~}R`#Eo zYpLuQrIyzh^c{Sipt`K@3-upMJ!{$d8AUXavM97{w%49ll|}nm`OX>r97do=^j4Kc z`#D-x0n+%WvLiYnfIYyyV5986Qc+RnRbp=E<+!V-M&!U=)4RG21$!0%@dE(zrjOa{ z2L@3D>STNQuTJ=)Y8&w!aB8sTPnG z@;H*HeMBM>K7RbJ{PX1%qoU%ZnGu|}#3?Z|w_A9%LQ9#oFPhmRaprkWt!uqB=Ws4u z*n8C=5OdbMWqo*>W(dV=l8DPRb^#04Cxo_=7v;<{a9JLH)CfR!S;S%N-4JB)VpMHF z(&ojpdCbz6W?9%X%X&|R#RFuSh=|5$X*1I&OCkO}R*4v-vgV-*FEv>?$-_B-?{K^) z(0c}8G;$!-o2BM^U18R>Ukdr6iH;mtBo@ zEhR{#ue1EThsAS3eQGWqz+_Jhhe!^I65;`q5x6S{N+LND!m4%%j5;MEeFO(y9NHOC zJ>nz|Jb$j>o;uYfhR-wpAo}%d- z7}+?hQFsPXcqZQC&dUI4&Zcu<1w;`)n)NA@t6>Mi4ulpu+kBvQ=7pm9mhipBt){hg zH&@zUCJghum{Wk`sMHep7<4g^38El@)4Y(7w90|!Ec0+wX8R73@$h_Lt^Gs8o>6GpR4UWNFJA|jImJ>#lMJu=$Q+qlvq90)T4u;&_R z$$-Rdzt^%jt>D-@XGel+Z&YF`v|Xz!O(HmmP^^If008h*fD$vP+(aD%(-0WB=fKn6 z%)v`HUsL_Cl#TXV({P8{*UofjW_n-2F`n^BH_%k|hbrs;(|T&kyycnVva?}rJxAcZ z7F@bqF>}W^Hx}>hG?94cyWSBEnpzE1>Ew_U`1OboZc?~5GdM|0SVzT6wfp6JPD`}| zcXkw8u1t_P&wJ%U<#p-YZQ@%Q@-w$JL=_LqT}v9FYZ|!-nK2i%~|W67a`G2(-M)lkwHq4g(`}-7{RkWJ)?aeQF59G z^IWu`N8+f@(L;rjt163&Dv}OmL9!38 j0(Y>T01x+t-W`4c?Dil#ke(vA00000NkvXXu0mjfNgBM^ literal 0 HcmV?d00001 diff --git a/assets/disk0/home/hangultest.js b/assets/disk0/home/hangultest.js new file mode 100644 index 0000000..8e2cd05 --- /dev/null +++ b/assets/disk0/home/hangultest.js @@ -0,0 +1,188 @@ +//sys.poke(-1299460, 19) // map the font ROM to the mapping area +//sys.poke(-1299460, 19) // write to the font ROM + +let chrmap = { + 0: '\xA6', // ㄱ + 1: '\xA7', // ㄴ + 2: '\xA8', // ㄷ + 3: '\xA9', // ㄹ + 4: '\xAA', // ㅁ + 5: '\xAB', // ㅂ + 6: '\xAC', // ㅅ + 7: '\xAD', // ㅇ + 8: '\xAE', // ㅈ + 9: '\xAF', // ㅊ +10: '\xD0', // ㅋ +11: '\xD1', // ㅌ +12: '\xD2', // ㅍ +13: '\xD3', // ㅎ + +10: '\xD4', // ㅏ +11: '\xD5', // ㅐ +12: '\xD6', // ㅑ +13: '\xD7', // ㅒ +14: '\xB5', // ㅓ +15: '\xB6', // ㅔ +16: '\xB7', // ㅕ +17: '\xB8', // ㅖ +18: '\xBD', // ㅗ +19: '\xBE', // ㅛ +20: '\xC6', // ㅜ +21: '\xC7', // ㅠ +22: '\xD8', // ㅡ +23: '\xCF', // ㅣ + +30: '\x9D', // ₩ +} + +let hangulIdisasm = [ +'\xA6', +'\xA6\xA6', +'\xA7', +'\xA8', +'\xA8\xA8', +'\xA9', +'\xAA', +'\xAB', +'\xAB\xAB', +'\xAC', +'\xAC\xAC', +'\xAD', +'\xAE', +'\xAE\xAE', +'\xAF', +'\xD0', +'\xD1', +'\xD2', +'\xD3', +] + +let hangulPdisasm = [ +'\xD4', +'\xD5', +'\xD6', +'\xD7', +'\xB5', +'\xB6', +'\xB7', +'\xB8', +'\xBD', +'\xBD\xD4', +'\xBD\xD5', +'\xBD\xCF', +'\xBE', +'\xC6', +'\xC6\xB5', +'\xC6\xB6', +'\xC6\xCF', +'\xC7', +'\xD8', +'\xD8\xCF', +'\xCF', +] + +let hangulFdisasm = [ +'', +'\xA6', +'\xA6\xA6', +'\xA6\xAC', +'\xA7', +'\xA7\xAE', +'\xA7\xD3', +'\xA8', +'\xA9', +'\xA9\xA6', +'\xA9\xAA', +'\xA9\xAB', +'\xA9\xAC', +'\xA9\xD1', +'\xA9\xD2', +'\xA9\xD3', +'\xAA', +'\xAB', +'\xAB\xAC', +'\xAC', +'\xAC\xAC', +'\xAD', +'\xAE', +'\xAF', +'\xD0', +'\xD1', +'\xD2', +'\xD3', +] + +let UTF8_ACCEPT = 0 +let UTF8D = [ + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, + 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, + 8,8,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 10,3,3,3,3,3,3,3,3,3,3,3,3,4,3,3, 11,6,6,6,5,8,8,8,8,8,8,8,8,8,8,8, + 0,12,24,36,60,96,84,12,12,12,48,72, 12,12,12,12,12,12,12,12,12,12,12,12, + 12, 0,12,12,12,12,12, 0,12, 0,12,12, 12,24,12,12,12,12,12,24,12,24,12,12, + 12,12,12,12,12,12,12,24,12,12,12,12, 12,24,12,12,12,12,12,12,12,24,12,12, + 12,12,12,12,12,12,12,36,12,36,12,12, 12,36,12,12,12,12,12,36,12,36,12,12, + 12,36,12,12,12,12,12,12,12,12,12,12, +] + +/** + * @param utf8text A JS string in UTF-8 + * @return array of Unicode codepoints + */ +function utf8decode(utf8text) { + var state = UTF8_ACCEPT + var codep = 0 + var codepoints = [] + + for (let i=0; i < utf8text.length; i++) { + let byte = utf8text.charCodeAt(i) + let type = UTF8D[byte] + codep = (state != UTF8_ACCEPT) ? + (byte & 0x3f) | (codep << 6) : (0xff >> type) & (byte) + state = UTF8D[256 + state + type] + if (state == UTF8_ACCEPT) + codepoints.push(codep) + } + return codepoints +} + +let str = "한글 TVDOS 0마당 3고개" // in utf-8 for TSVM + +/** + * @param codepoint A single Unicode character in codepoint + * @return A string representation of the character in TSVM codepage converted from the codepoint + */ +function hangulDecode(codepoints) { + let s = '' + + for (let i = 0; i < codepoints.length; i++) { + let codepoint = codepoints[i] + let c1 = codepoints[i+1] + + + serial.println(codepoint.toString(16)) + serial.println(String.fromCharCode(codepoint)) + + + if (0xAC00 <= codepoint && codepoint <= 0xD7A3) { + let i = ((codepoint - 0xAC00) / 588)|0 + let p = ((codepoint - 0xAC00) / 28 % 21)|0 + let f = (codepoint - 0xAC00) % 28 + s += (hangulIdisasm[i] + hangulPdisasm[p] + hangulFdisasm[f]) + if (0xAC00 <= c1 && c1 <= 0xD7A3) s += ' ' + } + else if (0x20A9 == codepoint) s += '\x9D' + else { + s += String.fromCharCode(codepoint) + if (0xAC00 <= c1 && c1 <= 0xD7A3) s += ' ' + } + } + + return s +} + +println(hangulDecode(utf8decode(str))) \ No newline at end of file diff --git a/terranmon.txt b/terranmon.txt index 9055d5a..78fb80a 100644 --- a/terranmon.txt +++ b/terranmon.txt @@ -177,6 +177,7 @@ From the start of the memory space: unused 1920 mapped to font ROM + Font Mapping area holds 128 characters in consecutive order, each character is always 15 bytes. 2 bytes Cursor position in: (y*80 + x) diff --git a/tsvm_executable/src/net/torvald/tsvm/AppLoader.java b/tsvm_executable/src/net/torvald/tsvm/AppLoader.java index c2aa3c8..a8153f7 100644 --- a/tsvm_executable/src/net/torvald/tsvm/AppLoader.java +++ b/tsvm_executable/src/net/torvald/tsvm/AppLoader.java @@ -1,6 +1,5 @@ package net.torvald.tsvm; -import com.badlogic.gdx.Gdx; import com.badlogic.gdx.backends.lwjgl3.Lwjgl3Application; import com.badlogic.gdx.backends.lwjgl3.Lwjgl3ApplicationConfiguration; import com.badlogic.gdx.graphics.glutils.ShaderProgram; @@ -49,6 +48,6 @@ public class AppLoader { pipvm, 160, 140 )))); - new Lwjgl3Application(new VMGUI(pip, WIDTH, HEIGHT), appConfig); + new Lwjgl3Application(new VMGUI(reference, WIDTH, HEIGHT), appConfig); } } diff --git a/tsvm_executable/src/net/torvald/tsvm/VMGUI.kt b/tsvm_executable/src/net/torvald/tsvm/VMGUI.kt index 81b29f3..13d9085 100644 --- a/tsvm_executable/src/net/torvald/tsvm/VMGUI.kt +++ b/tsvm_executable/src/net/torvald/tsvm/VMGUI.kt @@ -9,6 +9,7 @@ import net.torvald.terrarum.modulecomputers.tsvmperipheral.WorldRadar import net.torvald.tsvm.peripheral.* import java.io.File + class EmulInstance( val vm: VM, val display: String?, @@ -71,8 +72,8 @@ class VMGUI(val loaderInfo: EmulInstance, val viewportWidth: Int, val viewportHe private fun init() { if (loaderInfo.display != null) { val loadedClass = Class.forName(loaderInfo.display) - val loadedClassConstructor = loadedClass.getConstructor(vm::class.java) - val loadedClassInstance = loadedClassConstructor.newInstance(vm) + val loadedClassConstructor = loadedClass.getConstructor(String::class.java, vm::class.java) + val loadedClassInstance = loadedClassConstructor.newInstance("./assets", vm) gpu = (loadedClassInstance as GraphicsAdapter) vm.getIO().blockTransferPorts[0].attachDevice(TestDiskDrive(vm, 0, File(loaderInfo.diskPath)))