PDA

Просмотр полной версии : С чего начать



megozavr
19.12.2015, 22:07
Доброго времени! Надеюсь не ошибся темой. Допустим хочу научиться кодить под speccy (через эмулятор, реала нет), то с чего начать, Конкретно алгоритм изучения?! Изучить структуру - изучить ассемблер- изучить приемы. А может сразу начать с книги как написать игру для zx ?! Коннечно у каждого кодера свой путь но все же. Еще в далеко 2000-м один из профи сказал начать изучать с : Программирование в машинных кодах и на языке АССЕМБЛЕРА - Инфорком'93, своеобразной библии на тот момент. Был неб. опыт на васике, если чес и его подзабыл. Вообщем буду благодарен за конкретный вариант...типа сначала это потом это потом то! Если не трудно то напишите)

jerri
19.12.2015, 22:35
megozavr, давай сначала суровый челябинский житель
1. чего ты хочешь добиться?
2. сколько ты можешь потратить на это время?

megozavr
19.12.2015, 23:02
Спасибо jerri ! В далеком будущем написать свой "шедевр", в настоящее время - есть свободное время, которое хочется потрать с толком! Можно изучать тонну литературы и все без толку, она не пригодиться. Я реалист и понимаю ,что завтра я точно ничего не напишу ничего сверхестественного, но в то же время хочу понять на что стоит обратить внимание, а на что не стоит тратить времени! Мне кажеться вопрос актуальный, зачастую не знаешь за что ухватиться вначале. Как если купил свою первую машину, спрашиваешь советов у бывалых)

Ewgeny7
20.12.2015, 00:04
megozavr, "Как написать игру на ассемблере" (https://yadi.sk/d/LWUFFHTHmLrBd) - классика обучения для Спектрума. Архитектура + ассемблер + интересное изложение.

AndyD
20.12.2015, 00:18
Очень нужная и удобная книжка.
http://vtrdos.ru/book/ZX_TRDOS.ZIP
ZX-Spectrum & TR-DOS для пользователей и программистов - А.Ларченко, Н.Родионов'94.

Oleg N. Cher
20.12.2015, 08:03
с чего начать, Конкретно алгоритм изучения?! Изучить структуру - изучить ассемблер- изучить приемы. А может сразу начать с книги как написать игру для zx ?!megozavr, приветствую!

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

Так что книга "Как написать игру ..." однозначно маст хэв.

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

Поэтому кросс-средства. В случае с ассемблером — однозначно SjASMPlus (http://zx-pk.ru/showthread.php?t=447).

А вот из ЯВУ я бы выделил три направления:

Бейсик — Boriel's ZX Basic (http://www.zxbasic.net). Компилятор языка Бейсик. Вроде неплохой, есть игры на нём. В основном вся инфа по нему на английском.
Си — z88dk (http://z88dk.org) или SDCC (http://sdcc.sf.net). Что сказать. Си есть Си. Чтобы научиться его хорошо применять нужно много лет. z88dk вроде как попроще для старта и богаче библиотеками для ZX.
Оберон (+ Си + ассемблер) — ZXDev (http://sf.net/projects/bb-xdev). Хороший старт в настоящую разработку, полегче освоения Си с нуля, чем-то похоже на Бейсик, позволяет опускаться на низкий уровень и подниматься на высокий. Язык паскалеподобный, в традициях старого доброго Hisoft Pascal, но покруче.

Дальнейшая стратегия зависит от выбора инструмента, личных целей, наклонностей и таланта.

В случае выбора ZXDev сообщаю, что я автор этой среды и буду рад оказать помощь в освоении, поотвечать на вопросы. Чтобы оценить что это — см. ссылку в подписи.

megozavr
20.12.2015, 10:46
Спасибо всем за полезные ответы! Ключевые слова которые помогли определиться:


Соответственно вопрос, хочется научится ассемблеру или сделать игру?

Поэтому начну отталкиваться от книг "Как написать игру", а там попутно и остальное изучу если потребуется. Ну и Zxdev я тоже обязательно посмотрю!

null_device
20.12.2015, 14:55
megozavr, сильно зависит от того, какой конечный результат вам нужен и какой объем знаний\опыта в программировании был ранее.

Для понимания принципов программирования, лучше не придумаешь, чем книги издательства "питер" - "...для пользователей и программистов", "диалекты бейсика" и "как написать игру...". В остальном, могут помочь на этом форуме.

ZX_NOVOSIB
20.12.2015, 17:44
Доброго времени! Надеюсь не ошибся темой. Допустим хочу научиться кодить под speccy (через эмулятор, реала нет), то с чего начать, Конкретно алгоритм изучения?! Изучить структуру - изучить ассемблер- изучить приемы. А может сразу начать с книги как написать игру для zx ?
Сначала почитай общие сведения, потом про бейсик (диалекты бейсика от Питер, и ещё какая-то толковая книжечка есть по бейсику), потом почитай "адаптация к системе tr-dos " Н.Родионова. Потом самое важное - почитай "Тайники ZX". Подробней тут писал: http://zx-pk.ru/showthread.php?p=842961

Почитай про tap формат, проникнись романтикой загрузки игр с магнитофона :) почитай как устроены загрузчики, как перенести игру с ленты на диск. И токо после этой книги читай две книги "Как написать игру", и у инфорком есть серия "...-ая графика".

Oleg N. Cher
21.12.2015, 12:30
Тут больше отвечают с точки зрения кодера, а для хорошей игры важна графика и, главное, концепт. Чтобы играбельно было. Поэтому нужен художник. Ещё важно музыкальное и звуковое оформление. В общем, чтобы сделать ТАК, что все скажут "Это круто" - ещё надо постараться. В целом же разработка игры для Спекки наверное всё-таки не проще, чем для других (и современных) платформ. Помимо сложностей в освоении ассемблера (чтобы бегло кодить на асме тоже нужны годы) есть некий талант игроделанья. Т.е. нарисовать орнамент, фон или шарик, и чтобы было красиво. Вот про себя я могу сказать, что у меня он минимален. Но я придерживаюсь взгляда: "Чтобы стать кузнецом - надо ковать" (французская пословица) - не бояться рисовать, кодить, пищать звуки. На это нужно много времени, и начинать надо со всего подряд, а потом будет видно куда именно следует двигаться. Но, повторюсь, чтобы сделать хорошую игру - нужен разносторонний талант и упорный труд. В случае коллективной разработки сказывается разнопёстрость целей, взглядов и мнений, и на энтузиазме такие проекты обычно двигать трудно. Зато они могут быть лучше сделанных в одиночку. Тут как повезёт...

Bedazzle
21.12.2015, 17:06
Тут больше отвечают с точки зрения кодера

А по мне - важно начать делать маленькие вещи, и постепенно двигаться вперёд. Для начала наплевать на умные большие книжки. Стоит взять пару примеров вроде "затухания" экрана, "бегущей" строки, и попробовать разобраться как работает, поменять параметры, попробовать сделать код понятней, или добавить что-то своё (например, подкрасить, чтобы буквы стали разноцветными).
И тогда станет ясно - есть смысл продолжать на спеке, или вовсе не нужно оно, и лучше пойти, писать под писюк или телефон.

bigral
21.12.2015, 21:32
Во времена web 2.0 можно устроить человеку online игру прямо тут на форуме, подобно книжным играм древности.

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

Вот и тут похожая игрулина по сути УЖЕ началась, человек открыл на форуме тему "с чего начать", всем стало интересно что за человек, что ему надо, что он может, как ему помочь, куда его послать, как его побыстрому пристроить в свой "мирок оберонов..." и т.д. Человек в шоке, растерялся, не знает что делать, на выбор дали пару сцыл по ним куча невнятной инфы. Что делать?

Ваш следующий шаг:
1. узнать какой вообще потенциал у zx spectrum (что он в принципе НЕ может, что он может легко, что он в принципе может но не так просто достичь);
2. узнать какие игры на спектруме есть а каких нет.
3. попросить совета по выбору инструмента для создания конкретного типа игры.
4. попросить помощь в сочинении сценария игры.
5. попросить помощь в создании графики игры.
6. попросить помощь в создании музыки для игры.
7. попросить помощь в создании части кода управления игрой.
8. ...ваша версия дальнейшего развития треда на форуме...

Bedazzle
21.12.2015, 22:51
Во времена web 2.0 можно устроить человеку online игру прямо тут на форуме, подобно книжным играм древности.

Сам я не играл в книжные игры

Идея суперская :) я тоже не играл, но в душу они запали ещё тогда, когда читал о них кажется, в ZX-ревю.

megozavr
22.12.2015, 10:59
важно начать делать маленькие вещи, и постепенно двигаться вперёд....И тогда станет ясно - есть смысл продолжать на спеке, или вовсе не нужно оно

Думаю это правильная мысль)


попросить совета по выбору инструмента

Пока остановился на ZXSpin и его встроенному ассемблеру, ибо с ходу понятно стало как там работать. Вроде удобно. С вот нахваленным SjASMPlus-ом я пока не разобрался, в какой последовательности и как там работать.

Bedazzle
22.12.2015, 11:16
С вот нахваленным SjASMPlus-ом я пока не разобрался, в какой последовательности и как там работать.

1. набираешь текст программы в любимом текстовом редакторе
2. запускаешь бат-файл compile.bat , где внутри что-то вроде


cls
..\..\sjasmplus-win32-1.07-rc7\sjasmplus program.asm
pause


3. на выходе получаешь, к примеру, program.sna
4. запускаешь снапшот в любимом эмуляторе

текст программы например



DEVICE ZXSPECTRUM48

org 25000

CLEAR_SCREEN:
ld hl, 16384 ; начало экрана
ld de, 16384+1
ld bc, 6912-1 ; на единицу меньше, потому что в следущей строке уже заполняем один байт нужным значением
ld (hl),0
ldir ; собственно заполнение экрана нужным байтом

ret

SAVESNA "program.sna",25000

Oleg N. Cher
23.12.2015, 11:06
побыстрому пристроить в свой "мирок оберонов..."Побыстрому не получится, ведь на страже всегда стоят такие как вы. ;)

Он - мирок Оберона - ничем не хуже мирка Спектрума, не так маргинален и имеет выходы на серьёзную разработку. В любом случае, кто-то со мной согласится, что Паскаль-подобный язык для обучения программированию - хороший выбор. Структурирует мышление.

megozavr, можно сказать, я занимаюсь Спектрумом больше 20 лет, накопил много книг, наработок, полюбил игры и спектрумную прессу, возился с кассетным магнитофоном и зажёванными лентами, ломал джойстики. На асме начал кодить в 1993-м, а может и раньше. Не скажу, что я сделал нечто гениальное, это просто путь познания одного человека, исходя из его наклонностей, целей и способностей. Жалею ли я о чём-то? Табожежмой, конечно нет!

А игру своей мечты так и не сделал. В силу разных причин. Желаю быть удачливее!

Но уже в далёком 95-м ощущалось угасание Спектрум-сообщества. Конечно и после того было сделано много интересных вещей, но всё равно некоторая маргинальность того, чем я интересуюсь, всегда чувствовалась. Так вот - мир Спектрума угасает; он маргинален, и я не знаю насколько можно человеку новому получать удовольствие от этого в наше время. А ведь у меня был железный Орель БК-08, а сейчас только эмули, которые хотя и имеют больше возможностей, - всё-таки не железо.

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

Нужно научиться ставить маленькие цели и достигать их, и двигаться дальше. Идея "Мега-проекта" при начальных умениях почти всегда перерастает во что-то совсем другое...

hobot
23.12.2015, 19:03
Напишите под ведомством опытных какой нибудь очень простой игровой сценарий.
Например : прямоугольное игровое поле, шарик, две вертикальные ракетки напротив друг друга.
А местные пусть вас ведут и консультируют. По завершению или забрасыванию такого проекта вы уже сами будете консультировать )))

строго имхо: справочник под рукой, но практиковать лучше сразу.
А эпическую игру писать - 1-му очень тяжело.

- - - Добавлено - - -

тетрис? цветной тетрис? )

Dr.Potapov
23.12.2015, 21:23
тетрис? цветной тетрис? )
Минигольф?
http://dipinteractive.com/?page_id=48 - для экрана 143 × 157px например )) Прекрасно уляжется в возможности спекки.

Пострелухи на 4 кнопки? ))
http://dipinteractive.com/?page_id=315

LW
24.12.2015, 08:21
Какие шарики/тетрисы с нуля.

Вооружаться справочниками по командам ассемблера и ахитектуре спектрума, брать простенькую игру, дизасмить её и вникать как всё работает. Либо пробовать писать простенькие п/п: вывод символа на экран, вывод строки символов и т.п.

Oleg N. Cher
24.12.2015, 12:47
10 Хочу сделать тото [вывести спрайт, пропищать звук, нарисовать букву]
20 Можно ли это сделать на Спектруме?
30 Если ДА ТО ->
40 УРА! Узнать как это сделать. Сделать. GOTO 10
50 ИНАЧЕ ->
60 Вот засада, похоже, я выбрал не ту платформу. ;-)
100 GOTO 100

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

А ещё мир не замыкается на Спектруме, есть много интересных платформ. И всё это необъятно. :v2_dizzy_step:

jerri
25.12.2015, 21:50
Oleg N. Cher, тебе стоит перечитать первый пост человека
А если уж очень хочется начать быстрее
то проще и быстрее освоить construct2 чем изучать языки

Oleg N. Cher
27.12.2015, 22:06
1. Созданием игр с помощью специализированных конструкторов вместо программирования я не занимался, но сомневаюсь, что таким образом можно создать что-то выдающееся.

2. Предлагаю свой путь, как и все вы здесь. Научиться программировать. Только вы за асм, я за асм в обёртке. Тогда нужные процедуры мог бы кодить кто-то из ассемблерщиков, а человек бы сосредоточился именно на написании игры. Си не предлагаю, он в ключиках компилятора запутается. А Boriel's ZX-Basic мне просто не нравится. Вот и написал про ZXDev, но честно ответил, что есть и другие пути. Просто ZXDev как раз и задумывался для начинающих, и язык проще и Си, и асма. А выход есть и на то, и на другое. Предполагает рост мастерства в рамках одной и той же среды - по мере её освоения. Ничего более.

jerri
27.12.2015, 23:18
1. Созданием игр с помощью специализированных конструкторов вместо программирования я не занимался, но сомневаюсь, что таким образом можно создать что-то выдающееся.


весьма самоуверенное высказывание.
разработчики игр с ним не согласны.

Andrew771
28.12.2015, 13:40
Только вы за асм, я за асм в обёртке. Тогда нужные процедуры мог бы кодить кто-то из ассемблерщиков, а человек бы сосредоточился именно на написании игры.
в реальности такая схема не работает, "грязную" работу никто не хочет делать, асмовские процедуры остается писать самому разработчику. Разработчику компилятора тоже.

megozavr
28.12.2015, 15:34
Спасибо всем за ответы. Интересные замечания. Сам пока потихоньку почитываю литературу, пробую небольшие программки набивать. Пока пришел к такому мнению. Во первых освоить действительно не просто, поэтому закралась такая мысль. на начальном этапе почаще использовать уже написанные для каждого момента процедуры, т,е как из кусочков лего (готовых процедур) собирать код будущей программы. Например понадобился управление от кемпстон-джойстика, зачем изобретать велосипед - взял готовый код. Своеобразный модульный подход. Конечно это не освобождает от написания всего остального, но думаю пока такой подход оптимальный.

megozavr
10.01.2016, 12:47
Подскажите как сделать одномерный массив, по типу бейсиковского DIM (10). Скажем в ячейках массива будут находиться игровые данные, с которыми будут производиться операции записи/чтения/сравнения.

helcril
10.01.2016, 13:51
С помощью таблиц. Т.е. определяешь какая структура данных тебе нужна, выделяешь место в памяти, и потом к этим данным обращаешься по их адресам. Если нет проблем с английским, то почитай шестую главу "How to Write ZX Spectrum Games", там все неплохо расписано. Если с английским сложновато - то на следующей неделе я выложу перевод шестой главы.

Bedazzle
10.01.2016, 13:57
Подскажите как сделать одномерный массив, по типу бейсиковского DIM (10). Скажем в ячейках массива будут находиться игровые данные, с которыми будут производиться операции записи/чтения/сравнения.

можно например, так:



SPEED EQU 0
STRENGTH EQU 1
AGILITY EQU 2

org 25000

ld ix, MYDATA

ld a, (ix+SPEED)
call print_my_a

ld a, (ix+STRENGTH)
call print_my_a

ld a, (ix+AGILITY)
call print_my_a

ret

MYDATA:
DS 10, 0

goodboy
10.01.2016, 14:24
индексными регистрами лучше не-пользоваться. программа будет длиннее на байты/такты.

LD A,X

LD HL,ADDR
LD B,0
LD C,A
ADD HL,BC
LD A,(HL)

если возможно ADDR=#XX00
то удобней
LD L,A
LD A,(HL)

