Важная информация

User Tag List

Показано с 1 по 8 из 8

Тема: Программное создание SNA

  1. #1
    Member Аватар для Dwa83
    Регистрация
    31.12.2017
    Адрес
    г. Реж
    Сообщений
    155
    Записей в дневнике
    1
    Спасибо Благодарностей отдано 
    8
    Спасибо Благодарностей получено 
    34
    Поблагодарили
    17 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию Программное создание SNA

    Пытаюсь программно записать снапшот для 48к. При попытке открыть его эмулятором, он открывается, но при вводе любой команды бейсика - происходит сброс, хотя бейсика вообще не должно быть. Должен запуститься помещённый в память код по определённому адресу. Что нужно сделать для корректной работы? Или брать готовый снапшот и пихать в него свой код? Как тогда сделать, чтоб PC указывал на начало программы?

    Вот так делаю пробный SNA, возможно и не всё правильно

    Скрытый текст

    Код:
    	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 - 1) % 256);		//SP
        sna.push_back((start - 1) / 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);
    
        for (unsigned int i = 0; i < compiler->BynaryCodeSize(); i++)
        sna[i+start-16384+27] = compiler->GetCodeByte(i);
    
        //Сохраним снимок
        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();
    [свернуть]

  2. #1
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  3. #2
    Guru
    Регистрация
    27.02.2005
    Адрес
    москва
    Сообщений
    13,773
    Записей в дневнике
    1
    Спасибо Благодарностей отдано 
    143
    Спасибо Благодарностей получено 
    1,179
    Поблагодарили
    775 сообщений
    Mentioned
    18 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Dwa83 Посмотреть сообщение
    Должен запуститься помещённый в память код по определённому адресу.
    если я правильно помню то в SNA.48k адрес старта (продолжения программы) должен лежать на стеке

  4. Этот пользователь поблагодарил goodboy за это полезное сообщение:

    Dwa83 (24.08.2019)

  5. #3
    Member Аватар для Dwa83
    Регистрация
    31.12.2017
    Адрес
    г. Реж
    Сообщений
    155
    Записей в дневнике
    1
    Спасибо Благодарностей отдано 
    8
    Спасибо Благодарностей получено 
    34
    Поблагодарили
    17 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Спасибо, работает

  6. #4
    Guru
    Регистрация
    27.02.2005
    Адрес
    москва
    Сообщений
    13,773
    Записей в дневнике
    1
    Спасибо Благодарностей отдано 
    143
    Спасибо Благодарностей получено 
    1,179
    Поблагодарили
    775 сообщений
    Mentioned
    18 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    это конечно хорошо для самообразования, но мне кажется проще использовать эмуль который позволяет (из своего меню) загрузить бинарник в память.

  7. #5
    Member Аватар для Dwa83
    Регистрация
    31.12.2017
    Адрес
    г. Реж
    Сообщений
    155
    Записей в дневнике
    1
    Спасибо Благодарностей отдано 
    8
    Спасибо Благодарностей получено 
    34
    Поблагодарили
    17 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Да, я так и делаю, но мне задали вопрос про компилятор, будет ли поддержка sna. Вот и заморочился.

    Если вдруг кому понадобится с добавленым сохранением для 128k

    Скрытый текст

    Код:
    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();
    }
    [свернуть]
    Последний раз редактировалось Dwa83; 24.08.2019 в 23:32.

  8. #6
    Veteran Аватар для Bedazzle
    Регистрация
    02.05.2015
    Адрес
    г. Таллин, Эстония
    Сообщений
    1,486
    Спасибо Благодарностей отдано 
    221
    Спасибо Благодарностей получено 
    149
    Поблагодарили
    115 сообщений
    Mentioned
    9 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Dwa83 Посмотреть сообщение
    Если вдруг кому понадобится с добавленым сохранением для 128k
    Может, лучше длинную портянку sna.push_back заменить на массивчик и цикл?

  9. #7
    Member Аватар для Dwa83
    Регистрация
    31.12.2017
    Адрес
    г. Реж
    Сообщений
    155
    Записей в дневнике
    1
    Спасибо Благодарностей отдано 
    8
    Спасибо Благодарностей получено 
    34
    Поблагодарили
    17 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Bedazzle Посмотреть сообщение
    Может, лучше длинную портянку sna.push_back заменить на массивчик и цикл?
    Я просто побайтно разбирался, хотел чтоб область системных переменных побайтно была с комментариями,чтоб ничего не запороть насколько это возможно и чтоб потом можно было легко понять где что.Это на случай активного использования подпрограмм ПЗУ, где используются системные переменные. Потому так и сделал. Некоторые обрасти сразу пачкой заполняются.

  10. #8
    Veteran Аватар для Bedazzle
    Регистрация
    02.05.2015
    Адрес
    г. Таллин, Эстония
    Сообщений
    1,486
    Спасибо Благодарностей отдано 
    221
    Спасибо Благодарностей получено 
    149
    Поблагодарили
    115 сообщений
    Mentioned
    9 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Dwa83 Посмотреть сообщение
    Я просто побайтно разбирался, хотел чтоб область системных переменных побайтно была с комментариями,чтоб ничего не запороть насколько это возможно и чтоб потом можно было легко понять где что.Это на случай активного использования подпрограмм ПЗУ, где используются системные переменные. Потому так и сделал. Некоторые обрасти сразу пачкой заполняются.
    Хозяин - барин. К массиву же комменты можно?

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Ищу Программное обеспечение
    от fedorov.police80 в разделе Вектор
    Ответов: 1
    Последнее: 15.10.2017, 13:23
  2. МС 0511: Программное обеспечение и запуск!
    от =ANDROID= в разделе ДВК, УКНЦ
    Ответов: 9
    Последнее: 26.05.2009, 15:23
  3. Ответов: 7
    Последнее: 16.01.2008, 11:14
  4. ПОМОГИТЕ!! (SNA to AY...)
    от newart в разделе Музыка
    Ответов: 44
    Последнее: 07.10.2005, 22:10
  5. Программное включение турбирования z80
    от moroz1999 в разделе Несортированное железо
    Ответов: 20
    Последнее: 26.04.2005, 13:13

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •