Monthly Archives: December 2017

A Time Travel Experiment: The retro newsletter project proposal

The internet is an interesting place. Quite often, things I am trying to find end up not findable (far too often), but I almost always end up somewhere I didn’t intend to be finding something I didn’t mean to find.

Recently, I went in search for a Chromaset game that was referenced by L. Curtis Boyle on CoCoTalk Live (the nation’s leading weekly Color Computer talk show) episode 17. A reference had been made to this “Zero Gravity” (I think that was the title) game being disassembled and ported to OS-9, and I was curious to see what kind of game it was.

During this search, which was unsuccessful, I ended up at some random home page that had an archive of newsletters in PDF format. The one I found was from 1983, and it contained a review of the Chromaset subscription service (which I think was a cassette tape full of programs you received each month).

It was a fascinating read, including an article talking about rumors that Radio Shack was working on a “CoCo III” model. (That article was a gag, though, but no doubt rumors of a CoCo 3 must have started circulating as soon as the CoCo 2 came out.)

Reading through this newsletter was like stepping back in time. 1983 was when I received my first Radio Shack Color Computer. I remembered newsletters like this.

Today, archive sites like archive.org and the Color Computer Archive do a great job at trying to preserve much of this old information. I have scanned and submitted several newsletters and manuals, myself. One could easily spend weeks going through all that is there, which is why I expect none of us have done it. (I wasn’t even aware of this “ETUG” newsletter until I stumbled on it accidentally.)

Wouldn’t it be neat…

With retro computing so popular these days, wouldn’t it be neat if there were some kind of subscription service that would mail you physical paper copies of newsletters from the past, on a schedule just like they were back then? I’m not talking about anything new, but actually representing a point in time as if you were subscribing to them back then.

All it would take is finding as many of these newsletters as possible and getting them organized by date. Then, when someone subscribed, they’d start receiving newsletters each month, starting with the earliest time available.

Or, you could sign up starting at a specific month (say, the year you first got your computer).

Subscribers wouldn’t be in sync with each other, so discussing the “latest” news would be problematic, but since all of this exists digitally, it would be as simple as…

Hey, I just got the August 1983 issue of CoCo Chronicles out of East Texas. There’s this cool BASIC program that makes sound like a synthesizer with no machine code! Here’s a link to the PDF of the issue

Think of all the great tips and programs we’d (re)discover this way, as a new generation wades through the cutting edge information of 35 years ago.

There might even be a way to automate something like this, through a service that will print and mail on demand.

Sure, we can all go download any of these for free… But have we? It’s much easier to pay attention to something when it shows up at your house, versus you having to remember to go out and find it. (Amazon, anyone?)

There are some problems, of course: Copyright. Low quality scans of copies that might be hard to read. Zero interest in this…

But if such a service existed, would you sign up? How much would you be willing to pay? Who would have the time to run something like this?

Discuss.

C musing of the day: i++ or ++i?

Here’s another short side-musing about C…

At my previous job, I did embedded programming on TI MSP430, PowerPC and Renesas processors. We were in the process of moving to a new system based on ARM architecture. It was during this time that I went from being part of a tiny local team to being part a much larger group spread out around the world.

But I digress.

On this team were some great minds, and one of them produced a document listing a bunch of optimizations we could do in our code to reduce size and/or improve speed. I wish I had a copy of it as it would be fun to discuss the suggestions here and get some feedback. But for today, I’ll bring up one that was just brought up by a coworker at my current job.

var++ versus ++var

I am very used to writing (and seeing) variable increments written like this:

i++;

Is it called a post increment, I believe. There is another version called pre-increment that looks like this:

++i;

By themselves, the result appears the same. For example:

int i;

i = 0;
printf("i = %d\n", i);
i++;
printf("i = %d\n", i);

That would print 0, then i++ would increment it, then it would print 1.

int i;

i = 0;
printf("i = %d\n", i);
++i;
printf("i = %d\n", i);

That would print 0, then ++i would increment it, then it would print 1.

The reason there is pre and post is for situations where you want to check something at the same time you increment it. If you use “i++” in a check…

i = 0;
if (i++ == 1) printf("This will NOT be printed.\n");

…it checks the value of “i” , then increments it after the check (post increment, see?). But if you go the other way:

i = 0;
if (++i == 1) printf("This WILL be printed.\n");

…it increments “i” first, then checks the new value of i.

Behind the scenes, “i++” has to do more work since it has to retain the original value of i for the compare. I think a post-increment might look something like this:

i = 0;    // SET i TO 0
if (
    i++   // SAVE VALUE OF i AS TEMP_i
          // INCREMENT i
    == 1) // COMPARE TEMP_i TO 1

And a pre-increment might look like this:

i = 0;    // SET i TO 0
if (
    ++i   // INCREMENT i
    == 1) // COMPARE i TO 1

If all you are JUST wanting to increment (or decrement) a variable, it might make sense to always use the pre-increment version (“++i”) so the extra “save this value for later” code is not produced.

BUT, a good compiler optimizer should be able to see that nothing cares about that temporary value and just discard it rather than building it in to your binary.

With a good optimizer, it shouldn’t make any difference. But perhaps it’s better to write it like you mean it since “if (i++ …” means something different than “if (++i …”.

But geez, after twenty years of writing “i++” it sure would be hard to switch.

Does it matter? What if I am writing for an old pre-ANSI K&R compiler?

Comments appreciated.

C musing of the day: signed ints

I ran across some code today that puzzled me. It was an infinite loop that used a counter to determine if things took too long. Something like this:

int main()
{
  int count;
  int status;

  count = 0;

  do
  {
    status = GetStatus();

    count++;

  } while( status == 0 );

  if (count < 0)
  {
    printf("Time out! count = %d\n", count);

    return EXIT_FAILURE;
  }

  printf("Done. count = %d\n", count);

  return EXIT_SUCCESS;
}

The code would read some hardware status (“GetStatus() in this example)  and drop out of the do/while loop once it had a value. Inside that loop, it increments a count variable. After done, it would check for “count < 0” and exit with a timeout if that were true.

Count is only incremented, so the only way count could ever be less than zero is if it incremented so high it rolled over. With a signed 8-bit value (int8_t), you count from 0 to 127, then it rolls over to -128 and counts back up to 0.

So with an “int” being a 32-bit value (on the system I am using), the rollover happens at 2147483647.

And that seems like quite a weird value.

But I suppose it it took that long, it certainly timed out.

I think if was going to do it, I would have probably used an unsigned integer, and just specified an appropriate value:

unsigned int count;

...

if (count > 10000)
{
  printf("Time out! count = %u\n", count);
  return EXIT_FAILURE;
}

What says you?

C warnings, %d versus %u and more C fun.

Code cleanup on aisle five…

I recently spent two days at work going through projects to clean up compiler warnings. In GNU C, you can enable options such as “-Wall” (all warnings), “-Wextra” (extra warnings) and “-Werror” (warnings as errors). By doing steps like these, the compiler will scream at you and fail to build code that has warnings in it.

Many of these warnings don’t impact how your code runs. They just ask you “are you sure this is what you are meaning to do?”

For example, if you leave out a “break” in a switch/case block, the compiler can warn you about that:


x = 1;

switch( x )
{
case 1:
printf("x is onen");
// did I mean to not have a break here?

case 2:
printf("x is twon");
break;

default:
printf("I don't know what X isn");
break;
}




This code would print:

x is one
x is two

...because without the "break" in the "case 1", the code drops down to the following case. I found several places in our embedded TCP/IP stack where this was being done intentionally, and the author had left comments like "/* falls through below */" to let future observers know their intent. But, with warnings cranked up, it would no longer build for me, even though it was perfectly fine code working as designed.

I found there was a GCC thing you could do where you put in "//no break" as a comment and it removes that warning. I expect that are many more "yes, I really mean to do this" comments GCC supports, but I have not looked in to it yet.

Size (of int) matters

Another issue I would see would be warnings when you used the wrong specifier in a printf. Code might compile fine without warning on a PC, but generate all kinds of warnings on a different architecture where an "int" might be a different size. For example:

int answer = 42;
printf("The answer is %dn", answer);

On my PC, "%d" can print an "int" type just fine. But, if I had used a "long" data type, it would error out:

long answer = 42;
printf("The answer is %dn", answer);

This produces this warning/error:

error: format '%d' expects argument of type 'int', but argument 2 has type 'long int' [-Werror=format=]|

You need to use the "l" (long) specifier ("%ld") to be correct:

long answer = 42;
printf("The answer is %ldn", answer);

I found that code that compiled without warnings on the PC would not do the same on one of my embedded target devices.

%u versus %d: Fight!

Another warning I had to deal with was printf() and using "%d" versus "%u". Most code I see always uses %d, which is for a signed value which can be positive or negative. It seems works just fine is you print an unsigned integer type:

unsigned int z;

z = 100;
printf("z is %dn", z);

Even though the data type for z is unsigned, the value is positive so it prints out a positive number. After all, a signed value can be positive.

But, it is more correct to use "%u" when printing unsigned values. And, here is an example of why it is important to use the proper specifier... Consider this:

#include <limits.h> // for UINT_MAX

unsigned int x;

x = UINT_MAX; // largest unsigned int

printf("x using %%d is %dn", x);
printf("x using %%u is %un", x);

This prints:

x using %d is -1
x using %u is 4294967295

In this case, %d is not giving you what you expect. For a 32-bit int (in this example), ULONG_MAX of 4294967295 is all bits set:

11111111 11111111 11111111 11111111

That represents a -1 if the value was a signed integer, and that's what %d is told it is. Thus, while %d works fine for smaller values, any value large enough to set that end bit (that represents a negative value for a signed int) will produce incorrect results.

So, yeah, it will work if you know you are never printing values that large, but %u would still be the proper one to use when printing unsigned integers... And you won't get that warning :)

C warning: comparison between signed and unsigned integer expressions [-Wsign-compare]

Trick C question time … what will this print?

#include <stdio.h>
#include <stdlib.h>

int main()
{
   int x;
   unsigned int y;

   x = -1;
   y = 2;

   printf("x = %dn", x);
   printf("y = %un", y);

   if ( x > y )
   {
      printf("x > yn");
   }
   else if (x < y)
   {
      printf("x < yn");
   }
   else
   {
      printf("x == yn");
   }

   return EXIT_SUCCESS;
}

I recently began looking in to various compiler warnings in some code I am using, and I found quite a few warnings about comparing signed and unsigned values:

warning: comparison between signed and unsigned integer expressions [-Wsign-compare]

I thought I could safely ignore these, since it seems plausible to compare a signed value with an unsigned value. A signed value of -42 should be less than an unsigned value of 42, right?

In the above example, it will print the following:

x = -1
y = 2
x > y

Nope. I was wrong. According to C, -1 is greater than 2.

C does something that I either never knew, or knew and have long since forgotten. I guess I generally try to write code that has no warnings at all, so I’ve avoided doing this. And now I know (or re-know) the reason why.

When dealing with mis-matched comparisons, C makes them both unsigned. Thus, “-1” becomes whatever -1 would be for that data type.

char  achar  = -1;
short ashort = -1;
int   aint   = -1;
long  along  = -1;

printf("char  -1 as unsigned: %un", (unsigned char)achar);
printf("short -1 as unsigned: %un", (unsigned short)ashort);
printf("int   -1 as unsigned: %un", (unsigned int)aint);
printf("long  -1 as unsigned: %un", (unsigned long)along);

This outputs:

char  -1 as unsigned: 255
short -1 as unsigned: 65535
int   -1 as unsigned: 4294967295
long  -1 as unsigned: 4294967295

Thus, on a PC, an 8-bit signed value of -1 is treated as a 255 when comparing against an unsigned value, and a 16-bit as 65535. It seems an int and long as both 32-bits on my system, but these could all be different on other architectures (on Arduino, and int is 16-bits, I believe).

So, without this warning enabled, any comparison that looks correct might be doing something quite wrong.

Warnings are our friends. Even if we hate them and want them to go away.