Bedazzle
10.01.2016, 15:16
индексными регистрами лучше не-пользоваться. программа будет длиннее на байты/такты.

По мне - для начала с индексными сильно понятнее, потому что адресация напоминает массив. :)

helcril
10.01.2016, 16:26
По мне - для начала с индексными сильно понятнее, потому что адресация напоминает массив. :)

Мне тоже кажется, что для начала так будет понятнее.

megozavr
13.01.2016, 12:49
Доброго дня! Пока изучаю основы, и мне нужно напечатать карту игрового поля. Допустим я нарисовал её в ZX-Paintbrush, размеры 15*15 знакомест. Данные по изображению есть в формате :
; line based output of pixel data:
defb 255......
; line based output of attribute data:
defb 38h....
Какой несложной процедурой её можно распечатать, учитывая что она будет в качестве фона, статична и всегда в одном и том же месте (начальная позиция 3,9 в знакоместах).

Andrew771
13.01.2016, 13:13
Тогда лучше подогнать пиксельные строки под структуру экрана Спектрума. Т.е.:
1-я пиксельная строка 1-й строки знакомест
1-я пиксельная строка 2-й строки знакомест
...
1-я пиксельная строка 8-й строки знакомест
2-я пиксельная строка 1-й строки знакомест
...
2-я пиксельная строка 8-й строки знакомест
...
8-я пиксельная строка 8-й строки знакомест
1-я пиксельная строка 9-й строки знакомест
...
и т.д.

А потом командой ldir всё копировать из памяти на экран (до нее задать hl=адрес памяти, de=первый адрес экрана, bc=количество копируемых байт).

А если карта состоит из повторяемых элементов, то пиксельные строки - это расточительство.

- - - Добавлено - - -


А потом командой ldir всё копировать из памяти на экран (до нее задать hl=адрес памяти, de=первый адрес экрана, bc=количество копируемых байт).
Еще вариант - оставить данные со строками как есть у тебя, а в цикле по количеству пиксельных строк устанавливать hl,de,bc нужными и командой ldir копировать каждую пиксельную строку.

megozavr
13.01.2016, 13:23
Изначально, самой простой идеей было "загнать" каждый элемент карты в символ UDG и распечатывать игровое поле, как из кусочков. Но проблема в том что каждая "ячейка" карты имеет размер 3*3 знакоместа (это соотвественно 9 символов UDG), и "собирать" её становиться нелегко.

Andrew771
13.01.2016, 13:28
У тебя каждая клетка - спрайт. А карта состоит из однобайтовых ID спрайтов. Вот и оперируй ими.

Andrew771
14.01.2016, 14:50
Вот процедура вывода двумерной карты из спрайтов 2х2 знакоместа, взята из моего кросс-компилятора Паскаля (http://zx-pk.ru/showthread.php?t=24967):



; вывод участка карты на экран, состоящей из спрайтов 2х2 знакоместа

map_put ld a,(map_xmax_array)
ld c,a
ld b,0
ld a,(map_y)
dec a
ld e,a
ld d,0
call mul

ld a,(map_x)
dec a
ld e,a
ld d,0
add hl,de

ld de,(map_addr_array)
add hl,de

ld (map_addr_curr),hl

ld hl,(map_xscr)
ld (map_xscr_curr),hl

ld a,(map_height_scr)
ld b,a

map_put_01 push bc

ld a,(map_width_scr)
ld b,a

map_put_02 push bc

ld hl,(map_addr_curr)

ld a,(hl)
and a
ld hl,(map_addr_sprites)
jp z,map_put_04
ld b,a

ld de,36

map_put_03 add hl,de
djnz map_put_03

map_put_04 call map_put_10

ld hl,(map_addr_curr)
inc hl
ld (map_addr_curr),hl

ld hl,map_xscr_curr
inc (hl)
inc (hl)

pop bc
djnz map_put_02

ld hl,(map_addr_curr)
ld a,(map_ymax_array)
ld e,a
ld d,0
add hl,de

ld a,(map_width_scr)
ld e,a
and a
sbc hl,de

ld (map_addr_curr),hl

ld hl,map_yscr_curr
inc (hl)
inc (hl)

ld a,(map_xscr)
ld (map_xscr_curr),a

pop bc
djnz map_put_01

ret


map_put_10 ex de,hl

ld bc,(map_xscr_curr)

LD A,B
RRCA
RRCA
RRCA
LD L,A
AND 31
OR 88
LD H,A
LD A,L
AND 252
OR C
LD L,A

ld a,(de)
ld (hl),a
inc de
inc hl

ld a,(de)
ld (hl),a
inc de
ld bc,31
add hl,bc

ld a,(de)
ld (hl),a
inc de
inc hl

ld a,(de)
ld (hl),a
inc de

ld bc,(map_xscr_curr)

LD A,B
LD H,A
RRCA
RRCA
RRCA
AND A,224
ADD A,C
LD L,A
LD A,H
AND 24
OR 64
LD H,A

dup 7
ld a,(de)
ld (hl),a
inc de
inc h
edup

ld a,(de)
ld (hl),a
inc de

ld bc,#6ff
and a
sbc hl,bc

dup 7
ld a,(de)
ld (hl),a
inc de
inc h
edup

ld a,(de)
ld (hl),a
inc de

ld bc,#6e1
and a
sbc hl,bc

dup 7
ld a,(de)
ld (hl),a
inc de
inc h
edup

ld a,(de)
ld (hl),a
inc de

ld bc,#6ff
and a
sbc hl,bc

dup 7
ld a,(de)
ld (hl),a
inc de
inc h
edup

ld a,(de)
ld (hl),a

ret

map_addr_array defw 0 ; начальный адрес карты, состоящей из однобайтовых id спрайтов
map_xmax_array defb 0 ; размер карты в байтах по горизонтали
map_ymax_array defb 0 ; размер карты в байтах по вертикали
map_addr_sprites defw 0 ; начальный адрес спрайтов карты
map_xscr defb 0 ; столбец экрана, с которого выводить карту
map_yscr defb 0 ; строка экрана, с которой выводить карту
map_width_scr defb 0 ; количество выводимых клеток карты по горизонтали
map_height_scr defb 0 ; количество выводимых клеток карты по вертикали
map_x defb 0 ; горизонтальная координата клетки карты, с которой выводить
map_y defb 0 ; вертикальная координата клетки карты, с которой выводить
map_addr_curr defw 0 ; текущий адрес карты
map_xscr_curr defb 0 ; текущий столбец экрана
map_yscr_curr defb 0 ; текущая строка экрана


; функция беззнакового умножения 16-разрядных чисел
; (C) Kirill Frolov
; idea by Vasil Ivanov
; dehl=de*bc ~730t.

mul ld a,d
and a
jp nz,mul_00
ld ix,mul_00
ld h,b
ld l,c
ld a,e
jp mul_02

mul_00 ld a,b
and a
jp nz,mul_01
ld ix,mul_01
ld h,d
ld l,e
ld a,c
jp mul_02

mul_01
ld hl, 0
ld a, c
ld c, l ; 18

add a, a
jr nc, $+4
add hl, de
adc a, c ; 29
; REPEAT 7
add hl, hl
rla
jr nc, $+4
add hl, de
adc a, c ; 40*7 309
add hl, hl
rla
jr nc, $+4
add hl, de
adc a, c
add hl, hl
rla
jr nc, $+4
add hl, de
adc a, c
add hl, hl
rla
jr nc, $+4
add hl, de
adc a, c
add hl, hl
rla
jr nc, $+4
add hl, de
adc a, c
add hl, hl
rla
jr nc, $+4
add hl, de
adc a, c
add hl, hl
rla
jr nc, $+4
add hl, de
adc a, c
; ENDR

ld c, a
push hl ; 0chl
ld hl, 0
ld a, b
ld b, l ; 33

add a, a
jr nc, $+4
add hl, de
add a, b ; 29
; REPEAT 7
add hl, hl
rla
jr nc, $+4
add hl, de
add a, b ; 40*7 309
add hl, hl
rla
jr nc, $+4
add hl, de
add a, b
add hl, hl
rla
jr nc, $+4
add hl, de
add a, b
add hl, hl
rla
jr nc, $+4
add hl, de
add a, b
add hl, hl
rla
jr nc, $+4
add hl, de
add a, b
add hl, hl
rla
jr nc, $+4
add hl, de
add a, b
add hl, hl
rla
jr nc, $+4
add hl, de
add a, b
; ENDR

; ahl0 + 0cde = hlde
pop de
ld b, l
ld l, h
ld h, a
ld a, d
add a, b
ld d, a
ld b, 0
adc hl, bc
ex de, hl ; 60

ret ; 729t.


mul_02 and a
jp z,mul_n0
cp 1
jp z,mul_n1
cp 2
jp z,mul_n2
cp 3
jp z,mul_n3
cp 4
jp z,mul_n4
cp 5
jp z,mul_n5
cp 8
jp z,mul_n8
cp 10
jp z,mul_n10
cp 15
jp z,mul_n15
cp 16
jp z,mul_n16
cp 20
jp z,mul_n20
cp 32
jp z,mul_n32
cp 50
jp z,mul_n50
cp 64
jp z,mul_n64
cp 100
jp z,mul_n100
cp 128
jp z,mul_n128
jp (ix)

mul_n0 ld hl,0
ret

mul_n1 ret

mul_n2 add hl,hl
ret

mul_n3 ld d,h
ld e,l
add hl,hl
add hl,de
ret

mul_n4 add hl,hl
add hl,hl
ret

mul_n5 ld d,h
ld e,l
add hl,hl
add hl,hl
add hl,de
ret

mul_n8 add hl,hl
add hl,hl
add hl,hl
ret

mul_n10 add hl,hl
ld d,h
ld e,l
add hl,hl
add hl,hl
add hl,de
ret

mul_n15 ld d,h
ld e,l
add hl,hl
add hl,hl
add hl,hl
add hl,hl
and a
sbc hl,de
ret

mul_n16 add hl,hl
add hl,hl
add hl,hl
add hl,hl
ret

mul_n20 add hl,hl
add hl,hl
ld d,h
ld e,l
add hl,hl
add hl,hl
add hl,de
ret

mul_n32 add hl,hl
add hl,hl
add hl,hl
add hl,hl
add hl,hl
ret

mul_n50 add hl,hl
ld d,h
ld e,l
add hl,hl
add hl,hl
add hl,hl
ld b,h
ld c,l
add hl,hl
add hl,bc
add hl,de
ret

mul_n64 add hl,hl
add hl,hl
add hl,hl
add hl,hl
add hl,hl
add hl,hl
ret

mul_n100 add hl,hl
add hl,hl
ld d,h
ld e,l
add hl,hl
add hl,hl
add hl,hl
ld b,h
ld c,l
add hl,hl
add hl,bc
add hl,de
ret

mul_n128 add hl,hl
add hl,hl
add hl,hl
add hl,hl
add hl,hl
add hl,hl
add hl,hl
ret

Спрайты карты

Один спрайт занимает 2×2 знакоместа (в принятом формате – всегда 36 байт с атрибутами). Спрайты идут последовательно в памяти, согласно кодам элементов карты. Коды элементов карты должны быть последовательными от 0 до максимума, не более 255. Количество спрайтов должно строго соответствовать количеству кодов карты.
Формат одного спрайта карты:

NAME
DEFB 3,3,3,3
DEFB 7,31,63,127,120,247,252,249
DEFB 192,240,248,252,124,62,62,62
DEFB 243,243,120,127,63,31,7,0
DEFB 62,62,60,252,248,240,192,0

NAME – метка начала спрайтов элементов карты, имя метки обязательно заглавными буквами. Метка ставится вначале всех спрайтов карты, всегда одна для всех спрайтов карты.
DEFB 3,3,3,3 – атрибуты для каждого из 4-х знакомест спрайта, могут быть различными.
Далее идет по 8 байт изображения для каждого из 4-х знакомест спрайта.


Процедуру несложно переделать под спрайты 3х3, как ты хочешь (задание на дом :) ).

