Top secrets sources NedoPC pentevo

Rev

Rev 799 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed | ?url?

#pragma once

#define MAX_WIDTH 512
#define MAX_WIDTH_P (((MAX_WIDTH)*2)/8) // Ìàêñèìàëüíîå çíàêîìåñò ñ pc-àòðèáóòàìè â îäíîé ñòðîêå
#define MAX_HEIGHT 304
#define MAX_BUFFERS 8

#define MAX_FONT_TABLES 0x62000
static const int sc2lines_width = MAX_WIDTH*2;

CACHE_ALIGNED struct T
{
   struct { // switch palette/color values
      // 8bit
      unsigned sctab8[2][16*0x100];  //4 bits data+pc-attribute -> 4 palette pixels
      unsigned sctab8d[2][4*0x100];  //2 bits data+pc-attribute -> 2 palette pixels (doubled)
      unsigned sctab8q[2*0x100];     //1 bit  data+pc-attribute -> 1 palette pixel (quad)
      // 16bit & 32bit
      unsigned sctab16[2][4*0x100];  //2 bits data+pc-attribute -> 2 pixels
      unsigned sctab16d[2][2*0x100]; //1 bit  data+pc-attribute -> 1 pixel (doubled)
      unsigned sctab32[2][2*0x100];  //1 bit  data+pc-attribute -> 1 pixel (sctab32[0] = {pix_off=paper[0..0xFF], pix_on=ink[0x100..0x1FF]})
   };

   union { // switch chunks/noflic
      unsigned c32tab[0x100][32]; // for chunks 16/32: n_pixels+attr -> chunk color
      struct {
         unsigned sctab16_nf[2][4*0x100];  //2 bits data+pc-attribute -> 2 pixels
         unsigned sctab16d_nf[2][2*0x100]; //1 bit  data+pc-attribute -> 2 pixels
         unsigned sctab32_nf[2][2*0x100];  //1 bit  data+pc-attribute -> 1 pixel
      };
   };

   unsigned char attrtab[0x200]; // pc attribute + bit (pixel off[0..0xFF]/on[0x100..0x1FF]) -> palette index

   CACHE_ALIGNED union {
      unsigned p4bpp8[2][0x100];   // ATM EGA screen. EGA byte -> raw video data: 2 pixels (doubled) (p2p2p1p1)
      unsigned p4bpp16[2][2*0x100];// ATM EGA screen. EGA byte -> raw video data: 2 pixels (doubled)
      unsigned p4bpp32[2][2*0x100];// ATM EGA screen. EGA byte -> raw video data: 2 pixels
   };
   CACHE_ALIGNED union {
      unsigned p4bpp16_nf[2][2*0x100];// ATM EGA screen. EGA byte -> raw video data: 2 pixels (doubled)
      unsigned p4bpp32_nf[2][2*0x100];// ATM EGA screen. EGA byte -> raw video data: 2 pixels
   };
   CACHE_ALIGNED union {
      struct {
         unsigned zctab8[2][16*0x100];  // 4 bits data+zx-attribute -> 4 palette pixels
         unsigned zctab8ad[2][4*0x100]; // 2 bits data+zx-attribute -> 2 palette pixels (doubled)
      };
      struct {
         unsigned zctab16[2][4*0x100];  // 2 bits data+zx-attribute -> 2 pixels
         unsigned zctab16ad[2][2*0x100];// 1 bits data+zx-attribute -> 1 pixel (doubled)
      };
      struct {
         unsigned zctab32[2][2*0x100];  // 1 bit  data+zx-attribute -> 1 pixel
         unsigned zctab32ad[2][2*0x100];// 1 bit  data+zx-attribute -> 1 pixel
      };
   };

   union {
      struct { // 8bpp
         CACHE_ALIGNED unsigned char scale2buf[8][sc2lines_width];    // temp buffer for scale2x,3x filter
         CACHE_ALIGNED unsigned char scale4buf[8][sc2lines_width];    // temp buffer for scale4x filter
      };
      struct // 32 bpp
      {
         CACHE_ALIGNED u32 scale2buf32[8][sc2lines_width];    // temp buffer for scale2x,3x filter
         CACHE_ALIGNED u32 scale4buf32[8][sc2lines_width];    // temp buffer for scale4x filter
      };
      unsigned bs2h[96][129];      // temp buffer for chunks 2x2 flt
      unsigned bs4h[48][65];       // temp buffer for chunks 4x4 flt
      void* font_tables[MAX_FONT_TABLES / sizeof(void*)]; // for anti-text64
   };
   // pre-calculated
   unsigned settab[0x100];         // for chunks 4x4
   unsigned settab2[0x100];        // for chunks 2x2
   unsigned dbl[0x100]; // reverse and double pixels (for scaling renderer)
   unsigned scrtab[256]; // offset to start of line
   unsigned atrtab[256]; // offset to start of attribute line
   unsigned atrtab_hwmc[256]; // attribute for HWMC
   unsigned atm_pal_map[0x100]; // atm palette port value -> palette index
   unsigned profi_pal_map[0x100]; // profi palette port value -> palette index

   struct {   // for AlCo-384
      unsigned char *s, *a;
   } alco[304][8];

   #ifdef MOD_VID_VD
   __m64 vdtab[2][4][256];
   #endif

};

