Z tego co pamiętam, był 4-bitowy, ale może mnie pamięć zawodzi.
EDIT: kurde, dopiero teraz zauwazyłem - i to przypadkiem - że Pin pyta o sampler z Atari Magazynu, a nie z Mirage'u. :/
Nie jesteś zalogowany. Proszę się zalogować lub zarejestrować.
Jak napisać grę na Atari - cz. 8 Premiera ósmej części popularnej serii poradników Larka o tworzeniu gier na Atari już 28 lipca!
TONY - Ark of the Covenant Kontynuacja przygód Tony'ego na Atari 8-bit, bez przemocy, z naciskiem na spryt i eksplorację.
ABBUC Software Contest 2025: Zgłoszenia Sprawdź aktualną listę programów zgłoszonych do konkursu ABBUC Software Contest 2025. Termin mija 31 lipca!
Gopher2600 0.50.0 Nowa wersja emulatora Atari 2600 z usprawnieniami i nowymi funkcjami debuggera.
Steem SSE 4.2.0 już dostępny Nowa wersja emulatora Steem SSE z istotnymi usprawnieniami i nowościami
atari.area forum » Posty przez drac030
Z tego co pamiętam, był 4-bitowy, ale może mnie pamięć zawodzi.
EDIT: kurde, dopiero teraz zauwazyłem - i to przypadkiem - że Pin pyta o sampler z Atari Magazynu, a nie z Mirage'u. :/
Wiele zależy od tego, co program robi. Rezydenty zastępują często albo uzupełniają jakieś procedury systemowe, to i wtedy nie korzystają ze strony uzytkownika ($80-$FF), ale z komórek strony zerowej przeznaczonej dla tych procedur systemu, do których rezydent się podpina. I tak np. ramdysk może korzystać z adresów uzywanych przez SIO, QE korzysta z adresów używanych przez edytor ekranowy itd.
Przypominam sobie, że w Koszycach jest knajpa, w której sprzedają świeżo uwarzone piwo. Knajpa nazywa się Golem i jest zaraz przy rynku. Adres Dominikańskie namesti 15.
A ile teraz kosztuje miejsce hotelowe w Koszycach? Bo jak tam byłem trzy lata temu, to cena dwuosobowego pokoju z łazienką wynosiła 20 złotych.
Jakibądź edytor do sampli. Jeśli nie zredukujesz do 4-bit unsigned, to przynajmniej do 8-bit, a dalszą konwersję robisz własnym programem.
wava przerabiasz z 16-bit stereo (signed) na 4-bit mono (unsigned), częstotliwość redukujesz do takiej, żeby się dało na Atari odtworzyć, i masz.
Innymi słowy przyczyniłem się walnie do twego rozwoju - nie ma sprawy, nie oczekuję wiele w zamian, wystarczy mi jakieś osiem piw na najbliższym party :P
No tak, przyznaję, w ten sposób może to i działać. Ja jednak pozostanę chwilowo przy mojej metodzie, która zakłada, że program kompilowany jest dwa razy, a nie 257 razy. :)
Co do przerwan no faktycznie w atarce nie ma oddzielnego stosu dla nich i trzeba by je blokowac. Co nie zmienia faktu iz mozna napisac program calkowicie niezalezny od mniejsca polozenia w pamieci - bez koniecznosci jego zmiany przy przemieszczaniu. Ot i to co chcialem przekazac.
No dobrze, podsumujmy. Twoja propozycja:
1) zakłada użycie nielegalnego skoku do systemu
2) zajmuje sporo miejsca i jeszcze więcej cykli maszynowych
3) zakłada użycie danych, które są już zdjęte ze stosu
4) i z tego względu może działać tylko przy wyłączonych przerwaniach.
Sam przyznasz, że do podręcznika programowania to się raczej nie nadaje, chyba że jako antyprzykład :P
Co do tego stosu, można to spróbować zrobić inaczej. Mianowicie zapisujesz w spokojnym miejscu (np. na szóstej stronie) takie coś:
lea pla
clc
adc #$01
sta ret
pla
adc #$00
sta ret+1
jmp (ret)
Po wywołaniu JSR LEA w komórkach RET i RET+1 masz adres pierwszego rozkazu po JSR. Program nadal jednek nie jest w stu procentach niezależny od umieszczenia w pamięci, wydaje mi się, że takowy mozna stworzyć dopiero na 65C816 (mam tak np. rozpisany podprogram PRINTF, skompilowany kod można umieścić gdziekolwiek, np. w stringu BASIC-a, i zawsze działa).
EDIT: oczywiście popierdzieliła mi się kolejność bajtów na stosie. Teraz jest dobrze.
Dziwne, a mi się udało :D
Tak? A nie wykłada się aby na kombinacjach typu:
lda #<adr1
sta vec1
lda #<adr2
sta vec2
lda #>adr1
sta vec1+1
lda #>adr2
sta vec2+1
?
Ale za to nie wymaga relokatora ;-), mozna go dowolnie przesuwac po pamieci razem z danymi
Ale za to nie będzie ci działać, jeśli pod $C0CE nie ma tego, co zakładasz, że jest (a np. w Atari 400 i 800 nie ma tam nic). Ciekaw jestem, czy w QMEG-OS jest, bo w moim ROM-ie dla 65c816 nie ma z całą pewnością.
Zastanawiam się w ogóle, jaki sens ma ta kombinacja (php / jsr $c0ce). Zakładając nawet, że pod tym adresem jest rozkaz RTI. O ile mi wiadomo, JSR odkłada na stos adres powrotny pomniejszony o jeden, a przerwanie nie. Wobec tego JSR $C0CE odłoży na stos adres ostatniego bajtu argumentu rozkazu JSR, a RTI do tegoż ostatniego bajtu powróci (bo RTS zwiększa adres o 1, ale RTI nie). Po wykonaniu JSR (na standardowym ROM-ie) zostanie wykonany nie rozkaz TSX, ale CPY #$BA (gdzie $C0 to opcod CPY #, a $BA to opcod rozkazu TSX). Zastanawiam się, co ci to daje.
Domniemywam, że owo JSR ma wstawiać na stos adres bezwzględny kodu znajdującego się za JSR. Nawet jednak, gdyby tak było (a nie jest, patrz wyżej), to RTI ten adres ze stosu zdejmuje zwiększając przy tym wartość wskaźnika stosu. A pierwsze przerwanie - które może wystąpić zawsze, a więc natychmiast po wykonaniu się RTI również - ten adres skutecznie zamazuje. Toteż późniejszymi rozkazami (tsx, lda nnn,x itd.) zdejmujesz ze stosu wyłącznie śmieci, a program idzie w maliny.
Bez kompilatora w ogóle trudno się obyć, ale rozumiem, że idzie o "bez kompilatora, który sam z siebie produkuje tablicę fixupów". A tych jest większość.
I jeśli idzie o "metodę relokacji", zakładam, że chodzi o metodę wytwarzania tablicy fixupów. Oto ona: kompilujesz program dwa razy, raz pod adres dajmy na to $2000, a drugi raz pod dajmy na to $3000 (może być $0100 i $0200 - non refert). Po czym porównujesz obydwie binarki i na podstawie różnic wytwarzasz tablicę fixupów.
Nie możesz tak zrobić dla pełnych adresów (kompilując np. jedną kopię pod $2000, a drugą pod $3001), bo fixupowanie musiałoby być dodawaniem z przeniesieniem, a nie jesteś w stanie zagwarantować, że dwa kolejne bajty, które dla generatora fixupów wyglądają na młodszy i starszy (z różnic adresów j.w.), należą rzeczywiście do tego samego adresu, a nie do dwóch różnych.
Ja tam nigdy nie jestem od tego ;)
Dlatego, że jak masz lda #$84, wtedy tylko kompilator jest w stanie stwierdzić, czy to jest starszy bajt adresu, młodszy bajt adresu, czy w ogóle nie adres.
W Warszawie :) Uksword to inaczej UKSW, czyli Uniwersytet im. Kardynała Stefana Wyszyńskiego, dawniej ATK.
Zamierzam włamać się do twojego banku i zwiać z całą forsą do ryjo. :P
A jak generujesz tablicę fixupów?
Banalnie prosto.
No i dlaczego nie może ona obejmować zarówno starszych jak i młodszych bajtów adresów?
Może, w zasadzie, ale ma to dwa mankamenty:
a) wydłuża tablicę fixupów (na oko dwukrotnie)
b) wymaga, żeby tąż tablicę fixupów generował kompilator
Punkt b) to problem bez wyjścia, kiedy kompilator, którego używasz, nie generuje kodu relokowalnego.
A w ogóle to ja proponuję zrobić relokator na podstawie źródeł QA. Ładujemy plik .asm i go assemblujemy od MEMLO.
A co, jeśli program ma np. 48k źródłówki i ponad 512 etykiet? :P
Dobrze, proszę uprzejmie, możemy zorganizować drugą zrzutkę, jeśli będzie rozsądna ilość chętnych (a raczej - jeśli wyjdzie rozsądna ilość układów do sprowadzenia). Panuje Europa i cywilizacja białego człowieka, więc płatności załatwiamy przelewem, najlepiej bezpośrednio do Lewisa, o ile się zgodzi. To oczywiście na umówiony sygnał po kalkulacji kosztów. Ja mogę "koordynować", to znaczy negocjować z panem selerem cenę i tym podobne, tak samo, jak było poprzednio.
Informacja merytorycznie niezbędna:
- do skonstruowania 1 szt. Warpa4 potrzebny jest procesor 65C816/14 MHz w obudowie DIP40.
- dopałka Pasia to NIE JEST Warp4. Warp4 to jest powiedzmy biedna wersja dopałki.
- układami niezbędnymi do budowy 1 szt. dopałki Pasia są: 1 szt. procesora 65C816/14 MHz w obudowie PLCC, oraz 1 szt. układu VIA 65C22/14 MHz w obudowie PLCC.
Cena procesorów DIP40 i PLCC jest taka sama. Ostatnio to było 7 funtów w detalu, ale dolar ostatnio staniał, więc może jest mniej.
Najpierw piszesz:
Wystarczy wyrównać adres ładowania do granicy strony i już można (bo zmieniają się tylko starsze bajty takich adresów).
A potem:
A starszy traktuje się tak samo, jak wszystkie inne starsze bajty wewnętrznych adresów tego pliku.To w końcu można czy nie można???
Nie ma tu sprzeczności. Pismo mówi bowiem: można swobodnie i bez trudu korzystać z adresów bezpośrednich (natychmiastowych), gdy wyrówna się adres ładowania do granicy strony. Wtedy bowiem fixupowaniu podlegają tylko starsze bajty wewnętrznych adresów programu - a istotą rzeczy jest nie, że starsze czy nie starsze, ale że w każdym razie pojedyczne bajty programu podlegają fixupowaniu, i tym samym nie ma potrzeby dodawania z przeniesieniem całego adresu ładowania do wszystkich wewnętrznych adresów programu; a tylko starszy bajt adresu ładowania do wszystkich starszych bajtów jest dodawany i to bez przeniesienia.
Nie jest więc istotne, czy adres jest zapisany na dwóch kolejnych bajtach (lda adres / sta vec), czy na dwóch, ale nie kolejnych (lda #<adres / sta vec). Poniał? :)
Co więcej, jeśli założysz, że jakaś tablica ma ci się zaczynać od granicy stron, to taka relokacja sprawia, że ta tablica zawsze się od granicy stron będzie zaczynać.
No bo skąd relokator napotykając na rozkaz:
lda #$84
ma wiedzieć, że to nie jest takie zwykłe $84, ale starszy bajt jakiegoś adresu wewnątrz programu?
Z informacji o fixupach dołączonej do relokowanego pliku binarnego.
Musi być napisany tak, aby nigdzie nie zakładał, że np. jakaś tablica zaczyna się od początku strony.
To chyba wynika z samej istoty sprawy, nieprawdaż?
No a co ze starszym???
A starszy traktuje się tak samo, jak wszystkie inne starsze bajty wewnętrznych adresów tego pliku.
zawsze mozna uzyskac adresowanie wgledem liczika rozkazow poprzez stos
Istnieje jednak prostsza, krótsza i o niebo bardziej elegancka metoda (zastosowana juz przez ICD w kodzie SpartaDOS X, na wypadek, gdyby ktoś myślał, że to wynalazek L.K. Avalonu, podobnie jak śmigłowiec, samolot itp.):
lda dadr
sta vec
lda dadr+1
sta vec+1
...
dadr .word dane
To, że młodszy bajt (lda <adres) pozostaje taki sam - nie trzeba relokatorowi informacji, gdzie jest.
Tzn. nie mozna korzystac z wartosci bezwzglednych adresow z obszaru relokowanego w trybie natychmiastowym
Wystarczy wyrównać adres ładowania do granicy strony i już można (bo zmieniają się tylko starsze bajty takich adresów).
Ok, poprawiłem.
Co do SIO2BSD, wporwadzałem dzisiaj poprawki w pętlach opóźniających, więc jeśli ściągałeś przed godziną powiedzmy 14.00, to masz starą wersję, która w zasadzie dziwię się, że w ogóle działała.
Poza tym najpierw dobrze jest skompilować wersję bez turbo (odkomentować -DULTRA=57600 w Makefile.Linux) i sprawdzić, jak to działa w normalu. U mnie działa dobrze w obu trybach.
Program nie używa żadnych dodatkowych linii sterujących (żadnego DSR, RI ani nic takiego), więc powinien działać jeśli kabel zapewnia choć minimum zgodności z RS-232.
Pasiu: To dobrze, trzymaj na zapas :)
mirusvf: z Anglii sprowadzenie pojedynczego kompletu się nie opłaca. Sam procesor kosztuje ok. 7 funtów (a VIA ok. pięciu - ceny oczywiście spadają jeśli zamawiasz więcej), ale cena wysyłki do Polski po prostu zabija.
atari.area forum » Posty przez drac030
Wygenerowano w 0.129 sekund, wykonano 12 zapytań