Mail Archives: djgpp/1996/05/06/10:15:46
(Please be nice - I'm new/inexperienced/stupid at DJGPP version 2 and
the Internet in general...)
I'm a little bit confused about DJGPP2's nearptrs and the Fat DS method.
My problem is using __djgpp_conventional_base doesn't seem to be any
faster than dosmemput. I've timed two versions of a routine which
'blasts' a screen buffer into the 0xa0000 area, one using the Fat DS and
one using dosmemput, and they both seem to be just as fast.
Am I doing something hideously wrong? (Is my CopyLongs routine okay?)
Here are some fragments of my C code:
#include "daves.h"
#include <stdio.h>
#include <stdlib.h>
#include <sys\movedata.h> /* For dosmemput() */
#include <sys\nearptr.h> /* For Fat DS */
int BlastScreen(char *ScrArea,int Page);
int FatDSBlastScreen(char *ScrArea,int Page);
...
/* Draw the screen on DrawPage here */
if (!__djgpp_nearptr_enable())
{
FatDSBlastScreen(MyScr,DrawPage);
__djgpp_nearptr_disable();
}
else
{
BlastScreen(MyScr,DrawPage);
FatDSFail=1;
}
...
int FatDSBlastScreen(char *ScrArea,int Page)
{
char *ScreenBase;
/* Uses Fat DS method */
ScreenBase=(char *)(__djgpp_conventional_base+0xa0000+0x4000*Page);
BitMask(1);
CopyLongs(ScrArea+0x0000,ScreenBase,0x1000);
BitMask(2);
CopyLongs(ScrArea+0x4000,ScreenBase,0x1000);
BitMask(4);
CopyLongs(ScrArea+0x8000,ScreenBase,0x1000);
BitMask(8);
CopyLongs(ScrArea+0xc000,ScreenBase,0x1000);
BitMask(15);
return 0;
}
int BlastScreen(char *ScrArea,int Page)
{
unsigned long ScreenBase;
/* Uses conventional method */
ScreenBase=0xa0000+0x4000*Page;
BitMask(1);
dosmemput(ScrArea+0x0000,0x4000,ScreenBase);
BitMask(2);
dosmemput(ScrArea+0x4000,0x4000,ScreenBase);
BitMask(4);
dosmemput(ScrArea+0x8000,0x4000,ScreenBase);
BitMask(8);
dosmemput(ScrArea+0xc000,0x4000,ScreenBase);
BitMask(15);
return 0;
}
Here's the CopyLongs routine and the BitMask routine in my assembler
module:
.globl _CopyLongs
_CopyLongs:
pushl %ebp
movl %esp,%ebp
pushl %edi
pushl %esi
movl 8(%ebp),%esi
movl 12(%ebp),%edi
movl 16(%ebp),%ecx
rep
movsl
popl %esi
popl %edi
movl %ebp,%esp
popl %ebp
ret
.globl _BitMask
_BitMask:
/*
Replaces:
outportb(0x3c4,0x02);
outportb(0x3c5,1<<Plane);
*/
pushl %ebp
movl %esp,%ebp
movw $0x3c4,%dx
movb $0x02,%al
outb %al,%dx
inc %dx
movb 8(%ebp),%al
outb %al,%dx
movl %ebp,%esp
popl %ebp
ret
Thanks for your patience!
--
David Hampson
David AT johnhamp DOT demon DOT co DOT uk
- Raw text -