601

(42 odpowiedzi, napisanych Bałagan)

saulot: Pytasz o jakich dokumentach mówię? Odpowiadam, że chociażby o jedynym normatywnym, czyli "Standard for Programming Language C++" generowanym przez WG21. Zerknij sobie tu. Ostatni working draft sprzed standardu C++11 ma numer N3242. Jeśli do niego zerkniesz, to zauważysz, że na 1300 stron, 400 jest o języku, a 900 o bibliotece. Najbardziej kluczowym aspektem tej biblioteki jest nacisk na programowanie generyczne (stąd np podział na kontenery i algorytmy). Można napisać niezależne biblioteki podążające tym tropem, czego przykładem jest np boost. Qt jednak skrzętnie od wielu lat ignoruje kierunek, w którym rozwija się C++ opierając swój framework na zupełnie innych założeniach bardziej zbliżonych do języków zarządzanych, a nawet dynamicznych, które są sprzeczne z inherentną statycznością C++.

Stąd moje twierdzenie, że Qt nie używa standardowego C++.

602

(42 odpowiedzi, napisanych Bałagan)

C++ to język + biblioteka standardowa. Wystarczy zerknąć do dokumentów standaryzacyjnych. QT to nie biblioteka C++, tylko framework zbudowany na bazie języka C++ zastępujący jego bibliotekę standardową na wzór frameworków Javy czy .NET. Jest przy tym bardzo wirusowy starając się dostarczać swoje rozwiązania na każdy problem, które są niekompatybilne z tymi ustandaryzowanymi. Do kogoś zaczynającego od początku, to jest fajne, ale dla kogoś, kto zna C++ korzystanie z QT przyprawia o wymioty.

603

(42 odpowiedzi, napisanych Bałagan)

Tak całkiem teoretycznie to nie jest takie środowiska wcale potrzebne. Program napisany pod Visual Studio używający np Qt po przekompilowaniu na linuksa powinien po prostu zadziałać, o ile napisało się go oczywiście dostatecznie przenośnie, ale Qt jest frameworkiem, który dostarcza praktycznie wszystko, więc jak ktoś chce, to nie musi poza niego wychodzić.

604

(22 odpowiedzi, napisanych Programowanie - 8 bit)

Osobno można ustawiać szerokość akumulatora oraz rejestrów indeksowych. To działa tylko w trybie natywnym 65c816.

605

(22 odpowiedzi, napisanych Programowanie - 8 bit)

Używam tych makr. Tutaj akurat chodzi o hint dla asemblera (deklarację) jaka jest spodziewana szerokość rejestrów w danym miejscu, tak, aby asembler mógł wygenerować błąd, jeśli obliczona przez niego szerokość będzie różna, czyli np. (w pseudokodzie):

regA 16  ;rozkaz przełączający akumulator na 16 bitów
.a8 ; deklaracja, że w tym miejscu akumulator ma rozmiar 8 bitów -> ERROR

albo

.proc Prodecura
.a16 ;deklaracja 16-bitowego akumulatora.
...
.endp

...

.a8   ;deklaracja 8-bitowego akumulatora.
jsr Procedura  ;skok do procedury z kontekstu 8-bitowego akumulatora.
                Procedura deklaruje szerokość na 16-btów -> ERROR
...

606

(22 odpowiedzi, napisanych Programowanie - 8 bit)

Wiedziałem, że gdzieś widziałem już coś takiego, tylko nie wiedziałem gdzie :)

Ej. A może koledze chodzi po prostu o wgranie programu w BASICu (który ma na PC w postaci pliku tekstowego) do atari, żeby pojawił się w tam jako program (czyli LIST, RUN... te sprawy)?

608

(22 odpowiedzi, napisanych Programowanie - 8 bit)

Jeszcze tego nie próbowałem. Sprawdzę, jak to działa.

Nie wiem jak dokładnie masz zrealizowane te śledzenie, bo to nie jest trywialna sprawa, ale dość silnym mechanizmem mogłoby być śledzenie szerokości rejestrów na poziomie procedur (teraz trochę pofantazjuję):
- W samej deklaracji procedury, lub jako pierwszy pseudorozkaz (coś ala .a8x16, .a16x8 itd) mogłaby być deklaracja jaka szerokość rejestrów obowiązuje na wejściu.
- Wewnątrz procedury byłoby normalne śledzenie szerokości zaczynając od zadeklarowanego stanu początkowego.
- błędy byłyby generowane przy próbie użycia innej szerokości (tak jak już masz to zaimplementowane) ORAZ podczas próby wywołania procedury, która ma zadeklarowaną inną wstępną szerokość niż aktualna szerokość w miejscu wywołania.

Wyobrażam sobie, że jest to osiągalne, bo można byłoby wywołanie procedury traktować jako instrukcję wrażliwą na szerokość argumentu (taki lda #) z taką szerokością, jaka jest w danej procedurze deklaracja.

609

(22 odpowiedzi, napisanych Programowanie - 8 bit)

O! Super! Wiedziałem TeBe, że można na Ciebie liczyć :)

Jak zrobi się opt h- (w przykładzie jest przypadkowo h+), to generowany plik jest identyczny jak z AlfAssemblera.

610

(22 odpowiedzi, napisanych Programowanie - 8 bit)

Faktycznie. Na zrobienie  lda.w #( label & $ffff ) nie wpadłem. Zastosuję.

Na ORG powyżej $FFFF można mieć dwa sposoby:

  • Zezwalać na takiego orga tylko przy opt h-

  • Zastosować nagłówek AlfAssemblera zaproponowany przez Draco, czyli $FBFB

611

(22 odpowiedzi, napisanych Programowanie - 8 bit)

OK. O tym nie myślałem. Nie wiem czy stosunek trudność do zysków jest opłacalny, żeby się za to zabrać. A format COMa position-independent, którego trzeba po prostu załadować pod dowolny adres, potrzebuje przynajmniej nagłówka sygnalizującego niezależność od adresu oraz długość bloku. Czegoś takiego nie ma, bo na 6502 nie było to sensowne, a na 65c816 już tak.

612

(22 odpowiedzi, napisanych Programowanie - 8 bit)

Draco: Format ładowania w dowolne miejsce mógłby być przydatny, gdyż kod 816-tki może być relokowalny bez żadnej ingerencji (aczkolwiek programowanie kodu relokowalnego jest trochę uciążliwe). Trzeba byłoby tylko wymyślić sposób na powiadamianie kodu, gdzie zostały załadowane jego dane (coś a'la bloki RUN i INIT?).

Trzeba utworzyć jakiś komitet standaryzacyjny i podyskutować nad takimi rzeczami przed konkretną implementacją w konkretnych systemach :)


TeBe: Te fragmenty w dokumentacji znam, ale nie tłumaczą one np. jak otrzymać 16 młodszych bitów z adresu 24-bitowego.

613

(22 odpowiedzi, napisanych Programowanie - 8 bit)

Operatory < ! > wydają się sensowne. Asembler powinien tylko wypisywać warning gdy żaden operator nie jest użyty (programista oczywiście może wiedzieć o co mu chodzi, ale tutaj wg mnie lepiej być dosłownym, bo to zmniejsza okazję do błędu).

Mads ma 24 bitowe adresowanie, nie potrafi tylko ustawić adresu asemblacji na adres spoza banku zerowego. Nie potrafi tego ani dyrektywa ORG, ani .SEGDEF. Odkryłem jednak, że potrafi to blok .PROC, któremu można ustawić dowolny 24-bitowy adres. Gdy już myślałem, że jest to rozwiązanie, okazało się, że z 24-bitowego adresu nie można (albo raczej nie potrafię) wyciągnąć 16 bitowego offsetu w segmencie i taki kod się nie kompiluje:

    opt h- c+

    org $0000

    .proc test, [$010000 + *]
label    lda.w #label
    .endp
label    lda.w #label
test.asm (6) ERROR: Value out of range

O nagłówku $FBFB dobrze wiedzieć. Szukałem czegoś takiego. Sprawdziłem i działa poprzez dodanie nagłówka z dwoma 24-bitowymi adresami do każdego bloku. Aczkolwiek wydaje mi się, że adres końca wystarczyłby 16 bitowy, ale to już szczegół.

