home *** CD-ROM | disk | FTP | other *** search
/ FreeWare Collection 3 / FreeSoftwareCollection3pd199x-jp.img / pao / ms_dos / color / src / bc2.c < prev    next >
Text File  |  1980-01-02  |  7KB  |  320 lines

  1. /** << MSC V5.1 >> ************************************************************
  2. **
  3. **    パレット変更 ( FMTOWNS 16 色モード )その2
  4. **
  5. **    < Parameter >
  6. **    BC2  <BRG>  [Palno.]
  7. **         BRG    : <Blue><Red><Green>
  8. **                  0 ~ F (HEX) で輝度を指定する。
  9. **         Palno. : パレット番号 ( 0 ~ F (HEX) )
  10. **                  省略値は、0 (背景色のパレット番号)
  11. **
  12. **    < HISTORY >
  13. **    1989.10.07 : CREATE
  14. **    1990.04.16 : FMRに対応
  15. **    1990.05.14 : 変更する色指定を1,2,3の他にB,R,Gでも可にした。
  16. **    1990.11.30 : 新型FMTOWNSに対応
  17. **
  18. **    All Rights Reserved, Copyright (C) Y.Hirata 1990.
  19. **
  20. **    Programed by Y.Hirata ( Nifty ID : NAB03321 )
  21. **
  22. ******************************************************************************/
  23. #include    <stdio.h>
  24. #include    <dos.h>
  25. #include    <conio.h>
  26. #include    <stdlib.h>
  27.  
  28. #define        VER_LEV        (1.20)
  29.  
  30. /*        FMTOWNS                */
  31. #define        PALETTE        0xfd90
  32. #define        BLUE        0xfd92
  33. #define        RED            0xfd94
  34. #define        GREEN        0xfd96
  35. /*        FMR                    */
  36. #define        CONTROL        0x0400
  37. #define        R_PALETTE    0x0408
  38. #define        R_BLUE        0x040a
  39. #define        R_RED        0x040c
  40. #define        R_GREEN        0x040e
  41.  
  42. unsigned int    Palette ;
  43. unsigned int    Blue ;
  44. unsigned int    Red ;
  45. unsigned int    Green ;
  46.  
  47. char    *Msg[12] = {
  48.                     "(C)パオパオ  パレット色変更プログラム(2)  Version ",
  49.                     "Copyright (C) Y.Hirata 1989-1990. All rights reserved.",
  50.                     "BC2  <BRG>  [Palno.]",
  51.                     "     BRG    : <Blue><Red><Green>",
  52.                     "              0 ~ F (HEX) で輝度を指定する。",
  53.                     "     Palno. : パレット番号 ( 0 ~ F (HEX) )",
  54.                     "              省略値は、0 (背景色のパレット番号)",
  55.                     "操作 : 1,2,3 で変更色を設定、↑,↓ で色調整、ESCキーで終了",
  56.                     "       1:Blue, 2:Red, 3:Green, ↑:Up, ↓:Down",
  57.                     "       1,2,3 の代わりに B,R,G でも可能!",
  58.                     "参考 : GETBC にて設定した色を数値で確認できます。",
  59.                     "FMR-60では、最後に /r を指定して下さい。"
  60.                     } ;
  61.  
  62. #define        TRUE    1
  63. #define        FALSE    0
  64.  
  65. /*******************************  GET Machine ID  ****************************/
  66. /*
  67. **    < RETURN >
  68. **     機種識別 :
  69. **                Towns1,2      = 1
  70. **                Towns1,2(F,H) = 2 ('90秋型を含む)
  71. **                R70           = 3
  72. **                R60/50        = 4
  73. **                R50S          = 5
  74. **                R50LT         = 6
  75. **                ???           = 0
  76. */
  77. int mid()
  78. {
  79.     union    REGS    regs ;
  80.     struct    SREGS    sregs ;
  81.     unsigned char    mdata[16] ;
  82.     unsigned char    id, cpu ;
  83.     
  84.     regs.h.ah = 0x05 ;
  85.     regs.x.di = (unsigned int)mdata ;
  86.  
  87.     segread( &sregs ) ;
  88.     int86x( 0xaf,®s,®s,&sregs ) ;
  89.  
  90.     id = mdata[0] ;
  91.     if ( (id & 0x07) == 0x01 ) {                /*  R60/50 系列    */
  92.         if ( (id & 0xf0) == 0x50 ) {            /*  FMTowns        */
  93.             cpu = inp( 0x31 ) ;
  94.             switch ( cpu ) {
  95.                 case 1 :
  96.                         return ( 1 ) ;            /*  モデル 1,2    */
  97.                         break ;
  98.                 case 2 :
  99.                         return ( 2 ) ;            /*  モデル 1,2(F,H)    */
  100.                         break ;
  101.                 default :
  102.                         return ( 2 ) ;            /*  ?????        */
  103. /*
  104. **    新型FMTOWNSは、これでいいと思う。
  105. */
  106.                         break ;
  107.             }
  108.         } else if ( (id & 0xf0) == 0x20 ) {        /*  R-70        */
  109.             return ( 3 ) ;
  110.         } else if ( (id & 0xf0) == 0x00 ) {        /*  R-60/50        */
  111.             return ( 4 ) ;
  112.         } else if ( (id & 0xf0) == 0x30) {        /*  R-50S        */
  113.             return ( 5 ) ;
  114.         } else if ( (id & 0xf0) == 0x40) {        /*  R-50LT        */
  115.             return ( 6 ) ;
  116.         } else {                                /*  ?????        */
  117.             return ( 0 ) ;
  118.         }
  119.     } else {                                    /*  ?????        */
  120.         return ( 0 ) ;
  121.     }
  122. }
  123.  
  124. /************************  char 0-f(F) -> int 0-15  **************************/
  125. int ctoi( c )
  126. char    c ;
  127. {
  128.     int    i=0 ;
  129.  
  130.     if ( c >= '0' && c <= '9' ) {
  131.         i = c - '0' ;
  132.     } else {
  133.         if ( c >= 'A' && c <= 'F' )
  134.             i = 10 + c - 'A' ;
  135.         if ( c >= 'a' && c <= 'f' )
  136.             i = 10 + c - 'a' ;
  137.     }
  138.     return i ;
  139. }
  140.  
  141. /*****************************  入力キーのチェック  **************************/
  142. int keychk()
  143. {
  144.     union    REGS    inregs,outregs ;
  145.     struct    SREGS    segregs ;
  146.  
  147.     int    int86x() ;
  148.     int on ;
  149.  
  150.     on = 0 ;
  151.     inregs.h.ah = 0x09 ;
  152.     inregs.h.al = 0 ;
  153.  
  154.     int86x( 0x90,&inregs,&outregs,&segregs ) ;
  155.                                             /* 1 2 3 ↑ ↓ キー on?    */
  156.     /* 1:b 2:r 3:g ↑ ↓ キー on?    */
  157.     if ( outregs.h.bh == 0x02 || outregs.h.bh == 0x2e )    /* 1 or B    */
  158.         on = 1 ;
  159.     if ( outregs.h.bh == 0x03 || outregs.h.bh == 0x14 )    /* 2 or R    */
  160.         on = 2 ;
  161.     if ( outregs.h.bh == 0x04 || outregs.h.bh == 0x22 )    /* 3 or G    */
  162.         on = 3 ;
  163.     if ( outregs.h.bh == 0x4d )                /* ↑    */
  164.         on = 4 ;
  165.     if ( outregs.h.bh == 0x50 )                /* ↓    */
  166.         on = 5 ;
  167.     if ( outregs.h.bh == 0x01 )                /* ESC    */
  168.         on = 6 ;
  169.  
  170.     return on ;
  171. }
  172.  
  173. /****************************  パレット色設定  *******************************/
  174. void outiop( b, r, g )
  175. int    b,r,g ;
  176. {
  177.     if ( b < 0 )  b = 0 ;
  178.     if ( b > 15 ) b = 15 ;
  179.     if ( r < 0 )  r = 0 ;
  180.     if ( r > 15 ) r = 15 ;
  181.     if ( g < 0 )  g = 0 ;
  182.     if ( g > 15 ) g = 15 ;
  183.     outp( Blue ,b*16 ) ;                /* 上位 8 bit にセット    */
  184.     outp( Red  ,r*16 ) ;
  185.     outp( Green,g*16 ) ;
  186. }
  187.  
  188. /*****************************  ★ メイン ★  ********************************/
  189. main( int ac, char *av[] )
  190. {
  191.     int    ctoi(), keychk() ;
  192.     int    p, b, r, g ;
  193.     int    esc=1, key, sel ;
  194.     int    c, cc, arglen ;
  195.     int    id ;
  196.     int    r60 = FALSE ;
  197.  
  198.     if ( ac > 1 ) {
  199.         for ( c=1; c<ac; c++ ) {
  200.             if ( *av[c] == '-' || *av[c] == '/' ) {        /* オプションスイッチ    */
  201.                 arglen = strlen( av[c] ) ;
  202.                 for ( cc=1; cc<arglen; cc++ ) {
  203.                     switch ( *(av[c]+cc) ) {
  204.                         case 'r' :
  205.                         case 'R' :
  206.                             r60 = TRUE ;
  207.                             break ;
  208.                         default :
  209.                             printf("\x1b[1;33m") ;
  210.                             printf("Option switch error(%c)",*(av[c]+cc)) ;
  211.                             printf("\x1b[m\n") ;
  212.                             break ;
  213.                     }
  214.                 }
  215.             }
  216.         }
  217.     }
  218.     id = mid() ;
  219.     switch ( id ) {                            /*  機種判別    */
  220.         case 1 :                            /*  FMTOWNS        */
  221.         case 2 :                            /*  FMTOWNS        */
  222.         case 5 :                            /*  FMR-50S        */
  223.                 Palette = PALETTE ;
  224.                 Blue = BLUE ;
  225.                 Red = RED ;
  226.                 Green = GREEN ;
  227.                 break ;
  228.         case 4 :                            /*  FMR-60/50    */
  229.                 Palette = PALETTE ;
  230.                 Blue = BLUE ;
  231.                 Red = RED ;
  232.                 Green = GREEN ;
  233.                 if ( !r60 ) {
  234.                     break ;
  235.                 }
  236.         case 3 :                            /*  FMR-70        */
  237.                 outp( CONTROL ,0x05 ) ;
  238.                 Palette = R_PALETTE ;
  239.                 Blue = R_BLUE ;
  240.                 Red = R_RED ;
  241.                 Green = R_GREEN ;
  242.                 break ;
  243.         case 6 :                            /*  FMR-50LT    */
  244.         default :                            /*  ?????        */
  245.                 printf("\nこのマシンでは、使用できません!\n") ;
  246.                 exit ( 1 ) ;
  247.                 break ;
  248.     }
  249.     if ( ac < 2 ) {                                /*  引数なし    */
  250.         printf("%s%04.2f\n",Msg[0],VER_LEV) ;
  251.         printf("%s\n",Msg[1]) ;
  252.         printf("\n") ;
  253.         for ( c=2; c<11; c++ ) {
  254.             printf("%s\n",Msg[c]) ;
  255.         }
  256.         if ( id == 4 ) {
  257.             printf("%s\n",Msg[11]) ;
  258.         }
  259.     } else {                                    /*  引数あり    */
  260.         p = 0 ;
  261.         if ( ac > 2 )
  262.             p = ctoi( *av[2] ) ;
  263.         outp( Palette,p ) ;
  264.         b = ctoi( *av[1] ) ;
  265.         r = ctoi( *(av[1]+1) ) ;
  266.         g = ctoi( *(av[1]+2) ) ;
  267.         outiop( b,r,g ) ;
  268.         key = keychk() ;
  269.         if ( key == 0 || key == 6 ) {
  270.             esc = 0 ;
  271.             outiop( b,r,g ) ;
  272.         }
  273.         sel = 0 ;
  274.         if ( key >= 1 && key <= 3 )
  275.             sel = key ;
  276.  
  277.         while ( esc ) {
  278.             key = keychk() ;
  279.             switch ( key ) {
  280.                 case 1 :
  281.                 case 2 :
  282.                 case 3 :
  283.                     sel = key ;
  284.                     break ;
  285.                 case 4 :
  286.                     switch ( sel ) {
  287.                     case 1 :
  288.                         outiop( ++b,r,g ) ;
  289.                         break ;
  290.                     case 2 :
  291.                         outiop( b,++r,g ) ;
  292.                         break ;
  293.                     case 3 :
  294.                         outiop( b,r,++g ) ;
  295.                         break ;
  296.                     }
  297.                     break ;
  298.                 case 5 :
  299.                     switch ( sel ) {
  300.                     case 1 :
  301.                         outiop( --b,r,g ) ;
  302.                         break ;
  303.                     case 2 :
  304.                         outiop( b,--r,g ) ;
  305.                         break ;
  306.                     case 3 :
  307.                         outiop( b,r,--g ) ;
  308.                         break ;
  309.                     }
  310.                     break ;
  311.                 case 6 :
  312.                         esc = 0 ;
  313.                         break ;
  314.             }
  315.         }    /* while    */
  316.  
  317.     }
  318. }
  319.  
  320.