Compare commits
5 Commits
7b6b3f73cd
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
| ddff443183 | |||
| 99512fa611 | |||
| 89608dcb22 | |||
| 0707a981e1 | |||
| 9a3399a975 |
22
LICENSE
22
LICENSE
@ -1,14 +1,10 @@
|
|||||||
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
|
Permission to use, copy, modify, and/or distribute this software for
|
||||||
Version 2, December 2004
|
any purpose with or without fee is hereby granted.
|
||||||
|
|
||||||
Copyright (C) 2004 Sam Hocevar <sam@hocevar.net>
|
|
||||||
|
|
||||||
Everyone is permitted to copy and distribute verbatim or modified
|
|
||||||
copies of this license document, and changing it is allowed as long
|
|
||||||
as the name is changed.
|
|
||||||
|
|
||||||
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
|
|
||||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
|
||||||
|
|
||||||
0. You just DO WHAT THE FUCK YOU WANT TO.
|
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED “AS IS” AND THE AUTHOR DISCLAIMS ALL
|
||||||
|
WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
|
||||||
|
OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE
|
||||||
|
FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY
|
||||||
|
DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
|
||||||
|
AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
|
||||||
|
OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
|||||||
54
README.md
54
README.md
@ -0,0 +1,54 @@
|
|||||||
|
# DP32-proto
|
||||||
|
|
||||||
|
Прототип эмулятора процессора DP32
|
||||||
|
|
||||||
|
## Описание
|
||||||
|
|
||||||
|
Это проект программной эмуляции и отладки процессора DP32 на языке python. В этом проекте можно найти 2 компонента - отладчик dp32dbg и эмулятор dp32emu. Первый полностью опирается на отладочную информацию в следующем формате. Это очень простой отладчик и очень нестабильный, поскольку писался с упором на скорость, а не на качество.
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"src": "absolute/path/to/source"
|
||||||
|
"labels" : {
|
||||||
|
"label1": 1
|
||||||
|
"label2": 2
|
||||||
|
...
|
||||||
|
},
|
||||||
|
"instructions" : {
|
||||||
|
"<offset-in-words>" : {
|
||||||
|
"lenght": 2,
|
||||||
|
"srcline": 3
|
||||||
|
}
|
||||||
|
...
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Установка
|
||||||
|
|
||||||
|
Стяните данный репозиторий и выполните в корне проекта команду `pip install .`
|
||||||
|
|
||||||
|
## Использование
|
||||||
|
|
||||||
|
После установки у вас появятся 2 программы:
|
||||||
|
|
||||||
|
- dp32emu - программный эмулятор процессора dp32. Принимает на вход бинарный файл с командами dp32, выполняет их и в результате своей работы выдает дамп памяти процессора после завершения работы
|
||||||
|
- dp32dbg - отладчик, опирающийся на вышеуказанный эмулятор. Позволяет выполнять действия пошаговой отладки и предоставляет базовую функциональность точек останова (но с ньюансами)
|
||||||
|
|
||||||
|
Посмотреть инструкцию по запуску проще всего передав флаг `-h` каждой из этих программ
|
||||||
|
|
||||||
|
## Использование отладчика
|
||||||
|
|
||||||
|
help не встроен в отладчик, поскольку до этого его функционал не был документирован. Приведу здесь основной набор команд отладчика
|
||||||
|
|
||||||
|
- `step/s` - выполняет одну инструкцию, на которую сейчас указывает регистр pc виртуальной машины
|
||||||
|
- `breakpoint <lineno>` - устанавливает точку останова на определенной строке исходного кода. С точками останова 2 ньюанса:
|
||||||
|
1. Они они не могут быть установлены на комментарии или пустые строки. Если на строке больше одной операции, точка будет установлена на самую раннюю
|
||||||
|
2. Когда виртуальная машина встретит точку останова, временно она не сможет выполнять команду continue, поскольку не предусмотрено ротации точек останова. Если нужно продолжить выполнение программы дальше - выполните одну команду step
|
||||||
|
- `continue/c` - выполняет программу до ближайшей точки останова
|
||||||
|
- `reset` - сбрасывает состояние виртуальной машины и ее память, но не точки останова
|
||||||
|
- `run` - сбрасывает состояние виртуальной машины и запускает выполнение кода
|
||||||
|
- `cbp` - очищает все точки останова
|
||||||
|
- `print/p <reg>` - печатает содержимое регистров. Регистры записываются в формате `r1-r255`, позволяет также посмотреть адреса меток (указав название меток в качестве параметра) и системные регистры: pc, cc
|
||||||
|
- `inspect/i <size> <amount> <place>` - печатает содержимое памяти по определенному адресу в определенном формате (строчная - знаковые, заглавная - беззнаковые): b/B - байт, h/H - полуслова - 16 бит, w/W - слова - 32 бита. `amount` - количество подряд идущих ячеек, содержимое которых нужно прочитать. `place` - место, с которого следует начать печать. Можеть представлять собой либо имя метки, либо полный адрес в десятичной или 16-ричной системе счисления
|
||||||
|
|
||||||
|
|||||||
@ -1,3 +1,4 @@
|
|||||||
# почему так грязно?
|
# Почему такая некрасивая структура
|
||||||
|
|
||||||
|
Этот репозиторий нужен был для того, чтобы отладить программу для процессора DP32. Структура проекта сделана такой для того, чтобы сократить время, необходимое на структуризацию и разрешение зависимостей.
|
||||||
|
|
||||||
Потому что я заколебался воевать с модульностью питона, чтобы сделать это красиво
|
|
||||||
|
|||||||
98
src/dp32proto/dbg.json
Normal file
98
src/dp32proto/dbg.json
Normal file
@ -0,0 +1,98 @@
|
|||||||
|
{
|
||||||
|
"labels": {
|
||||||
|
"_start": 0,
|
||||||
|
"_start_return": 9,
|
||||||
|
"f_fibo": 11,
|
||||||
|
"f_fibo_loop": 14,
|
||||||
|
"return": 27,
|
||||||
|
"result": 28,
|
||||||
|
"end": 29
|
||||||
|
},
|
||||||
|
"instructions": {
|
||||||
|
"0": {
|
||||||
|
"length": 1,
|
||||||
|
"srcline": 6
|
||||||
|
},
|
||||||
|
"1": {
|
||||||
|
"length": 1,
|
||||||
|
"srcline": 7
|
||||||
|
},
|
||||||
|
"2": {
|
||||||
|
"length": 2,
|
||||||
|
"srcline": 8
|
||||||
|
},
|
||||||
|
"4": {
|
||||||
|
"length": 2,
|
||||||
|
"srcline": 9
|
||||||
|
},
|
||||||
|
"6": {
|
||||||
|
"length": 2,
|
||||||
|
"srcline": 10
|
||||||
|
},
|
||||||
|
"8": {
|
||||||
|
"length": 1,
|
||||||
|
"srcline": 11
|
||||||
|
},
|
||||||
|
"9": {
|
||||||
|
"length": 2,
|
||||||
|
"srcline": 13
|
||||||
|
},
|
||||||
|
"11": {
|
||||||
|
"length": 1,
|
||||||
|
"srcline": 16
|
||||||
|
},
|
||||||
|
"12": {
|
||||||
|
"length": 1,
|
||||||
|
"srcline": 17
|
||||||
|
},
|
||||||
|
"13": {
|
||||||
|
"length": 1,
|
||||||
|
"srcline": 18
|
||||||
|
},
|
||||||
|
"14": {
|
||||||
|
"length": 1,
|
||||||
|
"srcline": 20
|
||||||
|
},
|
||||||
|
"15": {
|
||||||
|
"length": 1,
|
||||||
|
"srcline": 21
|
||||||
|
},
|
||||||
|
"16": {
|
||||||
|
"length": 1,
|
||||||
|
"srcline": 22
|
||||||
|
},
|
||||||
|
"17": {
|
||||||
|
"length": 1,
|
||||||
|
"srcline": 23
|
||||||
|
},
|
||||||
|
"18": {
|
||||||
|
"length": 1,
|
||||||
|
"srcline": 24
|
||||||
|
},
|
||||||
|
"19": {
|
||||||
|
"length": 2,
|
||||||
|
"srcline": 25
|
||||||
|
},
|
||||||
|
"21": {
|
||||||
|
"length": 2,
|
||||||
|
"srcline": 27
|
||||||
|
},
|
||||||
|
"23": {
|
||||||
|
"length": 2,
|
||||||
|
"srcline": 28
|
||||||
|
},
|
||||||
|
"25": {
|
||||||
|
"length": 2,
|
||||||
|
"srcline": 29
|
||||||
|
},
|
||||||
|
"27": {
|
||||||
|
"length": 1,
|
||||||
|
"srcline": 31
|
||||||
|
},
|
||||||
|
"28": {
|
||||||
|
"length": 1,
|
||||||
|
"srcline": 32
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"src": "C:\\Users\\etdia\\code\\dp32-proto\\src\\test.dasm"
|
||||||
|
}
|
||||||
@ -51,7 +51,7 @@ def main():
|
|||||||
dbg_dict: DbgDict = parse_dbg(json.load(f))
|
dbg_dict: DbgDict = parse_dbg(json.load(f))
|
||||||
|
|
||||||
dbg = Debugger(mem, dbg_dict)
|
dbg = Debugger(mem, dbg_dict)
|
||||||
with open (dbg_dict["src"], 'r') as f:
|
with open (dbg_dict["src"], 'r', encoding="utf8") as f:
|
||||||
src = f.read()
|
src = f.read()
|
||||||
|
|
||||||
dbg_tui.run_tui(dbg, src)
|
dbg_tui.run_tui(dbg, src)
|
||||||
|
|||||||
@ -55,7 +55,7 @@ class Debugger:
|
|||||||
}
|
}
|
||||||
|
|
||||||
def __init__(self, mem: bytearray, dbg_dict: DbgDict):
|
def __init__(self, mem: bytearray, dbg_dict: DbgDict):
|
||||||
with open(dbg_dict["src"], 'r') as f:
|
with open(dbg_dict["src"], 'r', encoding="utf8") as f:
|
||||||
self._source_lines = f.readlines()
|
self._source_lines = f.readlines()
|
||||||
self._vm = VM(mem)
|
self._vm = VM(mem)
|
||||||
self._dbg_dict = dbg_dict
|
self._dbg_dict = dbg_dict
|
||||||
|
|||||||
Reference in New Issue
Block a user