51

Istnieją dwa wektory, które należy właściwie ustawić z punktu widzenia obsługi RESETu. Są to: DOSVEC (słowo 10 czyli $a) oraz DOSINI (słowo 12 czyli $c). Po naciśnięciu klawisza RESET system operacyjny wykona skok do procedury znajdującej się pod adresem zapisanym w DOSINI.

Wlasnie sobie o tym przypomnialem, i stad pytanie, jak przygotowac procedury powrotu do dosu, skoro moze to zostac wywolane zarowno przewidziana w programie opcja wyjscia, jak i klawiszem RESET.
Nakresle pewien plan, prosze mnie poprawic, jesli cos zauwazycie nie tak.
DOSINI podmieniamy na procedure "wyjscia z programu", czyli przywracajaca sprzed wywolania programu wartosci rejestrom systemowym jakie ruszalismy. Dotyczy to takze wywolania GR.0 oraz przywrocenia wektora DOSINI. Czyli, ta sama procedura wyjscia z programu dla obu opcji wyjscia z niego. Dobrze?

Zmieniamy temat i kolejne pytanie, tym razem dotyczace Sparty, a konkretnie mozliwosci namierzenia tablicy T_ bez odwolywania sie do wersji dosa. Nie jest nigdzie zapisany adres ktoregos z elementow tej tablicy, tak aby mozna bylo przeliczajac odleglosci wzgledne "dotrzec" do interesujacych nas wpisow w tej tablicy (dla mnie istotny bylby adres masek przelaczajacych banki)?
Skad pytanie? Wersje Sparty moga byc teoretycznie rozne od podanych dwu, a wowczas adres tej tablicy staje sie niemozliwy do okreslenia. Poza tym byloby prosciej posluzyc sie w programie adresem posrednim typu ($a),y, niz wartosciami bezwzglednymi.

52

Wektora DOSINI nie zmieniasz. DOSINI dotyczy procedury Reset, czyli wciśnięcia klawisza, lub skoku do $E474, lub $E477. Procedura Reset ustawia wszystko sama bez pomocy użytkownika. Byłoby to wygodne rozwiązanie zakończenia programu, gdyby nie fakt, że przy okazji inicjowane są na nowo wszystkie urządzenia. A to jest już czynność co najmniej niepożądana.

Wektora DOSVEC również nie dotykasz, gdyż jest to wektor procedury powrotu do DOS-u po zakończeniu programu. Wszystkie przywrócenia systemu do stanu pierwotnego wykonujesz przed skokiem przez DOSVEC.

[ Dodano: 06.05.2005 10:20:26 ]
W SpartaDOS od 4.18 do 4.20 tablica T_ siedzi pod adresem $0902, w 4.21 i 4.22 pod $904. Niezależnie od wersji dla Atari XL/XE 4 bierwsze bajty są równe zero. Od biedy można przyjąć, że T_ zaczyna się od czterech zer. Jeśli są one pod $0902, to pod tym adresem jest właśnie początek T_, a jeśli pod $0904, to adresem jest $0904. :)

Przy czym, jest to NAJGORSZE rozwiązanie z możliwych! Ale niestety najprostsze. Nie jest powiedziane (a nawet jest pewne), że w kolejnych wersjach SDX adres nie ulegnie zmianie.

Niestety, jedynym dojściem do T_ jest odwołanie do symbolu, a jego położenie jest zmienne. Problem da się jeszcze obejść w dość prymitywny sposób:

dosvec   = $0a
jext_on  = $07f1
jext_off = $07f4

portb    = $d301
nbnks    = 29

    lda (dosvec),nbnks
    beq nom
    lsr
    lsr
    pha
    tax
lp0 clc
    adc #4
    jsr jext_on
    lda portb
    sta banks,x
    jsr jext_off
    sbc #1
    dex
    bpl lp0

    pla
    tax
    lda #$ff
lp1 and banks,x
    dex
    bpl lp1
    eor #$ff
    clc
    rts
nom sec
    rts

Po takim zabiegu znacznik C=0 informuje, że jest dodatkowa pamięć, dla której bity przełączające ustawione są w akumulatorze (1), a grupy banków zapisane są w Twojej tabeli banks (można ją rozszerzyć do ogólnie stosowanej postaci). Jeśli C=1, to oznacza, że albo nie ma dodatkowych banków, albo wszystkie są zajęte (co na jedno wychodzi).

