Войти
ФлеймФорумПроЭкты

А давайте сделаем игру для ZX Spectrum Next (3 стр)

Страницы: 1 2 3 4 59 Следующая »
#30
5:33, 25 ноя 2020

P.S.
Фишка в том, что я реально начинал свою трудовую деятельность когда с 1С, то приличный кусок её в дальнейшем провёл на MBS Axapta.
Уже тогда (лет 10-15 назад) X++ морально устаревал и C# был круче и я даже тогда задумывался над тем нельзя ли сделать автоматический транслятор кода на X++ в C# чтобы сделать бесшовный переход. Я думаю да. Возможно было бы. Вдумчивый транслятор справился бы.
И насколько я знаю уже давно в MBS Axapta с версии 4.0 вроде бы переход состоялся. Подробностей правда вообще не знаю, тогда я уже был на совсем других задачах и направлениях.
Но оно прям просилось.
X++ в памяти остался только двумя своими интересными чертами - это уже упомянутый выше оператор select встроенный прям в язык как органичное его продолжение. update и insert вроде тоже были. Прям вот синтаксис почти как натуральный SQL, но еще лучше: с проверкой типов! Статическая же типизированная компиляция.
И еще один забавный момент: в класса все поля всегда были private или protected. Т.е. вот просто на уровне языка нельзя было залезть в поле внутри объекта извне. Инкапсуляция 100%.
И тут они два момента протащили забавных: во первых неймспейсы поэтому полей данных и методов получилось разделить. Поэтому геттеры/сеттеры данных назывались в точности как сами данные

int type;
int type() { return type };

но это геттер. а для сеттера они придумали вообще срыв башки - параметры по умолчанию можно было инициализировать членом данных класса!
т.е. выглядело это в итоге как то так:

int type;
int type( newValue = type ) { type = newValue; return type };

obj.type() vs obj.type( 10 ), а это одно и то же.

0iStalker
> Можно же банальный С-- использовать

Для меня лично много романтики заключается в самом ассемблере. Но возможно, возможно.
Возможно даже нормальный Си заюзать - производительности Next по идее за глаза должно хватить чтобы выриулить даже неэффективную трансляцию с многочисленными перекладываниями из памяти в регистры.
Но этот вопрос надо исследовать.

#31
12:25, 25 ноя 2020

=A=L=X=
> во первых неймспейсы поэтому полей данных и методов получилось разделить.
В жабе это тоже работает.

#32
15:39, 25 ноя 2020

=A=L=X=
> Так вот что такое X++ - это типичнейший managed-язык клон Java где
> действительно единственный характерный момент не встречавшийся в других языках
> до того (до C#) - это возможность впрягать SQL-запросы прямо в синтаксис язык.

Пфф, это умели еще FoxPro и MapBasic.

#33
12:46, 25 дек 2020

Нда, Z80 ассемблер основательно подзабыт... да и SjASM - отдельный диалект, с кучей отличий от классики (в сторону синтаксического сахара). Например, не заморачиваясь, можно писать от так вот

device zxspectrum48
  
  ORG 30000

SPR8: DB $38,$38,$38,$10,$FE,$10,$28,$44
  
SCREEN EQU $4000
  
start:  
    LD B, 8
    LD HL, SCREEN
    LD DE, SPR8
    
1    LD A,[DE]    ;next 8 pixel
    LD [HL], A    ;copy to scr
    INC H      ;inc scr ptr on 32 bytes
    INC DE      ;inc spr ptr
    DEC B      ;dec line counter
    JR NZ, 1B    ;if line counter not 0, jump backward to tmp label 1
        
    RET
    
  savesna "hello3.sna",start

цифра 1, - это т.н. временная метка. а 1B в команде JR NZ, - это переход на первую встречную метку с номером 1 назад, если бы нужно было бы вперёд, то нужно бы было, соответственно, писать JR NZ, 1F

справочные материалы

описание системы команд -  https://zx-pk.ru/attachment.php?attachmentid=1132&d=1119205075
документация SjAsmPlus - https://z00m128.github.io/sjasmplus/documentation.html

#34
12:53, 25 дек 2020

0iStalker
> цифра 1, - это т.н. временная метка. а 1B в команде JR NZ, - это переход на
> первую встречную метку с номером 1 назад, если бы нужно было бы вперёд, то
> нужно бы было, соответственно, писать JR NZ, 1F

Мне больше нравятся локальные метки - если после любой обычной метки писать метки с точкой в начале, то они получают имя предыдущей полной метки плюс своё:

main ...
.sub1 ... ; на самом деле это main.sub1

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

> описание системы команд

мне нравится https://clrhome.org/table/ - таблица интерактивна, если наводить мышкой, то показывает краткое описание, растактовки и влияние на флаги

> документация SjAsmPlus
Она еще лежит в самой папке с SjAsmPlus, поэтому отдельные сайты искать не обязательно.

#35
16:36, 25 дек 2020

0iStalker
> DEC B ;dec line counter
> JR NZ, 1B ;if line counter not 0, jump backward to tmp label 1
Этож, кстати, одной инструкцией DJNZ в Z80 делается. :)

