home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DP Tool Club 15
/
CD_ASCQ_15_070894.iso
/
news
/
sorcpak
/
stmik020
/
demo.asm
< prev
next >
Wrap
Assembly Source File
|
1991-07-14
|
12KB
|
720 lines
;demo routines
demoframe PROC NEAR
setborder 0
mov dx,3dah
dwait: in al,dx
test al,8
jz dwait
call scrollborder
call canner ;color animation
sti
setborder 52
mov ax,4
call stmik_asm ;poll music player
setborder 1
call scroll
call enablekeyboard
setborder 9
call logofader
setborder 1
call writer
cmp cs:equson,0
je noequs
setborder 1
call equs
noequs: setborder 15
call starfield
setborder 1
call disablekeyboard ;just to avoid overactive users to 'crash' the demo
setborder 0
ret
demoframe ENDP
demobackground PROC NEAR
ret
;set 4 bitplane latch trasfer mode
mov dx,3ceh
mov ax,4105h
out dx,ax
mov dx,3
mov dx,3c4h
mov ax,0f02h
out dx,ax
;do nothing :-)
;clear latch trasfer mode
mov dx,3ceh
mov ax,4005h
out dx,ax
ret
demobackground ENDP
demointti PROC NEAR
;called every other frame by rasterinterrupt, must save all but AX
push es
pop es
ret
demointti ENDP
fixword
stx dw 32 dup(-1,-1) ;x
sty dw 32 dup(-1,-1) ;y
stm db 32 dup(0,0,0,0) ;misc: color,maxcol/speed,processed,0
stox1 dw ?
stoy1 dw ?
stox2 dw ?
stoy2 dw ?
srot dw 64
bordercnt dw ?
starfield PROC NEAR
mov ax,cs
mov ds,ax
mov es,ds:vram
;calc 'rotating' center
mov cx,cs:drunkenstars
mov ax,ds:srot
sine
imul cx
mov ax,dx
add ax,160
mov ds:stox1,ax
sub ax,(320-256)/2
mov ds:stox2,ax
mov ax,ds:srot
cosine
imul cx
mov ax,dx
add ax,100
mov ds:stoy1,ax
sub ax,(200-128)/2
mov ds:stoy2,ax
inc ds:srot
and ds:srot,255
;do stars
mov cx,stars
xor si,si
sf01: mov cs:stm[si+2],0
add si,4
loop sf01
mov cs:bordercnt,0
mov cx,stars
mov bp,0
xor si,si
call starfield2
sf02: setborder 0
call getrasterline
cmp ax,160
jb sf02
mov cx,stars
mov bp,1
xor si,si
setborder 15
call starfield2
ret
starfield ENDP
starfield2 PROC NEAR
sf1: push cx
cmp ds:stm[si+2],0
je sf14
jmp sf3
sf14:
mov dx,ds:stx[si+2]
cmp dx,-1
jne sf5
;add new
call rand
and ax,127
mov dx,ax
call rand
and ax,127
add dx,ax
add dx,(320-256)/2
mov ds:stx[si+2],dx
call rand
and ax,63
mov dx,ax
call rand
and ax,63
add dx,ax
add dx,(200-128)/2
mov ds:sty[si+2],dx
call rand
and al,15
add al,128+64
mov ds:stm[si+1],al
mov al,128+64+31
mov ds:stm[si],al
mov dx,ds:stx[si+2]
mov bx,ds:sty[si+2]
jmp sf2
sf5: ;undraw old
mov bx,ds:sty[si+2]
sf2: cmp bp,1
je sf12
cmp bx,70
jnb sf11
sf13: jmp sf3
sf12: cmp bx,70
jnb sf13
sf11: mov ds:stm[si+2],1
call ospget
cmp al,128+64
jb sf4
cmp al,128+64+31
ja sf4
mov dx,ds:stx[si+2]
mov bx,ds:sty[si+2]
xor al,al
call ospset
sf4: ;move
mov ah,128+63
sub ah,ds:stm[si+1]
add ah,32
xor al,al
mov cl,2
shr ax,cl
mov cx,ax
mov ax,ds:stx[si+2]
sub ax,ds:stox1
imul cx
add ds:stx[si],ax
adc ds:stx[si+2],dx
mov ax,ds:sty[si+2]
sub ax,ds:stoy1
imul cx
add ds:sty[si],ax
adc ds:sty[si+2],dx
;redraw new/check for overflow
mov dx,ds:stx[si+2]
cmp dx,320
jb sf9
sf10: mov ds:stx[si+2],-1
jmp sf3
sf9: mov bx,ds:sty[si+2]
cmp bx,199
ja sf10
call spget
cmp al,0
jne sf3
mov dx,ds:stx[si+2]
mov bx,ds:sty[si+2]
mov al,ds:stm[si]
cmp al,ds:stm[si+1]
jna sf7
dec al
sf7: mov ds:stm[si],al
call spset
sf3: pop cx
add si,4
loop sf1x
ret
sf1x: jmp sf1
starfield2 ENDP
tmpcol db 0
tmprow dw 1
scrollmacro1 MACRO
mov al,es:[si]
mov es:[di],al
mov es:[di-(1280-640)/4],al
;mov al,es:[si+1]
;mov es:[di+1],al
;mov es:[di-(1280-640)/4+1],al
ENDM
scrollmacro2 MACRO
mov al,es:[si]
mov es:[di],al
;mov al,es:[si+1]
;mov es:[di+1],al
ENDM
;create one 'sprite'-line of the font
scrollmacro MACRO submac
local l1,l2,l3,l4,l5,l6,l7
mov bx,cs:charbodypos
mov ax,cs:charpos
mov dx,cs:charwidth
cmp ax,dx
jb l3
mov bx,cs:chartpos
mov al,cs:chartext[bx]
cmp al,1
jne l6
mov cs:wrmark,1
mov cs:oktofade,1
inc bx
jmp l7
l6: or al,al
jnz l4
xor bx,bx
l7: mov al,cs:chartext[bx]
l4: inc bx
mov cs:chartpos,bx
mov bl,al
xor bh,bh
shl bx,1
shl bx,1
mov ax,cs:fontpos[bx+2]
shr ax,1
shr ax,1
mov cs:charwidth,ax
mov ax,cs:fontpos[bx]
mov cs:charbodypos,ax
mov bx,ax
mov dl,cs:[bx]
xor ax,ax
l3: cmp bx,spacepos
je l5
add bx,ax
l5: inc ax
mov cs:charpos,ax
mov si,bx
mov dx,1280/4
mov cx,64
l1: submac
add si,dx
add di,dx
loop l1
ENDM
wrmark db 0
oktofade db 0
chartpos dw 0
; db "FONTTEST! "
; db "ABCDEFGHIJKLMNOPQRSTUVWXYZ!?:;., "
spacepos equ 80
fontpos LABEL WORD
dw 32 dup(0,0)
dw spacepos,32 ;space
dw (80*1+320*72)+16*1,28 ; !
dw 0,0
dw (80*3+320*64)+16*4-2,8 ; #
dw 8 dup(0,0)
dw (80*1+320*72)+8*7,16 ; ,
dw 0,0
dw (80*1+320*72)+8*8,16 ; .
dw 0,0
dw 10 dup(0,0)
dw (80*1+320*72)+8*6,16 ; :
dw (80*1+320*72)+8*9,16 ; ;
dw 0,0
dw (80*3+320*64)+16*5-8,8 ; =
dw 0,0
dw (80*1+320*72)+16*0+3,48 ; ?
dw 0,0 ;@
;A..Z
dw (80*3+320*0)+16*0,48
dw (80*3+320*0)+16*1,48
dw (80*3+320*0)+16*2,48
dw (80*3+320*0)+16*3,48
dw (80*3+320*0)+16*4,48
dw (80*3+320*64)+16*0,48
dw (80*3+320*64)+16*1,48
dw (80*3+320*64)+16*2,48
dw (80*3+320*64)+16*3,16
dw (80*3+320*64)+16*4,20
dw (80*3+320*128)+16*0,44
dw (80*3+320*128)+16*1,16
dw (80*3+320*128)+16*2,64
dw (80*3+320*128)+16*3,44
dw (80*3+320*128)+16*4,48
dw (80*2+320*0)+16*0,48
dw (80*2+320*0)+16*1,48
dw (80*2+320*0)+16*2,48
dw (80*2+320*0)+16*3,48
dw (80*2+320*0)+16*4,48
dw (80*2+320*64)+16*0,48
dw (80*2+320*64)+16*1,48
dw (80*2+320*64)+16*2,48
dw (80*2+320*64)+16*3,60
dw (80*2+320*64)+16*4,48
dw (80*1+320*72)+16*2,48
charbodypos dw spacepos
charpos dw 0
charwidth dw 0
scrollborder PROC NEAR
;called in border for smooth scrolling
;set smooth pixel pan
mov dx,3dah
in al,dx
mov dx,3c0h
mov al,13h
out dx,al
mov al,byte ptr cs:winxpos
and al,3
shl al,1
out dx,al
mov al,32
out dx,al
ret
scrollborder ENDP
srcount dw 0
scroll PROC NEAR
mov es,cs:vram
;set subwindow position
mov ax,cs:winxpos
mov cs:owinxpos,ax
;change winxpos
add ax,3
cmp cs:alternatescroll,0
je scr1b
inc cs:srcount
inc ax
scr1b: add cs:srcount,3
cmp ax,1280-640
jb scr1
sub ax,1280-640
scr1: mov cs:winxpos,ax
cmp cs:srcount,4
jb src11
sub cs:srcount,4
jmp scr6
src11: jmp scr3
scr6: ;draw new stuff
jmp scr2
scr4x: jmp scr4
scr2:
;set 4 bitplane latch trasfer mode
mov dx,3ceh
mov ax,4105h
out dx,ax
mov dx,3
mov dx,3c4h
mov ax,0f02h
out dx,ax
mov si,320/4
mov di,1280/4*136+320/4
mov ax,cs:winxpos
shr ax,1
shr ax,1
add di,ax
cmp cs:winxpos,(1280-640-320)
jb scr4x
scrollmacro scrollmacro1
jmp scr5
scr4: scrollmacro scrollmacro2
scr5: ;clear latch trasfer mode
mov dx,3ceh
mov ax,4005h
out dx,ax
scr3: ;position screen
mov bx,1280/4*136
mov ax,cs:winxpos
shr ax,1
shr ax,1
add bx,ax
mov dx,03d4h
mov al,0ch
mov ah,bh
out dx,ax
mov al,0dh
mov ah,bl
out dx,ax
ret
scroll ENDP
cancnt dw 0
canner PROC NEAR
;update palette
cli
mov ax,cs
mov ds,ax
mov si,OFFSET palette+128*3
mov al,128
mov dx,3c8h
out dx,al
inc dx
mov cx,64*3/6
can1: lodsb
out dx,al
lodsb
out dx,al
lodsb
out dx,al
lodsb
out dx,al
lodsb
out dx,al
lodsb
out dx,al
loop can1
sti
;scroll colors
inc cs:cancnt
test cs:cancnt,7
jnz can2
mov ax,cs
mov ds,ax
mov es,ax
mov di,OFFSET palette+128*3
mov si,OFFSET palette+129*3
mov bx,ds:[di]
mov dl,ds:[di+2]
mov cx,63*3/2
rep movsw
movsb
mov ds:[di],bx
mov ds:[di+2],dl
;update writer fontcolor
dec cs:printcadd
and cs:printcadd,63
can2: ret
canner ENDP
fixword
wrwait dw 0
wrpos dw 0
wrx dw 16
wry dw 39
wrcnt dw 0
wrnum dw 20
wrcx dw 64*4 dup(0)
wrcy dw 64*4 dup(0)
wrcc db 64*4 dup(0,0)
wrcpnt dw 0
wrcpnt2 dw 12*4*2
writer PROC NEAR
inc cs:wrcnt
test cs:wrcnt,1
jz wr1x
jmp wr1
wr3x: jmp wr3
wr1x: cmp cs:wrwait,30000
jne wr3y
cmp cs:wrmark,1
jne wr5z
mov cs:wrmark,0
mov cs:wrwait,0
jmp wr3x
wr5z: mov cs:wrwait,30001
jmp wr3x
wr3y: cmp cs:wrwait,0
jne wr3x
mov bx,cs:wrpos
mov al,cs:wrtext[bx]
inc bx
cmp al,0
jne wr5
mov cs:wrpos,OFFSET wrtextinit-OFFSET wrtext
jmp wr3
wr5: mov cs:wrpos,bx
cmp al,13
jne wr2
add cs:wry,18
mov cs:wrx,16
wr2: cmp al,10
jne wr22
sub cs:wry,18
wr22: cmp al,3
jne wr9
mov cs:wrwait,30001
jmp wr3
wr9: cmp al,1
jne wr4
mov cs:wrx,16
mov cs:wry,39
mov cs:wrwait,256
jmp wr3
wr4: cmp al,2
jne wr6
xor dx,dx
wr62: mov al,ds:wrtext[bx]
cmp al,13
je wr61
call getfontwidth
add dx,ax
inc bx
jmp wr62
wr61: mov ax,314
sub ax,dx
shr ax,1
mov cs:wrx,ax
jmp wr3
wr6: mov bx,cs:wry
mov dx,cs:wrx
mov si,cs:wrcpnt
mov cs:wrcx[si],dx
mov cs:wrcy[si],bx
mov cs:wrcc[si],al
cmp al,'a'
jb wr92
call printc2
jmp wr91
wr92: call printc
wr91: mov cs:wrx,dx
cmp cs:wrx,320-16
jb wr3
mov cs:wrx,16
wr3: ;clear old chars
mov si,cs:wrcpnt
add si,2
and si,511
mov cs:wrcpnt,si
mov si,cs:wrcpnt2
mov dx,cs:wrcx[si]
mov bx,cs:wrcy[si]
mov al,cs:wrcc[si]
mov cs:wrcx[si],0
add si,2
and si,511
mov cs:wrcpnt2,si
cmp dx,0
je wr32
call printclr
wr32: cmp cs:wrwait,0
je wr1
dec cs:wrwait
wr1: ret
writer ENDP
fadespd equ 538*2
fadecount dw fadespd+1
fadeyadd dw 80*1+320*(32+8)
fadeyad1 dw 80*1+320*(32+8)
fadeyad2 dw 80*1+320*8
logofader PROC NEAR
cmp cs:oktofade,0
jne lof5
ret
lof5: inc cs:fadecount
cmp cs:fadecount,fadespd
ja lof1
ret
lof1: cmp cs:fadecount,fadespd+80
jb lof2
mov cs:fadecount,0
mov ax,cs:fadeyad1
xchg cs:fadeyad2,ax
mov cs:fadeyad1,ax
mov cs:fadeyadd,ax
ret
lof2: ;fade
;set 4 bitplane latch trasfer mode
mov dx,3ceh
mov ax,4105h
out dx,ax
mov dx,3
mov dx,3c4h
mov ax,0f02h
out dx,ax
;fade in/out
mov es,cs:vram
mov di,cs:fadecount
sub di,fadespd
mov bp,di
mov si,cs:fadeyadd
add si,bp
mov cx,16
mov dx,640
lof3: mov al,es:[si]
mov es:[di],al
add si,dx
add di,dx
loop lof3
mov di,fadespd+79+320
sub di,cs:fadecount
mov si,cs:fadeyadd
add si,320+79
sub si,bp
mov cx,16
mov dx,640
lof4: mov al,es:[si]
mov es:[di],al
add si,dx
add di,dx
loop lof4
;clear latch trasfer mode
mov dx,3ceh
mov ax,4005h
out dx,ax
ret
logofader ENDP
equpnt dw 0
equdel db 16 dup(64 dup(0))
equlast db 64 dup(0)
equs PROC NEAR
cmp cs:nosbc,0
je noeq
ret
noeq: mov dx,3
mov dx,3c4h
mov ax,0702h
out dx,ax
;draw the equs; REMARK; the info from the player is aprx. 16 frames early!
mov es,cs:vram
mov si,word ptr cs:stmikequs[0]
mov ds,word ptr cs:stmikequs[2]
mov cx,60 ;do 16 ins bars
mov bx,cs:equpnt
equ12: mov al,ds:[si]
mov cs:equdel[bx],al
sub al,2
jnc equ11
xor al,al
equ11: mov ds:[si],al
inc bx
inc si
loop equ12
add bx,4
and bx,1023
mov cs:equpnt,bx
mov cx,40
mov di,20+(133)*(1280/4)
mov si,bx
add si,20
mov bp,20
equ1: push cx
push di
push si
xor bh,bh
mov bh,cs:equlast[bp]
mov bl,cs:equdel[si]
cmp bl,0
jne equ4
cmp bh,0
jne equ4
jmp equ3
equ4: mov cs:equlast[bp],bl
mov cl,2
shr bl,cl
shr bh,cl
mov cl,bl
xor ch,ch
jcxz equ22
mov al,32
equ2: mov es:[di],al
sub di,1280/4
inc al
loop equ2
equ22: mov cl,bh
sub cl,bl
jc equ3
jz equ3
mov al,0
equ5: mov es:[di],al
sub di,1280/4
loop equ5
equ3: pop si
pop di
pop cx
inc si
inc bp
inc di
loop equ1
ret
equs ENDP