cscg22-gearboy

CSCG 2022 Challenge 'Gearboy'
git clone https://git.sinitax.com/sinitax/cscg22-gearboy
Log | Files | Refs | sfeed.txt

ltoa.s (4799B)


      1;--------------------------------------------------------------------------
      2;  ltoa.s
      3;
      4;  Copyright (C) 2020, Tony Pavlov
      5;
      6;  This library is free software; you can redistribute it and/or modify it
      7;  under the terms of the GNU General Public License as published by the
      8;  Free Software Foundation; either version 2, or (at your option) any
      9;  later version.
     10;
     11;  This library is distributed in the hope that it will be useful,
     12;  but WITHOUT ANY WARRANTY; without even the implied warranty of
     13;  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
     14;  GNU General Public License for more details.
     15;
     16;  You should have received a copy of the GNU General Public License 
     17;  along with this library; see the file COPYING. If not, write to the
     18;  Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
     19;   MA 02110-1301, USA.
     20;
     21;  As a special exception, if you link this library with other files,
     22;  some of which are compiled with SDCC, to produce an executable,
     23;  this library does not by itself cause the resulting executable to
     24;  be covered by the GNU General Public License. This exception does
     25;  not however invalidate any other reasons why the executable file
     26;   might be covered by the GNU General Public License.
     27;--------------------------------------------------------------------------
     28
     29        .module ltoa
     30
     31        .area   _HOME
     32
     33_ultoa::
     34        push    BC
     35        
     36        lda     HL, 8(SP)
     37        ld      A, (HL+)
     38        ld      C, A
     39        ld      B, (HL)         ; BC: dest
     40
     41        lda     HL, 4(SP)
     42        ld      E, L
     43        ld      D, H            ; DE : ulong *
     44        
     45        call    .ultoa
     46        
     47        pop     BC
     48        ret
     49
     50_ltoa::
     51        push    BC
     52        
     53        lda     HL, 8(SP)
     54        ld      A, (HL+)
     55        ld      C, A
     56        ld      B, (HL)         ; BC: dest
     57
     58        lda     HL, 4(SP)
     59        ld      E, L
     60        ld      D, H            ; DE : ulong *
     61
     62        call    .ltoa
     63
     64        pop     BC
     65        ret
     66
     67.ltoa::
     68        push    DE
     69        
     70        ld      A, #3
     71        add     E
     72        ld      E, A
     73        adc     D
     74        sub     E
     75        ld      D, A
     76        
     77        ld      A, (DE)
     78        add     A, A
     79        pop     DE
     80        jr      NC, .ultoa
     81
     821$:
     83        push    DE
     84        ld      A, (DE)
     85        cpl
     86        add     #1
     87        ld      (DE), A
     88        inc     DE
     89
     90        ld      A, (DE)
     91        cpl
     92        adc     #0
     93        ld      (DE), A
     94        inc     DE
     95
     96        ld      A, (DE)
     97        cpl
     98        adc     #0
     99        ld      (DE), A
    100        inc     DE
    101
    102        ld      A, (DE)
    103        cpl
    104        adc     #0
    105        ld      (DE), A
    106        
    107        pop     DE
    108        
    109        ld      A, #'-'
    110        ld      (BC), A
    111        inc     BC
    112
    113        call    .ultoa
    114        dec     DE
    115        ret
    116
    117.ultoa::                        ; convert unsigned int into ascii
    118        add     SP, #-5
    119        lda     HL, 4(SP)
    120        
    121        xor     A               ; clear value
    122        ld      (HL-), A
    123        ld      (HL-), A
    124        ld      (HL-), A
    125        ld      (HL-), A
    126        ld      (HL), A
    127
    128        push    BC
    129        ld      B, #32
    1301$:
    131        ld      H, D
    132        ld      L, E
    133
    134        sla     (HL)
    135        inc     HL
    136        rl      (HL)
    137        inc     HL
    138        rl      (HL)
    139        inc     HL
    140        rl      (HL)
    141
    142        rra
    143        lda     HL, 2(SP)
    144        rla
    145
    146        ld      A, (HL)
    147        adc     A
    148        daa
    149        ld      (HL+), A        ; #0
    150        ld      A, (HL)
    151        adc     A
    152        daa
    153        ld      (HL+), A        ; #1
    154        ld      A, (HL)
    155        adc     A
    156        daa
    157        ld      (HL+), A        ; #2
    158        ld      A, (HL)
    159        adc     A
    160        daa
    161        ld      (HL+), A        ; #3
    162        ld      A, (HL)
    163        adc     A
    164        daa
    165        ld      (HL), A         ; #4
    166
    167        dec     B
    168        jr      NZ, 1$
    169
    170        pop     BC
    171        push    BC
    172
    173        ld      DE, #((5 << 8) | '0')
    174        lda     HL, 6(SP)
    175
    176        scf
    177        ccf
    178
    1793$:
    180        rl      D
    181        ld      A, (HL)
    182        swap    A
    183        and     #0x0f
    184        bit     0, D
    185        jr      NZ, 6$
    186        or      A
    187        jr      Z, 4$
    1886$:
    189        add     A, E
    190        ld      (BC), A
    191        set     0, D
    192        inc     BC
    1934$:
    194        ld      A, (HL-)
    195        and     #0x0f
    196        bit     0, D
    197        jr      NZ, 7$
    198        or      A
    199        jr      Z, 5$
    2007$:     
    201        add     A, E
    202        ld      (BC), A
    203        set     0, D
    204        inc     BC
    2055$:
    206        rr      D
    207        dec     D
    208        jr      NZ, 3$
    209        jr      C, 8$
    210
    211        ld      A, #'0'         ; n == 0
    212        ld      (BC), A
    213        inc     BC
    2148$:
    215        xor     A
    216        ld      (BC), A         ; write trailing #0
    217
    218        pop     DE
    219
    220        add     sp, #5
    221
    222        ret