home *** CD-ROM | disk | FTP | other *** search
/ FreeWare Collection 2 / FreeSoftwareCollection2pd199x-jp.img / etv / etv.a next >
Text File  |  1990-06-14  |  12KB  |  488 lines

  1. /*
  2.                TV☆TOWNS  -リアルタイムエフェクタ-
  3.  
  4.                      Version  1.0       1990/04/25    
  5.  
  6.                          by Pumpkin (MHD00746)     
  7. */
  8.  
  9.           .text
  10.           .data
  11.  
  12.           /* 初期化 */
  13.  
  14.           call   G_INIT
  15.           call   KEY_INIT
  16.  
  17.           movl   %esp,(esp_w)           /* パレットテーブル領域を作る */
  18.           movl   $0x8000,%ecx
  19. ini_lp:   pushw  $0
  20.           loop   ini_lp
  21.           movl   %esp,(table)
  22.  
  23.           mov    $0,%al                 /* 320×240 ロウスキャン */
  24.           mov    $11,%dx
  25.           call   SCREEN_MODE
  26.           mov    $1,%al
  27.           mov    $11,%dx
  28.           call   SCREEN_MODE
  29.  
  30.           mov    $1,%al                 /* レイヤ1が前、レイヤ0非表示 */ 
  31.           mov    $2,%edx
  32.           call   DISPLAY_PAGE
  33.  
  34.           mov    $0x43,%ah
  35.           mov    $0,%bl
  36.           mov    $0x7f7f,%dx
  37.           lcall  %fs:(0x80)             /* ライン入力オン */
  38.  
  39.  
  40.           /* メインルーチン */
  41.  
  42.           movb   $0x31,%dl
  43.  
  44. Main_loop:
  45.  
  46.           cmpb   $13,%dl
  47.           je     Main_Bye
  48.  
  49.           cmpb   $0x31,%dl
  50.           je     normal
  51.  
  52.           cmpb   $0x32,%dl
  53.           je     mono_sub
  54.  
  55.           cmpb   $0x33,%dl
  56.           je     sep_sub 
  57.  
  58.           cmpb   $0x34,%dl
  59.           je     nega_sub
  60.  
  61.           cmpb   $0x35,%dl
  62.           je     c512_sub
  63.  
  64.           cmpb   $0x36,%dl
  65.           je     green_sub
  66.  
  67.           cmpb   $0x37,%dl
  68.           je     red_sub 
  69.  
  70.           cmpb   $0x38,%dl
  71.           je     blue_sub
  72.  
  73. Main_ret:         
  74.           call   effect
  75.  
  76.           jmp    Main_loop
  77.  
  78.  
  79.           /* 後処理 */
  80.  
  81. Main_Bye:
  82.           mov    $0x43,%ah
  83.           mov    $0,%bl
  84.           xor    %dx,%dx
  85.           lcall  %fs:(0x80)           /* ライン入力オフ */
  86.           
  87.           call   G_INIT
  88.  
  89.           mov    $0,%al               /* MS-DOSの画面 */
  90.           mov    $1,%dx
  91.           call   SCREEN_MODE
  92.           mov    $1,%al
  93.           mov    $1,%dx
  94.           call   SCREEN_MODE
  95.           mov    $1,%al               /* レイヤ1が前、レイヤ全表示 */ 
  96.           mov    $3,%edx
  97.           call   DISPLAY_PAGE
  98.  
  99.           movl   (esp_w),%esp
  100.  
  101.           mov    $0x4c00,%ax          /* さよなら */
  102.           int    $0x21
  103.  
  104.  
  105.  
  106.           /* 通常表示 */
  107.  
  108. normal:
  109.           mov    $1,%al               /* レイヤ1を透明にする */
  110.           call   WRITE_PAGE
  111.           mov    $0x8000,%edx
  112.           call   BACK_COLOR
  113.           call   CLS
  114.  
  115.           movw   $0x1a82,%ax
  116.           lcall  %fs:(0x20)           /* インポーズオン */
  117.  
  118. no_lp:    call   INKEY                /* while inkey$="":wend */
  119.           cmpb   $0,%dl
  120.           je     no_lp
  121.  
  122. no_jp:    cmpb   $13,%dl              /* キー内容チェック */
  123.           je     no_bye
  124.           cmpb   $0x38,%dl
  125.           jg     no_lp
  126.           cmpb   $0x31,%dl
  127.           jl     no_lp
  128.  
  129. no_bye:
  130.           movw   $0x1a00,%ax
  131.           lcall  %fs:(0x20)           /* インポーズオフ */
  132.  
  133.           jmp    Main_loop
  134.  
  135.  
  136.  
  137.           /* エフェクト表示 */
  138. effect:
  139.           mov    $1,%al               /* レイヤ1を黒にする */
  140.           call   WRITE_PAGE
  141.           xor    %edx,%edx
  142.           call   BACK_COLOR
  143.           call   CLS
  144.  
  145.           mov    $0,%al               /* デジタイズはレイヤ0へ */
  146.           call   WRITE_PAGE
  147.  
  148.           pushl  $0x104               /* 2画面モードのセグメント */
  149.           pop    %es
  150.  
  151.           mov    $0x1b01,%ax
  152.           lcall  %fs:(0x20)           /* デジタイズオン */
  153.  
  154.           xor    %edx,%edx            /* レジスタに定数設定 */
  155.           movl   (table),%ebp
  156.  
  157. ef_lp0:
  158.           xor    %esi,%esi
  159.           movl   $239,%ecx
  160. ef_lp1:   push   %ecx
  161.           movl   $319,%ecx
  162. ef_lp2:
  163.           movw   %es:(%esi),%dx       /* レイヤ0からとる */
  164.           movw   (%ebp,%edx,2),%ax    /* パレットアクセス */
  165.           movw   %ax,%es:0x40000(%esi)
  166.           inc    %esi
  167.           inc    %esi
  168.           loop   ef_lp2
  169.           pop    %ecx
  170.           addl   $386,%esi
  171.           loop   ef_lp1
  172.  
  173.           call   INKEY
  174.           cmpb   $0,%dl
  175.           je     ef_lp0
  176.  
  177.           cmpb   $13,%dl              /* キー内容チェック */
  178.           je     ef_bye
  179.           cmpb   $0x38,%dl
  180.           jg     ef_lp0
  181.           cmpb   $0x31,%dl
  182.           jl     ef_lp0
  183.  
  184. ef_bye:
  185.           mov    $0x1b00,%ax
  186.           lcall  %fs:(0x20)           /* デジタイズオフ */
  187.  
  188.           ret
  189.  
  190.  
  191.           /* モノクロのパレットテーブル作成 */
  192.  
  193. mono_sub:
  194.           movl   (table),%ebp         /* レジスタに定数設定 */
  195.  
  196.           movl   $0,%ecx
  197. mono_lp0: push   %ecx
  198.           sar    $10,%ecx             /* RGBの分離 */
  199.           andl   $0x1f,%ecx
  200.           movl   %ecx,%eax
  201.  
  202.           movl   (%esp),%ecx
  203.           sar    $5,%ecx
  204.           andl   $0x1f,%ecx
  205.           dec    %ecx                 /* 人の目にはG>R>Bと見えるので輝度補正 */
  206.           cmpl   $0,%ecx
  207.           jge    mono_jp1
  208.           xor    %ecx,%ecx
  209. mono_jp1: addl   %ecx,%eax
  210.  
  211.           movl   (%esp),%ecx
  212.           andl   $0x1f,%ecx
  213.           dec    %ecx                 /* 人の目にはG>R>Bと見えるので輝度補正 */
  214.           dec    %ecx
  215.           cmpl   $0,%ecx
  216.           jge    mono_jp2
  217.           xor    %ecx,%ecx
  218. mono_jp2: addl   %ecx,%eax
  219.  
  220.           movb   $3,%cl
  221.           divb   %cl
  222.           andl   $0xff,%eax            /* ahは余りが入っているので */          
  223.           movw   $1057,%cx
  224.           mull   %cx
  225.  
  226.           pop    %ecx
  227.           movw   %ax,(%ebp,%ecx,2)    /* addr=ebp+ecx*2 */
  228.  
  229.           inc    %ecx
  230.           cmpl   $0x8000,%ecx
  231.           jne    mono_lp0
  232.  
  233.           jmp    Main_ret
  234.  
  235.  
  236.           /* セピア色のパレットテーブル作成 */
  237.  
  238. sep_sub:
  239.           movl   (table),%ebp         /* レジスタに定数設定 */
  240.  
  241.           movl   $0,%ecx
  242. sep_lp0:  push   %ecx
  243.           sar    $10,%ecx             /* RGBの分離 */
  244.           andl   $0x1f,%ecx
  245.           movl   %ecx,%eax
  246.  
  247.           movl   (%esp),%ecx
  248.           sar    $5,%ecx
  249.           andl   $0x1f,%ecx
  250.           addl   %ecx,%eax
  251.  
  252.           movl   (%esp),%ecx
  253.           andl   $0x1f,%ecx
  254.           addl   %ecx,%eax
  255.  
  256.           movb   $3,%cl
  257.           divb   %cl
  258.           andl   $0xff,%eax            /* ahは余りが入っているので */
  259.           dec    %eax                  /* セピア色の調合 */
  260.           dec    %eax
  261.           cmpl   $0,%eax
  262.           jge    sep_jp0
  263.           xor    %eax,%eax
  264. sep_jp0:  movl   %eax,(red)
  265.           dec    %eax
  266.           cmpl   $0,%eax
  267.           jge    sep_jp1
  268.           xor    %eax,%eax
  269. sep_jp1:  movl   %eax,(green)
  270.           dec    %eax
  271.           cmpl   $0,%eax
  272.           jge    sep_jp2
  273.           xor    %eax,%eax
  274. sep_jp2:  movl   %eax,(blue)
  275.           movl   (green),%eax
  276.           shl    $5,%eax
  277.           addl   (red),%eax
  278.           shl    $5,%eax
  279.           addl   (blue),%eax
  280.  
  281.           pop    %ecx
  282.           movw   %ax,(%ebp,%ecx,2)    /* addr=ebp+ecx*2 */
  283.  
  284.           inc    %ecx
  285.           cmpl   $0x8000,%ecx
  286.           jne    sep_lp0
  287.  
  288.           jmp    Main_ret
  289.  
  290.  
  291.           /* 反転のパレットテーブル作成 */
  292. nega_sub:
  293.           movl   (table),%ebp         /* レジスタに定数設定 */
  294.  
  295.           movl   $0,%ecx
  296. nega_lp0: movl   %ecx,%eax
  297.           xorw   $0x7fff,%ax
  298.           movw   %ax,(%ebp,%ecx,2)    /* addr=ebp+ecx*2 */
  299.           inc    %ecx
  300.           cmpl   $0x8000,%ecx
  301.           jne    nega_lp0
  302.  
  303.           jmp    Main_ret
  304.  
  305.  
  306.           /* 512色のパレットテーブル作成 */
  307. c512_sub:
  308.           movl   (table),%ebp         /* レジスタに定数設定 */
  309.  
  310.           movl   $0,%ecx
  311. c512_lp0: movl   %ecx,%eax
  312.           andw   $0x739c,%ax
  313.           movw   %ax,(%ebp,%ecx,2)    /* addr=ebp+ecx*2 */
  314.           inc    %ecx
  315.           cmpl   $0x8000,%ecx
  316.           jne    c512_lp0
  317.  
  318.           jmp    Main_ret
  319.  
  320.  
  321.           /* 緑のパレットテーブル作成 */
  322. green_sub:
  323.           movl   (table),%ebp         /* レジスタに定数設定 */
  324.  
  325.           movl   $0,%ecx
  326. green_lp: movl   %ecx,%eax
  327.           andl   $0x7c00,%eax
  328.           movw   %ax,(%ebp,%ecx,2)    /* addr=ebp+ecx*2 */
  329.           inc    %ecx
  330.           cmpl   $0x8000,%ecx
  331.           jne    green_lp
  332.  
  333.           jmp    Main_ret
  334.  
  335.  
  336.           /* 赤のパレットテーブル作成 */
  337. red_sub:
  338.           movl   (table),%ebp         /* レジスタに定数設定 */
  339.  
  340.           movl   $0,%ecx
  341. red_lp:   movl   %ecx,%eax
  342.           andl   $0x3e0,%eax
  343.           movw   %ax,(%ebp,%ecx,2)    /* addr=ebp+ecx*2 */
  344.           inc    %ecx
  345.           cmpl   $0x8000,%ecx
  346.           jne    red_lp
  347.  
  348.           jmp    Main_ret
  349.  
  350.  
  351.           /* 青のパレットテーブル作成 */
  352. blue_sub:
  353.           movl   (table),%ebp         /* レジスタに定数設定 */
  354.  
  355.           movl   $0,%ecx
  356. blue_lp:  movl   %ecx,%eax
  357.           andl   $0x1f,%eax
  358.           movw   %ax,(%ebp,%ecx,2)    /* addr=ebp+ecx*2 */
  359.           inc    %ecx
  360.           cmpl   $0x8000,%ecx
  361.           jne    blue_lp
  362.  
  363.           jmp    Main_ret
  364.  
  365.  
  366.           /* サブルーチン */
  367.           
  368.           /* G-BIOSの初期化 */
  369. G_INIT:
  370.           push   %ds
  371.           pop    %gs
  372.           push   %ds
  373.           pop    %es
  374.           movl   $1536,%ecx
  375.           movl   $G_work,%edi
  376.           movb   $0,%ah
  377.           pushl  $0x0110
  378.           pop    %fs    
  379.           lcall  %fs:(0x20)
  380.           ret
  381.  
  382.           /* スクリーンモードの指定 */
  383. SCREEN_MODE:
  384.           /* al:レイヤ  dx:スクリーンモード  */
  385.           movb   $1,%ah
  386.           movl   $G_work,%edi
  387.           lcall  %fs:(0x20)
  388.           ret
  389.  
  390.           /* 画面表示位置の指定 */
  391. SCREEN_POS:
  392.           /* bx:縦位置 dx:横位置 */
  393.           movw   $0x201,%ax
  394.           movl   $G_work,%edi
  395.           lcall  %fs:(0x20)
  396.           ret
  397.  
  398.           /* 画面拡大率の指定 */
  399. ZOOM_SCREEN:
  400.           /* bx:縦倍率 dx:横倍率 */
  401.           movw   $0x202,%ax
  402.           movl   $G_work,%edi
  403.           lcall  %fs:(0x20)
  404.           ret
  405.  
  406.  
  407.           /* WIDTHの指定 */
  408. SCREEN_WIDTH:
  409.           /* bx:縦ドット数 dx:横ドット数 */
  410.           movw   $0x203,%ax
  411.           movl   $G_work,%edi
  412.           lcall  %fs:(0x20)
  413.           ret
  414.  
  415.           /* 書き込みページの設定 */
  416. WRITE_PAGE:
  417.           /* al:ページ */
  418.           movb  $5,%ah
  419.           movl  $G_work,%edi
  420.           lcall %fs:(0x20)
  421.           ret
  422.  
  423.           /* 表示ページの設定 */
  424. DISPLAY_PAGE:
  425.           /* al:プライオリティ edx:表示データ */
  426.           movb  $6,%ah
  427.           movl  $G_work,%edi
  428.           lcall %fs:(0x20)
  429.           ret
  430.  
  431.           /* 背景色指定 */
  432. BACK_COLOR:
  433.           /* edx:色 */
  434.           mov   $0x701,%ax
  435.           movl  $G_work,%edi
  436.           lcall %fs:(0x20)
  437.           ret
  438.  
  439.           /* 画面消去 */
  440. CLS:
  441.           movb  $0x20,%ah
  442.           movl  $G_work,%edi
  443.           lcall %fs:(0x20)
  444.           ret
  445.  
  446.           /* キー入力の初期化 */
  447. KEY_INIT:
  448.           movb   $0,%ah
  449.           int    $0x90
  450.           ret
  451.  
  452.           /* キー入力を待つ */
  453.  
  454.           .align 4   
  455. KEY_INP:
  456.           movw   $0x900,%ax 
  457.           int    $0x90
  458.           ret
  459.  
  460.           /* キー入力を待たない */
  461.  
  462.           .align 4   
  463. INKEY:
  464.           movw   $0x901,%ax 
  465.           int    $0x90
  466.           ret
  467.  
  468.           /* デバッグランプ */
  469.  
  470. lamp:     push   %eax
  471.           push   %edx
  472.           movb   $0x48,%ah
  473.           movb   $0x01,%dl
  474.           lcall  %fs:(0x80)
  475.           pop    %edx
  476.           pop    %eax
  477.           ret
  478.  
  479.  
  480.           /* ワーク */
  481. vsync_d:   .long  0,0
  482. green:     .long  0
  483. red:       .long  0
  484. blue:      .long  0
  485. table:     .long  0
  486. esp_w:     .long  0
  487. G_work:    .space 1536
  488.