CHIP-8
CHIP-8

CHIP-8은 Joseph Weisbecker에 의해 개발된 해석된 프로그래밍 언어다.그것은 처음에 1970년대 중반에 COSMAC VIP와 텔맥 1800 8비트 마이크로컴퓨터에 사용되었다.CHIP-8 프로그램은 CHIP-8 가상 시스템에서 실행된다.그것은 비디오 게임이 이러한 컴퓨터에 더 쉽게 프로그램될 수 있도록 만들어졌지만, 칩 8은 단순성 때문에, 그리고 결과적으로 어떤 플랫폼과 바이너리 숫자 프로그래밍에 대한 가르침 때문에 오늘날에도 여전히 사용되고 있다.
CHIP-8이 도입된 지 약 15년이 지난 후, 일부 모델의 그래핑 계산기에 파생된 통역기가 등장했다(1980년대 후반부터, 여러 면에서 이러한 휴대용 장치는 1970년대 중반의 취미 생활자들을 위한 대부분의 마이크로 컴퓨터보다 더 많은 컴퓨팅 능력을 가지고 있다).
1970년대 후반에는 ARESCO의 "VIPER" 뉴스레터를 시작으로 CHIP-8 통역기의 기계코드를 공개하는 활발한 사용자 및 개발자 커뮤니티가 존재했다.[1]
CHIP-8 응용 프로그램
Pong, Space Inviders, Tetris, Pac-Man과 같은 CHIP-8에 포팅된 많은 클래식 비디오 게임들이 있다.랜덤 미로 발생기와 콘웨이의 생명의 게임 같은 어플리케이션도 있다.
CHIP-8 확장 및 변형
1970년대와 1980년대에 CHIP-8 사용자들은 CHIP-8 프로그램을 공유했지만, CHIP-8 통역기를 변경하고 확장하기도 했다.표준 64x32보다 높은 해상도를 도입한 CHIP-10, 하이레즈 CHIP-8, 제한된 색상을 지원하도록 단색 디스플레이 기능을 확장한 CHIP-8C, CHIP-8X 등이 확장됐다.[2]일부 용도 변경에서 새로운 지침에 opcode를 거의 사용하지 않았음에도 불구하고, 이러한 확장들은 원래 통역자를 기반으로 했기 때문에 대부분 역호환성이 있었다.[3]
1979년, 전자 오스트레일리아는 모토로라 6800 아키텍처를 기반으로 코스맥 VIP와 유사한 키트 컴퓨터 구축에 관한 일련의 기사를 실었다.[4]이 컴퓨터, DREAM 6800은 자체 버전의 CHIP-8과 함께 나왔으며, VIPER와 유사한 뉴스레터인 DREAMER가[5] 이 통역사를 위해 CHIP-8 게임을 공유하는데 사용되었다.1981년, ETI는 컴퓨터 구축에 관한 일련의 기사를 실었는데, ETI-660 역시 VIP와 매우 유사했다(그리고 동일한 마이크로프로세서를 사용했다).ETI는 1985년까지 ETI-660과 일반 CHIP-8 칼럼을[6] 운영했다.
1990년에는 HP-48 그래핀 계산기를 위해 CHIP-48이라는 CHIP-8 통역기가 만들어져서 게임을 더 쉽게 프로그래밍할 수 있었다.에릭 브린츠는 나중에 SCHIP, S-칩 또는 슈퍼칩이라고 불리는 CHIP-48을 기반으로 한 또 다른 통역사를 만들었다.SCHIP는 더 큰 해상도로 CHIP-8 언어를 확장했고 프로그래밍을 더 쉽게 하기 위해 몇 개의 추가 opcode를 추가했다.[7]만일 CHIP-48 통역기의 개발이 없었다면, CHIP-8은 오늘날처럼 잘 알려지지 않았을 것이다.[citation needed]
David Winter의 에뮬레이터, 디스어셈블러 및 확장된 기술 문서는 많은 다른 플랫폼에서 CHIP-8/SHIP를 대중화했다.그것은 문서화되지 않은 opcode와 특징의[8] 전체 목록을 작성했고, 많은 취미 활동가 포럼에 배포되었다.많은 에뮬레이터들이 이 작품들을 출발점으로 삼았다.
그러나, CHIP-48은 일부 opcode의 의미론을 미묘하게 변경하였고, SHIP는 다른 opcode의 변경 외에도 이러한 새로운 의미론을 계속 사용하였다.CHIP-8에 관한 많은 온라인 자원은 이러한 새로운 의미론을 전파하기 때문에 많은 현대적인 CHIP-8 게임들은 새로운 SHIP 확장을 특별히 사용하지 않더라도 COSMAC VIP용 원래의 CHIP-8 통역기와 역호환되지 않는다.[9]
현재 CHIP-8
일부 개발 도구뿐만 아니라 거의 모든 플랫폼에 대해 CHIP-8을 구현하고 있다.게임은 디지털 아카이브에서 온라인으로 부활하는 오래된 게임 외에 오늘날에도 여전히 개발되고 분류되고 있다.[10][11]
CHIP-8과 SHIP는 일반적으로 에뮬레이터로 구현되어 왔지만, 특정 FPGA 보드에 대해서는 순수한 하드웨어 구현(베릴로그 언어로 작성)도 존재한다.
가상 시스템 설명
기억력
CHIP-8은 코스맥 VIP와 텔맥 1800과 같은 4K 시스템에서 가장 일반적으로 구현되었다.이 기계들은 4096개(0x1000)의 메모리 위치를 가지고 있었는데, 모두 8비트(바이트)로, CHIP-8이라는 용어가 유래된 곳이다.그러나, CHIP-8 통역기 자체는 이 기계들의 메모리 공간의 첫 512바이트를 차지한다.이러한 이유로, 원래 시스템을 위해 작성된 대부분의 프로그램은 메모리 위치 512 (0x200)에서 시작하여 위치 512 (0x200) 아래의 메모리에 접근하지 않는다.맨 위 256바이트(0xF00-0xFF)는 디스플레이 새로 고침을 위해 예약되어 있으며, 그 아래 96바이트(0xEA0-0xEFF)는 호출 스택, 내부 사용 및 기타 변수를 위해 예약되어 있다.
통역이 기본적으로 4K 메모리 공간 밖에서 실행되고 있는 현대의 CHIP-8 구현에서는 더 낮은 512바이트의 메모리(0x000-0x1)를 피할 필요가 없다.FF), 그리고 글꼴 데이터를 저장하는 것이 일반적이다.
레지스터
CHIP-8에는 V0 to VF라는 이름의 16개의 8비트 데이터 레지스터가 있다.VF 레지스터는 일부 지침의 플래그로 두 배로 증가하므로 피해야 한다.추가 작전에서 VF는 운반 깃발이고, 뺄셈에서는 "빌리지 않는" 깃발이다.그리기 지침에서 VF는 픽셀 충돌 시 설정된다.
I라는 이름의 어드레스 레지스터는 폭이 12비트이며 메모리 연산을 수반하는 여러 개의 opcode와 함께 사용된다.
더 스택
스택은 서브루틴이 호출될 때 반환 주소를 저장하는 데만 사용된다.원래 RCA 1802 버전은 최대 12 레벨의 보금자리를 위해 48바이트를 할당했다;[12] 현대적인 구현은 보통 더 많은 것을 가지고 있다.[13][14]
타이머스
CHIP-8에는 타이머가 두 개 있다.둘 다 60헤르츠에서 0이 될 때까지 카운트다운을 한다.
- 지연 타이머:이 타이머는 게임 이벤트의 타이밍을 맞추기 위해 사용된다.그것의 가치는 설정되고 읽힐 수 있다.
- 사운드 타이머:이 타이머는 음향 효과에 사용된다.그것의 값이 0이 아닐 때, 삐 소리가 난다.
입력
입력은 0~F의 16개의 키를 가진 16진수 키보드로 한다.'8', '4', '6', '2' 키는 일반적으로 방향 입력에 사용된다.입력을 감지하는 데는 세 개의 opcode가 사용된다.특정 키를 누르면 명령을 건너뛰고, 특정 키를 누르지 않으면 명령을 건너뛰는 사람이 있다.세 번째는 키 프레스를 기다렸다가 데이터 레지스터 중 하나에 저장한다.
그래픽 및 사운드
Original CHIP-8 디스플레이 해상도는 64×32 픽셀이며, 색상은 단색이다.그래픽은 폭이 8픽셀이고 높이가 1픽셀에서 15픽셀일 수 있는 스프라이트를 그리는 것으로만 화면에 그려진다.스프라이트 픽셀은 해당 화면 픽셀과 XOR'd이다.즉, 설정된 스프라이트 픽셀은 해당 스크린 픽셀의 색을 뒤집는 반면, 미설정 스프라이트 픽셀은 아무 것도 하지 않는다.스프라이트를 그릴 때 스크린 픽셀이 설정에서 설정되지 않은 상태로 플립되고 그렇지 않으면 0으로 설정된 경우 반송 플래그(VF)가 1로 설정된다.이것은 충돌 탐지에 사용된다.
앞에서 설명한 것처럼, 소리 타이머의 값이 0이 아닐 때 신호음이 재생된다.
Opcode 테이블
칩-8은 35개의 opcode를 가지고 있는데, 이 opcode는 모두 2바이트 길이로 빅엔디안을 저장했다.opcode는 아래 16진수 및 다음과 같은 기호와 함께 나열된다.
- NNN: 주소
- NN: 8비트 상수
- N: 4비트 상수
- X 및 Y: 4비트 레지스터 식별자
- PC : 프로그램 카운터
- I : 16비트 레지스터(메모리 주소용) ( 보이드 포인터와 유사);
- VN: 16개의 사용 가능한 변수 중 하나.N은 0 ~ F(헥사이드십)일 수 있다.
1978년 이래로 많은 CHIP-8 명령어들이 구현되어 왔다.다음 규격은 1991년(확장 기능을 제공하는 추가 opcode는 제외)의 SUPER-CHIP 사양을 기반으로 하며, 이는 오늘날 가장 흔히 접하는 확장이다.각주는 1978년부터 작성된 원래의 CHIP-8 지침과 비호환성을 나타낸다.
opcode | 유형 | C 사이비 | 설명 |
---|---|---|---|
0NNN | 부르다 | 주소 NNN에서 머신 코드 루틴(RCA 1802 for COSMAC VIP)을 호출한다. 대부분의 ROM에는 필요하지 않다. | |
00E0 | 디스플레이 | disp_clear() | 화면을 지운다. |
00EE | 흐름 | return; | 서브루틴에서 돌아온다. |
1NNN | 흐름 | goto NNN; | NNN으로 이동하십시오. |
2NNN | 흐름 | *(0xNNN)() | NNN에 서브루틴을 호출한다. |
3XNN | 콘드 | if (Vx == NN) | VX가 NN과 동일한 경우 다음 지시사항을 건너뛰십시오(일반적으로 다음 지시사항은 코드 블록을 건너뛰기 위한 점프임). |
4XNN | 콘드 | if (Vx != NN) | VX가 NN과 일치하지 않을 경우 다음 지시사항을 건너뛰십시오(일반적으로 다음 지시사항은 코드 블록을 건너뛰기 위한 점프임). |
5XY0 | 콘드 | if (Vx == Vy) | VX가 VY와 동일한 경우 다음 지시사항을 건너뛰십시오(일반적으로 다음 지시사항은 코드 블록을 건너뛰기 위한 점프임). |
6XNN | 콘스탄트 | Vx = N | VX를 NN으로 설정하십시오. |
7XNN | 콘스탄트 | Vx += N | VX에 NN 추가(캐리 플래그는 변경되지 않음); |
8XY0 | 아시그 | Vx = Vy | VX를 VY 값으로 설정하십시오. |
8XY1 | 비트옵 | Vx = Vy | VX를 VX 또는 VY로 설정(비트 OR 작업); |
8XY2 | 비트옵 | Vx &= Vy | VX를 VX 및 VY로 설정(비트 AND 작업); |
8XY3[a] | 비트옵 | Vx ^= Vy | VX를 VX xor VY로 설정하십시오. |
8XY4 | 수학 | Vx += Vy | VX에 VY 추가캐리어가 있을 때는 VF를 1로, 없을 때는 0으로 설정한다. |
8XY5 | 수학 | Vx -= Vy | VY는 VX에서 감산된다.VF는 차입금이 있을 때는 0으로, 없을 때는 1로 설정되어 있다. |
8XY6[a] | 비트옵 | Vx >>= 1 | VF에 가장 중요하지 않은 VX 비트를 저장한 다음 VX를 오른쪽으로 1만큼 이동시킨다.[b] |
8X7년[a] | 수학 | Vx = Vy - Vx | VX를 VY - VX로 설정하십시오.VF는 차입금이 있을 때는 0으로, 없을 때는 1로 설정되어 있다. |
8XYE[a] | 비트옵 | Vx <<= 1 | VF에 가장 중요한 VX 비트를 저장한 다음 VX를 왼쪽으로 1씩 이동시킨다.[b] |
9XY0 | 콘드 | if (Vx != Vy) | VX가 VY와 일치하지 않을 경우 다음 지침을 건너뛰십시오(일반적으로 다음 지침은 코드 블록을 건너뛰기 위한 점프임). |
ANN | MEM | I = NNN | 주소 NNN으로 I을 설정한다. |
BNN | 흐름 | PC = V0 + NNN | NNN + V0 주소로 이동하십시오. |
CXNN | 랜드 | Vx = rand() & NN | VX를 비트(bitwise)의 결과로 설정하고 랜덤 번호(일반적으로 0~255) 및 NN으로 작동하십시오. |
DXYN | 디스플레이 | draw(Vx, Vy, N) | 너비가 8픽셀이고 높이가 N픽셀인 좌표(VX, VY)에 스프라이트를 그린다.8픽셀의 각 행은 메모리 위치 I부터 비트 코딩으로 읽힌다. I 값은 이 명령을 실행한 후에도 변경되지 않는다.위에서 설명한 대로 스프라이트를 그릴 때 스크린 픽셀이 세트에서 설정되지 않은 상태로 플립될 경우 VF는 1로, 그렇지 않을 경우 0으로 설정된다. |
EX9E | 키옵 | if (key() == Vx) | VX에 저장된 키를 누른 경우 다음 명령을 건너뛰십시오.(일반적으로 다음 지침은 코드 블록을 건너뛰기 위한 점프) |
EXA1 | 키옵 | if (key() != Vx) | VX에 저장된 키를 누르지 않으면 다음 명령을 건너뛰십시오.(일반적으로 다음 지침은 코드 블록을 건너뛰기 위한 점프) |
FX07 | 타이머 | Vx = get_delay() | VX를 지연 타이머 값으로 설정하십시오. |
FX0A | 키옵 | Vx = get_key() | 키 프레스를 기다린 다음 VX에 저장한다(차단 작동).다음 키 이벤트가 발생할 때까지 모든 명령이 중단됨); |
FX15 | 타이머 | delay_timer(Vx) | 지연 타이머를 VX로 설정하십시오. |
FX18 | 소리 | sound_timer(Vx) | 사운드 타이머를 VX로 설정하십시오. |
FX1E | MEM | I += Vx | I에 VX 추가. VF는 영향을 받지 않음.[c] |
FX29 | MEM | I = sprite_addr[Vx] | VX에서 캐릭터의 스프라이트 위치로 I을 설정한다.문자 0-F(16진수)는 4x5 글꼴로 표현된다. |
FX33 | BCD | set_BCD(Vx) *(I+0) = BCD(3); *(I+1) = BCD(2); *(I+2) = BCD(1); | VX의 이진 코드 십진표시를 저장하며, 가장 유의한 것은 I의 주소에 3자리, 가장 유의한 것은 I+1이고, 가장 유의한 것은 I+2이다. (즉, VX의 십진표시를 취하여 I의 위치에 수백자리, 위치 I+1에 수십자리, digi를 취한다.)t 위치 I+2;; |
FX55 | MEM | reg_dump(Vx, &I) | V0에서 VX(VX 포함), 주소 I부터 시작하여 메모리에 저장I로부터의 오프셋은 쓰여진 각 값에 대해 1씩 증가하지만, 나 자체는 수정되지 않은 채로 남아 있다.[d] |
FX65 | MEM | reg_load(Vx, &I) | V0에서 VX(VX 포함)로 주소 I부터 시작하여 메모리의 값을 채운다.I로부터의 오프셋은 쓰여진 각 값에 대해 1씩 증가하지만, 나 자체는 수정되지 않은 채로 남아 있다.[d] |
메모들
- ^ a b c d 논리적 opcode 8XY3, 8XY6, 8XY7 및 8XYE는 원래 CHIP-8 규격에 문서화되지 않았다. 모든 8000개의 opcode가 1802의 ALU의 지침에 전송되었고, 통역기 자체에 위치하지 않았기 때문이다. 따라서 이 세 개의 추가 opcode는 의도하지 않은 기능이었을 것으로 추정된다.
- ^ a b 실제 원래의 통역기에 기록되지 않은 opcode 8XY6, 8XYE(비트 시프트 지침)의 opcode는 레지스터 VY의 값을 옮겨 그 결과를 VX에 저장했다.대신 CHIP-48과 SHIP 구현은 VY를 무시하고 VX를 이동시켰다.[9]
- ^ 대부분의 CHIP-8 통역사의 FX1E 지침은 VF에 영향을 주지 않지만, 한 가지 예외는 다음과 같다.아미가 사령관의 CHIP-8 통역기는 범위 오버플로(I+VX>0xFF)가 있을 때는 VF를 1로, 없을 때는 0으로 설정한다.[15]이런 행동에 의존하는 유일한 게임은 스페이스파이트 2091!이고, 적어도 한 게임인 애니멀 레이스는 VF가 영향을 받지 않는 것에 의존한다.
- ^ a b 원래의 CHIP-8 구현에서 그리고 또한 CHIP-48에서 나는 이 명령이 실행된 후 증가된 상태로 남아 있다.SHIP에서 나는 수정되지 않은 채로 남겨진다.
참조
- ^ "VIPER for RCA VIP owner". Intelligent Machines Journal (InfoWorld). InfoWorld Media Group. 1978-12-11. p. 9. Retrieved 2010-01-30.
- ^ https://github.com/mattmikolay/chip-8/wiki/CHIP%E2%80%908-Extensions-Reference
- ^ https://github.com/trapexit/chip-8_documentation
- ^ https://archive.org/stream/EA1979/EA%201979-05%20May#page/n85/mode/2up
- ^ https://archive.org/details/dreamer_newsletter_01/mode/2up
- ^ https://archive.org/stream/ETIA1981/ETI%201981-11%20November#page/n113/mode/2up
- ^ https://github.com/Chromatophore/HP48-Superchip
- ^ http://vanbeveren.byethost13.com/stuff/CHIP8.pdf
- ^ a b https://github.com/JohnEarnest/Octo/blob/gh-pages/docs/SuperChip.md#compatibility
- ^ https://johnearnest.github.io/chip8Archive/
- ^ https://rcastudio2.blogspot.com/
- ^ RCA COSMAC VIP CDP18S711 Instruction Manual. Somerville: RCA Solid State Division. 1978. p. 36.
- ^ "Cowgod's Chip-8 Technical Reference". devernay.free.fr. Retrieved 2020-02-03.
- ^ Mikolay, Matthew. "Mastering CHIP-8 : Subroutines". mattmik.com. Retrieved 2020-02-03.
- ^ "FX1E and VF · Issue #2 · Chromatophore/HP48-Superchip · GitHub".
추가 읽기
- "RCA COSMAC VIP CDP18S711 사용 설명서," 소머빌, NJ 08776, 1978년 2월 RCA 솔리드 스테이트 부서.파트 VIP-311. 페이지 13–18, 35–37.
- 바이트 매거진, 1978년 12월 페이지 108–122.조셉 와이스베커의 "A Easy Programming System".CHIP-8을 로켓선과 UFO 사격-갤러리 게임의 구체적인 예와 함께 설명한다.
- CHIP-8 및 관련 시스템 전용 Chip8.com 웹 사이트 아카이브.인터넷 상에서 가장 완벽한 칩-8 프로그램 모음 유지
- 원래의 CHIP-8 명령 집합에 대한 정확한 참조인 CHIP-8 마스터링
- David Winter의 CHIP-8 에뮬레이터, 유틸리티 및 게임.
- BytePusher CHIP-8에서 영감을 받은 미니멀리스트 가상 머신.
- 야후의[permanent dead link] RCA COSMAC 그룹, VIPER 매거진의 인증된 스캔이 있음.
- OChip8 브라우저의 CHIP-8 에뮬레이터
- Dream 6800 1979년 호주 일렉트로닉스(Electronics Australia)에서 선보인 인기 드림 6800 마이크로컴퓨터는 CHIP-8을 실행했다.
- FPGA 슈퍼칩 SHIP 규격의 베릴로그 구현.
- 옥토(Octo)는 Online CHIP-8 IDE, Development System, Compiler/Assembler 및 Emulator로, 전용 스크립트 언어를 가지고 있다.
- Cowgod의 Chip-8 기술 참조서(CHIP-48/SHIP)
- Matt Mikolay CHIP-8 Extensions 참조서
- CHIP-8.com CHIP-8 클래식 컴퓨터 설명서