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
字节.memStart
是0x200
.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);
失败,因为两个区间
大小不同.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现