Action! Jedno RUNTIME, wiele modułów.

To już chyba ostatni wpis  z „linkowaniem” za pomocą type lub cat, który jednak pokaże do czego może się przydać Symbol Table Lister.  Załóżmy, że sklejamy kilka kawałków/modułów w Action! Fajnie byłoby aby Runtime było dołączane tylko raz – wymyśliłem sobie, że skoro STL pokaże mi adresy procedur w Runtime, to można zrobić tak:

  • Uruchomić w monitorze R: „H1:STL.ACT”
  • Otworzyć w edytorze Ctrl+Shift+R H1:RUNTIME.ACT i dodać np. set 14=$8000 set $491=$8000
  • Przejść do monitora Ctrl+Shift+M, skompilować C, zapisać W „H1:RUNTIME.OBX”

W LISTING.TXT (patrz poprzedni wpis o STL) znajdziemy adresy:

PrintE……… $822C PROC(BYTE ARRAY)
PrintF……… $8430 PROC(BYTE ARRAY, CARD, CARD, CARD, CARD, CARD)

Więc w naszym programie możemy zdefiniować:

set 14=$8739
set $491=$8739

proc printf=$8430(byte array a, card b, card c,
                  card d, card e, card f)
proc printe=$822C(byte array a)

proc main()
   printf("%S%E", "Test")
   printe("Runtime")
   do od

Kompilujemy i zapisujemy np. jako TESTRT.OBX
Potem sklejamy cat RUNTIME.OBX TESTRT.OBX > TESTRT.XEX

Dzięki temu każdy z dołączanych kawałków binarnych będzie mniejszy, a dodatkowo kompilacja będzie trwać krócej, bo RT kompilowane będzie tylko raz. Szkoda, że kompilatora uruchomionego w emulatorze nie da się odpalać w skrypcie. Można by do tego napisać makefile albo skrypt w bashu…

Modularyzacja i linkowanie w Action!

Gdzieś tam jest i czai się Error 61, to tylko kwestia czasu kiedy zaatakuje :).

Postanowiłem sprawdzić, czy podzielenie programu w Action na mniejsze kawałki to duży problem. Okazuje się, że nie.

Ale najpierw dwa słowa o listowaniu tablicy symboli Action! Jest sobie program Symbol Table Lister. Kilka razy do niego już podchodziłem bez pozytywnych rezultatów, ale ostatecznie udało się. Wygląda na to, że instrukcja w powyższym linku jest błędna.

W pierwszym kroku, zmieniłem linię:

   Close(5) Open(5, „P:”, 8) na
   Close(5) Open(5, „H1:LISTING.TXT”, 8)

Dzięki temu wynik działania listera zapisany zostanie do pliku.

Następnie trzeba było:

  • załadować interesujący nas program do edytora
  • w Monitorze, Ctrl+Shift+M uruchomić lister za pomocą R „H1:STL.ACT”
  • skompilować interesujący nas program za pomocą C

W pliku LISTING.TXT zapisywany jest ładnie sformatowany listing z adresami funkcji, procedur i zmiennych programu z edytora.

Teraz prosty test. W pliku LIB.ACT, mamy dwie proste funkcje:

MODULE ; LIB.ACT

set 14=$8000
set $491=$8000

proc test1()
 byte bkg=710
 bkg=0
return

proc test2()
 byte bkg=710
 bkg=52
return

Za pomocą

set 14=$8000
set $491=$8000

ustawiamy aby kod umieszczony został pod adresem $8000.

Główny program wrzucamy dalej, od $8013:

include "H1:INCL.ACT"

set 14=$8013
set $491=$8013

proc delay()
 int i for i=0 to 10000 do od
return

proc main()
 do
  test1()
  delay()
  test2()
  delay()
 od

Plik INCL.ACT definiujący adresy procedur:

proc test1=$8000()
proc test2=$8009()

Po kompilacji MAIN.ACT i LIB.ACT „linkujemy” powstałe pliki binarne za pomocą cat lub type pod Windows:

type LIB.OBX MAIN.OBX > FINAL.XEX

I otrzymujemy plik wykonywalny.

Przykładowe wyjście z Symbol Table Lister wygląda tak:

Symbol Table for H1:LIB.ACT

Local declarations for test1:
bkg………… $02C6 BYTE

Local declarations for test2:
bkg………… $02C6 BYTE

Global declarations:

test1………. $8000 PROC()
test2………. $8009 PROC()

Code base = $8000, code size = 19

Prawda że przydatne? Przygotowanie w ten sposób nieco okrojonego RUNTIME oddala problem braku miejsca w tablicy symboli. Big Symbol Table jakoś dziwnie działa. Pozostaje sprawdzenie ładowania plików binarnych. Podzielenie dużego programu na mniejsze doczytywane kawałki wydaje się najbardziej sensowne.