blob: b4b05e7bb6dae337993022f9807415b8b0223cf6 [file] [log] [blame]
swissChili6c61a792020-07-28 16:29:20 -07001#include "cpu.h"
swissChili62d6d5d2020-07-30 20:12:47 -07002#include "dbg.h"
swissChilidbbd5402020-08-07 15:07:39 -07003#include "gui.h"
swissChili6c61a792020-07-28 16:29:20 -07004
swissChili62d6d5d2020-07-30 20:12:47 -07005#include <bits/getopt_core.h>
swissChili6c61a792020-07-28 16:29:20 -07006#include <ctype.h>
7#include <stdio.h>
8#include <stdlib.h>
9#include <unistd.h>
10
11int main(int argc, char **argv)
12{
swissChilida4803e2020-08-06 20:06:04 -070013 bool disflag = false,
14 runflag = false,
15 helpflag = false,
16 debugflag = false,
swissChilidbbd5402020-08-07 15:07:39 -070017 should_read = false,
18 guiflag = false;
swissChilida4803e2020-08-06 20:06:04 -070019
20 int disasm_len = 0;
swissChili62d6d5d2020-07-30 20:12:47 -070021
22 FILE *input = stdin;
swissChili6c61a792020-07-28 16:29:20 -070023
24 char c;
25
swissChilidbbd5402020-08-07 15:07:39 -070026 while ((c = getopt(argc, argv, "Ddrhgi:n:")) != -1)
swissChili6c61a792020-07-28 16:29:20 -070027 {
28 switch (c)
29 {
swissChili62d6d5d2020-07-30 20:12:47 -070030 case 'd':
31 disflag = true;
32 should_read = true;
33 break;
34 case 'r':
35 runflag = true;
36 should_read = true;
37 break;
38 case 'D':
39 debugflag = true;
40 should_read = true;
41 break;
swissChilidbbd5402020-08-07 15:07:39 -070042 case 'g':
43 guiflag = true;
44 should_read = true;
45 break;
swissChili62d6d5d2020-07-30 20:12:47 -070046 case 'i':
47 input = fopen(optarg, "r");
48 break;
swissChilida4803e2020-08-06 20:06:04 -070049 case 'n':
50 disasm_len = atoi(optarg);
51 break;
swissChili62d6d5d2020-07-30 20:12:47 -070052 case 'h':
53 case '?':
54 helpflag = 1;
55 break;
swissChili6c61a792020-07-28 16:29:20 -070056 }
57 }
58
59 if (helpflag)
60 {
swissChili62d6d5d2020-07-30 20:12:47 -070061 printf("6502 emulator, disassembler and debugger\n"
62 "Usage:\n"
63 " -d disassemble input\n"
64 " -r run input\n"
65 " -D debug input (open debug prompt)\n"
66 " -i <input> set input file, defaults to standard input\n"
swissChilida4803e2020-08-06 20:06:04 -070067 " -n <number> number of instructions to disassemble, 0 for all\n"
swissChili62d6d5d2020-07-30 20:12:47 -070068 " -h, -? show this help page\n");
swissChili6c61a792020-07-28 16:29:20 -070069 return 0;
70 }
71
swissChili62d6d5d2020-07-30 20:12:47 -070072 cpu_t cpu;
73
74 if (should_read)
75 {
76 cpu = new_cpu();
77 fread(cpu.mem, 0xFFFF, 1, input);
78 }
swissChilida4803e2020-08-06 20:06:04 -070079 else
80 {
81 puts("6502 toolchain by swissChili <swisschili.sh>");
82 printf("%s -h for help\n", argv[0]);
83 }
swissChili6c61a792020-07-28 16:29:20 -070084
swissChilidbbd5402020-08-07 15:07:39 -070085 if (guiflag)
86 {
87 gui(&cpu);
88 }
89 else if (disflag)
swissChili6c61a792020-07-28 16:29:20 -070090 {
91 disas(&cpu);
92 }
swissChilida4803e2020-08-06 20:06:04 -070093 else if (runflag)
94 {
95 run(&cpu);
96 }
swissChili62d6d5d2020-07-30 20:12:47 -070097 else if (debugflag)
98 {
99 debug(&cpu);
100 }
101
102 if (should_read)
103 free_cpu(&cpu);
swissChili6c61a792020-07-28 16:29:20 -0700104}