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

  1. ;    'VIEW1.EXP' command for native-mode
  2. ;    run386 VIEW
  3.     .386p
  4.  
  5. SIZE_X    equ    256
  6. SIZE_Y    equ    240
  7. MOVE_X    equ    4
  8. MOVE_Y    equ    4
  9.  
  10. CODE    segment
  11.     assume    cs:CODE
  12.     org 0
  13.  
  14. MAIN    proc
  15.     pusha
  16.     sub    esp,256*1024    ;vram buffer をstackに作る
  17.     mov    ebp,esp
  18.     
  19.     mov    ax,120h        ;vramをセーブ
  20.     mov    fs,ax
  21.     mov    ax,ss
  22.     mov    es,ax
  23.     mov    ecx,256*1024/4
  24.     mov    edi,ebp
  25.     mov    esi,0
  26.     cld
  27.     rep movs    DWORD PTR [edi],DWORD PTR fs:[esi]
  28.     
  29.     sub    esp,1536    ;EGB buffer をstackに作る
  30.     
  31.     push    ss        ;graphicのinitialize
  32.     pop    gs
  33.     mov    edi,esp
  34.     mov    ecx,1536
  35.     mov    ah,0
  36.     push    0110h
  37.     pop    fs
  38.     call    PWORD PTR fs:[20h]
  39.     
  40.     mov    ah,01h        ;page = 0 を画面mode 5
  41.     mov    al,0
  42.     mov    dx,5
  43.     call    PWORD PTR fs:[20h]
  44.     
  45.     mov    ah,02h        ;表示位置を真ん中に
  46.     mov    al,0
  47.     mov    dx,64
  48.     mov    bx,0
  49.     call    PWORD PTR fs:[20h]
  50.     
  51.     mov    ah,02h        ;拡大率を設定
  52.     mov    al,2
  53.     mov    dx,2
  54.     mov    bx,2
  55.     call    PWORD PTR fs:[20h]
  56.     
  57.     mov    ah,02h        ;表示の大きさを設定
  58.     mov    al,3
  59.     mov    dx,256
  60.     mov    bx,240
  61.     call    PWORD PTR fs:[20h]
  62.     
  63.     mov    ah,06h        ;表示の設定
  64.     mov    al,1
  65.     mov    edx,1
  66.     call    PWORD PTR fs:[20h]
  67.     
  68.     push    0120h        ;初期値の設定
  69.     pop    es
  70.     mov    edi,0
  71.     
  72.     call    dsp
  73.     call    chg_scr
  74.     
  75. #looptop:            ;メインループ
  76.     
  77.     mov    ah,41h        ;ジョイスティックを読む
  78.     mov    dh,0
  79.     call    pword ptr fs:[80h]
  80.     mov    ds:[JOYDAT],dl
  81.     
  82.     cmp    dl,0ffh        ;何も押していない
  83.     je    #looptop
  84.     
  85.     mov    eax,ds:[SIN1]    ;横の移動量を計算
  86.     mov    ebx,SIZE_X/32*256
  87.     mul    ebx
  88.     shrd    eax,edx,8
  89.     mov    ds:[GX],eax
  90.     
  91.     mov    eax,ds:[COS1]    ;縦の移動量を計算
  92.     mov    ebx,SIZE_X/32*256
  93.     mul    ebx
  94.     shrd    eax,edx,7
  95.     mov    ds:[GY],eax
  96.     
  97.     test    ds:[JOYDAT],02h
  98.     jne    #not_down
  99.     
  100.     cmp    ds:[TH],64    ;下移動。4つに場合分け
  101.     jae    #down_2
  102.     
  103.     mov    eax,ds:[GX]
  104.     sub    ds:[CNX],eax
  105.     mov    eax,ds:[GY]
  106.     add    ds:[CNY],eax
  107.     jmp    #not_down
  108.     
  109. #down_2:
  110.     cmp    ds:[TH],128
  111.     jae    #down_3
  112.     
  113.     mov    eax,ds:[GX]
  114.     sub    ds:[CNX],eax
  115.     mov    eax,ds:[GY]
  116.     sub    ds:[CNY],eax
  117.     jmp    #not_down
  118.     
  119. #down_3:
  120.     cmp    ds:[TH],192
  121.     jae    #down_4
  122.     
  123.     mov    eax,ds:[GX]
  124.     add    ds:[CNX],eax
  125.     mov    eax,ds:[GY]
  126.     sub    ds:[CNY],eax
  127.     jmp    #not_down
  128.     
  129. #down_4:
  130.     mov    eax,ds:[GX]
  131.     add    ds:[CNX],eax
  132.     mov    eax,ds:[GY]
  133.     add    ds:[CNY],eax
  134.     
  135. #not_down:
  136.     test    ds:[JOYDAT],01h
  137.     jne    #not_up
  138.     
  139.     cmp    ds:[TH],64    ;上移動。4つに場合分け
  140.     jae    #up_2
  141.     
  142.     mov    eax,ds:[GX]
  143.     add    ds:[CNX],eax
  144.     mov    eax,ds:[GY]
  145.     sub    ds:[CNY],eax
  146.     jmp    #not_up
  147.     
  148. #up_2:
  149.     cmp    ds:[TH],128
  150.     jae    #up_3
  151.     
  152.     mov    eax,ds:[GX]
  153.     add    ds:[CNX],eax
  154.     mov    eax,ds:[GY]
  155.     add    ds:[CNY],eax
  156.     jmp    #not_up
  157.     
  158. #up_3:
  159.     cmp    ds:[TH],192
  160.     jae    #up_4
  161.     
  162.     mov    eax,ds:[GX]
  163.     sub    ds:[CNX],eax
  164.     mov    eax,ds:[GY]
  165.     add    ds:[CNY],eax
  166.     jmp    #not_up
  167.     
  168. #up_4:
  169.     
  170.     mov    eax,ds:[GX]
  171.     sub    ds:[CNX],eax
  172.     mov    eax,ds:[GY]
  173.     sub    ds:[CNY],eax
  174.     
  175. #not_up:
  176.     test    ds:[JOYDAT],04h
  177.     jne    #not_left
  178.     
  179.     sub    ds:[TH],2    ;左回転
  180.     
  181. #not_left:
  182.     test    ds:[JOYDAT],08h
  183.     jne    #not_right
  184.     
  185.     add    ds:[TH],2    ;右回転
  186.     
  187. #not_right:
  188.     test    ds:[JOYDAT],10h
  189.     jne    #not_a
  190.                 ;画面を縮小
  191.     mov    ax,word ptr ds:[ZM]
  192.     mov    bx,0110h
  193.     mul    bx
  194.     shrd    ax,dx,8
  195.     mov    word ptr ds:[ZM],ax
  196.     cmp    word ptr ds:[ZM],0F00h
  197.     jle    #not_a
  198.     mov    ds:[ZM],0F00h
  199.     
  200. #not_a:
  201.     test    ds:[JOYDAT],20h
  202.     jne    #not_b
  203.                 ;画面を拡大
  204.     mov    ax,word ptr ds:[ZM]
  205.     mov    bx,00f0h
  206.     mul    bx
  207.     shrd    ax,dx,8
  208.     mov    word ptr ds:[ZM],ax
  209.     cmp    word ptr ds:[ZM],0011h
  210.     jg    #not_b
  211.     mov    ds:[ZM],0011h
  212.     
  213. #not_b:
  214.     test    ds:[JOYDAT],80h
  215.     jne    #not_select
  216.     
  217.     jmp    #exit        ;終了
  218.     
  219. #not_select:
  220.     test    ds:[JOYDAT],40h
  221.     jne    #not_run
  222.     
  223.     mov    ds:[ZM],0100h    ;初期値に設定
  224.     mov    ds:[TH],0
  225.     mov    ds:[CNX],(SIZE_X/2)*00800000h
  226.     mov    ds:[CNY],(SIZE_Y/2)*01000000h
  227.     
  228. #not_run:
  229.     
  230.     call    dsp        ;1画面を描画
  231.     call    chg_scr        ;画面を切替え
  232.     
  233.     jmp    #looptop
  234.     
  235. #exit:
  236.     mov    edi,esp        ;TBIOS用にbufferのpointer
  237.     push    0110h        ;とsegmentをセット
  238.     pop    fs
  239.     
  240.     mov    ah,01h        ;page = 0 を画面mode 10
  241.     mov    al,0
  242.     mov    dx,10
  243.     call    PWORD PTR fs:[20h]
  244.     
  245.     mov    ah,02h        ;表示位置を戻す
  246.     mov    al,0
  247.     mov    dx,0
  248.     mov    bx,0
  249.     call    PWORD PTR fs:[20h]
  250.     
  251.     mov    ah,02h        ;拡大率を戻す
  252.     mov    al,2
  253.     mov    dx,2
  254.     mov    bx,2
  255.     call    PWORD PTR fs:[20h]
  256.     
  257.     mov    ah,02h        ;表示の大きさを戻す
  258.     mov    al,3
  259.     mov    dx,320
  260.     mov    bx,240
  261.     call    PWORD PTR fs:[20h]
  262.     
  263.     mov    ah,06h        ;表示の設定
  264.     mov    al,1
  265.     mov    edx,3
  266.     call    PWORD PTR fs:[20h]
  267.     
  268.     mov    ax,120h        ;vramのデータを戻す
  269.     mov    es,ax
  270.     mov    ax,ss
  271.     mov    fs,ax
  272.     mov    ecx,256*1024/4
  273.     mov    edi,0
  274.     mov    esi,ebp
  275.     cld
  276.     rep movs    DWORD PTR [edi],DWORD PTR fs:[esi]
  277.     
  278.     add    esp,1536    ;EGB buffer を開放
  279.     add    esp,256*1024    ;vram buffer を開放
  280.     
  281.     popa
  282.     mov    ah,4Ch
  283.     int    21h
  284. MAIN    endp
  285.  
  286. dsp    proc
  287.     call    tri        ;SIN、COS を設定
  288.     
  289.     mov    ax,ds:[COS]    ;拡大率を考慮してX座標の
  290.     mov    bx,ds:[ZM]    ;1ドット分の変化量を求める
  291.     mul    bx
  292.     mov    word ptr ds:[COS1+2],dx
  293.     mov    word ptr ds:[COS1+0],ax
  294.     shl    eax,16
  295.     shld    edx,eax,16
  296.     mov    ds:[DDX],edx
  297.     
  298.     mov    ax,ds:[SIN]    ;拡大率を考慮してY座標の
  299.     mov    bx,ds:[ZM]    ;1ドット分の変化量を求める
  300.     mul    bx
  301.     mov    word ptr ds:[SIN1+2],dx
  302.     mov    word ptr ds:[SIN1+0],ax
  303.     shl    eax,16
  304.     shld    edx,eax,17
  305.     mov    ds:[DDY],edx
  306.     
  307.                 ;左上の座標を求める
  308.     mov    eax,ds:[COS1]
  309.     mov    ebx,SIZE_X/2*256
  310.     mul    ebx
  311.     shrd    eax,edx,8
  312.     mov    ds:[XCOS],eax
  313.     
  314.     mov    eax,ds:[SIN1]
  315.     mov    ebx,SIZE_X/2*256
  316.     mul    ebx
  317.     shrd    eax,edx,8
  318.     mov    ds:[XSIN],eax
  319.     
  320.     mov    eax,ds:[COS1]
  321.     mov    ebx,SIZE_Y/2*256
  322.     mul    ebx
  323.     shrd    eax,edx,8
  324.     mov    ds:[YCOS],eax
  325.     
  326.     mov    eax,ds:[SIN1]
  327.     mov    ebx,SIZE_Y/2*256
  328.     mul    ebx
  329.     shrd    eax,edx,8
  330.     mov    ds:[YSIN],eax
  331.     
  332.     mov    eax,ds:[CNX]
  333.     mov    ds:[GX],eax
  334.     mov    eax,ds:[CNY]
  335.     mov    ds:[GY],eax
  336.     
  337.                 ;符号で4つに場合分けする
  338.     cmp    ds:[TH],63
  339.     jbe    case1
  340.     
  341.     cmp    ds:[TH],127
  342.     jbe    case2
  343.     
  344.     cmp    ds:[TH],191
  345.     jbe    case3
  346.     
  347.     jmp    case4
  348. dsp    endp
  349.  
  350. case1    proc
  351.     mov    eax,ds:[XCOS]
  352.     sub    ds:[GX],eax
  353.     mov    eax,ds:[YSIN]
  354.     add    ds:[GX],eax
  355.     
  356.     mov    eax,ds:[XSIN]
  357.     shl    eax,1
  358.     sub    ds:[GY],eax
  359.     mov    eax,ds:[YCOS]
  360.     shl    eax,1
  361.     sub    ds:[GY],eax
  362.     
  363.     mov    ebx,ds:[GY]
  364.     mov    esi,ds:[GX]
  365.     
  366.     mov    ecx,ds:[DDX]
  367.     mov    edx,ds:[DDY]
  368.     shl    ecx,1
  369.     mov    ds:[DDY1],ecx
  370.     shr    edx,1
  371.     mov    ds:[DDX1],edx
  372.     
  373.     mov    ecx,ds:[DDX]
  374.     mov    edx,ds:[DDY]
  375.     
  376.     mov    ds:[LOPCNT1],240
  377.     
  378.     align    4
  379. #l1:
  380.     mov    ds:[LOPCNT2],256
  381.     
  382.     align    4
  383. #l2:                    ;ここが最小ループ
  384.     xor    eax,eax            ;
  385.     shld    eax,ebx,8        ;
  386.     shld    eax,esi,9        ;
  387.     mov    ax,[ebp+eax*2]        ;
  388.     stosw                ;
  389.     add    esi,ecx            ;
  390.     add    ebx,edx            ;
  391.                     ;
  392.     dec    DWORD PTR ds:[LOPCNT2]    ;
  393.     jne    short #l2        ;
  394.     
  395.     mov    ebx,ds:[GY]
  396.     mov    esi,ds:[GX]
  397.     sub    esi,ds:[DDX1]
  398.     add    ebx,ds:[DDY1]
  399.     mov    ds:[GY],ebx
  400.     mov    ds:[GX],esi
  401.     
  402.     dec    DWORD PTR ds:[LOPCNT1]
  403.     jne    #l1
  404.     
  405.     ret
  406. case1    endp
  407.  
  408. case2    proc
  409.     mov    eax,ds:[XCOS]
  410.     add    ds:[GX],eax
  411.     mov    eax,ds:[YSIN]
  412.     add    ds:[GX],eax
  413.     
  414.     mov    eax,ds:[XSIN]
  415.     shl    eax,1
  416.     sub    ds:[GY],eax
  417.     mov    eax,ds:[YCOS]
  418.     shl    eax,1
  419.     add    ds:[GY],eax
  420.     
  421.     mov    ebx,ds:[GY]
  422.     mov    esi,ds:[GX]
  423.     
  424.     mov    ecx,ds:[DDX]
  425.     mov    edx,ds:[DDY]
  426.     shl    ecx,1
  427.     mov    ds:[DDY1],ecx
  428.     shr    edx,1
  429.     mov    ds:[DDX1],edx
  430.     
  431.     mov    ecx,ds:[DDX]
  432.     mov    edx,ds:[DDY]
  433.     
  434.     mov    ds:[LOPCNT1],240
  435.     
  436.     align    4
  437. #l1:
  438.     mov    ds:[LOPCNT2],256
  439.     
  440.     align    4
  441. #l2:
  442.     xor    eax,eax
  443.     shld    eax,ebx,8
  444.     shld    eax,esi,9
  445.     mov    ax,[ebp+eax*2]
  446.     stosw
  447.     sub    esi,ecx
  448.     add    ebx,edx
  449.     
  450.     dec    DWORD PTR ds:[LOPCNT2]
  451.     jne    short #l2
  452.     
  453.     mov    ebx,ds:[GY]
  454.     mov    esi,ds:[GX]
  455.     sub    esi,ds:[DDX1]
  456.     sub    ebx,ds:[DDY1]
  457.     mov    ds:[GY],ebx
  458.     mov    ds:[GX],esi
  459.     
  460.     dec    DWORD PTR ds:[LOPCNT1]
  461.     jne    #l1
  462.     
  463.     ret
  464. case2    endp
  465.  
  466. case3    proc
  467.     mov    eax,ds:[XCOS]
  468.     add    ds:[GX],eax
  469.     mov    eax,ds:[YSIN]
  470.     sub    ds:[GX],eax
  471.     
  472.     mov    eax,ds:[XSIN]
  473.     shl    eax,1
  474.     add    ds:[GY],eax
  475.     mov    eax,ds:[YCOS]
  476.     shl    eax,1
  477.     add    ds:[GY],eax
  478.     
  479.     mov    ebx,ds:[GY]
  480.     mov    esi,ds:[GX]
  481.     
  482.     mov    ecx,ds:[DDX]
  483.     mov    edx,ds:[DDY]
  484.     shl    ecx,1
  485.     mov    ds:[DDY1],ecx
  486.     shr    edx,1
  487.     mov    ds:[DDX1],edx
  488.     
  489.     mov    ecx,ds:[DDX]
  490.     mov    edx,ds:[DDY]
  491.     
  492.     mov    ds:[LOPCNT1],240
  493.     
  494.     align    4
  495. #l1:
  496.     mov    ds:[LOPCNT2],256
  497.     
  498.     align    4
  499. #l2:
  500.     xor    eax,eax
  501.     shld    eax,ebx,8
  502.     shld    eax,esi,9
  503.     mov    ax,[ebp+eax*2]
  504.     stosw
  505.     sub    esi,ecx
  506.     sub    ebx,edx
  507.     
  508.     dec    DWORD PTR ds:[LOPCNT2]
  509.     jne    short #l2
  510.     
  511.     mov    ebx,ds:[GY]
  512.     mov    esi,ds:[GX]
  513.     add    esi,ds:[DDX1]
  514.     sub    ebx,ds:[DDY1]
  515.     mov    ds:[GY],ebx
  516.     mov    ds:[GX],esi
  517.     
  518.     dec    DWORD PTR ds:[LOPCNT1]
  519.     jne    #l1
  520.     
  521.     ret
  522. case3    endp
  523.  
  524. case4    proc
  525.     mov    eax,ds:[XCOS]
  526.     sub    ds:[GX],eax
  527.     mov    eax,ds:[YSIN]
  528.     sub    ds:[GX],eax
  529.     
  530.     mov    eax,ds:[XSIN]
  531.     shl    eax,1
  532.     add    ds:[GY],eax
  533.     mov    eax,ds:[YCOS]
  534.     shl    eax,1
  535.     sub    ds:[GY],eax
  536.     
  537.     mov    ebx,ds:[GY]
  538.     mov    esi,ds:[GX]
  539.     
  540.     mov    ecx,ds:[DDX]
  541.     mov    edx,ds:[DDY]
  542.     shl    ecx,1
  543.     mov    ds:[DDY1],ecx
  544.     shr    edx,1
  545.     mov    ds:[DDX1],edx
  546.     
  547.     mov    ecx,ds:[DDX]
  548.     mov    edx,ds:[DDY]
  549.     
  550.     mov    ds:[LOPCNT1],240
  551.     
  552.     align    4
  553. #l1:
  554.     mov    ds:[LOPCNT2],256
  555.     
  556.     align    4
  557. #l2:
  558.     xor    eax,eax
  559.     shld    eax,ebx,8
  560.     shld    eax,esi,9
  561.     mov    ax,[ebp+eax*2]
  562.     stosw
  563.     add    esi,ecx
  564.     sub    ebx,edx
  565.     
  566.     dec    DWORD PTR ds:[LOPCNT2]
  567.     jne    short #l2
  568.     
  569.     mov    ebx,ds:[GY]
  570.     mov    esi,ds:[GX]
  571.     add    esi,ds:[DDX1]
  572.     add    ebx,ds:[DDY1]
  573.     mov    ds:[GY],ebx
  574.     mov    ds:[GX],esi
  575.     
  576.     dec    DWORD PTR ds:[LOPCNT1]
  577.     jne    #l1
  578.     
  579.     ret
  580. case4    endp
  581.  
  582. tri    proc        ;三角関数をセットする
  583.     mov    al,ds:[TH]
  584.     cmp    al,128
  585.     jb    #l1
  586.     sub    al,128
  587. #l1:
  588.     cmp    al,64
  589.     jbe    #l2
  590.     sub    al,128
  591.     neg    al
  592. #l2:
  593.     movzx    ax,al
  594.     movzx    eax,ax
  595.     mov    bx,ds:[TRI_TBL+eax*2]
  596.     mov    ds:[SIN],bx
  597.     mov    al,ds:[TH]
  598.     add    al,64
  599.     cmp    al,128
  600.     jb    #l3
  601.     sub    al,128
  602. #l3:
  603.     cmp    al,64
  604.     jbe    #l4
  605.     sub    al,128
  606.     neg    al
  607. #l4:
  608.     movzx    ax,al
  609.     movzx    eax,ax
  610.     mov    bx,ds:[TRI_TBL+eax*2]
  611.     mov    ds:[COS],bx
  612.     ret
  613. tri    endp
  614.  
  615. chg_scr    proc
  616.     cmp    ds:[scr_pg],0
  617.     je    #l1
  618.     
  619.     mov    edi,00000h
  620.     mov     dx,0440h
  621.         mov     al,17
  622.         out     dx,al
  623.         mov     dx,0442h
  624.         mov     ax,8000h
  625.         out     dx,ax
  626.     mov    ds:[scr_pg],0
  627.     ret
  628. #l1:
  629.     mov    edi,20000h
  630.     mov     dx,0440h
  631.         mov     al,17
  632.         out     dx,al
  633.         mov     dx,0442h
  634.         mov     ax,0
  635.         out     dx,ax
  636.     mov    ds:[scr_pg],1
  637.     ret
  638. chg_scr    endp
  639.  
  640. CODE    ends
  641.  
  642.  
  643. DATA    segment
  644.     assume    ds:DATA
  645.     align 4
  646. CNX    dd    (SIZE_X/2)*00800000h
  647. CNY    dd    (SIZE_Y/2)*01000000h
  648. XSIN    dd    0
  649. XCOS    dd    0
  650. YSIN    dd    0
  651. YCOS    dd    0
  652. SIN    dw    0
  653. COS    dw    0
  654. SIN1    dd    0
  655. COS1    dd    0
  656. GX    dd    0
  657. GY    dd    0
  658. DDX    dd    0
  659. DDY    dd    0
  660. LOPCNT1 dd    0
  661. LOPCNT2 dd    0
  662. DDX1    dd    0
  663. DDY1    dd    0
  664. scr_pg    dd    0
  665. TRI_TBL    dw    0000h,0324h,0648h,096Bh,0C8Ch,0FABh,12C8h,15E2h
  666.     dw    18F9h,1C0Ch,1F1Ah,2224h,2528h,2827h,2B1Fh,2E11h
  667.     dw    30FCh,33DFh,36BAh,398Dh,3C57h,3F17h,41CEh,447Bh
  668.     dw    471Dh,49B4h,4C40h,4EC0h,5134h,539Bh,55F6h,5843h
  669.     dw    5A82h,5CB4h,5ED7h,60ECh,62F2h,64E9h,66CFh,68A7h
  670.     dw    6A6Eh,6C24h,6DCAh,6F5Fh,70E3h,7255h,73B6h,7505h
  671.     dw    7642h,776Ch,7885h,798Ah,7A7Dh,7B5Dh,7C2Ah,7CE4h
  672.     dw    7D8Ah,7E1Eh,7E9Dh,7F0Ah,7F62h,7FA7h,7FD9h,7FF6h
  673.     dw    8000h
  674. JOYDAT    db    0
  675. TH    db    0
  676. ZM    dw    0100h
  677. credit    db    'Copy right T.Higashi 1990'
  678. DATA    ends
  679.  
  680.  
  681. STACK    segment stack
  682.     assume    ss:STACK
  683.     db    300000 dup(?)
  684. STACK    ends
  685.  
  686.     end    MAIN
  687.