//// imported
#ifdef TARGET_THUMB
#include "sizesarm.h"
#else
#ifdef TARGET_SCRIPT
#include "sizesspt.h"
#else
#ifdef TARGET_386
#include "sizes386.h"
#else
#include "sizesz80.h"
#endif
#endif
#endif
//#ifdef DOUBLES
//CONST BYTE _NRGS; //ўшёыю ЁхушёЄЁют
//яЁшюЁшЄхЄ√ ЁхушёЄЁют:
CONST BYTE _RMAIN; //ЁхушёЄЁ Ёхчєы№ЄрЄр ш 1-ую ярЁрьхЄЁр ёЄрэфрЁЄэ√ї ЇєэъЎшщ
CONST BYTE _RMAIN2; //ЁхушёЄЁ тЄюЁюую ёыютр Ёхчєы№ЄрЄр ш 2-ую ярЁрьхЄЁр ёЄрэфрЁЄэ√ї ЇєэъЎшщ
CONST BYTE _RMAIN3;
CONST BYTE _RMAIN4;
//#endif
PROC emitpoprg FORWARD(BYTE rnew);
PROC emitpushrg FORWARD(BYTE rnew);
PROC emitmovrg FORWARD(BYTE rsrc, BYTE rdest); //эх чрърч√трхЄ ш эх юётюсюцфрхЄ (ёь. moverg)
//#ifdef USE_COMMENTS
//;;PROC cmt FORWARD(CHAR c);
//;;PROC cmtstr FORWARD(PCHAR s);
//;;PROC cmtuint FORWARD(UINT i);
//;;PROC endcmt FORWARD();
//#endif
#ifdef USE_HINTS
;;PROC hint FORWARD(CHAR c);
;;PROC hintstr FORWARD(PCHAR s);
;;PROC hintuint FORWARD(UINT i);
;;PROC endhint FORWARD();
#endif
PROC err FORWARD(CHAR c);
PROC errstr FORWARD(PCHAR s);
PROC erruint FORWARD(UINT i);
PROC enderr FORWARD();
////
VAR BYTE _usedrg[16]/**_NRGS*/;
VAR BYTE _usedrgs;
VAR BOOL _usedr1; //todo ьрёёшт
VAR BOOL _usedr2;
VAR BOOL _usedr3;
VAR BOOL _usedr4;
VAR BYTE _rnew;
VAR BYTE _rold;
VAR BYTE _rold2;
VAR BYTE _rold3;
#ifdef USE_HINTS
;;PROC hintrg(PCHAR text, BYTE data) {
;; hintstr("//"); hintstr(text); hintuint(+(UINT)data);
;;}
;;PROC hintrgstate() {
;; hintrg("_fastrg4used=", +(BYTE)_usedr4); //bool!
;; hintrg("_fastrg3used=", +(BYTE)_usedr3); //bool!
;; hintrg("_fastrg2used=", +(BYTE)_usedr2); //bool!
;; hintrg("_fastrgused=" , +(BYTE)_usedr1); //bool!
;; endhint();
;; hintrg("[0]=", _usedrg[0]); //#!
;; hintrg("[1]=", _usedrg[1]); //#!
;; hintrg("[2]=", _usedrg[2]); //#!
;; hintrg("[3]=", _usedrg[3]); //#!
;; endhint();
;; hintrg("_usedrgs=", _usedrgs); //byte!
;; endhint();
;;}
#endif
//////////////////////////////////////////////////////////////////////////////////////////
//rg pool
//(т ЁхушёЄЁрї ьюцхЄ с√Є№ яєёЄю, тё╕ т ёЄхъх)
//яЁюЎхфєЁ√, эхфюёЄєяэ√х шч commands
PROC nouserg FORWARD(BYTE rnew); //Єюы№ъю ёсЁрё√трхЄ Їыру шёяюы№чютрэш ЁхушёЄЁр ш фтшурхЄ ёў╕Єўшъ!
FUNC BYTE userg FORWARD(BYTE rnew); //Єюы№ъю єёЄрэртыштрхЄ Їыру шёяюы№чютрэш ЁхушёЄЁр ш фтшурхЄ ёў╕Єўшъ!
PROC popgetrg FORWARD(BYTE rnew); //userg + фюсртыхэшх т юўхЁхф№ _usedrg ёэшчє + pop
//////////////////////////////////////////
//схч ьр°шээюую ъюфр
//яхЁхьхёЄшЄ№ фрээ√х т чрфрээ√щ ЁхушёЄЁ rdest
PROC moverg(BYTE rsrcindex, BYTE rdest) //чрюфэю чрърч√трхЄ ш юётюсюцфрхЄ ЁхушёЄЁ√
{
VAR BYTE rsrc;
rsrc = _usedrg[rsrcindex];
emitmovrg(rsrc,rdest); //todo шыш ёЁртэштрЄ№ rsrc!=rdest ЄєЄ?
_usedrg[rsrcindex] = rdest; //Єрь с√ыю rsrc
nouserg( rsrc ); //Єюы№ъю ёсЁрё√трхЄ Їыру шёяюы№чютрэш ЁхушёЄЁр ш фтшурхЄ ёў╕Єўшъ!
userg( rdest ); //Єюы№ъю єёЄрэртыштрхЄ Їыру шёяюы№чютрэш ЁхушёЄЁр ш фтшурхЄ ёў╕Єўшъ!
}
PROC pushtailrg()
{
VAR BYTE rnew;
VAR BYTE i;
#ifdef USE_HINTS
;; hintstr( "//pusholdestrg" ); endhint();
#endif
;; IF (_usedrgs<0x01) { errstr( "pusholdestrg _usedrgs=" ); erruint(+(UINT)_usedrgs); enderr();
;; }ELSE
{
rnew = _usedrg[ 0 ];
emitpushrg( rnew );
i = 0x01;
WHILE (i < _usedrgs/**_NRGS*/) { //ёў╕Єўшъ х∙╕ эх ёфтшэєЄ
_usedrg[i-0x01] = _usedrg[i];
INC i;
};
nouserg( rnew ); //Єюы№ъю ёсЁрё√трхЄ Їыру шёяюы№чютрэш ЁхушёЄЁр ш фтшурхЄ ёў╕Єўшъ!
};
#ifdef USE_HINTS
;; hintrgstate();
#endif
}
FUNC BYTE findrfree() //эрщЄш ётюсюфэ√щ (ъръ ьюцэю сюыхх с√ёЄЁ√щ) ЁхушёЄЁ ш тхЁэєЄ№ хую ъюф
{
VAR BYTE result;
IF (_usedrgs==_NRGS) pushtailrg();
IF (!_usedr1) {result = 0x01;
}ELSE IF (!_usedr2) {result = 0x02;
}ELSE IF (!_usedr3) {result = 0x03;
}ELSE result = 0x04;
RETURN result;
}
PROC nouserg(BYTE rnew) //Єюы№ъю ёсЁрё√трхЄ Їыру шёяюы№чютрэш ЁхушёЄЁр ш фтшурхЄ ёў╕Єўшъ!
{
;; IF (_usedrgs==0x00) { errstr( "nouserg _usedrgs=" ); erruint(+(UINT)_usedrgs); enderr();
;; }ELSE
{
IF (rnew==0x01) {_usedr1 = +FALSE;
}ELSE IF (rnew==0x02) {_usedr2 = +FALSE;
}ELSE IF (rnew==0x03) {_usedr3 = +FALSE;
}ELSE _usedr4 = +FALSE;
DEC _usedrgs;
};
}
FUNC BYTE userg(BYTE rnew) //Єюы№ъю єёЄрэртыштрхЄ Їыру шёяюы№чютрэш ЁхушёЄЁр ш фтшурхЄ ёў╕Єўшъ!
{
;; IF (_usedrgs>=_NRGS) { errstr( "userg _usedrgs=" ); erruint(+(UINT)_usedrgs); enderr();
;; }ELSE
{
IF (rnew==0x01) {_usedr1 = +TRUE;
}ELSE IF (rnew==0x02) {_usedr2 = +TRUE;
}ELSE IF (rnew==0x03) {_usedr3 = +TRUE;
}ELSE _usedr4 = +FALSE;
INC _usedrgs;
};
RETURN rnew;
}
FUNC BYTE getrg(BYTE rnew) //userg + фюсртыхэшх т юўхЁхф№ _usedrg
{
#ifdef USE_HINTS
;; hintrg("getrg ",rnew); endhint();
;; hintrgstate();
#endif
_usedrg[_usedrgs] = rnew;
userg( rnew ); //Єюы№ъю єёЄрэртыштрхЄ Їыру шёяюы№чютрэш ЁхушёЄЁр ш фтшурхЄ ёў╕Єўшъ!
#ifdef USE_HINTS
;; hintrgstate();
#endif
RETURN rnew;
}
PROC popgetrg(BYTE rnew) //userg + фюсртыхэшх т юўхЁхф№ _usedrg ёэшчє + pop
{
VAR BYTE i;
#ifdef USE_HINTS
;; hintstr( "//getoldestrg" ); endhint();
#endif
i = _usedrgs; //ёў╕Єўшъ х∙╕ эх ёфтшэєЄ //_NRGS-0x01;
WHILE (i>0x00) {
_usedrg[i] =_usedrg[i-0x01];
DEC i;
};
_usedrg[ 0 ] =rnew;
userg( rnew ); //Єюы№ъю єёЄрэртыштрхЄ Їыру шёяюы№чютрэш ЁхушёЄЁр ш фтшурхЄ ёў╕Єўшъ!
#ifdef USE_HINTS
;; hintrgstate();
#endif
emitpoprg(rnew);
}
//яюьхэ Є№ ьхёЄрьш фтр ЁхушёЄЁр эр тхЁ°шэх "ёЄхър" (ўшёЄю ыюушўхёъш)
PROC swaptop()
{
VAR BYTE rtmp;
IF ( _usedrgs==0x00 ) popgetrg(0x02);
IF ( _usedrgs==0x01 ) popgetrg( findrfree() );
rtmp = _usedrg[_usedrgs-0x02]; //old
_usedrg[_usedrgs-0x02] = _usedrg[_usedrgs-0x01]; //new => old
_usedrg[_usedrgs-0x01] = rtmp; //=> new
}
////////////////////////////////////////////////////////////////////////////////
//эхфюёЄєяэ√ шч ъюьяшы ЄюЁр, фюёЄєяэ√ шч commands
//схч ьр°шээюую ъюфр
//эх яш°єЄ т ...used (ъЁюьх initrgs)
//rg pool
PROC rgs_initrgs()
{
_usedr1 = +FALSE;
_usedr2 = +FALSE;
_usedr3 = +FALSE;
_usedr4 = +FALSE;
_usedrgs = 0x00;
}
PROC getrnew() //ёЄрЁрхЄё сЁрЄ№ new=FASTRG
//чфхё№ эхы№ч фхырЄ№ getnothing (шч-чр bytetoint, inttobyte)
{
#ifdef USE_HINTS
;; hintstr( "//getrnew" ); endhint();
#endif
IF ( _usedrgs==0x00 ) popgetrg(0x01);
_rnew = _usedrg[_usedrgs-0x01];
}
PROC getrold() //ёЄрЁрхЄё сЁрЄ№ old=FASTRG (т√уюфэю т√ч√трЄ№ фю getrnew фы +,-)
{
#ifdef USE_HINTS
;; hintstr( "//getrold" ); endhint();
#endif
IF ( _usedrgs==0x00 ) popgetrg(0x02);
IF ( _usedrgs==0x01 ) popgetrg( findrfree() );
_rold = _usedrg[_usedrgs-0x02];
}
PROC getrold2() //ёЄрЁрхЄё сЁрЄ№ old2=FASTRG (т√уюфэю т√ч√трЄ№ фю getrnew фы +,-)
{
#ifdef USE_HINTS
;; hintstr( "//getrold2" ); endhint();
#endif
IF ( _usedrgs==0x00 ) popgetrg(0x03);
IF ( _usedrgs==0x01 ) { //я√Єрхьё тч Є№ old=_RFAST2
IF ( _usedrg[0]!=0x02 ) {popgetrg(0x02);
}ELSE popgetrg( findrfree() );
};
IF ( _usedrgs==0x02 ) popgetrg( findrfree() );
_rold = _usedrg[_usedrgs-0x03];
}
PROC getrold3()
{
#ifdef USE_HINTS
;; hintstr( "//getrold3" ); endhint();
#endif
IF ( _usedrgs==0x00 ) popgetrg(0x03);
IF ( _usedrgs==0x01 ) popgetrg( findrfree() );
IF ( _usedrgs==0x02 ) popgetrg( findrfree() );
IF ( _usedrgs==0x03 ) popgetrg( findrfree() );
_rold = _usedrg[_usedrgs-0x04];
}
PROC freernew() //юётюсюфшЄ№ ЁхушёЄЁ ё тхЁ°шэ√ ёЄхър
{
#ifdef USE_HINTS
;; hintstr( "//freernew" ); endhint();
;; hintrgstate();
#endif
getrnew(); //р Єю тфЁєу эхЄ т ЁхушёЄЁрї
//юўхЁхф№ usedrgs ьюцэю эх ЄЁюурЄ№, яЁюёЄю ёфтшэєЄ№ уюыютє юўхЁхфш (ёў╕Єўшъ)
nouserg( _usedrg[_usedrgs-0x01] ); //Єюы№ъю ёсЁрё√трхЄ Їыру шёяюы№чютрэш ЁхушёЄЁр ш фтшурхЄ ёў╕Єўшъ!
#ifdef USE_HINTS
;; hintrgstate();
;; hintstr( "//end freernew" ); endhint();
#endif
}
//
//ёыхфє■∙шх яЁюЎхфєЁ√ эх юсЁр∙р■Єё тэю ъ ...used
//
PROC getnothing() //ёюїЁрэшЄ№ ЁхушёЄЁ√ ш срщЄ√ т ёЄхъх ш юётюсюфшЄ№
{
WHILE (_usedrgs>0x00) pushtailrg();
}
PROC getrfree() //чрэ Є№ ётюсюфэ√щ ЁхушёЄЁ ш тхЁэєЄ№ хую ъюф
//чфхё№ эхы№ч фхырЄ№ getnothing (шч-чр bytetoint, inttobyte)
{
#ifdef USE_HINTS
;; hintstr( "//getrfree" ); endhint();
#endif
_rnew = getrg(findrfree());
}
PROC getmainrg() //тч Є№ RMAIN=new ш юётюсюфшЄ№ юёЄры№э√х ЁхушёЄЁ√ (todo хёыш тё╕ т ЁхушёЄЁрї, Єю тёЄртшЄ№ RMAIN т oldestrg)
{
#ifdef USE_HINTS
;; hintstr( "//getmainrg" ); endhint();
#endif
IF ( _usedrgs==0x00 ) popgetrg( _RMAIN ); //emitpopoldestrg(RMAIN);
WHILE ( _usedrgs>0x01 ) pushtailrg();
//ЄхяхЁ№ чрэ Є Ёютэю 1 ЁхушёЄЁ
moverg( (0x00), _RMAIN ); //todo юяЄшьшчшЁютрЄ№ ўхЁхч ex de,hl
#ifdef USE_HINTS
;; hintstr( "//end getmainrg" ); endhint();
#endif
}
PROC getmain2rgs() //тч Є№ RMAIN=old, RMAIN2=new ш юётюсюфшЄ№ юёЄры№э√х ЁхушёЄЁ√ (todo хёыш тё╕ т ЁхушёЄЁрї, Єю тёЄртшЄ№ RMAIN, RMAIN2 т oldestrg)
{
#ifdef USE_HINTS
;; hintstr( "//getmain2rgs" ); endhint();
#endif
IF ( _usedrgs==0x00 ) popgetrg( _RMAIN2 );
IF ( _usedrgs==0x01 ) {
moverg( (0x00), _RMAIN2 ); //todo юяЄшьшчшЁютрЄ№ ўхЁхч ex de,hl
popgetrg( _RMAIN );
};
WHILE ( _usedrgs>0x02 ) pushtailrg();
//ЄхяхЁ№ чрэ Єю Ёютэю 2 ЁхушёЄЁр
//RMAIN, XXX: moverg((1),RMAIN2);
IF (_usedrg[0]==_RMAIN) {moverg( (0x01), _RMAIN2 );
}ELSE IF (_usedrg[1]==_RMAIN ) {
//RMAIN2, RMAIN: pusholdestrg;moverg((0),RMAIN2);popoldestrg(RMAIN);
IF (_usedrg[0]==_RMAIN2) {
pushtailrg();
moverg( (0x00), _RMAIN2 ); //todo юяЄшьшчшЁютрЄ№ ўхЁхч ex de,hl
popgetrg( _RMAIN );
}ELSE { //XXX, RMAIN: moverg((1),RMAIN2);moverg((0),RMAIN);
moverg( (0x01), _RMAIN2 ); //todo юяЄшьшчшЁютрЄ№ ўхЁхч ex de,hl //moverg((0),RMAIN) ёь. эшцх
};
};
//XXX, YYY: moverg((0),RMAIN);moverg((1),RMAIN2);
moverg( (0x00), _RMAIN ); //todo юяЄшьшчшЁютрЄ№ ўхЁхч ex de,hl
moverg( (0x01), _RMAIN2 ); //todo юяЄшьшчшЁютрЄ№ ўхЁхч ex de,hl
#ifdef USE_HINTS
;; hintstr( "//end getmain2rgs" ); endhint();
#endif
}
/**
PROC getmain3rgs()
{
#ifdef USE_HINTS
;; hintstr( "//getmain3rgs" ); endhint();
#endif
getmain2rgs();
getrold2();
#ifdef USE_HINTS
;; hintstr( "//end getmain3rgs" ); endhint();
#endif
}
*/
PROC getmain4rgs()
{
#ifdef USE_HINTS
;; hintstr( "//getmain4rgs" ); endhint();
#endif
IF ( (_usedrgs!=0x04)
|| (_usedrg[0]!=_RMAIN)
|| (_usedrg[1]!=_RMAIN2)
|| (_usedrg[2]!=_RMAIN3)
|| (_usedrg[3]!=_RMAIN4)
) {
getnothing(); //todo яю юфэюьє, ё яЁютхЁъющ эр ёююЄтхЄёЄтшх
popgetrg(_RMAIN4);
popgetrg(_RMAIN3);
popgetrg(_RMAIN2);
popgetrg(_RMAIN);
};
#ifdef USE_HINTS
;; hintstr( "//end getmain4rgs" ); endhint();
#endif
}
PROC setmainrg() //єёЄрэютшЄ№ яЁшчэръш, ъръ сєфЄю ь√ яюыєўшыш Ёхчєы№ЄрЄ т ЁхушёЄЁх
{ //ёхщўрё тёх ЁхушёЄЁ√ ёўшЄр■Єё ётюсюфэ√ьш
getrg( _RMAIN );
}
PROC setmain2rgs() //єёЄрэютшЄ№ яЁшчэръш, ъръ сєфЄю ь√ яюыєўшыш Ёхчєы№ЄрЄ т ЁхушёЄЁрї
{ //ёхщўрё тёх ЁхушёЄЁ√ ёўшЄр■Єё ётюсюфэ√ьш
getrg( _RMAIN );
getrg( _RMAIN2 );
}