TSconf: Utils
Средства разработчика TSconf
В результате компиляции в папке _spg будет сформирован файл lirus_main.bin, который позже пойдёт в сборщик.
В своих предыдущих статьях я постоянно использовал названия портов вместо их номеров. Увы, чаще всего именно названия несут больше смысловой нагрузки, чем просто числа :)
Для использования названий портов и значимых бит системы стоит их добавить в свой исходник оператором include «tsconfig.asm»
Содержимое tsconfig.asm выглядит так:
Применение названий портов и бит значительно улучшает чтение исходника.
Я использую фотошоп, в котором провожу все операции по подготовке графики — изменение размеров, обтравка и т.д.
На последнем этапе производится конверсия в индексированные цвета. Для тайлов/спрайтов нужно не забывать, что один из цветов у нас будет использован как цвет прозрачности.
На последнем этапе всё выгружается в формате tga (256 цветов, 8 бит) — даже если используется 16 или меньше цветов.
Для установки нужного цвета как первого (0-ой, прозрачность) в палитре можно использовать очень приятный и полезный для наших целей редактор Usenti. Большим его достоинством являются средства для работы с палитрой — сортировка, обмен ячеек и прочее. И рисовать ним удобно, попробуйте.
Полученный tga отправляем в чудный конвертер, с помощью которого будут приготовлены отдельные файлы пиксельных данных изображения и его палитры.
Сам конвертер tga2ts.exe лежит здесь, для его работы нужно оба файла — как tga2ts.exe, так и levels.map.
Пример использования:
на выходе получим такой набор файлов:
*.pal — палитра, 512 байт (256 * 2 байта на цвет). При использовании 16-ти цветных изображений я ручками удаляю нули, оставляя только 32 байта палитры.
*.pix — изображение в формате 256 цветов — байт на точку (байт на цвет)
*.pix4 — изображение в формате 16 цветов — байт на две точки
Все данные изображения идут линейным образом.
Итак, конвертированные изображения получены. Учитывая возможно большой размер — эти файлы необходимо разместить в памяти для использования. Естественно, мы можем сохранить файлы на дискету, написать загрузчик, и грузить файл по старинке, как обычно. Но как быть, если нужно сразу загрузить в память больше 600 кб? например, мегабайта так джва?
Для этого есть смысл использовать сборщик SPG.
*.spg позволяет запускать WildCommander
Сборщик можно найти здесь, данные о размещении файлов в памяти описываются в spgbld.ini.
Информация в spgbld.ini о расположении в памяти задаётся следующим образом:
Особенностью сборщика является то, что:
После выполнения
Параметр -с 0 указывает, что компрессия при сборке не нужна. Если установить этот флаг в 1, то при сборке будет вызван замечательный компрессор mhmt.exe от нашего милого друга lvd , который проведёт тест на самое лучшее сжатие и лучший по размеру блок попадёт в сборку.
Естественно, это занимает время — как при сборке, так и при запуске на реальном железе, учтите момент ожидания декомпрессии при старте файла на PentEVO.
Вопросы:
? Не могу скачать файлы
! Обращайся
Литература: Дока по Спг билдеру
- ASM includes
- Конверсия графики, графический редактор
- SPG builder
ASM includesВесь код я обычно пишу в sublime text + z80 highlight by psb, для стандартного sjasmplus. Для экспорта бинарника используем сохранение бинаря:
device zxspectrum128
org #8000
start
; ...
; ...
end
include "tsconfig.asm"
savebin "_spg/lirus_main.bin",start,end-start
В результате компиляции в папке _spg будет сформирован файл lirus_main.bin, который позже пойдёт в сборщик.
В своих предыдущих статьях я постоянно использовал названия портов вместо их номеров. Увы, чаще всего именно названия несут больше смысловой нагрузки, чем просто числа :)
Для использования названий портов и значимых бит системы стоит их добавить в свой исходник оператором include «tsconfig.asm»
Содержимое tsconfig.asm выглядит так:
; ------- definitions
; -- TS-config port regs
VCONFIG equ $00AF
STATUS equ $00AF
VPAGE equ $01AF
GXOFFSL equ $02AF
GXOFFSH equ $03AF
GYOFFSL equ $04AF
GYOFFSH equ $05AF
TSCONFIG equ $06AF
PALSEL equ $07AF
BORDER equ $0FAF
PAGE0 equ $10AF
PAGE1 equ $11AF
PAGE2 equ $12AF
PAGE3 equ $13AF
FMADDR equ $15AF
TMPAGE equ $16AF
T0GPAGE equ $17AF
T1GPAGE equ $18AF
SGPAGE equ $19AF
DMASADDRL equ $1AAF
DMASADDRH equ $1BAF
DMASADDRX equ $1CAF
DMADADDRL equ $1DAF
DMADADDRH equ $1EAF
DMADADDRX equ $1FAF
SYSCONFIG equ $20AF
MEMCONFIG equ $21AF
HSINT equ $22AF
VSINTL equ $23AF
VSINTH equ $24AF
DMALEN equ $26AF
DMACTR equ $27AF
DMASTATUS equ $27AF
DMANUM equ $28AF
FDDVIRT equ $29AF
INTMASK equ $2AAF
T0XOFFSL equ $40AF
T0XOFFSH equ $41AF
T0YOFFSL equ $42AF
T0YOFFSH equ $43AF
T1XOFFSL equ $44AF
T1XOFFSH equ $45AF
T1YOFFSL equ $46AF
T1YOFFSH equ $47AF
; TS parameters
FM_EN equ $10
; VIDEO
VID_256X192 equ $00
VID_320X200 equ $40
VID_320X240 equ $80
VID_360X288 equ $C0
VID_RASTER_BS equ 6
VID_ZX equ $00
VID_16C equ $01
VID_256C equ $02
VID_TEXT equ $03
VID_NOGFX equ $20
VID_MODE_BS equ 0
; PALSEL
PAL_GPAL_MASK equ $0F
PAL_GPAL_BS equ 0
PAL_T0PAL_MASK equ $30
PAL_T0PAL_BS equ 4
PAL_T1PAL_MASK equ $C0
PAL_T1PAL_BS equ 6
; TSU
TSU_T0ZEN equ $04
TSU_T1ZEN equ $08
TSU_T0EN equ $20
TSU_T1EN equ $40
TSU_SEN equ $80
; SYSTEM
SYS_ZCLK3_5 equ $00
SYS_ZCLK7 equ $01
SYS_ZCLK14 equ $02
SYS_ZCLK_BS equ 0
SYS_CACHEEN equ $04
; MEMORY
MEM_ROM128 equ $01
MEM_W0WE equ $02
MEM_W0MAP_N equ $04
MEM_W0RAM equ $08
MEM_LCK512 equ $00
MEM_LCK128 equ $40
MEM_LCKAUTO equ $80
MEM_LCK1024 equ $C0
MEM_LCK_BS equ 6
; INT
INT_VEC_FRAME equ $FF
INT_VEC_LINE equ $FD
INT_VEC_DMA equ $FB
INT_MSK_FRAME equ $01
INT_MSK_LINE equ $02
INT_MSK_DMA equ $04
; DMA
DMA_WNR equ $80
DMA_SALGN equ $20
DMA_DALGN equ $10
DMA_ASZ equ $08
DMA_RAM equ $01
DMA_BLT equ $81
DMA_FILL equ $04
DMA_SPI_RAM equ $02
DMA_RAM_SPI equ $82
DMA_IDE_RAM equ $03
DMA_RAM_IDE equ $83
DMA_RAM_CRAM equ $84
DMA_RAM_SFILE equ $85
; SPRITES
SP_XF equ $80
SP_YF equ $80
SP_LEAP equ $40
SP_ACT equ $20
SP_SIZE8 equ $00
SP_SIZE16 equ $02
SP_SIZE24 equ $04
SP_SIZE32 equ $06
SP_SIZE40 equ $08
SP_SIZE48 equ $0A
SP_SIZE56 equ $0C
SP_SIZE64 equ $0E
SP_SIZE_BS equ 1
SP_PAL_MASK equ $F0
SP_XF_W equ $8000
SP_YF_W equ $8000
SP_LEAP_W equ $4000
SP_ACT_W equ $2000
SP_SIZE8_W equ $0000
SP_SIZE16_W equ $0200
SP_SIZE24_W equ $0400
SP_SIZE32_W equ $0600
SP_SIZE40_W equ $0800
SP_SIZE48_W equ $0A00
SP_SIZE56_W equ $0C00
SP_SIZE64_W equ $0E00
SP_SIZE_BS_W equ 9
SP_X_MASK_W equ $01FF
SP_Y_MASK_W equ $01FF
SP_TNUM_MASK_W equ $0FFF
SP_PAL_MASK_W equ $F000
; TILES
TL_XF equ $40
TL_YF equ $80
TL_PAL_MASK equ $30
TL_PAL_BS equ 4
TL_XF_W equ $4000
TL_YF_W equ $8000
TL_TNUM_MASK_W equ $0FFF
TL_PAL_MASK_W equ $3000
TL_PAL_BS_W equ 12
Применение названий портов и бит значительно улучшает чтение исходника.
Конверсия графики, графический редакторДля использования графики в демо необходимо её нарисовать / приготовить в графическом редакторе.
Я использую фотошоп, в котором провожу все операции по подготовке графики — изменение размеров, обтравка и т.д.
На последнем этапе производится конверсия в индексированные цвета. Для тайлов/спрайтов нужно не забывать, что один из цветов у нас будет использован как цвет прозрачности.
На последнем этапе всё выгружается в формате tga (256 цветов, 8 бит) — даже если используется 16 или меньше цветов.
Для установки нужного цвета как первого (0-ой, прозрачность) в палитре можно использовать очень приятный и полезный для наших целей редактор Usenti. Большим его достоинством являются средства для работы с палитрой — сортировка, обмен ячеек и прочее. И рисовать ним удобно, попробуйте.
Полученный tga отправляем в чудный конвертер, с помощью которого будут приготовлены отдельные файлы пиксельных данных изображения и его палитры.
Сам конвертер tga2ts.exe лежит здесь, для его работы нужно оба файла — как tga2ts.exe, так и levels.map.
Пример использования:
tga2ts.exe back9.tga
на выходе получим такой набор файлов:
back9.tga.pal
back9.tga.pix
back9.tga.pix4
*.pal — палитра, 512 байт (256 * 2 байта на цвет). При использовании 16-ти цветных изображений я ручками удаляю нули, оставляя только 32 байта палитры.
*.pix — изображение в формате 256 цветов — байт на точку (байт на цвет)
*.pix4 — изображение в формате 16 цветов — байт на две точки
Все данные изображения идут линейным образом.
Итак, конвертированные изображения получены. Учитывая возможно большой размер — эти файлы необходимо разместить в памяти для использования. Естественно, мы можем сохранить файлы на дискету, написать загрузчик, и грузить файл по старинке, как обычно. Но как быть, если нужно сразу загрузить в память больше 600 кб? например, мегабайта так джва?
Для этого есть смысл использовать сборщик SPG.
Сборщик SPGДанная программа предназначена для формирования файлов *.spg. Этот формат представляет собой умный снапшот используемых в программе страниц памяти pentevo, и при загрузке размещает в нужных пагах блоки данных, после чего происходит запуск по адресу, указанному в заголовке spg.
*.spg позволяет запускать WildCommander
Сборщик можно найти здесь, данные о размещении файлов в памяти описываются в spgbld.ini.
Информация в spgbld.ini о расположении в памяти задаётся следующим образом:
Desc = lirus ; название, без кавычек
Start = #8000 ; адрес старта
Stack = #5fff ; начальное расположение стека
Resident = #5B00 ; расположение резидента для запуска спгешечки
Page3 = 0 ; начальная страница
Clock = 2 ; скорость процессора. 0 - 3,5МГц / 1 - 7МГц /2 - 14МГц / 3 - 14МГц оверклокед
INT = 0 ; прерывания выключены
Pager = 0 ; Адрес менеджера страниц, 0 - без менеджера
;Block = #e000, 5,violent.bin ; указываем адрес расположения в памяти, страницу, файл. В данном случае файл violent.bin будет размещён по адресу #6000, 5я страница
Block = #c000, 2,lirus_main.bin ; этот файл будет размещён по адресу #8000
Block = #c000, 0,lirus_p0.bin ; а этот - в паге 0, адрес #c000
Block = #c000, #10,player49152.bin
Block = #c800, #10,nq-first_warning-8.pt3
Block = #e000, #10,outro.pt3
Block = #c000, #11,tiles2.tga.pix4
Block = #d000, #12,geebeeyay-8x8.tga.pix4
Особенностью сборщика является то, что:
- Адрес размещения должен быть кратен 512 (#200)
Адрес указывается как позиция в странице памяти, начиная с адреса #c000.
Т.е. адрес #6000 — это страница 5, адрес #e000 (offset #2000); #b000 — это страница 2, адрес #f000 (offset #3000)
Уточнение — всё лежит у нас в пагах, которые могут быть подключены в разные окна (0-3).
Соответственно указанный адрес будет всегда приведён в вид #0000-#3e00, а старшие два бита адреса будут ОТБРОШЕНЫ как ненужные.
Соответственно, если мы хотим загрузить блок в 5ю страницу с адреса #6000 — мы указываем:
Block = #2000, 5, файл.bin; этот файл будет размещён по адресу #2000 включенного окна.
если мы включим эту пагу в окно 1 — это 6000, если в окно 2 — то адрес — а000, если в окно 3 — е000
- Размер блока данных может превышать стандартный размер страницы (16кб), при этом данные будут занимать последующие страницы памяти
После выполнения
spgbld.exe -b spgbld.ini TEST.spg -c 0
происходит сборка и создание файла TEST.spg, который можно открыть как на PentEVO из WC, так и в эмуляторе.Параметр -с 0 указывает, что компрессия при сборке не нужна. Если установить этот флаг в 1, то при сборке будет вызван замечательный компрессор mhmt.exe от нашего милого друга lvd , который проведёт тест на самое лучшее сжатие и лучший по размеру блок попадёт в сборку.
Естественно, это занимает время — как при сборке, так и при запуске на реальном железе, учтите момент ожидания декомпрессии при старте файла на PentEVO.
Вопросы:
? Не могу скачать файлы
! Обращайся
Литература: Дока по Спг билдеру
10 комментариев
Ужасм не orthodox way совсем. Хочу все на реале)
WC v0.31 (23.07.2012-24.08.2012): обновлен плагин: TRD Mounter (обновлен Nemo-IDE драйвер)
А сейчас на дворе версия 0.85 с поддержкой длинных имён, юникода и т.д. и т.п.