Paining Tomatro by T$ [web]

; Paining Tomatro
; Fastmade 256b entry for Revision 2019 from T$
; runs on MS-DOS / FreeDOS / DosBOX (cycles = max or at least high enough for > 18 fps) 
; note that some windows machines have insufficient pc speaker timing both with XP DOS box or NTVDN,
; use plain DOS for maximum fidelity

org 100h

push word 0a000h - 70 ;modified to center to 160,100
pop es

; optional: set fs explicitly to avoid problems with some memory managers:
push byte 0
pop fs

mov al,13h
int 10h


; visuals

mov ax,bp
and ax,7
sub ax,4
imul al
add ax,ax
add ax,70
mov bx,bp
test bl,0x40
jz verkehrt
    neg bl
add bx,bx
mov bh,al

sub bl, 40

eyedist equ 22
eyeheight equ 28

tomatoendcolor equ 46 ;48
eyecolorend equ 31
mov dx, eyecolorend
mov si, 8*256

test bp,32+16+6
jnz noblink
        mov si,bp
        shl si,12

;mov cx,16 ;eyes
call kugelding
jc passtschon

sub bx,eyedist*2
call kugelding
jc passtschon

mov dx,bp
and dx,7
add dx,tomatoendcolor
add bx,eyeheight*256+eyedist
mov si,256
;mov cx,16 ; sphere
call kugelding
jc passtschon

; fade fx

mov al,[es:di]
inc al
cmp al,100
jnb strobo

;test bp,32
;jnz strobo
mov dx,bp
shr dl,4

 mov cx,di
 xor cl,ch
 add cl,al
 and cl,dl
 jnz passtschon

    mov ax,bp
    and al,3
    add ax,ax
    jp passtschon
    add al,103 ; 103 - 123


or di,di
jnz schleife

mov bp,[fs:0x46c]

; sound

mov ax,bp

shl ax,5

jp np
 add ax,ax

imul al
shr ax,7

cmp al, 20
ja bums
    mov ax,bp
    shl ax,4
    add al,ah
    add ax,ax

out 42h,al ; set speaker freq

add cx,bp
test cl,0x2
jnz simple
    test cl,0x5
    jz r
        not cl
    shr cx,4
    and cl,3
    mov ch,0xff
    shr ch,cl
    and al,ch

out 42h,al
not al
out 61h,al ; enable speaker

; ui

in al,60h
; optional: check with dec instead of das for better dosbox compatibility:
dec al       ;das
jnz schleife ;jp schleife

kugelding: ; bh = yOffset, bl = xOffset, si = scale, dx = color offset, cx = maxdist^2
push dx
    mov ax,0xCCCD
    mul di        ; dh = y, dl.ah = x)

    xchg ax,dx
        mov dl, ah
add ax,bx
    imul al ; ax = x^2
        xchg ax,dx
sub al,bh
    imul al ; dx = x^2, ax = y^2
    add ax,dx
mov dx,bp
;shr dx,1
and dx,31
add dx,si
mul dx;si
xchg ax,dx

pop dx

cmp ax,16;cx
    mov cx,di
    xor cl,ch
    and cx,1
    add ax,cx

    neg ax
    add ax,dx

;db "Tomat"