Email: Password: Remember Me | Create Account (Free)

Back to Subject List

Old thread has been locked -- no new posts accepted in this thread
???
10/23/06 14:03
Read: times


 
#126905 - Maybe this will help???
Responding to: ???'s previous message
 
Hi Mike,

This isn't in exactly the format you requested, but it might help
anyway.  It's a table of information about the 8051 instruction
set that I lifted from the bowels of an assembler that I wrote a
long time ago.

The first column of the table in particular might be interesting
to you.  It contains what I called an "extended op code", which
includes the instruction mnemonic, along with information about
the operands types allowed for each instruction.  There are also
some assembler directives thrown in the mix.  The single-character
operand type codes are explained in the comments that describe the
'optab' structure.

In addition to the documented operand types, I see that the table
also includes an 'i' type for some of the instructions.  I
apparently failed to note its meaning in the comments, but it
looks like it's supposed to represent branch targets that would
have been looked up in a symbol table during a second pass of the
assembler, rather than being available directly from the source
code during pass 1.

-- Russ

/*****************************************************************************
 *                                  ASM51.H                                  *
 *****************************************************************************
 * DESCRIPTION: This file is a header file to be shared by the various       *
 *              modules of Russ's 8051 assembler.                            *
 *                                                                           *
 * REVISIONS:   17 NOV 86 - RAC - Original code                              *
 *****************************************************************************/

struct optab {                          /* Operation table entry format */

    char    op[9];      /* The "extended operation", defined as follows:     */
                        /* ------------------------------------------------- */
                        /* Bytes 0-4:  Mnemonic, blank padded on right.      */
                        /* Bytes 5-7:  Expected operand types, coded thus:   */
                        /*             n = number       # = immediate        */
                        /*             a = accumulator  c = carry bit        */
                        /*             r = register     @ = Indirect reg.    */
                        /*             b = bit          / = Inverse bit      */
                        /*             d = DPTR         1 = @A+DPTR          */
                        /*             2 = @A+PC        3 = @DPTR            */
                        /*         blank = No operand expected               */
                        /* Byte    8:  Terminating NULL                      */

    char    (*asmbl)(); /* Pointer to routine to handle this operation       */
    char    opcode;     /* Actual opcode value */
    char    bytes;      /* # of bytes occupied by instruction */
    char    cycles;     /* # of cycles to execute instruction */
    char    lrules;     /* Label info.  'O' = optional, 'P' = prohibited,    */
                        /*              'R' = required.                      */

    char    (*ab1)();   /* Pointer to routine to assemble instruction byte 1 */
    char    (*ab2)();   /* Pointer to routine to assemble instruction byte 2 */
    char    (*ab3)();   /* Pointer to routine to assemble instruction byte 3 */
    };

/*****************************************************************************
 *                                  OPTAB.C                                  *
 *****************************************************************************
 * DESCRIPTION: This file contains the big operation table, which gives all  *
 *              kinds of good information for each of the op's recognized by *
 *              the assembler.                                               *
 *                                                                           *
 * REVISIONS:   19 NOV 86 - RAC - Original code                              *
 *****************************************************************************/

#include    "asm51.h"

struct optab    ot[] = {

/*  Xtndd Opcd  Optyp  Opcd  #b #c Lbl  (*ab1)()   (*ab2)()   (*ab3)()  */

/*  FOR COMMENT LINES AND BLANK LINES  */

    "        ", &anop, 0x00, 0, 0, 'o', 0,         0,         0,      /* 44 */

/*  ARITHMETIC OPS  */

    "ADD  ar ", &inst, 0x28, 1, 1, 'o', &opor2,    0,         0,
    "ADD  an ", &inst, 0x25, 2, 1, 'o', ©op,   &lo_2,     0,
    "ADD  a@ ", &inst, 0x26, 1, 1, 'o', &opor2,    0,         0,
    "ADD  a# ", &inst, 0x24, 2, 1, 'o', ©op,   &lo_2,     0,

    "ADDC ar ", &inst, 0x38, 1, 1, 'o', &opor2,    0,         0,
    "ADDC an ", &inst, 0x35, 2, 1, 'o', ©op,   &lo_2,     0,
    "ADDC a@ ", &inst, 0x36, 1, 1, 'o', &opor2,    0,         0,
    "ADDC a# ", &inst, 0x34, 2, 1, 'o', ©op,   &lo_2,     0,

    "SUBB ar ", &inst, 0x98, 1, 1, 'o', &opor2,    0,         0,
    "SUBB an ", &inst, 0x95, 2, 1, 'o', ©op,   &lo_2,     0,
    "SUBB a@ ", &inst, 0x96, 1, 1, 'o', &opor2,    0,         0,
    "SUBB a# ", &inst, 0x94, 2, 1, 'o', ©op,   &lo_2,     0,

