home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Media Share 9
/
MEDIASHARE_09.ISO
/
progmisc
/
hellsrc.zip
/
P2.ASM
< prev
next >
Wrap
Assembly Source File
|
1993-10-26
|
19KB
|
665 lines
.386p
code32 segment para public use32
assume cs:code32, ds:code32
include pmode.inc
include gsp669.inc
include vect3.inc
include kb.inc
include v.inc
public _p2
;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
; DATA
;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
align 4
FACESSPRLEN = 256*200
FACESLOCLEN = 148*2*4
FACESPALLEN = 10h*3
HIGHLIGHTSPRLEN = 12227
MIRRORPICLEN = 320*200
MIRRORPICPALLEN = 40h*3
MIRRORPICTBLLEN = 112*200*2
MIRRORSPRLEN = 214*168
MUZLOC0 = 0800h
p2m0sv0 equ byte ptr [esp]
p2m0sv1 equ byte ptr [esp+1]
p2m0sv2 equ byte ptr [esp+2]
p2m0sv3 equ byte ptr [esp+3]
p2m0sv4 equ byte ptr [esp+4]
p2m0sv5 equ byte ptr [esp+5]
p2m0sv6 equ byte ptr [esp+6]
P2M0SVL0 = 8
p2m1sv0 equ dword ptr [esp]
p2m1sv1 equ byte ptr [esp+4]
P2M1SVL0 = 8
dpalptr0 dd ? ; 2 pieces of mirror palette
facessprptr dd ? ; moaning faces bitmap ptr
faceslocptr dd ? ; ptr to raster offset and len table
facesoffptrl dd ? ; load ptr to pixel offset table
facesdeltaptrl dd ? ; load ptr to delta table for offsets
facesoffptr dd ? ; ptr to pixel offset table
facesdeltaptr dd ? ; ptr to delta table for offset table
facesdeltaptr2 dd ? ; delta table sum/mod 4
facesmisctbl0 dd ? ; misc calc optimization table
highlightsprptr dd ? ; highlight compiled sprite ptr
mirrorxpalptr dd ? ; faces to mirror pic transition pal
mirrorpicptr dd ? ; ptr to pic in mirror
mirrorpicpalptr dd ? ; ptr to pal for mirror pic
mirrorpictblptr dd ? ; ptr to table for mirror pic edges
mirrorsprptr dd ? ; ptr to mirror sprite for scaling
mirrorpicctbl dd ? ; running mirror zoom table ptr
mirrorpicptbl dd ?,? ; old mirror zoom table for both pages
p2m0seqrout dd p2m0sr0 ; sequence routine for faces in mirror
p2m0rout0 dd 35h dup(?) ; entry/exit points to raster put code
p2m0rout1 label dword ; entry points to offseting routine
irp temp,<26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0>
dd p2m0r1+&temp*3
endm
mirrorzoomloc dw 34h,14h ; Y and X location of zooming mirror
mirrorzoomlen dw 0d8h,0aah ; Y and X size of zooming mirror
facesoffwave db 0,0 ; starting locations of offset waves
facesdeltawave db 0,0 ; starting locations of delta waves
vrtcntr db 0 ; |
ovrtcntr db 0 ; |
vrttime db 1 ; vertical retraces per frame
facespageindex db 1 ; warping faces page index
facespagetbl db 80h,0c0h ; warping faces page offset table
faceswaveloc db 0 ; wave inc table wave location
facesoffwave0 db 1,2,1,2,2,1,2,2
facesoffwave1 db 1,1,1,1,1,2,1,1
facesdeltawave0 db 2,1,2,1,1,1,2,1
facesdeltawave1 db 2,2,2,2,2,3,2,2
;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
; CODE
;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
;═════════════════════════════════════════════════════════════════════════════
p2m0r0:
mov bl,[ecx]
mov al,[esi+ebx+2beaddedh]
p2m0r0m0:
mov [edi+2bh],al
p2m0r0m1:
add cl,[edx]
inc edx
P2M0ROUT0LEN=$-p2m0r0
;═════════════════════════════════════════════════════════════════════════════
p2ir1: ; only increment retrace timer
inc vrtcntr
ret
;═════════════════════════════════════════════════════════════════════════════
p2ir0: ; slide to faces palette
cld
push bx ecx esi edi
mov edi,_cpalptr
add edi,10h*3
mov esi,edi
mov dx,3c8h
@outb 10h
inc edx
mov ecx,8*3
rep outsb
add esi,8*3
dec edx
@outb 20h
inc edx
mov cl,8*3
rep outsb
mov esi,dpalptr0
mov cl,8*3
mov bl,1
call _slidebytes
setc bh
add edi,10h*3
add esi,8*3
call _slidebytes
adc bh,0
cmp bh,2
jb short p2ir0f0
mov _vrtrout,offset p2ir1
p2ir0f0:
inc vrtcntr
pop edi esi ecx bx
ret
;═════════════════════════════════════════════════════════════════════════════
p2ir2: ; slide faces to transition pal
cld
push bx ecx esi edi
mov edi,_cpalptr
add edi,10h*3
mov esi,edi
mov dx,3c8h
@outb 10h
inc edx
mov ecx,8*3
rep outsb
add esi,8*3
dec edx
@outb 20h
inc edx
mov cl,8*3
rep outsb
mov esi,mirrorxpalptr
mov cl,8*3
mov bl,1
call _slidebytes
setc bh
add edi,10h*3
call _slidebytes
adc bh,0
cmp bh,2
jb short p2ir2f0
mov _vrtrout,offset p2ir1
p2ir2f0:
inc vrtcntr
pop edi esi ecx bx
ret
;═════════════════════════════════════════════════════════════════════════════
p2ir3: ; slide to mirror pic palette
cld
push bx ecx esi edi
mov edi,_cpalptr
add edi,20h*3
mov esi,edi
mov dx,3c8h
@outb 20h
inc edx
mov ecx,MIRRORPICPALLEN
rep outsb
mov esi,mirrorpicpalptr
mov ecx,MIRRORPICPALLEN
mov bl,1
call _slidebytes
jnc short p2ir3f0
mov _vrtrout,offset p2ir1
p2ir3f0:
pop edi esi ecx bx
ret
;═════════════════════════════════════════════════════════════════════════════
_p2:
mov eax,'p20d' ; load and allocate data
call _loaddata
mov facessprptr,eax
add eax,FACESSPRLEN
mov faceslocptr,eax
add eax,FACESLOCLEN
mov facesdeltaptrl,eax
add eax,100h
mov facesoffptrl,eax
add eax,100h
mov mirrorpictblptr,eax
mov mirrorpicctbl,eax
mov mirrorpicptbl[0],eax
mov mirrorpicptbl[4],eax
add eax,MIRRORPICTBLLEN
mov mirrorpicptr,eax
add eax,MIRRORPICLEN
mov mirrorsprptr,eax
add eax,MIRRORSPRLEN
mov highlightsprptr,eax
add eax,HIGHLIGHTSPRLEN
mov dpalptr0,eax
add eax,FACESPALLEN
mov mirrorpicpalptr,eax
add _himembase,0ffh ; align high mem base on 256 bytes
mov byte ptr _himembase,0
mov eax,100h*2+128*4+400h+P2M0ROUT0LEN*35h+MIRRORPICPALLEN
call _gethimem
mov facesoffptr,eax
add eax,100h
mov facesdeltaptr,eax
add eax,100h
mov facesdeltaptr2,eax
add eax,128*4
mov facesmisctbl0,eax
add eax,400h
mov p2m0rout0,eax
add eax,P2M0ROUT0LEN*35h
mov mirrorxpalptr,eax
mov edi,facesoffptr ; copy tables to 256 aligned buffers
mov esi,facesoffptrl
mov ecx,40h
rep movsd
mov edi,facesdeltaptr
mov esi,facesdeltaptrl
mov ecx,40h
rep movsd
mov edi,facesdeltaptr2 ; build sum/mod 4 delta table
mov edx,facesdeltaptr
mov bh,4
p2i0l0:
mov esi,edi
mov bl,40h
p2i0l0l0:
mov al,[edx]
inc dl
add al,[edx]
inc dl
add al,[edx]
inc dl
add al,[edx]
inc dl
stosb
dec bl
jnz p2i0l0l0
mov ecx,10h
rep movsd
inc edx
dec bh
jnz p2i0l0
mov ebp,offset p2m0rout0 ; build put code
mov edi,[ebp]
xor ebx,ebx
p2i0l1:
mov [ebp],edi
mov esi,offset p2m0r0
lea eax,[ebx*4]
mov dword ptr p2m0r0m0[-4],eax
mov byte ptr p2m0r0m1[-1],bl
mov ecx,P2M0ROUT0LEN
rep movsb
add ebp,4
inc ebx
cmp bl,35h
jb p2i0l1
mov edi,facesmisctbl0 ; set up misc calc table
mov dword ptr p2m0l0l0m0[-4],edi
xor edx,edx
mov ecx,facesdeltaptr2
p2i0l2:
mov ebx,edx
mov eax,edx
and al,3
shl eax,7
shr ebx,2
add eax,ebx
add eax,ecx
stosd
inc dl
jnz p2i0l2
mov edi,mirrorxpalptr ; set up faces to pic transition pal
mov ecx,MIRRORPICPALLEN/3
p2i0l3:
mov word ptr [edi],3f3fh
mov byte ptr [edi+2],0
add edi,3
loop p2i0l3
mov dx,3ceh ; set read plane select index
@outb 4
waitl0:
cmp _vrtrout,offset _ret ; wait for transition to end
jne waitl0
mov _vrtrout,offset p2ir1 ; just a timer tick routine
mov esi,mirrorxpalptr ; set part of faces/pic transition pal
mov ecx,MIRRORPICPALLEN/3-8
mov al,28h
waitl2:
cmp vrtcntr,0
je waitl2
call _setcpal
;═════════════════════════════════════════════════════════════════════════════
; Warping moaning faces in mirror
p2m0:
movzx edx,faceswaveloc ; move wave starting points
movzx ecx,vrttime
mov bx,word ptr facesdeltawave
mov ax,word ptr facesoffwave
p2m0l1:
add al,facesoffwave0[edx]
add ah,facesoffwave1[edx]
add bl,facesdeltawave0[edx]
add bh,facesdeltawave1[edx]
inc edx
and dl,7
dec ecx
jnz p2m0l1
mov faceswaveloc,dl
mov word ptr facesdeltawave,bx
mov word ptr facesoffwave,ax
sub esp,P2M0SVL0 ; put warping moaning faces to screen
mov ebp,faceslocptr
movzx eax,facespageindex
mov edi,_vidptr2[eax*4]
add edi,80*37+14
mov esi,facessprptr
xor ebx,ebx
mov al,22h
mov p2m0sv4,0
mov p2m0sv5,0
p2m0l0:
mov dx,3c5h
out dx,al
mov p2m0sv3,al
movzx edx,facesdeltawave[1]
movzx ecx,facesoffwave[1]
mov al,facesoffwave[0]
add al,p2m0sv5
mov p2m0sv6,al
mov p2m0sv2,148
p2m0l0l0:
add edx,facesdeltaptr
add ecx,facesoffptr
mov bh,[ecx]
add cl,[edx]
inc dl
mov p2m0sv0,dl
mov p2m0sv1,cl
movzx edx,facesdeltawave[0]
add dl,p2m0sv4
mov edx,[edx*4+2beaddedh]
p2m0l0l0m0:
movzx ecx,p2m0sv6
add ecx,facesoffptr
movzx eax,byte ptr [ebp+1]
mov eax,p2m0rout0[eax*4]
mov byte ptr [eax],0c3h
movzx eax,byte ptr [ebp]
call p2m0rout1[eax*4]
movzx eax,byte ptr [ebp+1]
mov eax,p2m0rout0[eax*4]
mov byte ptr [eax],8ah
add ebp,2
add edi,80
add esi,256
movzx edx,p2m0sv0
movzx ecx,p2m0sv1
add p2m0sv6,3
dec p2m0sv2
jnz p2m0l0l0
mov al,p2m0sv3
rol al,1
cmc
sbb edi,80*148-1
sub esi,256*148-1
movzx edx,facesdeltawave[0]
mov ah,p2m0sv4
add dl,ah
inc ah
mov p2m0sv4,ah
add edx,facesdeltaptr
mov ah,[edx]
add p2m0sv5,ah
cmp al,22h
jne p2m0l0
add esp,P2M0SVL0
mov ebp,80*141 ; put highlight over faces
movzx eax,facespageindex
mov edi,_vidptr2[eax*4]
add edi,80*37+19h
mov esi,80
mov dh,3
mov cx,11h
mov bx,3030h
call highlightsprptr
mov dx,3d5h ; set new page
movzx ebx,facespageindex
@outb facespagetbl[ebx]
xor bl,1
mov facespageindex,bl
mov al,vrtcntr ; wait for a vertical retrace
waitl1:
cmp al,vrtcntr
je waitl1
mov al,vrtcntr ; time retraces per frame
mov ah,ovrtcntr
mov ovrtcntr,al
sub al,ah
mov vrttime,al
jmp p2m0seqrout
;─────────────────────────────────────────────────────────────────────────────
p2m0sr0: ; set palette slide to faces palette
mov _vrtrout,offset p2ir0
mov p2m0seqrout,offset p2m0sr1
jmp p2m0
;-----------------------------------------------------------------------------
p2m0sr1: ; wait for muzik meta point
cmp _muzloc,MUZLOC0
jb p2m0
mov _vrtrout,offset p2ir2
mov p2m0seqrout,offset p2m0sr2
jmp p2m0
;-----------------------------------------------------------------------------
p2m0sr2: ; wait for palette phade to end
cmp _vrtrout,offset p2ir2
je p2m0
;═════════════════════════════════════════════════════════════════════════════
p2i1:
mov ebx,80*200 ; put mirror pic to pages 0 and 1
mov esi,mirrorpicptr
mov edi,_vidptr0
call _pbmodex
mov edi,_vidptr1
call _pbmodex
mov edi,_vidptr2 ; put pic in mirror on pages 2 and 3
call p2i1r0
mov edi,_vidptr3
call p2i1r0
mov _vrtrout,offset p2ir3 ; set slide to mirror pic pal rout
mov edx,0a8000h ; set up selectors for zoom routine
mov ax,_sel[0]
call _setselector
mov edx,0ac000h
mov ax,_sel[2]
call _setselector
@php edx,mirrorsprptr
mov ax,_sel[4]
call _setselector
waitl3: ; wait for palette slide to end
cmp _vrtrout,offset p2ir3
je waitl3
mov word ptr vrtcntr,0 ; set up for mirror zoom
mov vrttime,1
;═════════════════════════════════════════════════════════════════════════════
; Zoom mirror out
p2m1:
sub esp,P2M1SVL0 ; put pieces of pic revealed
mov dx,3c5h
@outb 0fh
mov dl,0ceh
@outw 4105h
mov ebp,mirrorpicctbl
movzx eax,vrttime
imul eax,400
add ebp,eax
mov mirrorpicctbl,ebp
movzx eax,facespageindex
mov edx,_vidptr2[eax*4]
mov esi,_vidptr1
mov ebx,ebp
xchg ebx,mirrorpicptbl[eax*4]
xor ecx,ecx
mov eax,200
p2m1l0:
mov p2m1sv1,al
mov al,[ebp]
cmp al,-1
je short p2m1l0c
mov p2m1sv0,esi
lea edi,[edx+eax]
add esi,eax
mov cl,[ebx]
cmp cl,-1
je short p2m1l0f0
sub cl,al
add cl,2
rep movsb
mov esi,p2m1sv0
mov al,[ebx+1]
dec eax
lea edi,[edx+eax]
add esi,eax
mov cl,[ebp+1]
inc ecx
sub cl,al
rep movsb
jmp short p2m1l0c2
p2m1l0f0:
mov cl,[ebp+1]
inc ecx
sub cl,al
rep movsb
p2m1l0c2:
mov esi,p2m1sv0
p2m1l0c:
mov al,p2m1sv1
add esi,80
add edx,80
add ebp,2
add ebx,2
dec al
jnz p2m1l0
mov dx,3cfh
@outb 40h
add esp,P2M1SVL0
movzx eax,facespageindex ; put scaled mirror
mov es,_sel[eax*2]
xor edi,edi
xor esi,esi
mov ecx,dword ptr mirrorzoomlen
mov ebx,0a800d6h
mov eax,dword ptr mirrorzoomloc
mov ds,_sel[4]
call _psbm
mov ax,cs:_seldata
mov es,ax
mov ds,ax
mov dx,3d5h ; set new page
movzx ebx,facespageindex
@outb facespagetbl[ebx]
xor bl,1
mov facespageindex,bl
mov al,vrtcntr ; wait for a vertical retrace
waitl4:
cmp al,vrtcntr
je waitl4
mov al,vrtcntr ; time retraces per frame
mov ah,ovrtcntr
mov ovrtcntr,al
sub al,ah
mov vrttime,al
movzx eax,al ; increase zoom level
sub mirrorzoomloc[0],ax
sub mirrorzoomloc[2],ax
lea eax,[eax*2]
add mirrorzoomlen[0],ax
add mirrorzoomlen[2],ax
cmp mirrorzoomloc[0],-59
jg p2m1
;-----------------------------------------------------------------------------
mov dx,3d5h ; set page 0
@outb 0
mov eax,_ohimembase ; clean up high memory base ptr
mov _himembase,eax
mov _vrtrout,offset _ret ; clear retrace routine
ret
;─────────────────────────────────────────────────────────────────────────────
p2m0r1: ; increment to visible table part
db 26 dup(2,0ah,42h) ; add cl,[edx], inc edx
jmp p2m0rout0[eax*4]
;─────────────────────────────────────────────────────────────────────────────
p2i1r0: ; put part of pic in mirror
mov ebp,faceslocptr
add edi,80*37+14
mov esi,mirrorpicptr
add esi,80*200+80*37+14
mov dx,3c5h
xor ecx,ecx
xor ebx,ebx
mov al,22h
p2i1r0l0:
out dx,al
mov ah,148
push esi edi
p2i1r0l0l0:
push esi edi
mov bl,[ebp]
mov cl,[ebp+1]
add edi,ebx
add esi,ebx
sub cl,bl
rep movsb
pop edi esi
add ebp,2
add edi,80
add esi,80
dec ah
jnz p2i1r0l0l0
pop edi esi
add esi,80*200
rol al,1
jnc short p2i1l0c
inc edi
sub esi,80*200*4-1
p2i1l0c:
cmp al,22h
jne p2i1r0l0
ret
code32 ends
end