2025-05-17
プルリクもらったZ80版IchigoJamコンソール。軽量エミュレーターMIXをCP/M対応し、動かすことに成功!


8bitパソコン用OS、CP/Mのエミュレーションコードを書いて、Deno/JavaScriptを使ったコンソール動作に成功。


「IchigoJam/MIX」

CP/Mに仮対応したオープンソース、BDOSの対応コード「cpm.js」はこんな感じです。 const bios = (st) => { if (st.pc == 0x05) { // BDOS if (st.c == 2) { putc(st.e); } else if (st.c == 6) { if (st.e != 255) { putc(st.e); } else { // input st.a = getc(); return true; } } else if (st.c == 25) { // stop check st.a = 0; // 1 if stop return true; } else if (st.c == 32) { // (F_USERNUM) - get/set user number const user = st.e; // 0-15 if (user == 255) { st.a = 0; return true; } return; } else if (st.c == 15) { // (F_OPEN) - Open file const fcb = getFCB(st); //console.log(fcb); mem[fcb.de + 13] = 0; st.a = 0; // success return true; } else if (st.c == 26) { // BDOS function 26 (F_DMAOFF) - Set DMA address const de = (st.d << 8) | st.e; addrDMA = de; /* for (let i = 0; i < 128; i++) { mem[addrDMA + i] = 0; } */ } else if (st.c == 33) { // (F_READRAND) - Random access read record const fcb = getFCB(st); //console.log(fcb); try { const data = Deno.readFileSync(fcb.fn); const len = 1024; if (data.length != len) { console.log("wrong length"); return true; } for (let i = 0; i < 128; i++) { mem[addrDMA + i] = data[fcb.nrec * 128 + i]; } mem[fcb.de + 13] = fcb.nrec + 1; st.a = 0; st.b = 0; st.h = 0; st.l = 0; } catch (e) { // no files st.a = 0xff; st.b = 0; st.h = 0; // not found st.l = 0; } return true; } else if (st.c == 34) { // (F_WRITERAND) - Random access write record const fcb = getFCB(st); //console.log("writerand", fcb); const len = 1024; const data = mem.subarray(addrDMA, addrDMA + len); //console.log("data", data); mem[fcb.de + 13] = fcb.nrec + 1; st.a = 0; st.b = 0; st.h = 0; st.l = 0; Deno.writeFileSync(fcb.fn, data); return true; } else if (st.c == 16) { // (F_CLOSE) - Close file st.a = 0; // success return true; } else if (st.c == 19) { // (F_DELETE) - delete file const fcb = getFCB(st); //console.log("delete" , fcb.fn); //await Deno.delete(fcb.fn); st.a = st.b = 0; st.h = 0; st.l = 0; return true; } else { console.log("unsupported BDOS", st.c, st.a, st.e); } // console.log("unsupported BDOS", st.c, st.a, st.e); return false; } return false; };

links
- MIX - 超軽量MSXエミュレーター with Z80.js
- フォントパターンとVRAMを高速表示、MIX SCREEN1 by WebGL
- Z80/SDCCで開発しMIXでデバッグするMSX用ROM開発、IchigoJam奨学生募集開始!

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