mirror of
https://github.com/cc65/cc65.git
synced 2024-12-25 17:29:50 +00:00
99 lines
2.0 KiB
ArmAsm
99 lines
2.0 KiB
ArmAsm
;
|
|
; 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::MARK::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:
|
|
; MARK_COUNT must == EOF_COUNT, otherwise unexpected behaviour
|
|
.assert MARK_COUNT = EOF_COUNT, error
|
|
ldx #MARK_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
|