PDP manual describing coroutines

Gordon Chillcott gordontc-HLeSyJ3qPdM at public.gmane.org
Mon Nov 4 14:22:48 UTC 2013


I recall a description of co-routines somewhere in the RT-11
documentation.   Just where in that documentation, I can't recall.
I should mention that that documentation filled a number of binders. 

If you do find a full set of manuals, the only advice I can offer is my
own rule that you look about a quarter of the way into the one manual
that should have the least to do with the subject you're investigating.

I seem to remember there was an Editor manual . . .

Gordon


On Sat, 2013-11-02 at 21:33 -0400, D. Hugh Redelmeier wrote:
> | From: Paul Tarvydas <paultarvydas-Re5JQEeQqe8AvxtiuMwx3w at public.gmane.org>
> 
> | Over on the FBP google group, Brad Cox mentioned that he learned about
> | coroutines from a PDP-x manual, which described coroutines and subroutines as
> | equals.   He thought that it was the PDP-8 assembler manual, but this appears
> | not to be the case.
> | 
> | Does anyone know which manual contained this explanation, and, does anyone
> | have a copy of this manual that can be shared?
> 
> There was no "the PDP-8 assembler manual" as far as I remember.  There
> were books like the 1967 "The Digital Small Computer Handbook", the
> somewhat different 1968 book with the same title, and the
> "Introduction to programming:  PDP-8 Family Computers".  At least
> those are the ones I have in storage.
> 
> <https://www.flickr.com/photos/walkingsf/sets/72157628922224107/>
> <http://highgate.comm.sfu.ca/pdp8/>
> 
> The PDP-10 and PDP-11 also supported coroutines.
> 
> See, for example <http://www.inwap.com/pdp10/usenet/coroutines> (random
> Google hit).
> 
> Coroutines are easy to implement on any machine that doesn't use a
> stack discipline.  Once you have a stack, you need some way to kludge
> a branching stack, possibly behind the back of the runtime system.
> 
> As I remember it, I invented coroutines on the PDP-8 (in 1968).  Not
> that I was the first!  But it means that I don't think that those
> PDP-8 manuals describe coroutines.  I may only have had the first
> book at that time.
> 
> The PDP-8 subroutine call instruction
> 	jms sub
> would:
> 1) store the return address in sub
> 2) transfer control to sub+1
> 
> All addresses are of 12-bit words and all addresses fit in a 12-bit
> work.  Note: the return address is stored amongst the instruction
> stream.  Supporting recursion takes work.
> 
> Coroutines could be coded like this (re-invented just now; may be
> wrong or not optimal):
> 
> a_entry: .word 0	; entry point and return address
> 	 jmp @a_yield	; jump to where a_yield points
> a_yield: .word a_start	; where to resume a
> 	 jmp @a_entry	; jump to where a_entry points
> 
> ; sample body for a.
> ; Each call of a yields a charcter in the accumulator.
> ; It yields the characters a, b, c in sequence and then repeats
> a_start: cla	; clear the accumulator
> 	 tad ='a'	; add 'a'
> 	 jms a_yield	; yield to a's caller
> 	 cla
> 	 tad ='b'
> 	 jms a_yield
> 	 cla
> 	 tad ='c'
> 	 jmp a_start
> 
> (I've taken a lot of liberties with the notation to make it look like
> conventional modern assembly languages.)
> 
> - aentry is the entry point to the corouting (each time).
>   To call the routine (from outside): jms aentry
> 
> - astart would be the label on the initial starting point of the
>   coroutine.
> 
> - the coroutine would yield control (return to its caller) by calling
>   ayield: jms ayield
> 
> - the very first time the coroutine is called, the aentry+1 jmp
>   would use the intial content of ayield as the starting point
>   of the couroutine.  So it must be suitably initialized (astart).
> 
> Notice how, to the body of the coroutine, the caller looks like a
> subroutine?  That's the magic of coroutines.
> 
> The machine with the easiest implementation of coroutines must be the
> RCA CDP-1802.  It had 16 registers.  You could switch which one was
> the program counter (SEP command).  So if you had a small number of
> coroutines, you could dedicate one register for each to be the program
> counter.  To transfer to another coroutine, just switch to that
> coroutine's program counter.
> --
> The Toronto Linux Users Group.      Meetings: http://gtalug.org/
> TLUG requests: Linux topics, No HTML, wrap text below 80 columns
> How to UNSUBSCRIBE: http://gtalug.org/wiki/Mailing_lists


--
The Toronto Linux Users Group.      Meetings: http://gtalug.org/
TLUG requests: Linux topics, No HTML, wrap text below 80 columns
How to UNSUBSCRIBE: http://gtalug.org/wiki/Mailing_lists





More information about the Legacy mailing list