Линк-постпроцессор для ассемблера БК-0010(.01)
1
1
02
   Д.Ю. Усенков, г. Москва
   Линк-постпроцессор для ассемблера БК-0010(.01)
   Одним  из   основных  преимуществ  ассемблер-трансляторов
МИКРО11 и  М18 является  возможность  "сборки"  программ  из
"стандартных" модулей,  реализующих  те  или  иные  функции.
Таких модулей  можно накопить  на магнитной  ленте или диске
целую библиотеку  и при  необходимости просто подстыковывать
их к  создаваемой программе  вместо того,  чтобы вводить  их
заново  с   клавиатуры.  Только   вот  незадача:  так  можно
пристыковывать только  объектные модули,  созданные в том же
ассемблер-трансляторе. Если же нужно присоединить какие-либо
готовые подпрограммы  в кодах (например мелодию из КЛАВЕСИНа
вместе с  блоком  исполнения)  или  созданный  в  каком-либо
графическом  редакторе  спрайт,  то  приходится  делать  это
старым  "дедовским"   способом  -   вручную  в  каком-нибудь
отладчике. Более  того, при написании ассемблерного листинга
в системе МИКРО или М18 пользователю неизвестна заранее даже
длина будущей  программы (до  тех пор,  пока  она  не  будет
оттранслирована в  машинные коды).  В  отладчике  приходится
разыскивать в  созданной ранее  основной  программе  команды
обращения к  "независимым" подпрограммам и подставлять в них
действительные адреса  обращения, а это довольно-таки нудная
работенка.
   Помочь  программисту  в  данном  случае  может  программа
SCREW_LINK,      позволяющая      практически      полностью
автоматизировать  процесс  подстыковки  внешних  независимых
модулей к созданной в ассемблер-системе программе.
   Программа  SCREW_LINK   (далее  будем   называть  ее  для
краткости  просто   LINK)  предназначена   для   подстыковки
автономных модулей  - подпрограмм к программе, создаваемой в
ассемблер-системах МИКРО  или М-18.  (Программу, создаваемую
пользователем в  указанных  системах  на  ассемблере,  будем
называть ГЛАВНЫМ ФАЙЛОМ. Автономные модули назовем БЛОКАМИ).
   В главном  модуле в  любом месте  программы (там, где это
позволяет синтаксис  ассемблера) нужно  расположить  таблицу
вида:
      #####   ;текстовый заголовок (признак) линк-таблицы
      #....   ;восьмеричное число - длина таблицы
А1:   #....   ;ячейки, зарезервированные под адреса
А2:   #....   ;обращения главного файла к автономным
      . . .   ;блокам
А3:   #....
Длина  линк-таблицы  соответствует  количеству  подключаемых
блоков (равна количеству ячеек, зарезервированных под адреса
обращений).
   При написании  главной программы  адреса обращения  к тем
или иным  автономным подпрограммам  (заметим: эти адреса нам
еще не  известны)  считаем  содержащимися  в  ячейках  линк-
таблицы по  порядку возрастания номеров блоков. (Позднее эти
номера блоков  нам  понадобятся  при  подстыковке  блоков  в
процессе линковки.)
   Пример программы,  содержащей  линк-таблицу,  приведен  в
приложении.
   ПРОЦЕСС РАБОТЫ С ПРОГРАММОЙ SCREW_LINK
   После загрузки  программы SCREW_LINK  в монитор БК-0010 и
запуска ее с начального адреса командой "S" БК переводится в
режим расширенной  памяти и выводит на экран заставку. После
нажатия любой  клавиши происходит  выход в главное меню (его
признаком является  приглашение "=>").  Текущий режим работы
программы  индицируется  в  служебной  строке.  Пользователю
доступны следующие команды:
   LM -  загрузка с магнитофона главного файла по указанному
адресу.  Сразу   же  производится   поиск   линк-таблицы   в
загруженном файле.  Если она  не найдена, выдается сообщение
об ошибке,  иначе выводится начальный адрес и длина главного
файла, а  также (для  контроля) заданная  при его создании в
ассемблер-системе длина  линк-таблицы,  а  следовательно,  и
максимальное количество  автономных  блоков,  которые  можно
подключить к данной программе.
   LB  -   режим  ввода  и  подключения  автономных  блоков.
