уж не российский флаг ли в итоге получится? реала/эмуля под рукой нет, проверить не могу...
Вид для печати
если не ошибаюсь в эмуле Z80Stealth есть редактор картинок на бордюре,
который потом ваше творение превращает в программу.
.................................
а вот и моё творение на бейсике
http://savepic.ru/6511243.png
до появления формата SCL, TRD собирали/разбирали из Hobeta,там было строго; один блок- один файл. выручала сортировка по-времени создания файла) иначе правильный порядок определить иногда было сложно
http://savepic.ru/6494874.png
в этом примере хорошо что в именах файлов есть цифры.
В итоге решил сделать самый простейший TAP, безо всяких выкрутасов. Пойдет такой? Если замечаний нет, то делаю второй левел и пощщу в первом посту профильной темы в разделе игры и на ВоС. Только если на ВоСе постить, то мне нужен английский текст, короткое описание что это и зачем )) Что мол можно из конца в начало, можно проваливаться в дырки, которые в красном грунте.
Upd.: в аттаче оба левела.
Продолжая темуфлудабордер-флагов...:rolleyes: В общем в аттаче .tzx рекса с немного доработанной заставкой, грузить на нормальной скорости, строго в режиме пентагона из 48-ого бейсика! Старым добрым LOAD "" И желательно в настройках эмуля сделать бордер побольше.
Хотел такую же заставочку сделать для своего +2B - не получается, хоть ты тресни! :(
Слегка перезалил, ибо на скорпионах и т.п. не работала из-за out 253,a.
Теперь out (c),a и, короче работает. Правда я теперь не понимаю почему :D
Сначала у меня в коде вообще не было
LD ВС,#7FFD
LD A,16
OUT (C),A
И видимо из-за этого, в 128-ом режиме (не usr0), когда хруст юзал буфер принтера, то что-то шло не так, и в игре спрайт диззи был косячный. Потом я добавил это включение 48-пзу перед самой распаковкой хруста и всё сразу стало окей (за исключением нерабочести на скорпах).
Теперь же я не просто добавил этот код, а заменил им все out 253,a. Всё стало совсем окей, но этот код, включая пзу-48, и освобождая хрусту буфер принтера, разве не должен убивать 128-ой бейсик? Почему он его не убивает? И почему хруст теперь, юзая буфер принтера, не портит спрайт диззи? Как так получилось, что бейсик-128 не убивается, но хруст, имея буфер в буфере принтера перестаёт "косячить спрайт"? :v2_conf2:
goodboy, да вроде разрешены:
https://i.imgur.com/1CRZMRi.png
По RET у меня идёт возврат в бейсик, и я думал, что в этом месте всё должно улететь в тар-тарары. Но не улетает. Мало того, можно вообще выйти даже в редактор 128 бейсика, и всё будет ок. И в буфере принтера не нули, а всякая фигня. Но почему тогда эта фигня не мешает хрусту? И почему она раньше ему мешала, а с этим кодом уже не мешает? :v2_wacko:
а почему должно улететь ???
и для меня загадка зачем ты запрещаешь прерывания перед входом в trdos
и зачем разрешаешь после (trdos их сама разрешает после загрузки блока)
...........
ну а про поднятие вопросов в совершенно неподходяшей теме я уже молчу....
...........
а зачем ты разрешаешь прерывания после распаковки основного блока ?
goodboy, модеров я уже попросил отщипнуть в более подходящую тему, так что продолжим :-)
Про прерывания интересно, обсудим чуть позже. Для начала надо с кое чем другим разобраться.
Как всё начиналось:
После этого я решил вообще от этой 65-ти байтной процедуры отказаться, и решил буфер принтера вообще не трогать, ничего туда не грузить, и пзу 48 не включать. А зачем? Если буфер принтера мне не нужен?.. Потом всё шло хорошо до той поры, пока я не обнаружил, что хрум портит основной блок, в конце байт 70, из-за чего в игре пропадали алмазы. Я не верил своим глазам, но факт на лицо. А хруму надо 112 байт для буфера, и он у меня юзал в качестве буфера область принтера, но с адреса 23433 (в нём это по умолчанию). И никакого конфликта не возникало из-за размещения буфера там, я проверял во всех режимах - всё тип-топ, токо без алмазов ))Цитата:
Из бейсика принудительно включить нужное ПЗУ не получится, надо в ассемблере выполнитьКод:ld bc,#7ffd
ld a,#10
out (c),a
Потом я долго искал замену хруму, чуть не поседел, но вовремя вспомнил, что есть хруст1.3. Хруст блок не портил, и алмазы оставались на месте. В 48-ом и usr0 всё вообще было тип-топ! Но в 128-ом стал портится спрайт диззи. Я решил что это из-за буфера принтера, ведь хрусту уже надо под буфер не 112, а 256 байт, и он у меня занимал весь буфер принтера целиком. И я перенес буфер хруста в экранную область для теста. Тест сработал, спрайт не портился, но портился экран. Я уж думал сохранять экран в другой страничке, и потом его восстанавливать...
Но вовремя вспомнил про
ld bc,#7ffd
ld a,#10
out (c),a
Я вставил этот код перед распаковкой основного блока в 128-ом сценарии и всё сразу резко стало тип-топ! И я подумал, что этот код убивает бейсик-128 и, соответственно, область принтера очищается, и буфер хруста в этой области теперь отрабатывает без ошибок, и именно по этому спрайт диззи теперь не портится. Но этот код у меня стоял в таком месте, что возврата к бейсику уже не было. И я не мог проверить свои догадки.
Но у меня в коде загрузчика были переключения страниц (через out 253, а), и потом я понял, что на скорпионе будет фейл. И я заменил все проблемные места на код типа
ld bc,#7ffd
ld a,#10
out (c),a
И одно из проблемных мест было в том месте, после которого планировался возврат в бейсик. И я думал, что раз подобный код устраняет конфликт хруста и бейсика в буфере принтера, то и сам бейсик он тоже убьёт, и что по этому при попытке вернутьсяв бейсик будет глюк. А глюка нет.
Это конечно хорошо, что теперь всё работает, и на скорпе в том числе, но плохо то, что я не понимаю почему: и конфликт в буфере принтера исчезает (хруста и 128бейсика), и 128бейсик при этом нормально работает.
:v2_dizzy_wall:
goodboy, не при разжиме картинки, а при разжиме основного блока игры.
- - - Добавлено - - -
щас попробую наглядный трд собрать.
Да такой код уже есть от словака, 45 байт, дело то не в этом.
В данном конкретном случае (с диззи на украинском), не слишком требовалось убивать 128 бейсик. И уж тем более ценой лишних 45 байт.
- - - Добавлено - - -
А я вот нихрена не понял :D
У меня после разжима нет никаких команд по запрещению/разрешению прерываний. Значит надо было между разжимом и стартом игры вставить DI? (в хруме/хрусте это можно автоматом ставить, но там по умолчанию EI)
Хотел показать наглядно, но что-то пошло не так. Единственное, что наглядно видно, это то, что хрум портит блок, и алмазы исчезают.
По задумке, ещё должно было наглядно видно, что хруст, юзая буфер принтера, при запуске в 128 режиме, портит спрайт. Но сейчас почему-то не портит. Это прерывание не успевает проскочить?
У меня в полноценном загрузчике оно проскакивало, и поэтому от хруста спрайт портился? Но когда я вставил
ld bc,#7ffd
ld a,#10
out (c),a
То.... то что изменилось? Почему спрайт перестал портится?
Ща насоветуют. если пишешь в 23388, то после HALT значение обновится.
Код сжатия хруста релоцируем вроде? запихни поудобнее, а не в буфер принтера(я для загрузки и распаковки кректр пихал на экран).
Ладно, работает да и ладно. Это если б не работало... )
Поговорим о чём-нибудь другом, например о прерываниях.
Ну я просто смотрю вот например статья за авторством Wlodek Black. Там DI после каждого чиха, я подумал так правильно. И в конце EI.
Или вот даже в библии вот чо сказано:
https://i.imgur.com/8WiMwcY.png
Получается EI не обязательно апосля ставить? А DI после каждого чиха? Тоже не обязательно?
с DI работает.
покажи файлы что ли, быстрее будет исправить.
Да ничо исправлять не надо. Всё работает.
Гудбой спросил зачем я запрещаю до тр-доса и разрешаю после, я ответил на что я ориентировался. Там у Влодека в примере вообще ещё и XOR A присутствует. Зачем он там?
Код:DI
LD HL,50000 ; адрес загрузки упакованной картинки
LD DE,(#5CF4) ; трек/сектор
LD BC,#0F05 ; 15 (#0F) секторов для чтения
XOR A
CALL #3D13 ; вызов TR DOS
CALL 50000 ; распаковка картинки на экран
DI
LD HL,28964 ; адрес загрузки основного блока
LD DE,(#5CF4) ; трек/сектор
LD BC,#4F05 ; 79 (#4F) секторов для чтения
XOR A
CALL #3D13
DI
ZX_NOVOSIB, цитируя библию ты совсем не понимаешь смысла прочитанного.
в приведённом примере сохраняется/восстанавливается режим прерываний (иногда это важно)
Wlodek запрещает прерывания перед переключением страниц.
если ты используешь точку входа 15635 для загрузки секторов то по окончанию (и во время) работы прерывания будут разрешены.
Каюсь, святой отец, грешен :redface:
- - - Добавлено - - -
Ещё один момент. К запакованным хрустом блокам (картинка, музыка) я обращался через call и всё было окей, но када я обращался к основному тяжёлому блоку, то по call всё улетало чёрти-куда. Пришлось городить череду JP-костылей - стало всё окей. Почему так?
Думается мне, что при обращении к тяжёлому блоку что-то происходило со стеком и терялся адрес возврата для CALL. Проанализируй этот момент.
так и есть, данные при разжиме перекрывают стек,
а этот красавец ещё и прерывания разрешает.
а потом рассуждает о порче спрайтов
скорее всего да. Что мешает проверить самому? ;)
Проверить самому??
Хм.. А это идея.
Так лучше???
Есть какие замечания?Код:ORG 23894
LD BC,#1605
LD DE,(23796)
LD HL,42000
CALL 15635
CALL 42000
DI
LD BC,#7D05
LD DE,(23796)
LD HL,26000
CALL 15635
LD A,19
LD BC,32765
OUT (C),A
LD (65532),A
LD A,16
OUT (C),A
LD A,(65532)
CP 19
JR Z,ZX48
ZX128 LD A,19
LD BC,32765
OUT (C),A
LD BC,#1105
LD DE,(23796)
LD HL,49152
CALL 15635
CALL 49152
LD A,16
LD BC,32765
OUT (C),A
LD SP,24137
CALL 26000
LD A,1
LD (29326),A
RUN JP 24158
ZX48 LD SP,24137
CALL 26000
JR RUN
Вроде убрал всё лишнее (DI, EI и прочее). При упаковке хрустом выставлял в параметрах блока DI. Только када картинка на экран рисуется, то я там х.з. чо происходит, поэтому на всякий случай поставил DI сразу по возврату из "картинко-показывалки". Заодно избавился от бейсика вообще, - в монолоадере было 3 строки, стала одна )))
CP и JR Z оказались отличной заменой бейсик-нагромождениям "if peek x=y then randimze usr z"
лишнее телодвижение. проще включить страницу 6, потом 3Код:LD A,19
LD BC,32765
OUT (C),A
LD (65532),A
LD A,16
OUT (C),A
LD A,(65532)
CP 19
JR Z,ZX48
ZX128 LD A,19
LD BC,32765
OUT (C),A
при проверке режима можно сначала включить четвертую, а потом третью.
уже экономим байтКод:ld a,20
......
dec a ; a=19
и вместо
сделатьКод:ld (xxxx),a
.......
ld a,(xxxx)
ещё экономим байтКод:ld hl,xxxx
ld (hl),a
.......
ld a,(hl)
а зачем 1 загонять в 29326? Что это даёт?
Как насчёт проверить самому? ;)
Можно же загрузить блок, распаковать его и в эмуле посмотреть что-там лежало до 1 (подскажу, там до 1 лежал 0), а потом прям во время игры по Ctrl+P (в спекуляторе так) позаносить эти значения и сразу станет ясно, зачем нужна 1 ))
- - - Добавлено - - -
Это как? Это то о чём Гудбой писал или ты о чём-то другом?
Ну проверить я и сам догадался, только в той версии, что у меня есть этот кусок иначе выглядит:
LD A,(5B94)
LD (728e),A; 29326
А в 5B94 содержится не 0 или 1, а FF. Я туда загнал 1, но ничего не изменилось в игре.
О какой версии речь?
Загонять надо именно в 728E (в любой версии, хоть в фирменной), а не в 5B94 (это вообще левый адрес мало относящийся к игре).