[ASM] Translator języka asm dla MC146805

Kącik dla elektroniki retro - układy, urządzenia, podzespoły, literatura itp.
Awatar użytkownika
gaweł
Geek
Geek
Posty: 1259
Rejestracja: wtorek 24 sty 2017, 22:05
Lokalizacja: Białystok

[ASM] Translator języka asm dla MC146805

Postautor: gaweł » poniedziałek 29 sie 2022, 00:35

Procek MC146805

mc146805man.png


Napisałem translator (kompilator asm) dla procka MC146805E2. Oczywista, że bez dostępu do właściwej wiedzy operacja ta jest niewykonalna (daje się wygooglać właściwe manuale, choć wymaga to trochę zachodu).
Procek ten jest jedynym z rodziny mikrokontrolerów MC6805, który nadaje się do odzysku, gdyż jak wiadomo, jest on od dawna nieprodukowany. Rodzina ta obejmuje kilka układów, które mają różne literki na końcu. Wszystkie te układy mają wbudowaną pamięć ROM przeznaczoną na program, której nie da się przeprogramować (bo to ROM) oraz nie oferują interfejsu do obsługi pamięci zawierającej program. Wyjątek stanowi układ z oznaczeniem E2 na końcu, który z definicji nie zawiera pamięci ROM na program, natomiast udostępnia pełny interfejs do obsługi pamięci na zewnątrz. Układ MC146805E2 jest w architekturze von Neumanna, więc przestrzeń adresowa procka (całe 8kB) można sobie dowolnie podzielić (z wyjątkiem obszaru pokrytego przez wewnętrzną pamięć RAM). Możliwe jest zatem (kosztem przestrzeni programu) dodanie własnych peryferali lub dodatkowej pamięci RAM. Chłopaki z Motoroli zrobili to jak zrobili, bo przykładowo procki z rodziny C51 mające nawet wbudowaną pamięć stałą ROM, której nie da się modyfikować, można zmusić by z definicji sięgali do pamięci zewnętrznej (każdy odzyskowy procek C51 da się zmusić, by realizował inny program niż ma wbity na stałe, w motorolce tego zrobić się nie da).
Wewnętrzna budowa mikrokontrolera przedstawia się następująco:
146805-arch.png

Zawarty w procku blok pamięci RAM ma swoją strukturę, ale zanim, to wcześniej należy przedstawić tryby adresowania pamięci w omawianym procku (wynikają one w jakiejś części z cech dawcy genów → procka MC6800). W prockach motorolowych występuje adres typu direct (bezpośrednio podany w kodzie instrukcji) z tym, że MC6800 (jak i MC146805) oferuje ten adres w formie skróconej do młodszego bajtu adresu (adres typu direct strony zerowej). Istnieje możliwość użycia do adresowania rejestru indeksowego X, z tym, że MC146805 znacznie rozszerza możliwości adresowania: do zawartości rejestru indeksowego można dodać stały ofset. Coś takiego występuje w Z80 w parze z rejestrem IX lub IY, ale w Z80 ofset jest jednobajtowy traktowany jako liczba w kodzie U2 (może być dodatni lub ujemny). W motorolce ofset jest w kodzie bez znaku (przez co ma dwukrotnie większy zakres) oraz może być jednobajtowy lub dwubajtowy. Reasumując, adres w MC146805 może być:
  • jednobajtowy direct (dotyczy strony zerowej: przestrzeń adresowa od 0 do FF hex),
  • dwubajtowy direct (adres dowolnego miejsca w przestrzeni adresowej),
  • indeksowy bez ofsetu (z racji, że rejestr X jest 8-bitowy adres dotyuczy strony zerowej),
  • indeksowy z jednobajtowym ofsetem,
  • indeksowy z dwubajtowym ofsetem,
  • relatywny jednobajtowy (w instrukcjach skoku) traktowany jako liczba ze znakiem (można skoczyć do przodu lub do tyłu).
Należy tu pamiętać, że (w odróżnieniu od MC6800) rejestr indeksowy X jest 8-bitowy.
146805-ram.png

Pamięć EPROM (z programem) należy tak umieścić w przestrzeni adresowej, by jej koniec „stykał” z końcem przestrzeni adresowej, gdyż ostatnie bajty przestrzeni zajmują wektory przerwań i resetu (i muszą znaleźć się w obrębie pamięci). Są to:
  • adres procedury obsługi przerwania od timer'a (lokacja 1FF8:1FF9 hex),
  • adres procedury obsługi przerwania zewnętrznego (lokacja 1FFA:1FFB hex),
  • adres procedury obsługi przerwania programowego (lokacja 1FFC:1FFD hex),
  • adres procedury uruchomienia po reset (lokacja 1FFE:1FFF hex).
Akcja resetu między innymi ustawia wskaźnik stosu na 7F hex (to samo robi instrukcja RSP).
Wykonywanie programu może zostać chwilowo zawieszone z powodu reakcji na przerwanie. Obsługa przerwania zapisuje na stos komplet rejestrów (akumulator, rejestr indeksowy, rejestr wskaźników i licznik rozkazów PC), pobiera w zależności od rodzaju przerwania odpowiednią parę bajtów z obszaru wektorów przerwań wskazującą na adres obsługi przerwania i tam przechodzi.

Znaleziony manual:
M6805 HMOS, M146805 CMOS family microcomputer_microprocessor users manual, 1983 (MOTOROLA).pdf
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.

Prawdziwe słowa nie są przyjemne. Przyjemne słowa nie są prawdziwe.
Lao Tse

Awatar użytkownika
gaweł
Geek
Geek
Posty: 1259
Rejestracja: wtorek 24 sty 2017, 22:05
Lokalizacja: Białystok

Re: [ASM] Translator języka asm dla MC146805