Co do asemblerów, to w grę wchodzą tylko cross-assemblery (mam już środowisko do budowania itd). Co jest w madsie, a niema tego (nie znalazłem) nigdzie indziej, to idea procedur (bloki .PROC), która po podrasowaniu bardzo dobrze może wpisywać się w schemat programowania 65c816. Blok .PROC grupuje fragment kodu w logiczną całość z lokalnymi etykietami, a przekazywanie parametrów może być zrealizowane za pomocą stosu 65c816. Np. "engine" do deklarowania parametrów procedury mógłby służyć do śledzenia zawartości stosu. Np takie procedury mogłyby być tożsame:

    .proc sum1 ( .BYTE par1,par2 )
    lda pra1
    clc
    adc par2
    rts
    .endp


    .proc sum2
    lda 2,s
    clc
    adc 1,s
    rts
    .endp

Dodatkowo procedury można byłoby wzbogacić o chociażby specyfikację stanu procesora jaki w niej obowiązuje (długość rejestrów) i asembler mógłby śledzić czy stan jest spójny pomiędzy wywołaniami (niby nie daje to żadnych gwarancji, ale pomaga przy zachowaniu konwencji, no i tak, wiem, że mechanizmy śledzenia to nic nowego :)).

614

(22 odpowiedzi, napisanych Programowanie - 8 bit)

Nie było to rozgłaszane, ale nie jest tajemnicą, że piszę diagnostykę i firmware dla pasiowej karty turbo. Przez te kilka tygodni zdążyłem się przekonać, że 65c816 w pełnej przestrzeni adresowej jest diabelnie trudnym procesorem do oprogramowania w asemblerze. Główną trudność stanowi jego kontekstowość, o której trzeba pamiętać pisząc każdy fragment kodu:

  • w zależności od stanu procesora rozkazy natychmiastowe mogą łykać 8 lub 16 bitów operandu,

  • w zależności od okoliczności ten sam adres logiczny może wskazywać na rózne adresy fizyczne, np. lda $00 to adresowanie zerostronicowe (direct) więc adres fizyczny to D + $00, lub adresowanie absolutne, które adresuje pamięć w banku danych (niekoniecznie tożsamym z bankiem zerowym) oraz adresowanie długie, które to dopiero zaadresuje komórkę o fizycznym adresie $000000.

  • "strona zerowa" jest ruchoma i indeksowanie 16-bitowe może trafić gdzie indziej niż to wynika z kodu, bo $00,X nie wskazuje na adres X, tylko D + X.

  • równocześnie można operować na trzech różnych bankach: zerowym, banku danych, banku programu, przez co takie sta *+4 nie zawsze trafia w operand następnego rozkazu.

O co zatem mi chodzi? O to, że składnia asemblera 6502 ma się nijak do programowania 65c816 i straciłem sumarycznie wiele godzin z powodu błędów wynikłych z nawyku programowania 6502. O wiele za dużo, szczególnie, że w części z nich z pewnocią mógłby pomóc asembler. Założyłem ten wątek, bo nie jestem 100% pewny jakie rozwiązanie byłoby najlepsze i może ktoś będzie miał jakieś fajne pomysły i spostrzeżenia.

Skrajnym rozwiązaniem byłoby zaproponowanie składni niekompatybilnej z dotychczasową, ale wadą byłaby konieczność nauki asemblera od nowa. Rozwiązaniem pośrednim i najprostszym mógłby być jakiś tryb "strict" istniejącej składni. Najważniejsze co byłoby niezbędne w tym trybie to wyłączenie optymalizacji długości operandu oraz obligatoryjne specyfikowanie długości. Byłoby więcej pisania, ale to zdecydowanie mniejsze zło od głupich pomyłek, bo przecież każdy z tych rozkazów robi coś innego:

0000 A5 00           lda.b 0
0002 AD 00 00        lda.w 0
0005 AF 00 00 00     lda.l 0

0009 A9 00           lda.b #0
000B A9 00 00        lda.w #0

i przy braku specyfikacji długości w zależności od tego jaki operand wpadnie to wygeneruje się inny rozkaz.


Następna rzecz, której brakuje mi w madsie, to możliwość nadawania adresu asemblacji poza bankiem zerowym. ORG przyjmuje tylko adres z przedziału $0000 do $ffff i napisanie kodu dedykowanego bankowi np $f0 nastręcza niemałych trudności (kilka godzin szukałem błędu, którym był skok jsl, który trafiał do banku zerowego).

To nie rozwiązuje wszystkich problemów, ale przynajmniej te najważniejsze.

Ogólnie spostrzeżenia mam takie, że karta turbo z 65c816 i 16 MB RAMu to już nie atari ;)
Jak widać programuje się to zupełnie inaczej i daje zupełnie inne możliwości. Pamięć atari w banku zerowym może być traktowana coś a la pamięć CHIP w amigach, i opłaca się go używać tylko do pamięci ekranu a kod i dane można trzymać wyżej, ale to wymaga szerokiej infrastruktury w postaci formatu plików wykonywalnych dedykowanych wysokim bankom i systemu operacyjnego, który to wszystko obsłuży.
No i dość dobrze pasowałby tu kompilator wysokiego poziomu, bo 816 ma tryby adresowania wspierające pracę z kompilatorami (np., adresowanie względem wskaźnika stosu) i jak ma się tak dużo pamięci, to nie trzeba optymalizować na rozmiar.

615

(33 odpowiedzi, napisanych Bałagan)

Poużywałem trochę tego Debut Video Capture i jest całkiem niezły, ale dziś zauważyłem kluczową wadę: zaczął mnie informować, że expiruje za next few days :(
Myślałem, że jest płatny tylko do nagrywania, a na podgląd będzie pozwalał. Jak zgaśnie mi całkiem, to będę musiał wrócić do VirtualDuba, a szkoda.

616

(58 odpowiedzi, napisanych Bałagan)

Skojarzyło mi się,  że serwisy typu kokos.pl oferują tego typu usługi.

617

(42 odpowiedzi, napisanych Bałagan)

Póki co namierzyłem tę stronę, ale sterowników z niej nie próbowałem: http://www.sabrent.com/category/tv-vide … USB-AVCPT/
Jakiś facet z forum MS polecał na Win 7 x64 konkretnie ten: http://www.sabrent.com/drivers/USB-AVCP … r_Win7.zip

618

(42 odpowiedzi, napisanych Bałagan)

Ja też mam "Video DVR" ale niestety sterowniki też ściągałem z internetu i nie mam pojęcia skąd, a instalki już nie mam. Ale pamiętam, że nie szukałem długo, więc na pewno już je próbowałeś. Jakby ktoś miał pomysł jak sprawdzić jaki mam dla tego urządzenia zainstalowany sterownik, to mógłbym sprawdzić, bo mi się nie udało wyciągnąć żadnych sensownych informacji.

619

(42 odpowiedzi, napisanych Bałagan)

Powód musi być inny, bo ja używam przez SVideo pod Win7 64bit i mam normalnie kolor.

620

(33 odpowiedzi, napisanych Bałagan)

Ja mam i używam dokładnie tego grabbera z linków cypriana i pilat23. To prawda, że kable muszą być dobre, bo wychodzą wszystkie syfy. Poza tym na jakość nie narzekam.
Jedyny problem z jakim się borykam to odpowiedni player pod windę, który potrafi przechwytywać sygnał z tego urządzenia i wyświetlać. Media player classic nie potrafi zapamiętać ustawień i ciągle trzeba konfigurować na nowo. VLC da się odpalić z command line'a z wybranymi ustawieniami, ale nie potrafię w nim wyłączyć cachowania i mam pół sekundy (jeśli nie więcej) opóźnienia. W tej chwili używam Virtual Duba, ale nie jest on do tego zadania zbyt user friendly. Jeśli ktoś miałby namiar na dobry program, byłbym wdzięczny.

621

(2 odpowiedzi, napisanych Sprzęt - 8bit)

Dzięki za odpowiedź.

Rozebrałem drugą stronę. Mam nadzieję, że po złożeniu będzie działać.

SIO2PC


Niebieski jest już przylutowany do pinu 5 (na zdjęciu niestety nie widać tego dobrze). W konsternację wprowadziło mnie to, że czerwony jest przylutowany do 8., a nie do 9. tak jak na schematach.
Udało mi się jednak porozmawiać z Pasiem i on stwierdził, że mam wersję CTS, stąd pin 8, a kabel żółty, tak jak mówiłeś, powinien być przylutowany do pinu 2.

Poproszę kolegę z pracy, żeby zrobił mi to tak jak należy, żeby znowu się nie rozwaliło.

622

(2 odpowiedzi, napisanych Sprzęt - 8bit)

Oderwał mi się kabelek w SIO2PC. Z lutowania jestem zero (nawet nie mam lutownicy) ale jutro w pracy jakiś kolega może by mi przylutował. Kwestia jest tylko taka, że nie jestem pewien gdzie, bo nawet nie wiem jaka to wersja SIO2PC.

Załączam zdjęcie. Czy jest ktoś w stanie na jego podstawie określić gdzie należy przylutować żółty kabelek? Cyna jest na pinach 2,6 i 8.

SIO2PC

623

(644 odpowiedzi, napisanych Programowanie - 8 bit)

6502/6502C różnią się na tyle niewiele, że różnica w nielegalach powinna być wg mnie tylko na poziomie rozkazów niestabilnych, czyli zbierających śmieci z szyny. Specyfika WARów polega na utracie poczucia czasu, bo po 7 cyklu urywa im się film ;) i nie ma możliwości, żeby któryś przeszedł do następnego rozkazu. Do pamięci nigdy nic nie zapisują, kwestia tylko, czy nie modyfikują żadnych rejestrów. Symulator pokazuje, że nie, ale nie mamy pewności nieistnienia po drodze żadnych "efektów szynowych". Potrzebne byłyby albo wnikliwe testy w dziczy z podmienionym ROMem, żeby przechwycić oryginalny RESET, albo mądrzejszy symulator potrafiący wykryć niestabilności - wg mnie jest to możliwe na poziomie symulacji.

