Omnimaga

General Discussion => Technology and Development => Computer Programming => Topic started by: Aichi on December 04, 2010, 11:14:33 am

Title: How to create an 8xp compiler using VB 2010?
Post 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.
Title: Re: How to create an 8xp compiler using VB 2010?
Post by: jnesselr on December 04, 2010, 11:28:16 am
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.
Title: Re: How to create an 8xp compiler using VB 2010?
Post by: Aichi on December 04, 2010, 12:01:25 pm
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:
Code: [Select]
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.
Title: Re: How to create an 8xp compiler using VB 2010?
Post by: jnesselr on December 04, 2010, 12:40:08 pm
well, like this, IIRC:
Code: [Select]
'*** 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()
Title: Re: How to create an 8xp compiler using VB 2010?
Post by: Aichi on December 04, 2010, 01:08:17 pm
Thank you, graphmastur. WriteByte fortunately works.
Code: [Select]
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?
Title: Re: How to create an 8xp compiler using VB 2010?
Post by: Munchor on December 04, 2010, 01:09:22 pm
I'm also trying to do one, but just for learning. C#, though.

Also, this is calc related, and computer, wrong forum?
Title: Re: How to create an 8xp compiler using VB 2010?
Post by: jnesselr on December 04, 2010, 01:11:27 pm
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.
Title: Re: How to create an 8xp compiler using VB 2010?
Post by: Munchor on December 04, 2010, 01:13:36 pm
Quote
'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.
Title: Re: How to create an 8xp compiler using VB 2010?
Post by: nemo on December 04, 2010, 01:15:53 pm
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.
Title: Re: How to create an 8xp compiler using VB 2010?
Post by: Aichi on December 04, 2010, 01:16:03 pm
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.
Title: Re: How to create an 8xp compiler using VB 2010?
Post by: DJ Omnimaga on December 04, 2010, 05:23:14 pm
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.
Title: Re: How to create an 8xp compiler using VB 2010?
Post by: Aichi on December 05, 2010, 09:50:35 am
Um, it is quite complicated.  <_<
How do I convert strings (being just one character) to bytes/integers in Visual Basic?
"A" -> 65 for example.
Title: Re: How to create an 8xp compiler using VB 2010?
Post by: jnesselr on December 05, 2010, 05:55:27 pm
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.
Title: Re: How to create an 8xp compiler using VB 2010?
Post by: SirCmpwn on December 06, 2010, 08:40:52 am
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.
Title: Re: How to create an 8xp compiler using VB 2010?
Post by: Munchor on December 06, 2010, 08:42:31 am
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#
Title: Re: How to create an 8xp compiler using VB 2010?
Post by: SirCmpwn on December 06, 2010, 08:45:09 am
It's generic .NET, so it will work on C#.  The library is actually written in C#.
Title: Re: How to create an 8xp compiler using VB 2010?
Post by: Munchor on December 06, 2010, 08:47:23 am
It's generic .NET, so it will work on C#.  The library is actually written in C#.

Great, gotta check that out!
Title: Re: How to create an 8xp compiler using VB 2010?
Post by: Aichi on December 06, 2010, 05:24:07 pm
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.
Title: Re: How to create an 8xp compiler using VB 2010?
Post by: SirCmpwn on December 06, 2010, 09:05:30 pm
I don't know VB.NET, but I can comment them for you later.
Title: Re: How to create an 8xp compiler using VB 2010?
Post by: Aichi on December 07, 2010, 02:12:05 pm
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
Code: [Select]
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.
Title: Re: How to create an 8xp compiler using VB 2010?
Post by: Hot_Dog on December 07, 2010, 02:39:12 pm
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.
Title: Re: How to create an 8xp compiler using VB 2010?
Post by: cooliojazz on December 07, 2010, 08:04:10 pm
You could also use the code I do for my basic editor (modified slightly to be more generic =P)
Code: [Select]

        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
Title: Re: How to create an 8xp compiler using VB 2010?
Post by: SirCmpwn on December 07, 2010, 10:31:32 pm
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 }
Title: Re: How to create an 8xp compiler using VB 2010?
Post by: jnesselr on December 09, 2010, 07:05:46 am
Aichi: Do you have a hex editor? There are a bunch of free ones, and then you could really see what's going wrong.
Title: Re: How to create an 8xp compiler using VB 2010?
Post by: DJ Omnimaga on December 09, 2010, 09:39:32 am
Notepad is actually a text editor and is built-in Windows. :P
Title: Re: How to create an 8xp compiler using VB 2010?
Post by: Munchor on December 09, 2010, 09:40:35 am
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
Title: Re: How to create an 8xp compiler using VB 2010?
Post by: jnesselr on December 09, 2010, 05:37:25 pm
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.
Title: Re: How to create an 8xp compiler using VB 2010?
Post by: Aichi on December 11, 2010, 06:38:58 pm
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