#include <80c188eb.h>
#include <stdio.h>
#include <math.h>
#include <dos.h>

#define gpio1 0x3000   // input port
#define gpio2 0x3000   // output port 
#define rtc 0x3100
#define NIC 0x3200
#define lpt 0x3300

#define lcd_command_write 0x3400
#define lcd_data_write 0x3401
#define lcd_command_read 0x3402
#define lcd_data_read 0x3403

#define BUSY 0x80  // busy flag location

goto_xy(char x,char y);

char lcd_ready(void)
{
	unsigned char flag;
      	while( (flag=inp(lcd_command_read))&BUSY)  
	{
		if(flag == 0xFF) return -1;  
	}
      	return 1;
}


void clr_screen(void)       
{
    lcd_ready();
    outp(lcd_command_write,0x01);
}


char init_lcd(void)
{
	if(-1 ==lcd_ready()) return -1;
        outp(lcd_command_write,0x38);
	lcd_ready();
        outp(lcd_command_write,0x0c);
        clr_screen();
        goto_xy(0,0);
	return 1;
}

goto_xy(char x,char y)
{
    lcd_ready();
    switch(y){
        case 0 : outp(lcd_command_write,0x80+x); break;
        case 1 : outp(lcd_command_write,0xC0+x); break;
        case 2 : outp(lcd_command_write,0x94+x); break;
        case 3 : outp(lcd_command_write,0xd4+x); break;
    }
}

char *putstring(char* str)
{
	unsigned char i;
	for (i=0; str[i] != '\0'; i++){
		lcd_ready();
         outp(lcd_data_write,str[i]);
	}
	return str;
}

char cin()
{
	while((_S0STS&0x40)==0)
	continue;
	return _S0RBUF;
}

read_time()
{
	char hour,min,sec;
        char buffer[20];
        
	sec = inp(rtc);
	min = inp(rtc+2);
	hour = inp(rtc+4);
        sprintf(buffer,"DS12887 RTC");
	goto_xy(0,3);
	putstring(buffer);
}        
	

test_port()
{
	char buffer[20];
	sprintf(buffer,"GPIO1=%x",inp(gpio1));
	goto_xy(0,2);
	putstring(buffer);
}
		
main()
{
	char buffer[20];
	double n=0.129209921;
        init_lcd();
        goto_xy(0,1);
        putstring("-----80C188 SBC-----");
        goto_xy(0,2);
        
	while(1)
	{
	printf("\r\n %.10f",cos(n));
     sprintf(buffer,"%.10f",cos(n));
     goto_xy(0,0);
	putstring(buffer);

	read_time();
	test_port();
	_P1LTCH ^= 0x80;
        n += 0.000920929;
	
	}	

}
