
プルリクもらった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奨学生募集開始!