blob: e91e699e9ba5df71eab50233960e0f9b291ae4f7 [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"
swissChili94ba1f52020-08-08 11:39:10 -07004#include "screen.h"
swissChili6c61a792020-07-28 16:29:20 -07005
swissChili62d6d5d2020-07-30 20:12:47 -07006#include <bits/getopt_core.h>
swissChili6c61a792020-07-28 16:29:20 -07007#include <ctype.h>
8#include <stdio.h>
9#include <stdlib.h>
10#include <unistd.h>
11
swissChili94ba1f52020-08-08 11:39:10 -070012extern sdl_screen_t *g_scr;
13
swissChili6c61a792020-07-28 16:29:20 -070014int main(int argc, char **argv)
15{
swissChilida4803e2020-08-06 20:06:04 -070016 bool disflag = false,
17 runflag = false,
18 helpflag = false,
19 debugflag = false,
swissChilidbbd5402020-08-07 15:07:39 -070020 should_read = false,
swissChili94ba1f52020-08-08 11:39:10 -070021 guiflag = false,
22 scrflag = false;
swissChilida4803e2020-08-06 20:06:04 -070023
24 int disasm_len = 0;
swissChili62d6d5d2020-07-30 20:12:47 -070025
26 FILE *input = stdin;
swissChili6c61a792020-07-28 16:29:20 -070027
28 char c;
29
swissChili94ba1f52020-08-08 11:39:10 -070030 while ((c = getopt(argc, argv, "Dsdrhgi:n:")) != -1)
swissChili6c61a792020-07-28 16:29:20 -070031 {
32 switch (c)
33 {
swissChili62d6d5d2020-07-30 20:12:47 -070034 case 'd':
35 disflag = true;
36 should_read = true;
37 break;
38 case 'r':
39 runflag = true;
40 should_read = true;
41 break;
42 case 'D':
43 debugflag = true;
44 should_read = true;
45 break;
swissChilidbbd5402020-08-07 15:07:39 -070046 case 'g':
47 guiflag = true;
48 should_read = true;
49 break;
swissChili62d6d5d2020-07-30 20:12:47 -070050 case 'i':
51 input = fopen(optarg, "r");
52 break;
swissChilida4803e2020-08-06 20:06:04 -070053 case 'n':
54 disasm_len = atoi(optarg);
55 break;
swissChili94ba1f52020-08-08 11:39:10 -070056 case 's':
57 scrflag = true;
58 break;
swissChili62d6d5d2020-07-30 20:12:47 -070059 case 'h':
60 case '?':
61 helpflag = 1;
62 break;
swissChili6c61a792020-07-28 16:29:20 -070063 }
64 }
65
66 if (helpflag)
67 {
swissChili62d6d5d2020-07-30 20:12:47 -070068 printf("6502 emulator, disassembler and debugger\n"
69 "Usage:\n"
swissChilibb478f12020-08-07 20:45:07 -070070 " -g use GUI\n"
swissChili62d6d5d2020-07-30 20:12:47 -070071 " -d disassemble input\n"
72 " -r run input\n"
swissChilibb478f12020-08-07 20:45:07 -070073 " -D open CLI debug prompt (like gdb)\n"
swissChili62d6d5d2020-07-30 20:12:47 -070074 " -i <input> set input file, defaults to standard input\n"
swissChilida4803e2020-08-06 20:06:04 -070075 " -n <number> number of instructions to disassemble, 0 for all\n"
swissChili62d6d5d2020-07-30 20:12:47 -070076 " -h, -? show this help page\n");
swissChili6c61a792020-07-28 16:29:20 -070077 return 0;
78 }
79
swissChili62d6d5d2020-07-30 20:12:47 -070080 cpu_t cpu;
81
82 if (should_read)
83 {
84 cpu = new_cpu();
swissChilibb478f12020-08-07 20:45:07 -070085 fread(cpu.mem + 0x600, 0xFFFF - 0x600, 1, input);
swissChili62d6d5d2020-07-30 20:12:47 -070086 }
swissChilida4803e2020-08-06 20:06:04 -070087 else
88 {
89 puts("6502 toolchain by swissChili <swisschili.sh>");
90 printf("%s -h for help\n", argv[0]);
91 }
swissChili6c61a792020-07-28 16:29:20 -070092
swissChili94ba1f52020-08-08 11:39:10 -070093 if (scrflag)
94 {
swissChilicc27cfe2020-08-08 12:57:57 -070095#ifndef NO_PTHREAD
96 start_screen_thread(cpu.mem + CPU_FB_ADDR);
97#else
swissChili94ba1f52020-08-08 11:39:10 -070098 sdl_screen_t scr = new_sdl_screen(8);
99 g_scr = &scr;
swissChilicc27cfe2020-08-08 12:57:57 -0700100#endif
swissChili94ba1f52020-08-08 11:39:10 -0700101 }
102
swissChilidbbd5402020-08-07 15:07:39 -0700103 if (guiflag)
104 {
105 gui(&cpu);
106 }
107 else if (disflag)
swissChili6c61a792020-07-28 16:29:20 -0700108 {
swissChilic51e9222020-08-07 16:09:14 -0700109 disas_num(&cpu, 12);
swissChili6c61a792020-07-28 16:29:20 -0700110 }
swissChilida4803e2020-08-06 20:06:04 -0700111 else if (runflag)
112 {
113 run(&cpu);
114 }
swissChili62d6d5d2020-07-30 20:12:47 -0700115 else if (debugflag)
116 {
117 debug(&cpu);
118 }
119
swissChilicc27cfe2020-08-08 12:57:57 -0700120 if (scrflag)
121 free_sdl_screen(g_scr);
122
swissChili62d6d5d2020-07-30 20:12:47 -0700123 if (should_read)
124 free_cpu(&cpu);
swissChili6c61a792020-07-28 16:29:20 -0700125}