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

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