atarionline.pl Wydruk z GRAPHICS 8 - Forum Atarum

Jeśli chcesz wziąć udział w dyskusjach na forum - zaloguj się. Jeżeli nie masz loginu - poproś o członkostwo.

  • :
  • :

Vanilla 1.1.4 jest produktem Lussumo. Więcej informacji: Dokumentacja, Forum.

    • 1: CommentAuthorValdghir
    • CommentTime3 Jun 2014 zmieniony
     
    Heloł.

    Orientacja bitowa ekranu w Atari jest pozioma, a drukarek tej firmy - z racji sposobu ułożenia igieł - pionowa.

    Kto mi się dopisze do programiku w Turbo Basic XL (ewentualnie procedurka maszynowa) drukującego zrzut ekranu w trybie Graphics 8?

    Ja mogę tylko zacząć :-)

    10 GRAPHICS 8
    11 OPEN #1,4,0,"D:TEST.PIC"
    12 BGET #1,DPEEK(88),7680:CLOSE #1
    13 --
    14 OPEN #1,8,0,"P:"
    15 REM ustawienie gęstości 9dpi i włączenie druku grafiki
    16 PUT #1;CHR$(27);CHR$(57);CHR$(27);CHR$(65)
    17 REM ilość bajtów do wysłania (320) na przejazd karetki


    A dalej trzeba przekształcone dane: siedem punktów w pionie na bajt od lewej do prawej strony ekranu, następnie kolejne 7 itd do końca obrazu. :-) Dolny punkt to bit 0.

    Kiedyś z trudem napisałem to w QA, ale moja pamięć asemblerowa umarła. Brałem 7 razy po bicie potem ROL i dalej.

    Pewnie są gotowce, ale miło by było tak dla zabawy przetrawić to na nowo od początku do końca :-)
    • 2:
       
      CommentAuthorjhusak
    • CommentTime3 Jun 2014
     
    Zmienna tekstowa 320 bajtów, a następnie lecimy i odczytujemy punkty poziomo ustawiając najpierw bit 0 w kolejnych bajtach zmienej, druga linijka i ustawiamy bit 1 w kolejnych bajtach zmiennej etc.
    I tak 192/7+1 razy, na końcu otrzymamy 4 linijki śmieci, albo obcinamy i nie mamy 3 linijek, albo robimy copy paste i pętlę 0 to 2 a nie 0 to 6.
    • 3: CommentAuthor0xF
    • CommentTime3 Jun 2014 zmieniony
     
    Szybkie to nie będzie:
    FOR Y=0 TO 182 STEP 7
    FOR X=0 TO 319
    G=0
    FOR R=0 TO 6
    LOCATE X,Y+R,C
    G=G+G+C
    NEXT R
    PUT #1,G
    NEXT X
    NEXT Y
    • 4: CommentAuthorValdghir
    • CommentTime3 Jun 2014
     
    Hehe :-) sprawdziłem i prawie działa, lecz nie wiem czemu po pierwszym przebiegu X lecą śmieci.
    • 5:
       
      CommentAuthorjhusak
    • CommentTime3 Jun 2014
     
    Sprawdź, czy nie masz kodu 155 w streamie (kod nowej linii).
    • 6: CommentAuthorValdghir
    • CommentTime4 Jun 2014
     
    Drukarka dostaje po 17 linni dwa bajty ilości danych do przyjęcia (320 bajtów), a przełączenie w tryb graficzny wyłącza wszelkie kody. Ale racja wyprowadzę te dane do pliku do analizy.
    • 7:
       
      CommentAuthorjhusak
    • CommentTime4 Jun 2014 zmieniony
     
    Albote 2 bajty długości danych z linii 17 to ściema i ich nie używaj, albo tak trzeba, i przed każdym wejściem w pętlę X te 2 bajty wyślij (nie testowałem poniższego):
    PUT #1,64:PUT #1,1
    FOR X=0 TO 319
    • 8: CommentAuthorValdghir
    • CommentTime4 Jun 2014
     
    Kuba z tym kodem 155 to pojechałeś :-)

    Bajty wysyłam linii 17, w notacji MSB LSB ale coś mnie podkusiło jednak wstawić na koniec kod 155 i teraz działa lepiej, tzn, drukuje linia za linią - tak jak ma być, z tym, że odnoszę wrażenie jakby po 7 liniach druku następny wchodził lekko na poprzedni. Ale to może być już wina drukarki i jej niedokładnego przesuwu papieru.

    Czy jest możliwie, że polecenie CLOSE dla urządzenia P: wysyła kod 155 przy zamknięciu komunikacji?
    • 9:
       
      CommentAuthorjhusak
    • CommentTime4 Jun 2014 zmieniony
     
    Działa lepiej z returnem, czy bez?
    A to, że zachodzi, to jest normalka. Dokładność tego ustrojstwa to pewnie jakieś 100um.
    • 10: CommentAuthorValdghir
    • CommentTime5 Jun 2014
     
    Działa jak dodałem return (to by nawet było sensowne - powrót karetki), ale wydaje mi się, że CLOSE dla P: też coś wysyła, bo w jakimś programie demo dla drukarki nie ma wysyłki 155 tylko jest CLOSE na końcu pętli.

    Sprawdzę to dzisiaj bo mnie to irytuje.
    • 11: CommentAuthorValdghir
    • CommentTime5 Jun 2014
     
    Ok już wszystko jasne. Żeby wydruk działał poprawnie trzeba OPEN i CLOSE zawrzeć w pętli drukowania 7-bitowej linii lub na końcu linii wysłać PUT #1;

    Druk jest przyjemny - obrazek 320x192 zrzuca się z ekranu, a w tym czasie można wypić całe piwko :-)

    Pora na lekkie przyspieszenie, ktoś ma pomysły ?
    • 12:
       
      CommentAuthorjhusak
    • CommentTime5 Jun 2014 zmieniony
     
    Wolniej pić piwko?

    A tak na poważnie, to procedurka w maszynówce przez usr(). I powrót do mojego pomysłu - z buforkiem 320 bajtów.

    Aby też niezabardzo się błąkać, podałbyś gotowy program drukujący poprawnie :)

    Wtedy było by coś takiego:
    for i=dpeek(88) to dpeek(88)+7680-280 step 280
    a=usr(adr(ml$),i,adr(d$))
    bput #1,adr(d$),320
    n.i


    a ml$ jest tajemniczym przekształcaczem danych.
    • 13:
       
      CommentAuthorjhusak
    • CommentTime5 Jun 2014 zmieniony
     
    Kopiowanie pierwszych dwudziestu bajtów linii 0-6 będzie jakoś tak:
    ldy #0
    b:
    ldx #0
    j:
    asl i,x ; weź lewy skrajny bit do C
    rol a ; włóż go do wyniku na najmłodszy bit
    sta dst+1 ;zapamiętaj dalej A
    txa
    clc
    adc #40 ; idź do następnej linijki
    tax
    dst:
    lda #0
    cpx #24 ; sprawdź, czy się x nie zawinął
    bne j
    and #$7f; wyzeruj bit najstarszy
    sta buf,y ; zapamiętaj w buforze
    iny
    cpy #160
    bne b
    • 14: CommentAuthorValdghir
    • CommentTime6 Jun 2014
     
    No sprawię ten listing jak się odbuduję z softem, bo moja pierwsza przygoda z Ultimate skończyła się skasowaniem całej zawartości SIDE2, ehhhhhh.....
    • 15: CommentAuthorValdghir
    • CommentTime6 Jun 2014
     
    Matko jedyna. Dwa dni walczę z padniętym 800XL z Ultimate, a wyglądało tak: Sparta wstawała kiedy chciała, jak wstała to albo czytał dyski albo nie, co chwile rzygał, że SIO error, błąd zegara, śmieci na ekranie, błędy GTIA - chociaż ten model na 100% miał sprawne, wieszał się bez powodu, wstawał po restarcie, aby potem znowu się powiesić na próbie odczytu przez SIO2PC, za każdym razem coś. Najgorsze, że wyrąbał mi wszystko z SIDE2. Na szczęście zrobiłem kopie jednej z partycji. A okazało się co?

    Zasilacz.
    • 16: CommentAuthorpin
    • CommentTime6 Jun 2014
     
    też miałem podobne rewelacje związane z zasilaniem. Niestety oryginalne zasilacze wieczne nie są ;)
    • 17:
       
      CommentAuthorjhusak
    • CommentTime7 Jun 2014
     
    Tylko że zasilacz padnięty słychać przez głośnik TV. Chyba że się mylę?
    Ile miał napięcia?
    • 18: CommentAuthor0xF
    • CommentTime7 Jun 2014
     
    Wracając do tematu: jak wygląda cały poprawnie drukujący program?
    • 19: CommentAuthorValdghir
    • CommentTime7 Jun 2014 zmieniony
     
    Napięcie miał, ale co jakiś czas szpilka do zera, dopiero na analizatorze wyszło, obecnie podłączyłem ładowarkę USB 2A. Osobiście uważam, że nie ma najmniejszego sensu stosować żadnych fabrycznych zasilaczy ATARI. Wielkie toto, ciężkie, niestabilne, stratne jak cholera. Dużo więcej zrobi współczesny "mikrozasilacz dogniazdkowy" - mały, lekki a po unifikacji kabelka zasilającego można się wpiąć gdziekolwiek do USB.

    A ten programik to postaram się w krótce, acz z racji wyjazdu w teren - tylko na sucho, bez sprawdzania. Niech by mi tylko ktoś napisał co mam klepnąć w tym tutaj edytorze, żeby ładnie listing odseparować jak u Kuby w poście 13.
    • 20: CommentAuthorValdghir
    • CommentTime9 Jun 2014 zmieniony
     
    Sprawdzone, działające:
    0 GRAPHICS 24:P=6
    1 OPEN #%1,4,%0,"D2:MENU.PIC"
    2 BGET #%1,DPEEK(88),7680:CLOSE #%1
    3 ------------------------------
    4 FOR Y=%0 TO 191 STEP 7
    5 IF Y=189 THEN P=%2
    6 OPEN #%1,8,%0,"P:"
    7 PUT #%1;27:PUT #%1;57:PUT #%1;27
    8 PUT #%1;65:PUT #%1;%1:PUT #%1;64
    9 FOR X=%0 TO 319
    10 G=%0
    11 FOR R=%0 TO P
    12 LOCATE X,Y+R,C:G=G+G+C
    13 NEXT R
    14 IF P=%2 THEN G=G*16
    15 PUT #%1;G
    16 NEXT X:CLOSE #%1
    17 NEXT Y:END
    • 21:
       
      CommentAuthorKaz
    • CommentTime9 Jun 2014
     
    Tutaj jest spis znacznikow, ktore mozna uzywac, punkt 6:


    ->link<-
    • 22:
       
      CommentAuthorjhusak
    • CommentTime9 Jun 2014 zmieniony
     
    A próbowałeś nie zamykać urządzenia co linię, tylko drukować 320 bajtów grafiki, następnie "\n" czy odpowiednik, a następnie znowu drukować 320 bajtów grafiki?

    Takie otwieranie i zamykanie co linijkę wydaje się karkołomne.
    --- edit ---
    Widzę, że próbowałeś; IMHO put#1; na końcu linii, czyli LineFeed, jest lepszym rozwiązaniem.

    --- edit ---
    Poradnik użytkownika XL/XE Wojciecha Zientary zawiera w sobie kody sterujące m. in. Atari 1029
    • 23: CommentAuthorValdghir
    • CommentTime11 Jun 2014 zmieniony
     
    0 GRAPHICS 24:P=6
    1 OPEN #%1,4,%0,"D2:MENU.PIC"
    2 BGET #%1,DPEEK(88),7680:CLOSE #%1
    3 OPEN #%1,8,%0,"P:"
    4 ------------------------------
    5 FOR Y=%0 TO 191 STEP 7
    6 IF Y=189 THEN P=%2
    7 PUT #%1;27:PUT #%1;57:PUT #%1;27
    8 PUT #%1;65:PUT #%1;%1:PUT #%1;64
    9 FOR X=%0 TO 319
    10 G=%0
    11 FOR R=%0 TO P
    12 LOCATE X,Y+R,C:G=G+G+C
    13 NEXT R
    14 IF P=%2 THEN G=G*16
    15 PUT #%1;G
    16 NEXT X:PUT #%1;155
    17 NEXT Y:END

    Taki słodki wydruk trwa 7 minut 51 sekund :-)
    Zamiast P: w wierszu 3 można dać nazwę pliku na dysku i spróbować kopiowanie pliku na drukarkę jakimkolwiek kopierem. Przetestowałem na Sparta:
    COPY MENU.PRN,PRN:
    Ślicznie drukuje.

    edit:
    Jak rozebrać liczbę (320) na starszy i młodszy bajt? Męczę się bo nie pamiętam, zakładając, że L=260 to
    INT(L/256) i ... no właśnie ...
    • 24: CommentAuthorseban
    • CommentTime11 Jun 2014
     
    tak niezbyt szybką metodą to:

    HI=INT(L/256)
    LO=INT(256*(L/256-HI)+0.5)
    • 25: CommentAuthormono
    • CommentTime11 Jun 2014 zmieniony
     
    Hmmm. A nie wystarczy tradycyjnie
    HI=INT(L/256):LO=L-HI*256
    ?
    • 26: CommentAuthorseban
    • CommentTime11 Jun 2014 zmieniony
     
    mono... masz rację... skretyniałem na starość ;D modulo mi się zachciało "emulować", i przy okazji wersja "ASM":

    • 27: CommentAuthorValdghir
    • CommentTime11 Jun 2014
     
    O tosz chodziło, dzięki @mono, szukałem rozwiązania z jedną zmienną, bo za niedługo te moje wypociny będą się składać głównie z nich
    • 28: CommentAuthorValdghir
    • CommentTime11 Jun 2014 zmieniony
     
    0 DIM A$(320):A$(320)=" "
    1 GRAPHICS 24:P=6
    2 OPEN #%1,4,%0,"D:MIDI.PIC"
    3 BGET #%1,DPEEK(88),7680:CLOSE #%1
    4 OPEN #%1,8,%0,"P:"
    5 ------------------------------
    6 FOR Y=%0 TO 191 STEP 7:L=320
    7 IF Y=189 THEN P=%2
    8 FOR X=320 TO %1 STEP -%1
    9 G=%0
    10 FOR R=%0 TO P
    11 LOCATE X-%1,Y+R,C:G=G+G+C
    12 NEXT R
    13 IF P=%2 THEN G=G*16
    14 IF G=%0 THEN L=L-%1
    15 A$(X,X)=CHR$(G)
    16 NEXT X
    17 IF L=%0 THEN 22
    18 ? #%1;" 9 A";
    19 PUT #%1;INT(L/256)
    20 PUT #%1;L MOD 256
    21 ? #%1;A$(%1,L);
    22 PUT #%1;155
    23 NEXT Y:END

    To powinno skrócić czas wydruku.
    O i jakby ktoś od 5 do 21 linni strzelił to jako prockę USR to byłoby miodzio.
    • 29:
       
      CommentAuthorKaz
    • CommentTime11 Jun 2014
     
    Program mozesz przyspieszyc nawet w turbobeju, chocby umieszczajac wiecej polecen w jednym wierszu programu. No i oczywiscie kompilacja. Mozesz podac czas wykonywania programu po kompilacji?
    • 30: CommentAuthorseban
    • CommentTime11 Jun 2014
     
    teraz dopiero zwróciłem uwagę że to kod w Turbo Basic :)

    w takim wypadku:

    Hi=INT(L/256)
    Lo=L MOD 256
    • 31: CommentAuthorValdghir
    • CommentTime12 Jun 2014 zmieniony
     
    @Kaz - nie mogę zmierzyć czasu działania, ponieważ jego prędkość będzie zależna od tego co jest na ekranie. Puste linie się nie drukują. A pozostałe od lewej do prawej strony do ostatniego zera.

    @seban - właśnie tej funkcji szukałem, dzięki

    Teraz to poproszę albo o jakąś optymalizację, albo o propozycje na procedurę USR. Czas wydruku po zmianie w programie zmierzę jutro.
    • 32:
       
      CommentAuthorjhusak
    • CommentTime12 Jun 2014 zmieniony
     
    @seban, dzielenie? Toż najszybciej będzie:

    DPOKE(1536,32767)
    HI=PEEK(1537)
    LO=PEEK(1536)


    A tak z drugiej strony napewno szybciej i prościej drukować obraz obrócony o 90 stopni, przelatując po pionowych kolumnach.
    • 33: CommentAuthorseban
    • CommentTime12 Jun 2014 zmieniony
     
    @jakub: jeżeli chodzi o szybkość to wyżej masz screen-shot który korzysta z USR-a ;-)

    ; super tajny USR :D
    pla
    pla
    sta $cc
    pla
    sta $cb
    rts



    A całe zamieszanie wynikało z tego że założyłem że kod ma być PURE-BASIC :) i dlatego wyprodukowałem masakryczny "emulator" modulo :) Potem mono przypomniał standardową starą BASIC-ową metodę... która jak widać (patrząc na to coś co wyprodukowałem) kołatała mi się po głowie, ale było to zbyt dawno temu abym mógł sobie przypomnieć... i powstało to co powstało :) naprawdę się wstydzę :D

    do kompletu patrząc na ostatni przykład zdałem sobie sprawę że to Turbo Basic napotykając pierwszego DPEEK()-a w kodzie :) i przypomniało mi się że TBXL ma funkcję MOD :D
    • 34: CommentAuthorValdghir
    • CommentTime12 Jun 2014 zmieniony
     
    Super sprawa, ale chyba największe opóźnienie daje pętla R. Bez wczytania obrazu i wysyłce na dysk czas na emulatorze zszedł do 5.33

    edit:
    teraz widze, że nie zadziała - sprawdzanie 0 w linni powinno się zatrzymać jeśli pojawi się niezero.

    Do Tajemnic Atari na dział 5 linni:
    0 GRAPHICS 24:P=6:OPEN #1,4,0,"D:MIDI.PIC":BGET #1,DPEEK(88),7680:CLOSE #1
    1 OPEN #1,8,0,"D5:PUSTY.PRN":FOR Y=0 TO 191 STEP 7:? #1;" 9 A @";:IF Y=189 THEN P=2
    2 FOR X=0 TO 319:FOR R=0 TO P:LOCATE X,Y+R,C:G=G+G+C:NEXT R:IF P=2 THEN G=G*16
    3 PUT #1;G:G=0:NEXT X:PUT #1;155:NEXT Y:? TIME$:END
    • 35:
       
      CommentAuthorKaz
    • CommentTime12 Jun 2014
     

    Valdghir:

    nie mogę zmierzyć czasu działania, ponieważ jego prędkość będzie zależna od tego co jest na ekranie.


    Nie rozumiem. Drukujesz testowy, taki sam ekran, przed kompilacja i po kompilacji.
    • 36: CommentAuthor0xF
    • CommentTime12 Jun 2014
     
    Seban: w Atari BASIC:
    LO=ASC(CHR$(X))
    • 37: CommentAuthorseban
    • CommentTime12 Jun 2014 zmieniony
     
    a widzisz Fox, człowiek uczy się całe życie :) jeszcze ze 20 lat w waszym towarzystwie i poznam wszelakie tips&tricks z Atari BASIC :D
    • 38: CommentAuthorValdghir
    • CommentTime26 Jun 2014 zmieniony
     
    Próbowałem buforowania danych w A$ i odcięcia niedrukowanych zer celem przyśpieszenia, ale efekt okazuje się odwrotny.

    Wczoraj odkryłem, że nie trzeba tego robić, ponieważ drukarka robi to sprzętowo.

    Czas wydruku pewnego schematu na drukarkę wyniósł 7:26 przed i 3:42 po kompilacji. Tegoż samego do pliku 6:44 przed i 3:00 po kompilacji. Wyłączenie ekranu skraca czas o 0:40 do 1:30.

    Tylko maszynowa procka coś tu zaradzi.