26

z tym, że przerwanie raz ma wystąpić po CLI a raz nie, wszystko w zależności od nachylenia rysowanej linii co przekłada się na wartość w liczniku zliczającym do zera

27

Jasne. Ciekawy pomysł.

hex, code and ror'n'rol
niewiedza buduje, wiedza rujnuje

28

No właśnie zrozumiałem że w zależności od DeltaX lub DeltaY jest określona częstotliwość licznika (timera) i na tej podstawie w ciągu głównym się rysuje X lub Y jest na IRQ zwiększany. Ale nie wiem czy to może być wystarczająco precyzyjne. Ale pomysł ciekawy :) Przyznaję iż zupełnie bym w ten sposób nie pomyślał :) Czy jest to do zrealizowania nie wiem. Nie miałbym chyba cierpliwości aby próbować :)

29

Brawa za oryginalny pomysł. Jednak szczerze wątpię, czy uda się osiągnąć sensowną dokładność - przeszkadza m.in. DMA. Tak jak pisał Seban, możesz pozbyć się STA $d209. Testy na Atari800 (Win) możesz sobie darować, przerwania POKEYa są tam bardzo niedokładne.

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

30

dzięks. Właśnie sprawdziłem program po lekkiej modyfikacji na sprzęcie i o dziwo okazuje się, że Atari800Win bardzo podobnie rozkładał linie jak Atarynka, zaś w wersji 1.7 Altirra ma jakiś błąd fałszujący działanie programu przy przerwaniach Pokeya, zresztą słychać to podczas odgrywania muzy, nie wiem jak jest w nowszych wersjach.
Z precyzją jest problem, ale może uda się to jeszcze skalibrować.

31 Ostatnio edytowany przez tebe (2011-08-19 20:26:06)

w załączniku wspomniany FastDraw Konop-a, procedura rysowania linii jest rozpisana rozkaz po rozkazie, wcześniej oczywiście inna procedura odpowiednio modyfikuje odpowiedni kod jednej z ośmiu rozpisanych linii draw0, draw1 ... draw7

org draw0
_dr00 lda $ffff,y
 ora #$80
_dr01 sta $ffff,y
 dex
 beq _out0
_dr02 lda $ffff,y
 ora #$40
_dr03 sta $ffff,y
 dex
 beq _out0
_dr04 lda $ffff,y
 ora #$20
_dr05 sta $ffff,y
 dex
 beq _out0
_dr06 lda $ffff,y
 ora #$10
_dr07 sta $ffff,y
 dex
 beq _out0
_dr08 lda $ffff,y
...
...
...
*- TeBe/Madteam
3x Atari 130XE, SDX, CPU 65816, 2x VBXE, 2x IDE Plus rev. C

32 Ostatnio edytowany przez Fox (2011-08-19 20:41:41)

Teraz jest Altirra 1.9, a nawet 2.0 beta.
Po przemyśleniu sprawy moje zwątpienie w sukces nieco się zmniejszyło.
Porównaj to, chyba będzie trochę szybsze:

    clc
draw
    tax
    ora:sta    (scr_ptr),y
    dec    dy
    beq    draw_end
    tya
    adc    #$20
    tay
    txa
    cli:sei
    bcc    draw
    inc    scr_ptr+1
    clc
    jmp    draw

irq
    mvx    #0    ^2e
    inx:stx    ^2e
    lsr    @
    bcc    irq_rti
    ror    @
    iny
irq_rti
    rti
https://www.youtube.com/watch?v=jofNR_WkoCE

33 Ostatnio edytowany przez Marek Konopka (2011-08-19 23:00:16)

M0 ora $ffff,y
M1 sta $ffff,y

inc M0+2
inc M1+2

16 cykli do przodu / blok 8 pix
7 cykli do tyłu  raz na blok 8 pix
9 cykli do przodu w pełnym rozrachunku

Umieszczenie na zpg poprawi odrobinę wydajność.

EDIT:

Statystycznie lepszym wariantem jest dokonywanie skoku gdy C = 1, co będzie miało miejsce najwyżej jeden raz na 8 pix. Zyskujemy w ten sposób 1 cykl przy zwiększeniu współrzędnej X.

lsr @
bcs skok
rti
skok ror *
iny
rti

34

dzięki za sugestie, postaram się to przyswoić i może przyspieszyć działanie, ale radykalnych zmian już raczej nie zrobię, bo musiałbym od początku eksperymentalnie dobierać częstotliwość występowania przerwań dla każdego nachylenia w obrębie ćwiartki koła.

35

Marek Konopka napisał/a:

Statystycznie lepszym wariantem jest dokonywanie skoku gdy C = 1, co będzie miało miejsce najwyżej jeden raz na 8 pix. Zyskujemy w ten sposób 1 cykl przy zwiększeniu współrzędnej X.

to można jeszcze odwrócić kierunek rysowania linii i zamiast zabawy LSR,BCC,ROR użyć po prostu:

cmp #$80
rol @

36 Ostatnio edytowany przez Marek Konopka (2011-08-20 13:43:10)

Zapomniałeś o iny. Musi to nastąpić w ściśle określonym przypadku (przekroczenie bajtu) i w związku z tym trzeba dodać skok, co pogorszy czas wykonywania tego wariantu.

37

fakt :) masz rację :)

38 Ostatnio edytowany przez gorgh (2011-09-01 14:04:41)

mały updejt, procka gotowa, pozostało jeszcze zrobienie procki kasowania linii
edit:
stosunek czasu do długości linii :
najlepszy przypadek -0.19, najgorszy- 0.45
dla porównania trzy testy procki z paczki MADS : najlepszy przypadek - 0.45, najgorszy -0.53

Post's attachments

fastline.xex 11.71 kb, liczba pobrań: 27 (od 2011-09-01) 

Tylko zalogowani mogą pobierać załączniki.