803 lines
10 KiB
NASM
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
|