Potrzebuję aby mnie ktoś tę kwestię wyjaśnił "jak krowie na rowie" :)

Sytuacja: obsługa jednego z wektorów przerwań. Jest już łańcuch XBRA i chcę się do niego wpiąć.

        .even
XBRAmagic:
        dc.b    "XBRA"
XBRAid:
        dc.b    "xxxx"      ; Your ID, Ascii letters
stary_wektor:
        dc.l    0                ;Kolejnym wektorem w łańcuchu jest adres wektora systemowego przed zainstalowaniem własnego, zmodyfikowany przez kod instalacyjny.

nowy_wektor:
                        ; Your routine here.
        ....
        move.l  XBRAoldvec,a0
        jmp (a0)        ; Link to next vector in chain

czyli o ile ja to dobrze rozumiem,  stary wektor zapisany w stary_wektor, a w jego miejsce ląduje adres do nowy_wektor ?
Tylko to, czy jest coś jeszcze ?

Było miło :) Do widzenia.

2

raczej to:

        move.l  stary_wektor,a0
        jmp (a0)        ; Link to next vector in chain

a swój nowy_wektor wcześniej zgłaszasz do #Setexc BIOSa, który zwraca Ci stary wektor

Lynx I / Mega ST 1 / 7800 / Portfolio / Lynx II / Jaguar / TT030 / Mega STe / 800 XL / 1040 STe / Falcon030 / 65 XE / 520 STm / SM124 / SC1435
DDD HDD / AT Speed C16 / TF536 / SDrive / PAK68/3 / Lynx Multi Card / LDW Super 2000 / XCA12 / SkunkBoard / CosmosEx / SatanDisk / UltraSatan / USB Floppy Drive Emulator / Eiffel / SIO2PC / Crazy Dots / PAM Net
http://260ste.atari.org

3

Rzecz w tym, że XBRA jest niejako "narzucone z urzędu", więc chciałbym się dostosować do jego zasad. Łatwiej to później śledzić.

Było miło :) Do widzenia.

4 Ostatnio edytowany przez Cyprian (2020-04-21 08:16:12)

Czy chodzi o to że chcesz się wpiąć pomiędzy istniejące XBRA?

Jeśli tak, to załóżmy że są zainstalowane dwa XBRA, czyli wyglądają tak:

Pierwszy XBRA:

        .even
XBRAmagic:
        dc.b    "XBRA"
XBRAid:
        dc.b    "PxID"
Pierwsze_stary_wektor:
        dc.l    XBRA_System

Pierwsze_XBRA:
        ; XBRA routine here.
        move.l  Pierwsze_stary_wektor,a0
        jmp (a0)

Drugi XBRA:

        .even
XBRAmagic:
        dc.b    "XBRA"
XBRAid:
        dc.b    "DrID"
Drugie_stary_wektor:
        dc.l    Pierwsze_XBRA

Drugie_XBRA:
        ; XBRA routine here.
        move.l  Drugie_stary_wektor,a0
        jmp (a0)

I teraz jak chcesz się wpiąć między nie, to Twoje XBRA powinno wyglądać tak:

        .even
XBRAmagic:
        dc.b    "XBRA"
XBRAid:
        dc.b    "MyID"
Moje_stary_wektor:
        dc.l    Pierwsze_XBRA

Moje_XBRA:
        ; Your routine here.
        move.l  Moje_stary_wektor,a0
        jmp (a0)

Na koniec, tylko podmianka w "Drugi XBRA" zmiennej "Drugie_stary_wektor" - skopiowanie starej zawartości do siebie i wstawienie swojego adresu XBRA:

        move.l    Drugie_stary_wektor,Moje_stary_wektor
        move.l    #Moje_XBRA,Drugie_stary_wektor
