Steve2/src/dev/video/hires.c

156 lines
3.9 KiB
C

//
// hires.c
// A2Mac
//
// Created by Tamas Rudnai on 5/28/21.
// Copyright © 2021 GameAlloy. All rights reserved.
//
#include "hires.h"
#include "mmio.h"
static const uint16_t PageSize = 0x2000;
static const uint16_t Page1Addr = 0x2000;
static const uint16_t Page2Addr = 0x4000;
//static const uint16_t PixelWidth = 280;
//static const uint16_t PixelMixedHeight = 160;
static const uint16_t PixelHeight = 192;
static const uint16_t MixedHeight = 160;
//static const uint8_t MixedTextHeight = 4;
static const uint8_t blockRows = 24;
static const uint8_t blockCols = 40;
//static const uint8_t blockWidth = PixelWidth / blockCols;
static const uint8_t blockHeight = PixelHeight / blockRows;
const uint8_t* HiResRawPointer = Apple2_64K_RAM + Page1Addr;
const uint8_t* HiResBuffer1 = Apple2_64K_MEM + Page1Addr;
const uint8_t* HiResBuffer2 = Apple2_64K_MEM + Page2Addr;
uint8_t* HiResBufferPointer = Apple2_64K_MEM + Page1Addr;
// holds the starting addresses for each lines minus the screen page starting address
uint16_t HiResLineAddrTbl[PixelHeight];
double pixelTrail = 2.0;
typedef enum {
_B = 0,
_G = 1,
_R = 2,
_A = 3,
} RGBA_t;
// HiRes Colors for the SRGB color space
const uint32_t color_black = 0x00000000;
const uint32_t color_white = 0xFFEEEEEE;
const uint32_t color_purple = 0xFFDD55FF;
const uint32_t color_green = 0xFF2BD84A;
const uint32_t color_blue = 0xFF5599FF;
const uint32_t color_orange = 0xFFFF6302;
// for debugging only:
const uint32_t color_turquis = 0xFF11BBBB;
const uint32_t color_yellow = 0xFFBBBB11;
// default is green
const uint32_t color_mono = 0xFF2BD84A;
//static const int ScreenBitmapSize = (PixelWidth * PixelHeight * 4);
const uint8_t color_R = 2;
const uint8_t color_G = 1;
const uint8_t color_B = 0;
const uint8_t color_A = 3;
//static uint32_t pixelsSRGB[blockRows * blockCols];
uint32_t * pixelsSRGB;
static uint8_t _blockChanged[blockRows * blockCols];
uint8_t * blockChanged = _blockChanged;
static uint8_t _shadowScreen[PageSize];
uint8_t * shadowScreen = _shadowScreen;
int was = 0;
void initHiResLineAddresses(void) {
int i = 0;
for( int x = 0; x <= 0x50; x += 0x28 ) {
for( int y = 0; y <= 0x380; y += 0x80 ) {
for( int z = 0; z <= 0x1C00; z += 0x400 ) {
HiResLineAddrTbl[i++] = x + y + z;
}
}
}
}
void init(void) {
initHiResLineAddresses();
}
void hires_clearChanges(void) {
memset(_blockChanged, 0, sizeof(_blockChanged));
}
void hires_renderMono() {
int height = PixelHeight;
// do not even render it...
if( videoMode.text == 1 ) {
return;
}
else {
if( videoMode.mixed == 1 ) {
height = MixedHeight;
}
if( MEMcfg.txt_page_2 == 1 ) {
HiResBufferPointer = (uint8_t*)HiResBuffer2;
}
else {
HiResBufferPointer = (uint8_t*)HiResBuffer1;
}
}
int pixelAddr = 0;
hires_clearChanges();
for( int y = 0; y < height; y++ ) {
int lineAddr = HiResLineAddrTbl[y];
int blockVertIdx = y / blockHeight * blockCols;
for( int blockHorIdx = 0; blockHorIdx < blockCols; blockHorIdx++ ) {
int block = HiResBufferPointer[ lineAddr + blockHorIdx ];
int screenIdx = y * blockCols + blockHorIdx;
// get all changed blocks
_blockChanged[ blockVertIdx + blockHorIdx ] |= _shadowScreen[ screenIdx ] != block;
_shadowScreen[ screenIdx ] = block;
for( int bit = 0; bit <= 6; bit++ ) {
uint8_t bitMask = 1 << bit;
if ( (block & bitMask) ) {
pixelsSRGB[pixelAddr] = color_mono;
}
else {
pixelsSRGB[pixelAddr] = color_black;
}
pixelAddr++;
}
}
}
// refreshChanged(blockSize: 1)
}