Ogólnie tylko żartuję sobie z arbitralnego podziału STABILNE / NIESTABILNE i odmowie nadania stabilnego statusu rozkazom, które u nikogo nie zrobiły nigdy nic innego, jak zaczekanie na RESET. Jestem przekonany, że da się to rozstrzygnąć za pomocą odpowiedniego symulatora (poprzez wykrycie "zapisów" na wewnętrzną szynę z kilku źródeł), ale gra nie jest warta świeczki.

624

(644 odpowiedzi, napisanych Programowanie - 8 bit)

Ta strona zawiera symulator, nie emulator. Zacytowałem ją gwoli pokazania, że nie ma nic magicznego w teście, który wykaże, że te rozkazy są stabilne i program na prawdziwym atari pokaże ci ten sam efekt jaki można zaobserwować w symulatorze, musiałby być tylko "interaktywny", bo wymagałby wielokrotnego naciskania RESET.

625

(644 odpowiedzi, napisanych Programowanie - 8 bit)

Kiedy to jasne. Zobacz sobie tę symulację. Zmieniam tu parę rejestrów, odpalam WARa o kodzie $02, a po pewnym czasie resetuję procesor powtarzając ten sam kod. Jak widać ten WAR (i wg mnie wszystkie inne, ale możesz sobie sprawdzić) nie zmienia zawartości żadnych rejestrów, ani nie zapisuje nic do pamięci (rw jest zawsze 1). RESET ustawia tylko I i przesuwa stos i widzimy, że żadne inne rejestry się nie zmieniły. Możesz trywialnie odpalić podobny kod na prawdziwym atari i uzyskasz ten sam efekt.

Jak widzisz, można sprawdzić jak działa, a działa bardzo deterministycznie i dokładnie wiadomo co dzieje się z rejestrami i pamięcią, więc nie uważam, jakoby był to rozkaz niestabilny. Bądź konsekwentny i zrób go na zielono. Niefortunną nazwę już przeboleję, ale rzekoma niestabilność jest dla tej rodziny rozkazów krzywdząca.