mirror of
https://github.com/dschmenk/PLASMA.git
synced 2025-02-11 17:30:29 +00:00
Initial creation of the page. Only the simplest modes are explained. More to come.
parent
d81f9113cd
commit
3751afccb1
90
Variable-assignment-and-addressing-explained.md
Normal file
90
Variable-assignment-and-addressing-explained.md
Normal file
@ -0,0 +1,90 @@
|
||||
# Addressing modes explained
|
||||
|
||||
PLASMA has some interesting addressing modes that aren't entirely obvious at first.
|
||||
|
||||
The following examples assume this setup:
|
||||
```
|
||||
include "inc/cmdsys.plh"
|
||||
|
||||
var x
|
||||
word y
|
||||
byte a
|
||||
byte b
|
||||
|
||||
def phvar(str, value)
|
||||
puts(str)
|
||||
puth(value)
|
||||
putln()
|
||||
end
|
||||
```
|
||||
|
||||
## Simple assignment
|
||||
|
||||
We can do simple assignment like this:
|
||||
```
|
||||
x = 5
|
||||
phvar("x = 5 = ", x) // x = 5 = $0005
|
||||
y = $FF88
|
||||
phvar("y = $FF88 = ", y) // y = $FF88 = $FF88
|
||||
```
|
||||
Note that `x` is a word size, too, even though we don't see it here.
|
||||
|
||||
Here are simple assignments to byte-sized variables:
|
||||
```
|
||||
a = 66
|
||||
phvar("a = 66 = ", a) // a = 66 = $0042
|
||||
b = 307
|
||||
phvar("b = 307 = ", b) // b = 307 = $0033
|
||||
```
|
||||
Note that `b` overflows with no error.
|
||||
|
||||
## Pointers
|
||||
|
||||
Using `@` we can get the address of a variable:
|
||||
```
|
||||
y = @x
|
||||
phvar("y = @x = ", y) // y = @x = $200
|
||||
```
|
||||
|
||||
Using `*` we can get the value at an address contained by a variable. For example:
|
||||
```
|
||||
phvar("*y = ", *y) // y = $0005
|
||||
x = 10
|
||||
phvar("x = 10; *y = ", *y) // y = $000A
|
||||
```
|
||||
Because we changed the value of `x`, the value of `*y` changed as well.
|
||||
|
||||
Assignment can work the same way:
|
||||
```
|
||||
*y = $88FF
|
||||
phvar("*y = $88FF; x = ", x) // *y = $88FF; x = $88FF
|
||||
```
|
||||
Because we changed `*y`, we changed the value of `x`.
|
||||
|
||||
The same is true of byte-sized variables, but we use `^` instead of `*`.
|
||||
```
|
||||
x = @a
|
||||
phvar("x = @a = ", x) // x = @a = $0206
|
||||
y = @b
|
||||
phvar("y = @b = ", y) // y = @b = $0207
|
||||
|
||||
^x = $8F
|
||||
phvar("^x = $8F; a = ", a) // ^x = $8F; a = $008F
|
||||
^y = 555
|
||||
phvar("^y = 555; b = ", b) // ^y = 555; b = $002B
|
||||
```
|
||||
|
||||
But what if we address them wrong? What if we use `*` instead of `^`?
|
||||
```
|
||||
*x = $7799
|
||||
phvar("*x = $7799 = ", *x) // *x = $7799
|
||||
phvar("a = ", a) // a = $0099
|
||||
phvar("b = ", b) // b = $0077
|
||||
```
|
||||
This allows us to set both `a` and `b` at the same time.
|
||||
|
||||
What if we want to do that without using an intermediate variable? Can we use `*@a`?
|
||||
```
|
||||
phvar("*@a = ", *@a) // *@a = $0099
|
||||
phvar("*(@a) = ", *(@a)) // *(@a) = $7799
|
||||
```
|
Loading…
x
Reference in New Issue
Block a user