1

Temat: Kopiowanie bloków pamięci - basic's blitter

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

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

___
Press play on tape...

2

Odp: Kopiowanie bloków pamięci - basic's blitter

Blitter piszesz? :)

KMK
? HEX$(6670358)

3

Odp: Kopiowanie bloków pamięci - basic's blitter

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

Odp: Kopiowanie bloków pamięci - basic's blitter

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

Odp: Kopiowanie bloków pamięci - basic's blitter

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

Odp: Kopiowanie bloków pamięci - basic's blitter

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

Odp: Kopiowanie bloków pamięci - basic's blitter

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

Odp: Kopiowanie bloków pamięci - basic's blitter

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

Odp: Kopiowanie bloków pamięci - basic's blitter

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

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

___
Press play on tape...

10

Odp: Kopiowanie bloków pamięci - basic's blitter

    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)

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

11

Odp: Kopiowanie bloków pamięci - basic's blitter

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

Odp: Kopiowanie bloków pamięci - basic's blitter

Podziwiam zaangażowanie i upór.

13

Odp: Kopiowanie bloków pamięci - basic's blitter

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

Odp: Kopiowanie bloków pamięci - basic's blitter

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

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

___
Press play on tape...

15

Odp: Kopiowanie bloków pamięci - basic's blitter

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

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

___
Press play on tape...

16

Odp: Kopiowanie bloków pamięci - basic's blitter

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

Odp: Kopiowanie bloków pamięci - basic's blitter

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

Odp: Kopiowanie bloków pamięci - basic's blitter

POKE 1535+I,A

Bajt po bajcie to skoki 1.

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

19

Odp: Kopiowanie bloków pamięci - basic's blitter

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

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

___
Press play on tape...

20

Odp: Kopiowanie bloków pamięci - basic's blitter

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

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

21

Odp: Kopiowanie bloków pamięci - basic's blitter

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

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

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

___
Press play on tape...

22

Odp: Kopiowanie bloków pamięci - basic's blitter

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

Odp: Kopiowanie bloków pamięci - basic's blitter

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

Odp: Kopiowanie bloków pamięci - basic's blitter

dziękuję, przetestuję :)

PunBB bbcode test