2011-10-31 45 views
4

我想比较程序集(CCS64)中的击键。 如果我在一排相同的密钥类型我想要做的事 例如:一个一个 =做到这一点比较击键 - 程序集CCS64

但如果我输入:一个 =做别的事情

意见建议?

+0

你谈论的Commodore 64模拟器CCS64或DSP的TI的Code Composer Studio的? –

+0

Commodore 64仿真器CCS64 :) – Oakin

+0

行 - 那么这意味着6502汇编器,是吗? –

回答

7

我准备了一个例子给你,就像你想要的一样。如果连续两次按下相同的按键,则边框颜色将变为红色,否则保持黑色。

警告!此示例使用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 
+0

优秀的描述和源代码示例!非常感谢@EmirAkaydın。 – 2011-11-25 08:11:21

+0

Akaydin谢谢你!受到http://10print.org/的启发,我试图在ubuntu 12.04上的VICE模拟器上运行一些C64程序集。仍不确定如何编译本书第234页的“10 PRINT”示例,但成功地使用acme编译上面的代码。创建“keycomp.prg”程序,该程序可以使用命令x64 keycomp.prg在VICE中运行。谢谢! –

+0

编辑:“10 PRINT”的例子也适用,加载到模拟器后,需要运行“SYS 4096”在READY提示符为迷宫程序启动 –

2

我不是C64的人,但我知道6502大会。你需要知道两件事才能实现你的目标。首先是学习6502汇编语言,如果你还不知道的话。例如,This page具有优秀的资源。

其次是了解C64体系结构和操作系统。它被称为内核在Commodore说,一个快速的谷歌应该指出你在正确的方向。

但有一个选择。您始终可以使用cc65,这是一个优秀的免费软件包,包含几乎ISO-complient C编译器,6502汇编器,链接器以及其他6502相关工具。它支持所有流行的6502平台,包括Atari 8位,Apple II,当然还有Commodore 64.它拥有大量的文档,邮件列表中的人员都很友善,乐于助人。作为提示,键盘输入和屏幕输出功能在conio.h中定义。