From: DavMac AT iname DOT com (Davin McCall) Newsgroups: comp.os.msdos.djgpp Subject: Re: Intel - AT&T inline with DJGPP Date: Mon, 02 Aug 1999 01:59:08 GMT Organization: Monash Uni Lines: 96 Distribution: world Message-ID: <37a4f693.7358190@newsserver.cc.monash.edu.au> References: <7o1psl$d46$1 AT news DOT iinet DOT net DOT au> NNTP-Posting-Host: damcc5.halls.monash.edu.au X-Trace: towncrier.cc.monash.edu.au 933559096 26710 130.194.198.138 (2 Aug 1999 01:58:16 GMT) X-Complaints-To: abuse AT monash DOT edu DOT au NNTP-Posting-Date: 2 Aug 1999 01:58:16 GMT X-Newsreader: Forte Free Agent 1.1/32.230 To: djgpp AT delorie DOT com DJ-Gateway: from newsgroup comp.os.msdos.djgpp Reply-To: djgpp AT delorie DOT com Oh dear. The biggest problem you have is that the code you posted is written for real mode programs. DJGPP executables run in 32-bit protected mode using a DPMI host environment, which really screws around with the way memory is accessed. not having used inline assembly under DJGPP very often, I have done some work with 32-bit assembly (AT&T syntax) and can offer the following modifications as a minimum (I also suggest you thoroughly read all the relevant sections of the DJGPP FAQ): >void putpixel(int x, int y, char col) >{ > asm( > "mov $0xA000,%ax \r > mov %ax,%es \r OxA000 is the real-mode segment address of the VGA video buffer. Under protected mode, the buffer can no-longer be accessed at this address. You several options, see section 10.2 of the FAQ. > mov y,%bx \r > mov %bx,%di \r > xchg %bl,%bh \r > shl $6,%di \r > add %bx,%di \r > add x,%di \r > mov col,%al \r > mov %al,%es[%di]"''' > ); >} You're using 16-bit registers a lot. The difference between ax, bx, cx etc and eax, ebx, ecx etc is the width in bits. The 'e' probably stands for 'extended' and the 'e' registers are all 32-bits in width, the regular registers of the same name forming the lower 16 bits. For eg, eax is a 32-bit register (ax is its least significant half). Under a 32-bit protected mode environment, it is generally faster to use 32-bit instructions (ie, using 32-bit registers) than to use 16-bit instructions. As further advice, I would recommend not jumping in so quickly. Using a "putpixel" routine such as this, even though it is written in assembly, is not going to be particularly fast - you need to optimize the higher level routines such as the line-drawing etc. If you *must* learn assembly and use it, start with 16-bit real mode programs (using the tutorials you've got, if need be), get some graphics routines going, then *thoroughly* read the FAQ and any other info you can find about 32-bit instructions and protected mode programming before trying to do any conversion. You can also take a look at the source code for one of my own games, it is available from my page: http://yoyo.cc.monash.edu.au/~davmac/ (it includes some assembly routines, though they are not inline, to perform graphics operations). As an alternative, why not just use one of the graphics libraries already available for DJGPP - Allegro is quite popular for games programming, I believe there is a link from DJs site (http://www.delorie.com). Davin. On Sun, 1 Aug 1999 23:41:45 +0800, "Centrozity" wrote: >My problem is simple, I currently have a set of mode 13h routines in C that >I use with all the programs( mostly poor quality and extremely small games ) >that I write. One of my more recent projects had a rather choppy framerate, >so I optimised all my C code, including my 13h routines, but it didn't do >much good, I have never gotten into assembly too well but now it is looking >like my only way around this bottleneck. > >The asm tutorials I found were all Intel format, and so with the help of an >additional Intel - AT&T FAQ I attempted to convert the asm routines into >inline(is that the correct term for when the asm is in the c file?) AT&T >ones that would compile with DJGPP. > >Since I really have no idea what I'm doing to these functions, I decided >it's time to ask for help. The error I'm getting is 'Base/Index register >must be 32bit". [snipped rest] __________________________________________________________ *** davmac - sharkin'!! davmac AT iname DOT com *** my programming page: http://yoyo.cc.monash.edu.au/~davmac/