[ Dodano: 06.05.2005 10:40:46 ]

Lizard, jesli sie zgodzisz, to chetnie zastosuje w programie Twoja procedure

Po to je tu zamieszczam, by każdy chętny mógł z nich skorzystać, a nie tylko podziwiać. ;)

Zawsze mam rację, tylko nikt mnie nie słucha.

53

nbnks    = 29

    lda (dosvec),nbnks

Lizard, od kiedy istnieje taki tryb adresowania?  :P

[ Dodano: 06.05.2005 13:12:40 ]
Marok, cytat o wektorach dotyczy cię, jeśli piszesz DOS. Jeśli piszesz zwykły program, to wektorów DOSINI i (zwłaszcza) DOSVEC nie dotykasz. DOSINI możesz ewentualnie zmienić, jeśli twój program ma być odporny na RESET, ale nie polecam tego, bo jak juzer chce naprawdę zrobić RESET, to i tak zrobi, a tylko go niepotrzebnie zdenerwujesz.

KMK
? HEX$(6670358)

54

Ponownie ladna procedurka Lizarda, za ktora naleza sie brawa.

Rozumiem, ze jext_on i jext_off maja stale miejsce w Sparcie niezaleznie od jej wersji, co jest bardzo wazne w odniesieniu do zmiennej wartosci adresu tablicy o jaka nam chodzi. Cenne spostrzezenie.
Wewnatrz tych spartowych procedur, podejrzewam, ze dostep do adresu, odpowiednio do wersji, $906 lub $908 (T_+4), odbywa sie za pomoca adresacji bezposredniej (indeksowej Y najpewniej), bo inaczej adres tej tablicy znajdowalby sie gdzies na stronie zerowej i mozna byloby to wykorzystac.
Jext_on ustawia bank xxxx00xx (dot. watrosci >=4; zgaszone bity, to wniosek jeszcze z pierwszej procki Lizarda) z grupy bankow rozpoznanych przez Sparte i wkazanych w tablicy na wejsciu przez akumulator. Rej. X pozostawia bez zmian.
Jest_off wylacza bank aktywny (i przelacza go pewnie na bank podstawowy) oraz pokazuje na wyjsciu w rej. A indeks z tablicy odpowiadajacy bankowi wylaczonemu.

W procedurze Lizarda, liczba zapalonych bitow akumulatora na wyjsciu okresla wielkosc dostepnej pamieci. Oprocz tego ta czesc procedury mowi nam, ze bity ROM i Basica oba sa zapalone w wartosciach bankow w T_+8 (maski), co mnie tez interesowalo.

Jesli sie pogubilem we wnioskach, to przepraszam. Smiale teorie, nie zawsze sa trafne. ;)

[ Dodano: Pią Maj 06, 2005 3:09 pm ]
Odnosnie wektra DOSINI. Moja watpliwosc wziela sie ze zwyklej niewiedzy na temat znaczenia klawisza RESET w komputerze wogole. Bo sadzielem, ze ma on prowadzic w dosie do powrotu do systemu, a jest czyms wiecej, co powinna sugerowac juz sama nazwa, inicjacja systemu, czyli przywroceniem pierwotnych ustawien (MEMLO dla przykladu).

55

W SpartaDOS od 4.18 do 4.20 tablica T_ siedzi pod adresem $0902, w 4.21 i 4.22 pod $904.
Przy czym, jest to NAJGORSZE rozwiązanie z możliwych! Ale niestety najprostsze. Nie jest powiedziane (a nawet jest pewne), że w kolejnych wersjach SDX adres nie ulegnie zmianie.

Ale to chyba zadziała we wszystkich istniejących wersjach SDX:

         LDA COMTAB+1
         STA T_ADR+1
         LDA COMTAB
         STA T_ADR
         SEC
         SBC #$56
         STA T_ADR
         LDA T_ADR+1
         SBC #$01
         STA T_ADR+1
         RTS

T_ADR    DTA A($FFFF)  * i tu będziemy mieli adres tablicy T_ ($902 albo $904, zależnie od wersji)

Teoretycznie offset -$156 oczywiście może się zmienić w przyszłej oficjalnej wersji (ale nie w 4.30 ;)).

Rozumiem, ze jext_on i jext_off maja stale miejsce w Sparcie niezaleznie od jej wersji

Tak, zawsze $7F1 i $7F4

56

Kod:
nbnks    = 29

    lda (dosvec),nbnks


Lizard, od kiedy istnieje taki tryb adresowania?

No co Ty!? Nie znasz trybu pośredniego z przesunięciem. ;)

Jext_on ustawia bank xxxx00xx

Tak, dokładnie. bity 2 i 3 musisz już sobie sam ustawić. Jedna tylko uwaga: jeśli Sparta pracuje w trybie Banked, to siedzi w banku xxxx11xx należącego do ostaniej grupy w T_.

Teoretycznie offset -$156 oczywiście może się zmienić w przyszłej oficjalnej wersji (ale nie w 4.30 ).

Też szukałem jakiejś zależności pomiędzy i pewnie bym ją znalazł, gdy właśnie nie fakt, że może się to zmienić z przyszłości.

Zawsze mam rację, tylko nikt mnie nie słucha.

57

No co Ty!? Nie znasz trybu pośredniego z przesunięciem. ;)

Znam, ale nie na tym procesorze :P  :P

KMK
? HEX$(6670358)

58

Zapoznalem sie troszke z kodem obu procedur SDX jext_on i *off. Nie bardzo rozumiem potrzebe wszystkich dzialan jakie te procedury wykonuja. Jest to dosc nieczytelne poza korzyscia wynikajaca z samego faktu mozliwosci zastapienia indeksami wartosci kodujacych banki. Troche przypomina to strukture stosu, ale jakie moga plynac z tego korzysci nie potrafie dociec.

Natomiast dostrzeglem ciekawe rozwiazanie SDX w postaci zapewnienia temu dosowi w przypadku wylaczonego ROMu wykonywanie zawartych w nim procedur przerwan na zasadzie przylaczania na czas ich wykonywania ROMu i powrotu do stanu z wylaczonym ROMem po wykonaniu przerwan. Tak wiec pod SDX, tak to odczytuje, nie ma obawy przed dostepem do RAMu pod ROMem z uwagi na mozliwosc wystapienia przerwan, lub koniecznosci ich wylaczania na ten czas.
W trybie banked Sparta pozostawia wolny RAM pod ROMem, ale robi pewna ciekawa rzecz, mianowicie kopiuje standardowy zestaw znakow. Ciekawe, czy wogole z tego korzysta, czy to uklon w strone wygody uzytkownika, aby dostep do RAMu pod ROMem maksymalnie udogodnic.

Szkoda, ale poki co, wersja programu jaka opracowalem, nie dziala pod SDX. Nie bardzo wiem co konkretnie przeszkadza temu, ale bede jeszcze probowal dojsc przyczyny. Nie chodzi tu tez o doczytanie pliku konfiguracyjnego, o ktorym sie tutaj rozwodzilem tyle, ale o doczytanie wskazanych plikow.
Odpalam komenda X, poniewaz korzystam tez z obszaru $a000-$bfff.

[ Dodano: Nie Maj 15, 2005 1:29 pm ]

Natomiast dostrzeglem ciekawe rozwiazanie SDX...

Lizard pisal juz o tym wczesniej:

Chodzi Ci o przerwania sprzętowe ($FFFA-$FFFF)? Możesz je dowolnie wykorzystywać, ale na koniec przywróć je do stanu początkowego. SpartaDOS wstawia tam wektory procedur podmieniających RAM na ROM i wywołyjących właściwą procedurę rozpoznania źródła przerwania.

Moje gapiostwo.

Nie domyslilem sie takze, ze Sparta tworzy tablice "masek grup bankow" zawsze tak samo niezaleznie od liczby dostepnej pamieci i rodzaju rozszerzenia. Oznacza to, ze dostep do tej czesci tablicy T_ w zasadzie nie jest nam potrzebny, wystarczy podobna tablice umiescic we wlasnym kodzie.
Lizard juz o tym napominal, ze tablica ta jest gorzej przystosowana do rozszerzenia +256 typu Compo, poniewaz tylko dwa pierwsze wpisy z czterech dostepnych teoretycznie dla rozszerzenia pamieci tej wielkosci, jest takze uzywanych w Compo, a kolejne dwa juz nie (w Rambo nat. tak).
Prawdopodobnie Sparta sprawdza kolejne wpisy z T_+8 (grup bankow) i po napotkaniu pierwszej, ktora nie umozliwia przelaczenia banku, okresla wielkosc dostepnej pamieci.
Ciekawi mnie jeszcze taka rzecz, a pewnie jest to ogolnie znana sprawa, jak to sie dzieje, ze bit basica (7) jest uzywany do przelaczania bankow pamieci dodatkowej w niektorych rozszerzeniach (Compo 320, 1088), a jednoczesnie dostep do niego jest mozliwy?

Lizard w tym watku pisal tez o swojej poprawce do Sparty w zakresie wlasciwego rozpoznawania pamieci dodatkowej dla rozszerzenia typu Compo. Domyslam sie, ze jest to najprostrze rozwiazanie zamieniajace miejscami wpisy w tablicy T_ (konkretnie T+10 i 11 na T+16 i 17). Wowczas taka poprawka oczywiscie jest zasadna i uzyteczna, ale tylko dla atarek z rozszerzeniem Compo, natomiast wykorzystywanie SDX z ta poprawka przy rozszerzeniach Rambo, powoduje ograniczenie pamieci o polowe (analogiczna sytuacje jak bez poprawki dla Compo).

Musze tez przyznac racje Lizardowi i Draco, ktorzy sugerowali, ze korzystanie z "nielegalnych" dla SDX bankow, a nastepnie proba "dogadania" sie z urzadzeniem zewnetrznym, powoduje nieoczekiwane reakcje programu.
Sprawdzilem, ze wyrzucenie z programu procki rozpoznajacej dostepne banki pamieci oraz powstrzymywanie sie od uzywania "nielegalnych" bankow umozliwia prawidlowe dzialanie programu.

Wydaje mi sie, ze to musi byc jakis blad w kodzie SDX, ktory tak komplikuje korzystanie z pamieci dodatkowej. Oczywiscie moge sie mylic, ale chce niejako zasygnalizowac, ze warto byloby sie baczniej rozejrzec w kodzie w miejscach, ktore moga decydowac o takim zachowaniu SDX przy przelaczaniu bankow.

59

Ciekawi mnie jeszcze taka rzecz, a pewnie jest to ogolnie znana sprawa, jak to sie dzieje, ze bit basica (7) jest uzywany do przelaczania bankow pamieci dodatkowej w niektorych rozszerzeniach (Compo 320, 1088), a jednoczesnie dostep do niego jest mozliwy?

To proste. Gdy bit 4 PortB jest równy jeden, to bit 7 przełącza Basic, gdy bit 4 = 0, to bit 7 przełącza banki pamięci. Podobnie jest z bitem odpowiedzialym za SelfTest.

Lizard w tym watku pisal tez o swojej poprawce do Sparty w zakresie wlasciwego rozpoznawania pamieci dodatkowej dla rozszerzenia typu Compo. Domyslam sie, ze jest to najprostrze rozwiazanie zamieniajace miejscami wpisy w tablicy T_ (konkretnie T+10 i 11 na T+16 i 17). Wowczas taka poprawka oczywiscie jest zasadna i uzyteczna, ale tylko dla atarek z rozszerzeniem Compo, natomiast wykorzystywanie SDX z ta poprawka przy rozszerzeniach Rambo, powoduje ograniczenie pamieci o polowe (analogiczna sytuacje jak bez poprawki dla Compo).

Nie, moja poprawka jest uniwersalna i działa z każdym rozszerzeniem (od 128kB do 1088 kB, niezależnie od bitów przełączających). Z przyczyn technicznych testowałem ją tylko na swoim sprzęcie (320 kB CopmyShop) i wszystkich konfiguracjach pamięci emulatora Atari800Win. Dla każdego przypadku działała bezbłędnie. Nikt też nie skarżył się, że mu nie działa, więc wnioskuję, że jest ok. Program nie zamienia miejscami wpisów w tabeli, lecz tworzy ją od podstaw.

Procedury przełączające pamięć są skonstruowane, by nie trzeba było pamiętać w jakim "stanie" jest teraz pamięć. Przykład:
Włączasz bank SDX poprzez Ext_On, następnie włączasz jakiś inny bank tą samą procedurą (Ext_On). Teraz wywołanie Ext_Off nie wyłączy dodatkowej pamięci, lecz przełączy pamięć na bank SDX. Dopiero kolejne wywołanie Ext_Off odłączy dodatkową pamięć. Czyli jak słusznie zauważyłeś działa to na zasadzie stosu. Oczywiście przy odpowiednim zagnieżdżeniu wszystko się ładnie wysypie, więc bez przesady. ;)

Jak zauważyłeś w procedurze zmieniającej bank jest sekwencja: EOR; AND; EOR. To właśnie powoduje, że zmianie ulegą tylko bity zmieniające banki, a tekie coś jak Basic czy system pozostana w niezmienionym stanie.

Zawsze mam rację, tylko nikt mnie nie słucha.

60

Nie, moja poprawka jest uniwersalna i działa z każdym rozszerzeniem (od 128kB do 1088 kB, niezależnie od bitów przełączających).

Super robota. Mam nadzieje, ze zostanie ona uwzgledniona w opracowywanej wersji SDX.
Wniosek stad taki, ze dostep do tablicy T_ jest jednak koniecznoscia w programach uzytkowych, a nie zakladanie okreslonej konstrukcji tej tablicy.

Oczywiście przy odpowiednim zagnieżdżeniu wszystko się ładnie wysypie, więc bez przesady.

Zdaje sie jest miejsce na 16 wpisow (rowne maksymalnej liczba grup bankow). Przy zastrzezeniu, ze wpisy sie nie powtorza, nie ma obawy, ze sie wysypie.

[ Dodano: Czw Maj 19, 2005 2:00 pm ]
Problem dojscia do tablicy T_ i przetworzenia grup bankow na wartosci poszczegolnych bankow jest juz rozwiazany. Skorzystalem z podpowiedzi Truba w zlokalizowaniu danych tablicy, reszte rozwiazaly podpowiedzi Lizarda (lacznie z podanym kodem).
Obecnie probuje dodac wywolanie GR.0, ale niestety nie udaje sie to z jakis powodow. Proba wywolania konczy sie powrotem z komunikatem bledu $81.
Pierwsze skojarzenie mam takie, ze moze otwieram juz otwarty kanal (zerowy) i powinienem albo go sprobowac zamknac (pamietam, ze czytalem w TA, ze jest on zawsze otwarty i ze chyba nie mozna go zamknac), albo wywolac GR.0 z innego niz zerowy kanal (co tez nie bardzo wydaje mi sie dzialaniem poprawnym, skoro E: jest przydzielony wlasnie do kanalu 0). Co wiec robic, o ile wlasciwie interpretuje blad systemu?

61

   ldx #$00
   lda #$0c
   sta iccmd,x
   jsr jciomain
   lda #$03
   sta iccmd,x
   lda #<ename
   sta icbufa,x
   lda #>ename
   sta icbufa+1,x
   lda #$0c
   sta icax1,x
   lda #$00
   sta icax2,x
   jsr jciomain
   ...
ename .by "E:",$9b

Ewentualnie:

   jsr eopen
   ...
eopen lda $e401
   pha
   lda $e400
   pha
   rts

Ale ten drugi sposób nie jest za bardzo dobry, bo będzie włączał standardowy tryb nawet jeśli ktoś ma zainstalowany np. sterownik edytora 64-kolumnowy albo coś takiego.

KMK
? HEX$(6670358)

62

Obecnie probuje dodac wywolanie GR.0, ale niestety nie udaje sie to z jakis powodow. Proba wywolania konczy sie powrotem z komunikatem bledu $81.

Twoja interpretacja kodu jest bezbłędna w przeciwieństwie do operacji, przy wykonywaniu której dostajesz taki błąd. :twisted: $81 - channel already open. Skorzystaj z pierwszego przykładu podanego przez drac030 - dłuższy, ale zdecydowanie najlepszy.

[ Dodano: 19.05.2005 22:56:26 ]
Ciekawostka offtopiczna odkryta przez w/w we wtorek: basicowe GR. 0 otwiera jednosześnie kanały: 0 i 6. :?

Zawsze mam rację, tylko nikt mnie nie słucha.

63

No bo przeca jest jeszcze PRINT #6 dla trybow graficznych.

64

Skorzystaj z pierwszego przykładu podanego przez drac030 - dłuższy, ale zdecydowanie najlepszy.

Tak tez zrobilem i oczywiscie dziala bardzo ladnie.
Wlasnie mysle, jak w teorii powinien przedstawiac sie algorytm interepretowania nazwy tak, aby okreslic bezblednie sciezke, z jakiej program zostal wczytany (o czym juz sporo w tym watku mowilismy). Konkretnie wydaje mi sie, ze powinno to mniej wiecej wygladac tak (SDX odpada, bo 1. jest doskonalszy sposob (podany przez LZD) i mozna rozpoznajac dos zrobic odgalezienie do oddzielnej procedury, 2. nie jest w tym przypadku potrzebne wogole doczytywanie pliku konfig., po rozpoznaniu, ze mamy SDX, omijamy ten watek):

1. (addr),0 =(1,9) & (addr),1 =':'  (II+/D)
1a:TAK: 'D(1,9):'; @3b.
2. (addr),0 = 'D' & (addr),1 =(1,9) & (addr),2 =':' (MyDos)
2a:TAK: @1a.
3. (addr),0 = 'D' & (addr),1= ':' (MyDos)
3a:TAK: 'D:';
3b:TAK: sprawdzamy czy w dalszej czesci wprowadzonego ciagu znajdziemy jakis ze znakow specjalnych (':>/') i jesli tak, dodajemy do 'D[?]:' ciag znakow do znaku specjalnego wlacznie; powtarzamy sprawdzanie do znaku konca linii; @5.
4. Przyjmujemy domyslnie: 'Dn:' (n = $301 ora #$30); @3b.

5. Pomijajac nieistotna czesc ciagu (nazwe pliku wczytanego), dodajemy do 'D[?]:[path]' wlasciwa nazwe pliku konfiguracyjnego.

Objasnienie:
@x oznacza skok do punktu x;
kolejny punkt realizowany jest, jesli warunek postawiony w aktualnym punkcie nie moze byc spelniony;
(1,9) oznacza cyfre z tego przedzialu;
(addr) to adres pobrany z a$344.

65

A nie prosciej dac poprostu D:xxx.cfg :). Odczyta z domyslnego katalogu, czyli tego, w ktorym jestesmy. Ma to oczywiscie drobna wade (a moze zalete :) ), ze przy wywolaniu programu z innego katalogu (z podaniem pelnej sciezki) plik .cfg bedzie czytrany z tego wlasnie innego katalogu, a nie z tego, z ktorym jest program (ja to uznaje za zalete ;), bo mozna sobie kombinowac latwo z plikami wsadowymi i kilkoma wersjami konfiguracji, a w kodzie nie trzeba sprawdzac zadnych parametrow - bo miejsce pliku .cfg mogloby byc podawane jako parametr takze ;) )

Bla bla bla bla, bla bla bla. Bla bla bla - bla - bla. Blabla bleee.

66

Pasiu, prościej, ale gorzej. :)

marok, po wykryciu SDX uruchom moją procedurę. Pod innymi DOS-ami zrób coś takiego: ˇ odczytaj adres z ICBUFA kanału 0 ($0344) pod jakim zapisana jest nazwa (i ew. ścieżka) wpisaa przez użytkownika
ˇ odczytaj spod ICBUFL kanału 0 ($0348) ile znaków zawiera podany ciąg znaków
ˇ przeszukaj od końca (po to długość z ICBUFL) ciąg o adresie z ICBUFA na okoliczność występowania znaków ':', '>' i '<'. Te ostatni występuje w dyskowych wersjach SpartaDOS.
ˇ pierwszy napotkany znak z powyższych (patrząc od końca) jest końcem ścieżki z jakiej został wczytany program.
ˇ jeśli żaden z powyższych znaków nie występuje lub całość nie jest poprzedzona identyfikatorem urządzenia (D: lub Dn:), to jeśli DOS-em jest MyDOS wstaw przed otrzymaą ścieżkę "D:" (bez cudzysłowów), w przeciwnym wypadku "Dn:" (również bez cudzysłowów). Wartość dla 'n' znajdziesz w DUNIT ($0301).

