677 calc_offs MACRO xval,yval mov bx,xval mov ax,yval xchg ah,al ; ax=256*y add bx,ax ; bx=256*y+x shr ax,2 add bx,ax ; bx=320*y+x (+ offset in buffer if needed.) ENDM img_cpy MACRO wdth,hght,src_seg,src_offs,dest_seg,dest_offs LOCAL y_lp, x_lp, skip_palreg0,w_hor mov dx,wdth mov bx,hght mov bp,320 sub bp,wdth mov cx,0 mov es,dest_seg mov di,dest_offs push ds mov si,src_offs mov ds,src_seg y_lp: mov ax,dx x_lp: mov cl,ds:[si] jcxz skip_palreg0 mov es:[di],cl skip_palreg0: inc si inc di dec ax jnz x_lp add si,bp ;next line add di,bp dec bx jnz y_lp pop ds ENDM img_cpy2 MACRO wdth,hght,src_seg,src_offs,dest_seg,dest_offs LOCAL y_rlp,div4_ok,min_ok mov bx,hght mov dx,wdth cmp dx,4 jae min_ok mov dx,4 jmp div4_ok min_ok: test dx,0000000000000011b jz div4_ok add dx,3 and dx,1111111111111100b div4_ok: mov ax,320 sub ax,dx shr dx,2 mov es,dest_seg mov di,dest_offs push ds mov si,src_offs mov ds,src_seg y_rlp: mov cx,dx rep movsd add si,ax add di,ax dec bx jnz y_rlp pop ds ENDM img_rest MACRO wdth,hght,src_seg,src_offs,dest_seg,dest_offs LOCAL y_rlp,min_ok,div4_ok mov bx,hght mov dx,wdth cmp dx,4 jae min_ok mov dx,4 jmp div4_ok min_ok: test dx,0000000000000011b jz div4_ok add dx,3 and dx,1111111111111100b div4_ok: mov ax,320 sub ax,dx shr dx,2 mov es,dest_seg mov di,dest_offs push ds mov si,src_offs mov ds,src_seg y_rlp: mov cx,dx rep movsd add si,ax add di,ax dec bx jnz y_rlp pop ds ENDM . 0