home *** CD-ROM | disk | FTP | other *** search
/ FreeWare Collection 2 / FreeSoftwareCollection2pd199x-jp.img / fbasic / pmgf / spread.asm < prev    next >
Assembly Source File  |  1990-06-14  |  9KB  |  352 lines

  1.     .386p
  2.  
  3.     PUBLIC    GLOAD
  4.     
  5. param    struc
  6. datlen    dd    ?    ;総データ長
  7. headlen    dd    ?    ;ヘッダ長
  8. ;
  9.     dd    ?    ;使用禁止
  10. nrefer    dd    ?    ;変更するライン
  11. lngth    dd    ?    ;1ラインのバイト数(展開した時)
  12. data    dd    ?    ;圧縮データ格納アドレス
  13. refer    dd    ?    ;参照データ格納アドレス
  14. outd    dd    ?    ;出力データ格納アドレス
  15. bml    dd    ?    ;ビットマップ長
  16. param    ends
  17.  
  18.  
  19. nlength    EQU    1024    ;1ラインの最大長(参照データ1ライン分のデータ長も兼ねる)
  20. worklng    EQU    4*2
  21. dbf    EQU    0    ;デバッグモードフラグ(0:Debug Mode Off 1:On)
  22. ;    
  23. ;    MACRO
  24. debug    macro    val
  25.     pushf
  26.     push    eax
  27.     push    edx
  28.     mov    eax,val
  29.     and    eax,4fh
  30.     mov    edx,04ech    ;Volume Meter
  31.     out    dx,al
  32.     pop    edx
  33.     pop    eax
  34.     popf
  35.     endm
  36.  
  37. debugs    macro    val,val2
  38.     pushf
  39.     push    eax
  40.     push    edx
  41.     mov    eax,val
  42.     shl    eax,val2
  43.     and    eax,4fh
  44.     mov    edx,04ech    ;Volume Meter
  45.     out    dx,al
  46.     pop    edx
  47.     pop    eax
  48.     popf
  49.     endm
  50.  
  51. debugl    macro    val,val2
  52.     pushf
  53.     push    eax
  54.     push    edx
  55.     mov    eax,val
  56.     and    eax,4fh
  57.     mov    edx,04ech    ;Volume Meter
  58.     out    dx,al
  59.     mov    eax,val2
  60.     out    dx,al
  61.     pop    edx
  62.     pop    eax
  63.     popf
  64.     endm
  65.  
  66. djmp    macro    val,val2
  67.     if     dbf
  68.     cmp    dword PTR dflag[ebp],val
  69.     je    val2
  70.     endif
  71.     endm
  72.     
  73. CODE    segment dword public ER use32 'CODE'
  74.     assume cs:CODE, ds:CODE
  75.     
  76. ;    Graphics Data Spread Routine for F-BASIC386
  77.  
  78. EXEC    proc    near
  79. GLOAD:
  80.     sub    esp,worklng    ;ワークエリアを確保
  81.     mov    ebp,esp
  82.     cld            ;自動増加を指定
  83.     mov    dword PTR headlen[ebp],1 ;ヘッダ長初期化
  84.     mov    esi,data[ebp]    ;圧縮データ格納アドレスをセット
  85.     mov    edi,outd[ebp]    ;展開データ    〃
  86. ;
  87.     lodsb            ;1バイト読込
  88.     test    al,80h        ;msbチェック
  89.     jz    NOTCMP        ;非圧縮データ展開へ
  90.     mov    bl,al        ;転送
  91. ;
  92.     and    bl,38h        ;圧縮モードを得る
  93.     shr    bl,3
  94. ;    圧縮モード分岐        ;alにラインヘッダが格納されている
  95.     cmp    bl,0
  96.     jz    LINES        ;0なら1次元モードへ
  97.     cmp    bl,1
  98.     jz    CMPAGS        ;1なら完全一致モードへ
  99.     mov    dword PTR headlen[ebp],2    ;ヘッダ長変更
  100.     cmp    bl,2
  101.     jz    HIGHS        ;2なら高圧縮モードへ
  102.     jmp    LOWS        ;それ以外なら低圧縮モードへ
  103. ;
  104. BASE    dd    LP1    ;1次元圧縮モードの各パターン展開のジャンプテーブル
  105.     dd    LP2
  106.     dd    LP3
  107.     dd    LP4
  108.     dd    LP5
  109. ;
  110.     align    4
  111. LINES:    ;1次元
  112. ;
  113.     mov    dl,al    ;ラインヘッダ保存
  114.     and    eax,7    ;総データ数を求める
  115.     test    dl,40h    ;2バイトチェック
  116.     jnz    LIH1    ;1バイトヘッダモードフラグが立っていたら分岐
  117. LIH2:    mov    ah,al    ;2バイトヘッダモードなので1バイト目を256倍する
  118.     mov    dword PTR headlen[ebp],2    ;ヘッダ長変更
  119.     lodsb        ;2バイト目をロード
  120. LIH1:    mov    edx,eax    ;総データ数セット(edx)
  121.     mov    datlen[ebp],eax    ;データ数保存
  122. ;
  123.     align    4
  124. L_LINS:    cmp    edx,0    ;残りデータは有るか
  125.     jng    CALRET    ;edxが0か0以下なら展開終了
  126.     lodsb        ;1バイト目を読み込む
  127.     dec    edx    ;1バイト読み込んだのでカウンタをデクリメント
  128.     mov    bl,al    ;データをblに転送
  129.     mov    cl,al    ;clにも転送
  130.     test    cl,10h    ;1バイトヘッダモードフラグをチェック
  131.     jz    L_LH2    ;0なら2バイトヘッダモードへ
  132.     and    ecx,0fh    ;パターン数セット
  133.     jmp    L_LH1    ;分岐
  134.     align    4
  135. L_LH2:    mov    ch,al    ;1バイト目を転送
  136.     lodsb        ;2バイト目
  137.     dec    edx    ;総データカウンタデクリメント
  138.     mov    cl,al    ;パターン数セット
  139.     and    ecx,0fffh
  140. L_LH1:    shr    bl,5    ;パターンナンバーを得る
  141.     and    ebx,7
  142.     dec    ebx    ;オフセットを得る
  143.     jmp    BASE[ebx*4]    ;パターン毎の展開ルーチンへ分岐
  144. ;
  145.     align    4
  146. LP1:
  147.     lodsb        ;パターンを得る
  148.     dec    edx    ;総データカウンタデクリメント
  149. rep    stosb        ;データ生成
  150.     jmp    L_LINS    ;ループ
  151. ;
  152.     align    4
  153. LP2:
  154.     lodsw        ;パターンを得る
  155.     sub    edx,2    ;総データカウンタデクリメント
  156. rep    stosw        ;データ生成
  157.     jmp    L_LINS    ;ループ
  158. ;
  159.     align    4
  160. LP3:
  161.     lodsd        ;パターンを得る
  162.     dec    esi    ;ポインタ補正
  163.     and    eax,0ffffffh    ;ブロックデータ生成
  164.     sub    edx,3    ;総データカウンタデクリメント
  165.     align    4
  166. L_LP3:    stosd        ;データ生成
  167.     dec    edi    ;ポインタ補正
  168.     loop    L_LP3    ;データ生成ループアウトチェック
  169.     jmp    L_LINS    ;ループ
  170. ;
  171.     align    4
  172. LP4:
  173.     lodsd        ;パターンを得る
  174.     sub    edx,4    ;総データカウンタデクリメント
  175. rep    stosd        ;データ生成
  176.     jmp    L_LINS    ;ループ
  177. ;
  178.     align    4
  179. LP5:
  180.     lodsb        ;パターンを得る
  181.     mov    bl,al
  182.     lodsd
  183.     sub    edx,5    ;総データカウンタデクリメント
  184.     align    4
  185. L_LP5:    mov    [edi],bl ;データ1バイト目生成
  186.     inc    edi    ;ポインタ補正
  187.     stosd        ;残りデータ生成
  188.     loop    L_LP5    ;データ生成ループアウトチェック
  189.     jmp    L_LINS    ;ループ
  190. ;
  191.     align    4
  192. CMPAGS:
  193.     mov    dword PTR datlen[ebp],0    ;総データ数保存
  194.     call    DATSTO    ;参照ラインのデータを転送する
  195.     jmp    CALRET    ;展開終了
  196. ;
  197.     align    4
  198. DATSTO:    ;alの下位3ビットに参照ラインをセットしてあること
  199.     and    eax,7        ;参照ライン計算
  200.     mov    esi,nlength    ;1ラインの領域長を得る
  201.     xor    edx,edx        ;mulの前処理
  202.     mul    esi        ;mul
  203.     add    eax,refer[ebp]    ;参照アドレス計算
  204.     mov    esi,eax        ;    〃   セット
  205.     mov    ecx,lngth[ebp]    ;1ラインのバイト数を得る
  206. DTSTin:    mov    edx,ecx        ;4バイト転送で高速転送するために
  207.     and    edx,3        ;4で割った余りのデータ数を先に転送
  208.     mov    eax,[esi]    ;しておく
  209.     mov    [edi],eax    ;取り合えず4バイト転送し、そのあとに
  210.     add    edi,edx        ;ポインタを補正する
  211.     add    esi,edx
  212.     shr    ecx,2        ;カウンタを4で割る
  213. rep    movsd            ;転送
  214.     ret            ;呼出元にリターン
  215. ;
  216.     align    4
  217. HIGHS:
  218.     push    esi    ;デ-タ格納アドレスを保存
  219.     call    DATSTO    ;参照ラインを転送
  220.     pop    esi    ;復帰
  221. ;
  222.     xor    eax,eax    ;eaxクリア
  223.     lodsb        ;格納データバイト数を読み込む
  224.     mov    bl,al    ;blに転送
  225.     and    al,7fh    ;格納データバイト数を得る
  226.     test    bl,80h    ;格納バイトヘッダ1バイトモードフラグをチェック
  227.     jnz    HI1GHS    ;    〃     2    〃    をスキップ
  228.     mov    ah,al    ;第1バイトを転送
  229.     mov    dword PTR headlen[ebp],3    ;ヘッダ長変更
  230.     lodsb        ;第2バイトを読み込む
  231. HI1GHS:    mov    ecx,eax    ;総データバイト数をセットする
  232.     mov    datlen[ebp],eax    ;データ数保存
  233.  
  234. ;
  235.     mov    edi,outd[ebp]    ;データ出力アドレスセット
  236. ;
  237.     align    4
  238. L_HIGS:
  239.     xor    eax,eax    ;eaxをクリア
  240.     lodsb        ;ブロックヘッダを読み込む
  241.     mov    dl,al    ;dlにヘッダを転送
  242.     test    al,80h    ;データオフセット1バイトモードフラグをチェック
  243.     jz    HIGS2    ;0ならば2バイトモードへ
  244. ;
  245.     and    eax,3fh    ;データオフセットを得る
  246.     dec    eax    ;オフセット補正
  247.     add    edi,eax    ;データストアポインタに足す
  248.     test    dl,40h    ;データ2バイトフラグチェック
  249.     jnz    HIGS2P    ;1ならデータ2バイトモードへ
  250.     movsb        ;データ転送
  251.     mov    edx,2    ;格納データバイト数から引く値をセットする
  252.     jmp    HIGEND    ;エンドチェックへ
  253.     align    4
  254. HIGS2P:    movsw        ;データ転送
  255.     mov    edx,3    ;格納データバイト数から引く値をセットする
  256.     jmp    HIGEND    ;エンドチェックへ
  257. ;
  258.     align    4
  259. HIGS2:    push    ecx    ;格納データバイト数を保存
  260.     mov    ah,al    ;第2バイトを読み込むため、第1バイトを転送
  261.     lodsb        ;第2バイトを読み込む
  262.     and    eax,7ffh ;データオフセットを得る
  263.     dec    eax    ;オフセット補正
  264.     add    edi,eax    ;データストアアドレスを得る
  265.     shr    dl,3    ;データ長ビットを得る
  266.     and    edx,15
  267.     mov    ecx,edx    ;データ長をカウンタにセットする
  268. rep    movsb        ;データ転送
  269.     add    edx,2    ;格納データバイト数から引く値をセットする
  270.     pop    ecx    ;格納データバイト数を復帰
  271. HIGEND:    sub    ecx,edx    ;残りデータ数計算
  272.     ja    L_HIGS    ;0でもマイナスでもなければもう一度データ転送へ
  273.     jmp    CALRET    ;展開終了
  274. ;
  275.     align    4
  276. LOWS:    ;低圧縮モード
  277.     push    esi    ;esiを保存
  278.     call    DATSTO    ;先に参照ラインをコピー
  279.     pop    esi    ;復帰
  280. ;
  281.     xor    eax,eax    ;eaxをクリア
  282.     lodsb        ;格納データバイト数を読み込む
  283.     mov    bl,al    ;ラインヘッダを転送
  284.     and    al,7fh    ;格納データバイト数を得る
  285.     test    bl,80h    ;格納バイトヘッダ1バイトモードフラグをチェック
  286.     jnz    LO1WS    ;    〃     2    〃    をスキップ
  287.     mov    ah,al    ;第1バイトを転送
  288.     mov    dword PTR headlen[ebp],3    ;ヘッダ長変更
  289.     lodsb        ;第2バイトを読み込む
  290. LO1WS:    mov    ecx,eax    ;総データバイト数をセットする
  291.     mov    datlen[ebp],eax    ;データ数保存
  292. ;
  293.     mov    edi,outd[ebp]    ;データ格納アドレスをセットする
  294. ;
  295.     mov    eax,esi        ;eaxにビットマップアドレス
  296.     mov    ecx,bml[ebp]    ;ビットマップ長を得る
  297.     add    esi,ecx        ;esiにデータ格納アドレス
  298.     xor    ebx,ebx        ;ebxをクリア
  299.     push    ecx        ;ビットマップ長を保存
  300.     align    4
  301. L_LOWS:    inc    eax        ;ビットマップアドレスを進める
  302.     mov    dl,[eax-1]    ;ビットマップを1バイト読み込む
  303.     push    eax        ;    〃         を保存
  304.     and    edx,0ffh    ;edxの最下位バイトのみ有効にする
  305. L_CHKL:
  306.     bsf    bx,dx        ;ビットスキャン
  307.     jz    NEXTBT        ;セットされていなければループチェック
  308.     btr    dx,bx        ;見つかったビットをクリア
  309.     lodsb            ;データ読込
  310.     mov    [ebx][edi],al    ;データストア
  311.     jmp    L_CHKL        ;ビットチェックへジャンプ
  312.     align    4
  313. NEXTBT:    pop    eax        ;ビットマップアドレスを復帰
  314.     add    edi,8        ;データストアアドレスを8バイト進める
  315.     dec    dword PTR [esp]    ;ビットマップ長をデクリメント
  316.     jnz    L_LOWS        ;0でなければ次のビットマップを処理しに行く
  317.     pop    ecx        ;スタック補正
  318.     jmp    CALRET        ;展開終了
  319. ;
  320.     align    4
  321. NOTCMP:    ;非圧縮モード
  322.     mov    ecx,lngth[ebp]    ;データ数をセット
  323.     mov    datlen[ebp],ecx    ;データ数保存
  324.     call    DTSTin        ;データ生成
  325. ;
  326.     align    4
  327. CALRET:    mov    esi,outd[ebp]    ;転送元アドレスセット
  328.     mov    eax,nrefer[ebp]    ;変更するラインをセット
  329.     mov    edi,nlength    ;1ラインの領域長をセット
  330.     xor    edx,edx        ;mulの前処理
  331.     mul    edi        ;オフセット計算
  332.     add    eax,refer[ebp]    ;転送先アドレス計算
  333.     mov    edi,eax        ;    〃    セット
  334.     mov    ecx,lngth[ebp]    ;1ラインのバイト数をセット
  335.     mov    edx,ecx        ;4バイト転送で高速転送するために
  336.     and    edx,3        ;4で割った余りのデータ数を先に転送
  337.     mov    eax,[esi]    ;しておく
  338.     mov    [edi],eax    ;取り合えず4バイト転送し、そのあとに
  339.     add    edi,edx        ;ポインタを補正する
  340.     add    esi,edx    
  341.     shr    ecx,2        ;カウンタを4で割る
  342. rep    movsd            ;転送
  343.     mov    eax,datlen[ebp]    ;データ長を復帰
  344.     add    eax,headlen[ebp] ;ヘッダ長を足す
  345.     add    esp,worklng    ;ワークエリア解放
  346.     ret            ;呼出元にリターン
  347. ;
  348. EXEC    endp
  349. CODE    ends
  350.     end
  351.  
  352.