Запрашивается  номер  очередного  блока  (тот  самый  номер,
который мы  для него  предусмотрели в линк-таблице!) и после
его ввода  (производится  контроль  значения  номера  блока,
чтобы он  не превышал  длину  таблицы)  запрашивается  адрес
загрузки  блока   в  ОЗУ.   Блок  загружается   по  имени  с
магнитофона и подключается к главному файлу, а его начальный
адрес (он  же -  адрес вызова  на  исполнение)  заносится  в
соответствующую ячейку  линк-таблицы, таким  образом главный
файл получает  доступ к  этому адресу  и к  этому блоку. Для
контроля перед  запросом каждого очередного номера выводится
адрес начала  свободной зоны  (адрес первой свободной ячейки
памяти) и  ее длина.  Блоки нужно  загружать один  за другим
начиная с  младших адресов свободной зоны, так как при вводе
очередного  блока  начало  свободной  области  автоматически
переносится на  первую свободную  ячейку  ПОСЛЕ  только  что
загруженного блока.  При необходимости  можно задавать адрес
загрузки  блока   меньшим,  чем   указанный  (например,  для
переподключения ошибочно  загруженного блока). Автоматически
производится   контроль    адресов   загрузки   блоков   для
предохранения  главного  файла  от  затирания.  Блоки  можно
вводить и не в порядке возрастания номеров. Нужно лишь чтобы
номер блока  соответствовал номеру ячейки линк-таблицы (т.е.
чтобы главный  файл обращался  в нужный  момент именно к той
подпрограмме, к  которой это  предусмотрено  программистом.)
Для выхода  в главное  меню после загрузки всех блоков нужно
ввести ноль вместо номера блока.
   SP - сохранение скомпонованного файла на магнитной ленте.
Запрашивается  имя,   которое  будет   присвоено   созданной
программе. Адрес  начала полученной  программы равен  адресу
начала  главного  файла,  а  ее  длина  соответствует  длине
фрагмента ОЗУ  до конца последнего введенного блока (с самым
большим стартовым  адресом).  Полученная  готовая  программа
будет содержать  и "пустые" участки, если блоки подгружались
не вплотную.
   RE  -   перезапуск  программы   LINK  при   необходимости
компоновки следующей программы.
   Следует отметить,  что программа  LINK лишь заносит адрес
