51

Próbowałem użyć struktur w madsie. Pierwszy problem na jaki się natknąłem, a jaki chciałbym zgłosić, to niedostateczna diagnostyka błędów. Użyłem wewnątrz zamiast deklaracji .byte deklaracji .by, bo myślałem że są zamienne tak jak poza strukturą i mads nawet się nie zająknął, a zignorował pole z .by.
Drugi problem, że jeżeli nie poda się nazwy pola, to takie pole zostanie zignorowane. Również bez błędu ani ostrzeżenia. Niby problem z czapy, ale nie do końca, bo akurat definiowałem sobie strukturę odzwierciedlającą istniejącą strukturę, tylko kilku pól nie używałem, więc nie nadałem im nazwy. I po dość długim debugowaniu odkryłem, że offsety mi się poprzesuwały, bo mads ignorował pola bez nazwy.
Przykładowy kod obrazujący problemy:

    org $2000
    
.struct IgnoredKeyword
dontWork .by    ;ignored keyword here
works    .byte  ;as a result this have index 0
.ends

    lda #IgnoredKeyword.works
    ;ldy #IgnoredKeyword.dontWork ;test.asm (9) ERROR: Value out of range
    
.struct MissingLabel
    .byte    ;no label here
label   .byte    ;as a result this have index 0
.ends

    lda #MissingLabel.label

Produkuje taki listing:

mads 2.0.7
Source: test.asm
     1                     org $2000
     2                     
     3                 .struct IgnoredKeyword
     4                 dontWork .by    ;ignored keyword here
     5 = 0000            works    .byte  ;as a result this have index 0
     6                 .ends
     7
     8 FFFF> 2000-2003> A9 00        lda #IgnoredKeyword.works
     9                     ;ldy #IgnoredKeyword.dontWork ;test.asm (9) ERROR: Value out of range
    10                     
    11                 .struct MissingLabel
    .byte    ;no label here
    13 = 0000            label   .byte    ;as a result this have index 0
    14                 .ends
    15
    16 2002 A9 00            lda #MissingLabel.label

52

innymi słowy nie czytałeś instrukcji, cyt.:

"Pola struktury definiujemy przez podanie nazwy i typu pola (.BYTE, .WORD, .LONG, .DWORD)."

*- TeBe/Madteam
3x Atari 130XE, SDX, CPU 65816, 2x VBXE, 2x IDE Plus rev. C

53

W publikacji Atari Basic też jest napisane jak należy używać instrukcji INPUT, a mimo to można użyć jej niewłaściwie. Interpreter zwróci błąd i wydawało mi się do dziś dzień, że to normalne jest.... ;)

Kontakt: pin@usdk.pl

54

A to to ja wiem, że zrobiłem bład, zgłaszam tylko, że mads ten kod zaakceptował jako poprawny.

55

ok :) "niedostateczna diagnostyka błędów"

*- TeBe/Madteam
3x Atari 130XE, SDX, CPU 65816, 2x VBXE, 2x IDE Plus rev. C

56

   434
   435 A01C            backgroundCharsSrc .wo
   436 A01C 00 00        backgroundScrollDiff .wo 0
   437

Chyba za bardzo ufam, że mads zgłosi błąd przy niepoprawnym kodzie. I kosztuje mnie to wiele godzin szukania nie tam gdzie trzeba :(

57 Ostatnio edytowany przez tebe (2018-10-25 12:03:09)

po poprawkach dla .BY, .WO, .HE, .SB, .CB, .FL

Post's attachments

mads_25-10-2018.zip 196.98 kb, liczba pobrań: 4 (od 2018-10-25) 

Tylko zalogowani mogą pobierać załączniki.
*- TeBe/Madteam
3x Atari 130XE, SDX, CPU 65816, 2x VBXE, 2x IDE Plus rev. C

58

No i o to chodziło. Żeby maszyna pomagała, jak człowiek zrobi jakąś wierutną głupotę, bo nie wiem jak inni, ale ja nieomylny nie jestem. Dziękować!

59

Następny ficzer użyty i następny błąd znaleziony :)

    .segdef seg $4000 $4000 R bank 

    .segment seg
l    nop
    .endseg
    
bank = $15

generuje mi błąd:

mads.exe test.asm
l       nop
test.asm (5) ERROR: Label L declared twice (BANK=21)

Eksperymentując odkryłem, że można go obejść na dwa sposoby: ustawiając numer banku w .segdef jako liczbę, albo definiując etykietę bank przed .segdef

Te obejścia są bezproblemowe, więc to nic pilnego, ale zgłaszam, bo to nie jest zachowanie, którego bym się spodziewał.

Przy okazji odkryłem, że kuleje trochę ustalanie, czy segment ma być read-only. Taki kod:

bank = $15

    .segdef seg $4000 $4000 R bank 

    .segment seg
v    equ $80

l    sta v
    .endseg

Generuje mi ostrzeżenie

test.asm (9) WARNING: Label V is only for READ

a listing ma w tym miejscu taki wpis:

     7 = 15,0080        v    equ $80

Nie znam wnętrzności madsa, ale widać, że definiowanie etykiet wewnątrz segmentu o wartościach spoza segmentu jest problematyczne. Prawdę mówiąc przypisanie tej etykiety do banku $15 też nie jest czymś, co bym się spodziewał i chyba tu tkwi problem i może rozwiązaniem byłoby, żeby do banku segmentu zaliczać tylko te adresy, które się w tym segmencie zawierają.

60 Ostatnio edytowany przez zbyti (2020-12-13 14:32:37)

WIP

Polska dokumentacja MADS

http://zbyti.great-site.net/mads-docs/

nie skończyłem (składnia) bo spis treści  przestał się w którymś momencie trzymać nazw paragrafów i nie chciałem namieszać.

TeBe ma fork wiec jak ktoś chce może zgłaszać mu issue albo PR, mam nadzieję, że TeBe dokończy.

Docelowo wszystkie 4 dokumentacje (2 x PL - MP/MADS, 2 x EN - MP/MADS) powinny wylądować na serwerach TeBe albo na github.io.

-------

wpis tutaj bo nieposiadanie nowoczesnej dokumentacji to błąd w dzisiejszych czasach ;)

-------

link nie aktualny na wskutek zmiany właściciela repozytorium

61

Piękna dokumentacja, choć po sekcji "Składnia" widzę że jeszcze sporo pracy jest do zrobienia. Dzięki @zbyti! Zacna inicjatywa.

hex, code and ror'n'rol
niewiedza buduje, wiedza rujnuje

62 Ostatnio edytowany przez zbyti (2020-12-12 17:59:14)

@mono wbrew pozorom to objętościowo tesktu nie zostało dużo do uzupełnienia (1,5h pracy) najbardziej pracochłonne fragmenty już są. Gdybym rozróżniał na 100% co jest czym to bym skończył a że nie rozróżniam to albo tebe skończy albo jakaś dobra dusza co się na tym zna ;)

63 Ostatnio edytowany przez zbyti (2020-12-12 18:00:51)

@mono gdybyś chciał mi na zoom powiedzieć odkąd (a raczej) dokąd dany fragmant matchuje się ze spisem to dziś była by skończona - bo dorwać tebe na tyle długo by z nim to zrobić wydaje mi się niemożliwością.

64

@mono by Cię nie przestraszyć to potrzebny był byś mi góra na 15 min :] ja mam czas do jutra z dokuemtacją, od jutra się tym nie będę zajmował. Jakby coś PM mnie na AA.

65

mads wyprzedza dokumentacje zwlaszcza w tym zakresie: "Dostępne nielegalne rozkazy 6502"

http://atari.pl/hsc/ad.php?i=1.

66

niestety mogę bazować tylko na tym co jest spisane  i dostarczane z MADS, nie mam czasu (ani pewnie wiedzy) śledzić źródeł mads.

67

@xxl no to jak wiesz o jakie MADS wyprzedza to daj PR do repo https://github.com/zbyti/mad-assembler-mkdocs

68 Ostatnio edytowany przez zbyti (2020-12-13 14:31:57)

repozytorium zmieniło właściciela, zainteresowani pomocą mogą zgłaszać PR lub issue do https://github.com/tebe6502/mad-assembler-mkdocs

69

    16 7FA1 56 34 12                dta     e ($123456)
    17 7FA4 56 34 12 00            dta     f ($123456)
    18 7FA8 00                    dta     g ($123456)

e   long data (24-bit)
f   doubleword data (32-bit)
g   doubleword data (32-bit) in reversed byte order (big-endian)

Potrzebuje uzyc dta g i Mads generuje mi tylko jeden bajt
Sciagnalem najnowsza wersje Madsa na wszelki wypadek i to samo.

70

Eagle napisał/a:
    16 7FA1 56 34 12                dta     e ($123456)
    17 7FA4 56 34 12 00            dta     f ($123456)
    18 7FA8 00                    dta     g ($123456)

e   long data (24-bit)
f   doubleword data (32-bit)
g   doubleword data (32-bit) in reversed byte order (big-endian)

Potrzebuje uzyc dta g i Mads generuje mi tylko jeden bajt
Sciagnalem najnowsza wersje Madsa na wszelki wypadek i to samo.

w ostatniej wersji dokumentacji jest:
   b   wartość typu BYTE
   a   wartość typu WORD
   v   wartość typu WORD, relokowalna
   l   młodszy bajt wartości (BYTE)
   h   starszy bajt wartości (BYTE)
   m   najstarszy bajt wartości LONG (24bit)
   g   najstarszy bajt wartości DWORD (32bit)     
   t   wartość typu LONG (24bit)
   e   wartość typu LONG (24bit)
   f   wartość typu DWORD (32bit)
   r   wartość typu DWORD w odróconej kolejności (32 bit)
...

@swinkamor12: Amiga tak zresztą jak ST jest 32 bitowa bo procesor jest 32 bitowy, int w C jest 32 bitowy, a to po ilu bitach się komunikuje z resztą jest nieistotne.

71

@ajcek Dzieki
DTA r  dziala prawidlowo

72

Hej,

Dając dwa .rept do jednego okalającego - drugie z nich po prostu wykonuje poprzednie jeszcze raz. Trochę się nakląłem budując dlist :)

mads 2.1.3
Source: f.asm
     1                     opt h-
     2                     org 0
     3                 .rept 1
     4                 .REPT 2
     5                     DTA #
     6                 .ENDR
     7                 .REPT 0
     8                     TUTAJ MOZE BYC COKOLWIEK BO I TAK PONOWI REPT WYZEJ
     9                 .ENDR
    10                 .ENDR
    10                 .endr
Source: REPT
    10                 .endr
Source: REPT
     5 0000 00                DTA #
     5 0001 01                DTA #
Source: f.asm
     5                 .endr
Source: REPT
     5 0002 00                DTA #
     5 0003 01                DTA #
Source: f.asm
Source: f.asm
    11

73

A można robić pętle w pętli, bo mi się wydaje ,że nie. Nie da się później odróżnić liczników.

74 Ostatnio edytowany przez Yosh/ng (2021-07-17 18:53:18)

Ja tam używam nagminnie :)

mads 2.1.3
Source: f.asm
     1                     opt h-
     2                     org 0
     3                 .rept 2
     4                 ?Y = #*$10
     5                 .REPT 2
     6                     DTA ?Y + #
     7                 .ENDR
     8                 .ENDR
     8                 .endr
Source: REPT
     4 = 0000            ?Y = #*$10
     4                 .endr
Source: REPT
     6 0000 00                DTA ?Y + #
     6 0001 01                DTA ?Y + #
Source: f.asm
     4 = 0010            ?Y = #*$10
     4                 .endr
Source: REPT
     6 0002 10                DTA ?Y + #
     6 0003 11                DTA ?Y + #
Source: f.asm
Source: f.asm
     9

75 Ostatnio edytowany przez mono (2021-12-08 20:54:36)

Po wielu (8) latach eksperymentów i dociekań udało się jednak rozwiązać poniższy problem:

mono napisał/a:

W programach relokowalnych dla SDX potrzeba czasem znać indeks bloku (w pliku), w którym znajduje się obiekt (procedura, dane).
Czy w związku z tym można by mieć...

Okazało się że cierpliwość popłaca i da się uzyskać numer bloku ze sparcianego pliku w ten-że oto sposób:

  ...
  blk reloc main
label:
  nop
  ...
  lda EXTENDED+3+[=label]
  jsr JEXT_ON
  ...

o. A znalazłem to w dokumentacji do MADS-a przy opisie "Virtual memory banks" (ciekawe, nieprawdaż). Dziękuję.

Edit: To tak na wypadek gdyby ktoś miał 8 lat szukać rozwiązania problemu, który już dawno jest rozwiązany, i w międzyczasie na piechotę drapał się prawą ręką w lewe ucho.

hex, code and ror'n'rol
niewiedza buduje, wiedza rujnuje