COL2MSXその2

ソースコードがあまりに汚いので書き直してみました。

f:id:tanam:20140705182044p:image:w360

COLECO.ROMとMISSION.ROMを分離したため、MISSION.ROMを取得するには、MISSIONでCOLECOVISIONをエミュレーションしている最中に、MESSのデバッガから以下のコマンドを打ちます。

> save MISSION.ROM,25EE,5FB

COL2MSXのメモリーマップは以下になります。

0000H-1FFFH COLECO.ROM
2000H-25EDH unuse (all 0xff)
25EEH-2BE8H MISSION.ROM
2BE9H-7FFFH unuse (all 0xff)
8000H-BFFFH DONKEY.COL

エミュレーションを解析してMISSION.ROMを書き換えてみたいです。とりあえず逆アセンブルしてみましたが1000行近くになりました。

http://www.geocities.jp/parallel_computer_inc/MISSION.ASM

COL2MSX.C

#include <stdio.h>

unsigned char rom[0x3000];
unsigned char ldir[16]={0xf3,0x21,0x00,0x00,0x11,0x00,0x00,0x01,0x00,0x40,0xED,0xB0,0xC7,0xFF,0xFF,0xFF};

int main(int ac, char **av)
{
    int i;
    unsigned char *ptr;
    FILE *fp;
    if (ac != 2) {
        printf("Usage: COL2MSX CART.COL\n");
        exit(-1);
    }
    if ((fp = fopen(av[1], "rb")) == NULL) {
        printf("File Open Error: %s\n",av[1]);
        exit(-1);
    }
    printf("Reading %s:",av[1]);
    for (i=0; i<32; i++) {
        if (0==fread((unsigned char *)0x8000+i*1024, 1, 1024, fp)) break;
        printf(".");
    }
    fclose(fp);
    printf("OK\n");
    if ((fp = fopen("COLECO.ROM", "rb")) == NULL) {
        printf("File Open Error: COLECO.ROM\n");
        exit(-1);
    }
    printf("Reading COLECO.ROM:");
    for (i=0; i<32; i++) {
        if (0==fread(rom+i*1024, 1, 1024, fp)) break;
        printf(".");
    }
    fclose(fp);
    printf("OK\n");
    if ((fp = fopen("MISSION.ROM", "rb")) == NULL) {
        printf("File Open Error: MISSION.ROM\n");
        exit(-1);
    }
    printf("Reading MISSION.ROM:");
    for (i=0x25EE; i<0x2E83; i++) {
        if (0==fread(rom+i, 1, 1, fp)) break;
        if (i==0x29EE || i==0x2DEE) printf(".");
    }
    fclose(fp);
    printf("OK\n");
    rom[0x0004]=0x53;
    rom[0x0005]=0x26;
    rom[0x0039]=0xA8;
    rom[0x003A]=0x26;
    rom[0x0172]=0xC3;
    rom[0x0173]=0xCA;
    rom[0x0174]=0x29;
    rom[0x0175]=0xC3;
    rom[0x0176]=0x1C;
    rom[0x0177]=0x2A;
    rom[0x023B]=0xC3;
    rom[0x023C]=0xFF;
    rom[0x023D]=0x29;
    rom[0x0335]=0xC3;
    rom[0x0336]=0xCA;
    rom[0x0337]=0x29;
    rom[0x0354]=0xC3;
    rom[0x0355]=0xCA;
    rom[0x0356]=0x29;
    rom[0x1105]=0x00;
    rom[0x1106]=0x00;
    rom[0x113D]=0xC3;
    rom[0x113E]=0x20;
    rom[0x113F]=0x27;
    rom[0x11C2]=0x2C;
    rom[0x11C3]=0x27;
    rom[0x18D4]=0xC3;
    rom[0x18D5]=0x87;
    rom[0x18D6]=0x27;
    rom[0x1C82]=0xC3;
    rom[0x1C83]=0x9E;
    rom[0x1C84]=0x27;
    rom[0x1CCA]=0xC3;
    rom[0x1CCB]=0xD0;
    rom[0x1CCC]=0x27;
    rom[0x1D01]=0xC3;
    rom[0x1D02]=0x04;
    rom[0x1D03]=0x28;
    rom[0x1D3E]=0xC3;
    rom[0x1D3F]=0x20;
    rom[0x1D40]=0x28;
    rom[0x1D57]=0xC3;
    rom[0x1D58]=0x36;
    rom[0x1D59]=0x28;
    rom[0x1F77]=0x2C;
    rom[0x1F78]=0x27;
    ptr=(unsigned char *)0x7FF0;
    memcpy(ptr, ldir, 0x10);
    ptr+=2;
    *ptr++=((int)rom & 0x00ff);
    *ptr=((int)rom >> 8);
#asm
    JP 7FF0H
#endasm

    return 0;
}