PDA

Просмотр полной версии : Монолоадер для чайников.



ZX_NOVOSIB
27.12.2014, 11:27
Монолоадер. Что это? И с чем его едят? Как сделать монолоадер? Что для этого надо?

Для начала хотелось бы понять общую идеологию монолоадера, принцип его работы. Я правильно понял, что простейший монолоадер делается примерно так: делаем бейсик-файл, в котором в строку REM помещаем загрузчик в кодах, каким-то образом узнаем адрес этого кодового блока и вызываем его с помощью USR. Потом склеиваем каким-нибудь коммандером этот бейсико-кодовый загрузчик с кодовым блоком.

http://zxpress.ru/article.php?id=6380 - здесь конечно есть кое-какая инфа по этому поводу, но всё равно многое не понятно. Хотелось бы разобрать на конкретном примере :) Например сделать REX (Freeway). Только в примере WLODEK BLACK грузится один блок и потом он запускается. В рексе так ведь не получится. Ведь первым делом надо спросить у юзера, какую часть он хочет грузить, и далее грузить то что надо, а не всё подряд.

Смутно я понимаю как загрузить "всё подряд", надо взять содержимое ячейки #5CF4, и подставить это содержимое в свой кодовый загрузчик и тогда всё загрузится. Но как сделать, чтобы в зависимости от выбора юзера, в кодовый загрузчик подставлялись те сектора, на которых расположен один из трех блоков? Как узнать адрес не первого блока, а остальных двух? И даже если мы узнаем, то как подставить эти адреса? Опять с помощью кодового загрузчика? но тогда он усложняется :(

В общем лучше тогда рекса пока не трогать. А начать с самого простейшего. Сделать загрузчик, который просто будет грузить запакованную картинку по адресу 24600 и показывать её. С чего начать? ) Как будет выглядеть кодовый загрузчик? Как его засунуть в REM? Как узнать точку входа в этот кодовый загрузчик?

CodeMaster
27.12.2014, 12:21
и вызываем его с помощью USR

Это не по теме, но всегда было интересно: почему USR используется именно с RANDOMIZE? И если аргумент USR строка, то тоже используется RANDOMIZE?

Destr
27.12.2014, 12:31
здесь конечно есть кое-какая инфа
Вон там утилитка для создания монолоадера: http://zxpress.ru/article.php?id=11956


Это не по теме, но всегда было интересно: почему USR используется именно с RANDOMIZE?
Можно и RUN использовать
И PRINT
И CLOSE
В общем любую команду с одним аргументом

goodboy
27.12.2014, 12:35
Смутно я понимаю как загрузить "всё подряд", надо взять содержимое ячейки #5CF4, и подставить это содержимое в свой кодовый загрузчик и тогда всё загрузится. Но как сделать, чтобы в зависимости от выбора юзера, в кодовый загрузчик подставлялись те сектора, на которых расположен один из трех блоков? Как узнать адрес не первого блока, а остальных двух? И даже если мы узнаем, то как подставить эти адреса? Опять с помощью кодового загрузчика? но тогда он усложняется

почитай про точку входа в trdos 15635 когда C=5

CodeMaster
27.12.2014, 12:37
В общем любую команду с одним аргументом

Ну, какой-то смысл именно в RANDOMIZE был, может удобней набирать на клаве?

Destr
27.12.2014, 12:41
Ну, какой-то смысл именно в RANDOMIZE был, может удобней набирать на клаве?
Может быть.
А скорей всего - оттого что RANDOMIZE ни на что не повлияет (кроме SEED) после отработки кода и возврата значения.
PRINT USR например распечатает значение BC

CodeMaster
27.12.2014, 13:26
Может быть.

Ну и последний вопрос ;-) А чего запуск бинарного кода так далеко задвинули (спец вариант функции), почему не отдельная команда? Не предполагалось, что будет широко использоваться или нужна было именно функция, что бы код мог что-то вернуть в Бейсик?

scl^mc
27.12.2014, 13:31
нужна было именно функция, что бы код мог что-то вернуть в Бейсик?
скорее всего да.

Gutten
27.12.2014, 13:36
Тем более ведь возвращается значение регистра BC.

scl^mc
27.12.2014, 13:42
можно в переменную какую-нибудь заполучить результат работы подпрограммы чем-нибудь типа let x=usr 49152

ZX_NOVOSIB
27.12.2014, 14:36
В общем мне нужно время, чтобы переварить инфу и попробовать что-нибудь на практике сделать :v2_dizzy_coder:
По ходу дела буду отчитываться о проделаной работе.

denpopov
27.12.2014, 14:40
Жаль, zx-spectrum.ru гавкнулся, g0blinish тред создавал..


Как узнать адрес не первого блока, а остальных двух?
никак. Ты сам собираешь файлы, сам указываешь при загрузке.


Как будет выглядеть кодовый загрузчик? Как его засунуть в REM? Как узнать точку входа в этот кодовый загрузчик?

типа:


MODULE boot
Basic:
db #00,#01;номер строки
DW EndLine1 - Line1
Line1:
db #EA;REM
ld sp,#5FFE

ld a,0:out ($FE),a
ld hl,$4000,de,$4001,bc,6911,(hl),l:ldir

di
ld de,(#5CF4)
ld hl, #4000
sectors loaderb,loadere
call #3d13
jp #4000
;----------------------------demo------------
db "yo,lamer!"
db #0D
EndLine1:
db #00,#02
DW EndLine2 - Line2
Line2:
db #20,#FD,#B0
db #22,#32,#34,#35,#37,#35,#22;clear val "24575"
db #3A; :
db #F9,#C0,#28,#35;randomize usr (5+256*peek val "23635"+peek val "23636"
db #0E,#00,#00,#05,#00,#00,#2B
db #32,#35,#36
db #0E,#00,#00,#00,#01,#00,#2A,#BE

db #B0
db #22,#32,#33,#36,#33,#36,#22;"23635"
db #2B;???
db #BE
db #B0
db #22,#32,#33,#36,#33,#35,#22;"23636"
db #29,#0D;)
db #80
db #AA,1,0;;;;;;;;;;;;;autorun line,change program length to -4, e.g. 83-4=79
EndLine2:
EndBasic:
ENDMODULE

page 7
org #DB00
page7b:
plyer:include "stc_player.a80"
song:incbin "!rivrade-KIDSON AND ODYSSEY FROM RAPEWARE CORP-1996.STC"
page7e:

page 1
org #C000
page1b:
incbin "page1.bin.zx7"
page1e:

page 3
org #C000
page3b:
incbin "page3.bin.zx7"
page3e:

page 4
org #C000
page4b:
incbin "page4.bin.zx7"
page4e:

page 6
org #C000
page6b:
incbin "page6.bin.zx7"
page6e:

EMPTYTRD "past.trd" ;create empty TRD image
SAVETRD "past.trd", "boot.B", boot.Basic, boot.EndBasic - boot.Basic

SAVETRD "past.trd","loader.C",loaderb,loadere-loaderb

PAGE 1
SAVETRD "past.trd","pg1.C",page1b,page1e-page1b

PAGE 3
SAVETRD "past.trd","pg3.C",page3b,page3e-page3b

PAGE 4
SAVETRD "past.trd","pg4.C",page4b,page4e-page4b

PAGE 6
SAVETRD "past.trd","pg6.C",page6b,page6e-page6b

SAVETRD "past.trd","demo.C",begin,end-begin

page 7
SAVETRD "past.trd","song.C",page7b,page7e-page7b



---------- Post added at 14:40 ---------- Previous post was at 14:39 ----------


По ходу дела буду отчитываться о проделаной работе.
валяй. спрашивай если чо.

rasmer
27.12.2014, 16:06
Это не по теме, но всегда было интересно: почему USR используется именно с RANDOMIZE? И если аргумент USR строка, то тоже используется RANDOMIZE?немного пооффтоплю, и не открою великую тайну, но бут в тырдосе я запускаю командой "poke" - кнопка ближе к ентеру :)

denpopov
27.12.2014, 16:08
немного пооффтоплю, и не открою великую тайну, но бут в тырдосе я запускаю командой "poke" - кнопка ближе к ентеру

можно j - тоже рядом:)

Faster
27.12.2014, 20:41
Монолоадер. Что это? И с чем его едят? Как сделать монолоадер? Что для этого надо?
Вот тебе еще по теме пример (http://zx-pk.ru/showthread.php?t=21217). Посмотри исходники...





...
;----------------------------demo------------
db "yo,lamer!"
db #0D
EndLine1:
db #00,#02
DW EndLine2 - Line2
Line2:
db #20,#FD,#B0
db #22,#32,#34,#35,#37,#35,#22;clear val "24575"
db #3A; :
db #F9,#C0,#28,#35;randomize usr (5+256*peek val "23635"+peek val "23636"
db #0E,#00,#00,#05,#00,#00,#2B
db #32,#35,#36
db #0E,#00,#00,#00,#01,#00,#2A,#BE

db #B0
db #22,#32,#33,#36,#33,#36,#22;"23635"
db #2B;???
db #BE
db #B0
db #22,#32,#33,#36,#33,#35,#22;"23636"
db #29,#0D;)
db #80
db #AA,1,0;;;;;;;;;;;;;autorun line,change program length to -4, e.g. 83-4=79
...

мне кажется это слишком сложно для новичка :)

denpopov
27.12.2014, 21:18
мне кажется это слишком сложно для новичка

/me разводит руками

Destr
28.12.2014, 04:08
Ну и последний вопрос ;-) А чего запуск бинарного кода так далеко задвинули (спец вариант функции), почему не отдельная команда? Не предполагалось, что будет широко использоваться или нужна было именно функция, что бы код мог что-то вернуть в Бейсик?
Размышлял тут так и сяк над этим филосовским вопросом.
Пришёл к выводу: слишком жирно отдельную команду чисто для вызова кодблока без всяких "НО", "ЕСЛИ" и "ЧТО ПОТОМ" заводить было.
Ведь пришлось бы её куда нибудь впихивать (на клавишу)
А их и так на каждой клавиши по три штуки сидят!
Какую-нибудь RUNCODE.
Т.е. чисто "одноразовую" - передал управление машкоду и привет!
Ради одной такой тратить место на вводе?
(ведь до 128 бейсика по буковкам не наберешь)
Хватит и RANDOMIZE (она тоже могла-бы остатся только для RND, но спасибо, пригодилась и для вызова кодблока) :)
Как-то так видимо...

---------- Post added at 04:08 ---------- Previous post was at 03:58 ----------

И вот ещё мысля пришла: Есть команда NEW
Было-бы логично если NEW без аргумента - ну это как оно щас есть (сброс бейсика)
А если с аргументом - то передача управления кодблоку.
Это было-бы очень разумно.
Как-бы безусловная передача и без надежды на возврат.
Да только не додумали (да и не удивительно, ведь тогда это всё наощупь делалось, искали пути и способы как построить интерфейс. Даже сама концепция токенизированого ввода уже чего стоит!)

ZX_NOVOSIB
28.12.2014, 17:12
Итак.. Я сделал самый простейший монолоадер, который просто грузит 1 архив и просто распаковывает его. Сначала я долго не мог понять, с чего же мне начать. Нифига не понятно. Но потом понял, что надо открыть Sublime Text, написать код, который дается в примере WLODEK BLACK и всё это собрать в трд. Поначалу код не хотел собираться в трд, я пробовал и так и сяк, в конце концов плюнул и скопировал в Sublime простейший пример, который выкладывал Алекс Райдер, и в этом примере поменял "середину" на код Влодека. Ну и естествено подставил свои значения длины секторов и старта. Потом сделал бейсик, загрузил в него полученный код, а потом всё это дело склеил риалкоммандером. Всё работает! ))

Это конечно микроскопический успех, но всё-таки успех. Однако не понятно вот что, в уроке Влодека говорится
Поскольку файлы нашей игры расположены на диске подряд, удобно воспользоваться системными переменными TR-DОS (23796 и 23797). В этих переменных хранятся данные о секторе и треке, следующих непосредственно за только что загруженными.
Однако в примере кодового лоадера есть упоминание только о 23796:

C помощью какого-нибудь ассем-
блера наберите программку:
ОRG 30000
DI
LD ВС,#1В05 ;заставка (#1В=
;27 секторов)
LD DE,(23796) ;трек, сектор
LD HL,16384 ;куда
СALL 15635 ;вызов ТR-DОS
LD ВС,#8905 ;осн.блок (#89=
;137 секторов)
LD DE,(23796)
LD HL,25000
СALL 15635
EI
JР 25000 ;старт игры
А почему 23797 никак не задействовано? В каком случае нужно, а в каком не нужно юзать этот адрес?

И еще вопрос, в том же уроке описано как полученный кодовый загрузчик "залить" в бейсик:
В конце строки напишите: RANDОМIZE USR 23872.
В строке 1 наберите REМ, после поставьте столько же пробелов, сколько получилось байт в загрузчике. 3агрузите коды загрузчика в строку 1 прямой командой RANDОМIZE USR 15619: REМ: LОAD <имя файла> CОDE (23872+257).
- Откуда взялась цифра 23872? Откуда мы узнали, что кодовый загрузчик надо грузить именно по этому адресу?
- Что значит "имя файла" CODE (23872+257)? Я бы понял просто CODE 23872, но зачем скобки и зачем приплюсовывание 257? И почему именно 257?
- Можно ли в строку REM вставить более весомый код, чем лоадер? Как? Ведь замучаешься вбивать несколько сотен пробелов.

wbr
28.12.2014, 17:24
про моноблок в 3-ем номере ЗаRulem было написано - http://vk.com/doc-69042740_284540298

scl^mc
28.12.2014, 18:01
- Можно ли в строку REM вставить более весомый код, чем лоадер? Как? Ведь замучаешься вбивать несколько сотен пробелов.
можно. в zx-ревю за 1992 год приводилась программа для создания строки с rem и требуемым количеством символов после него

denpopov
28.12.2014, 18:06
А почему 23797 никак не задействовано? В каком случае нужно, а в каком не нужно юзать этот адрес?

