Programowanie: Rysowanie linii
From Atariki
Wersja z dnia 12:11, 11 gru 2016 Mono (Dyskusja | wkład) (reorganizacja kodu) ← Previous diff |
Wersja z dnia 12:12, 11 gru 2016 Mono (Dyskusja | wkład) Next diff → |
||
Linia 40: | Linia 40: | ||
tay | tay | ||
.endr | .endr | ||
+ | |||
lda screen+40*49,y | lda screen+40*49,y | ||
and bytemask,x | and bytemask,x |
Wersja z dnia 12:12, 11 gru 2016
Draw dla trybu lowres (Graphics 15) 160x192 rysujący linię o długości 50 pikseli w pionie od pozycji x,0 o kącie nachylenia z zakresu [-45;45] stopni:
COLOR = 1 ;kolor z zakresu 0,1,2,3 org $80 dx .ds 2 tmp .ds 1 ;A = x, X = alpha (U2 - $c0=-45..0=0..$40=45) draw: ldy #0 sty tmp cpx #$80 ;rozszerzenie alpha na 16 bit scc dey stx dx sty dx+1 lsr ;obliczenie pozycji punktu w linii ror tmp lsr ror tmp tay ldx tmp .rept 49 lda screen+40*#,y and bytemask,x ora bytepxl,x sta screen+40*#,y txa adc dx tax tya adc dx+1 tay .endr lda screen+40*49,y and bytemask,x ora bytepxl,x sta screen+40*49,y rts bytemask: :256 .byte ~(%11 << (6 - ((# / 64) * 2))) bytepxl: :256 .byte COLOR << (6 - ((# / 64) * 2))
Rejestry YX w pętli zawierają pozycję x piksela, modyfikowaną o przyrost dx. Jest to liczba z 6 bitami części ułamkowej (najmłodsze bity rejestru X) i dwoma bitami wskazującymi na pozycję piksela w bajcie (dwa najstarsze bity rejestru X mapowane na konkretne maski przez tablice bytemask i bytepxl). Rejestr Y zawiera pozycję bajtu w linii ekranowej.
Algorytm pomija błędy wynikające z akumulacji znacznika C w części ułamkowej pozycji piksela, ponieważ ma ona rozmiar 6 bitów (64 możliwe wartości) i przy rysowaniu 50 pikseli błąd się nie ujawni.
Dodatkowo błędy mogące wynikać z niewielkiej rozdzielczości współczynnika kierunkowego (alpha) odcinka w zakresie -45..45 stopni są w przypadku tak krótkiej linii pomijalne.