;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
pnmask: defb 0 ;Property number mask
psmask: defb 0 ;Property size mask
;
;A lot of the code in this file has been hand-crafted from the C
;routines in jzip 2.0.1g.
;
;Find the property list for object DE
;
propadd: ;get_property_addr()
push af
push bc
push de
call objadd
ld a,(zver)
ld bc,7
cp 4
jr c,propad3
ld c,12
propad3:
add hl,bc
ld e,0
call ZXPKWI ;BC = property pointer
ld h,b
ld l,c ;HL = property pointer
call ipeek ;Read length of text
ld c,a
ld b,0
add hl,bc
add hl,bc ;Skip over text
pop de
pop bc
pop af
ret
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;HL->property, make it point at the next property
;
propnxt: ;get_next_property()
push bc
push af
call ZXPK64 ;Get property ID
inc hl
ld c,a
ld a,(zver)
cp 4
jr c,pnv3 ;v1-3 property has size in top 3 bits
bit 7,c
jr nz,pnv4
bit 6,c
jr z,pnv7
inc hl
jr pnv7
pnv4: call ZXPK64 ;Read property size
and 03Fh ;Size
jr pnv5
;
pnv3: ld a,c
and 0E0h
rlca
rlca
rlca ;A = length of property - 1
pnv5: ld c,a
ld b,0
add hl,bc
pnv7: inc hl
pop af
pop bc
ret
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;For object DE, property BC return next property
;
gnprop: call propadd ;HL := address of property list
ld a,(pnmask)
ld b,a
ld a,c
or a
jr z,gnpret
gnprop1:
call peek64
and b ;A = next property ID. Get next if A > C
cp c
jr c,gnprop2
jr z,gnprop3 ;Found!
call propnxt
jr gnprop1
;
gnprop2:
call ilprint
defb 13,10,'Warning: Property not found!$'
gnprop3:
call propnxt
gnpret: call peek64
and b
ld l,a
ld h,0
ret
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;Get object DE, property C into HL
;
gprop: ;load_property()
call propadd ;HL = Address of property list
ld a,(pnmask)
ld b,a
gpr3: call peek64 ;Get property ID
and b
cp c
jr c,dprop ;Not found!
jr z,gpr4 ;Found!
call propnxt ;Next property
jr gpr3
;
gpr4: ld a,(psmask)
ld b,a ;Property size mask
call peek64
inc hl
and b ;Size = 0 (ie one byte)?
jr nz,rword
call peek64 ;Read the byte
ld l,a
ld h,0
ret
dprop: ld hl,(obj_addr) ;Default properties
ld e,c
ld d,0
dec de
add hl,de
add hl,de
rword: ld e,0
call ZXPKWI ;Read word
ld h,b
ld l,c
ret
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;Get address of object DE, property C
;
; ;load_property_address()
gpaddr: call propadd ;HL = Address of property list
ld a,(pnmask)
ld b,a
gpad3: call peek64 ;Get property ID
and b
cp c
jr c,gpnot ;Not found!
jr z,gpad4 ;Found!
call propnxt ;Next property
jr gpad3
;
gpnot: ld hl,0
ret
;
gpad4: ld a,(zver)
cp 4
jr c,gpad5
call peek64
bit 7,a
jr z,gpad5
inc hl
gpad5: inc hl
ret
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;SET object DE property C to HL
;
putprop: ;store_property()
push hl
call propadd ;HL = Address of property list
ld a,(pnmask)
ld b,a
ppr3: call peek64 ;Get property ID
and b
cp c
jp c,proper1
jr z,ppr4 ;Found!
call propnxt ;Next property
jr ppr3
;
ppr4: ld a,(psmask)
ld b,a ;Property size mask
call peek64
inc hl
and b ;Size = 0 (ie one byte)?
jr nz,wword
pop de
ld a,e
call ZXPOKE ;Read the byte
scf
ret
wword: pop de
ld a,d
call ZXPOKE
inc hl
ld a,e
call ZXPOKE
scf
ret
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
gplen: ld a,(psmask) ;from jzip, load_property_length()
ld d,a
dec hl ;HL -> property ID
ld a,(zver)
cp 4
jr c,gplen3
call peek64
ld e,a
bit 7,a
jr z,gplen1
ld a,e
and d
jr rprop
;
gplen1: ld hl,2
bit 6,a
scf
ret nz
dec hl
scf
ret
gplen3: call peek64 ;Get property length in v1-v3
and d ;from the 3 high bits of the byte
rlca
rlca
rlca
inc a
rprop: ld l,a
ld h,0
ret