티스토리 뷰
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
링크
TAG
- 자바스크립트
- 물리 필독서
- 발전기ㅣ
- 신호 수신
- 난해언어
- 책상 배치
- 발전기 회로
- 컴퓨터 설계
- SDR
- 디지털논리회로
- 로지심
- 브레인퍽
- 아마추어무선
- 코딩
- WEBSDR
- Ham
- 크롬
- 과학상자
- TG-M6600G
- 무선 마우스
- 확장프로그램
- phaser
- 게임 제작
- 인터프리터
- 게임 만들기
- 청소년 필독서
- 아두이노
- 프로그래밍
- logisim
- CPU 설계
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함