8bitworkshop/src/platform/c64.ts

100 lines
3.6 KiB
TypeScript

import { C64_WASMMachine } from "../machine/c64";
import { Platform, Base6502MachinePlatform, getToolForFilename_6502, getOpcodeMetadata_6502, BaseMAME6502Platform } from "../common/baseplatform";
import { PLATFORMS } from "../common/emu";
const C64_PRESETS = [
{id:'hello.dasm', name:'Hello World (ASM)'},
{id:'eliza.c', name:'Eliza (C)'},
{id:'tgidemo.c', name:'TGI Graphics Demo (C)'},
{id:'upandaway.c', name:'Up, Up and Away (C)'},
{id:'joymove.c', name:'Joystick Movement (C)'},
{id:'siegegame.c', name:'Siege Game (C)'},
{id:'scroll1.c', name:'Scrolling 1 (C)'},
{id:'scroll2.c', name:'Scrolling 2 (C)'},
{id:'scroll3.c', name:'Scrolling 3 (C)'},
{id:'scroll4.c', name:'Scrolling 4 (C)'},
{id:'scroll5.c', name:'Scrolling 5 (C)'},
{id:'climber.c', name:'Climber Game (C)'},
{id:'multilines.c', name:'Multicolor Lines+Flood Fill (C)'},
{id:'sidtune.dasm', name:'SID Tune (ASM)'},
{id:'musicplayer.c', name:'Music Player (C)'},
];
const C64_MEMORY_MAP = { main:[
{name:'6510 Registers',start:0x0, size:0x2,type:'io'},
//{name:'RAM', start:0x2, size:0x7ffe,type:'ram'},
{name:'Cartridge ROM',start:0x8000,size:0x2000,type:'rom'},
{name:'BASIC ROM', start:0xa000,size:0x2000,type:'rom'},
{name:'RAM', start:0xc000,size:0x1000,type:'ram'},
{name:'VIC-II I/O', start:0xd000,size:0x0400,type:'io'},
{name:'SID', start:0xd400,size:0x0400,type:'io'},
{name:'Color RAM', start:0xd800,size:0x0400,type:'io'},
{name:'CIA 1', start:0xdc00,size:0x0100,type:'io'},
{name:'CIA 2', start:0xdd00,size:0x0100,type:'io'},
{name:'I/O 1', start:0xde00,size:0x0100,type:'io'},
{name:'I/O 2', start:0xdf00,size:0x0100,type:'io'},
{name:'KERNAL ROM', start:0xe000,size:0x2000,type:'rom'},
] }
// WASM C64 platform
class C64WASMPlatform extends Base6502MachinePlatform<C64_WASMMachine> implements Platform {
newMachine() { return new C64_WASMMachine('c64'); }
getPresets() { return C64_PRESETS; }
getDefaultExtension() { return ".c"; };
readAddress(a) { return this.machine.readConst(a); }
getMemoryMap() { return C64_MEMORY_MAP; }
showHelp() {
window.open("https://8bitworkshop.com/docs/platforms/c64/", "_help");
}
getROMExtension(rom:Uint8Array) {
/*
if (rom && rom[0] == 0x00 && rom[1] == 0x80 && rom[2+4] == 0xc3 && rom[2+5] == 0xc2) return ".crt";
*/
if (rom && rom[0] == 0x01 && rom[1] == 0x08) return ".prg";
else return ".bin";
}
}
// C64 MAME platform
abstract class C64MAMEPlatform extends BaseMAME6502Platform {
getPresets() { return C64_PRESETS; }
getToolForFilename = getToolForFilename_6502;
getOpcodeMetadata = getOpcodeMetadata_6502;
getDefaultExtension() { return ".c"; }
loadROM(title, data) {
if (!this.started) {
this.startModule(this.mainElement, {
jsfile:'mame8bitpc.js',
biosfile:'c64.zip',
cfgfile:'c64.cfg',
driver:'c64',
width:418,
height:235,
romfn:'/emulator/image.crt',
romdata:new Uint8Array(data),
romsize:0x10000,
extraargs: ['-autoboot_delay','5','-autoboot_command','load "$",8,1\n'],
preInit:function(_self) {
},
});
} else {
this.loadROMFile(data);
this.loadRegion(":quickload", data);
var result = this.luacall(`image:load("/emulator/image.prg")`)
console.log('load rom', result);
//this.loadRegion(":exp:standard", data);
}
}
start() {
}
getMemoryMap() { return C64_MEMORY_MAP; }
}
PLATFORMS['c64'] = C64WASMPlatform;
PLATFORMS['c64.wasm'] = C64WASMPlatform;
PLATFORMS['c64.mame'] = C64MAMEPlatform;