The Museum of HP Calculators

HP Forum Archive 18

[ Return to Index | Top of Index ]

MCODE question - C=-C-1 MS sets carry in MLDL but not in SDK41
Message #1 Posted by PeterP on 29 Apr 2008, 3:36 p.m.

To the MCODE gurus

There seems to be an interesting discrepancy between the behavior of MCODE in the 41 (currently using a HEPAX) and in SDK41. Given that the SDK41 uses the original roms, this surprised me.

Even more surprised am I that the instruction C=-C-1 MS can create a carry with a very benign positive number in C (MS=0). The code below runs as shown in SDK41 and produces for 100 in x-reg the correct value of 71. However when run within an MLDL it produces -29 as the ?NCXQ in line x11F and x124 are not run. If I insert a NOP infront of them the code runs in the MLDL as well, producing the correct result.

Please see the code snippet below (the code does not do anything useful, it’s a preamble to a Prime-Twin generator, my usual way of learning a new language). Any thoughts with regards to

  • How C=-C-1 for a benign positive number can set the carry
  • Difference between SDK41 and MLDL
would be much appreciated.

Thanks so much !



;calculate startvalue for search for prim-twins
;given a number in X, startvalue = 30*Int((X+19)/30) – 19
;implemented as (X+19) – (X+19)Mod30 -19
Add	HexCode	Command		Comment
x107	2A0		SetDec	
x108	1A0		A=B=C=0
x109	35C		R=12		;load 19 into C
x10A	050		LD@R 1
x10B	250		LD@R 9
x10C	226		C=C+1 S&X
x10D	070		N=C All		;save for later use
x10E	10E		A=C All		;prepare regs for AD2_10
x10F	0F8		Read 3(x)
x110	01D060	?NCXQ [AD2_10]	        ;this one works fine
x112	10E		A=C All		;A=X+19
x113	158		M=C All		;save in M for later
x114	04E		C=0 All		;Load 30 into C to prep for [MOD10]
x115	35C		R=12
x116	0D0		LD@R 3
x117	226		C=C+1 S&X
x118	171064	?NCXQ [MOD10]	        ;A Mod C
x11A	0EE		B<>C		;prep for subtraction via AD2_10
x11B	198		C=M All		;recall X+19
x11C	10E		A=C All
x11D	0CE		C=B All		;(X+19) Mod 30
x11E	2BE		C=-C-1 MS	;This should simply make it negative. But it sets Carry!!
x11F	01D060	?NCXQ [AD2_10]	        ;this only works if I have a NOP in front to clear carry when run in MLDL
					;it calcs (X+19) – (X+19)Mod30
x121	10E		A=C All		;prep to subtract 19
x122	0B0		C=N All		;recall 19 from N
x123	2BE		C=-C-1		;same problem it sets carry when run in MLDL
x124	01D060	?NCXQ [AD2_10]
x126	0E8		WRIT 3(x)	;save result to x
x127	3E0		RTN
Re: MCODE question - C=-C-1 MS sets carry in MLDL but not in SDK41
Message #2 Posted by Eric Smith on 30 Apr 2008, 1:57 a.m.,
in response to message #1 by PeterP

I don't know anything about SDK41, but you should expect to always get the carry flag set as the result of c=-c-1. For subtract instructions, the carry flag indicates a "borrow" out of the leftmost digit. What you're really doing is subtracting from zero, and that will always have a borrow. If you were working on a two-digit field of C that contained 23, after c=-c-1 you should have 76 with a carry.

In the hardware, subtraction is really implemented by addition of a nine's complement (assuming decimal mode), with both the carry-in and carry-out inverted. For the normal add and subtract instructions, the carry-in is zero, but for 0=-c-1 the carry-in is one (before being inverted).

Re: MCODE question - C=-C-1 MS sets carry in MLDL but not in SDK41
Message #3 Posted by PeterP on 30 Apr 2008, 10:35 a.m.,
in response to message #2 by Eric Smith

that makes sense! Thanks Eric for helping me out!

I got confused as in Ken's book the instruction C=-c-1 is explained as 'doing the nine's complement' (p26) and I picked up the 'trick' in one of the books but I must have overlooked the NOP before the jump instruction there.. Anyway, thanks a lot again!



[ Return to Index | Top of Index ]

Go back to the main exhibit hall