Slightly off topic. The article doesn't call it out but there's a lovely assembly hack here. In:
bec 1f / branch if no error
jsr r5,error / error in file name
<Input not found\n\0>; .even
sys exit
jsr calls a subroutine passing the return address in register 5. The routine error interprets the return address as a pointer to the string.
r5 is incremented in a loop, outputing one character at a time. When the null is found, it's time to return.
The instructions used to return from "error:" aren't shown but there is a subtlety here, I think.
".even" after the string constant assures that the next instruction, "sys exit", to which "error:" is supposed to return, is aligned on an even address.
By implication, the return sequence in "error:" just be sure to increment r5, if r5 is odd. I am guessing something like the pseudo-code:
bec 1f / branch if no error
jsr calls a subroutine passing the return address in register 5. The routine error interprets the return address as a pointer to the string.r5 is incremented in a loop, outputing one character at a time. When the null is found, it's time to return.
The instructions used to return from "error:" aren't shown but there is a subtlety here, I think.
".even" after the string constant assures that the next instruction, "sys exit", to which "error:" is supposed to return, is aligned on an even address.
By implication, the return sequence in "error:" just be sure to increment r5, if r5 is odd. I am guessing something like the pseudo-code:
inc r5
and r5, fffe
ret r5