Autor Wątek: Analiza składni TOS  (Przeczytany 9135 razy)

aqqman

  • ***
  • Wiadomości: 171
  • Miejsce pobytu:
    Milky Way
Analiza składni TOS
« dnia: 2024.10.13, 12:20:23 »
W przypływie nostalgii zacząłem się bawić programowaniem i uświadomiłem sobie jak wiele rzeczy zapomniałem i nawet nie potrafię odróżnić tych zapomnianych od tych których nigdy nie wiedziałem.
Przeglądałem sobie ROM interfejsu FDD3000 i nie mogę rozgryźć tablicy składni. Kod instrukcji i separator "#FE" jest dla mnie jasny ale reszty nie mogę rozkminić. Proszę kolegów o podpowiedź.
026B    DB CFh, 0Eh, FEh, 02h, 17h, 07h  ;CF = CAT
        DB EFh, 1Ch, 06h, FEh, 0Ah, 39h, 0Ch ;EF = LOAD
        DB F8h, 1Ah, 06h, FEh, 0Ah, EEh, 09h ;F8 - SAVE
        DB D3h, 00h, 14h, 02h, 14h, 04h, 49h, 4Fh, 41h, 52h, 00h, 08h, 06h, FEh, 0Ah, E5h, 08h ;D3 - OPEN#
        DB D4h, 0Ch, 06h, FEh, 0Ah, D5h, 08h ;D4 - CLOSE#
        DB F5h, 04h, 23h, 00h, 00h, 0Ah, 06h, FEh, 0Ch, 48h, 07h ;F5 - PRINT
        DB EEh, 04h, 23h, 00h, 00h, 14h, 20h, FEh, 00h, 00h, 00h ;EE - INPUT
        DB F0h, 1Eh, FEh, 00h, 80h, 08h ;F0 - LIST
        DB E5h, 04h, 23h, 00h, 00h, 06h, FEh, 0Ch, 53h, 08h ;E5 - RESTORE
        DB D5h, 02h, 06h, FEh, 0Ah, A7h, 0Ch ;D5 - MERGE
        DB ECh, 02h, 16h, 06h, FEh, 0Ah, 44h, 08h ;EC - GOTO
        DB EDh, 0Eh, 18h, 06h, FEh, 0Ah, 34h, 08h ; ED - GOSUB
        DB FCh, 06h, FEh, 0Ch, 4Eh, 08h ; FC - DRAW
        DB D0h, 02h, 12h, 18h, 06h, FEh, 0Ah, 9Eh, 0Eh ;D0 - FORMAT
        DB D2h, 02h, 10h, 06h, FEh, 0Ah, BBh, 08h ;D2 - ERASE
        DB F1h, 02h, 04h, ACh, 00h, 02h, 06h, FEh, 08h, 69h, 09h ;F1 - LET
        DB D1h, 02h, 04h, ACh, 00h, 02h, 06h, FEh, 0Ah, 2Fh, 09h ;D1 - MOVE
        DB E9h, 02h, 06h, FEh, 06h, C6h, 08h ;E9 - DIM
        DB ABh, 02h, 04h, 50h, 55h, 56h, 49h, 00h, 06h, FEh, 04h, BAh, 0Eh ;AB - ATTR
        DB F3h, 0Eh, 06h, FEh, 08h, 5Eh, 08h ;F3 - NEXT (oryginalnie tu jest blad i jest FF zamiast F3)
        DB FFh
2 x TC2068 na sterydach:
- TC2160 - 160kBRAM
- TC2176 - 176kB RAM - 2xscreen, 2xROM
FDD3000

ArturM

  • ***
  • Wiadomości: 228
  • Miejsce pobytu:
    GZM
Odp: Analiza składni TOS
« Odpowiedź #1 dnia: 2024.10.13, 12:44:01 »
Też to próbowałem analizować i moje wnioski są takie:

;POCZATEK TABLICY ADRESÓW INTERPRETERA

        ORG     #00C5

