home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Equalizer BBS
/
equalizer-bbs-collection_2004.zip
/
equalizer-bbs-collection
/
DEMOSCENE-STUFF
/
HELLSRC.ZIP
/
V.ASM
< prev
next >
Wrap
Assembly Source File
|
1993-11-24
|
14KB
|
453 lines
.386p
code32 segment para public use32
assume cs:code32, ds:code32
include pmode.inc
include decode0.inc
include file.inc
include flib.inc
include kb.inc
include gs.inc
include gsp669.inc
extrn _p0:near, _p1:near, _p2:near, _p3:near
public _vrtrout, _olomembase, _ohimembase, _vidbitloc, _vidbitloc2, _cpalptr
public _sel, _vidptr0, _vidptr1, _vidptr2, _vidptr3, _clearpalptr
public _main, _vrtset, _loaddata, _loadmuzik, _slidebytes, _setcpal
;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
; DATA
;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
align 4
_vrtrout dd _ret
_olomembase dd ? ; old low mem base
_ohimembase dd ? ; old high mem base
_vidptr0 dd ? ; ptr to 0a0000h
_vidptr1 dd ? ; ptr to 0a4000h
_vidptr2 dd ? ; ptr to 0a8000h
_vidptr3 dd ? ; ptr to 0ac000h
_clearpalptr dd ? ; ptr to 0c0h buffer of 0
_cpalptr dd ? ; ptr to 300h buffer for current pal
_sel dw 3 dup(?) ; allocated selectors
_vidbitloc db 1,2,4,8 ; bitplane masks for bit numbers
_vidbitloc2 db 11h,22h,44h,88h ; double bitplane masks
l8rmsg db 'Have a nice life...$'
errmsg0 db 'Please rename this file back to HELL.EXE!!!$'
errmsg1 db 'Then you aint gonna see this demo...$'
errmsg2 db 'Could not find a GUS!!!$'
errmsg3 db 'You must have a GUS with at least 512k!!!$'
libfnm db 'HELL.EXE',0
;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
; CODE
;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
include modex.rt
include mode60.rt
include pbmodex.rt
include pdosmsg.rt
include psbm.rt
include slidebyt.rt
include vrtime.m
include end.m
;═════════════════════════════════════════════════════════════════════════════
; Exit to DOS, In: EDX -> msg to put
exit:
call _flcloselib ; close library file
call _resetvrt ; reset system timer
;-----------------------------------------------------------------------------
exit1:
call _gsp669_uninit ; reset GUS 669 player
;-----------------------------------------------------------------------------
exit0:
call _resetkb ; reset keyboard handler
mov v86r_ax,3 ; text mode
mov al,10h
int 33h
mov edx,ebp
call _putdosmsg ; put message
jmp _exit
;═════════════════════════════════════════════════════════════════════════════
_main:
sti
mov eax,1000h+300h+0c0h ; allocate some buffers
call _getlomem
mov _filebufloc,eax
mov _decode0ibufptr,eax
add eax,1000h
mov _cpalptr,eax
add eax,300h
mov _clearpalptr,eax
mov edi,eax ; clear '_clearpalptr' buffer
xor eax,eax
mov ecx,0c0h/4
rep stosd
mov edi,offset _sel ; allocate selectors
mov ecx,3
mainl0:
call _getselector
stosw
loop mainl0
call _initkb ; init keyboard handler
call _gs_find ; find and initialize a GUS
jnc short mainf0
call _gs_ask
mov ebp,offset errmsg1
jc exit0
mainf0:
call _gsp669_init ; init GUS 669 player
cmp _gusram,2
mov ebp,offset errmsg3
jb exit1
call _gs_test
mov ebp,offset errmsg2
jc exit0
call _initvrt ; init timer for vertical retrace
mov edx,offset libfnm ; open library file
call _flopenlib
mov ebp,offset errmsg0
jc exit
call _mode60 ; 60Hz tweaked mode
call _vrtset
mov eax,_lomembase ; store memory base ptrs
mov _olomembase,eax
mov eax,_himembase
mov _ohimembase,eax
@rlp eax,0a0000h ; set video ptrs
mov _vidptr0,eax
add eax,4000h
mov _vidptr1,eax
add eax,4000h
mov _vidptr2,eax
add eax,4000h
mov _vidptr3,eax
;-----------------------------------------------------------------------------
call _p0 ; starting part, cross bursts into
; flames, title screen, skull speaks,
; penagram field transitions in
call _p1 ; interfering pentagrams on field,
; b/w sinewave sum plasma, mirror
; transitions in
; call __crapinit
call _p2 ; warping faces in mirror, mirror
; zooms out
; call __crapinit
call _p3 ; rotating glass balls, bg falls away
;-----------------------------------------------------------------------------
call _end ; put end piccy
mov ebp,offset l8rmsg
jmp exit
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
; Load compressed data into high memory and allocate it (also realign on 4)
; In:
; EAX - token name of data
; Out:
; EAX -> ptr to data
; EDI - ?
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
_loaddata:
call _flopenfile
mov eax,offset _flreadfile
mov edi,_himembase
call _decode0
call _gethimem
movzx ebx,al
dec bl
and bl,3
xor bl,3
add _himembase,ebx
ret
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
; Load muzik into low memory and allocate it
; In:
; EAX - token name of muzik
; Out:
; EAX -> ptr to data
; EDX - ?
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
_loadmuzik:
call _gsp669_stop
call _flopenfile
mov eax,offset _flreadfile
mov edx,_olomembase
mov _lomembase,edx
call _gsp669_load
jmp _getlomem
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
; Set current palette and update '_cpalptr' buffer
; In:
; AL - first color to set
; ECX - number of colors to set
; ESI -> RGB color data
; Out:
; EAX,EBX,ECX,DX,ESI,EDI - ?
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
_setcpal:
movzx eax,al
lea edi,[eax*2+eax]
add edi,_cpalptr
lea ecx,[ecx*2+ecx]
mov ebx,ecx
mov dx,3c8h
out dx,al
inc edx
rep outsb
sub esi,ebx
mov ecx,ebx
rep movsb
ret
; The crap that follows is just code to enter the demo at different points.
; Used only when I was writing the demo, but might as well leave it in.
CRAP = 0
extrn ord:dword
if CRAP eq 1
;═════════════════════════════════════════════════════════════════════════════
skullsidepalptr dd ? ; skull column palette ptr
skullsidesprptr dd ? ; skull side column sprite ptr
trnsptr dd ?,? ; transition video ptrs
trnscount db 48 ; transition routine loop counter
;-----------------------------------------------------------------------------
p0ir1:
cld
push ecx esi edi
mov esi,trnsptr[0]
lea edi,[esi+16]
lea eax,[esi+1]
mov trnsptr[0],eax
call p0ir1r0
mov esi,trnsptr[4]
lea edi,[esi-16]
lea eax,[esi-1]
mov trnsptr[4],eax
call p0ir1r0
dec trnscount
jnz short p0ir1d
mov _vrtrout,offset _ret
p0ir1d:
pop edi esi ecx
ret
;-----------------------------------------------------------------------------
p0ir1r0:
mov ecx,25
p0ir1r0l0:
irp temp,<0,1,2,3>
mov ah,[esi+&temp*80]
mov [edi+&temp*80],ah
endm
add edi,80*4
add esi,80*4
dec ecx
jnz p0ir1r0l0
ret
;─────────────────────────────────────────────────────────────────────────────
__crapinit:
mov eax,'p02d'
call _loaddata
add eax,24f0h
mov skullsidesprptr,eax
add eax,3200h
mov skullsidepalptr,eax
mov esi,skullsidepalptr
mov ecx,20h
mov al,40h
call _setcpal
mov esi,_clearpalptr
mov ecx,40h
xor al,al
call _setcpal
mov edi,_vidptr0
mov esi,skullsidesprptr
mov dx,3c5h
mov bl,1
l0:
@outb bl
mov ecx,200
l1:
mov eax,[esi]
mov [edi],eax
mov [edi+40h],eax
mov eax,[esi+4]
mov [edi+4],eax
mov [edi+44h],eax
mov eax,[esi+8]
mov [edi+8],eax
mov [edi+48h],eax
mov eax,[esi+12]
mov [edi+12],eax
mov [edi+4ch],eax
add esi,16
add edi,80
loop l1
sub edi,80*200
shl bl,1
and bl,0fh
jnz l0
@outb 0fh
mov dl,0ceh
@outw 4105h
mov eax,_vidptr0
add eax,80*100
mov trnsptr[0],eax
add eax,79-80*100
mov trnsptr[4],eax
mov _vrtrout,offset p0ir1
mov eax,_ohimembase
mov _himembase,eax
ret
endif
if CRAP eq 2
;═════════════════════════════════════════════════════════════════════════════
mirrorpal db 0, 0, 0, 3, 1, 0, 7, 4, 1, 12, 7, 2, 16, 9, 3, 20
db 12, 4, 24, 15, 5, 29, 17, 7, 33, 20, 8, 37, 23, 9, 41, 25
db 10, 46, 28, 11, 50, 31, 12, 54, 33, 13, 58, 36, 14, 63, 39, 16
db 6, 0, 12, 6, 0, 12, 6, 0, 12, 6, 0, 12, 6, 0, 12, 6
db 0, 12, 6, 0, 12, 6, 0, 12, 0, 0, 6, 0, 0, 7, 0, 0
db 8, 0, 0, 10, 0, 0, 11, 0, 0, 13, 0, 0, 14, 0, 0, 16
db 17, 0, 26, 17, 0, 26, 17, 0, 26, 17, 0, 26, 17, 0, 26, 17
db 0, 26, 17, 0, 26, 17, 0, 26
;═════════════════════════════════════════════════════════════════════════════
p1ir4: ; transition, slide to mirror palette
cld
push bx ecx esi edi
mov dx,3c8h
@outb 0
mov edi,_cpalptr
mov esi,edi
mov ecx,28h*3
inc edx
rep outsb
mov esi,offset mirrorpal
mov cl,28h*3
mov bl,1
call _slidebytes
jnc short p1ir4d
mov _vrtrout,offset _ret
p1ir4d:
pop edi esi ecx bx
ret
;─────────────────────────────────────────────────────────────────────────────
__crapinit:
mov eax,'muz2' ; load up next muzik
call _loadmuzik
cli
call _gsp669_play ; start muzik playing
mov ord,4
sti
mov edi,_vidptr2 ; clean up pages 2 and 3
mov dx,3c5h
@outb 0fh
mov ecx,2000h
xor eax,eax
rep stosd
mov edi,_cpalptr ; set up b/w palette
mov esi,edi
mov ecx,20h
xor edx,edx
mov ebx,2f2f2f2fh
xor eax,eax
p1i1l0:
stosd
stosd
stosd
stosd
stosd
stosd
xchg ebx,eax
xchg edx,ebx
loop p1i1l0
mov ecx,100h
xor al,al
call _setcpal
mov dx,3d4h ; set page 2
@outw 800ch
mov eax,'p11d' ; load and put transition bg pic
call _loaddata
mov edi,_vidptr2 ; put mirror bitmap to pages 2 and 3
add edi,80*21
mov esi,eax
mov ebx,80*168
call _pbmodex
mov edi,_vidptr3
add edi,80*21
call _pbmodex
mov eax,_ohimembase ; clean up high memory base ptr
mov _himembase,eax
mov _vrtrout,offset p1ir4 ; set transition retrace routine
ret
endif
if CRAP eq 3
;─────────────────────────────────────────────────────────────────────────────
__crapinit:
mov eax,'muz2' ; load up next muzik
call _loadmuzik
cli
call _gsp669_play ; start muzik playing
mov ord,8
sti
mov eax,'p20d' ; load and allocate data
call _loaddata
mov ebp,eax
lea esi,[ebp+97696] ; put mirror pic to pages 0 and 1
mov ebx,80*200
mov edi,_vidptr0
call _pbmodex
mov edi,_vidptr1
call _pbmodex
lea esi,[ebp+209923]
mov ecx,40h
mov al,20h
call _setcpal
mov dx,3d4h ; set page 0
@outw 0ch
ret
endif
code32 ends
end