The following short example demonstrates programming in C using the cc65
toolset with a custom run-time environment.  In this example, a Xilinx
FPGA contains a UART which is connected to a 65c02 processor with FIFO
(First-In, First-Out) storage to
buffer the data.  The C program will wait for an interrupt generated by
the receive UART and then respond by transmitting the string "Hello
World! " every time a question mark character is received via a
call to the hardware driver rs232_tx ().  The driver
prototype uses the __fastcall__ extension to indicate that the
driver does not use the stack.  The FIFO data interface is at address
$1000 and is defined as the symbolic constant FIFO_DATA.
Writing to FIFO_DATA transfers a byte of data into the transmit
FIFO for subsequent transmission over the serial interface.  Reading
from FIFO_DATA transfers a byte of previously received data out
of the receive FIFO.  The FIFO status data is at address $1001 and is
defined as the symbolic constant FIFO_STATUS.  For convenience,
the symbolic constants TX_FIFO_FULL (which isolates bit 0 of
the register) and RX_FIFO_EMPTY (which isolates bit 1 of the
register) have been defined to read the FIFO status.
The following C code is saved in the file "main.c". As this example demonstrates, the run-time environment has been set up such that all of the behind-the-scene work is transparent to the user.
#define FIFO_DATA     (*(unsigned char *) 0x1000)
#define FIFO_STATUS   (*(unsigned char *) 0x1001)
#define TX_FIFO_FULL  (FIFO_STATUS & 0x01)
#define RX_FIFO_EMPTY (FIFO_STATUS & 0x02)
extern void wait ();
extern void __fastcall__ rs232_tx (char *str);
int main () {
  while (1) {                                     //  Run forever
    wait ();                                      //  Wait for an RX FIFO interrupt
    while (RX_FIFO_EMPTY == 0) {                  //  While the RX FIFO is not empty
      if (FIFO_DATA == '?') {                     //  Does the RX character = '?'
        rs232_tx ("Hello World!");                //  Transmit "Hello World!"
      }                                           //  Discard any other RX characters
    }
  }
  return (0);                                     //  We should never get here!
}