2017-04-19 27 views
3

我正在通過C64仿真器學習6502微程序集。目前試圖將字符串輸出到屏幕上。這是我的代碼:ASCII到C64在DASM彙編程序的屏幕代碼

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 

因爲我的編輯器(記事本++上取勝10)使用ASCII狀炭碼,在message"HELLO"是比特48 45 4C 4C 4F。這給出了在屏幕左上角的以下輸出: enter image description here

這是正確的我猜,通過查看目標屏幕代碼表here

如果我將第6行更改爲lda hexmsg,x,那麼我會得到我正在處理的內容HELLO

我還不是很熟悉DASM彙編器,並且無法找到它的完整文檔(如果存在)。我發現的大多數教程只是聲明message .byte "HELLO"或類似的東西,它只是起作用,因爲它們使用的彙編程序會自動將類ascii文本字符串自動轉換爲標準化字符串,但DASM似乎沒有這樣做。

有誰知道一個方法可以讓我要麼得到DASM要做到這一點,還是推薦另一種方式來簡單地輸入字符串爲彙編,而不是手動鍵入我的字符串作爲一幫十六進制數據?

+0

順便說一句,這是我能找到的最好的文檔:http://www.macs.hw.ac.uk/~pjbk/scholar/dasm.html。 –

+0

我很確定您的問題的來源是在源代碼中使用大寫字母。這些顯示爲大寫還是圖形字符取決於C64的當前圖形模式。嘗試使用小寫字母,我希望你會看到你期望的大寫字母。 –

回答

3

這是修補版本的DASM aseembler。
http://iancoog.altervista.org/C/dasm2.20.07-iAN_Rev_N.rar

您可以使用SCRUSCRL指令轉換ASCII->網屏編碼轉換。

label SCRU "string" 
label SCRL "string" 

SCRU是使即使輸入小寫字母大寫文字。 SCRL保持套管。

+0

在最後跳轉到之前,我使用了DASM多年踢三年後,因爲它沒有被積極維護(或者至少看起來不像)。這是一個分叉,還是重新發布的核心版本?它有很多我去KickAss的功能,如果它再次激活,我幾乎很想回到DASM。 –

+0

這是一個修改後的版本。你可以從http://dasm-dillon.sourceforge.net/獲取原始的。它似乎是在2015年6月最後更新的。 – wizofwor

4

Aha,ASCII編碼vs. Commodore屏幕代碼。我們都去過那裏。您有幾種選擇:

  1. 不要直接寫屏內存,但使用籽粒CHROUT例程,而不是(可能是通過較高級別的字符串輸出程序)。然後,所有你必須擔心的是ASCII和PETSCII之間的差異,但這是另一個睡覺的故事。此外,這對文本很有用,但與直接寫入相比,Kernal是s-l-o-w,因此吸引遊戲。

  2. 編寫程序啓動時,吃你的字符串表,並吐出轉換屏幕代碼等同運行了一點轉換例程。如果你的字符串都在一起,並且你沒有寫一個基於ROM的應用程序(這將不能進行就地轉換),那麼快速高效。

  3. 編寫一個DASM預處理程序,該程序在生成腳本中的DASM之前運行,基本上與上述#2執行相同的轉換,但在彙編程序看到之前轉換爲源代碼。這可能有點粗糙,你必須確保在更換原始資源之前備份原始資源。

  4. 獲取DASM源代碼並對其進行修補以調用用戶出口,以獲取與#2相同的新數據類型(對於屏幕代碼),但在裝配過程中即時進行。非常粗糙。

  5. 使用在你的字符串小寫字母,這將組裝過程中轉換爲大寫屏幕代碼等價物。您可能忽略了以下事實:您看到的是移位表示字符串中的字符,其中默認顯示模式爲圖形符號。

從所有5個選項的經驗說起,我已經解決了#2。

另外:切換到KickAssembler,這

  • 是新的,積極維護
  • 提供更強大的功能
  • 與VICE很好地集成用於調試
+0

哈哈,我喜歡粗糙和粗糙的聲音。儘管現在我會嘗試#2,聽起來很不錯。你能否詳細說明'提供你的絃樂都在一起'?我假設你的意思是說,他們應該全部連續記憶。 AFAIK,將所有'標籤dc '行放在一起放在asm源文件中應該可以實現這一點,我只需用標籤訪問它們,對不對? –

+0

是的,確切地說 - 您可以在將每個字符串寫入屏幕時通過各個標籤來引用每個字符串,但通過將它們作爲內存中的連續序列保存在一起時,還可以將它們轉換爲單個「n字節」塊啓動。這意味着您可以在一個快速循環中對所有字符串進行轉換。 –

+0

我可以編寫一個例程,它執行lda消息,x','sbc $ 40','sta消息,x'和循環$ 05次,但是這樣可以嗎?我不知道如何找到我的數據塊的確切內存地址。我知道程序從4096d開始,但是...也許我正在過度使用它? –

4

去過,因爲一段時間我編程了6510.(如果你沒有按C64存儲器的每個單字節保存..)也考慮零終止你的字符串(s)與說一個0字節而不是終止達到X寄存器的長度。使它更方便一些,而不是計算出字符串長度:D

processor 6502 
org $1000 

printstring: 
    ldx #$00 
printstrlp: 
    lda message,x 
    cmp #0 
    beq quitstr 
    cmp #32   ;' ' character 
    beq noconv 
    cmp #33   ;! character 
    beq noconv 
    cmp #42   ;* character 
    beq noconv 
    cmp #48   ;numbers 0-9 
    bcs numconv 
conv: 
    sec 
    sbC#$40 
noconv: 
    sta $0400,x 
    inx   
    bne printstrlp 
quitstr: 
    rts 
numconv: 
    cmp #58 
    bcc noconv 
    jmp conv 

message dc "** HELLO C64 WORLD! **",0