libc8
CHIP-8 utility library
Loading...
Searching...
No Matches
symbol.h File Reference
#include <stdint.h>
#include <stdlib.h>

Go to the source code of this file.

Data Structures

struct  instruction_format_t
 Represents a valid instruction format. More...
 
struct  instruction_t
 Represents an instruction. More...
 
struct  label_t
 Represents a label. More...
 
struct  label_list_t
 Represents a list of labels. More...
 
struct  symbol_t
 Represents a symbol with a type, value, and line number. More...
 
struct  symbol_list_t
 Represents a symbol with a type, value, and line number. More...
 

Macros

#define INSTRUCTION_COUNT   64
 
#define LABEL_CEILING   64
 
#define LABEL_IDENTIFIER_SIZE   20
 
#define SYMBOL_CEILING   64
 
#define S_CLS   "CLS"
 
#define S_RET   "RET"
 
#define S_JP   "JP"
 
#define S_CALL   "CALL"
 
#define S_SE   "SE"
 
#define S_SNE   "SNE"
 
#define S_LD   "LD"
 
#define S_ADD   "ADD"
 
#define S_OR   "OR"
 
#define S_AND   "AND"
 
#define S_SUB   "SUB"
 
#define S_SHR   "SHR"
 
#define S_SUBN   "SUBN"
 
#define S_SHL   "SHL"
 
#define S_RND   "RND"
 
#define S_DRW   "DRW"
 
#define S_SKP   "SKP"
 
#define S_SKNP   "SKNP"
 
#define S_XOR   "XOR"
 
#define S_SCD   "SCD"
 
#define S_SCR   "SCR"
 
#define S_SCL   "SCL"
 
#define S_EXIT   "EXIT"
 
#define S_LOW   "LOW"
 
#define S_HIGH   "HIGH"
 
#define S_JP_V0   "JP V0,"
 
#define S_K   "K"
 
#define S_F   "F"
 
#define S_B   "B"
 
#define S_DT   "DT"
 
#define S_ST   "ST"
 
#define S_I   "I"
 
#define S_IP   "[I]"
 
#define S_DB   ".DB"
 
#define S_DW   ".DW"
 
#define S_DS   ".DS"
 
#define S_HF   "HF"
 
#define S_R   "R"
 

Enumerations

enum  Instruction {
  I_NULL = -1 , I_CLS , I_RET , I_JP ,
  I_CALL , I_SE , I_SNE , I_LD ,
  I_ADD , I_OR , I_AND , I_SUB ,
  I_SHR , I_SUBN , I_SHL , I_RND ,
  I_DRW , I_SKP , I_SKNP , I_XOR ,
  I_SCD , I_SCR , I_SCL , I_EXIT ,
  I_LOW , I_HIGH , I_JP_V0
}
 Represents instruction types. More...
 
enum  Symbol {
  SYM_NULL , SYM_DT , SYM_ST , SYM_I ,
  SYM_IP , SYM_K , SYM_F , SYM_B ,
  SYM_DB , SYM_DW , SYM_DS , SYM_HF ,
  SYM_R , SYM_LABEL , SYM_INT , SYM_INT4 ,
  SYM_INT8 , SYM_INT12 , SYM_STRING , SYM_V ,
  SYM_INSTRUCTION , SYM_LABEL_DEFINITION
}
 Represents symbol types. More...
 

Functions

int build_instruction (instruction_t *, symbol_list_t *, int)
 Build an instruction from symbols beginning at idx.
 
int is_comment (const char *)
 Check if the given string is a comment.
 
int is_db (const char *)
 Check if given string is a DB identifier.
 
int is_ds (const char *)
 Check if given string is a DS identifier.
 
int is_dw (const char *)
 Check if given string is a DW identifier.
 
int is_instruction (const char *)
 Check if the given string is an instruction.
 
int is_label_definition (const char *)
 Check if the given string is a label definition.
 
int is_label (const char *, const label_list_t *)
 Check if given string is a label reference.
 
int is_register (const char *)
 Check if the given string represents a V register.
 
int is_reserved_identifier (const char *)
 Check if given string is a reserved identifier.
 
symbol_tnext_symbol (symbol_list_t *)
 Get the next symbol.
 
int populate_labels (label_list_t *)
 Populate label list from lines.
 
int resolve_labels (symbol_list_t *, label_list_t *)
 Get byte indexes of label definitions from completed symbol table.
 
int shift (uint16_t)
 Find the bits needed to shift to OR a parameter into an instruction.
 
int substitute_labels (symbol_list_t *, label_list_t *)
 Substitute label symbols with their corresponding int value.
 

Variables

const char * c8_instructionStrings []
 
const char * c8_identifierStrings []
 
instruction_format_t formats []
 

