// insert byte until PC fits condition static enum eos_t PO_align(void) { intval_t and, equal, fill, test = CPU_pc.intval; // make sure PC is defined. if ((CPU_pc.flags & MVALUE_DEFINED) == 0) { Throw_error(exception_pc_undefined); CPU_pc.flags |= MVALUE_DEFINED; // do not complain again return SKIP_REMAINDER; } and = ALU_defined_int(); if (!Input_accept_comma()) Throw_error(exception_syntax); equal = ALU_defined_int(); if (Input_accept_comma()) fill = ALU_any_int(); else fill = CPU_now->default_align_value; while ((test++ & and) != equal) Output_8b(fill); return ENSURE_EOS; }
// Reserve space by sending bytes of given value ("!fi" / "!fill" pseudo opcode) static enum eos_t PO_fill(void) { intval_t fill = FILLVALUE_FILL, size = ALU_defined_int(); if(Input_accept_comma()) fill = ALU_any_int(); while(size--) Output_8b(fill); return(ENSURE_EOS); }
// Helper function for !8, !16, !24 and !32 pseudo opcodes static enum eos_t output_objects(void (*fn)(intval_t)) { do fn(ALU_any_int()); while(Input_accept_comma()); return(ENSURE_EOS); }