struct videopoint
{
   unsigned next_t; // Òàêò íà÷àëà èëè êîíöà ñòðîêè

   // Èñïîëüçóåòñÿ òîëüêî åñëè òî÷êà - êîíåö ñòðîêè
   unsigned char *screen_ptr;
   union {
      unsigned nextvmode;  // for vmode=1, 0 - ïðèçíàê íà÷àëà ñòðîêè
      unsigned atr_offs;   // for vmode=2
   };
   unsigned scr_offs;
};

struct AtmVideoController
{
    struct ScanLine
    {
        int Offset; // ñìåùåíèå âíóòðè ÀÒÌ âèäåîñòðàíèöû
        int VideoMode; // âèäåîðåæèì äëÿ äàííîé ñêàíëèíèè
    };
    void PrepareFrameATM2(int VideoMode);
    void PrepareFrameATM1(int VideoMode);

    ScanLine Scanlines[256]; // ïàðàìåòðû 56 íàäáîðäåðíûõ ñêàíëèíèé è 200 ðàñòðîâûõ ñêàíëèíèé

    // Åñëè èíêðåìåíòû âèäåîàäðåñà ïðîèñõîäÿò äî ôàêòè÷åñêîé îòðèñîâêè ñêàíëèíèè -
    // òî îíè ïðèìåíÿþòñÿ ê å¸ íà÷àëó è ñîõðàíÿþòñÿ â ñîîòâåòñòâóþùåì ïîëå .offset ýòîé ñêàíëèíèè.
    //
    // Åñëè èíêðåìåíòû âèäåîàäðåñà ïðîèñõîäÿò â ìîìåíò îòðèñîâêè ðàñòðà èëè ñðàçó çà íèì -
    // òî îíè ïðèìåíÿþòñÿ ê ñëåäóþùåé ñêàíëèíèè.
    // ×òîáû âåñòè ó÷¸ò íàêîïëåíèÿ èíêðåìåíòîâ èñïîëüçóþòñÿ ñëåäóþùèå äâà ïîëÿ:
    int CurrentRayLine; // íîìåð òåêóùåé ñêàíëèíèè, íà êîòîðîé ïðîèñõîäèò íàêîïëåíèå èíêðåìåíòîâ
    int IncCounter_InRaster; // ñ÷¸ò÷èê äëÿ íàêîïëåíèÿ +64 èíêðåìåíòîâ, ñäåëàííûõ íà ðàñòðå
    int IncCounter_InBorder; // ñ÷¸ò÷èê äëÿ íàêîïëåíèÿ +64 èíêðåìåíòîâ, ñäåëàííûõ íà áîðäþðå
};

extern AtmVideoController AtmVideoCtrl;

static const int rb2_offs = MAX_HEIGHT*MAX_WIDTH_P;
static const int sizeof_rbuf = rb2_offs*(MAX_BUFFERS+2);
// Áóôåð â êîòîðûé ðèñóåòñÿ êàðòèíêà â zx ôîðìàòå (âêëþ÷àÿ áîðäþð),
// àòðèáóòû êîíâåðòèðóþòñÿ â pc ôîðìàò ÷åðåç colortab
// èç ýòîãî áóôåðà êàðòèíêà äàëåå êîíâåðòèðóåòñÿ â pc ôîðìàò (íàïðèìåð rgb32) äëÿ âûâîäà íà ýêðàí
// Ôîðìàò áóôåðà: pix(8bit), attrs(8bit), ...
// Àòðèáóòû â ôîðìàòå 8x1 (íà êàæäûå 8x1 òî÷åê 1 àòðèáóò)
#ifdef CACHE_ALIGNED
extern CACHE_ALIGNED unsigned char rbuf[sizeof_rbuf];
#else // __declspec(align) not available, force QWORD align with old method
extern unsigned char * const rbuf;
#endif

extern unsigned char * const save_buf;
// map zx attributes to pc attributes
// pc àòðèáóò (8áèò) èìååò ôîðìàò:
// ñòàðøèå 4 áèòà: paper[3..0]  (èñïîëüçóåòñÿ, åñëè pix_off)
// ìëàäøèå 4 áèòà: ink[3..0] (èñïîëüçóåòñÿ, åñëè pix_on)
// ïðè ýòîì óæå ó÷òåíû âñå bright è flash
extern unsigned char colortab[0x100];
// colortab shifted to 8 and 24
extern unsigned colortab_s8[0x100];
extern unsigned colortab_s24[0x100];

extern unsigned *atrtab;
extern T t;

extern PALETTEENTRY pal0[0x100]; // emulator palette
extern unsigned char * const rbuf_s; // frames to mix with noflic and resampler filters
extern unsigned vmode;  // what are drawing: 0-not visible, 1-border, 2-screen
extern videopoint *vcurr;

void set_video();
void apply_video();
void paint_scr(char alt); // alt=0/1 - main/alt screen, alt=2 - ray-painted
void update_screen();
void video_timing_tables();
void pixel_tables();
void video_color_tables();
void video_permanent_tables();
void init_frame();
void flush_frame();
void load_spec_colors();