Metropoli BBS
VIEWER: detect.asm MODE: TEXT (ASCII)
include qlib.inc
include string.inc
include stdio.inc
include process.inc
include os.inc
include time.inc
include dos.inc
include alloc.inc

.data
  s1 dd ?              ;for CPUID str
  s2 dd ?
  s3 dd ?
  db 0
  saved_cpuid dd ?     ;for CPUID EAX
.code
main proc
  mov ax,0eeffh
  int 31h

  callp print,"DOS Extender detected : "
  mov al,_dosXtyp
  mov dx,_dosXver

  .if al==DOSX_PMODEW
    callp printf,"PMODE/W v%d.%d\n",dh,dl
  .elseif al==DOSX_DOS4GW
    callp printf,"DOS/4GW v%d.%d\n",dh,dl
  .elseif al==DOSX_DOS32
    callp printf,"DOS32 v%d.%d\n",dh,dl
  .else
    callp print,"Unknown\n"
  .endif

  callp print,"OS detected : "
  mov al,_os_typ
  .if al==OS_DOS
    callp print,"DOS"
  .elseif al==OS_WIN
    callp print,"Win"
  .elseif al==OS_WIN95
    callp print,"Win 95/NT"
  .elseif al==OS_WINNT
    callp print,"Win NT"
  .elseif al==OS_DV
    callp print,"DesqView"
  .elseif al==OS_OS2
    callp print,"OS/2"
  .else
    callp print,"Unknown OS detected\n"
  .endif
  callp printf," v%i.%i\n",_os_ver_major,_os_ver_minor
  mov al,_os_typ
  .if al!=OS_DOS
    callp printf,"DOS v%i.%i\n",_dos_ver_major,_dos_ver_minor
  .endif

  callp coreleft
  callp printf,"Free RAM : %d bytes\n",eax

  callp print,"Server : "
  mov al,_pmmode
  .if al==SRV_RAW
    callp print,"RAW\n"
  .elseif al==SRV_XMS
    callp print,"XMS\n"
  .elseif al==SRV_VCPI
    callp print,"VCPI\n"
  .elseif al==SRV_DPMI
    callp print,"DPMI\n"
  .elseif al==SRV_UNKNOWN
    callp print,"Unknown\n"
  .else
    callp print,"bug?\n"
  .endif
  callp print,"Processor : "
  mov al,_processor
  .if al==3
    callp print,"80386\n"
  .elseif al==4
    callp print,"80486\n"
  .elseif al==5
    callp print,"80586 (ie: Pentium or K5)\n"
  .elseif al==6
    callp print,"80686 (ie: Pentium Pro or K6)\n"
  .endif
  push cs
  lar ax,wptr[esp]
  add esp,4   ;segments are pushed as 32bit entities (although they are still 16bit)
  shr ah,8-3
  and ah,3
  callp printf,"CPL=%i\n",ah

;test if CPUID is avail
  pushfd
  pop eax
  mov ebx,eax
  xor eax,200000h
  push eax
  popfd
  pushfd
  pop eax
  .if eax!=ebx
    callp printf,"CPUID supported\n"    ;0fh 0a2h
    xor eax,eax
    db 0fh,0a2h  ;CPUID
    ;EAX = capablities
    ;EBX-EDX-ECX = String
    callp printf,"  EAX = %d\n",eax
    mov s1,ebx
    mov s2,edx
    mov s3,ecx
    callp printf,"  CPUID str=%s\n",offset s1
    mov eax,1
    db 0fh,0a2h  ;CPUID
    mov     saved_cpuid,eax         ;save for future use
    and     eax, 0F00H              ; mask everything but family
    shr     eax, 8
    callp printf,"  CPU Type : %d\n",al
    mov     eax,saved_cpuid         ;restore data
    and     al,0fh
    callp printf,"  Stepping : %d\n",al
    mov     eax, saved_cpuid
    and     al, 0F0H          ; isolate model info
    shr     al, 4
    callp printf,"  Model    : %d\n",al
  .else
    callp printf,"CPUID not supported\n"
  .endif
  ret
main endp

end

[ RETURN TO DIRECTORY ]