76

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 Ostatnio edytowany przez xxl (2012-08-31 20:57:06)

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)

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

78

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

@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

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

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

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 Ostatnio edytowany przez drac030 (2012-10-20 16:17:09)

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.

KMK
? HEX$(6670358)

84

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

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

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

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

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 Ostatnio edytowany przez tebe (2013-12-01 15:44:24)

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

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

Dziękuję. Teraz działa poprawnie.

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

91

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 Ostatnio edytowany przez laoo/ng (2014-01-14 21:03:01)

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.

93

Laoo: Twoje problemy rozwiązuje make i cygwin.

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

94

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 Ostatnio edytowany przez laoo/ng (2014-01-15 14:54:52)

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.

96

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

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

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 Ostatnio edytowany przez mono (2016-08-28 00:25:23)

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...

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

100

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