Mam dziwny problem z plikami wykonywalnymi mającymi wiele sekcji INIT. Najprostsza sytuacja o jakiej teraz wiem, to plik, dla którego xebin drukuje coś takiego:

  0. 2000-21AD (01AE)
  1. Init 2000
  2. 4000-47FF (0800)
  3. 2009-200A (0002)
  4. 200B-200C (0002)
  5. 200D-200E (0002)
  6. Init 2003
  7. Run 2006

Pomijając sensowność takiego pliku (jest generowany skryptem) mam podejrzenie, że przez te wiele INITów program ładuje się poprawnie tylko w DOS II+/D, a w MyDos (i potencjalnie w innych) nie. Sam tego nie obserwowałem, bo ja używam tylko DOS II+/D, ale Pasiu raportuje, że wykonuje się tylko pierwsze INIT, a potem program ładuje się do końca i nie uruchamia poprawnie. Podobnie mam też z większym programem:

  0. 2000-2378 (0379)
  1. 26FC-27E9 (00EE)
  2. 2800-2807 (0008)
  3. Init 2000
  4. 7000-8F0C (1F0D)
  5. Init 2096
  6. 7000-99D3 (29D4)
  7. Init 2096
  8. 7000-9478 (2479)
  9. Init 2096
 10. 7000-7180 (0181)
 11. Init 2096
 12. 7000-701F (0020)
 13. Init 2096
 14. 7000-701F (0020)
 15. Init 2096
 16. 7000-701F (0020)
 17. Init 2096
 18. 7000-701F (0020)
 19. Init 2096
 20. 7000-701F (0020)
 21. Init 2096
 22. 7000-701F (0020)
 23. Init 2096
 24. 7000-701F (0020)
 25. Init 2096
 26. 7000-701F (0020)
 27. Init 2096
 28. 7000-701F (0020)
 29. Init 2096
 30. 7000-701F (0020)
 31. Init 2096
 32. 7000-701F (0020)
 33. Init 2096
 34. 7000-701F (0020)
 35. Run 2091

Działa tylko pierwszy init, a pozostałe wydają się być ignorowane, a plik ładuje się cały.

Czy ktoś miałby jakiś pomysł w czym tkwi problem lub jak ten problem zdiagnozować?

2

To niemozliwe - dobrze wygenerowane inity i bloki odpalaja pod kazdym dosem:) A jak te naglowki wygladaja binarnie? Bo cos mi tu smierdzi...

"Was powinny uzbrojone służby wyciągać z domów do punktów szczepień, a potem zamykać do pi* za rozpowszechnianie zagrożenia epidemicznego" - Epi 2021
"Powinno się pałować tylko tych co tego nie rozumieją. No i nie szmatki i nie chirurgiczne tylko min FFP3, to by miało jakiś sens. U mnie we firmie, to jak przychodzi bezmaskowiec, to stoi w deszczu przed firmą" - Pin 2021

3

Hej!

Nigdy nie miałem problemów z ładowaniem plików z wielokrotnym init-em pod My-DOS, ale mam dwie uwagi:

1) czy te inity zmieniają zawartość jakichś komórek na stronie zero? nie pamiętam czy dobrze pamiętam... ale MyDOS chyba używał czegoś na stronie zero podczas ładowania pliku binarnego. Być może podczas INIT-a modyfikujesz mu coś z ważnych dla niego komórek pamięci.

2) My-DOS mało kiedy ma mem-lo poniżej $2000, trzeba go odpowiednio skonfigurować... najczęściej jest tak że jeżeli masz dużo buforów skonfigurowanych w DOS... to ten od ładowania pliku wypada gdzieś w okolicach $1Exx, $1Fxx lub nawet $2000

Myślę że z dużym prawdopodobieństwem napotykasz na problem #2

4

Oczywiście problem musi być w źle wygenerowanym pliku, tylko nie miałem pomysłu jak to ugryźć.
O ile na starość nie skapcaniałem i kod inita mam poprawny (mam teraz wątpliwość, czy wychodzenie z niego jest przez RTS czy może trzeba zrobić jakiś magiczny jmp), to wydaje mi się, że może chodzić o problem #2, bo kod inita w krótszym programie woła tylko putline (a właściwie jciomain piszące do kanału zerowego). W sumie dziwne, bo prawie każdy mój prosty programik zaczyna się od $2000, a ten problem wyszedł dopiero teraz. Jaki w takim razie jest bezpieczny adres ładowania, żeby nie przeszkadzać MyDosowi?

