My Project
Data Structures | Macros | Typedefs | Enumerations | Functions | Variables
lc3.h File Reference

definitions of the LC3 instruction set architecture (ISA) (do not modify) More...

#include <stdio.h>
#include "symbol.h"

Go to the source code of this file.

Data Structures

struct  inst_format
 
struct  LC3_inst
 

Macros

#define LC3_VAR   extern
 
#define LC3_WORD   unsigned short
 
#define LC3_MEM_SIZE   65536
 
#define LC3_NUM_REGS   8
 
#define RETURN_ADDR_REG   7
 

Typedefs

typedef enum opcode opcode_t
 
typedef enum operand operand_t
 
typedef enum operands operands_t
 
typedef struct inst_format inst_format_t
 
typedef struct LC3_inst LC3_inst_t
 

Enumerations

enum  opcode {
  OP_INVALID = -1, OP_BR, OP_ADD, OP_LD,
  OP_ST, OP_JSR_JSRR, OP_AND, OP_LDR,
  OP_STR, OP_RTI, OP_NOT, OP_LDI,
  OP_STI, OP_JMP_RET, OP_RESERVED, OP_LEA,
  OP_TRAP, OP_ORIG, OP_END, OP_BLKW,
  OP_FILL, OP_STRINGZ, OP_GETC, OP_OUT,
  OP_PUTS, OP_IN, OP_PUTSP, OP_HALT,
  OP_GETS, OP_ZERO, OP_COPY, OP_NEG,
  NUM_OPCODES
}
 
enum  operand {
  FMT_R1 = 0x001, FMT_R2 = 0x002, FMT_R3 = 0x004, FMT_CC = 0x008,
  FMT_IMM5 = 0x010, FMT_IMM6 = 0x020, FMT_VEC8 = 0x040, FMT_ASC8 = 0x080,
  FMT_PCO9 = 0x100, FMT_PCO11 = 0x200, FMT_IMM16 = 0x400, FMT_STR = 0x800
}
 
enum  operands {
  FMT_ = 0, FMT_RRR = (FMT_R1 | FMT_R2 | FMT_R3), FMT_RRI5 = (FMT_R1 | FMT_R2 | FMT_IMM5), FMT_L = FMT_PCO9,
  FMT_R = FMT_R2, FMT_I11 = FMT_PCO11, FMT_RL = (FMT_R1 | FMT_PCO9), FMT_RRI6 = (FMT_R1 | FMT_R2 | FMT_IMM6),
  FMT_RR = (FMT_R1 | FMT_R2), FMT_V = FMT_VEC8, FMT_A = FMT_ASC8, FMT_16 = FMT_IMM16,
  FMT_S = FMT_STR
}
 

Functions

char * strdup (const char *)
 
char lc3_escaped_char (char c)
 
LC3_inst_tlc3_get_inst_info (opcode_t opcode)
 
const char * lc3_get_format_name (operands_t format)
 
const char * lc3_get_opcode_name (opcode_t op)
 
const char * lc3_get_operand_name (operand_t operand)
 
int lc3_read_LC3_word (FILE *f)
 
void lc3_read_sym_table (FILE *sym_file)
 
void lc3_write_LC3_word (FILE *f, int value)
 
void lc3_write_sym_table (FILE *sym_file)
 
int lc3_get_int (char *token, int *value)
 
int lc3_get_address (char *token, int *value)
 

Variables

LC3_VAR int inHex
 
LC3_VAR sym_table_tlc3_sym_tab
 

Detailed Description

This defines the details of the LC3 instruction set architecture (ISA). It is a separate file so that it can be shared by both an assembler and a simulator. It also include various utility routines.

Author
Fritz Sieker

Macro Definition Documentation

#define LC3_MEM_SIZE   65536

The LC3 defines a memory accessed by a 16 bit address

#define LC3_NUM_REGS   8

The LC3 contains 8 general purpose register, named R0..R7

#define LC3_VAR   extern

A handy way of declaring global variables in a header file

#define LC3_WORD   unsigned short

LC3 words are 16 bits

#define RETURN_ADDR_REG   7

