= HF8V = / = SP8WJT = / = SP0106RZ =


THAVR




Project Info

THAVR to mój własny język programowania i interpreter tego języka instalowany na różnych małych systemach cyfrowych. Pierwsze próby były prowadzone na systemie HF-6060 (AT90S2313) na początku lat 2000. Miałem wtedy tylko ten jeden procesor i brakowało mi w nim pamięci. Powstał wtedy mikroskopijny system o rozmiarze pamięci programu 64 bajty i dosowy kompilator. System działał, ale miał niewielkie błędy. Następnie pierwszy działający w miarę bezbłędnie system powstał dla systemu HF-6048 a następnie na innych systemach. THAVR jest przydatny zwłaszcza na tych mikroprocesorach które nie mają możliwości wykonywania kodu w RAM.

Istnieją różne podwersje THAVR:

  • THAVR8 - pamięć programu 256 bajtów - najczęściej używany
  • THAVR6 - pamięć programu 64 bajtów - prowadzone są eksperymenty na ATTINY13 - raczej mało praktycznie przydatny
  • THAVR16 - pamięć programu 64KB - prowadzone są eksperymenty na STM32 - potencjalnie ciekawy ale daleko nie tak wydajny jak THAVR8


  • THAVR pozwala na konstruowanie bardzo wydajnych systemów cyfrowych z dużą ilością ustandaryzowanych funkcji wbudowanych i praktycznie nieograniczoną możliwości dodawania aplikacji zewnętrznych napisanych w THAVR. Ta ostatnia możliwość jest bardzo pożyteczna w mikroprocesorach AVR które nie pozwalają na wykonanie własnego kodu w RAM. Największą wadą są narzuty czasowe przebiegu pętli interpretera które wynoszą typowo co najmniej 1.375 us (@ 8MHz). Z tego powodu funkcje "szybkie" należy nadal pisać w języku danego mikroprocesora, natomiast mogą być wywoływane i kontrolowane przez THAVR.

    Od strony sprzętowej minimalny system cyfrowy wykonany z systemem THAVR może mieć tylko buzzer jako urządzenie wyjściowe i kilka klawiszy klawiatury lokalnej lub zewnętrzny UART. Wszystkie komendy z systemu odbiera sie wtedy telegrafią za pomocą kodów HEX lub 3 literowych skrótów a funkcje wywołuje się za pomocą kodu HEX w tabeli Wektorów lub z Menu za pomocą 1-3 literowych skrótów. Obowiązuje wyłącznie format heksadecymalny poza nielicznymi wyjątkami.

    THAVR jest językiem niskiego poziomu ma jednak sporo wbudowanych funkcji wysokiego poziomu, np. instrukcje dotyczące I2C, dlatego że THAVR od swoich początków był używany do programowania urządzeń zewnętrznych jak moduły PLL, RTC, itd...

    W dalszej części nastąpi opis programistyczny standardów THAVR8, jako że inne podwersje nie mają obecnie praktycznego znaczenia.


    Model programistyczny THAVR8

    THAVR8 odznacza się bardzo wysoką wydajnością kodu. Jest to spowodowanhe faktem że 66% instrukcji to instrukcje jednobajtowe a jedyny tryb adresowy to 8-bitowy, absolutny. Najprostszy program może mieć typowo poniżej 10 bajtów (np. oscylator) a pamięć programu 256 bajtów zwykle nie jest cała wykorzystywana. Z uwagi na małą ilość instrukcji i prosty tryb adresowania programy można pisać nawet w kodzie maszynowym THAVR8 na kartce papieru.


    DANE TECHNICZNE THAVR8

    AKTUALNA WERSJA THAVR: 39
    PAMIĘĆ PROGRAMU: 256 B (typowo pierwszy wolny w całości segment RAM, np. w ATMEGA8 0x100-0x1FF)
    ILOŚĆ INSTRUKCJI: 70 (HF-6030), 72 (HF-6048), 80 (HF-6050, HF-6128, HF-6158, HF-6169)
    MINIMALNY CZAS WYKONANIA INSTRUKCJI: 1.375us


    Rejestry THAVR8:

    REGAVR REGAVR ADRREGISTER FUNCTION
    A r16 0x10 rejestr główny, akumulator
    B r17 0x11 dodatkowy rejestr dla wielu instrukcji arytmetycznych i logicznych
    C r18 0x12 licznik dla instrukcji LOOP
    D r19 0x13
    E r20 0x14
    FLAG r0 0x00 przepisywany z SREG po wykonaniu operacji arytmetycznych i bitowych
    PC r26, r27 (XL, XH) 0x1A-0x1B licznik programu THAVR


    Podczas implementacji THAVR8 na innych mikroprocesorach rejestry A-E powinny być rejestrami w których funkcje najczęściej przyjmują i zwracają parametry. Rejestr używany przez PC nie może być używany przez inne funkcje które w sposób jawny bądź niejawny mogą być wywołane przez THAVR.


    Instrukcje THAVR8:

    MNEMONICCODEPARAM.INSTRUCTION DESCRIPTIONREMARKS
    END 0x00 0 Kończy działanie programu THAVR
    LDA 0x01 imm8 1 Ładuje rejestr A konstantą A <- imm8
    LDB 0x02 imm8 1 Ładuje rejestr B konstantą B <- imm8
    LDC 0x03 imm8 1 Ładuje rejestr C konstantą C <- imm8
    LDD 0x04 imm8 1 Ładuje rejestr D konstantą D <- imm8
    LDE 0x05 imm8 1 Ładuje rejestr E konstantą E <- imm8
    PHA 0x06 0 Odkłada rejestr A na stos stack <- A, SP--
    PPA 0x07 0 Przywraca rejestr A ze stosu A <- stack, SP++
    PHB 0x08 0 Odkłada rejestr B na stos stack <- B, SP--
    PPB 0x09 0 Przywraca rejestr B ze stosu B <- stack, SP++
    PHC 0x0A 0 Odkłada rejestr C na stos stack <- C, SP--
    PPC 0x0B 0 Przywraca rejestr C ze stosu C <- stack, SP++
    PHD 0x0C 0 Odkłada rejestr D na stos stack <- D, SP--
    PPD 0x0D 0 Przywraca rejestr D ze stosu D <- stack, SP++
    PHE 0x0E 0 Odkłada rejestr E na stos stack <- E, SP--
    PPE 0x0F 0 Przywraca rejestr E ze stosu E <- stack, SP++
    NOP 0x10 0 Brak operacji
    RPA 0x11 0 Odczytuje PORTA do rejestru A [*] A <- PORTA
    RPB 0x12 0 Odczytuje PORTB do rejestru A [*] A <- PORTB
    RPC 0x13 0 Odczytuje PORTC do rejestru A [*] A <- PORTC
    RPD 0x14 0 Odczytuje PORTD do rejestru A [*] A <- PORTD
    WPA 0x15 0 Zapisuje PORTA z rejestru A [*] PORTA <- A
    WPB 0x16 0 Zapisuje PORTB z rejestru A [*] PORTB <- A
    WPC 0x17 0 Zapisuje PORTC z rejestru A [*] PORTC <- A
    WPD 0x18 0 Zapisuje PORTD z rejestru A [*] PORTD <- A
    ADD 0x19 0 Dodaje zawartość rejestru B do rejestru A [^] A <- (A + B) [^]
    SUB 0x1A 0 Odejmuje zawartość rejestru B od rejestru A [^] A <- (A - B) [^]
    AND 0x1B 0 Wykonuje bitowe AND na rejestrze A i rejestrze B [^] A <- (A AND B) [^]
    OR 0x1C 0 Wykonuje bitowe OR na rejestrze A i rejestrze B [^] A <- (A OR B) [^]
    XOR 0x1D 0 Wykonuje bitową różnicę symetryczną na rejestrze A i rejestrze B [^] A <- (A XOR B) [^]
    NEG 0x1E 0 Wykonuje arytmetyczną negację na rejestrze A [^] A <- (NEG A) [^]
    NOT 0x1F 0 Wykonuje bitową negację na rejestrze A [^] A <- (NOT A) [^]
    LSL 0x20 0 Wykonuje przesunięcie bitowe na rejestrze A w lewo [^] A <- (A << 1) [^]
    LSR 0x21 0 Wykonuje przesunięcie bitowe na rejestrze A w prawo [^] A <- (A >> 1) [^]
    DEC 0x22 0 Wykonuje zmniejszenie o 1 rejestru A [^] A <- (A - 1) [^]
    INC 0x23 0 Wykonuje zwiększenie o 1 rejestru A [^] A <- (A + 1) [^]
    INT 0x24 vect8 1 Wywołuje podany wektor przerwania softwarowego PC <- (@INT)
    I2CRD 0x25 0 Odczytuje bajt z magistrali I2C do rejestru A
    I2CIT 0x26 0 Inicjacja magistrali I2C
    I2CST 0x27 imm8 1 Nadaje warunek START na magistrali I2C (należy podać adres I2C)
    I2CWR 0x28 imm8 1 Zapisuje podany bajt do magistrali I2C
    I2CSP 0x29 0 Nadaje warunek STOP na magistrali I2C
    KBD 0x2A 0 Wprowadza znak ASCII z urządzenia wejściowego do rejestru A A <- INPUT_DEVICE
    CPBNE 0x2B imm8 aa8 2 Porównuje zawartość rejestru A z konstantą, skacze pod wskazany adres jeśli nierówne if (A != imm8) PC <- aa8 else PC <- (PC + 3)
    CALL 0x2C aa8 1 Wywołanie funkcji stack <- (PC+2), PC <- aa8
    RET 0x2D 0 Powrot z funkcji PC <- stack
    LOOP 0x2E aa8 1 Pętla z licznikiem w rejestrze C if (C>0) { PC <- aa8, C-- } else PC <- (PC + 2)
    JMP 0x2F aa8 1 Skok pod 8 bitowy adres THAVR PC <- aa8
    GOTO 0x30 aa16h aa16l 2 Skok pod 16 bitowy adres w pamieci programu mikroprocesora (powrót do THAVR niemożliwy) uC_PC <- aa16
    DEL20U 0x31 0 Softwarowe opóźnienie 20us
    DEL100U 0x32 0 Softwarowe opóźnienie 100us
    DEL1M 0x33 0 Softwarowe opóźnienie 1ms
    ST0 0x34 aa8 1 Składuje rejestr A pod wskazany adres RAMSEG0 [**] RAMSEG0(aa8) <- A
    DEL10M 0x35 0 Softwarowe opóźnienie 10ms
    DEL50M 0x36 0 Softwarowe opóźnienie 50ms
    DEL100M 0x37 0 Softwarowe opóźnienie 100ms
    DEL200M 0x38 0 Softwarowe opóźnienie 200ms
    DEL500M 0x39 0 Softwarowe opóźnienie 500ms
    DEL1 0x3A 0 Softwarowe opóźnienie 1s
    DBG 0x3B 0 Debug Break - zatrzymuje wykonanie programu i wyświetla: PC, A, B, C, D, E
    WRT 0x3C aa8 1 Zapisuje string do urządzenia wyjściowego spod wskazanego adresu if(@aa8!=0) { @aa8->OUTPUT_DEVICE, aa8++}
    WRS 0x3D imm8 1 Zapisuje kod błędu do urządzenia ERROR DEVICE ERROR_DEVICE <- imm8
    INS 0x3E 0 Wprowadza daną do rejestru A w formacie HEX z urządzenia wejściowego A <- INPUT_DEVICE
    DSP 0x3F 0 Zapisuje do urządzenia wyjściowego daną z rejestru A w formacie HEX OUTPUT_DEVICE <- A
    LD0 0x40 aa8 1 Ładuje rejestr A z RAMSEG0 [**] A <- RAMSEG0(aa8)
    WRI 0x41 aa8 imm8 2 Składuje konstantę pod wskazany adres RAMSEG0 [**] RAMSEG0(aa8) <- imm8
    LD 0x42 aa8 1 Ładuje rejestr A z pamięci programu THAVR (RAMSEG1) A <- RAMSEG1(aa8)
    ST 0x43 aa8 1 Składuje rejestr A do pamięci programu THAVR (RAMSEG1) RAMSEG1(aa8) <- A
    LD2 0x44 aa8 1 Ładuje rejestr A ze wskazanego adresu RAMSEG2 A <- RAMSEG2(aa8)
    ST2 0x45 aa8 1 Składuje rejestr A pod wskazany adres RAMSEG2 RAMSEG2(aa8) <- A
    LD3 0x46 aa8 1 Ładuje rejestr A ze wskazanego adresu RAMSEG3 A <- RAMSEG3(aa8)
    ST3 0x47 aa8 1 Składuje rejestr A pod wskazany adres RAMSEG3 RAMSEG3(aa8) <- A
    CPBLO 0x48 imm8 aa8 2 Porównuje zawartość rejestru A z konstantą, skacze pod wskazany adres jeśli niższa if (A > imm8) PC <- aa8 else PC <- (PC+3)
    RPE 0x49 0 Odczytuje PORTE do rejestru A [***]
    RPF 0x4A 0 Odczytuje PORTF do rejestru A [***]
    WPE 0x4B 0 Zapisuje PORTE z rejestru A [***]
    WPF 0x4C 0 Zapisuje PORTF z rejestru A [***]
    LDX 0x4D aa16h aa16l 2 Ładuje rejestr A z RAM wskazanego przez adres 16 bitowy [***] A <- RAM(aa16)
    STX 0x4E aa16h aa16l 2 Składuje rejestr A do RAM wskazanego przez adres 16 bitowy [***] RAM(aa16) <- A
    START 0xAA 0 Start programu THAVR - musi być na pozycji zerowej pamięci programu THAVR


    [*] - jeśli dany port nie istnieje na docelowym mikroprocesorze lub jest to port systemowy danego systemu cyfrowego instrukcja nie jest zaimplementowana
    [**] - w mikroprocesorach AVR RAMSEG0 to strona zerowa 0x00-0xFF, w innych architekturach musi to być 8-bitowy obszar zawierający rejestry I/O
    [***] - tylko w systemach z RAM powyżej 1KB (HF-6050, HF-6128, HF-6158, HF-6169)
    [^] - po operacji rejestr flagowy jest ładowany do RAM 0x0000


    Organizacja pliku THAVR8

    W tym miejscu przenikają się standardy THFS i THAVR8

    OFFSETDESCRIPTION
    0x00 START code 0xAA (= FILE ID). System operacyjny THOS-1 sprawdza w ten sposób poprawność pliku THAVR8 podczas jego wykonania [^]
    0x01 Punkt wejścia programu THAVR8, wykonanie zaczyna się od tego adresu
    0x01-0xED Program THAVR8, kod lub dane
    0xEC Extra Code Segment - opcjowalny segment dodatkowy zawierający kod [^^]
    0xED Extra Data Segment - opcjowalny segment dodatkowy zawierający dane [^^^]
    0xEE THAVR version - system operacyjny powinien odmówić wykonania programu w razie gdy jego wersja jest starsza od wersji interpretera [%]
    0xEF Hardware Compatibility Code - używane dla odróżnienia różnych podwersji sprzętowych THAVR8 dla danego mikroprocesora lub systemu
    0xF0-0xFF Nazwa pliku. Jest ona opcjowalna, jeśli nie ma nazwy pliku to pod offsetem 0xF0 musi być zapisane 0x00 a offsety 0xF1-0xFF mogą być wykorzystane przez THAVR np. do przechowywania danych


    [^] - w czasie wykonania programu THAVR komórka 0x00 może być zainicjowana do przechowywania danych
    [^^] - segment kodu musi być przeładowany do RAMSEG1 i dostępny instrukcjami LD2, LD3
    [^^^] - segment danych musi być dostępny instrukcjami LD2, LD3
    [%] - obecnie ta funkcja nie jest praktycznie zaimplementowana w interpreterach THAVR, można natomiast sprawdzić wersję ręcznie


    Hardware Compatibility Code

    Niekompatybilności architektur w różnych systemach wymusiły zastosowanie Hardware Compatibility Code. Np. system HF-6030 rezerwuje PORTD dla urządzeń systemowych, tak więc instrukcje dostępu do tego portu przez użytkownika nie są zaimplementowane na tym systemie. System operacyjny THOS-1 odmawia wykonania programu THAVR w razie wykrycia niekompatybilności sprzętowej (emitowany jest kod błędu 0xDB - BAD_HARDWARE_COMPATIBILITY_CODE). HCC umieszczony jest w pliku THAVR8 pod zdefiniowanycm offsetem 0xEF.

    HCCDESCRIPTION
    0x00 Kompatybilność nie ustalona
    0x13 HF-60215 (THAVR6)
    0x28 HF-6128
    0x30 HF-6030
    0x40 HF-6050, HF-6128, HF-6158 HF-6169 (systemy na ATMEGA64, ATMEGA128)
    0x48 HF-6048
    0x50 HF-6050
    0x58 HF-6158
    0x69 HF-6169
    0x78 HF-6030 + HF-6048
    0x80 HF-6030 + HF-6050
    0x98 HF-6048 + HF-6050
    0xFF Wszystkie systemy



    Plik wsadowy - Batch File

    Plik wsadowy Batch File jest silnym narzędziem które pozwala na wykonanie maksymalnie 47 plików THAVR w jednej sesji a więc aż 11.75 KB kodu na raz. Pozwala to na tworzenie bardzo skomplikowanych aplikacji systemowych i użytkownika. Mechanizm Batch File posiada 4 polecenia, przy czym instrukcje ładowania są oddzielone od instrukcji wykonannia co pozwala na ładowanie różnych dodatkowych segmentów danych i kodu (Extra Code Segment i Extra Data Segment) w różnych konfiguracjach. Plik wsadowy używa ostatniego wolnego segmentu RAM (RAMSEG3 w HF-6030 i RAMSEGF w HF-6050, HF-6128, HF-6158, HF-6169), co pozwala na ładowanie do wszystkich segmentów poza segmentem zerowym i ostatnim. W obecnej wersji tylko liniowe wykonanie pliku wsadowego jest możliwe, nie ma tam żadnych pętli czy instrukcji warunkowych. Wszystkie wykonywane pliki muszą się znajdować na jednym drive.


    Polecenia pliku wsadowego batch File

    MNEMONICCODEPARAM.INSTRUCTION DESCRIPTIONREMARKS
    START 0xBF 0 Rozpoczyna wykonanie pliku wsadowego musi się znajdować na pozycji 0 pliku wsadowego (= FILE_ID)
    LOAD 0xEE src_segmentH src_segmentL dst_segment 3 Ładuje segment danych lub kodu drive źródłowy jest zdefiniowany globalnie w segmencie konfiguracyjnym THOS
    EXE 0xEF 0 Wykonuje program THAVR załadowany do FTA
    END 0xE0 0 Kończy działanie pliku wsadowego


    Oto przykładowy kod dla HF-6030 gdzie tylko 2 segmenty są dostępne (w odróżnieniu od systemów na ATMEGA64/128 gdzie jest dostępnych 14 segmentów):

    0x00: 0xBF                ; START
    0x01: 0xEE 0x00 0x15 0x02 ; LOAD ładuj segment danych do RAMSEG2
    0x05: 0xEE 0x00 0x14 0x01 ; LOAD ładuj segment kodu do FTA - musi być być ostatnią operacją przed wykonaniem
    0x09: 0xEF                ; EXE wykonaj
    0x0A: 0xEE 0x00 0x16 0x01 ; LOAD ładuj segment kodu do FTA - musi być być ostatnią operacją przed wykonaniem
    0x0E: 0xEF                ; EXE wykonaj
    0x0F: 0xB0                ; END



    Kompilacja programów THAVR

    Kompilacja jest możliwa zarówno na samych systemach cyfrowych jak i w zewnętrznych kompilatorach. Pierwszy sposób jest szybszy (nie trzeba downloadować kodu z PC) ale mniej wygodny bo wewnętrzny kompilator nie jest relokowalny. Trzeba odgórnie założyć adresy różnych funkcji, co jednak w zakresie 8 bit nie jest takie trudne po pewnej praktyce. Natomiast zewnętrzny kompilator ma więcej możliwości, w dodatku napisane zostały odpowiednie makroinstrukcje ułatwiajace kompilację. Więcej informacji w [1].

    Do kompilacji używam bardzo zgrabnego kompilatora FASMW wraz z napisanym plikiem makro który definiuje wszystkie instrukcje i stałe systemowe.

    HAVR_INS30.ASM plik makro definicji instrukcji dla systemu HF-6030
    HAVR_INS50.ASM plik makro definicji instrukcji dla systemu HF-6050


    Dekompilator THAVR

    Od wersji xx.39 dodany został praktyczny dekompilator kodu maszynowego THAVR. Była to chyba ostatnia rzecz której mi brakowało w tym systemie, często bowiem się zdarzało że pisałem kody THAVR wprost z klawiatury HF-6030 i zapominałem zapisać kodu źródłowego. Dekompilator działa bardzo prosto: podaje adres, mnemonik i ewentualny parametr. Cały kod dekompilatora zajął zaledwie 52 instrukcje i makroinstrukcje, dzięki temu że korzysta z tabel kompilatora. Dekompilator zatrzymuje działanie w razie wystąpienia błędów: 0xDB, 0xE1, 0xE2 (zob. tabela poniżej) więc może być też wykorzystany do poszukiwania błędów w kodzie jeszcze przed uruchomieniem programu THAVR.


    Wykrywanie błędów

    Wykrywanie błędów wykonywane jest zarówno na etapie kompilacji jak i wykonania kodu. Na etapie kompilacji występują tu jednak pewne różnice między zewnętrznymi kompilatorami a wbudowanymi. Wbudowany kompilator sprawdza tylko błędy syntaktyczne a zewnętrzny makrokompilator ma sporo wbudowanych funkcji wykrywania błędów. Wystarczająco dobre wychwytywanie błędów zachodzi jednak na etapie wykonania:

    SYGNAŁY I BŁĘDY ZWRACANE PRZEZ INTERPRETER THAVR

    CODESIGNAL/ERROR NAMEDESCRIPTION
    0x00 NO_ERROR brak błędu - wykonanie programu THAVR pomyślne
    0xDB THAVR_BAD_HARDWARE_VERSION zła wersja hardwaru dla tego zestawu instrukcji THAVR
    0xDC THAVR_PC_VIOLATION w instrukcji ST0 lub WRI został użyty adres licznika rozkazów (0x1A-0x1B)
    0xE1 NO_THAVR_PROGRAM załadowany do FTA plik nie jest programem THAVR
    0xE2 NO_THAVR_CODE dany bajt nie jest poprawnym opkodem THAVR

    Przy braku błędu interpreter domyślnie zwraca kod 0x00. Kod zwracany można też wymusić za pomocą instrukcji WRS.



    Biblioteka programów THAVR

    Do chwili obecnej powstało około 150 programów THAVR, rozwiązujących różne problemy programistyczne, ale głównie są to sterowniki do różnych modułów zewnętrznych. Jednym z ciekawszych programów THAVR (choć mało użytecznym) jest gra w statki... Napisałem ją głównie dla zabawy i przetestowania możliwości THAVR. Co prawda jest to gra tylko z jednym graczem, komendy od programu odbiera się telegrafią, rysuje na kartce mapę a po zatopieniu wszystkich statków program podaje ilość strzałów do floty... Powstały 3 programy które różnią się tylko mapami statków.

    SHIPS01.ASM SHIPS01 - kod źródłowy
    SHIPS02.ASM SHIPS02 - kod źródłowy
    SHIPS03.ASM SHIPS03 - kod źródłowy


    CALCULATOR - jest to prosty 9-działaniowy, 8 bitowy kalkulator. Kod maszynowy zajął 191 bajtów pamięci. Dostępne działania to A - AND, C - NOT, D - ADD, N - NEG, O - OR, S - SUB, X - XOR, L - LSL, R - LSR.

    CALCULATOR.ASM CALCULATOR - kod źródłowy
    CALCULATOR.BIN CALCULATOR - kod maszynowy


    Dla modułu RTC HF-9037 powstały 3 programy, pierwszy to prosty test który testuje moduł licząc od 00:00, drugi ustawia datę i czas a trzeci to zegar który podaje czas co minutę.

    HF9037_TEST.ASM Test modułu HF-9037 - kod źródłowy
    HF9037_TEST.BIN Test modułu HF-9037 - kod maszynowy
    HF9037_SET.ASM Ustawianie daty i czasu modułu HF-9037 - kod źródłowy
    HF9037_SET.BIN Ustawianie daty i czasu modułu HF-9037 - kod maszynowy
    HF9037_CLOCK.ASM Zegar na bazie modułu HF-9037 - kod źródłowy
    HF9037_CLOCK.BIN Zegar na bazie modułu HF-9037 - kod maszynowy


    Praktyczne wskazówki pisania programów THAVR

    1/ Przy szybkim pisaniu programów z wbudowanego kompilatora wygodnie jest założyć adres funkcji na 0x80 a segment danych na 0xD0. W razie gdy kończy się miejsce w danym obszarze po prostu wykonujemy JMP do wolnego jeszcze obszaru.

    2/ Ponieważ programy THAVR wykonywane są z RAMu możliwe są typowe triki nadpisywania użytego już kodu. Jeśli jakiś obszar kodu został użyty w programie i nie bedzie już potrzebny można go nadpisać instrukcjami LD2, LD3 i ST z zewnętrznego segmentu RAMSEG2 lub RAMSEG3 (Extra Code Segment i Extra Data Segment).

    3/ Możliwa jest także globalna modyfikacja parametrów instrukcji aby zmienić ich działanie, np. można nadpisać parametr skoku JMP.


    Lista systemów cyfrowych z zainstalowanym THAVR (w kolejności uruchamiania):

  • HF-6060 (AT90S2313) - pierwszy eksperymentalny system z interpreterem THAVR (działał ale miał niewielkie błędy)
  • HF-6048 (ATMEGA16) - pierwszy w pełni działający system z kompilatorem i interpreterem THAVR
  • HF-6030 (ATMEGA8) - najczęściej używany system z kompilatorem i interpreterem THAVR
  • HF-6050 (ATMEGA128) - pierwszy system z rozszerzoną listą rozkazów
  • HF-6128 (ATMEGA128) - drugi system z rozszerzoną listą rozkazów, zintegrowana pamięć RAM 32 KB
  • HF-6158 (ATMEGA64) - trzeci system z rozszerzoną listą rozkazów
  • HF-60215 (ATTINY13) - prowadzone próby z THAVR6
  • HF-6169 (ATMEGA64)- czwarty system z rozszerzoną listą rozkazów
  • HF-60104 (8051) - w trakcie przepisywania na MCS-51


  • Planowane jest uruchomienie THAVR na wielu różnych (egzotycznych) mikroprocesorach, jest to jednak proces dość powolny który zajmie trochę czasu...


    Sources:

    [1] Oryginalna specyfikacja THAVR


    HF Register

    Microcontrollers in my constructions

    UC Database - my CPU collection

    Electronics

    Main Page

    Hosted by www.Geocities.ws