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 @   zjh6  阅读(12)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示