Cheers, thought about the reflections on water thing: (requires a bit of imagination)
org 100h
mov al,13h
int 10h
lds si,[bx]
draw_loop:
mov bx,cx ;copy background pixel address, going to be altered later for foreground pixel address
mov ax,dx ;copy background colour value
and ch,80h ;mask the sign of the address
and al,ch ;mask background colour with it
mov ch,bh ;restore original pixel address
; and al,080h ;mask background colour value
mov [bx], al ;plot background pixel
add dl,bh ;alter colour value for next background pixel add dl,bh =moving / add dl,bl =squiggles
or bl,bh ;alter pixel address for foreground
add bl,dh ;scroll the foreground add bx,ax =vertical / add bl,dh =horizontal
mov [bx],bh ;plot foreground pixel mov [bx],dh =multicolour / mov [bx],bh =chaging colour
loop draw_loop
inc dx ;adjust for background colour cycling and for foreground scrolling
;jmp draw_loop
in al,60h
dec al
jnz draw_loop
ret
it compiles to 37 bytes but if you take out the ESC test and put in the JMP it's 32