palette: changed some of the available presets. Also fix sizeof(array) crash.

This commit is contained in:
Irmen de Jong 2023-12-03 17:11:12 +01:00
parent b09e0a05bf
commit 1d2d7155da
4 changed files with 82 additions and 97 deletions

View File

@ -1,11 +1,11 @@
; Manipulate the Commander X16's display color palette. ; Manipulate the Commander X16's display color palette.
; Should you want to restore the default palette, you have to reinitialize the Vera yourself. ; Should you want to restore the full default palette, you can call cbm.CINT()
; The first 16 colors can be restored to their default with set_default16()
palette { palette {
%option no_symbol_prefixing %option no_symbol_prefixing
uword vera_palette_ptr uword vera_palette_ptr
ubyte cc
sub set_color(ubyte index, uword color) { sub set_color(ubyte index, uword color) {
vera_palette_ptr = $fa00+(index as uword * 2) vera_palette_ptr = $fa00+(index as uword * 2)
@ -89,37 +89,21 @@ palette {
} }
sub set_grayscale() { sub set_grayscale() {
; set first 16 colors to a grayscale gradient from black to white
vera_palette_ptr = $fa00 vera_palette_ptr = $fa00
cc=0 cx16.r2L=0
repeat 16 { repeat 16 {
cx16.vpoke(1, vera_palette_ptr, cc) cx16.vpoke(1, vera_palette_ptr, cx16.r2L)
vera_palette_ptr++ vera_palette_ptr++
cx16.vpoke(1, vera_palette_ptr, cc) cx16.vpoke(1, vera_palette_ptr, cx16.r2L)
vera_palette_ptr++ vera_palette_ptr++
cc += $11 cx16.r2L += $11
} }
} }
uword[] C64_colorpalette_dark = [ ; this is a darker palette with more contrast sub set_c64pepto() {
$000, ; 0 = black ; set first 16 colors to the "Pepto" PAL commodore-64 palette http://www.pepto.de/projects/colorvic/
$FFF, ; 1 = white uword[] colors = [
$632, ; 2 = red
$7AB, ; 3 = cyan
$638, ; 4 = purple
$584, ; 5 = green
$327, ; 6 = blue
$BC6, ; 7 = yellow
$642, ; 8 = orange
$430, ; 9 = brown
$965, ; 10 = light red
$444, ; 11 = dark grey
$666, ; 12 = medium grey
$9D8, ; 13 = light green
$65B, ; 14 = light blue
$999 ; 15 = light grey
]
uword[] C64_colorpalette_pepto = [ ; # this is Pepto's Commodore-64 palette http://www.pepto.de/projects/colorvic/
$000, ; 0 = black $000, ; 0 = black
$FFF, ; 1 = white $FFF, ; 1 = white
$833, ; 2 = red $833, ; 2 = red
@ -137,57 +121,52 @@ palette {
$76e, ; 14 = light blue $76e, ; 14 = light blue
$bbb ; 15 = light grey $bbb ; 15 = light grey
] ]
set_rgb(colors, len(colors))
}
uword[] C64_colorpalette_light = [ ; this is a lighter palette sub set_c64ntsc() {
; set first 16 colors to a NTSC commodore-64 palette
uword[] colors = [
$000, ; 0 = black $000, ; 0 = black
$FFF, ; 1 = white $FFF, ; 1 = white
$944, ; 2 = red $934, ; 2 = red
$7CC, ; 3 = cyan $9ff, ; 3 = cyan
$95A, ; 4 = purple $73f, ; 4 = purple
$6A5, ; 5 = green $4b1, ; 5 = green
$549, ; 6 = blue $20c, ; 6 = blue
$CD8, ; 7 = yellow $ee6, ; 7 = yellow
$963, ; 8 = orange $b53, ; 8 = orange
$650, ; 9 = brown $830, ; 9 = brown
$C77, ; 10 = light red $f8a, ; 10 = light red
$666, ; 11 = dark grey $444, ; 11 = dark grey
$888, ; 12 = medium grey $999, ; 12 = medium grey
$AE9, ; 13 = light green $9f9, ; 13 = light green
$87C, ; 14 = light blue $36f, ; 14 = light blue
$AAA ; 15 = light grey $ccc ; 15 = light grey
] ]
set_rgb(colors, len(colors))
sub set_c64pepto() {
vera_palette_ptr = $fa00
for cc in 0 to 15 {
uword ccp = C64_colorpalette_pepto[cc]
cx16.vpoke(1, vera_palette_ptr, lsb(ccp)) ; G, B
vera_palette_ptr++
cx16.vpoke(1, vera_palette_ptr, msb(ccp)) ; R
vera_palette_ptr++
}
} }
sub set_c64light() { sub set_default16() {
vera_palette_ptr = $fa00 ; set first 16 colors to the defaults on the X16
for cc in 0 to 15 { uword[] colors = [
uword ccp = C64_colorpalette_light[cc] $000, ; 0 = black
cx16.vpoke(1, vera_palette_ptr, lsb(ccp)) ; G, B $fff, ; 1 = white
vera_palette_ptr++ $800, ; 2 = red
cx16.vpoke(1, vera_palette_ptr, msb(ccp)) ; R $afe, ; 3 = cyan
vera_palette_ptr++ $c4c, ; 4 = purple
$0c5, ; 5 = green
$00a, ; 6 = blue
$ee7, ; 7 = yellow
$d85, ; 8 = orange
$640, ; 9 = brown
$f77, ; 10 = light red
$333, ; 11 = dark grey
$777, ; 12 = medium grey
$af6, ; 13 = light green
$08f, ; 14 = light blue
$bbb ; 15 = light grey
]
set_rgb(colors, len(colors))
} }
} }
sub set_c64dark() {
vera_palette_ptr = $fa00
for cc in 0 to 15 {
uword ccp = C64_colorpalette_dark[cc]
cx16.vpoke(1, vera_palette_ptr, lsb(ccp)) ; G, B
vera_palette_ptr++
cx16.vpoke(1, vera_palette_ptr, msb(ccp)) ; R
vera_palette_ptr++
}
}
}

View File

@ -121,7 +121,7 @@ private fun builtinSizeof(args: List<Expression>, position: Position, program: P
return when { return when {
dt.isArray -> { dt.isArray -> {
val length = (target as VarDecl).arraysize!!.constIndex() ?: throw CannotEvaluateException("sizeof", "unknown array size") val length = (target as VarDecl).arraysize?.constIndex() ?: throw CannotEvaluateException("sizeof", "unknown array size")
val elementDt = ArrayToElementTypes.getValue(dt.getOr(DataType.UNDEFINED)) val elementDt = ArrayToElementTypes.getValue(dt.getOr(DataType.UNDEFINED))
NumericLiteral.optimalInteger(program.memsizer.memorySize(elementDt) * length, position) NumericLiteral.optimalInteger(program.memsizer.memorySize(elementDt) * length, position)
} }

View File

@ -5,6 +5,7 @@ import io.kotest.matchers.shouldBe
import io.kotest.matchers.shouldNotBe import io.kotest.matchers.shouldNotBe
import prog8.ast.expressions.NumericLiteral import prog8.ast.expressions.NumericLiteral
import prog8.ast.statements.Assignment import prog8.ast.statements.Assignment
import prog8.ast.statements.FunctionCallStatement
import prog8.code.core.BuiltinFunctions import prog8.code.core.BuiltinFunctions
import prog8.code.core.DataType import prog8.code.core.DataType
import prog8.code.core.NumericDatatypesNoBool import prog8.code.core.NumericDatatypesNoBool
@ -85,26 +86,31 @@ class TestBuiltinFunctions: FunSpec({
val src=""" val src="""
main { main {
sub start() { sub start() {
uword[] array = [1,2,3] uword[] array = [1,2,3]
str name = "hello" str name = "hello"
cx16.r0L = len(array) cx16.r0L = len(array)
cx16.r0L = len(name) cx16.r1L = len(name)
cx16.r0L = sizeof(array) cx16.r2L = sizeof(array)
cx16.r0 = mkword(200,100) cx16.r4 = mkword(200,100)
test(sizeof(array))
}
sub test(uword value) {
value++
} }
}""" }"""
val result = compileText(Cx16Target(), false, src, writeAssembly = false) val result = compileText(Cx16Target(), false, src, writeAssembly = false)
val statements = result!!.compilerAst.entrypoint.statements val statements = result!!.compilerAst.entrypoint.statements
statements.size shouldBe 6 statements.size shouldBe 7
val a1 = statements[2] as Assignment val a1 = statements[2] as Assignment
val a2 = statements[3] as Assignment val a2 = statements[3] as Assignment
val a3 = statements[4] as Assignment val a3 = statements[4] as Assignment
val a4 = statements[5] as Assignment val a4 = statements[5] as Assignment
val a5 = statements[6] as FunctionCallStatement
(a1.value as NumericLiteral).number shouldBe 3.0 (a1.value as NumericLiteral).number shouldBe 3.0
(a2.value as NumericLiteral).number shouldBe 5.0 (a2.value as NumericLiteral).number shouldBe 5.0
(a3.value as NumericLiteral).number shouldBe 6.0 (a3.value as NumericLiteral).number shouldBe 6.0
(a4.value as NumericLiteral).number shouldBe 200*256+100 (a4.value as NumericLiteral).number shouldBe 200*256+100
(a5.args[0] as NumericLiteral).number shouldBe 6.0
} }
}) })

View File

@ -3,7 +3,6 @@ TODO
==== ====
- [on branch: shortcircuit] investigate McCarthy evaluation again? this may also reduce code size perhaps for things like if a>4 or a<2 .... - [on branch: shortcircuit] investigate McCarthy evaluation again? this may also reduce code size perhaps for things like if a>4 or a<2 ....
- once VAL_1 is merged into the kernal properly, remove all the workarounds in cx16 floats.parse_f()
... ...
@ -47,6 +46,7 @@ Compiler:
Libraries: Libraries:
- once a VAL_1 implementation is merged into the X16 kernal properly, remove all the workarounds in cx16 floats.parse_f()
- fix the problems in atari target, and flesh out its libraries. - fix the problems in atari target, and flesh out its libraries.
- c128 target: make syslib more complete (missing kernal routines)? - c128 target: make syslib more complete (missing kernal routines)?
- pet32 target: make syslib more complete (missing kernal routines)? - pet32 target: make syslib more complete (missing kernal routines)?