?? tube.x86
字號:
; 256bytes demos archive Baze巵嶌偺tube傪堏怉; 僆儕僕僫儖擖庤愭 http://www.256b.com; 栚昗 1024bytes乧; 壗傕彂偄偰側偄偺偵 師儕儕乕僗偺梊掕偵擖偭偰傞側傫偰 傂偘傐傫旕摴偄傗 bits 32SYSPRINT equ 0x0001 ; 僥僉僗僩昞帵LEMMINGS equ 0x0002 ; 儗儈儞僌僗GETVRAMINFO equ 0x0011 ; VRAM庢摼%if 0SCREEN_W equ 160SCREEN_H equ 160%elseSCREEN_W equ 240SCREEN_H equ 240%endif struc tube_t.fpuwork resd 1.angle resd 1.step resd 1.yalign resd 1.vram resd 1.bpp resd 1.vramw resd 1.vramh resd 1.targw resd 1.r240 resd 1.r128ppi resd 1.anglestep resd 1.size endstrucscreen equ 0xc0000000palettes equ (screen + (SCREEN_W * SCREEN_H))texture equ (palettes + (0x100 * 4))dataend equ (texture + 0x10000)section .text%ifdef BUILD_ON_LINUX global user_startuser_start:%else global _user_start_user_start:%endif sub esp, byte (tube_t.size) ; VRAM庢摼 xor ebx, ebx mov bl, GETVRAMINFO lea esi, [esp + tube_t.vram] int 0x80 mov ebp, [esp + tube_t.bpp] mov esi, errvrammsg cmp ebp, byte 16 jb short .lemmings ; FPU僠僃僢僋 add esi, byte (errfpumsg - errvrammsg) fninit fnstcw word [esp] cmp word [esp], 0x37f je short .main ; 僾儘僙僗廔椆.lemmings: xor ebx, ebx mov bl, SYSPRINT int 0x80 xor ebx, ebx mov bl, LEMMINGS int 0x80 ; 傔偄傫乣.main: cld ; 僷儗僢僩嶌惉makepalettes: mov edi, palettes xor ecx, ecx.lp1: mov eax, ecx imul eax shr eax, 7 mov ah, cl rcl eax, 9 stosd inc ecx cmp ecx, byte 0x7f jbe short .lp1 dec ecx xor eax, eax.lp2: imul eax, ecx, 0x000201 stosd dec ecx jns short .lp2 inc ecx ; 僥僋僗僠儍嶌惉 (棎悢偑柺搢側傫偱僆儕僕僫儖偐傜庁傝偰棃傞)maketexture: ; mov edi, texture.lp1: mov [edi + ecx], cl inc ecx or cx, cx jne short .lp1 mov dl, 0xc9 xor eax, eax.lp2: lea esi, [ecx + 255] movzx esi, si movzx ebx, cx add eax, ecx rol ax, cl mov dh, al sar dh, 5 adc dl, dh adc dl, [edi + esi] shr dl, 1 mov [edi + ebx], dl not bh mov [edi + ebx], dl loop .lp2 mov ebx, esp ; rdata僐僺乕 mov esi, const_tbl lea edi, [ebx + tube_t.targw] mov cl, 4 rep movsd ; yalign寁嶼 shr ebp, 3 mov eax, [ebx + tube_t.vramw] sub eax, [ebx + tube_t.targw] imul ebp mov [ebx + tube_t.yalign], eax ; 寁嶼乣updatescreen: mov esi, [ebx + tube_t.step] add byte [ebx + tube_t.step + 1], 8 mov ecx, screen fld dword [ebx + tube_t.angle] fadd dword [ebx + tube_t.anglestep] fst dword [ebx + tube_t.angle] fsincos mov edi, -(SCREEN_H / 2).lp2: mov ebp, -(SCREEN_W / 2).lp1: mov [ebx], ebp fild dword [ebx] mov [ebx], edi fild dword [ebx] fld st0 ; y fmul st0, st3 fld st2 ; x fmul st0, st5 fsubp st1, st0 fxch st0, st2 fmul st0, st3 fxch st0, st1 fmul st0, st4 faddp st1, st0 fld dword [ebx + tube_t.r240]%if 1 fld st1 ; y fmul st0, st4 fld st1 ; z fmul st0, st6 fsubp st1, st0 fxch st0, st1 fmul st0, st4 fxch st0, st2 fmul st0, st5 faddp st2, st0%endif fld st2 fmul st0, st0 fld st2 fmul st0, st0 faddp st1, st0 fsqrt fdivp st1, st0 fxch st0, st2 fpatan fmul dword [ebx + tube_t.r128ppi] fistp dword [ebx] mov dl, [ebx] fmul dword [ebx + tube_t.r128ppi] fistp dword [ebx] mov dh, [ebx] lea eax, [esi + edx] add al, ah and al, 64 mov ah, 8 je short .store shl edx, 2 lea eax, [esi + edx] sub al, ah mov ah, 16 jns short .store add edx, edx mov ah, 48.store: mov al, byte [ecx] sar al, 2 sub al, ah lea edx, [esi + edx] movzx edx, dx add al, [texture + edx] mov [ecx], al inc ecx inc ebp cmp ebp, byte (SCREEN_W / 2) jl near .lp1 inc edi cmp edi, byte (SCREEN_H / 2) jl near .lp2 fstp st0 fstp st0 ; VRAM昤夋乣vramdraw: mov edx, [ebx + tube_t.vram]; mov ecx, palettes mov esi, screen push dword updatescreen mov edi, SCREEN_H cmp [ebx + tube_t.bpp], byte 24 je short vramdraw24 cmp [ebx + tube_t.bpp], byte 16 je short vramdraw16vramdraw32:.lp2: mov ebp, [ebx + tube_t.targw].lp1: movzx eax, byte [esi] inc esi mov eax, [ecx + eax * 4] mov [edx], eax add edx, byte 4 dec ebp jne short .lp1 add edx, [ebx + tube_t.yalign] dec edi jne short .lp2 retvramdraw24:.lp2: mov ebp, [ebx + tube_t.targw].lp1: movzx eax, byte [esi] inc esi mov eax, [ecx + eax * 4] mov [edx], ax shr eax, 16 add edx, byte 3 mov [edx-1], al dec ebp jne short .lp1 add edx, [ebx + tube_t.yalign] dec edi jne short .lp2 retvramdraw16:.lp2: mov ebp, [ebx + tube_t.targw].lp1: movzx eax, byte [esi] inc esi mov eax, [ecx + eax * 4] ror eax, 8 shr ah, 3 shr ax, 2 rol eax, 5 mov [edx], ax add edx, byte 2 dec ebp jne short .lp1 add edx, [ebx + tube_t.yalign] dec edi jne short .lp2 reterrvrammsg db 'Require 16/24/32bpp.', 10, 0errfpumsg db 'Require FPU.', 10, 0 align 4const_tbl dd SCREEN_W dd 240. ; Z偺僨僼僅儖僩 dd 40.743665431525205956834 ; 128 / PI dd 0.05 ; 偰偒偲乕夞揮兤const_term: ends
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -