Table of Contents

MIDAS and PDP-10 Assembly

http://pdp10.nocrew.org has useful information on the instruction set. I recommend getting familiarized with DECsystem-10/DECSYSTEM-20 Processor Reference Manual first.

The MIDAS is a macro assembler, it does not check whether you provide correct number of arguments to opcode.

Notice that almost all numbers in MIDAS are treated as octal. To specify a decimal number such as nineteen, use 19. (appending a dot).

You can lookup :info midas for more details about the assembler.

PDP-10 Instruction format

Unlike some CISC instruction set, every instruction of PDP-10 is of the same 36-bit format (except for I/O instructions that are not available when the program is been supervised by an OS).

 000000000 0111 1 1111 112222222222333333
 012345678 9012 3 4567 890123456789012345
 ________________________________________
|         |    | |    |                  |
|   OP    | AC |I| X  |        Y         |
|_________|____|_|____|__________________|

        OP  = operation code
        AC  = accumulator field
        I   = indirect bit
        X   = index field
        Y   = address field
        DEV = device code
        IOP = input-output operation code

Addressing

Every instruction takes a register argument, and another address argument E.

Indirect addressing even applies to immediate variant of instructions. For example, the movei below would actually set register a to 12.

start:  movei  a,@add

...
add:    addi   b,12
IFETCH: MA <- PC
        OP <- Bits  0:8  of C(MA);
        AC <- Bits  9:12 of C(MA);
EACOMP: I  <- Bit  13    of C(MA);
        X  <- Bits 14:17 of C(MA);
        Y  <- Bits 18:35 of C(MA);
        E  <- Y;
        IF NOT(X=0) then E <- E+C(X);
        IF I=0 then go to done;
        MA <- E;
        GO TO EACOMP;
DONE:

The $ actually stands for ^@ (Control At).

; -*- MIDAS -*-
        TITLE   PRIME
L==500. ; Decimal 500
J=1
N=2
K=3
A=4
R=5
PRIME:  BLOCK   L
BUF:    BLOCK   30
PDL:    BLOCK   10
START:  MOVE    J,[-L-1,,PRIME-1]       ; setup J
        MOVEI   N,2
        PUSH    J,N
        MOVEI   N,3     ; N <- 3
P2:     PUSH    J,N
        HLRO    A,J
        AOJE    A,PRIN  ; found
P4:     ADDI    N,2
        MOVEI   K,1
P6:     MOVE    A,N
        IDIV    A,PRIME(K)
        JUMPE   R,P4    ; Goto P4 if remainder is zero
        CAMG    A,PRIME(K)      ; if Q <= P[K]
        JRST    P2              ; Goto P2
        ADDI    K,1
        JRST    P6
PRIN:   .OPEN   1,[.UAO,,'TTY]
         .LOSE  %LSSYS
        MOVE    J,[-10,,PDL-1]
        MOVE    A,[440700,,TITL]
        PUSHJ   J,OUT
        MOVEI   K,0     ; Setup line
CONV:   MOVE    N,[440700,,BUF]
NUM:    MOVE    A,PRIME(K)
        IDIVI   A,1000.
        PUSHJ   J,DPC
        IDIVI   A,100.
        PUSHJ   J,DPC
        IDIVI   A,10.
        PUSHJ   J,DPC
        CAIL    K,450.
        JRST    PUTL
        MOVEI   A,40
        IDPB    A,N
        ADDI    K,50.
        JRST    NUM
PUTL:   MOVE    A,[440700,,BUF]
        PUSHJ   J,OUT
        ADDI    K,1
        CAIL    K,L
        .LOGOUT 1,
        SUBI    K,450.
        JRST    CONV

DPC:    ADDI    A,60
        IDPB    A,N
        MOVE    A,R
        POPJ    J,
OUT:    ILDB    N,A
        JUMPE   N,EXIT
        .IOT    1,N
        JRST    OUT
EXIT:   .IOT    1,[^M]
        .IOT    1,[^J]
        POPJ    J,
TITL:   ASCIZ   $FIRST FIVE HUNDRED PRIMES$
END     START