1 ;
-------------------------------------------------------------------------
2 ; _divulong.s
- routine for
32 bit unsigned long division
4 ; Copyright
(C
) 1998, Ullrich von Bassewitz
5 ; Copyright
(C
) 2022, Gabriele Gorla
7 ; This library is free software; you can redistribute it
and/or modify it
8 ; under the terms of the GNU General Public License as published by the
9 ; Free Software Foundation; either version
2, or (at your option
) any
12 ; This library is distributed in the hope that it will
be useful
,
13 ; but WITHOUT ANY WARRANTY; without even the implied warranty of
14 ; MERCHANTABILITY
or FITNESS FOR
A PARTICULAR PURPOSE. See the
15 ; GNU General Public License for more details.
17 ; You should have received
a copy of the GNU General Public License
18 ; along with this library; see the file COPYING. If
not, write to the
19 ; Free Software Foundation
, 51 Franklin Street
, Fifth Floor
, Boston
,
22 ; As
a special exception
, if you link this library with other files
,
23 ; some of which are compiled with SDCC
, to produce an executable
,
24 ; this library does
not by itself cause the resulting executable to
25 ;
be covered by the GNU General Public License. This exception does
26 ;
not however invalidate any other reasons why the executable file
27 ; might
be covered by the GNU General Public License.
28 ;
-------------------------------------------------------------------------
32 ;
--------------------------------------------------------
34 ;
--------------------------------------------------------
35 .globl __divulong_PARM_2
36 .globl __divulong_PARM_1
37 .globl __divslong_PARM_2
38 .globl __divslong_PARM_1
39 .globl __modulong_PARM_2
40 .globl __modulong_PARM_1
41 .globl __modslong_PARM_2
42 .globl __modslong_PARM_1
46 ;
--------------------------------------------------------
47 ; overlayable function parameters in zero page
48 ;
--------------------------------------------------------
61 ;
--------------------------------------------------------
63 ;
--------------------------------------------------------
64 .define res0 "__divulong_PARM_1+0"
65 .define res1 "__divulong_PARM_1+1"
66 .define res2 "___SDCC_m6502_ret2"
67 .define res3 "___SDCC_m6502_ret3"
68 .define den "__divulong_PARM_2"
69 .define rem "___SDCC_m6502_ret4"
70 .define s1 "___SDCC_m6502_ret0"
71 .define s2 "___SDCC_m6502_ret1"
73 ;
--------------------------------------------------------
75 ;
--------------------------------------------------------
85 ldx __divulong_PARM_1+
3
87 ldx __divulong_PARM_1+
2
106 ; Do
a subtraction. we do
not have enough space to store the intermediate
107 ; result
, so we may have to do the subtraction twice.
118 ; Overflow
, do the subtraction again
, this time store the result
119 sta
*rem+
3 ; We have the high byte already
129 inc
*res0 ; Set result bit