/BareMetal v0.5.2 Source/programs/bf.asm

https://github.com/willscott/Porcupine · Assembly · 115 lines · 93 code · 15 blank · 7 comment · 0 complexity · 5b72a3fa8df9074a2742bfff551b9685 MD5 · raw file

  1. ; =============================================================================
  2. ; Brainf*ck -- A 64-bit Brainf*ck interpreter
  3. ; Copyright (C) 2008-2011 Return Infinity -- see LICENSE.TXT
  4. ;
  5. ; http://en.wikipedia.org/wiki/Brainfuck
  6. ; =============================================================================
  7. [BITS 64]
  8. [ORG 0x0000000000200000]
  9. %INCLUDE "bmdev.asm"
  10. bf_start:
  11. ; clear memory here
  12. bf_run:
  13. mov rsi, [codepointer]
  14. lodsb
  15. add qword [codepointer], 1
  16. cmp al, '>'
  17. je incptr
  18. cmp al, '<'
  19. je decptr
  20. cmp al, '+'
  21. je incdata
  22. cmp al, '-'
  23. je decdata
  24. cmp al, '.'
  25. je outchar
  26. cmp al, ','
  27. je inchar
  28. cmp al, '['
  29. je startloop
  30. cmp al, ']'
  31. je endloop
  32. ret
  33. incptr:
  34. add qword [datapointer], 8
  35. jmp bf_run
  36. decptr:
  37. sub qword [datapointer], 8
  38. jmp bf_run
  39. incdata:
  40. mov rax, [datapointer]
  41. mov rsi, rax
  42. mov rdi, rax
  43. lodsq
  44. add rax, 1
  45. stosq
  46. jmp bf_run
  47. decdata:
  48. mov rax, [datapointer]
  49. mov rsi, rax
  50. mov rdi, rax
  51. lodsq
  52. sub rax, 1
  53. stosq
  54. jmp bf_run
  55. outchar:
  56. mov rsi, [datapointer]
  57. lodsq
  58. call b_print_char
  59. jmp bf_run
  60. inchar:
  61. mov rdi, [datapointer]
  62. xor rax, rax
  63. call b_input_key_wait
  64. stosq
  65. jmp bf_run
  66. startloop:
  67. mov rsi, [datapointer]
  68. lodsq
  69. cmp rax, 0
  70. jne bf_run
  71. mov rsi, [codepointer]
  72. startloop_next:
  73. lodsb
  74. cmp al, ']'
  75. jne startloop_next
  76. mov qword [codepointer], rsi
  77. jmp bf_run
  78. endloop:
  79. xchg bx, bx
  80. mov rsi, [datapointer]
  81. lodsq
  82. cmp rax, 0
  83. je bf_run
  84. mov rsi, [codepointer]
  85. std
  86. endloop_next:
  87. lodsb
  88. cmp al, '['
  89. jne endloop_next
  90. add rsi, 1
  91. mov qword [codepointer], rsi
  92. cld
  93. jmp bf_run
  94. align 16
  95. datapointer: dq data
  96. codepointer: dq code
  97. code:
  98. db '>+++++++++[<++++++++>-]<.>+++++++[<++++>-]<+.+++++++..+++.>>>++++++++[<++++>-]<.>>>++++++++++[<+++++++++>-]<---.<<<<.+++.------.--------.>>+.', 0
  99. align 16
  100. data: