4,501

(23 odpowiedzi, napisanych Sprzęt - 8bit)

No ja to odebrałem w ten sposób, że Lizard planuje zbiorowe samobójstwo :D Ale potem, kiedy go przycisnąłem na GG, temat rozwinął, w związku z czym przyszłość wygląda nieco bardziej optymistycznie.

4,502

(123 odpowiedzi, napisanych Software, Gry - 8bit)

RAM od $C000 do $CFFF - nawet nawet, tyle że żdążyłem zauwarzyć, że full softu rozpoznaje OS'a po bajtach zaczynających się od $C000 lub kilka/kilkanaścia bajtów dalej... więc co z tym?

Masz niestety rację. No ale może zyski będą większe niż straty ... ?

4,503

(123 odpowiedzi, napisanych Software, Gry - 8bit)

Pod adresami $d1xx możnaby zostawić rejestry dla kompatybilności, a w obszarze nowych rejestrów ustawić odpowiednio dla trybu 16-bitowego '816.  :lol:  :lol:  :lol:

Rejestrów pod $d1xx nie trzeba chyba koniecznie zachowywać, w końcu cały prawie soft, który z nich korzysta, można łatwo uaktualnić, a tak na codzień potrzebne są tylko sterownikowi w ROM-ie.

4,504

(123 odpowiedzi, napisanych Software, Gry - 8bit)

Magistralę ma ośmiobitową, toteż odczyt szesnastobitowy trwa dokładnie dwa razy tyle, co ośmiu bitów. Ale liczy się też zassanie rozkazu i adresu.

Ergo, jedno LDA szesnastobitowe (i z szesnastobitowym adresem) będzie trwało tylko o jeden cykl dłużej niż odpowiednie ośmiobitowe, czyli 5 cykli, w porównaniu do ośmiu, które zjada wciągnięcie analogicznej ilości danych rozkazami ośmiobitowymi.

Wynika z tego, że przesłanie danej z rejestru IDE do pamięci - odczyt w trybie absolutnym, zapis w pośrednim indeksowanym - trwa na 6502 aż 24 cykle:

lda ide_data
sta (bufp),y
iny
lda ide_data+1
sta (bufp),y
iny

natomiast na 65c816 to samo powinno zająć tylko 16:

lda ide_data
sta (bufp),y
iny
iny

no ewentualnie do 18 przy zastosowaniu 24-bitowego adresowania. Czysty zysk.

4,505

(123 odpowiedzi, napisanych Software, Gry - 8bit)

Myślę, że 1 MB na ROM + rejestry (pół na pół) "ought to be enough for everyone"  8)  Czyli:

$000000-$EFFFFF - RAM
$F00000-$F7FFFF - ROM
$F80000-$FFFFFF - rejestry I/O

Oczywiście część tego ROM-u musi być przemapowana na $00D800-$00FFFF, bo kompatybilność, wektory przerwań itd. Ale na $00C000-$00CFFF może być RAM, nie?

65c816 jak dotąd nie ma koprocesora. Ale chyba MC 68882 by się nadał od biedy ... gdyby ktoś go umiał podpiąć.

65c816 oczywiście ma szesnastobitowe LDA/LDX/LDY/STA/STX/STY/INC/DEC itd.

4,506

(11 odpowiedzi, napisanych Software, Gry - 16/32bit)

Khm, że się wtrącę. gcc faktycznie winszuje sobie bardzo dużo pamięci i już na 14 MB mogą być problemy, a co dopiero na 4 MB. Ale to gcc 2.95.2, a kto powiedział, że koniecznie trzeba używać właśnie tej wersji?  Z tego co pamiętam dobrze działające wersje gcc to 2.7.2, 2.6.5 oraz 2.3.3. (było jeszcze 2.8.1 ale to pomyłka). Wszystkie trzy życzą sobie dużo mniej RAM-u niż 2.95.2, są nowsze niż Pure C (tak mi się wydaje - ale może ktoś sprostuje) no i kompilują C++, o ile to komuś robi.

4,507

(23 odpowiedzi, napisanych Sprzęt - 8bit)

Wysiada, bo to nie ma być bardzo śmieszne. Pomysł Lizarda - który popieram - polega na tym, żeby 1 listopada przejść się do Mariusza Geislera i ułożyć mu jedynie właściwy znaczek ze zniczy. Samo przejście się też chyba wystarczy.

4,508

(49 odpowiedzi, napisanych Software, Gry - 8bit)

Zastanawiam się nad programami dla 6502, które korzystają z dodatkowej bankowanej pamięci (PORTB). Gdyby loader wiedział o tym, ktore banki są do dyspozycji i przydzielał (na sugestię) bloki pamięci rozszerzonej, a program używał tych przydzielonych banków to nie trzeba byłoby wybierać banków, nie ma napisywania ramdysku itp.

No ja to szczerze mówiąc widzę tak, że w momencie, kiedy dostaniesz x megabajtów pamięci liniowej, adresowalnej wprost, jeszcze w dodatku szybkiej, wtedy rozszerzenia starego typu po prostu przestaną być potrzebne. Może się będzie od biedy wykorzystywać tę pamięć na buforowanie zapisu na twardziel, ale innych zastosowań nie widzę.

Ergo, nie ma sie co gimnastykować i dawać w nowym formacie binarnym jakiegoś szczególnego supportu dla bankowanej pamięci. Jeśli o mnie chodzi - umówmy się, że najwyższą fazą rozwoju systemów operacyjnych zamkniętych w 64 kilobajtach jest SpartaDOS X - która ma dla bankowanej pamięci support prawie perfekcyjny - i ... zostawmy to po prostu tak jak jest.

Mój komputer, odkąd mam twardy dysk, ma 176 kilobajtów niepotrzebnej pamięci. Jest 64k podstawowe plus Sparta X zajmuje jeden bank pamięci, co daje razem 80k. Reszta się leży odłogiem.

Nie do końca o to mi chodziło, ale nowy sposób ładowania w pętli daje rzeczywiście nowe możliwości, np. umieszczanie porcji programu w różnych rodzajach pamięci.

Nie jest on taki znowu nowy, pliki $FFFF są ładowane dokładnie tak samo. Ale przyznaję ci rację, że to jest wynalazek wart zachowania.

Chodzi Ci chyba o komunikację między procesami - tego faktycznie nie ma. Ale w przypadku SDX jeden program może udostępniać funkcje innym, zewnętrznym programom. Ich programiści nie muszą wcześniej wiedzieć pod jaki adres skoczyć, co w przypadku relokacji jest ważne.

Tak jest, wiem o tym, jest to załatwione za pomoca symboli. Weź jednak pod uwagę, że symbole są trudne do zachowania - w tej roli - na 65c816, gdzie JSR "krótki" (16-bitowy) i JSR "długi" (24-bitowy) to są dwa oddzielne rozkazy, wymagające w dodatku różnych rozkazów RTS przy powrocie.

Dlatego jedynym sensownym rozwiązaniem dla systemu operacyjnego itp. jest wołanie funkcji przez przerwanie programowe (COP).

Mechaniżm symboli w SDX do złudzenia przypomina natomiast biblioteki DLL, które firma M. wprowadziła dobrych kilka lat później :lol:

Może Bill The Great kupił sobie 800XL. Idea plug&play też się pojawiła dobre 12 lat po tym, jak Atari Inc. wymyśliło "nowe urządzenia".

Jeżeli loader przydziela pamięć, to może się okazać, że istnieją dodatkowe warunki tego przydziału.

Tak jest, może się tak okazać. Ja zakładam jednak optymistycznie, że nawet Antic - z jego czterokilowym ograniczeniem - kiedyś wyjdzie z użycia. Dlatego nie uważam, żeby miało sens dostosowywanie formatu binariów do Antica akurat. Ostatecznie można to łatwo rozwiązać programowo. Jak kiedyś na Falconie potrzebowałem bloku pamięci z wyrównaniem do granicy 64 kilobajtów, to obeszło się bez supportu systemowego, wystarczyło że system w ogóle był w stanie zaalokować blok pamięci, dalej poradziłem sobie sam.

4,509

(49 odpowiedzi, napisanych Software, Gry - 8bit)

No właśnie, a jeżeli będzie już tworzona przez kompilator, to może warto się zastanowić, czy nie wykorzystać tego do bardziej zaawansowanych celów niż sama relokacja. Chodzi mi tu o dwie rzeczy: współpracę między załadowanymi programami oraz zarządzenie pamięcią. To pierwsze już (jak piszesz) jest w postaci symboli.

To już jest up to you, do czego co wykorzystasz.

Jeżeli mamy >64kB pamięci, to może też rozwiązać odwieczny problem wykorzystania dodatkowych banków w taki sposób, aby to loader, a nie program decydował, które banki należy przydzielić?

To chyba oczywiste: jeśli nie ma adresu ładowania wykazanego w nagłówku, to loader decyduje. Zauważ, że preselekcja rodzaju pamięci w nagłówku - zdaje się że napisałem coś o tym poprzednim razem - ma mieć charakter sugestii, a nie wiążącej decyzji. Wyobrażam sobie to w ten sposób, że jesli flaga sygnalizuje żeby program załadować do RAM-u powyżej 64k, to loader ma to zrobić, o ile ta pamięć istnieje i jest w niej miejsce. W przeciwnym razie ma spróbować wpakowac program do pamięci podstawowej i poddać się dopiero, kiedy to też się nie uda.

Zresztą to nie jest mój wynalazek, tak to jest zrobione na Atari ST.

A może przy 65816 nie dałoby się umieszczać pewne programy z innym PBR, tak aby miały do dyspozycji więcej ramu? (popraw mnie jak się tego nie da zrobić).

Da się, ale nie wiem, czy to jest potrzebne. To znaczy w przypadku naprawdę dużych programów, kiedy masz np. segment TEXT 64k, to wiadomo, że segmenty DATA i BSS znajdą się w innym banku. Wtedy można założyć, że loader ustawia - automatycznie - bank kodu na ten, gdzie jest TEXT, a bank danych na ten, gdzie jest DATA/BSS. Alternatywą jest pełne adresowanie (będzie wolniej), które i tak będzie konieczne w przypadku programów jeszcze większych...

Albo wyrównanie kodu do granicy strony, ale nie po to, by załatwić dzielone adresy, ale np. by precyzyjnie liczyć cykle?

Wybacz, ale rozważania PO CO kazać wyrównywać adresy do granicy stron naprawdę trochę wybiegają poza główny nurt tej dyskusji (oględnie mówiąc). Wystarczy, że może się to przydać - a już konkretnie komu do czego, to nie nasza sprawa w tej chwili.

To chyba mylisz komunikację między programami z obsługą wywołań systemu. W SDX jest to przyznaję rozwiązane bardzo pomysłowo, ale niewiele ma to wspólnego z tematem.

Nie mylę, bo możesz napisać dwa programy relokowalne, załadować je równocześnie i wzajemnie wywoływać funkcje za pomocą nowych symboli.

Ale to będzie jeden program, bo nie mamy multitaskingu. Jeśli jeden program wykorzystuje drugi jako zestaw podprogramów do wywołania, to trudno doprawdy nazwać to komunikacją pomiędzy programami.

4,510

(49 odpowiedzi, napisanych Software, Gry - 8bit)

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.

4,511

(49 odpowiedzi, napisanych Software, Gry - 8bit)

Jezeli juz bysmy taki mieli, to dlaczego plik relokowalny musialby byc taki ubogi?Dlaczego by nie wprowadzic np. koncepcji zmiennych systemowych, czyli symboli, ktore normalnie w asemblowanym kodzie bylyby deklarowane jako zewnetrzne i podczas ladowania system (loader) przypisywalby im konkretne wartosci jak np. rozmiar dodatkowej pamieci, rodzaj procesora, czy chociazby numer banku

Bazując na poprzedniej dyskusji wprowadziłem do nagłówka nowe pola definiujące nowe bloki danych. Między innymi jest tam blok dla symboli zewnętrznych. Tak więc to jest załatwione. W ogóle wprowadziłem do pierwotnej propozycji dużo zmian, i mogę je tu przedstawić, o ile jesteś ciekaw.

Wiem, ze troche zagalopowalem sie teraz z fantazjowaniem, ale wg mnie relokowanie ma najwiekszy sens przy obecnosci rozbudowanego srodowiska systemowego, ktore w polaczeniu z duzym potencjalem formatu pliku dawaloby wielkie mozliwosci.

Z tym rozbudowanym środowiskiem trochę przesadziłeś. Powiedzmy, że relokacja jest niezbędna jeśli OS ma mieć jakiś mający ręce i nogi system zarządzania pamięcią: czyli funkcje malloc() i mfree(). Przejście z 6502 na 65c816 jest chyba dobrą okazją do wprowadzenia takiego mechanizmu dla pamięci powyżej $00FFFF (dla tego co poniżej nie ma to chyba sensu ze względu na kompatybilność).

Brak malloc()/mfree() zamyka możliwość wprowadzenia multitaskingu raz na zawsze, ze względu na konflikty.

Do takich celow proponowany przec Draco format w zupelnosci wystarcza i nawet nie musimy zawracac sobie glowy jakimis segmentami DATA czy BSS, bo ich przydatnosc wydaje sie wtedy watpliwa.

Niemniej format uzupełniłem o te segmenty :D

4,512

(49 odpowiedzi, napisanych Software, Gry - 8bit)

Analiza zwykłego kodu maszynowego i na tej podstawie relokacja nie wydaje mi się najlepszym rozwiązaniem. Daje stosunkowo ubogie możliwości w porównaniu do sytuacji, gdy asembler wie, że ma utworzyć kod relokowalny i sprawdza ew. konflikty oraz dostarcza dodatkowych możliwości programiście.

Chłop swoje, czort swoje. Trub, czy możesz mi logicznie wytłumaczyć, skąd ci się wzięła uporczywie przez ciebie lansowana koncepcja, że proponowany przez mnie format pliku relokowalnego nie może być, bądź też ma nie być tworzony przez kompilator?

Jeśli mi nie odpowiesz na to pytanie, tak żeby odpowiedź miała ręce i nogi, to kończę dyskutowanie z tobą; bo jak dotąd ja ci mówię A, a ty wyciągasz z tego wniosek, że nie A, tylko B. W ten sposób możemy gadać długo i bezowocnie, szkoda czasu.

Poza tym problem relokowalności wydaje mi się tylko jednym z elementów więszej całości jakim byłby pewnie system operacyjny,

Tak jest, ale o systemie może podyskutujemy kiedy indziej, żeby nie rozwadniać.

który mógłby obsługiwać programy relokowalne, np. umożliwiał komunikację pomiędzy nimi. W tej chwili tylko SDX potrafi to zrobić (za pomocą symboli).

To chyba mylisz komunikację między programami z obsługą wywołań systemu. W SDX jest to przyznaję rozwiązane bardzo pomysłowo, ale niewiele ma to wspólnego z tematem.

Może lepiej więc byłoby się zastanowić PO CO chcemy nowy format i czy napiszemy nowego OSa (oczywiście wielozadaniowego), asemblera a wtedy zastanówmy się jaki format binarki.

Odpowiedzi na te pytania znajdują się w poprzednich postach wątku. Po co chcemy nowy format:

1) mnie jest potrzebny format relokowalny, żeby uzyskać maksimum wolnej pamięci dla SysInfo;

2) format SDX się nie nadaje do tego celu (adresy dzielone);

3) przy okazji format można lepiej zdefiniować i szerzej wykorzystać; dlatego w ogóle poddałem to pod dyskusję.

Relokatora z TA możesz sobie uzywać sam, jeśli cię to satysfakcjonuje.

4,513

(49 odpowiedzi, napisanych Software, Gry - 8bit)

Nie mówię o pisaniu pod Spartę, tylko użycie formatu tego DOSa (a raczej koncepcji relokowania) także dla innych systemów. Wydaje się, że załatwia on w tej chwili większość problemów.

No ale ja nie mam ochoty używac formatu Sparty dla Sysinfo (bo wymagałoby to zmian w kodzie programu), a jeśli mam go - format Sparty - i tak modyfikować, to wolę coś takiego zdefiniować od nowa.

W końcu stary loader nowego formatu i tak nie będzie rozpoznawał, czy ten format będzie zupełnie nowy, czy będzie modyfikacja któregoś ze starych.

Ładujesz go do pamięci, a przy wyjściu mówisz systemowi, że część zajętą przez procedurę instalacyjną należy zwolnić.

Nie rozumiem, tzn. programista ma o to zadbać?

No pewnie, że programista. A pod SDX flagę INSTALL duch święty ustawia? :D

Zgadza się, tak się w tej chwili najczęściej robi, ale można też użyć obu relokowalnych, np. nie używając flagi INSTALL tylko ustawiając samemu MEMLO. Wtedy odpada problem szóstej strony, o którym piszesz.

