Login

Subversion Repositories NedoOS

Rev

Blame | Last modification | View Log | Download | RSS feed

#ifndef included_ascii_to_BCD
#define included_ascii_to_BCD

#ifndef TOK_DECIMAL
#ifdef TOK_DECIMAL
#define TOK_DECIMAL TOK_DECIMAL
#else
#define TOK_DECIMAL '.'
#endif
#endif

ascii_to_BCD:
;Inputs:
;   HL points to the next digit to read in
;   B is the base-10 exponent
;   carry flag is set if we shouldn't increment the exponent
;Outputs:
;   HL is advanced as needed (not necessarily by 2)
;   A is the next BCD byte
;   carry is set if it was already set initially, or if a decimal was reached,
;   or if a non-numeric character was reached, otherwise, carry remains reset.
;Destroys:
;   C
  jr c,ascii_to_BCD_noexp
  ld a,(hl)
  cp TOK_DECIMAL
  jr z,ascii_to_BCD_decimal_found1
  cp '0'
  jr c,ascii_to_BCD_done1
  cp '9'+1
  jr nc,ascii_to_BCD_done1
  inc hl
  inc b
  add a,a
  add a,a
  add a,a
  add a,a
  ld c,a

  ld a,(hl)
  cp TOK_DECIMAL
  jr z,ascii_to_BCD_decimal_found2
  cp '0'
  jr c,ascii_to_BCD_done2
  cp '9'+1
  jr nc,ascii_to_BCD_done2
  inc hl
  inc b
  and %00001111
  or c
  ret

ascii_to_BCD_done1:
  xor a
  scf
  ret
ascii_to_BCD_done2:
  ld a,c
  scf
  ret

ascii_to_BCD_decimal_found1:
  inc hl
ascii_to_BCD_noexp:
  ld a,(hl)
  cp '0'
  jr c,ascii_to_BCD_done1
  cp '9'+1
  jr nc,ascii_to_BCD_done1
  add a,a
  add a,a
  add a,a
  add a,a
  ld c,a

ascii_to_BCD_decimal_found2:
  inc hl
  ld a,(hl)
  cp '0'
  jr c,ascii_to_BCD_done2
  cp '9'+1
  jr nc,ascii_to_BCD_done2
  inc hl
  and %00001111
  or c
  scf
  ret
#endif