【问题标题】:How to work with 12 bit address on MOS 6502?如何在 MOS 6502 上使用 12 位地址?
【发布时间】:2015-03-07 21:52:23
【问题描述】:

所以我在如何处理 6502 中的某些寻址方面遇到问题。基本上,我有 3 个值,我想代表 6502 显示器上像素的 12 位地址空间。我已经建立了地址带有一些简单改装的元素。但是,我不太确定从这里去哪里。假设我的目标地址为 05ff,即右下角的像素。我目前拥有的是第一位,它将添加到 0200、第二位和第三位,但不知道如何从这些中建立一个 12 位的数量。任何人都可以提供帮助吗?除了讲课和方尖碑网站,我的老师有点让我们干了,就用它来弄清楚该怎么做而言,这仍然让我有点头晕目眩。有人知道我该怎么做吗?

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

【问题讨论】:

  • 那远不及 48 位,您的示例听起来像是 12 位。其余的不清楚,您要实施什么公式?为什么你甚至有3个值?通常你只有 2 个(行和列),除非你有 3D 显示器:)
  • 所以基本上,监视器的工作方式是它不在 (x,y) 索引中。像素依次存储在 $0200 到 $05ff 之间,并且基本上按照您可以想象的“盒子”进行组织。 16^2 位置为您提供屏幕的哪个四分之一,16^1 位置为您提供 16^3 位置的哪个子面板(每 16^2 值有 16 个,介于 2 和 5 之间),并且 16^0 为您提供该子面板中的列。
  • 那么你的问题是什么?这是一个由 2 个字节组成的 16 位地址。按照你在问题(y << 4) | x 中所说的组装低字节,将高字节组装为z + 2。完成。
  • 我如何组合高字节和低字节?这是一个 12 位地址,它只是一个 8 位处理器。有没有办法指定较低的字节来自一个地方,而较高的字节来自另一个地方?
  • 使用存储在零页中的指针的间接寻址。

标签: assembly 6502


【解决方案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

【讨论】:

    【解决方案2】:

    扩展已有的 cmets:6502 只有 8 位寄存器。它通过给零页一个提升的状态来增强这些:它可以快速引用,并且可以通过它获得矢量寻址。

    例如

    ; ... 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 存储到总数中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-10
      • 2019-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多