JSR <target>/JRST @<target>
The JSR instruction Increments the PC, stores it (and CPU flags) at the target subroutine's address, and sets the PC to that address + 1. It is useful in cases where it's important to not change any of the general purpose registers so something very similar is done for system calls ans other UUOs - "Unimplemented User Operations." The two biggest reasons to avoid it are:
1) The code has to be in memory that can be written, i.e. it would be quite a stretch to want to use it in a sharable HISEG.
2) Recursion can't be done. Well, if the subroutine had something like a "PUSH P,<target>" to save the return address you could, but that would basically emulate a PUSHJ call.
DEC's first Fortran compiler used JSR, which is probably why I used it in
https://wermenh.com/folklore/light/index.html (I do have a PiPDP-10 port with support for dealing with with emulation speed and a binary clock function). IIRC, the compiler passed parameters by call by reference, with the address of the parameter after the JSR, e.g.
YEAR = 2025
FOO(YEAR)
may have generated something like:
MOVEI T1,^d2025
MOVEM T1, YEAR
JSR FOO
XWD YEAR
FOO: BLOCK 1 ;Save a word for the return PC
MOVE T1,@FOO ; Fetch the parameter
....
AOS FOO ;Point to first instruction after parameter
JRST @FOO ;Return to caller
For any instruction, the CPU first evaluates the effective address, increments the PC and performs the operation. UUOs, rather than being "Unimplemented" all implement storing the instruction being executed - opcode, accumulator, and effective address in location 040 (opcodes 0 and 040-077 switch to exec mode first, 001-037 don't) in location 040 and executes the instruction in location 041 (without mucking with the PC). This is expected to be a JSR to the UUO handler which will process both the executed instruction and know how to resume execution.