home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 3
/
FREEWARE.BIN
/
towns_os
/
pmgf
/
src
/
effect.asm
< prev
next >
Wrap
Assembly Source File
|
1980-01-02
|
23KB
|
1,328 lines
.386p
PUBLIC EFFECT
param struc
vx dd ? ;横方向ドット数
vy dd ? ;縦方向ドット数
nxl dd ? ;横方向バイト数(仮想画面のバイト数)
nxl1 dd ? ;横方向バイト数(実効画面のバイト数)
x0 dd ? ;1ライン中の始めのオフセット
x1 dd ? ;1ライン中の終わりのオフセット
nyl dd ? ;縦方向の仮想画面のドット数
tmp dd ? ;テンポラリ変数エリア
;
dd ? ;使用禁止
command dd ? ;EFFECTコマンド番号
buffer dd ? ;バッファアドレス
vx0 dd ? ;x左上ポイント
vy0 dd ? ;y左上ポイント
vx1 dd ? ;x右下ポイント
vy1 dd ? ;y右下ポイント
mofs dd ? ;間隔幅(basflgが0の時は自動設定)
;Dot-Dissolve時
; [mofs] Mask Pattern Add. / Mask Region Add.
speed dd ? ;スピード
pscm dd ? ;スクリーンモード(0,1)
layer dd ? ;出力レイア(0,1)
param ends
worklng EQU 4*8 ;確保するワークエリアのバイト数
dbf EQU 0 ;デバッグモードフラグ(0:Debug Mode Off 1:On)
basflg EQU 0 ;BASICモードフラグ
;
; MACRO
debug macro val
pushf
pushad
mov eax,val
and eax,4fh
mov edx,04ech ;Volume Meter
out dx,al
popad
popf
endm
debugs macro val,val2
pushf
push eax
push edx
mov eax,val
shl eax,val2
and eax,4fh
mov edx,04ech ;Volume Meter
out dx,al
pop edx
pop eax
popf
endm
debugl macro val,val2
pushf
push eax
push edx
mov eax,val
and eax,4fh
mov edx,04ech ;Volume Meter
out dx,al
mov eax,val2
out dx,al
pop edx
pop eax
popf
endm
djmp macro val,val2
if dbf
cmp dword PTR dflag[ebp],val
je val2
endif
endm
CODE segment dword public ER use32 'CODE'
assume cs:CODE
;
; Graphics Data Spread Routine for High C 1.4
;
; cmd,add,vx0,vy0,vx1,vy1,Dot Width,speed,Screen Mode,Layer
db 'EFFECT',6 ;use for High C Compiler 1.4
EFFECT proc near
START: sub esp,worklng ;ワークエリアの確保
mov eax,esp ;-
push ebp ;|
push esi ;+High C用のレジスタ保存
push edi ;|
push ebx ;-
mov ebp,eax ;パラメータアドレスをebpにセット
cld ;自動増加を指定
;
push dword PTR 120h ;1画面モードは120h
pop fs ;fsにVRAMセレクタ値をセットする
mov edi,40000h ;VRAM基準アドレスを設定する
mov eax,layer[ebp] ;設定値を読み込む
mul edi ;計算
mov edi,eax
mov layer[ebp],edi ;基準アドレスを書き込む
;
mov ecx,pscm[ebp] ;スクリーンモードを読み込む
mov ebx,vy1[ebp] ;縦方向の長さ(ドット数)を計算する
mov eax,512
shr eax,cl ;仮想画面の縦方向のドット数
cmp ebx,eax ;もし、指定されたvy1が仮想画面をはみ出していたら
jb CALY ;修正する
mov ebx,eax
dec ebx
CALY: sub ebx,vy0[ebp]
inc ebx
mov vy[ebp],ebx ;VY(縦方向の長さ)を書き込む
;
mov ebx,vx1[ebp] ;横方向の長さ(ドット数)を計算する
mov eax,1024
shr eax,cl ;仮想画面の横方向のドット数
cmp ebx,eax ;もし、指定されたvx1が仮想画面をはみ出していたら
jb CALX ;修正する
mov ebx,eax
dec ebx
CALX: sub ebx,vx0[ebp]
inc ebx
mov vx[ebp],ebx ;VX(横方向の長さ)を書き込む
;
cmp cl,1 ;スクリーンモードが1なら32768色設定モードへ
je SC32
;
SC16: mov dword PTR nyl[ebp],512 ;仮想画面の縦方向のドット数
mov dword PTR nxl[ebp],200h ;仮想画面の横方向バイト数
add ebx,7 ;実効画面の横方向のバイト数に7を足す
shr ebx,3 ;\8
shl ebx,2 ;*4
add ebx,3 ;+3
and ebx,0fffffffch ;\4*4
mov nxl1[ebp],ebx ;NXL1(実効画面の横方向のバイト数)をセット
mov ebx,vx0[ebp] ;実効画面の左端x座標を読み込む
shr ebx,3 ;\8
shl ebx,2 ;*4
mov x0[ebp],ebx ;X0(実効画面の始まりの横オフセット)を書き込む
add ebx,nxl1[ebp]
; dec ebx
mov x1[ebp],ebx ;X1(実効画面の終わりの横オフセット)を書き込む
jmp CMDBCT ;コマンド分岐ルーチンへジャンプ
;
EFFECT_BASE dd WIPE_DOWN ;各効果のエントリルーチンのテーブル
dd WIPE_UP
dd WIPE_RIGHT
dd WIPE_LEFT
dd SCROLL_DOWN
dd SCROLL_UP
dd SCROLL_RIGHT
dd SCROLL_LEFT
dd HORIZONTAL_CLOSE
dd HORIZONTAL_OPEN
dd VERTICAL_CLOSE
dd VERTICAL_OPEN
dd ZOOM_CLOSE
dd ZOOM_OPEN
dd DOT_DISSOLVE
dd LINE_DISSOLVE
dd SHIFT_DOWN
dd SHIFT_UP
dd SHIFT_RIGHT
dd SHIFT_LEFT
dd PALETTE
;
SC32: mov dword PTR nyl[ebp],256 ;仮想画面の縦方向のドット数
mov dword PTR nxl[ebp],400h ;仮想画面の横方向のバイト数
shl ebx,1 ;実効画面の横方向のバイト数を2倍する
mov nxl1[ebp],ebx ;NXL1(実効画面の横方向のバイト数)をセット
mov ebx,vx0[ebp] ;実効画面の左端x座標を読み込む
shl ebx,1 ;*2
mov x0[ebp],ebx ;X0(実効画面の始まりの横オフセット)を書き込む
mov ebx,vx1[ebp] ;実効画面の右端x座標を読み込む
shl ebx,1 ;*2
inc ebx ;+1
mov x1[ebp],ebx ;X1(実効画面の終わりの横オフセット)を書き込む
;
CMDBCT: mov eax,command[ebp] ;コマンドを読み込む
sub eax,30h ;30hを引く
js NOMAL ;0以下なら効果無しへ
jmp EFFECT_BASE[eax*4] ;それぞれの効果ルーチンへ
;
NOMAL:
xor ebx,ebx
jmp NOMALIN
;
;
WIPEWAIT:
mov eax,ebx
mov ecx,speed[ebp]
inc ecx
shl ecx,3
mul ecx
mov ecx,eax
inc ecx
WIPELP: loop WIPELP
ret
;
;
WIPE_DOWN:
mov ebx,0ffh
;
NOMALIN:
mov edx,vy0[ebp]
WDFOR1: mov esi,buffer[ebp] ;グラフィックデータ格納アドレスを読み込む
mov edi,layer[ebp] ;転送先基準アドレスを読み込む
push edx
push ebx
mov eax,nxl[ebp] ;Y*NXL
mul edx
mov ecx,x0[ebp]
dec ecx
add ecx,eax ;Y*NXL+X
add esi,ecx
add edi,ecx
mov ecx,nxl1[ebp]
;
WDFOR2: mov al,[ecx][esi]
mov fs:[ecx][edi],al
loop WDFOR2
pop ebx
;
WDWAIT: cmp ebx,0
jz WDWSKP
call WIPEWAIT
WDWSKP:
;
pop edx
inc edx
cmp edx,vy1[ebp]
jbe WDFOR1
;
jmp EFTRET ;ワークエリアを解放
;
;
WIPE_UP:
;
mov ebx,0ffh
mov edx,vy1[ebp]
WUFOR1: mov esi,buffer[ebp] ;グラフィックデータ格納アドレスを読み込む
mov edi,layer[ebp] ;転送先基準アドレスを読み込む
push edx
push ebx
mov eax,nxl[ebp] ;Y*NXL
mul edx
mov ecx,x0[ebp]
dec ecx
add ecx,eax ;Y*NXL+X
add esi,ecx
add edi,ecx
mov ecx,nxl1[ebp]
;
WUFOR2: mov al,[ecx][esi]
mov fs:[ecx][edi],al
loop WUFOR2
pop ebx
;
call WIPEWAIT
;
pop edx
dec edx
cmp edx,vy0[ebp]
jge WUFOR1
;
jmp EFTRET ;ワークエリアを解放
;
;
WIPE_RIGHT:
;
mov ebx,x1[ebp]
dec ebx
add ebx,pscm[ebp]
mov x1[ebp],ebx
mov ebx,0ffh
mov edx,x0[ebp]
WRFOR1: mov esi,buffer[ebp] ;グラフィックデータ格納アドレスを読み込む
mov edi,layer[ebp] ;転送先基準アドレスを読み込む
push edx
push ebx
add esi,edx
add edi,edx
;
mov ebx,nxl[ebp]
mov eax,vy0[ebp]
mul ebx
mov edx,eax
mov ecx,vy[ebp]
;
WRFOR2: mov al,[edx][esi]
mov fs:[edx][edi],al
add edx,ebx
loop WRFOR2
pop ebx
;
call WIPEWAIT
;
pop edx
inc edx
cmp edx,x1[ebp]
jbe WRFOR1
;
jmp EFTRET ;ワークエリアを解放
;
;
WIPE_LEFT:
;
mov ebx,0ffh
mov edx,x1[ebp]
dec edx ;*
add edx,pscm[ebp] ;32000色モード時の補正
WLFOR1: mov esi,buffer[ebp] ;グラフィックデータ格納アドレスを読み込む
mov edi,layer[ebp] ;転送先基準アドレスを読み込む
push edx
push ebx
add esi,edx
add edi,edx
;
mov ebx,nxl[ebp]
mov eax,vy0[ebp]
mul ebx
mov edx,eax
mov ecx,vy[ebp]
;
WLFOR2: mov al,[edx][esi]
mov fs:[edx][edi],al
add edx,ebx
loop WLFOR2
pop ebx
;
call WIPEWAIT
;
pop edx
dec edx
cmp edx,x0[ebp]
jge WLFOR1
;
jmp EFTRET ;ワークエリアを解放
;
;
SCROLL_DOWN:
;
mov eax,vy0[ebp]
mul nxl[ebp]
add eax,x0[ebp]
dec eax
;
mov esi,buffer[ebp]
add esi,eax
mov mofs[ebp],esi
;
mov esi,layer[ebp]
add esi,eax
mov vx[ebp],esi
;
mov eax,vy1[ebp]
dec eax
mov esi,buffer[ebp]
mul nxl[ebp]
add eax,x0[ebp]
dec eax
add esi,eax
;
mov edx,vy0[ebp]
sub edx,3
SDFOR1: add edx,2
push edx
push esi
cmp edx,vy0[ebp]
jl SD1SKP
push edx
mov eax,nxl[ebp] ;Y*NXL
mul edx
pop edx
mov esi,x0[ebp]
sub esi,4
add esi,eax ;Y*NXL+X
SDFOR2: push esi
push edx
add esi,layer[ebp] ;グラフィックデータ格納アドレスを読み込む
mov edi,esi
add edi,nxl[ebp]
add edi,nxl[ebp]
mov ecx,nxl1[ebp]
;
SDFOR3: mov eax,fs:[ecx][esi]
mov fs:[ecx][edi],eax
sub ecx,3
loop SDFOR3
pop edx
pop esi
sub esi,nxl[ebp]
dec edx
cmp edx,vy0[ebp]
jge SDFOR2
;
mov esi,[esp]
SD1SKP: call SHPUTL
pop esi
pop edx
sub esi,nxl[ebp]
sub esi,nxl[ebp]
cmp esi,mofs[ebp]
jae SDFOR1
;
jmp EFTRET ;ワークエリアを解放
;
;
;
SCROLL_UP:
;
mov eax,vy1[ebp]
dec eax
mul nxl[ebp]
add eax,x0[ebp]
dec eax
;
mov esi,buffer[ebp]
add esi,eax
mov mofs[ebp],esi
;
mov esi,layer[ebp]
add esi,eax
mov vx[ebp],esi
;
mov eax,vy0[ebp]
mov esi,buffer[ebp]
mul nxl[ebp]
add eax,x0[ebp]
dec eax
add esi,eax
;
mov edx,vy1[ebp]
add edx,3
SUFOR1: sub edx,2
push edx
push esi
cmp edx,vy1[ebp]
ja SU1SKP
push edx
mov eax,nxl[ebp] ;Y*NXL
mul edx
pop edx
mov esi,x0[ebp]
sub esi,4
add esi,eax ;Y*NXL+X
SUFOR2: push esi
push edx
add esi,layer[ebp] ;グラフィックデータ格納アドレスを読み込む
mov edi,esi
sub edi,nxl[ebp]
sub edi,nxl[ebp]
mov ecx,nxl1[ebp]
;
SUFOR3: mov eax,fs:[ecx][esi]
mov fs:[ecx][edi],eax
sub ecx,3
loop SUFOR3
pop edx
pop esi
add esi,nxl[ebp]
inc edx
cmp edx,vy1[ebp]
jbe SUFOR2
;
mov esi,[esp]
SU1SKP: call SHPUTL
pop esi
pop edx
add esi,nxl[ebp]
add esi,nxl[ebp]
cmp esi,mofs[ebp]
jbe SUFOR1
;
jmp EFTRET ;ワークエリアを解放
;
;
SHPUTL: mov edi,vx[ebp]
mov edx,2
;
SHPUTf: mov ecx,nxl1[ebp]
;
SHFOR: mov al,[ecx][esi]
mov fs:[ecx][edi],al
loop SHFOR
add edi,nxl[ebp]
add esi,nxl[ebp]
dec edx
jnz SHPUTf
;
mov eax,speed[ebp]
mov edx,050h
mul edx
lea ecx,[eax+1]
SHWAIT: loop SHWAIT
ret
;
;
SCROLL_RIGHT:
;
mov eax,vy0[ebp]
mul nxl[ebp]
mov ebx,eax
add eax,x0[ebp]
;
mov esi,buffer[ebp]
add esi,eax
mov mofs[ebp],esi
;
mov esi,layer[ebp]
add esi,eax
mov vx[ebp],esi
;
mov esi,x1[ebp]
sub esi,3
add esi,ebx
add esi,buffer[ebp]
;
mov edx,x0[ebp]
sub edx,8
SRFOR1: add edx,4
push edx
push esi
cmp edx,x0[ebp]
jl SR1SKP
push edx
mov eax,vy0[ebp]
mul nxl[ebp]
pop edx
lea esi,[eax][edx]
mov ebx,nxl[ebp]
SRFOR2: push esi
push edx
add esi,layer[ebp] ;グラフィックデータ格納アドレスを読み込む
mov edi,esi
add edi,4
xor edx,edx
mov ecx,vy[ebp]
;
SRFOR3: mov eax,fs:[edx][esi]
mov fs:[edx][edi],eax
add edx,ebx
loop SRFOR3
pop edx
pop esi
sub esi,4
sub edx,4
cmp edx,x0[ebp]
jge SRFOR2
;
mov esi,[esp]
SR1SKP: call SVPUTL
pop esi
pop edx
sub esi,4
cmp esi,mofs[ebp]
jae SRFOR1
;
jmp EFTRET ;ワークエリアを解放
;
;
SCROLL_LEFT:
;
mov eax,pscm[ebp]
sub x1[ebp],eax
mov eax,vy0[ebp]
mul nxl[ebp]
mov ebx,eax
mov eax,x1[ebp]
sub eax,4
add eax,ebx
;
mov esi,buffer[ebp]
add esi,eax
mov mofs[ebp],esi
;
mov esi,layer[ebp]
add esi,eax
mov vx[ebp],esi
;
mov esi,x0[ebp]
add esi,ebx
add esi,buffer[ebp]
;
mov edx,x1[ebp]
add edx,4
SLFOR1: sub edx,4
push edx
push esi
cmp edx,x1[ebp]
ja SL1SKP
push edx
mov eax,vy0[ebp]
mul nxl[ebp]
pop edx
lea esi,[eax][edx]
mov ebx,nxl[ebp]
SLFOR2: push esi
push edx
add esi,layer[ebp] ;グラフィックデータ格納アドレスを読み込む
mov edi,esi
sub edi,4
xor edx,edx
mov ecx,vy[ebp]
;
SLFOR3: mov eax,fs:[edx][esi]
mov fs:[edx][edi],eax
add edx,ebx
loop SLFOR3
pop edx
pop esi
add esi,4
add edx,4
cmp edx,x1[ebp]
jbe SLFOR2
;
mov esi,[esp]
SL1SKP: call SVPUTL
pop esi
pop edx
add esi,4
cmp esi,mofs[ebp]
jbe SLFOR1
;
jmp EFTRET ;ワークエリアを解放
;
;
align 4
SVPUTL: mov edi,vx[ebp]
;
mov ebx,nxl[ebp]
xor edx,edx
mov ecx,vy[ebp]
;
SVFOR: mov eax,[edx][esi]
mov fs:[edx][edi],eax
add edx,ebx
loop SVFOR
;
mov eax,speed[ebp]
shl eax,2
mov edx,08ffh
mul edx
lea ecx,[eax+1]
SVWAIT: loop SVWAIT
ret
;
;
HORIZONTAL_CLOSE:
;
xor edx,edx
mov ebx,vy[ebp]
shr ebx,1
adc ebx,0
HCFOR1: push ebx
push edx
add edx,vy0[ebp]
;
call HZWIPE
;
mov edx,vy1[ebp]
sub edx,[esp]
;
call HZWIPE
;
mov ebx,0ffh
call WIPEWAIT
;
pop edx
pop ebx
inc edx
cmp edx,ebx
jbe HCFOR1
;
jmp EFTRET ;ワークエリアを解放
;
;
HORIZONTAL_OPEN:
;
mov ebx,0ffh
mov edx,vy[ebp]
shr edx,1
jnc HOFOR1
push edx
inc edx
add edx,vy0[ebp]
call HZWIPE
pop edx
HOFOR1: push edx
add edx,vy0[ebp]
;
call HZWIPE
;
mov edx,vy1[ebp]
sub edx,[esp]
;
call HZWIPE
;
call WIPEWAIT
;
pop edx
sub edx,1
jnc HOFOR1
;
jmp EFTRET ;ワークエリアを解放
;
HZWIPE: mov esi,buffer[ebp] ;グラフィックデータ格納アドレスを読み込む
mov edi,layer[ebp] ;転送先基準アドレスを読み込む
push ebx
mov eax,nxl[ebp] ;Y*NXL
mul edx
mov ecx,x0[ebp]
dec ecx
add ecx,eax ;Y*NXL+X
add esi,ecx
add edi,ecx
mov ecx,nxl1[ebp]
;
HZFOR: mov al,[ecx][esi]
mov fs:[ecx][edi],al
loop HZFOR
pop ebx
ret
;
;
VERTICAL_CLOSE:
;
mov edx,x1[ebp]
dec edx
add edx,pscm[ebp]
mov x1[ebp],edx
xor edx,edx
mov ebx,nxl1[ebp]
shr ebx,1
adc ebx,0
VCFOR1: push ebx
push edx
add edx,x0[ebp]
;
call VRWIPE
;
mov edx,x1[ebp]
sub edx,[esp]
;
call VRWIPE
;
mov ebx,0ffh
call WIPEWAIT
;
pop edx
pop ebx
inc edx
cmp edx,ebx
jbe VCFOR1
;
jmp EFTRET ;ワークエリアを解放
;
;
VERTICAL_OPEN:
;
mov ebx,x1[ebp]
dec ebx
add ebx,pscm[ebp]
mov x1[ebp],ebx
mov ebx,0ffh
mov edx,nxl1[ebp]
shr edx,1
jnc VOFOR1
push edx
inc edx
add edx,x0[ebp]
call VRWIPE
pop edx
VOFOR1: push edx
add edx,x0[ebp]
;
call VRWIPE
;
mov edx,x1[ebp]
sub edx,[esp]
;
call VRWIPE
;
call WIPEWAIT
;
pop edx
sub edx,1
jnc VOFOR1
;
jmp EFTRET ;ワークエリアを解放
;
VRWIPE: mov esi,buffer[ebp] ;グラフィックデータ格納アドレスを読み込む
mov edi,layer[ebp] ;転送先基準アドレスを読み込む
push ebx
add esi,edx
add edi,edx
mov ecx,vy[ebp]
mov eax,vy0[ebp]
mov ebx,nxl[ebp]
mul ebx
mov edx,eax
;
VRFOR: mov al,[edx][esi]
mov fs:[edx][edi],al
add edx,ebx
loop VRFOR
pop ebx
ret
;
ZOOM_CLOSE:
;
;
ZOOM_OPEN:
;
DOT_DISSOLVE: ;ディゾルブ(点)
;
DISSOLVE_MAIN:
push ds
push es
push dword PTR 120h ;1画面モードは120h
pop es
push dword PTR 014h ;データ
pop ds
mov ecx,8 ;dissolveのために8回全画面を書き込む
DDFOR1: mov edx,ecx ;ecxをedxに退避(GETPATDDに渡すため)
push ecx ;ループカウンタ保存
mov edi,layer[ebp] ;基準アドレス読み込み
mov esi,buffer[ebp] ;データバッファ(1画面分)の先頭アドレス
mov ecx,nyl[ebp] ;縦のライン数を読み込む
shr ecx,2 ;縦のパターン数を計算する
DDFOR2: push ecx ;1ラインのダブルワードカウンタを保存
mov ecx,4 ;1つのDissolveパターンのループライン数
DDFOR3: call GETPATDD ;Dissolveパターンを得る
push ecx ;
mov ecx,nxl[ebp] ;横1ラインのバイト数を計算する
shr ecx,2 ;横1ラインのダブルワード数を計算する
;
rep movsd ;データ転送
;
pop ecx ;1パターン終えたか?
loop DDFOR3 ;終えてなければループ
;
pop ecx ;1画面終えたか?
loop DDFOR2 ;終えてなければループ
;
cmp dword PTR [esp],1
je WAITSKIP
mov ecx,speed[ebp]
inc ecx
shl ecx,cl
shl ecx,10
DDWAITLP:
mov eax,speed[ebp]
loop DDWAITLP
;
WAITSKIP:
pop ecx ;8画面終えたか?
loop DDFOR1 ;終えてなければループ
;
pop es
pop ds
jmp EFTRET
;
align 4
DDPAT16 dd 0ffffffffh ;8
dd 0ffffffffh
dd 0ffffffffh
dd 0ffffffffh
;
dd 0ff0fff0fh ;7
dd 0f0fff0ffh
dd 00fff0fffh
dd 0fff0fff0h
;
dd 00f0f0f0fh ;6
dd 0f0fff0ffh
dd 00f0f0f0fh
dd 0fff0fff0h
;
dd 00f0f0f0fh ;5
dd 0f0f0f0f0h
dd 00f0f0f0fh
dd 0fff0fff0h
;
dd 00f0f0f0fh ;4
dd 0f0f0f0f0h
dd 00f0f0f0fh
dd 0f0f0f0f0h
;
dd 0000f000fh ;3
dd 000f000f0h
dd 00f000f00h
dd 0f000f000h
;
dd 000000000h ;2
dd 000f000f0h
dd 000000000h
dd 000f000f0h
;
dd 000000000h ;1
dd 000000000h
dd 000000000h
dd 0f000f000h
;
DDPAT32 dd 0ffffffffh ;8
dd 0ffffffffh
dd 0ffffffffh
dd 0ffffffffh
;
dd 000ffffffh ;7
dd 0ffffff00h
dd 000ffffffh
dd 0ffffff00h
;
dd 000ffff00h ;6
dd 0ffffff00h
dd 000ffff00h
dd 0ffffff00h
;
dd 000ffff00h ;5
dd 000ffff00h
dd 000ffff00h
dd 0ffffff00h
;
dd 000ffff00h ;4
dd 000ffff00h
dd 000ffff00h
dd 000ffff00h
;
dd 00000ff00h ;3
dd 000ff0000h
dd 00000ff00h
dd 000ff0000h
;
dd 000000000h ;2
dd 000ff0000h
dd 000000000h
dd 000ff0000h
;
dd 000000000h ;1
dd 000000000h
dd 000000000h
dd 000ff0000h
;
align 4
GETPATDD:
push edx
push ecx
;
mov eax,16 ;eaxに1パターンブロックのバイト数セット
sub edx,1 ;パターンオフセットカウンタ-1
mul edx ;パターンブロックオフセットを計算する
sub ecx,1 ;パターンラインカウンタ-1
lea eax,[eax][ecx*4] ;パターンオフセット計算
cmp pscm[ebp],0 ;スクリーンモードチェック
jz DDSC16 ;0なら16色モードへ
DDSC32: mov ebx,DDPAT32[eax] ;パターンを得る
jmp SETPAT
DDSC16: mov ebx,DDPAT16[eax] ;パターンを得る
SETPAT: mov al,0 ;パックドピクセルマスクレジスタ0
mov dx,0458h ;VRAMアクセスコントローラI/Oレジスタ
out dx,al ;パックドピクセルマスクレジスタ0有効
mov dx,045ah ;データレジスタ選択
mov eax,ebx ;パターン転送
out dx,ax ;パターン書き込み
;
; mov dx,045bh ;データレジスタ選択*
; shr eax,8 ;上位8ビットを下位に転送*
; out dx,al ;パターン書き込み*
;
mov al,1 ;パックドピクセルマスクレジスタ1
mov dx,0458h ;VRAMアクセスコントローラI/Oレジスタ
out dx,al ;パックドピクセルマスクレジスタ1有効
mov dx,045ah ;データレジスタ選択
mov eax,ebx ;パターン転送
shr eax,16 ;上位16ビットを下位に転送
out dx,ax ;パターン書き込み
;
; mov dx,045bh ;データレジスタ選択*
; shr eax,8 ;上位8ビットを下位に転送*
; out dx,al ;パターン書き込み*
;
pop ecx
pop edx
ret
;
;
;
LINE_DISSOLVE:
;
ife basflg
mov eax,12
mov ecx,pscm[ebp]
shr eax,cl
mov mofs[ebp],eax
endif
;
mov eax,speed[ebp]
inc eax
shl eax,1
mov speed[ebp],eax
xor eax,eax
LDFOR1: push eax ;for OFS=0 to MOFS-1 ;OFS
mov ebx,vy0[ebp] ;for Y=VY0 to VY1 STEP MOFS ;Y
LDFOR2: mov ecx,[esp] ;ecx=OFS
add ecx,ebx ;OFSY=OFS+Y
cmp ecx,vy1[ebp]
ja LDNXT2
mov esi,buffer[ebp] ;グラフィックデータ格納アドレスを読み込む
mov edi,layer[ebp] ;転送先基準アドレスを読み込む
mov eax,nxl[ebp]
mul ecx ;OFSY*NXL ;edx破壊
mov edx,x0[ebp] ;横方向開始アドレスオフセットをセット
add edx,eax ;OFSY*NXL+オフセット
dec edx
mov ecx,nxl1[ebp] ;1ライン分の転送バイト数をセットする
add esi,edx ;転送元対象ラインの始まりのアドレスをセット
add edi,edx ;転送先対象ラインの始まりのアドレスをセット
;
LD_LOP: mov al,[ecx][esi]
mov fs:[ecx][edi],al
loop LD_LOP
;
LDWAIT: push edx
mov eax,nyl[ebp]
sub eax,vy[ebp]
mov edx,30
inc eax
mul edx
mov ecx,eax
mov eax,1000
mul speed[ebp]
add ecx,eax
LDWTLP: loop LDWTLP
pop edx
;
LDNXT2: add ebx,mofs[ebp]
cmp ebx,vy1[ebp]
jbe LDFOR2
;
LDNXT1: pop eax
inc eax
cmp eax,mofs[ebp]
jb LDFOR1
jmp EFTRET ;ワークエリアを解放
;
SHIFT_DOWN:
;
mov eax,vy0[ebp]
mul nxl[ebp]
add eax,x0[ebp]
dec eax
;
mov esi,buffer[ebp]
add esi,eax
mov mofs[ebp],esi
;
mov esi,layer[ebp]
add esi,eax
mov vx[ebp],esi
;
mov eax,vy1[ebp]
dec eax
mov esi,buffer[ebp]
mul nxl[ebp]
add eax,x0[ebp]
dec eax
add esi,eax
;
SHDFR1: push esi
mov edx,vy1[ebp]
sub edx,2
push edx
mov eax,nxl[ebp] ;Y*NXL
mul edx
pop edx
mov esi,x0[ebp]
sub esi,4
add esi,eax ;Y*NXL+X
SHDFR2: push esi
push edx
add esi,layer[ebp] ;グラフィックデータ格納アドレスを読み込む
mov edi,esi
add edi,nxl[ebp]
add edi,nxl[ebp]
mov ecx,nxl1[ebp]
;
SHDFR3: mov eax,fs:[ecx][esi]
mov fs:[ecx][edi],eax
sub ecx,3
loop SHDFR3
pop edx
pop esi
sub esi,nxl[ebp]
dec edx
cmp edx,vy0[ebp]
jge SHDFR2
;
mov esi,[esp]
call SHPUTL
pop esi
sub esi,nxl[ebp]
sub esi,nxl[ebp]
cmp esi,mofs[ebp]
jae SHDFR1
;
jmp EFTRET ;ワークエリアを解放
;
;
;
SHIFT_UP:
;
mov eax,vy1[ebp]
dec eax
mul nxl[ebp]
add eax,x0[ebp]
dec eax
;
mov esi,buffer[ebp]
add esi,eax
mov mofs[ebp],esi
;
mov esi,layer[ebp]
add esi,eax
mov vx[ebp],esi
;
mov eax,vy0[ebp]
mov esi,buffer[ebp]
mul nxl[ebp]
add eax,x0[ebp]
dec eax
add esi,eax
;
SHUFR1: push esi
mov edx,vy0[ebp]
add edx,2
push edx
mov eax,nxl[ebp] ;Y*NXL
mul edx
pop edx
mov esi,x0[ebp]
sub esi,4
add esi,eax ;Y*NXL+X
SHUFR2: push esi
push edx
add esi,layer[ebp] ;グラフィックデータ格納アドレスを読み込む
mov edi,esi
sub edi,nxl[ebp]
sub edi,nxl[ebp]
mov ecx,nxl1[ebp]
;
SHUFR3: mov eax,fs:[ecx][esi]
mov fs:[ecx][edi],eax
sub ecx,3
loop SHUFR3
pop edx
pop esi
add esi,nxl[ebp]
inc edx
cmp edx,vy1[ebp]
jbe SHUFR2
;
mov esi,[esp]
call SHPUTL
pop esi
add esi,nxl[ebp]
add esi,nxl[ebp]
cmp esi,mofs[ebp]
jbe SHUFR1
;
jmp EFTRET ;ワークエリアを解放
;
;
;
;
SHIFT_RIGHT:
;
mov eax,vy0[ebp]
mul nxl[ebp]
mov ebx,eax
add eax,x0[ebp]
;
mov esi,buffer[ebp]
add esi,eax
mov mofs[ebp],esi
;
mov esi,layer[ebp]
add esi,eax
mov vx[ebp],esi
;
mov esi,x1[ebp]
sub esi,3
add esi,ebx
add esi,buffer[ebp]
mov edx,x1[ebp]
sub edx,8
;
SHRFR1: push edx
push esi
mov esi,edx
mov eax,vy0[ebp]
mul nxl[ebp]
mov edx,esi
add esi,eax
mov ebx,nxl[ebp]
SHRFR2: push esi
push edx
add esi,layer[ebp] ;グラフィックデータ格納アドレスを読み込む
mov edi,esi
add edi,4
xor edx,edx
mov ecx,vy[ebp]
;
SHRFR3: mov eax,fs:[edx][esi]
mov fs:[edx][edi],eax
add edx,ebx
loop SHRFR3
pop edx
pop esi
sub esi,4
sub edx,4
cmp edx,x0[ebp]
jge SHRFR2
;
mov esi,[esp]
call SVPUTL
pop esi
pop edx
sub esi,4
cmp esi,mofs[ebp]
jae SHRFR1
;
jmp EFTRET ;ワークエリアを解放
;
;
SHIFT_LEFT:
;
mov eax,pscm[ebp]
sub x1[ebp],eax
mov eax,vy0[ebp]
mul nxl[ebp]
mov ebx,eax
mov eax,x1[ebp]
sub eax,4
add eax,ebx
;
mov esi,buffer[ebp]
add esi,eax
mov mofs[ebp],esi
;
mov esi,layer[ebp]
add esi,eax
mov vx[ebp],esi
;
mov esi,x0[ebp]
add esi,ebx
add esi,buffer[ebp]
;
mov edx,x0[ebp]
add edx,4
SHLFR1: push edx
push esi
mov esi,edx
mov eax,vy0[ebp]
mul nxl[ebp]
mov edx,esi
add esi,eax
mov ebx,nxl[ebp]
SHLFR2: push esi
push edx
add esi,layer[ebp] ;グラフィックデータ格納アドレスを読み込む
mov edi,esi
sub edi,4
xor edx,edx
mov ecx,vy[ebp]
;
SHLFR3: mov eax,fs:[edx][esi]
mov fs:[edx][edi],eax
add edx,ebx
loop SHLFR3
pop edx
pop esi
add esi,4
add edx,4
cmp edx,x1[ebp]
jbe SHLFR2
;
mov esi,[esp]
call SVPUTL
pop esi
pop edx
add esi,4
cmp esi,mofs[ebp]
jbe SHLFR1
;
jmp EFTRET ;ワークエリアを解放
;
;
palette:
;
cmp dword PTR pscm[ebp],1
jz DOT_DISSOLVE ;32kモード時はディゾルブ(点)へ
;
EFTRET: pop ebx ;-
pop edi ;|
pop esi ;+High C用のレジスタ復帰
pop ebp ;-
add esp,worklng ;ワークエリアを解放
ret
;
;
;
EFFECT endp
CODE ends
end