www.delorie.com/archives/browse.cgi   search  
Mail Archives: djgpp/1998/07/17/07:46:27

From: "David C. Hoos, Sr." <david DOT c DOT hoos DOT sr AT ada95 DOT com>
References: <199807152344 DOT BAA13105 AT unix12 DOT planete DOT net>
Subject: Re: I don't succeed into making dpmi interrupts working w/ djgpp & nasm !
Date: Fri, 17 Jul 1998 05:42:52 -0500
Lines: 285
Message-ID: <60baPIXs9GA.220@samson.airnet.net>
Newsgroups: comp.os.msdos.djgpp
To: djgpp AT delorie DOT com
DJ-Gateway: from newsgroup comp.os.msdos.djgpp

H Thibault,

Messages should not be posted to newsgroups in anything other than plain
text, because many people who could help you have newsreaders which can only
read plain text.

For the benefit of all, I have converted your original message to plain
text, and resubmitted it here.

David C. Hoos, Sr.

Hi,
(excuse my mistakes i m french)
I'm used to build programs with BC++ and his inline assembly. I wanted to
use DMPI so i got DJGPP and NASM. I've written the following routine. My
problems and what i noticed with fsdb (djgpp debugger) are written in the
routine.
(I'v added at the end of this message my Rhide's bug report)
*************************************************************************
vbelib.asm (nasm -f coff vbelib.asm):

[BITS 32]

[GLOBAL _VBE2Detect]

[SECTION .text]

;Function VBE2Detect();
;out : 0 if error or vesa 2 not available, 1 if vesa 2 or greater
; available

_VBE2Detect:
        pushad
        mov AX, 0100h ;DPMI Allocate DOS Memory Block int 31h fct 100h
        mov BX, 32    ;32 paragraphs equ to 512 bytes (vesa info header)
        int 31h
        jnc .MemoireAllouee ;jump if memory allocated
        popad ;else pop registers and return 0
        xor eax, eax
        ret

        .MemoireAllouee:
                mov [DOSMEM_RMSEG], AX  ;save real mode segment
                mov [DOSMEM_SELECTOR], DX ;save mem selector
                mov ecx, eax ;ecx will be linear address
                and ecx, 0FFFFh ;clear high 16bits
                shl ecx, 4 ;seg*16
                mov [DOSMEM_LINADDR], ECX ;save linear address

                mov dword [ecx+VbeInfoBlock+VbeSignature], 'VBE2'
;asking for VBE 2.0 Info
                push ds
                pop es          ;es=ds to prevent GPF
                mov EDI, RMREGS ;edi=offset RMREGS
                mov dword [RM_EAX], 04F00h ;VESA Fct 00h
                mov dword [RM_EDI], 0 ;offset dosmem=0
                mov word [RM_ES], AX ;segment returned from int31h
                mov AX, 0300h           ;DPMI Simulate Real ModeInterrupt
                mov BX, 0010h ;real mode int 10h
                xor CX, CX ;cx=0
                int 31h
                jnc .Interrupt31Succes ;jump if success
;else free dos mem and return 0
                mov AX, 0101h   ;DPMI Free DOS Memory Block
                mov DX, [DOSMEM_SELECTOR]
                int 31h
                popad
                xor EAX, EAX
                ret

        .Interrupt31Succes:
                mov eax, [RM_EAX]
                cmp dword AX, 04Fh ;Check if Vesa fct call succeed
                je .InterruptVbeSucces ;jump if success
;else free dos mem and return 0
                mov AX, 0101h
                mov DX, [DOSMEM_SELECTOR]
                int 31h
                popad
                xor eax, eax
                ret


;using fsdb i can tell everything works fine until here.
;I think the problem is the offset, seg or linear address i
;use. It seems that the Dos memory i have allocated earlier is not filled
;with Vesa Info during int 10h. I've tried to use random values for real
;mode offset and segment and vesa returned success...I'd like to know if
;there's something more to do to access to dos memory like mapping or
;something else, if i have to copy something between stacks (param CX)
;I think the problem is that vesa writes somewhere in memory and that i
;don't look for data at the right place...MAYDAY !!

        .InterruptVbeSucces:
                mov ecx, [DOSMEM_LINADDR]
                cmp dword [ecx+VbeInfoBlock+VbeSignature], 'ASEV'
                je .VESADetecte

                mov AX, 0101h
                mov DX, [DOSMEM_SELECTOR]
                int 31h
                popad
                xor eax, eax
                ret

        .VESADetecte:
                cmp word[ecx+VbeInfoBlock+VbeVersion], 0200h
                jge .VBE2

                mov AX, 0101h
                mov DX, [DOSMEM_SELECTOR]
                int 31h
                popad
                xor eax, eax
                ret

        .VBE2:
                mov AX, 0101h
                mov DX, [DOSMEM_SELECTOR]
                int 31h
                popad
                xor eax, eax
                inc eax
                ret


[SECTION .data]

        DOSMEM_RMSEG            dw      0
        DOSMEM_SELECTOR         dw      0
        DOSMEM_LINADDR          dd      0

        struc VbeInfoBlock
                VbeSignature        resb 4     ; VBE Signature
                VbeVersion          resw 1     ; VBE Version
                OemStringPtr        resd 1     ; Pointer to OEM String
                Capabilities        resb 4;Capabilities of graphics cont.
                VideoModePtr        resd 1   ; Pointer to Video Mode List
                TotalMemory         resw 1 ; Number of 64kb memory blocks
             ; Added for VBE 2.0
                OemSoftwareRev      resw 1 ; VBE implementation Software
revision
                OemVendorNamePtr    resd 1         ; Pointer to Vendor
Name String
                OemProductNamePtr   resd 1         ; Pointer to Product
Name String
                OemProductRevPtr    resd 1         ; Pointer to Product
Revision String
                Reserved            resb 222       ; Reserved for VBE
implementation
    ; scratch area
                OemData             resb 256       ; Data Area for OEM
Strings
        endstruc

        RMREGS:
                RM_EDI          dd      0
                RM_ESI          dd      0
                RM_EBP          dd      0
                RM_Reserved     dd      0
                RM_EBX          dd      0
                RM_EDX          dd      0
                RM_ECX          dd      0
                RM_EAX          dd      0
                RM_Flags        dw      0
                RM_ES           dw      0
                RM_DS           dw      0
                RM_FS           dw      0
                RM_GS           dw      0
                RM_IP           dw      0
                RM_CS           dw      0
                RM_SP           dw      0
                RM_SS           dw      0


************************************************************************
This is a bug report for RHIDE Version 1.4 (Sep 30 1997 23:06:59)
I am running MS-DOS 7.10 (Windows 95)

Important environment variables:
PATH=C:\PROGRA~1\UTILIT~1\NORTON~1;C:\PROGRA~1\BUREAU~1\OFFICE\OFFICE;C:\
WINDOWS;C:\WINDOWS\COMMAND;C:\PROGRA~1\COMPRE~1\;C:\DRIVERS\4DOS\;c:\prog
ra~1\progra~1\djgpp2\bin;
DJGPP=c:\progra~1\progra~1\djgpp2\djgpp.env
LFN=y
INFOPATH=c:/progra~1/progra~1/djgpp2/info;c:/progra~1/progra~1/djgpp2/gnu
/emacs/info;c:/progra~1/progra~1/djgpp2/info;c:/progra~1/progra~1/djgpp2/
gnu/emacs/info
LOCALEDIR=
LANGUAGE=
SHELL=
COMSPEC=C:\DRIVERS\4DOS\4DOS.COM
DJSYSFLAGS=

Here is the output from a sample compilation and link for C
executing:
echo "int main(){return 0;}" | redir -eo gcc -Xlinker -v -Wa,-v -v -o
/dev/null -x c -
Reading specs from c:/progra~1/progra~1/djgpp2/lib/specs
gcc version 2.8.1
c:/progra~1/progra~1/djgpp2/lib/gcc-lib/djgpp\2.81\cpp.exe -lang-c -v -
undef -D__GNUC__=2 -D__GNUC_MINOR__=8 -Dunix -Di386 -DGO32 -DMSDOS -
DDJGPP=2 -DDJGPP_MINOR=1 -D__unix__ -D__i386__ -D__GO32__ -D__MSDOS__ -
D__DJGPP__=2 -D__DJGPP_MINOR__=1 -D__unix -D__i386 -D__GO32 -D__MSDOS -
D__DJGPP=2 -D__DJGPP_MINOR=1 -
c:/progra~1/progra~1/djgpp2/tmp/RHaaaaaa\ccaywrjh
GNU CPP version 2.8.1 (80386, BSD syntax)
#include "..." search starts here:
#include <...> search starts here:
c:/progra~1/progra~1/djgpp2/include
c:/progra~1/progra~1/djgpp2/lib/gcc-lib/djgpp/2.81/include
c:/progra~1/progra~1/djgpp2/include
End of search list.
c:/progra~1/progra~1/djgpp2/lib/gcc-lib/djgpp\2.81\cc1.exe
c:/progra~1/progra~1/djgpp2/tmp/RHaaaaaa\ccaywrjh -quiet -dumpbase -.c -
version -o c:/progra~1/progra~1/djgpp2/tmp/RHaaaaaa\ccbywrjh
GNU C version 2.8.1 (djgpp) compiled by GNU C version 2.8.1.
c:/progra~1/progra~1/djgpp2/bin/as.exe -v -o
c:/progra~1/progra~1/djgpp2/tmp/RHaaaaaa\cccywrjh
c:/progra~1/progra~1/djgpp2/tmp/RHaaaaaa\ccbywrjh
GNU assembler version 2.8.1 (i386-pc-msdosdjgpp)
c:/progra~1/progra~1/djgpp2/bin/ld.exe -o /dev/null
c:/progra~1/progra~1/djgpp2/lib/crt0.o -Lc:/progra~1/progra~1/djgpp2/lib
-Lc:/progra~1/progra~1/djgpp2/lib/gcc-lib/djgpp\2.81 -
Lc:/progra~1/progra~1/djgpp2/bin -Lc:/progra~1/progra~1/djgpp2/lib -v
c:/progra~1/progra~1/djgpp2/tmp/RHaaaaaa\cccywrjh -Tdjgpp.djl -lgcc -lc -
lgcc
GNU ld version 2.8.1 (with BFD 2.8.1)
c:/progra~1/progra~1/djgpp2/bin/stubify.exe -v /dev/null
Warning: input file is not COFF or stubbed COFF
exe: No such file or directory (ENOENT)
stubify for djgpp V2.X executables, Copyright (C) 1995 DJ Delorie

End of the sample

Here is the output from a sample compilation and link for C++
executing:
echo "int main(){return 0;}" | redir -eo gcc -Xlinker -v -Wa,-v -v -o
/dev/null -x c++ -
Reading specs from c:/progra~1/progra~1/djgpp2/lib/specs
gcc version 2.8.1
c:/progra~1/progra~1/djgpp2/lib/gcc-lib/djgpp\2.81\cpp.exe -lang-c++ -v
-undef -D__GNUC__=2 -D__GNUG__=2 -D__cplusplus -D__GNUC_MINOR__=8 -Dunix
-Di386 -DGO32 -DMSDOS -DDJGPP=2 -DDJGPP_MINOR=1 -D__unix__ -D__i386__ -
D__GO32__ -D__MSDOS__ -D__DJGPP__=2 -D__DJGPP_MINOR__=1 -D__unix -D__i386
-D__GO32 -D__MSDOS -D__DJGPP=2 -D__DJGPP_MINOR=1 -D__EXCEPTIONS -
c:/progra~1/progra~1/djgpp2/tmp/RHaaaaaa\ccaqdtjh
GNU CPP version 2.8.1 (80386, BSD syntax)
#include "..." search starts here:
#include <...> search starts here:
c:/progra~1/progra~1/djgpp2/lang/cxx
c:/progra~1/progra~1/djgpp2/include
c:/progra~1/progra~1/djgpp2/lang/cxx
c:/progra~1/progra~1/djgpp2/lib/gcc-lib/djgpp/2.81/include
c:/progra~1/progra~1/djgpp2/include
End of search list.
c:/progra~1/progra~1/djgpp2/lib/gcc-lib/djgpp\2.81\cc1plus.exe
c:/progra~1/progra~1/djgpp2/tmp/RHaaaaaa\ccaqdtjh -quiet -dumpbase -.cc -
version -o c:/progra~1/progra~1/djgpp2/tmp/RHaaaaaa\ccbqdtjh
GNU C++ version 2.8.1 (djgpp) compiled by GNU C version 2.8.1.
c:/progra~1/progra~1/djgpp2/bin/as.exe -v -o
c:/progra~1/progra~1/djgpp2/tmp/RHaaaaaa\cccqdtjh
c:/progra~1/progra~1/djgpp2/tmp/RHaaaaaa\ccbqdtjh
GNU assembler version 2.8.1 (i386-pc-msdosdjgpp)
c:/progra~1/progra~1/djgpp2/bin/ld.exe -o /dev/null
c:/progra~1/progra~1/djgpp2/lib/crt0.o -Lc:/progra~1/progra~1/djgpp2/lib
-Lc:/progra~1/progra~1/djgpp2/lib/gcc-lib/djgpp\2.81 -
Lc:/progra~1/progra~1/djgpp2/bin -Lc:/progra~1/progra~1/djgpp2/lib -v
c:/progra~1/progra~1/djgpp2/tmp/RHaaaaaa\cccqdtjh -Tdjgpp.djl -lgcc -lc -
lgcc
GNU ld version 2.8.1 (with BFD 2.8.1)
c:/progra~1/progra~1/djgpp2/bin/stubify.exe -v /dev/null
Warning: input file is not COFF or stubbed COFF
exe: No such file or directory (ENOENT)
stubify for djgpp V2.X executables, Copyright (C) 1995 DJ Delorie

End of the sample

************************************************************
Thibaut Murez
tmurez AT planete DOT net
************************************************************



- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019