diff --git a/devices/pc/machine/5170/ega/1152kb/rev3/debugger/machine.xml b/devices/pc/machine/5170/ega/1152kb/rev3/debugger/machine.xml
index d78ca4649..1a71f56b5 100644
--- a/devices/pc/machine/5170/ega/1152kb/rev3/debugger/machine.xml
+++ b/devices/pc/machine/5170/ega/1152kb/rev3/debugger/machine.xml
@@ -16,6 +16,6 @@
-
+
diff --git a/devices/pc/machine/README.md b/devices/pc/machine/README.md
index 20be221f4..eac8b54f4 100644
--- a/devices/pc/machine/README.md
+++ b/devices/pc/machine/README.md
@@ -65,18 +65,25 @@ Our pre-built [Model 5150](/devices/pc/machine/5150/) machines include:
* [IBM PC, MDA, 64K](/devices/pc/machine/5150/mda/64kb/)
* [IBM PC, MDA, 64K, Debugger](/devices/pc/machine/5150/mda/64kb/debugger/)
+* [IBM PC, MDA, 64K, Soft Keyboard](/devices/pc/machine/5150/mda/64kb/softkbd/)
* [IBM PC, CGA, 64K, DONKEY.BAS](/devices/pc/machine/5150/cga/64kb/donkey/)
* [IBM PC, CGA, 64K, DONKEY.BAS, Debugger](/devices/pc/machine/5150/cga/64kb/donkey/debugger/)
+* [IBM PC, CGA, 64K, Soft Keyboard](/devices/pc/machine/5150/cga/64kb/softkbd/)
+* [IBM PC, CGA, 384K, Soft Keyboard](/devices/pc/machine/5150/cga/384kb/softkbd/)
* [IBM PC, Dual Display, 64K](/devices/pc/machine/5150/dual/64kb/)
### Model 5160 Machine Configurations
+* [IBM PC XT, MDA, 64K, 10Mb Drive, Soft Keyboard](/devices/pc/machine/5160/mda/64kb/softkbd/)
* [IBM PC XT, MDA, 256K, 10Mb Drive](/devices/pc/machine/5160/mda/256kb/)
* [IBM PC XT, MDA, 256K, 10Mb Drive, Debugger](/devices/pc/machine/5160/mda/256kb/debugger/)
* [IBM PC XT, CGA, 256K, 10Mb Drive](/devices/pc/machine/5160/cga/256kb/demo/)
* [IBM PC XT, CGA, 256K, 10Mb Drive, Debugger](/devices/pc/machine/5160/cga/256kb/demo/debugger/)
+* [IBM PC XT, CGA, 256K, 10Mb Drive, Soft Keyboard](/devices/pc/machine/5160/cga/256kb/softkbd/)
* [IBM PC XT, CGA, 256K, Windows 1.01](/devices/pc/machine/5160/cga/256kb/win101/)
* [IBM PC XT, CGA, 256K, Windows 1.01, Debugger](/devices/pc/machine/5160/cga/256kb/win101/debugger/)
+* [IBM PC XT, CGA, 256K, Windows 1.01, Soft Keyboard](/devices/pc/machine/5160/cga/256kb/win101/softkbd/)
+* [IBM PC XT, CGA, 512K, Windows 1.01, Soft Keyboard](/devices/pc/machine/5160/cga/512kb/win101/softkbd/)
* [IBM PC XT, CGA, 640K, 10Mb Drive](/devices/pc/machine/5160/cga/640kb/)
* [IBM PC XT, CGA, 640K, 10Mb Drive, Debugger](/devices/pc/machine/5160/cga/640kb/debugger/)
* [IBM PC XT, CGA, 640K, Multitasking MS-DOS 4.00](/devices/pc/machine/5160/cga/640kb/dos400m/)
@@ -93,13 +100,3 @@ Our pre-built [Model 5150](/devices/pc/machine/5150/) machines include:
* [IBM PC AT (6Mhz), EGA, 640K, Debugger](/devices/pc/machine/5170/ega/640kb/rev1/debugger/)
* [IBM PC AT (6Mhz), EGA, 1152Kb, 20Mb Drive, Debugger](/devices/pc/machine/5170/ega/1152kb/rev1/debugger/)
* [IBM PC AT (8Mhz), EGA, 1152Kb, 20Mb Drive, Debugger](/devices/pc/machine/5170/ega/1152kb/rev3/debugger/)
-
-### Machine Configurations with "Soft Keyboards"
-
-* [IBM PC, MDA, 64K](/devices/pc/machine/5150/mda/64kb/softkbd/)
-* [IBM PC, CGA, 64K](/devices/pc/machine/5150/cga/64kb/softkbd/)
-* [IBM PC, CGA, 384K](/devices/pc/machine/5150/cga/384kb/softkbd/)
-* [IBM PC XT, MDA, 64K, 10Mb Drive](/devices/pc/machine/5160/mda/64kb/softkbd/)
-* [IBM PC XT, CGA, 256K, 10Mb Drive](/devices/pc/machine/5160/cga/256kb/softkbd/)
-* [IBM PC XT, CGA, 256K, Windows 1.01](/devices/pc/machine/5160/cga/256kb/win101/softkbd/)
-* [IBM PC XT, CGA, 512K, Windows 1.01](/devices/pc/machine/5160/cga/512kb/win101/softkbd/)
diff --git a/disks/pc/windows/1.04/README.md b/disks/pc/windows/1.04/README.md
new file mode 100644
index 000000000..727857964
--- /dev/null
+++ b/disks/pc/windows/1.04/README.md
@@ -0,0 +1,280 @@
+---
+layout: page
+title: Microsoft Windows 1.04
+permalink: /disks/pc/windows/1.04/
+---
+
+Microsoft Windows 1.04
+---
+
+Directory listings of the seven 360Kb distribution diskettes are provided below.
+
+### Directory of Windows 1.04 (SETUP)
+
+ Volume in drive A is SETUP
+
+ Directory of A:\
+
+ SETUP LBL 8 08-11-86 11:59a
+ SETUP EXE 36700 03-30-87 11:53a
+ KERNEL EXE 34111 04-07-87 5:40p
+ SYSTEM DRV 2663 07-09-86 3:15p
+ USA DRV 4005 03-31-87 9:50a
+ UK DRV 4009 03-31-87 9:51a
+ GERMANY DRV 4758 03-31-87 9:51a
+ FRANCE DRV 4773 03-31-87 9:51a
+ ITALY DRV 4027 03-31-87 9:51a
+ SPAIN DRV 4630 03-31-87 9:51a
+ SWEDEN DRV 4649 03-31-87 9:51a
+ NORWAY DRV 4649 03-31-87 9:51a
+ DENMARK DRV 4649 03-31-87 9:51a
+ ATTKBD DRV 3903 05-22-86 4:21p
+ MOUSE DRV 3358 08-21-86 5:15p
+ NOMOUSE DRV 1592 05-22-86 10:42a
+ MSMOUSE1 DRV 1966 05-22-86 10:45a
+ MSMOUSE2 DRV 1966 05-22-86 10:45a
+ LPC DRV 2438 05-22-86 10:41a
+ FTG DRV 1961 05-22-86 10:48a
+ JOYMOUSE DRV 2114 05-22-86 10:35a
+ LMOUSE DRV 2661 05-02-86 5:47p
+ ATTMOUSE DRV 2305 05-22-86 2:30p
+ CGA DRV 13008 06-24-86 8:39p
+ HERCULES DRV 15776 06-24-86 8:41p
+ EGAMONO DRV 13952 06-24-86 8:36p
+ EGAHIBW DRV 13952 06-24-86 8:35p
+ EGALORES DRV 15648 06-24-86 8:46p
+ EGAHIRES DRV 17536 06-24-86 8:47p
+ ATTDC DRV 15776 02-27-87 2:24p
+ ATTDEB DRV 17824 05-23-86 2:23p
+ GENIUS DRV 15216 02-22-87 2:22a
+ SOUND DRV 5853 05-22-86 11:49a
+ COMM DRV 4863 01-26-87 12:52p
+ LOFONTS FON 5552 07-29-86 4:42p
+ HIFONTS FON 7472 07-29-86 4:42p
+ FONTS400 FON 7952 07-29-86 4:42p
+ RAMDRIVE SYS 6680 08-01-86 5:59a
+ EMM PC 12898 07-30-85 5:15p
+ EMM AT 12874 07-30-85 5:33p
+ WRITE DAT 47 08-11-86 12:02p
+ 41 file(s) 340774 bytes
+
+ Total files listed:
+ 41 file(s) 340774 bytes
+ 3072 bytes free
+
+### Directory of Windows 1.04 (BUILD)
+
+ Volume in drive A is BUILD
+
+ Directory of A:\
+
+ BUILD LBL 8 08-11-86 12:02p
+ GDI EXE 93502 04-09-87 11:40a
+ USER EXE 122848 04-08-87 8:19p
+ MSDOSD EXE 6242 06-23-86 2:32p
+ MSDOS EXE 43104 03-25-87 10:45p
+ CGA GRB 1394 04-10-87 5:49p
+ EGALORES GRB 1257 04-10-87 5:50p
+ EGAHIRES GRB 15 07-24-85 1:55p
+ EGAHIBW GRB 15 07-24-85 1:55p
+ EGAMONO GRB 1105 04-10-87 5:50p
+ HERCULES GRB 1294 04-10-87 5:49p
+ ATTDC GRB 1307 02-22-86 10:34a
+ ATTDEB GRB 12 05-23-86 1:11p
+ GENIUS GRB 9 07-29-86 3:55p
+ WIN CNF 1936 11-12-85 4:13p
+ EGALORES LGO 9 06-27-85 12:29p
+ EGAHIRES LGO 9 06-27-85 12:29p
+ EGAHIBW LGO 9 06-27-85 12:29p
+ GENIUS LGO 9 06-27-85 12:29p
+ EGAMONO LGO 2942 03-30-87 11:40a
+ HERCULES LGO 3066 03-30-87 11:40a
+ CGA LGO 2943 03-30-87 11:39a
+ ATTDC LGO 2916 05-28-86 11:30a
+ ATTDEB LGO 3095 05-28-86 11:31a
+ WIN INI 2093 05-22-86 1:50p
+ WINOLDAP MOD 19824 08-01-86 3:16a
+ SPOOLER EXE 13360 04-08-87 7:53p
+ 27 file(s) 324323 bytes
+
+ Total files listed:
+ 27 file(s) 324323 bytes
+ 18432 bytes free
+
+### Directory of Windows 1.04 (UTILITY)
+
+ Volume in drive A is UTILITY
+
+ Directory of A:\
+
+ UTILITY LBL 11 04-02-87 11:30a
+ EPSON DRV 14352 04-02-87 11:30a
+ HPPCL DRV 72064 04-02-87 11:30a
+ IBMGRX DRV 12288 04-02-87 11:30a
+ OKI92 DRV 12416 04-02-87 11:30a
+ CITOH DRV 12016 04-02-87 11:30a
+ TI850 DRV 11584 04-02-87 11:30a
+ TOSH DRV 12432 04-02-87 11:30a
+ NECP2 DRV 12304 04-02-87 11:30a
+ SG10 DRV 14848 04-02-87 11:30a
+ EPSONMX DRV 12176 04-02-87 11:30a
+ TTY DRV 4800 04-02-87 11:30a
+ PSCRIPT DRV 112752 04-02-87 11:30a
+ THINKJET DRV 12128 04-02-87 11:30a
+ XER4020 DRV 21024 04-02-87 11:30a
+ 15 file(s) 337195 bytes
+
+ Total files listed:
+ 15 file(s) 337195 bytes
+ 16384 bytes free
+
+### Directory of Windows 1.04 (FONT)
+
+ Volume in drive A is FONT
+
+ Directory of A:\
+
+ FONT LBL 7 04-02-87 11:28a
+ COURA FON 8720 04-02-87 11:28a
+ COURB FON 12304 04-02-87 11:28a
+ COURC FON 8784 04-02-87 11:28a
+ COURD FON 15136 04-02-87 11:28a
+ HELVA FON 27056 04-02-87 11:28a
+ HELVB FON 37680 04-02-87 11:28a
+ HELVC FON 26624 04-02-87 11:28a
+ HELVD FON 45600 04-02-87 11:28a
+ TMSRA FON 26256 04-02-87 11:28a
+ TMSRB FON 36240 04-02-87 11:28a
+ TMSRC FON 25824 04-02-87 11:28a
+ TMSRD FON 45200 04-02-87 11:28a
+ ROMAN FON 11120 04-02-87 11:28a
+ SCRIPT FON 10304 04-02-87 11:28a
+ MODERN FON 7584 04-02-87 11:28a
+ 16 file(s) 344439 bytes
+
+ Total files listed:
+ 16 file(s) 344439 bytes
+ 9216 bytes free
+
+### Directory of Windows 1.04 (APPS)
+
+ Volume in drive A is APPS
+
+ Directory of A:\
+
+ CALC EXE 26496 03-11-87 9:55a
+ CALENDAR EXE 37552 05-22-86 7:55a
+ CARDFILE EXE 36992 05-22-86 4:23a
+ CLIPBRD EXE 9712 05-22-86 6:17a
+ CLOCK EXE 7984 05-22-86 6:08a
+ CONTROL EXE 52736 03-16-87 5:13p
+ NOTEPAD EXE 18736 05-22-86 6:28a
+ PAINT EXE 90512 05-11-87 2:35p
+ REVERSI EXE 15392 03-11-87 10:15a
+ TERMINAL EXE 47344 06-12-86 11:22a
+ ABC TXT 42 06-04-85 9:07a
+ DOTHIS TXT 493 10-25-85 1:02p
+ 12 file(s) 343991 bytes
+
+ Total files listed:
+ 12 file(s) 343991 bytes
+ 11264 bytes free
+
+### Directory of Windows 1.04 (PROGRAM)
+
+ Volume in drive A is WRITE
+
+ Directory of A:\
+
+ PIF
05-08-87 12:18p
+ README TXT 10173 04-07-87 5:57p
+ WRITE EXE 192176 05-08-87 10:00a
+ PRACTICE WRI 2944 09-09-85 3:04p
+ 4 file(s) 205293 bytes
+
+ Directory of A:\PIF
+
+ . 05-08-87 12:18p
+ .. 05-08-87 12:18p
+ PIFEDIT EXE 28528 03-23-87 12:48p
+ 123 PIF 369 10-26-85 12:57p
+ 123-2 PIF 369 10-26-85 12:58p
+ BASIC PIF 369 10-14-85 6:02p
+ BASICA PIF 369 10-14-85 6:03p
+ CHART PIF 369 09-18-85 11:09a
+ CLOUT PIF 369 06-26-85 2:39p
+ DBASE PIF 369 09-18-85 11:16a
+ DBASE2 PIF 369 09-18-85 11:16a
+ DBASE3 PIF 369 09-18-85 11:17a
+ DW2PG PIF 369 09-18-85 11:18a
+ DW3PG PIF 369 09-18-85 11:19a
+ FILE PIF 369 09-18-85 11:28a
+ FW PIF 369 07-16-86 12:21p
+ FWC PIF 369 09-18-85 11:29a
+ FWT PIF 369 09-18-85 11:30a
+ GRAPH PIF 369 09-18-85 11:31a
+ HTPM PIF 369 01-03-80 4:23p
+ IBMFILE PIF 369 09-18-85 11:44a
+ IBMGRAPH PIF 369 09-18-85 11:45a
+ IBMREPRT PIF 369 01-03-80 3:12p
+ IBMWRITE PIF 369 01-03-80 3:23p
+ LOTUS PIF 369 10-26-85 12:58p
+ LOTUS2 PIF 369 10-26-85 1:17p
+ MP PIF 369 09-18-85 11:35a
+ MSACCESS PIF 369 12-18-85 1:09p
+ PE PIF 369 05-01-86 4:45p
+ PC-DRAW PIF 369 09-24-85 10:39a
+ PFSACCES PIF 369 01-03-80 3:36p
+ PLAN PIF 369 09-18-85 11:49a
+ PROEDIT PIF 369 09-18-85 11:50a
+ PROJ PIF 369 09-18-85 11:51a
+ PROJM PIF 369 09-18-85 11:52a
+ QB PIF 369 08-08-86 11:35a
+ RB5000 PIF 369 11-07-85 5:16p
+ RBASE PIF 369 09-18-85 12:02p
+ REPORT PIF 369 09-18-85 12:03p
+ RG PIF 369 09-18-85 12:04p
+ SC3 PIF 369 09-18-85 12:05p
+ SCOM PIF 369 09-18-85 12:06p
+ SCOMII PIF 369 09-18-85 12:06p
+ SPELL PIF 369 09-19-85 11:53a
+ SYMPHACC PIF 369 08-27-85 6:37a
+ SYMPHONY PIF 369 09-18-85 12:13p
+ TURBO PIF 369 09-18-85 12:13p
+ VX PIF 369 01-03-80 3:45p
+ WORD PIF 369 10-14-86 12:25p
+ WORDEGA PIF 369 03-11-87 11:08a
+ WP PIF 369 09-18-85 12:18p
+ WRDPERF PIF 369 08-06-85 4:48p
+ WRITE PIF 369 09-18-85 12:19p
+ WS PIF 369 09-18-85 12:20p
+ WS2 PIF 369 08-08-86 5:29p
+ XTALK PIF 369 09-18-85 12:21p
+ XYWRITE PIF 369 01-03-80 1:31p
+ 57 file(s) 48454 bytes
+
+ Total files listed:
+ 61 file(s) 253747 bytes
+ 70656 bytes free
+
+### Directory of Windows 1.04 (SUPPLEMENTAL)
+
+ Volume in drive A is SPDISK
+
+ Directory of A:\
+
+ PCLPFM PIF 369 01-14-87 8:26a
+ SOFTFONT INI 1341 01-12-87 12:31p
+ PCLPFM EXE 23892 03-09-87 6:49p
+ LASRHARD TXT 372 06-11-86 11:23a
+ LASRSOFT TXT 372 06-11-86 11:22a
+ HP7470A DRV 16336 07-29-86 2:20p
+ NEC3550 DRV 22512 05-22-86 10:23a
+ PSPREP TXT 15600 01-11-87 3:01p
+ PSREADME TXT 7047 04-06-87 11:17a
+ HPREADME TXT 5852 03-27-87 5:36p
+ 10 file(s) 93693 bytes
+
+ Total files listed:
+ 10 file(s) 93693 bytes
+ 264192 bytes free
diff --git a/disks/pc/windows/1.04/WIN104-DISK6-WRITE.json b/disks/pc/windows/1.04/WIN104-DISK6-PROGRAM.json
similarity index 100%
rename from disks/pc/windows/1.04/WIN104-DISK6-WRITE.json
rename to disks/pc/windows/1.04/WIN104-DISK6-PROGRAM.json
diff --git a/disks/pc/windows/1.04/manifest.xml b/disks/pc/windows/1.04/manifest.xml
index 70f7e6b7c..5c693ff41 100644
--- a/disks/pc/windows/1.04/manifest.xml
+++ b/disks/pc/windows/1.04/manifest.xml
@@ -18,8 +18,8 @@
Windows 1.04 (APPS)
-
- Windows 1.04 (WRITE)
+
+ Windows 1.04 (PROGRAM)
Windows 1.04 (SUPP)
diff --git a/docs/pcjs/demos/components.xsl b/docs/pcjs/demos/components.xsl
index f78efd175..44847d83e 100644
--- a/docs/pcjs/demos/components.xsl
+++ b/docs/pcjs/demos/components.xsl
@@ -712,10 +712,16 @@
+
+
+
+ 0
+
+
serial
- ,adapter:,binding:''
+ ,adapter:,binding:'',tabSize:
diff --git a/modules/pcjs/lib/serialport.js b/modules/pcjs/lib/serialport.js
index 31777fcde..4d9a29e3d 100644
--- a/modules/pcjs/lib/serialport.js
+++ b/modules/pcjs/lib/serialport.js
@@ -48,6 +48,11 @@ if (NODE) {
*
* adapter: 1 (for port 0x3F8) or 2 (for port 0x2F8); 0 if not defined
*
+ * binding: name of a control (based on its "binding" attribute) to bind to this port's I/O
+ *
+ * tabSize: set to a non-zero number to convert tabs to spaces (applies only to output to
+ * the above binding); default is 0 (no conversion)
+ *
* WARNING: Since the XSL file defines 'adapter' as a number, not a string, there's no need to
* use parseInt(), and as an added benefit, we don't need to worry about whether a hex or decimal
* format was used.
@@ -96,6 +101,14 @@ function SerialPort(parmsSerial) {
*/
this.controlIOBuffer = null;
+ /*
+ * If controlIOBuffer is being used AND 'tabSize' is set, then we make an attempt to monitor the characters
+ * being echoed via echoByte(), maintain a logical column position, and convert any tabs into the appropriate
+ * number of spaces.
+ */
+ this.tabSize = parmsSerial['tabSize'];
+ this.iLogicalCol = 0;
+
Component.call(this, "SerialPort", parmsSerial, SerialPort, Messages.SERIAL);
var sBinding = parmsSerial['binding'];
@@ -805,13 +818,27 @@ SerialPort.prototype.updateIRR = function()
SerialPort.prototype.echoByte = function(b)
{
if (this.controlIOBuffer) {
- if (b != 0x0D) {
- if (b == 0x08) {
- this.controlIOBuffer.value = this.controlIOBuffer.value.slice(0, -1);
- } else {
- this.controlIOBuffer.value += String.fromCharCode(b);
- this.controlIOBuffer.scrollTop = this.controlIOBuffer.scrollHeight;
+ if (b == 0x0D) {
+ this.iLogicalCol = 0;
+ }
+ else if (b == 0x08) {
+ this.controlIOBuffer.value = this.controlIOBuffer.value.slice(0, -1);
+ /*
+ * TODO: Back up the correct number of columns if the character erased was a tab.
+ */
+ if (this.iLogicalCol > 0) this.iLogicalCol--;
+ }
+ else {
+ var s = String.fromCharCode(b);
+ var nChars = (b >= 0x20? 1 : 0);
+ if (b == 0x09) {
+ var tabSize = this.tabSize || 8;
+ nChars = tabSize - (this.iLogicalCol % tabSize);
+ if (this.tabSize) s = str.pad("", nChars);
}
+ this.controlIOBuffer.value += s;
+ this.controlIOBuffer.scrollTop = this.controlIOBuffer.scrollHeight;
+ this.iLogicalCol += nChars;
}
return true;
}
diff --git a/modules/pcjs/templates/components.xsl b/modules/pcjs/templates/components.xsl
index 26d8b8f34..ec6b11c4e 100644
--- a/modules/pcjs/templates/components.xsl
+++ b/modules/pcjs/templates/components.xsl
@@ -714,10 +714,16 @@
+
+
+
+ 0
+
+
serial
- ,adapter:,binding:''
+ ,adapter:,binding:'',tabSize: