gbdk-2020 | GameBoy Development Kit |
| download: https://git.y1.nz/archives/gbdk.tar.gz | |
| README | Files | Log | Refs | LICENSE |
gbdk-lib/libc/asm/mos6502/_divulong.s
1 ;-------------------------------------------------------------------------
2 ; _divulong.s - routine for 32 bit unsigned long division
3 ;
4 ; Copyright (C) 1998, Ullrich von Bassewitz
5 ; Copyright (C) 2022, Gabriele Gorla
6 ;
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
10 ; later version.
11 ;
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.
16 ;
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,
20 ; MA 02110-1301, USA.
21 ;
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 ;-------------------------------------------------------------------------
29
30 .module _divulong
31
32 ;--------------------------------------------------------
33 ; exported symbols
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
43 .globl __divulong
44 .globl ___udivmod32
45
46 ;--------------------------------------------------------
47 ; overlayable function parameters in zero page
48 ;--------------------------------------------------------
49 .area OSEG (PAG, OVR)
50 __divulong_PARM_1:
51 __divslong_PARM_1:
52 __modulong_PARM_1:
53 __modslong_PARM_1:
54 .ds 4
55 __divulong_PARM_2:
56 __divslong_PARM_2:
57 __modulong_PARM_2:
58 __modslong_PARM_2:
59 .ds 4
60
61 ;--------------------------------------------------------
62 ; local aliases
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"
72
73 ;--------------------------------------------------------
74 ; code
75 ;--------------------------------------------------------
76 .area _CODE
77
78 __divulong:
79 jsr ___udivmod32
80 lda *res0
81 ldx *res1
82 rts
83
84 ___udivmod32:
85 ldx __divulong_PARM_1+3
86 stx *res3
87 ldx __divulong_PARM_1+2
88 stx *res2
89
90 lda #0
91 sta *rem+0
92 sta *rem+1
93 sta *rem+2
94 sta *rem+3
95 ldy #32
96 L0:
97 asl *res0
98 rol *res1
99 rol *res2
100 rol *res3
101 rol a
102 rol *rem+1
103 rol *rem+2
104 rol *rem+3
105
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.
108 tax
109 cmp *den+0
110 lda *rem+1
111 sbc *den+1
112 lda *rem+2
113 sbc *den+2
114 lda *rem+3
115 sbc *den+3
116 bcc L1
117
118 ; Overflow, do the subtraction again, this time store the result
119 sta *rem+3 ; We have the high byte already
120 txa
121 sbc *den+0 ; byte 0
122 tax
123 lda *rem+1
124 sbc *den+1
125 sta *rem+1 ; byte 1
126 lda *rem+2
127 sbc *den+2
128 sta *rem+2 ; byte 2
129 inc *res0 ; Set result bit
130 L1:
131 txa
132 dey
133 bne L0
134 sta *rem+0
135 rts
136
This webpage is intended to be an accessible preview of this repository. To get a fuller picture, clone it and use the git CLI.