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_IMM9 = 0x100, FMT_IMM11 = 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_CL = (FMT_CC | FMT_IMM9),
  FMT_R = FMT_R2, FMT_I11 = FMT_IMM11, FMT_RL = (FMT_R1 | FMT_IMM9), 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
}
 

Functions

char * strdup (const char *)
 
LC3_inst_tlc3_get_inst_info (opcode_t opcode)
 
int lc3_read_LC3_word (FILE *f)
 
void lc3_write_LC3_word (FILE *f, int val)
 

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.

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.

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 boolean 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 BR, LD, LDI, ST and STI instructions all have two parameters. The first is a register, the second is a nine bit offset. This form stores multiple boolean values in a single integer values by using individual bits to encode information.

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 

-1: invalid opcode

OP_BR 

0: PC = PCi + PCoffset9 if condition is met

OP_ADD 

1: DR = SR1 + SR2 or DR = SR1 + imm5

OP_LD 

2: DR = mem[PCi + PCoffset9]

OP_ST 

3: mem[PCi + PCoffset9] = SR

OP_JSR_JSRR 

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

OP_AND 

5: DR = SR1 & SR2

OP_LDR 

6: DR = mem[BaseR + offset6]

OP_STR 

7: mem[BaseR + offset6] = SR

OP_RTI 

8: PC = R7, exit supervisor mode

OP_NOT 

9: DR = ~SR1

OP_LDI 

10: DR = mem[mem[PCi + PCoffset9]]

OP_STI 

11: mem[mem[PCi + offset9]] = SR

OP_JMP_RET 

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

OP_RESERVED 

13: Currently not used

OP_LEA 

14: DR = PCi + PCoffset9

OP_TRAP 

15: R7 = PCi, PC = mem[mem[trap]], enter sys mode

OP_ORIG 

16: memory location where code is loaded

OP_END 

17: end of propgram - only comments may follow

OP_BLKW 

18: allocate N words of storage initialized with 0

OP_FILL 

19: allocate 1 word of storage initialed with operand

OP_STRINGZ 

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

OP_GETC 

21: Read character from keyboard, no echo (trap x20)

OP_OUT 

22: Write one character (trap x21)

OP_PUTS 

23: Write null terminated string (trap x22)

OP_IN 

24: Print prompt and read/echo character (trap x23)

OP_PUTSP 

25: Write packed null terminated string (trap x24)

OP_HALT 

26: Halt execution (trap x25)

OP_GETS 

27: Read string from kbd, store in memory (trap x26)

OP_ZERO 

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

OP_COPY 

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

OP_NEG 

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

NUM_OPCODES 

31: 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 boolean 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_IMM9 

label (or address from imm9)

FMT_IMM11 

label (or address from imm11)

FMT_IMM16 

full instruction in hex

FMT_STR 

operand is string literal

enum operands

Define a combinatin of operands an opcode may have. For example, the the BR, LD, LDI, ST and STI instructions all have two parameters. The first is a register, the second is a nine bit offset. This form stores multiple boolean values in a single integer values by using individual bits to encode information.

Function Documentation

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_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_write_LC3_word ( FILE *  f,
int  val 
)

Write an LC3 word to a file in binary or hex

Parameters
f- the file to write to
val- the value to write
char* strdup ( const char *  )

prototype for handy function to duplicate a string

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