+ z80_opts.sub = SUB_Z80;
+ asm_addTree(&_asxxxx_z80);
+}
+
+static void _gbz80_init(void)
+{
+ z80_opts.sub = SUB_GBZ80;
+}
+
+static int regParmFlg = 0; /* determine if we can register a parameter */
+
+static void _reset_regparm()
+{
+ regParmFlg = 0;
+}
+
+static int _reg_parm(link *l)
+{
+ if (regParmFlg == 2)
+ return 0;
+
+ regParmFlg++;
+ return 1;
+}
+
+static bool _startsWith(const char *sz, const char *key)
+{
+ return !strncmp(sz, key, strlen(key));
+}
+
+static void _chomp(char *sz)
+{
+ char *nl;
+ while ((nl = strrchr(sz, '\n')))
+ *nl = '\0';
+}
+
+static int _process_pragma(const char *sz)
+{
+ if (_startsWith(sz, "bank=")) {
+ char buffer[128];
+ strcpy(buffer, sz+5);
+ _chomp(buffer);
+ if (isdigit(buffer[0])) {
+
+ }
+ else if (!strcmp(buffer, "BASE")) {
+ strcpy(buffer, "HOME");
+ }
+ if (isdigit(buffer[0])) {
+ /* Arg was a bank number. Handle in an ASM independent
+ way. */
+ char num[128];
+ strcpy(num, sz+5);
+ _chomp(num);
+
+ switch (_G.asmType) {
+ case ASM_TYPE_ASXXXX:
+ sprintf(buffer, "CODE_%s", num);
+ break;
+ case ASM_TYPE_RGBDS:
+ sprintf(buffer, "CODE,BANK[%s]", num);
+ break;
+ case ASM_TYPE_ISAS:
+ /* PENDING: what to use for ISAS? */
+ sprintf(buffer, "CODE,BANK(%s)", num);
+ break;
+ default:
+ wassert(0);
+ }
+ }
+ gbz80_port.mem.code_name = gc_strdup(buffer);
+ code->sname = gbz80_port.mem.code_name;
+ return 0;
+ }
+ return 1;
+}
+
+static const char *_gbz80_rgbasmCmd[] = {
+ "rgbasm", "-o$1.o", "$1.asm", NULL
+};
+
+static const char *_gbz80_rgblinkCmd[] = {
+ "xlink", "-tg", "-n$1.sym", "-m$1.map", "-zFF", "$1.lnk", NULL
+};
+
+static void _gbz80_rgblink(void)
+{
+ FILE *lnkfile;
+ const char *sz;
+ char *argv[128];
+
+ int i;
+ sz = srcFileName;
+ if (!sz)
+ sz = "a";
+
+ /* first we need to create the <filename>.lnk file */
+ sprintf(buffer,"%s.lnk", sz);
+ if (!(lnkfile = fopen(buffer,"w"))) {
+ werror(E_FILE_OPEN_ERR, buffer);
+ exit(1);
+ }
+
+ fprintf(lnkfile, "[Objects]\n");
+
+ if (srcFileName)
+ fprintf(lnkfile, "%s.o\n", sz);
+
+ for (i = 0 ; i < nrelFiles ; i++ )
+ fprintf (lnkfile,"%s\n",relFiles[i]);
+
+ fprintf(lnkfile, "\n[Libraries]\n");
+ /* additional libraries if any */
+ for (i = 0 ; i < nlibFiles; i++)
+ fprintf (lnkfile,"%s\n",libFiles[i]);
+
+
+ fprintf(lnkfile,"\n[Output]\n" "%s.gb",sz);
+
+ fclose(lnkfile);
+
+ buildCmdLine(buffer, argv, port->linker.cmd, sz, NULL, NULL, NULL);
+ /* call the linker */
+ if (my_system(argv[0], argv)) {
+ perror("Cannot exec linker");
+ exit(1);
+ }
+}
+
+static bool _parseOptions(int *pargc, char **argv, int *i)
+{
+ if (argv[*i][0] == '-') {
+ if (argv[*i][1] == 'b' && IS_GB) {
+ int bank = atoi(argv[*i] + 3);
+ char buffer[128];
+ switch (argv[*i][2]) {
+ case 'o':
+ /* ROM bank */
+ sprintf(buffer, "CODE_%u", bank);
+ gbz80_port.mem.code_name = gc_strdup(buffer);
+ return TRUE;
+ case 'a':
+ /* RAM bank */
+ sprintf(buffer, "DATA_%u", bank);
+ gbz80_port.mem.data_name = gc_strdup(buffer);
+ return TRUE;
+ }
+ }
+ else if (!strncmp(argv[*i], "--asm=", 6)) {
+ if (!strcmp(argv[*i], "--asm=rgbds")) {
+ asm_addTree(&_rgbds_gb);
+ gbz80_port.assembler.cmd = _gbz80_rgbasmCmd;
+ gbz80_port.linker.cmd = _gbz80_rgblinkCmd;
+ gbz80_port.linker.do_link = _gbz80_rgblink;
+ _G.asmType = ASM_TYPE_RGBDS;
+ return TRUE;
+ }
+ else if (!strcmp(argv[*i], "--asm=asxxxx")) {
+ _G.asmType = ASM_TYPE_ASXXXX;
+ return TRUE;
+ }
+ else if (!strcmp(argv[*i], "--asm=isas")) {
+ asm_addTree(&_isas_gb);
+ /* Munge the function prefix */
+ gbz80_port.fun_prefix = "";
+ _G.asmType = ASM_TYPE_ISAS;
+ return TRUE;
+ }
+ }
+ }