标签: gameboy

GBZ80:什么构成"半携带"?

Game Boy Z80 CPU有一个半进位标志,我似乎无法找到有关何时设置/清除它的更多信息.

我的理解至今是任何8位加,减,移位或旋转操作(或者其他人?),将其设置为结果(?)的第4位,而DAA指令集/莫名其妙地使用这个.我不确定的是16位指令如何影响它以及它是否受到某些寄存器的影响.

z80 emulation gameboy

35
推荐指数
2
解决办法
8255
查看次数

Zilog Z80 OP-Code实现

我正在为优秀的旧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的值在寄存器中被屏蔽,它们只需要彼此分开(高/低半字节?).

如果有人能够让我更清楚,我会非常感激,因为我只想拥有更多的背景知识(所有这些内容如何在内部运作),所以对我来说非常重要,因为我知道自己在做什么.

c z80 emulation opcodes gameboy

14
推荐指数
1
解决办法
1479
查看次数

如何从gameboy解码任天堂徽标?

我试图使用http://imrannazar.com/GameBoy-Emulation-in-JavaScript:-Graphics中描述的背景托盘方案解码以下位图

CE ED 66 66 CC 0D 00 0B 03 73 00 83 00 0C 00 0D 00 08 11 1F 88 89 00 0E DC CC 6E E6 DD DD D9 99 BB BB 67 63 6E 0E EC CC DD DC 99 9F BB B9 33 3E

来源:http://gbdev.gg8.se/wiki/articles/The_Cartridge_Header#0104-0133_-_Nintendo_Logo

但我只有类似噪音的东西.

我应该去哪个方向?它是否使用压缩?我无法在互联网上找到有关此转储的更多信息.

目前为止最佳(20倍变焦): 在此输入图像描述

device-emulation gameboy

13
推荐指数
1
解决办法
1511
查看次数

优化GameBoy Z80中的位操作算法

这不是一个家庭作业问题,而是我正在开发的游戏.

我有两种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).
  • 因此,有六个5位颜色通道值和六个4位增量值.我想将每个颜色通道C与一个delta值D配对,并且像这样改变C:C' = C +(D&%11) - ((D&%1100)>> 2),但保持C在其5之内-bit bounds [0,31].我实际上并不关心它们是如何配对的:任何方便的一对一配对都很好.如果C +((D&%1100)>> …

assembly bit-manipulation z80 gameboy

13
推荐指数
1
解决办法
413
查看次数

将寄存器加载到自身的指令的目的是什么?

在查看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相同的周期数.

为什么这些操作码包含在指令集中,它们的用途是什么?

memory assembly z80 emulation gameboy

12
推荐指数
2
解决办法
524
查看次数

在主中断使能但没有中断使能(0xFF0F = 0)的情况下进入HALT模式?

根据Gameboy编程手册,

HALT模式被以下事件取消,这些事件具有指示的起始地址.

  1. 到/ RESET端子的低电平信号起始地址:0x0000

  2. 中断使能标志及其对应的中断请求标志置位

    • IME = 0(禁止中断主器件使能标志)起始地址:低于HALT指令的地址

    • IME = 1(允许中断主控使能标志)起始地址:每个中断起始地址

假设一个程序进入HALT模式,中断主器件使能标志被使能IME = 1,中断使能被禁止任何中断0xFF0F = 0,会发生什么?实际的Gameboy设备的预期行为是什么?

interrupt emulation halt device-emulation gameboy

10
推荐指数
1
解决办法
397
查看次数

在Game Boy上CP的进位标志的行为是什么?

在Game Boy CPU Manual的第87页,声称该CP n指令在没有借位时设置进位标志,这意味着A < n.这似乎与自身发生冲突,因为进位标志设置时A > n.

例如:如果A=0和B=1,则CP B设置标志,如SUB A, B0 - 1.这变为0 + 255 = 255并且未设置进位标志,即使如此A < B.

我在其他Z80文档中也遇到过同样的问题,所以我不相信这是一个错字.

我是否误解了借用和SUB工作的方式或是否有其他事情发生?是SUB不是等于ADD在标志方面补?

z80 gameboy

9
推荐指数
1
解决办法
1078
查看次数

游戏手中的指令长度LD A,(C)~Z80处理器

你好我正在为Game Boy写一个模拟器.

我用这个参考:Gameboy CPU(LR35902)指令集

该文件说明了操作码:

0xE2 LD (C),A
Run Code Online (Sandbox Code Playgroud)

和

0xF2 LD A,(C)
Run Code Online (Sandbox Code Playgroud)

长度为2.

该游戏男孩CPU手册说分别,这些说明:

将地址$ FF00 +寄存器C的值放入A.

和

将A放入地址$ FF00 +寄存器C.

我认为它的长度为1,因为操作码是自给自足的,它不需要另外的值来解释.如果它的长度为2,那么第二个字节的目的是什么?

assembly z80 emulation gameboy

9
推荐指数
1
解决办法
1135
查看次数

Gameboy(z80)操作码用途

我一直工作在一个游戏机模拟器,和我注意到,有一定的操作码存在是永远不会改变的任何值,如LD A, A,LD B, B等,并且还AND A.第一个显然不会改变任何东西,因为它们将寄存器的值加载到相同的寄存器中,并且由于将AND与A寄存器进行比较,因此AND A将始终返回A.这些操作有什么用途,或者与NOP每个循环后的操作基本相同?

z80 emulation opcode gameboy

8
推荐指数
2
解决办法
1822
查看次数

Game Boy:半进位标志和16位指令(尤其是操作码0xE8)

像许多其他人一样,我正在编写一个Game Boy模拟器,并且对0xE8指令(ADD SP, n带有8位立即数)有一些疑问。

据称在这里,在16位指令的半进位标志,如果从第7位发生位8的进位,而设置在这里它是说,半进位标志表示从位11进位位12 这Reddit线程对此问题似乎有点困惑,而且(我听说臭名昭著的缺陷)Game Boy CPU手册似乎也没有什么有用的说法。

我的问题如下:

  1. 半进位标志在操作码0xE8中的表现如何?
  2. 物理硬件中如何实现操作码0xE8?
  3. 正确的是,半进位出现在第7位到第8位之间,或者半进位发生在第11位到第12位之间(对于16位指令而言)?

embedded assembly emulation gameboy

8
推荐指数
2
解决办法
226
查看次数