Subversion Repositories pentevo

Rev

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