Zawsze mam rację, tylko nikt mnie nie słucha.

67

Wyszlo mi cos takiego:

 org $2000
byte equ $fd
addr equ $fe

 lda $344
 sta addr
 lda $345
 sta addr+1
 ldx #0
 ldy #0

 lda (addr),y
 cmp #'D'
 bne *+5
 iny
 lda (addr),y
 cmp #'1'
 bcc bb1
 cmp #'9'+1
 bcs bb1
 sta byte
 iny
 lda (addr),y
 cmp #':'
 beq bb2
 dey
bb1 lda $301
 ora #$30
 sta byte
 tya
* beq bb2    ;MyDos 
 bne *+11    ;MyDos
 lda $700    ;MyDos
 cmp #'M'    ;MyDos
 bne bb2    ;MyDos
 beq bb3-2 !    ;MyDos
 lda (addr),y
 cmp #':'
 beq bb3    ;'D:'
 dey        ;=0
bb2 lda byte    ;'Dn:'
 sta nazwa,x
 inx
 lda #':'

bb3 sta nazwa,x
 cmp #':'
 beq bb4
 cmp #'>'
 beq bb4
 cmp #'<'
; beq bb4
; cmp #'/'
 bne *+4
bb4 stx byte
 inx
 iny
 lda (addr),y
 bmi *+4
 bne bb3 * MyDos zamienia znak konca linii na 0 (chyba)

 ldy #$ff
 sty $2fc * wiersz pomocniczy
 ldx byte

bb5 inx
 iny
 lda npliku,y
 sta nazwa,x
 bpl bb5

* koniec linii wlasciwego kodu procedury
* dalej - przyklad wykorzystania
pokaz sta $349
 ldx #0
 lda <nazwa-1
 sta $344
 lda >nazwa-1
 sta $345
 lda #9
 sta $342
 jsr $e456
 lda $2fc
 bmi *-3
 jmp (10)

npliku dta c'xxxx.cfg',b($9b)
 dta c'D'
nazwa equ *
 org $2e0
 dta a($2000)

Listing nadaje sie do skopiowania do pliku tekstowego i asemblacji pod xasm.
Wiersze zaznaczone 'MyDos' mozna ewentualnie usunac (w jednym wypadku trzeba odremwac). Jednak ich obecnosc zapewnia, ze plik konfiguracyjny bedzie szukany we wlasciwym katalogu, jesli wczytujac program posluzylismy sie sama tylko nazwa pliku bez identyfikatora 'D:'.
Inne dosy nie maja zapewnionej takiej odrebnej sciezki postepowania, stad zawsze podajac tylko sama nazwe pliku (ewentualnie podajac jeszcze wczesniej podkatalogi), dodawane jest domyslnie 'Dn:', gdzie n jest pobierane z $301.
Z 'n:', czy 'Dn:' na poczatku wprowadzonej sciezki, uzyskujemy 'Dn'. Podkatalogi sa oczywiscie kopiowane.

Nie przetestowalem tego zbyt dobrze (takze dlatego, ze nie znam  wyczerpujaco wszelkich mozliwosci wczytywania plikow pod roznymi dosami). Jesli ktos zauwazylby bledne dzialanie procedury, prosze o sygnal.

Lizard, zasadniczo jest to zgodne z Twoimi wytycznymi poza pewnym szczeglem technicznym (latwiej mi bylo "czytac" sciezke od przodu, niz poslugujac sie $348 robic to odwrotnie).

68

Chciałbym zapytać o inny wariant problemu.
1. Czy jesteśmy w stanie rozpoznać z jakiego urządzenia i ścieżki ładowany jest program AUTORUN.SYS (DOS2x, MyDOS, Sparta, DOS II+/D)?
2. Analogicznie dla dowolnego programu ładowanego z polecenia wsadowego?
3. Czy da się bootować nie z D: a np. z H: (w systemie jest zdaje się przewidziana możliwość bootowania z nowego urządzenia) - co wtedy z rozpoznawaniem urządzenia, z którego automatycznie załadowano program AUTORUN.SYS lub dowolny program z pliku batchowego?
Interesuje mnie automatyczne ładowanie, bo chyba nie można wtedy skorzystać z podglądania E:?

