]> git.sur5r.net Git - cc65/commitdiff
implement ProDOS seek
authorpeterferrie <peter.ferrie@gmail.com>
Sat, 22 Nov 2014 00:04:11 +0000 (16:04 -0800)
committerpeterferrie <peter.ferrie@gmail.com>
Sat, 22 Nov 2014 00:04:11 +0000 (16:04 -0800)
libsrc/apple2/lseek.s [new file with mode: 0644]

diff --git a/libsrc/apple2/lseek.s b/libsrc/apple2/lseek.s
new file mode 100644 (file)
index 0000000..058e6f5
--- /dev/null
@@ -0,0 +1,96 @@
+;
+; Peter Ferrie, 21.11.2014
+;
+; off_t __fastcall__ lseek(int fd, off_t offset, int whence);
+;
+
+        .export         _lseek
+        .import         popax
+
+        .include        "zeropage.inc"
+        .include        "errno.inc"
+        .include        "mli.inc"
+        .include        "filedes.inc"
+
+_lseek:
+        ; Save whence
+        sta     tmp1
+        stx     tmp2
+
+        ; Get and save offset
+        jsr     popax
+        sta     ptr1
+        stx     ptr1+1
+        jsr     popax
+        sta     ptr2
+
+        ; Get and process fd
+        jsr     popax
+        jsr     getfd           ; Returns A, Y and C
+        bcs     errno
+
+        ; Check for device
+        cmp     #$80
+        bcs     einval
+
+        ; Valid whence values are 0..2
+        ldx     tmp2
+        bne     einval
+        ldx     tmp1
+        cpx     #3
+        bcs     einval
+
+        ; Set fd
+        sta     mliparam + MLI::RW::REF_NUM
+
+        txa
+        beq     cur
+        lda     #GET_EOF_CALL
+        dex
+        beq     end
+
+; SEEK_SET
+        dex
+        txa
+        tay
+        beq     seek_common
+
+; SEEK_CUR
+cur:
+        lda     #GET_MARK_CALL
+
+; SEEK_END
+end:
+        ldx     #MARK_COUNT ; conveniently same as EOF_COUNT
+        jsr     callmli
+        bcs     oserr
+        lda     mliparam + MLI::MARK::POSITION
+        ldx     mliparam + MLI::MARK::POSITION+1
+        ldy     mliparam + MLI::MARK::POSITION+2
+
+seek_common:
+        adc     ptr1
+        sta     mliparam + MLI::MARK::POSITION
+        txa
+        adc     ptr1+1
+        sta     mliparam + MLI::MARK::POSITION+1
+        tya
+        adc     ptr2
+        sta     mliparam + MLI::MARK::POSITION+2
+
+        ; Set file pointer
+        lda     #SET_MARK_CALL
+        ldx     #MARK_COUNT
+        jsr     callmli
+        bcs     oserr
+
+        rts
+
+        ; Load errno code
+einval: lda     #EINVAL
+
+        ; Set __errno
+errno:  jmp     __directerrno
+
+        ; Set __oserror
+oserr:  jmp     __mappederrno