; illustrates MMX instructions, multiple data segments and double buffering ; for multiple segment program examples, look at section 14.3 in your text. .model large .586 .mmx sseg segment 'STACK' db 150h dup(?) sseg ends data0 segment 'DATA' ; mmx vectors green db 2,2,2,2,2,2,2,2 incrm db 01,01,01,01,01,01,01,01 mask0 db 15,15,15,15,15,15,15,15 ffg dq 0101010101010101h ; line 13 data0 ends ; data1 segment contains double buffer data1 segment 'DATA' dbuf db 64000 dup(?) data1 ends cseg segment 'CODE' assume cs:cseg, ds:data0, ss:sseg main proc mov ax,data0 mov ds,ax mov ax,data1 ; double buffer mov fs,ax mov ax,0013h int 10h mov di,0a000h mov es,di mov di,0 mov cx,200 mov bx,offset incrm movq mm1,[bx] mov bx,offset green movq mm0,[bx] loop0: mov ax,0 loop1: movq fs:[di],mm0 add di,8 inc ax cmp ax,40 jne loop1 paddb mm0,mm1 ; change color ;pcmpeqb mm0,[ffg] mov bx,offset mask0 pand mm0,[bx] loop loop0 ; now move everything from fs to es: mov cx,8000 mov di,0 qlp: movq mm4,fs:[di] movq es:[di],mm4 add di,8 loop qlp emms ; end prog mov ah,1 int 21h ; key delay mov al,3 int 10h mov ax,4c00h int 21h main endp cseg ends end