1

Temat: saturated add/sub

jak w temacie - jak zrobic to najszybciej?
jesli ktos nie wie o co chodzi, to chodzi o odpowiednik mmx'owego sadd/ssub

sadd:

x=:
  x+a if x+a<operand size (255,65535 itd) else x=operand size

ssub:

x=
x-a if x-a>0 else x=0

dane na wejsciu sa na 8 bitach, jest ich 768, potrzebuje to zrobic w ciagu vblanka - mazenie?
oczywiscie moge panikowac, bo zasadniczo nie wiem jakim czasem dysponuje
wiem tylko ze musze sie wyrobic pomiedzy ostatnia linia obrazu a pierwsza, bo inaczej bedzie lamiga

przechodze na tumiwisizm

2

Odp: saturated add/sub

dodajesz, sprawdzasz przepelnienie, jak nie przepelniony skaczesz +2, w przeciwnym wypadku ustawiasz na 0xff
wskaznik na adres w zp i tyle
najlepiej rozpetlic i w jednym przebiegu operowac na np. 16 bajtach
calosc odpowiednio zapetlic.

chyba ze masz np. tylko n mozliwych wartosci dodawanej wartosci - i mozesz na to poswiecic n stron pamieci - to lepiej tablicowac.

The UNIX Guru`s view of Sex:
unzip; strip; touch; finger; mount; fsck; more; yes; umount; sleep

3

Odp: saturated add/sub

Na szybko:

clc
.rept 768
txa
adc src_table+#
bcc skip
  tya
  clc
skip:
sta dst_table+#
.endr

X = value to add
Y = 255
src_table - wiadomo
dst_table - wiadomo

Wychodzi min. 9984 cykli, max 12288, średnio 11136.  Nie pamiętam ile jest dokładnie linii niewidocznych, ale może być na styk w przypadku min.

B. możliwe, że można to jeszcze skrócić przy dod. założeniach.

Ostatnio edytowany przez Marek Konopka (2009-04-18 15:58:08)

4

Odp: saturated add/sub

bo w miedzy czasie musze jeszcze zrobic to:

;--------------------------------------------------------
; VBXE_SetPalette - sets overlay (1) palette
VBXE_SetPalette
    lda    #0xc1
    sta    VBXE_MSEL
    lda    #0
    sta    VBXE_Color
    ldx    #0
VBXE_SetPalette_l1
    pha
    txa
    pha
    ldx    #3
    lda    VBXE_Color
    sta    VBXE_MB0
    inc    VBXE_Color
    ldy    #0
VBXE_SetPalette_l2
    lda    (OVLPalette),y
    sta    VBXE_MB1,y
    iny
    dex
    bne    VBXE_SetPalette_l2
    lda    #0xc1
    sta    VBXE_MSEL
    lda    OVLPalette
    clc
    adc    #3
    sta    OVLPalette
    php
    lda    OVLPalette+1
    plp
    adc    #0
    sta    OVLPalette+1
    pla
    tax
    pla
    dex
    bne    VBXE_SetPalette_l1
    rts

no tak, usiluje zrobic fade in/fade out

te moje php i plp sa potrzebne?
gdzis widzialem ze przy lda cpu ustawia jakies flagi, nie wiem czy c jest kasowane czy nie, wolalem zachowac

nie smiac sie - ze mnie koder na 6502 jak z koziej dupy...

przechodze na tumiwisizm

5

Odp: saturated add/sub

Flaga C przy LDA nie jest zmieniana, więc PHP/PLP są zbędne. LDA zmienia tylko flagi N oraz Z.

Jeżeli dodajesz stałą wartość do tablicy wejściowej, to można napisać prostszy i szybszy wariant w oparciu o tablicę pośrednią:

.rept 768
ldx src_table+#
lda Add_3,x
sta dst_table+#
.endr

12*768 = 9216 cykli

Tablica Add_3 zawiera wartości indeksu powiększone o stałą z uwzględnieniem saturacji. Można ją wygenerować w następujący sposób.

ldy #0
loop:
tya
clc
adc #3
bcc skip
lda #255
skip
sta Add_3,y
iny
bne loop

Chyba jednak się nie zmieści w przerwaniu VBL, gdyż jest w nim ok. 50 linii jeśli dobrze pamiętam. Tutaj wychodzi nam ~80.

Ostatnio edytowany przez Marek Konopka (2009-04-18 15:59:03)

6

Odp: saturated add/sub

po krotkiej rozmowie z bikim/union (strzelil focha, bo znowu porute robie i nie bedzie fachowo i ladnie) wydumalem tabele pomocnicza w wielkosci 768 na delty wartosci posrednich dla kazdej skladowej
w ten sposob moge zrobic fade in fade out, albo fade do bialego w n krokach i inner loop skroci mi sie do tego co u ciebie

przechodze na tumiwisizm

7

Odp: saturated add/sub

Drobna wskazówka. Jeżeli możesz sobie pozwolić na zmianę zawartości nie co każdą ramkę, ale więcej, to wtenczas problem wydajności znika bowiem podczas normalnego czasu procesora (poza VBL) możesz wygenerować sobie wartości do zapisania w palecie na VBL. Wtedy sam zapis uprości się do formy:

.rept 256
lda #$ff
sta R_palette_registers+#
lda #$ff
sta G_palette_registers+#
lda #$ff
sta B_palette_registers+#
.endr

Argumenty dla powyższych rozkazów lda #$xx w tym wariancie generowane są przez procedurę liczącą wartości pośrednie do fade'a i zapisywane w drodze automodyfikacji. Szybciej się nie da już tego zrealizować.

To będzie 4608 cykli czyli 40 linii, a to powinno już wejść w VBL przed pokazaniem pierwszej linii obrazu.

Ostatnio edytowany przez Marek Konopka (2009-04-18 16:35:12)

8

Odp: saturated add/sub

jeszcze wymyslilem trick z mapa kolorow - mozna uzyc 4 palet, wiec zamiast wyciskac 7 poty z vblanka upychajac sie w jednej ramce, moge zrobic sobie to powolutku i w vblanku przelaczyc numer aktywnej palety
oczywiscie nic za darmo i jeszcze musze poczytac i cos splodzic

x-fade wydaje sie osiagalny... (w wersji masakra ale miga)

przechodze na tumiwisizm

9

Odp: saturated add/sub

Jeżeli jest coś takiego jak buforowanie palety/mapy kolorów to nie ma problemu. Wystarczą 2 bufory, a fade co 1 klatkę będzie osiągalny.

Jest też jeszcze inny sposób, trick, który może skutkować drobnymi artefaktami wizualnymi, choć chyba nie jakimiś drastycznymi. Możesz spróbować na zmianę zapisywać po połowie palety w VBL zamiast całości. Które indeksy palety wybierać to już jest sprawa do określenia po eksperymentach. Można zrobić interleaving co bajt (#0 #2, #4... i #1, #3, #5, ...) lub 2 liniowe sekwencje po 128 rejestrów. Co prawda pełne zaktualizowanie palety następować będzie w okresach co 2 ramki, lecz samo odświeżenie części palety co jedną.

10

Odp: saturated add/sub

VBXE udostęnia max 4 palety kolorów, którą paletę wybierzemy zależy od mapy kolorów, w 4 bajcie mapy kolorów zawarta jest m.in. informacja o palecie kolorów dla Overlay

tak że buforowanie palet jest jak najbardziej osiągalne

p.s.
Candle jak masz znajomych koderów ze sceny 16,32 bit to może namówisz któregoś aby jakieś intro czy efekt popełnił pod VBXE, a nuż spodoba mu się i będzie kodera więcej :)

p.s. #2
dla VBXE możliwe są plasmy z rotacją palety kolorów jak dla PC, albo np. animacja Wormhola z wykorzystaniem rotacji palety

Ostatnio edytowany przez tebe (2009-04-18 19:40:22)

*- TeBe/Madteam
3x Atari 130XE, SDX, CPU 65816, 2x VBXE, 2x IDE Plus rev. C

11

Odp: saturated add/sub

tebe: ja moge kodowac jako ze jestem ze sceny 16/32 bit bardziej niz z 8 bit
koderow troche sie znalo, ale wiekszosc pisala w c, a to jest problem
ja pisalem w czystym asmie
a koderow ze sceny pctowej to masz np troche wyzej w tym poscie

to chyba bylo na RH98 jak cos konop zmalowal

przechodze na tumiwisizm

12

Odp: saturated add/sub

Gravity '98, Quast'98, Analogue '99

13

Odp: saturated add/sub

no to widzielismy sie na quascie, na gravicie bylem rok pozniej, bo w 98 juz zbraklo kasy na 3cie party w roku

przechodze na tumiwisizm

14

Odp: saturated add/sub

blitter ma tryb pracy w ktorym dodaje - pisze ze arytmetycznie, mam nadzieje ze nie jest to blad w druku :)

przechodze na tumiwisizm

15

Odp: saturated add/sub

ostatecznie stanelo na takim cusiu:

;--------------------------------------------------------
;Fade_In - fade the palette in one step
Fade_In
    lda    OVLPalette
    sta    Fade_In_pal1
    lda    DSTPalette
    sta    Fade_In_pal2
    sta    Fade_In_pal3
    sta    Fade_In_pal4
    lda    OVLPalette+1
    sta    Fade_In_pal1+1
    lda    DSTPalette+1
    sta    Fade_In_pal2+1
    sta    Fade_In_pal3+1
    sta    Fade_In_pal4+1
    
    ldy    #3
Fade_In_l1
    ldx    #0
Fade_In_l2
    lda    0x55AA,x    ; orginal palette
Fade_In_pal1    equ *-2
    inc    0xAA55,x    ; destination, self modyfying code
Fade_In_pal2    equ *-2
    sec
    cmp    0xAA55,x
Fade_In_pal3    equ *-2
    bcs    Fade_In_Skip
    sta    0xAA55,x
Fade_In_pal4    equ *-2
Fade_In_Skip
    dex
    bne    Fade_In_l2
    inc    Fade_In_pal1+1
    inc    Fade_In_pal2+1
    inc    Fade_In_pal3+1
    inc    Fade_In_pal4+1
    dey
    bne    Fade_In_l1
    rts
;--------------------------------------------------------
;Fade_Out - fade the palette out one step
Fade_Out
    lda    DSTPalette
    sta    Fade_Out_pal1
    sta    Fade_Out_pal2
    sta    Fade_Out_pal3
    lda    DSTPalette+1
    sta    Fade_Out_pal1+1
    sta    Fade_Out_pal2+1
    sta    Fade_Out_pal3+1
    lda    #255
    ldy    #3
Fade_Out_l1
    ldx    #0
Fade_Out_l2
    dec    0xAA55,x    ; destination, self modyfying code
Fade_Out_pal1    equ *-2
    cmp    0xAA55,x
Fade_Out_pal2    equ *-2
    bne    Fade_Out_Skip
    lda    #0
    sta    0xAA55,x
Fade_Out_pal3    equ *-2
    lda    #255
Fade_Out_Skip
    dex
    bne    Fade_Out_l2
    inc    Fade_Out_pal1+1
    inc    Fade_Out_pal2+1
    inc    Fade_Out_pal3+1
    dey
    bne    Fade_Out_l1
    rts

fade_out - jakies 2 ramki
fade_in - 3

przechodze na tumiwisizm

16

Odp: saturated add/sub

W pierwszej pętli SEC przed CMP jest zbyteczny.

17

Odp: saturated add/sub

podziekowal

po reorganizacji danych dla palety, troche sie uproscilo...

;--------------------------------------------------------
; VBXE_SetPalette - sets overlay (1) palette
VBXE_SetPalette
    lda    OVLPalette
    sta    VBXE_SetPalette_pal1
    sta    VBXE_SetPalette_pal2
    sta    VBXE_SetPalette_pal3
    ldx    OVLPalette+1
    stx    VBXE_SetPalette_pal1+1
    inx
    stx    VBXE_SetPalette_pal2+1
    inx
    stx    VBXE_SetPalette_pal3+1
    ldx    #0
VBXE_SetPalette_l1
    stx    VBXE_MB0
    lda    0xAA55,y
VBXE_SetPalette_pal1    equ *-2
    sta    VBXE_MB1
    lda    0xAA55,y
VBXE_SetPalette_pal2    equ *-2
    sta    VBXE_MB2
    lda    0xAA55,y
VBXE_SetPalette_pal3    equ *-2
    sta    VBXE_MB3
    lda    #0xc1
    sta    VBXE_MSEL
    dex
    bne    VBXE_SetPalette_l1
    rts
przechodze na tumiwisizm

18

Odp: saturated add/sub

Rozumiem, że to jest przygotowanie palety do późniejszego, prostego jej zaaplikowania na VBL (przełączenie banku). Jeśli nie, to ta procedura powyższa nie wyrobi się w czasie tuż przed wyświetleniem pierwszej linii obrazu.

19

Odp: saturated add/sub

organoleptycznie nie ma to jednak wiekszego znaczenia
nawet jak chodzi w 3 ramkach na zmiane to wciaz nie ma tragedii
aczkolwiek nieco to dolujace ze tak prosta operacja sprawia tyle problemow

pod wieczor bedzie pewnie jakis "slideshow" (duze slowo...)

przechodze na tumiwisizm

20

Odp: saturated add/sub

zauwaz, ze ta prosta operacja na innych platformach zostala z jakiegos powodu zrealizowana sprzetowo.

21

Odp: saturated add/sub

pare platfofrm znam, ale ze sprzetowa implementacja sie nie spotkalem...

przechodze na tumiwisizm

22

Odp: saturated add/sub

dlaczego mi sie wydaje ze wystarczy zmienic barwe co scanline?
az tak jestem pijany?

The UNIX Guru`s view of Sex:
unzip; strip; touch; finger; mount; fsck; more; yes; umount; sleep

