2011-10-31 71 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中定義。