ARR_2:  DEFW    243             ;243,0     adresy procedur
        DEFW    250             ;250,0     dla analizy poszczegolnych
        DEFW    279             ;23,1      komend TOS
        DEFW    329             ;73,1
        DEFW    335             ;79,1
        DEFW    377             ;121,1
        DEFW    433             ;177,1
        DEFW    446             ;190,1
        DEFW    458             ;202,1
        DEFW    510             ;254,1
        DEFW    535             ;32,2
        DEFW    492             ;236,1
        DEFW    499             ;243,1
        DEFW    2413            ;109,9
        DEFW    2984            ;168,11
        DEFW    2162            ;114,8
        DEFW    1956            ;164,7


;POCZATEK TABLICY ANALIZY INTERPRETERA

        ORG     #026b

TOSSYNTAX:
        DEFB    207             ;keyword CAT
        DEFB    14              ;
        DEFB    254             ;znacznik
        DEFB    2               ;offset w ARR_2
        DEFB    23              ;adres wykonawczy 1815
        DEFB    7               ;
                                ;------------------------------
        DEFB    239             ;keyword LOAD
        DEFB    28              ;
        DEFB    6               ;koniec analizy
        DEFB    254             ;znacznik
        DEFB    10              ;offset w ARR_2
        DEFB    57              ;adres wykonawczy  3129
        DEFB    12              ;
                                ;------------------------------
        DEFB    248             ;keyword SAVE
        DEFB    26              ;
        DEFB    6               ;koniec analizy
        DEFB    254             ;znacznik
        DEFB    10              ;offset w ARR_2
        DEFB    238             ;adres wykonawczy  2542
        DEFB    9               ;
                                ;------------------------------
        DEFB    211             ;keyword OPEN #
        DEFB    0               ;
        DEFB    20              ;
        DEFB    2               ;
        DEFB    20              ;
        DEFB    4               ;musi wystąpić:
        DEFB    73              ;znak I (tylko zapis)
        DEFB    79              ;znak O (tylko odczyt)
        DEFB    65              ;znak A (dodaj na koncu)
        DEFB    82              ;znak R (dostep dowolny)
        DEFB    0               ;
        DEFB    8               ;
        DEFB    6               ;koniec analizy
        DEFB    254             ;znacznik
        DEFB    10              ;offset w ARR_2
        DEFB    229             ;adres wykonawczy  2277
        DEFB    8               ;
                                ;------------------------------
        DEFB    212             ;keyword CLOSE #
        DEFB    12              ;
        DEFB    6               ;koniec analizy
        DEFB    254             ;znacznik
        DEFB    10              ;offset w ARR_2
        DEFB    213             ;adres wykonawczy  2261
        DEFB    8               ;
                                ;------------------------------
        DEFB    245             ;keyword PRINT
        DEFB    4               ;musi wystąpić:
        DEFB    35              ;znak #
        DEFB    0               ;
        DEFB    0               ;
        DEFB    10              ;
        DEFB    6               ;koniec analizy
        DEFB    254             ;znacznik
        DEFB    12              ;offset w ARR_2
        DEFB    72              ;adres wykonawczy  1864
        DEFB    7               ;
                                ;------------------------------
        DEFB    238             ;keyword INPUT
        DEFB    4               ;musi wystąpić:
        DEFB    35              ;znak #
        DEFB    0               ;
        DEFB    0               ;
        DEFB    20              ;
        DEFB    32              ;
        DEFB    254             ;znacznik
        DEFB    0               ;offset w ARR_2
        DEFB    0               ;adres wykonawczy 0?
        DEFB    0               ;Hmmm... nie pasuje ten adres.
                                ;------------------------------
        DEFB    240             ;keyword LIST
        DEFB    30              ;
        DEFB    254             ;znacznik
        DEFB    0               ;offset w ARR_2
        DEFB    128             ;adres wykonawczy  2176
        DEFB    8               ;
                                ;------------------------------
        DEFB    229             ;keyword RESTORE
        DEFB    4               ;musi wystąpić:
        DEFB    35              ;znak #
        DEFB    0               ;
        DEFB    0               ;
        DEFB    6               ;koniec analizy
        DEFB    254             ;znacznik
        DEFB    12              ;offset w ARR_2
        DEFB    83              ;adres  wykonawczy 2131
        DEFB    8               ;
                                ;------------------------------
        DEFB    213             ;keyword MERGE
        DEFB    2               ;
        DEFB    6               ;koniec analizy
        DEFB    254             ;znacznik
        DEFB    10              ;offset w ARR_2
        DEFB    167             ;adres  wykonawczy 3239
        DEFB    12              ;
                                ;------------------------------
        DEFB    236             ;keyword GOTO
        DEFB    2               ;
        DEFB    22              ;
        DEFB    6               ;koniec analizy
        DEFB    254             ;znacznik
        DEFB    10              ;offset w ARR_2
        DEFB    68              ;adres  wykonawczy 2116
        DEFB    8               ;
                                ;------------------------------
        DEFB    237             ;keyword GOSUB
        DEFB    14              ;
        DEFB    24              ;
        DEFB    6               ;koniec analizy
        DEFB    254             ;znacznik
        DEFB    10              ;offset w ARR_2
        DEFB    52              ;adres  wykonawczy 2100
        DEFB    8               ;
                                ;------------------------------
        DEFB    252             ;keyword DRAW
        DEFB    6               ;koniec analizy
        DEFB    254             ;znacznik
        DEFB    12              ;offset w ARR_2
        DEFB    78              ;adres  wykonawczy 2126
        DEFB    8               ;
                                ;------------------------------
        DEFB    208             ;keyword FORMAT
        DEFB    2               ;
        DEFB    18              ;
        DEFB    24              ;
        DEFB    6               ;koniec analizy
        DEFB    254             ;znacznik
        DEFB    10              ;offset w ARR_2
        DEFB    158             ;adres  wykonawczy 3742
        DEFB    14              ;
                                ;------------------------------
        DEFB    210             ;keyword ERASE
        DEFB    2               ;
        DEFB    16              ;
        DEFB    6               ;koniec analizy
        DEFB    254             ;znacznik
        DEFB    10              ;offset w ARR_2
        DEFB    187             ;adres  wykonawczy 2235
        DEFB    8               ;
                                ;------------------------------
        DEFB    241             ;keyword LET
        DEFB    2               ;
        DEFB    4               ;musi wystąpić:
        DEFB    172             ;keyword AT?
        DEFB    0               ;
        DEFB    2               ;
        DEFB    6               ;koniec analizy
        DEFB    254             ;znacznik
        DEFB    8               ;offset w ARR_2
        DEFB    105             ;adres  wykonawczy 2409
        DEFB    9               ;
                                ;------------------------------
        DEFB    209             ;keyword MOVE
        DEFB    2               ;
        DEFB    4               ;musi wystąpić:
        DEFB    172             ;keyword AT?
        DEFB    0               ;
        DEFB    2               ;
        DEFB    6               ;koniec analizy
        DEFB    254             ;znacznik
        DEFB    10              ;offset w ARR_2
        DEFB    47              ;adres  wykonawczy 2351
        DEFB    9               ;
                                ;------------------------------
        DEFB    233             ;keyword DIM
        DEFB    2               ;
        DEFB    6               ;koniec analizy
        DEFB    254             ;znacznik
        DEFB    6               ;offset w ARR_2
        DEFB    198             ;adres  wykonawczy 2246
        DEFB    8               ;
                                ;------------------------------
        DEFB    171             ;keyword ATTR
        DEFB    2               ;
        DEFB    4               ;musi wystąpić:
        DEFB    80              ;znak P (zabezpieczony)
        DEFB    85              ;znak U (odbezpieczony)
        DEFB    86              ;znak V (widoczny)
        DEFB    73              ;znak I (niewidoczny)
        DEFB    0               ;
        DEFB    6               ;koniec analizy
        DEFB    254             ;znacznik
        DEFB    4               ;offset w ARR_2
        DEFB    186             ;adres  wykonawczy 3770
        DEFB    14              ;
                                ;------------------------------
        DEFB    243             ;keyword NEXT (blad w ROM!m było 255)
        DEFB    14              ;
        DEFB    6               ;koniec analizy
        DEFB    254             ;znacznik
        DEFB    8               ;offset w ARR_2
        DEFB    94              ;adres  wykonawczy 2142
        DEFB    8               ;
                                ;------------------------------
        DEFB    255             ;znacznik końca tabeli
