;;;;;
;
; Test expressions that evaluate to registers.
;
; All lines not marked "error" should assemble without complaint
; as absolute values (no relocation etc).
;
; Section 3.4 (page 3-8) is a bit vague about the expressions that are allowed
; after a %, but "the digit specifying the register can be replaced by any valid,
; absolute term that can be evaluated during the first assembly pass."
; It specifically mentions %3+1 to be the same as %4.
; For the rest there is no indication where exactly register labels can be used.

        .psect abs,abs

        A = 1

        l1  = %1
        l2  = %1+1
        l3  = %a
        l4  = %a + 1
        l5  = %<1+1>
        l6  = <%1>+1     ; must be register!
        l7  = <%a>+1     ; must be register!
        l8  = %1 + %2
        l8a = <%1> + <%2> ; must be register!

        l9  = %<%1 + %2>
        l9c = %<%<%1 + %2>>
        l9d = %<%<%<%1 + %2>>>
        l9a = %<R1 + R2>
        l9b = %<R1>

        B   = rti         ; 2

        l10 = %B
        l11 = %wait     ; 1

        l12 = %1.
        l13 = %7.
        l14 = %10       ; error: too large (error R), but symbol is still def'd
        l15 = %8.       ; error: too large (error R), but symbol is still def'd

        mov #R2,R2
        mov #%2,%2             ; 012702  000002 must be absolute, not reloc!
        mov #l1,%2             ; 012702  000001 (idem)
        mov #<%1+%2>,%3        ; 012703  000003 (idem)
        mov #<l1+1>,%3         ; 012703  000002 (idem)
        mov #<%l1+1>,%3        ; 012703  000002 (idem)
        mov #r0,%2             ; 012702  000000 (idem)
here:   mov #here,%2
        mov #rti,%2

        mov %2,%2              ; 010202
        mov l1,%2              ; 010102
        mov <%1+%2>,%3         ; 010303
        mov <l1+1>,%3          ; 010203
        mov R1+1,%3            ; 010203
        mov <%l1+1>,%3         ; 010203

        mov %1,r2               ; mov r1,r2
        mov %0+1,r2             ; mov r1,r2
        mov %<0+1>,r2           ; mov r1,r2

        mov r0,r2               ; mov r0,r2
        mov ----r1,<r2>         ; mov r1,r2
        mov r0+1,r2             ; mov r1,r2
        mov r1+7,r2             ; error: too large
; R    58 000066  016702  000010'  mov r1+7,r2     ; too large

                        ; this shows that after a % comes a unary expr,
                        ; not an arbitrary binary expr:
        l30 = 1+%2*2    ; %6.
        l31 = <1+%2>*3  ; %9. error: too large, but symbol is still defined (R error)
        mov l31,r0      ; error: bad register; code 011100 (R error)
        l32 = 1+%<2*2>  ; %5
        l33 = 1+<%2*2>  ; %5


        l20 = %l1
        l21 = %l20

        l22 = l1        ; still a register
        l23 = l22       ; still a register

        .globl extrn
        l40 = %extrn    ; A error; L40   =%******
        mov l40,r0      ; U error; code 010000

        .word   r0,wait,r1+1,wait+2,%4     ; 0, 1, 2, 3, 4

        .end

