eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.misc.elektronikaAsembler 8080 - przerwania i zrzucanie stanu rejestrów na stos
Ilość wypowiedzi w tym wątku: 17

  • 1. Data: 2021-08-06 09:00:31
    Temat: Asembler 8080 - przerwania i zrzucanie stanu rejestrów na stos
    Od: Atlantis <m...@w...pl>

    Chciałem trochę popchnąć do przodu prace nad swoim projektem komputera z
    polskim procesorem MCY7880 (klon intela 8080). Właśnie jestem w trakcie
    uruchamiania procedur do obsługi sterownika ekranu (TMS9918). Wszystko
    działa prawidłowo - jestem w stanie komunikować się układem poprzez jego
    dwa rejestry, wysyłać i odczytywać dane z VRAM-u oraz wypisywać znaki w
    odpowiednich miejscach na ekranie.
    Teraz postanowiłem napisać krótką funkcję do przewijania ekranu o jedną
    linię w momencie, gdy kursor dotrze do jego końca. Kod działa
    prawidłowo, ale tylko przez pewien czas - zwykle po kilku (czasem
    kilkunastu) minutach pojawia się błąd skutkujący zniknięciem wszystkich
    linii za wyjątkiem ostatniej.
    Raczej mogę wykluczyć problem sprzętowy. Wymieniłem zarówno pamięć jak i
    TMS9918, poza tym problem znika za każdym razem po ponownym uruchomieniu
    urządzenia i nie manifestuje się jeśli nie używam tej procedury do
    przewijania.

    Ponieważ błąd manifestuje się nieregularnie, wygląda mi to na problem z
    przerwaniem nadpisującym któryś z rejestrów. Sama funkcja do przewijania
    ekranu wywołuje kilka innych procedur do odczytu, zapisu i zerowania
    VRAM-u, które przyjmują parametry w parach rejestrów BC, DE oraz HL.

    VDPSCROLLUP:
    ;Mowe 12 lines
    ;Read them first
    LXI B, BLKDAT
    LXI D, 0828H
    LXI H, 01E0H
    CALL VDPRVRAM
    ;Move lines from buffer to the beginning of the screen
    LXI B, BLKDAT
    LXI D, 0800H
    LXI H, 01E0H
    CALL VDPWVRAM
    ;Move remaining 11 lines
    ;Read them first
    LXI B, BLKDAT
    LXI D, 0A08H
    LXI H, 01B8H
    CALL VDPRVRAM
    ;Write those lines to the middle of the screen
    LXI B, BLKDAT
    LXI D, 09E0H
    LXI H, 01B8H
    CALL VDPWVRAM
    ;Clear last line
    LXI D, 0B98H
    LXI H, 0028H
    CALL VDPZEROVRAM
    RET

    W aktywnych przerwaniach faktycznie mam instrukcje modyfikujące HL, DE
    oraz oczywiście akumulator/rejestr flag, jednak przed wykonaniem
    procedury obsługi przerwania zrzucam ich stany na stos za pomocą PUSH, a
    potem przywracam instrukcją POP.

    Aby oszczędzić jak najszybciej wyjść z procedury obsługi przerwania,
    zrzucam na stos tylko te rejestry, które są wykorzystywane w jego
    wnętrzu. Nie widzę więc gdzie przerwanie mogłoby mi mieszać w
    przewijaniu ekranu.

    No chyba, że któraś z instrukcji może w sposób niejawny modyfikować
    rejestry inne niż A/flagi? Czy wskazane jest na wszelki wypadek w
    przerwaniu zapisywać na stos wszystkie rejestry, nawet jeśli się ich nie
    używa?

    Ktoś ma pomysł co do innej możliwej przyczyny?


  • 2. Data: 2021-08-06 09:39:46
    Temat: Re: Asembler 8080 - przerwania i zrzucanie stanu rejestrów na stos
    Od: Janusz <j...@o...pl>

    W dniu 2021-08-06 o 09:00, Atlantis pisze:

    > W aktywnych przerwaniach faktycznie mam instrukcje modyfikujące HL, DE
    > oraz oczywiście akumulator/rejestr flag, jednak przed wykonaniem
    > procedury obsługi przerwania zrzucam ich stany na stos za pomocą PUSH, a
    > potem przywracam instrukcją POP.
    A 8080 nie ma czasami banków rejestrów jak 51?

    >
    > Aby oszczędzić jak najszybciej wyjść z procedury obsługi przerwania,
    > zrzucam na stos tylko te rejestry, które są wykorzystywane w jego
    > wnętrzu.
    No i dobrze.

    Nie widzę więc gdzie przerwanie mogłoby mi mieszać w
    > przewijaniu ekranu.

    Masz gdzieś błąd.

    >
    > No chyba, że któraś z instrukcji może w sposób niejawny modyfikować
    > rejestry inne niż A/flagi?
    Wątpię. to są stare procki i o czymś takim bym słyszał.


    Czy wskazane jest na wszelki wypadek w
    > przerwaniu zapisywać na stos wszystkie rejestry, nawet jeśli się ich nie
    > używa?

    Możesz spróbować dla testu, normalnie to bez sensu.


    --
    Janusz


  • 3. Data: 2021-08-06 10:13:47
    Temat: Re: Asembler 8080 - przerwania i zrzucanie stanu rejestrów na stos
    Od: Zbych <z...@s...com>

    On 06.08.2021 09:39, Janusz wrote:
    > W dniu 2021-08-06 o 09:00, Atlantis pisze:
    >
    >> W aktywnych przerwaniach faktycznie mam instrukcje modyfikujące HL, DE
    >> oraz oczywiście akumulator/rejestr flag, jednak przed wykonaniem
    >> procedury obsługi przerwania zrzucam ich stany na stos za pomocą PUSH, a
    >> potem przywracam instrukcją POP.
    > A 8080 nie ma czasami banków rejestrów jak 51?

    Nie, ten cud techniki pojawił się w Z80, nie w 8080
    https://en.wikipedia.org/wiki/Zilog_Z80#Registers
    Dla porównania:
    https://en.wikipedia.org/wiki/Intel_8080#Registers


  • 4. Data: 2021-08-06 10:15:40
    Temat: Re: Asembler 8080 - przerwania i zrzucanie stanu rejestrów na stos
    Od: MKi <...@...com>

    W dniu 2021-08-06 o 09:39, Janusz pisze:
    > W dniu 2021-08-06 o 09:00, Atlantis pisze:
    >
    >> W aktywnych przerwaniach faktycznie mam instrukcje modyfikujące HL, DE
    >> oraz oczywiście akumulator/rejestr flag, jednak przed wykonaniem
    >> procedury obsługi przerwania zrzucam ich stany na stos za pomocą PUSH, a
    >> potem przywracam instrukcją POP.
    > A 8080 nie ma czasami banków rejestrów jak 51?

    Dawno nie zajmowałem się 8080, ale jestem pewien, że nie.
    Ale MCY7880 znam tylko ze słyszenia, może ma jakieś własne wynalazki?

    >
    >>
    >> Aby oszczędzić jak najszybciej wyjść z procedury obsługi przerwania,
    >> zrzucam na stos tylko te rejestry, które są wykorzystywane w jego
    >> wnętrzu.
    > No i dobrze.
    >
    >  Nie widzę więc gdzie przerwanie mogłoby mi mieszać w
    >> przewijaniu ekranu.
    >
    > Masz gdzieś błąd.
    >
    >>
    >> No chyba, że któraś z instrukcji może w sposób niejawny modyfikować
    >> rejestry inne niż A/flagi?
    > Wątpię. to są stare procki i o czymś takim bym słyszał.
    >
    >
    > Czy wskazane jest na wszelki wypadek w
    >> przerwaniu zapisywać na stos wszystkie rejestry, nawet jeśli się ich nie
    >> używa?
    >
    > Możesz spróbować dla testu, normalnie to bez sensu.
    >
    >

    Inne sugestie do testów:
    1. wyłączyć wszystkie przerwania, jeśli można
    2. sprawdzić, czy stos nie przepełnia się / nie wychodzi
    poza obszar pamięci (masz pełne 64KB?)

    Pozdrowienia,
    MKi


  • 5. Data: 2021-08-06 10:15:56
    Temat: Re: Asembler 8080 - przerwania i zrzucanie stanu rejestrów na stos
    Od: Zbych <z...@s...com>

    On 06.08.2021 09:00, Atlantis wrote:

    > W aktywnych przerwaniach faktycznie mam instrukcje modyfikujące HL, DE
    > oraz oczywiście akumulator/rejestr flag, jednak przed wykonaniem
    > procedury obsługi przerwania zrzucam ich stany na stos za pomocą PUSH, a
    > potem przywracam instrukcją POP.
    >
    > Aby oszczędzić jak najszybciej wyjść z procedury obsługi przerwania,
    > zrzucam na stos tylko te rejestry, które są wykorzystywane w jego
    > wnętrzu. Nie widzę więc gdzie przerwanie mogłoby mi mieszać w
    > przewijaniu ekranu.


    Wrzuć kod tego przerwania, a przynajmniej początek i koniec.


  • 6. Data: 2021-08-06 10:24:34
    Temat: Re: Asembler 8080 - przerwania i zrzucanie stanu rejestrów na stos
    Od: Atlantis <m...@w...pl>

    On 06.08.2021 09:39, Janusz wrote:

    > A 8080 nie ma czasami banków rejestrów jak 51?

    Wydaje mi się, że nie. Pod tym względem 8080 to taki uproszczony Z80.
    Posiada tylko akumulator, rejestr flag oraz pary rejestrów, które można
    traktować jako rejestr szesnastobitowe rejestry do wykonywania
    niektórych instrukcji, albo dwa ośmiobitowe, niezależne rejestry: BC, DE
    oraz HL. Ten ostatni jest wykorzystywany przez niektóre instrukcje jaki
    wskaźnik na określoną lokalizację w pamięci. No i oczywiście jest
    jeszcze SP oraz wskaźnik stosu.


    > Masz gdzieś błąd.

    Pytanie tylko gdzie... Poza hipotezą z przerwaniami nie przychodzi mi
    nic innego do głowy.

    Funkcje do operacji na VRAM-ie wyglądają następująco:

    ;RAM ADDRES IN BC, VRAM ADDRES IN DE, DATA LENGTH IN HL
    VDPRVRAM:
    MOV A, E
    OUT VDP_MODE
    NOP
    NOP
    MOV A, D
    OUT VDP_MODE
    NOP
    NOP
    VDPRVRAML:
    IN VDP_DATA
    NOP
    NOP
    STAX B
    INX B
    DCX H
    MOV A, H
    ORA L
    JNZ VDPRVRAML
    RET

    ;RAM ADDRESS IN BC, VRAM ADDRES IN DE, DATA LENGTH IN HL
    VDPWVRAM:
    MOV A, E
    OUT VDP_MODE
    NOP
    NOP
    MOV A, D
    ORI 40H
    OUT VDP_MODE
    NOP
    NOP
    VDPWVRAML:
    LDAX B
    OUT VDP_DATA
    NOP
    NOP
    INX B
    DCX H
    MOV A, H
    ORA L
    JNZ VDPWVRAML
    RET

    ;VRAM ADDRES IN DE, DATA LENGTH IN HL
    VDPZEROVRAM:
    MOV A, E
    OUT VDP_MODE
    NOP
    NOP
    MOV A, D
    ORI 40H
    OUT VDP_MODE
    NOP
    NOP
    VDPZEROVRAML:
    MVI A, 00H
    OUT VDP_DATA
    NOP
    NOP
    DCX H
    MOV A, H
    ORA L
    JNZ VDPZEROVRAML
    RET

    Instrukcje NOP umieszczone testowo, docelowo raczej nie będą potrzebne.
    Kod instrukcji do przewijania ekranu zamieściłem w poprzedniej
    wiadomości. Zawarte w niej adresy lokalizacji w VRAM-ie oraz długości
    odczytywanych/zapisywanych ciągów danych raczej są prawidłowe -
    przewijanie potrafi zachowywać się prawidłowo przez całe minuty, pomimo
    dużej ilości tekstu przelatującego przez ekran. Gdyby tam była pomyłka,
    to błędy bardzo szybko by się nawarstwiły i obraz zacząłby się
    rozjeżdżać już po pierwszym przewinięciu o linię do góry.


  • 7. Data: 2021-08-06 10:27:06
    Temat: Re: Asembler 8080 - przerwania i zrzucanie stanu rejestrów na stos
    Od: Janusz <j...@o...pl>

    W dniu 2021-08-06 o 10:13, Zbych pisze:
    > On 06.08.2021 09:39, Janusz wrote:
    >> W dniu 2021-08-06 o 09:00, Atlantis pisze:
    >>
    >>> W aktywnych przerwaniach faktycznie mam instrukcje modyfikujące HL, DE
    >>> oraz oczywiście akumulator/rejestr flag, jednak przed wykonaniem
    >>> procedury obsługi przerwania zrzucam ich stany na stos za pomocą PUSH, a
    >>> potem przywracam instrukcją POP.
    >> A 8080 nie ma czasami banków rejestrów jak 51?
    >
    > Nie, ten cud techniki pojawił się w Z80, nie w 8080
    > https://en.wikipedia.org/wiki/Zilog_Z80#Registers
    > Dla porównania:
    > https://en.wikipedia.org/wiki/Intel_8080#Registers
    Ok.

    --
    Janusz


  • 8. Data: 2021-08-06 10:30:08
    Temat: Re: Asembler 8080 - przerwania i zrzucanie stanu rejestrów na stos
    Od: Janusz <j...@o...pl>

    W dniu 2021-08-06 o 10:24, Atlantis pisze:
    > On 06.08.2021 09:39, Janusz wrote:
    >
    >> A 8080 nie ma czasami banków rejestrów jak 51?
    >
    > Wydaje mi się, że nie. Pod tym względem 8080 to taki uproszczony Z80.
    Raczej z80 to rozbudowany 8080 :)

    >
    > Pytanie tylko gdzie... Poza hipotezą z przerwaniami nie przychodzi mi
    > nic innego do głowy.Jak już ktoś sugerował może Ci się przepełniać stos i
    nadpisywać zmienną
    albo gdzieś się wskaźnik źle aktualizuje.

    --
    Janusz


  • 9. Data: 2021-08-06 11:23:18
    Temat: Re: Asembler 8080 - przerwania i zrzucanie stanu rejestrów na stos
    Od: Atlantis <m...@w...pl>

    On 06.08.2021 10:15, MKi wrote:

    > Dawno nie zajmowałem się 8080, ale jestem pewien, że nie.
    > Ale MCY7880 znam tylko ze słyszenia, może ma jakieś własne wynalazki?

    Nie sądzę. Z tego co czytałem to dość dokładny klon 8080. Podejrzewam,
    że gdyby były tam jakieś znaczące różnice, to już dałyby o sobie znać
    podczas uruchamiania innych peryferiów oraz TinyBasica pisanego z myślą
    o oryginalnym procesorze Intela.


    > Inne sugestie do testów:
    > 1. wyłączyć wszystkie przerwania, jeśli można

    W sumie racja. W tej chwili chyba nie obsługują jeszcze niczego krytycznego.


    > 2. sprawdzić, czy stos nie przepełnia się / nie wychodzi
    >    poza obszar pamięci (masz pełne 64KB?)

    Tak i nie. Mam pełne 64kB RAM-u, ale tylko jeden 32kB układ jest
    zmapowany bezpośrednio na pierwszą połówkę przestrzeni adresowej. Druga
    połówka mieści stronnicowany RAM (2x16 kB) oraz 16kB EPROM.
    Stos rozpoczyna się na 0x7FFF, podczas gdy ostatnia zmienna w pamięci
    znajduje się pod adresem 0x2188. To bardzo dużo miejsca dla stosu, jak
    na prosty interpreter TinyBasica.
    Oczywiście biorę pod uwagę możliwość, że coś może sukcesywnie zapisywać
    dane do stosu bez ich zdejmowania, jest jednak jedno "ale" - wszystko
    działa całkowicie stabilnie, o ile nie używam procedury scrollującej. A
    procedura scrollująca (ani żadna z wywoływanych przez nią procedur) nie
    używa instrukcji PUSH.


  • 10. Data: 2021-08-06 11:41:41
    Temat: Re: Asembler 8080 - przerwania i zrzucanie stanu rejestrów na stos
    Od: Atlantis <m...@w...pl>

    On 06.08.2021 10:15, Zbych wrote:

    > Wrzuć kod tego przerwania, a przynajmniej początek i koniec.

    Poniżej. Z tego co widzę w chwili obecnej i tak zachowuję na stosie
    więcej niż potrzeba - trafiają tam nawet te rejestry, których w danej
    procedurze nie używam - pewnie pozostałość po jakichś eksperymentach.
    Nie widzę tam jednak niczego, co mogłoby powodować takie kłopoty.
    Wszystkie pary rejestrów są odkładane na stos i zdejmowane z niego we
    właściwej kolejności.

    W chwili obecnej jedyne aktywne przerwanie to te od timera, RTC oraz
    klawiatury. Wszystkie pozostałe są wyłączone na poziomie kontrolera (8259).

    ;Interrupt routines
    UART_RX_ISR:
    PUSH PSW
    PUSH H
    PUSH D
    POP D
    POP H
    POP PSW
    EI
    RET

    UART_TX_ISR:
    PUSH PSW
    PUSH H
    PUSH D
    POP D
    POP H
    POP PSW
    EI
    RET

    KBD_ISR:
    PUSH PSW
    PUSH H
    PUSH D
    IN KBD_DATA
    STA KBDDATA
    POP D
    POP H
    POP PSW
    EI
    RET

    TIMER_ISR:
    PUSH PSW
    PUSH H
    PUSH D
    LHLD SYSTICK
    INX H
    SHLD SYSTICK
    MVI A, 00H
    OUT COUNT_REG_1_8253
    MVI A, 0A0H
    OUT COUNT_REG_1_8253
    POP D
    POP H
    POP PSW
    EI
    RET

    RTC_ISR:
    PUSH PSW
    PUSH H
    PUSH D
    MVI A, 00H
    OUT RTC_CTRLD_REG
    LHLD RTCTICK
    INX H
    SHLD RTCTICK
    POP D
    POP H
    POP PSW
    EI
    RET

    VDP_ISR:
    PUSH PSW
    PUSH H
    PUSH D
    POP D
    POP H
    POP PSW
    EI
    RET

    ;Interrupt vectors
    IR0_VECT:
    ORG 0FFE0H
    EI
    RET
    NOP
    NOP
    IR1_VECT:
    EI
    RET
    NOP
    NOP
    IR2_VECT:
    JMP TIMER_ISR
    NOP
    IR3_VECT:
    JMP UART_TX_ISR
    NOP
    IR4_VECT:
    JMP UART_RX_ISR
    NOP
    IR5_VECT:
    JMP KBD_ISR
    NOP
    IR6_VECT:
    JMP RTC_ISR
    NOP
    IR7_VECT
    JMP VDP_ISR
    NOP

strony : [ 1 ] . 2


Szukaj w grupach

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: