Omnimaga
General Discussion => Technology and Development => Computer Programming => Topic started by: Aichi on December 04, 2010, 11:14:33 am
-
Hey Omnimaga Community,
I'm trying to make a program that compiles data to a Ti83+/84+/SE program with Visual Basic.
There's a list holding the program data. I define the list with Public data As List(Of Byte).
I am looking for a routine that creates a new 8xp file in a directory based on a SavefileDialog.
The program data should be dependent of the content from the data list.
Thanks in advance.
-
So wait, can you give us a test file to work with or something? I'm not too sure about VB, but I can help with the header for the .8xp and all the stuff you'll need like checksums.
-
I don't want to compile executable programs for the TI with my VB program.
It shall help me to create and manage TI programs, that contain data for different things.
But I develope an RPG Maker that compiles RPGs for the TI maybe, if I have success by
making this VB compiler.
That's my current code:
Imports System.IO
Public Class Form1
Dim data As List(Of Byte)
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
SaveFileDialog1.ShowDialog()
Dim Stream As System.IO.StreamWriter = System.IO.File.CreateText(SaveFileDialog1.FileName)
End Sub
End Class
It creates an 8xp file without content by pressing on Button1, which is the Compile button.
I still have no idea how to put the bytes from the data list into the 8xp data.
-
well, like this, IIRC:
'*** Write whatever bytes you want
Stream.WriteByte(0)
'*** Clear the stream buffer and flush it to file (Only if the stream is buffered.)
Stream.Flush()
'*** Close the stream
Stream.Close()
-
Thank you, graphmastur. WriteByte fortunately works.
Imports System.IO
Public Class Form1
Dim data As List(Of Byte)
Public Shared Counter As Integer
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
SaveFileDialog1.ShowDialog()
Dim Stream As FileStream = New FileStream(SaveFileDialog1.FileName, FileMode.Create)
For i As Integer = 0 To data.Count - 1
Stream.WriteByte(data(i))
Next
Stream.Close()
End Sub
End Class
But I have trouble by using these 8xp's in TIConnect.
TIConnect outputs "incompatible type".
The files need more informations than just the program data,
for example the 8-character name that it has on TI.
Does anyone know something about this structure?
-
I'm also trying to do one, but just for learning. C#, though.
Also, this is calc related, and computer, wrong forum?
-
I know quite a lot about the structure. And so can you if you look here (http://www.ticalc.org/archives/files/fileinfo/247/24750.html). It's more complicated than writing just the data to it, but it is fairly well explained in there. Please ask if you have more questions.
I'm also trying to do one, but just for learning. C#, though.
Also, this is calc related, and computer, wrong forum?
No, it is a computer language, just calc files. It's fine here.
-
'Non-Calc-Related Computer Projects and Ideas'...
Hey Omnimaga Community,
I'm trying to make a program that compiles data to a Ti83+/84+/SE program with Visual Basic.
There's a list holding the program data. I define the list with Public data As List(Of Byte).
I am looking for a routine that creates a new 8xp file in a directory based on a SavefileDialog.
The program data should be dependent of the content from the data list.
Thanks in advance.
-
Scout, this is a computer language... regardless of how many times something associated with a calculator is mentioned, it is still VB. and VB is programmed on a computer.
-
I'm also trying to do one, but just for learning. C#, though.
Were you able to let the program output a working 8xp file?
Also, this is calc related, and computer, wrong forum?
I put it in this subforum since I need help for VB programming.
I know quite a lot about the structure. And so can you if you look here (http://www.ticalc.org/archives/files/fileinfo/247/24750.html). It's more complicated than writing just the data to it, but it is fairly well explained in there. Please ask if you have more questions.
Thanks, I'm going to read this guide.
-
Yeah for now it should be in Non-calc dev, IMHO. When it picks up and major updates are posted, it will be moved to the calc projects section and he can create a new topic in non-calc dev if he needs more help on VB.
-
Um, it is quite complicated. <_<
How do I convert strings (being just one character) to bytes/integers in Visual Basic?
"A" -> 65 for example.
-
Not sure. I know in Oasis, we were going to use a table, but decided for those characters with an ASCII value, to use that instead. So guess get the ASCII value of the Char.
-
If you are using VB.NET, you can use this (http://cid-c5fee036bc0d72bd.office.live.com/self.aspx/Public/TI%20Developer%20API.zip) library I made for just that purpose. It can convert strings to bytes or hex, and it can create 8xps, among other things.
-
If you are using VB.NET, you can use this (http://cid-c5fee036bc0d72bd.office.live.com/self.aspx/Public/TI%20Developer%20API.zip) library I made for just that purpose. It can convert strings to bytes or hex, and it can create 8xps, among other things.
Now I'm wondering if you have anything like that for C#
-
It's generic .NET, so it will work on C#. The library is actually written in C#.
-
It's generic .NET, so it will work on C#. The library is actually written in C#.
Great, gotta check that out!
-
If you are using VB.NET, you can use this (http://cid-c5fee036bc0d72bd.office.live.com/self.aspx/Public/TI%20Developer%20API.zip) library I made for just that purpose. It can convert strings to bytes or hex, and it can create 8xps, among other things.
That's great!
It'll be nice if you make a VB2010 project showing how to use the API.
The arguments that the classes need are uncommented and I couldn't find a readme or something.
-
I don't know VB.NET, but I can comment them for you later.
-
I don't know VB.NET, but I can comment them for you later.
Okay, thanks in advance.
I made some attempts, but without success.
This code SaveFileDialog1.ShowDialog()
TI_Developer_API.Utility.DataConverter.Save8xp(True, {1, 2, 3, 4, 5, 6}, "HELLO", SaveFileDialog1.FileName)
outputs an 8xp file into the correct directories, but an invalid file, though.
I attached a screenshot of some fish and what is displayed by notepad.exe.
-
Here's my code for Correlation Font Compiler, which uses VB 2008. This will give you an idea on how to write an .8xp compiler, though your data in the data section will obviously be different from mine.
I'm letting you look at this to help you out, so please don't use it for any other purposes. You can, however, feel free to copy the data-writing section of the code.
Button1_Click is what you want to look at. It takes a bitmap's graphical data and converts it into an .8xp program.
-
You could also use the code I do for my basic editor (modified slightly to be more generic =P)
Dim FileBytes(1048576) As Byte
Dim FileBytesCounter1 As Integer = (How many bytes you want to write. If you set file bytes to just the data you have, just set it to FileBytes.length() =P)
Dim FileComment As String = (Whatever you want the comment to be)
Dim FileName As String = (Whateverer you want the variable name to be. Not the actual file name. This could be eg. "MYPROG")
'**TI83F*
FileBytes(0) = 42
FileBytes(1) = 42
FileBytes(2) = 84
FileBytes(3) = 73
FileBytes(4) = 56
FileBytes(5) = 51
FileBytes(6) = 70
FileBytes(7) = 42
'1A,0A,00
FileBytes(8) = 26
FileBytes(9) = 10
FileBytes(10) = 0
'Comment
FileComment = FileComment.PadRight(42, ChrW(0))
For x As Integer = 0 To 41
FileBytes(x + 11) = AscW(FileComment.Chars(x))
Next
'Data Size
If FileBytesCounter1 + 19 > 255 Then
Dim TempHex = cHex(FileBytesCounter1 + 19, 4)
FileBytes(54) = cInteger(Mid(TempHex, 1, 2))
FileBytes(53) = cInteger(Mid(TempHex, 3, 2))
Else
FileBytes(54) = 0
FileBytes(53) = FileBytesCounter1 + 19
End If
'Random Flag (either B or D)
FileBytes(55) = 13
FileBytes(56) = 0
'Variable Size
If FileBytesCounter1 + 2 > 255 Then
Dim TempHex = cHex(FileBytesCounter1 + 2, 4)
FileBytes(58) = cInteger(Mid(TempHex, 1, 2))
FileBytes(57) = cInteger(Mid(TempHex, 3, 2))
Else
FileBytes(58) = 0
FileBytes(57) = FileBytesCounter1 + 2
End If
'Type ID
FileBytes(59) = 5
'Name
FileName = FileName.PadRight(8, ChrW(0))
For x As Integer = 0 To 7
FileBytes(60 + x) = AscW(FileName.Chars(x))
Next
'Version
FileBytes(68) = 0
'Archived
FileBytes(69) = 0
'Variable Size Again
If FileBytesCounter1 + 2 > 255 Then
Dim TempHex = cHex(FileBytesCounter1 + 2, 4)
FileBytes(71) = cInteger(Mid(TempHex, 1, 2))
FileBytes(70) = cInteger(Mid(TempHex, 3, 2))
Else
FileBytes(71) = 0
FileBytes(70) = FileBytesCounter1 + 2
End If
'Total Token Count
If FileBytesCounter1 > 255 Then
Dim TempHex = cHex(FileBytesCounter1, 4)
FileBytes(73) = cInteger(Mid(TempHex, 1, 2))
FileBytes(72) = cInteger(Mid(TempHex, 3, 2))
Else
FileBytes(73) = 0
FileBytes(72) = FileBytesCounter1
End If
'Totals data
Dim Counter = 0
For x As Integer = 0 To FileBytesCounter1 + 19
Counter += FileBytes(x + 55)
Next
'Lower 16 bits of data totalled together
If Hex(Counter).Length > 4 Then Counter = cInteger(Mid(cHex(Counter, 4), 1, 4))
If Counter > 255 Then
FileBytes(FileBytesCounter1 + 75) = cInteger(Mid(cHex(Counter, 4), 1, 2))
FileBytes(FileBytesCounter1 + 74) = cInteger(Mid(cHex(Counter, 4), 3, 2))
Else
FileBytes(FileBytesCounter1 + 75) = 0
FileBytes(FileBytesCounter1 + 74) = Counter
End If
Dim FinalBytes(FileBytesCounter1 + 75) As Byte
For x As Integer = 0 To FileBytesCounter1 + 75
FinalBytes(x) = FileBytes(x)
Next
File.WriteAllBytes((Where you want the file to save to), Finalbytes)
(You also need these two functions)
Shared Function cHex(ByVal IntValue As Integer, ByVal Length As Integer) As String
Dim Int_Length As Integer = Int(Math.Log10(IntValue) / Math.Log10(16)) + 1
Dim Temp_Value As Integer
Dim Hex_String As String = ""
For X As Integer = Length - 1 To 0 Step -1
Temp_Value = Int(IntValue / (16 ^ X))
Hex_String += Mid("0123456789ABCDEF", Temp_Value + 1, 1)
IntValue -= Temp_Value * (16 ^ X)
Next
Return Hex_String
End Function
Shared Function cInteger(ByVal HexString As String) As Integer
Dim Int_Value As Integer
For X As Integer = HexString.Length To 1 Step -1
Int_Value += (InStr("0123456789ABCDEF", Mid(HexString, X, 1)) - 1) * (16 ^ (HexString.Length - X))
Next
Return Int_Value
End Function
-
Can you attach the 8xp itself so I can view it in a hex editor? What you created won't run with Asm(, by the way, you need 0xBB6D and some other stuff, too. It also isn't a valid TI-Basic program. But it should send okay. Here's some example hex to try:
{ 0xBB, 0x6D, 0xC9 }
-
Aichi: Do you have a hex editor? There are a bunch of free ones, and then you could really see what's going wrong.
-
Notepad is actually a text editor and is built-in Windows. :P
-
Notepad is actually a text editor and is built-in Windows. :P
Also, creating a text editor is really easy... I made in C#, VB and Python xP
-
Aichi: Do you have a hex editor? There are a bunch of free ones, and then you could really see what's going wrong.
Whoops, sorry, fixed ^ Thanks DJ.
-
I'm busy with school at the moment, sorry.
@ cooliojazz
This routine seems to be very nice, but I couldn't find the code to include the bytes,
that the variable owns on TI.
@ SirCmpwn
I attached the 8xp that is created by the following arguments of Utility.Dataconverter.Save8xp:
Protected = True
data = {1, 2, 3, 4, 5, 6}
Progname = "HELLO"
File = SaveFileDialog1.Filename