M5Cardputer-C64-Emulator/src/t-hmi-c64/VIC.h
2025-02-15 12:45:04 +01:00

119 lines
5.2 KiB
C++

/*
Copyright (C) 2024 iEle <melephas@gmail.com>
Copyright (C) 2024 retroelec <retroelec42@gmail.com>
This program is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
Free Software Foundation; either version 3 of the License, or (at your
option) any later version.
This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
For the complete text of the GNU General Public License see
http://www.gnu.org/licenses/.
*/
#pragma once
#include <cstdint>
#include "M5Cardputer.h"
class VIC
{
private:
uint8_t *ram;
M5Canvas canvas;
// uint8_t *bitmap;
uint8_t spritespritecoll[320];
bool spritedatacoll[320];
uint8_t startbyte;
bool only38cols;
inline void drawByteStdData(uint8_t data, uint16_t &idx, uint16_t &xp,
uint16_t col, uint16_t bgcol, uint8_t dx)
__attribute__((always_inline));
inline void drawByteMCData(uint8_t data, uint16_t &idx, uint16_t &xp,
uint16_t *tftColArr, bool *collArr, uint8_t dx)
__attribute__((always_inline));
void drawblankline(uint8_t line);
inline bool shiftDyDx(uint8_t line, int8_t dy, uint8_t dx, uint16_t bgcol,
uint16_t &idx) __attribute__((always_inline));
inline void drawOnly38ColsFrame(uint16_t tmpidx)
__attribute__((always_inline));
inline void drawStdCharModeInt(uint8_t *screenMap, uint16_t bgcol,
uint8_t row, uint8_t dx, uint16_t &xp,
uint16_t idxmap, uint16_t &idx)
__attribute__((always_inline));
void drawStdCharMode(uint8_t *screenMap, uint8_t bgColor, uint8_t line,
int8_t dy, uint8_t dx, uint16_t idx);
inline void drawExtBGColCharModeInt(uint8_t *screenMap, uint8_t *bgColArr,
uint8_t row, uint8_t dx, uint16_t &xp,
uint16_t idxmap, uint16_t &idx)
__attribute__((always_inline));
void drawExtBGColCharMode(uint8_t *screenMap, uint8_t *bgColArr, uint8_t line,
int8_t dy, uint8_t dx, uint16_t idx);
inline void drawMCCharModeInt(uint8_t *screenMap, uint16_t bgcol,
uint16_t *tftColArr, uint8_t row, uint8_t dx,
uint16_t &xp, uint16_t idxmap, uint16_t &idx)
__attribute__((always_inline));
void drawMCCharMode(uint8_t *screenMap, uint8_t bgColor1, uint8_t bgColor2,
uint8_t bgColor3, uint8_t line, int8_t dy, uint8_t dx,
uint16_t idx);
inline void drawMCBitmapModeInt(uint8_t *multicolorBitmap, uint8_t *colorMap1,
uint16_t *tftColArr, uint16_t cidx,
uint16_t mcidx, uint8_t row, uint8_t dx,
uint16_t &xp, uint16_t &idx)
__attribute__((always_inline));
void drawMCBitmapMode(uint8_t *multicolorBitmap, uint8_t *colorMap1,
uint8_t backgroundColor, uint8_t line, int8_t dy,
uint8_t dx, uint16_t idx);
void drawStdBitmapModeInt(uint8_t *hiresBitmap, uint8_t *colorMap,
uint16_t hiidx, uint16_t &colidx, uint8_t row,
uint8_t dx, uint16_t &xp, uint16_t &idx);
void drawStdBitmapMode(uint8_t *hiresBitmap, uint8_t *colorMap, uint8_t line,
int8_t dy, uint8_t dx, uint16_t idx);
void drawSpriteDataSC(uint8_t bitnr, int16_t xpos, uint8_t ypos,
uint8_t *data, uint8_t color);
void drawSpriteDataSCDS(uint8_t bitnr, int16_t xpos, uint8_t ypos,
uint8_t *data, uint8_t color);
inline void drawSpriteDataMC2Bits(uint8_t idxc, uint16_t &idx, int16_t &xpos,
uint8_t bitnr, uint16_t *tftcolor)
__attribute__((always_inline));
void drawSpriteDataMC(uint8_t bitnr, int16_t xpos, uint8_t ypos,
uint8_t *data, uint8_t color10, uint8_t color01,
uint8_t color11);
void drawSpriteDataMCDS(uint8_t bitnr, int16_t xpos, uint8_t ypos,
uint8_t *data, uint8_t color10, uint8_t color01,
uint8_t color11);
void drawSprites(uint8_t line);
// inline void checkFrameColor() __attribute__((always_inline));
public:
// profiling info
uint8_t cntRefreshs;
uint8_t *colormap;
uint8_t *charset;
uint8_t *chrom;
uint8_t vicreg[0x40];
uint8_t latchd011;
uint8_t latchd012;
uint16_t vicmem;
uint16_t bitmapstart;
uint16_t screenmemstart;
uint16_t rasterline;
uint8_t syncd020;
bool screenblank;
VIC(){};
~VIC() { canvas.deleteSprite(); };
void initVarsAndRegs();
void init(uint8_t *ram, uint8_t *charrom);
void refresh(bool refreshframecolor);
uint8_t nextRasterline();
void drawRasterline();
};