;------------------------- ; isprot.asm by Yousuf Khan comment * Purpose: To detect whether a processor is running protected mode, and to display what DOS extender standards it conforms to. Author: Yousuf Khan, donated to public domain Version: 1.0 * .model tiny .data memflags record dpmi:1,vcpi:1,ems:1,xms:1,prot:1 types_found memflags <0,0,0,0,0> ;what types were found? emm_name db 'EMMXXXX0', 0 ;EMM handle name copyright db 'ISPROT 1.0: Protected mode analyzer, ' db '(c) 1994, Yousuf J. Khan',13,10,'$' protmsg db 'Protected mode: $' xmsmsg db 'XMS driver: $' emsmsg db 'EMS driver: $' vcpimsg db 'VCPI driver: $' dpmimsg db 'DPMI driver: $' found db 'yes',13,10,'$' notfound db 'no',13,10,'$' .code org 100h start: ;first test for protected mode .386p smsw ax and ax, 1 cmp ax, 1 jne not_prot or types_found, mask prot not_prot: ;now test for XMS mov ax, 4300h int 2fh cmp al, 80h jne no_xms or types_found, mask xms no_xms: ;now test for EMS lea dx, emm_name ;"EMMXXXX0" name of handle to open mov ax, 3d00h int 21h ;open file handle jc short no_ems ;handle not found, must be no EMS mov bx, ax ;store file handle # in BX mov ax, 4400h ;IOCTL: get device info int 21h jc short no_ems ;error occurred, must be no EMS test dx, 80h ;if 7th bit clear, file handle must jz short no_ems ; be a file, but not dev drvr mov ax, 4407h int 21h push ax ;store result of fnct. mov ah, 3eh int 21h ;close file handle pop ax cmp al, 0ffh ;EMS device ready? If yes, AL=0FFh. jne short no_ems or types_found, mask ems no_ems: ;now test for VCPI mov ah, types_found and ah, mask ems ;if no EMS, then no VCPI cmp ah, 0 je no_vcpi ;test for 386+ pushf xor ax, ax push ax popf pushf pop ax test ax, 0f000h je short not_386 ;upper four bits of FLAG register not ;settable, must be less than a 386 popf jmp short keep_checking not_386: popf ;No 386? Can't have VCPI either jmp no_vcpi keep_checking: ;keep checking for VCPI ; ;Now we found EMS & 386. But is it VCPI? ; mov bx, 1 ;# of pages to allocate mov ah, 43h ;get EMS handle and allocate int 67h ; memory cmp ah, 0 ;fnct completed successfully if 0 jne short no_vcpi push dx ;save EMS handle mov ax, 0de00h ;VCPI installation check int 67h pop dx ;retrieve EMS handle push ax ;save VCPI detection flag mov ah, 45h int 67h ;release EMS handle pop ax cmp ah, 0 jne short no_vcpi ;if AH<>0, no VCPI or types_found, mask vcpi no_vcpi: ;now test for DPMI mov ax, 1687h int 2fh cmp ax, 0 jne no_dpmi or types_found, mask dpmi no_dpmi: ;now let's start displaying what we found mov dx, offset copyright mov ah, 9 int 21h mov dx, offset protmsg mov ah, 9 int 21h mov ah, types_found and ah, mask prot cmp ah, 0 je @1 call foundmsg jmp @2 @1: call notfoundmsg @2: mov dx, offset xmsmsg mov ah, 9 int 21h mov ah, types_found and ah, mask xms cmp ah, 0 je @3 call foundmsg jmp @4 @3: call notfoundmsg @4: mov dx, offset emsmsg mov ah, 9 int 21h mov ah, types_found and ah, mask ems cmp ah, 0 je @5 call foundmsg jmp @6 @5: call notfoundmsg @6: mov dx, offset vcpimsg mov ah, 9 int 21h mov ah, types_found and ah, mask vcpi cmp ah, 0 je @7 call foundmsg jmp @8 @7: call notfoundmsg @8: mov dx, offset dpmimsg mov ah, 9 int 21h mov ah, types_found and ah, mask dpmi cmp ah, 0 je @9 call foundmsg jmp @a @9: call notfoundmsg @a: mov al, types_found ;use flags as exit errorlevel mov ah, 4ch ;end program int 21h foundmsg proc mov dx, offset found mov ah, 9 int 21h ret endp notfoundmsg proc mov dx, offset notfound mov ah, 9 int 21h ret endp end start