Postautor: gaweł » wtorek 30 sie 2022, 13:24

W niektórych szczegółach assembler tego cudaka trochę odbiega od ogólnie przyjętej symboliki. Tak jak zwyczajowo do wbicia obszarów stałych w kod programu używa się zaklęć DEFB, DEFW tu mają one swoje oryginalne brzmienie (jest to chyba ogólna cecha procków MC6800 i ich pochodnych). W cytowanej wyżej dokumentacji nie ma opisu języka asm, więc w jakiś sposób posiłkowałem się opisem asm dla procka MC6800 (no i troszkę wymyśliłem sam, bo w literaturze nie znalazłem). Trącając literaturę to sama Motorola sprawia wrażenie niezdecydowanej. Wzorzec (MC6800) dla kolejnych pokoleń układów ma dwa rejestry akumulatorów: rejestr A i rejestr B. Napotkałem dwie konwencje zapisu. Na przykładzie instrukcji wpisu danych do akumulatora w niektórych firmowych dokumentach występuje pisownia (przykładowo wpis stałej do rejestru):

Kod: Zaznacz cały

LDA  A,#123           ; za instrukcją występuje symbol rejestru
LDA  B,#123           ; j/w
LDAA  #123           ; symbol rejestru wchodzi w mnemonik generując zwiększoną liczbę słów kluczowych
LADB  #123           ; j/w


Na szczęście w MC146805 tego typu problemów nie ma. Procek ma jeden rejestr akumulatora A i jako taki nie występuje w formie słowa kluczowego. Ciekawostką w stosunku do MC6800 jest to, że rejestr indeksowy X jest również 8-bitowy i może występować w roli akumulatora (można wykonywać operacje na rejestrze X identycznie jak na akumulatorze A → te same operacje, te same operandy i wynik jest zachowany w rejestrze X). Trochę dziwne.
Motorolowe mnemoniki do definiowania stałych i zmiennych są następujące:
  • FCC – wbija w kod stałe tekstowe (mój program traktuje identycznie zaklęcie DEFM i FCC),
  • FCB – wbija w kod stałe jednobajtowe (w programie tożsame z DEFB),
  • FDB – wbija w kod stałe dwubajtopwe (tożsame z DEFW),
  • RMB – rezerwuje miejsce na zmienną (tożsame z DEFS).

W rejestrze Condition Code (rejestr flag operacji) występują następujące wskaźniki:
  • C – wskaźnik przeniesienia/pożyczki,
  • Z – wskaźnik sygnalizujący zerowy wynik operacji arytmetycznej lub logicznej,
  • N – wskaźnik sygnalizujący ujemny wynik w kodzie U2,
  • H – wskaźnik przeniesienia połówkowego w arytmetyce BCD
  • I – wskaźnik zezwolenia na przerwania.

Wskaźniki te mogą być testowane przez instrukcje skoku warunkowego.

ZESTAW INSTRUKCJI

