From f62f7512439b50b59a52e3a60c8ce2b5f0467d41 Mon Sep 17 00:00:00 2001 From: minjaesong Date: Mon, 12 Aug 2019 03:59:39 +0900 Subject: [PATCH] some random stuffs? --- .../virtualcomputer/computer/BLIT.kt | 87 ++++++++++++++++++ work_files/UI/blit_6x10.raw | Bin 0 -> 15360 bytes work_files/UI/computer_blit_terminal.psd | 3 + 3 files changed, 90 insertions(+) create mode 100644 src/net/torvald/terrarum/modulecomputers/virtualcomputer/computer/BLIT.kt create mode 100644 work_files/UI/blit_6x10.raw create mode 100644 work_files/UI/computer_blit_terminal.psd diff --git a/src/net/torvald/terrarum/modulecomputers/virtualcomputer/computer/BLIT.kt b/src/net/torvald/terrarum/modulecomputers/virtualcomputer/computer/BLIT.kt new file mode 100644 index 000000000..d3dfd0f5f --- /dev/null +++ b/src/net/torvald/terrarum/modulecomputers/virtualcomputer/computer/BLIT.kt @@ -0,0 +1,87 @@ +package net.torvald.terrarum.modulecomputers.virtualcomputer.computer + +import net.torvald.UnsafeHelper +import net.torvald.UnsafePtr +import net.torvald.terrarum.AppLoader +import net.torvald.terrarum.CommonResourcePool + +/** + * Blit is a display adapter that operates in pixel-space, with resolution of 224x320 with bit depth of one. + * + * This Blit is inspired by the real-world Blit terminal from 1982 by Bell Labs. + * + * @link https://en.wikipedia.org/wiki/Blit_(computer_terminal) + * + * Created by minjaesong on 2019-07-22. + */ +class BLIT { + + private val framebuffer = UnsafeHelper.allocate(W.toLong() * H) + + var scrollOffsetX = 0 + var scrollOffsetY = 0 + var textCursorPos = 0 + + // each pixel is a byte. I know, 7 bits wasted, but whatever. + + // any conversion to texture/GDX pixmap/etc must be done by other system. + // at least you can memcpy() them using UnsafeHelper + // TODO test memcpy() over pixmap and native memory + + private fun toAddr(x: Int, y: Int) = (W * y + x) % framebuffer.size + + fun drawPict(x: Int, y: Int, bytes: ByteArray, width: Int) { + for (yy in 0L until bytes.size / width) { + val writeAddr = toAddr(x, y) + + UnsafeHelper.memcpyRaw( + bytes, (if (AppLoader.is32BitJVM) 8 else 16) + yy * width, + null, framebuffer.ptr + writeAddr, + width.toLong() + ) + } + } + + fun drawLetter(px: Int, py: Int, char: Int) { + for (yy in 0L until 13L) { + UnsafeHelper.memcpy( + fontRom.ptr + (FONTROMW * (char / FONTROMCOLS) * FONTH * yy) + (char % FONTROMCOLS) * FONTW, + toAddr(px, py), + FONTW.toLong() + ) + } + } + + + /** + * Notes: + * + * - The font ROM will not be redefine-able. Just draw your shape on the pixel space. + */ + companion object { + const val W = 240 + const val H = 320 + + const val FONTW = 6 + const val FONTH = 10 + + const val FONTROMW = 192 + const val FONTROMH = 80 + + const val FONTROMCOLS = FONTROMW / FONTW + const val FONTROMROWS = FONTROMH / FONTH + + const val TEXT_OFFSET_X = 0 // hand-calculated value + const val TEXT_OFFSET_Y = 4 // hand-calculated value + // so, y=0..3 and y=317..320 won't be touched by the text drawing + + init { + // load common font rom + CommonResourcePool.addToLoadingList("dwarventech.computers.blit.fontrom") { + // TODO + } + } + + private val fontRom = CommonResourcePool.getAs("dwarventech.computers.blit.fontrom") + } +} \ No newline at end of file diff --git a/work_files/UI/blit_6x10.raw b/work_files/UI/blit_6x10.raw new file mode 100644 index 0000000000000000000000000000000000000000..f9b1f72c0590a698f9363065c0cecd3e36e738ea GIT binary patch literal 15360 zcmeH{jdt8R4ukvtFMXHz08;eWNhbZ-y?ajGM4~_dggle}`0>5xA0BIV{XLi8&Q_Ek zKfHcwzB8w`s#Xc-z)9!WQFzD!uM^wBKGD6k#hgHL*H91Mp7wRZT`RhHQMocUWO1Cf z$!ZCl$H#!~xV=ec3lXt9syKSfQQY`6(W*KL&#$zu<7#g~wrf}u^w6PM)r&KPcxU>d z6u^()6jsVOJd4k&hSXj)wtw+SkWi{8C;Oqn7_An%(yjbBqR;|mtycBg4D>ehFqE)B z%fJ*?g4hCQ%}}FO{nHP%ccIKdHpXg-Ccb{X9W5GnAJ$RIz(0XJEMqjp>J;as>ETjN zM|@PtMlwta)ld4~THA5m&It-$xF25AS{t|$=k@Aa+zQ_8)&hUfEN9@$ke+BMF_J`x&5in=;tLl^g>?@Z;CTs0hbk?LhY_2)J*((> zdWw$JGc_5MGYxwMZ+`MYvBPD}n6<6Q3;nv3?m_zsy`H}|{)qAWoIaXR_@5i{=bS&e z&fnI&0sd<8A^0z7f7t8qWtx1!r4X|J?$-YmHl$m;IPxb+ZLuBrc8#Y@PqP2lB*CN1)H0?eNHno2EF@RE=oQb9LY}bdul}ytc}w z!zKSYyW4BA9N@Ap=>?ZB!{R=!%xl%`C;y}p(Gzp=kdHy<`6Ry`@U$DQaki6UW&*gz z$XPdt^C~-WYY`_sY^m{iUgLP-WctXTILA$0CscCd*_kVd3`;`ks4DwjJ!tY@g;2SB zEzDwa8x#aeAh$b@_}x968K>sbP9E^-D2$ROtt=xO0VX>Aw;v_>xyQH2CAkqkf`8uh z=c4>;RJr)S;QlMZD*Xw~>pCCQHMmYj4r4@L6z_kZ?9H4hN1Z?#wn}Ed!x`19_>1(n zVITA3e735HW`vb{)gs*6tPL1nFjVI+S)_6{N87IX-)SImuK!;tRCA!=)6N+%n}=7o zpNpGm?LXP=_;}COZ&n#aYgS>-9d%wJCZ@`1s#6EEzSU2b$>zk;6Tyk0& zKPj4G!VNZ{RX=HO7PTF||e>o*>Ivet6Mm&2!ih;o-W2*Mys>8bMebV*S@U7t8lqT`wHna!KL z3B>77{IPZ_Mbo8iNt8J(hr`%x`M!OLsG= zHT~+K$%2$>hBu^lRo$OoCC0W_tR_R8Jwk_9`s;MRyEaR=M3z!;U_x%8dwuy3^GnvR z6BPaO+yHmU^M0uJnU~?;Jm@vQ^$c-e!(y%VJL~6uNAn?1UVL#Fx&_ppwbe#8enILm z4|M=S?Wu!*Gx(^&@=bVJCnlAO!Q?#dh%~1PZgVe&nS4um2e_gHGXb?R2tPk+cDT{rP z#=W1_@8p~{M<H1J;37luw1G;c4o*bUZ$@`*y{UG*>k*8G$U5N9$b+7NpF{uil z%}ICR>4L28%LUviFqF$?boUlg<%sU}9l1MiPPzqgx!TeNS>3<+A3pv4CSBi=|H1pe zjQq*Ne8=9>?{5o&8(6m@#HJouE|A?!B`Z&3(lr+I%VNDQ6=uxVx8iCLn`f+WX@-bir4CT@J>}Tu~Ydy$2e1 tb87o100LUPDji>++|QnuaJNHAZ`ikh_x0Zy^uFu2!ak7y%%tDr`XBYA;u`<} literal 0 HcmV?d00001 diff --git a/work_files/UI/computer_blit_terminal.psd b/work_files/UI/computer_blit_terminal.psd new file mode 100644 index 000000000..3711f40fd --- /dev/null +++ b/work_files/UI/computer_blit_terminal.psd @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:587228e3319b73e33e75229e790f5e1aaf4788b15daf8f6cbb7a88feb2b5c562 +size 74585