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

  1. /** << MSC V5.1 >> ************************************************************
  2. **
  3. **    パレット変更 ( FMTOWNS 16 色モード )
  4. **
  5. **    < Parameter >
  6. **    BC  <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.11.30 : 新型FMTOWNSに対応
  16. **
  17. **    All Rights Reserved, Copyright (C) Y.Hirata 1990.
  18. **
  19. **    Programed by Y.Hirata ( Nifty ID : NAB03321 )
  20. **
  21. ******************************************************************************/
  22. #include    <stdio.h>
  23. #include    <conio.h>
  24. #include    <stdlib.h>
  25. #include    <dos.h>
  26.  
  27. #define        VER_LEV        (1.20)
  28.  
  29. /*        FMTOWNS                */
  30. #define        PALETTE        0xfd90
  31. #define        BLUE        0xfd92
  32. #define        RED            0xfd94
  33. #define        GREEN        0xfd96
  34. /*        FMR                    */
  35. #define        CONTROL        0x0400
  36. #define        R_PALETTE    0x0408
  37. #define        R_BLUE        0x040a
  38. #define        R_RED        0x040c
  39. #define        R_GREEN        0x040e
  40.  
  41. unsigned int    Palette ;
  42. unsigned int    Blue ;
  43. unsigned int    Red ;
  44. unsigned int    Green ;
  45.  
  46. char    *Msg[8] = {    "(C)パオパオ  パレット色変更プログラム  Version ",
  47.                     "Copyright (C) Y.Hirata 1989-1990. All rights reserved.",
  48.                     "BC  <BRG>  [Palno.]",
  49.                     "    BRG    : <Blue><Red><Green>",
  50.                     "             0 ~ F (HEX) で輝度を指定する。",
  51.                     "    Palno. : パレット番号 ( 0 ~ F (HEX) )",
  52.                     "             省略値は、0 (背景色のパレット番号)",
  53.                     "FMR-60では、最後に /r を指定して下さい。"
  54.                     } ;
  55.  
  56. #define        TRUE    1
  57. #define        FALSE    0
  58.  
  59. /*******************************  GET Machine ID  ****************************/
  60. /*
  61. **    < RETURN >
  62. **     機種識別 :
  63. **                Towns1,2      = 1
  64. **                Towns1,2(F,H) = 2 ('90秋型を含む)
  65. **                R70           = 3
  66. **                R60/50        = 4
  67. **                R50S          = 5
  68. **                R50LT         = 6
  69. **                ???           = 0
  70. */
  71. int mid()
  72. {
  73.     union    REGS    regs ;
  74.     struct    SREGS    sregs ;
  75.     unsigned char    mdata[16] ;
  76.     unsigned char    id, cpu ;
  77.     
  78.     regs.h.ah = 0x05 ;
  79.     regs.x.di = (unsigned int)mdata ;
  80.  
  81.     segread( &sregs ) ;
  82.     int86x( 0xaf,®s,®s,&sregs ) ;
  83.  
  84.     id = mdata[0] ;
  85.     if ( (id & 0x07) == 0x01 ) {                /*  R60/50 系列    */
  86.         if ( (id & 0xf0) == 0x50 ) {            /*  FMTowns        */
  87.             cpu = inp( 0x31 ) ;
  88.             switch ( cpu ) {
  89.                 case 1 :
  90.                         return ( 1 ) ;            /*  モデル 1,2    */
  91.                         break ;
  92.                 case 2 :
  93.                         return ( 2 ) ;            /*  モデル 1,2(F,H)    */
  94.                         break ;
  95.                 default :
  96.                         return ( 2 ) ;            /*  ?????        */
  97. /*
  98. **    新型FMTOWNSは、これでいいと思う。
  99. */
  100.                         break ;
  101.             }
  102.         } else if ( (id & 0xf0) == 0x20 ) {        /*  R-70        */
  103.             return ( 3 ) ;
  104.         } else if ( (id & 0xf0) == 0x00 ) {        /*  R-60/50        */
  105.             return ( 4 ) ;
  106.         } else if ( (id & 0xf0) == 0x30) {        /*  R-50S        */
  107.             return ( 5 ) ;
  108.         } else if ( (id & 0xf0) == 0x40) {        /*  R-50LT        */
  109.             return ( 6 ) ;
  110.         } else {                                /*  ?????        */
  111.             return ( 0 ) ;
  112.         }
  113.     } else {                                    /*  ?????        */
  114.         return ( 0 ) ;
  115.     }
  116. }
  117.  
  118. /************************  char 0-f(F) -> int 0-15  **************************/
  119. int ctoi( c )
  120. char    c ;
  121. {
  122.     int    i=0 ;
  123.  
  124.     if ( c >= '0' && c <= '9' ) {
  125.         i = c - '0' ;
  126.     } else {
  127.         if ( c >= 'A' && c <= 'F' )
  128.             i = 10 + c - 'A' ;
  129.         if ( c >= 'a' && c <= 'f' )
  130.             i = 10 + c - 'a' ;
  131.     }
  132.     return i ;
  133. }
  134.  
  135. /*****************************  ★ メイン ★  ********************************/
  136. main( int ac, char *av[] )
  137. {
  138.     int    ctoi() ;
  139.     int    p,b,r,g ;
  140.     int    c, cc, arglen ;
  141.     int    id ;
  142.     int    r60 = FALSE ;
  143.  
  144.     if ( ac > 1 ) {
  145.         for ( c=1; c<ac; c++ ) {
  146.             if ( *av[c] == '-' || *av[c] == '/' ) {        /* オプションスイッチ    */
  147.                 arglen = strlen( av[c] ) ;
  148.                 for ( cc=1; cc<arglen; cc++ ) {
  149.                     switch ( *(av[c]+cc) ) {
  150.                         case 'r' :
  151.                         case 'R' :
  152.                             r60 = TRUE ;
  153.                             break ;
  154.                         default :
  155.                             printf("\x1b[1;33m") ;
  156.                             printf("Option switch error(%c)",*(av[c]+cc)) ;
  157.                             printf("\x1b[m\n") ;
  158.                             break ;
  159.                     }
  160.                 }
  161.             }
  162.         }
  163.     }
  164.     id = mid() ;
  165.     switch ( id ) {                            /*  機種判別    */
  166.         case 1 :                            /*  FMTOWNS        */
  167.         case 2 :                            /*  FMTOWNS        */
  168.         case 5 :                            /*  FMR-50S        */
  169.                 Palette = PALETTE ;
  170.                 Blue = BLUE ;
  171.                 Red = RED ;
  172.                 Green = GREEN ;
  173.                 break ;
  174.         case 4 :                            /*  FMR-60/50    */
  175.                 Palette = PALETTE ;
  176.                 Blue = BLUE ;
  177.                 Red = RED ;
  178.                 Green = GREEN ;
  179.                 if ( !r60 ) {
  180.                     break ;
  181.                 }
  182.         case 3 :                            /*  FMR-70        */
  183.                 outp( CONTROL ,0x05 ) ;
  184.                 Palette = R_PALETTE ;
  185.                 Blue = R_BLUE ;
  186.                 Red = R_RED ;
  187.                 Green = R_GREEN ;
  188.                 break ;
  189.         case 6 :                            /*  FMR-50LT    */
  190.         default :                            /*  ?????        */
  191.                 printf("\nこのマシンでは、使用できません!\n") ;
  192.                 exit ( 1 ) ;
  193.                 break ;
  194.     }
  195.     if ( ac < 2 ) {                                /*  引数なし    */
  196.         printf("%s%04.2f\n",Msg[0],VER_LEV) ;
  197.         printf("%s\n",Msg[1]) ;
  198.         printf("\n") ;
  199.         for ( c=2; c<7; c++ ) {
  200.             printf("%s\n",Msg[c]) ;
  201.         }
  202.         if ( id == 4 ) {
  203.             printf("%s\n",Msg[7]) ;
  204.         }
  205.     } else {                                    /*  引数あり    */
  206.         p = 0 ;
  207.         if ( ac > 2 )
  208.             p = ctoi( *av[2] ) ;
  209.         b = ctoi( *av[1] ) ;
  210.         r = ctoi( *(av[1]+1) ) ;
  211.         g = ctoi( *(av[1]+2) ) ;
  212.         outp( Palette ,p ) ;
  213.         outp( Blue    ,b*16 ) ;                /* 上位 8 bit にセット    */
  214.         outp( Red     ,r*16 ) ;
  215.         outp( Green   ,g*16 ) ;
  216.     }
  217. }
  218.  
  219.