@@ -653,11 +653,25 @@ public enum Company
653
653
public Company LicenseeCode { get => ( Company ) manufacturerCode ; set => manufacturerCode = ( byte ) value ; }
654
654
655
655
[ MarshalAs ( UnmanagedType . ByValArray , SizeConst = 3 ) ]
656
- byte [ ] gameName = Encoding . ASCII . GetBytes ( "---" ) ;
656
+ byte [ ] gameName = new byte [ 3 ] ;
657
657
/// <summary>
658
658
/// 3-letter ASCII code per game (e.g. ZEL for The Legend of Zelda)
659
659
/// </summary>
660
- public string GameName { get => Encoding . ASCII . GetString ( gameName ) . Trim ( new char [ ] { '\0 ' , ' ' } ) ; set => gameName = Encoding . ASCII . GetBytes ( value . PadRight ( 3 ) ) . Take ( 3 ) . ToArray ( ) ; }
660
+ public string ? GameName {
661
+ get
662
+ {
663
+ if ( ! gameName . Select ( b => b != 0 ) . Any ( ) )
664
+ return Encoding . ASCII . GetString ( gameName ) . Trim ( new char [ ] { '\0 ' , ' ' } ) ;
665
+ else
666
+ return null ;
667
+ }
668
+ set {
669
+ if ( value != null )
670
+ gameName = Encoding . ASCII . GetBytes ( value . PadRight ( 3 ) ) . Take ( 3 ) . ToArray ( ) ;
671
+ else
672
+ gameName = new byte [ 3 ] ;
673
+ }
674
+ }
661
675
662
676
[ MarshalAs ( UnmanagedType . U1 ) ]
663
677
byte gameType ;
@@ -722,31 +736,40 @@ public enum Company
722
736
/// <summary>
723
737
/// Manufacturing date
724
738
/// </summary>
725
- public DateTime ManufacturingDate
739
+ public DateTime ? ManufacturingDate
726
740
{
727
741
get
728
742
{
729
743
try
730
744
{
731
- return new DateTime (
732
- ( ( manufacturingDate [ 0 ] & 0x0F ) + ( ( manufacturingDate [ 0 ] >> 4 ) & 0x0F ) * 10 ) + 1925 ,
733
- ( ( manufacturingDate [ 1 ] & 0x0F ) + ( ( manufacturingDate [ 1 ] >> 4 ) & 0x0F ) * 10 ) ,
734
- ( ( manufacturingDate [ 2 ] & 0x0F ) + ( ( manufacturingDate [ 2 ] >> 4 ) & 0x0F ) * 10 )
735
- ) ;
745
+ if ( ! rewrittenDate . Select ( b => b != 0 ) . Any ( ) )
746
+ return new DateTime (
747
+ ( ( manufacturingDate [ 0 ] & 0x0F ) + ( ( manufacturingDate [ 0 ] >> 4 ) & 0x0F ) * 10 ) + 1925 ,
748
+ ( ( manufacturingDate [ 1 ] & 0x0F ) + ( ( manufacturingDate [ 1 ] >> 4 ) & 0x0F ) * 10 ) ,
749
+ ( ( manufacturingDate [ 2 ] & 0x0F ) + ( ( manufacturingDate [ 2 ] >> 4 ) & 0x0F ) * 10 )
750
+ ) ;
751
+ else
752
+ return null ;
736
753
}
737
754
catch
738
755
{
739
- return new DateTime ( ) ;
756
+ return null ;
740
757
}
741
758
}
742
759
set
743
760
{
744
- manufacturingDate = new byte [ ]
761
+ if ( value != null )
745
762
{
746
- ( byte ) ( ( ( value . Year - 1925 ) % 10 ) | ( ( ( value . Year - 1925 ) / 10 ) << 4 ) ) ,
747
- ( byte ) ( ( ( value . Month ) % 10 ) | ( ( ( value . Month ) / 10 ) << 4 ) ) ,
748
- ( byte ) ( ( ( value . Day ) % 10 ) | ( ( ( value . Day ) / 10 ) << 4 ) )
749
- } ;
763
+ manufacturingDate = new byte [ ]
764
+ {
765
+ ( byte ) ( ( ( value . Value . Year - 1925 ) % 10 ) | ( ( ( value . Value . Year - 1925 ) / 10 ) << 4 ) ) ,
766
+ ( byte ) ( ( ( value . Value . Month ) % 10 ) | ( ( ( value . Value . Month ) / 10 ) << 4 ) ) ,
767
+ ( byte ) ( ( ( value . Value . Day ) % 10 ) | ( ( ( value . Value . Day ) / 10 ) << 4 ) )
768
+ } ;
769
+ } else
770
+ {
771
+ manufacturingDate = new byte [ 3 ] ;
772
+ }
750
773
}
751
774
}
752
775
@@ -777,31 +800,41 @@ public DateTime ManufacturingDate
777
800
/// "Rewritten disk" date. It's speculated this refers to the date the disk was formatted and rewritten by something like a Disk Writer kiosk.
778
801
/// In the case of an original (non-copied) disk, this should be the same as Manufacturing date
779
802
/// </summary>
780
- public DateTime RewrittenDate
803
+ public DateTime ? RewrittenDate
781
804
{
782
805
get
783
806
{
784
807
try
785
808
{
786
- return new DateTime (
787
- ( ( rewrittenDate [ 0 ] & 0x0F ) + ( ( rewrittenDate [ 0 ] >> 4 ) & 0x0F ) * 10 ) + 1925 ,
788
- ( ( rewrittenDate [ 1 ] & 0x0F ) + ( ( rewrittenDate [ 1 ] >> 4 ) & 0x0F ) * 10 ) ,
789
- ( ( rewrittenDate [ 2 ] & 0x0F ) + ( ( rewrittenDate [ 2 ] >> 4 ) & 0x0F ) * 10 )
790
- ) ;
809
+ if ( ! rewrittenDate . Select ( b => b != 0 ) . Any ( ) )
810
+ return new DateTime (
811
+ ( ( rewrittenDate [ 0 ] & 0x0F ) + ( ( rewrittenDate [ 0 ] >> 4 ) & 0x0F ) * 10 ) + 1925 ,
812
+ ( ( rewrittenDate [ 1 ] & 0x0F ) + ( ( rewrittenDate [ 1 ] >> 4 ) & 0x0F ) * 10 ) ,
813
+ ( ( rewrittenDate [ 2 ] & 0x0F ) + ( ( rewrittenDate [ 2 ] >> 4 ) & 0x0F ) * 10 )
814
+ ) ;
815
+ else
816
+ return null ;
791
817
}
792
818
catch
793
819
{
794
- return new DateTime ( ) ;
820
+ return null ;
795
821
}
796
822
}
797
823
set
798
824
{
799
- rewrittenDate = new byte [ ]
825
+ if ( value != null )
800
826
{
801
- ( byte ) ( ( ( value . Year - 1925 ) % 10 ) | ( ( ( value . Year - 1925 ) / 10 ) << 4 ) ) ,
802
- ( byte ) ( ( ( value . Month ) % 10 ) | ( ( ( value . Month ) / 10 ) << 4 ) ) ,
803
- ( byte ) ( ( ( value . Day ) % 10 ) | ( ( ( value . Day ) / 10 ) << 4 ) )
804
- } ;
827
+ manufacturingDate = new byte [ ]
828
+ {
829
+ ( byte ) ( ( ( value . Value . Year - 1925 ) % 10 ) | ( ( ( value . Value . Year - 1925 ) / 10 ) << 4 ) ) ,
830
+ ( byte ) ( ( ( value . Value . Month ) % 10 ) | ( ( ( value . Value . Month ) / 10 ) << 4 ) ) ,
831
+ ( byte ) ( ( ( value . Value . Day ) % 10 ) | ( ( ( value . Value . Day ) / 10 ) << 4 ) )
832
+ } ;
833
+ }
834
+ else
835
+ {
836
+ manufacturingDate = new byte [ 3 ] ;
837
+ }
805
838
}
806
839
}
807
840
@@ -899,7 +932,7 @@ public byte[] ToBytes()
899
932
/// String representation
900
933
/// </summary>
901
934
/// <returns>Game name</returns>
902
- public override string ToString ( ) => GameName ;
935
+ public override string ToString ( ) => GameName ?? "---" ;
903
936
904
937
/// <summary>
905
938
/// Equality comparer
0 commit comments