/* .cod file support
Copyright (C) 1999 James Bowman, Scott Dattalo
This file is part of gpasm & gpsim - which are both a subset of
the gnupic project.
gpsim is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
gpsim is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with gpsim; see the file COPYING. If not, write to
the Free Software Foundation, 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#if !defined(__COD_H)
#define __COD_H
#include "program_files.h"
/*
* .cod definitions
*
* A .cod file consists of an array of 512 byte blocks. There are two types
* of blocks: a "directory" block and a "data" block. The directory block
* describes the miscellaneous stuff like the compiler, the date, copy right
* and it also describes the type of information that's available in the .cod
* file. The "type of information" is specified by a range of blocks. For
* example, if there are symbols in the .cod file then the directory block
* tells the starting and ending blocks that contain the symbols.
*
* Types of data blocks:
* short symbol table - a list of symbols in the "short format", which
* means that the symbol name is restricted to 12 characters. This
* is an old format and is not provided by gpasm.
* long symbol table - a list of symbols in the "long format". Like the
* short symbol table except the symbol names can be up to 255 chars.
* list table - a cross reference between the source line numbers, list
* line numbers, and the program memory.
* Memory map table - describes the ranges of memory used in the processor.
* Local variables table - [c files - not supported by gpasm] this describes
* the memory locations used by functions.
* Source file names - a list of the files used to assemble the source file.
* Debug messages - [not supported by gpasm] this provides a list of messages
* that can control the simulator or emulator.
*/
#define COD_BLOCK_BITS 9 /* COD_BLOCK_SIZE = 2^COD_BLOCK_BITS */
/* number of bytes in one cod block */
#define COD_BLOCK_SIZE (1<<COD_BLOCK_BITS)
/*
* Here's a list of the offsets for the directory block. In each case the
* offset is the number of bytes from the beginning of the block. Note that
* it would be much more clever to alias a properly sized structure onto the
* block. However, without using compiler dependent flags, it's not possible
* to control how the data members of a structure are packed. Portability
* has its costs.
*/
#define COD_DIR_CODE 0 /* code block indices are at the start */
#define COD_DIR_SOURCE 257 /* source file name */
#define COD_DIR_DATE 321 /* date .cod file was created */
#define COD_DIR_TIME 328 /* time .cod file was created */
#define COD_DIR_VERSION 331 /* Compiler version */
#define COD_DIR_COMPILER 351 /* Compiler name */
#define COD_DIR_NOTICE 363 /* Compiler copyright */
#define COD_DIR_SYMTAB 426 /* Start block of short symbol table */
#define COD_DIR_NAMTAB 430 /* Start block of file name table */
#define COD_DIR_LSTTAB 434 /* Start block of list file cross reference */
#define COD_DIR_ADDRSIZE 438 /* # of bytes for an address */
#define COD_DIR_HIGHADDR 439 /* High word of address for 64K Code block */
#define COD_DIR_NEXTDIR 441 /* Next directory block */
#define COD_DIR_MEMMAP 443 /* Start block of memory map */
#define COD_DIR_LOCALVAR 447 /* Start block of local variables */
#define COD_DIR_CODTYPE 451 /* Type of .cod file */
#define COD_DIR_PROCESSOR 454 /* Target processor */
#define COD_DIR_LSYMTAB 462 /* Start block of long symbol table */
#define COD_DIR_MESSTAB 466 /* Start block of debug message area */
/*
* Here's a list of sizes of various objects in a .cod file.
*/
#define COD_FILE_SIZE 64 /* Length of filename strings */
#define COD_MAX_LINE_SYM 84 /* Number of source lines per cod block */
#define COD_LINE_SYM_SIZE 6 /* Line symbol structure size */
enum cod_block_types {
cb_nobody,
cb_dir,
cb_file,
cb_list,
cb_ssymbols,
cb_lsymbols,
cb_code
};
#define COD_LS_SFILE 0 /* offset of sfile in LineSymbol struct */
#define COD_LS_SMOD 1 /* " smod " */
#define COD_LS_SLINE 2 /* " sline " */
#define COD_LS_SLOC 4 /* " sloc " */
#define COD_LS_SIZE 6 /* size of LineSymbol struct */
#define COD_CODE_IMAGE_BLOCKS 128 /* Max # of blocks for the opcodes */
typedef struct block_struct {
char *block;
int block_number;
} Block;
typedef struct dir_block_info {
Block dir;
Block cod_image_blocks[COD_CODE_IMAGE_BLOCKS];
struct dir_block_info *next_dir_block_info;
} DirBlockInfo;
/*
* Symbol types
*/
#define COD_ST_C_SHORT 2
#define COD_ST_ADDRESS 46
#define COD_ST_CONSTANT 47
class PicCodProgramFileType : public ProgramFileType {
private:
// PicHexProgramFileType member functions
void display_symbol_file_error(int err);
FILE * open_a_file(char **filename);
int cod_open_lst(const char *filename);
void read_directory(void);
int check_for_gputils(char *block);
void read_hex_from_cod( Processor *cpu );
void read_line_numbers_from_cod(Processor *cpu);
void read_message_area(Processor *cpu);
void delete_directory(void);
int read_src_files_from_cod(Processor *cpu);
int get_string(char *dest, char *src, size_t len);
void read_block(char * block, int block_number);
void read_symbols( Processor *cpu );
void read_hll_line_numbers_from_asm(Processor *cpu);
FILE *codefile;
char *temp_block;
char *lstfilename;
DirBlockInfo main_dir;
// Define a flag that tells whether or not we should care about the
// case of text strings in the .cod file.
int ignore_case_in_cod;
int gputils_recent;
public:
PicCodProgramFileType();
// ProgramFileType overrides
virtual int LoadProgramFile(Processor **pProcessor, const char *pFilename,
FILE *pFile, const char *pProcessorName);
};
#endif
syntax highlighted by Code2HTML, v. 0.9.1