Upgrade to Pro — share decks privately, control downloads, hide ads and more …

CPUクロック20MHz RAM 16MBの LUNAで 30秒アニメGIF再生デモ / OS...

CPUクロック20MHz RAM 16MBの LUNAで 30秒アニメGIF再生デモ / OSC2026Kyoto

2026/8/1(土)に行われたオープンソースカンファレンス2026京都の「NetBSDのご紹介」のセミナーで発表したスライドです。セミナー時のスライドからURLリンク追加など一部追記修正しています。

Avatar for Izumi Tsutsui

Izumi Tsutsui

August 01, 2026

More Decks by Izumi Tsutsui

Other Decks in Programming

Transcript

  1. NetBSD 11.0 ハイライト 一応いろいろ更新あります •Nintendo Wii, WiiU (NetBSD/evbppc) 実は最速3コアPowerPCマシン? いつもブース展示されてるやつです

    → •NetBSD/virt68k QEMUやnonoなどのm68kエミュレータ用 •NetBSD/riscv Allwinner D1, StarTech JH7100等のRISC-V SoC用 •NetBSD/m68k ソースコード共用化推進 luna68k固有更新はありませんがm68k周辺が地味に更新 ➔他のm68k更新は次回 9/12のOSC広島で紹介あるんじゃないかと… •NetBSD/hp300 HP9000/362, 382 Xサーバー 「私が書きました」案件 https://www.netbsd.org/releases/formal-11/NetBSD-11.0.html
  2. LUNAとBSD  4.4BSD/luna68k •純正OSは 4.3BSDベースの UniOS-B ▶SystemVベースの UniOS-Uもあり •前述の4.4BSDには LUNAサポートの

    ソースコードあり ▶OMRONの藤田さんがバークレー校で作業 ➔「次はLUNAですね」とNetBSD開発者に 狙われたのは自然な流れでした
  3. OSC2011関西@京都から15年  NetBSD/m68k Never die!  元々は「MC68030 workstation コラボ展示」 

    ご当地ということで LUNAをサプライズネタに 詳細はこちら http://www.ceres.dti.ne.jp/tsutsui/osc2011kyoto/index.html
  4. 動画もイケる? •LUNA-II は 68040 25MHz RAM 64MB で フレームバッファも256色対応 •640x480のDoomは「やや遅いかな?」

    くらいで一応ゲームっぽく動く •MPlayer動画も 384x216 10fps 音声無し だとなんとか動画っぽく再生はできる ➔初代LUNAの 68030 20MHZ RAM 16MB 白黒Xサーバーでも動画再生できないか? といろいろやってみたのが OSC2025京都
  5. 1989年製のアプリでも……? •モノクロ対応のビューア xv では? Dithering with ’black’ and ’white’ •モノクロ画像を連続表示をさせてみても

    画像を1枚開くたび10秒以上待たされる ➔実装を見ると、モノクロ画像の表示でも Xサーバー側が 1 bpp の場合は 無条件で 1 bpp ディザ変換が走る?
  6. 8 bpp フレームバッファの場合 8 bpp:1ドット=1バイト | | | | |

    | | | | | | | | | | | | | | | | | | | | | | | | | | | | 00 FF FF FF FF FF FF FF FF 00 00 00 00 00 FF 00 00 FF FF FF FF 00 00 00 00 FF FF FF FF FF FF FF •画像データは256色なら1ドット=1バイト フルカラーなら1ドット=3バイト •VRAMの読み書きは 1バイト単位 ➔事前に256色減色すればなんとかなる ✔そもそも1990年代は256色が一般的だった
  7. 1 bpp フレームバッファの場合 1 bpp:1ドット=1ビット |0 1 1 1 1

    1 1 1|1 0 0 0 0 0 1 0|0 1 1 1 1 0 0 0|0 1 1 1 1 1 1 1| | 7F | 82 | 38 | 7F | •256色 1ドット=1バイト の画像でも 1ドットずつ1バイト中の8ビットに詰める という操作がVRAMアクセスで必要 ➔通常アプリはこれをXサーバーにお任せ つまり、描画するたび重い変換が走る? ★モノクロ対応のためには自前で1 bppデータを用意必要?
  8. 変換なしで表示するには? •画像データを 1バイト=8ドットの形式で 持てば、VRAMへコピーだけで済むはず? •おもむろに ChatGPTに書かせてみながら 聞いてみると、以下でイケるっぽい (1)gif libのライブラリで 8

    bpp 形式で画像を読む (2)それを 1 bpp (1バイト=8ドット)形式に変換 (3)XCreateImage(3) で depth=1 のXImage を生成 (4)そこから XCreatePixmap(3) と XPutImage(3) で depth=1 の pixmap を生成 (5)その pixmap を XCopyPlane(3) で描画指示 等々 ➔つまりXserverは内部で1bpp形式もサポート ……しているが、ほとんど使われてないだけっぽい
  9. シンク オン グリーン •BNCコネクタのケーブルは 高価・太い・ 5本もあると取り回しが大変、という問題 本体 R R 本体

    R G G G B B B B H-SYNC H-SYNC H-SYNC H-SYNC V-SYNC V-SYNC V-SYNC V-SYNC ディスプレー ディスプレー R + •2つの同期信号のタイミングは 映像信号とは重ならないので、 緑信号に混ぜてしまえ、と いうのが Sync-on-Green 方式 ∈ G
  10. LUNA用モノクロCRT仕様 •LUNA用モノクロフレームバッファは カラー用からRとBを削除したもの 本体 R G ディスプレー R + G

    ∈ B B H-SYNC H-SYNC V-SYNC V-SYNC •一部のNANAOやDELLのPC用 液晶は(なぜかDELLのは最近まで) Sync-on-Green 対応なので、 VGA緑の接続で緑一色で映る! https://x.com/tsutsuii/status/1999656967795826914
  11. ChatGPT フットプリントの罠  人間もやりがち •VGAコネクタは 上の列が 1〜5 下の列が 11〜15 •基板側は端子がL字形

    で接続される ➔基板端面が 下側 11〜15 のはずが 見事に逆に… https://social.mikutter.hachune.net/@tsutsuii/116982383562642878
  12. 16MBでは Xserver 重すぎる問題 •LUNAのRAMは16MBで 起動後の空きは約12MB •さらにX.orgサーバーが数MB消費してる感 →フォントとかマウス処理とか背景とか •640x360モノクロ1画面容量は 約28KB •121frame

    24fps で 4.8秒 3.4 MB 程度が限界 •fpsを落とすと見え方が微妙になったりする •短いループだといまいち展示映えしない ➔技術的には「すげぇ」と思ったのに、 展示としては「これだけ?」感が…… orz
  13. フレームバッファ描画方法 Xserverもやってることは同じ ①/dev/ttyE0 を open(2) する ②ioctl(2) でフレームバッファ情報を取得 ③mmap(2) でVRAMをアクセス可能にする

    ④ioctl(2) で直接描画モードに切り替え ➔プログラムから直接 1bpp VRAMが見える ✔去年の monoGIFPlay X版の描画部分を VRAM直接描画に書き換えるだけだよな …と思いつつ、いまいち面白味なくてサボってました
  14. 困ったときの ChatGPT 頼み  材料とレシピを投げて設計書を書かせてみる •去年作った monoGIFPlay の GitHub を参照

    •GIF入力処理と 1bpp データ作成までは同じ •画面表示だけ NetBSD wscons を使う •wscons使用例は mlterm GitHub の ui を参照 •具体的な手順は前のページ同様の手順を列挙
  15. ChatGPT に教えられたこと •アニメGIF再生データのような領域は malloc(3) より mmap(2) の匿名領域が有利 •mmap(2) 領域だと madvise(3)

    でメモリ管理の ページング挙動のヒントも与えられる (=ページアウトされにくい・されやすいを をある程度コントロール可能)
  16. モノクロアニメGIF 変換方法 •切り抜きはさすがに AviUtl が楽 ➔こういうのはWindowsが強い感じ。 ついでに音声削除と 10fps (229フレーム) に変換

    ✔最終版デモ仕様では 15fps 344フレーム に •ffmeg で mp4→アニメGIF変換 ➔どうせモノクロ化するのでディザ無しのほうが良い •昨年作成の animegif2mono で2値化 ➔ -d 2 -c 60 でいい感じでした •magick で見出し追加+GIF矩形最適化 ➔disposeは monoGIFPlayが未対応なので none 指定