=A=L=X=
> Но никогда не слышал чтобы кто-то эмуляторы писал или даже просто использовал какую то другую архитектуру принципиально для отладки - зачем, если спектрум сам с усами?
То что ты не слышал вовсе не значит что такого не было. Сами подумайте? проанализируйте? Если у вас есть бабло то зачем вам корячится на спеке? Уж поверь бизнесмены тогда были куда ушлее и они бы не упустили бы такую возможность.
На самом деле ходят байки что и Билл Гильберт ломал игры вовсе не на спеке, а на PC.
Понятно что васяны со своими JetSetWilly не могли позволить себе IBM PC для разработки, а те кто работали в корпорациях врядли что могут говорить.
skalogryz
Ну вот кстати да, крупные студии использовали другие более мощные архитектуры для генерации кода и заливки на спектрум готовых образов. Это весьма разумно. И некоторые на них действительно делали эмуляцию для отладки - тоже волне разумно.
Но то огромное количество игр, что ZX Spectrum произвёл - оно всё-таки благодаря тому, что платформа может и неудобна, но самодостаточна - можно с трудностями, но написать крупную ассемблерную игру на 48Кб модели с кассетником просто задрачиваясь разбитием игры на маленькие блоки и тестированием их по отдельности.
=A=L=X=
Была компиляция (на bbc micro и trs-80) и заливка на спектрум через скоростной интерфейс. А дисководы вообще не уверен что кто-то использовал в те времена. И пошаговой отладки через другую машину, насколько я знаю, тоже не было. Ты про можешь указать на такую железяку для zx?
Даже кросс компиляции в то время (в 80х) можно сказать не было это ж целый компилятор нужно сделать и отладить на чужеродной системе. На тех же z80-based компах ассемблеры для z80 уже были, потому они часто и фигурируют в интервью (как часть cross development rig).
А первые эмуляторы zx на ПК появились в 90х, емнип. И они тормозили зачастую, так как рилтайм эмулировать спектрум на том же 286 с 12 мгц просто не могли.
Компилятор из z88dk, кстати, умеет инлайнить asm код из своей стандартной библиотеки. Ну и выжимать все соки не все типы софта требуют (да и не каждый программист настолько квалифицирован). Ну там ещё ZX Evo и ZX Next есть, работающие в турбо режимах, вполне позволяют использовать си с asm вставками.
0iStalker
Evo и next спектрумами в полном смысле не являются, когда включают свои продвинутые возможности (расширенную графику и ускоренный в 8 раз процессор), так что это вообще не про спектрум аргумент.
На z88dk конечно можно написать что-то простое, или просто там калькулятор и календарик. Но речь-то про игры. Про нормальные игры а не текстовые диктатор-подобные.
Marsmare Alienation изначально пытались писать на си, но все равно пришлось на ассемблере переписывать, потому что «каждый такт и каждый байт на счету».
Сейчас на z88dk фактически написаны все игры, которые делаются на движке Churrera и MK2. Но они все однотипны (как и игры на AGD), и скоростью (насыщенностью динамикой) не блещут.
Вообще, сейчас возможностей делать на спектрум сильно больше чем было в 80х, и эмуляторы помогают (с отладкой той же), и даже всякие вот "движки".
А про проекты на Си для спектрума, мне помогли найти только один, fido-читалку Zed, написанную на Hisoft C (на версии, адаптированной под trdos). Но поскольку исходников нет, сказать какой там процент Си без инлайнового ассемблера - не получится. Но если там как и в Hisoft pascal вместо инлайн ассемблера просто инлайн машкод (цепочка байт) - это еще то удовольствие на нем программировать.
=A=L=X=
> но написать крупную ассемблерную игру на 48Кб модели с кассетником просто задрачиваясь разбитием игры на маленькие блоки и тестированием их по отдельности.
Ага, сидят в небоскрёбе корпорации тысячи сотрудников в своих перегородках и каждый на кассетнике мотает блоки.
Самим не смешно...
С самого начала Ultimate разрабатывала игры совсем не так, как типичный программист из спальни Speccy. Как и многое другое об Ultimate, подробности их системы разработки не совсем ясны, но в тех ранних интервью она описывается как 32-битная многопользовательская система, на которой они могли писать и компилировать свой код и отправлять его на подключенный Spectrum для выполнения. (Лучшим предположением было бы использование рабочей станции Unix на базе 68000.) Методология, очевидно, во многом заимствована из той, которую использовали Zilec и их конкуренты для написания аркадных прошивок, и стоила «несколько тысяч фунтов».
Это уже больше похоже на правду.
gamedevfor
> Ага, сидят в небоскрёбе корпорации тысячи сотрудников в своих перегородках и каждый на кассетнике мотает блоки.
> Самим не смешно...
*facepalm*
Ты точно прочитал что он написал? (ты точно читал всё что писалось до этого?) Вообще-то данную информацию он писал уже не про крупные студии, а про игры вообще.
Тема продолжалась, но ты зацепился за один пост, который вообще не отображает информации о которой писали ранее (по большей части).
Прочитай ссылку, что скинул Скалогрыз.
Mirrel
> Прочитай ссылку, что скинул Скалогрыз.
Ну дык, про Ultimate оттуда же.
Но тоже такой себе сборник баек, никто конкретно там ничего не говорит.
Вышел Klive IDE 0.49 этим летом.
Стало вообще мега-удобно.
Увидел настоящий мультиколор 8x1 в разрешении 6 x 1 знакомест.
Забавно что мерцают не полностью знакоместа, а только избранные 8x1 линии в знакоместе.
Это нереально! Это чудо! )))
;-—————————————- ZX Spectrum 48K: MultiColor 8x1 -—————————————————
Start:
.model Spectrum48
.org #8000
__APP_CONSTANTS:
SCREEN_BEGIN_ADDR EQU 4000h ;16384
SCREEN_END_ADDR EQU 57FFh ;22527
SCREEN_SIZE EQU 1800h ;6144
SCREEN_SIZE_HALF EQU 0C00h ;3072
SCREEN_ATTR_BEGIN_ADDR EQU 5800h ;22528
SCREEN_ATTR_END_ADDR EQU 5AFFh ;23295
SCREEN_ATTR_SIZE EQU 300h ;768
;ATTR=Y*32+X+#5800.
;+-+-+-+-+-+-+-+-+
;|7|6|5|4|3|2|1|0|
;+-+-+-+-+-+-+-+-+
;bits 0..2 - draw color (INK)
;bits 3..5 - back color (PAPER)
;bit 6 - (BRIGHT)
;bit 7 - (FLASH)
EMPTY_PXL EQU 00h
EMPTY_PXL_W EQU 0000h
FILL_PXL EQU 0FFh
FILL_PXL_W EQU 0FFFFh
FILL_PXL_W_COUNTER EQU 003E9h; 1001 iterations
FILL_PXL_PATTERN EQU 00055h; 85: 0000 0000 0101 0101
;draw: 0101 0101 0000 0000
RANDOM_COUNT EQU 48; размер массива
RANDOM_BEGIN_ADDR EQU 40000h;
__APP_DATA:
STACK_ADDR DW 0
RANDOM_ARRAY_ADDR DW 0 ; сюда запишем адрес массива
RANDOM_SEED DB 123 ; начальное значение генератора (можно любое)
__APP_BEGIN:
__APP_INIT:
JP __APP_GENERATE_RANDOM_NUMBERS;
__APP_SETUP:
;------ Setup Screen Border: Blue -------
SetupScreen_Border:
LD A, 1;
OUT (0xFE), A;
;------ Fill Screen over stack -------
FillScreen_FirstCall:
LD DE, FILL_PXL_PATTERN;
FillScreen_EntryPoint:
HALT; vertical sync for screen
DI;
;Store stack pointer
LD HL, 0;
ADD HL, SP;
LD (STACK_ADDR), HL;
;Clear screen
LD SP, SCREEN_ATTR_BEGIN_ADDR;
.loop SCREEN_SIZE_HALF
PUSH DE;
.endl
;Restore stack pointer
LD HL, (STACK_ADDR);
LD SP, HL;
EI;
__APP_SETUP_IM2_INTERRUPT:
;Этот код создаёт таблицу векторов для IM2, где все векторы ведут на один и тот же обработчик — простую команду RET (никакого действия).
DI; Запрещаем прерывания
LD HL, #BE00; HL -> начало таблицы векторов
LD DE, #BE01; DE -> HL + 1 (для копирования)
LD BC, 256; размер 256 байт
LD A, H; A = старший байт (#BE)
LD (HL), #BF; первый байт таблицы = BF
LDIR; копируем #BF во всю область 256 байт
LD I, A; регистр I = #BE, база таблицы векторов
LD A, #C9; код инструкции RET (0xC9)
LD (#BFBF), A; по адресу #BFBF пишем RET
IM 2; включаем режим прерываний IM2
__APP_MAIN:
EI; Разрешить прерывания
HALT; Ждать до начала кадра (INT от ULA)
DI; Запретить прерывания (чтобы точнее синхронизироваться)
__APP_SCREEN_SCAN_BORDER:
LD A, 63; счётчик для цикла задержки.
__APP_SCREEN_SCAN_BORDER_BODY:
; Цикл ожидания построения бордюра, время зависит от типа компьютера
DS 52, 0; задержка на 52 машинных цикла
DEC A;
JR NZ, __APP_SCREEN_SCAN_BORDER_BODY; Цикл ожидания построения бордюра, время зависит от типа компьютера
__APP_SCREEN_SCAN_LINE:
LD HL, (RANDOM_ARRAY_ADDR); ATTR_COLOR_TABLE; Устанавливаем указатель на таблицу атрибутов
LD A, 8; счётчик строк для цикла
__APP_SCREEN_SCAN_LINE_BODY:
;Устанавливаем указатель на область атрибутов экрана (ячейки цвета)
LD DE, SCREEN_ATTR_BEGIN_ADDR;
LDI; 16
LDI; 16
LDI; 16
LDI; 16
LDI; 16
LDI; 16
;переброска атрибутов
LD DE, 0; Не значимая команда, необходима, что-бы потратить время
;Ожидании до 224 тактов (за столько большинство комперов строят строку)
DS 23, 0
DEC A;
JR NZ, __APP_SCREEN_SCAN_LINE_BODY;
__APP_KEYBOARD_HANDLER:
; SPACE (строка #7FFE, бит 0)
LD A, %01111111; выбрать строку с SPACE
IN A,(#FE);
BIT 0,A;
JR Z, __APP_END; если SPACE нажат → выход
JP __APP_MAIN; иначе продолжаем
__APP_SEG_DATA:
;User defined color table for 6 x 1 places: 48 bytes
;by default use generated random color table;
ATTR_COLOR_TABLE DB 100, 111, 122, 133, 144, 155, 166, 177, 188, 199, 210, 102, 114, 125, 136, 147, 158, 169, 180, 191, 202, 213, 105, 116, 127, 138, 149, 160, 171, 182, 193, 204, 215, 107, 118, 129, 140, 151, 162, 173, 184, 195, 206, 217, 109, 120, 131, 142
__APP_GENERATE_RANDOM_NUMBERS:
LD HL, RANDOM_BEGIN_ADDR; выделяем массив в памяти
LD (RANDOM_ARRAY_ADDR), HL; записываем адрес массива
LD B, RANDOM_COUNT; B = счетчик элементов массива
__APP_GENERATE_RANDOM_NUMBERS_BODY:
; --------------------
; LCG: X = (X*5 + 1) mod 256
LD A, (RANDOM_SEED);
LD C, A;
ADD A, A; A = 2*X
ADD A, A; A = 4*X
ADD A, C; A = 5*X
INC A; A = 5*X + 1
LD (RANDOM_SEED), A; сохраняем новое X
; --------------------
LD (HL), A; записываем число в массив
INC HL;
DJNZ __APP_GENERATE_RANDOM_NUMBERS_BODY; повторяем N раз
JP __APP_SETUP;
__APP_END:
DI; запретить прерывания
__RETURN_TO_BASIC:
LD A,#3F; стандартное значение I (необязательно для IM1)
LD I,A;
IM 1; стандартный режим прерываний Spectrum
LD SP,#5B00; восстановить стек (системный адрес в RAMTOP)
Exit:
EI; разрешить прерывания
RET; вернуться в BASICТеперь нужно такты процессора считать: ИИ предлагает писать программу для этого;
Жаль что процессор сам их не считает;
P.S. Хотя возможно сам эмулятор может это делать?
Таки да: https://dotneteer.github.io/kliveide/howto/measure-t-states/