Andrew771
15.01.2016, 11:19
И еще пару-тройку советов, если позволите. :) До них я допёр с помощью инета уже после прочтения книги "Как написать игру", в книгах для начинающих этого не пишут почему-то.

1. В вышеприведенной процедуре используется отдельная процедура mul умножения двух регистровых пар. Вообще-то, это занимает много времени, поэтому для улучшения быстродействия очень желательно делать индексы массивов (в данном случае размерность карты) кратным 2^n (два в степени n), т.е. 4,8,16,32,64,128 или 256 и т.д. Тогда процедура "честного" умножения mul выкидывается полностью, а умножение заменяется банальной последовательностью сложений рег.пары hl самой с собой. Например, умножение hl на 8:
add hl,hl
add hl,hl
add hl,hl

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

2. Вывод спрайтов в книге Капульцевичей производится с расчетом для каждого знакоместа адреса вывода на экран изображения и адреса вывода атрибутов. Это идиотизм, если знакоместа находятся рядом. Проще рассчитать адрес первого знакоместа, а остальные адреса получать смещением от начального - сложением текущего адреса hl и константы. Что я и сделал, см. код ниже с метки map_put_10. Сначала рассчитывается адрес экрана в области атрибутов, затем змейкой друг за другом от него выводятся все 4 атрибута знакомест сразу. Затем то же самое для изображений знакомест - змейкой. Если спрайт 3х3, то змейкой можно выводить сразу 9 знакомест.

3. Не экономь память в коде при выводе изображения, это повышает быстродействие. В книге Капульцевичей вывод 8 строк-байт одного знакоместа производится в цикле:
ld b,8
loop ld a,(de)
ld (hl),a
inc de
inc h
djnz loop

Перцы покруче раскрывают цикл и пишут подряд 8 раз:
ld a,(de)
ld (hl),a
inc de
inc h

ld a,(de)
ld (hl),a
inc de
inc h

ld a,(de)
ld (hl),a
inc de
inc h

...

Или, если написать это короче:
dup 8
ld a,(de)
ld (hl),a
inc de
inc h
edup

Это занимает больше памяти, зато процессору не надо выполнять лишние такты на djnz loop для каждого байта. А особенно если еще встречается в начале и конце цикла какое-нибудь push bc / pop bc, то выгода по тактам очень огромна.

А самые крутые перцы делают вообще через стек: сначала адрес стека SP устанавливают на адрес в экране, затем загоняют по два байта изображения из памяти в рег.пару, а потом выводят в стек-экран командой push. Это занимает еще меньше времени по тактам.

Sergey
20.01.2016, 05:42
индексными регистрами лучше не-пользоваться. программа будет длиннее на байты/такты.


LD A,X

LD HL,ADDR
LD B,0
LD C,A
ADD HL,BC
LD A,(HL)


если возможно ADDR=#XX00
то удобней
LD L,A
LD A,(HL)
Какой тонкий юмор! Я бы даже сказал, утончённый садизм. :)
Заявив о медлительности индексной адресации, привести в качестве альтернативы одну значительно более медленную, а другую одинаковую по скорости процедуры. :) Да к тому же, в отличие от индексной адресации, требующих дополнительных регистров :)

LD r,(IX+n) занимает 19 тактов.

А вторая процедура, хоть, и 11, но требует загрузки рег.пары H, а это уже +10т. Итого: 21т., что медленнее, чем через индексные регистры.
Можно и за 8 тактов HL загрузить - тогда общее время будет 19т.

megozavr
24.01.2016, 11:31
Всем привет!!! Потихоньку продвигаюсь в написании своей концептуальной игры. Уже нашКОДил примерно 40%.
Разобрался таки со скроллами окон. Если кто видел сообщение оно уже не актуально)

megozavr
02.02.2016, 22:23
Подскажите, вот я работаю в zx-spin. Мне нужно понять сколько в кб "весит" мой текущий код. Нужно же знать сколько еще у меня запаса памяти на игру)

jerri
02.02.2016, 23:09
обычно это делается так



org program
;здесь твоя программа начинается

...


display $ ;здесь твоя программа заканчивается
;по $ sjasm пишет текущий адрес

или

display "free: ",#10000-$ ; пишет сколько до конца памяти

Bedazzle
02.02.2016, 23:16
Подскажите, вот я работаю в zx-spin. Мне нужно понять сколько в кб "весит" мой текущий код. Нужно же знать сколько еще у меня запаса памяти на игру)

Вычесть начальный адрес из следующего за последним использованным.

http://i.imgur.com/9MrMXRg.jpg

goodboy
03.02.2016, 10:15
Какой тонкий юмор! Я бы даже сказал, утончённый садизм.
Заявив о медлительности индексной адресации, привести в качестве альтернативы одну значительно более медленную, а другую одинаковую по скорости процедуры. Да к тому же, в отличие от индексной адресации, требующих дополнительных регистров
а чем мне поможет индексный регистр если например номер выбираемого слова из массива изначально неизвестен ???
вот ещё пример

HL==IX

LD L,(IX+0)
LD H,(IX+1)
альтернатива явно короче (размер/такты)

LD A,(HL)
INC HL
LD H,(HL)
LD L,A

megozavr
03.02.2016, 11:09
Bedazzle как я понимаю, также можно посчитать размер и во вкладке memory. Где моя программа размещаеться с адреса 25000 до 29000, что составляет около 4кб.

Bedazzle
03.02.2016, 16:10
Bedazzle как я понимаю, также можно посчитать размер и во вкладке memory. Где моя программа размещаеться с адреса 25000 до 29000, что составляет около 4кб.

Вероятно.
Я Spin не использую (намного удобней собирать в sjasm, и затем грузить в эмуль).

Sergey
11.02.2016, 01:20
а чем мне поможет индексный регистр если например номер выбираемого слова из массива изначально неизвестен ???
Интересно... Забавность ситуации в том, что альтернативу индексной адресации ты предложил, как раз, в ответ на пример для заранее известных смещений. ;)

Yuri80
01.04.2016, 21:49
Доброго времени! Надеюсь не ошибся темой. Допустим хочу научиться кодить под speccy (через эмулятор, реала нет), то с чего начать, Конкретно алгоритм изучения?! Изучить структуру - изучить ассемблер- изучить приемы. А может сразу начать с книги как написать игру для zx ?! Коннечно у каждого кодера свой путь но все же. Еще в далеко 2000-м один из профи сказал начать изучать с : Программирование в машинных кодах и на языке АССЕМБЛЕРА - Инфорком'93, своеобразной библии на тот момент. Был неб. опыт на васике, если чес и его подзабыл. Вообщем буду благодарен за конкретный вариант...типа сначала это потом это потом то! Если не трудно то напишите)

Приветствую.

То что вы спрашиваете, я называю путь "программирования извне". То есть программировать утилитами и средствами из среды PC для Спектрума, а не средствами Спектрума для нужд самого Спектрума (типа Zeus, Gens-Mons и пр.). Я пробовал именно с первого варианта.

Понимаю, что отвечаю с запозданием, но я только вчера тут зарегистрировался. Я сам в программировании не соображал, когда был реальный ZX-совместимый. Немного знал BASIC, а команда RANDOMIZE USR ... казалась дверью в другой неизвестный и яркий мир. К сожалению эта дверь долгое время для меня оставалась наглухо закрытой. Как алхимики в старину, в детстве, я пытался найти такую волшебную программу или "золотой ключик на Бейсике", который внезапно превратит содержимое, прячущееся за неприступной дверью с надписью "RANDOMIZE USR" в понятную BASIC программу. И все время недоумевал, почему же все красочные игры расположены в "таинственных ячейках", а всякая ерунда делается в открытом BASIC... Эх юность-детство. А сбил меня с толку злосчастный ToBoS-FP из игры STEK-D, который только подлил масла в огонь.

Теперь по поводу советов. Каждый человек индивидуален, и поэтому способ, который подходит одному человеку, может не подойти другому.
Лично я с нуля натренировался очень просто практическим способом с теоретической подсказкой, которая всегда лежала под рукой. Еще в 2000-х кто-то из коллег по работе разгребая завалы, презентовал мне бумажное издание книги Родионова и Ларченко "ZX-SPECTRUM для пользователей и программистов". На мой взгляд это самая удачная книга. Так вот, там четко и ясно с 60-й по 95-ю страницу описана работа компьютера и принцип действия команд. Доходчиво описана.
А с практикой все просто. Открываете Spectaculator, загружаете в него любимую игру, выставляете в DEBUGGER'е точки прерывания в интересных, на Ваш взгляд, местах со стартового адреса. И вперед:

http://savepic.net/7975160m.jpg (http://savepic.net/7975160.htm)

Внимательно наблюдаете за курсором который гуляет по командам, а следом за ним меняются значения регистров в окошке и содержимое ячеек. Записываете на бумагу или текстовый файл добытые знания, тренируетесь с короткими подпрограммами. Одновременно вспоминайте, какие действия стоят за теми или этими событиями в Вашей любимой игре. Меняйте содержимое ячеек, смотрите на результат, выписывайте короткие программы и пробуйте их запускать отдельно от игры... Компьютер рестартнулся? Не страшно! Снова вставляйте, анализируйте причину.
В играх, в отличие от сухих теоретических книжных знаний, вы будете запоминать разные методы решения тех или иных проблем, выверты программистов с недокументированными особенностями, половинками индексных регистров, нецелевым использованием машинного стека (например для закраски экрана), и прочими шедеврами. Со временем навскидку будете отсортировывать графическо-текстовые ресурсы, карты полей и переменных, отображаемые командами ассемблера, от последовательности команд реально исполняемой программы.
Первая изучаемая игра пойдет тяжело, но в конечном итоге вы будете раскатывать игры средней сложности довольно быстро, и черпать оттуда бесценный опыт программирования.
Но проще начинать с простых и коротких программ. Отличный базовый навык можно приобрести изучая Debugger'ом пакеты программ SUPERCODE. Они достаточно короткие и станут настоящей находкой.

Следует сразу понять, что BASIC это, грубо говоря, оболочка, которая по сути такая-же машинная программа, расположенная в ПЗУ. Изучая дизассемблер интерпретатора, можно также подчерпнуть массу полезных идей, состоящих из машинных процедур. Поэтому, поковырять отдельные куски BASIC-системы через Debugger тоже стоит.

Создание программ и компиляция. Как мне кажется, проще и удобнее, чем EmulZWin средств просто нет. Никаких дополнительных команд. Одна директива ORG (или несколько в разные точки) с адресом размещения. Все! Создал txt файл в блокноте Windows, написал какую-нибудь простенькую коротенькую программку. Две манипуляции пальцами CTRL+C - CTRL+V в эмулятор, Compile. И... программа готова:

http://savepic.net/7937277m.jpg (http://savepic.net/7937277.htm)

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

Photocor
07.08.2017, 11:22
Как задача-максимум для начала изучения "кодинга" почему-то придумалась игра "Бега" из одноименного игрового автомата 80х. Бежит лошадка по прямой, навстречу ей бугорки, которые надо перепрыгивать. Стал мониторить форум, с чего бы начать. Путевой камень куда можно пойти на этой развилке в виде темы http://zx-pk.ru/threads/5335-posetite-eti-temy-razdela!.html нашел, начал читать легендарную "Как написать игру на ассемблере". Эта тема дала дополнительную пищу для размышлений. Спасибо всем, кому не жалко потратить время на новичков. Может, мы ничего и не добьемся, бросив в самом начале, но сам процесс пробования уже приносит эндорфины - поэтому надо пробовать.

null_device
07.08.2017, 12:44
игра "Бега" из одноименного игрового автомата 80х

Вот этот?

http://a-server.ru/z2/zonizujq/img230266.jpg

Photocor
07.08.2017, 13:37
Вот этот?

Да-да, но мне попадался только полностью черно-белый )) Показалось, что это самая элементарная задачка.

Bedazzle
07.08.2017, 14:03
Может, мы ничего и не добьемся, бросив в самом начале, но сам процесс пробования уже приносит эндорфины - поэтому надо пробовать.

Я тоже хочу попробовать писать (естественно, другое). С удовольствием подскажу если что знаю, или сам поучусь!

SaNchez
07.08.2017, 16:03
Очень приятно осознавать, что ещё есть люди, желающие научится делать игры для спека!:v2_thumb:
Единственно, я бы не советовал распылять силы на такие мелкие игры, вроде лошадок, а сразу пробовать писать что-то более амбициозное - платформер, гонку или шмап.

Photocor
08.08.2017, 10:10
Не знаю, "считается" или нет, если я про ассемблер просто почитаю, а игрушку попробую сделать в Arcade Game Designer ))

Andrew771
08.08.2017, 21:02
я бы не советовал распылять силы на такие мелкие игры, вроде лошадок, а сразу пробовать писать что-то более амбициозное - платформер, гонку или шмап.
Я тоже так думаю. Во-первых, интересно писать что-то новое, в котором встанут реальные задачи и проблемы. Во-вторых простые игры и так 100% напишутся, благо некоторые готовые исходники есть в книжках. Я в свое время сразу начал с 3D, правда завершил игру только через 15 лет (с 13-летним перерывом в разработке) :)

