Login

Subversion Repositories NedoOS

Rev

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

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