;›; data and part of the code for Small-C io library›; this must be assembled with atari.m65 and global.m65›;››; canned files.  these are declared pointers to something,›; but they're really IOCBs.›;›; it'd be nice if we could make these be on page 0...››  .globl  _stdin›_stdin:›  .word  0    ; default to screen/kbd›  .globl  _stdout›_stdout:›  .word  0    ; default to screen/kbd›  .globl  _stderr›_stderr:›  .word  0    ; default to screen/kbd››  .globl  _errno›_errno:›  .word  0    ; error number›;››;›; internal helper fun for open routines.›; find a free iocb, return in x›;›  .globl  findiocb›findiocb:›  ldx  #$10    ; start at # 1›findiocb1:›  lda  ichid,x    ; get handler id›  cmp  #$FF    ; free?›  beq  findiocb9  ; yup, return it›  txa›  clc›  adc  #$10    ; next iocb›  tax›  cmp  #$80    ; past last one?›  bcc  findiocb1  ; nope, return it›  ldx  #$FF    ; return -1›findiocb9:›  rts››;›; copen(name, mode)->iocb #›;›  .globl  _copen›_copen:›  jsr  popax    ; get open mode›  sta  tmp1    ; save it›  jsr  popax    ; get name›  sta  fntemp›  stx  fntemp+1›  jsr  findiocb  ; try to find a free iocb›  bmi  copenerr  ; no free ones›  stx  tmp4›  lda  tmp1    ; get open mode again›  cmp  #'r    ; read?›  bne  copen1›  lda  #OPNIN    ; open for input›  bne  copen5›copen1:›  cmp  #'w    ; write?›  bne  copen2›  lda  #OPNOT›  bne  copen5›copen2:›  cmp  #'a    ; write append?›  bne  copen3›  lda  #OPNOT|APPEND›  bne  copen5›copen3:›  cmp  #'d    ; directory?›  bne  copenerr  ; bogon, return err›  lda  #OPNIN|DIRECT››copen5:›  ldx  tmp4›  sta  icax1,x    ; store open bits›  lda  #0›  sta  icax2,x›  sta  icbll,x›  sta  icblh,x›;›; make sure the name's got an EOL at the end›;›  ldy  #0›copen6:›  lda  (fntemp),y›  and  #$7F    ; mask for non-inverted›  beq  copen7›  cmp  #'a    ; need to upcase, for non-sparta dos'es›  bmi  copen6a›  cmp  #'z+1›  bpl  copen6a›  sec›  sbc  #$20    ; subtract a space›copen6a:›;  sta  copenbuf,y›  sta  casbuf,y  ; use casbuf to save a little space›  iny›  bne  copen6›copen7:›  lda  #$9B›;  sta  copenbuf,y›  sta  casbuf,y›;  lda  #copenbuf\›  lda  #casbuf\›  sta  icbal,x›;  lda  #copenbuf^›  lda  #casbuf^›  sta  icbah,x›  lda  #open›  sta  iccom,x›;›; all set›;›  jsr  ciov›  bpl  copen8    ; ok, return it›  jmp  ioreturn›copen8:›  txa      ; return iocb in ax›  ldx  #0›  rts›; zzz›copenerr:›  lda  #$FF›  tax›  rts›;copenbuf: .byte  "                           "››;›; common error vector for io things.  do a JMP here right after calling›; CIOV.  we expect status in Y.›;›  .globl  ioreturn›ioreturn:›  tya      ; get return code›  ldx  #$FF    ; return error›  sta  _errno›  stx  _errno+1›  rts›