SecondReality/DDSTARS/STARS.ASM
2017-09-24 01:45:36 +02:00

803 lines
10 KiB
NASM

;included to koe.asm
.386
include polyega.asm
STARS equ 512
STARS2 equ 1024
starvram dw 0a000h
emmhandle dw 0
emmseg dw 0
emmpage4 dw 0
starlimit dw 0
startxtopen dw 0
startxtclose dw 0
startxtp0 dw 0
starframe dw 0
starpalfade db 0,0
_nostar1 dw 200
_nostar2 dw 199
rows1 dw 200 dup(0)
rows dw 400 dup(0)
star dw STARS2 dup(0,0,0,0)
muldivx dw 256 dup(0)
muldivy dw 256 dup(0)
ALIGN 2
seed dd 0 ;12345678h
random PROC NEAR
push edx
mov eax,0343fdh
mul cs:seed
add eax,269ec3h
mov cs:seed,eax
mov ax,dx
pop edx
ret
random ENDP
setborder PROC NEAR
push ax
mov dx,3dah
in al,dx
mov dx,3c0h
mov al,11h+20h
out dx,al
pop ax
out dx,al
ret
setborder ENDP
init_stars 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,20h
out dx,al
mov dx,3d4h
mov al,9
out dx,al
inc dx
in al,dx
and al,127
out dx,al
mov ax,0a000h
mov es,ax
xor di,di
mov cx,32768
xor ax,ax
rep stosw
mov ah,43h
mov bx,32*2
int 67h
or ah,ah
jz @@1
mov ax,4c00h
int 21h
@@1: mov cs:emmhandle,dx
mov ah,41h
int 67h
mov cs:emmseg,bx
call clearsbu
mov cx,200
mov ax,0
mov dx,320/8
mov bx,OFFSET rows1
@@4: mov cs:[bx],ax
add ax,dx
add bx,2
loop @@4
mov cx,400
mov ax,0
mov dx,320/8
mov bx,OFFSET rows
@@4b: mov cs:[bx],ax
add ax,dx
add bx,2
loop @@4b
mov ax,cs
mov es,ax
mov di,OFFSET star
mov cx,STARS2
@@3: mov al,cl
dec al
xor ah,ah
stosw
call random
and ax,1023
sub ax,512
stosw
call random
and ax,1023
sub ax,512
stosw
xor ax,ax
stosw
loop @@3
mov di,OFFSET muldivy
mov cx,256
mov bp,150
@@2b: mov dx,108
xor ax,ax
div bp
shr ax,1
stosw
add bp,4
loop @@2b
mov di,OFFSET muldivx
mov cx,256
mov bp,150
@@2c: mov dx,144
xor ax,ax
div bp
shr ax,1
stosw
add bp,4
loop @@2c
mov cs:starlimit,STARS
mov cs:starpalfade,0
mov cs:startxtopen,-9999
mov cs:startxtclose,10000
mov cx,100
@@sa: push cx
call starfetch0
call staradd
pop cx
loop @@sa
ret
init_stars ENDP
deinit_stars PROC NEAR
mov ah,45h
mov dx,cs:emmhandle
int 67h
ret
deinit_stars ENDP
fetch4ax PROC NEAR
shl ax,1
mov bx,ax
push ax
mov ax,4400h
shr bx,2
mov dx,cs:emmhandle
int 67h
pop ax
and ax,3
shl ax,12-4
add ax,cs:emmseg
ret
fetch4ax ENDP
fetch4ax2 PROC NEAR
shl ax,1
mov bx,ax
push ax
mov ax,4401h
shr bx,2
mov dx,cs:emmhandle
int 67h
pop ax
and ax,3
shl ax,12-4
add ax,cs:emmseg
add ax,400h
ret
fetch4ax2 ENDP
fetch4ax3 PROC NEAR
shl ax,1
mov bx,ax
push ax
mov ax,4402h
shr bx,2
mov dx,cs:emmhandle
int 67h
pop ax
and ax,3
shl ax,12-4
add ax,cs:emmseg
add ax,800h
ret
fetch4ax3 ENDP
clearsbu PROC NEAR
mov cx,128
mov ax,0
@@1: push cx
push ax
call fetch4ax
mov es,ax
mov cx,4096/4*2
xor eax,eax
xor di,di
rep stosd
pop ax
pop cx
inc ax
loop @@1
ret
clearsbu ENDP
starfetch0 PROC NEAR
mov ax,cs:emmpage4
inc ax
and ax,63
mov cs:emmpage4,ax
call fetch4ax
mov es,ax
ret
starfetch0 ENDP
starfetch1 PROC NEAR
mov ax,cs:emmpage4
add ax,17
and ax,63
call fetch4ax2
mov fs,ax
ret
starfetch1 ENDP
starfetch2 PROC NEAR
mov ax,cs:emmpage4
add ax,43
and ax,63
call fetch4ax3
mov gs,ax
ret
starfetch2 ENDP
staradd PROC NEAR
mov ax,cs
mov ds,ax
mov ax,ds:starlimit
or ax,ax
jz @@11
dec ax
mov ds:starlimit,ax
@@11: mov bp,STARS
mov si,OFFSET star
@@1: movzx bx,ds:[si]
sub bl,2
mov ds:[si],bl
jc @@4
cmp bp,cs:starlimit
jb @@2
shl bx,1
mov ax,ds:[si+4]
imul ds:muldivy[bx]
shld dx,ax,2
add dx,100
cmp dx,99
ja @@2
mov cx,dx
mov ax,ds:[si+2]
imul ds:muldivx[bx]
mov bx,cx
shld dx,ax,2
add dx,160
cmp dx,319
ja @@2
mov cl,dl
and cl,7
shr dx,3
shl bx,1
mov bx,ds:rows1[bx]
add bx,dx
mov ch,80h
shr ch,cl
mov cl,ds:[si]
cmp cl,180
jb @@sc1
or byte ptr es:[bx],ch
jmp @@2
@@sc1: cmp cl,110
jb @@sc2
or byte ptr es:[bx+4096],ch
jmp @@2
@@sc2: or byte ptr es:[bx],ch
or byte ptr es:[bx+4096],ch
@@2: add si,8
dec bp
jnz @@1
ret
@@4: call random
and ax,1023
sub ax,512
mov cs:[si+2],ax
call random
and ax,1023
sub ax,512
mov cs:[si+4],ax
jmp @@2
staradd ENDP
staradd2 PROC NEAR
call starfetch1
mov ax,cs
mov ds,ax
mov ax,ds:starlimit
or ax,ax
jz @@11
sub ax,4
mov ds:starlimit,ax
@@11: mov bp,STARS2
mov si,OFFSET star
@@1: movzx bx,ds:[si]
sub bl,2
mov ds:[si],bl
jc @@4
cmp bp,cs:starlimit
jb @@2
shl bx,1
mov ax,ds:[si+4]
imul ds:muldivy[bx]
shld dx,ax,2
add dx,100
cmp dx,99
ja @@2
mov cx,dx
mov ax,ds:[si+2]
imul ds:muldivx[bx]
mov bx,cx
shld dx,ax,2
add dx,160
cmp dx,319
ja @@2
mov cl,dl
and cl,7
shr dx,3
shl bx,1
mov bx,ds:rows1[bx]
add bx,dx
mov ch,80h
shr ch,cl
mov cl,ds:[si]
cmp cl,180
jb @@sc1
or byte ptr es:[bx],ch
or byte ptr fs:[bx],ch
jmp @@2
@@sc1: cmp cl,110
jb @@sc2
or byte ptr es:[bx+4096],ch
or byte ptr fs:[bx+4096],ch
jmp @@2
@@sc2: or byte ptr es:[bx],ch
or byte ptr es:[bx+4096],ch
or byte ptr fs:[bx],ch
or byte ptr fs:[bx+4096],ch
@@2: add si,8
dec bp
jnz @@1
ret
@@4: call random
and ax,1023
sub ax,512
mov cs:[si+2],ax
call random
and ax,1023
sub ax,512
mov cs:[si+4],ax
jmp @@2
staradd2 ENDP
risetext PROC NEAR
mov ax,cs:startxtopen
cmp ax,99
jge @@12
inc ax
mov cs:startxtopen,ax
@@12: mov dx,cs:startxtclose
cmp dx,0
jle @@21
dec dx
mov cs:startxtclose,dx
@@21: cmp dx,ax
jge @@22
mov ax,dx
@@22: ;ax=startxtuse
cmp ax,0
jg @@tcc
jmp @@tc0
@@tcc: cmp ax,1
jg @@tnz
mov ax,2
@@tnz: push ax
mov di,150
sub di,ax
mov cs:_nostar2,ax
mov ax,80
mul di
mov di,ax
mov cs:_nostar1,di
mov ax,SEG _textpic
mov ds,ax
mov si,040h
add si,cs:startxtp0
pop cx
dec cx
sub di,40
mov dx,3c4h
mov ax,0f02h
out dx,ax
xor eax,eax
zzz=0
REPT 40/4
mov es:[di+zzz],eax
zzz=zzz+4
ENDM
add di,80
dec cx
jz @@tc0c
mov dx,3c4h
mov ax,0f02h
out dx,ax
mov eax,0
zzz=0
REPT 40/4
mov es:[di+zzz],eax
zzz=zzz+4
ENDM
add di,80
dec cx
jz @@tc0
dec cx
jz @@tc0b
mov dx,3ceh
mov ax,0400h
out dx,ax
mov ax,01h+400h+800h
out dx,ax
@@tc1: mov dx,3c4h
mov ax,0102h+400h+800h
out dx,ax
zzz=0
REPT 40/4
mov eax,ds:[si+zzz]
mov es:[di+zzz],eax
zzz=zzz+4
ENDM
add si,40
mov dx,3c4h
mov ax,0202h+400h+800h
out dx,ax
zzz=0
REPT 40/4
mov eax,ds:[si+zzz]
mov es:[di+zzz],eax
zzz=zzz+4
ENDM
add si,40
add di,80
dec cx
jz @@tc0b
jmp @@tc1
@@tc0b: mov dx,3ceh
mov ax,0001h
out dx,ax
mov dx,3c4h
mov ax,0f02h
out dx,ax
mov eax,0
zzz=0
REPT 40/4
mov es:[di+zzz],eax
zzz=zzz+4
ENDM
add di,80
dec di
mov cs:_nostar2,di
@@tc0: ret
@@tc0c: mov dx,3c4h
mov ax,0f02h
out dx,ax
xor eax,eax
zzz=0
REPT 80/4
mov es:[di+zzz],eax
zzz=zzz+4
ENDM
ret
risetext ENDP
do_stars PROC NEAR
@@aga: mov al,0
;call setborder
mov dx,3d4h
mov ax,cs:starvram
cmp ax,0a000h
je @@sw1
mov cs:starvram,0a000h
mov ax,400ch
jmp @@sw0
@@sw1: mov cs:starvram,0a400h
mov ax,000ch
@@sw0: out dx,ax
call waitb
mov al,1
;call setborder
cmp cs:starpalfade,32
ja @@p1
mov bl,cs:starpalfade
inc bl
mov cs:starpalfade,bl
shl bl,3
jnc @@p2
mov bl,255
@@p2:
mov dx,3c8h
xor al,al
out dx,al
inc dx
mov al,0
out dx,al
mov al,0
out dx,al
mov al,0
out dx,al
mov al,25*70/100
mul bl
mov al,ah
out dx,al
mov al,31*70/100
mul bl
mov al,ah
out dx,al
mov al,38*70/100
mul bl
mov al,ah
out dx,al
mov al,45*56/100
mul bl
mov al,ah
out dx,al
mov al,58*56/100
mul bl
mov al,ah
out dx,al
mov al,69*56/100
mul bl
mov al,ah
out dx,al
mov al,67*64/100
mul bl
mov al,ah
out dx,al
mov al,84*64/100
mul bl
mov al,ah
out dx,al
mov al,99*64/100
mul bl
mov al,ah
out dx,al
;-----
mov al,0
out dx,al
mov al,0
out dx,al
mov al,0
out dx,al
mov al,10
out dx,al
mov al,20
out dx,al
mov al,35
out dx,al
mov al,20
out dx,al
mov al,30
out dx,al
mov al,45
out dx,al
mov al,30
out dx,al
mov al,40
out dx,al
mov al,60
out dx,al
@@p1:
mov ax,cs:starframe
inc ax
mov cs:starframe,ax
cmp ax,1200
jne @@st1
mov cs:startxtp0,80
mov cs:startxtopen,-256
mov cs:startxtclose,1500
@@st1: cmp ax,3200
jne @@st2
mov cs:startxtp0,101*80
mov cs:startxtopen,-256
mov cs:startxtclose,1500
@@st2: cmp ax,1500
jne @@st3
mov cs:starlimit,STARS2
@@st3:
call risetext
call starfetch0
cmp cs:starframe,1200
ja @@stz
cmp cs:starframe,900
ja @@stz0
call staradd
jmp @@stz0
@@stz: call staradd2
;mov al,1
;call setborder
@@stz0:
mov ax,es
mov ds,ax
mov ax,cs:starvram
mov es,ax
xor di,di
mov dx,3c4h
mov ax,0102h
out dx,ax
mov si,0
mov cx,100
@@3: zzz=0
; cmp di,cs:_nostar1
; jl @@3g
; cmp di,cs:_nostar2
; jg @@3g
; jmp @@3s
@@3g: REPT 40/4
mov eax,ds:[si+zzz]
mov es:[di+zzz],eax
zzz=zzz+4
ENDM
@@3s: add si,40
add di,80
loop @@3
xor di,di
mov si,4096
mov dx,3c4h
mov ax,0202h
out dx,ax
mov cx,100
@@7: zzz=0
; cmp di,cs:_nostar1
; jl @@7g
; cmp di,cs:_nostar2
; jg @@7g
; jmp @@7s
@@7g: REPT 40/4
mov eax,ds:[si+zzz]
mov es:[di+zzz],eax
zzz=zzz+4
ENDM
@@7s: add si,40
add di,80
loop @@7
mov ax,cs:emmpage4
add ax,32
and ax,63
call fetch4ax
mov ds,ax
mov di,200*40
mov si,99*40
mov dx,3c4h
mov ax,0102h
out dx,ax
mov cx,100
@@5: zzz=0
; cmp di,cs:_nostar1
; jl @@5g
; cmp di,cs:_nostar2
; jg @@5g
; jmp @@5s
@@5g: REPT 40/4
mov eax,ds:[si+zzz]
mov es:[di+zzz],eax
zzz=zzz+4
ENDM
@@5s: sub si,40
add di,80
loop @@5
mov di,200*40
mov si,99*40+4096
mov dx,3c4h
mov ax,0202h
out dx,ax
mov cx,100
@@8: zzz=0
; cmp di,cs:_nostar1
; jl @@8g
; cmp di,cs:_nostar2
; jg @@8g
; jmp @@8s
@@8g: REPT 40/4
mov eax,ds:[si+zzz]
mov es:[di+zzz],eax
zzz=zzz+4
ENDM
@@8s: sub si,40
add di,80
loop @@8
mov bx,2
int 0fch
or ax,ax
jz @@aga
ret
mov ax,0a000h
mov ds,ax
xor si,si
mov cx,40*400
mov dx,0
@@1: lodsb
shl al,1
adc dx,0
shl al,1
adc dx,0
shl al,1
adc dx,0
shl al,1
adc dx,0
shl al,1
adc dx,0
shl al,1
adc dx,0
shl al,1
adc dx,0
shl al,1
adc dx,0
loop @@1
int 3
ret
do_stars ENDP