/[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 27 - (show annotations)
Mon Jul 30 15:45:03 2007 UTC (16 years, 9 months ago) by dpavlin
File MIME type: text/plain
File size: 4012 byte(s)
implement memory read and write callbacks to perl
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 int count;
38 dSP;
39 ENTER;
40 SAVETMPS;
41 PUSHMARK(SP);
42 XPUSHs( sv_2mortal( newSViv( Value ) ) );
43 PUTBACK;
44 count = call_pv("M6502::read", G_ARRAY );
45 if ( count != 1 ) {
46 printf("expect 1 return value, got %d", count);
47 exit(1);
48 }
49 printf("got %d values\n", count);
50 SPAGAIN;
51 SV *sv;
52 sv = POPs;
53 Value = SvIV(sv);
54 // Value = savepv(SvPV_nolen(POPs));
55 FREETMPS;
56 LEAVE;
57 printf("Rd6502(%04x) = %02x\n", Addr, Value);
58 return Value;
59 }
60
61 void Wr6502(register word Addr,register byte Value) {
62 printf("Wr6502(%04x,%02x)\n", Addr, Value);
63 dSP;
64 ENTER;
65 SAVETMPS;
66 PUSHMARK(SP);
67 XPUSHs( sv_2mortal( newSViv( Addr ) ) );
68 XPUSHs( sv_2mortal( newSViv( Value ) ) );
69 PUTBACK;
70 call_pv("M6502::write", G_DISCARD );
71 FREETMPS;
72 LEAVE;
73 }
74
75 byte Op6502(register word Addr) {
76 byte Op;
77 Op = 0xff;
78 printf("Op6502(%04x,%02x)\n", Addr, Op);
79 dump_R;
80 }
81
82 /** Loop6502() ***********************************************/
83 /** 6502 emulation calls this function periodically to **/
84 /** check if the system hardware requires any interrupts. **/
85 /** This function must return one of following values: **/
86 /** INT_NONE, INT_IRQ, INT_NMI, or INT_QUIT to exit the **/
87 /** emulation loop. **/
88 /************************************ TO BE WRITTEN BY USER **/
89 byte Loop6502(register M6502 *R) {
90 printf("Loop6502\n");
91 dump_R;
92 }
93
94 /** Patch6502() **********************************************/
95 /** Emulation calls this function when it encounters an **/
96 /** unknown opcode. This can be used to patch the code to **/
97 /** emulate BIOS calls, such as disk and tape access. The **/
98 /** function should return 1 if the exception was handled, **/
99 /** or 0 if the opcode was truly illegal. **/
100 /************************************ TO BE WRITTEN BY USER **/
101 byte Patch6502(register byte Op,register M6502 *R) {
102 printf("Patch6502(%02x)\n", Op);
103 dump_R;
104 }
105
106 /**
107 * main code
108 *
109 **/
110
111 int main(int argc, char **argv) {
112 char *command_line[] = {"", "-e",
113 "use M6502; print \"Loaded M6502 module\n\";"};
114 my_perl = perl_alloc();
115 perl_construct(my_perl);
116 if (perl_parse(my_perl, NULL, 3, command_line, (char **)NULL)) {
117 printf("Failed to parse\n");
118 return 0;
119 }
120 perl_run(my_perl);
121 if (SvTRUE(ERRSV)) {
122 printf("Failed to execute\n");
123 return 0;
124 } else {
125 R = malloc(sizeof(M6502));
126 if (!R) {
127 printf("can't alloc %d bytes for M6502", sizeof(M6502));
128 exit(1);
129 }
130
131 update_R(R);
132
133 printf("reset CPU\n");
134 Reset6502(R);
135
136 printf("call M6502::init\n");
137 dSP;
138 PUSHMARK(SP);
139 call_pv("M6502::init", G_DISCARD | G_NOARGS );
140
141 printf("run CPU\n");
142 Run6502(R);
143
144 }
145 free(R);
146 perl_destruct(my_perl);
147 perl_free(my_perl);
148 return 0;
149 }

  ViewVC Help
Powered by ViewVC 1.1.26