Advertisement
szymski

Untitled

Dec 19th, 2015
144
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. %include "vm.inc"
  2. %define TABLE 0xb000
  3.  
  4. ; Wypisz dane, znak po znaku.
  5.  
  6. vset r5, hello_str
  7. vpush r5
  8. vcall print_str
  9.  
  10. vset r5, code
  11. vpush r5
  12. vcall print_str
  13. vset r2, 0xa
  14. voutb 0x20, r2 ; Nowa linia
  15.  
  16.  
  17. vjmp start
  18.  
  19.  
  20.  
  21. print_str:
  22.     vset r3, 4
  23.     vadd sp, r3
  24.     vpop r4
  25.     vsub sp, r3
  26.     vsub sp, r3
  27.  
  28.     vxor r0, r0
  29.     vset r1, 1
  30.  
  31. print_str_loop:
  32.     ; Pobierz bajt spod adresu z R0.
  33.     vldb r2, r4
  34.  
  35.     ; Jesli to zero, wyjdź z pętli.
  36.     vcmp r2, r0
  37.     vjz print_str_end
  38.  
  39.     ; W przeciwym wypadku, wypisz znak na konsoli.
  40.     voutb 0x20, r2
  41.  
  42.     ; Przesuń r4 na kolejny znak i idź na początek pętli.
  43.     vadd r4, r1
  44.     vjmp print_str_loop
  45.  
  46. print_str_end:
  47.     vret
  48.  
  49.  
  50.  
  51.  
  52.  
  53.  
  54. start:
  55.     vxor r0, r0 ; Wyzeruj rejestr r0
  56.     vset r1, 1 ; Ustaw wartosc r1 na 1
  57.     vset r10, code ; Wskaznik na kod programu brainfuck
  58.     vset r11, TABLE ; Wskaznik na tablice z wartosciami
  59.  
  60. interpret:
  61.     vldb r2, r10 ; Zaladuj znak z kodu programu
  62.  
  63.     ; Jesli zero, wyjdz
  64.     vcmp r2, r0
  65.     vjz end
  66.  
  67.     ; Jesli +
  68.     vset r3, '+'
  69.     vcmp r2, r3
  70.     vje interpret_add
  71.  
  72.     ; Jesli -
  73.     vset r3, '-'
  74.     vcmp r2, r3
  75.     vje interpret_sub
  76.  
  77.     ; Jesli >
  78.     vset r3, '>'
  79.     vcmp r2, r3
  80.     vje interpret_mover
  81.  
  82.     ; Jesli <
  83.     vset r3, '<'
  84.     vcmp r2, r3
  85.     vje interpret_movel
  86.  
  87.     ; Jesli [
  88.     vset r3, '['
  89.     vcmp r2, r3
  90.     vje interpret_loop_start
  91.  
  92.     ; Jesli ]
  93.     vset r3, ']'
  94.     vcmp r2, r3
  95.     vje interpret_loop_end
  96.  
  97.     ; Jesli .
  98.     vset r3, '.'
  99.     vcmp r2, r3
  100.     vje interpret_print
  101.  
  102.  
  103. interpret_add:
  104.     vldb r4, r11 ; Wczytaj wartosc z tablicy
  105.     vadd r4, r1 ; Dodaj 1
  106.     vstb r11, r4 ; Zapisz wartosc
  107.     vjmp next
  108.  
  109. interpret_sub:
  110.     vldb r4, r11 ; Wczytaj wartosc z tablicy
  111.     vsub r4, r1 ; Odejmij 1
  112.     vstb r11, r4 ; Zapisz wartosc
  113.     vjmp next
  114.  
  115. interpret_mover:
  116.     vadd r11, r1
  117.     vjmp next
  118.  
  119. interpret_movel:
  120.     vsub r11, r1
  121.     vjmp next
  122.  
  123. interpret_loop_start:
  124.     vmov r5, r10
  125.     ; vadd r5, r1
  126.     vpush r5 ; Zapisz miejsce startu kodu w petli na stosie
  127.     vjmp next
  128.  
  129. interpret_loop_end:
  130.     vldb r4, r11 ; Wczytaj wartosc z tablicy
  131.     vcmp r4, r0
  132.     vjg interpret_loop_end_do ; Skocz do zmiany adresu
  133.     vpop r5
  134.     vjmp next
  135. interpret_loop_end_do:
  136.     vpop r5
  137.     vpush r5
  138.     vmov r10, r5
  139.     vjmp next
  140.  
  141. interpret_print:
  142.     vldb r4, r11 ; Wczytaj wartosc z tablicy
  143.     voutb 0x20, r4 ; Wypisz na ekranie
  144.     vjmp next
  145.  
  146.  
  147. next:
  148.     vadd r10, r1 ; Przejdz do nastepnego znaku
  149.     vjmp interpret
  150. end:
  151.     voff
  152.  
  153.  
  154.  
  155.  
  156.  
  157.  
  158.  
  159.  
  160.  
  161.  
  162. hello_str:
  163.     db "Brainfuck interpreter", 0xa, 0
  164.  
  165. code:
  166.     ;db "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.+.-.", 0
  167.     ;db "", 0
  168.     ;db "++++++++++[>+++++++++<-]>+++++++.", 0
  169.     db "++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.", 0
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement