[Simh] CMP R3,(R3)+
Paul Koning
paulkoning at comcast.net
Mon Jul 30 09:30:22 EDT 2018
> On Jul 29, 2018, at 4:42 PM, Timothe Litt <litt at ieee.org> wrote:
>
>
> On 29-Jul-18 06:42, Lars Brinkhoff wrote:
>> Hello,
>>
>> I have a very small debugger for the GT40 called URUG, or micro RUG. It
>> has two troublesome instructions: CMP R3,(R3)+ and equivalent with R4.
>> I suppose SIMH will run it fine even though there's a hazard?
Not exactly a hazard, but a documented incompatibility among implementations. In fact, there exists code that does something very similar to tell an 11/20 from others:
CMP PC,#.+4 ;SEE WHEN PC GETS INCREMENTED
BEQ O.ST01 ;IS IS A 11/20, ...
>>
>> The PALX assembler complains about this, so I'm considering chaning the
>> code. As far as I can see, the instructions are used to add 2 to a
>> register. It's shorter than an ADD R3,#2, which is important because
>> there's not a lot of memory on this machine.
>>
>> Would there be any possible downside to using TST (R3)+ instead?
Yes, that is the standard way to do this. I have never seen the code you quoted before and I can't imagine any reason for doing that.
Either option of course only works if R3 contains a valid memory address, and it must be even. A short way to increment by 2 that doesn't depend on R3 being even would be CMPB (R3)+,(R3)+.
It's fairly common to see the TST, not just because it's shorter, but also because it has a well known effect on the C condition code (it clears it). For example, a common pattern when C is used to indicate success/fail in a subroutine:
TST (PC)+ ; Indicate success
fail: SEC
MOV (SP)+,R1 ; ...
RTS PC
You might also see code that pops a no longer needed value from the stack, either clearing or setting C or leaving it alone. To clear, you'd see TST (SP)+. To set, COM (SP)+. To leave it untouched, INC (SP)+. (More obscure is NEG, which sets C if the operand is non-zero and clears it if it is zero.)
paul
More information about the Simh
mailing list