mirror of https://github.com/trudnai/Steve2.git
156 lines
3.9 KiB
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)
|
|
}
|
|
|
|
|
|
|