From 47b12390d001ba8a024d4b56b090ee080c448e01 Mon Sep 17 00:00:00 2001 From: Jeff Date: Wed, 5 Apr 2017 21:30:36 -0700 Subject: [PATCH 1/3] Updated MACRO-10 diagnostic README files --- apps/pdp10/README.md | 5 +- apps/pdp10/diags/ka10/README.md | 89 +++++++++++++++++---------------- 2 files changed, 50 insertions(+), 44 deletions(-) diff --git a/apps/pdp10/README.md b/apps/pdp10/README.md index 42f4ebbdb..6a1bc92d2 100644 --- a/apps/pdp10/README.md +++ b/apps/pdp10/README.md @@ -7,8 +7,11 @@ permalink: /apps/pdp10/ PDP-10 Software --------------- -PCjs provides the following PDP-10 software: +PCjs has archived the following DEC PDP-10 software: - [DEC PDP-10 Diagnostics](diags/) + +PCjs also includes a random collection of home-grown PDP-10 tests: + - [PDPjs PDP-10 Opcode Tests](tests/opcodes/) - [PDPjs MACRO-10 Mini-Assembler Tests](tests/macro10/) diff --git a/apps/pdp10/diags/ka10/README.md b/apps/pdp10/diags/ka10/README.md index b47261bc7..9f61d3525 100644 --- a/apps/pdp10/diags/ka10/README.md +++ b/apps/pdp10/diags/ka10/README.md @@ -11,46 +11,8 @@ PCjs has archived selected KA10 diagnostic source files from the [PDP-10 KLAD Diagnostics Sources](http://pdp-10.trailing-edge.com/klad_sources/index.html) and turned them into stand-alone PDP-10 diagnostics, using the new PCjs [MACRO-10 Mini-Assembler](/modules/pdp10/lib/macro10.js). -Complete lists of supported [diagnostics](#list-of-ka10-diagnostics) and [reliability tests](#list-of-ka10-reliability-tests) -are provided below. - -I've also experimented with assembling these diagnostics from the original (unmodified) source files. For example, -you can go to the [DAKAK Diagnostic](dakak/) page and try the following command: - - a 'DAKAKT.MAC;../PARAM.KLM;../FIXED.KLM;DAKAKM.MAC;../UUOERR.KLM;../STOR.KLM' - -and while the MACRO-10 assembly process works: - - loading DAKAKT.MAC - loading PARAM.KLM - loading FIXED.KLM - loading DAKAKM.MAC - loading UUOERR.KLM - loading STOR.KLM - 6301 words loaded at 000137-044630, start address 030000 - 00=000000000000 01=000000000000 02=000000000000 03=000000000000 - 04=000000000000 05=000000000000 06=000000000000 07=000000000000 - 10=000000000000 11=000000000000 12=000000000000 13=000000000000 - 14=000000000000 15=000000000000 16=000000000000 17=000000000000 - PC=030000 RA=00000000 EA=000000 PS=000000 OV=0 C0=0 C1=0 ND=0 PD=0 - 030000: 254020 027776 JRST @27776 - -there are additional modules that must be loaded into the machine as well, which are not yet supported. So it's best -to assemble the modified files that I've placed inside each diagnostic's folder. For the [DAKAK Diagnostic](dakak/), -that's **DAKAK.MAC**: - - >> a DAKAK.MAC - loading DAKAK.MAC - 5849 words loaded at 000137-044133, start address 030621 - 00=000000000000 01=000000000000 02=000000000000 03=000000000000 - 04=000000000000 05=000000000000 06=000000000000 07=000000000000 - 10=000000000000 11=000000000000 12=000000000000 13=000000000000 - 14=000000000000 15=000000000000 16=000000000000 17=000000000000 - PC=030621 RA=00000000 EA=000000 PS=000000 OV=0 C0=0 C1=0 ND=0 PD=0 - 030621: 254000 030622 JRST 30622 - -If the machine is able to run to the end of the diagnostic (which can be located by looking at the diagnostic's original -MACRO-10 listing file) without stopping on an UUO opcode, then you can assume it passed. +Lists of supported [diagnostics](#list-of-ka10-diagnostics) and [reliability tests](#list-of-ka10-reliability-tests) +are provided below, as well as some [notes](#notes-on-ka10-diagnostics) on assembling the diagnostics. List of KA10 Diagnostics ------------------------ @@ -135,7 +97,7 @@ so far. - TESTS OF MULTIPY, INTERGER MULTIPLY, DIVIDE, INTERGER DIVIDE* - [KA10 Basic Instruction Diagnostic #12 (MAINDEC-10-DAKAL)](dakal/) - TESTS THE MULTIPY, INTERGER MULIPLY, DIVIDE AND INTERGER DIVIDE INSTRUCTIONS* -- [KA10 Basic Instruction Diagnostic #13 (MAINDEC-10-DAKAL)](dakam/) +- [KA10 Basic Instruction Diagnostic #13 (MAINDEC-10-DAKAM)](dakam/) - TESTS THE BYTE, BLOCK TRANSFER AND JFFO INSTRUCTIONS *Gotta love those multipy, interger muliply, and interger divide tests! -JP @@ -143,8 +105,49 @@ so far. List of KA10 Reliability Tests ------------------------------ -Like the diagnostics above, the following list of KA10 Reliability Tests are simple those tests that have been archived and tested -with PDPjs so far. +Like the diagnostics above, the following list of KA10 Reliability Tests are simple those tests that have been +archived and tested with PDPjs so far. - [KA10 Basic Instruction Reliability Test #1 (MAINDEC-10-DAKBA)](dakba/) - COMPARES, SKIPS, EXCHANGES, BOOLE, ROTATES, TESTS + +Notes on KA10 Diagnostics +------------------------- + +It's possible to assemble some of the above diagnostics from the original (unmodified) source files. For example, +you can go to the [DAKAK Diagnostic](dakak/) page and enter the following Debugger command: + + a 'DAKAKT.MAC;../PARAM.KLM;../FIXED.KLM;DAKAKM.MAC;../UUOERR.KLM;../STOR.KLM' + +However, while the MACRO-10 assembly process appears to work: + + loading DAKAKT.MAC + loading PARAM.KLM + loading FIXED.KLM + loading DAKAKM.MAC + loading UUOERR.KLM + loading STOR.KLM + 6301 words loaded at 000137-044630, start address 030000 + 00=000000000000 01=000000000000 02=000000000000 03=000000000000 + 04=000000000000 05=000000000000 06=000000000000 07=000000000000 + 10=000000000000 11=000000000000 12=000000000000 13=000000000000 + 14=000000000000 15=000000000000 16=000000000000 17=000000000000 + PC=030000 RA=00000000 EA=000000 PS=000000 OV=0 C0=0 C1=0 ND=0 PD=0 + 030000: 254020 027776 JRST @27776 + +there are additional modules that must be loaded into the machine as well, which are not yet supported. So it's best +to assemble the modified files that have been placed inside each diagnostic's folder. For the [DAKAK Diagnostic](dakak/), +that's **DAKAK.MAC**: + + >> a DAKAK.MAC + loading DAKAK.MAC + 5849 words loaded at 000137-044133, start address 030621 + 00=000000000000 01=000000000000 02=000000000000 03=000000000000 + 04=000000000000 05=000000000000 06=000000000000 07=000000000000 + 10=000000000000 11=000000000000 12=000000000000 13=000000000000 + 14=000000000000 15=000000000000 16=000000000000 17=000000000000 + PC=030621 RA=00000000 EA=000000 PS=000000 OV=0 C0=0 C1=0 ND=0 PD=0 + 030621: 254000 030622 JRST 30622 + +If the machine is able to run to the end of the diagnostic (which can be located by looking at the diagnostic's original +MACRO-10 listing file) without stopping on an UUO opcode, then the diagnostic likely succeeded. From 15e97df68e6c8143c59849c462d2e75e5dc6c04f Mon Sep 17 00:00:00 2001 From: Jeff Parsons Date: Fri, 14 Apr 2017 10:52:37 -0700 Subject: [PATCH 2/3] Updated the page on DEC V100 ROMs to include more information on the character generator ROM --- devices/pc8080/rom/vt100/README.md | 62 +++++++++++++++++++++++++++++- 1 file changed, 61 insertions(+), 1 deletion(-) diff --git a/devices/pc8080/rom/vt100/README.md b/devices/pc8080/rom/vt100/README.md index e8191e935..68e84aaec 100644 --- a/devices/pc8080/rom/vt100/README.md +++ b/devices/pc8080/rom/vt100/README.md @@ -43,7 +43,67 @@ produces a perfect match for Trammell Hudson's [VT100.bin](http://trmm.net/image ### Character Generator (2Kb) The VT100 also used one 2Kb character generator ROM, which is stored in [23-018E2.json](23-018E2.json). -The ROM contains 128 rows of character data, 16 bytes per character. More on the format of that data later. +The ROM contains 128 rows of character data, 16 bytes per character. Only 10 of each of the 16 bytes are used. + +To understand the format of the character data, let's take a look at the data for the letter "A", which has an ASCII code +of 65 (0x41). That means the data for "A" should start at offset 0x41 * 0x10, or 0x410. Here's the corresponding line from +[23-018E2.json](23-018E2.json): + + 0x10,0x28,0x44,0x82,0xFE,0x82,0x82,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 0x00000410 .(D............. + +and if we display the data as bits instead of bytes: + + . . . 1 . . . . // 0x10 + . . 1 . 1 . . . // 0x28 + . 1 . . . 1 . . // 0x44 + 1 . . . . . 1 . // 0x82 + 1 1 1 1 1 1 1 . // 0xFE + 1 . . . . . 1 . // 0x82 + 1 . . . . . 1 . // 0x82 + . . . . . . . . // 0x00 + . . . . . . . . // 0x00 + . . . . . . . . // 0x00 + +it should be clear how the shape of the character is defined. However, the character generator ROM doesn't tell the whole story, +because the VT100's display circuitry has a few additional tricks up its sleeve. + +Since the ROM contains only 8 bits of data for each character row, and character cells are effectively 10x10 (or 9x10 in 132-column +mode), there is a natural gap between adjacent characters. However, when horizontal line-drawing characters are used, the VT100 wants +those characters to seamlessly connect with one another, so if the final bit in any row of character data is set, the VT100 will +"replicate" that bit across the rest of cell. + +As page 4-52 of DEC's [VT100 Technical Manual (July 1982)](http://bitsavers.informatik.uni-stuttgart.de/pdf/dec/terminal/vt100/EK-VT100-TM-003_VT100_Technical_Manual_Jul82.pdf) +explains: + + Data, coming either from the screen RAM for scan 1 or the line buffer for scans 2 through 10, becomes part of an + address to a character generator ROM. (See Figure 4-6-4, Character Generator Example.) The rest of the address comes + from a scan counter in the DC012 control chip. The scan counter addresses the ROM according to which oftne ten scans + is to be displayed. The 4-bit scan counter skips over the other 6 possible addresses to the ROM, so the ROM contains + data in only 10 out of 16 locations. The output of the ROM is eight bits that represent the pattern of sequential + dots to be displayed for that character on that scan. The eight bits enter the video shift register, a serializer + that converts the eiight parallel bits into a one-bit-wide stream. An extra flip-flop stores the last bit so it can + be output to the stream two or three extra times (depending on line length) to fill the intercharacter space. + +Also, VT100 circuitry includes a "Dot Stretcher" to make vertical lines appear as thick as horizontal lines. If you look +at page 4-76 of DEC's [VT100 Technical Manual (July 1982)](http://bitsavers.informatik.uni-stuttgart.de/pdf/dec/terminal/vt100/EK-VT100-TM-003_VT100_Technical_Manual_Jul82.pdf), +you'll see the effect of the VT100's Dot Stretcher. Here's a copy of DEC's illustration: + + 20 dots for 2 characters ("Ap") in 80-col mode Actual characters displayed after dot stretching + + 0 . . . . . . . . . . . . . . . . . . . . 0 . . . . . . . . . . . . . . . . . . . . + 1 . . . . 1 . . . . . . . . . . . . . . . 1 . . . . 1 1 . . . . . . . . . . . . . . + 2 . . . 1 . 1 . . . . . . . . . . . . . . 2 . . . 1 1 1 1 . . . . . . . . . . . . . + 3 . . 1 . . . 1 . . . . 1 . 1 1 1 1 . . . 3 . . 1 1 . . 1 1 . . . 1 1 1 1 1 1 1 . . + 4 . 1 . . . . . 1 . . . 1 1 . . . . 1 . . 4 . 1 1 . . . . 1 1 . . 1 1 1 . . . 1 1 . + 5 . 1 1 1 1 1 1 1 . . . 1 1 . . . . 1 . . 5 . 1 1 1 1 1 1 1 1 . . 1 1 1 . . . 1 1 . + 6 . 1 . . . . . 1 . . . 1 . 1 1 1 1 . . . 6 . 1 1 . . . . 1 1 . . 1 1 1 1 1 1 1 . . + 7 . 1 . . . . . 1 . . . 1 . . . . . . . . 7 . 1 1 . . . . 1 1 . . 1 1 . . . . . . . + 8 . . . . . . . . . . . 1 . . . . . . . . 8 . . . . . . . . . . . 1 1 . . . . . . . + 9 . . . . . . . . . . . 1 . . . . . . . . 9 . . . . . . . . . . . 1 1 . . . . . . . + +The PC8080 [Video](/modules/pc8080/lib/video.js) function *createFontVariation()* takes both the "dot replication" and "dot stretching" +features into account (along with other parameters, such as underlining and reverse video) when converting the character generator ROM data +into fonts. ### Disassembling the 8080 Firmware From e1d38c71b827d38c876826941151fe1f2f9ff7a2 Mon Sep 17 00:00:00 2001 From: Jeff Parsons Date: Fri, 14 Apr 2017 13:36:54 -0700 Subject: [PATCH 3/3] Some Markdown formatting fixes --- devices/pc8080/rom/vt100/README.md | 76 +++++++++++++++++------------- 1 file changed, 44 insertions(+), 32 deletions(-) diff --git a/devices/pc8080/rom/vt100/README.md b/devices/pc8080/rom/vt100/README.md index 68e84aaec..837b8d036 100644 --- a/devices/pc8080/rom/vt100/README.md +++ b/devices/pc8080/rom/vt100/README.md @@ -14,18 +14,18 @@ The combined contents of those ROMs have been stored as an 8Kb JSON image in [VT As Trammell Hudson's [VT100 Page](https://trmm.net/VT100) explains: - There are four 8316E ROM chips for the 8080 CPU on the logic board. Since they are custom mask ROMs, - Digital was able to have a different chip-select bit pattern and avoided having separate NOT gates on - the inputs. Note that the schematic appears to be incorrect -- E56 is the low order, and E40 is the - high order address bits. +> There are four 8316E ROM chips for the 8080 CPU on the logic board. Since they are custom mask ROMs, +Digital was able to have a different chip-select bit pattern and avoided having separate NOT gates on +the inputs. Note that the schematic appears to be incorrect -- E56 is the low order, and E40 is the +high order address bits. He then describes the memory map as follows: - ROM chip CS1 (20) A11/CS2 (18) A12/CS3 (21) Mapped address - E40 H H H 0x1800 - E45 H L H 0x1000 - E52 H H L 0x0800 - E56 H L L 0x0000 + ROM chip CS1 (20) A11/CS2 (18) A12/CS3 (21) Mapped address + E40 H H H 0x1800 + E45 H L H 0x1000 + E52 H H L 0x0800 + E56 H L L 0x0000 The above PCB chip locations correspond to the following [DEC ROMs](/devices/roms/dec/): @@ -75,35 +75,47 @@ those characters to seamlessly connect with one another, so if the final bit in As page 4-52 of DEC's [VT100 Technical Manual (July 1982)](http://bitsavers.informatik.uni-stuttgart.de/pdf/dec/terminal/vt100/EK-VT100-TM-003_VT100_Technical_Manual_Jul82.pdf) explains: - Data, coming either from the screen RAM for scan 1 or the line buffer for scans 2 through 10, becomes part of an - address to a character generator ROM. (See Figure 4-6-4, Character Generator Example.) The rest of the address comes - from a scan counter in the DC012 control chip. The scan counter addresses the ROM according to which oftne ten scans - is to be displayed. The 4-bit scan counter skips over the other 6 possible addresses to the ROM, so the ROM contains - data in only 10 out of 16 locations. The output of the ROM is eight bits that represent the pattern of sequential - dots to be displayed for that character on that scan. The eight bits enter the video shift register, a serializer - that converts the eiight parallel bits into a one-bit-wide stream. An extra flip-flop stores the last bit so it can - be output to the stream two or three extra times (depending on line length) to fill the intercharacter space. +> Data, coming either from the screen RAM for scan 1 or the line buffer for scans 2 through 10, becomes part of an +address to a character generator ROM. (See Figure 4-6-4, Character Generator Example.) The rest of the address comes +from a scan counter in the DC012 control chip. The scan counter addresses the ROM according to which of the ten scans +is to be displayed. The 4-bit scan counter skips over the other 6 possible addresses to the ROM, so the ROM contains +data in only 10 out of 16 locations. The output of the ROM is eight bits that represent the pattern of sequential +dots to be displayed for that character on that scan. The eight bits enter the video shift register, a serializer +that converts the eight parallel bits into a one-bit-wide stream. An extra flip-flop stores the last bit so it can +be output to the stream two or three extra times (depending on line length) to fill the intercharacter space. Also, VT100 circuitry includes a "Dot Stretcher" to make vertical lines appear as thick as horizontal lines. If you look at page 4-76 of DEC's [VT100 Technical Manual (July 1982)](http://bitsavers.informatik.uni-stuttgart.de/pdf/dec/terminal/vt100/EK-VT100-TM-003_VT100_Technical_Manual_Jul82.pdf), -you'll see the effect of the VT100's Dot Stretcher. Here's a copy of DEC's illustration: +you'll see the effect of the VT100's Dot Stretcher. Here's how DEC illustrates it: - 20 dots for 2 characters ("Ap") in 80-col mode Actual characters displayed after dot stretching + 20 dots for 2 characters ("Ap") in 80-col mode - 0 . . . . . . . . . . . . . . . . . . . . 0 . . . . . . . . . . . . . . . . . . . . - 1 . . . . 1 . . . . . . . . . . . . . . . 1 . . . . 1 1 . . . . . . . . . . . . . . - 2 . . . 1 . 1 . . . . . . . . . . . . . . 2 . . . 1 1 1 1 . . . . . . . . . . . . . - 3 . . 1 . . . 1 . . . . 1 . 1 1 1 1 . . . 3 . . 1 1 . . 1 1 . . . 1 1 1 1 1 1 1 . . - 4 . 1 . . . . . 1 . . . 1 1 . . . . 1 . . 4 . 1 1 . . . . 1 1 . . 1 1 1 . . . 1 1 . - 5 . 1 1 1 1 1 1 1 . . . 1 1 . . . . 1 . . 5 . 1 1 1 1 1 1 1 1 . . 1 1 1 . . . 1 1 . - 6 . 1 . . . . . 1 . . . 1 . 1 1 1 1 . . . 6 . 1 1 . . . . 1 1 . . 1 1 1 1 1 1 1 . . - 7 . 1 . . . . . 1 . . . 1 . . . . . . . . 7 . 1 1 . . . . 1 1 . . 1 1 . . . . . . . - 8 . . . . . . . . . . . 1 . . . . . . . . 8 . . . . . . . . . . . 1 1 . . . . . . . - 9 . . . . . . . . . . . 1 . . . . . . . . 9 . . . . . . . . . . . 1 1 . . . . . . . + 0 . . . . . . . . . . . . . . . . . . . . + 1 . . . . 1 . . . . . . . . . . . . . . . + 2 . . . 1 . 1 . . . . . . . . . . . . . . + 3 . . 1 . . . 1 . . . . 1 . 1 1 1 1 . . . + 4 . 1 . . . . . 1 . . . 1 1 . . . . 1 . . + 5 . 1 1 1 1 1 1 1 . . . 1 1 . . . . 1 . . + 6 . 1 . . . . . 1 . . . 1 . 1 1 1 1 . . . + 7 . 1 . . . . . 1 . . . 1 . . . . . . . . + 8 . . . . . . . . . . . 1 . . . . . . . . + 9 . . . . . . . . . . . 1 . . . . . . . . -The PC8080 [Video](/modules/pc8080/lib/video.js) function *createFontVariation()* takes both the "dot replication" and "dot stretching" -features into account (along with other parameters, such as underlining and reverse video) when converting the character generator ROM data -into fonts. + Actual characters displayed after dot stretching + + 0 . . . . . . . . . . . . . . . . . . . . + 1 . . . . 1 1 . . . . . . . . . . . . . . + 2 . . . 1 1 1 1 . . . . . . . . . . . . . + 3 . . 1 1 . . 1 1 . . . 1 1 1 1 1 1 1 . . + 4 . 1 1 . . . . 1 1 . . 1 1 1 . . . 1 1 . + 5 . 1 1 1 1 1 1 1 1 . . 1 1 1 . . . 1 1 . + 6 . 1 1 . . . . 1 1 . . 1 1 1 1 1 1 1 . . + 7 . 1 1 . . . . 1 1 . . 1 1 . . . . . . . + 8 . . . . . . . . . . . 1 1 . . . . . . . + 9 . . . . . . . . . . . 1 1 . . . . . . . + +The [PC8080 Video](/modules/pc8080/lib/video.js) *createFontVariation()* function takes both the "dot replication" and "dot stretching" +features into account (along with underlining and reverse video parameters) when converting the character generator ROM data into fonts. ### Disassembling the 8080 Firmware