X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=libsrc%2Fatari%2Frwcommon.s;h=5f51cc5f7f8fa962599845a2916c0bb06295c4ed;hb=231e597a4ba2d55c859518dba5732b7c8677b61b;hp=6775d99504c0dce8b2854c8731b212aa69685688;hpb=bfdfd83fdeb22a87c50cc3ef24b222e6ce2b0f50;p=cc65 diff --git a/libsrc/atari/rwcommon.s b/libsrc/atari/rwcommon.s index 6775d9950..5f51cc5f7 100644 --- a/libsrc/atari/rwcommon.s +++ b/libsrc/atari/rwcommon.s @@ -2,64 +2,42 @@ ; common iocb setup routine for read, write ; expects __fastcall__ parameters (int fd, void *buf, int count) ; - .include "atari.inc" - .include "errno.inc" - .importzp tmp2,tmp3 - .import incsp4,ldax0sp,ldaxysp - .import __errno,__oserror - .import fdtoiocb + .include "atari.inc" + .include "errno.inc" + .import popax + .import fdtoiocb - .export __rwsetup + .export __rwsetup -__rwsetup: - - sta tmp2 - stx tmp3 ; remember size - ldy #3 - jsr ldaxysp ; get fd - jsr fdtoiocb ; convert to iocb - bmi iocberr - tax - cpx #$80 ; iocb must be 0...7 - bcs iocberr - lda tmp2 - sta ICBLL,x - lda tmp3 ; size hi - sta ICBLH,x - stx tmp3 - jsr ldax0sp ; get buf addr - stx tmp2 - ldx tmp3 - sta ICBAL,x - lda tmp2 - sta ICBAH,x - jsr incsp4 ; pop args - lda ICBLL,x - ora ICBLH,x ; return with Z if length was 0 - rts - -iocberr:jsr incsp4 ; pop args - ldx #$FF ; indicate error + clear ZF - rts +__rwsetup: -; -; this routine updates errno. do a JMP here right after calling -; CIOV. we expect status in Y. -; - .export __do_oserror,__inviocb -__do_oserror: - sty __oserror ; save os dependent error code -retminus: - lda #$FF - tax ; return -1 - rts - -; -; sets EINVAL error code and returns -1 -; + pha ; push size in stack + txa + pha + jsr popax ; get buffer address + pha + txa + pha + jsr popax ; get handle + jsr fdtoiocb ; convert to iocb + bmi iocberr ; negative (X=$FF or A>$7F) on error. + tax + pla ; store address + sta ICBAH,x + pla + sta ICBAL,x + pla ; store length + sta ICBLH,x + pla + sta ICBLL,x + ora ICBLH,x ; returns Z if length is 0 + rts + +iocberr:pla + pla + pla + pla + ldx #$FF ; indicate error + clear ZF + rts -__inviocb: - lda #