#ifndef __FIELD_H__ #define __FIELD_H__ /* * field.h - simple field manipulation functions to get students working * with masking. This will be used in the simulator to extract * information when executing an LC3 instruction. It may also be * used in the assembler to "create" the 16 bit LC3 instructions. * If an assignment involving floating point manipulation (e.g. * 16 bit floating point addition), this file can be used to * provide support routines for extracting/setting the sign, * exponent, and mantissa fields. * * "Copyright (c) 2013 by Fritz Sieker." * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written * agreement is hereby granted, provided that the above copyright notice * and the following two paragraphs appear in all copies of this software, * that the files COPYING and NO_WARRANTY are included verbatim with * any distribution, and that the contents of the file README are included * verbatim as part of a file named README with any distribution. * * IN NO EVENT SHALL THE AUTHOR BE LIABLE TO ANY PARTY FOR DIRECT, * INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE AUTHOR * HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE AUTHOR SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS ON AN "AS IS" * BASIS, AND THE AUTHOR NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, * UPDATES, ENHANCEMENTS, OR MODIFICATIONS." */ /** @file field.h * @brief Defines interface of field.c functions (do not modify) * @details This file defines the interface to a C file field.c that * you will complete. You will learn how to * use the C language operators for binary and (&), * binary or (|), and binary not (~). You will also use the * C language bit shift operators (<< and >>). * @author Fritz Sieker */ #include /** Get the specified bit from a value. * @param value the source value or bit pattern * @param position the bit position to get (0..31) * @return 1 when the bit is set, and 0 otherwise. */ int getBit (int value, int position); /** Set the specified bit in a value (make it equal to 1). * @param value the source value or bit pattern * @param position the bit position to be set (0..31) * @return An integer value that is the original value with the specified bit * set. */ int setBit (int value, int position); /** Clear the specified bit in a value (make it equal to 0). * @param value the source value or bit pattern * @param position the bit position to be set (0..31) * @return An integer value that is the original value with the specified bit * cleared. */ int clearBit (int value, int position); /** Extract the field (possibly signed) between bits hi and lo (inclusive). * @param value the source value or bit pattern * @param hi the bit position of one end of the field * @param lo the bit position of the other end of the field * @param isSigned false means the field is unsigned, true means the field is signed * @return The value of the field. Sanity check example: * if the field is three bits wide and unsigned, the result * will be a value between 0 and 7, regardless of the actual position of the * bits in value. If the value is signed, the result will be between -4 and 3. * Furthermore, if the value is signed, it will be negative only if * the left most bit of the field is 1. In this case, the field must be * sign extended (i.e. make all bits to the left 1). */ int getField (int value, int hi, int lo, bool isSigned); #endif