l0, meta, l1: added "+0" and "-0" conditionals; updated prebuilt binary
[urforth.git] / level0 / k8utils.inca
blob67388f97757c24a56f6c862c47e5109526a932b7
1 ;; Ketmar's common utility functions
2 ;;
3 ;; Copyright (C) 2020 Ketmar Dark // Invisible Vector
4 ;;
5 ;; This program is free software: you can redistribute it and/or modify
6 ;; it under the terms of the GNU General Public License as published by
7 ;; the Free Software Foundation, version 3 of the License ONLY.
8 ;;
9 ;; This program is distributed in the hope that it will be useful,
10 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
11 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 ;; GNU General Public License for more details.
14 ;; You should have received a copy of the GNU General Public License
15 ;; along with this program.  If not, see <http://www.gnu.org/licenses/>.
18 ; i love Z80!
19 ld fix mov
20 cp fix cmp
21 ccf fix cmc  ; complement carry
22 scf fix stc  ; set carry
24 macro jmp cond*,lbl {
25   if lbl eq
26     ; normal jump
27     jmp cond
28   else
29     j#cond lbl
30   end if
33 macro jp cond*,lbl {
34   if lbl eq
35     ; normal jump
36     jmp cond
37   else
38     j#cond lbl
39   end if
42 macro jr cond*,lbl {
43   if lbl eq
44     ; normal jump
45     jmp cond
46   else
47     j#cond lbl
48   end if
52 macro ret cond {
53   local jlbl,dolbl
54   if cond eq
55     ; normal ret
56     ret
57   else
58     j#cond dolbl
59     jmp    jlbl
60     dolbl = $
61     ret
62     jlbl = $
63   end if
67 macro syscall {
68   int 0x80
72 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
73 ;; display n as hex number, in compile-time
75 macro display_hex n {
76   local bits,d
77   bits = 32
78   repeat bits/4
79     d = "0" + n shr (bits-%*4) and 0Fh
80     if d > "9"
81       d = d+"A"-"9"-1
82     end if
83     display d
84   end repeat
88 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
89 ;; display n as unsigned decimal number, in compile-time
91 macro display_dec n {
92   local cnt,divisor,still,d,nn
93   ; this can be done recursive, but...
94   still = 1
95   cnt = 0
96   divisor = 10
97   nn = n
98   while still <> 0
99     cnt = cnt+1
100     nn = nn/10
101     if nn = 0
102       still = 0
103     else
104       divisor = divisor*10
105     end if
106   end while
107   ; cnt -- number of digits
108   ; divisor -- guess what
109   while divisor <> 1
110     divisor = divisor/10
111     nn = n/divisor
112     d = "0"+(nn mod 10)
113     display d
114   end while
118 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
119 ;; convert low 4 bits of AL to hex digit ready to print
120 ;; in: AL: nibble
121 ;; out: AL: hex digit ready to print (uppercased)
122 ;; it's voodoo %-) can somebody explain this code? %-)
123 ;; heh, it's one byte shorter than the common snippets i've seen
124 ;; many times in teh internets.
125 ;; actually,, this is the code from my Z80 library. %-)
126 macro Nibble2Hex {
127   and   al,0Fh
128   cmp   al,0Ah
129   sbb   al,69h
130   das   ; yeah, yeah, das ist fantastich!
134 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
135 ;; display asciiz string at the given address, in compile time
137 macro display_asciiz_at addr {
138   local endstr,chr
139   endstr = 0
140   while endstr = 0
141     load chr byte from addr
142     addr = addr+1
143     if chr = 0
144       endstr = 1
145     else
146       display chr
147     end if
148   end while
152 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
153 O_ACCMODE  = 0003o
154 O_RDONLY   = 0000o
155 O_WRONLY   = 0001o
156 O_RDWR     = 0002o
157 O_CREAT    = 0100o
158 O_EXCL     = 0200o
159 O_NOCTTY   = 0400o
160 O_TRUNC    = 1000o
161 O_APPEND   = 2000o
162 O_NONBLOCK = 4000o
164 S_ISUID    = 4000o
165 S_ISGID    = 2000o
166 S_ISVTX    = 1000o
167 S_IRUSR    = 0400o
168 S_IWUSR    = 0200o
169 S_IXUSR    = 0100o
170 S_IRGRP    = 0040o
171 S_IWGRP    = 0020o
172 S_IXGRP    = 0010o
173 S_IROTH    = 0004o
174 S_IWOTH    = 0002o
175 S_IXOTH    = 0001o
178 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
179 if 0
180 elf_hash_value = 0
182 macro elf_hash_str str* {
183   local bpos,hash,high,xstr,b
184 virtual at 0x100000
185 xstr: db str,0
186   hash = 0
187   bpos = 0
188   load b byte from xstr+bpos
189   while b <> 0
190     hash = ((hash shl 4)+b) and 0xffffffff
191     high = hash and 0xf0000000
192     hash = hash xor (high shr 24)
193     hash = hash and (high xor 0xffffffff)
194     bpos = bpos+1
195     load b byte from xstr+bpos
196   end while
197 end virtual
198   elf_hash_value = hash
202 elf_hash_str "a"
203 assert elf_hash_value = 0x00000061
204 elf_hash_str "ab"
205 assert elf_hash_value = 0x00000672
206 elf_hash_str "The quick brown fox jumps over the lazy dog"
207 assert elf_hash_value = 0x04280C57
208 end if