Return address stored in R7

Typedef Documentation

typedef struct inst_format inst_format_t

This structure stores the information for one form of an instruction. Several instructions have multiple forms, but most have only one.

typedef struct LC3_inst LC3_inst_t

This structure stores the information about a single instruction. See the usage in lc3.c where the information for each LC3 instruction is defined. The name of the seond form will be NULL unless the instruction actually has two forms.

typedef enum opcode opcode_t

The LC3 opcodes and pseudo-ops. The codes of OP_BR .. OP_TRAP corresponds exactly to the numeric values assigned to the 16 LC3 instructions. The codes assigned to the pseudo-ops is arbitrary. PCi is the incremented PC

typedef enum operand operand_t

A bit field used to define the types of operands an individual LC3 instruction may have. Each value represents a different bit in the final result. When you see C code like this, it is likely that an integer value is used to represent an "array" of up to 32 values. Each value is accessed with a mask that extracts the bit of interest. See the inst_format_t below.

typedef enum operands operands_t

Define a combinatin of operands an opcode may have. For example, the the LD, LDI, ST and STI instructions all have two parameters. The first is a register, the second is a nine bit offset. This code stores multiple values in a single integer value by using individual bits to encode information. The ordering is right to left, with the rightmost 1 bit being the type of the first operand.

To determine the number of operands an instruction has, simply count the 1 bits in the word. Here is an algorithum by Brian Kernigan, one of the developers of Unix, and co-author of the famous book "The C Programing Language (known as K&R)".

Enumeration Type Documentation

enum opcode

The LC3 opcodes and pseudo-ops. The codes of OP_BR .. OP_TRAP corresponds exactly to the numeric values assigned to the 16 LC3 instructions. The codes assigned to the pseudo-ops is arbitrary. PCi is the incremented PC

Enumerator
OP_INVALID 

invalid opcode

OP_BR 

PC = PCi + PCoffset9 if condition is met

OP_ADD 

DR = SR1 + SR2 or DR = SR1 + imm5

OP_LD 

DR = mem[PCi + PCoffset9]

OP_ST 

mem[PCi + PCoffset9] = SR

OP_JSR_JSRR 

R7 = PCi and (PC = SR or PC = PCi + PCoffest9)

OP_AND 

DR = SR1 & SR2

OP_LDR 

DR = mem[BaseR + offset6]

OP_STR 

mem[BaseR + offset6] = SR

OP_RTI 

PC = R7, exit supervisor mode

OP_NOT 

DR = ~SR1

OP_LDI 

DR = mem[mem[PCi + PCoffset9]]

OP_STI 

mem[mem[PCi + offset9]] = SR

OP_JMP_RET 

PC = R7 (RET) or PC = Rx (JMP Rx)

OP_RESERVED 

Currently not used

OP_LEA 

DR = PCi + PCoffset9

OP_TRAP 

R7 = PCi, PC = mem[mem[trap]], enter supervisor mode

OP_ORIG 

memory location where code is loaded

OP_END 

end of propgram - only comments may follow

OP_BLKW 

allocate N words of storage initialized with 0

OP_FILL 

allocate 1 word of storage initialed with operand

OP_STRINGZ 

allocate N+1 words of storage initialized with string and null terminator (1 char per word)

OP_GETC 

Read character from keyboard, no echo (trap x20)

OP_OUT 

Write one character (trap x21)

OP_PUTS 

Write null terminated string (trap x22)

OP_IN 

Print prompt and read/echo character (trap x23)

OP_PUTSP 

Write packed null terminated string (trap x24)

OP_HALT 

Halt execution (trap x25)

OP_GETS 

Read string from keyboard, store in memory (trap x26)

OP_ZERO 

