3,651

(32 odpowiedzi, napisanych Zloty)

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.

3,652

(32 odpowiedzi, napisanych Zloty)

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.

3,653

(24 odpowiedzi, napisanych Sprzęt - 8bit)

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.

3,654

(24 odpowiedzi, napisanych Sprzęt - 8bit)

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.

3,655

(33 odpowiedzi, napisanych Programowanie - 8 bit)

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

3,656

(33 odpowiedzi, napisanych Programowanie - 8 bit)

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

3,657

(33 odpowiedzi, napisanych Programowanie - 8 bit)

bori napisał/a:

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.

3,658

(33 odpowiedzi, napisanych Programowanie - 8 bit)

Jaskier napisał/a:

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

?

3,659

(33 odpowiedzi, napisanych Programowanie - 8 bit)

bori napisał/a:

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.

3,660

(33 odpowiedzi, napisanych Programowanie - 8 bit)

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.

3,661

(26 odpowiedzi, napisanych Sprzęt - 8bit)

Ja tam nigdy nie jestem od tego ;)

3,662

(33 odpowiedzi, napisanych Programowanie - 8 bit)

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.

3,663

(33 odpowiedzi, napisanych Programowanie - 8 bit)

W Warszawie :) Uksword to inaczej UKSW, czyli Uniwersytet im. Kardynała Stefana Wyszyńskiego, dawniej ATK.

3,664

(26 odpowiedzi, napisanych Sprzęt - 8bit)

Zamierzam włamać się do twojego banku i zwiać z całą forsą do ryjo. :P

3,665

(33 odpowiedzi, napisanych Programowanie - 8 bit)

Jaskier napisał/a:

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

3,666

(26 odpowiedzi, napisanych Sprzęt - 8bit)

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.

3,667

(33 odpowiedzi, napisanych Programowanie - 8 bit)

Jaskier napisał/a:

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.

3,668

(33 odpowiedzi, napisanych Programowanie - 8 bit)

Jaskier napisał/a:

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ż?

3,669

(33 odpowiedzi, napisanych Programowanie - 8 bit)

Jaskier napisał/a:

No a co ze starszym???

A starszy traktuje się tak samo, jak wszystkie inne starsze bajty wewnętrznych adresów tego pliku.

bori napisał/a:

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

3,670

(33 odpowiedzi, napisanych Programowanie - 8 bit)

To, że młodszy bajt (lda <adres) pozostaje taki sam - nie trzeba relokatorowi informacji, gdzie jest.

3,671

(33 odpowiedzi, napisanych Programowanie - 8 bit)

marok napisał/a:

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

3,672

(44 odpowiedzi, napisanych Sprzęt - 8bit)

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.

3,673

(26 odpowiedzi, napisanych Sprzęt - 8bit)

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.

3,674

(44 odpowiedzi, napisanych Sprzęt - 8bit)

Właśnie zajrzałem do sio2bsd.c i zauważyłem, że program ma spieprzone timingi (stała "17773446UL" powinna mieć raczej wartość "1773446UL", czyli ok. 10x mniej). Faktycznie coś mi to niezbyt stabilnie działało po ostatnich przeróbkach i chyba teraz już wiem czemu :) Jak dzień wstanie przetestuję poprawioną wersję i ewentualnie wrzucę pod powyższy adres.

3,675

(44 odpowiedzi, napisanych Sprzęt - 8bit)

A ja napiszę jak to jest u nas w pracy, przy obrabiarkach sterowanych numerycznie.

Jedno z dwojga:

1) albo kupiliście niedobre programatory (trzeba było kupić takie, które pasują do obrabiarek);

2) albo programatorów do waszych obrabiarek nikt już nie produkuje, co oznacza, że nikt takich nie potrzebuje, co z kolei oznacza, że obrabiarki nadają się na złom (a jeśli jakaś firma ich używa, czyni to na własne ryzyko ponoszenia takich niewygód).

W każdym razie nie jest to żaden argument o wyższości RS-232 nad USB czy czymkolwiek innym...