Делайте программы системно-совместимыми! (Руководство)

Subliminal Extacy #04

Делайте свои программы системно-совместимыми!

(tdm^k3l/h-prg)

Спустя несколько лет непрерывной игры, просмотра демок, изучения Бейсика, первого сексуального опыта и покупки PC пришло время сказать: «Я хочу, чтобы мои программы были дружелюбны к системе».

Вы же знаете, как это бывает... В понедельник вам в голову приходит потрясающая идея, как сделать волшебный эффект на Z80. Во вторник появляется ещё одна великолепная мысль. В среду — третья (чувак, да ты гений! :-) ), и вот демо уже родилось. Вы потратили кучу времени, и на нормальный финальный загрузчик сил уже не осталось. Или у вас всего один ZX Spectrum (в таком случае вы ненормальный, потому что у любого фаната 8-, 16- и 32-битных компьютеров :) есть как минимум штук десять компов!), и протестировать работу было попросту не на чем. Так что эта статья — для тебя, дорогой кодер.

Может быть, вы это знаете... может, чувствуете... может, догадываетесь... э-э-э, ХОРОШ СМЕЯТЬСЯ — это вам не Genetic Error от K3L! Ладно, как вы знаете, по всему миру существует огромное количество клонов ZX Spectrum, но реальных «стандартов» не так уж много. Я не стану расписывать тонкости точных таймингов для мультиколорных эффектов и тому подобного — в таких случаях действительно критически важно определять конкретный тип машины. В этой статье я хочу рассказать, как сделать так, чтобы ваше демо или взломанная игра без проблем работали на всех стандартных компьютерах линейки Sinclair ZX Spectrum.

Всё просто, если ваша продукция пишется под ZX Spectrum 48KB (кстати, знаете этот «стишок»? [впервые появился в Zabhmo 128]: «Fuck is easy, fuck is funny, many people fuck for money. If you think that fuck is honye, fuck yourself and save your money!»). Да, я мерзавец, сам знаю... <учтите, я всё-таки участник Hooy-Program :-) >. А теперь пора сказать правду (которая не «где-то там», а внутри вашего Спекки).

Проблемы с памятью:
  • Контроллер ZX Interface I + микродрайвы ZX Microdrive создают свои собственные системные переменные, поэтому загружать программы командой LOAD "" по адресам ниже 24500 — это реальная головная боль!

  • Некоторые другие ранние дисковые интерфейсы точно так же расширяют оригинальные системные переменные Sinclair, как и ZX Interface I.

  • Модели ZX Spectrum +2A(B) / +3 используют последнюю (23-ю) страницу (примерно верхние 4 КБ этой страницы) под дисковую систему, а 17-я страница задействуется в первую очередь, если включён электронный диск (RAM Disk).

Отсюда вывод:
  • Ваша программа должна загружаться с адреса 25000 и выше. ПОСЛЕ загрузки никаких других ограничений для классических 128K-машин уже нет (черный Sinclair ZXS и серый Amstrad 128K).

  • Если вы хотите, чтобы программа корректно работала на машинах с системой +3 (вроде ZXS +2A(B)/+3), вам придётся соблюдать несколько правил:

  • Никогда не используйте команды OUT 32765,XX прямо из Бейсика. Как вы знаете, в 128 Basic с этим вечные проблемы. Система умнее вас, и предполагается, что вы ВООБЩЕ не должны знать о переключении страниц ОЗУ. Вам просто даётся больше памяти под бейсик-программу и команда PLAY (см. оригинальное руководство по 128K от Sinclair Research).

  • Используйте упаковщики вроде TomPack или любые другие на ваш вкус (например, Trasher от Zilog), чтобы уменьшить размер файлов. Тогда вы сможете объединить несколько 16-килобайтных банков в один общий файл, а после его загрузки легко распаковать и раскидать данные процедурой ldir по нужным адресам. И что важнее всего — это быстро. Например, можно объединить короткую основную программу для базовой страницы (16) со страницами 19 и 20 в одном файле. Тогда код будет выглядеть примерно так:

        org 25000
        ent $

;распаковка 19-й страницы
        ld a,19
        call bank
        ld hl,end+14000
        ld bc,10000
        call ldir

;распаковка 20-й страницы
        ld a,20
        call bank
        ld hl,end+14000+10000
        ld bc,11000
        call LDIR

;перемещение основной программы на рабочее место,
;распаковка и запуск
        ld a,16
        ld hl,end+14000+10000
        ld de,end
        ld bc,12000
        ldir

;старт программы
        jp end

LDIR    ld de,49152
        ldir
        call 49152
        ret

BANK    ld bc,32765
        out (32765),bc
        ret

END     nop

Надеюсь, в этом теоретическом наброске нет ошибок. Но его задача — лишь показать общий принцип! А теперь самое главное для машин серии +3: страницы 17 и 23 обязательно нужно загружать и распаковывать В САМУЮ ПОСЛЕДНЮЮ ОЧЕРЕДЬ И ВМЕСТЕ!!!!! Страницу 17 можно не беречь, если отключить RAM-диск системными вызовами +3 (см. справочник по +3 DOS).

В большинстве случаев, особенно если вы пишете собственный софт :-), соблюдать эти ограничения совсем не трудно.

Поделитесь вашим мнением о статье