add palette.set_rgb_nosplit() and set_rbg_be_nosplit()

fix stream-wav missing rts which corrupted playback
fix showbmx example palette and image centering
This commit is contained in:
Irmen de Jong 2024-12-15 23:32:50 +01:00
parent 8644a4ae91
commit 1e9bbd662b
10 changed files with 98 additions and 73 deletions

View File

@ -22,7 +22,18 @@ palette {
} }
sub set_rgb_be(uword palette_ptr, uword num_colors, ubyte startindex) { sub set_rgb_be(uword palette_ptr, uword num_colors, ubyte startindex) {
; 1 word per color entry, $0rgb in big endian format ; 1 word per color entry, $0rgb in big endian format (split arrays)
cx16.vaddr(1, $fa00+(startindex as uword * 2), 0, 1)
repeat num_colors {
cx16.VERA_DATA0 = @(palette_ptr+num_colors)
cx16.VERA_DATA0 = @(palette_ptr)
palette_ptr++
}
cx16.VERA_ADDR_H &= 1
}
sub set_rgb_be_nosplit(uword palette_ptr, uword num_colors, ubyte startindex) {
; 1 word per color entry, $0rgb in big endian format (linear arrays)
cx16.vaddr(1, $fa00+(startindex as uword * 2), 0, 1) cx16.vaddr(1, $fa00+(startindex as uword * 2), 0, 1)
repeat num_colors { repeat num_colors {
cx16.VERA_DATA0 = @(palette_ptr+1) cx16.VERA_DATA0 = @(palette_ptr+1)
@ -33,7 +44,18 @@ palette {
} }
sub set_rgb(uword palette_words_ptr, uword num_colors, ubyte startindex) { sub set_rgb(uword palette_words_ptr, uword num_colors, ubyte startindex) {
; 1 word per color entry (in little endian format as layed out in video memory, so $gb;$0r) ; 1 word per color entry (in little endian format as layed out in video memory, so $gb;$0r) (split arrays)
cx16.vaddr(1, $fa00+(startindex as uword * 2), 0, 1)
repeat num_colors {
cx16.VERA_DATA0 = @(palette_words_ptr)
cx16.VERA_DATA0 = @(palette_words_ptr+num_colors)
palette_words_ptr++
}
cx16.VERA_ADDR_H &= 1
}
sub set_rgb_nosplit(uword palette_words_ptr, uword num_colors, ubyte startindex) {
; 1 word per color entry (in little endian format as layed out in video memory, so $gb;$0r) (linear arrays)
cx16.vaddr(1, $fa00+(startindex as uword * 2), 0, 1) cx16.vaddr(1, $fa00+(startindex as uword * 2), 0, 1)
repeat num_colors { repeat num_colors {
cx16.VERA_DATA0 = @(palette_words_ptr) cx16.VERA_DATA0 = @(palette_words_ptr)
@ -188,7 +210,7 @@ palette {
sub set_c64pepto() { sub set_c64pepto() {
; set first 16 colors to the "Pepto" PAL commodore-64 palette http://www.pepto.de/projects/colorvic/ ; set first 16 colors to the "Pepto" PAL commodore-64 palette http://www.pepto.de/projects/colorvic/
uword[] colors = [ uword[] @nosplit colors = [
$000, ; 0 = black $000, ; 0 = black
$FFF, ; 1 = white $FFF, ; 1 = white
$833, ; 2 = red $833, ; 2 = red
@ -206,12 +228,12 @@ palette {
$76e, ; 14 = light blue $76e, ; 14 = light blue
$bbb ; 15 = light grey $bbb ; 15 = light grey
] ]
set_rgb(colors, len(colors), 0) set_rgb_nosplit(colors, len(colors), 0)
} }
sub set_c64ntsc() { sub set_c64ntsc() {
; set first 16 colors to a NTSC commodore-64 palette ; set first 16 colors to a NTSC commodore-64 palette
uword[] colors = [ uword[] @nosplit colors = [
$000, ; 0 = black $000, ; 0 = black
$FFF, ; 1 = white $FFF, ; 1 = white
$934, ; 2 = red $934, ; 2 = red
@ -229,12 +251,12 @@ palette {
$36f, ; 14 = light blue $36f, ; 14 = light blue
$ccc ; 15 = light grey $ccc ; 15 = light grey
] ]
set_rgb(colors, len(colors), 0) set_rgb_nosplit(colors, len(colors), 0)
} }
sub set_default16() { sub set_default16() {
; set first 16 colors to the defaults on the X16 ; set first 16 colors to the defaults on the X16
uword[] colors = [ uword[] @nosplit colors = [
$000, ; 0 = black $000, ; 0 = black
$fff, ; 1 = white $fff, ; 1 = white
$800, ; 2 = red $800, ; 2 = red
@ -252,6 +274,6 @@ palette {
$08f, ; 14 = light blue $08f, ; 14 = light blue
$bbb ; 15 = light grey $bbb ; 15 = light grey
] ]
set_rgb(colors, len(colors), 0) set_rgb_nosplit(colors, len(colors), 0)
} }
} }

View File

@ -950,9 +950,9 @@ On the other targets, it only contains the definition of the 16 memory-mapped vi
bmx (cx16 only) bmx (cx16 only)
---------------- ----------------
Routines to load and save "BMX" files, the CommanderX16 bitmap file format. Routines to load and save "BMX" files, the CommanderX16 bitmap file format:
Specification available here: https://cx16forum.com/forum/viewtopic.php?t=6945 `BMX file format specification <https://cx16forum.com/forum/viewtopic.php?t=6945>`_
Only *uncompressed* bitmaps are supported in this library for now. Only the *uncompressed* bitmaps variant is supported in this library for now.
The routines are designed to be fast and bulk load/save the data directly into or from vram, The routines are designed to be fast and bulk load/save the data directly into or from vram,
without the need to buffer something in main memory. without the need to buffer something in main memory.

View File

@ -2,20 +2,18 @@ TODO
==== ====
- DONE: make word arrays split by default (remove @split tag) and use new @nosplit tag to make an array use the old storage format? - DONE: make word arrays split by default (remove @split tag) and use new @nosplit tag to make an array use the old storage format?
- DONE: invert -splitarrays command line option to -dontsplitarrays - DONE: &splitarray will give you the start address of the lsb-array (which is immediately followed by the msb-array)
- DONE: remove "splitarrays" %option switch - DONE: invert -splitarrays command line option: -dontsplitarrays and remove "splitarrays" %option switch
- DONE: added sprites.pos_batch_nosplit when the x/y arrays are linear instead of split word arrays - DONE: added sprites.pos_batch_nosplit when the x/y arrays are linear instead of split word arrays
- update Syntax files + Document all of this (also that word arrays can then have length 256 by default as well, and that @linear will reduce it to half.) - DONE: add palette.set_rgb_nosplit() and set_rbg_be_nosplit() for linear instead of split word arrays
- test all examples and projects - update Syntax files + Document all of this (also that word arrays can then have length 256 by default as well, and that @nosplit will reduce it to half.)
- (paint has wrong palette colors) - also document that kernal routines such as FB_set_palette() expect a @nosplit word array otherwise colors turn up bad
- cx16/balloonflight is black - benchmark program became slower!? (did get smaller)
- cx16/bubbleunivers,kefrenbars has wrong colors
- cx16 stream-wav has broken playback?
- benchmark program became slower!? (did get smaller, just slower????)
- showbmx example has wrong colors and doesn't center the picture correctly (robocat4.bmx) (imageviewer is fine?)
- cx16/tehtriz should be better centered vertically
- add &< and &> operators to get the address of the lsb-array and msb-array, respectively. - add &< and &> operators to get the address of the lsb-array and msb-array, respectively.
- remove the error when using @split and make it so that @split always splits the array even when the dontsplit option is enabled. (ast check that you can only put this on word arrays)
- announce prog8 on the 6502.org site?
... ...

View File

@ -124,9 +124,9 @@ spritedata {
for cx16.r0 in 0 to 32*32/2-1 for cx16.r0 in 0 to 32*32/2-1
cx16.VERA_DATA0 = @(&moonsprite + cx16.r0) cx16.VERA_DATA0 = @(&moonsprite + cx16.r0)
for cx16.r1L in 0 to 15 { for cx16.r4L in 0 to 15 {
palette.set_color(cx16.r1L + 16, balloon_pallette[cx16.r1L]) palette.set_color(cx16.r4L + 16, balloon_pallette[cx16.r4L])
palette.set_color(cx16.r1L + 32, moon_pallette[cx16.r1L]) palette.set_color(cx16.r4L + 32, moon_pallette[cx16.r4L])
} }
} }

View File

@ -15,7 +15,7 @@ main {
const ubyte s = 60 const ubyte s = 60
float t float t
uword[] palette = [$000, $000, $00f, $f0f, $0ff, $fff] uword[] @nosplit palette = [$000, $000, $00f, $f0f, $0ff, $fff]
cx16.FB_set_palette(palette, 0, len(palette)) cx16.FB_set_palette(palette, 0, len(palette))
repeat { repeat {

View File

@ -278,8 +278,7 @@ stereo {
lda p8v_right_msb,y lda p8v_right_msb,y
sta cx16.VERA_AUDIO_DATA sta cx16.VERA_AUDIO_DATA
iny iny
iny cpy #8
cpy #16
bne - bne -
}} }}
} }

View File

@ -285,7 +285,7 @@ _lp2 lda $ffff,y
inc _lp2+2 inc _lp2+2
dex dex
bne _loop bne _loop
; !notreached! rts
}} }}
; original prog8 code: ; original prog8 code:
; uword @requirezp ptr = main.start.buffer ; uword @requirezp ptr = main.start.buffer
@ -391,8 +391,7 @@ _lp2 lda $ffff,y
lda p8v_right_msb,y lda p8v_right_msb,y
sta cx16.VERA_AUDIO_DATA sta cx16.VERA_AUDIO_DATA
iny iny
iny cpy #8
cpy #16
bne - bne -
}} }}
} }

