NODE(sl_node_lambda_t, lambda) { sl_compile_state_t sub_cs; size_t i; init_compile_state(&sub_cs, cs->vm, cs, node->arg_count + 1); for(i = 0; i < node->arg_count; i++) { sl_st_insert(sub_cs.vars, (sl_st_data_t)node->args[i], (sl_st_data_t)(i + 1)); } sub_cs.section->req_registers = node->arg_count; sub_cs.section->arg_registers = node->arg_count; sub_cs.section->name = sl_intern(cs->vm, "<lambda>"); compile_node(&sub_cs, node->body, 0); op_return(&sub_cs, 0); op_lambda(cs, sub_cs.section, dest); }
NODE(sl_node_def_t, def) { sl_compile_state_t sub_cs; size_t i, on_reg; size_t init_regs = 1 + node->req_arg_count + node->opt_arg_count; if(node->rest_arg) { init_regs++; } init_compile_state(&sub_cs, cs->vm, cs, init_regs); for(i = 0; i < node->req_arg_count; i++) { sl_st_insert(sub_cs.vars, (sl_st_data_t)node->req_args[i], (sl_st_data_t)(i + 1)); } for(i = 0; i < node->opt_arg_count; i++) { sl_st_insert(sub_cs.vars, (sl_st_data_t)node->opt_args[i].name, (sl_st_data_t)(node->req_arg_count + i + 1)); } if(node->rest_arg) { sl_st_insert(sub_cs.vars, (sl_st_data_t)node->rest_arg, (sl_st_data_t)(node->req_arg_count + node->opt_arg_count + 1)); sub_cs.section->has_extra_rest_arg = 1; } sub_cs.section->name = node->name; sub_cs.section->req_registers = node->req_arg_count; sub_cs.section->arg_registers = node->req_arg_count + node->opt_arg_count; sub_cs.section->opt_skip = sl_alloc(cs->vm->arena, sizeof(size_t) * (node->opt_arg_count + 1)); for(i = 0; i < node->opt_arg_count; i++) { sub_cs.section->opt_skip[i] = sub_cs.section->insns_count; compile_node(&sub_cs, node->opt_args[i].default_value, node->req_arg_count + i + 1); } sub_cs.section->opt_skip[node->opt_arg_count] = sub_cs.section->insns_count; compile_node(&sub_cs, node->body, 0); op_return(&sub_cs, 0); if(node->on) { on_reg = reg_alloc(cs); compile_node(cs, node->on, on_reg); op_define_on(cs, on_reg, node->name, node->doc, sub_cs.section, dest); reg_free(cs, on_reg); } else { op_define(cs, node->name, node->doc, sub_cs.section, dest); } }
void opcode_jump (void) { error = E_UNKNOWN_OPCODE; //fda group if (strcmp( (char *)token,"addwf")==0) error = op_addwf((unsigned char *) file_line,token_len); if (strcmp( (char *)token,"addwfc")==0) error = op_addwfc((unsigned char *) file_line,token_len); if (strcmp( (char *)token,"andwf")==0) error = op_andwf((unsigned char *) file_line,token_len); if (strcmp( (char *)token,"comf")==0) error = op_comf((unsigned char *) file_line,token_len); if (strcmp( (char *)token,"decf")==0) error = op_decf((unsigned char *) file_line,token_len); if (strcmp( (char *)token,"decfsz")==0) error = op_decfsz((unsigned char *) file_line,token_len); if (strcmp( (char *)token,"dcfsnz")==0) error = op_dcfsnz((unsigned char *) file_line,token_len); if (strcmp( (char *)token,"incf")==0) error = op_incf((unsigned char *) file_line,token_len); if (strcmp( (char *)token,"incfsz")==0) error = op_incfsz((unsigned char *) file_line,token_len); if (strcmp( (char *)token,"infsnz")==0) error = op_infsnz((unsigned char *) file_line,token_len); if (strcmp( (char *)token,"iorwf")==0) error = op_iorwf((unsigned char *) file_line,token_len); if (strcmp( (char *)token,"movf")==0) error = op_movf((unsigned char *) file_line,token_len); if (strcmp( (char *)token,"rlcf")==0) error = op_rlcf((unsigned char *) file_line,token_len); if (strcmp( (char *)token,"rlncf")==0) error = op_rlncf((unsigned char *) file_line,token_len); if (strcmp( (char *)token,"rrcf")==0) error = op_rrcf((unsigned char *) file_line,token_len); if (strcmp( (char *)token,"rrncf")==0) error = op_rrncf((unsigned char *) file_line,token_len); if (strcmp( (char *)token,"subfwb")==0) error = op_subfwb((unsigned char *) file_line,token_len); if (strcmp( (char *)token,"subwf")==0) error = op_subwf((unsigned char *) file_line,token_len); if (strcmp( (char *)token,"subwfb")==0) error = op_subwfb((unsigned char *) file_line,token_len); if (strcmp( (char *)token,"swapf")==0) error = op_swapf((unsigned char *) file_line,token_len); if (strcmp( (char *)token,"xorwf")==0) error = op_xorwf((unsigned char *) file_line,token_len); //fa group if (strcmp( (char *)token,"clrf")==0) error = op_clrf((unsigned char *) file_line,token_len); if (strcmp( (char *)token,"cpfseq")==0) error = op_cpfseq((unsigned char *) file_line,token_len); if (strcmp( (char *)token,"cpfsgt")==0) error = op_cpfsgt((unsigned char *) file_line,token_len); if (strcmp( (char *)token,"cpfslt")==0) error = op_cpfslt((unsigned char *) file_line,token_len); if (strcmp( (char *)token,"movwf")==0) error = op_movwf((unsigned char *) file_line,token_len); if (strcmp( (char *)token,"mulwf")==0) error = op_mulwf((unsigned char *) file_line,token_len); if (strcmp( (char *)token,"negf")==0) error = op_negf((unsigned char *) file_line,token_len); if (strcmp( (char *)token,"setf")==0) error = op_setf((unsigned char *) file_line,token_len); if (strcmp( (char *)token,"tstfsz")==0) error = op_tstfsz((unsigned char *) file_line,token_len); //movff if (strcmp( (char *)token,"movff")==0) error = op_movff((unsigned char *) file_line,token_len); //fba group if (strcmp( (char *)token,"bcf")==0) error = op_bcf((unsigned char *) file_line,token_len); if (strcmp( (char *)token,"bsf")==0) error = op_bsf((unsigned char *) file_line,token_len); if (strcmp( (char *)token,"btfsc")==0) error = op_btfsc((unsigned char *) file_line,token_len); if (strcmp( (char *)token,"btfss")==0) error = op_btfss((unsigned char *) file_line,token_len); if (strcmp( (char *)token,"btg")==0) error = op_btg((unsigned char *) file_line,token_len); //one byte (literal, control) group - decide if relative / absolute if (strcmp( (char *)token,"bc")==0) error = op_bc((unsigned char *) file_line,token_len,addr,replaced); if (strcmp( (char *)token,"bn")==0) error = op_bn((unsigned char *) file_line,token_len,addr,replaced); if (strcmp( (char *)token,"bnc")==0) error = op_bnc((unsigned char *) file_line,token_len,addr,replaced); if (strcmp( (char *)token,"bnn")==0) error = op_bnn((unsigned char *) file_line,token_len,addr,replaced); if (strcmp( (char *)token,"bnov")==0) error = op_bnov((unsigned char *) file_line,token_len,addr,replaced); if (strcmp( (char *)token,"bnz")==0) error = op_bnz((unsigned char *) file_line,token_len,addr,replaced); if (strcmp( (char *)token,"bov")==0) error = op_bov((unsigned char *) file_line,token_len,addr,replaced); if (strcmp( (char *)token,"bz")==0) error = op_bz((unsigned char *) file_line,token_len,addr,replaced); if (strcmp( (char *)token,"rcall")==0) error = op_rcall((unsigned char *) file_line,token_len,addr,replaced); if (strcmp( (char *)token,"bra")==0) error = op_bra((unsigned char *) file_line,token_len,addr,replaced); //no decision if (strcmp( (char *)token,"retlw")==0) error = op_retlw((unsigned char *) file_line,token_len); if (strcmp( (char *)token,"addlw")==0) error = op_addlw((unsigned char *) file_line,token_len); if (strcmp( (char *)token,"andlw")==0) error = op_andlw((unsigned char *) file_line,token_len); if (strcmp( (char *)token,"iorlw")==0) error = op_iorlw((unsigned char *) file_line,token_len); if (strcmp( (char *)token,"movlb")==0) error = op_movlb((unsigned char *) file_line,token_len); if (strcmp( (char *)token,"movlw")==0) error = op_movlw((unsigned char *) file_line,token_len); if (strcmp( (char *)token,"mullw")==0) error = op_mullw((unsigned char *) file_line,token_len); if (strcmp( (char *)token,"sublw")==0) error = op_sublw((unsigned char *) file_line,token_len); if (strcmp( (char *)token,"xorlw")==0) error = op_xorlw((unsigned char *) file_line,token_len); //goto/call - 2 byte with 16 bit variable if (strcmp( (char *)token,"call")==0) error = op_call((unsigned char *) file_line,token_len); if (strcmp( (char *)token,"goto")==0) error = op_goto((unsigned char *) file_line,token_len); //lfsr if (strcmp( (char *)token,"lfsr")==0) error = op_lfsr((unsigned char *) file_line,token_len); //no suffix after opcode if (strcmp( (char *)token,"clrwdt")==0) error = op_clrwdt((unsigned char *) file_line,token_len); if (strcmp( (char *)token,"daw")==0) error = op_daw((unsigned char *) file_line,token_len); if (strcmp( (char *)token,"nop")==0) error = op_nop((unsigned char *) file_line,token_len); if (strcmp( (char *)token,"pop")==0) error = op_pop((unsigned char *) file_line,token_len); if (strcmp( (char *)token,"push")==0) error = op_push((unsigned char *) file_line,token_len); if (strcmp( (char *)token,"reset")==0) error = op_reset((unsigned char *) file_line,token_len); if (strcmp( (char *)token,"retfie")==0) error = op_retfie((unsigned char *) file_line,token_len); if (strcmp( (char *)token,"return")==0) error = op_return((unsigned char *) file_line,token_len); if (strcmp( (char *)token,"sleep")==0) error = op_sleep((unsigned char *) file_line,token_len); if (strcmp( (char *)token,"tblrd*")==0) error = op_tblrd((unsigned char *) file_line,token_len); if (strcmp( (char *)token,"tblrd*+")==0) error = op_tblrdpi((unsigned char *) file_line,token_len); if (strcmp( (char *)token,"tblrd*-")==0) error = op_tblrdpd((unsigned char *) file_line,token_len); if (strcmp( (char *)token,"tblrd+*")==0) error = op_tblrdip((unsigned char *) file_line,token_len); if (strcmp( (char *)token,"tblwt*")==0) error = op_tblwt((unsigned char *) file_line,token_len); if (strcmp( (char *)token,"tblwt*+")==0) error = op_tblwtpi((unsigned char *) file_line,token_len); if (strcmp( (char *)token,"tblwt*-")==0) error = op_tblwtpd((unsigned char *) file_line,token_len); if (strcmp( (char *)token,"tblwt+*")==0) error = op_tblwtip((unsigned char *) file_line,token_len); }