потому что

LD DE,(23796)
DE берется из 23796 и 23797.



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


Можно ли в строку REM вставить более весомый код, чем лоадер? Как? Ведь замучаешься вбивать несколько сотен пробелов.

пример я привел, но есть некоторые ограничения.

goodboy
28.12.2014, 18:33
- Откуда взялась цифра 23872? Откуда мы узнали, что кодовый загрузчик надо грузить именно по этому адресу?
не грузить, а запускать
когда `работает` trdos область размещения бейсик программы начинается с 23867.
(можно посмотреть в системной переменной progs (23635/23636))
если первая строка
10 REM код
то считаем 23867+2байта (номер строки)+2байта(длина строки)+1байт (токен REM)=23872
; номер строки можно принудительно занулить (например через POKE) это типа защита от редактирования.

- Что значит "имя файла" CODE (23872+257)? Я бы понял просто CODE 23872, но зачем скобки и зачем приплюсовывание 257? И почему именно 257?
257 это длина буфера который выделяется (а потом изчезает) во-время загрузки сектора.

Faster
28.12.2014, 20:31
- Можно ли в строку REM вставить более весомый код, чем лоадер? Как? Ведь замучаешься вбивать несколько сотен пробелов.
Можно. Хоть десятки Кб. Пользуйся сборщиком бейсик-лоадера типа Basic Loader Creator и будет тебе счастье. Набивать пробелы в ручную - то еще извращение :)

goodboy
28.12.2014, 22:25
Можно. Хоть десятки Кб.
вот хороший пример http://www.pouet.net/prod.php?which=2143
чисто бейсик - ничего лишнего :v2_rolley

а если серъёзно для начала грузи из бейсика основной загрузчик
(ведь пока тренируешься его длина будет `плавать`)

размещай после REM что-то-вроде
LD HL,24576
LD SP,HL
LD DE,(23796)
LD BC,1*256+5
PUSH HL
JP 15635


а основной загрузчик компилируй с 24576

Faster
28.12.2014, 23:16
вот хороший пример http://www.pouet.net/prod.php?which=2143
чисто бейсик - ничего лишнего :v2_rolley
CB знали толк в извращениях:)



а если серъёзно для начала грузи из бейсика основной загрузчик
(ведь пока тренируешься его длина будет `плавать`)

размещай после REM что-то-вроде
LD HL,24576
LD SP,HL
LD DE,(23796)
LD BC,1*256+5
PUSH HL
JP 15635


а основной загрузчик компилируй с 24576
Плюсую, дельный совет! Потом научишься "перепрыгивать" файлы, например при загрузки левелов.

ZX_NOVOSIB
30.12.2014, 10:23
По вышесказанному конечно не всё понятно. Но эти вопросы потом. Монолоадеру с рексом однозачно быть, незнаю, может седня сделаю, может на днях.

Но пока вопрос не в тему: если мы в бейсик-программе пытаемся выставить CLEAR слишком низко, то бейсик ругается ramtor no good. Как он, бейсик, определят что CLEAR слишком низкая? Бейсик как-то расчитывает свой собственный размер? Как? И можно ли его обмануть? Пусть даже ценой порчи самого бейсика.. )

denpopov
30.12.2014, 10:56
Сдется мне, пора объявлять сбор средств на монолоадер Rex'a ;)

scl^mc
30.12.2014, 11:16
И можно ли его обмануть? Пусть даже ценой порчи самого бейсика.. )
можно не выставлять значение clear, но тогда будет портиться код.
тут два варианта: либо с clear, и извращайся, чтобы бейсиковская програ до этой границы уместилась, либо без clear.
можно загрузить бейсик прогу, потом (без clear) код, и на выходе получить прикольную мешанину символов ближе к концу текста бейсика.

ZX_NOVOSIB
30.12.2014, 11:48
можно не выставлять значение clear, но тогда будет портиться код.Да, код портится. Но неужели нельзя куда-нибудь занести какое-нибудь обманное значение, чтобы бейсик подумал, что бейсик-прога короткая и выполнил CLEAR? Тогда испортился бы бейсик (ну и хрен на него он уже отработал), но код остался бы целым.

---------- Post added at 14:48 ---------- Previous post was at 14:40 ----------


Сдется мне, пора объявлять сбор средств на монолоадер Rex'a ;)когда шутку повторяют раз десять, она перестает быть смешной :)
Монолоадер могу сделать хоть сейчас, но он будет без читов. Без читов тоже хорошо. Но вдруг можно надурить бейсик... тогда будет и монолоадер и с чит-меню.

Для этого надо либо надурить CLEAR, либо.. в общем кодовый лоадер может грузить любое количество секторов с дискеты в любую область памяти. Т.е. можно подгружать новые кодовые блоки. А можно кодовым загрузчиком подгрузить бейсик-файл? Причем чтобы этот новый бейсик стартанул. И чтобы всё это было моно.

Faster
30.12.2014, 13:32
А можно кодовым загрузчиком подгрузить бейсик-файл? Причем чтобы этот новый бейсик стартанул. И чтобы всё это было моно.
Не страдай ерундой, воспользуйся советом, который дал goodboy.

Alex Rider
30.12.2014, 14:22
Как он, бейсик, определят что CLEAR слишком низкая?
Разница между новым значением RAMTOP и значением в (STKEND) должна быть больше 50 байт. Если ты не планируешь возвращаеться в BASIC, то CLEAR можно и не делать, хотя при этом все равно возможны side-эффекты. Если ты подменишь значение в STKEND, BASIC умрет. Как вариант:


ld de,(PROG) ; #5c53
ld hl,(STKEND) ; #5c65
dec hl
call RECLAIM-1 ; #19e5

При этом стирается вся BASIC-программа, переменные и все, что там ниже, но делается это корректно.
Если ты попытаешься обмануть интерпретатор, поставить насильно CLEAR выше, чем он позволяет, и вернешься в BASIC, то у тебя машинный стек наедет на стек калькулятора, а BASIC без калькулятора не может исполнить и десятка команд. Собсна, затрет сам себе машинный стек и улетит в космос.

ZX_NOVOSIB
30.12.2014, 16:48
Не страдай ерундой, воспользуйся советом, который дал goodboy.он дал какой-то код. Но я не понял, что делает этот код и для чего он.:o

---------- Post added at 19:48 ---------- Previous post was at 19:44 ----------


Как вариант:


ld de,(PROG) ; #5c53
ld hl,(STKEND) ; #5c65
dec hl
call RECLAIM-1 ; #19e5

При этом стирается вся BASIC-программа, переменные и все, что там ниже, но делается это корректно.

Этот код можно просто скопировать в Sublime Text? Что то я его скопировал, после него поставил JP на адрес автораспаковки-автостарта игры, собрал, пытаюсь заюзать его - и нифига, сбрасывается.

Faster
30.12.2014, 16:55
он дал какой-то код. Но я не понял, что делает этот код и для чего он.:o
Goodboy предложил в бейсик-строке после REM разместить небольшую программку, которая грузит по адресу 24576 основной кодовый загрузчик. Т.е. суть в том, чтобы не заморачиваться с бейсиком пытаясь впихнуть в него по максимому, а разместить код типа:


LD hl,addr ;адрес загрузки основного лоадера
ld de,(23796) ;трек и сектор основного лоадера
ld bc,#nn05 ;где #nn - длина основного лоадера в секторах
call 15635

который загрузит основной лоадер, куда ты можешь "запихать" что угодно!

Alex Rider
30.12.2014, 20:26
Этот код можно просто скопировать в Sublime Text?
Нет, есть несколько проблем.
Проблема №1: учимся сразу писать правильно, потом переделываться будет тяжко. В начало модуля пихаем (хотя бы так, все подряд, но лучше разделить на константы системных переменных и процедур ПЗУ):


PROG equ #5c53
STKEND equ #5c65
RECLAIM_1 equ #19e5

Тогда у тебя PROG, STKEND и RECLAIM_1 становятся понятными и говорящими именами в программе (вместо hex-значений). Олсо SjAsm пихает в error output сообшения об ошибках а sublime, по идее, их должен ловить. Либо настраиваем это, либо учимся их не игнорить (sjasm, если не знает метку RECLAIM-1, пихает в место нее 0, что превращает call RACLAIM-1 в RANDOMIZE USR 0). Ахтунг - моя лажа, "-" использовать в метках нельзя, меняем на "_", но RANDOMIZE USR 65535 (0 - 1) примерно то же самое :)
Проблема №2 (потенциальная): если у тебя загрузчик в машкодах, встроенных в первую BASIC-строку, а ты стираешь весь BASIC, то программа твоя может пострадать (я не помню уже сколько на самом деле занимает "пустая" программа).
Проблема №3: учимся пользоваться отладчиком Unreal Spectrum - как минимум он показывает что у тебя скомпилировалось, а еще от него можно узнать в каком месте происходит Большой взрыв с возвратом в начало эволюции;
Проблема №4 (у меня в мозгу): я так понимаю, тебе всей ценой нужно сделать честный CLEAR перед стартом программы. А ты говоришь,

после него поставил JP на адрес автораспаковки-автостарта игры
Получается, машинный стек у тебя остается там, где его придумал BASIC, он затирается кодом игры и у TR-DOS при загрузке снесет крышку.
Смотри, суть оператора CLEAR в следующем:

убийство всех BASIC-переменных (кстати, код очистки всего и вся я взял именно из реализации CLEAR);
очистка экрана;
установка системной переменной RAMTOP;
инициализация стека GO SUB по адресу RAMTOP (он занимает там 1 байт);
перенос машинного стека под стек GO SUB;

Фактически, CLEAR в BASIC-загрузчике чаще всего нужен для переноса машинного стека до, собственно, самой загрузки. Если не нужен остальной "сервис" от CLEAR, то CLEAR #nnnn заменяется на ассемблерную команду ld sp,#nnnn, при этом никаких проверок, разумеется, не делается, никаких RAMTOP no good, но в BASIC уже не вернуться - он ситает, что машинный стек в другом месте.

Там вот, объясни уже всем тут, после твоего кодового загрузчика надо попасть в игру или опять вернуться в BASIC?

ZX_NOVOSIB
01.01.2015, 18:58
Так вот, объясни уже всем тут, после твоего кодового загрузчика надо попасть в игру или опять вернуться в BASIC?кодовый загрузчик не при делах. В нем не нужно никаких "аналогов CLEAR". Он просто загрузит что надо в память. Далее, например, из под бейсика я внесу нужные покесы в распакованный блок, вернее в распакованную часть блока. После этого и нужен, поидее, некий обман CLEAR, нужен USR кода, который похерит бейсик, высвободив память, а после должен идти JP на оставшуюся (запакованную) часть кода игры. Она распакуется (склеившись с тем куском, который мы "покесили") и автостартанет (так как этот кусок запакован хрустом, то там можно выставить автостарт с адреса - и следовательно для первой части выставлен 24600).

denpopov
01.01.2015, 19:02
ZX_NOVOSIB, имхо ты либо не понимаешь, либо дурью маешься.

ZX_NOVOSIB
01.01.2015, 20:07
denpopov, скорей всего и то и другое одновременно )))

Что ж, если то, что я написал нереально, то я сделю просто монолоадер, там будет выбор части, но не будет чит-меню. Потому как лоадер сделать я еще смогу, но совместить его с чит-меню - для этого нужно владеть ассемблером хотя бы на уровне denpopov'а. Мои же познания пока где-то на уровне ААА :)

denpopov
01.01.2015, 20:08
но совместить его с чит-меню - для этого нужно владеть ассемблером хотя бы на уровне denpopov'а

Щито? я это быстрее сделаю:)

Alex Rider
02.01.2015, 03:49
Далее, например, из под бейсика я внесу нужные покесы в распакованный блок, вернее в распакованную часть блока.


Что ж, если то, что я написал нереально, то я сделю просто монолоадер, там будет выбор части, но не будет чит-меню. Потому как лоадер сделать я еще смогу, но совместить его с чит-меню - для этого нужно владеть ассемблером хотя бы на уровне denpopov'а.

Да все это реально, только через задницу. Для написания простейшего чит-меню достаточно вот это (http://zxpress.ru/book.php?id=2) прочитать хотя бы на треть (вывод букв, ввод с клавиатуры). Патчинг в машкоде тоже делается "на ура". Тогда сможешь сделать все в кодах. CLEAR тебе в этом случае не нужен - при запуске загрузчика командой ld sp,#nnnn переставляешь стек в правильное место.

Reobne
02.01.2015, 09:34
ZX_NOVOSIB, У тебя уже есть чит-меню на бейсике?
Может такой компромис:
Чит меню на бейсике, результат выбора меню бейсиком POKE, например по адресу 65535, или где ещё свободная память, потом передаётся USR-ом на 1 REM $$$$$. Из него уже в бейсик возврата нет. Устанавливается SP. Загружается основной кодовый блок игры через CALL 15635 (возможно, с затиранием конца бейсик программы). Патчится согласно содержимому ячейки 65535, или где там. Запускается.

ZX_NOVOSIB
02.01.2015, 19:00
Щито? я это быстрее сделаю:)
да я и не спорю.

Alex Rider
02.01.2015, 19:02
Чит меню на бейсике, результат выбора меню бейсиком POKE, например по адресу 65535, или где ещё свободная память, потом передаётся USR-ом на 1 REM $$$$$.
Поддерживаю. Только чтобы наверняка - можно результаты выбора в области BASIC'а хранить. Прямо в код загрузчика в REM-строку, например, писать. А патч делать кодом после загрузки без возврата в BASIC. CLEAR не нужен.

ZX_NOVOSIB
02.01.2015, 19:12
В общем дело такое. Не до жиру - быть бы живым. Решил сделать по минимуму. Без всяких читов. Намедни как раз Слайдер дал мне процедуру пропуска секторов, чтобы можно было выбрать, какую часть грузить.

