checkpoint: VT1200 reverse-engineering workspace before board-model work
No files matched your search
@@ -0,0 +1,807 @@
|
||||
X Window Terminals
|
||||
|
||||
Björn Engberg and Thomas Porcher
|
||||
|
||||
1 Abstract
|
||||
|
||||
X window terminals occupy a niche between X window workstations
|
||||
and graphics terminals. The purpose of terminals in general is
|
||||
to provide low-cost user access to host computers or smaller
|
||||
dedicated systems. X window terminals further the advance in
|
||||
graphics terminals and provide new and interesting ways to
|
||||
utilize host systems. Ethernet cable provides for graphics
|
||||
performance previously not seen in terminals. The X Window
|
||||
System developed by MIT allows multiple applications to be
|
||||
displayed and controlled from the user's workstation. Now,
|
||||
with X window terminals, the same powerful user interface is
|
||||
available on host and other non-workstation computers. [The
|
||||
XTERMINALS paper starts here.]
|
||||
|
||||
In mid 1987, the Video, Image, and Print Systems (VIPS) Group
|
||||
began the design of Digital's first X window terminal, the
|
||||
VT1000 terminal and its code upgrade, the VT1200 terminal.
|
||||
Our goal was to design and implement an X window terminal that
|
||||
would allow the use of windowing capabilities on large computer
|
||||
systems. In 1989, Digital developed the VT1300 X terminal and
|
||||
in 1991 the VXT 2000 X terminal. The designs of these X window
|
||||
terminals are all quite different. Our design approach changed
|
||||
as the underlying technology changed.
|
||||
|
||||
This paper first compares host-system computing with applica-
|
||||
tions run on workstations. It summarizes the significance of the
|
||||
X Window System developed by MIT and discusses the client-server
|
||||
model. The paper then presents the need for X window terminals
|
||||
and follows their development stages. It compares and contrasts
|
||||
Digital's different design strategies for the VT1000, VT1200,
|
||||
and VT1300 X terminals. The paper concludes with a summary of
|
||||
the recently announced VXT 2000 X terminal.
|
||||
|
||||
|
||||
Digital Technical Journal Vol. 3 No. 4 Fall 1991 1
|
||||
X Window Terminals
|
||||
|
||||
|
||||
|
||||
2 Background
|
||||
|
||||
Before the development of the X Window System, there was very
|
||||
little overlap in functionality between workstations and other
|
||||
kinds of computers. Workstations had stunning and fast graph-
|
||||
ics, and many powerful applications were available on them.
|
||||
Those applications were not available to users of basic 80-
|
||||
by-24 character-cell text display terminals connected to a
|
||||
host system located in a clean room. Graphics terminals, of
|
||||
course, allowed the use of ReGIS or another protocol for math
|
||||
and business graphics, but their performance was far below the
|
||||
expectations of a workstation user. Few people have the patience
|
||||
to run, for example, a computer-aided design application on a
|
||||
VT240 terminal, assuming such a version of the application is
|
||||
available.
|
||||
|
||||
Although a workstation offers fast graphics capabilities, its
|
||||
applications sometimes need more CPU power or more disk space
|
||||
to do calculations in a timely fashion. Graphics applications
|
||||
written for workstations could not run on faster host computers,
|
||||
which did not provide a display. Nor was there a standard way
|
||||
to get data from the host to display on a workstation. Each
|
||||
application required a unique solution to this problem.
|
||||
|
||||
Since the introduction of the new client-server model of comput-
|
||||
ing and modern networks, many tasks can be divided into subtasks
|
||||
that can run on the most suitable processor. The X Window Sys-
|
||||
tem uses the client-server approach, as shown in Figure 1. The
|
||||
application is viewed as an X client, and a workstation or a
|
||||
terminal can run an X server that controls the display. The X
|
||||
server also controls input from the keyboard and mouse or other
|
||||
pointing devices.
|
||||
|
||||
An X client and an X server use an X wire to communicate, as
|
||||
shown in Figure 2. The X wire is simply a two-way error-free
|
||||
byte stream, which can be implemented in many different ways.
|
||||
The X Window System architecture does not stipulate how the X
|
||||
wire should be implemented, but several de facto standards have
|
||||
emerged. Manufacturers have designed X wires usually based on
|
||||
|
||||
2 Digital Technical Journal Vol. 3 No. 4 Fall 1991
|
||||
X Window Terminals
|
||||
|
||||
|
||||
|
||||
the data transport mechanisms that were available and conve-
|
||||
nient when the X Window System was implemented. The X wires use
|
||||
transmission control protocol/internet protocol (TCP/IP), DEC-
|
||||
net, Local Area Transport (LAT), and other protocols, and even
|
||||
shared memory buffers as a transport to avoid protocol over-
|
||||
head. A single implementation often supports several transport
|
||||
mechanisms.
|
||||
|
||||
The X server typically executes on a processor with display
|
||||
hardware. The X client can execute on almost any processor. It
|
||||
may execute on the same CPU as the X server, or it may execute
|
||||
on a host, another workstation, or a compute server. The X
|
||||
server can be connected to several X clients simultaneously,
|
||||
with any combination of local (running on the same CPU) or
|
||||
remote (running on another CPU) X clients. The X server treats
|
||||
local and remote clients equally.
|
||||
|
||||
3 Workstation Environment
|
||||
|
||||
Figure 3 compares a traditional non-X windowing workstation with
|
||||
an X windowing workstation. In both workstations the application
|
||||
must use a graphics library to communicate with the display
|
||||
hardware and software.
|
||||
|
||||
In an X windowing client environment, the library of routines
|
||||
is called Xlib. An application designer can choose from a wide
|
||||
variety of toolkits, which are essentially a level of additional
|
||||
library routines between the application and Xlib. The use of
|
||||
a toolkit can significantly reduce the amount of work an ap-
|
||||
plication programmer has to do. The application software, Xlib,
|
||||
optional toolkit, and other libraries compose the X client, as
|
||||
shown in Figure 4.
|
||||
|
||||
With few exceptions, the X server comes with the display hard-
|
||||
ware and input devices (keyboard and pointer) indicated in
|
||||
Figure 5.
|
||||
|
||||
|
||||
|
||||
Digital Technical Journal Vol. 3 No. 4 Fall 1991 3
|
||||
X Window Terminals
|
||||
|
||||
|
||||
|
||||
The X Window System with its flexibility neatly solves the prob-
|
||||
lems of CPU power and disk space versus display availability.
|
||||
Applications written for X can execute on a wide variety of com-
|
||||
puters, and the results can be displayed on any of a multitude
|
||||
of devices, even on a workstation that would not have the ca-
|
||||
pacity to run the application locally. Figure 6 shows how the X
|
||||
Window System fits into a network environment.
|
||||
|
||||
The X Window System has already generated many useful appli-
|
||||
cations, and its widespread popularity ensures that many more
|
||||
applications will be made available in the future.
|
||||
|
||||
4 Need for X Terminals
|
||||
|
||||
In a study to determine how workstations are used, the VIPS
|
||||
Group found that many users did not take advantage of the full
|
||||
potential of their workstations. In a software development or
|
||||
document editing environment, the users often set up their work-
|
||||
stations as terminals. They usually created a few terminal emu-
|
||||
lation windows and used SET HOST or RLOGIN commands to connect
|
||||
to a host system on which they stored their working environment
|
||||
and files. Only two features of a workstation were frequently
|
||||
used. Users kept several terminal emulators on their screens
|
||||
at the same time, and set the terminal emulator windows to be
|
||||
larger than 80 by 24 characters. Only rarely did the average
|
||||
workstation user take advantage of the full power of graphics
|
||||
applications.
|
||||
|
||||
The results of our study indicated a need for a cost-effective
|
||||
alternative to a workstation that would provide the features
|
||||
desired by a large number of users. We envisioned a new kind of
|
||||
terminal, one that would allow people to have multiple windows
|
||||
of arbitrary size, to connect with multiple hosts, and, since
|
||||
the X architecture allowed it, to be able to use the same kind
|
||||
of graphics as a workstation.
|
||||
|
||||
|
||||
|
||||
|
||||
4 Digital Technical Journal Vol. 3 No. 4 Fall 1991
|
||||
X Window Terminals
|
||||
|
||||
|
||||
|
||||
From an X architecture standpoint, X terminals and X worksta-
|
||||
tions are quite similar. They can in fact use the same hardware.
|
||||
For example, Digital's VT1300 terminal runs on the same hardware
|
||||
as the VAXstation 3100 workstation. X terminal software can also
|
||||
be made to run well on hardware platforms that are not suitable
|
||||
for workstations.
|
||||
|
||||
The main architectural difference between X terminal and X
|
||||
workstation software is that X terminals are closed systems
|
||||
that do not support local user applications. Although this
|
||||
may seem to be an unnecessary restriction, it does allow X
|
||||
terminals to be made for less money. An open system that allows
|
||||
any user application to run locally must have an established
|
||||
CPU architecture, a supported operating system, such as the VMS,
|
||||
UNIX, or ULTRIX system, and, subsequently, sufficient memory and
|
||||
/or disk space to support such an environment. A closed system,
|
||||
on the other hand, can be designed with simpler hardware, a
|
||||
smaller operating system, less memory, and thus lower cost. The
|
||||
absence of the ability to run user applications locally does
|
||||
not impact usability significantly since the user can run any
|
||||
desired application on another CPU. Digital's VT1000 and VT1200
|
||||
X terminals were designed based on this approach.
|
||||
|
||||
5 X Terminal Environment
|
||||
|
||||
X terminals often have local applications, but they must be
|
||||
built into the terminal by the designers. The VT1200 terminal
|
||||
has a video terminal emulator (VTE), a window manager, and a
|
||||
terminal manager as the local applications. The VTE allows the
|
||||
VT1200 terminal to make American National Standards Institute
|
||||
(ANSI) character-cell connections to a host, via the Ethernet
|
||||
or the serial lines. This capability makes the VT1200 terminal
|
||||
useful in an environment that does not have X window support.
|
||||
|
||||
Although any X server can run windows software, it does not
|
||||
provide a user interface. To manipulate the windows, the user
|
||||
needs a window manager. The window manager creates window frames
|
||||
that allow the user to invoke functions to move windows, resize
|
||||
|
||||
Digital Technical Journal Vol. 3 No. 4 Fall 1991 5
|
||||
X Window Terminals
|
||||
|
||||
|
||||
|
||||
windows, change stacking order, and use icons. This capability
|
||||
also makes the VT1200 terminal useful when no host is available
|
||||
to run a remote window manager. A terminal with a local window
|
||||
manager generates less network traffic, and window management is
|
||||
not slowed by host congestion or network round-trip delays. The
|
||||
VT1200 X terminal allows use of a remote window manager, if the
|
||||
user prefers a different style of window management.
|
||||
|
||||
The local terminal manager provides the user interface to initi-
|
||||
ate connections to host systems. It is also responsible for the
|
||||
terminal customization interface.
|
||||
|
||||
All clients communicate with the X server using standard X wire
|
||||
commands only. Any window manager, remote or local, can manage
|
||||
all the windows on the screen, regardless of whether the clients
|
||||
are remote or local.
|
||||
|
||||
6 Development of X Windor Terminals
|
||||
|
||||
The development process of the VT1000 and VT1200 X terminals has
|
||||
important lessons to teach us. The knowledge we gained in 1987
|
||||
has helped us develop future generations of X terminals.
|
||||
|
||||
When we designed the VT1000 X terminal and its code upgrade,
|
||||
the VT1200, we held many discussions within the group and with
|
||||
people from other groups. We planned many iterations before we
|
||||
arrived at the final architecture. It was by no means the only
|
||||
way to design an X terminal, and in 1989 we tried a different
|
||||
approach with the design of the VT1300 terminal. We knew that
|
||||
the best decision at a particular time might be very different
|
||||
from the best decision one year later, since the technical
|
||||
and marketing environment is constantly changing. New tools,
|
||||
standards, and practices enter the field while others become
|
||||
obsolete. Newer products must always have new features to meet
|
||||
changing technology requirements.
|
||||
|
||||
|
||||
|
||||
|
||||
6 Digital Technical Journal Vol. 3 No. 4 Fall 1991
|
||||
X Window Terminals
|
||||
|
||||
|
||||
|
||||
Hardware Platform
|
||||
|
||||
Our first step was to discuss the hardware platform and select
|
||||
the kind of CPU to use, memory size, I/O considerations, type of
|
||||
display, etc. We studied many different CPUs to determine which
|
||||
one would provide the most capabilities for the lowest cost.
|
||||
A VAX chip was rejected because, at the time, it was far too
|
||||
expensive for the required price range of the VT1000 terminal.
|
||||
The Motorola 68000 series CPUs are quite powerful, but we had
|
||||
to consider other factors such as availability of software and
|
||||
hardware tools, cross compilers and linkers that could run on
|
||||
VMS, and hardware debugging facilities of sufficient power.
|
||||
We finally selected Texas Instruments' TMS34010 microprocessor
|
||||
with video support and several built-in graphics instructions
|
||||
that made it a cost-effective solution. It also came with VMS
|
||||
development tools, a C compiler, an assembler and linker, a
|
||||
single-step, hardware trace buffer with disassembler, and a
|
||||
powerful in-circuit emulator that made it possible to control
|
||||
execution in detail, inspect registers and memory, and set
|
||||
break points and hardware watch points (for example, break when
|
||||
writing value x into location y).
|
||||
|
||||
We further discussed the kind of I/O to use. A sample imple-
|
||||
mentation of the MIT X server on a VAXstation 2000 workstation
|
||||
and a primitive serial line protocol showed, as expected, that
|
||||
serial lines were clearly insufficient to carry the X wire pro-
|
||||
tocol without some compression of the wire protocol itself.
|
||||
We had to build Digital's first X terminal with an Ethernet
|
||||
interface.
|
||||
|
||||
We needed to determine if this hardware platform could give us
|
||||
sufficient performance. We made several performance estimates,
|
||||
based on what little we knew then about the X server and other
|
||||
software components. We went through each step in as much detail
|
||||
as we could (before anything was built). We calculated how
|
||||
many instructions were necessary to perform each task in the
|
||||
chain of receiving a command and displaying it on the screen.
|
||||
By knowing the speed of the CPU, we could estimate performance
|
||||
in characters or vectors per second. Our estimates showed that
|
||||
|
||||
Digital Technical Journal Vol. 3 No. 4 Fall 1991 7
|
||||
X Window Terminals
|
||||
|
||||
|
||||
|
||||
the VT1000 X terminal would not be exceedingly fast, but the
|
||||
performance would most probably be sufficient, definitely faster
|
||||
than a VAXstation 2000 in most cases.
|
||||
|
||||
In retrospect, actual performance of the VT1000 terminal and the
|
||||
later software upgrade, the VT1200, was close to our estimates,
|
||||
but it took several passes of code optimization to achieve such
|
||||
performance.
|
||||
|
||||
We also discussed alternate hardware designs for performance
|
||||
improvements. One solution proposed two CPUs, the TMS34010
|
||||
microprocessor to handle the display and a 68000 microprocessor
|
||||
to handle I/O and other tasks. Unfortunately, we found no easy
|
||||
way to balance the workload between the two CPUs. We estimated
|
||||
that the different software components would have the following
|
||||
relative CPU demands:
|
||||
|
||||
Interrupts, 5 percent
|
||||
Communications, 10 percent
|
||||
Operating system, 5 percent
|
||||
X server (minus display routines), 60 percent
|
||||
Display routines, 20 percent
|
||||
|
||||
To equalize the load between the CPUs, we would have had to
|
||||
split the X server in two, a solution that was not feasible.
|
||||
Any other split of tasks would cause one CPU to spend most of
|
||||
its time waiting for the other, and the overall performance
|
||||
gain would be minimal. Communication between multiple CPUs is
|
||||
complex and is very difficult to debug. Therefore, we decided
|
||||
that two CPUs were not worth the trouble or the cost. The best
|
||||
way to double performance is to install a single CPU that is
|
||||
twice as fast. At that time, the TMS34020 was already being
|
||||
mentioned as a follow-up microprocessor. Since its software
|
||||
would be compatible with the TMS34010, we decided to keep it in
|
||||
mind for possible use in a future terminal.
|
||||
|
||||
|
||||
|
||||
|
||||
8 Digital Technical Journal Vol. 3 No. 4 Fall 1991
|
||||
X Window Terminals
|
||||
|
||||
|
||||
|
||||
Code Selection
|
||||
|
||||
The use of read-only memory (ROM)-based code versus downloaded
|
||||
code has been debated for some time. ROM-based code starts up
|
||||
faster and incurs less network traffic at startup time (espe-
|
||||
cially on a site with many X terminals), but is not flexible
|
||||
when software is upgraded. On the other hand, downloaded code
|
||||
can be easily distributed. An entire site can be upgraded with
|
||||
one or a few installations by a system manager as opposed to
|
||||
changing ROMs in a large number of terminals. (With the VT1200
|
||||
X terminal, customers can change ROM boards.) From the point
|
||||
of view of terminal business, it made sense to use ROM-based
|
||||
code in 1987. We reasoned that not all sites would have Eth-
|
||||
ernet, but with ROMs the X terminal would still be useful as a
|
||||
multiwindow terminal emulator. We realized that such concerns
|
||||
would change with time, and on the whole, downloaded code would
|
||||
become the better approach. The only exceptions would be in the
|
||||
home or small office markets where a boot host or an Ethernet
|
||||
might not be available. Subsequent X terminals are being made in
|
||||
both downloaded (for example, in the VT1300 terminal) and ROM
|
||||
versions.
|
||||
|
||||
Operating System Selection
|
||||
|
||||
Next we considered which operating system to use. We looked at
|
||||
other vendors' operating systems, but found they were either too
|
||||
complex and big or inadequate. One of our coworkers had written
|
||||
a very compact operating system for a VAX system used on another
|
||||
project. We used it in our prototype and then adapted it for the
|
||||
TMS34010 processor. We implemented additional functions to run
|
||||
the rest of the software with minimum changes.
|
||||
|
||||
There are many advantages to working with "your own" operat-
|
||||
ing system. It is easy to make changes, to work around tricky
|
||||
problems, and to make special enhancements. But operating sys-
|
||||
tem code is difficult to debug. Timing is very critical, and
|
||||
throughout the project, we found strange bugs in code that had
|
||||
initially appeared to be all right to everyone involved. We
|
||||
found bugs under heavy load conditions after a rare sequence of
|
||||
|
||||
Digital Technical Journal Vol. 3 No. 4 Fall 1991 9
|
||||
X Window Terminals
|
||||
|
||||
|
||||
|
||||
events uncovered little timing windows and race conditions that
|
||||
had not been handled properly. Even with in-circuit emulators,
|
||||
such bugs could take weeks to track down.
|
||||
|
||||
In the VT1300 we decided to use the VAXELN operating system. We
|
||||
wanted to avoid the possibility of time wasted on finding and
|
||||
patching holes in the design of a new operating system.
|
||||
|
||||
Local Terminal Manager
|
||||
|
||||
The VT1000 X terminal is self-starting at power-up, but without
|
||||
a host system, it needs a local user interface. We decided that
|
||||
this interface should resemble a workstation session manager and
|
||||
thus called it the local terminal manager. Although it covers
|
||||
a different set of functions, we wanted the local terminal
|
||||
manager to implement a similar set of objects and operations
|
||||
(the "look and feel" or style) of a workstation session manager.
|
||||
The style of the DECwindows session manager was chosen to make
|
||||
it easier for a user to switch between an X terminal and a
|
||||
DECwindows workstation. We wrote a subset toolkit for all the
|
||||
"customize" screens and ensured that the VTE could use the same
|
||||
subset toolkit for its "customize" screens. As DECwindows has
|
||||
progressed, subsequent X terminals have adapted the new user
|
||||
interface preferences, in this case Motif.
|
||||
|
||||
Local Terminal Emulator
|
||||
|
||||
We considered a local terminal emulator to be an important
|
||||
component. We knew that X-based terminal emulators could run on
|
||||
the host, but in 1987 hosts with X windowing support were rare.
|
||||
Since we were in the terminal group, a terminal that could not
|
||||
manipulate ordinary text by itself was considered unsellable.
|
||||
We wanted the ability to access both X and non-X hosts and we
|
||||
wanted to support multiple text windows. Therefore we defined
|
||||
the terminal emulator as an X client so that text windows could
|
||||
coexist with X client windows. This feature has proved to be
|
||||
exceptionally popular. A large number of users use nothing but
|
||||
video terminal emulator windows. They are not interested in
|
||||
|
||||
10 Digital Technical Journal Vol. 3 No. 4 Fall 1991
|
||||
X Window Terminals
|
||||
|
||||
|
||||
|
||||
X windowing graphics, but do want multiple and/or larger text
|
||||
windows on a large screen.
|
||||
|
||||
Local Window Manager
|
||||
|
||||
We debated whether or not to implement a local window manager.
|
||||
The DECwindows window manager was under development and was con-
|
||||
stantly changing. The DECwindows window manager contained far
|
||||
too many VMS dependencies to be ported easily. Also the X ter-
|
||||
minal did not have enough memory to run the DECwindows toolkit
|
||||
locally. We could have ported other window managers, but they
|
||||
lacked the essential characteristics of the DECwindows window
|
||||
manager. For a while we considered letting the local clients
|
||||
have a primitive way to manage their own windows, until a full-
|
||||
featured window manager could be started on a host. Again, this
|
||||
alternative lacked the DECwindows system's qualities. We even-
|
||||
tually decided to write a window manager based only on Xlib and
|
||||
our subset toolkit calls. It has the essential characteristics
|
||||
of the DECwindows product. Also, since the DECwindows window
|
||||
manager of necessity would keep changing, we wrote the local
|
||||
window manager in such a way that it could relinquish control to
|
||||
a remote window manager. This solution gave us the most flexi-
|
||||
bility for this hardware platform. The recently announced VXT
|
||||
2000 X terminal has been designed with virtual memory to accom-
|
||||
modate a well-established unmodified window manager, the Motif
|
||||
Window Manager.
|
||||
|
||||
X Server
|
||||
|
||||
We also needed to choose an X server. We could have based our
|
||||
code on the distribution tape from MIT, but at the time the X
|
||||
Window System was not yet a mature product. Every implementor
|
||||
had to spend considerable time stabilizing the implementation
|
||||
enough to yield a product and improve performance. Since the
|
||||
VMS DECwindows Group had been writing code for the server, we
|
||||
decided to use DECwindows code. Once the porting effort started,
|
||||
we found that most of the performance had been improved by VAX
|
||||
MACRO code. Consequently, we had to re-engineer all the modules
|
||||
or adapt new ones from the MIT tape. As we kept porting and
|
||||
|
||||
Digital Technical Journal Vol. 3 No. 4 Fall 1991 11
|
||||
X Window Terminals
|
||||
|
||||
|
||||
|
||||
enhancing performance, our code changed more and more until
|
||||
it became extremely difficult to track bug fixes made by the
|
||||
DECwindows Group. The MIT patches were also nearly impossible to
|
||||
use because of code changes and because our starting code was
|
||||
one step removed from the tape.
|
||||
|
||||
Today the MIT X server is a mature product; patches and bug
|
||||
fixes are readily available from MIT and the X community. In our
|
||||
current X terminals, the high degree of portability of the MIT
|
||||
X server allows us to keep most of the MIT X server source code
|
||||
almost unchanged so patches are easily applied.
|
||||
|
||||
Communications Protocol
|
||||
|
||||
Many communications protocols were available, but our choice
|
||||
was dictated by market pressures rather than technical reasons.
|
||||
The market demanded TCP/IP. DECnet would have been acceptable,
|
||||
but it was running out of available addresses, at least within
|
||||
Digital. DECnet address space supports only 64,000 nodes and
|
||||
requires manual address and name assignments. After waiting
|
||||
weeks to get addresses for a few workstations, we realized that
|
||||
adding thousands of X terminals into Digital's internal network
|
||||
would not be possible. DECnet Phase V software has solved this
|
||||
problem.
|
||||
|
||||
Next we looked at the LAT protocol used by Digital terminal
|
||||
servers and found that it had several advantages. First, the
|
||||
VMS operating system supports the LAT protocol. LAT uses unique
|
||||
48-bit Ethernet addresses to identify each node, which allows a
|
||||
large node address space. LAT also does not require any system
|
||||
management to add another terminal. A user can connect a termi-
|
||||
nal to a power source, and the terminal automatically becomes
|
||||
part of the network. Our performance evaluations found that the
|
||||
LAT interface on the host could be written to incur less host
|
||||
overhead than DECnet, which is important when many X terminals
|
||||
are connected to hosts.
|
||||
|
||||
|
||||
|
||||
12 Digital Technical Journal Vol. 3 No. 4 Fall 1991
|
||||
X Window Terminals
|
||||
|
||||
|
||||
|
||||
Changes were needed in the VMS LAT driver to accommodate X wire
|
||||
and font service connections. The VMS Software Engineering Group
|
||||
worked with us to ensure that we would have those changes on
|
||||
schedule and in the appropriate VMS releases. As a result, we
|
||||
chose the LAT protocol for the VMS community and TCP/IP for
|
||||
users of ULTRIX and UNIX systems.
|
||||
|
||||
Font File System
|
||||
|
||||
Storing fonts and changing font file formats were major prob-
|
||||
lems. Since the VT1000 X terminal did not have a local file
|
||||
system, some fonts had to be stored in ROM to allow the VT1000
|
||||
terminal to function in standalone mode. A quick review of the
|
||||
available DECwindows fonts showed that not all of them fit in
|
||||
the ROM space allowed for the terminal. Furthermore, customer-
|
||||
designed fonts or new font releases could not be accommodated.
|
||||
The solution was to be able to read fonts from a host system.
|
||||
This approach provided a font service on VMS, and enabled font
|
||||
files to be read over the Internet. We designed a process called
|
||||
the font daemon to run on the VMS operating system. This process
|
||||
could deliver font data on request to one or several VT1000 ter-
|
||||
minals. The VMS font daemon uses the LAT protocol to deliver the
|
||||
fonts and protects somewhat against font file format changes. In
|
||||
many ways, the design of the font daemon makes it a precursor
|
||||
to a general font server, and it is very similar to the X Font
|
||||
Server being delivered by MIT in the latest release of the X
|
||||
Windows System.
|
||||
|
||||
To use the font service, the terminal user must specify a font
|
||||
path in the VT1200 local terminal manager. Specifying a host
|
||||
name is sufficient to access the default font path, although
|
||||
users with their own font files can optionally search other
|
||||
directories. At startup, the VT1200 terminal makes a font con-
|
||||
nection to the host's font service and delivers the font path
|
||||
specification to the font service. The font service sends font
|
||||
names and other basic font information about all the fonts in
|
||||
the selected path. When the VT1200 X server needs a font, the
|
||||
VT1200 first searches the ROM-based fonts; if it is not there, a
|
||||
request to read the font is sent to the font daemon. The daemon
|
||||
|
||||
Digital Technical Journal Vol. 3 No. 4 Fall 1991 13
|
||||
X Window Terminals
|
||||
|
||||
|
||||
|
||||
sends the required information to the VT1200, and the X server
|
||||
can display characters from that font. Since memory is limited,
|
||||
the VT1200 has font caching, a mechanism to discard fonts no
|
||||
longer used or to discard the least used fonts. Our current X
|
||||
terminals increase the robustness of the font mechanism; for
|
||||
example, they provide recovery should the font service or its
|
||||
host become unavailable.
|
||||
|
||||
The special LAT code that we used on VMS systems for the font
|
||||
service was not available on UNIX and ULTRIX operating systems.
|
||||
Since internet protocol (IP) was available, we could use the
|
||||
trivial file transfer protocol (TFTP) to read a file from a host
|
||||
system, if the system manager set the proper protections. We
|
||||
chose TFTP for its ease of implementation and its wide avail-
|
||||
ability on UNIX and ULTRIX systems. The TFTP font path in a
|
||||
VT1200 terminal specifies a host IP address and a complete path
|
||||
to a file (usually named font.paths) that contains the complete
|
||||
path to all the font files that the VT1200 can use. The terminal
|
||||
can then access all those font files, again through TFTP, to
|
||||
obtain font names and other basic information about each font.
|
||||
When a client wishes to use a font, the proper font file can
|
||||
be read again, this time to load the complete font. Since this
|
||||
process is time-consuming, the font path pointing to the file
|
||||
has an alternate format in which the font name follows the com-
|
||||
plete path to each file. Using this alternate format, the VT1200
|
||||
terminal does not have to open and read the font file until a
|
||||
client actually intends to use it.
|
||||
|
||||
7 Comparison of X Terminals
|
||||
|
||||
The VT1200 and VT1300 X window terminals were built using dif-
|
||||
ferent approaches to solve the problems encountered during de-
|
||||
velopment. The X terminal is a new and flexible concept; there
|
||||
is no single "best" design. Table 1 compares the most impor-
|
||||
tant differences between the two terminals. We also include the
|
||||
specifics for the VXT 2000 X terminal.
|
||||
|
||||
|
||||
|
||||
14 Digital Technical Journal Vol. 3 No. 4 Fall 1991
|
||||
X Window Terminals
|
||||
|
||||
|
||||
|
||||
|
||||
Digital Technical Journal Vol. 3 No. 4 Fall 1991 15
|
||||
X Window Terminals
|
||||
|
||||
|
||||
|
||||
________________________________________________________________
|
||||
|
||||
Table_1:__Comparison_of_X_Window_Terminals______________________
|
||||
|
||||
VT1200 VT1300 VXT 2000
|
||||
|
||||
Monochrome only Color only Monochrome and
|
||||
color
|
||||
|
||||
1 bit plane 4 or 8 bit planes 1 or 8 bit planes
|
||||
|
||||
Code in ROM Code downloaded Code downloaded
|
||||
|
||||
No virtual memory No virtual memory Virtual memory
|
||||
|
||||
2 to 4MB RAM 8 to 32MB RAM 4 to 16MB RAM
|
||||
|
||||
TMS34010 CPU VAX CPU VAX CPU
|
||||
|
||||
Special operating VAXELN operating Special operating
|
||||
system system system
|
||||
|
||||
Local clients: No local clients Local clients:
|
||||
Terminal manager Terminal manager
|
||||
Window manager Motif window
|
||||
Video terminal manager
|
||||
emulator DECterm terminal
|
||||
emulator
|
||||
|
||||
Local customization Customized on host Local customiza-
|
||||
just as a worksta- tion
|
||||
tion Centralized cus-
|
||||
tomization
|
||||
|
||||
Choice of host Automatic X window Choice of host(LAT
|
||||
(LAT only) login to boot host and TCP/IP using
|
||||
XDMCP)
|
||||
|
||||
LAT protocol DECnet protocol LAT protocol
|
||||
|
||||
TCP/IPgprotocolhnical JTCP/IP Vol.o3oNo. 4 FallC1991 protocol
|
||||
|
||||
Special hardware Available on sev- Uses standard
|
||||
eral hardware
|
||||
workstation plat-
|
||||
_______________________forms____________________________________
|
||||
X Window Terminals
|
||||
|
||||
|
||||
|
||||
The VT1200 is ROM-based; all its software is permanently resi-
|
||||
dent in the terminal. The VT1300 software is downloaded, so a
|
||||
host or bootserver on the same network must supply the terminal
|
||||
with a load image at power-up.
|
||||
|
||||
Since downloaded terminals are dependent on the existence of
|
||||
at least one working host system, the user interface can be
|
||||
designed differently. While the VT1200 X terminal has a built-in
|
||||
user interface, the VT1300 does not need it. The VT1300 terminal
|
||||
automatically makes an X connection to a host at power-up, and
|
||||
the user is presented with the same DECwindows login box as on a
|
||||
workstation. The VT1300 has no local clients; all clients run on
|
||||
the host system.
|
||||
|
||||
The VT1200 terminal uses the LAT protocol for its ease of use
|
||||
and minimal network management demands. The VT1300 terminal uses
|
||||
the DECnet software already implemented in the VAXELN operating
|
||||
system used internally. Both terminals support TCP/IP.
|
||||
|
||||
8 VXT 2000 X Terminal
|
||||
|
||||
One problem that has plagued all X terminals is limited memory
|
||||
space. Workstations usually have a virtual memory system, which
|
||||
provides large paging and swap areas on a disk, and applications
|
||||
and X servers can use more memory space than the hardware has.
|
||||
Until now X terminals have not had virtual memory systems. If
|
||||
too many applications made excessive demands, or if a client
|
||||
created large off-screen images (called "pixmaps" in the X Win-
|
||||
dow System) the terminals quickly used all memory space. If the
|
||||
X server implementation was correct, an error was reported and
|
||||
a client might try a less demanding approach. In other cases,
|
||||
the terminal or client might simply crash. One alternative was
|
||||
to install more memory in the X terminal, although this can be
|
||||
costly and offers no guarantees.
|
||||
|
||||
|
||||
|
||||
|
||||
Digital Technical Journal Vol. 3 No. 4 Fall 1991 17
|
||||
X Window Terminals
|
||||
|
||||
|
||||
|
||||
In the next generation of Digital's X terminals, the VXT 2000,
|
||||
this problem has found a cost-effective solution. Based on the
|
||||
VAX architecture, the VXT 2000 terminal uses virtual memory and
|
||||
downloaded code. The Digital InfoServer, an Ethernet storage
|
||||
server, provides the load image, virtual memory paging space,
|
||||
fonts, and customization storage. The same InfoServer also
|
||||
solves another problem: now the X terminal has access to a file
|
||||
system. This allows more extensive customization, as well as
|
||||
centralized management of the customization of all X terminals
|
||||
on the network. Figure 8 shows the configuration for the VXT
|
||||
2000 X terminal.
|
||||
|
||||
|
||||
9 Conclusion
|
||||
|
||||
X terminals are not intended to replace workstations. Nor will
|
||||
workstations replace host systems or completely displace X ter-
|
||||
minals in the foreseeable future. It is likely that host comput-
|
||||
ers will always be faster and have more memory and disk space
|
||||
than reasonably priced workstations of the same era. It is also
|
||||
likely that terminals can be built cheaper than workstations of
|
||||
reasonable performance for some time to come. As long as that is
|
||||
the case, there will be a market for X terminals and host sys-
|
||||
tems. Future X terminals will be faster, and have more built-in
|
||||
functionality, more local applications, X extensions, and most
|
||||
likely, additional hardware features. X terminals will be the
|
||||
networked terminals of the 1990s.
|
||||
|
||||
10 Acknowledgements
|
||||
|
||||
We wish to thank the members of the VT1200 development team
|
||||
who worked many long hours on this project. Thanks to everyone
|
||||
inside and outside the Video, Image and Print Systems Group who
|
||||
contributed helpful suggestions, constructive criticism, and
|
||||
important hours using and testing the products. Thanks to the
|
||||
LAT and VMS Software Engineering Groups for incorporating the
|
||||
changes needed for the VT1200 X terminal to be useful. Thanks to
|
||||
|
||||
|
||||
18 Digital Technical Journal Vol. 3 No. 4 Fall 1991
|
||||
X Window Terminals
|
||||
|
||||
|
||||
|
||||
the VIPS Quality Group for ensuring that as few bugs as possible
|
||||
remained in the product when shipped.
|
||||
|
||||
Björn Engberg As a principal software engineer in the Video,
|
||||
Image and Print Systems Group, Björn Engberg was the main ar-
|
||||
chitect and software project leader for the VT1000 and VT1200
|
||||
X window terminals. He joined Digital in 1978 and worked as
|
||||
a development engineer at CSS in Sweden, where he modified
|
||||
Digital's terminals for the European market. He relocated to
|
||||
the United States in 1982 to work on the VT240, the VT320, the
|
||||
LJ250, and several advanced development projects. Björn received
|
||||
an M.S.E.E. (honors) from the Royal Institute of Technology in
|
||||
Stockholm.
|
||||
|
||||
Thomas C. Porcher Principal engineer Tom Porcher is a member of
|
||||
the Video, Image and Print Systems Group. He provided techni-
|
||||
cal leadership in the development of the VXT 2000 X terminal.
|
||||
Previously he was a technical leader for the VT240 terminal,
|
||||
VAX Session Support Utility, and the DECterm terminal emulator.
|
||||
Tom holds five patents for work on the VT240 terminal and on
|
||||
the multisession protocol used in the VT340 and VT400 series
|
||||
terminals. Tom received his B.S. in mathematics from Stevens
|
||||
Institute of Technology (1975). He is a member of the ACM.
|
||||
|
||||
DECnet, DECwindows, Digital, LAT, ULTRIX, VAX, VAXELN, VMS,
|
||||
VT1000, VT1200, VT1300, and VXT 2000 are trademarks of Digital
|
||||
Equipment Corporation.
|
||||
|
||||
UNIX is a registered trademark of UNIX System Laboratories, Inc.
|
||||
|
||||
|
||||
|
||||
|
||||
Digital Technical Journal Vol. 3 No. 4 Fall 1991 19
|
||||
=============================================================================
|
||||
Copyright 1991 Digital Equipment Corporation. Forwarding and copying of this
|
||||
article is permitted for personal and educational purposes without fee
|
||||
provided that Digital Equipment Corporation's copyright is retained with the
|
||||
article and that the content is not modified. This article is not to be
|
||||
distributed for commercial advantage. Abstracting with credit of Digital
|
||||
Equipment Corporation's authorship is permitted. All rights reserved.
|
||||
=============================================================================
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
|
||||
@@ -0,0 +1,311 @@
|
||||
EK–V1000–RC–003
|
||||
|
||||
|
||||
VT1000/VT1200 Video Terminal
|
||||
|
||||
Installing Optional Memory
|
||||
|
||||
|
||||
This card describes how to install optional RAM (random access
|
||||
memory) into your VT1000 or VT1200 video terminal. A detailed
|
||||
installation procedure also appears in Installing and Using the
|
||||
VT1000 Video Terminal and Installing and Using the VT1200 Video
|
||||
Terminal.
|
||||
The VT1000 terminal comes with 1 megabyte of base memory.
|
||||
The VT1200 terminal comes with 2 megabytes of base memory.
|
||||
You can add 1, 2, or 3 megabytes of optional memory, for a total
|
||||
of up to 4 megabytes. Optional memory comes on 1-megabyte
|
||||
SIMM cards (single in-line memory module), which install on the
|
||||
terminal’s memory controller board.
|
||||
|
||||
CAUTION
|
||||
The memory controller board and the SIMM cards can be
|
||||
damaged by electrostatic discharge. Handle the memory
|
||||
controller board by its cover or strap. Handle the SIMM
|
||||
card by the side edges of the card. Avoid contact with any
|
||||
components or circuitry within the system box.
|
||||
Digital recommends using a grounding wrist strap and
|
||||
an antistatic mat to perform the installation, if available.
|
||||
Otherwise, Digital recommends that you frequently touch
|
||||
the metal chassis of the system box during installation, to
|
||||
neutralize any existing static charges.
|
||||
2
|
||||
|
||||
|
||||
Unpack and check the contents of the box.
|
||||
|
||||
You should receive the correct number of 1-megabyte SIMM cards
|
||||
you ordered. You will install the SIMM cards on the memory
|
||||
controller board inside the system box.
|
||||
VT1000 only: You will also receive a memory controller board,
|
||||
if necessary. The board comes with a 1-megabyte SIMM card
|
||||
already installed.
|
||||
Carefully inspect the components for shipping damage. If you have
|
||||
any missing or damaged items, contact your sales representative
|
||||
and delivery agent.
|
||||
|
||||
Remove the system box cover.
|
||||
|
||||
1. Turn the system box’s | /O power switch off (O).
|
||||
2. Turn the monitor’s | /O power switch off (O).
|
||||
3. Disconnect the two power cords from the rear of the system
|
||||
box.
|
||||
4. Disconnect the monitor video cable from the rear of the
|
||||
monitor.
|
||||
5. Remove the monitor from the top of the system box. You may
|
||||
need two people.
|
||||
6. Release the top cover of the system box by pressing in the
|
||||
two push tabs on the side of the box with the power switch,
|
||||
as shown.
|
||||
7. Slowly lift the top cover until you release the hinges on the
|
||||
other side of the box. Then lift the top cover completely off
|
||||
the system box.
|
||||
3
|
||||
|
||||
|
||||
|
||||
|
||||
23 4
|
||||
2 5
|
||||
6
|
||||
|
||||
|
||||
|
||||
|
||||
22%
|
||||
|
||||
|
||||
|
||||
GSF_0839_89.DG
|
||||
4
|
||||
|
||||
|
||||
Identify the components in the system box.
|
||||
|
||||
There are five major components in the system box.
|
||||
|
||||
1 System logic board
|
||||
2 RAM controller board
|
||||
3 SIMM card (installed on the other side of the RAM
|
||||
controller board)
|
||||
4 ROM memory board
|
||||
5 Power supply
|
||||
|
||||
|
||||
2
|
||||
3
|
||||
|
||||
4
|
||||
1
|
||||
5
|
||||
|
||||
|
||||
|
||||
|
||||
23 4
|
||||
2 5
|
||||
6
|
||||
|
||||
|
||||
|
||||
|
||||
22%
|
||||
|
||||
|
||||
GSF_1362_89.DG
|
||||
5
|
||||
|
||||
|
||||
Remove the memory controller board (if installed).
|
||||
|
||||
1. Release the standoff clips by gently pushing each clip away
|
||||
from the board and lifting up on the edges of the board.
|
||||
2. Grasp the strap of the memory controller board and pull up
|
||||
firmly to release the memory controller board connector from
|
||||
the system logic board.
|
||||
3. Place the board on top of the power supply’s metal cover,
|
||||
with the strap side down. Use the metal cover as a work
|
||||
surface to perform the SIMM card installation.
|
||||
|
||||
|
||||
|
||||
|
||||
GSF_0957_89.DG
|
||||
|
||||
|
||||
|
||||
|
||||
22% of full size
|
||||
then imod scaled at 1.5
|
||||
6
|
||||
|
||||
|
||||
Install the SIMM cards on the memory controller board.
|
||||
|
||||
1. Remove the small SIMM card(s) from the shipping bag.
|
||||
VT1000 only: Also remove the new memory controller board,
|
||||
if ordered.
|
||||
2. Place the SIMM cards and memory controller board on top
|
||||
of the power supply’s metal cover, with the strap side of the
|
||||
memory controller board facing down. Use the metal cover
|
||||
as a work surface to install the SIMM cards. This prevents
|
||||
electrostatic damage.
|
||||
3. The memory controller board has one SIMM card preinstalled
|
||||
in the connector labeled 2MB. Install the next SIMM card in
|
||||
the connector labeled 3MB and the last SIMM card in the
|
||||
connector labeled 4MB, as follows.
|
||||
|
||||
CAUTION
|
||||
SIMM cards can be damaged by electrostatic discharge.
|
||||
Handle the SIMM card by the side edges of the card.
|
||||
Avoid contact with the gold contact fingers on the card.
|
||||
7
|
||||
|
||||
|
||||
a. Insert the SIMM card into the connector at a 45-degree
|
||||
angle. Face the components on the SIMM card toward
|
||||
the components on the memory controller board. Line
|
||||
up the center key slot on the SIMM card with the
|
||||
connector key on the memory controller board.
|
||||
b. Push down on the top of the SIMM card to securely seat
|
||||
the card in the connector.
|
||||
c. Raise the SIMM card into a standup position, until both
|
||||
sides of the card lock into the connector.
|
||||
|
||||
|
||||
|
||||
|
||||
4M
|
||||
B
|
||||
3M
|
||||
B
|
||||
2M
|
||||
B
|
||||
|
||||
|
||||
|
||||
0 %
|
||||
a t 7
|
||||
DG
|
||||
T.
|
||||
DI
|
||||
_E
|
||||
RD
|
||||
OA
|
||||
_B
|
||||
M
|
||||
RA
|
||||
|
||||
|
||||
|
||||
|
||||
3M
|
||||
B
|
||||
|
||||
|
||||
|
||||
|
||||
3M
|
||||
B
|
||||
|
||||
GSF_0840_89.DG
|
||||
8
|
||||
|
||||
|
||||
Install the memory controller board into the system box.
|
||||
|
||||
1. Grasp the strap of the memory controller board.
|
||||
2. Carefully place the board on top of its connector and standoffs
|
||||
in the system box. Use the standoffs as guides to align the
|
||||
connector on the board with the logic board connector.
|
||||
3. Press down firmly on the board and its edges to seat the
|
||||
connector and lock each of the four standoff clips.
|
||||
|
||||
|
||||
|
||||
|
||||
GSF_0842_89.DG
|
||||
|
||||
|
||||
|
||||
NOTE
|
||||
If you have problems, recheck the installation procedures
|
||||
carefully. If the problem continues, contact Digital
|
||||
Customer Services.
|
||||
9
|
||||
|
||||
|
||||
Replace the system box cover.
|
||||
|
||||
1. From the rear of the system box, place the left side of the top
|
||||
cover onto the hinge tabs in the left side of the system box.
|
||||
2. Gently lower the right side of the top cover onto the system
|
||||
box. Make sure the power connector frame slides into the
|
||||
slot behind the power connectors.
|
||||
3. Push down on the right side of the top cover until it snaps
|
||||
into the two push tabs, locking it in place.
|
||||
|
||||
|
||||
|
||||
|
||||
23 4
|
||||
2 5
|
||||
6
|
||||
|
||||
|
||||
|
||||
|
||||
22%
|
||||
|
||||
|
||||
|
||||
GSF_0959_89.DG
|
||||
|
||||
|
||||
|
||||
|
||||
4. Place the monitor on top of the system box.
|
||||
5. Connect the two power cords to the rear of the system box.
|
||||
6. Connect the monitor video cable to rear of the monitor.
|
||||
7. Turn the system box’s | /O power switch on ( | ).
|
||||
8. Turn the monitor’s | /O power switch on ( | ).
|
||||
10
|
||||
|
||||
|
||||
Verify the installation.
|
||||
|
||||
The Terminal Manager window should be displayed on your
|
||||
screen. Find the Memory Remaining scale on the bottom of the
|
||||
VT1000
|
||||
Verify that the number on the right side of the Memory Remaining
|
||||
scale displays the correct number of total megabytes in your
|
||||
system.
|
||||
|
||||
Number
|
||||
Standard + Optional = Displayed
|
||||
|
||||
|
||||
VT1200
|
||||
2 megabytes 1 megabyte 3M
|
||||
2 megabytes 4M
|
||||
|
||||
VT1000
|
||||
1 megabyte 1 megabyte 2M
|
||||
2 megabytes 3M
|
||||
3 megabyte 4M
|
||||
|
||||
|
||||
NOTE
|
||||
If you have problems, recheck the installation procedures
|
||||
carefully. If the problem continues, contact Digital Customer
|
||||
Services.
|
||||
|
||||
|
||||
The installation procedure is complete.
|
||||
|
||||
|
||||
Copyright © by Digital Equipment Corporation 1990
|
||||
All Rights Reserved. Printed in Singapore.
|
||||
VT1000 and VT1200 are trademarks of Digital Equipment
|
||||
Corporation.
|
||||
|
||||
@@ -0,0 +1,234 @@
|
||||
EK-V1000-RN-005
|
||||
|
||||
|
||||
|
||||
|
||||
VT1000 VIDEO TERMINAL V2.0
|
||||
RELEASE NOTES
|
||||
|
||||
|
||||
|
||||
|
||||
This document describes problems, corrections, and restrictions that pertain
|
||||
to V2.0 of the VT1000 Video Terminal firmware.
|
||||
|
||||
|
||||
|
||||
|
||||
Digital Equipment Corporation
|
||||
July 1990
|
||||
The information in this document is subject to change without notice and should
|
||||
not be construed as a commitment by Digital Equipment Corporation. Digital
|
||||
Equipment Corporation assumes no responsibility for any errors that may appear
|
||||
in this document.
|
||||
The software described in this document is furnished under a license and may
|
||||
be used or copied only in accordance with the terms of such license.
|
||||
No responsibility is assumed for the use or reliability of software on equipment
|
||||
that is not supplied by Digital Equipment Corporation or its affiliated companies.
|
||||
Restricted Rights: Use, duplication, or disclosure by the U. S. Government is
|
||||
subject to restrictions as set forth in subparagraph ( c ) ( 1 ) ( ii ) of the Rights
|
||||
in Technical Data and Computer Software clause at DFARS 252.227–7013.
|
||||
Copyright © by Digital Equipment Corporation 1990
|
||||
All Rights Reserved.
|
||||
|
||||
|
||||
FCC NOTICE: The equipment described in this manual generates, uses, and
|
||||
may emit radio frequency energy. The equipment has been type tested and found
|
||||
to comply with the limits for a Class A computing device pursuant to Subpart
|
||||
J of Part 15 of FCC Rules, which are designed to provide reasonable protec-
|
||||
tion against such radio frequency interference when operated in a commercial
|
||||
environment. Operation of this equipment in a residential area may cause in-
|
||||
terference, in which case the user at his own expense may be required to take
|
||||
measures to correct the interference.
|
||||
AT&T and UNIX are trademarks of American Telephone and Telegraph Com-
|
||||
pany.
|
||||
X Window System is a trademark of the Massachusetts Institute of Technology.
|
||||
The following are trademarks of Digital Equipment Corporation:
|
||||
DEC LA12, LA34, LA35 PDP ThinWire
|
||||
DECconnect LA36, LA38, LA50 P/OS ULTRIX
|
||||
DECmailer LA75 Companion Professional ULTRIX-32
|
||||
DECmate LA100, LA210 Q-bus UNIBUS
|
||||
DECnet LJ250, LJ251 Q22-bus VAX
|
||||
DECserver 200 LN01, LN03 Rainbow VAXstation
|
||||
DECservice LN03 Plus ReGIS VMS
|
||||
DECterm LQP02, LQP03 RSTS VT, VT52, VT100
|
||||
DECUS LQP45 RSX VT220, VT320,
|
||||
VT420
|
||||
DECwindows MASSBUS RT VT1000
|
||||
DECwriter MicroPDP Scholar
|
||||
DIBOL MicroVAX SERVIcenter
|
||||
|
||||
|
||||
|
||||
This document was prepared using VAX DOCUMENT, Version 1.2
|
||||
Contents
|
||||
Chapter 1 Terminal Manager and VTE Windows
|
||||
1.1 QUIT ENDS ALL CONNECTIONS . . . . . . . . . . . . . . . . . . . . . . . . 1–1
|
||||
1.2 TERMINAL MANAGER - CREATE . . . . . . . . . . . . . . . . . . . . . . . . 1–1
|
||||
1.2.1 CREATE LAT X SESSION . . . . . . . . . . . . . . . . . . . . . . . . 1–1
|
||||
1.2.2 TCP/IP X SESSION . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1–2
|
||||
1.3 TERMINAL MANAGER - CUSTOMIZE . . . . . . . . . . . . . . . . . . . . 1–2
|
||||
1.3.1 CUSTOMIZE SECURITY . . . . . . . . . . . . . . . . . . . . . . . . 1–2
|
||||
1.3.2 CUSTOMIZE HOST AND PRINTER PORTS . . . . . . . . . 1–2
|
||||
1.3.3 CUSTOMIZE LAT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1–2
|
||||
1.3.4 CUSTOMIZE FONT PATH . . . . . . . . . . . . . . . . . . . . . . . 1–3
|
||||
1.4 VTE - CUSTOMIZE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1–4
|
||||
1.4.1 CUSTOMIZE GENERAL . . . . . . . . . . . . . . . . . . . . . . . . . 1–4
|
||||
1.4.2 CUSTOMIZE 7-BIT NRCS . . . . . . . . . . . . . . . . . . . . . . . . 1–4
|
||||
1.4.3 CUSTOMIZE PRINT . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1–4
|
||||
1.5 SYSTEM MANAGER INFORMATION . . . . . . . . . . . . . . . . . . . . . 1–5
|
||||
1.5.1 APPENDIX D - RUNNING REMOTE X SESSION . . . . . 1–5
|
||||
|
||||
|
||||
|
||||
|
||||
iii
|
||||
Chapter 1
|
||||
Terminal Manager and VTE Windows
|
||||
|
||||
1.1 QUIT ENDS ALL CONNECTIONS
|
||||
Complete your work before using either the Terminal Manager Quit or
|
||||
Remote Session Manager Quit. Both Quits are intended to return the
|
||||
terminal to its initial state at the end of a work session.
|
||||
|
||||
1.2 TERMINAL MANAGER - CREATE
|
||||
1.2.1 CREATE LAT X SESSION
|
||||
Session Manager and VMS
|
||||
A problem can occur where a user cannot log into an X session on a host.
|
||||
The terminal can still open VTE windows and pull down menus. The
|
||||
watch cursor replaces the pointer.
|
||||
If you have this problem, enter the command:
|
||||
$ SHOW DEVICE TWA
|
||||
If the host show a device number over 999, reboot the host. This action
|
||||
will restore the VT1000’s ability to create X sessions.
|
||||
To obtain a patch that permanently corrects this problem, contact your
|
||||
Digital representative.
|
||||
|
||||
|
||||
|
||||
|
||||
Terminal Manager and VTE Windows 1–1
|
||||
1.2.2 TCP/IP X SESSION
|
||||
Remote Pause Unsupported in UWS V2.1
|
||||
A difference between UWS V2.1 and UWS V2.2 prevents the successful
|
||||
return from a Remote Session Manager Pause state in UWS V2.1.
|
||||
|
||||
1.3 TERMINAL MANAGER - CUSTOMIZE
|
||||
1.3.1 CUSTOMIZE SECURITY
|
||||
TCP/IP BIND Name Service needs Names in Security
|
||||
The Security authorization for TCP/IP requires that you only use decimal
|
||||
dot notation (123.45.67.89) for the IP address of a remote system needing
|
||||
access. However, if a BIND Name Server is available on the network and
|
||||
it knows about the remote system, then you must use the name of the
|
||||
remote system (eg, node.building.institution.area).
|
||||
|
||||
1.3.2 CUSTOMIZE HOST AND PRINTER PORTS
|
||||
Use Speed 19200 or 38400, not both
|
||||
Due to a hardware limitation in the communications circuits, the speeds
|
||||
38.4Kbaud and 19.2Kbaud are mutually exclusive. All other speeds may
|
||||
be mixed between the two serial ports, but only one or the other of the
|
||||
two top speeds is available at one time.
|
||||
|
||||
Diagnostic Port supported on Printer Port
|
||||
When this mode is enabled, a printer attached to the printer port will
|
||||
print out all messages that are displayed in the Terminal Manager
|
||||
Message Region as they are received. You can control the messages that
|
||||
are printed by selecting the appropriate message types in the Customize
|
||||
Terminal Manager dialog box.
|
||||
|
||||
1.3.3 CUSTOMIZE LAT
|
||||
Software Update required for multiple Ethernet adaptors
|
||||
If your system has multiple Ethernet adaptors to allow simultaneous
|
||||
access to separate LANs, contact your Digital representative for an up-
|
||||
dated copy of DECW$LAT_TRANSPORT.EXE. The new version provides
|
||||
support for multiple link definitions.
|
||||
|
||||
|
||||
|
||||
|
||||
1–2 Terminal Manager and VTE Windows
|
||||
1.3.4 CUSTOMIZE FONT PATH
|
||||
Must Quit to Reset Font Path
|
||||
Once a session makes use of the fonts, you can view the font path, but
|
||||
you can’t change it until you quit out of the Terminal Manager. This
|
||||
applies to all sessions including VTEs. The VTE does not require a font
|
||||
path but will use host-based fonts for character and line attributes if
|
||||
available.
|
||||
|
||||
Link lost to font server requires quit to reset font path
|
||||
If your link to the font service is disconnected, perhaps due to the font
|
||||
server node shutting down, or due to a network problem, you will get
|
||||
a message in the Terminal Manager window message area stating (for
|
||||
example):
|
||||
Session n to NODENAME terminated. Link lost with remote node.
|
||||
Font path to node NODENAME lost. Reestablish font path before
|
||||
starting X sessions.
|
||||
Even if your other sessions to other nodes are still active, you need to
|
||||
reset your font path to continue working. This is because the behaviors of
|
||||
applications running on the terminal are not predictable when a request
|
||||
for a new glyph or font fails. Therefore, you should close all sessions
|
||||
and quit the terminal manager to restart the terminal and reset the font
|
||||
path.
|
||||
|
||||
Font compiler needed for non-DECwindows environments
|
||||
If your VT1000 application requires fonts that are not in the DECwin-
|
||||
dows library, you will need to get a font compiler to convert the fonts you
|
||||
have to a format the VT1000 can use. A compiler is available through
|
||||
the Internet that will convert the standard .BDF interchange format of
|
||||
most fonts to the .DWF format of the VT1000.
|
||||
The pcf font compiler is available on gatekeeper.dec.com in the
|
||||
/pub/DEC/VT1000 directory. There are two files in that directory:
|
||||
README pcf.tar.Z
|
||||
The README file contains:
|
||||
|
||||
|
||||
|
||||
|
||||
Terminal Manager and VTE Windows 1–3
|
||||
The file pcf.tar.Z in this directory contains the contents of
|
||||
the contrib/server/pcf directory that is on tape4 of the MIT
|
||||
X11R4 distribution. This code should allow you to build a
|
||||
bdf->pcf compiler so that fonts can be generated that are
|
||||
compatible with the VT1000 series terminals.
|
||||
(Note that DEC’s .dwf format is also supported by the VT1000.)
|
||||
and the pcf.tar.Z file is a compressed tar file containing the source code.
|
||||
To retreive it via the internet, copy the files from:
|
||||
gatekeeper.dec.com:~ftp/pub/DEC/VT1000
|
||||
If you cannot copy from the internet, contact your Digital representative.
|
||||
|
||||
1.4 VTE - CUSTOMIZE
|
||||
1.4.1 CUSTOMIZE GENERAL
|
||||
Answerback only supports printable characters
|
||||
Unlike the VT320, you cannot put control characters like CR or ESC into
|
||||
the VTE answerback message.
|
||||
|
||||
1.4.2 CUSTOMIZE 7-BIT NRCS
|
||||
Choose NRCS to Match Keyboard
|
||||
When using a VTE with a non-US Keyboard and 7-bit NRCS character
|
||||
sets, you must manually use the VTE Customize 7-bit NRCS Selection to
|
||||
choose an NRCS set to match the current keyboard language. Select the
|
||||
corresponding language if you use a typewriter layout. Data Processing
|
||||
keyboards in any language require the ASCII (North American) NRCS
|
||||
set. This is a 7-bit issue only.
|
||||
|
||||
1.4.3 CUSTOMIZE PRINT
|
||||
VTE Printer Modes are user settable
|
||||
Printer Modes are user settable from the Customize dialog box as well as
|
||||
host settable by control functions. The buttons in the dialog box display
|
||||
the mode that was set from either source.
|
||||
|
||||
|
||||
|
||||
|
||||
1–4 Terminal Manager and VTE Windows
|
||||
1.5 SYSTEM MANAGER INFORMATION
|
||||
1.5.1 APPENDIX D - RUNNING REMOTE X SESSION
|
||||
Wrong node value in command
|
||||
The last command in the section should read
|
||||
SET DISPLAY/CREATE/NODE=LOCAL/SERVER=100/TRANSPORT=DECNET
|
||||
|
||||
|
||||
|
||||
|
||||
Terminal Manager and VTE Windows 1–5
|
||||
|
||||
@@ -0,0 +1,222 @@
|
||||
EK-V1200-RN-001
|
||||
|
||||
|
||||
|
||||
|
||||
VT1200 VIDEO TERMINAL V2.0
|
||||
RELEASE NOTES
|
||||
|
||||
|
||||
|
||||
|
||||
This document describes problems, corrections, and restrictions that pertain
|
||||
to V2.0 of the VT1200 Video Terminal firmware.
|
||||
|
||||
|
||||
|
||||
|
||||
Digital Equipment Corporation
|
||||
July 1990
|
||||
The information in this document is subject to change without notice and should
|
||||
not be construed as a commitment by Digital Equipment Corporation. Digital
|
||||
Equipment Corporation assumes no responsibility for any errors that may appear
|
||||
in this document.
|
||||
The software described in this document is furnished under a license and may
|
||||
be used or copied only in accordance with the terms of such license.
|
||||
No responsibility is assumed for the use or reliability of software on equipment
|
||||
that is not supplied by Digital Equipment Corporation or its affiliated companies.
|
||||
Restricted Rights: Use, duplication, or disclosure by the U. S. Government is
|
||||
subject to restrictions as set forth in subparagraph ( c ) ( 1 ) ( ii ) of the Rights
|
||||
in Technical Data and Computer Software clause at DFARS 252.227–7013.
|
||||
Copyright © by Digital Equipment Corporation 1990
|
||||
All Rights Reserved.
|
||||
|
||||
|
||||
FCC NOTICE: The equipment described in this manual generates, uses, and
|
||||
may emit radio frequency energy. The equipment has been type tested and found
|
||||
to comply with the limits for a Class A computing device pursuant to Subpart
|
||||
J of Part 15 of FCC Rules, which are designed to provide reasonable protec-
|
||||
tion against such radio frequency interference when operated in a commercial
|
||||
environment. Operation of this equipment in a residential area may cause in-
|
||||
terference, in which case the user at his own expense may be required to take
|
||||
measures to correct the interference.
|
||||
AT&T and UNIX are trademarks of American Telephone and Telegraph Com-
|
||||
pany.
|
||||
X Window System is a trademark of the Massachusetts Institute of Technology.
|
||||
The following are trademarks of Digital Equipment Corporation:
|
||||
DEC LA12, LA34, LA35 PDP ThinWire
|
||||
DECconnect LA36, LA38, LA50 P/OS ULTRIX
|
||||
DECmailer LA75 Companion Professional ULTRIX-32
|
||||
DECmate LA100, LA210 Q-bus UNIBUS
|
||||
DECnet LJ250, LJ251 Q22-bus VAX
|
||||
DECserver 200 LN01, LN03 Rainbow VAXstation
|
||||
DECservice LN03 Plus ReGIS VMS
|
||||
DECterm LQP02, LQP03 RSTS VT, VT52, VT100
|
||||
DECUS LQP45 RSX VT220, VT320,
|
||||
VT420
|
||||
DECwindows MASSBUS RT VT1000, VT1200
|
||||
DECwriter MicroPDP Scholar
|
||||
DIBOL MicroVAX SERVIcenter
|
||||
|
||||
|
||||
|
||||
This document was prepared using VAX DOCUMENT, Version 1.2
|
||||
Contents
|
||||
Chapter 1 Terminal Manager and VTE Windows
|
||||
1.1 QUIT ENDS ALL CONNECTIONS . . . . . . . . . . . . . . . . . . . . . . . . 1–1
|
||||
1.2 TERMINAL MANAGER - CREATE . . . . . . . . . . . . . . . . . . . . . . . . 1–1
|
||||
1.2.1 CREATE LAT X SESSION . . . . . . . . . . . . . . . . . . . . . . . . 1–1
|
||||
1.2.2 TCP/IP X SESSION . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1–2
|
||||
1.3 TERMINAL MANAGER - CUSTOMIZE . . . . . . . . . . . . . . . . . . . . 1–2
|
||||
1.3.1 CUSTOMIZE SECURITY . . . . . . . . . . . . . . . . . . . . . . . . 1–2
|
||||
1.3.2 CUSTOMIZE HOST AND PRINTER PORTS . . . . . . . . . 1–2
|
||||
1.3.3 CUSTOMIZE LAT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1–2
|
||||
1.3.4 CUSTOMIZE FONT PATH . . . . . . . . . . . . . . . . . . . . . . . 1–3
|
||||
1.4 VTE - CUSTOMIZE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1–4
|
||||
1.4.1 CUSTOMIZE GENERAL . . . . . . . . . . . . . . . . . . . . . . . . . 1–4
|
||||
1.4.2 CUSTOMIZE 7-BIT NRCS . . . . . . . . . . . . . . . . . . . . . . . . 1–4
|
||||
1.4.3 CUSTOMIZE PRINT . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1–4
|
||||
|
||||
|
||||
|
||||
|
||||
iii
|
||||
Chapter 1
|
||||
Terminal Manager and VTE Windows
|
||||
|
||||
1.1 QUIT ENDS ALL CONNECTIONS
|
||||
Complete your work before using either the Terminal Manager Quit or
|
||||
Remote Session Manager Quit. Both Quits are intended to return the
|
||||
terminal to its initial state at the end of a work session.
|
||||
|
||||
1.2 TERMINAL MANAGER - CREATE
|
||||
1.2.1 CREATE LAT X SESSION
|
||||
Session Manager and VMS
|
||||
A problem can occur where a user cannot log into an X session on a host.
|
||||
The terminal can still open VTE windows and pull down menus. The
|
||||
watch cursor replaces the pointer.
|
||||
If you have this problem, enter the command:
|
||||
$ SHOW DEVICE TWA
|
||||
If the host show a device number over 999, reboot the host. This action
|
||||
will restore the VT1200’s ability to create X sessions.
|
||||
To obtain a patch that permanently corrects this problem, contact your
|
||||
Digital representative.
|
||||
|
||||
|
||||
|
||||
|
||||
Terminal Manager and VTE Windows 1–1
|
||||
1.2.2 TCP/IP X SESSION
|
||||
Remote Pause Unsupported in UWS V2.1
|
||||
A difference between UWS V2.1 and UWS V2.2 prevents the successful
|
||||
return from a Remote Session Manager Pause state in UWS V2.1.
|
||||
|
||||
1.3 TERMINAL MANAGER - CUSTOMIZE
|
||||
1.3.1 CUSTOMIZE SECURITY
|
||||
TCP/IP BIND Name Service needs Names in Security
|
||||
The Security authorization for TCP/IP requires that you only use decimal
|
||||
dot notation (123.45.67.89) for the IP address of a remote system needing
|
||||
access. However, if a BIND Name Server is available on the network and
|
||||
it knows about the remote system, then you must use the name of the
|
||||
remote system (eg, node.building.institution.area).
|
||||
|
||||
1.3.2 CUSTOMIZE HOST AND PRINTER PORTS
|
||||
Use Speed 19200 or 38400, not both
|
||||
Due to a hardware limitation in the communications circuits, the speeds
|
||||
38.4Kbaud and 19.2Kbaud are mutually exclusive. All other speeds may
|
||||
be mixed between the two serial ports, but only one or the other of the
|
||||
two top speeds is available at one time.
|
||||
|
||||
Diagnostic Port supported on Printer Port
|
||||
When this mode is enabled, a printer attached to the printer port will
|
||||
print out all messages that are displayed in the Terminal Manager
|
||||
Message Region as they are received. You can control the messages that
|
||||
are printed by selecting the appropriate message types in the Customize
|
||||
Terminal Manager dialog box.
|
||||
|
||||
1.3.3 CUSTOMIZE LAT
|
||||
Software Update required for multiple Ethernet adaptors
|
||||
If your system has multiple Ethernet adaptors to allow simultaneous
|
||||
access to separate LANs, contact your Digital representative for an up-
|
||||
dated copy of DECW$LAT_TRANSPORT.EXE. The new version provides
|
||||
support for multiple link definitions.
|
||||
|
||||
|
||||
|
||||
|
||||
1–2 Terminal Manager and VTE Windows
|
||||
1.3.4 CUSTOMIZE FONT PATH
|
||||
Must Quit to Reset Font Path
|
||||
Once a session makes use of the fonts, you can view the font path, but
|
||||
you can’t change it until you quit out of the Terminal Manager. This
|
||||
applies to all sessions including VTEs. The VTE does not require a font
|
||||
path but will use host-based fonts for character and line attributes if
|
||||
available.
|
||||
|
||||
Link lost to font server requires quit to reset font path
|
||||
If your link to the font service is disconnected, perhaps due to the font
|
||||
server node shutting down, or due to a network problem, you will get
|
||||
a message in the Terminal Manager window message area stating (for
|
||||
example):
|
||||
Session n to NODENAME terminated. Link lost with remote node.
|
||||
Font path to node NODENAME lost. Reestablish font path before
|
||||
starting X sessions.
|
||||
Even if your other sessions to other nodes are still active, you need to
|
||||
reset your font path to continue working. This is because the behaviors of
|
||||
applications running on the terminal are not predictable when a request
|
||||
for a new glyph or font fails. Therefore, you should close all sessions
|
||||
and quit the terminal manager to restart the terminal and reset the font
|
||||
path.
|
||||
|
||||
Font compiler needed for non-DECwindows environments
|
||||
If your VT1200 application requires fonts that are not in the DECwin-
|
||||
dows library, you will need to get a font compiler to convert the fonts you
|
||||
have to a format the VT1200 can use. A compiler is available through
|
||||
the Internet that will convert the standard .BDF interchange format of
|
||||
most fonts to the .DWF format of the VT1200.
|
||||
The pcf font compiler is available on gatekeeper.dec.com in the
|
||||
/pub/DEC/VT1000 directory. There are two files in that directory:
|
||||
README pcf.tar.Z
|
||||
The README file contains:
|
||||
|
||||
|
||||
|
||||
|
||||
Terminal Manager and VTE Windows 1–3
|
||||
The file pcf.tar.Z in this directory contains the contents of
|
||||
the contrib/server/pcf directory that is on tape4 of the MIT
|
||||
X11R4 distribution. This code should allow you to build a
|
||||
bdf->pcf compiler so that fonts can be generated that are
|
||||
compatible with the VT1000 series terminals.
|
||||
(Note that DEC’s .dwf format is also supported by the VT1000.)
|
||||
and the pcf.tar.Z file is a compressed tar file containing the source code.
|
||||
To retreive it via the internet, copy the files from:
|
||||
gatekeeper.dec.com:~ftp/pub/DEC/VT1000
|
||||
If you cannot copy from the internet, contact your Digital representative.
|
||||
|
||||
1.4 VTE - CUSTOMIZE
|
||||
1.4.1 CUSTOMIZE GENERAL
|
||||
Answerback only supports printable characters
|
||||
Unlike the VT320, you cannot put control characters like CR or ESC into
|
||||
the VTE answerback message.
|
||||
|
||||
1.4.2 CUSTOMIZE 7-BIT NRCS
|
||||
Choose NRCS to Match Keyboard
|
||||
When using a VTE with a non-US Keyboard and 7-bit NRCS character
|
||||
sets, you must manually use the VTE Customize 7-bit NRCS Selection to
|
||||
choose an NRCS set to match the current keyboard language. Select the
|
||||
corresponding language if you use a typewriter layout. Data Processing
|
||||
keyboards in any language require the ASCII (North American) NRCS
|
||||
set. This is a 7-bit issue only.
|
||||
|
||||
1.4.3 CUSTOMIZE PRINT
|
||||
VTE Printer Modes are user settable
|
||||
Printer Modes are user settable from the Customize dialog box as well as
|
||||
host settable by control functions. The buttons in the dialog box display
|
||||
the mode that was set from either source.
|
||||
|
||||
|
||||
|
||||
|
||||
1–4 Terminal Manager and VTE Windows
|
||||
|
||||
|
After Width: | Height: | Size: 256 KiB |
|
After Width: | Height: | Size: 202 KiB |
|
After Width: | Height: | Size: 84 KiB |
|
After Width: | Height: | Size: 60 KiB |
|
After Width: | Height: | Size: 151 KiB |
|
After Width: | Height: | Size: 146 KiB |
|
After Width: | Height: | Size: 88 KiB |
|
After Width: | Height: | Size: 145 KiB |
|
After Width: | Height: | Size: 155 KiB |
|
After Width: | Height: | Size: 72 KiB |
|
After Width: | Height: | Size: 135 KiB |
|
After Width: | Height: | Size: 36 KiB |
|
After Width: | Height: | Size: 142 KiB |
|
After Width: | Height: | Size: 79 KiB |
|
After Width: | Height: | Size: 155 KiB |
|
After Width: | Height: | Size: 75 KiB |
@@ -0,0 +1,481 @@
|
||||
# VT1200 board register model — Implementation Plan
|
||||
|
||||
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
|
||||
|
||||
**Goal:** Replace the driver's ad-hoc board-window stubs with a modelled, unit-testable register file for the four undecoded VT1200 windows, so the firmware's status/command handshakes behave as real state machines instead of constants.
|
||||
|
||||
**Architecture:** A standalone C++ class `vt1200_board` with **no MAME dependencies** (fixed-width integer types only), so it can be unit-tested with plain `g++` outside the emulator. It models two shapes discovered in the firmware: `big` (windows `0x6200000` and `0x6400000` — STATUS at `+0x10`, COMMAND/DATA at `+0x20`, plus `+0x30`/`+0xD0`/`+0xE0`/`+0xF0`) and `dma` (the `0x5800000` data port + `0x5900000` command port pair). The MAME driver owns one instance and forwards its address-map callbacks to it.
|
||||
|
||||
**Tech Stack:** C++17, MAME 0.289 driver harness, plain `g++` for the model's unit tests, the project's existing `harness/mame/build.sh`.
|
||||
|
||||
**Spec:** `docs/superpowers/specs/2026-10-16-vt1200-board-model-design.md`
|
||||
|
||||
## Global Constraints
|
||||
|
||||
- **No regression:** with no `VT1200_*` environment variables set, the driver must still reproduce the original wedge — `PC=3FDCE400` with ~199/200 frame samples — verified by the command in Task 1 Step 6.
|
||||
- All harness behaviour stays **opt-in** via environment variables; new behaviour must default off.
|
||||
- **Do not modify MAME's own source** (`/home/arti/code/k-space/mame0289/src/...`). Only the driver source in this repo changes.
|
||||
- Builds use `harness/mame/build.sh` (it now exits non-zero on compile failure — a bare `built:` means success).
|
||||
- The board model must use **only** `<cstdint>`, `<map>`, `<vector>` — no `emu.h` — so unit tests compile without MAME.
|
||||
- Addresses inside the model are in the **harness's units**: window base `| (offset & 0xffff)`, where the base is the disassembly operand shifted right by 4 (e.g. code `@0x64000D0` is harness `0x0640000D`).
|
||||
- Every finding discovered while implementing goes into `harness/mame/BRINGUP_LOG.md`.
|
||||
|
||||
---
|
||||
|
||||
## File Structure
|
||||
|
||||
| File | Responsibility |
|
||||
|---|---|
|
||||
| `harness/mame/vt1200_board.h` | **Create.** Declares `vt1200_board`: the four windows, both shapes, configuration, `read`/`write`/`tick`. No MAME types. |
|
||||
| `harness/mame/vt1200_board.cpp` | **Create.** Implements the register file and the status state machines. |
|
||||
| `harness/mame/test_vt1200_board.cpp` | **Create.** Standalone `g++` unit tests for the model. No MAME, no emulator. |
|
||||
| `harness/mame/vt1200.cpp` | **Modify.** Own a `vt1200_board`, forward the four window callbacks to it, keep the existing env knobs working as configuration. |
|
||||
| `harness/mame/build.sh` | **Modify.** Compile the extra translation unit and symlink it into the MAME tree. |
|
||||
| `harness/mame/BRINGUP_LOG.md` | **Modify.** Record findings. |
|
||||
|
||||
Later plans (separate documents, not this one): *video RAM + scanline renderer*, then *DUARTs / NVRAM / MAC ROM*.
|
||||
|
||||
---
|
||||
|
||||
## Task 1: Extract the existing behaviour into a standalone, unit-tested class
|
||||
|
||||
Behaviour-preserving refactor. This is the riskiest task for regressions, so it lands first and alone.
|
||||
|
||||
**Files:**
|
||||
- Create: `harness/mame/vt1200_board.h`
|
||||
- Create: `harness/mame/vt1200_board.cpp`
|
||||
- Create: `harness/mame/test_vt1200_board.cpp`
|
||||
- Modify: `harness/mame/vt1200.cpp`
|
||||
- Modify: `harness/mame/build.sh`
|
||||
|
||||
**Interfaces:**
|
||||
- Consumes: nothing (first task).
|
||||
- Produces:
|
||||
- `class vt1200_board` with `uint16_t read(uint32_t addr)`, `void write(uint32_t addr, uint16_t data)`, `void tick()`
|
||||
- `void set_default(uint16_t v)`, `void set_override(uint32_t addr, uint16_t v)`
|
||||
- `void set_monitor_switch(uint8_t position)`, `void set_busy_ticks(int n)`
|
||||
- `void set_model_handshake(bool on)`
|
||||
- constants `VT1200_WIN0` = `0x05800000`, `VT1200_WIN1` = `0x05900000`, `VT1200_WIN2` = `0x06200000`, `VT1200_WIN3` = `0x06400000`
|
||||
|
||||
- [ ] **Step 1: Write the failing test**
|
||||
|
||||
Create `harness/mame/test_vt1200_board.cpp`:
|
||||
|
||||
```cpp
|
||||
// Standalone unit tests for the VT1200 board register model.
|
||||
// g++ -std=c++17 -o /tmp/t vt1200_board.cpp test_vt1200_board.cpp && /tmp/t
|
||||
#include "vt1200_board.h"
|
||||
#include <cassert>
|
||||
#include <cstdio>
|
||||
|
||||
static int failures = 0;
|
||||
#define CHECK(cond) do { if (!(cond)) { \
|
||||
std::printf("FAIL %s:%d %s\n", __FILE__, __LINE__, #cond); failures++; } } while (0)
|
||||
|
||||
static void test_default_read(void)
|
||||
{
|
||||
vt1200_board b;
|
||||
b.set_default(0x0000);
|
||||
CHECK(b.read(VT1200_WIN2 + VT1200_OFF_STATUS) == 0x0000);
|
||||
}
|
||||
|
||||
static void test_override_read(void)
|
||||
{
|
||||
vt1200_board b;
|
||||
b.set_override(VT1200_WIN2 + VT1200_OFF_STATUS, 0x00b7);
|
||||
CHECK(b.read(VT1200_WIN2 + VT1200_OFF_STATUS) == 0x00b7);
|
||||
}
|
||||
|
||||
static void test_monitor_switch_is_mixed_with_latches(void)
|
||||
{
|
||||
vt1200_board b;
|
||||
b.set_monitor_switch(7); // position 7 -> bits 4-6 = 0x70
|
||||
b.write(VT1200_WIN3 + VT1200_OFF_SWITCH, 0x0001); // output latch writes bit 0
|
||||
const uint16_t v = b.read(VT1200_WIN3 + VT1200_OFF_SWITCH);
|
||||
CHECK((v & 0x0070) == 0x0070); // switch bits read back as input
|
||||
CHECK((v & 0x0001) == 0x0001); // output bits read back as latched
|
||||
}
|
||||
|
||||
static void test_busy_bit_arms_on_write_and_clears(void)
|
||||
{
|
||||
vt1200_board b;
|
||||
b.set_model_handshake(true);
|
||||
b.set_busy_ticks(2);
|
||||
const uint32_t status = VT1200_WIN2 + VT1200_OFF_STATUS;
|
||||
const uint32_t cmd = VT1200_WIN2 + VT1200_OFF_CMD;
|
||||
|
||||
CHECK((b.read(status) & 0x0001) == 0x0000); // idle
|
||||
b.write(cmd, 0x00ca); // command arms it
|
||||
CHECK((b.read(status) & 0x0001) == 0x0001); // busy
|
||||
b.tick();
|
||||
CHECK((b.read(status) & 0x0001) == 0x0001); // still busy
|
||||
b.tick();
|
||||
CHECK((b.read(status) & 0x0001) == 0x0000); // done
|
||||
}
|
||||
|
||||
int main(void)
|
||||
{
|
||||
test_default_read();
|
||||
test_override_read();
|
||||
test_monitor_switch_is_mixed_with_latches();
|
||||
test_busy_bit_arms_on_write_and_clears();
|
||||
std::printf(failures ? "%d FAILURE(S)\n" : "all board tests passed\n", failures);
|
||||
return failures ? 1 : 0;
|
||||
}
|
||||
```
|
||||
|
||||
- [ ] **Step 2: Run test to verify it fails**
|
||||
|
||||
Run: `cd harness/mame && g++ -std=c++17 -o /tmp/t vt1200_board.cpp test_vt1200_board.cpp`
|
||||
Expected: FAIL — `vt1200_board.cpp: No such file or directory`.
|
||||
|
||||
- [ ] **Step 3: Write the header**
|
||||
|
||||
Create `harness/mame/vt1200_board.h`:
|
||||
|
||||
```cpp
|
||||
// VT1200 board register model. Deliberately free of MAME dependencies so it can
|
||||
// be unit-tested with plain g++.
|
||||
#pragma once
|
||||
#include <cstdint>
|
||||
#include <map>
|
||||
|
||||
// Window bases in the harness's address units (disassembly operand >> 4).
|
||||
static const uint32_t VT1200_WIN0 = 0x05800000; // data port of the DMA pair
|
||||
static const uint32_t VT1200_WIN1 = 0x05900000; // command port of the DMA pair
|
||||
static const uint32_t VT1200_WIN2 = 0x06200000; // big: STATUS +0x10, CMD +0x20
|
||||
static const uint32_t VT1200_WIN3 = 0x06400000; // big, plus the monitor switch
|
||||
|
||||
// Window-relative register offsets IN HARNESS UNITS.
|
||||
//
|
||||
// The harness address is the firmware's operand shifted right by 4 (MAME's
|
||||
// TMS34010 space is word-unit here), so an operand offset of +0x10 is harness
|
||||
// +0x01, and an operand offset of +0xD0 is harness +0x0d. Getting this wrong
|
||||
// makes registers silently unreachable, so always use these names.
|
||||
//
|
||||
// firmware operand harness offset role
|
||||
// +0x10 0x01 STATUS (bit 0 = ready/done)
|
||||
// +0x20 0x02 COMMAND / DATA
|
||||
// +0x30 0x03 (read/written in the same block)
|
||||
// +0xD0 0x0d mixed I/O -- monitor switch in bits 4-6
|
||||
// +0xE0 0x0e
|
||||
// +0xF0 0x0f
|
||||
static const uint32_t VT1200_OFF_STATUS = 0x0001;
|
||||
static const uint32_t VT1200_OFF_CMD = 0x0002;
|
||||
static const uint32_t VT1200_OFF_IO30 = 0x0003;
|
||||
static const uint32_t VT1200_OFF_SWITCH = 0x000d;
|
||||
static const uint32_t VT1200_OFF_E0 = 0x000e;
|
||||
static const uint32_t VT1200_OFF_F0 = 0x000f;
|
||||
|
||||
class vt1200_board
|
||||
{
|
||||
public:
|
||||
vt1200_board() = default;
|
||||
|
||||
// Configuration (replaces the test-time env knobs).
|
||||
void set_default(uint16_t v) { m_default = v; }
|
||||
void set_override(uint32_t addr, uint16_t v) { m_override[addr] = v; }
|
||||
void set_model_handshake(bool on) { m_handshake = on; }
|
||||
void set_busy_ticks(int n) { m_busy_ticks = n; }
|
||||
void set_monitor_switch(uint8_t position) { m_switch_bits = (uint16_t)((position & 7) << 4); }
|
||||
|
||||
// Bus interface.
|
||||
uint16_t read(uint32_t addr);
|
||||
void write(uint32_t addr, uint16_t data);
|
||||
void tick();
|
||||
|
||||
private:
|
||||
bool is_switch_port(uint32_t addr) const;
|
||||
|
||||
std::map<uint32_t, uint16_t> m_store; // write-back latches
|
||||
std::map<uint32_t, uint16_t> m_override; // fixed values (experiments)
|
||||
uint16_t m_default = 0;
|
||||
bool m_handshake = false;
|
||||
int m_busy_ticks = 0;
|
||||
int m_busy_left = 0;
|
||||
uint16_t m_switch_bits = 0;
|
||||
};
|
||||
```
|
||||
|
||||
- [ ] **Step 4: Write the implementation**
|
||||
|
||||
Create `harness/mame/vt1200_board.cpp`:
|
||||
|
||||
```cpp
|
||||
#include "vt1200_board.h"
|
||||
|
||||
bool vt1200_board::is_switch_port(uint32_t addr) const
|
||||
{
|
||||
// The monitor-selection switch lives in bits 4-6 of winner 3's +0xD0
|
||||
// register (harness offset 0x0d).
|
||||
return addr == (VT1200_WIN3 + VT1200_OFF_SWITCH);
|
||||
}
|
||||
|
||||
uint16_t vt1200_board::read(uint32_t addr)
|
||||
{
|
||||
auto ov = m_override.find(addr);
|
||||
if (ov != m_override.end())
|
||||
return ov->second;
|
||||
|
||||
uint16_t value = m_default;
|
||||
auto st = m_store.find(addr);
|
||||
if (st != m_store.end())
|
||||
value = st->second;
|
||||
|
||||
if (is_switch_port(addr))
|
||||
return (uint16_t)((value & 0xff8f) | (m_switch_bits & 0x0070));
|
||||
|
||||
if (m_handshake && (addr & 0xffff) == VT1200_OFF_STATUS)
|
||||
{
|
||||
if (m_busy_left > 0)
|
||||
value |= 0x0001;
|
||||
else
|
||||
value &= ~0x0001;
|
||||
}
|
||||
return value;
|
||||
}
|
||||
|
||||
void vt1200_board::write(uint32_t addr, uint16_t data)
|
||||
{
|
||||
m_store[addr] = data;
|
||||
if (m_handshake && (addr & 0xffff) == VT1200_OFF_CMD)
|
||||
m_busy_left = m_busy_ticks;
|
||||
}
|
||||
|
||||
void vt1200_board::tick()
|
||||
{
|
||||
if (m_busy_left > 0)
|
||||
m_busy_left--;
|
||||
}
|
||||
```
|
||||
|
||||
- [ ] **Step 5: Run the unit tests to verify they pass**
|
||||
|
||||
Run: `cd harness/mame && g++ -std=c++17 -o /tmp/t vt1200_board.cpp test_vt1200_board.cpp && /tmp/t`
|
||||
Expected: `all board tests passed`
|
||||
|
||||
- [ ] **Step 6: Wire the driver to the model and verify no regression**
|
||||
|
||||
In `harness/mame/vt1200.cpp`: add `#include "vt1200_board.h"`, give `vt1200_state` a `vt1200_board m_board;` member, and in `board_read`/`board_write` delegate to `m_board.read(addr)` / `m_board.write(addr, data)` instead of the current inline logic. In `machine_start`, translate the existing env vars into the model's setters (`VT1200_BOARD_DEFAULT`, `VT1200_BOARD_MAP`, `VT1200_BOARD_MODEL`, `VT1200_BOARD_BUSY_TICKS`, `VT1200_BOARD_SWITCH`). Call `m_board.tick()` once per emulated frame — the simplest correct place is the existing `scanline` callback guarded so it only fires once per frame, or `screen_update` when `cliprect.min_y == 0`.
|
||||
|
||||
In `harness/mame/build.sh`: add the new source to the symlink list and to `SOURCES=` (comma-separated), and add `g++ -c vt1200_board.cpp` to the unit-test recipe.
|
||||
|
||||
Then verify:
|
||||
|
||||
Run:
|
||||
```sh
|
||||
cd /home/arti/code/k-space/vt1200
|
||||
JOBS=8 harness/mame/build.sh 2>&1 | tail -2
|
||||
M=/home/arti/code/k-space/mame0289/vt1200
|
||||
PROG_FRAMES=200 timeout 300 $M vt1200 -rompath harness/mame/roms -video none -sound none \
|
||||
-nothrottle -debug -debugger none -autoboot_script harness/mame/progress.lua -autoboot_delay 0 2>&1 \
|
||||
| grep -oE "PC=[0-9A-F]{8} samples=[0-9]+" | head -1
|
||||
```
|
||||
Expected: `PC=3FDCE400 samples=199` (the original wedge — no regression).
|
||||
|
||||
Then re-run the handshake configuration and confirm it still advances:
|
||||
|
||||
Run:
|
||||
```sh
|
||||
VT1200_BOARD_MODEL=handshake VT1200_BOARD_BUSY_TICKS=2 VT1200_BOARD_SWITCH="0640000D:70:70" \
|
||||
COV_FRAMES=600 COV_WINDOW=300 timeout 400 $M vt1200 -rompath harness/mame/roms -video none \
|
||||
-sound none -nothrottle -debug -debugger none -autoboot_script harness/mame/coverage.lua -autoboot_delay 0 2>&1 \
|
||||
| grep -E "^frame" | tail -1
|
||||
```
|
||||
Expected: a `total_distinct` in the high 50s (not the single-instruction wedge).
|
||||
|
||||
- [ ] **Step 7: Commit**
|
||||
|
||||
```bash
|
||||
git add harness/mame/vt1200_board.h harness/mame/vt1200_board.cpp \
|
||||
harness/mame/test_vt1200_board.cpp harness/mame/vt1200.cpp harness/mame/build.sh
|
||||
git commit -m "harness: extract VT1200 board register model, unit-tested"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Task 2: Per-window busy machines (`win_big` shape)
|
||||
|
||||
**Files:**
|
||||
- Modify: `harness/mame/vt1200_board.h`, `harness/mame/vt1200_board.cpp`
|
||||
- Modify: `harness/mame/test_vt1200_board.cpp`
|
||||
|
||||
**Interfaces:**
|
||||
- Consumes: `vt1200_board` from Task 1.
|
||||
- Produces: `void set_window_busy_ticks(uint32_t window_base, int n)` — per-window tick counts, so `0x6200000` and `0x6400000` can be tuned independently. `void tick()` now advances every window.
|
||||
|
||||
- [ ] **Step 1: Write the failing test**
|
||||
|
||||
Add to `test_vt1200_board.cpp`:
|
||||
|
||||
```cpp
|
||||
static void test_windows_are_independent(void)
|
||||
{
|
||||
vt1200_board b;
|
||||
b.set_model_handshake(true);
|
||||
b.set_window_busy_ticks(VT1200_WIN2, 1);
|
||||
b.set_window_busy_ticks(VT1200_WIN3, 3);
|
||||
|
||||
b.write(VT1200_WIN2 + VT1200_OFF_CMD, 0x0001);
|
||||
b.write(VT1200_WIN3 + VT1200_OFF_CMD, 0x0001);
|
||||
CHECK((b.read(VT1200_WIN2 + VT1200_OFF_STATUS) & 1) == 1);
|
||||
CHECK((b.read(VT1200_WIN3 + VT1200_OFF_STATUS) & 1) == 1);
|
||||
|
||||
b.tick();
|
||||
CHECK((b.read(VT1200_WIN2 + VT1200_OFF_STATUS) & 1) == 0); // WIN2 finished
|
||||
CHECK((b.read(VT1200_WIN3 + VT1200_OFF_STATUS) & 1) == 1); // WIN3 still busy
|
||||
}
|
||||
```
|
||||
|
||||
Register it in `main()` with `test_windows_are_independent();`
|
||||
|
||||
- [ ] **Step 2: Run test to verify it fails**
|
||||
|
||||
Run: `cd harness/mame && g++ -std=c++17 -o /tmp/t vt1200_board.cpp test_vt1200_board.cpp && /tmp/t`
|
||||
Expected: FAIL — `'set_window_busy_ticks' was not declared`.
|
||||
|
||||
- [ ] **Step 3: Implement per-window busy state**
|
||||
|
||||
In `vt1200_board.h`, replace the single `m_busy_left` with `std::map<uint32_t, int> m_busy_left; std::map<uint32_t, int> m_busy_ticks_by_win;`, declare `void set_window_busy_ticks(uint32_t window_base, int n);`, and keep `set_busy_ticks` as a shorthand that applies to all windows. In `.cpp`, key both maps by `addr & 0xffff0000` so all four windows behave uniformly, and have `tick()` decrement every entry.
|
||||
|
||||
- [ ] **Step 4: Run the tests to verify they pass**
|
||||
|
||||
Run: `cd harness/mame && g++ -std=c++17 -o /tmp/t vt1200_board.cpp test_vt1200_board.cpp && /tmp/t`
|
||||
Expected: `all board tests passed`
|
||||
|
||||
- [ ] **Step 5: Verify in the emulator**
|
||||
|
||||
Run the Task 1 Step 6 emulator commands unchanged.
|
||||
Expected: identical results (this task is a pure generalisation; observable behaviour must not move).
|
||||
|
||||
- [ ] **Step 6: Commit**
|
||||
|
||||
```bash
|
||||
git add harness/mame/vt1200_board.h harness/mame/vt1200_board.cpp harness/mame/test_vt1200_board.cpp
|
||||
git commit -m "harness: per-window busy state machines for the big windows"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Task 3: The DMA pair (`win_pair` shape)
|
||||
|
||||
**Files:**
|
||||
- Modify: `harness/mame/vt1200_board.h`, `harness/mame/vt1200_board.cpp`
|
||||
- Modify: `harness/mame/test_vt1200_board.cpp`
|
||||
|
||||
**Interfaces:**
|
||||
- Consumes: `vt1200_board` from Tasks 1-2.
|
||||
- Produces: `void set_dma_ticks(int n)` and a real model of the pair — a write to the command port (`VT1200_WIN1`) followed by a write to the data port (`VT1200_WIN0`) completes in `n` ticks, after which the command port reads back `0`.
|
||||
|
||||
- [ ] **Step 1: Write the failing test**
|
||||
|
||||
Add to `test_vt1200_board.cpp`:
|
||||
|
||||
```cpp
|
||||
static void test_dma_pair_command_completes(void)
|
||||
{
|
||||
vt1200_board b;
|
||||
b.set_model_handshake(true);
|
||||
b.set_dma_ticks(2);
|
||||
|
||||
b.write(VT1200_WIN0, 0x0000); // data port first (as the firmware does)
|
||||
b.write(VT1200_WIN1, 0x0001); // then a command
|
||||
CHECK(b.read(VT1200_WIN1) == 0x0001); // accepted
|
||||
|
||||
b.tick(); b.tick();
|
||||
CHECK(b.read(VT1200_WIN1) == 0x0000); // completed
|
||||
}
|
||||
```
|
||||
|
||||
Register it in `main()`.
|
||||
|
||||
- [ ] **Step 2: Run test to verify it fails**
|
||||
|
||||
Run: `cd harness/mame && g++ -std=c++17 -o /tmp/t vt1200_board.cpp test_vt1200_board.cpp && /tmp/t`
|
||||
Expected: FAIL — `'set_dma_ticks' was not declared`.
|
||||
|
||||
- [ ] **Step 3: Implement the DMA pair**
|
||||
|
||||
Add `int m_dma_ticks = 0; int m_dma_left = 0;` and `void set_dma_ticks(int n)`. In `write()`, a write to `VT1200_WIN1` (any offset whose high 16 bits are `VT1200_WIN1`) arms `m_dma_left = m_dma_ticks`. In `read()`, while `m_dma_left > 0` return the latched command for `VT1200_WIN1`; once it reaches 0 return `0`. Decrement in `tick()`.
|
||||
|
||||
- [ ] **Step 4: Run the tests to verify they pass**
|
||||
|
||||
Run: `cd harness/mame && g++ -std=c++17 -o /tmp/t vt1200_board.cpp test_vt1200_board.cpp && /tmp/t`
|
||||
Expected: `all board tests passed`
|
||||
|
||||
- [ ] **Step 5: Commit**
|
||||
|
||||
```bash
|
||||
git add harness/mame/vt1200_board.h harness/mame/vt1200_board.cpp harness/mame/test_vt1200_board.cpp
|
||||
git commit -m "harness: model the 0x5800000/0x5900000 DMA command/data pair"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Task 4: Make it configurable, and confirm on real firmware behaviour
|
||||
|
||||
**Files:**
|
||||
- Modify: `harness/mame/vt1200.cpp`
|
||||
- Modify: `harness/mame/BRINGUP_LOG.md`
|
||||
|
||||
**Interfaces:**
|
||||
- Consumes: everything from Tasks 1-3.
|
||||
- Produces: env knobs `VT1200_BOARD_BUSY_W2=<n>`, `VT1200_BOARD_BUSY_W3=<n>`, `VT1200_BOARD_DMA_TICKS=<n>`.
|
||||
|
||||
- [ ] **Step 1: Add the env plumbing**
|
||||
|
||||
In `machine_start()`, read the three new variables and call `set_window_busy_ticks(VT1200_WIN2, ...)`, `set_window_busy_ticks(VT1200_WIN3, ...)`, `set_dma_ticks(...)`. Keep every existing variable working unchanged.
|
||||
|
||||
- [ ] **Step 2: Rebuild and run a parameter sweep**
|
||||
|
||||
Run each of `VT1200_BOARD_BUSY_W2` in `{1,2,4,8}` (with `W3` fixed at 2, DMA at 2, handshake on, switch `0x70`), recording the coverage result:
|
||||
|
||||
```sh
|
||||
for N in 1 2 4 8; do
|
||||
printf "W2=%s -> " "$N"
|
||||
VT1200_BOARD_MODEL=handshake VT1200_BOARD_BUSY_W2=$N VT1200_BOARD_BUSY_W3=2 \
|
||||
VT1200_BOARD_DMA_TICKS=2 VT1200_BOARD_SWITCH="0640000D:70:70" \
|
||||
COV_FRAMES=900 COV_WINDOW=300 timeout 600 $M vt1200 -rompath harness/mame/roms -video none \
|
||||
-sound none -nothrottle -debug -debugger none -autoboot_script harness/mame/coverage.lua -autoboot_delay 0 2>&1 \
|
||||
| grep -E "^frame" | tail -1
|
||||
done
|
||||
```
|
||||
|
||||
Expected: this is an experiment, not a pass/fail — but record which value moves the firmware furthest (most `total_distinct`, or a park point outside the blit loop).
|
||||
|
||||
- [ ] **Step 3: Check whether `INTENB` ever becomes non-zero**
|
||||
|
||||
Run `harness/mame/intr.lua` with the best sweep setting from Step 2.
|
||||
Expected: if `INTENB CHANGED -> <non-zero>` appears, the firmware has passed into interrupt setup — record it, because that is the level-0 boundary. If it stays `0000`, record that too; it means the model is still missing an input.
|
||||
|
||||
- [ ] **Step 4: Record findings**
|
||||
|
||||
Append a section to `harness/mame/BRINGUP_LOG.md` titled
|
||||
"Register model (2026-10-16)" with: the sweep table, the `INTENB` result, and which
|
||||
window/offset still looks unmodelled.
|
||||
|
||||
- [ ] **Step 5: Commit**
|
||||
|
||||
```bash
|
||||
git add harness/mame/vt1200.cpp harness/mame/BRINGUP_LOG.md
|
||||
git commit -m "harness: configurable board model busy timings + findings"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Self-review
|
||||
|
||||
**Spec coverage:** Task 1 establishes the two-shape structure and the unit-test harness; Task 2 covers the `big` shape (`0x6200000`/`0x6400000` with STATUS `+0x10`/CMD `+0x20`); Task 3 covers the `dma` pair (`0x5800000`/`0x5900000`); Task 4 turns env knobs into configuration, which the spec explicitly requires, and its sweep answers the "which values are right" question with data rather than a guess. The spec's *video RAM + renderer* and *DUART/NVRAM* items are deliberately **not** in this plan — they are the two follow-on plans named in the File Structure table above.
|
||||
|
||||
**Placeholder scan:** no TBD/TODO; every code step contains real code; the sweep in Task 4 Step 2 is an experiment by design and its expected-result line says so.
|
||||
|
||||
**Type consistency:** `set_window_busy_ticks(uint32_t, int)` (Task 2) is used unchanged in Task 4; `set_dma_ticks(int)` (Task 3) likewise; the constants `VT1200_WIN0..3` are defined in Task 1 and used in Tasks 2-4 with the same names.
|
||||
|
||||
---
|
||||
|
||||
## Execution note
|
||||
|
||||
The repository is **not** under git (`git status` reports no repo), so the `git add`/`git
|
||||
commit` steps will fail until it is initialised. Execute them only if the user initialises
|
||||
a repository; otherwise treat "Commit" as "stop here and report", and rely on the
|
||||
BRINGUP_LOG for the audit trail.
|
||||
@@ -0,0 +1,136 @@
|
||||
# VT1200 board model — design
|
||||
|
||||
Date: 2026-10-16
|
||||
Status: design approved in conversation; spec written for review
|
||||
|
||||
## Goal
|
||||
|
||||
Get the MAME VT1200 driver through **level 0 and level 1 power-up self-tests to the
|
||||
Terminal Manager window**, with the screen rendering — so the emulator can be compared
|
||||
against the real machine (font table, then the pie graph, then Terminal Manager).
|
||||
|
||||
Level 1 is the smallest scope that produces something *verifiable*. Level 0 alone risks
|
||||
declaring victory on a subtle fake; a fully usable terminal (LANCE + LAT + X sessions) is
|
||||
a larger project that this one is a prerequisite for anyway.
|
||||
|
||||
## Evidence this design rests on
|
||||
|
||||
* The firmware polls a **status bit** and writes a **command**, and the routine that does
|
||||
it takes the **window base as an argument** (bit `0x3FA911C0`), i.e. the windows are
|
||||
driven generically.
|
||||
* Observed layout, from `VT1200_BOARD_LOG` plus disassembly:
|
||||
|
||||
| offset | role | evidence |
|
||||
|---|---|---|
|
||||
| `+0x10` | STATUS, bit 0 = ready/done; bit 2 tested after `FILL XY` | gate 1 poll `while(!(read8(base+0x10) & 1)) delay(100)` |
|
||||
| `+0x20` | COMMAND / DATA, written in a delayed sequence | `move a9,*a11(0x20),0` then `delay(10)`, values 0xCA/0xEA/0x3A/... |
|
||||
| `+0xD0` | mixed I/O — bits 4-6 = **monitor switch** (input), rest latched output | the monitor-switch check at `0x3F2C8320` |
|
||||
|
||||
* Four windows exist: `0x5800000`, `0x5900000`, `0x6200000`, `0x6400000`. All are in the
|
||||
harness's address units (disassembly operand `>> 4`).
|
||||
* The RAM dump contains ROM strings and ROM pointers — the firmware appears to run from a
|
||||
**RAM copy** of the image.
|
||||
* Hardware, confirmed from the service guide, the wiki part number (`TMS34010FNL-50`) and
|
||||
a readable motherboard photo:
|
||||
* CPU **TMS34010FNL-50 = 50 MHz**; display **1280x1024 @ 72 Hz**, mono, 1 bpp.
|
||||
* Main RAM is **CY7C109 SRAM** (~1 MB on the system logic board; 4 MB total).
|
||||
* Video memory is a **separate bank of Toshiba TC514256 DRAMs** — the framebuffer is
|
||||
*not* in main RAM, which is why a RAM dump never located it.
|
||||
* Level 0 = 8 tests within 5 s (incl. interrupt, video control register, I/O data path,
|
||||
illegal monitor, LANCE-not-reset). Level 1 = 15 tests within 25 s (incl. video RAM,
|
||||
video, NVR, Ethernet address ROM, DUART1/2 + timers, host/printer/keyboard/mouse ports,
|
||||
keyboard, mouse). Level 1 begins with on-screen patterns, then a **pie graph**.
|
||||
|
||||
## Architecture
|
||||
|
||||
```
|
||||
vt1200_state (driver)
|
||||
|- TMS34010 50 MHz, 16 pixels/clock (exists)
|
||||
|- screen / palette needs a real renderer (exists, incomplete)
|
||||
|- main RAM 4 MiB (exists)
|
||||
|- vt1200_board NEW: owns all four windows
|
||||
| window[0] 0x5800000 <- register file, common layout
|
||||
| window[1] 0x5900000 <- +0x10 STATUS
|
||||
| window[2] 0x6200000 <- +0x20 COMMAND/DATA
|
||||
| window[3] 0x6400000 <- +0xD0 mixed I/O
|
||||
|- video RAM NEW: separate memory, display scans from here
|
||||
\- (later) mc68681 x2, am79c90, NVRAM, MAC ROM as SIBLING devices
|
||||
```
|
||||
|
||||
Decisions:
|
||||
|
||||
1. **The board device owns no other device.** DUARTs, LANCE, NVRAM and the MAC ROM are
|
||||
siblings wired alongside, so each is independently testable and addable one at a time.
|
||||
2. **Status bits are state, not constants.** A write to `+0x20` arms a small state
|
||||
machine; `+0x10` reports its progress. Forcing constants merely relocates the wedge
|
||||
(demonstrated twice: gates 3 and 4).
|
||||
3. **Test-time env knobs become configuration.** `VT1200_BOARD_SWITCH` etc. become
|
||||
constructor/config parameters, so the model is real rather than a debugging patch.
|
||||
The env-var behaviour stays available for experiments.
|
||||
|
||||
## Risk, and the step this design takes first
|
||||
|
||||
The weakest link was the claim that **all four windows share one layout**. It was
|
||||
validated before construction (see result below), and it is **half true** — there are
|
||||
**two shapes, not one**.
|
||||
|
||||
### Validation result (2026-10-16)
|
||||
|
||||
Every absolute reference to each window, by offset:
|
||||
|
||||
```
|
||||
W2 0x6200000: +00(36) +10(8) +20(1) +30(9) +D0(15) +E0(5) +F0(8)
|
||||
W3 0x6400000: +00(18) +D0(29) +E0(9) +F0(17)
|
||||
W0 0x5800000: +00(24) +20(1) +D0(1)
|
||||
W1 0x5900000: +00(12) +10(1)
|
||||
```
|
||||
|
||||
* **W2 and W3 share a common register set** — identical offsets `+0xD0`, `+0xE0`,
|
||||
`+0xF0`, and both have a `+0x10` STATUS / `+0x20` COMMAND pair. This is the shape the
|
||||
design was built on, and it holds.
|
||||
* **W0 and W1 are a different, simpler shape** — dominated by `+0x00` (24 and 12 sites),
|
||||
with almost nothing at the higher offsets. That matches the disassembly, where
|
||||
`0x5800000`/`0x5900000` act as a **command/data pair at the window base** feeding a
|
||||
byte-addressed (DMA-style) device.
|
||||
* `+0xD0` is referenced at file offset `0x12` — inside the **reset vector region**, which
|
||||
corroborates the service guide's statement that the monitor switch is read only during
|
||||
power-up.
|
||||
|
||||
**Consequence for the design:** two register-file classes, not one.
|
||||
|
||||
```
|
||||
vt1200_win_big (W2 0x6200000, W3 0x6400000) -> STATUS +0x10, CMD +0x20,
|
||||
+0x30, +0xD0 (mixed I/O), +0xE0, +0xF0
|
||||
vt1200_win_pair (W0 0x5800000, W1 0x5900000) -> command/data pair at the base,
|
||||
bit->byte (DMA-style) addressing
|
||||
```
|
||||
|
||||
The "status bits are state machines" and "env knobs become configuration" decisions are
|
||||
unchanged. This is a much cheaper discovery than it would have been after building a
|
||||
single generic class.
|
||||
|
||||
## Scope
|
||||
|
||||
**In:** the four windows as a modelled register file; status state machines; video RAM so
|
||||
the display can render; the two DUARTs and NVRAM/MAC ROM as far as level 1 requires; the
|
||||
monitor switch as configuration; a scanline renderer producing a real image.
|
||||
|
||||
**Out (for now):** a working LANCE/TCP-IP/LAT stack; keyboard and mouse *input* beyond
|
||||
what the level-1 tests probe; sound; bit-accurate peripheral timings.
|
||||
|
||||
## Validation
|
||||
|
||||
* Per-register: write a command, assert the status machine reaches "done".
|
||||
* Per-level: the firmware prints its own progress. Success at level 0 is the firmware
|
||||
moving past the 8 tests; at level 1, reaching the patterns/pie graph/Terminal Manager.
|
||||
* **Visual oracle:** the rendered screen should match the real boot sequence — a
|
||||
character/font table, then a large circle (the pie graph) — which we have on video.
|
||||
* Regression: with the model disabled, the driver must still reproduce the original
|
||||
wedge at `PC=3FDCE400`.
|
||||
|
||||
## Success criteria
|
||||
|
||||
1. ~~The shared-layout hypothesis is confirmed or refuted, with evidence.~~
|
||||
**DONE 2026-10-16 — half confirmed: two shapes (W2/W3 common; W0/W1 a command/data pair).**
|
||||
2. `INTENB` becomes non-zero and level 0 completes.
|
||||
3. A rendered frame shows the boot patterns, comparable against the real machine.
|
||||