res 4,(iy+1) как раз и отключает эти лазанья
Вид для печати
Кажется я перехитрил сам себя.
Загрузчик с трейнером на бейсике нифига не работает.
Идея была такой: грузим блок с картинками, выбираем часть, выбираем читы, после этого грузим блок с игрой. Делаем CLEAR, чтобы сработал депакер, который помещен еще чуть ниже всей конструкции. Блок распаковываем, он распаковывается на две части, основной несжатый блок, и снизу его прилеплен маленький сжатый. В несжатый блок записываем выбранные в трейнере читы, потом маленький блок распаковывается и автостартует. Такая схема высвобождает несколько килобайт для бейсик-загрузчика.
Первая тестовая сборка (1190 байт бейсика и переменных) дала следущий результат:
48-ой бейсик ближе к финалу не мог вернутся из одной из подпрограмм, писал, что мол наткнулся на RETURN, а куда возвращаться не знает. Хотя в эту подпрограмму он попал именно по GO SUB. Девичья память. 128-ой бейсик ведет себя уже по другому. Он, повстречав RETURN, не ругается, а просто игнорирует его, перепрыгивает и переходит к следущей строке. Но это всё ерунда, всё это можно победить-перехитрить.
Не перехитрить лишь вот что: перед финальной распаковкой-автозапуском нужно сделать CLEAR 24599. Бейсик это делать не хочет, пишет Ramtor no good. А если не сделать CLEAR, то блок распаковывается и игра стартует, но зависает или глючит. Короче х.з. что теперь делать. Сделать без трейнера что-ли? И то х.з. влезет ли хотя бы выбор части и показ картинок))
ZX_NOVOSIB, а в кодах патчер сделать никак нельзя чтоли?
в трейнере происходил выбор читов. Грубо говоря 0 - нет чита, 1- есть чит. По некоторым причинам запоминание выбора происходило в переменных. Перед первым CLEAR переменные запоминались посредством POKE. Ибо CLEAR обнуляет все переменные. Потом посредством PEEK смотрелись значения и если где-то было 1, то делались соответствующие покесы (таймер, жизнь, защита или ускорение).
Если делать в кодах, то делать в кодах надо всё, абсолютно всё )) Я умею только на бейсике.
Это решение само собой подразумевается. Но получается 4 бейсик программы (трейнер с картинками, загрузчики для 1,2 и демо) и 4 кодовых блока. Это что-то с чем-то )) Не хотелось бы отходить от схемы "1 игра - 1 бейсик загрузчик+несколько кодовых блоков".
---------- Post added at 23:38 ---------- Previous post was at 23:27 ----------
Если была бы в бейсике функция "отгрузить текущую программу, начиная с такой-то строки", то можно было бы в самом начале отгрузить в RAM короткую программулину, а потом в конце её загрузить. Правда получилось бы 128 ONLY, но это пофиг.
Тогда ассемблер :)
Смотри. Все просто. Качаешь вот это:
Sublime Text 3
SjAsm plus
Настраиваешь Sublime Text как написано в этой теме.
Открываешь Sublime Text, создаешь в нем новый файл и сохраняешь под именем rst8.a80. Пишешь в нем такой код:
Выбираешь меню Z80Asm\Build. Получаешь файл rst8.trd рядом с rst8.a80. Открываешь его в эмуляторе, пишешь такой boot.B:Код:DEVICE ZXSPECTRUM48
ORG #8000
Start:
rst #08
db #08
End:
EMPTYTRD "rst8.trd"
SAVETRD "rst8.trd", "rst8.C", Start, End - Start
Запускаешь командой RUN. Получаешь 9 STOP Statement. Ты писал STOP? Нет. Откуда сообщение? Это твоя первая программа на ассемблере его вывела. Как настроишь все - дальше будем писать патчер в кодах.Код:10 CLEAR 32767: RANDOMIZE USR 15619: REM: LOAD "rst8" CODE
20 RANDOMIZE USR 32768
---------- Post added at 21:07 ---------- Previous post was at 20:52 ----------
Если с Sublime Text все выглядит сложно, то тот же код можно написать в блокноте Windows, положить его рядом с SjAsm plus и выполнить в cmd.exe команду
Получишь опять же rst8.trdКод:sjasmplus.exe rst8.a80
Скачал, но как настроить я не понял, в той теме особо ничего не сказано про настройку.Файл создать могу, но только методом копипасты из твоего поста. Потому как полнейшие непонятки со всякими там пробелами, отступами, табами. От руки повторить твой код не могу. Где искать "меню Z80Asm\Bulid" тоже не ясно.Цитата:
Открываешь Sublime Text, создаешь в нем новый файл и сохраняешь под именем rst8.a80. Пишешь в нем такой код:
Выбираешь меню Z80Asm\Build.Код:DEVICE ZXSPECTRUM48
ORG #8000
Start:
rst #08
db #08
End:
EMPTYTRD "rst8.trd"
SAVETRD "rst8.trd", "rst8.C", Start, End - Start
Вот это сработало! (получился трд с кодовым блоком) Но опять-таки только копипастой, ибо не могу понять где в коде пробелы, где табы, где ентеры, где вообще что )))Цитата:
Если с Sublime Text все выглядит сложно, то тот же код можно написать в блокноте Windows, положить его рядом с SjAsm plus и выполнить в cmd.exe команду
Получишь опять же rst8.trdКод:sjasmplus.exe rst8.a80
Спасибо конечно за помощь, но я даже не представляю как должен выглядеть этот патчер. Что ты подразумеваешь под патчером? Что он будет делать? В аттаче трд с моим загрузчиком рекса, можно посмотреть что он делает. (Если грузить не из под boot'a, а напрямую, то можно даже выбрать вторую часть и она запустится, можно выбрать управление, но при старте будет сюрприз )) boot почему-то оказывает какое-то влияние, хотя не должен.) Если патчер в кодах должен будет делать всё то, что делает мой бейсик, то мы запаримся писать такой патчер )) Если он должен делать что-то меньшее, то тогда бейсик останется большим, а большой бейсик не даст ничего запустить..Цитата:
Как настроишь все - дальше будем писать патчер в кодах.
Если честно, то я не понял о чем речь. Можешь привести простой пример? Вот я выложил свой загрузчик. Там есть "красивости", типа выбор нужной части, вызов нужных картинок, выбор читов под суровым взглядом рекса. И как потом стереть все эти красивости и грузить остальное? Что остальное?
Вовсе не обязательно, меню с выбором чего пачтить оставить в бейсике, а в кодах достаточно только самих изменённых байт и их копирование в нужные ячейки.
Что бы исключить из патчера не нужное — из бейсика править лишь несколько байт, которые например содержат "call addr", где addr адрес части патчера.
Но самое красивое решение будет полностью все на ассемблере сделать.
Кто бы спорил ))
Даже простейшее меню с выбором части и выбором "чего патчить" не влезет. CLEAR 24599 - суровая штука, она не оставляет места ни для чего. А из-за обращений к тр-досу, места остается еще меньше.Цитата:
Вовсе не обязательно, меню с выбором чего пачтить оставить в бейсике, а в кодах достаточно только самих изменённых байт и их копирование в нужные ячейки.
Что бы исключить из патчера не нужное — из бейсика править лишь несколько байт, которые например содержат "call addr", где addr адрес части патчера.
Уже делаю нормальный пак софта для начала ассемблерного творчества.
Ассемблер не отличает Tab, один или несколько пробелов. Ему важно чтобы в нужном месте были разделители. Строки с двоеточиями (Start:, например) - это так называемые метки (см. раздел "Структура ассемблерной строки") должны начинаться с первого символа строки, остальное (команды, директивы) - хотя бы после одного пробела, лучше одного Tab'а для красоты.
Оно появляется когда ставишь плагин из темы, что писал выше. Ща сформирую набор софта и инструкцию куда положить чтобы появилось.
Да, в общем-то, перепишем с тобой весь этот Бэйсик-загрузчик на ассемблер, сделаем целиком кодовый загрузчик. Заодно и поднатореешь в кодах, будешь потом сам менять игры как хочешь.
Ага :) Не все сразу. Зато научимся писать их какие хочешь. Или это не цель для тебя?
Итого.
1. Нам еще пригодится для работы эмулятор Unreal Spectrum, ибо у него хороший отладчик. Распакуй скачанный архив (инсталляции нет), переименую в нем файл unreal-p4.exe в unreal.exe и положи рядом с ним (замени, если надо) unreal.ini из вложения.
2. В папке установки Sublime Text 3 есть папка Data\Packages. В нее надо распаковать приложенный архив (так, чтобы там стало 2 папки - User z80asm) и - в Sumlime Text появится пункт меню z80asm. Внутри папки z80asm есть файлы run.bat и build.bat - в первом меняешь путь к unreal.exe на свой, во втором - к sjasmplus.exe. Тогда по командае z80asm\Build у тебя будет компилиться проект, по команде z80asm\Run будет подниматься эмулятор с собранным trd-образом.
Кстати, вот тебе для затравки еще один пример. С boot.B надо сделать те же манипуляции, что и с rst8.a80. Работают кнопки 1-4 и пробел. И не безумно оно сложно :) И размер тебя порадует, хотя при отказе от Basic'а на него в 99% плевать.
PS. У тебя в загрузчике используется RUN "что-то там"CODE. Не делай так. TR-DOS состоит из багов с небольшим вкраплением работоспособного кода, код команды RUN для кодового блока не попал в счастливую безбажную область. Если скомпилишь мой пример и запустишь его из BASIC по-человечески и через RUN "menu" CODE в TR-DOS и нажмешь пробел, почувствуешь разницу :)Код:DEVICE ZXSPECTRUM128
cls = #0d6b
chan_open = #1601
print_string = #203c
LAST_K = #5c08
org #8000
Start:
call cls
ld a,#02
call chan_open
call print_menu
res 5,(iy + #01)
loop: halt
bit 5,(iy + #01)
jr z,loop
res 5,(iy + #01)
ld a,(LAST_K)
cp " "
jr z,exit
sub "1"
jr c,loop
ld hl,item_1 + 1
jr z,switch
ld hl,item_2 + 1
dec a
jr z,switch
ld hl,item_3 + 1
dec a
jr z,switch
ld hl,item_4 + 1
dec a
jr nz,loop
switch:
inc a
xor (hl)
ld (hl),a
ld a,#16
rst #10
xor a
rst #10
rst #10
call print_menu
jr loop
print_menu:
ld de,menu_text
ld bc,end_menu_text - menu_text
jp print_string
exit:
rst #08
db #08
menu_text:
item_1:
db #14, #01, "Item 1", #0d
item_2:
db #14, #00, "Item 2", #0d
item_3:
db #14, #00, "Item 3", #0d
item_4:
db #14, #00, "Item 4", #0d
end_menu_text:
End:
EMPTYTRD "menu.trd"
SAVETRD "menu.trd", "menu.C", Start, End - Start
Ты тока эта... Аккуратнее с моим аттачем - там не совсем то, что в теме про плагин обсуждалось. В частности, там перепаханы run.bat и compile.bat для работы с проектами, кастомными bat-файлами проектов и просто с .a80-файлом. Это все нигде не документировано, так что от греха лучше юзать плагин из темы.
Пак софта делать надо, безотносительно меня и моей лени :) Для всех. Чтобы была одна папка, которую можно было бы распаковать в корень диска С, и чтобы сразу всё это работало, без всякой кутерьмы с перетаскиванием папок и изменением путей! Чтобы "даже ААА смог".
Я думаю нашлось бы не мало людей, которые когда-то начинали кодить на асме, но теперь всё забыли. Кодить в эмуляторе спектрума в GENS (и т.п.) им вряд ли захочется, а с современными инструментами долго разбираться. Если бы сущестовоал пак, описанный выше и к нему краткая инструкция (куда нажать чтобы создать проект, какое расширение должно быть у проекта, куда потом нажать чтобы получился TRD с кодовым блоком), то многие бы, видя такое удобство, простоту и наглядность (вот пишешь код, нажал кнопочку - вот образ с кодовым блоком) решили бы вспомнить молодость и, глядишь, чего-нибудь бы накодили.
Надо отдельной темой всё это запостить. Типа "пишем на ассемблере с нуля". Так же надо раскрыть тему редактирования чужих программ, например ААА делает в запиляторе несколько произведений, но в мега-демо (чтобы по пробелу грузилась следущая часть) он их собрать уже не может, просит других, и никто его не научит, хотя наверняка не так уж сложно вставить загрузку по пробелу следущей части.
с этим ини-файлом унреал не запускается, пишет, что версия не та, надо изменить версию с 38.1 на 38.2. И зачем он вообще нужен этот ини? Я к своему ини привык )) Если в нем что-то важное, то лучше скажи, что именно изменить, я в своём изменю.Цитата:
Итого.
1. Нам еще пригодится для работы эмулятор Unreal Spectrum, ибо у него хороший отладчик. Распакуй скачанный архив (инсталляции нет), переименую в нем файл unreal-p4.exe в unreal.exe и положи рядом с ним (замени, если надо) unreal.ini из вложения.
Проект компилится, и это главное. Но унреал с собранным трд не поднимается, Sublime пишет:Цитата:
2. В папке установки Sublime Text 3 есть папка Data\Packages. В нее надо распаковать приложенный архив (так, чтобы там стало 2 папки - User z80asm) и - в Sumlime Text появится пункт меню z80asm. Внутри папки z80asm есть файлы run.bat и build.bat - в первом меняешь путь к unreal.exe на свой, во втором - к sjasmplus.exe. Тогда по командае z80asm\Build у тебя будет компилиться проект, по команде z80asm\Run будет подниматься эмулятор с собранным trd-образом.
Скрытый текст
[Finished in 0.0s with exit code 4294967295]
[cmd: ['C:\\ZX\\asm\\Sublime Text Build 3065\\Data\\Packages/z80asm/run.bat', 'opros2.a80', '']]
[dir: C:\ZX\asm\us0.38.2]
[path: c:\Program Files\NVIDIA Corporation\PhysX\Common;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem][свернуть]
Впринципе пофиг, можно в проводнике по образу два раза щелкнуть.
Про ран в тр-досе я в курсе. Если после рана кодового блока не планируется возврат к бейсику (а у меня именно так), то можно наверно и ран применять, экономия места типа. Разве нет? )
Там надо много чего изменять чтобы всё работало нормально, плюс в ini-файл 0.38.2 добавлено кое-чего. Так что с каждым новым выходом Унрила, я беру программу WinMerge (бесплатная) и правлю файл нового Унрила.
С паком есть 2 проблемы:
1. Входящие в него продукты (Sublime Text, Unreal) обновляются, за паком надо следить.
2. У каждого свои предпочтения как по продуктам (эмуляторы, редакторы), так и по их опциям. Рекомендуемую "золотую середину" найти трудно.
Да ничего менять не надо. Это было на случай, если Unreal'ом ты не пользуешься вообще. И да, я слоупок, так и не перешел на 0.38.2 (я вообще ни строчки кода с июля не написал :( ). Пользуй свой.
По такому output'у непонятно что случилось. Такое ощущение, что все-таки путь не находится. Попробуй в run.bat в плагине z80asm закомментировать первую строчку @echo off и запости более подробный output после этого.
Надоест при частых правках.
Можно если нет возврата в BASIC и нет повторного входа в TR-DOS из кода (сохранение/загрузка состояния, например). Ибо код после RUN "xxx"CODE исполняется без выхода из TR-DOS, и при повторном входе могут быть всякие сюрпризы.
Можно следить, а можно и не следить, если пак рабочий будет, то этого уже достаточно, а то что он окажется составлен не из самых свежих версий - это ернуда. Другими словами: лучше уж не свежий пак, чем полное его отсутствие. )) Кому надо - сам обновит нужный элемент.
Предпочтения действительно у каждого свои. Но пак должен быть предназначен в первую очередь для начинающих, и для вспоминающих, а эти две категории буду рады любому варианту, лишь бы он был удобней чем GENS и работал сразу, безо всяких танцев с бубном. А те, у кого разные предпочтения, те люди уже прошареные, они и так во всём разбираются, им никаких паков вообще не надо.
38.1 вроде трд косячные сохраняет.. больше 640 кб. А 38.2 вроде нормально.Цитата:
Да ничего менять не надо. Это было на случай, если Unreal'ом ты не пользуешься вообще. И да, я слоупок, так и не перешел на 0.38.2 (я вообще ни строчки кода с июля не написал :( ). Пользуй свой.
Закомментил эту первую строчку, но output остался таким же коротким )) Экспериментируя, сохранил проект с расширением trd (вместо подобающего а80). Нажимаю RUN и вот тут Sublime Text очень даже отлично запускает унреал, а значит путь к нему он прекрасно находит. Другое дело, что унреал ругается, что ему вместо трд подсунули какую-то гадость, но спрашивает, продолжить ли эмуляцию.Цитата:
По такому output'у непонятно что случилось. Такое ощущение, что все-таки путь не находится. Попробуй в run.bat в плагине z80asm закомментировать первую строчку @echo off и запости более подробный output после этого.
Вот держи. У меня так настроено - http://sderni.ru/252854
Прикольненько... У тебя Sublime вызывает Run.bat с одинарными кавычками для аргументов ('.../run.bat', 'opros2.a80', ''), а у меня с двойными. А run.bat при попытке получить имя файла a80 получает его не как opros2, а как 'opros2, соответственно, все валится. Почему так, пока не знаю. Покопаю позже.