2017-04-11 15 views
6

Próbuję nauczyć się pisać pliki dyskowe za pomocą procedur jądra następujących po tym Codebase64 Tutorial.Zapisywanie pliku dysku przy użyciu zespołu w Commodore 64

Kopiowałem moją rutynę, napisaną w Acme Crossassembler, poniżej. Nie udało się otworzyć pliku i daje komunikat o błędzie: „NIE plik otwarty”

; 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    

Mam przygotował Routine podstawowych wymienionych poniżej, z użyciem C64 programisty Reference. Działa zgodnie z oczekiwaniami w tym samym środowisku.

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

Dlaczego moja rutynowa procedura nie działa?

ja testuje na Vice 2.4

+0

Podstawowe procedury bardzo różnią się od asemblera, ale mówiąc, że jeden język działa, a drugi nie jest zbyt użyteczny! Czy debugujesz kod? – t0mm13b

+2

Twoje polecenie BASIC otwiera plik 3 na kanale danych 3 ("3,8,3'), ale twój ASM próbuje uzyskać dostęp do pliku zerowego (' lda # $ 00') w kanale danych 0 ('ldy # $ 00'), które jest nieprawidłowy jako drugorzędny numer adresu dla urządzenia 8 (dysk). –

+1

@J ... Zmieniłem numery i zadziałało. – wizofwor

Odpowiedz

6

apperently problem był w Logical number i secondary adress wskazanych przez J ...

ja naprawiłem to przez zmianę części .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 

Istnieją inne problemy, takie jak komunikat "ZAPISANE KOLORY" wysłane do pliku zamiast ekranu, ale można je łatwo naprawić.

Powiązane problemy