2017-04-11 8 views
6

私は、このCodebase64 Tutorialに続くkernalルーチンを使ってディスクファイルを書き込む方法を学ぼうとしています。Commodore 64でアセンブリを使用してディスクファイルを書き込む

下記のAcme Crossassemblerで書かれた自分のルーチンをコピーしました。これは、ファイルを開くことに失敗し、エラーメッセージを表示します。私はC64プログラマーズ・リファレンスを使用して以下に記載されている基本的なルーチンを用意しました

; Definitions 
SETNAM = $FFBD 
SETFLS = $FFBA 
OPEN = $FFC0 
CHKOUT = $FFC9 
READST = $FFB7 
CLOSE = $FFC3 
CLRCHN = $FFCC 
CHROUT = $ffd2  

;Basic Start 
    * = $0801        ; BASIC start address (#2049) 
    !byte $0d,$08,$dc,$07,$9e,$20,$34,$39 ; BASIC loader to start at  $c000... 
    !byte $31,$35,$32,$00,$00,$00   ; puts BASIC line 2012 SYS 49152 

;Program Code 
    * = $c000        ; Can be executed by writing sys 49152 

    ldx #<message0   
    ldy #>message0 
    jsr printMessage  


save2file:  
    ; call SETNAM 
    lda #fname_end-fname ; file name size 
    ldx #<fname    ; file name vector 
    ldy #>fname    ; file name vector 
    jsr SETNAM    ; call SETNAM 

    ; call SETFLS 
    lda #$00 
    ldx $BA     ; last used device number 
    bne + 
     ldx #$08   ; default to device 8 
+ ldy #$00 
    jsr SETFLS    ; call SETLFS 

    ;call OPEN 
    jsr OPEN    ; call OPEN 
    bcs .error1    ; if carry set, the file could not be opened 

    ; call CHKOUT 
    ldx #$02    ; filenumber=2 
    jsr CHKOUT    ; file 2 now used as output 

    ; Copy border color to the file 
    jsr READST    ; call READST (read status byte) 
    bne .error2    ; write error 
    lda $d020    ; get byte from memory 
    jsr CHROUT    ; write to file 

    ldx #<message1   
    ldy #>message1  
    jsr printMessage 

.close 
    lda #$02  ; filenumber 2 
    jsr CLOSE  ; call CLOSE 
    jsr CLRCHN ; call CLRCHN 
    rts 

.error1 
    ldx #<errorMsg1   
    ldy #>errorMsg1 
    jsr printMessage 
    jmp .close 

.error2 
    ldx #<errorMsg2   
    ldy #>errorMsg2 
    jsr printMessage  
    jmp .close   

fname: !tx "DATA,S,W" 
fname_end: 

message0: !by 141 : !scr"SAVING" : !by 0 
message1: !by 141 : !scr"COLORS SAVED" : !by 0 
errorMsg1: !by 141 : !scr"FILE NOT OPENED" : !by 0 
errorMsg2: !by 17 : !scr"WRITE ERROR" : !by 0 

;========================================================================== 
; printMessage 
; Prints null terminated string to the memory 
; Input: x,y adress vector of text string 
;========================================================================== 
temp  = $fb   ;zero page pointer 

printMessage: 
    stx temp   ;save string pointer LSB 
    sty temp+1   ;save string pointer MSB 
    ldy #0    ;starting string index 

- lda (temp),y  ;get a character 
    beq +    ;end of string 
     jsr CHROUT  ;print character 
     iny    ;next 
     bne - 
    inc temp+1    
    bne -  
+ rts    

「開いていないファイル」。まったく同じ環境では期待どおりに動作します。

10 OPEN 3,8,3, "O:DATA FILE,S,W" 
20 PRINT#3, "SENT TO DISK" 
30 CLOSE 3  

なぜ、私のasmルーチンが機能しないのですか?

は、私が部品を変更することにより、

が、私はそれを固定している... Jによって示されるようにApperently問題がLogical numbersecondary adressにあった

+0

BASICルーチンはアセンブラとは非常に異なりますが、ある言語は機能していて、他の言語はあまり役に立ちません。コードをデバッグしましたか? – t0mm13b

+2

BASICコマンドはデータチャネル3( '3,8,3')上でファイル3を開きますが、ASMはデータチャネル0(' ldy#$ 00')上のファイル0( 'lda#$ 00')にアクセスしようとしています。デバイス8(ディスク)の2次アドレス番号として無効です。 –

+1

@J ...私は数字を変更し、それは働いた。 – wizofwor

答えて

6

副2.4でテストしていますが.IE:

; call SETFLS 
    lda #$03 
    ldx $BA     ; last used device number 
    bne + 
     ldx #$08   ; default to device 8 
+ ldy #$03 
    jsr SETFLS    ; call SETLFS 

...

; call CHKOUT 
    ldx #$03    ; filenumber=3 
    jsr CHKOUT    ; file 2 now used as output 

...

.close 
    lda #$03  ; filenumber 3 
    jsr CLOSE  ; call CLOSE 
    jsr CLRCHN ; call CLRCHN 
    rts 

"COLORS SAVED"メッセージが画面の代わりにファイルに送信されたなどの問題がありますが、それらは簡単に修正できます。

関連する問題