EMULATOR_PDP_11
STEPIC Учебный проект на 'С', эмулятор PDP_11 в стиле ООП
Loading...
Searching...
No Matches
pdp_11.c File Reference

Основная реализация эмулятора PDP-11. More...

#include "pdp_11/command/command.h"
#include "pdp_11/command/command_p.h"
#include "pdp_11/device_io/device_io.h"
#include "pdp_11/memory/mem.h"
#include "pdp_11/pdp_11_p.h"
#include "pdp_11/register/register.h"
#include "utils/logger/logger.h"
#include "utils/utils.h"
#include <assert.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
Include dependency graph for pdp_11.c:

Functions

pdp_11_tpdp_new ()
 Создает новый экземпляр структуры PDP-11.
 
void pdp_create (pdp_11_t *pdp)
 Инициализирует компоненты PDP-11 (память, устройства ввода-вывода, регистры, команды).
 
void pdp_destroy (pdp_11_t *pdp)
 Освобождает ресурсы, связанные с экземпляром PDP-11.
 
void b_write (pdp_11_t *pdp, address_byte_t addr, byte_t data)
 Записывает байт в память PDP-11.
 
byte_t b_read (pdp_11_t *pdp, address_byte_t addr)
 Читает байт из памяти PDP-11.
 
void w_write (pdp_11_t *pdp, address_word_t addr, word_t data)
 Записывает слово (16 бит) в память PDP-11.
 
word_t w_read (pdp_11_t *pdp, address_word_t addr)
 Читает слово (16 бит) из памяти PDP-11.
 
void pdp_load_data (pdp_11_t *pdp, byte_t *filename)
 Загружает данные в PDP-11 из файла или терминала.
 
void pdp_mem_dump (pdp_11_t *pdp, address_word_t addr, word_t size)
 Выводит дамп памяти в форматированном виде.
 
byte_tpdp_parse_filename (int argc, char **argv)
 Разбирает аргументы командной строки для поиска имени файла.
 
word_tdo_command (pdp_11_t *pdp, command_t **commands, const address_word_t addr)
 Выполняет одну машинную команду по указанному адресу.
 

Detailed Description

Основная реализация эмулятора PDP-11.

Function Documentation

◆ b_read()

byte_t b_read ( pdp_11_t pdp,
address_byte_t  addr 
)

Читает байт из памяти PDP-11.

Parameters
pdpУказатель на экземпляр PDP-11.
addrАдрес памяти для чтения.
Returns
Прочитанный байт.
93{
94 assert(__is_valid_address(addr));
95 return (byte_t) byte_read((struct mem_t *) pdp->memory, addr);
96}
byte_t byte_read(struct mem_t *, address_byte_t)
Definition mem.c:89
Definition mem_p.h:7
struct mem_t * memory
Definition pdp_11_p.h:5
unsigned char byte_t
Definition types.h:6
int __is_valid_address(const address_byte_t)
Definition utils.c:13
Here is the call graph for this function:
Here is the caller graph for this function:

◆ b_write()

void b_write ( pdp_11_t pdp,
address_byte_t  addr,
byte_t  data 
)

Записывает байт в память PDP-11.

Parameters
pdpУказатель на экземпляр PDP-11.
addrАдрес памяти для записи.
dataДанные (байт) для записи.
80{
81 assert(__is_valid_address(addr));
82 byte_write((struct mem_t *) pdp->memory, addr, data);
83}
void byte_write(struct mem_t *, address_byte_t, byte_t)
Definition mem.c:74
Here is the call graph for this function:
Here is the caller graph for this function:

◆ do_command()

word_t * do_command ( pdp_11_t pdp,
command_t **  commands,
const address_word_t  addr 
)

Выполняет одну машинную команду по указанному адресу.

Parameters
pdpУказатель на экземпляр PDP-11.
commandsСписок доступных команд.
addrАдрес команды для выполнения.
Returns
Указатель на обновленный Program Counter (PC).
191{
192 extern byte_t commands_list;
193 word_t * ptr_pc = pdp->PC;
194 *ptr_pc = addr;
195 word_t word_command;
196
197 byte_t flag = 0;
198 word_command = w_read(pdp, *ptr_pc);
199
200 for (int i = 1; i < commands_list; i++) {
201 if ((word_command & commands[i]->mask) == commands[i]->opcode) {
202 commands[i]->do_commands_command(
203 (struct pdp_11_t *) pdp, addr, word_command);
204 flag = 1;
205 break;
206 }
207 }
208
209 if (!flag) {
210 commands[0]->do_commands_command(
211 (struct pdp_11_t *) pdp, addr, word_command);
212 }
213
214 *ptr_pc += 2;
215 return ptr_pc;
216}
byte_t commands_list
Definition command.c:21
word_t w_read(pdp_11_t *pdp, address_word_t addr)
Читает слово (16 бит) из памяти PDP-11.
Definition pdp_11.c:118
void(* do_commands_command)(struct pdp_11_t *, address_word_t, word_t)
Definition command_p.h:9
Definition pdp_11_p.h:4
word_t * PC
Definition pdp_11_p.h:16
unsigned short int word_t
Definition types.h:7
Here is the call graph for this function:
Here is the caller graph for this function:

◆ pdp_create()

void pdp_create ( pdp_11_t pdp)

Инициализирует компоненты PDP-11 (память, устройства ввода-вывода, регистры, команды).

Parameters
pdpУказатель на экземпляр PDP-11.
38{
39 pdp->memory = (struct mem_t *) mem_new();
40 pdp->device_io = (struct dev_io_t *) dev_io_new();
41 pdp->regist = (struct reg_t *) register_new();
42 pdp->command = (struct command_t **) command_new();
43
44 assert(pdp->regist);
45 assert(pdp->memory);
46 assert(pdp->device_io);
47 assert(pdp->command);
48
49 mem_create(pdp->memory);
51 reg_create((struct pdp_11_t *) pdp, pdp->regist);
53}
struct command_t * command_new()
Definition command.c:24
void command_create(struct command_t **)
Definition command.c:32
void dev_io_create(struct dev_io_t *)
Definition device_io.c:19
struct dev_io_t * dev_io_new()
Definition device_io.c:12
void mem_create(struct mem_t *)
Definition mem.c:18
struct mem_t * mem_new()
Definition mem.c:12
void reg_create(struct pdp_11_t *, struct reg_t *)
Definition register.c:16
struct reg_t * register_new()
Definition register.c:10
Definition command_p.h:5
Definition device_io_p.h:9
struct reg_t * regist
Definition pdp_11_p.h:7
struct dev_io_t * device_io
Definition pdp_11_p.h:6
struct command_t ** command
Definition pdp_11_p.h:8
Definition register_p.h:2
Here is the call graph for this function:
Here is the caller graph for this function:

◆ pdp_destroy()

void pdp_destroy ( pdp_11_t pdp)

Освобождает ресурсы, связанные с экземпляром PDP-11.

Parameters
pdpУказатель на экземпляр PDP-11 для уничтожения.
61{
62 mem_destroy((struct mem_t *) pdp->memory);
63 free(pdp->memory);
64 dev_io_destroy((struct dev_io_t *) pdp->device_io);
65 free(pdp->device_io);
66 reg_destroy((struct pdp_11_t *) pdp);
67 free(pdp->regist);
68 command_destroy((struct command_t **) pdp->command);
69 free(pdp->command);
70}
void command_destroy(struct command_t **)
Definition command.c:43
void dev_io_destroy(struct dev_io_t *)
Definition device_io.c:25
void mem_destroy(struct mem_t *)
Definition mem.c:34
void reg_destroy(struct pdp_11_t *)
Definition register.c:39
Here is the call graph for this function:
Here is the caller graph for this function:

◆ pdp_load_data()

void pdp_load_data ( pdp_11_t pdp,
byte_t filename 
)

Загружает данные в PDP-11 из файла или терминала.

Parameters
pdpУказатель на экземпляр PDP-11.
filenameПуть к файлу (если NULL, чтение из терминала).
131{
132 dev_io_load_data((struct pdp_11_t *) pdp,
133 (struct dev_io_t *) pdp->device_io,
134 (byte_t *) filename);
135}
void dev_io_load_data(struct pdp_11_t *, struct dev_io_t *, byte_t *)
Definition device_io.c:33
Here is the call graph for this function:
Here is the caller graph for this function:

◆ pdp_mem_dump()

void pdp_mem_dump ( pdp_11_t pdp,
address_word_t  addr,
word_t  size 
)

Выводит дамп памяти в форматированном виде.

Parameters
pdpУказатель на экземпляр PDP-11.
addrНачальный адрес.
sizeКоличество байт для вывода.
145{
146 dev_io_mem_dump((struct pdp_11_t *) pdp, addr, size);
147}
void dev_io_mem_dump(struct pdp_11_t *, address_word_t, word_t)
Definition device_io.c:43
Here is the call graph for this function:
Here is the caller graph for this function:

◆ pdp_new()

pdp_11_t * pdp_new ( )

Создает новый экземпляр структуры PDP-11.

Returns
Указатель на выделенную память для pdp_11_t.
27{
28 return (pdp_11_t *) malloc(sizeof(pdp_11_t));
29}
Here is the caller graph for this function:

◆ pdp_parse_filename()

byte_t * pdp_parse_filename ( int  argc,
char **  argv 
)

Разбирает аргументы командной строки для поиска имени файла.

Parameters
argcКоличество аргументов.
argvМассив строк аргументов.
Returns
Указатель на имя файла или 0, если файл не найден/не указан.
157{
158 if (1 == argc) {
159 usage((byte_t *) argv[0]);
160 return (byte_t *) 0;
161 }
162 if (2 == argc) {
163 if (!strcmp("-d", argv[1])) {
164 return (byte_t *) 0;
165 }
166 }
167 if (3 <= argc) {
168 for (int i = 0; i < argc; i++) {
169 if (!strcmp("-t", argv[i])) {
170 for (int j = (i + 1); j < argc; j++) {
171 if (strlen(argv[j]) > 4) {
172 return (byte_t *) argv[j];
173 }
174 }
175 }
176 }
177 }
178 assert(!argv[0]);
179 exit(1);
180}
void usage(const byte_t *progname)
Definition utils.c:24
Here is the call graph for this function:
Here is the caller graph for this function:

◆ w_read()

word_t w_read ( pdp_11_t pdp,
address_word_t  addr 
)

Читает слово (16 бит) из памяти PDP-11.

Parameters
pdpУказатель на экземпляр PDP-11.
addrАдрес памяти для чтения.
Returns
Прочитанное слово.
119{
120 assert(__is_valid_address(addr));
121 return (word_t) word_read((struct mem_t *) pdp->memory, addr);
122}
word_t word_read(struct mem_t *, address_word_t)
Definition mem.c:117
Here is the call graph for this function:
Here is the caller graph for this function:

◆ w_write()

void w_write ( pdp_11_t pdp,
address_word_t  addr,
word_t  data 
)

Записывает слово (16 бит) в память PDP-11.

Parameters
pdpУказатель на экземпляр PDP-11.
addrАдрес памяти для записи.
dataДанные (слово) для записи.
106{
107 assert(__is_valid_address(addr));
108 word_write((struct mem_t *) pdp->memory, addr, data);
109}
void word_write(struct mem_t *, address_word_t, word_t)
Definition mem.c:103
Here is the call graph for this function:
Here is the caller graph for this function: