summaryrefslogtreecommitdiffstats
path: root/hacks/asm6502.h
diff options
context:
space:
mode:
Diffstat (limited to 'hacks/asm6502.h')
-rw-r--r--hacks/asm6502.h181
1 files changed, 181 insertions, 0 deletions
diff --git a/hacks/asm6502.h b/hacks/asm6502.h
new file mode 100644
index 0000000..79b13a2
--- /dev/null
+++ b/hacks/asm6502.h
@@ -0,0 +1,181 @@
+/*
+ * Copyright (c) 2007 Jeremy English <jhe@jeremyenglish.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * Created: 07-May-2007
+ */
+
+/*
+ This is a port of the javascript 6502 assembler, compiler and
+ debugger. The orignal code was copyright 2006 by Stian Soreng -
+ www.6502asm.com
+
+ The stack space is in page $100 to $1ff. The video buffer starts at
+ $200 and is 1024 bytes. Programs get loaded at address
+ $600. Address $fe is random and byte $ff is used for user input.
+
+ User input is disabled.
+*/
+
+#ifndef __ASM6502_H__
+#define __ASM6502_H__
+
+typedef uint8_t Bit8;
+typedef uint16_t Bit16;
+typedef uint32_t Bit32;
+
+#undef BOOL
+#undef TRUE
+#undef FALSE
+#define BOOL Bit8
+#define TRUE 1
+#define FALSE 0
+
+enum {
+ MAX_LABEL_LEN = 80,
+ NUM_OPCODES = 56, /* Number of unique instructions not counting DCB */
+ MEM_64K = 65536, /* We have 64k of memory to work with. */
+ MAX_PARAM_VALUE = 25, /* The number of values allowed behind dcb */
+ MAX_CMD_LEN = 4, /* Each assembly command is 3 characeters long */
+/* The stack works from the top down in page $100 to $1ff */
+ STACK_TOP = 0x1ff,
+ STACK_BOTTOM = 0x100,
+ PROG_START = 0x600 /* The default entry point for the program */
+};
+
+typedef enum{
+ SINGLE, IMMEDIATE_VALUE, IMMEDIATE_GREAT,
+ IMMEDIATE_LESS, INDIRECT_X, INDIRECT_Y,
+ ZERO, ZERO_X, ZERO_Y,
+ ABS_VALUE, ABS_OR_BRANCH, ABS_X, ABS_Y,
+ ABS_LABEL_X, ABS_LABEL_Y, DCB_PARAM
+} m6502_AddrMode;
+
+typedef struct machine_6502 machine_6502;
+
+typedef struct {
+ char name[MAX_CMD_LEN];
+ Bit8 Imm;
+ Bit8 ZP;
+ Bit8 ZPX;
+ Bit8 ZPY;
+ Bit8 ABS;
+ Bit8 ABSX;
+ Bit8 ABSY;
+ Bit8 INDX;
+ Bit8 INDY;
+ Bit8 SNGL;
+ Bit8 BRA;
+ void (*func) (machine_6502*, m6502_AddrMode);
+} m6502_Opcodes;
+
+/* Used to cache the index of each opcode */
+typedef struct {
+ Bit8 index;
+ m6502_AddrMode adm;
+} m6502_OpcodeIndex;
+
+/* Plotter is a function that will be called everytime a pixel
+ needs to be updated. The first two parameter are the x and y
+ values. The third parameter is the color index:
+
+ Color Index Table
+ 00 black #000000
+ 01 white #ffffff
+ 02 Red #880000
+ 03 seafoam #aaffee
+ 04 fuscia #cc44cc
+ 05 green #00cc55
+ 06 blue #0000aa
+ 07 Yellow #eeee77
+ 08 tangerine #dd8855
+ 09 brown #664400
+ 10 salmon #ff7777
+ 11 charcoal #333333
+ 12 smoke #777777
+ 13 lime #aaff66
+ 14 light blue #0088ff
+ 15 gray #bbbbbb
+
+ The plotter state variable of the machine gets passed as the forth
+ parameter. You can use this parameter to store state information.
+
+*/
+typedef void (*m6502_Plotter) (Bit8, Bit8, Bit8, void*);
+
+struct machine_6502 {
+ BOOL codeCompiledOK;
+ Bit8 regA;
+ Bit8 regX;
+ Bit8 regY;
+ Bit8 regP;
+ Bit16 regPC; /* A pair of 8 bit registers */
+ Bit16 regSP;
+ Bit16 defaultCodePC;
+ Bit8 memory[MEM_64K];
+ BOOL runForever;
+ int labelPtr;
+ BOOL codeRunning;
+ int myInterval;
+ m6502_Opcodes opcodes[NUM_OPCODES];
+ int screen[32][32];
+ int codeLen;
+ m6502_OpcodeIndex opcache[0xff];
+ m6502_Plotter plot;
+ void *plotterState;
+};
+
+/* build6502() - Creates an instance of the 6502 machine */
+machine_6502 *m6502_build(void);
+
+/* destroy6502() - compile the file and exectue it until the program
+ is finished */
+void m6502_destroy6502(machine_6502 *machine);
+
+/* eval_file() - Compiles and runs a file until the program is
+ finished */
+void m6502_eval_file(machine_6502 *machine, const char *filename,
+ m6502_Plotter plot, void *plotterState);
+
+/* start_eval_file() - Compile the file and execute the first
+ instruction */
+void m6502_start_eval_file(machine_6502 *machine, const char *filename,
+ m6502_Plotter plot, void *plotterState);
+
+/* XXX
+void m6502_start_eval_binary(machine_6502 *machine, Bit8 *program,
+ unsigned int proglen,
+ Plotter plot, void *plotterState);
+*/
+
+void m6502_start_eval_string(machine_6502 *machine, const char *code,
+ m6502_Plotter plot, void *plotterState);
+
+/* next_eval() - Execute the next insno of machine instructions */
+void m6502_next_eval(machine_6502 *machine, int insno);
+
+/* hexDump() - Dumps memory to output */
+void m6502_hexDump(machine_6502 *machine, Bit16 start,
+ Bit16 numbytes, FILE *output);
+
+/* Disassemble() - Prints the assembly code for the program currently
+ loaded in memory.*/
+void m6502_disassemble(machine_6502 *machine, FILE *output);
+
+/* trace() - Prints to output the current value of registers, the
+ current nmemonic, memory address and value. */
+void m6502_trace(machine_6502 *machine, FILE *output);
+
+/* save_program() - Writes a binary file of the program loaded in
+ memory. */
+/* XXX
+void save_program(machine_6502 *machine, const char *filename);
+*/
+#endif /* __ASM6502_H__ */