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