//// 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 );
 
}