… | |
… | |
548 | |
548 | |
549 | $scr .= "\e[?5" . ($DC11_REVERSE ? "h" : "l"); |
549 | $scr .= "\e[?5" . ($DC11_REVERSE ? "h" : "l"); |
550 | |
550 | |
551 | line: |
551 | line: |
552 | for my $y (0 .. 25) { # ntsc, two vblank delay lines, up to 24 text lines |
552 | for my $y (0 .. 25) { # ntsc, two vblank delay lines, up to 24 text lines |
553 | my $prev_sgr; |
553 | my $prev_attr; |
|
|
554 | my ($c, $attr); # declare here for speedup |
554 | |
555 | |
555 | $scr .= sprintf "%2d \xe2\x94\x82", $y; |
556 | $scr .= sprintf "%2d \xe2\x94\x82", $y; |
556 | |
557 | |
557 | for (0..139) { |
558 | for (0..139) { |
558 | my $c = $M[$i]; |
559 | $c = $M[$i]; |
559 | |
560 | |
560 | if ($c == 0x7f) { # also 0xff, but the firmware avoids that |
561 | if ($c == 0x7f) { # also 0xff, but the firmware avoids that |
561 | $scr .= "\e[m\xe2\x94\x82\e[K\n"; |
562 | $scr .= "\e[m\xe2\x94\x82\e[K\n"; |
562 | |
563 | |
563 | my $a1 = $M[$i + 1]; |
564 | my $a1 = $M[$i + 1]; |
… | |
… | |
566 | $i = 0x2000 + (($a1 * 256 + $a0) & 0xfff); |
567 | $i = 0x2000 + (($a1 * 256 + $a0) & 0xfff); |
567 | |
568 | |
568 | next line; |
569 | next line; |
569 | } |
570 | } |
570 | |
571 | |
|
|
572 | $scr .= $SGR[$prev_attr = $attr] |
571 | my $sgr = $SGR[ ($M[$i++ + 0x1000] & 15) | ($c & 0x80)]; |
573 | if $prev_attr != ($attr = ($M[$i++ + 0x1000] & 15) | ($c & 0x80)); |
572 | |
|
|
573 | $scr .= $prev_sgr = $sgr if $sgr ne $prev_sgr; |
|
|
574 | |
574 | |
575 | $scr .= $CHARMAP[$c & 0x7f]; |
575 | $scr .= $CHARMAP[$c & 0x7f]; |
576 | } |
576 | } |
577 | |
577 | |
578 | $scr .= "\e[K\nvideo overflow\e[K\n"; |
578 | $scr .= "\e[K\nvideo overflow\e[K\n"; |