Subversion Repositories NedoOS

Rev

Rev 8 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download

  1. //// imported
  2. #ifdef TARGET_THUMB
  3. #include "sizesarm.h"
  4. #else
  5. #include "sizesz80.h"
  6. #endif
  7.  
  8. //#ifdef DOUBLES
  9. //CONST BYTE _NRGS; //ўшёыю ЁхушёЄЁют
  10.  
  11.   //яЁшюЁшЄхЄ√ ЁхушёЄЁют:
  12. CONST BYTE _RMAIN; //ЁхушёЄЁ Ёхчєы№ЄрЄр ш 1-ую ярЁрьхЄЁр ёЄрэфрЁЄэ√ї ЇєэъЎшщ
  13. CONST BYTE _RMAIN2; //ЁхушёЄЁ тЄюЁюую ёыютр Ёхчєы№ЄрЄр ш 2-ую ярЁрьхЄЁр ёЄрэфрЁЄэ√ї ЇєэъЎшщ
  14. CONST BYTE _RMAIN3;
  15. CONST BYTE _RMAIN4;
  16. //#endif
  17.  
  18. PROC emitpoprg FORWARD(BYTE rnew);
  19. PROC emitpushrg FORWARD(BYTE rnew);
  20. PROC emitmovrg FORWARD(BYTE rsrc, BYTE rdest); //эх чрърч√трхЄ ш эх юётюсюцфрхЄ (ёь. moverg)
  21.  
  22. //#ifdef USE_COMMENTS
  23. //;;PROC cmt FORWARD(CHAR c);
  24. //;;PROC cmtstr FORWARD(PCHAR s);
  25. //;;PROC cmtuint FORWARD(UINT i);
  26. //;;PROC endcmt FORWARD();
  27. //#endif
  28. #ifdef USE_HINTS
  29. ;;PROC hint FORWARD(CHAR c);
  30. ;;PROC hintstr FORWARD(PCHAR s);
  31. ;;PROC hintuint FORWARD(UINT i);
  32. ;;PROC endhint FORWARD();
  33. #endif
  34. PROC err FORWARD(CHAR c);
  35. PROC errstr FORWARD(PCHAR s);
  36. PROC erruint FORWARD(UINT i);
  37. PROC enderr FORWARD();
  38.  
  39. ////
  40. VAR BYTE _usedrg[16]/**_NRGS*/;
  41. VAR BYTE _usedrgs;
  42. VAR BOOL _usedr1; //todo ьрёёшт
  43. VAR BOOL _usedr2;
  44. VAR BOOL _usedr3;
  45. VAR BOOL _usedr4;
  46.  
  47. VAR BYTE _rnew;
  48. VAR BYTE _rold;
  49. VAR BYTE _rold2;
  50. VAR BYTE _rold3;
  51.  
  52. #ifdef USE_HINTS
  53. ;;PROC hintrg(PCHAR text, BYTE data) {
  54. ;;  hintstr("//"); hintstr(text); hintuint(+(UINT)data);
  55. ;;}
  56.  
  57. ;;PROC hintrgstate() {
  58. ;;  hintrg("_fastrg4used=", +(BYTE)_usedr4); //bool!
  59. ;;  hintrg("_fastrg3used=", +(BYTE)_usedr3); //bool!
  60. ;;  hintrg("_fastrg2used=", +(BYTE)_usedr2); //bool!
  61. ;;  hintrg("_fastrgused=" , +(BYTE)_usedr1); //bool!
  62. ;;  endhint();
  63. ;;  hintrg("[0]=", _usedrg[0]); //#!
  64. ;;  hintrg("[1]=", _usedrg[1]); //#!
  65. ;;  hintrg("[2]=", _usedrg[2]); //#!
  66. ;;  hintrg("[3]=", _usedrg[3]); //#!
  67. ;;  endhint();
  68. ;;  hintrg("_usedrgs=", _usedrgs); //byte!
  69. ;;  endhint();
  70. ;;}
  71. #endif
  72.  
  73. //////////////////////////////////////////////////////////////////////////////////////////
  74. //rg pool
  75. //(т ЁхушёЄЁрї ьюцхЄ с√Є№ яєёЄю, тё╕ т ёЄхъх)
  76. //яЁюЎхфєЁ√, эхфюёЄєяэ√х шч commands
  77.  
  78. PROC nouserg FORWARD(BYTE rnew);  //Єюы№ъю ёсЁрё√трхЄ Їыру шёяюы№чютрэш  ЁхушёЄЁр ш фтшурхЄ ёў╕Єўшъ!
  79. FUNC BYTE userg FORWARD(BYTE rnew);  //Єюы№ъю єёЄрэртыштрхЄ Їыру шёяюы№чютрэш  ЁхушёЄЁр ш фтшурхЄ ёў╕Єўшъ!
  80. PROC popgetrg FORWARD(BYTE rnew);  //userg + фюсртыхэшх т юўхЁхф№ _usedrg ёэшчє + pop
  81.  
  82. //////////////////////////////////////////
  83. //схч ьр°шээюую ъюфр
  84.  
  85. //яхЁхьхёЄшЄ№ фрээ√х т чрфрээ√щ ЁхушёЄЁ rdest
  86. PROC moverg(BYTE rsrcindex, BYTE rdest) //чрюфэю чрърч√трхЄ ш юётюсюцфрхЄ ЁхушёЄЁ√
  87. {
  88. VAR BYTE rsrc;
  89.   rsrc = _usedrg[rsrcindex];
  90.   emitmovrg(rsrc,rdest); //todo шыш ёЁртэштрЄ№ rsrc!=rdest ЄєЄ?
  91.   _usedrg[rsrcindex] = rdest; //Єрь с√ыю rsrc
  92.   nouserg( rsrc ); //Єюы№ъю ёсЁрё√трхЄ Їыру шёяюы№чютрэш  ЁхушёЄЁр ш фтшурхЄ ёў╕Єўшъ!
  93.   userg( rdest ); //Єюы№ъю єёЄрэртыштрхЄ Їыру шёяюы№чютрэш  ЁхушёЄЁр ш фтшурхЄ ёў╕Єўшъ!
  94. }
  95.  
  96. PROC pushtailrg()
  97. {
  98. VAR BYTE rnew;
  99. VAR BYTE i;
  100. #ifdef USE_HINTS
  101. ;;  hintstr( "//pusholdestrg" ); endhint();
  102. #endif
  103. ;;  IF (_usedrgs<0x01) { errstr( "pusholdestrg _usedrgs=" ); erruint(+(UINT)_usedrgs); enderr();
  104. ;;  }ELSE
  105.   {
  106.     rnew = _usedrg[ 0 ];
  107.     emitpushrg( rnew );
  108.     i = 0x01;
  109.     WHILE (i < _usedrgs/**_NRGS*/) { //ёў╕Єўшъ х∙╕ эх ёфтшэєЄ
  110.       _usedrg[i-0x01] = _usedrg[i];
  111.       INC i;
  112.     };
  113.     nouserg( rnew ); //Єюы№ъю ёсЁрё√трхЄ Їыру шёяюы№чютрэш  ЁхушёЄЁр ш фтшурхЄ ёў╕Єўшъ!
  114.   };
  115. #ifdef USE_HINTS
  116. ;;  hintrgstate();
  117. #endif
  118. }
  119.  
  120. FUNC BYTE findrfree() //эрщЄш ётюсюфэ√щ (ъръ ьюцэю сюыхх с√ёЄЁ√щ) ЁхушёЄЁ ш тхЁэєЄ№ хую ъюф
  121. {
  122. VAR BYTE result;
  123.   IF (_usedrgs==_NRGS) pushtailrg();
  124.   IF       (!_usedr1) {result = 0x01;
  125.   }ELSE IF (!_usedr2) {result = 0x02;
  126.   }ELSE IF (!_usedr3) {result = 0x03;
  127.   }ELSE result = 0x04;
  128.   RETURN result;
  129. }
  130.  
  131. PROC nouserg(BYTE rnew) //Єюы№ъю ёсЁрё√трхЄ Їыру шёяюы№чютрэш  ЁхушёЄЁр ш фтшурхЄ ёў╕Єўшъ!
  132. {
  133. ;;  IF (_usedrgs==0x00) { errstr( "nouserg _usedrgs=" ); erruint(+(UINT)_usedrgs); enderr();
  134. ;;  }ELSE
  135.   {
  136.     IF       (rnew==0x01) {_usedr1 = +FALSE;
  137.     }ELSE IF (rnew==0x02) {_usedr2 = +FALSE;
  138.     }ELSE IF (rnew==0x03) {_usedr3 = +FALSE;
  139.     }ELSE _usedr4 = +FALSE;
  140.     DEC _usedrgs;
  141.   };
  142. }
  143.  
  144. FUNC BYTE userg(BYTE rnew) //Єюы№ъю єёЄрэртыштрхЄ Їыру шёяюы№чютрэш  ЁхушёЄЁр ш фтшурхЄ ёў╕Єўшъ!
  145. {
  146. ;;  IF (_usedrgs>=_NRGS) { errstr( "userg _usedrgs=" ); erruint(+(UINT)_usedrgs); enderr();
  147. ;;  }ELSE
  148.   {
  149.     IF       (rnew==0x01) {_usedr1 = +TRUE;
  150.     }ELSE IF (rnew==0x02) {_usedr2 = +TRUE;
  151.     }ELSE IF (rnew==0x03) {_usedr3 = +TRUE;
  152.     }ELSE _usedr4 = +FALSE;
  153.     INC _usedrgs;
  154.   };
  155.   RETURN rnew;
  156. }
  157.  
  158. FUNC BYTE getrg(BYTE rnew) //userg + фюсртыхэшх т юўхЁхф№ _usedrg
  159. {
  160. #ifdef USE_HINTS
  161. ;;  hintrg("getrg ",rnew); endhint();
  162. ;;  hintrgstate();
  163. #endif
  164.   _usedrg[_usedrgs] = rnew;
  165.   userg( rnew ); //Єюы№ъю єёЄрэртыштрхЄ Їыру шёяюы№чютрэш  ЁхушёЄЁр ш фтшурхЄ ёў╕Єўшъ!
  166. #ifdef USE_HINTS
  167. ;;  hintrgstate();
  168. #endif
  169.   RETURN rnew;
  170. }
  171.  
  172. PROC popgetrg(BYTE rnew) //userg + фюсртыхэшх т юўхЁхф№ _usedrg ёэшчє + pop
  173. {
  174. VAR BYTE i;
  175. #ifdef USE_HINTS
  176. ;;  hintstr( "//getoldestrg" ); endhint();
  177. #endif
  178.   i = _usedrgs; //ёў╕Єўшъ х∙╕ эх ёфтшэєЄ //_NRGS-0x01;
  179.   WHILE (i>0x00) {
  180.     _usedrg[i] =_usedrg[i-0x01];
  181.     DEC i;
  182.   };
  183.   _usedrg[ 0 ] =rnew;
  184.   userg( rnew ); //Єюы№ъю єёЄрэртыштрхЄ Їыру шёяюы№чютрэш  ЁхушёЄЁр ш фтшурхЄ ёў╕Єўшъ!
  185. #ifdef USE_HINTS
  186. ;;  hintrgstate();
  187. #endif
  188.   emitpoprg(rnew);
  189. }
  190.  
  191. //яюьхэ Є№ ьхёЄрьш фтр ЁхушёЄЁр эр тхЁ°шэх "ёЄхър" (ўшёЄю ыюушўхёъш)
  192. PROC swaptop()
  193. {
  194. VAR BYTE rtmp;
  195.   IF ( _usedrgs==0x00 ) popgetrg(0x02);
  196.   IF ( _usedrgs==0x01 ) popgetrg( findrfree() );
  197.   rtmp = _usedrg[_usedrgs-0x02]; //old
  198.   _usedrg[_usedrgs-0x02] = _usedrg[_usedrgs-0x01]; //new => old
  199.   _usedrg[_usedrgs-0x01] = rtmp; //=> new
  200. }
  201.  
  202. ////////////////////////////////////////////////////////////////////////////////
  203. //эхфюёЄєяэ√ шч ъюьяшы ЄюЁр, фюёЄєяэ√ шч commands
  204. //схч ьр°шээюую ъюфр
  205. //эх яш°єЄ т ...used (ъЁюьх initrgs)
  206.  
  207. //rg pool
  208.  
  209. PROC rgs_initrgs()
  210. {
  211.   _usedr1 = +FALSE;
  212.   _usedr2 = +FALSE;
  213.   _usedr3 = +FALSE;
  214.   _usedr4 = +FALSE;
  215.   _usedrgs = 0x00;
  216. }
  217.  
  218. PROC getrnew() //ёЄрЁрхЄё  сЁрЄ№ new=FASTRG
  219. //чфхё№ эхы№ч  фхырЄ№ getnothing (шч-чр bytetoint, inttobyte)
  220. {
  221. #ifdef USE_HINTS
  222. ;;  hintstr( "//getrnew" ); endhint();
  223. #endif
  224.   IF ( _usedrgs==0x00 ) popgetrg(0x01);
  225.   _rnew = _usedrg[_usedrgs-0x01];
  226. }
  227.  
  228. PROC getrold() //ёЄрЁрхЄё  сЁрЄ№ old=FASTRG (т√уюфэю т√ч√трЄ№ фю getrnew фы  +,-)
  229. {
  230. #ifdef USE_HINTS
  231. ;;  hintstr( "//getrold" ); endhint();
  232. #endif
  233.   IF ( _usedrgs==0x00 ) popgetrg(0x02);
  234.   IF ( _usedrgs==0x01 ) popgetrg( findrfree() );
  235.   _rold = _usedrg[_usedrgs-0x02];
  236. }
  237.  
  238. PROC getrold2() //ёЄрЁрхЄё  сЁрЄ№ old2=FASTRG (т√уюфэю т√ч√трЄ№ фю getrnew фы  +,-)
  239. {
  240. #ifdef USE_HINTS
  241. ;;  hintstr( "//getrold2" ); endhint();
  242. #endif
  243.   IF ( _usedrgs==0x00 ) popgetrg(0x03);
  244.   IF ( _usedrgs==0x01 ) { //я√Єрхьё  тч Є№ old=_RFAST2
  245.     IF ( _usedrg[0]!=0x02 ) {popgetrg(0x02);
  246.     }ELSE popgetrg( findrfree() );
  247.   };
  248.   IF ( _usedrgs==0x02 ) popgetrg( findrfree() );
  249.   _rold = _usedrg[_usedrgs-0x03];
  250. }
  251.  
  252. PROC getrold3()
  253. {
  254. #ifdef USE_HINTS
  255. ;;  hintstr( "//getrold3" ); endhint();
  256. #endif
  257.   IF ( _usedrgs==0x00 ) popgetrg(0x03);
  258.   IF ( _usedrgs==0x01 ) popgetrg( findrfree() );
  259.   IF ( _usedrgs==0x02 ) popgetrg( findrfree() );
  260.   IF ( _usedrgs==0x03 ) popgetrg( findrfree() );
  261.   _rold = _usedrg[_usedrgs-0x04];
  262. }
  263.  
  264. PROC freernew() //юётюсюфшЄ№ ЁхушёЄЁ ё тхЁ°шэ√ ёЄхър
  265. {
  266. #ifdef USE_HINTS
  267. ;;  hintstr( "//freernew" ); endhint();
  268. ;;  hintrgstate();
  269. #endif
  270.   getrnew(); //р Єю тфЁєу эхЄ т ЁхушёЄЁрї
  271.   //юўхЁхф№ usedrgs ьюцэю эх ЄЁюурЄ№, яЁюёЄю ёфтшэєЄ№ уюыютє юўхЁхфш (ёў╕Єўшъ)
  272.   nouserg( _usedrg[_usedrgs-0x01] ); //Єюы№ъю ёсЁрё√трхЄ Їыру шёяюы№чютрэш  ЁхушёЄЁр ш фтшурхЄ ёў╕Єўшъ!
  273. #ifdef USE_HINTS
  274. ;;  hintrgstate();
  275. ;;  hintstr( "//end freernew" ); endhint();
  276. #endif
  277. }
  278.  
  279. //
  280. //ёыхфє■∙шх яЁюЎхфєЁ√ эх юсЁр∙р■Єё   тэю ъ ...used
  281. //
  282. PROC getnothing() //ёюїЁрэшЄ№ ЁхушёЄЁ√ ш срщЄ√ т ёЄхъх ш юётюсюфшЄ№
  283. {
  284.   WHILE (_usedrgs>0x00) pushtailrg();
  285. }
  286.  
  287. PROC getrfree() //чрэ Є№ ётюсюфэ√щ ЁхушёЄЁ ш тхЁэєЄ№ хую ъюф
  288. //чфхё№ эхы№ч  фхырЄ№ getnothing (шч-чр bytetoint, inttobyte)
  289. {
  290. #ifdef USE_HINTS
  291. ;;  hintstr( "//getrfree" ); endhint();
  292. #endif
  293.   _rnew = getrg(findrfree());
  294. }
  295.  
  296. PROC getmainrg() //тч Є№ RMAIN=new ш юётюсюфшЄ№ юёЄры№э√х ЁхушёЄЁ√ (todo хёыш тё╕ т ЁхушёЄЁрї, Єю тёЄртшЄ№ RMAIN т oldestrg)
  297. {
  298. #ifdef USE_HINTS
  299. ;;  hintstr( "//getmainrg" ); endhint();
  300. #endif
  301.   IF ( _usedrgs==0x00 ) popgetrg( _RMAIN ); //emitpopoldestrg(RMAIN);
  302.   WHILE ( _usedrgs>0x01 ) pushtailrg();
  303.   //ЄхяхЁ№ чрэ Є Ёютэю 1 ЁхушёЄЁ
  304.   moverg( (0x00), _RMAIN ); //todo юяЄшьшчшЁютрЄ№ ўхЁхч ex de,hl
  305. #ifdef USE_HINTS
  306. ;;  hintstr( "//end getmainrg" ); endhint();
  307. #endif
  308. }
  309.  
  310. PROC getmain2rgs() //тч Є№ RMAIN=old, RMAIN2=new ш юётюсюфшЄ№ юёЄры№э√х ЁхушёЄЁ√ (todo хёыш тё╕ т ЁхушёЄЁрї, Єю тёЄртшЄ№ RMAIN, RMAIN2 т oldestrg)
  311. {
  312. #ifdef USE_HINTS
  313. ;;  hintstr( "//getmain2rgs" ); endhint();
  314. #endif
  315.   IF ( _usedrgs==0x00 ) popgetrg( _RMAIN2 );
  316.   IF ( _usedrgs==0x01 ) {
  317.     moverg( (0x00), _RMAIN2 ); //todo юяЄшьшчшЁютрЄ№ ўхЁхч ex de,hl
  318.     popgetrg( _RMAIN );
  319.   };
  320.   WHILE ( _usedrgs>0x02 ) pushtailrg();
  321.   //ЄхяхЁ№ чрэ Єю Ёютэю 2 ЁхушёЄЁр
  322.   //RMAIN, XXX: moverg((1),RMAIN2);
  323.   IF (_usedrg[0]==_RMAIN) {moverg( (0x01), _RMAIN2 );
  324.   }ELSE IF (_usedrg[1]==_RMAIN ) {
  325.     //RMAIN2, RMAIN: pusholdestrg;moverg((0),RMAIN2);popoldestrg(RMAIN);
  326.     IF (_usedrg[0]==_RMAIN2) {
  327.       pushtailrg();
  328.       moverg( (0x00), _RMAIN2 ); //todo юяЄшьшчшЁютрЄ№ ўхЁхч ex de,hl
  329.       popgetrg( _RMAIN );
  330.     }ELSE { //XXX, RMAIN: moverg((1),RMAIN2);moverg((0),RMAIN);
  331.      moverg( (0x01), _RMAIN2 ); //todo юяЄшьшчшЁютрЄ№ ўхЁхч ex de,hl //moverg((0),RMAIN) ёь. эшцх
  332.     };
  333.   };
  334.   //XXX, YYY: moverg((0),RMAIN);moverg((1),RMAIN2);
  335.   moverg( (0x00), _RMAIN ); //todo юяЄшьшчшЁютрЄ№ ўхЁхч ex de,hl
  336.   moverg( (0x01), _RMAIN2 ); //todo юяЄшьшчшЁютрЄ№ ўхЁхч ex de,hl
  337. #ifdef USE_HINTS
  338. ;;  hintstr( "//end getmain2rgs" ); endhint();
  339. #endif
  340. }
  341. /**
  342. PROC getmain3rgs()
  343. {
  344. #ifdef USE_HINTS
  345. ;;  hintstr( "//getmain3rgs" ); endhint();
  346. #endif
  347.   getmain2rgs();
  348.   getrold2();
  349. #ifdef USE_HINTS
  350. ;;  hintstr( "//end getmain3rgs" ); endhint();
  351. #endif
  352. }
  353. */
  354. PROC getmain4rgs()
  355. {
  356. #ifdef USE_HINTS
  357. ;;  hintstr( "//getmain4rgs" ); endhint();
  358. #endif
  359.   IF ( (_usedrgs!=0x04)
  360.     || (_usedrg[0]!=_RMAIN)
  361.     || (_usedrg[1]!=_RMAIN2)
  362.     || (_usedrg[2]!=_RMAIN3)
  363.     || (_usedrg[3]!=_RMAIN4)
  364.      ) {
  365.     getnothing(); //todo яю юфэюьє, ё яЁютхЁъющ эр ёююЄтхЄёЄтшх
  366.     popgetrg(_RMAIN4);
  367.     popgetrg(_RMAIN3);
  368.     popgetrg(_RMAIN2);
  369.     popgetrg(_RMAIN);
  370.   };
  371. #ifdef USE_HINTS
  372. ;;  hintstr( "//end getmain4rgs" ); endhint();
  373. #endif
  374. }
  375.  
  376. PROC setmainrg() //єёЄрэютшЄ№ яЁшчэръш, ъръ сєфЄю ь√ яюыєўшыш Ёхчєы№ЄрЄ т ЁхушёЄЁх
  377. { //ёхщўрё тёх ЁхушёЄЁ√ ёўшЄр■Єё  ётюсюфэ√ьш
  378.   getrg( _RMAIN );
  379. }
  380.  
  381. PROC setmain2rgs() //єёЄрэютшЄ№ яЁшчэръш, ъръ сєфЄю ь√ яюыєўшыш Ёхчєы№ЄрЄ т ЁхушёЄЁрї
  382. { //ёхщўрё тёх ЁхушёЄЁ√ ёўшЄр■Єё  ётюсюфэ√ьш
  383.   getrg( _RMAIN );
  384.   getrg( _RMAIN2 );
  385. }
  386.  
  387.