diff options
-rw-r--r-- | sim/h8300/ChangeLog | 11 | ||||
-rw-r--r-- | sim/h8300/compile.c | 106 | ||||
-rw-r--r-- | sim/h8300/run.c | 13 |
3 files changed, 94 insertions, 36 deletions
diff --git a/sim/h8300/ChangeLog b/sim/h8300/ChangeLog index 0b76bf6..90a61c6 100644 --- a/sim/h8300/ChangeLog +++ b/sim/h8300/ChangeLog @@ -1,3 +1,14 @@ +Tue Jul 2 23:08:45 1996 Jeffrey A Law (law@cygnus.com) + + * run.c (main): Don't "load" sections which don't have + SEC_LOAD set. + * compile.c (sim_resume, case "O_NOT"): Use ONOT instead + of OSHIFTS. + (ONOT): Define. + (sim_resume, shift/rotate cases): Add support for shift/rotate + by two bits. + (OSHIFTS): Corresponding changes. + start-sanitize-h8s Tue Jul 2 01:37:27 1996 Jeffrey A Law (law@cygnus.com) diff --git a/sim/h8300/compile.c b/sim/h8300/compile.c index 21b9d65..a04657b 100644 --- a/sim/h8300/compile.c +++ b/sim/h8300/compile.c @@ -823,7 +823,7 @@ mop (code, bsize, sign) } -#define OSHIFTS(name, how) \ +#define ONOT(name, how) \ case O(name, SB): \ { \ int t; \ @@ -849,6 +849,53 @@ case O(name, SL): \ goto shift32; \ } +#define OSHIFTS(name, how1, how2) \ +case O(name, SB): \ +{ \ + int t; \ + int hm = 0x80; \ + rd = GET_B_REG (code->src.reg); \ + if ((GET_MEMORY_B (pc + 1) & 0x40) == 0) \ + { \ + how1; \ + } \ + else \ + { \ + how2; \ + } \ + goto shift8; \ +} \ +case O(name, SW): \ +{ \ + int t; \ + int hm = 0x8000; \ + rd = GET_W_REG (code->src.reg); \ + if ((GET_MEMORY_B (pc + 1) & 0x40) == 0) \ + { \ + how1; \ + } \ + else \ + { \ + how2; \ + } \ + goto shift16; \ +} \ +case O(name, SL): \ +{ \ + int t; \ + int hm = 0x80000000; \ + rd = GET_L_REG (code->src.reg); \ + if ((GET_MEMORY_B (pc + 1) & 0x40) == 0) \ + { \ + how1; \ + } \ + else \ + { \ + how2; \ + } \ + goto shift32; \ +} + #define OBITOP(name,f, s, op) \ case O(name, SB): \ { \ @@ -1204,38 +1251,31 @@ sim_resume (step, siggnal) printf ("%c", cpu.regs[2]); goto next; - OSHIFTS (O_NOT, rd = ~rd; v = 0;); - OSHIFTS (O_SHLL, c = rd & hm; v = 0; - rd <<= 1); - OSHIFTS (O_SHLR, c = rd & 1; v = 0; - rd = (unsigned int) rd >> 1); - OSHIFTS (O_SHAL, c = rd & hm; - v = (rd & hm) != ((rd & (hm >> 1)) << 1); - rd <<= 1); - OSHIFTS (O_SHAR, t = rd & hm; - c = rd & 1; - v = 0; - rd >>= 1; - rd |= t; - ); - OSHIFTS (O_ROTL, c = rd & hm; - v = 0; - rd <<= 1; - rd |= C); - OSHIFTS (O_ROTR, c = rd & 1; - v = 0; - rd = (unsigned int) rd >> 1; - if (c) rd |= hm;); - OSHIFTS (O_ROTXL, t = rd & hm; - rd <<= 1; - rd |= C; - c = t; - v = 0; - ); - OSHIFTS (O_ROTXR, t = rd & 1; - rd = (unsigned int) rd >> 1; - if (C) rd |= hm; c = t; - v = 0;); + ONOT (O_NOT, rd = ~rd; v = 0;); + OSHIFTS (O_SHLL, + c = rd & hm; v = 0; rd <<= 1, + c = rd & (hm >> 1); v = 0; rd <<= 2); + OSHIFTS (O_SHLR, + c = rd & 1; v = 0; rd = (unsigned int) rd >> 1, + c = rd & 2; v = 0; rd = (unsigned int) rd >> 2); + OSHIFTS (O_SHAL, + c = rd & hm; v = (rd & hm) != ((rd & (hm >> 1)) << 1); rd <<= 1, + c = rd & (hm >> 1); v = (rd & (hm >> 1)) != ((rd & (hm >> 2)) << 2); rd <<= 2); + OSHIFTS (O_SHAR, + t = rd & hm; c = rd & 1; v = 0; rd >>= 1; rd |= t, + t = rd & hm; c = rd & 2; v = 0; rd >>= 2; rd |= t | t >> 1 ); + OSHIFTS (O_ROTL, + c = rd & hm; v = 0; rd <<= 1; rd |= C, + c = rd & (hm >> 1); v = 0; rd <<= 2; rd |= C); + OSHIFTS (O_ROTR, + c = rd & 1; v = 0; rd = (unsigned int) rd >> 1; if (c) rd |= hm, + c = rd & 2; v = 0; rd = (unsigned int) rd >> 2; if (c) rd |= hm); + OSHIFTS (O_ROTXL, + t = rd & hm; rd <<= 1; rd |= C; c = t; v = 0, + t = rd & (hm >> 1); rd <<= 2; rd |= C; c = t; v = 0); + OSHIFTS (O_ROTXR, + t = rd & 1; rd = (unsigned int) rd >> 1; if (C) rd |= hm; c = t; v = 0, + t = rd & 2; rd = (unsigned int) rd >> 2; if (C) rd |= hm; c = t; v = 0); case O (O_JMP, SB): { diff --git a/sim/h8300/run.c b/sim/h8300/run.c index f19488a..8921ae6 100644 --- a/sim/h8300/run.c +++ b/sim/h8300/run.c @@ -98,9 +98,16 @@ main (ac, av) for (s = abfd->sections; s; s=s->next) { - char *buffer = malloc(bfd_section_size(abfd,s)); - bfd_get_section_contents(abfd, s, buffer, 0, bfd_section_size(abfd,s)); - sim_write(s->vma, buffer, bfd_section_size(abfd,s)); + char *buffer; + + if (s->flags & SEC_LOAD) + { + + buffer = malloc(bfd_section_size(abfd,s)); + bfd_get_section_contents(abfd, s, buffer, 0, + bfd_section_size (abfd, s)); + sim_write(s->vma, buffer, bfd_section_size (abfd, s)); + } } start_address = bfd_get_start_address(abfd); |