Yes, you aren’t programming 2.11 BSD correctly.
Wow, I'd hoped it was that. Thank you so much! I spent way too much time fiddling incorrectly.
Was an example I'd cobbled together from my college textbook I've been going back through, _Assembly_Language_for_the_PDP-11_RT-RSX-UNIX_ (c)1981 Kapps and Stafford. We didn't have UNIX for the class so never ran into this.
Your examples are the older UNIX syscalls (your programs work correctly in Version 6 by the way as well).
In 2.11 BSD, all the arguments for the syscalls are inline (i.e., none are passed in registers. This appears to be the beginnings of making the kernel protable across architectures.
The systent table no longer has separate fields for args in registers and not in registers and the code in sys/pdp/trap.c doesn’t look at the registers anymore.
I wonder if the differences are written up somewhere. I did try to look for more documentation but came up short. Must've been quite well-ingrained in programmers' minds in the day.
Proper code now should be:
sys 4
1
a
6
sys 1
0
Note your previous code used to just return 6 from the program (the return value of write).
Ah, so passing exit code as an arg to sys 1. Cool. Thanks again!