W opisie stosowana jest następująca symbolika:
  • M – zawartość dowolnej komórki pamięci jakkolwiek zaadresowanej,
  • A – rejestr akumulatora,
  • X – rejestr indeksowy,
  • n – numer bitu (liczba 0 .. 7),
  • IMM – operand jako stała (w instrukcjach poprzedzony znakiem #),
  • DIR – adres bezpośredni w pamięci w obrębie strony zerowej (1 bajt),
  • EXT – adres bezpośredni w pamięci dowolnego miejsca (2 bajty),
  • IX0 – adres zawarty w rejestrze indeksowym bez ofsetu,
  • IX1 – adres zawarty w rejestrze indeksowym plus jednobajtowy ofset,
  • IX2 – adres zawarty w rejestrze indeksowym plus dwubajtowy ofset,
  • REL – adres relatywny (1 bajt) jako liczba w kodzie U2.

Przykładowo:
  • ADD #IMM – dodaj do zawartości akumulatora stałą IMM (A = A + IMM),
  • ADD DIR – dodaj do zawartości akumulatora zawartość komórki pamięci ze strony zerowej (A = A + MEM [ DIR ]),
  • ADD EXT – dodaj do zawartości akumulatora zawartość komórki pamięci z dowolnego miejsca przestrzeni adresowej (A = A + MEM [ EXT ]),
  • ADD X – dodaj do zawartości akumulatora zawartość komórki pamięci adresowanej przez rejestr indeksowy bez dodatkowego ofsetu (A = A + MEM [ X ]),
  • ADD ,X – jak wyżej (alternatywna postać zapisu),
  • ADD IX1,X – dodaj do zawartości akumulatora zawartość komórki pamięci adresowanej przez rejestr indeksowy z jednobajtowym ofsetem (A = A + MEM [ X + IX1 ]),
  • ADD IX2,X – dodaj do zawartości akumulatora zawartość komórki pamięci adresowanej przez rejestr indeksowy z dwubajtowym ofsetem (A = A + MEM [ X + IX2 ] ).

Instrukcje są ułożone w kolejności alfabetycznej.

  • ADC – dodawanie z uwzględnieniem wskaźnika C
    Działanie: A = A + M + C
    Opis: Dodaje do zawartości akumulatora zawartość komórki pamięci M lub wartości operandu IMM z uwzględnieniem wskaźnika C. Dopuszczalne operandy:
    ADC #IMM
    ADC DIR
    ADC EXT
    ADC X
    ADC IX1,X
    ADC IX2,X
  • ADD – dodawanie
    Działanie: A = A + M
    Opis: Dodaje do zawartości akumulatora zawartość komórki pamięci M lub wartość operandu IMM. Dopuszczalne operandy:
    ADD #IMM
    ADD DIR
    ADD EXT
    ADD X
    ADD IX1,X
    ADD IX2,X
  • AND – logiczny AND
    Operacja: A = A & M
    Opis: Wykonuje logiczne AND pomiędzy zawartością A a zawartością M lub wartością operandu IMM i umieszcza wynik w A. Dopuszczalne operandy:
    AND #IMM
    AND DIR
    AND EXT
    AND X
    AND IX1,X
    AND IX2,X
  • ASL — przesunięcie arytmetyczne w lewo zawartości komórki pamięci
    Opis: Przesuwa wszystkie bity M o jedno miejsce w lewo. Bit 0 jest ładowany zerem. Bit C przyjmuje wartość z najbardziej znaczącego bitu M. Dopuszczalne operandy:
    ASL DIR
    ASL X
    ASL IX1,X
  • ASLA — przesunięcie arytmetyczne w lewo zawartości akumulatora
    Opis: jak ASL tylko dotyczy akumulatora
  • ASLX — przesunięcie arytmetyczne w lewo zawartości rejestru indeksowego
    Opis: jak ASL tylko dotyczy rejestru indeksowego
  • ASR – przesunięcie arytmetyczne w prawo zawartości komórki pamięci
    Opis: Przesuwa wszystkie bity M o jedno miejsce w prawo. Bit 7 jest ładowany zerem. Bit C przyjmuje wartość z najmniej znaczącego bitu M. Dopuszczalne operandy:
    ASR DIR
    ASR X
    ASR IX1,X
  • ASRA – przesunięcie arytmetyczne w prawo zawartości akumulatora
    Opis: jak ASR tylko dotyczy akumulatora
  • ASRX – przesunięcie arytmetyczne w prawo zawartości rejestru indeksowego
    Opis: jak ASR tylko dotyczy rejestru indeksowego
  • BCC – skok, jeśli C=0
    Działanie: PC = PC + 0002 + REL jeśli C = 0
    Opis: Testuje stan bitu C i powoduje skok relatywny jeżeli C=0
  • BCLR – zeruj wskazany bit komórki pamięci ze strony zerowej
    Opis: Zerowanie bitu n (n = 0, 7) w lokalizacji M (z adresem DIR). Wszystkie inne bity w M pozostają nienaruszone.
  • BCS – skok, jeśli C=1
    Działanie: PC = PC + 0002 + REL jeśli C = 1
    Opis: Testuje stan bitu C i powoduje skok relatywny jeżeli C=1
  • BEQ – skok, jeśli Z=1
    Działanie: PC = PC + 0002 + REL jeśli Z = 1
    Opis: Testuje stan bitu Z i powoduje skok relatywny jeżeli Z=1
  • BHCC – skok, jeśli H=0
    Działanie: PC = PC + 0002 + REL jeśli H = 0
    Opis: Testuje stan bitu Z i powoduje skok relatywny jeżeli H=0
  • BHCS – skok, jeśli H=1
    Działanie: PC = PC + 0002 + REL jeśli H = 1
    Opis: Testuje stan bitu Z i powoduje skok relatywny jeżeli H=1
  • BHI – skok, jeśli większe
    Działanie: PC = PC + 0002 + REL jeśli (C lub Z) = 0
    Opis: wykonuje warunkowo skok relatywny, jeśli zarówno wskaźniki C i Z wynoszą zero (jeśli A > M - liczby binarne bez znaku).
  • BHS – skok, jeśli większe lub równe
    Działanie: PC = PC + 0002 + REL jeśli C = 0
    Opis: Po porównaniu lub odjęciu bez znaku, BHS spowoduje rozgałęzienie, jeśli rejestr był wyższy lub taki sam jak bajt we wskazanej lokalizacji w pamięci.
  • BIH – skok jeśli pin INT jest w stanie wysokim,
    Działanie: PC = PC + 0002 + REL jeśli INT = 1
    Opis: Testuje stan pinu zewnętrznego przerwania i robi skok jeśli jest on wysoki.
  • BIL – skok jeśli pin INT jest w stanie niskim,
    Działanie: PC = PC + 0002 + REL jeśli INT = 0
    Opis: Testuje stan pinu zewnętrznego przerwania i robi skok jeśli jest on niski.
  • BIT – test zawartości akumulatora i zawartości komórki pamięci
    Operacja: A and M
    Opis: Wykonuje logiczne AND zawartości A i zawartości M lub wartości operandu IMM i odpowiednio modyfikuje stany wskaźników (bez zachowania wyniku operacji). Dopuszczalne operandy:
    BIT #IMM
    BIT DIR
    BIT EXT
    BIT X
    BIT IX1,X
    BIT IX2,X
  • BLO – skok, jeśli mniejsze
    Działanie: PC = PC + 0002 + REL jeśli C = 1
    Opis: powoduje skok, jeśli zarówno C = 1 (jeśli A < M - liczby binarne bez znaku).
  • BLS – skok, jeśli mniejsze lub takie same
    Działanie: PC = PC + 0002 + REL jeśli (C v Z) = 1
    Opis: Po porównaniu lub odjęciu bez znaku, BLS spowoduje rozgałęzienie w programie, jeśli rejestr był mniejszy lub taki sam jak zawartość bajtu w lokalizacji pamięci.
  • BMC – skok jeśli maska przerwań (wskaźnik I)=0
    Działanie: PC = PC + 0002 + REL jeśli I = 0
    Opis: Testuje stan bitu I i powoduje skok, jeśli I=0.
  • BMI – skok jeśli ujemne
    Działanie: PC = PC + 0002 + REL jeśli N = 1
    Opis: Testuje stan bitu N i powoduje skok, jeśli N jest ustawione (dla liczb w kodzie U2).
  • BMS – skok jeśli maska przerwań (wskaźnik I)=1
    Działanie: PC = PC + 0002 + REL jeśli I = 1
    Opis: Testuje stan bitu I i powoduje skok, jeśli I=1.
  • BNE – skok jeśli nie równe
    Działanie: PC = PC + 0002 + REL jeśli Z = 0
    Opis: Testuje stan bitu Z i powoduje skok, jeśli Z=0.
  • BPL – skok jeśli dodatnie
    Działanie: PC = PC + 0002 + REL jeśli N = 0
    Opis: Testuje stan bitu N i powoduje skok, jeśli N jest wyzerowane (dla liczb w kodzie U2).
  • BRA – skok bezwarunkowy
    Działanie: PC = PC + 0002 + REL.
  • BRCLR – skok jeśli wskazany bit komórki pamięci ze strony zerowej jest wyzerowany
    Opis: Testuje bit n (n = 0, 7) w lokalizacji M (z adresem DIR) i robi skok relatywny jeżeli bit jest wyzerowany.
  • BRN – bezwarunkowy skok, który nigdy nie zachodzi (taka dziwność, można traktować jak instrukcję NOP).
  • BRSET – skok jeśli wskazany bit komórki pamięci ze strony zerowej jest ustawiony
    Opis: Testuje bit n (n = 0, 7) w lokalizacji M (z adresem DIR) i robi skok relatywny jeżeli bit jest ustawiony.
  • BSET – ustaw wskazany bit komórki pamięci ze strony zerowej
    Opis: Ustawienie bitu n (n = 0, 7) w lokalizacji M (z adresem DIR). Wszystkie inne bity w M pozostają nienaruszone.
  • BSR – relatywne wywołanie podprogramu.
    Działanie: PC = PC + 0002 + REL
    Opis: Na stosie zostaje zapisany adres następnej instrukcji do wykonania i następuje skok do podprogramu (adres jest relatywny).
  • CLC – zeruj wskaźnik C
    Operacja: C = 0
    Opis: zeruje bit przeniesienia C w rejestrze kodu warunków procesora.
  • CLI – zeruj bit maski przerwań
    Operacja: I = 0
    Opis: Zeruje bit maski przerwań w rejestrze wskaźników. Umożliwia to mikroprocesorowi obsługę przerwań (przerwania są obsługiwane jeżeli I=0).
  • CLR – zeruj komórkę pamięci
    Opis: Zeruje bajt pamięci M. Dopuszczalne operandy:
    CLR DIR
    CLR X
    CLR IX1,X
  • CLRA – zeruj akumulator
    Opis: Zeruje stan akumulatora.
  • CLRX – zeruj rejestr indeksowy
    Opis: Zeruje rejestr indeksowy.
  • CMP – porównanie zawartości akumulatora i zawartości komórki pamięci M lub operandu IMM
    Operacja: A - M
    Opis: Realizowana jest operacja odjęcia od zawartości akumulatora zawartości komórki pamięci M i ustawienie kodów warunków (bez zachowania wyniku). Dopuszczalne operandy:
    CMP #IMM
    CMP DIR
    CMP EXT
    CMP X
    CMP IX1,X
    CMP IX2,X
  • COM – negacja logiczna
    Opis: Neguje bity komórki M. Dopuszczalne operandy:
    COM DIR
    COM X
    COM IX1,X
  • COMA – negacja logiczna zawartości akumulatora
    Opis: jak COM tylko dotyczy akumulatora
  • COMX – negacja logiczna zawartości rejestru indeksowego
    Opis: jak COM tylko dotyczy rejestru indeksowego
  • CPX – porównanie zawartości rejestru indeksowego i zawartości komórki pamięci M lub wartości operandu IMM
    Operacja: Z - M
    Opis: Realizowana jest operacja odjęcia od zawartości rejestru indeksowego zawartości komórki pamięci M lub operandu IMM i ustawienie kodów warunków (bez zachowania wyniku). Dopuszczalne operandy:
    CPX #IMM
    CPX DIR
    CPX EXT
    CPX X
    CPX IX1,X
    CPX IX2,X
  • DEC - decrement zawartości komórki pamięci
    Opis: dekrementuje zawartość komórki pamięci M o jeden. Dopuszczalne operandy:
    DEC DIR
    DEC X
    DEC IX1,X
  • DECA - decrement zawartości akumulatora
    Opis: dekrementuje zawartość akumulatora o jeden.
  • DECX - decrement zawartości rejestru indeksowego
    Opis: dekrementuje zawartość rejestru indeksowego o jeden.
  • EOR – operacja XOR zawartości akumulatora i zawartości komórki pamięci M lun wartości operandu IMM
    Działanie: A - A XOR M
    Opis: Realizowana jest operacja xor zawartości akumulatora i zawartości komórki pamięci M lub wartości operandu IMM. Dopuszczalne operandy:
    EOR #IMM
    EOR DIR
    EOR EXT
    EOR X
    EOR IX1,X
    EOR IX2,X
  • INC - increment zawartości komórki pamięci
    Opis: inkrementuje zawartość komórki pamięci M o jeden. Dopuszczalne operandy:
    INC DIR
    INC X
    INC IX1,X
  • JMP – skok bezwarunkowy (nie relatywny).
    Działanie: PC = adres efektywny
    Opis: Następuje skok do instrukcji zapisanej pod efektywnym adresem. Dopuszczalne operandy:
    JMP DIR
    JMP EXT
    JMP X
    JMP IX1,X
    JMP IX2,X
  • JSR – wywołanie podprogramu (nie relatywne)
    Działanie: PC = adres efektywny
    Opis: Na stosie zostaje zapisany adres następnej instrukcji do wykonania i następuje skok do podprogramu. Dopuszczalne operandy:
    JSR DIR
    JSR EXT
    JSR X
    JSR IX1,X
    JSR IX2,X
  • LDA – załaduj do akumulatora
    Operacja: A = M
    Opis: Ładuje zawartość pamięci do akumulatora (w tym również stałą IMM). Dopuszczalne operandy:
    LDA #IMM
    LDA DIR
    LDA EXT
    LDA X
    LDA IX1,X
    LDA IX2,X
  • LDX – załaduj do rejestru indeksowego
    Operacja: X = M
    Opis: Ładuje zawartość pamięci do rejestru indeksowego (w tym również stałą IMM). Dopuszczalne operandy:
    LDX #IMM
    LDX DIR
    LDX EXT
    LDX X
    LDX IX1,X
    LDX IX2,X
  • LSL – logiczne przesunięcie w lewo zawartości komórki pamięci
    Opis: Przesuwa wszystkie bity M o jedno miejsce w lewo. Bit 0 jest ładowany zerem. Najbardziej znaczący bit M jest ładowany do C. Dopuszczalne operandy:
    LSL DIR
    LSL X
    LSL IX1,X
  • LSLA – przesunięcie logiczne w lewo zawartości akumulatora
    Opis: jak LSL tylko dotyczy akumulatora
  • LSLX – przesunięcie logiczne w lewo zawartości rejestru indeksowego
    Opis: jak LSL tylko dotyczy rejestru indeksowego
  • LSR – logiczne przesunięcie w prawo zawartości komórki pamięci
    Opis: Przesuwa wszystkie bity M o jedno miejsce w prawo. Bit 7 jest ładowany zerem. Bit 0 jest ładowany do wskaźnika C. Dopuszczalne operandy:
    LSR DIR
    LSR X
    LSR IX1,X
  • LSRA – logiczne przesunięcie w prawo zawartości akumulatora
    Opis: jak LSR tylko dotyczy akumulatora
  • LSRX – logiczne przesunięcie w prawo zawartości rejestru indeksowego
    Opis: jak LSR tylko dotyczy rejestru indeksowego
  • NEG – arytmetyczna negacja zawartości komórki pamięci (w kodzie U2)
    Operacja: M = 00 - M
    Opis: Zastępuje zawartość komórki M uzupełnieniem do dwóch. Dopuszczalne operandy:
    NEG DIR
    NEG X
    NEG IX1,X
  • NEGA – arytmetyczna negacja zawartości akumulatora
    Opis: jak NEG tylko dotyczy akumulatora
  • NEGX – arytmetyczna negacja zawartości rejestru indeksowego
    Opis: jak NEG tylko dotyczy rejestru indeksowego
  • NOP – instrukcja pusta
  • ORA – logiczna suma OR zawartości akumulatora i zawartości komórki pamięci M lub operandu IMM
    Działanie: A = A OR M
    Opis: Realizowana jest operacja or zawartości akumulatora i zawartości komórki pamięci M lub operandu IMM. Dopuszczalne operandy:
    ORA #IMM
    ORA DIR
    ORA EXT
    ORA X
    ORA IX1,X
    ORA IX2,X
  • ROL – rotacja w lewo zawartości komórki pamięci
    Opis: Przesuwa wszystkie bity M o jedno miejsce w lewo. Bit 0 jest ładowany ze wskaźnika C. Najbardziej znaczący bitu M jest ładowany do C. Dopuszczalne operandy:
    ROL DIR
    ROL X
    ROL IX1,X
  • ROLA – rotacja w lewo zawartości akumulatora
    Opis: jak ROL tylko dotyczy akumulatora
  • ROLX – rotacja w lewo zawartości rejestru indeksowego
    Opis: jak ROL tylko dotyczy rejestru indeksowego
  • ROR – rotacja w prawo zawartości komórki pamięci
    Opis: Przesuwa wszystkie bity M o jedno miejsce w prawo. Bit 7 jest ładowany ze wskaźnika C. Bit 0 jest składowany do wskaźnika C. Dopuszczalne operandy:
    ROR DIR
    ROR X
    ROR IX1,X
  • RORA – rotacja w prawo zawartości akumulatora
    Opis: jak ROR tylko dotyczy akumulatora
  • RORX – rotacja w prawo zawartości rejestru indeksowego
    Opis: jak ROR tylko dotyczy rejestru indeksowego
  • RSP – resetuj wskaźnik stosu
    Operacja: SP = 7F hex
    Opis: Resetuje wskaźnik stosu na szczyt stosu.
  • RTI – wyjdź z obsługi przerwania
    Opis: odtwarza ze stosu rejestr wskaźników, akumulator, rejestr indeksowy i licznik programu (wraca do realizacji przerwanego programu).
  • RTS – wyjdź z podprogramu
    Opis: odtwarza ze stosu adres powrotu (wraca z wywołanego podprogramu).
  • SBC – odejmij od zawartości akumulatora zawartość komórki pamięci z uwzględnieniem wskaźnika C lub wartość operandu IMM
    Operacja: A = A - M - C
    Opis: Odejmuje zawartość M i C od zawartości A i umieszcza wynik w A. Dopuszczalne operandy:
    SBC #IMM
    SBC DIR
    SBC EXT
    SBC X
    SBC IX1,X
    SBC IX2,X
  • SEC – ustaw wskaźnik C
    Operacja: wskaźnik C = 1
    Opis: Ustawia bit przeniesienia w rejestrze kodu warunków procesora.
  • SEI – ustaw wskaźnik maski przerwań
    Operacja: wskaźnik I = 1
    Opis: Ustawia bit maski przerwań w rejestrze kodu warunków procesora, mikroprocesor nie może obsługiwać przerwań.
  • STA – zachowaj zawartość akumulatora w komórce pamięci
    Operacja: M = A
    Opis: Zapisuje zawartość A do pamięci. Dopuszczalne operandy:
    STA DIR
    STA EXT
    STA X
    STA IX1,X
    STA IX2,X
  • STOP – włącza zezwolenie na przyjmowanie przerwań i zatrzymuje procka
    Opis: Zmniejsza zużycie energii, eliminując wszelkie dynamiczne rozpraszanie mocy.
  • STX – zachowaj zawartość rejestru indeksowego w komórce pamięci
    Operacja: M = X
    Opis: Zapisuje zawartość X do pamięci. Dopuszczalne operandy:
    STX DIR
    STX EXT
    STX X
    STX IX1,X
    STX IX2,X
  • SUB – odejmowanie od zawartości akumulatora zawartości komórki pamięci
    Operacja: A = A – M
    Opis: Odejmuje zawartość M lub wartość stałej IMM od zawartości A i umieszcza wynik w A. Dopuszczalne operandy:
    SUB #IMM
    SUB DIR
    SUB EXT
    SUB X
    SUB IX1,X
    SUB IX2,X
  • SWI – przerwanie programowe
    Opis: na stosie zachowany jest stan procesora (rejestr wskaźników, akumulator, rejestr indeksowy i adres powrotu) i następuje przejście do obsługi przerwania programowego (adres procedury wskazuje odpowiedni wektor w tabeli wektorów przerwań).
  • TAX – przepisz zawartość akumulatora do rejestru indeksowego
    Operacja: X = A
    Opis: Ładuje do rejestru indeksowego zawartość akumulatora.
  • TST – porównanie zawartości komórki pamięci z zerem
    Operacja: M - 00
    Opis: Ustawia tylko wskaźniki w rejestrze bez zachowania wyniku operacji. Dopuszczalne operandy:
    TST DIR
    TST X
    TST IX1,X
  • TSTA – porównanie zawartości akumulatora z zerem
    Operacja: A - 00
    Opis: jak TST tylko dotyczy akumulatora.
  • TSTX – porównanie zawartości rejestru indeksowego z zerem
    Operacja: X - 00
    Opis: jak TST tylko dotyczy rejestru indeksowego.
  • TXA – przepisz zawartość rejestru indeksowego do akumulatora
    Operacja: A = X
    Opis: Ładuje akumulator zawartością rejestru indeksowego.
  • WAIT – zatrzymaj procesor i czekaj na przerwanie
    Opis: Zmniejsza zużycie energii, eliminując dynamiczne rozpraszanie energii we wszystkich obwodach z wyjątkiem timera i preskalera timera. Powoduje odblokowanie zewnętrznych przerwań i zatrzymuje taktowanie.

Prawdziwe słowa nie są przyjemne. Przyjemne słowa nie są prawdziwe.
Lao Tse

Awatar użytkownika
gaweł
Geek
Geek
Posty: 1259
Rejestracja: wtorek 24 sty 2017, 22:05
Lokalizacja: Białystok

Re: [ASM] Translator języka asm dla MC146805

Postautor: gaweł » wtorek 30 sie 2022, 22:14

Po odpaleniu programu mamy następujące okienko:
asm6805.png

Przycisk „Open source” służy do wskazania pliku źródłowego do kompilacji. Również można myszką przeciągnąć plik i upuścić na formę programu.
Przed kompilacją można wybrać opcję układu EPROM. Program generuje plik typu Intel-hex zawierający kod programu. Przestrzeń adresowa układu MC146805 wynosi 8kB i wygenerowany program musi stykać swoim końcem z końcem przestrzeni adresowej. Najprościej jest stosować układy 2764 (zajmującą całą przestrzeń), jednak możliwe jest wykorzystanie układów o mniejszej pojemności. Pomijając zastosowanie właściwego zaklęcia .ORG w programie, trzeba kombinować z programatorem, by ten zaprogramował układ danymi z drugiej połówki (lub ostatniej ćwiartki) wygenerowanego pliku hex. Tą uciążliwą operację można pominąć zaznaczając na jaki układ ma być wygenerowany kod.
W przypadku układu 2708 (EPROM 1kB) program musi zajmować ostatnie kilo przestrzeni adresowej proca, dla 2716 (EPROM 2kB) program rezyduje w ostatnich 2kB przestrzeni, itd.
By nic nie zginęło należy użyć:
  • .org „właściwe” – M2764 („właściwe” by pomieścić się razem z pamięcią RAM, a to już zależy od rozwiązań sprzętowych; w przypadkach innych pamięci "luka" na RAM powstaje w sposób naturalny),
  • .org $1000 – M2732
  • .org $1800 – M2716
  • .org $1C00 – M2708
Po kompilacji mamy komunikat:
asm6805-run.png

W ramach testów przepisałem z dostępnej dokumentacji kilka kawałków skompilowanych programów (miały w wydruku wygenerowane kody), które przepisałem jako komentarz. Mój kompiler wyprodukował takie same, więc można uznać, że program jest dobry, działa właściwie i się nie myli.

Kod: Zaznacz cały

Improved assembler translator for MC6805E2 processor, version 1.00, licence: CC BY 3.0

  L.NO MEMO    CODE         SRC

Open file: D:\lazarus_project\MC6805\tbook.asm
    1.                    .org   $100      ;
    2.                 ;
    3. 0100            timserv            ;
    4. 0100 80            rti         ;
    5. 0101            intserv                    ;
    6. 0101 80            rti                    ;
    7. 0102            swiserv                    ;
    8. 0102 80            rti         ;
    9. 0103            LocalSWI         ;
   10. 0103 80            rti         ;
   11. 0104            resserv            ;
   12. 0030            DOG   .EQU   30h      ;
   13. 004B            CAT   .EQU   4Bh      ;
   14. 07FE            PIG   .EQU   7FEh      ;
   15. 06E5            DOG1   .EQU   6E5h      ;
   16. 0104 B650          LDA   50h      ;B650
   17. 0106 BE30          LDX   DOG      ;BE30
   18. 0108 3C27          INC   27h      ;3C27
   19. 010A 1230          BSET   1,DOG      ;1230
   20. 010C B64B          LDA   CAT      ;B64B
   21. 010E C307FE        cpx   PIG      ;C307FE
   22. 0111 C606E5        lda   DOG1      ;C606E5
   23. 0114 F6            LDA   ,X      ;F6
   24. 0115 FE            LDX   ,X      ;FE
   25. 0116 7D            TST   ,X      ;7D
   26. 0117 AEB8          LDX   #0B8h      ;AEB8
   27. 0119 F6            LDA   ,X      ;F6
   28. 011A 9D            nop         ;
   29. 0000            PORTA   .EQU   0
   30. 0004            DDRA   .EQU   4
   31. 0180            DECODE   .EQU   $180
   32. 011B 3F00       RESET   CLR   PORTA      ;3F00
   33. 011D A6F0          LDA   #$F0      ;A6FO
   34. 011F B704          STA   DDRA      ;B704
   35. 0121 8E         Stopek   STOP         ;8E
   36. 0122 20FD          BRA   Stopek      ;20FD
   37. 0124 A6EF       KEYSCN   LDA   #$EF      ;A6EF
   38. 0126 B700          STA   PORTA      ;B700
   39. 0128 2E05       REPEAT   BIL   GOTIT      ;2E05
   40. 012A 3800          LSL   PORTA      ;3800
   41. 012C 25FA          BCS   REPEAT      ;25FA
   42. 012E 80         RETURN   RTI         ;80
   43. 012F B600       GOTIT   LDA   PORTA      ;B600
   44. 0131 AD0C          BSR   DBOUNC      ;ADOC
   45. 0133 2FF9          BIH   RETURN      ;2FF9
   46. 0135 2EFE       RELEAS   BIL   RELEAS      ;2EFE
   47. 0137 AD06          BSR   DBOUNC      ;AD06
   48. 0139 2EFA          BIL   RELEAS      ;2EFA
   49. 013B 3F00          CLR   PORTA      ;3F00
   50. 013D 2041          BRA   DECODE      ;205C
   51. 013F AEFF       DBOUNC   LDX   #$FF      ;AEFF
   52. 0141 5A         AGAIN   DECX         ;5A
   53. 0142 26FD          BNE   AGAIN      ;26FD
   54. 0144 81            RTS         ;81
   55. 0145            loop         ;
   56. 0145 20FE           bra   loop      ;
   57.                 ;
   58. 1FF8 0100           .vect tint timserv ; przerwania od zegara
   59. 1FFE 0104           .vect res resserv   ; zerowania procesora
   60. 1FFA 0101           .vect int intserv   ; przerwania maskowalnego
   61. 1FFC 0102           .vect swi swiserv   ; przerwania programowego
   62.                      .end
Close file: D:\lazarus_project\MC6805\tbook.asm

Compilation :successful


Map information about constants and labels:
CAT                              CONST=004B hex [0000000001001011 bin,75 dec]
DDRA                             CONST=0004 hex [0000000000000100 bin,4 dec]
DECODE                           CONST=0180 hex [0000000110000000 bin,384 dec]
DOG                              CONST=0030 hex [0000000000110000 bin,48 dec]
DOG1                             CONST=06E5 hex [0000011011100101 bin,1765 dec]
PIG                              CONST=07FE hex [0000011111111110 bin,2046 dec]
PORTA                            CONST=0000 hex [0000000000000000 bin,0 dec]
AGAIN                            LABEL:0141 hex
DBOUNC                           LABEL:013F hex
GOTIT                            LABEL:012F hex
intserv                          LABEL:0101 hex
KEYSCN                           LABEL:0124 hex
LocalSWI                         LABEL:0103 hex
loop                             LABEL:0145 hex
RELEAS                           LABEL:0135 hex
REPEAT                           LABEL:0128 hex
RESET                            LABEL:011B hex
resserv                          LABEL:0104 hex
RETURN                           LABEL:012E hex
Stopek                           LABEL:0121 hex
swiserv                          LABEL:0102 hex
timserv                          LABEL:0100 hex

Eprom type: M2764


Code stored in file: D:\lazarus_project\MC6805\tbook.hex


Program:
Asm6805.7z
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.

Prawdziwe słowa nie są przyjemne. Przyjemne słowa nie są prawdziwe.
Lao Tse

Awatar użytkownika
gaweł
Geek
Geek
Posty: 1259
Rejestracja: wtorek 24 sty 2017, 22:05
Lokalizacja: Białystok

Re: [ASM] Translator języka asm dla MC146805

Postautor: gaweł » piątek 25 lis 2022, 15:43

Krok do przodu

Zwiększyłem możliwości translatora asm dla tego procka poprzez dodanie funkcjonalności obsługi makropoleceń z parametrami. Wcześniej w tekście programu należy zdefiniować makropolecenie. Syntaktyka jest następująca:

Kod: Zaznacz cały

<nazwa makropolecenia>  .macro    <lista parametrów>
<instrukcja>
<instrukcja>
<instrukcja>
<instrukcja>
<instrukcja>
.endmacro

<lista parametrów> to lista identyfikatorów rozdzielonych znakiem przecinka. Parametry te mogą być zastosowane w instrukcjach (użyta nazwa parametru jest zastępowana całą wstawką wynikająca z wywołania makropolecenia, użyte w poleceniu symbole parametrów z listy są zastępowane elementem z listy - każdy element z listy aktualnego wywołania jest przenoszony w docelowe miejsce). W makro mogą być zastosowane lokalne etykiety. W definicji makropolecenia jako etykieta lokalna występuje oznaczenie składające się ze znaku @ i liczby. W to miejsce translator wygeneruje unikalną nazwę etykiety.
Przykładowo, makro:

Kod: Zaznacz cały

sum       .macro        aparam , bparam , cparam
@2        bcc  @0
          beq  @1
          bis  @2
          add  aparam
          add  bparam
          add  cparam
          bra  @2
@0        add  aparam
          add  bparam
          bra  @2
@1        add  bparam
          .endmacro

w zależności od użycia makro jest rozwijane w następujący sposób:
  • operandy to zmienne z pamięci RAM:

Kod: Zaznacz cały

var1      .rmb      1
var2      .rmb      1
var3      .rmb      1
( . . . )
   60.             sum  var1,var2,var3
......                 
...... 1834 240C   Loclabel183402 bcc Loclabel183400 ;
...... 1836 2710   beq Loclabel183401 ;
...... 1838 23FA   bis Loclabel183402 ;
...... 183A BB00   add var1  ;
...... 183C BB02   add var2  ;
...... 183E BB04   add var3  ;
...... 1840 20F2   bra Loclabel183402 ;
...... 1842 BB00   Loclabel183400 add var1  ;
...... 1844 BB02   add var2  ;
...... 1846 20EC   bra Loclabel183402 ;
...... 1848 BB02   Loclabel183401 add var2  ;
......       

  • operandy to stałe:

Kod: Zaznacz cały

   61.             sum  #1,#2,#3
......                 
...... 184A 240C   Loclabel184A02 bcc Loclabel184A00 ;
...... 184C 2710   beq Loclabel184A01 ;
...... 184E 23FA   bis Loclabel184A02 ;
...... 1850 AB01   add # 1  ;
...... 1852 AB02   add # 2  ;
...... 1854 AB03   add # 3  ;
...... 1856 20F2   bra Loclabel184A02 ;
...... 1858 AB01   Loclabel184A00 add # 1  ;
...... 185A AB02   add # 2  ;
...... 185C 20EC   bra Loclabel184A02 ;
...... 185E AB02   Loclabel184A01 add # 2  ;
......     

  • operandy to wyrażenia stałe:

Kod: Zaznacz cały

   65.             sum  #%10100101,#lo((1+(Data8>2+7)+displ)),var19
......
...... 1892 240D   Loclabel189202 bcc Loclabel189200 ;
...... 1894 2711   beq Loclabel189201 ;
...... 1896 23FA   bis Loclabel189202 ;
...... 1898 ABA5   add # %10100101  ;
...... 189A AB10   add # lo ( ( 1 + ( Data8 > 2 + 7 ) + displ ) )  ;
...... 189C CB0410 add var19  ;
...... 189F 20F1   bra Loclabel189202 ;
...... 18A1 ABA5   Loclabel189200 add # %10100101  ;
...... 18A3 AB10   add # lo ( ( 1 + ( Data8 > 2 + 7 ) + displ ) )  ;
...... 18A5 20EB   bra Loclabel189202 ;
...... 18A7 AB10   Loclabel189201 add # lo ((1+(Data8>2+7)+displ ) )  ;
......


W tej filozofii rozwiązania istnieje możliwość podmianki wszystkiego, nawet symbolu instrukcji. Dla makra:

Kod: Zaznacz cały

insmac    .macro        oper , aparam
          oper  aparam
          .endmacro

użycia mogą dać różne docelowe realizacje:

Kod: Zaznacz cały

68.                           insmac  add , var1
......                 
...... 18AC BB00       add  var1  ;
......

oraz

Kod: Zaznacz cały

  69.                           insmac  cmp, var1
......                 
...... 18AE B100       cmp  var1  ;
......     

Nowa wersja translatora jest gotowa do użycia. Jeżeli ktoś ma procka MC146804E2 lub innego na tej licencji (przykładowo Harris miał takowe w swojej ofercie), to kompiler jest gotowy do użycia.
Kompiler:
Asm6805_ver1_11.7z

Przykład:
MC6805-example.7z
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.

Prawdziwe słowa nie są przyjemne. Przyjemne słowa nie są prawdziwe.
Lao Tse

Awatar użytkownika
Zegar
User
User
Posty: 316
Rejestracja: wtorek 02 lip 2019, 14:42

Re: [ASM] Translator języka asm dla MC146805

Postautor: Zegar » poniedziałek 28 lis 2022, 13:24

Wczoraj poszukiwałem asemblera 6502. Przypomniał mi się sbasm.
Na stronie projektu jest wykaz obsługiwanych procesorów.
Między innymi są też Motki:
SBASM_Moto.png

Nie porównywałem z napisanym przez kolegę @gaweł, ale można spróbować kompilacji na dwóch asemblerach, żeby sprawdzić poprawność. :D
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
"If A = success, then the formula is A = X + Y + Z.
X is work. Y is play. Z is keep your mouth shut."
A. Einstein

Awatar użytkownika
gaweł
Geek
Geek
Posty: 1259
Rejestracja: wtorek 24 sty 2017, 22:05
Lokalizacja: Białystok

Re: [ASM] Translator języka asm dla MC146805

Postautor: gaweł » poniedziałek 28 lis 2022, 18:52

Zegar pisze:Nie porównywałem z napisanym przez kolegę @gaweł, ale można spróbować kompilacji na dwóch asemblerach, żeby sprawdzić poprawność. :D

Trzeba będzie zrobić badania naukowe w temacie... :D

Prawdziwe słowa nie są przyjemne. Przyjemne słowa nie są prawdziwe.
Lao Tse


Wróć do „Retro”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 9 gości