2015-07-23 29 views
5

Burada 6502 assembler'i etrafında oynuyorum:6502 montajcı rasgele sayı problemleri

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 

Ben: Ben sadece ekranda rastgele bir yerde rastgele renk pikseli koyar bu yapmış http://skilldrick.github.io/easy6502

mümkün olduğunca az talimat kullanmaya çalışıyorum. Benim sorunum, alt rutinde fazladan bir LDA $fe koymayınca, pikseller çok tuhaf bir şekilde çizilir ki, fazladan LDA'm varsa kod mükemmel çalışır. Nedenini anlayamıyorum - kimse bana bir ipucu verebilir mi?

Selamlar, Jacob

+0

Evet benzeri bir desen olsun, yani üzerinde çekilmekte olduğu eşittir - 2 bayt. Düşük 10 $ 'da 11 $' da. Anlamadığım şey, akümülatördeki rasgele sayının (önceki döngüde kullanılan renk) ekran adresi için düşük bir bayt yapması gerektiğidir. – jriff

+0

@ i486: @jriff kullandığı JavaScript emülatörünü bağladı. '$ Fe''de rastgele sayılara ve $ ff'de klavye girişine sahiptir. – Lynn

cevap

9

Zaten iyi bir düşük bayt yapıyor! Bu hat:

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

yüksek byte karar vermek gider ve yeni bir rastgele sayı oluşturmak yoksa, y değeri x değerinen düşük iki bit bağımlı olacak, Gördüğün diyagonallerini neden: x & 3 değeri her zaman ekranın segmenti değeri

█ █ █ █ █ █ █ █ \ 
█ █ █ █ █ █ █ █  | 
█ █ █ █ █ █ █ █  | 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

Araştırmanız ve açıklamalarınız için çok teşekkür ederim. Şimdi anladım. – jriff

5

LDA ile uygulanan algoritma şudur: Bu nedenle

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

:

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

o zaman yapıyoruz $ fe den a yeniden başarısız olursa adreslenen pikselin hem düşük hem de yüksek baytı, aynı rasgele sayının bir işlevidir. Bağımsız değiller. Bu aralarında bir korelasyon oluşturur. Gördüğünüz kalıpta kendini gösterir. Taklit ekranınız 256 piksel genişliğiyse, doğrudan bir diyagonal olur; 8 şeridi gördüğünüze göre çıkışınızın aslında 256/8 = 32 piksel genişliğinde olması gerektiğini söyleyebilirim.

Sorun, "akümülatördeki rasgele sayıların ... ekran adresi için düşük bir bayt yapması gerektiğini" söylemenin yanlış olduğunu düşünmüyorsunuz. yüksek bayt için de kullanıyorsunuz. Her ikisini de kullanıyorsun. Yüksek bayt, düşük byte'ın doğrudan bir işlevidir. Yani, hiçbir zaman vurmayacağınız bir sürü yüksek bayt vardır çünkü high=(low&3)+2 sınırını karşılamıyorlar. Bu pikseller yanmıyor.

+0

Açıklama için çok teşekkür ederim. Üzgünüm ki, Mauris ile aranızdaki kudosları parçalayamıyorum - ikiniz de bunu hak ediyorsunuz. – jriff

+0

@jriff - Tommy'nin cevabını kışkırtabilirsin. –

+0

Bunun yerine biri onu reddetmeye karar verdi. Bu kötü yazılmış mı? – Tommy