[#271] Re: Dewelopment gry Sołtys

@Don_Adan, post #270

Tamte pliki prawidłowo poszły bo gdyby przesunięcia były złe to atomatycznie wyświetliłby nazw tych plików.

Nie sądzę też aby faktycznie w dyskietce 880kB akurat się trafiło że to będzie ostatnie 50kB. Mogę dłubać przy tym ale to bardziej sztuka dla sztuki. Nie będę ryzykować czy komuś się uda wypakować a komuś innemu nie.

Przymierzyłbym się do napisania skryptu installera. Pierwsza dyskietka raczej bootowalna. Nie będzie wymagać kopiowania xfdmaster.library na dysk itp. Sam installer i lha byłyby spakowane stonecrackerem co je zmniejszy też. Kwestia użycia LHA X oraz XFDDECRUNCH z poziomu skryptu installera mnie zastanawia najbardziej.
[#272] Re: Dewelopment gry Sołtys

@tukinem, post #271

To ze nazwa pliku i rozmiar pliku sie zgadza, nie oznacza ze to co zostalo zapisane, jest tym czym powinno byc.
Uzycie xfdDecrunch jest banalne. Piszesz:

avail flush
assign libs: Soltys_D1:libs
xfdDecrunch #?
assign libs: sys:libs

Ostatnia aktualizacja: 13.01.2025 18:37:55 przez Don_Adan
[#273] Re: Dewelopment gry Sołtys

@Don_Adan, post #272

To ma być napisane w skrypcie Installera? Mnie to wygląda na komendy AmigaDOSu...
[#274] Re: Dewelopment gry Sołtys

@tukinem, post #273

A czym jest installer?
Potrafi uzywac komendy.
Tylko sciezki musza byc podane prawidlowo.
Mozesz potestowac w skrypcie taki
avail flush
moze
c:avail flush
lub
Soltys_D1:c/avail flush
[#275] Re: Dewelopment gry Sołtys

@Don_Adan, post #274

Ok to ułatwia sprawę. Skoro Assign można tu użyć, to nawet dyskietka nie musi być bootowalna.

Jutro potestuję. Mam nadzieję że nie będę mieć pytań hehe
[#276] Re: Dewelopment gry Sołtys

@Don_Adan, post #268

Ale to moze sie przydac tez Tobie.
Może, ale sorry, jak wdepnę w temat, to latami nie wyjdę, a tu ludzie na klawiatury czekają.
[#277] Re: Dewelopment gry Sołtys

@Don_Adan, post #274

Działa.

Mam taki problem, że nie wykrywa wyboru języka:


Zawsze wyświetla polskie napisy. Jeśli ustawię if #lang=1 również mam polskie napisy zamiast BLABLABLA. Jeśli przy AskChoice ustawię DEFAULT na 1 to zaznacza opcję "english" ale i tak zmienne tekstowe ustawia na polskie. Za to w kolejnym oknie przy wyborze miejsca instalacji zawsze wypisuje "BLABLABLA" czy ustawię polski czy angielski język.

Sama konstrukcja IFa jest chyba dobrze napisana?

PS. Nie napisałeś mi, że do komend AmigaDOSu trzeba użyć RUN

Ostatnia aktualizacja: 14.01.2025 09:11:41 przez tukinem
[#278] Re: Dewelopment gry Sołtys

@tukinem, post #277

Już wiem. Warunek IF inaczej się zapisuje w Installerze.

Załączę wstępny listing do Installera. Może coś ktoś doradzi:

(set #lang
  (askchoice
    (prompt "")
    (help "")
    (choices
    "POLSKI"
    "ENGLISH"
    )
  )
)

(if (= #lang 0)
  (
    (set #witaj "Witam w pakiecie instalacyjnym gry SOLTYS w polskiej wersji jezykowej")
    (set #pytanie "Wybierz gdzie umiescic katalog z gra SOLTYS")
    (set #zakoncz "SOLTYS zostal pomyslnie zainstalowany na twardym dysku")
  )
  (
    (set #witaj "BLABLABLA")
    (set #pytanie "BLABLABLA")
    (set #zakoncz "BLABLABLA")
  )
)



(welcome #witaj)

(set #dest
(askdir
    (prompt #pytanie)
    (help)
    (default "SYS:")
)
)



(run "assign libs: SOLDEMO1:libs")

(askdisk
  (prompt "DISK2")
  (help "")
  (dest"SOLDEMO2")
)
(copyfiles
    (source "SOLDEMO2:")
    (dest "RAM:")
    (all)
)
(complete 20)

(askdisk
  (prompt "DISK 3")
  (help "")
  (dest "SOLDEMO3")
)
(copyfiles
    (source "SOLDEMO3:")
    (dest "RAM:")
    (all)
)
(complete 40)

(askdisk
  (prompt "DISK 1")
  (help "")
  (dest "SOLDEMO1")
)
(copyfiles
    (source "SOLDEMO1:soltys4.pack")
    (dest "RAM:")
)
(complete 60)

(run "xfdDecrunch RAM:soltys1.pack")
(run "xfdDecrunch RAM:soltys2.pack")
(run "xfdDecrunch RAM:soltys3.pack")
(run "xfdDecrunch RAM:soltys4.pack")
(complete 80)

(run "JOIN RAM:soltys1.pack RAM:soltys2.pack RAM:soltys3.pack RAM:soltys4.pack AS RAM:soltys.join")
(delete "RAM:soltys1.pack")
(delete "RAM:soltys2.pack")
(delete "RAM:soltys3.pack")
(delete "RAM:soltys4.pack")
(complete 90)

(run "SOLDEMO1:C/lha x RAM:soltys.join RAM:")
(complete 95)

(delete "RAM:soltys.join")

(run "assign libs: sys:libs")
(complete 100)

(exit #zakoncz (quiet))


Oczywiście póki co wszystko idzie do RAM, ale ostatecznie będzie lecieć od razu do katalogu z grą. Sprawdziłem z gołego AmigaDOSu i też działa, tylko woła o katalog ENV.
[#279] Re: Dewelopment gry Sołtys

@tukinem, post #278

Podalem Ci, ze powinienes uzyc "avail flush", przed wywolaniem xfdDecrunch z dyskietki, mozesz sie zastanowic dlaczego.
[#280] Re: Dewelopment gry Sołtys

@Don_Adan, post #279

Podalem Ci, ze powinienes uzyc "avail flush", przed wywolaniem xfdDecrunch z dyskietki, mozesz sie zastanowic dlaczego.


Avail flush służy do wyczyszczenia RAMu. Może dodatkowo jeszcze być do przeładowania bibliotek? Czy to już sam Assign przeładowuje?
[#281] Re: Dewelopment gry Sołtys

@Don_Adan, post #267

Spliter
  move.l AllocMemPtr,A0
  move.l AllocMemSize,D7
  move.l A0,BufferPtr
  move.l D7,BufferSize
NextFile
  move.l BufferPtr,A0
  move.l BufferSize,D7
  tst.b  (A0)
  beq.w  Quit
  cmp.b  #"-",2(A0)
  bne.w  Quit
  cmp.b  #"l",3(A0)
  bne.w  Quit
  cmp.b  #"h",4(A0)
  bne.w  Quit
  cmp.b  #"0",5(A0)
  bne.w  Quit

  moveq  #2,D2
  add.b  (A0),D2
  move.l A0,A2
  add.l  D2,A2  ; pointer to file data, if no subdirectory
  move.b 10(A0),D1
  lsl.w  #8, D1
  move.b 9(A0),D1
  swap   D1
  move.b 8(A0),D1
  lsl.w  #8, D1 
  move.b 7(A0),D1 ; skip size
  add.l  D1,D2
  sub.l  D2,D7
  bpl.b  InBuffy
  add.l  D2,D7
  move.l AllocMemPtr,A1
  move.l A1,BufferPtr
CopyRest
  move.b (A0)+,(A1)+
  subq.l #1,D7
  bne.b  CopyRest
  move.l A1,A0
  jsr    UpdateBuffer  ;  read next part of file from new file offset to A0 and set new D7
  move.l D7,BufferSize
  bra.b  NextFile
InBuffy
  move.b 14(A0),D0
  lsl.w  #8, D0 
  move.b 13(A0),D0
  swap   D0
  move.b 12(A0),D0
  lsl.w  #8, D0 
  move.b 11(A0),D0 ; file size to save
  move.b 21(A0),D2 ; length of file name
  lea    22(A0),A0 ; pointer to file name
  move.l PathPtr,A1
  sub.l  D0,D1
  beq.b  CopyName
  add.l  A2,D1
  cmp.b  #2,(A2)+
  bne.b  Quit
 CopyPath
  move.b (A2)+,(A1)+
  cmp.b  #-1,(A2)
  bne.b CopyPath
  move.b #"/",(A1)+   ; insert slash
  move.l D1,A2
CopyName
  move.b (A0)+,(A1)+
  subq.b #1,D2
  bne.b  CopyName
  move.l A2,A0 ; pointer to memory
; D0 - size of memory to save
  jsr    SaveFile
Quit
  rts

AllocMemPtr
 dc.l 0
AllocMemSize  ; must be greater than the biggest splited file
 dc.l 0
BufferPtr
 dc.l 0
BufferSize
 dc.l 0
PathPtr
 dc.l 0
[#282] Re: Dewelopment gry Sołtys

@tukinem, post #280

Assign to przypisanie, nic wiecej.
Avail flush zwalnia wszystkie nieuzywane a zaladowane do pamieci zasoby, glownie biblioteki.
[#283] Re: Dewelopment gry Sołtys

@Don_Adan, post #281

Jak patrzę na Twój kod to się to takie proste wydaje rok temu bym nie wiedział o co tu chodzi
[#284] Re: Dewelopment gry Sołtys

@tukinem, post #283

Ale i tak byl blad, bo tylko jeden plik zapisywal, zapomnialem o glownej petli.

Spliter
  move.l AllocMemPtr,A0
  move.l AllocMemSize,D7
  move.l A0,BufferPtr
  move.l D7,BufferSize
NextFile
  move.l BufferPtr,A0
  move.l BufferSize,D7
  tst.b  (A0)
  beq.w  Quit
  cmp.b  #"-",2(A0)
  bne.w  Quit
  cmp.b  #"l",3(A0)
  bne.w  Quit
  cmp.b  #"h",4(A0)
  bne.w  Quit
  cmp.b  #"0",5(A0)
  bne.w  Quit

  moveq  #2,D2
  add.b  (A0),D2
  move.l A0,A2
  add.l  D2,A2  ; pointer to file data, if no subdirectory
  move.b 10(A0),D1
  lsl.w  #8, D1
  move.b 9(A0),D1
  swap   D1
  move.b 8(A0),D1
  lsl.w  #8, D1 
  move.b 7(A0),D1 ; skip size
  add.l  D1,D2
  sub.l  D2,D7
  bpl.b  InBuffy
  add.l  D2,D7
  move.l AllocMemPtr,A1
  move.l A1,BufferPtr
CopyRest
  move.b (A0)+,(A1)+
  subq.l #1,D7
  bne.b  CopyRest
  move.l A1,A0
  jsr    UpdateBuffer  ;  read next part of file from new file offset to A0 and set new D7
  move.l D7,BufferSize
  bra.b  NextFile
InBuffy
  add.l  D2,BufferPtr
  sub.l  D2,BufferSize
  move.b 14(A0),D0
  lsl.w  #8, D0 
  move.b 13(A0),D0
  swap   D0
  move.b 12(A0),D0
  lsl.w  #8, D0 
  move.b 11(A0),D0 ; file size to save
  move.b 21(A0),D2 ; length of file name
  lea    22(A0),A0 ; pointer to file name
  move.l PathPtr,A1
  sub.l  D0,D1
  beq.b  CopyName
  add.l  A2,D1
  cmp.b  #2,(A2)+
  bne.b  Quit
 CopyPath
  move.b (A2)+,(A1)+
  cmp.b  #-1,(A2)
  bne.b CopyPath
  move.b #"/",(A1)+   ; insert slash
  move.l D1,A2
CopyName
  move.b (A0)+,(A1)+
  subq.b #1,D2
  bne.b  CopyName
  move.l A2,A0 ; pointer to memory
; D0 - size of memory to save
  jsr    SaveFile
 bra.w   NextFile
Quit
  rts

AllocMemPtr
 dc.l 0
AllocMemSize  ; must be greater than the biggest splited file
 dc.l 0
BufferPtr
 dc.l 0
BufferSize
 dc.l 0
PathPtr
 dc.l 0
1
[#285] Re: Dewelopment gry Sołtys

@tukinem, post #278

Jesli juz robisz POLSKI to po wyborze jezyka polskiego raczej powinienes dodac:

(run "assign fonts: SOLDEMO1:fonts add") ; moze bez add
(run TopazPL)

Chyba powinno zadzialac. Mozesz potestowac.
Zeby profesjonalnie wygladalo.
[#286] Re: Dewelopment gry Sołtys

@Don_Adan, post #285

Dobry pomysł. Instalacja tylko będzie po polsku i angielsku więc o umlauty nie muszę się martwić

Wersja demo ładnie się instaluje, ale ostatecznie chyba będzie tylko jako jeden plik LHA żeby nie robić pod górę.
[#287] Re: Dewelopment gry Sołtys

@tukinem, post #286

Dodałem ISO-topazPL.

Kolejny problem. Używając stałych nazw pod ścieżką RAM: nie miałem problemu z tym:
(run "xfdDecrunch RAM:soltys1.pack")

teraz moja ścieżka instalacji to #INSTALL i nie mogę użyć czegoś takiego:
(run "xfdDecrunch (tackon #INSTALL "soltys1.pack") ")

bo z poziomu AmigaDOSu to przecież niemożliwe. Jak dane ze zmiennej Installera przekazać do (run)? To samo będę mieć przy użyciu Join i LhA x. Szkoda wszystkie operacje robić w RAMie i zapychać go. Chyba że wszystko ładować do SYS: a później przenieść do katalogu docelowego, ale to trochę nieładne zadanie by było.

Ostatnia aktualizacja: 14.01.2025 23:53:41 przez tukinem

Ostatnia aktualizacja: 14.01.2025 23:54:46 przez tukinem
[#288] Re: Dewelopment gry Sołtys

@tukinem, post #287

set Test ram:t1
setenv Test1 ram:t2

get Test
getEnv Test1
echo $Test
echo $Test1

??
przetestuj w CLI wszystkie w/w opcje


Ostatnia aktualizacja: 15.01.2025 00:33:35 przez Cezarykl
[#289] Re: Dewelopment gry Sołtys

@Cezarykl, post #288

Tu w tym wypadku chyba będzie to samo, czyli set ustawi taką ścieżkę jaką mu podam, np "SYS:", a nie ustawi tam zmiennej z Installera ustawianą przez (askdir).
[#290] Re: Dewelopment gry Sołtys

@tukinem, post #289

Bo tam jest błąd. Teraz nie mam jak sprawdzić, dopiero wieczorem lub jutro, ale tak napisane użycie XFDDECRUNCH moim zdaniem sugeruje, że ten cały nawias to jest nazwa pliku. XFDDECRUNCH nie lubi plików, które w nazwie mają nawias, więc pewnie dlatego nie działa.
[#291] Re: Dewelopment gry Sołtys

@mailman, post #290

Najprościej byłoby stworzyć tymczasowy katalog SYS:SoltysTemp i w nim dokonywać wszystkie operacje, a po wypakowaniu z LHA skopiować zawartość do docelowego katalogu komendą Installera i usunąć tymczasowy katalog.

Ostatnia aktualizacja: 15.01.2025 08:11:29 przez tukinem
[#292] Re: Dewelopment gry Sołtys

@tukinem, post #291

Musiałbyś jednak sprawdzić najpierw czy SYS: ma wystarczającą ilość miejsca wolnego.
[#293] Re: Dewelopment gry Sołtys

@mailman, post #292

Jeśli gra ma obecnie 12 MB, to będzie wymagać 24 MB wolnego miejsca w najbardziej wymagających momentach (użycie Join i LHA x). Tam już jest praca na plikach bez kompresji. W dzisiejszych czasach raczej to nie będzie problem, ale oczywiście, żeby było profesjonalnie to dodam sprawdzanie.

Z drugiej strony ktoś mógłby chcieć instalować na przykładowym CF0: (karta w PCMCIA), a mieć zapchany twardy dysk z DH0: i wtedy taki numer nie przejdzie, więc lepiej działać w docelowym katalogu instalacji wybranym przez użytkownika.
[#294] Re: Dewelopment gry Sołtys

@tukinem, post #287

Moim zdaniem nazwę archiwum wraz ze ścieżką należy przypisać do zmiennej, a później wywołać

(Run "xfddecrunch #nazwa_pliku")

Albo nazwę xfddecrunch też dać do zmiennej i wtedy:

(Run (#nazwa_programu #nazwa_pliku))

Bo coś czuję, że ten cudzysłów tu miesza.
1
[#295] Re: Dewelopment gry Sołtys

@tukinem, post #287

Dodanie samych fontow raczej nic nie zmieni, chyba ze Installer je jakos wywoluje.
A co do xfdDecrunch to najprostsza metoda to:
(run SOLDEMO1fdDecrunch #?)

Oczywiscie aktualny katalog musi byc dobrze ustawiony, czyli tam gdzie sa pliki do rozpakowania.

A jezeli lubisz skomplikowana wersje to zobacz np.w FastBrain.lha (szukaj xfdDecrunch)

link


Ostatnia aktualizacja: 15.01.2025 12:21:21 przez Don_Adan
[#296] Re: Dewelopment gry Sołtys

@Don_Adan, post #284

Przynajmniej jeszcze 1 blad byl.
Spliter
  move.l AllocMemPtr,A0
  move.l AllocMemSize,D7
  move.l A0,BufferPtr
  move.l D7,BufferSize
NextFile
  move.l BufferPtr,A0
  move.l BufferSize,D7
  moveq  #16,D2
  cmp.l  D2,D7
  ble.b  UpdateBuff
  tst.b  (A0)
  beq.w  Quit
  cmp.b  #"-",2(A0)
  bne.w  Quit
  cmp.b  #"l",3(A0)
  bne.w  Quit
  cmp.b  #"h",4(A0)
  bne.w  Quit
  cmp.b  #"0",5(A0)
  bne.w  Quit

  moveq  #2,D2
  add.b  (A0),D2
  move.l A0,A2
  add.l  D2,A2  ; pointer to file data, if no subdirectory
  move.b 10(A0),D1
  lsl.w  #8, D1
  move.b 9(A0),D1
  swap   D1
  move.b 8(A0),D1
  lsl.w  #8, D1 
  move.b 7(A0),D1 ; skip size
  add.l  D1,D2
  sub.l  D2,D7
  bpl.b  InBuffy
  add.l  D2,D7
UpdateBuff
  move.l AllocMemPtr,A1
  move.l A1,BufferPtr
CopyRest
  move.b (A0)+,(A1)+
  subq.l #1,D7
  bne.b  CopyRest
  move.l A1,A0
  jsr    UpdateBuffer  ;  read next part of file from new file offset to A0 and set new D7
  move.l D7,BufferSize
  bra.b  NextFile
InBuffy
  add.l  D2,BufferPtr
  sub.l  D2,BufferSize
  move.b 14(A0),D0
  lsl.w  #8, D0 
  move.b 13(A0),D0
  swap   D0
  move.b 12(A0),D0
  lsl.w  #8, D0 
  move.b 11(A0),D0 ; file size to save
  move.b 21(A0),D2 ; length of file name
  lea    22(A0),A0 ; pointer to file name
  move.l PathPtr,A1
  sub.l  D0,D1
  beq.b  CopyName
  add.l  A2,D1
  cmp.b  #2,(A2)+
  bne.b  Quit
 CopyPath
  move.b (A2)+,(A1)+
  cmp.b  #-1,(A2)
  bne.b CopyPath
  move.b #"/",(A1)+   ; insert slash
  move.l D1,A2
CopyName
  move.b (A0)+,(A1)+
  subq.b #1,D2
  bne.b  CopyName
  move.l A2,A0 ; pointer to memory
; D0 - size of memory to save
  jsr    SaveFile
  bra.w   NextFile
Quit
  rts

AllocMemPtr
 dc.l 0
AllocMemSize  ; must be greater than the biggest splited file
 dc.l 0
BufferPtr
 dc.l 0
BufferSize
 dc.l 0
PathPtr
 dc.l 0
[#297] Re: Dewelopment gry Sołtys

@mailman, post #294

Użyłem drugiej metody i działa, ale LHA już nie wypakowuje.

Póki co tak wygląda kod installera w przypadku LHA:

#LHA to "SOLDEMO1:C/LhA x "
#INSTALL to ścieżka do pliku
#AFTERJOIN to (tackon #INSTALL "soltys.join")

Dodałem też komendy (working), bo wypakowywanie LZMA na rzeczywistej szybkości trwa... 4 minuty.

Wrzucam cały kod Installera, może ktoś znajdzie błąd co do samego LHA. A jak nie to wieczorem będę szukać dalej.
(run "assign fonts: SOLDEMO1:fonts add")
(run "ISO-topazPL")

(set #XFD "SOLDEMO1:C/xfdDecrunch")
(set #LHA "SOLDEMO1:C/lha x ")
(set #JOIN "JOIN")

(set #lang
  (askchoice
    (prompt "")
    (help "")
    (choices
    "POLSKI"
    "ENGLISH"
    )
  )
)

(if (= #lang 0)
  (
    (set #witaj "Witam w pakiecie instalacyjnym gry SOŁTYS")
    (set #pytanie "Wybierz, gdzie umie¶cić katalog z gr± SOŁTYS")
    (set #zakoncz "SOŁTYS został pomy¶lnie zainstalowany na twardym dysku")
  )
  (
    (set #witaj "Welcome to the installation package of the game SOŁTYS")
    (set #pytanie "Choose where to put the folder with the game SOŁTYS")
    (Set #zakoncz "SOŁTYS has been successfully installed on the hard drive")
  )
)



(welcome #witaj)

(set #dest
(askdir
    (prompt #pytanie)
    (help)
    (default "SYS:")
)
)

(set #INSTALL (tackon #DEST "SOLTYS"))
(makedir #INSTALL)

(run "assign libs: SOLDEMO1:libs")

(askdisk
  (prompt "DISK2")
  (help "")
  (dest"SOLDEMO2")
)
(copyfiles
    (source "SOLDEMO2:")
    (dest #INSTALL)
    (all)
)
(complete 20)

(askdisk
  (prompt "DISK 3")
  (help "")
  (dest "SOLDEMO3")
)
(copyfiles
    (source "SOLDEMO3:")
    (dest #INSTALL)
    (all)
)
(complete 40)

(askdisk
  (prompt "DISK 1")
  (help "")
  (dest "SOLDEMO1")
)
(copyfiles
    (source "SOLDEMO1:soltys4.pack")
    (dest #INSTALL)
)
(complete 60)

(run "avail flush")
(set #FILE1 (tackon #INSTALL "soltys1.pack"))
(set #FILE2 (tackon #INSTALL "soltys2.pack"))
(set #FILE3 (tackon #INSTALL "soltys3.pack"))
(set #FILE4 (tackon #INSTALL "soltys4.pack"))
(working "LZMA depacking file 1...")
(run #XFD #FILE1)
(working "LZMA depacking file 2...")
(run #XFD #FILE2)
(working "LZMA depacking file 3...")
(run #XFD #FILE3)
(working "LZMA depacking file 4...")
(run #XFD #FILE4)
(complete 80)

(working "JOINING FILES")
(set #AFTERJOIN (tackon #INSTALL "soltys.join"))
(run #JOIN #FILE1 #FILE2 #FILE3 #FILE4 "AS" #AFTERJOIN)
(delete #FILE1)
(delete #FILE2)
(delete #FILE3)
(delete #FILE4)
(complete 90)

(run #LHA #AFTERJOIN #INSTALL)
;(run "SOLDEMO1:C/lha x RAM:soltys.join RAM:")
(complete 95)

;(delete #AFTERJOIN)
;(delete "RAM:soltys.join")

(run "assign libs: sys:libs")
(complete 100)

(exit #zakoncz (quiet))
[#298] Re: Dewelopment gry Sołtys

@tukinem, post #297

Do zmiennej #LHA nie dokladalbym parametru x. To zrobiłbym poza, czyli

(Run #LHA x #plik #GDZIE)
1
[#299] Re: Dewelopment gry Sołtys

@tukinem, post #297

To jest wskazowka, ze powinienes uzyc Splitera a nie Lha :)
Ale mailman ma racje, jego wersja powinna zadzialac.
1
[#300] Re: Dewelopment gry Sołtys

@tukinem, post #287

teraz moja ścieżka instalacji to #INSTALL i nie mogę użyć czegoś takiego:
(run "xfdDecrunch (tackon #INSTALL "soltys1.pack") ")

Tak zadziała:
(run (cat "xfdDecrunch " (tackon #INSTALL "soltys1.pack")))

Analogicznie:
(set #LHA "SOLDEMO1:C/LhA x ")
(run (cat #LHA (tackon #INSTALL "soltys1.pack")))

Funkcja Installera cat zamienia wszystkie argumenty na stringi (o ile nimi już nie są) i łączy je ze sobą.
2
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