TSconf: Utils

Средства разработчика TSconf

  • 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 комментариев

avatar
Заставьте уже автора вилдкомандера запилить поддержку трд и сцл.

Ужасм не orthodox way совсем. Хочу все на реале)
avatar
organism, trd & scl в wc идут искаропки
avatar
добавлю, для слоупоков :)

WC v0.31 (23.07.2012-24.08.2012): обновлен плагин: TRD Mounter (обновлен Nemo-IDE драйвер)
А сейчас на дворе версия 0.85 с поддержкой длинных имён, юникода и т.д. и т.п.
avatar
дык речь идет о монтере или вьювере? (самому интересно :)
avatar
стоит организма спросить, о чём он вообще
avatar
хочу как в sn. копировать из\в\на трд\сцл.
avatar
… и он с ними ничего делать не может )
avatar
А что за резидент для запуска spg?
avatar
Адрес, где хранится резидент для запуска (чото 32 байта или около того)
avatar
.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.