Lynx I / Mega ST 1 / 7800 / Portfolio / Lynx II / Jaguar / TT030 / Mega STe / 800 XL / 1040 STe / Falcon030 / 65 XE / 520 STm / SM124 / SC1435
DDD HDD / AT Speed C16 / TF536 / SDrive / PAK68/3 / Lynx Multi Card / LDW Super 2000 / XCA12 / SkunkBoard / CosmosEx / SatanDisk / UltraSatan / USB Floppy Drive Emulator / Eiffel / SIO2PC / Crazy Dots / PAM Net
http://260ste.atari.org

5 Ostatnio edytowany przez artik-wroc (2020-04-21 10:07:22)

I o to właśnie chodzi. Pozdziękował :)

Aaa, walnąłem się, chyba powinno być:

        .even
XBRAmagic:
        dc.l    "XBRA"
XBRAid:
        dc.l    "PxID"
Pierwsze_stary_wektor:
        dc.l    XBRA_System

wszak to są 4 bajty.

EDIT:
Jednej rzeczy za choinkę nie rozumiem :(
Jak wrzucę ten cały kod instalacji XBRA, to automatycznie zostaną wykonane wszystkie instrukcje z części "Your routine here.", a one mają czekać na przerwanie, tak czy piszę głupoty ?

Było miło :) Do widzenia.

6 Ostatnio edytowany przez artik-wroc (2020-04-21 17:31:03)

OK. Dzięki Cyprian za rozjaśnienie, ja po prostu siedzę w rozumowaniu a'la GFA-Basic (step by step, linia po linii) :) i czasem ciężko się przestawić.
Czyli to co powyżej to już samo wywołanie, a instalacja to będzie wstawienie adresów.
Jeżeli pod adresem $1234 siedziała wartość $5678, to $5678 = stary wektor, a pod adres $1234 ląduje adres do nowy_wektor. Chyba nie popierniczyłem :)

Było miło :) Do widzenia.

7 Ostatnio edytowany przez Cyprian (2020-04-21 18:19:35)

przykłady w ZIPie

"XBRA_ADD.s" dodaje nowy XBRA na koniec łańcucha

"XBRA_INS.s" wstrzykuje nowe XBRA pomiędzy już istniejące

daj znać czy to będzie ok.

Post's attachments

XBRA.zip 1.62 kb, liczba pobrań: 1 (od 2020-04-21) 

Tylko zalogowani mogą pobierać załączniki.
Lynx I / Mega ST 1 / 7800 / Portfolio / Lynx II / Jaguar / TT030 / Mega STe / 800 XL / 1040 STe / Falcon030 / 65 XE / 520 STm / SM124 / SC1435
DDD HDD / AT Speed C16 / TF536 / SDrive / PAK68/3 / Lynx Multi Card / LDW Super 2000 / XCA12 / SkunkBoard / CosmosEx / SatanDisk / UltraSatan / USB Floppy Drive Emulator / Eiffel / SIO2PC / Crazy Dots / PAM Net
http://260ste.atari.org

8

Pomocy, bo chyba mnie coś trafi :(
co robię źle ?
wywołanie jest w C

Supexec(install_vekt);

potem jest ten jedyny, nieszczęsny plik w asemblerze i w nim to:

install_vekt:
                move.l    #-1,-(sp)
                move.w    #29,-(sp)        ;przerwanie poziom 5
                move.w    #5,-(sp)        ;Setexc
                trap    #13 
; teoretycznie powinien tylko wrzucić aktualny adres do d0
                addq.l    #8,sp         
                rte
                dc.l        "XBRA"
                dc.l        "TEST"
vekt_old:        dc.l        0
vekt_new:        jsr            wd_interrupt    ; routine aktivieren
                move.l        vekt_old,a0        ; alten sp restaurieren
vekt_exit:        jmp (a0)

za każdym razem 2 bombki, a jak sprawdzam monitorem to adres jest zmieniony, łaj ? Czyli coś nie tak ze stosem, że zamiast -1 wrzuca jakąś wartość ? Jestem bliski rozpaczy :)

Było miło :) Do widzenia.

9

