POWER C is a UNIX-like shell, an editor, C compiler, and object linker for both the Commodore C64 and C128 platforms. It creates rather tight and fast machine language code for the MOS 6502/6510 CPU. Back in the days, POWER C was sold by Spinnaker Software Corp. out of Cambridge, MA, United States.

So, when the youngsters are talking about programming in Phyton, Golang, and Rust, what better way is there to tell them that you are still creating software in C from 1986 on an 8-bit computer?
I created this little introduction as my humble beginnings with POWER C were a bit shaky. The software itself is on GitHub. There you will also find the user manual. An alternative location for this is Spinnaker Power C Compiler User Manual: AI Chat & PDF | Manualzz. On GitHub, from the PowerC folder, download powerc-1.d64 and powerc-2.d64. These are the C64 container files for the original 5 1/4″ floppy disks. There is a separate distribution available for the C128.
Now create a floppy disk with the first container and label it „Compiler“. This disk will contain the shell, the compiler, the linker, some header files, and other files. Create a second floppy with the second container and label it „Object“. This disk contains the object files the linker will need. Create a third floppy labeled „Source“. This will contain your source files, the compiled object files, and the executable. I recommend to write-protect the first two disks.
Note: Confusingly, the manual calls the first disk "System Disk" and the second "Library Disk", the third "Work Disk".
Of course, instead of using real hardware you can also create virtual disks in i.e. VICE.
Now let’s start POWER C. On the first floppy disk, load the shell from BASIC with command
LOAD "*",8,1
and type in „run“. This will load the shell starting at address 2062 (x80E) and greet the user with a „$“ prompt. Within the shell, start the syntax-checking editor with the command „ced“ and type in the following easy example source code:
/* Hello World */
#include <stdio.h>
#define LOWER 14
int main() {
putchar(LOWER);
printf ("Hello World!");
return 0;
}
To enter the special characters that are required for the source code like „{“ and „\“, check out page 14 in the manual.
If we want to open an existing source code file from the Source disk, we type in „ced [filename]“.
In the editor, change to command mode by pressing the arrow-left key in the upper left corner of the keyboard. A „cmd:“ prompt will appear on the last row. Save the new source code to disk „Source“ with the command
put hello.c

Exit the editor with the command „quit“.
Back in the shell, compile the stored source code with the command
$ cc hello.c
Whenever the compiler needs a certain disk, it will tell us and we confirm with the enter key:

As soon as the „$“ prompt is back, we start the linker from the Compiler disk:
$ link -s
The -s parameter tells the linker to create an executable binary that does not need the shell to run.
The linker has a new prompt: „>“. In each line we tell the linker which object files we would like to link together. When we are done we enter a single arrow-up and the linker starts its work:

Please note that the system expects the object disk after when confirm the arrow-up.
As soon as the „>“ prompt is back, we confirm with the enter key and the linker is asking for the output file name (of the executable file). In this example I entered „hello.prg“. As a last step, the linker terminates and the shell prompt „$“ is back. The shell is terminated with the „bye“ command and the user is back in BASIC.
Next the executable is being loaded from the Source disk with
LOAD "HELLO.PRG",8,1
As the linker was started without a certain memory address (link -s [address]), the program hello.prg begins at address 2026 and can be started with the „run“ command thanks to a small BASIC header:

Note that the putchar function in above source code changed the character set to lower/upper characters.
Writing code in POWER C is fun and comparatively fast. Definitely much easier when writing in native assembly code. But if necessary, one can even call machine language code from within POWER C with the sys( ) function. One drawback of POWER C is that certain functions are only available on the C128. The absence of peek( ) and poke( ) hurt the most.