Fastest way to fill data... 
Author Message
 Fastest way to fill data...

Hi all,

I've the following code for fast filling of data:

{     ->EAX     Pointer to destination  }
{       EDX     count   }
{       CL      value   }

        PUSH    EDI
        MOV     EDI,EAX { Point EDI to destination              }
        MOV     CH,CL   { Fill EAX with value repeated 4 times  }
        MOV     EAX,ECX
        SHL     EAX,16
        MOV     AX,CX
        MOV     ECX,EDX
        SAR     ECX,2

        REP     STOSD   { Fill count DIV 4 dwords       }
        MOV     ECX,EDX
        AND     ECX,3

        POP     EDI

There is one thing I don't understand in the code: I believe this code is
slow if
the destination isn't 4-byte aligned. So there should be 2 checks: one in
beginning to align the destination to 4 bytes and one in the end to copy the
last bytes. Does someone disagree?

Greetings, Ferns.

Wed, 27 Nov 2002 03:00:00 GMT  
 Fastest way to fill data...

>Have fun. Improvements are always welcome, of course ;-)

           How about 32-bit DPMI.

> ...
> [pcx.asm]
> ...

; nasm -f obj pcx.asm
; alink -oPE pcx
; stubit pcx.exe
%define main    ..start

        segment _TEXT use32 align=4096 public class=CODE
main:   cmp     esi,1
        je      near exit
        push    ds
        pop     es

        call    read_file
        jc      near exit
        cmp     byte [pcx_hdr.Version],5
        jne     near exit

        mov     ax,[pcx_hdr.MaxX]
        sub     ax,[pcx_hdr.MinX]
        inc     ax
        cmp     ax,640
        ja      near exit
        mov     [XSIZE],ax

        mov     ax,[pcx_hdr.MaxY]
        sub     ax,[pcx_hdr.MinY]
        inc     ax
        cmp     ax,480
        ja      near exit
        mov     [YSIZE],ax

        mov     ax,[pcx_hdr.BytesPerLine]
        movzx   bx,byte [pcx_hdr.NPlanes]
        mul     bx
        mov     [TotalBytes],ax
        mov     bx,640
        sub     bx,ax
        mov     [blank],bx

        mov     ax,101h
        call    set_mode
        jc      near exit

        mov     esi,pcx_hdr
        add     esi,[flength]
        sub     esi,768
        cmp     byte [esi-1],12
        jne     near exit_1

        call    set_palette

        mov     esi,pcx_hdr + 128
        mov     edi,screen
nxt_3:  movzx   ecx,byte [esi]
        cmp     cl,0c0h
        jb      literal
        and     cl,00111111b
        add     [xcount],cx
        inc     esi
        mov     al,[esi]
        rep     stosb
        jmp     nxt_2
literal:inc     word [xcount]
        mov     [edi],cl
        inc     edi
nxt_2:  inc     esi
        mov     ax,[xcount]
        cmp     [TotalBytes],ax
        ja      nxt_3
        add     edi,[blank]
        mov     word [xcount],0
        inc     word [ycount]
        mov     ax,[ycount]
        cmp     [YSIZE],ax
        ja      nxt_3

        mov     ebx,4
        mov     esi,screen
nxt_4:  mov     ecx,16384
        mov     edi,0a0000h
        rep     movsd
        call    switch_bank
        dec     ebx
        jnz     nxt_4
        mov     ecx,11264
        mov     edi,0a0000h
        rep     movsd

        xor     cx,cx
        mov     dx,1
nxt_5:  mov     ax,4f07h
        xor     bx,bx
        int     10h
        cmp     al,4fh
        jne     near exit
        inc     dx
        cmp     dx,481
        jb      nxt_5

exit_1: call    reset_mode
        jc      exit

        mov     al,0
exit:   mov     ah,4ch
        int     21h

switch_bank:add dword [bank],16 ; 1 for 64k banks
        push    eax
        push    ebx
        push    edx
        mov     ax,4f05h
        xor     ebx,ebx
        mov     edx,[bank]
        int     10h
        pop     edx
        pop     ebx
        pop     eax

set_mode:mov    [new_mode],ax
        mov     ax,4f03h
        int     10h
        cmp     al,4fh
        jne     vesa_err
        mov     [old_mode],bx

        mov     ax,4f02h
        mov     bx,[new_mode]
        int     10h
        cmp     al,4fh
        jne     vesa_err

reset_mode:mov  ax,4f02h
        mov     bx,[old_mode]
        int     10h
        cmp     al,4fh
        jne     vesa_err

vesa_err:mov    al,ah

set_palette:mov dx,3c8h
        xor     al,al
        out     dx,al           ; 0 init to DAC
        inc     dx              ; Dac write
        mov     ecx,768         ; length palet
nxt:    mov     al,[esi]
        shr     al,2
        out     dx,al           ; byte to DAC send
        inc     esi
        dec     ecx
        jnz     nxt

read_file:mov   ax,3dh << 8
        mov     edx,[edi+4]     ; argv [1]
        int     21h
        jc      read_end
        mov     bx,ax

        mov     ah,3fh
        mov     ecx,640 * 480 + 769 +128
        mov     edx,pcx_hdr
        int     21h
        jc      read_end
        mov     [flength],eax

        mov     ah,3eh
        int     21h

        segment _DATA use32 align=4096 public class=DATA
flength dd      0
blank   dd      0

bank    dd      0

xcount  dw      0
ycount  dw      0

XSIZE   dw      0
YSIZE   dw      0
TotalBytes dw   0

old_mode dw     0
new_mode dw     0

pcx_hdr         resb    0
..Manufacturer   resb    1
..Version        resb    1
..Encoding       resb    1
..BitsPerPixel   resb    1
..MinX           resw    1
..MinY           resw    1
..MaxX           resw    1
..MaxY           resw    1
..HRes           resw    1
..VRes           resw    1
..ColorMap       resb    48
..Reserved       resb    1
..NPlanes        resb    1
..BytesPerLine   resw    1
..PaletteInfo    resw    1
..Padding        resb    58

pcx_data        resb    640 * 480

pcx_pal         resb    769

screen          resb    640 * 480

Tue, 10 Dec 2002 03:00:00 GMT  
 [ 2 post ] 

 Relevant Pages 

1. Fast data fill

2. Ms SQL fileerror 22001=String data, right truncation when I fill data into file

3. Fast filled rectangles in mode 12h...

4. Fast memory fill

5. Fast filled polygons

6. ways to collect data from two collections of the same size

7. Can I fill Browse box with queue data ?

8. Imaging - scanning images and auto-filling data

9. Filling listbox with data from Text or Excel file

10. Continuously building an array filled up with data coming from a dbl line

11. Horizontal Fill Slide question (two data points)

12. Using PHP to fill data on a PDF


Powered by phpBB® Forum Software