AspeQt w Google Play Store.

Wydaje mi się, że ludzie są raczej niechętni do instalowania softu na Androida poza sklepem Google, z tego też powodu pomyślałem: raz kozie śmierć! I założyłem sobie konto w Google Play Store. Od dzisiaj AspeQt jest teraz również dostępny tą pobłogosławioną przez Google drogą.

Screenshot_2015-10-16-01-07-26

AspeQt dla Windows.

Piętnaście emulowanych napędów w AspeQt to było dla mnie zdecydowanie za dużo 🙂 więc „zandroidyzowałem” plik projektu z repo dla Androida i wydzieliłem co androidowe, dzięki czemu mój fork AspeQt dla Antka kompiluje się też pod Windows i pod Linuksem. Obsługa portu odbywa się wtedy przez standardowy moduł serialport-{win32,linux}.cpp. Przy okazji poprawiłem kodowanie znaków, które w AspeQt pod Windows było skopane od dawna:

AspeQt_WindowsBinarka dla Windows z wymaganymi bibliotekami tutaj.

winandroidlinux

AspeQt na Androidzie.

Update: AspeQT na Androida jest dostępny w Google Play.

Jak niektórzy czytelnicy atarowych forów pewnie zauważyli, udało się. AspeQt działa na moich „Antkach” (4.2.2 Jelly Bean i 4.4.2 Kitkat).

Nie obyło się bez przygód. Z obsługą Kitkata miałem problem wynikający z dziwnego podejścia producentów lub ich nieświadomości: dostałem ostatnio od operatora jako nowy klient, bardzo fajny telefon: Kazam Tornado 348. Pod względem jakość/cena, polecam każdemu. Okazało się jednak, że tenże Kazam obsługuje OTG, czyli mogę sobie podłączyć np. pendrive, ale już USB Host na nim nie działa jak trzeba (pewnie jest nieskonfigurowany, a ja go rootować nie mam zamiaru). I cały czas, o ja głupi, myślałem, że to wina sterownika ftd2xx od FTDI, lub też zmian w KitKacie związanych z obsługą tzw. BroadcastReceiverów.

Jak widać powyżej na zupełnie budżetowym Kazam 345, wszystko śmiga aż miło (swoją drogą na prawdę fajny telefon, ale jakościowo Tornado vs Thunder dzieli ogromna przepaść). Support Kazam obiecał zająć się tematem. Może spodobało im się Atari…

Piszę to dlatego, że użytkownicy powinni się buntować. Dlaczego jeżeli sprzętowo coś jest dostępne, celowo pozbawiać użytkownika możliwości korzystania z tego? Bo co? Bo podłączy sobie przez USB klawiaturę/głośniki/kamerę dowolnego producenta? Paradoksalnie, tanie produkty, jak np. mój Lark FreeMe X2 nie mają z tym problemu. Ale już np. Samsung S5 mini, którego mam z pracy USB nie obsługuje wcale. To nic, że kosztuje krocie…

Przed AspeQT na Androidzie jeszcze daleka droga:

  • Muszę poprawić GUI, żeby dało się go obsłużyć wygodnie i na małym i na dużym ekranie.
  • Okno wyboru pliku i katalogu to w Qt5 na Androida jakaś masakra. Trzeba będzie poeksperymentować z dostępnymi natywnymi bibliotekami, które tą funkcjonalność oferują i obsłużyć to przez JNI.
  • Kontrola przepływu i prędkość transmisji, tego póki co się najbardziej obawiam. Póki co ustawiam FT_FLOW_NONE i prędkość na 19200. DSR nie chce działać, a po ustawieniu prędkości powyżej 19200 bez kontroli przepływu skutkuje odczytem bzdurnych danych.

Ale nic na siłę, wszystko w swoim czasie ;).

Dla zainteresowanych repo na github:

https://github.com/greblus/aspeqt

Apka poniżej (pod tym linkiem wrzucam najnowsze wersje bez uprzedzenia ale w katalogu android/apk/ zachowuje poprzednie, z datą kompilacji):

https://github.com/greblus/aspeqt/blob/android/android/apk/aspeqt.apk

Aspeqt na github.

Aktualny deweloper Aspeqt pokłócił się z paroma osobami na forum Atari Age i dostał tam bana. W odwecie usunął wszystkie wprowadzone przez niego zmiany od wersji 0.6 do 1.0 i postanowił rozwijać to dalej w zaciszu swojego forum, udostępniając za opłatą. Szkoda.

Wrzuciłem ostatnie udostępione na AAge źródła 1.0.0 preview 6 do repo na Github.

https://github.com/greblus/aspeqt/tree/master

Nie mam jakichś wielkich planów, chciałbym kompilować od czasu do czasu aby działało na aktualnych wersjach bibliotek. Fajnie by było też zrobić nowe gui, bo aktualne jest beznadziejne, zwłaszcza na małych ekranach, ale to w wolnych chwilach.

Pierwszy pomysł jest taki: minimalna geometria okna i dynamiczne dodawanie slotów:

mini_aspeqtUpdate:

Tak sobie niezobowiązująco myślę… Jest port QT5 na Androida: http://doc.qt.io/qt-5/android-support.html muszę się więc zaznajomić z Android NDK. Nawet gdyby trzeba było Gui zrobić od nowa, zdecydowanie jest to do zrobienia.

FTDI też działa: http://www.ftdichip.com/Android.htm (sprawdzałem na tablecie z 4.2.2 i faktycznie, wygląda że to działa out-of-the-box).

Myślę, że przy odrobinie wolnego czasu można by to ze sobą pożenić. Jest w TME nawet FTDI w wersji zintegrowanej z kablem. SIO2PC zmieści się we wtyczce SIO. Dałoby się z tego zrobić coś fajnego ;).

Update: AspeQt na Androida tutaj.

STMint on Mist ;)

tpy0 tpy1

MIST w trybie STEroids, 8MB RAM, Emutos 0.9 (na 0.9.3 nie działa, ale powalczę jeszcze). ST High działa w trybie mono (w color mi się nie udało).

Niestety Tinypy jest trochę powolne, nawet w STEroids. W porównaniu z nim stary Python1.3 z oficjalnej paczki działa super szybko, ale nie poddaje się z próbami kompilacji Micropythona i Pymite (Python-on-chip) ;). Nie ma się co dziwić – w Aranym, który emuluje Falcona z 68040, Python 2.6.4 i Tinypy działają niemal z tą samą prędkością. Różnica STMint vs Freemint/Aranym jest jednak kolosalna: 7.5/0.11 = 68.18 razy wolniej…

timeI teraz chyba najciekawsze spostrzeżenie: Mist w STEroids jest szybszy niż emulowane w Hatari TT@32Mhz. Na kolejnych screenach: TT@8Mhz, TT@16Mhz i TT@32Mhz.TT@8MHzTT@16MHzTT@32MHz

Konwersja ATASCII/ UTF-8.

Na podstawie tablicy konwersji z patcha Mono do libiconv, napisałem skrypt w Pythonie do konwersji do i z ATASCII. Może się komuś przyda :).

#!/usr/bin/python3
import sys

if len(sys.argv) != 3:
    print("Usage:", sys.argv[0], "-u (to unicode) || -a (to atascii)")
    exit(0)