Не знаю, "считается" или нет, если я про ассемблер просто почитаю, а игрушку попробую сделать в Arcade Game Designer ))
Всё считается, не важно на чем сделал. Важно, что получилось. :) Другое дело, возможно в нынешнее время после избалованности на PC и нехватки времени на всё, писать на голом ассемблере подолгу - муторная задача. Так что, переходишь на следующий этап - написание собственного велосипеда для высокоуровневой разработки на Спектруме. Oleg N.Cher и я уже написали свои компиляторы Оберона (http://zx-pk.ru/threads/18472-moshchnaya-sreda-zxdev-dlya-razrabotki-na-pyati-yazykakh-dlya-zx-gotova-k-testirovaniyu.html?highlight=zxdev) и Паскаля (http://zx-pk.ru/threads/24967-zx-like-pascal.html).

SfS
09.08.2017, 03:25
Ну так давно известно, ассемблерные вставки рулят)
SDCC с некоторыми дополнениями вполне удобен. На правах рекламы - среда несколько купирующая недостатки SDCC https://github.com/salextpuru/sdcc-noinit/blob/master/doc/sdcc-noinit.pdf

Пользуйтесь. Спрайты выводятся музыка играется. Пример там есть, микродемо называется.
Есть поддержка клавы zx и ps2 с поддержкой кириллицы. Есть неплохая математическая библиотека. Есть printf. И scanf.

Дока пишется и потихоньку библиотеки добавляются.

Есть возможностл писать плагины для WC.

Shiny
09.08.2017, 05:36
Есть возможностл писать плагины для WC

какого рода? почти все есть.

SfS
09.08.2017, 05:53
какого рода? почти все есть.

На какой фантазии хватит.

Список функций - тут libsrc/libwcplugin/: wcfatfunc.h wckeyfunc.h wcplugin.h

Примеры тут apps/: wcplugin wcptermtst wcpzxmczifi

Я сказал "есть возможность". Откуда я знаю, что нафантазирует кто? Может захочет веб-браузер написать текстовый или ещё что.

Кстати, FTP-клиент не помешал бы, а?:)

- - - Добавлено - - -

И вообще - тема назыается "с чего начать".

Как правило, начинающему нужен быстро видимый результат. Чтобы он не писал полгода на ассемблере "Hello world!".
Иначе просто интерес пропадет.

Вот я и предлагаю то, что уже работает и быстро можно увидеть, как картиночка выводится. Как музычка играется. Управление спрайтами простенькое. Если будет время - напишу простенькую игрушку. Чисто демо под стандартный режим, чтобы продемонстирировать как управление делается.

А если начинать "делай сразу мегапроект" - то начинающий быстро утонет в элементарных для "опытного гуру" вещах и забросит все.

SaNchez
09.08.2017, 06:27
Как правило, начинающему нужен быстро видимый результат. Чтобы он не писал полгода на ассемблере "Hello world!".
Иначе просто интерес пропадет.

Воу, полегче, какие пол-года на хеллоуворлд, ты чего людей пугаешь? :D



org #8000
ld hl,text
loop ld a,(hl)
or a
jr z,$
rst 16
inc hl
jr loop
text db "Hello world!",0


За один вечер можно объяснить, как этот код работает;)

Spectramine
09.08.2017, 06:52
Да-да, но мне попадался только полностью черно-белый )) Показалось, что это самая элементарная задачка.

Не слушайте никого, если хочется написать "Бега/Скачки", пишите их. Во-первых, это хорошая задачка для начинающих, во-вторых, её ещё на Спектруме нет, в-третьих, писать лучше то, что интересно самому.

Bedazzle
09.08.2017, 07:22
jr z,$


я же правильно понимаю, что это бесконечка? И красивей было бы выходить по ret...

SaNchez
09.08.2017, 07:36
Это если тебе есть куда выходить;)

Shiny
09.08.2017, 10:54
Воу, полегче, какие пол-года на хеллоуворлд

Использование Бейсика и процедур - моветон.

SfS
09.08.2017, 13:44
Короче, пока вы тут дискутируете, а налабал:

"Добавлена полуигра, сделанная за 4 часа. Скрипт для конвертации спрайтов. Исправлена небольшая ошибка CONIO"

https://github.com/salextpuru/sdcc-noinit/tree/master/apps/game-loderunner


Вот собранная тапка.

61921

- - - Добавлено - - -

Ну посмотрю я как ты объяснишь за полчаса, что такое регистр, бит, байт, как выполняется команда.

Учитывая, что я довольно долго учил студентов - я знаю, что далеко не все сходу понимают все. И это не признак тупости.

Просто вещи, которые кажутся человеку "в теме" очевидными - для новичка могут быть офигенно непонятны.

А ведь новичку ещё и интерес надо сохранять. Потому самое оно - начинать с готовых процедур, добавляя свои по мере саморазвития.

- - - Добавлено - - -

Из 6к тапки - 2К занимает щрифт. Уровень и спрайты - ещё немногим менее 1К. Ну и гдето 3К - код. Не так уж плохо.

- - - Добавлено - - -

По трудозатратам. Из 4х часов - 2 заняло у меня поиск спрайтов и написание скрита, конвертирующего .PBM в мой формат (в исходник на C).
То есть чистого кодинга - всего около 2 часов.

По-моему - прекрасный результат.

SaNchez
09.08.2017, 14:23
Ну посмотрю я как ты объяснишь за полчаса, что такое регистр, бит, байт, как выполняется команда.


Ну не за полчаса, а за вечер, т.е. часа за три я свой пример объясню любому спектрумисту:) Что такое бит и байт, я думаю, уже даже 12-ти летним детям объяснять не надо.
Полчаса уйдёт на объяснение что такое двоичная и шестнадцатиричная системы счисления, час уйдёт на объяснение регистров и организацию памяти спектрума, и ещё час на разбор примера и закрепление результата;)

SfS
09.08.2017, 14:31
Что такое бит и байт, я думаю, уже даже 12-ти летним детям объяснять не надо.

Ты будешь удивлен, но многие типа-ИТшники из вузов не знают толком что такое "бит" и "байт". "А нам это не надо, мы на СиШарпе пишем!"...

Black Cat / Era CG
09.08.2017, 14:33
При этом большую часть из того, что предполагается объяснять, придется объяснять в независимости от используемого языка.

SaNchez
09.08.2017, 15:03
Ты будешь удивлен, но многие типа-ИТшники из вузов не знают толком что такое "бит" и "байт". "А нам это не надо, мы на СиШарпе пишем!"...
Мне кажется, что неправильно сравнивать вузовских айтишников, заинтересованных в том чтобы получить зачёт, и спектрумистов, заинтересованных разобраться в ассемблере;)

SfS
09.08.2017, 15:22
Добавил я в недоигру две мелодии для AY. :)

- - - Добавлено - - -


Мне кажется, что неправильно сравнивать вузовских айтишников, заинтересованных в том чтобы получить зачёт, и спектрумистов, заинтересованных разобраться в ассемблере;)

Я говорю о том, что не факт, что человек это хорошо знает. Ведь изначальный интерес, как правило - сделать "красиво", а не в битах и байтах.

SaNchez
09.08.2017, 16:55
Короче, пока вы тут дискутируете, а налабал:

"Добавлена полуигра, сделанная за 4 часа. Скрипт для конвертации спрайтов. Исправлена небольшая ошибка CONIO"

https://github.com/salextpuru/sdcc-noinit/tree/master/apps/game-loderunner


Посмотрел код, запустил игру - познавательно, спасибо!:)
Могу сделать то-же самое на асме с комментариями, чтобы показать что на нём не сложнее, если это будет интересно хотя-бы 10 человекам;)

Bedazzle
09.08.2017, 17:54
Добавил я в недоигру две мелодии для AY. :)


Что-то у меня с управлением совсем плохо (запустил в эмузвине как 2+).
Очень сильно лагает, с трудом добежал вправо и вверх. Вниз-влево не получается, или же я неправильно клавижи синклера жму...

P.S.
ах, там таки курсор. :)
тады вопрос снимается :)

SfS
09.08.2017, 20:04
В общем так. Я "его слепила из того, что было". Вообщето там драйвер не совсем игровой у меня. и ещё раз говорю, тот вариант я слепил за 4 часа. Между делом. Как демо возможностей системы.

Что то меня затянуло. Посидел порихтовал. Сделал компрессор уровней. Не гоже 736 байт на уровень тратить.

Управление с лесенками немного порихтовал.

В общем - вот. Исходники тут:) Управление меняется лемянтарно:) https://github.com/salextpuru/sdcc-noinit/tree/master/apps/game-loderunner

Чертей пока нет. И анимации спрайтов. Но заложено.

SaNchez
10.08.2017, 03:41
Я несколько раз порывался пописать что-нибудь для спека на Сях, но не сложилось:)
Причиной этому послужило осознание, что в простых проектах писанины в Си даже больше, чем на чистом асме, а в сложных - слишком пухлый и медленный код.


