/slede8

🛷🛷🛷🛷🛷🛷🛷🛷

Primary LanguageTypeScriptMIT LicenseMIT

SLEDE8

Introduksjon

Det finnes totalt 16 8-biters registre, r0..r15. Her kan du mellomlagre data som skal behandles. I tillegg benyttes et flagg som representerer resultatet av sammenligningsoperasjoner, og som er bestemmer om programmet skal utføre betingede hopp.

Tilgjengelig minne er 4096 bytes, med adressene 0..4095. Programmer lastes inn fra addresse 0, slik at første instruksjon alltid vil ha addresse 0.

SLEDE8 forholder seg til binærdata som little endian.

Gramatikk

Programmer skrives med s8-assembly (.s8asm) og monteres til binærfiler (.s8). I s8-assembly kan en linje være en merkelapp, instruksjon, data eller en kommentar. Kommentarer kan også legges til etter en instruksjon. Blanke linjer blir ignorert.

Kommentarer

En kommentar begynner tegnet ;. Kommentarer blir ignorert når programmet monteres.

Eksempel (prøv selv):

; en kommentar
NOPE ; en annen kommentar

Merkelapper

En merkelapp er en linje på formen ^[0-9a-zA-ZæøåÆØÅ\-_]+:$. Merkelapper er referanser til addressen til den påfølgende instruksjonen eller dataen i koden. De kan benyttes som argument ved hopp eller hvis man skal ta en tur.

For eksempler, se avsittet om programflyt.

Instruksjoner

Følgende instruksjoner er tilgjengelig:

SETT rA, rB

Skriv verdien i rB til rA.

SETT rA, <verdi>

Skriv verdien til register rA. Verdier skrives på formen 0xNN eller NN.

NOPE

Ikke gjør noe som helst.

STOPP

Avslutt programmet.

Aritmetisk Logisk Enhet

ALE-operasjoner tar to registere som argument. Resultatet skrives til det første registeret.

  • OG rA, rB
  • ELLER rA, rB
  • XELLER rA, rB
  • VSKIFT rA, rB
  • HSKIFT rA, rB
  • PLUSS rA, rB
  • MINUS rA, rB

OBS: Aritmetiske operasjoner er modulo 0x100.

Eksempel (prøv selv):

SETT r0, 128   ; r0 = 128 (0x80)
SETT r1, 0xb   ; r1 =  11 (0x0b)

PLUSS r0, r1   ; r0 = r0 + r1
MINUS r0, r1   ; r0 = r0 - r1
OG r0, r1      ; r0 = r0 & r1
ELLER r0, r1   ; r0 = r0 | r1
XELLER r0, r1  ; r0 = r0 ^ r1
VSKIFT r0, r1  ; r0 = r0 << r1
HSKIFT r0, r1  ; r0 = r0 >> r1

STOPP

Sammenligning

Sammenligningsoperasjoner tar to registere som argument. Resultatet persisteres i flag frem til neste sammenligningsoperasjon.

  • LIK rA, rB
  • ULIK rA, rB
  • ME rA, rB
  • MEL rA, rB
  • SE rA, rB
  • SEL rA, rB

Eksempel (prøv selv):

SETT r0, 5   ; r0 = 5
SETT r1, 10  ; r1 = 10

LIK r0, r1   ; r0 == r1 => flag = 0 (false)
ULIK r0, r1  ; r0 != r1 => flag = 1 (true)
ME r0, r1    ; r0 <  r1 => flag = 1 (true)
MEL r0, r1   ; r0 <= r1 => flag = 1 (true)
SE r0, r1    ; r0 >  r1 => flag = 0 (false)
SEL r0, r1   ; r0 >= r1 => flag = 0 (false)

STOPP

Programflyt

Noen ganger ønsker man å gjøre mer enn å kjøre hver instruksjon én gang fra top til bunn. SLEDE8 dekker dette behovet ved å støtte to typer hopp.

  • HOPP adresse
  • HOPP merkelapp
  • BHOPP adresse
  • BHOPP merkelapp

En HOPP operasjon hopper til den valgte adressen, mens BHOPP kun hopper hvis flagget er satt til 1 etter en tidligere sammenligningsoperasjon.

Merk: En merkelapp er kun en referanse til en adresse, og vil derfor bli erstattet med en adresse i den monterte binærfila. Det kan likevel være enklere som utvikler å forholde seg til merkelapper.

Merk: Man kan hoppe både oppover og nedover i koden.

Eksempel (prøv selv):

SETT r0, 0 ; r0 = 0
SETT r1, 1 ; r1 = 1

LIK r0, r1        ; r0 == r1 => flag = 0 (false)
BHOPP merkelapp01 ; hopper ikke, siden flag = 0
LIK r0, r0        ; r0 == r0 => flag = 1 (true)
BHOPP merkelapp01 ; hopp til merkelapp01 siden flag == 1
STOPP             ; denne instruksjonen blir hoppet over

merkelapp01:
HOPP merkelapp02  ; hopp til merkelapp02
STOPP             ; denne instruksjonen blir hoppet over

merkelapp02:
STOPP             ; programmet stopper her

Føde og oppgulp

Man kan gi programmet føde ved å benytte instruksjonen LES rN. Dette flytter første ikke-konsumerte byte med føde inn i det valgte registeret, men forutsetter at det er føde igjen. Programmet slutter å samarbeide hvis det oppdager at det har gått tom for føde.

Programmet kan gi oppgulp ved å benytte instruksjonen SKRIV rN. Verdien i det valgte registeret blir da spyttet ut.

Merk: Man behøver ikke konsumere føde for å produsere oppgulp!

Merk: På slede8.npst.no presenteres føde til programmet som en hex-streng.

Eksempel (prøv selv):

; med føde lik '4243' gulper dette opp 'ABC'

SETT r0, 0x41  ; r0 = 0x41
SKRIV r0       ; skriv 0x41 ('A')
LES r0         ; r0 = 0x41
SKRIV r0       ; skriv 0x42 ('B')
LES r0         ; r0 = 0x43
SKRIV r0       ; skriv 0x43 ('C')
STOPP          ; avslutt før vi går tom for føde

Funksjoner

Man kan ta en tur til en adresse eller merkelapp ved å benytte funksjonen TUR adresse Når man er lei av å være på tur kan man returnere til avreiseadressen ved å benytte instruksjonen RETUR

Merk: Merkelapper kan også benyttes som argument når man tar en TUR.

FINN <merkelapp | adresse>

Skriv adressen til merkelappen til r0 og r1. Mest signifikante bit (msb) skrives til r1, og minst signifikante bit (msb) skrives til r0. Hvis addressen er 0xABC blir dermed r0 satt til 0xBC og r1 til 0x0A.

LAST rN

Skriv verdien fra addressen ((r1 << 8) | r0) & 0x0FFF til registeret rN.

LAGR rN

Skriv verdien i registeret rN til addressen ((r1 << 8) | r0) & 0x0FFF.

Data

Man kan representere data ved å skrive linjer formen ^.DATA [x0-9a-fA-F, ]*$. For å skrive inn data (ev. instruksjonsbytes) bruker man altså ".DATA" etterfulgt av en komma-separert liste med tall. Typisk vil man også putte en merkelapp rett før.

Man får mest glede av denne muligheten hvis den benyttes sammen med FINN og LAST.

Eksempel:

MinStreng:
.DATA 0x48,0x65,0x6c,0x6c,0x6f,0x2c,0x20,0x77,0x6f,0x72,0x6c,0x64