no to juz wiem co mam dodac do asemblera, DATA, TEXT, BSS :) i pewnie REL aby zasygnalizowac ze piszemy relokowalny
Nowy format pliku binarnego ? Jak dotad jedynie Sparta udostepnia inny format plikow binarnych i potrafi go odczytac. Powstaje pytanie co bylo pierwsze kura czy jajko ? Najpierw powstaje format pliku binarnego a potem DOS, OS, czy może to niezbyt własciwa kolejnosc ?
Przyklad Lizarda:
.text
lda vfname
ldx vfname+1
jsr fopen
.data
vfname .rw fname ; relocatable word ;)
fname .by "D:nazwa.ext"
.text
fopen sta $0314
stx $0315
Jesli blok TEXT (jeden za drugim) zostanie umieszczony pod $2000, a blok DATA pod $9000, dodatkowo 'vfname' zostanie zmodyfikowane bo jest typu .rw to czy rozkazy w bloku TEXT odwolujace sie do 'vfname' tez zostana zmodyfikowane, powinny byc bo inaczej ten przyklad nie zadziala.
A czy nie prosciej byloby zalozyc, ze relokowalne sa wszystkie odwolania w obszarze bloku. Zakladamy ze program relokowalny miesci sie poza obszarem strony zerowej i w pewnych granicach pamieci, np. $0400-$BFFF
Jesli adresujemy w obrebie programu to te rozkazy beda poddane relokacji, poza w/w zdefiniowanym obszarem nie beda poddawane relokacji (w koncu nie mozemy dopuscic aby program ladowal sie np. na caly stos czy w inne obszary ktore potrzebuje OS do dzialania)
rel ; informacja dla asemblera, ze teraz leci relokowalny kod i zeby zaczal go kontrolowac
lda vfname ; relokowac bo adresowanie w obrebie programu
ldx vfname+1 ; relokowac bo adresowanie w obrebie programu
jsr fopen ; relokowac bo adresowanie w obrebie programu
vfname adr(fname) ; relokowac, bo to adres adr() czy tez .rw
fname .by "D:nazwa.ext" ; nie relokowac, bo zaden rozkaz
; nie odwoluje sie do 'fname', rozkazy typu adr i .rw nie sa brane pod uwage
fopen sta $0314 ; nie relokowac bo adresowanie poza programem
stx $0315 ; nie relokowac bo adresowanie poza programem
Asembler domyslnie zasembluje od najmniejszego dozwolonego obszaru ($400), koniec sam okresli po asemblacji, jesli jakis tryb adresowania odwola sie ponizej $400 i powyzej dlugosci programu nie bedzie relokowalny, pojawi sie ostrzezenie. Ofsety do bajtow ktore maja zostac poddane relokacji zostana umieszczone w tablicy na koncu wczytywanego bloku razem z informacja czy modyfikowane jest 16bit czy 24bit.
OS zacznie czytac taki plik, odczyta naglowek, w ktorym bedzie informacja o dlugosci bloku i jego rodzaju w tym przypadku blok relokowalny. Na podstawie dlugosci bloku zarezerwuje obszar pamieci zaczynajacy sie od MEMLO, wczyta tam blok. OS zacznie czytac nastepny blok ktory jest tablica ofsetow. Procedury OS zaczna modyfikowac wczytany blok na podstawie tablicy ofsetow. W tablicy ofsetow powinna znalezc sie informacja czy ofset wskazuje na wartosc typu 16bit czy 24bit.