Структура планируется простейшая: блок с картинками и 3 блока кодов (1,2 и демо), ну и загрузчик на бейсике, который запускает кодовые процедуры, опрашивает клавиатуру и, в зависимости от INKEY$, покесами меняет количество загружаемых секторов (в процедуру загрузки), и в процедуру пропуска секторов подставляет нужное количество секторов.

Начал я тестить. Блок картинок грузится, все работает. Сразу за ним блок 1 части, тоже грузится. Попробовал процедуру пропуска секторов - 2 часть тоже грузится. Я воодушевился и стал делать финальный бейсик - загрузчик. В итоге только первую часть запустить можно))) Хотя до этого пробовал сырой вариант, там и вторая запускалась, глянул тот сырой вариант, там вторая грузится, а уже демо - нифига.

Короче сделать монолоадер который грузит 1-2 блока - получается. Больше - хрен. Ради любопытства пробовал делать пропуск секторов с помощью изменения POKE значений 23796/797, дык при попытке загрузки начинаются сплошные ошибки Disk error Return Abort Ignore - от этого я вообще офигел :eek_std:

Faster
02.01.2015, 19:14
А ТС не хочет сделать все на асме, не используя бейсик? Или желание сделать релиз любым способом сильнее желания познать всю силу асма?:)

ZX_NOVOSIB
02.01.2015, 19:24
Или желание сделать релиз любым способом сильнее желания познать всю силу асма?:)да.

И всё ведь почти работает. В аттаче пример, который должен был работать, но в итоге работает еще хуже какой-то промежуточной версии, запускает только 1-ую часть. (С адреса 23872 - лоадер длинной 18 байт. С адреса 23890 - "пропускальщик секторов" длинной 21 байт. Со clear игрался как угодно, куда и как я её только не вставлял, дело не в clear.)

goodboy
02.01.2015, 21:18
вместо 0 используй логическую конструкцию NOT PI.
картинки сжимай пакерами предназначенными для них
(они частенько оптимальней hrust`a)
и у тебя ошибка в пропускальщике

AndTorp
03.01.2015, 01:25
вместо 0 используй логическую конструкцию NOT PI
Можно, наверно, еще использовать функцию BIN без аргумента.

Alex Rider
03.01.2015, 03:02
Можно, наверно, еще использовать функцию BIN без аргумента.
NOT PI - 2 байта, BIN - 7 байтов. После BIN пишется 5-байтное представление.

ZX_NOVOSIB
03.01.2015, 09:28
вместо 0 используй логическую конструкцию NOT PI.
картинки сжимай пакерами предназначенными для них
(они частенько оптимальней hrust`a)
и у тебя ошибка в пропускальщике
По моему дело не в том, что бейсик длинный, а в чем-то другом. А что касаемо длины, то никакие not pi и никакие bin не сравнятся с обычной переменной. Например border n. А потом в командной строке let n=0. not pi нервно курит в сторонке. А когда речь заходит о пятизначных числах, то выигрыш еще более очевиден. val "" курит. Правда clear и run обнуляет всё это дело, это надо учитывать. Но я пробовал и так и сяк, куда только не ставил clear, значит дело не в ней.

А какая ошибка в пропускальщике? Слайдер мне дал такой код пропускальщика:

ld b,кол-во секторов
call процедура

процедура:
ld de,(23796)
m1 inc e
ld a,e
cp 16
jr c,m2
inc d
ld e,0
m2 djnz m1
ld (23796),de
ret
эту процедуру я и использовал. Только в конце у меня не ret, а jp 23872. Ну чтобы когда пропускальщик отработал, запускался лоадер и грузил то что надо. По умолчанию у меня пропускальщик пропускает 104 сектора, это значение меняется poke, если надо грузить не вторую часть, а демо. И у меня сначала вроде даже работало, т.е. пропускальщик действительно пропускает 104 сектора. Но когда надо пропустить 202 сектора, то нихрена уже не работает. А более поздняя моя сборка даже 104 не хочет пропускать.

Сам же лоадер, который сидит в 23872 такой:

DI
LD BC,#3505
LD DE,(23796)
LD HL,32768
CALL 15635
EI
JP 32768

denpopov
03.01.2015, 09:38
Наворотил ты делов. Почему 104 и 202?

ZX_NOVOSIB
03.01.2015, 09:56
потому что:
грузится бейсик с кодом в рем. В рем сидит и лоадер и пропускальщик. Первым делом вызывается лоадер. Он тупо грузит блок с запакованными картинками. И распаковывает его, блок распаковывается и автостартует, показывая первую картинку (выбор части).

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

Если же нажата клавиша "2", то в лоадере меняется количество загружаемых секторов. И в пропускальщике выставляется количество секторов, которое надо пропустить. Так как длина кодового блока первой части 104 сектора, а в пропускальщике уже по умолчанию стоит это число, то нифига не выставляется. А тупо вызывается пропускальщик, который потом передает управление лоадеру.

И только если нажата "0",то и в лоадере меняется кол-во секторов, и в пропускальщике меняется 104 на 202, ведь 104+98=202 (длина второй части)

denpopov
03.01.2015, 10:16
если ты привел процедуру "пропускания" Сладера, то у тебя она неправильная:

нет
m2 djnz m1

http://i64.fastpic.ru/big/2015/0103/ad/6ea823e675b5984b8b30d24115eb25ad.gif

Faster
03.01.2015, 10:49
ZX_NOVOSIB, вот тебе еще один вариант (http://zx-pk.ru/showpost.php?p=290788&postcount=8).

goodboy
03.01.2015, 10:52
что касаемо длины, то никакие not pi и никакие bin не сравнятся с обычной переменной. Например border n. А потом в командной строке let n=0. not pi нервно курит в сторонке. А когда речь заходит о пятизначных числах, то выигрыш еще более очевиден. val "" курит. BORDER N только визуально в листинге выглядит короче,
на самом деле значение переменной сохраняется вместе с бейсиком.
неужели так трудно проверить сохраняя разные варианты ???

denpopov
03.01.2015, 10:59
о чем спор? Экономии места сразу видно дофига. опрос клавиатуры например.

ZX_NOVOSIB
03.01.2015, 11:18
если ты привел процедуру "пропускания" Сладера, то у тебя она неправильная:

нет
m2 djnz m1
хм, жесть.. а куда она, мать её за ногу, делась? Вот же она:

http://speccy1.mag.su/hov9k8.png

Sublime Text её проигнорировал? Или sjasmplus?
И как теперь её вставить?

---------- Post added at 14:14 ---------- Previous post was at 14:07 ----------


BORDER N только визуально в листинге выглядит короче,
на самом деле значение переменной сохраняется вместе с бейсиком.
неужели так трудно проверить сохраняя разные варианты ???
конечно я проверял. Ну ладно, щас еще раз проверил.
Сделал программу "1 BORDER NOT PI", сохранил на диск, она занимает 8 байт.
Прога "1 BORDER n" занимает 7 байт. А работают одинаково. В более длинных прогах выигрыш еще существеннее будет. Я уж молчу про случаи когда надо оперировать 5-ти значными числами.

---------- Post added at 14:18 ---------- Previous post was at 14:14 ----------


о чем спор? Экономии места сразу видно дофига. опрос клавиатуры например.
а как опрос на бейсике короче сделать?

denpopov
03.01.2015, 11:25
Sublime Text её проигнорировал? Или sjasmplus?
И как теперь её вставить?
для ужасма попробуй

m2:djnz m1

похоже у тебя инструкция на пробел отступает а ужасм ругается.




---------- Post added at 11:25 ---------- Previous post was at 11:24 ----------


а как опрос на бейсике короче сделать?
имхо - никак. я в Бейсик никак не врублюсь:(

goodboy
03.01.2015, 11:49
Сделал программу "1 BORDER NOT PI", сохранил на диск, она занимает 8 байт.
Прога "1 BORDER n" занимает 7 байт. А работают одинаково. В более длинных прогах выигрыш еще существеннее будет. Я уж молчу про случаи когда надо оперировать 5-ти значными числами.

вот три варианта

http://savepic.ru/6538254.pnghttp://savepic.ru/6530062.pnghttp://savepic.ru/6536206.png

http://savepic.ru/6522894.png

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

denpopov
03.01.2015, 12:14
первый и третий по 13байт. где ты увидел экономию я не-понимаю.
где ты увидел оба два 13 байт - непонятно.

Reobne
03.01.2015, 12:27
длина бейсик программы и длина области занимаемой программой это разные вещи.
Нам нужна именно длинна самого бейсика, а переменные стираются CLEAR. То есть ZX_NOVOSIB-у нужно не чтобы на диске мало занимало, а чтобы CLEAR поменьше сделать.

scl^mc
03.01.2015, 12:45
Прога "1 BORDER n" занимает 7 байт
программа 1 border n без приписки в начале let n=0 нафиг никому не уперлась.
вообще, по теме экономии места для бейсика советую покурить первые выпуски zx-ревю, там применению конструкций типа border val "0", ink sgn pi и прочим clear 2e4 довольно много текста было посвящено.

Faster
03.01.2015, 12:48
где ты увидел оба два 13 байт - непонятно.
Параметр Start. Goodboy правильно указал.

п.с. имхо, вместо того, чтобы вымучивать многострадальный загрузчик, уже который день, скрещенный с бейсиком, можно было давно почитать книгу (http://zxpress.ru/book.php?id=2) и сделать все правильно на асме. А то получается, что ТС ни с асмом не дружит, ни с бейсиком, а коллектив дружно пытается помочь научиться писать монозагрузчики не по феншую:)

scl^mc
03.01.2015, 12:54
можно было давно почитать книгу
немного оффа: где в бумажном виде ее нарезать?

Faster
03.01.2015, 13:03
немного оффа: где в бумажном виде ее нарезать?
А в электронном виде чем не устраивает?:) Не так удобно на диване читать?:)

scl^mc
03.01.2015, 13:25
А в электронном виде чем не устраивает?:) Не так удобно на диване читать?:)
бумажная книжка в любом случае удобнее :)

denpopov
03.01.2015, 13:32
Параметр Start. Goodboy правильно указал.

Дети малые:v2_dizzy_facepalm:



xor a:out (#FE),a -3 байта

далее

entry2:
ld b,NN+MM:jr e11
entry1:
ld b,NN
e11:
;тут skip секторов 0

entry0:
;тут загрузка части 0

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

ZX_NOVOSIB
03.01.2015, 13:50
первый и третий по 13байт. где ты увидел экономию я не-понимаю.
длина бейсик программы и длина области занимаемой программой это разные вещи.
Нам нужна именно длинна самого бейсика, а переменные стираются CLEAR. То есть ZX_NOVOSIB-у нужно не чтобы на диске мало занимало, а чтобы CLEAR поменьше сделать.
Я думал что "длина бейсик программы" и "длина области занимаемой программой" - это одно и тоже. В чем разница? Как бейсик-программа1 может занимать на диске места мало, а в памяти много, а бейсик-программа2 на диске много, а в памяти мало? Не понимаю..

Вот эта программа что высчитывает?? "Длину программы", или "длину области занимаемой программой"? Кстати и она кажет, что border n занимает меньше (вместе с самой программой 70 байт), чем not pi (71 байт). Так что может гудбой и прав, но я пока не понимаю почему :)

http://speccy1.mag.su/qbhmww.png
http://speccy1.mag.su/0itiqp.png

---------- Post added at 16:50 ---------- Previous post was at 16:46 ----------


программа 1 border n без приписки в начале let n=0 нафиг никому не уперлась.еще как уперлась. В моем примере на скринах, никакой "приписки в начале" нет, а она работает, окей кажет. И точно также, без приписки, будет и с диска работать.

scl^mc
03.01.2015, 13:57
И точно также, без приписки, будет и с диска работать.
ты проверь сначала. после выключения/сброса компа данные о всех назначенных переменных пропадают. сохрани программу:
1 border n
на диск, перезагрузи компьютер и попробуй ее стартануть - вывалится variable not found.

ZX_NOVOSIB
03.01.2015, 14:01
ты проверь сначала. после выключения/сброса компа данные о всех назначенных переменных пропадают. сохрани программу:
1 border n
на диск, перезагрузи компьютер и попробуй ее стартануть - вывалится variable not found.ну конечно я всё проверяю и всё пробую. Что вы все заладили, попробуй да попробуй, будто я перед тем как писать не пробую :)
Никаких variable not found. Не веришь - сам попробуй )) В этом деле главное распробовать, распробуешь - потом за уши не оттащишь )))

denpopov
03.01.2015, 14:23
В этом деле главное распробовать, распробуешь - потом за уши не оттащишь )))

ты с процедурой скипания секторов разобрался, не?

ZX_NOVOSIB
03.01.2015, 14:30
ты с процедурой скипания секторов разобрался, не?Ты писал
для ужасма попробуй

m2:djnz m1

похоже у тебя инструкция на пробел отступает а ужасм ругается.
Я поставил вместо пробела двоеточие, код стал 23 байта (вместо 21). Но по-прежнему нифига не работает. В аттаче версия с двоеточием. boot на диске присутствует и запускает то что нужно.

denpopov
03.01.2015, 14:46
пробел давишь и загружается часть 1(или 0?)

---------- Post added at 14:46 ---------- Previous post was at 14:45 ----------

1,2,d - это части?

ZX_NOVOSIB
03.01.2015, 14:56
если в меню выбора части нажать пробел, то загрузится-запустится 1 часть (1). Вместо пробела можно нажать всё что угодно, кроме "2" и "0", ибо по 2 должен грузится файл "2", а по "0" - файл "d" (демка рекса, ну та, где нас учат как воевать)

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

и да, 1,2,d - это части. А 0 - это запакованный блок с запакованными картинками.

---------- Post added at 17:56 ---------- Previous post was at 17:53 ----------

load - это лоадер 18 байт.
prop3 - "пропускальщик" 23 байт.
REX.free - бейсик-загрузчик, у которого в строке рем прячутся load и prop3

