home *** CD-ROM | disk | FTP | other *** search
/ FreeWare Collection 2 / FreeSoftwareCollection2pd199x-jp.img / etv2 / etv2.a < prev    next >
Text File  |  1990-06-14  |  16KB  |  609 lines

  1. /*
  2.                TV☆TOWNS  -リアルタイムエフェクタ-
  3.  
  4.                      Version  1.0       1990/04/25    
  5.  
  6.                          by Pumpkin (MHD00746)     
  7. */
  8. /*
  9.                      Version  2.01      1990/05/05    
  10.                      Version  2.02      1990/05/24    
  11.                      Version  2.03      1990/06/02    
  12.  
  13.                          by  ムンパッパ (MHB02550)     
  14. */
  15.           .text
  16.           .data
  17.  
  18.           /* 初期化 */
  19.  
  20.           call   G_INIT
  21.           call   KEY_INIT
  22.  
  23.           movl   %esp,(esp_w)           /* パレットテーブル領域を作る */
  24.           movl   $0x8000,%ecx
  25. ini_lp:   pushw  $0
  26.           loop   ini_lp
  27.           movl   %esp,(table)
  28.  
  29.           mov    $0,%al                 /* 320×240 ロウスキャン */
  30.           mov    $11,%dx
  31.           call   SCREEN_MODE
  32.           mov    $1,%al
  33.           mov    $11,%dx
  34.           call   SCREEN_MODE
  35.  
  36.           mov    $1,%al                 /* レイヤ1が前、レイヤ0非表示 */ 
  37.           mov    $2,%edx
  38.           call   DISPLAY_PAGE
  39.  
  40.           mov    $0x43,%ah
  41.           mov    $0,%bl
  42.           mov    $0x7f7f,%dx
  43.           lcall  %fs:(0x80)             /* ライン入力オン */
  44.  
  45.           /* メインルーチン */
  46.  
  47.           movb   $0x4e,%dl
  48.  
  49. Main_loop:
  50.           cmpb   $13,%dl
  51.           je     Main_Bye
  52.  
  53.           cmpb   $0x4d,%dl              /* M, m */
  54.           je     mono_sub
  55.           cmpb   $0x6d,%dl
  56.           je     mono_sub
  57.  
  58.           cmpb   $0x53,%dl              /* S, s */
  59.           je     sep_sub 
  60.           cmpb   $0x73,%dl
  61.           je     sep_sub 
  62.  
  63.           cmpb   $0x42,%dl              /* B, b */
  64.           je     border
  65.           cmpb   $0x62,%dl
  66.           je     border
  67.  
  68.           cmpb   $0x4b,%dl              /* K, k */
  69.           je     shadow
  70.           cmpb   $0x6b,%dl
  71.           je     shadow
  72.  
  73.           cmpb   $0x39,%dl
  74.           jg     default
  75.  
  76.           cmpb   $0x30,%dl
  77.           jl     default
  78.  
  79.           call   mask_set
  80.           jmp    qeffect
  81. default:
  82.           jmp     normal
  83.  
  84. Main_ret:         
  85.           call   effect
  86.           jmp    Main_loop
  87.  
  88.           /* 後処理 */
  89.  
  90. Main_Bye:
  91.           mov    $0x43,%ah
  92.           mov    $0,%bl
  93.           xor    %dx,%dx
  94.           lcall  %fs:(0x80)           /* ライン入力オフ */
  95.           
  96.           call   G_INIT
  97.  
  98.           mov    $0,%al               /* MS-DOSの画面 */
  99.           mov    $1,%dx
  100.           call   SCREEN_MODE
  101.           mov    $1,%al
  102.           mov    $1,%dx
  103.           call   SCREEN_MODE
  104.           mov    $1,%al               /* レイヤ1が前、レイヤ全表示 */ 
  105.           mov    $3,%edx
  106.           call   DISPLAY_PAGE
  107.           mov    $0x440,%dx
  108.           movb   $0x18,%al
  109.           outb   %al,%dx              /* REG No. set */
  110.           addw   $2,%dx
  111.           movw   $0x80,%ax
  112.           outw   %ax,%dx              /* 1024 x 512 */
  113.  
  114.           /* パレットセット */
  115.  
  116.           movl   $0,%ebx
  117.           movl   $0,%ecx
  118. plt_lp:
  119.       movw     $0xfd90,%dx
  120.           movb   %cl,%al
  121.           outb   %al,%dx              /* パレット No. セット */
  122.  
  123.       addw   $2,%dx
  124.           movw   palette(,%ebx,1),%ax   /* 青 */
  125.           outw   %ax,%dx 
  126.           inc     %ebx
  127.  
  128.       addw   $2,%dx
  129.           movw   palette(,%ebx,1),%ax   /* 赤 */
  130.           outw   %ax,%dx 
  131.           inc     %ebx
  132.  
  133.       addw   $2,%dx
  134.           movw   palette(,%ebx,1),%ax   /* 緑 */
  135.           outw   %ax,%dx 
  136.           inc     %ebx
  137.  
  138.           inc     %ecx
  139.           cmpl   $16,%ecx
  140.           jb     plt_lp
  141.  
  142.           call   KEY_OFF              /* クリック音 OFF */
  143.  
  144.           movl   (esp_w),%esp
  145.  
  146.           mov    $0x4c00,%ax          /* さよなら */
  147.           int    $0x21
  148.  
  149.           /* 通常表示 */
  150. normal:
  151.           mov    $1,%al               /* レイヤ1を透明にする */
  152.           call   WRITE_PAGE
  153.           mov    $0x8000,%edx
  154.           call   BACK_COLOR
  155.           call   CLS
  156.  
  157.           movw   $0x1a81,%ax
  158.           lcall  %fs:(0x20)           /* インポーズオン */
  159.  
  160. no_lp:    call   INKEY                /* while inkey$="":wend */
  161.           cmpb   $0xff,%dl
  162.           je     no_lp
  163.  
  164.           cmpb   $0x6e,%dl              /* キー内容チェック */
  165.           je     no_lp
  166.           cmpb   $0x4e,%dl
  167.           je     no_lp
  168. no_bye:
  169.           movw   $0x1a00,%ax
  170.           lcall  %fs:(0x20)           /* インポーズオフ */
  171.  
  172.           jmp    Main_loop
  173.  
  174.           /* エフェクト表示 */
  175. effect:
  176.       call   DIGITIZE
  177.  
  178.           movl   (table),%ebp
  179. ef_lp0:
  180.           xor    %esi,%esi
  181.           movl   $239,%ecx
  182. ef_lp1:   push   %ecx
  183.           movl   $319,%ecx
  184. ef_lp2:
  185.           movw   %es:(%esi),%dx       /* レイヤ0からとる */
  186.           movw   (%ebp,%edx,2),%ax    /* パレットアクセス */
  187.           movw   %ax,%es:0x40000(%esi)
  188.           inc    %esi
  189.           inc    %esi
  190.           loop   ef_lp2
  191.           pop    %ecx
  192.           addl   $386,%esi
  193.           loop   ef_lp1
  194.  
  195.       inb     $0602,%al           /* STATUS チェック */
  196.           and    $01,%al
  197.           jne    ef_lp0
  198.  
  199.           call   INKEY
  200.           cmpb   $0xff,%dl
  201.           je     ef_lp0
  202. ef_bye:
  203.           mov    $0x1b00,%ax
  204.           lcall  %fs:(0x20)           /* デジタイズオフ */
  205.           ret
  206.  
  207.           /* クイック エフェクト表示 */
  208. qeffect:
  209.       call   DIGITIZE
  210. qef_lp0:
  211.           movl   (mask),%ebx
  212.           xor    %esi,%esi
  213.           movl   $239,%ecx
  214. qef_lp1:  push   %ecx
  215.           movl   $159,%ecx
  216. qef_lp2:
  217.           movl   %es:(%esi),%eax      /* レイヤ0からとる */
  218. qef_and:
  219.           andl   %ebx,%eax    /* mask  */
  220.           movl   %eax,%es:0x40000(%esi)
  221.  
  222.           addl   $4,%esi
  223.           loop   qef_lp2
  224.  
  225.           pop    %ecx
  226.           addl   $388,%esi
  227.           loop   qef_lp1
  228.  
  229.           call   INKEY
  230.           cmpb   $0xff,%dl
  231.           je     qef_lp0
  232.  
  233.           cmpb   $0x30,%dl           /* キー内容チェック */
  234.           jl     qef_bye
  235.           cmpb   $0x39,%dl
  236.           jg     qef_bye
  237.  
  238.           call   mask_set
  239.           jmp    qef_lp0
  240. qef_bye:
  241.           mov    $0x1b00,%ax
  242.           lcall  %fs:(0x20)           /* デジタイズオフ */
  243.           jmp    Main_loop
  244.  
  245.           /* ボ-ダ- エフェクト表示 */
  246. border:
  247.       call   DIGITIZE
  248. bd_lp0:
  249.           movl   $42104210,%bx
  250.           xor    %esi,%esi
  251.           movl   $239,%ecx
  252. bd_lp1:   push   %ecx
  253.           movl   $159,%ecx
  254. bd_lp2:
  255.           movl   %es:(%esi),%eax      /* レイヤ0からとる */
  256.           movw   %ax,%dx
  257.           xorw   %bx,%ax
  258.           rorl   $16,%eax
  259.           movw   %ax,%bx
  260.           xorw   %dx,%ax
  261.           rorl   $16,%eax
  262.           movl   %eax,%es:0x40000(%esi)
  263.  
  264.           addl   $4,%esi
  265.           loop   bd_lp2
  266.  
  267.           pop    %ecx
  268.           addl   $388,%esi
  269.           loop   bd_lp1
  270.  
  271.           call   INKEY
  272.           cmpb   $0xff,%dl
  273.           je     bd_lp0
  274.  
  275.           cmpb   $0x42,%dl           /* キー内容チェック */
  276.           je     bd_lp0
  277.           cmpb   $0x62,%dl
  278.           je     bd_lp0
  279. bd_bye:
  280.           mov    $0x1b00,%ax
  281.           lcall  %fs:(0x20)           /* デジタイズオフ */
  282.           jmp    Main_loop
  283.  
  284.           /* シャドウ エフェクト表示 */
  285. shadow:
  286.       call   DIGITIZE
  287. sh_lp0:
  288.           movl   $42104210,%ebx
  289.           xor    %esi,%esi
  290.           movl   $239,%ecx
  291. sh_lp1:   push   %ecx
  292.           movl   $159,%ecx
  293. sh_lp2:
  294.           movl   %es:(%esi),%eax      /* レイヤ0からとる */
  295.           pushl  %eax
  296.           orl    $0x84218421,%ebx     /* 2ドット前の反転デ-タを */
  297.           andl   $0x7bdf7bdf,%eax     /* 加算して2で割る         */
  298.           subl   %ebx,%eax
  299.           shrl   $1,%eax
  300.           andl   $0x7fff7fff,%eax
  301.           movl   %eax,%es:0x40000(%esi)
  302.       popl   %ebx
  303.  
  304.           addl   $4,%esi
  305.           loop   sh_lp2
  306.  
  307.           pop    %ecx
  308.           addl   $388,%esi
  309.           loop   sh_lp1
  310.  
  311.           call   INKEY
  312.           cmpb   $0xff,%dl
  313.           je     sh_lp0
  314.  
  315.           cmpb   $0x4b,%dl           /* キー内容チェック */
  316.           je     sh_lp0
  317.           cmpb   $0x6B,%dl
  318.           je     sh_lp0
  319. sh_bye:
  320.           mov    $0x1b00,%ax
  321.           lcall  %fs:(0x20)           /* デジタイズオフ */
  322.           jmp    Main_loop
  323.  
  324.           /* モノクロのパレットテーブル作成 */
  325.  
  326. mono_sub:
  327.           movl   (table),%ebp         /* レジスタに定数設定 */
  328.  
  329.           movl   $0,%ecx
  330. mono_lp0: push   %ecx
  331.           sar    $10,%ecx             /* RGBの分離 */
  332.           andl   $0x1f,%ecx
  333.           movl   %ecx,%eax
  334.  
  335.           movl   (%esp),%ecx
  336.           sar    $5,%ecx
  337.           andl   $0x1f,%ecx
  338.           dec    %ecx                 /* 人の目にはG>R>Bと見えるので輝度補正 */
  339.           cmpl   $0,%ecx
  340.           jge    mono_jp1
  341.           xor    %ecx,%ecx
  342. mono_jp1: addl   %ecx,%eax
  343.  
  344.           movl   (%esp),%ecx
  345.           andl   $0x1f,%ecx
  346.           dec    %ecx                 /* 人の目にはG>R>Bと見えるので輝度補正 */
  347.           dec    %ecx
  348.           cmpl   $0,%ecx
  349.           jge    mono_jp2
  350.           xor    %ecx,%ecx
  351. mono_jp2: addl   %ecx,%eax
  352.  
  353.           movb   $3,%cl
  354.           divb   %cl
  355.           andl   $0xff,%eax            /* ahは余りが入っているので */          
  356.           movw   $1057,%cx
  357.           mull   %cx
  358.  
  359.           pop    %ecx
  360.           movw   %ax,(%ebp,%ecx,2)    /* addr=ebp+ecx*2 */
  361.  
  362.           inc    %ecx
  363.           cmpl   $0x8000,%ecx
  364.           jne    mono_lp0
  365.  
  366.           jmp    Main_ret
  367.  
  368.           /* セピア色のパレットテーブル作成 */
  369.  
  370. sep_sub:
  371.           movl   (table),%ebp         /* レジスタに定数設定 */
  372.  
  373.           movl   $0,%ecx
  374. sep_lp0:  push   %ecx
  375.           sar    $10,%ecx             /* RGBの分離 */
  376.           andl   $0x1f,%ecx
  377.           movl   %ecx,%eax
  378.  
  379.           movl   (%esp),%ecx
  380.           sar    $5,%ecx
  381.           andl   $0x1f,%ecx
  382.           addl   %ecx,%eax
  383.  
  384.           movl   (%esp),%ecx
  385.           andl   $0x1f,%ecx
  386.           addl   %ecx,%eax
  387.  
  388.           movb   $3,%cl
  389.           divb   %cl
  390.           andl   $0xff,%eax            /* ahは余りが入っているので */
  391.           dec    %eax                  /* セピア色の調合 */
  392.           dec    %eax
  393.           cmpl   $0,%eax
  394.           jge    sep_jp0
  395.           xor    %eax,%eax
  396. sep_jp0:  movl   %eax,(red)
  397.           dec    %eax
  398.           cmpl   $0,%eax
  399.           jge    sep_jp1
  400.           xor    %eax,%eax
  401. sep_jp1:  movl   %eax,(green)
  402.           dec    %eax
  403.           cmpl   $0,%eax
  404.           jge    sep_jp2
  405.           xor    %eax,%eax
  406. sep_jp2:  movl   %eax,(blue)
  407.           movl   (green),%eax
  408.           shl    $5,%eax
  409.           addl   (red),%eax
  410.           shl    $5,%eax
  411.           addl   (blue),%eax
  412.  
  413.           pop    %ecx
  414.           movw   %ax,(%ebp,%ecx,2)    /* addr=ebp+ecx*2 */
  415.  
  416.           inc    %ecx
  417.           cmpl   $0x8000,%ecx
  418.           jne    sep_lp0
  419.  
  420.           jmp    Main_ret
  421.  
  422.           /* サブルーチン */
  423.           
  424.           /* カラ-マスクのセット */
  425. mask_set:
  426.           cmpb   $0x39,%dl
  427.           je     ms_jp0
  428.           movw   (andcode),%ax       /* パッチオフ */
  429.       jmp    ms_jp1
  430. ms_jp0:
  431.           movw   (negacode),%ax       /* パッチ */
  432. ms_jp1:
  433.           movw   %ax,(qef_and)
  434.  
  435.           andl   $0xff,%edx
  436.       subl   $0x30,%edx
  437.           movl   mask_tab(,%edx,4),%eax
  438.           movl   %eax,(mask)
  439.           ret
  440.  
  441.           /* デジタイズ */
  442. DIGITIZE:
  443.           mov    $1,%al               /* レイヤ1を黒にする */
  444.           call   WRITE_PAGE
  445.           xor    %edx,%edx            /* レジスタに定数設定 */
  446.           call   BACK_COLOR
  447.           call   CLS
  448.  
  449.           mov    $0,%al               /* デジタイズはレイヤ0へ */
  450.           call   WRITE_PAGE
  451.  
  452.           pushl  $0x104               /* 2画面モードのセグメント */
  453.           pop    %es
  454.  
  455.           mov    $0x1b01,%ax
  456.           lcall  %fs:(0x20)           /* デジタイズオン */
  457.           ret
  458.  
  459.           /* G-BIOSの初期化 */
  460. G_INIT:
  461.           push   %ds
  462.           pop    %gs
  463.           push   %ds
  464.           pop    %es
  465.           movl   $1536,%ecx
  466.           movl   $G_work,%edi
  467.           movb   $0,%ah
  468.           pushl  $0x0110
  469.           pop    %fs    
  470.           lcall  %fs:(0x20)
  471.           ret
  472.  
  473.           /* スクリーンモードの指定 */
  474. SCREEN_MODE:
  475.           /* al:レイヤ  dx:スクリーンモード  */
  476.           movb   $1,%ah
  477.           movl   $G_work,%edi
  478.           lcall  %fs:(0x20)
  479.           ret
  480.  
  481.           /* 画面表示位置の指定 */
  482. SCREEN_POS:
  483.           /* bx:縦位置 dx:横位置 */
  484.           movw   $0x201,%ax
  485.           movl   $G_work,%edi
  486.           lcall  %fs:(0x20)
  487.           ret
  488.  
  489.           /* 画面拡大率の指定 */
  490. ZOOM_SCREEN:
  491.           /* bx:縦倍率 dx:横倍率 */
  492.           movw   $0x202,%ax
  493.           movl   $G_work,%edi
  494.           lcall  %fs:(0x20)
  495.           ret
  496.  
  497.           /* WIDTHの指定 */
  498. SCREEN_WIDTH:
  499.           /* bx:縦ドット数 dx:横ドット数 */
  500.           movw   $0x203,%ax
  501.           movl   $G_work,%edi
  502.           lcall  %fs:(0x20)
  503.           ret
  504.  
  505.           /* 書き込みページの設定 */
  506. WRITE_PAGE:
  507.           /* al:ページ */
  508.           movb  $5,%ah
  509.           movl  $G_work,%edi
  510.           lcall %fs:(0x20)
  511.           ret
  512.  
  513.           /* 表示ページの設定 */
  514. DISPLAY_PAGE:
  515.           /* al:プライオリティ edx:表示データ */
  516.           movb  $6,%ah
  517.           movl  $G_work,%edi
  518.           lcall %fs:(0x20)
  519.           ret
  520.  
  521.           /* 背景色指定 */
  522. BACK_COLOR:
  523.           /* edx:色 */
  524.           mov   $0x701,%ax
  525.           movl  $G_work,%edi
  526.           lcall %fs:(0x20)
  527.           ret
  528.  
  529.           /* 画面消去 */
  530. CLS:
  531.           movb  $0x20,%ah
  532.           movl  $G_work,%edi
  533.           lcall %fs:(0x20)
  534.           ret
  535.  
  536.           /* キー入力の初期化 */
  537. KEY_INIT:
  538.           movb   $0,%ah
  539.           int    $0x90
  540.           ret
  541.  
  542.           /* キー入力の初期化 */
  543. KEY_OFF:
  544.           movw   $0x501,%ax
  545.           int    $0x90
  546.           ret
  547.  
  548.           /* キー入力を待つ */
  549.  
  550.           .align 4   
  551. KEY_INP:
  552.           movw   $0x900,%ax 
  553.           int    $0x90
  554.           ret
  555.  
  556.           /* キー入力を待たない */
  557.  
  558.           .align 4   
  559. INKEY:
  560.           movw   $0x901,%ax 
  561.           int    $0x90
  562.           ret
  563.  
  564.           /* デバッグランプ */
  565.  
  566. lamp:     push   %eax
  567.           push   %edx
  568.           movb   $0x48,%ah
  569.           movb   $0x01,%dl
  570.           lcall  %fs:(0x80)
  571.           pop    %edx
  572.           pop    %eax
  573.           ret
  574.  
  575. negacode:
  576.           xorl   %ebx,%eax
  577. andcode:
  578.           andl   %ebx,%eax
  579.  
  580.           /* ワーク */
  581. mask_tab:  .long  0,0x42104210,0x63186318,0x739c739c,0x7bde7bde,0x7fff7fff
  582.            .long  0x7c007c00,0x03e003e0,0x001f001f,0x7fff7fff
  583. mask:      .long  0x7fff7fff
  584. vsync_d:   .long  0,0
  585. green:     .long  0
  586. red:       .long  0
  587. blue:      .long  0
  588. table:     .long  0
  589. esp_w:     .long  0
  590. G_work:    .space 1536
  591. palette:
  592.            /*        青    赤    緑    /* パレットNo. */
  593.        .byte    0,    0,    0    /*      0      */
  594.        .byte    176,    0,    0    /*      1      */
  595.        .byte    0,    176,    0    /*      2      */
  596.        .byte    176,    176,    0    /*      3      */
  597.        .byte    0,    0,    176    /*      4      */
  598.        .byte    176,    0,    176    /*      5      */
  599.        .byte    0,    176,    176    /*      6      */
  600.        .byte    176,    176,    176    /*      7      */
  601.        .byte    64,    64,    64    /*      8      */
  602.        .byte    255,    0,    0    /*      9      */
  603.        .byte    0,    255,    0    /*     10      */
  604.        .byte    255,    255,    0    /*     11      */
  605.        .byte    0,    0,    255    /*     12      */
  606.        .byte    255,    0,    255    /*     13      */
  607.        .byte    0,    255,    255    /*     14      */
  608.        .byte    255,    255,    255    /*     15      */
  609.