1

我已经构建了一个简单的单板计算机,并且正在尝试学习 6809 汇编语言。我有一些简单的事情正在运行,例如通过 6850 ACIA 进行 Echo。我正在尝试打印一个字符串并且被卡住了。

该字符串在 ROM 中并以空零终止。我加载 X 寄存器以指向字符串的开头。稍后我将 X 指向的字符加载到 A 寄存器,并且 X 递增。然后在将字符输出到 ACIA 之前测试空零。我已经将一个简单的逻辑分析仪连接到数据总线,并且知道没有任何内容输出到 ACIA,因为它看到的是零而不是第一个字符,并且认为字符串已经完成。我看不到代码中的错误,它可能与硬件有关,但需要有经验的眼睛来检查它,以防我犯了初学者错误。

这是组装:


*******************************EQUATES****************************************
    ***ACIA register definitions****
ACIA_control EQU $A000 ;write only
ACIA_status EQU $A000 ;read only
ACIA_data EQU $A001 ;read/write

********************************STRING CONSTANT******************************
    ORG $C000 ; ROM starts here

    ***store string to send out on serial***
    *Pseudo op FCN stores characters in sequential bytes,
    *and automatically adds null zero.
   

start_of_string
    FCN "The quick brown fox jumps over the lazy dog"

**********************************SETUP****************************************
setup

    ***reset_ACIA***
    LDA #%00000011
    STA ACIA_control

    ***set_ACIA_mode***
    ;clock/64 gives 19,200 baud with 4.9152   MHz xtal
    ;8 bits, 1 stop bit, no parity
    ;/RTS inactive (set high), TX interupt disabled, RX interupt disabled
    LDA #%01010110
    STA ACIA_control

*********************************SEND LOOP**************************************
reset_index_register
        LDX start_of_string

        ***Is ACIA ready to TX***
wait    LDA #%00000010
        ANDA ACIA_status
        BEQ wait

        ***send character***
        LDA ,X+
        BEQ end_of_string; string finished at null zero
        STA ACIA_data
        BRA wait ;next character

        ***LOOP BACK***
end_of_string
        BRA reset_index_register

*********************************VECTORS****************************************

    ***RESET***
    ORG $FFFE
    FDB setup ;Jump to programme entry
4

1 回答 1

3

这绝对是初学者的错误。

错误在行

LDX start_of_string

这是扩展模式寻址,因此 X 寄存器加载了字符串开头的两个字符。这被用作指针,所以它现在指向“有龙!”

正确的代码是: LDX #start_of_string 这是立即模式。X 现在加载了字符串开头的地址。

Lance Leventhal 的书“6809 汇编语言编程”中的一个错误并没有使事情变得更容易。他给出了 LDX 立即数的操作码为 BE,而 LDX 扩展的操作码也为 BE。这当然是不可能的。LDX 立即操作码实际上是 8E,因此您可以看到拼写错误是如何产生的。

于 2021-04-29T16:21:04.650 回答