ФлеймФорумПрограммирование

Вопросы по ZX80 Assembler (17 стр)

Страницы: 112 13 14 15 16 17
#240
6:16, 17 янв 2025

=A=L=X=
> Но никогда не слышал чтобы кто-то эмуляторы писал или даже просто использовал какую то другую архитектуру принципиально для отладки - зачем, если спектрум сам с усами?

То что ты не слышал вовсе не значит что такого не было. Сами подумайте? проанализируйте? Если у вас есть бабло то зачем вам корячится на спеке? Уж поверь бизнесмены тогда были куда ушлее и они бы не упустили бы такую возможность.
На самом деле ходят байки что и Билл Гильберт ломал игры вовсе не на спеке, а на PC.

#241
6:29, 17 янв 2025

https://retrocomputing.stackexchange.com/questions/3314/how-were-… games-written

#242
(Правка: 6:47) 6:44, 17 янв 2025

Понятно что васяны со своими JetSetWilly не могли позволить себе IBM PC для разработки, а те кто работали в корпорациях врядли что могут говорить.

+ Показать
#243
6:46, 17 янв 2025

skalogryz

Ну вот кстати да, крупные студии использовали другие более мощные архитектуры для генерации кода и заливки на спектрум готовых образов. Это весьма разумно. И некоторые на них действительно делали эмуляцию для отладки - тоже волне разумно.
Но то огромное количество игр, что ZX Spectrum произвёл - оно всё-таки благодаря тому, что платформа может и неудобна, но самодостаточна - можно с трудностями, но написать крупную ассемблерную игру на 48Кб модели с кассетником просто задрачиваясь разбитием игры на маленькие блоки и тестированием их по отдельности.

#244
(Правка: 9:08) 8:51, 17 янв 2025

=A=L=X=
Была компиляция (на bbc micro и trs-80) и заливка на спектрум через скоростной интерфейс. А дисководы вообще не уверен что кто-то использовал в те времена. И пошаговой отладки через другую машину, насколько я знаю, тоже не было. Ты про можешь указать на такую железяку для zx?

Даже кросс компиляции в то время (в 80х) можно сказать не было это ж целый компилятор нужно сделать и отладить на чужеродной системе. На тех же z80-based компах ассемблеры для z80 уже были, потому они часто и фигурируют в интервью (как часть cross development rig).
А первые эмуляторы zx на ПК появились в 90х, емнип. И они тормозили зачастую, так как рилтайм эмулировать  спектрум на том же 286 с 12 мгц просто не могли.

#245
9:09, 17 янв 2025

Компилятор из z88dk, кстати, умеет инлайнить asm код из своей стандартной библиотеки. Ну и выжимать все соки не все типы софта требуют (да и не каждый программист настолько квалифицирован).  Ну там ещё  ZX Evo и ZX Next есть, работающие в турбо режимах, вполне позволяют использовать си с asm вставками.

#246
(Правка: 9:26) 9:22, 17 янв 2025

0iStalker
Evo и next спектрумами в полном смысле не являются, когда включают свои продвинутые возможности (расширенную графику и ускоренный в 8 раз процессор), так что это вообще не про спектрум аргумент.
На z88dk конечно можно написать что-то простое, или просто там калькулятор и календарик. Но речь-то про игры. Про нормальные игры а не текстовые диктатор-подобные.
Marsmare Alienation изначально пытались писать на си, но все равно пришлось на ассемблере переписывать, потому что «каждый такт и каждый байт на счету».

#247
10:39, 17 янв 2025

Сейчас на z88dk фактически написаны все игры, которые делаются на движке Churrera и MK2. Но они все однотипны (как и игры на AGD), и скоростью (насыщенностью динамикой) не блещут.
Вообще, сейчас возможностей делать на спектрум сильно больше чем было в 80х, и эмуляторы помогают (с отладкой той же), и даже всякие вот "движки".

А про проекты на Си для спектрума, мне помогли найти только один, fido-читалку Zed, написанную на Hisoft C (на версии, адаптированной под trdos). Но поскольку исходников нет, сказать какой там процент Си без инлайнового ассемблера - не получится. Но если там как и в Hisoft pascal вместо инлайн ассемблера просто инлайн машкод (цепочка байт) - это еще то удовольствие на нем программировать.

#248
(Правка: 16:01) 15:55, 17 янв 2025

=A=L=X=
> но написать крупную ассемблерную игру на 48Кб модели с кассетником просто задрачиваясь разбитием игры на маленькие блоки и тестированием их по отдельности.

Ага, сидят в небоскрёбе корпорации тысячи сотрудников в своих перегородках и каждый на кассетнике мотает блоки.
Самим не смешно...

С самого начала Ultimate разрабатывала игры совсем не так, как типичный программист из спальни Speccy. Как и многое другое об Ultimate, подробности их системы разработки не совсем ясны, но в тех ранних интервью она описывается как 32-битная многопользовательская система, на которой они могли писать и компилировать свой код и отправлять его на подключенный Spectrum для выполнения. (Лучшим предположением было бы использование рабочей станции Unix на базе 68000.) Методология, очевидно, во многом заимствована из той, которую использовали Zilec и их конкуренты для написания аркадных прошивок, и стоила «несколько тысяч фунтов».

Это уже больше похоже на правду.

#249
(Правка: 16:06) 16:04, 17 янв 2025

gamedevfor
> Ага, сидят в небоскрёбе корпорации тысячи сотрудников в своих перегородках и каждый на кассетнике мотает блоки.
> Самим не смешно...
*facepalm*
Ты точно прочитал что он написал? (ты точно читал всё что писалось до этого?) Вообще-то данную информацию он писал уже не про крупные студии, а про игры вообще.
  Тема продолжалась, но ты зацепился за один пост, который вообще не отображает информации о которой писали ранее (по большей части).

  Прочитай ссылку, что скинул Скалогрыз.

#250
19:39, 17 янв 2025

Mirrel
>   Прочитай ссылку, что скинул Скалогрыз.

Ну дык, про Ultimate оттуда же.
Но тоже такой себе сборник баек, никто конкретно там ничего не говорит.

Прошло более 7 месяцев
#251
23:47, 13 сен 2025

Вышел Klive IDE 0.49 этим летом.
Стало вообще мега-удобно.

#252
(Правка: 14 сен 2025, 3:05) 23:50, 13 сен 2025

Увидел настоящий мультиколор 8x1 в разрешении 6 x 1 знакомест.
Забавно что мерцают не полностью знакоместа, а только избранные 8x1 линии в знакоместе.
Это нереально! Это чудо! )))

#253
(Правка: 17:54) 17:34, 14 сен 2025
;-—————————————- 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
#254
(Правка: 18:05) 17:39, 14 сен 2025

Теперь нужно такты процессора считать: ИИ предлагает писать программу для этого;
Жаль что процессор сам их не считает;
P.S. Хотя возможно сам эмулятор может это делать?
Таки да: https://dotneteer.github.io/kliveide/howto/measure-t-states/

Страницы: 112 13 14 15 16 17
ФлеймФорумПрограммирование