diff --git a/src/mkit/as/code.c b/src/mkit/as/code.c index 2bdf1056..afa9c4cd 100644 --- a/src/mkit/as/code.c +++ b/src/mkit/as/code.c @@ -768,8 +768,8 @@ getoperand(int *ip, int flag, int last_char) if (mode == (ABS | ABS_X | ABS_Y | ZP | ZP_X | ZP_Y)) { /* was there an undefined or undefined-this-pass symbol? */ if (undef || notyetdef || - ((value & 0x007FFF00) != machine->ram_base)) { -// ((value & 0x007FFF00) && ((value & 0x007FFF00) != machine->ram_base))) { + ((value & 0x3FFFFF00) != machine->ram_base)) { +// ((value & 0x3FFFFF00) && ((value & 0x3FFFFF00) != machine->ram_base))) { /* use ABS addressing, if available */ if (flag & ABS) mode &= ~ZP; @@ -896,7 +896,7 @@ getoperand(int *ip, int flag, int last_char) value++; } /* check address validity */ - if ((value & 0x007FFF00) && ((value & 0x007FFF00) != machine->ram_base)) + if ((value & 0x3FFFFF00) && ((value & 0x3FFFFF00) != machine->ram_base)) error("Incorrect zero page address!"); } @@ -911,7 +911,7 @@ getoperand(int *ip, int flag, int last_char) error("Instruction extension not supported in immediate mode!"); else { /* check value validity */ - if (((value & 0x007FFF00) > 0xFF) && ((value & 0x007FFF00) < 0x007FFF00)) + if (((value & 0x3FFFFF00) > 0xFF) && ((value & 0x3FFFFF00) < 0x3FFFFF00)) error("Incorrect immediate value!"); } } diff --git a/src/mkit/as/command.c b/src/mkit/as/command.c index 12199c5e..e82a3e45 100644 --- a/src/mkit/as/command.c +++ b/src/mkit/as/command.c @@ -315,7 +315,7 @@ do_db(int *ip) } /* check for overflow */ - if (((value & 0x007FFFFF) > 0xFF) && ((value & 0x007FFFFF) < 0x007FFF80)) { + if (((value & 0x3FFFFFFF) > 0xFF) && ((value & 0x3FFFFFFF) < 0x3FFFFF80)) { error("Overflow error!"); return; } @@ -399,7 +399,7 @@ do_dw(int *ip) } /* check for overflow */ - if (((value & 0x007FFFFF) > 0xFFFF) && ((value & 0x007FFFFF) < 0x007F8000)) { + if (((value & 0x3FFFFFFF) > 0xFFFF) && ((value & 0x3FFFFFFF) < 0x3FFF8000)) { error("Overflow error!"); return; } @@ -482,7 +482,7 @@ do_dwl(int *ip) } /* check for overflow */ - if (((value & 0x007FFFFF) > 0xFFFF) && ((value & 0x007FFFFF) < 0x007F8000)) { + if (((value & 0x3FFFFFFF) > 0xFFFF) && ((value & 0x3FFFFFFF) < 0x3FFF8000)) { error("Overflow error!"); return; } @@ -565,7 +565,7 @@ do_dwh(int *ip) } /* check for overflow */ - if (((value & 0x007FFFFF) > 0xFFFF) && ((value & 0x007FFFFF) < 0x007F8000)) { + if (((value & 0x3FFFFFFF) > 0xFFFF) && ((value & 0x3FFFFFFF) < 0x3FFF8000)) { error("Overflow error!"); return; } @@ -799,7 +799,7 @@ do_org(int *ip) switch (section) { case S_ZP: /* zero page section */ - if ((value & 0x007FFF00) && ((value & 0x007FFF00) != machine->ram_base)) { + if ((value & 0x3FFFFF00) && ((value & 0x3FFFFF00) != machine->ram_base)) { error("Invalid address!"); return; } @@ -807,7 +807,7 @@ do_org(int *ip) case S_BSS: /* ram section */ - if (((value & 0x007FFFFF) < machine->ram_base) || ((value & 0x007FFFFF) >= (machine->ram_base + machine->ram_limit))) { + if (((value & 0x3FFFFFFF) < machine->ram_base) || ((value & 0x3FFFFFFF) >= (machine->ram_base + machine->ram_limit))) { error("Invalid address!"); return; } @@ -1034,13 +1034,7 @@ do_incbin(int *ip) fseek(fp, 0, SEEK_SET); /* check if it will fit in the rom */ - if (bank >= RESERVED_BANK) { - if ((loccnt + size) > 0x2000) { - fclose(fp); - fatal_error("PROC overflow!"); - return; - } - } else { + if ((section_flags[section] & S_IN_ROM) && (bank < RESERVED_BANK)) { /* check if it will fit in the rom */ if (((bank << 13) + loccnt + size) > rom_limit) { fclose(fp); @@ -1072,6 +1066,12 @@ do_incbin(int *ip) /* output line */ println(); } + } else { + if ((loccnt + size) > section_limit[section]) { + fclose(fp); + fatal_error("Too large to fit in the current section!"); + return; + } } /* close file */ @@ -1093,7 +1093,7 @@ do_incbin(int *ip) } /* update rom size */ - if (bank < RESERVED_BANK) { + if ((section_flags[section] & S_IN_ROM) && (bank < RESERVED_BANK)) { if (bank > max_bank) { if (loccnt) max_bank = bank; @@ -1581,7 +1581,7 @@ do_ds(int *ip) } /* update rom size */ - if (bank < RESERVED_BANK) { + if ((section_flags[section] & S_IN_ROM) && (bank < RESERVED_BANK)) { if (bank > max_bank) { if (loccnt) max_bank = bank; diff --git a/src/mkit/as/defs.h b/src/mkit/as/defs.h index fd82f418..853916a0 100644 --- a/src/mkit/as/defs.h +++ b/src/mkit/as/defs.h @@ -21,11 +21,20 @@ #define MACHINE_NES 1 #define MACHINE_FUJI 2 +/* maximum user rom size */ +#define ROM_BANKS 1024 + /* reserved bank index */ -#define RESERVED_BANK 0xF0 -#define PROC_BANK 0xF1 -#define GROUP_BANK 0xF2 -#define STRIPPED_BANK 0xF3 +#define RESERVED_BANK (ROM_BANKS + 0) +#define PROC_BANK (ROM_BANKS + 1) +#define GROUP_BANK (ROM_BANKS + 2) +#define STRIPPED_BANK (ROM_BANKS + 3) + +/* number of reserved banks used beyond ROM_BANKS */ +#define RESERVED_BANKS 4 + +/* total number of banks to allocate for workspace */ +#define MAX_BANKS (ROM_BANKS + RESERVED_BANKS) /* tile format for encoder */ #define CHUNKY_TILE 1 @@ -50,8 +59,12 @@ #define S_BSS 1 #define S_CODE 2 #define S_DATA 3 +#define MAX_S 4 /* selectable section types */ #define S_PROC 4 /* trampolines for .proc */ +/* section flags */ +#define S_IN_ROM 1 + /* assembler options */ #define OPT_LIST 0 #define OPT_MACRO 1 @@ -178,6 +191,9 @@ #define BRANCH_PASS 1 #define LAST_PASS 2 +/* size of various hashing tables */ +#define HASH_COUNT 256 + /* structs */ typedef struct t_opcode { struct t_opcode *next; @@ -289,6 +305,6 @@ typedef struct t_machine { int (*pack_16x16_tile)(unsigned char *, void *, int, int); int (*pack_16x16_sprite)(unsigned char *, void *, int, int); void (*write_header)(FILE *, int); -} MACHINE; +} t_machine; #endif // DEFS_H diff --git a/src/mkit/as/expr.c b/src/mkit/as/expr.c index 790ca490..2a6a9361 100644 --- a/src/mkit/as/expr.c +++ b/src/mkit/as/expr.c @@ -591,10 +591,10 @@ push_val(int type) pc_symbol.tag = tag_value; pc_symbol.page = page; - if (bank >= RESERVED_BANK) - pc_symbol.bank = bank; - else + if ((section_flags[section] & S_IN_ROM) && (bank < RESERVED_BANK)) pc_symbol.bank = bank + bank_base; + else + pc_symbol.bank = bank; if (pc_symbol.value >= 0x2000) { pc_symbol.bank = (pc_symbol.bank + 1); @@ -1009,14 +1009,15 @@ do_op(void) if (!check_func_args("BANK")) return (0); if (pass == LAST_PASS) { - if (expr_lablptr->bank == RESERVED_BANK) { - error("No BANK index for this symbol!"); + if (expr_lablptr->bank >= RESERVED_BANK) { + if (expr_lablptr->bank == RESERVED_BANK) + error("No BANK index for this symbol!"); val[0] = 0; break; } } - /* complicated math to deal with BANK(label+value) */ - val[0] = (expr_lablptr->bank + (val[0] / 8192) - (expr_lablptr->value / 8192)); + /* complicated math to deal with BANK(label+value), but keep it 8-bit */ + val[0] = 0xFF & (expr_lablptr->bank + (val[0] / 8192) - (expr_lablptr->value / 8192)); break; /* PAGE */ diff --git a/src/mkit/as/externs.h b/src/mkit/as/externs.h index 44461b09..0cb69280 100644 --- a/src/mkit/as/externs.h +++ b/src/mkit/as/externs.h @@ -1,45 +1,48 @@ -extern unsigned char rom[128][8192]; -extern unsigned char map[128][8192]; -extern char bank_name[128][64]; -extern int bank_loccnt[4][256]; -extern int bank_page[4][256]; -extern int bank_maxloc[256]; /* record max location in bank */ -extern int discontiguous; /* NZ signals a warp in loccnt */ -extern int max_zp; /* higher used address in zero page */ -extern int max_bss; /* higher used address in ram */ -extern int max_bank; /* last bank used */ -extern int data_loccnt; /* data location counter */ -extern int data_size; /* size of binary output (in bytes) */ -extern int data_level; /* data output level, must be <= listlevel to be outputed */ -extern int loccnt; /* location counter */ -extern int tag_value; /* current tag value */ -extern int bank; /* current bank */ -extern int bank_base; /* bank base index */ -extern int bank_limit; /* bank limit */ -extern int rom_limit; /* rom max. size in bytes */ -extern int page; /* page */ -extern int rsbase; /* .rs counter */ -extern int rsbank; /* .rs counter */ -extern int section; /* current section: S_ZP, S_BSS, S_CODE or S_DATA */ -extern int section_bank[4]; /* current bank for each section */ -extern int in_if; /* true if in a '.if' statement */ -extern int if_expr; /* set when parsing an .if expression */ -extern int if_level; /* level of nested .if's */ -extern int if_line[256]; /* .if line number */ -extern int skip_lines; /* when true skip lines */ -extern int continued_line; /* set when a line is the continuation of another line */ -extern int pcx_w, pcx_h; /* PCX dimensions */ -extern int pcx_nb_colors; /* number of colors (16/256) in the PCX */ -extern int pcx_nb_args; /* number of argument */ -extern unsigned int pcx_arg[8]; /* PCX args array */ -extern unsigned char *pcx_buf; /* pointer to the PCX buffer */ -extern unsigned char pcx_pal[256][3]; /* palette */ -extern char *expr; /* expression string pointer */ -extern struct t_symbol *expr_toplabl; /* pointer to the innermost scope-label */ -extern struct t_symbol *expr_lablptr; /* pointer to the last-referenced label */ -extern int expr_lablcnt; /* number of label seen in an expression */ -extern int expr_valbank; /* last-defined bank# in an expression */ -extern int complex_expr; /* NZ if an expression contains operators */ +extern unsigned char rom[MAX_BANKS][8192]; +extern unsigned char map[MAX_BANKS][8192]; +extern char bank_name[MAX_BANKS][64]; +extern int bank_loccnt[MAX_S][MAX_BANKS]; +extern int bank_page[MAX_S][MAX_BANKS]; +extern int bank_maxloc[MAX_BANKS]; /* record max location in bank */ + +extern int discontiguous; /* NZ signals a warp in loccnt */ +extern int max_zp; /* higher used address in zero page */ +extern int max_bss; /* higher used address in ram */ +extern int max_bank; /* last bank used */ +extern int data_loccnt; /* data location counter */ +extern int data_size; /* size of binary output (in bytes) */ +extern int data_level; /* data output level, must be <= listlevel to be outputed */ +extern int loccnt; /* location counter */ +extern int tag_value; /* current tag value */ +extern int bank; /* current bank */ +extern int bank_base; /* bank base index */ +extern int bank_limit; /* bank limit */ +extern int rom_limit; /* rom max. size in bytes */ +extern int page; /* page */ +extern int rsbase; /* .rs counter */ +extern int rsbank; /* .rs counter */ +extern int section; /* current section: S_ZP, S_BSS, S_CODE or S_DATA */ +extern int section_bank[MAX_S]; /* current bank for each section */ +extern int section_flags[MAX_S]; /* current flags for each section */ +extern int section_limit[MAX_S]; /* current loccnt limit for each section */ +extern int in_if; /* true if in a '.if' statement */ +extern int if_expr; /* set when parsing an .if expression */ +extern int if_level; /* level of nested .if's */ +extern int if_line[256]; /* .if line number */ +extern int skip_lines; /* when true skip lines */ +extern int continued_line; /* set when a line is the continuation of another line */ +extern int pcx_w, pcx_h; /* PCX dimensions */ +extern int pcx_nb_colors; /* number of colors (16/256) in the PCX */ +extern int pcx_nb_args; /* number of argument */ +extern unsigned int pcx_arg[8]; /* PCX args array */ +extern unsigned char *pcx_buf; /* pointer to the PCX buffer */ +extern unsigned char pcx_pal[256][3]; /* palette */ +extern char *expr; /* expression string pointer */ +extern struct t_symbol *expr_toplabl; /* pointer to the innermost scope-label */ +extern struct t_symbol *expr_lablptr; /* pointer to the last-referenced label */ +extern int expr_lablcnt; /* number of label seen in an expression */ +extern int expr_valbank; /* last-defined bank# in an expression */ +extern int complex_expr; /* NZ if an expression contains operators */ extern int mopt; extern int in_macro; extern int expand_macro; @@ -47,67 +50,69 @@ extern char marg[8][10][256]; extern int midx; extern int mcounter, mcntmax; extern int mcntstack[8]; -extern struct t_line *mstack[8]; -extern struct t_line *mlptr; -extern struct t_macro *macro_tbl[256]; -extern struct t_macro *mptr; -extern struct t_func *func_tbl[256]; -extern struct t_func *func_ptr; -extern struct t_proc *proc_ptr; +extern t_line *mstack[8]; +extern t_line *mlptr; +extern t_macro *macro_tbl[HASH_COUNT]; +extern t_macro *mptr; +extern t_func *func_tbl[HASH_COUNT]; +extern t_func *func_ptr; +extern t_proc *proc_ptr; extern int proc_nb; extern char func_arg[8][10][80]; extern int func_idx; extern int infile_error; extern int infile_num; -extern FILE *out_fp; /* file pointers, output */ -extern FILE *in_fp; /* input */ -extern FILE *lst_fp; /* listing */ -extern struct t_input_info input_file[8]; -extern struct t_machine *machine; -extern struct t_machine nes; -extern struct t_machine pce; -extern struct t_machine fuji; -extern struct t_opcode *inst_tbl[256]; /* instructions hash table */ -extern struct t_symbol *hash_tbl[256]; /* label hash table */ -extern struct t_symbol *lablptr; /* label pointer into symbol table */ -extern struct t_symbol *glablptr; /* pointer to the latest defined global symbol */ -extern struct t_symbol *scopeptr; /* pointer to the latest defined scope label */ -extern struct t_symbol *lastlabl; /* last label we have seen */ -extern struct t_symbol *bank_glabl[4][256]; /* latest global label in each bank */ -extern struct t_branch *branchlst; /* first branch instruction assembled */ -extern struct t_branch *branchptr; /* last branch instruction assembled */ -extern int xvertlong; /* count of branches fixed in pass */ -extern char need_another_pass; /* NZ if another pass if required */ -extern char hex[]; /* hexadecimal character buffer */ -extern int stop_pass; /* stop the program; set by fatal_error() */ -extern int errcnt; /* error counter */ -extern void (*opproc)(int *); /* instruction gen proc */ -extern int opflg; /* instruction flags */ -extern int opval; /* instruction value */ -extern int optype; /* instruction type */ -extern char opext; /* instruction extension (.l or .h) */ -extern int pass; /* pass counter */ -extern char prlnbuf[]; /* input line buffer */ -extern char tmplnbuf[]; /* temporary line buffer */ -extern int slnum; /* source line number counter */ -extern char symbol[]; /* temporary symbol storage */ -extern int undef; /* undefined symbol in expression flag */ -extern int notyetdef; /* undefined-in-current-pass symbol in expr */ -extern unsigned int value; /* operand field value */ -extern int newproc_opt; /* use "new" style of procedure trampolines */ -extern int strip_opt; /* strip unused procedures? */ -extern int kickc_opt; /* NZ if -kc flag on command line */ -extern int mlist_opt; /* macro listing main flag */ -extern int xlist; /* listing file main flag */ -extern int list_level; /* output level */ -extern int asm_opt[9]; /* assembler option state */ +extern FILE *out_fp; /* file pointers, output */ +extern FILE *in_fp; /* input */ +extern FILE *lst_fp; /* listing */ +extern t_input_info input_file[8]; + +extern t_machine *machine; +extern t_machine nes; +extern t_machine pce; +extern t_machine fuji; +extern t_opcode *inst_tbl[HASH_COUNT]; /* instructions hash table */ +extern t_symbol *hash_tbl[HASH_COUNT]; /* label hash table */ +extern t_symbol *lablptr; /* label pointer into symbol table */ +extern t_symbol *glablptr; /* pointer to the latest defined global symbol */ +extern t_symbol *scopeptr; /* pointer to the latest defined scope label */ +extern t_symbol *lastlabl; /* last label we have seen */ +extern t_symbol *bank_glabl[MAX_S][MAX_BANKS]; /* latest global label in each bank */ +extern t_branch *branchlst; /* first branch instruction assembled */ +extern t_branch *branchptr; /* last branch instruction assembled */ + +extern int xvertlong; /* count of branches fixed in pass */ +extern char need_another_pass; /* NZ if another pass if required */ +extern char hex[]; /* hexadecimal character buffer */ +extern int stop_pass; /* stop the program; set by fatal_error() */ +extern int errcnt; /* error counter */ +extern void (*opproc)(int *); /* instruction gen proc */ +extern int opflg; /* instruction flags */ +extern int opval; /* instruction value */ +extern int optype; /* instruction type */ +extern char opext; /* instruction extension (.l or .h) */ +extern int pass; /* pass counter */ +extern char prlnbuf[]; /* input line buffer */ +extern char tmplnbuf[]; /* temporary line buffer */ +extern int slnum; /* source line number counter */ +extern char symbol[]; /* temporary symbol storage */ +extern int undef; /* undefined symbol in expression flag */ +extern int notyetdef; /* undefined-in-current-pass symbol in expr */ +extern unsigned int value; /* operand field value */ +extern int newproc_opt; /* use "new" style of procedure trampolines */ +extern int strip_opt; /* strip unused procedures? */ +extern int kickc_opt; /* NZ if -kc flag on command line */ +extern int mlist_opt; /* macro listing main flag */ +extern int xlist; /* listing file main flag */ +extern int list_level; /* output level */ +extern int asm_opt[9]; /* assembler option state */ extern int opvaltab[6][16]; -extern int call_bank; /* bank for .proc trampolines */ -extern int kickc_mode; /* NZ if currently in KickC mode */ -extern int hucc_mode; /* NZ if assembling HuCC code */ -extern int kickc_final; /* auto-include "kickc-final.asm" */ -extern int hucc_final; /* auto-include "hucc-final.asm" */ -extern int in_final; /* set when in xxxx-final.asm include */ -extern int preproc_inblock; /* C-style comment: within block comment */ -extern int preproc_sfield; /* C-style comment: SFIELD as a variable */ -extern int preproc_modidx; /* C-style comment: offset to modified char */ +extern int call_bank; /* bank for .proc trampolines */ +extern int kickc_mode; /* NZ if currently in KickC mode */ +extern int hucc_mode; /* NZ if assembling HuCC code */ +extern int kickc_final; /* auto-include "kickc-final.asm" */ +extern int hucc_final; /* auto-include "hucc-final.asm" */ +extern int in_final; /* set when in xxxx-final.asm include */ +extern int preproc_inblock; /* C-style comment: within block comment */ +extern int preproc_sfield; /* C-style comment: SFIELD as a variable */ +extern int preproc_modidx; /* C-style comment: offset to modified char */ diff --git a/src/mkit/as/func.c b/src/mkit/as/func.c index 62eb5e83..b9631514 100644 --- a/src/mkit/as/func.c +++ b/src/mkit/as/func.c @@ -6,8 +6,8 @@ #include "externs.h" #include "protos.h" -struct t_func *func_tbl[256]; -struct t_func *func_ptr; +t_func *func_tbl[HASH_COUNT]; +t_func *func_ptr; char func_line[128]; char func_arg[8][10][80]; int func_idx; diff --git a/src/mkit/as/input.c b/src/mkit/as/input.c index 8399087d..eae0b497 100644 --- a/src/mkit/as/input.c +++ b/src/mkit/as/input.c @@ -13,7 +13,7 @@ int infile_error; int infile_num; -struct t_input_info input_file[8]; +t_input_info input_file[8]; static char *incpath = NULL; static int *str_offset = NULL; static int remaining = 0; diff --git a/src/mkit/as/macro.c b/src/mkit/as/macro.c index ad593d05..fc49b7aa 100644 --- a/src/mkit/as/macro.c +++ b/src/mkit/as/macro.c @@ -13,10 +13,10 @@ char marg[8][10][256]; int midx; int mcounter, mcntmax; int mcntstack[8]; -struct t_line *mstack[8]; -struct t_line *mlptr; -struct t_macro *macro_tbl[256]; -struct t_macro *mptr; +t_line *mstack[8]; +t_line *mlptr; +t_macro *macro_tbl[HASH_COUNT]; +t_macro *mptr; /* .macro pseudo */ diff --git a/src/mkit/as/main.c b/src/mkit/as/main.c index fad3466a..d537a46a 100644 --- a/src/mkit/as/main.c +++ b/src/mkit/as/main.c @@ -78,6 +78,21 @@ int zero_need; /* counter for trailing empty sectors on CDROM */ int rom_used; int rom_free; +/* current flags for each section */ +int section_flags[MAX_S] = { + 0, /* S_ZP */ + 0, /* S_BSS */ + S_IN_ROM, /* S_CODE */ + S_IN_ROM /* S_DATA */ +}; + +/* current loccnt limit for each section */ +int section_limit[MAX_S] = { + 0x2000, /* S_ZP */ + 0x2000, /* S_BSS */ + 0x2000, /* S_CODE */ + 0x2000 /* S_DATA */ +}; /* ---- * atexit callback @@ -471,8 +486,8 @@ main(int argc, char **argv) } /* clear the ROM array */ - memset(rom, 0xFF, 8192 * 128); - memset(map, 0xFF, 8192 * 128); + memset(rom, 0xFF, MAX_BANKS * 8192); + memset(map, 0xFF, MAX_BANKS * 8192); /* are we creating a custom PCE CDROM IPL? */ if (ipl_opt) { @@ -482,7 +497,7 @@ main(int argc, char **argv) } /* clear symbol hash tables */ - for (i = 0; i < 256; i++) { + for (i = 0; i < HASH_COUNT; i++) { hash_tbl[i] = NULL; macro_tbl[i] = NULL; func_tbl[i] = NULL; @@ -576,8 +591,8 @@ main(int argc, char **argv) asm_opt[OPT_LBRANCH] = 0; /* reset bank arrays */ - for (i = 0; i < 4; i++) { - for (j = 0; j < 256; j++) { + for (i = 0; i < MAX_S; i++) { + for (j = 0; j < MAX_BANKS; j++) { bank_maxloc[j] = 0; bank_loccnt[i][j] = 0; bank_glabl[i][j] = NULL; @@ -646,6 +661,7 @@ main(int argc, char **argv) bank = (bank + 1); if (bank > max_bank) { max_bank = bank; + printf("Increased max_bank to (0x%02X).\n", max_bank); } if (section != S_DATA || asm_opt[OPT_DATAPAGE] == 0) page = (page + 1) & 7; @@ -655,7 +671,7 @@ main(int argc, char **argv) } if (asm_opt[OPT_WARNING] && pass == LAST_PASS) { - printf(" (Warning. Opcode crossing page boundary $%04X, bank $%02X)\n", (page * 0x2000), bank); + printf(" (Warning. Opcode crossing page boundary $%04X, bank $%04X)\n", (page * 0x2000), bank); } } while (old_bank != bank) { @@ -668,7 +684,7 @@ main(int argc, char **argv) /* sanity check */ if (max_bank > bank_limit) { - snprintf(cmd, sizeof(cmd), "Assembler bug ... max_bank (0x%02X) > bank_limit (0x%02X)!\n", max_bank, bank_limit); + snprintf(cmd, sizeof(cmd), "Assembler bug ... max_bank (0x%04X) > bank_limit (0x%04X)!\n", max_bank, bank_limit); fatal_error(cmd); } diff --git a/src/mkit/as/output.c b/src/mkit/as/output.c index 49bc312a..c9768716 100644 --- a/src/mkit/as/output.c +++ b/src/mkit/as/output.c @@ -167,7 +167,7 @@ putbyte(int offset, int data) { int addr; - if (bank >= RESERVED_BANK) + if (((section_flags[section] & S_IN_ROM) == 0) || (bank >= RESERVED_BANK)) return; addr = offset + 1 + (bank << 13); @@ -208,7 +208,7 @@ putword(int offset, int data) { int addr; - if (bank >= RESERVED_BANK) + if (((section_flags[section] & S_IN_ROM) == 0) || (bank >= RESERVED_BANK)) return; addr = offset + 2 + (bank << 13); @@ -251,7 +251,7 @@ putdword(int offset, int data) { int addr; - if (bank >= RESERVED_BANK) + if (((section_flags[section] & S_IN_ROM) == 0) || (bank >= RESERVED_BANK)) return; addr = offset + 4 + (bank << 13); @@ -304,15 +304,7 @@ putbuffer(void *data, int size) return; /* check if the buffer will fit in the rom */ - if (bank >= RESERVED_BANK) { - addr = loccnt + size; - - if (addr > 0x2000) { - fatal_error("PROC overflow!"); - return; - } - } - else { + if ((section_flags[section] & S_IN_ROM) && (bank < RESERVED_BANK)) { addr = (bank << 13) + loccnt; if ((addr + size) > rom_limit) { @@ -343,6 +335,11 @@ putbuffer(void *data, int size) } } } + } else { + if ((loccnt + size) > section_limit[section]) { + fatal_error("Too large to fit in the current section!"); + return; + } } /* update the location counter */ @@ -361,7 +358,7 @@ putbuffer(void *data, int size) } /* update rom size */ - if (bank < RESERVED_BANK) { + if ((section_flags[section] & S_IN_ROM) && (bank < RESERVED_BANK)) { if (bank > max_bank) { if (loccnt) max_bank = bank; diff --git a/src/mkit/as/proc.c b/src/mkit/as/proc.c index 4cb305f3..0e917d48 100644 --- a/src/mkit/as/proc.c +++ b/src/mkit/as/proc.c @@ -6,10 +6,10 @@ #include "externs.h" #include "protos.h" -struct t_proc *proc_tbl[256]; -struct t_proc *proc_ptr; -struct t_proc *proc_first; -struct t_proc *proc_last; +t_proc *proc_tbl[HASH_COUNT]; +t_proc *proc_ptr; +t_proc *proc_first; +t_proc *proc_last; int proc_nb; int call_1st; int call_ptr; @@ -594,7 +594,7 @@ proc_reloc(void) bank_free = NULL; /* remap proc symbols */ - for (i = 0; i < 256; i++) { + for (i = 0; i < HASH_COUNT; i++) { sym = hash_tbl[i]; while (sym) { @@ -607,7 +607,7 @@ proc_reloc(void) else sym->bank = proc_ptr->bank + bank_base; - sym->value = (sym->value & 0x007FFFFF); + sym->value = (sym->value & 0x3FFFFFFF); sym->value += (proc_ptr->org - proc_ptr->base); /* local symbols */ @@ -624,7 +624,7 @@ proc_reloc(void) else local->bank = proc_ptr->bank + bank_base; - local->value = (local->value & 0x007FFFFF); + local->value = (local->value & 0x3FFFFFFF); local->value += (proc_ptr->org - proc_ptr->base); } diff --git a/src/mkit/as/symbol.c b/src/mkit/as/symbol.c index 3cc7dccf..a76fdf85 100644 --- a/src/mkit/as/symbol.c +++ b/src/mkit/as/symbol.c @@ -309,10 +309,11 @@ labldef(int lval, int lbnk, int lsrc) lval = loccnt + (page << 13); - if (bank >= RESERVED_BANK) - lbnk = bank; - else + + if ((section_flags[section] & S_IN_ROM) && (bank < RESERVED_BANK)) lbnk = bank_base + bank; + else + lbnk = bank; } else { /* is this a multi-label? */ if (lablptr->name[1] == '!') { @@ -497,7 +498,7 @@ lablremap(void) int i; /* browse the symbol table */ - for (i = 0; i < 256; i++) { + for (i = 0; i < HASH_COUNT; i++) { sym = hash_tbl[i]; while (sym) { /* remap the bank */ @@ -542,7 +543,7 @@ labldump(FILE *fp) fprintf(fp, "----\t----\t-----\n"); /* browse the symbol table */ - for (i = 0; i < 256; i++) { + for (i = 0; i < HASH_COUNT; i++) { for (sym = hash_tbl[i]; sym != NULL; sym = sym->next) { /* skip undefined symbols and stripped symbols */ if ((sym->type != DEFABS) || (sym->bank == STRIPPED_BANK) || (sym->name[1] == '!')) @@ -594,7 +595,7 @@ lablresetdefcnt(void) int i; /* browse the symbol table */ - for (i = 0; i < 256; i++) { + for (i = 0; i < HASH_COUNT; i++) { sym = hash_tbl[i]; while (sym) { sym->defcnt = 0; diff --git a/src/mkit/as/vars.h b/src/mkit/as/vars.h index 9f7dda74..374d25f2 100644 --- a/src/mkit/as/vars.h +++ b/src/mkit/as/vars.h @@ -1,95 +1,83 @@ -unsigned char rom[128][8192]; -unsigned char map[128][8192]; -char bank_name[128][64]; -int bank_loccnt[4][256]; -int bank_page[4][256]; -int bank_maxloc[256]; /* record max location in bank */ -int discontiguous; /* NZ signals a warp in loccnt */ -int max_zp; /* higher used address in zero page */ -int max_bss; /* higher used address in ram */ -int max_bank; /* last bank used */ -int data_loccnt; /* data location counter */ -int data_size; /* size of binary output (in bytes) */ -int data_level; /* data output level, must be <= listlevel to be outputed */ -int loccnt; /* location counter */ -int tag_value; /* current tag value */ -int bank; /* current bank */ -int bank_base; /* bank base index */ -int rom_limit; /* bank limit */ -int bank_limit; /* rom max. size in bytes */ -int page; /* page */ -int rsbase; /* .rs counter */ -int rsbank; /* .rs counter */ -int section; /* current section: S_ZP, S_BSS, S_CODE or S_DATA */ -int section_bank[4]; /* current bank for each section */ -int stop_pass; /* stop the program; set by fatal_error() */ -int errcnt; /* error counter */ -int kickc_mode; /* NZ if assembling KickC code */ -int hucc_mode; /* NZ if assembling HuCC code */ -int kickc_final; /* auto-include "kickc-final.asm" */ -int hucc_final; /* auto-include "hucc-final.asm" */ -int in_final; /* set when in xxxx-final.asm include */ -int preproc_inblock; /* C-style comment: within block comment */ -int preproc_sfield; /* C-style comment: SFIELD as a variable */ -int preproc_modidx; /* C-style comment: offset to modified char */ -struct t_machine *machine; -struct t_opcode *inst_tbl[256]; /* instructions hash table */ -struct t_symbol *hash_tbl[256]; /* label hash table */ -struct t_symbol *lablptr; /* label pointer into symbol table */ -struct t_symbol *glablptr; /* pointer to the latest defined global label */ -struct t_symbol *scopeptr; /* pointer to the latest defined scope label */ -struct t_symbol *lastlabl; /* last label we have seen */ -struct t_symbol *bank_glabl[4][256]; /* latest global symbol for each bank */ -struct t_branch *branchlst; /* first branch instruction assembled */ -struct t_branch *branchptr; /* last branch instruction assembled */ -int xvertlong; /* count of branches fixed in pass */ -char need_another_pass; /* NZ if another pass if required */ -char hex[5]; /* hexadecimal character buffer */ -void (*opproc)(int *); /* instruction gen proc */ -int opflg; /* instruction flags */ -int opval; /* instruction value */ -int optype; /* instruction type */ -char opext; /* instruction extension (.l or .h) */ -int pass; /* pass counter */ -char prlnbuf[LAST_CH_POS + 4]; /* input line buffer */ -char tmplnbuf[LAST_CH_POS + 4]; /* temporary line buffer */ -int slnum; /* source line number counter */ -char symbol[SBOLSZ + 1]; /* temporary symbol storage */ -int undef; /* undefined symbol in expression flg */ -int notyetdef; /* undefined-in-current-pass symbol in expr */ -unsigned int value; /* operand field value */ +unsigned char rom[MAX_BANKS][8192]; +unsigned char map[MAX_BANKS][8192]; +char bank_name[MAX_BANKS][64]; +int bank_loccnt[MAX_S][MAX_BANKS]; +int bank_page[MAX_S][MAX_BANKS]; +int bank_maxloc[MAX_BANKS]; /* record max location in bank */ + +int discontiguous; /* NZ signals a warp in loccnt */ +int max_zp; /* higher used address in zero page */ +int max_bss; /* higher used address in ram */ +int max_bank; /* last bank used */ +int data_loccnt; /* data location counter */ +int data_size; /* size of binary output (in bytes) */ +int data_level; /* data output level, must be <= listlevel to be outputed */ +int loccnt; /* location counter */ +int tag_value; /* current tag value */ +int bank; /* current bank */ +int bank_base; /* bank base index */ +int rom_limit; /* bank limit */ +int bank_limit; /* rom max. size in bytes */ +int page; /* page */ +int rsbase; /* .rs counter */ +int rsbank; /* .rs counter */ +int section; /* current section: S_ZP, S_BSS, S_CODE or S_DATA */ +int section_bank[MAX_S]; /* current bank for each section */ +int stop_pass; /* stop the program; set by fatal_error() */ +int errcnt; /* error counter */ +int kickc_mode; /* NZ if assembling KickC code */ +int hucc_mode; /* NZ if assembling HuCC code */ +int kickc_final; /* auto-include "kickc-final.asm" */ +int hucc_final; /* auto-include "hucc-final.asm" */ +int in_final; /* set when in xxxx-final.asm include */ +int preproc_inblock; /* C-style comment: within block comment */ +int preproc_sfield; /* C-style comment: SFIELD as a variable */ +int preproc_modidx; /* C-style comment: offset to modified char */ + +t_machine *machine; +t_opcode *inst_tbl[HASH_COUNT]; /* instructions hash table */ +t_symbol *hash_tbl[HASH_COUNT]; /* label hash table */ +t_symbol *lablptr; /* label pointer into symbol table */ +t_symbol *glablptr; /* pointer to the latest defined global label */ +t_symbol *scopeptr; /* pointer to the latest defined scope label */ +t_symbol *lastlabl; /* last label we have seen */ +t_symbol *bank_glabl[MAX_S][MAX_BANKS]; /* latest global symbol for each bank */ +t_branch *branchlst; /* first branch instruction assembled */ +t_branch *branchptr; /* last branch instruction assembled */ + +int xvertlong; /* count of branches fixed in pass */ +char need_another_pass; /* NZ if another pass if required */ +char hex[5]; /* hexadecimal character buffer */ +void (*opproc)(int *); /* instruction gen proc */ +int opflg; /* instruction flags */ +int opval; /* instruction value */ +int optype; /* instruction type */ +char opext; /* instruction extension (.l or .h) */ +int pass; /* pass counter */ +char prlnbuf[LAST_CH_POS + 4]; /* input line buffer */ +char tmplnbuf[LAST_CH_POS + 4]; /* temporary line buffer */ +int slnum; /* source line number counter */ +char symbol[SBOLSZ + 1]; /* temporary symbol storage */ +int undef; /* undefined symbol in expression flg */ +int notyetdef; /* undefined-in-current-pass symbol in expr */ +unsigned int value; /* operand field value */ + int opvaltab[6][16] = { - {0x08, 0x08, 0x04, 0x14, 0x14, 0x11, 0x00, 0x10, // ADC AND CMP EOR LDA ORA SBC STA - 0x0C, 0x1C, 0x18, 0x2C, 0x3C, 0x00, 0x00, 0x00}, + {0x08, 0x08, 0x04, 0x14, 0x14, 0x11, 0x00, 0x10, // ADC AND CMP EOR LDA ORA SBC STA + 0x0C, 0x1C, 0x18, 0x2C, 0x3C, 0x00, 0x00, 0x00}, - {0x00, 0x00, 0x04, 0x14, 0x14, 0x00, 0x00, 0x10, // CPX CPY LDX LDY LAX ST0 ST1 ST2 - 0x0C, 0x1C, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x04, 0x14, 0x14, 0x00, 0x00, 0x10, // CPX CPY LDX LDY LAX ST0 ST1 ST2 + 0x0C, 0x1C, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00}, - {0x00, 0x89, 0x24, 0x34, 0x00, 0x00, 0x00, 0x00, // BIT - 0x2C, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, + {0x00, 0x89, 0x24, 0x34, 0x00, 0x00, 0x00, 0x00, // BIT + 0x2C, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, - {0x3A, 0x00, 0xC6, 0xD6, 0x00, 0x00, 0x00, 0x00, // DEC - 0xCE, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, + {0x3A, 0x00, 0xC6, 0xD6, 0x00, 0x00, 0x00, 0x00, // DEC + 0xCE, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, - {0x1A, 0x00, 0xE6, 0xF6, 0x00, 0x00, 0x00, 0x00, // INC - 0xEE, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, + {0x1A, 0x00, 0xE6, 0xF6, 0x00, 0x00, 0x00, 0x00, // INC + 0xEE, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, - {0x00, 0x00, 0x64, 0x74, 0x00, 0x00, 0x00, 0x00, // STZ - 0x9C, 0x9E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} + {0x00, 0x00, 0x64, 0x74, 0x00, 0x00, 0x00, 0x00, // STZ + 0x9C, 0x9E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} }; - -/* -define ACC 0x0000001 0 -define IMM 0x0000002 1 -define ZP 0x0000004 2 -define ZP_X 0x0000008 3 -define ZP_Y 0x0000010 4 -define ZP_IND 0x0000020 5 -define ZP_IND_X 0x0000040 6 -define ZP_IND_Y 0x0000080 7 -define ABS 0x0000100 8 -define ABS_X 0x0000200 9 -define ABS_Y 0x0000400 A -define ABS_IND 0x0000800 B -define ABS_IND_X 0x0001000 C -*/