From a5b10d962f1b672f3101c449dee381f0e20d954e Mon Sep 17 00:00:00 2001 From: FlightControl Date: Sun, 17 Jan 2021 08:20:45 +0100 Subject: [PATCH] fixed much code, working on 16x16 8bit tile mode. There is an error in the compiler i think which i need to communicate to Jesper. --- .../cache/fragment-cache-wdc65c02.asm | 56 ++++ src/main/kc/include/cx16-vera.h | 2 +- src/main/kc/include/veralib.h | 105 ++++++-- src/main/kc/lib/conio-cx16.c | 129 ++++----- src/main/kc/lib/veralib.c | 250 ++++++++++-------- src/test/kc/examples/cx16/tilemap.c | 26 +- .../kc/examples/cx16/tilemap_2bpp_16_x_16.c | 94 +++++++ .../kc/examples/cx16/tilemap_2bpp_8_x_8.c | 2 +- .../kc/examples/cx16/tilemap_4bpp_16_x_16.c | 222 ++++++++++++++++ .../kc/examples/cx16/tilemap_4bpp_8_x_8.c | 125 +++++++++ .../kc/examples/cx16/tilemap_8bpp_16_x_16.c | 152 +++++++++++ .../kc/examples/cx16/tilemap_8bpp_8_x_8.c | 90 +++++++ src/test/kc/examples/cx16/veralayers.c | 32 +-- 13 files changed, 1066 insertions(+), 219 deletions(-) create mode 100644 src/test/kc/examples/cx16/tilemap_2bpp_16_x_16.c create mode 100644 src/test/kc/examples/cx16/tilemap_4bpp_16_x_16.c create mode 100644 src/test/kc/examples/cx16/tilemap_4bpp_8_x_8.c create mode 100644 src/test/kc/examples/cx16/tilemap_8bpp_16_x_16.c create mode 100644 src/test/kc/examples/cx16/tilemap_8bpp_8_x_8.c diff --git a/src/main/fragment/cache/fragment-cache-wdc65c02.asm b/src/main/fragment/cache/fragment-cache-wdc65c02.asm index 7474d6077..b105d9cec 100644 --- a/src/main/fragment/cache/fragment-cache-wdc65c02.asm +++ b/src/main/fragment/cache/fragment-cache-wdc65c02.asm @@ -3929,3 +3929,59 @@ NO_SYNTHESIS //FRAGMENT pbuc1_derefidx_vbuz1=vbuaa ldy {z1} sta {c1},y +//FRAGMENT vbuz1=vbuz1_plus_2 +lda {z1} +clc +adc #2 +sta {z1} +//FRAGMENT vbuxx=vbuxx_plus_2 +inx +inx +//FRAGMENT pbuc1_derefidx_vbuz1=pbuc1_derefidx_vbuz1_plus_1 +ldy {z1} +lda {c1},y +inc +sta {c1},y +//FRAGMENT pbuc1_derefidx_vbuaa=pbuc1_derefidx_vbuaa_plus_1 +tay +lda {c1},y +inc +sta {c1},y +//FRAGMENT pbuc1_derefidx_vbuxx=pbuc1_derefidx_vbuxx_plus_1 +lda {c1},x +inc +sta {c1},x +//FRAGMENT pbuc1_derefidx_vbuyy=pbuc1_derefidx_vbuyy_plus_1 +lda {c1},y +inc +sta {c1},y +//FRAGMENT vwuz1=vwuz1_plus_vwuc1 +clc +lda {z1} +adc #<{c1} +sta {z1} +lda {z1}+1 +adc #>{c1} +sta {z1}+1 +//FRAGMENT vbuyy_neq_0_then_la1 +cpy #0 +bne {la1} +//FRAGMENT vbuz1=vbuc1_bor_vbuaa +ora #{c1} +sta {z1} +//FRAGMENT vbuaa=vbuc1_bor_vbuaa +ora #{c1} +//FRAGMENT vbuxx=vbuc1_bor_vbuaa +ora #{c1} +tax +//FRAGMENT vbuyy=vbuc1_bor_vbuaa +ora #{c1} +tay +//FRAGMENT vbuyy=vbuxx_bor_vbuaa +stx $ff +ora $ff +tay +//FRAGMENT _deref_pduc1=vbuc2 +NO_SYNTHESIS +//FRAGMENT _deref_pduc1=vbsc2 +NO_SYNTHESIS diff --git a/src/main/kc/include/cx16-vera.h b/src/main/kc/include/cx16-vera.h index bae2dcb7a..5e23eb51c 100644 --- a/src/main/kc/include/cx16-vera.h +++ b/src/main/kc/include/cx16-vera.h @@ -184,7 +184,7 @@ byte const VERA_TILEBASE_WIDTH_MASK = 0x01; byte const VERA_TILEBASE_HEIGHT_8 = 0x00; byte const VERA_TILEBASE_HEIGHT_16 = 0x02; byte const VERA_TILEBASE_HEIGHT_MASK = 0x02; -byte const VERA_TILEBASE_MASK = 0xfC; +byte const VERA_LAYER_TILEBASE_MASK = 0xfC; // Bit 0: Tile Width (0:8 pixels, 1:16 pixels) char * const VERA_L0_TILEBASE = 0x9f2f; // $9F30 L0_HSCROLL_L Layer 0 H-Scroll (7:0) diff --git a/src/main/kc/include/veralib.h b/src/main/kc/include/veralib.h index ac0c72595..f91639272 100644 --- a/src/main/kc/include/veralib.h +++ b/src/main/kc/include/veralib.h @@ -3,70 +3,125 @@ // Author: Sven Van de Velde +#include + // --- VERA function encapsulation --- +__ma word vera_mapbase_offset[2] = {0,0}; +__ma byte vera_mapbase_bank[2] = {0,0}; +__ma dword vera_mapbase_address[2] = {0,0}; + +word vera_tilebase_offset[2] = {0,0}; +byte vera_tilebase_bank[2] = {0,0}; +dword vera_tilebase_address[2] = {0,0}; + +byte vera_layer_rowshift[2] = {0,0}; +word vera_layer_rowskip[2] = {0,0}; + +const byte vera_layer_hflip[2] = {0,0x04}; +const byte vera_layer_vflip[2] = {0,0x08}; + + +byte* vera_layer_config[2] = {VERA_L0_CONFIG, VERA_L1_CONFIG}; +byte vera_layer_enable[2] = { VERA_LAYER0_ENABLE, VERA_LAYER1_ENABLE }; + +byte* vera_layer_mapbase[2] = {VERA_L0_MAPBASE, VERA_L1_MAPBASE}; +byte* vera_layer_tilebase[2] = {VERA_L0_TILEBASE, VERA_L1_TILEBASE}; +byte* vera_layer_vscroll_l[2] = {VERA_L0_VSCROLL_L, VERA_L1_VSCROLL_L}; +byte* vera_layer_vscroll_h[2] = {VERA_L0_VSCROLL_H, VERA_L1_VSCROLL_H}; +byte* vera_layer_hscroll_l[2] = {VERA_L0_HSCROLL_L, VERA_L1_HSCROLL_L}; +byte* vera_layer_hscroll_h[2] = {VERA_L0_HSCROLL_H, VERA_L1_HSCROLL_H}; + +byte vera_layer_textcolor[2] = {WHITE, WHITE}; +byte vera_layer_backcolor[2] = {BLUE, BLUE}; + // --- VERA LAYERS --- // Set the configuration of the layer. // - layer: Value of 0 or 1. // - config: Specifies the modes which are specified using T256C / 'Bitmap Mode' / 'Color Depth'. -void vera_set_layer_config(unsigned byte layer, unsigned byte config); +void vera_layer_set_config(unsigned byte layer, unsigned byte config); // Set the configuration of the layer. // - layer: Value of 0 or 1. // - config: Specifies the modes which are specified using T256C / 'Bitmap Mode' / 'Color Depth'. -unsigned byte vera_get_layer_config(unsigned byte layer); +unsigned byte vera_layer_get_config(unsigned byte layer); // Set the map width or height of the layer. // - layer: Value of 0 or 1. -inline void vera_set_layer_map_width_32(unsigned byte layer); -inline void vera_set_layer_map_width_64(unsigned byte layer); -inline void vera_set_layer_map_width_128(unsigned byte layer); -inline void vera_set_layer_map_width_256(unsigned byte layer); -inline void vera_set_layer_map_height_32(unsigned byte layer); -inline void vera_set_layer_map_height_64(unsigned byte layer); -inline void vera_set_layer_map_height_128(unsigned byte layer); -inline void vera_set_layer_map_height_256(unsigned byte layer); +inline void vera_layer_set_width_32(unsigned byte layer); +inline void vera_layer_set_width_64(unsigned byte layer); +inline void vera_layer_set_width_128(unsigned byte layer); +inline void vera_layer_set_width_256(unsigned byte layer); +inline void vera_layer_set_height_32(unsigned byte layer); +inline void vera_layer_set_height_64(unsigned byte layer); +inline void vera_layer_set_height_128(unsigned byte layer); +inline void vera_layer_set_height_256(unsigned byte layer); // Enable the layer to be displayed on the screen. // - layer: 0 or 1. -void vera_show_layer(unsigned byte layer); +void vera_layer_show(unsigned byte layer); // Disable the layer to be displayed on the screen. // - layer: 0 or 1. -void vera_hide_layer(unsigned byte layer); +void vera_layer_hide(unsigned byte layer); // Is the layer shown on the screen? // - returns: 1 if layer is displayed on the screen, 0 if not. -unsigned byte vera_is_layer_shown(unsigned byte layer); +unsigned byte vera_layer_is_visible(unsigned byte layer); // Set the base of the map for the layer with which the conio will interact. // - layer: Value of 0 or 1. // - mapbase: Specifies the base address of the tile map. // Note that the register only specifies bits 16:9 of the address, // so the resulting address in the VERA VRAM is always aligned to a multiple of 512 bytes. -void vera_set_layer_mapbase(unsigned byte layer, unsigned byte mapbase); +void vera_layer_set_mapbase(unsigned byte layer, unsigned byte mapbase); // Get the base of the map for the layer with which the conio will interact. // - layer: Value of 0 or 1. // - return: Returns the base address of the tile map. // Note that the register is a byte, specifying only bits 16:9 of the address, // so the resulting address in the VERA VRAM is always aligned to a multiple of 512 bytes! -unsigned byte vera_get_layer_mapbase(unsigned byte layer); +unsigned byte vera_layer_get_mapbase(unsigned byte layer); + +// Set the base of the map layer with which the conio will interact. +// - layer: Value of 0 or 1. +// - dw_mapbase: a dword typed address (4 bytes), that specifies the full address of the map base. +// The function does the translation from the dword that contains the 17 bit address, +// to the respective mapbase vera register. +// Note that the register only specifies bits 16:9 of the address, +// so the resulting address in the VERA VRAM is always aligned to a multiple of 512 bytes. +void vera_layer_set_mapbase_address(byte layer, dword dw_mapbase); + +// Get the map base address of the tiles for the layer. +// - layer: Value of 0 or 1. +// - return: Specifies the map base address of the layer, which is returned as a dword. +// Note that the register only specifies bits 16:9 of the 17 bit address, +// so the resulting address in the VERA VRAM is always aligned to a multiple of 512 bytes! +dword vera_layer_get_mapbase_address(byte layer); // Set the base of the tiles for the layer with which the conio will interact. // - layer: Value of 0 or 1. // - tilebase: Specifies the base address of the tile map. // Note that the register only specifies bits 16:11 of the address, // so the resulting address in the VERA VRAM is always aligned to a multiple of 2048 bytes! -void vera_set_layer_tilebase(unsigned byte layer, unsigned byte tilebase); +void vera_layer_set_tilebase(byte layer, byte tilebase); + +// Set the base of the tiles for the layer with which the conio will interact. +// - layer: Value of 0 or 1. +// - dw_tilebase: a dword typed address (4 bytes), that specifies the base address of the tile map. +// The function does the translation from the dword that contains the 17 bit address, +// to the respective tilebase vera register. +// Note that the resulting vera register holds only specifies bits 16:11 of the address, +// so the resulting address in the VERA VRAM is always aligned to a multiple of 2048 bytes! +void vera_layer_set_tilebase_address(byte layer, dword dw_tilebase); // Get the base of the tiles for the layer with which the conio will interact. // - layer: Value of 0 or 1. // - return: Specifies the base address of the tile map. // Note that the register only specifies bits 16:11 of the address, // so the resulting address in the VERA VRAM is always aligned to a multiple of 2048 bytes! -unsigned byte vera_get_layer_tilebase(unsigned byte layer); +unsigned byte vera_layer_get_tilebase(unsigned byte layer); // Set the front color for text output. The old front text color setting is returned. @@ -74,42 +129,44 @@ unsigned byte vera_get_layer_tilebase(unsigned byte layer); // - color: a 4 bit value ( decimal between 0 and 15). // This will only work when the VERA is in 16 color mode! // Note that on the VERA, the transparent color has value 0. -unsigned byte vera_set_layer_textcolor(unsigned byte layer, unsigned byte color); +unsigned byte vera_layer_set_textcolor(unsigned byte layer, unsigned byte color); // Get the front color for text output. The old front text color setting is returned. // - layer: Value of 0 or 1. // - return: a 4 bit value ( decimal between 0 and 15). // This will only work when the VERA is in 16 color mode! // Note that on the VERA, the transparent color has value 0. -unsigned byte vera_get_layer_textcolor(unsigned byte layer); +unsigned byte vera_layer_get_textcolor(unsigned byte layer); // Set the back color for text output. The old back text color setting is returned. // - layer: Value of 0 or 1. // - color: a 4 bit value ( decimal between 0 and 15). // This will only work when the VERA is in 16 color mode! // Note that on the VERA, the transparent color has value 0. -unsigned byte vera_set_layer_backcolor(unsigned byte layer, unsigned byte color); +unsigned byte vera_layer_set_backcolor(unsigned byte layer, unsigned byte color); // Get the back color for text output. The old back text color setting is returned. // - layer: Value of 0 or 1. // - return: a 4 bit value ( decimal between 0 and 15). // This will only work when the VERA is in 16 color mode! // Note that on the VERA, the transparent color has value 0. -unsigned byte vera_get_layer_backcolor(unsigned byte layer); +unsigned byte vera_layer_get_backcolor(unsigned byte layer); // Get the text and back color for text output in 16 color mode. // - layer: Value of 0 or 1. // - return: an 8 bit value with bit 7:4 containing the back color and bit 3:0 containing the front color. // This will only work when the VERA is in 16 color mode! // Note that on the VERA, the transparent color has value 0. -unsigned byte vera_get_layer_color(unsigned byte layer); +unsigned byte vera_layer_get_color(unsigned byte layer); // Scroll the horizontal (X) axis of the layer visible area over the layer tile map area. // - layer: Value of 0 or 1. // - scroll: A value between 0 and 4096. -inline void vera_set_layer_horizontal_scroll(byte layer, word scroll); +inline void vera_layer_set_horizontal_scroll(byte layer, word scroll); // Scroll the vertical (Y) axis of the layer visible area over the layer tile map area. // - layer: Value of 0 or 1. // - scroll: A value between 0 and 4096. -inline void vera_set_layer_vertical_scroll(byte layer, word scroll); +inline void vera_layer_set_vertical_scroll(byte layer, word scroll); + +void vera_layer_mode_tile(byte layer, dword mapbase_address, dword dw_tilebase, word mapwidth, word mapheight, byte tilewidth, byte tileheight, byte color_depth ); diff --git a/src/main/kc/lib/conio-cx16.c b/src/main/kc/lib/conio-cx16.c index 7f02b6e1f..10f1a71ed 100644 --- a/src/main/kc/lib/conio-cx16.c +++ b/src/main/kc/lib/conio-cx16.c @@ -1,6 +1,7 @@ // CX16 conio.h implementation #include #include +#include // The screen width #define CONIO_WIDTH conio_screen_width @@ -25,6 +26,43 @@ const char CONIO_TEXTCOLOR_DEFAULT = WHITE; // The default back color const char CONIO_BACKCOLOR_DEFAULT = BLUE; + +// This requires the following constants to be defined +// - CONIO_WIDTH - The screen width +// - CONIO_HEIGHT - The screen height +// - CONIO_SCREEN_TEXT - The text screen address +// - CONIO_SCREEN_COLORS - The color screen address +// - CONIO_TEXTCOLOR_DEFAULT - The default text color + +#include + +// The number of bytes on the screen +#define CONIO_BYTES CONIO_HEIGHT*CONIO_WIDTH + +// The current cursor x-position +unsigned byte conio_cursor_x[2] = {0,0}; +// The current cursor y-position +unsigned byte conio_cursor_y[2] = {0,0}; +// The current text cursor line start +unsigned word conio_line_text[2] = {0x0000,0x0000}; +// Is a cursor whown when waiting for input (0: no, other: yes) +__ma unsigned byte conio_display_cursor = 0; +// Is scrolling enabled when outputting beyond the end of the screen (1: yes, 0: no). +// If disabled the cursor just moves back to (0,0) instead +unsigned byte conio_scroll_enable[2] = {1,1}; +// Variable holding the screen width; +__ma unsigned byte conio_screen_width = 0; +// Variable holding the screen height; +__ma unsigned byte conio_screen_height = 0; +// Variable holding the screen layer on the VERA card with which conio interacts; +__ma unsigned byte conio_screen_layer = 1; + +// Variables holding the current map width and map height of the layer. +__ma word conio_width = 0; +__ma word conio_height = 0; +__ma byte conio_rowshift = 0; +__ma word conio_rowskip = 0; + // Initializer for conio.h on X16 Commander. #pragma constructor_for(conio_x16_init, cputc, clrscr, cscroll) @@ -33,12 +71,21 @@ void conio_x16_init() { // Position cursor at current line char * const BASIC_CURSOR_LINE = 0xD6; char line = *BASIC_CURSOR_LINE; + //vera_layer_mode_tile(1,0x00000,0x0F800,128,64,8,8,1); + vera_mapbase_address[1] = 0x00000; + vera_mapbase_offset[1] = 0x0000; + vera_mapbase_bank[1] = 0x00; + vera_tilebase_address[1] = 0x0f800; + vera_tilebase_bank[1] = 0x00; + vera_tilebase_offset[1] = 0xf800; + vera_layer_rowskip[1] = 256; + vera_layer_rowshift[1] = 8; screensize(&conio_screen_width, &conio_screen_height); screenlayer(1); - vera_set_layer_textcolor(1, WHITE); - vera_set_layer_backcolor(1, BLUE); - vera_set_layer_mapbase(0,0x20); - vera_set_layer_mapbase(1,0x00); + vera_layer_set_textcolor(1, WHITE); + vera_layer_set_backcolor(1, BLUE); + vera_layer_set_mapbase(0,0x20); + vera_layer_set_mapbase(1,0x00); if(line>=CONIO_HEIGHT) line=CONIO_HEIGHT-1; gotoxy(0, line); } @@ -87,46 +134,10 @@ unsigned char kbhit(void) { return ch; } -// This requires the following constants to be defined -// - CONIO_WIDTH - The screen width -// - CONIO_HEIGHT - The screen height -// - CONIO_SCREEN_TEXT - The text screen address -// - CONIO_SCREEN_COLORS - The color screen address -// - CONIO_TEXTCOLOR_DEFAULT - The default text color - -#include - -// The number of bytes on the screen -#define CONIO_BYTES CONIO_HEIGHT*CONIO_WIDTH - -// The current cursor x-position -unsigned byte conio_cursor_x[2] = {0,0}; -// The current cursor y-position -unsigned byte conio_cursor_y[2] = {0,0}; -// The current text cursor line start -unsigned word conio_line_text[2] = {0x0000,0x0000}; -// Is a cursor whown when waiting for input (0: no, other: yes) -__ma unsigned byte conio_display_cursor = 0; -// Is scrolling enabled when outputting beyond the end of the screen (1: yes, 0: no). -// If disabled the cursor just moves back to (0,0) instead -unsigned byte conio_scroll_enable[2] = {1,1}; -// Variable holding the screen width; -__ma unsigned byte conio_screen_width = 0; -// Variable holding the screen height; -__ma unsigned byte conio_screen_height = 0; -// Variable holding the screen layer on the VERA card with which conio interacts; -__ma unsigned byte conio_screen_layer = 1; - -// Variables holding the current map width and map height of the layer. -__ma word conio_width = 0; -__ma word conio_height = 0; -__ma byte conio_skip = 0; - // clears the screen and moves the cursor to the upper left-hand corner of the screen. void clrscr(void) { char* line_text = CONIO_SCREEN_TEXT; - word skip = (word)((word)1<=CONIO_WIDTH) x = 0; conio_cursor_x[conio_screen_layer] = x; conio_cursor_y[conio_screen_layer] = y; - unsigned int line_offset = (unsigned int)y << conio_skip; + unsigned int line_offset = (unsigned int)y << conio_rowshift; conio_line_text[conio_screen_layer] = line_offset; } @@ -193,7 +204,7 @@ inline unsigned byte wherey(void) { // Output one character at the current cursor position // Moves the cursor forward. Scrolls the entire screen if needed void cputc(char c) { - char color = vera_get_layer_color( conio_screen_layer); + char color = vera_layer_get_color( conio_screen_layer); char* conio_addr = CONIO_SCREEN_TEXT + conio_line_text[conio_screen_layer]; conio_addr += conio_cursor_x[conio_screen_layer] << 1; @@ -225,7 +236,7 @@ void cputc(char c) { void cputln() { // TODO: This needs to be optimized! other variations don't compile because of sections not available! word temp = conio_line_text[conio_screen_layer]; - temp += (word)((word)1<addr; *VERA_ADDRX_H = VERA_INC_1; - char color = vera_get_layer_color( conio_screen_layer); + char color = vera_layer_get_color( conio_screen_layer); for( unsigned int c=0;c0; i--) { - unsigned int line = (conio_cursor_y[conio_screen_layer] + i - 1) << conio_skip; + unsigned int line = (conio_cursor_y[conio_screen_layer] + i - 1) << conio_rowshift; unsigned char* start = CONIO_SCREEN_TEXT + line; - memcpy_in_vram(0, start+((word)1<addr_i; - CONIO_SCREEN_TEXT = addr_i << 8; - conio_width = vera_get_layer_map_width(conio_screen_layer); - conio_skip = (byte)(conio_width >> 4); - conio_height = vera_get_layer_map_height(conio_screen_layer); + CONIO_SCREEN_BANK = vera_layer_get_mapbase_bank(conio_screen_layer); + CONIO_SCREEN_TEXT = vera_layer_get_mapbase_offset(conio_screen_layer); + conio_width = vera_layer_get_width(conio_screen_layer); + conio_rowshift = vera_layer_get_rowshift(conio_screen_layer); + conio_rowskip = vera_layer_get_rowskip(conio_screen_layer); + conio_height = vera_layer_get_height(conio_screen_layer); } @@ -352,7 +361,7 @@ void screenlayer(unsigned byte layer) { // This will only work when the VERA is in 16 color mode! // Note that on the VERA, the transparent color has value 0. inline char textcolor(char color) { - return vera_set_layer_textcolor(conio_screen_layer, color); + return vera_layer_set_textcolor(conio_screen_layer, color); } // Set the back color for text output. The old back text color setting is returned. @@ -360,7 +369,7 @@ inline char textcolor(char color) { // This will only work when the VERA is in 16 color mode! // Note that on the VERA, the transparent color has value 0. inline char bgcolor(char color) { - return vera_set_layer_backcolor(conio_screen_layer, color); + return vera_layer_set_backcolor(conio_screen_layer, color); } // Set the color for the border. The old color setting is returned. diff --git a/src/main/kc/lib/veralib.c b/src/main/kc/lib/veralib.c index 1ed0b60f5..94d3e3e14 100644 --- a/src/main/kc/lib/veralib.c +++ b/src/main/kc/lib/veralib.c @@ -10,32 +10,6 @@ // --- VERA layer management --- -word vera_mapbase_word[2] = {0,0}; -byte vera_mapbase_bank[2] = {0,0}; -dword vera_mapbase_dword[2] = {0,0}; - -word vera_tilebase_word[2] = {0,0}; -byte vera_tilebase_bank[2] = {0,0}; -dword vera_tilebase_dword[2] = {0,0}; - -byte vera_row_shift[2] = {0,0}; - -const byte vera_layer_hflip[2] = {0,0x04}; -const byte vera_layer_vflip[2] = {0,0x08}; - - -byte* vera_layer_config[2] = {VERA_L0_CONFIG, VERA_L1_CONFIG}; -byte vera_layer_enable[2] = { VERA_LAYER0_ENABLE, VERA_LAYER1_ENABLE }; - -byte* vera_layer_mapbase[2] = {VERA_L0_MAPBASE, VERA_L1_MAPBASE}; -byte* vera_layer_tilebase[2] = {VERA_L0_TILEBASE, VERA_L1_TILEBASE}; -byte* vera_layer_vscroll_l[2] = {VERA_L0_VSCROLL_L, VERA_L1_VSCROLL_L}; -byte* vera_layer_vscroll_h[2] = {VERA_L0_VSCROLL_H, VERA_L1_VSCROLL_H}; -byte* vera_layer_hscroll_l[2] = {VERA_L0_HSCROLL_L, VERA_L1_HSCROLL_L}; -byte* vera_layer_hscroll_h[2] = {VERA_L0_HSCROLL_H, VERA_L1_HSCROLL_H}; - -byte vera_layer_textcolor[2] = {WHITE, WHITE}; -byte vera_layer_backcolor[2] = {BLUE, BLUE}; // --- VERA addressing --- @@ -61,25 +35,12 @@ void vera_vram_address1(dword bankaddr, byte incr) { *VERA_ADDRX_H = <(*word_h) | incr; } -// Get the map base address of the tiles for the layer. -// - layer: Value of 0 or 1. -// - return: Specifies the map base address of the layer, which is returned as a dword. -// Note that the register only specifies bits 16:9 of the 17 total bit-address, -// so the resulting address in the VERA VRAM is always aligned to a multiple of 512 bytes! -dword vera_get_layer_mapbase_address(byte layer) { - layer &= $1; - byte mapbase = *vera_layer_mapbase[layer]; - dword address = mapbase; - address <<= 8; - address <<= 1; - return address; -} // --- VERA layer management --- // Set the configuration of the layer. // - layer: Value of 0 or 1. // - config: Specifies the modes which are specified using T256C / 'Bitmap Mode' / 'Color Depth'. -void vera_set_layer_config(char layer, char config) { +void vera_layer_set_config(char layer, char config) { layer &= $1; char* addr = vera_layer_config[layer]; *addr = config; @@ -88,51 +49,50 @@ void vera_set_layer_config(char layer, char config) { // Set the configuration of the layer. // - layer: Value of 0 or 1. // - config: Specifies the modes which are specified using T256C / 'Bitmap Mode' / 'Color Depth'. -char vera_get_layer_config(char layer) { - layer &= $1; +char vera_layer_get_config(char layer) { char* config = vera_layer_config[layer]; return *config; } // Set the map width or height of the layer. // - layer: Value of 0 or 1. -inline void vera_set_layer_map_width_32(unsigned byte layer) { +inline void vera_layer_set_width_32(unsigned byte layer) { byte* addr = vera_layer_config[layer]; *addr &= ~VERA_LAYER_WIDTH_MASK; *addr |= VERA_LAYER_WIDTH_32; } -inline void vera_set_layer_map_width_64(unsigned byte layer) { +inline void vera_layer_set_width_64(unsigned byte layer) { byte* addr = vera_layer_config[layer]; //*addr &= (~VERA_CONFIG_WIDTH_MASK) | VERA_CONFIG_WIDTH_64; *addr &= ~VERA_LAYER_WIDTH_MASK; *addr |= VERA_LAYER_WIDTH_64; } -inline void vera_set_layer_map_width_128(unsigned byte layer) { +inline void vera_layer_set_width_128(unsigned byte layer) { byte* addr = vera_layer_config[layer]; *addr &= ~VERA_LAYER_WIDTH_MASK; *addr |= VERA_LAYER_WIDTH_128; } -inline void vera_set_layer_map_width_256(unsigned byte layer) { +inline void vera_layer_set_width_256(unsigned byte layer) { byte* addr = vera_layer_config[layer]; *addr &= ~VERA_LAYER_WIDTH_MASK; *addr |= VERA_LAYER_WIDTH_256; } -inline void vera_set_layer_map_height_32(unsigned byte layer) { +inline void vera_layer_set_height_32(unsigned byte layer) { byte* addr = vera_layer_config[layer]; *addr &= ~VERA_LAYER_HEIGHT_MASK; *addr |= VERA_LAYER_HEIGHT_32; } -inline void vera_set_layer_map_height_64(unsigned byte layer) { +inline void vera_layer_set_height_64(unsigned byte layer) { byte* addr = vera_layer_config[layer]; *addr &= ~VERA_LAYER_HEIGHT_MASK; *addr |= VERA_LAYER_HEIGHT_64; } -inline void vera_set_layer_map_height_128(unsigned byte layer) { +inline void vera_layer_set_height_128(unsigned byte layer) { byte* addr = vera_layer_config[layer]; *addr &= ~VERA_LAYER_HEIGHT_MASK; *addr |= VERA_LAYER_HEIGHT_128; } -inline void vera_set_layer_map_height_256(unsigned byte layer) { +inline void vera_layer_set_height_256(unsigned byte layer) { byte* addr = vera_layer_config[layer]; *addr &= ~VERA_LAYER_HEIGHT_MASK; *addr |= VERA_LAYER_HEIGHT_256; @@ -140,13 +100,13 @@ inline void vera_set_layer_map_height_256(unsigned byte layer) { // Get the map width or height of the layer. // - layer: Value of 0 or 1. -word vera_get_layer_map_width(unsigned byte layer) { +word vera_layer_get_width(unsigned byte layer) { byte* config = vera_layer_config[layer]; byte mask = (byte)VERA_LAYER_WIDTH_MASK; return VERA_LAYER_WIDTH[ (*config & mask) >> 4]; } -word vera_get_layer_map_height(unsigned byte layer) { +word vera_layer_get_height(unsigned byte layer) { byte* config = vera_layer_config[layer]; byte mask = VERA_LAYER_HEIGHT_MASK; return VERA_LAYER_HEIGHT[ (*config & mask) >> 6]; @@ -154,22 +114,22 @@ word vera_get_layer_map_height(unsigned byte layer) { // Set the color depth of the layer in terms of bit per pixel (BPP) of the tile base. // - layer: Value of 0 or 1. -inline void vera_set_layer_color_depth_1BPP(unsigned byte layer) { +inline void vera_layer_set_color_depth_1BPP(unsigned byte layer) { byte* addr = vera_layer_config[layer]; *addr &= ~VERA_LAYER_COLOR_DEPTH_MASK; *addr |= VERA_LAYER_COLOR_DEPTH_1BPP; } -inline void vera_set_layer_color_depth_2BPP(unsigned byte layer) { +inline void vera_layer_set_color_depth_2BPP(unsigned byte layer) { byte* addr = vera_layer_config[layer]; *addr &= ~VERA_LAYER_COLOR_DEPTH_MASK; *addr |= VERA_LAYER_COLOR_DEPTH_2BPP; } -inline void vera_set_layer_color_depth_4BPP(unsigned byte layer) { +inline void vera_layer_set_color_depth_4BPP(unsigned byte layer) { byte* addr = vera_layer_config[layer]; *addr &= ~VERA_LAYER_COLOR_DEPTH_MASK; *addr |= VERA_LAYER_COLOR_DEPTH_4BPP; } -inline void vera_set_layer_color_depth_8BPP(unsigned byte layer) { +inline void vera_layer_set_color_depth_8BPP(unsigned byte layer) { byte* addr = vera_layer_config[layer]; *addr &= ~VERA_LAYER_COLOR_DEPTH_MASK; *addr |= VERA_LAYER_COLOR_DEPTH_8BPP; @@ -178,7 +138,7 @@ inline void vera_set_layer_color_depth_8BPP(unsigned byte layer) { // Get the map width or height of the layer. // - layer: Value of 0 or 1. // - return: 1, 2, 4 or 8. -word vera_get_layer_color_depth(unsigned byte layer) { +word vera_layer_get_color_depth(unsigned byte layer) { byte* config = vera_layer_config[layer]; byte mask = (byte)VERA_LAYER_COLOR_DEPTH_MASK; return VERA_LAYER_COLOR_DEPTH[(*config & mask)]; @@ -186,22 +146,21 @@ word vera_get_layer_color_depth(unsigned byte layer) { // Enable the layer to be displayed on the screen. // - layer: 0 or 1. -inline void vera_show_layer(char layer) { +inline void vera_layer_show(char layer) { *VERA_DC_VIDEO |= vera_layer_enable[layer]; } // Disable the layer to be displayed on the screen. // - layer: 0 or 1. -inline void vera_hide_layer(char layer) { +inline void vera_layer_hide(char layer) { *VERA_DC_VIDEO &= ~vera_layer_enable[layer]; } // Is the layer shown on the screen? // - returns: 1 if layer is displayed on the screen, 0 if not. -char vera_is_layer_shown(char layer) { - layer &= $1; +char vera_layer_is_visible(char layer) { return *VERA_DC_VIDEO & vera_layer_enable[layer]; } @@ -210,19 +169,61 @@ char vera_is_layer_shown(char layer) { // - mapbase: Specifies the base address of the tile map. // Note that the register only specifies bits 16:9 of the address, // so the resulting address in the VERA VRAM is always aligned to a multiple of 512 bytes. -void vera_set_layer_mapbase(unsigned byte layer, unsigned byte mapbase) { - layer &= $1; +void vera_layer_set_mapbase(unsigned byte layer, unsigned byte mapbase) { unsigned byte* addr = vera_layer_mapbase[layer]; *addr = mapbase; } +// Set the base of the map layer with which the conio will interact. +// - layer: Value of 0 or 1. +// - dw_mapbase: a dword typed address (4 bytes), that specifies the full address of the map base. +// The function does the translation from the dword that contains the 17 bit address, +// to the respective mapbase vera register. +// Note that the register only specifies bits 16:9 of the address, +// so the resulting address in the VERA VRAM is always aligned to a multiple of 512 bytes. +void vera_layer_set_mapbase_address(byte layer, dword dw_mapbase) { + + dw_mapbase = dw_mapbase & 0x1FF00; // Aligned to 2048 bit zones. + byte bank_mapbase = (byte)>dw_mapbase; + word offset_mapbase = (<(dw_mapbase>>1)); + vera_layer_set_mapbase(layer,mapbase); +} + +// Get the map base address of the tiles for the layer. +// - layer: Value of 0 or 1. +// - return: Specifies the map base address of the layer, which is returned as a dword. +// Note that the register only specifies bits 16:9 of the 17 bit address, +// so the resulting address in the VERA VRAM is always aligned to a multiple of 512 bytes! +dword vera_layer_get_mapbase_address(byte layer) { + return vera_mapbase_address[layer]; +} + +// Get the map base bank of the tiles for the layer. +// - layer: Value of 0 or 1. +// - return: Bank in vera vram. +byte vera_layer_get_mapbase_bank(byte layer) { + return vera_mapbase_bank[layer]; +} + +// Get the map base lower 16-bit address (offset) of the tiles for the layer. +// - layer: Value of 0 or 1. +// - return: Offset in vera vram of the specified bank. +word vera_layer_get_mapbase_offset(byte layer) { + return vera_mapbase_offset[layer]; +} + // Get the base of the map layer with which the conio will interact. // - layer: Value of 0 or 1. // - return: Returns the base address of the tile map. // Note that the register is a byte, specifying only bits 16:9 of the address, // so the resulting address in the VERA VRAM is always aligned to a multiple of 512 bytes. -unsigned byte vera_get_layer_mapbase(unsigned byte layer) { - layer &= $1; +unsigned byte vera_layer_get_mapbase(unsigned byte layer) { unsigned byte* mapbase = vera_layer_mapbase[layer]; return *mapbase; } @@ -232,8 +233,7 @@ unsigned byte vera_get_layer_mapbase(unsigned byte layer) { // - tilebase: Specifies the base address of the tile map. // Note that the register only specifies bits 16:11 of the address, // so the resulting address in the VERA VRAM is always aligned to a multiple of 2048 bytes! -void vera_set_layer_tilebase(unsigned byte layer, unsigned byte tilebase) { - layer &= $1; +void vera_layer_set_tilebase(unsigned byte layer, unsigned byte tilebase) { unsigned byte* addr = vera_layer_tilebase[layer]; *addr = tilebase; } @@ -243,19 +243,44 @@ void vera_set_layer_tilebase(unsigned byte layer, unsigned byte tilebase) { // - return: Specifies the base address of the tile map. // Note that the register only specifies bits 16:11 of the address, // so the resulting address in the VERA VRAM is always aligned to a multiple of 2048 bytes! -unsigned byte vera_get_layer_tilebase(unsigned byte layer) { - layer &= $1; - unsigned byte* tilebase = vera_layer_tilebase[layer]; +byte vera_layer_get_tilebase(byte layer) { + byte* tilebase = vera_layer_tilebase[layer]; return *tilebase; } +// Set the base address of the tiles for the layer with which the conio will interact. +// - layer: Value of 0 or 1. +// - dw_tilebase: a dword typed address (4 bytes), that specifies the base address of the tile map. +// The function does the translation from the dword that contains the 17 bit address, +// to the respective tilebase vera register. +// Note that the resulting vera register holds only specifies bits 16:11 of the address, +// so the resulting address in the VERA VRAM is always aligned to a multiple of 2048 bytes! +void vera_layer_set_tilebase_address(byte layer, dword dw_tilebase) { + + dw_tilebase = dw_tilebase & 0x1FC00; // Aligned to 2048 bit zones. + byte bank_tilebase = (byte)>dw_tilebase; + word word_tilebase = (<(dw_tilebase>>1)); + tilebase &= VERA_LAYER_TILEBASE_MASK; // Ensure that only tilebase is blanked, but keep the rest! + //printf("tilebase = %x\n",tilebase); + //while(!kbhit()); + tilebase = tilebase | ( *vera_tilebase & ~VERA_LAYER_TILEBASE_MASK ); + + vera_layer_set_tilebase(layer,tilebase); +} + // Get the tile base address of the tiles for the layer. // - layer: Value of 0 or 1. // - return: Specifies the base address of the tile map, which is calculated as an unsigned long int. // Note that the register only specifies bits 16:11 of the address, // so the resulting address in the VERA VRAM is always aligned to a multiple of 2048 bytes! -dword vera_get_layer_tilebase_address(byte layer) { - layer &= $1; +dword vera_layer_get_tilebase_address(byte layer) { byte tilebase = *vera_layer_tilebase[layer]; dword address = tilebase; address &= $FC; @@ -271,8 +296,7 @@ dword vera_get_layer_tilebase_address(byte layer) { // - color: a 4 bit value ( decimal between 0 and 15). // This will only work when the VERA is in 16 color mode! // Note that on the VERA, the transparent color has value 0. -unsigned byte vera_set_layer_textcolor(unsigned byte layer, unsigned byte color) { - layer &= $1; +unsigned byte vera_layer_set_textcolor(unsigned byte layer, unsigned byte color) { unsigned byte old = vera_layer_textcolor[layer]; vera_layer_textcolor[layer] = color; return old; @@ -283,7 +307,7 @@ unsigned byte vera_set_layer_textcolor(unsigned byte layer, unsigned byte color) // - return: a 4 bit value ( decimal between 0 and 15). // This will only work when the VERA is in 16 color mode! // Note that on the VERA, the transparent color has value 0. -unsigned byte vera_get_layer_textcolor(unsigned byte layer) { +unsigned byte vera_layer_get_textcolor(unsigned byte layer) { layer &= $1; return vera_layer_textcolor[layer]; } @@ -293,7 +317,7 @@ unsigned byte vera_get_layer_textcolor(unsigned byte layer) { // - color: a 4 bit value ( decimal between 0 and 15). // This will only work when the VERA is in 16 color mode! // Note that on the VERA, the transparent color has value 0. -unsigned byte vera_set_layer_backcolor(unsigned byte layer, unsigned byte color) { +unsigned byte vera_layer_set_backcolor(unsigned byte layer, unsigned byte color) { layer &= $1; unsigned byte old = vera_layer_backcolor[layer]; vera_layer_backcolor[layer] = color; @@ -305,7 +329,7 @@ unsigned byte vera_set_layer_backcolor(unsigned byte layer, unsigned byte color) // - return: a 4 bit value ( decimal between 0 and 15). // This will only work when the VERA is in 16 color mode! // Note that on the VERA, the transparent color has value 0. -unsigned byte vera_get_layer_backcolor(unsigned byte layer) { +unsigned byte vera_layer_get_backcolor(unsigned byte layer) { layer &= $1; return vera_layer_backcolor[layer]; } @@ -315,7 +339,7 @@ unsigned byte vera_get_layer_backcolor(unsigned byte layer) { // - return: an 8 bit value with bit 7:4 containing the back color and bit 3:0 containing the front color. // This will only work when the VERA is in 16 color mode! // Note that on the VERA, the transparent color has value 0. -unsigned byte vera_get_layer_color(unsigned byte layer) { +unsigned byte vera_layer_get_color(unsigned byte layer) { layer &= $1; return ((vera_layer_backcolor[layer] << 4) | vera_layer_textcolor[layer]); } @@ -324,7 +348,7 @@ unsigned byte vera_get_layer_color(unsigned byte layer) { // Scroll the horizontal (X) axis of the layer visible area over the layer tile map area. // - layer: Value of 0 or 1. // - scroll: A value between 0 and 4096. -inline void vera_set_layer_horizontal_scroll(byte layer, word scroll) { +inline void vera_layer_set_horizontal_scroll(byte layer, word scroll) { *vera_layer_hscroll_l[layer] = scroll; } @@ -332,13 +356,27 @@ inline void vera_set_layer_horizontal_scroll(byte layer, word scroll) { // Scroll the vertical (Y) axis of the layer visible area over the layer tile map area. // - layer: Value of 0 or 1. // - scroll: A value between 0 and 4096. -inline void vera_set_layer_vertical_scroll(byte layer, word scroll) { +inline void vera_layer_set_vertical_scroll(byte layer, word scroll) { *vera_layer_vscroll_l[layer] = scroll; } +// Get the bit shift value required to skip a whole line fast. +// - layer: Value of 0 or 1. +// - return: Rowshift value to calculate fast from a y value to line offset in tile mode. +byte vera_layer_get_rowshift(byte layer) { + return vera_layer_rowshift[layer]; +} -void vera_mode_tile(byte layer, dword mapbase_dw, dword tilebase_dw, word mapwidth, word mapheight, byte tilewidth, byte tileheight, byte color_depth ) { +// Get the value required to skip a whole line fast. +// - layer: Value of 0 or 1. +// - return: Skip value to calculate fast from a y value to line offset in tile mode. +word vera_layer_get_rowskip(byte layer) { + return vera_layer_rowskip[layer]; +} + + +void vera_layer_mode_tile(byte layer, dword mapbase_address, dword dw_tilebase, word mapwidth, word mapheight, byte tilewidth, byte tileheight, byte color_depth ) { // config byte config = 0x00; switch(color_depth) { @@ -359,19 +397,23 @@ void vera_mode_tile(byte layer, dword mapbase_dw, dword tilebase_dw, word mapwid switch(mapwidth) { case 32: config |= VERA_LAYER_WIDTH_32; - vera_row_shift[layer] = 6; + vera_layer_rowshift[layer] = 6; + vera_layer_rowskip[layer] = 64; break; case 64: config |= VERA_LAYER_WIDTH_64; - vera_row_shift[layer] = 7; + vera_layer_rowshift[layer] = 7; + vera_layer_rowskip[layer] = 128; break; case 128: config |= VERA_LAYER_WIDTH_128; - vera_row_shift[layer] = 8; + vera_layer_rowshift[layer] = 8; + vera_layer_rowskip[layer] = 256; break; case 256: config |= VERA_LAYER_WIDTH_256; - vera_row_shift[layer] = 9; + vera_layer_rowshift[layer] = 9; + vera_layer_rowskip[layer] = 512; break; } switch(mapheight) { @@ -388,32 +430,32 @@ void vera_mode_tile(byte layer, dword mapbase_dw, dword tilebase_dw, word mapwid config |= VERA_LAYER_HEIGHT_256; break; } - vera_set_layer_config(layer, config); + vera_layer_set_config(layer, config); // mapbase - vera_mapbase_word[layer] = mapbase_dw; - vera_mapbase_dword[layer] = mapbase_dw; + vera_mapbase_offset[layer] = mapbase_address); + vera_mapbase_address[layer] = mapbase_address; - mapbase_dw = mapbase_dw >> 1; - byte mapbase = (byte)<(mapbase_dw >> 8); - vera_set_layer_mapbase(layer,mapbase); + mapbase_address = mapbase_address >> 1; + byte mapbase = (byte)<(mapbase_address >> 8); + vera_layer_set_mapbase(layer,mapbase); - //printf("%lx\n",mapbase_dw); + //printf("%lx\n",dw_mapbase); // tilebase - vera_tilebase_word[layer] = tilebase_dw; - vera_tilebase_dword[layer] = tilebase_dw; + vera_tilebase_offset[layer] = dw_tilebase; + vera_tilebase_address[layer] = dw_tilebase; - //printf("tilebase word = %x\n",vera_tilebase_word[layer]); + //printf("tilebase word = %x\n",vera_tilebase_offset[layer]); //printf("tilebase bank = %x\n",vera_tilebase_bank[layer]); - //printf("tilebase dword = %lx\n",vera_tilebase_dword[layer]); + //printf("tilebase dword = %lx\n",vera_tilebase_address[layer]); - tilebase_dw = tilebase_dw >> 1; - byte tilebase = (byte)<(tilebase_dw >> 8); - tilebase &= VERA_TILEBASE_MASK; + dw_tilebase = dw_tilebase >> 1; + byte tilebase = (byte)<(dw_tilebase >> 8); + tilebase &= VERA_LAYER_TILEBASE_MASK; switch(tilewidth) { case 8: tilebase |= VERA_TILEBASE_WIDTH_8; @@ -431,15 +473,15 @@ void vera_mode_tile(byte layer, dword mapbase_dw, dword tilebase_dw, word mapwid break; } //printf("tilebase = %x\n",tilebase); - vera_set_layer_tilebase(layer,tilebase); + vera_layer_set_tilebase(layer,tilebase); } // --- TILE FUNCTIONS --- void vera_tile_area(byte layer, word tileindex, byte x, byte y, byte w, byte h, byte hflip, byte vflip, byte offset) { - dword mapbase = vera_mapbase_dword[layer]; - byte shift = vera_row_shift[layer]; + dword mapbase = vera_mapbase_address[layer]; + byte shift = vera_layer_rowshift[layer]; word rowskip = (word)1 << shift; hflip = vera_layer_hflip[hflip]; vflip = vera_layer_vflip[vflip]; diff --git a/src/test/kc/examples/cx16/tilemap.c b/src/test/kc/examples/cx16/tilemap.c index 1a032b232..e8dc036ee 100644 --- a/src/test/kc/examples/cx16/tilemap.c +++ b/src/test/kc/examples/cx16/tilemap.c @@ -20,12 +20,12 @@ void main() { clrscr(); // Now we set the tile map width and height. - // vera_set_layer_mapbase(0,0x80); // Set the map base to address 0x10000 in VERA VRAM! - // vera_set_layer_config(0, vera_get_layer_config(1)); - // vera_set_layer_tilebase(0, vera_get_layer_tilebase(1)); - // vera_set_layer_map_width_128(0); - // vera_set_layer_map_height_128(0); - dword tilebase = vera_get_layer_tilebase_address(1); + // vera_layer_set_mapbase(0,0x80); // Set the map base to address 0x10000 in VERA VRAM! + // vera_layer_set_config(0, vera_layer_get_config(1)); + // vera_layer_set_tilebase(0, vera_layer_get_tilebase(1)); + // vera_layer_set_width_128(0); + // vera_layer_set_height_128(0); + dword tilebase = vera_layer_get_tilebase_address(1); vera_mode_tile(0, 0x10000, 0xF800, 128, 128, 8, 8, 1); @@ -42,14 +42,14 @@ void main() { *VERA_IEN = VERA_VSYNC; CLI(); - vera_show_layer(0); + vera_layer_show(0); while(!kbhit()); - vera_hide_layer(0); + vera_layer_hide(0); textcolor(GREY); bgcolor(GREEN); draw_characters(tilebase); - vera_show_layer(0); + vera_layer_show(0); screenlayer(1); @@ -70,11 +70,11 @@ void main() { while(!kbhit()); screenlayer(0); - vera_hide_layer(0); + vera_layer_hide(0); textcolor(DARK_GREY); bgcolor(BLACK); draw_characters(tilebase); - vera_show_layer(0); + vera_layer_show(0); screenlayer(1); gotoxy(0,20); @@ -142,8 +142,8 @@ __interrupt(rom_sys_cx16) void irq_vsync() { scroll_y = 0; } - vera_set_layer_horizontal_scroll(0,(word)scroll_x); - vera_set_layer_vertical_scroll(0,(word)scroll_y); + vera_layer_set_horizontal_scroll(0,(word)scroll_x); + vera_layer_set_vertical_scroll(0,(word)scroll_y); // Reset the VSYNC interrupt *VERA_ISR = VERA_VSYNC; diff --git a/src/test/kc/examples/cx16/tilemap_2bpp_16_x_16.c b/src/test/kc/examples/cx16/tilemap_2bpp_16_x_16.c new file mode 100644 index 000000000..45072aad4 --- /dev/null +++ b/src/test/kc/examples/cx16/tilemap_2bpp_16_x_16.c @@ -0,0 +1,94 @@ +// Example program for the Commander X16. +// Demonstrates the usage of the VERA tile map modes and layering. + +// Author: Sven Van de Velde + +// The default layer of the CX16 is layer 1, but the tiles are written on layer 0. +// The CX16 starts in tile map mode, 2BPP in 4 color mode, and uses 16x16 tiles. + +// An explanation is given how this mode is organized, and how the tiles display and coloring works. +// Pälette offsets are explained also. + +#include +#include + +void main() { + + textcolor(WHITE); + bgcolor(BLACK); + clrscr(); + + //vera_layer_mode_tile(1, 0x10000, 0x00000, 128, 64, 8, 8, 1); + vera_layer_mode_tile(0, 0x04000, 0x14000, 128, 128, 16, 16, 2); + //vera_layer_mode_tile(0, 0x04000, 0x14000, 128, 128, 16, 16, 2); + + byte tiles[256] = { + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55, + 0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55, + 0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55, + 0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55, + 0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA, + 0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA, + 0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA, + 0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + }; + + memcpy_to_vram(1, 0x4000, tiles, 256); + + //vera_tile_area(byte layer, word tileindex, byte x, byte y, byte w, byte h, byte hflip, byte vflip, byte offset) + + vera_tile_area(0, 0, 0, 0, 40, 30, 0, 0, 0); + + // Draw 4 squares with each tile, starting from row 4, width 1, height 1, separated by 2 characters. + vera_tile_area(0, 0, 4, 2, 1, 1, 0, 0, 0); + vera_tile_area(0, 1, 10, 2, 1, 1, 0, 0, 0); + vera_tile_area(0, 2, 16, 2, 1, 1, 0, 0, 0); + vera_tile_area(0, 3, 22, 2, 1, 1, 0, 0, 0); + + // Draw 4 squares with each tile, starting from row 6, width 4, height 4, separated by 2 characters. + vera_tile_area(0, 0, 4, 4, 4, 4, 0, 0, 0); + vera_tile_area(0, 1, 10, 4, 4, 4, 0, 0, 0); + vera_tile_area(0, 2, 16, 4, 4, 4, 0, 0, 0); + vera_tile_area(0, 3, 22, 4, 4, 4, 0, 0, 0); + + word tile = 0; + byte offset = 0; + + byte row = 10; + + for(byte r:0..3) { + byte column = 4; + for(byte c:0..16) { + vera_tile_area(0, tile, column, row, 1, 1, 0, 0, offset); + column+=2; + offset++; + } + tile++; + tile &= 0x3; + row += 2; + } + + vera_layer_show(0); + + gotoxy(0,40); + printf("vera in tile mode 8 x 8, color depth 2 bits per pixel.\n"); + + printf("in this mode, tiles are 8 pixels wide and 8 pixels tall.\n"); + printf("each tile can have a variation of 4 colors.\n"); + printf("the vera palette of 256 colors, can be used by setting the palette\n"); + printf("offset for each tile.\n"); + printf("here each column is displaying the same tile, but with different offsets!\n"); + printf("each offset aligns to multiples of 16 colors, and only the first 4 colors\n"); + printf("can be used per offset!\n"); + printf("however, the first color will always be transparent (black).\n"); + + while(!kbhit()); +} diff --git a/src/test/kc/examples/cx16/tilemap_2bpp_8_x_8.c b/src/test/kc/examples/cx16/tilemap_2bpp_8_x_8.c index f698b50e2..4679ffe5e 100644 --- a/src/test/kc/examples/cx16/tilemap_2bpp_8_x_8.c +++ b/src/test/kc/examples/cx16/tilemap_2bpp_8_x_8.c @@ -56,7 +56,7 @@ void main() { row += 4; } - vera_show_layer(0); + vera_layer_show(0); gotoxy(0,40); printf("vera in tile mode 8 x 8, color depth 2 bits per pixel.\n"); diff --git a/src/test/kc/examples/cx16/tilemap_4bpp_16_x_16.c b/src/test/kc/examples/cx16/tilemap_4bpp_16_x_16.c new file mode 100644 index 000000000..b8bd6cc8a --- /dev/null +++ b/src/test/kc/examples/cx16/tilemap_4bpp_16_x_16.c @@ -0,0 +1,222 @@ +// Example program for the Commander X16. +// Demonstrates the usage of the VERA tile map modes and layering. + +// Author: Sven Van de Velde + +// The default layer of the CX16 is layer 1, but the tiles are written on layer 0. +// The CX16 starts in tile map mode, 2BPP in 4 color mode, and uses 16x16 tiles. + +// An explanation is given how this mode is organized, and how the tiles display and coloring works. +// Pälette offsets are explained also. + +#include +#include + +void main() { + + textcolor(WHITE); + bgcolor(BLACK); + clrscr(); + + vera_mode_tile(0, 0x04000, 0x14000, 128, 128, 16, 16, 4); + + byte tiles[2048] = { + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22, + 0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22, + 0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22, + 0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22, + 0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22, + 0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22, + 0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22, + 0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, + 0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, + 0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, + 0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, + 0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, + 0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, + 0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, + 0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, + 0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55, + 0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55, + 0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55, + 0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55, + 0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55, + 0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55, + 0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55, + 0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55, + 0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66, + 0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66, + 0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66, + 0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66, + 0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66, + 0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66, + 0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66, + 0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99, + 0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99, + 0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99, + 0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99, + 0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99, + 0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99, + 0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99, + 0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99, + 0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA, + 0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA, + 0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA, + 0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA, + 0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA, + 0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA, + 0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA, + 0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA, + 0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB, + 0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB, + 0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB, + 0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB, + 0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB, + 0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB, + 0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB, + 0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB, + 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, + 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, + 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, + 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, + 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, + 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, + 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, + 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + }; + + memcpy_to_vram(1, 0x4000, tiles, 2048); + + //vera_tile_area(byte layer, word tileindex, byte x, byte y, byte w, byte h, byte hflip, byte vflip, byte offset) + + vera_tile_area(0, 0, 0, 0, 40, 30, 0, 0, 0); + + word tile = 0; + + // Draw 4 squares with each tile, starting from row 4, width 1, height 1, separated by 2 characters. + tile = 0; + byte column = 1; + for(byte c:0..7) { + vera_tile_area(0, tile, column, 1, 1, 1, 0, 0, 0); + column+=4; + tile++; + } + column = 1; + for(byte c:0..7) { + vera_tile_area(0, tile, column, 3, 1, 1, 0, 0, 0); + column+=4; + tile++; + } + + tile = 0; + column = 1; + for(byte c:0..7) { + vera_tile_area(0, tile, column, 5, 3, 3, 0, 0, 0); + column+=4; + tile++; + } + column = 1; + for(byte c:0..7) { + vera_tile_area(0, tile, column, 9, 3, 3, 0, 0, 0); + column+=4; + tile++; + } + + tile = 0; + byte offset = 0; + + byte row = 13; + + for(byte r:0..7) { + byte column = 1; + for(byte c:0..31) { + vera_tile_area(0, tile, column, row, 1, 1, 0, 0, offset); + column+=1; + tile++; + if((c & 0x0f) == 0x0f) offset++; + tile &= 0x0f; + } + row += 1; + } + + vera_layer_show(0); + + gotoxy(0,46); + printf("vera in tile mode 16 x 16, color depth 4 bits per pixel.\n"); + + printf("in this mode, tiles are 16 pixels wide and 16 pixels tall.\n"); + printf("each tile can have a variation of 16 colors.\n"); + printf("the vera palette of 256 colors, can be used by setting the palette\n"); + printf("offset for each tile.\n"); + printf("here each column is displaying the same tile, but with different offsets!\n"); + printf("each offset aligns to multiples of 16 colors in the palette!.\n"); + printf("however, the first color will always be transparent (black).\n"); + + while(!kbhit()); +} diff --git a/src/test/kc/examples/cx16/tilemap_4bpp_8_x_8.c b/src/test/kc/examples/cx16/tilemap_4bpp_8_x_8.c new file mode 100644 index 000000000..aba90d398 --- /dev/null +++ b/src/test/kc/examples/cx16/tilemap_4bpp_8_x_8.c @@ -0,0 +1,125 @@ +// Example program for the Commander X16. +// Demonstrates the usage of the VERA tile map modes and layering. + +// Author: Sven Van de Velde + +// The default layer of the CX16 is layer 1, but the tiles are written on layer 0. + +// An explanation is given how this mode is organized, and how the tiles display and coloring works. +// Pälette offsets are explained also. + +#include +#include + +void main() { + + textcolor(WHITE); + bgcolor(BLACK); + clrscr(); + + vera_mode_tile(0, 0x04000, 0x14000, 128, 128, 8, 8, 4); + + byte tiles[512] = { + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22, + 0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, + 0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, + 0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55, + 0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55, + 0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66, + 0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99, + 0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99, + 0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA, + 0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA, + 0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB, + 0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB, + 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, + 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + }; + + memcpy_to_vram(1, 0x4000, tiles, 512); + + //vera_tile_area(byte layer, word tileindex, byte x, byte y, byte w, byte h, byte hflip, byte vflip, byte offset) + + vera_tile_area(0, 0, 0, 0, 80, 60, 0, 0, 0); + + word tile = 0; + + // Draw 4 squares with each tile, starting from row 4, width 1, height 1, separated by 2 characters. + tile = 0; + byte column = 1; + for(byte c:0..7) { + vera_tile_area(0, tile, column, 1, 1, 1, 0, 0, 0); + column+=8; + tile++; + } + column = 1; + for(byte c:0..7) { + vera_tile_area(0, tile, column, 3, 1, 1, 0, 0, 0); + column+=8; + tile++; + } + + tile = 0; + column = 1; + for(byte c:0..7) { + vera_tile_area(0, tile, column, 5, 6, 6, 0, 0, 0); + column+=8; + tile++; + } + column = 1; + for(byte c:0..7) { + vera_tile_area(0, tile, column, 12, 6, 6, 0, 0, 0); + column+=8; + tile++; + } + + tile = 0; + byte offset = 0; + + byte row = 20; + + for(byte r:0..7) { + byte column = 1; + for(byte c:0..31) { + vera_tile_area(0, tile, column, row, 2, 2, 0, 0, offset); + column+=2; + tile++; + if((c & 0x0f) == 0x0f) offset++; + tile &= 0x0f; + } + row += 2; + } + + vera_layer_show(0); + + gotoxy(0,46); + printf("vera in tile mode 8 x 8, color depth 4 bits per pixel.\n"); + + printf("in this mode, tiles are 8 pixels wide and 8 pixels tall.\n"); + printf("each tile can have a variation of 16 colors.\n"); + printf("the vera palette of 256 colors, can be used by setting the palette\n"); + printf("offset for each tile.\n"); + printf("here each column is displaying the same tile, but with different offsets!\n"); + printf("each offset aligns to multiples of 16 colors in the palette!.\n"); + printf("however, the first color will always be transparent (black).\n"); + + while(!kbhit()); +} diff --git a/src/test/kc/examples/cx16/tilemap_8bpp_16_x_16.c b/src/test/kc/examples/cx16/tilemap_8bpp_16_x_16.c new file mode 100644 index 000000000..e7efbc22b --- /dev/null +++ b/src/test/kc/examples/cx16/tilemap_8bpp_16_x_16.c @@ -0,0 +1,152 @@ +// Example program for the Commander X16. +// Demonstrates the usage of the VERA tile map modes and layering. + +// Author: Sven Van de Velde + +// The default layer of the CX16 is layer 1, but the tiles are written on layer 0. + +// An explanation is given how this mode is organized, and how the tiles display and coloring works. +// Pälette offsets are explained also. + +#include +#include + +void main() { + + + byte tiles[256] = { + 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + }; + + // Before we can load the tiles into memory we need to re-arrange a few things! + // The amount of tiles is 256, the color depth is 256, so each tile is 256 bytes! + // That is 65356 bytes of memory, which is 64K. Yup! One memory bank in VRAM. + // VERA VRAM holds in bank 1 many registers that interfere loading all of this data. + // So it is better to load all in bank 0, but then there is an other issue. + // So the default CX16 character set is located in bank 0, at address 0xF800. + // So we need to move this character set to bank 1, suggested is at address 0xF000. + // The CX16 by default writes textual output to layer 1 in text mode, so we need to + // realign the moved character set to 0xf000 as the new tile base for layer 1. + // We also will need to realign for layer 1 the map base from 0x00000 to 0x10000. + // This is now all easily done with a few statements in the new kickc vera lib ... + + // Copy block of memory (from VRAM to VRAM) + // Copies the values from the location pointed by src to the location pointed by dest. + // The method uses the VERA access ports 0 and 1 to copy data from and to in VRAM. + // - src_bank: 64K VRAM bank number to copy from (0/1). + // - src: pointer to the location to copy from. Note that the address is a 16 bit value! + // - src_increment: the increment indicator, VERA needs this because addressing increment is automated by VERA at each access. + // - dest_bank: 64K VRAM bank number to copy to (0/1). + // - dest: pointer to the location to copy to. Note that the address is a 16 bit value! + // - dest_increment: the increment indicator, VERA needs this because addressing increment is automated by VERA at each access. + // - num: The number of bytes to copy + // void memcpy_in_vram(char dest_bank, void *dest, char dest_increment, char src_bank, void *src, char src_increment, unsigned int num ); + memcpy_in_vram(1, 0xF000, VERA_INC_1, 0, 0xF800, VERA_INC_0, 256*8); // We copy the 128 character set of 8 bytes each. + + // Set the base of the tiles for the layer with which the conio will interact. + // - layer: Value of 0 or 1. + // - dw_tilebase: a dword typed address (4 bytes), that specifies the base address of the tile map. + // The function does the translation from the dword that contains the 17 bit address, + // to the respective tilebase vera register. + // Note that the resulting vera register holds only specifies bits 16:11 of the address, + // so the resulting address in the VERA VRAM is always aligned to a multiple of 2048 bytes! + vera_layer_set_tilebase_address(1, 0x1F000); // Here we set layer 1 new character set base (tile base) to the new address. + + // Set the base of the map layer with which the conio will interact. + // - layer: Value of 0 or 1. + // - dw_mapbase: a dword typed address (4 bytes), that specifies the full address of the map base. + // The function does the translation from the dword that contains the 17 bit address, + // to the respective mapbase vera register. + // Note that the register only specifies bits 16:9 of the address, + // so the resulting address in the VERA VRAM is always aligned to a multiple of 512 bytes. + // void vera_layer_set_mapbase_address(byte layer, dword dw_mapbase); + vera_layer_set_mapbase_address(1, 0x10000); // Here we set the map base of layer 1 to 0x10000; + + vera_layer_mode_tile(1, 0x10000, 0x00000, 128, 64, 8, 8, 1); + + screenlayer(1); + textcolor(WHITE); + bgcolor(BLACK); + clrscr(); + + while(!kbhit()); + + // Now we can use the full bank 0! + // We set the mapbase of the tile demo to output to 0x12000, + // and the tilebase is set to 0x0000! + vera_layer_mode_tile(0, 0x10000, 0x00000, 64, 64, 16, 16, 8); + + + word tilebase = 0x0000; + memcpy_to_vram(0, tilebase, tiles, 256); + tilebase+=256; + for(byte t:1..10) { + for(byte p:0..255) { + tiles[p]+=1; + } + memcpy_to_vram(1, tilebase, tiles, 256); + tilebase+=256; + } + + //vera_tile_area(byte layer, word tileindex, byte x, byte y, byte w, byte h, byte hflip, byte vflip, byte offset) + + vera_tile_area(0, 0, 0, 0, 40, 30, 0, 0, 0); + + word tile = 0; + + // Draw 4 squares with each tile, starting from row 4, width 1, height 1, separated by 2 characters. + byte row = 1; + for(byte r:0..15) { + byte column = 1; + for(byte c:0..15) { + vera_tile_area(0, tile, column, row, 1, 1, 0, 0, 0); + column+=2; + tile++; + tile &= 0xff; + } + row += 2; + } + + tile = 0; + row = 20; + for(byte r:0..7) { + byte column = 1; + for(byte c:0..31) { + vera_tile_area(0, tile, column, row, 2, 2, 0, 0, 0); + column+=2; + tile++; + tile &= 0xff; + } + row += 2; + } + + vera_layer_show(0); + + gotoxy(0,46); + printf("vera in tile mode 8 x 8, color depth 8 bits per pixel.\n"); + + printf("in this mode, tiles are 8 pixels wide and 8 pixels tall.\n"); + printf("each tile can have a variation of 256 colors.\n"); + printf("the vera palette of 256 colors, can be used by setting the palette\n"); + printf("offset for each tile.\n"); + printf("here each column is displaying the same tile, but with different offsets!\n"); + printf("each offset aligns to multiples of 16 colors in the palette!.\n"); + printf("however, the first color will always be transparent (black).\n"); + + while(!kbhit()); +} diff --git a/src/test/kc/examples/cx16/tilemap_8bpp_8_x_8.c b/src/test/kc/examples/cx16/tilemap_8bpp_8_x_8.c new file mode 100644 index 000000000..40b41a888 --- /dev/null +++ b/src/test/kc/examples/cx16/tilemap_8bpp_8_x_8.c @@ -0,0 +1,90 @@ +// Example program for the Commander X16. +// Demonstrates the usage of the VERA tile map modes and layering. + +// Author: Sven Van de Velde + +// The default layer of the CX16 is layer 1, but the tiles are written on layer 0. + +// An explanation is given how this mode is organized, and how the tiles display and coloring works. +// Pälette offsets are explained also. + +#include +#include + +void main() { + + textcolor(WHITE); + bgcolor(BLACK); + clrscr(); + + vera_mode_tile(0, 0x04000, 0x14000, 128, 128, 8, 8, 8); + + byte tiles[64] = { + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + }; + + word tilebase = 0x4000; + memcpy_to_vram(1, tilebase, tiles, 64); + tilebase+=64; + for(byte t:1..255) { + for(byte p:0..63) { + tiles[p]+=1; + } + memcpy_to_vram(1, tilebase, tiles, 64); + tilebase+=64; + } + + //vera_tile_area(byte layer, word tileindex, byte x, byte y, byte w, byte h, byte hflip, byte vflip, byte offset) + + vera_tile_area(0, 0, 0, 0, 80, 60, 0, 0, 0); + + word tile = 0; + + // Draw 4 squares with each tile, starting from row 4, width 1, height 1, separated by 2 characters. + byte row = 1; + for(byte r:0..7) { + byte column = 1; + for(byte c:0..31) { + vera_tile_area(0, tile, column, row, 1, 1, 0, 0, 0); + column+=2; + tile++; + tile &= 0xff; + } + row += 2; + } + + tile = 0; + row = 20; + for(byte r:0..7) { + byte column = 1; + for(byte c:0..31) { + vera_tile_area(0, tile, column, row, 2, 2, 0, 0, 0); + column+=2; + tile++; + tile &= 0xff; + } + row += 2; + } + + vera_layer_show(0); + + gotoxy(0,46); + printf("vera in tile mode 8 x 8, color depth 8 bits per pixel.\n"); + + printf("in this mode, tiles are 8 pixels wide and 8 pixels tall.\n"); + printf("each tile can have a variation of 256 colors.\n"); + printf("the vera palette of 256 colors, can be used by setting the palette\n"); + printf("offset for each tile.\n"); + printf("here each column is displaying the same tile, but with different offsets!\n"); + printf("each offset aligns to multiples of 16 colors in the palette!.\n"); + printf("however, the first color will always be transparent (black).\n"); + + while(!kbhit()); +} diff --git a/src/test/kc/examples/cx16/veralayers.c b/src/test/kc/examples/cx16/veralayers.c index 669bb96c7..498625c64 100644 --- a/src/test/kc/examples/cx16/veralayers.c +++ b/src/test/kc/examples/cx16/veralayers.c @@ -39,12 +39,12 @@ void main() { // It displays the characters in 1BPP 16x16 color mode! unsigned byte dcvideo = *VERA_DC_VIDEO; printf("\nvera dc video = %x\n", dcvideo); - unsigned byte config = vera_get_layer_config(1); + unsigned byte config = vera_layer_get_config(1); printf("\nvera layer 1 config = %x\n", config); - unsigned byte layershown = vera_is_layer_shown(1); + unsigned byte layershown = vera_layer_is_visible(1); printf("vera layer 1 shown = %c\n", layershown); - unsigned byte mapbase = vera_get_layer_mapbase(1); - unsigned byte tilebase = vera_get_layer_tilebase(1); + unsigned byte mapbase = vera_layer_get_mapbase(1); + unsigned byte tilebase = vera_layer_get_tilebase(1); printf("vera layer 1 mapbase = %hhx, tilebase = %hhx\n", mapbase, tilebase); // Wait for a keypress and after clear the line! @@ -62,17 +62,17 @@ void main() { // But first, we also print the layer 0 VERA configuration. // This statement sets the base of the display layer 1 at VRAM address 0x0200 - vera_set_layer_mapbase(0,0x80); // Set the map base to address 0x10000 in VERA VRAM! - vera_set_layer_config(0, vera_get_layer_config(1)); - vera_set_layer_tilebase(0, vera_get_layer_tilebase(1)); + vera_layer_set_mapbase(0,0x80); // Set the map base to address 0x10000 in VERA VRAM! + vera_layer_set_config(0, vera_layer_get_config(1)); + vera_layer_set_tilebase(0, vera_layer_get_tilebase(1)); textcolor(WHITE); - config = vera_get_layer_config(0); - printf("\nvera layer 0 config = %x\n", vera_get_layer_config(0)); - layershown = vera_is_layer_shown(0); + config = vera_layer_get_config(0); + printf("\nvera layer 0 config = %x\n", vera_layer_get_config(0)); + layershown = vera_layer_is_visible(0); printf("vera layer 0 shown = %x\n", layershown); - mapbase = vera_get_layer_mapbase(0); - tilebase = vera_get_layer_tilebase(0); + mapbase = vera_layer_get_mapbase(0); + tilebase = vera_layer_get_tilebase(0); printf("vera layer 0 mapbase = %x, tilebase = %x\n", mapbase, tilebase); // Now we print the layer 0 text on the layer 0! @@ -98,10 +98,10 @@ void main() { clearline(); // Now we activate layer 0. - vera_show_layer(0); + vera_layer_show(0); textcolor(WHITE); bgcolor(BLACK); - printf("vera layer 0 shown = %x. ", vera_is_layer_shown(0)); + printf("vera layer 0 shown = %x. ", vera_layer_is_visible(0)); // Wait for a keypress and after clear the line! textcolor(YELLOW); @@ -110,10 +110,10 @@ void main() { while(!kbhit()); clearline(); - vera_hide_layer(0); + vera_layer_hide(0); textcolor(WHITE); bgcolor(BLACK); - printf("vera layer 0 shown = %x. ", vera_is_layer_shown(0)); + printf("vera layer 0 shown = %x. ", vera_layer_is_visible(0)); // Wait for a keypress and after clear the line! textcolor(YELLOW);