/* This is G-file @(#) array3.c Version 2.9 (10/12/88). copyright Xerox & Fuji Xerox  */

/************************************************************************/
/*									*/
/*	(C) Copyright 1989-95 Venue. All Rights Reserved.		*/
/*	Manufactured in the United States of America.			*/
/*									*/
/************************************************************************/

#include "version.h"

/************************************************************************/
/*									*/
/*			     A R R A Y 3 . C				*/
/*									*/
/*	Contains:	N_OP_aref1					*/
/*									*/
/************************************************************************/

#include <stdio.h>
#include "lispemul.h"
#include "lspglob.h"
#include "adr68k.h"
#include "lispmap.h"
#include "lsptypes.h"
#include "emlglob.h"

#include "array3defs.h"
#include "mkcelldefs.h"
#include "arith.h"
#include "my.h"

/***	N_OP_aref1   -- op 266   (array index)   ***/
LispPTR N_OP_aref1(register LispPTR arrayarg, register LispPTR inx) {
  register LispPTR baseL;
  register int type, index;
  register OneDArray *arrayblk;

  /*  verify array  */
  if (GetTypeNumber(arrayarg) != TYPE_ONED_ARRAY) ERROR_EXIT(inx);
  arrayblk = (OneDArray *)Addr68k_from_LADDR(arrayarg);

  /*  test and setup index  */
  N_GetPos(inx, index, inx);
  if (index >= arrayblk->totalsize) ERROR_EXIT(inx);
  index += arrayblk->offset;

  /*  setup typenumber  */
  type = 0xFF & arrayblk->typenumber;

  /*  setup base  */
  baseL = arrayblk->base;

  /*  disp on type  */
  return (aref_switch(type, inx, baseL, index));
} /*  end N_OP_aref1()  */