DR = 0 (AND DR,DR,#0)

OP_COPY 

DR = SR1 (ADD DR,SR1,#0)

OP_NEG 

DR = -DR (NOT DR,DR and ADD DR,DR,#1)

NUM_OPCODES 

Initialized by compiler

enum operand

A bit field used to define the types of operands an individual LC3 instruction may have. Each value represents a different bit in the final result. When you see C code like this, it is likely that an integer value is used to represent an "array" of up to 32 values. Each value is accessed with a mask that extracts the bit of interest. See the inst_format_t below.

Enumerator
FMT_R1 

DR or SR

FMT_R2 

SR1 or BaseR

FMT_R3 

SR2

FMT_CC 

condition codes

FMT_IMM5 

imm5

FMT_IMM6 

offset6

FMT_VEC8 

trapvect8

FMT_ASC8 

8-bit ASCII

FMT_PCO9 

label (or address for imm9)

FMT_PCO11 

label (or address for imm11)

FMT_IMM16 

16 bits for .FILL. or .ORIG

FMT_STR 

operand is string literal

enum operands

Define a combinatin of operands an opcode may have. For example, the the LD, LDI, ST and STI instructions all have two parameters. The first is a register, the second is a nine bit offset. This code stores multiple values in a single integer value by using individual bits to encode information. The ordering is right to left, with the rightmost 1 bit being the type of the first operand.

To determine the number of operands an instruction has, simply count the 1 bits in the word. Here is an algorithum by Brian Kernigan, one of the developers of Unix, and co-author of the famous book "The C Programing Language (known as K&R)".

Function Documentation

char lc3_escaped_char ( char  c)

Convert an escape sequence to a single character

Parameters
cthe character after the escape character (the back-slash)
Returns
the ascaped value of the character
int lc3_get_address ( char *  token,
int *  value 
)

Convert a string to an address. The sting is assumed to be a symbol. If it is found in the symbol table, the address is returned via the pointer. Otherwise call lc3_get_int() to convert the "number" to an address.

Parameters
token- the string to be converted
value- pointer to where the address will be stored
Returns
1 on success, 0 on failure
const char* lc3_get_format_name ( operands_t  format)

Convert a operands_t to a "name"

Parameters
format- the value to convert
Returns
- a human readable name
LC3_inst_t* lc3_get_inst_info ( opcode_t  opcode)

Get the information for an instruction, given its opcode This is simply an access into an array of values initialized with the information for each of the LC3's sixteen instructions and additional pseudo-ops.

Parameters
opcode- the opcode of the instruction/pseudo-op of interest
Returns
- a pointer to the sytax information for this instruction or NULL
int lc3_get_int ( char *  token,
int *  value 
)

Convert a string to an integer using either the LC3 syntax, or the standard C syntax for a number. The LC3 format assumes hex unless the string is preceeded by a # sign. The initial x/X for hex values is optional. The C syntac is [+/-] digit [x/X] digit*

Parameters
token- the string to be converted
value- pointer to where value will be stored
Returns
1 on success, 0 on failure
const char* lc3_get_opcode_name ( opcode_t  op)

convert an opcode_t to a name

Parameters
op- the opcode to convert
Returns
- a human readable name
const char* lc3_get_operand_name ( operand_t  operand)

convert operand type to a "name"

Parameters
operand- the type of operand
Returns
a human readable name
int lc3_read_LC3_word ( FILE *  f)

Read an LC3 word (16 bits) from a file and return the value

Parameters
f- the object file
Returns
the value, or -1 on EOF
void lc3_read_sym_table ( FILE *  sym_file)

Read the symbol table file and populate the global lc3_sym_tab No error checking is performed. It is assumbed the file is in the correct format.

Parameters
sym_file,thefile containing the symbol table
void lc3_write_LC3_word ( FILE *  f,
int  value 
)

Write an LC3 word to a file in binary or hex

Parameters
f- the file to write to
value- the value to write
void lc3_write_sym_table ( FILE *  sym_file)

Write the symbol table to a file

Parameters
sym_file- the file in which the symbol table is written
char* strdup ( const char *  )

Prototype for handy function to duplicate a string. This function allocates dynamic memory and copies the string into that memory. Thus, use of this function implies the need to free the string at some point.

Variable Documentation

LC3_VAR int inHex

Global flag defining whether using .obj file or .hex file

LC3_VAR sym_table_t* lc3_sym_tab

Global variable holding symbol table