Public Class Main #Region " Declarations " Private Const _WRONG_NUM_ARGUMENTS As Integer = 1 Private Const _UNKNOWN_EXCEPTION As Integer = 2 Private Const _NUM_ARGUMENTS As Integer = 2 Private Const _PAGE_SIZE As Integer = 16384 Private Const _LINES_PER_PAGE As Integer = 512 Private Const _BYTES_PER_LINE As Integer = 32 #End Region #Region " Public Methods " Public Shared Sub Main(ByVal args() As String) 'Validate correct number of arguments If args.Length <> _NUM_ARGUMENTS Then _DisplayUsage(_WRONG_NUM_ARGUMENTS, "Invalid number of arguments!") Exit Sub End If Try 'Open ROM file and read everything in Dim page(_PAGE_SIZE - 1) As Byte Dim imageFile As New IO.FileStream(args(0), IO.FileMode.Open, IO.FileAccess.Read) Dim rawData As New Dictionary(Of Integer, Object) Dim pages() As Integer = {0, 1, 2, 3, 4, 5, 6, 7, &H18, &H19, &H1A, &H1B, &H1C, &H1D} For i As Integer = 0 To pages.Length - 1 imageFile.Seek(pages(i) * _PAGE_SIZE, IO.SeekOrigin.Begin) imageFile.Read(page, 0, _PAGE_SIZE) rawData.Add(pages(i), page.Clone()) Next 'Write 73U file header Dim upgradeFile As New IO.FileStream(args(1), IO.FileMode.Create) Dim headerData() As Byte = {&H2A, &H2A, &H54, &H49, &H46, &H4C, &H2A, &H2A, &H1, &H10, &H1, _ &H88, &H1, &H12, &H20, &H6, &H8, &H62, &H61, &H73, &H65, &H63, &H6F, &H64, &H65, _ &H0, &H0, &H0, &H0, &H0, &H0, &H0, &H0, &H0, &H0, &H0, &H0, &H0, &H0, &H0, _ &H0, &H0, &H0, &H0, &H0, &H0, &H0, &H0, &H74, &H23, &H0, &H0, &H0, &H0, &H0, &H0, _ &H0, &H0, &H0, &H0, &H0, &H0, &H0, &H0, &H0, &H0, &H0, &H0, &H0, &H0, &H0, _ &H0, &H0, &H0, &H0, &H0, &H0, &H0} upgradeFile.Write(headerData, 0, headerData.Length) 'Write dummy Intel Hex header Dim header As String = ":17000000800F0003801C80110280210180319180A0807F00038000A2" & Environment.NewLine upgradeFile.Write(System.Text.ASCIIEncoding.ASCII.GetBytes(header), 0, header.Length) header = ":00000001FF" & Environment.NewLine upgradeFile.Write(System.Text.ASCIIEncoding.ASCII.GetBytes(header), 0, header.Length) 'Write each page out Dim pageHeaderBase As String = ":0200000200" Dim pageHeader As String Dim checksum As Integer For Each pageData As KeyValuePair(Of Integer, Object) In rawData pageHeader = pageHeaderBase & pageData.Key.ToString("X2") & (&HFC - pageData.Key).ToString("X2") & Environment.NewLine upgradeFile.Write(System.Text.ASCIIEncoding.ASCII.GetBytes(pageHeader), 0, pageHeader.Length) For i As Integer = 0 To _LINES_PER_PAGE - 1 Dim line As String Dim address As Integer = i * _BYTES_PER_LINE If pageData.Key <> 0 Then address = address Or &H4000 checksum = _BYTES_PER_LINE line = ":20" & address.ToString("X4") & "00" checksum += address And &HFF checksum += ((address And &HFF00) >> 8) And &HFF For j As Integer = 0 To _BYTES_PER_LINE - 1 Dim data As Byte = DirectCast(pageData.Value, Byte())((address And &H3FFF) + j) line &= data.ToString("X2") checksum += data Next line &= (((Not (checksum And &HFF) And &HFF) + 1) And &HFF).ToString("X2") & Environment.NewLine upgradeFile.Write(System.Text.ASCIIEncoding.ASCII.GetBytes(line), 0, line.Length) Next Next 'Write dummy Intel Hex footer Dim footer As String = ":00000001FF" & Environment.NewLine & _ ":20000000020D40CF7436A89AE6DFF5F8D55F0CD2495E5DA2FFA73BFF21245857C90D73AFA0" & Environment.NewLine & _ ":20002000BC0B570877026BC4DBE4470F1BC3E96EE297A60C3A281135663791C5615B28DB23" & Environment.NewLine & _ ":20004000BA6951FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF49" & Environment.NewLine & _ ":00000001FF -- CONVERT 2.6 --" upgradeFile.Write(System.Text.ASCIIEncoding.ASCII.GetBytes(footer), 0, footer.Length) 'Close 73U file upgradeFile.Close() 'Re-open 73U file and write correct version, data length, and checksum Dim info As New IO.FileInfo(args(1)) upgradeFile = New IO.FileStream(args(1), IO.FileMode.Open) upgradeFile.Seek(&H4A, IO.SeekOrigin.Begin) upgradeFile.Write(BitConverter.GetBytes(info.Length), 0, 4) For i As Integer = 0 To Convert.ToInt32(info.Length) - &H4E checksum += upgradeFile.ReadByte() Next upgradeFile.Write(BitConverter.GetBytes(Convert.ToUInt16(checksum And &HFFFF)), 0, 2) upgradeFile.Seek(&H8, IO.SeekOrigin.Begin) Dim temp As String temp = Convert.ToChar(DirectCast(rawData(0), Byte())(&H64)) upgradeFile.WriteByte(Convert.ToByte(temp)) temp = Convert.ToChar(DirectCast(rawData(0), Byte())(&H66)) & Convert.ToChar(DirectCast(rawData(0), Byte())(&H67)) upgradeFile.WriteByte(Convert.ToByte(temp)) upgradeFile.Close() Catch ex As ConvertException _DisplayUsage(ex.ExitCode, ex.Message) Exit Sub Catch ex As Exception _DisplayUsage(_UNKNOWN_EXCEPTION, ex.Message) Exit Sub End Try End Sub #End Region #Region " Private Methods " Private Shared Sub _DisplayUsage(ByVal exitCode As Integer, ByVal msg As String) Console.WriteLine("ConvertROM " & My.Application.Info.Version.ToString(3)) Console.WriteLine("----------------------------------------------------") Console.WriteLine("Usage: ConvertROM ") Console.WriteLine("Converts a TI-73 ROM image to a 73U OS upgrade file.") Console.WriteLine() Console.WriteLine("Examples: ConvertROM image.rom upgrade.73u") Console.WriteLine() Console.Write("ERROR: " & msg) Environment.ExitCode = exitCode End Sub #End Region End Class