1. Друзья, в это тяжёлое и непонятное для всех нас время мы просим вас воздержаться от любых упоминаний политики на форуме, - этим ситуации не поможешь, а только возникнут ненужные ссоры и обиды. Это касается также шуток и юмора на тему конфликта. Пусть войны будут только виртуальными, а политики решают разногласия дипломатическим путём. С уважением, администрация Old-Games.RU.

    Скрыть объявление
  2. Пожалуйста, внимательно прочитайте правила раздела.
  3. Если Вы видите это сообщение, значит, вы ещё не зарегистрировались на нашем форуме.

    Зарегистрируйтесь, если вы хотите принять участие в обсуждениях. Перед регистрацией примите к сведению:
    1. Не регистрируйтесь с никами типа asdfdadhgd, 354621 и тому подобными, не несущими смысловой нагрузки (ник должен быть читаемым!): такие пользователи будут сразу заблокированы!
    2. Не регистрируйте больше одной учётной записи. Если у вас возникли проблемы при регистрации, то вы можете воспользоваться формой обратной связи внизу страницы.
    3. Регистрируйтесь с реально существующими E-mail адресами, иначе вы не сможете завершить регистрацию.
    4. Обязательно ознакомьтесь с правилами поведения на нашем форуме, чтобы избежать дальнейших конфликтов и непонимания.
    С уважением, администрация форума Old-Games.RU
    Скрыть объявление

Кодерский уголок

