cc65/libsrc/lynx/lseek.s

59 lines
1.5 KiB
ArmAsm

;
; Karri Kaksonen, 2010
;
; This function is used to place the Lynx hardware to point to any byte in
; the Lynx cart.
;
; This function supports all available block sizes (512, 1024 and 2048 bytes).
; No other block sizes have been used afaik.
;
; Only SEEK_SET operation mode is implemented.
;
; off_t __fastcall__ lseek(int fd, off_t offset, int whence);
.importzp sp, sreg, regsave, regbank, tmp1, ptr1, ptr2
.macpack longbranch
.export _lseek
.import addysp, stax0sp, tosand0ax, pusheax, asreax2
.import ldeaxysp, decsp2, pushax, incsp8
.import tosandeax,decax1,tosdiveax,axlong,ldaxysp
.import lynxskip0, lynxblock,tosasreax
.import __BANK0BLOCKSIZE__
.importzp _FileCurrBlock
.segment "CODE"
.proc _lseek: near
.segment "CODE"
jsr pushax
ldy #$05
jsr ldeaxysp
jsr pusheax
ldx #$00
lda #<(__BANK0BLOCKSIZE__/1024 + 9)
jsr tosasreax
sta _FileCurrBlock
jsr lynxblock
ldy #$05
jsr ldeaxysp
jsr pusheax
lda #<(__BANK0BLOCKSIZE__-1)
ldx #>(__BANK0BLOCKSIZE__-1)
jsr axlong
jsr tosandeax
eor #$FF
pha
txa
eor #$FF
tay
plx
jsr lynxskip0
ldy #$05
jsr ldeaxysp
jmp incsp8
.endproc