--- vt102/vt102 2014/12/01 18:26:20 1.3 +++ vt102/vt102 2014/12/01 18:31:02 1.4 @@ -729,38 +729,6 @@ ++$CLK; - #TODO: just check on ret instructions or so - # the interrupt logic - $x = $INTPEND & ~$INTMASK; - - if (($RST || $x) && $IFF) { - # rst 1 kbd data available - # rst 2 pusart xmit+recv flag - # rst 4 vertical retrace - # 5.5 vt125 mb7 trans ready (serial send?) - # 6.5 vt125 mb7 read ready (something modem?) - # 7.5 vt125 mb7 vblank h(?) - # trap vt125 mbi init h(?) - my $vec; - - if ($x & 1) { $vec = 0x2c; $INTPEND &= ~1; - } elsif ($x & 2) { $vec = 0x34; $INTPEND &= ~2; - } elsif ($x & 4) { $vec = 0x3c; $INTPEND &= ~4; -# } elsif ($RST ) { $vec = $RST * 8; $RST = 0; # for some reason, this breaks vt102 - } elsif ($RST & 1) { $vec = 0x08; $RST &= ~1; # separate is better for vt102 - } elsif ($RST & 2) { $vec = 0x10; $RST &= ~2; - } elsif ($RST & 4) { $vec = 0x20; $RST &= ~4; - } else { - die; - } - - $M[--$SP] = $PC >> 8; - $M[--$SP] = $PC & 0xff; - $PC = $vec; - - $IFF = 0; - } - # things we do from time too time only unless ($CLK & 0xf) { # do I/O @@ -804,6 +772,36 @@ prscr; } } + + # the interrupt logic + $x = $INTPEND & ~$INTMASK; + if (($RST || $x) && $IFF) { + # rst 1 kbd data available + # rst 2 pusart xmit+recv flag + # rst 4 vertical retrace + # 5.5 vt125 mb7 trans ready (serial send?) + # 6.5 vt125 mb7 read ready (something modem?) + # 7.5 vt125 mb7 vblank h(?) + # trap vt125 mbi init h(?) + my $vec; + + if ($x & 1) { $vec = 0x2c; $INTPEND &= ~1; + } elsif ($x & 2) { $vec = 0x34; $INTPEND &= ~2; + } elsif ($x & 4) { $vec = 0x3c; $INTPEND &= ~4; +# } elsif ($RST ) { $vec = $RST * 8; $RST = 0; # for some reason, this breaks vt102 + } elsif ($RST & 1) { $vec = 0x08; $RST &= ~1; # separate is better for vt102 + } elsif ($RST & 2) { $vec = 0x10; $RST &= ~2; + } elsif ($RST & 4) { $vec = 0x20; $RST &= ~4; + } else { + die; + } + + $M[--$SP] = $PC >> 8; + $M[--$SP] = $PC & 0xff; + $PC = $vec; + + $IFF = 0; + } } __DATA__