kategoria: Blitz
[#1] Blitz - uszczuplanie binarki (dla poczatkujacych, he )
Czesc,
jako, ze temat wyzwania... ma sporo wypowiedzi na temat uszczuplenia pliku wykonalnego (dzieki koledze mschulz) to dla niektorych (jak i dla mnie ) moga one brzmiec nieco abstrakcyjnie

Tak wiec tutaj zamieszcze sposoby, ktore faktycznie pomniejszaja plik wykonywalny w blitzu i sa zrozumiale dla laika (wystarczy tylko podmienic kilka instrukcji, nie ma potrzeby wiedziec gdzie co i jak zostaje potraktowane przez kompilator blitza czy jeszcze cos innego)

Dla niektorych beda to smieszne sprawy ale innym moga sie przydac - sam sie dopiero tego wszystkiego ucze.
Takie "okrajanie" sprawdzi sie piszac program pod system (okienka, ekrany publiczne..) w innym wypadku potrzeba sposobow zamieszconych tutaj:
47 Tips To Reduce Blitz2 Executable Size

Ponizej znajduje sie kod wyjsciowy, dzialajacy, wziety ze wspomnianego watku, ktory zamierzam przerobic.... ale to dopiero po poludniu, hehe

#IDCMP_RAWKEY      = $0400
#WFLG_ACTIVATE     = $1000
#WFLG_BORDERLESS   = $0800

finito.b           = False

NEWTYPE.xy
 x.w
 y.w
End NEWTYPE
Dim tri.xy(3)

DEFTYPE.Screen *wb
DEFTYPE.w
;---------------------------------------------------



; ustawiam ekran WB jako widoczny
WbToScreen 0
ShowScreen 0

; ten program mozna wystartowac z ikonki
WBStartup

; okno CLI zostanie schowane
NoCli


; pobieram informacje o ekranie by moc dostosowac rozmiar okna
*wb = LockPubScreen_(0)
If *wb
  ww=*wb\Width
  wh=*wb\Height-*wb\BarHeight-1
  wy=*wb\BarHeight+1
  UnlockPubScreen_ 0,*wb
Else
  End
EndIf


; wyliczam trojkat
th       = wh-4
ta       = 2*th/Sqr(3)

tri(0)\x = ww/2,         (wh-th)/2
tri(1)\x = (ww-ta)/2+ta, (wh-th)/2+th
tri(2)\x = (ww-ta)/2,    (wh-th)/2+th


; otwieram okno
Window 1,0,wy,ww,wh,#WFLG_BORDERLESS|#WFLG_ACTIVATE,"",1,2


; losuje punkt srtartowy w oknie
rp.xy\x = Rnd(ww-1),Rnd(wh-1)


; glowna petla programu
; ESC konczy dzialanie calosci
Repeat
  ; jesli ESC zostal presniety to finito
  If Event=#IDCMP_RAWKEY
    rk$=Inkey$
    If RawKey = $45 Then finito = True
  EndIf

  ; losuje wierzcholek
  p.b = Rnd(3)

  ; obliczam kolejny punkt startowy na podstawie wylosowanego wierzcholka
  rp\x = (rp\x+tri(p)\x)/2, (rp\y+tri(p)\y)/2

 ; rysuje punkt
  WPlot rp\x,rp\y,1
Until finito

End


Ostatnia aktualizacja: 28.09.2018 08:56:28 przez peceha
[#2] Re: Blitz - uszczuplanie binarki (dla poczatkujacych, he )

@peceha, post #1

Wiec tak... zapomnailem o najwazniejszym:
by to skompilowac nalezy dodac "amigaLib.res" jako "resident file" w "compiler options" a to dlatego ze uzywam struktury .Screen i ona jest tam zdefiniowana (zreszta po odchudzeniu programu dojdzie jeszce ,Window oraz .IntuiMessage wiec przyda sie ten plik jako rezydentny)

Dodatkowo usunalem przypisy stalych na samym poczatku pogramu (3 pierwsze linijki) bo one juz sa zadeklarowane w tym pliku rezydentnym.

Wynik kompilacji:
- kod z postu 1 .... 23480
- kod z postu 2 .... 6200

A oto zmieniony kod (w zaden sposob nie przemyslany szeroki uśmiech) - ot tak tylko podmienilem wbudowane komendy blitza tymi systemowymi

finito.b = False

NEWTYPE.xy
 x.w
 y.w
End NEWTYPE

Dim tri.xy(3)
Dim tags.TagItem(7)

DEFTYPE.Screen       *wb
DEFTYPE.Window       *win
DEFTYPE.IntuiMessage *msg
DEFTYPE.w

;---------------------------------------------------

WBStartup
NoCli

*wb = LockPubScreen_(0)
If *wb
  tags(0)\ti_Tag = #WA_Left,   0
  tags(1)\ti_Tag = #WA_Top,    *wb\BarHeight+1
  tags(2)\ti_Tag = #WA_Width,  *wb\Width
  tags(3)\ti_Tag = #WA_Height, *wb\Height-*wb\BarHeight-1
  tags(4)\ti_Tag = #WA_Flags,  #WFLG_BORDERLESS|#WFLG_ACTIVATE
  tags(5)\ti_Tag = #WA_IDCMP,  #IDCMP_RAWKEY
  tags(6)\ti_Tag = #TAG_DONE,  0
  *win=OpenWindowTagList_(0,&tags(0))

  UnlockPubScreen_ 0,*wb
  If *win=0 Then End
Else
  End
EndIf

ScreenToFront_(*wb)

; wyliczam trojkat
th       = tags(3)\ti_Data-4
ta       = 2*th/Sqr(3)

tri(0)\x =  tags(2)\ti_Data/2,        (tags(3)\ti_Data-th)/2
tri(1)\x = (tags(2)\ti_Data-ta)/2+ta, (tags(3)\ti_Data-th)/2+th
tri(2)\x = (tags(2)\ti_Data-ta)/2,    (tags(3)\ti_Data-th)/2+th

; losuje punkt srtartowy w oknie
rp.xy\x = Rnd(ww-1),Rnd(wh-1)

Repeat
  *msg = GetMsg_(*win\UserPort)
  While *msg
    If *msg\Class = #IDCMP_RAWKEY
      If *msg\Code = $45 Then finito = True
    EndIf
    ReplyMsg_(*msg)
    *msg = GetMsg_(*win\UserPort)
  Wend

  ; losuje wierzcholek
  p.b = Rnd(3)

  ; obliczam kolejny punkt startowy
  rp\x = (rp\x+tri(p)\x)/2, (rp\y+tri(p)\y)/2

 ; rysuje punkt
  Move_ *win\RPort,rp\x,rp\y
  Draw_ *win\RPort,rp\x,rp\y
Until finito

CloseWindow_(*win)
End


Najpierw zamienilem "ShowScreen 0" komenda ScreenToFront_(*wb) ale to dalo raptem 8 bajtow.
Na drugi ogien poszla zamiana OpenWindow systemowym OpenWindowTagList_() i tu roznica jest powalajaca.
Oczywiscie by moz korzystac z takiego okna musialem tez podmienic funkcje rysujaca WPlot na Move_ oraz Draw_.
Tak samo trzeba bylo zmienic fragment odpowiadajacy za sluchanie czy klawisz ESC zostal wcisniety.

Kolejnym krokiem bedzie zamiana WBStartup na to z kodu mschulza. Mam nadzieje ze to cos da.
[#3] Re: Blitz - uszczuplanie binarki (dla poczatkujacych, he )

@peceha, post #2

/* Minimalny kod startowy */
void _start()
{
    struct Process *p = NULL;
    struct WBStartup *wbmsg = NULL;

    SysBase = *(struct ExecBase **)4UL;
    p = (struct Process *)SysBase->ThisTask;

    if (p->pr_CLI == 0)
    {
        WaitPort(&p->pr_MsgPort);
        wbmsg = (struct WBStartup *)GetMsg(&p->pr_MsgPort);
    }

    main();

    if (wbmsg)
    {
        Forbid();
        ReplyMsg((struct Message *)wbmsg);
    }
}


Udalo mi sie jakos to zamienic na Blitz-a ale nie do konca wiem czy poprawnie to zrobilem , chociaz z drugiej strony kompiluje sie bez bledow i dziala poprawnie.

*p = *eBase\ThisTask

If( *p\pr_CLI = 0 )
  WaitPort_( *p\pr_MsgPort )
  *wbmsg = GetMsg_( *p\pr_MsgPort )
EndIf

If( *wbmsg )
  Forbid_
  ReplyMsg_( *wbmsg )
EndIf


Po kompilacji calosc zmniejszyla sie o kolejny 1KB. Teraz zajmuje 5252.

Czy ktos moglby napisac co ten /* minimalny kod startowy */ robi linia po lini (szczegolnie Forbid_ bo tego jeszcze wogole nie ruszalem?
Wtedy bede przynajmniej wiedzial jak to przepisac na Blitza bo to co jest teraz jest tak powiedzmy "na pale".
[#4] Re: Blitz - uszczuplanie binarki (dla poczatkujacych, he )

@peceha, post #3

Czy ktos moglby napisac co ten /* minimalny kod startowy */ robi linia po lini (szczegolnie Forbid_ bo tego jeszcze wogole nie ruszalem?
http://krashan.ppa.pl/mpp/wlasny-kod-startowy

Co prawda to o MorphOS-ie ale wszystko jest tak samo, opuść jedynie akapit o symbolu __abox__ i słowo "Ambient" czytaj "Workbench".

Ostatnia aktualizacja: 28.09.2018 19:24:20 przez Krashan
[#5] Re: Blitz - uszczuplanie binarki (dla poczatkujacych, he )

@Krashan, post #4

Dzieki, to duzo lepsze niz krotka odpowiedz na forum OK
[#6] Re: Blitz - uszczuplanie binarki (dla poczatkujacych, he )

@peceha, post #3

Ekspertem nie jestem ale czy za tym Forbid() nie powinien iść w parze Permit() ?
A druga sprawa to czy nie można wogóle zrezygnować z tego kodu startowego jeśli binarka będzie odpalana z CLI ? Może i głupie pytania - ale ja jestem takim bardzo poczatkującym programistą-terrorystą tzn. często wysadzam system

Ostatnia aktualizacja: 29.09.2018 11:05:12 przez pisklak
[#7] Re: Blitz - uszczuplanie binarki (dla poczatkujacych, he )

@pisklak, post #6

Ekspertem nie jestem ale czy za tym Forbid() nie powinien iść w parze Permit() ?


A przeczytales artykul Krashana do konca? Bo na koncu bylo wyjasnione dlaczego to jest zrobione w ten wlasnie sposob.

A druga sprawa to czy nie można wogóle zrezygnować z tego kodu startowego jeśli binarka będzie odpalana z CLI ?


Mozna, ale to tak mala oszczednosc ze naprawde nie warto.
[#8] Re: Blitz - uszczuplanie binarki (dla poczatkujacych, he )

@mschulz, post #7

OK po przeczytaniu artykułu Krashana już wiem dlaczego nie ma Permit().
[#9] Re: Blitz - uszczuplanie binarki (dla poczatkujacych, he )

@pisklak, post #8

Kiedyś zadałem dokładnie to samo pytanie koledze Krashanowi.
Na stronie www.PPA.pl, podobnie jak na wielu innych stronach internetowych, wykorzystywane są tzw. cookies (ciasteczka). Służą ona m.in. do tego, aby zalogować się na swoje konto, czy brać udział w ankietach. Ze względu na nowe regulacje prawne jesteśmy zobowiązani do poinformowania Cię o tym w wyraźniejszy niż dotychczas sposób. Dalsze korzystanie z naszej strony bez zmiany ustawień przeglądarki internetowej będzie oznaczać, że zgadzasz się na ich wykorzystywanie.
OK, rozumiem