Login

Subversion Repositories NedoOS

Rev

Rev 8 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

//// ьр°шээючртшёшь√х тхЄъш

      case _TOKCOMMA: {/**_oldreg = _reg;*//**эх ЄЁюурхь value! хую ёфтшэхЄ Єюы№ъю фЁєуюх value!*/ goto loop;}
      case _TOKOPENBRACE:
      case _TOKCLOSEBRACE:

        {goto loop;}

      case _ASMNOP: {_base=0xbf; _base2=0x00; goto loop;}
//х∙╕ эр 0xbf уЁєяяр IT...

//      case _ASMADR: //???

      case _ASMADCS:{_base=0x41; _base2=0x40; goto loop;}
      case _ASMADDS:{_base=0x18; _base2=0x00; _baseN=0x30; goto loop;} //baseN adds r0,#N
//      case _ASMADD: {_basepc=0xa0; _basesp=0xa8; _baseisp=0xb0; goto loop;} //basepc add r0,pc,#N*4 TODO //basesp add r0,sp,#N*4 TODO //baseisp add sp,SN7*4 (S - юЄфхы№э√щ чэръ схч фюяюыэхэш  фю 2) TODO
//cbz r0,#N*2 %1011 00N1 NNNN Nrrr
//cbnz r0,#N*2 %1011 10N1 NNNN Nrrr
      case _ASMSBCS:{_base=0x41; _base2=0x80; goto loop;}
      case _ASMSUBS:{_base=0x1a; _base2=0x00; _baseN=0x38; goto loop;} //baseN subs r0,#N
      case _ASMRSBS:{_base=0x42; _base2=0x40; goto loop;}
      case _ASMCMN: {_base=0x42; _base2=0xc0; goto loop;}
      case _ASMCMP: {_base=0x42; _base2=0x80; _baseN=0x28; goto loop;} //baseN cmp r0,#N
      case _ASMTST: {_base=0x42; _base2=0x00; goto loop;}
//      case _ASMNEG:
      case _ASMMULS:{_base=0x43; _base2=0x40; goto loop;}
      case _ASMBICS:{_base=0x43; _base2=0x80; goto loop;}

      case _ASMANDS:{_base=0x40; _base2=0x00; goto loop;}
      case _ASMORRS:{_base=0x43; _base2=0x00; goto loop;}
      case _ASMEORS:{_base=0x40; _base2=0x40; goto loop;}

      case _ASMASRS:{_base=0x41; _base2=0x00; _baseN=0x10; goto loop;}
      case _ASMLSLS:{_base=0x40; _base2=0x80; _baseN=0x00; goto loop;} //baseN lsls r0,r1,#N
      case _ASMLSRS:{_base=0x40; _base2=0xc0; _baseN=0x08; goto loop;}
      case _ASMRORS:{_base=0x41; _base2=0xc0; goto loop;}

      case _ASMB:   {_base=0xe0; goto loop;} //%1110 0Snn nnnn nnnn (S ё фюяюыэхэшхь фю 2)
//e8 эх шёяюы№чєхЄё 
//e9 эх шёяюы№чєхЄё 
//ea эх шёяюы№чєхЄё 
//eb эх шёяюы№чєхЄё 
//ec эх шёяюы№чєхЄё 
//ed эх шёяюы№чєхЄё 
//ee эх шёяюы№чєхЄё 
//ef эх шёяюы№чєхЄё 
      case _ASMBEQ: {_base=0xd0; goto loop;}
      case _ASMBNE: {_base=0xd1; goto loop;}
      case _ASMBCS: {_base=0xd2; goto loop;} //HS
      case _ASMBCC: {_base=0xd3; goto loop;} //LO
      case _ASMBMI: {_base=0xd4; goto loop;}
      case _ASMBPL: {_base=0xd5; goto loop;}
      case _ASMBVS: {_base=0xd6; goto loop;}
      case _ASMBVC: {_base=0xd7; goto loop;}
      case _ASMBHI: {_base=0xd8; goto loop;}
      case _ASMBLS: {_base=0xd9; goto loop;}
      case _ASMBGE: {_base=0xda; goto loop;}
      case _ASMBLT: {_base=0xdb; goto loop;}
      case _ASMBGT: {_base=0xdc; goto loop;}
      case _ASMBLE: {_base=0xdd; goto loop;}
//de эх шёяюы№чєхЄё 
//      case _ASMBAL:
      case _ASMBL:  {_base=0xf0; goto loop;} //xx f0+ xx f8+ //фышээ√щ яхЁхїюф (-400000..+400000)
