mirror of
https://github.com/SEPPDROID/Digital-Research-Source-Code.git
synced 2025-10-23 08:24:18 +00:00
150 lines
1.9 KiB
ArmAsm
150 lines
1.9 KiB
ArmAsm
*#include <portab.h>
|
|
*long uldivr = 0;
|
|
*
|
|
*
|
|
*long uldiv(al1,al2) /* unsigned long divide */
|
|
*long al1,al2;
|
|
*{
|
|
*
|
|
*#ifdef ALCYON
|
|
* register long l1,l2;
|
|
* /* you must modify comparisons in the assembler file
|
|
* * for this routine to work.
|
|
* */
|
|
*#else
|
|
* register unsigned long l1, l2;
|
|
*#endif
|
|
* register long q, b;
|
|
*
|
|
* l1 = al1;
|
|
* l2 = al2;
|
|
* if(l2==0) {
|
|
* uldivr = 0x80000000;
|
|
* return(0x80000000);
|
|
* }
|
|
* if(l2 > l1) { /** comparison (ble->bls) **/
|
|
* uldivr = l1;
|
|
* return(0);
|
|
* }
|
|
* if(l1==l2) {
|
|
* q = 1;
|
|
* l1 = 0;
|
|
* goto doret;
|
|
* }
|
|
* b = 1; /* bit value */
|
|
* while(l1>=l2) { /** comparison (blt->blo) **/
|
|
* if( l2 > (l2<<1) ) /** comparison (bgt->bhi) **/
|
|
* break; /* detect overflow */
|
|
* l2 =<< 1;
|
|
* b =<< 1;
|
|
* }
|
|
* q = 0;
|
|
* while(b) { /* now do shifts and subtracts */
|
|
* if(l1>=l2) { /** comparison (blt->blo) **/
|
|
* q =| b;
|
|
* l1 =- l2;
|
|
* }
|
|
* b =>> 1;
|
|
* l2 =>> 1;
|
|
* }
|
|
*doret:
|
|
* uldivr = l1;
|
|
* return(q);
|
|
*}
|
|
*
|
|
*
|
|
.globl _uldivr
|
|
.data
|
|
_uldivr:
|
|
.dc.w 0,0
|
|
.globl _uldiv
|
|
.text
|
|
_uldiv:
|
|
~~uldiv:
|
|
~b=R4
|
|
~q=R5
|
|
~l1=R7
|
|
~l2=R6
|
|
~al1=8
|
|
~al2=12
|
|
link R14,#0
|
|
movem.l R3-R7,-(sp)
|
|
*line 20
|
|
move.l 8(R14),R7
|
|
*line 21
|
|
move.l 12(R14),R6
|
|
*line 22
|
|
tst.l R6
|
|
bne L2
|
|
*line 23
|
|
move.l #$80000000,_uldivr
|
|
*line 24
|
|
move.l #$80000000,R0
|
|
bra L1
|
|
L2:
|
|
*line 26
|
|
cmp.l R7,R6
|
|
bls L3 *<<<<< ble
|
|
*line 27
|
|
move.l R7,_uldivr
|
|
*line 28
|
|
clr.l R0
|
|
bra L1
|
|
L3:
|
|
*line 30
|
|
cmp.l R6,R7
|
|
bne L4
|
|
*line 31
|
|
move.l #1,R5
|
|
*line 32
|
|
clr.l R7
|
|
bra L5
|
|
L4:
|
|
*line 35
|
|
move.l #1,R4
|
|
L7:
|
|
*line 36
|
|
cmp.l R6,R7
|
|
blo L6 *<<<< blt
|
|
*line 38
|
|
move.l R6,R0
|
|
asl.l #1,R0
|
|
cmp.l R0,R6
|
|
bhi L6 *<<<< bgt
|
|
*line 39
|
|
asl.l #1,R6
|
|
*line 40
|
|
asl.l #1,R4
|
|
bra L7
|
|
L6:
|
|
*line 42
|
|
clr.l R5
|
|
L9:
|
|
*line 43
|
|
tst.l R4
|
|
beq L8
|
|
*line 44
|
|
cmp.l R6,R7
|
|
blo L10 *<<<< blt
|
|
*line 45
|
|
or.l R4,R5
|
|
*line 46
|
|
sub.l R6,R7
|
|
L10:
|
|
*line 48
|
|
lsr.l #1,R4 *<<<< asr
|
|
*line 49
|
|
lsr.l #1,R6 *<<<< asr
|
|
bra L9
|
|
L8:L5:
|
|
*line 52
|
|
move.l R7,_uldivr
|
|
*line 53
|
|
move.l R5,R0
|
|
bra L1
|
|
L1:tst.l (sp)+
|
|
movem.l (sp)+,R4-R7
|
|
unlk R14
|
|
rts
|
|
.data
|