1. Си / Говнокод #25156

    0

    1. 1
    2. 2
    3. 3
    4. 4
    UCSR0A |= TXC0_MASK;
    UDR0 = value;
    while ((UCSR0A & TXC0_MASK) == 0)
      ;

    The TXCn flag ... can be cleared by writing a one to its location.
    Cleared by writing one, Carl.

    Запостил: Steve_Brown, 05 Декабря 2018

    Комментарии (143) RSS

    • AVRGovno
      Ответить
    • #define TCX_CLEAR 1
      и все дела

      это же низкоуровневая сисечка, там не до красивых названий методов.
      Ответить
    • Суслик ни разу не выполнится? И почему он с пустым телом?
      Ответить
      • Чтобы суслику не понравилось, нужно данные поxerить:
        UCSR0A ^= TXC0_MASK;
        Ответить
        • Урсалу Техас Маск, я правельно расшифровал послание?
          Ответить
          • USART0 (Universal Synchronous-Asynchronous Receiver-Transmitter №0) Control and Status Register A, TX(transmit) Complete
            0 - номер трансивера, А - ид. регистра (еще есть B, C...)
            Ответить
      • До меня сразу не дошло, что это не простые переменные, а уольшебные. Почитал тред и кажется начал что-то понимать. Проверим:
        UCSR0A |= TXC0_MASK
        Тута мы сбрасываем все взведённыйэ в регистре биты? Я правильно понял?
        while ((UCSR0A & TXC0_MASK) == 0)
        Здеся ждём пока нужные биты сбросятся? А "0)" это смайлик цыклопа?
        ;
        Пустой апиратор, поставлен на отдельной строччке для улучшения читаемости, чтобы сразу было видно что тело суслика пустое. Если я правильно помню, это было ещё в K&R. Я предпочитаю засовывать тело суслика в вагину {}, можно ещё так {;}.
        Ответить
    • > Cleared by writing one
      Нормальная практика для железок. Позволяет не проёбывать события т.к. при очистке записью нуля возможна гонка.
      Ответить
      • Ого, я проспал целый месяц! Новый год пропустил :(
        Ответить
        • Да блин, вы специально тут такие темы поднимаете пока меня нет? То крестопони и паддинг, то стирание битов... Как тут удержаться?
          Ответить
          • А ты не подглядывай. А то как в анекдоте: а если на шкаф залезть с биноклем, то видно.
            Ответить
          • Чтобы узнать, что тут поднимаются такие темы, нужно читать ГК. А какой смысл уходить, если всё равно читаешь ГК?
            Ответить
            • При чём здесь Гражданский Кодекс?
              Ответить
              • Нам ни к чему сюжеты и интриги,
                Про всё мы знаем, про всё, чего ни дашь.
                Я, например, на свете лучшей книгой
                Считаю кодекс уголовный наш.

                И если мне неймётся и не спится
                Или с похмелья нет на мне лица,
                Открою кодекс на любой странице
                И не могу, читаю до конца.
                Ответить
            • Открыл полистать.
              Ответить
        • http://img0.liveinternet.ru/images/attach/c/2/67/962/67962617_1292536184_podborka_19.jpg
          Ответить
      • Это как?
        Ответить
        • Попытаюсь угадать. Мы перечисляем только те флаги, которые собираемся очистить, чтобы не трогать состояние остальных флагов (0 = не трогать, 1 = очистить).

          Но как тогда установить этот флаг?
          Ответить
          • > как тогда установить этот флаг
            Никак. Он взводится только со стороны железа и сбрасывается только со стороны софта.
            Ответить
        • Стирание нулём аля reg &= ~mask это 2 отдельных транзакции на шине. Можешь случайно скинуть лишний бит, который взвёлся между этими транзакциями. А стирание записью единички - атомарная операция.
          Ответить
          • В паинте?
            Ответить
          • Почему две? Это в случае, если маска не константа и отрицание вычисляется во время исполнения, а не при копуляции?
            Ответить
            • Предполагаю, что так память (вернее, шина) работает. По-видимому, операция OR выполняется просто поданием единичек, а AND так не реализована, нужно считать, вычислить и записать результат.
              Ответить
              • Простые шины работают тупо - можно сделать read (проц выставляет адрес, дёргает линию rd, железка выставляет ответ), можно сделать write (проц выставляет адрес и значение, дергает линию wr, железка что-то делает).

                reg &= ~mask это read, and, write

                reg = mask при стирании единичками это просто write.
                Ответить
                • А reg |= mask?
                  Ответить
                  • read, or, write
                    Ответить
                    • Тогда я пока не пони, чем отличается установка бита в 1 от 0. Надо подумать.
                      Ответить
                    • Я тоже не понял.

                      Пусть есть условно 8 дорожек.
                      Я хочу сбросить бит номер 4, а остальные не тронуть.

                      Мне нужно:
                      1) считать байт в регистр CPU
                      2) сделать AND c маской где установлены все биты кроме 4
                      3) сделать write

                      CPU выставит адрес этого байта на шину, затем установит биты на все дорожки (а на четвертую установит 0)

                      Теперь я хочу установить бит номер 4, а остальные не тронуть.

                      Мне нужно:
                      1) считать байт в регистр CPU
                      2) сделать OR c маской где сброшены все биты кроме 4
                      3) сделать write

                      CPU выставит адрес этого байта на шину, затем установит биты на все дорожки (а на четвертую установит 1)

                      Вопрос к знатокам: в чем разница?
                      Ответить
                      • А нету разницы.

                        Ты описал обычный регистр, похожий на привычную программистам переменную. А схема с "clear by writing one" работает так:
                        1) считать байт в регистр CPU
                        2) обработать события согласно битам
                        3) сделать write с единичками в тех битах, которые нужно стереть, and (not mask) произойдёт внутри железки

                        И мы не можем случайно стереть биты, которые ещё не видели.
                        Ответить
                        • а что CPU запишет на другие дорожки?
                          ну на 4 он поставит единицу, а на остальные что? нули? типа "затри все где единицы а нули не трогай"?
                          Ответить
                          • > нули не трогай
                            Да, 0 - не трогать, 1 - стереть.
                            Ответить
                            • а почему нельзя наоборот: единицы -- не трогать, ноль -- стереть?

                              потому что железке будет сложнее сделать маску?
                              Ответить
                              • Можно и наоборот.

                                > железке будет сложнее
                                Программисту будет сложнее :) Тут ты можешь прочитать текущее состояние и просто хуйнуть его обратно чтобы стереть обработанные биты. А с "ноль - стереть, один - не трогать" тебе придётся инвертировать маску.
                                Ответить
                                • можливо и в текущем состоянии нулями кодировать

                                  но тогда не будет работать красивое

                                  if MASKA & PETUH
                                  Ответить
                          • Можно было и наоборот сделать - 1 не трогать, 0 - занулить. Так, наверное, было бы интуитивней.
                            Ответить
                      • Байт в регистр CPU не считывается. Лишь записывается маска по соответствующему адресу. В зависимости от того, какие биты установлены в маске и какой адрес пишется, устройство установит или обнулит нужные биты, (за одну шинную транзакцию).
                        Ответить
                        • спасибо, я начала понимать уже

                          мы не читаем ничего из железки, мы только туда пишем. И единицы просят сбросить бит, а ноли просят не сбрасывать
                          Ответить
          • То есть, если я пишу ноль в какой-нибудь бит, я могу пропустить какое-то событие от другого бита в этом же регистре? Как страшно жить.
            Разве что, наверное, это предусмотрено, и флаги с такой функциональностью не должны встречаться в одном регистре...
            Ответить
            • > могу пропустить
              Ну да.

              Можно по биту на регистр (но не особо удобно проверять если их много).
              Можно level trigger в духе "буфер пуст", который для софта r/o.
              Можно сбрасывать записью единичек.
              Можно сбрасывать сразу при чтении.

              Но сброс единичками - самый удобный способ, на самом деле. Прочитал регистр, обработал интересные тебе события, выбил их единичками. Остальные можно оставить на потом.
              Ответить
              • >>Можно level trigger в духе "буфер пуст", который для софта r/o.

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

                Так работали shared interrupts в PCI (в ISA они были edge triggered и потому были не щарены)
                Ответить
            • З.Ы. Ну и вообще лучше не думать о регистрах железок как об обычных переменных. Чтение может вызвать сайд-эффекты. При записи могут происходить странные вещи. Чтение и запись в один регистр могут вообще не иметь ничего общего, например регистры статуса (r/o) и команды (w/o) могут висеть на одном адресе...
              Ответить
              • С древними книгами так тоже бывает. У меня так брат Один араб прочитал Некрономикон и сошел с ума.
                Ответить
                • > прочитал некрономикон
                  А ещё есть такая хуйня как метастабильность. Всё твоё железо держится на теории вероятности. Всегда есть шанс, что проснётся ктулху аппаратный UB. Тлен и безысходность.
                  Ответить
                  • Пролетит космическая частица и переключит триггер в ячейке памяти.
                    Ответить
                    • Не, там даже без частиц всё может сломаться...

                      Вокруг каждого переключения триггера есть окно (t - setup time, t + hold time) в течении которого входной сигнал не должен меняться. Если поменяется - выход триггера может успокоиться намного позже обычного, следующие элементы схемы из-за этого тоже могут не уложиться в тайминги и всё рассыпается как карточный домик.

                      Жопа в том, что любой внешний сигнал, не сихронизированный с нашей схемой, рано или поздно переключится как раз посреди этого окна.

                      Есть воркэраунды, позволяющие загнать эту проблему под ковёр (до раза за миллиарды лет, к примеру). Но совсем убрать её нельзя.
                      Ответить
                    • Часто думаю про такие частицы, особенно когда представляю как в TLC NAND какомнить 3 бита кодируется водной ячейке
                      Ответить
                      • Флешкам не так страшно, такую мелочь код коррекции пофиксит. А вот оперативка без ECC...
                        Ответить
                        • Почему во фрешках всегда есть ECC а у поперативки -- только в серверных версиях?
                          Ответить
                          • Потому что флешки годами хранят инфу, а оперативка рефрешится каждые 60мс.
                            Ответить
                      • In the 2003 elections in Brussels's municipality Schaerbeek (Belgium), an anomalous recorded number of votes triggered an investigation that concluded a SEU was responsible for giving a candidate 4,096 extra votes.
                        Ответить
                        • A single event upset in the flight computers of this Airbus A330 during Qantas Flight 72 on 7 October 2008 is suspected to result in an aircraft upset that nearly ended in it crashing after the computers underwent several malfunctions

                          А всё ёбаный солнечный ветер небось
                          Ответить
                          • Солнечный ветер,
                            Дым из трубы,
                            Плач природы,
                            Смех сатаны,
                            А всё оттого, что мы
                            Любили ловить ветра
                            И разбрасывать камни.
                            Ответить
                        • Вот откуда взялись 146%.
                          Ответить
                          • Да да
                            Это все бизон хогвардса или как его там...
                            Ответить
                            • А кот какого-то Штернберга не из-за него умер?
                              Ответить
              • Даже в классическом PC было оборудование у которого один и тот же IO port делал совершенно разные вещи для чтения и для записи, вообще был подключен к разным частям оборудования.

                Это нормально. Но я всё равно не понял чем единица лучше ноля. Вероятно я тупойl.
                Ответить
          • > Стирание нулём аля reg &= ~mask это 2 отдельных транзакции на шине. Можешь случайно скинуть лишний бит, который взвёлся между этими транзакциями. А стирание записью единички - атомарная операция.

            Ну что ты такое несешь? Не, ну если у тебя ассемблер такой кривой, то такая проблема может быть.
            Если у тебя есть машинная инструкция, которая может за раз занулить вот тот бит в том 8-битном байте без его предварительного чтения, то проблемы никакой нет. Побитовым "И" можно. Например, есть у нас регистр в котором битики
            0b10110101
            и если побитовый "И" сделать
            0b11011111
            то как раз таки вот этот битик
                V
            0b10110101
                ^
            будет занулен

            Никакого предварительного чтения тут не надо
            https://ru.wikipedia.org/wiki/Битовые_операции#Побитовое_«И»_(AND)
            > Другими словами, если оба соответствующих бита операндов равны 1, результирующий двоичный разряд равен 1; если же хотя бы один бит из пары равен 0, результирующий двоичный разряд равен 0.

            А если у процессора нет инструкции, чтобы атомарно пихнуть единичку вот в тот бит в том 8-битном байте, то и стирание через единицу тут может обосраться. Так что тогда надо будет еще всякие прерывания запрещать перед изменением битиков.
            Ответить
            • Короче:
              "Зануление" одного бита делается побитовым "И" с маской, где везде единички кроме одного места, которое зануляем.
              "Заединичивание" одного бита делается побитовым "ИЛИ" с маской, где всего одна единичка в том месте, которое нам нужно "заединичить". С чего вдруг побитовое "И" требует 2 отдельных транзакции на шине, а побитовое "ИЛИ" не требует
              Ответить
              • Ну ты бы хоть тред почитал перед тем как это писать...

                "ИЛИ" там нахуй не нужен (ОП юзает его из-за того что control и status смешали в кучу и ему не хочется вспоминать что у него было в control части). Для clear-by-writing-one нужна только запись (reg = mask). А дальше железка внутри себя уже сделает and. Т.е. мы не меняем содержимое регистра, мы отправляем железке команду на сброс нужных битов.

                > машинная инструкция, которая может за раз занулить вот тот бит
                > прерывания запрещать
                Как тебе это поможет против включения бита со стороны железки. В теории, конечно, можно было бы её научить не менять свои регистры пока ты держишь lock на шине... Но это на порядок сложнее тупого clear-by-writing-one.
                Ответить
                • > В теории, конечно, можно было бы её научить не менять свои регистры пока ты держишь lock на шине...

                  В теории можно было б просто писать/читать зарезервированные порты и не ебать мозги с этим memory-mapped peripherals

                  Вот эта хуита
                  https://developer.arm.com/products/software-development-tools/ds-5-development-studio/resources/tutorials/accessing-memory-mapped-peripherals
                  Ответить
                  • > зарезервированные порты
                    Ну да, отдельные порты психологически легче воспринимаются.

                    Но как они помогут с синхронизацией доставки ивентов от железки в твой код?
                    Ответить
                    • А чем именно чтение "памяти" по такому-то адресу (на самом деле памяти там нет) в цикле (через указатель на volatile) до тех пор пока там что-то не будет - лучше, чем чтение из порта в цикле пока что-то там не выдастся из порта?
                      В чем именно MMIO лучше с т.з. синхронизации?
                      Ответить
                      • Шо то хуйня шо это.

                        Так что сначала ждём твоего объяснения чем с т.з. синхронизации удобнее отдельные порты :)
                        Ответить
                        • Да ничем не лучше. Давайте еще например сделаем процессор, чтоб там вместо каких-то портов или каких-то MMIO использовалось например деление какого-то числа на 0. Типа если мы 0 на 0 поделили то мы такую-то хрень сделали, и вот регистре R1 у нас вот такое-то говно записалось, а если 1 на 0 поделили, то там вот тогда какое-то другое говно, и можно сделать:
                          while(SOMESHIT / 0 == SOMECRAP)
                          {
                          }

                          (на самом деле нет, т.к. по стандарту самой сишки это UB но мысль думаю ясна)
                          Ответить
                          • > ничем
                            Ну а нафиг ты тогда этот холивар MMIO vs I/O сюда принёс?

                            У MMIO всего один плюс - не надо отдельные инструкции городить.
                            Ответить
                            • Тогда давайте через деление на 0 делать - там тоже не надо отдельные инструкции городить, и memory map не расходуется на срань всякую
                              Ответить
                            • Да и кроме деления на 0 можно еще какие-нибудь инструкции альтернативно интерпретировать. Например какой-нибудь mov R0, R0. Тогда никаких отдельных инструкций не требуется
                              Ответить
                              • И DMA запретить, а то что это какая-то хуйня в моей памяти шарится и даже что-туда пишет...
                                Ответить
                                • Вот да, вместо DMA лучше еще одно нормальное ядро всунуть, которое с общей памятью, и там пусть через программирование прошивки для этого ядра можно что-то делать, порты читать и писать в память.
                                  Ответить
                                • http://mkprog.ru/mikrokontrollery-stm32/stm32-dlya-nachinayushhih-urok-6-dma-stm32.html
                                  Через DMA на STM32 можно memcpy аппаратно делать например
                                  Ответить
                                • правильно. Один процессор и только PIO, как на классическом IBM PC. Только cpu может байтики перекладывать, остальные пассивные
                                  Ответить
                                  • > IBM PC
                                    А первый убогий DMA контроллер когда завезли?
                                    Ответить
                                    • мне казалось что в XT, но могу ошибаться.

                                      В любом случае, его надо было явно программировать, и на шине мог работать либо он, либо CPU.

                                      Ну а потом случился PCI, и все стали сами себе мастера
                                      Ответить
                                      • > либо он либо CPU
                                        Ну одновременно только кроссбар типа bus matrix'а на STM'ках позволяет...

                                        Или там проц тупо стоял и ждал пока DMA хуярит и ему шина совсем не доставалась?
                                        Ответить
                                        • Вот ответ на твой вопрос
                                          https://en.wikipedia.org/wiki/Intel_8237#Modes
                                          Ответить
                                        • В общем с Single mode все понятно, он чередовался с CPU
                                          интересно как было дело с Block , ведь нельзя же захватывать шину на период, больший чем dram refresh interval, иначе пиздец

                                          Выходит что программисты не должны были просить слишком большие блоки данных

                                          И с Demand тоже забавно: вендоры железок не должны были слишком долго держать DRQ

                                          Как всё сложно, именно по этому я за аналоговые компьютеры
                                          Ответить
                                          • Хотя вроде DMA канал 0 сам обновлял память

                                            ой
                                            нихуя уже не помнбю
                                            Ответить
                            • >>У MMIO всего один плюс - не надо отдельные инструкции городить.
                              А у x86 еще memory шире чем io

                              зачем вообще io в x86? тяжелое наследие?

                              шина-то физически все равно одна
                              Ответить
                              • > тяжелое наследие
                                Ну. По сути просто дополнительный бит на шине в поле адреса.
                                Ответить
                                • >>на шине
                                  а там же правда была дорожка типа MEM/IO, я помню:)

                                  Нахуй его вообще придумали? Чтобы типа программисту на асмеблере было удобнее понимать что вот тут у меня пмять, а вот тут -- ио?
                                  Ответить
                                  • Х.з. может быть ещё одну дыру в адресном пространстве не хотелось прорубать? И без этого мало.
                                    Ответить
                                    • Давайте же гадать!Практически не требуется пространство ввода/вывода столь же обширное, как пространство памяти. Отвести один бит адреса (при некогда узких регистрах процессора) на MEM/IO# было бы расточительством. Отвести адекватную часть пространства типа FFxxh усложнило бы дешифрацию адреса в железе. По етому добавили отдельную линию а ля IORQ и инструкции, которые её дёргают.
                                      Ответить
                                      • >>усложнило бы дешифрацию адреса в железе

                                        почему?
                                        Ответить
                                        • Всем железкам пришлось бы так или иначе учитывать все-все-все биты адреса. А в случае изолированного ввода-вывода, железке, дабы определить, касается её IORQ или нет, достаточно проверить лишь условленное для платформы подмножество битов. То есть например, на каком-нибудь КудахПК с 16-битной адресной шиной и 128 адресами I/O конкретное устройство могло бы отзываться на [IORQ,A6:A0] = 10011000 (всего лишь 8 линий).

                                          Однако я тупанул и не учёл, что при memory-mapped I/O, некий "верховный" дешифратор (возможно, внутри самого CPU) мог бы выставлять подобие IORQ, и каждой железке тогда не пришлось бы проверять весь адрес целиком.

                                          Кстати, кажется, ZX Spectrum при вводе-выводе несколько младших битов адреса вообще использовал по одной штуке на отдельный аппаратный запрос.
                                          Ответить
                                          • >>учитывать все-все-все биты адреса. А
                                            нет, зачем?

                                            В BIOS был размещен наверху памяти (в районе 16-ти метров), и декодер там проверял только верхние дорожки


                                            >>"верховный" дешифратор
                                            Ты предланагаешь чтобы программист писал MOV а CPU выставлял IO?
                                            Ну уж нет, выпустим свой IBM PC без тебя:)


                                            Зы: современные цпу конечно уже очень сильно перефигачивают MOV, потому что в них встроен контролллер памяти и рутовый комплекс PCI-Express и они знают что идет в память, а что в MMIO PCI-Express итд
                                            Ответить
                                            • > зачем?
                                              Чтобы в адресное пространство процессора вкроить как можно больше RAM, ROM, и достаточно MMIO.

                                              > предланагаешь
                                              Мысль была о том, как проверка пучка верхних дорожек адреса сводится к проверке одной единственной IORQ. Для оригинального IBM PC (8088, 20 линий адреса), чтобы выхватить 8 KB под BIOS вверху 1 MB (FE000-FFFFF), надо проверить 7 верхних дорожек, верно? А в случае IBM PC AT (80286, 24 линии), чтобы выделить один адрес для MMIO с неким контроллером в слоте ISA, - все 24?

                                              Я просто предположил, на чём могли бы экономить. А экономили, если с сегодняшней точки зрения, то вообще на спичках. IBM вот сделали IRQ по положительному перепаду, а вентиль A20 в контроллер клавиатуры уместили.
                                              Ответить
                                              • Теперь я тебя понял: ты хочешь сказать что чтобы декодировать 2^N нужно чтобы декодер имел N входов?

                                                >>по положительному перепаду
                                                Да, и из за этого у них не работали shared IRQs на ISA и прерываний вечно не хватало.

                                                >>клавиатуры
                                                ну а куда еще было пхануть этот костыль?

                                                >>спичках

                                                У меня сейчас всплыло как я в глубокой юности читал книгу Михаила Гука про аппаратные средства PC, и он как раз писал что выбор edge вместо level это экономия на спичках и плевок в вечность: насрали целому поколению вендоров
                                                Ответить
                                                • > ты хочешь сказать что чтобы декодировать 2^N нужно чтобы декодер имел N входов?

                                                  Да. При этом практически ведь требуется лишь малая доля из всех возможных 2^N адресов.

                                                  Я хотел было разобраться и отреферировать про PMIO Спектрума, но сходу не могу найти ничего кроме общих слов из мануала и вот этой таблицы. https://velesoft.speccy.cz/zxporty-cz.htm . Судя по ней, устройства ооочень "ленятся" проверять адресные линии (таким образом дичайше сокращая бесконфликтную часть пространства).

                                                  > плевок в вечность
                                                  Ко мне эта книга относительно недавно попала, и как раз про плевок тоже запомнилось. Там ещё говорилось, что по отрицательному перепаду было бы меньше ложных прерываний из-за помех (spurious interrupts).
                                                  Ответить
                                                  • https://im0-tub-ru.yandex.net/i?id=b647a77a9d7f2cb8376b2aa905fd72ac-l&n=13
                                                    Ответить
                                                    • > https://im0-tub-ru.yandex.net/i?id=b647a77a9d7f2cb8376b2aa905fd72ac-l&n=13
                                                      Перевёл его тебе в тактильную область. Проверь.

                                                      ⠀⢀⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⡆
                                                      ⠀⡾⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⣾⠋⠀
                                                      ⢸⠇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣴⠟⠁⠀⠀
                                                      ⢸⡆⠀⠀⠀⠀⠀⠀⠀⢀⣀⣴⡿⠁⠀⠀⠀⠀
                                                      ⠀⠻⣄⠀⠀⠀⠀⠀⣠⣿⡿⠋⠀⠀⠀⠀⠀⠀
                                                      ⠀⠀⠈⠛⠲⠶⠖⢛⡽⠋⠀⠀⠀⠀⠀⠀⠀⠀
                                                      ⠀⠀⠀⠀⠀⠀⣴⠏⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
                                                      ⠀⠀⠀⠀⣠⠞⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
                                                      ⠀⠀⢀⡾⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
                                                      ⠀⠠⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
                                                      Ответить
                                                  • Я вряд ли подскажу тебе за спектурм. Возможно тебе стоит поискать старые книги (их было довольно много) или изобрести машину времени и отправиться в конец 80х.

                                                    Можешь поговорить на https://retrocomputing.stackexchange.com/

                                                    Очень жаль что Гук больше не пишет (надеюсь что он жив-здоров) у него были хорошие книги, хотя и местами сложноватые
                                                    Ответить
                                                    • Спасибо за советы, когда-нибудь при случае вернусь к этой теме. Пока ограничился просмотром определений periph_port_t в сырцах Fuse (Free Unix Spectrum Emulator). Короче, например, на сброс линии A0=0 (остальные игнорируются) отзывается ULA, на сброс A2 — принтер, A4 — IDE (у модели +3e), A5 — джойстик (Kempston). Как-то так.

                                                      /* { маска, значение, читалка, писалка } */
                                                      peripherals/ula.c:  { 0x0001, 0x0000, ula_read, ula_write },
                                                      peripherals/ide/simpleide.c:  { 0x0010, 0x0000, simpleide_read, simpleide_write },
                                                      peripherals/joystick.c:  { 0x0020, 0x0000, joystick_kempston_read, NULL },
                                                      peripherals/printer.c:  { 0x0004, 0x0000, printer_zxp_read, printer_zxp_write },


                                                      > Очень жаль что Гук больше не пишет
                                                      Да, я б тоже почитал.
                                                      Ответить
                                                      • Откуда такая тяга именно к спекки, кстати?

                                                        По PC и 8080 куда больше литературы, я даже могу кое-что посоветовать, и есть мулятор dosbox
                                                        Ответить
                                                        • Кстати, на i8080 (Z80, КР580ВМ80) выпускалось дофига «домашних» компьютеров. У них у всех железо было несовместимым друг с другом?
                                                          Ответить
                                                          • Смотря у каких.
                                                            Некоторые были клонами.

                                                            Например у Спектрума в бСССР было овердохуя клонов: Пентагон, Скорпион, Балтик, to name few.

                                                            У PC тоже было много клонов, например Правец 16 от братушек, у меня даже была старая совейская книжка по его програмированю


                                                            На, подроч насладись
                                                            http://zxbyte.ru/my_lovely_pentagon.htm
                                                            Ответить
                                                            • >> В 2009-м году Striker совершенно бескорыстно подарил мне плату Pentagon-128.

                                                              Интересно, какой Striker.
                                                              Ответить
                                                              • Довольно понятно что это другой страйкер
                                                                Ответить
                                                                • [quote]
                                                                  Он вместе с Мишей (Hamer, это у него была своя Hamer BBS) разработали простую схему CDOS-модема, с гальванической развязкой. Я эту схему опробовал и изготовил в двух экземплярах, один из которых подарил своему другу.
                                                                  [/quote]


                                                                  Вот это я понимаю раньше компьютерщики были.
                                                                  А нынешнее поколение носит в сервис-центр комп когда он "стал тормозить"
                                                                  Ответить
                                                                  • Да тут каждый абзац читается как подвиг.
                                                                    Ответить
                                                                    • Купил статической памяти, потратил пару вечеров чтобы заменить ей ПЗУ, написал программу для прошивания.

                                                                      Мне кажется в этом месте все (ну может кроме Борманда) должны почувствовать свою ничтожность и перестать врать себе о том, что они "разбираются в комптютерах".

                                                                      Кстати, у меня тоже есть такой корпус InWin
                                                                      Ответить
                                                                      • ааааа

                                                                        он собрал на коленке читалку симкарт по I2C, блядь
                                                                        такие люди реально существуют
                                                                        Ответить
                                                                        • Причём даже не для IBM PC, а для какого-то дерьма мамонта.
                                                                          Ответить
                                                                          • Как раз на PC всё могло быть сложнее

                                                                            На дерьме мамонта в каком-то смысле проще все это изучать. И ассемблер там проще, и железо. Пойди мне собери из рассыпухи комп на kaby lake.
                                                                            Ответить
                                                                      • Я максимум что осилил, это развести шину питания 3,3 вольта для PCI на материнке Asus TX97-E (разработчик забыл или не захотел это сделать):
                                                                        http://img-fotki.yandex.ru/get/4134/81368063.2/0_1cb489_27f49b5a_XXXL.jpg

                                                                        Ну ещё паял ЦАП по схеме R-2R (у Борманда такой же самодельный ЦАП на макетной плате на фотке с осцилляброй).

                                                                        Прошивки ковырять самостоятельно боялся (вдруг запорю какую-нибудь контрольную сумму), пользовался готовыми решениями с rom.by.

                                                                        Ещё где-то на ГК я написал, что начал переделку монитора EGA в VGA, но завалился на середине, когда понял, что мне придётся полностью переделывать выходные каскады развёрток. В итоге отнёс монитор на свалку (мне уже страшно, вдруг его кто-то подобрал в таком виде).
                                                                        Ответить
                                                                        • Ну это тожекруто, но странно что не было 3.3, мне казалось его завезли где-то в районе pci 2.0, то-есть в начале 90х.

                                                                          Если у тебя есть возможность выткнуть ПЗУ и втыкнуть его во внешний программатор то можешь не бояться запороть.

                                                                          Я в начале нулевых видал как народ EEPROMы с биосом стирал и пхал в программатор
                                                                          Ответить
                                                                          • Я на той материнке научился менять ПЗУ «на горячую»: в выключенный комп вставляешь микросхему, обхваченную двумя петлями изолированного провода (если провод будет лежать перпендикулярно выводам, то он не будет мешать вставке в панель). Включаешь комп, загружаешь DOS, за провод выдёргиваешь микросхему (так, чтобы «земляной» вывод вышел последним), втыкаешь новую (можно так же её обхватить проводом), запускаешь прошивальщик и льёшь прошивку не на рабочую микросхему, а на ту, которую не жалко.
                                                                            Ответить
                                                                            • >>так, чтобы «земляной» вывод вышел последним)
                                                                              чтобы потенциал не уровнялся через логику?
                                                                              Ответить
                                                                              • Кстати, очень смешно, что в стационарных компах, в телевизорах, в музыкальных центрах и т. п. применяются «тюльпаны», у которых первой размыкается «земля», а последним размыкается центральный штырь.

                                                                                Кто-то даже нашёл объяснение: «тюльпаны» проектировали в эпоху ламповой техники, а лампе насрать на бросок потенциала, её так просто не спалишь. Потом техника стала полупроводниковой, а разъём оставили, чтобы техника чаще выходила из строя и производители не теряли прибыль.
                                                                                Ответить
                                                                          • Ня:
                                                                            http://txp4.narod.ru/asus/tx97e/spec.html

                                                                            PCI 2.1, но без подводки 3,3 вольт.
                                                                            Ответить
                                                        • Офтопик. Только что прочитал, что «Интел» в 1981 году считал, что x86 капец и обещал выпустить iAPX 432 с совершенно другой рахитинктурой, чтобы на Forth было удобнее программировать, но в итоге не осилил:
                                                          https://ru.wikipedia.org/wiki/IAPX_432
                                                          Ответить
                                                          • Это была первая попытка интела, следующая это была Itanium. И все обосрались

                                                            x86 до сих пор с нами
                                                            Ответить
                                                        • У меня некоторый интерес к ретроконпутерам вообще. Там всё относительно просто и уютно, можно немного заполнить пробелы в понимании - что происходит между законом Ома и кнопкой Пуск. Спектрум как-то произвольно пришёлся к слову, когда про декодирование адресов при PMIO плёл. Он ведь тоже вдоль и поперёк изучен, и сообщество вроде у него не маленькое? Демо-парти ещё живы, даже игры новые выходят.

                                                          Литературу по PC, конечно, советуй, если не трудно. Иногда что-то берусь читать, но очень нерегулярно.
                                                          Ответить
                                                          • Мне там интересно по той же примерно причине, правда первые PC мне все же ближе: они тоже куда проще, но знания о них легче перенести на современность, потому что действительно между транзистором и интерпретатором питона слишком много всего происходит.

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

                                                            Про PC мне очень нравятся книги Mindshare. Некоторые говорят что это просто "пересказ мануалов интел", но мануалы читать скучно, а Mindshare нет.

                                                            Начинать надо с книги

                                                            https://www.mindshare.com/Books/Titles/ISA_System_Architecture_(3rd_Edition)

                                                            Можешь почитать оглавление и проникнуться

                                                            https://www.mindshare.com/files/ebooks/ISA%20System%20Architecture%20(3rd%20Edi tion).pdf

                                                            Потом можно читать их книги про x86 и PCI и SATA и USB, там довольно подробно описано как всё работает.

                                                            Я их даже купил (электронные) потому что в торентах не нашел. А еще я уних читал
                                                            https://books.google.ru/books/about/Plug_and_Play_System_Architecture.html (ее пришлось купить бумажную) зато я узнал как работали PNP в ISA и PCI.

                                                            Параллельно надо брать dosbox и асемблер под реальный режим и программировать под все эти железки (контроллеры прерываний, клавиатуры, звук итд).

                                                            Тут помогут книга Журдена
                                                            http://lib.ru/TECHBOOKS/JURDAIN/jourdain.txt
                                                            и Ирвина
                                                            https://www.ozon.ru/context/detail/id/2317806/ (я правда читал старое издание, еще про программерство под дос)

                                                            Потихоньку можно перелезть на борланд си и тоже чего-то пописать под железо но уже на сях:)
                                                            Ответить
                                                            • Спасибо!
                                                              Ответить
                                                            • Шикарно вообще.

                                                              У меня есть железный 286, который лелею и включаю при обострениях ностальгии. Иногда любопытство доводит до ассемблера, но о решении насущных низкоуровневых задач пока и речи нет. Последнее, с чем обломался, - освободить в MS-DOS немного conventional памяти. Кажется, нет у моего железа никаких средств, которые могли бы отобразить имеющуюся оперативку в верхних 384 КБ (чтоб выпихнуть часть драйверов в UMB). Похоже, остаётся лишь добыть, а лучше изготовить плату расширения с сотней КБ оперативки, которая заполнит окно. Но это неточно и "на вырост".
                                                              Ответить
                                                              • На 286 без доработки железа можно использовать HMA, но это всего 64 килобайта.
                                                                Ответить
                                                                • Да. Вдобавок, верхнюю границу можно сдвинуть с 640К на 96К вверх за счёт видео-памяти, если отказаться от графических режимов EGA и VGA.
                                                                  Ответить
                    • Например вот http://blablacode.ru/mikrokontrollery/288
                      void EXTI0_IRQHandler() {
                          if (EXTI_GetITStatus(EXTI_Line0) != RESET) {
                              STM_EVAL_LEDToggle(LED3);   // сигнализируем о прерывании
                                while(RNG_GetFlagStatus(RNG_FLAG_DRDY) == RESET)  // ждём окончания работы генератора
                                {
                                }
                                uint32_t random32bit = 0;
                                random32bit = RNG_GetRandomNumber();  // получаем случайное число
                                lcd_set_cursor(0,0);   // устанавливаем курсор в начало
                                lcd_write_dec_xxxx(random32bit);  // выводим число
                              EXTI_ClearITPendingBit(EXTI_Line0);
                          }


                      Вот этот цикл while(RNG_GetFlagStatus(RNG_FLAG_DRDY) == RESET) очевидно тупо читает в цикле фигню из MMIO и ждет когда там будет не RESET. С тем же успехом можно было б читать какой-нибудь порт в цикле пока там не выйдет требуемое значение
                      Ответить
            • > никакого предварительного чтения тут не надо
              У тебя ALU стоит прямо в оперативке и каждой железке? Ну ок, тогда действительно не надо.
              Ответить
              • > У тебя ALU стоит прямо в оперативке и каждой железке?

                Надо просто с префиксом LOCK делать http://www.club155.ru/x86cmd/LOCK
                В x86 даже есть особые инструкции BTR, BTS, так что OR и AND можно не использовать
                Ответить
                • > префиксом lock
                  Ну блин, lock же не отменяет джвух обращений на шине... Он тупо не даёт захватить шину другим bus master'ам между ними.

                  Плюс, как я писал выше, придётся ещё и саму железку учить понимать lock чтобы она не меняла свои регистры под лочкой.
                  Ответить
    • З.Ы. Это ты ещё не видел биты которые включаются записью 0x01234567 и 0x89ABCDEF в соседний регистр...
      Ответить
      • Rowhammer
        Ответить
      • Ну и на GPIO часто встречаются пары из set/clear регистров. Запись единичек в первый включает биты, запись единичек во второй выключает их. А нули означают "не трогай".

        З.Ы. Причём на STM'ках такая пара доступна через один регистр - 0x0001000 выключает первый бит, 0x00000001 включает его, 0x00020001 атомарно выключает второй и включает первый и т.п.
        Ответить
        • Ага. А в AT - регистр PIN, запись единиц в который вызывает переключение (toggle) соотверствующего бита в PORT.

          - А если 0x00010001 записать, что будет?
          - Что будет, что будет... на жопу упаду! (с)
          Ответить
      • Ну, это, наверное, что-нибудь типа защиты флешки или EEPROM от случайных операций?
        Ответить
    • Опять "борманд" какую-то хуйню обсуждает.
      Ответить
      • Всё лучше, чем эту вашу гомосятину.
        Ответить
        • Ты просто отравлен стереотипом, что для получения наслаждения мужчине требуется партнёр - женщина. На самом деле, наслаждение можно получать и с однополым партнёром, причём оно намного ярче и чище. К слову, мне когда-то тоже было отвратно от мысли об однополых ласках, до той поры, пока я не попробовал поласкать член ртом.
          Ответить
          • Многие мужчины-натурасты любят лизать пёзды своим пассиям - видел на порно, должен сказать, ужасное зрелище. И эти мудилы ещё смеют обзывать кого-то "хуесосом"... Если говорить о вопросах гигиены, то хуй его, мне кажется, ласкать ртом член мужчины намного гигиеничнее, чем лизать бабские гениталии. Судите сами:
            У мужчины, если он здоров, из члена идёт только моча и сперма. (ну ещё смазка, не суть.). У здоровой женщины из пизды регулярно идёт слизь, моча, кровь - ну как, аппетит разыгрался? Благодаря тому, что у мужчины половые органы - наружние, поддерживать их гигиену куда проще, чем женщинам.
            Ответить
            • @(ну ещё смазка, не суть.)
              @Благодаря тому, что у мужчины половые органы - наружние, поддерживать их гигиену куда проще, чем женщинам.

              Попробуй не смыть ее вовремя - аромат будет сногсшибательный..
              Но в целом согласен.
              Ответить
            • И анус рядом
              Ответить

    Добавить комментарий