@@ -33,14 +33,16 @@ var (
33
33
flagSize sizeUnit
34
34
flagAutoCic bool
35
35
flagAutoSave bool
36
+ flagAutoExtended bool
36
37
flagBank string
37
38
flagQuiet bool
38
39
flagByteswapD int
39
40
flagByteswapU int
40
41
flagFwExtractOut string
41
42
42
- pflagAutoCic * pflag.Flag
43
- pflagAutoSave * pflag.Flag
43
+ pflagAutoCic * pflag.Flag
44
+ pflagAutoSave * pflag.Flag
45
+ pflagAutoExtended * pflag.Flag
44
46
)
45
47
46
48
type sizeUnit struct {
@@ -365,11 +367,6 @@ func cmdUpload(cmd *cobra.Command, args []string) error {
365
367
offset := uint32 (flagOffset .size )
366
368
vprintf ("offset: %v\n " , offset )
367
369
368
- rommd5 := md5 .New ()
369
- if err := upload (dev , io .TeeReader (bs .NewReader (f ), rommd5 ), size , bank , offset , filepath .Base (args [0 ])); err != nil {
370
- return err
371
- }
372
-
373
370
// --autocic defaults to true when uploading a ROM to CARTROM at offset 0
374
371
if ! pflagAutoCic .Changed && bank == drive64 .BankCARTROM && offset == 0 {
375
372
flagAutoCic = true
@@ -378,6 +375,36 @@ func cmdUpload(cmd *cobra.Command, args []string) error {
378
375
flagAutoSave = true
379
376
}
380
377
378
+ // --extended defaults to true when uploading a ROM to CARTROM at offset 0, if the ROM is larger than 64MB
379
+ // Otherwise, the ROM would uploaded correctly but the data would be inaccessible.
380
+ if ! pflagAutoExtended .Changed && bank == drive64 .BankCARTROM && offset == 0 && size > 64 * 1024 * 1024 {
381
+ if hwvar , fwver , _ , err := dev .CmdVersionRequest (); err == nil && hwvar == drive64 .VarRevA {
382
+ // Return an appropriate error message for HW1, taking into account that the user doesn't
383
+ // probably know what extended mode is.
384
+ return errors .New ("ROMs larger than 64 MiB not supported on 64drive HW1" )
385
+ } else if fwver < 206 {
386
+ return errors .New ("ROMs larger than 64 MiB not supported on 64drive firmware < 2.06" )
387
+ }
388
+ flagAutoExtended = true
389
+ }
390
+
391
+ if flagAutoExtended {
392
+ vprintf ("Set extended mode\n " )
393
+ if hwvar , fwver , _ , err := dev .CmdVersionRequest (); err == nil && hwvar == drive64 .VarRevA {
394
+ return errors .New ("extended mode not supported on 64drive HW1" )
395
+ } else if fwver < 206 {
396
+ return errors .New ("extended mode not supported on 64drive firmware < 2.06" )
397
+ } else if err := dev .CmdSetExtended (true ); err != nil {
398
+ return err
399
+ }
400
+ }
401
+
402
+ vprintf ("uploading\n " )
403
+ rommd5 := md5 .New ()
404
+ if err := upload (dev , io .TeeReader (bs .NewReader (f ), rommd5 ), size , bank , offset , filepath .Base (args [0 ])); err != nil {
405
+ return err
406
+ }
407
+
381
408
if flagAutoCic {
382
409
cic , err := cicAutodetect (dev )
383
410
if err != nil {
@@ -563,6 +590,31 @@ func cmdSaveType(cmd *cobra.Command, args []string) error {
563
590
564
591
}
565
592
593
+ func cmdExtended (cmd * cobra.Command , args []string ) error {
594
+ dev , err := drive64 .NewDeviceSingle ()
595
+ if err != nil {
596
+ return err
597
+ }
598
+ defer dev .Close ()
599
+
600
+ var extended bool
601
+ switch args [0 ] {
602
+ case "t" , "true" , "1" :
603
+ extended = true
604
+ }
605
+
606
+ vprintf ("64drive serial: %v\n " , dev .Description ().Serial )
607
+ vprintf ("Extended mode: %v\n " , extended )
608
+
609
+ if hwvar , fwver , _ , err := dev .CmdVersionRequest (); err == nil && hwvar == drive64 .VarRevA {
610
+ return errors .New ("extended mode not supported on 64drive HW1" )
611
+ } else if fwver < 206 {
612
+ return errors .New ("extended mode not supported on 64drive firmware < 2.06" )
613
+ } else {
614
+ return dev .CmdSetExtended (extended )
615
+ }
616
+ }
617
+
566
618
func fwCmd (filename string , cb func (rpk * drive64.RPK ) error ) error {
567
619
f , err := os .Open (filename )
568
620
if err != nil {
@@ -720,11 +772,13 @@ func main() {
720
772
cmdUpload .Flags ().VarP (& flagSize , "size" , "s" , "size of data to upload (default: file size)" )
721
773
cmdUpload .Flags ().StringVarP (& flagBank , "bank" , "b" , "rom" , "bank where data should be uploaded" )
722
774
cmdUpload .Flags ().BoolVarP (& flagAutoCic , "autocic" , "c" , false , "autoset CIC after upload (default: true if uploading a ROM)" )
723
- cmdUpload .Flags ().BoolVarP (& flagAutoSave , "autosave" , "S" , false , "autoset save tyep after upload (default: true if uploading a ROM)" )
775
+ cmdUpload .Flags ().BoolVarP (& flagAutoSave , "autosave" , "S" , false , "autoset save type after upload (default: true if uploading a ROM)" )
776
+ cmdUpload .Flags ().BoolVarP (& flagAutoExtended , "extended" , "e" , false , "set extended mode after upload (default: true if uploading a >64Mb ROM)" )
724
777
cmdUpload .Flags ().BoolVarP (& flagVerbose , "verbose" , "v" , false , "be verbose" )
725
778
cmdUpload .Flags ().IntVarP (& flagByteswapU , "byteswap" , "w" , - 1 , "byteswap format: 0=none, 2=16bit, 4=32bit, -1=autodetect" )
726
779
pflagAutoCic = cmdUpload .Flag ("autocic" )
727
780
pflagAutoSave = cmdUpload .Flag ("autosave" )
781
+ pflagAutoExtended = cmdUpload .Flag ("extended" )
728
782
729
783
var cmdDownload = & cobra.Command {
730
784
Use : "download [file]" ,
@@ -776,6 +830,21 @@ The save type can be specified using one of the following names:
776
830
}
777
831
cmdSaveType .Flags ().BoolVarP (& flagVerbose , "verbose" , "v" , false , "be verbose" )
778
832
833
+ var cmdExtended = & cobra.Command {
834
+ Use : "extended [bool]" ,
835
+ Aliases : []string {"ext" },
836
+ Short : "enabel or disabled the 64drive extended mode" ,
837
+ Long : `Extended mode allows 64drive to expose the full 240 MiB of SDRAM as ROM to the N64.
838
+ This is required to run ROMs larger than 64 MiB, because otherwise the upper part of the ROM would not
839
+ be accessible. Please notice that extended mode is only available on 64Drive HW2 with firmware >= 2.06.` ,
840
+ Example : ` g64drive extended true
841
+ -- enable extended mode.` ,
842
+ RunE : cmdExtended ,
843
+ Args : cobra .ExactArgs (1 ),
844
+ SilenceUsage : true ,
845
+ }
846
+ cmdExtended .Flags ().BoolVarP (& flagVerbose , "verbose" , "v" , false , "be verbose" )
847
+
779
848
var cmdFirmwareInfo = & cobra.Command {
780
849
Use : "info [file.rpk]" ,
781
850
Short : "show information on 64drive firmware file" ,
@@ -838,7 +907,7 @@ No proprietary FTDI/D2XX is required and will not be installed.`,
838
907
Use : "g64drive" ,
839
908
}
840
909
rootCmd .PersistentFlags ().BoolVarP (& flagQuiet , "quiet" , "q" , false , "do not show any output unless an error occurs" )
841
- rootCmd .AddCommand (cmdList , cmdUpload , cmdDownload , cmdCic , cmdSaveType , cmdFirmware , cmdDebug )
910
+ rootCmd .AddCommand (cmdList , cmdUpload , cmdDownload , cmdCic , cmdSaveType , cmdExtended , cmdFirmware , cmdDebug )
842
911
if runtime .GOOS == "windows" {
843
912
rootCmd .AddCommand (cmdDriverInstall )
844
913
}
0 commit comments