#36
19:41, 25 дек 2020

=A=L=X=
> Мне больше нравятся локальные метки - если после любой обычной метки писать
> метки с точкой в начале, то они получают имя предыдущей полной метки плюс своё:
Пoд мой x80 ассемблер я так и организовал.
Чем всякие собачки «@», точки - не такие громоздкие и не мозолят глаза…

+ Показать
#37
20:46, 25 дек 2020

> А давайте сделаем игру

Сказали они и занялись движкописанием на ассемблере...

#38
21:14, 25 дек 2020

Virtex
> Сказали они и занялись движкописанием на ассемблере...

Unity3D пока не завезли

=A=L=X=
> Этож, кстати, одной инструкцией DJNZ в Z80 делается. :)
>
>

Да я потом уже целиком табличку прочитал, но было поздно править сообщение (:  Z80 ассемблер лет 15 не трогал, так что можно сказать, что с 0 осваивать приходится

#39
21:52, 25 дек 2020

0iStalker
> Unity3D пока не завезли

Да можно на встроенном Бейсике писать, а на ассемблере только критичные участки когда.

Хотя если это игра именно для Next с его 28 мегагерц, то ассемблер может и вообще не понадобиться.

Вы ведь даже не определились, что за игра будет. Может, Сокобан какой-нибудь. Его и на оригинальном Спектруме можно на чистом Бейсике наваять.

#40
21:58, 25 дек 2020

Virtex
> Да можно на встроенном Бейсике писать, а на ассемблере только критичные участки
> когда.

Встроенный Васик, - интерпретатор, его производительность настолько плоха, что банальный вывод одной картинки, без всякой анимации, с большими заливками может занять секунд 40 (первые игры на ZX Spectrum так и рисовали)

Virtex
> Вы ведь даже не определились, что за игра будет. Может, Сокобан какой-нибудь.
> Его и на оригинальном Спектруме можно на чистом Бейсике наваять.

Ну мы пока ещё и не начали (у меня, например, пока матчасть страдает... для обычного бы ZX написать что-нибудь бы)

#41
22:04, 25 дек 2020

Alikberov
> Пoд мой x80 ассемблер я так и организовал.
> Чем всякие собачки «@», точки - не такие громоздкие и не мозолят глаза…

Всячески приветствую! :) Без синтаксиса "коротких меток" я уже ассемблер считаю неудобным.
Так или иначе никто на машкодах выдуманных не горит желанием ни писать ни читать.
И так ли это несправедливо?
Я вижу что нет - ведь есть миллионы выпущенных в жизнь процессоров и вычислительных архитектур на которых я лично вообще не собираюсь программировать.
Так что мы с ними квиты. xD

#42
22:14, 25 дек 2020

0iStalker
> Z80 ассемблер лет 15 не трогал, так что можно сказать, что с 0 осваивать
> приходится

Там настолько наживное дело, что чтобы не замедлять процесс готов по скайпу или в других мессенджерах выполнить некий "вводный курс" для тех кто забыл как раз.
Для тех кто не знал оно не будет полезным, но я так давно уже всякой этой тематикой 8 бит из хобби занимаюсь, что мне просто нравится уже и давно.

