delorie.com/archives/browse.cgi   search  
Mail Archives: djgpp/1996/10/29/10:07:40

From: ey200 AT thor DOT cam DOT ac DOT uk (E. Young)
Newsgroups: comp.os.msdos.djgpp
Subject: Linear virtual screen -> Mode X
Date: 29 Oct 1996 09:37:54 GMT
Organization: University of Cambridge, England
Lines: 53
Message-ID: <554j9i$jn9@lyra.csx.cam.ac.uk>
NNTP-Posting-Host: hammer.thor.cam.ac.uk
To: djgpp AT delorie DOT com
DJ-Gateway: from newsgroup comp.os.msdos.djgpp

I'm sure everyone's heartily sick of people complaining that they can't
set pixels, so I apologise for saying anything even vaguely connected.
Still... I've written a fair number of graphics routines, which all work
by writing to a malloc'ed buffer. When the vertical retrace comes along,
I copy the whole thing into video memory with dosmemput(). This works
fine, but I'd now like to try Mode X screens, which have an eccentric
screen memory layout, *without rewriting all my graphics code*. The 
solution I've adopted is to reorganise the memory in the virtual screen
at the same time as copying it to video ram. I've written a function
that does this (included below), but it's horrendously slow; can anyone
explain why? The function is basically identical to __dj_movedata (and
is called in the same way) with a bit of bit fiddling in between.

Here's the function:

# protected mode procedure
# copies %ecx bytes from the linear virtual screen at %ds:%esi
# to modeX video memory at %es:%edi. Clobbers eax,ecx,edx,esi,edi
# videoPtr holds offset of video memory

	.file "do_xflip.s"
	.text
	.align 4
	.globl _do_xflip
_do_xflip:

# plane 1
        movl    _videoPtr,%edi      #videoPtr = 0xA0000
        movl    $128000-16,%ecx     #screen size = 320*400
        movl    $0x03c4,%edx        #select VGA Sequence Control index
        movl    $0x0102,%eax        #plane 1 + map_mask
        outw    %ax,%dx             #enable plane 1 only
loop_start:
        movb    15(%esi,%ecx),%al   #get last bytes from each of 4
        movb    11(%esi,%ecx),%ah   #words and pack them into output   
        rorl    $16,%eax	    
        movb    7(%esi,%ecx),%al
        movb    3(%esi,%ecx),%ah
        roll    $16,%eax
        stosl
        subl    $16,%ecx
        jne     loop_start    

	... here there's very similar code for the other 3 planes...

        ret

Thanks very much,

-Edwin Young



- Raw text -


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