Detailed Description

Note
NOT EXPORTED

Stuff for parsing symbols and instructions for encoding CHIP-8 "assembly".

Macro Definition Documentation

◆ INSTRUCTION_COUNT

#define INSTRUCTION_COUNT   64

◆ LABEL_CEILING

#define LABEL_CEILING   64

◆ LABEL_IDENTIFIER_SIZE

#define LABEL_IDENTIFIER_SIZE   20

◆ S_ADD

#define S_ADD   "ADD"

◆ S_AND

#define S_AND   "AND"

◆ S_B

#define S_B   "B"

◆ S_CALL

#define S_CALL   "CALL"

◆ S_CLS

#define S_CLS   "CLS"

◆ S_DB

#define S_DB   ".DB"

◆ S_DRW

#define S_DRW   "DRW"

◆ S_DS

#define S_DS   ".DS"

◆ S_DT

#define S_DT   "DT"

◆ S_DW

#define S_DW   ".DW"

◆ S_EXIT

#define S_EXIT   "EXIT"

◆ S_F

#define S_F   "F"

◆ S_HF

#define S_HF   "HF"

◆ S_HIGH

#define S_HIGH   "HIGH"

◆ S_I

#define S_I   "I"

◆ S_IP

#define S_IP   "[I]"

◆ S_JP

#define S_JP   "JP"

◆ S_JP_V0

#define S_JP_V0   "JP V0,"

◆ S_K

#define S_K   "K"

◆ S_LD

#define S_LD   "LD"

◆ S_LOW

#define S_LOW   "LOW"

◆ S_OR

#define S_OR   "OR"

◆ S_R

#define S_R   "R"

◆ S_RET

#define S_RET   "RET"

◆ S_RND

#define S_RND   "RND"

◆ S_SCD

#define S_SCD   "SCD"

◆ S_SCL

#define S_SCL   "SCL"

◆ S_SCR

#define S_SCR   "SCR"

◆ S_SE

#define S_SE   "SE"

◆ S_SHL

#define S_SHL   "SHL"

◆ S_SHR

#define S_SHR   "SHR"

◆ S_SKNP

#define S_SKNP   "SKNP"

◆ S_SKP

#define S_SKP   "SKP"

◆ S_SNE

#define S_SNE   "SNE"

◆ S_ST

#define S_ST   "ST"

◆ S_SUB

#define S_SUB   "SUB"

◆ S_SUBN

#define S_SUBN   "SUBN"

◆ S_XOR

#define S_XOR   "XOR"

◆ SYMBOL_CEILING

#define SYMBOL_CEILING   64

Enumeration Type Documentation

◆ Instruction

Represents instruction types.

This enumeration defines all possible CHIP-8 instructions.

NOTE: values to be kept in same order as instructionStrings

Enumerator
I_NULL 
I_CLS 
I_RET 
I_JP 
I_CALL 
I_SE 
I_SNE 
I_LD 
I_ADD 
I_OR 
I_AND 
I_SUB 
I_SHR 
I_SUBN 
I_SHL 
I_RND 
I_DRW 
I_SKP 
I_SKNP 
I_XOR 
I_SCD 
I_SCR 
I_SCL 
I_EXIT 
I_LOW 
I_HIGH 
I_JP_V0 

◆ Symbol

enum Symbol

Represents symbol types.

This enumeration defines all symbol types found during the first assembler pass.

NOTE: values before label need to be kept in same order as identifierStrings

Enumerator
SYM_NULL 
SYM_DT 
SYM_ST 
SYM_I 
SYM_IP 
SYM_K 
SYM_F 
SYM_B 
SYM_DB 
SYM_DW 
SYM_DS 
SYM_HF 
SYM_R 
SYM_LABEL 
SYM_INT 
SYM_INT4 
SYM_INT8 
SYM_INT12 
SYM_STRING 
SYM_V 
SYM_INSTRUCTION 
SYM_LABEL_DEFINITION 

Function Documentation

◆ build_instruction()

int build_instruction ( instruction_t ins,
symbol_list_t symbols,
int  idx 
)

Build an instruction from symbols beginning at idx.

This function builds an instruction from a completely parsed set of symbols (with labels expanded).

Parameters
insinstruction_t to store instruction contents
symbolssymbol list
idxsymbols index of start of instruction
Returns
instruction bytecode

◆ is_comment()

int is_comment ( const char *  s)

Check if the given string is a comment.

Parameters
sthe string to check
Returns
1 if true, 0 if false

◆ is_db()

int is_db ( const char *  s)

Check if given string is a DB identifier.

Returns
1 if true, 0 if false

◆ is_ds()

int is_ds ( const char *  s)

Check if given string is a DS identifier.

Returns
1 if true, 0 if false

