我想比较汇编中的击键(CCS64).如果我连续输入相同的键我想做一些例子:A A=这样做
但如果我输入这个:A B=做别的事
建议?
我试图了解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也与我有关。似乎有一种更好的方法来处理多种情况,而无需使用此类意大利面条式代码。
阅读6502上的文档,我无法在任何地方找到答案.使用相对寻址时可以换行.但是有可能包裹两端吗?我猜这是可能的,但不太可能.
当我的意思是两端,我的意思是我知道你可以从高PC到低PC.但是你也可以从低PC到高PC吗?
我发现PET的零页内存映射声称零页面地址范围$00C2..$00D9
用于静态数据,例如http://www.classiccmp.org/dunfield/pet/petmem.txt说:
RIDATA 00C2 Cassette Temp (64#00AA) read flags: 0=scan,
1-15=count, $40=load, $80=end of tape marker
RIPRTY 00C3 Cassette Short Cnt (64#00AB): counter of seconds
before tape write / checksum
PNT 00C4-00C5 Pointer: Current Screen Line Address
PNTR 00C6 Cursor Column on Current Line
SAL 00C7-00C8 Pointer: Tape Buffer/ Screen Scrolling
EAL 00C9-00CA Tape End Addresses/End of Program
CMP0 00CB-00CC Tape Timing Constants
QTSW 00CD Flag: Editor in Quote Mode, $00 = NO
BITTS 00CE Cassette Temp …
Run Code Online (Sandbox Code Playgroud) 例程必须在发出的分支指令的128或-127字节内的硬件原因是什么?
我正在通过C64仿真器学习6502 micro的装配。当前正在尝试将字符串输出到屏幕。这是我的代码:
processor 6502
org $1000
ldx #$00 ;using x register as column counter
print:
lda message,x;load a with x bit from message
sta $0400,x ;store this bit in row 0 col 0 address
inx ;x++
cpx #$05 ;is x >= 5?
bne print ;if not x >= 5, loop again
rts ;return from program
message dc "HELLO"
hexmsg dc $08,$05,$0c,$0c,$0f
Run Code Online (Sandbox Code Playgroud)
因为我的编辑器(胜利10上的notepad ++)使用类似ascii的字符代码,所以"HELLO"
输入message
是48 45 4C 4C 4F。这将在屏幕的左上角提供以下输出:
我想这是正确的,请看这里的commodore屏幕代码表。
如果将第6行更改为,lda hexmsg,x
那么我将得到确切的字眼HELLO
。 …
我的问题是关于6502汇编语言的。我正在尝试使用此网站https://skilldrick.github.io/easy6502/进行学习。
关于寻址模式的主题。我不了解间接寻址模式。请参见下面的源代码示例。
LDA #$01
STA $f0
LDA #$cc
STA $f1
JMP ($00f0) ;dereferences to $cc01
Run Code Online (Sandbox Code Playgroud)
为什么JMP ($00f0)
取消引用到$cc01
而不是$01cc
。
我的记忆看起来像这样
00f0: 01 cc 00 00 00 00 00 00 00 00 00 00 00 00 84
在这里,您看到00f0
以开始,01
然后是跟随,cc
因此对我来说,跳转指令将取消引用是更合乎逻辑的$01cc
,但是为什么这会以某种方式逆转?
我必须回答以下有关6502汇编语言的问题:
“在堆栈上,有以下值(顶部元素在前):0x01, 0x02, 0x03, 0x04, 0x05, 0x06
地址0xc000
是指令jsr 0xABCD
。在获取/执行周期后,哪个值将存储在程序计数器中,堆栈的顶部元素是什么?”
我知道程序计数器将为0xABCD
,但我对堆栈元素感到困惑。我知道在 6502 架构中,栈是从上到下(从0x01FF
到0x0100
)增长的。所以,我假设,堆栈指针指向 element 0x01
,对吗?
现在,返回地址应该是program counter + 3
,因为有next
命令,所以我会说,0xc003
将被压入堆栈,但以小端顺序,因此c0
将是顶部元素。那是对的吗?
我正在查看文档,发现有一些伪操作让我困惑,它们是DV
、LIST
和XXX
。
DV
说就像DC
但与 一起使用EQM
,我已经搞乱了它,但我没有注意到任何区别,我试图找到任何例子,但找不到任何例子。
LIST
并且XXX
,我也不确定这些是如何工作的。
我正在为NES学习程序集,并且编写了以下程序:
.org $8000 ; set code to start of rom
Start: ; make a label called start
lda #$ff ; set acc to 0xff
sta $0000 ; store address 0x0000 to acc which is 0xff
jmp Start ; jump to label start
Run Code Online (Sandbox Code Playgroud)
我用NESASM3编译了程序,编译成功,然后在仿真器中运行它,当我转到仿真器中的内存查看器时,查看地址$ 0000,它是01,而不是FF,就像我编程的那样。