- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我一直在为 MOS 6502 开发仿真器,但我似乎无法让 ADC 和 SBC 正常工作。我正在用 AllSuiteA program 测试我的模拟器加载到模拟内存中的 0x4000,对于 test09,我当前的 ADC 和 SBC 实现只是没有获得正确的标志。我已经尝试过无数次更改他们的算法,但每次,进位标志和溢出标志都足够重要,并导致测试分支/不分支。
Both of my functions are based off this.
内存[0x10000] 是累加器。它存储在内存范围之外,因此我可以有一个单独的寻址 switch 语句。
这是我对这些功能的实现之一:
case "ADC":
var t = memory[0x10000] + memory[address] + getFlag(flag_carry);
(memory[0x10000] & 0x80) != (t & 0x80) ? setFlag(flag_overflow) : clearFlag(flag_overflow);
signCalc(memory[0x10000]);
zeroCalc(t);
t > 255 ? setFlag(flag_carry) : clearFlag(flag_carry);
memory[0x10000] = t & 0xFF;
break;
case "SBC":
var t = memory[0x10000] - memory[address] - (!getFlag(flag_carry));
(t > 127 || t < -128) ? setFlag(flag_overflow) : clearFlag(flag_overflow);
t >= 0 ? setFlag(flag_carry) : clearFlag(flag_carry);
signCalc(t);
zeroCalc(t);
memory[0x10000] = t & 0xFF;
break;
我现在完全没有想法,but I did also run into the same problem with the data offered here.因此,让我失望的不仅仅是一个实现计划。
最佳答案
(我在写下面的答案时忘记了 NES 6502 缺少的 Decimal 模式。无论如何我都会保留它,因为它可能对编写 NES 模拟器的人有用。)
一旦您的模拟器具有ADC
,
SBC
就很容易实现。您需要做的就是反转参数的位并将其传递给 ADC
实现。要直观地了解为什么会这样,请注意将 arg
的所有位取反会以二进制补码形式生成 -arg - 1
,并研究 时发生的情况>carry
标志已设置和未设置。
这是我的模拟器中 SBC
的完整源代码。所有标志也将正确设置。
static void sbc(uint8_t arg) { adc(~arg); /* -arg - 1 */ }
实现 ADC
时最棘手的部分是溢出标志的计算。它被设置的条件是结果有“错误”的标志。由于范围的计算方式,事实证明这只会在两种情况下发生:
(1)和(2)可以简化为如下条件:
通过一些 XOR 技巧,这允许设置 overflow
标志,如下面的代码(来 self 的模拟器的完整 ADC
实现):
static void adc(uint8_t arg) {
unsigned const sum = a + arg + carry;
carry = sum > 0xFF;
// The overflow flag is set when the sign of the addends is the same and
// differs from the sign of the sum
overflow = ~(a ^ arg) & (a ^ sum) & 0x80;
zn = a /* (uint8_t) */ = sum;
}
如果
a
寄存器和
arg
不同,
(a ^ arg)
在符号位位置给出 0x80
在标志。 ~
翻转位,如果 a
和 arg
具有相同的符号,您将得到 0x80
。用更通俗的英语,条件可以写成
overflow = <'a' and 'arg' have the same sign> &
<the sign of 'a' and 'sum' differs> &
<extract sign bit>
ADC
实现(以及许多其他指令)也使用一个技巧将零
和负
标志存储在一起。
可以找到我的 CPU 实现(来自 NES 模拟器)here顺便一提。搜索“核心指令逻辑”将为您提供所有指令(包括非官方指令)的简单实现。
我已经通过大量测试 ROM 运行它而没有失败(NES 仿真的一个好处是有很多很棒的测试 ROM 可用),我认为此时它应该几乎没有错误(除了一些极其晦涩的东西,例如在某些情况下涉及开放式总线值)。
关于javascript - 6502 仿真实现 ADC 和 SBC 的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29193303/
我对虚拟机的 CPU 虚拟化有疑问。我无法理解即时到 native 代码翻译与陷阱和模拟翻译之间的区别。 据我所知,在第一种情况下,假设我从不同的平台模拟二进制代码,如果我有 x86 CPU,代码将转
我对虚拟机的 CPU 虚拟化有疑问。我无法理解即时到 native 代码翻译与陷阱和模拟翻译之间的区别。 据我所知,在第一种情况下,假设我从不同的平台模拟二进制代码,如果我有 x86 CPU,代码将转
我必须模拟 Ant 在它们的家(黑框)和食物(黄框)之间移动。这些三色盒子是 Ant 。我为绘制所示图形编写的代码如下: % background background() % making
我有一些使用 java.awt.Color 的代码。我想将我的 Java 代码转换为 GWT。所以我将在我的 GWT 项目中模拟 java.awt.Color。 一种方法是编写一个名为源路径为awt的
大家好圣诞节快乐我需要一个建议我有以下代码: int main() { int k=5000000; int p; int sum=0; for (p=0;p<
假设您有一个 Simulink 仿真,其中某个信号首先为正,然后在给定时间间隔内经过一段时间 t 后变为负。您的目标是找到零交叉点。 第一种方法是在给定的间隔内绘制信号,保存它并计算过零。 当针对不同
现在是周末,所以我通过编写一个爱好项目来放松整周的编程。 昨天写了一个MOS 6502 CPU仿真器的框架,寄存器、堆栈、内存和所有操作码都实现了。 (来源链接如下) 我可以在我编写的调试器中手动运行
出于测试目的,我需要创建如下所示的 AVD: 但是我所有的模拟设备都是这样的: 它们只包含屏幕,没有硬件键盘。这是“新设备”对话框: “存在硬件键盘”没有任何效果。如何获得所需的设备配置? Andro
有没有什么地方有一个独门绝技的小马,它可以使 css3 的所有优点(阴影、发光、圆 Angular )并使其与 ie6 兼容/看起来相似... i have try that ...哦,天哪,这太丑了
在用 c++ 实现“super”之前,我正在寻找一种自己模拟它的方法。动机:这是一个典型的场景: class A { void SomeMethod(); } class B : public
我正在研究一个模拟 QEMU 设备来模拟 FPGA PCIe 接口(interface)。我使用 lev-pci 设备作为基本模板: https://github.com/levex/kernel-q
您知道为 Windows 和/或 Linux 制作软件(虚拟)HID 设备的方法吗? 我想将一些传感器用作 HID,但它们没有任何 HID,所以我想我可以在 PC(模拟 onde)上安装自己的 HID
我很确定这个问题的答案是否定的,但万一有一些 PHP 大师 是否有可能以可以传入无效参数或不存在的变量的方式编写函数,并且 php 在不使用 '@' 的情况下不会出错 很像 empty 和 isset
当 Kinect 本身未插入时,是否可以模拟 Kinect 传感器(用于与 Kinect SDK 一起使用)? 起初我认为 Kinect Studio 完全符合我的要求,但现在看来 Kinect St
我已经搜索了 1 个多小时没有成功。是否有模拟框架集的纯 CSS 方式?我的意思是,真的在模仿它。我发现了一些有趣的东西,您将在其中固定顶部和底部 block ,但内容的滚动条是常规的浏览器主体滚动条
是否存在用于编程需求的虚拟 GPIO 驱动程序? 我必须在我的 Linux PC 上开发一个软件,然后在一些带有物理 GPIO 的嵌入式系统(C.H.I.P.、OpenWRT 等等......)上试用
我正在尝试开始 Android 开发。 我在 Linux 上使用 eclipse 并使用 Pentium IV @3.2Gh 和 1GB 内存。我刚刚遵循“hello android”howto,只有
我使用 Google Chrome 和 Intern 运行自动化测试,我想知道是否有办法从 CLI 以仿真模式启动 Chrome 或使用特定标志来测试移动渲染。如果没有,您知道一个好的解决方法吗? 我
我正在尝试通过 STM32F1 上的闪存模拟 EEPROM,如 here 所述(对于STM32F4)例如,但我正在努力更改STM32F1RB(中密度)规范的代码。我正在使用 SW4STM32、Cube
使用下面的测试代码,我尝试使用 中的 simulator 通过 xmega128a3u 的 USART 发送数据Atmel Studio. 观察 I/O 查看数据寄存器从未设置,即使我正在设置它。是我
我是一名优秀的程序员,十分优秀!