    "INC  a  ", &inst, 0x04, 1, 1, 'o', ©op,   0,         0,
    "INC  r  ", &inst, 0x08, 1, 1, 'o', &opor1,    0,         0,
    "INC  n  ", &inst, 0x05, 2, 1, 'o', ©op,   &lo_1,     0,
    "INC  @  ", &inst, 0x06, 1, 1, 'o', &opor1,    0,         0,

    "DEC  a  ", &inst, 0x14, 1, 1, 'o', ©op,   0,         0,
    "DEC  r  ", &inst, 0x18, 1, 1, 'o', &opor1,    0,         0,
    "DEC  n  ", &inst, 0x15, 2, 1, 'o', ©op,   &lo_1,     0,
    "DEC  @  ", &inst, 0x16, 1, 1, 'o', &opor1,    0,         0,

    "INC  d  ", &inst, 0xA3, 1, 2, 'o', ©op,   0,         0,

    "MUL  a  ", &inst, 0xA4, 1, 4, 'o', ©op,   0,         0,
    "DIV  a  ", &inst, 0x84, 1, 4, 'o', ©op,   0,         0,
    "DA   a  ", &inst, 0xD4, 1, 1, 'o', ©op,   0,         0,

/*  LOGICAL OPS  */

    "ANL  ar ", &inst, 0x58, 1, 1, 'o', &opor2,    0,         0,
    "ANL  an ", &inst, 0x55, 2, 1, 'o', ©op,   &lo_2,     0,
    "ANL  a@ ", &inst, 0x56, 1, 1, 'o', &opor2,    0,         0,
    "ANL  a# ", &inst, 0x54, 2, 1, 'o', ©op,   &lo_2,     0,
    "ANL  na ", &inst, 0x52, 2, 1, 'o', ©op,   &lo_1,     0,
    "ANL  n# ", &inst, 0x53, 3, 2, 'o', ©op,   &lo_1,     &lo_2,

    "ORL  ar ", &inst, 0x48, 1, 1, 'o', &opor2,    0,         0,
    "ORL  an ", &inst, 0x45, 2, 1, 'o', ©op,   &lo_2,     0,
    "ORL  a@ ", &inst, 0x46, 1, 1, 'o', &opor2,    0,         0,
    "ORL  a# ", &inst, 0x44, 2, 1, 'o', ©op,   &lo_2,     0,
    "ORL  na ", &inst, 0x42, 2, 1, 'o', ©op,   &lo_1,     0,
    "ORL  n# ", &inst, 0x43, 3, 2, 'o', ©op,   &lo_1,     &lo_2,

    "XRL  ar ", &inst, 0x68, 1, 1, 'o', &opor2,    0,         0,
    "XRL  an ", &inst, 0x65, 2, 1, 'o', ©op,   &lo_2,     0,
    "XRL  a@ ", &inst, 0x66, 1, 1, 'o', &opor2,    0,         0,
    "XRL  a# ", &inst, 0x64, 2, 1, 'o', ©op,   &lo_2,     0,
    "XRL  na ", &inst, 0x62, 2, 1, 'o', ©op,   &lo_1,     0,
    "XRL  n# ", &inst, 0x63, 3, 2, 'o', ©op,   &lo_1,     &lo_2,

    "CLR  a  ", &inst, 0xE4, 1, 1, 'o', ©op,   0,         0,
    "CPL  a  ", &inst, 0xF4, 1, 1, 'o', ©op,   0,         0,

    "RL   a  ", &inst, 0x23, 1, 1, 'o', ©op,   0,         0,
    "RLC  a  ", &inst, 0x33, 1, 1, 'o', ©op,   0,         0,
    "RR   a  ", &inst, 0x03, 1, 1, 'o', ©op,   0,         0,
    "RRC  a  ", &inst, 0x13, 1, 1, 'o', ©op,   0,         0,
    "SWAP a  ", &inst, 0xC4, 1, 1, 'o', ©op,   0,         0,

/*  DATA TRANSFER OPS  */

    "MOV  ar ", &inst, 0xE8, 1, 1, 'o', &opor2,    0,         0,
    "MOV  an ", &inst, 0xE5, 2, 1, 'o', ©op,   &lo_2,     0,
    "MOV  a@ ", &inst, 0xE6, 1, 1, 'o', &opor2,    0,         0,
    "MOV  a# ", &inst, 0x74, 2, 1, 'o', ©op,   &lo_2,     0,

    "MOV  ra ", &inst, 0xF8, 1, 1, 'o', &opor1,    0,         0,
    "MOV  rn ", &inst, 0xA8, 2, 2, 'o', &opor1,    &lo_2,     0,
    "MOV  r# ", &inst, 0x78, 2, 1, 'o', &opor1,    &lo_2,     0,

