/ / / rc -- complex arithmetic .globl c8c16 .globl c16c8 .globl i4c8 .globl r4c8 .globl r8c8 .globl i4c16 .globl r4c16 .globl r8c16 .globl cad8 .globl csb8 .globl cmp8 .globl cdv8 .globl cng8 .globl cad16 .globl csb16 .globl cmp16 .globl cdv16 .globl cng16 .globl rval16 .globl rval16p .globl gas16 .globl ceq8 .globl cne8 .globl ceq16 .globl cne16 .globl cpi8 .globl cpi16 one = 040200 a = r2 b = r3 c = r4 d = r5 e = r0 f = r1 gas16: mov 16.(sp),r0 setd movf (sp)+,a movf (sp)+,b tst (sp)+ movf a,(r0)+ movf b,(r0)+ jmp *(r4)+ rval16p: mov r3,r0 add (r4)+,r0 mov (r0),r0 br 1f rval16: mov (r4)+,r0 1: setd movf (r0)+,a movf (r0)+,b movf b,-(sp) movf a,-(sp) jmp *(r4)+ cad16: setd br 1f cad8: setf 1: jsr pc,garg addf a,e addf b,f br sarg csb16: setd br 1f csb8: setf 1: jsr pc,garg subf a,e negf e subf b,f negf f br sarg cmp16: setd br 1f cmp8: setf 1: jsr pc,garg mulf a,e mulf b,f subf f,e mulf d,a mulf c,b movf a,f addf b,f sarg: movf f,-(sp) movf e,-(sp) jmp *(r4)+ cdv16: setd br 1f cdv8: setf 1: divide: jsr pc,garg absf e absf f cmpf e,f cfcc blt 1f / algorithm #1 |c| > |d| movf d,e divf c,e / r = d/c movf d,f mulf e,f addf c,f / x = c+rd movf f,c movf a,f mulf e,f negf f addf b,f mulf b,e addf a,e divf c,e divf c,f br sarg / algorithm #2 |c| < |d| 1: movf c,e divf d,e / r = c/d movf c,f mulf e,f addf d,f / x = d+rc movf f,c movf b,f mulf e,f subf a,f mulf a,e addf b,e divf c,e divf c,f br sarg cng16: setd br 1f cng8: setf 1: movf (sp)+,a negf a negf (sp) movf a,-(sp) jmp *(r4)+ / setup the following registers / (a,bi) +o (c,di) -> (e+fi) / a,b,c,d are input / e,f are output and also contain / c,d on input garg: mov (sp)+,r0 movf (sp)+,e movf e,c movf (sp)+,f movf f,d movf (sp)+,a movf (sp)+,b jmp (r0) i4c8: setf br 1f i4c16: setd 1: setl movif (sp)+,fr0 br 2f r4c8: setf br 1f r8c16: setd 1: movf (sp)+,fr0 br 2f r4c16: setd br 1f r8c8: setf 1: movof (sp)+,fr0 2: clrf -(sp) movf fr0,-(sp) jmp *(r4)+ c16c8: setd br 1f c8c16: setf 1: movf (sp)+,r0 movf (sp)+,r1 movfo r1,-(sp) movfo r0,-(sp) jmp *(r4)+ ceq16: setd br 1f ceq8: setf 1: mov $1,r1 br 2f cne16: setd br 1f cne8: setf 1: clr r1 2: jsr pc,garg cmpf c,a cfcc bne 1f cmpf d,b cfcc beq 2f 1: inc r1 bic $2,r1 2: mov r1,-(sp) jmp *(r4)+ cpi8: setf br 1f cpi16: setd 1: clr r0 tst (sp)+ mov (sp)+,r1 bge 1f inc r0 neg r1 1: movf (sp)+,fr0 movf fr0,fr4 movf (sp)+,fr0 movf fr0,fr5 movf $one,fr0 clrf fr1 1: dec r1 bmi 1f movf fr0,fr2 movf fr1,fr3 mulf fr4,fr0 mulf fr4,fr1 mulf fr5,fr2 mulf fr5,fr3 subf fr3,fr0 addf fr2,fr1 br 1b 1: tst r0 beq 1f clrf -(sp) movf $one,fr2 movf fr2,-(sp) movf fr1,-(sp) movf fr0,-(sp) jmp divide 1: movf fr1,-(sp) movf fr0,-(sp) jmp *(r4)+