Compare commits

..
12 Commits
14 changed files with 1799 additions and 1620 deletions

No files matched your search

+44 -2
View File
@@ -658,8 +658,8 @@ func_all_f .proc
dey
cmp #0
beq +
cpy #255
bne -
cpy #255
bne -
lda #1
sta c64.ESTACK_LO+1,x
rts
@@ -739,3 +739,45 @@ sign_f .proc
dex
rts
.pend
set_0_array_float .proc
; -- set a float in an array to zero (index on stack, array in SCRATCH_ZPWORD1)
inx
lda c64.ESTACK_LO,x
asl a
asl a
clc
adc c64.ESTACK_LO,x
tay
lda #0
sta (c64.SCRATCH_ZPWORD1),y
iny
sta (c64.SCRATCH_ZPWORD1),y
iny
sta (c64.SCRATCH_ZPWORD1),y
iny
sta (c64.SCRATCH_ZPWORD1),y
iny
sta (c64.SCRATCH_ZPWORD1),y
rts
.pend
set_array_float .proc
; -- set a float in an array to a value (index on stack, float in SCRATCH_ZPWORD1, array in SCRATCH_ZPWORD2)
inx
lda c64.ESTACK_LO,x
asl a
asl a
clc
adc c64.ESTACK_LO,x
clc
adc c64.SCRATCH_ZPWORD2
ldy c64.SCRATCH_ZPWORD2+1
bcc +
iny
+ jmp copy_float
; -- copies the 5 bytes of the mflt value pointed to by SCRATCH_ZPWORD1,
; into the 5 bytes pointed to by A/Y. Clobbers A,Y.
.pend
+250 -30
View File
@@ -1772,7 +1772,6 @@ _loop_hi ldy _index_first
ror2_mem_ub .proc
; -- in-place 8-bit ror of byte at memory location on stack
; TODO use self modifying code here
inx
lda c64.ESTACK_LO,x
sta c64.SCRATCH_ZPWORD1
@@ -1789,7 +1788,6 @@ ror2_mem_ub .proc
rol2_mem_ub .proc
; -- in-place 8-bit rol of byte at memory location on stack
; TODO use self modifying code here
inx
lda c64.ESTACK_LO,x
sta c64.SCRATCH_ZPWORD1
@@ -1804,57 +1802,279 @@ rol2_mem_ub .proc
.pend
lsl_array_b .proc
.warn "lsl_array_b" ; TODO
.pend
lsl_array_w .proc
.warn "lsl_array_w" ; TODO
; -- lsl a (u)byte in an array (index and array address on stack)
inx
ldy c64.ESTACK_LO,x
inx
lda c64.ESTACK_LO,x
sta c64.SCRATCH_ZPWORD1
lda c64.ESTACK_HI,x
sta c64.SCRATCH_ZPWORD1+1
lda (c64.SCRATCH_ZPWORD1),y
asl a
sta (c64.SCRATCH_ZPWORD1),y
rts
.pend
lsr_array_ub .proc
.warn "lsr_array_ub" ; TODO
; -- lsr a ubyte in an array (index and array address on stack)
inx
ldy c64.ESTACK_LO,x
inx
lda c64.ESTACK_LO,x
sta c64.SCRATCH_ZPWORD1
lda c64.ESTACK_HI,x
sta c64.SCRATCH_ZPWORD1+1
lda (c64.SCRATCH_ZPWORD1),y
lsr a
sta (c64.SCRATCH_ZPWORD1),y
rts
.pend
lsr_array_b .proc
.warn "lsr_array_b" ; TODO
; -- lsr a byte in an array (index and array address on stack)
inx
ldy c64.ESTACK_LO,x
inx
lda c64.ESTACK_LO,x
sta c64.SCRATCH_ZPWORD1
lda c64.ESTACK_HI,x
sta c64.SCRATCH_ZPWORD1+1
lda (c64.SCRATCH_ZPWORD1),y
asl a
lda (c64.SCRATCH_ZPWORD1),y
ror a
sta (c64.SCRATCH_ZPWORD1),y
rts
.pend
lsl_array_w .proc
; -- lsl a (u)word in an array (index and array address on stack)
inx
lda c64.ESTACK_LO,x
asl a
tay
inx
lda c64.ESTACK_LO,x
sta c64.SCRATCH_ZPWORD1
lda c64.ESTACK_HI,x
sta c64.SCRATCH_ZPWORD1+1
lda (c64.SCRATCH_ZPWORD1),y
asl a
sta (c64.SCRATCH_ZPWORD1),y
iny
lda (c64.SCRATCH_ZPWORD1),y
rol a
sta (c64.SCRATCH_ZPWORD1),y
rts
.pend
lsr_array_uw .proc
.warn "lsr_array_uw" ; TODO
; -- lsr a uword in an array (index and array address on stack)
inx
lda c64.ESTACK_LO,x
asl a
tay
inx
lda c64.ESTACK_LO,x
sta c64.SCRATCH_ZPWORD1
lda c64.ESTACK_HI,x
sta c64.SCRATCH_ZPWORD1+1
iny
lda (c64.SCRATCH_ZPWORD1),y
lsr a
sta (c64.SCRATCH_ZPWORD1),y
dey
lda (c64.SCRATCH_ZPWORD1),y
ror a
sta (c64.SCRATCH_ZPWORD1),y
rts
.pend
lsr_array_w .proc
.warn "lsr_array_w" ; TODO
; -- lsr a uword in an array (index and array address on stack)
inx
lda c64.ESTACK_LO,x
asl a
tay
inx
lda c64.ESTACK_LO,x
sta c64.SCRATCH_ZPWORD1
lda c64.ESTACK_HI,x
sta c64.SCRATCH_ZPWORD1+1
iny
lda (c64.SCRATCH_ZPWORD1),y
asl a
lda (c64.SCRATCH_ZPWORD1),y
ror a
sta (c64.SCRATCH_ZPWORD1),y
dey
lda (c64.SCRATCH_ZPWORD1),y
ror a
sta (c64.SCRATCH_ZPWORD1),y
rts
.pend
rol_array_ub .proc
.warn "rol_array_ub" ; TODO
; -- rol a ubyte in an array (index and array address on stack)
inx
ldy c64.ESTACK_LO,x
inx
lda c64.ESTACK_LO,x
sta c64.SCRATCH_ZPWORD1
lda c64.ESTACK_HI,x
sta c64.SCRATCH_ZPWORD1+1
lda (c64.SCRATCH_ZPWORD1),y
rol a
sta (c64.SCRATCH_ZPWORD1),y
rts
.pend
rol_array_uw .proc
.warn "rol_array_uw" ; TODO
.pend
rol2_array_ub .proc
.warn "rol2_array_ub" ; TODO
.pend
rol2_array_uw .proc
.warn "rol2_array_uw" ; TODO
.pend
ror_array_ub .proc
.warn "ror_array_ub" ; TODO
.pend
ror_array_uw .proc
.warn "ror_array_uw" ; TODO
; -- ror a ubyte in an array (index and array address on stack)
inx
ldy c64.ESTACK_LO,x
inx
lda c64.ESTACK_LO,x
sta c64.SCRATCH_ZPWORD1
lda c64.ESTACK_HI,x
sta c64.SCRATCH_ZPWORD1+1
lda (c64.SCRATCH_ZPWORD1),y
ror a
sta (c64.SCRATCH_ZPWORD1),y
rts
.pend
ror2_array_ub .proc
.warn "ror2_array_ub" ; TODO
; -- ror2 (8-bit ror) a ubyte in an array (index and array address on stack)
inx
ldy c64.ESTACK_LO,x
inx
lda c64.ESTACK_LO,x
sta c64.SCRATCH_ZPWORD1
lda c64.ESTACK_HI,x
sta c64.SCRATCH_ZPWORD1+1
lda (c64.SCRATCH_ZPWORD1),y
lsr a
bcc +
ora #$80
+ sta (c64.SCRATCH_ZPWORD1),y
rts
.pend
rol2_array_ub .proc
; -- rol2 (8-bit rol) a ubyte in an array (index and array address on stack)
inx
ldy c64.ESTACK_LO,x
inx
lda c64.ESTACK_LO,x
sta c64.SCRATCH_ZPWORD1
lda c64.ESTACK_HI,x
sta c64.SCRATCH_ZPWORD1+1
lda (c64.SCRATCH_ZPWORD1),y
cmp #$80
rol a
sta (c64.SCRATCH_ZPWORD1),y
rts
.pend
ror_array_uw .proc
; -- ror a uword in an array (index and array address on stack)
php
inx
lda c64.ESTACK_LO,x
asl a
tay
inx
lda c64.ESTACK_LO,x
sta c64.SCRATCH_ZPWORD1
lda c64.ESTACK_HI,x
sta c64.SCRATCH_ZPWORD1+1
iny
lda (c64.SCRATCH_ZPWORD1),y
plp
ror a
sta (c64.SCRATCH_ZPWORD1),y
dey
lda (c64.SCRATCH_ZPWORD1),y
ror a
sta (c64.SCRATCH_ZPWORD1),y
rts
.pend
rol_array_uw .proc
; -- rol a uword in an array (index and array address on stack)
php
inx
lda c64.ESTACK_LO,x
asl a
tay
inx
lda c64.ESTACK_LO,x
sta c64.SCRATCH_ZPWORD1
lda c64.ESTACK_HI,x
sta c64.SCRATCH_ZPWORD1+1
lda (c64.SCRATCH_ZPWORD1),y
plp
rol a
sta (c64.SCRATCH_ZPWORD1),y
iny
lda (c64.SCRATCH_ZPWORD1),y
rol a
sta (c64.SCRATCH_ZPWORD1),y
rts
.pend
rol2_array_uw .proc
; -- rol2 (16-bit rol) a uword in an array (index and array address on stack)
inx
lda c64.ESTACK_LO,x
asl a
tay
inx
lda c64.ESTACK_LO,x
sta c64.SCRATCH_ZPWORD1
lda c64.ESTACK_HI,x
sta c64.SCRATCH_ZPWORD1+1
lda (c64.SCRATCH_ZPWORD1),y
asl a
sta (c64.SCRATCH_ZPWORD1),y
iny
lda (c64.SCRATCH_ZPWORD1),y
rol a
sta (c64.SCRATCH_ZPWORD1),y
bcc +
dey
lda (c64.SCRATCH_ZPWORD1),y
adc #0
sta (c64.SCRATCH_ZPWORD1),y
+ rts
.pend
ror2_array_uw .proc
.warn "ror2_array_uw" ; TODO
; -- ror2 (16-bit ror) a uword in an array (index and array address on stack)
inx
lda c64.ESTACK_LO,x
asl a
tay
inx
lda c64.ESTACK_LO,x
sta c64.SCRATCH_ZPWORD1
lda c64.ESTACK_HI,x
sta c64.SCRATCH_ZPWORD1+1
iny
lda (c64.SCRATCH_ZPWORD1),y
lsr a
sta (c64.SCRATCH_ZPWORD1),y
dey
lda (c64.SCRATCH_ZPWORD1),y
ror a
sta (c64.SCRATCH_ZPWORD1),y
bcc +
iny
lda (c64.SCRATCH_ZPWORD1),y
ora #$80
sta (c64.SCRATCH_ZPWORD1),y
+ rts
.pend
+1 -1
View File
@@ -1 +1 @@
1.90
1.91
@@ -82,7 +82,7 @@ internal class AstChecker(private val program: Program,
override fun visit(returnStmt: Return) {
val expectedReturnValues = returnStmt.definingSubroutine()?.returntypes ?: emptyList()
if(expectedReturnValues.size>1) {
throw AstException("cannot use a return with one value in a subroutine that has multiple return values: $returnStmt")
throw FatalAstException("cannot use a return with one value in a subroutine that has multiple return values: $returnStmt")
}
if(expectedReturnValues.isEmpty() && returnStmt.value!=null) {
@@ -588,7 +588,7 @@ internal class AstChecker(private val program: Program,
val declValue = decl.value
if(declValue!=null && decl.type==VarDeclType.VAR && !declValue.inferType(program).istype(decl.datatype))
throw FatalAstException("initialisation value $declValue is of different type (${declValue.inferType(program)} as the variable (${decl.datatype}) at ${decl.position}")
err("initialisation value has incompatible type (${declValue.inferType(program)}) for the variable (${decl.datatype})", declValue.position)
super.visit(decl)
}
@@ -1268,7 +1268,7 @@ internal class AstChecker(private val program: Program,
correct = array.all { it in -32768..32767 }
}
DataType.ARRAY_F -> correct = true
else -> throw AstException("invalid array type $type")
else -> throw FatalAstException("invalid array type $type")
}
if (!correct)
errors.err("array value out of range for type $type", value.position)
+3
View File
@@ -165,6 +165,9 @@ private fun optimizeAst(programAst: Program, errors: ErrorReporter) {
if (optsDone1 + optsDone2 == 0)
break
}
// because simplified statements and expressions could give rise to more constants that can be folded away:
programAst.constantFold(errors)
errors.handle()
}
private fun postprocessAst(programAst: Program, errors: ErrorReporter, compilerOptions: CompilationOptions) {
@@ -575,20 +575,12 @@ internal class AssignmentAsmGen(private val program: Program, private val asmgen
} else {
asmgen.translateExpression(index)
asmgen.out("""
inx
lda $ESTACK_LO_HEX,x
asl a
asl a
clc
adc $ESTACK_LO_HEX,x
tay
lda #0
sta $targetName,y
sta $targetName+1,y
sta $targetName+2,y
sta $targetName+3,y
sta $targetName+4,y
""") // TODO use a subroutine for this
lda #<${targetName}
sta ${C64Zeropage.SCRATCH_W1}
lda #>${targetName}
sta ${C64Zeropage.SCRATCH_W1 + 1}
jsr c64flt.set_0_array_float
""")
}
}
else -> throw AssemblyError("no asm gen for assign float 0.0 to $target")
@@ -632,23 +624,16 @@ internal class AssignmentAsmGen(private val program: Program, private val asmgen
} else {
asmgen.translateArrayIndexIntoA(targetArrayIdx)
asmgen.out("""
sta ${C64Zeropage.SCRATCH_REG}
asl a
asl a
clc
adc ${C64Zeropage.SCRATCH_REG}
tay
lda $constFloat
sta $arrayVarName,y
lda $constFloat+1
sta $arrayVarName+1,y
lda $constFloat+2
sta $arrayVarName+2,y
lda $constFloat+3
sta $arrayVarName+3,y
lda $constFloat+4
sta $arrayVarName+4,y
""") // TODO use a subroutine for this
lda #<${constFloat}
sta ${C64Zeropage.SCRATCH_W1}
lda #>${constFloat}
sta ${C64Zeropage.SCRATCH_W1 + 1}
lda #<${arrayVarName}
sta ${C64Zeropage.SCRATCH_W2}
lda #>${arrayVarName}
sta ${C64Zeropage.SCRATCH_W2 + 1}
jsr c64flt.set_array_float
""")
}
}
else -> throw AssemblyError("no asm gen for assign float $float to $target")
File diff suppressed because it is too large. Load diff
@@ -104,17 +104,14 @@ internal class PostIncrDecrAsmGen(private val program: Program, private val asmg
}
}
is RegisterExpr -> {
// TODO optimize common cases
asmgen.translateArrayIndexIntoA(targetArrayIdx)
incrDecrArrayvalueWithIndexA(incr, arrayDt, what)
}
is IdentifierReference -> {
// TODO optimize common cases
asmgen.translateArrayIndexIntoA(targetArrayIdx)
incrDecrArrayvalueWithIndexA(incr, arrayDt, what)
}
else -> {
// TODO optimize common cases
asmgen.translateArrayIndexIntoA(targetArrayIdx)
incrDecrArrayvalueWithIndexA(incr, arrayDt, what)
}
@@ -31,7 +31,7 @@ internal class ExpressionSimplifier(private val program: Program) : AstWalker()
override fun after(assignment: Assignment, parent: Node): Iterable<IAstModification> {
if (assignment.aug_op != null)
throw AstException("augmented assignments should have been converted to normal assignments before this optimizer: $assignment")
throw FatalAstException("augmented assignments should have been converted to normal assignments before this optimizer: $assignment")
return emptyList()
}
@@ -258,6 +258,14 @@ internal class ExpressionSimplifier(private val program: Program) : AstWalker()
}
private fun optimizeAdd(expr: BinaryExpression, leftVal: NumericLiteralValue?, rightVal: NumericLiteralValue?): Expression? {
if(expr.left.isSameAs(expr.right)) {
// optimize X+X into X *2
expr.operator = "*"
expr.right = NumericLiteralValue.optimalInteger(2, expr.right.position)
expr.right.linkParents(expr)
return expr
}
if (leftVal == null && rightVal == null)
return null
@@ -278,6 +286,11 @@ internal class ExpressionSimplifier(private val program: Program) : AstWalker()
}
private fun optimizeSub(expr: BinaryExpression, leftVal: NumericLiteralValue?, rightVal: NumericLiteralValue?): Expression? {
if(expr.left.isSameAs(expr.right)) {
// optimize X-X into 0
return NumericLiteralValue.optimalInteger(0, expr.position)
}
if (leftVal == null && rightVal == null)
return null
@@ -407,7 +407,7 @@ internal class StatementOptimizer(private val program: Program,
override fun visit(assignment: Assignment): Statement {
if(assignment.aug_op!=null)
throw AstException("augmented assignments should have been converted to normal assignments before this optimizer: $assignment")
throw FatalAstException("augmented assignments should have been converted to normal assignments before this optimizer: $assignment")
if(assignment.target isSameAs assignment.value) {
if(assignment.target.isNotMemory(program.namespace)) {
+2 -2
View File
@@ -2,11 +2,10 @@
TODO
====
- implement the asm for bitshift on arrays (last missing assembly code generation)
- aliases for imported symbols for example perhaps '%alias print = c64scr.print'
- option to load library files from a directory instead of the embedded ones (easier library development/debugging)
- investigate support for 8bitguy's Commander X16 platform https://murray2.com/forums/commander-x16.9/
Memory Block Operations integrated in language?
@@ -36,6 +35,7 @@ Add more compiler optimizations to the existing ones.
the program will then rely solely on the values as they are in memory at the time of program startup.
- Also some library routines and code patterns could perhaps be optimized further
- can the parameter passing to subroutines be optimized to avoid copying?
- subroutine calling convention? like: 1 byte arg -> pass in A, 2 bytes -> pass in A+Y, return value likewise.
- more optimizations on the language AST level
- more optimizations on the final assembly source level
File diff suppressed because it is too large. Load diff
-922
View File
@@ -1,922 +0,0 @@
%import c64utils
;%import c64flt
;%option enable_floats
%zeropage dontuse
main {
sub start() {
c64scr.print("ubyte shift left\n")
A = shiftlb0()
c64scr.print_ubbin(A, true)
c64.CHROUT('\n')
A = shiftlb1()
c64scr.print_ubbin(A, true)
c64.CHROUT('\n')
A = shiftlb2()
c64scr.print_ubbin(A, true)
c64.CHROUT('\n')
A = shiftlb3()
c64scr.print_ubbin(A, true)
c64.CHROUT('\n')
A = shiftlb4()
c64scr.print_ubbin(A, true)
c64.CHROUT('\n')
A = shiftlb5()
c64scr.print_ubbin(A, true)
c64.CHROUT('\n')
A = shiftlb6()
c64scr.print_ubbin(A, true)
c64.CHROUT('\n')
A = shiftlb7()
c64scr.print_ubbin(A, true)
c64.CHROUT('\n')
A = shiftlb8()
c64scr.print_ubbin(A, true)
c64.CHROUT('\n')
A = shiftlb9()
c64scr.print_ubbin(A, true)
c64.CHROUT('\n')
c64scr.print("enter to continue:\n")
void c64.CHRIN()
c64scr.print("ubyte shift right\n")
A = shiftrb0()
c64scr.print_ubbin(A, true)
c64.CHROUT('\n')
A = shiftrb1()
c64scr.print_ubbin(A, true)
c64.CHROUT('\n')
A = shiftrb2()
c64scr.print_ubbin(A, true)
c64.CHROUT('\n')
A = shiftrb3()
c64scr.print_ubbin(A, true)
c64.CHROUT('\n')
A = shiftrb4()
c64scr.print_ubbin(A, true)
c64.CHROUT('\n')
A = shiftrb5()
c64scr.print_ubbin(A, true)
c64.CHROUT('\n')
A = shiftrb6()
c64scr.print_ubbin(A, true)
c64.CHROUT('\n')
A = shiftrb7()
c64scr.print_ubbin(A, true)
c64.CHROUT('\n')
A = shiftrb8()
c64scr.print_ubbin(A, true)
c64.CHROUT('\n')
A = shiftrb9()
c64scr.print_ubbin(A, true)
c64.CHROUT('\n')
c64scr.print("enter to continue:\n")
void c64.CHRIN()
c64scr.print("signed byte shift left\n")
byte signedb
signedb = shiftlsb0()
c64scr.print_ubbin(signedb as ubyte, true)
c64.CHROUT('\n')
signedb = shiftlsb1()
c64scr.print_ubbin(signedb as ubyte, true)
c64.CHROUT('\n')
signedb = shiftlsb2()
c64scr.print_ubbin(signedb as ubyte, true)
c64.CHROUT('\n')
signedb = shiftlsb3()
c64scr.print_ubbin(signedb as ubyte, true)
c64.CHROUT('\n')
signedb = shiftlsb4()
c64scr.print_ubbin(signedb as ubyte, true)
c64.CHROUT('\n')
signedb = shiftlsb5()
c64scr.print_ubbin(signedb as ubyte, true)
c64.CHROUT('\n')
signedb = shiftlsb6()
c64scr.print_ubbin(signedb as ubyte, true)
c64.CHROUT('\n')
signedb = shiftlsb7()
c64scr.print_ubbin(signedb as ubyte, true)
c64.CHROUT('\n')
signedb = shiftlsb8()
c64scr.print_ubbin(signedb as ubyte, true)
c64.CHROUT('\n')
signedb = shiftlsb9()
c64scr.print_ubbin(signedb as ubyte, true)
c64.CHROUT('\n')
c64scr.print("enter to continue:\n")
void c64.CHRIN()
c64scr.print("signed byte shift right\n")
signedb = shiftrsb0()
c64scr.print_ubbin(signedb as ubyte, true)
c64.CHROUT('\n')
signedb = shiftrsb1()
c64scr.print_ubbin(signedb as ubyte, true)
c64.CHROUT('\n')
signedb = shiftrsb2()
c64scr.print_ubbin(signedb as ubyte, true)
c64.CHROUT('\n')
signedb = shiftrsb3()
c64scr.print_ubbin(signedb as ubyte, true)
c64.CHROUT('\n')
signedb = shiftrsb4()
c64scr.print_ubbin(signedb as ubyte, true)
c64.CHROUT('\n')
signedb = shiftrsb5()
c64scr.print_ubbin(signedb as ubyte, true)
c64.CHROUT('\n')
signedb = shiftrsb6()
c64scr.print_ubbin(signedb as ubyte, true)
c64.CHROUT('\n')
signedb = shiftrsb7()
c64scr.print_ubbin(signedb as ubyte, true)
c64.CHROUT('\n')
signedb = shiftrsb8()
c64scr.print_ubbin(signedb as ubyte, true)
c64.CHROUT('\n')
signedb = shiftrsb9()
c64scr.print_ubbin(signedb as ubyte, true)
c64.CHROUT('\n')
c64scr.print("enter to continue:\n")
void c64.CHRIN()
c64scr.print("uword shift left\n")
uword uw
uw = shiftluw0()
c64scr.print_uwbin(uw, true)
c64.CHROUT('\n')
uw = shiftluw1()
c64scr.print_uwbin(uw, true)
c64.CHROUT('\n')
uw = shiftluw2()
c64scr.print_uwbin(uw, true)
c64.CHROUT('\n')
uw = shiftluw3()
c64scr.print_uwbin(uw, true)
c64.CHROUT('\n')
uw = shiftluw4()
c64scr.print_uwbin(uw, true)
c64.CHROUT('\n')
uw = shiftluw5()
c64scr.print_uwbin(uw, true)
c64.CHROUT('\n')
uw = shiftluw6()
c64scr.print_uwbin(uw, true)
c64.CHROUT('\n')
uw = shiftluw7()
c64scr.print_uwbin(uw, true)
c64.CHROUT('\n')
uw = shiftluw8()
c64scr.print_uwbin(uw, true)
c64.CHROUT('\n')
uw = shiftluw9()
c64scr.print_uwbin(uw, true)
c64.CHROUT('\n')
uw = shiftluw10()
c64scr.print_uwbin(uw, true)
c64.CHROUT('\n')
uw = shiftluw11()
c64scr.print_uwbin(uw, true)
c64.CHROUT('\n')
uw = shiftluw12()
c64scr.print_uwbin(uw, true)
c64.CHROUT('\n')
uw = shiftluw13()
c64scr.print_uwbin(uw, true)
c64.CHROUT('\n')
uw = shiftluw14()
c64scr.print_uwbin(uw, true)
c64.CHROUT('\n')
uw = shiftluw15()
c64scr.print_uwbin(uw, true)
c64.CHROUT('\n')
uw = shiftluw16()
c64scr.print_uwbin(uw, true)
c64.CHROUT('\n')
uw = shiftluw17()
c64scr.print_uwbin(uw, true)
c64.CHROUT('\n')
c64scr.print("enter to continue:\n")
void c64.CHRIN()
c64scr.print("uword shift right\n")
uw = shiftruw0()
c64scr.print_uwbin(uw, true)
c64.CHROUT('\n')
uw = shiftruw1()
c64scr.print_uwbin(uw, true)
c64.CHROUT('\n')
uw = shiftruw2()
c64scr.print_uwbin(uw, true)
c64.CHROUT('\n')
uw = shiftruw3()
c64scr.print_uwbin(uw, true)
c64.CHROUT('\n')
uw = shiftruw4()
c64scr.print_uwbin(uw, true)
c64.CHROUT('\n')
uw = shiftruw5()
c64scr.print_uwbin(uw, true)
c64.CHROUT('\n')
uw = shiftruw6()
c64scr.print_uwbin(uw, true)
c64.CHROUT('\n')
uw = shiftruw7()
c64scr.print_uwbin(uw, true)
c64.CHROUT('\n')
uw = shiftruw8()
c64scr.print_uwbin(uw, true)
c64.CHROUT('\n')
uw = shiftruw9()
c64scr.print_uwbin(uw, true)
c64.CHROUT('\n')
uw = shiftruw10()
c64scr.print_uwbin(uw, true)
c64.CHROUT('\n')
uw = shiftruw11()
c64scr.print_uwbin(uw, true)
c64.CHROUT('\n')
uw = shiftruw12()
c64scr.print_uwbin(uw, true)
c64.CHROUT('\n')
uw = shiftruw13()
c64scr.print_uwbin(uw, true)
c64.CHROUT('\n')
uw = shiftruw14()
c64scr.print_uwbin(uw, true)
c64.CHROUT('\n')
uw = shiftruw15()
c64scr.print_uwbin(uw, true)
c64.CHROUT('\n')
uw = shiftruw16()
c64scr.print_uwbin(uw, true)
c64.CHROUT('\n')
uw = shiftruw17()
c64scr.print_uwbin(uw, true)
c64.CHROUT('\n')
c64scr.print("enter to continue:\n")
void c64.CHRIN()
c64scr.print("signed word shift left\n")
word sw
sw = shiftlsw0()
c64scr.print_uwbin(sw as uword, true)
c64.CHROUT('\n')
sw = shiftlsw1()
c64scr.print_uwbin(sw as uword, true)
c64.CHROUT('\n')
sw = shiftlsw2()
c64scr.print_uwbin(sw as uword, true)
c64.CHROUT('\n')
sw = shiftlsw3()
c64scr.print_uwbin(sw as uword, true)
c64.CHROUT('\n')
sw = shiftlsw4()
c64scr.print_uwbin(sw as uword, true)
c64.CHROUT('\n')
sw = shiftlsw5()
c64scr.print_uwbin(sw as uword, true)
c64.CHROUT('\n')
sw = shiftlsw6()
c64scr.print_uwbin(sw as uword, true)
c64.CHROUT('\n')
sw = shiftlsw7()
c64scr.print_uwbin(sw as uword, true)
c64.CHROUT('\n')
sw = shiftlsw8()
c64scr.print_uwbin(sw as uword, true)
c64.CHROUT('\n')
sw = shiftlsw9()
c64scr.print_uwbin(sw as uword, true)
c64.CHROUT('\n')
sw = shiftlsw10()
c64scr.print_uwbin(sw as uword, true)
c64.CHROUT('\n')
sw = shiftlsw11()
c64scr.print_uwbin(sw as uword, true)
c64.CHROUT('\n')
sw = shiftlsw12()
c64scr.print_uwbin(sw as uword, true)
c64.CHROUT('\n')
sw = shiftlsw13()
c64scr.print_uwbin(sw as uword, true)
c64.CHROUT('\n')
sw = shiftlsw14()
c64scr.print_uwbin(sw as uword, true)
c64.CHROUT('\n')
sw = shiftlsw15()
c64scr.print_uwbin(sw as uword, true)
c64.CHROUT('\n')
sw = shiftlsw16()
c64scr.print_uwbin(sw as uword, true)
c64.CHROUT('\n')
sw = shiftlsw17()
c64scr.print_uwbin(sw as uword, true)
c64.CHROUT('\n')
c64scr.print("enter to continue:\n")
void c64.CHRIN()
c64scr.print("signed word shift right\n")
sw = shiftrsw0()
c64scr.print_uwbin(sw as uword, true)
c64.CHROUT('\n')
sw = shiftrsw1()
c64scr.print_uwbin(sw as uword, true)
c64.CHROUT('\n')
sw = shiftrsw2()
c64scr.print_uwbin(sw as uword, true)
c64.CHROUT('\n')
sw = shiftrsw3()
c64scr.print_uwbin(sw as uword, true)
c64.CHROUT('\n')
sw = shiftrsw4()
c64scr.print_uwbin(sw as uword, true)
c64.CHROUT('\n')
sw = shiftrsw5()
c64scr.print_uwbin(sw as uword, true)
c64.CHROUT('\n')
sw = shiftrsw6()
c64scr.print_uwbin(sw as uword, true)
c64.CHROUT('\n')
sw = shiftrsw7()
c64scr.print_uwbin(sw as uword, true)
c64.CHROUT('\n')
sw = shiftrsw8()
c64scr.print_uwbin(sw as uword, true)
c64.CHROUT('\n')
sw = shiftrsw9()
c64scr.print_uwbin(sw as uword, true)
c64.CHROUT('\n')
sw = shiftrsw10()
c64scr.print_uwbin(sw as uword, true)
c64.CHROUT('\n')
sw = shiftrsw11()
c64scr.print_uwbin(sw as uword, true)
c64.CHROUT('\n')
sw = shiftrsw12()
c64scr.print_uwbin(sw as uword, true)
c64.CHROUT('\n')
sw = shiftrsw13()
c64scr.print_uwbin(sw as uword, true)
c64.CHROUT('\n')
sw = shiftrsw14()
c64scr.print_uwbin(sw as uword, true)
c64.CHROUT('\n')
sw = shiftrsw15()
c64scr.print_uwbin(sw as uword, true)
c64.CHROUT('\n')
sw = shiftrsw16()
c64scr.print_uwbin(sw as uword, true)
c64.CHROUT('\n')
sw = shiftrsw17()
c64scr.print_uwbin(sw as uword, true)
c64.CHROUT('\n')
}
sub shiftruw0() -> uword {
uword q = $a49f
return q >> 0
}
sub shiftruw1() -> uword {
uword q = $a49f
return q >> 1
}
sub shiftruw2() -> uword {
uword q = $a49f
return q >> 2
}
sub shiftruw3() -> uword {
uword q = $a49f
return q >> 3
}
sub shiftruw4() -> uword {
uword q = $a49f
return q >> 4
}
sub shiftruw5() -> uword {
uword q = $a49f
return q >> 5
}
sub shiftruw6() -> uword {
uword q = $a49f
return q >> 6
}
sub shiftruw7() -> uword {
uword q = $a49f
return q >> 7
}
sub shiftruw8() -> uword {
uword q = $a49f
return (q >> 8)
}
sub shiftruw9() -> uword {
uword q = $a49f
return (q >> 9)
}
sub shiftruw10() -> uword {
uword q = $a49f
return (q >> 10)
}
sub shiftruw11() -> uword {
uword q = $a49f
return (q >> 11)
}
sub shiftruw12() -> uword {
uword q = $a49f
return (q >> 12)
}
sub shiftruw13() -> uword {
uword q = $a49f
return (q >> 13)
}
sub shiftruw14() -> uword {
uword q = $a49f
return (q >> 14)
}
sub shiftruw15() -> uword {
uword q = $a49f
return (q >> 15)
}
sub shiftruw16() -> uword {
uword q = $a49f
return (q >> 16)
}
sub shiftruw17() -> uword {
uword q = $a49f
return (q >> 17)
}
sub shiftrsw0() -> word {
word q = -12345
return q >> 0
}
sub shiftrsw1() -> word {
word q = -12345
return q >> 1
}
sub shiftrsw2() -> word {
word q = -12345
return q >> 2
}
sub shiftrsw3() -> word {
word q = -12345
return q >> 3
}
sub shiftrsw4() -> word {
word q = -12345
return q >> 4
}
sub shiftrsw5() -> word {
word q = -12345
return q >> 5
}
sub shiftrsw6() -> word {
word q = -12345
return q >> 6
}
sub shiftrsw7() -> word {
word q = -12345
return q >> 7
}
sub shiftrsw8() -> word {
word q = -12345
return (q >> 8)
}
sub shiftrsw9() -> word {
word q = -12345
return (q >> 9)
}
sub shiftrsw10() -> word {
word q = -12345
return (q >> 10)
}
sub shiftrsw11() -> word {
word q = -12345
return (q >> 11)
}
sub shiftrsw12() -> word {
word q = -12345
return (q >> 12)
}
sub shiftrsw13() -> word {
word q = -12345
return (q >> 13)
}
sub shiftrsw14() -> word {
word q = -12345
return (q >> 14)
}
sub shiftrsw15() -> word {
word q = -12345
return (q >> 15)
}
sub shiftrsw16() -> word {
word q = -12345
return (q >> 16)
}
sub shiftrsw17() -> word {
word q = -12345
return (q >> 17)
}
sub shiftluw0() -> uword {
uword q = $a49f
return q << 0
}
sub shiftluw1() -> uword {
uword q = $a49f
return q << 1
}
sub shiftluw2() -> uword {
uword q = $a49f
return q << 2
}
sub shiftluw3() -> uword {
uword q = $a49f
return q << 3
}
sub shiftluw4() -> uword {
uword q = $a49f
return q << 4
}
sub shiftluw5() -> uword {
uword q = $a49f
return q << 5
}
sub shiftluw6() -> uword {
uword q = $a49f
return q << 6
}
sub shiftluw7() -> uword {
uword q = $a49f
return q << 7
}
sub shiftluw8() -> uword {
uword q = $a49f
return q << 8
}
sub shiftluw9() -> uword {
uword q = $a49f
return q << 9
}
sub shiftluw10() -> uword {
uword q = $a49f
return q << 10
}
sub shiftluw11() -> uword {
uword q = $a49f
return q << 11
}
sub shiftluw12() -> uword {
uword q = $a49f
return q << 12
}
sub shiftluw13() -> uword {
uword q = $a49f
return q << 13
}
sub shiftluw14() -> uword {
uword q = $a49f
return q << 14
}
sub shiftluw15() -> uword {
uword q = $a49f
return q << 15
}
sub shiftluw16() -> uword {
uword q = $a49f
return q << 16
}
sub shiftluw17() -> uword {
uword q = $a49f
return q << 17
}
sub shiftlsw0() -> word {
word q = -12345
return q << 0
}
sub shiftlsw1() -> word {
word q = -12345
return q << 1
}
sub shiftlsw2() -> word {
word q = -12345
return q << 2
}
sub shiftlsw3() -> word {
word q = -12345
return q << 3
}
sub shiftlsw4() -> word {
word q = -12345
return q << 4
}
sub shiftlsw5() -> word {
word q = -12345
return q << 5
}
sub shiftlsw6() -> word {
word q = -12345
return q << 6
}
sub shiftlsw7() -> word {
word q = -12345
return q << 7
}
sub shiftlsw8() -> word {
word q = -12345
return q << 8
}
sub shiftlsw9() -> word {
word q = -12345
return q << 9
}
sub shiftlsw10() -> word {
word q = -12345
return q << 10
}
sub shiftlsw11() -> word {
word q = -12345
return q << 11
}
sub shiftlsw12() -> word {
word q = -12345
return q << 12
}
sub shiftlsw13() -> word {
word q = -12345
return q << 13
}
sub shiftlsw14() -> word {
word q = -12345
return q << 14
}
sub shiftlsw15() -> word {
word q = -12345
return q << 15
}
sub shiftlsw16() -> word {
word q = -12345
return q << 16
}
sub shiftlsw17() -> word {
word q = -12345
return q << 17
}
sub shiftlb0() -> ubyte {
ubyte yy=$ed
return yy << 0
}
sub shiftlb1() -> ubyte {
ubyte yy=$ed
return yy << 1
}
sub shiftlb2() -> ubyte {
ubyte yy=$ed
return yy << 2
}
sub shiftlb3() -> ubyte {
ubyte yy=$ed
return yy << 3
}
sub shiftlb4() -> ubyte {
ubyte yy=$ed
return yy << 4
}
sub shiftlb5() -> ubyte {
ubyte yy=$ed
return yy << 5
}
sub shiftlb6() -> ubyte {
ubyte yy=$ed
return yy << 6
}
sub shiftlb7() -> ubyte {
ubyte yy=$ed
return yy << 7
}
sub shiftlb8() -> ubyte {
ubyte yy=$ed
return yy << 8
}
sub shiftlb9() -> ubyte {
ubyte yy=$ed
return yy << 9
}
sub shiftrb0() -> ubyte {
ubyte yy=$ed
return yy >> 0
}
sub shiftrb1() -> ubyte {
ubyte yy=$ed
return yy >> 1
}
sub shiftrb2() -> ubyte {
ubyte yy=$ed
return yy >> 2
}
sub shiftrb3() -> ubyte {
ubyte yy=$ed
return yy >> 3
}
sub shiftrb4() -> ubyte {
ubyte yy=$ed
return yy >> 4
}
sub shiftrb5() -> ubyte {
ubyte yy=$ed
return yy >> 5
}
sub shiftrb6() -> ubyte {
ubyte yy=$ed
return yy >> 6
}
sub shiftrb7() -> ubyte {
ubyte yy=$ed
return yy >> 7
}
sub shiftrb8() -> ubyte {
ubyte yy=$ed
return yy >> 8
}
sub shiftrb9() -> ubyte {
ubyte yy=$ed
return yy >> 9
}
sub shiftlsb0() -> byte {
byte yy=-123
return yy << 0
}
sub shiftlsb1() -> byte {
byte yy=-123
return yy << 1
}
sub shiftlsb2() -> byte {
byte yy=-123
return yy << 2
}
sub shiftlsb3() -> byte {
byte yy=-123
return yy << 3
}
sub shiftlsb4() -> byte {
byte yy=-123
return yy << 4
}
sub shiftlsb5() -> byte {
byte yy=-123
return yy << 5
}
sub shiftlsb6() -> byte {
byte yy=-123
return yy << 6
}
sub shiftlsb7() -> byte {
byte yy=-123
return yy << 7
}
sub shiftlsb8() -> byte {
byte yy=-123
return yy << 8
}
sub shiftlsb9() -> byte {
byte yy=-123
return yy << 9
}
sub shiftrsb0() -> byte {
byte yy=-123
return yy >> 0
}
sub shiftrsb1() -> byte {
byte yy=-123
return yy >> 1
}
sub shiftrsb2() -> byte {
byte yy=-123
return yy >> 2
}
sub shiftrsb3() -> byte {
byte yy=-123
return yy >> 3
}
sub shiftrsb4() -> byte {
byte yy=-123
return yy >> 4
}
sub shiftrsb5() -> byte {
byte yy=-123
return yy >> 5
}
sub shiftrsb6() -> byte {
byte yy=-123
return yy >> 6
}
sub shiftrsb7() -> byte {
byte yy=-123
return yy >> 7
}
sub shiftrsb8() -> byte {
byte yy=-123
return yy >> 8
}
sub shiftrsb9() -> byte {
byte yy=-123
return yy >> 9
}
}
+12 -1
View File
@@ -1,10 +1,21 @@
%import c64lib
%import c64utils
%zeropage dontuse
%import c64flt
%zeropage basicsafe
main {
sub start() {
float[] floats = [1.1, 2.2]
ubyte index=1
c64flt.print_f(floats[0])
c64flt.print_f(floats[1])
floats[0] = 9.99
floats[index] = 8.88
c64flt.print_f(floats[0])
c64flt.print_f(floats[1])
}
}