mirror of
https://github.com/irmen/prog8.git
synced 2024-10-17 10:24:55 +00:00
any and all
This commit is contained in:
parent
13a5a06ffb
commit
178a46ad7f
@ -18,12 +18,18 @@
|
|||||||
float f3
|
float f3
|
||||||
|
|
||||||
ubyte[3] uba = [1,2,3]
|
ubyte[3] uba = [1,2,3]
|
||||||
byte[3] ba = [-1,2,3]
|
byte[3] ba = [-1,0,3]
|
||||||
uword[3] uwa = [1000,2000,3000]
|
uword[3] uwa = [1000,200,0]
|
||||||
word[3] wa = -222
|
word[3] wa = -222
|
||||||
|
ubyte[3] uba0 = 0
|
||||||
|
byte[3] ba0 = 0
|
||||||
|
uword[3] uwa0 = 0
|
||||||
|
word[3] wa0 = 0
|
||||||
;word[3] wa = [-1000.w,2000.w,3000.w] ; @todo array data type fix (float->word)
|
;word[3] wa = [-1000.w,2000.w,3000.w] ; @todo array data type fix (float->word)
|
||||||
;word[3] wa = [1000,2000,3000] ; @todo array data type fix (uword->word)
|
;word[3] wa = [1000,2000,3000] ; @todo array data type fix (uword->word)
|
||||||
float[3] fa = [-1000,44.555, 99.999]
|
float[3] fa0 = 0.0
|
||||||
|
float[3] fa1 = [-1000,44.555, 99.999]
|
||||||
|
float[3] fa2 = [-1000,44.555, 0]
|
||||||
str string = "hello"
|
str string = "hello"
|
||||||
str_p pstring = "hello1"
|
str_p pstring = "hello1"
|
||||||
str_s sstring = "hello12"
|
str_s sstring = "hello12"
|
||||||
@ -45,13 +51,59 @@
|
|||||||
ub1 = any(wa)
|
ub1 = any(wa)
|
||||||
c64scr.print_ubyte_decimal(ub1)
|
c64scr.print_ubyte_decimal(ub1)
|
||||||
c64.CHROUT('\n')
|
c64.CHROUT('\n')
|
||||||
ub1 = any(fa)
|
ub1 = any(fa1)
|
||||||
c64scr.print_ubyte_decimal(ub1)
|
c64scr.print_ubyte_decimal(ub1)
|
||||||
c64.CHROUT('\n')
|
c64.CHROUT('\n')
|
||||||
|
ub1 = any(fa2)
|
||||||
|
c64scr.print_ubyte_decimal(ub1)
|
||||||
|
c64.CHROUT('\n')
|
||||||
|
|
||||||
|
ub1 = any(uba0)
|
||||||
|
c64scr.print_ubyte_decimal(ub1)
|
||||||
|
c64.CHROUT('\n')
|
||||||
|
ub1 = any(ba0)
|
||||||
|
c64scr.print_ubyte_decimal(ub1)
|
||||||
|
c64.CHROUT('\n')
|
||||||
|
ub1 = any(uwa0)
|
||||||
|
c64scr.print_ubyte_decimal(ub1)
|
||||||
|
c64.CHROUT('\n')
|
||||||
|
ub1 = any(wa0)
|
||||||
|
c64scr.print_ubyte_decimal(ub1)
|
||||||
|
c64.CHROUT('\n')
|
||||||
|
ub1 = any(fa0)
|
||||||
|
c64scr.print_ubyte_decimal(ub1)
|
||||||
|
c64.CHROUT('\n')
|
||||||
|
|
||||||
c64.CHROUT('x')
|
c64.CHROUT('x')
|
||||||
c64scr.print_ubyte_decimal(X)
|
c64scr.print_ubyte_decimal(X)
|
||||||
c64.CHROUT('\n')
|
c64.CHROUT('\n')
|
||||||
|
|
||||||
|
c64.CHROUT('x')
|
||||||
|
c64scr.print_ubyte_decimal(X)
|
||||||
|
c64.CHROUT('\n')
|
||||||
|
|
||||||
|
; ub1 = all(uba) ; 1 ok
|
||||||
|
; c64scr.print_ubyte_decimal(ub1)
|
||||||
|
; c64.CHROUT('\n')
|
||||||
|
; ub1 = all(ba) ; 0 ok
|
||||||
|
; c64scr.print_ubyte_decimal(ub1)
|
||||||
|
; c64.CHROUT('\n')
|
||||||
|
; ub1 = all(uwa) ; 0 ok
|
||||||
|
; c64scr.print_ubyte_decimal(ub1)
|
||||||
|
; c64.CHROUT('\n')
|
||||||
|
; ub1 = all(wa) ; 1 ok
|
||||||
|
; c64scr.print_ubyte_decimal(ub1)
|
||||||
|
; c64.CHROUT('\n')
|
||||||
|
; ub1 = all(fa1) ; 1 ok
|
||||||
|
; c64scr.print_ubyte_decimal(ub1)
|
||||||
|
; c64.CHROUT('\n')
|
||||||
|
; ub1 = all(fa2) ; 0 ok
|
||||||
|
; c64scr.print_ubyte_decimal(ub1)
|
||||||
|
; c64.CHROUT('\n')
|
||||||
|
; c64.CHROUT('x')
|
||||||
|
; c64scr.print_ubyte_decimal(X)
|
||||||
|
; c64.CHROUT('\n')
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -682,6 +682,27 @@ private class StatementTranslator(private val prog: IntermediateProgram,
|
|||||||
else -> throw CompilerException("wrong datatype for len()")
|
else -> throw CompilerException("wrong datatype for len()")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
"any", "all" -> {
|
||||||
|
// 1 array argument, type determines the exact syscall to use
|
||||||
|
val arg=args.single() as IdentifierReference
|
||||||
|
val target=arg.targetStatement(namespace) as VarDecl
|
||||||
|
val length=Value(DataType.UBYTE, target.arrayspec!!.size()!!)
|
||||||
|
when (arg.resultingDatatype(namespace, heap)) {
|
||||||
|
DataType.ARRAY_B, DataType.ARRAY_UB -> {
|
||||||
|
prog.instr(Opcode.PUSH_BYTE, length)
|
||||||
|
createSyscall("${funcname}_b")
|
||||||
|
}
|
||||||
|
DataType.ARRAY_W, DataType.ARRAY_UW -> {
|
||||||
|
prog.instr(Opcode.PUSH_BYTE, length)
|
||||||
|
createSyscall("${funcname}_w")
|
||||||
|
}
|
||||||
|
DataType.ARRAY_F -> {
|
||||||
|
prog.instr(Opcode.PUSH_BYTE, length)
|
||||||
|
createSyscall("${funcname}_f")
|
||||||
|
}
|
||||||
|
else -> throw CompilerException("wrong datatype for $funcname()")
|
||||||
|
}
|
||||||
|
}
|
||||||
"flt" -> {
|
"flt" -> {
|
||||||
// 1 argument, type determines the exact opcode to use
|
// 1 argument, type determines the exact opcode to use
|
||||||
val arg = args.single()
|
val arg = args.single()
|
||||||
|
@ -46,8 +46,6 @@ enum class Syscall(val callNr: Short) {
|
|||||||
FUNC_MIN(83),
|
FUNC_MIN(83),
|
||||||
FUNC_AVG(84),
|
FUNC_AVG(84),
|
||||||
FUNC_SUM(85),
|
FUNC_SUM(85),
|
||||||
FUNC_ANY(87),
|
|
||||||
FUNC_ALL(88),
|
|
||||||
FUNC_RND(89), // push a random byte on the stack
|
FUNC_RND(89), // push a random byte on the stack
|
||||||
FUNC_RNDW(90), // push a random word on the stack
|
FUNC_RNDW(90), // push a random word on the stack
|
||||||
FUNC_RNDF(91), // push a random float on the stack (between 0.0 and 1.0)
|
FUNC_RNDF(91), // push a random float on the stack (between 0.0 and 1.0)
|
||||||
@ -61,7 +59,13 @@ enum class Syscall(val callNr: Short) {
|
|||||||
FUNC_LEN_STR(105),
|
FUNC_LEN_STR(105),
|
||||||
FUNC_LEN_STRP(106),
|
FUNC_LEN_STRP(106),
|
||||||
FUNC_LEN_STRS(107),
|
FUNC_LEN_STRS(107),
|
||||||
FUNC_LEN_STRPS(108)
|
FUNC_LEN_STRPS(108),
|
||||||
|
FUNC_ANY_B(109),
|
||||||
|
FUNC_ANY_W(110),
|
||||||
|
FUNC_ANY_F(111),
|
||||||
|
FUNC_ALL_B(112),
|
||||||
|
FUNC_ALL_W(113),
|
||||||
|
FUNC_ALL_F(114)
|
||||||
|
|
||||||
// note: not all builtin functions of the Prog8 language are present as functions:
|
// note: not all builtin functions of the Prog8 language are present as functions:
|
||||||
// some of them are straight opcodes (such as MSB, LSB, LSL, LSR, ROL_BYTE, ROR, ROL2, ROR2, and FLT)!
|
// some of them are straight opcodes (such as MSB, LSB, LSL, LSR, ROL_BYTE, ROR, ROL2, ROR2, and FLT)!
|
||||||
@ -1554,21 +1558,15 @@ class StackVm(private var traceOutputFile: String?) {
|
|||||||
else
|
else
|
||||||
evalstack.push(Value(DataType.UWORD, value.array!!.sum()))
|
evalstack.push(Value(DataType.UWORD, value.array!!.sum()))
|
||||||
}
|
}
|
||||||
Syscall.FUNC_ANY -> {
|
Syscall.FUNC_ANY_B, Syscall.FUNC_ANY_W, Syscall.FUNC_ANY_F -> {
|
||||||
val iterable = evalstack.pop()
|
val iterable = evalstack.pop()
|
||||||
val value = heap.get(iterable.heapId)
|
val value = heap.get(iterable.heapId)
|
||||||
if (value.str != null)
|
evalstack.push(Value(DataType.UBYTE, if (value.array!!.any { v -> v != 0 }) 1 else 0))
|
||||||
evalstack.push(Value(DataType.UBYTE, if (Petscii.encodePetscii(value.str, true).any { c -> c != 0.toShort() }) 1 else 0))
|
|
||||||
else
|
|
||||||
evalstack.push(Value(DataType.UBYTE, if (value.array!!.any { v -> v != 0 }) 1 else 0))
|
|
||||||
}
|
}
|
||||||
Syscall.FUNC_ALL -> {
|
Syscall.FUNC_ALL_B, Syscall.FUNC_ALL_W, Syscall.FUNC_ALL_F -> {
|
||||||
val iterable = evalstack.pop()
|
val iterable = evalstack.pop()
|
||||||
val value = heap.get(iterable.heapId)
|
val value = heap.get(iterable.heapId)
|
||||||
if (value.str != null)
|
evalstack.push(Value(DataType.UBYTE, if (value.array!!.all { v -> v != 0 }) 1 else 0))
|
||||||
evalstack.push(Value(DataType.UBYTE, if (Petscii.encodePetscii(value.str, true).all { c -> c != 0.toShort() }) 1 else 0))
|
|
||||||
else
|
|
||||||
evalstack.push(Value(DataType.UBYTE, if (value.array!!.all { v -> v != 0 }) 1 else 0))
|
|
||||||
}
|
}
|
||||||
Syscall.FUNC_STR2BYTE -> {
|
Syscall.FUNC_STR2BYTE -> {
|
||||||
val strvar = evalstack.pop()
|
val strvar = evalstack.pop()
|
||||||
|
@ -896,23 +896,134 @@ func_sum .proc
|
|||||||
rts
|
rts
|
||||||
.warn "sum not implemented--what does it sum over???"
|
.warn "sum not implemented--what does it sum over???"
|
||||||
.pend
|
.pend
|
||||||
|
|
||||||
func_any .proc
|
peek_address .proc
|
||||||
rts
|
; -- peek address on stack into SCRATCH_ZPWORD1
|
||||||
.warn "any not implemented--of what does it do any?"
|
|
||||||
.pend
|
|
||||||
|
|
||||||
func_all .proc
|
|
||||||
rts
|
|
||||||
.warn "all not implemented--of what does it do all?"
|
|
||||||
.pend
|
|
||||||
|
|
||||||
func_len_str .proc
|
|
||||||
; -- push length of 0-terminated string on stack
|
|
||||||
lda ESTACK_LO+1,x
|
lda ESTACK_LO+1,x
|
||||||
sta SCRATCH_ZPWORD1
|
sta SCRATCH_ZPWORD1
|
||||||
lda ESTACK_HI+1,x
|
lda ESTACK_HI+1,x
|
||||||
sta SCRATCH_ZPWORD1+1
|
sta SCRATCH_ZPWORD1+1
|
||||||
|
rts
|
||||||
|
.pend
|
||||||
|
|
||||||
|
func_any_b .proc
|
||||||
|
inx
|
||||||
|
lda ESTACK_LO,x ; array size
|
||||||
|
_entry sta _cmp_mod+1 ; self-modifying code
|
||||||
|
jsr peek_address
|
||||||
|
ldy #0
|
||||||
|
- lda (SCRATCH_ZPWORD1),y
|
||||||
|
bne _got_any
|
||||||
|
iny
|
||||||
|
_cmp_mod cpy #255 ; modified
|
||||||
|
bne -
|
||||||
|
lda #0
|
||||||
|
sta ESTACK_LO+1,x
|
||||||
|
rts
|
||||||
|
_got_any lda #1
|
||||||
|
sta ESTACK_LO+1,x
|
||||||
|
rts
|
||||||
|
.pend
|
||||||
|
|
||||||
|
func_any_w .proc
|
||||||
|
inx
|
||||||
|
lda ESTACK_LO,x ; array size
|
||||||
|
asl a ; times 2 because of word
|
||||||
|
jmp func_any_b._entry
|
||||||
|
.pend
|
||||||
|
|
||||||
|
func_any_f .proc
|
||||||
|
inx
|
||||||
|
lda ESTACK_LO,x ; array size
|
||||||
|
sta SCRATCH_ZPB1
|
||||||
|
asl a
|
||||||
|
asl a
|
||||||
|
clc
|
||||||
|
adc SCRATCH_ZPB1 ; times 5 because of float
|
||||||
|
jmp func_any_b._entry
|
||||||
|
.pend
|
||||||
|
|
||||||
|
func_all_b .proc
|
||||||
|
inx
|
||||||
|
lda ESTACK_LO,x ; array size
|
||||||
|
sta _cmp_mod+1 ; self-modifying code
|
||||||
|
jsr peek_address
|
||||||
|
ldy #0
|
||||||
|
- lda (SCRATCH_ZPWORD1),y
|
||||||
|
beq _got_not_all
|
||||||
|
iny
|
||||||
|
_cmp_mod cpy #255 ; modified
|
||||||
|
bne -
|
||||||
|
lda #1
|
||||||
|
sta ESTACK_LO+1,x
|
||||||
|
rts
|
||||||
|
_got_not_all lda #0
|
||||||
|
sta ESTACK_LO+1,x
|
||||||
|
rts
|
||||||
|
.pend
|
||||||
|
|
||||||
|
func_all_w .proc
|
||||||
|
inx
|
||||||
|
lda ESTACK_LO,x ; array size
|
||||||
|
asl a ; times 2 because of word
|
||||||
|
sta _cmp_mod+1 ; self-modifying code
|
||||||
|
jsr peek_address
|
||||||
|
ldy #0
|
||||||
|
- lda (SCRATCH_ZPWORD1),y
|
||||||
|
bne +
|
||||||
|
iny
|
||||||
|
lda (SCRATCH_ZPWORD1),y
|
||||||
|
bne +
|
||||||
|
lda #0
|
||||||
|
sta ESTACK_LO+1,x
|
||||||
|
rts
|
||||||
|
+ iny
|
||||||
|
_cmp_mod cpy #255 ; modified
|
||||||
|
bne -
|
||||||
|
lda #1
|
||||||
|
sta ESTACK_LO+1,x
|
||||||
|
rts
|
||||||
|
.pend
|
||||||
|
|
||||||
|
func_all_f .proc
|
||||||
|
inx
|
||||||
|
lda ESTACK_LO,x ; array size
|
||||||
|
sta SCRATCH_ZPB1
|
||||||
|
asl a
|
||||||
|
asl a
|
||||||
|
clc
|
||||||
|
adc SCRATCH_ZPB1 ; times 5 because of float
|
||||||
|
sta _cmp_mod+1 ; self-modifying code
|
||||||
|
jsr peek_address
|
||||||
|
ldy #0
|
||||||
|
- lda (SCRATCH_ZPWORD1),y
|
||||||
|
bne +
|
||||||
|
iny
|
||||||
|
lda (SCRATCH_ZPWORD1),y
|
||||||
|
bne +
|
||||||
|
iny
|
||||||
|
lda (SCRATCH_ZPWORD1),y
|
||||||
|
bne +
|
||||||
|
iny
|
||||||
|
lda (SCRATCH_ZPWORD1),y
|
||||||
|
bne +
|
||||||
|
iny
|
||||||
|
lda (SCRATCH_ZPWORD1),y
|
||||||
|
bne +
|
||||||
|
lda #0
|
||||||
|
sta ESTACK_LO+1,x
|
||||||
|
rts
|
||||||
|
+ iny
|
||||||
|
_cmp_mod cpy #255 ; modified
|
||||||
|
bne -
|
||||||
|
lda #1
|
||||||
|
sta ESTACK_LO+1,x
|
||||||
|
rts
|
||||||
|
.pend
|
||||||
|
|
||||||
|
func_len_str .proc
|
||||||
|
; -- push length of 0-terminated string on stack
|
||||||
|
jsr peek_address
|
||||||
ldy #0
|
ldy #0
|
||||||
- lda (SCRATCH_ZPWORD1),y
|
- lda (SCRATCH_ZPWORD1),y
|
||||||
beq +
|
beq +
|
||||||
@ -925,10 +1036,7 @@ func_len_str .proc
|
|||||||
|
|
||||||
func_len_strp .proc
|
func_len_strp .proc
|
||||||
; -- push length of pascal-string on stack
|
; -- push length of pascal-string on stack
|
||||||
lda ESTACK_LO+1,x
|
jsr peek_address
|
||||||
sta SCRATCH_ZPWORD1
|
|
||||||
lda ESTACK_HI+1,x
|
|
||||||
sta SCRATCH_ZPWORD1+1
|
|
||||||
ldy #0
|
ldy #0
|
||||||
lda (SCRATCH_ZPWORD1),y ; first byte is length
|
lda (SCRATCH_ZPWORD1),y ; first byte is length
|
||||||
sta ESTACK_LO+1,x
|
sta ESTACK_LO+1,x
|
||||||
|
Loading…
Reference in New Issue
Block a user