View File

@ -58,6 +58,12 @@ main {
; need to use the slower load routine that does padding ; need to use the slower load routine that does padding
; center the image on the screen nicely ; center the image on the screen nicely
uword offset = (320-bmx.width)/2 + (240-bmx.height)/2*320 uword offset = (320-bmx.width)/2 + (240-bmx.height)/2*320
when(bmx.bitsperpixel) {
1 -> offset /= 8
2 -> offset /= 4
4 -> offset /= 2
else -> {}
}
if bmx.continue_load_stamp(0, offset, 320) { if bmx.continue_load_stamp(0, offset, 320) {
activate_palette() activate_palette()
void txt.waitkey() void txt.waitkey()
@ -78,16 +84,16 @@ main {
} }
sub activate_palette() { sub activate_palette() {
; copies the pallette data from the memory buffer into vram ; copies the palette data from the memory buffer into vram
cx16.VERA_DC_BORDER = bmx.border cx16.VERA_DC_BORDER = bmx.border
cx16.r1 = bmx.palette_buffer_ptr cx16.r4 = bmx.palette_buffer_ptr
cx16.r2L = bmx.palette_start cx16.r5L = bmx.palette_start
cx16.r3L = lsb(bmx.palette_entries) cx16.r6L = lsb(bmx.palette_entries)
do { do {
palette.set_color(cx16.r2L, peekw(cx16.r1)) palette.set_color(cx16.r5L, peekw(cx16.r4))
cx16.r1+=2 cx16.r4+=2
cx16.r2L++ cx16.r5L++
cx16.r3L-- cx16.r6L--
} until cx16.r3L==0 } until cx16.r6L==0
} }
} }

View File

@ -15,7 +15,7 @@
main { main {
const ubyte boardOffsetX = 14 const ubyte boardOffsetX = 14
const ubyte boardOffsetY = 3 const ubyte boardOffsetY = 5
const ubyte boardWidth = 10 const ubyte boardWidth = 10
const ubyte boardHeight = 20 const ubyte boardHeight = 20
const ubyte startXpos = boardOffsetX + 3 const ubyte startXpos = boardOffsetX + 3
@ -306,25 +306,26 @@ waitkey:
} }
sub gameOver() { sub gameOver() {
const ubyte yoffset = 7
sound.gameover() sound.gameover()
txt.plot(7, 7) txt.plot(7, yoffset)
txt.chrout('U') txt.chrout('U')
txt.print("────────────────────────") txt.print("────────────────────────")
txt.chrout('I') txt.chrout('I')
txt.plot(7, 8) txt.plot(7, yoffset+1)
txt.print("│*** g a m e o v e r ***│") txt.print("│*** g a m e o v e r ***│")
txt.plot(7, 9) txt.plot(7, yoffset+2)
txt.chrout('J') txt.chrout('J')
txt.print("────────────────────────") txt.print("────────────────────────")
txt.chrout('K') txt.chrout('K')
txt.plot(7, 18) txt.plot(7, yoffset+11)
txt.chrout('U') txt.chrout('U')
txt.print("────────────────────────") txt.print("────────────────────────")
txt.chrout('I') txt.chrout('I')
txt.plot(7, 19) txt.plot(7, yoffset+12)
txt.print("│ f1/start for new game │") txt.print("│ f1/start for new game │")
txt.plot(7, 20) txt.plot(7, yoffset+13)
txt.chrout('J') txt.chrout('J')
txt.print("────────────────────────") txt.print("────────────────────────")
txt.chrout('K') txt.chrout('K')
@ -367,36 +368,37 @@ waitkey:
} }
sub drawBoard() { sub drawBoard() {
const ubyte yoffset = 2
txt.clear_screen() txt.clear_screen()
txt.color(7) txt.color(7)
txt.plot(1,1) txt.plot(1,1+yoffset)
txt.print("* tehtriz *") txt.print("* tehtriz *")
txt.color(5) txt.color(5)
txt.plot(6,4) txt.plot(6,4+yoffset)
txt.print("hold:") txt.print("hold:")
txt.plot(2,22) txt.plot(2,22+yoffset)
txt.print("speed: ") txt.print("speed: ")
txt.plot(28,3) txt.plot(28,3+yoffset)
txt.print("next:") txt.print("next:")
txt.plot(28,10) txt.plot(28,10+yoffset)
txt.print("lines:") txt.print("lines:")
txt.plot(28,14) txt.plot(28,14+yoffset)
txt.print("score:") txt.print("score:")
txt.color(12) txt.color(12)
txt.plot(27,18) txt.plot(27,18+yoffset)
txt.print("controls:") txt.print("controls:")
txt.color(11) txt.color(11)
txt.plot(28,19) txt.plot(28,19+yoffset)
txt.print(",/ move") txt.print(",/ move")
txt.plot(28,20) txt.plot(28,20+yoffset)
txt.print("zx rotate") txt.print("zx rotate")
txt.plot(29,21) txt.plot(29,21+yoffset)
txt.print(". descend") txt.print(". descend")
txt.plot(27,22) txt.plot(27,22+yoffset)
txt.print("spc drop") txt.print("spc drop")
txt.plot(29,23) txt.plot(29,23+yoffset)
txt.print("c hold") txt.print("c hold")
txt.plot(25,24) txt.plot(25,24+yoffset)
txt.print("or joystick #1") txt.print("or joystick #1")
txt.setcc(boardOffsetX-1, boardOffsetY-2, 255, 0) ; invisible barrier txt.setcc(boardOffsetX-1, boardOffsetY-2, 255, 0) ; invisible barrier
@ -423,25 +425,26 @@ waitkey:
for i in len(colors)-1 downto 0 { for i in len(colors)-1 downto 0 {
ubyte x ubyte x
for x in 5 downto 0 { for x in 5 downto 0 {
txt.setcc(6+x-i, 11+2*i, 102, colors[i]) txt.setcc(6+x-i, 11+2*i+yoffset, 102, colors[i])
} }
} }
drawScore() drawScore()
} }
sub drawScore() { sub drawScore() {
const ubyte yoffset=2
txt.color(1) txt.color(1)
txt.plot(30,11) txt.plot(30,11+yoffset)
txt.print_uw(lines) txt.print_uw(lines)
txt.plot(30,15) txt.plot(30,15+yoffset)
txt.print_uw(score) txt.print_uw(score)
txt.plot(9,22) txt.plot(9,22+yoffset)
txt.print_ub(speedlevel) txt.print_ub(speedlevel)
} }
sub drawNextBlock() { sub drawNextBlock() {
const ubyte nextBlockXpos = 29 const ubyte nextBlockXpos = 29
const ubyte nextBlockYpos = 5 const ubyte nextBlockYpos = 7
ubyte x ubyte x
for x in nextBlockXpos+3 downto nextBlockXpos { for x in nextBlockXpos+3 downto nextBlockXpos {
txt.setcc2(x, nextBlockYpos, ' ', 0) txt.setcc2(x, nextBlockYpos, ' ', 0)
@ -457,7 +460,7 @@ waitkey:
sub drawHoldBlock() { sub drawHoldBlock() {
const ubyte holdBlockXpos = 7 const ubyte holdBlockXpos = 7
const ubyte holdBlockYpos = 6 const ubyte holdBlockYpos = 8
ubyte x ubyte x
for x in holdBlockXpos+3 downto holdBlockXpos { for x in holdBlockXpos+3 downto holdBlockXpos {
txt.setcc2(x, holdBlockYpos, '@', 0) txt.setcc2(x, holdBlockYpos, '@', 0)

View File

@ -1,14 +1,12 @@
%import textio %import textio
%import palette
%zeropage basicsafe %zeropage basicsafe
%option no_sysinit
main { main {
sub start() { sub start() {
uword[] addresses = [scores2, start] palette.set_c64pepto()
uword[] scores1 = [10, 25, 50, 100] sys.wait(100)
uword[] scores2 = [100, 250, 500, 1000] palette.set_default16()
cx16.r0 = &scores1
cx16.r1 = &scores2
cx16.r2 = &addresses
} }
} }