6502 CPU에는 따로 보수를 구하는 연산 명령어 같은 것이 없는 것 같다. 이럴때는 간단하게 XOR연산과 INC 연산이면 금방 구할 수 있다. 1의 보수는 단순히 1을 0으로, 0을 1로 치환해 주면 되고, 2의 보수는 1의 보수에서 1만 더해주면 된다. 따라서 만약 보수화 시키고 싶은 데이터가 $00에 위치한다면 다음과 같은 코드로 2의 보수를 구할 수 있다. LDA #$FF ; 1과 XOR 연산을 하면 비트가 뒤집어지므로 1111 1111을 로드해 준다.EOR $00STA $00INC $00 ; 1의 보수에서 1을 증가 시킨다.
NESDEV에 따르면 6502 같이 하드웨어 곱셈 기능이 없는 CPU에서는 주로 LFSR(선형 되먹임 시프트 레지스터)(linear feedback shift register) 방식을 이용해서 의사 난수를 생성한다고 한다. LFSR은 일종의 시프트 레지스터인데, 평범한 회전 시프트 레지스터에 XOR 게이트가 몇개 붙어있는 모습을 하고 있다. LFSR에는 피보나치, 갈루아 방식 두가지가 있다. 특히 갈루아 방식은 병렬 연산이 용이헤서 컴퓨터에 많이 쓰인다고 한다. 갈루아 LFSR의 예시 그래서 6502 CPU를 위한 간단한 8비트 LFSR을 만들어 보았다. 난수의 생성 범위는 0~255 사이이다. 제로 페이지 :seed .db $00 ; 시드 용도로 제로페이지에 변수를 선언한다. 일반적으로 버튼이 눌리는 ..
6502의 ROR이나 ROL 등은 사실 완전 자동으로 회전 시프트를 해주지 않는다. 일단 아래 예제를 보자. LDA #$FFROR A 결과 : 누산기(A 레지스터)에 $7F(0111 1111) 로드 $FF(1111 1111)를 ROR연산을 하면 $FF가 아니라 $7F(0111 1111)가 나오는 것을 볼 수 있다. 그럼 다음 예제를 보자. LDA #$FFSECROR A 결과 : 누산기(A 레지트서)에 $FF(1111 1111)로드 $FF가 로드되는 것을 볼 수 있다. 즉 ROR이나 ROL 명령어는 (시프트 -> C 플래그 셋 -> C플래그를 마지막 비트에 넣음) 의 순서가 아닌 (C플래그를 마지막 비트에 넣음 -> 시프트 -> C 플래그 셋)의 순서라는 것을 알 수 있다. 따라서 ROL이나 ROR을 제대..
아두이노를 이용해서 만능 리모컨을 한번 만들어 보았다. 아두이노 나노 3.3v짜리를 이용했다. 이건 송신부 이건 수신부 기능은 간단하다. 먼저 각 버튼에 리모컨 신호를 "등록"해야 한다. 사진에 보이는 큰 버튼을 누르면 등록 모드로 진입한다. 등록 모드로 진입하게 되면, LED가 켜진다. 이때 등록을 원하는 버튼을 누르면 LED가 깜빡인다. 그다음에는 등록하고 싶은 리모컨 신호를 수신부에 쏘아주면 된다. LED가 3번 빠르게 깜빡이면 적용이 된 것이다. EEPROM에 저장이 되므로 꺼진 뒤에도 계속 사용할 수 있다. IRremote라는 간단하게 이용할수 있는 리모컨 라이브러리가 있어서 편리했다. 소스코드 : https://gist.github.com/kcal2845/95ad505369d1e13f5dd54..
EEPROM이란?EEPROM을 설명하기에 앞서 우선 ROM의 변천 과정에 대해서 알아보겠다. ROM은 Read-only memory의 줄임말로, 말 그대로 읽기만 가능한 메모리라는 뜻이다. 하지만 이건 아주 옛날 이야기고, 최근 생산되는 대부분의 ROM은 적어도 한번 이상은 정보를 수정 가능하게끔 되어있다. ROM이 처음 세상에 등장했을 때는 공장에서 제조될때 바로 데이터가 저장되어 고정된 채 생산되었다. 그랬기 때문에 후에 데이터를 변경하는 것이 불가능 했다. 여기서 한발자국 더 나아간 것이 PROM이다. PROM(Programmable ROM)은 이름에서 보다시피 '프로그래밍 가능한' 롬이다. 프로그래밍 가능하다는 것은 내부의 회로를 변경해서 데이터를 수정할 수 있다는 말이다. 그러나 내부의 퓨즈를 ..
요즘에는 통신 규격 분석에 재미가 들렸다. 갖가지 통신을 공부하고 있다. 아두이노를 이용해서 I2C, SPI 등의 직렬 신호를 직접 다루는 소스 코드도 만들어 보았다. 아두이노에 이미 관련 라이브러리들이 있는데도 불구하고 새로 만드는 이유는, 신호를 분석하고 직접 다뤄보고 싶었기 때문이다. 지금 도전하고 있는 것은 NTSC이다. NTSC는 과거 아날로그 TV와 VHS 플레이어의 컴포지트 단자 등에 쓰이던 통신 규격이다. 과거 아두이노에서 TV-out이라는 라이브러리를 이용해서 tv에 출력해본 기억이 난다. 아두이노의 2kb에 불과한 RAM 용량의 한계로 안타깝게도 고화질로 표현하기는 어려웠다. NTSC의 해상도는 720*480이다. 흑백 화면으로 사용한다고 해도 약 85kB정도가 요구된다. 그래서 나는 ..
- Total
- Today
- Yesterday
- 과학상자
- CPU 설계
- 책상 배치
- 아마추어무선
- WEBSDR
- 게임 제작
- logisim
- 물리 필독서
- SDR
- 브레인퍽
- 난해언어
- phaser
- 청소년 필독서
- TG-M6600G
- 신호 수신
- Ham
- 인터프리터
- 로지심
- 컴퓨터 설계
- 프로그래밍
- 디지털논리회로
- 발전기ㅣ
- 확장프로그램
- 코딩
- 크롬
- 게임 만들기
- 발전기 회로
- 아두이노
- 자바스크립트
- 무선 마우스
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |