CHIP -8 - CHIP-8

Skjermbilde av Pong implementert i CHIP-8
Telmac 1800 kjører CHIP-8 game Space Intercept (Joseph Weisbecker, 1978)

CHIP-8 er et tolket programmeringsspråk , utviklet av Joseph Weisbecker . Den ble opprinnelig brukt på COSMAC VIP og Telmac 1800 8-biters mikrodatamaskiner på midten av 1970-tallet. CHIP-8 programmer kjøres på en CHIP-8 virtuell maskin . Det ble laget for å gjøre det enklere å programmere videospill for disse datamaskinene, men CHIP 8 brukes fortsatt i dag, på grunn av sin enkelhet, og følgelig på hvilken som helst plattform og undervisning i programmering av binære tall.

Omtrent femten år etter at CHIP-8 ble introdusert, dukket det opp avledede tolker for noen modeller av grafkalkulatorer (fra slutten av 1980-tallet og fremover har disse håndholdte enhetene på mange måter mer datakraft enn de fleste midten av 1970-tallets mikrodatamaskiner for hobbyfolk).

Et aktivt fellesskap av brukere og utviklere eksisterte på slutten av 1970-tallet, og begynte med ARESCOs "VIPer" -nyhetsbrev hvis tre første utgaver avslørte maskinkoden bak CHIP-8-tolken.

CHIP-8 applikasjoner

Det er en rekke klassiske videospill som er portet til CHIP-8, for eksempel Pong , Space Invaders , Tetris og Pac-Man . Det er også applikasjoner som en tilfeldig labyrintgenerator og Conway's Game of Life .

CHIP-8 utvidelser og varianter

I løpet av 1970- og 1980-årene delte CHIP-8-brukere CHIP-8-programmer, men også endringer og utvidelser til tolken CHIP-8, i COSMAC VIP-brukernes nyhetsbrev, VIPER magazine. Disse utvidelsene inkluderte CHIP-10 og Hi-Res CHIP-8, som introduserte en høyere oppløsning enn standard 64x32, og CHIP-8C og CHIP-8X, som utvidet de monokrome skjermfunksjonene til å støtte begrenset farge, blant andre funksjoner. Disse utvidelsene var for det meste bakoverkompatible, ettersom de var basert på den opprinnelige tolken, selv om noen brukte sjelden brukte opkoder for nye instruksjoner.

I 1979 kjørte Electronics Australia en serie artikler om bygging av en datamaskin som ligner på COSMAC VIP, basert på Motorola 6800 -arkitekturen. Denne datamaskinen, DREAM 6800, kom med sin egen versjon av CHIP-8. Et nyhetsbrev som ligner VIPER, kalt DREAMER, ble brukt til å dele CHIP-8-spill for denne tolken. I 1981 kjørte Electronics Today International (ETI) en serie artikler om å bygge en datamaskin, ETI-660, som også var veldig lik VIP (og brukte den samme mikroprosessoren). ETI kjørte vanlige ETI-660 og generelle CHIP-8-kolonner frem til 1985.

I 1990 ble det laget en CHIP-8-tolk kalt CHIP-48 for grafikkalkulatorer for HP-48, slik at spill lettere kunne programmeres. Erik Bryntse opprettet senere en annen tolk basert på CHIP-48, kalt SCHIP, S-CHIP eller Super-Chip. SCHIP utvidet CHIP-8-språket med en større oppløsning og flere tilleggskoder som var ment å gjøre programmeringen enklere. Hvis det ikke var for utviklingen av CHIP-48-tolken, ville CHIP-8 ikke vært like kjent i dag.

David Winters emulator, demonteringsprogram og utvidet teknisk dokumentasjon populariserte CHIP-8/SCHIP på mange andre plattformer. Den la ut en komplett liste over udokumenterte opcoder og funksjoner, og ble distribuert på mange hobbyfora. Mange emulatorer brukte disse verkene som utgangspunkt.

CHIP-48 endret imidlertid subtilt semantikken til noen av opcodes, og SCHIP fortsatte å bruke den nye semantikken i tillegg til å endre andre opcodes. Mange elektroniske ressurser om CHIP-8 forplanter disse nye semantikkene, så mange moderne CHIP-8-spill er ikke bakoverkompatible med den originale CHIP-8-tolken for COSMAC VIP, selv om de ikke spesifikt bruker de nye SCHIP-utvidelsene.

CHIP-8 i dag

Det er en CHIP-8-implementering for nesten alle plattformer, samt noen utviklingsverktøy. Spill utvikles og katalogiseres fortsatt for CHIP-8 i dag, i tillegg til at eldre spill dukker opp igjen online i digitale arkiver.

Mens CHIP-8 og SCHIP ofte har blitt implementert som emulatorer , eksisterer det også en ren maskinvareimplementering (skrevet på Verilog- språket) for visse FPGA- kort.

Beskrivelse av virtuell maskin

Hukommelse

CHIP-8 ble oftest implementert på 4K-systemer, for eksempel Cosmac VIP og Telmac 1800. Disse maskinene hadde 4096 (0x1000) minnesteder, som alle er 8 bits (en byte ) som er hvor begrepet CHIP-8 stammer fra . Imidlertid opptar CHIP-8-tolken selv de første 512 byte av minneplassen på disse maskinene. Av denne grunn begynner de fleste programmene som er skrevet for det originale systemet på minnested 512 (0x200) og får ikke tilgang til noe av minnet under stedet 512 (0x200). De øverste 256 byte (0xF00-0xFFF) er reservert for skjermoppdatering, og de 96 byte under (0xEA0-0xEFF) var reservert for anropsstakken, intern bruk og andre variabler.

I moderne CHIP-8-implementeringer, der tolken kjører innfødt utenfor 4K-minneplassen, er det ikke nødvendig å unngå de lavere 512 byte minne (0x000-0x200), og det er vanlig å lagre skriftdata der.

Registre

CHIP-8 har 16 8- bits dataregistre oppkalt V0 til VF. VF -registeret fungerer som et flagg for noen instruksjoner; derfor bør det unngås. I en tilleggsoperasjon er VF bæreflagget , mens det i subtraksjon er "nei lån" -flagget. I trekningsinstruksjonen er VF satt til pikselkollisjon.

Adresseregisteret, som har navnet I, er 12 bits bredt og brukes med flere opcodes som involverer minneoperasjoner .

Stakken

Den stabel brukes bare til å lagre returadresser når subrutiner kalles. Den originale RCA 1802 -versjonen tildelte 48 byte for opptil 12 hekkingsnivåer; moderne implementeringer har vanligvis mer.

Tidtakere

CHIP-8 har to tidtakere. De teller begge ned til 60 hertz , til de når 0.

  • Delay timer: Denne timeren er beregnet på å brukes til å timing hendelsene i spill. Verdien kan settes og leses.
  • Lydtimer: Denne timeren brukes til lydeffekter. Når verdien er null, høres det en pipelyd.

Inngang

Inndata gjøres med et hex -tastatur som har 16 taster som varierer fra 0 til F. '8', '4', '6' og '2' tastene brukes vanligvis for retningsinngang. Tre opkoder brukes til å oppdage inngang. En hopper over en instruksjon hvis en bestemt tast trykkes, mens en annen gjør det samme hvis en bestemt tast ikke trykkes. Den tredje venter på et tastetrykk, og lagrer den deretter i et av dataregistrene.

Grafikk og lyd

Original CHIP-8 Skjermoppløsning er 64 × 32 piksler , og fargen er monokrom . Grafikk tegnes bare til skjermen ved å tegne sprites , som er 8 piksler brede og kan være fra 1 til 16 piksler i høyden. Sprite -piksler er XOR'd med tilsvarende skjermpiksler. Med andre ord, sprite -piksler som er angitt, vender fargen på den tilsvarende skjermpikslen, mens usettede sprite -piksler ikke gjør noe. Bæreflagget (VF) er satt til 1 hvis noen skjermpiksler vendes fra sett til ikke -satt når en sprite trekkes og settes til 0 ellers. Dette brukes til kollisjonsdeteksjon.

Som tidligere beskrevet spilles det av en pipelyd når verdien av lydtimeren er null.

Opcode -tabell

CHIP-8 har 35 opcodes , som alle er to byte lange og lagret big-endian . Opkodene er oppført nedenfor, i heksadesimal og med følgende symboler:

  • NNN: adresse
  • NN: 8-bits konstant
  • N: 4-bits konstant
  • X og Y: 4-biters registeridentifikator
  • PC: Programteller
  • I: 16 -biters register (For minneadresse) (ligner på tomromspeker);
  • VN: En av de 16 tilgjengelige variablene. N kan være 0 til F (heksadesimal);

Det har vært mange implementeringer av CHIP-8 instruksjonssett siden 1978. Følgende spesifikasjon er basert på SUPER-CHIP-spesifikasjonen fra 1991 (men uten de ekstra opkodene som gir utvidet funksjonalitet), ettersom det er det mest vanlige utvidelsessettet i dag . Fotnoter angir inkompatibilitet med det originale CHIP-8 instruksjonssettet fra 1978.

Opcode Type C Pseudo Forklaring
0NNN Anrop Ringer maskinkode -rutine ( RCA 1802 for COSMAC VIP) på adressen NNN. Ikke nødvendig for de fleste ROM -er.
00E0 Vise disp_clear() Fjerner skjermen.
00EE Strømme return; Returnerer fra en subrutine.
1NNN Strømme goto NNN; Hopper for å ta opp NNN.
2NNN Strømme *(0xNNN)() Ringer subrutine på NNN.
3XNN Cond if (Vx == NN) Hopper over neste instruksjon hvis VX er lik NN. (Vanligvis er neste instruksjon et hopp for å hoppe over en kodeblokk);
4XNN Cond if (Vx != NN) Hopper over neste instruksjon hvis VX ikke er lik NN. (Vanligvis er neste instruksjon et hopp for å hoppe over en kodeblokk);
5XY0 Cond if (Vx == Vy) Hopper over neste instruksjon hvis VX er lik VY. (Vanligvis er neste instruksjon et hopp for å hoppe over en kodeblokk);
6XNN Konst Vx = N Stiller VX til NN.
7XNN Konst Vx += N Legger til NN i VX. (Bæreflagget endres ikke);
8XY0 Assig Vx = Vy Setter VX til verdien av VY.
8XY1 BitOp Vx = Vx | Vy Angir VX til VX eller VY. (Bitvis ELLER drift);
8XY2 BitOp Vx = Vx & Vy Stiller VX til VX og VY. (Bitvis OG drift);
8XY3 BitOp Vx = Vx ^ Vy Setter VX å VX xor VY.
8XY4 Matte Vx += Vy Legger til VY til VX. VF er satt til 1 når det er en carry, og til 0 når det ikke er det.
8XY5 Matte Vx -= Vy VY trekkes fra VX. VF er satt til 0 når det er lån, og 1 når det ikke er.
8XY6 BitOp Vx >>= 1 Lagrer den minst signifikante biten av VX i VF og skifter deretter VX til høyre med 1.
8XY7 Matte Vx = Vy - Vx Angir VX til VY minus VX. VF er satt til 0 når det er lån, og 1 når det ikke er.
8XYE BitOp Vx <<= 1 Lagrer den mest betydningsfulle biten av VX i VF og flytter deretter VX til venstre med 1.
9XY0 Cond if (Vx != Vy) Hopper over neste instruksjon hvis VX ikke er lik VY. (Vanligvis er neste instruksjon et hopp for å hoppe over en kodeblokk);
ANNN MEM I = NNN Angir I til adressen NNN.
BNNN Strømme PC = V0 + NNN Hopper til adressen NNN pluss V0.
CXNN Rand Vx = rand() & NN Setter VX til resultatet av en bitvis og operasjon på et tilfeldig tall (vanligvis: 0 til 255) og NN.
DXYN Disp draw(Vx, Vy, N) Tegner en sprite ved koordinat (VX, VY) som har en bredde på 8 piksler og en høyde på N piksler. Hver rad med 8 piksler leses som bitkodet med utgangspunkt i minnested I; I -verdi endres ikke etter utførelsen av denne instruksjonen. Som beskrevet ovenfor, er VF satt til 1 hvis noen skjermpiksler vendes fra sett til deaktivert når sprite tegnes, og til 0 hvis det ikke skjer
EX9E KeyOp if (key() == Vx) Hopper over neste instruksjon hvis du trykker på tasten som er lagret i VX. (Vanligvis er neste instruksjon et hopp for å hoppe over en kodeblokk);
EXA1 KeyOp if (key() != Vx) Hopper over neste instruksjon hvis tasten som er lagret i VX ikke trykkes. (Vanligvis er neste instruksjon et hopp for å hoppe over en kodeblokk);
FX07 Timer Vx = get_delay() Stiller VX til verdien av forsinkelsestimeren.
FX0A KeyOp Vx = get_key() Et tastetrykk venter, og lagres deretter i VX. (Blokkering. All instruksjon stoppet til neste nøkkelhendelse);
FX15 Timer delay_timer(Vx) Angir forsinkelsestimeren til VX.
FX18 Lyd sound_timer(Vx) Angir lydtimeren til VX.
FX1E MEM I += Vx Legger til VX til I. VF påvirkes ikke.
FX29 MEM I = sprite_addr[Vx] Angir I til plasseringen av sprite for karakteren i VX. Tegn 0-F (i heksadesimal) er representert med en 4x5-skrift.
FX33 BCD
set_BCD(Vx)
*(I+0) = BCD(3);
*(I+1) = BCD(2);
*(I+2) = BCD(1);
Lagrer den binærkodede desimalrepresentasjonen for VX, med den mest betydningsfulle av tre sifre på adressen i I, det midterste sifferet ved I pluss 1 og det minst signifikante sifferet på I pluss 2. (Med andre ord, ta desimalrepresentasjonen av VX, plasser hundre sifferet i minnet på stedet i I, ti -tallet på stedet I+1, og de sifferet på stedet I+2.);
FX55 MEM reg_dump(Vx, &I) Lagrer V0 til VX (inkludert VX) i minnet som starter på adresse I. Offset fra I økes med 1 for hver skrevet verdi, men jeg selv er uendret.
FX65 MEM reg_load(Vx, &I) Fyller V0 til VX (inkludert VX) med verdier fra minnet som starter på adresse I. Forskyvningen fra I økes med 1 for hver skrevet verdi, men jeg selv er uendret.

