40static RGBi SYSTEM_PALETTE_ALTERNATE[][4] = {
43 { 0, 0, 0, 0xff, 0,
"BLACK" },
44 { 85, 255, 85, 0xff, 1,
"LIGHT_GREEN" },
45 { 255, 85, 85, 0xff, 2,
"LIGHT_RED" },
46 { 170, 85, 0, 0xff, 3,
"BROWN" },
50 { 0, 0, 0, 0xff, 0,
"BLACK" },
51 { 85, 255, 255, 0xff, 11,
"LIGHT_CYAN" },
52 { 255, 85, 255, 0xff, 2,
"LIGHT_MAGENTA" },
53 { 255, 255, 255, 0xff, 3,
"WHITE" }
57static RGBi * SYSTEM_PALETTE = &SYSTEM_PALETTE_ALTERNATE[0][0];
78static RGBi * commonPalette;
85#define CGA_REG_HZ_TOTAL 0x00
86#define CGA_REG_HZ_DISP 0x01
87#define CGA_REG_HZ_SYNC_POS 0x02
88#define CGA_REG_HZ_SYNC_WIDTH 0x03
89#define CGA_REG_VT_TOTAL 0x04
90#define CGA_REG_VT_TOTAL_ADJUST 0x05
91#define CGA_REG_VT_VERT_TOTAL_ADJUST 0x06
92#define CGA_REG_VT_VERT_SYNC_POSITION 0x07
93#define CGA_REG_INTERLACE_MODE 0x08
94#define CGA_REG_MAX_SCAN_LINE_ADDRESS 0x09
95#define CGA_REG_CURSOR_START 0x0a
96#define CGA_REG_CURSOR_END 0x0b
97#define CGA_REG_START_ADDRESS_H 0x0c
98#define CGA_REG_START_ADDRESS_L 0x0d
99#define CGA_REG_CURSOR_ADDRESS_H 0x0e
100#define CGA_REG_CURSOR_ADDRESS_L 0x0f
101#define CGA_REG_LPEN_ADDRESS_H 0x10
102#define CGA_REG_LPEN_ADDRESS_L 0x11
104#define WRITE_REGISTER( r, v ) \
105 outline1("MOV AH, 0x%2.2x", r ) \
106 outline1("MOV AL, 0x%2.2x", v ) \
107 outline0("CALL WRITECGAREG")
109#define CGA_COLOR_BLUE 0x01
110#define CGA_COLOR_GREEN 0x02
111#define CGA_COLOR_RED 0x04
112#define CGA_COLOR_LIGHT 0x08
113#define CGA_COLOR_LIGHT2 0x10
114#define CGA_COLOR_CSET1 0x00
115#define CGA_COLOR_CSET2 0x20
117#define WRITE_COLOR_SELECT_REGISTER( v ) \
118 outline1("MOV AL, 0x%2.2x", v ) \
119 outline0("CALL WRITECGACOLORSELECTREG")
121#define CGA_MODE_80x25 0x01
122#define CGA_MODE_40x25 0x00
124#define CGA_MODE_GRAPHIC 0x02
125#define CGA_MODE_TEXT 0x00
127#define CGA_MODE_BW 0x04
128#define CGA_MODE_COLOR 0x00
130#define CGA_MODE_ENABLE 0x08
131#define CGA_MODE_DISABLE 0x00
133#define CGA_MODE_HIRES 0x10
134#define CGA_MODE_LORES 0x00
136#define CGA_MODE_BLINK 0x20
137#define CGA_MODE_NOBLINK 0x00
139#define WRITE_MODE_CONTROL_REGISTER( v ) \
140 outline1("MOV AL, 0x%2.2x", v ) \
141 outline0("CALL WRITECGAMODECONTROLREG")
143#define BIOS_VIDEO_MODE( m ) \
144 outline1("MOV AX, 0x%4.4x", m ) \
149 unsigned int minDistance = 0xffff;
153 if ( _color->
alpha < 255 ) {
160 if ( SYSTEM_PALETTE[j].alpha < 255 ) {
170 return &SYSTEM_PALETTE[colorIndex];
208 outline0(
"CALL READCGACOLORSELECTREG" );
210 outline1(
"MOV BL, [%s]", _border_color );
213 outline0(
"CALL WRITECGACOLORSELECTREG" );
229 outline0(
"CALL READCGACOLORSELECTREG" );
231 outline1(
"MOV BL, 0x%2.2x", (
unsigned char)(_background_color&0x0f) );
233 outline0(
"CALL WRITECGACOLORSELECTREG" );
249 outline0(
"CALL READCGACOLORSELECTREG" );
251 outline1(
"MOV BL, [%s]", _background_color );
254 outline0(
"CALL WRITECGACOLORSELECTREG" );
270 outline0(
"CALL READCGACOLORSELECTREG" );
272 outline1(
"MOV BL, [%s]", _background_color );
275 outline0(
"CALL WRITECGACOLORSELECTREG" );
291 outline0(
"CALL READCGACOLORSELECTREG" );
293 outline1(
"MOV [%s], AL", _background_color );
372 switch( _screen_mode->
id ) {
756 int startAddress = 0;
772 outline0(
"CALL CONSOLECALCULATE" );
849 outline1(
"MOV AL, 0x%2.2x", ( *_c & 0xff ) );
856 outline1(
"MOV CX, 0x%4.4x", ( _x & 0xffff ) );
857 outline1(
"MOV DX, 0x%4.4x", ( _y & 0xffff ) );
909 outline0(
"CALL READCGAMODECONTROLREG")
911 outline0(
"CALL WRITECGAMODECONTROLREG")
917 outline0(
"CALL READCGAMODECONTROLREG")
919 outline0(
"CALL WRITECGAMODECONTROLREG")
1014 deploy( clsText, src_hw_cga_cls_text_asm );
1028 if ( _direction > 0 ) {
1032 deploy( vScrollTextUp, src_hw_cga_vscroll_text_up_asm );
1040 deploy( cgavars, src_hw_cga_vars_asm);
1043 outline1(
"MOV CL, [%s]", _text_size);
1080 deploy( clsText, src_hw_cga_cls_text_asm );
1081 deploy( vScrollTextUp, src_hw_cga_vscroll_text_up_asm );
1082 deploy( textEncodedAtText, src_hw_cga_text_at_text_asm );
1096 cpu_call( _environment,
"CGASTARTUP" );
1278 deploy( clsText, src_hw_cga_cls_text_asm );
1286 copperList = copperList->
next;
1322 return 3 + ( ( _width >> 2 ) * _height );
1330static int calculate_images_size(
Environment * _environment,
int _frames,
int _width,
int _height,
int _mode ) {
1342 return 3 + ( 3 + ( ( _width >> 2 ) * _height ) ) * _frames;
1350static int calculate_sequence_size(
Environment * _environment,
int _sequences,
int _frames,
int _width,
int _height,
int _mode ) {
1362 return 3 + ( ( 3 + ( ( _width >> 2 ) * _height ) ) * _frames ) * _sequences;
1378static Variable * cga_image_converter_multicolor_mode_standard(
Environment * _environment,
char * _source,
int _width,
int _height,
int _depth,
int _offset_x,
int _offset_y,
int _frame_width,
int _frame_height,
int _transparent_color,
int _flags ) {
1380 RGBi white = { 0xff, 0xff, 0xff, 0xff };
1381 RGBi black = { 0x00, 0x00, 0x00, 0x00 };
1384 (void)!_transparent_color;
1390 _width = ( ( ( _width - 1 ) / 8 ) - 1 ) * 8;
1392 if ( _frame_width % 8 ) {
1393 _frame_width = ( ( ( _frame_width - 1 ) / 8 ) - 1 ) * 8;
1401 if (paletteColorCount > 4) {
1407 SYSTEM_PALETTE = &SYSTEM_PALETTE_ALTERNATE[_environment->
paletteSelected][0];
1409 commonPalette =
palette_match( palette, paletteColorCount, SYSTEM_PALETTE,
sizeof(SYSTEM_PALETTE_ALTERNATE[0]) /
sizeof(
RGBi) );
1414 adilinepalette(
"CPMS:%d", (
int)(
sizeof(SYSTEM_PALETTE_ALTERNATE[0]) /
sizeof(
RGBi)), SYSTEM_PALETTE );
1424 char * buffer =
malloc ( bufferSize );
1425 memset( buffer, 0, bufferSize );
1428 int image_x, image_y;
1434 int offset, offsetc, bitmask;
1439 *(buffer) = _frame_width;
1440 *(buffer+1) = _frame_height;
1443 _source += ( ( _offset_y * _width ) + _offset_x ) * _depth;
1448 for (image_y = 0; image_y < _frame_height; ++image_y) {
1449 for (image_x = 0; image_x < _frame_width; ++image_x) {
1453 rgb.
green = *(_source + 1);
1454 rgb.
blue = *(_source + 2);
1456 rgb.
alpha = *(_source + 3);
1460 if ( rgb.
alpha == 0 ) {
1466 offset = ( image_y * ( _frame_width >> 2 ) ) + ( image_x >> 2 );
1470 if ( rgb.
alpha < 255 ) {
1473 int minDistance = 9999;
1478 colorIndex = commonPalette[i].index;
1487 bitmask = colorIndex << (6 - ((image_x & 0x3) * 2));
1489 *(buffer + 3 +
offset) |= bitmask;
1495 _source += ( _width - _frame_width ) * _depth;
1515Variable *
cga_image_converter(
Environment * _environment,
char * _data,
int _width,
int _height,
int _depth,
int _offset_x,
int _offset_y,
int _frame_width,
int _frame_height,
int _mode,
int _transparent_color,
int _flags ) {
1529 return cga_image_converter_multicolor_mode_standard( _environment, _data, _width, _height, _depth, _offset_x, _offset_y, _frame_width, _frame_height, _transparent_color, _flags );
1541void cga_blit_image(
Environment * _environment,
char * _sources[],
int _source_count,
char * _blit,
char * _x,
char * _y,
char * _frame,
char * _sequence,
int _frame_size,
int _frame_count,
int _flags ) {
1564 memset( buffer, 0,
size );
1567 *(buffer+1) = _height;
1579 int size = calculate_images_size( _environment, _frames, _width, _height, _mode );
1580 int frameSize =
cga_image_size( _environment, _width, _height, _mode );
1589 memset( buffer, 0,
size );
1591 *(buffer) = _frames;
1592 *(buffer+1) = ( _width & 0xff );
1593 *(buffer+2) = ( _width >> 8 ) & 0xff;
1594 for(
int i=0; i<_frames; ++i ) {
1595 *(buffer+3+(i*frameSize)) = _width;
1596 *(buffer+3+(i*frameSize)+1) = _height;
1610 int size2 = calculate_sequence_size( _environment, _sequences, _frames, _width, _height, _mode );
1611 int size = calculate_images_size( _environment, _frames, _width, _height, _mode );
1612 int frameSize =
cga_image_size( _environment, _width, _height, _mode );
1620 char * buffer =
malloc ( size2 );
1621 memset( buffer, 0, size2 );
1623 *(buffer) = _frames;
1624 *(buffer+1) = _width;
1625 *(buffer+2) = _sequences;
1626 for(
int i=0; i<(_frames * _sequences); ++i ) {
1627 *(buffer+3+(i*frameSize)) = _width;
1628 *(buffer+3+(i*frameSize)+1) = _height;
1633 result->
size = size2;
1640void cga_get_image(
Environment * _environment,
char * _image,
char * _x,
char * _y,
char * _frame,
char * _sequence,
int _frame_size,
int _frame_count,
int _palette ) {
1690void cga_slice_image(
Environment * _environment,
char * _image,
char * _frame,
char * _sequence,
int _frame_size,
int _frame_count,
char * _destination ) {
1706 memcpy( _palette,
palette_match( _palette, paletteColorCount, SYSTEM_PALETTE,
sizeof(SYSTEM_PALETTE) /
sizeof(
RGBi) ), paletteColorCount *
sizeof(
RGBi ) );
1708 int uniquePaletteCount = 0;
1712 return uniquePaletteCount;
void cpu_store_16bit(Environment *_environment, char *_destination, int _value)
CPU 6309: emit code to store 16 bit
void cpu_move_16bit(Environment *_environment, char *_source, char *_destination)
CPU 6309: emit code to move 16 bit
void cpu_call(Environment *_environment, char *_label)
void cpu_store_8bit(Environment *_environment, char *_destination, int _value)
CPU 6309: emit code to store 8 bit
int lastUsedSlotInCommonPalette
Variable * variable_retrieve(Environment *_environment, char *_name)
Variable * variable_retrieve_or_define(Environment *_environment, char *_name, VariableType _type, int _value)
int rgbi_distance(RGBi *_e1, RGBi *_e2)
Calculate the distance between two colors.
void image_converter_asserts_free_height(Environment *_environment, int _width, int _height, int _offset_x, int _offset_y, int *_frame_width, int *_frame_height, int _modulo_x)
int rgbi_equals_rgb(RGBi *_first, RGBi *_second)
Variable * variable_import(Environment *_environment, char *_name, VariableType _type, int _size_or_value)
RGBi * malloc_palette(int _size)
Allocate a palette space.
void variable_global(Environment *_environment, char *_pattern)
ScreenMode * find_screen_mode_by_suggestion(Environment *_environment, int _bitmap, int _width, int _height, int _colors, int _tile_width, int _tile_height)
Variable * variable_temporary(Environment *_environment, VariableType _type, char *_meaning)
Define a temporary variable.
int rgbi_extract_palette(Environment *_environment, unsigned char *_source, int _width, int _height, int _depth, RGBi _palette[], int _palette_size, int _sorted)
Extract the color palette from the given image.
Variable * variable_store(Environment *_environment, char *_destination, unsigned int _value)
Store a direct value to a variable.
RGBi * palette_remove_duplicates(RGBi *_source, int _source_size, int *_unique_size)
Remove duplicates from a palette.
void font_descriptors_init(Environment *_environment, int _embedded_present)
RGBi * palette_match(RGBi *_source, int _source_size, RGBi *_system, int _system_size)
Make a "palette match".
Variable * variable_store_buffer(Environment *_environment, char *_destination, unsigned char *_buffer, int _size, int _at)
void plot(Environment *_environment, char *_x, char *_y, char *_c, int _preserve_color)
void cga_blit_image(Environment *_environment, char *_sources[], int _source_count, char *_blit, char *_x, char *_y, char *_frame, char *_sequence, int _frame_size, int _frame_count, int _flags)
void cga_initialization(Environment *_environment)
void cga_colormap_at(Environment *_environment, char *_address)
void cga_scroll_text(Environment *_environment, int _direction, int _overlap)
Variable * cga_new_sequence(Environment *_environment, int _sequences, int _frames, int _width, int _height, int _mode)
void cga_move_video_memory(Environment *_environment, char *_from, char *_to, char *_size)
void cga_next_raster_at(Environment *_environment, char *_label, char *_positionlo, char *_positionhi)
CGA: emit code to wait for next raster irq at different position
void cga_screen_columns(Environment *_environment, char *_columns)
void cga_border_color(Environment *_environment, char *_border_color)
CGA: emit code to change border color
int cga_screen_mode_enable(Environment *_environment, ScreenMode *_screen_mode)
void cga_vertical_scroll(Environment *_environment, char *_displacement)
void cga_screen_on(Environment *_environment)
void cga_calculate_sequence_frame_offset(Environment *_environment, char *_offset, char *_sequence, char *_frame, int _frame_size, int _frame_count)
void cga_cls(Environment *_environment)
RGBi * CGA_image_nearest_system_color(RGBi *_color)
void cga_sprite_data_set(Environment *_environment, char *_sprite, char *_address)
Variable * cga_collision(Environment *_environment, char *_sprite)
void cga_slice_image_copy(Environment *_environment, char *_image, char *_frame, char *_sequence, int _frame_size, int _frame_count, char *_destination)
void cga_hscroll_line(Environment *_environment, int _direction, int _overlap)
void cga_text(Environment *_environment, char *_text, char *_text_size, int _raw)
void cga_sprite_color(Environment *_environment, char *_sprite, char *_color)
void cga_sprite_compress_vertical(Environment *_environment, char *_sprite)
void cga_screen_rows(Environment *_environment, char *_rows)
void cga_sprite_compress_horizontal(Environment *_environment, char *_sprite)
void cga_background_color_vars(Environment *_environment, char *_index, char *_background_color)
CGA: emit code to change background color
void cga_sprite_expand_vertical(Environment *_environment, char *_sprite)
void cga_raster_at(Environment *_environment, char *_label, char *_positionlo, char *_positionhi)
CGA: emit code to set raster irq
#define WRITE_COLOR_SELECT_REGISTER(v)
void cga_tiles_at(Environment *_environment, char *_address)
void cga_sprite_multicolor(Environment *_environment, char *_sprite)
void cga_bitmap_enable(Environment *_environment, int _width, int _height, int _colors)
void cga_pset_vars(Environment *_environment, char *_x, char *_y, char *_c)
void cga_sprite_common_color(Environment *_environment, char *_index, char *_common_color)
CGA: emit code to change common sprite's color
void cga_get_image(Environment *_environment, char *_image, char *_x, char *_y, char *_frame, char *_sequence, int _frame_size, int _frame_count, int _palette)
void cga_bitmap_disable(Environment *_environment)
Variable * cga_new_image(Environment *_environment, int _width, int _height, int _mode)
void cga_busy_wait(Environment *_environment, char *_timing)
void cga_slice_image(Environment *_environment, char *_image, char *_frame, char *_sequence, int _frame_size, int _frame_count, char *_destination)
void cga_bank_select(Environment *_environment, int _bank)
#define WRITE_MODE_CONTROL_REGISTER(v)
void cga_move_memory_video(Environment *_environment, char *_from, char *_to, char *_size)
void cga_get_height(Environment *_environment, char *_result)
void cga_get_width(Environment *_environment, char *_result)
void cga_back(Environment *_environment)
void cga_bitmap_at(Environment *_environment, char *_address)
int cga_palette_extract(Environment *_environment, char *_data, int _width, int _height, int _depth, int _flags, RGBi *_palette)
void cga_sprite_data_from(Environment *_environment, char *_sprite, char *_image)
#define BIOS_VIDEO_MODE(m)
void cga_sprite_expand_horizontal(Environment *_environment, char *_sprite)
Variable * cga_sprite_converter(Environment *_environment, char *_source, int _width, int _height, int _depth, RGBi *_color, int _slot_x, int _slot_y)
void cga_horizontal_scroll(Environment *_environment, char *_displacement)
void cga_use_tileset(Environment *_environment, char *_tileset)
void cga_cline(Environment *_environment, char *_characters)
void cga_sprite_disable(Environment *_environment, char *_sprite)
void cga_move_tiles(Environment *_environment, char *_tile, char *_x, char *_y)
void cga_sprite_monocolor(Environment *_environment, char *_sprite)
void cga_sprite_priority(Environment *_environment, char *_sprite, char *_priority)
void cga_sprite_at(Environment *_environment, char *_sprite, char *_x, char *_y)
void cga_put_tiles(Environment *_environment, char *_tile, char *_x, char *_y, char *_w, char *_h)
void cga_screen_off(Environment *_environment)
void cga_finalization(Environment *_environment)
void cga_sprite_enable(Environment *_environment, char *_sprite)
void console_calculate_vars(Environment *_environment)
void cga_background_color_get_vars(Environment *_environment, char *_index, char *_background_color)
CGA: emit code to retrieve background color
void cga_tile_at(Environment *_environment, char *_x, char *_y, char *_result)
void cga_textmap_at(Environment *_environment, char *_address)
void cga_next_raster(Environment *_environment)
CGA: emit code to wait for next raster irq
void cga_flip_image(Environment *_environment, Resource *_image, char *_frame, char *_sequence, int _frame_size, int _frame_count, char *_direction)
void cga_background_color(Environment *_environment, int _index, int _background_color)
CGA: emit code to change background color
Variable * cga_image_converter(Environment *_environment, char *_data, int _width, int _height, int _depth, int _offset_x, int _offset_y, int _frame_width, int _frame_height, int _mode, int _transparent_color, int _flags)
Variable * cga_get_raster_line(Environment *_environment)
Variable * cga_new_images(Environment *_environment, int _frames, int _width, int _height, int _mode)
void cga_pget_color_vars(Environment *_environment, char *_x, char *_y, char *_result)
void cga_tilemap_enable(Environment *_environment, int _width, int _height, int _colors, int _tile_width, int _tile_height)
void cga_pset_int(Environment *_environment, int _x, int _y, int *_c)
int cga_image_size(Environment *_environment, int _width, int _height, int _mode)
void cga_hscroll_screen(Environment *_environment, int _direction, int _overlap)
void cga_cls_box(Environment *_environment, char *_x1, char *_y1, char *_w, char *_h)
void cga_put_tile(Environment *_environment, char *_tile, char *_x, char *_y)
void cga_slice_image_extract(Environment *_environment, char *_image, char *_frame, char *_sequence, int _frame_size, int _frame_count, char *_destination)
void cga_wait_vbl(Environment *_environment)
void cga_tiles_get(Environment *_environment, char *_result)
void cga_put_image(Environment *_environment, Resource *_image, char *_x, char *_y, char *_frame, char *_sequence, int _frame_size, int _frame_count, char *_flags)
void cga_colors_vars(Environment *_environment, char *_foreground_color, char *_background_color)
void cga_hit(Environment *_environment, char *_sprite_mask, char *_result)
CGA: emit code to check for collision
void cga_scroll(Environment *_environment, int _dx, int _dy)
void console_calculate(Environment *_environment)
void cga_background_color_semivars(Environment *_environment, int _index, char *_background_color)
CGA: emit code to change background color
void cga_screen(Environment *_environment, char *_x, char *_y, char *_c)
#define TILEMAP_MODE_40x25x2
#define BITMAP_MODE_320x200x4
#define BITMAP_MODE_320x200x2
#define TILEMAP_MODE_80x25x16
#define TILEMAP_MODE_80x25x2
#define TILEMAP_MODE_40x25x16
#define BITMAP_MODE_640x200x2
void console_init(Environment *_environment)
Variable * distance(Environment *_environment, char *_x1, char *_y1, char *_x2, char *_y2)
Return the distance between two (screen) positions.
struct _CopperList * next
VestigialConfig vestigialConfig
unsigned char * valueBuffer
RGBi originalPalette[MAX_PALETTE]
struct _ScreenMode ScreenMode
#define CRITICAL_IMAGE_CONVERTER_TOO_COLORS(f)
struct _Resource Resource
struct _RGBi RGBi
Structure to store color components (red, green and blue).
#define adilineendbitmap()
#define WARNING_SCREEN_MODE(v1)
struct _Variable Variable
Structure of a single variable.
struct _Environment Environment
Structure of compilation environment.
#define adiline3(s, a, b, c)
#define deploy_preferred(s, e)
#define SCREEN_MODE_DEFINE(_id, _bitmap, _width, _height, _colors, _tile_width, _tile_height, _description)
#define CRITICAL_NEW_IMAGES_UNSUPPORTED_MODE(f)
#define WARNING_IMAGE_CONVERTER_UNSUPPORTED_MODE(f)
#define adilinepalette(s, c, p)
#define adilinebeginbitmap(s)
struct _CopperList CopperList
#define CRITICAL_NEW_IMAGE_UNSUPPORTED_MODE(f)