;KONIEC TABLICY

I tak myślę, że dane w obu tabelach są częściowo zgodne z podobną tabelą analizy składni ZX BASIC w ROM ZX Spectrum.
Można ją znaleźć w dokumencie "The Complete Spectrum ROM Disassembly" w rozdziale "Assmembly BASIC line and command interpretation".
« Ostatnia zmiana: 2024.10.13, 13:04:09 wysłana przez ArturM »
ZX 48 | HQ 48 SMD | Sizif-512 | FDD3000 | SFDD3500 | M-397 Multiinterface | DivMMC AY - KiCad user | PCB Designer

trojacek

  • *****
  • Wiadomości: 6964
  • Miejsce pobytu:
    Warszawa
Odp: Analiza składni TOS
« Odpowiedź #2 dnia: 2024.10.13, 12:53:22 »
@ArturM, jakiś dziwny ten ROM masz.
Sprawdziłem kilka wersji, które mam na dysku, i #0035 jest zawsze w środku procedury wydruku:

; print a char
0031 3e0d      ld      a,0dh ; newline
0033 cd1d03    call    031dh
0036 1000      defw    0010h ; RST 16
0038 c9        ret     

ArturM

  • ***
  • Wiadomości: 228
  • Miejsce pobytu:
    GZM
Odp: Analiza składni TOS
« Odpowiedź #3 dnia: 2024.10.13, 13:04:39 »
Literówka, miało być #00C5  :-[
ZX 48 | HQ 48 SMD | Sizif-512 | FDD3000 | SFDD3500 | M-397 Multiinterface | DivMMC AY - KiCad user | PCB Designer

