# Programmeren in TI-83+ Assembly/Speciaal/De instructieset

Hieronder vind je een overzicht van alle processor-instructies die in dit boek gebruikt worden.

## Registers en data
### ld

ld kopieert een getal of de inhoud van een register naar een ander register. ld roep je aan met
(reg) is hierbij het register waarnaar gekopieerd kan worden, (waarde) is de waarde die hierin gezet moet worden. Deze waarde kan zijn:
* Een getal. Als (reg) een 8-bit-register is dan kan het getal 0 t/m 255 zijn, als (reg) daarentegen een 16-bit-register is dan kan het getal 0 t/m 65536 zijn.
* Een 8-bit-register. Dan moet (reg) natuurlijk ook een 8-bit-register zijn.
* Een 16-bit-register. Dan moet (reg) natuurlijk ook een 16-bit-register zijn.
Verder kan (reg) ook een geheugenadres zijn (dit dient tussen haakjes te worden gezet). Als (waarde) dan een 8-bit-register is, dan wordt de desbetreffende byte in het geheugen beschreven. Als (waarde) een 16-bit-register is, dan wordt niet alleen de opgegeven byte van het geheugen beschreven, maar ook de eerstvolgende. Let daarop bij het toekennen van geheugen. Bij het schrijven naar geheugenadressen is het niet mogelijk om direct een getal op te geven.
Hieronder een tabel van wat wel en niet mogelijk is. In de rijen staat de (reg), in de kolommen staat de (waarde); in de cel op de kruising van deze kolom en rij zie je of dit commando mogelijk is.
| | 8-bit-reg. | 16-bit-reg. | 8-bit-getal | 16-bit-getal |
| 8-bit-register | Mogelijk | Niet mogelijk | Mogelijk | Niet mogelijk |
| 16-bit-register | Soms mogelijk | Niet mogelijk | Niet mogelijk | Mogelijk |
| Geheugenadres | Alleen vanuit a | Mogelijk | Niet mogelijk | Niet mogelijk |
Voorbeelden:
zet het getal 2 in het register a.
zet het getal 3 in het register hl.

### ex

ex wisselt twee registers om. ex roep je aan met
Te doen: kan ex ook op 16-bit-registers?

### ldir
## Logische instructies

Er zijn vier logische instructies.

### and

and vergelijkt van twee registers (a en een ander register) iedere bit. Als beide bits aan zijn, gaat in de uitvoer de bit ook aan. De uitvoer wordt dan in a opgeslagen. and roep je aan met
met (reg) is een 8-bit-register en natuurlijk niet a. Je mag ook direct een getal opgeven. Aangezien het eerste register toch altijd a is, hoef je dit niet door te geven.
Voorbeeld: a=23 (=00010111) en b=11 (=00001011). and b geeft dat a=00000011.

### or

or vergelijkt van twee registers (a en een ander register) iedere bit. Als minstens één van beide bits aan is, gaat in de uitvoer de bit ook aan. De uitvoer wordt dan in a opgeslagen. or roep je aan met
met (reg) is een 8-bit-register en natuurlijk niet a. Je mag ook direct een getal opgeven. Aangezien het eerste register toch altijd a is, hoef je dit niet door te geven.
Voorbeeld: a=23 (=00010111) en b=11 (=00001011). or b geeft dat a=00011111.

### xor

xor vergelijkt van twee registers (a en een ander register) iedere bit. Als één van beide bits aan is (dus níét als ze allebei aan zijn), gaat in de uitvoer de bit ook aan. De uitvoer wordt dan in a opgeslagen. xor roep je aan met
met (reg) is een 8-bit-register en natuurlijk niet a. Je mag ook direct een getal opgeven. Aangezien het eerste register toch altijd a is, hoef je dit niet door te geven.
Voorbeeld: a=23 (=00010111) en b=11 (=00001011). xor b geeft dat a=00011100.

### cpl

cpl neemt register a en draait ieder bit om (0 wordt 1 en 1 wordt 0). De uitvoer wordt dan in a opgeslagen. cpl roep je aan met
Aangezien het register toch altijd a is, hoef je dit niet door te geven.
Voorbeeld: a=23 (=00010111). cpl geeft dat a=11101000.

## Bit-instructies

Er zijn drie bit-instructies. Met deze instructies is het mogelijk om bepaalde bits in een register te veranderen.

### set

set zet een bit van een bepaald register op 1. set roep je aan met
(reg) is een register of (hl).

### res

res zet een bit van een bepaald register op 0. res roep je aan met
(reg) is een register of (hl).

### bit

bit kijkt naar de waarde van een bit van een bepaald register. Als deze 1 is, gaat de zero-vlag aan. Anders gaat deze uit. bit roep je aan met
(reg) is een register of (hl).

## Controle

Met deze controle-instructies kan er gesprongen worden in het programma.

### jp

jp springt naar een bepaald adres in het geheugen. Hier gaat de uitvoering van het programma dan verder. jp roep je aan met
of
Bij de laatste variant vervangt TASM het label automatisch door het bijbehorende geheugenadres.

### jr

jr springt ook naar een andere plaats in het programma, maar nu 128 bytes naar voren of naar achter. jr roep je aan met
TASM kijkt nu hoeveel bytes het label verwijderd is van de jr-instructie en voegt dat in. Let op: het label waartoe gesprongen wordt, mag niet verder weg zijn van de jr-instructie dan 128 bytes, anders geeft TASM een foutmelding.

### ret

Geeft de controle terug aan het TI-OS of keert terug naar de hoofdfunctie. Deze gebruik je na een call instructie

## De stack
### push

Stopt een registerpaar op de stack

### pop

Haalt de bovenste 16-bits van de stack en stop deze in het aangegeven register. pop [register], zonder de