632 lines
9.4 KiB
NASM
632 lines
9.4 KiB
NASM
extrn _circle:byte
|
|
extrn _circle2:byte
|
|
code2 SEGMENT para public 'CODE'
|
|
ASSUME cs:code2
|
|
.386
|
|
LOCALS
|
|
|
|
include sin1024.inc
|
|
|
|
;################################################################
|
|
|
|
sizefade dw 0
|
|
rotspeed dw 0
|
|
palfader dw 0
|
|
palfader2 db 255
|
|
zumplane db 11h
|
|
|
|
ALIGN 16
|
|
|
|
flip8 LABEL BYTE
|
|
db 0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240,8,136,72,200
|
|
db 40,168,104,232,24,152,88,216,56,184,120,248,4,132,68,196,36,164,100
|
|
db 228,20,148,84,212,52,180,116,244,12,140,76,204,44,172,108,236,28,156
|
|
db 92,220,60,188,124,252,2,130,66,194,34,162,98,226,18,146,82,210,50,178
|
|
db 114,242,10,138,74,202,42,170,106,234,26,154,90,218,58,186,122,250,6
|
|
db 134,70,198,38,166,102,230,22,150,86,214,54,182,118,246,14,142,78,206
|
|
db 46,174,110,238,30,158,94,222,62,190,126,254,1,129,65,193,33,161,97,225
|
|
db 17,145,81,209,49,177,113,241,9,137,73,201,41,169,105,233,25,153,89,217
|
|
db 57,185,121,249,5,133,69,197,37,165,101,229,21,149,85,213,53,181,117,245
|
|
db 13,141,77,205,45,173,109,237,29,157,93,221,61,189,125,253,3,131,67,195
|
|
db 35,163,99,227,19,147,83,211,51,179,115,243,11,139,75,203,43,171,107,235
|
|
db 27,155,91,219,59,187,123,251,7,135,71,199,39,167,103,231,23,151,87,215
|
|
db 55,183,119,247,15,143,79,207,47,175,111,239,31,159,95,223,63,191,127,255
|
|
|
|
circles dw 8 dup(0)
|
|
|
|
pal db 32*3 dup(0)
|
|
|
|
pal0 LABEL WORD
|
|
db 0,30,40
|
|
db 0,0 ,0
|
|
db 0,0 ,0
|
|
db 0,0 ,0
|
|
db 0,0 ,0
|
|
db 0,0 ,0
|
|
db 0,0 ,0
|
|
db 0,0 ,0
|
|
db 0,30,40
|
|
db 0,0 ,0
|
|
db 0,0 ,0
|
|
db 0,0 ,0
|
|
db 0,0 ,0
|
|
db 0,0 ,0
|
|
db 0,0 ,0
|
|
db 0,0 ,0
|
|
|
|
pal1 LABEL WORD
|
|
db 0, 0*7/9, 0
|
|
db 10,10*7/9,10
|
|
db 20,20*7/9,20
|
|
db 30,30*7/9,30
|
|
db 40,40*7/9,40
|
|
db 50,50*7/9,50
|
|
db 60,60*7/9,60
|
|
db 30,30*7/9,30
|
|
db 0, 0*7/9, 0
|
|
db 10,10*7/9,10
|
|
db 20,20*7/9,20
|
|
db 30,30*7/9,30
|
|
db 40,40*7/9,40
|
|
db 50,50*7/9,50
|
|
db 60,60*7/9,60
|
|
db 30,30*7/9,30
|
|
|
|
pal2 LABEL WORD
|
|
db 50,50*6/9,50
|
|
db 60,60*6/9,60
|
|
db 30,30*6/9,30
|
|
db 0, 0*6/9, 0
|
|
db 10,10*6/9,10
|
|
db 20,20*6/9,20
|
|
db 30,30*6/9,30
|
|
db 40,40*6/9,40
|
|
db 50,50*6/9,50
|
|
db 60,60*6/9,60
|
|
db 30,30*6/9,30
|
|
db 0, 0*6/9, 0
|
|
db 10,10*6/9,10
|
|
db 20,20*6/9,20
|
|
db 30,30*6/9,30
|
|
db 40,40*6/9,40
|
|
|
|
sinuspower db 0
|
|
powercnt db 0
|
|
PUBLIC _power1
|
|
_power1 LABEL WORD
|
|
power0 db 256 dup(0)
|
|
db 256 dup(0)
|
|
db 256 dup(0)
|
|
db 256 dup(0)
|
|
db 256 dup(0)
|
|
db 256 dup(0)
|
|
db 256 dup(0)
|
|
db 256 dup(0)
|
|
db 256 dup(0)
|
|
db 256 dup(0)
|
|
db 256 dup(0)
|
|
db 256 dup(0)
|
|
db 256 dup(0)
|
|
db 256 dup(0)
|
|
db 256 dup(0)
|
|
db 256 dup(0)
|
|
|
|
PLANE MACRO pl
|
|
mov dx,3c4h
|
|
mov ax,0002h+pl*100h
|
|
out dx,ax
|
|
ENDM
|
|
|
|
bltline PROC NEAR
|
|
push si
|
|
mov dx,3c4h
|
|
mov al,2
|
|
out dx,al
|
|
inc dx
|
|
@@1: mov al,ch
|
|
out dx,al
|
|
zzz=0
|
|
REPT 10
|
|
mov eax,ds:[si+zzz]
|
|
mov es:[di+zzz],eax
|
|
zzz=zzz+4
|
|
ENDM
|
|
add si,40
|
|
shl ch,1
|
|
dec cl
|
|
jnz @@1
|
|
pop si
|
|
ret
|
|
bltline ENDP
|
|
|
|
bltlinerev PROC NEAR
|
|
push si
|
|
mov dx,3c4h
|
|
mov al,2
|
|
out dx,al
|
|
inc dx
|
|
xor bx,bx
|
|
@@1: mov al,ch
|
|
out dx,al
|
|
zzz=0
|
|
REPT 10
|
|
mov bl,ds:[si+36-zzz]
|
|
mov al,cs:flip8[bx]
|
|
rol eax,8
|
|
mov bl,ds:[si+37-zzz]
|
|
mov al,cs:flip8[bx]
|
|
rol eax,8
|
|
mov bl,ds:[si+38-zzz]
|
|
mov al,cs:flip8[bx]
|
|
rol eax,8
|
|
mov bl,ds:[si+39-zzz]
|
|
mov al,cs:flip8[bx]
|
|
mov es:[di+zzz],eax
|
|
zzz=zzz+4
|
|
ENDM
|
|
add si,40
|
|
shl ch,1
|
|
dec cl
|
|
jnz @@1
|
|
pop si
|
|
ret
|
|
bltlinerev ENDP
|
|
|
|
resetmode13 PROC NEAR
|
|
mov bx,1
|
|
int 0fch
|
|
mov dx,3c8h
|
|
mov al,0
|
|
out dx,al
|
|
inc dx
|
|
mov cx,768
|
|
@@ccc: out dx,al
|
|
loop @@ccc
|
|
mov bx,1
|
|
int 0fch
|
|
mov ax,13
|
|
int 10h
|
|
mov dx,3dah
|
|
in al,dx
|
|
mov dx,3c0h
|
|
xor al,al
|
|
REPT 16
|
|
out dx,al
|
|
out dx,al
|
|
inc al
|
|
ENDM
|
|
mov al,11h
|
|
out dx,al
|
|
mov al,255
|
|
out dx,al
|
|
mov al,32
|
|
out dx,al
|
|
;clear pal
|
|
mov dx,3c8h
|
|
xor al,al
|
|
out dx,al
|
|
inc dx
|
|
mov cx,768
|
|
@@clp: out dx,al
|
|
loop @@clp
|
|
ret
|
|
resetmode13 ENDP
|
|
|
|
mixpal PROC NEAR
|
|
;cs:si=>cs:di, for cx
|
|
push dx
|
|
cmp dx,256
|
|
jg @@2
|
|
mov bx,dx
|
|
@@1: mov al,cs:[si]
|
|
xor ah,ah
|
|
inc si
|
|
mul bx
|
|
shr ax,8
|
|
mov cs:[di],al
|
|
inc di
|
|
loop @@1
|
|
pop dx
|
|
ret
|
|
@@2: mov bx,dx
|
|
sub bx,256
|
|
@@4: mov al,cs:[si]
|
|
xor ah,ah
|
|
inc si
|
|
add ax,bx
|
|
cmp ax,64
|
|
jb @@3
|
|
mov al,63
|
|
@@3: mov cs:[di],al
|
|
inc di
|
|
loop @@4
|
|
pop dx
|
|
ret
|
|
mixpal ENDP
|
|
|
|
outpal PROC NEAR
|
|
mov dx,3c8h
|
|
out dx,al
|
|
mov ax,cs
|
|
mov ds,ax
|
|
inc dx
|
|
rep outsb
|
|
ret
|
|
outpal ENDP
|
|
|
|
waitb PROC NEAR
|
|
mov bx,1
|
|
int 0fch
|
|
ret
|
|
waitb ENDP
|
|
|
|
rotate1 PROC NEAR
|
|
xor si,si
|
|
mov cx,32000/32-2
|
|
cld
|
|
jmp @@2
|
|
;edx.eax
|
|
@@1: popf
|
|
zzz=0
|
|
REPT 16
|
|
mov ax,ds:[si+zzz]
|
|
rcr al,1
|
|
rcr ah,1
|
|
mov es:[si+zzz],ax
|
|
zzz=zzz+2
|
|
ENDM
|
|
@@2: pushf
|
|
add si,zzz
|
|
dec cx
|
|
jz @@0
|
|
jmp @@1
|
|
@@0: popf
|
|
ret
|
|
rotate1 ENDP
|
|
|
|
ALIGN 2
|
|
framecount dw 0
|
|
palanimc dw 0
|
|
palanimc2 dw 0
|
|
scrnpos dw 0
|
|
scrnposl dw 0
|
|
scrnx dw 0
|
|
scrny dw 0
|
|
scrnrot dw 0
|
|
sinurot dw 0
|
|
overrot dw 0
|
|
overx dw 0
|
|
overya dw 0
|
|
patdir dw -3
|
|
|
|
memseg dw 0
|
|
|
|
init_interference PROC NEAR
|
|
mov dx,3d4h
|
|
mov ax,2813h
|
|
out dx,ax
|
|
|
|
mov bx,20+100*80
|
|
|
|
;get mem for circles
|
|
mov ah,48h
|
|
mov bx,16384
|
|
int 21h
|
|
mov cs:memseg,ax
|
|
zzz=0
|
|
REPT 8
|
|
mov cs:circles[zzz],ax
|
|
add ax,2048
|
|
zzz=zzz+2
|
|
ENDM
|
|
|
|
mov ax,SEG _circle2
|
|
mov ds,ax
|
|
xor si,si
|
|
mov ax,0a000h
|
|
mov es,ax
|
|
mov cx,200
|
|
xor di,di
|
|
mov bp,80*399
|
|
@@1: push cx
|
|
push di
|
|
mov cx,0401h
|
|
call bltline
|
|
add di,40
|
|
mov cx,0401h
|
|
call bltlinerev
|
|
add di,40
|
|
mov di,bp
|
|
mov cx,0401h
|
|
call bltline
|
|
add di,40
|
|
mov cx,0401h
|
|
call bltlinerev
|
|
add di,40
|
|
pop di
|
|
add di,80
|
|
sub bp,80
|
|
add si,40
|
|
pop cx
|
|
loop @@1
|
|
|
|
mov dx,3ceh
|
|
mov ax,0204h
|
|
out dx,ax
|
|
mov cx,400
|
|
mov es,cs:circles[0]
|
|
mov ax,0a000h
|
|
mov ds,ax
|
|
mov cx,32000/4
|
|
xor si,si
|
|
xor di,di
|
|
rep movsd
|
|
zzz=0
|
|
REPT 7
|
|
mov ds,cs:circles[zzz]
|
|
mov es,cs:circles[zzz+2]
|
|
call rotate1
|
|
zzz=zzz+2
|
|
ENDM
|
|
|
|
mov ax,SEG _circle
|
|
mov ds,ax
|
|
xor si,si
|
|
mov ax,0a000h
|
|
mov es,ax
|
|
mov cx,200
|
|
xor di,di
|
|
mov bp,80*399
|
|
@@10: push cx
|
|
push di
|
|
mov cx,0103h ;start at plane 1, copy 3 planes
|
|
call bltline
|
|
add di,40
|
|
mov cx,0103h ;start at plane 1, copy 3 planes
|
|
call bltlinerev
|
|
add di,40
|
|
mov di,bp
|
|
mov cx,0103h ;start at plane 1, copy 3 planes
|
|
call bltline
|
|
add di,40
|
|
mov cx,0103h ;start at plane 1, copy 3 planes
|
|
call bltlinerev
|
|
add di,40
|
|
pop di
|
|
add di,80
|
|
sub bp,80
|
|
add si,40*3
|
|
pop cx
|
|
loop @@10
|
|
mov cs:framecount,0
|
|
ret
|
|
init_interference ENDP
|
|
|
|
do_interference PROC NEAR
|
|
@@aga: call waitb
|
|
mov dx,3c0h
|
|
mov al,13h
|
|
out dx,al
|
|
mov al,byte ptr cs:scrnposl
|
|
out dx,al
|
|
mov al,32
|
|
out dx,al
|
|
|
|
xor al,al
|
|
mov si,OFFSET pal
|
|
mov cx,16*3
|
|
call outpal
|
|
|
|
mov si,cs:palanimc
|
|
add si,cs:patdir
|
|
cmp si,0
|
|
jge @@a11
|
|
mov si,8*3-3
|
|
@@a11: cmp si,8*3
|
|
jb @@a1
|
|
xor si,si
|
|
@@a1: mov cs:palanimc,si
|
|
mov cs:palanimc2,si
|
|
|
|
mov dx,cs:palfader
|
|
add dx,2
|
|
cmp dx,512
|
|
jb @@pf1
|
|
mov dx,512
|
|
@@pf1: mov cs:palfader,dx
|
|
;
|
|
mov si,cs:palanimc
|
|
add si,OFFSET pal0
|
|
mov di,OFFSET pal
|
|
mov cx,8*3
|
|
call mixpal
|
|
mov si,cs:palanimc
|
|
add si,OFFSET pal0
|
|
mov di,OFFSET pal+8*3
|
|
mov cx,8*3
|
|
call mixpal
|
|
|
|
mov si,OFFSET pal
|
|
mov al,0
|
|
mov cx,16*3
|
|
call outpal
|
|
|
|
jmp @@OVER3
|
|
mov dx,3c4h
|
|
mov al,2
|
|
mov ah,cs:zumplane
|
|
rol ah,1
|
|
mov cs:zumplane,ah
|
|
out dx,ax
|
|
|
|
mov ax,0a000h
|
|
mov es,ax
|
|
xor si,si
|
|
mov di,cs:scrnpos
|
|
mov bp,cs:sinurot
|
|
add bp,7*2
|
|
and bp,2047
|
|
mov cs:sinurot,bp
|
|
mov cx,200
|
|
@@cp1: zzz=0
|
|
push si
|
|
add bp,9*2
|
|
and bp,2047
|
|
mov bx,cs:_sin1024[bp]
|
|
sar bx,3
|
|
mov bh,cs:sinuspower
|
|
movsx ax,byte ptr cs:power0[bx]
|
|
sub ax,cs:scrnposl
|
|
add ax,cs:overx
|
|
mov bx,ax
|
|
and bx,7
|
|
shl bx,1
|
|
neg bx
|
|
mov ds,cs:circles[bx+7*2]
|
|
sar ax,3
|
|
add si,ax
|
|
add si,cs:overya
|
|
REPT 40/4+1
|
|
mov eax,ds:[si+zzz]
|
|
mov es:[di+zzz],eax
|
|
zzz=zzz+4
|
|
ENDM
|
|
pop si
|
|
add di,80
|
|
add si,80
|
|
dec cx
|
|
jz @@cp0
|
|
jmp @@cp1
|
|
@@cp0:
|
|
@@OVER3:
|
|
;MOVE
|
|
mov bx,6
|
|
int 0fch
|
|
;bx=row
|
|
and bx,7
|
|
cmp bx,0
|
|
jne @@m1
|
|
mov cs:patdir,-3
|
|
@@m1: cmp bx,4
|
|
jne @@m2
|
|
mov cs:patdir,-3 ;-3
|
|
@@m2:
|
|
mov bx,cs:scrnrot
|
|
add bx,5
|
|
and bx,1023
|
|
mov cs:scrnrot,bx
|
|
|
|
cmp cs:framecount,64
|
|
jb @@szf1
|
|
inc cs:rotspeed
|
|
mov ax,cs:sizefade
|
|
cmp ax,16834
|
|
jge @@1
|
|
;add ax,256
|
|
@@1: mov cs:sizefade,ax
|
|
@@szf1:
|
|
shl bx,1
|
|
mov ax,cs:_sin1024[bx]
|
|
imul cs:sizefade
|
|
mov ax,dx
|
|
add ax,160
|
|
mov cs:scrnx,ax
|
|
add bx,256*2
|
|
and bx,1024*2-1
|
|
mov ax,cs:_sin1024[bx]
|
|
imul cs:sizefade
|
|
mov ax,dx
|
|
add ax,100
|
|
mov cs:scrny,ax
|
|
|
|
mov bx,cs:overrot
|
|
add bx,cs:rotspeed
|
|
and bx,1023
|
|
mov cs:overrot,bx
|
|
|
|
shl bx,1
|
|
mov ax,cs:_sin1024[bx]
|
|
sar ax,2
|
|
imul cs:sizefade
|
|
mov ax,dx
|
|
add ax,160
|
|
mov cs:overx,ax
|
|
add bx,256*2
|
|
and bx,1024*2-1
|
|
mov ax,cs:_sin1024[bx]
|
|
sar ax,2
|
|
imul cs:sizefade
|
|
mov ax,dx
|
|
add ax,100
|
|
mov bx,80
|
|
mul bx
|
|
mov cs:overya,ax
|
|
|
|
mov ax,cs:scrnx
|
|
mov bx,ax
|
|
and ax,7
|
|
mov cs:scrnposl,ax
|
|
mov ax,80
|
|
mul cs:scrny
|
|
sar bx,3
|
|
add ax,bx
|
|
mov cs:scrnpos,ax
|
|
|
|
mov bx,cs:scrnpos
|
|
mov dx,3d4h
|
|
mov al,0ch
|
|
mov ah,bh
|
|
out dx,ax
|
|
inc al
|
|
mov ah,bl
|
|
out dx,ax
|
|
|
|
cmp cs:framecount,192
|
|
jb @@asd2
|
|
test cs:framecount,3
|
|
jnz @@asd2
|
|
@@asd2:
|
|
; cmp cs:framecount,256
|
|
; jb @@p1
|
|
; inc cs:powercnt
|
|
; cmp cs:powercnt,16
|
|
; jb @@p1
|
|
; mov cs:powercnt,0
|
|
; cmp cs:sinuspower,15
|
|
; jae @@p1
|
|
; inc cs:sinuspower
|
|
@@p1:
|
|
inc cs:framecount
|
|
cmp cs:framecount,256
|
|
je @@xx
|
|
mov bx,2
|
|
int 0fch
|
|
or ax,ax
|
|
jz @@aga
|
|
@@xx: ret
|
|
do_interference ENDP
|
|
|
|
PUBLIC _dointerference2
|
|
_dointerference2 PROC FAR
|
|
push bp
|
|
mov bp,sp
|
|
push si
|
|
push di
|
|
push ds
|
|
|
|
call resetmode13
|
|
call init_interference
|
|
call do_interference
|
|
mov es,cs:memseg
|
|
mov ah,49h
|
|
int 21h
|
|
|
|
pop ds
|
|
pop di
|
|
pop si
|
|
pop bp
|
|
ret
|
|
_dointerference2 ENDP
|
|
|
|
code2 ENDS
|
|
END
|