学研TV BOYエミュレータをつくる その8

TV BOYエミュレータを更新しました。

youtu.be

  • 市街戦200X年(ふつうに遊べる!)
  • ミスターボム(ふつうに遊べる!)
  • エキサイトインベーダー(ふつうに遊べる!)
  • ロボタンウォーズ(ふつうに遊べる!)
  • 地対空大作戦(サウンドが鳴らない)
  • フロッガーサウンドが鳴らない)NEW

ソースコード差分は以下になります。

takeda-toshiya.my.coocan.jp

memory.cpp

uint32_t MEMORY::read_data8(uint32_t addr)
{
    int random = (rand() % 10000);
    addr &= 0xffff;
    if(addr >= 0x80 && addr < 0x100) {
        return d_cpu->ram[addr-0x80];
    }
    if (rom[0]==0x4f) { // FROGGER
//     スクロール
        if (addr == 0x55 || addr == 0x56 || addr == 0x57 || addr == 0x58) {
            wbank[addr >> 10][addr & 0x3ff] = rbank[addr >> 10][addr & 0x3ff] + 4;
        }
//     カメ 0x4f
        if (addr==0x4f) {
            wbank[addr >> 10][addr & 0x3ff] = rbank[addr >> 10][addr & 0x3ff] + 1;
        }
//     ワニ 0x4c
        if (addr==0x4c) {
            wbank[addr >> 10][addr & 0x3ff] = rbank[addr >> 10][addr & 0x3ff] + 1;
        }
//     ワニ 0x48
        if (addr==0x46) {
            if (random > 8000 && rbank[(0x1101 + (random % 5) * 7) >> 10][(0x1101 + (random % 5) * 7) & 0x3ff] == 0x55) {
                wbank[0x48 >> 10][0x48 & 0x3ff] = (random % 5); 
                wbank[addr >> 10][addr & 0x3ff] = rbank[addr >> 10][addr & 0x3ff] + 1;
            }
        }
//     ムシ 0x49
        if (addr==0x49) {
            if (random > 8000 && rbank[(0x1101 + (random % 5) * 7) >> 10][(0x1101 + (random % 5) * 7) & 0x3ff] == 0x55) {
                wbank[0x4b >> 10][0x4b & 0x3ff] = (random % 5);
                wbank[addr >> 10][addr & 0x3ff] = rbank[addr >> 10][addr & 0x3ff] + 1;
            }
        }
    }
    return rbank[addr >> 10][addr & 0x3ff];
}

mc6800.cpp

uint32_t MC6800::RM(uint32_t Addr)
{
#if defined(HAS_MC6801) || defined(HAS_HD6301)
    if(Addr < 0x20) {
        return mc6801_io_r(Addr);
    } else if(Addr >= 0x80 && Addr < 0x100 && (ram_ctrl & 0x40)) {
#ifdef _TVBOY
        if(Addr == 0x95 && ram[Addr & 0x7f]!=0) { // TIMER
            if (((total_icount / 2) % 2000) == 1)
                ram[Addr & 0x7f]=ram[Addr & 0x7f]-1;
        }
        if(Addr == 0xC1 && ram[Addr & 0x7f]==0) { // WAIT
            if (((total_icount / 2) % 2000) == 1)
                return 0x80;
        }
#endif
        return ram[Addr & 0x7f];
    }
#endif
    return d_mem->read_data8(Addr);
}