mirror of
https://github.com/ondra-novak/gates_of_skeldal.git
synced 2025-07-04 21:50:38 -04:00
380 lines
13 KiB
NASM
380 lines
13 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
|
|
|
|
|
|
_TEXT segment byte public 'CODE' use32
|
|
assume CS:_TEXT
|
|
assume DS:DGROUP
|
|
|
|
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
|
|
;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 bp,cx
|
|
mov ebx,_zoom[offset tzoom.ytable]
|
|
z32d: mov cx,bp
|
|
mov edx,_zoom[offset tzoom.xtable]
|
|
push esi
|
|
z32c: mov al,[edx]
|
|
inc edx
|
|
or al,al
|
|
jz z32a
|
|
lodsw
|
|
stosw
|
|
stosw
|
|
jmp z32b
|
|
z32a: movsd
|
|
z32b: 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
|
|
jnz z32d
|
|
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
|
|
;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
|
|
z256d: mov cx,bp
|
|
mov edx,_zoom[offset tzoom.xtable]
|
|
push esi
|
|
z256c: xor eax,eax
|
|
mov al,[edx]
|
|
inc edx
|
|
or al,al
|
|
jz z256a
|
|
lodsw
|
|
mov eax,[ebx+eax*2]
|
|
stosb
|
|
stosb
|
|
jmp z256b
|
|
z256a: lodsw
|
|
mov eax,[ebx+eax*2]
|
|
stosb
|
|
xor eax,eax
|
|
lodsw
|
|
mov eax,[ebx+eax*2]
|
|
stosb
|
|
z256b: dec cx
|
|
jnz z256c
|
|
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
|
|
jnz z256d
|
|
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
|
|
|
|
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
|
|
xor eax,eax
|
|
scrl2a: lodsw
|
|
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
|
|
xor eax,eax
|
|
scrl3a: lodsw
|
|
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 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
|
|
|
|
_TEXT ends
|
|
END
|