home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Frozen Fish 1: Amiga
/
FrozenFish-Apr94.iso
/
bbs
/
alib
/
d8xx
/
d834
/
pinfocom.lha
/
PInfoCom
/
pinfocom-3.0.lha
/
property.c
< prev
next >
Wrap
C/C++ Source or Header
|
1992-11-03
|
5KB
|
221 lines
/* property.c
*
* ``pinfocom'' -- a portable Infocom Inc. data file interpreter.
* Copyright (C) 1987-1992 InfoTaskForce
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; see the file COPYING. If not, write to the
* Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
*/
/*
* $Header: RCS/property.c,v 3.0 1992/10/21 16:56:19 pds Stab $
*/
#include "infocom.h"
static property
prop_addr A1(object_t *, obj)
{
extern byte *base_ptr;
property p;
p = base_ptr + Z_TO_WORD(obj->data);
return (p + (Z_TO_BYTE(p) << 1) + 1);
}
static property
next_addr A1(property, p)
{
return (p + (Z_TO_BYTE(p) >> 5) + 2);
}
void
next_prop A2(word, obj_num, word, prop_num)
{
property p;
word p_num;
p = prop_addr(obj_addr(obj_num));
if (prop_num != 0)
{
p_num = *p & 0x1F;
/* Properties are kept in descending order */
while (p_num > prop_num)
{
p = next_addr(p);
p_num = *p & 0x1F;
}
if (p_num < prop_num)
error("prop: Error retrieving next property ($%02x)", prop_num);
else
p = next_addr(p);
}
store((word)(*p & 0x1F));
}
void
put_prop A3(word, obj_num, word, prop_num, word, value)
{
property p;
word p_num;
p = prop_addr(obj_addr(obj_num));
p_num = *p & 0x1F;
/* Properties are kept in descending order */
while (p_num > prop_num)
{
p = next_addr(p);
p_num = *p & 0x1F;
}
if (p_num < prop_num)
error("prop: Error storing property ($%02x)", prop_num);
else
{
if ((*p++) & 0x20)
{
(*p++) = value >> 8;
*p = value;
}
else
*p = value;
}
}
void
get_prop A2(word, obj_num, word, prop_num)
{
property p;
word p_num;
word prop;
p = prop_addr(obj_addr(obj_num));
p_num = *p & 0x1F;
/* Properties are kept in descending order */
while (p_num > prop_num)
{
p = next_addr(p);
p_num = *p & 0x1F;
}
if (p_num < prop_num)
{
prop_num = (--prop_num) << 1;
p = (property) objd.obj_base + prop_num;
prop = Z_TO_WORD(p);
}
else
{
if (*(p++) & 0x20)
prop = Z_TO_WORD(p);
else
prop = Z_TO_BYTE(p);
}
store(prop);
}
void
get_prop_addr A2(word, obj_num, word, prop_num)
{
extern byte *base_ptr;
property p;
word p_num;
p = prop_addr(obj_addr(obj_num));
p_num = *p & 0x1F;
/* Properties are kept in descending order */
while (p_num > prop_num)
{
p = next_addr(p);
p_num = *p & 0x1F;
}
if (p_num < prop_num)
store(0);
else
store((word)(p + 1 - base_ptr));
}
void
get_prop_len A1(word, prop_num)
{
extern byte *base_ptr;
property p;
p = base_ptr + prop_num - 1;
store((word)((Z_TO_BYTE(p) >> 5) + 1));
}
void
load_word_array A2(word, base, word, offset)
{
word page;
word page_offset;
base += (offset << 1);
page = base / BLOCK_SIZE;
page_offset = base % BLOCK_SIZE;
store(get_word(&page, &page_offset));
}
void
load_byte_array A2(word, base, word, offset)
{
word page;
word page_offset;
base += offset;
page = base / BLOCK_SIZE;
page_offset = base % BLOCK_SIZE;
store((word)get_byte(&page, &page_offset));
}
void
save_word_array A3(word, base, word, offset, word, value)
{
extern byte *base_ptr;
byte *ptr;
/* The quantity added to 'base_ptr' must be a word */
base += (offset << 1);
ptr = base_ptr + base;
(*ptr++) = value >> 8;
*ptr = value;
}
void
save_byte_array A3(word, base, word, offset, word, value)
{
extern byte *base_ptr;
byte *ptr;
/* The quantity added to 'base_ptr' must be a word */
base += offset;
ptr = base_ptr + base;
*ptr = value;
}