티스토리 뷰

카테고리 없음

6502 CPU의 의사난수

kcal2845 2019. 2. 9. 09:27

NESDEV에 따르면 6502 같이 하드웨어 곱셈 기능이 없는 CPU에서는 주로 LFSR(선형 되먹임 시프트 레지스터)(linear feedback shift register) 방식을 이용해서 의사 난수를 생성한다고 한다. LFSR은 일종의 시프트 레지스터인데, 평범한 회전 시프트 레지스터에 XOR 게이트가 몇개 붙어있는 모습을 하고 있다. LFSR에는 피보나치, 갈루아 방식 두가지가 있다. 특히 갈루아 방식은 병렬 연산이 용이헤서 컴퓨터에 많이 쓰인다고 한다.



갈루아 LFSR의 예시


그래서 6502 CPU를 위한 간단한 8비트 LFSR을 만들어 보았다. 난수의 생성 범위는 0~255 사이이다.


제로 페이지 :

seed .db $00 ; 시드 용도로 제로페이지에 변수를 선언한다. 일반적으로 버튼이 눌리는 간격이나 현재 시각을 넣는다.


프로그램 코드 : 

PRNG:

LSR seed ; 시드 오른쪽 시프트

LDA seed

BCC CarryZero ; 캐리 플래그가 1이라면(우측 끝 비트가 1이었다면) #$AD와 XOR, 없다면 #$00과 XOR


EOR #$AD

STA seed

JMP PRNGdone


CarryZero:

EOR #$00

STA seed


PRNGdone:

LDA $00


다만 위 그림에서 보다시피 시드가 $00이면 항상 결과가 0만 출력된다. 그러므로 시드에 0이 들어가지 않도록 추가적인 조치를 취해주는것이 좋다. ( 시드가 0이면 INC 명령어로 1로 만들어준다던지)

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함