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!
}