Код:
void SaveSna(AnsiString filename, bool is48)
{
VString sna;
unsigned int start = this->compiler->GetStartAddress();
sna.push_back(63); //регистр I
sna.push_back(0); //HL'
sna.push_back(0);
sna.push_back(0); //DE'
sna.push_back(0);
sna.push_back(32); //BC'
sna.push_back(23);
sna.push_back(68); //AF'
sna.push_back(0);
sna.push_back(168); //HL
sna.push_back(16);
sna.push_back(185); //DE
sna.push_back(92);
sna.push_back(0); //BC
sna.push_back(0);
sna.push_back(58); //IY
sna.push_back(92);
sna.push_back(0); //IX
sna.push_back(0);
sna.push_back(6); //Флаги прерываний
sna.push_back(0); //Регистр регенерации динамической памяти R
sna.push_back(116); //AF
sna.push_back(0);
sna.push_back((start - 2) % 256); //SP
sna.push_back((start - 2) / 256);
sna.push_back(1); //Режим прерываний
sna.push_back(7); //Цвет бордюра
sna.insert(sna.end(), 6144, 0); //Данные экрана
sna.insert(sna.end(), 768, 56); //Данные атрибутов
sna.insert(sna.end(), 256, 0); //Буфер принтера(или если 128, доп область переменных)
//Системные переменные
//KSTATE
sna.push_back(255);
sna.insert(sna.end(), 3, 0);
sna.push_back(255);
sna.insert(sna.end(), 3, 0);
sna.push_back(0); //LAST_K
sna.push_back(35); //REPDEL
sna.push_back(5); //PEPPER
sna.insert(sna.end(), 5, 0); //DEFADD..TVDATA
//STRMS
sna.push_back(1); //-3
sna.push_back(0);
sna.push_back(6); //-2
sna.push_back(0);
sna.push_back(11); //-1
sna.push_back(0);
sna.push_back(1); //0
sna.push_back(0);
sna.push_back(1); //1
sna.push_back(0);
sna.push_back(6); //2
sna.push_back(0);
sna.push_back(16); //3
sna.push_back(0);
sna.insert(sna.end(), 24, 0); //4 и далее
sna.push_back(0); //CHARS
sna.push_back(60);
sna.push_back(64); //RASP
sna.insert(sna.end(), 3, 0); //PIP,ERR NR,FLAGS
sna.push_back(33); //TV FLAG
sna.push_back(80); //ERR SP
sna.push_back(255);
sna.insert(sna.end(), 9, 0); //LIST SP..SUBPPC
sna.push_back(56); //BORDCR
sna.insert(sna.end(), 2, 0); //Е_РРС
sna.push_back(203); //VARS
sna.push_back(92);
sna.insert(sna.end(), 2, 0); //DEST
sna.push_back(182); //CHANS
sna.push_back(92);
sna.push_back(182); //CURCHL
sna.push_back(92);
sna.push_back(203); //PROG
sna.push_back(92);
sna.insert(sna.end(), 2, 0); //NXTLIN
sna.push_back(202); //DATADD
sna.push_back(92);
sna.push_back(204); //E_LINE
sna.push_back(92);
sna.push_back(204); //K_CUR
sna.push_back(92);
sna.insert(sna.end(), 4, 0); //СН_АDD,X_PTR
sna.push_back(206); //WORKSP
sna.push_back(92);
sna.push_back(206); //STKBOT
sna.push_back(92);
sna.push_back(206); //STKEND
sna.push_back(92);
sna.push_back(0); //BREG
sna.push_back(146); //MEM
sna.push_back(92);
sna.push_back(16); //FLAGS2
sna.push_back(2); //DF_SZ
sna.insert(sna.end(), 12, 0); //S_TOP..SEED
sna.push_back(109); //FRAMES
sna.push_back(2);
sna.push_back(0);
sna.push_back(88); //UDG
sna.push_back(255);
sna.insert(sna.end(), 2, 0); //COORDS
sna.push_back(33); //P_POSN
sna.push_back(0); //PR_CC
sna.push_back(91); //NOT_USED
sna.push_back(5); //ЕСНО_Е
sna.push_back(23);
sna.push_back(0); //DF_CC
sna.push_back(64);
sna.push_back(252); //DFCCL
sna.push_back(80);
sna.push_back(33); //S_POSN
sna.push_back(24);
sna.push_back(5); //SPONSL
sna.push_back(23);
sna.push_back(1); //SCR_CT
sna.push_back(56); //ATTR_P
sna.push_back(0); //MASK_P
sna.push_back(56); //ATTR_T
sna.push_back(0); //MASK_T
sna.push_back(0); //P_FLAG
sna.insert(sna.end(), 30, 0); //МЕМВОТ
sna.insert(sna.end(), 2, 0); //NMIADD
//RAMTOP
sna.push_back((start - 1) % 256);
sna.push_back((start - 1) / 256);
sna.insert(sna.end(), 2, 255); //P_RAMT
//Карта микродрайва + CHANS
sna.push_back(244);
sna.push_back(9);
sna.push_back(168);
sna.push_back(16);
sna.push_back(75);
sna.push_back(244);
sna.push_back(9);
sna.push_back(196);
sna.push_back(21);
sna.push_back(83);
sna.push_back(129);
sna.push_back(15);
sna.push_back(196);
sna.push_back(21);
sna.push_back(82);
sna.push_back(244);
sna.push_back(9);
sna.push_back(196);
sna.push_back(21);
sna.push_back(80);
sna.push_back(128);
sna.push_back(128);
sna.push_back(13);
sna.push_back(128);
sna.insert(sna.end(), 41778, 0);
sna[start-16384+27-2] = start % 256;
sna[start-16384+27-1] = start / 256;
for (unsigned int i = 0; i < compiler->BynaryCodeSize(); i++)
sna[i+start-16384+27] = compiler->GetCodeByte(i);
if (!is48)
{
sna.push_back(start % 256); //Регистровая пара PC
sna.push_back(start / 256);
sna.push_back(16); //Состояние порта #7FFD
sna.push_back(0); //ПЗУ TR-DOS (0 - неактивно, 1 - активно)
// Банки 1 3 4 6 7
sna.insert(sna.end(), 16384*5, 0);
}
//Сохраним снимок
ofstream file;
file.open(filename.c_str(), ios::out | ios::binary);
for (unsigned int i = 0; i < sna.size(); i++)
{
file.write(&sna[i], 1);
}
file.close();
}