Game Boy Z80 CPU有一个半进位标志,我似乎无法找到有关何时设置/清除它的更多信息.
我的理解至今是任何8位加,减,移位或旋转操作(或者其他人?),将其设置为结果(?)的第4位,而DAA指令集/莫名其妙地使用这个.我不确定的是16位指令如何影响它以及它是否受到某些寄存器的影响.
对于老式的ZX Spectrum,您最喜欢的汇编器,编译器,环境和解释器是什么?
我已经完成了在我的Z80核心上实现ADD A,r组操作码.我对我认为已经钉入的进位和溢出标志有点混淆,但我想把它放到社区检查我是对的.
基本上,从我所看到的,Z80中的ALU并不关心有符号/无符号运算,只是添加了位.这意味着如果将两个8位值相加并由于它们的相加而产生9位值,则将设置进位标志.这包括添加两个负二的补数,例如-20(11101100)和-40(11011000),因为虽然结果是-60(11000100),但结果实际上是9位值1 1100 0100.这肯定意味着如果添加两个负二的补码值,即使没有溢出条件,也会始终设置进位标志 - 我是对的吗?
其次,我决定检测此指令中的溢出,我会将两个操作数的第7位异或,如果结果是10000000,那么肯定没有溢出 - 如果结果是00000000那么可能会有溢出这些符号是相同的,因此我将XOR的第7位与任一操作数的第7位相加,如果结果为10000000,则发生溢出,并设置P/V溢出标志.我也在这儿吗?
对于这样一个令人费解的问题我很抱歉,我很确定我是对的但是在我继续根据这个逻辑进行无数更多指令之前我需要知道.非常感谢.
对这个看似微不足道的问题道歉,但我似乎无法在任何地方找到答案 - 我只是想在我的Z80仿真器中实现DAA指令,我在Zilog手册中注意到它是为了调整的目的用于二进制编码的十进制算术的累加器.它表示该指令旨在在加法或减法指令之后运行.
我的问题是:
我是TI编程平台的新手.我希望能得到一些关于我最好的路线的指示.
我需要生成一系列兼容TI-83(p)和84p模型的算术和图形功能.
我很高兴能为这个平台找到丰富的信息,但却被它所淹没.还有很多人都很老了.
我相信BASIC不适合我的目的.另一种选择是z80组装.但我发现有三种变体:nostub,Ion和MirageOS.我能否知道这三者之间是否存在任何差异,特别是考虑到上述模型之间的兼容性.(我有Microchip PIC开发的背景,并发现两种汇编方言有很大不同.)
我也读过关于z88dk C编译器的内容,并且非常希望采用这种方法.但我不确定对ti平台的支持是否足够成熟,可供不知道z80组装的人使用.任何z88dk用户都可以对ti-8x平台的可靠性发表评论.
嗯没有答案.根据我所见,z88dk是没用的.所以没有回避z80 asm.Ion shell似乎满足兼容性要求:ti 83,83 +,83se,84 +和84se.
我正在为优秀的旧GameBoy开发一个模拟器,我正面临一些问题,如何必须实现一些基本的操作代码.
现在我正在实施AND操作; 前几个(0xA0 - > 0xA3; 0xA6和0xA7)非常简单,但寄存器H,L的AND操作有点不同.
您可以在以下链接下载z80的文档: um0080.pdf(第172页)
这里有一些例子来说明我的意思(使用伪代码),基本上我做了什么:
AND A,H(注意位移)
(read HL register; >> 8) save in cache C
R->C = R->HL >> 8;
perform AND operation with cache
AND_H(R->C);
R->A &= R->C;
Run Code Online (Sandbox Code Playgroud)
和A,L(注意位屏蔽)
(read HL register; &0xFF) save in cache C
R->C = R->HL &0xFF;
Run Code Online (Sandbox Code Playgroud)
我知道所有的位操作,我知道他们做了什么,但似乎我无法弄清楚为什么需要这样做.我有一些理论(如果我错了,请纠正我:-)):
我已经理解的是,寄存器H和L基本上是寄存器HL,它是一个16位寄存器.由于CPU /总线只能处理8位操作,因此需要将其拆分; 或更多的逻辑建议:由于它只有一个寄存器,H和L的值在寄存器中被屏蔽,它们只需要彼此分开(高/低半字节?).
如果有人能够让我更清楚,我会非常感激,因为我只想拥有更多的背景知识(所有这些内容如何在内部运作),所以对我来说非常重要,因为我知道自己在做什么.
我想有兴趣为Z80处理器编写自己的简单模拟器.我对这种类型的编程没有经验.使用基于C语言的我很好,因为他们是我最熟悉的.
我需要做些什么以及哪些好的教程/参考资料可以帮助我完成这个项目?
我还想要一个为我的TI-84 Plus计算器编写ROM转储应用程序的教程,这样我就可以将它的ROM用于这个仿真器.
这不是一个家庭作业问题,而是我正在开发的游戏.
我有两种16位RGB颜色,并希望根据其他六个四位数量改变它们的六个通道.算法简单但乏味; 我正在寻找一种方法来通过一次做更多有用的工作来优化它.
高级概述:
hl
指向四个颜色字节.[hl] = %gggrrrrr
,[hl+1] = %0bbbbbgg
,[hl+2] = %GGGRRRRR
,和[hl+3] = %0BBBBBGG
.(这是两种颜色,rgb
和RGB
.)bc
指向三个delta字节.[bc] = %hhhhaaaa
,[bc+1] = %ddddssss
和[bc+2] = %ppppqqqq
.(这是6个Delta值h
,a
,d
,s
,p
,和q
).在查看Gameboy的指令集时,我遇到了如下指令:
LD A, A
LD B, B
LD C, C
LD D, D
...
Run Code Online (Sandbox Code Playgroud)
每条指令中有自己的操作码此表,这让我觉得他们是一些重要的,由于可能的操作码的数量限制.
我首先想到它可能是在该寄存器中取消引用指针并将值存储在该指针处(就像在这个问题中一样),但是在模拟器中,LD A, A
实现为:
Z80._r.a = Z80._r.a
Run Code Online (Sandbox Code Playgroud)
它们似乎对处理器的状态没有影响(只是将寄存器设置为它们自己的值)并且NOP
执行与a相同的周期数.
为什么这些操作码包含在指令集中,它们的用途是什么?