home *** CD-ROM | disk | FTP | other *** search
/ FreeWare Collection 2 / FreeSoftwareCollection2pd199x-jp.img / graph2 / line.asm < prev    next >
Assembly Source File  |  1990-06-14  |  6KB  |  314 lines

  1. ;    'LINE' command for native-mode
  2. ;    run386 line
  3.     .386p            ;386ネイティブモード
  4.  
  5. CODE    segment
  6.     assume    cs:CODE
  7.  
  8. screen    macro    page,md        ;TBIOSを呼び出してscreenを
  9.     mov    ax,0100h+page    ;設定するマクロ
  10.     mov    dx,md
  11.     call    pword ptr fs:[20h] ;グラフィックBIOSを呼ぶ
  12.     endm
  13.  
  14. baibai    macro    x,y        ;TBIOSを呼び出してドットの
  15.     mov    ax,0202h    ;大きさを設定するマクロ
  16.     mov    dx,x
  17.     mov    bx,y
  18.     call    pword ptr fs:[20h]
  19.     endm
  20.  
  21. view    macro    x,y        ;TBIOSを呼び出して表示する
  22.     mov    ax,0203h    ;画面の大きさを設定する
  23.     mov    dx,x        ;マクロ
  24.     mov    bx,y
  25.     call    pword ptr fs:[20h]
  26.     endm
  27.  
  28. LOOP_CNT    equ 128
  29.  
  30. MAIN    proc            ;デモプログラム部分
  31.  
  32. TBIOS    equ    110h          ;TBIOSのセレクタ(実行用)
  33. TBIOSw    equ    118h          ;TBIOSのセレクタ(書き込み可)
  34.  
  35.     sub    esp,1600      ; スタック上にワ-ク領域を確保
  36.  
  37.     mov    al,5
  38.     push    Dword ptr TBIOSw
  39.     pop    fs
  40.     mov    fs:[10h],al    ; TBIOS[10h] <- screen-mode
  41.     push    Dword ptr TBIOS
  42.     pop    fs
  43.     push    ss
  44.     pop    gs
  45.     mov    edi,esp        ; gs:edi <- ss:[esp]
  46.     mov    ah,00h        ; 画面初期化
  47.     mov    ecx,1536
  48.     call    pword ptr fs:[20h]    ; call tbios
  49.     mov    ax,0500h    ; 書き込みペ-ジの指定
  50.     call    pword ptr fs:[20h]
  51.     mov    ax,0601h    ; 表示ペ-ジの指定
  52.     mov    edx,3
  53. call    pword ptr fs:[20h]
  54.  
  55.     screen    1,3    ; page 1 = screen 3
  56.     screen    0,5    ; page 0 = screen 5
  57. set256:    baibai    2,2
  58.     view    256,256
  59.  
  60.     add    esp,1600
  61.  
  62.     mov    eax,0            ;初期化
  63.     mov    edi,offset LINE_BUF
  64.     cld
  65.     mov    ecx,loop_cnt
  66.     rep stosd
  67.     mov    edx,0
  68.     mov    edi,0
  69.     mov    esi,1
  70.  
  71. MAIN1:
  72.     push    edx
  73.  
  74.     mov    ax,word ptr ds:[DX1]  ;x1を移動させる
  75.     add    word ptr ds:[X1],ax   ;画面の範囲を越えたら
  76.     cmp    word ptr ds:[X1],0    ;反射するようにする
  77.     jge    M1
  78.     mov    word ptr ds:[X1],0
  79.     neg    word ptr ds:[DX1]
  80.     jmp    M2
  81.  
  82. M1:    cmp    word ptr ds:[X1],255
  83.     jle    M2
  84.     mov    word ptr ds:[X1],255
  85.     neg    word ptr ds:[DX1]
  86.  
  87. M2:                    ;x2を移動させる    
  88.     mov    ax,word ptr ds:[DX2]    ;x1と同じ
  89.     add    word ptr ds:[X2],ax
  90.     cmp    word ptr ds:[X2],0
  91.     jge    M3
  92.     mov    word ptr ds:[X2],0
  93.     neg    word ptr ds:[DX2]
  94.     jmp    M4
  95.  
  96. M3:    cmp    word ptr ds:[X2],255
  97.     jle    M4
  98.     mov    word ptr ds:[X2],255
  99.     neg    word ptr ds:[DX2]
  100.  
  101. M4:                    ;y1を移動させる
  102.     mov    ax,word ptr ds:[DY1]    ;x1と同じ
  103.     add    word ptr ds:[Y1],ax
  104.     cmp    word ptr ds:[Y1],0
  105.     jge    M5
  106.     mov    word ptr ds:[Y1],0
  107.     neg    word ptr ds:[DY1]
  108.     jmp    M6
  109.  
  110. M5:    cmp    word ptr ds:[Y1],255
  111.     jle    M6
  112.     mov    word ptr ds:[Y1],255
  113.     neg    word ptr ds:[DY1]
  114.  
  115. M6:                    ;y2を移動させる
  116.     mov    ax,word ptr ds:[DY2]    ;x1と同じ
  117.     add    word ptr ds:[Y2],ax
  118.     cmp    word ptr ds:[Y2],0
  119.     jge    M7
  120.     mov    word ptr ds:[Y2],0
  121.     neg    word ptr ds:[DY2]
  122.     jmp    M8
  123.  
  124. M7:    cmp    word ptr ds:[Y2],255
  125.     jle    M8
  126.     mov    word ptr ds:[Y2],255
  127.     neg    word ptr ds:[DY2]
  128.  
  129. M8:        ;ラインルーチンに渡す引き数をスタックに積む
  130.     mov    eax,0            ;ページは0
  131.     push    eax
  132.  
  133.     push    edx            ;表示色
  134.  
  135.     mov    ax,word ptr ds:[Y2]    ;y2
  136.     push    eax
  137.     mov    cl,al
  138.  
  139.     mov    ax,word ptr ds:[X2]    ;x2
  140.     push    eax
  141.     mov    ch,al
  142.  
  143.     mov    ax,word ptr ds:[Y1]    ;y1
  144.     push    eax
  145.     mov    bl,al
  146.  
  147.     mov    ax,word ptr ds:[X1]    ;x1
  148.     push    eax
  149.     mov    bh,al
  150.  
  151.     mov    ax,dx
  152.  
  153.     mov    WORD PTR ds:[edi*4+LINE_BUF],bx    
  154.     mov    WORD PTR ds:[edi*4+LINE_BUF+2],cx
  155.     inc    edi        ;この線をとっておく
  156.     cmp    edi,LOOP_CNT
  157.     jb    M9
  158.     mov    edi,0
  159. M9:
  160.     call    line        ;ラインルーチンを呼ぶ
  161.  
  162.     add    esp,24        ;スタックレベルを戻す
  163.  
  164.     mov    bx,WORD PTR ds:[esi*4+LINE_BUF]
  165.     mov    cx,WORD PTR ds:[esi*4+LINE_BUF+2]
  166.         ;バッファから128本前のデータをとってくる
  167.  
  168.     mov    eax,0    ;引き数をセット
  169.     push    eax
  170.  
  171.     push    DWORD PTR 0    ;色を黒にして消す
  172.  
  173.     movzx    ax,cl
  174.     push    eax
  175.  
  176.     movzx    ax,ch
  177.     push    eax
  178.  
  179.     movzx    ax,bl
  180.     push    eax
  181.  
  182.     movzx    ax,bh
  183.     push    eax
  184.  
  185.     inc    esi
  186.     cmp    esi,LOOP_CNT
  187.     jb    M10
  188.     mov    esi,0
  189. M10:
  190.     call    line        ;ラインルーチンを呼ぶ
  191.  
  192.     add    esp,24
  193.     pop    edx
  194.     add    edx,1
  195.     cmp    edx,7fffh
  196.     jb    MAIN1
  197.  
  198.     mov    ah,4Ch
  199.     int    21h
  200. MAIN    endp
  201.  
  202. ;    ラインルーチン本体
  203.  
  204. ;void line(int x1,int y1,int x2,int y2,int col,int page);
  205. ;    for 256*512*32K colors (GRAPHIC MODE 5) only
  206.  
  207.     public    line    ;このへんはおまじないと思ってください
  208.     db    'line',4    ;for stackdump
  209. line    proc
  210.     push    ebp
  211.     push    esi
  212.     push    edi
  213.     push    ebx
  214.  
  215.     mov    bp,ss:[esp+20+16]    ;色を読み込む
  216.     mov    edi,ss:[esp+20+20]    ;ページを読み込む
  217.     shl    edi,9
  218.     mov    bh,ss:[esp+20+0]    ;x1を読み込む
  219.     mov    bl,ss:[esp+20+4]    ;y1  〃
  220.     mov    ch,ss:[esp+20+8]    ;x2  〃
  221.     mov    cl,ss:[esp+20+12]    ;y2  〃
  222.     mov    dh,bl
  223.     mov    dl,bh
  224.     movzx    edx,dx
  225.     lea    esi,[edi+edx*2]        ;(x1,y1)のアドレス
  226.                     ;を求める
  227.     push    ds        ;dsをVRAMのセレクタに
  228.     mov    dx,120h        ;にする
  229.     mov    ds,dx
  230.  
  231.     mov    edx,2        ;edxが横方向の増加量
  232.     sub    ch,bh
  233.     jnb    short #liney    ;xが増える方向に線を引く?
  234.     neg    edx    ;減る方向だとedxをマイナスにする
  235.     neg    ch
  236. #liney:    mov    edi,512        ;ediが縦方向の増加量
  237.     sub    cl,bl
  238.     jnb    short #liner    ;yが増える方向に線を引く?
  239.     neg    edi    ;減る方向だとediをマイナスにする
  240.     neg    cl
  241.  
  242. #liner:    cmp    ch,cl        ;xとyのどちらの変化量が
  243.     je    short #lines    ;大きいか調べて,chが
  244.     ja    short #lineg    ;大きいようにする
  245.     xchg    ch,cl        ;同じ時はlinesに飛ぶ
  246.     xchg    edi,edx        ;縦横の変化量も取り替える
  247.  
  248. #lineg:    mov    ah,cl        ;割り算をして,
  249.     mov    al,0        ;傾きを求める。
  250.     div    ch
  251.     mov    ah,128
  252.  
  253.         movzx   cx,ch           ;ループカウンタに
  254.         movzx   ecx,cx          ;横方向のドット数を
  255.         inc     cx              ;いれる。
  256.  
  257.     align    4
  258. #lineg1:
  259.     mov    ds:[esi],bp    ;1ドット点をかく
  260.     add    esi,edx        ;横に座標を動かす
  261.     add    ah,al        ;傾きを足す
  262.     jnb    short #lineg2    ;あふれたら縦に
  263.     add    esi,edi        ;点を動かす
  264. #lineg2:
  265.     loop    #lineg1        ;ループ
  266.     jmp    #exit
  267.  
  268.     align 4
  269. #lines: movzx   cx,ch           ;ループカウンタに
  270.         movzx   ecx,cx          ;横方向のドット数を
  271.         inc     cx              ;いれる
  272.  
  273.     align    4
  274. #lines1:            ;傾きが1のときの
  275.     mov    ds:[esi],bp    ;ルーチン
  276.     add    esi,edx        ;縦横に1回ずつ
  277.     add    esi,edi        ;動かしてドットをかく
  278.     loop    #lines1
  279.  
  280. #exit:
  281.     pop    ds        ;スタックを元に
  282.     pop    ebx        ;戻す
  283.     pop    edi
  284.     pop    esi
  285.     pop    ebp
  286.     ret
  287.  
  288. line    endp
  289.  
  290. CODE    ends
  291.  
  292. DATA    segment
  293.     assume    ds:DATA
  294.  
  295. X1    dw    38    ;メインプログラムで使っているワーク
  296. Y1    dw    56
  297. X2    dw    34
  298. Y2    dw    100
  299. DX1    dw    1
  300. DY1    dw    2
  301. DX2    dw    3
  302. DY2    dw    4
  303.  
  304. LINE_BUF dd    128 dup(0) ;128本分のバッファを用意している
  305.  
  306. DATA    ends
  307.  
  308. STACK    segment stack
  309.     assume    ss:STACK
  310.     db    2000 dup(?)
  311. STACK    ends
  312.  
  313.     end    MAIN
  314.