diff --git a/assemble.c b/assemble.c index a1a90f2..c9fd31e 100644 --- a/assemble.c +++ b/assemble.c @@ -1474,6 +1474,12 @@ static int assemble( free_tree(value); return 0; } + + if ((mode.type & 070) == 0) { + report(stack->top, "JSR Rn,Rm is illegal\n"); + /* But encode it anyway... */ + } + word = op->value | mode.type | (reg << 6); store_word(stack->top, tr, 2, word); mode_extension(tr, &mode, stack->top); diff --git a/tests/test-jmp.mac b/tests/test-jmp.mac index d9b0ca9..b578a90 100644 --- a/tests/test-jmp.mac +++ b/tests/test-jmp.mac @@ -4,9 +4,13 @@ ; JMP Rx is not allowed, all other modes are. ; -start: jmp end +start: jmp label ; rel(pc) jumps to label + jmp @label ; @rel(pc) does something else! + jmp #label ; (pc)+ does something else! + jmp @#label ; @(pc)+ jumps to label + jmp r1 ; must fail - jmp (r1) + jmp (r2) jmp (r1)+ jmp @(r1)+ jmp -(r1) @@ -14,4 +18,18 @@ start: jmp end jmp 1234(r1) jmp @1234(r1) -end: +secnd: jsr r0,label ; rel(pc) jumps to label + jsr r0,@label ; @rel(pc) does something else! + jsr r0,#label ; (pc)+ does something else! + jsr r0,@#label ; @(pc)+ jumps to label + + jsr r2,r1 ; must fail + jsr r3,(r2) + jsr r4,(r1)+ + jsr r5,@(r1)+ + jsr r2,-(r1) + jsr r3,@-(r1) + jsr r4,1234(r1) + jsr r5,@1234(r1) + +label: rts pc