//%1111 0sHH HHHH HHHH
//%1111 1LLL LLLL LLLL
//HL фюьэюцрхЄё  фю 2 ш яЁшсрты хЄё  ъ PC яюёых ъюэЎр ъюьрэф√, Є.х. PC+4 (схч юъЁєуыхэш  фю 4)
      case _ASMBLX: {_base=0x47; _base2=0x80; goto loop;}
      case _ASMBX:  {_base=0x47; _base2=0x00; goto loop;}

      case _ASMBKPT:{_base=0xbe; goto loop;}

//      case _ASMDMB: //???
//      case _ASMDSB: //???
//      case _ASMISB: //???
//      case _ASMCPSID: //эхЄ т Phyton
//      case _ASMCPSIE: //юяхЁрэф√?
//      case _ASMSEV:
      case _ASMSVC: {_base=0xdf; goto loop;} //svc #N
//      case _ASMYIELD:

      case _ASMLDR: {_base=0x68; _base2=0x00; _baseN=0x48; /**_base3=0x50; _basesp=0x98;*/ goto loop;} //baseN ldr r0,[pc,#n] //base3 ldr r0,[r1,r2] TODO //basesp ldr r0,[sp,#N*4] TODO
      case _ASMLDRB:{_base=0x78; _base2=0x00; goto loop;}
      case _ASMLDRH:{_base=0x88; _base2=0x00; goto loop;}
//      case _ASMLDRSB:
//      case _ASMLDRSH:
//      case _ASMLDM: //???
//      case _ASMLDMFD: //???
      case _ASMLDMIA:{_base=0xcf; goto loop;} //ldmia r0!,{reglist}
      case _ASMSTR: {_base=0x60; _base2=0x00; /**_base3=0x50; _basesp=0x90;*/ goto loop;} //base3 str r0,[r1,r2] TODO //basesp str r0,[sp,#N*4] TODO
      case _ASMSTRB:{_base=0x70; _base2=0x00; goto loop;}
      case _ASMSTRH:{_base=0x80; _base2=0x00; goto loop;}
//      case _ASMSTM: //???
//      case _ASMSTMEA: //???
      case _ASMSTMIA:{_base=0xc7; goto loop;} //stmia r0!,{reglist}

      case _ASMMOV: {_base=0x46; goto loop;}
      case _ASMMOVS:{_base=0x00; _base2=0x00; _baseN=0x20; goto loop;} //baseN movs r0,#n
      case _ASMMVNS:{_base=0x43; _base2=0xc0; goto loop;}
//      case _ASMMRS:
//      case _ASMMSR:
//      case _ASMCPY: //???

      case _ASMPOP: {_base=0xbc; _reglist=0; goto loop;}
//т POP ьюцэю єърчрЄ№ ёяшёюъ ЁхушёЄЁют (Єюы№ъю R0..R7 ш PC):
//POP {R0,R2,R7,PC}
//%1011 110P 7654 3210
      case _ASMPUSH:{_base=0xb4; _reglist=0; goto loop;}
//т PUSH ьюцэю єърчрЄ№ ёяшёюъ ЁхушёЄЁют (Єюы№ъю R0..R7 ш LR):
//PUSH {R0,R2,R7,LR}
//%1011 010L 7654 3210

      case _ASMREV:  {_base=0xba; _base2=0x00; goto loop;}
      case _ASMREV16:{_base=0xba; _base2=0x40; goto loop;}
      case _ASMREVSH:{_base=0xba; _base2=0xc0; goto loop;}
//80 ba эх шёяюы№чєхЄё 
      case _ASMSXTH: {_base=0xb2; _base2=0x00; goto loop;}
      case _ASMSXTB: {_base=0xb2; _base2=0x40; goto loop;}
      case _ASMUXTH: {_base=0xb2; _base2=0x80; goto loop;}
      case _ASMUXTB: {_base=0xb2; _base2=0xc0; goto loop;}

        {goto loop;}
//b6 эх шёяюы№чєхЄё 

   //ЇюЁьрЄ√:
