http://en.wikipedia.org/wiki/Transputer
A transputer is an device/emulator that runs Communicating Sequental Proccesses.
Also the basis for the Transterpreter system[L1 ] written in pure ANSI C.
(dreging info from http://svn.transterpreter.org/transterpreter/trunk/interpreter/dispatch_ins.c)
stack based system
instruction set is bytecode based with the distinction that
first nybble is the main opcode and the second nybble is appended to
an (unspecified long/32 bit?) operand register and the contents of that register is then taken as immideate operand.
opcode: memnomic: description
0x0 j Jump — add immediate operand to instruction pointer.
0x1 ldlp Load Local Pointer — load a Workspace-relative pointer onto the top of the register stack
0x2 pfix Prefix — general way to increase lower nibble of following primary instruction
0x3 ldnl Load non-local — load a value offset from address at top of stack
0x4 ldc Load constant — load constant operand onto the top of the register stack
0x5 ldnlp Load Non-local pointer — Load address, offset from top of stack
0x6 nfix Negative prefix — general way to negate (and possibly increase) lower nibble
0x7 ldl Load Local — load value offset from Workspace
0x8 adc Add Constant — add constant operand to top of register stack
0x9 call Subroutine call — push instruction pointer and jump
0xA cj Conditional jump — depending on value at top of register stack
0xB ajw Adjust workspace — add operand to workspace pointer
0xC eqc Equals constant — test if top of register stack equals constant operand
0xD stl Store local - store at constant offset from workspace
0xE stnl Store non-local - store at address offset from top of stack
0xF opr Operate - general way to extend instruction set
the opr instruction extends the instruction set by switching on the value of the operand register.
the extended instruction set is as follows:
0x00 rev
0x01 lb
0x02 bsub
0x03 endp
0x04 diff
0x05 add
0x06 gcall
0x07 in
0x08 prod
0x09 gt
0x0A wsub
0x0B out
0x0C sub
0x0D startp
0x0E outbyte
0x0F outword
0x10 seterr
0x11 mreleasep __PI_SUPPORT__
0x13 csub0
0x14 extvrfy __PI_SUPPORT__
0x15 stopp
0x16 ladd
0x19 norm
0x1A ldiv
0x1B ldpi
0x1D xdble
0x1F rem
0x20 ret
0x21 lend
0x22 ldtimer
0x23 boolinvert
0x24 widenshort
0x25 fficall
0x26 lend3
0x27 lendbw
0x28 reschedule
0x2B tin
0x2C div
0x2E dist
0x2F disc
0x30 diss
0x31 lmul
0x32 not
0x33 xor
0x35 lshr
0x36 lshl
0x37 lsum
0x38 lsub
0x39 runp
0x3B sb
0x3C gajw
0x3E saveh
0x40 shr
0x41 shl
0x42 mint
0x43 alt
0x44 altwt
0x45 altend
0x46 and
0x47 enbt
0x48 enbc
0x49 enbs
0x4A move
0x4B or
0x4C csngl
0x4D ccnt1
0x4E talt
0x4F ldiff
0x51 taltwt
0x52 sum
0x53 mul
0x55 stoperr
0x56 cword
0x5A _dup __FPU_SUPPORT__
0x60 extin __PI_SUPPORT__
0x61 extout __PI_SUPPORT__
0x62 minn __PI_SUPPORT__
0x63 unpacksn __FPU_SUPPORT__
0x64 moutn __PI_SUPPORT__
0x65 xminn __PI_SUPPORT__
0x6C postnormsn __FPU_SUPPORT__
0x6D roundsn __FPU_SUPPORT__
0x71 ldinf __FPU_SUPPORT__
0x72 fmul
0x79 pop
0x7A seminit __PI_SUPPORT__
0x7B semclaim __PI_SUPPORT__
0x7C semrelease __PI_SUPPORT__
#ifdef __FPU_SUPPORT__
case \: ins_wsubdb(); break;
#endif
#ifdef __FPU_SUPPORT__ //in case of fpu support include the below
0x82 fpldnldbi
0x83 fpchkerr
0x84 fpstnldb
0x86 fpldnlsni
0x87 fpadd
0x88 fpstnlsn
0x89 fpsub
0x8A fpldnldb
0x8B fpmul
0x8C fpdiv
0x8E fpldnlsn
0x91 fpnan
0x92 fpordered
0x93 fpnotfinite
0x94 fpgt
0x95 fpeq
0x96 fpi32tor32
0x98 fpi32tor64
0x9A fpb32tor64
0x9D fprtoi32
0x9E fpstnli32
0x9F fpldzerosn
0xA0 fpldzerodb
0xA1 fpint
#endif
#ifdef __PI_SUPPORT__
0xA2 getpri
#endif
#ifdef __FPU_SUPPORT__ //in case of fpu support include the below
0xA3 fpdup
0xA4 fprev
0xA6 fpldnladddb
0xA8 fpldnlmuldb
0xAA fpldnladdsn
0xAC fpldnlmulsn
#endif
0xAD savecreg
0xAE restorecreg
0xB0 barinit
0xB1 barsync
0xB2 barresign
0xB3 barenroll
#ifdef __FPU_SUPPORT__ //in case of fpu support include the below
0xCF fprem
0xD0 i64toreal
0xD1 fpdivby2
0xD2 fpmulby2
0xD3 fpsqrt
0xD6 fprz
0xD7 fpr32to64
0xD8 fpr64to32
0xD9 fpexpdec32
0xDB fpabs
0xDF fpchki64
#endif
#ifdef __PI_SUPPORT__
0xE0 mnew
0xE1 mfree
0xE2 malloc
0xE3 mrelease
0xE4 min
0xE5 mout
0xE6 min64
0xE7 mout64
0xE8 xable
0xE9 xin
0xEA xmin
0xEB xmin64
0xEC xend
0xFD null
#endifZarutian 23. maí 2007: this page is still under construction
Zarutian 30. maí 2007: and yet I continue
Zarutian 14. september 2007:
namespace eval transputer {}
namespace eval transputer::assam {
variable assamble_buffer {}
proc get_assamble_buffer {} {
variable assamble_buffer
return [set assamble_buffer]
}
proc j {relative} {
variable assamble_buffer
if {$relative > 15} {
set tmp [expr $relative % 16]
pfix [expr $relative / 16]
set realtive $tmp
}
set tmp [format "%x" $relative]
append assamble_buffer "0[set tmp]"
}
proc pfix {literal} {
variable assamble_buffer
set tmp {}
if {$literal == 0} {
append assamble_buffer "20"
} else {
while {$literal > 0} {
set tmp [format "%x" [expr $literal % 16]][set tmp]
set literal [expr $literal / 16]
}
foreach i [split $tmp ""] {
append assamble_buffer "2[set i]"
}
}
}
proc ldc {constant} {
variable assamble_buffer
if {$constant > 15} {
set tmp [expr $constant % 16]
pfix [expr $constant / 16]
set constant $tmp
}
set tmp [format "%x" $constant]
append assamble_buffer "4[set tmp]"
}
proc ldnl {offset} {
variable assamble_buffer
if {$offset > 15} {
set tmp [expr $offset % 16]
pfix [expr $offset / 16]
set offset $tmp
}
set tmp [format "%x" $constant]
append assamble_buffer "3[set tmp]"
}
}CMcC has worked on transputers and would like to say that the architecture is not well-suited to programming. For one thing, there are *no* global stores, and so writing malloc is quite difficult. Another oddity is that evaluating an expression like 1/0 hung the transputer by design.
FPX has also worked on transputers and disagrees with that statement. Transputers may not be well-suited for certain general purpose programming, but they shine at stream processing and other tasks. Lack of a global store is not an issue with stateless components (such as an image filter). "Hanging a transputer" with a division by zero is system-specific and not an inherent issue with transputers in general. Most transputers run single user operating systems, not having kernel/user space separation due to the lack of a MMU. These days, GPUs (graphics processing units) follow similar designs than Transputers. Yes, you wouldn't want them to run a word processor, but there are certain tasks that they do so much better than your general CPUs.
http://wotug.org/parallel/transputer/documentation/st020-450/datasheets/