23

Odp: saturated add/sub

Każdy kolor z palety powinien być stały w obrębie całej wyświetlanej klatki obrazu. Nie możemy założyć, że w sekwencji kolejnych liń będą znajdowały się wyłącznie kolory z wąskiego zakresu palety, dla których takie podejście miałoby jakiś sens. Każdy kolor z palety może znajdować się w dowolnym miejscu obrazu.

Ostatnio edytowany przez Marek Konopka (2009-04-20 22:46:25)

24

Odp: saturated add/sub

do posmiania sie:

http://alan.umcs.lublin.pl/~candle/vbxe/slide.zip

podmontowac pod ape czy 810 jako d1 i zabotowac

pod ukochanym dosem wpisac l, a pozniej slide.com

ogolnie nie ma sie czym chwialic, no ale coz

rozwojowo i offtopicowo mam pare pytan

jakie sa szanse zeby dolozyc do tego playera ktory by sobie gral na vblanku na drugim pokeyu podczas ladowania danych? - przypominam ze ladowanie jest przez cio

wypada tez dodac jakies intro i outro, ale to moze troche pozniej, musze uporac sie z wysylkami...

ps. wiem ze lame, nie trzeba pisac :D

przechodze na tumiwisizm

25

Odp: saturated add/sub

obrazki zapalają się i zostają wygaszone płynnie

*- TeBe/Madteam
3x Atari 130XE, SDX, CPU 65816, 2x VBXE, 2x IDE Plus rev. C