如何在MOS 6502上使用12位地址?

时间:2015-03-07 21:52:24

标签: assembly 6502

所以我遇到了如何在6502中使用某些寻址的问题。基本上,我有3个值,我想表示6502监视器上像素的12位地址空间。我已经建立了地址具有一些简单修改的​​元素。但是,我不太确定从哪里开始。让我们说我的目标地址是05ff,右下角的像素。我目前拥有的是第一位,它将被添加到0200,第二位和第三位,但不知道如何从这些位构建12位数量。有人可以提供帮助吗?除了讲座和方尖碑之外,我的老师还有点让我们干涸,至于使用它来弄清楚要做什么,这仍然有点让我头疼。有人知道我怎么做吗?

目前,对于地址05ff,我所拥有的是3,f和f。我知道我可以转移到第二个f移动,但我不知道如何将0200添加到0300以产生数量0500,然后将其添加到00ff。

2 个答案:

答案 0 :(得分:1)

你真的不想考虑操纵个别比特,除非你绝对不得不这样做。

6502是一台8位机器,所以一切都必须在8位边界上进行操作。如果你需要的数量少于“偶数幂2”的数量,你应该用逻辑AND丢弃你不想要的数量。它比AFAIK以另一种方式“保存”四位更有效率。

示例:

;Our first variable.  Holds a 12-bit value but we allocate 16 bits 
; to it because this is an 8-bit architecture
VAR_A_16_LO  EQU $80
VAR_A_16_HI  EQU $81
;Our second variable.  Same thing as above.
VAR_B_16_LO  EQU $82
VAR_B_16_HI  EQU $83
;Our variable where we store the result. 
VAR_C_16_LO  EQU $84
VAR_C_16_HI  EQU $85

             ;Ok, lets add some 12-bit numbers
             ;But first, we have to make sure the variables have 12-bit 
             ; quantities.  This means killing the top 4 bits of the high 
             ; bytes of the variables.  If this is known to be the case this
             ; can be skipped.
             LDA VAR_A_16_HI
             AND #%00001111 ;This logical AND operation will set the upper
                            ; four bits to 0 and keep the lower four bits.
                            ;Of the high byte only.  
             STA VAR_A_16_HI
             LDA VAR_B_16_HI
             AND #%00001111
             STA VAR_B_16_HI
             ;
             ; Now, we can add them as though they were two 16-bit numbers.
             CLC
             LDA VAR_A_16_LO
             ADC VAR_B_16_LO
             STA VAR_C_16_LO
             LDA VAR_A_16_HI
             ADC VAR_B_16_HI
             STA VAR_C_16_HI
             ;
             ; And cut off the top 12 bits of the result just in case of 
             ;overflow.
             LDA VAR_C_16_HI
             AND #%00001111
             STA VAR_C_16_HI

答案 1 :(得分:0)

扩展已经发表的评论:6502只有8位寄存器。它通过使零页面处于提升状态来增强这些功能:它可以快速引用,并通过它提供矢量寻址。

E.g。

; ... calculate high 8 bits of address in A ...
; this assumes that #$00 is stored at address $00
STA $01

; ... calculate low 8 bits of address and move them into Y;
; calculate value to store in A ...
STA ($00), Y

这将从零页面位置$00$01获取16位地址。然后它会将Y中的值添加到该地址。它会将A存储到总数中。