начала загружаемого  блока  в  линк-таблицу,  так  что  этим
блоком, по  желанию  пользователя,  может  быть  исполняемая
подпрограмма,   список   данных   (например   закодированный
спрайт), область,  зарезервированная под  передачу данных  в
подпрограмму и т.п.
   ПРИМЕР (ПРОГРАММА В ФОРМАТЕ АССЕМБЛЕРА М-18):
     ; выдача звукового сигнала по нажатию клавиши
     ;
   START:  EMT 14        ; начало главного файла
            ....
           MOV KLAV,R1   ; в R1 передается адрес вызова
           JSR R7,@R1    ; вызов подпрограммы опроса клавиатуры
           MOV SOUND,R1
           JSR R7,@R1    ; вызов подпрограммы выдачи звука
            ....
      ; оглавление линк-таблицы (пробел
      ; перед строкой ##### обязателен)
           .A: #####
           .#2           ; длина линк-таблицы равна 2
   KLAV:   .#0           ; две ячейки, зарезервированные под
   SOUND:  .#0           ; адреса вызова подпрограмм
;
;   LINK POSTPROCESSOR                 Уceнкoв Д.Ю.   1992
;
; Пoдcтыкoвкa иcпoлняeмыx aвтoнoмныx пoдпpoгpaмм в кoдax к
;     пpoгpaммaм, пoлyчeнным c пoмoщью cиcтeм MИKPO
;
START:  MOV #14,R0
        EMT 16
        CLR VERIF
        MOV #KOM1,R1
        MOV DLKOM1,R2
  ; вывoд тeкcтa в кoм.cтpoкy
        JSR R7,KOMM
        TSTB @#40
        BNE BBBBBB
        MOV #233,R0
        EMT 16
BBBBBB: TSTB @#56
  ; гacить кypcop
        BNE A1
        MOV #232,R0
        EMT 16
A1:     MOV #125252,@#212
        MOV #ZAST1,R1
        CLR R2
        EMT 20
        MOV #233,R0
        EMT 16
        EMT 16
        MOV #ZAST2,R1
        CLR R2
        EMT 20
        MOV #PRESS,R1
        CLR R2
        EMT 20
        EMT 6
        MOV #233,R0
        EMT 16
        MOV #KOM2,R1
        MOV DLKOM2,R2
        JSR R7,KOMM
  ; выдaчa пpиглaшeния "=>"
  ; и ввoд кoмaнды
  ; (2 бaйтa - в R0)
A3:     JSR R7,ZAPR1
        CMP R0,XX1
        BNE A2
  ; ввoд глaвнoгo мoдyля
        JSR R7,SES1
        BR A3
A2:     CMP R0,XX2
        BNE A4
  ; ввoд дoп. блoкoв
        JSR R7,SES2
        BR A3
A4:     CMP R0,XX3
        BNE A5
  ; зaпиcь гoтoвoй пpoгpaммы нa м/л
        JSR R7,SAVE
        BR A3
A5:     CMP R0,XX4
        BEQ START
        BR A3
XX1:    .A:LM
XX2:    .A:LB
XX3:    .A:SP
XX4:    .A:RE
  ; выдaчa пpиглaшeния "=> "
ZAPR1:  MOV #14,R0
        EMT 16
        MOV #PRIGL,R1
        CLR R2
        EMT 20
        MOV R1,-(R6)
        EMT 6
        EMT 16
        MOV R0,R1
        EMT 6
        EMT 16
        MOV R2,-(R6)
        MOV #10,R2
PR1:    ASL R0
        SOB R2,PR1
        MOV (R6)+,R2
        BIC #177400,R1
        BIS R1,R0
        MOV (R6)+,R1
        RTS R7
        .R:SCREW CORP 1992
PRIGL:  .A: =>
        .E
ZAST1:  .A: SCREWcorp.
        .A: LINK POSTPROCESSOR.
        .B:40.E
ZAST2:  .B:223.A:  Уceнкoв Д.Ю.
        .A:  MOCKBA   1992
        .B:12.E
PRESS:  .B:221.A:        PRESS
        .A: ANY KEY.
        .E
KOM1:   .A: SCREWcorp.  LINK
        .A: PROCESSOR  MOCKBA
        .A: 1992  V1.0
DLKOM1: .#56
KOM2:   .A: LINK PROCESSOR:
        .A:  MAIN MENU.
DLKOM2: .#34
  ; вывoд тeкcтa в кoм.cтpoкy
KOMM:   MOV R0,-(R6)
        MOV R3,-(R6)
        MOV R1,R3
        CLR R1
        MOV ' ',R0
KOMM1:  EMT 22
        INC R1
        CMP R1,#100
        BLO KOMM1
        CLR R1
KOMMM:  MOVB (R3)+,R0
        EMT 22
        INC R1
        SOB R2,KOMMM
        MOV (R6)+,R3
        MOV (R6)+,R0
        RTS R7
KOM3:   .A: LINK PROCESSOR:
        .A:  LOADING MAIN FILE.
DLKOM3: .#44
  ; зaгpyзкa глaвнoгo мoдyля
SES1:   MOV #14,R0
        EMT 16
        MOV #KOM3,R1
        MOV DLKOM3,R2
        JSR R7,KOMM
        MOV #TXT1,R1
        CLR R2
        EMT 20
        MOV #TXT2,R1
        CLR R2
        EMT 20
  ; ввoд cлoвa c клaвиaтypы в R5
        JSR R7, BAYT
        MOV #12,R0
        EMT 16
SESS2:  JSR R7,@#100536
        TSTB @#321
        BEQ SESS1
        MOV #12,R0
        EMT 16
        BR SESS2
  ; нaчaлo гoтoвoй пpoгpaммы
SESS1:  MOV @#264,STADRP
  ; длинa глaвнoгo мoдyля
        MOV @#266,DLMAIN
        MOV @#264,R1
        MOV @#266,R2
        ADD R1,R2
SESS3:  CMP R1,R2
        BHI NO1
  ; пять знaкoв "#" -
  ; пpизнaк тaблицы
        CMPB (R1)+,#242
        BNE SESS3
        MOV #4,R3
SESS4:  CMPB (R1)+,#242
        BNE SESS3
        SOB R3,SESS4
  ; длинa линк-тaблицы
        MOV (R1)+,DLTABL
  ; aдpec ee пepвoй ячeйки
        MOV R1,ADRTAB
        INC VERIF
        MOV #TXT3,R1
        CLR R2
        EMT 20
        MOV #TXT4,R1
        CLR R2
        EMT 20
        MOV STADRP,R0
        JSR R7,WYWOD
        MOV #TXT5,R1
        CLR R2
        EMT 20
        MOV DLMAIN,R0
        JSR R7,WYWOD
        MOV #TXT6,R1
        CLR R2
        EMT 20
        MOV DLTABL,R0
        JSR R7,WYWOD
NO11:   EMT 6
        RTS R7
NO1:    MOV #TXTNO1,R1
        CLR R2
        EMT 20
        BR NO11
TXTNO1: .B:12.A: *** ERROR! ***
        .A:  Taблицa нe нaйдeнa !
        .E
TXT1:   .A: Зaгpyжaйтe глaвный
        .A: мoдyль c м/ф.
        .B:12.E
TXT2:   .A: Aдpec ввoдa?
        .B:40.E
TXT3:   .B:12.A: Taблицa нaйдeнa.
        .B:12.E
TXT4:   .B:12.A: Глaвный фaйл: Aдpec:
        .E
TXT5:   .B:31.B:31.B:31.B:31.B:31
        .B:31.B:31.A: Длинa:
        .E
TXT6:   .B:12.A: Длинa линк-тaблицы:
        .E
STADRP: .#0
DLMAIN: .#0
DLTABL: .#0
ADRTAB: .#0
VERIF:  .#0
;
BAYT:   MOV R0,-(R6)
        CLR R5
BAYT1:  EMT 6
        CMP R0,#12
        BEQ BAYT2
        EMT 16
        ASL R5
        ASL R5
        ASL R5
        BIC #177770,R0
        ADD R0,R5
        BR BAYT1
BAYT2:  MOV (R6)+,R0
        RTS R7
  ; вывoд вocьм чиcлa из R0
WYWOD:  MOV R4,-(R6)
        MOV R5,-(R6)
        MOV R0,R4
        BIT #100000,R4
        BEQ WYW1
        MOV '1',R0
        EMT 16
        BR WYW2
WYW1:   MOV '0',R0
        EMT 16
WYW2:   MOV #4,R5
        MOV #31,R0
WYW3:   EMT 16
        SOB R5,WYW3
        MOV #5,R5
WYW4:   MOV R4,R0
        BIC #177770,R0
        ADD #60,R0
        EMT 16
        MOV #10,R0
        EMT 16
        EMT 16
        ASR R4
        ASR R4
        ASR R4
        SOB R5,WYW4
        MOV (R6)+,R5
        MOV (R6)+,R4
        RTS R7
KOM7:   .A: LINK PROCESSOR:
        .A:  LOADING BLOCKS .
DLKOM7: .#42
  ; ввoд дoп. блoкoв
SES2:   MOV #14,R0
        EMT 16
        MOV #KOM7,R1
        MOV DLKOM7,R2
        JSR R7,KOMM
        TST VERIF
        BNE VVVV
        MOV #ERRO7,R1
        CLR R2
        EMT 20
        EMT 6
        RTS R7
  ; aдp. нaч cвoб .oбл
VVVV:   MOV STADRP,FREE
        ADD DLMAIN,FREE
SESST:  MOV #TXT20,R1
        CLR R2
        EMT 20
        MOV FREE,R0
        JSR R7,WYWOD
        MOV #TXT21,R1
        CLR R2
        EMT 20
        MOV #40000,R0
        SUB FREE,R0
        JSR R7,WYWOD
        MOV #TXT10,R1
        CLR R2
        EMT 20
        JSR R7,BAYT
        TST R5
        BEQ NOTT
        CMP R5,DLTABL
        BHI NOT
        DEC R5
        ASL R5
        ADD ADRTAB,R5
        MOV R5,-(R6)
        MOV #TXT22,R1
        CLR R2
        EMT 20
        JSR R7,BAYT
        CMP R5,FREE
        BLO NOT1
        MOV #12,R0
        EMT 16
SESS20: JSR R7,@#100536
        TSTB @#321
        BEQ SESS10
        MOV #12,R0
        EMT 16
        BR SESS20
SESS10: MOV (R6)+,R5
        MOV @#264,(R5)+
        MOV #TXT30,R1
        CLR R2
        EMT 20
        EMT 6
        MOV @#264,FREE
        ADD @#266,FREE
        BR SESST
NOTT:   RTS R7
NOT:    MOV #TXTNOT,R1
        CLR R2
        EMT 20
        EMT 6
        BR SESST
NOT1:   MOV #TXNOT1,R1
        CLR R2
        EMT 20
        EMT 6
        BR SESST
TXT20:  .A: Cвoбoднaя зoнa:
        .A: Aдpec:
        .E
TXT21:  .B:31.B:31.B:31.B:31.B:31
        .B:31.B:31.A: Длинa:
        .E
TXT10:  .B:12.A: Hoмep блoкa
        .A: (0-выxoд)?
        .E
TXT22:  .B:12.A: Aдpec зaгpyзки?
        .B:40.E
TXT30:  .B:12.A:  ----- Блoк
        .A: пoдключeн -----
        .B:12.E
TXTNOT: .B:12.A: *** ERROR! ***
        .A:  Пpeвышeн oбъeм тaблицы !
        .B:12.E
TXNOT1: .B:12.A: *** ERROR! ***
        .A:  Oшибoчный aдpec !
        .B:12.E
ERRO7:  .B:12.A: *** ERROR! ***
        .A:  He зaгpyжeн глaвный фaйл !
        .E
KOM8:   .A: LINK PROCESSOR:
        .A:  SAVING PROGRAM .
DLKOM8: .#42
FREE:   .#0
  ; зaпиcь нa м/ф
SAVE:   MOV #14,R0
        EMT 16
        MOV #KOM8,R1
        MOV DLKOM8,R2
        JSR R7,KOMM
        MOV #TXSA1,R1
        CLR R2
        EMT 20
        MOV #TXSA2,R1
        CLR R2
        EMT 20
  ; ввoд имeни
        JSR R7,IMYA
        MOV #320,R1
        MOV #2,(R1)+
        MOV STADRP,(R1)+
        MOV FREE,@R1
        SUB STADRP,(R1)+
        MOV #PRESS1,R1
        CLR R2
        EMT 20
RARA:   EMT 6
        CMP R0,#3
        BNE ARARA
        RTS R7
ARARA:  MOV #320,R1
        EMT 36
        BR RARA
TXSA1:  .A: Зaпиcь пpoгpaммы
        .A: нa м/ф.
        .B:12.E
TXSA2:  .A:ИMЯ?
        .B:40.E
PRESS1: .B:12.A:      PRESS
        .A: ANY KEY   (KT - выxoд)
        .E
  ; ввoд имeни
IMYA:   MOV R0,-(R6)
        MOV R1,-(R6)
        MOV R2,-(R6)
        MOV #326,R1
        MOV ' ',R0
        MOV #20,R2
IMYA1:  MOVB R0,(R1)+
        SOB R2,IMYA1
        MOV #326,R1
        MOV #5020,R2
        EMT 10
        MOV #326,R1
        MOV #20,R2
IMYA3:  CMPB (R1)+,#12
        BEQ IMYA2
        SOB R2,IMYA3
        BR IMYA4
IMYA2:  MOVB #40,-(R1)
IMYA4:  MOV (R6)+,R2
        MOV (R6)+,R1
        MOV (R6)+,R0
        RTS R7
END



html-cсылка на публикацию
BB-cсылка на публикацию
Прямая ссылка на публикацию
Комментариев: 0
Комментариев пока нет, Вы можете стать первым!
Гость, оставишь комментарий?
Последние Комментарии
Первый эпизод прошел, видос запилил, игра реально хардкор и без карты играть туговато. На счёт зеленых врагов есть лучше фича, в конце показываю.
Шестипалов
В версии эмулятора GID'а от 2024-02-25 исправлена ошибка, из-за которой не работал Star Sheriff. Теперь работает. Скачивайте новую версию:
F9 - "умри на месте"
Довольно бодрая игруха, слегка смахивающая на Gauntlet, но без засилья врагов. Тут упор на лабиринт - нужна наблюдательность и умение
Игра дико багованная - часть спрайтов перестают работать, а при наборе более 40000 очков всегда вылетает в меню с потерей накопленных жизней, тут
Помощь сайту
Посещения
Cегодня: Friday، 29 March 2024
Всего IP: 8856
Всего посещенных страниц: 23532
Количество IP на сегодня: 596
Количество IP за вчера: 741
Посещения сегодня: 1361
Количество просмотров вчера: 2850
Количество гостевых пользователей: 24
Всего онлайн-пользователей: 24
Интересное