--- vt102/vt102 2014/12/01 18:31:02 1.4 +++ vt102/vt102 2014/12/01 18:41:36 1.5 @@ -34,8 +34,7 @@ my $KBD = 1; ############################################################################# - -my $PTY; # the pty we allocated, if any +# rom initialising my $ROM = do { binmode DATA; @@ -58,7 +57,9 @@ } ############################################################################# +# cpu registers and I/O support +my $PTY; # the pty we allocated, if any my $PRSTATUS = 0; # 8080/8085 registers @@ -75,6 +76,7 @@ my $CLK; # rather inexact clock ############################################################################# +# the dreaded nvr1400 chip. not needed to get it going, but provided for reference # nvram my @NVR = (0x3fff) x 100; # vt102: 214e accum, 214f only lower 8 bit used, first 44 bytes @@ -82,35 +84,15 @@ my $NVRDATA; my $NVRLATCH; -#$NVR[$_] = $_ for 0..99;#d# - my @NVRCMD = ( - sub { # accept data - $NVRDATA = ($NVRDATA << 1) + $_[1]; - }, - sub { # accept addr - $NVRADDR = ($NVRADDR << 1)+ $_[1]; - }, - sub { # shift out - my $bit = $NVRDATA & 0x02000; - $NVRDATA *= 2; - $bit - }, - undef, - sub { # write - print "NVR WRITE $_[0]\n";#d# - $NVR[$_[0]] = $NVRDATA & 0x3fff; - }, - sub { # erase - print "NVR ERASE $_[0]\n";#d# - $NVR[$_[0]] = 0x3fff; - }, - sub { # read -# print "NVR READ $_[0] = $NVR[$_[0]]\n";#d# - $NVRDATA = $NVR[$_[0]]; - }, - sub { # standby - }, + sub { $NVRDATA = ($NVRDATA << 1) + $_[1]; }, # 0 accept data + sub { $NVRADDR = ($NVRADDR << 1) + $_[1]; }, # 1 accept addr + sub { ($NVRDATA <<= 1) & 0x4000 }, # 2 shift out + undef, # 3 not used, will barf + sub { $NVR[$_[0]] = $NVRDATA & 0x3fff; }, # 4 write + sub { $NVR[$_[0]] = 0x3fff; }, # 5 erase + sub { $NVRDATA = $NVR[$_[0]]; }, # 6 read + sub { }, # 7 standby ); my @bitidx; @@ -455,40 +437,15 @@ ############################################################################# my @chr = ( - " ", - "\x{29eb}", - "\x{2592}", - "\x{2409}", - "\x{240c}", - "\x{240d}", - "\x{240a}", - "\x{00b0}", - "\x{00b1}", - "\x{2424}", - "\x{240b}", - "\x{2518}", - "\x{2510}", - "\x{250c}", - "\x{2514}", - "\x{253c}", - "\x{23ba}", - "\x{23bb}", - "\x{2500}", - "\x{23bc}", - "\x{23bd}", - "\x{251c}", - "\x{2524}", - "\x{2534}", - "\x{252c}", - "\x{2502}", - "\x{2264}", - "\x{2265}", - "\x{03c0}", - "\x{2260}", - "\x{00a3}", - "\x{00b7}", + " " , "\x{29eb}", "\x{2592}", "\x{2409}", + "\x{240c}", "\x{240d}", "\x{240a}", "\x{00b0}", + "\x{00b1}", "\x{2424}", "\x{240b}", "\x{2518}", + "\x{2510}", "\x{250c}", "\x{2514}", "\x{253c}", + "\x{23ba}", "\x{23bb}", "\x{2500}", "\x{23bc}", + "\x{23bd}", "\x{251c}", "\x{2524}", "\x{2534}", + "\x{252c}", "\x{2502}", "\x{2264}", "\x{2265}", + "\x{03c0}", "\x{2260}", "\x{00a3}", "\x{00b7}", (map chr, 0x020 .. 0x7e), - "?", ); utf8::encode $_ for @chr; @@ -497,7 +454,7 @@ 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; - + line: for my $y (0 .. 25) { $scr .= sprintf "%2d |", ++$y; @@ -762,7 +719,7 @@ #$INTPEND |= 2 if @PUSARTRECV && $XON; # VT102, 6.5 rxrdy # kick off vertical retrace form time to time - unless ($CLK & 0x3ff) { + unless ($CLK & 0x1ff) { $RST |= 4; # vertical retrace }