Fixed irq.c instr decoder for compressed isa
This commit is contained in:
parent
30e815d104
commit
d72b25993c
|
@ -30,15 +30,27 @@ uint32_t *irq(uint32_t *regs, uint32_t irqs)
|
||||||
|
|
||||||
if ((irqs & 6) != 0)
|
if ((irqs & 6) != 0)
|
||||||
{
|
{
|
||||||
uint32_t pc = regs[0] - 4;
|
uint32_t pc = regs[0] - 2;
|
||||||
uint16_t *instr_hwords = (uint16_t*)pc;
|
uint16_t *instr_hwords = (uint16_t*)pc;
|
||||||
uint32_t instr = instr_hwords[0] | (instr_hwords[1] << 16);
|
uint32_t instr = *(uint16_t*)pc;
|
||||||
|
|
||||||
|
if ((*instr_hwords & 3) == 3) {
|
||||||
|
pc -= 2;
|
||||||
|
instr = (instr << 16) | *(uint16_t*)pc;
|
||||||
|
} else {
|
||||||
|
int cnt_3 = 0;
|
||||||
|
while ((*(--instr_hwords) & 3) == 3 && cnt_3 < 20) cnt_3++;
|
||||||
|
if ((cnt_3 & 1) != 0) {
|
||||||
|
pc -= 2;
|
||||||
|
instr = (instr << 16) | *(uint16_t*)pc;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
print_str("\n");
|
print_str("\n");
|
||||||
print_str("------------------------------------------------------------\n");
|
print_str("------------------------------------------------------------\n");
|
||||||
|
|
||||||
if ((irqs & 2) != 0) {
|
if ((irqs & 2) != 0) {
|
||||||
if (instr == 0x00100073 || (instr & 0xffff) == 9002) {
|
if (instr == 0x00100073 || instr == 0x9002) {
|
||||||
print_str("SBREAK instruction at 0x");
|
print_str("SBREAK instruction at 0x");
|
||||||
print_hex(pc, 8);
|
print_hex(pc, 8);
|
||||||
print_str("\n");
|
print_str("\n");
|
||||||
|
|
Loading…
Reference in New Issue