minix.fst/set_mark.aii

190 lines
2.2 KiB
Plaintext

string asis
include 'gsos.equ'
include 'minix.equ'
include 'records.equ'
include 'fst.equ'
include 'fst.macros'
include 'M16.Debug'
import disk_inode:v1_inode
import disk_super:v1_super
import init_vcr
import init_fcr
my_dp record dp.__end
displacement ds.w 1
omark ds.l 1
mark ds.l 1
IF *>=$d4 THEN
AERROR 'dp -- too large.'
ENDIF
endr
set_mark procname export
with dp, my_dp, fst_parms
jsr init_vcr
jsr init_fcr
; can only read from regular files or links.
lda disk_inode.mode
and #S_IFMT
cmp #S_IFREG
beq @ok
cmp #S_IFLNK
beq @ok
lda #bad_store_type
sec
rtl
@ok
ldy #fcr.mark
lda [my_fcr],y
sta mark
sta omark
iny
iny
lda [my_fcr],y
sta mark+2
sta omark+2
lda call_class
bne class1
; class 0 - { uint16_t refNum; uint32_t offset }
class0
ldy #MarkRec.position
lda [param_blk_ptr],y
sta mark
iny
iny
lda [param_blk_ptr],y
sta mark+2
brl check
class1
ldy #SetPositionRecGS.displacement
lda [param_blk_ptr],y
sta displacement
iny
iny
lda [param_blk_ptr],y
sta displacement+2
ldy #SetPositionRecGS.base
lda [param_blk_ptr],y
cmp #3+1
bcs pre
asl a ; x 2
tax
jmp (table,x)
table
dc.w absolute,eof_minus,mark_plus,mark_minus
pre
lda #parm_range_err
sec
rtl
absolute
; mark = displacement
lda displacement
sta mark
lda displacement+2
sta mark+2
bra check
eof_minus
; mark = eof - displacement
lda disk_inode.size
sec
sbc displacement
sta mark
lda disk_inode.size+2
sbc displacement+2
sta mark+2
bra check
mark_plus
; mark = mark + displacement
lda mark
clc
adc displacement
sta mark
lda mark+2
adc displacement+2
sta mark+2
bra check
mark_minus
; mark = mark - displacement
lda mark
sec
sbc displacement
sta mark
lda mark+2
sbc displacement+2
sta mark+2
check
; negative mark?
lda mark+2
bmi oor
; mark > eof ?
;lda mark+2
cmp disk_inode.size+2
beq @lw
bcc update
bra oor
@lw
; check the low-word
lda mark
cmp disk_inode.size
beq update
bcc update
oor
lda #out_of_range
sec
rtl
update
ldy #fcr.mark
lda mark
sta [my_fcr],y
iny
iny
lda mark+2
sta [my_fcr],y
; in the future...update data_zone, data_block
; if mark was moved to a different block.
lda #0
clc
rtl
endp
end