1. Assembler / Говнокод #28011

    +1

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    71. 71
    72. 72
    73. 73
    74. 74
    75. 75
    76. 76
    77. 77
    78. 78
    79. 79
    80. 80
    81. 81
    82. 82
    83. 83
    84. 84
    85. 85
    86. 86
    87. 87
    88. 88
    89. 89
    90. 90
    91. 91
    92. 92
    93. 93
    94. 94
    95. 95
    96. 96
    97. 97
    98. 98
    .org 22h
    dw @vbi
    
    .org 80h
    bpos: db 0h 0h
    vector: db 2h 1h
    
    process:
    	push %a
    	push %b
    	mov %a [@bpos] ; {h:x, l:y} ;
    	mov %b [@vector] ; {h:dx, l:dy} ;
    	add %ah %bh
    	add %al %bl
    	cmp %ah 11h
    	jng @.skip_xoverflow_handle
    	cmp %ah 14h
    	jg @.overflow_left
    	mov %ah 11h
    	jmp @.xoverflow_finally
    	.overflow_left:
    		mov %ah 0h
    	.xoverflow_finally:
    		neg %bh
    	.skip_xoverflow_handle:
    	cmp %al 5Ch
    	jng @.skip_yoverflow_handle
    	cmp %al 60h
    	jg @.overflow_up
    	mov %al 5Bh
    	jmp @.yoverflow_finally
    	.overflow_up:
    		mov %al 1h
    	.yoverflow_finally:
    		neg %bl
    	.skip_yoverflow_handle:
    	mov [@bpos] %a
    	mov [@vector] %b
    	pop %b
    	pop %a
    	ret
    	
    cls:
    	push %a
    	push %b
    	mov %a 3A98h
    	
    	.loop:
    		mov [%a + @T1] 0000h
    		sub %a 2h
    		jnz @.loop 
    	pop %b
    	pop %a
    	ret
    
    render:
    	push %a
    	push %b
    	push %c
    
    	mov %a [@bpos]  ; {h:x, l:y} ;
    	mov %b %al
    	mul %b 12h
    	add %b %ah
    	add %b @T1
    	
    	mov %c 8h
    	.loop:
    		movb [%b] FFh
    		add %b 12h
    		dec %c
    		jnz @.loop
    	
    	pop %c
    	pop %b
    	pop %a
    	ret	
    
    start:
    	mov %sp FFFFh
    	outb 20h 1h
    	outb 21h 16h
    	out  22h @T1
    	
    	mov %al 1h
    	int 10h
    	
    	.loop:
    		jmp @.loop
    
    vbi:
    	call @cls
    	call @render
    	call @process
    	ret
    
    .org 1000h
    T1:

    решил пойти по накатанному пути и добавил видеоконтроллер, пока только монохромная битовая карта 144x100, но большего и не надо
    сабж выводит на экран что отпрыгивает от стен, простое умножение компонента вектора на -1

    Запостил: digitalEugene, 14 Февраля 2022

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

    • думаю подрубить суперскалярности, добавить какой нибудь MEMSET как инструкцию, PUSHA, POPA, всякие удобные ENTER, LEAVE, LOOP, ну и арифметические наконец добавить все
      Ответить
      • memset убрал 20 строк, да всё быстро работать начало.
        .org 22h
        dw @vbi
        
        .org 80h
        bpos: db 0h 0h
        vector: db 2h 1h
        
        process:
        	push %a
        	push %b
        	mov %a [@bpos] ; {h:x, l:y} ;
        	mov %b [@vector] ; {h:dx, l:dy} ;
        	add %ah %bh
        	add %al %bl
        	cmp %ah 11h
        	jng @.skip_xoverflow_handle
        	cmp %ah 14h
        	jg @.overflow_left
        	mov %ah 11h
        	jmp @.xoverflow_finally
        	.overflow_left:
        		mov %ah 0h
        	.xoverflow_finally:
        		neg %bh
        	.skip_xoverflow_handle:
        	cmp %al 5Ch
        	jng @.skip_yoverflow_handle
        	cmp %al 60h
        	jg @.overflow_up
        	mov %al 5Bh
        	jmp @.yoverflow_finally
        	.overflow_up:
        		mov %al 1h
        	.yoverflow_finally:
        		neg %bl
        	.skip_yoverflow_handle:
        	mov [@bpos] %a
        	mov [@vector] %b
        	pop %b
        	pop %a
        	ret
        
        render:
        	push %a
        	push %b
        
        	mov %a [@bpos]  ; {h:x, l:y} ;
        	mov %b %al
        	mul %b 12h
        	lea %b [%ah + @T1]
        	
        	mov %a 8h
        	.loop:
        		movb [%b] FFh
        		add %b 12h
        		dec %a
        		jnz @.loop
        	
        	pop %b
        	pop %a
        	ret	
        
        start:
        	mov %sp FFFFh
        	outb 20h 1h
        	outb 21h 5h
        	out  22h @T1
        	
        	mov %al 1h
        	int 10h
        	
        	.loop:
        		jmp @.loop
        
        vbi:
        	memset [@T1] 3A98h 0h
        	call @render
        	call @process
        	ret
        
        .org 1000h
        T1:
        Ответить
        • > быстрее

          Пришло время для jit-реконпеляции.
          Ответить
          • у меня архитектура фон неймана
            Ответить
            • Что не мешало эмуляторам плойки гонять игры с самомодифицирующимся кодом...

              Отловишь запись и джитнешь кусок заново.
              Ответить
              • А не будет тормозить отлов записи (как этов ообще? через бряку или страницу с запретом зописи?) Или там можно как-то снифить что-то как кеш делает?
                Ответить
                • Будет. Х.з. как это эффективно сделать, если в проге код вперемешку с данными валяется.

                  У меня пока такая идея -- в каждую инструкцию записи добавлять проверку по битмапе (бряки тут не нужны т.к. хостовый код мы сами высрали).

                  Да, это оверхед. Но странички могут ещё больше оверхеда дать если код и данные не разнесены.

                  В любом случае быстрее интерпретатора будет.
                  Ответить
                  • Самомудифицируемый код без поддержки железа -- плохо:(
                    Всегда ведь можно написать
                    if (hoho == pepe) {
                     writeToCodePage(0xFF);
                    } else {
                     writeToDataPage(0xFF);
                    }
                    // или даже так
                    * (100500 + pepe) = 0xFF; //поди знай куда там адрес в рантайме резолвница


                    А есть ли процессоры, где запись кода и запись данных нужно разными инструкциями делать? Тогда легко можно было бы поддержать самомудифицрвн кд.

                    Или это и будет Фон Нейман?
                    Ответить
                    • Есть. Например на AVR запись (и чтение!) слов на флешке делается отдельными инструкциями.
                      Ответить
                      • так это поди разделение оперативки и внешнего устройства, примерно как IO в штеуде?
                        Ответить
                        • Для флешки прям своя шина, адресное пространство и пара инструкций. Обычное I/O в другом месте.
                          Ответить
                          • лол, сколько же там пространств?
                            Ответить
                            • Там запутанно всё...

                              На мелких вроде было три -- флешка, память и I/O. Причём регистры видно как память.

                              На больших судя по всему растянули шину к памяти до 16 бит и добавили MMIO.
                              Ответить
                            • Кста, охуенно ведь кодить под платформу где 64 байта памяти и килобайт флешки.

                              Это вам не сраный ibm pc.
                              Ответить
                              • Приведи реальный пример зачем нужен например ATtiny13-20SU
                                Ответить
                                • можно светомузыку сделать для дискотеки
                                  Ответить
                                  • Возможно ли написать игру типа "тайны океана"?
                                    Ответить
                                    • > игру

                                      Там пинов не хватит, придётся внешние микрухи вешать для кнопок и дисплея.
                                      Ответить
                                      • У него было так много татуировок, что я подумала: ну, точно генерал!
                                        Ответить
                                      • Можно ли сделать игру с одной кнопкой и одной лампочкой?
                                        Ответить
                                        • Lights Off на одну клетку
                                          Ответить
                                        • Нужно нажать кнопку в пределах Х миллисекунд после загорания лампочки, иначе тебя херачит током. Х постепенно в процессе игры уменьшается
                                          Ответить
                                          • Кстати, игру из кнопок и лампочек можно сделать вообще без процессора. Точнее говоря, можно собрать процессор на проводочках и пружинках.

                                            g "детская логическая машина ДЛМ"
                                            Ответить
                                      • а как на атари кодили? 6507 стоял.
                                        Ответить
                                • Терморегулятор какой-нибудь. У меня он паяльником управлял.
                                  Ответить
                                  • Хочу программировать паяльники
                                    Ответить
                                    • int main(void)
                                      {
                                          temperature = 250;
                                          while(true);
                                          return 0;
                                      }
                                      Ответить
                                    • И жениться на бабе с флюсом
                                      Ответить
                                      • Что такое "тепель-тапель"?
                                        Ответить
                                        • https://rus.stackexchange.com/questions/453196/%D0%A2%D0%B5%D0%BF%D0%B5%D0%BB%D1%8C-%D1%82%D0%B0%D0%BF%D0%B5%D0%BB%D1%8C-%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5-%D1%83%D0%BF%D0%BE%D1%82%D1%80%D0%B5%D0%B1%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5
                                          Ответить
                                          • Какой багор )))

                                            супрасинтаксическая заумь: при формальной, грамматической правильности конструкций, составленных из обычных слов, высокая степень неопределённости возникает на уровне референции — проще говоря, остается принципиально неясным, о чём идёт речь.

                                            Монада — это моноид в категории эндофункцторов
                                            Ответить
                                • Управлять вибратором.
                                  Ответить
                      • А адресное пространство раздельное?
                        Ответить
            • гарвард — кот и данные отдельно
              фон Нейман — вместе

              jit для фон Неймана как раз и возможен
              Ответить
            • Тем, более, как я понял, борманд советует jit-ить твои опкоды в опкоды реальной машины, на которой работает твоя говно-вм.

              Тут вообще никаких проблем
              Ответить
      • > PUSHA, POPA, всякие удобные ENTER, LEAVE, LOOP
        Говно. Сделай универсальные интсрукции, котторые это с указанным регистром проделывают
        Ответить
        • например?
          Ответить
          • ARM'ы видел? Отдельных инструкций для push, pop, call, ret и пр. нет, зато есть команды для записи/чтения с пост/преинкрементом, и для перехода BX REG. И ещё условия почти во все инструкции закодировать можно)

            Правда BL (а ля CALL) только в R14 пишет, и адрес разврата самому в стек пушить/попать надо.
            Ответить
            • > нет

              В thumb есть. Из-за более компактного кодирования пришлось пожертвовать универсальностью регистров.
              Ответить
            • И ещё условия почти во все инструкции закодировать
              я слышал это вырезали в x64
              Ответить
            • ну и это будет классическое risc наяривание
              ret = loadincrement %IP %SP

              и если ret можно закодировать одним байтом, то loadincrement это уже три байта, что будет медленее в софтварном исполнении.
              Ответить
    • https://imgur.com/a/i3Hs1a2
      Ответить
    • А вы спрашивали, куда пропал гейдев с гамнокода...
      Ответить
    • Портаните конпелятор тайпскрипта из соседних тредов под эту платформу.
      Ответить
      • Создай Issue на гитхабе, что платформа не поддерживается.
        Ответить
      • кстати уже появились какие нибудь альтернативы старому доброму LCC? ибо его под Windows сейчас скомпилировать задачка далеко не из простых
        Ответить
        • Шланг?
          Ответить
          • llvm насколько я знаю компилировать по полтора часа надо. это на хорошем железе.
            в отличии от little c compiler
            Ответить
            • Дык ты же не будешь его с нуля собирать каждый раз. Его пока на раст не перевели.
              Ответить
              • а растишка не умеет в инкременталку?
                Ответить
                • Х.з., я не слежу.

                  У них там была квантовая неопределённость и прога иногда собиралась неправильно. Из-за этого отключали. Возможно, что уже пофиксили.
                  Ответить
                  • Братишка, я тебе растишку принёс!
                    Ответить
                  • Криво написанный Makefile или build.gradle тоже таким страдает, сам несколько раз обсырался.

                    В нашем проекте, к болью вынужден я признать, делать полный клин и ребилд приходится раз в неделю
                    Ответить
                    • Они на гораздо более сложную задачу замахнулись, чтобы не на уровне файлов а прям на уровне классов и функций инкрементальность сделать.

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

                        Я не знаю как в растишке, но по идее если ты можешь построить граф зависимостей, то проблем быть не должно. Или там в одном файле может быть 100500 классов?
                        Ответить
                        • Никак нет! Мы в мавене не пытаемся сделать инкрементальность вообще!
                          Ответить
            • собираю llvm уже 9 часов
              Ответить
              • На чём?
                Ответить
              • Ну как, собрал?
                Ответить
                • Меня зовут Тазрет, мне двадцать семь лет
                  Ответить
                • рыдал, страдал, гнил в агонии, но собрать не собрал.
                  Ответить
              • tcc можно сразу из сорцов сконпелировать и запустить. Именно поэтому я за tcc.
                Ответить
                • А скрипты на php можно сразу из сорцов запустить. Именно поэтому я за php.
                  Ответить
                  • Говно, _phpcache_ не создает.
                    Ответить
                  • а у питона тоже есть пепременная окружения чтобы не пукать пук файлами.
                    Просто тогда придется парсить и копулировать каждый раз при запуске
                    Ответить
                • tcc кто-то кроме его создателя может ретаргетировать?
                  Ответить
    • https://ic.pics.livejournal.com/akim_trefilov/19190766/543775/543775_600.jpg
      Ответить
    • https://twitter.com/GergelyOrosz/status/1493536142922235904
      Ответить

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