1066 lines
No EOL
16 KiB
NASM
1066 lines
No EOL
16 KiB
NASM
extrn _circle:byte
|
|
extrn _circle2:byte
|
|
code SEGMENT para public 'CODE'
|
|
ASSUME cs:code
|
|
.386
|
|
LOCALS
|
|
|
|
ALIGN 16
|
|
_rows dw 200 dup(0)
|
|
_blit16t dw 256 dup(0)
|
|
_vbufseg dw 0
|
|
clipleft dw 0
|
|
|
|
polyisides dw 0
|
|
polyixy dw 16 dup(0,0)
|
|
polysides dw 0
|
|
polyxy dw 16 dup(0,0)
|
|
include polyclip.asm
|
|
|
|
ALIGN 2
|
|
PUBLIC _sin1024
|
|
include sin1024.inc
|
|
|
|
REPOUTSB MACRO
|
|
local l1
|
|
l1: mov al,ds:[si]
|
|
inc si
|
|
out dx,al
|
|
dec cx
|
|
jnz l1
|
|
ENDM
|
|
|
|
PUBLIC _asminit
|
|
_asminit PROC FAR
|
|
push bp
|
|
mov bp,sp
|
|
push si
|
|
push di
|
|
push ds
|
|
mov ax,[bp+8]
|
|
mov cs:_vbufseg,ax
|
|
call blitinit
|
|
pop ds
|
|
pop di
|
|
pop si
|
|
pop bp
|
|
ret
|
|
_asminit ENDP
|
|
|
|
PUBLIC _asmdoit
|
|
_asmdoit PROC FAR
|
|
push bp
|
|
mov bp,sp
|
|
push si
|
|
push di
|
|
push ds
|
|
lds si,[bp+6]
|
|
les di,[bp+10]
|
|
call blit16
|
|
pop ds
|
|
pop di
|
|
pop si
|
|
pop bp
|
|
ret
|
|
_asmdoit ENDP
|
|
|
|
PUBLIC _asmdoit2
|
|
_asmdoit2 PROC FAR
|
|
push bp
|
|
mov bp,sp
|
|
push si
|
|
push di
|
|
push ds
|
|
lds si,[bp+6]
|
|
les di,[bp+10]
|
|
call blit16b
|
|
pop ds
|
|
pop di
|
|
pop si
|
|
pop bp
|
|
ret
|
|
_asmdoit2 ENDP
|
|
|
|
blitinit PROC NEAR
|
|
mov bx,OFFSET _rows
|
|
mov cx,200
|
|
mov dx,40
|
|
xor ax,ax
|
|
@@l1: mov cs:[bx],ax
|
|
add ax,dx
|
|
add bx,2
|
|
loop @@l1
|
|
xor al,al
|
|
mov bx,OFFSET _blit16t
|
|
mov cx,256
|
|
@@1: mov dh,255
|
|
mov dl,al
|
|
xor ah,ah
|
|
REPT 8
|
|
local l2
|
|
rcl dl,1
|
|
jnc l2
|
|
xor ah,dh
|
|
l2: shr dh,1
|
|
ENDM
|
|
mov cs:[bx],ah
|
|
ror ah,1
|
|
and ah,80h
|
|
mov cs:[bx+1],ah
|
|
add bx,2
|
|
inc al
|
|
loop @@1
|
|
ret
|
|
blitinit ENDP
|
|
|
|
blit16 PROC NEAR
|
|
xor ebx,ebx
|
|
mov cx,200
|
|
jmp @@1
|
|
ALIGN 16
|
|
@@1: zzz=0
|
|
xor dh,dh ;line starts black
|
|
REPT 40/2
|
|
mov bl,ds:[si+zzz]
|
|
xor bl,dh
|
|
mov ax,cs:_blit16t[ebx*2]
|
|
mov bl,ds:[si+1+zzz]
|
|
xor bl,ah
|
|
mov dx,cs:_blit16t[ebx*2]
|
|
mov ah,dl
|
|
mov es:[di+zzz],ax
|
|
zzz=zzz+2
|
|
ENDM
|
|
add si,40
|
|
add di,40
|
|
dec cx
|
|
jz @@2
|
|
jmp @@1
|
|
@@2:
|
|
ret
|
|
blit16 ENDP
|
|
|
|
blit16b PROC NEAR
|
|
xor ebx,ebx
|
|
mov cx,200
|
|
jmp @@1
|
|
ALIGN 16
|
|
@@1: zzz=0
|
|
xor dh,dh ;line starts black
|
|
REPT 40/2
|
|
mov bl,ds:[si+zzz]
|
|
xor bl,dh
|
|
mov ax,cs:_blit16t[ebx*2]
|
|
mov bl,ds:[si+1+zzz]
|
|
xor bl,ah
|
|
mov dx,cs:_blit16t[ebx*2]
|
|
mov ah,dl
|
|
mov es:[di+zzz],ax
|
|
zzz=zzz+2
|
|
ENDM
|
|
add si,40
|
|
add di,80
|
|
dec cx
|
|
jz @@2
|
|
jmp @@1
|
|
@@2:
|
|
ret
|
|
blit16b ENDP
|
|
|
|
drawline PROC NEAR
|
|
push si
|
|
push di
|
|
push bp
|
|
@@vis: movzx ebx,bx
|
|
cmp bx,cx
|
|
je @@0
|
|
jle @@1
|
|
xchg bx,cx
|
|
xchg ax,dx
|
|
@@1: sub cx,bx
|
|
mov di,cx
|
|
mov si,cs:_rows[ebx*2]
|
|
mov bp,cs:clipleft
|
|
or bp,bp
|
|
jz @@nl
|
|
push si
|
|
;left overflow fill
|
|
jge @@ndn
|
|
@@nup: add si,40
|
|
xor byte ptr ds:[si],080h
|
|
inc bp
|
|
jnz @@nup
|
|
jmp @@nl2
|
|
@@ndn: sub si,40
|
|
xor byte ptr ds:[si],080h
|
|
dec bp
|
|
jnz @@ndn
|
|
@@nl2: pop si
|
|
@@nl: ;
|
|
jcxz @@0
|
|
movzx ebp,ax
|
|
shr bp,3
|
|
add si,bp
|
|
mov bp,ax
|
|
and bp,7
|
|
;go on
|
|
cmp ax,dx
|
|
jl @@r
|
|
@@l: ;=============== left
|
|
neg dx
|
|
add dx,ax
|
|
mov bx,di
|
|
shr bx,1
|
|
neg bx
|
|
jmp cs:_loffs[ebp*2]
|
|
ALIGN 16
|
|
_loffs LABEL WORD
|
|
dw OFFSET @@l7
|
|
dw OFFSET @@l6
|
|
dw OFFSET @@l5
|
|
dw OFFSET @@l4
|
|
dw OFFSET @@l3
|
|
dw OFFSET @@l2
|
|
dw OFFSET @@l1
|
|
dw OFFSET @@l0
|
|
llinemacro MACRO mask,lbl1,lbl2,lbl3,lbl4,lbl5,lbl6,lbl7,lbl0
|
|
local l1,l2
|
|
;ds:si=startpoint
|
|
;di=ycnt
|
|
;dx=xcnt
|
|
;bx=counter
|
|
l1: xor byte ptr ds:[si],mask
|
|
add si,40
|
|
dec cx
|
|
jz @@0
|
|
add bx,dx
|
|
jl l1
|
|
l2: IF lbl1 EQ @@l0
|
|
dec si
|
|
ENDIF
|
|
sub bx,di
|
|
jl lbl1
|
|
IF lbl2 EQ @@l0
|
|
dec si
|
|
ENDIF
|
|
sub bx,di
|
|
jl lbl2
|
|
IF lbl3 EQ @@l0
|
|
dec si
|
|
ENDIF
|
|
sub bx,di
|
|
jl lbl3
|
|
IF lbl4 EQ @@l0
|
|
dec si
|
|
ENDIF
|
|
sub bx,di
|
|
jl lbl4
|
|
IF lbl5 EQ @@l0
|
|
dec si
|
|
ENDIF
|
|
sub bx,di
|
|
jl lbl5
|
|
IF lbl6 EQ @@l0
|
|
dec si
|
|
ENDIF
|
|
sub bx,di
|
|
jl lbl6
|
|
IF lbl7 EQ @@l0
|
|
dec si
|
|
ENDIF
|
|
sub bx,di
|
|
jl lbl7
|
|
IF lbl0 EQ @@l0
|
|
dec si
|
|
ENDIF
|
|
sub bx,di
|
|
jl l1
|
|
jmp l2
|
|
ENDM
|
|
@@l7: llinemacro 10000000b,@@l0,@@l1,@@l2,@@l3,@@l4,@@l5,@@l6,@@l7
|
|
@@l6: llinemacro 01000000b,@@l7,@@l0,@@l1,@@l2,@@l3,@@l4,@@l5,@@l6
|
|
@@l5: llinemacro 00100000b,@@l6,@@l7,@@l0,@@l1,@@l2,@@l3,@@l4,@@l5
|
|
@@l4: llinemacro 00010000b,@@l5,@@l6,@@l7,@@l0,@@l1,@@l2,@@l3,@@l4
|
|
@@l3: llinemacro 00001000b,@@l4,@@l5,@@l6,@@l7,@@l0,@@l1,@@l2,@@l3
|
|
@@l2: llinemacro 00000100b,@@l3,@@l4,@@l5,@@l6,@@l7,@@l0,@@l1,@@l2
|
|
@@l1: llinemacro 00000010b,@@l2,@@l3,@@l4,@@l5,@@l6,@@l7,@@l0,@@l1
|
|
@@l0: llinemacro 00000001b,@@l1,@@l2,@@l3,@@l4,@@l5,@@l6,@@l7,@@l0
|
|
@@r: ;=============== right
|
|
sub dx,ax
|
|
mov bx,di
|
|
shr bx,1
|
|
neg bx
|
|
jmp cs:_roffs[ebp*2]
|
|
ALIGN 16
|
|
_roffs LABEL WORD
|
|
dw OFFSET @@r7
|
|
dw OFFSET @@r6
|
|
dw OFFSET @@r5
|
|
dw OFFSET @@r4
|
|
dw OFFSET @@r3
|
|
dw OFFSET @@r2
|
|
dw OFFSET @@r1
|
|
dw OFFSET @@r0
|
|
rlinemacro MACRO mask,lbl1,lbl2,lbl3,lbl4,lbl5,lbl6,lbl7,lbl0
|
|
local l1,l2
|
|
;ds:si=startpoint
|
|
;di=ycnt
|
|
;dx=xcnt
|
|
;bx=counter
|
|
l1: xor byte ptr ds:[si],mask
|
|
add si,40
|
|
dec cx
|
|
jz @@0
|
|
add bx,dx
|
|
jl l1
|
|
l2: IF lbl1 EQ @@r7
|
|
inc si
|
|
ENDIF
|
|
sub bx,di
|
|
jl lbl1
|
|
IF lbl2 EQ @@r7
|
|
inc si
|
|
ENDIF
|
|
sub bx,di
|
|
jl lbl2
|
|
IF lbl3 EQ @@r7
|
|
inc si
|
|
ENDIF
|
|
sub bx,di
|
|
jl lbl3
|
|
IF lbl4 EQ @@r7
|
|
inc si
|
|
ENDIF
|
|
sub bx,di
|
|
jl lbl4
|
|
IF lbl5 EQ @@r7
|
|
inc si
|
|
ENDIF
|
|
sub bx,di
|
|
jl lbl5
|
|
IF lbl6 EQ @@r7
|
|
inc si
|
|
ENDIF
|
|
sub bx,di
|
|
jl lbl6
|
|
IF lbl7 EQ @@r7
|
|
inc si
|
|
ENDIF
|
|
sub bx,di
|
|
jl lbl7
|
|
IF lbl0 EQ @@r7
|
|
inc si
|
|
ENDIF
|
|
sub bx,di
|
|
jl l1
|
|
jmp l2
|
|
ENDM
|
|
@@r7: rlinemacro 10000000b,@@r6,@@r5,@@r4,@@r3,@@r2,@@r1,@@r0,@@r7
|
|
@@r6: rlinemacro 01000000b,@@r5,@@r4,@@r3,@@r2,@@r1,@@r0,@@r7,@@r6
|
|
@@r5: rlinemacro 00100000b,@@r4,@@r3,@@r2,@@r1,@@r0,@@r7,@@r6,@@r5
|
|
@@r4: rlinemacro 00010000b,@@r3,@@r2,@@r1,@@r0,@@r7,@@r6,@@r5,@@r4
|
|
@@r3: rlinemacro 00001000b,@@r2,@@r1,@@r0,@@r7,@@r6,@@r5,@@r4,@@r3
|
|
@@r2: rlinemacro 00000100b,@@r1,@@r0,@@r7,@@r6,@@r5,@@r4,@@r3,@@r2
|
|
@@r1: rlinemacro 00000010b,@@r0,@@r7,@@r6,@@r5,@@r4,@@r3,@@r2,@@r1
|
|
@@r0: rlinemacro 00000001b,@@r7,@@r6,@@r5,@@r4,@@r3,@@r2,@@r1,@@r0
|
|
@@0: pop bp
|
|
pop di
|
|
pop si
|
|
ret
|
|
drawline ENDP
|
|
|
|
PUBLIC _asmbox
|
|
_asmbox PROC FAR
|
|
push bp
|
|
mov bp,sp
|
|
push si
|
|
push di
|
|
push ds
|
|
|
|
mov eax,[bp+6]
|
|
mov dword ptr cs:polyixy[0],eax
|
|
mov eax,[bp+10]
|
|
mov dword ptr cs:polyixy[4],eax
|
|
mov eax,[bp+14]
|
|
mov dword ptr cs:polyixy[8],eax
|
|
mov eax,[bp+18]
|
|
mov dword ptr cs:polyixy[12],eax
|
|
mov cs:polyisides,4
|
|
call clipanypoly
|
|
|
|
mov ds,cs:_vbufseg
|
|
mov si,OFFSET polyxy
|
|
mov di,cs:polysides
|
|
or di,di
|
|
jz @@0
|
|
dec di
|
|
jz @@2
|
|
|
|
@@1: mov ax,cs:[si+0]
|
|
mov bx,cs:[si+2]
|
|
mov dx,cs:[si+4]
|
|
mov cx,cs:[si+6]
|
|
call drawline
|
|
add si,4
|
|
dec di
|
|
jnz @@1
|
|
|
|
@@2: mov ax,cs:[si+0]
|
|
mov bx,cs:[si+2]
|
|
mov dx,cs:polyxy[0]
|
|
mov cx,cs:polyxy[2]
|
|
call drawline
|
|
|
|
@@0: pop ds
|
|
pop di
|
|
pop si
|
|
pop bp
|
|
ret
|
|
_asmbox ENDP
|
|
|
|
;################################################################
|
|
|
|
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)
|
|
|
|
pal2 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
|
|
|
|
pal1 LABEL WORD
|
|
db 30,30*8/9,30
|
|
db 60,60*8/9,60
|
|
db 50,50*8/9,50
|
|
db 40,40*8/9,40
|
|
db 30,30*8/9,30
|
|
db 20,20*8/9,20
|
|
db 10,10*8/9,10
|
|
db 0, 0*8/9, 0
|
|
db 30,30*8/9,30
|
|
db 60,60*8/9,60
|
|
db 50,50*8/9,50
|
|
db 40,40*8/9,40
|
|
db 30,30*8/9,30
|
|
db 20,20*8/9,20
|
|
db 10,10*8/9,10
|
|
db 0, 0*8/9, 0
|
|
|
|
sinuspower db 0
|
|
powercnt db 0
|
|
PUBLIC _power0
|
|
_power0 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 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
|
|
|
|
outpal PROC NEAR
|
|
mov dx,3c8h
|
|
out dx,al
|
|
mov ax,cs
|
|
mov ds,ax
|
|
inc dx
|
|
REPOUTSB
|
|
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 211
|
|
overx dw 0
|
|
overya dw 0
|
|
patdir dw 0
|
|
|
|
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
|
|
|
|
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 si,cs:palanimc
|
|
add si,OFFSET pal1
|
|
xor al,al
|
|
mov cx,8*3
|
|
call outpal
|
|
mov si,cs:palanimc
|
|
add si,OFFSET pal2
|
|
mov al,8
|
|
mov cx,8*3
|
|
call outpal
|
|
|
|
PLANE 8
|
|
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:
|
|
;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
|
|
|
|
shl bx,1
|
|
mov ax,cs:_sin1024[bx]
|
|
sar ax,2
|
|
add ax,160
|
|
mov cs:scrnx,ax
|
|
add bx,256*2
|
|
and bx,1024*2-1
|
|
mov ax,cs:_sin1024[bx]
|
|
sar ax,2
|
|
add ax,100
|
|
mov cs:scrny,ax
|
|
|
|
mov bx,cs:overrot
|
|
add bx,7
|
|
and bx,1023
|
|
mov cs:overrot,bx
|
|
|
|
shl bx,1
|
|
mov ax,cs:_sin1024[bx]
|
|
sar ax,2
|
|
add ax,160
|
|
mov cs:overx,ax
|
|
add bx,256*2
|
|
and bx,1024*2-1
|
|
mov ax,cs:_sin1024[bx]
|
|
sar ax,2
|
|
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,70*5
|
|
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,70*13
|
|
;je @@xx
|
|
mov ax,0
|
|
mov bx,9
|
|
int 0fch
|
|
cmp ax,925
|
|
jae @@xx
|
|
mov bx,2
|
|
int 0fch
|
|
or ax,ax
|
|
jz @@aga
|
|
@@xx: ret
|
|
do_interference ENDP
|
|
|
|
PUBLIC _initinterference
|
|
_initinterference PROC FAR
|
|
push bp
|
|
mov bp,sp
|
|
push si
|
|
push di
|
|
push ds
|
|
|
|
; call resetmode13
|
|
|
|
;@@wm1: mov bx,2
|
|
; int 0fch
|
|
; or ax,ax
|
|
; jnz @@xit
|
|
; mov bx,6
|
|
; mov ax,0f1h
|
|
; int 0fch
|
|
; cmp ax,0f1h
|
|
; jne @@wm1
|
|
|
|
call init_interference
|
|
|
|
pop ds
|
|
pop di
|
|
pop si
|
|
pop bp
|
|
ret
|
|
_initinterference ENDP
|
|
|
|
PUBLIC _dointerference
|
|
_dointerference PROC FAR
|
|
push bp
|
|
mov bp,sp
|
|
push si
|
|
push di
|
|
push ds
|
|
|
|
call do_interference
|
|
|
|
mov es,cs:memseg
|
|
mov ah,49h
|
|
int 21h
|
|
|
|
pop ds
|
|
pop di
|
|
pop si
|
|
pop bp
|
|
ret
|
|
_dointerference ENDP
|
|
|
|
PUBLIC _inittwk
|
|
_inittwk PROC FAR
|
|
push bp
|
|
mov bp,sp
|
|
push si
|
|
push di
|
|
push ds
|
|
;clear palette
|
|
mov dx,3c8h
|
|
xor al,al
|
|
out dx,al
|
|
inc dx
|
|
mov cx,768
|
|
@@1: out dx,al
|
|
loop @@1
|
|
;400 rows
|
|
mov dx,3d4h
|
|
mov ax,00009h
|
|
out dx,ax
|
|
;tweak
|
|
mov dx,3d4h
|
|
mov ax,00014h
|
|
out dx,ax
|
|
mov ax,0e317h
|
|
out dx,ax
|
|
mov dx,3c4h
|
|
mov ax,0604h
|
|
out dx,ax
|
|
;
|
|
mov dx,3c4h
|
|
mov ax,0f02h
|
|
out dx,ax
|
|
mov ax,0a000h
|
|
mov es,ax
|
|
xor di,di
|
|
mov cx,32768
|
|
xor ax,ax
|
|
rep stosw
|
|
;
|
|
pop ds
|
|
pop di
|
|
pop si
|
|
pop bp
|
|
ret
|
|
_inittwk ENDP
|
|
|
|
PUBLIC _lineblit
|
|
_lineblit PROC FAR
|
|
push bp
|
|
mov bp,sp
|
|
push si
|
|
push di
|
|
push ds
|
|
mov di,[bp+6]
|
|
mov es,[bp+8]
|
|
mov si,[bp+10]
|
|
mov ds,[bp+12]
|
|
zpl=0
|
|
REPT 4
|
|
mov dx,3c4h
|
|
mov ax,02h+(100h shl zpl)
|
|
out dx,ax
|
|
zzz=0
|
|
REPT 80/2
|
|
mov al,ds:[si+(zzz+0)*4+zpl]
|
|
mov ah,ds:[si+(zzz+1)*4+zpl]
|
|
mov es:[di+zzz],ax
|
|
zzz=zzz+2
|
|
ENDM
|
|
zpl=zpl+1
|
|
ENDM
|
|
pop ds
|
|
pop di
|
|
pop si
|
|
pop bp
|
|
ret
|
|
_lineblit ENDP
|
|
|
|
PUBLIC _setpalarea
|
|
_setpalarea PROC FAR
|
|
push bp
|
|
mov bp,sp
|
|
push si
|
|
push di
|
|
push ds
|
|
mov si,[bp+6]
|
|
mov ds,[bp+8]
|
|
mov ax,[bp+10]
|
|
mov dx,3c8h
|
|
out dx,al
|
|
inc dx
|
|
mov cx,[bp+12]
|
|
shl cx,1
|
|
add cx,ax
|
|
REPOUTSB
|
|
pop ds
|
|
pop di
|
|
pop si
|
|
pop bp
|
|
ret
|
|
_setpalarea ENDP
|
|
|
|
code ENDS
|
|
END
|
|
|