mirror of
https://github.com/pnx/m16vm
synced 2026-07-04 11:43:40 +02:00
src/vm.c: use program.h
This commit is contained in:
parent
fe8804c8d8
commit
817642b7e4
2 changed files with 9 additions and 49 deletions
2
Makefile
2
Makefile
|
|
@ -5,7 +5,7 @@ LD = $(CC)
|
||||||
|
|
||||||
VM = m16vm
|
VM = m16vm
|
||||||
|
|
||||||
$(VM) : src/vm.o src/cpu.o src/mm.o src/instr.o src/syscall.o
|
$(VM) : src/vm.o src/cpu.o src/mm.o src/instr.o src/syscall.o src/program.o
|
||||||
$(LD) $(LDFLAGS)-o $@ $^
|
$(LD) $(LDFLAGS)-o $@ $^
|
||||||
|
|
||||||
clean :
|
clean :
|
||||||
|
|
|
||||||
56
src/vm.c
56
src/vm.c
|
|
@ -17,38 +17,11 @@
|
||||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||||
* MA 02110-1301, USA.
|
* MA 02110-1301, USA.
|
||||||
*/
|
*/
|
||||||
#include <stdlib.h>
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include "program.h"
|
||||||
#include <sys/types.h>
|
|
||||||
#include <sys/stat.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include <errno.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include "mm.h"
|
#include "mm.h"
|
||||||
#include "cpu.h"
|
#include "cpu.h"
|
||||||
|
|
||||||
struct cpu_state state;
|
|
||||||
|
|
||||||
// Load program from file
|
|
||||||
unsigned long load_program(int fd, unsigned char **buf) {
|
|
||||||
|
|
||||||
struct stat st;
|
|
||||||
ssize_t rc;
|
|
||||||
|
|
||||||
if (fstat(fd, &st) < 0)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
*buf = malloc(st.st_size);
|
|
||||||
if (*buf == NULL)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
rc = read(fd, *buf, st.st_size);
|
|
||||||
if (rc < 0)
|
|
||||||
free(*buf);
|
|
||||||
return rc;
|
|
||||||
}
|
|
||||||
|
|
||||||
void print_memory() {
|
void print_memory() {
|
||||||
|
|
||||||
int i = 0;
|
int i = 0;
|
||||||
|
|
@ -73,14 +46,15 @@ void print_regs(uint16_t *regs) {
|
||||||
printf("\n");
|
printf("\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
void run(unsigned char *instr_ptr, unsigned instr_len) {
|
void run(struct program *prog) {
|
||||||
|
|
||||||
|
struct cpu_state state;
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
mm_init();
|
mm_init();
|
||||||
cpu_init(&state);
|
cpu_init(&state);
|
||||||
|
|
||||||
cpu_instr_load(&state, instr_ptr, instr_len);
|
cpu_instr_load(&state, prog->instr, prog->len);
|
||||||
|
|
||||||
do {
|
do {
|
||||||
rc = cpu_tick(&state);
|
rc = cpu_tick(&state);
|
||||||
|
|
@ -95,34 +69,20 @@ void run(unsigned char *instr_ptr, unsigned instr_len) {
|
||||||
|
|
||||||
int main(int argc, char **argv) {
|
int main(int argc, char **argv) {
|
||||||
|
|
||||||
int rc;
|
struct program prog = { 0 };
|
||||||
int fd;
|
|
||||||
unsigned char *instr_ptr;
|
|
||||||
unsigned instr_len;
|
|
||||||
|
|
||||||
if (argc < 2) {
|
if (argc < 2) {
|
||||||
fprintf(stderr, "usage: %s <file>\n", argv[0]);
|
fprintf(stderr, "usage: %s <file>\n", argv[0]);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
fd = open(argv[1], O_RDONLY);
|
if (program_loadfromfile(&prog, argv[1]) < 0)
|
||||||
if (fd < 0) {
|
|
||||||
fprintf(stderr, "Could not open file %s: %s\n",
|
|
||||||
argv[1], strerror(errno));
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
instr_len = load_program(fd, &instr_ptr);
|
|
||||||
close(fd);
|
|
||||||
|
|
||||||
if (instr_len < 0)
|
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
// Execute the program.
|
// Execute the program.
|
||||||
run(instr_ptr, instr_len);
|
run(&prog);
|
||||||
|
|
||||||
if (instr_ptr)
|
program_free(&prog);
|
||||||
free(instr_ptr);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue