/[VRac]/M6502/perl.c
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Contents of /M6502/perl.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 26 - (show annotations)
Mon Jul 30 14:23:22 2007 UTC (16 years, 9 months ago) by dpavlin
File MIME type: text/plain
File size: 3383 byte(s)
added init, don't auto-vivify variables from M6502 package
1 #include <EXTERN.h>
2 #include <perl.h>
3 #include "M6502.h"
4 #include "config.h"
5
6 static PerlInterpreter *my_perl;
7
8 static M6502 *R;
9
10 #define dump_R printf("# PC: %04x A:%02x P:%02x X:%02x Y:%02x S:%02x\n", R->PC.W, R->A, R->P, R->X, R->Y, R->S );
11
12 void update_R(M6502 *R) {
13 R->A = atoi( SvPV_nolen( get_sv("M6502::A", FALSE) ) );
14 R->P = atoi( SvPV_nolen( get_sv("M6502::P", FALSE) ) );
15 R->X = atoi( SvPV_nolen( get_sv("M6502::X", FALSE) ) );
16 R->Y = atoi( SvPV_nolen( get_sv("M6502::Y", FALSE) ) );
17 R->S = atoi( SvPV_nolen( get_sv("M6502::S", FALSE) ) );
18 R->PC.W = atoi( SvPV_nolen( get_sv("M6502::PC", FALSE) ) );
19 R->IPeriod = atoi( SvPV_nolen( get_sv("M6502::IPeriod", FALSE) ) );
20 // ICount IRequest IAutoReset TrapBadOps Trap Trace
21 dump_R;
22 }
23
24 /** Rd6502()/Wr6502/Op6502() *********************************/
25 /** These functions are called when access to RAM occurs. **/
26 /** They allow to control memory access. Op6502 is the same **/
27 /** as Rd6502, but used to read *opcodes* only, when many **/
28 /** checks can be skipped to make it fast. It is only **/
29 /** required if there is a #define FAST_RDOP. **/
30 /************************************ TO BE WRITTEN BY USER **/
31
32 byte Rd6502(register word Addr) {
33 byte Value;
34 Value = 0x42;
35 printf("Rd6502(%04x,%02x)\n", Addr, Value);
36 }
37
38 void Wr6502(register word Addr,register byte Value) {
39 printf("Wr6502(%04x,%02x)\n", Addr, Value);
40 }
41
42 byte Op6502(register word Addr) {
43 byte Op;
44 Op = 0xff;
45 printf("Op6502(%04x,%02x)\n", Addr, Op);
46 dump_R;
47 }
48
49 /** Loop6502() ***********************************************/
50 /** 6502 emulation calls this function periodically to **/
51 /** check if the system hardware requires any interrupts. **/
52 /** This function must return one of following values: **/
53 /** INT_NONE, INT_IRQ, INT_NMI, or INT_QUIT to exit the **/
54 /** emulation loop. **/
55 /************************************ TO BE WRITTEN BY USER **/
56 byte Loop6502(register M6502 *R) {
57 printf("Loop6502\n");
58 dump_R;
59 }
60
61 /** Patch6502() **********************************************/
62 /** Emulation calls this function when it encounters an **/
63 /** unknown opcode. This can be used to patch the code to **/
64 /** emulate BIOS calls, such as disk and tape access. The **/
65 /** function should return 1 if the exception was handled, **/
66 /** or 0 if the opcode was truly illegal. **/
67 /************************************ TO BE WRITTEN BY USER **/
68 byte Patch6502(register byte Op,register M6502 *R) {
69 printf("Patch6502(%02x)\n", Op);
70 dump_R;
71 }
72
73 /**
74 * main code
75 *
76 **/
77
78 int main(int argc, char **argv) {
79 char *command_line[] = {"", "-e",
80 "use M6502; print \"Loaded M6502 module\n\";"};
81 my_perl = perl_alloc();
82 perl_construct(my_perl);
83 if (perl_parse(my_perl, NULL, 3, command_line, (char **)NULL)) {
84 printf("Failed to parse\n");
85 return 0;
86 }
87 perl_run(my_perl);
88 if (SvTRUE(ERRSV)) {
89 printf("Failed to execute\n");
90 return 0;
91 } else {
92 R = malloc(sizeof(M6502));
93 if (!R) {
94 printf("can't alloc %d bytes for M6502", sizeof(M6502));
95 exit(1);
96 }
97
98 update_R(R);
99
100 printf("reset CPU\n");
101 Reset6502(R);
102
103 printf("call M6502::init\n");
104 dSP;
105 PUSHMARK(SP);
106 call_pv("M6502::init", G_DISCARD | G_NOARGS );
107
108 printf("run CPU\n");
109 Run6502(R);
110
111 }
112 free(R);
113 perl_destruct(my_perl);
114 perl_free(my_perl);
115 return 0;
116 }

  ViewVC Help
Powered by ViewVC 1.1.26