title: Writing a disk file using assembly on Commodore 64
body: <p>I'm trying to learn how to write disk files using kernal routines following this <a href="http://codebase64.org/doku.php?id=base:writing_a_file_byte-by-byte" rel="noreferrer">Codebase64 Tutorial</a>.</p>
  
  <p>I have copied my routine, written in Acme Crossassembler, below. It failed to open file and gives error message: "FILE NOT OPENED"</p>
  
  <pre><code>; 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 #&lt;message0         
      ldy #&gt;message0   
      jsr printMessage    
  
  
  save2file:      
      ; call SETNAM   
      lda #fname_end-fname    ; file name size
      ldx #&lt;fname             ; file name vector
      ldy #&gt;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 #&lt;message1         
      ldy #&gt;message1     
      jsr printMessage
  
  .close
      lda #$02      ; filenumber 2
      jsr CLOSE     ; call CLOSE
      jsr CLRCHN    ; call CLRCHN
      rts
  
  .error1
      ldx #&lt;errorMsg1         
      ldy #&gt;errorMsg1   
      jsr printMessage
      jmp .close
  
  .error2
      ldx #&lt;errorMsg2         
      ldy #&gt;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               
  </code></pre>
  
  <p>I've prepared the Basic Routine listed below using C64 Programmer's Reference. It works as expected in the very same environment. </p>
  
  <pre><code>10 OPEN 3,8,3, "O:DATA FILE,S,W"
  20 PRINT#3, "SENT TO DISK"
  30 CLOSE 3      
  </code></pre>
  
  <p>So, why my asm routine doesn't work?</p>
  
  <p>I'm testing on Vice 2.4</p>