1 Ostatnio edytowany przez skrzyp (2017-04-29 04:49:08)

Mam taki problem - chcę stworzyć program, który jest binarką relokowalną pod SDX i korzysta ze wszystkich jego możliwości i dobrodziejstw. Jednak żeby użytkownikom nieposiadającym tego systemu nie robić kłopotu, że niby uszkodzony plik czy coś, chcę wyświetlić informację o tym, że nie mają oni włączonego DOSu, lub aktualnie używany (MyDOS, DOS-XL, itd.) nie jest obsługiwany.

Poradzono mi, bym na początku kodu założył blok nierelokowalny ($FFFF) który sprawdza czy SDX jest załadowany, a potem bloki relokowalne i dalej resztę programu. Relokator powinien przejść po "RTS" z bloku nierelokowalnego do ładowania reszty bloków. Niestety - tak sie nie dzieje, w przypadku wykrycia SDX program się zakańcza i wrzuca nas z powrotem do promptu.

Pytanie brzmi - co jest nie tak? Ewentualnie, czy istnieje inne rozwiązanie kwestii detekcji SDX?

Poniżej fragment kodu o którym mowa:

                opt h+ l+ m+ r+ s+ 

printf          smb 'PRINTF'
u_getkey        smb 'U_GETKEY'

                org $2000       /* że niby tak kulturalnie niezależnie od MEMLO */
                lda $0700       /* word $0700 == "SD"
                cmp #$53
                bne no_sdx
                rts

no_sdx           /* (... procedura wyświetlająca komunikat graficzny ...) */
?loop           jmp loop

                blk reloc main
                mwa strp.hello txt.ptr
                /* (...tutaj będzie procedura usuwająca wczaeśniejszy blok z pamięci...) */
                jsr i_printf
                jsr u_getkey
                rts

i_printf        jsr printf
                .byte '%p\n',0
                .word txt.ptr
                rts

strp.hello      .word str.hello
str.hello       .word '\a\fPozdrawiam wszystkich czytajacych ten kod!',$9b
txt.ptr         .word $0000
.: miejsce na twoją reklamę :.

2 Ostatnio edytowany przez mono (2017-04-28 23:10:06)

Po bloku nierelokowalnym testującym DOS-a brakuje bloku init:

DOSVEC = $a

                blk dos $2000       /* że niby tak kulturalnie niezależnie od MEMLO */
                lda $0700       /* word $0700 == "SD"
                cmp #'S'
                bne no_sdx
                rts

no_sdx           /* (... procedura wyświetlająca komunikat graficzny ...) */
                jmp (DOSVEC)

                ini $2000

                blk reloc main

Proponuję też po wyświetleniu komunikatu o braku SDX wrócić do systemu przez DOSVEC.

Edit: I dość elegancko będzie blok nierelokowalny rozpocząć przez BLK DOS zamiast ORG.

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

3 Ostatnio edytowany przez skrzyp (2017-04-29 00:03:05)

Dzięki za informację o INI, faktycznie to może być to czego potrzebuję. Przy okazji, nie jest udokumentowane wraz z RUN w dokumentacji MADSa - a szkoda.

Chociaż nie wiem, czy to tak powinno działać, umieszczony w ten sposób INI nie powoduje przejścia do nowego nierelokowalnego bloku, lecz sprawia że kod pod $2000 wykonuje się jeszcze raz po wyjściu przez RTS, Tak przynajmniej twierdzi debugger Altirry.

.: miejsce na twoją reklamę :.

4

Już wiesz, ale dla potomności:

  blk dos $2000
  ...

  run $480
  ini $2000

  blk sparta $480
  jmp entry

  blk reloc main
entry:
  ...

I taka sztuczka załatwia sprawę, bo SDX faktycznie jeśli nie ma bloku RUN próbuje odpalić program od pierwszego załadowanego bloku (to pewnie jakaś zgodność z innymi DOS-ami).

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

5 Ostatnio edytowany przez skrzyp (2017-04-29 00:08:32)

Po kontakcie z panem mono doszliśmy do wniosku, że gdzieś czai się zły błąd i należy go obejść mniej więcej w taki sposób:

        opt o+ h+ ?+

initializer = $2000
runner = $480

        blk dos initializer
        lda #$94
        sta $2c8
        rts

        run runner
        ini initializer

        blk sparta runner
        jmp entrypoint

        blk reloc main
entrypoint:
        lda #$00
        sta $2c6
        rts

Przy okazji, w MADS nie można umieścić dyrektywy "RUN" w zaraz po bloku relokowalnym, ponieważ wciąż wydaje mu się, że jest ona wewnątrz bloku:

                run $480                                              
xxxxxxxxx.asx (60) ERROR: Illegal instruction at RELOC block
.: miejsce na twoją reklamę :.

6

mono napisał/a:

....bo SDX faktycznie jeśli nie ma bloku RUN próbuje odpalić program od pierwszego załadowanego bloku (to pewnie jakaś zgodność z innymi DOS-ami).

Standard Atari DOS

7 Ostatnio edytowany przez mono (2017-04-29 10:55:07)

Na pewno? Pamiętam, że DOS 2.5 z CP (od Chaosa) nie uruchamiał programu kiedy nie było w nim bloku RUN ($2E0).

