OpenCores
URL https://opencores.org/ocsvn/ssbcc/ssbcc/trunk

Subversion Repositories ssbcc

[/] [ssbcc/] [trunk/] [lib/] [9x8/] [char.s] - Blame information for rev 10

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 10 sinclairrf
; Copyright 2013, 2015, Sinclair R.F., Inc.
2 2 sinclairrf
;
3
; Character manipulation functions
4
 
5 10 sinclairrf
.IFNDEF D__INCLUDED__CHAR_S__
6
.define D__INCLUDED__CHAR_S__
7 2 sinclairrf
 
8
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
9
;
10 3 sinclairrf
; Convert to and from binary.
11 2 sinclairrf
;
12
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
13
 
14 3 sinclairrf
; Convert a single binary digit to its byte value.  Return 0x00 on success and
15
; 0xFF on failure.
16
; ( u_binary_n - u f )
17
.function char__binary_to_byte
18
  '0' -
19
  dup 0xFE & .jumpc(error)
20
  .return(0)
21
  :error .return(0xFF)
22
 
23
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
24
;
25
; Convert to and from hex.
26
;
27
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
28
 
29 2 sinclairrf
; Convert a byte to its 2-digit hex representation with the digit for the most
30 3 sinclairrf
; significant nibble at the top of the data stack.
31 2 sinclairrf
; ( u - u_hex_lsn u_hex_msn )
32
.function char__byte_to_2hex
33 3 sinclairrf
  ; ( u - u u_hex_lsn )
34 2 sinclairrf
  dup 0x0F .call(char__nibble_to_hex,&)
35 3 sinclairrf
  ; ( u u_hex_lsn - u_hex_lsn u_hex_msn )
36 2 sinclairrf
  swap 0>> 0>> 0>> .call(char__nibble_to_hex,0>>)
37
  .return
38
 
39 3 sinclairrf
; Convert a byte to the minimal 1 or 2 digit hex representation with the digit
40
; for the most significant nibble at the top of the data stack.
41
; ( u - u_hex_lsn u_hex_msn ) or ( u - u_hex_lsn )
42
.function char__byte_to_hex
43
  dup 0xF0 & .jumpc(include_msn)
44
    .call(char__nibble_to_hex) .return
45
  :include_msn
46
    .call(char__byte_to_2hex) .return
47
 
48
; Convert a 4 byte value to its 8-digit hexadecimal representation.
49
; ( u_LSB u u u_MSB - )
50
.function char__4byte_to_8hex
51
  >r >r >r >r
52
  ${4-1} :loop r> swap >r .call(char__byte_to_2hex) r> .jumpc(loop,1-)
53
  .return(drop)
54
 
55 2 sinclairrf
; Convert a nibble between 0x00 and 0x0F inclusive to it hex digit.
56
; ( u - u_hex_n )
57
.function char__nibble_to_hex
58
  0x09 over - 0x80 & 0<> ${ord('A')-ord('9')-1} & + '0' .return(+)
59
 
60
; Convert two hex digits to their byte value.  Return 0x00 on success and 0xFF
61
; on failure.
62
; ( u_hex_lsn u_hex_msn - u f )
63
.function char__2hex_to_byte
64
  ; convert the msn to its position and save the error indication
65
  ; ( u_hex_lsn u_hex_lsn - u_hex_msn u_msn ) r:( - f_msn )
66
  .call(char__hex_to_nibble) >r <<0 <<0 <<0 <<0
67
  ; ( u_hex_lsn u_msn - u ) r:( f_msn - f_lsn f_msn )
68
  ; convert the lsn to its position, save the error indication, and combine the two nibble conversions
69
  .call(char__hex_to_nibble,swap) >r or
70
  ; compute the return status and return
71
  ; ( u - u f ) r:( f_lsn f_msn - )
72
  r> r> .return(or)
73
 
74
; Convert a single hex digit to its nibble value.  Return 0x00 on success and
75
; 0xFF on failure.
76
; ( u_hex_n - u f )
77
.function char__hex_to_nibble
78
  dup        0x80 & .jumpc(error)
79
  dup '0'  - 0x80 & .jumpc(error)
80
  '9' over - 0x80 & .jumpc(not_value_0_to_9) '0' - .return(0)
81
  :not_value_0_to_9
82
  dup 'A'  - 0x80 & .jumpc(error)
83
  'F' over - 0x80 & .jumpc(not_value_A_to_F) ${ord('A')-10} - .return(0)
84
  :not_value_A_to_F
85
  dup 'a'  - 0x80 & .jumpc(error)
86
  'f' over - 0x80 & .jumpc(error) ${ord('a')-10} - .return(0)
87
  :error .return(0xFF)
88
 
89 10 sinclairrf
.ENDIF ; D__INCLUDED__CHAR_S__

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.