回答
我准备了一个例子给你,就像你想要的一样。如果连续两次按下相同的按键,则边框颜色将变为红色,否则保持黑色。
警告!此示例使用kernal
例程。没有什么不妥。但是在没有使用$ffd2
(Output Vector,chrout)和$ffe4
(Get Keyboad)内核调用的情况下,还有一个较低级别的方法。但是因为要理解起来要复杂得多,所以我首选这个例子。
如果您想知道幕后发生了什么(内核调用),可以从AAY64
文档中轻松跟踪内核ROM代码。这里是链接:
主要AAY页:http://www.the-dreams.de/aay.html
AAY64在线HTML版本:http://unusedino.de/ec64/technical/aay/c64/
籽粒ROM上市:http://unusedino.de/ec64/technical/aay/c64/krnromma.htm
$ffd2
(输出向量,chrout):http://unusedino.de/ec64/technical/aay/c64/romffd2.htm
$ffe4
(Get Keyboad):http://unusedino.de/ec64/technical/aay/c64/romffe4.htm
您可以通过按操作码和地址上的链接来浏览更深的内容。
这里是示例代码。你可以编译使用ACME Crossassembler
,你可以在这里找到这段代码 - >http://www.esw-heim.tu-clausthal.de/~marco/smorbrod/acme/
!to "keycomp.prg",cbm
zpBuffer = $fa ; $fa-$fb are reserved for 2 bytes of key buffer
* = $0801
!byte $0c, $08, $00, $00, $9e, $32, $30, $36, $31, $00, $00, $00
* = $080d
; key buffer initialization
ldx #$f0 ; initialize key buffer
stx zpBuffer ; with two different
inx ; values to avoid instant
stx zpBuffer+1 ; match at the beginning
; border color initialization
lda #$00 ; set startup border color to black
sta $d020 ; which means "no match"
; main loop
mainloop
lda zpBuffer ; shift key buffer
sta zpBuffer+1 ; by one
readKey
jsr $ffe4 ; read key
beq readKey ; if no key pressed loop forever
jsr $ffd2 ; show key on the screen
sta zpBuffer ; store the key to key buffer
lda zpBuffer ; compare the last stored key
cmp zpBuffer+1 ; with the old key value
beq cmpMatch ; if there is a match jmp to cmpMatch
lda #$00 ; if two pressed keys are different
sta $d020 ; change border color to black
jmp cmpOut ; skip the other condition code block
cmpMatch
lda #$02 ; if there is a repeated key
sta $d020 ; change border color to red
cmpOut
jmp mainloop ; wait for the next key
优秀的描述和源代码示例!非常感谢@EmirAkaydın。 – 2011-11-25 08:11:21
Akaydin谢谢你!受到http://10print.org/的启发,我试图在ubuntu 12.04上的VICE模拟器上运行一些C64程序集。仍不确定如何编译本书第234页的“10 PRINT”示例,但成功地使用acme编译上面的代码。创建“keycomp.prg”程序,该程序可以使用命令x64 keycomp.prg在VICE中运行。谢谢! –
编辑:“10 PRINT”的例子也适用,加载到模拟器后,需要运行“SYS 4096”在READY提示符为迷宫程序启动 –
我不是C64的人,但我知道6502大会。你需要知道两件事才能实现你的目标。首先是学习6502汇编语言,如果你还不知道的话。例如,This page具有优秀的资源。
其次是了解C64体系结构和操作系统。它被称为内核在Commodore说,一个快速的谷歌应该指出你在正确的方向。
但有一个选择。您始终可以使用cc65,这是一个优秀的免费软件包,包含几乎ISO-complient C编译器,6502汇编器,链接器以及其他6502相关工具。它支持所有流行的6502平台,包括Atari 8位,Apple II,当然还有Commodore 64.它拥有大量的文档,邮件列表中的人员都很友善,乐于助人。作为提示,键盘输入和屏幕输出功能在conio.h中定义。
- 1. 比较字符(ARM程序集)
- 2. 结果集比较实用程序
- 3. 程序集比较两个数字
- 4. NDepend控制台 - 比较程序集
- 5. 比较“键”值
- 6. Python的 - 比较键
- 7. 通过比较按键键
- 8. 比较uibutton点击
- 9. 开始:比较程序块
- 10. 比较的集合
- 11. R:data.table比较行集
- 12. 比较数据集
- 13. C#如何比较两个有序集?
- 14. 如何通过键比较两个JavaPairRDD并比较值?
- 15. ARM程序集,比较已签名的值
- 16. 比较.NET程序集的2个版本?
- 17. 如何比较x86程序集中的两个地址?
- 18. ARM中的程序集如何使用比较助记符?
- 19. 比较MIPS程序集中的字符串
- 20. 在NASM中,我想根据其ASCII值比较输入击键
- 21. 击比较浮点数
- 22. spark - 与键值比较
- 23. JavaScript比较“if”关键字
- 24. 比较键和值std :: maps
- 25. 夫特:比较字典键
- 26. Java删除键比较
- 27. 发送击键程序
- 28. 通用对象比较比较例程
- 29. 比较数据集的值
- 30. 比较2套Java集合
你谈论的Commodore 64模拟器CCS64或DSP的TI的Code Composer Studio的? –
Commodore 64仿真器CCS64 :) – Oakin
行 - 那么这意味着6502汇编器,是吗? –