// serialtest.c
// https://balau82.wordpress.com/2010/06/13/emulating-8051-serial-port-communication-on-linux/

// sdcc -mmcs51 serialtest.c -o serialtest.hex

// modified for sdcc 4.5 with AT89S52 by Andre Adrian, DL1ADR, 2026-06-11

#include <mcs51/at89x52.h>
#include <stdio.h>
#include <ctype.h>

int getchar (void) {
    char c;
    while (!RI);    /* wait to receive */
    c = SBUF;       /* receive from serial */
    RI = 0;
    return c;
}
 
int putchar (int c) {
    while (!TI);    /* wait end of last transmission */
    TI = 0;
    SBUF = c;       /* transmit to serial */
    return c;
}

void UART_Init(void) {
    SCON = 0x50; /* uart in mode 1 (8 bit), REN=1 */
    TMOD = 0x20; /* Timer 1 in mode 2  */
    TH1 = 253;  /* 9600 Bds at 11.0592MHz  */
    TL1 = 253;  /* 9600 Bds at 11.0592MHz  */
    ES = 0;     /* Disable serial interrupt*/
    EA = 0;     /* Disable global interrupt */
    TR1 = 1;    /* Timer 1 run  */
    TI = 1;     /* enable transmitting */
    RI = 0;     /* waiting to receive */
}
 
void main(void) {
    UART_Init();
    for(;;) {
        char c;
        c = getchar();
        c = toupper(c);
        putchar(c);
    }
}
