atarionline.pl krótka tablica mnemoników - Forum Atarum

Jeśli chcesz wziąć udział w dyskusjach na forum - zaloguj się. Jeżeli nie masz loginu - poproś o członkostwo.

  • :
  • :

Vanilla 1.1.4 jest produktem Lussumo. Więcej informacji: Dokumentacja, Forum.

    • 1: CommentAuthormarok
    • CommentTime4 Mar 2023
     
    Prosta prezentacja metody specjalnego zapisu mnemoników w tablicy.
    W tym wypadku rzecz dotyczy mnemoników 8086 (niekoniecznie to 'target') i chodziło o to, żeby całą tablicę koniecznie zmieścić w obszarze strony pamięci, a same mnemoniki mogły być różnej długości.
    • 2:
       
      CommentAuthorpirx
    • CommentTime5 Mar 2023
     
    dawaj zrodlo a nie xexem swiecisz :)
    • 3: CommentAuthormarok
    • CommentTime5 Mar 2023
     
    jeśli może się przydać, to proszę:
    org $3800

    ?rst ldy #$ff
    sty $2fc
    ldx #0
    beq ?lb1

    ?lb0 lda tab+1,y
    eor #$40
    bne ?lb1
    ?lex lda $2fc
    cmp #33
    beq ?rst
    cmp #$1c
    bne ?lex
    jmp ($0a)


    ?lb1a jsr saseq
    ?rm inx
    ?lb1 iny
    lda tab,y
    bpl ?lb1a
    asl @
    bpl ?lbm1
    ; lsr @
    jsr ioseq
    dex
    bcc ?lb1
    ?lp1 dex
    beq ?lb0
    jsr loseq
    beq ?lp1
    bne ?lb1
    ?lbm1
    ora #$80
    ; lsr @
    jsr ioseq
    bcc ?lb1
    dex
    dex
    ; beq *
    jsr loseq
    bne ?lp1
    ?lp2 dex
    beq ?rm
    jsr loseq
    beq ?lp2
    bne ?rm

    loseq lda bufo,x
    eor bufo-1,x
    and #$20
    rts

    saseq sta bufo,x
    and #$df
    sta mnem,x
    rts
    ioseq lsr @
    cmp #$60
    jsr saseq
    inx
    lda #$9b
    sta mnem,x
    php
    txa
    pha
    tya
    pha
    inx
    stx $348
    ldx #0
    ; stx $349
    lda <mnem
    sta $344
    lda >mnem
    sta $345
    lda #11
    sta $342
    jsr $e456
    pla
    tay
    pla
    tax
    plp
    rts

    tab icl 'tablica.asm'

    bufo equ *
    mnem equ *+$20

    (zauważyłem po publikacji, że "lsr @" może być wciągnięte w podprocedurę, dlatego generowany kod z tego źródła powinien być o bajt krótszy)

    dość niekonsekwentnie używałem przedrosta ? przed etykietami w źródle (można sobie to popoprawiać w każdą stronę)

    Jeśli chodzi o postać tablicy to trzeba samodzielnie ją sobie skonstruować wg pewnych zasad (przestawiania bitów do liter z nazw nemoników, jest to do pewnego stopnia skomplikowane).

    Dlatego proponuję, jeśli chodzi o dowolny (raczej stary) procesor, że chętnie się bym zajął konstrukcją takiej tablicy (chętnie się zmierzę z takim zadaniem). Może to być szybsze niż opanowanie tego z miejsca i tłumaczenia pewnych zawiłości.

    Oczywiście mogę dla ułatwienia zrozumienia też opublikować zapis w źródle tablicy gotowaej dla 8086, gdyby byłaby na to ochota (sporo zajmuje).
    • 4: CommentAuthormarok
    • CommentTime5 Mar 2023
     
    Takie opracowanko / zestawienie nazw "nielegali".
    Może komuś się jeszcze przyda (a mnie się przyda do zrobienia jeszcze jednej lub więcej tablic mnemoników podobnych do tej wcześniej).

    ALR 6502C   ASR (ASR) [ALR] ANSR ……… ALR (ASR)
    ANC 6502C 2 AAC (ANC) [ANC] ANCC ……… ANC (ANC2)
    ANE 6502C XAA (ANE) [XAA] XAND ……… ANE (XAA)
    ANX 6502C ATX (LXA) [OAL] ANTX LXA (LAX #imm)
    ARR 6502C ARR (ARR) [ARR] ARRC ……… ARR
    ASO 6502C SLO (SLO) [ASO] SLOR ……… SLO (ASO)
    CIM 6502C KIL (JAM) [HLT] ???? ……… JAM (KIL, HLT)
    DCP 6502C DCP (DCP) [DCM] DCPA DCM DCP (DCM)
    DOP 6502C E DOP (NOP) [SKB] STOP%……… NOP
    ISB 6502C ISC (ISB) [INS] INSB INS ISC (ISB, INS)
    LAS 6502C LAR (LAE) [LAS] #### ……… LAS (LAR)
    LAX 6502C LAX (LAX) [LAX] LDCX ……… LAX
    LSE 6502C SRE (SRE) [LSE] SRXR ……… SRE (LSE)
    NPO 6502C 6 NOP (NOP) [NOP] STOP%……… NOP
    RLN 6502C RLA (RLA) [RLA] RLAN RLA RLA
    RRD 6502C RRA (RRA) [RRA] RRAD RRA RRA
    SAX 6502C AAX (SAX) [AXS] STCX ……… SAX (AXS, AAX)
    SBX 6502C AXS (SBX) [SAX] ASBX ……… SBX (AXS, SAX)
    SHA 6502C AXA (SHA) [AXA] MIHB ……… SHA (AHX, AXA)
    SHS 6502C XAS (SHS) [TAS] #### ……… TAS (XAS, SHS)
    SHX 6502C SXA (SHX) [XAS] 65SC ……… SHX (A11, SXA, XAS)
    SHY 6502C SYA (SHY) [SAY] 65SC ……… SHY (A11, SYA, SAY)
    TOP 6502C 7 TOP (NOP) [SKW] STOP%……… NOP
    ;SBC 6502C SBC (SBC) [SBC] SUBC ……… USBC (SBC)


    znaczenie kolumn (tych z mmemonikami):
    1. Mads ,
    2. Freddy Offenga + WosFilm, Mega Magazine
    / The Symbolic Disassembler by HiasSoft
    (Craig Taylor, C64)
    [Adam Vardy, C64] ,
    3. KMK, Bajtek 3/95
    ( #### - omitted, ???? - no, but not named, 65SC - int. ommited coz 65SC02 opcodes in the place) ,
    4. Xxl ("……… " : same as Mads, or if MNE : same as Mads + second alt. mne.) ,
    5. "www.masewerk.at" .
    • 5: CommentAuthorgorgh
    • CommentTime5 Mar 2023
     
    wszystko ładnie pięknie, ale po co?
    • 6: CommentAuthormarok
    • CommentTime5 Mar 2023
     
    Zależy na jakie pytanie mam odpowiedzieć (zadane ogólnie czy bardziej szczegółowo).

    Od szczegółowości zacznę (i na razie tym skończę). Pomyślałem, że tablica zwięzła bardziej mi pasuje, ale temat nie mam jakoś dobrze przemyślany.

    Dla przykładu, w Mads z mnemoników liczy się CRC32 (czy coś podobnego) i tak ustala dwubajtowy wyróżnik (dla mnemonika).
    Z tego można później z drugiej tablicy (words) znajdować index właściwy dla mnemonika. Ten by nas interesował jako cel całej operacji.

    Z prostej tablicy skondensowanego zapisu można wyciągnąć pierwszą wartość, która już może być indeksem (bo to jest wartość jednobajtowa), a jeśli nawet nie, to ją łatwiej potem przeliczyć na ten index.

    Cała rzecz nie musi być "warta świeczki" (z pewnością można wymyśleć lepsze rozwiązania), to kwestia trochę gustu i pomysłu, który komu przyjdzie na myśl i się spodoba.
    • 7: CommentAuthormarok
    • CommentTime5 Mar 2023 zmieniony
     
    Dodaję jeszcze dwie kompilacje z tablicami mnemoników dla 6502C i 65816. Robione na szybko, w związku z czym może gdzieś są jakieś błędy lub braki jeszcze (do poprawienia i uzupełnienia w przyszłości).
    • 8:
       
      CommentAuthorAlex
    • CommentTime5 Mar 2023
     
    Kompletnie nie rozumiem o co chodzi i po co to wszystko... Ktoś może wyjaśnić?
    • 9: CommentAuthormarok
    • CommentTime6 Mar 2023
     
    To może ja spróbuję…

    A no, postawiłem sobie pewne zadanie (krótka tablica mnemoników) i że udało się to doprowadzić do stanu zadawalającego (bo zadziałało), to sobie pozwoliłem to "uwiecznić". Jest w tym element samochwalstwa czy czegoś takiego, i już (po prawdzie, nawet planowałem tutaj publikację, zanim zacząłem pisać sam kod, a jeszcze opracowywałem tą metodę, za to miałem już "w głowie" ideę tego programiku "demonstacyjnego").

    Ponieważ mnie zajmuje to, znaczyć to może, że interesuje mnie coś więcej, do czego to mogłoby się przydać, ale akurat nie przejawiam specjalnej ochoty o tym pisać (zwykle to nie pomaga potem w mobilizacji do konktynuowania rozpoczętych prac, w moim wypadku).

    Takie próbki mini kodu sobie czasem publikuję, bo nic większego nie tworzę (nie mam wyboru, jeśli już chcę przejawiać jakąś aktywność tego rodzaju - w myśl "każdy orze, jak może").

    Co do tej "techniki" kodowania mnemoników.
    To daje to dobre 1/3 oszczędności na długości tablicy, a chodziło głównie o to, aby się zmieścić na jednej stronie pamięci z taką tablicą (taki mój kaprys, nie wiem czy "zdroworozsądkowy", ale tak mi się "naówczas" wydawało).

    Te kompilacje służą mi także jako "walidacja" poprawności wprowadzanych ręcznie danych do tablic mnemoników. Są niejako koniecznością (dla mnie), ale je publikuję, bo kto wie (choćby), co się komu może przydać (i co merytorycznego zwrotnie może dzięki temu się dowiem).

    Jeśli mnie jakoś @pirx nie starał się podejść ("czy cuś"), to wydaje się, że autentycznie tym sposobem zapisu (zagęszczonego) tablicy danych ktoś już (z jakiś - nieznanych mi względów) się zainteresował.

    Z mojej strony chętnie przeczytałbym o innych sposobach zapisu danych do tablic tekstowych (z dedykacją dla mnemoników), które nadawałyby cechy umożliwiające lepsze zastosowanie do interpreterów haseł tekstowych (np. mnemoników). Przez interpreter rozumiem zamianę hasła tekstowego na jego index (rozpoznanie go i przydzielenie właściwego mu "numerka").

    Z mojego spojrzenia, gdyby rozważać jakiś "normalny" depaker w zastosowaniu, to by znaczyło, że musiałbym za każdym razem (podejściem do odczytu takiej tablicy) rozpakowywać dane ponownie (coś jak teraz przy tej metodzie, ale w bardziej złożonym procesie) ale nie wiem, jak bym mógł rozwiązać jednocześnie to, czego szukam, czyli znajdować index w "zagęszczonym" jeszcze (spakowanym) zapisie (bo wyszedłem z założenia, że chciałbym zmieścić się na ograniczonym do strony obszarze przy odczycie z tablicy).
    • 10:
       
      CommentAuthorjhusak
    • CommentTime6 Mar 2023 zmieniony
     
    Hm. W 6502 mamy 56 rozkazów, to daje 168 bajtów bez żadnego kodowania. Ponieważ skomplikowane rozwiązania do prostych problemów nie działają, to ja _osobiście_ uważam takie rozważania jako sztuka dla sztuki, co wcale nie oznacza, że to jest do wyrzucenia. To jest ciekawe, ale nie do regularnego stosowania - poza miejscami, gdzie żyłowanie pamięci jest na maksa.

    A poza tym możesz kodować literkę na 5 bitach i w ten sposób masz 112 bajtów i jeszcze 56 bitów do wykorzystania :)
    • 11: CommentAuthormarok
    • CommentTime6 Mar 2023
     
    @jhusak: Mogę napisać, że w całej rozciągłości z ogólnym przesłaniem mógłbym się tu z Tobą zgodzić.

    Co do liczby mnemoników, to może ich być więcej i akurat nie da się ich wówczas zmieścić na stronie pamięci (wymnażając ich liczbę przez 3).

    Pytaniem jest, czy uzyskaniem takiej możliwości nie przesłania się trudności w dostępie do danych z tablicy - czyli efektywności odczytu z niej, oraz czy to faktycznie jakaś 'wielka' korzyść by zmieścić się na stronie pamięci (może dam się przekonać, że nie?).

    Co do Twojego ostatniego zdania jeszcze z poprzedniej wypowiedzi, to zgłaszam problem następujący (i przy okazji pytam):

    5 bitów to akurat zakres obejmujący literki, czyli zasadniczo to, o co chodzi w tym wypadku. Niemniej zdarzają się czasem mnemoniki z cyframi przypiętymi na końcu (czy to jedyne takie przypadki użycia innych znaków - i tylko tam?). Poza tym, dlaczego ma ten system kodowania ograniczać się do zastosowań czysto 'mnemonikowych', gdyby się miał przydać kiedy indziej i mieć charakter bardziej uniwersalny?

    5 bitów na zapis znaku to także konieczność składania znaku na różnych pozycjach bitowych (przesunięcia + ew. przesłanianie bitów i właściwa interpretacja tego). Dostęp staje się trudny, a też nie o to chodzi w takim rozwiązaniu. Chodzi bowiem też o efektywność dostępu do danych, niewątpliwie (gdyby ktoś wątpił w tą moją intencję).

    5 bitów na znak dla 3 znakowego mnemonika, to po 2 bajty na mnemonik. Dla uproszczenia każdy wpis parzysty/ nieparzysty w tablicy może rozpoczynać 'deklarację' nowego mnemonika (ułatwiałoby to dekodowanie). (W efekcie przypomina to liczenie CRC32, jeśli wynikiem ma być wartość zapisana w word). Uzyskujemy dokładnie 1/3 w wydajności upakowania, a więc wcale nie więjszą (sądzę, że mniejszą) niż to, co się udało tą metodą, przy czym ograniczamy się w znakach (do samych liter) i sztywnych 3 znaków na mnemonik. Brzmi to jak "słaby biznes".
    • 12:
       
      CommentAuthorjhusak
    • CommentTime6 Mar 2023
     
    Co do ostatniego akapitu - biznes is biznes (hehe) - zależy gdzie zysk.

    Wydaje mi się, że używasz terminu CRC32 w znaczeniu CRC - tak dla ścisłości, żeby wszystko było zrozumiałe. CRC32 to odmana CRC dla 32 bitów, CRC16 dla 16, a CRC8 dla 8.

    Ale jak piszę - optymalizujemy pod konkretną potrzebę, tu się niewiele da dyskutować, bo jak potrzeba będzie ta sama, to tak samo zoptymalizujesz i Ty, i ja.
    • 13: CommentAuthorilmenit
    • CommentTime6 Mar 2023
     
    @marok - gdzie takie zabawy mogą się przydać to kompresja kodu 6502 (kodu, bez danych) np. dla intr 256 bajtów. Kombinowałem ze zrobieniem kompresora ale nie udało mi się uzyskać wyniku, gdzie dekompresor+dane byłyby krótsze niż nieskompresowany plik.
    • 14:
       
      CommentAuthorjhusak
    • CommentTime6 Mar 2023
     
    @ilmenit, da się z kompresorem, tylko dane muszą być powtarzalne :) No i kompresor zx7, z chyba najkrótszym dekompresorem, jaki znam, niecałe pół strony pamięci.
    • 15: CommentAuthormarok
    • CommentTime6 Mar 2023
     
    linijka ze źródła do MADS (co prawda to tylko komentarz, więc jeszcze nie dowód ostateczny):
    "// pobierz nazwe rozkazu, oblicz jego CRC16"

    Teraz druga sprawa. Chyba powinienem to wyjaśnić (bo sam zasugerowałem lekko coś innego). Ta wersja procedury jest otwarta na modyfikację, ale w stanie obecnym 'nie pociągnie' kodów różnych od liter (i to zawsze podmieniając te "na duże" w przypadku "małych"). Ale prosto można dodać opcję (jedno rozgałęzienie kodu), że znaki z zakresu 0x00… 0x3F będą mogły być uwzględnione (np. litery). Z tym że jest tu taki (zasadniczy) problem, że nie da się tego już tak prosto zrobić, jeśli taki znak ma się znaleźć na końcu (samodzielnego) wyrazu / hasła / mnemonika.
    Czyli, de facto, w zasadzie jest to przystosowane do działania na wąskim odcinku wartości przypisanych literom. Przy czym, sądzę że można nad tym jeszcze popracować w kierunku 'uniwersalności'. Nie zakładam jednak, żeby dało się tą metodą kodować wartości powyżej 0x7F. Tu jest, zdaje się, sztywna bariera.
    Możliwość kodowania tych innych poza literami wartości (do 0x7F) widzę w przypisaniu specjalnego znaczenia, tzw. przełączników, do kodów z zakresu liter ale nie-liter. Ich wystąpienie może przestawiać interpretację następujących po nich znaków, itp. W zasadzie nawet i znaki > 0x7F dałoby się 'jakoś' w tym wszystkim uwzględnić.
    Ale to są rozważania bardzo teoretyczne na ten moment dla mnie, jak zresztą widać (sam sobie zaprzeczam w kwestii znaków > 0x7F).
    Mogło mi się wydawać, że jest to format bardziej otwarty niż to 5 bitów.
    Po namyśle wychodzi mi, że niekoniecznie tak być musi. I tutaj już sobie przejdę do modelu 5 bitów na zapis litery w grupie 2 bajtów na 3 kodowane litery (potencjalnego mnemonika).

    Tak sobie pomyślałem, że ten ostatni bit do wykorzystania (16- 3*5) to akurat by się nadawał na oznacznik 'rozszerzenia' zapisu hasła (mnemonika). Ponieważ odczyt z tablicy mógłby wykonywać się po kolei (normalnie to 2 bajty na wpis mnemonika), to problem określenia początku deklaracji kolejnych mnemoników nie byłby problemem.
    Więc taki bit oznacznika 'otwiera' deklarację kolejnego bajtu, a tam mamy 5 bitów na znak (4) + 3 kolejne bity na dalsze 'szaleństwa' (z możliwą dalszą ekspansją na kolejne bajty z dalszymi 'przełącznikami'). Tym sposobem możemy tak to poustawiać, że nie będzie żadnych ograniczeń, co do zarówno długości hasła (dekodowanego), jak i kodowanych wartości (także tych 3 z pierwszych dwóch bajtów, bo te można 'reinterpretować' z liter na inne znaki).
    Pierwszy i drugi, znaki mogłyby być dla ułatwienia sprawy (decodingu) na swoim miejscu |(na właściwych bitach), a starsze bity kodowałyby 3 znak + przełącznik na tych dwóch bajtach.
    To tak ogólnie widzę, aby oddać 'sprawiedliwość' temu pomysłowi 5 bitów na znak, który wstępnie skrytykowałem za nadmierną 'sztywność'.
    • 16:
       
      CommentAuthorjhusak
    • CommentTime6 Mar 2023 zmieniony
     
    No właśnie ten bit daje możliwość kodowania a'la UTF8. Masz możliwość odpalania specjalnego kodu, jak masz dajmy na to 111111xx to dalej cośtam, a jak nie, to masz A-Z + cyfry 0-4 z palca i 3 litery. Jakby sprawdzić, jakie cyfry używane są w mnemonikach różnych procesorów - można by być może to zunifikować, bo o ile wyobrażam sobie 1,2,3, to 0 i 4 już mniej, a >=5 już wcale.
    • 17:
       
      CommentAuthorAlex
    • CommentTime7 Mar 2023
     
    @marok - Ale na co komu w ogóle ta tablica? Wykaz mnemoników jest w każdej książce o danym procesorze :) Można też sobie wydrukować na jednej stronie i powiesić nad monitorem jak ktoś nie pamięta.
    • 18:
       
      CommentAuthorjhusak
    • CommentTime7 Mar 2023 zmieniony
     
    @Alex - to rzecz gustu, a o gustach się nie dyskutuje :)

    A dlaczego Ty chcesz umieszczać 6502 w jakimś mikrokontrolerze? A nikt Cię nie zniechęca do prowadzenia prac.
    • 19: CommentAuthormarok
    • CommentTime7 Mar 2023
     
    Wykaz (ten programik) jest przy okazji. Taka demonstracja do tablicy zapisanej "gęsto" (że jest złożona poprawnie, a można się jej przyjrzeć pod monitorem, jak wygląda). Raczej chodzi o to, że jak wprowadza się dany ciąg znaków, to interpreter może to sobie porównać z tablicą zapisanych 'haseł'. Hasła musi mieć zdefiniowane, więc taka tablica jest niezbędna. Robią to asemblery i mnie się coś takiego (mniejszego) też marzy.

    Nie udało mi się tego 'zaimplementować' jeszcze, ale pomysł na to, jak wprowadzać dane liczbowe na koniec mnemonika w tablicy już mam.

    Krótki opis (przymiarka):
    Znak "@" (0x40) z ustawionym 7 bitem (+/- bit 5) daje znać że następna wartość (w tablicy) to
    max wartość liczbowa (przyrostka) dla tego rodzaju instrukcji, zapisana w osobnym bajcie (więc może być to nawet 255)
    taka instukcja to na przykład: "53 RMBn - Reset Memory Bit n" (6280 - rodzina 6502)
    zakładam, że jeśli wartość jest równa lub mniejsza od tej max wartości, to jest ona dostępna
    ale wyjątkiem jest 0, więc robię tak, że przy 'małej' liczbie (do 63 chyba - do momentu, kiedy bit 7 jest jeszcze zgaszony) bit 0 wyjaśnia sytuację, czy wartośc 0 należy do zbioru dopuszczalnych wartości
    bit ten należy interpretować tak - od jakiej wartości jest dopuszczalny zakres (0 czy 1, i stan bitu 0 na to odpowiada). Przy wartościach większych tego bajtu (dopuszczalnej max wartości), z góry zakładamy, że mamy do czynienia z zakresem wartości od 0, i bit zero traktujemy jako najmłodszy bit zapisanej wartości max (wcześniej liczyliśmy ją od bitu 1 z +1 gdy bit 0 był zapalony: np. 15 byłby to zakres 1-8)
    • 20: CommentAuthormarok
    • CommentTime7 Mar 2023 zmieniony
     
    To jeszcze ten przykład listy (tablicy) mnemoników - 6280.

    Tutaj zastowowałem tą koncepcję, o której pisałem w ostatnim wpisie, ale wymagało to użycia dodatkowo kodu "`" (0x60) w reversie (oprócz 0x40 w reversie).

    Dla uproszczenia (kodu) i mojej wygody, mnemonik z wartością liczbową przypiętą na końcu jest wyświetlany dwukrotnie - raz z @, raz z wartością graniczną. Wyświetlanie (poprawne) dostosowane jest tylko do wartości odpowiadającej jednej cyferce (do 9), a gdyby się pojawił revers tej cyferki (nie przekonałem się czy to działa), to by znaczyło, że 0 jest niedozwolone (jako element składowy zapisu formalnego instrukcji).

    Uwaga na marginesie. W kodzie źródłowym, który wkleiłem, można nanieść poprawkę polegającą na redukcji dwóch "dex" (w różnych lokalizacjach) przy odpowiednim przesunięciu rozkazów "txa \ pha" w innym miejcu (i zmianie niektórych odwołań przy skokach war. jeszcze).
    Ponieważ to część "core" tej procedury (nie wszystki kod można tak określić), wspominam o tym.
    ("core" w tym sensie, że będzie potrzebny poza tą prezentacją w procedurze docelowej)
    • 21:
       
      CommentAuthorAlex
    • CommentTime7 Mar 2023
     
    @jhusak - Ja tylko pytałem o sens :) Sens mojego projektu to stworzenie bezinwazyjnej alternatywy dla Rapudusa.

    @marok - Czyli chodzi o sposób na kompresję kodu asemblerowego? No teraz to ma sens :)
    • 22: CommentAuthormarok
    • CommentTime7 Mar 2023
     
    @Alex - Nie miałem takiej koncepcji. Trudno mi też jednoznacznie odgadnąć, czy napisałeś o kodzie nieskompilowanym czy skompilowanym (to drugie to nie wyobrażam sobie).

    Jeśli chodzi o to pierwsze (bo tak skojarzyłem to szybciej), to pobudziłeś moją wyobraźnię, ale wydaje mi się to w ostateczności jednak trochę bezcelowe.

    Pomysł jest o tyle fajny, że faktycznie łatwo pakować mnemoniki indeksami (to 1 bajt, czyli jak opcode). Teoretycznie też odwołania do 'czystych' "labeli" mogą być dwubajtowe (znów jak w kodzie skompilowanym w odniesieniu do argumentu), jako indeksy do oddzielnej tablicy upakowanej podobnie (z założenia, jak rozumiem pomysł).

    Tylko obsługa takiej tablicy byłaby trudna, wymagała szeregowania labeli przy każdej zmianie, a te wcale tak dobrze nie musiałyby się spakować. Podobieństwo podobieństwem, jeśli chodzi o nazwę labeli, ale jeśli początkowy człon nazwy się różni, to nie ma okazji do upakowania tego tą metodą.

    Ta metoda (w tej postaci) wybitnie pasuje do mnemoników i trudno chyba znaleźć dla niej inne zastosowanie. Chyba, że zostałaby przerobiona na korzystanie "ze słownika" na podstawie innych haseł (ich fragmentów) w tablicy. To może też możliwe, ale trudno mi o tym coś więcej pisać.

    Trzymanie w takiej formie kodu źródłowego nie pozwalałoby na łatwą edycję (choć może ją nie uniemożliwiało), więc nie wiem, na którym etapie 'wchodziłaby' ta metoda, czy od początku czy na żądanie (przy archiwizacji, za to z zachowaną możliwością podglądu - tu widzę jaką korzyść). I co by to dawało realnie, gdyż z brakiem pamięci masowej nie ma problemu w dzisiejszych czasach (także sprzętowo na Atari).

    Ogólnie nie do końca dostrzegam korzyść w walce o krótszy (choćby nawet znacznie) kod źródłowy. Może on by się gdzieś odnalazł, w jakimś zastosowaniu, być może, ale ja tego nie widzę.
    • 23:
       
      CommentAuthorpirx
    • CommentTime7 Mar 2023
     
    tylko dodam, ze w Mac/65 kod zrodlowy jest przechowywany w formie stokenizowanej, coś jak atari basic. ma to jakieś zalety - kompilacja jest szybsza, zrodlo zajmuje mniej miejsca w pamięci, więc latwiej jakieś relatywnie proste programy modyfikować i uruchamiać.
    • 24: CommentAuthormarok
    • CommentTime10 Mar 2023 zmieniony
     
    Zrobiłem pewne założenia odnośnie pozostałych kodów ascii (od wyświetlania znaków).
    Wszystkie one dadzą się wyświetlić ale za cenę dwóch bajtów (więc należałoby tego unikać).

    Głupawa (nie miałem do tego głowy) demonstracja, że jakoś to (chyba) działa, w załączniku.

    Można więc wyświetlać liczby w mnemonikach. (Wcześniej też można było, ale teraz można określić konkretną liczbę, a nie z zakresu dopuszczalnych - co znaczyło np., że mne2 wcześniej nie mogło wystąpić bez mne1, a teraz może; "zakres" też pozostał, ale lekko zmodyfikowany w teorii.)

    edit: kodowanie reszty znaków ascii pozmieniałem jeszcze (podmieniam też plik)
    • 25: CommentAuthormarok
    • CommentTime15 Mar 2023 zmieniony
     
    Skompilowałem właśnie tablicę mnemoników dla 6309. Proc ma ich aż 223, ale ich wzajemne podobieństwo sprawia, że całość 'pakuje' się bardzo dobrze (to może być przypadek ekstremalny).

    Chciałbym przedstawić liczby.

    Tablica zamkęła się w 333 bajtach. (Cały program z danymi to 665 bajty.) Licząc 'porcję' kodujących bajtów na mnemonik wychodzą takie wartości:
    333/223
    1,4932735426
    665/223
    2,98206278027

    Ten kod jest z pewnością niewystarczający (względem długości), aby obsłużył swobodny wybór mnemonika. Stąd wniosek, że dopiero w zastosowaniu z wieloma takimi tablicami, lub jedną bardzo długą (niekoniecznie mnemoników), mogłoby to być 'opłacalne'.

    edit:
    ach, pomyliłem się… (poprawka w wartościach obliczeń)
    • 26: CommentAuthormarok
    • CommentTime20 Mar 2023 zmieniony
     
    To zdecydowanie zasługiwało by na oddzielny wątek, ale podepnę się z tym tutaj w związku z pewnym szczegółem, o który chciałbym również zapytać.

    Dotarłem przypakiem, zaznaczę, do bloga "Advanced 6502" (na 6502.org), a tam znajduje się wykaz chyba bardzo słabo znanych 'zastępników' 6502. (Super sprawa z tą stroną i tym wykazem.)

    Mnie szczególnie zainteresowały (póki co) dwa z wymienionych:
    - KimKlone ,
    - 65el02 .

    Ten drugi to boczne rozwinięcie (niepełna kompatybilność) z 65816, a ten pierwszy to projekt powstały niezależnie od 65816 w podobnych latach (a nie inspirowany nim).
    Punktem wyjścia był 65C02 (podobnie jak dla 65816).

    Nie weszłem na stronę z linka do strony o tym (drugim) procesorze (jakieś ostrzeżenia o braku certyfikacji), ale skorzystałem z wayback machine.
    I to tam (od siebie) odsyłam ewentualnych zainteresowanych (cieszmy się z istnienia takiej możliwości):
    ->link<-
    Szczegółowo opisane.

    Moje pytanie dotyczy takiego szczegółu - jest tam powiedziane że istnieją "prefixy" do instukcji, które pozwalają odwołać się do innych partii pamięci (24-bitowego adresowania).
    Te prefixy wyraża się mnemonikami: K1_, K2_ i K3_ ("K0_" jest domyślny przy braku prefixu i nie ma go jako takiego).

    Tak mi się wydaje, że te prefixy przewidywane były do doklejenia do instrukcji właściwej, tj. np. k1_lda a,x .
    Bo raczej nie wydaje mi się, żeby miała być między nimi a instrukcją przerwa, czyli K1_ lda a,x . Ten "_" sugeruje raczej doczepienie, tym bardziej że oprócz tego istnieją mnemoniki typu: LDA_K2 (z domyślnie przypisanym prefixem).

    Z drugiej strony w innych 'dialektach' (choć wiem tylko o 8086) występują chyba częściej (wyłącznie?) prefixy oddzielone od wyprzedzanych instrukcji.

    Gdyby to zależało "od nas", to co byłoby lepsze, z punktu widzenia czytelności, czy nawet łatwości wpisywania kodu, czy też już jego obróbki przez jakiś asembler (zwykle pole dla instrukcji przewidziane jest wyłącznie dla jednego ciągu znaków - to na pewno ułatwia sprawę).

    Mogą istnieć też niezależnie dwie formy zapisu tego samego, ale to jeszcze bardziej komplikuje sytuację (od strony obsługi tego potem programem kompilującym, czyli asemblerem).
    Prefix jako: "K1 mne" (w formie nawet 'odstępczej', bo bez "_") i "K1_mne".

    Jest to świeża dla mnie sprawa, rzecz nieprzemyślana, ale od razu dziele się wątpliwościami (w sumie chodzi o rozpropagowanie wiedzy o istnieniu takich interesujących rozwiązań, jak te procesory).

    EDIT:
    Należy koniecznie doprecyzować (skorygować), że rozwiązanie "KimKlone" opiera się w całości na zwykłym 65C02, i żaden nowy procesor go nie zastępuje.

    To rodzaj przejęcia kontroli nad procesorem i aktywizacji działań w sytuacji odwołań do op-kodów, które przypisane są instrukcjom nieoficjalnym (w tym wypadku głównie nop'om).
    Procesor jest nadzorowany i mikrokod w elektronice (?) zapewnia pewne 'podmiany' w czasie rzeczywistym. Op-kody nie zmieniają swoich długości cykli wykonywania a są rozbudowane o zaprojektowane funkcje.
    (Zdaje się, że zdarza się nawet w jakimś wypadku 'podmiana' opcodu na inny przy wewnętrznej obsłudze kodu przez procesor.)
    Jakąś charakterystyką wydaje się być przystosowanie niektórych nowych instrukcji do działania z językiem Forth (z jego specyfiką wykonywania i stukturą kodu).
    Ogólnie procesor zyskuje bardzo na wydajności, ale jego rozbudowa w sensie nowych typów działań (instrukcji) nie jest specjalnie imponująca.
    Podobno jest nowy tryb "podwójnie" pośredni (coś jak ((z,x)),y ) dla jednej (lub dwóch) znanej już instrukcji.

    Jeśli chodzi o instrukcję w zapisie LDA_K2 to pisałem mało precyzyjnie o "domyślnie przypisanym prefixie". Chodzi o ten prefix, którego właśnie nie ma. Gdy nie ma prefixu, przyjmuje się, że kod realizuje się poprzez odwołania po K0 (selektor banku pamięci), ale w tym przypadku, odpowiedniego opcodu, zamiast tego robi to przez K2 (inny selektor, 1/4).

    Jeśli chodzi o prefixy, to już w 6309 one są, ale funkcjonują na "prawach" osobnych instrukcji w przyjętej stylistyce zapisu formalnego (osobny wiersz im się 'należy'). Poza tym, dla rozróżnienia instrukcji działających z tymi prefixami (i ich innej formy adresowania) wprowadzono osobne mnemoniki (analogia do K1_LDA). Jak rozumiem więc, nie ma tam potrzeby się posługiwać 'gołym' prefixem, a można (należy?) odpowiednim mnemonikiem interesującej instrukcji.
    (W zasadzie rzecz jeszcze nie zbadałem i nie wiem, jak to tam wygląda do końca.)
    • 27: CommentAuthormarok
    • CommentTime29 Apr 2023
     
    Odgrzebuję, bo się troszkę zawziąłem pokazać lepszy przykład wykorzystania krótkiej tablicy mnemoników i udało mi się finalnie przygotować demonstrację działającego deasemblera dla procesora 6502C. (Choć nie z taką myślą przystępowałem do obmyślania całej koncepcji dotyczącej takiej tablicy - nie chodziło o deasembler, ale ten jest prostszy do wykonania.)

    Działa w swej podstawowej funkcji bezbłędnie, mam nadzieję, bo w miarę solidnie sprawdzałem (choć zawsze można coś przeoczyć), tzn. 'rozkodowuje' zawartość bajtów na mnemoniki asemblera, wliczając w to rozkazy nielegalne.

    To jest wersja "demonstracyjna", bo tylko deasembluje to, co jest aktualnie w pamięci.

    (Zaczyna od bloku z rozpisanymi kolejno wszystkimi wartości bajta, a później przechodzi płynnie do "self"- deasemblacji.)


    Desasemblery to były i są jedne z najczęściej pisanych programów użytkowych, jest ich (a szczególnie było w historii, bo wiele z nich oczywiście mogło się nie zachować) z pewnością bez liku. Czasem (a może często) powstają jako jedne z pierwszych trochę bardziej złożonych programów początkujących koderów. W tym miejscu odwołam się także do swojego doświadczenia i wspomnę że sam taki kiedyś już zrobiłem (gdzieś w latach '95-'97), pewnie nie wszystko w nim działało do końca może prawidłowo (chociaż tego już nie pamiętam), ale w podstawowym zakresie zapewne wystarczająco dobrze (informacyjnie).

    Na pewno można napisać i znaleźć krótkszy deasembler niż ten (jednak ponad 1kb), także zdolny do bezwzględnie szybszego działania (ten może dość długo przetwarzać dane, bo w mniejszym stopniu opiera się na tablicach, a bardziej na "analizie" rozkazu; sama tytularna, "krótka" tablica mnemoników jest dość 'ciężka' w tym względzie).

    Ogólnie, określiłbym ten deasembler jako nieoczywiste podejście do tematu.