/* * Pass 1: * - process one line of source * * Output: 1 line processed * 0 EOF */ int p1_line(void) { register char *p; register int i; register struct opc *op; if ((p = fgets(line, MAXLINE, srcfp)) == NULL) return(0); c_line++; p = get_label(label, p); p = get_opcode(opcode, p); p = get_arg(operand, p); if (strcmp(opcode, ENDFILE) == 0) return(0); if (*opcode) { if ((op = search_op(opcode)) != NULL) { i = (*op->op_fun)(op->op_c1, op->op_c2); if (gencode) pc += i; } else asmerr(E_ILLOPC); } else if (*label) put_label(); return(1); }
/* * Pass 2: * - process one line of source * * Output: 1 line processed * 0 EOF */ int p2_line(void) { register char *p; register int op_count; register struct opc *op; if ((p = fgets(line, MAXLINE, srcfp)) == NULL) return(0); c_line++; s_line++; p = get_label(label, p); p = get_opcode(opcode, p); p = get_arg(operand, p); if (strcmp(opcode, ENDFILE) == 0) { lst_line(pc, 0); return(0); } if (*opcode) { op = search_op(opcode); op_count = (*op->op_fun)(op->op_c1, op->op_c2); if (gencode) { lst_line(pc, op_count); obj_writeb(op_count); pc += op_count; } else { sd_flag = 2; lst_line(0, 0); } } else { sd_flag = 2; lst_line(0, 0); } return(1); }
int assemble_token(enum Token token) { switch (token) { case Addr: { if (curad == 0) text_addr = token_num; curad = token_num; return 1; } case EndL: return 1; case Symbol: { int opn; if ((opn = search_op(token_buf)) != -1) assemble_op(opcodes[opn]); else if ((opn = search_pop(token_buf)) != -1) assemble_pop((enum POp)opn); else if (token_buf[0] == 'o' && token_buf[1] == 'p' && token_buf[2] == 'c') { int op1 = (int)strtoul(token_buf + 3, &dummy, 10); uint64_t num; if (!parse_value(&num)) return 0; assemble_pcd(op1, (int)num); } else return 0; return 1; } } return 0; }
int sh2iasm(char *str, char *err_msg) // Function to do all the work { char name[30]; char arg1[30]; char arg2[30]; char *p; int loop; int oplen,arg1len,arg2len; sh_operand_info arg1info,arg2info,disp; sh_opcode_info opcode; arg1info.type = 0; arg1info.reg = 0; arg2info.type = 0; arg2info.reg = 0; //gets(str); p = str; while(*p == ' ') p++; if((oplen = strip_opname(p,name)) == 0) { asm_bad("No opcode", err_msg); return 0; } p += oplen; while(*p == ' ') p++; arg1len = strip_arg(p,arg1); p += arg1len; while(*p == ' ') p++; if(*p == ',') p++; while(*p == ' ') p++; arg2len = strip_arg(p,arg2); for(loop = 0;name[loop] != 0;loop++) { name[loop] = tolower(name[loop]); } for(loop = 0;arg1[loop] != 0;loop++) arg1[loop] = tolower(arg1[loop]); for(loop = 0;arg2[loop] != 0;loop++) arg2[loop] = tolower(arg2[loop]); if(!parse_arg(arg1,&arg1info,err_msg)) { if(arg1[0] != 0) asm_bad("Arg 1", err_msg); return 0; } if(!parse_arg(arg2,&arg2info,err_msg)) { if(arg2[0] != 0) asm_bad("Arg 2", err_msg); return 0; } if(!search_op(name,&arg1info,&arg2info,&opcode)) { asm_bad("Invalid opcode. Likely doesn't exist or format is wrong\n", err_msg); return 0; } loop = 0; rebuild_args(arg1,arg2,&arg1info,&arg2info,&disp); return build_bytes(opcode,arg1info,arg2info,disp); }