#include <string.h>

#include "cmos.h"
#include "OSLib/osbyte.h"

#ifdef RISCOS3
static int cmos_old = 0;
#endif

#ifdef RISCOS3
#ifdef RISCOS4
bool riscos4()
{
  int r1;
  xosbyte1(129, 0, 0xff, &r1);
  return r1 >= 0xa8;
}
#else  /* !RISCOS4 */
#undef riscos4
#define riscos4() FALSE
#endif /* RISCOS4 */
#else  /* !RISCOS3 */
#undef riscos4
#define riscos4() TRUE
#endif /* RISCOS3 */

#ifdef RISCOS3
#ifdef RISCOS4
static void cmos_set3(int mav)
#else /* !RISCOS4 */
extern void cmos_set(int mav)
#endif /* RISCOS4 */
{
  xosbyte2(161, 198, 0, &cmos_old);
  xosbyte(162, 198, cmos_old & ~(mav >> 4 & 0xf) | mav & 0xf);
  cmos_changed = TRUE;
}
#endif /* RISCOS3 */

#ifdef RISCOS4
#ifdef RISCOS3
static void cmos_set4(int mav)
#else  /* !RISCOS3 */
extern void cmos_set(int mav)
#endif /* RISCOS3 */
{
  char cmd[40] = "Filer_Layout";

  if (mav & 30)
  {
    switch (mav & 3)
    {
      case 0:
        strcat(cmd, " -LargeIcons");
        break;
      case 1:
        strcat(cmd, " -SmallIcons");
        break;
      case 2:
        strcat(cmd, " -FullInfo");
        break;
    }
  }
  if (mav & 0xc0)
  {
    switch (mav & 0xc)
    {
      case 0:
        strcat(cmd, " -SortByName");
        break;
      case 4:
        strcat(cmd, " -SortByType");
        break;
      case 8:
        strcat(cmd, " -SortBySize");
        break;
      case 0xc:
        strcat(cmd, " -SortByDate");
        break;
    }
  }
  xos_cli(cmd);
}
#endif /* RISCOS4 */

#ifdef RISCOS3
#ifdef RISCOS4
extern void cmos_set(int mav)
{
  if (riscos4())
    cmos_set4(mav);
  else
    cmos_set3(mav);
}
#endif /* RISCOS3 */
#endif /* RISCOS4 */


#ifdef RISCOS3
void cmos_restore(void)
{
  if (!riscos4())
  {
    xosbyte(162, 198, cmos_old);
    cmos_changed = FALSE;
  }
}

bool cmos_changed = FALSE;
#endif /* RISCOS3 */