Могу сделать то-же самое на асме с комментариями, чтобы показать что на нём не сложнее, если это будет интересно хотя-бы 10 человекам
Десять человек наверное не наберётся, поэтому я порылся в старых исходниках, и нашёл свою мини-игру "PaRtY TiMe!" написанную для "Next castle party 2013".
Размер программы 1кб, 600 строк кода, в архиве есть всё что нужно, кроме эмулятора. (Открывать main.asm лучше всего в notepade++, т.к. в других редакторах проблема с табуляцией.)

SfS
10.08.2017, 05:29
Я несколько раз порывался пописать что-нибудь для спека на Сях, но не сложилось:)
Причиной этому послужило осознание, что в простых проектах писанины в Си даже больше, чем на чистом асме, а в сложных - слишком пухлый и медленный код.


Ну используя готовые либы - писанины меньше. По мне так самое мыторное - это каждый раз начинать с элементарных вещей типа "а как тут вывести слово" или "как опросить клавиатуру".

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

- - - Добавлено - - -

Ускорен вывод на экран. Теперь сцена выводится один раз.
При перемещении героя или ещё каких изменениях - перерисовываются только те блоки, которые под ним.
Герой стал падать существенно быстрее:)

https://github.com/salextpuru/sdcc-noinit/tree/master/apps/game-loderunner

SaNchez
10.08.2017, 08:40
Ну используя готовые либы - писанины меньше. По мне так самое мыторное - это каждый раз начинать с элементарных вещей типа "а как тут вывести слово" или "как опросить клавиатуру".

Тут ты лукавишь, наработка своих либ на асме - нормальное явление. Вряд-ли кто-то начинает каждый новый проект с нуля. Например, у меня есть уже устоявшиеся либы: звуковой движок и движок звуковых эффектов, опрос клавиатуры и джойстиков, вывод текста 40 символов в строке, драйвер расширенной памяти, инициализатор im2 и его обработчик, распаковщик архивов MegaLZ, набор макросов вроде DOWN_HL и ADDA HL, и т.д. Они, конечно, совершенствуются от проекта к проекту, но с нуля я их не переписываю;) При этом человек, не разбирающийся в ассемблере вынужден пользоватся только готовыми либами.
Но это так, моё субъективное мнение. Каждый кодит на чём ему нравится;)

- - - Updated - - -

И ещё забыл сказать. Вот чего в моих либах нет и видимо никогда не будет, так это графического движка, который я каждый раз переписываю заново:v2_dizzy_coder: Для меня на Cпектруме, с его ограниченными ресурсами, сделать что-то универсальное и при этом производительное - неразрешимая задача. И при этом, разработка каждый раз нового движка - это пожалуй самая интересная часть разработки:)

SfS
10.08.2017, 08:42
Обновлена дока.
Добавлено описание на тему "как добавить свою программу и библиотеку".
Добавлено описание на тему "что нам нужно, чтобы система сборки взлетела".

https://github.com/salextpuru/sdcc-noinit/blob/master/doc/sdcc-noinit.pdf

- - - Добавлено - - -



И ещё забыл сказать. Вот чего в моих либах нет и видимо никогда не будет, так это графического движка, который я каждый раз переписываю заново:v2_dizzy_coder: Для меня на Cпектруме, с его ограниченными ресурсами, сделать что-то универсальное и при этом производительное - неразрешимая задача. И при этом, разработка каждый раз нового движка - это пожалуй самая интересная часть разработки:)

Потому я и сказал "заново". Хотя, если делаешь не игру, а что-то другое, например утилиту, то тут как раз либы вывода графики и текста - самое оно.

Shiny
10.08.2017, 08:50
И с этого начать? не смешите мои копыта. Либу будет писать тот, кто наберет опыта в программировании.

SfS
10.08.2017, 09:33
И с этого начать? не смешите мои копыта. Либу будет писать тот, кто наберет опыта в программировании.

Писать то зачем? Использовать готовую. А потом уж когда-нибудь - писать.

Shiny
10.08.2017, 09:48
Писать то зачем? Использовать готовую. А потом уж когда-нибудь - писать.

шо, все есть уже? тогда это рай.

SfS
10.08.2017, 11:27
шо, все есть уже? тогда это рай.

Ты не так давно писал "УЖЕ ПОЧТИ ВСЕ ЕСТЬ". http://zx-pk.ru/threads/25944-s-chego-nachat.html?p=923426&viewfull=1#post923426

Теперь ничего нет уже.

Зачем начинающему "все" ? Большинство хотят для начала:

1. вывод текстов и картинок.
2. Вывод музыки.
3. опрос клавы-джойстика.

Shiny
10.08.2017, 11:46
Ты не так давно писал "УЖЕ ПОЧТИ ВСЕ ЕСТЬ".

к словам придираться не надо.

jerri
10.08.2017, 14:30
И с этого начать? не смешите мои копыта. Либу будет писать тот, кто наберет опыта в программировании.

с чего начать была первая страница
а тут уже восьмая
можно и наработки сделать за 2 то года

SfS
10.08.2017, 20:03
Добавлены разделы по передаче параметров в функции на ассемблере и возврату значений в С.
Добавлен глоссарий по утилитам и прочему.

https://github.com/salextpuru/sdcc-noinit/blob/master/doc/sdcc-noinit.pdf

SfS
11.08.2017, 13:06
Добавлены примеры функций, иллюстрирующие передачу и возврат значений.
Каталог apps/example-0. Добавлено описание примеров в документацию. (раздел 4.6. Примеры функций на ассемблере)
https://github.com/salextpuru/sdcc-noinit/blob/master/doc/sdcc-noinit.pdf

andrews
11.08.2017, 14:38
Поскольку я давно здесь не был, то не знаю, реализовали ли проект "Библии геймкреатора для ZX Spectrumа". Кто-то собирался лет десять тому назад выбрать из всех жанров лучшее из доступного с исходниками, обработать их и прокомментировать. Тогда и движков готовых как бы не нужно, а для начинающих быстрый и эффективный старт. Относительно C все прекрасно, только опять таки из-за своего отсутствия долгие годы не знаю добавили работу с регистрами z80 и сделана ли оптимизация для недокументированных команд?

SfS
11.08.2017, 14:48
[QUOTE=andrews;923693Относительно C все прекрасно, только опять таки из-за своего отсутствия долгие годы не знаю добавили работу с регистрами z80 и сделана ли оптимизация для недокументированных команд?[/QUOTE]

Оптимизация делается только на ассемблере. Ручками:) Но многие начинали на бейсике - там куда меньше возможностей, чем на C.
Да и проще в "неоптимальный код" вставку впендрючить в критичное место, чем с нуля на асме писать. Для начинающего это критично.

- - - Добавлено - - -

Такое ощущение, что в этой теме все говорят, как начинать НЕ НАДО. :) Что ни посоветуют - все не так.

ЛЮДИ! НАЧИНАЙТЕ КАК ХОТИТЕ! НЕ СЛУШАЙТЕ НИКОГО! С БЕЙСИКА, АССЕМБЛЕРА, С, ФОРТА - КАК ХОТИТЕ! ГЛАВНОЕ - НЕ ЗАКАНЧИВАЙТЕ! :)

Shiny
11.08.2017, 16:34
Коль вбросы пошли, то напомню один популярный ответ на известном форуме

http://i96.fastpic.ru/big/2017/0811/48/ac29563c29676497421d58251b2e5c48.jpg

OrionExt
11.08.2017, 16:48
А мне нравится, легко читается. SfS продолжай, и никого не слушай.

SfS
11.08.2017, 18:33
Добавлены драйвера клавиатуры ZX и PS2.
test-libui - пример как переключать драйвера и переопределять методы окна.

Оказывается на ZX можно и ООП применить :) И даже получается :)

https://github.com/salextpuru/sdcc-noinit/blob/master/apps/test-libui/testui.c

- - - Добавлено - - -

Вот скриншоты некоторых программок из тестовой SDCC-NONINIT.

Может какой "начинающий" соблазниться.

Тут же несколько готовых TAPок в архиве.

SfS
12.08.2017, 09:58
61942

Добавил чертей, которые пока вполне бессмысленно бегают по лестницам и турникам. Оживляют картинку.
Пока что они тупые и вреда не причиняют. Но скоро обозлятся и поумнеют:)

SfS
15.08.2017, 11:55
Немного лирики https://github.com/salextpuru/sdcc-noinit/blob/master/doc/sdcc-noinit.pdf

