//// imported
#include "../_sdk/emit.h"
#include "sizesz80.h"
//тхчфх, уфх эєцхэ ёЄЁюъют√щ ярЁрьхЄЁ, шёяюы№чєхЄё _joined
//(ъЁюьх call - Єрь _callee, ш ъЁюьх loadrg/b - Єрь _const)
//т ъюэЎх ы■сюую т√ўшёыхэш (put, call, jpiffalse) фхыры _jpflag = 0x00 (шэрўх яЁхф√фє∙хх "юяЄшьшчшЁютрээюх" ёЁртэхэшх ьюцхЄ шёяюЁЄшЄ№ эют√щ єёыютэ√щ яхЁхїюф)
//юёЄртшы Єюы№ъю т jpiffalse, Є.ъ. юёЄры№э√х эх ьюуєЄ с√Є№ "юяЄшьшчшЁютрээ√ьш"
EXPORT VAR PCHAR _callee; //эрчтрэшх т√ч√трхьющ яЁюЎхфєЁ√ (ё єў╕Єюь ьюфєы )
EXPORT VAR UINT _lencallee;
EXTERN PCHAR _joined; //ртЄюьхЄър
EXTERN UINT _lenjoined;
VAR UINT _oldlen;
EXTERN PCHAR _const; //ёЄрЁр ъюэёЄрэЄр
EXTERN UINT _lenconst;
EXPORT VAR BYTE _exprlvl; //уыєсшэр т√Ёрцхэш (тхЁїэшщ єЁютхэ№ == 1)
//тэх°эшх яЁюЎхфєЁ√ (шч rgs) - todo т codegen эх шёяюы№чютрЄ№ rgs
EXTERN BYTE _rnew;
EXTERN BYTE _rold;
EXTERN BYTE _rold2;
EXTERN BYTE _rold3;
//rg pool
PROC getnothing FORWARD(); //ёюїЁрэшЄ№ ЁхушёЄЁ√ ш срщЄ√ т ёЄхъх ш юётюсюфшЄ№
//PROC getmainrg FORWARD(); //тч Є№ RMAIN=new ш юётюсюфшЄ№ юёЄры№э√х ЁхушёЄЁ√
PROC getmain2rgs FORWARD(); //тч Є№ RMAIN=old, RMAIN2=new ш юётюсюфшЄ№ юёЄры№э√х ЁхушёЄЁ√ //фы call2rgs
//PROC getmain3rgs FORWARD(); //фы call3rgs
PROC getmain4rgs FORWARD(); //фы call4rgs
PROC setmainrg FORWARD(); //єёЄрэютшЄ№ яЁшчэръш, ъръ сєфЄю ь√ яюыєўшыш Ёхчєы№ЄрЄ т ЁхушёЄЁх //фы call2rgs
PROC setmain2rgs FORWARD(); //єёЄрэютшЄ№ яЁшчэръш, ъръ сєфЄю ь√ яюыєўшыш Ёхчєы№ЄрЄ т ЁхушёЄЁрї //фы call4rgs
PROC rgs_initrgs FORWARD();
////
#define _RGBUFSZ (BYTE)(_NRGS+0x01)
//яЁшюЁшЄхЄ√ ЁхушёЄЁют:
CONST BYTE _RMAIN = 0x01; /**HL*/ /**ЁхушёЄЁ Ёхчєы№ЄрЄр ш яхЁтюую ярЁрьхЄЁр ёЄрэфрЁЄэ√ї ЇєэъЎшщ*/
CONST BYTE _RMAIN2= 0x02; /**DE*/ /**ЁхушёЄЁ тЄюЁюую ёыютр Ёхчєы№ЄрЄр ш тЄюЁюую ярЁрьхЄЁр ёЄрэфрЁЄэ√ї ЇєэъЎшщ*/
CONST BYTE _RMAIN3= 0x03;
CONST BYTE _RMAIN4= 0x04;
CONST BYTE _RNAME[_RGBUFSZ] = {
0x00, //0 яєёЄющ
+_RG_HL,
+_RG_DE,
+_RG_BC,
+_RG_IX
};
CONST BYTE _RHIGH[_RGBUFSZ] = {
0x00, //0 яєёЄющ
+_RG_H,
+_RG_D,
+_RG_B,
+_RG_HX
};
CONST BYTE _RLOW[_RGBUFSZ] = {
0x00, //0 яєёЄющ
+_RG_L,
+_RG_E,
+_RG_C,
+_RG_LX
};
VAR BYTE _rproxy;
VAR BOOL _fused;
VAR BOOL _azused; //A ёюфхЁцшЄ яЁртшы№э√щ 0/эх0 яюёых ёЁртэхэш
VAR INT _funcstkdepth;
VAR BYTE _jpflag; //0=OR A:JZ, 1=JZ, 2=JNZ, 3=JNC, 4=JC
EXPORT CONST BYTE _typesz[32] = { //ЁрчьхЁ Єшяр т срщЄрї фы ЄрЁухЄр //чфхё№ эх шёяюы№чєхЄё
_SZ_BYTE/**T_BYTE */, //фы тёхї ЄрЁухЄют
_SZ_REG/**T_UINT */, //фы тёхї ЄрЁухЄют
_SZ_REG/**T_INT */, //фы тёхї ЄрЁухЄют
_SZ_BOOL/**T_BOOL */,
_SZ_LONG/**T_LONG */,
_SZ_BYTE/**T_CHAR */,
_SZ_LONG/**T_FLOAT*/,
0x00/**unknown*/,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
_SZ_REG/**T_PBYTE */,
_SZ_REG/**T_PUINT */,
_SZ_REG/**T_PINT */,
_SZ_REG/**T_PBOOL */,
_SZ_REG/**T_PLONG */,
_SZ_REG/**T_PCHAR */,
_SZ_REG/**T_PFLOAT*/,
_SZ_REG/** */,
_SZ_REG, _SZ_REG, _SZ_REG, _SZ_REG, _SZ_REG, _SZ_REG, _SZ_REG, _SZ_REG //pointer to...
};
CONST BYTE _typeshift[32] = { //log ЁрчьхЁ Єшяр (n фы 2^n срщЄ) фы ЄрЁухЄр //чфхё№ эх шёяюы№чєхЄё
_RL_BYTE/**T_BYTE */, //фы тёхї ЄрЁухЄют
_RL_REG/**T_UINT */, //фы тёхї ЄрЁухЄют
_RL_REG/**T_INT */, //фы тёхї ЄрЁухЄют
_RL_BOOL/**T_BOOL */,
_RL_LONG/**T_LONG */,
_RL_BYTE/**T_CHAR */,
_RL_LONG/**T_FLOAT*/,
0x00/**unknown*/,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
_RL_REG/**T_BYTE */,
_RL_REG/**T_UINT */,
_RL_REG/**T_INT */,
_RL_REG/**T_BOOL */,
_RL_REG/**T_LONG */,
_RL_REG/**T_CHAR */,
_RL_REG/**T_PFLOAT*/,
_RL_REG/** */,
_RL_REG, _RL_REG, _RL_REG, _RL_REG, _RL_REG, _RL_REG, _RL_REG, _RL_REG //pointer to...
};
PROC initrgs FORWARD(); //юўшёЄшЄ№ ёюёЄю эш ЁхушёЄЁют ш срщЄют (шёяюы№чєхЄё т cemitfunc)
EXPORT PROC asm_label()
{
asmc(+_CMDLABEL); //TODO юяЁхфхы Є№ яю яхЁтющ сєътх ъюьрэф√?
}
EXPORT PROC asm_equal()
{
asmc((BYTE)'='); asmc(+_TOKEXPR); //TODO схч _TOKEXPR? (єсЁрЄ№ т ёрьє юсЁрсюЄъє _CMDLABEL) (єёыюцэшЄ ¤ъёяюЁЄ)
}
EXPORT PROC endasm_label()
{
asmc(+_FMTCMD); endasm(); //Єрь Єюы№ъю яЁютхЁър яхЁхюяЁхфхы╕ээюёЄш, TODO єсЁрЄ№ т ёрьє юсЁрсюЄъє _CMDLABEL
}
EXPORT PROC endasm_reequ()
{
asmc(+_TOKENDEXPR); asmc(+_FMTREEQU); endasm(); //TODO єсЁрЄ№
}
EXPORT PROC var_label()
{
varc(+_CMDLABEL); //TODO юяЁхфхы Є№ яю яхЁтющ сєътх ъюьрэф√?
}
EXPORT PROC endvar_label()
{
varc(+_FMTCMD); endvar(); //Єрь Єюы№ъю яЁютхЁър яхЁхюяЁхфхы╕ээюёЄш, TODO єсЁрЄ№ т ёрьє юсЁрсюЄъє _CMDLABEL
}
EXPORT PROC varequ(PCHAR s)
{
varc(+_CMDLABEL); varstr(s); varc((BYTE)'='); varc(+_TOKEXPR); //TODO схч _TOKEXPR? (єсЁрЄ№ т ёрьє юсЁрсюЄъє _CMDLABEL) (єёыюцэшЄ ¤ъёяюЁЄ)
}
EXPORT PROC endvar_reequ()
{
varc(+_TOKENDEXPR); varc(+_FMTREEQU); endvar(); //TODO єсЁрЄ№
}
EXPORT PROC endasm_db()
{
asmc(+_TOKENDEXPR); asmc(+_OPWRVAL); asmc(+_FMTCMD); endasm(); //TODO єсЁрЄ№
}
EXPORT PROC endasm_dbstr()
{
asmc(+_TOKENDTEXT); asmc((BYTE)'\"'); asmc(+_FMTCMD); endasm(); //TODO єсЁрЄ№
}
EXPORT PROC endvar_db()
{
varc(+_TOKENDEXPR); varc(+_OPWRVAL); varc(+_FMTCMD); endvar(); //TODO єсЁрЄ№
}
EXPORT PROC endvar_dbstr()
{
varc(+_TOKENDTEXT); varc((BYTE)'\"'); varc(+_FMTCMD); endvar(); //TODO єсЁрЄ№
}
EXPORT PROC endvar_dw()
{
varc(+_TOKENDEXPR); varc(+_OPWRVAL); varc(+_FMTCMD); endvar(); //TODO єсЁрЄ№
}
EXPORT PROC endvar_dl()
{
varc(+_TOKENDEXPR); varc(+_OPWRVAL); varc(+_FMTCMD); endvar(); //TODO єсЁрЄ№
}
EXPORT PROC endvar_ds()
{
varc(+_TOKENDEXPR); varc(+_FMTCMD); endvar();
}
PROC asmexprstr(PCHAR s)
{
asmc(+_TOKEXPR); asmstr(s); asmc(+_TOKENDEXPR);
}
PROC asmcmd(BYTE c)
{
asmc(+_TOKSPC8); asmc(c); asmc(+_TOKSPC1);
}
PROC asmcmdfull(BYTE c)
{
asmc(+_TOKSPC8); asmc(c); asmc(+_FMTXX); endasm(); //TODO яшёрЄ№ ъюф т ёрьшї ъюьрэфрї
}
//////////// ьхыъшх яЁюЎхфєЁ√ фы ёюъЁр∙хэш ўшёыр ъюэёЄрэЄ
EXPORT PROC var_alignwsz()
{
}
PROC flushcall()
{
if (_wascall) {
asmcmd(+_ASMCALL); asmexprstr( _callee2 ); asmc(+_FMTJPNN); endasm();
_wascall = +FALSE;
};
}
PROC losea()
{
_callee2[0] = '\0'; //_lencallee2 = 0; //чрс√трхь ёюёЄю эшх A (чряшё№ т ярь Є№ эх шч A шыш т√ўшёыхэшх)
}
PROC asmexprstr_joined_keep()
{
asmexprstr(_joined);
_lencallee2 = strcopy(_joined, _lenjoined, _callee2);
}
PROC asm_comma()
{
asmc(+_TOKCOMMA);
}
PROC asm_open()
{
asmc(+_TOKOPENSQ);
}
PROC asm_close()
{
asmc(+_TOKCLOSESQ);
}
PROC asm_rname(BYTE r){ asmc( _RNAME[(UINT)r] );}
PROC asm_mrgname(BYTE r){ asm_open(); asm_rname(r); asm_close();}
PROC asm_rlow(BYTE r){ asmc( _RLOW[(UINT)r] );}
PROC asm_rhigh(BYTE r){ asmc( _RHIGH[(UINT)r] );}
FUNC BYTE rlow_rnew(){ RETURN _RLOW[(UINT)_rnew];}
FUNC BYTE rhigh_rnew(){ RETURN _RHIGH[(UINT)_rnew];}
FUNC BYTE rlow_rold(){ RETURN _RLOW[(UINT)_rold];}
FUNC BYTE rhigh_rold(){ RETURN _RHIGH[(UINT)_rold];}
PROC asm_rlow_rnew()
{
asm_rlow(_rnew);
}
PROC asm_rhigh_rnew()
{
asm_rhigh(_rnew);
}
PROC asm_rlow_rold()
{
asm_rlow(_rold);
}
PROC asm_rhigh_rold()
{
asm_rhigh(_rold);
}
PROC asm_close_eol()
{
asm_close(); endasm();
}
PROC asm_a()
{
asmc(+_RG_A);
}
PROC asm_hl()
{
asm_rname(0x01);
}
PROC asm_mhl()
{
asm_mrgname(0x01);
}
EXPORT PROC asm_db() //ъюёЄ√ы№ фы ъюэёЄрэЄэ√ї ьрёёштют ёЄЁюъ TODO
{
asmc(+_TOKSPC8); asmc(+_CMDDB); asmc(+_TOKSPC1); asmc(+_TOKEXPR); //TODO схч _TOKEXPR? (єсЁрЄ№ т ёрьє юсЁрсюЄъє ъюьрэф√) (єёыюцэшЄ ¤ъёяюЁЄ)
}
EXPORT PROC asm_dbstr() //ъюёЄ√ы№ фы ъюэёЄрэЄэ√ї ьрёёштют ёЄЁюъ TODO
{
asmc(+_TOKSPC8); asmc(+_CMDDB); asmc(+_TOKSPC1); asmc((BYTE)'\"'); asmc(+_OPWRSTR); asmc(+_TOKTEXT); //TODO єсЁрЄ№ т ёрьє юсЁрсюЄъє ъюьрэф√ (єёыюцэшЄ ¤ъёяюЁЄ)
}
EXPORT PROC var_db() //фюёЄєяэю шч compile!
{
varc(+_TOKSPC8); varc(+_CMDDB); varc(+_TOKSPC1); varc(+_TOKEXPR); //TODO схч _TOKEXPR? (єсЁрЄ№ т ёрьє юсЁрсюЄъє ъюьрэф√) (єёыюцэшЄ ¤ъёяюЁЄ)
}
EXPORT PROC var_dbstr()
{
varc(+_TOKSPC8); varc(+_CMDDB); varc(+_TOKSPC1); varc((BYTE)'\"'); varc(+_OPWRSTR); varc(+_TOKTEXT); //TODO єсЁрЄ№ т ёрьє юсЁрсюЄъє ъюьрэф√ (єёыюцэшЄ ¤ъёяюЁЄ)
}
EXPORT PROC var_dw() //фюёЄєяэю шч compile!
{
varc(+_TOKSPC8); varc(+_CMDDW); varc(+_TOKSPC1); varc(+_TOKEXPR); //TODO схч _TOKEXPR? (єсЁрЄ№ т ёрьє юсЁрсюЄъє ъюьрэф√) (єёыюцэшЄ ¤ъёяюЁЄ)
}
PROC var_dl()
{
varc(+_TOKSPC8); varc(+_CMDDL); varc(+_TOKSPC1); varc(+_TOKEXPR); //TODO схч _TOKEXPR? (єсЁрЄ№ т ёрьє юсЁрсюЄъє ъюьрэф√) (єёыюцэшЄ ¤ъёяюЁЄ)
}
EXPORT PROC var_ds() //фюёЄєяэю шч compile!
{
varc(+_TOKSPC8); varc(+_CMDDS); varc(+_TOKSPC1); varc(+_TOKEXPR); //TODO схч _TOKEXPR? (єсЁрЄ№ т ёрьє юсЁрсюЄъє ъюьрэф√) (єёыюцэшЄ ¤ъёяюЁЄ)
}
PROC asm_and()
{
flushcall();
asmcmd(+_ASMAND);
losea();
}
PROC asm_or()
{
flushcall();
asmcmd(+_ASMOR);
losea();
}
PROC asm_xor()
{
flushcall();
asmcmd(+_ASMXOR);
losea();
}
PROC asm_inc()
{
flushcall();
asmcmd(+_ASMINC);
losea();
}
PROC asm_dec()
{
flushcall();
asmcmd(+_ASMDEC);
losea();
}
PROC asm_ld()
{
flushcall();
asmcmd(+_ASMLD);
}
PROC asm_jp()
{
flushcall();
asmcmd(+_ASMJP);
}
PROC emitjrnz(CHAR c)
{
flushcall();
asmcmd(+_ASMJR);
asmc(+_ASMNZ);
asm_comma();
asmc(+_TOKEXPR); asmstr( "$+0x" ); asmc((BYTE)c); asmc(+_TOKENDEXPR);
asmc(+_FMTJRDD);
endasm();
}
PROC emitjrz(CHAR c)
{
flushcall();
asmcmd(+_ASMJR);
asmc(+_ASMZ);
asm_comma();
asmc(+_TOKEXPR); asmstr( "$+0x" ); asmc((BYTE)c); asmc(+_TOKENDEXPR);
asmc(+_FMTJRDD);
endasm();
}
PROC asm_ex()
{
flushcall();
asmcmd(+_ASMEX);
}
PROC asm_push()
{
flushcall();
asmcmd(+_ASMPUSH);
}
PROC asm_pop()
{
flushcall();
asmcmd(+_ASMPOP);
}
PROC asm_lda_comma()
{
asm_ld(); asm_a(); asm_comma();
losea();
}
PROC asm_ldmhl_comma()
{
asm_ld(); asm_mhl(); asm_comma();
}
PROC asm_comma_a()
{
asm_comma(); asm_a();
}
PROC asm_comma_mhl()
{
asm_comma(); asm_mhl();
}
PROC emitexa()
{
asm_ex(); asmc(+_RG_AF); asm_comma(); asmc(+_RG_AF); asmc(+_TOKPRIME); asmc(+_FMTEXRPRP); endasm(); //TODO т ёрьюь юсЁрсюЄўшъх EX
}
PROC emitexd()
{
asm_ex(); asmc(+_RG_DE); asm_comma(); asmc(+_RG_HL); asmc(+_FMTEXRPRP); endasm(); //TODO т ёрьюь юсЁрсюЄўшъх EX
}
PROC emitccf()
{
flushcall();
asmcmdfull(+_ASMCCF);
}
PROC emitrla()
{
flushcall();
asmcmdfull(+_ASMRLA);
losea();
}
PROC emitcpl()
{
flushcall();
asmcmdfull(+_ASMCPL);
losea();
}
PROC emitcall(PCHAR s)
{
flushcall();
asmcmd(+_ASMCALL); asmexprstr(s); asmc(+_FMTJPNN); endasm();
}
PROC emitrb0(BYTE r)
{
asm_ld(); asmc(r); asm_comma(); asmexprstr("0"); asmc(+_FMTLDRBN); endasm();
}
PROC emitarb(BYTE r)
{
asm_lda_comma(); /**losea*/ asmc(r); asmc(+_FMTMOVRBRB); endasm();
}
PROC emitrba(BYTE r)
{
asm_ld(); asmc(r); asm_comma_a(); asmc(+_FMTMOVRBRB); endasm();
}
PROC emitamrgn(BYTE r)
{
asm_lda_comma(); /**losea*/ asm_mrgname(r);
IF (r==0x01) {asmc(+_FMTGETRBMHL);
}ELSE asmc(+_FMTGETAMRP);
endasm();
}
PROC emitmrgna(BYTE r)
{
asm_ld(); asm_mrgname(r); asm_comma_a();
IF (r==0x01) {asmc(+_FMTPUTMHLRB);
}ELSE asmc(+_FMTPUTMRPA);
endasm();
}
PROC emitrbmhl(BYTE r)
{
asm_ld(); asmc(r); asm_comma(); asm_mhl(); asmc(+_FMTGETRBMHL); endasm();
}
PROC emitmhlrb(BYTE r)
{
asm_ld(); asm_mhl(); asm_comma(); asmc(r); asmc(+_FMTPUTMHLRB); endasm();
}
PROC emitincrgn(BYTE r)
{
flushcall();
asmcmd(+_ASMINC); asm_rname(r); asmc(+_FMTINCRP); endasm();
}
PROC emitdecrgn(BYTE r)
{
flushcall();
asmcmd(+_ASMDEC); asm_rname(r); asmc(+_FMTDECRP); endasm();
}
PROC emitinchl(){ emitincrgn(0x01);}
PROC emitdechl(){ emitdecrgn(0x01);}
PROC emitsubn(PCHAR s)
{
flushcall();
asmcmd(+_ASMSUB); asmexprstr(s); asmc(+_FMTALUCMDN); endasm();
losea();
}
PROC emitsubrb(BYTE r)
{
flushcall();
asmcmd(+_ASMSUB); asmc(r); asmc(+_FMTALUCMDRB); endasm();
losea();
}
PROC emitsbcrgn(BYTE r)
{
flushcall();
asmcmd(+_ASMSBC); asm_hl(); asm_comma(); asm_rname(r); asmc(+_FMTSBCHLRP); endasm();
}
PROC emitsbcrb(BYTE r)
{
flushcall();
asmcmd(+_ASMSBC); asm_a(); asm_comma(); asmc(r); asmc(+_FMTALUCMDRB); endasm();
losea();
}
PROC emitaddrgn(BYTE r)
{
flushcall();
asmcmd(+_ASMADD);
IF (r==0x04) {asmc(+_RG_IX); }ELSE asm_hl();
asm_comma(); asm_rname(r); asmc(+_FMTADDHLRP); endasm();
}
PROC emitaddrb(BYTE r)
{
flushcall();
asmcmd(+_ASMADD); asm_a(); asm_comma(); asmc(r); asmc(+_FMTALUCMDRB); endasm();
losea();
}
PROC emitadcrgn(BYTE r)
{
flushcall();
asmcmd(+_ASMADC); asm_hl(); asm_comma(); asm_rname(r); asmc(+_FMTADCHLRP); endasm();
}
PROC emitadcrb(BYTE r)
{
flushcall();
asmcmd(+_ASMADC); asm_a(); asm_comma(); asmc(r); asmc(+_FMTALUCMDRB); endasm();
losea();
}
///////////////////////////////////
//фюёЄєяэ√ шч commands
PROC unproxy() //A тючтЁр∙рхЄ Ёхчєы№ЄрЄ т ЁхушёЄЁ
{
IF (_rproxy != 0x00) { //т яЁюъёш ўЄю-Єю с√ыю
emitrba( _RLOW[_rproxy] );
_rproxy = 0x00;
};
}
PROC proxy(BYTE r) //A фєсышЁєхЄ ЁхушёЄЁ
{
IF (_rproxy != r) {
unproxy();
emitarb( _RLOW[r] );
_rproxy = r;
losea();
};
}
///////////////////////////////////////////////////////////
//яЁюЎхфєЁ√ ё ьр°шээ√ь ъюфюь фы rgs
PROC emitpushrg(BYTE rnew)
{
unproxy(); //todo юяЄшьшчшЁютрЄ№
asm_push(); asm_rname(rnew); asmc(+_FMTPUSHPOPRP); endasm();
INC _funcstkdepth;
}
PROC emitpoprg(BYTE rnew) //ЁхушёЄЁ єцх яюьхўхэ т getrfree/getrg
{
asm_pop(); asm_rname(rnew); asmc(+_FMTPUSHPOPRP); endasm();
DEC _funcstkdepth;
}
PROC emitmovrg(BYTE rsrc, BYTE rdest) //эх чрърч√трхЄ ш эх юётюсюцфрхЄ (ёь. emitmoverg)
{
IF (rsrc!=rdest) { //todo шыш ёЁртэштрЄ№ rsrc!=rdest ёэрЁєцш?
//rdest эх ьюцхЄ с√Є№ FASTRG4? хёыш ёфхырЄ№ ЇєэъЎш■ getslowrg, Єю ьюцхЄ :(
IF ( ((rdest==0x04)&&(rsrc==0x01))
||((rdest==0x01)&&(rsrc==0x04))
) {
asm_push(); asm_rname(rsrc); asmc(+_FMTPUSHPOPRP); endasm();
asm_pop(); asm_rname(rdest); asmc(+_FMTPUSHPOPRP); endasm();
}ELSE {
asm_ld(); asm_rhigh(rdest); asm_comma(); asm_rhigh(rsrc); asmc(+_FMTMOVRBRB); endasm();
asm_ld(); asm_rlow(rdest); asm_comma(); asm_rlow(rsrc); asmc(+_FMTMOVRBRB); endasm();
};
};
}
///////////////////////////////////////////////////////////////////////////////////////
//¤Єш яЁюЎхфєЁ√ ухэхЁшЁє■Є ъюф
//эхфюёЄєяэ√ шч ъюьяшы ЄюЁр, фюёЄєяэ√ шч commands
EXPORT PROC emitasmlabel(PCHAR s)
{
flushcall();
asm_label(); asmstr(s); /**asmc( ':' );*/ endasm_label();
losea();
}
EXPORT PROC emitfunclabel(PCHAR s)
{
flushcall();
asm_label(); asmstr(s); /**asmc( ':' );*/ endasm_label();
losea();
}
EXPORT PROC emitvarlabel(PCHAR s)
{
var_label(); varstr(s); /**varc( ':' );*/ endvar_label();
}
EXPORT PROC emitexport(PCHAR s) //todo тёхуфр _joined
{
flushcall();
asmcmd(+_CMDEXPORT); asmc(+_TOKLABEL); asmstr(s); asmc(+_FMTCMD); endasm(); //TODO єсЁрЄ№ +_FMTCMD
}
EXPORT PROC emitvarpreequ(PCHAR s)
{
}
EXPORT PROC emitvarpostequ()
{
}
EXPORT FUNC UINT varshift(UINT shift, UINT sz)
{
//IF (sz >= 4) shift = (shift+3)&(UINT)(-4);
//asmexprstr_joined_keep(); asmc('='); asmuint(shift); endasm();
varequ(_joined); /**varstr(_joined); varc('=');*/ varuint(shift); endvar_reequ();
RETURN shift;
}
PROC emitjpmainrg() //"jp (hl)"
{
//эр ¤ЄюЄ ьюьхэЄ фы яЁхфёърчєхьюёЄш тёх ЁхушёЄЁ√ фюыцэ√ с√Є№ ётюсюфэ√
//(ёхщўрё ¤Єю яюыєўшЄё ртЄюьрЄшўхёъш, эю схч storergs ш ё ЁхчхЁтшЁютрэшхь ЁхушёЄЁют эрфю юётюсюцфрЄ№ тЁєўэє■)
unproxy();
getnothing(); //getnothingword();
asm_jp(); asm_mhl(); asmc(+_FMTJPRP); endasm();
}
PROC emitcallmainrg() //"call (hl)"
{
//эр ¤ЄюЄ ьюьхэЄ фы яЁхфёърчєхьюёЄш тёх ЁхушёЄЁ√ фюыцэ√ с√Є№ ётюсюфэ√
//(ёхщўрё ¤Єю яюыєўшЄё ртЄюьрЄшўхёъш, эю схч storergs ш ё ЁхчхЁтшЁютрэшхь ЁхушёЄЁют эрфю юётюсюцфрЄ№ тЁєўэє■)
unproxy();
getnothing(); //getnothingword();
emitcall("_JPHL.");
_fused = +FALSE; //ъюэхЎ т√ўшёыхэш
}
PROC emitjp()
{
//эр ¤ЄюЄ ьюьхэЄ фы яЁхфёърчєхьюёЄш тёх ЁхушёЄЁ√ фюыцэ√ с√Є№ ётюсюфэ√
//(ёхщўрё ¤Єю яюыєўшЄё ртЄюьрЄшўхёъш, эю схч storergs ш ё ЁхчхЁтшЁютрэшхь ЁхушёЄЁют эрфю юётюсюцфрЄ№ тЁєўэє■)
unproxy();
getnothing(); //getnothingword();
asm_jp(); asmexprstr(_joined); asmc(+_FMTJPNN); endasm();
}
PROC emitbtoz() //яхЁхф jp!
{
//ёЁрчє яюёых ёЁртэхэш эх эрфю, эю тфЁєу ь√ ўшЄрхь BOOL
//IF (_jpflag == 0x00) {
IF (!_fused) { //Ёхчєы№ЄрЄр эхЄ тю Їырурї
proxy(_rnew); //todo юяЄшьшчшЁютрЄ№
//IF (anew==_RGA) {
asm_or(); asm_a(); asmc(+_FMTALUCMDRB); endasm();
//}ELSE {
// asm_inc(); /**rganame*/asm_rlow(anew); asmc(+_FMTINCDECRB); endasm();
// asm_dec(); /**rganame*/asm_rlow(anew); asmc(+_FMTINCDECRB); endasm();
//};
};
_rproxy = 0x00;
}
PROC emitjpiffalse()
{
//эр ¤ЄюЄ ьюьхэЄ фы яЁхфёърчєхьюёЄш тёх ЁхушёЄЁ√ фюыцэ√ с√Є№ ётюсюфэ√
//(ёхщўрё ¤Єю яюыєўшЄё ртЄюьрЄшўхёъш, эю схч storergs ш ё ЁхчхЁтшЁютрэшхь ЁхушёЄЁют эрфю юётюсюцфрЄ№ тЁєўэє■)
//unproxy();
getnothing(); //getnothingword();
asm_jp();
IF (_jpflag == 0x02) {asmc(+_ASMNZ);
}ELSE IF (_jpflag == 0x03) {asmc(+_ASMNC);
}ELSE IF (_jpflag == 0x04) {asmc(+_ASMC);
}ELSE {asmc(+_ASMZ);
};
asm_comma();
asmexprstr(_joined);
asmc(+_FMTJPNN);
endasm();
_fused = +FALSE;
_jpflag = 0x00;
}
PROC emitret()
{
//unproxy();
if (_wascall) {
asmcmd(+_ASMJP); asmexprstr(_callee2); asmc(+_FMTJPNN); endasm();
_wascall = +FALSE;
}else {
//flushcall();
asmcmdfull(+_ASMRET);
};
}
PROC emitcall2rgs(PCHAR s)
{
unproxy();
getmain2rgs();
initrgs();
emitcall(s);
setmainrg(); //Ёхчєы№ЄрЄ т RMAIN
}
/**
PROC emitcall3rgs(PCHAR s) //todo яЁютхЁшЄ№
{
unproxy();
getmain3rgs();
initrgs();
emitcall(s);
//ёхщўрё тёх ЁхушёЄЁ√ юЄьхўхэ√ ъръ ётюсюфэ√х
//setwordcontext();
setmain2rgs(); //Ёхчєы№ЄрЄ т RMAIN,RMAIN2
}
*/
PROC emitcall4rgs(PCHAR s) //todo яЁютхЁшЄ№
{
unproxy();
getmain4rgs();
initrgs();
emitcall(s);
//ёхщўрё тёх ЁхушёЄЁ√ юЄьхўхэ√ ъръ ётюсюфэ√х
//setwordcontext();
setmain2rgs(); //Ёхчєы№ЄрЄ т RMAIN,RMAIN2
}
PROC emitcallproc()
{
//_jpflag = 0x00;
flushcall();
_lencallee2 = strcopy(_callee, _lencallee, _callee2);
_wascall = +TRUE;
}
PROC emitloadrg(BOOL high) //ЁхушёЄЁ єцх чрэ Є ўхЁхч getrfree
{
IF (high) {
_lenconst = strjoin(/**to=*/_const, 4, ">>16");
_joined[_lenjoined] = '\0';
};
asm_ld();
asm_rname(_rnew);
asm_comma();
asmexprstr(_const);
asmc(+_FMTLDRPNN);
endasm();
_fused = +FALSE; //ъюэхЎ т√ўшёыхэш
}
PROC emitloadrg0() //ЁхушёЄЁ єцх чрэ Є ўхЁхч getrfree
{
asm_ld();
asm_rname(_rnew);
asm_comma();
asmexprstr("0");
asmc(+_FMTLDRPNN);
endasm();
}
PROC emitloadb() //ръъєьєы ЄюЁ єцх чрэ Є ўхЁхч getfreea
{
IF (_rproxy == 0x00) {
_rproxy = _rnew;
asm_lda_comma();
}ELSE {
asm_ld();
/**rganame*/asmc(rlow_rnew());
asm_comma();
};
asmexprstr(_const);
asmc(+_FMTLDRBN);
endasm();
_fused = +FALSE; //ъюэхЎ т√ўшёыхэш
}
PROC emitgetrg(BOOL high) //ЁхушёЄЁ єцх чрэ Є ўхЁхч getrfree
{
_oldlen = _lenjoined;
IF (high) { //TODO эрЁєцє
joinedadd('+');
joinedadd('2');
};
asm_ld();
asm_rname(_rnew);
asm_comma();
asm_open();
asmexprstr(_joined);
asm_close();
asmc(+_FMTGETRPMNN);
endasm();
_lenjoined = _oldlen; _joined[_lenjoined] = '\0';
}
PROC emitgetb() //ръъєьєы ЄюЁ єцх чрэ Є ўхЁхч getfreea
{
//хёыш ръъєьєы ЄюЁ эх яЁюъёш? ш эхфртэю (фю фЁєуюую шьхэютрээюую юсЁр∙хэш (ё■фр Єръцх тїюф Є т√ўшёыхэшх ш яхЁхїюф), ьхЄъш) ёюїЁрэ ыё т шьхэютрээє■ ўхщъє ўхЁхч emitputb(), Єю эшўхую эх фхырЄ№
unproxy();
_rproxy = _rnew;
if (!strcp(_joined, _callee2)) { //ъЁштю!
asm_lda_comma();
asm_open();
asmexprstr_joined_keep();
asm_close();
asmc(+_FMTGETAMNN);
endasm();
};
}
PROC emitputrg(BOOL high) //ld [],new
{
//_jpflag = 0x00;
IF (high) { //TODO эрЁєцє
joinedadd('+');
joinedadd('2');
};
asm_ld(); asm_open();
asmexprstr(_joined);
asm_close(); asm_comma();
asm_rname(_rnew);
asmc(+_FMTPUTMNNRP);
endasm();
_fused = +FALSE; //ъюэхЎ т√ўшёыхэш
}
PROC emitputb()
{
//_jpflag = 0x00;
proxy(_rnew);
asm_ld(); asm_open();
asmexprstr_joined_keep();
asm_close();
asm_comma_a();
asmc(+_FMTPUTMNNA);
endasm();
_rproxy = 0x00;
_fused = +FALSE; //ъюэхЎ т√ўшёыхэш
}
PROC emitshl1rg()
{
IF ((_rnew==0x01)||(_rnew==0x04)) {
emitaddrgn(_rnew); //add hl,ix єцх Єрь ухэхЁшЁєхЄё ъръ add ix,ix
}ELSE {
flushcall();
asmcmd(+_ASMSLA); asmc(rlow_rnew()); asmc(+_FMTCBCMDRB); endasm();
asmcmd(+_ASMRL); asmc(rhigh_rnew()); asmc(+_FMTCBCMDRB); endasm();
};
}
PROC emitshl1b()
{
proxy(_rnew);
//IF (_rproxy==_rnew) {
emitaddrb(+_RG_A);
//}ELSE {
// flushcall();
// asmcmd(+_ASMSLA); /**rganame*/asm_rlow(anew); asmc(+_FMTCBCMDRB); endasm();
//};
}
/**
PROC emitshr1rg(BYTE rnew)
{
flushcall();
asmcmd(+_ASMSRL); asm_rhigh(rnew); asmc(+_FMTCBCMDRB); endasm();
asmcmd(+_ASMRR); asm_rlow(rnew); asmc(+_FMTCBCMDRB); endasm();
}
PROC emitshr1signedrg(BYTE rnew)
{
flushcall();
asmcmd(+_ASMSRA); asm_rhigh(rnew); asmc(+_FMTCBCMDRB); endasm();
asmcmd(+_ASMRR); asm_rlow(rnew); asmc(+_FMTCBCMDRB); endasm();
}
*/
//PROC emitshr1b(BYTE anew)
//{
// flushcall();
// asmcmd(+_ASMSRL); /**rganame*/asm_rlow(anew] ); asmc(+_FMTCBCMDRB); endasm();
//}
PROC emitinvb() //~A -> A
{
proxy(_rnew);
emitcpl();
_fused = +FALSE; //шэрўх уы■ъ if (!(a||b))
}
PROC emitinvrg()
{
unproxy();
emitarb( rhigh_rnew() );
emitcpl();
emitrba( rhigh_rnew() );
emitinvb(); //_rlow
unproxy(); //шэрўх уы■ъ яхЁхф poke
}
PROC emitnegrg()
{
unproxy();
asm_xor(); asm_a(); asmc(+_FMTALUCMDRB); endasm();
emitsubrb(rlow_rnew());
emitrba( rlow_rnew() );
emitsbcrb(rhigh_rnew());
emitsubrb(rlow_rnew());
emitrba( rhigh_rnew() );
}
PROC emitztob()
{
//asmexprstr(";emitztoa exprlvl="); asmuint(_exprlvl); endasm();
IF (_exprlvl != 0x01) { //if (a == b)
IF (_azused) { //A ёюфхЁцшЄ яЁртшы№э√щ 0/эх0 яюёых ёЁртэхэш
//unproxy();
emitsubn("1");
emitsbcrb(+_RG_A);
_rproxy = _rnew;
_azused = +FALSE;
}ELSE {
emitrb0(rlow_rnew());
IF (_rnew != 0x04) {emitjrnz('3');
}ELSE emitjrnz('4'); //ix
asm_dec(); asmc(rlow_rnew()); asmc(+_FMTINCDECRB); endasm();
};
_fused = +FALSE; //шэрўх уы■ъ яЁш if ((a==b))
//_jpflag = 0x00;
}ELSE {
//_fused = +TRUE;
_jpflag = 0x02;
};
}
PROC emitinvztob()
{
//asmexprstr(";emitinvztoa exprlvl="); asmuint(_exprlvl); endasm();
IF (_exprlvl != 0x01) { //if (a != b)
IF (_azused) { //A ёюфхЁцшЄ яЁртшы№э√щ 0/эх0 яюёых ёЁртэхэш
//unproxy();
emitjrz('4');
asm_lda_comma(); asmexprstr("-1"); asmc(+_FMTLDRBN); endasm();
_rproxy = _rnew;
_azused = +FALSE;
}ELSE {
emitrb0(rlow_rnew());
IF (_rnew != 0x04) {emitjrz('3');
}ELSE emitjrz('4'); //ix
asm_dec(); asmc(rlow_rnew()); asmc(+_FMTINCDECRB); endasm();
};
_fused = +FALSE; //шэрўх уы■ъ яЁш if ((a!=b))? todo test //тючьюцхэ уы■ъ ifnot ((a!=b))
//_jpflag = 0x00;
}ELSE {
//_fused = +TRUE;
_jpflag = 0x01;
};
}
PROC emitcytob()
{
//asmexprstr(";emitcytoa exprlvl="); asmuint(_exprlvl); endasm();
IF (_exprlvl != 0x01) { //if (a < b)
unproxy();
emitsbcrb(+_RG_A);
_rproxy = _rnew;
//_fused = +FALSE;
//_jpflag = 0x00;
}ELSE {
//_fused = +TRUE;
_jpflag = 0x03;
};
}
PROC emitinvcytob()
{
//asmexprstr(";emitinvcytoa exprlvl="); asmuint(_exprlvl); endasm();
IF (_exprlvl != 0x01) { //if (a >= b)
emitccf();
unproxy();
emitsbcrb(+_RG_A);
_rproxy = _rnew;
//_fused = +FALSE;
//_jpflag = 0x00;
}ELSE {
//_fused = +TRUE;
_jpflag = 0x04;
};
}
PROC emitSxorVtob() //яюёых subflags, ЁрчЁхчхЁтшЁєхЄ A
{
emitrla(); //sign
asm_jp(); asmc(+_ASMPO); asm_comma(); asmexprstr( "$+4" ); asmc(+_FMTJPNN); endasm();
emitccf();
emitcytob();
}
PROC emitinvSxorVtob() //яюёых subflags, ЁрчЁхчхЁтшЁєхЄ A
{
emitrla(); //sign
asm_jp(); asmc(+_ASMPE); asm_comma(); asmexprstr( "$+4" ); asmc(+_FMTJPNN); endasm();
emitccf();
emitcytob();
}
PROC emitxorrg() //old^new => old
{
unproxy();
emitarb( rhigh_rnew() );
asm_xor(); asm_rhigh_rold(); asmc(+_FMTALUCMDRB); endasm();
emitrba( rhigh_rold() );
emitarb( rlow_rnew() );
asm_xor(); asm_rlow_rold(); asmc(+_FMTALUCMDRB); endasm();
emitrba( rlow_rold() );
}
PROC getxorb() //RGA^RGA2 -> RGA
{
IF (_rproxy == _rnew) {
asm_xor();
/**rganame*/asm_rlow_rold();
_rproxy = _rold;
}ELSE {
proxy(_rold);
asm_xor();
/**rganame*/asmc(rlow_rnew());
};
asmc(+_FMTALUCMDRB);
endasm();
_fused = +TRUE; //^^
}
PROC emitorrg() //old|new => old
{
unproxy();
emitarb( rhigh_rnew() );
asm_or(); asm_rhigh_rold(); asmc(+_FMTALUCMDRB); endasm();
emitrba( rhigh_rold() );
emitarb( rlow_rnew() );
asm_or(); asm_rlow_rold(); asmc(+_FMTALUCMDRB); endasm();
emitrba( rlow_rold() );
}
PROC getorb() //RGA|RGA2 -> RGA
{
IF (_rproxy == _rnew) {
asm_or();
/**rganame*/asm_rlow_rold();
_rproxy = _rold;
}ELSE {
proxy(_rold);
asm_or();
/**rganame*/asmc(rlow_rnew());
};
asmc(+_FMTALUCMDRB);
endasm();
_fused = +TRUE; //||
}
PROC emitandrg() //old&new => old
{
unproxy();
emitarb( rhigh_rnew() );
asm_and(); asm_rhigh_rold(); asmc(+_FMTALUCMDRB); endasm();
emitrba( rhigh_rold() );
emitarb( rlow_rnew() );
asm_and(); asm_rlow_rold(); asmc(+_FMTALUCMDRB); endasm();
emitrba( rlow_rold() );
}
PROC getandb() //RGA&RGA2 -> RGA
{
IF (_rproxy == _rnew) {
asm_and();
/**rganame*/asm_rlow_rold();
_rproxy = _rold;
}ELSE {
proxy(_rold);
asm_and();
/**rganame*/asmc(rlow_rnew());
};
asmc(+_FMTALUCMDRB);
endasm();
_fused = +TRUE; //&&
}
PROC emitaddrg() //old+new => old
{ //add ix эш Ёрчє эх яюЄЁхсютрыё
IF ((_rold==0x01)&&(_rnew!=0x04)) {
emitaddrgn(_rnew);
}ELSE IF ((_rold==0x02)&&(_rnew!=0x04)) {
emitexd(); //todo ўхЁхч swaprgs?
IF (_rnew==0x01) {emitaddrgn(0x02); //de+hl
}ELSE emitaddrgn(_rnew);
emitexd(); //todo ўхЁхч swaprgs?
}ELSE {
unproxy();
emitarb(rlow_rold());
emitaddrb(rlow_rnew());
emitrba(rlow_rold());
emitarb(rhigh_rold());
emitadcrb(rhigh_rnew());
emitrba(rhigh_rold());
};
}
PROC emitadcrg() //old+new => old
{
IF ((_rold==0x01)&&(_rnew!=0x04)) {
emitadcrgn(_rnew);
}ELSE IF ((_rold==0x02)&&(_rnew!=0x04)) {
emitexd(); //todo ўхЁхч swaprgs?
IF (_rnew==0x01) {emitadcrgn(0x02); //de+hl
}ELSE emitadcrgn(_rnew);
emitexd(); //todo ўхЁхч swaprgs?
}ELSE {
unproxy();
emitarb(rlow_rold());
emitadcrb(rlow_rnew());
emitrba(rlow_rold());
emitarb(rhigh_rold());
emitadcrb(rhigh_rnew());
emitrba(rhigh_rold());
};
}
PROC emitaddb() //old+new
{
IF (_rproxy == _rnew) {
emitaddrb(rlow_rold());
_rproxy = _rold;
}ELSE {
proxy(_rold);
emitaddrb(rlow_rnew());
};
}
PROC emitaddbconst() //new8+<const>
{
proxy(_rnew);
flushcall();
asmcmd(+_ASMADD); asm_a(); asm_comma(); asmexprstr(_const); asmc(+_FMTALUCMDN); endasm();
losea();
}
PROC emitsubrg() //old-new => old
{
IF ((_rold==0x01)&&(_rnew!=0x04)) {
asm_or(); asm_a(); asmc(+_FMTALUCMDRB); endasm();
emitsbcrgn(_rnew);
//exd..exd эхт√уюфэю 27 ЄръЄют (хёыш ўхЁхч яхЁхэєьхЁрЎш■ ЁхушёЄЁют, Єю сєфхЄ 23)
}ELSE {
unproxy();
emitarb(rlow_rold());
emitsubrb(rlow_rnew());
emitrba(rlow_rold());
emitarb(rhigh_rold());
emitsbcrb(rhigh_rnew());
emitrba(rhigh_rold());
};
}
PROC emitsbcrg() //old-new => old
{
IF ((_rold==0x01)&&(_rnew!=0x04)) {
emitsbcrgn(_rnew);
}ELSE IF ((_rold==0x02)&&(_rnew!=0x04)) {
emitexd(); //todo ўхЁхч swaprgs?
IF (_rnew==0x01) {emitsbcrgn(0x02); //de-hl
}ELSE emitsbcrgn(_rnew);
emitexd(); //todo ўхЁхч swaprgs?
}ELSE {
unproxy();
emitarb(rlow_rold());
emitsbcrb(rlow_rnew());
emitrba(rlow_rold());
emitarb(rhigh_rold());
emitsbcrb(rhigh_rnew());
emitrba(rhigh_rold());
};
}
PROC emitsubb() //old-new
{
proxy(_rold);
emitsubrb(rlow_rnew());
}
PROC emitsubbconst() //new8-<const>
{
proxy(_rnew);
emitsubn(_const);
}
PROC emitsubflags(BYTE rnew, BYTE rold) //r2-r1 => CY,sign,overflow
{
unproxy();
emitarb(_RLOW[(UINT)rold]);
emitsubrb(_RLOW[(UINT)rnew]);
emitarb(_RHIGH[(UINT)rold]);
emitsbcrb(_RHIGH[(UINT)rnew]);
_fused = +TRUE;
}
PROC emitsubbflags(BYTE anew, BYTE aold) //a2-a1 => CY
{ //sign,overflow эх эєцхэ!
proxy(aold);
emitsubrb(_RLOW[(UINT)anew]);
_rproxy = 0x00;
_fused = +TRUE;
}
PROC emitsubz() //old-new => Z
{
IF (_rold == 0x01) {
emitsubrg();
}ELSE {
unproxy();
emitarb(rlow_rold());
emitsubrb(rlow_rnew());
IF ((_rold!=0x04)&&(_rnew!=0x04)) {emitjrnz('4');
}ELSE emitjrnz('5'); //ix
emitarb(rhigh_rold());
emitsubrb(rhigh_rnew());
_azused = +TRUE; //A ёюфхЁцшЄ яЁртшы№э√щ 0/эх0 яюёых ёЁртэхэш
};
_fused = +TRUE;
}
PROC emitsubbz() //old-new => Z
{
IF (_rproxy == _rnew) {
emitsubrb(rlow_rold());
}ELSE {
proxy(_rold);
emitsubrb(rlow_rnew());
};
_rproxy = 0x00;
_azused = +TRUE; //A ёюфхЁцшЄ яЁртшы№э√щ 0/эх0 яюёых ёЁртэхэш
_fused = +TRUE;
}
PROC emitsubbzconst() //new-<const> => Z
{
proxy(_rnew);
emitsubn(_const);
_rproxy = 0x00;
_azused = +TRUE; //A ёюфхЁцшЄ яЁртшы№э√щ 0/эх0 яюёых ёЁртэхэш
_fused = +TRUE;
}
PROC emitsublongz() //old2-new, old3-old => Z
//ld a,low(_rold2)
//sub low(_rnew)
//jr nz,$+2+2(1)+1 + 2+1(2)+1 + 2+1(2)+1
//ld a,high(_rold2)
//sub high(_rnew)
//jr nz,$+2+1(2)+1 + 2+1(2)+1
//ld a,low(_rold3)
//sub low(_rold)
//jr nz,$+2+1(2)+1
//ld a,high(_rold3)
//sub high(_rold)
{
unproxy();
emitarb(_RLOW[(UINT)_rold2]);
emitsubrb(rlow_rnew());
IF ((_rold3!=0x04)&&(_rold!=0x04)) {emitjrnz('d'); //5+4+4//ix т rold2 шыш rnew
}ELSE emitjrnz('e'); //4+5+5//ix т rold3 шыш rold
emitarb(_RHIGH[(UINT)_rold2]);
emitsubrb(rhigh_rnew());
IF ((_rold3!=0x04)&&(_rold!=0x04)) {emitjrnz('8');
}ELSE emitjrnz('a'); //ix
emitarb(_RLOW[(UINT)_rold3]);
emitsubrb(rlow_rold());
IF ((_rold3!=0x04)&&(_rold!=0x04)) {emitjrnz('4');
}ELSE emitjrnz('5'); //ix
emitarb(_RHIGH[(UINT)_rold3]);
emitsubrb(rhigh_rold());
_fused = +TRUE;
}
PROC emitpokerg() //эютюх чряшё√трхь т ёЄрЁє■ ыюърЎш■ ярь Єш
{
IF ((_rold == 0x01)&&(_rnew!=0x04)) {
emitmhlrb(rlow_rnew());
emitinchl();
emitmhlrb(rhigh_rnew());
}ELSE {
unproxy();
emitarb(rlow_rnew());
emitmrgna(_rold);
emitincrgn(_rold);
emitarb(rhigh_rnew());
emitmrgna(_rold);
};
_fused = +FALSE; //ъюэхЎ т√ўшёыхэш
losea();
}
PROC emitpokeb() //эютюх чряшё√трхь т ёЄрЁє■ ыюърЎш■ ярь Єш
//т rnew ьюцхЄ эх с√Є№ фрээ√ї, хёыш rproxy==rnew!!!
{
IF ((_rold==0x01) && (_rnew!=0x04) && (_rproxy!=_rnew)) {
emitmhlrb(rlow_rnew());
losea(); //хёыш ёяхЎшры№эю чряшёрыш т ўхщъє, ъюЄюЁє■ їЁрэшЄ A
}ELSE {
proxy(_rnew); //шэрўх эхЄ ъюьрэф√ ld [rp],rg
emitmrgna(_rold);
};
_rproxy = 0x00;
_fused = +FALSE; //ъюэхЎ т√ўшёыхэш
}
PROC emitpokelong() //old2(addr), old(high), new(low)
{
IF ((_rold2==0x01)&&(_rnew!=0x04)) {
emitmhlrb(rlow_rnew());
emitinchl();
emitmhlrb(rhigh_rnew());
emitinchl();
emitmhlrb(rlow_rold());
emitinchl();
emitmhlrb(rhigh_rold());
}ELSE {
unproxy();
emitarb(rlow_rnew());
emitmrgna(_rold2);
emitincrgn(_rold2);
emitarb(rhigh_rnew());
emitmrgna(_rold2);
emitincrgn(_rold2);
emitarb(rlow_rold());
emitmrgna(_rold2);
emitincrgn(_rold2);
emitarb(rhigh_rold());
emitmrgna(_rold2);
};
_fused = +FALSE; //ъюэхЎ т√ўшёыхэш
losea();
}
PROC emitpeekrg() //[new] => new
{
unproxy();
IF (_rnew==0x01) { //hl
emitamrgn(0x01);
emitinchl();
emitrbmhl(+_RG_H);
emitrba(+_RG_L);
}ELSE {
emitamrgn(_rnew);
emitincrgn(_rnew);
emitexa();
emitamrgn(_rnew);
emitrba(rhigh_rnew());
emitexa();
emitrba(rlow_rnew());
};
}
PROC emitpeekb()
{
// IF (_rnew==0x01) {
// emitrbmhl(+_RG_L); //эхт√уюфэю
// }ELSE {
unproxy();
_rproxy = _rnew;
emitamrgn(_rnew);
// };
}
PROC emitpeeklong() //[old] => old(high),new(low)
{
unproxy();
IF ((_rold==0x01)&&(_rnew!=0x04)) {
emitrbmhl(rlow_rnew());
emitinchl();
emitrbmhl(rhigh_rnew());
emitinchl();
emitamrgn(0x01);
emitinchl();
emitrbmhl(+_RG_H);
emitrba(+_RG_L);
}ELSE {
emitamrgn(_rold);
emitincrgn(_rold);
emitrba(rlow_rnew());
emitamrgn(_rold);
emitincrgn(_rold);
emitrba(rhigh_rnew());
emitamrgn(_rold);
emitincrgn(_rold);
emitexa();
emitamrgn(_rold);
emitrba(rhigh_rold());
emitexa();
emitrba(rlow_rold());
};
}
PROC emitrgtob() //эхы№ч єсшЁрЄ№ - ёяхЎшЇшўэю
{
}
PROC emitbtorg()
{
unproxy();
emitrb0(rhigh_rnew());
}
PROC emitincrg_byname()
{
emitgetrg(+FALSE);
emitincrgn(_rnew);
emitputrg(+FALSE);
_fused = +FALSE; //ъюэхЎ т√ўшёыхэш
}
PROC emitincb_bypoi()
{
IF (_rnew==0x01) { //hl
asm_inc(); asm_open(); asm_rname(0x01); asm_close(); asmc(+_FMTINCDECMHL); endasm();
}ELSE IF (_rnew==0x04) { //ix
asm_inc(); asm_open(); asm_rname(0x04); asm_close(); asmc(+_FMTINCDECIDX); endasm();
}ELSE IF (_rnew==0x02) { //de
emitexd(); //todo ўхЁхч swaprgs?
asm_inc(); asm_mhl(); asmc(+_FMTINCDECMHL); endasm();
emitexd(); //todo ўхЁхч swaprgs?
}ELSE /**IF (_rnew==0x03)*/ { //bc
unproxy();
emitamrgn(_rnew);
asm_inc(); asm_a(); asmc(+_FMTINCDECRB); endasm();
asm_ld(); asm_open(); asm_rname(_rnew); asm_close(); asm_comma_a(); asmc(+_FMTPUTMRPA); endasm();
};
_fused = +FALSE; //ъюэхЎ т√ўшёыхэш
losea();
}
/**
PROC emitinclong() //todo
{
asm_inc(); asm_open(); asm_rname(_rnew); asm_close(); asmc(+_FMTINCDECMHL); endasm();
_fused = +FALSE; //ъюэхЎ т√ўшёыхэш
}
*/
PROC emitdecrg_byname()
{
emitgetrg(+FALSE);
emitdecrgn(_rnew);
emitputrg(+FALSE);
_fused = +FALSE; //ъюэхЎ т√ўшёыхэш
}
PROC emitdecb_bypoi()
{
IF (_rnew==0x01) { //hl
asm_dec(); asm_open(); asm_rname(0x01); asm_close(); asmc(+_FMTINCDECMHL); endasm();
}ELSE IF (_rnew==0x04) { //ix
asm_dec(); asm_open(); asm_rname(0x04); asm_close(); asmc(+_FMTINCDECIDX); endasm();
}ELSE IF (_rnew==0x02) { //de
emitexd(); //todo ўхЁхч swaprgs?
asm_dec(); asm_mhl(); asmc(+_FMTINCDECMHL); endasm();
emitexd(); //todo ўхЁхч swaprgs?
}ELSE /**IF (_rnew==0x03)*/ { //bc
unproxy();
emitamrgn(_rnew);
asm_dec(); asm_a(); asmc(+_FMTINCDECRB); endasm();
asm_ld(); asm_open(); asm_rname(_rnew); asm_close(); asm_comma_a(); asmc(+_FMTPUTMRPA); endasm();
};
_fused = +FALSE; //ъюэхЎ т√ўшёыхэш
losea();
}
/**
PROC emitdeclong() //todo
{
asm_dec(); asm_open(); asm_rname(_rnew); asm_close(); asmc(+_FMTINCDECMHL); endasm();
_fused = +FALSE; //ъюэхЎ т√ўшёыхэш
}
*/
PROC emitincrg_bypoi() //[old], new free
{
IF (_rold==0x01) { //hl
emitrbmhl(rlow_rnew());
emitinchl();
emitrbmhl(rhigh_rnew());
emitincrgn(_rnew);
emitmhlrb(rhigh_rnew());
emitdechl();
emitmhlrb(rlow_rnew());
}ELSE {
unproxy();
emitamrgn(_rold);
emitrba(rlow_rnew());
emitincrgn(_rold);
emitamrgn(_rold);
emitrba(rhigh_rnew());
emitincrgn(_rnew);
emitarb(rhigh_rnew());
emitmrgna(_rold);
emitdecrgn(_rold);
emitarb(rlow_rnew());
emitmrgna(_rold);
};
_fused = +FALSE; //ъюэхЎ т√ўшёыхэш
losea();
}
PROC emitdecrg_bypoi() //[old], new free
{
IF (_rold==0x01) { //hl
emitrbmhl(rlow_rnew());
emitinchl();
emitrbmhl(rhigh_rnew());
emitdecrgn(_rnew);
emitmhlrb(rhigh_rnew());
emitdechl();
emitmhlrb(rlow_rnew());
}ELSE {
unproxy();
emitamrgn(_rold);
emitrba(rlow_rnew());
emitincrgn(_rold);
emitamrgn(_rold);
emitrba(rhigh_rnew());
emitdecrgn(_rnew);
emitarb(rhigh_rnew());
emitmrgna(_rold);
emitdecrgn(_rold);
emitarb(rlow_rnew());
emitmrgna(_rold);
};
_fused = +FALSE; //ъюэхЎ т√ўшёыхэш
losea();
}
/////////////
EXPORT PROC initcode()
{
_jpflag = 0x00;
}
EXPORT PROC endcode()
{
asmc(+_TOKEOF);
varc(+_TOKEOF);
}
PROC initrgs()
{
rgs_initrgs();
_azused = +FALSE;
_fused = +FALSE; //ьюцэю ёфхырЄ№ юфэє яЁюЎхфєЁє initif фы ¤Єюую (т√ч√трЄ№ т эрўрых if, while, until)
_rproxy = 0x00;
}
PROC emitfunchead()
{
initrgs();
}
PROC setmainb()
{
setmainrg(); //Ёхчєы№ЄрЄ т RMAIN
_rproxy = _RMAIN;
}
PROC prefernoregs()
{
getnothing(); //Єръ т√уюфэхх inc/dec
}