X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2Fz80%2Fmain.c;h=248e31b5112d41f835028b0e24168c598309ed36;hb=116a1bfc169e441ed10267f1b0fe8a2336b6dc78;hp=2ff5b561c18e6f56090a3bdee189bb213aae4202;hpb=856b88b89030bb496aaf9e21e39d98e5b48b9869;p=fw%2Fsdcc diff --git a/src/z80/main.c b/src/z80/main.c index 2ff5b561..248e31b5 100644 --- a/src/z80/main.c +++ b/src/z80/main.c @@ -45,8 +45,15 @@ Z80_OPTS z80_opts; static OPTION _z80_options[] = { - { 0, "--callee-saves-bc", &z80_opts.calleeSavesBC, "Force a called function to always save BC" }, - { 0, NULL } + { 0, "--callee-saves-bc", &z80_opts.calleeSavesBC, "Force a called function to always save BC" }, + { 0, "--portmode=", NULL, "Determine PORT I/O mode (z80/z180)" }, + { 0, NULL } + }; + +static OPTION _gbz80_options[] = + { + { 0, "--callee-saves-bc", &z80_opts.calleeSavesBC, "Force a called function to always save BC" }, + { 0, NULL } }; typedef enum @@ -72,6 +79,10 @@ static char *_keywords[] = "sfr", "nonbanked", "banked", + "at", //.p.t.20030714 adding support for 'sfr at ADDR' construct + "_naked", //.p.t.20030714 adding support for '_naked' functions + "critical", + "interrupt", NULL }; @@ -102,13 +113,13 @@ _gbz80_init (void) } static void -_reset_regparm () +_reset_regparm (void) { _G.regParams = 0; } static int -_reg_parm (sym_link * l) +_reg_parm (sym_link * l, bool reentrant) { if (options.noRegParams) { @@ -127,33 +138,38 @@ _reg_parm (sym_link * l) } } } - static int _process_pragma (const char *sz) { - if (startsWith (sz, "bank=")) + 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])) { - 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])) - { + } + 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); + char num[128]; + strncpy (num, sz + 5, sizeof (num)); + num[sizeof (num) -1] = '\0'; + chomp (num); - switch (_G.asmType) - { + switch (_G.asmType) + { case ASM_TYPE_ASXXXX: sprintf (buffer, "CODE_%s", num); break; @@ -166,12 +182,32 @@ _process_pragma (const char *sz) break; default: wassert (0); - } - } - gbz80_port.mem.code_name = Safe_strdup (buffer); - code->sname = gbz80_port.mem.code_name; - return 0; + } } + 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]; + + if (sz[8]=='=') + werror(W_DEPRECATED_PRAGMA, "portmode="); + + strncpy( bfr, sz + 9, sizeof (bfr)); + bfr[sizeof (bfr) - 1] = '\0'; + chomp( bfr ); + + 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 ); + + return( 0 ); + } + return 1; } @@ -276,6 +312,19 @@ _parseOptions (int *pargc, char **argv, int *i) return TRUE; } } + else if (!strncmp (argv[*i], "--portmode=", 11)) + { + if (!strcmp (argv[*i], "--portmode=z80")) + { + z80_opts.port_mode = 80; + return TRUE; + } + else if (!strcmp (argv[*i], "--portmode=z180")) + { + z80_opts.port_mode = 180; + return TRUE; + } + } } return FALSE; } @@ -478,6 +527,29 @@ _hasNativeMulFor (iCode *ic, sym_link *left, sym_link *right) return FALSE; } +/* Indicate which extended bit operations this port supports */ +static bool +hasExtBitOp (int op, int size) +{ + if (op == GETHBIT) + return TRUE; + else + return FALSE; +} + +/* Indicate the expense of an access to an output storage class */ +static int +oclsExpense (struct memmap *oclass) +{ + if (IN_FARSPACE(oclass)) + return 1; + + return 0; +} + + +#define LINKCMD "link-{port} -nf {dstfilename}" +/* #define LINKCMD \ "link-{port} -n -c -- {z80bases} -m -j" \ " {z80libspec}" \ @@ -486,6 +558,7 @@ _hasNativeMulFor (iCode *ic, sym_link *left, sym_link *right) " {z80crt0}" \ " \"{dstfilename}{objext}\"" \ " {z80extraobj}" +*/ #define ASMCMD \ "as-{port} -plosgff \"{objdstfilename}\" \"{dstfilename}{asmext}\"" @@ -498,6 +571,7 @@ PORT z80_port = "Zilog Z80", /* Target name */ NULL, /* Processor name */ { + glue, FALSE, MODEL_MEDIUM | MODEL_SMALL, MODEL_SMALL @@ -514,7 +588,8 @@ PORT z80_port = NULL, LINKCMD, NULL, - ".o" + ".o", + 1 }, { _z80_defaultRules @@ -529,6 +604,7 @@ PORT z80_port = "CODE", "DATA", "ISEG", + NULL, /* pdata */ "XSEG", "BSEG", "RSEG", @@ -538,6 +614,7 @@ PORT z80_port = "HOME", NULL, /* xidata */ NULL, /* xinit */ + NULL, /* const_name */ NULL, NULL, 1 @@ -550,10 +627,24 @@ PORT z80_port = { 0, 2 }, + { + z80_emitDebuggerSymbol + }, + { + 255, /* maxCount */ + 3, /* sizeofElement */ + /* The rest of these costs are bogus. They approximate */ + /* the behavior of src/SDCCicode.c 1.207 and earlier. */ + {4,4,4}, /* sizeofMatchJump[] */ + {0,0,0}, /* sizeofRangeCompare[] */ + 0, /* sizeofSubtract */ + 3, /* sizeofDispatch */ + }, "_", _z80_init, _parseOptions, _z80_options, + NULL, _finaliseOptions, _setDefaultOptions, z80_assignRegisters, @@ -563,12 +654,16 @@ PORT z80_port = NULL, /* no genAssemblerEnd */ 0, /* no local IVT generation code */ 0, /* no genXINIT code */ + NULL, /* genInitStartup */ _reset_regparm, _reg_parm, _process_pragma, _mangleSupportFunctionName, _hasNativeMulFor, + hasExtBitOp, /* hasExtBitOp */ + oclsExpense, /* oclsExpense */ TRUE, + TRUE, /* little endian */ 0, /* leave lt */ 0, /* leave gt */ 1, /* transform <= to ! > */ @@ -592,6 +687,7 @@ PORT gbz80_port = "Gameboy Z80-like", /* Target name */ NULL, { + glue, FALSE, MODEL_MEDIUM | MODEL_SMALL, MODEL_SMALL @@ -609,7 +705,8 @@ PORT gbz80_port = NULL, LINKCMD, NULL, - ".o" + ".o", + 1 }, { _gbz80_defaultRules @@ -624,6 +721,7 @@ PORT gbz80_port = "CODE", "DATA", "ISEG", + NULL, /* pdata */ "XSEG", "BSEG", "RSEG", @@ -633,6 +731,7 @@ PORT gbz80_port = "HOME", NULL, /* xidata */ NULL, /* xinit */ + NULL, /* const_name */ NULL, NULL, 1 @@ -645,10 +744,24 @@ PORT gbz80_port = { 0, 2 }, + { + z80_emitDebuggerSymbol + }, + { + 255, /* maxCount */ + 3, /* sizeofElement */ + /* The rest of these costs are bogus. They approximate */ + /* the behavior of src/SDCCicode.c 1.207 and earlier. */ + {4,4,4}, /* sizeofMatchJump[] */ + {0,0,0}, /* sizeofRangeCompare[] */ + 0, /* sizeofSubtract */ + 3, /* sizeofDispatch */ + }, "_", _gbz80_init, _parseOptions, - _z80_options, + _gbz80_options, + NULL, _finaliseOptions, _setDefaultOptions, z80_assignRegisters, @@ -658,12 +771,16 @@ PORT gbz80_port = NULL, /* no genAssemblerEnd */ 0, /* no local IVT generation code */ 0, /* no genXINIT code */ + NULL, /* genInitStartup */ _reset_regparm, _reg_parm, _process_pragma, _mangleSupportFunctionName, _hasNativeMulFor, + hasExtBitOp, /* hasExtBitOp */ + oclsExpense, /* oclsExpense */ TRUE, + TRUE, /* little endian */ 0, /* leave lt */ 0, /* leave gt */ 1, /* transform <= to ! > */