Att ladda program på en PDP11

1970-talets datorer var ofta försedda med en frontpanel med mängder av strömbrytare samt blinkande lampor. Frontpanelen var inte kosmetisk utan tanken var att användaren började med att knappa in en handfull maskininstruktioner i maskinens minne, instruktioner vars uppgift var att ladda in ett större mera avancerat laddarprogram från t.ex. hålremsa. Från hålremsa kunde man ladda in ett enkelt operativsystem eller t.ex. en Basic tolk som kunde användas till att skriva riktiga program. Det var teoretiskt, inte praktiskt, möjligt att knappa in t.ex hela tolken via frontpanelen men chansen att man gjorde något fel var så stor att det inte var något alternativ. En användbar Basic krävde någonstans mellan 4000 och 8000 instruktioner d.v.s. kanske 15000 strömbrytare måste flippas utan fel för att det skulle fungera.

Bilden är tagen från: https://obsolescence.wixsite.com/obsolescence/pidp-11-overview

Man använde oftast hålremsa för att ladda program. Hålremsa är som namnet säger en ungefär 25 mm bred pappersremsa ofta många meter lång med hål stansade tvärs över remsan. Varje stansad hålrad representerade ett tecken i binär form. Det själv inmatade programmets uppgift var alltså att läsa av hålkombinationer från en hålremsläsare och successivt mata in resultatet i minnet. Då hela remsan hade lästs matade man in en startadress från frontpanelen och tryckte på ”kör”.

En hålremsläsare är enkel att bygga själv men att bygga en hålremsstans kräver redan en del mekaniskt kunnande men inte oöverkomligt sådant. Jag tittade lite på möjligheten att bygga upp hålremsan på A4-papper i form av t.ex. en JPG bild. Man kunde då t.ex. i stället för att stansa hålremsa skriva ut program eller data i hexadecimal form, papper som kunde mappas in och sedan läsas av PDP11 via en simulerad hålkortsläsare som skulle använda OCR (Optical Code Recognition) för att återskapa innehållet i binär form för laddning till PDP11. Jag skrev på skoj ett program som dumpade data till printer i ett standardiserat format och använde därefter programmet Tesseract för att återskapa mina data. Programmet Tesseract fungerar mycket väl då man låter det läsa text skrivet på ett språk för vilket Tesseract tränats. Resultatet blev inte speciellt bra då programmet skulle läsa i princip slumpmässiga data. Felkorrigeringen bygger tydligen åtminstone delvis på att den inlästa texten matchas mot ordlistor/meningar/grammatik så att enstaka fel elimineras. Då programmet inte kunde matcha inlästa data mot en språklig databank dök det upp förvånande mycket fel kanske 1-5% av de inlästa tecknen blev fel d.v.s. systemet fungerar inte utan hjälp av mera avancerad felkontroll. Här uppfattade jag att jag hamnade i en återvändsgränd och lät bli att gå vidare.

Av en slump hittade jag efter en del googlande ett enkelt alternativ till att ladda in program till PDP11. Vi har alla sett video/film från gårdagens data center där det finns kylskåpsstora databanspelare som kontinuerligt körs/stoppas/snabbspolas. Databanspelarna var länge det huvudsakliga mediet på vilket data kunde lagras. En svindyr hårskiva rymde kanske 5 Mbyte medan ett magnetband hade nästan oändlig kapacitet sett ur den tidens perspektiv. Magnetbandets nackdel var att man då man skulle ladda in ett program måste man hitta bandet, korrekt mata in bandet i bandstationen och därefter ange vilket ”block” man ville läsa. Systemet var långsamt men blixtsnabbt jämfört med andra system t.ex. hålremsa.

Det visade sig att det fanns en fungerande simulerad bandstation som fungerar på följande sätt:

Jag skapar en katalog /home/pi/bsdtapes på Raspberry Pi där emulatorn körs. Om jag lagrar ett simulerat magnetband tq0tape.tap i denna katalog så kan jag på PDP11 som på den gamla goda tiden aktivera bandstationen och läsa bandet.

För att aktivera bandstationen i PDP11 måste man i BSD 2.11 startfilen definiera att en bandstation finns tillgänglig.

cd /opt/pidp11/systems/211bsd

Gör en kopia på initialiseringsfilen boot.ini:

sudo cp boot.ini boot.ini.backup

Editera boot.ini så att det efter set tq enabled kommer en ny rad:

attach tq0 /home/pi/bsdtapes/tq0tape.tap

Då PDP11 BSD 2.11 startar så vet systemet var det hittar bandet för bandstationen.

Processen beskrivs nedan:

Att läsa program/data från magnetband

Om jag vill flytta data eller program till PDP11 så måste jag först skapa ett läsbart magnetband d.v.s. en fil som binärt ser ut som de data vi får ut från magnetstationen.

Vi börjar med att putsa bort eventuella gamla magnetband i katalogen. Jag har en underkatalog i vilken jag sparar mina magnetband.

sudo rm tq0tape.tap tq0tape.tar

Antag att jag vill flytta en fil minFil.txt till PDP11. Jag börjar med att komprimera/packa ihop filen till en tar-fil. Filändelsen tar står för tape archive! Systemet används fortfarande i Unix/Linux maskiner även om det är många år sedan man hade en riktig bandstation att jobba mot. Resultatet blir helt enkelt en datafil.

tar cvf tq0tape.tar minFil.txt

Vi har nu ett bandarkiv tq0tape.tar som innehåller filen minFil.txt. Filen är inte ännu läsbar av PDP11 utan vi måste skriva om arkivfilen till ett simulerat magnetband. Vi gör detta med hjälp av ett enkelt Perlprogram tapadd.pl och resultatet blir en fil tq0tape.tap .

./tapadd.pl tq0tape.tar tq0tape.tap

Jag kan nu läsa bandet från PDP11 på följande sätt under förutsättning att jag har lagt till bandstationen till 211BSD :

Starta PDP11/70 under simh. Det verkar vara nödvändigt att starta om 211BSD mellan olika band. Jag har inte analyserat vad detta beror på … kanske i framtiden. Logga in på PDP11 och gå till den katalog dit du vill ha dina data. Spola tillbaka magnetbandet och läs innehållet i form av en tar-fil.:

mt rewind
tar xv

Resultatet blir att de filer som fanns på bandet lagras under dut usprungliga namnet i arbetskatalogen. Systemet fungerar förvånande bra.

Att flytta data från PDP11 via magnetband

Systemet är i princip detsamma som det ovan beskrivna men i omvänd ordning. Vi börjar med att skapa ett bandarkiv som skrivs direkt till ”magnetbandet” utan att gå över en lokal fil. Systemet är alltså:

Spola tillbaka bandet.

mt rewind

Vi antar att vi vill flytta hela arbetskatalogen till Raspberry Pi. Vi ”tarrar” då ihop hela katalogen och lägger resultatet på bandet:

tar cv .

Notera att punkten efter tar cv betyder den aktuella katalogens innehåll. Jag kunde byta ut punkten mot t.ex. hello.c varvid endast filen hello.c skulle skrivas till band.

Det vi tarrade ihop finns nu på ”magnetband” i filen tq0tape.tap på Raspberry Pi (detta kallas magi)! Vi kan nu läsa bandet på raspberry pi med hjälp av hjälp programmet tapcat.pl . Vi börjar med att konvertera magnetbandet till ett normalt Unix bandarkiv:

./tapcat.pl tq0tapes.tap > tq0tapes.tar

Vi skapade nu ett Unix bandarkiv tq0tape.tar i arbetskatalogen. Bandarkivet kan nu öppnas med:

tar xvf tq0tapes.tar

Efter detta tar kommando finns hela arkivets innehåll i arbetskatalogen där kommandot kördes.

Slutkommentar

Det är rätt intressant att jag kan använda Unixens ”tar” verktyg på en maskin från 1970-talet. Alternativt kan man säga att det är rätt fantastiskt att 1970-talets programverktyg som skapades för att hantera data-/programarkiv på magnetband fortfarande används aktivt idag trots att forntidens bandstationer har försvunnit helt och man hittar dem endast på olika tekniska muséer.

Jag kan nu hämta ett ”magnetband” d.v.s. kopiera en magnetbandsfil från min underkatalog mytapes till filen tq0tapes.tap och därefter ladda innehållet på PDP11.

Ett ännu enklare sätt att överföra filer är att använda ftp (file transfer protocol) d.v.s. vi använder nätverket för överföring utan att ha något behov av att någon bandstation på vägen. Mera om ftp i nästa artikel.

Länkar

Filtransfer via magnetband: https://github.com/rricharz/pidp11-2.11bsd/blob/master/Tape.pdf

Program tagna från https://github.com/rricharz/pidp11-2.11bsd/

Programmet tapadd.pl:

#!/usr/bin/perl -w
use strict;
if(@ARGV != 1) {
print STDERR ”Usage: $0 <filename>\n”;
exit(1);
}
add_file($ARGV[0], 512);
end_file();
end_file();
sub end_file {
print ”\x00\x00\x00\x00”;
}
sub add_file {
my($filename, $blocksize) = @_;
my($block, $bytes_read, $length);
open(FILE, $filename) || die(”Can’t open $filename: $!”);
while($bytes_read = read(FILE, $block, $blocksize)) {
if($bytes_read < $blocksize) {
$block .= ”\x00” x ($blocksize – $bytes_read);
$bytes_read = $blocksize;
}
$length = pack(”V”, $bytes_read);
print $length, $block, $length;
}
close(FILE);
}

Programmet tapcat.pl:

#!/usr/bin/perl -w
use strict;
use vars qw($filename $filenum);
if(@ARGV != 2) {
printf STDERR ”Usage: $0 <tape file> <file number>\n”;
exit(1);
}
$filename = $ARGV[0];
$filenum = $ARGV[1];
open(INPUT, $filename) || die(”Can’t open $filename: $!”);
while($filenum–) {
readfile(0);
}
readfile(1);
exit(0);
sub readfile {
my($print) = @_;
my($block);
while(defined($block = readblock())) {
if($print) {
print $block;
}
}
}
sub readblock {
my($blocksize, $bs2, $block);
read(INPUT, $blocksize, 4);
$blocksize = unpack(”V”, $blocksize);
return undef unless $blocksize;
read(INPUT, $block, $blocksize);
read(INPUT, $bs2, 4);
$bs2 = unpack(”V”, $bs2);
$blocksize == $bs2 || die(”Invalid tape format”);
return $block;

}

Kommentera

Fyll i dina uppgifter nedan eller klicka på en ikon för att logga in:

WordPress.com-logga

Du kommenterar med ditt WordPress.com-konto. Logga ut /  Ändra )

Facebook-foto

Du kommenterar med ditt Facebook-konto. Logga ut /  Ändra )

Ansluter till %s


%d bloggare gillar detta: