76

Odp: Mads Assembler

bloki co $400 bajtów

 opt h+
 org $4000

 .pages $40

  .align $400

  kod.............

 .align $400

  kod .............

 ...
 ...
 ...

 .endpg

własny nagłówek $ffff,start,end-1+3   (3 bajty napisu 'XXL'), można dać dowolne informacje, należy prawidłowo podać nagłówek w stylu Atari DOS jeśli ma być to ładowane przez Atari DOS, jeśli mamy własny loader możemy postąpić wg uznania

    opt h-
    org $4000

.local    block0
    org [a($ffff, block0, block0+.len(block0)-1+3), c'XXL'],*
    
    lda #0
.endl

    org $4400

.local    block1
    org [a($ffff, block1, block1+.len(block1)-1+3), c'XXL'],*

    nop

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

77

Odp: Mads Assembler

znalazlem na forum cos takiego:
http://www.atari.org.pl/forum/viewtopic … 924#p25924

wlasnie o cos podobnego mi chodzi, przelacznik (?OPT?) zeby asembler sam generowal kod w blokach o zadanej dlugosci.


drugi problem (przed takim blokiem wstawial automatycznie wczesniej zdefiniowany z parametrem...) nie wiem jak opisac wiec narazie sie wstrzymam.

---
mozliwe ze to to...

-M          - standardowa wielkość bufora wyjściowego (standard (252 bytes) buffer out size)

Ostatnio edytowany przez xxl (2012-08-31 20:57:06)

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

78

Odp: Mads Assembler

i moze jeszcze przelacznik na budowanie plikow binarnych z pelnym naglowkiem a nie skroconym - bo teraz mozna zapisac standardowy plik binarny ktory sparta zle interpretuje

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

79

Odp: Mads Assembler

@xxl: Zestaw sobie potok cpp && mads (zamiast cpp możesz oczywiście użyć jakiegokolwiek innego preprocessora makr jak m4 czy gpp).
Ja używam tego do definiowania odwołań względem symboli w czytelnej formie (np. COMFNAM = COMTAB+33) podczas pisania kodu pod SDX.
Wygląda to tak, że definiuję sobie np. rzeczony COMFNAM:

#define COMFNAM COMTAB+33

po czym w kodzie używam już nazwy COMFNAM zamiast COMTAB+33, które nic mi nie mówi.
Kompilacja przebiega dwustopniowo - najpierw z pliku .asx za pomocą preprocessora generuję plik do kompilacji madsem:

$ cpp -P -o plik.tmp plik.asx

po czym efekt kompiluję madsem

$ mads -l -t -o:plik.obx plik.tmp

Oczywiście możesz definiować dowolne makra preprocessora i ich używać, włączać pliki za pomocą #include i takie tam.

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

80

Odp: Mads Assembler

chyba nie rozumiem. ktory z problemow to rozwiaze:

1. -M          - standardowa wielkość bufora wyjściowego (standard (252 bytes) buffer out size) - z ustawiana wielkoscia
2. po (lub przed) kazdej akcji oproznienia "bufora wyjsciowego" madsa kompilacja jakiegos makra
3. przelacznik na budowanie plikow binarnych z pelnym naglowkiem a nie skroconym

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

81

Odp: Mads Assembler

drugi problem (przed takim blokiem wstawial automatycznie wczesniej zdefiniowany z parametrem...)

Zdefiniuj sobie makro np ORIGIN z parametrami, które przy generowaniu bloku przed nim wstawi ci co tam potrzebujesz, i zamiast ORG używaj ORIGIN.

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

82

Odp: Mads Assembler

ale ja nie chce uzywac ORG, to by bylo zupelnie bez sensu... (punkt 1) asembler sam poszatkuje kod wynikowy naglowkami, nie chce ani liczyc kiedy wypada koniec bloku (o podanej wielkosci) ani uzywac align...

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

83

Odp: Mads Assembler

mads 1.9.4 dopuszcza taką konstrukcję:

    blk reloc extended

    kod
    bne _hop
    kod
    kod

    blk reloc extended