Andrew771
17.08.2017, 00:07
В общем, я утащил концепцию, карту и спрайты у SfS (который наверно тоже стянул у известной игры) и написал на ZX Like Pascal такой же Lode Runner, для сравнения. :)
Качнуть компилятор и исходник можно тут
(http://zx-pk.ru/threads/24967-zx-like-pascal.html).
Скомпилированный SNA в этом сообщении.

Полный текст исходника, кому лень качать:



program lode_runner;
const
volume_devils=7;
treasures_max=5;
xmax=32;
ymax=22;
var
i,j : byte;
map: array[1..22,1..32] of byte =[
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,
1,1,1,1,1,1,1,3,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,
0,0,0,0,0,0,0,3,4,4,4,4,4,4,4,4,4,4,4,4,4,0,0,0,0, 0,0,0,0,0,0,0,
0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,
0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,
0,0,0,0,0,0,0,3,0,0,0,1,1,3,0,0,0,0,0,0,0,5,0,0,0, 0,0,0,0,0,0,0,
0,0,0,0,0,0,0,3,0,0,0,1,1,3,0,0,1,1,1,1,1,1,1,1,3, 1,1,1,1,1,1,1,
0,0,0,0,0,0,0,3,0,0,0,1,1,3,0,0,0,0,0,0,0,0,0,0,3, 0,0,0,0,0,0,0,
0,0,0,0,0,0,0,3,0,0,0,1,1,3,0,0,0,0,0,0,0,0,0,5,3, 0,0,0,0,0,0,0,
1,3,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,3,1,1,1,1, 1,1,1,1,1,1,1,
0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0, 0,0,0,0,0,0,0,
0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0, 0,0,0,0,0,0,0,
0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0, 0,0,0,0,0,0,0,
0,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,3,0,0,0,0, 0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,3,0,0,0,0, 0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,3,4,4,4,4,4,4,4,3,0,0,0,0, 0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,3,0,0,0,0, 0,0,0,0,0,0,3,
0,0,0,0,0,0,0,0,0,5,0,0,3,0,0,0,0,0,0,0,3,0,0,0,0, 5,0,0,0,0,0,3,
0,0,0,0,3,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,1,1,1,1,1, 1,1,1,1,1,1,3,
0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,3,
0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0, 0,0,0,0,0,0,3,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1];

{0-проход, 1-кирпич неуничтожимый, 2-кирпич уничтожимый,
3-лестница, 4-канат, 5-сундук, 6-герой, 7-черт}

x_hero: byte = 17;
y_hero: byte = 19;
treasures_hero: byte = 0;

devil: array[1..7,1..3] of byte
=[1,1,1, 17,6,2, 32,6,3, 17,9,4, 32,9,1, 6,13,2, 32,18,3];

key1,key2: byte;
x_devil,y_devil,d_devil,flag1: byte;

begin

border(0);
textbackground(0);
textcolor(6);
VirtScreenClear;
gotoxy(0,22);
write('TREASURES: ',treasures_hero);
textcolor(4);
gotoxy(0,23);
write('Demo Game of ZX Like Pascal');
textcolor(6);
MapSet(map,map_sprites,0,0,32,22);

repeat

MapPut1x1(1,1);

SpritePutClear(HERO_SPRITE,x_hero-1,y_hero-1);
for i:=1 to volume_devils do
SpritePutClear(DEVIL_SPRITE,devil[i,1]-1,devil[i,2]-1);

VirtScreenPut;

ReadKey(key1,key2);
if y_hero<ymax then
if map[y_hero,x_hero]<>4 and map[y_hero,x_hero]<>3 then
if map[y_hero+1,x_hero]=0 then
begin
y_hero:=y_hero+1;
key1:=0;
end;

case key1 of
79:
if x_hero>1 then
if map[y_hero,x_hero-1]<>1 and map[y_hero,x_hero-1]<>2
then x_hero:=x_hero-1;
80:
if x_hero<xmax then
if map[y_hero,x_hero+1]<>1 and map[y_hero,x_hero+1]<>2
then x_hero:=x_hero+1;
81:
if y_hero>1 then
if map[y_hero,x_hero]=3
then y_hero:=y_hero-1;
65:
if y_hero<ymax then
if map[y_hero+1,x_hero]=0 or map[y_hero+1,x_hero]=3 or map[y_hero+1,x_hero]=4
then y_hero:=y_hero+1;
end;

if map[y_hero,x_hero]=5 then
begin
SoundEffect(1,100,255);
map[y_hero,x_hero]:=0;
treasures_hero:=treasures_hero+1;
gotoxy(0,22);
write('TREASURES: ',treasures_hero);
end;

for i:=1 to volume_devils do
begin
flag1:=0;
x_devil:=devil[i,1];
y_devil:=devil[i,2];
d_devil:=devil[i,3];

if y_devil<ymax then
if map[y_devil,x_devil]<>4 and map[y_devil,x_devil]<>3 then
if map[y_devil+1,x_devil]=0 then
begin
y_devil:=y_devil+1;
flag1:=1;
end;

if flag1=0 and d_devil=1 then
if x_devil>1 then
if map[y_devil,x_devil-1]<>1 and map[y_devil,x_devil-1]<>2 then
begin
x_devil:=x_devil-1;
flag1:=1;
end;

if flag1=0 and d_devil=3 then
if x_devil<xmax then
if map[y_devil,x_devil+1]<>1 and map[y_devil,x_devil+1]<>2 then
begin
x_devil:=x_devil+1;
flag1:=1;
end;

if flag1=0 and d_devil=2 then
if y_devil>1 then
if map[y_devil,x_devil]=3 then
begin
y_devil:=y_devil-1;
flag1:=1;
end;

if flag1=0 and d_devil=4 then
if y_devil<ymax then
if map[y_devil+1,x_devil]=0 or map[y_devil+1,x_devil]=3 or map[y_devil+1,x_devil]=4 then
begin
y_devil:=y_devil+1;
flag1:=1;
end;

if flag1=0 then
begin
d_devil:=d_devil+1;
if d_devil>4 then d_devil:=1;
end;

devil[i,1]:=x_devil;
devil[i,2]:=y_devil;
devil[i,3]:=d_devil;

end;


until treasures_hero=treasures_max;

ScreenThaw;
VirtScreenClear;
gotoxy(28,12);
write('ПОБЕДА!');
VirtScreenPut;

end.


MAP_SPRITES
defb 0, #00,#00,#00,#00,#00,#00,#00,#00
defb 2, #00,#fb,#fb,#fb,#00,#df,#df,#df
defb 2, #00,#fb,#fb,#fb,#00,#df,#df,#df
defb 7, #42,#42,#7e,#42,#42,#42,#7e,#42
defb 7, #00,#ff,#00,#00,#00,#00,#00,#00
defb 6, #00,#38,#2c,#7e,#42,#42,#7e,#00
HERO_SPRITE
defb 1
defb 0,0,71, #5a,#52,#3c,#10,#10,#18,#14,#14
DEVIL_SPRITE
defb 1
defb 0,0,3, #5a,#52,#3c,#10,#10,#18,#14,#14

SfS
17.08.2017, 06:05
Прикольно)
Ухожу в отпуск. Так что не теряйте. буду следующие три недели тут редко)

Andrew771
17.08.2017, 10:54
Хорошо тебе отдохнуть! Я тоже в отпуск на след.неделе. И так пищи для размышлений много дали :)

Alex Rider
17.08.2017, 19:36
какого рода? почти все есть.
Нет бродилки\копировщика trd\scl\tap\Интернет. Нет плеера saa. Нет универсального вьювера, который может казать все.

Shiny
17.08.2017, 19:40
Нет плеера saa

saa - это от СэмКуп?



Нет универсального вьювера, который может казать все

если речь о Total Commander, то по мне хватает. Все настраиваемо.

SfS
05.12.2017, 19:05
После отпуска началась работа и никак не отпустит. Но что-то меня заинтересовала тема коммуникаций на любом ZX малой кровью. Для этого я начал делать библиотеку на базе протокола SLIP, чтобы обмениваться между Z80 и коммуникационным процессором ESP8266. Пока все на С. Сегодня наконец сделал кросс-Makefile и засунул это в SDCC-NOINIT.

https://github.com/salextpuru/sdcc-noinit

Первый тестик простой работает. Для PC и ESP8266 все компилируется. Надеюсь, что скоро что-нибудь взлетит.

Ещё я выпилил из SDCC-NOINIT кучу мусора, который там болтался ниочёмно.

Эх.. Мечта - сделать лодераннер на два игрока по сети))) Во было бы круто! Но до этого как до пекина.

SfS
12.12.2017, 18:36
Наконец-то дошли руки до теста SLIP-протокола на живом спеке. Скорости хватает, но размер кода на С несколько удручает. Да и фиг с ним. Если уложусь в страницу - это будет прекрасно. Оптимизировать можно и потом.