2017-04-11 16 views
6

Bu Codebase64 Tutorial'u izleyerek kernal rutinlerini kullanarak disk dosyalarını nasıl yazacağımı öğrenmeye çalışıyorum.Commodore 64 üzerinde derlemeyi kullanarak bir disk dosyası yazmak

Aşağıda, Acme Crossassembler'da yazılan rutinimi kopyaladım. Bu dosyayı açmak için başarısız oldu ve hata mesajı verir: Ben C64 Programcı Başvuru kullanarak aşağıda listelenen Temel Rutin hazırlamıştım

; 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    

"AÇMAMIŞ DOSYA". Aynı ortamda beklendiği gibi çalışır.

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

Neden asm rutinim çalışmıyor?

Ben parçaları değiştirerek

tamir ettim var ... J ile gösterilen Apperently sorun Logical number ve secondary adress oldu

+0

TEMEL rutinleri assembler'dan çok farklıdır, ancak bir dilin çalıştığını ve diğerinin olmadığını söylemek çok yararlı değildir! Kodu ayıklar mısınız? – t0mm13b

+2

BASIC komutunuz 3 veri kanalı 3 ('3,8,3') 'de dosya 3'ü açmaktır, ancak ASM'niz 0 (' ldy # $ 00') veri kanalında dosya sıfırı ('lda # $ $') almaya çalışıyor. cihaz 8 (disk) için ikincil adres numarası olarak geçersiz. –

+1

@J ... Sayıları değiştirdim ve işe yaradı. – wizofwor

cevap

6

Vice 2.4 üzerinde test ediyorum .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 

"RENK TASARRUFU" mesajı gibi başka sorunlar da ekran yerine dosyaya gönderildi, ancak bunlar kolayca düzeltilebilir.

İlgili konular