Важная информация

User Tag List

Страница 73 из 110 ПерваяПервая ... 697071727374757677 ... ПоследняяПоследняя
Показано с 721 по 730 из 1099

Тема: Программирование на УКНЦ как?

  1. #721
    Guru
    Регистрация
    11.09.2009
    Адрес
    Москва
    Сообщений
    4,685
    Благодарностей: 2820
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    В позиционно-независимом коде доступ к абсолютным адресам затруднён, поэтому записать в R0 адрес нулевого байта можно так:

    Код:
    CRLF:	MOV	PC,R0		;GET A NULL BYTE POINTER IN R0
    	MOV	R0,R0		;NO-OP WHOSE BOTTOM BYTE IS 0!!!!!
    	.PRINT			;PRINTING NULLSTRING IS A CRLF
    	RETURN

  2. #721
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  3. #722
    Guru Аватар для form
    Регистрация
    27.05.2009
    Адрес
    СССР, Новосибирск
    Сообщений
    5,346
    Благодарностей: 2046
    Mentioned
    6 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Кое-что уже раньше писал, на всякий случай обновлюсь с учетом накопившегося... Пока есть время побездельничать

    Сохранение регистра без изменения признаков в слове состояния процессора:
    Код:
            JSR     R0,@PC                  ;СОХРАНИТЬ R0 В СТЕКЕ
    Очистка памяти и чистый останов после очистки (при выключенном/отсутствующем MMU):
    Код:
            MOV     #160000,SP              ;ВЕРХ ПАМЯТИ (+2)
            MOV     (PC)+,@#0               ;ИНСТРУКЦИЯ
            CALL    -(PC)                   ; ВЫЗОВА САМОГО СЕБЯ        
            CLR     PC                      ;ПЕРЕХОД НА ИНСТРУКЦИЮ
    Данный способ не будет работать на J11 процессорах в виду возникновения прерывания по 4 как только SP опустится ниже 400.

    В MACRO-11 названия инструкций кроме всего прочего - константы, равные коду инструкции с обнуленными битами аргумент(а,ов):
    Код:
            <CLV>!<CLC>                     ;ОЧИСТИТЬ БИТЫ V и C
            MOV     #BR,R0                  ;ЗАНЕСТИ 400 В R0
    Немного о совместимости. Директивы .PSECT могут кардинально изменить картину. Например
    Код:
            MOV     #NOP,SUBR
    
    SUBR:   BR      XXX                     ;ЗАМЕНЯЕМАЯ ИНСТРУКЦИЯ
    не сработает если программа собрана с разделением I/D пространств (LINK/ID в RT-11, TKB /ID в RSX-11, RSTS/E итд). Кроме того следует помнить, что в многопользовательских задачах (TKB /MU) в RSX-11, секции, объявленные как RO аппаратно защищаются от записи. Также не следует полагаться на то, что порядок секций будет совпадать с указанным в исходниках - он может быть измененн опциями линковщика.

    Еще о совместимости: OBJ файлы во всех DECовских системах (RT-11, RSX-11, RSTS/E итд) абсолютно совместимы. Это значит, что скомпилированный в одной системе код может быть перенесен в другую систему прямо в виде OBJ файла (разумеется, в файле должен быть чистый код - без использования системно-зависимого функционала). Также следует помнить об особенностях работы с файлами в разных системах: перенос OBJ файлов RSX-11 в RT-11/DOS-11 или обратно требует правильного преобразования файлов (FLX /FB например). Это однако относится только к обычным или "склеенным" (допускается использование таковых) OBJ файлам. Библиотечные файлы RT-11 (также имеющие расширение OBJ) несовместимы с другими системами (а также в случае копирования в RSX-11 должны бысть скопированы 1:1 [FLX /IM]).

    Пара слов о глобальных переменных. В RSX-11 и в RT-11 V5+ неопределенные ссылки автоматически считаются глобальными. В RT-11 V4 и ранних неопределенные ссылки по умолчанию вызывают ошибку. Если требуется совместимость, есть смысл перечислить все внешние ссылки в директиве .GLOBL или разрешить по умолчанию считать глобальными директивой .ENABL GBL.

    Верхний адрес программы:
    Код:
            MOV     #END,R0         ;НЕПРАВИЛЬНОЕ ПОЛУЧЕНИЕ ВЕРХНЕГО АДРЕСА
    
    END:
            .END    START
    пример выше может быть некорректным например если используются библиотечные вызовы. Во избежание несовместимостей, стоит воспользоваться директивой .LIMIT которая записывает два слова (начальный и конечный адрес программы) или содержимым ячейки @#50 (или результатом вызова .SETTOP) в RT-11.

    Ну и еще немного о совместимости:
    Код:
            MOV     R0,-(R0)
            MOV     R1,(R1)+
            JMP     (R0)+
            MOV     PC,LABEL
    результат выполнения вышеперечисленных инструкций зависит от процессора и потому не предсказуем заранее. Впрочем компилятор выдаст ошибку Z на подобные команды.

    Ну и напоследок (а то уже работать пора) мое любимое - немного о фортране.
    Код:
            CALL    SUBR(1,2)
    вышенаписанный оператор отнюдь не вызывает подпрограмму SUBR с аргументами 1 и 2 как многие даже изучавшие фортран могут подумать. Аргументы 1 и 2 гарантируются только при первом вызове подпрограммы (во многих программах можно видеть вызовы вроде RAN(0,0) для получения случайного числа - это как раз такой случай). В дальнейшем сама подпрограмма может изменить их значения (все аргументы в фортране - ссылки). Кстати именно поэтому все аргументы внешних фортрановских подпрограмм для паскаля обязаны быть объявлены как VAR.

    Подпрограмма для фортрана (если она написана на MACRO-11) точно знает сколько аргументов передано и какие из них пропущены. Выглядит это так: на входе в подпрограмму R5 содержит адрес блока аргументов. Первое слово содержит количество аргументов (включая пропущенные), далее следуют ссылки на аргументы. Если в ссылке прописано -1, это означает пропущенный аргумент. Сохранять регистры в подпрограмме, написанной на MACRO-11 для фортрана, не требуется.

    А еще фраза "God is real, unless declared integer" полностью соответствует правилам фортрана где без явного объявления все переменные начинающиеся с букв от I до N считаюся целыми, а все остальные - вещественными

    Пока все, пора работать, позже может еще чего-нибудь напишу.
    Последний раз редактировалось form; 09.02.2015 в 12:43.
    PDP-11/83, Электроника МС0511 (УК-НЦ), DECserver 90M
    Q-Bus: H9278-A, DLV11-J, DZQ11, DHV11, DELQA-M, LPV11, CQD-420/TM, DRV11
    PMI: KDJ11-BF, MSV11-JE
    VT220, CM7209

  4. Эти 2 пользователя(ей) поблагодарили form за это полезное сообщение:
    bigral (12.03.2015), hobot (09.02.2015)

  5. #723
    Veteran Аватар для nzeemin
    Регистрация
    20.12.2005
    Адрес
    Рязань
    Сообщений
    1,171
    Благодарностей: 1420
    Mentioned
    3 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Alex_K Посмотреть сообщение
    Где-то так <033>%!0<033>LI@@7@@0@@0<033>%!3.
    Алексей, а есть где-то подробное описание команд графического режима? В коде я вижу кроме LI есть ещё MV, MP, MM, ML, RU, RR, в общем всего полтора десятка.
    В частности, интересует возможность переключить режим основной части экрана на 40 символов в строке и обратно.

  6. #724
    Guru Аватар для hobot
    Регистрация
    30.08.2011
    Адрес
    Зеленоград
    Сообщений
    5,082
    Благодарностей: 1182
    Mentioned
    3 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    nzeemin, Никита. я не программист и не совсем понимаю что есть графический режим, но вот я
    пользуюсь древней шпаргалкой для УК-НЦ )

    Скрытый текст

    Код:
    PROCEDURE TTYOUT(N:INTEGER);
     CONST R=200B;
     VAR A ORIGIN 177564B, D ORIGIN 177566B:INTEGER;
    BEGIN
     WHILE (A AND R)=0 DO;
     D:=N;
    END;
    
    
    PROCEDURE CURSOR(CC:INTEGER); /* цВЕТ КУРСОРА 60-ЧЁРНЫЙ. 67-БЕЛЫЙ */
    BEGIN
    	TTYOUT(33B);TTYOUT(247B);TTYOUT(CC);
    END;
    
    PROCEDURE SCRFRM(SS:INTEGER); 
    BEGIN
    	TTYOUT(33B);TTYOUT(246B);TTYOUT(SS); /* 62 - 40Х80 */
    END;
    
    PROCEDURE SETCOLOR(CT,CZ,CS:INTEGER);
    BEGIN
    	TTYOUT(33B);TTYOUT(240B);TTYOUT(CT); /* СИМВОЛ */
    	TTYOUT(33B);TTYOUT(241B);TTYOUT(CZ); /* ЗНАКОМЕСТ */
    	TTYOUT(33B);TTYOUT(242B);TTYOUT(CS); /* ЭКРАН */
    END;
    
    PROCEDURE TEXTCOLOR(CT:INTEGER); /* ЦВЕТ ТЕКСТА 60-ЧЕРНЫЙ 67-БЕЛЫЙ */
    BEGIN
    	TTYOUT(33B);TTYOUT(240B);TTYOUT(CT);
    END;
    На самом деле эти процедуры я выкладывал в этой теме уже,
    только давно давно давно ) Извиняюсь если не то что нужно.
    Думаю это легко читаемые вещи - легко переписать на ассемблере )
    [свернуть]


    ---------- Post added at 03:21 ---------- Previous post was at 02:39 ----------

    Esc ГРАФ-F (033 246) - установка формата экрана:
    Esc ГРАФ-F 1 (033 246 061) - 80x24;
    Esc ГРАФ-F 2 (033 246 062) - 40x24;
    Esc ГРАФ-F 3 (033 246 063) - 20x24;
    Esc ГРАФ-F 4 (033 246 064) - 10x24.

    http://www.felixl.com/Uknc_RAM_description_app
    Последний раз редактировалось hobot; 11.03.2015 в 03:48.
    Архив программ для УК-НЦ, ДВК и БК.

    Ищу игру "СТРАНА МОНСТРОВ" [monstr.sav] для ДВК.

  7. #725
    Guru Аватар для hobot
    Регистрация
    30.08.2011
    Адрес
    Зеленоград
    Сообщений
    5,082
    Благодарностей: 1182
    Mentioned
    3 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    nzeemin, ещё после вашего запроса, такое родилось предложение
    http://zx-pk.ru/showpost.php?p=782076&postcount=150

    Я не знаю будет ли у вас время покопаться в исзодниках,
    они доступны на самом первом (и других) образах от Сергея в архиве.

    Почему именно на этот исходник даю ссылку, там некая процедура
    присутствует "инициализация графического режима".
    Последний раз редактировалось hobot; 11.03.2015 в 22:03.
    Архив программ для УК-НЦ, ДВК и БК.

    Ищу игру "СТРАНА МОНСТРОВ" [monstr.sav] для ДВК.

  8. #726
    Veteran Аватар для nzeemin
    Регистрация
    20.12.2005
    Адрес
    Рязань
    Сообщений
    1,171
    Благодарностей: 1420
    Mentioned
    3 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    hobot, спасибо за подсказки.
    Подразню тебя иллюстрацией прогресса работы над портом (геймплея пока ещё нету конечно):

  9. Эти 2 пользователя(ей) поблагодарили nzeemin за это полезное сообщение:
    anasana (14.03.2015), hobot (14.03.2015)

  10. #727
    Guru Аватар для hobot
    Регистрация
    30.08.2011
    Адрес
    Зеленоград
    Сообщений
    5,082
    Благодарностей: 1182
    Mentioned
    3 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от nzeemin Посмотреть сообщение
    hobot, спасибо за подсказки.
    Подразню тебя иллюстрацией прогресса работы над портом (геймплея пока ещё нету конечно):


    Вот это да! ) Даже прослезился! )
    Это шикарнейший анонс, Никита, я записываюсь в тестеры !
    И в целом любая поддержка с моей стороны для этого проекта! )

    Если могу помочь какой-то рутиной пособить - без сложного низкоуровневого, пишите мне ТЗ в ЛС )

    Ура!
    Последний раз редактировалось hobot; 14.03.2015 в 17:05.
    Архив программ для УК-НЦ, ДВК и БК.

    Ищу игру "СТРАНА МОНСТРОВ" [monstr.sav] для ДВК.

  11. #728
    Veteran Аватар для nzeemin
    Регистрация
    20.12.2005
    Адрес
    Рязань
    Сообщений
    1,171
    Благодарностей: 1420
    Mentioned
    3 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от hobot Посмотреть сообщение
    Это шикарнейший анонс, Никита, я записываюсь в тестеры !
    И в целом любая поддержка с моей стороны для этого проекта! )
    Чтобы не засорять эту ветку, вынес в отдельную тему:
    http://zx-pk.ru/showthread.php?p=788784#post788784

  12. Этот пользователь поблагодарил nzeemin за это полезное сообщение:
    hobot (15.03.2015)

  13. #729
    Guru Аватар для form
    Регистрация
    27.05.2009
    Адрес
    СССР, Новосибирск
    Сообщений
    5,346
    Благодарностей: 2046
    Mentioned
    6 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию Ассемблерные подпрограммы для BASIC-11

    Решил ради интереса попробовать как работают ALR в BASIC-11. Подробно расписывать не буду, все описано в Installation Guide, User Guide и Language Reference. На пробу собрал BASIC, понимающий две подпрограммы PEEK и POKE для работы с памятью.

    Простенькая программка, печатающая строку на экран через регистры терминала:
    Код:
    LIST
    
    
    TTREG     25-MAR-15  18:18:23
    
    10 C%=OCT('177564') \ B%=OCT('177566')
    20 S$=CHR$(13)&CHR$(10)&'*** HELLO, WORLD! ***'&CHR$(13)&CHR$(10)
    30 FOR I%=1% TO LEN(S$)
    40 O%=ASC(SEG$(S$,I%,I%))
    50 CALL 'PEEK'(C%,V%) \ IF V%<>128 THEN 50 \ CALL 'POKE'(B%,O%)
    60 NEXT I%
    
    READY
    RUN
    
    
    TTREG     25-MAR-15  18:22:16
    
    
    *** HELLO, WORLD! ***
    
    READY
    Принцип такой: берется дистрибутив BASIC-11 (в архиве должен быть, я выкладывал), копируется файл BSCLI.MAC в MYCLI.MAC, по метке FTBL добавляются ссылки на функции:
    Код:
    FTBL:   .WORD   PEEKNM,POKENM	;АДРЕСА ДЕСКРИПТОРОВ ПОДПРОГРАММ
            .WORD   0		;КОНЕЦ СПИСКА
    Ниже перед строчкой ".GLOBL UACTST" добавляем дескрипторы и сами подпрограммы:
    Код:
    PEEKNM: .ASCII  <4>/PEEK/	;<ДЛИНА>/ИМЯ/
            .EVEN			;ВЫРАВНИВАНИЕ
            .WORD   PEEKST		;АДРЕС ПОДПРОГРАММЫ
    POKENM: .ASCII  <4>/POKE/
            .EVEN
            .WORD   POKEST
    
    ;+
    ;ПОДПРОГРАММА ПОЛУЧЕНИЯ ДВУХ АРГУМЕНТОВ С ПРОВЕРКОЙ
    ;ТИПА (ПОДДЕРЖИВАЕТСЯ ТОЛЬКО INTEGER).
    ;-
    GETARG: MOV     -2(R5),R4               ;СОХРАНЯЕМ ССЫЛКУ НА
    					;ДЕСКРИПТОРЫ АРГУМЕНТОВ
            CMP     #101002,(R5)+           ;ПРОВЕРЯЕМ ЧТО ДВА АРГУМЕНТА
            BNE     ARGERR                  ;НЕТ
            MOV     (R5)+,R1                ;ПОЛУЧАЕМ ССЫЛКУ НА АРГ 1
            MOV     (R5)+,R2                ;ПОЛУЧАЕМ ССЫЛКУ НА АРГ 2
            .TRPSET #AREA,#BUSTMO           ;ПЕРЕХВАТЫВАЕМ ПРЕРЫВАНИЯ 4/10
            CALL    @PC                     ;ВЫПОЛНЯЕМ ДВАЖДЫ
            MOV     @R4,R0                  ;ОПИСАНИЕ АРГУМЕНТА
            BIC     #^C177,R0               ;УБИРАЕМ ЛИШНЕЕ
            CMP     #23,R0                  ;ТИП INTEGER?
            BNE     ARGERR                  ;НЕТ
            BIT     #200,(R4)+              ;ПРОВЕРЯЕМ ПЕРЕМЕННАЯ/ВЫРАЖЕНИЕ
            RETURN                          ;ВОЗВРАТ
    
    ARGERR: JMP     $ARGER                  ;ОШИБКА: НЕВЕРНЫЕ АРГУМЕНТЫ
    
    BUSTMO: MOV     #BUSERR,@SP             ;ПЕРЕДАЕМ АПРАВЛЕНИЕ НА BUSERR
            RTI                             ;
    
    BUSERR: JSR     R1,$BOMB                ;ПЕЧАТЬ СООБЩЕНИЯ ОБ ОШИБКЕ
            .ASCIZ  /INVALID ADDRESS/
            .EVEN
            RETURN                          ;ВОЗВРАТ
    
    PEEKST: CALL    GETARG                  ;ПОЛУЧАЕМ АРГУМЕНТЫ
            BNE     ARGERR                  ;ВТОРОЯ АРГУМЕНТ - КОНСТАНТА - КЮ!
            MOV     @(R1)+,@R2              ;ЧИТАЕМ СОДЕРЖИМОЕ ПАМЯТИ
    RETURN: .TRPSET #AREA,#0                ;ОТКЛЮЧАЕМ ПЕРЕХВАТ ПРЕРЫВАНИЯ
            RETURN                          ;ВОЗВРАТ
    
    POKEST: CALL    GETARG                  ;ПОЛУЧАЕМ АРГУМЕНТЫ
            MOV     @R2,@(R1)+              ;ПИШЕМ В ПАМЯТЬ
            BR      RETURN                  ;ВОЗВРАТ
    
    AREA:   .BLKW   2                       ;БЛОК EMT
    Компилируем модуль командой "MAC BSASM+BSMAC+MYCLI/OB" и выполняем генерацию BASIC-11:
    Код:
    .RU BASIC
    BASIC-11/RT-11 V02-03S
    OPTIONAL FUNCTIONS (ALL, NONE, OR INDIVIDUAL)? A
    
    READY
    RUN SUCNFG
    BASIC-11/RT-11 V02 Configuration Program
    
    Type "?<ret>" after any prompt for HELP.
    
    .SAV and .COM file name (default is BASIC):
    
    Do you want a map? (Y or N; default is N):
    
    Background or Foreground ? (B or F; default is B):
    
    Do you want PRINT USING? (Y or N; default is Y):
    
    Do you want CALL support? (Y or N; default is N): Y
    
    Enter module names (one per line): MYCLI
    Module name: BSCLLB
    Module name: 
    
    Single or Double precision math? (S or D; default is S):
    
    Arithmetic hardware (NONE, EAE, EIS, FIS, or FPU; default is NONE): FPU
    
    Do you want the transcendental functions? (Y or N; default is Y):
    
    Do you want the SUB command? (Y or N, default is Y):
    
    Do you want the RESEQ command? (Y or N, default is Y):
    
    Do you want long error messages? (Y or N; default is Y):
    
    Overlay structure type (1, 2, 3, 4, or 5; default is 1):
    
    To create the BASIC that you have just defined,
    type "BYE<ret>" after BASIC prints "READY". When the system
    prompts for input, type "@BASIC<ret>" to link the new BASIC.
    You may type "R BASIC<ret>" to run it.
    run it by typing only "BASIC<ret>".
    
    READY
    BYE  
         
    .@BASIC
    Собственно все
    PDP-11/83, Электроника МС0511 (УК-НЦ), DECserver 90M
    Q-Bus: H9278-A, DLV11-J, DZQ11, DHV11, DELQA-M, LPV11, CQD-420/TM, DRV11
    PMI: KDJ11-BF, MSV11-JE
    VT220, CM7209

  14. Эти 2 пользователя(ей) поблагодарили form за это полезное сообщение:
    bigral (26.03.2015), hobot (25.03.2015)

  15. #730
    Veteran
    Регистрация
    02.03.2015
    Адрес
    г. Караганда, Казахстан
    Сообщений
    1,535
    Благодарностей: 471
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от form Посмотреть сообщение
    MOV 12(SP),-(SP) ;ПЕРЕНОСИМ АДРЕС ВОЗВРАТА
    MOV R5,14(SP) ;СОХРАНЯЕМ R5
    JSR PC,@(SP)+ ;СОПРОГРАМИМ ВЫЗВАВШЕГО
    Кстати, вот это самое "сопрограммим" - весьма плодотворный прием. Мне он понравился еще с того момента, как я заглянул внутрь .INTEN, после чего я его начал применять, в том числе и в некоторых, скажем так, нетрадиционных местах. Напимер, при программировании драйверов. Загляни, допустим, в исходник LP. О, ужас!Как там воюют с той же эмуляцией Таба, да и с другими вещами... А используя "сопрограммы" - сплошной комфорт, пишешь программу линейно, а там, где нужно ждать прерывания пишешь:
    CALL InWait
    в которой достаешь из стека и сохраняешь в статической памяти адрес возврата, нужные регистры и пр. и выходишь. Получив же прерывание, сделаешь .INTEN (вернее, его сделает .DRAST), достаешь из той самой статической памяти всё сохраненное, после чего переходишь по сохраненному адресу возврата. И программа сразу же становится линейной и понятной. Правда, никакой реентерабельности, но она от драйверов RT-11 требуется только в случае, когда один драйвер обслуживает несколько однотипных устройств, но и тогда цена вопроса - таблица обслуживаемых устройств, в которой, кроме всего прочего, предусмотрено место и для сохранения адресов и регистров - для каждого устройства индивидуально. Я так однажды склепал XM-ный драйвер (для TSX, конечно) для какого-то не совсем стандартного сдвоенного компорта, штатное не подошло, да и заказчику нужно было подключать не терминал, а нечто построчно-ориентированное. Так пришлось разобраться и с ХМ-драйверами, и с ведением собственной очереди ввода-вывода для этих устройств (система извещалась о том, что очередь к устройству пуста и можно обращаться, а драйвер продолжал прием или передачу. Естесвенно, повторное обращение к занятому устройству возвращало ошибку, а вот обращение ко второму, свободному, проходило. Програмка была "веселая", сказать, что я облысел именно из-за нее, будет, конечно, преувеличением, но площади лысины она мне добавила наверняка.
    Кто мешает тебе выдумать порох непромокаемый? (К.Прутков, мысль № 133)

Страница 73 из 110 ПерваяПервая ... 697071727374757677 ... ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 3 (пользователей: 0 , гостей: 3)

Похожие темы

  1. Программирование на Эмуляторе. Возможно ли это?
    от Toxic в разделе Программирование
    Ответов: 10
    Последнее: 20.01.2008, 20:20
  2. Программирование Altera и JTAG
    от Mikka_A в разделе Unsorted
    Ответов: 7
    Последнее: 18.01.2008, 10:07
  3. Программирование и софтмейк на NES
    от Splinter в разделе Nintendo
    Ответов: 7
    Последнее: 30.06.2006, 03:31

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •