Finally: Commodore file I/O
git-svn-id: svn://svn.cc65.org/cc65/trunk@1531 b7a2c559-68d2-44c3-8de9-860c34a00d81
This commit is contained in:
151
libsrc/cbm/write.s
Normal file
151
libsrc/cbm/write.s
Normal file
@@ -0,0 +1,151 @@
|
||||
;
|
||||
; Ullrich von Bassewitz, 16.11.2002
|
||||
;
|
||||
; int write (int fd, const void* buf, unsigned count);
|
||||
;
|
||||
|
||||
.export _write
|
||||
.constructor initstdout
|
||||
|
||||
.import incsp6
|
||||
.import __errno, __oserror
|
||||
.importzp sp, ptr1, ptr2
|
||||
|
||||
.include "errno.inc"
|
||||
.include "fcntl.inc"
|
||||
.include "cbm.inc"
|
||||
.include "filedes.inc"
|
||||
|
||||
|
||||
;--------------------------------------------------------------------------
|
||||
; initstdout: Open the stdout and stderr file descriptors for the screen.
|
||||
|
||||
.proc initstdout
|
||||
|
||||
lda #LFN_WRITE
|
||||
sta fdtab+STDOUT_FILENO
|
||||
sta fdtab+STDERR_FILENO
|
||||
lda #CBMDEV_SCREEN
|
||||
sta unittab+STDOUT_FILENO
|
||||
sta unittab+STDERR_FILENO
|
||||
lda #STDOUT_FILENO + LFN_OFFS
|
||||
jsr @L1
|
||||
lda #STDERR_FILENO + LFN_OFFS
|
||||
@L1: ldx #CBMDEV_SCREEN
|
||||
ldy #$FF
|
||||
jsr SETLFS
|
||||
jmp OPEN ; Will always succeed
|
||||
|
||||
.endproc
|
||||
|
||||
;--------------------------------------------------------------------------
|
||||
; _write
|
||||
|
||||
|
||||
.proc _write
|
||||
|
||||
ldy #4
|
||||
lda (sp),y ; Get fd
|
||||
|
||||
; Check if we have a valid handle
|
||||
|
||||
cmp #MAX_FDS ; Is it valid?
|
||||
bcs invalidfd ; Jump if no
|
||||
|
||||
; Check if the LFN is valid and the file is open for writing
|
||||
|
||||
adc #LFN_OFFS ; Carry is already clear
|
||||
tax
|
||||
lda fdtab-LFN_OFFS,x; Get flags for this handle
|
||||
and #LFN_WRITE ; File open for writing?
|
||||
beq notopen
|
||||
|
||||
; Valid lfn. Make it the output file
|
||||
|
||||
jsr CKOUT
|
||||
bcs error
|
||||
|
||||
; Calculate -count-1 for easier looping
|
||||
|
||||
ldy #0
|
||||
lda (sp),y
|
||||
eor #$FF
|
||||
sta ptr1
|
||||
iny
|
||||
lda (sp),y
|
||||
eor #$FF
|
||||
sta ptr1+1
|
||||
|
||||
; Get the pointer to the data buffer
|
||||
|
||||
iny
|
||||
lda (sp),y
|
||||
sta ptr2
|
||||
iny
|
||||
lda (sp),y
|
||||
sta ptr2+1
|
||||
jmp deccount
|
||||
|
||||
; Read the IEEE488 status
|
||||
|
||||
loop: jsr READST
|
||||
cmp #0
|
||||
bne error5
|
||||
|
||||
ldy #0
|
||||
lda (ptr2),y
|
||||
inc ptr2
|
||||
bne @L1
|
||||
inc ptr2+1 ; A = *buf++;
|
||||
|
||||
@L1: jsr BSOUT
|
||||
|
||||
; Decrement count
|
||||
|
||||
deccount:
|
||||
inc ptr1
|
||||
bne loop
|
||||
inc ptr1+1
|
||||
bne loop
|
||||
|
||||
; Wrote all chars, close the output channel
|
||||
|
||||
jsr CLRCH
|
||||
|
||||
; Return the number of chars written
|
||||
|
||||
ldy #1
|
||||
lda (sp),y
|
||||
tax
|
||||
dey
|
||||
lda (sp),y
|
||||
jmp incsp6
|
||||
|
||||
; Error entry, file descriptor is invalid
|
||||
|
||||
invalidfd:
|
||||
lda #EINVAL
|
||||
sta __errno
|
||||
lda #0
|
||||
sta __errno+1
|
||||
beq errout
|
||||
|
||||
; Error entry, file is not open
|
||||
|
||||
notopen:
|
||||
lda #3 ; File not open
|
||||
bne error
|
||||
|
||||
; Error entry, status not ok
|
||||
|
||||
error5: lda #5 ; Device not present
|
||||
error: sta __oserror
|
||||
errout: lda #$FF
|
||||
tax ; Return -1
|
||||
jmp incsp6
|
||||
|
||||
.endproc
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user