Merknader

Referanser

Videre lesning

  • "RCA COSMAC VIP CDP18S711 Instruction Manual", RCA Solid State Division, Somerville, NJ 08776, februar 1978. Del VIP-311. s. 13–18, 35–37.
  • BYTE magazine , desember 1978 , s. 108–122. "Et enkelt programmeringssystem", av Joseph Weisbecker . Beskriver CHIP-8 med spesifikt eksempel på et rakettskip og UFO skyttegalleri.
  • Arkiv for Chip8.com nettsted dedikert til CHIP-8 og relaterte systemer. Opprettholder den mest komplette samlingen av CHIP-8-programmer på nettet.
  • Mastering CHIP-8 , en nøyaktig referanse til det originale CHIP-8 instruksjonssettet
  • David Winter's CHIP-8- emulator, verktøy og spill.
  • BytePusher En minimalistisk virtuell maskin inspirert av CHIP-8.
  • RCA COSMAC -gruppe på Yahoo , med autoriserte skanninger av VIPER -magasinet.
  • OChip8 En CHIP-8-emulator i en nettleser
  • Dream 6800 Den populære Dream 6800-datamaskinen som ble omtalt i Electronics Australia i 1979, kjørte CHIP-8.
  • FPGA SuperChip En Verilog -implementering av SCHIP -spesifikasjonen.
  • Octo er et online CHIP-8 IDE, utviklingssystem, kompilator/montør og emulator, med et proprietært skriptspråk
  • Cowgod's Chip-8 Technical Reference (CHIP-48/SCHIP)
  • Matt Mikolay CHIP-8 Extensions Reference
  • CHIP-8.com CHIP-8 Classic Computer Manual