5 Ostatnio edytowany przez syscall (2015-01-07 22:05:27)

a) RTS jest ok.  w zasadzie nawet chyba musi zeby dos ladowal dalej.
b) wg mnie $2000 jest ok, chyba ze mydos jest skonfigurowany dosc liberalnie (faktycznie tam mozna okreslic ilosc buforow i wtedy podnosi to memlo). Ale wydaje mi sie ze mozna wymusic programowo 'gola' konfiguracje mydosa skokiem do odpowiedniej procedury w samym dosie - zrobisz to w pierwszym inicie i po sprawie :) (ale gdzie i jak to trzeba by w dokumentacji mydosa szukac - nie pamietam)

Rozwiazaniem 'chamskim' jest ładowanie od $2500 :) Tam raczej już żaden dos sie nie zapuszcza :)

"Was powinny uzbrojone służby wyciągać z domów do punktów szczepień, a potem zamykać do pi* za rozpowszechnianie zagrożenia epidemicznego" - Epi 2021
"Powinno się pałować tylko tych co tego nie rozumieją. No i nie szmatki i nie chirurgiczne tylko min FFP3, to by miało jakiś sens. U mnie we firmie, to jak przychodzi bezmaskowiec, to stoi w deszczu przed firmą" - Pin 2021

6 Ostatnio edytowany przez seban (2015-01-07 22:22:45)

1) RTS jak najbardziej OK, to jedyna dopuszczalna metoda wyjścia z INIT-a... mam nadzieję że nie zostawiasz po INIT nic na stosie.

2) $2000 jest jak najbardziej OK...  przy My-DOS (4.53/4) skonfigurowanym z 4-rema buforami... memlo wynosi $1FE8... więc Twój kod ładowany od $2000 jest bezpieczny.

Niech Pasiu sprawdzi jakie ma Mem-LO,   ew. jak jest powyżej $2000 niech wywoła opcję "O" z menu My-DOS, potem RETURN i dalej jak na screen-ie poniżej...

https://dl.dropboxusercontent.com/u/44199/MyDOS_MemLO.png

po tej operacji Mem-LO powinno wynosić $1DE8.

7

W sumie Seban moglbys przy okazji powiedziec (jesli wiesz) czy te bufory rzeczywiscie podnosza wydajnosc dosa? W dos II/d byl chyba staly 1 bufor i wszystko smigalo :) Wiem ze to chodzi o wiele otwartych plikow, ale serio - ktos uzywal? i mu to cos dalo?

"Was powinny uzbrojone służby wyciągać z domów do punktów szczepień, a potem zamykać do pi* za rozpowszechnianie zagrożenia epidemicznego" - Epi 2021
"Powinno się pałować tylko tych co tego nie rozumieją. No i nie szmatki i nie chirurgiczne tylko min FFP3, to by miało jakiś sens. U mnie we firmie, to jak przychodzi bezmaskowiec, to stoi w deszczu przed firmą" - Pin 2021

8 Ostatnio edytowany przez seban (2015-01-07 22:47:10)

Tu nie chodzi o wydajność DOS-a, tylko o tak jak napisałeś ilość jednocześnie otwartych plików przez CIO. Teoretycznie masz do dyspozycji kanały #1...#7 dla siebie, ale jeżeli masz dwa bufory ustawione w configu DOS-a to po otwarciu 3-ciego kanału dostaniesz ERROR#161 (TOO MANY OPEN DISK FILES).

Gdy dostałem stację dysków, w ROM stacji był MY-DOS, skonfigurowany tak że MEM-LO było poniżej $2000. Więc mi to nie przeszkadzało, jednak gdy pytasz o zastosowanie większej ilości buforów... to owszem korzystałem...

np. dość często używałem tego przy generowaniu różnych tablic i zapisywania ich do plików... np.

OPEN #1,6,0,"D:*.DAT" i czytałem sobie kolejne wpisy i z Directory (INPUT #1,NAME$)

potem:

OPEN #2,4,0,NAME$

następnie operacje typu

OPEN #3,8,0,"D:TABL.BIN"
OPEN #4,8,0,"D:TABH.BIN"

więc 4 bufory to było minimum dla takiej operacji.

Gdy trzeba było przekonwertować  jakąś masę plików z jednego formatu na drugi, (np. arty do Barymaga) to pisało się taki mega konwerter który tylko orał po dysku lub ramdysku generując odpowiednie pliki.

Jak zacząłem się bawić w kompresje danych to generowałem różne pliki wynikowe, np. używając innej metody kodowania bitowego do oznaczenia długości sekwencji i zapisywałem sobie 4 pliki jednocześnie, każdy używający różnych metod kodowania prefixowego.

Gdy liczyłem różne statystyki lub analizowałem sektory na dysku, otwierałem wiele plików i zapisywałem sobie informacje w różnych plikach na ramdysku. No dużo by takich przykładów mnożyć :)

Może nie było to szybkie i wydajne, ale nie miałem wtedy peceta (po prostu nie było mnie na niego stać) i wykorzystywałem to co miałem pod ręką, czyli stację... podręcznik do My-DOS, QA... Turbo BASIC XL, oraz Atari 130XE z 192KB RAM :)

9

No w sumie nigdy nie uzywalem na raz wiecej niz 2 kanalow CIO, wiec faktycznie to dla mnie nowosc :) Dzięki za wyjasnienie.

"Was powinny uzbrojone służby wyciągać z domów do punktów szczepień, a potem zamykać do pi* za rozpowszechnianie zagrożenia epidemicznego" - Epi 2021
"Powinno się pałować tylko tych co tego nie rozumieją. No i nie szmatki i nie chirurgiczne tylko min FFP3, to by miało jakiś sens. U mnie we firmie, to jak przychodzi bezmaskowiec, to stoi w deszczu przed firmą" - Pin 2021

10 Ostatnio edytowany przez seban (2015-01-07 22:55:51)

Jeszcze jedno mi się przypomniało ... pisałem jeszcze jakieś narzędzia do grzebania w plikach binarnych... część nie mieściła się w na raz w pamięci, więc napisałem coś co się zwało "FILE DIGGER", otwierało toto plik binarny do odczytu... potem analizowało poszczególne segmenty i pytało się co z nimi robić... zapisać na wyjście, olać... zapisać do oddzielnego pliku, etc.  przy pracy z różnymi rzeczami powstała cała masa jakichś pomniejszych narzędzi, linkerów i programów generujących pliki binarne... wszystko to korzystało z możliwości otwarcia wielu plików jednocześnie wraz z odczytywaniem kolejnych wpisów z "directory".

EDIT:

Wcześniej zanim mnie SoTe spacyfikował i mnie przestawił na QA... używałem MAC/65 i on podczas kompilacji potrafił otwierać kilka plików jednocześnie z dysku jak miał dyrektywy include w kodzie. Często robiłem tak że w ramdysku miałem jakieś biblioteki swoje, potem include na początku programu... i miałem większy bufor na swój głowny kod. MAC/65 był i tak nie do pobicia jeżeli chodzi o ilość kodu która mieściła mu się w pamieci... tokenizował to co się pisało... kompilator był ultra-szybki, ale edytor był koszmarny (jak w Atari BASIC)... do tego pliki które generował ... ojć... ich struktura była pomyłką... generował segmenty po 253 bajty...

Przez to musiałem napisać specjalnego tool-a do scalania takiej binarki aby zamiast np. czterdziestu 253-bajtowych segmentów został wygenerowany jeden ciągły :D

ps) Laoo... mega sorry za giga offtopic :)

11

Liczba buforów "podnosi wydajność DOS-a" tylko w przypadku SpartaDOS X. A to dlatego, że w SDX, w przeciwieństwie do takiego DOS 2 czy MyDOS-a, bufory są przydzielane do tych plików, które akurat są w robocie, a nie na sztywno 1 bufor = 1 plik. Innymi słowy, w SDX można otworzyć 16 plików na raz mimo zadeklarowania np. 3 buforów, i to będzie działało. Zwiększenie liczby buforów zwiększa ilość cache'owanych w nich danych, dzięki czemu DOS rzadziej odwołuje się do nośnika. Takie kolejkowane buffer-cache.

KMK
? HEX$(6670358)

12 Ostatnio edytowany przez seban (2015-01-07 23:03:29)

pojęcia o tym nie miałem :) jednak prawdą jest coraz okrutniejszą że człowiek uczy się przez całe życie :) dzięki temu offtopic-owi... dowiedziałem się czegoś nowego :D dzięki! :D

13

seban napisał/a:

do tego pliki które generował ... ojć... ich struktura była pomyłką... generował segmenty po 253 bajty...

Przez to musiałem napisać specjalnego tool-a do scalania takiej binarki aby zamiast np. czterdziestu 253-bajtowych segmentów został wygenerowany jeden ciągły :D

A to nic nadzwyczajnego, MAE tez tak ma :) Ale od tego ja znam dwa kolejne toole: Trawiara by Arasek i Unify by Lizard (ten drugi chyba dziala tylko pod Sparta OIDP).

Wzglednie mozna spakowac to np. Flash Packiem, ktory linkuje sasiadujace segmenty :)

14

nie miałem pojęcia że MAE również tak robi... (za późno odkryłem MAE i byłem zbyt "uwiązany" do QA), ale zawsze się zastanawiałem dlaczego MAC/65 generuje w ten sposób plik wynikowe, ale jakoś nie zdołałem zglebić tematu skąd taki mechanizm i po co. Wydaje mi się że np. Atari Assembler Editor ( Atari Macro Assembler) również generował tego typu nagłówki.

Gdy ja używałem MAC/65 to nie było mowy o flash-packu... czy innych narzędziach o których wspominasz :)
Wczytywałem MAC/65 z kasety w standardzie, lub gdy miałem już Turbo2000 to z kasety w turbo :) Potem gdy udało mi się zostać szczęśliwym posiadaczem stacji dysków do czasu poznania SoTe używałem nadal MAC/65 :)

15 Ostatnio edytowany przez drac030 (2015-01-08 14:46:38)

seban napisał/a:

dlaczego MAC/65 generuje w ten sposób plik wynikowe

Wydaje mi się, że w ten sposób jest po prostu łatwiej wygenerować plik binarny podczas drugiego przebiegu asemblacji. Pamiętam, że kiedy pisałem dla siebie asemblerek, też miałem pokusę, żeby to zrobić w ten sposób (ale ją przemogłem :) ). Nie pamiętam w tej chwili dokładnie, na czym tu owa "łatwość" dokładnie polega.

KMK
? HEX$(6670358)

16 Ostatnio edytowany przez Fox (2015-01-08 15:03:40)

Asembler zapisując plik wynikowy sekwencyjnie (bez cofania się) musi pamiętać końcówki wszystkich bloków z pierwszego przebiegu. Np.

 org $600 ; ten blok kończy się na $601
 cld
 nop
 org $2000 ; do $2002
 dex
 and $0f,x

Te końcówki bloków trzeba trzymać gdzieś w pamięci, co może być problemem, gdyby org-ów były tysiące.

Tnąc bloki na mniejsze kawałki wystarczy trzymać bufor na program wynikowy - gdy bufor się zapełni, uzupełniamy adres końcowy i zapisujemy cały bufor do pliku.

edit: ZTCP Atari Macro Assembler nie ciął bloków.

https://www.youtube.com/watch?v=jofNR_WkoCE

17

A tak, dokładnie. U mnie ta tablica mieści chyba 1024 wpisy i tyle może być orgów. Co mi przypomina, że to jest w sumie zaszłość i dawno już miałem to przenieść do tablicy symboli (która na Rapidusie ma 15 MB i tym samym praktycznie rzecz biorąc się nie kończy ;) ).

KMK
? HEX$(6670358)

18

Wróćmy możne jednak na chwilę do sedna sprawy i tematu tego wątku.

seban napisał/a:

Niech Pasiu sprawdzi jakie ma Mem-LO,   ew. jak jest powyżej $2000 niech wywoła opcję "O" z menu My-DOS, potem RETURN i dalej jak na screen-ie poniżej...

Szczerze mówiąc nie mam pojęcia jak sprawdzić memlo pod MyDosem (używam 4.53). Dla 2 oraz 4 buforów program w czasie ładowania zachowuje się identycznie. Odkryłem jednak ciekawą rzecz, bo gdy próbuję wczytać go z innego dysku aniżeli D1:, to po załadowaniu pierwszego bloku ładuje się DUP.SYS wyrzucając błąd 139. Nadmieniam, że transmisja idzie po sio2pc, z którym nie mam problemów.

19

Nie jest to pewnie najprostszy sposób, ale sysinfo to podaje.

"tatusiu zobacz, narysowałam tobie takie same coś jak na twojej koszulce" 
https://github.com/willyvmm/mouSTer
jmp $e477

20 Ostatnio edytowany przez seban (2015-01-08 20:22:02)

@Draco & Fox: dzięki za oświecenie, faktycznie ma to sens! :) teraz to jasne i logiczne

Fox napisał/a:

edit: ZTCP Atari Macro Assembler nie ciął bloków.

a to przepraszam, mogłem pomylić z EASMD... za dużo tych nazw assemblerów :)

@pasiu: możesz spróbować mojego prymitywnego programu: mem_inf.xex

u mnie to wygląda np. tak:

https://dl.dropboxusercontent.com/u/44199/mem_inf.png

21

pasiu napisał/a:

Odkryłem jednak ciekawą rzecz, bo gdy próbuję wczytać go z innego dysku aniżeli D1:, to po załadowaniu pierwszego bloku ładuje się DUP.SYS wyrzucając błąd 139. Nadmieniam, że transmisja idzie po sio2pc, z którym nie mam problemów.

Pytałem już wcześniej ale nie otrzymałem odpowiedzi, których obszarów pamięci używa kod z INIT-a, czy modyfikuje jakieś komórki na stronie zerowej i jeżeli tak to które?

22 Ostatnio edytowany przez laoo/ng (2015-01-09 12:12:02)

Krótszy program ma dwa inity. Pierwszy testuje obecność 65c816 (modyfikując tylko rejestry CPU) i wypisuje linijkę tekstu za pomocą skoku do jciomain pisząc do kanału zerowego, a drugi nie robi nic (składa się tylko z RTS), więc o ile MyDOS nie jest wrażliwy na wołanie CIO dla kanału edytora, to nie wiem co innego mogłoby sprawiać problemy.
Dłuższy już jest bardziej skomplikowany, bo program poza pisaniem po ekranie na kolejnych initach dekompresuje wczytane bloki za pomocą inflate, więc tutaj pamięć zerowa jest w jakimś stopniu wykorzystywana.
Mogę przygotować specjalne wersje programów, które odpalą się bez Rapidusa, jeżeli ktoś byłby chętny odpalić to u siebie.

No i cieszę się, że mój post wywołał całkiem ciekawą dyskusję :)

23 Ostatnio edytowany przez drac030 (2015-01-09 12:31:53)

Zaraz, zaraz. A ten MyDOS ma założony patch pozwalający mu działać w obecności dodatkowej pamięci liniowej? Bo jeśli nie, to się właśnie takie cuda będą działy. Ewentualnie trzeba w Rapidusie włączyć mirrorowanie strony zerowej pod adresami $010000-$0100FF.

http://www.atari.org.pl/forum/viewtopic … 02#p180102

KMK
? HEX$(6670358)

24

No i wszystko jasne. Twoje przypuszczenia się potwierdziły, bo gdy to uwzględniłem, wszystko pięknie się zładowało.

25

Ostatecznie: Oba programy (są to notabene flashery firmware'u Rapidusa) działają poprawnie po zmirrorowaniu strony zerowej od adresu $010000. Niestety mirrorowanie musi być dokonane przed ładowaniem flashera, gdyż wygląda na to, że jak zrobię mapowanie w pierwszym inicie, to jest już za późno.
Ostatecznie pomaga tylko patch na MyDosa z wątku na AtariAge.