X-Git-Url: https://git.gag.com/?p=fw%2Faltos;a=blobdiff_plain;f=altoslib%2FAltosHexfile.java;h=609d1bcb366f9f3ae747633f1f0a51e8894d04ad;hp=fb036d0c1944b4445a9732a42d1ddddfdcedbe87;hb=3c48b0fd504ae97dfaca91d2064b5822ca6e1344;hpb=7041c386cdf37716f8daf0bc1a9204db620e3de9 diff --git a/altoslib/AltosHexfile.java b/altoslib/AltosHexfile.java index fb036d0c..609d1bcb 100644 --- a/altoslib/AltosHexfile.java +++ b/altoslib/AltosHexfile.java @@ -3,7 +3,8 @@ * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License. + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of @@ -15,7 +16,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_9; +package org.altusmetrum.altoslib_13; import java.io.*; import java.util.LinkedList; @@ -45,7 +46,7 @@ class HexFileInputStream extends PushbackInputStream { } class HexRecord implements Comparable { - public int address; + public long address; public int type; public byte checksum; public byte[] data; @@ -109,7 +110,14 @@ class HexRecord implements Comparable { public int compareTo(Object other) { HexRecord o = (HexRecord) other; - return address - o.address; + + long diff = address - o.address; + + if (diff > 0) + return 1; + if (diff < 0) + return -1; + return 0; } public String toString() { @@ -118,8 +126,8 @@ class HexRecord implements Comparable { public HexRecord(HexFileInputStream input) throws IOException, EOFException { read_state state = read_state.marker; - int nhexbytes = 0; - int hex = 0; + long nhexbytes = 0; + long hex = 0; int ndata = 0; byte got_checksum; @@ -153,7 +161,7 @@ class HexRecord implements Comparable { switch (state) { case length: - data = new byte[hex]; + data = new byte[(int) hex]; state = read_state.address; nhexbytes = 4; break; @@ -163,7 +171,7 @@ class HexRecord implements Comparable { nhexbytes = 2; break; case type: - type = hex; + type = (int) hex; if (data.length > 0) state = read_state.data; else @@ -210,12 +218,21 @@ class HexRecord implements Comparable { } public class AltosHexfile { - public int address; + public long address; + public long max_address; public byte[] data; LinkedList symlist = new LinkedList(); - public byte get_byte(int a) { - return data[a - address]; + public byte get_byte(long a) { + return data[(int) (a - address)]; + } + + public int get_u8(long a) { + return ((int) get_byte(a)) & 0xff; + } + + public int get_u16(long a) { + return get_u8(a) | (get_u8(a+1) << 8); } /* CC1111-based products have the romconfig stuff located @@ -236,6 +253,15 @@ public class AltosHexfile { new AltosHexsym("ao_usb_descriptors", ao_usb_descriptors_addr) }; + static final int AO_USB_DESC_DEVICE = 1; + static final int AO_USB_DESC_STRING = 3; + + static final int AO_ROMCONFIG_VERSION_INDEX = 0; + static final int AO_ROMCONFIG_CHECK_INDEX = 1; + static final int AO_SERIAL_NUMBER_INDEX = 2; + static final int AO_RADIO_CAL_INDEX = 3; + static final int AO_USB_DESCRIPTORS_INDEX = 4; + private void add_cc_symbols() { for (int i = 0; i < cc_symbols.length; i++) symlist.add(cc_symbols[i]); @@ -261,6 +287,90 @@ public class AltosHexfile { return null; } + private long find_usb_descriptors() { + AltosHexsym usb_descriptors = lookup_symbol("ao_usb_descriptors"); + long a; + + if (usb_descriptors == null) + return -1; + + try { + /* Walk the descriptors looking for the device */ + a = usb_descriptors.address; + while (get_u8(a+1) != AO_USB_DESC_DEVICE) { + int delta = get_u8(a); + a += delta; + if (delta == 0 || a >= max_address) + return -1; + } + return a; + } catch (ArrayIndexOutOfBoundsException ae) { + return -1; + } + } + + public AltosUsbId find_usb_id() { + long a = find_usb_descriptors(); + + if (a == -1) + return null; + + /* Walk the descriptors looking for the device */ + while (get_u8(a+1) != AO_USB_DESC_DEVICE) { + int delta = get_u8(a); + a += delta; + if (delta == 0 || a >= max_address) + return null; + } + + return new AltosUsbId(get_u16(a + 8), + get_u16(a + 10)); + } + + public String find_usb_product() { + long a = find_usb_descriptors(); + int num_strings; + int product_string; + + if (a == -1) + return null; + + product_string = get_u8(a+15); + + /* Walk the descriptors looking for the device */ + num_strings = 0; + for (;;) { + if (get_u8(a+1) == AO_USB_DESC_STRING) { + ++num_strings; + if (num_strings == product_string + 1) + break; + } + + int delta = get_u8(a); + a += delta; + if (delta == 0 || a >= max_address) + return null; + } + + int product_len = get_u8(a); + + if (product_len <= 0) + return null; + + String product = ""; + + for (int i = 0; i < product_len - 2; i += 2) { + int c = get_u16(a + 2 + i); + + product += Character.toString((char) c); + } + + if (AltosLink.debug) + System.out.printf("product %s\n", product); + + return product; + } + private String make_string(byte[] data, int start, int length) { String s = ""; for (int i = 0; i < length; i++) @@ -268,9 +378,10 @@ public class AltosHexfile { return s; } - public AltosHexfile(byte[] bytes, int offset) { + public AltosHexfile(byte[] bytes, long offset) { data = bytes; address = offset; + max_address = address + bytes.length; } public AltosHexfile(FileInputStream file) throws IOException { @@ -334,7 +445,8 @@ public class AltosHexfile { throw new IOException("hex file too large"); data = new byte[(int) (bound - base)]; - address = (int) base; + address = base; + max_address = bound; Arrays.fill(data, (byte) 0xff); /* Paint the records into the new array */ @@ -365,4 +477,4 @@ public class AltosHexfile { } } } -} \ No newline at end of file +}