Собственно было бы не плохо сделать тему прилепленной
ну и первый глупый вопрос собственно от меня
какой режим IO портов AY-ка нужно выставлять по дефолту?
для большей совместимости со всякими там девайсами притуленными к AY
на ввод?
или на вывод?
Вид для печати
Собственно было бы не плохо сделать тему прилепленной
ну и первый глупый вопрос собственно от меня
какой режим IO портов AY-ка нужно выставлять по дефолту?
для большей совместимости со всякими там девайсами притуленными к AY
на ввод?
или на вывод?
Какова бы ни была аппаратура, она обычно разрабатывалась так, чтобы при сбросе системы не мешать работе бейсика, TR-DOS и прочего ПО, которое об этой аппаратуре ничего не знает. Ведь специальное ПО для инициализации AY и работы с этой аппаратурой можно было запустить только после пуска бейсика и TR-DOS. И, если бы автор схемы нарушил условие её работоспособности при сбросе - то он бы быстро это заметил и поправил.
Соответственно, после сброса инициализировать ничего не надо, а если инициализировать - то в тот же режим, который устанавливается при сбросе AY.
Подскажите, пожалуйста, какой утилитой на ZX снять образ дискетки со сбойными секторами и порушенной структурой файлов? Считать как есть, пропуская битые секторы, желательно в TRD, чтобы потом поковырять на PC. Хотел с помощью WDC, но он ругается на диск.
Это смотря какой ZX. Вот обучалово на Пентево: https://www.youtube.com/watch?v=YkA3jEqLNb8
А еще есть Floppy Disk Reaper.
Если снимать образ на PC, то вариантов побольше. Из свежайшего есть прекрансный Spectrum Archive Reader.
Кто может подсказать? Проблема вот в чём: если при написании проги не юзать страницы в коде, то у меня компиль создаёт SNA для 48. И всё бы ничего, но страницы больше не переключаются, как будто уже включена "защёлка". Приходится писать костыль типа
PAGE 1
DEFB 0
чтобы сразу создавался снапшот для 128, где состояние порта #7ffd явно указывается.
Вроде бы в буфере принтера при режиме 128 используется дополнительная системная переменная - копия порта, но там значение нормальное %00000000 (подключена страница 0, видеостраница - 5 банк, пзу - бейсик 128, и защёлка в нуле). Чего я не учёл при сохранении SNA?
А может это особенности эмуля, он ест 48 сна и автоматом выбирает 48 модель.
Я об этом не подумал, щас попробую с другим(Звучит как: Мой молодой человек такой-то и такой-то.. ааа.. щас попробую с другим))))
- - - Добавлено - - -
Нет, на эмузвине то же самое, что-то не так с форматом sna(щас попробую 48)
В сна вроде прописывается модель, тогда поведение эмулей логично в принципе.
Нет попробовл разно
- - - Добавлено - - -Код:void ZX_SNA_Saver::FillStandartRAM(ByteVector & ram, unsigned int start)
{
ram.insert(ram.end(), 6144, 0); //Данные экрана
ram.insert(ram.end(), 768, 56); //Данные атрибутов
//23296
//ram.insert(ram.end(), 256, 0); //Буфер принтера(или если 128, доп область переменных)
ram.insert(ram.end(), 89, 0); //Буфер принтера(или если 128, доп область переменных)
ram.push_back(16); // копия порта
ram.insert(ram.end(), 166, 0); //Буфер принтера(или если 128, доп область переменных)
//23388 = копия порта
//Системные переменные
Где в 48 формате это прописывается?
гдето в
mas.push_back(6); //Флаги прерываний
mas.push_back(0); //Регистр регенерации динамической памяти R?
Кто-то ведь работал плотно со снапшотами
- - - Добавлено - - -Код:void ZX_SNA_Saver::FillHeader(ByteVector & mas, unsigned int start)
{
//Заполним заголовок sna(27 байт)
mas.push_back(63); //регистр I
mas.push_back(0); //HL'
mas.push_back(0);
mas.push_back(0); //DE'
mas.push_back(0);
mas.push_back(32); //BC'
mas.push_back(23);
mas.push_back(68); //AF'
mas.push_back(0);
mas.push_back(168); //HL
mas.push_back(16);
mas.push_back(185); //DE
mas.push_back(92);
mas.push_back(0); //BC
mas.push_back(0);
mas.push_back(58); //IY
mas.push_back(92);
mas.push_back(0); //IX
mas.push_back(0);
mas.push_back(6); //Флаги прерываний
mas.push_back(0); //Регистр регенерации динамической памяти R
mas.push_back(116); //AF
mas.push_back(0);
mas.push_back((start - 2) % 256); //SP
mas.push_back((start - 2) / 256);
mas.push_back(1); //Режим прерываний
mas.push_back(7); //Цвет бордюра
}
В сна 128 порт задаётся явно, в 48 хз где, в этом и вопрос
- - - Добавлено - - -
Или 48к снапшоты изначально с заглушкой доп памяти?
- - - Добавлено - - -
Может в режиме 128 в области доп переменных ещё что-то нужно, а у меня там нули?
- - - Добавлено - - -
Пока не критично конечно, но надо исправлять
- - - Добавлено - - -
Никто не знает?(что сомнительно) или реально эмули видя 48 заглушают память? так не должнож быть
- - - Добавлено - - -
Стопудняк проблема в одном бите, но я не знаю в каком
можешь попробовать создать нужный тебе SNA файл - первые 27 + 49152 байта как из 48-го снапшота - затем добавляешь 2 байта PC, 1 байт Состояние порта #7FFD и 1 байт Выбор ПЗУ TR-DOS (0 - неактивно, 1 - активно)
итого должен получиться файл по размеру обычного SNA-48 плюс 4 байта.
вот
А зачем они это сделали? понимаю, что вопрос к разработчикам..
- - - Добавлено - - -
Но ведь загружаяе 48(не имея доп банок памяти в файле), можно ведь оставить заглушку(бит) в нуле! это у всех эмулей?
- - - Добавлено - - -
Что-то тут не так
- - - Добавлено - - -
или функция прерывания что-то делает стандартная? дак тем более у меня 128 бэйсик пзу тогда тоже делает... нипаняяяятна
- - - Добавлено - - -
Я подозреваю, что где-то я в сохранении сна косяк допустил
- - - Добавлено - - -
Это конечно не критично, но даже сна48 должен сохранять возможность переключения банок, даже если это ни к чему не приведёт
- - - Добавлено - - -
Это конечно не критично, но даже сна48 должен сохранять возможность переключения банок, даже если это ни к чему не приведёт
Оно так всё и есть, по размеру всё сохраняется... ну сам вот посмотри
Код:#include <ZX_SNA_Saver.h>
#include <fstream.h>
bool ZX_SNA_Saver::SaveSna(GensCompiler & compiler, AnsiString filename)
{
ByteVector ram;
unsigned int start = compiler.GetStartAddress();
FillStandartRAM(ram, start);
//Определим 128k или 48k
bool is128 = false;
for (int i = 0; i < 8; i++)
if (i != 2) is128 |= compiler.BynaryCodeSize(i) > 0;
//банк 5
if (compiler.BynaryCodeSize(5) > 0)
{
for (unsigned int i = 0; i < compiler.BynaryCodeSize(5); i++)
{
if (i < 0xC000)
ram[i] = compiler.GetCodeByte(5,i);
else
{
ShowMessage("Внимание! Данные в банке 5 вышли за пределы #FFFF и будут обрезаны.");
break;
}
}
if (compiler.BynaryCodeSize(5) + 0x4000 > start - 2)
ShowMessage("Внимание! Начало основного кода перекрывает данные в банке 5.");
}
//банк 2
if (start <= 0x4000)
ShowMessage("Внимание! Область стека перекрывает ПЗУ.");
for (unsigned int i = 0; i < compiler.BynaryCodeSize(2); i++)
{
if (start + i <= 0xFFFF)
ram[start + i - 0x4000] = compiler.GetCodeByte(2,i);
else
{
ShowMessage("Внимание! Основной код вышел за пределы #FFFF и будет обрезан.");
break;
}
}
//банк 0
if (compiler.BynaryCodeSize(0) > 0)
{
if (start + compiler.BynaryCodeSize(2) >= 0xC000)
ShowMessage("Внимание! Данные в банке 0 перекрывают основной код.");
for (unsigned int i = 0; i < compiler.BynaryCodeSize(0); i++)
{
if (i < 0x4000)
ram[i + 0xC000 - 0x4000] = compiler.GetCodeByte(0,i);
else
{
ShowMessage("Внимание! Данные в банке 0 вышли за пределы #FFFF и будет обрезан.");
break;
}
}
}
ByteVector sna;
FillHeader(sna, start);
if (!is128)
{
//Запишем в стек адрес старта
ram[start - 2 - 16384] = start % 256;
ram[start - 1 - 16384] = start / 256;
}
for (int i = 0; i < 0xC000; i++) sna.push_back(ram[i]);
//Если 128k
if (is128)
{
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
this->Addpage(compiler, sna, 1);
this->Addpage(compiler, sna, 3);
this->Addpage(compiler, sna, 4);
this->Addpage(compiler, sna, 6);
this->Addpage(compiler, sna, 7);
}
//Сохраним снимок
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();
return true;
}
void ZX_SNA_Saver::FillHeader(ByteVector & mas, unsigned int start)
{
//Заполним заголовок sna(27 байт)
mas.push_back(63); //регистр I
mas.push_back(0); //HL'
mas.push_back(0);
mas.push_back(0); //DE'
mas.push_back(0);
mas.push_back(32); //BC'
mas.push_back(23);
mas.push_back(68); //AF'
mas.push_back(0);
mas.push_back(168); //HL
mas.push_back(16);
mas.push_back(185); //DE
mas.push_back(92);
mas.push_back(0); //BC
mas.push_back(0);
mas.push_back(58); //IY
mas.push_back(92);
mas.push_back(0); //IX
mas.push_back(0);
mas.push_back(6); //Флаги прерываний
mas.push_back(0); //Регистр регенерации динамической памяти R
mas.push_back(116); //AF
mas.push_back(0);
mas.push_back((start - 2) % 256); //SP
mas.push_back((start - 2) / 256);
mas.push_back(1); //Режим прерываний
mas.push_back(7); //Цвет бордюра
}
void ZX_SNA_Saver::FillStandartRAM(ByteVector & ram, unsigned int start)
{
ram.insert(ram.end(), 6144, 0); //Данные экрана
ram.insert(ram.end(), 768, 56); //Данные атрибутов
//23296
//ram.insert(ram.end(), 256, 0); //Буфер принтера(или если 128, доп область переменных)
ram.insert(ram.end(), 89, 0); //Буфер принтера(или если 128, доп область переменных)
ram.push_back(16); // копия порта
ram.insert(ram.end(), 166, 0); //Буфер принтера(или если 128, доп область переменных)
//23388 = копия порта
//Системные переменные
//KSTATE
ram.push_back(255);
ram.insert(ram.end(), 3, 0);
ram.push_back(255);
ram.insert(ram.end(), 3, 0);
ram.push_back(0); //LAST_K
ram.push_back(35); //REPDEL
ram.push_back(5); //PEPPER
ram.insert(ram.end(), 5, 0); //DEFADD..TVDATA
//STRMS
ram.push_back(1); //-3
ram.push_back(0);
ram.push_back(6); //-2
ram.push_back(0);
ram.push_back(11); //-1
ram.push_back(0);
ram.push_back(1); //0
ram.push_back(0);
ram.push_back(1); //1
ram.push_back(0);
ram.push_back(6); //2
ram.push_back(0);
ram.push_back(16); //3
ram.push_back(0);
ram.insert(ram.end(), 24, 0); //4 и далее
ram.push_back(0); //CHARS
ram.push_back(60);
ram.push_back(64); //RASP
ram.insert(ram.end(), 3, 0); //PIP,ERR NR,FLAGS
ram.push_back(33); //TV FLAG
ram.push_back(80); //ERR SP
ram.push_back(255);
ram.insert(ram.end(), 9, 0); //LIST SP..SUBPPC
ram.push_back(56); //BORDCR
ram.insert(ram.end(), 2, 0); //Е_РРС
ram.push_back(203); //VARS
ram.push_back(92);
ram.insert(ram.end(), 2, 0); //DEST
ram.push_back(182); //CHANS
ram.push_back(92);
ram.push_back(182); //CURCHL
ram.push_back(92);
ram.push_back(203); //PROG
ram.push_back(92);
ram.insert(ram.end(), 2, 0); //NXTLIN
ram.push_back(202); //DATADD
ram.push_back(92);
ram.push_back(204); //E_LINE
ram.push_back(92);
ram.push_back(204); //K_CUR
ram.push_back(92);
ram.insert(ram.end(), 4, 0); //СН_АDD,X_PTR
ram.push_back(206); //WORKSP
ram.push_back(92);
ram.push_back(206); //STKBOT
ram.push_back(92);
ram.push_back(206); //STKEND
ram.push_back(92);
ram.push_back(0); //BREG
ram.push_back(146); //MEM
ram.push_back(92);
ram.push_back(16); //FLAGS2
ram.push_back(2); //DF_SZ
ram.insert(ram.end(), 12, 0); //S_TOP..SEED
ram.push_back(109); //FRAMES
ram.push_back(2);
ram.push_back(0);
ram.push_back(88); //UDG
ram.push_back(255);
ram.insert(ram.end(), 2, 0); //COORDS
ram.push_back(33); //P_POSN
ram.push_back(0); //PR_CC
ram.push_back(91); //NOT_USED
ram.push_back(5); //ЕСНО_Е
ram.push_back(23);
ram.push_back(0); //DF_CC
ram.push_back(64);
ram.push_back(252); //DFCCL
ram.push_back(80);
ram.push_back(33); //S_POSN
ram.push_back(24);
ram.push_back(5); //SPONSL
ram.push_back(23);
ram.push_back(1); //SCR_CT
ram.push_back(56); //ATTR_P
ram.push_back(0); //MASK_P
ram.push_back(56); //ATTR_T
ram.push_back(0); //MASK_T
ram.push_back(0); //P_FLAG
ram.insert(ram.end(), 30, 0); //МЕМВОТ
ram.insert(ram.end(), 2, 0); //NMIADD
//RAMTOP
ram.push_back((start - 1) % 256);
ram.push_back((start - 1) / 256);
ram.insert(ram.end(), 2, 255); //P_RAMT
//Карта микродрайва + CHANS
ram.push_back(244);
ram.push_back(9);
ram.push_back(168);
ram.push_back(16);
ram.push_back(75);
ram.push_back(244);
ram.push_back(9);
ram.push_back(196);
ram.push_back(21);
ram.push_back(83);
ram.push_back(129);
ram.push_back(15);
ram.push_back(196);
ram.push_back(21);
ram.push_back(82);
ram.push_back(244);
ram.push_back(9);
ram.push_back(196);
ram.push_back(21);
ram.push_back(80);
ram.push_back(128);
ram.push_back(128);
ram.push_back(13);
ram.push_back(128);
//заполним нулями
ram.insert(ram.end(), 41778, 0);
}
void ZX_SNA_Saver::Addpage(GensCompiler & compiler, ByteVector & sna, int page)
{
if (compiler.BynaryCodeSize(page) > 16384 )
ShowMessage("Внимание! Код в банке "+IntToStr(page)+" привысил размер #4000 и будет обрезан.");
for (unsigned int i = 0; i < 16384; i++)
{
if (i < compiler.BynaryCodeSize(page))
sna.push_back(compiler.GetCodeByte(page,i));
else
sna.push_back(0);
}
}
Но ведь эмули со временем начали понимать формат 128. Заглушку оставили(бит порта)?
- - - Добавлено - - -
или на "старое"было плевать? А можно ведь сделать игру, которая вмещается в 48, но использует 128 формат(переключение экранов)
- - - Добавлено - - -
Вообще я жду ответ на вопрос: Эмуляторы , видя 48 снапшот, ставят бит заглушки?
Не. Они переключаются на 48 модель.
Ну, значит костыль, в ненужной банке, вопрос исчерпан(нверное)
А вообще хорошо бы было, если бы создатели эмулей, при приёме в своё лоно 48к, не ставили заглушку
Хрессу вот ваще никогда машину не переключает. Значит все-таки разные эмуляторы бывают, а не только спекулятор :)
Просто вот код
Скрытый текст
Код:org 32768
di
ld a,%00010111
call SET_PAGE_MODE_A
call INIT_TABLE
;--------
ld ix,LINE_TABLE
ld b,24
fs push bc
call PRINT_32_SPRITE
ld de,lt_size
add ix,de
pop bc
djnz fs
;--------
strt
col ld bc,384
right push bc
call SWAP_SCREEN
call SCROLL2
ld ix,LINE_TABLE
ld b,24
nxt_ln push bc
call PRINT_NEXT_SPRITE
pop bc
ld de,lt_size
add ix,de
djnz nxt_ln
call DRAW
pop bc
dec bc
ld a,b
or c
jr nz,right
call INIT_TABLE
ld hl,416
ld (col+1),hl
jr strt
mar_y defb 143
old_y defb 143
mar_vel defw #1e00
vel_dn defb #0f
;----------------------------
update
ld hl,(mar_vel)
ld de,#c0
and a
sbc hl,de
ld a,h
or l
jr nz,upd1
ld hl,#1e00
upd1 ld (mar_vel),hl
ld a,(mar_vel+1)
ld b,a
ld a,(vel_dn)
ld d,a
ld a,(mar_y)
ld (old_y),a
add a,d
sub b
ld (mar_y),a
ret
;---------------------------------
;Первая инициализация таблицы: экранныe адресa, адреса начала строк уровня
INIT_TABLE
ld ix,LINE_TABLE
ld b,0
nxt_line
push bc
ld de,LEVEL
call ADDR_AFTER255
ld (IX+line_ptr),e
ld (IX+line_ptr+1),d
call NEXT_LINE_PTR
pop bc
call SCR_ADDR
ld (IX+print_addr),l
ld (IX+print_addr+1),h
ld (IX+attr_addr),e
ld (IX+attr_addr+1),d
ld de,lt_size
add ix,de
inc b
ld a,24
cp b
jr nz,nxt_line
ret
;---------------------------------
;Печать спрайта из ленты
PRINT_NEXT_SPRITE
ld l,(IX+ribbon_ptr)
ld h,(IX+ribbon_ptr+1)
nxt_rib
ld a,(hl) ;номер спрайта
cp 255 ;конец ленты?
jr nz,no_endrib
;конец
dec (IX+ribbon_cnt)
call z,NEXT_LINE_PTR ;счётчик обнулился, следующая лента
ld l,(IX+ribbon_start)
ld h,(IX+ribbon_start+1)
ld (IX+ribbon_ptr),l
ld (IX+ribbon_ptr+1),h
jr nxt_rib
no_endrib
;в A номер спрайта
inc hl
ld b,(hl)
ld l,a
ld h,0
push hl
;ld de,spr_attribs
;add hl,de
;ld a,(hl)
ld l,(IX+attr_addr)
ld h,(IX+attr_addr+1)
S_AA set 7,h
ld (hl),b
pop hl
add hl,hl
add hl,hl
add hl,hl ;x8
ld de,sprites
add hl,de ;адрес спрайта
ld e,(IX+print_addr)
ld d,(IX+print_addr+1)
S_PA set 7,d
ld b,8
nxt_b ld a,(hl)
ld (de),a
inc hl
inc d
djnz nxt_b
ld l,(IX+ribbon_ptr)
ld h,(IX+ribbon_ptr+1)
inc hl
inc hl
ld (IX+ribbon_ptr),l
ld (IX+ribbon_ptr+1),h
ret
;---------------------------------
;Печать 32 спрайта из ленты c первого знакоместа
PRINT_32_SPRITE
ld l,(IX+ribbon_ptr)
ld h,(IX+ribbon_ptr+1)
ld d,(IX+print_addr+1)
set 7,d
ld a,(IX+print_addr)
and 224
ld e,a
ld b,32
P32S1 push bc
P32S2 ld a,(hl) ;номер спрайта
cp 255 ;конец ленты?
jr nz,P32S3
;------
push de ;экранный адрес
dec (IX+ribbon_cnt)
call z,NEXT_LINE_PTR ;счётчик обнулился, следующая лента
ld l,(IX+ribbon_start) ;возьмём начало текущей ленты
ld h,(IX+ribbon_start+1)
pop de
;------
jr P32S2
P32S3
;в A номер спрайта
inc hl
ld b,(hl) ;атрибут спрайта
push hl ;ribbon_ptr
ld l,a
ld h,0
push hl ;номер спрайта
;push de ;экранный адрес
ld a,e
and 31
ld c,a ;номер знакоместа
;ld de,spr_attribs
;add hl,de
;ld b,(hl) ;атрибут спрайта
ld h,(IX+attr_addr+1)
set 7,h ;переключимся на 7 банку
ld a,(IX+attr_addr)
and 224
or c ;смешение адреса атрибута по х
ld l,a
ld (hl),b ;атрибут на экран
;pop de ;экранный адрес
pop hl ;номер спрайта
add hl,hl
add hl,hl
add hl,hl ;x8
push de ;экранный адрес
ld de,SPRITES
add hl,de ;адрес спрайта
pop de ;экранный адрес
push de ;экранный адрес
ld b,8
P32S4 ld a,(hl)
ld (de),a
inc hl
inc d
djnz P32S4
pop de ;экранный адрес
inc de
pop hl ;ribbon_ptr
inc hl
pop bc
djnz P32S1
ld (IX+ribbon_ptr),l
ld (IX+ribbon_ptr+1),h
ret
;---------------------------------
;Заполнение данных ленты из указателя линии уровня и его сдвиг
NEXT_LINE_PTR
ld l,(IX+line_ptr)
ld h,(IX+line_ptr+1)
ld b,(hl)
ld de,RIBBONS
call ADDR_AFTER255
ld (IX+ribbon_ptr),e
ld (IX+ribbon_ptr+1),d
ld (IX+ribbon_start),e
ld (IX+ribbon_start+1),d
inc hl
ld a,(hl)
ld (IX+ribbon_cnt),a
inc hl
ld (IX+line_ptr),l
ld (IX+line_ptr+1),h
ret
;---------------------------------
;адрес после разделителя 255 по номеру b
ADDR_AFTER255
xor a
cp b
ret z
nxt_de ld a,(de)
inc de
cp 255
jr nz,nxt_de
djnz nxt_de
ret
;---------------------------------
;сдвиг экрана
SCROLL
ld hl,(S_SRC)
ld de,(S_DST)
ld bc,6911
ldir
ret
;---------------------------------
;сдвиг экрана2
SCROLL2
S_SRC ld hl,#4001 ;10
ld (S_SRC1+1),hl ;16
S_DST ld hl,#C000 ;10
ld de,16 ;10
add hl,de ;11
ld (S_DST1+1),hl ;16
ld (SAVE_SP+1),sp ;20
ld b,216 ;7 = 100
S_SRC1 LD SP,0 ;10
POP HL ;10
POP DE ;10
POP AF ;10
POP IX ;14
POP IY ;14
EXX ;4
POP HL ;10
POP DE ;10
POP BC ;10
LD (S_SRC2+1),SP ;20 = 122
S_DST1 LD SP,0 ;10
PUSH BC ;11
PUSH DE ;11
PUSH HL ;11
EXX ;4
PUSH IY ;15
PUSH IX ;15
PUSH AF ;11
PUSH DE ;11
PUSH HL ;11
ld hl,32 ;10
add hl,sp ;11
LD (S_DST2+1),hl ;16 = 147
S_SRC2 LD SP,0 ;10
POP HL ;10
POP DE ;10
POP AF ;10
POP IX ;14
POP IY ;14
EXX ;4
POP HL ;10
POP DE ;10
POP BC ;10
LD (S_SRC1+1),SP ;20 = 122
S_DST2 LD SP,0 ;10
PUSH BC ;11
PUSH DE ;11
PUSH HL ;11
EXX ;4
PUSH IY ;15
PUSH IX ;15
PUSH AF ;11
PUSH DE ;11
PUSH HL ;11
ld hl,32 ;10
add hl,sp ;11
LD (S_DST1+1),hl ;16 = 147
djnz S_SRC1 ;13 551 / 32 = 17.2
SAVE_SP ld sp,0 ;10
;~119126 тактов (ldir ~ 145152 тактов - дольше на 21,8%)
ret
;---------------------------------
SCR_ADDR
;адрес 31ого знакоместа линии
ld a,b
and %00011000
or %01000000 ;+16384
ld h,a
ld a,b
rrca
rrca
rrca
ld d,a ;для расчёта атрибутов
or %00011111 ;+31
ld l,a
;адрес атрибутов этого знакоместа
ld e,l ;уже частично посчитано
ld a,d
and %00000011
or %01011000 ;+22528
ld d,a
ret
;---------------------------------
;Бинд страницы B
BIND_PAGE_B
DI
LD B,A
LD A,(#5B5C)
AND 248
OR B
LD (#5B5C),A
LD BC,#7FFD
OUT (C),A
;EI
RET
;--------------------------
;Переключение экранов
SWAP_SCREEN
;DI
LD A,(#5B5C)
xor 8
LD (#5B5C),A
LD BC,#7FFD
OUT (C),A
;EI
ld a,(S_SRC+2)
xor 128
ld (S_SRC+2),a
ld a,(S_DST+2)
xor 128
ld (S_DST+2),a
ld a,(S_PA+1)
xor 8 ;SET 6,D <-> SET 7,D
ld (S_PA+1),a
ld a,(S_AA+1)
xor 8 ;SET 6,H <-> SET 7,H
ld (S_AA+1),a
ld a,(A_P1+1)
xor 8 ;SET 6,H <-> SET 7,H
ld (A_P1+1),a
RET
;--------------------------
;Переключение экранов
SET_PAGE_MODE_A
;DI
LD (#5B5C),A
LD BC,#7FFD
OUT (C),A
;EI
RET
;--------------------------
DOWN INC H
LD A,H
AND #07
RET NZ
LD A,L
ADD A,#20
LD L,A
RET C
LD A,H
SUB #08
LD H,A
RET
;---------------------------
ADR_PIX
LD A,E ;E-Y
AND A
RRA
SCF
RRA
AND A
RRA
XOR E
AND #F8
XOR E
OR #40
LD H,A
A_P1 set 7,h
LD A,D
RLCA
RLCA
RLCA
XOR E
AND #C7
XOR E
RLCA
RLCA
LD L,A
RET
;----------------------------
DRAW
call update
ld a,(old_y)
ld e,a
ld d,32
call ADR_PIX
ld de,FON_SRC
call DRAW_SRC
ld a,(mar_y)
ld e,a
ld d,40
call ADR_PIX
call COPY_FON
ld de,MARIO
call DRAW_SRC
ret
;----------------------------
DRAW_SRC
ld b,32
DS1 ld a,(de)
ld (hl),a
inc hl
inc de
ld a,(de)
ld (hl),a
dec hl
inc de
call DOWN
djnz DS1
ret
;----------------------------
COPY_FON
push hl
ld de,FON_SRC
ld b,32
CF1 ld a,(hl)
ld (de),a
inc hl
inc de
ld a,(hl)
ld (de),a
dec hl
inc de
call DOWN
djnz CF1
pop hl
ret
LINE_TABLE DEFS 288,0
LINE_ptr equ 0 ;2 - указывает на текущую свёрнутую ленту в линии уровня
ribbon_ptr equ 2 ;2 - адрес текущего номера спрайта в ленте
ribbon_start equ 4 ;2 - начальный адрес текущей ленты
print_addr equ 6 ;2 - адрес знакоместа
attr_addr equ 8 ;2 - адрес атрибутов
ribbon_cnt equ 10 ;1 - счётчик количества повторяющихся лент
lt_size equ 11 ;количество байт в данных линии
LEVEL
DEFB 11,19,8,1,11,17,8,2,11,29,8,1,11,16,8,2,11,29,8,1,11,16,8,2,11,29,8,1,11,7,8,3,11,6,8,2,11,25,255
DEFB 11,18,9,1,12,1,10,1,11,15,9,1,12,2,10,1,11,27,9,1,12,1,10,1,11,14,9,1,12,2,10,1,11,27,9,1,12,1,10,1,11,14,9,1,12,2,10,1,11,27,9,1,12,1,10,1,11,5,9,1,12,3,10,1,11,4,9,1,12,2,10,1,11,24,255
DEFB 11,9,8,1,11,8,13,1,15,1,14,1,11,7,8,3,11,5,13,1,15,2,14,1,11,17,8,1,11,9,13,1,15,1,14,1,11,6,8,3,11,5,13,1,15,2,14,1,11,17,8,1,11,9,13,1,15,1,14,1,11,6,8,3,11,5,13,1,15,2,14,1,11,17,8,1,11,9,13,1,15,1,14,1,11,5,13,1,15,3,14,1,11,4,13,1,15,2,14,1,11,13,29,1,31,1,11,9,255
DEFB 11,8,9,1,12,1,10,1,11,16,9,1,12,3,10,1,11,24,9,1,12,1,10,1,11,16,9,1,12,3,10,1,11,24,9,1,12,1,10,1,11,16,9,1,12,3,10,1,11,24,9,1,12,1,10,1,11,43,30,1,11,9,255
DEFB 11,8,13,1,15,1,14,1,11,16,13,1,15,3,14,1,11,24,13,1,15,1,14,1,11,16,13,1,15,3,14,1,11,24,13,1,15,1,14,1,11,16,13,1,15,3,14,1,11,24,13,1,15,1,14,1,11,43,32,1,11,9,255
DEFB 11,198,32,1,11,9,255
DEFB 11,22,3,1,11,57,2,8,11,3,2,3,3,1,11,14,3,1,11,11,2,3,11,4,2,1,3,2,2,1,11,56,27,2,11,8,32,1,11,9,255
DEFB 11,22,4,1,11,57,2,8,11,3,2,3,4,1,11,14,4,1,11,11,2,3,11,4,2,1,4,2,2,1,11,56,28,2,11,8,32,1,11,9,255
DEFB 11,187,27,3,11,8,32,1,11,9,255
DEFB 11,187,28,3,11,8,32,1,11,9,255
DEFB 11,186,27,4,11,8,32,1,11,9,255
DEFB 11,186,28,4,11,8,32,1,11,9,255
DEFB 11,185,27,5,11,8,32,1,11,4,36,3,11,2,255
DEFB 11,185,28,5,11,8,32,1,11,4,2,3,11,2,255
DEFB 11,16,3,1,11,3,2,1,3,1,2,1,3,1,2,1,11,21,5,1,11,9,5,1,11,18,2,1,3,1,2,1,11,14,2,1,11,5,2,2,11,4,3,1,11,2,3,1,11,2,3,1,11,5,2,1,11,10,2,2,11,6,27,1,11,2,27,1,11,10,27,2,11,2,27,1,11,12,2,2,3,1,2,1,11,12,27,6,11,8,32,1,11,4,33,1,2,1,34,1,11,2,255
DEFB 11,16,4,1,11,3,2,1,4,1,2,1,4,1,2,1,11,21,6,1,11,9,6,1,11,18,2,1,4,1,2,1,11,14,2,1,11,5,2,2,11,4,4,1,11,2,4,1,11,2,4,1,11,5,2,1,11,10,2,2,11,6,28,1,11,2,28,1,11,10,28,2,11,2,28,1,11,12,2,2,4,1,2,1,11,12,28,6,11,8,32,1,11,4,33,1,2,1,34,1,11,2,255
DEFB 11,38,5,1,11,6,7,1,11,9,7,1,11,77,27,2,11,2,27,2,11,8,27,3,11,2,27,2,11,26,27,7,11,8,32,1,11,3,36,1,2,3,36,1,11,1,255
DEFB 11,2,20,1,11,35,6,1,11,6,7,1,11,2,20,1,11,6,7,1,11,39,20,1,11,37,28,2,11,2,28,2,11,4,20,1,11,3,28,3,11,2,28,2,11,26,28,7,11,4,20,1,11,3,32,1,11,3,2,5,11,1,255
DEFB 11,1,21,1,26,1,23,1,11,24,5,1,11,8,7,1,11,6,7,1,11,1,21,1,26,1,23,1,11,5,7,1,11,38,21,1,26,1,23,1,11,35,27,3,11,2,27,3,11,2,21,1,26,1,23,1,11,1,27,4,11,2,27,3,11,5,5,1,11,14,5,1,11,1,27,8,11,3,21,1,26,1,23,1,11,2,32,1,11,3,2,2,35,1,2,2,11,1,255
DEFB 11,1,22,1,18,1,24,1,11,13,20,1,11,10,6,1,11,8,7,1,11,6,7,1,11,1,22,1,18,1,24,1,11,5,7,1,11,6,20,1,11,31,22,1,18,1,24,1,11,13,20,1,11,21,28,3,11,2,28,3,11,2,22,1,18,1,24,1,11,1,28,4,11,2,28,3,11,3,20,1,11,1,6,1,11,14,6,1,11,1,28,8,11,3,22,1,18,1,24,1,11,2,32,1,11,3,2,2,35,1,2,2,11,1,255
DEFB 21,1,26,1,18,1,25,1,23,1,11,7,16,3,11,1,21,1,26,1,23,1,11,5,16,1,11,3,7,1,11,8,7,1,11,2,16,1,11,3,7,1,21,1,26,1,18,1,25,1,23,1,11,4,7,1,11,1,16,3,11,1,21,1,26,1,23,1,11,5,16,1,11,17,16,1,11,5,21,1,26,1,18,1,25,1,23,1,11,7,16,3,11,1,21,1,26,1,23,1,11,5,16,1,11,13,27,4,16,2,27,4,21,1,26,1,18,1,25,1,27,5,11,2,27,4,11,1,21,1,26,1,23,1,7,1,11,3,16,1,11,10,7,1,27,9,11,2,21,1,26,1,18,1,25,1,23,1,11,1,27,1,11,3,2,2,35,1,2,2,11,1,255
DEFB 22,1,18,3,24,1,11,6,17,1,18,3,19,1,22,1,18,1,24,1,11,4,17,1,18,1,19,1,11,2,7,1,11,8,7,1,11,1,17,1,18,1,19,1,11,2,7,1,22,1,18,3,24,1,11,4,7,1,17,1,18,3,19,1,22,1,18,1,24,1,11,4,17,1,18,1,19,1,11,15,17,1,18,1,19,1,11,4,22,1,18,3,24,1,11,6,17,1,18,3,19,1,22,1,18,1,24,1,11,4,17,1,18,1,19,1,11,12,28,4,18,2,28,4,22,1,18,3,28,5,11,2,28,4,19,1,22,1,18,1,24,1,7,1,11,2,17,1,18,1,19,1,11,9,7,1,28,9,11,2,22,1,18,3,24,1,11,1,28,1,11,3,2,2,35,1,2,2,19,1,255
DEFB 0,69,11,2,0,15,11,3,0,64,11,2,0,53,255
DEFB 1,69,11,2,1,15,11,3,1,64,11,2,1,53,255
RIBBONS
DEFB 0,16,1,16,255
DEFB 16,16,17,16,255
DEFB 30,16,30,16,255
DEFB 9,48,10,48,255
DEFB 25,48,26,48,255
DEFB 6,38,7,38,0,38,8,38,255
DEFB 22,38,23,38,0,38,24,38,255
DEFB 27,46,28,38,0,38,29,46,255
DEFB 2,47,3,47,255
DEFB 0,40,4,47,255
DEFB 5,47,0,40,255
DEFB 0,40,0,40,255
DEFB 0,56,0,56,255
DEFB 0,40,18,47,255
DEFB 21,47,0,40,255
DEFB 19,47,20,47,255
DEFB 2,44,3,44,255
DEFB 0,47,4,44,255
DEFB 0,32,0,32,255
DEFB 5,44,0,47,255
DEFB 11,44,12,44,255
DEFB 0,47,13,44,255
DEFB 13,44,0,32,255
DEFB 14,44,0,47,255
DEFB 0,32,14,36,255
DEFB 15,32,0,32,255
DEFB 0,32,15,32,255
DEFB 31,40,32,40,255
DEFB 33,40,34,40,255
DEFB 0,40,14,61,255
DEFB 14,61,0,40,255
DEFB 37,60,0,40,255
DEFB 38,42,0,40,255
DEFB 30,16,0,0,255
DEFB 0,7,30,16,255
DEFB 0,7,0,7,255
DEFB 35,42,36,42,255
SPRITES
DEFB 0,0,0,0,0,0,0,0
DEFB 64,65,65,65,81,94,65,65
DEFB 0,3,7,31,31,31,57,119
DEFB 0,192,224,224,244,190,222,254
DEFB 0,7,15,31,31,127,127,63
DEFB 0,16,176,240,250,254,254,252
DEFB 0,127,3,115,115,115,115,115
DEFB 0,255,240,246,246,246,246,246
DEFB 0,254,0,86,46,86,46,86
DEFB 85,128,32,135,15,142,14,134
DEFB 86,1,5,193,225,113,113,241
DEFB 0,0,0,0,0,7,63,255
DEFB 0,0,0,0,0,224,252,255
DEFB 1,3,7,15,31,63,127,255
DEFB 128,192,224,240,248,252,254,255
DEFB 2,7,7,7,55,50,48,48
DEFB 0,0,192,48,15,1,1,126
DEFB 65,65,129,129,1,1,3,126
DEFB 27,13,6,7,0,0,0,0
DEFB 255,191,28,192,243,126,28,0
DEFB 191,127,61,131,199,255,60,0
DEFB 248,252,254,254,248,96,0,0
DEFB 115,115,115,115,115,115,0,0
DEFB 246,246,246,246,246,246,0,0
DEFB 46,86,46,86,46,86,0,0
DEFB 1,129,0,129,1,160,0,255
DEFB 113,65,193,1,65,197,1,255
DEFB 31,23,31,23,31,23,31,23
DEFB 251,251,251,251,251,251,251,251
DEFB 184,88,184,88,184,88,184,88
DEFB 255,2,2,2,255,32,32,32
DEFB 128,64,32,16,13,10,5,10
DEFB 1,3,7,15,95,175,95,175
DEFB 5,10,5,10,31,63,127,255
DEFB 95,175,95,175,247,251,253,254
DEFB 248,248,248,248,0,216,216,216
DEFB 29,29,29,29,0,31,31,31
DEFB 0,124,214,146,186,238,254,56
DEFB 3,3,3,3,3,3,3,3
MARIO
DEFB 3,240
DEFB 15,208
DEFB 31,208
DEFB 31,254
DEFB 28,144
DEFB 38,204
DEFB 38,2
DEFB 96,34
DEFB 96,252
DEFB 112,124
DEFB 24,0
DEFB 8,32
DEFB 11,208
DEFB 27,216
DEFB 59,220
DEFB 123,222
DEFB 115,206
DEFB 243,207
DEFB 240,15
DEFB 244,47
DEFB 144,9
DEFB 144,9
DEFB 80,10
DEFB 32,4
DEFB 32,4
DEFB 65,130
DEFB 66,66
DEFB 68,34
DEFB 68,34
DEFB 60,60
DEFB 252,63
DEFB 252,63
FON_SRC
defs 64,0
print_bc
CALL 11563
CALL 11747
jr $
;page 6
;defb 0
[свернуть]
Внизу можно раскомментироватть
page 1
defb 0
и всё, картина меняется
- - - Добавлено - - -
Я могу создать сна, но если он 48 НО использует банки, то аут
- - - Добавлено - - -
после этого должен получиться как минимум 128(всё невклёчёные банка, а нет(
- - - Добавлено - - -
они и в хаголовке неплоъхо себя чувствуют(что 128, что 48)
Скрытый текст
}Код:void ZX_SNA_Saver::FillHeader(ByteVector & mas, unsigned int start)
{
//Заполним заголовок sna(27 байт)
mas.push_back(63); //регистр I
mas.push_back(0); //HL'
mas.push_back(0);
mas.push_back(0); //DE'
mas.push_back(0);
mas.push_back(32); //BC'
mas.push_back(23);
mas.push_back(68); //AF'
mas.push_back(0);
mas.push_back(168); //HL
mas.push_back(16);
mas.push_back(185); //DE
mas.push_back(92);
mas.push_back(0); //BC
mas.push_back(0);
mas.push_back(58); //IY
mas.push_back(92);
mas.push_back(0); //IX
mas.push_back(0);
mas.push_back(6); //Флаги прерываний
mas.push_back(0); //Регистр регенерации динамической памяти R
mas.push_back(116); //AF
mas.push_back(0);
mas.push_back((start - 2) % 256); //SP
mas.push_back((start - 2) / 256);
mas.push_back(1); //Режим прерываний
mas.push_back(7); //Цвет бордюра
[свернуть]
- - - Добавлено - - -
Пожоду я показывал уже..
- - - Добавлено - - -
Упс.. а тут нет пс, а где в 48 он?
- - - Добавлено - - -
А пк опять же только в 128 режиме
Скрытый текст
Код://Если 128k
if (is128)
{
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
this->Addpage(compiler, sna, 1);
this->Addpage(compiler, sna, 3);
this->Addpage(compiler, sna, 4);
this->Addpage(compiler, sna, 6);
this->Addpage(compiler, sna, 7);
}
[свернуть]
- - - Добавлено - - -
Весь этот разговор изначальную проблему не решает, в сна 48 эмуляторы сразу отключают юз страниц
- - - Добавлено - - -
а не надо так) не надо такими быть :v2_dizzy_roll:
- - - Добавлено - - -
Поменяйте 1 битик
- - - Добавлено - - -
Где в SNA-48 хранится PC
- - - Добавлено - - -
Где в SNA-48 хранится PC
Знавчит стырили с оджного источника))
- - - Добавлено - - -
За-Ба-СтоВка(бунт) ну там Покожите, где я дибил, либо, но увы перекомпилите эмули, ыыыыы)))
SnapShot это именно сохранёнка состояния под эмулем.
а то что ты пытаешься создать sna допустим под асмом это твои проблемы, а не авторов эмуля.
.................
ещё могу подсказать что режим im1 на 128ой машине работает совсем по другому
и если прерывания разрешены то подсунув 48ой SNA ты скорее всего вызовешь сброс/зависание
Ты читал тему с начала, идиотик?
- - - Добавлено - - -
Ну с поста третьего примерно
- - - Добавлено - - -
Что ты мне посоветуешь с моей проблемой?
- - - Добавлено - - -
В 48 к где хранится инфа о порте
- - - Добавлено - - -
Почему сразу заглушка?
Я иж меняю как перчатки))))
- - - Добавлено - - -
Я думал ты подскажешь в сложной ситуации, а ты просто никчёмный
- - - Добавлено - - -
на какую?
- - - Добавлено - - -
Все понимают, ты один как сцыкливая сипа хотешь высказаться
- - - Добавлено - - -
Эй гудбой, где в 48 то что нужно?
- - - Добавлено - - -
Хоть бы байт по делу сказал, ну правда
- - - Добавлено - - -
яж код дал, что мешает проверить. Наверное идиотизм
обосрался - обтекай, не умеешь - впитывай
итог холивара, даже если код переключает страницы, но сохранён в сна 48, забудь о страницах, обращайся напрямик к разрабам, тут тебя обосрут, а они возможно и нет
- - - Добавлено - - -
Давай проще
Мне компиль выдал sna48
я его запускаю, он запускакется, но
в коде этого сна есть переключение страниц, которые эмуль уже не делает, ну 48 же было
- - - Добавлено - - -
уже заглушка
посмотри на свою проблему с логики автора эмуля.
зачем ему сохранять sna48 если комп находится в 128ом режиме ?
более того некоторые эмули ещё и сохраняют тип 128ой машины (фирма/пентагон)
Ну я понял. проще писать костыль
чтоб всегда было 128, я думал проблема решаема и я где-то накосячил, но в итоге гудбой не сцыунул и повёл себя как мужик)
Странный вопрос. Ты когда в меню 128 спектрума выбираешь BASIC48 у тебя же физически комп не превращается в спектрум 48к? Эмулятор эмулит конкретную модель машины. Тебе же выше минимум два раза объясняли, что когда эмулятор видит на входе sna, снятый с машины 48к, он не порт конфигурации блочит и не байты в системные переменные выставляет. Он просто считает, что для работы поднимаем эмуляцию машины 48к, где памяти выше 48к и порта конфигурации просто нет!
приветствую,
какая сейчас примерно технология работы с современными Z80 ассмеблерами и запуском бинарника на эмуляторе?
т.е например sjasmplus собирает мою helloworld программу но никакого бинарного файла не создает.
В примерах sjasmplus в файле frost10.z80 стоит макрокоманда
SAVESNA "frost10.sna",STARTF
я так понимаю что это команда для формирования полного образа памяти snapshot.
С загрузчиком? Помнится на BASIC загручик еще нужен был .
Вообщем я совершенно запутался тут , в элементарнейшем вопросе как раз для этой темы.
Я нашел несколько гайдов по настройке окружения в современных условиях, но там как то этот не расммотрен.
Буду благодарен за подсказку!
Эмуляторы вроде советуют для разработки CSpect и ZEsarUX
Я пишу на С++ и на asm писал бывало для x86 , но спектрум последний раз запускал 25 лет назад и никогда на асме не писал под него.
эмуляторы
unreal
xpeccy (иногда нужен там где не удобно отлаживать в unreal)
за CSpect не знаю
ZEsarUX - редкостное гафно
самый последний и навороченный sjasm брать тут
https://github.com/z00m128/sjasmplus/releases/
не забывать RTFM
http://z00m128.github.io/sjasmplus/documentation.html
оно формирует снапшот для эмулятора
такой вариант подходит для отладки и тестирования
загружать sna на реале не всегда возможно...
да и не принято в таком формате что то выпускать
вот те например сохранялка в tap образа ленты
с загрузчиком лежащим в rem
и который грузит кодовый блок без заголовка и запускает
может с ходу не работать
тк у меня более сложная обвязка на lua вокруг
которая будет не читаема для новичков
и пришлось много чего выкинуть
Код:
emptytap "test.tap"
org $0
basic_start
defb $00,00 ;
defw end_basic_line_0 - basic_line_0
basic_line_0
defb $EA ;REM
;загрузчик в REM
di
ld ix,$C000 ;грузим по адресу $C000
ld de,$2000 ;$2000 байт
ld a,$FF
scf
call 1366 ;процедура загрузки в ПЗУ
di
jp start ;и запускаем
defb $0D
end_basic_line_0
defb $00,10
defw end_basic_line_10 - basic_line_10
basic_line_10
defb $FD,$B0 ;CLEAR VAL
defb $22,"24575",$22
defb $3A ; :
defb $F9,$C0 ;RANDOMIZE USR
defb $28 ;(
defb "5" ;5
defb $0E,$00,$00,$05,$00,$00
defb $2B ;+
defb "256" ;256
defb $0E,$00,$00,$00,$01,$00
defb $2A ;*
defb $BE,$B0 ;PEEK VAL
defb $22,"23636",$22 ;"23636"
defb $2B ;+
defb $BE,$B0 ;PEEK VAL
defb $22,"23635",$22 ;"23635"
defb $29 ;)
defb $0D
end_basic_line_10
defb $80 ;autorun
defb $AA,10,0 ;не уверен нужны ли эти строки
basic_end
;сохраняем бейсик
savetap "test.tap",BASIC,"prog_name",$0,basic_end-basic_start,0 ;0 autorun line
;сохраняем кодовый блок без заголовка
savetap "test.tap",HEADLESS,$C000,$2000
тоже самое для создания образа диска trd
тоже может с ходу не работать
Код:
tr_dos_var_current_track_sector = $5CF4
emptytrd "test,trd"
org $0
basic_start
defb $00,00 ;
defw end_basic_line_0 - basic_line_0
basic_line_0
defb $EA ;REM
;загрузчик в REM
di
ld bc,$2005 ;грузим $20 секторов = $2000 байт
;05 режим загрузки
ld de,(tr_dos_var_current_track_sector) ;d номер трека e номер сектора
;в данном случае берем последнее положение
ld hl,$C000 ;куда грузим
im 1
call $3D13 ;стандартная точка входа в ПЗУ tr-dos
di
jp start ;запускаем то что загрузили
defb $0D
end_basic_line_0
defb $00,10
defw end_basic_line_10 - basic_line_10
basic_line_10
defb $FD,$B0 ;CLEAR VAL
defb $22,"24575",$22
defb $3A ; :
defb $F9,$C0 ;RANDOMIZE USR
defb $28 ;(
defb "5" ;5
defb $0E,$00,$00,$05,$00,$00
defb $2B ;+
defb "256" ;256
defb $0E,$00,$00,$00,$01,$00
defb $2A ;*
defb $BE,$B0 ;PEEK VAL
defb $22,"23636",$22 ;"23636"
defb $2B ;+
defb $BE,$B0 ;PEEK VAL
defb $22,"23635",$22 ;"23635"
defb $29 ;)
defb $0D
end_basic_line_10
defb $80 ;autorun
defb $AA,10,0
basic_end
;сохраняем бейсик загрузчик
savetrd "test","boot.B",$0,basic_end-basic_start ;если хотим автозапуск по run
;savetrd "test","prog.B",$0,basic_end-basic_start ;если не хотим автозапуск
;и лучше писать мелкими буквами
;тк некоторым придется вводить run "prog" ручками
;сохраняем кодовый блок
savetrd "test.trd","data.C",$C000,$2000 ;сохраняем $2000 байт начиная с адреса $C000
в принципе для начала можно сохранять и в sna
это проще всего
в начале сорца нужно указать тип машины
(да и в общем его нужно указывать для доступа ко многим полезным функциям)
в концеКод:DEVICE ZXSPECTRUM128
где start собственно стартовый адрес программы...Код:SAVESNA "test.sna",start
ну и в sna по идеи можно сохранить только
ZXSPECTRUM48
ZXSPECTRUM128
если нужно больше
нужно уже извращаться
снапшотов для больше 128К так и не изобрели до сих пор...
ну писать на C для спектрума не лучшее решение
есть у нас тут конечно писатели
но результат в конечно итоге всегда посредственный...
так что
только асм только хардкор
вот хорошая таблица по z80 асму
http://www.z80.info/zip/z80-documented.pdf
начиная с 26 страницы
все лаконично и понятно
Это конечно понятно, но если уже есть поддержка 128(и более), зачем при загрузке 48 снимка памяти и систему сразу делать 48ой? Ведь я, например имея 128к, выгружу часть памяти, соответствующую 48, в которой имеется код работы со страницами, загружу в другой 128, всё ведь нормально будет работать. Просто мне кажется, что рассматривать 48sna лучше было бы как минимальную часть памяти(поддерживаемую и теми и другими моделями), а не признак конкретно модели. Ну это такое, у разрабов эмулей своё видение, и менять никто ничего всё равно не будет.
- - - Добавлено - - -
Но там я выбираю сам, а тут мне выбора не дают.
Причём только что ещё раз посмотрел, и в эмузвине есть настройка
Ignore soft lock 48k by setting bit 5 in port 7FFD (always 128k in 128k mode),
но в данном случае она не помогает, так как эмулятор, видя 48к памяти в снапшоте, и машину делает 48. Но таки при загрузке 128 в режиме 48, он сначала спрашивает, переключить ли модель?