📄 float.s,v
字号:
bra floate |return1$: movw #1,a0@@ |negative sign negl d0 |convert to positive2$: movl d0,a0@@(MANL) |move d0 to lower mantissa jsr offset |determine amount to shift jsr shift |shift mantissa addw #56,d0 |calculate exponent movw d0,a0@@(EXPT) |set exponentfloate: jsr itoe |convert to external float moveml sp@@+,#0xC |pop d2,d3 unlk a6 rts||add, subtract, compare two floating point numbers|d0,d1 return result of fadd,fsub operations|result of afadd,afaddf,afsub,afsubf stored|fcmp sets condition codes upon return| .globl fsub .globl fadd .globl fcmp .globl afadd .globl afsub .globl afaddf .globl afsubf .textfadd: link a6,#0 clrw d0 |flag to getargs jsr getargs |get arguments jsr add |perform addition unlk a6 rtsfsub: link a6,#0 clrw d0 |flag to getargs jsr getargs |get arguments eorw #1,a1@@ |reverse sign of b-arg jsr add |perform addition unlk a6 rtsfcmp: link a6,#0 clrw d0 |flag to getargs jsr getargs |get arguments eorw #1,a1@@ |reverse sign of b-arg jsr add |perform compare tstl d0 |set condition code unlk a6 rtsafadd: link a6,#0 moveq #1,d0 |flag to getargs jsr getargs |get arguments jsr add |perform addition movl a6@@(8),a0 |a0 points to where movl d0,a0@@+ | to store result movl d1,a0@@ | of operation unlk a6 rtsafsub: link a6,#0 moveq #1,d0 |flag to getargs jsr getargs |get arguments eorw #1,a1@@ |reverse sign of b-arg jsr add |perform addition movl a6@@(8),a0 |a0 points to where movl d0,a0@@+ | to store result movl d1,a0@@ | of operation unlk a6 rtsafaddf: link a6,#0 moveq #1,d0 |flag to getargs jsr getargs |get arguments clrl a0@@(MANL) |clear lower part of a-arg jsr add |perform addition movl a6@@(8),a0 |a0 points to where movl d0,a0@@ | to store result unlk a6 rtsafsubf: link a6,#0 moveq #1,d0 |flag to getargs jsr getargs |get arguments clrl a0@@(MANL) |clear lower part of a-arg eorw #1,a1@@ |reverse sign of b-arg jsr add |perform addition movl a6@@(8),a0 |a0 points to where movl d0,a0@@ | to store result unlk a6 rtsadd: moveml #0x3000,sp@@- |save d2,d3 movw a0@@(EXPT),d0 |compare movw a1@@(EXPT),d1 | exponents subw d1,d0 | of a and b bmi 1$ |a_expt < b_expt movl a1,a0 |switch a0 to point to bfloat jsr shift |shift mantissa of bfloat movl #afloat,a1 |switch a1 to point to afloat addw d0,a0@@(EXPT) |adjust b_expt accordingly bra 2$1$: negw d0 |make the shift count positive jsr shift |shift mantissa of afloat addw d0,a0@@(EXPT) |adjust a_expt accordingly2$: tstw a0@@ beq 3$ |a-arg is negative so negl d3 | negate mantissa negxl d2 | for addition3$: movl a1@@(MANH),d0 movl a1@@(MANL),d1 tstw a1@@ beq 4$ |b-arg is negative so negl d1 | negate mantissa negxl d0 | for addition4$: addl d1,d3 |perform addition of addxl d0,d2 | mantissas tstl d2 |check sign of result bge 5$ negl d3 |result is negative so negxl d2 | negate mantissa orw #1,a0@@ | and set sign bra adde5$: andw #0,a0@@ |result positiveadde: movl d2,a0@@(MANH) |store result movl d3,a0@@(MANL) | of computation jsr normal |normalize result jsr itoe |convert to external form moveml sp@@+,#0xC |pop d2,d3 rts||negate a floating number|argument on stack|d0,d1 return result| .globl fneg .textfneg: link a6,#0 movl a6@@(12),d1 |d1 = low part of float movl a6@@(8),d0 |d0 = high part of float bmi 1$ orl #0x80000000,d0 |turn high order bit on bra 2$1$: andl #0x7FFFFFFF,d0 |turn high order bit off2$: unlk a6 rts ||multiply two floating numbers|d0,d1 return result for fmul|result for afmul,afmulf stored| .globl fmul .globl afmul .globl afmulf .textfmul: link a6,#0 clrw d0 |flag to getargs jsr getargs |get arguments jsr mult |multiply arguments unlk a6 rtsafmul: link a6,#0 moveq #1,d0 |flag to getargs jsr getargs |get arguments jsr mult |perform multiply movl a6@@(8),a0 |a0 points to where movl d0,a0@@+ | to store result movl d1,a0@@ | of operation unlk a6 rtsafmulf: link a6,#0 moveq #1,d0 |flag to getargs jsr getargs |get arguments jsr mult |perform multiply movl a6@@(8),a0 |a0 points to where movl d0,a0@@ | to store result unlk a6 rtsmult: moveml #0x3C20,sp@@- |save d2-d5,a2 movw a1@@+,d0 |d0 = sign of b-arg eorw d0,a0@@+ |a_sign gets resultant sign movw a1@@+,d0 |d0 = exponent of b-arg addw d0,a0@@+ |a_expt gets sum of exponents clrl d2 |clear clrl d3 | summation registers clrl d5 | for multiply moveq #4,d4 |loop count addql #8,a1 |adjust a1 pointer movl #lsum,a2 |adjust a2 pointerl1$: movw a0@@+,d0 |high to low words of afloat movw a1@@-,d1 |low to high words of bfloat mulu d0,d1 |perform multiply addl d1,d3 addxl d5,d2 subqw #1,d4 bne l1$ movl d4,a2@@+ movl d2,a2@@+ movl d3,a2@@ clrl d2 clrl d3 moveq #3,d4 |loop count subql #2,a0 |adjust a0 pointer addql #2,a2 |adjust a2 pointerl2$: movw a0@@-,d0 |low to high of afloat movw a1@@+,d1 |high to low of bfloat mulu d0,d1 |perform multiply addl d1,d3 addxl d5,d2 subqw #1,d4 bne l2$ movl a2@@-,d1 movl a2@@-,d0 addl d1,d3 addxl d0,d2 movl d2,a2@@+ movl d3,a2@@ clrl d2 clrl d3 moveq #2,d4 |loop count subql #2,a1 |adjust a1 pointer addql #2,a2 |adjust a2 pointerl3$: movw a0@@+,d0 |high to low of afloat movw a1@@-,d1 |low to high of bfloat mulu d0,d1 addl d1,d3 addxl d5,d2 subqw #1,d4 bne l3$ movl a2@@-,d1 movl a2@@-,d0 addl d1,d3 addxl d0,d2 movl d2,a2@@+ movl d3,a2@@ subql #2,a0 |adjust a0 pointer addql #2,a2 |adjust a2 pointer movw a0@@-,d0 movw a1@@+,d1 mulu d0,d1 addl d1,a2@@-multe: addql #1,a2 |adjust a2 pointer movb a2@@+,a0@@+ |move result movb a2@@+,a0@@+ | to afloat movb a2@@+,a0@@+ movb a2@@+,a0@@+ movb a2@@+,a0@@+ movb a2@@+,a0@@+ movb a2@@+,a0@@+ movb a2@@+,a0@@+ subql #8,a0 |align a0 to point subql #4,a0 | to afloat jsr normal |normalize result jsr itoe |convert to external form moveml sp@@+,#0x43C |pop registers rts||divide two floating numbers| .globl fdiv .globl afdiv .globl afdivf .textfdiv: link a6,#0 clrl d0 |flag to getargs jsr getargs |get arguments jsr div |divide arguments unlk a6 rtsafdiv: link a6,#0 moveq #1,d0 |flag to getargs jsr getargs |get arguments jsr div |divide arguments movl a6@@(8),a0 |a0 points to where movl d0,a0@@+ | to store result movl d1,a0@@ | of operation unlk a6 rtsafdivf: link a6,#0 moveq #1,d0 |flag to getargs jsr getargs |get arguments jsr div |divide arguments movl a6@@(8),a0 |a0 points to where movl d0,a0@@ | to store result unlk a6 rtsdiv: moveml #0x3E00,sp@@- |save d2-d6 movw a1@@+,d0 |d0 = sign of b-arg eorw d0,a0@@+ |a-sign gets resultant sign movw a1@@+,d0 |d0 = exponent of b-arg subw d0,a0@@+ |a-expt gets diff of exponents movl a1@@+,d0 |d0 = divisor high bne ok |if divisor = 0 divu d0,d1 | cause trap and core dumpok: movl a1@@,d1 |d1 = divisor low movl a0@@+,d2 |d2 = dividend high movl a0@@,d3 |d3 = dividend low clrl d4 |clear quotient clrl d5 | register set moveq #58,d6 |setup shift count bra 2$1$: subqw #1,d6 |exit computation when beq dive | loop count = 0 movw #0x10,cc |set x-bit in ccr roxll #1,d5 |shift 1 into quotient roxll #1,d4 | accumulator registers roxll #1,d3 |continue shift into roxll #1,d2 | into remainder registers2$: subl d1,d3 |subtract divisor from subxl d0,d2 | remainder bge 1$3$: subqw #1,d6 |exit computation when beq dive | loop count = 0 asll #1,d5 |shift 0 into quotient roxll #1,d4 | accumulator registers roxll #1,d3 |continue shift into roxll #1,d2 | remainder registers addl d1,d3 |add divisor to addxl d0,d2 | remainder bge 1$ |positive -> shift 1 bra 3$ |negative -> shift 0dive: subql #4,a0 |align a0 to mantissa movl d4,a0@@+ |store quotient movl d5,a0@@ | into afloat mantissa subql #8,a0 |align a0 to afloat jsr normal |normalize mantissa jsr itoe |convert to external float moveml sp@@+,#0x7C |pop d2-d6 rts@
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -