Do nagłówka wprowadziłem następujące nowe pola:
- długość segmentu TEXT (to pole było i poprzednio, zmiana nazwy tylko)
- długość segmentu DATA;
- długość segmentu BSS;
- wielkość stosu;
- wielkość segmentu zawierającego symbole zewnętrzne;
Obecnie nagłówek wygląda tak:
- bajty 0-3: REL1
- bajty 4-5: flagi
Flagi obecnie są takie:
$0001 - LWD - 32-bitowe słowa w nagłówku (w przeciwnym razie 16-bitowe); danie 32 bitów zamiast 24 upraszcza loader.
$0002 - TSR - wiadomo;
$0004 - EXE - uruchomić program od offsetu wskazanego w nagłówku (w przeciwnym wypadku: nie uruchamiać; patrz dalej;
$0008 - INI - to samo, tylko że oczekuje się, że program wróci przez RTS oddając przy tym status wykonania (kod błędu albo $01); jeśli oba bity są ustawione, to najpierw wykonuje się INIT, a potem EXEC.
$0010 - STK - zaalokować stos o wielkości wykazanej w nagłówku; teraz mnie naszły wątpliwości, czy ta flaga jest w ogóle potrzebna.
$0020 - ZPG - zaalokować oddzielną stronę zerową dla programu;
$0040 - APG - wyrównać adres ładowania w górę do granicy stron;
$0080 - ABK - wyrównać adres ładowania w górę do granicy banków;
W starszym bajcie trzy bity kodują rodzaj pamięci, do którego należy załadować program. Powinno wystarczyć. Reszta na razie zarezerwowana.
Dalej nagłówek leci tak (słowami 16- albo 32-bitowymi, j/w):
słowo 0: długość segmentu TEXT
słowo 1: długość segmentu DATA
słowo 2: długość segmentu BSS
słowo 3: wielkość stosu
słowo 4: długość segmentu XREF
słowo 5: długość segmentu FIXUP
słowo 6: offset EXEC
słowo 7: offset INIT
bajt: wielkość opcjonalnego tekstu + tekst opcjonalny o tej wielkości.
Segment FIXUP (lista fixupów): pierwsze słowo (16 bitów) koduje format, dalej dane wyglądają w zależności od formatu. Format $0000: szesnastobitowe offsety bezwzględne licząc od początku pliku, i dla 16-bitowych adresów (co wystarcza jeśli program ma <= 64k i używa włącznie 16-bitowego adresowania wewnątrz siebie).
Segment XREF: future definition ;-) wyobrażam sobie to tak, że najpierw idzie typ symbolu, potem wielkość nazwy symbolu, potem onaż, a potem offsety w pliku binarnym, gdzie należy wstawić właściwy adres tudzież wartość. Ale to na razie zostawmy na przyszłość.
Na specjalne życzenie truba, który chce, żeby program składał się nie tylko z oddzielnych segmentów na kod i dane, ale wręcz z oddzielnie ładowanych i uruchamianych porcji kodu, można dać nastepujące zastrzeżenie co do loadera: program ten po załadowaniu pierwszego nagłówka i wszystkich wykazanych w nim segmentów, oraz ewentualnym zainicjowaniu ich, ma powtarzać te czynności w pętli aż do EOF, chyba że program zażąda przerwania tej pętli - tak jak to się obecnie dzieje, przez np. skok jmp (dosvec) z segmentu INIT, zamiast powrotu przez RTS.
KMK
? HEX$(6670358)