git.y1.nz

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.