OpenCores
URL https://opencores.org/ocsvn/light8080/light8080/trunk

Subversion Repositories light8080

[/] [light8080/] [trunk/] [c/] [hello.c] - Rev 80

Go to most recent revision | Compare with Previous | Blame | View Log

//---------------------------------------------------------------------------------------
//	Project:			light8080 SOC		WiCores Solutions 
//
//	File name:			hello.c 				(February 04, 2012)
//
//	Writer:				Moti Litochevski 
//
//	Description:
//		This file contains a simple program written in Small-C that sends a string to 
//		the UART and then switches to echo received bytes. 
//		This example also include a simple interrupt example which will work with the 
//		verilog testbench. the testbench 
//
//	Revision History:
//
//	Rev <revnumber>			<Date>			<owner> 
//		<comment>
//---------------------------------------------------------------------------------------
 
// define interrupt vectors 
// note that this file must be edited to enable interrupt used 
#include intr_vec.h 
// insert c80 assmbly library to the output file 
#include ..\tools\c80\c80.lib
 
// UART IO registers 
port (128) UDATA;		// uart data register used for both transmit and receive 
port (129) UBAUDL;		// low byte of baud rate register 
port (130) UBAUDH;		// low byte of baud rate register 
port (131) USTAT;		// uart status register 
// digital IO ports registers 
port (132) P1DATA;     	// port 1 data register 
port (133) P1DIR;		// port 1 direction register control 
port (134) P2DATA;		// port 2 data register 
port (135) P2DIR;		// port 2 direction register control 
// interrupt controller register 
port (136) INTRENA;		// interrupts enable register 
// simulation end register 
// writing any value to this port will end the verilog simulation when using tb_l80soc 
// test bench. 
port (255) SIMEND;
 
// registers bit fields definition 
// uart status register decoding 
#define UTXBUSY		1
#define URXFULL		16
 
// globals 
char rxbyte;		// byte received from the uart 
int tstary[2] = {1234, 5678};
 
//---------------------------------------------------------------------------------------
// send a single byte to the UART 
sendbyte(by) 
char by;
{
	while (USTAT & UTXBUSY);
	UDATA = by;
}
 
// check if a byte was received by the uart 
getbyte()
{
	if (USTAT & URXFULL) {
		rxbyte = UDATA;
		return 1;
	} 
	else 
		return 0;
}
 
// send new line to the UART 
nl()
{
	sendbyte(13);
	sendbyte(10);
}
 
// sends a string to the UART 
printstr(sptr)
char *sptr;
{
	while (*sptr != 0) 
		sendbyte(*sptr++);
}
 
// sends a decimal value to the UART 
printdec(dval) 
int dval;
{
	if (dval<0) {
		sendbyte('-');
		dval = -dval;
	}
	outint(dval);
}
 
// function copied from c80dos.c 
outint(n)	
int n;
{	
int q;
 
	q = n/10;
	if (q) outint(q);
	sendbyte('0'+(n-q*10));
}
 
// sends a hexadecimal value to the UART 
printhex(hval)	
int hval;
{	
int q;
 
	q = hval/16;
	if (q) printhex(q);
	q = hval-q*16;
	if (q > 9)
		sendbyte('A'+q-10);
	else 
		sendbyte('0'+q);
}
 
// external interrupt 0 service routine 
int0_isr()
{
	printstr("Interrupt 0 was asserted."); nl();
}
 
// program main routine 
main()
{
	// configure UART baud rate - set to 9600 for 30MHz clock 
	// BAUD = round(<clock>/<baud rate>/16) = round(30e6/9600/16) = 195 
	// Note: Usage of a minimum divider value of 1 will accelerate the RTL simulation. 
	UBAUDL = 195;
	UBAUDH = 0;
 
	// configure both ports to output and digital outputs as zeros 
	P1DATA = 0x00;
	P1DIR = 0xff;
	P2DATA = 0x00;
	P2DIR = 0xff;
	// enable interrupt 0 only 
	INTRENA = 0x01; 
	// enable CPU interrupt 
#asm 
	ei 
#endasm
 
	// print message 
	printstr("Hello World!!!"); nl();
	printstr("Dec value: "); printdec(tstary[1]); nl();
	printstr("Hex value: 0x"); printhex(tstary[0]); nl();
 
	// assert bit 0 of port 1 to test external interrupt 0 
	P1DATA = 0x01;
 
	printstr("Echoing received bytes: "); nl();
	// loop forever 
	while (1) {
		// check if a new byte was received 
		if (getbyte()) 
			// echo the received byte to the UART 
			sendbyte(rxbyte); 
	}
}
//---------------------------------------------------------------------------------------
//						Th.. Th.. Th.. Thats all folks !!!
//---------------------------------------------------------------------------------------
 
 

Go to most recent revision | Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.