fixed swap()

This commit is contained in:
Irmen de Jong 2019-01-19 18:34:22 +01:00
parent 25e44a54fb
commit ef12be062b
18 changed files with 230 additions and 1002 deletions

View File

@ -1,12 +0,0 @@
mkdir compiled_java
java -jar ../antlr/lib/antlr-4.7.2-complete.jar -o ./prog8/parser -Xexact-output-dir -no-listener -no-visitor -package prog8.parser ../antlr/prog8.g4
@dir /b /S src *.java > sources.txt
javac -verbose -d compiled_java -cp ../antlr/lib/antlr-runtime-4.7.2.jar @sources.txt
@del sources.txt
jar cf parser.jar -C compiled_java prog8
set KOTLINC=%USERPROFILE%\.IdeaIC2018.3\config\plugins\kotlin\kotlinc\bin\kotlinc.bat
%KOTLINC% -verbose -include-runtime -d prog8_kotlin.jar -cp ../antlr/lib/antlr-runtime-4.7.2.jar;parser.jar prog8

View File

@ -946,43 +946,14 @@ private class StatementTranslator(private val prog: IntermediateProgram,
throw AstException("swap requires args of numerical type")
// @todo implement these errors as nice AstChecker expression errors.
// eor trick: Swap(X,Y) :=
// X ^= Y
// Y ^= X
// X ^= Y
// this trick is used when we're dealing with: (u)byte or (u)word variables, ... @todo
if(useEorTrickForSwap(dt1, args[0], args[1])) {
val xEorY = BinaryExpression(args[0], "^", args[1], args[0].position)
val yEorX = BinaryExpression(args[1], "^", args[0], args[1].position)
val xIsXeorY = Assignment(listOf(AssignTarget.fromExpr(args[0])), null, xEorY, args[0].position)
val yIsYeorX = Assignment(listOf(AssignTarget.fromExpr(args[1])), null, yEorX, args[1].position)
xIsXeorY.linkParents(args[0].parent)
yIsYeorX.linkParents(args[0].parent)
translate(xIsXeorY)
translate(yIsYeorX)
translate(xIsXeorY)
} else {
translate(args[0])
translate(args[1])
// pop in reverse order
popValueIntoTarget(AssignTarget.fromExpr(args[0]), dt1)
popValueIntoTarget(AssignTarget.fromExpr(args[1]), dt2)
}
translate(args[0])
translate(args[1])
// pop in reverse order
popValueIntoTarget(AssignTarget.fromExpr(args[0]), dt1)
popValueIntoTarget(AssignTarget.fromExpr(args[1]), dt2)
return
}
private fun useEorTrickForSwap(dt: DataType, expr1: IExpression, expr2: IExpression): Boolean {
if(dt in IntegerDatatypes) {
if (expr1 is IdentifierReference && expr2 is IdentifierReference)
return true
if(expr1 is ArrayIndexedExpression && expr2 is ArrayIndexedExpression) {
return expr1.arrayspec.x is LiteralValue && expr2.arrayspec.x is LiteralValue
}
}
return false
}
private fun translateSubroutineCall(subroutine: Subroutine, arguments: List<IExpression>, callPosition: Position) {
// evaluate the arguments and assign them into the subroutine's argument variables.
var restoreX = Register.X in subroutine.asmClobbers

View File

@ -195,7 +195,7 @@ class AsmGen(val options: CompilationOptions, val program: IntermediateProgram,
vardecls2asm(block)
out("")
val instructionPatternWindowSize = 7 // increase once patterns occur longer than this.
val instructionPatternWindowSize = 8 // increase once patterns occur longer than this.
var processed = 0
if(trace) println("BLOCK: ${block.scopedname} ${block.address ?: ""}")
@ -3312,8 +3312,196 @@ class AsmGen(val options: CompilationOptions, val program: IntermediateProgram,
val value = hexVal(segment[0])
" lda #<$value | sta ${ESTACK_LO.toHex()},x | lda #>$value | sta ${ESTACK_HI.toHex()},x | dex | jsr prog8_lib.mul_word"
}
},
// various variable or memory swaps
AsmPattern(listOf(Opcode.PUSH_VAR_BYTE, Opcode.PUSH_VAR_BYTE, Opcode.POP_VAR_BYTE, Opcode.POP_VAR_BYTE)) { segment ->
val var1 = segment[0].callLabel
val var2 = segment[1].callLabel
val var3 = segment[2].callLabel
val var4 = segment[3].callLabel
if(var1==var3 && var2==var4) {
"""
lda $var1
tay
lda $var2
sta $var1
sty $var2
"""
} else null
},
AsmPattern(listOf(Opcode.PUSH_VAR_WORD, Opcode.PUSH_VAR_WORD, Opcode.POP_VAR_WORD, Opcode.POP_VAR_WORD)) { segment ->
val var1 = segment[0].callLabel
val var2 = segment[1].callLabel
val var3 = segment[2].callLabel
val var4 = segment[3].callLabel
if(var1==var3 && var2==var4) {
"""
lda $var1
tay
lda $var2
sta $var1
sty $var2
lda $var1+1
tay
lda $var2+1
sta $var1+1
sty $var2+1
"""
} else null
},
AsmPattern(listOf(Opcode.PUSH_MEM_B, Opcode.PUSH_MEM_B, Opcode.POP_MEM_BYTE, Opcode.POP_MEM_BYTE),
listOf(Opcode.PUSH_MEM_UB, Opcode.PUSH_MEM_UB, Opcode.POP_MEM_BYTE, Opcode.POP_MEM_BYTE)) { segment ->
val addr1 = segment[0].arg!!.integerValue()
val addr2 = segment[1].arg!!.integerValue()
val addr3 = segment[2].arg!!.integerValue()
val addr4 = segment[3].arg!!.integerValue()
if(addr1==addr3 && addr2==addr4) {
"""
lda ${addr1.toHex()}
tay
lda ${addr2.toHex()}
sta ${addr1.toHex()}
sty ${addr2.toHex()}
"""
} else null
},
AsmPattern(listOf(Opcode.PUSH_MEM_W, Opcode.PUSH_MEM_W, Opcode.POP_MEM_WORD, Opcode.POP_MEM_WORD),
listOf(Opcode.PUSH_MEM_UW, Opcode.PUSH_MEM_UW, Opcode.POP_MEM_WORD, Opcode.POP_MEM_WORD)) { segment ->
val addr1 = segment[0].arg!!.integerValue()
val addr2 = segment[1].arg!!.integerValue()
val addr3 = segment[2].arg!!.integerValue()
val addr4 = segment[3].arg!!.integerValue()
if(addr1==addr3 && addr2==addr4) {
"""
lda ${addr1.toHex()}
tay
lda ${addr2.toHex()}
sta ${addr1.toHex()}
sty ${addr2.toHex()}
lda ${(addr1+1).toHex()}
tay
lda ${(addr2+1).toHex()}
sta ${(addr1+1).toHex()}
sty ${(addr2+1).toHex()}
"""
} else null
},
AsmPattern(listOf(Opcode.PUSH_BYTE, Opcode.READ_INDEXED_VAR_BYTE, Opcode.PUSH_BYTE, Opcode.READ_INDEXED_VAR_BYTE,
Opcode.PUSH_BYTE, Opcode.WRITE_INDEXED_VAR_BYTE, Opcode.PUSH_BYTE, Opcode.WRITE_INDEXED_VAR_BYTE)) { segment ->
val i1 = segment[0].arg!!.integerValue()
val i2 = segment[2].arg!!.integerValue()
val i3 = segment[4].arg!!.integerValue()
val i4 = segment[6].arg!!.integerValue()
val array1 = segment[1].callLabel
val array2 = segment[3].callLabel
val array3 = segment[5].callLabel
val array4 = segment[7].callLabel
if(i1==i3 && i2==i4 && array1==array3 && array2==array4) {
"""
lda $array1+$i1
tay
lda $array2+$i2
sta $array1+$i1
sty $array2+$i2
"""
} else null
},
AsmPattern(listOf(Opcode.PUSH_VAR_BYTE, Opcode.READ_INDEXED_VAR_BYTE, Opcode.PUSH_VAR_BYTE, Opcode.READ_INDEXED_VAR_BYTE,
Opcode.PUSH_VAR_BYTE, Opcode.WRITE_INDEXED_VAR_BYTE, Opcode.PUSH_VAR_BYTE, Opcode.WRITE_INDEXED_VAR_BYTE)) { segment ->
val vi1 = segment[0].callLabel
val vi2 = segment[2].callLabel
val vi3 = segment[4].callLabel
val vi4 = segment[6].callLabel
val array1 = segment[1].callLabel
val array2 = segment[3].callLabel
val array3 = segment[5].callLabel
val array4 = segment[7].callLabel
if(vi1==vi3 && vi2==vi4 && array1==array3 && array2==array4) {
val load1 = loadAFromIndexedByVar(segment[0], segment[1])
val load2 = loadAFromIndexedByVar(segment[2], segment[3])
val storeIn1 = storeAToIndexedByVar(segment[0], segment[1])
val storeIn2 = storeAToIndexedByVar(segment[2], segment[3])
"""
$load1
pha
$load2
$storeIn1
pla
$storeIn2
"""
} else null
},
AsmPattern(listOf(Opcode.PUSH_BYTE, Opcode.READ_INDEXED_VAR_WORD, Opcode.PUSH_BYTE, Opcode.READ_INDEXED_VAR_WORD,
Opcode.PUSH_BYTE, Opcode.WRITE_INDEXED_VAR_WORD, Opcode.PUSH_BYTE, Opcode.WRITE_INDEXED_VAR_WORD)) { segment ->
val i1 = segment[0].arg!!.integerValue()*2
val i2 = segment[2].arg!!.integerValue()*2
val i3 = segment[4].arg!!.integerValue()*2
val i4 = segment[6].arg!!.integerValue()*2
val array1 = segment[1].callLabel
val array2 = segment[3].callLabel
val array3 = segment[5].callLabel
val array4 = segment[7].callLabel
if(i1==i3 && i2==i4 && array1==array3 && array2==array4) {
"""
lda $array1+$i1
tay
lda $array2+$i2
sta $array1+$i1
sty $array2+$i2
lda $array1+${i1+1}
tay
lda $array2+${i2+1}
sta $array1+${i1+1}
sty $array2+${i2+1}
"""
} else null
},
AsmPattern(listOf(Opcode.PUSH_VAR_BYTE, Opcode.READ_INDEXED_VAR_WORD, Opcode.PUSH_VAR_BYTE, Opcode.READ_INDEXED_VAR_WORD,
Opcode.PUSH_VAR_BYTE, Opcode.WRITE_INDEXED_VAR_WORD, Opcode.PUSH_VAR_BYTE, Opcode.WRITE_INDEXED_VAR_WORD)) { segment ->
val vi1 = segment[0].callLabel
val vi2 = segment[2].callLabel
val vi3 = segment[4].callLabel
val vi4 = segment[6].callLabel
val array1 = segment[1].callLabel
val array2 = segment[3].callLabel
val array3 = segment[5].callLabel
val array4 = segment[7].callLabel
if(vi1==vi3 && vi2==vi4 && array1==array3 && array2==array4) {
// SCRATCH_B1 = index1
// SCRATCH_REG = index2
// SCRATCH_W1 = temp storage of array[index2]
"""
lda ${segment[0].callLabel}
asl a
sta ${C64Zeropage.SCRATCH_B1}
lda ${segment[2].callLabel}
asl a
sta ${C64Zeropage.SCRATCH_REG}
stx ${C64Zeropage.SCRATCH_REG_X}
tax
lda ${segment[3].callLabel},x
ldy ${segment[3].callLabel}+1,x
sta ${C64Zeropage.SCRATCH_W1}
sty ${C64Zeropage.SCRATCH_W1}+1
ldx ${C64Zeropage.SCRATCH_B1}
lda ${segment[1].callLabel},x
ldy ${segment[1].callLabel}+1,x
ldx ${C64Zeropage.SCRATCH_REG}
sta ${segment[3].callLabel},x
tya
sta ${segment[3].callLabel}+1,x
ldx ${C64Zeropage.SCRATCH_B1}
lda ${C64Zeropage.SCRATCH_W1}
sta ${segment[1].callLabel},x
lda ${C64Zeropage.SCRATCH_W1}+1
sta ${segment[1].callLabel}+1,x
ldx ${C64Zeropage.SCRATCH_REG_X}
"""
} else null
}
)
}

