home *** CD-ROM | disk | FTP | other *** search
/ No Fragments Archive 12: Textmags & Docs / nf_archive_12.iso / MAGS / SOURCES / ATARI_SRC.ZIP / atari source / FALCON / CPX / GENERAL.TC / BLOCK2.C next >
Encoding:
C/C++ Source or Header  |  2001-02-10  |  8.4 KB  |  447 lines

  1. /* BLOCK2.C
  2.  *==========================================================================
  3.  * DATE:    March 21, 1990
  4.  * DESCRIPTION: STE Chip Select and TT Speaker Routines
  5.  */
  6.  
  7.  
  8.  /* INCLUDE FILES
  9.  *==========================================================================
  10.  */ 
  11. #include <sys\gemskel.h>
  12. #include <tos.h>
  13.  
  14. #include "country.h"
  15.  
  16. #include "general.h"
  17. #include "gen2.h"
  18. #include "ttblit.h"
  19.  
  20. #include "text.h"
  21.  
  22.  
  23. /* DEFINES
  24.  *==========================================================================
  25.  */
  26. #define NON_TT_STE    0
  27. #define SPEAKER        1
  28. #define MEGA_STE    2
  29.  
  30. #define MEGA_STE_CACHE    0xFFFF8E21L    /* BYTE ADDRESS */
  31.  
  32. /* The MEGA STE allows...
  33.  *             8 Mhz No Cache
  34.  *          16 Mhz No Cache
  35.  *          16 Mhz Cache
  36.  * DO NOT Set 8Mhz Cache- EVER! Dire Consequences will result...
  37.  *    PLUS - Preserve the other bits not being used.
  38.  *
  39.  * Bit 0 - Cache Enable
  40.  * Bit 1 - Turbo Enable ( High Speed )
  41.  *
  42.  *       Bit 1   Bit 0
  43.  *         0         0       0    8 Mhz - no cache
  44.  *         0       1       1     Do Not Use
  45.  *         1         0       2    16 Mhz - No Cache
  46.  *         1         1       3    16 Mhz - Cache
  47.  *
  48.  * HOWEVER, our variable will have it as 
  49.  *        0 - 8 Mhz - no cache
  50.  *      1 - 16 Mhz - no Cache
  51.  *      2 - 16 Mhz - Cache
  52.  */
  53.  
  54.  
  55.  
  56. /* PROTOTYPES
  57.  *==========================================================================
  58.  */
  59. void    Init_Block2( void );
  60. void    Set_Block2( void );
  61. void    Get_Block2( void );
  62. void    Block2_Update( void );
  63. void    Do_Block2( void );
  64.  
  65. int    Block2_Set_Pop( void );
  66. void    Block2_Get_Pop( int flag );
  67.  
  68. int    Check_Speaker( void );
  69. BOOLEAN    IsSpeaker( void );
  70. void    Set_Speaker( void );
  71. void    Get_Speaker( void );
  72.  
  73. int    Check_STE( void );
  74. BOOLEAN IsSTE( void );
  75. void    Set_STE( void );
  76. void    Get_STE( void );
  77.  
  78. long    Write_STE_Cache( void );
  79. long    Read_STE_Cache( void );
  80.  
  81.  
  82. /* EXTERNALS
  83.  *==========================================================================
  84.  */
  85.  
  86.  
  87. /* GLOBALS 
  88.  *==========================================================================
  89.  */
  90.  
  91. int  Block2_Flag = 0;        /* 0 - NON-TT or STE
  92.                  * 1 - TT Speaker
  93.                  * 2 - MEGA STE Chip Select
  94.                  */
  95.  
  96.  
  97.  
  98. int From_Chip[] = { 0, 0, 1, 2 };    /* Index with STE_Actual */
  99. int To_Chip[]   = { 0, 2, 3 };        /* Index with cur_value.STE_Chip */
  100.  
  101. int STE_Actual;
  102.  
  103.  
  104. /* FUNCTIONS
  105.  *==========================================================================
  106.  */
  107.  
  108.  
  109. /* Init_Block2()
  110.  *==========================================================================
  111.  * Check to see if we have a TT speaker or an STE that has a switchable
  112.  * mc68000.
  113.  *
  114.  * Set Block2_Flag to:    0 - NON_TT_STE
  115.  *              1 - TT Speaker
  116.  *              2 - STE Chip Select ( MEGA STE )
  117.  */
  118. void
  119. Init_Block2( void )
  120. {
  121.     Block2_Flag = NON_TT_STE;
  122.     Block2_Flag = ( Check_Speaker() | Check_STE() );
  123. }
  124.  
  125.  
  126.  
  127. /* Set_Block2()
  128.  *==========================================================================
  129.  * Set the TT Speaker OR the STE Chip Select Speed.
  130.  * in the hardware.
  131.  */
  132. void
  133. Set_Block2( void )
  134. {
  135.    Set_Speaker();
  136.    Set_STE();
  137. }
  138.  
  139.  
  140.  
  141. /* Get_Block2()
  142.  *==========================================================================
  143.  * Get the current status of either the TT Speaker OR the STE Chip Select
  144.  * Speed.
  145.  */
  146. void
  147. Get_Block2( void )
  148. {
  149.    Get_Speaker();
  150.    Get_STE();
  151. }
  152.  
  153.  
  154.  
  155. /* Block2_Update()
  156.  *==========================================================================
  157.  * 1) Hide or Display Block2 Area
  158.  * 2) Choose Title Text
  159.  * 3) Choose Button Text
  160.  */
  161. void
  162. Block2_Update( void )
  163. {
  164.   OBJECT *tree = ( OBJECT *)rs_trindex[ GENERAL ];
  165.   
  166.   HideObj( BLK2 );
  167.   if( Block2_Flag )
  168.   {
  169.       ShowObj( BLK2 );
  170.       TedText( BLK2TXT ) = block2_title[ Block2_Flag ];
  171.   
  172.       if( IsSpeaker() )
  173.             TedText( BLK2BUTT ) = 
  174.                    chip1_text[ (( cur_value.TT_Speaker )?(FALSE):(TRUE)) ];
  175.       if( IsSTE() )
  176.               TedText( BLK2BUTT ) = STE_Speed[ cur_value.STE_Chip ];
  177.   }
  178. }
  179.  
  180.  
  181.  
  182.  
  183. void
  184. Do_Block2( void )
  185. {
  186.    OBJECT *tree = ( OBJECT *)rs_trindex[ GENERAL ];
  187.  
  188.    char **txtptr;
  189.    int  items;
  190.    int  length;
  191.    int  flag;
  192.    int  temp;
  193.    
  194.    if( IsSpeaker() )
  195.    {
  196.       items  = 2;
  197.       length = 8;
  198.       txtptr = chip1_text;
  199.    }
  200.  
  201.    if( IsSTE() )
  202.    {
  203.       items  = 3;
  204.  
  205. #if FRENCH
  206.       length = 22;
  207. #endif
  208.       
  209. #if ITALY
  210.       length = 23;
  211. #endif
  212.       
  213. #if US | UK | SPAIN | GERMAN | SWEDEN
  214.       length = 21;
  215. #endif
  216.       
  217.       txtptr = STE_Text;
  218.    }
  219.    
  220.    temp = Block2_Set_Pop();
  221.    flag = Pop_Handle( BLK2BUTT, txtptr, items, &temp, IBM, length );
  222.    if( flag != -1 )
  223.    {
  224.       Block2_Get_Pop( flag );
  225.       Set_Block2();
  226.    }
  227.    if( IsSpeaker() )
  228.        TedText( BLK2BUTT ) = 
  229.            chip1_text[ (( cur_value.TT_Speaker )?(FALSE):(TRUE)) ];
  230.  
  231.    if( IsSTE() )
  232.          TedText( BLK2BUTT ) = STE_Speed[ cur_value.STE_Chip ];
  233.          
  234.    Objc_draw( tree, BLK2BUTT, 0, NULL );
  235. }
  236.  
  237.  
  238.  
  239.  
  240. int
  241. Block2_Set_Pop( void )
  242. {
  243.    int state = NON_TT_STE;
  244.  
  245.    Get_Block2();
  246.    if( IsSpeaker() )
  247.           state = !cur_value.TT_Speaker;
  248.    if( IsSTE() )
  249.          state = cur_value.STE_Chip;          
  250.    return( state );   
  251. }
  252.  
  253.  
  254.  
  255. void
  256. Block2_Get_Pop( int flag )
  257. {
  258.    if( IsSpeaker() )
  259.       cur_value.TT_Speaker = (( flag ) ? ( FALSE ) : ( TRUE ) );
  260.       
  261.    if( IsSTE() )
  262.       cur_value.STE_Chip = flag;
  263. }
  264.  
  265.  
  266.  
  267.  
  268.  
  269. void
  270. Block2_Redraw( void )
  271. {
  272.    OBJECT *tree = ( OBJECT *)rs_trindex[ GENERAL ];
  273.    
  274.    int Old_STE = cur_value.STE_Chip;
  275.    int Old_Speaker = cur_value.TT_Speaker;
  276.    
  277.    Get_Block2();
  278.    Block2_Update();
  279.  
  280.    if( IsSTE() && ( Old_STE != cur_value.STE_Chip ) )
  281.        do_redraw( tree, BLK2BUTT );
  282.    
  283.    if( IsSpeaker() && ( Old_Speaker != cur_value.TT_Speaker ) )
  284.         do_redraw( tree, BLK2BUTT );
  285. }
  286.  
  287.  
  288.  
  289.  
  290. /*--------------------------------------------------------------------------
  291.  * TT Speaker Routines
  292.  *--------------------------------------------------------------------------
  293.  */
  294.  
  295. /* Check_Speaker()
  296.  *==========================================================================
  297.  * Check to see if we have a TT speaker.
  298.  * Check Cookie type for _MCH == 0x2xxxL
  299.  * cjg 08/06/92 - check for >= 2L
  300.  */
  301. int
  302. Check_Speaker( void )
  303. {
  304.    long     p_value;
  305.    
  306.    if( (*xcpb->getcookie)( 0x5f4d4348L, &p_value ) )
  307.    {
  308.       p_value = p_value >> 16;
  309.       if( p_value >= 2L )        
  310.             return( SPEAKER );
  311.    }
  312.    return( NON_TT_STE );
  313. }
  314.  
  315.  
  316.  
  317. /* IsSpeaker()
  318.  *==========================================================================
  319.  * Return TRUE or FALSE based on the presence of a TT Speaker.
  320.  * Simply check Block2_Flag.
  321.  */
  322. BOOLEAN
  323. IsSpeaker( void )
  324. {
  325.    return( Block2_Flag & SPEAKER );
  326. }
  327.  
  328.  
  329.  
  330.  
  331. void
  332. Set_Speaker( void )
  333. {
  334.    if( IsSpeaker() )
  335.    {
  336.       if( cur_value.TT_Speaker )
  337.             Offgibit( 0xBf );        /* Turn off Speaker */
  338.       else
  339.             Ongibit( 0x40 );        /* Turn on Speaker */
  340.  
  341.    }
  342. }
  343.  
  344.  
  345.  
  346. void
  347. Get_Speaker( void )
  348. {
  349.    char status;
  350.    
  351.    if( IsSpeaker() )
  352.    {
  353.        status = Giaccess( 0, 14 );
  354.        cur_value.TT_Speaker = !( status & 0x040 );
  355.    }
  356. }
  357.  
  358.  
  359.  
  360. /*--------------------------------------------------------------------------
  361.  * STE Chip Select Routines
  362.  *--------------------------------------------------------------------------
  363.  */
  364.  
  365.  /* Check Cookie to see if we are a MEGA_STE */
  366. int
  367. Check_STE( void )
  368. {
  369.    long     p_value;
  370.    
  371.    if( (*xcpb->getcookie)( 0x5f4d4348L, &p_value ) )
  372.    {
  373.       if( p_value == 0x10010L )        
  374.             return( MEGA_STE );
  375.    }
  376.    return( NON_TT_STE );    
  377. }
  378.  
  379.  
  380.  
  381. BOOLEAN
  382. IsSTE( void )
  383. {
  384.    return( Block2_Flag & MEGA_STE );
  385. }
  386.  
  387.  
  388.  
  389.  
  390. /* Set the Cache and Speed */ 
  391. void
  392. Set_STE( void )
  393. {
  394.    if( IsSTE() )
  395.    {
  396.         STE_Actual = To_Chip[ cur_value.STE_Chip ];
  397.         Supexec( Write_STE_Cache );
  398.    }
  399. }
  400.  
  401.  
  402.  
  403. /* Get the Current Cache and Speed Setting */
  404. void
  405. Get_STE( void )
  406. {
  407.    if( IsSTE() )
  408.    {
  409.        Supexec( Read_STE_Cache );
  410.        cur_value.STE_Chip = From_Chip[ STE_Actual ];
  411.    }
  412. }
  413.  
  414.  
  415.  
  416.  
  417. long
  418. Write_STE_Cache( void )
  419. {
  420.     char *ptr;
  421.     char hold;
  422.     
  423.     ptr = ( char *)MEGA_STE_CACHE;
  424.     hold = *ptr;
  425.     
  426.     hold &= 0xfc;
  427.     hold |= (char)(STE_Actual & 2);
  428.     *ptr = hold;
  429.     hold |= (char)(STE_Actual & 1);
  430.     *ptr = hold;
  431.     return 0L;
  432. }
  433.  
  434.  
  435. long
  436. Read_STE_Cache( void )
  437. {
  438.    char *ptr;
  439.    
  440.    ptr = ( char *)MEGA_STE_CACHE;
  441.    STE_Actual = ( int )( *ptr & 0x3 );
  442.    return( 0L );
  443. }
  444.  
  445.  
  446.  
  447.