Advertisement
Guest User

Untitled

a guest
Sep 6th, 2019
125
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.  
  2. /*
  3. мысли:
  4. -ширина слова стека 16 бит, 8 бит переменные расширяются до 16 бит
  5. -переменные адресуются от базы фрейма, побайтово, то есть 16бит переменна по адресу BASE+1 ок
  6. -аргументы функции лежат перед фреймом (кусок стека вызывающей функции)
  7. -аргументы в стек ложатся начиная с последнего, позволит делать функции с переменным числом аргументов
  8. -если функция возвращает значение, перед аргументами нужно застолбить место для возвращаемого значения
  9. -вызываемая функция очищает свой фрейм (инкремент SP)
  10. -вызывающая функция чистит стек от аргументов
  11.  
  12. да будет так:
  13. -TOP     - слово на вершине стека
  14. -arg8    - 8 бит аргумент инструкции
  15. -arg16   - 16 бит агруемент инструкции
  16. -Var8    - *uint8_t - на фрейм
  17. -Var16   - *uint16_t - на фрейм
  18. -Mem8    - *uint8_t - память
  19. -Mem16   - *uint16_t - память
  20. -FnArg8  - *uint8_t - на аргументы функции, смещение в обратную сторону
  21. -FnArg16 - *uint16_t - на аргументы функции, смещение в обратную сторону
  22.  
  23. ld_var:b    - загрузить в стек 8 бит переменную, аргумент - номер переменной; push(signExt(Var8[arg8]), если отрицательное то FnArg8
  24. ld_var:w    - загрузить в стек 16 бит переменную, аргумент - номер переменной; push(Var16[arg8])), если отрицательное то FnArg8
  25. st_var:b    - сохранить из стека 8 бит в переменную, аргумент - номер переменной; Var8[arg8] = pop(), если отрицательное то FnArg8
  26. st_var:w    - сохранить из стека 16 бит в переменную,аргумент - номер переменной; Var16[arg8] = pop(), если отрицательное то FnArg16
  27.  
  28. ld_glob:b   - загрузить по адресу на вершине стека заначение 8 бит, адрес извлекатеся из стека; push(Mem8[pop()])
  29. ld_glob:w   - загрузить по адресу на вершине стека заначение 16 бит, адрес извлекатеся из стека; push(Mem16[pop()])
  30. st_glob:b   - сохранить в памяти адресу TOP, 8 бит значение TOP[-2]; Mem8[pop()] = pop()
  31. st_glob:w   - сохранить в памяти адресу TOP, 16 бит значение TOP[-2]; Mem16[pop()] = pop()
  32.  
  33. const       - загрузить константу в стек, аргумент - константа; push(arg8))
  34. dup         - дублировать слово на вершине стека; push(TOP)
  35. ret         - возврат из функции, очищает фрейм стека (аргумент - колво слов в фреме, SP+x)
  36.  
  37.  
  38. add         - сложение, извлекает из стека пару аргументов, результат ложит в стек (SP+2)
  39. sub         - вычитание, извлекает из стека пару аргументов, результат ложит в стек (SP+2)
  40. and         - побитовое И, извлекает из стека пару аргументов, результат ложит в стек (SP+2)
  41. or          - побитовое ИЛИ , извлекает из стека пару аргументов, результат ложит в стек (SP+2)
  42. xor         - побитовое исключающее ИЛИ, извлекает из стека пару аргументов, результат ложит в стек (SP+2)
  43. shl         - побитовый сдвиг влево, сдвигает аргумент на вершине стека влево
  44. shr         - побитовый сдвиг влево, сдвигает аргумент на вершине стека вправо
  45.  
  46. gt          - если больше, извлекает из стека пару аргуметов, если TOP[-2] >  TOP, ложит в стек 1 иначе 0
  47. ge          - если больше, извлекает из стека пару аргуметов, если TOP[-2] >= TOP, ложит в стек 1 иначе 0
  48. eq          - если больше, извлекает из стека пару аргуметов, если TOP[-2] == TOP, ложит в стек 1 иначе 0
  49. neq         - если больше, извлекает из стека пару аргуметов, если TOP[-2] != TOP, ложит в стек 1 иначе 0
  50.  
  51. jp_true     - перейти если истина, извлекает TOP , совершает переход, если у аргумент не =0 (аругумент адрес перехода)
  52. jp_false    - перейти если истина, извлекает TOP, совершает переход, если у аргумент =0 (аругумент адрес перехода)
  53.  
  54. jp          - безусловный переход
  55. call        - вызов подпрограммы
  56. pop         - удаляет из стека переданное в аргументе количество слов
  57. native      - переход к нативной подпрограмме, выход jmp fetch
  58.  
  59. */
  60.  
  61.     MACRO get_cop
  62.         ld      a,(de)
  63.         inc     de  
  64.     ENDM
  65.  
  66. // de  - указатель инструкций
  67. // sp  - указатель стека данных
  68. // ix -  указатель на начало фрейма стека, выше аргументы, ниже переменные
  69.  
  70.     ORG 0x100
  71. entry:
  72.     jp      fecth
  73. impl_section:
  74.  
  75. //****************************************************************************************
  76. op_ld_var_b:    
  77. //****************************************************************************************
  78.     get_cop                     // получить аргумент, номер переменной в фрейме
  79.    
  80.     ld      (patch01+2), a
  81. patch01:
  82.     ld      a,(IX + 0)
  83.     ld      l, a
  84.  
  85.     and     a
  86.     jp      p, jmp01
  87.     ld      h, 0xff
  88.     jr      jmp02
  89. jmp01:
  90.     ld      h, 0x00
  91. jmp02:
  92.     jr      push_hl_fetch
  93.  
  94. //****************************************************************************************
  95. op_ld_var_w:
  96. //****************************************************************************************
  97.     get_cop                     // получить аргумент, номер переменной в фрейме
  98.     ld      (patch02+2), a
  99.     inc     a
  100.     ld      (patch03+2), a
  101. patch02:
  102.     ld      l,(IX + 0)
  103. patch03:
  104.     ld      h,(IX + 0)
  105.     jr      push_hl_fetch
  106.  
  107. //****************************************************************************************
  108. op_st_var_b:
  109. //****************************************************************************************
  110.     pop     hl
  111.     get_cop
  112.     ld      (path04+2), a
  113. path04:
  114.     ld      (IX + 0), l
  115.     jr      fecth
  116.  
  117. //****************************************************************************************
  118. op_st_var_w:
  119. //****************************************************************************************
  120.     pop     hl
  121.     get_cop
  122.     ld      (path05+2), a
  123.     inc     a
  124.     ld      (path06+2), a
  125. path05:
  126.     ld      (IX + 0), l
  127. path06:
  128.     ld      (IX + 0), h
  129.     jr      fecth
  130.  
  131.  
  132. //****************************************************************************************
  133. op_ld_glob_b:
  134. //****************************************************************************************
  135.     pop     hl
  136.     ld      l,(hl)
  137.     ld      h, 0
  138.     jr      push_hl_fetch
  139.  
  140. //****************************************************************************************
  141. op_ld_glob_w:
  142. //****************************************************************************************
  143.     pop     hl
  144.     ld      c,(hl)
  145.     inc     hl
  146.     ld      b,(hl)
  147.     jr      push_hl_fetch
  148.  
  149. //****************************************************************************************
  150. op_st_glob_b:
  151. //****************************************************************************************
  152.     pop     bc
  153.     pop     hl
  154.     ld      (hl),c
  155.     jr      fecth
  156.  
  157. //****************************************************************************************
  158. op_st_glob_w:
  159. //****************************************************************************************
  160.     pop     bc
  161.     pop     hl
  162.     ld      (hl),c
  163.     inc     hl
  164.     ld      (hl),b
  165.     jr      fecth
  166.  
  167. //****************************************************************************************
  168. op_const:
  169. //****************************************************************************************
  170.     get_cop                     // получить мл. часть константы
  171.     ld      l, a
  172.     get_cop                     // получить ст. часть константы
  173.     ld      h, a
  174.  
  175.     jr      push_hl_fetch
  176.  
  177. //****************************************************************************************
  178. op_dup:
  179. //****************************************************************************************
  180.     pop     hl
  181.     push    hl
  182.     jr      push_hl_fetch
  183.  
  184. //****************************************************************************************
  185. op_ret:
  186. //****************************************************************************************
  187.     get_cop
  188.     ld      b,a
  189. jmp03:                      // очищаем фрейм
  190.     pop     hl
  191.     djnz    jmp03
  192.    
  193.     ld      e,(iy-1)        // получаем адрес возврата
  194.     ld      d,(iy-2)
  195.     dec     iy
  196.     dec     iy
  197.  
  198.     jr      fecth
  199.  
  200. //****************************************************************************************
  201. op_add
  202. //****************************************************************************************
  203.     pop     bc
  204.     pop     hl
  205.     add     hl, bc
  206.     jr      push_hl_fetch
  207.  
  208. //****************************************************************************************
  209. op_sub:
  210. //****************************************************************************************
  211.     pop     bc
  212.     pop     hl
  213.     sub     hl, bc
  214.     jr      push_hl_fetch
  215.  
  216. //****************************************************************************************
  217. //****************************************************************************************
  218. //****************************************************************************************
  219. //****************************************************************************************
  220. push_hl_fetch:
  221.     push    hl
  222.  
  223. fecth:
  224.     get_cop
  225.  
  226.     ld      h,high impl_section // мл. часть адреска является кодом операции
  227.     ld      l,a
  228.  
  229.     jp      (hl)
  230. //****************************************************************************************
  231. //****************************************************************************************
  232. //****************************************************************************************
  233. //****************************************************************************************
  234.  
  235.  
  236. //****************************************************************************************
  237. op_and:
  238. //****************************************************************************************
  239.     pop     bc
  240.     pop     hl
  241.  
  242.     ld      a,b
  243.     and     a,h
  244.     ld      h,a
  245.  
  246.     ld      a,c
  247.     and     a,l
  248.     ld      l,a
  249.  
  250.     jr      push_hl_fetch
  251.  
  252. //****************************************************************************************
  253. op_or:
  254. //****************************************************************************************
  255.     pop     bc
  256.     pop     hl
  257.  
  258.     ld      a,b
  259.     or      a,h
  260.     ld      h,a
  261.  
  262.     ld      a,c
  263.     or      a,l
  264.     ld      l,a
  265.  
  266.     jr      push_hl_fetch
  267.  
  268. //****************************************************************************************
  269. op_xor:
  270. //****************************************************************************************
  271.     pop     bc
  272.     pop     hl
  273.  
  274.     ld      a,b
  275.     xor     a,h
  276.     ld      h,a
  277.  
  278.     ld      a,c
  279.     xor     a,l
  280.     ld      l,a
  281.  
  282.     jr      push_hl_fetch
  283.  
  284. //****************************************************************************************
  285. op_shl:
  286. //****************************************************************************************
  287.     get_cop
  288.     ld      b,a
  289.     pop     hl
  290. jmp05:
  291.     xor     a
  292.     rlc     l
  293.     rlc     h
  294.     djnz    jmp05
  295.  
  296.     jr      push_hl_fetch
  297.  
  298. //****************************************************************************************
  299. op_shr:
  300. //****************************************************************************************
  301. get_cop
  302.     ld      b,a
  303.     pop     hl
  304. jmp06:
  305.     xor     a
  306.     rrc     h
  307.     rrc     l
  308.     djnz    jmp06
  309.  
  310.     jr      push_hl_fetch
  311.  
  312. //****************************************************************************************
  313. //****************************************************************************************
  314.  
  315. //****************************************************************************************
  316. //****************************************************************************************
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement