mirror of
https://github.com/livingcomputermuseum/ContrAlto.git
synced 2026-01-13 15:18:23 +00:00
Implemented Alto Keyset at long last, cleaned up Trident controller somewhat. Finished Trident commandset for SDL console. Updated readme files and installer WXS in preparation for 1.2.2 release.
This commit is contained in:
parent
38124350fb
commit
3e281b318b
@ -41,7 +41,7 @@ namespace Contralto
|
||||
_keyboard = new Keyboard();
|
||||
_diskController = new DiskController(this);
|
||||
_displayController = new DisplayController(this);
|
||||
_mouse = new Mouse();
|
||||
_mouseAndKeyset = new MouseAndKeyset();
|
||||
_ethernetController = new EthernetController(this);
|
||||
_orbitController = new OrbitController(this);
|
||||
_audioDAC = new AudioDAC(this);
|
||||
@ -53,7 +53,7 @@ namespace Contralto
|
||||
// Attach memory-mapped devices to the bus
|
||||
_memBus.AddDevice(_mem);
|
||||
_memBus.AddDevice(_keyboard);
|
||||
_memBus.AddDevice(_mouse);
|
||||
_memBus.AddDevice(_mouseAndKeyset);
|
||||
_memBus.AddDevice(_audioDAC);
|
||||
_memBus.AddDevice(_organKeyboard);
|
||||
|
||||
@ -71,7 +71,7 @@ namespace Contralto
|
||||
_diskController.Reset();
|
||||
_displayController.Reset();
|
||||
_keyboard.Reset();
|
||||
_mouse.Reset();
|
||||
_mouseAndKeyset.Reset();
|
||||
_cpu.Reset();
|
||||
_ethernetController.Reset();
|
||||
_orbitController.Reset();
|
||||
@ -231,11 +231,11 @@ namespace Contralto
|
||||
|
||||
if (newImage)
|
||||
{
|
||||
newPack = InMemoryDiskPack.CreateEmpty(geometry, path);
|
||||
newPack = FileBackedDiskPack.CreateEmpty(geometry, path);
|
||||
}
|
||||
else
|
||||
{
|
||||
newPack = InMemoryDiskPack.Load(geometry, path);
|
||||
newPack = FileBackedDiskPack.Load(geometry, path);
|
||||
}
|
||||
|
||||
_tridentController.Drives[drive].LoadPack(newPack);
|
||||
@ -301,9 +301,9 @@ namespace Contralto
|
||||
get { return _keyboard; }
|
||||
}
|
||||
|
||||
public Mouse Mouse
|
||||
public MouseAndKeyset MouseAndKeyset
|
||||
{
|
||||
get { return _mouse; }
|
||||
get { return _mouseAndKeyset; }
|
||||
}
|
||||
|
||||
public EthernetController EthernetController
|
||||
@ -330,7 +330,7 @@ namespace Contralto
|
||||
private MemoryBus _memBus;
|
||||
private Memory.Memory _mem;
|
||||
private Keyboard _keyboard;
|
||||
private Mouse _mouse;
|
||||
private MouseAndKeyset _mouseAndKeyset;
|
||||
private DiskController _diskController;
|
||||
private DisplayController _displayController;
|
||||
private EthernetController _ethernetController;
|
||||
|
||||
@ -211,7 +211,7 @@ namespace Contralto.CPU
|
||||
case BusSource.ReadMouse:
|
||||
// "BUS[12-15]<-MOUSE; BUS[0-13]<- -1"
|
||||
// (Note -- BUS[0-13] appears to be a typo, and should likely be BUS[0-11]).
|
||||
_busData = (ushort)(_cpu._system.Mouse.PollMouseBits() | 0xfff0);
|
||||
_busData = (ushort)(_cpu._system.MouseAndKeyset.PollMouseBits() | 0xfff0);
|
||||
break;
|
||||
|
||||
case BusSource.ReadDisp:
|
||||
|
||||
@ -206,7 +206,7 @@
|
||||
<Compile Include="IO\EthernetController.cs" />
|
||||
<Compile Include="IO\HostEthernetEncapsulation.cs" />
|
||||
<Compile Include="IO\Keyboard.cs" />
|
||||
<Compile Include="IO\Mouse.cs" />
|
||||
<Compile Include="IO\MouseAndKeyset.cs" />
|
||||
<Compile Include="Logging\Log.cs" />
|
||||
<Compile Include="Memory\IMemoryMappedDevice.cs" />
|
||||
<Compile Include="Memory\Memory.cs" />
|
||||
|
||||
@ -196,19 +196,36 @@ namespace Contralto.IO
|
||||
//
|
||||
if (e.Packet.LinkLayerType == LinkLayers.Ethernet)
|
||||
{
|
||||
EthernetPacket packet = (EthernetPacket)Packet.ParsePacket(LinkLayers.Ethernet, e.Packet.Data);
|
||||
|
||||
UpdateSourceAddress();
|
||||
|
||||
if ((int)packet.Type == _3mbitFrameType && // encapsulated 3mbit frames
|
||||
(!packet.SourceHwAddress.Equals(_10mbitSourceAddress))) // and not sent by this emulator
|
||||
//
|
||||
// We wrap this in a try/catch; on occasion Packet.ParsePacket fails due to a bug
|
||||
// in the PacketDotNet library.
|
||||
//
|
||||
EthernetPacket packet = null;
|
||||
try
|
||||
{
|
||||
Log.Write(LogComponent.HostNetworkInterface, "Received encapsulated 3mbit packet.");
|
||||
_callback(new System.IO.MemoryStream(packet.PayloadData));
|
||||
packet = (EthernetPacket)Packet.ParsePacket(LinkLayers.Ethernet, e.Packet.Data);
|
||||
}
|
||||
else
|
||||
catch (Exception ex)
|
||||
{
|
||||
// Not for us, discard the packet.
|
||||
// Just eat this, log a message.
|
||||
Log.Write(LogType.Error, LogComponent.HostNetworkInterface, "Failed to parse 3mbit packet. Exception {0}", ex.Message);
|
||||
packet = null;
|
||||
}
|
||||
|
||||
if (packet != null)
|
||||
{
|
||||
UpdateSourceAddress();
|
||||
|
||||
if ((int)packet.Type == _3mbitFrameType && // encapsulated 3mbit frames
|
||||
(!packet.SourceHwAddress.Equals(_10mbitSourceAddress))) // and not sent by this emulator
|
||||
{
|
||||
Log.Write(LogComponent.HostNetworkInterface, "Received encapsulated 3mbit packet.");
|
||||
_callback(new System.IO.MemoryStream(packet.PayloadData));
|
||||
}
|
||||
else
|
||||
{
|
||||
// Not for us, discard the packet.
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -30,13 +30,28 @@ namespace Contralto.IO
|
||||
Right = 0x2,
|
||||
Left = 0x4,
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Implements the hardware for the standard Alto mouse.
|
||||
/// </summary>
|
||||
public class Mouse : IMemoryMappedDevice
|
||||
|
||||
[Flags]
|
||||
public enum AltoKeysetKey
|
||||
{
|
||||
public Mouse()
|
||||
None = 0x00,
|
||||
Keyset0 = 0x80, // left-most (bit 8)
|
||||
Keyset1 = 0x40,
|
||||
Keyset2 = 0x20,
|
||||
Keyset3 = 0x10,
|
||||
Keyset4 = 0x08, // right-most (bit 12)
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Implements the hardware for the standard Alto mouse
|
||||
/// and the Keyset, because both share the same memory-mapped
|
||||
/// address. When the Diablo printer is finally emulated,
|
||||
/// I'll have to revisit this scheme because it ALSO shares
|
||||
/// the same address and that's just silly.
|
||||
/// </summary>
|
||||
public class MouseAndKeyset : IMemoryMappedDevice
|
||||
{
|
||||
public MouseAndKeyset()
|
||||
{
|
||||
_lock = new ReaderWriterLockSlim();
|
||||
Reset();
|
||||
@ -44,12 +59,13 @@ namespace Contralto.IO
|
||||
|
||||
public void Reset()
|
||||
{
|
||||
|
||||
_keyset = 0;
|
||||
_buttons = AltoMouseButton.None;
|
||||
}
|
||||
|
||||
public ushort Read(int address, TaskType task, bool extendedMemoryReference)
|
||||
{
|
||||
return (ushort)(~_buttons);
|
||||
return (ushort)~((int)_buttons | (int)_keyset);
|
||||
}
|
||||
|
||||
public void Load(int address, ushort data, TaskType task, bool extendedMemoryReference)
|
||||
@ -81,6 +97,16 @@ namespace Contralto.IO
|
||||
_buttons ^= button;
|
||||
}
|
||||
|
||||
public void KeysetDown(AltoKeysetKey key)
|
||||
{
|
||||
_keyset |= key;
|
||||
}
|
||||
|
||||
public void KeysetUp(AltoKeysetKey key)
|
||||
{
|
||||
_keyset ^= key;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the bits read by the "<-MOUSE" special function, and moves
|
||||
/// the pointer one step closer to its final destination (if it has moved at all).
|
||||
@ -177,6 +203,9 @@ namespace Contralto.IO
|
||||
// Mouse buttons:
|
||||
AltoMouseButton _buttons;
|
||||
|
||||
// Keyset switches:
|
||||
AltoKeysetKey _keyset;
|
||||
|
||||
/// <summary>
|
||||
/// Where the mouse is currently reported to be
|
||||
/// </summary>
|
||||
File diff suppressed because it is too large
Load Diff
@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
|
||||
// You can specify all the values or you can default the Build and Revision Numbers
|
||||
// by using the '*' as shown below:
|
||||
// [assembly: AssemblyVersion("1.0.*")]
|
||||
[assembly: AssemblyVersion("1.2.1")]
|
||||
[assembly: AssemblyFileVersion("1.2.1.0")]
|
||||
[assembly: AssemblyVersion("1.2.2")]
|
||||
[assembly: AssemblyFileVersion("1.2.2.0")]
|
||||
|
||||
@ -313,7 +313,7 @@ namespace Contralto.SdlUI
|
||||
|
||||
if (dx != 0 || dy != 0)
|
||||
{
|
||||
_system.Mouse.MouseMove(dx, dy);
|
||||
_system.MouseAndKeyset.MouseMove(dx, dy);
|
||||
|
||||
// Don't handle the very next Mouse Move event (which will just be the motion we caused in the
|
||||
// below line...)
|
||||
@ -337,6 +337,11 @@ namespace Contralto.SdlUI
|
||||
{
|
||||
_system.Keyboard.KeyDown(_keyMap[code]);
|
||||
}
|
||||
|
||||
if (_keysetMap.ContainsKey(code))
|
||||
{
|
||||
_system.MouseAndKeyset.KeysetDown(_keysetMap[code]);
|
||||
}
|
||||
}
|
||||
|
||||
private void KeyUp(SDL.SDL_Keycode code)
|
||||
@ -359,6 +364,11 @@ namespace Contralto.SdlUI
|
||||
{
|
||||
_system.Keyboard.KeyUp(_keyMap[code]);
|
||||
}
|
||||
|
||||
if (_keysetMap.ContainsKey(code))
|
||||
{
|
||||
_system.MouseAndKeyset.KeysetUp(_keysetMap[code]);
|
||||
}
|
||||
}
|
||||
|
||||
private void MouseDown(byte button, int x, int y)
|
||||
@ -383,7 +393,7 @@ namespace Contralto.SdlUI
|
||||
|
||||
if (altoButton != AltoMouseButton.None)
|
||||
{
|
||||
_system.Mouse.MouseDown(altoButton);
|
||||
_system.MouseAndKeyset.MouseDown(altoButton);
|
||||
}
|
||||
}
|
||||
|
||||
@ -398,7 +408,7 @@ namespace Contralto.SdlUI
|
||||
|
||||
if (altoButton != AltoMouseButton.None)
|
||||
{
|
||||
_system.Mouse.MouseUp(altoButton);
|
||||
_system.MouseAndKeyset.MouseUp(altoButton);
|
||||
}
|
||||
}
|
||||
|
||||
@ -559,6 +569,14 @@ namespace Contralto.SdlUI
|
||||
_keyMap.Add(SDL.SDL_Keycode.SDLK_LEFTBRACKET, AltoKey.LBracket);
|
||||
_keyMap.Add(SDL.SDL_Keycode.SDLK_RIGHTBRACKET, AltoKey.RBracket);
|
||||
_keyMap.Add(SDL.SDL_Keycode.SDLK_DOWN, AltoKey.LF);
|
||||
|
||||
_keysetMap = new Dictionary<SDL.SDL_Keycode, AltoKeysetKey>();
|
||||
// Map the 5 keyset keys to F5-F9.
|
||||
_keysetMap.Add(SDL.SDL_Keycode.SDLK_F5, AltoKeysetKey.Keyset0);
|
||||
_keysetMap.Add(SDL.SDL_Keycode.SDLK_F6, AltoKeysetKey.Keyset1);
|
||||
_keysetMap.Add(SDL.SDL_Keycode.SDLK_F7, AltoKeysetKey.Keyset2);
|
||||
_keysetMap.Add(SDL.SDL_Keycode.SDLK_F8, AltoKeysetKey.Keyset3);
|
||||
_keysetMap.Add(SDL.SDL_Keycode.SDLK_F9, AltoKeysetKey.Keyset4);
|
||||
}
|
||||
|
||||
private static AltoMouseButton GetMouseButton(byte button)
|
||||
@ -620,6 +638,11 @@ namespace Contralto.SdlUI
|
||||
//
|
||||
private Dictionary<SDL.SDL_Keycode, AltoKey> _keyMap;
|
||||
|
||||
//
|
||||
// Keymap data
|
||||
//
|
||||
private Dictionary<SDL.SDL_Keycode, AltoKeysetKey> _keysetMap;
|
||||
|
||||
//
|
||||
// Mouse data
|
||||
//
|
||||
|
||||
@ -209,6 +209,21 @@ namespace Contralto.SdlUI
|
||||
return CommandResult.Normal;
|
||||
}
|
||||
|
||||
[DebuggerFunction("new disk", "Creates and loads a new image for the specified drive.", "<drive>")]
|
||||
private CommandResult NewDisk(ushort drive, string path)
|
||||
{
|
||||
if (drive > 1)
|
||||
{
|
||||
throw new InvalidOperationException("Drive specification out of range.");
|
||||
}
|
||||
|
||||
// Unload the current pack.
|
||||
_system.LoadDiabloDrive(drive, path, true);
|
||||
Console.WriteLine("Drive {0} created and loaded.", drive);
|
||||
|
||||
return CommandResult.Normal;
|
||||
}
|
||||
|
||||
[DebuggerFunction("show disk", "Displays the contents of the specified drive.", "<drive>")]
|
||||
private CommandResult ShowDisk(ushort drive)
|
||||
{
|
||||
@ -262,6 +277,21 @@ namespace Contralto.SdlUI
|
||||
return CommandResult.Normal;
|
||||
}
|
||||
|
||||
[DebuggerFunction("new trident", "Creates and loads a new image for the specified drive.", "<drive>")]
|
||||
private CommandResult NewTrident(ushort drive, string path)
|
||||
{
|
||||
if (drive > 7)
|
||||
{
|
||||
throw new InvalidOperationException("Drive specification out of range.");
|
||||
}
|
||||
|
||||
// Unload the current pack.
|
||||
_system.LoadTridentDrive(drive, path, true);
|
||||
Console.WriteLine("Trident {0} created and loaded.", drive);
|
||||
|
||||
return CommandResult.Normal;
|
||||
}
|
||||
|
||||
[DebuggerFunction("show trident", "Displays the contents of the specified trident drive.", "<drive>")]
|
||||
private CommandResult ShowTrident(ushort drive)
|
||||
{
|
||||
|
||||
@ -734,6 +734,11 @@ namespace Contralto
|
||||
{
|
||||
_system.Keyboard.KeyDown(_keyMap[e.KeyCode]);
|
||||
}
|
||||
|
||||
if (_keysetMap.ContainsKey(e.KeyCode))
|
||||
{
|
||||
_system.MouseAndKeyset.KeysetDown(_keysetMap[e.KeyCode]);
|
||||
}
|
||||
|
||||
if (e.Alt)
|
||||
{
|
||||
@ -753,8 +758,13 @@ namespace Contralto
|
||||
if (_keyMap.ContainsKey(e.KeyCode))
|
||||
{
|
||||
_system.Keyboard.KeyUp(_keyMap[e.KeyCode]);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if (_keysetMap.ContainsKey(e.KeyCode))
|
||||
{
|
||||
_system.MouseAndKeyset.KeysetUp(_keysetMap[e.KeyCode]);
|
||||
}
|
||||
|
||||
if (e.Alt)
|
||||
{
|
||||
ReleaseMouse();
|
||||
@ -789,7 +799,7 @@ namespace Contralto
|
||||
|
||||
if (dx != 0 || dy != 0)
|
||||
{
|
||||
_system.Mouse.MouseMove(dx, dy);
|
||||
_system.MouseAndKeyset.MouseMove(dx, dy);
|
||||
|
||||
// Don't handle the very next Mouse Move event (which will just be the motion we caused in the
|
||||
// below line...)
|
||||
@ -830,7 +840,7 @@ namespace Contralto
|
||||
break;
|
||||
}
|
||||
|
||||
_system.Mouse.MouseDown(button);
|
||||
_system.MouseAndKeyset.MouseDown(button);
|
||||
|
||||
}
|
||||
|
||||
@ -863,7 +873,7 @@ namespace Contralto
|
||||
break;
|
||||
}
|
||||
|
||||
_system.Mouse.MouseUp(button);
|
||||
_system.MouseAndKeyset.MouseUp(button);
|
||||
}
|
||||
|
||||
private void CaptureMouse()
|
||||
@ -873,7 +883,7 @@ namespace Contralto
|
||||
// - Keep the mouse within our window bounds (so it doesn't escape our window, hence "capture").
|
||||
// - Put some text in the Status area telling people how to leave...
|
||||
_mouseCaptured = true;
|
||||
ShowCursor(false);
|
||||
ShowCursor(false);
|
||||
|
||||
CaptureStatusLabel.Text = "Alto Mouse/Keyboard captured. Press Alt to release.";
|
||||
}
|
||||
@ -881,7 +891,7 @@ namespace Contralto
|
||||
private void ReleaseMouse()
|
||||
{
|
||||
_mouseCaptured = false;
|
||||
ShowCursor(true);
|
||||
ShowCursor(true);
|
||||
|
||||
CaptureStatusLabel.Text = "Click on display to capture Alto Mouse/Keyboard.";
|
||||
}
|
||||
@ -1079,7 +1089,16 @@ namespace Contralto
|
||||
_keyMap.Add(Keys.OemSemicolon, AltoKey.Semicolon);
|
||||
_keyMap.Add(Keys.OemOpenBrackets, AltoKey.LBracket);
|
||||
_keyMap.Add(Keys.OemCloseBrackets, AltoKey.RBracket);
|
||||
_keyMap.Add(Keys.Down, AltoKey.LF);
|
||||
_keyMap.Add(Keys.Down, AltoKey.LF);
|
||||
|
||||
_keysetMap = new Dictionary<Keys, AltoKeysetKey>();
|
||||
|
||||
// Map the 5 keyset keys to F5-F9.
|
||||
_keysetMap.Add(Keys.F5, AltoKeysetKey.Keyset0);
|
||||
_keysetMap.Add(Keys.F6, AltoKeysetKey.Keyset1);
|
||||
_keysetMap.Add(Keys.F7, AltoKeysetKey.Keyset2);
|
||||
_keysetMap.Add(Keys.F8, AltoKeysetKey.Keyset3);
|
||||
_keysetMap.Add(Keys.F9, AltoKeysetKey.Keyset4);
|
||||
}
|
||||
|
||||
private ImageCodecInfo GetEncoderForFormat(ImageFormat format)
|
||||
@ -1158,6 +1177,9 @@ namespace Contralto
|
||||
// Keyboard mapping from windows vkeys to Alto keys
|
||||
private Dictionary<Keys, AltoKey> _keyMap;
|
||||
|
||||
// Keyset mapping from windows vkeys to Keyset keys
|
||||
private Dictionary<Keys, AltoKeysetKey> _keysetMap;
|
||||
|
||||
// Mouse capture state
|
||||
private bool _mouseCaptured;
|
||||
private bool _currentCursorState;
|
||||
|
||||
@ -19,15 +19,18 @@ ContrAlto currently emulates the following Alto hardware:
|
||||
- Two Diablo Model 31 or 44 drives
|
||||
- Ethernet (encapsulated in UDP datagrams on the host machine)
|
||||
- Standard Keyboard/Mouse/Video
|
||||
- Alto Keyset (5-key chording keyboard)
|
||||
- Audio DAC (used with the Smalltalk Music System)
|
||||
- The Orbit raster hardware, Dover Raster Output Scanner and Dover print
|
||||
engine, which provides 384dpi print output (currently PDF only)
|
||||
- The Trident Disk Controller (TriCon) and up to eight T-80 or T-300
|
||||
drives
|
||||
|
||||
1.2 What's Not
|
||||
--------------
|
||||
|
||||
At this time, ContrAlto does not support more exotic hardware such as Trident
|
||||
disks, printers or audio using the utility port, or the keyset input device.
|
||||
At this time, ContrAlto does not support more exotic hardware such as printers
|
||||
or audio using the utility port.
|
||||
|
||||
The Audio DAC is technically emulated, but output is not connected to an audio
|
||||
device on non-Windows platforms at this time.
|
||||
@ -143,8 +146,16 @@ Blank-Bottom F3
|
||||
DEL Del
|
||||
LOCK F4
|
||||
|
||||
3.1.3 Keyset
|
||||
------------
|
||||
|
||||
3.1.3 Disk Packs
|
||||
A 5-key chording keyboard referred to as the "keyset" was a standard peripheral
|
||||
in the early days of the Alto. (It never caught on.) The 5 keys on the keyset
|
||||
are mapped to F5-F9 on your keyboard, with F5 corresponding to the leftmost key
|
||||
and F9 corresponding to the rightmost.
|
||||
|
||||
|
||||
3.1.4 Disk Packs
|
||||
----------------
|
||||
|
||||
A real Alto uses large 14" disk packs for disk storage, each containing
|
||||
@ -153,8 +164,8 @@ data. ContrAlto uses files, referred to as "disk images" or just "images"
|
||||
that contain a bit-for-bit copy of these original packs. These are a lot
|
||||
easier to use with a modern PC.
|
||||
|
||||
Disk images can be loaded and unloaded via the "Load Disk" command. (See Section
|
||||
5 for details on this and other commands.)
|
||||
Disk images can be loaded and unloaded via the "Load Disk" and "Unload Disk"
|
||||
commands. (See Section 5 for details on this and other commands.)
|
||||
|
||||
If you modify the contents of a loaded disk (for example creating new files or
|
||||
deleting existing ones) the changes will be written back out to the disk image
|
||||
@ -166,14 +177,30 @@ ContrAlto does not come with any disk images, however an assortment of Alto
|
||||
programs can be found on Bitsavers.org, at
|
||||
http://www.bitsavers.org/bits/Xerox/Alto/disk_images/. Images include:
|
||||
|
||||
AllGames.dsk - A collection of games and toys for the Alto
|
||||
Bcpl.dsk - A set of BCPL development tools
|
||||
Diags.dsk - Diagnostic tools
|
||||
NonProg.dsk - The "Non-Programmer's Disk," containing Bravo
|
||||
Xmsmall.dsk - Smalltalk-76
|
||||
AllGames.dsk - A collection of games and toys for the Alto
|
||||
chm/Bcpl.dsk - A set of BCPL development tools
|
||||
chm/Diags.dsk - Diagnostic tools
|
||||
chm/Bravox.dsk - The BravoX word processing environment
|
||||
chm/Xmsmall.dsk - Smalltalk-76
|
||||
|
||||
|
||||
3.1.4 Startup, Reset and Shutdown
|
||||
3.1.5 Trident Disk Packs
|
||||
------------------------
|
||||
|
||||
Some Altos were used as file or print servers and needed greater storage
|
||||
capacity than the Diablo drives could provide. These Altos used a special
|
||||
controller, referred to as the Trident (or TriCon) which could control up to
|
||||
eight Century (later Xerox) T-80 or T-300 drives with a capacity of 80 or
|
||||
300 megabytes, respectively.
|
||||
|
||||
ContrAlto can emulate a Trident controller and up to eight T-80 or T-300 drives
|
||||
(in any combination.) Like the Diablo, the contents of these disk packs are
|
||||
stored in image files. These are loaded, unloaded, or created using the
|
||||
"Load Trident," "Unload Trident" commands. (See Section 5 for
|
||||
details on this and other commands.)
|
||||
|
||||
|
||||
3.1.5 Startup, Reset and Shutdown
|
||||
---------------------------------
|
||||
|
||||
The system can be started at any time by using the "Start" command, though
|
||||
@ -372,11 +399,25 @@ Start With Keyboard Net Boot - Starts the emulated Alto with the keyboard ethern
|
||||
either in the configuration file or by the Set Keyboard Net Boot File
|
||||
command.
|
||||
|
||||
Load Disk <drive> <path> - Loads the specified drive (0 or 1) with the requested disk image.
|
||||
Load Disk <drive> <path> - Loads the specified Diablo drive (0 or 1) with the requested disk image.
|
||||
|
||||
Unload Disk <drive> - Unloads the specified drive (0 or 1). Changes to disk contents are saved.
|
||||
Unload Disk <drive> - Unloads the specified Diablo drive (0 or 1). Changes to disk contents are saved.
|
||||
|
||||
Show Disk <drive> - Displays the currently loaded image for the specified drive (0 or 1).
|
||||
Create Disk <drive> - Creates a new (empty) disk image and loads the specified Diablo drive with it.
|
||||
|
||||
Show Disk <drive> - Displays the currently loaded image for the specified Diablo drive (0 or 1).
|
||||
|
||||
Load Trident <drive> <path> - Loads the specified Trident drive (0 through 7) with the requested
|
||||
disk image.
|
||||
|
||||
Unload Trident <drive> - Unloads the specified Trident drive (0 through 7). Changes to disk
|
||||
contents are saved.
|
||||
|
||||
Create Trident <drive> - Creates a new (empty) disk image and loads the specified Trident drive with it.
|
||||
Specifying a file extension of ".dsk80" will create a new T-80 disk; an extension
|
||||
of ".dsk300" will create a new T-300 disk.
|
||||
|
||||
Show Trident <drive> - Displays the currently loaded image for the specified drive (0 through 7).
|
||||
|
||||
Show System Type - Displays the Alto system type as configured by the configuration file.
|
||||
|
||||
@ -424,8 +465,13 @@ specifying the file to be net booted.
|
||||
At the moment, the following issues are known and being worked on. If you find
|
||||
an issue not listed here, see section 7.0 to report a new bug.
|
||||
|
||||
- TriEx reports a status of "00000" randomly when doing read operations from
|
||||
Trident disks. TFU, and IFS work correctly.
|
||||
|
||||
- Audio is not available on Unix / OS X.
|
||||
|
||||
- Fullscreen video is not yet implemented on Unix / OS X.
|
||||
|
||||
|
||||
7.0 Reporting Bugs
|
||||
==================
|
||||
@ -475,6 +521,15 @@ PDF generation is provided by the iTextSharp library, see: https://github.com/it
|
||||
10.0 Change History
|
||||
===================
|
||||
|
||||
V1.2.2
|
||||
------
|
||||
- Initial support for the Trident controller and associated T-80 and T-300
|
||||
drives.
|
||||
- Added support for the Alto Keyset. (Finally.)
|
||||
- Fixed bug in XM bank register soft-reset behavior. IFS now runs.
|
||||
- Fixed issue with ethernet encapsulation that caused the emulator to receive
|
||||
its own packets.
|
||||
|
||||
V1.2.1
|
||||
------
|
||||
- Completed implementation of Orbit, Dover ROS and Dover print engine.
|
||||
|
||||
@ -18,17 +18,20 @@ ContrAlto currently emulates the following Alto hardware:
|
||||
- 256KW of main memory (in 64KW banks)
|
||||
- Two Diablo Model 31 or 44 drives
|
||||
- Ethernet (encapsulated in either UDP datagrams or raw Ethernet frames
|
||||
on the host machine)
|
||||
on the host machine)
|
||||
- Standard Keyboard/Mouse/Video
|
||||
- Alto Keyset (5-key chording keyboard)
|
||||
- Audio DAC (used with the Smalltalk Music System)
|
||||
- The Orbit raster hardware, Dover Raster Output Scanner and Dover print
|
||||
engine, which provides 384dpi print output (currently PDF only)
|
||||
- The Trident Disk Controller (TriCon) and up to eight T-80 or T-300
|
||||
drives
|
||||
|
||||
1.2 What's Not
|
||||
--------------
|
||||
|
||||
At this time, ContrAlto does not support more exotic hardware such as Trident
|
||||
disks, printers or audio using the utility port or the keyset input device.
|
||||
At this time, ContrAlto does not support more exotic hardware such as printers
|
||||
or audio using the utility port.
|
||||
|
||||
|
||||
2.0 Requirements
|
||||
@ -138,8 +141,17 @@ DEL Del
|
||||
LOCK F4
|
||||
|
||||
|
||||
3.1.3 Disk Packs
|
||||
----------------
|
||||
3.1.3 Keyset
|
||||
------------
|
||||
|
||||
A 5-key chording keyboard referred to as the "keyset" was a standard peripheral
|
||||
in the early days of the Alto. (It never caught on.) The 5 keys on the keyset
|
||||
are mapped to F5-F9 on your keyboard, with F5 corresponding to the leftmost key
|
||||
and F9 corresponding to the rightmost.
|
||||
|
||||
|
||||
3.1.4 Diablo Disk Packs
|
||||
-----------------------
|
||||
|
||||
A real Alto uses large 14" disk packs for disk storage, each containing
|
||||
approximately 2.5 megabytes (for Diablo 31) or 5 megabytes (for Diablo 44) of
|
||||
@ -147,7 +159,7 @@ data. ContrAlto uses files, referred to as "disk images" or just "images"
|
||||
that contain a bit-for-bit copy of these original packs. These are a lot
|
||||
easier to use with a modern PC.
|
||||
|
||||
Disk images can be loaded and unloaded via the "System->Drive 0" and
|
||||
Disk images can be loaded, unloaded and created via the "System->Drive 0" and
|
||||
System->Drive 1" menus. A file dialog will be presented showing possible disk
|
||||
images in the current directory.
|
||||
|
||||
@ -161,14 +173,29 @@ ContrAlto does not come with any disk images, however an assortment of Alto
|
||||
programs can be found on Bitsavers.org, at
|
||||
http://www.bitsavers.org/bits/Xerox/Alto/disk_images/. Images include:
|
||||
|
||||
AllGames.dsk - A collection of games and toys for the Alto
|
||||
Bcpl.dsk - A set of BCPL development tools
|
||||
Diags.dsk - Diagnostic tools
|
||||
NonProg.dsk - The "Non-Programmer's Disk," containing Bravo
|
||||
Xmsmall.dsk - Smalltalk-76
|
||||
AllGames.dsk - A collection of games and toys for the Alto
|
||||
chm/Bcpl.dsk - A set of BCPL development tools
|
||||
chm/Diags.dsk - Diagnostic tools
|
||||
chm/Bravox.dsk - The BravoX word processing environment
|
||||
chm/Xmsmall.dsk - Smalltalk-76
|
||||
|
||||
|
||||
3.1.4 Startup, Reset and Shutdown
|
||||
3.1.5 Trident Disk Packs
|
||||
------------------------
|
||||
|
||||
Some Altos were used as file or print servers and needed greater storage
|
||||
capacity than the Diablo drives could provide. These Altos used a special
|
||||
controller, referred to as the Trident (or TriCon) which could control up to
|
||||
eight Century (later Xerox) T-80 or T-300 drives with a capacity of 80 or
|
||||
300 megabytes, respectively.
|
||||
|
||||
ContrAlto can emulate a Trident controller and up to eight T-80 or T-300 drives
|
||||
(in any combination.) Like the Diablo, the contents of these disk packs are
|
||||
stored in image files. These are loaded, unloaded, or created using the
|
||||
System->Trident Drives->Drive N menus.
|
||||
|
||||
|
||||
3.1.6 Startup, Reset and Shutdown
|
||||
---------------------------------
|
||||
|
||||
The system can be started at any time by using the "System->Start" menu, though
|
||||
@ -465,8 +492,8 @@ Reserved Memory:
|
||||
6.0 Known Issues
|
||||
================
|
||||
|
||||
At the moment, there are no major known issues. If you encounter any, please
|
||||
see the next section!
|
||||
- TriEx reports a status of "00000" randomly when doing read operations from
|
||||
Trident disks. TFU and IFS work correctly.
|
||||
|
||||
|
||||
7.0 Reporting Bugs
|
||||
@ -518,6 +545,15 @@ PDF generation is provided by the iTextSharp library, see: https://github.com/it
|
||||
10.0 Change History
|
||||
===================
|
||||
|
||||
V1.2.2
|
||||
------
|
||||
- Initial support for the Trident controller and associated T-80 and T-300
|
||||
drives.
|
||||
- Added support for the Alto Keyset. (Finally.)
|
||||
- Fixed bug in XM bank register soft-reset behavior. IFS now runs.
|
||||
- Fixed issue with ethernet encapsulation that caused the emulator to receive
|
||||
its own packets.
|
||||
|
||||
V1.2.1
|
||||
------
|
||||
- Completed implementation of Orbit, Dover ROS and Dover print engine.
|
||||
|
||||
@ -17,18 +17,18 @@
|
||||
-->
|
||||
|
||||
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
|
||||
<Product Id="CE5F3D08-3BD6-4BDF-9C64-0C2B852B899C" Name="ContrAlto" Language="1033" Version="1.1.0" Manufacturer="Living Computers: Museum+Labs" UpgradeCode="38d6b09f-6e7b-4854-844a-5d4ab707a357">
|
||||
<Product Id="CE5F3D08-3BD6-4BDF-9C64-0C2B852B899C" Name="ContrAlto" Language="1033" Version="1.2.1" Manufacturer="Living Computers: Museum+Labs" UpgradeCode="38d6b09f-6e7b-4854-844a-5d4ab707a357">
|
||||
<Package Id="*" InstallerVersion="200" Compressed="yes" InstallScope="perMachine" />
|
||||
|
||||
<Upgrade Id="38d6b09f-6e7b-4854-844a-5d4ab707a357">
|
||||
<UpgradeVersion OnlyDetect="yes" Property="SELFFOUND"
|
||||
Minimum="1.2.0" IncludeMinimum="yes"
|
||||
Maximum="1.2.0" IncludeMaximum="yes" />
|
||||
Minimum="1.2.1" IncludeMinimum="yes"
|
||||
Maximum="1.2.1" IncludeMaximum="yes" />
|
||||
<UpgradeVersion OnlyDetect="yes" Property="NEWERFOUND"
|
||||
Minimum="1.2.0" IncludeMinimum="no" />
|
||||
Minimum="1.2.1" IncludeMinimum="no" />
|
||||
</Upgrade>
|
||||
|
||||
<CustomAction Id="AlreadyUpdated" Error="[ProductName] 1.1 has already been updated to 1.2.0 or newer." />
|
||||
<CustomAction Id="AlreadyUpdated" Error="[ProductName] 1.2 has already been updated to 1.2.1 or newer." />
|
||||
<CustomAction Id="NoDowngrade" Error="A later version of [ProductName] is already installed." />
|
||||
|
||||
<InstallExecuteSequence>
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user