2025-05-15
5月15日、いちごの日。公益財団IchigoJam財団の福井県内の小中学生対象、プログラミング奨学金提供初事業、いよいよ募集開始。
「奨学金について | IchigoJam財団」

小学3年生の時に買ってもらったMSXで、思う存分プログラミングできた時間がとっても貴重でした。ゲームは1日1時間、でも、MSXは無制限というルールに大感謝!

あの頃の夢、MSX用のカセット自作に向けた、MSX用ROMファイルをライトに開発するために開発を始めた超軽量エミュレーターMIX。ついに、かわくだりゲームが動きました!


「kawakudari - MIX」
src on GitHub
SCREEN1の一部のエミュレートするMIXScreen1とZ80エミュレーターを組み合わせた、MIXCanvasに、かわくだりゲームを動かす最小限のBIOSのエミュレーションにのみ対応しています。(参考、bios at MIXCanvas.js


「IchigoJam/MIX」

URLパラメータでURLや、16進法でエンコードしたROMファイルを指定して動くようにしました。例えば、下記のURLで HELLO WORLD が動きます。

https://ichigojam.github.io/MIX/?rom=41421040000000000000000000000000cd2140213640cd2d4018fe3e2032aff3c9cd1b403e01cd5f00cdc300c97eb7c8cda2002318f748656c6c6f21204d53580d0a00

「IchigoJam/kawakudari_sdcc_msx」

Z80用開発環境SDCCを使った開発環境と、かわくだりゲームサンプルをちょっと起動に時間がかかるけど高機能なopenMSXから、MIXに切り替え、サクっとブラウザで動作確認できるようになり、開発サイクルの大幅短縮を実現!


「HELLOWORLD - MIX」

思う存分プログラミングをしよう!

links
- 公益財団法人IchigoJam財団
- MIX - a compact Z80 emulator with support for MSX BIOS

2025-05-14
MSXの互換BIOSを持つ超軽量エミュレーター「MIX」に画面をくっつけるためにWebGLを使ったパフォーマンスが良いスクリーンを実装しました。


「MIX SCREEN 1 DEMO by WebGL」
src on GitHub
8x8のフォントデータ2048byteと、32x24のテキストVRAM768byteを変更すると、WebGLを使って高速画面描画する拡張タグ mix-screen1 ができました!

import { MIXScreen1 } from "https://ichigojam.github.io/MIX/MIXScreen1.js"; import { rnd } from "https://js.sabae.cc/rnd.js"; const scr1 = await MIXScreen1.create(); main.appendChild(scr1); const draw = () => { const fontROM = scr1.fontROM; const textVRAM = scr1.textVRAM; const n = 10; for (let i = 0; i < n; i++) { textVRAM[rnd(textVRAM.length)] = rnd(256); } const m = rnd(256); for (let i = 0; i < 8; i++) { fontROM[m * 8 + i] ^= 0xff; } scr1.draw(); requestAnimationFrame(draw); }; draw(); RUN on ES-Jam

シンプルに書けていい感じ!


IchigoJamFONTをPNGやバイナリ化して、対応。他、いろいろとご活用ください!

続いて、Z80とBIOSと接続していきます!

links
- MIX - 超軽量MSXエミュレーター with Z80.js

2025-05-13
MSX向けソフトウェアの開発サイクルを速くするために超軽量エミュレータを合わせて作っていきます。


MITライセンスのオープンソース実装「Z80.js」を発見、ESモジュール化して、メモリとBIOSの一部をつなげるテストプログラム「test.js」を書き「Hello World」に成功!

下記のように、MSXのBIOSレベルでエミュレートする作戦です const bios = (st) => { /* BIOS emulate 0x005F CHGMOD - スクリーンモード切替 0x00C3 CLS - 画面全体をクリア 0x00A2 BIOSの CHPUT 0x00D5 INKEY ; ret a: 1=up, 2=right up, 3=right, 4=right down, 5=down, 6=left down, 7=left, 8=left up 0x00C6 POSIT locate: ; H: x, L: y 0x004A RDVRM HL - Address read, ret a */ if (st.pc == 0x5f) { console.log("CHGMOD", st.a); } else if (st.pc == 0xc3) { console.log("clear"); } else if (st.pc == 0xA2) { // CHPUT console.log("CHPUT", String.fromCharCode(st.a), st.a); } return false; };
「IchigoJam/Z80.js: Emulator for the Z80 microprocessor in JavaScript / ESmodule」

Z80.jsは、Z80という1976年生まれコンピューターのJavaScriptで作られたエミュレーター。下記のようにメモリをセットして動かします。 import { Z80 } from "./Z80.js"; const mem = new Array(64 * 1024); mem[0] = 0x3C; // INC A mem[1] = 0x76; // HALT const z80 = new Z80({ mem_read: (address) => { console.log("mem_read", address.toString(16)); return mem[address]; }, mem_write: (address, value) => { console.log("mem_write", address.toString(16), value); mem[address] = value; }, io_read: (port) => { console.log("io read", port); return 0; }, io_write: (port, value) => { console.log("io write", port, value); }, }); console.log(z80); console.log(z80.getState()); z80.reset(); console.log(z80.run_instruction()); console.log(z80.run_instruction()); console.log(z80.run_instruction()); console.log(z80.run_instruction()); console.log(z80.getState()); Z80.example.js

deno -A https://ichigojam.github.io/Z80.js/Z80.example.js

Denoですぐ動かせます!

Tweet
クリエイティブ・コモンズ・ライセンス
本ブログの記事や写真は「Creative Commons — CC BY 4.0」の下に提供します。記事内で紹介するプログラムや作品は、それぞれに記載されたライセンスを参照ください。
CC BY / @taisukef / アイコン画像 / プロフィール画像 / 「一日一創」画像 / RSS