View File

@ -1,860 +0,0 @@
%import c64utils
%import c64flt
%output raw
%launcher none
%address $4000
~ main {
sub start() {
byte b = 99
byte b2 = 100
ubyte ub = 255
ubyte ub2 = 0
word w = 999
word w2 = 3
uword uw = 40000
uword uw2 = 3434
float fl1 = 1.1
float fl2 = 2.2
byte[5] barr1
byte[5] barr2
ubyte[5] ubarr1
ubyte[5] ubarr2
word[5] warr1
word[5] warr2
uword[5] uwarr1
uword[5] uwarr2
float[5] farr1
float[5] farr2
memory byte mbyte = $c000
memory byte mbyte2 = $d000
memory ubyte mubyte = $c001
memory ubyte mubyte2 = $d001
memory word mword = $c002
memory word mword2 = $d002
memory uword muword = $c004
memory uword muword2 = $d004
memory float mfloat = $c006
memory float mfloat2 = $d006
memory byte[mubyte2] mbarr1 = $e000
memory ubyte[mubyte2] mubarr1 = $e100
memory word[mubyte2] mwarr1 = $e100
memory uword[mubyte2] muwarr1 = $e100
str string = "hello"
str_p stringp = "hello"
; some string assignments
str stringvar = "??????????\n\n\nnext line\r\r\rnext line after carriagereturn"
ubyte secretnumber = 0
memory uword freadstr_arg = $22 ; argument for FREADSTR
uword testword
ubyte char1 = '@'
ubyte char2 = '\n'
ubyte char3 = '\r'
ubyte char1b = '@'
ubyte char2b = '\n'
ubyte char3b = '\r'
testword = '@'
testword = '\n'
freadstr_arg = '@'
freadstr_arg = '\n'
secretnumber = '@'
secretnumber = '\r'
testword = stringvar
testword = "stringstring"
freadstr_arg = stringvar
freadstr_arg = "stringstring"
; all possible assignments to a BYTE VARIABLE (not array)
ubyte_assignment_to_register:
A = 42
A = X
A = ub2
A = mubyte2
A = string[4]
A = string[X]
A = string[b]
A = string[ub]
A = string[mbyte2]
A = string[mubyte2]
A = ubarr1[2]
A = ubarr1[X]
A = ubarr1[b]
A = ubarr1[ub]
A = ubarr1[mbyte2]
A = ubarr1[mubyte2]
ubyte_assignment_to_ubytevar:
ub = 42
ub = X
ub = ub2
ub = mubyte2
ub = string[4]
ub = string[X]
ub = string[b]
ub = string[ub]
ub = string[mbyte2]
ub = string[mubyte2]
ub = ubarr1[2]
ub = ubarr1[X]
ub = ubarr1[b]
ub = ubarr1[ub]
ub = ubarr1[mbyte2]
ub = ubarr1[mubyte2]
ubyte_assignment_to_ubytemem:
mubyte = 42
mubyte = X
mubyte = ub2
mubyte = mubyte2
mubyte = string[4]
mubyte = string[X]
mubyte = string[b]
mubyte = string[ub]
mubyte = string[mbyte2]
mubyte = string[mubyte2]
mubyte = ubarr1[2]
mubyte = ubarr1[X]
mubyte = ubarr1[b]
mubyte = ubarr1[ub]
mubyte = ubarr1[mbyte2]
mubyte = ubarr1[mubyte2]
byte_assignment_to_bytevar:
b = -42
b = b2
b = mbyte2
b = barr1[2]
b = barr1[X]
b = barr1[b]
b = barr1[ub]
b = barr1[mbyte2]
b = barr1[mubyte2]
byte_assignment_to_bytemem:
mbyte = -42
mbyte = b2
mbyte = mbyte2
mbyte = barr1[2]
mbyte = barr1[X]
mbyte = barr1[b]
mbyte = barr1[ub]
mbyte = barr1[mbyte2]
mbyte = barr1[mubyte2]
ubyte_assignment_to_ubytearray:
ubarr2[3] = 42
ubarr2[3] = X
ubarr2[3] = ub2
ubarr2[3] = mubyte2
ubarr2[3] = string[4]
ubarr2[3] = string[X]
ubarr2[3] = string[b]
ubarr2[3] = string[ub]
ubarr2[3] = string[mbyte2]
ubarr2[3] = string[mubyte2]
ubarr2[3] = ubarr1[2]
ubarr2[3] = ubarr1[X]
ubarr2[3] = ubarr1[b]
ubarr2[3] = ubarr1[ub]
ubarr2[3] = ubarr1[mbyte2]
ubarr2[3] = ubarr1[mubyte2]
string[4] = 42
string[4] = 'B'
string[4] = X
string[4] = ub2
string[4] = mubyte2
string[4] = ubarr1[2]
string[4] = ubarr1[X]
string[4] = ubarr1[ub]
string[4] = ubarr1[mubyte2]
string[4] = string[3]
string[4] = string[Y]
string[4] = string[ub2]
string[4] = string[mbyte2]
string[4] = string[mubyte2]
ubarr2[Y] = 42
ubarr2[Y] = X
ubarr2[Y] = ub2
ubarr2[Y] = mubyte2
ubarr2[Y] = string[4]
ubarr2[Y] = string[X]
ubarr2[Y] = string[b]
ubarr2[Y] = string[ub]
ubarr2[Y] = string[mbyte2]
ubarr2[Y] = string[mubyte2]
ubarr2[Y] = ubarr1[2]
ubarr2[Y] = ubarr1[X]
ubarr2[Y] = ubarr1[b]
ubarr2[Y] = ubarr1[ub]
ubarr2[Y] = ubarr1[mbyte2]
ubarr2[Y] = ubarr1[mubyte2]
string[Y] = 42
string[Y] = 'B'
string[Y] = X
string[Y] = ub2
string[Y] = mubyte2
string[Y] = ubarr1[2]
string[Y] = ubarr1[Y]
string[Y] = ubarr1[ub2]
string[Y] = ubarr1[mubyte2]
string[Y] = string[Y]
string[Y] = string[ub2]
string[Y] = string[mbyte2]
string[Y] = string[mubyte2]
ubarr2[ub2] = 42
ubarr2[ub2] = X
ubarr2[ub2] = ub2
ubarr2[ub2] = mubyte2
ubarr2[ub2] = string[4]
ubarr2[ub2] = string[X]
ubarr2[ub2] = string[b]
ubarr2[ub2] = string[ub]
ubarr2[ub2] = string[mbyte2]
ubarr2[ub2] = string[mubyte2]
ubarr2[ub2] = ubarr1[2]
ubarr2[ub2] = ubarr1[X]
ubarr2[ub2] = ubarr1[b]
ubarr2[ub2] = ubarr1[ub]
ubarr2[ub2] = ubarr1[mbyte2]
ubarr2[ub2] = ubarr1[mubyte2]
string[ub2] = 42
string[ub2] = 'B'
string[ub2] = X
string[ub2] = ub2
string[ub2] = mubyte2
string[ub2] = ubarr1[2]
string[ub2] = ubarr1[Y]
string[ub2] = ubarr1[ub2]
string[ub2] = ubarr1[mubyte2]
string[ub2] = string[Y]
string[ub2] = string[ub2]
string[ub2] = string[mbyte2]
string[ub2] = string[mubyte2]
ubarr2[b2] = 42
ubarr2[b2] = X
ubarr2[b2] = ub2
ubarr2[b2] = mubyte2
ubarr2[b2] = string[4]
ubarr2[b2] = string[X]
ubarr2[b2] = string[b]
ubarr2[b2] = string[ub]
ubarr2[b2] = string[mbyte2]
ubarr2[b2] = string[mubyte2]
ubarr2[b2] = ubarr1[2]
ubarr2[b2] = ubarr1[X]
ubarr2[b2] = ubarr1[b]
ubarr2[b2] = ubarr1[ub]
ubarr2[b2] = ubarr1[mbyte2]
ubarr2[b2] = ubarr1[mubyte2]
string[b2] = 42
string[b2] = 'B'
string[b2] = X
string[b2] = ub2
string[b2] = mubyte2
string[b2] = ubarr1[2]
string[b2] = ubarr1[Y]
string[b2] = ubarr1[ub2]
string[b2] = ubarr1[mubyte2]
string[b2] = string[Y]
string[b2] = string[ub2]
string[b2] = string[mbyte2]
string[b2] = string[mubyte2]
ubarr2[mubyte2] = 42
ubarr2[mubyte2] = X
ubarr2[mubyte2] = ub2
ubarr2[mubyte2] = mubyte2
ubarr2[mubyte2] = string[4]
ubarr2[mubyte2] = ubarr1[2]
string[mubyte2] = 42
string[mubyte2] = 'B'
string[mubyte2] = X
string[mubyte2] = ub2
string[mubyte2] = mubyte2
string[mubyte2] = ubarr1[2]
ubarr2[mubyte2] = string[Y] ; via evaluation
ubarr2[mubyte2] = string[b] ; via evaluation
ubarr2[mubyte2] = string[ub] ; via evaluation
ubarr2[mubyte2] = string[mbyte2] ; via evaluation
ubarr2[mubyte2] = string[mubyte2] ; via evaluation
ubarr2[mubyte2] = ubarr1[Y] ; via evaluation
ubarr2[mubyte2] = ubarr1[b] ; via evaluation
ubarr2[mubyte2] = ubarr1[ub] ; via evaluation
ubarr2[mubyte2] = ubarr1[mbyte2] ; via evaluation
ubarr2[mubyte2] = ubarr1[mubyte2] ; via evaluation
string[mubyte2] = ubarr1[Y] ; via evaluation
string[mubyte2] = ubarr1[b] ; via evaluation
string[mubyte2] = ubarr1[ub2] ; via evaluation
string[mubyte2] = ubarr1[mbyte2] ; via evaluation
string[mubyte2] = ubarr1[mubyte2] ; via evaluation
string[mubyte2] = string[mubyte2] ; via evaluation
ubarr1[ubarr2[A]] = ubarr2[ubarr1[Y]] ; via evaluation
byte_assignment_to_bytearray:
barr2[3] = 42
barr2[3] = b2
barr2[3] = mbyte2
barr2[3] = barr1[2]
barr2[3] = barr1[X]
barr2[3] = barr1[b]
barr2[3] = barr1[ub]
barr2[3] = barr1[mbyte2]
barr2[3] = barr1[mubyte2]
barr2[Y] = 42
barr2[Y] = b2
barr2[Y] = mbyte2
barr2[Y] = barr1[2]
barr2[Y] = barr1[X]
barr2[Y] = barr1[b]
barr2[Y] = barr1[ub]
barr2[Y] = barr1[mbyte2]
barr2[Y] = barr1[mubyte2]
barr2[b2] = 42
barr2[b2] = b2
barr2[b2] = mbyte2
barr2[b2] = barr1[2]
barr2[b2] = barr1[X]
barr2[b2] = barr1[b]
barr2[b2] = barr1[ub]
barr2[b2] = barr1[mbyte2]
barr2[b2] = barr1[mubyte2]
barr2[ub2] = 42
barr2[ub2] = b2
barr2[ub2] = mbyte2
barr2[ub2] = barr1[2]
barr2[ub2] = barr1[X]
barr2[ub2] = barr1[b]
barr2[ub2] = barr1[ub]
barr2[ub2] = barr1[mbyte2]
barr2[ub2] = barr1[mubyte2]
barr2[mubyte2] = 42
barr2[mubyte2] = b2
barr2[mubyte2] = mbyte2
barr2[mubyte2] = barr1[2]
barr2[mubyte2] = barr1[Y] ; via evaluation
barr2[mubyte2] = barr1[b] ; via evaluation
barr2[mubyte2] = barr1[ub] ; via evaluation
barr2[mubyte2] = barr1[mbyte2] ; via evaluation
barr2[mubyte2] = barr1[mubyte2] ; via evaluation
barr1[ubarr2[A]] = barr2[ubarr1[Y]] ; via evaluation
byte_assignment_to_membytearray:
mbarr1[3] = 42
mbarr1[3] = b2
mbarr1[3] = mbyte2
mbarr1[3] = barr1[2]
mbarr1[3] = barr1[X]
mbarr1[3] = barr1[b]
mbarr1[3] = barr1[ub]
mbarr1[3] = barr1[mbyte2]
mbarr1[3] = barr1[mubyte2]
mbarr1[Y] = 42
mbarr1[Y] = b2
mbarr1[Y] = mbyte2
mbarr1[Y] = barr1[2]
mbarr1[Y] = barr1[X]
mbarr1[Y] = barr1[b]
mbarr1[Y] = barr1[ub]
mbarr1[Y] = barr1[mbyte2]
mbarr1[Y] = barr1[mubyte2]
mbarr1[b2] = 42
mbarr1[b2] = b2
mbarr1[b2] = mbyte2
mbarr1[b2] = barr1[2]
mbarr1[b2] = barr1[X]
mbarr1[b2] = barr1[b]
mbarr1[b2] = barr1[ub]
mbarr1[b2] = barr1[mbyte2]
mbarr1[b2] = barr1[mubyte2]
mbarr1[ub2] = 42
mbarr1[ub2] = b2
mbarr1[ub2] = mbyte2
mbarr1[ub2] = barr1[2]
mbarr1[ub2] = barr1[X]
mbarr1[ub2] = barr1[b]
mbarr1[ub2] = barr1[ub]
mbarr1[ub2] = barr1[mbyte2]
mbarr1[ub2] = barr1[mubyte2]
mbarr1[mubyte2] = 42
mbarr1[mubyte2] = b2
mbarr1[mubyte2] = mbyte2
mbarr1[mubyte2] = barr1[2]
mbarr1[mubyte2] = barr1[Y] ; via evaluation
mbarr1[mubyte2] = barr1[b] ; via evaluation
mbarr1[mubyte2] = barr1[ub] ; via evaluation
mbarr1[mubyte2] = barr1[mbyte2] ; via evaluation
mbarr1[mubyte2] = barr1[mubyte2] ; via evaluation
mbarr1[ubarr2[A]] = barr2[ubarr1[Y]] ; via evaluation
; all possible assignments to a UWORD VARIABLE (not array)
uword_assignment_to_uwordvar:
uw = 42
uw = 42.w
uw = 42555
uw = X
uw = ub2
uw = uw2
uw = mubyte2
uw = muword2
uw = string[4]
uw = ubarr1[2]
uw = uwarr1[2]
uw = string[X]
uw = string[b]
uw = string[ub]
uw = string[mbyte2]
uw = string[mubyte2]
uw = ubarr1[X]
uw = ubarr1[b]
uw = ubarr1[ub]
uw = ubarr1[mbyte2]
uw = ubarr1[mubyte2]
uw = uwarr1[X]
uw = uwarr1[b]
uw = uwarr1[ub]
uw = uwarr1[mbyte2]
uw = uwarr1[mubyte2]
uword_assignment_to_uwordmem:
muword = 42
muword = 42.w
muword = 42555
muword = X
muword = ub2
muword = uw2
muword = mubyte2
muword = muword2
muword = string[4]
muword = ubarr1[2]
muword = uwarr1[2]
muword = string[X]
muword = string[b]
muword = string[ub]
muword = string[mbyte2]
muword = string[mubyte2]
muword = ubarr1[X]
muword = ubarr1[b]
muword = ubarr1[ub]
muword = ubarr1[mbyte2]
muword = ubarr1[mubyte2]
muword = uwarr1[X]
muword = uwarr1[b]
muword = uwarr1[ub]
muword = uwarr1[mbyte2]
muword = uwarr1[mubyte2]
uword_assignment_to_uwordarray:
uwarr1[2] = 42
uwarr1[2] = 42.w
uwarr1[2] = 42555
uwarr1[2] = X
uwarr1[2] = ub2
uwarr1[2] = uw2
uwarr1[2] = mubyte2
uwarr1[2] = muword2
uwarr1[2] = string[4]
uwarr1[2] = ubarr1[2]
uwarr1[2] = uwarr1[2]
uwarr1[Y] = 42
uwarr1[Y] = 42.w
uwarr1[Y] = 42555
uwarr1[Y] = X
uwarr1[Y] = ub2
uwarr1[Y] = uw2
uwarr1[Y] = mubyte2
uwarr1[Y] = muword2
uwarr1[Y] = string[4]
uwarr1[Y] = ubarr1[2]
uwarr1[Y] = uwarr1[2]
uwarr1[b] = 42
uwarr1[b] = 42.w
uwarr1[b] = 42555
uwarr1[b] = X
uwarr1[b] = ub2
uwarr1[b] = uw2
uwarr1[b] = mubyte2
uwarr1[b] = muword2
uwarr1[b] = string[4]
uwarr1[b] = ubarr1[2]
uwarr1[b] = uwarr1[2]
uwarr1[ub] = 42
uwarr1[ub] = 42.w
uwarr1[ub] = 42555
uwarr1[ub] = X
uwarr1[ub] = ub2
uwarr1[ub] = uw2
uwarr1[ub] = mubyte2
uwarr1[ub] = muword2
uwarr1[ub] = string[4]
uwarr1[ub] = ubarr1[2]
uwarr1[ub] = uwarr1[2]
uwarr1[mbyte2] = 42
uwarr1[mbyte2] = 42.w
uwarr1[mbyte2] = 42555
uwarr1[mbyte2] = X
uwarr1[mbyte2] = ub2
uwarr1[mbyte2] = uw2
uwarr1[mbyte2] = mubyte2
uwarr1[mbyte2] = muword2
uwarr1[mbyte2] = string[4]
uwarr1[mbyte2] = ubarr1[2]
uwarr1[mbyte2] = uwarr1[2]
uwarr1[mubyte2] = 42
uwarr1[mubyte2] = 42.w
uwarr1[mubyte2] = 42555
uwarr1[mubyte2] = X
uwarr1[mubyte2] = ub2
uwarr1[mubyte2] = uw2
uwarr1[mubyte2] = mubyte2
uwarr1[mubyte2] = muword2
uwarr1[mubyte2] = string[4]
uwarr1[mubyte2] = ubarr1[2]
uwarr1[mubyte2] = uwarr1[2]
uwarr1[2] = string[Y] ; via evaluation
uwarr1[2] = string[b] ; via evaluation
uwarr1[2] = string[ub] ; via evaluation
uwarr1[2] = string[mbyte2] ; via evaluation
uwarr1[2] = string[mubyte2] ; via evaluation
uwarr1[2] = ubarr1[Y] ; via evaluation
uwarr1[2] = ubarr1[b] ; via evaluation
uwarr1[2] = ubarr1[ub] ; via evaluation
uwarr1[2] = ubarr1[mbyte2] ; via evaluation
uwarr1[2] = ubarr1[mubyte2] ; via evaluation
uwarr1[2] = uwarr1[Y] ; via evaluation
uwarr1[2] = uwarr1[b] ; via evaluation
uwarr1[2] = uwarr1[ub] ; via evaluation
uwarr1[2] = uwarr1[mbyte2] ; via evaluation
uwarr1[2] = uwarr1[mubyte2] ; via evaluation
word_assignment_to_wordvar:
w = -42
w = -42.w
w = 12555
w = X
w = ub2
w = b2
w = w2
w = mubyte2
w = mbyte2
w = mword2
w = string[4]
w = ubarr1[2]
w = barr1[2]
w = warr1[2]
w = string[X]
w = string[b]
w = string[ub]
w = string[mbyte2]
w = string[mubyte2]
w = barr1[X]
w = ubarr1[X]
w = barr1[b]
w = ubarr1[b]
w = barr1[ub]
w = ubarr1[ub]
w = barr1[mbyte2]
w = ubarr1[mbyte2]
w = barr1[mubyte2]
w = ubarr1[mubyte2]
w = warr1[X]
w = warr1[b]
w = warr1[ub]
w = warr1[mbyte2]
w = warr1[mubyte2]
word_assignment_to_wordmem:
mword = -42
mword = -42.w
mword = 12555
mword = X
mword = ub2
mword = b2
mword = w2
mword = mubyte2
mword = mbyte2
mword = mword2
mword = string[4]
mword = ubarr1[2]
mword = barr1[2]
mword = warr1[2]
mword = string[X]
mword = string[b]
mword = string[ub]
mword = string[mbyte2]
mword = string[mubyte2]
mword = barr1[X]
mword = ubarr1[X]
mword = barr1[b]
mword = ubarr1[b]
mword = barr1[ub]
mword = ubarr1[ub]
mword = barr1[mbyte2]
mword = ubarr1[mbyte2]
mword = barr1[mubyte2]
mword = ubarr1[mubyte2]
mword = warr1[X]
mword = warr1[b]
mword = warr1[ub]
mword = warr1[mbyte2]
mword = warr1[mubyte2]
word_assignment_to_wordarray:
warr2[2] = -42
warr2[2] = -42.w
warr2[2] = 12555
warr2[2] = X
warr2[2] = ub2
warr2[2] = b2
warr2[2] = w2
warr2[2] = mubyte2
warr2[2] = mbyte2
warr2[2] = mword2
warr2[2] = string[4]
warr2[2] = ubarr1[2]
warr2[2] = barr1[2]
warr2[2] = warr1[2]
warr2[Y] = -42
warr2[Y] = -42.w
warr2[Y] = 12555
warr2[Y] = X
warr2[Y] = ub2
warr2[Y] = b2
warr2[Y] = w2
warr2[Y] = mubyte2
warr2[Y] = mbyte2
warr2[Y] = mword2
warr2[Y] = string[4]
warr2[Y] = ubarr1[2]
warr2[Y] = barr1[2]
warr2[Y] = warr1[2]
warr2[b] = -42
warr2[b] = -42.w
warr2[b] = 12555
warr2[b] = X
warr2[b] = ub2
warr2[b] = b2
warr2[b] = w2
warr2[b] = mubyte2
warr2[b] = mbyte2
warr2[b] = mword2
warr2[b] = string[4]
warr2[b] = ubarr1[2]
warr2[b] = barr1[2]
warr2[b] = warr1[2]
warr2[ub] = -42
warr2[ub] = -42.w
warr2[ub] = 14255
warr2[ub] = X
warr2[ub] = ub2
warr2[ub] = b2
warr2[ub] = w2
warr2[ub] = mubyte2
warr2[ub] = mbyte2
warr2[ub] = mword2
warr2[ub] = string[4]
warr2[ub] = ubarr1[2]
warr2[ub] = barr1[2]
warr2[ub] = warr1[2]
warr2[mbyte2] = -42
warr2[mbyte2] = -42.w
warr2[mbyte2] = 12555
warr2[mbyte2] = X
warr2[mbyte2] = ub2
warr2[mbyte2] = b2
warr2[mbyte2] = w2
warr2[mbyte2] = mubyte2
warr2[mbyte2] = mbyte2
warr2[mbyte2] = mword2
warr2[mbyte2] = string[4]
warr2[mbyte2] = ubarr1[2]
warr2[mbyte2] = barr1[2]
warr2[mbyte2] = warr1[2]
warr2[mubyte2] = -42
warr2[mubyte2] = -42.w
warr2[mubyte2] = 12555
warr2[mubyte2] = X
warr2[mubyte2] = ub2
warr2[mubyte2] = b2
warr2[mubyte2] = w2
warr2[mubyte2] = mubyte2
warr2[mubyte2] = mbyte2
warr2[mubyte2] = mword2
warr2[mubyte2] = string[4]
warr2[mubyte2] = ubarr1[2]
warr2[mubyte2] = barr1[2]
warr2[mubyte2] = warr1[2]
warr1[2] = string[Y] ; via evaluation
warr1[2] = string[b] ; via evaluation
warr1[2] = string[ub] ; via evaluation
warr1[2] = string[mbyte2] ; via evaluation
warr1[2] = string[mubyte2] ; via evaluation
warr1[2] = barr1[Y] ; via evaluation
warr1[2] = barr1[b] ; via evaluation
warr1[2] = barr1[ub] ; via evaluation
warr1[2] = barr1[mbyte2] ; via evaluation
warr1[2] = barr1[mubyte2] ; via evaluation
warr1[2] = warr1[Y] ; via evaluation
warr1[2] = warr1[b] ; via evaluation
warr1[2] = warr1[ub] ; via evaluation
warr1[2] = warr1[mbyte2] ; via evaluation
warr1[2] = warr1[mubyte2] ; via evaluation
;; all possible assignments to a FLOAT VARIABLE
float_assignment_to_floatvar:
fl1 = 34
fl1 = 34555.w
fl1 = 3.33e22
fl1 = X
fl1 = b2
fl1 = ub2
fl1 = w2
fl1 = uw2
fl1 = mbyte
fl1 = mubyte
fl1 = mword
fl1 = muword
fl1 = fl2
fl1 = mfloat2
fl1 = barr1[2]
fl1 = ubarr1[2]
fl1 = warr1[2]
fl1 = uwarr1[2]
fl1 = string[4]
fl1 = farr1[4]
fl1 = string[Y] ; via evaluation
fl1 = string[b] ; via evaluation
fl1 = string[ub] ; via evaluation
fl1 = string[mbyte2] ; via evaluation
fl1 = string[mubyte2] ; via evaluation
fl1 = barr1[Y] ; via evaluation
fl1 = ubarr1[Y] ; via evaluation
fl1 = barr1[b] ; via evaluation
fl1 = ubarr1[b] ; via evaluation
fl1 = barr1[ub] ; via evaluation
fl1 = ubarr1[ub] ; via evaluation
fl1 = barr1[mbyte2] ; via evaluation
fl1 = ubarr1[mbyte2] ; via evaluation
fl1 = barr1[mubyte2] ; via evaluation
fl1 = ubarr1[mubyte2] ; via evaluation
fl1 = warr1[Y] ; via evaluation
fl1 = warr1[b] ; via evaluation
fl1 = warr1[ub] ; via evaluation
fl1 = warr1[mbyte2] ; via evaluation
fl1 = warr1[mubyte2] ; via evaluation
float_assignment_to_floatmem:
mfloat = 34
mfloat = 34555.w
mfloat = 3.33e22
mfloat = X
mfloat = b2
mfloat = ub2
mfloat = w2
mfloat = uw2
mfloat = mbyte
mfloat = mubyte
mfloat = mword
mfloat = muword
mfloat = fl2
mfloat = mfloat2
mfloat = barr1[2]
mfloat = ubarr1[2]
mfloat = warr1[2]
mfloat = uwarr1[2]
mfloat = string[4]
mfloat = farr1[4]
mfloat = string[Y] ; via evaluation
mfloat = string[b] ; via evaluation
mfloat = string[ub] ; via evaluation
mfloat = string[mbyte2] ; via evaluation
mfloat = string[mubyte2] ; via evaluation
mfloat = barr1[Y] ; via evaluation
mfloat = ubarr1[Y] ; via evaluation
mfloat = barr1[b] ; via evaluation
mfloat = ubarr1[b] ; via evaluation
mfloat = barr1[ub] ; via evaluation
mfloat = ubarr1[ub] ; via evaluation
mfloat = barr1[mbyte2] ; via evaluation
mfloat = ubarr1[mbyte2] ; via evaluation
mfloat = barr1[mubyte2] ; via evaluation
mfloat = ubarr1[mubyte2] ; via evaluation
mfloat = warr1[Y] ; via evaluation
mfloat = warr1[b] ; via evaluation
mfloat = warr1[ub] ; via evaluation
mfloat = warr1[mbyte2] ; via evaluation
mfloat = warr1[mubyte2] ; via evaluation
return
}
}

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
examples/compiled/hello.prg Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,6 @@
These .prg files are the compiled versions of most of the examples.
They can be loaded and ran on a C64 or in an emulator, for example in Vice:
x64 hello.prg
will load and run the hello example.

Binary file not shown.

Binary file not shown.

BIN
examples/compiled/swirl.prg Normal file

Binary file not shown.

Binary file not shown.

View File

@ -1,78 +0,0 @@
%import c64utils
%import c64flt
; The classic number guessing game.
; This version uses more low-level subroutines (calls directly into the C64's ROM routines)
; and instead of a loop (with the added behind the scenes processing), uses absolute jumps.
; It's less readable I think, but produces a smaller program.
~ main {
sub start() {
str name = "????????????????????????????????????????"
str input = "??????????"
ubyte guess
ubyte secretnumber = 0
ubyte attempts_left = 10
memory uword freadstr_arg = $22 ; argument for FREADSTR ($22/$23)
; greeting
c64.VMCSB |= 2 ; switch lowercase chars
c64.STROUT("Please introduce yourself: ")
c64scr.input_chars(name)
c64.CHROUT('\n')
c64.CHROUT('\n')
c64.STROUT("Hello, ")
c64.STROUT(name)
c64.STROUT(".\nLet's play a number guessing game.\nI am thinking of a number from 1 to 100!You'll have to guess it!\n")
; create a secret random number from 1-100
c64flt.RND() ; fac = random number between 0 and 1
c64flt.MUL10() ; fac *= 10
c64flt.MUL10() ; .. and now *100
c64flt.FADDH() ; add 0.5..
c64flt.FADDH() ; and again, so +1 total
A, Y = c64flt.GETADRAY()
secretnumber = A ; secret number = rnd()*100+1
ask_guess:
c64.STROUT("\nYou have ")
c64scr.print_ub(attempts_left)
c64.STROUT(" guess")
if(attempts_left>1)
c64.STROUT("es")
c64.STROUT(" left.\nWhat is your next guess? ")
Y=c64scr.input_chars(input)
c64.CHROUT('\n')
freadstr_arg = input
c64flt.FREADSTR(Y)
A, Y = c64flt.GETADRAY()
guess=A
if(guess==secretnumber) {
c64.STROUT("\nThat's my number, impressive!\n")
goto goodbye
}
c64.STROUT("\nThat is too ")
if(guess < secretnumber)
c64.STROUT("low!\n")
else
c64.STROUT("high!\n")
attempts_left--
if_nz goto ask_guess
; game over.
c64.STROUT("\nToo bad! It was: ")
c64scr.print_ub(secretnumber)
c64.CHROUT('\n')
goodbye:
c64.STROUT("\nThanks for playing, ")
c64.STROUT(name)
c64.STROUT(".\n")
return
}
}

View File

@ -13,10 +13,19 @@
word w1
word w2
ubyte[3] uba
byte[3] ba
uword[3] uwa
word[3] wa
memory ubyte mub1 = $c000
memory ubyte mub2 = $c001
memory uword muw1 = $c100
memory uword muw2 = $c102
ubyte[3] uba1
byte[3] ba1
uword[3] uwa1
word[3] wa1
ubyte[3] uba2
byte[3] ba2
uword[3] uwa2
word[3] wa2
; ub1 = ub2 & 44
; b1 = b2 & 44
@ -48,24 +57,28 @@
swap(b1, b2)
swap(uw1, uw2)
swap(w1, w2)
swap(@($d020), @($d021))
swap(mub1, mub2)
swap(muw1, muw2)
swap(mub1, ub2)
swap(muw1, uw2)
swap(uba[0], uba[1])
swap(ba[0], ba[1])
swap(uwa[0], uwa[1])
swap(wa[0], wa[1])
swap(uba1[1], uba2[2])
swap(ba1[1], ba2[2])
swap(uwa1[1], uwa2[2])
swap(wa1[1], wa2[2])
; this goes without xor trick:
ubyte i1
ubyte i2
swap(uba[i1], uba[i2])
swap(ba[i1], ba[i2])
swap(uwa[i1], uwa[i2])
swap(wa[i1], wa[i2])
swap(uba1[i1], uba2[i2])
swap(ba1[i1], ba2[i2])
swap(uwa1[i1], uwa2[i2])
swap(wa1[i1], wa2[i2])
swap(uba[1], ub1)
swap(uba[i1], ub1)
swap(uwa[1], uw1)
swap(uwa[i1], uw1)
swap(uba1[1], ub1)
swap(uba1[i1], ub1)
swap(uwa1[1], uw1)
swap(uwa1[i1], uw1)
}