Reobne
03.01.2015, 15:08
Я думал что "длина бейсик программы" и "длина области занимаемой программой" - это одно и тоже.
Да, как фразы, это одно и то-же.
Но если ты сохраняешь бейсик с переменными, то они тоже сохраняются. В итоге файл на диске получается: бейсик программа+бейсик переменные - больше чем просто бейсик программа.
А когда ты делаешь CLEAR, то переменные стираются, и получается выигрыш.
goodboy, мне показалось,тут (http://zx-pk.ru/showpost.php?p=767762&postcount=58) решил, что ты пытаешься сэкономить место на диске. Вот я ему и ответил, что ты минимизируешь размер самой программы, чтобы сделать CLEAR с маленьким значением.

denpopov
03.01.2015, 15:15
демо вылетает после загрузки, не знаю, где я намудрил.
Вообще, я противник подобных загрузчиков, проще крэктру сделать:)

denpopov
03.01.2015, 15:16
упс, файл не прицепился..

Reobne
03.01.2015, 15:18
Я поставил вместо пробела двоеточие, код стал 23 байта
Сделай то-же в строке:
m1 inc e

ZX_NOVOSIB
03.01.2015, 15:27
Да, как фразы, это одно и то-же.
Но если ты сохраняешь бейсик с переменными, то они тоже сохраняются. В итоге файл на диске получается: бейсик программа+бейсик переменные - больше чем просто бейсик программа.не может такого быть :) Если мы делаем бейсик-программу, то она занимает в памяти какое-то место и переменные тоже занимают какое-то место. От того что мы сохраним на диск, ничего не изменится, останется тот же бейсик и те же переменные. Разве нет?



А когда ты делаешь CLEAR, то переменные стираются, и получается выигрыш.
goodboy, мне показалось,тут (http://zx-pk.ru/showpost.php?p=767762&postcount=58) решил, что ты пытаешься сэкономить место на диске. Вот я ему и ответил, что ты минимизируешь размер самой программы, чтобы сделать CLEAR с маленьким значением.Вообще-то минимизируя размер самой программы (юзая переменные вместо чисел и вместо всяких not pi), я одновременно экономлю и место на диске)) Разве нет?)) Конечно первичная цель это минимизировать "размер самой программы", то, что она при этом еще и занимает меньше места на диске - это своего рода побочный эффект.

goodboy привел какие-то скрины, я привел свои скрины с программой которая никаким боком не относится к дисководу, и которая так же кажет, что "border n" занимает меньше места чем "border not pi". Кто из нас прав я так и не понял, поэтому, господа, давайте устроим тотализатор! Кто победит, NOVOSIB или goodboy? Молодость или опыт? Провинция или столица? :D

Reobne
03.01.2015, 15:28
Хотя и
jr c,m2
тоже неправильно ассемблировалось...

---------- Post added at 19:28 ---------- Previous post was at 19:27 ----------


не может такого быть
Какого токого? Я-же то-же самое говорю.

ZX_NOVOSIB
03.01.2015, 15:32
Сделай то-же в строке:
m1 inc eблин, вот это я мог бы и сам догадаться:v2_dizzy_facepalm:
щас попробую - отпишусь.

---------- Post added at 18:32 ---------- Previous post was at 18:30 ----------


Хотя и
jr c,m2
тоже неправильно ассемблировалось...

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

Reobne
03.01.2015, 15:35
(юзая переменные вместо чисел и вместо всяких not pi), я одновременно экономлю и место на диске)) Разве нет?))
Да, поскольку ты одну переменную используешь много раз.
А когда один раз, то прав goodboy.

---------- Post added at 19:35 ---------- Previous post was at 19:33 ----------


И что вместо них юзать тогда?
Я всё в EmulZWin делаю.
Два раза F12 нажал, написал программу, потом F4 и она уже в памяти.

denpopov
03.01.2015, 15:39
блин, и что теперь делать? )) Сублиме текст и ужасасмплюс хреново работают? И что вместо них юзать тогда?

мой архив попробуй - rex.zip

ZX_NOVOSIB
03.01.2015, 15:50
Да, поскольку ты одну переменную используешь много раз.
А когда один раз, то прав goodboy.

А почему, когда я использую переменную один раз, и когда должен быть прав goodboy, то всё-равно прога пишет мне 70 байт против 71 байта (с гудбоевским not pi)?

http://speccy1.mag.su/qbhmww.png
http://speccy1.mag.su/0itiqp.png


Я всё в EmulZWin делаю.
Два раза F12 нажал, написал программу, потом F4 и она уже в памяти.ща попробую..

---------- Post added at 18:50 ---------- Previous post was at 18:45 ----------


мой архив попробуй - rex.zipща, погоди, цель разобраться самому )) если в Эмузвине всё получится, то значит виноват не я, и не Слайдер, а кто-то из пары "сублиме-ужасасм"

scl^mc
03.01.2015, 15:52
Кто победит, NOVOSIB или goodboy?
мда, интересно, кто же победит? человек-гуру в играх (чтобы это не означало), или же новосиб? по-моему, ответ очевиден.

ZX_NOVOSIB
03.01.2015, 15:54
scl^mc, я сам был бы рад если бы "победил" гудбой, но проклятая прога, на скринах выше, пишет 70 байт против 71

Reobne
03.01.2015, 15:54
А почему, когда я использую переменную один раз, и когда должен быть прав goodboy, то всё-равно прога пишет мне 70 байт против 71 байта (с гудбоевским not pi)?
Очевидно, она пишет только длинну бейсик программы, без сохранённых переменных.

scl^mc
03.01.2015, 15:59
А почему, когда я использую переменную один раз, и когда должен быть прав goodboy, то всё-равно прога пишет мне 70 байт против 71 байта (с гудбоевским not pi)?
потому что прога эта показывает только длину бейсик-проги, без учета информации о переменных. каждый символ/команда/буква (за исключением чисел, если они, конечно, не запиханы в кавычки после val) занимает в памяти ровно один байт. потому конструкция border not pi занимает три байта, а border n - 2 байта, но первая конструкция самодостаточна, а вторая использует значение переменной n, которая также занимает место. числа в памяти спектрума кодируются пятью байтами, поэтому (как видно в примере goodboy'я) первый вариант программы занимает 8 байт, а второй - 13.
рукалицо, ей-богу...

ZX_NOVOSIB
03.01.2015, 16:09
Я всё в EmulZWin делаю.
Два раза F12 нажал, написал программу, потом F4 и она уже в памяти.написал, нажал F4, и по какому адресу теперь эта программа?

Reobne
03.01.2015, 16:12
написал, нажал F4, и по какому адресу теперь эта программа?
Вот я написал

ORG 23872
m0 DI
LD BC,6805H
LD DE,(23796)
LD HL,8000H
CALL 3D13H
EI
JP 8000H
LD B,104
LD DE,(23796)
m1 INC E
LD A,E
CP A,16
JR C,m2
INC D
LD E,0
m2 DJNZ m1
LD (23796),DE
JP m0



Первая строка: ORG 23872, вот по этому адресу она и впечаталась. :)
Только надо бейсик приготовить, чтобы после REM нужное число пробелов было.

ZX_NOVOSIB
03.01.2015, 16:17
потому что прога эта показывает только длину бейсик-проги, без учета информации о переменных. каждый символ/команда/буква (за исключением чисел, если они, конечно, не запиханы в кавычки после val) занимает в памяти ровно один байт. потому конструкция border not pi занимает три байта, а border n - 2 байта, но первая конструкция самодостаточна, а вторая использует значение переменной n, которая также занимает место. числа в памяти спектрума кодируются пятью байтами, поэтому (как видно в примере goodboy'я) первый вариант программы занимает 8 байт, а второй - 13.
Эмм.. хм.. ну понятно.. Просто когда в тр-досе по команде LIST выводится инфа, то я думал, что размер бейсик-проги это Length. Получается размер это Start? :confused:

Reobne
03.01.2015, 16:22
я думал, что размер бейсик-проги это Length. Получается размер это Start?
Надо говорить, что размер бейсик-проги это Length. А Start это размер бейсик-проги и переменных. И занятое место на диске - именно Start.

ZX_NOVOSIB
03.01.2015, 16:44
Надо говорить, что размер бейсик-проги это Length. А Start это размер бейсик-проги и переменных. И занятое место на диске - именно Start.
ага, вот теперь более-менее понятно. Но один хрен, когда мы экономим место в памяти, то есть хотим получить возможность выставить clear пониже, то border n предпочтительнее, чем border not pi :) Пусть на диске это занимает чуть больше, но зато оператор clear более добрый, счастливый и сговорчивый ;)

creator
03.01.2015, 16:46
ZX_NOVOSIB, добрый, счастливый и сговорчивый CLEAR уничтожит твои переменные в памяти и ты нарвёшься на "Вариабле нот фоунд".
Хотя, если сделать "paper n: ink n: border n: clear XXXXX", тогда вполне проканает.

Reobne
03.01.2015, 16:48
ZX_NOVOSIB, добрый, счастливый и сговорчивый CLEAR уничтожит твои переменные в памяти и ты нарвёшься на "Вариабле нот фоунд".
Он это знает, поэтому использует до CLEAR. :)

denpopov
03.01.2015, 16:51
епрст, есть переменная же 23693- цвет атрибутов. Чем не экономия?:)

ZX_NOVOSIB
03.01.2015, 17:53
Кроме упомянутых в "интро" людей, огромное спасибо denpopov и Reobne!:v2_thumb:
Рабочий монолоадер в аттаче. Даже демка запускается, там надо было clear выставить родной, 24999, а у меня стоял "от первой части" - 24599, с ним почему-то не работало.

Сначала я думал, кто виноват, сублиме&ужасасм, Слайдер или я? Оказалось виноваты все :D
Софтины не понимали то, что должны были понимать, то, что прекрасно понимает например Эмузвин. Слайдер ошибся в процедуре пропуска, у него там "CP 16", а надо "CP A,16". Ну а я недостаточно читал Капульцевича и поэтому ничего не заподозрил, и все эти ошибки вовремя не заметил.

Кстати лишний раз убеждаюсь, что Эмузвин - суперэмулятор, порой затыкает за пояс и унреал и спекулятор! Его бы допилить - и все остальные эмули, сублиметексты и ужасасмы можно на помойку выбросить ))) А так, он сыроват, глюки есть... Лучше бы его допиливали, чем унреал.

Reobne
03.01.2015, 18:00
у него там "CP 16", а надо "CP A,16"
Это одно и то-же :)

---------- Post added at 22:00 ---------- Previous post was at 21:55 ----------

Теперь следующий этап, делай с ЧИТ-МЕНЮ. :)

denpopov
03.01.2015, 18:06
вот почему в моем bat'нике стоит pause - всегда видно, что ужасм выдает - ошибки или нет.

---------- Post added at 18:06 ---------- Previous post was at 18:05 ----------


Теперь следующий этап, делай с ЧИТ-МЕНЮ.
проще крэктру сделать:)

g0blinish раньше собирал игры по-другомы:
при загрузке держишь клавишу и покесы отрабатывают.

ZX_NOVOSIB
03.01.2015, 18:15
Это одно и то-же :)значит Слайдер реабелитирован! )

denpopov
03.01.2015, 18:45
значит Слайдер реабелитирован! )
ну кстати, процедуру обхода секторов я видел другую. Старая неплоха, но сделана в лоб как-то.

Alex Rider
03.01.2015, 19:17
Ребяты, чем вы там Новый год отмечали? То 100500 сообщений не могли понять что такое "длина бейсик-программы" и "длина бейсик-файла", то не увидели на скриншоте из sublime, что метки находятся в поле операнда, а ужасм выдает exit code 1...

В общем, я предлагаю тут прервать костылестроение. Если уж делать что-то в первый раз, то правильно. Итак, правильно:
1. Отказаться от монолоадера с пропуском секторов. Ибо непонятно зачем оно.
2. Перестать писать супероптимальные и мозголомные BASIC-загрузчики.
3. В кодах сделать только выставление стека, загрузку файлов, патчинг и запуск.

Что для этого надо:
1. Четкое техзадание (в частности, что куда грузить, как это патчить и запускать потом).
2. Готовый BASIC с выбором версии, cheat-меню, распаковкой и показом картинки, но без загрузки, патчинга и запуска пока. Пусть он сохраняет выбор пользователя в переменных (номер версии, какие читы применять). Оптимизировать по размерам его не нужно, потом потрем нафик.

Дальше выкидываем пропуск секторов, загрузку через 5-й рестарт TR-DOS, делаем в кодах нормальную загрузку файлов, патчинг как надо и запуск. И получится релиз, которым можно гордиться, а не в который пальчиком тыкать будут.

PS ZX_NOVOSIB, верни @echo off в build.bat в папке Sublime, исчезнут тонны мусора и в output Sublime сразу будет видно количество и строки с ошибками. И да, перечитай у Капульцевича или еще где про формат строки и больше не пиши метки с отступами.

denpopov
03.01.2015, 19:25
В общем, я предлагаю тут прервать костылестроение. Если уж делать что-то в первый раз, то правильно.

а чем плох вариант на основе твоего исходника?

Alex Rider
03.01.2015, 19:33
ну кстати, процедуру обхода секторов я видел другую.
Ну, наверное, как-то так (писал из головы)


; in: a - количество секторов
ld hl,(#5cf4)
ld b,a
and #0f
add a,l
ld l,a
res 4,l
and #10
add a,b
rrca
rrca
rrca
rrca
and #0f
add a,h
ld h,a
ld (#5cf4),hl
ret

denpopov
03.01.2015, 19:40
Ну, наверное, как-то так (писал из головы)
не, другую, просто думать неохота, надо пошарить в архивах.

---------- Post added at 19:40 ---------- Previous post was at 19:39 ----------


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

Alex Rider
03.01.2015, 19:40
а чем плох вариант на основе твоего исходника?
Какого?
Я так понимаю, сейчас автор отказался от читов ради того, чтобы сделать очередной релиз двух REX'ов в одном флаконе, коих есть уже.
И, кстати, не знаю про какие версии REX'ов вы говорите, но BASIC + жатая картинка + 2 жатых REX'а могут внезапно занять больше 256 секторов, что отменяет монолоадер. Это кто-то проверял?

baxter
03.01.2015, 19:44
ZX_NOVOSIB, не страдай хернёй!

denpopov
03.01.2015, 19:47
Какого?

кажись в SptiteGrabber был вариант как то, что я использовал.


что отменяет монолоадер. Это кто-то проверял?
это сборка же - все в кучу.

---------- Post added at 19:47 ---------- Previous post was at 19:45 ----------


ZX_NOVOSIB, не страдай хернёй!
Да нормально всё, можно подумать, лоадеры просто так даются.

Alex Rider
03.01.2015, 20:04
кажись в SptiteGrabber был вариант как то, что я использовал.
В граббере и всяких других моих поделках нет никаких заставок и чит-меню на бэйсике :). И стек не болтается прямо перед буфером сектора TR-DOS. Соответственно, бэйсик тупой как валенок.

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

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

denpopov
03.01.2015, 20:09
Повторюсь, костылеориентированный подход для обучения неуместен.

вот пришел бы раньше- избавил бы от мучений:)

Alex Rider
03.01.2015, 20:21
вот пришел бы раньше- избавил бы от мучений
Я все выяснял что автору больше хочется - научиться писать загрузчики или получить нужную ему адаптацию :)

А если оно займет больше 256 секторов, то в один файл не склеишь же.
Поглядел га образ, который мне присылал ТС - там суммарный объем файлов больше 256 секторов, так что монолоадер отменяется.

ZX_NOVOSIB
03.01.2015, 20:35
1. Отказаться от монолоадера с пропуском секторов. Ибо непонятно зачем оно.А почему надо отказываться от монолоадера с пропуском секторов? Монолоадер можно сделать как-то без пропуска секторов? Как? Если делать немоно, то это не интересно :(

И да, перечитай у Капульцевича или еще где про формат строки и больше не пиши метки с отступами.Т.е. если бы я прочитал про формат строки, то я сразу бы понял, что m1 и m2 это метки? Допустим :)
А как в Сублиме их, метки, вводить? Ведь я жму ентер, курсор перескакивает вниз, что дальше? Нужно метки вводить левее чем операнды? Но как, ведь курсор попадает прямиком под операнды.

---------- Post added at 23:32 ---------- Previous post was at 23:26 ----------


Какого?
Я так понимаю, сейчас автор отказался от читов ради того, чтобы сделать очередной релиз двух REX'ов в одном флаконе, коих есть уже.Таких, со свободой перемещения по карте, нету.

И, кстати, не знаю про какие версии REX'ов вы говорите, но BASIC + жатая картинка + 2 жатых REX'а могут внезапно занять больше 256 секторов, что отменяет монолоадер. Это кто-то проверял?Мой релиз - это 255 секторов + 81 сектор. А например релиз от Слайдера внезапно занимает 255+92 )) А у него нельзя по всей карте ходить ;) А вообще такой вес получается, потому что ведь там еще обучающая дема и картинок 5 штук (2 вступительные и 3 - от 1,2 и демо частей соответственно)

---------- Post added at 23:35 ---------- Previous post was at 23:32 ----------

В моем понимании монолоадер это не обязательно один файл, это когда минимально возможное количество файлов, с разбиением на 255 секторов.

denpopov
03.01.2015, 20:44
подождем, когда сбацаешь следующий монолоадер:)

Alex Rider
03.01.2015, 21:48
Т.е. если бы я прочитал про формат строки, то я сразу бы понял, что m1 и m2 это метки?
Нет, надо еще и понимать что такое метка. Вот когда ты видишь команду djnz m1, которая подразумевает адрес (смещение, метку строки) вторым операндом, ты понимаешь, что это - метка :)


А как в Сублиме их, метки, вводить? Ведь я жму ентер, курсор перескакивает вниз, что дальше?
Это же обычный текстовый редактор с "умным Tab'ом". Он за тебя нажал Tab ну, наверно, потому, что вероятнее всего, ты будешь вводить строку без метки. Обычные кнопки управления курсором ("стрелка влево", Home) вернут курсор в начало строки.

В моем понимании монолоадер это не обязательно один файл, это когда минимально возможное количество файлов, с разбиением на 255 секторов.
Ну так ты тогда и говори что ты делаешь монолоадер "в твоем понимании". Потому что в общепризнанном понимании монолоадер - это загрузчик разных данных их одного файла. Тут понимаешь какая штука. Монолоадер считает, что отдельно загружаемые куски лежат в строго заданном автором порядке внутри одного файла. Если ты будешь считать, что у тебя вторая часть начинается со смещением, допустим, в 202 сектора от конца BASIC'а и имеет длину больше 100 секторов, то автоматически предполагается, что остаток секторов, невлезший в текущий файл, лежит в следующем по порядку файле. Но копировшики не гарантируют порядок файлов при копировании, и после копирования твоей игры в другой образ порядок файлов в нем может получиться любым, и игра с возможно разрушительными последствиями вылетит в неведомые дали.

---------- Post added at 21:48 ---------- Previous post was at 21:47 ----------

Так, стоп. Я тут побаловался с твоим образом. А с чего ты решил, что у тебя CLEAR не срабатывает? У тебя есть образ с работающими и правленными REX1 и REX2? В том образе, который ты мне присылал, после одного маленького шаманства запросто работает дема, например. А вот сами части не запускаются. В смысле, нет команды их запуска. Дай адрес старта, я проверю. Может, оно и вообще не надо возиться с кодовыми загрузчиками.

daniel
04.01.2015, 06:40
Но копировшики не гарантируют порядок файлов при копировании, и после копирования твоей игры в другой образ порядок файлов в нем может получиться любым, и игра с возможно разрушительными последствиями вылетит в неведомые дали.

да уж... а как же 100500 релизов которые занимают больше 255 секторов? ///
а копировщикам доверяй, но прповеряй.
в общем :v2_dizzy_facepalm:

denpopov
04.01.2015, 07:15
В смысле, нет команды их запуска. Дай адрес старта, я проверю
32768 итак ясно.

ZX_NOVOSIB
04.01.2015, 14:16
Ну так ты тогда и говори что ты делаешь монолоадер "в твоем понимании". Потому что в общепризнанном понимании монолоадер - это загрузчик разных данных их одного файла. Тут понимаешь какая штука. Монолоадер считает, что отдельно загружаемые куски лежат в строго заданном автором порядке внутри одного файла. Если ты будешь считать, что у тебя вторая часть начинается со смещением, допустим, в 202 сектора от конца BASIC'а и имеет длину больше 100 секторов, то автоматически предполагается, что остаток секторов, невлезший в текущий файл, лежит в следующем по порядку файле. Но копировшики не гарантируют порядок файлов при копировании, и после копирования твоей игры в другой образ порядок файлов в нем может получиться любым, и игра с возможно разрушительными последствиями вылетит в неведомые дали.кажется я смутно понимаю о чем ты.. :)
Но чтобы окончательно прояснить ситуацию, хочу понять, например вот это:
http://vtrdos.ru/gamez/r/REX12D_S.zip
http://vtrdos.ru/gamez/l/LN2REMIX.zip
монолоадеры или нет? Они будут работать, если копировщик нарушит порядок файлов?

scl^mc
04.01.2015, 14:38
Но копировшики не гарантируют порядок файлов при копировании
интересно, в каком из 100500 копировщиков, коммандеров и прочих при копировании файлы запихиваются на destination-диск не в том порядке, который был на source-диске?

---------- Post added at 14:38 ---------- Previous post was at 14:36 ----------


http://vtrdos.ru/gamez/r/REX12D_S.zip
поменяй местами файл с расширением c и w - и получи глюк в самый неожиданный момент

http://vtrdos.ru/gamez/l/LN2REMIX.zip
аналогично

Reobne
04.01.2015, 14:44
Да и "родные" маджик сброшеные 128к файлы тоже, по инструкции, путать нельзя.

denpopov
04.01.2015, 14:50
интересно, в каком из 100500 копировщиков, коммандеров и прочих при копировании файлы запихиваются на destination-диск не в том порядке, который был на source-диске?

у Perfect Commander'a вроде как есть режим - копирование по очереди выделенных файлов.

ZX_NOVOSIB
04.01.2015, 14:59
Опа. Внезапно чуть-чуть отвечу сам себе...)
LNR не пробовал, а вот Рекс от Слайдера не работает, (выбираем вторую часть) если поменять файлы. А Слайдер - не чайник, не нуб, его релизы не "в который пальчиком тыкать будут." В каком-то смысле у него ведь самые полные релизы. Так что если его релизы норм, то и мой рекс - норм. В плане "правильности монолоадера" ;) Я так считаю. Как правильно заметил daniel, существует 100500 релизов, которые ничем не лучше моего в плане "правильности монолоадера".

---------- Post added at 17:59 ---------- Previous post was at 17:57 ----------

пока писал пост - трое ответили ) Ну в общем единогласное мнение, что мой рекс - это не "монолоадер в понимании NOVOSIB'a", а просто обычный нормальный монолоадер :)

scl^mc
04.01.2015, 15:00
у Perfect Commander'a вроде как есть режим - копирование по очереди выделенных файлов.
ну он же не по умолчанию там стоит

Alex Rider
04.01.2015, 15:46
монолоадер в понимании NOVOSIB'a
Вот тут (http://code-zx2.zxnet-archive.ru/id/822), кстати, тоже интересное понимание монолоадера. Но мне все же больше нравится классическая трактовка - один склеенный файл с расширением B, который можно невозбранно копировать в любые коллекции. Собсна, современные релизы рассчитаны на использование образов в том виде, в котором их положил автор.
PS А мне как-то никогда не лень было сделать читалку каталога...

ZX_NOVOSIB
04.01.2015, 16:31
Вот тут (http://code-zx2.zxnet-archive.ru/id/822), кстати, тоже интересное понимание монолоадераТут вообще дикое понимание )) Одна строчка "HИКАКИХ СКЛЕИВАHИЙ. И ДОЗАГРУЗОК ЧЕРЕЗ ТР-ДОС. Программа прячется в REM строке программы ЦЕЛИКОМ" чего стоит )) ..Оно бы всё ничего, но есть куча игр которые никак не влезут в REM строку целиком. Это и 128-ые игры, и 48-ые с левелами. Интересно посмотреть на автора этих строк, как он будет целиком запихивать в REM например Last Ninja 2 или CHASE H.Q. :D

Но мне все же больше нравится классическая трактовка - один склеенный файл с расширением B, который можно невозбранно копировать в любые коллекции. Собсна, современные релизы рассчитаны на использование образов в том виде, в котором их положил автор.
PS А мне как-то никогда не лень было сделать читалку каталога...Опять-таки всё бы ничего, но в 255 секторов не всё влазит. Так то бы оно понятно, что один файл - завсегда лучше. Кстати скоко живу - ни разу не возникало ситуации, чтобы копировщик что-то скопировал в неправильном порядке.:o

Я тут подумал.. могу доработать свой релиз, так, чтобы по прежнему было два файла, но чтобы они работали в любом порядке)) это даже бейсиком делается)) вот только не могу понять, нафига оно надо. Разве что чисто из спортивного интереса.

Кстати, можно как-то все 3 части рекса всё-таки запихать в 255 секторов? Можно же склеить две части, а потом полученный файл пожать, там же дофига одинакового, должно хорошо пожаться. Или сначала пожать каждый отдельно, потом склеить и еще пожать?.. В случае успеха, можно всё это дело грузить по кусочкам и распихивать по 128-ым страницам, потом выбор части, потом склеиваем нужный кусок и запускаем его. Кто что думает?

denpopov
04.01.2015, 16:35
Кстати, можно как-то все 3 части рекса всё-таки запихать в 255 секторов?

попробуй другие пакеры.Exomizer, например..

daniel
04.01.2015, 17:33
Кстати, можно как-то все 3 части рекса всё-таки запихать в 255 секторов?
если файлов много объединяют в моноблок то как правило между ними есть неиспользуемые байты. Например файл длиной 257 байт будет занимать 2 сектора (512 байт), т.е. имеем 255 свободных байтов на диске. Думаю принцип понятен. Дальше сам додумывай у тебя 4 файла плюс бэйсик так? но в 255 не уложишься похоже. Можно части рекса проанализировать на предмет одинаковых областей и их хранить отдельными секторами - если есть такой спортивный интерес.

---------- Post added at 17:26 ---------- Previous post was at 17:24 ----------

в общем это спорт чисто для себя, который никто не оценит.

---------- Post added at 17:29 ---------- Previous post was at 17:26 ----------

у каждой части свой депакер? делай один депакер и храни его в отдельном секторе.

---------- Post added at 17:31 ---------- Previous post was at 17:29 ----------

картинку прогони перед упаковкой через Screen optimizer.

---------- Post added at 17:33 ---------- Previous post was at 17:31 ----------

шрифт в частях одинаковый?

ZX_NOVOSIB
04.01.2015, 17:40
не, всякие там сектора и шрифты - не помогут, слишком сильный заступ за 255 секторов. Нужно что-то радикальное. Например я беру 1 часть и пакую хрумом, беру 2-ую и пакую хрумом. Потом эти два архива склеиваю риалкоммандером, полученный файл весит 202 сектора. Этот файл снова пакую хрумом и получается файл 115 секторов. Вот только к нему нужен какой-то заумный "распаковщик-распихивальщик в 128-ые страницы" . Интересно, этот файл 115 секторов вообще впринципе рабочий? В аттаче исходный файл 202 сектора и сжатый - 115 секторов.

denpopov
04.01.2015, 17:46
Нет, htrum лучше справился.

ZX_NOVOSIB
04.01.2015, 18:05
Нет, htrum лучше справился.смысл фразы понял на 0%
Что "нет"? Какой htrum? С чем лучше справился? Когда справился? Как? :)

denpopov
04.01.2015, 18:09
Что "нет"? Какой htrum? С чем лучше справился? Когда справился? Как?

