code SEGMENT para public 'code' assume cs:code,ds:code locals .286 ORG 100h .386 MAIN PROC NEAR mov ax,13h int 10h mov bp,6000h ;6000h+7000h water segz,bp ;6000h xor 1000h = 7000h mov al,-1 mov es,bp mov cx,-1 xor di,di rep stosb xor bp,1000h ;switch mov es,bp dec cx xor di,di rep stosb ;comment /* mov dx,03c8h xor ax,ax out dx,al inc dx @asdf: mov al,bl shr al,3 out dx,al ;xor al,al out dx,al mov al,bl shr al,2 out dx,al inc bx jnz @asdf ;/* ; xor ax,ax ; int 33h keypressed: xor bp,1000h ;switch mov es,bp mov ax,3 int 33h shr cx,1 ;^^^^^^^^^ ;random rain drops, first one is from mouse mov bx,2 @rainy: mov ax,320 mul dx add ax,cx cmp ah,0fah ; cmp ax,320*200 jb @@noclip ; mov ax,64000 mov ah,0fah @@noclip: mov di,ax mov ax,-1 mov es:[di],ax mov es:[di+320],ax call @rand mov dx,ax call @rand mov cx,ax dec bx jnz @rainy @noset: call @advance_water call @render_bump in al,60h dec al jnz keypressed mov ax,03h int 10h ret MAIN ENDP @rand: in ax,40h xor ax,randseed mov randseed,ax ret @advance_water: push ds mov ax,bp mov bx,bp xor bx,1000h mov ds,ax mov es,bx xor di,di xor dx,dx @@adv_loop: xor cx,cx xor ax,ax mov dl,es:[di] mov cl,[di-321] mov al,[di-320] add ax,cx mov cl,[di-319] add ax,cx mov cl,[di-1] add ax,cx mov cl,[di+1] add ax,cx mov cl,[di+319] add ax,cx mov cl,[di+320] add ax,cx mov cl,[di+321] add ax,cx sar ax,2 sub ax,dx mov cx,ax sar cx,9 xor ax,cx mov es:[di],al dec di jnz @@adv_loop pop ds ret @render_bump: mov dx,03dah in al,dx test al,8 jz $-3 in al,dx test al,8 jnz $-3 push bp push ds push 0a000h pop es mov ax, bp xor ax, 1000h push ax pop ds mov ax,3 int 33h shr cx, 1 neg dx ;dx = mousey neg cx ;cx = mousex xor di,di ;screen pos mov bp,200 ; y count @@y: mov si,320 ; x count push cx @@x: mov al,[di-1] mov bl,[di+1] sub ax,bx sub ax,cx jns @@1 neg ax @@1: mov bl,[di-320] mov bh,[di+320] sub bl,bh movsx bx,bl sub bx,dx jns @@2 neg bx @@2: add ax,bx not al or ah,ah jz @@3 xor ax,ax @@3: stosb inc cx dec si jnz @@x pop cx inc dx dec bp jnz @@y pop ds pop bp ret randseed dw ? code ends end main