Mercurial > hg > Members > kono > os9 > sbc09
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 |