Teoretycznie .... -(sp) zmienia wskaźnik stosu .... powinien?

10 Ostatnio edytowany przez Cyprian (2020-04-26 09:01:09)

1) bomby
"Supexec" wywołuje podprogram a nie przerwanie.
RTE jest powrotem z przerwania,  zobacz czy bomby zniknął jak zamienisz na RTS

2) w zależności co chcesz uzyskać:

A)
Jeśli chcesz dodać swoje XBRA na koniec łańcucha:

install_vekt:
                pea    vekt_new
                move.w    #29,-(sp)        ;przerwanie poziom 5
                move.w    #5,-(sp)        ;Setexc
                trap    #13 
                addq.l    #8,sp

                move.l    D0,vekt_old

                rts

                dc.l        "XBRA"
                dc.l        "TEST"
vekt_old:        dc.l        0
vekt_new:        jsr            wd_interrupt    ; routine aktivieren
                move.l        vekt_old,a0        ; alten sp restaurieren
vekt_exit:        jmp (a0)

B)
Jeżeli wpiąć w łańcuch pomiędzy ostatnie a przedostanie XBRA to:

install_vekt:
                move.l    #-1,-(sp)
                move.w    #29,-(sp)        ;przerwanie poziom 5
                move.w    #5,-(sp)        ;Setexc
                trap    #13 
                addq.l    #8,sp

                move.l    D0,A0
                move.l    -4(A0),vekt_old
                move.l    #vekt_new,-4(A0)

                rts

                dc.l        "XBRA"
                dc.l        "TEST"
vekt_old:        dc.l        0
vekt_new:        jsr            wd_interrupt    ; routine aktivieren
                move.l        vekt_old,a0        ; alten sp restaurieren
vekt_exit:        jmp (a0)
Lynx I / Mega ST 1 / 7800 / Portfolio / Lynx II / Jaguar / TT030 / Mega STe / 800 XL / 1040 STe / Falcon030 / 65 XE / 520 STm / SM124 / SC1435
DDD HDD / AT Speed C16 / TF536 / SDrive / PAK68/3 / Lynx Multi Card / LDW Super 2000 / XCA12 / SkunkBoard / CosmosEx / SatanDisk / UltraSatan / USB Floppy Drive Emulator / Eiffel / SIO2PC / Crazy Dots / PAM Net
http://260ste.atari.org

11 Ostatnio edytowany przez artik-wroc (2020-04-26 09:19:01)

Wariant A: bus error

Nie rozumiem dlaczego to:

install_vekt:
                move.l    #-1,-(sp)
                move.w    #29,-(sp)        ;przerwanie poziom 5
                move.w    #5,-(sp)        ;Setexc
                trap    #13 
                addq.l    #8,sp

powoduje zmianę wartości wektora ? Skoro ma to być ino odczyt.

Było miło :) Do widzenia.

12 Ostatnio edytowany przez Cyprian (2020-04-26 09:57:40)

artik-wroc napisał/a:

Wariant A: bus error

sprawdź jeszcze czy będzie bus error po usunięcu/zakomentowaniu instrukcji " jsr            wd_interrupt    ; routine aktivieren"
Być może "wd_interrupt" generuje błąd.



artik-wroc napisał/a:

Nie rozumiem dlaczego to:

install_vekt:
                move.l    #-1,-(sp)
                move.w    #29,-(sp)        ;przerwanie poziom 5
                move.w    #5,-(sp)        ;Setexc
                trap    #13 
                addq.l    #8,sp

powoduje zmianę wartości wektora ? Skoro ma to być ino odczyt.

To jest tylko odczyt ostatniego XBRA, bez zmiany wektora.


Kod poniżej podczepia się pod istniejące XBRA

                move.l    D0,A0
                move.l    -4(A0),vekt_old
                move.l    #vekt_new,-4(A0)
Lynx I / Mega ST 1 / 7800 / Portfolio / Lynx II / Jaguar / TT030 / Mega STe / 800 XL / 1040 STe / Falcon030 / 65 XE / 520 STm / SM124 / SC1435
DDD HDD / AT Speed C16 / TF536 / SDrive / PAK68/3 / Lynx Multi Card / LDW Super 2000 / XCA12 / SkunkBoard / CosmosEx / SatanDisk / UltraSatan / USB Floppy Drive Emulator / Eiffel / SIO2PC / Crazy Dots / PAM Net
http://260ste.atari.org

13

Wyrzuciłem wszystko inne. W C zostało tylko wywołanie, a w asemblerze to:

install_vekt:
                move.l    #12312312,-(sp)
                move.w    #29,-(sp)        ;przerwanie poziom 5
                move.w    #5,-(sp)        ;Setexc
                trap    #13 
                addq.l    #8,sp

i wartość 12312312 została poprawnie wpisana.

dodałem:

dc.l        "XBRA"
dc.l        "TEST"
vekt_old:        dc.l        0

12312312 zmieniłem na #vekt_old i pojawiła się inny wpis, tylko że jak przejdę pod ten adres to nie widać żadnego "TEST" ani "XBRA" przed tym adresem, więc pewnie problem ze składnią.

Było miło :) Do widzenia.

14

czy na pewno masz zainstalowane inne XBRA? jeśli nie to Setexc zwróci adres systemowy.
Z tego co pamiętam to domyślnie TOS nie instaluje żadnego

Sprawdź czy pod adresem A1 jest ciąg znaków "XBRA"

install_vekt:
                move.l    #12312312,-(sp)
                move.w    #29,-(sp)        ;przerwanie poziom 5
                move.w    #5,-(sp)        ;Setexc
                trap    #13 
                addq.l    #8,sp

                move.l    D0,A0
                lea    -12(A0),A1    ; XBRA header --> "XBRA"
                lea    -8(A0),A2     ; XBRA id --> "TEST"
Lynx I / Mega ST 1 / 7800 / Portfolio / Lynx II / Jaguar / TT030 / Mega STe / 800 XL / 1040 STe / Falcon030 / 65 XE / 520 STm / SM124 / SC1435
DDD HDD / AT Speed C16 / TF536 / SDrive / PAK68/3 / Lynx Multi Card / LDW Super 2000 / XCA12 / SkunkBoard / CosmosEx / SatanDisk / UltraSatan / USB Floppy Drive Emulator / Eiffel / SIO2PC / Crazy Dots / PAM Net
http://260ste.atari.org

15

Krok za krokiem idę naprzód :)
Tak jak pisałem to kwestia składni. Tak jest prawidłowo i widać w pamięci nowe znaczniki pod właściwym adresem:

xb_magic:   dc.b "XBRA"
xb_id   :   dc.b "xxxx"     ;Your ID.
vekt_old:   dc.l 0          ;Storage for Old vector.
vekt_new:

każda linia MUSI mieć swój identyfikator. W sumie dobrze, że się człowiek czegoś nowego nauczy :)

Było miło :) Do widzenia.

16

no i git :)

swoją drogą co ciekawego knujesz?

Lynx I / Mega ST 1 / 7800 / Portfolio / Lynx II / Jaguar / TT030 / Mega STe / 800 XL / 1040 STe / Falcon030 / 65 XE / 520 STm / SM124 / SC1435
DDD HDD / AT Speed C16 / TF536 / SDrive / PAK68/3 / Lynx Multi Card / LDW Super 2000 / XCA12 / SkunkBoard / CosmosEx / SatanDisk / UltraSatan / USB Floppy Drive Emulator / Eiffel / SIO2PC / Crazy Dots / PAM Net
http://260ste.atari.org

17 Ostatnio edytowany przez artik-wroc (2020-04-26 20:07:25)

Jak tylko będę miał coś konkretnego zamieszczę tutaj, na razie nauka :) Dzięki za pomoc i pewnie proszę o jeszcze :)

Inna kwestia czyli nieparzyste adresy. Jak to robią eksperci ? :) Poprzedzający + przesunięcie ? Tak, aby było sprawnie.

Było miło :) Do widzenia.

18 Ostatnio edytowany przez artik-wroc (2020-04-28 16:37:20)

Pytanie tym razem dotyczy C.
Mam program, który testuje pewien obszar pamięci ST wpisując pierwej daną wartość i potem sprawdzając czy ona tam siedzi. Sam zapis zrealizowany jest tak:
    *(unsigned char*)(ram+i) = (jakaś wartość);
pętla sobie leci, ale w pamięci nic nie ląduje. Zresztą na ST powinien wyskoczyć błąd adresu przy próbie zapisu pod nieparzysty adres.
Co zostało pominięte, jakaś definicja ? A może ja coś mieszam.

Było miło :) Do widzenia.

19

możesz to uprościć. Jeśli ram jest typu unsigned char* to:

unsigned char* ram = (unsigned char*)0xabcdef;
for(size_t i = 0; i < 100000; ++i) {
ram[ i ] = value;
}

What can be asserted without proof can be dismissed without proof.

No warto to zadeklarowac jako volatile, bo inaczej kompilator może to wypotymalizować.

Atari: FireBee, (Falcon030 CT60e SuperVidel SvEthlana CTPCI), TT, (520ST Pak030 Frak PuPla Panther), (520ST 4MB ST RAM 8MB TT RAM CosmosEx SC1435), (1040STFM UltraSatan SM124), (1040STE 4MB ST RAM 8MB TT RAM CosmosEx NetUSBee SM144 SC1224), 260ST, 520 ST+, (MEGA ST SM125), (65XE Rapidus U1MB VBXE SIDE2 SIO2PC), (Jaguar SkunkBoard), Lynx II, 2x Portfolio

21

Zapis do pamięci?

What can be asserted without proof can be dismissed without proof.

Jeśli nie ma po nim odczytu, jak najbardziej.

Atari: FireBee, (Falcon030 CT60e SuperVidel SvEthlana CTPCI), TT, (520ST Pak030 Frak PuPla Panther), (520ST 4MB ST RAM 8MB TT RAM CosmosEx SC1435), (1040STFM UltraSatan SM124), (1040STE 4MB ST RAM 8MB TT RAM CosmosEx NetUSBee SM144 SC1224), 260ST, 520 ST+, (MEGA ST SM125), (65XE Rapidus U1MB VBXE SIDE2 SIO2PC), (Jaguar SkunkBoard), Lynx II, 2x Portfolio

23

Dzięki za podpowiedzi. Najpierw i tak muszę zobaczyć w innych źródłach jak się zapisuje do nieparzystych, abym nie wyważał otwartych drzwi :)
Bez tego część rejestrów karty jest niedostępna.

Było miło :) Do widzenia.

Najprościej, odczytujesz 16bitowe słowo z adresu parzystego i ignorujesz najstarsze 8 bitów.

Atari: FireBee, (Falcon030 CT60e SuperVidel SvEthlana CTPCI), TT, (520ST Pak030 Frak PuPla Panther), (520ST 4MB ST RAM 8MB TT RAM CosmosEx SC1435), (1040STFM UltraSatan SM124), (1040STE 4MB ST RAM 8MB TT RAM CosmosEx NetUSBee SM144 SC1224), 260ST, 520 ST+, (MEGA ST SM125), (65XE Rapidus U1MB VBXE SIDE2 SIO2PC), (Jaguar SkunkBoard), Lynx II, 2x Portfolio

25

Adam Klobukowski napisał/a:

Jeśli nie ma po nim odczytu, jak najbardziej.

Chyba Ci się pomyliło ze zmiennymi automatycznymi. Jeśli masz goły pointer to kompilator nie usunie zapisów do pamięci. Jedyne co może zrobić to poprzestawiać względem innych operacji.

What can be asserted without proof can be dismissed without proof.