1 Ostatnio edytowany przez maw (2014-02-21 15:20:35)

Witam,

Ponieważ jestem nie dość, że kaseciarzem (fuuuj - i co z tego:p) i to do tego basicowcem (FUUUUUJ - no trudno :/), a do tego noga kompletna nie tylko z ASM, ale i używania ASM, to chciałem spytać (i prosić), czy ktoś mógłby mi pomóc i napisać procedurkę relokowalną, która by pozwalała na szybkie kopiowanie wybranych komórek z podanego adresu do adresu docelowego z określonym skokiem ?

Chodzi mi o coś takiego: I = USR(ADR, a0MSB, A0LSB, S0, a1MSB, a1LSB, S1, L, B);

ADR - adres wywołania procedury

a0MSB - bajt starszy adresu źródła
a0LSB - bajt młodszy adresu źródła
S0 - offset pobrania (przeskok w bajtach między kolejnymi komórkami pobrania)

a1MSB - bajt starszy adresu celu
a1LSB - bajt młodszy adresu celu
S1 - offset wstawiania (przeskok w bajtach między kolejnymi komórkami wstawiania)

L - długość bloku/ilość komórek do przeniesienia (max. 255 bajtów)

B - operacja boolowska na celu (000 - nadpisanie, 001 - AND, 010 - OR, 011 - XOR, 100 - NOT)

Byłby ktoś chętny pomóc ? Myślę, że zaprocentowało by to kolejnymi produkcjami w 2008 ;)

___
Press play on tape...

2

Blitter piszesz? :)

KMK
? HEX$(6670358)

3

prawie :) na moje umiejętności machania w basicu to to jest chyba najszybszy sposób przenoszenia komórek pamięci - nie wyobrażam sobie tego robić tak:

FOR I=0 TO L: POKE a1MSB*256+a1LSB + I*S1, PEEK(a0MSB*256+a0LSB + I*S0):NEXT I

nie mówiąc już o & , || i pozostałych :)

___
Press play on tape...

4

od czegos trzeba zaczac, nie jest to wyczyn (nie wiem tez czy zadziala). zaraz pewnie znajdzie sie ktos kto poprawi/zoptymalizuje


source,dest,ofset1,ofset2,b,l


              pla
              pla
              sta source
              pla
              sta source+1
              pla
              sta dest
              pla
              sta dest+1
              pla
              sta ofset1
              pla
              sta ofset2
              pla
              tax
              lda tab,x
              sta operacja
              lda tab1,x
              sta operacja+1
              pla
              tax
              ldy #0
_copy         lda (source),y
operacja      ora (dest),y
              sta (dest),y
              lda source
              clc
              adc ofset1
              sta source
              bcc *+4
              inc source+1
              lda dest
              clc
              adc ofset2
              sta dest
              bcc *+4
              inc dest+1
              dex
              bne _copy
              rts

