diff --git a/compiler/res/prog8lib/cx16/palette.p8 b/compiler/res/prog8lib/cx16/palette.p8 index 3a890754c..52efbe991 100644 --- a/compiler/res/prog8lib/cx16/palette.p8 +++ b/compiler/res/prog8lib/cx16/palette.p8 @@ -14,6 +14,11 @@ palette { cx16.vpoke(1, vera_palette_ptr, msb(color)) } + sub get_color(ubyte index) -> uword { + vera_palette_ptr = $fa00+(index as uword * 2) + return mkword(cx16.vpeek(1, vera_palette_ptr+1), cx16.vpeek(1, vera_palette_ptr)) + } + sub set_rgb_be(uword palette_ptr, uword num_colors) { ; 1 word per color entry, $0rgb in big endian format vera_palette_ptr = $fa00 @@ -147,26 +152,27 @@ palette { set_rgb(colors, len(colors)) } + uword[] default_colors_16 = [ + $000, ; 0 = black + $fff, ; 1 = white + $800, ; 2 = red + $afe, ; 3 = cyan + $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 + ] + sub set_default16() { ; set first 16 colors to the defaults on the X16 - uword[] colors = [ - $000, ; 0 = black - $fff, ; 1 = white - $800, ; 2 = red - $afe, ; 3 = cyan - $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)) + set_rgb(default_colors_16, len(default_colors_16)) } } diff --git a/compiler/res/prog8lib/cx16/syslib.p8 b/compiler/res/prog8lib/cx16/syslib.p8 index 8573d147b..456a305cc 100644 --- a/compiler/res/prog8lib/cx16/syslib.p8 +++ b/compiler/res/prog8lib/cx16/syslib.p8 @@ -620,7 +620,6 @@ asmsub vpeek(ubyte bank @A, uword address @XY) -> ubyte @A { ; note: inefficient when reading multiple sequential bytes! %asm {{ stz cx16.VERA_CTRL - and #1 sta cx16.VERA_ADDR_H sty cx16.VERA_ADDR_M stx cx16.VERA_ADDR_L @@ -634,7 +633,6 @@ asmsub vaddr(ubyte bank @A, uword address @R0, ubyte addrsel @R1, byte autoIncrO ; with optional auto increment or decrement of 1. ; Note that the vaddr_autoincr() and vaddr_autodecr() routines allow to set all possible strides, not just 1. %asm {{ - and #1 pha lda cx16.r1 and #1 @@ -690,8 +688,7 @@ asmsub vaddr_autoincr(ubyte bank @A, uword address @R0, ubyte addrsel @R1, uword sta cx16.VERA_ADDR_H rts -_setup and #1 - sta P8ZP_SCRATCH_REG +_setup sta P8ZP_SCRATCH_REG lda cx16.r1 and #1 sta cx16.VERA_CTRL @@ -761,7 +758,6 @@ asmsub vpoke(ubyte bank @A, uword address @R0, ubyte value @Y) clobbers(A) { ; note: inefficient when writing multiple sequential bytes! %asm {{ stz cx16.VERA_CTRL - and #1 sta cx16.VERA_ADDR_H lda cx16.r0 sta cx16.VERA_ADDR_L @@ -777,7 +773,6 @@ asmsub vpoke_or(ubyte bank @A, uword address @R0, ubyte value @Y) clobbers (A) { ; note: inefficient when writing multiple sequential bytes! %asm {{ stz cx16.VERA_CTRL - and #1 sta cx16.VERA_ADDR_H lda cx16.r0 sta cx16.VERA_ADDR_L @@ -795,7 +790,6 @@ asmsub vpoke_and(ubyte bank @A, uword address @R0, ubyte value @Y) clobbers(A) { ; note: inefficient when writing multiple sequential bytes! %asm {{ stz cx16.VERA_CTRL - and #1 sta cx16.VERA_ADDR_H lda cx16.r0 sta cx16.VERA_ADDR_L @@ -813,7 +807,6 @@ asmsub vpoke_xor(ubyte bank @A, uword address @R0, ubyte value @Y) clobbers (A) ; note: inefficient when writing multiple sequential bytes! %asm {{ stz cx16.VERA_CTRL - and #1 sta cx16.VERA_ADDR_H lda cx16.r0 sta cx16.VERA_ADDR_L @@ -832,7 +825,6 @@ asmsub vpoke_mask(ubyte bank @A, uword address @R0, ubyte mask @X, ubyte value @ %asm {{ sty P8ZP_SCRATCH_B1 stz cx16.VERA_CTRL - and #1 sta cx16.VERA_ADDR_H lda cx16.r0 sta cx16.VERA_ADDR_L