/*
   new command for 8051SBC

*/

#include <8051io.h>
#include <8051reg.h>

#define gpio1 (*((unsigned char *)0x0100))
#define gpio2 (*((unsigned char *)0x0200))

// user registers for saving after break programming running
// prepared for assembly learning


unsigned char rbuffer[30];

unsigned char i,j,temp,non_hex;

unsigned char buffer[10];

char command;
int temp16;
unsigned char *dptr; //pointer to external RAM

char *title = "\n\n8051SBC new commands (press ? for help or q to quit)";
char *prompt = "\n\n>>";
char *menu =   "\n\nHelp Menu\nA ASCII Table\nD Dec2Hex\nR Read GPIO2\nQ Quit\nI i/o address\nB Binary image\n? help";

main()
{
     putstr(title);
     sendprompt();

          while(1)
          {
          command = chkchr();     /* run background task here */
          print_help();
          print_ascii();
          dec2hex();
          read_gpio2();
          ioaddress();
          binaryimage();
          print_register();
          quit();
          prompting();
          }
}

save_register()
{
        asm{

        PUSH PCON
        PUSH ACC
        PUSH B
        PUSH PSW
        PUSH DPL
        PUSH DPH
        PUSH 0
        PUSH 1
        PUSH 2
        PUSH 3
        PUSH 4
        PUSH 5
        PUSH 6
        PUSH 7
        PUSH IP
        PUSH IE
        PUSH SCON
        PUSH TCON
        PUSH TMOD
        PUSH P1
        PUSH P3

        MOV R7,#21
        MOV DPTR,#rbuffer
COPY    POP A
        MOVX @DPTR,A
        INC DPTR
        DJNZ R7,COPY

        }
}

print_register()
{
        if(command == 'u')
        {
        save_register();
        putstr("print user regsiters");

        printf("\n\n P3=%02x P1=%02x TMOD=%02x TCON=%02x SCON=%02x IE=%02x IP=%02x",
        rbuffer[0],rbuffer[1],rbuffer[2],rbuffer[3],rbuffer[4],rbuffer[5],rbuffer[6]);

        printf("\n R7=%02x R6=%02x R5=%02x R4=%02x R3=%02x R2=%02x R1=%02x R0=%02x",
        rbuffer[7],rbuffer[8],rbuffer[9],rbuffer[10],rbuffer[11],rbuffer[12],rbuffer[13],rbuffer[14]);

        printf("\n DPH=%02x DPL=%02x B=%02x ACC=%02x PCON=%02x",
        rbuffer[15],rbuffer[16],rbuffer[18],rbuffer[19],rbuffer[20]);

        printf("\n\n PSW= %08b \n PSW= CY AC F0 RS1 RS0 OV - P",rbuffer[17]);

        sendprompt();

        }

}


print_ascii()
{
   if (command== 'a')
      {
       putstr("printable ASCII code(hex), e.g. ASCII code of 'A' is 41");
       ascii_table();
       sendprompt();
      }
}


ascii_table()
{
        putstr("\n\n   MSB");
        for(i= 2; i<8; i++)
        printf("   %d",i);
        putch('\n');
        putstr("LSB");

        for(j=0; j<=15; j++)
        {
         printf("\n  %1x   ",j);
        for(i=2; i< 8; i++)
         {
         temp = i;
         temp <<=4;
         printf("   %c",temp|j);
         }
        }
}

quit()
{
   if (command== 'q')
      {
       asm" LJMP 0";
      }
}


sendprompt()
{
    putstr(prompt);
}

prompting()
{
   if (command == 13)
   {
     putstr(title);
     sendprompt();
   }
}

dec2hex()
{
   if (command== 'd')
      {
       putstr("Decimal to Hex converter");
       putstr("\n\nenter decimal number = ");
       getstr(buffer,10);
       temp16=atoi(buffer);
       printf("Dec -> Hex -> Bin");
       printf("\n%d -> %x -> %b",temp16,temp16,temp16);
       sendprompt();
      }
}


read_gpio2()
{
   if (command== 'r')
      {
       putstr("Read GPIO2 (8-bit input port)");
       printf("\n\n%02x %08b",gpio2,gpio2);
       sendprompt();
      }
}

ioaddress()
{
   if (command== 'i')
      {
       putstr("i/o address decoded by PLD");
       putstr("\n\nLCD   command write     0x0000");
       putstr("\nLCD   data write        0x0001");
       putstr("\nLCD   command read      0x0002");
       putstr("\nLCD   data read         0x0003");
       putstr("\nGPIO1 8-bit output port 0x0100");
       putstr("\nGPIO2 8-bit input  port 0x0200");
       putstr("\nexpansion i/o space     0x0300-0x07FF");
       sendprompt();
      }
}

binaryimage()
{
   if (command== 'b')
      {
       putstr("see how real program looks like");
       putstr("\n\nenter address = ");
       dptr = gethex16();
       putstr("\n\nA15............A0 D7.....D0");
       for(i=0; i<16; i++)
       {
        printf("\n %016b  %08b",dptr,*dptr);
        dptr++;
        }
       sendprompt();
      }
}

char getbyte() // return BCD for DS1307 setting
    
{
    char s[3];      /* two characters plus terminator */
    int i;
    for (i = 0; i < 2; i++)   /* read two characters then return value */
      s[i] = putch(getch());  // echo to terminal
      s[i] = '\0';
      return(((s[0]-0x30)<<4)|(s[1]-0x30)); // return BCD
  //    return (_atoi(s));       // return binary
}

print_help()
{
    if (command == '?')
    {
     putstr(menu);
     sendprompt();
    }
}

gethex16()
{
    int a,b;
    a = gethex();
    b = gethex();
    return((a<<8)|b);
}

gethex()
{
    char a,b;
    a = putch(toupper(getch()));
    b = putch(toupper(getch()));
    a = convertASCII_HEX(a)<<4;
    b = convertASCII_HEX(b);
    return(a|b);
}

convertASCII_HEX(char c)
{
    if (isdigit(c))
       return(c-'0');
    if((c>= 'A') && (c <= 'F'))
       return(c-55);
       non_hex = 1;
}

