Slide 1

Slide 1 text

ワープロって実は計算機で Kernel/VM探検隊@東京 No18 @pepepper_cpp

Slide 2

Slide 2 text

自己紹介 ● やんごとなき方がお通いになられていることで話題の某大学の 修士2年 ● 低レイヤのあたりで蠢いている ● 変なものを計算機に仕立て上げるのが得意(?) – 電子辞書とか

Slide 3

Slide 3 text

ワープロてなんや ● かつてコンピューターは日本語が不自由だった – かな漢字変換や日本語フォントて結構メモリ食う – しかも昔のパソコンは高え ● 日本語を扱うことに特化した物体→ワードプロセッサー – 気持ち安いかな・・・?(OASYS LX-7500SD 23万円) ● まあ末期の上位機種ではあるので高いのかも ● コンピューターが強くなるに従ってワープロも機能が増える – 表計算 グラフィック インターネット・・・ – 最終的にコンピューターに吸われてワープロ専用機は姿を消した

Slide 4

Slide 4 text

今回の犠牲者 ● 富士通製 OASYS LX-7500SD(1998年製)

Slide 5

Slide 5 text

何ができんねん ● 告知ツイートから考える

Slide 6

Slide 6 text

ワープロのOS ● ワープロモードとは別にMS-DOSモードがある – 理由は後述 – MS-DOSのバージョンは3.1くらい ● 1.2MBフォーマットのDOSディスクにアクセス可能 – 任意のプログラムを実行可能(制約あり) ● PC/AT互換機じゃないんで・・・ ● ワープロ側含めシステムは基本的にROM内に存在 – 旧機種だと根幹部分を揮発性メモリに読んでたりする ● のでシステムディスクがないと使い物にならなかった – の割に中古だとシステムディスク欠品が多い

Slide 7

Slide 7 text

ワープロのCPU ● なんとAMD製 Am486(66MHz) – i486の互換品 – 過去機種だと VM Technology製 VM865C110HL ● メモリは4MBくらいありそう? – 後の機種のLX-9500SDでは倍増 ● プロテクテッドモードに入ってまともに使えるかは不明 – 使えたらコード書くの楽になるんだが・・・

Slide 8

Slide 8 text

ワープロのネットワーク・ブラウザ ● なんとこの機種はモデム内蔵 – 33.6Kbpsまで ● 後継機種だと56kに対応 ● NiftyServe接続用「AutoCom」 – このためにMS-DOSが搭載されている ● Webブラウザもある – がHTTP/1.0にしか対応していない!!!! ● 某芸能人のサイトは魔改造されたプロキシがないと見れない ● 当然SSLにも対応していない – 後継機種だとSSLに対応しているらしい

Slide 9

Slide 9 text

ワープロのエディタ ● 当然ワープロとしてのエディタもあるが・・・ ● なぜかVectorにOASYS用Vz Editor差分が存在する – 実はとあるパソコンへの移植版の移植版であり・・・

Slide 10

Slide 10 text

ワープロのその他 ● 実は画面タッチで操作可能! – これでお絵描きも可能 ● 6色メガブラシ(?)できれいな虹もス〜イスイ(???) ● ディスクドライブはスーパーディスク(LS-120) – 売れてなさすぎてメディアが高い! ● プリンターもついている – インクリボンで普通紙に なしでも感熱紙に印刷可能 ● PCMCIAのスロットがある – がデータ用SRAMカードとスマートメディア変換くらい? ● フラッシュメモリ・ATAカードは使用不可らしい

Slide 11

Slide 11 text

ワープロの中身

Slide 12

Slide 12 text

ワープロの中身 ● チップ数が思ったより少ない – うげ デカいゲートアレイが2つある ● タイマーとか割り込みコントローラが多分まとめられている ● どこのアドレスに何がいるのさ! ● 右下のROMがx86 リアルモードでアクセスできる容量を超えている – そもそもRAM 4MBも超えてる – 「何」が挟まっている? ● MN89304って石は画面の方に線が行ってるっぽいぞ・・・ – データシート出ないんだけど! – 横には512KBのDRAMがいる

Slide 13

Slide 13 text

ワープロの画面IC ● MN8930”4”は出ないがMN8930”2”とかは出る – 800x600で256色出せる液晶コントローラーらしい – “S”VGAだ!!! ● “with IBM™ VGA-compatible registers“ – 拡張していないとは言っていない https://www.alldatasheet.jp/datasheet-pdf/view/14309/PANASONIC/MN89302.html

Slide 14

Slide 14 text

