mirror of
https://github.com/irmen/prog8.git
synced 2024-12-25 08:29:25 +00:00
83 lines
2.3 KiB
Lua
83 lines
2.3 KiB
Lua
; any() and all() checks on arrays/memory buffers.
|
|
; These were builtin functions in older versions of the language.
|
|
|
|
%option no_symbol_prefixing, ignore_unused
|
|
|
|
anyall {
|
|
sub any(uword arrayptr, uword num_elements) -> bool {
|
|
; -- returns true if any byte in the array is not zero.
|
|
cx16.r1 = arrayptr
|
|
if msb(num_elements)==0 {
|
|
for cx16.r0L in 0 to lsb(num_elements)-1 {
|
|
if cx16.r1[cx16.r0L]!=0
|
|
return true
|
|
}
|
|
return false
|
|
}
|
|
repeat num_elements {
|
|
if @(cx16.r1)!=0
|
|
return true
|
|
cx16.r1++
|
|
}
|
|
return false
|
|
}
|
|
|
|
sub all(uword arrayptr, uword num_elements) -> bool {
|
|
; -- returns true if all bytes in the array are not zero.
|
|
cx16.r1 = arrayptr
|
|
if msb(num_elements)==0 {
|
|
for cx16.r0L in 0 to lsb(num_elements)-1 {
|
|
if cx16.r1[cx16.r0L]==0
|
|
return false
|
|
}
|
|
return true
|
|
}
|
|
repeat num_elements {
|
|
if @(cx16.r1)==0
|
|
return false
|
|
cx16.r1++
|
|
}
|
|
return true
|
|
}
|
|
|
|
sub anyw(uword arrayptr, uword num_elements) -> bool {
|
|
; -- returns true if any word in the array is not zero.
|
|
; doesn't work on @split arrays.
|
|
cx16.r1 = arrayptr
|
|
if msb(num_elements)==0 {
|
|
repeat lsb(num_elements) {
|
|
if peekw(cx16.r1)!=0
|
|
return true
|
|
cx16.r1+=2
|
|
}
|
|
return false
|
|
}
|
|
repeat num_elements {
|
|
if peekw(cx16.r1)!=0
|
|
return true
|
|
cx16.r1+=2
|
|
}
|
|
return false
|
|
}
|
|
|
|
sub allw(uword arrayptr, uword num_elements) -> bool {
|
|
; -- returns true if all words in the array are not zero.
|
|
; doesn't work on @split arrays.
|
|
cx16.r1 = arrayptr
|
|
if msb(num_elements)==0 {
|
|
repeat lsb(num_elements) {
|
|
if peekw(cx16.r1)==0
|
|
return false
|
|
cx16.r1+=2
|
|
}
|
|
return true
|
|
}
|
|
repeat num_elements {
|
|
if peekw(cx16.r1)==0
|
|
return false
|
|
cx16.r1+=2
|
|
}
|
|
return true
|
|
}
|
|
}
|