◆ is_dw()

int is_dw ( const char *  s)

Check if given string is a DW identifier.

Returns
1 if true, 0 if false

◆ is_instruction()

int is_instruction ( const char *  s)

Check if the given string is an instruction.

Parameters
sthe string to check
Returns
instruction enumerator if true, -1 if false

◆ is_label()

int is_label ( const char *  s,
const label_list_t labels 
)

Check if given string is a label reference.

This function checks if the given string is a label reference by comparing it against the label list. It returns the index of the label in the label list if it is found, or -1 if it is not.

This function assumes that the label list has been populated (e.g. populate_labels() has been called).

Parameters
sstring to check
labelslabel list to check from
Returns
label index if true, -1 otherwise

◆ is_label_definition()

int is_label_definition ( const char *  s)

Check if the given string is a label definition.

Parameters
sthe string to check
Returns
1 if true, 0 if false

◆ is_register()

int is_register ( const char *  s)

Check if the given string represents a V register.

This function checks if the given string starts with 'V' or 'v' and is followed by a valid hexadecimal digit (0-9, A-F, a-f). It returns the register number if it is a valid V register, or -1 if it is not.

Parameters
sstring to check
Returns
V register number if true, -1 otherwise

◆ is_reserved_identifier()

int is_reserved_identifier ( const char *  s)

Check if given string is a reserved identifier.

This function checks if the given string is one of the reserved identifiers defined in c8_identifierStrings. It returns the index of the identifier if it is found, or -1 if it is not.

Parameters
sstring to check
Returns
type of identifier if true, -1 otherwise

◆ next_symbol()

symbol_t * next_symbol ( symbol_list_t symbols)

Get the next symbol.

This function retrieves the next available symbol in the symbol list. If the symbol list is empty, it initializes the first symbol. If the symbol list is full, it reallocates the symbol list to accommodate more symbols.

If symbols is NULL or the symbol list is NULL, it returns NULL.

Parameters
symbolssymbol list to get next symbol from
Returns
first empty symbol in symbol table

◆ populate_labels()

int populate_labels ( label_list_t labels)

Populate label list from lines.

This function scans through the lines of code and identifies label definitions. It checks each line for a label definition (ending with a colon) and adds it to the label list.

If a duplicate label definition is found, it throws a DUPLICATE_LABEL_EXCEPTION.

If too many labels are defined, it throws a TOO_MANY_LABELS_EXCEPTION.

Parameters
lineslines to search
lineCountnumber of lines to search
labelslabel list to populate
Returns
1 if success, 0 if failure

◆ resolve_labels()

int resolve_labels ( symbol_list_t symbols,
label_list_t labels 
)

Get byte indexes of label definitions from completed symbol table.

This function resolves label definitions in the symbol list and populates the label list with the byte index of each label definition. It iterates through the symbols, keeping track of the current byte position in the program. When it encounters a label definition, it records the current byte position in the label list. It also increments the byte position based on the type of symbol encountered (e.g., SYM_DB increments by 1, SYM_INSTRUCTION and SYM_DW increment by 2).

This function assumes that the symbol list has been populated and that the symbols have been parsed correctly. It also assumes that the label list has been initialized.

This function will return 1 if all labels were resolved successfully, or 0 if there was a failure (e.g., if the label list is not fully populated).

This function will throw a NULL_ARGUMENT_EXCEPTION if either symbols or labels is NULL.

Parameters
symbolslist of symbols
labelslist of labels
Returns
1 if success, 0 if failure

◆ shift()

int shift ( uint16_t  fmt)

Find the bits needed to shift to OR a parameter into an instruction.

This function finds the bits needed to shift to OR a parameter into an instruction. It is used to determine the position of parameters in the instruction bytecode.

This is a workaround for the fact that the instruction formats are not defined in a way that allows for easy bit manipulation.

Parameters
fmtinstruction_format_t pformat to check
Returns
number of bits to shift

◆ substitute_labels()

int substitute_labels ( symbol_list_t symbols,
label_list_t labels 
)

Substitute label symbols with their corresponding int value.

This function replaces all symbols of type SYM_LABEL in the symbol list with their corresponding byte value from the label list. It checks if the label exists and throws an INVALID_SYMBOL_EXCEPTION if it does not.

This function assumes that the label list has been populated and that their byte values have been set correctly.

Parameters
symbolssymbols to search
labelslabels to search

Variable Documentation

◆ c8_identifierStrings

const char* c8_identifierStrings[]
extern

Reserved identifier strings. Has to match Symbol.

◆ c8_instructionStrings

const char* c8_instructionStrings[]
extern

Instruction strings. Has to match Instruction.

◆ formats

instruction_format_t formats[]
extern

All valid instruction formats