hex, code and ror'n'rol
niewiedza buduje, wiedza rujnuje

69 Ostatnio edytowany przez pajero (2009-11-19 22:36:59)

Mono - jak dostaniesz kompa (pewnie dziś electron go odbiera z poczty - swoje zrobi to odeśle) - to obaczysz QMEGa. Który może przemapować nr napędu dyskietki (swap np. D3 <-> D1, itp).

W Sparcie rozpoznasz ścieżkę, z jakiej ładowany jest plik, pod konkretny AtariDos także, ale to już inna bajka - podejście indywidualne.
Ale dla DOS II/D mamy komendę "JOB namefile". Owe "namefile" trafia do 1.sektora do obszaru 23-63 ($17-$2F). Zawsze domyślnie jest to D1:
Przykład:  D1:JOB MEMTEST.COM  -> zapisze pod $17 "MEMTEST.COM"
Podczas bootowania uruchomi się test pamięci (a z niego ESC wykona powrót do dosu).

Co do podglądania pod E:
W DOS II/D można dublować linie komend, a co drugą poprzedzać znakiem apostrofu - komentarza, np.
'UNL *.COM
UNL *.COM

Jeśli masz jakieś uwagi, to pisz. Jestem na etapie przerabiania QMEGa, zaawansowanie już spore.

70

pajero napisał/a:

Mono - jak dostaniesz kompa (pewnie dziś electron go odbiera z poczty - swoje zrobi to odeśle) - to obaczysz QMEGa. Który może przemapować nr napędu dyskietki (swap np. D3 <-> D1, itp).

O ciekawie. Ale chodzi mi o to, jak to będzie wyglądać kiedy boot będzie z nowego urządzenia bez tricków z remapowaniem właśnie.

pajero napisał/a:

Ale dla DOS II/D mamy komendę "JOB namefile". Owe "namefile" trafia do 1.sektora do obszaru 23-63 ($17-$2F). Zawsze domyślnie jest to D1:
Przykład:  D1:JOB MEMTEST.COM  -> zapisze pod $17 "MEMTEST.COM"
Podczas bootowania uruchomi się test pamięci (a z niego ESC wykona powrót do dosu).

Czyli nawet bez sprawdzania zawartości pierwszego sektora dysku można spokojnie założyć, że bootowano z urządzenia, którego numer jest w DUNIT tak, jak to opisywano parę postów wyżej w tym wątku.

pajero napisał/a:

Co do podglądania pod E:
W DOS II/D można dublować linie komend, a co drugą poprzedzać znakiem apostrofu - komentarza, np.
'UNL *.COM
UNL *.COM

Czyli to taki prompt, ale nie o to mi chodziło. Scenariusz jest taki:

Robię sobie program, który będzie ładowany automatycznie przez DOS podczas bootowania (np. jako AUTORUN.SYS). W momencie kiedy DOS przekaże mi sterowanie do tegoż programu chciałbym dowiedzieć się:
1. Z jakiego urządzenia CIO (nazwa i numer) zostałem załadowany i uruchomiony.
2. Z jakiej konkretnie ścieżki odpalony jest program AUTORUN.SYS.
Odpowiedź na 2 nie jest bardzo trudna jeśli jest to AUTORUN.SYS - ładowany z głównego katalogu na dysku. Ale diabeł tkwi w szczegółach :)
Co jeśli użytkownik zechce załadować ten program samemu z linii poleceń (mogę, jak to opisano wyżej, sprawdzić co ostatnio wpisywał w E:; ale co w przypadku kiedy  ładował program jakimś managerem...)?
A jeśli dany DOS nie ma AUTORUN.SYS'a tylko plik wsadowy, w którym mogę wpisać listę programów do uruchomienia?
Wydaje się, że problem sprowadza się więc do tego czy na jakiejś podstawie da się sprawdzić skąd nastąpiło załadowanie mojego programu, który właśnie (tuż po załadowaniu) dostał kontrolę.

pajero napisał/a:

Jeśli masz jakieś uwagi, to pisz. Jestem na etapie przerabiania QMEGa, zaawansowanie już spore.

Bardzo się cieszę - zaraz podeślę Ci jeszcze maila :)

hex, code and ror'n'rol
niewiedza buduje, wiedza rujnuje