2015-07-23 8 views
5

gram około z 6502 asemblerze tutaj: http://skilldrick.github.io/easy65026502 problemy assembler liczb pseudolosowych

zrobiłem to, że po prostu kładzie losowy kolor piksela w losowym miejscu na ekranie:

LDY #$00 ; Clear Y 

loop: 
JSR genPos ; Put new position in memory 
LDA $fe ; Get random number for color 
STA ($10), Y ; Put pixel on screen 
JMP loop 

genPos: 
STA $10 ; Store accumulator in low 
LDA $fe ; Get new random number (WHY, oh why?) 
AND #$03 ; Mask out low two bits (=numbers 0-3) 
CLC  ; Clear carry flag 
ADC#2  ; Add 2 (= numbers 2-5) 
STA $11 ; Store number in high 
RTS 

jestem starając się używać jak najmniej instrukcji. Moim problemem jest to, że jeśli nie dodaję dodatkowej LDA $fe w podprogramie genPos, piksele są rysowane w bardzo dziwny wzór, gdzie jeśli mam dodatkowy kod LDA, kod działa idealnie. Nie mogę zrozumieć, dlaczego - czy ktoś może mi dać wskazówkę?

Pozdrawiam, Jacob

+0

Tak - 2 bajty. Niskie ceny wynoszą 10 USD, a wysokie 11 USD. To, czego nie rozumiem, to że liczba losowa w akumulatorze (używana dla koloru w poprzedniej pętli) powinna zawierać drobny bajt dla adresu ekranu. – jriff

+0

@ i486: @jriff łączył emulator JavaScript, z którego korzysta. Ma losowe liczby na '$ fe' i wejście klawiatury na' $ ff'. – Lynn

Odpowiedz

9

Już robi cienki niski bajt! Ta linia:

LDA $fe ; Get new random number (WHY, oh why?) 

idzie zdecydować wysoką bajt, a jeśli nie wygeneruje nową liczbę losową wartość y będzie zależna od najniższych dwóch bitów wartości x, powodując przekątnych jesteś zobaczyć: wartość x & 3 zawsze równa który segment ekranie wartość jest przygotowywana na, co oznacza, masz wzór jak

█ █ █ █ █ █ █ █ \ 
█ █ █ █ █ █ █ █  | 
█ █ █ █ █ █ █ █  | x & 3 == 0 in $200-$2FF 
█ █ █ █ █ █ █ █  | 
█ █ █ █ █ █ █ █ /
█ █ █ █ █ █ █ █ \ 
█ █ █ █ █ █ █ █ | 
█ █ █ █ █ █ █ █ | x & 3 == 1 in $300-$3FF 
█ █ █ █ █ █ █ █ | 
█ █ █ █ █ █ █ █ /
    █ █ █ █ █ █ █ █ \ 
    █ █ █ █ █ █ █ █ | 
    █ █ █ █ █ █ █ █ | x & 3 == 2 in $400-$4FF 
    █ █ █ █ █ █ █ █ | 
    █ █ █ █ █ █ █ █/
    █ █ █ █ █ █ █ █ \ 
    █ █ █ █ █ █ █ █ | 
    █ █ █ █ █ █ █ █ | x & 3 == 3 in $500-$5FF 
    █ █ █ █ █ █ █ █ | 
    █ █ █ █ █ █ █ █/
+0

Dziękuję bardzo za twoje badania i wyjaśnienia. Teraz rozumiem. – jriff

5

Algorytm zastosowany z LDA jest:

[random 1] -> [11:10] 
[random 1] -> [10] 
[random 2]&3 + 2 -> [11] 
(repeat) 

Jeśli nie przeładować a z $ fe następnie robisz:

[random 1] -> [11:10] 
[ramdom 1] -> [10] 
[random 1]&3 + 2 -> [11] 
(repeat) 

Dlatego zarówno niski, jak i wysoki bajt adresowanego piksela jest funkcją tej samej liczby losowej. Nie są niezależni. To tworzy korelację między nimi. Który manifestuje się we wzorcu, który widzisz. Jeśli twój ekran z udawaniem miał szerokość 256 pikseli, byłaby to bezpośrednia przekątna; w oparciu o fakt, że widzisz 8 pasków, mogę wywnioskować, że twoja wydajność musi w rzeczywistości wynosić 256/8 = 32 piksele szerokości.

Kwestia nie polega na tym, że niesłusznie mówisz, że "losowa liczba w akumulatorze ... powinna zawierać drobny bajt dla adresu ekranu". to znaczy, że używasz go również do wysokiego bajtu. Używasz go dla obu. Wysoki bajt jest bezpośrednią funkcją niskiego bajtu. Tak więc istnieje wiele wysokich bajtów, których nigdy nie trafisz, ponieważ nie spełniają one ograniczeń, które są high=(low&3)+2. Te piksele pozostają nieoświetlone.

+0

Dziękuję bardzo za wyjaśnienie. Przykro mi, że nie mogę podzielić się między tobą a Mauris - oboje na to zasłużyliście. – jriff

+0

@jriff - Możesz głosować na odpowiedź Tommy'ego. –

+0

Zamiast tego ktoś zdecydował się go zgodzić. Czy to jest źle napisane? – Tommy

Powiązane problemy