comparison engine.c @ 11:ce7323f9b937

fix
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Fri, 06 Jul 2018 18:31:38 +0900
parents 2a1338b218bf
children 2aebc6b17fbf
comparison
equal deleted inserted replaced
10:2a1338b218bf 11:ce7323f9b937
39 static int tracetrick=0; 39 static int tracetrick=0;
40 extern long romstart; 40 extern long romstart;
41 41
42 #ifdef USE_MMU 42 #ifdef USE_MMU
43 43
44 Byte dummy; 44 Byte * mem0(Byte *iphymem, Word adr, Byte *immu) {
45 static Byte * mem0(Byte *iphymem, Word adr, Byte *immu) {
46 if (adr>=0xff00) return iphymem + memsize - 0x10000 + adr; // fixed area
47 int addr = (immu[ (adr) >> 13 ] <<13 ) + ((adr) & 0x1fff ); 45 int addr = (immu[ (adr) >> 13 ] <<13 ) + ((adr) & 0x1fff );
48 if ( addr >= memsize ) {
49 dummy = 0;
50 return &dummy;
51 }
52 return & iphymem[ addr ]; 46 return & iphymem[ addr ];
53 }; 47 };
54 #define mem(adr) (*mem0(iphymem, adr,immu)) 48
55 #define GETWORD(a) ({Byte *phy = mem0(iphymem, a,immu); phy[0]<<8|phy[1];}) 49 static Byte mem1(Byte *iphymem, Word adr, Byte *immu) {
56 #define SETBYTE(a,n) {Byte *phy = mem0(iphymem, a,immu); if(!(phy-iphymem>=romstart)) phy[0]=n;} 50 if ((adr&0xff00)==(IOPAGE&0xff00)) return do_input(adr&0xff);
57 #define SETWORD(a,n) {Byte *phy = mem0(iphymem, a,immu); if(!(phy-iphymem>=romstart)){phy[0]=(n)>>8;phy[1]=n;}} 51 Byte *p = mem0(iphymem, adr, immu);
58 52 if(!(p-phymem>=memsize)) {
59 Byte * mem1(Byte *iphymem, Word adr, Byte *immu) { return mem0(iphymem,adr,immu); } 53 return *p;
54 } else {
55 return 0xff;
56 }
57 }
58
59 #define mem(a) mem1(iphymem,a,immu)
60
61 static void SETBYTE1(Byte n,Byte *iphymem, Word adr, Byte *immu) {
62 if ((adr&0xff00)==(IOPAGE&0xff00)) do_output(adr&0xff,n);
63 Byte *p = mem0(iphymem, adr, immu);
64 if(!(p-phymem>=romstart)) {
65 *p=n;
66 }
67 }
68
69 #define SETBYTE(a,n) SETBYTE1(n,iphymem,a,immu);
60 70
61 #else 71 #else
62 72
63 #define mem(adr) mem[adr] 73 static Byte mem1(Word adr) {
74 if ((adr&0xff00)==(IOPAGE&0xff00)) return do_input(adr&0xff);
75 return mem[adr];
76 }
77
78 static void SETBYTE1(Word a,Byte n) {
79 if ((a&0xff00)==(IOPAGE&0xff00)) do_output(a&0xff,n);
80 if(!(a>=romstart))mem[a]=n;
81 }
82 #define mem(a) mem1(a)
83 #define SETBYTE(a,n) SETBYTE1(a,n);
84
85 #endif
64 86
65 #define GETWORD(a) (mem(a)<<8|mem((a)+1)) 87 #define GETWORD(a) (mem(a)<<8|mem((a)+1))
66 #define SETBYTE(a,n) {if(!(a>=romstart))mem(a)=n;} 88 #define SETWORD(a,n) {Word a1=a;SETBYTE(a1,n>>8);SETBYTE(a1+1,n);}
67 #define SETWORD(a,n) if(!(a>=romstart)){mem(a)=(n)>>8;mem((a)+1)=n;} 89
68 90 /* Macros for load and store of accumulators. Can be modified to check
69 #endif 91 for port addresses */
92 // #define LOADAC(reg) if((eaddr&0xff00)!=(IOPAGE&0xff00))reg=mem(eaddr);else\
93 // reg=do_input(eaddr&0xff);
94 // #define STOREAC(reg) if((eaddr&0xff00)!=(IOPAGE&0xff00))SETBYTE(eaddr,reg)else\
95 // do_output(eaddr&0xff,reg);
70 96
71 /* Two bytes of a word are fetched separately because of 97 /* Two bytes of a word are fetched separately because of
72 the possible wrap-around at address $ffff and alignment 98 the possible wrap-around at address $ffff and alignment
73 */ 99 */
74 100
147 case 8: iareg=val;break;\ 173 case 8: iareg=val;break;\
148 case 9: ibreg=val;break;\ 174 case 9: ibreg=val;break;\
149 case 10: iccreg=val;break;\ 175 case 10: iccreg=val;break;\
150 case 11: idpreg=val;break;} 176 case 11: idpreg=val;break;}
151 177
152 /* Macros for load and store of accumulators. Can be modified to check 178
153 for port addresses */ 179 #define LOADAC(reg) reg=mem(eaddr);
154 #define LOADAC(reg) if((eaddr&0xff00)!=(IOPAGE&0xff00))reg=mem(eaddr);else\ 180 #define STOREAC(reg) SETBYTE(eaddr,reg);
155 reg=do_input(eaddr&0xff);
156 #define STOREAC(reg) if((eaddr&0xff00)!=(IOPAGE&0xff00))SETBYTE(eaddr,reg)else\
157 do_output(eaddr&0xff,reg);
158 181
159 #define LOADREGS ixreg=xreg;iyreg=yreg;\ 182 #define LOADREGS ixreg=xreg;iyreg=yreg;\
160 iureg=ureg;isreg=sreg;\ 183 iureg=ureg;isreg=sreg;\
161 ipcreg=pcreg;\ 184 ipcreg=pcreg;\
162 iareg=*areg;ibreg=*breg;\ 185 iareg=*areg;ibreg=*breg;\
210 for(;;){ 233 for(;;){
211 if(attention) { 234 if(attention) {
212 if(tracing && ipcreg>=tracelo && ipcreg<=tracehi) { 235 if(tracing && ipcreg>=tracelo && ipcreg<=tracehi) {
213 SAVEREGS 236 SAVEREGS
214 #ifdef USE_MMU 237 #ifdef USE_MMU
215 Byte *phyadr = &mem(pcreg); 238 Byte *phyadr = mem0(phymem,pcreg,immu);
216 prog = (char *)(phyadr - pcreg); 239 prog = (char *)(phyadr - pcreg);
217 #endif 240 #endif
218 do_trace(tracefile); 241 do_trace(tracefile);
219 } 242 }
220 if(escape){ SAVEREGS do_escape(); LOADREGS } 243 if(escape){ SAVEREGS do_escape(); LOADREGS }
1103 ibreg=tw;break; 1126 ibreg=tw;break;
1104 case 0xDC: /*LDD direct */ DIRECT tw=GETWORD(eaddr);SETNZ16(tw) 1127 case 0xDC: /*LDD direct */ DIRECT tw=GETWORD(eaddr);SETNZ16(tw)
1105 CLV SETDREG(tw) break; 1128 CLV SETDREG(tw) break;
1106 case 0xDD: /*STD direct */ DIRECT 1129 case 0xDD: /*STD direct */ DIRECT
1107 tw=GETDREG; SETNZ16(tw) CLV 1130 tw=GETDREG; SETNZ16(tw) CLV
1131 #ifdef USE_MMU
1132 STOREAC((tw>>8)&0x0ff); eaddr++;
1133 STOREAC(tw&0x0ff); break;
1134 #else
1108 SETWORD(eaddr,tw) break; 1135 SETWORD(eaddr,tw) break;
1136 #endif
1109 case 0xDE: /* LDU (LDS) direct */ DIRECT tw=GETWORD(eaddr); 1137 case 0xDE: /* LDU (LDS) direct */ DIRECT tw=GETWORD(eaddr);
1110 CLV SETNZ16(tw) if(!iflag)iureg=tw; else 1138 CLV SETNZ16(tw) if(!iflag)iureg=tw; else
1111 isreg=tw;break; 1139 isreg=tw;break;
1112 case 0xDF: /* STU (STS) direct */ DIRECT 1140 case 0xDF: /* STU (STS) direct */ DIRECT
1113 if(!iflag) tw=iureg; else tw=isreg; 1141 if(!iflag) tw=iureg; else tw=isreg;
1149 case 0xEC: /*LDD indexed */ tw=GETWORD(eaddr);SETNZ16(tw) 1177 case 0xEC: /*LDD indexed */ tw=GETWORD(eaddr);SETNZ16(tw)
1150 CLV SETDREG(tw) break; 1178 CLV SETDREG(tw) break;
1151 case 0xED: /*STD indexed */ 1179 case 0xED: /*STD indexed */
1152 tw=GETDREG; SETNZ16(tw) CLV 1180 tw=GETDREG; SETNZ16(tw) CLV
1153 #ifdef USE_MMU 1181 #ifdef USE_MMU
1154 STOREAC((tw<<8)&0x0ff); eaddr++; 1182 STOREAC((tw>>8)&0x0ff); eaddr++;
1155 STOREAC(tw&0x0ff); 1183 STOREAC(tw&0x0ff);
1156 break; 1184 break;
1157 #else 1185 #else
1158 SETWORD(eaddr,tw) break; 1186 SETWORD(eaddr,tw) break;
1159 #endif 1187 #endif
1200 case 0xFC: /*LDD ext */ EXTENDED tw=GETWORD(eaddr);SETNZ16(tw) 1228 case 0xFC: /*LDD ext */ EXTENDED tw=GETWORD(eaddr);SETNZ16(tw)
1201 CLV SETDREG(tw) break; 1229 CLV SETDREG(tw) break;
1202 case 0xFD: /*STD ext */ EXTENDED 1230 case 0xFD: /*STD ext */ EXTENDED
1203 tw=GETDREG; SETNZ16(tw) CLV 1231 tw=GETDREG; SETNZ16(tw) CLV
1204 #ifdef USE_MMU 1232 #ifdef USE_MMU
1205 STOREAC((tw<<8)&0x0ff); eaddr++; 1233 STOREAC((tw>>8)&0x0ff); eaddr++;
1206 STOREAC(tw&0x0ff); 1234 STOREAC(tw&0x0ff);
1207 break; 1235 break;
1208 #else 1236 #else
1209 SETWORD(eaddr,tw) break; 1237 SETWORD(eaddr,tw) break;
1210 #endif 1238 #endif