d = {0: 9829, 1: 9500, 2: 9621, 3: 9496, 4: 9508, 5: 9488, 6: 9585, 7: 9586, 8: 9698,
    9: 9623, 10: 9699, 11: 9629, 12: 9624, 13: 9620, 14: 9601, 15: 9622, 16: 9827,
    17: 9484, 18: 9472, 19: 9532, 20: 9679, 21: 9604, 22: 9615, 23: 9516, 24: 9524,
    25: 9612, 26: 9492, 27: 9243, 28: 8593, 29: 8595, 30: 8592, 31: 8594, 32: 32,
    33: 33, 34: 34, 35: 35, 36: 36, 37: 37, 38: 38, 39: 39, 40: 40, 41: 41, 42: 42,
    43: 43, 44: 44, 45: 45, 46: 46, 47: 47, 48: 48, 49: 49, 50: 50, 51: 51, 52: 52,
    53: 53, 54: 54, 55: 55, 56: 56, 57: 57, 58: 58, 59: 59, 60: 60, 61: 61, 62: 62,
    63: 63, 64: 64, 65: 65, 66: 66, 67: 67, 68: 68, 69: 69, 70: 70, 71: 71, 72: 72,
    73: 73, 74: 74, 75: 75, 76: 76, 77: 77, 78: 78, 79: 79, 80: 80, 81: 81, 82: 82,
    83: 83, 84: 84, 85: 85, 86: 86, 87: 87, 88: 88, 89: 89, 90: 90, 91: 91, 92: 92,
    93: 93, 94: 94, 95: 95, 96: 9830, 97: 97, 98: 98, 99: 99, 100: 100, 101: 101,
    102: 102, 103: 103, 104: 104, 105: 105, 106: 106, 107: 107, 108: 108, 109: 109,
    110: 110, 111: 111, 112: 112, 113: 113, 114: 114, 115: 115, 116: 116, 117: 117,
    118: 118, 119: 119, 120: 120, 121: 121, 122: 122, 123: 9824, 124: 124, 125: 8624,
    126: 9664, 127: 9654, 128: 9829, 129: 9500, 130: 9609, 131: 9496, 132: 9508,
    133: 9488, 134: 9585, 135: 9586, 136: 9700, 137: 9627, 138: 9701, 139: 9625,
    140: 9631, 141: 9607, 142: 9601, 143: 9628, 144: 9827, 145: 9484, 146: 9472,
    147: 9532, 148: 9679, 149: 9600, 150: 9615, 151: 9516, 152: 9524, 153: 9616,
    154: 9492, 155: 10, 156: 8593, 157: 8595, 158: 8592, 159: 8594, 160: 9608,
    161: 33, 162: 34, 163: 35, 164: 36, 165: 37, 166: 38, 167: 39, 168: 40, 169: 41,
    170: 42, 171: 43, 172: 44, 173: 45, 174: 46, 175: 47, 176: 48, 177: 49, 178: 50,
    179: 51, 180: 52, 181: 53, 182: 54, 183: 55, 184: 56, 185: 57, 186: 58, 187: 59,
    188: 60, 189: 61, 190: 62, 191: 63, 192: 64, 193: 65, 194: 66, 195: 67, 196: 68,
    197: 69, 198: 70, 199: 71, 200: 72, 201: 73, 202: 74, 203: 75, 204: 76, 205: 77,
    206: 78, 207: 79, 208: 80, 209: 81, 210: 82, 211: 83, 212: 84, 213: 85, 214: 86,
    215: 87, 216: 88, 217: 89, 218: 90, 219: 91, 220: 92, 221: 93, 222: 94, 223: 95,
    224: 9830, 225: 97, 226: 98, 227: 99, 228: 100, 229: 101, 230: 102, 231: 103,
    232: 104, 233: 105, 234: 106, 235: 107, 236: 108, 237: 109, 238: 110, 239: 111,
    240: 112, 241: 113, 242: 114, 243: 115, 244: 116, 245: 117, 246: 118, 247: 119,
    248: 120, 249: 121, 250: 122, 251: 9824, 252: 124, 253: 8624, 254: 9664, 255: 9654}

mode=0

if sys.argv[1] == '-u':
 f = open(sys.argv[2], 'rb')
 output=str()
 mode=1
else:
 f = open(sys.argv[2], 'r', encoding='utf-8')
 output=bytearray()

def overwrite():
  if mode==1:
   f = open(sys.argv[2], 'w', encoding='utf-8')
  else:
   f = open(sys.argv[2], 'bw')
  f.write(output)
  f.close()

lines = f.read()
f.close()

if mode==1:
 for i in lines:
  if i in d:
   output+=chr(d[i])

if mode == 0:
 import collections
 sd = collections.OrderedDict(sorted(d.items()))
 dinv = {}
 for k,v in sd.items():
  if v not in dinv:
   dinv[v] = k
 for i in lines:
  if ord(i) in dinv:
   output.append(dinv[ord(i)])

overwrite()

A tutaj statyczne binarki iconv dla Linuksa i Windows z najnowszym patchem dodającym kodowania:

ATARI ATARIST RISCOS-LATIN1 ATARI8 ATARI8-ATASCII ATARI8-GRAPH ATASCII ATARI8-ATASCII2 ATARI8-INT  ATASCII2 ATARI8-KAREN ATARI8-PL ATARI8-AWP ATARI8-XLENT ATARI8-PANTHER ATARI8-PE ATARI8-CAPEK ATARI8-CZ ATARI8-TCHEKO ZX80 ZX 81 ZX82 ZXSPECTRUM ZX82-PL ZXSPECTRUM-PL PETSCII PETSCII-UC PETSCII-LC CP867 CP895 KAMENICKY  KEYBCS2