我正在尝试学习如何在此
Codebase64 Tutorial之后使用kernal例程来编写磁盘文件.
我复制了我的例程,用Acme Crossassembler编写,下面.它无法打开文件并显示错误消息:“FILE NOT OPENED”
; 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 ; 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
我已经使用C64 Programmer’s Reference准备了下面列出的Basic Routine.它在同一环境中按预期工作.
10 OPEN 3,8,3,"O:DATA FILE,W" 20 PRINT#3,"SENT TO DISK" 30 CLOSE 3
那么,为什么我的asm例程不起作用?
我正在测试Vice 2.4
解决方法
显然问题出现在逻辑数字和次要地址中,如J所示…
我通过更换零件来修复它.i.e:
; 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”消息被发送到文件而不是屏幕,但这些可以很容易地修复.