Jumps can be implemented by manipulating the instruction pointer at memory location 0. Other special locations are as follows:
- accumulator
- always contains 0
- input
- output
Here's the code for the interpreter. I've included a Hello World program written in RSSB. If you think you can reduce the size of Hello World, please let me know how.
org rssbint
rssbint mov.ba >ip, ip ; load next instruction
mov #0, zero ; set zero
sne.a #3, ip ; handle input
lds in, 0
sne.a #4, ip ; handle output
sts acc, 0
mov acc, out
add out, out
slt *ip, acc ; set flag for skip
mov #2, skip
sub.b acc, *ip ; acc, *ip = *ip - acc
mov.b *ip, acc
skip djn noskip, #1 ; skip if required
nop >ip, >skip
noskip slt #7900, @ip ; protect interpreter
jmn rssbint, ip ; loop until ip = 0
; --------------------------------------
ip dat 5 ; instruction pointer
acc dat 0 ; accumulator
zero dat 0 ; always 0
in dat 0 ; character input
out dat 0 ; character output
; --------------------------------------
loop dat -ip+ acc ; acc = character from ptr
ptr dat -ip+ hello
dat -ip+ out ; display character
dat -ip+ zero ; acc = -acc
dat -ip+ zero ; always skipped
dat -ip+ sum ; subtract acc from sum
dat -ip+ ip ; skipped if sum is negative,
; otherwise jump to 0
one dat -ip+ acc ; subtract 1 from ptr
dat -ip+ one
dat -ip+ ptr
dat -ip+ acc ; jump to loop
dat -ip+ loopoff
dat -ip+ ip
loopoff dat -loop
sum dat -1116
dat 33 ; '!'
dat 100 ; 'd'
dat 108 ; 'l'
dat 114 ; 'r'
dat 111 ; 'o'
dat 87 ; 'W'
dat 32 ; ' '
dat 44 ; ','
dat 111 ; 'o'
dat 108 ; 'l'
dat 108 ; 'l'
dat 101 ; 'e'
hello dat 72 ; 'H'
end
No comments:
Post a Comment