home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Stars of Shareware: Animation & Sound
/
SOS-ANIM_SOUND.ISO
/
programm
/
ldplasm
/
plasma.asm
< prev
next >
Wrap
Assembly Source File
|
1993-07-20
|
50KB
|
981 lines
;|----------------------------------------------------------------------------|
;| written 1993 by Alexander Lenhardt (Centauri of Legend Design) |
;| All rights reserved |
;| Inspired by VTIRIS from VangeliSTeam |
;| USE (c) is a Trademark of AWL - Trade and Development |
;| |
;|----------------------------------------------------------------------------|
;******************************************************************************
;ASSEMBLER COMMANDS
;******************************************************************************
;------------------------------------------------------------------------------
MODEL SMALL
.STACK 300H
.386
;------------------------------------------------------------------------------
;******************************************************************************
;STRUCTURES
;******************************************************************************
;------------------------------------------------------------------------------
;------------------------------------------------------------------------------
;******************************************************************************
;EQUALS
;******************************************************************************
;------------------------------------------------------------------------------
IMAGE_DELAY EQU 200 ;cyclces until face appears or disappears
LIFT_DELAY EQU 3 ;delay cycles between every "face lift"
LOGO_X EQU 0 ;start x position for legend logo plasma
LOGO_Y EQU 65 ;start y position for legend logo plasma
LOGO_LENGTH EQU 80 ;logo length in pixel
LOGO_HEIGTH EQU 15 ;logo height in pixel
P_WIDTH EQU 60 ;plasma width after pop up
P_HEIGTH EQU 50 ;plasma height after pop up
;------------------------------------------------------------------------------
;==============================================================================
.DATA
;==============================================================================
;******************************************************************************
;PREDEFINED LOCAL VARIABLES AND AREAS
;******************************************************************************
;------------------------------------------------------------------------------
COSTABLE DB 64,64,64,64,64,64,64,64,63,63,63,63
DB 63,62,62,62,62,61,61,61,60,60,59,59
DB 59,58,58,57,57,56,56,55,55,54,53,53
DB 52,52,51,50,50,49,48,48,47,46,46,45
DB 44,44,43,42,41,41,40,39,38,37,37,36
DB 35,34,34,33,32,31,30,30,29,28,27,27
DB 26,25,24,23,23,22,21,20,20,19,18,18
DB 17,16,16,15,14,14,13,12,12,11,11,10
DB 9, 9, 8, 8, 7, 7, 6, 6, 5, 5, 5, 4
DB 4, 3, 3, 3, 2, 2, 2, 2, 1, 1, 1, 1
DB 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
DB 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2
DB 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 7
DB 7, 8, 8, 9, 9,10,11,11,12,12,13,14
DB 14,15,16,16,17,18,18,19,20,20,21,22
DB 23,23,24,25,26,27,27,28,29,30,30,31
DB 32,33,34,34,35,36,37,37,38,39,40,41
DB 41,42,43,44,44,45,46,46,47,48,48,49
DB 50,50,51,52,52,53,53,54,55,55,56,56
DB 57,57,58,58,59,59,59,60,60,61,61,61
DB 62,62,62,62,63,63,63,63,63,64,64,64
DB 64,64,64,64
;cosinus table for creating plasma
;movings
;------------------------------------------------------------------------------
COSTABLE_COLOR DB 03FH,03FH,03FH,03FH,03FH,03FH,03FH,03FH
DB 03EH,03EH,03EH,03EH,03EH,03DH,03DH,03DH
DB 03DH,03CH,03CH,03CH,03BH,03BH,03BH,03AH
DB 03AH,039H,039H,038H,038H,037H,037H,036H
DB 036H,035H,035H,034H,033H,033H,032H,032H
DB 031H,030H,030H,02FH,02EH,02EH,02DH,02CH
DB 02CH,02BH,02AH,029H,029H,028H,027H,026H
DB 026H,025H,024H,023H,023H,022H,021H,020H
DB 020H,01FH,01EH,01DH,01CH,01CH,01BH,01AH
DB 019H,019H,018H,017H,016H,016H,015H,014H
DB 013H,013H,012H,011H,011H,010H,00FH,00FH
DB 00EH,00DH,00DH,00CH,00CH,00BH,00AH,00AH
DB 009H,009H,008H,008H,007H,007H,006H,006H
DB 005H,005H,004H,004H,004H,003H,003H,003H
DB 002H,002H,002H,002H,001H,001H,001H,001H
DB 001H,000H,000H,000H,000H,000H,000H,000H
DB 000H,000H,000H,000H,000H,000H,000H,000H
DB 001H,001H,001H,001H,001H,002H,002H,002H
DB 002H,003H,003H,003H,004H,004H,004H,005H
DB 005H,006H,006H,007H,007H,008H,008H,009H
DB 009H,00AH,00AH,00BH,00CH,00CH,00DH,00DH
DB 00EH,00FH,00FH,010H,011H,011H,012H,013H
DB 013H,014H,015H,016H,016H,017H,018H,019H
DB 019H,01AH,01BH,01CH,01CH,01DH,01EH,01FH
DB 020H,020H,021H,022H,023H,023H,024H,025H
DB 026H,026H,027H,028H,029H,029H,02AH,02BH
DB 02CH,02CH,02DH,02EH,02EH,02FH,030H,030H
DB 031H,032H,032H,033H,033H,034H,035H,035H
DB 036H,036H,037H,037H,038H,038H,039H,039H
DB 03AH,03AH,03BH,03BH,03BH,03CH,03CH,03CH
DB 03DH,03DH,03DH,03DH,03EH,03EH,03EH,03EH
DB 03EH,03FH,03FH,03FH,03FH,03FH,03FH,03FH
;cosinus table for creating plasma
;color cyclings
;------------------------------------------------------------------------------
PALETTE DB 0,0,0 ;first color black
I=0 ;create
REPT 64 ;a black faded
DB I/2,I/2,I/2 ;white
I=I+1 ;palette
ENDM ;using asm macros
DB 26,32,32 ;middle color a little bit cyan
I=1 ;than create a palette part
REPT 63 ;white faded
DB 32-I/2,32-I/2,32-I/2
;to black
I=I+1 ;using
ENDM ;asm macros too
;------------------------------------------------------------------------------
PLASMA_POS DW 68+57*80 ;the plasma position at the beginning
PLASMA_WIDTH DB 1 ;the start plasma width
PLASMA_HEIGTH DB 1 ;the start plasma height
COSPOSC1 DB ? ;phase offset for red cosinus wave
COSPOSC2 DB ? ;phase offset for green cosinus wave
COSPOSC3 DB ? ;phase offset for blue cosinus wave
COSPOSX1 DB ? ;phase offset for first horizontal wave
COSPOSX2 DB ? ;phase offset for second horizontal wave
COSPOSY1 DB ? ;phase offset for first vertical wave
COSPOSY2 DB ? ;phase offset for second vertical wave
RUN_X1_POS DW ? ;current position in 1. hor. cos. wave
RUN_X2_POS DW ? ;current position in 2. hor. cos. wave
RUN_Y1_POS DW ? ;current position in 1. vert. cos. wave
RUN_Y2_POS DW ? ;current position in 2. vert. cos. wave
IMAGE_LIFT DB 0 ;current image value multiplier
COUNTER DW LIFT_DELAY ;counter for delay between two lifts
COUNTER2 DW IMAGE_DELAY ;counter for delay between up and down lifts
LINE_DOUBLE DB 4 ;adding value for maximum raster line reg.
PLASMA_PICTURE DW OFFSET PLASMA_IMAGE
;offset for the plasma face
HORIZ_ADD_1 DW 300H ;speed to go thru 1. hor. cos. wave (real)
HORIZ_ADD_2 DW 200H ;speed to go thru 2. hor. cos. wave (real)
VERTI_ADD_1 DW 300H ;speed to go thru 1. vert. cos. wave (real)
VERTI_ADD_2 DW 100H ;speed to go thru 2. vert. cos. wave (real)
COS_RUNXADD1 DB 0 ;current pos. in 1. hor. speed cos. wave
COS_RUNXADD2 DB 0 ;current pos. in 2. hor. speed cos. wave
COS_RUNYADD1 DB 0 ;current pos. in 1. vert. speed cos. wave
COS_RUNYADD2 DB 0 ;current pos. in 2. vert. speed cos. wave
RCOS_POS DW 0 ;current pos. in red cosinus wave
GCOS_POS DW 0 ;current pos. in green cosinus wave
BCOS_POS DW 0 ;current pos. in blue cosuins wave
UPDOWN_FLAG DB 255 ;flag if plasma face has to faded up or down
GOTO_BW_FLAG DB 0 ;flag if color have to be faded to black&w
R_FASTNES DW 400H ;speed to go thru red cosinus wave (real)
G_FASTNES DW 200H ;speed to go thru green cosinus wave (real)
B_FASTNES DW 300H ;speed to go thru blue cosinus wave (real)
HOME_FLAG DB 0 ;flag if this part has to be finished
BW_DONE_FLG DB 0 ;flag if the bw-move was successful
FADE_DONE_FLG DB 0 ;flag if the rgb speed set was successful
LOUDNES DW 04040H ;the start master volume for left and right
SONG_NAME DB "FANTA.MOD",0 ;the name of the mod to play
;------------------------------------------------------------------------------
PLASMA_IMAGE DB "{MARKER}PLASFACE.BIN"
;free space to
DB 2980 DUP (0) ;link in the plasma picture
;------------------------------------------------------------------------------
LOGO_PICTURE DB "{MARKER}80X15 .BIN"
;free space to link in
DB 1180 DUP (0) ;the legend design logo
;------------------------------------------------------------------------------
COLOR_CONVERT LABEL BYTE ;create
I=0 ;a table
REPT 128 ;to supress
DB 128+I ;bad lookin'
I=I+1 ;wrap around
ENDM ;effects
I=0 ;'coz the plasma routine
REPT 128 ;creates values from 0 to 255
DB 255-I ;while only 128 colors are
I=I+1 ;hold free for the plasma
ENDM
;------------------------------------------------------------------------------
;==============================================================================
.CODE
;==============================================================================
;******************************************************************************
;HELPMACROS
;******************************************************************************
;------------------------------------------------------------------------------
;Explanation:waits for the vertical display retrace
;Inputs :none
;Outputs:none
;Registers destroyed:AX,DX
;Possible errors:none
;Cycles used on 386:
;------------------------------------------------------------------------------
WAIT_VSYNC MACRO
LOCAL @@VS1,@@VS2
MOV DX,3DAH ;load DX with vga status port
@@VS1:
IN AL,DX ;load AL with value from this port
TEST AL,8 ;is there still a retrace ?
JZ @@VS1 ;yes,then loop until this retrace ends
@@VS2:
IN AL,DX ;load AL with vga status
TEST AL,8 ;is there a display phase ?
JNZ @@VS2 ;yes,then wait until a new retrace starts
ENDM
;------------------------------------------------------------------------------
;******************************************************************************
;HELPPROCEDURES
;******************************************************************************
;------------------------------------------------------------------------------
;Explanation:draws a plasma on screen
;Inputs :ES contains vga page segment,DS data segment
;Outputs:none
;Registers destroyed:AX,BX,CX,DX,SI,DI
;Possible errors:none
;Cycles used on 386:
;------------------------------------------------------------------------------
DO_PLASMA PROC NEAR
MOV DX,3C4H ;load DX with sequencer address
MOV AX,0F02H ;and enable writing to all planes
OUT DX,AX ;by sending above value to sequencer
MOV DI,WORD PTR [PLASMA_POS]
;load DI with current plasma position
MOV SI,WORD PTR [PLASMA_PICTURE]
;load SI with current facepicture offset
MOV AH,BYTE PTR [PLASMA_HEIGTH]
;load AH with current plasma heigth
MOV AL,BYTE PTR [COSPOSY1]
;load AL with 1. hor. wave phase
;offset
MOV BYTE PTR [OFFSET RUN_Y1_POS+1],AL
;and load integer part of current
;1. hor. wave position with AL
MOV AL,BYTE PTR [COSPOSY2]
;do so with
MOV BYTE PTR [OFFSET RUN_Y2_POS+1],AL
;2. horizontal cosinus wave
@@LV:
PUSH AX ;save AX and DI
PUSH DI ;on stack
MOV AH,BYTE PTR [PLASMA_WIDTH]
;load AH with current plasma width
MOV AL,BYTE PTR [COSPOSX1]
;load AL with 1. vert. wave phase offset
MOV BYTE PTR [OFFSET RUN_X1_POS+1],AL
;and load integer part of current wave
;position with this value
MOV AL,BYTE PTR [COSPOSX2]
;do so with
MOV BYTE PTR [OFFSET RUN_X2_POS+1],AL
;2. vertical cosinus wave
MOV DL,BYTE PTR [OFFSET RUN_Y1_POS+1]
;load DL and DH with current vertical
MOV DH,BYTE PTR [OFFSET RUN_Y2_POS+1]
;cosinus wave positions
@@LH:
MOV BX,BP ;load BX with BP (BP is a runvariable)
MOV AL,BL ;load AL with lower part of BP
ADD AL,AH ;add AH to AL (AH is random)
XOR BH,BH ;clear BH
MOV BL,DL ;load BL with current 1. vertical wave pos.
ADD AL,BYTE PTR [BX]
;so we get a pointer on the cosinus table
;and add value from this table to AL
MOV BL,DH ;do so with second vertical
ADD AL,BYTE PTR [BX]
;wave position
MOV BL,BYTE PTR [OFFSET RUN_X1_POS+1]
;load BL with current 1. horizontal cosinus
;wave position
ADD AL,BYTE PTR [BX]
;use BX as pointer to the cosinus table and
;add table entry to AL
MOV BL,BYTE PTR [OFFSET RUN_X2_POS+1]
;do so with second horizontal cosinus
ADD AL,BYTE PTR [BX]
;wave position
MOV BL,BYTE PTR [IMAGE_LIFT]
;load BL with current picture value
;multiplier
PUSH AX ;save AX on stack
MOV AL,BYTE PTR [SI]
;load AL with entry from plasma face buffer
MUL BL ;multiply entry by image lift value
SHL AH,2 ;shift result in AH
MOV BL,AH ;load BL with result
POP AX ;restore AX from stack
ADD AL,BL ;and add result to AL
MOV BX,OFFSET COLOR_CONVERT
;load BX with offset of color convert table
XLAT ;and load AL with table entry
STOSB ;store result in screen memory
MOV BX,WORD PTR [HORIZ_ADD_1]
;load BX with 1. horizontal wave speed
ADD WORD PTR [RUN_X1_POS],BX
;and add it to current wave position
;(we're simulating a real addition here)
MOV BX,WORD PTR [HORIZ_ADD_2]
;do so with second horizontal wave
ADD WORD PTR [RUN_X2_POS],BX
;and it's speed
INC SI ;go forward in plasma face buffer
DEC AH ;decrement loop counter
JNZ @@LH ;all horizontal dots done in this line ?
;no,then jump
POP DI ;else restore plasma position offset
ADD DI,80 ;and add 80 for a line jump
MOV BX,WORD PTR [VERTI_ADD_1]
;add wave speed of 1. vertical wave
ADD WORD PTR [RUN_Y1_POS],BX
;to it's current offset
MOV BX,WORD PTR [VERTI_ADD_2]
;and do so with
ADD WORD PTR [RUN_Y2_POS],BX
;second vertical cosinus wave
POP AX ;restore line counter in AH
DEC AH ;and decrement it
JNZ @@LV ;all lines done yet ? no,then jump
RET ;else return
DO_PLASMA ENDP
;------------------------------------------------------------------------------
;Explanation:simulates a random set of the plasma and color variable
;Inputs :none
;Outputs:none
;Registers destroyed:AX,BX,CX,DX
;Possible errors:none
;Cycles used on 386:
;------------------------------------------------------------------------------
CALC_PLASM_RND PROC NEAR
MOV CL,FS:[4] ;load CL,CH,DL,DH
MOV CH,FS:[9] ;with current
MOV DL,FS:[12] ;values
MOV DH,FS:[17] ;from use dma buffer
SHR CL,5 ;divide CL by 32
SHR CH,6 ;divide CH by 64
SHR DL,5 ;divide DL by 32
SHR DH,4 ;and divide DH by 16
ADD BYTE PTR [COSPOSX1],CL
;add CL to 1.hwave phase offset
SUB BYTE PTR [COSPOSX2],CH
;decrement CH from 2.hwave phase offset
ADD BYTE PTR [COSPOSY1],DL
;add DL to 1.vwave phase offset
SUB BYTE PTR [COSPOSY2],DH
;decrement DH from 2.vwave phase offset
XOR BH,BH ;clear BH
MOV BL,BYTE PTR [COS_RUNXADD1]
;load BL with 1.hwave speed cosinus pos.
MOV AL,BYTE PTR [BX]
;load AL with speed from cosinus table
XOR AH,AH ;clear AH
SHL AX,3;2 ;multiply AX by 8
ADD AX,100H ;add 100H (minimal speed)
MOV WORD PTR [HORIZ_ADD_1],AX
;and save result as new 1.hwave speed
MOV BL,BYTE PTR [COS_RUNXADD2]
;do so with
MOV AL,BYTE PTR [BX]
;all other waves
XOR AH,AH
SHL AX,3;2
ADD AX,100H
MOV WORD PTR [HORIZ_ADD_2],AX
MOV BL,BYTE PTR [COS_RUNYADD1]
MOV AL,BYTE PTR [BX]
XOR AH,AH
SHL AX,3;2
ADD AX,100H
MOV WORD PTR [VERTI_ADD_1],AX
MOV BL,BYTE PTR [COS_RUNYADD2]
MOV AL,BYTE PTR [BX]
XOR AH,AH
SHL AX,3;2
ADD AX,100H
MOV WORD PTR [VERTI_ADD_2],AX
MOV CL,FS:[0] ;load CL
MOV CH,FS:[7] ;CH,DL and
MOV DL,FS:[11] ;DH with values from
MOV DH,FS:[13] ;use dma buffer
SHR CL,5;4 ;divide CL by 32
SHR CH,4;3 ;divide CH by 16
SHR DL,4;3 ;divide DL by 16
SHR DH,5;4 ;divide DH by 32
ADD BYTE PTR [COS_RUNXADD1],CL
;and add CL,CH,DL,CH
SUB BYTE PTR [COS_RUNXADD2],CH
;to waves
ADD BYTE PTR [COS_RUNYADD1],DL
;speed cosinus positions
SUB BYTE PTR [COS_RUNYADD2],DH
MOV CL,FS:[32] ;load CL,CH,DL with
MOV CH,FS:[67] ;values from
MOV DL,FS:[21] ;use dma buffer
SHR CL,6 ;divide CL by 64
SHR CH,7 ;divide CH by 128
SHR DL,6 ;and divide DL by 64
CMP BYTE PTR [GOTO_BW_FLAG],255
;move colors to black&white
JZ MOVE_TO_BW ;yes,then jump
ADD BYTE PTR [COSPOSC1],CL
;else add CL to red cosinus phase offset
SUB BYTE PTR [COSPOSC2],CH
;add CH to green cosinus phase offset
SUB BYTE PTR [COSPOSC3],DL
;and add DL to blue cosinus phase offset
RET ;then leave this damned procedure
MOVE_TO_BW:
CMP BYTE PTR [BW_DONE_FLG],63
;move to bw done ?
JZ FADE_OUT ;yes,then start fading out
CMP BYTE PTR [COSPOSC1],128
;else check if red cosinus phase offset is
;in then dead point of the cosinus
JZ SKIP_R_CORRECT ;yes,then skip moving phase offset
INC BYTE PTR [COSPOSC1]
;else move it forward
JMP R_CORREC_DONE ;and jump
SKIP_R_CORRECT:
OR BYTE PTR [BW_DONE_FLG],1
;set bit 0 in bw_done flag
R_CORREC_DONE:
CMP BYTE PTR [COSPOSC2],128
;do so with green
JZ SKIP_G_CORRECT
INC BYTE PTR [COSPOSC2]
JMP G_CORREC_DONE
SKIP_G_CORRECT:
OR BYTE PTR [BW_DONE_FLG],2
G_CORREC_DONE:
CMP BYTE PTR [COSPOSC3],128
;do so with blue
JZ SKIP_B_CORRECT
INC BYTE PTR [COSPOSC3]
JMP B_CORREC_DONE
SKIP_B_CORRECT:
OR BYTE PTR [BW_DONE_FLG],4
B_CORREC_DONE:
CMP WORD PTR [R_FASTNES],100H
;is red cosinus wave speed = 1 ?
JBE SKIP_RSPEED_COR
;yes,then skip correcting it
SUB WORD PTR [R_FASTNES],10H
;else correct it a little bit
JMP R_SPEEDSET_DONE
;and jump
SKIP_RSPEED_COR:
OR BYTE PTR [BW_DONE_FLG],8
;set bit 4 of bw_done flag
R_SPEEDSET_DONE:
CMP WORD PTR [G_FASTNES],100H
;do so with green
JBE SKIP_GSPEED_COR
SUB WORD PTR [G_FASTNES],10H
JMP G_SPEEDSET_DONE
SKIP_GSPEED_COR:
OR BYTE PTR [BW_DONE_FLG],16
G_SPEEDSET_DONE:
CMP WORD PTR [B_FASTNES],100H
;do so with blue
JBE SKIP_BSPEED_COR
SUB WORD PTR [B_FASTNES],10H
JMP B_SPEEDSET_DONE
SKIP_BSPEED_COR:
OR BYTE PTR [BW_DONE_FLG],32
B_SPEEDSET_DONE:
RET ;leave procedure
FADE_OUT:
CMP WORD PTR [R_FASTNES],0
;is red cosinus wave speed 0 ?
JBE SKIP_RSPEED_COR2
;yes,then skip calculating it to 0
SUB WORD PTR [R_FASTNES],1
;else calculate new speed
JMP R_SPEEDSET_DONE2
;and jump
SKIP_RSPEED_COR2:
OR BYTE PTR [FADE_DONE_FLG],1
;set bit 0 in fade done flag
R_SPEEDSET_DONE2:
CMP WORD PTR [G_FASTNES],0
;do so for green
JBE SKIP_GSPEED_COR2
SUB WORD PTR [G_FASTNES],1
JMP G_SPEEDSET_DONE2
SKIP_GSPEED_COR2:
OR BYTE PTR [FADE_DONE_FLG],2
G_SPEEDSET_DONE2:
CMP WORD PTR [B_FASTNES],0
;do so for blue
JBE SKIP_BSPEED_COR2
SUB WORD PTR [B_FASTNES],1
JMP B_SPEEDSET_DONE2
SKIP_BSPEED_COR2:
OR BYTE PTR [FADE_DONE_FLG],4
B_SPEEDSET_DONE2:
CMP BYTE PTR [FADE_DONE_FLG],7
;are all speeds zero ?
JNZ MORE_BW_MOVES ;no,then correct'em until they are
MOV BYTE PTR [HOME_FLAG],255
;else set exit flag
MORE_BW_MOVES:
RET ;and return
CALC_PLASM_RND ENDP
;------------------------------------------------------------------------------
;Explanation:set maximum scan line register
;Inputs :none
;Outputs:none
;Registers destroyed:AX,DX,DS
;Possible errors:none
;Cycles used on 386:
;------------------------------------------------------------------------------
SET_MSL_REG PROC
MOV AX,@DATA ;load DS with data segment
MOV DS,AX ;using AX register
MOV DX,03D4H ;load DX with crtc port
MOV AL,9 ;and send msl index in AL
MOV AH,BYTE PTR [LINE_DOUBLE]
;and new msl value in AH
OUT DX,AX ;to crtc
RET ;return
SET_MSL_REG ENDP
;------------------------------------------------------------------------------
;Explanation:cycle plasma colors (cycling means randomly creating)
;Inputs :DS contains data segment
;Outputs:none
;Registers destroyed:AX,BX,CX,DX,SI
;Possible errors:none
;Cycles used on 386:
;------------------------------------------------------------------------------
CYCLE_COLORS PROC NEAR
MOV SI,OFFSET COSTABLE_COLOR
;load SI with offset of color cosinus tab.
XOR BH,BH ;clear BH and
XOR AL,AL ;AL
MOV AH,BYTE PTR [COSPOSC1]
;load AL with red cosinus phase offset
MOV WORD PTR [RCOS_POS],AX
;and store AX in current red offset
MOV AH,BYTE PTR [COSPOSC2]
;do so with green
MOV WORD PTR [GCOS_POS],AX
MOV AH,BYTE PTR [COSPOSC3]
;and blue
MOV WORD PTR [BCOS_POS],AX
MOV DX,03C8H ;load DX with pel index port
MOV AL,128 ;and send start color
OUT DX,AL ;to pel
INC DX ;load DX with pel data port
MOV CX,128 ;load CX with number of colors to do
CYCLE_COL_LOOP:
PUSH CX ;save loop counter on stack
MOV BL,BYTE PTR [RCOS_POS+1]
;load BL with current red cosinus pos.
MOV AL,[SI+BX] ;and load AL with entry from color costab.
OUT DX,AL ;send AL to pel
MOV BL,BYTE PTR [GCOS_POS+1]
;do so with green
MOV AL,[SI+BX]
OUT DX,AL
MOV BL,BYTE PTR [BCOS_POS+1]
;and blue
MOV AL,[SI+BX]
OUT DX,AL
POP CX ;restore loop counter
MOV AX,WORD PTR [R_FASTNES]
;load AX with red cosinus speed (real)
ADD WORD PTR [RCOS_POS],AX
;and add it to current red cosinus wave
;position
MOV AX,WORD PTR [G_FASTNES]
;do so with green
ADD WORD PTR [GCOS_POS],AX
MOV AX,WORD PTR [B_FASTNES]
;do so with blue
ADD WORD PTR [BCOS_POS],AX
LOOP CYCLE_COL_LOOP
;redo until 128 colors are set
RET ;and then leave
CYCLE_COLORS ENDP
;------------------------------------------------------------------------------
;Explanation:controls the plasma face mix in timing
;Inputs :DS contains data register
;Outputs:none
;Registers destroyed:none
;Possible errors:none
;Cycles used on 386:
;------------------------------------------------------------------------------
MIX_IMAGE PROC NEAR
CMP WORD PTR [COUNTER2],0
;is it time to start a new picture
;mix in or out phase ?
JZ DO_IMAGE ;yes,then jump
DEC WORD PTR [COUNTER2]
;else decrement counter
RET ;and return
DO_IMAGE:
DEC WORD PTR [COUNTER]
;decrement lift up delay counter
JNZ END_IMAGE_MIX ;is it time to lift picture a little bit ?
;no,then jump
MOV WORD PTR [COUNTER],LIFT_DELAY
;else reload lift delay counter
CMP BYTE PTR [UPDOWN_FLAG],0
;lift picture up or down ?
JNZ IMAGE_UP ;up,then jump
DEC BYTE PTR [IMAGE_LIFT]
;else lift it down a little bit
CMP BYTE PTR [IMAGE_LIFT],0
;is it lifted down fully ?
JNZ END_IMAGE_MIX ;no,then jump
MOV BYTE PTR [UPDOWN_FLAG],255
;else set up down flag
MOV WORD PTR [COUNTER2],IMAGE_DELAY
;reload second counter
RET ;and return
IMAGE_UP:
INC BYTE PTR [IMAGE_LIFT]
;lift picture up a little bit
CMP BYTE PTR [IMAGE_LIFT],45
;is it lifted up enough ?
JNZ END_IMAGE_MIX ;no,then jump
MOV WORD PTR [COUNTER2],IMAGE_DELAY
;else reload second counter
MOV BYTE PTR [UPDOWN_FLAG],0
;set up down flag
RET ;and return
END_IMAGE_MIX:
RET ;return (a second time)
MIX_IMAGE ENDP
;------------------------------------------------------------------------------
;Explanation:initializes the black&white phase coupling
;Inputs :DS contains data segment
;Outputs:none
;Registers destroyed:none
;Possible errors:none
;Cycles used on 386:
;------------------------------------------------------------------------------
INIT_BW_MOVE PROC NEAR
MOV BYTE PTR [GOTO_BW_FLAG],255
;set do_bw_flag
RET ;and return
INIT_BW_MOVE ENDP
;------------------------------------------------------------------------------
;Explanation:draws the legend desing logo on the screen
;Inputs :DS contains data segment
;Outputs:none
;Registers destroyed:AX,BX,CX,DX,DI,SI
;Possible errors:none
;Cycles used on 386:
;------------------------------------------------------------------------------
DO_LOGOPLAS PROC NEAR
MOV DX,3C4H ;enable writing to all planes
MOV AX,0F02H ;at one time
OUT DX,AX ;by setting vga sequencer
MOV DI,LOGO_X+LOGO_Y*80
;load DI with logo position on screen
MOV SI,OFFSET LOGO_PICTURE
;load SI with offset of logo buffer
MOV AH,LOGO_HEIGTH;load AH with logo height
MOV DL,BYTE PTR [OFFSET RUN_Y1_POS+1]
;load DL with 1.vwave phase offset
MOV DH,BYTE PTR [OFFSET RUN_Y2_POS+1]
;load DH with 2.vwave phase offset
@@LV2:
PUSH AX ;save AX and DI
PUSH DI ;on stack
MOV AH,LOGO_LENGTH;load AH with logo width
MOV CL,BYTE PTR [OFFSET RUN_X1_POS+1]
;load CL with 1.hwave phase offset
MOV CH,BYTE PTR [OFFSET RUN_X2_POS+1]
;load CH with 2.hwave phase offset
@@LH2:
MOV BX,BP ;load BX with BP
MOV AL,BL ;load AL with lower part of BP
ADD AL,AH ;add AH (AH is random)
XOR BH,BH ;clear BH
MOV BL,DL ;and add
ADD AL,BYTE PTR [BX]
MOV BL,DH ;values
ADD AL,BYTE PTR [BX]
MOV BL,CL ;of the four
ADD AL,BYTE PTR [BX]
MOV BL,CH ;cosinus waves
ADD AL,BYTE PTR [BX]
;together
MOV BL,BYTE PTR [SI]
;load BL with value from logo picture
SHL BL,1 ;multiply it by 2
ADD AL,BL ;add it to cosinus calculation result in
;AL
CMP BL,0 ;is logo pixel black ?
JNZ LOGO_SET ;no,then set it
MOV AL,0 ;else load AL with zero
LOGO_SET:
AND AL,127 ;mask out highest bit
STOSB ;and set value in AL onto screen
ADD CL,1 ;move forward in 1. and 2. hwave
ADD CH,2 ;cosinus wave table
INC SI ;get next logo picture position
DEC AH ;decrement pixel counter
JNZ @@LH2 ;all pixels done in this line ? no,then
;redo until all are done
POP DI ;get old DI from stack
ADD DL,2 ;move forward in 1. and 2. vwave
ADD DH,3 ;cosinus wave table
POP AX ;pop AX from stack
ADD DI,80 ;count DI forward one line
DEC AH ;decrement line counter
JNZ @@LV2 ;all lines done ? no,then do until
RET ;return
DO_LOGOPLAS ENDP
;------------------------------------------------------------------------------
;Explanation:fades up logo colors while redrawing logo,cycling colors and so on
;Inputs :DS contains data segment
;Outputs:none
;Registers destroyed:AX,BX,CX,DX,SI,DI
;Possible errors:none
;Cycles used on 386:
;------------------------------------------------------------------------------
FADE_IN_LOGO PROC NEAR
MOV AH,64 ;load AH with number of steps to do
DO_MORE_COLFADE:
PUSH AX ;save loop counter on stack
WAIT_VSYNC ;wait for vertical retrace
WAIT_VSYNC ;twice
POP AX ;restore loop counter
MOV DX,3C8H ;load DX with pel index port
MOV AL,0 ;load AL with start color
OUT DX,AL ;and send it to pel
INC DX ;load DX with pel data port
MOV CX,384 ;load CX with loops to do
MOV SI,OFFSET PALETTE
;load SI with offset of palette datas
@@PL1:
LODSB ;load AL with palette table entry
SUB AL,AH ;decrement loop counter
JNB NO_COLOR_UNDERFLW
;jump,if it didn't crossed zero
MOV AL,0 ;else set it to zero
NO_COLOR_UNDERFLW:
OUT DX,AL ;and send result to pel
LOOP @@PL1 ;redo until 128 colors are set
PUSH AX ;save loop counter on satck again
CALL DO_PLASMA ;draw plasma
CALL DO_LOGOPLAS ;draw logo plasma
CALL CALC_PLASM_RND
;randomize plasma variables
DEC BP ;decrement plasma intern variable
POP AX ;restore AX
DEC AH ;decrement loop counter
JNZ DO_MORE_COLFADE
;all loops done ? no,then do until it is
RET ;return to calling procedure
FADE_IN_LOGO ENDP
;------------------------------------------------------------------------------
;Explanation:resizes plasma on screen
;Inputs :DS contains data segment
;Outputs:none
;Registers destroyed:AX,BX,CX,DX,SI,DI,BP
;Possible errors:none
;Cycles used on 386:
;------------------------------------------------------------------------------
BIGGER_PLASMA PROC NEAR
WAIT_VSYNC ;wait for vertical retrace
CMP BYTE PTR [PLASMA_WIDTH],P_WIDTH
;has plasma width reached his end value ?
JNZ MORE_SCALE ;no,then do more width scale
RET ;else return
MORE_SCALE:
INC BYTE PTR [PLASMA_WIDTH]
;increment plasma width
DEC WORD PTR [PLASMA_POS]
;and decrement plasma x position
CMP BYTE PTR [PLASMA_HEIGTH],P_HEIGTH
;has plasma heigth reached his maximum ?
JZ NO_MORE_HSCALE ;yes,then end plasma scaling
INC BYTE PTR [PLASMA_HEIGTH]
;else increment plasma height
SUB WORD PTR [PLASMA_POS],80
;and move plasma up one line
NO_MORE_HSCALE:
CALL CYCLE_COLORS ;randomize plasma colors
CALL DO_PLASMA ;redraw plasma
CALL DO_LOGOPLAS ;redraw logo plasma
CALL CALC_PLASM_RND
;randomize plasma variables
DEC BP ;decrement plasm intern variables
JMP BIGGER_PLASMA ;and jump to scale more times
BIGGER_PLASMA ENDP
;------------------------------------------------------------------------------
;Explanation:sets the second 128 colors to zero
;Inputs :DS contains data segment
;Outputs:none
;Registers destroyed:AX,CX,DX
;Possible errors:none
;Cycles used on 386:
;------------------------------------------------------------------------------
PLASMA_BLACK PROC NEAR
MOV DX,3C8H ;load DX with pel index port
MOV AL,128 ;load AL with start color
OUT DX,AL ;and send it to pel
INC DX ;load DX with pel data port
MOV CX,384 ;load CX with number of r,g and b cycles
;to do
MOV AL,0 ;load AL with 0
PAL_BLACK:
OUT DX,AL ;send it to pel
LOOP PAL_BLACK ;and redo until all colors are done
RET ;leave procedure
PLASMA_BLACK ENDP
;------------------------------------------------------------------------------
;Explanation:initializes the vga card for our requierments
;Inputs :none
;Outputs:none
;Registers destroyed:AX,CX,DX
;Possible errors:none
;Cycles used on 386:
;------------------------------------------------------------------------------
INIT_VGACARD PROC NEAR
MOV AX,13H ;set video mode 13H
INT 10H ;via video interrupt
MOV DX,3C4H ;initialize sequencer
MOV AX,604H ;to allow
OUT DX,AX ;chain 4 mode
MOV DX,3D4H ;initialize CRT controller
MOV AX,14H ;to support
OUT DX,AX ;chain 4 mode
MOV AX,0E317H ;allowed
OUT DX,AX ;by sequencer
CALL PLASMA_BLACK ;set second 128 colors to zero
CALL SET_MSL_REG ;initialize line doubling
RET ;return
INIT_VGACARD ENDP
;------------------------------------------------------------------------------
;Explanation:fades out logo colors and background sound
;Inputs :DS contains data segment
;Outputs:none
;Registers destroyed:AX,BX,CX,DX
;Possible errors:none
;Cycles used on 386:
;------------------------------------------------------------------------------
FADE_OUT_LOGO PROC NEAR
MOV AH,64 ;load AH with number of fade out steps to do
DO_MORE_COLFADE2:
PUSH AX ;save counter on stack
WAIT_VSYNC ;wait for vertical retrace
POP AX ;restore counter
MOV DX,3C8H ;load DX with pel index port
MOV AL,0 ;load AL with start color
OUT DX,AL ;and send it to pel
INC DX ;load DX with pel data port
MOV CX,384 ;load CX with number of rgb triple parts to
;do
MOV SI,OFFSET PALETTE
;load SI with palette table offset
@@PL2:
LODSB ;load AL with palette table entry
MOV BL,AH ;load BL with counter
XOR BL,63 ;negate it
SUB AL,BL ;and decrement it from table entry
JNB NO_COLOR_UNDERFLW2
;crossed result zero ? no,then jump
MOV AL,0 ;else load AL with zero
NO_COLOR_UNDERFLW2:
OUT DX,AL ;and send AL to pel
LOOP @@PL2 ;redo until all 128 colors are done
PUSH AX ;push counter on stack
CALL DO_PLASMA ;redraw plasma
CALL DO_LOGOPLAS ;redraw logo plasma
CALL CALC_PLASM_RND
;randomize plasma variables
DEC BP ;decrement plasma intern variable
SUB WORD PTR [LOUDNES],0101H
;decrement loudness for left and right
;channel
MOV CX,WORD PTR [LOUDNES]
;load CX with new loudness
MOV AH,10H ;and set it
PUSH ES ;using really cool
INT 80H ;use driver interrupt
POP ES ;restore ES
POP AX ;pop counter from stack
DEC AH ;decrement counter
JNZ DO_MORE_COLFADE2
;and redo until all is faded out
RET ;return
FADE_OUT_LOGO ENDP
;------------------------------------------------------------------------------
;Explanation:
;Inputs :
;Outputs:
;Registers destroyed:
;Possible errors:none
;Cycles used on 386:
;------------------------------------------------------------------------------
INIT_SOUND PROC NEAR
MOV AH,0FH
INT 80H
MOV AH,01H
INT 80H
MOV AX,@DATA
MOV DS,AX
MOV DX,OFFSET SONG_NAME
MOV AH,21H
INT 80H
MOV AH,10H
MOV CX,4040H
INT 80H
MOV AH,30H
MOV CL,1
INT 80H
RET
INIT_SOUND ENDP
;------------------------------------------------------------------------------
;Explanation:
;Inputs :
;Outputs:
;Registers destroyed:
;Possible errors:none
;Cycles used on 386:
;------------------------------------------------------------------------------
STOP_SOUND PROC NEAR
MOV AH,32H
INT 80H
MOV AH,40H
INT 80H
MOV AH,0FFH
INT 80H
RET
STOP_SOUND ENDP
;------------------------------------------------------------------------------
;******************************************************************************
;RUNTIMECODE
;******************************************************************************
;------------------------------------------------------------------------------
START:
MOV BX,500 ;free conventional dos memory
MOV AH,4AH ;using the good
INT 21H ;old dos
CALL INIT_VGACARD ;init vga card for our requierment
CALL INIT_SOUND ;init use-driver for playing nice music
CLD ;clear direction flag
MOV AH,0D1H ;get use-driver dma buffer segment
INT 80H ;by calling use_int
PUSH ES ;load FS with dma segment in ES
POP FS ;using stack
MOV AX,@DATA ;load DS with data segment
MOV DS,AX ;using AX
MOV AX,0A000H ;and load ES with vga screen segment
MOV ES,AX ;using AX register
CALL FADE_IN_LOGO ;fade in legend design logo
CALL BIGGER_PLASMA;and scale plasma
MAINLOOP:
; WAIT_VSYNC ;wait for fuckin' vsync
CALL CYCLE_COLORS ;cycle the plasma colors
CALL DO_PLASMA ;redraw plasma with new colors and form
CALL DO_LOGOPLAS ;redraw plasma woth new colors and form
CALL CALC_PLASM_RND
;randomize plasma values (randomize :-))
CALL MIX_IMAGE ;and mix plasma face into plasma
DEC BP ;decrement BP (plasma intern variable)
CMP BYTE PTR [HOME_FLAG],0
;is the home flag set ?
JNZ REALLY_BYE ;yeap,then start exit procedure
MOV AH,1 ;else check if a key was pressed
INT 16H ;using keyboard interrupt
JNZ BYE ;yeap,then init exit part
JMP MAINLOOP ;else redo plasma scum
BYE:
CALL INIT_BW_MOVE ;initialize black&white fade
JMP MAINLOOP ;and redo plasma scum
REALLY_BYE:
CALL FADE_OUT_LOGO;fade down logo (and music volume)
CALL STOP_SOUND ;stop music playing
SKIP_DEMOPART:
XOR AH,AH ;clear keyboard buffer
INT 16H ;by calling keyboard interrupt
MOV AX,3 ;set video mode 3
INT 10H ;using video interrupt
MOV AX,4C00H ;return
INT 21H ;via dos
;------------------------------------------------------------------------------
END START