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

Joh*_*arr 4 assembly 6502 retro-computing

我试图了解6502组装中的控制流程。

说我有以下代码:

    ControlFlow:
      lda mem
      cmp #1
      bne .sub_one

      cmp #2
      bne .sub_two

      .sub_one:
        ; sub routine one goes here
        jmp .done ; <-------------- without this jmp, .sub_two will execute

      .sub_two:
       ; sub routine two goes here

      .done:

      rts
Run Code Online (Sandbox Code Playgroud)

就个人而言,我很喜欢switch语句或其他控制流结构。上面的JMP也与我有关。似乎有一种更好的方法来处理多种情况,而无需使用此类意大利面条式代码。

Aki*_*nen 5

如果案例数足够大,则跳转表可能会很有用。在左侧,有一个模板(未经测试),用于跳转到标签,从而将正确的地址压入堆栈并返回。右侧有一个基于jsr 的差异例程,_out:从每个子例程返回后,该例程将在标签处继续。进位逻辑在6502上取反,表示如果(Acc> = Imm),将置位。

; goto  label[n]   vs.         call label[n]

lda variable
cmp #MAX_PLUS_ONE                          
bcs _out
tax
lda table_hi, X
pha                vs.         sta jsrcmd+2
lda table_lo, X
pha                vs.         sta jsrcmd+1
rts                vs. jsrcmd: jsr 1000        ; self modify

_out:  
Run Code Online (Sandbox Code Playgroud)