The Unix Heritage Society mailing list
 help / color / mirror / Atom feed
From: bqt@update.uu.se (Johnny Billquist)
Subject: [TUHS] Happy birthday, PDP-8!
Date: Tue, 28 Mar 2017 01:30:06 +0200	[thread overview]
Message-ID: <0df17a82-af22-69b3-912e-88f3a4d51169@update.uu.se> (raw)
In-Reply-To: <mailman.1.1490580001.4973.tuhs@minnie.tuhs.org>

On 2017-03-27 04:00, Greg 'groggy' Lehey <grog at lemis.com> wrote:

 > On Monday, 27 March 2017 at  6:49:30 +1100, Dave Horsfall wrote:
 >> And as for subroutine calls on the -8, let's not go there...  As I dimly
 >> recall, it planted the return address into the first word of the called
 >> routine and jumped to the second instruction; to return, you did an
 >> indirect jump to the first word.  Recursion?  What was that?
 > This was fairly typical of the day.  I've used other machines (UNIVAC,
 > Control Data) that did the same.  Later models added a second call
 > method that stored the return address in a register instead, only
 > marginally easier for recursion.
 >
 > At Uni I was given a relatively simple task to do in PDP-8 assembler:
 > a triple precision routine (36 bits!) to clip a value to ensure it
 > stayed between two limits.  Simple, eh?  Not on the PDP-8.  Three
 > parameters, each three words long. only one register, no index
 > registers.  I didn't finish it.  Revisiting now, I still don't know
 > how to do it elegantly.  How *did* the PDP-8 pass parameters?

This is probably extremely off-topic, so I'll keep it short.

This is actually very simple and straight forward on a PDP-8, but it 
might seem strange to people used to todays computers.

Essentially, you pass parameters in memory, as a part of the code 
stream. Also, the PDP-8 certainly do have index registers.

The first thing one must do is stop thinking of the AC as a register. 
The accumulator is the accumulator. Memory is registers.

Some memory locations autoincrement when used indirectly, they are 
called index registers.

That said, then. A simple example of a routine passing two parameters 
(well, three):

First the calling:

         CLA
         TAD   (42        / Setup AC with the value 42.
         JMS   COUNT
         BUFPTR
         BUFSIZ
         .                / Next instruction executed, with AC holding 
number of matching words in buffer.
         .

Now, this routine is expected to count the number of occurances of a 
specific word in a memory buffer with a specific size.
At calling, AC will contain the word to search for, while the address 
following the JMS holds the address, and the following address holds the 
size.

The routine:

COUNT,  0
         CIA
         DCA    CHR        / Save the negative of the word to search for.
         CMA
         TAD I  COUNT
         DCA    PTR        / Setup pointer to the address before the buffer.
         ISZ    COUNT      / Point to next argument.
         TAD I  COUNT
         CIA
         DCA    CNT        / Save negative value of size.
         DCA    RESULT     / Clear out result counter.
LOOP,   TAD I  PTR        / Get next word in buffer.
         TAD    CHR        / Compare to searched for word.
         SNA               / Skip if they are not equal.
         ISZ    RESULT     / Equal. Increment result counter.
         ISZ    CNT        / Increment loop counter.
         JMP    LOOP       / Repeat unless end of buffer.
         CLA               / All done. Get result.
         TAD    RESULT
         JMP I  COUNT      / Done.

PTR=10
CNT=20
CHR=21
RESULT=22


Addresses 10-17 are the index registers, so the TAD I PTR instruction 
will autoincrement the pointer everytime, and the increment happens 
before the defer, which is why the initial value should be one less than 
the buffer pointer.

Hopefully this gives enough of an idea, but unless you know the PDP-8 
well, you might be a little confused by the mnemonics.

As you can see, the return address at the start is used for more than 
just doing a return. It's also your argument pointer.

   Johnny



       reply	other threads:[~2017-03-27 23:30 UTC|newest]

Thread overview: 21+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <mailman.1.1490580001.4973.tuhs@minnie.tuhs.org>
2017-03-27 23:30 ` Johnny Billquist [this message]
2017-03-27 23:33   ` Steve Nickolas
2017-03-27 23:49     ` Johnny Billquist
2018-03-21 21:52 Dave Horsfall
2018-03-21 21:59 ` George Michaelson
     [not found] <mailman.659.1490686648.3779.tuhs@minnie.tuhs.org>
2017-03-28 22:10 ` Johnny Billquist
  -- strict thread matches above, loose matches on Subject: below --
2017-03-28  2:38 Noel Chiappa
2017-03-27  1:24 Noel Chiappa
2017-03-27 14:07 ` Arthur Krewat
2017-03-27  0:31 Noel Chiappa
2017-03-27  0:37 ` Arthur Krewat
2017-03-27 12:05 ` Tim Bradshaw
2017-03-27 13:35   ` Tony Finch
2017-03-27 21:37   ` Terry Smith
2017-03-21 23:57 Atindra Chaturvedi
2017-03-21 21:34 Dave Horsfall
2017-03-22 16:34 ` Ron Natalie
2017-03-26 19:49   ` Dave Horsfall
2017-03-26 20:11     ` Paul Winalski
2017-03-26 22:20       ` Greg 'groggy' Lehey
2017-03-26 22:25     ` Greg 'groggy' Lehey

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=0df17a82-af22-69b3-912e-88f3a4d51169@update.uu.se \
    --to=bqt@update.uu.se \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).