      .include #system
      .include #macros
      .include #cio
      .include #os
      .include #16bit

maxsecs = 16
:more  = @special + @s2 + @p1 + @p2 + @p3   ; len will be ignored

;; This is more or less an example, not written for beauty or
;; anything. Maybe you can pick up some ideas about using STDIO
;; This little ditty was actually put to use, to get some gamedisks
;; working on the XL

main:
      print       0,"SD boot sector reader -- 1991 Natrlich!"
      print       0,"Input diskette in drive 1",0,:more  ; same IOCB chan.
      print       0,"Press  to continue",0,:more   ; so we can use
      getc        0,@special                             ; @special to save
      print       0,"Reading boot sectors",0,:more       ; some bytes
      
      readsector  1,1,buffer        ; read first sector
      bpl         :ok1
      jmp         :failure  
:ok1      
      lda         buffer+1          ; get number of sectors to
      bne         :cool
      jmp         :invalid 
:cool 
      cmp         #maxsecs+1        ; can we read that many
      bcc         :fits
      jmp         :toomuch 
:fits
      sta         size+1
      sbc         #0                ; minus one
      beq         :fine
      
      tay
      SETUP_SIO   1,SIOREAD,2,buffer+128
      jsr         sd_secs
      bpl         :fine
      jmp         :failure
      
:fine
      lsr.w       size
      bput        0,prompt,filename-prompt,@p1+@p2+@p3
      input       0,filename,buffer-filename,@p1+@p2+@p3+@special
            
      open        1,8,0,filename,@p1+@p2+@p3+@p4
      bmi         :noopen
      bput        1,buffer,size,@special+@p1+@p2
      php
      close       1,@special+@p1
      plp
      bpl         :ok
      jsr         :diskfull
      jmp         :fine
        
:ok
      print       0,"Done"
      rts

:failure:
      print       0,"Couldn't read sectors"
      rts
      
:noopen:
      print       0,"Couldn't open output file"
      rts
      
:diskfull:
      print       0,"Disk full ? Retry with another..."
      rts

:toomuch
      print       0,"Too many sectors in that boot segment"
      rts      

:invalid
      print       0,"That bootsector is unusable"
      rts
      
size:       .word 0
prompt:     .byte "Output file name: "
filename:   .ds   128
buffer:     .ds   128*maxsecs

