LS7-Emulator/src/video.c
2024-11-28 23:16:06 +01:00

118 lines
2.9 KiB
C

#include <stdlib.h>
#include <stdint.h>
#include <SFML/System.h>
#include <SFML/Graphics.h>
#include <SFML/Window.h>
/* Public Variables */
extern sfVertexArray *renderArray;
int8_t videoModified;
int8_t videoMode;
/* Private Variables */
static uint8_t video_row;
static uint8_t video_value;
static uint8_t video_colorValue;
static sfColor video_displayColor;
static sfColor video_foreColor;
static sfColor video_backColor;
const sfColor video_upperPalette = (sfColor){ 64, 64, 64 };
static sfColor *video_colorIndex[16] = {
&sfBlack, // 0x0
&sfRed, // 0x1
&sfGreen, // 0x2
&sfYellow, // 0x3
&sfBlue, // 0x4
&sfMagenta, // 0x5
&sfCyan, // 0x6
&(sfColor){ 96, 96, 96 }, // 0x7
&(sfColor){ 162, 162, 162 },// 0x8
&sfRed, // 0x9
&sfGreen, // 0xA
&sfYellow, // 0xB
&sfBlue, // 0xC
&sfMagenta, // 0xD
&sfCyan, // 0xE
&sfWhite, // 0xF
};
static uint8_t video_memory[0x8000]; // Empty Memory with 32k space
void initVideo(){
renderArray = sfVertexArray_create();
sfVertexArray_setPrimitiveType(renderArray, sfQuads);
videoModified = 1;
videoMode = 0;
for (int i = 0x8; i < 0xF; i++){
//*video_colorIndex[i] = sfColor_add(*video_colorIndex[i], video_upperPalette);
}
for (int i = 0; i < 0x8000; i++){
video_memory[i] = rand();
}
}
void updateVideo(){
sfVertexArray_clear(renderArray);
sfVertexArray_setPrimitiveType(renderArray, sfQuads);
videoModified = 0;
for (int y = 0; y < 256; y++){
video_row = (int8_t)(y & 0x7);
for (int x = 0; x < 48; x++){
if (videoMode == 1){
/*
* Text Address Format
* 0bRRR1111AAAAAAAA
*
* R = row pins
* A = address
*/
// Get text index value
video_value = video_memory[(((y & 0xF8) >> 3) << 7) | x];
// Index the value in font location
video_value = video_memory[(video_row | 0b1111000) + (video_value * 128)];
video_colorValue = video_memory[(((y & 0xF8) >> 3) << 7) + (x | 0x40)];
}
else {
video_value = video_memory[(y * 128) + x];
video_colorValue = video_memory[(y * 128) + (x | 0x40)];
}
// Snipping out the upper 8 colors
//video_colorValue &= 0x77;
video_foreColor = *video_colorIndex[(video_colorValue & 0x0F)];
video_backColor = *video_colorIndex[((video_colorValue & 0xF0) >> 4)];
for (int i = 0; i < 8; i++){
if (video_value & (128 >> i)){
video_displayColor = video_foreColor;
} else {
video_displayColor = video_backColor;
}
sfVertexArray_append(renderArray, (sfVertex){ (sfVector2f){ (x * 8) + i, y }, video_displayColor});
sfVertexArray_append(renderArray, (sfVertex){ (sfVector2f){ (x * 8) + i + 1, y }, video_displayColor});
sfVertexArray_append(renderArray, (sfVertex){ (sfVector2f){ (x * 8) + i + 1, y + 1 }, video_displayColor});
sfVertexArray_append(renderArray, (sfVertex){ (sfVector2f){ (x * 8) + i, y + 1 }, video_displayColor});
}
}
}
}