Прошло более 1 года
#43
15:55, 17 июня 2022

Не смотря на подзабытый ASM, таки готов  Hello World c выводом в Layer2  (по следам стрима от Пьяной Мухи).  Получилось туповато (надо локальные переменные пихать в стек и обращаться к ним через IX/IY, но не нашёл лаконичного способа обращаться по имени, поэтому пока так)

    OPT --zxnext=cspect     ;DEBUG enable break/exit fake instructions of CSpect (remove for real board)
  DEVICE ZXSPECTRUMNEXT
  SLDOPT COMMENT WPMEM, LOGPOINT, ASSERTION
  CSPECTMAP "build/test.map"
  
L2_BANK1_16K  EQU  8
  
  ORG $8000

  MACRO DBGSTOP
    break : nop : nop
  ENDM
  
  MODULE MAIN
start:
  DI
  LD A,$02
  LD BC,$123B    ;Layer2 access port
  OUT (C), A    ;SW ON Layer2
  
  NEXTREG $12, L2_BANK1_16K ;bank 8 is 1st bank of L2 48k buffer
  NEXTREG $56, L2_BANK1_16K*2  ;map bank 9 to 0xC000
  NEXTREG $57, L2_BANK1_16K*2+1 ;map bank 9 to 0xC000
  
4
  LD A, (BANKS)
  NEXTREG $56, A ;select new bank by order 16,17,17,etc
  INC A
  LD (BANKS), A
  
  LD A, 32 ;line counter, 32 lines in 8k bank
  LD (LINEY), A
  
  ;fill all lines in 8k bank
  LD HL, $C000 
3  LD A, 0
  LD DE, $100
2  LD (HL), A
  DEC A
  INC HL
  DEC DE
  JP NZ, 2B
  LD A,(LINEY)
  DEC A
  LD (LINEY),A  
  JP NZ, 3B
  
  ;check for all banks is fill
  LD A, (BANKN)
  DEC A
  LD (BANKN),A
  JP NZ, 4B
  
.mainloop:  
  ;increase shift register
  LD A, (OFFSX)
  NEXTREG $16, A  
  INC A
  LD (OFFSX), A  
  
  ;spin delay
  LD HL, $4000
1
  DEC HL
  LD A,H
  ADD A,0  
  JP NZ, 1B
  
  JR .mainloop ;close main loop

LINEY  DB 0
BANKS  DB L2_BANK1_16K*2
BANKN  DB 6
OFFSX   DB 0

  ENDMODULE

  SAVENEX OPEN "build/test.nex", MAIN.start, $ff40
  SAVENEX CORE 3,0,0
  SAVENEX CFG 7,0,0,0
  SAVENEX AUTO

И таки оно работает в эмуляторе. Его же, в принципе, можно для дебага использовать - точки останова работают,  map файл подхватывается, обзор памяти есть

Изображение

пс.
Надо вообще понять/найти технику прокрутки больше чем одного экрана. То что тут используется, это циклический скролинг одного экрана... не очень полезно для большинства жанров/игр.

#44
16:54, 17 июня 2022

0iStalker
> Надо вообще понять/найти технику прокрутки больше чем одного экрана. То что тут
> используется, это циклический скролинг одного экрана... не очень полезно для
> большинства жанров/игр.

Всё просто - отключается вывод одного столбца знакомест с одного (или из двух) из краёв и он используется для бесшовного обновления после прокрутки на 8 пикселей.

(R/W) 0x1B (27) => Clip Window Tilemap
  bits 7-0 = Coord. of the clip window
  1st write = X1 position
  2nd write = X2 position
  3rd write = Y1 position
  4rd write = Y2 position
  The values are 0,159,0,255 after a Reset
  Reads do not advance the clip position

Разрешение снижается, зато никаких визуальных артефактов.
На самом деле на денди были похожие проблемы с подобной аппаратной поддержкой, но косячащей из-за экономии RAM в том, что известно как attributes clashing в Super Mario Bros.
Готов ответить на любые подобные вопросы, я много в этом дерьме копался. :D

Страницы: 1 2 3 4 59 Следующая »
ФлеймФорумПроЭкты

Тема в архиве.