如何在6502组装(NES)中进行平滑的水平/垂直移动?

问题描述 投票:0回答:1

我目前正在大学项目的 6502 组件中进行平台游戏演示,我不明白如何在该项目中实现平滑的水平/垂直运动和加速。基本上,每个动作都包含以下代码的略有不同的版本:

READ_RIGHT:
  LDA JOYPAD1
  AND #%00000001
  BNE DO_RIGHT
  JMP READ_RIGHT_DONE

DO_RIGHT:
  JSR HandleAcceleration
  JSR UpdatePlayerPosition

READ_RIGHT_DONE:

  RTI

HandleAcceleration:
  LDA ACCEL + 1
  CLC
  ADC #$01
  STA ACCEL + 1

  BCC @ON_CARRY

  LDA ACCEL + 0
  CMP MAX_ACCEL
  BCC @NOT_MAX_ACCEL
  LDA MAX_ACCEL
  STA ACCEL

@ON_CARRY:
  INC ACCEL
  INC MOV_FLAG

@NOT_MAX_ACCEL:
  RTS

UpdatePlayerPosition:
  LDA PLAYER_X
  STA $0203
  STA $020B
  TAX
  CLC
  ADC #$08
  STA $0207
  STA $020F
  ADC SPEED
  STA PLAYER_X

  RTS

我认为我应该为此使用定点算术,但每次我尝试时,程序都无法按预期运行。 如果有人知道我应该做什么或我做错了什么,请帮助。

我尝试将以下逻辑应用于代码:

READ_RIGHT:
  LDA JOYPAD1
  AND #%00000001
  BNE DO_RIGHT
  JMP READ_RIGHT_DONE

DO_RIGHT:
  JSR HandleAcceleration
  JSR UpdatePlayerPosition

READ_RIGHT_DONE:

  RTI

HandleAcceleration:
  LDA ACCEL + 1
  CLC
  ADC #$01
  STA ACCEL + 1

  BCC @ON_CARRY

  LDA ACCEL + 0
  CMP MAX_ACCEL
  BCC @NOT_MAX_ACCEL
  LDA MAX_ACCEL
  STA ACCEL

@ON_CARRY:
  INC ACCEL
  INC MOV_FLAG

@NOT_MAX_ACCEL:
  RTS

UpdatePlayerPosition:
  LDA PLAYER_X
  STA $0203
  STA $020B
  TAX
  CLC
  ADC #$08
  STA $0207
  STA $020F
  ADC SPEED
  STA PLAYER_X

  RTS

它并没有平滑地向精灵应用加速,只是让它立即变得更快,没有其他任何作用。

assembly fixed-point 6502 nes
1个回答
0
投票

您的问题是由于没有捕获垂直回扫造成的。当您没有捕获光束或没有正确设置 IRQ 时,CPU 会连续运行您的代码。您需要的是以恒定的速度/FPS 运行代码。我不是 NES 硬件方面的专家,但从文档来看,$2002 地址似乎是主循环结构的答案。尝试添加;

Main:
    // Wait for vertical retrace here
    lda $2002
    bit 7
    bne Main

    // Do your stuff here
    jmp Main

或者通过使用 IRQ,尝试正确设置 IRQ 输入参数,同时考虑垂直回扫。每个基于 6502 的 8 位机器都有一种捕获屏幕顶部光束的方法。你只需要研究一下 NES 的“垂直回扫”、“吸引光束”主题即可。

© www.soinside.com 2019 - 2024. All rights reserved.