home *** CD-ROM | disk | FTP | other *** search
/ Phoenix Heaven Sunny 2 / APPARE2.BIN / oh_towns / ugoku / ugokulib / etc / move32c.asm < prev    next >
Assembly Source File  |  1995-06-20  |  13KB  |  692 lines

  1. ;        32K色ムービ転送 
  2. ;        DATA → BUFFER → VRAM
  3. ;        VSYNC 同期タイプ( vccount.objとのリンクが必要 )
  4. ;        1992 1/14  Hiroshi TODA
  5. ;
  6.  
  7.     .386p
  8.  
  9.  
  10.     extrn    VSYNC_counter    :    dword
  11.  
  12.  
  13.  
  14. work    struc
  15.             ;para area
  16. data    dd    ?        ; DATA アドレス
  17. buffer    dd    ?        ; BUFFER アドレス
  18. mode    dd    ?        ; bit0:VRAMページ(0or1)
  19.                 ; bit1:move_box参照VRAMページ(0or1)
  20. wt1    dd    ?        ; wait
  21.  
  22. ;work areaパラメータの後にワークエリアをつける(カッコ悪いが高速処理のため)
  23.  
  24. pg    dd    ?        ; page        (dataのヘッダ内容のコピー)
  25. dsize    dd    ?        ; size
  26. ox    dw    ?        ; 表示位置 (x)dw, (y)dw
  27. oy    dw    ?
  28. wt2    dw    ?        ; wait
  29. lp    dw    ?        ; loop
  30. dummy    dd    ?
  31. sound1    dd    ?        ; sound data
  32. sound2    dd    ?
  33. sound3    dd    ?
  34.  
  35. pcmadd    dd    ?        ; pcm data address 転送情報(0なら無し)
  36. pcmch    dd    ?        ; ch
  37. pcmsize    dd    ?        ; size
  38.  
  39. endadd    dd    ?        ;
  40. ckofst    dw    ?        ; offset ckeck
  41. num1    dw    ?        ; 個数1
  42. num2    dw    ?        ;     2
  43. num3    dw    ?        ;     3
  44.  
  45. count1    dw    ?        ; work area
  46. count2    dw    ?
  47.  
  48.     ; 以上 19 dword
  49.  
  50. work    ends
  51.  
  52. cseg    segment    dword public use32 'CODE'
  53.     assume    cs:cseg,ds:cseg
  54.  
  55. ;int move32(int para[])
  56. ;char *work
  57. ;int para[] = { dataアドレス, bufferアドレス, mode, wait }
  58. ;出力 = next data アドレス
  59.  
  60.     public    move32_vsync
  61.     db    'move32_vsync',12
  62. move32_vsync    proc    near
  63.     push    ebp
  64.     mov    ebp,esp
  65.     push    esi
  66.     push    edi
  67.     push    ebx
  68.     mov    ebx,[ebp+8]        ; ebx = para のアドレス
  69.     mov    edx,[ebx].buffer    ; buffer -> edx
  70.     mov    esi,[ebx].data        ; data -> esi
  71.     mov    ax,[ebx].ox        ; 1つ手前の絵のoffset情報を確保
  72.     add    ax,[ebx].oy        ; pre move の処理の時に補正
  73.     je    move00
  74.     mov    ax,1
  75. move00:    mov    [ebx].ckofst,ax
  76.     lea    edi,[ebx].pg        ; data header 転送 転送先->edi
  77.     cld
  78.     mov    ecx,8
  79.     rep    movsd            ; data trans(header=32bit)
  80.     mov    dword ptr [ebx].pcmadd,0    ; pcm 情報 clear
  81.     mov    eax,[ebx].dsize        ; data end -> eax
  82.     add    eax,esi
  83.     mov    [ebx].endadd,eax
  84.     cmp    eax,esi
  85.     je    move12
  86.     lodsw
  87.     mov    [ebx].num1,ax
  88.     cmp    ax,0
  89.     je    move12
  90. move01:    lodsw            ; 各種処理ルーチン呼び出しループ
  91.     push    esi
  92.     cmp    ax,1222H        ; stosw type1
  93.     jne    move02
  94.     call    storew
  95.     jmp    move10
  96. move02:    cmp    ax,2222H        ; movsw
  97.     jne    move03
  98.     call    movew
  99.     jmp    move10
  100. move03:    cmp    ax,0222H        ; stosw type0
  101.     jne    move04
  102.     call    stosw0
  103.     jmp    move10
  104. move04:    cmp    ax,1422H        ; stosd type1
  105.     jne    move05
  106.     call    stored
  107.     jmp    move10
  108. move05:    cmp    ax,2422H        ; movsd
  109.     jne    move06
  110.     call    moved
  111.     jmp    move10
  112. move06:    cmp    ax,3010H        ; move box ( 16*16 )
  113.     jne    move07
  114.     call    mvbx16
  115.     jmp    move10
  116. move07:    cmp    ax,3110H        ; move all box ( 16*16*300 )
  117.     jne    move08
  118.     call    mvbxall_16
  119.     jmp    move10
  120. move08:    cmp    ax,0F000H        ; pcm data 転送
  121.     jne    move10
  122.     call    pcmtr
  123.     jmp    move10
  124. move10:    pop    esi
  125.     lodsd
  126.     add    esi,eax
  127.     dec    word ptr [ebx].num1
  128.     jne    move01
  129. move12:    push    es            ; esをスタックに退避
  130.     mov    ax,104h            ; es=VRAMセグメントレジスタ
  131.     mov    es,ax
  132.     xor    edi,edi
  133.     test    byte ptr [ebx].mode,1
  134.     je    move13
  135.     mov    edi,40000h        ; es:[edi]=vram
  136. move13:    mov    eax,dword ptr [ebx].ox    ; read offset
  137.     or    eax,eax
  138.     je    move0L            ; offset == 原点 -> move0F
  139.  
  140.     mov    esi,[ebx].buffer    ; ds:[esi]=buffer
  141.     xor    ecx,ecx
  142.     mov    ax,[ebx].ox
  143.     and    eax,0FFFFh
  144.     shl    ax,1
  145.     add    esi,eax            ; esi += x*2
  146.     mov    ax,[ebx].oy
  147.     imul    eax,eax,640
  148.     add    esi,eax            ; esi += y*640
  149.     mov    ax,320
  150.     sub    ax,[ebx].ox
  151.     jbe    move0L        ; error スクロールしない
  152.     shr    ax,1
  153.     mov    [ebx].count1,ax        ; count1 = (320 - x)/2
  154.     mov    ax,[ebx].ox
  155.     shr    ax,1
  156.     mov    [ebx].count2,ax        ; count2 = x/2
  157.     jc    move0C
  158.  
  159.     mov    dx,240        ; x偶数
  160.     sub    dx,[ebx].oy        ; dx = 240 - y
  161.     jbe    move0L        ; error スクロールしない
  162. move0A:    mov    cx,[ebx].count1
  163.     rep    movsd
  164.     sub    esi,640            ; esi 320dot back
  165.     mov    cx,[ebx].count2
  166.     rep    movsd
  167.     add    esi,640            ; esi 320dot go
  168.     add    edi,384            ; edi += 384
  169.     dec    dx
  170.     jne    move0A
  171.     mov    esi,[ebx].buffer    ; ds:[esi]=buffer 処理その2
  172.     mov    ax,[ebx].ox
  173.     and    eax,0FFFFh
  174.     shl    ax,1
  175.     add    esi,eax            ; esi += x*2
  176.     mov    dx,[ebx].oy        ; dx = y
  177.     or    dx,dx
  178.     je    move0M            ; ループは0
  179. move0B:    mov    cx,[ebx].count1
  180.     rep    movsd
  181.     sub    esi,640            ; esi 320dot back
  182.     mov    cx,[ebx].count2
  183.     rep    movsd
  184.     add    esi,640            ; esi 320dot go
  185.     add    edi,384            ; edi += 384
  186.     dec    dx
  187.     jne    move0B
  188.     jmp    move0M
  189.  
  190. move0C:    mov    dx,240        ; x奇数
  191.     sub    dx,[ebx].oy        ; dx = 240 - y
  192.     jbe    move0L        ; error スクロールしない
  193. move0D:    mov    cx,[ebx].count1
  194.     rep    movsd
  195.     movsw
  196.     sub    esi,640            ; esi 320dot back
  197.     mov    cx,[ebx].count2
  198.     rep    movsd
  199.     movsw
  200.     add    esi,640            ; esi 320dot go
  201.     add    edi,384            ; edi += 384
  202.     dec    dx
  203.     jne    move0D
  204.     mov    esi,[ebx].buffer    ; ds:[esi]=buffer 処理その2
  205.     mov    ax,[ebx].ox
  206.     and    eax,0FFFFh
  207.     shl    ax,1
  208.     add    esi,eax            ; esi += x*2
  209.     mov    dx,[ebx].oy        ; dx = y
  210.     or    dx,dx
  211.     je    move0M            ; ループは0
  212. move0E:    mov    cx,[ebx].count1
  213.     rep    movsd
  214.     movsw
  215.     sub    esi,640            ; esi 320dot back
  216.     mov    cx,[ebx].count2
  217.     rep    movsd
  218.     movsw
  219.     add    esi,640            ; esi 320dot go
  220.     add    edi,384            ; edi += 384
  221.     dec    dx
  222.     jne    move0E
  223.     jmp    move0M
  224.  
  225. move0L:    mov    esi,[ebx].buffer    ; ds:[esi]=buffer
  226.     xor    ecx,ecx
  227.     mov    edx,240
  228. move14:    mov    cl,160            ; vram 転送
  229.     rep    movsd
  230.     add    edi,384
  231.     dec    edx
  232.     jne    move14
  233.  
  234. move0M:    xor    ecx,ecx
  235.     mov    cx,[ebx].wt2        ; wait
  236.     add    ecx,[ebx].wt1
  237. move0N:    mov    eax,VSYNC_counter    ; read vsync_counter
  238.     sub    eax,ecx
  239.     je    move20
  240.     jb    move0N
  241.     shr    ecx,1
  242.     cmp    eax,ecx
  243.     jbe    move20
  244.     mov    eax,ecx
  245. move20:    mov    VSYNC_counter,eax
  246.  
  247. move21:    mov    dx,0448h        ; 0448h
  248.     mov    al,1
  249.     out    dx,al
  250.     mov    dx,044Ah        ; 044ah
  251.     mov    eax,[ebx].mode        ; プライオリティ
  252.     and    eax,01h
  253.     out    dx,al
  254.     pop    es            ; esを元に戻す
  255.     mov    eax,[ebx].endadd    ; eaxに終了アドレス
  256.     pop    ebx
  257.     pop    edi
  258.     pop    esi
  259.     mov    esp,ebp
  260.     pop    ebp
  261.     ret
  262. move32_vsync    endp
  263.  
  264. ;    stosw ( dataをそのつど指定するタイプ )
  265.  
  266. stosw0    proc    near
  267.     push    ebx            ; ebx 保存
  268.     lodsd                ; data長 skip
  269.     cmp    eax,0
  270.     je    #sto06
  271.     lodsw            ; num2
  272.     mov    [ebx].num2,ax
  273.     cmp    ax,0
  274.     je    #sto06
  275. #sto02:    lodsw                ; offset
  276.     shl    eax,16
  277.     mov    edx,[ebx].buffer    ; buffer-address
  278.     add    edx,eax            ; offset + buffer-address -> edx
  279.     lodsw            ; num3
  280.     cmp    ax,0
  281.     je    #sto05
  282.     mov    bx,ax
  283. #sto03:    lodsw                ; address
  284.     movzx    edi,ax
  285.     add    edi,edx            ; add offset
  286.     xor    eax,eax            ; count
  287.     lodsb
  288.     cmp    al,4
  289.     ja    #sto0B            ; 4個以下は特別扱い
  290.     mov    ecx,eax
  291.     lodsw
  292.     rep    stosw
  293.     dec    bx
  294.     jne    #sto03
  295.     jmp    #sto0C
  296. #sto0B:    cmp    al,0ffH
  297.     jne    #sto04
  298.     lodsw
  299.     cmp    ax,0ffffH
  300.     jne    #sto04
  301.     lodsd
  302. #sto04:    mov    ecx,eax
  303.     mov    eax,[esi].(-2)        ; eax = ax + ax << 16
  304.     lodsw
  305.     shr    ecx,1
  306.     rep    stosd
  307.     jnc    #sto0A
  308.     stosw
  309. #sto0A:    dec    bx
  310.     jne    #sto03
  311. #sto0C:    mov    ebx,[esp]        ; ebx戻し
  312. #sto05:    dec    word ptr [ebx].num2
  313.     jne    #sto02
  314. #sto06:    pop    ebx
  315.     ret
  316. stosw0    endp
  317.  
  318. ;    stosw ( 最初にdataを指定するタイプ )
  319.  
  320. storew    proc    near
  321.     push    ebx            ; ebx 保存
  322.     push    eax
  323.     lodsd                ; data長 skip
  324.     cmp    eax,0
  325.     je    #sto07
  326.     lodsw            ; num2
  327.     mov    [ebx].num2,ax
  328.     cmp    ax,0
  329.     je    #sto07
  330. #sto01:    mov    eax,[esi].(-2)        ; eax = ax + ax << 16
  331.     lodsw
  332.     mov    [esp],eax        ; data 保存
  333.     lodsw            ; num3
  334.     mov    [ebx].num3,ax
  335.     cmp    ax,0
  336.     je    #sto06
  337. #sto02:    lodsw                ; offset
  338.     shl    eax,16
  339.     mov    edx,[ebx].buffer    ; buffer-address
  340.     add    edx,eax            ; offset + buffer-address -> edx
  341.     lodsw            ; num4
  342.     cmp    ax,0
  343.     je    #sto05
  344.     mov    bx,ax
  345. #sto03:    lodsw                ; address
  346.     movzx    edi,ax
  347.     add    edi,edx            ; add offset
  348.     xor    eax,eax            ; count
  349.     lodsb
  350.     cmp    al,4
  351.     ja    #sto0B            ; 4個以下は特別扱い
  352.     mov    ecx,eax
  353.     mov    eax,[esp]
  354.     rep    stosw
  355.     dec    bx
  356.     jne    #sto03
  357.     jmp    #sto0C
  358. #sto0B:    cmp    al,0ffH
  359.     jne    #sto04
  360.     lodsw
  361.     cmp    ax,0ffffH
  362.     jne    #sto04
  363.     lodsd
  364. #sto04:    mov    ecx,eax
  365.     mov    eax,[esp]        ; data
  366.     shr    ecx,1
  367.     rep    stosd
  368.     jnc    #sto0A
  369.     stosw
  370. #sto0A:    dec    bx
  371.     jne    #sto03
  372. #sto0C:    mov    ebx,[esp].4        ; ebx戻し
  373. #sto05:    dec    word ptr [ebx].num3
  374.     jne    #sto02
  375. #sto06:    dec    word ptr [ebx].num2
  376.     jne    #sto01
  377. #sto07:    pop    eax
  378.     pop    ebx
  379.     ret
  380. storew    endp
  381.  
  382. stored    proc    near
  383.     push    ebx
  384.     push    eax
  385.     lodsd                ; data長 skip
  386.     cmp    eax,0
  387.     je    #sto07
  388.     lodsw            ; num2
  389.     mov    [ebx].num2,ax
  390.     cmp    ax,0
  391.     je    #sto07
  392. #sto01:    lodsd
  393.     mov    [esp],eax        ; data 保存
  394.     lodsw            ; num3
  395.     mov    [ebx].num3,ax
  396.     cmp    ax,0
  397.     je    #sto06
  398. #sto02:    lodsw                ; offset
  399.     shl    eax,16
  400.     mov    edx,[ebx].buffer    ; buffer-address
  401.     add    edx,eax            ; offset + buffer-address -> edx
  402.     lodsw            ; num4
  403.     cmp    ax,0
  404.     je    #sto05
  405.     mov    bx,ax
  406. #sto03:    lodsw                ; address
  407.     movzx    edi,ax
  408.     add    edi,edx            ; add offset
  409.     xor    eax,eax            ; count
  410.     lodsb
  411.     cmp    al,0ffH
  412.     jne    #sto04
  413.     lodsw
  414.     cmp    ax,0ffffH
  415.     jne    #sto04
  416.     lodsd
  417. #sto04:    mov    ecx,eax
  418.     mov    eax,[esp]        ; data
  419.     rep    stosd
  420.     dec    bx
  421.     jne    #sto03
  422.     mov    ebx,[esp].4        ; ebx戻し
  423. #sto05:    dec    word ptr [ebx].num3
  424.     jne    #sto02
  425. #sto06:    dec    word ptr [ebx].num2
  426.     jne    #sto01
  427. #sto07:    pop    eax
  428.     pop    ebx
  429.     ret
  430. stored    endp
  431.  
  432. movew    proc    near
  433.     push    ebx
  434.     lodsd                ; data長 skip
  435.     cmp    eax,0
  436.     je    #mov06
  437.     lodsw            ; num2
  438.     mov    [ebx].num2,ax
  439.     cmp    ax,0
  440.     je    #mov06
  441. #mov01:    lodsw                ; offset
  442.     shl    eax,16
  443.     mov    edx,[ebx].buffer    ; buffer-address
  444.     add    edx,eax            ; offset + buffer-address -> edx
  445.     lodsw            ; num3
  446.     cmp    ax,0
  447.     je    #mov05
  448.     mov    bx,ax
  449. #mov02:    lodsw                ; address
  450.     movzx    edi,ax
  451.     add    edi,edx            ; add offset
  452.     xor    eax,eax            ; count
  453.     lodsb
  454.     cmp    al,4
  455.     ja    #mov0B            ; 4個以下は特別扱い
  456.     mov    ecx,eax
  457.     rep    movsw
  458.     dec    bx            ; なりふり構わない
  459.     jne    #mov02
  460.     jmp    #mov0C
  461. #mov0B:    cmp    al,0ffH
  462.     jne    #mov03
  463.     lodsw
  464.     cmp    ax,0ffffH
  465.     jne    #mov03
  466.     lodsd
  467. #mov03:    mov    ecx,eax
  468.     shr    ecx,1
  469.     rep    movsd
  470.     jnc    #mov04
  471.     movsw
  472. #mov04:    dec    bx
  473.     jne    #mov02
  474. #mov0C:    mov    ebx,[esp]
  475. #mov05:    dec    word ptr [ebx].num2
  476.     jne    #mov01
  477. #mov06:    pop    ebx
  478.     ret
  479. movew    endp
  480.  
  481. moved    proc    near
  482.     push    ebx
  483.     lodsd                ; data長 skip
  484.     cmp    eax,0
  485.     je    #mov06
  486.     lodsw            ; num2
  487.     mov    [ebx].num2,ax
  488.     cmp    ax,0
  489.     je    #mov06
  490. #mov01:    lodsw                ; offset
  491.     shl    eax,16
  492.     mov    edx,[ebx].buffer    ; buffer-address
  493.     add    edx,eax            ; offset + buffer-address -> edx
  494.     lodsw            ; num3
  495.     cmp    ax,0
  496.     je    #mov05
  497.     mov    bx,ax
  498. #mov02:    lodsw                ; address
  499.     movzx    edi,ax
  500.     add    edi,edx            ; add offset
  501.     xor    eax,eax            ; count
  502.     lodsb
  503.     cmp    al,0ffH
  504.     jne    #mov03
  505.     lodsw
  506.     cmp    ax,0ffffH
  507.     jne    #mov03
  508.     lodsd
  509. #mov03:    mov    ecx,eax
  510.     rep    movsd
  511. #mov04:    dec    bx
  512.     jne    #mov02
  513.     mov    ebx,[esp]
  514. #mov05:    dec    word ptr [ebx].num2
  515.     jne    #mov01
  516. #mov06:    pop    ebx
  517.     ret
  518. moved    endp
  519.  
  520. mvbx16    proc    near
  521.     lodsd                ; data長 skip
  522.     cmp    eax,0
  523.     je    #mov05
  524.     lodsw            ; num2
  525.     mov    [ebx].num2,ax
  526.     cmp    ax,0
  527.     je    #mov05
  528.     test    byte ptr [ebx].ckofst,01h    ; 原点補正を考慮
  529.     je    #mov0A
  530.     call    ckofst0
  531.     mov    ax,104h        ; fs = 104h vram selector
  532.     mov    fs,ax
  533.     mov    eax,esi        ; 例外的に eax がポインター
  534.     test    byte ptr [ebx].mode,02h
  535.     je    #mov03        ; 補正有り -> vram逆
  536.     jmp    #mov01
  537. #mov0A:    mov    ax,104h        ; fs = 104h vram selector
  538.     mov    fs,ax
  539.     mov    eax,esi        ; 例外的に eax がポインター
  540.     test    byte ptr [ebx].mode,02h
  541.     jne    #mov03
  542. #mov01:    mov    edi,[eax]        ; 画面0に前の絵が残ってる
  543.     mov    esi,[eax+4]        ; short int x, y
  544.     shl    si,7
  545.     shr    esi,6
  546.     add    eax,8
  547.     add    edi,[ebx].buffer
  548.     mov    edx,16
  549. #mov02:    mov    ecx,8
  550.     rep    movs dword ptr [edi],fs:[esi]    ; dword 転送
  551.     add    edi,608
  552.     add    esi,992
  553.     dec    edx
  554.     jne    #mov02
  555.     dec    word ptr [ebx].num2
  556.     jne    #mov01
  557.     mov    esi,eax
  558.     jmp    #mov05
  559. #mov03:    mov    edi,[eax]        ; 画面1に前の絵が残ってる
  560.     mov    esi,[eax+4]        ; short int x, y
  561.     shl    si,7
  562.     shr    esi,6
  563.     add    esi,40000h    ; 画面1
  564.     add    eax,8
  565.     add    edi,[ebx].buffer
  566.     mov    edx,16
  567. #mov04:    mov    ecx,8
  568.     rep    movs dword ptr [edi],fs:[esi]    ; dword 転送
  569.     add    edi,608
  570.     add    esi,992
  571.     dec    edx
  572.     jne    #mov04
  573.     dec    word ptr [ebx].num2
  574.     jne    #mov03
  575.     mov    esi,eax
  576. #mov05:    ret
  577. mvbx16    endp
  578.  
  579. mvbxall_16 proc    near
  580.     lodsd                ; data長 skip
  581.     cmp    eax,0
  582.     je    #mov07
  583.     test    byte ptr [ebx].ckofst,01h    ; 原点補正を考慮
  584.     je    #mov0A
  585.     call    ckofst0
  586.     mov    ax,104h        ; fs = 104h vram selector
  587.     mov    fs,ax
  588.     mov    eax,esi        ; 例外的に eax がポインター
  589.     test    byte ptr [ebx].mode,02h
  590.     je    #mov03        ; 補正有り -> vram逆
  591.     jmp    #mov0B
  592. #mov0A:    mov    ax,104h        ; fs = 104h vram selector
  593.     mov    fs,ax
  594.     mov    eax,esi        ; 例外的に eax がポインター
  595.     test    byte ptr [ebx].mode,02h
  596.     jne    #mov03
  597. #mov0B:    mov    edx,[ebx].buffer    ; 画面0に前の絵が残ってる
  598.     mov    dword ptr [ebx].count1,edx
  599.     push    dword ptr 15
  600. #mov00:    push    dword ptr 20
  601.     mov    edi,dword ptr [ebx].count1
  602. #mov01:    mov    esi,[eax]        ; short int x, y
  603.     shl    si,7
  604.     shr    esi,6
  605.     add    eax,4
  606.     mov    edx,16
  607. #mov02:    mov    ecx,8
  608.     rep    movs dword ptr [edi],fs:[esi]    ; dword 転送
  609.     add    edi,608
  610.     add    esi,992
  611.     dec    edx
  612.     jne    #mov02
  613.     sub    edi,10208        ; edi : 640*16 - 32 back
  614.     dec    dword ptr [esp]
  615.     jne    #mov01
  616.     add    esp,4
  617.     add    dword ptr [ebx].count1,10240
  618.     dec    dword ptr [esp]
  619.     jne    #mov00
  620.     add    esp,4
  621.     mov    esi,eax
  622.     jmp    #mov07
  623. #mov03:    mov    edx,[ebx].buffer    ; 画面1に前の絵が残ってる
  624.     mov    dword ptr [ebx].count1,edx
  625.     push    dword ptr 15
  626. #mov04:    push    dword ptr 20
  627.     mov    edi,dword ptr [ebx].count1
  628. #mov05:    mov    esi,[eax]        ; short int x, y
  629.     shl    si,7
  630.     shr    esi,6
  631.     add    esi,40000h    ; 画面1
  632.     add    eax,4
  633.     mov    edx,16
  634. #mov06:    mov    ecx,8
  635.     rep    movs dword ptr [edi],fs:[esi]    ; dword 転送
  636.     add    edi,608
  637.     add    esi,992
  638.     dec    edx
  639.     jne    #mov06
  640.     sub    edi,10208        ; edi : 640*16 - 32 back
  641.     dec    dword ptr [esp]
  642.     jne    #mov05
  643.     add    esp,4
  644.     add    dword ptr [ebx].count1,10240
  645.     dec    dword ptr [esp]
  646.     jne    #mov04
  647.     add    esp,4
  648.     mov    esi,eax
  649. #mov07:    ret
  650. mvbxall_16 endp
  651.  
  652. ; offset 空いたvramで原点に補正
  653.  
  654. ckofst0    proc    near
  655.     push    esi
  656.     push    es            ; esをスタックに退避
  657.     mov    ax,104h            ; es=VRAMセグメントレジスタ
  658.     mov    es,ax
  659.     xor    edi,edi
  660.     test    byte ptr [ebx].mode,2
  661.     jne    off01
  662.     mov    edi,40000h        ; es:[edi]=vram
  663. off01:    mov    esi,[ebx].buffer    ; ds:[esi]=buffer
  664.     xor    ecx,ecx
  665.     mov    edx,240
  666. off02:    mov    cl,160            ; vram 転送
  667.     rep    movsd
  668.     add    edi,384
  669.     dec    edx
  670.     jne    off02
  671.     pop    es
  672.     pop    esi
  673.     ret
  674. ckofst0 endp
  675.  
  676. pcmtr    proc    near
  677.     lodsd                ; data長 skip
  678.     add    eax,esi
  679.     push    eax            ; eax 終了アドレス
  680.     lodsd                ; ch
  681.     mov    [ebx].pcmch,eax
  682.     lodsd                ; 転送data size
  683.     mov    [ebx].pcmsize,eax
  684.     mov    [ebx].pcmadd,esi    ; data address
  685.     pop    esi
  686.     ret
  687. pcmtr    endp
  688.  
  689. cseg    ends
  690.     end
  691.  
  692.