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
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
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. –
@J ... Sayıları değiştirdim ve işe yaradı. – wizofwor