Subversion Repositories NedoOS

Rev

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

  1. //// ьр°шээючртшёшь√х яЁюЎхфєЁ√ ш юс· тыхэш 
  2.  
  3. //ЁхушёЄЁ яю ьрёъх 0x3f яЁштюфшЄ ix/iy ъ hl
  4. CONST BYTE _ASMRBIXADD = 0x40;
  5. CONST BYTE _ASMRBCODE_B = 0x00;
  6. CONST BYTE _ASMRBCODE_C = 0x08;
  7. CONST BYTE _ASMRBCODE_D = 0x10;
  8. CONST BYTE _ASMRBCODE_E = 0x18;
  9. CONST BYTE _ASMRBCODE_H = 0x20;
  10. CONST BYTE _ASMRBCODE_L = 0x28;
  11. CONST BYTE _ASMRBCODE_A = 0x38;
  12. CONST BYTE _ASMRBCODE_HX = 0x60;
  13. CONST BYTE _ASMRBCODE_LX = 0x68;
  14. CONST BYTE _ASMRBCODE_HY = 0xa0;
  15. CONST BYTE _ASMRBCODE_LY = 0xa8;
  16. CONST BYTE _ASMRBCODE_I = 0x00;
  17. CONST BYTE _ASMRBCODE_R = 0x08;
  18.  
  19. CONST BYTE _ASMRPIXADD = 0x40;
  20. CONST BYTE _ASMRPCODE_BC = 0x00;
  21. CONST BYTE _ASMRPCODE_DE = 0x10;
  22. CONST BYTE _ASMRPCODE_HL = 0x20;
  23. CONST BYTE _ASMRPCODE_SP = 0x30;
  24. CONST BYTE _ASMRPCODE_AF = 0x30;
  25. CONST BYTE _ASMRPCODE_IX = 0x60;
  26. CONST BYTE _ASMRPCODE_IY = 0xa0;
  27.  
  28. //CONST UINT _BASEADDR = 0x6000;
  29. //VAR UINT _baseaddr;
  30.  
  31. PROC asmbytepopvalue()
  32. {
  33.   DEC _nvalues;
  34.   IF (_asms) {
  35.     ;;writefout((BYTE)_value[_nvalues]/**+(BYTE)asmpopvalue()*/); //compatible version
  36.     /*writefout(*(PBYTE)&_value[_nvalues]);*/ //fast version (little endian)
  37.   };
  38.   INC _curaddr;
  39. }
  40.  
  41. PROC asmwordpopvalue() //Ёрчэр  ЁрчЁ фэюёЄ№ UINT/DW
  42. {
  43. VAR UINT uinttempvalue;
  44.   DEC _nvalues;
  45.   IF (_asms) {
  46.     //яш°хь фрээ√х ЁхыюърЎшш яЁш эхэєыхтюь _isaddr!
  47.     IF (_isaddr!=0x00) {
  48.       uinttempvalue = _curaddr+_curshift-_curbegin; //_curaddr+_curshift-_BASEADDR;
  49.       fwrite((PBYTE)&uinttempvalue, 2, 1, _forg);
  50.     }; //
  51.     ;;uinttempvalue = +(UINT)_value[_nvalues]; //+(UINT)asmpopvalue()
  52.     ;;writefout(+(BYTE)uinttempvalue); //compatible version (эх _SIZEOF_UINT, Є.ъ. ЄєЄ эрфю ЁрчьхЁ фы  ЄрЁухЄр!)
  53.     ;;writefout(+(BYTE)(uinttempvalue>>8)); //compatible version (эх _SIZEOF_UINT, Є.ъ. ЄєЄ эрфю ЁрчьхЁ фы  ЄрЁухЄр!)
  54.     /*fwrite((PBYTE)&_value[_nvalues], 2, 1, _fout);*/ //fast version (little endian) (эх _SIZEOF_UINT, Є.ъ. ЄєЄ эрфю ЁрчьхЁ фы  ЄрЁухЄр!)
  55.   };
  56.   _curaddr = _curaddr + 2; //эх _SIZEOF_UINT, Є.ъ. ЄєЄ эрфю ЁрчьхЁ фы  ЄрЁухЄр!
  57. }
  58.  
  59. PROC asmlong(LONG value) //Ёрчэр  ЁрчЁ фэюёЄ№ LONG/DL
  60. {
  61.   ;;asmbyte(+(BYTE)value); //compatible version
  62.   ;;asmbyte(+(BYTE)(+(UINT)value>>8)); //compatible version
  63.   ;;asmbyte(+(BYTE)(value>>16L)); //compatible version
  64.   ;;asmbyte(+(BYTE)(value>>24L)); //compatible version
  65.   /*fwrite(+(PBYTE)&value, 4, 1, _fout);*/ //fast version (little endian) (эх _SIZEOF_LONG, Є.ъ. ЄєЄ эрфю ЁрчьхЁ фы  ЄрЁухЄр!)
  66.   /*_curaddr = _curaddr + 4;*/ //fast version (little endian) (эх _SIZEOF_LONG, Є.ъ. ЄєЄ эрфю ЁрчьхЁ фы  ЄрЁухЄр!)
  67. }
  68.  
  69. PROC asmorgword(LONG addr) //Ёрчэр  ЁрчЁ фэюёЄ№ POINTER
  70. {
  71. //todo ORG
  72. //  IF (_asms) {
  73. //    ;;writebyte(_forg, +(BYTE)addr); //compatible version
  74. //    ;;writebyte(_forg, +(BYTE)(+(UINT)addr>>8)); //compatible version
  75. //    /*fwrite(+(PBYTE)&addr, 2, 1, _forg);*/ //fast version (little endian) (эх _SIZEOF_UINT, Є.ъ. ЄєЄ эрфю ЁрчьхЁ фы  ЄрЁухЄр!)
  76. //  };
  77. }
  78.  
  79. PROC asmdisp(INT ivalue) //фы  $+d ш ix+d
  80. {
  81.   IF (+(UINT)(ivalue + +(INT)0x0080) >= 0x0100) {
  82.     errstr("far +d"); enderr();
  83.   };
  84.   asmbyte(+(BYTE)ivalue); //юс чрЄхы№эю чряшёрЄ№, шэрўх яюхфєЄ рфЁхёр!
  85. }
  86.  
  87. PROC asmdisppopvalue() //фы  jr ш ix+d
  88. {
  89.   asmdisp(+(INT)asmpopvalue());
  90. }
  91.  
  92. PROC asmrb_ixiyprefix() //ёухэхЁшЁютрЄ№ яЁхЇшъё dd/fd ш яЁштхёЄш _reg ъ h/l
  93. {
  94. //  IF       (_reg==+_ASMRBCODE_HX) {asmbyte(0xdd); //_reg = +_ASMRBCODE_H;
  95. //  }ELSE IF (_reg==+_ASMRBCODE_LX) {asmbyte(0xdd); //_reg = +_ASMRBCODE_L;
  96. //  }ELSE IF (_reg==+_ASMRBCODE_HY) {asmbyte(0xfd); //_reg = +_ASMRBCODE_H;
  97. //  }ELSE /**IF (_reg==+_ASMRBCODE_LY)*/{asmbyte(0xfd); //_reg = +_ASMRBCODE_L;
  98. //  };
  99.   IF (_reg < +_ASMRBCODE_HY) {asmbyte(0xdd);
  100.   }ELSE asmbyte(0xfd);
  101.   _reg = _reg&0x3f;
  102. }
  103.  
  104. PROC asmoldrb_ixiyprefix() //ёухэхЁшЁютрЄ№ яЁхЇшъё dd/fd ш яЁштхёЄш _reg ъ h/l
  105. {
  106. //  IF       (_oldreg==+_ASMRBCODE_HX) {asmbyte(0xdd); //_oldreg = +_ASMRBCODE_H;
  107. //  }ELSE IF (_oldreg==+_ASMRBCODE_LX) {asmbyte(0xdd); //_oldreg = +_ASMRBCODE_L;
  108. //  }ELSE IF (_oldreg==+_ASMRBCODE_HY) {asmbyte(0xfd); //_oldreg = +_ASMRBCODE_H;
  109. //  }ELSE /**IF (_oldreg==+_ASMRBCODE_LY)*/{asmbyte(0xfd); //_oldreg = +_ASMRBCODE_L;
  110. //  };
  111.   IF (_oldreg < +_ASMRBCODE_HY) {asmbyte(0xdd);
  112.   }ELSE asmbyte(0xfd);
  113.   _oldreg = _oldreg&0x3f;
  114. }
  115.  
  116. PROC asmrbrb_ixiyprefix() //ёухэхЁшЁютрЄ№ яЁхЇшъё dd/fd ш яЁштхёЄш _oldreg,_reg ъ h/l
  117. //ё яЁютхЁъющ ю°шсюъ ?x,?y / ?y,?x / ?x/y,h/l / h/l,?x/y
  118. {
  119. VAR BYTE prefix1;
  120.   prefix1 = 0x00; //needed
  121.   IF (_oldreg >= +_ASMRBCODE_HY) {
  122.     prefix1=0xfd;
  123.     goto test1;
  124.   }ELSE IF (_oldreg >= +_ASMRBCODE_HX) {
  125.     prefix1=0xdd;
  126.     test1:
  127.     IF (_reg==+_ASMRBCODE_H) errwrongreg(); //?x/y, h
  128.     IF (_reg==+_ASMRBCODE_L) errwrongreg(); //?x/y, l
  129.     asmbyte(prefix1);
  130.   };
  131.   IF (_reg >= +_ASMRBCODE_HY) {
  132.     IF (prefix1!=0xfd) {
  133.       asmbyte(0xfd);
  134.       IF (prefix1==0xdd) errwrongreg();
  135.     };
  136.     goto test2;
  137.   }ELSE IF (_reg >= +_ASMRBCODE_HX) {
  138.     IF (prefix1!=0xdd) {
  139.       asmbyte(0xdd);
  140.       IF (prefix1==0xfd) errwrongreg();
  141.     };
  142.     test2:
  143.     IF (_oldreg==+_ASMRBCODE_H) errwrongreg(); //h, ?x/y
  144.     IF (_oldreg==+_ASMRBCODE_L) errwrongreg(); //l, ?x/y
  145.     _reg = _reg&0x3f;
  146.   };
  147.   _oldreg = _oldreg&0x3f;
  148. }
  149.  
  150. PROC asmrp_ixiyprefix() //ёухэхЁшЁютрЄ№ яЁхЇшъё dd/fd ш яЁштхёЄш _reg ъ hl
  151. {
  152.   IF (_reg==+_ASMRPCODE_IX) {asmbyte(0xdd); //_reg = +_ASMRPCODE_HL;
  153.   }ELSE /*IF (_reg==+_ASMRPCODE_IY)*/{asmbyte(0xfd); //_reg = +_ASMRPCODE_HL;
  154.   };
  155.   _reg = +_ASMRPCODE_HL;
  156. }
  157.  
  158. PROC asmoldrp_ixiyprefix() //ёухэхЁшЁютрЄ№ яЁхЇшъё dd/fd ш яЁштхёЄш _reg ъ hl
  159. {
  160.   IF (_oldreg==+_ASMRPCODE_IX) {asmbyte(0xdd); //_oldreg = +_ASMRPCODE_HL;
  161.   }ELSE /*IF (_oldreg==+_ASMRPCODE_IY)*/{asmbyte(0xfd); //_oldreg = +_ASMRPCODE_HL;
  162.   };
  163.   _oldreg = +_ASMRPCODE_HL;
  164. }
  165.  
  166. PROC asmrprp_ixiyprefix() //ёухэхЁшЁютрЄ№ яЁхЇшъё dd/fd ш яЁштхёЄш _oldreg,_reg ъ hl
  167. //ё яЁютхЁъющ ю°шсюъ ix,iy / iy,ix / ix/iy,hl / hl,ix/iy
  168. {
  169. VAR BYTE prefix1;
  170.   prefix1=0x00; //needed
  171.   IF (_oldreg==+_ASMRPCODE_IX) {
  172.     prefix1=0xdd;
  173.     goto test1;
  174.   }ELSE IF (_oldreg==+_ASMRPCODE_IY) {
  175.     prefix1=0xfd;
  176.     test1:
  177.     IF (_reg==+_ASMRPCODE_HL) errwrongreg(); //ix/iy, hl
  178.     asmbyte(prefix1);
  179.   };//ELSE prefix1=0x00;
  180.   IF (_reg==+_ASMRPCODE_IX) {
  181.     IF (prefix1!=0xdd) {
  182.       asmbyte(0xdd);
  183.       IF (prefix1==0xfd) errwrongreg();
  184.     };
  185.     goto test2;
  186.   }ELSE IF (_reg==+_ASMRPCODE_IY) {
  187.     IF (prefix1!=0xfd) {
  188.       asmbyte(0xfd);
  189.       IF (prefix1==0xdd) errwrongreg();
  190.     };
  191.     test2:
  192.     IF (_oldreg==+_ASMRPCODE_HL) errwrongreg(); //hl, ix/iy
  193.     _reg = +_ASMRPCODE_HL;
  194.   };//ELSE prefix2=0x00;
  195.   _oldreg = _oldreg&0x3f;
  196. }
  197.  
  198. PROC asmbyte_ed()
  199. {
  200.   asmbyte(0xed);
  201. }
  202.  
  203. PROC err_rbix()
  204. {
  205.   IF (_reg>=_ASMRBIXADD) errwrongreg();
  206. }
  207.  
  208. PROC err_oldrbix()
  209. {
  210.   IF (_oldreg>=_ASMRBIXADD) errwrongreg();
  211. }
  212.  
  213. PROC err_rpix()
  214. {
  215.   IF (_reg>=_ASMRPIXADD) errwrongreg();
  216. }
  217.  
  218. PROC asmcheckrb_ixiyprefix()
  219. {
  220.   IF (_reg>=_ASMRBIXADD) asmrb_ixiyprefix();
  221. }
  222.  
  223. PROC asmcheckrp_ixiyprefix()
  224. {
  225.   IF (_reg>=_ASMRPIXADD) asmrp_ixiyprefix();
  226. }
  227.  
  228. PROC asmcheckoldrp_ixiyprefix()
  229. {
  230.   IF (_oldreg>=_ASMRPIXADD) asmoldrp_ixiyprefix();
  231. }
  232.  
  233. PROC initmemmodel()
  234. {
  235.   //_curaddr = _BASEADDR; //0x0100;
  236.   //_curpage0 = 0x00;
  237.   //_curpage1 = 0x05;
  238.   //_curpage2 = 0x02;
  239.   //_curpage3 = 0x07;
  240. }
  241.  
  242.