//// ьр°шээючртшёшь√х яЁюЎхфєЁ√ ш юс· тыхэш 
 
 
 
//ЁхушёЄЁ яю ьрёъх 0x3f яЁштюфшЄ ix/iy ъ hl
 
CONST BYTE _ASMRBIXADD = 0x40;
 
CONST BYTE _ASMRBCODE_B = 0x00;
 
CONST BYTE _ASMRBCODE_C = 0x08;
 
CONST BYTE _ASMRBCODE_D = 0x10;
 
CONST BYTE _ASMRBCODE_E = 0x18;
 
CONST BYTE _ASMRBCODE_H = 0x20;
 
CONST BYTE _ASMRBCODE_L = 0x28;
 
CONST BYTE _ASMRBCODE_A = 0x38;
 
CONST BYTE _ASMRBCODE_HX = 0x60;
 
CONST BYTE _ASMRBCODE_LX = 0x68;
 
CONST BYTE _ASMRBCODE_HY = 0xa0;
 
CONST BYTE _ASMRBCODE_LY = 0xa8;
 
CONST BYTE _ASMRBCODE_I = 0x00;
 
CONST BYTE _ASMRBCODE_R = 0x08;
 
 
 
CONST BYTE _ASMRPIXADD = 0x40;
 
CONST BYTE _ASMRPCODE_BC = 0x00;
 
CONST BYTE _ASMRPCODE_DE = 0x10;
 
CONST BYTE _ASMRPCODE_HL = 0x20;
 
CONST BYTE _ASMRPCODE_SP = 0x30;
 
CONST BYTE _ASMRPCODE_AF = 0x30;
 
CONST BYTE _ASMRPCODE_IX = 0x60;
 
CONST BYTE _ASMRPCODE_IY = 0xa0;
 
 
 
//CONST UINT _BASEADDR = 0x6000;
 
//VAR UINT _baseaddr;
 
 
 
PROC asmbytepopvalue()
 
{
 
  DEC _nvalues;
 
  IF (_asms) {
 
#ifdef TARGET_SCRIPT
 
    fwrite((PBYTE
)&_value
[_nvalues
], +sizeof(LONG
), 1, _fout
);  
#else
 
    ;;writefout((BYTE)_value[_nvalues]/**(BYTE)asmpopvalue()*/); //compatible version
 
    /*writefout(*(PBYTE)&_value[_nvalues]);*/ //fast version (little endian)
 
#endif
 
  };
 
  INC _curaddr;
 
}
 
 
 
PROC asmwordpopvalue() //Ёрчэр  ЁрчЁ фэюёЄ№ UINT/DW
 
{
 
VAR UINT uinttempvalue;
 
  DEC _nvalues;
 
  IF (_asms) {
 
    //яш°хь фрээ√х ЁхыюърЎшш яЁш эхэєыхтюь _isaddr!
 
    IF (_isaddr!=0x00) {
 
      uinttempvalue = _curaddr+_curshift-_curbegin; //_curaddr+_curshift-_BASEADDR;
 
      fwrite((PBYTE
)&uinttempvalue
, 2, 1, _forg
);  
    }; //
 
#ifdef TARGET_SCRIPT
 
    fwrite((PBYTE
)&_value
[_nvalues
], +sizeof(LONG
), 1, _fout
);  
#else
 
    ;;uinttempvalue = (UINT)_value[_nvalues]; //(UINT)asmpopvalue()
 
    ;;writefout((BYTE)uinttempvalue); //compatible version (эх _SIZEOF_UINT, Є.ъ. ЄєЄ эрфю ЁрчьхЁ фы  ЄрЁухЄр!)
 
    ;;writefout((BYTE)(uinttempvalue>>8)); //compatible version (эх _SIZEOF_UINT, Є.ъ. ЄєЄ эрфю ЁрчьхЁ фы  ЄрЁухЄр!)
 
    /*fwrite((PBYTE)&_value[_nvalues], 2, 1, _fout);*/ //fast version (little endian) (эх _SIZEOF_UINT, Є.ъ. ЄєЄ эрфю ЁрчьхЁ фы  ЄрЁухЄр!)
 
#endif
 
  };
 
#ifdef TARGET_SCRIPT
 
  _curaddr = _curaddr + 1; //ёыютю - ¤Єю  ўхщър ёъЁшяЄр
 
#else
 
  _curaddr = _curaddr + 2; //эх _SIZEOF_UINT, Є.ъ. ЄєЄ эрфю ЁрчьхЁ фы  ЄрЁухЄр!
 
#endif
 
}
 
 
 
PROC asmlong(LONG value) //Ёрчэр  ЁрчЁ фэюёЄ№ LONG/DL
 
{
 
  ;;asmbyte((BYTE)value); //compatible version
 
  ;;asmbyte((BYTE)((UINT)value>>8)); //compatible version
 
  ;;asmbyte((BYTE)(value>>16L)); //compatible version
 
  ;;asmbyte((BYTE)(value>>24L)); //compatible version
 
  /*IF (_asms) fwrite((PBYTE)&value, 4, 1, _fout);*/ //fast version (little endian) (эх _SIZEOF_LONG, Є.ъ. ЄєЄ эрфю ЁрчьхЁ фы  ЄрЁухЄр!)
 
  /*_curaddr = _curaddr + 4;*/ //fast version (little endian) (эх _SIZEOF_LONG, Є.ъ. ЄєЄ эрфю ЁрчьхЁ фы  ЄрЁухЄр!)
 
}
 
 
 
PROC asmorgword(LONG addr) //Ёрчэр  ЁрчЁ фэюёЄ№ POINTER
 
{
 
//todo ORG
 
//  IF (_asms) {
 
//    ;;writebyte(_forg, (BYTE)addr); //compatible version
 
//    ;;writebyte(_forg, (BYTE)((UINT)addr>>8)); //compatible version
 
//    /*fwrite(+(PBYTE)&addr, 2, 1, _forg);*/ //fast version (little endian) (эх _SIZEOF_UINT, Є.ъ. ЄєЄ эрфю ЁрчьхЁ фы  ЄрЁухЄр!)
 
//  };
 
}
 
 
 
PROC asmdisp(INT ivalue) //фы  $+d ш ix+d
 
{
 
  IF ((UINT)(ivalue + (INT)0x0080) >= 0x0100) {
 
    errstr("far +d"); enderr();
 
  };
 
  asmbyte((BYTE)ivalue); //юс чрЄхы№эю чряшёрЄ№, шэрўх яюхфєЄ рфЁхёр!
 
}
 
 
 
PROC asmdisppopvalue() //фы  jr ш ix+d
 
{
 
  asmdisp((INT)asmpopvalue());
 
}
 
 
 
PROC asmrb_ixiyprefix() //ёухэхЁшЁютрЄ№ яЁхЇшъё dd/fd ш яЁштхёЄш _reg ъ h/l
 
{
 
//  IF       (_reg==+_ASMRBCODE_HX) {asmbyte(0xdd); //_reg = +_ASMRBCODE_H;
 
//  }ELSE IF (_reg==+_ASMRBCODE_LX) {asmbyte(0xdd); //_reg = +_ASMRBCODE_L;
 
//  }ELSE IF (_reg==+_ASMRBCODE_HY) {asmbyte(0xfd); //_reg = +_ASMRBCODE_H;
 
//  }ELSE /**IF (_reg==+_ASMRBCODE_LY)*/{asmbyte(0xfd); //_reg = +_ASMRBCODE_L;
 
//  };
 
  IF (_reg < +_ASMRBCODE_HY) {asmbyte(0xdd);
 
  }ELSE asmbyte(0xfd);
 
  _reg = _reg&0x3f;
 
}
 
 
 
PROC asmoldrb_ixiyprefix() //ёухэхЁшЁютрЄ№ яЁхЇшъё dd/fd ш яЁштхёЄш _reg ъ h/l
 
{
 
//  IF       (_oldreg==+_ASMRBCODE_HX) {asmbyte(0xdd); //_oldreg = +_ASMRBCODE_H;
 
//  }ELSE IF (_oldreg==+_ASMRBCODE_LX) {asmbyte(0xdd); //_oldreg = +_ASMRBCODE_L;
 
//  }ELSE IF (_oldreg==+_ASMRBCODE_HY) {asmbyte(0xfd); //_oldreg = +_ASMRBCODE_H;
 
//  }ELSE /**IF (_oldreg==+_ASMRBCODE_LY)*/{asmbyte(0xfd); //_oldreg = +_ASMRBCODE_L;
 
//  };
 
  IF (_oldreg < +_ASMRBCODE_HY) {asmbyte(0xdd);
 
  }ELSE asmbyte(0xfd);
 
  _oldreg = _oldreg&0x3f;
 
}
 
 
 
PROC asmrbrb_ixiyprefix() //ёухэхЁшЁютрЄ№ яЁхЇшъё dd/fd ш яЁштхёЄш _oldreg,_reg ъ h/l
 
//ё яЁютхЁъющ ю°шсюъ ?x,?y / ?y,?x / ?x/y,h/l / h/l,?x/y
 
{
 
VAR BYTE prefix1;
 
  prefix1 = 0x00; //needed
 
  IF (_oldreg >= +_ASMRBCODE_HY) {
 
    prefix1=0xfd;
 
    goto test1;
 
  }ELSE IF (_oldreg >= +_ASMRBCODE_HX) {
 
    prefix1=0xdd;
 
    test1:
 
    IF (_reg==+_ASMRBCODE_H) errwrongreg(); //?x/y, h
 
    IF (_reg==+_ASMRBCODE_L) errwrongreg(); //?x/y, l
 
    asmbyte(prefix1);
 
  };
 
  IF (_reg >= +_ASMRBCODE_HY) {
 
    IF (prefix1!=0xfd) {
 
      asmbyte(0xfd);
 
      IF (prefix1==0xdd) errwrongreg();
 
    };
 
    goto test2;
 
  }ELSE IF (_reg >= +_ASMRBCODE_HX) {
 
    IF (prefix1!=0xdd) {
 
      asmbyte(0xdd);
 
      IF (prefix1==0xfd) errwrongreg();
 
    };
 
    test2:
 
    IF (_oldreg==+_ASMRBCODE_H) errwrongreg(); //h, ?x/y
 
    IF (_oldreg==+_ASMRBCODE_L) errwrongreg(); //l, ?x/y
 
    _reg = _reg&0x3f;
 
  };
 
  _oldreg = _oldreg&0x3f;
 
}
 
 
 
PROC asmrp_ixiyprefix() //ёухэхЁшЁютрЄ№ яЁхЇшъё dd/fd ш яЁштхёЄш _reg ъ hl
 
{
 
  IF (_reg==+_ASMRPCODE_IX) {asmbyte(0xdd); //_reg = +_ASMRPCODE_HL;
 
  }ELSE /*IF (_reg==+_ASMRPCODE_IY)*/{asmbyte(0xfd); //_reg = +_ASMRPCODE_HL;
 
  };
 
  _reg = +_ASMRPCODE_HL;
 
}
 
 
 
PROC asmoldrp_ixiyprefix() //ёухэхЁшЁютрЄ№ яЁхЇшъё dd/fd ш яЁштхёЄш _reg ъ hl
 
{
 
  IF (_oldreg==+_ASMRPCODE_IX) {asmbyte(0xdd); //_oldreg = +_ASMRPCODE_HL;
 
  }ELSE /*IF (_oldreg==+_ASMRPCODE_IY)*/{asmbyte(0xfd); //_oldreg = +_ASMRPCODE_HL;
 
  };
 
  _oldreg = +_ASMRPCODE_HL;
 
}
 
 
 
PROC asmrprp_ixiyprefix() //ёухэхЁшЁютрЄ№ яЁхЇшъё dd/fd ш яЁштхёЄш _oldreg,_reg ъ hl
 
//ё яЁютхЁъющ ю°шсюъ ix,iy / iy,ix / ix/iy,hl / hl,ix/iy
 
{
 
VAR BYTE prefix1;
 
  prefix1=0x00; //needed
 
  IF (_oldreg==+_ASMRPCODE_IX) {
 
    prefix1=0xdd;
 
    goto test1;
 
  }ELSE IF (_oldreg==+_ASMRPCODE_IY) {
 
    prefix1=0xfd;
 
    test1:
 
    IF (_reg==+_ASMRPCODE_HL) errwrongreg(); //ix/iy, hl
 
    asmbyte(prefix1);
 
  };//ELSE prefix1=0x00;
 
  IF (_reg==+_ASMRPCODE_IX) {
 
    IF (prefix1!=0xdd) {
 
      asmbyte(0xdd);
 
      IF (prefix1==0xfd) errwrongreg();
 
    };
 
    goto test2;
 
  }ELSE IF (_reg==+_ASMRPCODE_IY) {
 
    IF (prefix1!=0xfd) {
 
      asmbyte(0xfd);
 
      IF (prefix1==0xdd) errwrongreg();
 
    };
 
    test2:
 
    IF (_oldreg==+_ASMRPCODE_HL) errwrongreg(); //hl, ix/iy
 
    _reg = +_ASMRPCODE_HL;
 
  };//ELSE prefix2=0x00;
 
  _oldreg = _oldreg&0x3f;
 
}
 
 
 
PROC asmbyte_ed()
 
{
 
  asmbyte(0xed);
 
}
 
 
 
PROC err_rbix()
 
{
 
  IF (_reg>=_ASMRBIXADD) errwrongreg();
 
}
 
 
 
PROC err_oldrbix()
 
{
 
  IF (_oldreg>=_ASMRBIXADD) errwrongreg();
 
}
 
 
 
PROC err_rpix()
 
{
 
  IF (_reg>=_ASMRPIXADD) errwrongreg();
 
}
 
 
 
PROC asmcheckrb_ixiyprefix()
 
{
 
  IF (_reg>=_ASMRBIXADD) asmrb_ixiyprefix();
 
}
 
 
 
PROC asmcheckrp_ixiyprefix()
 
{
 
  IF (_reg>=_ASMRPIXADD) asmrp_ixiyprefix();
 
}
 
 
 
PROC asmcheckoldrp_ixiyprefix()
 
{
 
  IF (_oldreg>=_ASMRPIXADD) asmoldrp_ixiyprefix();
 
}
 
 
 
PROC initmemmodel()
 
{
 
  //_curaddr = _BASEADDR; //0x0100;
 
  //_curpage0 = 0x00;
 
  //_curpage1 = 0x05;
 
  //_curpage2 = 0x02;
 
  //_curpage3 = 0x07;
 
}