mirror of
https://github.com/irmen/prog8.git
synced 2025-10-25 05:18:38 +00:00
Merge branch 'refs/heads/master' into structs6502
# Conflicts: # examples/test.p8
This commit is contained in:
@@ -832,8 +832,18 @@ internal class BuiltinFunctionsAsmGen(private val program: PtProgram,
|
||||
}
|
||||
|
||||
// fall through method:
|
||||
asmgen.assignByteOperandsToAAndVar(fcall.args[1], fcall.args[0], "P8ZP_SCRATCH_W1")
|
||||
asmgen.out(" jsr prog8_lib.func_pokebool")
|
||||
if(fcall.args[1].isSimple()) {
|
||||
asmgen.assignExpressionToVariable(fcall.args[0], "P8ZP_SCRATCH_W1", DataType.UWORD)
|
||||
asmgen.assignExpressionToRegister(fcall.args[1], RegisterOrPair.A)
|
||||
} else {
|
||||
asmgen.pushCpuStack(BaseDataType.UBYTE, fcall.args[1])
|
||||
asmgen.assignExpressionToVariable(fcall.args[0], "P8ZP_SCRATCH_W1", DataType.UWORD)
|
||||
asmgen.restoreRegisterStack(CpuRegister.A, false)
|
||||
}
|
||||
if(asmgen.isTargetCpu(CpuType.CPU65C02))
|
||||
asmgen.out(" sta (P8ZP_SCRATCH_W1)")
|
||||
else
|
||||
asmgen.out(" ldy #0 | sta (P8ZP_SCRATCH_W1),y")
|
||||
}
|
||||
|
||||
private fun funcPokeW(fcall: PtBuiltinFunctionCall) {
|
||||
@@ -904,7 +914,7 @@ internal class BuiltinFunctionsAsmGen(private val program: PtProgram,
|
||||
private fun funcPeekBool(fcall: PtBuiltinFunctionCall, resultRegister: RegisterOrPair?) {
|
||||
fun fallback() {
|
||||
asmgen.assignExpressionToRegister(fcall.args[0], RegisterOrPair.AY)
|
||||
asmgen.out(" jsr prog8_lib.func_peekbool")
|
||||
asmgen.out(" jsr prog8_lib.func_peek")
|
||||
}
|
||||
when(val addrExpr = fcall.args[0]) {
|
||||
is PtNumber -> {
|
||||
|
||||
@@ -401,8 +401,17 @@ _loop_hi ldy _index_first
|
||||
.pend
|
||||
|
||||
|
||||
func_peek .proc
|
||||
; -- read the byte value on the address in AY, into A
|
||||
sta P8ZP_SCRATCH_W1
|
||||
sty P8ZP_SCRATCH_W1+1
|
||||
ldy #0
|
||||
lda (P8ZP_SCRATCH_W1),y
|
||||
rts
|
||||
.pend
|
||||
|
||||
func_peekw .proc
|
||||
; -- read the word value on the address in AY
|
||||
; -- read the word value on the address in AY, into AY
|
||||
sta P8ZP_SCRATCH_W1
|
||||
sty P8ZP_SCRATCH_W1+1
|
||||
ldy #0
|
||||
|
||||
@@ -15,6 +15,7 @@ import prog8.code.core.RegisterOrPair
|
||||
import prog8.code.core.isNumeric
|
||||
import prog8.code.target.C64Target
|
||||
import prog8.code.target.Cx16Target
|
||||
import prog8.code.target.VMTarget
|
||||
import prog8tests.helpers.ErrorReporterForTests
|
||||
import prog8tests.helpers.compileText
|
||||
|
||||
@@ -136,24 +137,50 @@ main {
|
||||
test("all peeks and pokes") {
|
||||
val src="""
|
||||
%import floats
|
||||
%import textio
|
||||
|
||||
%option no_sysinit
|
||||
%zeropage basicsafe
|
||||
|
||||
main {
|
||||
uword[5] a
|
||||
float f
|
||||
|
||||
sub start() {
|
||||
pokebool(3000, true)
|
||||
pokew(3100, 12345)
|
||||
pokef(3200, 3.1415927)
|
||||
poke(3300, 222)
|
||||
pokebool(cx16.r0, true)
|
||||
pokew(cx16.r0, 12345)
|
||||
pokef(cx16.r0, 3.1415927)
|
||||
poke(cx16.r0, 222)
|
||||
pokebool(a[2], true)
|
||||
pokew(a[2], 12345)
|
||||
pokef(a[2], 3.1415927)
|
||||
poke(a[2], 222)
|
||||
pokebool(cx16.r0+cx16.r1, true)
|
||||
pokew(cx16.r0+cx16.r1, 12345)
|
||||
pokef(cx16.r0+cx16.r1, 3.1415927)
|
||||
poke(cx16.r0+cx16.r1, 222)
|
||||
|
||||
txt.print_bool(peekbool(3000))
|
||||
txt.print_uw(peekw(3100))
|
||||
txt.print_f(peekf(3200))
|
||||
txt.print_ub(peek(3300))
|
||||
|
||||
cx16.r0bL = peekbool(3000)
|
||||
cx16.r1 = peekw(3100)
|
||||
f = peekf(3200)
|
||||
cx16.r2L = peek(3300)
|
||||
cx16.r0bL = peekbool(cx16.r0)
|
||||
cx16.r1 = peekw(cx16.r0)
|
||||
f = peekf(cx16.r0)
|
||||
cx16.r2L = peek(cx16.r0)
|
||||
cx16.r0bL = peekbool(a[2])
|
||||
cx16.r1 = peekw(a[2])
|
||||
f = peekf(a[2])
|
||||
cx16.r2L = peek(a[2])
|
||||
cx16.r0bL = peekbool(cx16.r0+cx16.r1)
|
||||
cx16.r1 = peekw(cx16.r0+cx16.r1)
|
||||
f = peekf(cx16.r0+cx16.r1)
|
||||
cx16.r2L = peek(cx16.r0+cx16.r1)
|
||||
}
|
||||
}"""
|
||||
}
|
||||
"""
|
||||
compileText(VMTarget(), false, src, outputDir, writeAssembly = true) shouldNotBe null
|
||||
compileText(Cx16Target(), false, src, outputDir, writeAssembly = true) shouldNotBe null
|
||||
compileText(C64Target(), false, src, outputDir, writeAssembly = true) shouldNotBe null
|
||||
}
|
||||
|
||||
214
examples/test.p8
214
examples/test.p8
@@ -1,214 +1,14 @@
|
||||
%import floats
|
||||
|
||||
main {
|
||||
^^bool g_bp
|
||||
^^word g_bw
|
||||
^^float g_floats
|
||||
uword[5] a
|
||||
|
||||
sub start() {
|
||||
^^bool l_bp
|
||||
^^word l_bw
|
||||
^^float l_floats
|
||||
pokebool(cx16.r0, false)
|
||||
pokebool(a[2], false)
|
||||
pokebool(cx16.r0+cx16.r1, false)
|
||||
|
||||
assign_pointers()
|
||||
assign_values()
|
||||
assign_inplace()
|
||||
assign_deref()
|
||||
assign_uwords()
|
||||
assign_same_ptrs()
|
||||
assign_different_ptrs()
|
||||
|
||||
sub assign_pointers() {
|
||||
cx16.r0 = l_bp
|
||||
cx16.r1 = l_bw
|
||||
cx16.r2 = l_floats
|
||||
cx16.r0 = g_bp
|
||||
cx16.r1 = g_bw
|
||||
cx16.r2 = g_floats
|
||||
cx16.r0 = other.g_bp
|
||||
cx16.r1 = other.g_bw
|
||||
cx16.r2 = other.g_floats
|
||||
cx16.r0 = other.func.l_bp
|
||||
cx16.r1 = other.func.l_bw
|
||||
cx16.r2 = other.func.l_floats
|
||||
}
|
||||
|
||||
sub assign_deref() {
|
||||
float f
|
||||
bool b
|
||||
word w
|
||||
b = l_bp^^
|
||||
w = l_bw^^
|
||||
f = l_floats^^
|
||||
b = g_bp^^
|
||||
w = g_bw^^
|
||||
f = g_floats^^
|
||||
b = other.g_bp^^
|
||||
w = other.g_bw^^
|
||||
f = other.g_floats^^
|
||||
b = other.func.l_bp^^
|
||||
w = other.func.l_bw^^
|
||||
f = other.func.l_floats^^
|
||||
}
|
||||
|
||||
sub assign_values() {
|
||||
l_bp^^ = true
|
||||
l_bw^^ = -1234
|
||||
l_floats^^ = 5.678
|
||||
g_bp^^ = true
|
||||
g_bw^^ = -1234
|
||||
g_floats^^ = 5.678
|
||||
other.g_bp^^ = true
|
||||
other.g_bw^^ = -1234
|
||||
other.g_floats^^ = 5.678
|
||||
other.func.l_bp^^ = true
|
||||
other.func.l_bw^^ = -1234
|
||||
other.func.l_floats^^ = 5.678
|
||||
}
|
||||
|
||||
sub assign_same_ptrs() {
|
||||
l_bp = g_bp
|
||||
l_bw = g_bw
|
||||
l_floats = g_floats
|
||||
g_bp = other.g_bp
|
||||
g_bw = other.g_bw
|
||||
g_floats = other.g_floats
|
||||
other.g_bp = other.func.l_bp
|
||||
other.g_bw = other.func.l_bw
|
||||
other.g_floats = other.func.l_floats
|
||||
}
|
||||
|
||||
sub assign_different_ptrs() {
|
||||
l_bp = g_floats as ^^bool
|
||||
l_bw = g_floats as ^^word
|
||||
l_floats = g_bp as ^^float
|
||||
other.g_bp = l_floats as ^^bool
|
||||
other.g_bw = l_floats as ^^word
|
||||
other.g_floats = l_bp as ^^float
|
||||
}
|
||||
|
||||
sub assign_inplace() {
|
||||
bool b
|
||||
l_bp^^ = l_bp^^ xor b
|
||||
l_bw^^ += -1234
|
||||
l_floats^^ += 5.678
|
||||
g_bp^^ = g_bp^^ xor b
|
||||
g_bw^^ += -1234
|
||||
g_floats^^ += 5.678
|
||||
other.g_bp^^ = other.g_bp^^ xor b
|
||||
other.g_bw^^ += -1234
|
||||
other.g_floats^^ += 5.678
|
||||
other.func.l_bp^^ = other.func.l_bp^^ xor b
|
||||
other.func.l_bw^^ += -1234
|
||||
other.func.l_floats^^ += 5.678
|
||||
|
||||
l_bw^^ /= 3
|
||||
l_floats^^ /= 3.0
|
||||
g_bw^^ /= 3
|
||||
g_floats^^ /= 3.0
|
||||
other.g_bw^^ /= 3
|
||||
other.g_floats^^ /= 3.0
|
||||
other.func.l_bw^^ /= 3
|
||||
other.func.l_floats^^ /= 3.0
|
||||
}
|
||||
|
||||
sub assign_uwords() {
|
||||
l_bp = $9000
|
||||
l_bw = $9000
|
||||
l_floats = $9000
|
||||
g_bp = $9000
|
||||
g_bw = $9000
|
||||
g_floats = $9000
|
||||
other.g_bp = $9000
|
||||
other.g_bw = $9000
|
||||
other.g_floats = $9000
|
||||
other.func.l_bp = $9000
|
||||
other.func.l_bw = $9000
|
||||
other.func.l_floats = $9000
|
||||
}
|
||||
cx16.r0bL = peekbool(cx16.r0)
|
||||
cx16.r0bL = peekbool(a[2])
|
||||
cx16.r0bL = peekbool(cx16.r0+cx16.r1)
|
||||
}
|
||||
}
|
||||
|
||||
other {
|
||||
^^bool g_bp
|
||||
^^word g_bw
|
||||
^^float g_floats
|
||||
|
||||
sub func() {
|
||||
^^bool l_bp
|
||||
^^word l_bw
|
||||
^^float l_floats
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
;%import floats
|
||||
;%import textio
|
||||
;%option no_sysinit
|
||||
;%zeropage basicsafe
|
||||
;
|
||||
;
|
||||
;main {
|
||||
; struct Node {
|
||||
; uword value
|
||||
; bool flag
|
||||
; ^^Node next
|
||||
; }
|
||||
;
|
||||
; sub start() {
|
||||
; ^^uword ptr = 3000
|
||||
; ptr^^=9999
|
||||
; txt.print_uw(peekw(3000))
|
||||
; txt.spc()
|
||||
; ptr^^ ++
|
||||
; txt.print_uw(peekw(3000))
|
||||
; txt.spc()
|
||||
; ptr^^ += 123
|
||||
; txt.print_uw(peekw(3000))
|
||||
; txt.spc()
|
||||
; ptr^^ -= 123
|
||||
; txt.print_uw(peekw(3000))
|
||||
; txt.spc()
|
||||
; ptr^^ --
|
||||
; txt.print_uw(peekw(3000))
|
||||
; txt.nl()
|
||||
;
|
||||
; ptr^^ ^= $eeee
|
||||
; ptr^^ = 1111
|
||||
; ptr^^ *= 5
|
||||
; cx16.r0 = 2
|
||||
; ptr^^ *= cx16.r0
|
||||
; uword @shared wvar = 3
|
||||
; ptr^^ *= wvar
|
||||
; wvar = cx16.r0 = 1111
|
||||
; ptr^^ += cx16.r0
|
||||
; ptr^^ += wvar
|
||||
; txt.print_uw(peekw(3000))
|
||||
; txt.nl()
|
||||
; ptr^^ *= 4
|
||||
; ptr^^ /= 4
|
||||
; ptr^^ += 3
|
||||
; ptr^^ -= 3
|
||||
; ptr^^ *= 3
|
||||
; ptr^^ /= 3
|
||||
; ^^float fptr = 0
|
||||
; fptr^^ += 3.0
|
||||
; fptr^^ -= 3.0
|
||||
; fptr^^ *= 3.0
|
||||
; fptr^^ /= 3.0
|
||||
;
|
||||
;
|
||||
;; ^^Node nptr = 30000
|
||||
;; ^^Node nptr2 = Node()
|
||||
;; ^^Node nptr3 = Node(9999, true, 12345)
|
||||
;;
|
||||
;; txt.print_bool(nptr2.flag)
|
||||
;; txt.spc()
|
||||
;; txt.print_bool(nptr3.flag)
|
||||
;; txt.spc()
|
||||
;; txt.print_uw(nptr2.next)
|
||||
;; txt.spc()
|
||||
;; txt.print_uw(nptr3.next)
|
||||
; }
|
||||
;}
|
||||
|
||||
Reference in New Issue
Block a user