VGAとかSVGAとか ● ここでのVGAは狭義のVGA – IBM社が開発したVideo Graphics Arrayというボード – 仕様が公開されている ● 表示可能なグラフィックモード(の一部) – 640x480 16色/白黒 – 320x200 256色 ● VGAを超える解像度・色数を扱えるものがSVGA(Super VGA) – 各社メーカーが勝手に拡張 ● 拡張部分がバラバラの制御に – VGAが持っていたメモリウインドウ(128KB)に入り切らない ● どうすんねん

Slide 15

Slide 15 text

当然解析に回されるが・・・ ● 「機種によりBIOSに細かい差異があるが、おおよそFMR互換 であったので」(Wikipedia「OASYS」) – FMRは過去に富士通が販売していたパソコン – Vz Editorのバイナリを比較するとシステムコールが似ている – BIOSを追えばIOアドレスも制御方法もわかるってわけ ● 電子辞書の128倍楽(あっちはRAM 128MBなので) ● FMRのシステムの情報ほとんどネットにないんだけど – FMRはビジネス向けの色が強かったとかなんとか ● 富士通が別に販売していたFM-TOWNSもおおよそFMR互換 – こっちは情報が転がっている ● がFM-TOWNS側に欲しい情報が書かれていない – 残るは「富士通FMRシリーズ徹底解析マニュアル」のみ

Slide 16

Slide 16 text

仕方がないので ● 国会図書館に行きました – 2月だったので梅の花が咲いていた – 国立国会図書館内限定の資料なので行かざるを得ない ● コンソールBIOSの情報をメモって帰る – コンソールBIOSが画面制御を担っている ● GhidraにDOSのメモリダンプを突っ込む – リアルモードの扱いが微妙なので 手作業でセグメントの参照を調整 ● 変なレジスタアクセス見つけた! – FMRから拡張された部分のBIOSにあった

Slide 17

Slide 17 text

結局どういう仕組みだったか ● まず512KBのVRAMを4つに分ける – これで1ウインドウあたりのサイズはVGAと同じに ● でSequencer Register(IO 0x3C4)の0x8番レジスタに値を書く – 下位4bitが1だと640x480x256colorに 0だと白黒に – 上位4bitでメモリウインドウを選択 ● でOASYSのチップセット側でメモリバンクを指定する (IO 0xFF0A) – 0x00でVRAMの下位64KB 0x40で上位64KBが見える

Slide 18

Slide 18 text

無事画面表示を掌握 ● 技術書典でお品書き表示機にしていた – 前日に思いついて閉店直前のアキヨドで3万円のポータブル電源 を購入 – ウケは良かったのでヨシ! ● ソフトウェア側での制御は6500SD〜9500SDまでたぶん共通

Slide 19

Slide 19 text

さて

Slide 20

Slide 20 text

30分枠を生やしておいて ここで終わるわけ ないよね?

Slide 21

Slide 21 text

ワープロって実は計算機で だからプレゼンとかできるよね? Kernel/VM探検隊@東京 No18 @pepepper_cpp ここより先 実装しながら書いているので言うことが右往左往します

Slide 22

Slide 22 text

最近の流行 ● パソコン以外でプレゼンをするのが流行っているらしい – 「ルーターでプレゼンする」(puhitaku) ● Okayama Revengers LT 大会 #2 でのプレゼン – 「電子辞書をネットに繋げてみた」(RasPython3) ● Kernel/VM探検隊@関西 11回目 でのプレゼン ● 十分な性能(とIO)のある計算機ならプレゼンが可能 – ところでワープロって ● キーボードがある ● 画面がある ● ディスクドライブがある ● i486がある ● 行けるな ● 実は前回のKernel/VM時点ではハンディターミナルでプレゼン するつもりだった

Slide 23

Slide 23 text

ワープロプレゼンの課題 ● 画面はあるが画面外部出力はない – あったとして時代的にHDMIではない ● フロッピーって遅い – 画面の生データで1枚あたり300KBくらい必要 – 一方フロッピードライブは500kbpsくらいらしい ● シーク抜きで読み出しに5秒かかる計算 ● そんなプレゼン見るのかったるいわ!

Slide 24

Slide 24 text

ワープロプレゼンの課題解決策 ● 画面はあるが画面外部出力はない – あったとしてHDMIではない →FPGAに液晶の信号を食わせよう ● フロッピーって遅い – 画面の生データで1枚あたり300KBくらい必要 – 一方フロッピードライブは500kbpsくらいらしい ● シーク抜きで読み出しに5秒かかる計算 ● そんなプレゼン見るのかったるいわ! →GIF形式にして適当に圧縮してもらおう

Slide 25

Slide 25 text

画面信号変換君(仮名)の設計 ● 信号の情報のために再び液晶コントローラのデータシートへ – うわうわうわうわ ● ピクセルデータがクロック間で泣き別れする – 3clk集めると8pixel分が揃う ● しかもDCLKが出ていないタイミングでV/HSYNCが変化する – なんかシフトレジスタで受けることを想定していそう – DCLK基準だけで動かせない

Slide 26

Slide 26 text

画面信号変換君(仮名)の設計2 ● しかもなんか各色1bitしかない – 256/260K paletteとか言ってるのに ● 画面を撮った動画を見るとチラついているような・・・ – もしかしてフレーム間でPWMして色を出している・・・? ● 皆さんの目を守りたい – 遅延のあるSTN液晶なら問題ないが現代の液晶では見える – 複数フレーム間のデータで平均を取る? 4bit per colorくらいで ● しかしなんともメモリアクセスが間に合わない – アービトレーションむずい ● ということで我慢してください – とはいえスライドは白黒なのであんまり気にならないかも

Slide 27

Slide 27 text

画面信号変換君(仮名)の設計3 ● 画面コネクタのピンアサインを調べねば ● オシロスコープで信号を見る – 多分一番速いやつがDCLK 次がHSYNC 次がVSYNC – ランダムっぽいのがピクセルデータであろう ● なんかVSYNCが73Hzくらいあるんですけど – フレームレートの差分を吸収しなければならない – 60Hzだったらそのまま流せたのに ● 信号パターンだけじゃピクセルの信号のコネクタ上の並びが わからん – 一本ずつピクセルの線を抜く→色がおかしいラインが出る ● このラインの左端からの位置と抜けた色成分から判定する

Slide 28

Slide 28 text

基板作る ● 最初はスーパーディスクエミュレーターと一体で設計

Slide 29

Slide 29 text

基板作る ● Kernel/VMに間に合わねえ! 画面部分だけで設計する – 7/22くらいに基板が届いた ● OASYS側は5Vの信号で吐いてくる – バストランシーバーで3.3Vに落とす – が ダンピング抵抗入れてなくてDCLKがリンギングで5Vに! – まあ過去に5V入れても動いてたのでヨシ! ● 音をTMDSに流せるようにADCを配置 – しかしクロックが生成できなかったのでお蔵入り

Slide 30

Slide 30 text

FPGAのコードを書く ● 1単位が3bit(1bit per color)というのは扱いづらい – パディングを入れて2^n bit単位に後段で拡張する ● 愚直にやると初段の入力幅が1920bitとかになる – GowinのFIFO IPは1024bit幅までしか作れない – クソデカreg+wireでFIFOに詰められる形にする ● 落ちるFmaxとか足りないBRAMとかと格闘 – 気づけば前日 ←あまりにも大きすぎるregによって ありえない形になった Post Synthesis Netlist Viewer (90°回転)

Slide 31

Slide 31 text

ワープロのコードを書く ● 前に作っておいた7500sd-imageshowを改修 ● GIFの展開アルゴリズムを書いている余裕はない – gifdecを魔改造していい感じにしたかった ● リニアではないメモリへの書き込みについて考えたくない ● 画像先読みでお茶を濁す – 1スライドが5秒未満になることはそんなに無いだろう – ほぼすべてのコンベンショナルメモリを食いつぶすという問題 ● EMM.SYSを使えば一応拡張メモリを使えるが・・・ – やっぱり食いつぶしたのでEMMを使う ● EMM(Expanded Memory Manager)ってなぁに? – 本来DOS(リアルモード)は1MBのメモリ領域のみにアクセス可能 – 1MBの外のメモリを1MBの内側の領域に割り当てる ● あら不思議 メモリがいっぱい使える(+7MBくらい) ● あとはスライドショーっぽい感じの操作を実装するだけ

Slide 32

Slide 32 text

各種接続 ● 一応変換器の出力を直接機器に繋ぐことはできる – よその機械に胡乱なもの繋げて破壊したくね〜〜〜〜 ● 午後イチでやらかしたら怒られるで済まない ● KOBA789氏からアリエクHDMIキャプチャを買い上げた – パッと刺したら映るまでは行かないが設定すれば映る – 一度PCを経由しキャプチャした画面を流す ● 高精細な画面とワープロの画面を突然行き来して 視聴者を怖がらせましょう! ● なんとかなってよかった〜

Slide 33

Slide 33 text

各種解析情報 ● OASYSに関する情報 – https://www.pepepper.net/oasys/ – 溜め込んで放置している情報も順次追記していきたい ● スライド表示する君の改修元 – https://github.com/pepepper/7500sd-imageshow