Home » Archimedes archive » Acorn User » AU 1993-06.adf » !ArmCode_ArmCode » Arm2

Arm2

This website contains an archive of files for the Acorn Electron, BBC Micro, Acorn Archimedes, Commodore 16 and Commodore 64 computers, which Dominic Ford has rescued from his private collection of floppy disks and cassettes.

Some of these files were originally commercial releases in the 1980s and 1990s, but they are now widely available online. I assume that copyright over them is no longer being asserted. If you own the copyright and would like files to be removed, please contact me.

Tape/disk: Home » Archimedes archive » Acorn User » AU 1993-06.adf » !ArmCode_ArmCode
Filename: Arm2
Read OK:
File size: 0711 bytes
Load address: 0000
Exec address: 0000
File contents
   10REM     >Arm2
   20REM     Divide routine
   30REM By  Dave Lawrence
   40REM For 32-bit machines
   50REM (c) BAU June 1993
   60:
   70DIM code 1000
   80top=0
   90bot=1
  100result=2
  110sign=3
  120bit=4
  130sp=13
  140link=14
  150pc=15
  160FOR pass=0 TO 2 STEP 2:P%=code
  170[OPT pass
  180.divide
  190        STMFD   (sp)!,{result,sign,bit}
  200        MOV     result,#0
  210        MOV     bit,#1
  220        EOR     sign,top,bot
  230        CMP     bot,#0
  240        RSBMI   bot,bot,#0
  250        CMP     top,#0
  260        RSBMI   top,top,#0
  270        CMP     top,#2^24
  280        BLT     skip1
  290        FNdiv(31)
  300        FNdiv(30)
  310        FNdiv(29)
  320        FNdiv(28)
  330        FNdiv(27)
  340        FNdiv(26)
  350        FNdiv(25)
  360.skip1
  370        CMP     top,#2^16
  380        BLT     skip2
  390        FNdiv(24)
  400        FNdiv(23)
  410        FNdiv(22)
  420        FNdiv(21)
  430        FNdiv(20)
  440        FNdiv(19)
  450        FNdiv(18)
  460        FNdiv(17)
  470.skip2
  480        CMP     top,#2^8
  490        BLT     skip3
  500        FNdiv(16)
  510        FNdiv(15)
  520        FNdiv(14)
  530        FNdiv(13)
  540        FNdiv(12)
  550        FNdiv(11)
  560        FNdiv(10)
  570        FNdiv(9)
  580        FNdiv(8)
  590.skip3
  600        FNdiv(7)
  610        FNdiv(6)
  620        FNdiv(5)
  630        FNdiv(4)
  640        FNdiv(3)
  650        FNdiv(2)
  660        FNdiv(1)
  670        FNdiv(0)
  680.donediv
  690        MOV     top,result
  700        CMP     sign,#0
  710        RSBMI   top,top,#0
  720        LDMFD   (sp)!,{result,sign,bit}
  730
  740        MOV     pc,link
  750]NEXT
  760REPEAT
  770 INPUT "Two numbers "A%,B%
  780 PRINT USR(code),A% DIV B%
  790UNTIL FALSE
  800:
  810DEF FNdiv(it)
  820IF it>0 THEN
  830[OPT pass
  840CMP     bot,top,LSR #it
  850ORRLE   result,result,bit,ASL #it
  860SUBLE   top,top,bot,ASL #it
  870]
  880ELSE
  890[OPT pass
  900CMP     bot,top
  910ORRLE   result,result,#1
  920SUBLE   top,top,bot
  930]
  940ENDIF
  950=""

�     >Arm2
�     Divide routine
� By  Dave Lawrence
(� For 32-bit machines
2� (c) BAU June 1993
<:
F� code 1000
P	top=0
Z	bot=1
dresult=2
n
sign=3
x	bit=4
�	sp=13
�link=14
�	pc=15
�� pass=0 � 2 � 2:P%=code
�
[OPT pass
�.divide
�+        STMFD   (sp)!,{result,sign,bit}
�        MOV     result,#0
�        MOV     bit,#1
�        �     sign,top,bot
�        CMP     bot,#0
�        RSBMI   bot,bot,#0
�        CMP     top,#0
        RSBMI   top,top,#0
        CMP     top,#2^24
        BLT     skip1
"        �div(31)
,        �div(30)
6        �div(29)
@        �div(28)
J        �div(27)
T        �div(26)
^        �div(25)
h
.skip1
r        CMP     top,#2^16
|        BLT     skip2
�        �div(24)
�        �div(23)
�        �div(22)
�        �div(21)
�        �div(20)
�        �div(19)
�        �div(18)
�        �div(17)
�
.skip2
�        CMP     top,#2^8
�        BLT     skip3
�        �div(16)
�        �div(15)
        �div(14)
        �div(13)
        �div(12)
&        �div(11)
0        �div(10)
:        �div(9)
D        �div(8)
N
.skip3
X        �div(7)
b        �div(6)
l        �div(5)
v        �div(4)
�        �div(3)
�        �div(2)
�        �div(1)
�        �div(0)
�.donediv
�        MOV     top,result
�        CMP     sign,#0
�        RSBMI   top,top,#0
�+        LDMFD   (sp)!,{result,sign,bit}
�
�        MOV     pc,link
�]�
��
 � "Two numbers "A%,B%
 � �(code),A% � B%
� �
 :
*� �div(it)
4� it>0 �
>
[OPT pass
HCMP     bot,top,LSR #it
R$�RLE   result,result,bit,ASL #it
\SUBLE   top,top,bot,ASL #it
f]
p�
z
[OPT pass
�CMP     bot,top
��RLE   result,result,#1
�SUBLE   top,top,bot
�]
��
�=""
�
00000000  0d 00 0a 0f f4 20 20 20  20 20 3e 41 72 6d 32 0d  |.....     >Arm2.|
00000010  00 14 18 f4 20 20 20 20  20 44 69 76 69 64 65 20  |....     Divide |
00000020  72 6f 75 74 69 6e 65 0d  00 1e 17 f4 20 42 79 20  |routine..... By |
00000030  20 44 61 76 65 20 4c 61  77 72 65 6e 63 65 0d 00  | Dave Lawrence..|
00000040  28 19 f4 20 46 6f 72 20  33 32 2d 62 69 74 20 6d  |(.. For 32-bit m|
00000050  61 63 68 69 6e 65 73 0d  00 32 17 f4 20 28 63 29  |achines..2.. (c)|
00000060  20 42 41 55 20 4a 75 6e  65 20 31 39 39 33 0d 00  | BAU June 1993..|
00000070  3c 05 3a 0d 00 46 0f de  20 63 6f 64 65 20 31 30  |<.:..F.. code 10|
00000080  30 30 0d 00 50 09 74 6f  70 3d 30 0d 00 5a 09 62  |00..P.top=0..Z.b|
00000090  6f 74 3d 31 0d 00 64 0c  72 65 73 75 6c 74 3d 32  |ot=1..d.result=2|
000000a0  0d 00 6e 0a 73 69 67 6e  3d 33 0d 00 78 09 62 69  |..n.sign=3..x.bi|
000000b0  74 3d 34 0d 00 82 09 73  70 3d 31 33 0d 00 8c 0b  |t=4....sp=13....|
000000c0  6c 69 6e 6b 3d 31 34 0d  00 96 09 70 63 3d 31 35  |link=14....pc=15|
000000d0  0d 00 a0 1c e3 20 70 61  73 73 3d 30 20 b8 20 32  |..... pass=0 . 2|
000000e0  20 88 20 32 3a 50 25 3d  63 6f 64 65 0d 00 aa 0d  | . 2:P%=code....|
000000f0  5b 4f 50 54 20 70 61 73  73 0d 00 b4 0b 2e 64 69  |[OPT pass.....di|
00000100  76 69 64 65 0d 00 be 2b  20 20 20 20 20 20 20 20  |vide...+        |
00000110  53 54 4d 46 44 20 20 20  28 73 70 29 21 2c 7b 72  |STMFD   (sp)!,{r|
00000120  65 73 75 6c 74 2c 73 69  67 6e 2c 62 69 74 7d 0d  |esult,sign,bit}.|
00000130  00 c8 1d 20 20 20 20 20  20 20 20 4d 4f 56 20 20  |...        MOV  |
00000140  20 20 20 72 65 73 75 6c  74 2c 23 30 0d 00 d2 1a  |   result,#0....|
00000150  20 20 20 20 20 20 20 20  4d 4f 56 20 20 20 20 20  |        MOV     |
00000160  62 69 74 2c 23 31 0d 00  dc 1e 20 20 20 20 20 20  |bit,#1....      |
00000170  20 20 82 20 20 20 20 20  73 69 67 6e 2c 74 6f 70  |  .     sign,top|
00000180  2c 62 6f 74 0d 00 e6 1a  20 20 20 20 20 20 20 20  |,bot....        |
00000190  43 4d 50 20 20 20 20 20  62 6f 74 2c 23 30 0d 00  |CMP     bot,#0..|
000001a0  f0 1e 20 20 20 20 20 20  20 20 52 53 42 4d 49 20  |..        RSBMI |
000001b0  20 20 62 6f 74 2c 62 6f  74 2c 23 30 0d 00 fa 1a  |  bot,bot,#0....|
000001c0  20 20 20 20 20 20 20 20  43 4d 50 20 20 20 20 20  |        CMP     |
000001d0  74 6f 70 2c 23 30 0d 01  04 1e 20 20 20 20 20 20  |top,#0....      |
000001e0  20 20 52 53 42 4d 49 20  20 20 74 6f 70 2c 74 6f  |  RSBMI   top,to|
000001f0  70 2c 23 30 0d 01 0e 1d  20 20 20 20 20 20 20 20  |p,#0....        |
00000200  43 4d 50 20 20 20 20 20  74 6f 70 2c 23 32 5e 32  |CMP     top,#2^2|
00000210  34 0d 01 18 19 20 20 20  20 20 20 20 20 42 4c 54  |4....        BLT|
00000220  20 20 20 20 20 73 6b 69  70 31 0d 01 22 14 20 20  |     skip1..".  |
00000230  20 20 20 20 20 20 a4 64  69 76 28 33 31 29 0d 01  |      .div(31)..|
00000240  2c 14 20 20 20 20 20 20  20 20 a4 64 69 76 28 33  |,.        .div(3|
00000250  30 29 0d 01 36 14 20 20  20 20 20 20 20 20 a4 64  |0)..6.        .d|
00000260  69 76 28 32 39 29 0d 01  40 14 20 20 20 20 20 20  |iv(29)..@.      |
00000270  20 20 a4 64 69 76 28 32  38 29 0d 01 4a 14 20 20  |  .div(28)..J.  |
00000280  20 20 20 20 20 20 a4 64  69 76 28 32 37 29 0d 01  |      .div(27)..|
00000290  54 14 20 20 20 20 20 20  20 20 a4 64 69 76 28 32  |T.        .div(2|
000002a0  36 29 0d 01 5e 14 20 20  20 20 20 20 20 20 a4 64  |6)..^.        .d|
000002b0  69 76 28 32 35 29 0d 01  68 0a 2e 73 6b 69 70 31  |iv(25)..h..skip1|
000002c0  0d 01 72 1d 20 20 20 20  20 20 20 20 43 4d 50 20  |..r.        CMP |
000002d0  20 20 20 20 74 6f 70 2c  23 32 5e 31 36 0d 01 7c  |    top,#2^16..||
000002e0  19 20 20 20 20 20 20 20  20 42 4c 54 20 20 20 20  |.        BLT    |
000002f0  20 73 6b 69 70 32 0d 01  86 14 20 20 20 20 20 20  | skip2....      |
00000300  20 20 a4 64 69 76 28 32  34 29 0d 01 90 14 20 20  |  .div(24)....  |
00000310  20 20 20 20 20 20 a4 64  69 76 28 32 33 29 0d 01  |      .div(23)..|
00000320  9a 14 20 20 20 20 20 20  20 20 a4 64 69 76 28 32  |..        .div(2|
00000330  32 29 0d 01 a4 14 20 20  20 20 20 20 20 20 a4 64  |2)....        .d|
00000340  69 76 28 32 31 29 0d 01  ae 14 20 20 20 20 20 20  |iv(21)....      |
00000350  20 20 a4 64 69 76 28 32  30 29 0d 01 b8 14 20 20  |  .div(20)....  |
00000360  20 20 20 20 20 20 a4 64  69 76 28 31 39 29 0d 01  |      .div(19)..|
00000370  c2 14 20 20 20 20 20 20  20 20 a4 64 69 76 28 31  |..        .div(1|
00000380  38 29 0d 01 cc 14 20 20  20 20 20 20 20 20 a4 64  |8)....        .d|
00000390  69 76 28 31 37 29 0d 01  d6 0a 2e 73 6b 69 70 32  |iv(17).....skip2|
000003a0  0d 01 e0 1c 20 20 20 20  20 20 20 20 43 4d 50 20  |....        CMP |
000003b0  20 20 20 20 74 6f 70 2c  23 32 5e 38 0d 01 ea 19  |    top,#2^8....|
000003c0  20 20 20 20 20 20 20 20  42 4c 54 20 20 20 20 20  |        BLT     |
000003d0  73 6b 69 70 33 0d 01 f4  14 20 20 20 20 20 20 20  |skip3....       |
000003e0  20 a4 64 69 76 28 31 36  29 0d 01 fe 14 20 20 20  | .div(16)....   |
000003f0  20 20 20 20 20 a4 64 69  76 28 31 35 29 0d 02 08  |     .div(15)...|
00000400  14 20 20 20 20 20 20 20  20 a4 64 69 76 28 31 34  |.        .div(14|
00000410  29 0d 02 12 14 20 20 20  20 20 20 20 20 a4 64 69  |)....        .di|
00000420  76 28 31 33 29 0d 02 1c  14 20 20 20 20 20 20 20  |v(13)....       |
00000430  20 a4 64 69 76 28 31 32  29 0d 02 26 14 20 20 20  | .div(12)..&.   |
00000440  20 20 20 20 20 a4 64 69  76 28 31 31 29 0d 02 30  |     .div(11)..0|
00000450  14 20 20 20 20 20 20 20  20 a4 64 69 76 28 31 30  |.        .div(10|
00000460  29 0d 02 3a 13 20 20 20  20 20 20 20 20 a4 64 69  |)..:.        .di|
00000470  76 28 39 29 0d 02 44 13  20 20 20 20 20 20 20 20  |v(9)..D.        |
00000480  a4 64 69 76 28 38 29 0d  02 4e 0a 2e 73 6b 69 70  |.div(8)..N..skip|
00000490  33 0d 02 58 13 20 20 20  20 20 20 20 20 a4 64 69  |3..X.        .di|
000004a0  76 28 37 29 0d 02 62 13  20 20 20 20 20 20 20 20  |v(7)..b.        |
000004b0  a4 64 69 76 28 36 29 0d  02 6c 13 20 20 20 20 20  |.div(6)..l.     |
000004c0  20 20 20 a4 64 69 76 28  35 29 0d 02 76 13 20 20  |   .div(5)..v.  |
000004d0  20 20 20 20 20 20 a4 64  69 76 28 34 29 0d 02 80  |      .div(4)...|
000004e0  13 20 20 20 20 20 20 20  20 a4 64 69 76 28 33 29  |.        .div(3)|
000004f0  0d 02 8a 13 20 20 20 20  20 20 20 20 a4 64 69 76  |....        .div|
00000500  28 32 29 0d 02 94 13 20  20 20 20 20 20 20 20 a4  |(2)....        .|
00000510  64 69 76 28 31 29 0d 02  9e 13 20 20 20 20 20 20  |div(1)....      |
00000520  20 20 a4 64 69 76 28 30  29 0d 02 a8 0c 2e 64 6f  |  .div(0).....do|
00000530  6e 65 64 69 76 0d 02 b2  1e 20 20 20 20 20 20 20  |nediv....       |
00000540  20 4d 4f 56 20 20 20 20  20 74 6f 70 2c 72 65 73  | MOV     top,res|
00000550  75 6c 74 0d 02 bc 1b 20  20 20 20 20 20 20 20 43  |ult....        C|
00000560  4d 50 20 20 20 20 20 73  69 67 6e 2c 23 30 0d 02  |MP     sign,#0..|
00000570  c6 1e 20 20 20 20 20 20  20 20 52 53 42 4d 49 20  |..        RSBMI |
00000580  20 20 74 6f 70 2c 74 6f  70 2c 23 30 0d 02 d0 2b  |  top,top,#0...+|
00000590  20 20 20 20 20 20 20 20  4c 44 4d 46 44 20 20 20  |        LDMFD   |
000005a0  28 73 70 29 21 2c 7b 72  65 73 75 6c 74 2c 73 69  |(sp)!,{result,si|
000005b0  67 6e 2c 62 69 74 7d 0d  02 da 04 0d 02 e4 1b 20  |gn,bit}........ |
000005c0  20 20 20 20 20 20 20 4d  4f 56 20 20 20 20 20 70  |       MOV     p|
000005d0  63 2c 6c 69 6e 6b 0d 02  ee 06 5d ed 0d 02 f8 05  |c,link....].....|
000005e0  f5 0d 03 02 1a 20 e8 20  22 54 77 6f 20 6e 75 6d  |..... . "Two num|
000005f0  62 65 72 73 20 22 41 25  2c 42 25 0d 03 0c 16 20  |bers "A%,B%.... |
00000600  f1 20 ba 28 63 6f 64 65  29 2c 41 25 20 81 20 42  |. .(code),A% . B|
00000610  25 0d 03 16 07 fd 20 a3  0d 03 20 05 3a 0d 03 2a  |%..... ... .:..*|
00000620  0e dd 20 a4 64 69 76 28  69 74 29 0d 03 34 0c e7  |.. .div(it)..4..|
00000630  20 69 74 3e 30 20 8c 0d  03 3e 0d 5b 4f 50 54 20  | it>0 ...>.[OPT |
00000640  70 61 73 73 0d 03 48 1b  43 4d 50 20 20 20 20 20  |pass..H.CMP     |
00000650  62 6f 74 2c 74 6f 70 2c  4c 53 52 20 23 69 74 0d  |bot,top,LSR #it.|
00000660  03 52 24 84 52 4c 45 20  20 20 72 65 73 75 6c 74  |.R$.RLE   result|
00000670  2c 72 65 73 75 6c 74 2c  62 69 74 2c 41 53 4c 20  |,result,bit,ASL |
00000680  23 69 74 0d 03 5c 1f 53  55 42 4c 45 20 20 20 74  |#it..\.SUBLE   t|
00000690  6f 70 2c 74 6f 70 2c 62  6f 74 2c 41 53 4c 20 23  |op,top,bot,ASL #|
000006a0  69 74 0d 03 66 05 5d 0d  03 70 05 cc 0d 03 7a 0d  |it..f.]..p....z.|
000006b0  5b 4f 50 54 20 70 61 73  73 0d 03 84 13 43 4d 50  |[OPT pass....CMP|
000006c0  20 20 20 20 20 62 6f 74  2c 74 6f 70 0d 03 8e 1b  |     bot,top....|
000006d0  84 52 4c 45 20 20 20 72  65 73 75 6c 74 2c 72 65  |.RLE   result,re|
000006e0  73 75 6c 74 2c 23 31 0d  03 98 17 53 55 42 4c 45  |sult,#1....SUBLE|
000006f0  20 20 20 74 6f 70 2c 74  6f 70 2c 62 6f 74 0d 03  |   top,top,bot..|
00000700  a2 05 5d 0d 03 ac 05 cd  0d 03 b6 07 3d 22 22 0d  |..].........="".|
00000710  ff                                                |.|
00000711