home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 3 / FREEWARE.BIN / towns_os / pmgf / src / effect.asm < prev    next >
Assembly Source File  |  1980-01-02  |  23KB  |  1,328 lines

  1.  
  2.     .386p
  3.  
  4.     PUBLIC    EFFECT
  5.     
  6. param    struc
  7. vx    dd    ?    ;横方向ドット数
  8. vy    dd    ?    ;縦方向ドット数
  9. nxl    dd    ?    ;横方向バイト数(仮想画面のバイト数)
  10. nxl1    dd    ?    ;横方向バイト数(実効画面のバイト数)
  11. x0    dd    ?    ;1ライン中の始めのオフセット
  12. x1    dd    ?    ;1ライン中の終わりのオフセット
  13. nyl    dd    ?    ;縦方向の仮想画面のドット数
  14. tmp    dd    ?    ;テンポラリ変数エリア
  15. ;
  16.     dd    ?    ;使用禁止
  17. command    dd    ?    ;EFFECTコマンド番号
  18. buffer    dd    ?    ;バッファアドレス
  19. vx0    dd    ?    ;x左上ポイント
  20. vy0    dd    ?    ;y左上ポイント
  21. vx1    dd    ?    ;x右下ポイント
  22. vy1    dd    ?    ;y右下ポイント
  23. mofs    dd    ?    ;間隔幅(basflgが0の時は自動設定)
  24.             ;Dot-Dissolve時
  25.             ;    [mofs] Mask Pattern Add. / Mask Region Add.
  26. speed    dd    ?    ;スピード
  27. pscm    dd    ?    ;スクリーンモード(0,1)
  28. layer    dd    ?    ;出力レイア(0,1)
  29. param    ends
  30.  
  31.  
  32. worklng    EQU    4*8    ;確保するワークエリアのバイト数
  33. dbf    EQU    0    ;デバッグモードフラグ(0:Debug Mode Off 1:On)
  34. basflg    EQU    0    ;BASICモードフラグ
  35. ;    
  36. ;    MACRO
  37. debug    macro    val
  38.     pushf
  39.     pushad
  40.     mov    eax,val
  41.     and    eax,4fh
  42.     mov    edx,04ech    ;Volume Meter
  43.     out    dx,al
  44.     popad
  45.     popf
  46.     endm
  47.  
  48. debugs    macro    val,val2
  49.     pushf
  50.     push    eax
  51.     push    edx
  52.     mov    eax,val
  53.     shl    eax,val2
  54.     and    eax,4fh
  55.     mov    edx,04ech    ;Volume Meter
  56.     out    dx,al
  57.     pop    edx
  58.     pop    eax
  59.     popf
  60.     endm
  61.  
  62. debugl    macro    val,val2
  63.     pushf
  64.     push    eax
  65.     push    edx
  66.     mov    eax,val
  67.     and    eax,4fh
  68.     mov    edx,04ech    ;Volume Meter
  69.     out    dx,al
  70.     mov    eax,val2
  71.     out    dx,al
  72.     pop    edx
  73.     pop    eax
  74.     popf
  75.     endm
  76.  
  77. djmp    macro    val,val2
  78.     if     dbf
  79.     cmp    dword PTR dflag[ebp],val
  80.     je    val2
  81.     endif
  82.     endm
  83.     
  84. CODE    segment dword public ER use32 'CODE'
  85.     assume cs:CODE
  86.  
  87. ;    
  88. ;    Graphics Data Spread Routine for High C 1.4
  89. ;    
  90. ;    cmd,add,vx0,vy0,vx1,vy1,Dot Width,speed,Screen Mode,Layer
  91.     db    'EFFECT',6    ;use for High C Compiler 1.4
  92. EFFECT    proc    near
  93. START:    sub    esp,worklng    ;ワークエリアの確保
  94.     mov    eax,esp        ;-
  95.     push    ebp        ;|
  96.     push    esi        ;+High C用のレジスタ保存
  97.     push    edi        ;|
  98.     push    ebx        ;-
  99.     mov    ebp,eax        ;パラメータアドレスをebpにセット
  100.     cld            ;自動増加を指定
  101. ;
  102.     push    dword PTR 120h    ;1画面モードは120h
  103.     pop    fs        ;fsにVRAMセレクタ値をセットする
  104.     mov    edi,40000h    ;VRAM基準アドレスを設定する
  105.     mov    eax,layer[ebp]    ;設定値を読み込む
  106.     mul    edi        ;計算
  107.     mov    edi,eax
  108.     mov    layer[ebp],edi    ;基準アドレスを書き込む
  109. ;
  110.     mov    ecx,pscm[ebp]    ;スクリーンモードを読み込む
  111.     mov    ebx,vy1[ebp]    ;縦方向の長さ(ドット数)を計算する
  112.     mov    eax,512
  113.     shr    eax,cl        ;仮想画面の縦方向のドット数
  114.     cmp    ebx,eax        ;もし、指定されたvy1が仮想画面をはみ出していたら
  115.     jb    CALY        ;修正する
  116.     mov    ebx,eax
  117.     dec    ebx
  118. CALY:    sub    ebx,vy0[ebp]
  119.     inc    ebx
  120.     mov    vy[ebp],ebx    ;VY(縦方向の長さ)を書き込む
  121. ;
  122.     mov    ebx,vx1[ebp]    ;横方向の長さ(ドット数)を計算する
  123.     mov    eax,1024
  124.     shr    eax,cl        ;仮想画面の横方向のドット数
  125.     cmp    ebx,eax        ;もし、指定されたvx1が仮想画面をはみ出していたら
  126.     jb    CALX        ;修正する
  127.     mov    ebx,eax
  128.     dec    ebx
  129. CALX:    sub    ebx,vx0[ebp]
  130.     inc    ebx
  131.     mov    vx[ebp],ebx    ;VX(横方向の長さ)を書き込む
  132. ;
  133.     cmp    cl,1        ;スクリーンモードが1なら32768色設定モードへ
  134.     je    SC32
  135. ;
  136. SC16:    mov    dword PTR nyl[ebp],512    ;仮想画面の縦方向のドット数
  137.     mov    dword PTR nxl[ebp],200h    ;仮想画面の横方向バイト数
  138.     add    ebx,7        ;実効画面の横方向のバイト数に7を足す
  139.     shr    ebx,3        ;\8
  140.     shl    ebx,2        ;*4
  141.     add    ebx,3        ;+3
  142.     and    ebx,0fffffffch    ;\4*4
  143.     mov    nxl1[ebp],ebx    ;NXL1(実効画面の横方向のバイト数)をセット
  144.     mov    ebx,vx0[ebp]    ;実効画面の左端x座標を読み込む
  145.     shr    ebx,3        ;\8
  146.     shl    ebx,2        ;*4
  147.     mov    x0[ebp],ebx    ;X0(実効画面の始まりの横オフセット)を書き込む
  148.     add    ebx,nxl1[ebp]
  149. ;    dec    ebx
  150.     mov    x1[ebp],ebx    ;X1(実効画面の終わりの横オフセット)を書き込む
  151.     jmp    CMDBCT        ;コマンド分岐ルーチンへジャンプ
  152. ;
  153. EFFECT_BASE    dd    WIPE_DOWN    ;各効果のエントリルーチンのテーブル
  154.         dd    WIPE_UP
  155.         dd    WIPE_RIGHT
  156.         dd    WIPE_LEFT
  157.         dd    SCROLL_DOWN
  158.         dd    SCROLL_UP
  159.         dd    SCROLL_RIGHT
  160.         dd    SCROLL_LEFT
  161.         dd    HORIZONTAL_CLOSE
  162.         dd    HORIZONTAL_OPEN
  163.         dd    VERTICAL_CLOSE
  164.         dd    VERTICAL_OPEN
  165.         dd    ZOOM_CLOSE
  166.         dd    ZOOM_OPEN
  167.         dd    DOT_DISSOLVE
  168.         dd    LINE_DISSOLVE
  169.         dd    SHIFT_DOWN
  170.         dd    SHIFT_UP
  171.         dd    SHIFT_RIGHT
  172.         dd    SHIFT_LEFT
  173.         dd    PALETTE
  174. ;
  175. SC32:    mov    dword PTR nyl[ebp],256    ;仮想画面の縦方向のドット数
  176.     mov    dword PTR nxl[ebp],400h    ;仮想画面の横方向のバイト数
  177.     shl    ebx,1        ;実効画面の横方向のバイト数を2倍する
  178.     mov    nxl1[ebp],ebx    ;NXL1(実効画面の横方向のバイト数)をセット
  179.     mov    ebx,vx0[ebp]    ;実効画面の左端x座標を読み込む
  180.     shl    ebx,1        ;*2
  181.     mov    x0[ebp],ebx    ;X0(実効画面の始まりの横オフセット)を書き込む
  182.     mov    ebx,vx1[ebp]    ;実効画面の右端x座標を読み込む
  183.     shl    ebx,1        ;*2
  184.     inc    ebx        ;+1
  185.     mov    x1[ebp],ebx    ;X1(実効画面の終わりの横オフセット)を書き込む
  186. ;
  187. CMDBCT:    mov    eax,command[ebp]    ;コマンドを読み込む
  188.     sub    eax,30h            ;30hを引く
  189.     js    NOMAL            ;0以下なら効果無しへ
  190.     jmp    EFFECT_BASE[eax*4]    ;それぞれの効果ルーチンへ
  191. ;
  192. NOMAL:    
  193.     xor    ebx,ebx
  194.     jmp    NOMALIN
  195. ;
  196. ;
  197. WIPEWAIT:
  198.     mov    eax,ebx
  199.     mov    ecx,speed[ebp]
  200.     inc    ecx
  201.     shl    ecx,3
  202.     mul    ecx
  203.     mov    ecx,eax
  204.     inc    ecx
  205. WIPELP:    loop    WIPELP
  206.     ret
  207. ;
  208. ;
  209. WIPE_DOWN:
  210.     mov    ebx,0ffh
  211. ;
  212. NOMALIN:
  213.     mov    edx,vy0[ebp]
  214. WDFOR1:    mov    esi,buffer[ebp]    ;グラフィックデータ格納アドレスを読み込む
  215.     mov    edi,layer[ebp]    ;転送先基準アドレスを読み込む
  216.     push    edx
  217.     push    ebx
  218.     mov    eax,nxl[ebp]    ;Y*NXL
  219.     mul    edx
  220.     mov    ecx,x0[ebp]
  221.     dec    ecx
  222.     add    ecx,eax        ;Y*NXL+X
  223.     add    esi,ecx
  224.     add    edi,ecx
  225.     mov    ecx,nxl1[ebp]
  226. ;
  227. WDFOR2:    mov    al,[ecx][esi]
  228.     mov    fs:[ecx][edi],al
  229.     loop    WDFOR2
  230.     pop    ebx
  231. ;
  232. WDWAIT:    cmp    ebx,0
  233.     jz    WDWSKP
  234.     call    WIPEWAIT
  235. WDWSKP:
  236. ;
  237.     pop    edx
  238.     inc    edx
  239.     cmp    edx,vy1[ebp]
  240.     jbe    WDFOR1
  241. ;
  242.     jmp    EFTRET    ;ワークエリアを解放
  243. ;
  244. ;
  245. WIPE_UP:
  246. ;
  247.     mov    ebx,0ffh
  248.     mov    edx,vy1[ebp]
  249. WUFOR1:    mov    esi,buffer[ebp]    ;グラフィックデータ格納アドレスを読み込む
  250.     mov    edi,layer[ebp]    ;転送先基準アドレスを読み込む
  251.     push    edx
  252.     push    ebx
  253.     mov    eax,nxl[ebp]    ;Y*NXL
  254.     mul    edx
  255.     mov    ecx,x0[ebp]
  256.     dec    ecx
  257.     add    ecx,eax        ;Y*NXL+X
  258.     add    esi,ecx
  259.     add    edi,ecx
  260.     mov    ecx,nxl1[ebp]
  261. ;
  262. WUFOR2:    mov    al,[ecx][esi]
  263.     mov    fs:[ecx][edi],al
  264.     loop    WUFOR2
  265.     pop    ebx
  266. ;
  267.     call    WIPEWAIT
  268. ;
  269.     pop    edx
  270.     dec    edx
  271.     cmp    edx,vy0[ebp]
  272.     jge    WUFOR1
  273. ;
  274.     jmp    EFTRET    ;ワークエリアを解放
  275. ;
  276. ;
  277. WIPE_RIGHT:
  278. ;
  279.     mov    ebx,x1[ebp]
  280.     dec    ebx
  281.     add    ebx,pscm[ebp]
  282.     mov    x1[ebp],ebx
  283.     mov    ebx,0ffh
  284.     mov    edx,x0[ebp]
  285. WRFOR1:    mov    esi,buffer[ebp]    ;グラフィックデータ格納アドレスを読み込む
  286.     mov    edi,layer[ebp]    ;転送先基準アドレスを読み込む
  287.     push    edx
  288.     push    ebx
  289.     add    esi,edx
  290.     add    edi,edx
  291. ;
  292.     mov    ebx,nxl[ebp]
  293.     mov    eax,vy0[ebp]
  294.     mul    ebx
  295.     mov    edx,eax
  296.     mov    ecx,vy[ebp]
  297. ;
  298. WRFOR2:    mov    al,[edx][esi]
  299.     mov    fs:[edx][edi],al
  300.     add    edx,ebx
  301.     loop    WRFOR2
  302.     pop    ebx
  303. ;
  304.     call    WIPEWAIT
  305. ;
  306.     pop    edx
  307.     inc    edx
  308.     cmp    edx,x1[ebp]
  309.     jbe    WRFOR1
  310. ;
  311.     jmp    EFTRET    ;ワークエリアを解放
  312. ;
  313. ;
  314. WIPE_LEFT:
  315. ;
  316.     mov    ebx,0ffh
  317.     mov    edx,x1[ebp]
  318.     dec    edx        ;*
  319.     add    edx,pscm[ebp]    ;32000色モード時の補正
  320. WLFOR1:    mov    esi,buffer[ebp]    ;グラフィックデータ格納アドレスを読み込む
  321.     mov    edi,layer[ebp]    ;転送先基準アドレスを読み込む
  322.     push    edx
  323.     push    ebx
  324.     add    esi,edx
  325.     add    edi,edx
  326. ;
  327.     mov    ebx,nxl[ebp]
  328.     mov    eax,vy0[ebp]
  329.     mul    ebx
  330.     mov    edx,eax
  331.     mov    ecx,vy[ebp]
  332. ;
  333. WLFOR2:    mov    al,[edx][esi]
  334.     mov    fs:[edx][edi],al
  335.     add    edx,ebx
  336.     loop    WLFOR2
  337.     pop    ebx
  338. ;
  339.     call    WIPEWAIT
  340. ;
  341.     pop    edx
  342.     dec    edx
  343.     cmp    edx,x0[ebp]
  344.     jge    WLFOR1
  345. ;
  346.     jmp    EFTRET    ;ワークエリアを解放
  347.  
  348. ;
  349. ;
  350. SCROLL_DOWN:
  351. ;
  352.     mov    eax,vy0[ebp]
  353.     mul    nxl[ebp]
  354.     add    eax,x0[ebp]
  355.     dec    eax
  356. ;
  357.     mov    esi,buffer[ebp]
  358.     add    esi,eax
  359.     mov    mofs[ebp],esi
  360. ;
  361.     mov    esi,layer[ebp]
  362.     add    esi,eax
  363.     mov    vx[ebp],esi
  364. ;
  365.     mov    eax,vy1[ebp]
  366.     dec    eax
  367.     mov    esi,buffer[ebp]
  368.     mul    nxl[ebp]
  369.     add    eax,x0[ebp]
  370.     dec    eax
  371.     add    esi,eax
  372. ;
  373.     mov    edx,vy0[ebp]
  374.     sub    edx,3
  375. SDFOR1:    add    edx,2
  376.     push    edx
  377.     push    esi
  378.     cmp    edx,vy0[ebp]
  379.     jl    SD1SKP
  380.     push    edx
  381.     mov    eax,nxl[ebp]    ;Y*NXL
  382.     mul    edx
  383.     pop    edx
  384.     mov    esi,x0[ebp]
  385.     sub    esi,4
  386.     add    esi,eax        ;Y*NXL+X
  387. SDFOR2:    push    esi
  388.     push    edx
  389.     add    esi,layer[ebp]    ;グラフィックデータ格納アドレスを読み込む
  390.     mov    edi,esi
  391.     add    edi,nxl[ebp]
  392.     add    edi,nxl[ebp]
  393.     mov    ecx,nxl1[ebp]
  394. ;
  395. SDFOR3:    mov    eax,fs:[ecx][esi]
  396.     mov    fs:[ecx][edi],eax
  397.     sub    ecx,3
  398.     loop    SDFOR3
  399.     pop    edx
  400.     pop    esi
  401.     sub    esi,nxl[ebp]
  402.     dec    edx
  403.     cmp    edx,vy0[ebp]
  404.     jge    SDFOR2
  405. ;
  406.     mov    esi,[esp]
  407. SD1SKP:    call    SHPUTL
  408.     pop    esi
  409.     pop    edx
  410.     sub    esi,nxl[ebp]
  411.     sub    esi,nxl[ebp]
  412.     cmp    esi,mofs[ebp]
  413.     jae    SDFOR1
  414. ;
  415.     jmp    EFTRET    ;ワークエリアを解放
  416. ;
  417. ;
  418. ;
  419. SCROLL_UP:
  420. ;
  421.     mov    eax,vy1[ebp]
  422.     dec    eax
  423.     mul    nxl[ebp]
  424.     add    eax,x0[ebp]
  425.     dec    eax
  426. ;
  427.     mov    esi,buffer[ebp]
  428.     add    esi,eax
  429.     mov    mofs[ebp],esi
  430. ;
  431.     mov    esi,layer[ebp]
  432.     add    esi,eax
  433.     mov    vx[ebp],esi
  434. ;
  435.     mov    eax,vy0[ebp]
  436.     mov    esi,buffer[ebp]
  437.     mul    nxl[ebp]
  438.     add    eax,x0[ebp]
  439.     dec    eax
  440.     add    esi,eax
  441. ;
  442.     mov    edx,vy1[ebp]
  443.     add    edx,3
  444. SUFOR1:    sub    edx,2
  445.     push    edx
  446.     push    esi
  447.     cmp    edx,vy1[ebp]
  448.     ja    SU1SKP
  449.     push    edx
  450.     mov    eax,nxl[ebp]    ;Y*NXL
  451.     mul    edx
  452.     pop    edx
  453.     mov    esi,x0[ebp]
  454.     sub    esi,4
  455.     add    esi,eax        ;Y*NXL+X
  456. SUFOR2:    push    esi
  457.     push    edx
  458.     add    esi,layer[ebp]    ;グラフィックデータ格納アドレスを読み込む
  459.     mov    edi,esi
  460.     sub    edi,nxl[ebp]
  461.     sub    edi,nxl[ebp]
  462.     mov    ecx,nxl1[ebp]
  463. ;
  464. SUFOR3:    mov    eax,fs:[ecx][esi]
  465.     mov    fs:[ecx][edi],eax
  466.     sub    ecx,3
  467.     loop    SUFOR3
  468.     pop    edx
  469.     pop    esi
  470.     add    esi,nxl[ebp]
  471.     inc    edx
  472.     cmp    edx,vy1[ebp]
  473.     jbe    SUFOR2
  474. ;
  475.     mov    esi,[esp]
  476. SU1SKP:    call    SHPUTL
  477.     pop    esi
  478.     pop    edx
  479.     add    esi,nxl[ebp]
  480.     add    esi,nxl[ebp]
  481.     cmp    esi,mofs[ebp]
  482.     jbe    SUFOR1
  483. ;
  484.     jmp    EFTRET    ;ワークエリアを解放
  485. ;
  486. ;
  487. SHPUTL:    mov    edi,vx[ebp]
  488.     mov    edx,2
  489. ;
  490. SHPUTf:    mov    ecx,nxl1[ebp]
  491. ;
  492. SHFOR:    mov    al,[ecx][esi]
  493.     mov    fs:[ecx][edi],al
  494.     loop    SHFOR
  495.     add    edi,nxl[ebp]
  496.     add    esi,nxl[ebp]
  497.     dec    edx
  498.     jnz    SHPUTf
  499. ;
  500.     mov    eax,speed[ebp]
  501.     mov    edx,050h
  502.     mul    edx
  503.     lea    ecx,[eax+1]
  504. SHWAIT:    loop    SHWAIT
  505.     ret
  506. ;
  507. ;
  508. SCROLL_RIGHT:
  509. ;
  510.     mov    eax,vy0[ebp]
  511.     mul    nxl[ebp]
  512.     mov    ebx,eax
  513.     add    eax,x0[ebp]
  514. ;
  515.     mov    esi,buffer[ebp]
  516.     add    esi,eax
  517.     mov    mofs[ebp],esi
  518. ;
  519.     mov    esi,layer[ebp]
  520.     add    esi,eax
  521.     mov    vx[ebp],esi
  522. ;
  523.     mov    esi,x1[ebp]
  524.     sub    esi,3
  525.     add    esi,ebx
  526.     add    esi,buffer[ebp]
  527. ;
  528.     mov    edx,x0[ebp]
  529.     sub    edx,8
  530. SRFOR1:    add    edx,4
  531.     push    edx
  532.     push    esi
  533.     cmp    edx,x0[ebp]
  534.     jl    SR1SKP
  535.     push    edx
  536.     mov    eax,vy0[ebp]
  537.     mul    nxl[ebp]
  538.     pop    edx
  539.     lea    esi,[eax][edx]
  540.     mov    ebx,nxl[ebp]
  541. SRFOR2:    push    esi
  542.     push    edx
  543.     add    esi,layer[ebp]    ;グラフィックデータ格納アドレスを読み込む
  544.     mov    edi,esi
  545.     add    edi,4
  546.     xor    edx,edx
  547.     mov    ecx,vy[ebp]
  548. ;
  549. SRFOR3:    mov    eax,fs:[edx][esi]
  550.     mov    fs:[edx][edi],eax
  551.     add    edx,ebx
  552.     loop    SRFOR3
  553.     pop    edx
  554.     pop    esi
  555.     sub    esi,4
  556.     sub    edx,4
  557.     cmp    edx,x0[ebp]
  558.     jge    SRFOR2
  559. ;
  560.     mov    esi,[esp]
  561. SR1SKP:    call    SVPUTL
  562.     pop    esi
  563.     pop    edx
  564.     sub    esi,4
  565.     cmp    esi,mofs[ebp]
  566.     jae    SRFOR1
  567. ;
  568.     jmp    EFTRET    ;ワークエリアを解放
  569. ;
  570. ;
  571. SCROLL_LEFT:
  572. ;
  573.     mov    eax,pscm[ebp]
  574.     sub    x1[ebp],eax
  575.     mov    eax,vy0[ebp]
  576.     mul    nxl[ebp]
  577.     mov    ebx,eax
  578.     mov    eax,x1[ebp]
  579.     sub    eax,4
  580.     add    eax,ebx
  581. ;
  582.     mov    esi,buffer[ebp]
  583.     add    esi,eax
  584.     mov    mofs[ebp],esi
  585. ;
  586.     mov    esi,layer[ebp]
  587.     add    esi,eax
  588.     mov    vx[ebp],esi
  589. ;
  590.     mov    esi,x0[ebp]
  591.     add    esi,ebx
  592.     add    esi,buffer[ebp]
  593. ;
  594.     mov    edx,x1[ebp]
  595.     add    edx,4
  596. SLFOR1:    sub    edx,4
  597.     push    edx
  598.     push    esi
  599.     cmp    edx,x1[ebp]
  600.     ja    SL1SKP
  601.     push    edx
  602.     mov    eax,vy0[ebp]
  603.     mul    nxl[ebp]
  604.     pop    edx
  605.     lea    esi,[eax][edx]
  606.     mov    ebx,nxl[ebp]
  607. SLFOR2:    push    esi
  608.     push    edx
  609.     add    esi,layer[ebp]    ;グラフィックデータ格納アドレスを読み込む
  610.     mov    edi,esi
  611.     sub    edi,4
  612.     xor    edx,edx
  613.     mov    ecx,vy[ebp]
  614. ;
  615. SLFOR3:    mov    eax,fs:[edx][esi]
  616.     mov    fs:[edx][edi],eax
  617.     add    edx,ebx
  618.     loop    SLFOR3
  619.     pop    edx
  620.     pop    esi
  621.     add    esi,4
  622.     add    edx,4
  623.     cmp    edx,x1[ebp]
  624.     jbe    SLFOR2
  625. ;
  626.     mov    esi,[esp]
  627. SL1SKP:    call    SVPUTL
  628.     pop    esi
  629.     pop    edx
  630.     add    esi,4
  631.     cmp    esi,mofs[ebp]
  632.     jbe    SLFOR1
  633. ;
  634.     jmp    EFTRET    ;ワークエリアを解放
  635. ;
  636. ;
  637.     align    4
  638. SVPUTL:    mov    edi,vx[ebp]
  639. ;
  640.     mov    ebx,nxl[ebp]
  641.     xor    edx,edx
  642.     mov    ecx,vy[ebp]
  643. ;
  644. SVFOR:    mov    eax,[edx][esi]
  645.     mov    fs:[edx][edi],eax
  646.     add    edx,ebx
  647.     loop    SVFOR
  648. ;
  649.     mov    eax,speed[ebp]
  650.     shl    eax,2
  651.     mov    edx,08ffh
  652.     mul    edx
  653.     lea    ecx,[eax+1]
  654. SVWAIT:    loop    SVWAIT
  655.     ret
  656. ;
  657. ;
  658. HORIZONTAL_CLOSE:
  659. ;
  660.     xor    edx,edx
  661.     mov    ebx,vy[ebp]
  662.     shr    ebx,1
  663.     adc    ebx,0
  664. HCFOR1:    push    ebx
  665.     push    edx
  666.     add    edx,vy0[ebp]
  667. ;
  668.     call    HZWIPE
  669. ;
  670.     mov    edx,vy1[ebp]
  671.     sub    edx,[esp]
  672. ;
  673.     call    HZWIPE
  674. ;
  675.     mov    ebx,0ffh
  676.     call    WIPEWAIT
  677. ;
  678.     pop    edx
  679.     pop    ebx
  680.     inc    edx
  681.     cmp    edx,ebx
  682.     jbe    HCFOR1
  683. ;
  684.     jmp    EFTRET    ;ワークエリアを解放
  685. ;
  686. ;
  687. HORIZONTAL_OPEN:
  688. ;
  689.     mov    ebx,0ffh
  690.     mov    edx,vy[ebp]
  691.     shr    edx,1
  692.     jnc    HOFOR1
  693.     push    edx
  694.     inc    edx
  695.     add    edx,vy0[ebp]
  696.     call    HZWIPE
  697.     pop    edx
  698. HOFOR1:    push    edx
  699.     add    edx,vy0[ebp]
  700. ;
  701.     call    HZWIPE
  702. ;
  703.     mov    edx,vy1[ebp]
  704.     sub    edx,[esp]
  705. ;
  706.     call    HZWIPE
  707. ;
  708.     call    WIPEWAIT
  709. ;
  710.     pop    edx
  711.     sub    edx,1
  712.     jnc    HOFOR1
  713. ;
  714.     jmp    EFTRET    ;ワークエリアを解放
  715. ;
  716. HZWIPE:    mov    esi,buffer[ebp]    ;グラフィックデータ格納アドレスを読み込む
  717.     mov    edi,layer[ebp]    ;転送先基準アドレスを読み込む
  718.     push    ebx
  719.     mov    eax,nxl[ebp]    ;Y*NXL
  720.     mul    edx
  721.     mov    ecx,x0[ebp]
  722.     dec    ecx
  723.     add    ecx,eax        ;Y*NXL+X
  724.     add    esi,ecx
  725.     add    edi,ecx
  726.     mov    ecx,nxl1[ebp]
  727. ;
  728. HZFOR:    mov    al,[ecx][esi]
  729.     mov    fs:[ecx][edi],al
  730.     loop    HZFOR
  731.     pop    ebx
  732.     ret
  733. ;
  734. ;
  735. VERTICAL_CLOSE:
  736. ;
  737.     mov    edx,x1[ebp]
  738.     dec    edx
  739.     add    edx,pscm[ebp]
  740.     mov    x1[ebp],edx
  741.     xor    edx,edx
  742.     mov    ebx,nxl1[ebp]
  743.     shr    ebx,1
  744.     adc    ebx,0
  745. VCFOR1:    push    ebx
  746.     push    edx
  747.     add    edx,x0[ebp]
  748. ;
  749.     call    VRWIPE
  750. ;
  751.     mov    edx,x1[ebp]
  752.     sub    edx,[esp]
  753. ;
  754.     call    VRWIPE
  755. ;
  756.     mov    ebx,0ffh
  757.     call    WIPEWAIT
  758. ;
  759.     pop    edx
  760.     pop    ebx
  761.     inc    edx
  762.     cmp    edx,ebx
  763.     jbe    VCFOR1
  764. ;
  765.     jmp    EFTRET    ;ワークエリアを解放
  766. ;
  767. ;
  768. VERTICAL_OPEN:
  769. ;
  770.     mov    ebx,x1[ebp]
  771.     dec    ebx
  772.     add    ebx,pscm[ebp]
  773.     mov    x1[ebp],ebx
  774.     mov    ebx,0ffh
  775.     mov    edx,nxl1[ebp]
  776.     shr    edx,1
  777.     jnc    VOFOR1
  778.     push    edx
  779.     inc    edx
  780.     add    edx,x0[ebp]
  781.     call    VRWIPE
  782.     pop    edx
  783. VOFOR1:    push    edx
  784.     add    edx,x0[ebp]
  785. ;
  786.     call    VRWIPE
  787. ;
  788.     mov    edx,x1[ebp]
  789.     sub    edx,[esp]
  790. ;
  791.     call    VRWIPE
  792. ;
  793.     call    WIPEWAIT
  794. ;
  795.     pop    edx
  796.     sub    edx,1
  797.     jnc    VOFOR1
  798. ;
  799.     jmp    EFTRET    ;ワークエリアを解放
  800. ;
  801. VRWIPE:    mov    esi,buffer[ebp]    ;グラフィックデータ格納アドレスを読み込む
  802.     mov    edi,layer[ebp]    ;転送先基準アドレスを読み込む
  803.     push    ebx
  804.     add    esi,edx
  805.     add    edi,edx
  806.     mov    ecx,vy[ebp]
  807.     mov    eax,vy0[ebp]
  808.     mov    ebx,nxl[ebp]
  809.     mul    ebx
  810.     mov    edx,eax
  811. ;
  812. VRFOR:    mov    al,[edx][esi]
  813.     mov    fs:[edx][edi],al
  814.     add    edx,ebx
  815.     loop    VRFOR
  816.     pop    ebx
  817.     ret
  818. ;
  819. ZOOM_CLOSE:
  820. ;
  821. ;
  822. ZOOM_OPEN:
  823. ;
  824. DOT_DISSOLVE:        ;ディゾルブ(点)
  825. ;
  826. DISSOLVE_MAIN:
  827.     push    ds
  828.     push    es
  829.     push    dword PTR 120h    ;1画面モードは120h
  830.     pop    es
  831.     push    dword PTR 014h    ;データ
  832.     pop    ds
  833.     mov    ecx,8        ;dissolveのために8回全画面を書き込む
  834. DDFOR1:    mov    edx,ecx        ;ecxをedxに退避(GETPATDDに渡すため)
  835.     push    ecx        ;ループカウンタ保存
  836.     mov    edi,layer[ebp]    ;基準アドレス読み込み
  837.     mov    esi,buffer[ebp]    ;データバッファ(1画面分)の先頭アドレス
  838.     mov    ecx,nyl[ebp]    ;縦のライン数を読み込む
  839.     shr    ecx,2        ;縦のパターン数を計算する
  840. DDFOR2:    push    ecx        ;1ラインのダブルワードカウンタを保存
  841.     mov    ecx,4        ;1つのDissolveパターンのループライン数
  842. DDFOR3:    call    GETPATDD    ;Dissolveパターンを得る
  843.     push    ecx        ;
  844.     mov    ecx,nxl[ebp]    ;横1ラインのバイト数を計算する
  845.     shr    ecx,2        ;横1ラインのダブルワード数を計算する
  846. ;
  847. rep    movsd            ;データ転送
  848. ;
  849.     pop    ecx        ;1パターン終えたか?
  850.     loop    DDFOR3        ;終えてなければループ
  851. ;
  852.     pop    ecx        ;1画面終えたか?
  853.     loop    DDFOR2        ;終えてなければループ
  854. ;
  855.     cmp    dword PTR [esp],1
  856.     je    WAITSKIP
  857.     mov    ecx,speed[ebp]
  858.     inc    ecx
  859.     shl    ecx,cl
  860.     shl    ecx,10
  861. DDWAITLP:
  862.     mov    eax,speed[ebp]
  863.     loop    DDWAITLP
  864.  
  865. ;
  866. WAITSKIP:
  867.     pop    ecx        ;8画面終えたか?
  868.     loop    DDFOR1        ;終えてなければループ
  869. ;
  870.     pop    es
  871.     pop    ds
  872.     jmp    EFTRET
  873. ;
  874.     align    4
  875. DDPAT16    dd    0ffffffffh    ;8
  876.     dd    0ffffffffh
  877.     dd    0ffffffffh
  878.     dd    0ffffffffh
  879. ;
  880.     dd    0ff0fff0fh    ;7
  881.     dd    0f0fff0ffh
  882.     dd    00fff0fffh
  883.     dd    0fff0fff0h
  884. ;
  885.     dd    00f0f0f0fh    ;6
  886.     dd    0f0fff0ffh
  887.     dd    00f0f0f0fh
  888.     dd    0fff0fff0h
  889. ;
  890.     dd    00f0f0f0fh    ;5
  891.     dd    0f0f0f0f0h
  892.     dd    00f0f0f0fh
  893.     dd    0fff0fff0h
  894. ;
  895.     dd    00f0f0f0fh    ;4
  896.     dd    0f0f0f0f0h
  897.     dd    00f0f0f0fh
  898.     dd    0f0f0f0f0h
  899. ;
  900.     dd    0000f000fh    ;3
  901.     dd    000f000f0h
  902.     dd    00f000f00h
  903.     dd    0f000f000h
  904. ;
  905.     dd    000000000h    ;2
  906.     dd    000f000f0h
  907.     dd    000000000h
  908.     dd    000f000f0h
  909. ;
  910.     dd    000000000h    ;1
  911.     dd    000000000h
  912.     dd    000000000h
  913.     dd    0f000f000h
  914. ;
  915. DDPAT32    dd    0ffffffffh    ;8
  916.     dd    0ffffffffh
  917.     dd    0ffffffffh
  918.     dd    0ffffffffh
  919. ;
  920.     dd    000ffffffh    ;7
  921.     dd    0ffffff00h
  922.     dd    000ffffffh
  923.     dd    0ffffff00h
  924. ;
  925.     dd    000ffff00h    ;6
  926.     dd    0ffffff00h
  927.     dd    000ffff00h
  928.     dd    0ffffff00h
  929. ;
  930.     dd    000ffff00h    ;5
  931.     dd    000ffff00h
  932.     dd    000ffff00h
  933.     dd    0ffffff00h
  934. ;
  935.     dd    000ffff00h    ;4
  936.     dd    000ffff00h
  937.     dd    000ffff00h
  938.     dd    000ffff00h
  939. ;
  940.     dd    00000ff00h    ;3
  941.     dd    000ff0000h
  942.     dd    00000ff00h
  943.     dd    000ff0000h
  944. ;
  945.     dd    000000000h    ;2
  946.     dd    000ff0000h
  947.     dd    000000000h
  948.     dd    000ff0000h
  949. ;
  950.     dd    000000000h    ;1
  951.     dd    000000000h
  952.     dd    000000000h
  953.     dd    000ff0000h
  954. ;
  955.     align    4
  956. GETPATDD:
  957.     push    edx
  958.     push    ecx
  959. ;
  960.     mov    eax,16            ;eaxに1パターンブロックのバイト数セット
  961.     sub    edx,1            ;パターンオフセットカウンタ-1
  962.     mul    edx            ;パターンブロックオフセットを計算する
  963.     sub    ecx,1            ;パターンラインカウンタ-1
  964.     lea    eax,[eax][ecx*4]    ;パターンオフセット計算
  965.     cmp    pscm[ebp],0        ;スクリーンモードチェック
  966.     jz    DDSC16            ;0なら16色モードへ
  967. DDSC32:    mov    ebx,DDPAT32[eax]    ;パターンを得る
  968.     jmp    SETPAT
  969. DDSC16:    mov    ebx,DDPAT16[eax]    ;パターンを得る
  970. SETPAT:    mov    al,0            ;パックドピクセルマスクレジスタ0
  971.     mov    dx,0458h        ;VRAMアクセスコントローラI/Oレジスタ
  972.     out    dx,al            ;パックドピクセルマスクレジスタ0有効
  973.     mov    dx,045ah        ;データレジスタ選択
  974.     mov    eax,ebx            ;パターン転送
  975.     out    dx,ax            ;パターン書き込み
  976. ;
  977. ;    mov    dx,045bh        ;データレジスタ選択*
  978. ;    shr    eax,8            ;上位8ビットを下位に転送*
  979. ;    out    dx,al            ;パターン書き込み*
  980. ;
  981.     mov    al,1            ;パックドピクセルマスクレジスタ1
  982.     mov    dx,0458h        ;VRAMアクセスコントローラI/Oレジスタ
  983.     out    dx,al            ;パックドピクセルマスクレジスタ1有効
  984.     mov    dx,045ah        ;データレジスタ選択
  985.     mov    eax,ebx            ;パターン転送
  986.     shr    eax,16            ;上位16ビットを下位に転送
  987.     out    dx,ax            ;パターン書き込み
  988. ;
  989. ;    mov    dx,045bh        ;データレジスタ選択*
  990. ;    shr    eax,8            ;上位8ビットを下位に転送*
  991. ;    out    dx,al            ;パターン書き込み*
  992. ;
  993.     pop    ecx
  994.     pop    edx
  995.     ret
  996. ;
  997. ;
  998. ;
  999. LINE_DISSOLVE:
  1000. ;
  1001.     ife    basflg
  1002.     mov    eax,12
  1003.     mov    ecx,pscm[ebp]
  1004.     shr    eax,cl
  1005.     mov    mofs[ebp],eax
  1006.     endif
  1007. ;
  1008.     mov    eax,speed[ebp]
  1009.     inc    eax
  1010.     shl    eax,1
  1011.     mov    speed[ebp],eax
  1012.     xor    eax,eax
  1013. LDFOR1:    push    eax        ;for OFS=0 to MOFS-1        ;OFS
  1014.     mov    ebx,vy0[ebp]    ;for Y=VY0 to VY1 STEP MOFS    ;Y
  1015. LDFOR2:    mov    ecx,[esp]    ;ecx=OFS
  1016.     add    ecx,ebx        ;OFSY=OFS+Y
  1017.     cmp    ecx,vy1[ebp]
  1018.     ja    LDNXT2
  1019.     mov    esi,buffer[ebp]    ;グラフィックデータ格納アドレスを読み込む
  1020.     mov    edi,layer[ebp]    ;転送先基準アドレスを読み込む
  1021.     mov    eax,nxl[ebp]
  1022.     mul    ecx        ;OFSY*NXL    ;edx破壊
  1023.     mov    edx,x0[ebp]    ;横方向開始アドレスオフセットをセット
  1024.     add    edx,eax        ;OFSY*NXL+オフセット
  1025.     dec    edx
  1026.     mov    ecx,nxl1[ebp]    ;1ライン分の転送バイト数をセットする
  1027.     add    esi,edx        ;転送元対象ラインの始まりのアドレスをセット
  1028.     add    edi,edx        ;転送先対象ラインの始まりのアドレスをセット
  1029. ;
  1030. LD_LOP:    mov    al,[ecx][esi]
  1031.     mov    fs:[ecx][edi],al
  1032.     loop    LD_LOP
  1033. ;
  1034. LDWAIT:    push    edx
  1035.     mov    eax,nyl[ebp]
  1036.     sub    eax,vy[ebp]
  1037.     mov    edx,30
  1038.     inc    eax
  1039.     mul    edx
  1040.     mov    ecx,eax
  1041.     mov    eax,1000
  1042.     mul    speed[ebp]
  1043.     add    ecx,eax
  1044. LDWTLP:    loop    LDWTLP
  1045.     pop    edx
  1046. ;
  1047. LDNXT2:    add    ebx,mofs[ebp]
  1048.     cmp    ebx,vy1[ebp]
  1049.     jbe    LDFOR2
  1050. ;
  1051. LDNXT1:    pop    eax
  1052.     inc    eax
  1053.     cmp    eax,mofs[ebp]
  1054.     jb    LDFOR1
  1055.     jmp    EFTRET    ;ワークエリアを解放
  1056. ;
  1057. SHIFT_DOWN:
  1058. ;
  1059.     mov    eax,vy0[ebp]
  1060.     mul    nxl[ebp]
  1061.     add    eax,x0[ebp]
  1062.     dec    eax
  1063. ;
  1064.     mov    esi,buffer[ebp]
  1065.     add    esi,eax
  1066.     mov    mofs[ebp],esi
  1067. ;
  1068.     mov    esi,layer[ebp]
  1069.     add    esi,eax
  1070.     mov    vx[ebp],esi
  1071. ;
  1072.     mov    eax,vy1[ebp]
  1073.     dec    eax
  1074.     mov    esi,buffer[ebp]
  1075.     mul    nxl[ebp]
  1076.     add    eax,x0[ebp]
  1077.     dec    eax
  1078.     add    esi,eax
  1079. ;
  1080. SHDFR1:    push    esi
  1081.     mov    edx,vy1[ebp]
  1082.     sub    edx,2
  1083.     push    edx
  1084.     mov    eax,nxl[ebp]    ;Y*NXL
  1085.     mul    edx
  1086.     pop    edx
  1087.     mov    esi,x0[ebp]
  1088.     sub    esi,4
  1089.     add    esi,eax        ;Y*NXL+X
  1090. SHDFR2:    push    esi
  1091.     push    edx
  1092.     add    esi,layer[ebp]    ;グラフィックデータ格納アドレスを読み込む
  1093.     mov    edi,esi
  1094.     add    edi,nxl[ebp]
  1095.     add    edi,nxl[ebp]
  1096.     mov    ecx,nxl1[ebp]
  1097. ;
  1098. SHDFR3:    mov    eax,fs:[ecx][esi]
  1099.     mov    fs:[ecx][edi],eax
  1100.     sub    ecx,3
  1101.     loop    SHDFR3
  1102.     pop    edx
  1103.     pop    esi
  1104.     sub    esi,nxl[ebp]
  1105.     dec    edx
  1106.     cmp    edx,vy0[ebp]
  1107.     jge    SHDFR2
  1108. ;
  1109.     mov    esi,[esp]
  1110.     call    SHPUTL
  1111.     pop    esi
  1112.     sub    esi,nxl[ebp]
  1113.     sub    esi,nxl[ebp]
  1114.     cmp    esi,mofs[ebp]
  1115.     jae    SHDFR1
  1116. ;
  1117.     jmp    EFTRET    ;ワークエリアを解放
  1118. ;
  1119. ;
  1120. ;
  1121. SHIFT_UP:
  1122. ;
  1123.     mov    eax,vy1[ebp]
  1124.     dec    eax
  1125.     mul    nxl[ebp]
  1126.     add    eax,x0[ebp]
  1127.     dec    eax
  1128. ;
  1129.     mov    esi,buffer[ebp]
  1130.     add    esi,eax
  1131.     mov    mofs[ebp],esi
  1132. ;
  1133.     mov    esi,layer[ebp]
  1134.     add    esi,eax
  1135.     mov    vx[ebp],esi
  1136. ;
  1137.     mov    eax,vy0[ebp]
  1138.     mov    esi,buffer[ebp]
  1139.     mul    nxl[ebp]
  1140.     add    eax,x0[ebp]
  1141.     dec    eax
  1142.     add    esi,eax
  1143. ;
  1144. SHUFR1:    push    esi
  1145.     mov    edx,vy0[ebp]
  1146.     add    edx,2
  1147.     push    edx
  1148.     mov    eax,nxl[ebp]    ;Y*NXL
  1149.     mul    edx
  1150.     pop    edx
  1151.     mov    esi,x0[ebp]
  1152.     sub    esi,4
  1153.     add    esi,eax        ;Y*NXL+X
  1154. SHUFR2:    push    esi
  1155.     push    edx
  1156.     add    esi,layer[ebp]    ;グラフィックデータ格納アドレスを読み込む
  1157.     mov    edi,esi
  1158.     sub    edi,nxl[ebp]
  1159.     sub    edi,nxl[ebp]
  1160.     mov    ecx,nxl1[ebp]
  1161. ;
  1162. SHUFR3:    mov    eax,fs:[ecx][esi]
  1163.     mov    fs:[ecx][edi],eax
  1164.     sub    ecx,3
  1165.     loop    SHUFR3
  1166.     pop    edx
  1167.     pop    esi
  1168.     add    esi,nxl[ebp]
  1169.     inc    edx
  1170.     cmp    edx,vy1[ebp]
  1171.     jbe    SHUFR2
  1172. ;
  1173.     mov    esi,[esp]
  1174.     call    SHPUTL
  1175.     pop    esi
  1176.     add    esi,nxl[ebp]
  1177.     add    esi,nxl[ebp]
  1178.     cmp    esi,mofs[ebp]
  1179.     jbe    SHUFR1
  1180. ;
  1181.     jmp    EFTRET    ;ワークエリアを解放
  1182. ;
  1183. ;
  1184. ;
  1185. ;
  1186. SHIFT_RIGHT:
  1187. ;
  1188.     mov    eax,vy0[ebp]
  1189.     mul    nxl[ebp]
  1190.     mov    ebx,eax
  1191.     add    eax,x0[ebp]
  1192. ;
  1193.     mov    esi,buffer[ebp]
  1194.     add    esi,eax
  1195.     mov    mofs[ebp],esi
  1196. ;
  1197.     mov    esi,layer[ebp]
  1198.     add    esi,eax
  1199.     mov    vx[ebp],esi
  1200. ;
  1201.     mov    esi,x1[ebp]
  1202.     sub    esi,3
  1203.     add    esi,ebx
  1204.     add    esi,buffer[ebp]
  1205.     mov    edx,x1[ebp]
  1206.     sub    edx,8
  1207. ;
  1208. SHRFR1:    push    edx
  1209.     push    esi
  1210.     mov    esi,edx
  1211.     mov    eax,vy0[ebp]
  1212.     mul    nxl[ebp]
  1213.     mov    edx,esi
  1214.     add    esi,eax
  1215.     mov    ebx,nxl[ebp]
  1216. SHRFR2:    push    esi
  1217.     push    edx
  1218.     add    esi,layer[ebp]    ;グラフィックデータ格納アドレスを読み込む
  1219.     mov    edi,esi
  1220.     add    edi,4
  1221.     xor    edx,edx
  1222.     mov    ecx,vy[ebp]
  1223. ;
  1224. SHRFR3:    mov    eax,fs:[edx][esi]
  1225.     mov    fs:[edx][edi],eax
  1226.     add    edx,ebx
  1227.     loop    SHRFR3
  1228.     pop    edx
  1229.     pop    esi
  1230.     sub    esi,4
  1231.     sub    edx,4
  1232.     cmp    edx,x0[ebp]
  1233.     jge    SHRFR2
  1234. ;
  1235.     mov    esi,[esp]
  1236.     call    SVPUTL
  1237.     pop    esi
  1238.     pop    edx
  1239.     sub    esi,4
  1240.     cmp    esi,mofs[ebp]
  1241.     jae    SHRFR1
  1242. ;
  1243.     jmp    EFTRET    ;ワークエリアを解放
  1244. ;
  1245. ;
  1246. SHIFT_LEFT:
  1247. ;
  1248.     mov    eax,pscm[ebp]
  1249.     sub    x1[ebp],eax
  1250.     mov    eax,vy0[ebp]
  1251.     mul    nxl[ebp]
  1252.     mov    ebx,eax
  1253.     mov    eax,x1[ebp]
  1254.     sub    eax,4
  1255.     add    eax,ebx
  1256. ;
  1257.     mov    esi,buffer[ebp]
  1258.     add    esi,eax
  1259.     mov    mofs[ebp],esi
  1260. ;
  1261.     mov    esi,layer[ebp]
  1262.     add    esi,eax
  1263.     mov    vx[ebp],esi
  1264. ;
  1265.     mov    esi,x0[ebp]
  1266.     add    esi,ebx
  1267.     add    esi,buffer[ebp]
  1268. ;
  1269.     mov    edx,x0[ebp]
  1270.     add    edx,4
  1271. SHLFR1:    push    edx
  1272.     push    esi
  1273.     mov    esi,edx
  1274.     mov    eax,vy0[ebp]
  1275.     mul    nxl[ebp]
  1276.     mov    edx,esi
  1277.     add    esi,eax
  1278.     mov    ebx,nxl[ebp]
  1279. SHLFR2:    push    esi
  1280.     push    edx
  1281.     add    esi,layer[ebp]    ;グラフィックデータ格納アドレスを読み込む
  1282.     mov    edi,esi
  1283.     sub    edi,4
  1284.     xor    edx,edx
  1285.     mov    ecx,vy[ebp]
  1286. ;
  1287. SHLFR3:    mov    eax,fs:[edx][esi]
  1288.     mov    fs:[edx][edi],eax
  1289.     add    edx,ebx
  1290.     loop    SHLFR3
  1291.     pop    edx
  1292.     pop    esi
  1293.     add    esi,4
  1294.     add    edx,4
  1295.     cmp    edx,x1[ebp]
  1296.     jbe    SHLFR2
  1297. ;
  1298.     mov    esi,[esp]
  1299.     call    SVPUTL
  1300.     pop    esi
  1301.     pop    edx
  1302.     add    esi,4
  1303.     cmp    esi,mofs[ebp]
  1304.     jbe    SHLFR1
  1305. ;
  1306.     jmp    EFTRET    ;ワークエリアを解放
  1307. ;
  1308. ;
  1309. palette:
  1310. ;
  1311.     cmp    dword PTR pscm[ebp],1
  1312.     jz    DOT_DISSOLVE        ;32kモード時はディゾルブ(点)へ
  1313. ;
  1314.     
  1315. EFTRET:    pop    ebx        ;-
  1316.     pop    edi        ;|
  1317.     pop    esi        ;+High C用のレジスタ復帰
  1318.     pop    ebp        ;-
  1319.     add    esp,worklng    ;ワークエリアを解放
  1320.     ret
  1321. ;
  1322. ;
  1323. ;
  1324. EFFECT    endp
  1325. CODE    ends
  1326.     end
  1327.  
  1328.