!pr1
32-bit Values in Version 2.0 -- A Mixed Blessing......Bob S-C

In previous versions of the S-C assemblers, expressions were evaluated in 16 bits, and symbol values were kept in the table in 16-bit form.  Version 2.0 works with 32-bit expressions and symbol values.  We added this feature for your benefit,  but it may sometimes be a mixed blessing.

For example, Bob Bernard had a problem with a program which assembled perfectly under Version 1.0, but gave countless BAD ADDRESS errors in version 2.0.  We traced the problem to his origin statement, which was ".OR -31488".  In older versions, -31488 is the same as $8500, but in version 2.0 it is $FFFF8500.  The following code will not assemble:

       .OR -31488
  SSS  JMP SSS

Why?  Because the value of SSS is also $FFFF8500, and it will not fit in a JMP instruction.  In 65816 mode, using a JML instruction, it would be legal.

Two ways to fix come to mind.  You normally work in hexadecimal when you are in assembly language, rather than decimal.  Therefore, change the origin statement to ".OR $8500".  Or, if you really want to use decimal, write ".OR 65536-31488".

Another owner of version 2.0 had a problem with a program that used many macros, and lots of private labels.  Private labels are the ones used inside macro definitions, which are written with a colon and a one or two digit number.  The private label table normally begins at $FFF and grows downward toward $800.  His program assembled with no problems before, but under version 2.0 it got a MEM FULL error.  Reason, again, the 32-bit symbol values.  Each entry in the private label table now takes two more bytes, so he ran out of space sooner.  His solution was to move the beginning of the label table higher.
