blob: 07af04091082eb396fef0bd687be0250a0db1367 [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"
swissChilibb478f12020-08-07 20:45:07 -070063 " -g use GUI\n"
swissChili62d6d5d2020-07-30 20:12:47 -070064 " -d disassemble input\n"
65 " -r run input\n"
swissChilibb478f12020-08-07 20:45:07 -070066 " -D open CLI debug prompt (like gdb)\n"
swissChili62d6d5d2020-07-30 20:12:47 -070067 " -i <input> set input file, defaults to standard input\n"
swissChilida4803e2020-08-06 20:06:04 -070068 " -n <number> number of instructions to disassemble, 0 for all\n"
swissChili62d6d5d2020-07-30 20:12:47 -070069 " -h, -? show this help page\n");
swissChili6c61a792020-07-28 16:29:20 -070070 return 0;
71 }
72
swissChili62d6d5d2020-07-30 20:12:47 -070073 cpu_t cpu;
74
75 if (should_read)
76 {
77 cpu = new_cpu();
swissChilibb478f12020-08-07 20:45:07 -070078 fread(cpu.mem + 0x600, 0xFFFF - 0x600, 1, input);
swissChili62d6d5d2020-07-30 20:12:47 -070079 }
swissChilida4803e2020-08-06 20:06:04 -070080 else
81 {
82 puts("6502 toolchain by swissChili <swisschili.sh>");
83 printf("%s -h for help\n", argv[0]);
84 }
swissChili6c61a792020-07-28 16:29:20 -070085
swissChilidbbd5402020-08-07 15:07:39 -070086 if (guiflag)
87 {
88 gui(&cpu);
89 }
90 else if (disflag)
swissChili6c61a792020-07-28 16:29:20 -070091 {
swissChilic51e9222020-08-07 16:09:14 -070092 disas_num(&cpu, 12);
swissChili6c61a792020-07-28 16:29:20 -070093 }
swissChilida4803e2020-08-06 20:06:04 -070094 else if (runflag)
95 {
96 run(&cpu);
97 }
swissChili62d6d5d2020-07-30 20:12:47 -070098 else if (debugflag)
99 {
100 debug(&cpu);
101 }
102
103 if (should_read)
104 free_cpu(&cpu);
swissChili6c61a792020-07-28 16:29:20 -0700105}