--- vt102/vt102 2014/12/01 18:41:36 1.5 +++ vt102/vt102 2014/12/01 19:40:48 1.6 @@ -110,8 +110,7 @@ ############################################################################# -my $DC11 = 0; # 4 bit commands -my $DC12 = 0; +my $DC11_REVERSE = 0; my $XON = 1; # false if terminal wants us to pause my $PUSARTCMD; @@ -157,9 +156,15 @@ $NVRLATCH = shift; } -sub out_a2 { $DC11 = shift } +sub out_a2 { + my $dc11 = 0x0f & shift; + + $DC11_REVERSE = 1 if $dc11 == 0b1010; + $DC11_REVERSE = 0 if $dc11 == 0b1011; +} + sub out_c2 { } # unknown -sub out_d2 { $DC12 = shift } +sub out_d2 { } # 0..3 == 80c/132c/60hz/50hz sub out_82 { # keyboard @@ -450,52 +455,76 @@ utf8::encode $_ for @chr; +my @sgr; # sgr sequences for attributes + +for (0x00 .. 0xff) { + my $sgr = ""; + + $sgr .= ";5" unless $_ & 0x01; + $sgr .= ";4" unless $_ & 0x02; + $sgr .= ";1" unless $_ & 0x04; + $sgr .= ";7" if $_ & 0x80; + + $sgr[$_] = "\e[${sgr}m"; +} + sub prscr { my $i = 0x2000; - my $scr = sprintf "\x1b[H--- KBD %08b CLK %d PC %04x RST %03b IFF %01b PUS %02x IM %03b\x1b[K\n", $KSTATUS, $CLK, $PC, $RST, $IFF, $PUSARTCMD, $INTMASK; + my $scr = sprintf "\e[H--- KBD %08b CLK %d\e[K\n", $KSTATUS, $CLK; + + $scr .= "\e[?5" . ($DC11_REVERSE ? "h" : "l"); line: - for my $y (0 .. 25) { - $scr .= sprintf "%2d |", ++$y; + for my $y (0 .. 25) { # ntsc, two vblank delay lines, up to 24 text lines + my $prev_sgr; - for (0..140) { - my $c = $M[$i++]; + $scr .= sprintf "%2d |", ++$y; -# printf "%04x %02x\n", $i-1,$c; + for (0..139) { + my $c = $M[$i]; if ($c == 0x7f) { # also 0xff, but the firmware avoids that - $scr .= "|\x1b[K\n"; + $scr .= "\e[m|\e[K\n"; - my $a1 = $M[$i++]; - my $a0 = $M[$i++]; + my $a1 = $M[$i + 1]; + my $a0 = $M[$i + 2]; $i = 0x2000 + (($a1 * 256 + $a0) & 0xfff); next line; } - $scr .= "\x1b[7m" if $c & 0x80; - $scr .= $chr[$c & 0x7f] // sprintf "[%02x]", $c & 0x7f; - $scr .= "\x1b[m" if $c & 0x80; + my $sgr = $sgr[ ($M[$i++ + 0x1000] & 15) | ($c & 0x80)]; + + # ~1 sgr 5 blink + # ~2 sgr 4 underline + # ~4 sgr 1 bold + # 0x80 in attr, sgr 7, reversed + + $scr .= $prev_sgr = $sgr if $sgr ne $prev_sgr; + + $scr .= $chr[$c & 0x7f]; } - $scr .= "\x1b[K\noverflow\x1b[K\n"; + $scr .= "\e[K\nvideo overflow\e[K\n"; last; } + $scr .= "\e[m"; + if (0) { - $scr .= "\x1b[K\n"; + $scr .= "\e[K\n"; for my $o (0x200 .. 0x232) { $scr .= sprintf "%04x:", $o * 16; for (0..15) { $scr .= sprintf " %02x", $M[$o * 16 + $_]; } - $scr .= "\x1b[K\n"; + $scr .= "\e[K\n"; } } - $scr .= "\x1b[J"; + $scr .= "\e[J"; syswrite STDOUT, $scr; }