лучше сжал файлы, что ты привел.

LZ4 бы попробовать, но у меня нет депакера.

daniel
04.01.2015, 18:13
Потом эти два архива склеиваю риалкоммандером, полученный файл весит 202 сектора. Этот файл снова пакую хрумом и получается файл 115 секторов.
это подтверждает теорию, что данные в частях повторяются (графика шрифты...), можно сделать вот что- разрезать каждую из 2 частей рекса кусками по напрмер 8 кб (8192 байта) и раскидать по страницам, а потом эти страницы паковать. например страница 0 будет выглядеть:
49152 - 57343 - 1 блок первого рекса
57344 - 65535 - 1 блок второго рекса

след странице будут вторые блоки по 8192 байта
затем третьи и .т.д.

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

ZX_NOVOSIB
04.01.2015, 18:16
лучше сжал файлы, что ты привел.Ясно.. Мне просто любопытно, когда мы склеиваем два архива хрума, а потом склееный файл еще раз жмем хрумом, то вприниципе получается что-то рабочее? Из того 115 секторного файла можно снова получить исходную склейку архивов весом в 202 сектора?

daniel
04.01.2015, 18:18
резать нужно полностью распакованные данные

---------- Post added at 18:18 ---------- Previous post was at 18:18 ----------


Из того 115 секторного файла можно снова получить исходную склейку архивов весом в 202 сектора?
думаю можно.

denpopov
04.01.2015, 18:32
то вприниципе получается что-то рабочее?
не понял.

как вариант - попробуй сжать картинки zx7, но распаковывать их хитрее.

ZX_NOVOSIB
04.01.2015, 18:41
не понял.ну я имел ввиду, 115 секторов это что получилось, бред или рабочий архив. daniel говорит что получился рабочий архив. И сжатие ведь офигенное в итоге мы имеем.

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

Alex Rider
05.01.2015, 02:29
Опять-таки всё бы ничего, но в 255 секторов не всё влазит.
255 секторов - это вся 48-я память с почти всем ПЗУ. В сжатов виде еще больше. Для одной 48-й игры, возможно, даже с уровнями должно хватать.

Я тут подумал.. могу доработать свой релиз, так, чтобы по прежнему было два файла, но чтобы они работали в любом порядке)) это даже бейсиком делается)) вот только не могу понять, нафига оно надо. Разве что чисто из спортивного интереса.
Действительно ради интереса. Правда, не понял как. А если между ними еще файлы будут? Кстати, если бы я писал надежный копировщик с поддержкой одного дисковода, я бы старался за раз загрузить как можно больше файлов целиком, а не секторов.


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

Потом эти два архива склеиваю риалкоммандером, полученный файл весит 202 сектора. Этот файл снова пакую хрумом и получается файл 115 секторов.
У тебя еще 77 секторов demo, 54 экранов и копейки BASIC'а. Это тоже должно войти в каноничный моноблок.

goodboy
05.01.2015, 11:13
глянул ещё раз обе части - заставка под меню там одинаковая.

http://savepic.ru/6551330.png

если её вырезать и выводить после загрузки любой части - несколько секторов точно съэкономим.

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

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

ZX_NOVOSIB
05.01.2015, 14:09
255 секторов - это вся 48-я память с почти всем ПЗУ. В сжатов виде еще больше. Для одной 48-й игры, возможно, даже с уровнями должно хватать.ну вот например Last Ninja, я выше ссылку давал, она 48-ая до мозга костей, с уровнями, в 255 не влезет. Хотя там уровни одинаковые, если их как-то хитро сжать, то всё влезет в 255, но просто над сжатием в наше время никто не заморачивается, ни чайники, ни тем более кодеры ))

Действительно ради интереса. Правда, не понял как. А если между ними еще файлы будут?Как? Элементарно (http://speccy1.mag.su/w9yekd.zip) ))) Тоже два файла, суммарный размер не увеличился ни на сектор, но теперь абсолютно по барабану в каком порядке эти два файла и есть ли между ними какие-то другие файлы. Но кроме спортивного - смысла нет. Можно ведь сделать, чтобы работало не только если файлы не по порядку, а и если они на разных дискетах, в разных дисководах )) токо непонятно нафига.

Кстати, если бы я писал надежный копировщик с поддержкой одного дисковода, я бы старался за раз загрузить как можно больше файлов целиком, а не секторов.хорошо, однако, что ты не пишешь копировщик :) ибо такой копировщик как раз и грешил бы "перепутыванием порядка файлов", и over 100500 релизов с вирта не работало бы.

ZX_NOVOSIB
05.01.2015, 14:18
глянул ещё раз обе части - заставка под меню там одинаковая,
если её вырезать и выводить после загрузки любой части - несколько секторов точно съэкономим.не, экономить несколько секторов - нет спортивного интереса. Вот когда вместо 202 сектора получаем 115 - вот это да.. )) токо полученный архив хрен распакуешь.. Alex Rider говорит, что "Эввективные распаковщики используют уже распакованное для распаковки нового. Так что со страницами там будет большая проблема. Даже если написать такой алгоритм, работать он будет бесконечно долго из-за проверки для каждого байта сжатого/распакованного блока границ страниц и щелканья страниц для доступа к истории." А может как-то заюзать возможности 128 бейсика? Ну там SAVE ! / LOAD ! Токо пока не могу придумать как всё это замутить..

для полноты картины я бы добавил в релиз ещё демо-версию (там скрины и враги из разных частей)о какой демо-версии идет речь? Можно ссылку на неё?

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

denpopov
05.01.2015, 14:44
Дались вам эти сборки >255 секторов...

ZX_NOVOSIB
05.01.2015, 14:50
denpopov, не, ну просто если можно всё засунуть в 255, то почему бы и нет )

goodboy
05.01.2015, 14:53
о какой демо-версии идет речь? Можно ссылку на неё?http://www.worldofspectrum.org/infoseekid.cgi?id=0013764

Alex Rider
05.01.2015, 15:09
хорошо, однако, что ты не пишешь копировщик ибо такой копировщик как раз и грешил бы "перепутыванием порядка файлов", и over 100500 релизов с вирта не работало бы.
Ну так, оно надо было когда дисководы и дискеты были физическими. Хотя в TR-DOS нет понятия "номер файла на диске" (ну почти нет :) ) и он не гарантирует проядок файлов, на деле же оказалось, что ни сам TR-DOS, ни командеры порядок файлов не меняют. Да и сейчас никто не копирует игры из образов - нафик не надо. Так что, вроде как, можно с этого профит поиметь. Но вспоминается мне тут история про out (#fd),a...
В общем, мои рекомендации все равно остаются в силе: если грузим файлы машкодом, то либо высокоуровневыми функциями, либо читаем каталог, а из него координаты файлов.

А может как-то заюзать возможности 128 бейсика? Ну там SAVE ! / LOAD ! Токо пока не могу придумать как всё это замутить..
Если я не ошибаюсь, REX'ы 48-е. То есть, ты хочешь сделать уникальный релиз 128-м только потому, что хочешь сделать именно монолоадер?
PS Кстати, не забывай о наших нерусских друзьях с господствующим в их головах tap'ом. Глядишь, попросят сделать tap-версию твоего релиза.

scl^mc
05.01.2015, 16:04
Если я не ошибаюсь, REX'ы 48-е.
однозначно 48-е.

А может как-то заюзать возможности 128 бейсика? Ну там SAVE ! / LOAD ! Токо пока не могу придумать как всё это замутить..
128й бейсик отличается от 48го только вводом команд побуквенно и двумя новыми командами, одна из которых play (аналог beep, но для ay), а вторая тоже нафиг никому не нужна.

goodboy
05.01.2015, 16:52
128й бейсик отличается от 48го только вводом команд побуквенно и двумя новыми командами, одна из которых play (аналог beep, но для ay), а вторая тоже нафиг никому не нужна.
хуже что они подвязали токены этих команд на UDGграфику.
и те игры что её используют в 128к режиме будут выглядеть очень неприглядно.
кроме того команды для RamDisk в 128/+3 отличаются.

на самом деле 128ой бейсик это скорее только полноэкранный редактор, выполнение команд передаётся в 48ой.

ZX_NOVOSIB
05.01.2015, 17:29
http://www.worldofspectrum.org/infoseekid.cgi?id=0013764спасибо, глянул, ну интересно так, один раз глянуть, что мол вот, была демка. Но лично я смысла в ней не вижу. Для коллекционера - это да, ценность. А для геймера - так, микрообрубок второго левела )

---------- Post added at 20:21 ---------- Previous post was at 20:18 ----------


выполнение команд передаётся в 48ой.
а какие команды передаются в 48-ой когда мы вводим SAVE ! или LOAD ! ?

---------- Post added at 20:29 ---------- Previous post was at 20:21 ----------


Если я не ошибаюсь, REX'ы 48-е. То есть, ты хочешь сделать уникальный релиз 128-м только потому, что хочешь сделать именно монолоадер?да не, это так, спортивный интерес. Нет какой-то сверхцели сделать именно 255 секторов или именно 128.

Кстати, не забывай о наших нерусских друзьях с господствующим в их головах tap'ом. Глядишь, попросят сделать tap-версию твоего релиза.Надо попробовать сделать tap монолоадер.. )

Alex Rider
05.01.2015, 17:39
128й бейсик отличается от 48го только вводом команд побуквенно и двумя новыми командами, одна из которых play (аналог beep, но для ay), а вторая тоже нафиг никому не нужна.
Ну как бы команды работы с RAM-диском еще.

а какие команды передаются в 48-ой когда мы вводим SAVE ! или LOAD !
ЕМНИП, в 128-м свой интерпретатор. Он только исполние большинства команд 48-го отдает в 48-е ПЗУ. Обработку команд ввода-вывода пытается делать сам, если видит, что кассета, уходит в 48-е ПЗУ, с RAM-диском работает тоже сам.

---------- Post added at 17:39 ---------- Previous post was at 17:37 ----------


Надо попробовать сделать tap монолоадер.. )
tap-монолоадера не бывает. Монолоадер - это технология загрузки с диска. tap последовательный, там 101 сектор не пропустишь.

denpopov
05.01.2015, 17:46
Монолоадер - это технология загрузки с диска. tap последовательный, там 101 сектор не пропустишь.

Мож и не монолоадер, но помнится был у меня на кассетах BarBarian размером с 40960 байт.

scl^mc
05.01.2015, 18:04
Ну как бы команды работы с RAM-диском еще.
которые новосибу уж точно нафиг не нужны :)

Alex Rider
05.01.2015, 18:11
которые новосибу уж точно нафиг не нужны

А может как-то заюзать возможности 128 бейсика? Ну там SAVE ! / LOAD ! Токо пока не могу придумать как всё это замутить..

Ну он про них упоминал :) Хотя, да, не сгодятся они ему.

denpopov
05.01.2015, 18:11
ЖЖоте, господа...15 страниц и это никогда не кончится..

Alex Rider
05.01.2015, 18:16
Мож и не монолоадер, но помнится был у меня на кассетах BarBarian размером с 40960 байт.

ЕМНИП, это борьба с кассетными копировщиками а-ля TF-COPY. Ну и мож автостарт заодно.

---------- Post added at 18:16 ---------- Previous post was at 18:13 ----------


ЖЖоте, господа...15 страниц и это никогда не кончится..
Я раньше тоже любил несистемное изучение материала. :D Типа "объясни мне быстренько на пальцах технологию xxx, я ща прям все сделаю". Ну или в институте - то, что мне интересно/актуально - это в мейнстриме, рассказывайте, тока к черту подробности. А вот это вот ваше околонаучное-историческое-низкоуровневое - это "для галочки" и знать не надо.

ZX_NOVOSIB
05.01.2015, 18:48
tap-монолоадера не бывает. Монолоадер - это технология загрузки с диска. tap последовательный, там 101 сектор не пропустишь.
ну я имел ввиду конечно два тапка, 1ый и 2ой левел.
Но чтобы каждый состоял просто из одного бейсик файла. Или так не получится?

В бейсике должна быть заставка и сам код игры (запакованные). Причем всё это даже в рем строку влезет, но... Надо сделать, чтобы первым делом грузилась и показывалась заставка, и это всё усложняет.. получается один файл никак не сделать?

Или в бейсик встроить например заставку; бейсик с заставкой в рем загрузится, покажет картинку и дальше пойдет код игры. Но это слишком просто. Неужели нельзя всё в один файл запихать и чтобы заставка показывалась в начале? :)

---------- Post added at 21:48 ---------- Previous post was at 21:44 ----------


15 страниц и это никогда не кончится..ну и хорошо, правда ведь? ;)
Или надо чтобы общение на форуме заглохло? :)

еще и сугубо про спектрум общаемся, если чо

goodboy
05.01.2015, 18:51
Неужели нельзя всё в один файл запихать и чтобы заставка показывалась в начале?
можно, но это будет уже не TAP.
поскольку надо писать свой лоадер, а не использовать ПЗУшный.

ZX_NOVOSIB
05.01.2015, 19:08
можно, но это будет уже не TAP.мда, TAP конечно желателен, хотя бы даже из-за divIDE.. Ладно, сделаю чтобы на каждый левел был 1 бейсик и 1 кодовый файл. Какую команду в бейсике надо дать, чтобы после показа картинки, она не испортилась надписью "byte: code"? Банальные черные чернила и черная бумага не спасут?

поскольку надо писать свой лоадер, а не использовать ПЗУшный.для тр-доса монолоадер вообще простой и короткий, особенно если не надо сектора пропускать. Для ленты сильно сложней сделать свой лоадер?

denpopov
05.01.2015, 19:08
Я раньше тоже любил несистемное изучение материала.

Ну возьмем бордер-эффекты. Расскажи мне на пальцах технологию подготовки..


ЕМНИП, это борьба с кассетными копировщиками а-ля TF-COPY.
TF-COPY сжимал тот файл, кстати. Не помню, какая версия.

