[Scummvm-cvs-logs] SF.net SVN: scummvm:[54752] scummvm/trunk/backends/platform/dc

marcus_c at users.sourceforge.net marcus_c at users.sourceforge.net
Fri Dec 3 19:57:21 CET 2010


Revision: 54752
          http://scummvm.svn.sourceforge.net/scummvm/?rev=54752&view=rev
Author:   marcus_c
Date:     2010-12-03 18:57:20 +0000 (Fri, 03 Dec 2010)

Log Message:
-----------
DC: Implement getSystemLanguage()

Modified Paths:
--------------
    scummvm/trunk/backends/platform/dc/dc.h
    scummvm/trunk/backends/platform/dc/dcmain.cpp

Modified: scummvm/trunk/backends/platform/dc/dc.h
===================================================================
--- scummvm/trunk/backends/platform/dc/dc.h	2010-12-03 15:11:43 UTC (rev 54751)
+++ scummvm/trunk/backends/platform/dc/dc.h	2010-12-03 18:57:20 UTC (rev 54752)
@@ -242,6 +242,8 @@
 
   Common::SeekableReadStream *createConfigReadStream();
   Common::WriteStream *createConfigWriteStream();
+
+  Common::String getSystemLanguage() const;
 };
 
 

Modified: scummvm/trunk/backends/platform/dc/dcmain.cpp
===================================================================
--- scummvm/trunk/backends/platform/dc/dcmain.cpp	2010-12-03 15:11:43 UTC (rev 54751)
+++ scummvm/trunk/backends/platform/dc/dcmain.cpp	2010-12-03 18:57:20 UTC (rev 54752)
@@ -219,6 +219,93 @@
   return 0;
 }
 
+namespace DC_Flash {
+  static int syscall_info_flash(int sect, int *info)
+  {
+    return (*(int (**)(int, void*, int, int))0x8c0000b8)(sect,info,0,0);  
+  }
+
+  static int syscall_read_flash(int offs, void *buf, int cnt)
+  {
+    return (*(int (**)(int, void*, int, int))0x8c0000b8)(offs,buf,cnt,1);
+  }
+
+  static int flash_crc(const char *buf, int size)
+  {
+    int i, c, n = -1;
+    for(i=0; i<size; i++) {
+      n ^= (buf[i]<<8);
+      for(c=0; c<8; c++)
+	if(n & 0x8000)
+	  n = (n << 1) ^ 4129;
+	else
+	  n <<= 1;
+    }
+    return (unsigned short)~n;
+  }
+  
+  static int flash_read_sector(int partition, int sec, unsigned char *dst)
+  {
+    int s, r, n, b, bmb, got=0;
+    int info[2];
+    char buf[64];
+    char bm[64];
+    
+    if((r = syscall_info_flash(partition, info))<0)
+      return r;
+    
+    if((r = syscall_read_flash(info[0], buf, 64))<0)
+      return r;
+    
+    if(memcmp(buf, "KATANA_FLASH", 12) ||
+       buf[16] != partition || buf[17] != 0)
+      return -2;
+    
+    n = (info[1]>>6)-1-((info[1] + 0x7fff)>>15);
+    bmb = n+1;
+    for(b = 0; b < n; b++) {
+      if(!(b&511)) {
+	if((r = syscall_read_flash(info[0] + (bmb++ << 6), bm, 64))<0)
+	  return r;
+      }
+      if(!(bm[(b>>3)&63] & (0x80>>(b&7))))
+	if((r = syscall_read_flash(info[0] + ((b+1) << 6), buf, 64))<0)
+	  return r;
+	else if((s=*(unsigned short *)(buf+0)) == sec &&
+		flash_crc(buf, 62) == *(unsigned short *)(buf+62)) {
+	  memcpy(dst+(s-sec)*60, buf+2, 60);
+	  got=1;
+	}
+    }
+    return got;
+  }
+
+  static int get_locale_setting()
+  {
+    unsigned char data[60];
+    if (flash_read_sector(2,5,data) == 1)
+      return data[5];
+    else
+      return -1;
+  }
+};
+
+Common::String OSystem_Dreamcast::getSystemLanguage() const {
+  static const char *languages[] = {
+    "ja_JP",
+    "en_US",
+    "de_DE",
+    "fr_FR",
+    "es_ES",
+    "it_IT"
+  };
+  int l = DC_Flash::get_locale_setting();
+  if (l<0 || l>=sizeof(languages)/sizeof(languages[0]))
+    l = 1;
+  return Common::String(languages[l]);
+}
+
+
 void DCHardware::dc_init_hardware()
 {
 #ifndef NOSERIAL


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Scummvm-git-logs mailing list