Masz rację. Ale rozbudowa loadera tylko w tym celu to jednak overkill.

Laoo: podzielam Twoje wątpliwości.

Jakoś nie widzę, żeby Laoo miał jakieś wątpliwości - przynajmniej ze mną się nimi nie podzielił.

4,514

(49 odpowiedzi, napisanych Software, Gry - 8bit)

Draco, cały czas wydaje mi się, że próbujesz dostosować format do możliwości jakie daje MAE.

Nie bardzo widzę, na jakiej podstawie może ci się tak wydawać.

Do możliwości jakie daje MAE (MAC/65, QA, cokolwiek) dostosowany jest program mkrel.com. Nie byłby on potrzebny, gdyby asembler od razu generował kod docelowy.

4,515

(49 odpowiedzi, napisanych Software, Gry - 8bit)

esli 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.

Akurat z tego punktu widzenia przykład Lizarda nie jest najszczęśliwszy. Co ma robić kompilator: kompilator ma skompilować wszystko tak, jakby było pod adres $0000 (lub ewentualnie $000000). Po czym ma wygenerować listę fixupów, czyli offsetów do słów i długich słów wewnątrz programu, do wartości których nalezy po załadowaniu pliku dodać adres ładowania.

Koniec, kropka.

Napisałem poprzednio, że relokacja ma być transparentna dla programu. Rozwinę to teraz: dla programisty też. Ciebie, jak programisty, nie obchodzi pod jaki adres system operacyjny załaduje program, który piszesz, oraz w jaki to sposób zrobi. Żadnych specjalnych dyrektyw w kodzie źródłowym, dzielących dane na "relokowalne" i "nierelokowalne" ma nie być.

Po prostu relokowalne jest wszystko (i tylko to) co jest zdefiniowane jako adresy wewnętrzne programu. Czyli:

fopen kod
    kod
    kod
    rts

...

    jsr fopen

deklaruje etykietę 'fopen' jako adres wewnętrzny, czyli tym samym argument jsr podlega relokacji. Ale:

cio = $e456
...
    jsr cio

deklaruje etykietę 'cio' jako adres absolutny, czyli tym samym argument jsr nie podlega relokacji (a w kodzie wynikowym asembler ma wstawić literalnie $20,$56,$e4 i nie generować fixupa).

Ale programista o tym ma nie myśleć.

Być może są jakieś przeszkody żeby tak zrobić, ale przeszkody są po to, żeby o nich dyskutować (i je usuwać ;-)).

4,516

(49 odpowiedzi, napisanych Software, Gry - 8bit)

mkrel.com wymaga jako danych wejściowych dwóch kopii tego samego pliku binarnego skompilowanych pod różne adresy. Jest to jedyna metoda na znalezienie wszystkich wewnętrzych referencji, o ile ich położenie nie jest znane skądinąd. A nie jest :)

4,517

(49 odpowiedzi, napisanych Software, Gry - 8bit)

Myślałem że masz jakiś ciekawy pomysł, stąd te 16MB  :rolleyes:

Pomysł polega na tym, że skoro już mamy więcej niż 64k pamięci, oraz życzymy sobie (Laoo np.) żeby był możliwy podział pliku binarnego na segment TEXT, DATA, BSS itp., to żeby rozmiaru tych segmentów sztucznie nie ograniczać.

O ile mi wiadomo, Atari ST na przykład zostało zaprojektowane na 4 MB pamięci. Jednak format pliku binarnego DRI (ten od plików PRG) pozwala teoretycznie na zbudowanie pliku o wielkości do 4 GB. Czy ewentualne pytanie do projektanta tego formatu, na co zamierza wykorzystać te 4 GB, albo czy ma na to jakiś pomysł, uznałbyś za sensowne?

Segment TEXT jest przeznaczony na kod (modyfikowany czy nie)

Ale przecież czytam w artykule: "This doesn't allow self-modifying code in this segment."

Zgadza się, ale ani ten artykuł Biblia, ani gość jest wynalazcą podziału na TEXT/DATA/BSS.

Gościu co wymyślił ten format chciał aby można było współdzielić kod, dlatego zabrania się jego modyfikacji.

No a do tego wystarczy przecież flaga w nagłówku (jak w Atari ST pod MiNT-em: shared text bit). Modyfikacji kodu nie trzeba zabraniać. Poza tym shared text ma sens jedynie w systemie z multitaskingiem, a do tego jeszcze trochę nam zostało.