Edit: Czy odpalanie programu bez RUN to nie jest pomysł DOS XL?

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

8

Wlasnie mam podobne watpliwosci. 2.5 bez inita/runa nic nie uruchamial.

"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

9

Poniekąd, faktycznie różnie to bywa. Być może folk'owe wersje posiadały modyfikacje, które mi wydają się normą.

A niby bez RUN powinno próbować odpalić pierwszy blok (bo jak wiecie INIT nie ma tu nic do tego) - to też raczej ponad-standard  (?)

10 Ostatnio edytowany przez mono (2017-04-30 22:32:29)

Atariki http://atariki.krap.pl/index.php/Binarny_plik_DOSu mówi, że to cecha DOS XL i SpartaDOS (X siłą rzeczy też).

Edit: Czyli może to pomysł ICD?

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

11

DOS 2.5 nie odpali bez RUNa - i słusznie.

Nie jest to udokumentowane przed MADsa - a dlaczego by miało być?

12

Vasco/Tristesse napisał/a:

Nie jest to udokumentowane przed MADsa - a dlaczego by miało być?

Ponieważ są tacy, co nie wiedzą z przyczyn róznych - a skoro tak powinno być, to chyba warto tę wiedzę przekazywać? ;)

(-)OlaHime/Nerve
{130xe:antonia4mb,sophia2,ideplus2.0revf}{65xe}{800xl}{LDWsuper2000}{1050}{CX85}

13

skrzyp napisał/a:

Przy okazji, w MADS nie można umieścić dyrektywy "RUN" w zaraz po bloku relokowalnym, ponieważ wciąż wydaje mu się, że jest ona wewnątrz bloku:

                run $480                                              
xxxxxxxxx.asx (60) ERROR: Illegal instruction at RELOC block

albo format pliku SDX albo DOS, trzeba się zdecydować

*- TeBe/Madteam
3x Atari 130XE, SDX, CPU 65816, 2x VBXE, 2x IDE Plus rev. C

14

tebe napisał/a:

albo format pliku SDX albo DOS, trzeba się zdecydować

Tyle, że ja nie zamierzam używać MADSowego relokatora. Mam blok DOS do sprawdzania obecności SDX na początku, a przykład z błedną semblacją run/ini polega na tym, że dane dyrektywy są na końcu bloku, więc nie powinno nic takiego problemu.

.: miejsce na twoją reklamę :.

15

Ola/Nerve napisał/a:
Vasco/Tristesse napisał/a:

Nie jest to udokumentowane przed MADsa - a dlaczego by miało być?

Ponieważ są tacy, co nie wiedzą z przyczyn róznych - a skoro tak powinno być, to chyba warto tę wiedzę przekazywać? ;)

To jest argument, aby całą wiedzę o Atari dokumentować w Madsie, bo ktoś może nie wiedzieć. Brawo!

16 Ostatnio edytowany przez skrzyp (2017-05-03 05:55:31)

No juz, już,  nie gorączkuj się tak ;)

Chyba logicznym jest, że fajnie by było gdyby wszystkie wbudowane makrorozkazy były udokumentowane, ew. rozwinięte. I nie mówię tu o mnemonikach 65{816,02}.

Ale nie, najlepiej dosrywać ludziom w internecie. Nie wykręcaj się, widzę że niemalże za każdym razem się odzywasz jak się odezwie ten użytkownik, którego nawet nie widziałeś na oczy.

.: miejsce na twoją reklamę :.

17

@Vascoo: W instrukcji do Madsa są te dyrektywy (RUN i INI) wymienione, ale nie są opisane. Wygląda to więc na zwykłe przeoczenie.

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

18

Może nie są, bo to wiedza z elementarza?

Skrzyp: zrób statystyki pod jakim procentem wpisów Olego się odzywam. Nie wykręcaj się. Ew. przestań kłamać. Nie mogę wiedzieć jak wygląda, bo nawet nie wiem czy rozglądać się za dziewczynką czy chłopcem.

19

Vasco/Tristesse napisał/a:

Skrzyp: zrób statystyki pod jakim procentem wpisów Olego się odzywam. Nie wykręcaj się. Ew. przestań kłamać. Nie mogę wiedzieć jak wygląda, bo nawet nie wiem czy rozglądać się za dziewczynką czy chłopcem.

Oj Waskolino, żebyś Ty miała takie problemy? Niesłychane! A Jadźka mówiła mi, że ten rudy spod 20-tki ma tatuaż! Pewnie siedział, ten huncwot!

(-)OlaHime/Nerve
{130xe:antonia4mb,sophia2,ideplus2.0revf}{65xe}{800xl}{LDWsuper2000}{1050}{CX85}

20

nie mowimy o wektorach RUNAD i INITAD co wchodzi w zakres wiedzy elementarnej ale o pseudorozkazach RUN i INI.

nie znam polityki Tebe odnosnie docow ale to powinno byc opisane tym bardziej ze w ktores wersji MADS (nie wiem czy nawet nie ostatniej) polecial z fantazja i jesli po RUN/INI sa jakies dane to zawsze MADS produkowal kolejny naglowej - po kija?

na szybko:
RUN adres
to zwykle
org $2e0
.word adres

i dlatego w przykladzie wyzej masz blad.

http://atari.pl/hsc/ad.php?i=1.