[Back to HARDWARE SWAG index] [Back to Main SWAG index] [Original]

    { Here is a small piece of code to detect if you are running under
      a Linux's dosemu dos box.

      Truly definitive version.  .. update !!

      Copyright (C) 1996 Lin Ke-Fong. Donated to public domain.

      Feel free to ask me any questions at:
        * lin.ke-fong@ace.epita.fr
        * ke-fong.lin@nuxes.frmug.net.fr
    }

    function dosemu_Detect:boolean; assembler;
    { This function use two methods (which are "official") to detect dosemu.

      First if dosemu is present, the BIOS date string at 0xF000:0xFFF5 should
      be "02/25/93". Second interrupt $E6 called with ah = 0 should return $AA55
      in ax register when in a dosemu dos box. Note that interrupt $E6 should
      be "initialized" to point to an IRET instruction since it is often pointed
      on nothing by BIOS.
    }

    asm
      push ds

    { check for the BIOS date }
      mov  ax,$F000
      mov  ds,ax
      mov  bx,$FFF5

      mov  ax,'20'
      cmp  word ptr [bx],'20'
      jne  @no_dosemu
      cmp  word ptr [bx+2],'2/'
      jne  @no_dosemu
      cmp  word ptr [bx+4],'/5'
      jne  @no_dosemu
      cmp  word ptr [bx+6],'39'
      jne  @no_dosemu

    { initialize interrupt $E6 to an IRET }
      xor  ax,ax
      mov  ds,ax
      mov  bx,$E6 * 4
      les  di,[bx]
      mov  bl,es:[di]
      mov  byte ptr es:[di],$CF { put an iret instruction }

    { call the installation check interrupt (int $E6 with ah = 0) }
      xor  ah,ah
      int  $E6
      mov  es:[di],bl           { restore the old instruction }
      cmp  ax,$AA55
      jne  @no_dosemu

      mov  ax,01h
      jmp  #end

    #no_dosemu:
      xor  ax,ax

    @end:
      pop  ds
    end;

    begin
      if dosemu_Detect then
        writeln('Hello dosemu ! and hello Linux !')
      else
        writeln('dosemu > MSDOS 7 :-)');
    end.

[Back to HARDWARE SWAG index] [Back to Main SWAG index] [Original]