d写仿真器错误

原文
我正在写chip8仿真器.正在加载rom到内存中.根据文档,每个指令2个字节,最大内存地址是4K.所以按正短数组定义内存.

struct Chip8
{
    ushort[4096] memory;
...

这样,加载它:

void read(string rom)
{
    import std.file : exists, getSize, read;

    if (exists(rom))
    {
        writeln("加载内存");
        auto romSize = getSize(rom);
        writeln("大小:", romSize);
        if (romSize > this.memory.length - memStart)
            writefln("太大! 大小 = %s 内存 = %s", romSize,this.memory.length - memStart);

        else
        {

            // 可用to!int[]或必须用`转换`?
            this.memory[memStart..memStart + romSize] = cast(ushort[])read(rom);

        }
    }
    else
    {
        writeln("不能读", rom);
    }

}

但我得到了违反区间错误.

内核.异常.区间错误@源\芯片.d(85):违反区间

我不明白为什么?根据Windows该文件为478字节.memStart0x200.0x200+478=990,它正好在我创建的4096Kb数组中.

writeln (getSize(rom));

报告478字节,但你用的是正短(为什么?据我所知,这是一个8位机器),你转换read(rom)正短,这只有一半的大小:

writeln (cast(ushort[])read(rom));

得到478/2=239个字节.

this.memory[memStart..memStart + romSize] = cast(ushort[])read(rom);

失败,因为两个区间大小不同.

posted @ 2022-10-31 20:01  zjh6  阅读(18)  评论(0)    收藏  举报  来源