Тема в разделе "Мастерская", создана пользователем Dimouse, 10 сен 2006.

  1. Dimouse King of Mice

    Dimouse

    Администратор Переводчик

    Регистрация:
    18 апр 2003
    Сообщения:
    35.134
    В соответствии с назначением раздела, в этой теме предполагается обсуждать конкретные вопросы, которые у вас возникают при создании своих программ (в частности - игр), помогать другим, размещать полезные ссылки на статьи и материалы, которые могут пригодиться другим.

    Что здесь не допускается:
    - беспорядочный флуд на всевозможные темы, в том числе общие обсуждения языков программирования без конкретики (карается по статье "флуд и оффтопик" *),
    - разжигания на темы "что лучше, Си или Си++ и чем они отличаются?", "какой язык программирования лучше X или Y?" и т.п. (карается по статье "флейм и участие в холиварах" *),
    - мерение пиписьками в стиле "я лучше программирую" или "ты не умеешь программировать" (карается по статье "оскорбление участников и их взглядов" *).

    Всё это допускается в специально созданной теме "Беседка для программистов или «Бутерброд с кодом».

    * по усмотрению модератора также возможно применение блокировки в данной теме.

    Оригинальное сообщение
     
    Последнее редактирование модератором: 24 ноя 2014
    CY8R4Y нравится это.
  2.  
  3. A.P.$lasH

    A.P.$lasH

    Legacy

    Регистрация:
    27 фев 2010
    Сообщения:
    4.667
    Код:
            .8086
    
    outw    macro   port
            mov     dx, port
            out     dx, al
            endm
    
    cseg    segment
    start:
            outw    280h
            outw    281h
            outw    282h
    cseg    ends
    
            end     start
    Ну и параметр, на самом деле, можно туда же.
     
    Geryon нравится это.
  4. Geryon

    Geryon

    Регистрация:
    13 май 2008
    Сообщения:
    1.228
    Код:
    const float multis[] = {1F, 1.059463F, 1.122462F, 1.189207F, 1.259921F, 1.334839F, 1.414213F, 1.498307F, 1.587401F, 1.681792F, 1.781797F, 1.887748F};
    А OpenWatcom C++ мне в ответ - Error: Expecting ',', but found 'F'. Что я сделал не так?
     
  5. AxXxB неадекват

    AxXxB

    Хелпер Переводчик

    Регистрация:
    13 ноя 2006
    Сообщения:
    1.663
    1.0f
     
    Val07og и Geryon нравится это.
  6. Geryon

    Geryon

    Регистрация:
    13 май 2008
    Сообщения:
    1.228
    Для чего служит странная инструкция

    Код:
    jmp $+2
    Это что, какой-то вариант задержки?
     
  7. Bato-San Чеширский волк-киборг

    Bato-San

    Регистрация:
    24 июн 2010
    Сообщения:
    14.136
    Geryon, именно. Вот что пишет про это сама IBM:
    Однако, следует так же учитывать временные задержки самого устройства и особенности работы процессоров начиная с 386, где могут потребоваться дополнительные решения данной проблемы.
     
    Последнее редактирование: 6 май 2014
    Val07og и Geryon нравится это.
  8. A.P.$lasH

    A.P.$lasH

    Legacy

    Регистрация:
    27 фев 2010
    Сообщения:
    4.667
    $ - текущая позиция относительно сегмента. Например, в секции данных позволяет выяснить размер предыдущей переменной (5 - 0 = 5). В секции кода, в силу размера перехода (2 байта) обе команды, идущие подряд, приводят к одному и тому же результату - переходят на следующую :)

    Код:
    				        .8086
    				        .model  small
    				        .stack
    
     0000				        .data
    
     0000 74 65 73 74 00		msg     db      "test", 0
     0005 0005			msg_len dw      $ - msg
    
     0000				        .code
     0000				start:
     0000  EB 00			        jmp     $ + 2
     0002  EB 00			        jmp     exit
     0004				exit:
    				        end     start
    (сорри, листинг форматируется тегом [CODE] со сдвигом)
     
    Geryon нравится это.
  9. Geryon

    Geryon

    Регистрация:
    13 май 2008
    Сообщения:
    1.228
    Действительно, код, откуда я это взял, пишет несколько раз в один и тот же порт:

    Код:
                    mov di,voice            ;set Tandy freq, keyon level
                    mov al,part_reg[di]
                    or al,val_l
                    out 0c0h,al
                    jmp $+2
                    mov al,val_h
                    out 0c0h,al
                    jmp $+2
                    mov al,atten_reg[di]
                    or al,S_atten[si]
                    out 0c0h,al
    
    Я взял этот код за основу, но в моем случае запись производится в разные порты, а не в один и тот же. Выходит, я могу эти команды jmp $+2 выбросить?
     
  10. A.P.$lasH

    A.P.$lasH

    Legacy

    Регистрация:
    27 фев 2010
    Сообщения:
    4.667
    Скорее всего, да. jmp $+2 - задержка в несколько тиков. Её роль возьмут на себя последующие команды, раз уж запись идёт в разные порты.
     
  11. Bato-San Чеширский волк-киборг

    Bato-San

    Регистрация:
    24 июн 2010
    Сообщения:
    14.136
    а могут и не взять... всё зависит от устройства. Порты могут оказаться связаны по сложной логике. Можно попробовать убрать эти команды, но при этом надо учитывать, что на другой конфигурации может и работать по другому или словить кучу странных глюков.
     
  12. A.P.$lasH

    A.P.$lasH

    Legacy

    Регистрация:
    27 фев 2010
    Сообщения:
    4.667
    А как, например?

    Мне кажется, если запись в порт вообще возможна (:)), проблем быть не должно. На 808x такой jmp занимает 15 тактов. Либо последующие команды, когда их наберётся на столько же, заменят его вызов, либо и с ним, стало быть, не работало бы.

    Разве не так?
     
  13. Geryon

    Geryon

    Регистрация:
    13 май 2008
    Сообщения:
    1.228
    Устройство, с которым я работаю - MOS6581, а исходный код относился к трехголосному спикеру Tandy. Я убрал эти jmp, и ничего не изменилось (я работаю в Dosbox с cycles=max), но осознаю, что это никак не гарантирует корректную работу на железе.

    Теперь код выглядит так:

    Код:
    mov di,voice            ;set Innovation freq, start note
    mov bx, voice
    mov ax, 7 ; number of SID registers per voice
    mul bx
    mov bx, ax
    mov di, notenum
    mov al, value_l[di]
    mov dx, 280h
    add dx, bx ; will write to register corresponding to current voice number
    out dx,al
    ;jmp $+2
    mov al, value_h[di]				
    mov dx, 281h
    add dx, bx
    out dx,al
    ;jmp $+2
    mov di, voice
    mov al,15
    mov dx, 298h ; this register isn't corresponding to any voice
    out dx,al
    mov al, 9
    mov dx, 285h
    add dx, bx
    out dx, al
    mov al, 68
    mov dx, 286h
    add dx, bx
    out dx, al
    mov al, 33
    mov dx, 284h
    add dx, bx
    out dx, al
    
     
    Последнее редактирование: 6 май 2014
  14. A.P.$lasH

    A.P.$lasH

    Legacy

    Регистрация:
    27 фев 2010
    Сообщения:
    4.667
    DosBox, разумеется, всегда успеет обновить порт.
     
  15. Geryon

    Geryon

    Регистрация:
    13 май 2008
    Сообщения:
    1.228
    К каким возможным эффектам мне готовиться, когда дело дойдет до железки? Другими словами - в чем может проявляться "неуспевание"?
     
  16. A.P.$lasH

    A.P.$lasH

    Legacy

    Регистрация:
    27 фев 2010
    Сообщения:
    4.667
    Я с побочными эффектами не сталкивался. Тут у Bato-San'а, вероятно, больше опыта. Но я бы и не убирал джампы. Это ведь не мусорный код, а штатный рекомендованный способ.

    С другой стороны, ничего магического в этой команды нет. Тот же эффект, раз уж на то пошло, достижим при использовании пяти идущих подряд NOP'ов :)
     
    Последнее редактирование: 6 май 2014
  17. Geryon

    Geryon

    Регистрация:
    13 май 2008
    Сообщения:
    1.228
    Я решил проверить код для других устройств - Майлс использовал jmp $+2 почти везде, где требовалось писать в порты или читать из них:

    Код:
                    IFDEF SBPRO               ;then look for CT-1345A mixer chip
                    mov dx,MIXADDR
                    mov al,0ah                ;select Mic Vol control
                    out dx,ax
                    jmp $+2
                    mov dx,MIXDATA
                    in al,dx                  ;get original value
                    jmp $+2
                    mov ah,al                 ;save it
                    xor al,110b               ;toggle its bits
                    out dx,al                 ;write it back
                    jmp $+2
                    in al,dx                  ;read/verify changed value
                    xor al,110b              
                    cmp al,ah
                    mov al,ah                 ;put the old value back
                    out dx,al
                    mov ax,0
                    jne __exit 
                    mov ax,1                  ;signal card found -- it's a SB PRO
                    ENDIF
    
    Сделаю так же, поскольку сталкиваться с неведомыми глюками в тот момент, когда я уже давно забуду про jmp $+2, совсем не хочется, а реальных причин экономить такты я не вижу.
     
    A.P.$lasH нравится это.
  18. A.P.$lasH

    A.P.$lasH

    Legacy

    Регистрация:
    27 фев 2010
    Сообщения:
    4.667
    Можно опционально сделать.

    Код:
            .8086
            .model  small
            .stack
    
    ;###############################################################################
    
    PORT_WAIT       equ     1
    
    pwait   macro
            if      PORT_WAIT EQ 1
            jmp     $ + 2
            endif
            endm
    
    ;-------------------------------------------------------------------------------
    
    outp    macro   wPortID
            if      wPortID LT 256
            out     wPortID, al
            else
            mov     dx, wPortID
            out     dx, al
            endif
    
            pwait
            endm
    
    ;-------------------------------------------------------------------------------
    
    inp     macro   wPortID
            pwait
    
            if      wPortID LT 256
            in      al, wPortID
            else
            mov     dx, wPortID
            in      al, dx
            endif
            endm
    
    ;###############################################################################
    
            .code
    start:
            outp    280h
            outp    28h
            inp     28h
            inp     280h
            end     start
    Результат:
    Код:
    DGROUP:0000                 mov     dx, 280h
    DGROUP:0003                 out     dx, al
    DGROUP:0004                 jmp     short $+2
    DGROUP:0006                 out     28h, al
    DGROUP:0008                 jmp     short $+2
    
    DGROUP:000A                 jmp     short $+2
    DGROUP:000C                 in      al, 28h
    DGROUP:000E                 jmp     short $+2
    DGROUP:0010                 mov     dx, 280h
    DGROUP:0013                 in      al, dx
    Ну и через PORT_WAIT включать / выключать задержку для всей программы.
     
    Последнее редактирование: 6 май 2014
    ThisSuXX, Geryon и AxXxB нравится это.
  19. Bato-San Чеширский волк-киборг

    Bato-San

    Регистрация:
    24 июн 2010
    Сообщения:
    14.136
    Geryon, а там не только такты. Объяснять долго и нудно, да ещё и очень привязано к устройствам и процессорам. Проще просто взять за правило всобачивать это хозяйство. NOP использовать не следует !

    НУ и сразу после команды OUT не следует ставить команду STI. Между ними всегда должен быть JMP SHORT $+2 для надёжного выполнения OUT. Особенно это касается обработчиков прерываний работающих с контроллером прерываний.

    Ну глюки возможны разные и весьма красочные и весьма печальные. Смотря что программируешь - от висящих нот до прилёта вместо команд данных и т.п.

    Следует помнить, что начиная с процессора 80386 следующая за IN или OUT команда может выполниться раньше, чем данная команда будет отработана ! Поэтому всегда следует после них ставить джамп.
     
    Последнее редактирование: 6 май 2014
  20. A.P.$lasH

    A.P.$lasH

    Legacy

    Регистрация:
    27 фев 2010
    Сообщения:
    4.667
    Почему?

    Тоже интересно, почему именно 386 и где можно об этом почитать.
     
  21. Bato-San Чеширский волк-киборг

    Bato-San

    Регистрация:
    24 июн 2010
    Сообщения:
    14.136
    A.P.$lasH, там же где и про NOP - всё есть в мануалах по процессорам от интеля...
     
  22. A.P.$lasH

    A.P.$lasH

    Legacy

    Регистрация:
    27 фев 2010
    Сообщения:
    4.667
    Тоже долго объяснять? Очень жаль.
     
  1. На этом сайте используются файлы cookie, чтобы персонализировать содержимое, хранить Ваши предпочтения и держать Вас авторизованным в системе, если Вы зарегистрировались.
    Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie.
    Скрыть объявление