trojacek

  • *****
  • Wiadomości: 6964
  • Miejsce pobytu:
    Warszawa
Odp: Analiza składni TOS
« Odpowiedź #4 dnia: 2024.10.13, 13:10:28 »
O, to faktycznie jest tam tablica skoków:

;TOS commands analyze jump table
00c5 ea00      defw    00eah
00c7 fa00      defw    00fah
00c9 1701      defw    0117h
00cb 4901      defw    0149h
00cd 4f01      defw    014fh
00cf 7901      defw    0179h
00d1 b101      defw    01b1h
00d3 be01      defw    01beh
00d5 ca01      defw    01cah
00d7 fe01      defw    01feh
00d9 1702      defw    0217h
00db ec01      defw    01ech
00dd f301      defw    01f3h
00df 6d09      defw    096dh
00e1 a80b      defw    0ba8h
00e3 7208      defw    0872h
00e5 a407      defw    07a4h

Tak więc masz w pełni rację, że są dwie tablice - jedna odpowiada za składnię, a druga to adresy procedur obsługi.

aqqman

  • ***
  • Wiadomości: 171
  • Miejsce pobytu:
    Milky Way
Odp: Analiza składni TOS
« Odpowiedź #5 dnia: 2024.10.13, 13:37:13 »
Wielkie Dzięki.
ArturM - właśnie mnie te liczby interesują przy których nie masz opisu tj. zaraz po kodzie polecenia i przed następnym....14...8....2 no i ten zerowy adres od INPUT.

A tak opisowo, to sobie kombinuje czy łatwiej będzie nad tym romem popracować czy napisać od zera - chodzi mi o podpięcie Arduino z czytnikiem SD i biblioteką fatfs żeby to na modłę TOSu obsługiwać. Nie chcę emulować nibble jak to interface robi tylko podmienić procedury przesyłu na 8-bit. hardware już mam - ot taki jesienno zimowy projekt 'na drutach'.
2 x TC2068 na sterydach:
- TC2160 - 160kBRAM
- TC2176 - 176kB RAM - 2xscreen, 2xROM
FDD3000

trojacek

  • *****
  • Wiadomości: 6964
  • Miejsce pobytu:
    Warszawa
Odp: Analiza składni TOS
« Odpowiedź #6 dnia: 2024.10.13, 15:31:55 »
Wielkie Dzięki.
ArturM - właśnie mnie te liczby interesują przy których nie masz opisu

Z tego co widzę, to bajty pomiędzy kodem komendy a znacznikiem FEh to offsety do tej tablicy adresów, której jedynym celem jest zinterpretowanie argumentów. Tak więc każda komenda może mieć inną ich liczbę (i poszczególne typy).
Na przykład dla CAT pobierany jest tylko jeden argument (string), a dla OPEN jest ich długa lista.
Pierwszy bajt po FEh to liczba słów, które należy zdjąć ze stosu, bo analizator parametrów zostawia na nim śmieci :D
Potem jest faktycznie adres obsługi, ale dla INPUT robiony jest jakoś wyjątek.

aqqman

  • ***
  • Wiadomości: 171
  • Miejsce pobytu:
    Milky Way
Odp: Analiza składni TOS
« Odpowiedź #7 dnia: 2024.10.13, 15:40:06 »
Nie rozumiem.
   DEFB    207             ;keyword CAT
        DEFB    14              ;
        DEFB    254             ;znacznik
        DEFB    2               ;offset w ARR_2
        DEFB    23              ;adres wykonawczy 1815
        DEFB    7               ;
                                ;------------------------------
        DEFB    239             ;keyword LOAD
        DEFB    28              ;
        DEFB    6               ;koniec analizy
        DEFB    254             ;znacznik
        DEFB    10              ;offset w ARR_2
        DEFB    57              ;adres wykonawczy  3129
        DEFB    12              ;
Czym jest '14' po CAT? '28' po LOAD, bo offsety mam po znaczniku 254 (#FE)
Myślałem że to typ argumentu ale to ma się nijak bo patrząc tam gdzie miałyby być 'stringi' w tych komendach są różne kody .
Reasumując -  pomiędzy #FE a kodem następnej instrukcji  - to juz wiem.
Próbuję zrozumieć to co jest pomiędzy kodem instrukcji a znacznikiem #FE
2 x TC2068 na sterydach:
- TC2160 - 160kBRAM
- TC2176 - 176kB RAM - 2xscreen, 2xROM
FDD3000

trojacek

  • *****
  • Wiadomości: 6964
  • Miejsce pobytu:
    Warszawa
Odp: Analiza składni TOS
« Odpowiedź #8 dnia: 2024.10.13, 16:14:04 »
To trzeba by przeanalizować wszystkie procedury z tabelki pod 00C5h :)

Pętla "rozbierająca" znajduje się pod 008Ch:
008c 13        inc     de ; interpret next code in line
008d ed535d5c  ld      (5c5dh),de ; CH_ADD
0091 23        inc     hl ; next byte in array of TOS tokens
0092 e5        push    hl
0093 cd1d03    call    031dh
0096 2000      defw    0020h ; ZX BASIC: COLLECT NEXT CHARACTER
0098 e1        pop     hl
0099 11c500    ld      de,00c5h ; array of TOS command routines
009c 7e        ld      a,(hl) ; get offset code
009d fefe      cp      0feh ; end of offset list
009f 2817      jr      z,00b8h ; !!! continue execution !!!
00a1 83        add     a,e
00a2 5f        ld      e,a ; DE + A
00a3 3001      jr      nc,00a6h
00a5 14        inc     d ; corr. for CY
00a6 e5        push    hl ; stack: array of TOS tokens
00a7 21b400    ld      hl,00b4h
00aa e5        push    hl ; stack: 1 + 00b4 (loop address)
00ab eb        ex      de,hl ; after: hl = array of TOS tokens + A, de = 00b4
00ac 5e        ld      e,(hl)
00ad 23        inc     hl
00ae 56        ld      d,(hl) ; de = address from (array of TOS tokens + A)
00af d5        push    de ; stack: 2 + address from (array of TOS tokens + A)
00b0 2a5d5c    ld      hl,(5c5dh) ; CH_ADD
00b3 c9        ret ; JP to array of TOS tokens + A
;
00b4 e1        pop     hl ; array of TOS tokens
00b5 23        inc     hl ; inc to next offset code or FEh
00b6 18e1      jr      0099h ; loop on

Następnie wykonywany jest następujący kod:
00b8 cd3e03    call    033eh
00bb 23        inc     hl
00bc 5e        ld      e,(hl)
00bd 23        inc     hl
00be 56        ld      d,(hl)
00bf eb        ex      de,hl
00c0 11dc06    ld      de,06dch ; return address
00c3 d5        push    de
00c4 e9        jp      (hl)

Jednak najpierw wołana jest procedura pod 033Eh, która m.in. pobiera pierwszy parametr po FEh i porządkuje stos:
033e 23        inc     hl ; code after FEh
033f 223f21    ld      (213fh),hl ; preserve hl
0342 7e        ld      a,(hl) ; byte after FEh
0343 b7        or      a
0344 2806      jr      z,034ch ; nothing to remove / only for INPUT
0346 47        ld      b,a ; loop n times
0347 e1        pop     hl ; preserve last return address
0348 33        inc     sp ; remove return address
0349 10fd      djnz    0348h
034b e5        push    hl ; restore last return address
034c 2a5d5c    ld      hl,(5c5dh) ; CH_ADD
034f 7e        ld      a,(hl) ; next char in buffer
0350 cd6502    call    0265h ; checking for end of command (CR or ":")
0353 c26a04    jp      nz,046ah
0356 2a3f21    ld      hl,(213fh) ; end of command -> restore hl
0359 cd6306    call    0663h ; test bit 7,(iy+01h)
035c c0        ret     nz
035d 21f41b    ld      hl,1bf4h ; ZX-ROM: STMT-NEXT (next command or error after ":")
0360 e3        ex      (sp),hl
0361 c30306    jp      0603h ; exit TOS ROM

Czym jest '14' po CAT?

Wywołaniem kodu o adresie spod komórek (00C5h + 0Eh) => 01BEh. To początek analizatora składni, wykrywającego najpierw argument pusty (koniec komendy), a następnie sprawdzający znaki specjalne: "$" dla zmiennej i cudzysłów dla stałej. Tego już mi się nie chciało analizować, prawdę mówiąc :)


« Ostatnia zmiana: 2024.10.13, 16:21:20 wysłana przez trojacek »

steev

  • *****
  • Wiadomości: 1409
  • Miejsce pobytu:
    inode 42
Odp: Analiza składni TOS
« Odpowiedź #9 dnia: 2024.10.13, 16:14:36 »
*chyba* jest to offset do tabeli pod adresem $00c5
Przeanalizuj sobie procedurę startującą od $0039
Machines should work. People should think.

aqqman

  • ***
  • Wiadomości: 171
  • Miejsce pobytu:
    Milky Way
Odp: Analiza składni TOS
« Odpowiedź #10 dnia: 2024.10.13, 16:21:46 »
@trojacek
te komentarze w kodzie to teraz napisałeś czy masz to opisane w jakimś magicznym listingu?
czyli te numery to wywołania kolejnych iteracji analizatora składni w różnych adresach wejściowych...
2 x TC2068 na sterydach:
- TC2160 - 160kBRAM
- TC2176 - 176kB RAM - 2xscreen, 2xROM
FDD3000

trojacek

  • *****
  • Wiadomości: 6964
  • Miejsce pobytu:
    Warszawa
Odp: Analiza składni TOS
« Odpowiedź #11 dnia: 2024.10.13, 16:24:41 »
Dodaję je na bieżąco :)
Niektóre mam jakoś z dawniejszych czasów, ale są bardzo nieliczne.

aqqman

  • ***
  • Wiadomości: 171
  • Miejsce pobytu:
    Milky Way
Odp: Analiza składni TOS
« Odpowiedź #12 dnia: 2024.10.13, 16:26:55 »
Okej, super, dzięki za pomoc.

Dla przejrzystości, przykładowo:
DEFB    239             ;keyword LOAD
        DEFB    28 (#1C)             ;
        DEFB    6   (#06)            ;koniec analizy
        DEFB    254 (#FE)            ;znacznik
        DEFB    10              ;offset w ARR_2
        DEFB    57              ;adres wykonawczy  3129
        DEFB    12              ;
oznacza
JP (#5C + #1C)
następny nie jest #FE więc kolejne przejście i tu:
JP (#5C + #06)
« Ostatnia zmiana: 2024.10.13, 16:38:49 wysłana przez aqqman »
2 x TC2068 na sterydach:
- TC2160 - 160kBRAM
- TC2176 - 176kB RAM - 2xscreen, 2xROM
FDD3000

trojacek

  • *****
  • Wiadomości: 6964
  • Miejsce pobytu:
    Warszawa
Odp: Analiza składni TOS
« Odpowiedź #13 dnia: 2024.10.13, 17:11:45 »

        DEFB    254 (#FE)            ;znacznik
        DEFB    10              ;offset w ARR_2

Hmm, nie wygląda mi na to.
Po FEh jest liczba słów do zdjęcia ze stosu (instrukcją inc sp). Wrzucałem stosowny fragment kodu:

033e 23        inc     hl ; code after FEh
033f 223f21    ld      (213fh),hl ; preserve hl
0342 7e        ld      a,(hl) ; byte after FEh
0343 b7        or      a
0344 2806      jr      z,034ch ; nothing to remove / only for INPUT
0346 47        ld      b,a ; loop n times
0347 e1        pop     hl ; preserve last return address
0348 33        inc     sp ; remove return address
0349 10fd      djnz    0348h
034b e5        push    hl ; restore last return address
034c 2a5d5c    ld      hl,(5c5dh) ; CH_ADD


Cytuj
JP (#5C + #1C)
następny nie jest #FE więc kolejne przejście i tu:
JP (#5C + #06)

Tak. Przy czym 06h prowadzi do kodu pod adresem 0149h, który jedynie "waliduje" analizę ustawiając bit 1 w zmiennej 213Ah:

#213A
Znaczniki stanu systemu; ustawienie odpowiedniego bitu oznacza:
0-system wykona rozkaz RET przy RST 8,
1-analizowane polecenie jest poprawne,
2-analiza składni,
3-podano długość rekordu,
5-pobieranie liczb ze stosu
« Ostatnia zmiana: 2024.10.13, 20:47:20 wysłana przez trojacek »

trojacek

  • *****
  • Wiadomości: 6964
  • Miejsce pobytu:
    Warszawa
Odp: Analiza składni TOS
« Odpowiedź #14 dnia: 2024.10.13, 20:54:58 »
Próbuję zrozumieć to co jest pomiędzy kodem instrukcji a znacznikiem #FE

Zacząłem to powolutku analizować.
Moje dotychczasowe wnioski, które będę sukcesywnie uzupełniał:

;TOS commands analyze jump table
00c5h
+00h defw    00eah ; get INT
+02h defw    00fah ; get STRING
+04h defw    0117h ; get given required char(s) + 00h
+06h defw    0149h ; 'validate' syntax
+08h defw    014fh ; expect ';' and get INT
+0ah defw    0179h ; expect ';' and get STRING and ';' and INT
+0ch defw    01b1h ; get optional INT (default if empty)
+0eh defw    01beh ; get optional STRING (default if empty)
+10h defw    01cah ; get optional 'N' parameter
+12h defw    01feh ; get "TO" + string
+14h defw    0217h ; expect ';'
+16h defw    01ech ; get optional 'D' parameter (GOTO)
+18h defw    01f3h ; get optional 'D' parameter (FORMAT)
+1ah defw    096dh ; SAVE* LINE/CODE/SCREEN$/DATA INT, INT
+1ch defw    0ba8h ; LOAD* LINE/CODE/SCREEN$/DATA INT
+1eh defw    0872h ; LIST* with optional # INT
+20h defw    07a4h ; get VAR$ with optional AT INT

Przykład interpretacji dla OPEN #:

DB D3h, 00h, 14h, 02h, 14h, 04h, 49h, 4Fh, 41h, 52h, 00h, 08h, 06h, FEh, 0Ah, E5h, 08h

OPEN #* 4; "NAZWA"; I; 2048

(spacje dodałem dla czytelności).

D3h - OPEN #
00h - integer (kanał)
14h - ";"
02h - string (nazwa)
14h - ";"
04h - oczekiwany znak:
49h, 4Fh, 41h, 52h - I, O, A, R
00h - terminator listy
08h - oczekiwany ";" i potem integer (długość rekordu)
06h - walidacja
FEh - znacznik końca
« Ostatnia zmiana: 2024.10.13, 21:58:38 wysłana przez trojacek »