Kompilacja z przesunięciem adresów
Monitor Action! zarządza pamięcią dynamicznie zatem adres początku programu może zmieniać się każdorazowo np. po zmianie w kodzie umieszczonym w edytorze.
Aby wpływać na położenie kodu w pamięci na początku programu można umieścić dyrektywę SET dla rejestru APPMHI oraz CODEBASE :
;SET APPMHI = <adres w pamięci>
SET $000E = $2000
;SET CODEBASE = <adres w pamięci>
SET $0491 = $2000
W podanym przykładzie umieszczony po dyrektywie SET program zostanie skompilowany pod adres $2000. Najczęściej produktem wyjściowym kompilacji jest zapis skompilowanego kodu w postaci pliku binarnego na pamięci zewnętrznej.
Wprowadźmy przykład:
SET $000E = $2000
SET $0491 = $2000
Proc NIC=*()
Kompilacja powyższego i zapis z monitora poleceniem W (write) do pliku o nazwie NIC.COM wyprodukuje plik zdatny do uruchomienia pod kontrolą DOS. Sprawdzenie struktury programem FSTRUCT pokaże:
Kompilator może też dokonać przesunięcia adresu kompilacji. Do ustalenia offsetu służy rejestr o nazwie CODEOFF, znajdujący się pod adresem $B5. Wpisana tam wartość będzie dodawana do adresów wszelkich zmiennych, procedur i funkcji procesie kompilacji.
SET $000E = $2000
SET $0491 = $2000
SET $00B5 = $8000
Proc NIC=*()
Powyższy kod wyprodukuje nam kod z przesuniętymi adresami, po kompilacji i zapisaniu pliku COM program FSTRUCT pokaże:
Jak widać kompilator jest w stanie przygotować finalnie plik binarny nawet dla niedostępnych w trakcie korzystania z Action! zakresów (tutaj $A000). Rodzi się pytanie, czy można przesunąć adres kompilacji w dół? Oczywiście, jednak w Action! nie można stosować liczb ujemnych. Sztuczka polega na wpisaniu w CODEBASE wartości powodującej „przekręcenie” się 16 bitowego wskaźnika wyliczającego adresy.
W przykładzie założymy potrzebę kompilacji programu pod adres APPMHI-$1000 czyli adres $1000:
SET $000E = $2000
SET $0491 = $2000
SET $00B5 = $F000
Proc NIC()
Teraz FSTRUCT pokaże:
Owocnych kompilacji 🙂