GBA F2A Multiboot

Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Neue Antwort erstellen

Vertex

Betreff: GBA F2A Multiboot

BeitragSo, Feb 27, 2005 2:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi!
Die wenigsten werden wissen, für was das sein soll. Nun wer für den GameBoy Advanced einen Flash2Advance USB Flash-Linker besitzt, sei es mit Cartride oder ohne, kann direkt per Multiboot, ROMs auf dem GBA ausführen lassen. Aufgrund dessen, dass ich schonmal Daten zum GBA transferieren kann, will ich versuchen, 2 GBAs per Internet zu verbinden. So das Multiplayerspiele weltweit möglich sind(unterstützen nicht einmal die Emulatoren).

Naja jedenfalls braucht das ding den EZUSB Treiber von Cypress.

EZUSB.bmx
Code: [AUSKLAPPEN]
Strict

Type TVendorRequestIn
   Field bRequest:Byte
   Field shValue:Short
   Field shIndex:Short
   Field shLength:Short
   Field bDirection:Byte
   Field bData:Byte
End Type

Type TBulkTransferControl
   Field iPipeNum:Int
End Type

Const GENERIC_READ           = $80000000
Const GENERIC_WRITE          = $40000000
Const FILE_SHARE_READ        = $00000001
Const FILE_SHARE_WRITE       = $00000002
Const OPEN_EXISTING          = $00000003
Const INVALID_HANDLE_VALUE   = -1

Const BULK_IN_PIPE           = $00000002
Const BULK_OUT_PIPE          = $00000003

Const COMMAND_SIZE           = 13

Const IOCTL_EZUSB_BULK_READ  = $0022204E
Const IOCTL_EZUSB_BULK_WRITE = $00222051

Const TARGET_INIT            = $000000FF
Const TARGET_DOWNLOAD        = $00000000

Const BLOCK_SIZE_ULA           = $00000800

Extern "Win32"
   Function apiCreateFile:Int(sFileName$z, iDesiredAccess:Int, iShareMode:Int, ..
                              pSecurityAttributes:Byte Ptr, iCreationDistribution:Int, ..
                              iFlagAndAttributes:Int, iTemplateFile:Int) = "CreateFileA@28"
                              
   Function apiDeviceIoControl:Byte(iDevice:Int, iIoControlCode:Int, pInBuffer:Byte Ptr, ..
                                   iInBufferSize:Int, pOutBuffer:Byte Ptr, iOutBufferSize:Int, ..
                                   ipByteReturned:Int Ptr, pOverlapped:Byte Ptr) = "DeviceIoControl@32"
   
   Function apiCloseHandle:Byte(iObject:Int) = "CloseHandle@4"
End Extern

Function SetCmdToULA:Int(iEZUSB, bCommand:Byte, iP1:Int, iP2:Int, iP3:Int)
   Local tBulkControl:TBulkTransferControl, tULABuffer:tBank, iBytes:Int
   
   tBulkControl = New TBulkTransferControl
   tBulkControl.iPipeNum = BULK_OUT_PIPE
   
   tULABuffer = CreateBank(COMMAND_SIZE)
   PokeByte tULAbuffer, 0, bCommand
   PokeInt  tULABuffer, 1, iP1
   PokeInt  tULABuffer, 5, iP2
   PokeInt  tULABuffer, 9, iP3

   Return apiDeviceIoControl(iEZUSB, IOCTL_EZUSB_BULK_WRITE, tBulkControl, SizeOf(tBulkControl), ..
                             BankBuf(tULABuffer), COMMAND_SIZE, Varptr iBytes, Null)
End Function

Function SendULA:Int(iEZUSB, pBuffer:Byte Ptr, iSize:Int)
   Local tBulkControl:TBulkTransferControl, tULABuffer:tBank, iBytes:Int
   
   tBulkControl = New TBulkTransferControl
   tBulkControl.iPipeNum = BULK_OUT_PIPE

   Return apiDeviceIoControl(iEZUSB, IOCTL_EZUSB_BULK_WRITE, tBulkControl, SizeOf(tBulkControl), ..
                             pBuffer, iSize, Varptr iBytes, Null)
End Function


GBANet.bmx
Code: [AUSKLAPPEN]
Strict

Import "EZUSB.bmx"

Print "> Turn GBA off!"
If Not DownloadFirm("boot.firm") Then
   Delay 2000 ; End
EndIf

Delay 2000 ; MultibootGBA("test.mb.gba")
DownloadFirm("close.firm")
Print "Finished"
Delay 2000 ; End

Function DownloadFirm:Int(sFile:String)
   Local iDevice:Int, iEZUSB:Int, tVReq:TVendorRequestIn, iBytes:Int
   Local bResult:Byte, tBuffer:TBank
   
   If FileType(sFile) <> 1 Then Return False
   
   For iDevice = 0 To 3
      iEZUSB = apiCreateFile("\\.\ezusb-"+iDevice, GENERIC_WRITE, FILE_SHARE_WRITE, ..
                             NULL, OPEN_EXISTING, 0, NULL)
      If iEZUSB <> INVALID_HANDLE_VALUE Then   Exit
   Next
   If iEZUSB = INVALID_HANDLE_VALUE Then
      Print "Can't find EZUSB"
      Return False
   EndIf
   

   tVReq = New TVendorRequestIn
   tVReq.bRequest   = $A0
   tVReq.shValue    = $7F92
   tVReq.shIndex    = $00
   tVReq.shLength   = $01
   tVReq.bData      = 1
   tVReq.bDirection = $00
   
   ' VendorRequestCode = $222014
   bResult = apiDeviceIoControl(iEZUSB, $222014, tVReq, SizeOf(tVReq), Null, 0, ..
                                Varptr iBytes, Null)
   If bResult = False Then
      apiCloseHandle(iEZUSB)
      Print "EZ-USB halt error"
      Return False
   EndIf
   
   ' AnchorDownloadCtl = $22201C
   tBuffer = LoadBank(sFile)
   bResult = apiDeviceIoControl(iEZUSB, $22201C, BankBuf(tBuffer), BankSize(tBuffer), ..
                             Null, 0, Varptr iBytes, Null)
   If bResult = False Then
      apiCloseHandle(iEZUSB)
      Print "EZ-USB firmware download error"
      Return False
   EndIf
   
   ' VendorRequestCode = $222014
   tVReq.bData = 0
   bResult = apiDeviceIoControl(iEZUSB, $222014, tVReq, SizeOf(tVReq), Null, 0, ..
                                Varptr iBytes, Null)
   If bResult = False Then
      apiCloseHandle(iEZUSB)
      Print "EZ-USB run error"
      Return False
   EndIf
   
   apiCloseHandle(iEZUSB)
   Return True
End Function

Function MultibootGBA(sFile:String)
   Local iDevice:Int, iEZUSB:Int, tBuffer:TBank, iSize:Int, iOffset:Int
   
   If FileType(sFile) <> 1 Then Return False
   
   Print "Connecting to GBA..."
   For iDevice = 0 To 3
      iEZUSB = apiCreateFile("\\.\ezusb-"+iDevice, GENERIC_WRITE, FILE_SHARE_WRITE, ..
                             NULL, OPEN_EXISTING, 0, NULL)
      If iEZUSB <> INVALID_HANDLE_VALUE Then
         If SetCmdToULA(iEZUSB, TARGET_INIT, 0, 0, 0) Then
            Exit
         Else
            apiCloseHandle(iEZUSB)
         EndIf
      EndIf
   Next
   If iEZUSB = INVALID_HANDLE_VALUE Then
      Print "Can't find EZUSB"
      Return False
   EndIf
   
   tBuffer = LoadBank(sFile)
   iSize = BankSize(tBuffer)
   Print "> Turn GBA on"
   Print "> Press Select+Start!"
   SetCmdToULA(iEZUSB, TARGET_DOWNLOAD, 0, iSize, 0)
   
   While iOffset < iSize
      If (iSize-iOffset) Mod BLOCK_SIZE_ULA = 0 Then
         SendULA(iEZUSB, BankBuf(tBuffer)+iOffset, BLOCK_SIZE_ULA)
         iOffset = iOffset+BLOCK_SIZE_ULA
      Else
         SendULA(iEZUSB, BankBuf(tBuffer)+iOffset, (iSize-iOffset) Mod BLOCK_SIZE_ULA)
         iOffset = iOffset+((iSize-iOffset) Mod BLOCK_SIZE_ULA)
      EndIf
      Print Int((Float(iOffset)/Float(iSize))*100.0)+"% sendet"
   Wend
   
   Delay 100
   apiCloseHandle(iEZUSB)
   Return True
End Function


Die Dateien mit Beispiel gibt es unter http://vertex.art-fx.org/GBA-Net.zip

mfg olli
vertex.dreamfall.at | GitHub

Xenon

BeitragSo, Feb 27, 2005 3:44
Antworten mit Zitat
Benutzer-Profile anzeigen
nice work, werde mir das morgen ansehen (ok eigentlich nach dem schlafen halt) weils jetzt schon recht spät is, kann zwar kein bmax, aber das interessiert mich trotzdem, da ich die nötige hardware habe Wink
 

lettorTrepuS

BeitragSo, Feb 27, 2005 11:03
Antworten mit Zitat
Benutzer-Profile anzeigen
-aus Sicherheitsgründen gelöscht- Diese Information ist mit Ihrer Sicherheitsfreigabe leider nicht erhältlich, Bürger.

Vertex

BeitragSo, Feb 27, 2005 11:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke!

Xenon: Wenn du Executables brauchst, kann ich sie dir hochladen.

ShadowTurtle: Hmm wäre mir eigentlich neu, das der VBA Multiplayersupport hätte. Das GDB ist m. M. nach ein Debugger, aber ich kann mich natürlich auch irren.
Ansonsten wird es natürlich Serverlisten geben.

Mal schauen ob ich mal eine kleine Multiboot ROM programmiere, die sich selbst verschicken kann. Ein GBA kann ja auch mit Linkkabel einen anderen GBA, ohne PC, eine Multiboot-ROM ausführen lassen.

mfg olli
vertex.dreamfall.at | GitHub

Vertex

BeitragSo, Feb 27, 2005 23:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich weiß jetzt, warum ich noch keine anderen ROMs senden konnte. Die, die ich ausprobiert hatte, hatten den GBA header schon drin. Wenn ich selber versuche eine ROM zu programmieren, fehlt dieser Header. Also mus sich noch etwas daran rumbasteln, damit alle ROMs versendet werden können.

mfg olli
vertex.dreamfall.at | GitHub
 

xperience2003

Betreff: ....

BeitragMo, Feb 28, 2005 1:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]

 GBAs per Internet zu verbinden. So das Multiplayerspiele weltweit möglich sind(unterstützen nicht einmal die Emulatoren).


...vertex, du wirst immer krasser Wink

mach weiter so
-digital art since 1990-
 

getlose

BeitragDo, März 03, 2005 22:14
Antworten mit Zitat
Benutzer-Profile anzeigen
vertex is sowieso n kewler typ ^^
haut coole sachen raus und spammt nicht.

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group