-
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