Rev 507 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed | ?url?
.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