static int arg (int bytes) { int rv = 0; argp++; if (A16) { switch (argp) { case 1: if (bytes == 1) return get_reg (r1l); if (bytes == 2) return get_reg (r1); break; case 2: if (bytes == 2) return get_reg (r2); break; } } else { switch (argp) { case 1: if (bytes == 1) return get_reg (r0l); if (bytes == 2) return get_reg (r0); break; } } if (bytes == 0) bytes = 2; switch (bytes) { case 1: rv = mem_get_qi (get_reg (sp) + stackp); if (A24) stackp++; break; case 2: rv = mem_get_hi (get_reg (sp) + stackp); break; case 3: rv = mem_get_psi (get_reg (sp) + stackp); if (A24) stackp++; break; case 4: rv = mem_get_si (get_reg (sp) + stackp); break; } stackp += bytes; return rv; }
static int disp16 () { int rv; int tsave = trace; if (trace == 1) trace = 0; rv = mem_get_hi (get_reg (pc)); regs.r_pc += 2; trace = tsave; return rv; }
int get_src (srcdest sd) { int v; if (sd.mem) { switch (sd.bytes) { case 1: v = mem_get_qi (sd.u.addr); break; case 2: v = mem_get_hi (sd.u.addr); break; case 3: v = mem_get_psi (sd.u.addr); break; case 4: v = mem_get_si (sd.u.addr); break; default: abort (); } } else { v = get_reg (sd.u.reg); switch (sd.bytes) { case 1: v &= 0xff; break; case 2: v &= 0xffff; break; case 3: v &= 0xffffff; break; } } return v; }
void rl78_load (bfd *prog, host_callback *callbacks, const char * const simname) { Elf_Internal_Phdr * phdrs; long sizeof_phdrs; int num_headers; int i; int max_rom = 0; init_cpu (); /* Note we load by ELF program header not by BFD sections. This is because BFD sections get their information from the ELF section structure, which only includes a VMA value and not an LMA value. */ sizeof_phdrs = bfd_get_elf_phdr_upper_bound (prog); if (sizeof_phdrs == 0) { fprintf (stderr, "%s: Failed to get size of program headers\n", simname); return; } phdrs = xmalloc (sizeof_phdrs); num_headers = bfd_get_elf_phdrs (prog, phdrs); if (num_headers < 1) { fprintf (stderr, "%s: Failed to read program headers\n", simname); return; } for (i = 0; i < num_headers; i++) { Elf_Internal_Phdr * p = phdrs + i; char *buf; bfd_vma size; bfd_vma base; file_ptr offset; size = p->p_filesz; if (size <= 0) continue; base = p->p_paddr; if (verbose > 1) fprintf (stderr, "[load segment: lma=%08x vma=%08x size=%08x]\n", (int) base, (int) p->p_vaddr, (int) size); if (callbacks) xprintf (callbacks, "Loading section %s, size %#lx lma %08lx vma %08lx\n", find_section_name_by_offset (prog, p->p_offset), size, base, p->p_vaddr); buf = xmalloc (size); offset = p->p_offset; if (prog->iovec->bseek (prog, offset, SEEK_SET) != 0) { fprintf (stderr, "%s, Failed to seek to offset %lx\n", simname, (long) offset); continue; } if (prog->iovec->bread (prog, buf, size) != size) { fprintf (stderr, "%s: Failed to read %lx bytes\n", simname, size); continue; } if (base > 0xeffff || base + size > 0xeffff) { fprintf (stderr, "%s, Can't load image to RAM/SFR space: 0x%lx - 0x%lx\n", simname, base, base+size); continue; } if (max_rom < base + size) max_rom = base + size; mem_put_blk (base, buf, size); free (buf); } free (phdrs); mem_rom_size (max_rom); pc = prog->start_address; if (strcmp (bfd_get_target (prog), "srec") == 0 || pc == 0) { pc = mem_get_hi (0); } if (verbose > 1) fprintf (stderr, "[start pc=%08x]\n", (unsigned int) pc); }