tab     dta {bit},{and ($00),y},{ora ($00),y},{eor ($00),y},{eor #0}
tab1    dta $00,dest,dest,dest,$ff

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

5

yyy... nie wiem, co napisać... dzięki wielkie XXL, ale czym to się je ? albo bardziej: jak przekształcić w postać strawną do basica ? :D

___
Press play on tape...

6

xxl napisał/a:

lda tab,x
              sta operacja
              lda tab1,x
              sta operacja+1
              pla
              tax
              ldy #0
_copy         lda (source),y
operacja      ora (dest),y
             ...

tab     dta {bit},{and ($00),y},{ora ($00),y},{eor ($00),y},{eor #0}
tab1    dta $00,dest,dest,dest,$ff

Niestety, on chciał "relokowalną", czyli w rzeczywistości position-independent, do umieszczenia w stringu BASIC-a pod dowolnym adresem. Oczywiście, istnieje pewnie metoda na wyperswadowanie mawowi tego szczegółu zamówienia, bo to mało jest miejsc, gdzie można toto umieścić ($400-$47F, $100-$17F, $600-$6FF...) bez konieczności wygimnastykowania procedury "relokowalnej".

KMK
? HEX$(6670358)

7

może być nierokowalna, byle bym wiedział, gdzie ona będzie i nie przeszkadzała mi w magazynowaniu takich różnych buforów...

___
Press play on tape...

8

zastanowilem sie. raczej nie o cos takiego Ci chodzilo. pewnie potrzebujesz procki, ktora moze skopiowac na ekran (standardowo zdefiniowany) dane widoczne jako jakis prostokat?

najlepiej umiescic taka procke na 6 stronie pamieci (basic jej nie rusza).

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

9 Ostatnio edytowany przez maw (2008-06-24 15:20:52)

Dokładnie o coś takiego - pierw kopiuję obszar z ekranu do schowka, potem nakładam na to mój obszar pamięci, po ponownym wywołaniu wklejam w stare miejsce obszar ze schowka, kopiuję z nowego miejsca i tak w kółko. Gdy potrzebuję nakładania się na siebie - wywołuję XORa, ORa albo cokolwiek innego mi potrzebnego.

A ta mnogość parametrów stąd się wzięła, że jeżeli przeskok będzie o 1 bajt (S0 = 0, S1 = 0), to wtedy da się ją też do mieszania duszkami/fontami użyć.

//EDIT: @XXL ale nie jako prostokąt (bo wtedy wchodzi w grę offsetX i offsetY), ale jako pojedyńcza kolumna

___
Press play on tape...

10 Ostatnio edytowany przez pr0be (2008-06-25 13:17:00)

    opt h-
    org $600

dst    equ $cb
len    equ $cd

;
    pla

    pla
    pla
    sta _src+1
    pla
    pla
    sta _src+2
    pla
    pla
    sta _srcm+1

    pla
    pla
    sta dst
    pla
    pla
    sta dst+1
    pla
    pla
    sta _dstm+1

    pla
    pla
    sta len

    pla
    pla
    tax
    lda optab,x
    sta _op

    lda #dst
    cpx #4
    bne l3
    lda #$ff
l3
    sta _op+1

    clc
    ldx #0
    ldy #0 
copy
_src    lda $ffff,x
_op    ora (dst),y
    sta (dst),y

    txa
_srcm    adc #0
    tax
    bcc l1
    clc
    inc _src+2

l1    tya
_dstm    adc #0
    tay
    bcc l2
    clc
    inc dst+1

l2    dec len
    bne copy

    rts

;
optab    dta {bit 0},{and (0),y},{ora (0),y},{eor (0),y},{eor #}
10 DATA 104,104,104,141,59,6,104,104,141,60,6,104,104,141,67,6,104,104,133,203,104,104,133,204
20 DATA 104,104,141,77,6,104,104,133,205,104,104,170,189,89,6,141,61,6,169,203,224,4,208,2
30 DATA 169,255,141,62,6,24,162,0,160,0,189,255,255,17,203,145,203,138,105,0,170,144,4,24
40 DATA 238,60,6,152,105,0,168,144,3,24,230,204,198,205,208,226,96,36,49,17,81,73
50 FOR I=0 TO 93:READ A:POKE 1536+I,A:NEXT I

X=USR(1536, 0, 6, 1, 16, 128, 8, 128, 4) - "kopiuje" z operacja NOT 128 bajtow z adresu 1536 (0+256*6, skok o 1 bajt) do adresu 32784 (16+256*128, skok o 8 bajtow)

11

Super! Dziękuję wszystkim, którym chciało się zastanowić, o co mi biega, a zwłaszcza Pr0bowi i XXLowi :)

Możecie się spodziewać do końca roku konwersji (przepisania) na atarynkę conajmniej jednej mojej gierki flashowej :)

___
Press play on tape...

12

Podziwiam zaangażowanie i upór.

13

maw napisał/a:

Chodzi mi o coś takiego: I = USR(ADR, a0MSB, A0LSB, S0, a1MSB, a1LSB, S1, L, B);

ADR - adres wywołania procedury

a0MSB - bajt starszy adresu źródła
a0LSB - bajt młodszy adresu źródła
S0 - offset pobrania (przeskok w bajtach między kolejnymi komórkami pobrania)

a1MSB - bajt starszy adresu celu
a1LSB - bajt młodszy adresu celu
S1 - offset wstawiania (przeskok w bajtach między kolejnymi komórkami wstawiania)

Każdy parametr USR jest przekazywany jako dwa bajty, więc może wygodniej byłoby przekazywać adresy normalnie, bez rozdzielania na bajty?

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

14 Ostatnio edytowany przez maw (2008-06-24 17:11:40)

Rozbicie jest w sumie dla mnie korzystniejsze, ponieważ zakładam, że dana kolumna maksymalnie będzie dzielona na obszary po 32 bajty, co daje 8 bloków na stronę i ułatwia panowanie nad zmianami - dzięki temu mogę przyjąć, że na stronie XX trzymam dane gracza, którego ruch określa animacja w blokach 0 - 7 (0, 32 .. 192, 224). Także część elementów mogę sobie narysować wcześniej (np. wtedy, kiedy użytkownik ogląda stronę tytułową, albo podczas oczekiwania na załadowanie "levelu") i z pamięci ekranu przenieść w bezpieczny blok pamięci (lub nawet przesunięciem display list rysować w odpowiednim obszarze pamięci).

//EDIT: we flashu coś w tym rodzaju robi się za pomocą BitmapData :)

___
Press play on tape...

15 Ostatnio edytowany przez maw (2008-06-25 13:10:43)

hmm... coś jest nie tak, ale nie wiem, co - wywołuje USRa, ale na ekranie zmian nie widać - od linii 32000 zaczyna się ta sama wersja, ale "skompresowana" blitter2.bas

Pr0be, skok liczony jest od zera ? Tzn.  S0 i S1 równe zero == bajt przy bajcie ? Długość minimalna 1 bajt ?

//EDIT: łoo jaki wolny ten basic... mam nadzieję, że po przekompilowaniu do XEXa będzie o wiele szybciej...
//EDIT: @Pr0be: popraw u siebie w poście POKE 1535+I, A (dzięki FOX)
//EDIT: adres 40000 (156,64) to adres pierwszej komórki pamięci wyświetlania przy standardowym odpaleniu komputera w basic-u

___
Press play on tape...

16

maw napisał/a:

adres 40000 (156,64) to adres pierwszej komórki pamięci wyświetlania przy standardowym odpaleniu komputera w basic-u

Na twoim miejscu na to 40000 bym jednak nie liczył, bo np. pod Turbo BASIC-em XL to jest 48192. Lepiej odczytywac ten adres PEEK(88)+256*PEEK(89)

KMK
? HEX$(6670358)

17

nie nie - nie liczę tego dla celów aplikacji, tylko dla celów testu - i efekt przesunięcia basicowym POKE, i z tej procedurki powinien być tak samo widoczny, a efektów jak nie było widocznych, tak nie ma :/

___
Press play on tape...

18

POKE 1535+I,A

Bajt po bajcie to skoki 1.

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

19 Ostatnio edytowany przez maw (2008-06-25 13:52:02)

10 DATA 104,104,104,141,59,6,104,104,141,60,6,104,104,141,67,6,104,104,133,203,104,104,133,204
20 DATA 104,104,141,77,6,104,104,133,205,104,104,170,189,89,6,141,61,6,169,203,224,4,208,2
30 DATA 169,255,141,62,6,24,162,0,160,0,189,255,255,17,203,145,203,138,105,0,170,144,4,24
40 TRAP 32007:DATA 238,60,6,152,105,0,168,144,3,24,230,204,198,205,208,226,96,36,49,17,81,73
50 READ A:POKE 1536+I,A:I=I+1:GOTO 50
...
32007 X=USR(1536,64,156,1,192,156,1,10,0)

wersja druga... i działa po odwróceniu bajtów adresu

___
Press play on tape...

20 Ostatnio edytowany przez pr0be (2008-06-25 13:18:03)

narazie nie mam zbytnio czasu sprawdzic, ale adresy zrodlowe i docelowe w paramterach sa w odwrotnej kolejnosci niz chciales tzn najpierw MLODSZY a potem STARSZY bajt, wiec
X=USR(1536, 156, 64, 1, 156, 192, 1, 10, 0) - skopiuje obszar od adresu 16540 (a nie 40000) pod adres 49308 (a nie 40128)...

21 Ostatnio edytowany przez maw (2008-06-25 13:52:45)

)*^v^*( o ciup... ale wstyd... działa

wersja 3cia (przepakowana z data na atascii, działająca)

___
Press play on tape...

22

Fox napisał/a:

Każdy parametr USR jest przekazywany jako dwa bajty, więc może wygodniej byłoby przekazywać adresy normalnie, bez rozdzielania na bajty?

no właśnie mam prośbę, jak dużym problemem jest przerobienie (zrobienie) dokładnie tej samej procedurki do wykorzystania w tbxl, ale z przekazywaniem adresów normalnie a nie bajt młodszy, starszy?

dziękuję

PunBB bbcode test

23

Ma być po dwa pla mniej. Zdaje się, wystarczy zmienić początek:

    opt h-
    org $600

dst    equ $cb
len    equ $cd

;
    pla

    pla
    sta _src+2
    pla
    sta _src+1
    pla
    pla
    sta _srcm+1

    pla
    sta dst+1
    pla
    sta dst
    pla
    pla
    sta _dstm+1

    ...

no i zasemblować i umieścić w liniach DATA.

24

dziękuję, przetestuję :)

PunBB bbcode test