Свободное место: 007600-008000 (2560) 01761E-018000 (2530) 04fc20-050000 (992) 057480-058000 (2944) 05a0c0-05b300 (4672) 0f3420-0f4000 (3040) 5744C $50000 - там поинтер на главные поинтеры текста $5744C - там поинтеры на главные блоки текста Указания к скрипту Особых ограничений на длину строки нет, т.к. длина символов не фиксированная. Ширина символа определяется по крайней правой его точке. +1 разделительный столбец между символами. Ширина одной строки = 200 пикселей. В среднем на строке помещается 25 символов по 7 пикселей (+1), но может поместиться и все 100. Управляющие и прочие символы: <44> - точка на среднем уровне высоты (не используется) <4B> - конец фразы <4D> - перенос строки (не пишется) - исправлено <4E> - ? (управляющий символ) <4F> - ? (управляющий символ) <50> - число (уровень, урон, бонус атаки и т.д.) <51> - персонаж <52> - направление (Север, Юг, Запад, Восток) <53> - герой <54> - враг <55> - предмет <56> - заклинание <58> - управляющий символ Управляющие символы <4B>, <4E>, <4F>, <58> НЕ удалять и НЕ перемещать. Остальные можно перемещать при необходимости (например, имя врага стояло ДО какой-то фразы, а можно поставить ПОСЛЕ неё). Символы на персонажа, врага и т.д. просто вставляют имя персонажа, врага и т.д. без всяких изменений и дополнений (например, пробелов слева или справа от имени). В шаблонных фразах типа <51> attacks!<4B> могут использоваться разные падежи (в английском-то один падеж). Поэтому, если использовать другой падеж (например, винительный), надо "придумать" новый управляющий символ (любой, больше $60) и вписать его, например, <62> - предмет в винительном падеже. Тогда фраза <51> uses the (кто-то использует такой-то предмет) <55>!<4B> будет переведена так: <51> использует <62>!<4B> (предмет в винительном падеже) Соответственно, для остальных падежей и для остальных типов символов (на врагов, персонажей) или для множественного числа (врагов, т.к. в некоторых фразах есть коолективные действия врагов) будут другие символы. Будут составлены таблицы в разных падежах и мн. числе, к которым и будет идти обращение при соответствующих символах. Возможно использование английского текста. В шрифт поместятся оба алфавита. Шрифты: основной (текст и надписи на спрайтах) начинается с адреса F10CC все символы 14 пикселей в выосту, ширина - любая до 16, следующий символ выводится сразу после самой правой точки предыдущей, причём, в надписях две нижние строки предыдущего символа оказываются над последующим. На каждый символ отводится $1C байт. Декодирование: MOVE.B (A0)+,D0 ; записываем байт текста 1B70C LEA $06DC(PC),A1 ; A1=1BDEA 1B710 MOVE.W $00(A1,D0),D0 По адресу 1BDEA идёт таблица соответствия символов шрифта (или управления) байтам текста. Надо: 01B70C: 4EF9XXXXXXXX4E71 (JMP, NOP) XXXXXX: 43F9YYYYYYYY303100004EF90001B70C (LEA, MOVE.W, JMP) $1BED0 move.w #$0011,D0 - ширина символа по умолчанию, затем идут сдвиги вправо, и ширина уменьшается до тех пор, пока не будет найдена самая правая точка Другой шрифт: 00CBA8 JSR ($0009C00C) - загрузка 1-х 8 кб видео с шрифтом и "EXP" в городе 00CBA8:6004 09C554 BSR $02 - загрузка 1-х 8 кб видео с шрифтом и "EXP" в начале Слова в меню начинаются с адреса 145609 слова EXP в видео (адрес "карты"): C094, C095 - два тайла 1) E190 2) E350 3) E510 23910:94 Враги начинаются с адреса $6FF1, поинтер 000348 Первые слова предметов начинаются с адреса $69E4, поинтер 000340 Вторые слова предметов начинаются с адреса $6DDB, поинтер 000344 Слова в городе начинаются с адреса $7527, поинтер 00034C Имена начинаются с адреса $755B (1-е имя пустое), поинтер 000350 Магии начинаются с адреса $74B2, поинтер 00033C Менюшные слова (HP, REMOVE, ARMOR и т.д.): 238C9 - 23D3C, формат необычный. Названия предметов состоят из двух частей. Каждая часть не больше 9 символов. Если в конце первой части нет разделительного пробела, а вторая часть есть (т.е. непустая), при выводе названия предмета в окошке меню после первой части приписывается "-". Пример: слово SHORT SWORD (см. файл Shorts1.bmp) 1-я часть SHORT_ ("_" - пробел) 2-я часть SWORD первая часть с пробелом, поэтому слово выводится в окошке меню как обычно (см. файл Bronzek.bmp) слово BROADSWORD (см. файл Broads1.bmp) 1-я часть BROAD 2-я часть SWORD первая часть без пробела, а вторая часть непустая (слово SWORD), поэтому приписывается "-" после 1-й части (см. файл Broads.bmp) Поэтому надо учитывать пробелы в концах первых частей. По адресу 1A9BE идёт проверка с номером предмета, и по ней пишется или не пишется тире после первой части. 4 17 1B 3D 49 46 Направления движения по адресу $CAA3 Код разжатия старикашки, облаков и земли: 9C716 Шрифт - 58000, 5801C - 58818 - 2044 байта -> 6384 Старикашка - C00A0, D8684 - D981C - 4504 байт -> 6304 Облака - C00C4, D981C - D9E68 - 1612 байт -> 3872 Пол - C00CC, D9E68 - DA69A - 2098 байт -> 3680 Основной текст: Процедура разжатия текста $18018 (обычно JSR), далее прыжок на $1B5AC, d0.w содержит номер фразы. 1B5C8: BSR $1B694 - извлечение адреса фразы по номеру 1B69E: move.l $50000,a0 - главный поинтер на поинтеры блоков 1B5D8: BSR $1B52A - инициализация начального символа [$4B] 1B6F6: BSR $1B53A - распаковка очередного символа 1B552: lea $1aec0(pc),a1 - таблица поинтеров на деревья 1B55A: lea $1af7a(pc),a1 - базовый адрес деревьев, указывает на кодовую часть первого дерева, левее - символьная часть 1B598: move.b - распакованный символ $FF3222 (reg a3) - номер текущего бита считанного байта сжатого текста, $FF3224 (2+a3)- текущее значение сдвинутого байта 1B5A2: move.b d0,$00B5(a3) - символ $FF3A58 - адрес считываемого байта сжатого текста 1B700: Если d0.b не равен символу конца, то он увеличивается в два раза и смотрим следующую таблицу: 1B70C: LEA $1BDEA(PC),A1 - таблица соответствий символам их действий (вывод тайла или управляющий символ) 1B77E: CPMI.W $8000,D0 - проверка, является ли символ управляющим 1BEA4: вывод символа 1BEB6: move.l $e4004,a1 - базовый адрес основного шрифта 1BED0: move.w #$0011,d0 - максимальная ширина символа 1BEEC: MOVE.W #$0008,D0 - ширина пробела $FF301A - текущий столбец вывода символов 1BEF6: cmp.w #$C4 - максимальная ширина строки в пикселях $FF3A50 - адрес слова, которое будет подставлено вместо управляющего символа В VBL: 1B636: cmpi.w #$0024,d1 - сравнение d1 с диапазоном символов, при появлении которых выдаётся звук. Если d1>24, звука нет. Направления (румбы): Просмотр карты: $C9FE CA04 - CA34 - код проверки, мы НАД землёй или ПОД ней и вывод сообщения $FF000F - номер румба, 0-3 (север, восток, юг, запад) $FF0010 - координаты на восток $FF0011 - координаты на юг CA6C: move.b - вывод румба CA74: move.w - сохранение длины-1 вставляемого слова (румба) по адресу $FF3066 $CAC0 - длины румбов $CAA3 - румбы, на каждый по 8 байт, разделены байтами 00 Разжатие второго шрифта: 2 обращения: CBA8: JSR $9C00C - в городе 9C554: bsr $02 - перед старикашкой 9C558: move.l $58000,a0 - поинтер на запакованный шрифт 9c55e: move.w #0,a1 - начальный адрес куска в VRAM 9c562: move.w #$1000,d0 - DMA length Затем прыжок на одну из стандартных процедур распаковки 0FCC. $FFAE84 - начало распакованной графики, конец определяется самой data и не зависит от DAM length 27E84: конец распаковки 0DC8: начало пересылки по DMA (должно быть D1.w = 0002) 0E58: конец пересылки по DMA 0E82: выход Второй шрифт имеет размер #$1900, но пересылается #$2000. Основное оконное меню (ENTER, ITEM, STATUS, SPELL, USE, EQUIP, DROP, GIVE) основано на спрайтах. 1D5F6: move.l $58014,a0 1d5fc: lea $0f680,a1 1d602: move.w #$0360,d0 1d606: jsr $284 1AB08: карта надписи EQUIPPED отдельными командами $2374E - поинтеры на менюшные/оконные карты тайлов. 1A306: обращение к этим поинтерам. Номера карт: 0 - шаблон окошка наверху экрана со статусом перса 1 - окно с отображением золота 2 - экипировка 3 - характеристики перса 4 - WHOSE STATUS 5 - WHOSE SPELL 6 - рисунок ENTER 7 - рисунок ITEM 8 - рисунок STATUS 9 - рисунок SPELL A - B - C - D - E - левое окно при экпировке F - то же? 10 11 12 13 - SEARCH 14 - ITEM 15 - STATUS 16 - SPELL 17 - USE 18 - EQUIP 19 - DROP 1A - GIVE 1B, 1C - OTHERS 1D, 1E - EQUIP WHO? 1F - 22 - EQUIP WHICH? 23 - 29 - 4 надетых предмета 2A - WPN FACTOR и AMR FACTOR 2B - UNARM 2C - REMOVE 1 2D - REMOVE 2 2E - REMOVE 3 2F - CAN'T REMOVE CURSED ITEM 30 - .... IS CURSED! 31 - 32 - 33 - предметы выбранного перса 34 - выбранный предмет или заклинание (?) 35, 36 - ATTACK 37 - ITEM 38 - RUN 39 - SPELL 3A - ATTACK 3B - ITEM 3C - DEFEND 3D - SPELL 3E - 3F - 40 - BUY 41 - SELL 42 - EXIT 43 - DEALS 44 - BUY 45 - SELL 46 - EXIT 47 - CRAFT 48, 49 - REPAIR 4A, 4B - ORDER 4C - маленькое окошко с именем перса и жизнями 4D - = 33 4E - ARMOR 4F - SHIELD 50 - WEAPON 51 - HELM 52 - 56 - окно с отображением золота 57 - 5D - ? $1aec0 - $1b52a - деревья с поинтерами, надо стереть Поинтеры поместим на $1aec0, деревья - на $17800, поинтеры к тексту - $5000c, текст на $5003c. Надо заменить указатели на поинтеры для деревьев и на деревья. Заменить указатель $50000. $50004, $50008 не используются, но лучше поменять. Разжатие 2-го шрифта - $9C558 В скрипте последний символ - 5A, но в роме есть таблица и для 5C. Новые символы: 5D - куча врагов, 5E - предмет в винительном падеже. [$61] исправлено на 5D. Имена героев по адресу $2DC6.