baby←{⎕IO ⎕ML←0 1           ⍝ The Manchester Small Scale Experimental Machine.

    fetch←{,(yshift)⌿⍺}                   ⍝ line ⍵ from store ⍺
⍝   store←{⍺⍺@((yshift ⍵⍵)∘⊣)⍵}             ⍝ (with extended @)             <V>@
    store{⍺⍺@(1⍳⍨yshift ⍵⍵)⊢⍵}             ⍝ store-matrix ⍵ with ⍺⍺ in line ⍵⍵

    decode←∊∘(+\0 5 8 3)∘⍳∘⍴{(⍺⍺ ⍵)⊂⍵}      ⍝ instruction decode S:0-4 PI:13-15

    yshift(0=⍳≢⍵)∘{                        ⍝ Y-shift: mask from ssem-binary
        ~1∊⍵:⍺                              ⍝ 0: done
        (¯1⌽⍺)dec ⍵                       ⍝ mask shift
    }

    addsub{                                ⍝ parallel binary adder/subtractor
        c←⍺ ⍺⍺ ⍵                            ⍝ carry bits
        ~1∊c:⍺ ⍵⍵ ⍵                         ⍝ no carry bits: done
        (⍺≠⍵)∇ 0,¯1↓c                       ⍝ shift & add/sub carry bits
    }

    incdec{(⍵>⍺⍺\⍵)∨⍵⍵\~⍵}                 ⍝ binary successor/predecessor

    add←∧addsub∨                            ⍝ parallel binary adder
    sub←<addsub>                            ⍝ parallel binary subtractor
    inc←∧incdec<                            ⍝ binary successor
    dec←<incdec∧                            ⍝ binary predecessor
    neg←{(⍵<∨\⍵)∨<\⍵}                       ⍝ 2s complement negation

    ⍺←0∧2↑↓⍵                                ⍝ A and CI initially 0 by default

    0{                                      ⍝ CI increment
        A CI_ M←⍵                           ⍝ Acc Ctrl-Instr Store-Matrix
        CI←⍺ add inc CI_                    ⍝ address of next instruction
        S _ PI _decode M fetch CI          ⍝ decode of next instruction

        0 0 0≡PI:0 ∇ A(M fetch S)M          ⍝ jmp: CI ←STORE[S]
        1 0 0≡PI:(M fetch S)A CI M        ⍝ jrp: CI+←STORE[S]
        0 1 0≡PI:0 ∇(neg M fetch S)CI M     ⍝ ldn: A ←-STORE[S]
        1 1 0≡PI:0 ∇ A CI(A store SM)      ⍝ sto: STORE[S]←A
        0 0 1≡PI:0 ∇(A sub M fetch S)CI M   ⍝ sub: A-←STORE[S]
        1 0 1≡PI:0 ∇(A sub M fetch S)CI M   ⍝ sub:   ..  ..
        0 1 1≡PI:({0}\⌽A)A CI M           ⍝ cmp: CI+←A<0
        1 1 1≡PI:M                          ⍝ hlt: final memory state
    }⍺,⊂⍵                                   ⍝ initial machine state
}
code_colours

test script

Back to: notes

Back to: Workspaces