.SPG Данный формат служит для хранения запускаемых программ на любых носителях (CD/DVD/HDD/SD). Сами файлы могут быть запущены из WDC простым нажатием на ENTER. Отличия от SPGv0.1 в основном не критичны и запускалка версии 0.2 подойдёт и к v0.1/0.0, но всё же в v0.2: блоков загрузки стало 16(!), а длина заголовка каждого блока уменьшилась до 4х байт! Другими словами, чтобы можно было загружать v0.1 и ниже, необходимо увеличивать шаг в области заголовков блоков загрузки с 4 до 8!!! Так же, если запускалке v0.2 скармливается более ранняя версия, то из +66(1) надо читать через AND 7 И самое главное. В данной версии появилась возможность работы с 256к памятью. Для выбора страниц после загрузки нужно вызывать специальную процедуру, которая загружается на указанный в SPG заголовке адрес... [не забываем ПРОВЕРЯТЬ версию формата в +44(1)!!!] в WDCv1.3final есть ограничения: 1.все блоки (кроме первого), нужно грузить в адреса #A000-#FFFF!!! [первый блок можно грузить в #9A00-#FFFF!!!] 2.используется 256к память!!! перед загрузкой SPG, запускается детектилка 256к памяти (на данный момент ищётся память пентагона, затем скорпиона(кая) и затем профи), если 256к память не найдена, то загрузка модулей с номерами страниц выше #07 будет идти в нижние 128к!!! [в зависимости от того, какой клон был найден,] [в память загужается манажер страниц (в адрес] [указанный в +68(2)), к нему надо обращаться] [при выборе страниц... ] !более подробно смотрим в описании смещения +68! 3.недопустимо задавать адреса загрузки менеджера страниц и блока переменных в диапазоне от #7000 до #99FF!!! !*это приведёт к зависанию при запуске.*! "Spectrum Prog" file format v0.2: смещ│длин. ────┼─────────────────────────────────────────────── +0│32 - резерв +32│12 - идентификатор формата ("SpectrumProg") +44│1 - версия формата(#00=0.0, #01=0.1, #02=0.2) +45│2 - CRC всего заголовка (512 байт) +47│2 - обратная CRC (старший байт впереди) │ [CRC=арифметич. сумме всех 512ти байт] │ [заголовка + 512... ] │ !если = 0, то не проверяем CRC! ────┼─[запись_в_порт X]*5───────────────────────── +49│2 - адрес порта Xi +51│1 - значение в него (если адрес <> 0!) ────┼─ параметры_запуска ─────────────────────────── +64│2 - адрес запуска программы +66│1 - номер страницы при запуске │ [в 256к - это номера от 0 до 15] │ +67│1 - флаг │ [=0 - не реагируем] │ [=1 - номер активного дисковода кидается] │ [в соотв. переменные TR-DOS перед самым ] │ [запуском ] │ +68│2 - адрес куда будет загружен манажер страниц │ [если =0, то таковой не загружается] │ сам по себе менеджер представляет простую │ процедуру, имеющую только один входной │ параметр: в регистре A указывается номер │ страницы которую надо включить (нумерация │ совпадает с той, что используется в заго- │ ловках к блокам загрузки). │ допустимый диапазон - от 0 до 15, но надо │ учитывать, что обращение к #7FFD идёт по │ маске #10!] │ !размер менеджера не более 32 байт! │ +70│3 - дата (день,месяц,год) +73│1 - версия сборки программы +74│2 - адрес вершины стека(если=0, то не меняем) │ +76│2 - адрес куда будут загруженны переменные │ [ к примеру, можно хранить переменные] │ [бэйсика и тр-дос'а, указав вдрес #5C00] │ [и длину 320 байт] +78│2 - длина блока переменных │ [если=0, то игнорируем таковые, иначе] │ [кидаем n<321 байт на адрес в +76(2).] │ !если же адрес = 0, то кидаем в #5B00! ────┼─[POKEZ] ───────────────────────────────────── +80│48 - coming soon! ^_^ ────┼─[блок_загрузки]*16────────────────────────── +128│2 - адрес загрузки │ (если <#9A00, то идёт завершение обработки │ блоков загрузки) │1 - длина блока в 2048 байтных секторах │1 - номер страницы в которую грузим блок │ [для 128к они идут от 0 до 7] │ [для 256кб от 0 до 15... ] ────┼────────────────────────────────────────────── +192│320- блок переменных программы или бэйсика ────┼────────────────────────────────────────────── +512│XXX- кодовый блок/блоки ────┴────────────────────────────────────────────── !во время запуска программы включен 1й режим! !прерываний (I=63), но они запрещены. ! P.S.первый грузимый блок должен распологаться сразу за заголовком в 512 байт, а все последующие должны распологаться сразу за предыдущим, но по адресу кратному 2м Кбайт!!! (см. PREF.txt и PREFWP.txt) длина первого грузимого блока = длине указанной в переменой + (2048-512). Другими словами, если длина первого блока меньше 1536 байт, то его длину в 2к блоках надо указывать нулевой!!! [это вызвано тем, что первые 1536 байт такового распологаются в 2х килобайтном блоке заголовка] --------------------------------------------------- Приложение ;менеджер страниц под Pentagon: MANAG0 ;I:A - num of PAGE (VALID: 0-15) ; Pentagon PUSH BC LD C,A AND %11111000:LD A,C:JR Z,K128 AND 7:OR %01000000 K128 OR 16:LD BC,#7FFD:OUT A POP BC RET ;менеджер страниц под Scorpion/KAY: MANAG1 ;Scorpion/KAY PUSH BC PUSH AF AND %11111000 LD A,16:JR NZ,$+3:XOR A LD BC,#1FFD:OUT A POP AF AND 7 OR 16:LD B,#7F:OUT A POP BC RET ;менеджер страниц под Profi: MANAG2 ;Profi PUSH BC PUSH AF AND %11111000 LD A,1:JR NZ,$+3:XOR A LD BC,#DFFD:OUT A POP AF AND 7 OR 16:LD B,#7F:OUT A POP BC RET ;менеджер страниц под ATM 4.5: MANAG3 ;ATM 4.5 PUSH BC PUSH AF AND %11111000 LD A,1:JR NZ,$+3:XOR A LD BC,#FDFD:OUT A POP AF AND 7 OR 16:LD B,#7F:OUT A POP BC RET ;менеджер страниц, если найдено только 128к: MANAGF ;128k PUSH BC AND 7 OR 16 BC,#7FFD:OUT A POP BC RET --------------------------------------------------- Budder/23.12.2006-13.10.2009