Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- мысли:
- -ширина слова стека 16 бит, 8 бит переменные расширяются до 16 бит
- -переменные адресуются от базы фрейма, побайтово, то есть 16бит переменна по адресу BASE+1 ок
- -аргументы функции лежат перед фреймом (кусок стека вызывающей функции)
- -аргументы в стек ложатся начиная с последнего, позволит делать функции с переменным числом аргументов
- -если функция возвращает значение, перед аргументами нужно застолбить место для возвращаемого значения
- -вызываемая функция очищает свой фрейм (инкремент SP)
- -вызывающая функция чистит стек от аргументов
- да будет так:
- -TOP - слово на вершине стека
- -arg8 - 8 бит аргумент инструкции
- -arg16 - 16 бит агруемент инструкции
- -Var8 - *uint8_t - на фрейм
- -Var16 - *uint16_t - на фрейм
- -Mem8 - *uint8_t - память
- -Mem16 - *uint16_t - память
- -FnArg8 - *uint8_t - на аргументы функции, смещение в обратную сторону
- -FnArg16 - *uint16_t - на аргументы функции, смещение в обратную сторону
- ld_var:b - загрузить в стек 8 бит переменную, аргумент - номер переменной; push(signExt(Var8[arg8]), если отрицательное то FnArg8
- ld_var:w - загрузить в стек 16 бит переменную, аргумент - номер переменной; push(Var16[arg8])), если отрицательное то FnArg8
- st_var:b - сохранить из стека 8 бит в переменную, аргумент - номер переменной; Var8[arg8] = pop(), если отрицательное то FnArg8
- st_var:w - сохранить из стека 16 бит в переменную,аргумент - номер переменной; Var16[arg8] = pop(), если отрицательное то FnArg16
- ld_glob:b - загрузить по адресу на вершине стека заначение 8 бит, адрес извлекатеся из стека; push(Mem8[pop()])
- ld_glob:w - загрузить по адресу на вершине стека заначение 16 бит, адрес извлекатеся из стека; push(Mem16[pop()])
- st_glob:b - сохранить в памяти адресу TOP, 8 бит значение TOP[-2]; Mem8[pop()] = pop()
- st_glob:w - сохранить в памяти адресу TOP, 16 бит значение TOP[-2]; Mem16[pop()] = pop()
- const - загрузить константу в стек, аргумент - константа; push(arg8))
- dup - дублировать слово на вершине стека; push(TOP)
- ret - возврат из функции, очищает фрейм стека (аргумент - колво слов в фреме, SP+x)
- add - сложение, извлекает из стека пару аргументов, результат ложит в стек (SP+2)
- sub - вычитание, извлекает из стека пару аргументов, результат ложит в стек (SP+2)
- and - побитовое И, извлекает из стека пару аргументов, результат ложит в стек (SP+2)
- or - побитовое ИЛИ , извлекает из стека пару аргументов, результат ложит в стек (SP+2)
- xor - побитовое исключающее ИЛИ, извлекает из стека пару аргументов, результат ложит в стек (SP+2)
- shl - побитовый сдвиг влево, сдвигает аргумент на вершине стека влево
- shr - побитовый сдвиг влево, сдвигает аргумент на вершине стека вправо
- gt - если больше, извлекает из стека пару аргуметов, если TOP[-2] > TOP, ложит в стек 1 иначе 0
- ge - если больше, извлекает из стека пару аргуметов, если TOP[-2] >= TOP, ложит в стек 1 иначе 0
- eq - если больше, извлекает из стека пару аргуметов, если TOP[-2] == TOP, ложит в стек 1 иначе 0
- neq - если больше, извлекает из стека пару аргуметов, если TOP[-2] != TOP, ложит в стек 1 иначе 0
- jp_true - перейти если истина, извлекает TOP , совершает переход, если у аргумент не =0 (аругумент адрес перехода)
- jp_false - перейти если истина, извлекает TOP, совершает переход, если у аргумент =0 (аругумент адрес перехода)
- jp - безусловный переход
- call - вызов подпрограммы
- pop - удаляет из стека переданное в аргументе количество слов
- native - переход к нативной подпрограмме, выход jmp fetch
- */
- MACRO get_cop
- ld a,(de)
- inc de
- ENDM
- // de - указатель инструкций
- // sp - указатель стека данных
- // ix - указатель на начало фрейма стека, выше аргументы, ниже переменные
- ORG 0x100
- entry:
- jp fecth
- impl_section:
- //****************************************************************************************
- op_ld_var_b:
- //****************************************************************************************
- get_cop // получить аргумент, номер переменной в фрейме
- ld (patch01+2), a
- patch01:
- ld a,(IX + 0)
- ld l, a
- and a
- jp p, jmp01
- ld h, 0xff
- jr jmp02
- jmp01:
- ld h, 0x00
- jmp02:
- jr push_hl_fetch
- //****************************************************************************************
- op_ld_var_w:
- //****************************************************************************************
- get_cop // получить аргумент, номер переменной в фрейме
- ld (patch02+2), a
- inc a
- ld (patch03+2), a
- patch02:
- ld l,(IX + 0)
- patch03:
- ld h,(IX + 0)
- jr push_hl_fetch
- //****************************************************************************************
- op_st_var_b:
- //****************************************************************************************
- pop hl
- get_cop
- ld (path04+2), a
- path04:
- ld (IX + 0), l
- jr fecth
- //****************************************************************************************
- op_st_var_w:
- //****************************************************************************************
- pop hl
- get_cop
- ld (path05+2), a
- inc a
- ld (path06+2), a
- path05:
- ld (IX + 0), l
- path06:
- ld (IX + 0), h
- jr fecth
- //****************************************************************************************
- op_ld_glob_b:
- //****************************************************************************************
- pop hl
- ld l,(hl)
- ld h, 0
- jr push_hl_fetch
- //****************************************************************************************
- op_ld_glob_w:
- //****************************************************************************************
- pop hl
- ld c,(hl)
- inc hl
- ld b,(hl)
- jr push_hl_fetch
- //****************************************************************************************
- op_st_glob_b:
- //****************************************************************************************
- pop bc
- pop hl
- ld (hl),c
- jr fecth
- //****************************************************************************************
- op_st_glob_w:
- //****************************************************************************************
- pop bc
- pop hl
- ld (hl),c
- inc hl
- ld (hl),b
- jr fecth
- //****************************************************************************************
- op_const:
- //****************************************************************************************
- get_cop // получить мл. часть константы
- ld l, a
- get_cop // получить ст. часть константы
- ld h, a
- jr push_hl_fetch
- //****************************************************************************************
- op_dup:
- //****************************************************************************************
- pop hl
- push hl
- jr push_hl_fetch
- //****************************************************************************************
- op_ret:
- //****************************************************************************************
- get_cop
- ld b,a
- jmp03: // очищаем фрейм
- pop hl
- djnz jmp03
- ld e,(iy-1) // получаем адрес возврата
- ld d,(iy-2)
- dec iy
- dec iy
- jr fecth
- //****************************************************************************************
- op_add
- //****************************************************************************************
- pop bc
- pop hl
- add hl, bc
- jr push_hl_fetch
- //****************************************************************************************
- op_sub:
- //****************************************************************************************
- pop bc
- pop hl
- sub hl, bc
- jr push_hl_fetch
- //****************************************************************************************
- //****************************************************************************************
- //****************************************************************************************
- //****************************************************************************************
- push_hl_fetch:
- push hl
- fecth:
- get_cop
- ld h,high impl_section // мл. часть адреска является кодом операции
- ld l,a
- jp (hl)
- //****************************************************************************************
- //****************************************************************************************
- //****************************************************************************************
- //****************************************************************************************
- //****************************************************************************************
- op_and:
- //****************************************************************************************
- pop bc
- pop hl
- ld a,b
- and a,h
- ld h,a
- ld a,c
- and a,l
- ld l,a
- jr push_hl_fetch
- //****************************************************************************************
- op_or:
- //****************************************************************************************
- pop bc
- pop hl
- ld a,b
- or a,h
- ld h,a
- ld a,c
- or a,l
- ld l,a
- jr push_hl_fetch
- //****************************************************************************************
- op_xor:
- //****************************************************************************************
- pop bc
- pop hl
- ld a,b
- xor a,h
- ld h,a
- ld a,c
- xor a,l
- ld l,a
- jr push_hl_fetch
- //****************************************************************************************
- op_shl:
- //****************************************************************************************
- get_cop
- ld b,a
- pop hl
- jmp05:
- xor a
- rlc l
- rlc h
- djnz jmp05
- jr push_hl_fetch
- //****************************************************************************************
- op_shr:
- //****************************************************************************************
- get_cop
- ld b,a
- pop hl
- jmp06:
- xor a
- rrc h
- rrc l
- djnz jmp06
- jr push_hl_fetch
- //****************************************************************************************
- //****************************************************************************************
- //****************************************************************************************
- //****************************************************************************************
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement