diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 2c769609..837d8ff3 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -24,7 +24,7 @@ jobs: runs-on: ${{ matrix.os }} steps: - name: Check out code from the repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: fetch-depth: 0 - name: Build on Linux @@ -45,7 +45,7 @@ jobs: make echo Build Complete - name: Archive toolchain - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: toolchain-${{ matrix.os }} path: | @@ -63,9 +63,9 @@ jobs: needs: build steps: - name: Check out code from the repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Get previoulsy built artifacts - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: toolchain-${{ matrix.os }} - name: Restore Execute Flags @@ -108,9 +108,9 @@ jobs: needs: build steps: - name: Check out code from the repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Get previously built artifacts - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: toolchain-${{ matrix.os }} - name: Package ${{ matrix.os }} @@ -130,7 +130,7 @@ jobs: make package echo Package Complete - name: Archive package - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: package-${{ matrix.os }} path: | @@ -143,17 +143,17 @@ jobs: if: github.ref == 'refs/heads/master' && github.event_name != 'pull_request' steps: - name: Check out code from the repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Get previoulsy built artifacts win64 - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: package-windows-2022 - name: Get previously built artifacts macos - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: package-macos-12 - name: Get previously built artifacts linux - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: package-ubuntu-20.04 # https://github.com/pyTooling/Actions/tree/main/releaser diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 1b359132..7434484b 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -39,11 +39,11 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@v2 + uses: github/codeql-action/init@v3 with: # debug: true languages: ${{ matrix.language }} @@ -58,7 +58,7 @@ jobs: # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). # If this step fails, then you should remove it and run the build manually (see below) - name: Autobuild - uses: github/codeql-action/autobuild@v2 + uses: github/codeql-action/autobuild@v3 # ℹī¸ Command-line programs to run using the OS shell. # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun @@ -71,4 +71,4 @@ jobs: # ./location_of_script_within_repo/buildscript.sh - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v2 + uses: github/codeql-action/analyze@v3 diff --git a/examples/asm/elmer/include/cdrom.asm b/examples/asm/elmer/include/cdrom.asm index 57225aa3..bf200477 100644 --- a/examples/asm/elmer/include/cdrom.asm +++ b/examples/asm/elmer/include/cdrom.asm @@ -1312,7 +1312,7 @@ cdr_ad_trans .proc ; Send SCSI command. -.send_command: ldx.l <_bx ; Set the ADPCM RAM desination address. +.send_command: ldx.l <_bx ; Set the ADPCM RAM destination address. ldy.h <_bx jsr adpcm_set_dst diff --git a/examples/asm/elmer/include/core-startup.asm b/examples/asm/elmer/include/core-startup.asm index db619c85..8b00a963 100644 --- a/examples/asm/elmer/include/core-startup.asm +++ b/examples/asm/elmer/include/core-startup.asm @@ -415,20 +415,20 @@ core_hw_reset: sei ; Disable interrupts. ; Read the already-assembled equates for the kernel code. ; - ; N.B. The area() changes are only here to test PCEAS! + ; N.B. The tag() changes are only here to test PCEAS! -!: .area -1 ; Tag the STAGE1 symbols. +!: .settag -1 ; Tag the STAGE1 symbols. include "core-stage1.s" - .area area(!-) ; Restore previous area. + .settag tagof(!-) ; Restore previous area. .if (core_kernel != core_ram1st) .fail Stage1 kernel has not been built with the same core_ram1st! .endif - .if (area(core_kernel) != -1) - .fail .AREA is not working correctly! + .if (tagof(*) != 0) + (tagof(core_kernel) != -1) + .fail .TAG is not working correctly! .endif .else USING_STAGE1 diff --git a/src/Make_src.inc b/src/Make_src.inc index de2dda42..53ecc536 100644 --- a/src/Make_src.inc +++ b/src/Make_src.inc @@ -14,6 +14,8 @@ CDEFS = CFLAGS = -Wall -g -O2 CFLAGS += -DGIT_VERSION="\"$(GIT_VERSION)\"" CFLAGS += -DGIT_DATE="\"$(GIT_DATE)\"" +CXXFLAGS += -DGIT_VERSION="\"$(GIT_VERSION)\"" +CXXFLAGS += -DGIT_DATE="\"$(GIT_DATE)\"" LDFLAGS = -g # @@ -29,3 +31,7 @@ EXESUFFIX = CP = cp RM = rm -f CC = cc +CXX = c++ +AWK = awk +LEX = lex +YACC = yacc diff --git a/src/Maketarg.inc b/src/Maketarg.inc index c14eb622..013ec774 100644 --- a/src/Maketarg.inc +++ b/src/Maketarg.inc @@ -13,4 +13,5 @@ endif %.o: %.c $(CC) $(CDEFS) $(CFLAGS) -c $< -o $@ - +%.o: %.cc + $(CXX) $(CDEFS) $(CXXFLAGS) -c $< -o $@ 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 82331adc..e82a3e45 100644 --- a/src/mkit/as/command.c +++ b/src/mkit/as/command.c @@ -165,7 +165,9 @@ do_nomlist(int *ip) /* ---- * do_db() * ---- - * .db pseudo + * .db pseudo (optype == 0) + * .text pseudo (optype == 1) + * .ascii pseudo (optype == 2) */ void @@ -313,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; } @@ -397,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; } @@ -480,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; } @@ -563,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; } @@ -690,7 +692,8 @@ do_dd(int *ip) /* ---- * do_equ() * ---- - * .equ pseudo + * .equ pseudo (optype == 0) + * .set pseudo (optype == 1) */ void @@ -720,7 +723,7 @@ do_equ(int *ip) if ((optype == 1) && (lablptr->type == DEFABS)) { lablptr->value = value; lablptr->bank = expr_valbank; - lablptr->area = area; + lablptr->tag = tag_value; } else if (undef != 0) { /* needed for KickC forward-references */ @@ -796,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; } @@ -804,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; } @@ -941,32 +944,32 @@ do_bank(int *ip) /* ---- - * do_area() + * do_settag() * ---- - * .area pseudo + * .tag pseudo */ void -do_area(int *ip) +do_settag(int *ip) { /* define label */ labldef(0, 0, LOCATION); - /* get area value */ + /* get tag value */ if (!evaluate(ip, 0, 0)) return; - /* check for undefined symbol - they are not allowed in .area */ + /* check for undefined symbol - they are not allowed in .tag */ if (undef != 0) { error("Undefined symbol in operand field!"); return; } - area = value; + tag_value = value; /* output on last pass */ if (pass == LAST_PASS) { - loadlc(area, 1); + loadlc(tag_value, 1); println(); } } @@ -1031,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); @@ -1069,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 */ @@ -1090,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; @@ -1578,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; @@ -1889,8 +1892,9 @@ do_align(int *ip) /* ---- * do_kickc() * ---- - * .pceas pseudo - * .kickc pseudo + * .pceas pseudo (optype == 0) + * .kickc pseudo (optype == 1) + * .hucc pseudo (optype == 2) */ void @@ -1903,17 +1907,24 @@ do_kickc(int *ip) if (!check_eol(ip)) return; - /* enable/disable KickC mode */ - kickc_mode = optype; + /* enable/disable KickC or HuCC mode */ + kickc_mode = (optype & 1) >> 0; + hucc_mode = (optype & 2) >> 1; + + /* include final.asm, but not if already inside final.asm */ + if (!in_final) { + kickc_final |= kickc_mode; + hucc_final |= hucc_mode; + } /* enable () for indirect addressing in KickC mode */ - asm_opt[OPT_INDPAREN] = optype; + asm_opt[OPT_INDPAREN] = kickc_mode; /* enable auto-detect ZP addressing in KickC mode */ - asm_opt[OPT_ZPDETECT] = optype; + asm_opt[OPT_ZPDETECT] = kickc_mode; /* enable long-branch support in KickC mode */ - asm_opt[OPT_LBRANCH] = optype; + asm_opt[OPT_LBRANCH] = kickc_mode; /* output line */ if (pass == LAST_PASS) @@ -1957,7 +1968,8 @@ do_cpu(int *ip) /* ---- * do_segment() * ---- - * .segment pseudo (for KickC code) + * .segment pseudo (optype == 0) (for KickC code) + * .area pseudo (optype == 1) (for HuCC code) */ void diff --git a/src/mkit/as/defs.h b/src/mkit/as/defs.h index 0f3ccf1a..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 @@ -129,7 +142,7 @@ #define P_ENCODING 62 // .encoding #define P_STRUCT 63 // .struct #define P_ENDS 64 // .ends -#define P_AREA 65 // .area +#define P_SETTAG 65 // .tag /* symbol flags */ #define UNDEF 1 /* undefined - may be zero page */ @@ -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; @@ -223,7 +239,7 @@ typedef struct t_symbol { int type; int value; int section; - int area; + int tag; int bank; int page; int nb; @@ -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 60406165..2a6a9361 100644 --- a/src/mkit/as/expr.c +++ b/src/mkit/as/expr.c @@ -22,7 +22,7 @@ t_symbol pc_symbol = { DEFABS, /* type */ 0, /* value */ 0, /* section */ - 0, /* area */ + 0, /* tag */ 0, /* bank */ 0, /* page */ 0, /* nb */ @@ -588,13 +588,13 @@ push_val(int type) else pc_symbol.value = data_loccnt; - pc_symbol.area = area; + 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); @@ -603,11 +603,6 @@ push_val(int type) pc_symbol.value += (page << 13); - /* KickC can't call bank(), so put it in the label */ - if (kickc_mode) { - pc_symbol.value += pc_symbol.bank << 23; - } - expr_valbank = pc_symbol.bank; expr_toplabl = @@ -898,7 +893,7 @@ check_keyword(void) else if (symbol[0] == keyword[8][0] && !strcasecmp(symbol, keyword[8])) op = OP_LINEAR; else if (symbol[0] == keyword[9][0] && !strcasecmp(symbol, keyword[9])) - op = OP_AREA; + op = OP_TAGOF; else { if (machine->type == MACHINE_PCE) { /* PCE specific functions */ @@ -920,7 +915,7 @@ check_keyword(void) case OP_PAL: case OP_SIZEOF: case OP_LINEAR: - case OP_AREA: + case OP_TAGOF: expr_lablptr = NULL; expr_lablcnt = 0; break; @@ -1002,11 +997,11 @@ do_op(void) val[0] = (exbank << 13) + (val[0] & 0x1FFF); break; - /* AREA */ - case OP_AREA: - if (!check_func_args("AREA")) + /* TAGOF */ + case OP_TAGOF: + if (!check_func_args("TAGOF")) return (0); - val[0] = expr_lablptr->area; + val[0] = expr_lablptr->tag; break; /* BANK */ @@ -1014,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/expr.h b/src/mkit/as/expr.h index dadcae20..374dc8d7 100644 --- a/src/mkit/as/expr.h +++ b/src/mkit/as/expr.h @@ -36,7 +36,7 @@ #define OP_PAL 27 #define OP_SIZEOF 28 #define OP_LINEAR 29 -#define OP_AREA 30 +#define OP_TAGOF 30 #define OP_dotLO 31 #define OP_dotHI 32 @@ -50,7 +50,7 @@ const int op_pri[] = { 5 /* <= */, 5 /* > */, 5 /* >= */, 11 /* DEFIN.*/, 11 /* HIGH */, 11 /* LOW */, 11 /* PAGE */, 11 /* BANK */, 11 /* VRAM */, 11 /* PAL */, 11 /* SIZEOF*/, - 11 /* LINEAR*/, 11 /* AREA */, 6 /* dotLO */, 6 /* dotHI */ + 11 /* LINEAR*/, 11 /* TAGOF */, 6 /* dotLO */, 6 /* dotHI */ }; /* second argument */ @@ -63,7 +63,7 @@ const int op_2nd[] = { 1 /* <= */, 1 /* > */, 1 /* >= */, 0 /* DEFIN.*/, 0 /* HIGH */, 0 /* LOW */, 0 /* PAGE */, 0 /* BANK */, 0 /* VRAM */, 0 /* PAL */, 0 /* SIZEOF*/, - 0 /* LINEAR*/, 0 /* AREA */, 0 /* dotLO */, 0 /* dotHI */ + 0 /* LINEAR*/, 0 /* TAGOF */, 0 /* dotLO */, 0 /* dotHI */ }; unsigned int op_stack[64] = { @@ -89,5 +89,5 @@ const char *keyword[10] = { /* predefined functions */ "\3PAL", "\6SIZEOF", "\6LINEAR", - "\4AREA" + "\5TAGOF" }; diff --git a/src/mkit/as/externs.h b/src/mkit/as/externs.h index 1b129233..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 area; /* current area */ -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,64 +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 kickc_incl; /* auto-include "kickc-final.asm" */ -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 0673a5df..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; @@ -267,14 +267,18 @@ readline(void) c = getc(in_fp); if (c == EOF) { if (close_input()) { - if (stop_pass != 0 || kickc_incl == 0) { + if (stop_pass != 0 || ((hucc_final == 0) && (kickc_final == 0))) { return (-1); } else { - kickc_incl = 0; - if (open_input("kickc-final.asm") == -1) { - fatal_error("Cannot open \"kickc-final.asm\" file!"); + const char * name = (hucc_final) ? "hucc-final.asm" : "kickc-final.asm"; + hucc_final = kickc_final = 0; + if (open_input(name) == -1) { + char message [128]; + sprintf(message, "Cannot open \"%s\" file!", name); + fatal_error(message); return (-1); } + in_final = 1; } } goto start; @@ -374,7 +378,7 @@ readline(void) */ int -open_input(char *name) +open_input(const char *name) { FILE *fp; char *p; diff --git a/src/mkit/as/inst.h b/src/mkit/as/inst.h index b7d8017c..01e9a942 100644 --- a/src/mkit/as/inst.h +++ b/src/mkit/as/inst.h @@ -204,7 +204,6 @@ struct t_opcode base_pseudo[] = { {NULL, "CALL", do_call, PSEUDO, P_CALL, 0}, {NULL, "ALIGN", do_align, PSEUDO, P_ALIGN, 0}, -// {NULL, "AREA", do_area, PSEUDO, P_AREA, 0}, {NULL, "BANK", do_bank, PSEUDO, P_BANK, 0}, {NULL, "BSS", do_section, PSEUDO, P_BSS, S_BSS}, // {NULL, "BYTE", do_db, PSEUDO, P_DB, 0}, @@ -226,7 +225,6 @@ struct t_opcode base_pseudo[] = { {NULL, "ENDS", do_ends, PSEUDO, P_ENDS, 0}, {NULL, "EQU", do_equ, PSEUDO, P_EQU, 0}, {NULL, "FAIL", do_fail, PSEUDO, P_FAIL, 0}, -// {NULL, "FILL", do_ds, PSEUDO, P_DS, 0}, {NULL, "FUNC", do_func, PSEUDO, P_FUNC, 0}, {NULL, "IF", do_if, PSEUDO, P_IF, 0}, {NULL, "IFDEF", do_ifdef, PSEUDO, P_IFDEF, 1}, @@ -248,12 +246,10 @@ struct t_opcode base_pseudo[] = { {NULL, "RSSET", do_rsset, PSEUDO, P_RSSET, 0}, {NULL, "RS", do_rs, PSEUDO, P_RS, 0}, {NULL, "STRUCT", do_struct, PSEUDO, P_STRUCT, 0}, -// {NULL, "TEXT", do_db, PSEUDO, P_DB, 1}, // {NULL, "WORD", do_dw, PSEUDO, P_DW, 0}, {NULL, "ZP", do_section, PSEUDO, P_ZP, S_ZP}, {NULL, ".ALIGN", do_align, PSEUDO, P_ALIGN, 0}, - {NULL, ".AREA", do_area, PSEUDO, P_AREA, 0}, {NULL, ".BANK", do_bank, PSEUDO, P_BANK, 0}, {NULL, ".BSS", do_section, PSEUDO, P_BSS, S_BSS}, {NULL, ".BYTE", do_db, PSEUDO, P_DB, 0}, @@ -274,7 +270,6 @@ struct t_opcode base_pseudo[] = { {NULL, ".ENDPROCGROUP", do_endp, PSEUDO, P_ENDPG, P_PGROUP}, {NULL, ".EQU", do_equ, PSEUDO, P_EQU, 0}, {NULL, ".FAIL", do_fail, PSEUDO, P_FAIL, 0}, - {NULL, ".FILL", do_ds, PSEUDO, P_DS, 0}, {NULL, ".FUNC", do_func, PSEUDO, P_FUNC, 0}, {NULL, ".IF", do_if, PSEUDO, P_IF, 0}, {NULL, ".IFDEF", do_ifdef, PSEUDO, P_IFDEF, 1}, @@ -298,7 +293,6 @@ struct t_opcode base_pseudo[] = { {NULL, ".SET", do_equ, PSEUDO, P_EQU, 1}, {NULL, ".STRUCT", do_struct, PSEUDO, P_STRUCT, 0}, {NULL, ".ENDS", do_ends, PSEUDO, P_ENDS, 0}, - {NULL, ".TEXT", do_db, PSEUDO, P_DB, 1}, {NULL, ".WORD", do_dw, PSEUDO, P_DW, 0}, {NULL, ".ZP", do_section, PSEUDO, P_ZP, S_ZP}, @@ -312,9 +306,17 @@ struct t_opcode base_pseudo[] = { {NULL, ".LABEL", do_label, PSEUDO, P_LABEL, 0}, {NULL, ".VAR", do_label, PSEUDO, P_LABEL, 1}, {NULL, ".ENCODING", do_encoding, PSEUDO, P_ENCODING,0}, + {NULL, ".TEXT", do_db, PSEUDO, P_DB, 1}, + {NULL, ".FILL", do_ds, PSEUDO, P_DS, 0}, {NULL, "{", do_proc, PSEUDO, P_PROC, P_KICKC}, {NULL, "}", do_endp, PSEUDO, P_ENDP, P_KICKC}, + {NULL, ".SETTAG", do_settag, PSEUDO, P_SETTAG, 0}, + + {NULL, ".HUCC", do_kickc, PSEUDO, P_KICKC, 2}, + {NULL, ".AREA", do_segment, PSEUDO, P_SEGMENT, 1}, + {NULL, ".ASCII", do_db, PSEUDO, P_DB, 2}, + {NULL, NULL, NULL, 0, 0, 0} }; /* *INDENT-ON* */ 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 9f2995de..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; @@ -543,8 +558,8 @@ main(int argc, char **argv) /* assemble */ for (pass = FIRST_PASS; pass <= LAST_PASS; pass++) { infile_error = -1; + tag_value = 0; page = 7; - area = 0; bank = 0; loccnt = 0; slnum = 0; @@ -561,7 +576,10 @@ main(int argc, char **argv) rsbank = RESERVED_BANK; proc_nb = 0; kickc_mode = 0; - kickc_incl = kickc_opt; + hucc_mode = 0; + kickc_final = 0; + hucc_final = 0; + in_final = 0; /* reset assembler options */ asm_opt[OPT_LIST] = 0; @@ -573,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; @@ -643,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; @@ -652,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) { @@ -665,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 8fad46f0..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,14 +607,9 @@ 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); - /* KickC can't call bank(), so put it in the label */ - if (proc_ptr->kickc) { - sym->value += sym->bank << 23; - } - /* local symbols */ if (sym->local) { local = sym->local; @@ -629,13 +624,8 @@ 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); - - /* KickC can't call bank(), so put it in the label */ - if (proc_ptr->kickc) { - local->value += local->bank << 23; - } } /* next */ @@ -681,7 +671,7 @@ proc_reloc(void) poke(call_ptr--, 0x53); // tam #6 poke(call_ptr--, 0x68); // pla - lablset("leave_proc", call_ptr + 1 + (call_bank << 23)); + lablset("leave_proc", call_ptr + 1); } } diff --git a/src/mkit/as/protos.h b/src/mkit/as/protos.h index 8874f173..104c2fa4 100644 --- a/src/mkit/as/protos.h +++ b/src/mkit/as/protos.h @@ -45,7 +45,7 @@ void do_equ(int *ip); void do_page(int *ip); void do_org(int *ip); void do_bank(int *ip); -void do_area(int *ip); +void do_settag(int *ip); void do_incbin(int *ip); void do_mx(char *fname); void forget_included_files(void); @@ -93,7 +93,7 @@ int add_path(char*, int); void cleanup_path(void); int init_path(void); int readline(void); -int open_input(char *name); +int open_input(const char *name); int close_input(void); FILE *open_file(char *fname, char *mode); diff --git a/src/mkit/as/symbol.c b/src/mkit/as/symbol.c index b11e2f6a..a76fdf85 100644 --- a/src/mkit/as/symbol.c +++ b/src/mkit/as/symbol.c @@ -229,7 +229,7 @@ stinstall(int hash, int type) sym->scope = NULL; sym->proc = NULL; sym->section = -1; - sym->area = -1; + sym->tag = -1; sym->bank = RESERVED_BANK; sym->nb = 0; sym->size = 0; @@ -309,14 +309,11 @@ labldef(int lval, int lbnk, int lsrc) lval = loccnt + (page << 13); - if (bank >= RESERVED_BANK) - lbnk = bank; - else - lbnk = bank_base + bank; - /* KickC can't call bank(), so put it in the label */ - if (kickc_mode) - lval += lbnk << 23; + 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] == '!') { @@ -341,7 +338,7 @@ labldef(int lval, int lbnk, int lsrc) case UNDEF: case IFUNDEF: lablptr->type = DEFABS; - lablptr->area = area; + lablptr->tag = tag_value; lablptr->bank = lbnk; lablptr->value = lval; break; @@ -394,8 +391,8 @@ labldef(int lval, int lbnk, int lsrc) fatal_error("Symbol's bank or address changed in final pass!"); return (-1); } - if (lablptr->area != area) { - fatal_error("Symbol's area changed in final pass!"); + if (lablptr->tag != tag_value) { + fatal_error("Symbol's tag changed in final pass!"); return (-1); } } @@ -501,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 */ @@ -546,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] == '!')) @@ -598,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 45068eac..374d25f2 100644 --- a/src/mkit/as/vars.h +++ b/src/mkit/as/vars.h @@ -1,92 +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 area; /* current area */ -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 kickc_incl; /* auto-include "kickc-final.asm" */ -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 -*/