Festo mnemonics text found in ROM code (new PDP-8 encoding)

Finally I found the mnemonics! I noticed this table on page 30 (6000-6177) before, but thought that it’s a word followed by an address with multiples of 100 octal.

adr.---- words
6000 - 3446 0400 1246 0400 3036 1200 4612 5000
6010 - 3002 1000 3222 5400 3202 1000 3210 6400

As all mnemonics (of the functional units) have 3 characters and I noticed a 00 after 3 half words, I was sure that these are the mnemonics also for other reasons. But these are not Sixbit.

Lowest half word is 02=A, 04=B, highest= 64=Z (Sixbit=32). The only one starting and ending with A (ASA) is 02 46 02.
1 is 43 (Sixbit=62), 2= 45.

I even found an undocumented opcode: MCO.

As it’s before the unit 0, it must be a 9th basic instruction. Maybe in combination with the PLC (Master Clear O…) but should be German. Merker…? Or more likely another “mit” Befehl, maybe the ASCII reservation (mit Character Output?). As it’s higher than 8 (or 0-7) it isn’t a valid octal opcode.

It starts with the 8 basic instructions what is also the first digit. NSB Null Signal bei (check zero signal at). Then the undocumented one and then the functional units starting with 0000 =NUW.
Ending with the 4 character mnemonics WENN, DANN, SONS. SONST originally has 5 characters. It ends with 3x25+00. (T=50)The rest is unknown data or code.

octal        Sixbit       MNE
34 46 04   \&D          NSB 1 base 
12 46 04   J&D          ESB
30 36 12   x^J          LOE
46 12 50   &J(          SET
30 02 10   XBH          LAD
32 22 54                MIV
32 02 10                MAD
32 10 64                MDZ 8 base inst 
32 06 36                MCO undocumented  
34 52 56                NUW functional unit 
40 50 12                PTE  "
...
46 34 44 SNR
56 12 34 34  00 00 (53th  WENN 
10 02 34 34  00 00 DANN 
46 36 34 46  50 00 SONS 
25 25 25 00        T ? end
70 00  NOP?
70 00
3123 7340 1102 3102 4023 4532 3142
0000 0000 empty
2 Likes

Well done - good decoding!

Thanks! I almost had to ask for help. Then I wrote down the 3 half words and found it myself.
T=50 is already there. So 3x25 could be either a special character or sign for end.
The mnemonics include numbers 1-4, 8-9. Zero, space and some special characters are unclear. One can also add comments but obviously no lowercase and no German umlauts. This is confirmed

  0 1 2 3 4 5 6 7 
0     A   B   C
1 D   E   F   G
2 H   I   J   K
3 L   M   N   O
4 P   Q 1 R 2 S 3
5 T 4 U 5 V 6 W 7
6 X 8 Y 9 Z
7

Other confirmed characters to be set

/ . ; - SPACE : * , probably + () &"_=<>@

Zero in DEC Sixbit is usually before 1. But could be after 9. Strange encoding especially the numbers. I wonder if any computer had this as well.

I now have searched for code referring this table. I only have 3x 6000. But none seems to be really a value. Maybe it’s 6000 +/-1 or 6177 or 6200 +/-1 and read backwards. I also have to have (IOT) code for the TTY output nearby.

There must be another table for error codes. Probably not a complete table for all errors (some are rather at their code like too many brackets) some errors concerning the attached PLC (which has error handling code for its own but some might be shared/linked).

But the keys/syntax/value check. I have 3 error messages that sounds very similar

E0 000x wrong key/not allowed key in that mode (x=0-5) 0=numpad 0-9, 1=release buttons, 2=basic instruction key, 3 functional unit, 4 OR+brackets, 5 mode keys.
E1 0000 wrong instruction or wrong value (and invalid address)
E2 0000 wrong instruction that may not follow after another one

So there must be one or more large tables about what keys and values are allowed after each key. The keyboard is grouped by input functions. The order is a bit strange. Each column has 9 keys.
I hope to find keyboard codes this way and PDP-8 code. Maybe keyboard sections are at this table at 7556

5622 wrong key numpad
5020 release keys (on numpad) + elsewhere
1000 basic instruction keys (column on the left) except OR key
7000 functional unit keys column 2 (all 9 keys)
6000 special function keys (brackets x3 + OR)
1150 mode keys (horizontal)

Is there perhaps a right shift into carry, which would allow a branch to distinguish numbers and letters, leaving the halved value for further processing?

Everything is possible, but as said there are more special characters next to numbers which must be uneven as well.

I first could swear that the mnemonics are stored as ASCII, as they have to be printed that way. So now there must also be code or an IC for translation to ASCII.

I also still don’t know how the error messages like E0 is stored (that would help finding code for that). Could be as BCD like the other LCD output, but I haven’t found some codes. Or as this new encoding. 0 is unclear, but I also haven’t found E1 just E2.
Maybe they used full words for each character. There are so many possibilities. Or just E and the rest numerical as code.

And some registers (at least on the PLC) have 16 bits. While the rest is 12 bits. I wonder how that is realized. Maybe in fact 2x12? The bus is also 16 bits wide.

Surprisingly, the control codes (LF, CR, XON XOFF) are probably stored as ASCII. I have to inspect those again. I have many discrete ICs, probably for the keys. I don’t know how they are controlled/recognized by code.
If I recall it right, some keys/functions (like brackets) are 1 bit (so faster) others CPU driven 12 bit.
Still many mysteries.
Maybe it’s a PLC itself with a cyclic operation. Or even a simulator.

I have completed the new encoding and tested different orders. Most likely it’s this

  0 1 2 3 4 5 6 7 
0 @   A ! B " C #
1 D $ E % F & G '
2 H ( I ) J * K +
3 L , M - N . O /
4 P 0 Q 1 R 2 S 3
5 T 4 U 5 V 6 W 7
6 X 8 Y 9 Z : [ ;
7 \ < ] > ^ = _ ?

I have converted the full ROM but haven’t found other text, except after SONST there are 3 stars. Nothing much was missing, except some special characters and control codes.

MCO stands for “mit COde” and is indeed for the reserved ASCII output. Shared with previous instruction 7 MDZ mit Dezimalzahl.
There must be some code (or hardware logic) to check if the value is >1747 (decimal 999) to print out the other mnemonic. But I haven’t found 1747 or 1750 in the ROM.

Either they changed it and just checks for ASCII (2200-2277, I do have 2200) or more likely the numbers are stored differently, maybe one digit per word or BCD, less likely 16 bit. As everything is stored in octal, there must then be another conversion.

Strange, that none of my 3 data tables seem to be called by PDP-8 code. I also tried the previous ROM combination with halfs swapped. I will search for more tables to exclude them for being code.

I think I found more tables. Tables have different characteristics. Longer tables usually start at the beginning of a PDP-8 memory page. Tables have different length. The end of the page is filled up with zeroes. The few tables exceeding a page miss that. Other tables have same separators between its data sets, mainly 4017. Probably not PDP-8 code.

Obviously most data is stored as half words (like the Sixbit character encoding and my other tables with different data sharing a word).
I have 0077 and 7700 that is obviously for loading these half words and this might help finding the few PDP-8 code. Other data might be words with bit patterns or addresses.

By highlighting a word in a text editor it’s easy to detect some data sets. Many tables/pages starting with 110x and later have a slightly different word starting with 11.

Maybe these are tokens and 11 might stand for a keyboard section. 13xx for another. I first found at 400 or earlier several 1103 and 1104 words with different amount of following words. I then grouped words to better show sections and similar values like this (scroll down)

1106 0211      /key 06?
1241           
7640 
5355           /display? error code?
1062 
7006           /2x70 06 rare but often together.   
7006           /At units just at BFZ (program counter, 14 bit)

1103 7010 7620           
1103 3117       
1104 3120       /+1 / +1

5423            /5,6,7
6571 
7324 
7426 
7634            /2x 76xx
7615 
7716            /3x 77xx  +1/+1
7711                /bit patterns
7747   
..
1104 
5534 2427 
5250 
5315 
5325            /+10
5335            /+10
5310 0017 0040 
5300            /-10
5220            /+20
5335 
5332 7002 
0035 
..
1102  
3142 
      v 3x7640, 2x5266 
1107 7640 2023 5423
0353 7640 5300 7303 5266 0350 7450 5330
1343 7640 1344 1345 5266 0235 7640 5300
1351 5266 0347 7640 5300 7200 1352 5266
1353 5266 7772 7701 1400 6300 7774 0400
0077 0300 7400 0060 2740 2674 1372 4175
1373 4175 7325 0123 1375 3131 1531 7450
5020 5774 0015 0012 6142 1374 0000 0000

at 2200 usually 1 or 2 following words. Some might be (single) instructions but not set separately for better vertically readability

 1070 7650 5467 
 1123 1123 7710 5223       /2x1123 
 1132 6436 
 1133 6437                /+1/+1
 
 6400 0236 7640 5773 
 1102 6435 1355 6414 7100 
 
 1133 1167 3167 7004
 1132 1166 3166 7430 2165 2102 0004 5766
 1357 7440 5246 
 1367 3121 
 1361 1356 3133
 _    1035 3132 5203 
 1360 7640 5467 
 1367 3121 5467 
 1360 7450 5256 
 1362 7640 5467 
 1374 1370 5257 
 1360 7450 5256 
 1363 0035 3126
 
 7346 3134 1172 
 7104 7421 1171 7004 
 3171 1170 7004 
 3170 7501 2134 5303 1126 
 3172 5467 4023 3747 
 1170 7510

Finding and checking PDP-8 code sections is difficult due to overwritten words in the zero page. Especially words 1126 seem to be placeholders for overwritten values. Some might be temp registers like for LCD contents.