ZX_NOVOSIB
05.01.2015, 19:18
Ну возьмем бордер-эффекты. Расскажи мне на пальцах технологию подготовки.тут всё просто, вбиваешь в бейсике
1 BORDER 7
2 BORDER 7
3 BORDER 1
4 BORDER 1
5 BORDER 2
6 GOTO 1
и всё, бордер эффект ))

Alex Rider
05.01.2015, 19:22
Какую команду в бейсике надо дать, чтобы после показа картинки, она не испортилась надписью "byte: code"?
POKE 23739,111

Для ленты сильно сложней сделать свой лоадер?
Да, довольно сложно. Надо понимать принципы загрузки с ленты.

Ну возьмем бордер-эффекты. Расскажи мне на пальцах технологию подготовки..
Ну как - begin: ld c,#0e: out (c),a: out (c),b: out (c),c: out (c),d: out (c),e: out (c),h: out (c),l:jr begin же :) :) :)

denpopov
05.01.2015, 19:27
Ну как - begin: ld c,#0e: out (c),a: out (c),b: out (c),c: out (c),d: out (c),e: out (c),h: out (c),l:jr begin же

ну а дальше - почему картинка дрожит и не привязана к экрану?


тут всё просто, вбиваешь в бейсике
мда... юзер ты еще торт..

ZX_NOVOSIB
05.01.2015, 19:47
мда... юзер ты еще торт..злой ты :v2_cry:

denpopov
05.01.2015, 20:14
злой ты

а тож.

scl^mc
05.01.2015, 20:52
тут всё просто, вбиваешь в бейсике
уж не российский флаг ли в итоге получится? реала/эмуля под рукой нет, проверить не могу...

denpopov
05.01.2015, 21:02
уж не российский флаг ли в итоге получится? реала/эмуля под рукой нет, проверить не могу...

с полоской перебор вышел малясь

goodboy
05.01.2015, 21:05
если не ошибаюсь в эмуле Z80Stealth есть редактор картинок на бордюре,
который потом ваше творение превращает в программу.

.................................

а вот и моё творение на бейсике

http://savepic.ru/6511243.png

Alex Rider
05.01.2015, 22:46
ну а дальше - почему картинка дрожит и не привязана к экрану?
А теперь надо почитать килобайты текста. Ну или и дальше просить куски кода на форуме. Все просто ж :) В общем, либо системно учиться, либо собирать в мозаику решение одной конкретной задачи из чужих кусков.

goodboy
05.01.2015, 22:47
теперь абсолютно по барабану в каком порядке эти два файла и есть ли между ними какие-то другие файлы. Но кроме спортивного - смысла нет. Можно ведь сделать, чтобы работало не только если файлы не по порядку, а и если они на разных дискетах, в разных дисководах )) токо непонятно нафига.
до появления формата SCL, TRD собирали/разбирали из Hobeta,там было строго; один блок- один файл. выручала сортировка по-времени создания файла) иначе правильный порядок определить иногда было сложно

http://savepic.ru/6494874.png

в этом примере хорошо что в именах файлов есть цифры.

denpopov
06.01.2015, 05:54
А теперь надо почитать килобайты текста. Ну или и дальше просить куски кода на форуме.

Да я знаю ответы то.:) просто не похоже это на системное обучение имхо.

Alex Rider
06.01.2015, 23:26
просто не похоже это на системное обучение имхо.
Не, почитать килобайты - это системное обучение. Спрашивать лепить мозаику из чужих обрывков - нет.

ZX_NOVOSIB
09.01.2015, 20:55
В итоге решил сделать самый простейший TAP, безо всяких выкрутасов. Пойдет такой? Если замечаний нет, то делаю второй левел и пощщу в первом посту профильной темы в разделе игры и на ВоС. Только если на ВоСе постить, то мне нужен английский текст, короткое описание что это и зачем )) Что мол можно из конца в начало, можно проваливаться в дырки, которые в красном грунте.

Upd.: в аттаче оба левела.

denpopov
09.01.2015, 20:58
Спрашивать лепить мозаику из чужих обрывков - нет.

меня учили по-другому, объяснили все нюансы, стало проще.

ZX_NOVOSIB
11.01.2015, 13:07
Продолжая тему флуда бордер-флагов...:rolleyes: В общем в аттаче .tzx рекса с немного доработанной заставкой, грузить на нормальной скорости, строго в режиме пентагона из 48-ого бейсика! Старым добрым LOAD "" И желательно в настройках эмуля сделать бордер побольше.

Хотел такую же заставочку сделать для своего +2B - не получается, хоть ты тресни! :(

ZX_NOVOSIB
16.05.2018, 19:16
Слегка перезалил, ибо на скорпионах и т.п. не работала из-за 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
16.05.2018, 19:22
Как так получилось, что бейсик-128 не убивается, но хруст, имея буфер в буфере принтера перестаёт "косячить спрайт"?
так наверно прерывания запрещены (вот бейсик128 и не ведает что творится в буфере)

ZX_NOVOSIB
16.05.2018, 20:25
goodboy, да вроде разрешены:

https://i.imgur.com/1CRZMRi.png

По RET у меня идёт возврат в бейсик, и я думал, что в этом месте всё должно улететь в тар-тарары. Но не улетает. Мало того, можно вообще выйти даже в редактор 128 бейсика, и всё будет ок. И в буфере принтера не нули, а всякая фигня. Но почему тогда эта фигня не мешает хрусту? И почему она раньше ему мешала, а с этим кодом уже не мешает? :v2_wacko:

goodboy
16.05.2018, 22:39
По RET у меня идёт возврат в бейсик, и я думал, что в этом месте всё должно улететь в тар-тарары. Но не улетает
а почему должно улететь ???
и для меня загадка зачем ты запрещаешь прерывания перед входом в trdos
и зачем разрешаешь после (trdos их сама разрешает после загрузки блока)
...........
ну а про поднятие вопросов в совершенно неподходяшей теме я уже молчу....
...........
а зачем ты разрешаешь прерывания после распаковки основного блока ?

ZX_NOVOSIB
17.05.2018, 12:04
goodboy, модеров я уже попросил отщипнуть в более подходящую тему, так что продолжим :-)

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

Как всё начиналось:

не подскажите, что делает этот 65-байтный кусок кода? Очень странный загрузчик игры, одних только бейсик-программ две штуки. Если коротко, то эти 65 байт грузятся в буфер принтера (23296), из-за чего игра не работает в 128-ом режиме. Потом грузится основной блок игры с адреса 24137 и до упора, потом идёт usr 23296, и только потом usr на запуск игры. Короче, как сделать, чтобы игра работала и в 128-ом режиме тоже? :v2_conf2:

В коде определялка, есть ли 128К или только 48К. Чтобы работало, первым делом надо включить ПЗУ бейсика 48К, а потом уже грузить код в буфер принтера

SAM style, а как включить пзу бейсика 48к?

Из бейсика принудительно включить нужное ПЗУ не получится, надо в ассемблере выполнить
ld bc,#7ffd
ld a,#10
out (c),a
После этого я решил вообще от этой 65-ти байтной процедуры отказаться, и решил буфер принтера вообще не трогать, ничего туда не грузить, и пзу 48 не включать. А зачем? Если буфер принтера мне не нужен?.. Потом всё шло хорошо до той поры, пока я не обнаружил, что хрум портит основной блок, в конце байт 70, из-за чего в игре пропадали алмазы. Я не верил своим глазам, но факт на лицо. А хруму надо 112 байт для буфера, и он у меня юзал в качестве буфера область принтера, но с адреса 23433 (в нём это по умолчанию). И никакого конфликта не возникало из-за размещения буфера там, я проверял во всех режимах - всё тип-топ, токо без алмазов ))

Потом я долго искал замену хруму, чуть не поседел, но вовремя вспомнил, что есть хруст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
17.05.2018, 12:59
конфликт в буфере принтера исчезает (хруста и 128бейсика), и 128бейсик при этом нормально работает.
а почему то решил что при разжиме картинке используется буфер принтера ???

ZX_NOVOSIB
17.05.2018, 13:10
goodboy, не при разжиме картинки, а при разжиме основного блока игры.

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

щас попробую наглядный трд собрать.

Vadim
17.05.2018, 13:40
Как так получилось, что бейсик-128 не убивается,
Я дам тебе код, который отключает бейсик 128, 100% корректно работающий всегда.

goodboy
17.05.2018, 13:43
при разжиме основного блока игры.
я уже понял.
там чаще всего прерывание (между ei и im2) не успевает проскочить,
но теоретически может.
правильней запрещать после разжима

ZX_NOVOSIB
17.05.2018, 14:54
Я дам тебе код, который отключает бейсик 128, 100% корректно работающий всегда.
Да такой код уже есть от словака, 45 байт, дело то не в этом.
В данном конкретном случае (с диззи на украинском), не слишком требовалось убивать 128 бейсик. И уж тем более ценой лишних 45 байт.

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


я уже понял.
там чаще всего прерывание (между ei и im2) не успевает проскочить,
но теоретически может.
правильней запрещать после разжима
А я вот нихрена не понял :D
У меня после разжима нет никаких команд по запрещению/разрешению прерываний. Значит надо было между разжимом и стартом игры вставить DI? (в хруме/хрусте это можно автоматом ставить, но там по умолчанию EI)

Хотел показать наглядно, но что-то пошло не так. Единственное, что наглядно видно, это то, что хрум портит блок, и алмазы исчезают.
По задумке, ещё должно было наглядно видно, что хруст, юзая буфер принтера, при запуске в 128 режиме, портит спрайт. Но сейчас почему-то не портит. Это прерывание не успевает проскочить?

У меня в полноценном загрузчике оно проскакивало, и поэтому от хруста спрайт портился? Но когда я вставил
ld bc,#7ffd
ld a,#10
out (c),a
То.... то что изменилось? Почему спрайт перестал портится?

DenisGrachev
17.05.2018, 15:37
http://speccy.info/%D0%9F%D0%BE%D1%80%D1%82_7FFD

Shiny
17.05.2018, 16:20
Ща насоветуют. если пишешь в 23388, то после HALT значение обновится.
Код сжатия хруста релоцируем вроде? запихни поудобнее, а не в буфер принтера(я для загрузки и распаковки кректр пихал на экран).

ZX_NOVOSIB
17.05.2018, 17:49
Ладно, работает да и ладно. Это если б не работало... )
Поговорим о чём-нибудь другом, например о прерываниях.


зачем ты запрещаешь прерывания перед входом в trdos
и зачем разрешаешь после (trdos их сама разрешает после загрузки блока)
Ну я просто смотрю вот например статья за авторством Wlodek Black (http://zxpress.ru/article.php?id=6380). Там DI после каждого чиха, я подумал так правильно. И в конце EI.
Или вот даже в библии вот чо сказано:

https://i.imgur.com/8WiMwcY.png

Получается EI не обязательно апосля ставить? А DI после каждого чиха? Тоже не обязательно?

Shiny
17.05.2018, 17:51
с DI работает.

покажи файлы что ли, быстрее будет исправить.

ZX_NOVOSIB
17.05.2018, 17:59
Да ничо исправлять не надо. Всё работает.
Гудбой спросил зачем я запрещаю до тр-доса и разрешаю после, я ответил на что я ориентировался. Там у Влодека в примере вообще ещё и 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

goodboy
17.05.2018, 18:27
ZX_NOVOSIB, цитируя библию ты совсем не понимаешь смысла прочитанного.
в приведённом примере сохраняется/восстанавливается режим прерываний (иногда это важно)
Wlodek запрещает прерывания перед переключением страниц.
если ты используешь точку входа 15635 для загрузки секторов то по окончанию (и во время) работы прерывания будут разрешены.

ZX_NOVOSIB
17.05.2018, 18:46
цитируя библию ты совсем не понимаешь смысла прочитанного.
Каюсь, святой отец, грешен :redface:

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

Ещё один момент. К запакованным хрустом блокам (картинка, музыка) я обращался через call и всё было окей, но када я обращался к основному тяжёлому блоку, то по call всё улетало чёрти-куда. Пришлось городить череду JP-костылей - стало всё окей. Почему так?

Gutten
18.05.2018, 09:56
Думается мне, что при обращении к тяжёлому блоку что-то происходило со стеком и терялся адрес возврата для CALL. Проанализируй этот момент.

goodboy
18.05.2018, 10:05
так и есть, данные при разжиме перекрывают стек,
а этот красавец ещё и прерывания разрешает.
а потом рассуждает о порче спрайтов

ZX_NOVOSIB
18.05.2018, 20:49
Думается мне, что при обращении к тяжёлому блоку что-то происходило со стеком и терялся адрес возврата для CALL. Проанализируй этот момент.

данные при разжиме перекрывают стек,
а этот красавец ещё и прерывания разрешает.
а потом рассуждает о порче спрайтов
В общем перед call к хруст-блоку, надо было сделать
LD SP,24137 и тада RET сработал бы?

И прерывания я не разрешал. Они сами разрешились. :p
Надо было короче их запретить? Перед call к хруст-блоку или сразу после?

Gutten
18.05.2018, 22:26
скорее всего да. Что мешает проверить самому? ;)

ZX_NOVOSIB
19.05.2018, 04:56
Проверить самому??
Хм.. А это идея.

ZX_NOVOSIB
19.05.2018, 18:39
Так лучше???


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"

Shiny
19.05.2018, 18:54
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



лишнее телодвижение. проще включить страницу 6, потом 3

goodboy
19.05.2018, 19:35
при проверке режима можно сначала включить четвертую, а потом третью.

ld a,20
......
dec a ; a=19
уже экономим байт
и вместо

ld (xxxx),a
.......
ld a,(xxxx)
сделать

ld hl,xxxx
ld (hl),a
.......
ld a,(hl)
ещё экономим байт

Gutten
19.05.2018, 22:46
а зачем 1 загонять в 29326? Что это даёт?

