пошаговая симуляция сложных автоматов
Moderator: Shaos
-
- Admin
- Posts: 24097
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
пошаговая симуляция сложных автоматов
решил я наш гипотетический недосимулятр начать пилить снизу - от программирования, поэтому создал отдельный топик, т.к. тут про таскание блочков мышкой и рисование осцыллограммок небудет ничего - лишь голимое сишное программирование в режиме pedantic, причём с возможностью собирать код старыми-добрыми 16-битными компиляторами...
Last edited by Shaos on 01 Sep 2012 07:19, edited 1 time in total.
Я тут за главного - если что шлите мыло на me собака shaos точка net
-
- Admin
- Posts: 24097
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
начну пожалуй с фреймворка для написания микропроцессоров, над которым будет построен 8080 (и 8085), далее 6502, а потом и всякие пики подтянутся
для начала максимально абстрагируемся от конкретных микропроцессоров - представим, что у нас есть некий API по доступу к 8-битной памяти, адресуемой 16-битным адресом, причём у памяти есть "слои" (например для 8080 слой 0 может обозначать память, а слой 1 - порты ввода-вывода)
в общем случае "машин" в программе может быть создано много - коллбеки могут их различать по указателю на активную машину
nedomachine_new создаёт новую машину с указанием размера данных, под которые также должна быть аллоцирована память, а также указателей на читающую и пишущую функции для доступа к памяти, позже добавил функцию обработки ошибок (может быть NULL)
nedomachine_operation добавляет функцию-обработчик инструкции процессора с кодом opcode
nedomachine_step производит один шаг симуляции за который будет выполнена одна команда либо один такт процессора (зависит от конкретной реализации исполняющих коллбеков)
nedomachine_destroy освобождает память удаляя ранее созданный объект
в момент когда нужно обработать команду (внутри nedomachine_step), машина увеличит текущий адрес на единицу и вызовет коллбек-функцию с индексом, соответствующим ранее прочитанной команде (функция типа NEDOFUN_EX)
P.S. 26 августа добавил сигнатуру, коллбек для обработки ошибок и переименовал некоторые функции вернув обратно понятие шага эмуляции step
P.P.S. 27 августа понял, что в этом фреймворке можно не только процессоры эмулить, но и произвольные микрокодовые конструкции, причём как с автоматическим инкрементом адреса, так и без...
для начала максимально абстрагируемся от конкретных микропроцессоров - представим, что у нас есть некий API по доступу к 8-битной памяти, адресуемой 16-битным адресом, причём у памяти есть "слои" (например для 8080 слой 0 может обозначать память, а слой 1 - порты ввода-вывода)
Code: Select all
typedef char NEDOSIGNAL; /* suggested values 'H','L','Z' */
typedef unsigned char NEDOBYTE;
typedef unsigned short NEDOWORD;
typedef unsigned long NEDODWORD;
typedef NEDOBYTE (*NEDOFUN_RD)(void*,int,NEDOWORD); /* read callback */
typedef void (*NEDOFUN_WR)(void*,int,NEDOWORD,NEDOBYTE); /* write callback */
typedef void (*NEDOFUN_ER)(void*,char*); /* error callback */
typedef int (*NEDOFUN_EX)(void*,NEDOBYTE); /* execution callback returns number of cycles to simulate */
#define NEDOMACHINE_SIGN "NEDOMAC"
typedef struct _NEDOMACHINE
{
char sign[8]; /* signature "NEDOMAC",\0 */
NEDOWORD addr; /* current address */
NEDOFUN_RD rfun; /* pointer to read function */
NEDOFUN_WR wfun; /* pointer to write function */
NEDOFUN_ER efun; /* pointer to error function */
NEDOFUN_EX xfun[256]; /* 256 pointers to execution functions */
NEDOBYTE data[1]; /* custom data of any size */
} NEDOMACHINE;
NEDOMACHINE* nedomachine_new(int datasz, NEDOFUN_RD rfun, NEDOFUN_WR wfun, NEDOFUN_ER efun);
void nedomachine_operation(NEDOMACHINE *m, NEDOBYTE opcode, NEDOFUN_EX xfun);
void nedomachine_step(NEDOMACHINE *m);
void nedomachine_destroy(NEDOMACHINE *m);
nedomachine_new создаёт новую машину с указанием размера данных, под которые также должна быть аллоцирована память, а также указателей на читающую и пишущую функции для доступа к памяти, позже добавил функцию обработки ошибок (может быть NULL)
nedomachine_operation добавляет функцию-обработчик инструкции процессора с кодом opcode
nedomachine_step производит один шаг симуляции за который будет выполнена одна команда либо один такт процессора (зависит от конкретной реализации исполняющих коллбеков)
nedomachine_destroy освобождает память удаляя ранее созданный объект
в момент когда нужно обработать команду (внутри nedomachine_step), машина увеличит текущий адрес на единицу и вызовет коллбек-функцию с индексом, соответствующим ранее прочитанной команде (функция типа NEDOFUN_EX)
P.S. 26 августа добавил сигнатуру, коллбек для обработки ошибок и переименовал некоторые функции вернув обратно понятие шага эмуляции step
P.P.S. 27 августа понял, что в этом фреймворке можно не только процессоры эмулить, но и произвольные микрокодовые конструкции, причём как с автоматическим инкрементом адреса, так и без...
Я тут за главного - если что шлите мыло на me собака shaos точка net