files
kolibrios/programs/demos/tube/tube.asm
IgorA c77ec910a2
All checks were successful
Build system / Check kernel codestyle (pull_request) Successful in 34s
Build system / Build (pull_request) Successful in 5m20s
Apps/tube: Improved code style and readability
- Magic numbers are replaced with constants;
- Added copyrights and source to the original;
- Removed unnecessary *.bat files.

Co-authored-by: Max Logaev <maxlogaev@proton.me>
2025-03-12 02:51:00 +03:00

246 lines
3.1 KiB
NASM

; SPDX-License-Identifier: GPL-2.0
; Ported tube demo by VT
; Copyright (C) 2006-2025 KolibriOS team
; Original comments:
; 256b intro by baze/3SC for Syndeecate 2001
; loveC: thanks, Serzh: eat my socks dude ;]
; e-mail: baze@stonline.sk, web: www.3SC.sk
; Original source: https://baze.sk/3sc/files/tube.zip
use32
org 0
db 'MENUET01'
dd 1,START,image_end,memory_end,stacktop,0,0
include '../../macros.inc'
include '../../KOSfuncs.inc'
title db 'Tube - FPU',0
SCREEN_W equ (640-10) ;10 px for borders
SCREEN_H equ (400-10)
align 4
START:
call draw_window
call init_tube
push ebx
still:
pop ebx
call MAIN
push ebx
mcall SF_WAIT_EVENT_TIMEOUT,1
cmp eax,EV_REDRAW
jne no_red
call draw_window
jmp still
no_red:
or eax,eax
jz still
mcall SF_TERMINATE_PROCESS
EYE equ EYE_P-4
align 4
MAIN:
;edx - coord y
;ebp - coord x
;edi - pixel buffer
add ebx,10 shl 8
mov edi,PIXBUF
fadd dword [TEXUV-4]
push edi
mov edx,-SCREEN_H/2
TUBEY:
mov ebp,-SCREEN_W/2
TUBEX:
mov esi,TEXUV
fild word [EYE]
mov [esi],ebp
fild word [esi]
mov [esi],edx
fild word [esi]
mov cl,2
ROTATE:
fld st3
fsincos
fld st2
fmul st0,st1
fld st4
fmul st0,st3
fsubp st1,st0
fxch st3
fmulp st2,st0
fmulp st3,st0
faddp st2,st0
fxch st2
loop ROTATE
fld st1
db 0xdc,0xc8 ;fmul st0,st ?
fld st1
db 0xdc,0xc8 ;fmul st0,st ?
faddp st1,st0
fsqrt
fdivp st3,st0
fpatan
fimul word [esi-4]
fistp word [esi]
fimul word [esi-4]
fistp word [esi+1]
mov esi,[esi]
lea eax,[ebx+esi]
add al,ah
and al,64
mov al,-5
jz STORE_1
shl esi,2
lea eax,[ebx+esi]
sub al,ah
mov al,-16
jns STORE_1
shl esi,1
mov al,-48
STORE_1:
; add al,[ebx+esi+0x80000]
add [edi],al
inc edi
inc ebp
cmp ebp,SCREEN_W/2
EYE_P:
jnz TUBEX
inc edx
cmp edx,SCREEN_H/2
jnz TUBEY
call display_image
pop esi
mov ecx,SCREEN_H*SCREEN_W
align 4
BLUR:
inc esi
sar byte [esi],2
loop BLUR
ret
align 4
display_image:
pusha
mov esi,PIXBUF
mov edi,buf2
align 4
newp:
movzx edx,byte [esi]
shl edx,4
mov [edi],edx
add edi,3
inc esi
cmp esi,PIXBUF+SCREEN_W*SCREEN_H
jbe newp
xor edx,edx
mcall SF_PUT_IMAGE,buf2,<SCREEN_W,SCREEN_H>
popa
ret
align 4
draw_window:
pusha
mcall SF_REDRAW, SSF_BEGIN_DRAW
mcall SF_STYLE_SETTINGS, SSF_GET_SKIN_HEIGHT
add eax,SCREEN_H
lea ecx,[100*65536+4+eax]
mcall SF_CREATE_WINDOW,100*65536+SCREEN_W+9,, 0x74000000,,title
mcall SF_REDRAW, SSF_END_DRAW
popa
ret
align 4
db 41,0,0xC3,0x3C
TEXUV:
rd 1
align 4
init_tube:
mov ecx,256
PAL1:
mov edx,3C8h
mov eax,ecx
inc edx
sar al,1
js PAL2
mul al
shr ax,6
PAL2:
mov al,0
jns PAL3
sub al,cl
shr al,1
shr al,1
PAL3:
mov ebx,ecx
mov [ebx+buf1],bh
loop PAL1
mov ecx,256
TEX:
mov bx,cx
add ax,cx
rol ax,cl
mov dh,al
sar dh,5
adc dl,dh
adc dl,[ebx+255+buf1]
shr dl,1
mov [ebx+buf1],dl
not bh
mov [ebx+buf1],dl
loop TEX
fninit
fldz
ret
align 4
image_end:
PIXBUF rb SCREEN_W*SCREEN_H
buf1 rb SCREEN_W*SCREEN_H
buf2 rb SCREEN_W*SCREEN_H*3
rb 1024
align 4
stacktop:
memory_end: