Login

Subversion Repositories NedoOS

Rev

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

//// ьр°шээючртшёшь√х яЁюЎхфєЁ√ ш юс· тыхэш 

//ЁхушёЄЁ яю ьрёъх 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;
}