M.in. dlatego nie bardzo chciałem implementować format pisany w artykule, po tekście widać, że facet jest teoretykiem.

Zgadzam się z Lizardem, że podział na kod/dane/puste miejsce można zastosować na poziomie asemblera. W binarce na razie wystarczyłoby umieszczenie segmentów w oddzielnych blokach.

No ale przecież to właśnie przewiduje przewiduje projekt. Zauważ, że dyskutujemy o formacie pliku binarnego, a nie o tym, w jaki sposób ma go produkować kompilator. Lizard dał ci przykład użycia dyrektyw .text, .data i .bss tak jak to jest robione na innych komputerach, na przykład na Atari ST, żeby daleko nie szukać. Problem w tym, że MAE czy MAC/65 takich dyrektyw nie mają.

Powtarzam, mi chodzi o rozszerzenie rozwiązań ze Sparty, a nie o istnienie dwóch równoległych formatów.

No na SpartaDOS-ie świat się nie kończy.

Program nic o niej nie wie, ale inny program może będzie musiał wiedzieć. Przykład: procedury obsługi urządzenia (rezydentne). Jakiś inny program będzie musiał je zainstalować, np. wpisać adresy do HATABS. On nie musi być rezydentem. Dlatego poprawić należy dwa programy względem siebie. Nie wiem jak to załatwić w Twojej propozycji (chyba że scalić w jeden, ale wtedy niepotrzebnie zajmujemy pamięć).

Rozwiązuje się to w ten sposób, że TSR ma tylko segment TEXT, a procedurę instalacyjną na końcu. Ładujesz go do pamięci, a przy wyjściu mówisz systemowi, że część zajętą przez procedurę instalacyjną należy zwolnić.

W SDX natomiast masz dwa segmenty w jednym pliku, z tego jeden relokowalny, a drugi nie. Ten drugi ładujesz na stronę szóstą albo piątą i szóstą i on steruje instalowaniem. Tyle że dwóch stron może zabraknąć na installer, albo mogą być zajęte na coś innego - i co wtedy?

4,518

(49 odpowiedzi, napisanych Software, Gry - 8bit)

To kwestia podłączenia MMU :p

Zresztą, wirtual i MMU na 65c816 dzisiaj jest mniej więcej tak samo prawdopodobny, jak na Motoroli 68k 20 lat temu.

4,519

(49 odpowiedzi, napisanych Software, Gry - 8bit)

No tak, rozmieszczenie segmentów jeden za drugim może świadczyc o krótkowzroczności twórców systemu, ale z innego punktu widzenia może świadczyć o dalekowzroczności: w końcu jeśli masz wirtuala i brak fragmentacji, to jest to dokładnie wszystko jedno, gdzie są segmenty. A skoro jest wszystko jedno, to najprościej je umieścić po kolei.

Oczywiście segmenty DATA i BSS można - o ile czegoś nie przeoczam - umieścić w dowolnym miejscu, definicja nagłówka tego nie wyklucza.

4,520

(49 odpowiedzi, napisanych Software, Gry - 8bit)

Nie widzę, jak z procedury przerwania można byłoby alokować pamięć bez ryzyka powalenia się wszystkiego - a co jeśli przerwanie wystąpi w środku wykonywania się - hipotetycznego jak dotąd - malloc()?

W systemie z multitaskingiem fragmentacja pamięci i tak będzie występować - bez dobrego MMU się tego nie uniknie. Natomiast w systemie bez multitaskingu mamy do czynienia z jednym programem aplikacyjnym, który po wyjściu z siebie pamięć zwalnia - a więc fragmentacja nie grozi.

Co do TSR-ów, to chyba nie ma aż tak wiele programów TSR, które z poziomu przerwania wołałyby funkcje systemu, CIO dajmy na to.

4,521

(49 odpowiedzi, napisanych Software, Gry - 8bit)

Przecież jak segmenty będą ładowane jeden po drugim, to tym samym będą ładowane w różne miejsca pamięci, nie wiem o co panu chozi :D

Jak proponujesz te "różne miejsca" zdefiniować?

4,522

(49 odpowiedzi, napisanych Software, Gry - 8bit)

A swoją drogą na co zamierzasz przeznaczyć te zaalokowane megabajty? 8)

A ty, jak instalujesz sobie w Atari rozszerzenie RAM-u, to odpowiadasz najpierw na pytania, na co zamierzasz tę pamięć wykorzystać? Co za pytanie w ogóle.

Według mnie segmenty opisane w artykule są trochę na wyrost. Dopóki ktoś nie napisze systemu wielozadaniowego do Atarki to będą używane niezgodnie z przeznaczeniem.
Bo np. segment TEXT ma mieścić kod niemodyfikowany. Tymczasem przecież często wykorzystuje się samomodyfikowację w programach. To oznacza że taki kod trzeba byłoby umieszczać w segmencie DATA ??

No nie, rozumiesz to chyba zbyt dosłownie. Segment TEXT jest przeznaczony na kod (modyfikowany czy nie), segment DATA na dane preinicjowane, a segment BSS na dane nie preinicjowane. Ale jeśli masz życzenie, możesz dane umieszczać w segmencie TEXT, a kod w segmencie DATA (jedynie w segmencie BSS nie możesz niczego umieszczać oprócz pustego miejsca). Tak więc, jeśli chcesz mieć jeden segment na wszystko (segment TEXT) - to proszę bardzo, nie ma przeciwwskazań. Jednak chodzi o to, żeby, kiedy się to wyda potrzebne, mieć możność podziału programu na te części.

Bardziej jednak podoba mi się podejście jakie jest w Sparcie: łączenie kodu relokowalnego i zwykłego, rezerwacja pamięci dają duże możliwości.

Przecież nikt ci nie zabrania korzystania z binariów Sparty X :)

Trzeba też pamiętać, że często istnieje konieczność aktualizacji adresów znajdujących się poza kodem relokowalnym. Np. przy definiowaniu nowego urządzenia w tablicy handlerów OSa lub w innych stałych miejscach trzeba umieścić adresy PO relokacji kodu. Sparta załatwia bez problemu tę sprawę.

Słucham? A gdzie tu problem? Przecież PO relokacji adresy są ustalone. Relokacja jest transparentna dla programu, on nic o niej nie wie. A poza tym relokacji podlegają jedynie adresy wewnętrzne programu (bo tylko to ma sens). Mógłbyś mi przybliżyć, gdzie tu widzisz problem?

4,523

(49 odpowiedzi, napisanych Software, Gry - 8bit)

BSS akurat jest. W Fast Assemblerze tworzysz go poprzez:

BLK EMPTY długość rodzaj_pamięci

O rozmiarze do 16 MB?

4,524

(49 odpowiedzi, napisanych Software, Gry - 8bit)

Można i tak. Nie pamiętam w tej chwili detali formatu relokowalnego SDX, no ale on i tak nie ma tego, co chciałby Laoo: segmentów TEXT/DATA/BSS itd.

Na ładowanie do banków pamięci i tym podobne bajery zarezerwowałem flagi w nagłówku, ale na razie chcę sobie poradzić z normalną pamięcią.

O napisaniu nie Y.COM, ale wręcz nowego X.COM też myślałem i zamierzam to zrobić. Ale na razie dopracowuję program konwertujący binaria. Oczywiście nie widzę większego problemu, żeby był on w stanie wyprodukować również binaria Sparty X: pliki różnią się formatem, ale nie co do zasady.

W ten sposób można byłoby w końcu w miarę wygodnie je pisać, bez konieczności używania FA (salva reverentia auctoris, wolę MAE).

Format fixupów u mnie kompaktowy nie jest, ale za to jest najprostszy możliwy (z punktu widzenia loadera). Ale żeby się do tego nie ograniczać, dodałem na początku bloku fixupów kod ich formatu. W ten sposób - teoretycznie - program będzie mógł mieć taki format fixupów, jaki będzie wygodny.

Adres ładowania programu jest określany przez loader. Program kompilujesz pod adres jaki chcesz, a potem - z zachowaniem pewnej dość nieskomplikowanej procedury - przepuszczasz przez mkrel.com i już.

4,525

(49 odpowiedzi, napisanych Software, Gry - 8bit)

Bo format Sparty X, o ile mi wiadomo, ma ograniczenie odnośnie dzielonych adresów, na przykład. Poza tym jakaż to "część kodu" jest gotowa w tym przypadku?