_hop
   kod
   kod

Tymczasem raczej nie powinien, bo nie ma żadnej gwarancji, że blok zawierający adres "_hop" zostanie załadowany blisko poprzedniego. Przeoczenie takiego branchu może spowodować, że w programie będzie trudny do wykrycia błąd, ujawniający się tylko wtedy, kiedy w pamięci extended zabraknie akurat miejsca, w związku z czym ostatni blok programu znajdzie się w pamięci głównej, np. 28 KB od brancha, który w niego celuje ...

Ten problem raczej - na pierwszy rzut oka - nie dotyczy blk reloc main, bo te bloki zawsze są ładowane do pamięci konwencjonalnej.

Ostatnio edytowany przez drac030 (2012-10-20 16:17:09)

KMK
? HEX$(6670358)

84

Odp: Mads Assembler

Mads 1.9.7 taki kod:

  blk reloc main
  jmp *+3
  jmp @+
@:
  jmp ?
?:
  rts

jmp *+3 nie tworzy relokowalnego kodu, pozostałe tworzą.
Zrzut z monitora:

1022: 4C 03 00  JMP $0003   ;CASINI+1
1025: 4C 28 10  JMP $1028
1028: 4C 2B 10  JMP $102B
102B: 60        RTS

Nie zawsze jest jmp 3 - czasem są tam dziwne adresy.

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

85

Odp: Mads Assembler

mads to patologia :) niech ktos (ja) napisze wreszcie porzadny xasm :)

"Was powinny uzbrojone służby wyciągać z domów do punktów szczepień, a potem zamykać do pi* za rozpowszechnianie zagrożenia epidemicznego" - Epi 2021
"Powinno się pałować tylko tych co tego nie rozumieją. No i nie szmatki i nie chirurgiczne tylko min FFP3, to by miało jakiś sens. U mnie we firmie, to jak przychodzi bezmaskowiec, to stoi w deszczu przed firmą" - Pin 2021

86

Odp: Mads Assembler

Skoro nawet wg Ciebie xasm nie jest obecnie porządny, to mads jest lepszy. 2+2=4 :) Jak napiszesz to będzie :D (kiedy deadline? :D )

The problem is not the problem; the problem is your attitude about the problem

87

Odp: Mads Assembler

xasm nie w rozumieniu nazwy wlasnej tylko cross-assembler. wiesz, taki skrót....
zjedz snikersa ...

"Was powinny uzbrojone służby wyciągać z domów do punktów szczepień, a potem zamykać do pi* za rozpowszechnianie zagrożenia epidemicznego" - Epi 2021
"Powinno się pałować tylko tych co tego nie rozumieją. No i nie szmatki i nie chirurgiczne tylko min FFP3, to by miało jakiś sens. U mnie we firmie, to jak przychodzi bezmaskowiec, to stoi w deszczu przed firmą" - Pin 2021

88

Odp: Mads Assembler

syscall: Tak się składa, że każdy koder pisze w którymś momencie swojej kariery jakiegoś asemblera. 90% nie kończy, a z tych ukończonych tylko dwa używa ktoś poza autorem.
Wiem, bo sam teraz piszę swojego trzeciego z rzędu asemblera, ale się z tym nie obnoszę, bo pewnie znowu trafi do tych 90% :)
Zalecam więc trochę pokory, bo jaki mads jest każdy widzi, ale jest ukończony i działający na tyle, że używa go większość atarowskiego światka.

89

Odp: Mads Assembler

mono napisał/a:

Mads 1.9.7 taki kod:

  blk reloc main
  jmp *+3
  jmp @+
@:
  jmp ?
?:
  rts

jmp *+3 nie tworzy relokowalnego kodu, pozostałe tworzą.

dziękuję za informację, w załączniku wersja mads-a z nowymi poprawkami

Ostatnio edytowany przez tebe (2013-12-01 15:44:24)

Post's attachments

mads_198b44.zip 189.58 kb, liczba pobrań: 2 (od 2013-12-01) 

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

90

Odp: Mads Assembler

Dziękuję. Teraz działa poprawnie.

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

91

Odp: Mads Assembler

dla tych którzy chcieliby przekazać informację o czasie i dacie do asemblowanego programu

http://atariage.com/forums/topic/179559 … try2906002

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

92

Odp: Mads Assembler

Miałem odpisać na maila, ale widzę wątek, to napiszę tutaj. Może ktoś będzie miał lepszy pomysł.

Zastanowiłem się nad tym i jest w tym trochę racji, żeby udostępnić taką wbudowaną funkcjonalność.
Narzędzia, z którymi się spotkałem zawierają takie makra. Przykłady

- C/C++: http://gcc.gnu.org/onlinedocs/cpp/Stand … acros.html
- NASM: http://www.nasm.us/xdoc/2.11/html/nasmd … ction-4.12
- Coś podobnego ma nawet Free Pascal: http://www.freepascal.org/docs-html/prog/progap7.html

Pewnie wiele innych też.

Zaproponowane przez Ciebie rozwiązanie ma taki problem, że nie jest przenośne: nie jestem w stanie zrobić projektu, w którym będę wstawiał np. datę assemblacji tak, aby każdy mógł to skompilować na dowolnym systemie. Musiałbym pisać osobny zestaw skryptów dla Windowsa i dla Linuksa.

Nie wiem ile w tym jest sensu, ale przyszło mi do głowy pewne generyczne rozwiązanie: pseudorozkaz GEN("description"), który pełniłby rolę uniwersalnego generatora zastępującego swoje ciało wygenerowanym napisem na podstawie podanego opisu. Można byłoby dla pełności zaimplementować w nim część istniejących pseudorozkazów:

gen("rnd(0,33,256)")  ;losowa liczba
gen('date("F j, Y, g:i a")')           ;data, np. formatowana jak w PHP: March 10, 2001, 5:16 pm
gen("line")           ;aktualny numer assemblowanego wiersza
gen("count")          ;kolejna liczba zwiększana o jeden przy następnym wywołaniu

Idąc za ciosem można byłoby dodać drugi pseudorozkaz, który nawet przydałby się mi:  SYS("command", [args...]), który odpalałby nowy proces o podanej nazwie i wstawiał w miejsce swojego ciała zawartość zwróconego standardowego wyjścia:

.he sys("SuperTableGenerator", 42)

Rezultat: wynik jakiegoś programu generującego super tablice ("SuperTableGenerator.exe") jako ciąg wartości szesnastkowych przyjmującego jeden argument.

Oczywiście "sys" byłby zależny od systemu, ale stanowiłby niezłą furtkę dla prostego generowanie zawartości. Ja często piszę skrypty w ruby, które generują mi jakieś dane, tylko teraz generuję plik binarny, któremu robię "ins", a tu można byłoby generować dane wprost.

W przypadku wielu przebiegów można byłoby cachować wartości wygenerowane przy pierwszym przebiegu.

Ostatnio edytowany przez laoo/ng (2014-01-14 21:03:01)

93

Odp: Mads Assembler

Laoo: Twoje problemy rozwiązuje make i cygwin.

https://www.youtube.com/watch?v=jofNR_WkoCE

94

Odp: Mads Assembler

A dlaczego wszystko chcecie mieć w assemblerze, a nie chcecie korzystać z zewnętrznych narzędzi? IMHO assembler powinien w zasadzie tylko assemblować mnemoniki i generować kod relokowalny dla linkera, a linker na podstawie modelu pamięci i rodzaju pliku wynikowego powinien wygenerować co trzeba (nierelokowalne lub relokowalne).
Jak Fox powiedział - generowanie dodatkowych danych załatwia make, włączanie tego do kodu załatwia preprocesor, kompilację assembler. Tebe ma mniej roboty, mads działa lepiej bo jest łatwiejszy w utrzymaniu i wszyscy są zadowoleni.

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

95

Odp: Mads Assembler

Proszę nie używać liczby mnogiej, bo propozycja jest tylko moja i dziękuję za krytykę :)
Propozycję pseudorozkazu "sys" uzasadniam domniemaną trywialnością implementacji i prostotą użycia, ale po argumencie Foxa uświadomiłem sobie, że w takim rozwiązaniu zewnętrzny program wołany byłby przy każdej asemblacji, podczas gdy rozwiązanie z plikami pośrednimi sterowane make lub odpowiednikiem minimalizuje liczbę wywołań, co jest oczywistym plusem w przypadku skomplikowanych generatorów. Ostatecznie zły pomysł.

A pseudorozkaz "gen"? Ideą jest minimalizowanie liczby zastrzeżonych słów kluczowych będących nośnikami jakichś wartości, które można w przeciwnym razie mnożyć w nieskończoność, a za jego pomocą niejako rezerwujemy na nie osobną niekolidującą przestrzeń nazw.

Wciąż także nie wydaje mi się, aby podstawowe makra (data, itd) nie mogły być realizowane automatycznie np za pomocą takiego generatora. Konieczność instalowania środowiska dlatego, że autor kodu źródłowego napisał sobie linuksowego wsada generującego coś, co może być w samym asemblerze wydaje mi się nadużyciem.

Ostatnio edytowany przez laoo/ng (2014-01-15 14:54:52)

96

Odp: Mads Assembler

A ja pomysł wykorzystałem do automatycznego odkładania kopii źródła *.asm z aktualną data/czasem co każdą kompilacje. Co wieczór jest z 30 nowych backup'ów - łatwo cofnąć się do poprzednich wersji...


1. Utwór katalog Backup tam gdzie jest plik *.asm
2. dodaj linie do BATCHa na jego koniec:

For /f "tokens=1-4 delims=/-" %%a in ("%DATE%") do (
    SET YYYY=%%a
    SET MM=%%b
    SET DD=%%c
)
For /f "tokens=1-4 delims=/:.," %%a in ("%TIME%") do (
    SET HH24=%%a
    SET MI=%%b
    SET SS=%%c
    SET FF=%%d
)

if exist BACKUP copy "%1",BACKUP\"%~n1"_%YYYY%-%MM%-%DD%_%HH24%-%MI%-%SS%.asm

97

Odp: Mads Assembler

Pajero: Sprytne. Aczkolwiek nawet do pracy samodzielnej radziłbym skorzystać z jakiegoś systemu kontroli wersji. Taki git nie wymaga serwera i wszystko jest trzymane lokalnie. Twój skrypt zamiast robić kopię pliku mógłby robić automatycznego commita do repozytorium. Plus tego jest taki,  że historia zmian pliku/plików jest z dokładnością do wiersza i za pomocą dostępnych narzędzi bardzo wygodnie można przeglądać, porównywać kolejne wersje. Oczywiście cofnięcie się do konkretnej wersji też jest trywialne :)

98

Odp: Mads Assembler

Zgadzam się z Laoo. Ja używam git'a i jest git:) masz unlimited undo, branche, diff'y a raz na jakis czas mozesz (nie musisz) wyslac zmiany na serwer by miec external backup (np https://bitbucket.org/ jest za free - np ja tam trzymam moje atari kody). to znacznie lepsze niz tagowanie lokalne podczas build'ow.

Maciek
--------
Atari 65XE + Ultimate 1MB + Stereo + SIO2SD | Atari 520STE + 4MB + UltraSatan | Atari Falcon 030 + CT60e + 14MB ST + 256MB TT + 68882  + CF + Netusbee | Amiga 500 + 1MB + Gotek | Amiga 600 + 2MB Chip + 8MB Fast + CF

99

Odp: Mads Assembler

Czy można prosić o analogiczną jak w dyrektywie INS możliwość podania offsetu i ilości w liniach ale dla ICL?

icl "dupa.asx",50,100

Edit: Przydałoby się przy włączaniu fragmentów czyjegoś źródła do programu...

Ostatnio edytowany przez mono (2016-08-28 00:25:23)

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

100

Odp: Mads Assembler

sed -n 50,149p dupa.asx >dupa-cut.asx
https://www.youtube.com/watch?v=jofNR_WkoCE