Сборный / Говнокод #28011 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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 digitalEugene, (Updated )

Комментарии (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:
      Ответить
          • Что не мешало эмуляторам плойки гонять игры с самомодифицирующимся кодом...

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

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

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

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


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

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

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

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

                            Это вам не сраный ibm pc.
                            Ответить
          • гарвард — кот и данные отдельно
            фон Нейман — вместе

            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 это уже три байта, что будет медленее в софтварном исполнении.
            Ответить
  • Портаните конпелятор тайпскрипта из соседних тредов под эту платформу.
    Ответить
    • кстати уже появились какие нибудь альтернативы старому доброму LCC? ибо его под Windows сейчас скомпилировать задачка далеко не из простых
      Ответить
        • llvm насколько я знаю компилировать по полтора часа надо. это на хорошем железе.
          в отличии от little c compiler
          Ответить
          • Дык ты же не будешь его с нуля собирать каждый раз. Его пока на раст не перевели.
            Ответить
            • а растишка не умеет в инкременталку?
              Ответить
              • Х.з., я не слежу.

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

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

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

                      Я не знаю как в растишке, но по идее если ты можешь построить граф зависимостей, то проблем быть не должно. Или там в одном файле может быть 100500 классов?
                      Ответить
                      • Никак нет! Мы в мавене не пытаемся сделать инкрементальность вообще!
                        Ответить
            • tcc можно сразу из сорцов сконпелировать и запустить. Именно поэтому я за tcc.
              Ответить
              • А скрипты на php можно сразу из сорцов запустить. Именно поэтому я за php.
                Ответить
                • а у питона тоже есть пепременная окружения чтобы не пукать пук файлами.
                  Просто тогда придется парсить и копулировать каждый раз при запуске
                  Ответить

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

Где здесь C++, guest?!

    А не использовать ли нам bbcode?


    8