assembly - 如何将半字节转换为 6502 汇编中的值?

标签 assembly 6502

我正在研究一种二进制格式的解压缩算法,用于存储我的 NES 项目的屏幕文件。 NES 屏幕分辨率为 260x240。我正在创建 2x2 像素格式的元图 block 。压缩格式将指定应将哪些 2x2 文件写入屏幕。

我选择的格式会写成

0000xxxx: right nibble = value of tile 1 - 16
xxxx0000; left nibble  = number of times a tile is written on that row 1 - 16

在上面的示例中,11110001 会告诉导入例程写入磁贴 1,16 次。

我还没有弄清楚的部分是如何取左半字节并将其转换为十六进制。我遇到的同样问题是获取正确的半字节并将其也用作值。

我不确定是否有办法使用按位运算来做到这一点。我需要一种有效的方法来执行此操作。

最佳答案

鉴于您在 .A 中的“压缩”(虽然“打包”是一个更好的术语)数据,您应该这样做:

(假设 tile_id_to_writewrite_it_this_many_times 是您要将其解压缩到的零页面位置。)

lda packed_data,X             ;or however you're iterating through the packed data
and #%00001111                ;strip off top 4 bits; this is what AND dones
sta tile_id_to_write          ;store that somewhere
lda packed_data,X             ;get the original packed data again
lsr                           ;shift right 4 times
lsr 
lsr 
lsr
sta write_it_this_many_times

根据您读取打包数据的方式,您可能会执行与 lda packed_data,X 不同的操作。我很确定 lsr 将 0 放在最重要的位中。请记住,循环指令将进位旋转回最高位,因此您通常需要执行 asllsr 来移位或乘以/除以 2。

关于assembly - 如何将半字节转换为 6502 汇编中的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14794918/

相关文章:

assembly - 为什么 MIPS 指令 "add"有时会给我一个算术错误,但并非总是如此?

assembly - 6502 相对地址模式换行

javascript - 6502 仿真实现 ADC 和 SBC 的正确方法

assembly - 如何在6502汇编中将16位数字除以2?

assembly - 为什么在使用DIV指令之前EDX必须为0?

assembly - 为什么这个汇编语言程序以相反的顺序打印十六进制数字?

c++ - Windows 上来自 VS C++ 的非法指令

assembly - 6502中有哪些使用控制流的方法?

assembly - 机器如何确定屏幕上显示的内容(具体为 6502)?

c - 将 GCC 内联汇编与采用立即值的指令一起使用