8bitworkshop/presets/coleco/mode2bitmap.c

61 lines
1.6 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
Displays a bitmap using the TMS9928A's Mode 2.
In Mode 2, the screen is horizontally divided into three
256×64 pixel areas, each of which gets its own character
set. By sequentially printing the characters 0 through 255
in all three areas, the program can simulate a graphics mode
where each pixel can be set individually.
The limitation is that every horizontal run of 8 pixels
can only have two colors (a foreground and background color.)
The included Mode 2 bitmap was converted with a web utility:
http://msx.jannone.org/conv/
*/
#include <stdlib.h>
#include <cv.h>
#include <cvu.h>
#include "common.h"
/* link in MODE 2 bitmap data */
//#link "sailboat.s"
extern const unsigned char msx_bitmap[0x3807];
void setup_mode2() {
cvu_vmemset(0, 0, 0x4000);
cv_set_screen_mode(CV_SCREENMODE_BITMAP); // mode 2
cv_set_image_table(IMAGE);
cv_set_character_pattern_t(PATTERN|0x1fff); // AND mask
cv_set_color_table(COLOR|0x1fff); // AND mask
cv_set_sprite_attribute_table(SPRITES);
}
void main() {
// turn off screen
cv_set_screen_active(false);
// setup mode 2 grpahics
setup_mode2();
// copy pattern and color tables
cvu_memtovmemcpy(PATTERN, msx_bitmap+7, 0x1800);
cvu_memtovmemcpy(COLOR, msx_bitmap+7+COLOR, 0x1800);
// set IMAGE table to incrementing values
for (int i=0; i<0x300; i++) {
cvu_voutb(i, IMAGE+i);
}
// clear sprite table
cvu_vmemset(SPRITES, 0, 0x100);
// turn off screen
cv_set_screen_active(true);
while (1) {
//cv_set_character_pattern_t(PATTERN|rand()); // AND mask
//cv_set_color_table(COLOR|rand()); // AND mask
}
}