ethanak Lipiec 20, 2019 Udostępnij Lipiec 20, 2019 @InspektorGadzet Panie kolego... miło by było aby znalazł Pan jakiś inny temat (ew. interlokutorów) do dyskusji. Nie wiem co robiłeś, niespecjalnie mnie to interesuje. Jeśli nie rozumiesz tego co napisałem, to idź się przespać, a najlepiej sprawdź, czy na onecie Cię nie potrzebują. Pamiętaj: rozmawiamy konkretnie o 6510, to że znasz inne procesory to nas tu niewiele interesuje. @atlantis86 wiem - tylko np. do realizacji portu wyjściowego wystarczy dekoder, do we/wy potrzebne jest coś co przełączy szynę danych. Pogadamy później, jak się pewien kolega przeniesie na inne forum, bo w tej chwili nie ma to żadnego sensu. 1 Cytuj Link do komentarza Share on other sites More sharing options...
InspektorGadzet Lipiec 20, 2019 Udostępnij Lipiec 20, 2019 (edytowany) 56 minut temu, atlantis86 napisał: Systemy wzorowane na 8080/8085 (np. Z80 albo rodzina x86) miały osobną (mniejszą) przestrzeń adresową dla układów IO. I to był nie najlepszy pomysł, bo nie dało się zastosować wszystkich rozkazów CPU dla układów IO.Dekoder adresowy w praktyce musiał być na co najmniej 2 układach TTL. Ja w Z-80 peryferia podłączałem tak jak w każdym normalnym systemie (np ARM, 68k) w liniową przestrzeń adresową a nie w jak w 8080, Z-80, 8051q czy AVR. Jak widać po współczesnych, nowoczesnych rozwiązaniach, pomysł oparty o fanaberie Intela upadł. 25 minut temu, ethanak napisał: tylko np. do realizacji portu wyjściowego wystarczy dekoder, do we/wy potrzebne jest coś co przełączy szynę danych. Chyba za dużo C2H5OH. Prześpij się, naucz się projektować systemy mikroprocesorowe i dopiero po tym wróć do rozmowy, bo jak na razie to głupoty piszesz. Budowałem systemy z 6502, 680x0, Z-80, 8051 z zewnętrzną RAM, ROM, PIO i nie trzeba przełączać szyny danych. Poznałeś AVR i masz mgliste pojęcie o systemach mikroprocesorowych. 25 minut temu, Treker napisał: lepiej zamienić na 2-3 merytoryczne zdania, z których będzie można się czegoś dowiedzieć. Napisałem na czym buduje się dekoder adresowy, do jakich linii IO się go podłącza i że nie trzeba przełączać linii danych. Jeśli ktoś chce zgłębić wiedze z tym tematem nie zobaczy jak jest zbudowany CA-80 albo Cobra1. W zeszycie "CA80 MIK 05" (plik ma ponad 50MB więc nie mogę go tu umieścić) znajdują się schematy CA-80. @ethanak gdzie tam jest przełączana szyna danych? Fragment dokumentacji Cobry1 w załączniku. Gdzie przełączanie szyny danych? To samo w systemie na 680x0, który zaprojektowałem. AV 85 3 str16 17 (schemat czesc z procesorem).pdf 680x0 bufor.pdf 680x0 cpu.pdf 680x0 cpu bga.pdf 680x0 dekoder.pdf 680x0 isa.pdf 680x0 lpt timer.pdf 680x0 pio.pdf 680x0 prj.pdf 680x0 rom ram.pdf 680x0 slotcpu.pdf 680x0 sloty.pdf 680x0 vic.pdf Edytowano Lipiec 20, 2019 przez InspektorGadzet Cytuj Link do komentarza Share on other sites More sharing options...
Leoneq Lipiec 20, 2019 Udostępnij Lipiec 20, 2019 chętnie zobaczę co się wywinie z tej dyskusji, bo zawsze chciałem zbudować komputer na 8-bitowym procesorze, i widzę dużo wiedzy można stąd wyciągnąć ^^ Cytuj Link do komentarza Share on other sites More sharing options...
InspektorGadzet Lipiec 20, 2019 Udostępnij Lipiec 20, 2019 (edytowany) 22 minuty temu, Leoneq napisał: zawsze chciałem zbudować komputer na 8-bitowym procesorze, Dobrze udokomentowany jest CA-80. Cobry1 nie polecam, chyba, ze zmodyfikujesz konstrukcję tak aby obsługiwała przerwania. W dzisiejszych czasach, budowa systemu nie jest rozsądna, chyba, że to duży system ale od tego raczej nie zaczyna się przygody z CPU. 8-bit tez nie zachwyca, a 32-bit to nie taka prosta sprawa zwłaszcza przy szybkim taktowaniu.16-bit taki kompromis, bo są pamięci ROM/FLASH i RAM 16-bit. Jak można wnioskować z załączników które umieściłem dwa posty wcześniej, zbudowanie systemu 16-bit jest wykonalne ale problemem jest emulacja ROM/FLASH. Teraz pewnie nie łatwo będzie kupić emulator trzeba będzie go więc zrobić albo napisać prosta procedurę, która będzie ładowała program przez np UART do FLASH czy RAM. No i bez CPLD raczej nie podchodź. Pierwszą wersję zrobiłem na 2 GAL 20V8, na TTL to chyba ponad 5 sztuk potrzeba. Łatwo zbudować coś na 8051 bo ROM, SIO, CTC masz w jednej obudowie. Na zewnątrz tylko ROM i dodatkowe IO, RAM. Można tez zrobić np na P8051RD2. Wszystko łącznie z FLASH i sporej ilości (jak na 8051) RAM masz w jednej obudowie, programowanie przez bootloader przez UART. Inna opcja, to płytka NUCLEO + 6502 czy Z-80. W EP były artykuły na ten temat. Z 68000 chyba też był. Edytowano Lipiec 20, 2019 przez InspektorGadzet Cytuj Link do komentarza Share on other sites More sharing options...
Polecacz 101 Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Produkcja i montaż PCB - wybierz sprawdzone PCBWay! • Darmowe płytki dla studentów i projektów non-profit • Tylko 5$ za 10 prototypów PCB w 24 godziny • Usługa projektowania PCB na zlecenie • Montaż PCB od 30$ + bezpłatna dostawa i szablony • Darmowe narzędzie do podglądu plików Gerber Zobacz również » Film z fabryki PCBWay
Leoneq Lipiec 20, 2019 Udostępnij Lipiec 20, 2019 właśnie myślałem o zakupie z80 z kostką ramu i komunikować się po serialu z pc jako terminal (na start). Ale na to jeszcze mam czas - może po drodze taki układ sam do mnie trafi XD taki komputer miałby być tylko do celów edukacyjnych, ostatecznie na retrogranie (emulatorów nie lubię, np. mam drastica i chyba jednak dsa normalnego se kupie). Pytanie jeszcze, 6502 czymś znaczącym się różni od z80 "na start"? Cytuj Link do komentarza Share on other sites More sharing options...
InspektorGadzet Lipiec 20, 2019 Udostępnij Lipiec 20, 2019 (edytowany) 3 godziny temu, atlantis86 napisał: W przypadku Z80 była to chyba jedna dodatkowa linia, którą trzeba było przepuścić przez dodatkową logikę aby stwierdzić, z czym procesor chce się w danej chwili dogadać. IORQ - dostęp do IO, MREQ - dostęp do pamięci. W praktyce trzeba było dać dwa dekodery, jeden dla pamięci drugi dla IO. Jeśli po 4 stroby wystarczy można było to zrealizować jednym układem 74HC155. Fajne IO z rodziny Z-80 to KIO. Około 2003 roku miałem na tym robić projekt ale Zilog wycofał się z PL i temat umarł. W sumie dobrze, bo miałem też robić, na beznadziejnych Z8. To dopiero syf.Ciekawym CPU jest Z180 (Z-80 z MMU). C166 też fajny 16-bit. 80251 jest za to mikrokontrolerem z możliwością adresowania 128kB pamięcią programu. ColdFire fajny 32-bit. 683xx mikrokontrolery 16-bit (wewnętrzna budowa 32-bit). 68008 wersja 68000 z magistralą 8-bit. Trochę tych procków się poznała, nawet H8 się kiedyś bawiłem. Teraz ARM, zwłaszcza STM32, wygryzł inne rodziny. Nie ma się co dziwić, przy tym samym zegarze, ARM jest ok 7 razy szybszy od AVR a niedawno dotarła do mnie NUCLEO z F7 480MHz to taki AVR Xmega 3,3GHz 🙂 Ponadto KAŻDY ARM ma to czego brakuje KAŻDEMU AVRmega/tiny czyli DMA. W takim Z-80 czy 8080 DMA nie bardzo mogło rozwinąć skrzydła, w ARM jest inaczej. 2 godziny temu, Leoneq napisał: Pytanie jeszcze, 6502 czymś znaczącym się różni od z80 "na start"? Z-80 jest popularniejszy, ma wielopoziomowy system przerwań z CTC, SIO, PIO można dość wydajne systemy budować. 6502 jest prosty w budowie, ma prosty język maszynowy, dużo trybów adresowania o czym Z-80 może pomarzyć. Czasem, to co 6502 robi jednym rozkazem, Z-80 wymaga 3 i to mimo tego, że Z-80 ma więcej rozkazów (ok 700, 6502 ok 240). To właśnie dzięki trybom adresowania 6502 jest szybszy od Z-80 przy 4 razy wolniejszym zegarze i od 8051 przy 12 razy wolniejszym zegarze. Edytowano Lipiec 20, 2019 przez InspektorGadzet Cytuj Link do komentarza Share on other sites More sharing options...
atlantis86 Lipiec 20, 2019 Autor tematu Udostępnij Lipiec 20, 2019 (edytowany) 2 godziny temu, Leoneq napisał: właśnie myślałem o zakupie z80 z kostką ramu i komunikować się po serialu z pc jako terminal (na start). Ale na to jeszcze mam czas - może po drodze taki układ sam do mnie trafi XDtaki komputer miałby być tylko do celów edukacyjnych, ostatecznie na retrogranie (emulatorów nie lubię, np. mam drastica i chyba jednak dsa normalnego se kupie). Pytanie jeszcze, 6502 czymś znaczącym się różni od z80 "na start"? Wgrywanie programu do RAM-u przez UART nie jest wcale zadaniem trywialnym. Tak czy inaczej będziesz potrzebował jakiejś stałej pamięci (np. EPROM lub EEPROM), w której będziesz trzymał podstawowe podprogramy obsługujące transmisję szeregową, wektory przerwań, a także bootloader odpowiedzialny za ładowanie programu. Myślałem, żeby zrobić coś podobnego w jednym ze swoich projektów, tylko zamiast do RAM-u, ładować program do pamięci EEPROM. Mógłbym w ten sposób programować urządzenie w sposób przypominajacy Arduino. Jednak do tej pory nie chciało mi się za to zabrać i "męczę się" z kasownikiem i programatorem EPROM-ów. 😉 O budowaniu komputera do retrogamingu raczej zapomnij. Wszystko rozbija się o grafikę i dźwięk. Niemal wszystkie popularne komputery korzystały ze specjalnych chipów (np. słynne SID i VIC w Commodore). Nie były one dostępne w handlu. Obecnie można je czasem kupić na aukcjach - demontowane z uszkodzonych egzemplarzy, za cenę zbliżoną do używanego C64. Na dobrą sprawę pewne dałoby się je odtworzyć w jakimś FPGA, ale tutaj pojawia się pytanie o sens takiego przedsięwzięcia, skoro można w ten sposób odtworzyć cały komputer. Prościej wygląda sytuacja z układem ULA z ZX Spectrum - jego dało się odtworzyć za pomocą dużej ilości układów logicznych, powinien się też zmieścić w lepszym układzie CPLD. Zapewne są już gdzieś dostępne odpowiednie projekty. Na twoim miejscu budując komputer do grania w klasyki, celowałbym właśnie w Spectrum. Tyle tylko, że nie masz się co oszukiwać, że będzie to rozwiązaniem prostszym i tańszym niż zakup używanego "gumiaka". Bo nie będzie. 😉 Jeśli chcesz się bawić w technikę mikroprocesorową, to tutaj sens mają właściwie tyko zastosowania sentymentalno-dydaktyczne (CA-80), ewentualnie wzbogacone o sens praktyczny. W przypadku moich projektów mamy do czynienia z tą drugą sytuacją - próbuję budować na starych procesorach rzeczy, które o wiele prościej i szybciej mógłbym uruchomić na Atmedze. Ale tu chodzi o frajdę. 😉 Edytowano Lipiec 20, 2019 przez atlantis86 Cytuj Link do komentarza Share on other sites More sharing options...
ethanak Lipiec 20, 2019 Udostępnij Lipiec 20, 2019 56 minut temu, InspektorGadzet napisał: To właśnie dzięki trybom adresowania 6502 jest szybszy od Z-80 Dodatkowo: 6502 pracował "na zakładkę" (tzn. w cyklu wykonania pobierał jednocześnie pierwszy bajt następnej instrukcji). Cytuj Link do komentarza Share on other sites More sharing options...
InspektorGadzet Lipiec 20, 2019 Udostępnij Lipiec 20, 2019 (edytowany) 53 minuty temu, atlantis86 napisał: Jeśli chcesz się bawić w technikę mikroprocesorową, to tutaj sens mają właściwie tyko zastosowania sentymentalno-dydaktyczne (CA-80), ewentualnie wzbogacone o sens praktyczny. W przypadku moich projektów mamy do czynienia z tą drugą sytuacją - próbuję budować na starych procesorach rzeczy, które o wiele prościej i szybciej mógłbym uruchomić na Atmedze. Ale tu chodzi o frajdę Większa frajdę daje zbudowanie własnego CPU Z-80 ma sporo tranzystorów ale 6502 jest prosty a jak już jest CPU to mam z firmy Atari schematy układu TIA używanego w Atari2600. Wiadro TTL i mamy konsolę do gier. Edytowano Lipiec 20, 2019 przez InspektorGadzet Cytuj Link do komentarza Share on other sites More sharing options...
atlantis86 Lipiec 20, 2019 Autor tematu Udostępnij Lipiec 20, 2019 Przed chwilą, InspektorGadzet napisał: Większa frajdę daje zbudowanie własnego CPU https://monster6502.com/ To też mi chodzi po głowie, chociaż pewnie pójdę po linii najmniejszego oporu. Czyli 74181 i mikrokod. Nie mam zamiaru budować CPU z pojedynczych tranzystorów. Chociaż z grupą znajomych pracujemy nad projektem tranzystorowego zegara cyfrowego. Niestety obecnie projekt wisi w próżni. 😉 1 Cytuj Link do komentarza Share on other sites More sharing options...
InspektorGadzet Lipiec 20, 2019 Udostępnij Lipiec 20, 2019 16 godzin temu, atlantis86 napisał: pewnie pójdę po linii najmniejszego oporu. Czyli 74181 i mikrokod. Nie mam zamiaru budować CPU z pojedynczych tranzystorów Faktycznie budowanie z tranzystorów to przesada ale z bramek czemu nie? Może ARM zbudujesz, też ma stosunkowo prosta konstrukcję. Dla zainteresowanych TIA i Atari2600. Mnie to coś na 4004 się marzy. 1 Cytuj Link do komentarza Share on other sites More sharing options...
InspektorGadzet Lipiec 20, 2019 Udostępnij Lipiec 20, 2019 (edytowany) 1 godzinę temu, ethanak napisał: Dodatkowo: 6502 pracował "na zakładkę" (tzn. w cyklu wykonania pobierał jednocześnie pierwszy bajt następnej instrukcji). Inną ciekawą cechą 6502 było to, że dostęp do pamięci miał w jednej fazie zegara, w drugiej mogło się odbywać odświeżanie DRAM lub dostęp układu wizyjnego albo drugiego CPU. 6502 nie miał 3-stanowwej magistrali adresowej za to taką posiadał 6510 czy 8500 (CMOS'owa wersja 6502). 6502 miał niespotykane w 8-bit programowe przerwanie (rozkaz BRK). Wektor był taki sam jak dla maskowalnego ale w rejestrze statusu był ustawiany bit "B". 6502, umieszczał na stosie rejestr statusu po wejściu w przerwanie i zdejmował wychodząc. Ciekawy był bit "V". Istniał rozkaz kasujący ten bit (CLV) ale nie było rozkazu ustawiającego go. Bit ten mógł być ustawiony przez zmianę pinu CPU (chyba SYNC). Używane to było w napędach dyskowych Commodore. Wtedy zrozumiała była sekwencja rozkazów: CLV loop: BVC loop która wydawałoby się powinna doprowadzić do zawieszenia CPU. 6502 to prawdziwe 8-bit. Poza PC wszystkie rejestry były 8-bit, Z-80 miał pary rejestrów. W stosunku do Z-80 praktycznie wszystkie rozkazy ustawiały znaczniki, dlatego wiele operacji robiono dwoma rozkazami a 8080 czy Z-80 potrzebował trzech. Przykładowo na Z-80 LD a,xxxx CMP a,0 JNE adres a w 6502: LD a,xxxx BNE adres Edytowano Lipiec 20, 2019 przez InspektorGadzet Cytuj Link do komentarza Share on other sites More sharing options...
atlantis86 Lipiec 21, 2019 Autor tematu Udostępnij Lipiec 21, 2019 (edytowany) 20 godzin temu, InspektorGadzet napisał: Faktycznie budowanie z tranzystorów to przesada ale z bramek czemu nie? Może ARM zbudujesz, też ma stosunkowo prosta konstrukcję. Mnie ten Monster 6502 trochę ciekawi, odkąd po raz pierwszy usłyszałem o tym projekcie. Nie powiem - chciałbym go mieć jako "gadżet". Przy czym pewnie koszt zamówienia płytki o tym rozmiarze wyszedłby astronomiczny, nawet w Chinach. Tranzystory i LEDY-y drogie nie są, ale przy tej ilości też uzbierałaby się zauważalna kwota... Cytat Mnie to coś na 4004 się marzy. To jednak poszukiwany obiekt kolekcjonerski, a jego ceny na aukcjach są dość wysokie. Trochę bałbym się z nim eksperymentować. No i złożony na tym system będzie dość mocno ubogi... Zanim zabiorę się za budowanie własnego procesora, pewnie będę jeszcze kontynuował eksperymenty z polskim MCY7880. Potem chciałbym złożyć coś na 68k, tylko do tego czasu muszę popracować nad umiejętnościami programowania CPLD. 😉 Edytowano Lipiec 21, 2019 przez atlantis86 1 Cytuj Link do komentarza Share on other sites More sharing options...
InspektorGadzet Lipiec 21, 2019 Udostępnij Lipiec 21, 2019 (edytowany) 49 minut temu, atlantis86 napisał: Potem chciałbym złożyć coś na 68k, tylko do tego czasu muszę popracować nad umiejętnościami programowania CPLD. Jak zdobędzie 74xx148 (teraz to chyba nie problem) to resztę na kilku 74xx zrobisz. Jak masz dostęp do programatora GAL lub PALCE, to mogę dać pliki źródłowe i wynikowe dla GAL. Potrzebne będą dwa GAL/PALCE. Poszukam tych plików, będziesz wiedział jak to było zbudowane, bo nawet BusError obsługiwałem. Coś już znalazłem (archiwum Amigi musiałem otworzyć): GAL, daję co mam: GAL20V8 dekoder ;---------------------------- Deklaracja pinów ---------------------- A3 A2 A1 RDL WRL CS0 CS1 IO2 IO3 RW NC GND NC NC DTACK CS574 NC ELCD NC NC CS245 IORDY NC VCC ;---------------------------- Dekoder adresowy ---------------------- /CS574 = /WRL * /IO2 * /A1 * /A2 * /A3 ;Rejestr 574 - IO2 #00 /CS245 = /RDL * /IO2 * /A1 * /A2 * /A3 ;Rejestr 245 - IO2 #00 ELCD = /RDL * /IO2 * A2 * /A3 ;LCD - IO2 #04-06 + /WRL * /IO2 * A2 * /A3 DESCRIPTION: GAL22V10 RW ;---------------------------- Deklaracja pinów ---------------------- Q7 NC NC AS UDS LDS RW FC2 FC1 FC0 NC GND ROM USER VPA BERR INTA WRU WRL RDU RDL R164 NC VCC ;---------------------------- Dekoder RD/WR ------------------------- /WRL = /LDS * /RW /WRU = /UDS * /RW /RDL = /LDS * RW /RDU = /UDS * RW ;---------------------------- Generator potwierdzenia przerwania ---- /VPA = FC0 * FC1 * FC2 * /AS /INTA = FC0 * FC1 * FC2 /USER = /FC2 * /RW ;Jeôli tryb uűytkownika i zapis to USER=L ;---------------------------- Pozostaîe ----------------------------- /R164 = AS ;Negator dla 74HCT164 /BERR = Q7 ;Negator dla wytworzenia BusError 74164 przepeîni sië + /ROM * /WRL ; lub gdy próba zapisu do ROML + /ROM * /WRU ; lub ROMU DESCRIPTION: GAL20V8 8 na 3 ;---------------------------- Deklaracja pinów ---------------------- Clock IRes NC NC IRQ1 IRQ2 IRQ3 IRQ4 IRQ5 IRQ6 IRQ7 GND OE ResI IPL0 IPL1 IPL2 Reset NC ResO Halt CLK NC VCC ;---------------------------- Enkoder 8 na 3 ------------------------ IPL0 = /IRQ2 * IRQ1 + /IRQ4 * IRQ1 * IRQ2 * IRQ3 + /IRQ6 * IRQ1 * IRQ2 * IRQ3 * IRQ4 * IRQ5 + IRQ1 * IRQ2 * IRQ3 * IRQ4 * IRQ5 * IRQ6 * IRQ7 IPL1 = /IRQ3 * IRQ1 * IRQ2 + /IRQ4 * IRQ1 * IRQ2 * IRQ3 + /IRQ7 * IRQ1 * IRQ2 * IRQ3 * IRQ4 * IRQ5 * IRQ6 + IRQ1 * IRQ2 * IRQ3 * IRQ4 * IRQ5 * IRQ6 * IRQ7 IPL2 = /IRQ5 * IRQ1 * IRQ2 * IRQ3 * IRQ4 + /IRQ6 * IRQ1 * IRQ2 * IRQ3 * IRQ4 * IRQ5 + /IRQ7 * IRQ1 * IRQ2 * IRQ3 * IRQ4 * IRQ5 * IRQ6 + IRQ1 * IRQ2 * IRQ3 * IRQ4 * IRQ5 * IRQ6 * IRQ7 ;---------------------------- Dzielnik przez 2 ---------------------- CLK.R = /CLK ;---------------------------- Reset --------------------------------- ResO.T = GND ;wyjôcie trójstanowe (.T) Halt.T = GND ;wyjôcie trójstanowe (.T) ResO.E = /IRes ;pin kontrolujâcy stan trzeci (.E) Halt.E = /IRes ;pin kontrolujâcy stan trzeci (.E) Reset = ResI DESCRIPTION: Wyjôcia trójstanowe: - wyjôcie oznaczone (.T) jest wyjôciem trójstanowym - opis po pinie oznaczonym (.E) okreôla kiedy wyjôcie bëdzie w stanie aktywnym, a kiedy w trzecim - wejôcie /OE wpîywa na wyjôcia rejestrowe (.R) i niewykorzystane (NC) GAL20V8 dekoder ;---------------------------- Deklaracja pinów ---------------------- A21 A22 A20 A19 A18 A17 A16 A15 IOE INTA USER GND Q1 Q2 QOE IO2 IO3 IO0 IO1 RAM ROM DTACK A23 VCC ;---------------------------- Dekoder adresowy ---------------------- /ROM = /A23 * /A22 * /A21 * /A20 * /A19 * /A18 * /A17 ;ROM $000000-$01ffff (128kb) /RAM = A23 * /A22 * /A21 * /A20 * /A19 * /A18 * /A17 * /A16 ;RAM $800000-$80ffff (64kb) /IO0 = A23 * A22 * /A21 * /A20 * /A19 * /A18 * /A17 * /A16 ;IO0 $c00000-$c0ffff (64kb) /IO1 = A23 * A22 * /A21 * /A20 * /A19 * /A18 * /A17 * A16 ;IO1 $c10000-$c1ffff (64kb) /IO2 = A23 * A22 * /A21 * /A20 * /A19 * /A18 * A17 * /A16 ;IO2 $c20000-$c2ffff (64kb) /IO3 = A23 * A22 * /A21 * /A20 * /A19 * /A18 * A17 * A16 ;IO3 $c30000-$c3ffff (64kb) /DTACK.T = /ROM * Q1 ;DTACK=L gdy wybrano ROM, + /RAM ; RAM, + /IO0 ; IO0, + /IO1 ; IO1, + /IO2 * Q2 ; IO2, + /IO3 * Q2 ; IO3 ;Rownanie z "* Q1" lub "* Q2" powoduje wstawienie ; jednego lub dwóch taktów oczekiwania /QOE = /ROM ;DTACK=wychodzi ze stanu trzeciego gdy zaadresowano dekoder + /RAM ; wyprowadzenia QOE i IOE sâ ze sobâ poîâczone + /IO0 + /IO1 + /IO2 + /IO3 DTACK.E = /IOE DESCRIPTION: ??? Dodaę: Jeôli USER=L i wybrany obszar RAM lub ROM supervisora to nie generowaę DTACK co spowoduje, űe próba zapisu RAM supervisora wywoîa BusError Jak chcesz to mogę dać komplet materiałów, łącznie z PCB w Autotrax. Edytowano Lipiec 21, 2019 przez InspektorGadzet Cytuj Link do komentarza Share on other sites More sharing options...
InspektorGadzet Lipiec 21, 2019 Udostępnij Lipiec 21, 2019 (edytowany) W załączniku ZIP68000.zip. Do obrazków użyj IrfanView on rozpoznaje Amigowy format IFFILBM. W archiwum znajdziesz programy testowe (*.s) ; Nie dajemy dyrektywy ORG $000000 bo bëdzie úle,jeôli brak dyrektywy ; to i tak kompilator skompiluje od adresu $000000 dodajâc tablicë relokacji ; adresy w rozkazach ukazane w listingu sâ nieprawdziwe. Rzeczywisty adres ; jest równy ADRES-adres dîugiego sîowa pod "dc.l start" ;---------------- Podziaî pamiëci RAM ---------- data_user equ $0000 ;Poczâtek danych urzytkownika ;... dane urzytkownika ;---------------- Staîe ------------------------ LED equ $c20000 ;Adres zatrzasku 74HCT574 FLASH_ERR_TIME equ $4000 ;Szybkoôę migania LED'ów ROL_ERR_TIME equ $2000 ;Szybkoôę biegajâcego punktu ;---------------- Wektory w ROM ---------------- dc.l $ffff ;1 Wskaúnik stosu (na koniec ram) dc.l start ;0 Wektor startu ;----------------------------------------------- ;Biegajâcy punkt ; start: nop ;Jesteômy w trybie nadzorcy flash: move.b #%11111110,d0 ;D0 - przesowany wzór move.l #5*8,d1 ;D1 - liczba powtorzen skrola flash_loop: move.b d0,LED rol.b #1,d0 move.l #ROL_ERR_TIME,d2 ;D2 - licznik opóúnienia flash_delay: divs #1,d1 ;lepsze niű NOP dbf d2,flash_delay dbf d1,flash_loop move.l #7,d0 ;??? bra error ;??? ;----------------------------------------------- ;Sygnalizacja bîëdu na LED'ach ;we: D0 - nr bîëdu ; error: eor.b #$ff,d0 ;Negujemy (ze wzglëdu na sposób wîâczenia diod) error_loop: move.b d0,LED ;Zaôwiecenie LED'ów move.l #FLASH_ERR_TIME,d1 error_delay: divs #1,d1 ;lepsze niű NOP dbf d1,error_delay move.b #$ff,LED ;Zgaszenie LED'ów move.l #FLASH_ERR_TIME,d1 error_delay2: divs #1,d1 ;lepsze niű NOP dbf d1,error_delay2 bra error_loop ;Dodaę liczenie obiegów ; i po kilkunastu powtórzeniach ; wykonaę rozkaz RESET i skok $000000 Poczytaj komentarze, niektóre nie wymagają RAM do działania (nie używają stosu) i służą do pierwszych testów systemu. Polskie znaki w plikach w standardzie AmigaPL. Nie wiem czy przypadkiem nie ma tu prostego multikaskingu: ; Nie dajemy dyrektywy ORG $000000 bo bëdzie úle,jeôli brak dyrektywy ; to i tak kompilator skompiluje od adresu $000000 dodajâc tablicë relokacji ; adresy w rozkazach ukazane w listingu sâ nieprawdziwe. Rzeczywisty adres ; jest równy ADRES-adres dîugiego sîowa pod "dc.l stos_supervisor_str" ;DODAĘ: ;- generowanie sygnalu USER (gdy superwisor i RW=L(zapis) USER=L) ; ;- gdy USER=L i wybrany RAM superwisora nie generowaę DTACK co wywoîa ; buserror (próba zapisu ram superwisora) ;- gdy INTA blokowanie Io w górnej przestrzeni adresowej (powyűej $f00000) CAL100us equ 38 ;Licznik pëtli 100µs ;---------------- Podziaî pamiëci RAM ---------- ram equ $800000 data_user equ ram ;Poczâtek danych uűytkownika tab_char_lcd equ ram ; ;xxxx equ ram+8 ;... dane uűytkownika stos_user_end equ ram+$6000 ;koniec stosu uűytkownika stos_user_str equ ram+$8000 ;Poczâtek stosu uűytkownika data_supervisor equ ram+$8000 ;Poczâtek danych supervisora b_D0 equ data_supervisor+$000 b_D1 equ data_supervisor+$004 b_D2 equ data_supervisor+$008 b_D3 equ data_supervisor+$00C b_D4 equ data_supervisor+$010 b_D5 equ data_supervisor+$014 b_D6 equ data_supervisor+$018 b_D7 equ data_supervisor+$01C b_A0 equ data_supervisor+$020 b_A1 equ data_supervisor+$024 b_A2 equ data_supervisor+$028 b_A3 equ data_supervisor+$02C b_A4 equ data_supervisor+$030 b_A5 equ data_supervisor+$034 b_A6 equ data_supervisor+$038 b_function_code equ data_supervisor+$03C b_access_adress equ data_supervisor+$040 b_instruction_register equ data_supervisor+$044 b_status_register equ data_supervisor+$048 b_program_counter equ data_supervisor+$04C ;... dane supervisora stos_supervisor_end equ ram+$f000 ;koniec stosu supervisora stos_supervisor_str equ ram+$10000 ;Poczâtek stosu superwisora ;---------------- Staîe programu --------------- LED equ $c20000 ;Adres zatrzasku 74HCT273 KEY equ $c20001 ;Adres bramy 74HCT245 LCD_D equ $c30005 ;Adres wyôwietlacza LCD (Dane) LCD_R equ $c30001 ;Adres wyôwietlacza LCD (Rozkaz) CS1Fx equ $c00000 ;Adres IDE CS0 CS3Fx equ $c10000 ;Adres IDE CS1 FLASH_ERR_TIME equ $8000 ;Szybkoôę migania LED'ów ROL_ERR_TIME equ $1000 ;Szybkoôę biegajâcego punktu TEST_WAIT_TIME equ $8000 ;Czas wyôwietlania wyniku testu na LED'ach T equ 15 ;Bity statusu - tryb nadzorcy S equ 13 IM2 equ 10 ; maska IRQ gdy=%000 wszystkie przerwania IM1 equ 9 ; gdy=%111 tylko NMI (Level 7) IM0 equ 8 X equ 4 ;Bity statusu - tryb uűytkownika N equ 3 Z equ 2 V equ 1 C equ 0 CLS equ $0F ;Kod ASCII czyszczenia LCD POZIOM1 equ 254 ;Kod ASCII BarGraph POZIOM2 equ 253 ;Kod ASCII BarGraph POZIOM3 equ 252 ;Kod ASCII BarGraph POZIOM4 equ 251 ;Kod ASCII BarGraph STRZALKA_L equ 250 STRZALKA_P equ 249 PLAY equ 248 ;---------------- Wektory w ROM ---------------- dc.l stos_supervisor_str ;0 Wskaúnik stosu (na koniec ram) dc.l start ;1 Wektor startu ;Aby dziaîaîy stany wyjâtkowe musi byę sprawna pamiëę RAM dc.l bus_error ;2 dc.l adres_error ;3 dc.l command_error ;4 Nieistniejâca instrukcja dc.l division_error ;5 Dzielenie przez ZERO dc.l chk ;6 Instrukcja CHK <ea>,Dn dc.l trapv ;7 Instrukcja TRAPV dc.l priority_error ;8 Pogwaîcenie priorytetu dc.l trap_error ;9 ôledzenie dc.l emu1010_error ;10 dc.l emu1111_error ;11 dc.l reserved_12 ;12 dc.l reserved_13 ;13 dc.l reserved_14 ;14 dc.l init_int_error ;15 Niezaincjowany wektor przerwania dc.l reserved_16 ;16 dc.l reserved_17 ;17 dc.l reserved_18 ;18 dc.l reserved_19 ;19 dc.l reserved_20 ;20 dc.l reserved_21 ;21 dc.l reserved_22 ;22 dc.l reserved_23 ;23 dc.l false_int_error ;24 Faîszywe przerwanie dc.l int_1level ;25 Autowektor 1 poziomu dc.l int_2level ;26 Autowektor 2 poziomu dc.l int_3level ;27 Autowektor 3 poziomu dc.l int_4level ;28 Autowektor 4 poziomu dc.l int_5level ;29 Autowektor 5 poziomu dc.l int_6level ;30 Autowektor 6 poziomu dc.l int_7level ;31 Autowektor 7 poziomu dc.l trap_0 ;32 Instrukcja TRAP #0 dc.l trap_1 ;33 Instrukcja TRAP #1 dc.l trap_2 ;34 Instrukcja TRAP #2 dc.l trap_3 ;35 Instrukcja TRAP #3 dc.l trap_4 ;36 Instrukcja TRAP #4 dc.l trap_5 ;37 Instrukcja TRAP #5 dc.l trap_6 ;38 Instrukcja TRAP #6 dc.l trap_7 ;39 Instrukcja TRAP #7 dc.l trap_8 ;40 Instrukcja TRAP #8 dc.l trap_9 ;41 Instrukcja TRAP #9 dc.l trap_10 ;42 Instrukcja TRAP #10 dc.l trap_11 ;43 Instrukcja TRAP #11 dc.l trap_12 ;44 Instrukcja TRAP #12 dc.l trap_13 ;45 Instrukcja TRAP #13 dc.l trap_14 ;46 Instrukcja TRAP #14 dc.l trap_15 ;47 Instrukcja TRAP #15 dc.l reserved_48 ;48 dc.l reserved_49 ;49 dc.l reserved_50 ;50 dc.l reserved_51 ;51 dc.l reserved_52 ;52 dc.l reserved_53 ;53 dc.l reserved_54 ;54 dc.l reserved_55 ;55 dc.l reserved_56 ;56 dc.l reserved_57 ;57 dc.l reserved_58 ;58 dc.l reserved_59 ;59 dc.l reserved_60 ;60 dc.l reserved_61 ;61 dc.l reserved_62 ;62 dc.l reserved_63 ;63 dc.l user_int_64 ;64 Wektory uűytkownika (potwierdzajâce) dc.l user_int_65 ;65 dc.l user_int_66 ;66 dc.l user_int_67 ;67 dc.l user_int_68 ;68 dc.l user_int_69 ;69 dc.l user_int_70 ;70 dc.l user_int_71 ;71 dc.l user_int_72 ;72 dc.l user_int_73 ;73 dc.l user_int_74 ;74 dc.l user_int_75 ;75 dc.l user_int_76 ;76 dc.l user_int_77 ;77 dc.l user_int_78 ;78 dc.l user_int_79 ;79 dc.l user_int_80 ;80 dc.l user_int_81 ;81 dc.l user_int_82 ;82 dc.l user_int_83 ;83 dc.l user_int_84 ;84 dc.l user_int_85 ;85 dc.l user_int_86 ;86 dc.l user_int_87 ;87 dc.l user_int_88 ;88 dc.l user_int_89 ;89 dc.l user_int_90 ;90 dc.l user_int_91 ;91 dc.l user_int_92 ;92 dc.l user_int_93 ;93 dc.l user_int_94 ;94 dc.l user_int_95 ;95 dc.l user_int_96 ;96 dc.l user_int_97 ;97 dc.l user_int_98 ;98 dc.l user_int_99 ;99 dc.l user_int_100 ;100 dc.l user_int_101 ;101 dc.l user_int_102 ;102 dc.l user_int_103 ;103 dc.l user_int_104 ;104 dc.l user_int_105 ;105 dc.l user_int_106 ;106 dc.l user_int_107 ;107 dc.l user_int_108 ;108 dc.l user_int_109 ;109 dc.l user_int_110 ;110 dc.l user_int_111 ;111 dc.l user_int_112 ;112 dc.l user_int_113 ;113 dc.l user_int_114 ;114 dc.l user_int_115 ;115 dc.l user_int_116 ;116 dc.l user_int_117 ;117 dc.l user_int_118 ;118 dc.l user_int_119 ;119 dc.l user_int_120 ;120 dc.l user_int_121 ;121 dc.l user_int_122 ;122 dc.l user_int_123 ;123 dc.l user_int_124 ;124 dc.l user_int_125 ;125 dc.l user_int_126 ;126 dc.l user_int_127 ;127 dc.l user_int_128 ;128 dc.l user_int_129 ;129 dc.l user_int_130 ;130 dc.l user_int_131 ;131 dc.l user_int_132 ;132 dc.l user_int_133 ;133 dc.l user_int_134 ;134 dc.l user_int_135 ;135 dc.l user_int_136 ;136 dc.l user_int_137 ;137 dc.l user_int_138 ;138 dc.l user_int_139 ;139 dc.l user_int_140 ;140 dc.l user_int_141 ;141 dc.l user_int_142 ;142 dc.l user_int_143 ;143 dc.l user_int_144 ;144 dc.l user_int_145 ;145 dc.l user_int_146 ;146 dc.l user_int_147 ;147 dc.l user_int_148 ;148 dc.l user_int_149 ;149 dc.l user_int_150 ;150 dc.l user_int_151 ;151 dc.l user_int_152 ;152 dc.l user_int_153 ;153 dc.l user_int_154 ;154 dc.l user_int_155 ;155 dc.l user_int_156 ;156 dc.l user_int_157 ;157 dc.l user_int_158 ;158 dc.l user_int_159 ;159 dc.l user_int_160 ;160 dc.l user_int_161 ;161 dc.l user_int_162 ;162 dc.l user_int_163 ;163 dc.l user_int_164 ;164 dc.l user_int_165 ;165 dc.l user_int_166 ;166 dc.l user_int_167 ;167 dc.l user_int_168 ;168 dc.l user_int_169 ;169 dc.l user_int_170 ;170 dc.l user_int_171 ;171 dc.l user_int_172 ;172 dc.l user_int_173 ;173 dc.l user_int_174 ;174 dc.l user_int_175 ;175 dc.l user_int_176 ;176 dc.l user_int_177 ;177 dc.l user_int_178 ;178 dc.l user_int_179 ;179 dc.l user_int_180 ;180 dc.l user_int_181 ;181 dc.l user_int_182 ;182 dc.l user_int_183 ;183 dc.l user_int_184 ;184 dc.l user_int_185 ;185 dc.l user_int_186 ;186 dc.l user_int_187 ;187 dc.l user_int_188 ;188 dc.l user_int_189 ;189 dc.l user_int_190 ;190 dc.l user_int_191 ;191 dc.l user_int_192 ;192 dc.l user_int_193 ;193 dc.l user_int_194 ;194 dc.l user_int_195 ;195 dc.l user_int_196 ;196 dc.l user_int_197 ;197 dc.l user_int_198 ;198 dc.l user_int_199 ;199 dc.l user_int_200 ;200 dc.l user_int_201 ;201 dc.l user_int_202 ;202 dc.l user_int_203 ;203 dc.l user_int_204 ;204 dc.l user_int_205 ;205 dc.l user_int_206 ;206 dc.l user_int_207 ;207 dc.l user_int_208 ;208 dc.l user_int_209 ;209 dc.l user_int_210 ;210 dc.l user_int_211 ;211 dc.l user_int_212 ;212 dc.l user_int_213 ;213 dc.l user_int_214 ;214 dc.l user_int_215 ;215 dc.l user_int_216 ;216 dc.l user_int_217 ;217 dc.l user_int_218 ;218 dc.l user_int_219 ;219 dc.l user_int_220 ;220 dc.l user_int_221 ;221 dc.l user_int_222 ;222 dc.l user_int_223 ;223 dc.l user_int_224 ;224 dc.l user_int_225 ;225 dc.l user_int_226 ;226 dc.l user_int_227 ;227 dc.l user_int_228 ;228 dc.l user_int_229 ;229 dc.l user_int_230 ;230 dc.l user_int_231 ;231 dc.l user_int_232 ;232 dc.l user_int_233 ;233 dc.l user_int_234 ;234 dc.l user_int_235 ;235 dc.l user_int_236 ;236 dc.l user_int_237 ;237 dc.l user_int_238 ;238 dc.l user_int_239 ;239 dc.l user_int_240 ;240 dc.l user_int_241 ;241 dc.l user_int_242 ;242 dc.l user_int_243 ;243 dc.l user_int_244 ;244 dc.l user_int_245 ;245 dc.l user_int_246 ;246 dc.l user_int_247 ;247 dc.l user_int_248 ;248 dc.l user_int_249 ;249 dc.l user_int_250 ;250 dc.l user_int_251 ;251 dc.l user_int_252 ;252 dc.l user_int_253 ;253 dc.l user_int_254 ;254 dc.l user_int_255 ;255 ;---------------- Obsîuga bîëdów --------------- bus_error: jsr pamietaj_group0 ;Zapamiëtujemy ramkë ze stosu lea txt_bus_err,A6 ;Wyôwietlamy tekst bsr text_lcd bsr print_group0 ;Wyôwietlamy ramkë stosu moveq #2,d0 bra error_supervisor adres_error: jsr pamietaj_group0 lea txt_adress_err,A6 bsr text_lcd bsr print_group0 moveq #3,d0 bra error_supervisor command_error: jsr pamietaj_group1 ;Zapamiëtaj ramkë stosu lea txt_command_err,a6 ;Wyôwietlamy tekst bsr text_lcd bsr print_group1 ;Wyôwietlamy ramkë stosu moveq #4,d0 bra error_supervisor division_error: jsr pamietaj_group2 lea txt_division_err,a6 bsr text_lcd bsr print_group2 moveq #5,d0 bra error_supervisor chk: jsr pamietaj_group2 lea txt_chk_err,a6 bsr text_lcd bsr print_group2 moveq #6,d0 bra error_supervisor trapv: jsr pamietaj_group2 lea txt_trapv_err,a6 bsr text_lcd bsr print_group2 moveq #7,d0 bra error_supervisor priority_error: jsr pamietaj_group1 lea txt_prioryty_err,a6 bsr text_lcd bsr print_group1 moveq #8,d0 bra error_supervisor trap_error: jsr pamietaj_group2 lea txt_trap_err,a6 bsr text_lcd bsr print_group2 moveq #9,d0 bra error_supervisor emu1010_error: jsr pamietaj_group1 lea txt_emu1010_err,a6 bsr text_lcd bsr print_group1 moveq #10,d0 bra error_supervisor emu1111_error: jsr pamietaj_group1 lea txt_emu1111_err,a6 bsr text_lcd bsr print_group1 moveq #11,d0 bra error_supervisor reserved_12 moveq #12,d0 bra error_supervisor reserved_13 moveq #13,d0 bra error_supervisor reserved_14 moveq #14,d0 bra error_supervisor init_int_error: jsr pamietaj_group1 lea txt_init_int_err,a6 bsr text_lcd bsr print_group1 moveq #15,d0 bra error_supervisor reserved_16 moveq #16,d0 bra error_supervisor reserved_17 moveq #17,d0 bra error_supervisor reserved_18 moveq #18,d0 bra error_supervisor reserved_19 moveq #19,d0 bra error_supervisor reserved_20 moveq #20,d0 bra error_supervisor reserved_21 moveq #21,d0 bra error_supervisor reserved_22 moveq #22,d0 bra error_supervisor reserved_23 moveq #23,d0 bra error_supervisor false_int_error:rte ;Tu lepiej daę powrót bo ; jsr pamietaj_group1 ; czasem wystëpuje faîszywe przerwanie ; lea txt_false_int_err,a6 ; i wyîorzy caîy program, a tak ; bsr text_lcd ; ; bsr print_group1 ; moveq #24,d0 ; bra error_supervisor int_1level: jsr pamietaj_group1 lea txt_int1_err,a6 bsr text_lcd bsr print_group1 moveq #25,d0 bra error_supervisor int_2level: jsr pamietaj_group1 lea txt_int2_err,a6 bsr text_lcd bsr print_group1 moveq #26,d0 bra error_supervisor int_3level: jsr pamietaj_group1 lea txt_int3_err,a6 bsr text_lcd bsr print_group1 moveq #27,d0 bra error_supervisor int_4level: jsr pamietaj_group1 lea txt_int4_err,a6 bsr text_lcd bsr print_group1 moveq #28,d0 bra error_supervisor int_5level: jsr pamietaj_group1 lea txt_int5_err,a6 bsr text_lcd bsr print_group1 moveq #29,d0 bra error_supervisor int_6level: jsr pamietaj_group1 lea txt_int6_err,a6 bsr text_lcd bsr print_group1 moveq #30,d0 bra error_supervisor int_7level: jsr pamietaj_group1 lea txt_int7_err,a6 bsr text_lcd bsr print_group1 moveq #31,d0 bra error_supervisor trap_0: jsr pamietaj_group2 lea txt_trap0_err,a6 bsr text_lcd bsr print_group2 moveq #32,d0 bra error_supervisor trap_1: jsr pamietaj_group2 lea txt_trap1_err,a6 bsr text_lcd bsr print_group2 moveq #33,d0 bra error_supervisor trap_2: jsr pamietaj_group2 lea txt_trap2_err,a6 bsr text_lcd bsr print_group2 moveq #34,d0 bra error_supervisor trap_3: jsr pamietaj_group2 lea txt_trap3_err,a6 bsr text_lcd bsr print_group2 moveq #35,d0 bra error_supervisor trap_4: jsr pamietaj_group2 lea txt_trap4_err,a6 bsr text_lcd bsr print_group2 moveq #36,d0 bra error_supervisor trap_5: jsr pamietaj_group2 lea txt_trap5_err,a6 bsr text_lcd bsr print_group2 moveq #37,d0 bra error_supervisor trap_6: jsr pamietaj_group2 lea txt_trap6_err,a6 bsr text_lcd bsr print_group2 moveq #38,d0 bra error_supervisor trap_7: jsr pamietaj_group2 lea txt_trap7_err,a6 bsr text_lcd bsr print_group2 moveq #39,d0 bra error_supervisor trap_8: jsr pamietaj_group2 lea txt_trap8_err,a6 bsr text_lcd bsr print_group2 moveq #40,d0 bra error_supervisor trap_9: jsr pamietaj_group2 lea txt_trap9_err,a6 bsr text_lcd bsr print_group2 moveq #41,d0 bra error_supervisor trap_10: jsr pamietaj_group2 lea txt_trap10_err,a6 bsr text_lcd bsr print_group2 moveq #42,d0 bra error_supervisor trap_11: jsr pamietaj_group2 lea txt_trap11_err,a6 bsr text_lcd bsr print_group2 moveq #43,d0 bra error_supervisor trap_12: jsr pamietaj_group2 lea txt_trap12_err,a6 bsr text_lcd bsr print_group2 moveq #44,d0 bra error_supervisor trap_13: jsr pamietaj_group2 lea txt_trap13_err,a6 bsr text_lcd bsr print_group2 moveq #45,d0 bra error_supervisor trap_14: jsr pamietaj_group2 lea txt_trap14_err,a6 bsr text_lcd bsr print_group2 moveq #46,d0 bra error_supervisor ;trap_15: jsr pamietaj_group2 ; lea txt_trap15_err,a6 ; bsr text_lcd ; bsr print_group2 ; moveq #47,d0 ; bra error_supervisor reserved_48 moveq #48,d0 bra error_supervisor reserved_49 moveq #49,d0 bra error_supervisor reserved_50 moveq #50,d0 bra error_supervisor reserved_51 moveq #51,d0 bra error_supervisor reserved_52 moveq #52,d0 bra error_supervisor reserved_53 moveq #53,d0 bra error_supervisor reserved_54 moveq #54,d0 bra error_supervisor reserved_55 moveq #55,d0 bra error_supervisor reserved_56 moveq #56,d0 bra error_supervisor reserved_57 moveq #57,d0 bra error_supervisor reserved_58 moveq #58,d0 bra error_supervisor reserved_59 moveq #59,d0 bra error_supervisor reserved_60 moveq #60,d0 bra error_supervisor reserved_61 moveq #61,d0 bra error_supervisor reserved_62 moveq #62,d0 bra error_supervisor reserved_63 moveq #63,d0 bra error_supervisor user_int_64 moveq #64,d0 bra error_supervisor user_int_65 moveq #65,d0 bra error_supervisor user_int_66 moveq #66,d0 bra error_supervisor user_int_67 moveq #67,d0 bra error_supervisor user_int_68 moveq #68,d0 bra error_supervisor user_int_69 moveq #69,d0 bra error_supervisor user_int_70 moveq #70,d0 bra error_supervisor user_int_71 moveq #71,d0 bra error_supervisor user_int_72 moveq #72,d0 bra error_supervisor user_int_73 moveq #73,d0 bra error_supervisor user_int_74 moveq #74,d0 bra error_supervisor user_int_75 moveq #75,d0 bra error_supervisor user_int_76 moveq #76,d0 bra error_supervisor user_int_77 moveq #77,d0 bra error_supervisor user_int_78 moveq #78,d0 bra error_supervisor user_int_79 moveq #79,d0 bra error_supervisor user_int_80 moveq #80,d0 bra error_supervisor user_int_81 moveq #81,d0 bra error_supervisor user_int_82 moveq #82,d0 bra error_supervisor user_int_83 moveq #83,d0 bra error_supervisor user_int_84 moveq #84,d0 bra error_supervisor user_int_85 moveq #85,d0 bra error_supervisor user_int_86 moveq #86,d0 bra error_supervisor user_int_87 moveq #87,d0 bra error_supervisor user_int_88 moveq #88,d0 bra error_supervisor user_int_89 moveq #89,d0 bra error_supervisor user_int_90 moveq #90,d0 bra error_supervisor user_int_91 moveq #91,d0 bra error_supervisor user_int_92 moveq #92,d0 bra error_supervisor user_int_93 moveq #93,d0 bra error_supervisor user_int_94 moveq #94,d0 bra error_supervisor user_int_95 moveq #95,d0 bra error_supervisor user_int_96 moveq #96,d0 bra error_supervisor user_int_97 moveq #97,d0 bra error_supervisor user_int_98 moveq #98,d0 bra error_supervisor user_int_99 moveq #99,d0 bra error_supervisor user_int_100 moveq #100,d0 bra error_supervisor user_int_101 moveq #101,d0 bra error_supervisor user_int_102 moveq #102,d0 bra error_supervisor user_int_103 moveq #103,d0 bra error_supervisor user_int_104 moveq #104,d0 bra error_supervisor user_int_105 moveq #105,d0 bra error_supervisor user_int_106 moveq #106,d0 bra error_supervisor user_int_107 moveq #107,d0 bra error_supervisor user_int_108 moveq #108,d0 bra error_supervisor user_int_109 moveq #109,d0 bra error_supervisor user_int_110 moveq #110,d0 bra error_supervisor user_int_111 moveq #111,d0 bra error_supervisor user_int_112 moveq #112,d0 bra error_supervisor user_int_113 moveq #113,d0 bra error_supervisor user_int_114 moveq #114,d0 bra error_supervisor user_int_115 moveq #115,d0 bra error_supervisor user_int_116 moveq #116,d0 bra error_supervisor user_int_117 moveq #117,d0 bra error_supervisor user_int_118 moveq #118,d0 bra error_supervisor user_int_119 moveq #119,d0 bra error_supervisor user_int_120 moveq #120,d0 bra error_supervisor user_int_121 moveq #121,d0 bra error_supervisor user_int_122 moveq #122,d0 bra error_supervisor user_int_123 moveq #123,d0 bra error_supervisor user_int_124 moveq #124,d0 bra error_supervisor user_int_125 moveq #125,d0 bra error_supervisor user_int_126 moveq #126,d0 bra error_supervisor user_int_127 moveq #127,d0 bra error_supervisor user_int_128 move.b #128,d0 bra error_supervisor user_int_129 move.b #129,d0 bra error_supervisor user_int_130 move.b #130,d0 bra error_supervisor user_int_131 move.b #131,d0 bra error_supervisor user_int_132 move.b #132,d0 bra error_supervisor user_int_133 move.b #133,d0 bra error_supervisor user_int_134 move.b #134,d0 bra error_supervisor user_int_135 move.b #135,d0 bra error_supervisor user_int_136 move.b #136,d0 bra error_supervisor user_int_137 move.b #137,d0 bra error_supervisor user_int_138 move.b #138,d0 bra error_supervisor user_int_139 move.b #139,d0 bra error_supervisor user_int_140 move.b #140,d0 bra error_supervisor user_int_141 move.b #141,d0 bra error_supervisor user_int_142 move.b #142,d0 bra error_supervisor user_int_143 move.b #143,d0 bra error_supervisor user_int_144 move.b #144,d0 bra error_supervisor user_int_145 move.b #145,d0 bra error_supervisor user_int_146 move.b #146,d0 bra error_supervisor user_int_147 move.b #147,d0 bra error_supervisor user_int_148 move.b #148,d0 bra error_supervisor user_int_149 move.b #149,d0 bra error_supervisor user_int_150 move.b #150,d0 bra error_supervisor user_int_151 move.b #151,d0 bra error_supervisor user_int_152 move.b #152,d0 bra error_supervisor user_int_153 move.b #153,d0 bra error_supervisor user_int_154 move.b #154,d0 bra error_supervisor user_int_155 move.b #155,d0 bra error_supervisor user_int_156 move.b #156,d0 bra error_supervisor user_int_157 move.b #157,d0 bra error_supervisor user_int_158 move.b #158,d0 bra error_supervisor user_int_159 move.b #159,d0 bra error_supervisor user_int_160 move.b #160,d0 bra error_supervisor user_int_161 move.b #161,d0 bra error_supervisor user_int_162 move.b #162,d0 bra error_supervisor user_int_163 move.b #163,d0 bra error_supervisor user_int_164 move.b #164,d0 bra error_supervisor user_int_165 move.b #165,d0 bra error_supervisor user_int_166 move.b #166,d0 bra error_supervisor user_int_167 move.b #167,d0 bra error_supervisor user_int_168 move.b #168,d0 bra error_supervisor user_int_169 move.b #169,d0 bra error_supervisor user_int_170 move.b #170,d0 bra error_supervisor user_int_171 move.b #171,d0 bra error_supervisor user_int_172 move.b #172,d0 bra error_supervisor user_int_173 move.b #173,d0 bra error_supervisor user_int_174 move.b #174,d0 bra error_supervisor user_int_175 move.b #175,d0 bra error_supervisor user_int_176 move.b #176,d0 bra error_supervisor user_int_177 move.b #177,d0 bra error_supervisor user_int_178 move.b #178,d0 bra error_supervisor user_int_179 move.b #179,d0 bra error_supervisor user_int_180 move.b #180,d0 bra error_supervisor user_int_181 move.b #181,d0 bra error_supervisor user_int_182 move.b #182,d0 bra error_supervisor user_int_183 move.b #183,d0 bra error_supervisor user_int_184 move.b #184,d0 bra error_supervisor user_int_185 move.b #185,d0 bra error_supervisor user_int_186 move.b #186,d0 bra error_supervisor user_int_187 move.b #187,d0 bra error_supervisor user_int_188 move.b #188,d0 bra error_supervisor user_int_189 move.b #189,d0 bra error_supervisor user_int_190 move.b #190,d0 bra error_supervisor user_int_191 move.b #191,d0 bra error_supervisor user_int_192 move.b #192,d0 bra error_supervisor user_int_193 move.b #193,d0 bra error_supervisor user_int_194 move.b #194,d0 bra error_supervisor user_int_195 move.b #195,d0 bra error_supervisor user_int_196 move.b #196,d0 bra error_supervisor user_int_197 move.b #197,d0 bra error_supervisor user_int_198 move.b #198,d0 bra error_supervisor user_int_199 move.b #199,d0 bra error_supervisor user_int_200 move.b #200,d0 bra error_supervisor user_int_201 move.b #201,d0 bra error_supervisor user_int_202 move.b #202,d0 bra error_supervisor user_int_203 move.b #203,d0 bra error_supervisor user_int_204 move.b #204,d0 bra error_supervisor user_int_205 move.b #205,d0 bra error_supervisor user_int_206 move.b #206,d0 bra error_supervisor user_int_207 move.b #207,d0 bra error_supervisor user_int_208 move.b #208,d0 bra error_supervisor user_int_209 move.b #209,d0 bra error_supervisor user_int_210 move.b #210,d0 bra error_supervisor user_int_211 move.b #211,d0 bra error_supervisor user_int_212 move.b #212,d0 bra error_supervisor user_int_213 move.b #213,d0 bra error_supervisor user_int_214 move.b #214,d0 bra error_supervisor user_int_215 move.b #215,d0 bra error_supervisor user_int_216 move.b #216,d0 bra error_supervisor user_int_217 move.b #217,d0 bra error_supervisor user_int_218 move.b #218,d0 bra error_supervisor user_int_219 move.b #219,d0 bra error_supervisor user_int_220 move.b #220,d0 bra error_supervisor user_int_221 move.b #221,d0 bra error_supervisor user_int_222 move.b #222,d0 bra error_supervisor user_int_223 move.b #223,d0 bra error_supervisor user_int_224 move.b #224,d0 bra error_supervisor user_int_225 move.b #225,d0 bra error_supervisor user_int_226 move.b #226,d0 bra error_supervisor user_int_227 move.b #227,d0 bra error_supervisor user_int_228 move.b #228,d0 bra error_supervisor user_int_229 move.b #229,d0 bra error_supervisor user_int_230 move.b #230,d0 bra error_supervisor user_int_231 move.b #231,d0 bra error_supervisor user_int_232 move.b #232,d0 bra error_supervisor user_int_233 move.b #233,d0 bra error_supervisor user_int_234 move.b #234,d0 bra error_supervisor user_int_235 move.b #235,d0 bra error_supervisor user_int_236 move.b #236,d0 bra error_supervisor user_int_237 move.b #237,d0 bra error_supervisor user_int_238 move.b #238,d0 bra error_supervisor user_int_239 move.b #239,d0 bra error_supervisor user_int_240 move.b #240,d0 bra error_supervisor user_int_241 move.b #241,d0 bra error_supervisor user_int_242 move.b #242,d0 bra error_supervisor user_int_243 move.b #243,d0 bra error_supervisor user_int_244 move.b #244,d0 bra error_supervisor user_int_245 move.b #245,d0 bra error_supervisor user_int_246 move.b #246,d0 bra error_supervisor user_int_247 move.b #247,d0 bra error_supervisor user_int_248 move.b #248,d0 bra error_supervisor user_int_249 move.b #249,d0 bra error_supervisor user_int_250 move.b #250,d0 bra error_supervisor user_int_251 move.b #251,d0 bra error_supervisor user_int_252 move.b #252,d0 bra error_supervisor user_int_253 move.b #253,d0 bra error_supervisor user_int_254 move.b #254,d0 bra error_supervisor user_int_255 move.b #255,d0 bra error_supervisor ;----------------------------------------------- ;Zapamiëtuje zawartoôę rejestrów w zmiennych ; pamietaj_rejestry: move.l D0,b_D0 move.l D1,b_D1 move.l D2,b_D2 move.l D3,b_D3 move.l D4,b_D4 move.l D5,b_D5 move.l D6,b_D6 move.l D7,b_D7 move.l A0,b_A0 move.l A1,b_A1 move.l A2,b_A2 move.l A3,b_A3 move.l A4,b_A4 move.l A5,b_A5 move.l A6,b_A6 rts ;----------------------------------------------- ;Zapamiëtuje ramkë stosu (str. 6-17 68000 Microprocessors User's Manual) ; Wskaúnik zmieniono o +4 poniewaű wykonano podprogram (stos -4) ; pamietaj_group0:bsr pamietaj_rejestry move.w 0+4(A7),b_function_code move.l 2+4(A7),b_access_adress move.w 6+4(A7),b_instruction_register move.w 8+4(A7),b_status_register move.l 10+4(A7),b_program_counter rts ;----------------------------------------------- ;Zapamiëtuje ramkë stosu (str. 6-10 68000 Microprocessors User's Manual) ; Wskaúnik zmieniono o +4 poniewaű wykonano podprogram (stos -4) ; pamietaj_group2: pamietaj_group1:bsr pamietaj_rejestry move.w 0+4(A7),b_status_register move.l 2+4(A7),b_program_counter rts ;----------------------------------------------- ;Wyôwietla liczniki, status, itp zapamiëtane w RAM ; print_group2: print_group1: lea txt_pc,A6 ;napis bsr text_lcd move.l b_program_counter,D0 ;Wyôwietlamy PC bsr long_lcd lea txt_sr,A6 ;Napis bsr text_lcd move.l b_status_register,D0 ;Wyôwietlamy Status register bsr word_lcd lea txt_Dx,A6 ;napis bsr text_lcd move.l b_D0,D0 ;wyô wartoôę rejestru bsr long_lcd lea txt_Ax,A6 ;napis bsr text_lcd move.l b_A5,D0 ;wyô wartoôę rejestru bsr long_lcd bsr spc_lcd ;spacja move.l b_A6,D0 ;wyô wartoôę rejestru bsr long_lcd rts ;----------------------------------------------- ;Wyôwietla liczniki, status, itp zapamiëtane w RAM ; print_group0: lea txt_pc,A6 ;napis bsr text_lcd move.l b_program_counter,D0 ;Wyôwietlamy PC bsr long_lcd lea txt_sr,A6 ;Napis bsr text_lcd move.l b_status_register,D0 ;Wyôwietlamy Status register bsr word_lcd lea txt_asccess,A6 ;Napis bsr text_lcd move.l b_access_adress,D0 ;Wyôwietlamy adres bsr long_lcd lea txt_fcode,A6 ;Napis bsr text_lcd move.b b_function_code,D0 ;wyôwietlamy function code bsr hex_lcd rts ;=============================================== ;Sygnalizacja bîëdu na LED'ach w trybie nadzorcy ;we: D0 - nr bîëdu ; error_supervisor: ; eor.b #$ff,d0 ;Negujemy (ze wzglëdu na sposób wîâczenia diod) moveq #10,d2 ;D2 - liczba powtórzeď FLASHA error_loop: move.b d0,LED ;Zaôwiecenie LED'ów move.l #FLASH_ERR_TIME,d1 ;D1 - Pëtla opóúniajâca error_delay: divs #1,d0 ;NOP dbf d1,error_delay move.b #$00,LED ;Zgaszenie LED'ów move.l #FLASH_ERR_TIME,d1 ;D1 - Pëtla opóúniajâca error_delay2: divs #1,d0 ;NOP dbf d1,error_delay2 dbf d2,error_loop ;Dodaę liczenie obiegów ;??? reset ;Choę tryb nadzorcy to wywoîuje ; bîâd nieistniejâca instrukcja (wektor 4) jmp start ;----------------------------------------------- ;Wykorzystane do przejôcia w tryb nadzorcy i wykonania podprogramu uűytkownika ; zawierajâcego rozkazy dla trybu nadzorcy ;we: A6 - adres procedury zakoďczonej rozkazem RTS ; supervisor: trap #15 ;Wywoîuje stan wyjâtkowy i skok do "trap_15" rts ; wracamy z podprogramu trap_15: jsr (a6) ;Skaczemy do podprogramu rte ; wracamy z przerwania ;=============================================== ;Biegajâcy punkt sygnalizujâcy poprawnâ pracë CPU i ROM ; Jesteômy w trybie nadzorcy start: move.b #%00000001,d0 ;D0 - przesówany wzór moveq #3*8-1,d2 ;D2 - liczba powtorzeď skrola flash_loop: move.b d0,LED rol.b #1,d0 move.l #ROL_ERR_TIME,d1 ;D1 - licznik opóúnienia flash_delay: divs #1,d0 ;NOP dbf d1,flash_delay dbf d2,flash_loop move.b #%00000001,D7 ;D7 - wyniki testów (LED1 - CPU OK) move.b D7,LED move.l #TEST_WAIT_TIME,d1 ;D1 - Pëtla opóúniajâca test0_delay: divs #1,d0 ;NOP dbf d1,test0_delay ;Sprawdzenie sumy kontrolnej ROM bset #1,D7 ;LED2 - CHECKSUM ROM OK move.b D7,LED move.l #TEST_WAIT_TIME,d1 ;D1 - Pëtla opóúniajâca test1_delay: divs #1,d0 ;NOP dbf d1,test1_delay ;Sprawdzenie RAM parzystego lea data_user,A0 ;Adres RAM do A0 move.b #$aa,(A0) ; zapis i odczyt RAM parzytego cmpi.b #$aa,(A0) bne test2_fail move.b #$55,(A0) cmpi.b #$55,(A0) bne test2_fail bset #2,D7 ;LED3 - RAM OK move.b D7,LED move.l #TEST_WAIT_TIME,d1 ;D1 - Pëtla opóúniajâca test2_delay: divs #1,d0 ;NOP dbf d1,test2_delay test2_fail: ;Sprawdzenie RAM nieparzystego lea data_user+1,A0 ;Adres RAM do A0 move.b #$aa,(A0) ; zapis i odczyt RAM nieparzytego cmpi.b #$aa,(A0) bne test3_fail move.b #$55,(A0) cmpi.b #$55,(A0) bne test3_fail bset #3,d7 ;LED4 - RAM OK move.b D7,LED move.l #TEST_WAIT_TIME,d1 ;D1 - Pëtla opóúniajâca test3_delay: divs #1,d0 ;NOP dbf d1,test3_delay test3_fail: ;Sprawdzenie RAM parzystego i nieparzystego lea data_user,A0 ;Adres RAM do A0 move.l #$aaaaffff,(A0) ; zapis i odczyt RAM nieparzytego cmpi.l #$aaaaffff,(A0) bne test4_fail move.l #$55550000,(A0) cmpi.l #$55550000,(A0) bne test4_fail bset #4,d7 ;LED5 - RAM OK move.b D7,LED move.l #TEST_WAIT_TIME,d1 ;D1 - Pëtla opóúniajâca test4_delay: divs #1,d0 ;NOP dbf d1,test4_delay test4_fail: ;Sprawdzenie wyôwietlacza LCD bsr init_lcd ;Inicjalizacja (jeôli jest) move.b #0,D0 ;Ustaw kursor bsr kursor_lcd bsr wait_busy_lcd ;Odczytanie znaku z LCD cmpi.b #" ",LCD_D ;jeôli spacja to OK bne test5_fail bset #5,d7 ;LED6 - LCD OK move.b D7,LED move.l #TEST_WAIT_TIME,d1 ;D1 - Pëtla opóúniajâca test5_delay: divs #1,d0 ;NOP dbf d1,test5_delay test5_fail: bset #6,d7 ;LED7 - move.b D7,LED move.l #TEST_WAIT_TIME,d1 ;D1 - Pëtla opóúniajâca test6_delay: divs #1,d0 ;NOP dbf d1,test6_delay bset #7,d7 ;LED8 - move.b D7,LED move.l #TEST_WAIT_TIME,d1 ;D1 - Pëtla opóúniajâca test7_delay: divs #1,d0 ;NOP dbf d1,test7_delay ;Koniec testów move.l #TEST_WAIT_TIME,d1 ;D1 - Pëtla opóúniajâca test8_delay: divs #1,d0 ;NOP divs #1,d0 divs #1,d0 dbf d1,test8_delay move.b #$00,LED ;Wyîâczenie wszystkich LED ;================ Tryb uűytkownika ============= ; iii ; T.S..210...XNZVC ; move.w #%0000000000000000,SR ;Tryb uűytkownika, wîâczone wszystkie przerwania ; lea stos_user_str,a7 ;Ustawienie stosu urzytkownika ; bsr init_lcd ;inicjalizacja LCD ; lea tekst,A6 ;Wyôwietlenie tekstu ; bsr text_lcd loopL: move.b LCD_D,D0 move.b D0,LED jmp loopL ;----------------------------------------------- migaj: ; eor.b #$ff,d0 ;Negujemy (ze wzglëdu na sposób wîâczenia diod) moveq #10,d2 ;D2 - liczba powtórzeď FLASHA migaj_loop: move.b d0,LED ;Zaôwiecenie LED'ów move.l #FLASH_ERR_TIME,d1 ;D1 - Pëtla opóúniajâca migaj_delay: divs #1,d0 ;NOP dbf d1,migaj_delay move.b #$00,LED ;Zgaszenie LED'ów move.l #FLASH_ERR_TIME,d1 ;D1 - Pëtla opóúniajâca migaj_delay2: divs #1,d0 ;NOP dbf d1,migaj_delay2 dbf d2,migaj_loop ;Dodaę liczenie obiegów ; dc.w $ffff ;Dziaîa - emulator linii F ; dc.w $afff ;Dziaîa - emulator linii A ; divs #0,D0 ;Dziaîa - daje stan wyjâtkowy ; move.w D0,SR ;Dziaîa - naruszenie uprzywilejowania ; trap #5 ;Dziaîa - póîîapka ; move.b $d00000,d0 ;Dziaîa - BusError (nieistniejâcy obszar) ; move.b #0,$000004 ;Dizaîa - BusError (próba zapisu ROM) ; move.b $810000,d0 ;Dziaîa - BusError (przekroczenie ram) ; jmp $12345678 ;Dziaîa - BusError (przekroczenie rom) lea przywilej,a6 ;Wykonanie fragmentu uprzywilejowanego jsr supervisor lea migaj_end,a6 ;Adres programu jsr supervisor ;Od tego momentu wykonujemy tryb nadzorcy migaj_end: move.w SR,D0 move.w D0,SR jmp start przywilej: move.w SR,D0 move.w D0,SR move.b #$f0,LED rts skok: jsr skok2 rts skok2: nop rts ;----------------------------------------------- ;Inicjalizuje wyôwietlacz LCD ; ;??? jak zadziala zastâpię ,LCD_R przez ROZKAZ(A6) - w A6 adres bazy LCD ; init_lcd: move.w #150,d1 ;Wait 15ms bsr delay_100us lea LCD_R,A6 move.b #%00110000,(A6) ;Functiom Set move.w #50,d1 ;Wait 5ms bsr delay_100us move.b #%00110000,(A6) ;Functiom Set move.w #2,d1 ;Wait 200us bsr delay_100us move.b #%00110000,(A6) ;Functiom Set move.b #%00111000,d0 ;szyna 8-bit, 2 linie, znaki 5*7 bsr rozkaz_lcd move.b #%00001000,d0 ;Display OFF bsr rozkaz_lcd move.b #%00000001,d0 ;Clear displey bsr rozkaz_lcd move.b #%00000110,d0 ;Entry mode set bsr rozkaz_lcd move.b #%00001111,d0 ;Display ON bsr rozkaz_lcd ;move.b #%01000000,d0 ;Poczâtek generatora znaków ;bsr rozkaz_lcd ;move.l #63,D6 ;D6 - liczba bajtów do skopiowania ;lea polskie_znaki,A6 ;A6 - adres znakow w ROM init_lcd_l1: ;bsr wait_busy_lcd ;move.b (A6)+,LCD_D ;Niemoűe byę "print_lcd" ponieaű filtruje znaki ;dbf D6,init_lcd_l1 ;move.b #%00000001,d0 ;Clear displey ;bsr rozkaz_lcd bsr clear_tab_lcd ;Czyôę tablicë znaków dynamicznych rts ;----------------------------------------------- ;Czyôci tablicë TAB_CHAR_ASCII ; clear_tab_lcd: movem.l D0/A6,-(A7) ;rejestry na stos move.l #7,D0 ;Liczba znaków w TAB_CHAR_LCD lea tab_char_lcd,A6 ;adres tablicy do A5 init_lcd_l2: move.b #0,(A6)+ ;Zerowanie tablicy TAB_CHAR_LCD dbf D0,init_lcd_l2 movem.l (A7)+,D0/A6 ;rejestry ze stosu rts ;----------------------------------------------- ;Wysyîa znak z rejestru D0 do pamiëci danych LCD ; przeprowadza konwersjë polskich znaków i akceptuje kody sterujâce ; typu: czyszczenie wyôwietlacza, kursor w poîoűenie spoczynkowe, itp ;we: D0.b - znak do wysîania ;wy: -- ;zm: -- ; print_lcd: cmpi.b #CLS,D0 ;Czy kod sterujâcy ? beq cls_lcd ; movem.l D0/A6,-(a7) ;rejestry na stos ; lea tab_konw_pl,a6 ;print_lcd_l2: cmp.b (A6)+,D0 ;czy znak do skonwertowania ? ; beq print_lcd_l1 ; - tak wiëc kowertuj ; cmpa.l #tab_konw_pl+9,A6 ;czy koniec tablicy konwersji ; bne print_lcd_l2 ; - nie wiëc pëtla ; bra print_lcd_l3 ; - tak wiëc skok do drukowania znaku ;print_lcd_l1: move.b 8(A6),D0 ;pobranie skonwerowanego znaku ;print_lcd_l3: bsr wait_busy_lcd ; move.b D0,LCD_D ; movem.l (a7)+,D0/A6 ;rejestry ze stosu ; rts ; ;tab_konw_pl: DC.B "â","ę","ë","î","ď","ó","ô","ű","ú" ; DC.B 08, 01, 02, 03, 04, 05, 06, 07, 07 movem.l D0-D3/A5-A6,-(a7) ;rejestry na stos ;------- Czy znak konwertowaę (nie ma w ROM LCD) --- lea tab_specjalne_lcd,a6 ;adres tablicy znaków do konwertowania print_lcd_l2: cmp.b (A6),D0 ;czy znak do skonwertowania ? beq print_lcd_l1 ; - tak wiëc kowertuj adda.l #1,A6 ; - nie wiëc next kod cmpa.l #tab_alternatywne_lcd,A6 ;czy koniec tablicy konwersji bne print_lcd_l2 ; - nie wiëc pëtla bra print_lcd_l3 ; - tak wiëc skok do drukowania znaku bez zmian ;------- Czy znak jest juű w TAB_CHAR_LCD czyli takűe w pamiëci LCD --- print_lcd_l1: move.l #7,D1 ;Liczba znaków w TAB_CHAR_LCD lea tab_char_lcd,A5 ;adres TAB_CHAR_LCD do A5 print_lcd_l5: cmp.b (A5),D0 ;czy znak jest juű w TAB_CHAR_LCD beq print_lcd_l4 ; - tak wiëc drukuj zgodnie ze znalezionym kodem adda.l #1,A5 ; - nie wiëc next kod dbf D1,print_lcd_l5 ;jeôli nie koniec tablicy to skok ;------- Czy sâ wolne miejsca w TAB_CHAR_LCD --- move.l #7,D1 ;Liczba znaków w TAB_CHAR_LCD lea tab_char_lcd,A5 ;adres TAB_CHAR_LCD do A5 print_lcd_l7: cmpi.b #0,(A5) ;Czy jest wolny kod w TAB_CHAR_LCD beq print_lcd_l6 ; - tak wiëc wyôlij wzór adda.l #1,A5 ; - nie wiëc next kod dbf D1,print_lcd_l7 ;jeôli nie koniec tablicy to skok ;------- Nie da sië przesîaę wzoru znaku wiëc podstaw alternatywny --- adda.l #tab_alternatywne_lcd-tab_specjalne_lcd,A6 move.b (A6),D0 bra print_lcd_l3 ;------- Wpisz kod znaku do TAB_CHAR_LCD i wyôlij wzór znaku do RAM LCD --- ;D0 - kod znaku ;A6 - adres znaku w tab_specjalne_lcd ;A5 - adres kodu znaku w TAB_CHAR_LCD print_lcd_l6: move.b D0,(A5) ;Kod znaku do TAB_CHAR_LCD suba.l #tab_specjalne_lcd,A6 ;Obliczenie nr wzoru znaku move.l A6,D1 ;nr wzoru do D1 rol #3,D1 ;i monoűymy przez 8 (liczba bajtów znaku) lea polskie_znaki,A6 ;A6 - adres wzorów znaków adda.l D1,A6 ;dodajemy do obliczonego ofsetu bsr wait_busy_lcd ;Odczyt pozycji kursora move.b LCD_R,D2 ; i zapamiëtanie w D2 move.l A5,D0 ;Obliczenie nr znaku w RAM LCD sub.l #tab_char_lcd,D0 rol #3,D0 ;monoűymy przez 8 (liczba bajtów znaku) or.b #%01000000,d0 ;Adres generatora znaków w LCD bsr rozkaz_lcd move.l #7,D6 ;D6 - liczba bajtów do skopiowania print_lcd_l8: bsr wait_busy_lcd ;kopiowanie wzoru znaku do RAM LCD move.b (A6)+,LCD_D ;Nie moűe byę "print_lcd" ponieaű filtruje znaki dbf D6,print_lcd_l8 move.b D2,D0 ;Odtworzenie pozycji kursora bsr kursor_lcd ; i ustawienie go ;------- Wysîanie znaku o kodzie w A5 (z tablicy TAB_CHAR_LCD) --- print_lcd_l4: suba.l #tab_char_lcd,A5 ;Obliczenie nr znaku w RAM LCD move.l A5,D0 ;wynik do D0 ;------- Drukowanie kodu z D0 na LCD --- print_lcd_l3: bsr wait_busy_lcd ;Drukowanie na LCD kodu z D0 move.b D0,LCD_D movem.l (a7)+,D0-D3/A5-A6 ;rejestry ze stosu rts tab_specjalne_lcd: DC.B "â","ę","ë","î","ď","ó","ô","ű","ú" DC.B "Â","Ę","Ë","Î","Ď","Ó","Ô","Ű","Ú" DC.B POZIOM1,POZIOM2,POZIOM3,POZIOM4 DC.B STRZALKA_L,STRZALKA_P,PLAY tab_alternatywne_lcd: DC.B "a","c","e","l","n","o","s","z","z" DC.B "A","C","E","L","N","O","S","Z","Z" DC.B $20,$20,$ff,$ff DC.B "<",">",">" ;------- Kolejnoôę kodów musi byę taka sama jak w tablicy "tab_specjalne_lcd" polskie_znaki: DC.B %00000 ; â DC.B %00000 DC.B %01110 DC.B %00001 DC.B %01111 DC.B %10001 DC.B %01111 DC.B %00010 DC.B %00010 ; ę DC.B %00100 DC.B %01110 DC.B %10000 DC.B %10000 DC.B %10001 DC.B %01110 DC.B %00000 DC.B %00000 ; ë DC.B %00000 DC.B %01110 DC.B %10001 DC.B %11111 DC.B %10000 DC.B %01110 DC.B %00010 DC.B %11000 ; î DC.B %01000 DC.B %01100 DC.B %01000 DC.B %11000 DC.B %01000 DC.B %11100 DC.B %00000 DC.B %00010 ; ď DC.B %00100 DC.B %10110 DC.B %11001 DC.B %10001 DC.B %10001 DC.B %10001 DC.B %00000 DC.B %00010 ; ó DC.B %00100 DC.B %01110 DC.B %10001 DC.B %10001 DC.B %10001 DC.B %01110 DC.B %00000 DC.B %00010 ; ô DC.B %00100 DC.B %01110 DC.B %10000 DC.B %01110 DC.B %00001 DC.B %11110 DC.B %00000 DC.B %00000 ; ű DC.B %00000 DC.B %11111 DC.B %00010 DC.B %01110 DC.B %01000 DC.B %11111 DC.B %00000 DC.B %00110 ; ú DC.B %00000 DC.B %11111 DC.B %00010 DC.B %00100 DC.B %01000 DC.B %11111 DC.B %00000 DC.B %01110 ; Â DC.B %10001 DC.B %10001 DC.B %10001 DC.B %11111 DC.B %10001 DC.B %10001 DC.B %00010 DC.B %00010 ; Ę DC.B %01111 DC.B %10101 DC.B %10000 DC.B %10000 DC.B %10001 DC.B %01110 DC.B %00000 DC.B %11111 ; Ë DC.B %10000 DC.B %10000 DC.B %11110 DC.B %10000 DC.B %10000 DC.B %11111 DC.B %00010 DC.B %10000 ; Î DC.B %10000 DC.B %10100 DC.B %11000 DC.B %10000 DC.B %10000 DC.B %11111 DC.B %00000 DC.B %10101 ; Ď DC.B %10001 DC.B %11001 DC.B %10101 DC.B %10011 DC.B %10001 DC.B %10001 DC.B %00000 DC.B %00010 ; Ó DC.B %01110 DC.B %10101 DC.B %10001 DC.B %10001 DC.B %10001 DC.B %01110 DC.B %00000 DC.B %00010 ; Ô DC.B %01110 DC.B %10101 DC.B %10000 DC.B %01110 DC.B %00001 DC.B %11110 DC.B %00000 DC.B %11111 ; Ű DC.B %00001 DC.B %00001 DC.B %00010 DC.B %01110 DC.B %01000 DC.B %11111 DC.B %00000 DC.B %00100 ; Ú DC.B %11111 DC.B %01001 DC.B %00010 DC.B %00100 DC.B %01000 DC.B %11111 DC.B %00000 DC.B %10000 ; Poziom1 DC.B %10000 DC.B %10000 DC.B %10000 DC.B %10000 DC.B %10000 DC.B %10000 DC.B %10000 DC.B %11000 ; Poziom2 DC.B %11000 DC.B %11000 DC.B %11000 DC.B %11000 DC.B %11000 DC.B %11000 DC.B %11000 DC.B %11100 ; Poziom3 DC.B %11100 DC.B %11100 DC.B %11100 DC.B %11100 DC.B %11100 DC.B %11100 DC.B %11100 DC.B %11110 ; Poziom4 DC.B %11110 DC.B %11110 DC.B %11110 DC.B %11110 DC.B %11110 DC.B %11110 DC.B %11110 DC.B %00010 ; Sprzaîka Lewo DC.B %00100 DC.B %01100 DC.B %11111 DC.B %01100 DC.B %00100 DC.B %00010 DC.B %00000 DC.B %01000 ; Sprzaîka Prawo DC.B %00100 DC.B %00110 DC.B %11111 DC.B %00110 DC.B %00100 DC.B %01000 DC.B %00000 DC.B %01000 ; Play DC.B %01100 DC.B %01110 DC.B %01111 DC.B %01110 DC.B %01100 DC.B %01000 DC.B %00000 ;----------------------------------------------- ;Wysyîa dîugiesîowo jako osiem znaków HexASCII na LCD ;we: D0.l - sîowo do wyôwietlenia ;wy: -- ;zm: -- ; long_lcd: movem.l D0,-(A7) ;rejestry na stos movem.l D0,-(A7) ;zapamiëtanie D0 lsr.l #8,D0 ;wybranie starszego sîowa lsr.l #8,D0 bsr word_lcd ;na LCD movem.l (A7)+,D0 ;odtworzenie D0 bsr word_lcd ;Mîodsze sîowo na LCD movem.l (A7)+,D0 ;rejestry ze stosu rts ;----------------------------------------------- ;Wysyîa sîowo jako cztery znaki HexASCII na LCD ;we: D0.w - sîowo do wyôwietlenia ;wy: -- ;zm: -- ; word_lcd: movem.l D0,-(A7) ;rejestry na stos movem.w D0,-(A7) ;zapamiëtanie D0 lsr.w #8,D0 ;wybranie starszego bajtu bsr hex_lcd ;na LCD movem.w (A7)+,D0 ;odtworzenie D0 bsr hex_lcd ;Mîodszy bajt na LCD movem.l (A7)+,D0 ;rejestry ze stosu rts ;----------------------------------------------- ;Wysyîa bajt jako dwa znaki w HexASCII na LCD ;we: D0.b - bajt do wyôwietlenia ;wy: -- ;zm: -- ; hex_lcd: movem.l D0,-(A7) ;rejestry na stos movem.w D0,-(A7) ;zapamiëtanie D0 lsr.b #4,D0 ;wybranie starszego nibla bsr nible_lcd ;na LCD movem.w (A7)+,D0 ;odtworzenie D0 bsr nible_lcd ;mîodzy nible na LCD movem.l (A7)+,D0 ;rejestry ze stosu rts ;----------------------------------------------- ;Wysyîa nible w HexASCII na LCD ;we: D0.b - bajt do wyôwietlenia ;wy: -- ;zm: -- ; nible_lcd: movem.l D0/A6,-(A7) ;rejestry na stos lea tab_hex,A6 ;adres tablicy konwersji andi.w #$0F,D0 ;tylko mîodszy póîbajt move.b 0(A6,D0.w),D0 ;pobranie z tabliwy bsr print_lcd ;na LCD movem.l (A7)+,D0/A6 ;rejestry ze stosu rts tab_hex: DC.B '0123456789ABCDEF' ;----------------------------------------------- ;Wysyîa tekst wskazywany przez A6 do pamiëci danych LCD ;we: A6.l - adres tekstu ;wy: -- ;zm: A6 ; text_lcd: movem.l D0,-(a7) ;rejestry na stoso text_lcd_l1: move.b (A6)+,D0 ;Dana do D0 beq text_lcd_quit ;jeôli #0 to koniec bsr print_lcd ;wyôlij znak na LCD bra text_lcd_l1 ;pëtla text_lcd_quit: movem.l (a7)+,D0 ;rejestry ze stosu rts ;----------------------------------------------- ;Drukuje spacjë na LCD ;we: -- ;wy: -- ;zm: -- ; spc_lcd: movem.l D0,-(A7) ;Rejestry na stos move.b #" ",D0 ;Kod SPACJI bsr print_lcd ;Wyslanie do LCD movem.l (A7)+,D0 ;rejestry ze stosu rts ;----------------------------------------------- ;Czyôci wyôwietlacz LCD ;we: -- ;wy: -- ;zm: -- ; cls_lcd: movem.l D0,-(A7) ;Rejestry na stos move.b #%00000001,D0 ;rozkaz dla LCD bsr rozkaz_lcd ;wykonanie rozkazu bsr clear_tab_lcd ;Czyôę tablicë znaków dynamicznych movem.l (A7)+,D0 ;rejestry ze stosu rts ;----------------------------------------------- ;Wysyîa znak z rejestru D0 jako rozkaz do LCD ;we: D0.b - rozkaz do wysîania ;wy: -- ;zm: -- ; rozkaz_lcd: bsr wait_busy_lcd ;Czeka aű LCD wolny move.b D0,LCD_R rts ;----------------------------------------------- ;Ustawia kursor na pozycji wskazanej przez D0 ;we: D0.b - pozycja znaku na LCD ;wy: -- ;zm: D0 ; kursor_lcd: or.b #%10000000,d0 bra rozkaz_lcd ;----------------------------------------------- ;Czeka na zakoďczenie operacji przez strownik LCD ;we: -- ;wy: -- ;zm: -- ; wait_busy_lcd: movem.l D0,-(A7) ;rejestry na stos move.l #CAL100us*100,D0 ;licznik max czasu czekania (10ms) ; czas prawdziwy dla 6MHz wait_busy_lcd1: dbf D0,wait_busy_lcd2 ; - jeôli koniec czasu to wyjdú bra wait_busy_lcd3 wait_busy_lcd2: btst.b #7,LCD_R ;czy LCD wolny? bne wait_busy_lcd1 ; - nie toczekaj dalej wait_busy_lcd3: movem.l (a7)+,D0 ;rejestry ze stosu rts ;----------------------------------------------- ;Czeka czas zawarty w D1 razy 100µs (100µs...6,5s) ;we: D1.w - czas oczekiwania w us ;wy: -- ;zm: D1 ; delay_100us: andi #$ffff,d1 delay_100us_l1: movem.l d1,-(a7) ;rejestry na stos move.l #CAL100us,d1 ;D1 - Pëtla opóúniajâca 100us delay_100us_l2: nop ; czas prawdziwy dla 6MHz dbf d1,delay_100us_l2 movem.l (a7)+,d1 ;rejestry ze stosu dbf d1,delay_100us_l1 rts ;----------------------------------------------- txt_pc: DC.B ' PC=',0 txt_sr: DC.B ' SR=',0 txt_asccess: DC.B ' AC=',0 txt_fcode: DC.B ' FC=',0 txt_Ax DC.B ' Ax=',0 txt_Dx DC.B ' Dx=',0 txt_bus_err: DC.B CLS,'Bus',0 txt_adress_err: DC.B CLS,'Adres',0 txt_command_err:DC.B CLS,'Command',0 txt_division_err: DC.B CLS,'Division0',0 txt_chk_err: DC.B CLS,'Chk',0 txt_trapv_err: DC.B CLS,'TrapV',0 txt_prioryty_err: DC.B CLS,'Prioryty',0 txt_trap_err: DC.B CLS,'Trap',0 txt_emu1010_err:DC.B CLS,'Emu1010',0 txt_emu1111_err:DC.B CLS,'Emu1111',0 txt_init_int_err: DC.B CLS,'InitInt',0 txt_false_int_err: DC.B CLS,'FalseInt',0 txt_int1_err: DC.B CLS,'Int1',0 txt_int2_err: DC.B CLS,'Int2',0 txt_int3_err: DC.B CLS,'Int3',0 txt_int4_err: DC.B CLS,'Int4',0 txt_int5_err: DC.B CLS,'Int5',0 txt_int6_err: DC.B CLS,'Int6',0 txt_int7_err: DC.B CLS,'Int7',0 txt_trap0_err: DC.B CLS,'Trap0',0 txt_trap1_err: DC.B CLS,'Trap1',0 txt_trap2_err: DC.B CLS,'Trap2',0 txt_trap3_err: DC.B CLS,'Trap3',0 txt_trap4_err: DC.B CLS,'Trap4',0 txt_trap5_err: DC.B CLS,'Trap5',0 txt_trap6_err: DC.B CLS,'Trap6',0 txt_trap7_err: DC.B CLS,'Trap7',0 txt_trap8_err: DC.B CLS,'Trap8',0 txt_trap9_err: DC.B CLS,'Trap9',0 txt_trap10_err: DC.B CLS,'Trap10',0 txt_trap11_err: DC.B CLS,'Trap11',0 txt_trap12_err: DC.B CLS,'Trap12',0 txt_trap13_err: DC.B CLS,'Trap13',0 txt_trap14_err: DC.B CLS,'Trap14',0 txt_trap15_err: DC.B CLS,'Trap15',0 ;----------------------------------------------- tekst: DC.B CLS,'Ala ma kota, a kot ma chëę na ALË ',STRZALKA_L,STRZALKA_P,PLAY,0 ;----------------------------------------------- bo jakieś 20 lat minęło. Edytowano Lipiec 21, 2019 przez InspektorGadzet 1 Cytuj Link do komentarza Share on other sites More sharing options...
Pomocna odpowiedź
Dołącz do dyskusji, napisz odpowiedź!
Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!