1
0
mirror of https://github.com/RevCurtisP/C02.git synced 2024-11-17 15:06:29 +00:00
C syntax compiler optimized for the 6502 microprocessor
Go to file
Curtis F Kaylor 35377b5807 Squashed commit of the following:
commit ed00e1d1b5a9783a72dade3f3676b161a9cfe287
Author: Curtis F Kaylor <revcurtis@gmail.com>
Date:   Sun Sep 9 22:20:49 2018 -0400

    Documented joystk, paddle, and lgtpen modules

commit ec0a5ede8d1b043fcf0094ea653255a808dbf8d3
Author: Curtis F Kaylor <revcurtis@gmail.com>
Date:   Sun Sep 9 20:31:11 2018 -0400

    Added joystick, paddle, and lightpen test programs

commit 7b787f432e2f4f7ae5d7f0053ade1d3586a4fad1
Author: Curtis F Kaylor <revcurtis@gmail.com>
Date:   Sun Sep 9 20:30:03 2018 -0400

    Updated Apple II and VIC-20 Batch Files

commit 50568294349d7e3c6b7d0d364aeaece73c9e4ab6
Author: Curtis F Kaylor <revcurtis@gmail.com>
Date:   Sun Sep 9 20:28:09 2018 -0400

    Separated light pen code into separate files

commit d45e59f73d55eef1d30c591d19a043ad79cfd81a
Author: Curtis F Kaylor <revcurtis@gmail.com>
Date:   Sun Sep 9 19:28:56 2018 -0400

    Moved code for paddles into separate include files

commit fc5c5472d758c960332ea14105d5ec4a7c8cbbfb
Author: Curtis F Kaylor <revcurtis@gmail.com>
Date:   Sun Sep 9 16:15:32 2018 -0400

    Added system specific module 'joystk'
2018-09-12 09:54:54 -04:00
apple1 Removed obsolete header file apple1/oldclude/apple1.h 2018-01-28 15:02:49 -05:00
apple2 Add/update Apple ][ test programs 2018-03-03 13:28:22 -05:00
art Added artwork 2018-03-17 21:03:43 -04:00
bin Added customized py65 monitor 2018-03-03 21:50:18 -05:00
doc Squashed commit of the following: 2018-09-12 09:54:54 -04:00
include Squashed commit of the following: 2018-09-12 09:54:54 -04:00
py65 Moved test programs from py65/ to test/ 2018-08-14 00:23:52 -04:00
src Added -s command line option to compiler 2018-09-09 16:10:21 -04:00
test Squashed commit of the following: 2018-09-12 09:54:54 -04:00
util Updated and tested programs in test/ directory 2018-08-19 18:24:02 -04:00
vcs
vic20 File cleanup 2018-08-14 14:52:23 -04:00
work Added #pragma rambase & writebase directives 2018-08-16 16:26:44 -04:00
.gitignore Moved compiler source code to ./src directory 2018-03-03 14:26:50 -05:00
a02.sh Added Makefile and a02.sh shell script 2018-02-13 10:19:24 -05:00
c02.bat
c02.lang
c02.ppj Moved compiler source code to ./src directory 2018-03-03 14:26:50 -05:00
c02.sh Changed to c02.sh 2018-06-27 20:28:17 -04:00
clean02.bat Fixed type in block.h02. modified clean02.bat 2018-02-13 19:53:45 -05:00
clean02.sh Added cleanup scripts clean02.bat and clean02.sh 2018-01-28 14:57:18 -05:00
LICENSE.md Added Mozilla License 3.0 license file 2018-08-05 17:17:40 -04:00
Makefile Reset Makefile to Unix newlines 2018-03-03 14:34:04 -05:00
README.md Updated Syntax Samples in README.md 2018-08-05 16:54:18 -04:00
test.asm

C02 6502 Compiler

C02 is a simple C-syntax language designed to generate highly optimized code for the 6502 microprocessor. The C02 specification is a highly specific subset of the C standard with some modifications and extensions

The compiler generates assembly language code, currently targeted to the DASM assembler.

See the top-level documentation for more information.

Building the Compiler

In Linux, use gcc and the Makefile.

In Windows use the Pelles C IDE and the file ./C02.ppj.

Compiling C02 programs

At a command line, cd into the appropriate directory, e.g. py65 or vic20.

Execute the c02 compiler from the parent directory using the c02 source file (without the .c02 extension) as an argument.

For example, to compile the program conds.c02, in the py65 directory, use the command

../c02 conds

in Linux, or

..\c02 conds

in Windows.

Some of the subdirectories contain a c02.bat file, which will compile the .c02 program, then run dasm to assemble the code. However, the path to dasm is hardcoded, so you will likely need to change it.

The file c02.sh provides the same functionality in Linux, but it may not be in a working state.

Syntax Examples

/* Directives */
#include <header.h02>   //Include header from standard library
#include "inc/hdr.h02"  //Include header from local directory
#pragma origin 8192     //Set start address of object code
#pragma zeropage $80    //Set start address of zero page variables 


/* Constants */
#define TRUE = $FF ; //Constants
#define FALSE = 0
enum {BLACK, WHITE, RED, CYAN, PURPLE, GREEN, BLUE, YELLOW}; 

/* Structures */
struct record {char name[8]; char index;}; //Struct Definition
struct record rec;                         //Struct Declaration

/* Variables and Array Declarations */
char i, j;                   //Variables 
zeropage p,q;                //Variables in zeropage
const char nine = 9;         //Const variable set to decimal literal
const char maxsiz = $FF;     //Const variable set to hexadecimal literal
const char flag = %01010101; //Const variable set to binary literal
const char debug = #TRUE;    //Const variable set to constant
char r[7];                   //8 byte array 0 (decimal dimension)
aligned char m[$FF];         //256 byte array aligned to page boundary
const char s = "string";     //Const array set to string literal
const char m = {1,2,3};      //Const array set to literal list
const char t = {"one", 1);   //Const array set to mixed list

/* Functions Declarations */
void myfunc(); //Forward declaration of function
char myfunp(tmp1, tmp2, tmp3) {
  //function code
}

/* Assignments */
hmove; s80vid;               //Implicit Assignments
x = 0; y = a; a = 1;         //Register Assignments
b = c + d - e & f | g ^ h;   //Assignment and Expression
r[i] = s[j+1] & t[k-1];      //Array Indexing
d[j] = r[a] + s[x] + t[y];   //Arrays Indexed by Register
r = (i>j) ? d[i] : e[j];     //Shortcut If
a<< ;b[i]>>; x++; y--;       //Post-Operations

/* Function Calls */
i = abs(n); j = min(b,c), plot(h,v,c);  //Up to Three Char Arguments
q = div(m+n,d)) - t; n = mult(e+f, z);  //Expression in First Arg Only 
puts("string"); fputs(fp, &line);       //Passing Strings and Arrays
setdst(&dst); n = strcpy(&src);         //Using Multiple String Agruments
c = getc(); setptr(*,addrhi,addrlo);    //No and Skipped Arguments
row,col = scnpos(); i,j,k = get3d();    //Plural Assignments
push d,r; mult(); pop p;                //Pass Arguments via Stack
iprint(); inline "Hello World";         //Pass Inline String Argument
irect(); inline 10,10,100,100;          //Pass Inline Char Arguments
icpstr(); inline &dst, &src;            //Pass Inline Address Arguments

/* Control Structures */
if (c = 27) goto end;
if (n) q = div(n,d) else puts("Division by 0!");
if (b==0 || b>10 && b<20) fprint(n,"input %d in range"); 
c = 'A' ; while (c <= 'Z') { putc(c); c++; } 
while() { c=rdkey; if (c=0) continue; putchr(c); if (c=13) break; }
do c = rdkey(); while (c=0);
do {c = getchr(); putchr(c);} while (c<>13)
for (c='A'; c<='Z'; c++) putc(c);
for (i=strlen(s)-1;i:+;i--) putc(s[i]);
for (i=0;c>0;i++) { c=getc(); s[i]=c }
select (getc()) {
  case $0D: putln("The Enter key");
  case #ESCKEY: if (#NOESC) break; goto escape; 
  case 'A','a': putln ("The letter A");
  default: putln("some other key");
}
end: //Label