1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
|
;
; 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 __BLOCKSIZE__
.importzp _FileCurrBlock
.segment "CODE"
.proc _lseek: near
.segment "CODE"
jsr pushax
ldy #$05
jsr ldeaxysp
jsr pusheax
ldx #$00
lda #<(__BLOCKSIZE__/1024 + 9)
jsr tosasreax
sta _FileCurrBlock
jsr lynxblock
ldy #$05
jsr ldeaxysp
jsr pusheax
lda #<(__BLOCKSIZE__-1)
ldx #>(__BLOCKSIZE__-1)
jsr axlong
jsr tosandeax
eor #$FF
pha
txa
eor #$FF
tay
plx
jsr lynxskip0
ldy #$05
jsr ldeaxysp
jmp incsp8
.endproc
|