blob: 84e977986fa9ecefc1306397d1030372636990f8 [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 {
95 sdl_screen_t scr = new_sdl_screen(8);
96 g_scr = &scr;
97 }
98
swissChilidbbd5402020-08-07 15:07:39 -070099 if (guiflag)
100 {
101 gui(&cpu);
102 }
103 else if (disflag)
swissChili6c61a792020-07-28 16:29:20 -0700104 {
swissChilic51e9222020-08-07 16:09:14 -0700105 disas_num(&cpu, 12);
swissChili6c61a792020-07-28 16:29:20 -0700106 }
swissChilida4803e2020-08-06 20:06:04 -0700107 else if (runflag)
108 {
109 run(&cpu);
110 }
swissChili62d6d5d2020-07-30 20:12:47 -0700111 else if (debugflag)
112 {
113 debug(&cpu);
114 }
115
116 if (should_read)
117 free_cpu(&cpu);
swissChili6c61a792020-07-28 16:29:20 -0700118}