> To Stuart - are you sure your code does it right. Could you post it? That's kind of what got me here. I was running the 8E-D1HA maindec on my emulator and it was failing at that point. My initial reaction was that I was misinterpreting the RTF behavior and that perhaps it wasn't setting the interrupt inhibit as I had thought. So I ran the diag on the real thing and single stepped through that part. Sure enough the RTF does set it, but GTF seems to not report it. That's when I got confused enough to break down and look at other people's code :)
Here's my code for both the RTF and GTF instructions. Caveat: it's in MCPL, but it should be close enough to C that it'll be recognizable what's going on: : 0, 0, 4 => // GTF ac := link << 11 | irq() << 9 | ie << 7 | sf // ac := link << 11 | irq() << 9 | ii << 8 | ie << 7 | sf : 0, 0, 5 => // RTF ie := 1 ii := 1 link := ac >> 11 ub := (ac >> 6) & #o1 ib := (ac >> 3) & #o7 df := ac & #o7 The line that's commented out on the GTF is the original version I had where I did include the interrupt inhibit. For comparison, here's the version in simh: case 4: /* GTF */ LAC = (LAC & 010000) | ((LAC & 010000) >> 1) | (gtf << 10) | (((int_req & INT_ALL) != 0) << 9) | (((int_req & INT_ION) != 0) << 7) | SF; break; case 5: /* RTF */ gtf = ((LAC & 02000) >> 10); UB = (LAC & 0100) >> 6; IB = (LAC & 0070) << 9; DF = (LAC & 0007) << 12; LAC = ((LAC & 04000) << 1) | iot_data; int_req = (int_req | INT_ION) & ~INT_NO_CIF_PENDING; break; and the one in Doug Jones' emulator: case 04: /* GTF */ ac = (link >> 1) /* bit 0 */ #ifdef KE8E | (gt?) /* bit 1 */ #endif | ((irq > 0) << 9) /* bit 2 */ #ifdef KM8E | (0) /*?*/ /* bit 3 */ #endif | (enab << 7) /* bit 4 */ #ifdef KM8E | sf /* bit 5-11 */ #endif ; break; case 05: /* RTF */ link = (ac<<1)& 010000; /* bit 0 */ #ifdef KE8E gt = ? /* bit 1 */ #endif /* nothing */ /* bit 2 */ /* nothing */ /* bit 3 */ enab = 1; /* bit 4 */ #ifdef KM8E ub = (ac & 00100) >> 6; /* bit 5 */ ib = (ac & 00070) << 9; /* bit 6-8 */ dfr = (ac & 00007) << 12;/* bit 9-11 */ #endif /* disable interrupts until branch */ enab_rtf = 0; break; BLS