1 Отредактировано Sertik (03-03-2025 23:22)

Тема: RELDRIVE - драйвер перемещаемых файлов

Тут Вольдемар создал тему про Linker. Тема интересная, но Linker как таковой мне был в свое время не нужен, так как собирать файл из нескольких мне было не нужно, проще написать свой исходник. Но описания его работы я в своё время разбирал и формат перемещаемых файлов оттуда выкопал, а потом из описаний типа Benef Apple DOS.

R-файлы в Агат-9 умели нормально генерировать (к счастью) Ассемблер ИКП и ассемблер Сергея Громова, с которым я и работал больше, так как это было намного удобнее. В Ассмеблере ИКП была ошибка при генерации перемещения псевдокоманды DDB ! (у Громова эта ошибка была исправлена).

А вот программку "настройки" перемещаемых файлов я делал - "Программа настройки перемещаемых файлов". Это был кусочек кода, который должен был быть меньше 255 байт, написан так, чтобы не содержал в себе адресов абсолютных переходов (т.е. сам был был абсолютно перемещаем без всяких "настроек") ну и использовал бы только ячейки нулевой страницы для хранения временой информации с которой работает.
Этот кусок "Программа Настройки ..." помещалась перед сгенерированным в ассмеблере R-файлом. R-файл содержал в себе рабочий код программы и таблицу перемещения - адреса меток нуждающихся в "перемещении". При запуске такого файла с любого физического адреса, управление сначала попадало на "Настройщик", который определял абсолютный собственный адрес загрузки, зная свою длину, вычислял адрес начала программы пользователя (для её последующего запуска) и адрес начала таблицы перемещения. Затем пересчитывал все метки по таблице и запускал программу.
Такой R-файл мог работать в любом месте оперативной памяти.
Позже, я реализовал "Настройщик" сначала как драйвер (назывался RELDRIVE.BIN) , встраиваемый в ДОС 3.3 Бейсика Агат-9, а затем поместил поддержку перемещаемых файлов непосредственно "внутрь" Basic Master`95. R-файл мог загружаться командой BLOAD Name, Addr и загружаться и запускаться командой BRUN Name, Addr. Пересчет меток делался сразу для обеих команд.

Для истории АГАТа - основной код програмки простой и короткий, был написан мной (тогда 17 летним мальчишкой) без ПК на каникулах (на бумажке). Когда я приехал домой и набрал его он не работал ... Найти ошибку мне помог мой друг и соратник по программированию на Агате, полноправный член "фирмы" Friend`s software, Владимир Лузганов. Если бы не он возможно я был вообще бросил эту затею и никакой поддержки перемещаемых файлов у Агат-9 не было бы.

Драйвер RELDRIVE.BIN был описан в статье для газеты "Первое сентября" (оригинал статьи от 1994 г. можно скачать тут
http://www.agatcomp.ru/agat/Paper/Newspaper/1sent.shtml Эта статья кажется так и не вышла в той газете ... (Первое сентября и перемещаемые файлы это как земля и Космос).

Насколько я знаю, такой "поддержки перемещаемых файлов" в ДОС 3.3 Агат-7 никогда не было, а у APPLE, кажется было только в PRODOS (точно не знаю). Может знает кто ?

Попозже размещу код "Настройщика" тут.

2 Отредактировано Sertik (04-03-2025 12:08)

Re: RELDRIVE - драйвер перемещаемых файлов

Это сам "Настройщик", которым я горжусь до сих пор.

*======================================*
*    НАСТРОЙЩИК ПЕРЕМЕЩАЕМЫХ ФАЙЛОВ    *
*    by Serkov S.V.   version 17.07.95    *
*======================================*

; перемещает 3 и 2 байтовые команды, а также псевдокоманды
; DFB и DW. Перемещает также псевдокоманду DDB в отличие
; от версии 15.08.94. Для нее зарезервирован атрибут метки
; $21 (Ассемблер Громова)
       
; ячеики ZERO PAGE   рабочие ячейки "настройщика"

RADR     EQU $06
NAS       EQU $08
SERO     EQU $2A
ADR       EQU $4E
HRAN     EQU $01
LIR        EQU $C9
KOM      EQU $15

RELCALC  LDA ADR           установить начало таблицы
                CLC               перемещения
                ADC NAS
                STA ADR
                LDA ADR+1
                ADC NAS+1
                STA ADR+1
                LDA #4
                CLC
                ADC ADR
                STA ADR
                LDA #0
                TAY
                ADC ADR+1
                STA ADR+1
         
CSICL      LDA (ADR),Y     Y=0
               BNE RETURN
         
START     RTS

RETURN   INY             Y=1
               LDA (ADR),Y
               CLC
               ADC NAS
               STA HRAN
               INY             Y=2
               LDA (ADR),Y
               ADC NAS+1
               STA HRAN+1
         
               LDY#0
               LDA (HRAN),Y
               TAX
               LDA (ADR),Y     Y=0
               PHA
               BMI CS1         3 BYTES  ML/ST
               ASL A
               BMI CS2         2 BYTES
               ASL A
               BMI CS8         3 BYTES  ST/ML
               PLA
               TXA
               SEC
               SBC LIR
               CLC
               ADC NAS
CS7         STA (HRAN),Y

CS6         LDA#4
               CLC
               ADC ADR
               STA ADR
               LDA#0
               TAY             Y=0
               ADC ADR+1
               STA ADR+1
               TYA             A=0
               BEQ CSICL       (JMP)
         
CS8        INY
              BNE CS9         (JMP)

CS1        INY             Y=1
              LDA (HRAN),Y
              TAX
              DEY             Y=0
CS9        LDA (HRAN),Y
              SEC
              BCS CS4         (JMP)

CS2      LDY#3
            LDA (ADR),Y     2 BYTES LOW
            SEC
CS4      SBC LIR
            STA KOM
            TXA
            SBC LIR+1
            STA KOM+1
         
            LDA NAS
            CLC
            ADC KOM
            TAX             X=LOW
            LDA NAS+1
            ADC KOM+1
            TAY             Y=HIGH
            PLA
            BMI CS5         3 BYTES ML/ST
            ASL A
            ASL A
            BMI CS10        3 BYTES ST/ML
            TYA
            LDY#0
            BEQ CS7         (JMP)
         
CS10     TXA               
             PHA           Y  ->
             TYA             <-  X
             TAX                 
             PLA
             TAY
         
CS5      TYA
            LDY#1
            STA (HRAN),Y
            TXA
            DEY             Y=0
            BEQ CS7         (JMP)
         

         DS DRIVLOC+$100-*


А в файле полный код моего драйвера перемещаемых файлов с вставкой патчей в ДОС 3.3

Post's attachments

Attachment icon RELDRIVE.ASM.txt 9.82 kb, 3 downloads since 2025-03-03 

3 Отредактировано Sertik (04-03-2025 09:56)

Re: RELDRIVE - драйвер перемещаемых файлов

Намного позже (фактически вчера !) т.е. через 30 лет ! я узнал, что Стив Возняк в своём Integer Basic в его ROM версии размещал созданную им программу "6502 Relocator" позволяющую перемещать части объектного кода с пересчётом абсолютных адресов переходов. Она была написана в 1978 г. А Боб Сандер Сандерлоф (Apple Computer Line) в 1981 году переписал её так, чтобы она могла работать в любом месте физической памяти и удобно вызывалась по нажатию Ctrl-Y (вектор $3F8). Её исходный код можно видеть тут https://www.txbobsc.com/aal/1982/aal8201.html#a3

Эти подпрограммы не могли настраивать перемещаемые файлы, так как они работали не с таблицами меток перемещаемых файлов, а вычисляли новые адреса только для команд абсолютных переходов соответственно их истинному и новому положению (пересчитывали с переносом кода и без). Соответственно они не пересчитывали скажем таблицы, содержащие адреса меток, т.е. не годились для перемещаемых файлов, созданных макроассемблерами.

Кто умеет считать такты - интересно у кого программы работали быстрее у меня или у Сандерлофа ? Реально это было вообще не заметно (перемещаемая программа запускалась с любого адреса "мгновенно")

4 Отредактировано Voldemar0 (04-03-2025 14:22)

Re: RELDRIVE - драйвер перемещаемых файлов

> у кого программы работали быстрее у меня или у Сандерлофа ?

Твоя должна быть сильно быстрее. Я исхожу не из тактов, а из описания: если ты идёшь по таблице, которая ссылается на несколько команд с абсолютными адресами и правиш только их, то код Сандерлофа должен был просмотреть _каждую_ команду на предмет совпадения с JMP, JSR и чем-то ещё и исправить её. Действий получается сильно больше.