gates_of_skeldal/game/engine2.asm
2025-01-25 13:08:41 +01:00

2188 lines
72 KiB
NASM

.model small
.386
DGROUP group _DATA
tzoom struc
startptr DD ? ;0
texture DD ? ;4
textline DD ? ;8
linelen DD ? ;12
xtable DD ? ;16
ytable DD ? ;20
palette DD ? ;24
ycount DW ? ;28
xmax DW ?
tzoom ends
extrn _zoom:dword [8]
extrn _lbuffer:dword
extrn _screen:dword
extrn _gran_mask:dword
extrn _lastbank:dword
_TEXT segment byte public 'CODE' use32
assume CS:_TEXT
assume DS:DGROUP
extrn mapvesaadr_:proc
extrn switchmap_:proc
extrn switchvesabank_:proc
public sikma_zleva_
sikma_zleva_:
mov edi,_zoom ;nacti ukazatel do obrazovky
mov ebx,_zoom[offset tzoom.palette] ;ukazatel na paletu
mov cx,word ptr _zoom[offset tzoom.ycount] ;velikost textury na y
shl ecx,16 ;vloz do horni pulky ecx
mov esi,_zoom[offset tzoom.texture] ;nacti ukazatel na texturu
skzl3: mov edx,_zoom[offset tzoom.xtable] ;nacti ukazetel na zvetsovaci tabulku x
push esi ;uchovej esi
push edi ;uchovej edi
mov cx,_zoom[offset tzoom.xmax]
skzl1: xor eax,eax ;vynuluj eax pro spravny vypocet
lodsb ;nacti bod
add esi,[edx] ;posun se od nekolik pozic v texture podle hodnoty v tabulce x
add edx,4 ;posun se v tabulce x o dalsi polozku
or al,al ;test bodu na nulu
jz skz1 ;preskoc transparetni barvu
cmp al,1 ;test bodu na jedna
jz skz2 ;ukonci kresleni linky pokud narazi na 1
mov ax,[eax*2+ebx] ;konverze barvy podle palety
mov [edi],ax ;nakresli bod na obrazovce
skz1: add edi,2 ;dalsi pozice
dec cx
jnz skzl1 ;opakuj dokola
skz2: pop edi ;obnov edi
pop esi ;obnov esi
mov edx,_zoom[offset tzoom.ytable] ;vyzvedni ukazatel na ytable
mov cx,[edx] ;cx - o kolik pozic se mam v texture posunout dolu
or cx,cx
jz skzskp
skzl2: add esi,_zoom[offset tzoom.textline] ;posun o jednu pozici
dec cx ;sniz citac
jnz skzl2 ;dokud neni nula
skzskp:add edx,2 ;dalsi hodnota v tabulce
mov _zoom[offset tzoom.ytable],edx ;uloaz na puvodni misto
sub edi,_zoom[offset tzoom.linelen] ;odecti tolik, kolik odpovida lince na obrazovce
sub ecx,10000h ;sniz horni pulku ecx o jedna
jnz skzl3 ;opakuj dokud neni nula
ret
public sikma_zprava_
sikma_zprava_:
mov edi,_zoom ;nacti ukazatel do obrazovky
mov ebx,_zoom[offset tzoom.palette] ;ukazatel na paletu
mov cx,word ptr _zoom[offset tzoom.ycount] ;velikost textury na y
shl ecx,16 ;vloz do horni pulky ecx
mov esi,_zoom[offset tzoom.texture] ;nacti ukazatel na texturu
skzp3: mov edx,_zoom[offset tzoom.xtable] ;nacti ukazetel na zvetsovaci tabulku x
push esi ;uchovej esi
push edi ;uchovej edi
mov cx,_zoom[offset tzoom.xmax]
skzp1: xor eax,eax ;vynuluj eax pro spravny vypocet
lodsb ;nacti bod
add esi,[edx] ;posun se od nekolik pozic v texture podle hodnoty v tabulce x
add edx,4 ;posun se v tabulce x o dalsi polozku
or al,al ;test bodu na nulu
jz skz3 ;preskoc transparetni barvu
cmp al,1 ;test bodu na jedna
jz skz4 ;ukonci kresleni linky pokud narazi na 1
mov ax,[eax*2+ebx] ;konverze barvy podle palety
mov [edi],ax ;nakresli bod na obrazovce
skz3: sub edi,2 ;dalsi pozice
dec cx
jnz skzp1 ;opakuj dokola
skz4: pop edi ;obnov edi
pop esi ;obnov esi
mov edx,_zoom[offset tzoom.ytable] ;vyzvedni ukazatel na ytable
mov cx,[edx] ;cx - o kolik pozic se mam v texture posunout dolu
or cx,cx
jz skpskp
skzp2: add esi,_zoom[offset tzoom.textline] ;posun o jednu pozici
dec cx ;sniz citac
jnz skzp2 ;dokud neni nula
skpskp: add edx,2 ;dalsi hodnota v tabulce
mov _zoom[offset tzoom.ytable],edx ;uloaz na puvodni misto
sub edi,_zoom[offset tzoom.linelen] ;odecti tolik, kolik odpovida lince na obrazovce
sub ecx,10000h ;sniz horni pulku ecx o jedna
jnz skzp3 ;opakuj dokud neni nula
ret
public zooming32_
zooming32_:
;esi - zdrojovy blok
;edi - cil
;eax - pozadi
;zoom.xtable - tabulka pro x
;zoom.xtable - tabulka pro y
;zoom.textline - rozdil mezi pravym okrajem a levym okrajem
; pri prechodu na novou radku
;ecx ysize:xsize
push ebp
mov ebp,eax
mov ebx,_zoom[offset tzoom.ytable]
z32d: push cx
mov edx,_zoom[offset tzoom.xtable]
push esi
z32c: mov al,[edx]
inc edx
or al,al
jz z32a
lodsw
test ax,8000h
jnz z32e
stosw
stosw
jmp z32b
z32f: test eax,8000h
jz z32g
test eax,80000000h
jz z32h
z32e: mov eax,[ds:ebp]
stosd
jmp z32b
z32g: rol eax,16
mov ax,[ds:ebp+2]
rol eax,16
stosd
jmp z32b
z32h: mov ax,[ds:ebp]
stosd
jmp z32b
z32a: lodsd
test eax,80008000h
jnz z32f
stosd
z32b: add ebp,4
dec cx
jnz z32c
pop esi
mov eax,[ebx]
and eax,0ffffh
add esi,eax
add ebx,2
add edi,_zoom[offset tzoom.textline]
xor cx,cx
sub ecx,10000h
pop cx
jnz z32d
pop ebp
ret
public zooming32b_
zooming32b_:
;esi - zdrojovy blok
;edi - cil
;zoom.xtable - tabulka pro x
;zoom.ytable - tabulka pro y
;zoom.textline - rozdil mezi pravym okrajem a levym okrajem
; pri prechodu na novou radku
;ecx ysize:xsize
;zoom.ycount - interni (ulozeni maskovane adr stranky)
;zoom.xmax - interni (pocet dwordu do prepnuti)
;zoom.linelen - interni (velikost stranky v dwordech)
call mapvesaadr_ ;mapuj spravne edi
push ebp
mov ebp,eax
mov ebx,_zoom[offset tzoom.ytable]
z32bd: push cx
mov edx,_zoom[offset tzoom.xtable]
push esi
push edi
z32bc: mov al,[edx]
inc edx
or al,al
jz z32ba
lodsw
test ax,8000h
jnz z32be
stosw
stosw
jmp z32bb
z32bf: test eax,8000h
jz z32bg
test eax,80000000h
jz z32bh
z32be: mov eax,[ds:ebp]
stosd
jmp z32bb
z32bg: rol eax,16
mov ax,[ds:ebp+2]
rol eax,16
stosd
jmp z32bb
z32bh: mov ax,[ds:ebp]
stosd
jmp z32bb
z32ba: lodsd
test eax,80008000h
jnz z32bf
stosd
z32bb: add ebp,4
movzx eax,di ;prevezmi dolni cast edi do eax
dec eax ;odecti 1 (0=0xffffffff)
cmp eax,_gran_mask ;je vetsi nez granualita?
jc z32gb ;ne, vse je ok
mov eax,_lastbank ;ano, pak vem cislo banky
inc eax ;pricti 1
mov _lastbank,eax ;zapis jako nove cislo banky
pushad ;uchovej vse
call switchvesabank_ ;prepni banku
popad ;obnov vse
mov edi,0a0000h ;vynuluj dolni cast di
z32gb: dec cx ;tady pokracujem
jnz z32bc ;opakuj cxkrat
pop edi ;obnov edi
add di,1280 ;pricti radek
and di,word ptr _gran_mask ;maskuj granualitou
pop esi
mov eax,[ebx]
and eax,0ffffh
add esi,eax
add ebx,2
xor cx,cx
sub ecx,10000h
pop cx
jnz z32bd
pop ebp
ret
public zooming_lo_
zooming_lo_:
;esi - zdrojovy blok
;edi - cil
;zoom.xtable - tabulka pro x
;zoom.xtable - tabulka pro y
;zoom.textline - rozdil mezi pravym okrajem a levym okrajem
; pri prechodu na novou radku
;ecx ysize:xsize
;ebx xlat
push ebp
mov bp,cx
zlod: mov cx,bp
mov edx,_zoom[offset tzoom.xtable]
push esi
zloc: xor eax,eax
mov al,[edx]
inc edx
or al,al
jz zloa
lodsw
mov eax,[ebx+eax*2]
stosb
jmp zlob
zloa: lodsw
mov eax,[ebx+eax*2]
stosb
add esi,2
zlob: dec cx
jnz zloc
pop esi
mov edx,_zoom[offset tzoom.ytable]
mov eax,[edx]
shl eax,1
and eax,0ffffh
add esi,eax
add edx,2
mov _zoom[offset tzoom.ytable],edx
add edi,_zoom[offset tzoom.textline]
xor cx,cx
sub ecx,20000h
jnz zlod
pop ebp
ret
public zooming256_
zooming256_:
;esi - zdrojovy blok
;edi - cil
;eax - pozadi
;zoom.xtable - tabulka pro x
;zoom.xtable - tabulka pro y
;zoom.textline - rozdil mezi pravym okrajem a levym okrajem
; pri prechodu na novou radku
;ecx ysize:xsize
;ebx xlat
push ebp
mov ebp,eax
z256d: push cx
mov edx,_zoom[offset tzoom.xtable]
push esi
z256c: xor eax,eax
mov al,[edx]
inc edx
or al,al
jz z256a
lodsw
test eax,8000h
jnz z256e
mov al,[ebx+eax*2]
mov ah,al
stosw
jmp z256b
z256e: mov ax,[ds:ebp]
and eax,7fffh
mov al,[ebx+eax*2]
stosb
mov ax,[ds:ebp+2]
and eax,7fffh
mov al,[ebx+eax*2]
stosb
jmp z256b
z256g: mov ax,[ds:ebp]
and eax,7fffh
mov al,[ebx+eax*2]
stosb
jmp z256h
z256i: mov ax,[ds:ebp+2]
and eax,7fffh
mov al,[ebx+eax*2]
stosb
jmp z256b
z256a: lodsw
test eax,8000h
jnz z256g
mov al,[ebx+eax*2]
stosb
z256h: lodsw
test eax,8000h
jnz z256i
mov al,[ebx+eax*2]
stosb
z256b: add ebp,4
xor ebx,1
dec cx
jnz z256c
xor ebx,1
pop esi
mov edx,_zoom[offset tzoom.ytable]
mov eax,[edx]
and eax,0ffffh
add esi,eax
add edx,2
mov _zoom[offset tzoom.ytable],edx
add edi,_zoom[offset tzoom.textline]
xor cx,cx
sub ecx,10000h
pop cx
jnz z256d
pop ebp
ret
swap_at_end macro reg16,reg32
local sw1,sw2
sw2: movzx eax,reg16 ;nacti 16 bitovou cast registru
dec eax ;sniz ke kontrole o 1
cmp eax,_gran_mask ;kontrola zda je vetsi nebo rovny masce
jc sw1 ;kdyz ne tak preskoc na sw1
mov eax,_lastbank ;vem cislo banky
inc eax ;pricti jednicku
mov _lastbank,eax ;vloz zpatky do banky
pushad
call switchvesabank_ ;prepni banku
popad
sub reg32,_gran_mask ;odecti delku stranky od cele adresy
dec reg32
sw1:
endm
public zooming256b_
zooming256b_:
;esi - zdrojovy blok
;edi - cil
;zoom.xtable - tabulka pro x
;zoom.xtable - tabulka pro y
;zoom.textline - rozdil mezi pravym okrajem a levym okrajem
; pri prechodu na novou radku
;ecx ysize:xsize
;ebx xlat
push ebp
mov ebp,eax
z256bd: push cx
mov edx,_zoom[offset tzoom.xtable]
push edi
call mapvesaadr_
push esi
z256bc: xor eax,eax
mov al,[edx]
inc edx
or al,al
jz z256ba
lodsw
test eax,8000h
jnz z256be
mov al,[ebx+eax*2]
mov ah,al
stosw
jmp z256bb
z256be: mov ax,[ds:ebp]
and eax,7fffh
mov al,[ebx+eax*2]
stosb
mov ax,[ds:ebp+2]
and eax,7fffh
mov al,[ebx+eax*2]
stosb
jmp z256bb
z256bg: mov ax,[ds:ebp]
and eax,7fffh
mov al,[ebx+eax*2]
stosb
jmp z256bh
z256bi: mov ax,[ds:ebp+2]
and eax,7fffh
mov al,[ebx+eax*2]
stosb
jmp z256bb
z256ba: lodsw
test eax,8000h
jnz z256bg
mov al,[ebx+eax*2]
stosb
z256bh: lodsw
test eax,8000h
jnz z256bi
mov al,[ebx+eax*2]
stosb
z256bb: add ebp,4
swap_at_end di,edi
xor ebx,1
dec cx
jnz z256bc
xor ebx,1
pop esi
pop edi
add edi,640
mov edx,_zoom[offset tzoom.ytable]
mov eax,[edx]
and eax,0ffffh
add esi,eax
add edx,2
mov _zoom[offset tzoom.ytable],edx
add edi,_zoom[offset tzoom.textline]
xor cx,cx
sub ecx,10000h
pop cx
jnz z256bd
pop ebp
ret
; public scroll_left_
;scroll_left_: ;edi - kam
; ;lbuffer - obrazovka
; ;zoom.startptr - novy obsah obrazovky
; ;ebx - xlat
; ;eax - o_kolik
; mov bx,ax ;horni pulka ebx vi o kolik se posunuje vlevo
; rol ebx,16
; mov edx,640 ;dolni pulka ebx vi, jak velky blok je presouvan
; sub edx,eax
; sub edx,2
; mov bx,dx
; mov esi,edi ;vypocet esi
; shl eax,1 ;esi = edi + 2 * o_kolik;
; add esi,eax
; mov edx,360 ;napln citac edx cislem udavajici pocet radku
; add edi,_lbuffer ;k edi na zacatku pricti hodnotu _lbuffer
; mov eax,esi ;uchovej esi v eax, behem prenosu bude modifikovan
;scrl1: add esi,_lbuffer ;pricti k esi zacatek obrazovky
; xor ecx,ecx ;vynuluj ecx
; mov cx,bx ;do ecx naladuj delku bloku
; shr ecx,1 ;presun 32-bit
; rep movsd
; adc ecx,1
;; rep movsw
; mov esi,_zoom ;vem ukazatel na novy obsah
; mov ecx,ebx ;vezmi horni pulku EBx
; shr ecx,16 ;to je hodnota, kolik se ma v prava doplnit
; shr ecx,1 ;presun 32-bit
; rep movsd
; adc ecx,1
; rep movsw
; add _zoom,640*2 ;dalsi radka
;; add eax,640*2 ;dalsi radka
; mov esi,eax
; dec edx ;dokud neni konec
; jnz scrl1
; ret
;
public scroll_support_32_
scroll_support_32_:
;edi - lbuffer + pozice na obrazovce
;esi - oldbuffer
;edx - newbuffer
;ebx - xlat
;ecx - size;
push ebp ;uchovej ebp
mov ebp,360 ;ebp pro tuto chvili predstavuje citac
mov eax,ecx ;uchovej ecx jeste v eac - zachova citac sloupcu
scrl1: push esi ;uchovej esi
shr ecx,1 ;presun ecx bloku
rep movsd
rcl ecx,1
rep movsw
mov ecx,640 ;dopocitej ecx do 640
sub ecx,eax
pop esi ;obnov esi
xchg esi,edx ;esi je nyni novy blok
push esi ;uchovek esi
shr ecx,1 ;presun
rep movsd
rcl ecx,1
rep movsw
pop esi ;obnov esi
xchg esi,edx ;vrat edx a esi do puvodniho stavu
mov ecx,eax ;obnov zase ecx z eax
add esi,1280 ;dalsi radek
add edx,1280
dec ebp ; dokud nejsme na konci
jnz scrl1 ;opakuj
pop ebp
ret
movsdx macro ;presun do videopameti s kontrolou na banky
local sw1,konec
push eax
movzx eax,di
add eax,ecx
cmp eax,_gran_mask
ja sw1
shr ecx,2
rep movsd
jmp konec
sw1: mov eax,_gran_mask
sub ax,di
inc eax
sub ecx,eax
xchg eax,ecx
shr ecx,2
rep movsd
xchg eax,ecx
mov eax,_lastbank
inc eax
mov _lastbank,eax
pushad
call switchvesabank_
popad
mov edi,0a0000h
shr ecx,2
rep movsd
konec: pop eax
endm
public scroll_support_32b_
scroll_support_32b_:
;edi - lbuffer + pozice na obrazovce /pokud mozno del 4
;esi - oldbuffer
;edx - newbuffer
;ebx - xlat
;ecx - size pokud mozno / 4;
call mapvesaadr_ ;mapuj spravne edi
push ebp ;uchovej ebp
mov ebp,360 ;ebp pro tuto chvili predstavuje citac
and ecx,not 1
shl ecx,1 ;korekce ecx na delitele 4x
mov eax,ecx ;uchovej ecx jeste v eax - zachova citac sloupcu
scrl1b: push esi ;uchovej esi
movsdx ;presun ecx bajtu (jen ctverice)
mov ecx,1280 ;dopocitej ecx do 640
sub ecx,eax
pop esi ;obnov esi
xchg esi,edx ;esi je nyni novy blok
push esi ;uchovek esi
movsdx
pop esi ;obnov esi
xchg esi,edx ;vrat edx a esi do puvodniho stavu
mov ecx,eax ;obnov zase ecx z eax
add esi,1280 ;dalsi radek
add edx,1280
dec ebp ; dokud nejsme na konci
jnz scrl1b ;opakuj
pop ebp
ret
public scroll_support_256_
scroll_support_256_:
;edi - lbuffer + pozice na obrazovce
;esi - oldbuffer
;edx - newbuffer
;ebx - xlat
;ecx - size;
push ebp ;uchovej ebp
mov ebp,360 ;ebp pro tuto chvili predstavuje citac
scrl1a: push ecx ;uchovej ecx jeste v eac - zachova citac sloupcu
push esi ;uchovej esi
scrl2a: lodsw
and eax,7fffh
mov al,[ebx+2*eax]
xor ebx,1
stosb
dec ecx
jnz scrl2a
pop esi
xchg esi,edx ;esi je nyni novy blok
pop eax
mov ecx,640 ;dopocitej ecx do 640
sub ecx,eax
push eax
push esi ;uchovek esi
scrl3a: lodsw
and eax,7fffh
mov al,[ebx+2*eax]
xor ebx,1
stosb
dec ecx
jnz scrl3a
pop esi ;obnov esi
xchg esi,edx ;vrat edx a esi do puvodniho stavu
pop ecx ;obnov zase ecx z eax
add esi,1280 ;dalsi radek
add edx,1280
xor ebx,1
dec ebp ; dokud nejsme na konci
jnz scrl1a ;opakuj
pop ebp
ret
public scroll_support_256b_
scroll_support_256b_:
;edi - lbuffer + pozice na obrazovce
;esi - oldbuffer
;edx - newbuffer
;ebx - xlat
;ecx - size;
call mapvesaadr_
push ebp ;uchovej ebp
mov eax,360 ;eax pro tuto chvili predstavuje citac
mov ebp,edx
scrl1ba:push eax
push ecx ;uchovej ecx jeste v eac - zachova citac sloupcu
push esi ;uchovej esi
xor eax,eax
shr ecx,1
scrl2ba:lodsw
and eax,7fffh
mov dl,[ebx+2*eax]
xor ebx,1
lodsw
and eax,7fffh
mov dh,[ebx+2*eax]
xor ebx,1
mov [edi],dx
add edi,2
swap_at_end di,edi
dec ecx
jnz scrl2ba
pop esi
xchg esi,ebp ;esi je nyni novy blok
pop eax
mov ecx,640 ;dopocitej ecx do 640
sub ecx,eax
push eax
push esi ;uchovek esi
xor eax,eax
shr ecx,1
scrl3ba:lodsw
and eax,7fffh
mov dl,[ebx+2*eax]
xor ebx,1
lodsw
and eax,7fffh
mov dh,[ebx+2*eax]
xor ebx,1
mov [edi],dx
add edi,2
swap_at_end di,edi
dec ecx
jnz scrl3ba
pop esi ;obnov esi
xchg esi,ebp ;vrat ebp a esi do puvodniho stavu
pop ecx ;obnov zase ecx z eax
pop eax
add esi,1280 ;dalsi radek
add ebp,1280
xor ebx,1
dec eax ; dokud nejsme na konci
jnz scrl1ba ;opakuj
pop ebp
ret
public fcdraw_ ;Kresli strop nebo podlahu podle draw_table
;EDX - sourceTxt
;EBX - TargerTxt - LineOfset
; (Lineofs je pocet bajtu odpovidajici
; souradnicim [0,184] pro podlahu nebo [0,0]
; pro strop)
;EAX - draw_table
fcdraw_:mov esi,[eax]
mov edi,esi
add edi,ebx
add esi,edx
mov ecx,[eax+4]
shr ecx,1
rep movsd
rcl ecx,1
rep movsw
mov ecx,[eax+8]
add eax,12
or ecx,ecx
jnz fcdraw_
ret
public put_image_ ;vlozi obrazek v hicolor
put_image_: ;ESI - obrazek
;EDI - obrazovka
;EAX - startline
;EBX - velikostx
;EDX - velikosty
shl eax,1
xor ecx,ecx
mov cx,[esi]
imul eax,ecx
add esi,eax
add esi,6
mov eax,ecx
puti_lp:mov ecx,ebx
shr ecx,1
rep movsd
rcl ecx,1
rep movsw
mov ecx,eax
sub ecx,ebx
add esi,ecx
sub edi,ebx
sub edi,ebx
add edi,1280
dec edx
jnz puti_lp
ret
public put_8bit_clipped_ ;vlozi 8bit obrazek omezen velikosti
put_8bit_clipped_: ;ESI - obrazek
;EDI - obrazovka
;EAX - startline
;EBX - velikostx
;EDX - velikosty
push ebp
mov ebp,ebx
xor ecx,ecx
mov cx,[esi]
imul eax,ecx
lea ebx,[esi+6];
add esi,6+512
add esi,eax
mov eax,ecx
put8_lp:mov ecx,ebp
push eax
put8lp2:xor eax,eax
lodsb
or eax,eax
jz put8_trns
mov eax,[ebx+eax*2]
stosw
put8nxt:dec ecx
jnz put8lp2
pop eax
mov ecx,eax
sub ecx,ebp
add esi,ecx
sub edi,ebp
sub edi,ebp
add edi,1280
dec edx
jnz put8_lp
pop ebp
ret
put8_trns:
add edi,2
jmp put8nxt
public textmode_effekt_
textmode_effekt_: ;genetuje effekt v textovem rezimu
mov edx,3c4h
mov eax,0402h
out dx,ax
mov eax,0704h
out dx,ax
Mov edx,3ceh
mov eax,0204h
out dx,ax
mov eax,0005h
out dx,ax
mov eax,0406h
out dx,ax
mov bl,8
xor bh,bh
tde2: mov edi,0xA0000h
mov ecx,32*256
tde1: not bh
or bh,bh
jz tde3
shr byte ptr [edi],1
jmp tde4
tde3: shl byte ptr [edi],1
tde4: inc edi
dec ecx
jnz tde1
mov edx,0x3da
mov bh,3
tdew2: in al,dx
and al,8
jz tdew2
tdew1: in al,dx
and al,8
jnz tdew1
dec bh
jnz tdew2
dec bl
jnz tde2
mov edx,3c4h
mov eax,0302h
out dx,ax
mov eax,0304h
out dx,ax
Mov edx,3ceh
mov eax,0004h
out dx,ax
mov eax,1005h
out dx,ax
mov eax,0E06h
out dx,ax
ret
public put_textured_bar__
;zobrazi texturovany obdelnik tvoreny cyklickou texturou
;vstup
; EDI - pozice na obrazovce
; EBX - textura
; ECX - velikosty
; EDX - velikostx
; EAX - yofs
; ESI - xofs
put_textured_bar__:
push ebp ;uchovej EBP - bude pouzit jako univerzalni registr
mov ebp,eax ;zacneme o EAX radku v texture niz
shl edx,16 ;nachvili uchovej dx v horni pulce
mul word ptr [ebx] ;zjisti pocatecni adresu v texture
shl eax,16
shrd eax,edx,16 ;EAX=AX*word ptr[ebx]
shr edx,16
xchg esi,eax ;napln esi pocatkem
lea esi,[esi+512] ;vypocti zacatek v texture+xlat
lea ebx,[ebx+6] ;postav ebx na zacatek xlat
add esi,ebx ;pricti zacatek textury
add esi,eax ;pricti k ukazateli ofset v x
ptb_l2: push eax ;uchovej xofset
push edx ;uchovej velikost v x
push esi ;uchovej zacatek radky v texture
shl ebp,16 ;odsun citac offset do horni pulky ebp
add bp,ax ;pricti k bp offset v x
ptb_l1: xor eax,eax ;pred kazdym bodem vynuluj eax
lodsb ;nacti barvu
or al,al
jz ptb_s1
mov ax,[ebx+eax*2];vyhledej barvu v palete
mov [edi],ax ;zapis hicolor barvu
ptb_s1: add edi,2
inc bp ;zvys counter v x
cmp bp,[ebx-6] ;byl dosazen pravy roh textury?
jc ptb_skip1 ;ne pokracuj
mov ax,bp ;nacti eax counterem
sub esi,eax ;odexti to cele od esi - tj spatky doleva
xor bp,bp
ptb_skip1:
dec edx
jnz ptb_l1
shr ebp,16 ;vrat counter pro y
pop esi ;obnov pocatek v texture
mov ax,[ebx-6] ;nalouduj do eax delku x (horni pulka je zarucene prazdna)
add esi,eax ;pricti k esi
inc ebp ;zvys y counter
cmp bp,[ebx-4] ;test zda jsme dosahli dolniho rohu textury
jc ptb_skip2 ;ne pokracuj
mov eax,ebp ;ano nalouduj eax
mul word ptr [ebx-6];vynasob ho delkou v x
shl eax,16
shrd eax,edx,16 ;eax=ax*word ptr [ebx-4]
sub esi,eax ;jsme na zacatku
xor ebp,ebp
ptb_skip2:
pop edx ;obnov zbyvajici registry
pop eax
lea edi,[edi+1280] ;presun se na dalsi radek na obrazovky
sub edi,edx
sub edi,edx
dec ecx ;odecti 1 od globalniho citace radek
jnz ptb_l2 ;konec velke smycky
POP EBP
ret
public trans_bar_ ;kresli transparetni pravouhelnik ucite barvy
;EDI - X
;ESI - Y
;ECX - YS
;EDX - XS bere se nejmensi sude cislo
;EBX - BARVA
trans_bar_:
mov eax,1280
imul eax,esi
shl edi,1
add edi,eax
add edi,_screen
mov eax,ebx
shl eax,16
shld ebx,eax,16
and ebx,7bde7bdeh
trs_l2: mov esi,edi
push edx
shr edx,1
trs_l1: lodsd
and eax,7bde7bdeh
add eax,ebx
shr eax,1
stosd
dec edx
jnz trs_l1
pop edx
add edi,1280
sub edi,edx
sub edi,edx
dec ecx
jnz trs_l2
ret
public trans_line_x_
;EDI - X
;ESI - Y
;ECX - XS
;EDX - COLOR
trans_line_x_:
mov eax,1280
imul eax,esi
shl edi,1
add edi,eax
add edi,_screen
mov esi,edi
mov eax,edx
shl eax,16
shld edx,eax,16
and edx,7bdf7bdfh
ror ecx,1
trlx_l: lodsd
and eax,7bdf7bdfh
add eax,edx
shr eax,1
stosd
dec cx
jnz trlx_l
shl ecx,1
jnc trlx_s
lodsw
and eax,7bdf7bdfh
add eax,edx
shr eax,1
stosw
trlx_s: ret
public trans_line_y_
;EDI - X
;ESI - Y
;ECX - YS
;EDX - COLOR
trans_line_y_:
mov eax,1280
imul eax,esi
shl edi,1
add edi,eax
add edi,_screen
mov esi,edi
and edx,7bdfh
trly_l: mov ax,[esi]
and eax,7bdfh
add eax,edx
shr eax,1
mov [esi],ax
add esi,1280
dec ecx
jnz trly_l
ret
pic_start equ 2+2+2+512*5+512*5
ed_stack equ 640*4+480*4
ed_stk1 equ 480*4
public enemy_draw_
enemy_draw_: ;ESI - Source_picture
;EDI - Target
;EBX - Offset of palette
;EDX - scale (1-320)
;EAX - max_space (kolik ma nahore mista)
;ECX - Hi_omezeni z prava, Lo_omezeni zleva
cmp eax,470
jc ed_ok1
ret
ed_ok1: push ebp
sub esp,ed_stack ;vyhrad zasobnik
mov ebp,esp
push ecx ;uchovej ecx +1
push edi ;uchovej edi +2
push ebx ;uchovej ebx +3
mov ebx,eax ;volne misto je ted v ebx
mov edi,ebp ;nastav edi na zacatek tabulek
push ebp ; +4
movzx ecx,word ptr[esi] ;precti xs
movzx eax,word ptr[esi+2] ;precti ys
imul eax,ecx ;xs*ys
sub eax,ecx ;minus 1 radek
xor ebp,ebp
ed_lp1b:stosd ;zapis hodnotu do tabulky
add ebp,320 ;zmensovani
ed_lp1a:cmp ebp,edx
jc ed_nxt1 ;pri ebp<edx pokracuj dal
sub ebp,edx
sub eax,ecx ;odecti radku
jbe ed_end1 ;pokud je to posledni tak konec1
jmp ed_lp1a
ed_nxt1:dec ebx
jnz ed_lp1b
ed_end1:xor eax,eax
dec eax
stosd ;tabulka pro y je hotova
pop ebp ; +3
lea edi,[ebp+ed_stk1] ;nastav se na druhou tabulku
xor eax,eax ;vynuluj vypoctove registry
xor ebx,ebx
movzx ecx,word ptr[esi] ;ecx je velikost obrazku v x
ed_nxt2:stosd ;zapis x souradnici
add ebx,320 ;pocitej zmenseni
ed_lp2a:cmp ebx,edx
jc ed_nxt2
sub ebx,edx
inc eax
cmp eax,ecx ;pokud je x>=velikosti obrazku tak konec
jc ed_lp2a
xor eax,eax
dec eax ;zapis -1 na konec tabulky
pop ebx ; +2
stosd
mov eax,edi ;konecnou pozici pro tabulku x zapis do eax
pop edi ;obnov registry edi exc ebx+1
add ebx,esi ;najdi adresu prekladove tabulky barev
add ebx,2 ;preskoc transparentni barvu
add esi,pic_start;presun se na zacatek obrazku
pop ecx ; +0
movzx edx,cx ;vem levy okraj
lea edx,[ebp+edx*4]
lea edx,[edx+ed_stk1];edx ukazuje na sloupce
cmp eax,edx ;je-li levy okraj za platnou tabulkou tak konec
jbe ed_err
shr ecx,16 ;ecx ted obsahuje pravy okraj
ed_lp4: push esi ;uchovej esi +1
push edi ;uchovej edi +2
add esi,[ebp] ;spocitej spravnou hodnotu esi
push ecx ;uchovej pravy okraj +3
push edx ;uchovej ukazatel na tabulku+4
ed_lp3: mov eax,[edx]
cmp eax,-1 ;testuj konec tabulky
jz ed_end3 ;pri pozitivnim vysledku => konec radky
movzx eax,byte ptr[esi+eax];vem barvu
or al,al
jz ed_skp1 ;preskoc transparentni barvu
dec al
jz ed_shd ;1=shadow
mov eax,[ebx+eax*2];vyzvedni hicolor
stosw ;zapis barvu
jmp ed_skp2
ed_shd: movzx eax,word ptr[edi];vem barvu
and eax,7bdfh ;stmav
shr eax,1
stosw ;zapis
jmp ed_skp2 ;skok na konec
ed_skp1:add edi,2 ;preskoc bod
ed_skp2:add edx,4 ;dalsi pozice
dec ecx ;dokud nedosahneme praveho okraje obrazku
jnz ed_lp3
ed_end3:pop edx ;obnov vse ulozene
pop ecx
pop edi
pop esi ; +0
add ebp,4 ;dalsi y souradnice
sub edi,1280 ;dalsi radka
cmp dword ptr [ebp],-1 ;test na konec tabulky
jnz ed_lp4 ;jinak pokracuj
ed_err: add esp,ed_stack;vymaz tabulku
pop ebp ;obnov ebp
ret ;konec
public enemy_draw_mirror_ ;kresli zrcadlove otocenou potvoru
enemy_draw_mirror_: ;ESI - Source_picture
;EDI - Target
;EBX - Offset of palette
;EDX - scale (1-320)
;EAX - max_space (kolik ma nahore mista)
;ECX - Hi_omezeni z prava, Lo_omezeni zleva
push ebp
sub esp,ed_stack ;vyhrad zasobnik
mov ebp,esp
push ecx ;uchovej ecx +1
push edi ;uchovej edi +2
push ebx ;uchovej ebx +3
mov ebx,eax ;volne misto je ted v ebx
mov edi,ebp ;nastav edi na zacatek tabulek
push ebp ; +4
movzx ecx,word ptr[esi] ;precti xs
movzx eax,word ptr[esi+2] ;precti ys
imul eax,ecx ;xs*ys
sub eax,ecx ;minus 1 radek
xor ebp,ebp
edmlp1b:stosd ;zapis hodnotu do tabulky
add ebp,320 ;zmensovani
edmlp1a:cmp ebp,edx
jc edmnxt1 ;pri ebp<edx pokracuj dal
sub ebp,edx
sub eax,ecx ;odecti radku
jbe edmend1 ;pokud je to posledni tak konec1
jmp edmlp1a
edmnxt1:dec ebx
jnz edmlp1b
edmend1:xor eax,eax
dec eax
stosd ;tabulka pro y je hotova
pop ebp ; +3
lea edi,[ebp+ed_stk1] ;nastav se na druhou tabulku
xor ebx,ebx
movzx ecx,word ptr[esi] ;ecx je velikost obrazku v x
mov eax,ecx ;eax je velikost obrazku v x
dec eax
edmnxt2:stosd ;zapis x souradnici
add ebx,320 ;pocitej zmenseni
edmlp2a:cmp ebx,edx
jc edmnxt2
sub ebx,edx
sub eax,1
jnc edmlp2a
xor eax,eax
dec eax ;zapis -1 na konec tabulky
pop ebx ; +2
stosd
mov eax,edi ;konecnou pozici pro tabulku x zapis do eax
pop edi ;obnov registry edi exc ebx+1
add ebx,esi ;najdi adresu prekladove tabulky barev
add ebx,2 ;preskoc transparentni barvu
add esi,pic_start;presun se na zacatek obrazku
pop ecx ; +0
movzx edx,cx ;vem levy okraj
lea edx,[ebp+edx*4]
lea edx,[edx+ed_stk1];edx ukazuje na sloupce
cmp eax,edx ;je-li levy okraj za platnou tabulkou tak konec
jbe edmerr
shr ecx,16 ;ecx ted obsahuje pravy okraj
edmlp4: push esi ;uchovej esi +1
push edi ;uchovej edi +2
add esi,[ebp] ;spocitej spravnou hodnotu esi
push ecx ;uchovej pravy okraj +3
push edx ;uchovej ukazatel na tabulku+4
edmlp3: mov eax,[edx]
cmp eax,-1 ;testuj konec tabulky
jz edmend3 ;pri pozitivnim vysledku => konec radky
movzx eax,byte ptr[esi+eax];vem barvu
or al,al
jz edmskp1 ;preskoc transparentni barvu
dec al
jz edmshd ;1=shadow
mov eax,[ebx+eax*2];vyzvedni hicolor
stosw ;zapis barvu
jmp edmskp2
edmshd: movzx eax,word ptr[edi];vem barvu
and eax,7bdfh ;stmav
shr eax,1
stosw ;zapis
jmp edmskp2 ;skok na konec
edmskp1:add edi,2 ;preskoc bod
edmskp2:add edx,4 ;dalsi pozice
dec ecx ;dokud nedosahneme praveho okraje obrazku
jnz edmlp3
edmend3:pop edx ;obnov vse ulozene
pop ecx
pop edi
pop esi ; +0
add ebp,4 ;dalsi y souradnice
sub edi,1280 ;dalsi radka
cmp dword ptr [ebp],-1 ;test na konec tabulky
jnz edmlp4 ;jinak pokracuj
edmerr: add esp,ed_stack;vymaz tabulku
pop ebp ;obnov ebp
ret ;konec
pic_start_15 equ 2+2+2+512
public put_picture2picture_ ;vlozi obrazek do obrazku (256c->256)
put_picture2picture_:
;ESI - obrazek 256c
;EDI - obrazek 256
;EAX - Xpos
;EDX - Ypos
movzx ecx,word ptr [edi] ;vyzvedni sirku obrazku
imul edx,ecx ;nova adresa=edi+(Xpos+sirka*Ypos)
add eax,edx
mov edx,ecx
lea edi,[edi+eax+pic_start] ;edi obsahuje novou adresu
mov ecx,[esi] ;ecx obsahuje Xsize a Ysize obrazku
sub ecx,10000h ;Ysize-1
lea esi,[esi+pic_start] ;nastav esi na zacatek bitmapy
ppp_lp2:push ecx ;uchovej velikosti obrazku v zasobniku
ppp_lp1:lodsb ;nacti bod ze zdroje
or al,al ;zkontroluj zda to neni transparentni barva
jz ppp_trn ;pokud je tak ji prezskoc
mov [edi],al ;zapis barvu
ppp_trn:inc edi ;dalsi bod
dec cx ;odecitej x sirku
jnz ppp_lp1 ;dokud to neni vse
pop ecx ;obnov ecx
movzx eax,cx ;vem jeste jednou sirku
sub eax,edx ;spocitej kolik bajtu je nutne
sub edi,eax ;prezkocit k dosazeni dalsi radky
sub ecx,10000h ;opakuj pro y radku
jnc ppp_lp2
ret
public trans_bar25_ ;ztmaveni o 25%
;EDI - X
;ESI - Y
;ECX - YS
;EDX - XS bere se nejmensi sude cislo
trans_bar25_:
mov eax,1280
imul eax,esi
shl edi,1
add edi,eax
add edi,_screen
trs2_l2:mov esi,edi
push edx
shr edx,1
trs2_l1:lodsd
mov ebx,eax
and ebx,739c739ch
shr ebx,2
sub eax,ebx
stosd
dec edx
jnz trs2_l1
pop edx
add edi,1280
sub edi,edx
sub edi,edx
dec ecx
jnz trs2_l2
ret
;public double_xicht_ ;zobrazi zvetseny xicht
; ;ESI - source
; ;EDI - TARGET
;double_xicht_:
; push ebp
; mov ecx,[esi+2]
; lea ebx,[esi+6]
; mov edx,[ebx-6]
; movzx eax,byte ptr [esi]
; mov ebp,[eax*2+ebx]
public enemy_draw_transp_
enemy_draw_transp_: ;ESI - Source_picture
;EDI - Target
;EBX - Offset of palette
;EDX - scale (1-320)
;EAX - max_space (kolik ma nahore mista)
;ECX - Hi_omezeni z prava, Lo_omezeni zleva
cmp eax,470
jc et_ok1
ret
et_ok1: push ebp
sub esp,ed_stack ;vyhrad zasobnik
mov ebp,esp
push ecx ;uchovej ecx +1
push edi ;uchovej edi +2
push ebx ;uchovej ebx +3
mov ebx,eax ;volne misto je ted v ebx
mov edi,ebp ;nastav edi na zacatek tabulek
push ebp ; +4
movzx ecx,word ptr[esi] ;precti xs
movzx eax,word ptr[esi+2] ;precti ys
imul eax,ecx ;xs*ys
sub eax,ecx ;minus 1 radek
xor ebp,ebp
et_lp1b:stosd ;zapis hodnotu do tabulky
add ebp,320 ;zmensovani
et_lp1a:cmp ebp,edx
jc et_nxt1 ;pri ebp<edx pokracuj dal
sub ebp,edx
sub eax,ecx ;odecti radku
jbe et_end1 ;pokud je to posledni tak konec1
jmp et_lp1a
et_nxt1:dec ebx
jnz et_lp1b
et_end1:xor eax,eax
dec eax
stosd ;tabulka pro y je hotova
pop ebp ; +3
lea edi,[ebp+ed_stk1] ;nastav se na druhou tabulku
xor eax,eax ;vynuluj vypoctove registry
xor ebx,ebx
movzx ecx,word ptr[esi] ;ecx je velikost obrazku v x
et_nxt2:stosd ;zapis x souradnici
add ebx,320 ;pocitej zmenseni
et_lp2a:cmp ebx,edx
jc et_nxt2
sub ebx,edx
inc eax
cmp eax,ecx ;pokud je x>=velikosti obrazku tak konec
jc et_lp2a
xor eax,eax
dec eax ;zapis -1 na konec tabulky
pop ebx ; +2
stosd
mov eax,edi ;konecnou pozici pro tabulku x zapis do eax
pop edi ;obnov registry edi exc ebx+1
cmp byte ptr [esi+5],2 ;obrazek bez palety?
jz et_pl1
add esi,pic_start;presun se na zacatek obrazku (za paletu)
jmp et_pl2
et_pl1: add esi,6 ;(obrazek bez palety, presun se za hlavicku)
et_pl2: pop ecx ; +0
movzx edx,cx ;vem levy okraj
lea edx,[ebp+edx*4]
lea edx,[edx+ed_stk1];edx ukazuje na sloupce
cmp eax,edx ;je-li levy okraj za platnou tabulkou tak konec
jbe et_err
shr ecx,16 ;ecx ted obsahuje pravy okraj
et_lp4: push esi ;uchovej esi +1
push edi ;uchovej edi +2
add esi,[ebp] ;spocitej spravnou hodnotu esi
push ecx ;uchovej pravy okraj +3
push edx ;uchovej ukazatel na tabulku+4
et_lp3: mov eax,[edx]
cmp eax,-1 ;testuj konec tabulky
jz et_end3 ;pri pozitivnim vysledku => konec radky
movzx eax,byte ptr[esi+eax];vem barvu
test al,80h
jnz et_shd
or al,al
jz et_skp1 ;preskoc transparentni barvu
mov eax,[ebx+eax*2];vyzvedni hicolor
stosw ;zapis barvu
jmp et_skp2
et_shd: and word ptr[edi],07bdfh
mov eax,[ebx+eax*2];vyzvedni hicolor
and eax,7bdfh ;stmav
add ax,word ptr[edi]
shr eax,1
stosw ;zapis
jmp et_skp2 ;skok na konec
et_skp1:add edi,2 ;preskoc bod
et_skp2:add edx,4 ;dalsi pozice
dec ecx ;dokud nedosahneme praveho okraje obrazku
jnz et_lp3
et_end3:pop edx ;obnov vse ulozene
pop ecx
pop edi
pop esi ; +0
add ebp,4 ;dalsi y souradnice
sub edi,1280 ;dalsi radka
cmp dword ptr [ebp],-1 ;test na konec tabulky
jnz et_lp4 ;jinak pokracuj
et_err: add esp,ed_stack;vymaz tabulku
pop ebp ;obnov ebp
ret ;konec
public enemy_draw_mirror_transp_ ;kresli zrcadlove otocenou potvoru pruhledne
enemy_draw_mirror_transp_: ;ESI - Source_picture
;EDI - Target
;EBX - Offset of palette
;EDX - scale (1-320)
;EAX - max_space (kolik ma nahore mista)
;ECX - Hi_omezeni z prava, Lo_omezeni zleva
push ebp
sub esp,ed_stack ;vyhrad zasobnik
mov ebp,esp
push ecx ;uchovej ecx +1
push edi ;uchovej edi +2
push ebx ;uchovej ebx +3
mov ebx,eax ;volne misto je ted v ebx
mov edi,ebp ;nastav edi na zacatek tabulek
push ebp ; +4
movzx ecx,word ptr[esi] ;precti xs
movzx eax,word ptr[esi+2] ;precti ys
imul eax,ecx ;xs*ys
sub eax,ecx ;minus 1 radek
xor ebp,ebp
etmlp1b:stosd ;zapis hodnotu do tabulky
add ebp,320 ;zmensovani
etmlp1a:cmp ebp,edx
jc etmnxt1 ;pri ebp<edx pokracuj dal
sub ebp,edx
sub eax,ecx ;odecti radku
jbe etmend1 ;pokud je to posledni tak konec1
jmp etmlp1a
etmnxt1:dec ebx
jnz etmlp1b
etmend1:xor eax,eax
dec eax
stosd ;tabulka pro y je hotova
pop ebp ; +3
lea edi,[ebp+ed_stk1] ;nastav se na druhou tabulku
xor ebx,ebx
movzx ecx,word ptr[esi] ;ecx je velikost obrazku v x
mov eax,ecx ;eax je velikost obrazku v x
dec eax
etmnxt2:stosd ;zapis x souradnici
add ebx,320 ;pocitej zmenseni
etmlp2a:cmp ebx,edx
jc etmnxt2
sub ebx,edx
sub eax,1
jnc etmlp2a
xor eax,eax
dec eax ;zapis -1 na konec tabulky
pop ebx ; +2
stosd
mov eax,edi ;konecnou pozici pro tabulku x zapis do eax
pop edi ;obnov registry edi exc ebx+1
cmp byte ptr [esi+5],2 ;obrazek bez palety?
jz etmpl1
add esi,pic_start;presun se na zacatek obrazku (za paletu)
jmp etmpl2
etmpl1: add esi,6 ;(obrazek bez palety, presun se za hlavicku)
etmpl2: pop ecx ; +0
movzx edx,cx ;vem levy okraj
lea edx,[ebp+edx*4]
lea edx,[edx+ed_stk1];edx ukazuje na sloupce
cmp eax,edx ;je-li levy okraj za platnou tabulkou tak konec
jbe etmerr
shr ecx,16 ;ecx ted obsahuje pravy okraj
etmlp4: push esi ;uchovej esi +1
push edi ;uchovej edi +2
add esi,[ebp] ;spocitej spravnou hodnotu esi
push ecx ;uchovej pravy okraj +3
push edx ;uchovej ukazatel na tabulku+4
etmlp3: mov eax,[edx]
cmp eax,-1 ;testuj konec tabulky
jz etmend3 ;pri pozitivnim vysledku => konec radky
movzx eax,byte ptr[esi+eax];vem barvu
test al,80h
jnz etmshd
or al,al
jz etmskp1 ;preskoc transparentni barvu
mov eax,[ebx+eax*2];vyzvedni hicolor
stosw ;zapis barvu
jmp etmskp2
etmshd: and word ptr[edi],07bdfh
mov eax,[ebx+eax*2];vyzvedni hicolor
and eax,7bdfh ;stmav
add ax,word ptr[edi]
shr eax,1
stosw ;zapis
jmp etmskp2 ;skok na konec
etmskp1:add edi,2 ;preskoc bod
etmskp2:add edx,4 ;dalsi pozice
dec ecx ;dokud nedosahneme praveho okraje obrazku
jnz etmlp3
etmend3:pop edx ;obnov vse ulozene
pop ecx
pop edi
pop esi ; +0
add ebp,4 ;dalsi y souradnice
sub edi,1280 ;dalsi radka
cmp dword ptr [ebp],-1 ;test na konec tabulky
jnz etmlp4 ;jinak pokracuj
etmerr: add esp,ed_stack;vymaz tabulku
pop ebp ;obnov ebp
ret ;konec
zobraz_2 macro
lodsw
movzx ebp,ah
movzx ebp,ds:[ebx+ebp*2]
shl ebp,16
movzx eax,al
movzx eax,[ebx+eax*2]
or eax,ebp
stosd
endm
zobraz_1 macro
lodsb
movzx eax,al
movzx eax,word ptr [eax*2+ebx]
stosw
endm
public show_anm_buff_ ;zobrazi frame animace (normal);
show_anm_buff_: ;ESI - SOURCE
;EDI - TARGER
;EBX - PALETA
push ebp
mov ecx,180*320
shwab4: zobraz_2
dec ecx
jnz shwab4
ret
public show_anm_delta_ ;zobrazi frame animace (normal);
show_anm_delta_: ;ESI - SOURCE
;EDI - TARGER
;EBX - PALETA
push ebp ;uchovej EBP pro dalsi mozne pouziti
mov ch,180 ;180 radek
mov eax,[esi] ;vem offset na delta data
lea ebp,[esi+eax+4] ;ebp obsahuje tento offset
lea esi,[esi+4] ;esi obsahuje offset na delta control
shwad5: push edi ;uchovej zacatek radky
push edx ;i pro transp data
shwad3: lodsb ;vem skip hodnotu
mov ah,al ;uchovej ji ah - kvuli destruktivnimu testu
and al,not 3fh ;na posledni 2 bity
cmp al,0c0h ;C0 a vyssi znamenaji ze se preskakuje radek
jz shwad1 ;pri pozitivnim testu je preskoc
movzx eax,ah ;vem skip hodnotu do eax
shl eax,2 ;na obrazovce *2 bodu *2 za bod (x8)
add edi,eax ;pricti k edi
lodsb ;vem copy hodnotu
mov cl,al ;zaved counter
xchg esi,ebp ;prohod ukazatele control a data
push ebp ;uchovej control
shwad2: zobraz_2 ;zobraz bod
dec cl ;opakuj tolikrat kolik je copy hodnota
jnz shwad2
pop ebp ;obnov control
xchg esi,ebp ;prohod ukazatele control a data
jmp shwad3 ;a precti dalsi skip hodnotu
shwad1: pop edx ;obnov registry ukazujici na zacatek radky
pop edi
and ah,03fh ;maskuj spodnich 6 bitu
inc ah ;+1
shwad4: add edi,640
dec ch ;odecti counter radek
dec ah ;odecti counter
jnz shwad4 ;a opakuj ah krat
or ch,ch ;je li counter nulovy tak padame
jnz shwad5
pop ebp ;obnov ebp
ret ;konec
ret
public klicovani_anm_
klicovani_anm_: ;esi source edi target al mirror
or al,al
jnz klicovani_anm_back_
mov ecx,180
ka_lp2: mov ebx,320
ka_lp1: lodsw
movzx eax,ax
test eax,0x8000
jnz ka_skip
mov edx,eax
shl edx,16
or eax,edx
mov [edi+1280],eax
mov [edi],eax
ka_skip:add edi,4
dec ebx
jnz ka_lp1
add edi,1280
dec ecx
jnz ka_lp2
ret
public klicovani_anm_back_
klicovani_anm_back_: ;esi source edi target
mov ecx,180
add edi,1280
kba_lp2: mov ebx,320
kba_lp1: lodsw
sub edi,4
movzx eax,ax
test eax,0x8000
jnz kba_skip
mov edx,eax
shl edx,16
or eax,edx
mov [edi+1280],eax
mov [edi],eax
kba_skip:dec ebx
jnz kba_lp1
add edi,1280*3
dec ecx
jnz kba_lp2
ret
public small_anm_buff_ ;zobrazi frame v mensim ramecku
small_anm_buff_: ;ESI - SOURCE
;EDI - TARGER
;EBX - PALETA
mov ecx,179*10000h
shmab4: mov cx,320
shmab3: zobraz_1
dec cx
jnz shmab3
add edi,640
sub ecx,010000h
jnc shmab4
ret
public small_anm_delta_ ;zobrazi frame animace (normal);
small_anm_delta_: ;ESI - SOURCE
;EDI - TARGER
;EBX - PALETA
mov ch,180 ;180 radek
mov eax,[esi] ;vem offset na delta data
lea edx,[esi+eax+4] ;ebp obsahuje tento offset
lea esi,[esi+4] ;esi obsahuje offset na delta control
shmad5: push edi ;uchovej zacatek radky
shmad3: lodsb ;vem skip hodnotu
mov ah,al ;uchovej ji ah - kvuli destruktivnimu testu
and al,not 3fh ;na posledni 2 bity
cmp al,0c0h ;C0 a vyssi znamenaji ze se preskakuje radek
jz shmad1 ;pri pozitivnim testu je preskoc
movzx eax,ah ;vem skip hodnotu do eax
shl eax,2 ;na obrazovce *2 bodu *1 zoom *2 za bod (x4)
add edi,eax ;pricti k edi
lodsb ;vem copy hodnotu
mov cl,al ;zaved counter
xchg esi,edx ;prohod ukazatele control a data
shmad2: zobraz_1 ;zobraz bod
zobraz_1 ;zobraz bod
dec cl ;opakuj tolikrat kolik je copy hodnota
jnz shmad2
xchg esi,edx ;prohod ukazatele control a data
jmp shmad3 ;a precti dalsi skip hodnotu
shmad1: pop edi
and ah,03fh ;maskuj spodnich 6 bitu
inc ah ;+1
shmad4: add edi,1280
dec ch ;odecti counter radek
dec ah ;odecti counter
jnz shmad4 ;a opakuj ah krat
or ch,ch ;je li counter nulovy tak padame
jnz shmad5
ret ;konec
ret
public scroll_and_copy_
scroll_and_copy_: ;odscroluje a kopiruje obrazovku do screenu
;pouzitelne pro titulky
;0x8000 je transparentni
;edi screen
;ebx buffer
;esi back_picture
;ecx velikost bufferu (pocet_radku)
;edx pocet bajtu o kolik je nutne posouvat (*1280)
;eax - ukazatel na tittle lines
push ebp
mov ebp,eax ;uloz ukazatel na titlelines
mov eax,edx
imul eax,1280
sac_lp1:push ecx
push eax
mov eax,[ebp] ;nacti zac
mov ecx,[ebp+edx*8]
cmp eax,ecx
jc sac_sk1
mov eax,ecx
sac_sk1:shl eax,1 ;adresa
add esi,eax ;pricti k pointrum
add edi,eax
add ebx,eax
add ebp,4 ;presun se na kon
shr eax,1 ;eax je zacatek v bodech
mov ecx,[ebp+edx*8] ;vem konec
cmp ecx,[ebp]
jnc sac_sk2
mov ecx,[ebp]
sac_sk2:push ecx
sub ecx,eax ;kon-zac+1=celk pocet
xchg edx,[esp+4]
sac_lp2:mov eax,[ebx+edx] ;Vem data na dalsim radku
mov [ebx],eax ;Zapis je sem
add ebx,4 ;dalsi pozice
test eax,7fff7fffh ;je to transparentni?
jz sac_all ;pokud ano, zobraz_obrazek
bt eax,15 ;test bitu 15
jnc sac_1 ;Neni nastaven - zobraz primo barvu
mov ax,[esi] ;jinak vem barvu z obrazku
sac_1: stosw ;zapis barvu
add esi,2 ;dalsi pozice
rol eax,16 ;presun eax na dolni slovo
bt eax,15 ;test bitu 15
jnc sac_2 ;neni nastaven - zobraz primo barvu
mov ax,[esi] ;jinak vem barvu z obrazku
sac_2: stosw ;zapis barvu
add esi,2 ;dalsi pozice
jmp sac_end
sac_all:movsd ;presun celeho slova
sac_end:sub ecx,2 ;odecti counter
ja sac_lp2 ;je li nad opakuj
add ecx,640 ;pricti sirku, - kolik jsme prejeli
pop eax
sub ecx,eax ;odecti konec -> kolik preskocit
add ebp,4 ;aktualizuj ukazatele
shl ecx,1 ;v adresach
add esi,ecx
add edi,ecx
add ebx,ecx
pop eax
xchg edx,eax
pop ecx ;obnov ecx
dec ecx ;sniz citac radku
jnz sac_lp1 ;dokud neni nula
pop ebp ;obnov ebp
ret ;konec
public lodka32_
lodka32_:
;esi - zdrojovy blok
;edi - cil
;eax - lodka
;zoom.xtable - tabulka pro x
;zoom.xtable - tabulka pro y
;zoom.textline - rozdil mezi pravym okrajem a levym okrajem
; pri prechodu na novou radku
;ecx ysize:xsize
push ebp
mov ebp,eax
mov ebx,_zoom[offset tzoom.ytable]
l32d: push cx
mov edx,_zoom[offset tzoom.xtable]
push esi
l32c: mov eax,dword ptr [ebp]
or eax,eax
jnz l32e
mov al,[edx]
inc edx
or al,al
jz l32a
lodsw
stosw
stosw
jmp l32b
l32e: stosd
movzx eax,byte ptr[edx] ;0 - o 4 1 - o 2
xor eax,1 ;0->1 1->0
inc eax ;1+1=2 0+1=1
shl eax,1 ;2*2=4 1*2=2
add esi,eax
inc edx
jmp l32b
l32a: lodsd
stosd
l32b: add ebp,4
dec cx
jnz l32c
pop esi
mov eax,[ebx]
and eax,0ffffh
add esi,eax
add ebx,2
add edi,_zoom[offset tzoom.textline]
xor cx,cx
cmp ecx,60*65536
cmc
sbb eax,eax
and eax,1280
sub ebp,eax
sub ecx,10000h
pop cx
jnz l32d
pop ebp
ret
public lodka32b_
lodka32b_:
;esi - zdrojovy blok
;edi - cil
;zoom.xtable - tabulka pro x
;zoom.ytable - tabulka pro y
;zoom.textline - rozdil mezi pravym okrajem a levym okrajem
; pri prechodu na novou radku
;ecx ysize:xsize
;zoom.ycount - interni (ulozeni maskovane adr stranky)
;zoom.xmax - interni (pocet dwordu do prepnuti)
;zoom.linelen - interni (velikost stranky v dwordech)
call mapvesaadr_ ;mapuj spravne edi
push ebp
mov ebp,eax
mov ebx,_zoom[offset tzoom.ytable]
l32bd: push cx
mov edx,_zoom[offset tzoom.xtable]
push esi
push edi
l32bc: mov eax,dword ptr [ebp]
or eax,eax
jnz l32be
mov al,[edx]
inc edx
or al,al
jz l32ba
lodsw
stosw
stosw
jmp l32bb
l32be: stosd
movzx eax,byte ptr[edx] ;0 - o 4 1 - o 2
xor eax,1 ;0->1 1->0
inc eax ;1+1=2 0+1=1
shl eax,1 ;2*2=4 1*2=2
add esi,eax
inc edx
jmp l32bb
l32ba: lodsd
stosd
l32bb: add ebp,4
movzx eax,di ;prevezmi dolni cast edi do eax
dec eax ;odecti 1 (0=0xffffffff)
cmp eax,_gran_mask ;je vetsi nez granualita?
jc l32gb ;ne, vse je ok
mov eax,_lastbank ;ano, pak vem cislo banky
inc eax ;pricti 1
mov _lastbank,eax ;zapis jako nove cislo banky
pushad ;uchovej vse
call switchvesabank_ ;prepni banku
popad ;obnov vse
mov edi,0a0000h ;vynuluj dolni cast di
l32gb: dec cx ;tady pokracujem
jnz l32bc ;opakuj cxkrat
pop edi ;obnov edi
add di,1280 ;pricti radek
and di,word ptr _gran_mask ;maskuj granualitou
pop esi
mov eax,[ebx]
and eax,0ffffh
add esi,eax
add ebx,2
xor cx,cx
cmp ecx,60*65536
cmc
sbb eax,eax
and eax,1280
sub ebp,eax
sub ecx,10000h
pop cx
jnz l32bd
pop ebp
ret
public lodka256_
lodka256_:
;esi - zdrojovy blok
;edi - cil
;eax - lodka
;zoom.xtable - tabulka pro x
;zoom.xtable - tabulka pro y
;zoom.textline - rozdil mezi pravym okrajem a levym okrajem
; pri prechodu na novou radku
;ecx ysize:xsize
;ebx xlat
push ebp
mov ebp,eax
l256d: push cx
mov edx,_zoom[offset tzoom.xtable]
push esi
l256c: mov eax,[ebp]
or eax,eax
jnz l256e
movzx eax,byte ptr [edx]
inc edx
or al,al
jz l256a
lodsw
mov al,[ebx+eax*2]
mov ah,al
stosw
jmp l256b
l256e: movzx eax,ax
mov al,[ebx+eax*2]
mov ah,al
stosw
movzx eax,byte ptr[edx] ;0 - o 4 1 - o 2
xor eax,1 ;0->1 1->0
inc eax ;1+1=2 0+1=1
shl eax,1 ;2*2=4 1*2=2
add esi,eax
inc edx
jmp l256b
l256a: lodsw
mov al,[ebx+eax*2]
stosb
lodsw
mov al,[ebx+eax*2]
stosb
l256b: add ebp,4
xor ebx,1
dec cx
jnz l256c
xor ebx,1
pop esi
mov edx,_zoom[offset tzoom.ytable]
mov eax,[edx]
and eax,0ffffh
add esi,eax
add edx,2
mov _zoom[offset tzoom.ytable],edx
add edi,_zoom[offset tzoom.textline]
xor cx,cx
cmp ecx,60*65536
cmc
sbb eax,eax
and eax,1280
sub ebp,eax
sub ecx,10000h
pop cx
jnz l256d
pop ebp
ret
public lodka256b_
lodka256b_:
;esi - zdrojovy blok
;edi - cil
;zoom.xtable - tabulka pro x
;zoom.xtable - tabulka pro y
;zoom.textline - rozdil mezi pravym okrajem a levym okrajem
; pri prechodu na novou radku
;ecx ysize:xsize
;ebx xlat
push ebp
mov ebp,eax
l256bd: push cx
mov edx,_zoom[offset tzoom.xtable]
push edi
call mapvesaadr_
push esi
l256bc: mov eax,[ebp]
or eax,eax
jnz l256be
movzx eax,byte ptr[edx]
inc edx
or al,al
jz l256ba
lodsw
mov al,[ebx+eax*2]
mov ah,al
stosw
jmp l256bb
l256be: movzx eax,ax
mov al,[ebx+eax*2]
mov ah,al
stosw
movzx eax,byte ptr[edx] ;0 - o 4 1 - o 2
xor eax,1 ;0->1 1->0
inc eax ;1+1=2 0+1=1
shl eax,1 ;2*2=4 1*2=2
add esi,eax
inc edx
jmp l256bb
l256ba: lodsw
mov al,[ebx+eax*2]
stosb
l256bh: lodsw
mov al,[ebx+eax*2]
stosb
l256bb: add ebp,4
swap_at_end di,edi
xor ebx,1
dec cx
jnz l256bc
xor ebx,1
pop esi
pop edi
add edi,640
mov edx,_zoom[offset tzoom.ytable]
mov eax,[edx]
and eax,0ffffh
add esi,eax
add edx,2
mov _zoom[offset tzoom.ytable],edx
add edi,_zoom[offset tzoom.textline]
xor cx,cx
cmp ecx,60*65536
cmc
sbb eax,eax
and eax,1280
sub ebp,eax
sub ecx,10000h
pop cx
jnz l256bd
pop ebp
ret
_TEXT ends
END
if 0
;POZOR DUMP!
public zooming32b_
zooming32b_:
;esi - zdrojovy blok
;edi - cil
;zoom.xtable - tabulka pro x
;zoom.ytable - tabulka pro y
;zoom.textline - rozdil mezi pravym okrajem a levym okrajem
; pri prechodu na novou radku
;ecx ysize:xsize
;zoom.ycount - interni (ulozeni maskovane adr stranky)
;zoom.xmax - interni (pocet dwordu do prepnuti)
push ebp
mov ebp,eax
mov ebx,_zoom[offset tzoom.ytable]
z32bd: push cx
mov edx,_zoom[offset tzoom.xtable]
push esi
push edi
call mapvesaadr_
z32bc: mov al,[edx]
inc edx
or al,al
jz z32ba
lodsw
test ax,8000h
jnz z32be
stosw
stosw
jmp z32bb
z32bf: test eax,8000h
jz z32bg
test eax,80000000h
jz z32bh
z32be: mov eax,[ds:ebp]
stosd
jmp z32bb
z32bg: rol eax,16
mov ax,[ds:ebp+2]
rol eax,16
stosd
jmp z32bb
z32bh: mov ax,[ds:ebp]
stosd
jmp z32bb
z32ba: lodsd
test eax,80008000h
jnz z32bf
stosd
z32bb: add ebp,4
dec cx
jnz z32bc
pop edi
add edi,2048
pop esi
mov eax,[ebx]
and eax,0ffffh
add esi,eax
add ebx,2
xor cx,cx
sub ecx,10000h
pop cx
jnz z32bd
pop ebp
ret
scroll_support_32b_:
;edi - lbuffer + pozice na obrazovce
;esi - oldbuffer
;edx - newbuffer
;ebx - xlat
;ecx - size;
push ebp ;uchovej ebp
mov ebp,360 ;ebp pro tuto chvili predstavuje citac
mov eax,ecx ;uchovej ecx jeste v eac - zachova citac sloupcu
scrl1b: push edi
push esi ;uchovej esi
call mapvesaadr_
shr ecx,1 ;presun ecx bloku
rep movsd
rcl ecx,1
rep movsw
mov ecx,640 ;dopocitej ecx do 640
sub ecx,eax
pop esi ;obnov esi
xchg esi,edx ;esi je nyni novy blok
push esi ;uchovek esi
shr ecx,1 ;presun
rep movsd
rcl ecx,1
rep movsw
pop esi ;obnov esi
xchg esi,edx ;vrat edx a esi do puvodniho stavu
mov ecx,eax ;obnov zase ecx z eax
add esi,1280 ;dalsi radek
add edx,1280
pop edi
add edi,2048
dec ebp ; dokud nejsme na konci
jnz scrl1b ;opakuj
pop ebp
ret
endif