Fra DDHFwiki
Spring til navigation Spring til søgning

2020-12-30 A pile of PostScript

My continued digging through the backup-tape has uncovered a pile of postscript files:

   ⟦0035e76eb⟧ Remote Compilation Facility - Release Information - Release_1_0_3
   ⟦05988f7ca⟧ Insight - Installation Procedure - Release_1_0_1
   ⟦07d905c09⟧ Rational Insight - Release Information - Rev1_3_0
   ⟦0d71b57c2⟧ Rational Access Description - 0.8.0 Release
   ⟦17d276e59⟧ Rational Environment Release Information - Release D_12_7_3
   ⟦2024a9fe1⟧ Remote Compilation Facility - Release Information - Release_1_2_2
   ⟦23a53e39b⟧ Rationale for the Proposed Standard for a Generic Package of Primitive Functions for Ada
   ⟦3def193b1⟧ Rational Compilation Integrator - Release Information - Release 2_0_5
   ⟦3e2ba7e34⟧ Rational Access - Quick-Reference Guid - Version 0.8.0
   ⟦4734617e8⟧ Remote Compilation Facility - IBM RISC System/6000 Extension - Release Information - Release 1_1_0
   ⟦4a1330c8b⟧ Guide to Machine Initilization - Release D_12_6_5
   ⟦4b29253db⟧ "Usage" besked, titel: "!TOOLS.DOCUMENT_FORMAT"
   ⟦526cacf42⟧ Beskadiget
   ⟦5606b9f32⟧ Rational Style Guide - 0.5.0 Draft
   ⟦56ef92f1d⟧ Beskrivelse af analyse facilitet
   ⟦5717463c9⟧ Remote Compilation Facility - IBM RISC System/6000 - Release 1_0_2
   ⟦68d16b503⟧ grafisk plot af kodestruktur
   ⟦6b572a63f⟧ Rational Compilation Integrator - IBM RISC System/6000 Extension - Release 2_0_2
   ⟦6c03d64ae⟧ Rational Environment Release Information - D_10_20_2 Release
   ⟦6f08c03d9⟧ grafisk plot af kodestruktur
   ⟦74abeabc7⟧ Rational Compilation Integrator - Alsys i386 LynxOS Extension - Release information - Release 2_0_2
   ⟦7af8d1531⟧ Proposed Standard for a Generic Package of Elementary Functions for Ada - Draft 1.2
   ⟦83ca2b315⟧ Rational Environment - Rational Access - X Windows Interface - Revision 0.3.0
   ⟦87a275cc6⟧ Rational X Library: Ada/C Interface Differences
   ⟦89aa031be⟧ Trunkeret
   ⟦8ba0d59a4⟧ Trunkeret
   ⟦91f816da9⟧ Command and Function Description - Alpha Draft
   ⟦944c90873⟧ Rational X Interface Release Information - Rev10_7_2 Release
   ⟦96d5ccb79⟧ Rational Access - Information Plan - Review Draft
   ⟦9893505e2⟧ Proposed Standard for a Generic Package of Primitive Functions for Ada - Draft 1.0
   ⟦99c4458da⟧ Rational Environment Release Information - D_12_1_1 Release
   ⟦9b096c96a⟧ Rational Environment Release Information - D_12_2_4 Release
   ⟦9f8116908⟧ Rational X Library - Release Information - Rev6_0_0 Release
   ⟦a7b6d3dd8⟧ Rational TestMate - Release Information - Rev2_2_0 Release
   ⟦abf32a77e⟧ grafisk plot af kodestruktur
   ⟦b81506409⟧ Rational Environment Release Information - D_12_6_5 Release
   ⟦bde810949⟧ Rationale for the Proposed Standard for a Generic Package of Elemntary Functions for Ada
   ⟦d39cd8235⟧ Del af keyboard template ?
   ⟦d4766a43e⟧ grafisk plot af kodestruktur
   ⟦db6de3cc4⟧ grafisk plot af kodestruktur
   ⟦f404e5d35⟧ Rational Environment Release Information - D_12_5_0 Release
   ⟦f46a1a629⟧ Rational Access - Release Information - Release 1_0_1
   ⟦fdf4d8787⟧ Kun ordet "Information"

The "weird" non-links on the left are identifiers in the AutoArchaeologist excavation of the backup tape.

Archaeologically ⟦96d5ccb79⟧ is probably the most interesting, Fil:Rational Access Information Plan.pdf.


2020-12-17 You are in a creepy maze of objects, none of them byte-aligned

The R1000 card-cage contains a total of 7 printed circuit boards:

Slot Board Description
1 Mem2 Memory 2 (32 meg)
2 Mem0 Memory 0 (32 meg)
3 FIU Field Isolation Unit
4 SEQ Sequencer
5 TYP Type
6 VAL Value
7 IOC I/O Controller

(From R1000 Hardware Overview)

The Ada language was originally designed for embedded systems, in particular for embedded systems in, around and in control of military weapons, and it dates back where state-of-the-art in radiation-hardened microcomputers was the RCA1802 and a few kilobytes of ROM and RAM was the norm, so being parsimonious with memory space is deeply embedded in the genes of Ada.

For instance, when you define:

   subtype MISSILE_NUMBER is INTEGER range 1 .. 8;

The Ada compiler will know that only three bits will be needed to store that type.

And five bits saved here and four bits saved there, it adds up.

The R1000 is a true-blooded Ada computer, so the fundamental unit of addressing is a bit, and just because your field may happen to be 16 bits wide, does not mean that it is going to be aligned at a 16-bit boundary. (There is a notable exception: Instructions are 16 bit wide and must be aligned to 16 bit boundaries.)

This is where the FIU comes into the picture: When an instruction requires 27 bits starting at a particular address, the FIU carves them out of however many 128 bit hardware words they may span.

This is a complication when reverse-engineering the R1000, both as a mental exercise and a practical matter.

Take for instance this object, which lives in block# 0xd4852:

   ┌   ┌   ┌   ┌   ┌   ┌   ┌   ┌   ┌   ┌   ┌   ┌   ┌   ┌   ┌   ┌   

If you squint a little bit, it is quite obvious that there are structural diagonal stripes.

One way to fiddle around with such structure is to join the lines to a single long unbroken line, look at that in a window which wraps the line, and then adjust the width of the window with the mouse.

If one does that here, a window 36 characters wide show the pattern clearly as three distinct columns

   ┌   ┌   ┌   ┌   ┌   ┌   ┌   ┌   ┌

36 characters × 4 bits per character / 3 columns = 48 bits per column

Most right-thinking computer people would expect that to be 16+32 bits or possibly 3×16 bits or even 6 bytes, but no, it is actually 28+20 bits.

For now take my word that the array starts 316 bits into the data structure:

   ┌   ┌   ┌   ┌   ┌   ┌   ┌   ┌   ┌
   4001180 d4854
   4000020 1fe60
   4000020 1fd62
   4000020 20025
   4000020 1fcde
   4001160 d2bca
   4001160 d2bcb
   4001160 d2bcc

That wasn't too bad, so what about the first 316 bits ? Here is my guess:

Field #Bits Value
hdr0 1 0x0
objid 64 0x46c0000002b03
diskvol 5 0x1
hdr1 4 0x0
blockno 20 0xd4852
hdr2 8 0x1
hdr3 56 0x0
hdr4 32 0x8144
hdr5 28 0x0
indir_level 2 0x1
hdr6 64 0x4000001ea0
hdr7 32 0x1
nblocks 32 0xa2

Notice how neither the value of the `objid` nor the `blockno` fields appear in the hexdump above.

If you look carefully, you might notice that 2×0x236 = 0x46c, this is essentially the first 1-bit wide field "dividing" the `objid` by two:

   0x46c0000002b03 << 3 = 0x23600000015818

The `blockno` on the other hand is shifted two bits:

   0xd4852 << 2 = 0x352148

Full disclosure: All the fields named `hdr%d` are white spots on the map. I have no idea if have assigned the right widths, or for that matter what they mean.

They have these precise values in all instances of this particular structure I have found yet.

My theory is that they may actually be a type-descriptor, because the last two, 0x1 and 0xa2, would describe the index range for the array of 162 elements, each 48 bit wide which follows.

Of those 48 bits, I have no idea what the first 28 bit means, but I the last 20 bit is a block number.

This is going to take some time, and I'm going to become a LOT better at mental hexadecimal arithmetic before we are done.


2020-12-12 Things to do in Covid-19 Lockdown

Try as we will, realistically we cannot keep our R1000 machine running forever, which puts us under a tacit obligation to write a "software-R1000" to keep the "Environment" alive when its hardware eventually gives up the ghost.

By now I have lost track of how many different computers I have written more or less comprehensive emulations of, and the general recipe has always been to start with the "Programmers Reference Manual" or whatever it happens to be called.

It is not obvious to what extent such a manual ever existed for the R1000, we certainly do not have it. What we do have is an abstract Ada description of the instruction, and a pair of example printouts, containing some kind of assembly listing of two trivial Ada programs, in the Guru Course 01 slides.

Try as I might, I cannot get the Ada description to deliver the actual bit-patterns of the instructions, if this description is authentic and not just for example, there must be one or more pieces of (Ada-)code which translates this description into 16 bit instruction-words.

Nonetheless, the Ada description helps a lot, in that it gives the names of all the instructions and the sizes of many of the argument fields in them, so for instance when it tells us (p36 right bottom):

   type PC_Offset is new Integer range -2 ** 10 .. 2 ** 10 -1;

and (p38 left bottom):

   when Jump [...] =>
       Relative : Pc_Offset

and one of the listings (p88, top right) tells us:

   35 0023: 7801  JUMP    1

Then it is a good guess that the Programmers Reference manual would have described the JUMP instruction as:

   JUMP    pcrel   │0 1 1 1│1 X X X│X X X X│X X X X│

Various bits of evidence indicates that the listings in the Guru Course are produced by the Ada compiler during compilation. If so, we should be able tease out the encoding of a lot of instructions by writing and compiling Ada programs that causes the compiler to emit the instructions in question.

But right now the R1000 and the rest of our collection is inaccessible, due to the Covid-19 lockdown.

So I sit at home, and try to wring as much information and as many clues as possible out of the documentation we have, and try it out on the code segments on the data media in our bitarchive.

One thing I have found out is that the listings in the Guru Course are not comprehensive, for instance on p43 left top:

   27 001B: 4800  SHORT_LITERAL    0
   28 001C: 0093  EXTENSION    147
   29 001D: 0033  EXTENSION     6,  3       ;;; push full address of a location in
                                                               current code segment

Try as I might, I cannot puzzle an instruction which pushes an absolute address in the code-segment out of the Ada specification.

The fact that the compiler also does not know the name of this instruction makes me suspect that it has been added to the microcode and compiler, as an optimization, at such a late date, that nobody felt like recompiling everything from scratch, leaving the Ada description out of date.


2020 08-20

Broken piece of plastic from the Facit Twist 20200813 Facit Broken Plastic.jpg

Replicated piece of plastic for the Facit Twist 20200815 Facit Replicated Plastic.jpg

Facit can Twist again.

2020 08-13

Per opened the Facit Twist, found a broken piece of plastic and saw it as an excuse to use his 3D-printer.


Booted the R1000 yesterday, came up fine, but the Facit showed the "landscape" in both orientations.