Просмотр полной версии : Картинки в 128кб
Не имею опыта в программировании.
Подкиньте, пожалуйста, прожку, одна часть которой бы считывала содержимое заданной экранной области (например что-либо в верхнем левом углу определённых размеров) , и сейвила в сис. память подобно LDIR'у.
А вторая часть уже выплёскивала бы это содержимое в любую позицию экрана (сойдёт и познакоместное позиционирование) с учётом цветовых атрибутов.
Подобную считывалку делал на бейсике когда-то через PEEK/POKE, а выплёскивал потом подпрограммой на машинных кодах. Но там был монохром, да и многое забыл уже. Тем более как работать со 128кб, это для меня тёмный лес. Ведь у poke peek адресное пространство только до 65535.
Заранее спасибо!
null_device
22.10.2018, 18:43
Не очень понятно, что и куда вы собираетесь "выплескивать"?
Если, что, страницу второго экрана 128 Кб машины можно "впечатать" в верхнюю область памяти.
Хочу поочерёдно загруженное через Screen$ скопировать в ОЗУ, да так, чтоб впритык заполнило 128кб. При этом размеры картинок не 256*192, а разные. Допустим, 96*64, 88*56 и т.д.
Затем эти самые картинки в любой момент отобразить на экране в любой области X Y (с познакоместным позиционирование 32 значений по X, 24 значений по Y)
Bedazzle
22.10.2018, 22:35
Хочу поочерёдно загруженное через Screen$ скопировать в ОЗУ, да так, чтоб впритык заполнило 128кб. При этом размеры картинок не 256*192, а разные.
Спрайты. :)
Нет такого понятия, как 128кб одним куском. Это набор блоков памяти по 16кб, причём некоторые использовать не получится - например, экранную область, или пзу.
Кроме этого, "поочерёдно загруженное" - если с разных экранов нужны разные куски, потребуется уже какая-то обвязка для выбора нужного кусочка и сохранения в память, да ещё и хранить размеры сохранёнок где-то.
Чтоб не возиться с программированием - ZX paintbrush в помощь. Загружаешь туда экран, вырезаешь нужный кусок, и сохраняешь как последовательность байт.
Потом все эти куски клеишь в большие блоки по 16кб или около того. Тут главное не забыть про размеры спрайтов и не перепутать порядок, эта информация потребуется для последующей отрисовки.
Это набор блоков памяти по 16кб
Мне непонятно, как эти самые страницы адресуются.
Ведь что в бейсике, что в ассемблере с адресами работают сдвоенные регистры 16 бит, а это 65536 байт.
- - - Добавлено - - -
Загружаешь туда экран, вырезаешь нужный кусок, и сохраняешь как последовательность байт.
Но это всего лишь инфа изображений ? А как же подпрограмма отрисовки ?
- - - Добавлено - - -
Подпрограмма вывода изображений не генерится.
Ну и опять же, как эти данные запихнуть в адреса выше 64кб, не представляю даже.
https://pp.userapi.com/c850036/v850036368/a3b2f/SEgQImTea8w.jpg
https://pp.userapi.com/c850036/v850036368/a3b39/r-Ty-l2HQ8g.jpg
- - - Добавлено - - -
и почему-то оно перегнало всю экранную область, а не выделенную. Хотя нажимал save selection
Black Cat / Era CG
23.10.2018, 09:04
Ну и опять же, как эти данные запихнуть в адреса выше 64кб, не представляю даже.
А там и нет выше. Просто странички памяти втыкаются вместо других те же 64к. Они через порт переключаются, как (грубо) сменные картриджи. Почитай вот тут (https://zxpress.ru/book.php?id=116), там должно быть. Только лучше скачай и читай. Вот нужное место (http://zxpress.ru/book_articles.php?id=1842).
Мне непонятно, как эти самые страницы адресуются.
Ведь что в бейсике, что в ассемблере с адресами работают сдвоенные регистры 16 бит, а это 65536 байт.
часть памяти (четвертинка) просто подменяется другой
как эти данные запихнуть в адреса выше 64кб, не представляю даже.
в 128ом бейсике есть рамдиск.
save! / load ! / cat ! только размер сохранённых файлов надо держать в голове/на листе
cat! показывает только имена
а программы для вырезания спрайтов в окне конечно есть.
(только я названий не помню).
вспоминаю что была аж от THD (экран для удобства временно заливался шахматкой)
ну и алексрайдер делал подобное (вроде его aer просил), прога должна быть тут на форуме
Нет такого понятия, как 128кб одним куском. Это набор блоков памяти по 16кб, причём некоторые использовать не получится - например, экранную область, или пзу.
Однако 128Кб - это всё ОЗУ, и среди этого ОЗУ нет ПЗУ. ПЗУ - отдельно. :)
Держи дружище :)
Когда содержимое считывается, то координаты X,Y должны быть в пределах экрана, а длина и высота не выходить за границы экрана. Также длина и высота не должны быть нулевыми. Каждый вызов подпрограммы считывания запоминает новый спрайт и даёт ему номер. Подпрограмма последовательно заполняет всю 128-ую память на страницах 1,3,4,6. Можно запомнить до 256 спрайтов, если памяти хватит. Обработки ошибок почти нет, так что внимательнее с цифрами.
Выплёскивание возможно с любыми X,Y, даже отрицательными. Границы экрана отсекаются. Для выплёскивания задаёшь X,Y и номер спрайта.
Пример работы на бейсике во вложении.
SoftLight
23.10.2018, 12:41
Он пишет 'Не имею опыта в программировании' ты бы хоть с исходниками выложил так то все здорово работает да.
во, нашёл http://zx-pk.ru/threads/17811-sprite-graber-proba-pera.html
"SpriteGraber предназначен для создания наборов спрайтов из экранных файлов ZX-Spectrum. Программа позволяет загрузить стандартный экранный файл (6912 байт), вырезать из него один или нескольких спрайтов и сохранить файлы в двух различных форматах: блок графических данных набора спрайтов и модуль, содержащий процедуру вывода спрайтов вместе с образами спрайтов."
Для подготовки спрайтов можно использовать программу SpriteLand v1.27 by Flying / Digital Reality'99 (https://vtrd.in/system/SPRL1_27.zip)
Если на уровне алгоритма, то можно написать функцию, работающую из бейсика (книга ""Элементарная графика" - Инфорком'92).
Что-то типа DEF FN s(spriteNumber, x, y) = USR адресФункции (ниже #c000)
В памяти хранить данные о спрайтах: банк памяти (1 байт), адрес в банке (2 байта), ширина (1 байт), высота (1 байт), наличие цветовых атрибутов (1 байт).
null_device
23.10.2018, 17:11
Мне непонятно, как эти самые страницы адресуются.
Ведь что в бейсике, что в ассемблере с адресами работают сдвоенные регистры 16 бит, а это 65536 байт.
А вот тут, начинается самое увлекательное: эквилибристика с впечатыванием в адресное пространство нужной страницы (верхние 16К, т.к. туда можно впечатать любую страницу), копирование нужного спрайта или серии спрайтов в "буфер" (область, ниже верхних 16К), работа с полученными данными (т.к. сразу печатать их на экран слишком "по-нубски", хотя, можно использовать "второй" экран рисуя сразу в "теневой").
Более подробно устройство памяти описано в книжке "... для пользователей и программистов".
Bedazzle
23.10.2018, 23:33
Он пишет 'Не имею опыта в программировании' ты бы хоть с исходниками выложил так то все здорово работает да.
Полюбасу без азов программирования фиг что сделаешь.
Готового-то ничего нет :)
То есть из бейсика можно щёлкать верхними 16-ти килобайтными страницами командой OUT (хмм... а какой адрес порта?), (...и значения) ?
То есть из бейсика можно щёлкать верхними
можно, только зачем. я же тебе рассказал про РамДиск,
сохраняя на него не надо париться что и где точно лежит.
сохраняешь откуда надо, а потом грузишь куда надо.
можно
Вроде бы напрямую щёлкать портом бейсик не даст (каждое прерывание что-ли правит потр страниц #7ffd). Через POKE куда-то в район буфера принтера вроде щёлкают...
Рам-диск это хорошо, но и сам пусть попереключает - разберётся хоть как устроена расширенная память...
пусть попереключает - разберётся хоть как устроена расширенная память...
сомневаюсь, у него почти все подобные начинания быстро глохнут
сомневаюсь, у него почти все подобные начинания быстро глохнут
:v2_dizzy_tired2: да, я криворукий.
- - - Добавлено - - -
Мне просто приснилось, как я замутил крутую демку на спек.
На миг показалось, что сон вещий... эххххххххххх......
- - - Добавлено - - -
можно попробовать упихнуть её и в 48кб.
Но хотелось бы заюзать потенциал 128 кб.
можно попробовать упихнуть её и в 48кб.
Но хотелось бы заюзать потенциал 128 кб.
На 128 потенциал совсем дохлый.
Всего что там есть хорошего - это два экрана.
А доп.память так погано реализована что кроме как рам-диск её толком и не заюзать.
Вот если бы можно было впечатывать ЛЮБУЮ из страниц в ЛЮБУЮ из четырёх областей - то тогда было-бы рили круто (вроде это сделано в spectrum 3+ или 2+)
В общем пиши всё будто под 48, только второй экран тебе в помощь будет, а всё остальное - LOAD! (ну рам-диск, типа с диска грузишь)
вот в комплекте с ZX Like Пасцал от Эндрю есть годная утилита, преобразующая в BMP-шки в спрайты... Но там монохром.
Хмм... как бы поступить... BMP2SCR хорош, но он фулл-скриновый.
- - - Добавлено - - -
во, нашёл http://zx-pk.ru/threads/17811-sprite-graber-proba-pera.html
"SpriteGraber предназначен для создания наборов спрайтов из экранных файлов ZX-Spectrum.
В Спрайт грабёр пока не особо вник.
- - - Добавлено - - -
Там надо сперва Screen поместить на дисковый образ. Хммм.
Привык работать только с ТАПками из Bmp2SCR, Paintbrush
- - - Добавлено - - -
Через Пэинтбраш было бы весьма удобно гонять.
Только как сохранить массив асм-данных именно выделенного ректангла? И как сгенерить подпрограмму вывода этих самых данных из памяти на экран ?
- - - Добавлено - - -
BMP2SCR почти то, что надо. Там и компрессия упакованных данных, и Bounds можно задать.
Но есть одна неприятная вещь - то, что за границами выводимого изображения, он закрашивает белым.
Dart Alver
25.10.2018, 20:13
По поводу вырезки спрайтов из экрана, можно пользовать плагин spriter из BGE. Он может и в цвете и без и с разными размерами.
Если нужно блоком, то сохранять CODE, если ассемблерными DBшками - то компиляция.
По поводу выгрузки файла спрайтов - неплохой вариант эмулятор Xpeccy от SAM style. При вызове основного меню эмулятора 'Options' во вкладках Storage/Disk доступен весь каталог диска, выбрать файл и сохранить как row
По поводу загрузки экрана. В последней версии BGE (3.11) есть фича - когда при нажатии файра в любом месте экрана убираются иконки и стрелка, можно загрузить средствами эмулятора новый экран прямо в память. К сожалению отдельной опции (как в fuse) у xpeccy нет , поэтому несколько извратно: ESC (вызов дебаггера) , Ctrl+O (загрузить блок памяти), выбрать файл, установить Start #4000 , Length #1b00 (остальное само приложится), Ok, ESC (закрыли дебаггер), и файр в BGE. Экран загружен.
- - - Добавлено - - -
На 128 потенциал совсем дохлый.
Всего что там есть хорошего - это два экрана.
А доп.память так погано реализована что кроме как рам-диск её толком и не заюзать.
Ну как бы погано она не была реализована, тем не менее она есть и это уже потенциал, хотя бы и как рам-диск. А так да, одно окно это ни о чём, а два уже не стандартный клон )))
Через Пэинтбраш было бы весьма удобно гонять.
Отлично сохраняет ZX-Paintbrush выделенный прямоугольник в любом формате. Выделять нужно познакоместно, иконка с 8
https://i.imgur.com/9t958fS.png
А сохранять через
https://i.imgur.com/RADiVNW.png
Затем задается нужный формат (нас интересует asm) и следование байт, выбор не такой конечно как в 7up но можно и с ним жить.
В чем проблема непонятно.
Жги, давно не было нормального угара, ты и AER подзабросили, остальные шлак какой то клепают.
https://zxaaa.net/screen9/harsh2.png https://zxaaa.net/screen9/satan2.png
Вот так и я делаю.
Выделяю с шагом знакоместа
https://pp.userapi.com/c848732/v848732604/a7c45/EoLsBZ5UUws.jpg
Затем:
https://pp.userapi.com/c848732/v848732604/a7c4c/TUywBLE9XeY.jpg
https://pp.userapi.com/c848732/v848732604/a7c54/lv-1VkJ-IqU.jpg
https://pp.userapi.com/c847221/v847221604/1180e7/3YQC4wQqV1I.jpg
Но в результате получаю массив данных ВСЕЙ экранной области 256*192 + атрибуты.
https://pp.userapi.com/c849036/v849036801/a4c89/CwIxlFxTQ3I.jpg
И на каком этапе я туплю?
- - - Добавлено - - -
Ааааа... Понееел.
Оказывается это разные кнопки. Я думал, что они дублируются.
https://pp.userapi.com/c850428/v850428166/2fa5b/3125hRbf2wM.jpg
- - - Добавлено - - -
Но вопрос по программе для вывода этого массива данных на экранную область по-прежнему в силе.
Но вопрос по программе для вывода этого массива данных на экранную область по-прежнему в силе.
А в чем проблема? Вывод линейной или познакоместной области на экран задача несложная. Если неохота возится я думаю многие из местных начинающих кодеров помогут, да и народ поопытнее тоже разомнется с удовольствием, подобные штуки делать легко и быстро.
Жги, давно не было нормального угара
Хочется чего-то масштабного. Но на бейсике особо не размахнуться. А в асме я нубец тот ещё. Знаю, конечно, азы. Но так вот виртуозно, как демосценеры налегке чудят, мне до такого никогда не добраться.
Но и не хочется так как раньше я клепал, под 48к и бибер. После того, как мне проапгрейдили кампутир, я презираю такой формат. Теперь адепт секты 128+AY
Начал уже мутить арт для задуманного. Именно в таком виде оно мне приснилось.
https://pp.userapi.com/c834304/v834304063/156226/A3wGncCsaIE.jpg
Но так вот виртуозно, как демосценеры налегке чудят
Демо это совсем другое. И приёмы другие, и хранение данных и цели и вообще всё
Если ты на бейсике шлёпал - то вполне можешь начать клепать на асме с тем-же качеством например, но скорость будет выше просто (при этом не будет ограничений бейсика даже компилированного).
Неплохо для начала...
Вон книжка как такое делать - Как написать игру на ассемблере для ZX Spectrum (http://zxpress.ru/book.php?id=2)
В запланированной деме мне скорость не критична. Просто васик каждой своей командой сжирает много памяти, что сокращает место для контента.
А, пардон, я не так понял, думал гама планируется... (ящер меня с толку сбил)
Хотя если на бейсике демы делал, то в принципе асм прикручивать (хотя-бы вызовами подпрограмм через randomize usr) - хуже не будет...
А, пардон, я не так понял, думал гама планируется... (ящер меня с толку сбил)
Хотя если на бейсике демы делал, то в принципе асм прикручивать (хотя-бы вызовами подпрограмм через randomize usr) - хуже не будет...
Чему ты молодняк учишь?
Чему ты молодняк учишь?
Да я и сам знаю, что такой подход хромой на все десять лап. Но только так я и осилю.
Хотел анимированный комикс под музыку сделать, а там нужн таймер, отладку которого проще выполнять через бейсик, нежели париться с инкрементом/декрементом регистров ассемблера, с последующими call, jp nz и тд..
Чему ты молодняк учишь?
Да пусть хоть так шевелятся, чем вообще никак :)
Сделал двухэкранный комикс из DrWho, валялся табличный фейдер, удобный случай применить.
Ты там рисуй что надо ктонить сделает тебе комикс :)
Нот бэд.
Но у меня своя мысля по поводу появляющихся фреймов.
Нужна лишь подпрограмма вывода картинок из asm-файлов пэинтбраша, которой можно было бы передавать X,Y в качестве аргументов позиционирования на экране (32*24).
Нужна лишь подпрограмма вывода картинок
Так барс же предложил хороший вариант, чем не устраивает?
Так барс же предложил хороший вариант, чем не устраивает?
Тама у меня крашила прога, всё потому, что я по привычке грузил TRDos через Basic 48k (хотя машына была выбрана 128k) - usr 15616.
А тут оказывается Basic 128k надо было.
Непривычный редактор в нём меня всегда шугал.
- - - Updated - - -
https://pp.userapi.com/c847124/v847124178/117125/0MG-AJQ5Too.jpg
Попробую разобраться.:v2_dizzy_vodka4:
Так-то всё понятно для нуба, но реально ли через интерфейс 48k бейсика такое проделать? Иль там недоступны будут эти самые 16кб окны ?
набери в 128ом бейсике usr0, после сброса у тебя будет 48ой редактор, но доступ к страницам останется.
ZX_NOVOSIB
27.10.2018, 12:36
там нужн таймер, отладку которого проще выполнять через бейсик, нежели париться с инкрементом/декрементом регистров ассемблера, с последующими call, jp nz и тд..
инкремент/декремент регистров не нужен же. Есть же адреса 23672/ 73/ 74
Это системный счетчик, можно просто его мониторить через LD / CP и всё.
Или вообще юзать напрямую из асма бейсиковскую паузу:
LD BC, число
CALL 7997
набери в 128ом бейсике usr0, после сброса у тебя будет 48ой редактор, но доступ к страницам останется.
вообще-то нужно набрать spectrum для перехода в 48ой редактор, с сохранением содержимого бейсика.
ZX_NOVOSIB
27.10.2018, 18:17
с сохранением содержимого бейсика.
Мож ему без сохранения надо. Мож ему токенами удобнее набивать. ;)
С рамдиском есть подвох: если на него много записать, то сохранения будут портиться. Что-то в духе "каталог рамдиска повстречается с содержимым рамдиска и начнут затирать друг друга". Он вроде растёт навстречу типа стека.
Не помню где читал про это, может в описании ошибок пзу128.
Ну экран 6912 байт. 10-12 экранов влезет в рам диск
Andrew771
06.11.2018, 17:29
Подкиньте, пожалуйста, прожку, одна часть которой бы считывала содержимое заданной экранной области (например что-либо в верхнем левом углу определённых размеров) , и сейвила в сис. память подобно LDIR'у.
А вторая часть уже выплёскивала бы это содержимое в любую позицию экрана (сойдёт и познакоместное позиционирование) с учётом цветовых атрибутов.
В ZX Like Pascal для этого имеются встроенные операторы WindowGet, WindowPut и WindowSet.
Но если надо на ассемблере, то вот они:
; ===== _window_get_put =====
; сохранение окна в памяти
; вход: нет
; выход: нет
getimage ld de,addr_virt_screen
ld hl,col_window
ldi
ldi
ldi
ldi
ld hl,(col_window) ; l=col_window, h=row_window
ld a,(height_window)
ld b,a
getimage_01 push bc
push hl
LD A,H ; расчет адреса первого байта знакоместа в HL
RRCA
RRCA
RRCA
AND A,224
ADD A,L
LD L,A
LD A,H
AND 24
OR 64
LD H,A
dup 8
push hl
ld bc,(width_window)
ld b,0
ldir
pop hl
inc h
edup
pop hl
inc h
pop bc
djnz getimage_01
; +++++ _flag_attr_window +++++
ld hl,(col_window) ; l=col_window, h=row_window
ld a,(height_window)
ld b,a
getimage_02 push bc
push hl
LD A,H ; расчет адреса атрибутов знакоместа в BC
RRCA
RRCA
RRCA
LD C,A
AND 31
OR 88
LD B,A
LD A,C
AND 252
OR L
LD C,A
ld h,b
ld l,c
ld bc,(width_window)
ld b,0
ldir
pop hl
inc h
pop bc
djnz getimage_02
; ----- _flag_attr_window -----
ret
; вывод окна из памяти
; вход: нет
; выход: нет
putimage ld hl,addr_virt_screen+2
ld de,col_window+2
ldi
ldi
ld de,(col_window) ; e=col_window, d=row_window
ld a,(height_window)
ld b,a
putimage_01 push bc
push de
LD A,D ; расчет адреса первого байта знакоместа в DE
RRCA
RRCA
RRCA
AND A,224
ADD A,E
LD E,A
LD A,D
AND 24
OR 64
LD D,A
dup 8
push de
ld bc,(width_window)
ld b,0
ldir
pop de
inc d
edup
pop de
inc d
pop bc
djnz putimage_01
; +++++ _flag_attr_window +++++
ld de,(col_window) ; e=col_window, d=row_window
ld a,(height_window)
ld b,a
putimage_02 push bc
push de
LD A,D ; расчет адреса атрибутов знакоместа в BC
RRCA
RRCA
RRCA
LD C,A
AND 31
OR 88
LD B,A
LD A,C
AND 252
OR E
LD C,A
ld d,b
ld e,c
ld bc,(width_window)
ld b,0
ldir
pop de
inc d
pop bc
djnz putimage_02
; ----- _flag_attr_window -----
ret
addr_virt_screen equ 57344 ; адрес вирт.экрана
col_window defb 0 ; столбец окна
row_window defb 0 ; строка окна
width_window defb 0 ; ширина окна
height_window defb 0 ; высота окна
Пока что до кода не добрался. Пилю арты и музло. Где-то половина работы проделана в этом направлении.
А вот что касается кода... Ну вроде бы Барсовы процедурки устраивают, правда на деле ещё не гонял.
Но помимо этого мне бы процедурку заполнения экрана заданными тайлами 8*8 (например дизеринг, или диагональные полосочки), но не просто заполнение, а OR.
Понели как хочу? Типа шоб предыдущие слайды были на месте, но они как бы покрывались дизерингом, а поверх накладывался следующий слайд, как диалоги диззи.
Надо бы ещё окантовку какую-то. Типа Bright 0 падающую тень. Или, фиг знает, синий пэйпер. Шото такое. Как в дос-окнах.
Во, такое реализовать хочется в виде комикса.
https://youtu.be/NpNTAf1gAho?t=14
В смысле сам принцип отображения слайдов
- - - Updated - - -
музон уже готов. Осталось арты дорисовать... ну и запихнуть в прогу как-то.
Andrew771
11.11.2018, 20:06
Делай спрайтами тогда, а не экранами.
Всё ещё рисую арты. И всё меньше верую в то, что оно уместится в память, если не использовать хотя бы RLE-компрессию.
Bedazzle
27.12.2018, 11:14
И всё меньше верую в то, что оно уместится в память, если не использовать хотя бы RLE-компрессию.
А что мешает использовать?
А что мешает использовать?
Я конкретный нуб в ZX-прогинге. Бейсик - максимум что осилю на этой платформе.
Bedazzle
27.12.2018, 14:33
Я конкретный нуб в ZX-прогинге. Бейсик - максимум что осилю на этой платформе.
Ну, к примеру, берёшь zx7. Компрессор - это пц утилитка, на выходе получаешь файлик.
Дальше на спеке бейсиком:
- грузишь пожатый файл,
- грузишь распаковщик (на выбор один из трёх, в зависимости от того, что тебе требуется - максимальная скорость, или минимальный размер),
- заполняешь несколько покесов (адрес местоположения пожатых данных, адрес места назначения)
- запускаешь распаковку rand usr-ом,
- используешь блок полученных данных по своему усмотрению
P.S.
распаковщик один на много мелких кусочков пожатых данных, нужно только перед каждым запуском нужные значения подставлять. А можно вообще из васика передавать значение в машкод без покесов через def fn.
Powered by vBulletin® Version 4.2.5 Copyright © 2026 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot