Rename asm to emit, add __emit as an alternate keyword.

This commit is contained in:
Daniel_Cortez 2017-10-06 15:51:24 +07:00
parent ea8a77577f
commit 6119df8f2b
5 changed files with 296 additions and 292 deletions

View File

@ -311,7 +311,7 @@ typedef struct s_valuepair {
*/ */
#define tFIRST 256 /* value of first multi-character operator */ #define tFIRST 256 /* value of first multi-character operator */
#define tMIDDLE 280 /* value of last multi-character operator */ #define tMIDDLE 280 /* value of last multi-character operator */
#define tLAST 330 /* value of last multi-character match-able token */ #define tLAST 331 /* value of last multi-character match-able token */
/* multi-character operators */ /* multi-character operators */
#define taMULT 256 /* *= */ #define taMULT 256 /* *= */
#define taDIV 257 /* /= */ #define taDIV 257 /* /= */
@ -339,68 +339,69 @@ typedef struct s_valuepair {
#define tDBLDOT 279 /* .. */ #define tDBLDOT 279 /* .. */
#define tDBLCOLON 280 /* :: */ #define tDBLCOLON 280 /* :: */
/* reserved words (statements) */ /* reserved words (statements) */
#define tASM 281 #define tASSERT 281
#define tASSERT 282 #define tBEGIN 282
#define tBEGIN 283 #define tBREAK 283
#define tBREAK 284 #define tCASE 284
#define tCASE 285 #define tCHAR 285
#define tCHAR 286 #define tCONST 286
#define tCONST 287 #define tCONTINUE 287
#define tCONTINUE 288 #define tDEFAULT 288
#define tDEFAULT 289 #define tDEFINED 289
#define tDEFINED 290 #define tDO 290
#define tDO 291 #define tELSE 291
#define tELSE 292 #define tEMIT 292
#define tEND 293 #define t__EMIT 293
#define tENUM 294 #define tEND 294
#define tEXIT 295 #define tENUM 295
#define tFOR 296 #define tEXIT 296
#define tFORWARD 297 #define tFOR 297
#define tGOTO 298 #define tFORWARD 298
#define tIF 299 #define tGOTO 299
#define tNATIVE 300 #define tIF 300
#define tNEW 301 #define tNATIVE 301
#define tOPERATOR 302 #define tNEW 302
#define tPUBLIC 303 #define tOPERATOR 303
#define tRETURN 304 #define tPUBLIC 304
#define tSIZEOF 305 #define tRETURN 305
#define tSLEEP 306 #define tSIZEOF 306
#define tSTATE 307 #define tSLEEP 307
#define tSTATIC 308 #define tSTATE 308
#define tSTOCK 309 #define tSTATIC 309
#define tSWITCH 310 #define tSTOCK 310
#define tTAGOF 311 #define tSWITCH 311
#define tTHEN 312 #define tTAGOF 312
#define tWHILE 313 #define tTHEN 313
#define tWHILE 314
/* compiler directives */ /* compiler directives */
#define tpASSERT 314 /* #assert */ #define tpASSERT 315 /* #assert */
#define tpDEFINE 315 #define tpDEFINE 316
#define tpELSE 316 /* #else */ #define tpELSE 317 /* #else */
#define tpELSEIF 317 /* #elseif */ #define tpELSEIF 318 /* #elseif */
#define tpEMIT 318 #define tpEMIT 319
#define tpENDIF 319 #define tpENDIF 320
#define tpENDINPUT 320 #define tpENDINPUT 321
#define tpENDSCRPT 321 #define tpENDSCRPT 322
#define tpERROR 322 #define tpERROR 323
#define tpFILE 323 #define tpFILE 324
#define tpIF 324 /* #if */ #define tpIF 325 /* #if */
#define tINCLUDE 325 #define tINCLUDE 326
#define tpLINE 326 #define tpLINE 327
#define tpPRAGMA 327 #define tpPRAGMA 328
#define tpTRYINCLUDE 328 #define tpTRYINCLUDE 329
#define tpUNDEF 329 #define tpUNDEF 330
#define tpWARNING 330 #define tpWARNING 331
/* semicolon is a special case, because it can be optional */ /* semicolon is a special case, because it can be optional */
#define tTERM 331 /* semicolon or newline */ #define tTERM 332 /* semicolon or newline */
#define tENDEXPR 332 /* forced end of expression */ #define tENDEXPR 333 /* forced end of expression */
/* other recognized tokens */ /* other recognized tokens */
#define tNUMBER 333 /* integer number */ #define tNUMBER 334 /* integer number */
#define tRATIONAL 334 /* rational number */ #define tRATIONAL 335 /* rational number */
#define tSYMBOL 335 #define tSYMBOL 336
#define tLABEL 336 #define tLABEL 337
#define tSTRING 337 #define tSTRING 338
#define tEXPR 338 /* for assigment to "lastst" only (see SC1.C) */ #define tEXPR 339 /* for assigment to "lastst" only (see SC1.C) */
#define tENDLESS 339 /* endless loop, for assigment to "lastst" only */ #define tENDLESS 340 /* endless loop, for assigment to "lastst" only */
/* (reversed) evaluation of staging buffer */ /* (reversed) evaluation of staging buffer */
#define sSTARTREORDER 0x01 #define sSTARTREORDER 0x01
@ -552,7 +553,7 @@ SC_FUNC symbol *add_builtin_constant(char *name,cell val,int vclass,int tag);
SC_FUNC symbol *add_builtin_string_constant(char *name,const char *val,int vclass); SC_FUNC symbol *add_builtin_string_constant(char *name,const char *val,int vclass);
SC_FUNC void exporttag(int tag); SC_FUNC void exporttag(int tag);
SC_FUNC void sc_attachdocumentation(symbol *sym); SC_FUNC void sc_attachdocumentation(symbol *sym);
SC_FUNC void asm_parse_line(void); SC_FUNC void emit_parse_line(void);
/* function prototypes in SC2.C */ /* function prototypes in SC2.C */
#define PUSHSTK_P(v) { stkitem s_; s_.pv=(v); pushstk(s_); } #define PUSHSTK_P(v) { stkitem s_; s_.pv=(v); pushstk(s_); }
@ -855,7 +856,7 @@ SC_VDECL FILE *outf; /* file written to */
SC_VDECL jmp_buf errbuf; /* target of longjmp() on a fatal error */ SC_VDECL jmp_buf errbuf; /* target of longjmp() on a fatal error */
SC_VDECL int asm_block_parsing; SC_VDECL int emit_block_parsing;
#if !defined SC_LIGHT #if !defined SC_LIGHT
SC_VDECL int sc_makereport; /* generate a cross-reference report */ SC_VDECL int sc_makereport; /* generate a cross-reference report */

View File

@ -137,14 +137,14 @@ static void dostate(void);
static void addwhile(int *ptr); static void addwhile(int *ptr);
static void delwhile(void); static void delwhile(void);
static int *readwhile(void); static int *readwhile(void);
static void doasm(void); static void doemit(void);
typedef void (OPHANDLER_CALL *OPCODE_PROC)(char *name); typedef void (OPHANDLER_CALL *OPCODE_PROC)(char *name);
typedef struct { typedef struct {
cell opcode; cell opcode;
char *name; char *name;
OPCODE_PROC func; OPCODE_PROC func;
} ASM_OPCODE; } EMIT_OPCODE;
enum { enum {
TEST_PLAIN, /* no parentheses */ TEST_PLAIN, /* no parentheses */
@ -886,7 +886,7 @@ static void resetglobals(void)
sc_curstates=0; sc_curstates=0;
pc_memflags=0; pc_memflags=0;
pc_naked=FALSE; pc_naked=FALSE;
asm_block_parsing=FALSE; emit_block_parsing=FALSE;
} }
static void initglobals(void) static void initglobals(void)
@ -1626,10 +1626,11 @@ static void parse(void)
case 0: case 0:
/* ignore zero's */ /* ignore zero's */
break; break;
case tASM: case tEMIT:
asm_block_parsing=FALSE; case t__EMIT:
emit_block_parsing=FALSE;
lex(&val,&str); lex(&val,&str);
asm_parse_line(); emit_parse_line();
break; break;
case tNEW: case tNEW:
if (getclassspec(tok,&fpublic,&fstatic,&fstock,&fconst)) if (getclassspec(tok,&fpublic,&fstatic,&fstock,&fconst))
@ -5065,11 +5066,11 @@ static void statement(int *lastindent,int allow_decl)
errorset(sRESET,0); errorset(sRESET,0);
tok=lex(&val,&st); tok=lex(&val,&st);
if (tok==tASM) { if (tok==tEMIT || tok==t__EMIT) {
doasm(); doemit();
return; return;
} else if (asm_block_parsing) { } else if (emit_block_parsing) {
asm_parse_line(); emit_parse_line();
return; return;
} }
if (tok!='{') { if (tok!='{') {
@ -5803,7 +5804,7 @@ static void check_empty(const unsigned char *lptr)
error(38); /* extra characters on line */ error(38); /* extra characters on line */
} }
static void asm_invalid_token(int need_token, int current_token) static void emit_invalid_token(int need_token, int current_token)
{ {
char s[sNAMEMAX+ 2]; char s[sNAMEMAX+ 2];
extern char *sc_tokens[]; extern char *sc_tokens[];
@ -5816,7 +5817,7 @@ static void asm_invalid_token(int need_token, int current_token)
error(1,sc_tokens[tSYMBOL-tFIRST],s); error(1,sc_tokens[tSYMBOL-tFIRST],s);
} }
static void asm_param_num(char *name, ucell *p, int size) static void emit_param_num(char *name, ucell *p, int size)
{ {
char *str; char *str;
cell val; cell val;
@ -5877,7 +5878,7 @@ static void asm_param_num(char *name, ucell *p, int size)
} while (++curp < size); } while (++curp < size);
} }
static void asm_param_data(char *name, ucell *p, int size) static void emit_param_data(char *name, ucell *p, int size)
{ {
cell val; cell val;
char *str; char *str;
@ -5889,7 +5890,7 @@ static void asm_param_data(char *name, ucell *p, int size)
do { do {
tok=lex(&val,&str); tok=lex(&val,&str);
if (tok!=tSYMBOL) { if (tok!=tSYMBOL) {
asm_invalid_token(tSYMBOL, tok); emit_invalid_token(tSYMBOL, tok);
} /* if */ } /* if */
sym=findloc(str); sym=findloc(str);
if (sym==NULL || sym->vclass!=sSTATIC) if (sym==NULL || sym->vclass!=sSTATIC)
@ -5906,33 +5907,33 @@ static void asm_param_data(char *name, ucell *p, int size)
} while (++curp < size); } while (++curp < size);
} }
static void OPHANDLER_CALL asm_noop(char *name) static void OPHANDLER_CALL emit_noop(char *name)
{ {
(void)name; (void)name;
} }
static void OPHANDLER_CALL asm_parm0(char *name) static void OPHANDLER_CALL emit_parm0(char *name)
{ {
outinstr(name, 0, NULL); outinstr(name, 0, NULL);
} }
static void OPHANDLER_CALL asm_parm1_num(char *name) static void OPHANDLER_CALL emit_parm1_num(char *name)
{ {
ucell p[1]; ucell p[1];
asm_param_num(name, p, arraysize(p)); emit_param_num(name, p, arraysize(p));
outinstr(name,arraysize(p),p); outinstr(name,arraysize(p),p);
} }
static void OPHANDLER_CALL asm_parm1_gvar(char *name) static void OPHANDLER_CALL emit_parm1_gvar(char *name)
{ {
ucell p[1]; ucell p[1];
asm_param_data(name, p, arraysize(p)); emit_param_data(name, p, arraysize(p));
outinstr(name,arraysize(p),p); outinstr(name,arraysize(p),p);
} }
static void OPHANDLER_CALL asm_parm1_lbl(char *name) static void OPHANDLER_CALL emit_parm1_lbl(char *name)
{ {
char *str; char *str;
cell val; cell val;
@ -5941,30 +5942,30 @@ static void OPHANDLER_CALL asm_parm1_lbl(char *name)
tok=lex(&val,&str); tok=lex(&val,&str);
if (tok!=tSYMBOL) { if (tok!=tSYMBOL) {
asm_invalid_token(tSYMBOL, tok); emit_invalid_token(tSYMBOL, tok);
} /* if */ } /* if */
sym=fetchlab(str); sym=fetchlab(str);
sym->usage|=uREAD; sym->usage|=uREAD;
outinstr(name,1,&sym->addr); outinstr(name,1,&sym->addr);
} }
static void OPHANDLER_CALL asm_parm2_num(char *name) static void OPHANDLER_CALL emit_parm2_num(char *name)
{ {
ucell p[2]; ucell p[2];
asm_param_num(name, p, arraysize(p)); emit_param_num(name, p, arraysize(p));
outinstr(name,arraysize(p),p); outinstr(name,arraysize(p),p);
} }
static void OPHANDLER_CALL asm_parm2_gvar(char *name) static void OPHANDLER_CALL emit_parm2_gvar(char *name)
{ {
ucell p[2]; ucell p[2];
asm_param_data(name, p, arraysize(p)); emit_param_data(name, p, arraysize(p));
outinstr(name,arraysize(p),p); outinstr(name,arraysize(p),p);
} }
static void OPHANDLER_CALL asm_parm2_gvar_num(char *name) static void OPHANDLER_CALL emit_parm2_gvar_num(char *name)
{ {
cell val; cell val;
char *str; char *str;
@ -5976,7 +5977,7 @@ static void OPHANDLER_CALL asm_parm2_gvar_num(char *name)
tok=lex(&val,&str); tok=lex(&val,&str);
if (tok!=tSYMBOL) { if (tok!=tSYMBOL) {
asm_invalid_token(tSYMBOL, tok); emit_invalid_token(tSYMBOL, tok);
} /* if */ } /* if */
sym=findloc(str); sym=findloc(str);
if (sym==NULL || sym->vclass!=sSTATIC) if (sym==NULL || sym->vclass!=sSTATIC)
@ -5991,62 +5992,62 @@ static void OPHANDLER_CALL asm_parm2_gvar_num(char *name)
p[0]=sym->addr; p[0]=sym->addr;
tok=lex(&val,&str); tok=lex(&val,&str);
if (tok!=tNUMBER) { if (tok!=tNUMBER) {
asm_invalid_token(tNUMBER, tok); emit_invalid_token(tNUMBER, tok);
} /* if */ } /* if */
p[1]=val; p[1]=val;
outinstr(name,arraysize(p),p); outinstr(name,arraysize(p),p);
} /* if */ } /* if */
} }
static void OPHANDLER_CALL asm_parm3_num(char *name) static void OPHANDLER_CALL emit_parm3_num(char *name)
{ {
ucell p[3]; ucell p[3];
asm_param_num(name, p, arraysize(p)); emit_param_num(name, p, arraysize(p));
outinstr(name,arraysize(p),p); outinstr(name,arraysize(p),p);
} }
static void OPHANDLER_CALL asm_parm3_gvar(char *name) static void OPHANDLER_CALL emit_parm3_gvar(char *name)
{ {
ucell p[3]; ucell p[3];
asm_param_data(name, p, arraysize(p)); emit_param_data(name, p, arraysize(p));
outinstr(name,arraysize(p),p); outinstr(name,arraysize(p),p);
} }
static void OPHANDLER_CALL asm_parm4_num(char *name) static void OPHANDLER_CALL emit_parm4_num(char *name)
{ {
ucell p[4]; ucell p[4];
asm_param_num(name, p, arraysize(p)); emit_param_num(name, p, arraysize(p));
outinstr(name,arraysize(p),p); outinstr(name,arraysize(p),p);
} }
static void OPHANDLER_CALL asm_parm4_gvar(char *name) static void OPHANDLER_CALL emit_parm4_gvar(char *name)
{ {
ucell p[4]; ucell p[4];
asm_param_data(name, p, arraysize(p)); emit_param_data(name, p, arraysize(p));
outinstr(name,arraysize(p),p); outinstr(name,arraysize(p),p);
} }
static void OPHANDLER_CALL asm_parm5_num(char *name) static void OPHANDLER_CALL emit_parm5_num(char *name)
{ {
ucell p[5]; ucell p[5];
asm_param_num(name, p, arraysize(p)); emit_param_num(name, p, arraysize(p));
outinstr(name,arraysize(p),p); outinstr(name,arraysize(p),p);
} }
static void OPHANDLER_CALL asm_parm5_gvar(char *name) static void OPHANDLER_CALL emit_parm5_gvar(char *name)
{ {
ucell p[5]; ucell p[5];
asm_param_data(name, p, arraysize(p)); emit_param_data(name, p, arraysize(p));
outinstr(name,arraysize(p),p); outinstr(name,arraysize(p),p);
} }
static void OPHANDLER_CALL asm_do_case(char *name) static void OPHANDLER_CALL emit_do_case(char *name)
{ {
/* case <value> <label> */ /* case <value> <label> */
cell val; cell val;
@ -6061,12 +6062,12 @@ static void OPHANDLER_CALL asm_do_case(char *name)
tok=lex(&val,&str); tok=lex(&val,&str);
if (tok!=tNUMBER) { if (tok!=tNUMBER) {
asm_invalid_token(tSYMBOL, tok); emit_invalid_token(tSYMBOL, tok);
} /* if */ } /* if */
outval(val,FALSE); outval(val,FALSE);
tok=lex(&val,&str); tok=lex(&val,&str);
if (tok!=tSYMBOL) { if (tok!=tSYMBOL) {
asm_invalid_token(tSYMBOL, tok); emit_invalid_token(tSYMBOL, tok);
} /* if */ } /* if */
sym=fetchlab(str); sym=fetchlab(str);
if (sym==NULL) { if (sym==NULL) {
@ -6077,7 +6078,7 @@ static void OPHANDLER_CALL asm_do_case(char *name)
code_idx+=opargs(2)+opcodes(0); code_idx+=opargs(2)+opcodes(0);
} }
static void OPHANDLER_CALL asm_do_lodb_strb(char *name) static void OPHANDLER_CALL emit_do_lodb_strb(char *name)
{ {
ucell val; ucell val;
char *str; char *str;
@ -6086,7 +6087,7 @@ static void OPHANDLER_CALL asm_do_lodb_strb(char *name)
tok=lex(&val,&str); tok=lex(&val,&str);
if (tok!=tNUMBER) { if (tok!=tNUMBER) {
asm_invalid_token(tNUMBER, tok); emit_invalid_token(tNUMBER, tok);
} /* if */ } /* if */
if (val!=1 && val!=2 && val!=4) { if (val!=1 && val!=2 && val!=4) {
error(50); /* invalid range */ error(50); /* invalid range */
@ -6094,7 +6095,7 @@ static void OPHANDLER_CALL asm_do_lodb_strb(char *name)
outinstr(name,1,&val); outinstr(name,1,&val);
} }
static void OPHANDLER_CALL asm_do_call(char *name) static void OPHANDLER_CALL emit_do_call(char *name)
{ {
cell val; cell val;
char *str; char *str;
@ -6104,7 +6105,7 @@ static void OPHANDLER_CALL asm_do_call(char *name)
tok=lex(&val,&str); tok=lex(&val,&str);
if (tok!=tSYMBOL) { if (tok!=tSYMBOL) {
asm_invalid_token(tSYMBOL, tok); emit_invalid_token(tSYMBOL, tok);
} /* if */ } /* if */
sym=findglb(str,sGLOBAL); sym=findglb(str,sGLOBAL);
if (sym==NULL) { if (sym==NULL) {
@ -6121,169 +6122,169 @@ static void OPHANDLER_CALL asm_do_call(char *name)
} }
} }
static ASM_OPCODE asm_opcodelist[] = { static EMIT_OPCODE emit_opcodelist[] = {
{ 0, NULL, asm_noop }, { 0, NULL, emit_noop },
{ 78, "add", asm_parm0 }, { 78, "add", emit_parm0 },
{ 87, "add.c", asm_parm1_num }, { 87, "add.c", emit_parm1_num },
{ 14, "addr.alt", asm_parm1_num }, { 14, "addr.alt", emit_parm1_num },
{ 13, "addr.pri", asm_parm1_num }, { 13, "addr.pri", emit_parm1_num },
{ 30, "align.alt", asm_parm1_num }, { 30, "align.alt", emit_parm1_num },
{ 29, "align.pri", asm_parm1_num }, { 29, "align.pri", emit_parm1_num },
{ 81, "and", asm_parm0 }, { 81, "and", emit_parm0 },
{121, "bounds", asm_parm1_num }, {121, "bounds", emit_parm1_num },
{137, "break", asm_parm0 }, {137, "break", emit_parm0 },
{ 49, "call", asm_do_call }, { 49, "call", emit_do_call },
{ 50, "call.pri", asm_parm0 }, { 50, "call.pri", emit_parm0 },
{ 0, "case", asm_do_case }, { 0, "case", emit_do_case },
{130, "casetbl", asm_parm0 }, {130, "casetbl", emit_parm0 },
{118, "cmps", asm_parm1_num }, {118, "cmps", emit_parm1_num },
{156, "const", asm_parm2_gvar_num }, {156, "const", emit_parm2_gvar_num },
{ 12, "const.alt", asm_parm1_num }, { 12, "const.alt", emit_parm1_num },
{ 11, "const.pri", asm_parm1_num }, { 11, "const.pri", emit_parm1_num },
{157, "const.s", asm_parm2_num }, {157, "const.s", emit_parm2_num },
{114, "dec", asm_parm1_gvar }, {114, "dec", emit_parm1_gvar },
{113, "dec.alt", asm_parm0 }, {113, "dec.alt", emit_parm0 },
{116, "dec.i", asm_parm0 }, {116, "dec.i", emit_parm0 },
{112, "dec.pri", asm_parm0 }, {112, "dec.pri", emit_parm0 },
{115, "dec.s", asm_parm1_num }, {115, "dec.s", emit_parm1_num },
{ 95, "eq", asm_parm0 }, { 95, "eq", emit_parm0 },
{106, "eq.c.alt", asm_parm1_num }, {106, "eq.c.alt", emit_parm1_num },
{105, "eq.c.pri", asm_parm1_num }, {105, "eq.c.pri", emit_parm1_num },
/*{124, "file", do_file }, */ /*{124, "file", do_file }, */
{119, "fill", asm_parm1_num }, {119, "fill", emit_parm1_num },
{100, "geq", asm_parm0 }, {100, "geq", emit_parm0 },
{ 99, "grtr", asm_parm0 }, { 99, "grtr", emit_parm0 },
{120, "halt", asm_parm1_num }, {120, "halt", emit_parm1_num },
{ 45, "heap", asm_parm1_num }, { 45, "heap", emit_parm1_num },
{ 27, "idxaddr", asm_parm0 }, { 27, "idxaddr", emit_parm0 },
{ 28, "idxaddr.b", asm_parm1_num }, { 28, "idxaddr.b", emit_parm1_num },
{109, "inc", asm_parm1_gvar }, {109, "inc", emit_parm1_gvar },
{108, "inc.alt", asm_parm0 }, {108, "inc.alt", emit_parm0 },
{111, "inc.i", asm_parm0 }, {111, "inc.i", emit_parm0 },
{107, "inc.pri", asm_parm0 }, {107, "inc.pri", emit_parm0 },
{110, "inc.s", asm_parm1_num }, {110, "inc.s", emit_parm1_num },
{ 86, "invert", asm_parm0 }, { 86, "invert", emit_parm0 },
{ 55, "jeq", asm_parm1_lbl }, { 55, "jeq", emit_parm1_lbl },
{ 60, "jgeq", asm_parm1_lbl }, { 60, "jgeq", emit_parm1_lbl },
{ 59, "jgrtr", asm_parm1_lbl }, { 59, "jgrtr", emit_parm1_lbl },
{ 58, "jleq", asm_parm1_lbl }, { 58, "jleq", emit_parm1_lbl },
{ 57, "jless", asm_parm1_lbl }, { 57, "jless", emit_parm1_lbl },
{ 56, "jneq", asm_parm1_lbl }, { 56, "jneq", emit_parm1_lbl },
{ 54, "jnz", asm_parm1_lbl }, { 54, "jnz", emit_parm1_lbl },
{ 52, "jrel", asm_parm1_num }, { 52, "jrel", emit_parm1_num },
{ 64, "jsgeq", asm_parm1_lbl }, { 64, "jsgeq", emit_parm1_lbl },
{ 63, "jsgrtr", asm_parm1_lbl }, { 63, "jsgrtr", emit_parm1_lbl },
{ 62, "jsleq", asm_parm1_lbl }, { 62, "jsleq", emit_parm1_lbl },
{ 61, "jsless", asm_parm1_lbl }, { 61, "jsless", emit_parm1_lbl },
{ 51, "jump", asm_parm1_lbl }, { 51, "jump", emit_parm1_lbl },
{128, "jump.pri", asm_parm0 }, {128, "jump.pri", emit_parm0 },
{ 53, "jzer", asm_parm1_lbl }, { 53, "jzer", emit_parm1_lbl },
{ 31, "lctrl", asm_parm1_num }, { 31, "lctrl", emit_parm1_num },
{ 98, "leq", asm_parm0 }, { 98, "leq", emit_parm0 },
{ 97, "less", asm_parm0 }, { 97, "less", emit_parm0 },
{ 25, "lidx", asm_parm0 }, { 25, "lidx", emit_parm0 },
{ 26, "lidx.b", asm_parm1_num }, { 26, "lidx.b", emit_parm1_num },
/*{125, "line", asm_parm2_num }, */ /*{125, "line", emit_parm2_num }, */
{ 2, "load.alt", asm_parm1_gvar }, { 2, "load.alt", emit_parm1_gvar },
{154, "load.both", asm_parm2_gvar }, {154, "load.both", emit_parm2_gvar },
{ 9, "load.i", asm_parm0 }, { 9, "load.i", emit_parm0 },
{ 1, "load.pri", asm_parm1_gvar }, { 1, "load.pri", emit_parm1_gvar },
{ 4, "load.s.alt", asm_parm1_num }, { 4, "load.s.alt", emit_parm1_num },
{155, "load.s.both",asm_parm2_num }, {155, "load.s.both",emit_parm2_num },
{ 3, "load.s.pri", asm_parm1_num }, { 3, "load.s.pri", emit_parm1_num },
{ 10, "lodb.i", asm_do_lodb_strb }, { 10, "lodb.i", emit_do_lodb_strb },
{ 6, "lref.alt", asm_parm1_gvar }, { 6, "lref.alt", emit_parm1_gvar },
{ 5, "lref.pri", asm_parm1_gvar }, { 5, "lref.pri", emit_parm1_gvar },
{ 8, "lref.s.alt", asm_parm1_num }, { 8, "lref.s.alt", emit_parm1_num },
{ 7, "lref.s.pri", asm_parm1_num }, { 7, "lref.s.pri", emit_parm1_num },
{ 34, "move.alt", asm_parm0 }, { 34, "move.alt", emit_parm0 },
{ 33, "move.pri", asm_parm0 }, { 33, "move.pri", emit_parm0 },
{117, "movs", asm_parm1_num }, {117, "movs", emit_parm1_num },
{ 85, "neg", asm_parm0 }, { 85, "neg", emit_parm0 },
{ 96, "neq", asm_parm0 }, { 96, "neq", emit_parm0 },
{134, "nop", asm_parm0 }, {134, "nop", emit_parm0 },
{ 84, "not", asm_parm0 }, { 84, "not", emit_parm0 },
{ 82, "or", asm_parm0 }, { 82, "or", emit_parm0 },
{ 43, "pop.alt", asm_parm0 }, { 43, "pop.alt", emit_parm0 },
{ 42, "pop.pri", asm_parm0 }, { 42, "pop.pri", emit_parm0 },
{ 46, "proc", asm_parm0 }, { 46, "proc", emit_parm0 },
{ 40, "push", asm_parm1_gvar }, { 40, "push", emit_parm1_gvar },
{133, "push.adr", asm_parm1_num }, {133, "push.adr", emit_parm1_num },
{ 37, "push.alt", asm_parm0 }, { 37, "push.alt", emit_parm0 },
{ 39, "push.c", asm_parm1_num }, { 39, "push.c", emit_parm1_num },
{ 36, "push.pri", asm_parm0 }, { 36, "push.pri", emit_parm0 },
{ 38, "push.r", asm_parm1_num }, { 38, "push.r", emit_parm1_num },
{ 41, "push.s", asm_parm1_num }, { 41, "push.s", emit_parm1_num },
{139, "push2", asm_parm2_gvar }, {139, "push2", emit_parm2_gvar },
{141, "push2.adr", asm_parm2_num }, {141, "push2.adr", emit_parm2_num },
{138, "push2.c", asm_parm2_num }, {138, "push2.c", emit_parm2_num },
{140, "push2.s", asm_parm2_num }, {140, "push2.s", emit_parm2_num },
{143, "push3", asm_parm3_gvar }, {143, "push3", emit_parm3_gvar },
{145, "push3.adr", asm_parm3_num }, {145, "push3.adr", emit_parm3_num },
{142, "push3.c", asm_parm3_num }, {142, "push3.c", emit_parm3_num },
{144, "push3.s", asm_parm3_num }, {144, "push3.s", emit_parm3_num },
{147, "push4", asm_parm4_gvar }, {147, "push4", emit_parm4_gvar },
{149, "push4.adr", asm_parm4_num }, {149, "push4.adr", emit_parm4_num },
{146, "push4.c", asm_parm4_num }, {146, "push4.c", emit_parm4_num },
{148, "push4.s", asm_parm4_num }, {148, "push4.s", emit_parm4_num },
{151, "push5", asm_parm5_gvar }, {151, "push5", emit_parm5_gvar },
{153, "push5.adr", asm_parm5_num }, {153, "push5.adr", emit_parm5_num },
{150, "push5.c", asm_parm5_num }, {150, "push5.c", emit_parm5_num },
{152, "push5.s", asm_parm5_num }, {152, "push5.s", emit_parm5_num },
{ 47, "ret", asm_parm0 }, { 47, "ret", emit_parm0 },
{ 48, "retn", asm_parm0 }, { 48, "retn", emit_parm0 },
{ 32, "sctrl", asm_parm1_num }, { 32, "sctrl", emit_parm1_num },
{ 73, "sdiv", asm_parm0 }, { 73, "sdiv", emit_parm0 },
{ 74, "sdiv.alt", asm_parm0 }, { 74, "sdiv.alt", emit_parm0 },
{104, "sgeq", asm_parm0 }, {104, "sgeq", emit_parm0 },
{103, "sgrtr", asm_parm0 }, {103, "sgrtr", emit_parm0 },
{ 65, "shl", asm_parm0 }, { 65, "shl", emit_parm0 },
{ 69, "shl.c.alt", asm_parm1_num }, { 69, "shl.c.alt", emit_parm1_num },
{ 68, "shl.c.pri", asm_parm1_num }, { 68, "shl.c.pri", emit_parm1_num },
{ 66, "shr", asm_parm0 }, { 66, "shr", emit_parm0 },
{ 71, "shr.c.alt", asm_parm1_num }, { 71, "shr.c.alt", emit_parm1_num },
{ 70, "shr.c.pri", asm_parm1_num }, { 70, "shr.c.pri", emit_parm1_num },
{ 94, "sign.alt", asm_parm0 }, { 94, "sign.alt", emit_parm0 },
{ 93, "sign.pri", asm_parm0 }, { 93, "sign.pri", emit_parm0 },
{102, "sleq", asm_parm0 }, {102, "sleq", emit_parm0 },
{101, "sless", asm_parm0 }, {101, "sless", emit_parm0 },
{ 72, "smul", asm_parm0 }, { 72, "smul", emit_parm0 },
{ 88, "smul.c", asm_parm1_num }, { 88, "smul.c", emit_parm1_num },
/*{127, "srange", asm_parm2_num }, */ /*{127, "srange", emit_parm2_num }, */
{ 20, "sref.alt", asm_parm1_gvar }, { 20, "sref.alt", emit_parm1_gvar },
{ 19, "sref.pri", asm_parm1_gvar }, { 19, "sref.pri", emit_parm1_gvar },
{ 22, "sref.s.alt", asm_parm1_num }, { 22, "sref.s.alt", emit_parm1_num },
{ 21, "sref.s.pri", asm_parm1_num }, { 21, "sref.s.pri", emit_parm1_num },
{ 67, "sshr", asm_parm0 }, { 67, "sshr", emit_parm0 },
{ 44, "stack", asm_parm1_num }, { 44, "stack", emit_parm1_num },
{ 16, "stor.alt", asm_parm1_gvar }, { 16, "stor.alt", emit_parm1_gvar },
{ 23, "stor.i", asm_parm0 }, { 23, "stor.i", emit_parm0 },
{ 15, "stor.pri", asm_parm1_gvar }, { 15, "stor.pri", emit_parm1_gvar },
{ 18, "stor.s.alt", asm_parm1_num }, { 18, "stor.s.alt", emit_parm1_num },
{ 17, "stor.s.pri", asm_parm1_num }, { 17, "stor.s.pri", emit_parm1_num },
{ 24, "strb.i", asm_do_lodb_strb }, { 24, "strb.i", emit_do_lodb_strb },
{ 79, "sub", asm_parm0 }, { 79, "sub", emit_parm0 },
{ 80, "sub.alt", asm_parm0 }, { 80, "sub.alt", emit_parm0 },
{132, "swap.alt", asm_parm0 }, {132, "swap.alt", emit_parm0 },
{131, "swap.pri", asm_parm0 }, {131, "swap.pri", emit_parm0 },
{129, "switch", asm_parm1_lbl }, {129, "switch", emit_parm1_lbl },
/*{126, "symbol", do_symbol }, */ /*{126, "symbol", do_symbol }, */
/*{136, "symtag", asm_parm1_num }, */ /*{136, "symtag", emit_parm1_num }, */
{123, "sysreq.c", asm_parm1_num }, {123, "sysreq.c", emit_parm1_num },
{135, "sysreq.n", asm_parm2_num }, {135, "sysreq.n", emit_parm2_num },
{122, "sysreq.pri", asm_parm0 }, {122, "sysreq.pri", emit_parm0 },
{ 76, "udiv", asm_parm0 }, { 76, "udiv", emit_parm0 },
{ 77, "udiv.alt", asm_parm0 }, { 77, "udiv.alt", emit_parm0 },
{ 75, "umul", asm_parm0 }, { 75, "umul", emit_parm0 },
{ 35, "xchg", asm_parm0 }, { 35, "xchg", emit_parm0 },
{ 83, "xor", asm_parm0 }, { 83, "xor", emit_parm0 },
{ 91, "zero", asm_parm1_gvar }, { 91, "zero", emit_parm1_gvar },
{ 90, "zero.alt", asm_parm0 }, { 90, "zero.alt", emit_parm0 },
{ 89, "zero.pri", asm_parm0 }, { 89, "zero.pri", emit_parm0 },
{ 92, "zero.s", asm_parm1_num }, { 92, "zero.s", emit_parm1_num },
}; };
static int asm_findopcode(char *instr,int maxlen) static int emit_findopcode(char *instr,int maxlen)
{ {
int low,high,mid,cmp; int low,high,mid,cmp;
char str[MAX_INSTR_LEN]; char str[MAX_INSTR_LEN];
@ -6296,11 +6297,11 @@ static int asm_findopcode(char *instr,int maxlen)
* to symbols) * to symbols)
*/ */
low=1; /* entry 0 is reserved (for "not found") */ low=1; /* entry 0 is reserved (for "not found") */
high=(sizeof asm_opcodelist / sizeof asm_opcodelist[0])-1; high=(sizeof emit_opcodelist / sizeof emit_opcodelist[0])-1;
while (low<high) { while (low<high) {
mid=(low+high)/2; mid=(low+high)/2;
assert(asm_opcodelist[mid].name!=NULL); assert(emit_opcodelist[mid].name!=NULL);
cmp=stricmp(str,asm_opcodelist[mid].name); cmp=stricmp(str,emit_opcodelist[mid].name);
if (cmp>0) if (cmp>0)
low=mid+1; low=mid+1;
else else
@ -6308,12 +6309,12 @@ static int asm_findopcode(char *instr,int maxlen)
} /* while */ } /* while */
assert(low==high); assert(low==high);
if (stricmp(str,asm_opcodelist[low].name)==0) if (stricmp(str,emit_opcodelist[low].name)==0)
return low; /* found */ return low; /* found */
return 0; /* not found, return special index */ return 0; /* not found, return special index */
} }
SC_FUNC void asm_parse_line(void) SC_FUNC void emit_parse_line(void)
{ {
cell val; cell val;
char* st; char* st;
@ -6335,38 +6336,38 @@ SC_FUNC void asm_parse_line(void)
name[i]=(char)tolower(*lptr); name[i]=(char)tolower(*lptr);
} /* for */ } /* for */
name[i]='\0'; name[i]='\0';
i=asm_findopcode(name,strlen(name)); i=emit_findopcode(name,strlen(name));
if (asm_opcodelist[i].name==NULL && *name!='\0') { if (emit_opcodelist[i].name==NULL && *name!='\0') {
error(104,name); /* invalid assembler instruction */ error(104,name); /* invalid assembler instruction */
} /* if */ } /* if */
asm_opcodelist[i].func(name); emit_opcodelist[i].func(name);
check_empty(lptr); check_empty(lptr);
} else if (tok==tLABEL) { } else if (tok==tLABEL) {
if (!asm_block_parsing) { if (!emit_block_parsing) {
error(38); /* extra characters on line */ error(38); /* extra characters on line */
} /* if */ } /* if */
sym=fetchlab(st); sym=fetchlab(st);
setlabel((int)sym->addr); setlabel((int)sym->addr);
sym->usage|=uDEFINE; sym->usage|=uDEFINE;
} /* if */ } /* if */
if ((asm_block_parsing && matchtoken('}')) || !asm_block_parsing) { if ((emit_block_parsing && matchtoken('}')) || !emit_block_parsing) {
matchtoken(';'); matchtoken(';');
asm_block_parsing=FALSE; emit_block_parsing=FALSE;
} /* if */ } /* if */
} }
static void doasm(void) static void doemit(void)
{ {
cell val; cell val;
char *st; char *st;
asm_block_parsing=FALSE; emit_block_parsing=FALSE;
if (matchtoken('{')) { if (matchtoken('{')) {
lexpush(); lexpush();
asm_block_parsing=TRUE; emit_block_parsing=TRUE;
} else { } else {
lex(&val,&st); lex(&val,&st);
asm_parse_line(); emit_parse_line();
} }
} }

View File

@ -2073,10 +2073,11 @@ char *sc_tokens[] = {
"*=", "/=", "%=", "+=", "-=", "<<=", ">>>=", ">>=", "&=", "^=", "|=", "*=", "/=", "%=", "+=", "-=", "<<=", ">>>=", ">>=", "&=", "^=", "|=",
"||", "&&", "==", "!=", "<=", ">=", "<<", ">>>", ">>", "++", "--", "||", "&&", "==", "!=", "<=", ">=", "<<", ">>>", ">>", "++", "--",
"...", "..", "::", "...", "..", "::",
"asm", "assert", "*begin", "break", "case", "char", "const", "continue", "assert", "*begin", "break", "case", "char", "const", "continue", "default",
"default", "defined", "do", "else", "*end", "enum", "exit", "for", "forward", "defined", "do", "else", "emit", "__emit", "*end", "enum", "exit", "for",
"goto", "if", "native", "new", "operator", "public", "return", "sizeof", "forward", "goto", "if", "native", "new", "operator", "public", "return",
"sleep", "state", "static", "stock", "switch", "tagof", "*then", "while", "sizeof", "sleep", "state", "static", "stock", "switch", "tagof", "*then",
"while",
"#assert", "#define", "#else", "#elseif", "#emit", "#endif", "#endinput", "#assert", "#define", "#else", "#elseif", "#emit", "#endif", "#endinput",
"#endscript", "#error", "#file", "#if", "#include", "#line", "#pragma", "#endscript", "#error", "#file", "#if", "#include", "#line", "#pragma",
"#tryinclude", "#undef", "#warning", "#tryinclude", "#undef", "#warning",

View File

@ -1448,18 +1448,19 @@ static int hier2(value *lval)
} /* if */ } /* if */
return FALSE; return FALSE;
} /* case */ } /* case */
case tASM: { case tEMIT:
case t__EMIT: {
cell val; cell val;
char* st; char* st;
if (!matchtoken('{')) if (!matchtoken('{'))
error(38); error(38);
lex(&val,&st); lex(&val,&st);
lval->ident=iEXPRESSION; lval->ident=iEXPRESSION;
asm_parse_line(); emit_parse_line();
if (!matchtoken('}')) if (!matchtoken('}'))
error(38); error(38);
return FALSE; return FALSE;
} /* asm */ } /* case */
default: default:
lexpush(); lexpush();
lvalue=hier1(lval); lvalue=hier1(lval);

View File

@ -103,7 +103,7 @@ SC_VDEFINE FILE *outf = NULL; /* (intermediate) text file written to */
SC_VDEFINE jmp_buf errbuf; SC_VDEFINE jmp_buf errbuf;
SC_VDEFINE asm_block_parsing=FALSE; SC_VDEFINE emit_block_parsing=FALSE;
#if !defined SC_LIGHT #if !defined SC_LIGHT
SC_VDEFINE int sc_makereport=FALSE; /* generate a cross-reference report */ SC_VDEFINE int sc_makereport=FALSE; /* generate a cross-reference report */