:void BEEP(){ AL=7; $int 29h }

:void ZEROFLAG KBHIT(){ AH=1; $int 16h}
:void ZEROFLAG KBHITE(){ AH=11h; $int 16h}

:int KBREAD(){ AX=0; $int 16h}
:int KBREADE(){ AH=10h; $int 16h}
    
:void PRINT((E)DX){ AH=9; $int 21h}

:void PUTS((E)SI){
  loop(){
    $lodsb
    IF (!AL) BREAK;
    PUTC();
  }
}

:void PRINTBH(byte AL){
  CX=2; //4 cycyles
  loop (CX) {       //32 bites vmiert nem jo:((
    $rol AL,4
    $push AX
    AL&=0fh;
    $cmp AL,10
    $sbb AL,69h
    $das
    PUTC();
    $pop AX
  }
} 
  
:void PRINTWH(word AX){
  CX=4; //4 cycyles
  loop (CX) {       //32 bites vmiert nem jo:((
    $rol ax,4
    $push ax
    AL&=0fh;
    $cmp al,10
    $sbb al,69h
    $das
    PUTC();
    $pop ax
  } 
}   
    
:void PRINTDH(dword EAX){
  CX=8; //8 cycyles
  loop (CX) {
    $rol eax,4
    $push eax
    AL&=0fh;
    $cmp al,10
    $sbb al,69h
    $das
    PUTC();
    $pop eax
  }
}

:void PRINTNL(){ PUTC(13); PUTC(10);}

:void PUTC(AL){ AX><DX; AH=2; $int 21h }
 
:void GOTOXY(DH,DL)
{       BH=0;
        AH=2;
        $int 10h
}

:int GETC(){
  #ifdef __ctrl_c AH=7;
  #else AH=8; #endif
  $int 21h

}

:void PRINTB(AL){
REKUR: $aam
  IF (AH) {
    $push ax
    AL=AH;
    $call REKUR
    $pop ax
  }
  PUTC(AL|30h);
}

:void PRINTW(word AX){
  CX=10;
REKUR:
  AX/=CX;
  IF (AX)  {
    $push dx         ///   elmentjuk a verembe a karaktert
    $call REKUR      //    rekurzio
    $pop dx          //    itt pedig a helyes sorrendbe kapjuk vissza a karaktereket
  }
  AX><DX;
  PUTC(AL|30h);
}

:void PRINTD(dword EAX){
  ECX=10;
REKUR:
  EAX/=ECX;
  IF (EAX)  {
    $push dx            //elmentjuk a verembe a karaktert
    $call REKUR         //rekurzio
    $pop  dx            //itt pedig a helyes sorrendbe kapjuk vissza a karaktereket
  }
  EAX><EDX;
  PUTC(AL|30h);
}

:void EXECPATH(){
  (E)SI=1; DS=DSWORD[02ch];
  do (E)SI++; while(DSWORD[(E)SI-2]!=1);
}

:char EOF(){
  AH=0bh; $int 21h;
}

