This documentation was automatically generated with AcDoc tool.
- 00001     /* ex: set tabstop=2 expandtab:
- 00002     -*- Mode: C; tab-width: 2; indent-tabs-mode nil -*-
- 00003     */
- 00004     /**
- 00005     * @file i8051_isa.ac
- 00006     * @author Tiago Sampaio Lins
- 00007     * Silvio Veloso
- 00008     * Marcus do Nascimento (Assembly Syntax)
- 00009     * Alexandro (Assembly Syntax)
- 00010     *
- 00011     * The ArchC Team
- 00012     * http://www.archc.org/
- 00013     *
- 00014     * Computer Systems Laboratory (LSC)
- 00015     * IC-UNICAMP
- 00016     * http://www.lsc.ic.unicamp.br/
- 00017     *
- 00018     * @version 1.0
- 00019     * @date Fri, 30 Jun 2006 14:25:50 -0300
- 00020     *
- 00021     * @brief The ArchC i8051 functional model.
- 00022     *
- 00023     * @attention Copyright (C) 2002-2006 --- The ArchC Team
- 00024     *
- 00025     * This program is free software; you can redistribute it and/or modify
- 00026     * it under the terms of the GNU General Public License as published by
- 00027     * the Free Software Foundation; either version 2 of the License, or
- 00028     * (at your option) any later version.
- 00029     *
- 00030     * This program is distributed in the hope that it will be useful,
- 00031     * but WITHOUT ANY WARRANTY; without even the implied warranty of
- 00032     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- 00033     * GNU General Public License for more details.
- 00034     *
- 00035     * You should have received a copy of the GNU General Public License
- 00036     * along with this program; if not, write to the Free Software
- 00037     * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- 00038     *
- 00039     */
- 00040    
- 00041     AC_ISA (i8051)
- 00042     {
- 00043     ac_helper
- 00044     {
- 00045     sc_uint<17> pc;
- 00046     int reg_indx;
- 00047     unsigned long pc_stability;
- 00048     unsigned long old_pc;
- 00049     unsigned long curr_pc;
- 00050     };
- 00051    
- 00052     ac_format Type_3bytes = "%op:8 %byte2:8 %byte3:8" ;
- 00053     ac_format Type_2bytes = "%op:8 %byte2:8" ;
- 00054     ac_format Type_OP_R = "%op1:5 %reg:3" ;
- 00055     ac_format Type_IBRCH = "%page:3 %op2:5 %addr0:8" ;
- 00056     ac_format Type_1byte = "%op:8" ;
- 00057     ac_format Type_3bytesReg = "%op3:5 %reg2:3 %data:8 %reladd:8" ;
- 00058     ac_format Type_2bytesReg = "%op3:5 %reg2:3 %addr:8" ;
- 00059    
- 00060    
- 00061     ac_instr add_ar, addc_ar, anl_ar, dec_r, inc_r, mov_ar, mov_ra, orl_ar,
- 00062     subb_ar, xch_ar, xrl_ar;
- 00063     ac_instr acall, ajmp;
- 00064     ac_instr anl_iram_data, cjne_addr, cjne_data, cjne_arr_R0, cjne_arr_R1,
- 00065     djnz_iram_reladd, jb, jbc, jnb, lcall, ljmp, mov_iram_iram,
- 00066     mov_iram_data, mov_dptr_data, orl_iram_data, xrl_iram_data;
- 00067     ac_instr add_a_data, add_a_iram, addc_a_data, addc_a_iram, anl_a_iram,
- 00068     anl_a_data, anl_iram_a, anl_c_bit, anl_c_nbit, clr_bit, cpl_bit,
- 00069     dec_iram, inc_iram, jc, jnc, jnz, jz, mov_a_iram, mov_a_data,
- 00070     mov_iram_a, mov_iram_arr_R0, mov_iram_arr_R1, mov_arr_R0_iram,
- 00071     mov_arr_R1_iram, mov_arr_R0_data, mov_arr_R1_data, mov_c_bit,
- 00072     mov_bit_c, orl_a_iram, orl_a_data, orl_iram_a, orl_c_bit,
- 00073     orl_c_nbit, pop, push, setb_bit, sjmp, subb_a_iram, subb_a_data,
- 00074     xch_a_iram, xrl_a_iram, xrl_a_data, xrl_iram_a;
- 00075     ac_instr add_arr_R0, add_arr_R1, addc_arr_R0, addc_arr_R1, anl_arr_R0,
- 00076     anl_arr_R1, clr_a, clr_c, cpl_a, cpl_c, da, dec_a, dec_arr_R0,
- 00077     dec_arr_R1, div, inc_a, inc_arr_R0, inc_arr_R1, inc_dptr, jmp,
- 00078     mov_a_arr_R0, mov_a_arr_R1, mov_arr_R0_a, mov_arr_R1_a, movc_dptr,
- 00079     movc_pc, movx_a_R0, movx_a_R1, movx_a_dptr, movx_r0_a, movx_r1_a,
- 00080     movx_dptr_a, mul, nop, orl_arr_R0, orl_arr_R1, ret, reti, rl_a,
- 00081     rlc_a, rr_a, rrc_a, setb_c, subb_a_arr_R0, subb_a_arr_R1, swap,
- 00082     xch_arr_R0, xch_arr_R1, xchd_R0, xchd_R1, xrl_arr_R0, xrl_arr_R1;
- 00083     ac_instr cjne_r;
- 00084     ac_instr djnz_r, mov_r_iram, mov_r_data, mov_iram_r;
- 00085    
- 00086    
- 00087     /* The 8051 has a separate memory for program and data
- 00088     * . program memory can be up to 64K bytes long (lower 4k may reside on chip)
- 00089     * . data memory can be up to 64K bytes (external); the lower 128 bytes are on chip
- 00090     * RAM. Next 128 bytes are the special function registers (direct addressing only)
- 00091     */
- 00092    
- 00093     ac_asm_map reg {
- 00094     "r"[0..7] = [0..7]; /* 8 registers. There are 4 register banks (32 regs). */
- 00095     /* Registers are mapped into DATA memory at address */
- 00096     /* 0x00 - 0x1F. */
- 00097     /* We are only using the first reg bank */
- 00098     }
- 00099    
- 00100     /* Special function registers
- 00101     * memory addresses 0x80-0xFF are the SFRs
- 00102     * (direct addressing is used to access them)
- 00103     */
- 00104     ac_asm_map sfr {
- 00105     /*
- 00106     * names based on the ones used by SDCC
- 00107     */
- 00108     "sp" = 0x81;
- 00109     "b" = 0xF0;
- 00110     "dpl" = 0x82;
- 00111     "dph" = 0x83;
- 00112     "ar" [0..7] = [0..7];
- 00113    
- 00114     "_P0" = 0x80;
- 00115     "_P1" = 0x90;
- 00116     "_P2" = 0xA0;
- 00117     "_P3" = 0xB0;
- 00118     "_PSW" = 0xD0;
- 00119     "_ACC" = 0xE0;
- 00120     "_B" = 0xF0;
- 00121     "_SP" = 0x81;
- 00122     "_DPL" = 0x82;
- 00123     "_DPH" = 0x83;
- 00124     "_PCON" = 0x87;
- 00125     "_TCON" = 0x88;
- 00126     "_TMOD" = 0x89;
- 00127     "_TL0" = 0x8A;
- 00128     "_TL1" = 0x8B;
- 00129     "_TH0" = 0x8C;
- 00130     "_TH1" = 0x8D;
- 00131     "_AUXR" = 0x8E;
- 00132     "_IE" = 0xA8;
- 00133     "_IP" = 0xB8;
- 00134     "_SCON" = 0x98;
- 00135     "_SBUF" = 0x99;
- 00136    
- 00137     /* bit addressable */
- 00138     "_CY" = 0xD7;
- 00139     "_AC" = 0xD6;
- 00140     "_F0" = 0xD5;
- 00141     "_RS1" = 0xD4;
- 00142     "_RS0" = 0xD3;
- 00143     "_OV" = 0xD2;
- 00144     "_P" = 0xD0;
- 00145     "_TF1" = 0x8F;
- 00146     "_TR1" = 0x8E;
- 00147     "_TF0" = 0x8D;
- 00148     "_TR0" = 0x8C;
- 00149     "_IE1" = 0x8B;
- 00150     "_IT1" = 0x8A;
- 00151     "_IE0" = 0x89;
- 00152     "_IT0" = 0x88;
- 00153     "_EA" = 0xAF;
- 00154     "_ES" = 0xAC;
- 00155     "_ET1" = 0xAB;
- 00156     "_EX1" = 0xAA;
- 00157     "_ET0" = 0xA9;
- 00158     "_EX0" = 0xA8;
- 00159     "_PS" = 0xBC;
- 00160     "_PT1" = 0xBB;
- 00161     "_PX1" = 0xBA;
- 00162     "_PT0" = 0xB9;
- 00163     "_PX0" = 0xB8;
- 00164     "_RD" = 0xB7;
- 00165     "_WR" = 0xB6;
- 00166     "_T1" = 0xB5;
- 00167     "_T0" = 0xB4;
- 00168     "_INT1" = 0xB3;
- 00169     "_INT0" = 0xB2;
- 00170     "_TXD" = 0xB1;
- 00171     "_RXD" = 0xB0;
- 00172     "_P0." [0..7] = [0x80..0x87];
- 00173     "_P1." [0..7] = [0x90..0x97];
- 00174     "_SCON." [0..7] = [0x98..0x9F];
- 00175     "_P2." [0..7] = [0xA0..0xA7];
- 00176     "_IE." [0..7] = [0xA8..0xAF];
- 00177     "_P3." [0..7] = [0xB0..0xB7];
- 00178     "_IP." [0..5] = [0xB8..0xBD];
- 00179     "_PSW." [0..7] = [0xD0..0xD7];
- 00180     "_ACC." [0..7] = [0xE0..0xE7];
- 00181     "_B." [0..7] = [0xF0..0xF7];
- 00182     }
- 00183    
- 00184    
- 00185     /*
- 00186     * Try not to change the order of the assembly syntax in
- 00187     * groups of instructions (due to syntax overloading, some
- 00188     * unwanted results might appear if you do so).
- 00189     */
- 00190    
- 00191     ISA_CTOR (i8051){
- 00192    
- 00193     /* ACALL SUBRTN */
- 00194     acall.set_asm ("acall %addr" , page+addr0);
- 00195     acall.set_decoder (op2=0x11);
- 00196    
- 00197     /*
- 00198     *
- 00199     * ADD A,
- 00200     *
- 00201     */
- 00202     /* ADD A, Rn */
- 00203     add_ar.set_asm ("add A,%reg" , reg);
- 00204     add_ar.set_decoder (op1=0x05);
- 00205    
- 00206     /* ADD A, direct */
- 00207     add_a_iram.set_asm ("add A,%sfr" , byte2);
- 00208     add_a_iram.set_asm ("add A,%exp" , byte2);
- 00209     add_a_iram.set_decoder (op=0x25);
- 00210    
- 00211     /* ADD A, R0 */
- 00212     add_arr_R0.set_asm ("add A,@R0" );
- 00213     add_arr_R0.set_decoder (op=0x26);
- 00214    
- 00215     /* ADD A, @R1 */
- 00216     add_arr_R1.set_asm ("add A,@R1" );
- 00217     add_arr_R1.set_decoder (op=0x27);
- 00218    
- 00219     /* ADD A, #data */
- 00220     add_a_data.set_asm ("add A, #hi(%exp(high))" , byte2);
- 00221     add_a_data.set_asm ("add A, #%exp" , byte2);
- 00222     add_a_data.set_decoder (op=0x24);
- 00223    
- 00224     /*
- 00225     *
- 00226     * ADDC A,
- 00227     *
- 00228     */
- 00229     /* ADDC A, Rn */
- 00230     addc_ar.set_asm ("addc A,%reg" , reg);
- 00231     addc_ar.set_decoder (op1=0x07);
- 00232    
- 00233     /* ADDC A, direct */
- 00234     addc_a_iram.set_asm ("addc A,%sfr" , byte2);
- 00235     addc_a_iram.set_asm ("addc A,%exp" , byte2);
- 00236     addc_a_iram.set_decoder (op=0x35);
- 00237    
- 00238     /* ADDC A, R0 */
- 00239     addc_arr_R0.set_asm ("addc A,@R0" );
- 00240     addc_arr_R0.set_decoder (op=0x36);
- 00241    
- 00242     /* ADDC A, @R1 */
- 00243     addc_arr_R1.set_asm ("addc A,@R1" );
- 00244     addc_arr_R1.set_decoder (op=0x37);
- 00245    
- 00246     /* ADDC A, #data */
- 00247     addc_a_data.set_asm ("addc A, #hi(%exp(high))" , byte2);
- 00248     addc_a_data.set_asm ("addc A, #%exp" , byte2);
- 00249     addc_a_data.set_decoder (op=0x34);
- 00250    
- 00251    
- 00252    
- 00253     /* AJMP JMPADR */
- 00254     ajmp.set_asm ("ajmp %addr" , page+addr0);
- 00255     ajmp.set_decoder (op2=0x01);
- 00256    
- 00257    
- 00258     /*
- 00259     *
- 00260     * ANL C,
- 00261     *
- 00262     */
- 00263     /* ANL C, bit */
- 00264     anl_c_bit.set_asm ("anl C,%sfr" , byte2);
- 00265     anl_c_bit.set_asm ("anl C,%imm" , byte2);
- 00266     anl_c_bit.set_decoder (op=0x82);
- 00267    
- 00268     /* ANL C, /bit */
- 00269     anl_c_nbit.set_asm ("anl C,/%sfr" , byte2);
- 00270     anl_c_nbit.set_asm ("anl C,/%imm" , byte2);
- 00271     anl_c_nbit.set_decoder (op=0xB0);
- 00272    
- 00273    
- 00274     /*
- 00275     *
- 00276     * ANL ,
- 00277     *
- 00278     */
- 00279     /* ANL A, Rn*/
- 00280     anl_ar.set_asm ("anl A,%reg" , reg);
- 00281     anl_ar.set_decoder (op1=0x0B);
- 00282    
- 00283     /* ANL A, #data */
- 00284     anl_a_data.set_asm ("anl A, #%imm" , byte2);
- 00285     anl_a_data.set_decoder (op=0x54);
- 00286    
- 00287     /* ANL A, direct */
- 00288     anl_a_iram.set_asm ("anl A,%sfr" , byte2);
- 00289     anl_a_iram.set_asm ("anl A,%exp" , byte2);
- 00290     anl_a_iram.set_decoder (op=0x55);
- 00291    
- 00292     /* ANL A, @R0 */
- 00293     anl_arr_R0.set_asm ("anl A,@R0" );
- 00294     anl_arr_R0.set_decoder (op=0x56);
- 00295    
- 00296     /* ANL A, @R1 */
- 00297     anl_arr_R1.set_asm ("anl A,@R1" );
- 00298     anl_arr_R1.set_decoder (op=0x57);
- 00299    
- 00300     /* ANL direct, A */
- 00301     anl_iram_a.set_asm ("anl %sfr,A" , byte2);
- 00302     anl_iram_a.set_asm ("anl %exp,A" , byte2);
- 00303     anl_iram_a.set_decoder (op=0x52);
- 00304    
- 00305     /* ANL direct, #data */
- 00306     anl_iram_data.set_asm ("anl %sfr, #%imm" , byte2, byte3);
- 00307     anl_iram_data.set_asm ("anl %exp, #%imm" , byte2, byte3);
- 00308     anl_iram_data.set_decoder (op=0x53);
- 00309    
- 00310    
- 00311    
- 00312     /*
- 00313     *
- 00314     * CJNE ,,rel
- 00315     *
- 00316     */
- 00317     /* CJNE A, direct, rel */
- 00318     cjne_addr.set_asm ("cjne A,%sfr,%addr(pcrel,3)" , byte2, byte3);
- 00319     cjne_addr.set_asm ("cjne A,%exp,%addr(pcrel,3)" , byte2, byte3);
- 00320     cjne_addr.set_decoder (op=0xB5);
- 00321    
- 00322     /* CJNE A, #data, rel */
- 00323     cjne_data.set_asm ("cjne A,#%imm,%addr(pcrel,3)" , byte2, byte3);
- 00324     cjne_data.set_decoder (op=0xB4);
- 00325    
- 00326     /* CJNE @R0, #data, rel */
- 00327     cjne_arr_R0.set_asm ("cjne @R0,#%imm,%addr(pcrel,3)" , byte2, byte3);
- 00328     cjne_arr_R0.set_decoder (op=0xB6);
- 00329    
- 00330     /* CJNE @R1, #data, rel */
- 00331     cjne_arr_R1.set_asm ("cjne @R1,#%imm,%addr(pcrel,3)" , byte2, byte3);
- 00332     cjne_arr_R1.set_decoder (op=0xB7);
- 00333    
- 00334     /* CJNE Rn, #data, rel */
- 00335     cjne_r.set_asm ("cjne %reg,#%imm,%addr(pcrel,3)" , reg2, data, reladd);
- 00336     cjne_r.set_decoder (op3=0x17);
- 00337    
- 00338    
- 00339     /*
- 00340     *
- 00341     * Clear
- 00342     *
- 00343     */
- 00344     /* CLR A */
- 00345     clr_a.set_asm ("clr A" );
- 00346     clr_a.set_decoder (op=0xE4);
- 00347    
- 00348     /* CLR C */
- 00349     clr_c.set_asm ("clr C" );
- 00350     clr_c.set_decoder (op=0xC3);
- 00351    
- 00352     /* CLR bit */
- 00353     clr_bit.set_asm ("clr %sfr" , byte2);
- 00354     clr_bit.set_asm ("clr %imm" , byte2);
- 00355     clr_bit.set_decoder (op=0xC2);
- 00356    
- 00357    
- 00358     /*
- 00359     *
- 00360     * Complement
- 00361     *
- 00362     */
- 00363     /* CPL A */
- 00364     cpl_a.set_asm ("cpl A" );
- 00365     cpl_a.set_decoder (op=0xF4);
- 00366    
- 00367     /* CPL C */
- 00368     cpl_c.set_asm ("cpl C" );
- 00369     cpl_c.set_decoder (op=0xB3);
- 00370    
- 00371     /* CPL bit */
- 00372     cpl_bit.set_asm ("cpl %sfr" , byte2);
- 00373     cpl_bit.set_asm ("cpl %imm" , byte2);
- 00374     cpl_bit.set_decoder (op=0xB2);
- 00375    
- 00376    
- 00377     /* DA A */
- 00378     da.set_asm ("da A" );
- 00379     da.set_decoder (op=0xD4);
- 00380    
- 00381    
- 00382     /*
- 00383     *
- 00384     * DEC
- 00385     *
- 00386     */
- 00387     /* DEC A */
- 00388     dec_a.set_asm ("dec A" );
- 00389     dec_a.set_decoder (op=0x14);
- 00390    
- 00391     /* DEC Rn */
- 00392     dec_r.set_asm ("dec %reg" , reg);
- 00393     dec_r.set_decoder (op1=0x03);
- 00394    
- 00395     /* DEC direct */
- 00396     dec_iram.set_asm ("dec %sfr" , byte2);
- 00397     dec_iram.set_asm ("dec %exp" , byte2);
- 00398     dec_iram.set_decoder (op=0x15);
- 00399    
- 00400     /* DEC @R0 */
- 00401     dec_arr_R0.set_asm ("dec @R0" );
- 00402     dec_arr_R0.set_decoder (op=0x16);
- 00403    
- 00404     /* DEC @R1 */
- 00405     dec_arr_R1.set_asm ("dec @R1" );
- 00406     dec_arr_R1.set_decoder (op=0x17);
- 00407    
- 00408    
- 00409     /* DIV AB */
- 00410     div.set_asm ("div AB" );
- 00411     div.set_decoder (op=0x84);
- 00412    
- 00413    
- 00414     /*
- 00415     *
- 00416     * DJNZ ,
- 00417     *
- 00418     */
- 00419     /* DJNZ Rn, rel */
- 00420     djnz_r.set_asm ("djnz %reg,%addr(pcrel,2)" , reg2, addr);
- 00421     djnz_r.set_decoder (op3=0x1B);
- 00422    
- 00423     /* DJNZ direct, rel */
- 00424     djnz_iram_reladd.set_asm ("djnz %sfr,%addr(pcrel,3)" , byte2, byte3);
- 00425     djnz_iram_reladd.set_asm ("djnz %exp,%addr(pcrel,3)" , byte2, byte3);
- 00426     djnz_iram_reladd.set_decoder (op=0xD5);
- 00427    
- 00428    
- 00429     /*
- 00430     *
- 00431     * INC
- 00432     *
- 00433     */
- 00434     /* INC A */
- 00435     inc_a.set_asm ("inc A" );
- 00436     inc_a.set_decoder (op=0x04);
- 00437    
- 00438     /* INC DPTR */ /*Note: do not change the order of this instruction in source file */
- 00439     inc_dptr.set_asm ("inc DPTR" );
- 00440     inc_dptr.set_decoder (op=0xA3);
- 00441    
- 00442     /* INC Rn */
- 00443     inc_r.set_asm ("inc %reg" , reg);
- 00444     inc_r.set_decoder (op1=0x01);
- 00445    
- 00446     /* INC direct */
- 00447     inc_iram.set_asm ("inc %sfr" , byte2);
- 00448     inc_iram.set_asm ("inc %exp" , byte2);
- 00449     inc_iram.set_decoder (op=0x05);
- 00450    
- 00451     /* INC @R0 */
- 00452     inc_arr_R0.set_asm ("inc @R0" );
- 00453     inc_arr_R0.set_decoder (op=0x06);
- 00454    
- 00455     /* INC @R1 */
- 00456     inc_arr_R1.set_asm ("inc @R1" );
- 00457     inc_arr_R1.set_decoder (op=0x07);
- 00458    
- 00459    
- 00460     /*
- 00461     *
- 00462     * Conditional jumps
- 00463     *
- 00464     */
- 00465     /* JB bit, rel */
- 00466     jb.set_asm ("jb %sfr,%addr(pcrel,3)" , byte2, byte3);
- 00467     jb.set_asm ("jb %imm,%addr(pcrel,3)" , byte2, byte3);
- 00468     jb.set_decoder (op=0x20);
- 00469    
- 00470     /* JBC bit, rel */
- 00471     jbc.set_asm ("jbc %sfr,%addr(pcrel,3)" , byte2, byte3);
- 00472     jbc.set_asm ("jbc %imm,%addr(pcrel,3)" , byte2, byte3);
- 00473     jbc.set_decoder (op=0x10);
- 00474    
- 00475     /* JC rel */
- 00476     jc.set_asm ("jc %addr(pcrel,2)" , byte2);
- 00477     jc.set_decoder (op=0x40);
- 00478    
- 00479     /* JMP @A+DPTR*/
- 00480     jmp.set_asm ("jmp @A+DPTR" );
- 00481     jmp.set_decoder (op=0x73);
- 00482    
- 00483     /* JNB bit, rel */
- 00484     jnb.set_asm ("jnb %sfr,%addr(pcrel,3)" , byte2, byte3);
- 00485     jnb.set_asm ("jnb %imm,%addr(pcrel,3)" , byte2, byte3);
- 00486     jnb.set_decoder (op=0x30);
- 00487    
- 00488     /* JNC rel */
- 00489     jnc.set_asm ("jnc %addr(pcrel,2)" , byte2);
- 00490     jnc.set_decoder (op=0x50);
- 00491    
- 00492     /* JNZ rel */
- 00493     jnz.set_asm ("jnz %addr(pcrel,2)" , byte2);
- 00494     jnz.set_decoder (op=0x70);
- 00495    
- 00496     /* JZ rel */
- 00497     jz.set_asm ("jz %addr(pcrel,2)" , byte2);
- 00498     jz.set_decoder (op=0x60);
- 00499    
- 00500    
- 00501     /* LCALL addr16 */
- 00502     lcall.set_asm ("lcall %addr" , byte2+byte3);
- 00503     lcall.set_decoder (op=0x12);
- 00504    
- 00505     /* LJMP addr16 */
- 00506     ljmp.set_asm ("ljmp %addr" , byte2+byte3);
- 00507     ljmp.set_decoder (op=0x02);
- 00508    
- 00509     /*
- 00510     *
- 00511     * MOV
- 00512     *
- 00513     */
- 00514    
- 00515     /* MOV DPTR, #data16 */
- 00516     /* Note: mov dptr,#data16 -MUST- come before any other MOVs
- 00517     if you do not want the assembler to generate mistaken code */
- 00518     mov_dptr_data.set_asm ("mov DPTR,#%exp" , byte2+byte3);
- 00519     mov_dptr_data.set_decoder (op=0x90);
- 00520    
- 00521     /* MOV C, bit */
- 00522     mov_c_bit.set_asm ("mov C,%sfr" , byte2);
- 00523     mov_c_bit.set_asm ("mov C,%imm" , byte2);
- 00524     mov_c_bit.set_decoder (op=0xA2);
- 00525    
- 00526     /* MOV bit, C */
- 00527     mov_bit_c.set_asm ("mov %sfr,C" , byte2);
- 00528     mov_bit_c.set_asm ("mov %imm,C" , byte2);
- 00529     mov_bit_c.set_decoder (op=0x92);
- 00530    
- 00531     /* MOV A, Rn */
- 00532     mov_ar.set_asm ("mov A,%reg" , reg);
- 00533     mov_ar.set_decoder (op1=0x1D);
- 00534    
- 00535     /* MOV A, direct */
- 00536     mov_a_iram.set_asm ("mov A,%sfr" , byte2);
- 00537     mov_a_iram.set_asm ("mov A,%exp" , byte2);
- 00538     mov_a_iram.set_decoder (op=0xE5);
- 00539    
- 00540     /* MOV A, @R0 */
- 00541     mov_a_arr_R0.set_asm ("mov A,@R0" );
- 00542     mov_a_arr_R0.set_decoder (op=0xE6);
- 00543    
- 00544     /* MOV A, @R1 */
- 00545     mov_a_arr_R1.set_asm ("mov A,@R1" );
- 00546     mov_a_arr_R1.set_decoder (op=0xE7);
- 00547    
- 00548     /* MOV A, #data */
- 00549     mov_a_data.set_asm ("mov A,#%imm" , byte2);
- 00550     mov_a_data.set_decoder (op=0x74);
- 00551    
- 00552     /* MOV Rn, A */
- 00553     mov_ra.set_asm ("mov %reg,A" , reg);
- 00554     mov_ra.set_decoder (op1=0x1F);
- 00555    
- 00556     /* MOV direct, A */
- 00557     mov_iram_a.set_asm ("mov %sfr,A" , byte2);
- 00558     mov_iram_a.set_asm ("mov %exp,A" , byte2);
- 00559     mov_iram_a.set_decoder (op=0xF5);
- 00560    
- 00561     /* MOV direct, @R0 */
- 00562     mov_iram_arr_R0.set_asm ("mov %sfr,@R0" , byte2);
- 00563     mov_iram_arr_R0.set_asm ("mov %exp,@R0" , byte2);
- 00564     mov_iram_arr_R0.set_decoder (op=0x86);
- 00565    
- 00566     /* MOV direct, @R1 */
- 00567     mov_iram_arr_R1.set_asm ("mov %sfr,@R1" , byte2);
- 00568     mov_iram_arr_R1.set_asm ("mov %exp,@R1" , byte2);
- 00569     mov_iram_arr_R1.set_decoder (op=0x87);
- 00570    
- 00571     /* MOV @R0, A */
- 00572     mov_arr_R0_a.set_asm ("mov @R0,A" );
- 00573     mov_arr_R0_a.set_decoder (op=0xF6);
- 00574    
- 00575     /* MOV @R1, A */
- 00576     mov_arr_R1_a.set_asm ("mov @R1,A" );
- 00577     mov_arr_R1_a.set_decoder (op=0xF7);
- 00578    
- 00579     /* MOV @R0, direct */
- 00580     mov_arr_R0_iram.set_asm ("mov @R0,%sfr" , byte2);
- 00581     mov_arr_R0_iram.set_asm ("mov @R0,%exp" , byte2);
- 00582     mov_arr_R0_iram.set_decoder (op=0xA6);
- 00583    
- 00584     /* MOV @R1, direct */
- 00585     mov_arr_R1_iram.set_asm ("mov @R1,%sfr" , byte2);
- 00586     mov_arr_R1_iram.set_asm ("mov @R1,%exp" , byte2);
- 00587     mov_arr_R1_iram.set_decoder (op=0xA7);
- 00588    
- 00589     /* MOV @R0, #data */
- 00590     mov_arr_R0_data.set_asm ("mov @R0,#%imm" , byte2);
- 00591     mov_arr_R0_data.set_decoder (op=0x76);
- 00592    
- 00593     /* MOV @R1, #data */
- 00594     mov_arr_R1_data.set_asm ("mov @R1,#%imm" , byte2);
- 00595     mov_arr_R1_data.set_decoder (op=0x77);
- 00596    
- 00597     /* MOV Rn, direct */
- 00598     mov_r_iram.set_asm ("mov %reg,%sfr" , reg2, addr);
- 00599     mov_r_iram.set_asm ("mov %reg,%exp" , reg2, addr);
- 00600     mov_r_iram.set_decoder (op3=0x15);
- 00601    
- 00602     /* MOV Rn, #data */
- 00603     mov_r_data.set_asm ("mov %reg,#%exp" , reg2, addr);
- 00604     mov_r_data.set_decoder (op3=0x0F);
- 00605    
- 00606     /* MOV direct, Rn */
- 00607     mov_iram_r.set_asm ("mov %sfr,%reg" , addr, reg2);
- 00608     mov_iram_r.set_asm ("mov %exp,%reg" , addr, reg2);
- 00609     mov_iram_r.set_decoder (op3=0x11);
- 00610    
- 00611     /* MOV direct, #data */
- 00612     mov_iram_data.set_asm ("mov %sfr,#hi(%exp(high))" , byte2, byte3);
- 00613     mov_iram_data.set_asm ("mov %sfr,#%exp" , byte2, byte3);
- 00614     mov_iram_data.set_asm ("mov %exp,#%imm" , byte2, byte3);
- 00615     mov_iram_data.set_decoder (op=0x75);
- 00616    
- 00617     /* MOV direct, direct */
- 00618     mov_iram_iram.set_asm ("mov %sfr,%sfr" , byte3, byte2);
- 00619     mov_iram_iram.set_asm ("mov %sfr,%exp" , byte3, byte2);
- 00620     mov_iram_iram.set_asm ("mov %exp,%sfr" , byte3, byte2);
- 00621     mov_iram_iram.set_asm ("mov %exp,%exp" , byte3, byte2);
- 00622     mov_iram_iram.set_decoder (op=0x85);
- 00623    
- 00624    
- 00625    
- 00626     /*
- 00627     *
- 00628     * MOVC A,@A+
- 00629     *
- 00630     */
- 00631     /* MOVC A, @A+DPTR */
- 00632     movc_dptr.set_asm ("movc A,@A+DPTR" );
- 00633     movc_dptr.set_decoder (op=0x93);
- 00634    
- 00635     /* MOVC A, @A+PC */
- 00636     movc_pc.set_asm ("movc A,@A+PC" );
- 00637     movc_pc.set_decoder (op=0x83);
- 00638    
- 00639    
- 00640     /*
- 00641     *
- 00642     * MOVX ,
- 00643     *
- 00644     */
- 00645     /* MOVX A, @R0 */
- 00646     movx_a_R0.set_asm ("movx A,@R0" );
- 00647     movx_a_R0.set_decoder (op=0xE2);
- 00648    
- 00649     /* MOVX A, @R1 */
- 00650     movx_a_R1.set_asm ("movx A,@R1" );
- 00651     movx_a_R1.set_decoder (op=0xE3);
- 00652    
- 00653     /* MOVX A, @DPTR */
- 00654     movx_a_dptr.set_asm ("movx A,@DPTR" );
- 00655     movx_a_dptr.set_decoder (op=0xE0);
- 00656    
- 00657     /* MOVX @R0, A */
- 00658     movx_r0_a.set_asm ("movx @R0,A" );
- 00659     movx_r0_a.set_decoder (op=0xF2);
- 00660    
- 00661     /* MOVX @R1, A */
- 00662     movx_r1_a.set_asm ("movx @R1,A" );
- 00663     movx_r1_a.set_decoder (op=0xF3);
- 00664    
- 00665     /* MOVX @DPTR, A */
- 00666     movx_dptr_a.set_asm ("movx @DPTR,A" );
- 00667     movx_dptr_a.set_decoder (op=0xF0);
- 00668    
- 00669    
- 00670     /* MUL AB */
- 00671     mul.set_asm ("mul AB" );
- 00672     mul.set_decoder (op=0xA4);
- 00673    
- 00674    
- 00675     /* NOP */
- 00676     nop.set_asm ("nop" );
- 00677     nop.set_decoder (op=0x00);
- 00678    
- 00679    
- 00680     /*
- 00681     *
- 00682     * ORL ,
- 00683     *
- 00684     */
- 00685     /* ORL C, bit */
- 00686     orl_c_bit.set_asm ("orl C,%sfr" , byte2);
- 00687     orl_c_bit.set_asm ("orl C,%imm" , byte2);
- 00688     orl_c_bit.set_decoder (op=0x72);
- 00689    
- 00690     /* ORL C, /bit */
- 00691     orl_c_nbit.set_asm ("orl C,/%sfr" , byte2);
- 00692     orl_c_nbit.set_asm ("orl C,/%imm" , byte2);
- 00693     orl_c_nbit.set_decoder (op=0xA0);
- 00694    
- 00695     /* ORL A, Rn */
- 00696     orl_ar.set_asm ("orl A,%reg" , reg);
- 00697     orl_ar.set_decoder (op1=0x09);
- 00698    
- 00699     /* ORL A, direct */
- 00700     orl_a_iram.set_asm ("orl A,%sfr" , byte2);
- 00701     orl_a_iram.set_asm ("orl A,%exp" , byte2);
- 00702     orl_a_iram.set_decoder (op=0x45);
- 00703    
- 00704     /* ORL A, @R0 */
- 00705     orl_arr_R0.set_asm ("orl A,@R0" );
- 00706     orl_arr_R0.set_decoder (op=0x46);
- 00707    
- 00708     /* ORL A, @R1 */
- 00709     orl_arr_R1.set_asm ("orl A,@R1" );
- 00710     orl_arr_R1.set_decoder (op=0x47);
- 00711    
- 00712     /* ORL A, #data */
- 00713     orl_a_data.set_asm ("orl A,#%imm" , byte2);
- 00714     orl_a_data.set_decoder (op=0x44);
- 00715    
- 00716     /* ORL direct, A */
- 00717     orl_iram_a.set_asm ("orl %sfr,A" , byte2);
- 00718     orl_iram_a.set_asm ("orl %exp,A" , byte2);
- 00719     orl_iram_a.set_decoder (op=0x42);
- 00720    
- 00721     /* ORL direct, #data */
- 00722     orl_iram_data.set_asm ("orl %sfr,#%imm" , byte2, byte3);
- 00723     orl_iram_data.set_asm ("orl %exp,#%imm" , byte2, byte3);
- 00724     orl_iram_data.set_decoder (op=0x43);
- 00725    
- 00726    
- 00727    
- 00728     /* POP direct */
- 00729     pop.set_asm ("pop %sfr" , byte2);
- 00730     pop.set_asm ("pop %exp" , byte2);
- 00731     pop.set_decoder (op=0xD0);
- 00732    
- 00733     /* PUSH direct */
- 00734     push.set_asm ("push %sfr" , byte2);
- 00735     push.set_asm ("push %exp" , byte2);
- 00736     push.set_decoder (op=0xC0);
- 00737    
- 00738    
- 00739     /* RET */
- 00740     ret.set_asm ("ret" );
- 00741     ret.set_decoder (op=0x22);
- 00742    
- 00743     /* RETI */
- 00744     reti.set_asm ("reti" );
- 00745     reti.set_decoder (op=0x32);
- 00746    
- 00747    
- 00748     /*
- 00749     *
- 00750     * Rotate accumulator
- 00751     *
- 00752     */
- 00753     /* RL A */
- 00754     rl_a.set_asm ("rl A" );
- 00755     rl_a.set_decoder (op=0x23);
- 00756    
- 00757     /* RLC A */
- 00758     rlc_a.set_asm ("rlc A" );
- 00759     rlc_a.set_decoder (op=0x33);
- 00760    
- 00761     /* RR A */
- 00762     rr_a.set_asm ("rr A" );
- 00763     rr_a.set_decoder (op=0x03);
- 00764    
- 00765     /* RRC A */
- 00766     rrc_a.set_asm ("rrc A" );
- 00767     rrc_a.set_decoder (op=0x13);
- 00768    
- 00769    
- 00770     /* SETB C */
- 00771     setb_c.set_asm ("setb C" );
- 00772     setb_c.set_decoder (op=0xD3);
- 00773    
- 00774     /* SETB bit */
- 00775     setb_bit.set_asm ("setb %sfr" , byte2);
- 00776     setb_bit.set_asm ("setb %imm" , byte2);
- 00777     setb_bit.set_decoder (op=0xD2);
- 00778    
- 00779    
- 00780     /* SJMP rel */
- 00781     sjmp.set_asm ("sjmp %addr(pcrel,2)" , byte2);
- 00782     sjmp.set_decoder (op=0x80);
- 00783    
- 00784    
- 00785     /*
- 00786     *
- 00787     * SUBB A,
- 00788     *
- 00789     */
- 00790     /* SUBB A, Rn */
- 00791     subb_ar.set_asm ("subb A,%reg" , reg);
- 00792     subb_ar.set_decoder (op1=0x13);
- 00793    
- 00794     /* SUBB A, direct */
- 00795     subb_a_iram.set_asm ("subb A,%sfr" , byte2);
- 00796     subb_a_iram.set_asm ("subb A,%exp" , byte2);
- 00797     subb_a_iram.set_decoder (op=0x95);
- 00798    
- 00799     /* SUBB A, @R0 */
- 00800     subb_a_arr_R0.set_asm ("subb A,@R0" );
- 00801     subb_a_arr_R0.set_decoder (op=0x96);
- 00802    
- 00803     /* SUBB A, @R1 */
- 00804     subb_a_arr_R1.set_asm ("subb A,@R1" );
- 00805     subb_a_arr_R1.set_decoder (op=0x97);
- 00806    
- 00807     /* SUBB A, #data */
- 00808     subb_a_data.set_asm ("subb A,#%imm" , byte2);
- 00809     subb_a_data.set_decoder (op=0x94);
- 00810    
- 00811    
- 00812     /* SWAP A */
- 00813     swap.set_asm ("swap A" );
- 00814     swap.set_decoder (op=0xC4);
- 00815    
- 00816    
- 00817     /*
- 00818     *
- 00819     * XCH A,
- 00820     *
- 00821     */
- 00822     /* XCH A, Rn */
- 00823     xch_ar.set_asm ("xch A,%reg" , reg);
- 00824     xch_ar.set_decoder (op1=0x19);
- 00825    
- 00826     /* XCH A, direct */
- 00827     xch_a_iram.set_asm ("xch A,%sfr" , byte2);
- 00828     xch_a_iram.set_asm ("xch A,%exp" , byte2);
- 00829     xch_a_iram.set_decoder (op=0xC5);
- 00830    
- 00831     /* XCH A, @R0 */
- 00832     xch_arr_R0.set_asm ("xch A,@R0" );
- 00833     xch_arr_R0.set_decoder (op=0xC6);
- 00834    
- 00835     /* XCH A, @R1 */
- 00836     xch_arr_R1.set_asm ("xch A,@R1" );
- 00837     xch_arr_R1.set_decoder (op=0xC7);
- 00838    
- 00839    
- 00840     /* XCHD A, @R0 */
- 00841     xchd_R0.set_asm ("xchd A, @R0" );
- 00842     xchd_R0.set_decoder (op=0xD6);
- 00843    
- 00844     /* XCHD A, @R1 */
- 00845     xchd_R1.set_asm ("xchd A, @R1" );
- 00846     xchd_R1.set_decoder (op=0xD7);
- 00847    
- 00848    
- 00849     /*
- 00850     *
- 00851     * XRL ,
- 00852     *
- 00853     */
- 00854     /* XRL A, Rn */
- 00855     xrl_ar.set_asm ("xrl A,%reg" , reg);
- 00856     xrl_ar.set_decoder (op1=0x0D);
- 00857    
- 00858     /* XRL A, direct */
- 00859     xrl_a_iram.set_asm ("xrl A,%sfr" , byte2);
- 00860     xrl_a_iram.set_asm ("xrl A,%exp" , byte2);
- 00861     xrl_a_iram.set_decoder (op=0x65);
- 00862    
- 00863     /* XRL A, @R0 */
- 00864     xrl_arr_R0.set_asm ("xrl A,@R0" );
- 00865     xrl_arr_R0.set_decoder (op=0x66);
- 00866    
- 00867     /* XRL A, @R1 */
- 00868     xrl_arr_R1.set_asm ("xrl A,@R1" );
- 00869     xrl_arr_R1.set_decoder (op=0x67);
- 00870    
- 00871     /* XRL A, #data */
- 00872     xrl_a_data.set_asm ("xrl A,#%imm" , byte2);
- 00873     xrl_a_data.set_decoder (op=0x64);
- 00874    
- 00875     /* XRL direct, A */
- 00876     xrl_iram_a.set_asm ("xrl %sfr,A" , byte2);
- 00877     xrl_iram_a.set_asm ("xrl %exp,A" , byte2);
- 00878     xrl_iram_a.set_decoder (op=0x62);
- 00879    
- 00880     /* XRL direct, #data */
- 00881     xrl_iram_data.set_asm ("xrl %sfr,#%imm" , byte2, byte3);
- 00882     xrl_iram_data.set_asm ("xrl %exp,#%imm" , byte2, byte3);
- 00883     xrl_iram_data.set_decoder (op=0x63);
- 00884    
- 00885     };
- 00886    
- 00887     };