    "MOV  na ", &inst, 0xF5, 2, 1, 'o', ©op,   &lo_1,     0,
    "MOV  nr ", &inst, 0x88, 2, 2, 'o', &opor2,    &lo_1,     0,
    "MOV  nn ", &inst, 0x85, 3, 2, 'o', ©op,   &lo_2,     &lo_1,
    "MOV  n@ ", &inst, 0x86, 2, 2, 'o', &opor2,    &lo_1,     0,
    "MOV  n# ", &inst, 0x75, 3, 2, 'o', ©op,   &lo_1,     &lo_2,

    "MOV  @a ", &inst, 0xF6, 1, 1, 'o', &opor1,    0,         0,
    "MOV  @n ", &inst, 0xA6, 2, 2, 'o', &opor1,    &lo_2,     0,
    "MOV  @# ", &inst, 0x76, 2, 1, 'o', &opor1,    &lo_2,     0,

    "MOV  d# ", &inst, 0x90, 3, 2, 'o', ©op,   &hi_2,     &lo_2,

    "MOVC a1 ", &inst, 0x93, 1, 2, 'o', ©op,   0,         0,
    "MOVC a2 ", &inst, 0x83, 1, 2, 'o', ©op,   0,         0,

    "MOVX a@ ", &inst, 0xE2, 1, 2, 'o', &opor2,    0,         0,
    "MOVX a3 ", &inst, 0xE0, 1, 2, 'o', ©op,   0,         0,
    "MOVX @a ", &inst, 0xF2, 1, 2, 'o', &opor1,    0,         0,
    "MOVX 3a ", &inst, 0xF0, 1, 2, 'o', ©op,   0,         0,

    "PUSH n  ", &inst, 0xC0, 2, 2, 'o', ©op,   &lo_1,     0,
    "POP  n  ", &inst, 0xD0, 2, 2, 'o', ©op,   &lo_1,     0,

    "XCH  ar ", &inst, 0xC8, 1, 1, 'o', &opor2,    0,         0,
    "XCH  an ", &inst, 0xC5, 2, 1, 'o', ©op,   &lo_2,     0,
    "XCH  a@ ", &inst, 0xC6, 1, 1, 'o', &opor2,    0,         0,
    "XCHD a@ ", &inst, 0xD6, 1, 1, 'o', &opor2,    0,         0,

/*  BOOLEAN VARIABLE MANIPULATION OPS */

    "CLR  c  ", &inst, 0xC3, 1, 1, 'o', ©op,   0,         0,
    "CLR  b  ", &inst, 0xC2, 2, 1, 'o', ©op,   &lo_1,     0,
    "SETB c  ", &inst, 0xD3, 1, 1, 'o', ©op,   0,         0,
    "SETB b  ", &inst, 0xD2, 2, 1, 'o', ©op,   &lo_1,     0,
    "CPL  c  ", &inst, 0xB3, 1, 1, 'o', ©op,   0,         0,
    "CPL  b  ", &inst, 0xB2, 2, 1, 'o', ©op,   &lo_1,     0,
    
    "ANL  cb ", &inst, 0x82, 2, 2, 'o', ©op,   &lo_2,     0,
    "ANL  c/ ", &inst, 0xB0, 2, 2, 'o', ©op,   &lo_2,     0,
    "ORL  cb ", &inst, 0x72, 2, 2, 'o', ©op,   &lo_2,     0,
    "ORL  c/ ", &inst, 0xA0, 2, 2, 'o', ©op,   &lo_2,     0,

    "MOV  cb ", &inst, 0xA2, 2, 1, 'o', ©op,   &lo_2,     0,
    "MOV  bc ", &inst, 0x92, 2, 2, 'o', ©op,   &lo_1,     0,

/*  PROGRAM AND MACHINE CONTROL OPS */

    "ACALLi  ", &inst, 0x11, 2, 2, 'o', &absjmp,   &lo_1,     0,
    "LCALLi  ", &inst, 0x12, 3, 2, 'o', ©op,   &hi_1,     &lo_1,

    "RET     ", &inst, 0x22, 1, 2, 'o', ©op,   0,         0,
    "RETI    ", &inst, 0x32, 1, 2, 'o', ©op,   0,         0,

    "AJMP i  ", &inst, 0x01, 2, 2, 'o', &absjmp,   &lo_1,     0,
    "LJMP i  ", &inst, 0x02, 3, 2, 'o', ©op,   &hi_1,     &lo_1,
    "SJMP i  ", &inst, 0x80, 2, 2, 'o', ©op,   &rel_1,    0,
    "JMP  1  ", &inst, 0x73, 1, 2, 'o', ©op,   0,         0,

    "JZ   i  ", &inst, 0x60, 2, 2, 'o', ©op,   &rel_1,    0,
    "JNZ  i  ", &inst, 0x70, 2, 2, 'o', ©op,   &rel_1,    0,
    "JC   i  ", &inst, 0x40, 2, 2, 'o', ©op,   &rel_1,    0,
    "JNC  i  ", &inst, 0x50, 2, 2, 'o', ©op,   &rel_1,    0,

    "JB   bi ", &inst, 0x20, 3, 2, 'o', ©op,   &lo_1,     &rel_2,
    "JNB  bi ", &inst, 0x30, 3, 2, 'o', ©op,   &lo_1,     &rel_2,
    "JBC  bi ", &inst, 0x10, 3, 2, 'o', ©op,   &lo_1,     &rel_2,

    "CJNE ani", &inst, 0xB5, 3, 2, 'o', ©op,   &lo_2,     &rel_3,
    "CJNE a#i", &inst, 0xB4, 3, 2, 'o', ©op,   &lo_2,     &rel_3,
    "CJNE r#i", &inst, 0xB8, 3, 2, 'o', &opor1,    &lo_2,     &rel_3,
    "CJNE @#i", &inst, 0xB6, 3, 2, 'o', &opor1,    &lo_2,     &rel_3,

    "DJNZ ri ", &inst, 0xD8, 2, 2, 'o', &opor1,    &rel_2,    0,
    "DJNZ ni ", &inst, 0xD5, 3, 2, 'o', ©op,   &lo_1,     &rel_2,

    "NOP     ", &inst, 0x00, 1, 1, 'o', ©op,   0,         0,

/*  ASSEMBLER DIRECTIVES  */

    "ORG  t  ", &orgr, 0x00, 0, 0, 'p', 0,         0,         0,

    "CSEG    ", &cseg, 0x00, 0, 0, 'p', 0,         0,         0,
    "DSEG    ", &dseg, 0x00, 0, 0, 'p', 0,         0,         0,
    "XSEG    ", &xseg, 0x00, 0, 0, 'p', 0,         0,         0,
    "BSEG    ", &bseg, 0x00, 0, 0, 'p', 0,         0,         0,
    "ISEG    ", &iseg, 0x00, 0, 0, 'p', 0,         0,         0,

    "EQU  r  ", &equr, 0x00, 0, 0, 'r', 0,         0,         0,
    "EQU  b  ", &equr, 0x00, 0, 0, 'r', 0,         0,         0,
    "EQU  x  ", &equr, 0x00, 0, 0, 'r', 0,         0,         0,
    "EQU  n  ", &equr, 0x00, 0, 0, 'r', 0,         0,         0,
    "EQU  j  ", &equr, 0x00, 0, 0, 'r', 0,         0,         0,
    "EQU  i  ", &equr, 0x00, 0, 0, 'r', 0,         0,         0,
    "EQU  t  ", &equr, 0x00, 0, 0, 'r', 0,         0,         0,

    "DS   t  ", &dods, 0x00, 0, 0, 'o', 0,         0,         0,
    "DBIT t  ", &dbit, 0x00, 0, 0, 'o', 0,         0,         0,

    "END     ", &endr, 0x00, 0, 0, 'p', 0,         0,         0,

/*  A sentinel record.  This guy is filled in before searching with a copy  */
/*  of the extended op being searched for.  If we get this far, that means  */
/*  it wasn't really in the table and we have an "unknown op" error.        */

    "--------", &uncl, 0x00, 0, 0, 'o', 0,         0,         0
    };
 



List of 24 messages in thread
TopicAuthorDate
my own 8051 compiler...            01/01/70 00:00      
   Take it from here            01/01/70 00:00      
   Compiler, or Assembler?            01/01/70 00:00      
   How does it help?            01/01/70 00:00      
   opcodes            01/01/70 00:00      
   Language translators            01/01/70 00:00      
   well its always good to be ambitious            01/01/70 00:00      
      do it yourself compiler            01/01/70 00:00      
   SDCC            01/01/70 00:00      
      A simple alternative            01/01/70 00:00      
         There's a small-c compiler, too            01/01/70 00:00      
         update            01/01/70 00:00      
            why \'small\' when \'full\' is available for free            01/01/70 00:00      
               Mike, what are you doing?            01/01/70 00:00      
               Benefits            01/01/70 00:00      
                  Jez, please READ the context            01/01/70 00:00      
                     Point taken            01/01/70 00:00      
                        That inspired me, I am starting a thread in the ch            01/01/70 00:00      
   Maybe this will help???            01/01/70 00:00      
   he's gone            01/01/70 00:00      
      He probably figured out how much work it was            01/01/70 00:00      
         done!            01/01/70 00:00      
            So ... which language does it compile?            01/01/70 00:00      
            Sure            01/01/70 00:00      

Back to Subject List