ZX_NOVOSIB
20.05.2018, 09:04
Что мешает проверить самому?
Проверить самому??
Хм.. А это идея.
а зачем 1 загонять в 29326? Что это даёт?
Как насчёт проверить самому? ;)
Можно же загрузить блок, распаковать его и в эмуле посмотреть что-там лежало до 1 (подскажу, там до 1 лежал 0), а потом прям во время игры по Ctrl+P (в спекуляторе так) позаносить эти значения и сразу станет ясно, зачем нужна 1 ))

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


лишнее телодвижение. проще включить страницу 6, потом 3
Это как? Это то о чём Гудбой писал или ты о чём-то другом?

Shiny
20.05.2018, 09:52
Это как? Это то о чём Гудбой писал или ты о чём-то другом?
ну так наверное:


LD A,16
LD BC,32765
OUT (C),A
LD (65532),A
LD A,19
OUT (C),A

LD A,(65532)
CP 16
JR Z,ZX48
ZX128


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

кстати, проверка на 128 некорректная, по адресу в страницах может находиться любое значение.

Gutten
20.05.2018, 14:41
Ну проверить я и сам догадался, только в той версии, что у меня есть этот кусок иначе выглядит:
LD A,(5B94)
LD (728e),A; 29326

А в 5B94 содержится не 0 или 1, а FF. Я туда загнал 1, но ничего не изменилось в игре.

ZX_NOVOSIB
20.05.2018, 15:45
Ну проверить я и сам догадался, только в той версии, что у меня есть
О какой версии речь?

А в 5B94 содержится не 0 или 1, а FF. Я туда загнал 1, но ничего не изменилось в игре.
Загонять надо именно в 728E (в любой версии, хоть в фирменной (http://zxdenied.ru/repository/func-startdown/152/)), а не в 5B94 (это вообще левый адрес мало относящийся к игре).

Gutten
20.05.2018, 16:13
В русификации от Sunsoft/DreamTeam. И не учи дедушку кашлять, я загонял куда надо именно перед стартом игры. Именно потому и спрашиваю, что разница не заметна.

ZX_NOVOSIB
20.05.2018, 16:57
В русификации от Sunsoft/DreamTeam.
Спецом щас запустил эту версию. Из спекулятора покю 1 и 0 по этому адресу - разница заметна ещё как.

Gutten
20.05.2018, 17:26
А, работает только 0 и любое другое число. я 0 не пробовал и ничего не менялось.

ZX_NOVOSIB
20.05.2018, 19:06
А, работает только 0 и любое другое число. я 0 не пробовал и ничего не менялось.
Изначально разговор шёл про ноль и про 1, а он ноль не пробовал, ну как так, ё-мое! :) Работает только 0.


я 0 не пробовал и ничего не менялось.Ну дак потому и не менялось, что не пробовал :D Вполне логично.

daniel
20.05.2018, 19:31
CP и JR Z оказались отличной заменой бейсик-нагромождениям "if peek x=y then randimze usr z"
ZX_NOVOSIB походу преодолел барьер машинного кода :). Ломани какой-нибудь релиз Billa Gilberta что ли - опыт охрененный получишь!

ZX_NOVOSIB
20.05.2018, 21:11
Ломани какой-нибудь релиз Billa Gilberta что ли - опыт охрененный получишь!
Не всё сразу :v2_dizzy_hello:

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


кстати, проверка на 128 некорректная, по адресу в страницах может находиться любое значение.
Смотря что считать корректным. Формально она не корректная, но фактически сложно представить реальную (а не выдуманную) ситуацию в которой она не сработает. Вряд ли кто-то будет что-то химичить с содержанием страниц, а потом, без рестарта компа решит поиграть в игру. Даже в детстве, када я грузил с мафона, было правило, что перед каждой попыткой загрузки делался reset. И мне кажется, что все так делали/делают.

Т.е. эта проверка - достаточная. Можно конечно сделать проверку "маниакальную", предельно корректную для всех случаев. Можно конечно сделать, для интереса. Правда тада не получится:

ld a,20
......
dec a ; a=19

Ибо придется делать примерно так:
1. В сжатом блоке хруста находим после 49151 какой-то байт, который равен нулю. Берём этот адрес на карандаш.
2. Грузим картинку и основной блок.
3. Переключаем на 19
4. Заносим по этому адресу "19"
5. Переключаем обратно на 16.
6. Смотрим что лежит по адресу.
7. Если там 19, то JZ на 48-ой сценарий.
8. Иначе (0) - по любому 128. И пофиг что там в каких страницах лежало до загрузки игры.
В 48-ом сценарии конечно придется перед стартом добавить
XOR A
LD адрес , A

Gutten
20.05.2018, 21:19
Изначально разговор шёл почему и что даёт 1, если в другой версии записывается 255.
Посмотрел фирменную версию, там понятно стало. Там нет прямой записи значений, оно косвенно идёт через тест объёма, в результате 1 записывается если в машине 128кб памяти, 0 - если 48 кб памяти. И если в 48 кб записать туда не 0, то будет висяк. Потому что в обработке прерываний проверяется значение и если оно не равно 0, то включается 3 страница памяти для воспроизведения музыки.

Вот такой ответ мог бы ты дать на вопрос "что даёт 1 в ячейке памяти", а не умничать зря.

ZX_NOVOSIB
20.05.2018, 21:30
Хотя и

ld a,20
......
dec a ; a=19

можно вставить.

Если перед загрузкой основного блока сделать 20 страницу,
загрузить в неё блок,
потом dec a,
переключить,
занести по адресу "19",
inc a,
переключить,
и смотреть что по адресу,


Потом правда в 128-ом сценарии непонятно. Ведь основной блок должен лежать в 16, а он будет лежать в 20 :v2_conf2:

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


Вот такой ответ мог бы ты дать на вопрос "что даёт 1 в ячейке памяти", а не умничать зря.
Я не умничал. Просто раз ты мне написал "проверь сам", то я тоже самое и написал тебе. И про 1 и про 0 тоже сразу же написал.


Там нет прямой записи значений, оно косвенно идёт через тест объёма
Дык у меня тоже идёт, пусть и не косвенно, а на прямую, но тоже через тест объёма ))

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

В фирменных версиях не было сражения за каждый байт, ибо интерес был коммерческий, а не спортивный. Работает - и ладно. А сейчас всё не так, сейчас надо в добавок к "рабочести" ещё и сжать и сократить всё что можно, а иначе не спортивно.

Gutten
20.05.2018, 21:32
ну и в догонку - в фирменной версии проверка как раз корректная в загрузчике:

LD HL,(C000)
PUSH HL
LD A,55
LD (C000),A
LD A,13
CALL SET_RAM_PAGE
LD A,AA
LD (C000),A
LD A,10
CALL SET_RAM_PAGE
LD A,(C000)
AND 01
LD (728E),A
POP HL
LD (C000),HL
LD A,(728E)
AND A
JP Z,5E5E; START
LD A,13
CALL SET_RAM_PAGE
LD IX,C000
LD DE,4000
CALL LOAD_BLOCK
LD A,10
CALL SET_RAM_PAGE
JP 5E5E; START

Shiny
20.05.2018, 22:12
Смотря что считать корректным. Формально она не корректная, но фактически сложно представить реальную (а не выдуманную) ситуацию в которой она не сработает.

какую невыдуманную? у анрыла есть настройки замусорить память при запуске. Лучше выкинуть из головы тот факт, что в памяти одни нули, иначе придется разбираться, почему программа не работает. а нажать reset - это детский сад.

ZX_NOVOSIB
21.05.2018, 19:46
при проверке режима можно сначала включить четвертую, а потом третью.

ld a,20
......
dec a ; a=19
уже экономим байт
и вместо

ld (xxxx),a
.......
ld a,(xxxx)
сделать

ld hl,xxxx
ld (hl),a
.......
ld a,(hl)
ещё экономим байт
Экономить по байту - не наш метод! )

К тому же, как заметил Шынни, проверка не корректная (мало ли что окажется в памяти перед запуском игры). В общем, я упростил некоторые конструкции и убил таким образом сразу двух зайцев: сэкономил 14 байт, и проверка стала корректной :biggrin: "Всё и сразу" (с)


ORG 23894

LD BC,#1605
LD HL,42000
CALL LOAD
CALL 42000
DI
LD BC,#7D05
LD HL,26000
CALL LOAD

LD A,18
CALL PAGE

LD A,(50100)
CP 84
JR Z,ZX48

ZX128 CALL PAGE

LD BC,#1105
LD HL,49152
CALL LOAD
CALL 49152

LD A,16
CALL PAGE

LD SP,24137
CALL 26000
RUN JP 24158

ZX48 LD SP,24137
CALL 26000
XOR A
LD (29326),A
JR RUN

LOAD LD DE,(23796)
CALL 15635
RET

PAGE LD BC,32765
OUT (C),A
RET

goodboy
21.05.2018, 20:42
осталось все сжатые блоки расположить с одного адреса.
и можно будет экономить

ld b,x
call load
..........
load ld c,5
ld hl,26000
.......

Shiny
21.05.2018, 20:55
ZX_NOVOSIB, я предвкушаю тот момент, когда ты обратишься в сторону написания tiny intro xD

Например, LOAD и PAGE можно объединить и сократить, если нужно.

ZX_NOVOSIB
23.05.2018, 09:01
ld b,x
Разъединение bc дало экономию в 1 байт. При условии, что у нас 3 блока. Если блока будет 2, то экономия будет отрицательной.


осталось все сжатые блоки расположить с одного адреса.
Картинку можно с основным блоком расположить с одного адреса. Но ведь третий блок (музыка) надо грузить с 49152 :confused:

goodboy
23.05.2018, 10:21
третий блок (музыка) надо грузить с 49152
ну так и разжимай его на 49152, а сжатый размещай по другому адресу.
грузи/разжимай его на страницу после загрузки картинки,
(без проверки режима)
на 48к он потом затрётся, на 128 будет на своём месте

Shiny
23.05.2018, 10:39
коль пошла речь о экономии:


LD HL,49152
CALL LOAD
CALL 49152

похожий вызов с 42000. поставь в LOAD push hl и убери CALL. -5 байт вроде

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

упс, не так


LD HL,26000
CALL LOAD1

LOAD
push hl
LOAD1

ZX_NOVOSIB
23.05.2018, 12:22
ну так и разжимай его на 49152, а сжатый размещай по другому адресу.
грузи/разжимай его на страницу после загрузки картинки,
(без проверки режима)
на 48к он потом затрётся, на 128 будет на своём месте
Я понял.
Но тут вопрос идеологический. Выходит в 48-ом режиме зря будет что-то грузиться, а это не айс. Если на это забить, то можно вообще было бы блоки склеить и за один раз всё загрузить, или по крайней мере за 2 захода всё загрузить. Но мне больше нравится когда всё по отдельности. Это если бы под код загрузчика вообще места не было, тада другое дело.

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

Шынни, про push не совсем понятно. Где push, там по идее и pop, как гласит народная мудрость. Но как это всё применить в загрузчике пока не пойму.

Shiny
23.05.2018, 13:24
Шынни, про push не совсем понятно. Где push, там по идее и pop, как гласит народная мудрость

сделаешь push hl, на стеке будет помещен адрес, RET бросит на адрес. Тот же CALL. (вызов не нужен после загрузки)

ZX_NOVOSIB
23.05.2018, 15:20
Шынни, наконец до меня дошло :v2_yahoo: Минус 5 байт.

Shiny
23.05.2018, 16:12
еще один незначительный выигрыш: при вызове LOAD ты используешь

LD BC,#xx05 - три раза

если оставить LD b,#xx а в процедуре LOAD ld c,5 , то выигрыш 1 байт

И далее:

LD SP,24137
CALL 26000
RUN JP 24158

ZX48 LD SP,24137
CALL 26000
XOR A
LD (29326),A
JR RUN
неясно, зачем заносить 0 в 29326, но 8 лишних байт итак видно.

ZX_NOVOSIB
23.05.2018, 16:31
если оставить LD b,#xx а в процедуре LOAD ld c,5 , то выигрыш 1 байт
Уже сделано, Гудбой выше предлагал.


неясно, зачем заносить 0 в 29326, но 8 лишних байт итак видно.
Ну типа так мы сообщаем игре, чтобы она не пыталась играть музыку (которая в 48-ом режиме естественно не загрузилась)

Shiny
23.05.2018, 16:43
в общем, намек дан, если горит сокращать, то думай. для 128 наверняка значение не 0 в ячейке. по идее можно как-то выкрутиться.

goodboy
23.05.2018, 17:20
в самой игре тоже есть чего сократить.
там после старта создаётся пара таблиц, проверяется наличие кемпстон джойстика,
а потом чистится буфер (в котором что-то есть),
вот это что-то можно смело занулить

ZX_NOVOSIB
23.05.2018, 19:18
Это слишком сложно ) Смысл сокращать имеет тогда, когда ты понимаешь чего и почему ты сокращаешь.

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

А есть какая-нибудь пусть и не оптимальная, но зато наглядная и простая для понимания процедура зануления произвольной области памяти?

goodboy
23.05.2018, 19:26
ld hl,xxxx
ld de,xxxx+1
ld bc,yyyy-1
ld (hl),0
ldir
........................
ld hl,xxxx
ld bc,yyyy
l ld (hl),0
inc hl
dec bc
ld a,b
or c
jr nz,l

Shiny
23.05.2018, 19:44
;8 bytes
ld h,$80 ; l не важно
xor a
zm:
ld (hl),a
inc hl
cp h
jr nz,zm

daniel
24.05.2018, 08:54
Если всё сводится к экономии места на диске (в секторах), то есть несколько способов добавочной экономии:

1) данные (например лоадер или его часть можно хранить в неиспользeемой области. Поясню. К примеру, длина кодового блока 30000 байтов, в секторах это займёт 118 секторов, по факту в последнем секторе не будут использоваться (118*256)-30000=208 байт.
2) лоадер ((или его часть) можно хранить в неиспользуемой области экранной заставки, спрятав под атрибутами - но это не всегда возможно.

это всё имеет смысл, если басик файл с кодом в REM строке занимает более 1 сектора (>256 байтов).