X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2Fz80%2Fmain.c;h=0a5592a157de6ed9e2f36fc540b8089cb5f2d0f6;hb=d7b30120ae115e8929d57e25038ca76dde13974e;hp=8fb6b0a2d18ef96d13784d134f62ddb09dbb1e97;hpb=d2da99feec099aa224e1db53bc5a1ed42ed51ec9;p=fw%2Fsdcc diff --git a/src/z80/main.c b/src/z80/main.c index 8fb6b0a2..0a5592a1 100644 --- a/src/z80/main.c +++ b/src/z80/main.c @@ -82,6 +82,7 @@ static char *_keywords[] = "at", //.p.t.20030714 adding support for 'sfr at ADDR' construct "_naked", //.p.t.20030714 adding support for '_naked' functions "critical", + "interrupt", NULL }; @@ -118,7 +119,7 @@ _reset_regparm (void) } static int -_reg_parm (sym_link * l) +_reg_parm (sym_link * l, bool reentrant) { if (options.noRegParams) { @@ -137,77 +138,136 @@ _reg_parm (sym_link * l) } } } + +enum { + P_BANK = 1, + P_PORTMODE +}; + static int -_process_pragma (const char *sz) +do_pragma(int id, const char *name, const char *cp) { - if( startsWith( sz, "bank=" ) || startsWith( sz, "bank " )) - { - char buffer[128]; - - if (sz[4]=='=') - werror(W_DEPRECATED_PRAGMA, "bank="); - - strncpy (buffer, sz + 5, sizeof (buffer)); - buffer[sizeof (buffer) - 1 ] = '\0'; - chomp (buffer); - if (isdigit (buffer[0])) - { + struct pragma_token_s token; + int err = 0; + int processed = 1; - } - else if (!strcmp (buffer, "BASE")) - { - strcpy (buffer, "HOME"); - } - if (isdigit (buffer[0])) + init_pragma_token(&token); + + switch (id) { - /* Arg was a bank number. Handle in an ASM independent - way. */ - char num[128]; - strncpy (num, sz + 5, sizeof (num)); - num[sizeof (num) -1] = '\0'; - chomp (num); - - switch (_G.asmType) + case P_BANK: { - 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); + char buffer[128]; + + cp = get_pragma_token(cp, &token); + + switch (token.type) + { + case TOKEN_EOL: + err = 1; + break; + + case TOKEN_INT: + switch (_G.asmType) + { + case ASM_TYPE_ASXXXX: + sprintf(buffer, "CODE_%d", token.val.int_val); + break; + + case ASM_TYPE_RGBDS: + sprintf(buffer, "CODE,BANK[%d]", token.val.int_val); + break; + + case ASM_TYPE_ISAS: + /* PENDING: what to use for ISAS? */ + sprintf (buffer, "CODE,BANK(%d)", token.val.int_val); + break; + + default: + wassert (0); + } + break; + + default: + { + const char *str = get_pragma_string(&token); + + strncpyz(buffer, (0 == strcmp("BASE", str)) ? "HOME" : str, sizeof buffer); + } + break; + } + + cp = get_pragma_token(cp, &token); + if (TOKEN_EOL != token.type) + { + err = 1; + break; + } + + gbz80_port.mem.code_name = Safe_strdup (buffer); + code->sname = gbz80_port.mem.code_name; + options.code_seg = gbz80_port.mem.code_name; } - } - gbz80_port.mem.code_name = Safe_strdup (buffer); - code->sname = gbz80_port.mem.code_name; - return 0; - } - else if( startsWith( sz, "portmode=" ) || startsWith( sz, "portmode " )) - { /*.p.t.20030716 - adding pragma to manipulate z80 i/o port addressing modes */ - char bfr[128]; + break; - if (sz[8]=='=') - werror(W_DEPRECATED_PRAGMA, "portmode="); + case P_PORTMODE: + { /*.p.t.20030716 - adding pragma to manipulate z80 i/o port addressing modes */ + const char *str; - strncpy( bfr, sz + 9, sizeof (bfr)); - bfr[sizeof (bfr) - 1] = '\0'; - chomp( bfr ); + cp = get_pragma_token(cp, &token); - if ( !strcmp( bfr, "z80" )){ z80_opts.port_mode = 80; } - else if( !strcmp( bfr, "z180" )){ z80_opts.port_mode = 180; } - else if( !strcmp( bfr, "save" )){ z80_opts.port_back = z80_opts.port_mode; } - else if( !strcmp( bfr, "restore" )){ z80_opts.port_mode = z80_opts.port_back; } - else return( 1 ); + if (TOKEN_EOL == token.type) + { + err = 1; + break; + } + + str = get_pragma_string(&token); + + cp = get_pragma_token(cp, &token); + if (TOKEN_EOL != token.type) + { + err = 1; + break; + } + + if (!strcmp(str, "z80")) + { z80_opts.port_mode = 80; } + else if(!strcmp(str, "z180")) + { z80_opts.port_mode = 180; } + else if(!strcmp(str, "save")) + { z80_opts.port_back = z80_opts.port_mode; } + else if(!strcmp(str, "restore" )) + { z80_opts.port_mode = z80_opts.port_back; } + else + err = 1; + } + break; - return( 0 ); + default: + processed = 0; + break; } - return 1; + get_pragma_token(cp, &token); + + if (1 == err) + werror(W_BAD_PRAGMA_ARGUMENTS, name); + + free_pragma_token(&token); + return processed; +} + +static struct pragma_s pragma_tbl[] = { + { "bank", P_BANK, 0, do_pragma }, + { "portmode", P_PORTMODE, 0, do_pragma }, + { NULL, 0, 0, NULL }, + }; + +static int +_process_pragma(const char *s) +{ + return process_pragma_tbl(pragma_tbl, s); } static const char *_gbz80_rgbasmCmd[] = @@ -271,6 +331,7 @@ _parseOptions (int *pargc, char **argv, int *i) /* ROM bank */ sprintf (buffer, "CODE_%u", bank); gbz80_port.mem.code_name = Safe_strdup (buffer); + options.code_seg = gbz80_port.mem.code_name; return TRUE; case 'a': /* RAM bank */ @@ -597,6 +658,8 @@ PORT z80_port = /* Sizes: char, short, int, long, ptr, fptr, gptr, bit, float, max */ 1, 2, 2, 4, 2, 2, 2, 1, 4, 4 }, + /* tags for generic pointers */ + { 0x00, 0x40, 0x60, 0x80 }, /* far, near, xstack, code */ { "XSEG", "STACK", @@ -613,6 +676,10 @@ PORT z80_port = "HOME", NULL, /* xidata */ NULL, /* xinit */ + NULL, /* const_name */ + "CABS", /* cabs_name */ + NULL, /* xabs_name */ + NULL, /* iabs_name */ NULL, NULL, 1 @@ -713,6 +780,8 @@ PORT gbz80_port = /* Sizes: char, short, int, long, ptr, fptr, gptr, bit, float, max */ 1, 2, 2, 4, 2, 2, 2, 1, 4, 4 }, + /* tags for generic pointers */ + { 0x00, 0x40, 0x60, 0x80 }, /* far, near, xstack, code */ { "XSEG", "STACK", @@ -729,6 +798,10 @@ PORT gbz80_port = "HOME", NULL, /* xidata */ NULL, /* xinit */ + NULL, /* const_name */ + "CABS", /* cabs_name */ + NULL, /* xabs_name */ + NULL, /* iabs_name */ NULL, NULL, 1