/ notation: . means don't push value on stack / binary and unary operator names are taken from B where possible / =. b1.: mov (sp)+,*(sp)+ jmp *(r5)+ / = b1: mov (sp)+,r0 mov r0,*(sp)+ mov r0,-(sp) jmp *(r5)+ / b=. b1b.: movb (sp)+,*(sp)+ jmp *(r5)+ / b= b1b: mov (sp)+,r0 movb r0,*(sp)+ mov r0,-(sp) jmp *(r5)+ / | b2: bis (sp)+,(sp) jmp *(r5)+ / & b3: com (sp) bic (sp)+,(sp) jmp *(r5)+ / == b4: cmp (sp)+,(sp)+ beq 1f clr -(sp) jmp *(r5)+ / != b5: cmp (sp)+,(sp)+ bne 1f clr -(sp) jmp *(r5)+ / <= b6: cmp (sp)+,(sp)+ bge 1f clr -(sp) jmp *(r5)+ / < b7: cmp (sp)+,(sp)+ bgt 1f clr -(sp) jmp *(r5)+ / >= b10: cmp (sp)+,(sp)+ ble 1f clr -(sp) jmp *(r5)+ / > b11: cmp (sp)+,(sp)+ blt 1f clr -(sp) jmp *(r5)+ 1: mov $1,-(sp) jmp *(r5)+ / >> b12: mov 2(sp),-(r3) sub (sp)+,*$lsh mov (r3)+,(sp) jmp *(r5)+ / << b13: mov 2(sp),(r3) mov (sp)+,*$lsh mov (r3),(sp) jmp *(r5)+ / + b14: / &b[i] vidxb: add (sp)+,(sp) jmp *(r5)+ / - b15: sub (sp)+,(sp) jmp *(r5)+ / % b16: mov 2(sp),(r3) mov (sp)+,*$div mov *$ac,(sp) jmp *(r5)+ / * b17: mov (sp)+,(r3)+ mov (sp)+,(r3) mov -(r3),-(sp) jmp *(r5)+ / / b20: mov 2(sp),(r3) mov (sp)+,*$div mov (r3),(sp) jmp *(r5)+ / neg u2: neg (sp) jmp *(r5)+ / *wp u3: mov *(sp)+,-(sp) jmp *(r5)+ / *bp u3b: movb *(sp)+,r0 mov r0,-(sp) jmp *(r5)+ / !u u4: tst (sp)+ bne 1f mov $1,-(sp) jmp *(r5)+ 1: clr -(sp) jmp *(r5)+ / ++b u5b: inc *(sp) mov *(sp)+,-(sp) jmp *(r5)+ / ++b. u5b.: u7b.: inc *(sp)+ jmp *(r5)+ / ++w u5: add $2,*(sp) mov *(sp)+,-(sp) jmp *(r5)+ / ++w. u5.: u7.: add $2,*(sp)+ jmp *(r5)+ / --b u6b: dec *(sp) mov *(sp)+,-(sp) jmp *(r5)+ / --b. u6b.: u10b.: dec *(sp)+ jmp *(r5)+ / --w u6: sub $2,*(sp) mov *(sp)+,-(sp) jmp *(r5)+ / --w. u6.: u10.: sub $2,*(sp)+ jmp *(r5)+ / b++ u7b: mov (sp)+,r0 mov (r0),-(sp) inc (r0) jmp *(r5)+ / w++ u7: mov (sp)+,r0 mov (r0),-(sp) add $2,(r0) jmp *(r5)+ / b-- u10b: mov (sp)+,r0 mov (r0),-(sp) dec (r0) jmp *(r5)+ / w-- u10: mov (sp)+,r0 mov (r0),-(sp) sub $2,(r0) jmp *(r5)+ / automatic a: mov (r5)+,r0 add r4,r0 mov (r0),-(sp) jmp *(r5)+ / &automatic va: mov (r5)+,-(sp) add r4,(sp) jmp *(r5)+ / automatic byte ab: / push auto byte mov (r5)+,r0 add r4,r0 movb (r0),r0 mov r0,-(sp) jmp *(r5)+ / external x: mov *(r5)+,-(sp) jmp *(r5)+ / &external, constant vx: c: mov (r5)+,-(sp) jmp *(r5)+ / constant byte xb: movb *(r5)+,r0 mov r0,-(sp) jmp *(r5)+ / w[i] idx: asl (sp) add (sp)+,(sp) mov *(sp)+,-(sp) jmp *(r5)+ / b[i] idxb: add (sp)+,(sp) movb *(sp)+,r0 mov r0,-(sp) jmp *(r5)+ / &w[i] vidx: asl (sp) add (sp)+,(sp) jmp *(r5)+ / byte to word offset/pointer w2b: asl (sp) jmp *(r5)+ / ... / 6 arg1 / 4 arg0 / 2 old r5 (ret) / 0 old r4 <- r4 / -2 ret / -4 ... / call function on stack call: mov (sp)+,r0 mov r5,-(sp) mov r4,-(sp) mov sp,r4 mov r0,r5 jsr pc,*(r5)+ mov r4,sp mov (sp)+,r4 mov (sp)+,r5 add (r5)+,sp mov r0,-(sp) jmp *(r5)+ call.: mov (sp)+,r0 mov r5,-(sp) mov r4,-(sp) mov sp,r4 mov r0,r5 jsr pc,*(r5)+ mov r4,sp mov (sp)+,r4 mov (sp)+,r5 add (r5)+,sp jmp *(r5)+ / return with value in r0 retval: mov (sp),r0 jmp *-2(r4) / go to address on stack goto: mov (sp)+,r5 jmp *(r5)+ / set stack pointer setstk: mov r4,r0 sub (r5)+,r0 mov r0,sp jmp *(r5)+ / init auto vector vec: mov r4,r0 sub (r5)+,r0 mov r0,sp mov r0,-(sp) jmp *(r5)+ / transfer t: mov (r5)+,r5 jmp *(r5)+ / transfer if false f: mov (r5)+,r0 tst (sp)+ bne 1f mov r0,r5 1: jmp *(r5)+ / switch sw: mov (r5)+,r5 mov (sp)+,r0 1: cmp r0,(r5)+ beq 1f tst (r5)+ bne 1b jmp *(r5)+ 1: mov (r5)+,r0 beq 1f mov r0,r5 1: jmp *(r5)+