
typedef struct {
   int   opcode;
   int   payload;    /* in bytes */
   char *mnemonic;
} zmnem_t;


static const zmnem_t zmnem[] = {

/*START <-- required for js.c */

   {0, 0, "nop"},

   /* load literal */
   {0x01, 1, "ldl->a"},
   {0x02, 1, "ldl->b"},
   {0x03, 1, "ldl->c"},

   /* load condition code from register */
   {0x06, 0, "ldc<-a"},
   {0x07, 0, "ldc<-b"},
   {0x08, 0, "ldc<-c"},

   /* subroutine calls */
   {0x0a, 2, "call"},
   {0x0b, 0, "ret"},
   {0x0c, 1, "calls"},
   {0x0d, 0, "rets"},

   /* stack */
   {0x10, 0, "pusha"},
   {0x11, 0, "pushb"},
   {0x12, 0, "pushc"},
   {0x13, 0, "pop->a"},
   {0x14, 0, "pop->b"},
   {0x15, 0, "pop->c"},

   /* 16-bit incrementer */
   {0x16, 0, "incj"},
   {0x17, 0, "decj"},
   {0x18, 0, "incxy"},
   {0x19, 0, "decxy"},
   {0x1a, 0, "incj->xy"},
   {0x1b, 0, "decj->xy"},
   {0x1c, 0, "incxy->j"},
   {0x1d, 0, "decxy->j"},

   /* read/write memory */
   {0x20, 0, "rdj->a"},
   {0x21, 0, "rdxy->a"},
   {0x22, 0, "rdj->b"},
   {0x23, 0, "rdxy->b"},
   {0x24, 0, "rdj->c"},
   {0x25, 0, "rdxy->c"},
   {0x26, 0, "rdj->x"},
   {0x27, 0, "rdj->y"},
   {0x28, 0, "wrj<-a"},
   {0x29, 0, "wrxy<-a"},
   {0x2a, 0, "wrj<-b"},
   {0x2b, 0, "wrxy<-b"},
   {0x2c, 0, "wrj<-c"},
   {0x2d, 0, "wrxy<-c"},
   {0x2e, 0, "wrj<-x"},
   {0x2f, 0, "wrj<-x"},

   /* long branches */
   {0x30, 2, "br"},
   {0x31, 2, "brz"},
   {0x32, 2, "brnz"},
   {0x33, 2, "brc"},
   {0x34, 2, "brnc"},
   {0x35, 2, "brs"},
   {0x36, 2, "brns"},

   /* short branches */
   {0x37, 1, "sbr"},
   {0x38, 1, "sbrz"},
   {0x39, 1, "sbrnz"},
   {0x3a, 1, "sbrc"},
   {0x3b, 1, "sbrnc"},
   {0x3c, 1, "sbrs"},
   {0x3d, 1, "sbrns"},

   /* 8-bit moves */
   {0x50, 0, "movb->a"},
   {0x51, 0, "movc->a"},
   {0x52, 0, "movx->a"},
   {0x53, 0, "movy->a"},
   {0x54, 0, "mova->b"},
   {0x55, 0, "movc->b"},
   {0x56, 0, "movx->b"},
   {0x57, 0, "movy->b"},
   {0x58, 0, "mova->c"},
   {0x59, 0, "movb->c"},
   {0x5a, 0, "movx->c"},
   {0x5b, 0, "movy->c"},
   {0x5c, 0, "mova->x"},
   {0x5d, 0, "movb->x"},
   {0x5e, 0, "movc->x"},
   {0x5f, 0, "movy->x"},
   {0x60, 0, "mova->y"},
   {0x61, 0, "movb->y"},
   {0x62, 0, "movc->y"},
   {0x63, 0, "movx->y"},

   /* 16-bit moves */
   {0x64, 0, "movxy->j"},
   {0x65, 0, "movxy->s"},
   {0x66, 0, "movxy->p"},
   {0x67, 0, "movj->xy"},
   {0x68, 0, "movj->s"},
   {0x69, 0, "movj->p"},
   {0x6a, 0, "movs->xy"},
   {0x6b, 0, "movs->j"},
   {0x6c, 0, "movs->p"},
   {0x6d, 0, "movp->xy"},
   {0x6e, 0, "movp->j"},
   {0x6f, 0, "movp->s"},

   /* NOT */
   {0x80, 0, "nota->b"},
   {0x81, 0, "nota->c"},
   {0x82, 0, "nota->mj"},
   {0x83, 0, "nota->mxy"},
   {0x84, 0, "notb->a"},
   {0x85, 0, "notb->c"},
   {0x86, 0, "notb->mj"},
   {0x87, 0, "notb->mxy"},
   {0x88, 0, "notc->a"},
   {0x89, 0, "notc->b"},
   {0x8a, 0, "notc->mj"},
   {0x8b, 0, "notc->mxy"},
   {0x8c, 0, "nota"},
   {0x8d, 0, "notb"},
   {0x8e, 0, "notc"},

   /* INC */
   {0x90, 0, "inca->b"},
   {0x91, 0, "inca->c"},
   {0x92, 0, "inca->mj"},
   {0x93, 0, "inca->mxy"},
   {0x94, 0, "incb->a"},
   {0x95, 0, "incb->c"},
   {0x96, 0, "incb->mj"},
   {0x97, 0, "incb->mxy"},
   {0x98, 0, "incc->a"},
   {0x99, 0, "incc->b"},
   {0x9a, 0, "incc->mj"},
   {0x9b, 0, "incc->mxy"},
   {0x9c, 0, "inca"},
   {0x9d, 0, "incb"},
   {0x9e, 0, "incc"},

   /* DEC */
   {0xa0, 0, "deca->b"},
   {0xa1, 0, "deca->c"},
   {0xa2, 0, "deca->mj"},
   {0xa3, 0, "deca->mxy"},
   {0xa4, 0, "decb->a"},
   {0xa5, 0, "decb->c"},
   {0xa6, 0, "decb->mj"},
   {0xa7, 0, "decb->mxy"},
   {0xa8, 0, "decc->a"},
   {0xa9, 0, "decc->b"},
   {0xaa, 0, "decc->mj"},
   {0xab, 0, "decc->mxy"},
   {0xac, 0, "deca"},
   {0xad, 0, "decb"},
   {0xae, 0, "decc"},

   /* SR */
   {0xb0, 0, "sra->b"},
   {0xb1, 0, "sra->c"},
   {0xb2, 0, "sra->mj"},
   {0xb3, 0, "sra->mxy"},
   {0xb4, 0, "srb->a"},
   {0xb5, 0, "srb->c"},
   {0xb6, 0, "srb->mj"},
   {0xb7, 0, "srb->mxy"},
   {0xb8, 0, "src->a"},
   {0xb9, 0, "src->b"},
   {0xba, 0, "src->mj"},
   {0xbb, 0, "src->mxy"},
   {0xbc, 0, "sra"},
   {0xbd, 0, "srb"},
   {0xbe, 0, "src"},

   /* AND */
   {0xc0, 0, "andab->c"},
   {0xc1, 0, "andab->mj"},
   {0xc2, 0, "andab->mxy"},
   {0xc3, 0, "andac->b"},
   {0xc4, 0, "andac->mj"},
   {0xc5, 0, "andac->mxy"},
   {0xc6, 0, "andbc->a"},
   {0xc7, 0, "andbc->mj"},
   {0xc8, 0, "andbc->mxy"},
   {0xc9, 0, "andab"},
   {0xca, 0, "andac"},
   {0xcb, 0, "andbc"},

   /* OR */
   {0xd0, 0, "orab->c"},
   {0xd1, 0, "orab->mj"},
   {0xd2, 0, "orab->mxy"},
   {0xd3, 0, "orac->b"},
   {0xd4, 0, "orac->mj"},
   {0xd5, 0, "orac->mxy"},
   {0xd6, 0, "orbc->a"},
   {0xd7, 0, "orbc->mj"},
   {0xd8, 0, "orbc->mxy"},
   {0xd9, 0, "orab"},
   {0xda, 0, "orac"},
   {0xdb, 0, "orbc"},

   /* XOR */
   {0xe0, 0, "xorab->c"},
   {0xe1, 0, "xorab->mj"},
   {0xe2, 0, "xorab->mxy"},
   {0xe3, 0, "xorac->b"},
   {0xe4, 0, "xorac->mj"},
   {0xe5, 0, "xorac->mxy"},
   {0xe6, 0, "xorbc->a"},
   {0xe7, 0, "xorbc->mj"},
   {0xe8, 0, "xorbc->mxy"},
   {0xe9, 0, "xorab"},
   {0xea, 0, "xorac"},
   {0xeb, 0, "xorbc"},

   /* ADD */
   {0xcc, 0, "addab"},
   {0xcd, 0, "addac"},
   {0xce, 0, "addbc"},
   {0xcf, 0, "addaa"},
   {0xdc, 0, "addbb"},
   {0xdd, 0, "addcc"},
   {0xde, 0, "addab->mxy"},
   {0xdf, 0, "addac->mxy"},
   {0xec, 0, "addbc->mxy"},
   {0xed, 0, "addaa->mxy"},
   {0xee, 0, "addbb->mxy"},
   {0xef, 0, "addcc->mxy"},
   {0xf0, 0, "addab->c"},
   {0xf1, 0, "addab->mj"},
   {0xf2, 0, "addac->b"},
   {0xf3, 0, "addac->mj"},
   {0xf4, 0, "addbc->a"},
   {0xf5, 0, "addbc->mj"},
   {0xf6, 0, "addaa->b"},
   {0xf7, 0, "addaa->c"},
   {0xf8, 0, "addaa->mj"},
   {0xf9, 0, "addbb->a"},
   {0xfa, 0, "addbb->c"},
   {0xfb, 0, "addbb->mj"},
   {0xfc, 0, "addcc->a"},
   {0xfd, 0, "addcc->b"},
   {0xfe, 0, "addcc->mj"},

/*END <-- required for js.c */

   {0, 0, NULL}
};
