/* * sci2.c */ #include #include <3048f.h> #include #include "akih8io.h" #define B2400 207 #define B4800 103 #define B9600 51 #define B19200 25 #define B31250 15 #define B38400 12 #define MAX_SCI 1 /* SCR SCI Control Register */ #define SCR_CKE0 0x01 /* Clock Enable-0 */ #define SCR_CKE1 0x02 /* Clock Enable-1 */ #define SCR_TEIE 0x04 /* Tx-End Interrupt Enable */ #define SCR_MPIE 0x08 /* Multi Processor Interrupt */ #define SCR_RE 0x10 /* Rx Enable */ #define SCR_TE 0x20 /* Tx Enable */ #define SCR_RIE 0x40 /* Rx Interrupt Enable */ #define SCR_TIE 0x80 /* Tx Interrupt Enable */ /* SSR - SCI Status Register */ #define SSR_MPBT 0x01 /* Multi Processor Bit Transfer */ #define SSR_MPB 0x02 /* Multi Processor Bit */ #define SSR_TEND 0x04 /* Trandmit End */ #define SSR_PER 0x08 /* Rx Parity Error */ #define SSR_FER 0x10 /* Rx Flaming Error */ #define SSR_ORER 0x20 /* Rx Over Run Error */ #define SSR_RDRF 0x40 /* Rx Data Register Full */ #define SSR_TDRE 0x80 /* Tx Data Register Empty */ /* Char CONST */ #define CODE_CR (0x0d) #define CODE_LF (0x0a) #define CTRL_C (0x03) typedef unsigned long ulong; typedef unsigned short ushort; typedef unsigned char uchar; short sci_init(ushort speed); short sci_inch(); short sci_outch(ushort c); short sci_putch(ushort c); short sci_getch(); short sci_putline(char *p); short sci_getline(char *p); short sci_CRLF(); void sci_wait(ulong speed); struct sci { char rxdata; char rxstat; char txdata; char txstat; } sci_port[1]; char prompt[] = "? "; void main(void) { short c; ulong i; printf("2st..\n"); (void) sci_init(B9600); (void) sci_CRLF(); (void) sci_putline("*SCI-2\n"); (void) sci_CRLF(); i = 0; (void) sci_putline(prompt); do { c = sci_getch(); if (c == CODE_CR || c == CODE_LF) { if (i > 0) sci_wait(i); /* Sleeping a while */ i = 0; (void) sci_putline(prompt); } else if (c == '.' || c == CTRL_C) { /* is end ? */ (void) sci_CRLF(); break; } else if (isdigit(c)) i = i * 10 + (c - '0'); } while (1); exit(0); } short sci_init(ushort speed) { struct st_sci *ps; char c; ps = &SCI0; ps->SCR.BYTE = 0; ps->SMR.BYTE = 0; ps->BRR = speed; sci_wait(speed); ps->SCR.BYTE = SCR_TE | SCR_RE; c = ps->SSR.BYTE; /* Dummy Read */ ps->SSR.BYTE = SSR_TDRE; return(0); } short sci_inch() { struct st_sci *ps; short c; ps = &SCI0; do { c = ps->SSR.BYTE; } while ((c &= (SSR_RDRF|SSR_ORER|SSR_FER|SSR_PER)) == 0); if (c & SSR_RDRF) { /* Data Received */ c = ps->RDR; ps->SSR.BIT.RDRF = 0; /* Clear flag */ } else { /* any error */ c = -(c); /* error code */ ps->SSR.BYTE = SSR_TDRE; /* Stop the Transmit */ } return (c); } short sci_outch(ushort c) { struct st_sci *ps; short s; ps = &SCI0; do { s = ps->SSR.BIT.TDRE; } while (s == 0); ps->TDR = c; ps->SSR.BIT.TDRE = 0; return(0); } void int_sci0() { ; /* Dummy */ } void int_sce0() { ; /* Dummy */ } short sci_putch(ushort c) { /* to be modified for formatted output */ if (c == '\n') (void) sci_CRLF(); else (void) sci_outch(c); return(0); } short sci_getch() { short c; if((c = sci_inch()) < 0) return(c); if (c == CODE_CR || c == CODE_LF) { (void) sci_CRLF(); } else if (isprint(c) || isspace(c)) (void) sci_putch(c); /* echo */ else if (c == CTRL_C) { (void) sci_CRLF(); (void) sci_putline("^C"); /* Ctrl-C Echo back */ } else (void) sci_putch('?'); /* invalid char */ return(c); } short sci_putline(char *p) { while(*p) sci_putch(*p++); return(0); } short sci_inline(char *p) { short c; short cnt = 0; do { if((c = sci_inch()) < 0) { *p = '\0'; return(c); } cnt++; *p++ = c; } while(c != '\n'); *p = '\0'; return(cnt); } short sci_getline(char *p) { short c; short cnt = 0; do { if((c = sci_getch()) < 0) { /* any error ? */ *p = '\0'; return(c); } cnt++; *p++ = c; } while(c != '\n'); *p = '\0'; return(cnt); } short sci_CRLF() { (void) sci_outch(CODE_CR); (void) sci_outch(CODE_LF); return(0); } void sci_wait(ulong speed) { speed *= 6; /* waiting time rate */ while(speed > 0) { --speed; /* wait 1 bit time (1/9600 sec) */ } }