//comma==keepreg: ёЄртшЄё  яхЁхф тЄюЁ√ь ЁхушёЄЁюь/rp т ъюьрэфх (ьюцэю ё¤ъюэюьшЄ№, хёыш reg їЁрэшЄё  т юфэюь ьхёЄх, р rp т фЁєуюь, эю фы  add rp,rp эрфю фтр rp)

      case _FMTXX:        {asmbyte(_base2); asmbyte(_base); goto loop;}
      case _FMTR:         {asmbyte(_base2+(_reg<<0x03)); asmbyte(_base); goto loop;} //bx r
      case _FMTR0N:       {IF (_reg>=0x08) errwrongreg(); asmbytepopvalue(); asmbyte(_baseN+_reg); goto loop;} //adds r0,#N (baseN!!!)
      case _FMTR0R0:      {err_onlylowregs(); asmbyte(_base2+(_reg<<0x03)+_oldreg); asmbyte(_base); goto loop;} //alucmd r0,r1
      case _FMTR0R0SAME:  {err_onlylowregs(); asmbyte((_reg<<0x06)+(_oldreg<<0x03)+_oldreg); asmbyte(_base+(_reg>>0x02)); goto loop;} //adds r0,r1 = adds r0,r0,r1
      case _FMTR8R8:      {err_onlylowregs_forbidden(); asmbyte(((_oldreg&0x08)<<0x04)+(_reg<<0x03)+(_oldreg&0x07)); asmbyte(_base); goto loop;} //mov
      case _FMTR0R0NX4:   {err_onlylowregs(); i = asmpopvalue()>>2; asmbyte((BYTE)(i<<6)+(_reg<<0x03)+_oldreg); asmbyte(_base + (BYTE)(i>>2)); goto loop;}
      case _FMTR0R0R0:    {IF ((_reg>=0x08) || (_oldreg>=0x08) || (_veryoldreg>=0x08)) errwrongreg(); asmbyte((_veryoldreg<<0x06)+(_reg<<0x03)+_oldreg); asmbyte(_base+(_veryoldreg>>0x02)); goto loop;}
      case _FMTR0R0N7:    {err_onlylowregs(); i = asmpopvalue(); asmbyte((BYTE)(i<<6)+(_reg<<0x03)+_oldreg); asmbyte(_base + (BYTE)(i>>2)); goto loop;} //alu
      case _FMTR0R0N31:   {err_onlylowregs(); i = asmpopvalue(); asmbyte((BYTE)(i<<6)+(_reg<<0x03)+_oldreg); asmbyte(_baseN + (BYTE)(i>>2)); goto loop;} //shifts
      case _FMTR0R0ZERO:  {err_onlylowregs(); i = asmpopvalue(); asmbyte(_base2+(_reg<<0x03)+_oldreg); asmbyte(_base); goto loop;} //rsbs r0,r1,#0
      case _FMTRADDR:     {IF (_reg>=0x08) errwrongreg(); asmdispconst((UINT)asmpopvalue()-(((_curaddr+_curshift-_BIAS/**bias (thumb)*/)+4)&0xfffffffc)); asmbyte(_baseN+_reg); goto loop;}
      case _FMTBSHORTADDR:{asmdispbshort((INT)((UINT)asmpopvalue()-((_curaddr+_curshift-_BIAS/**bias (thumb)*/)+4))); goto loop;}
      case _FMTBADDR:     {asmdispb((INT)((UINT)asmpopvalue()-((_curaddr+_curshift-_BIAS/**bias (thumb)*/)+4))); goto loop;}
      case _FMTBLONGADDR: {asmdispbl((INT)(asmpopvalue()-(LONG)((_curaddr+_curshift-_BIAS/**bias (thumb)*/)+4))); goto loop;}
      case _FMTPUSHPOP:   {
        IF ((_reglist&0x3f00)!=0) errwrongreg();
        asmbyte((BYTE)_reglist);
        IF (_reglist>=0x4000) {
          IF ( ((_reglist&0x8000)!=0) && (_base==0xb4) ) errwrongreg(); //no push {pc}
          IF ( ((_reglist&0x4000)!=0) && (_base==0xbc) ) errwrongreg(); //no pop {lr}
          asmbyte(_base+0x01);
        }ELSE asmbyte(_base);
      }

      case _RG_R0:
      case _RG_R1:
      case _RG_R2:
      case _RG_R3:
      case _RG_R4:
      case _RG_R5:
      case _RG_R6:
      case _RG_R7:
      case _RG_R8:
      case _RG_R9:
      case _RG_R10:
      case _RG_R11:
      case _RG_R12:
      case _RG_SP:
      case _RG_LR:
      case _RG_PC:
//      case _RG_RPBYNAME:

        {
        _veryoldreg = _oldreg;
        _oldreg = _reg;
        _reg = _token-_RG_R0;
        _reglist = _reglist | (1<<(UINT)_reg);
        goto loop;
        }