IPS(Interpreter for Process Structures) for mbed

Dependencies:   ConfigFile FATFileSystem mbed

IPS port from linux/unix version.

mbed_blinky.ips

0 VAR led1
" LED1 " DigitalOut led1 !
: main
    ANFANG
    1 JA?
      1 led1 @ write
      200 wait_ms
      0 led1 @ write
      200 wait_ms
    DANN/NOCHMAL
;
main
Committer:
va009039
Date:
Sat May 23 16:50:59 2015 +0900
Revision:
2:908338b1151a
Parent:
1:e74530ad6b9e
add mbedAPI

Who changed what in which revision?

UserRevisionLine numberNew contents of line
va009039 2:908338b1151a 1 // BaseIPS.cpp 2015/5/22
va009039 2:908338b1151a 2 #include <algorithm>
va009039 1:e74530ad6b9e 3 #include "mbed.h"
va009039 1:e74530ad6b9e 4 #include "BaseIPS.h"
va009039 1:e74530ad6b9e 5
va009039 2:908338b1151a 6 #ifndef NO_MATH
va009039 1:e74530ad6b9e 7 #include <math.h>
va009039 1:e74530ad6b9e 8 #define Round(x) ( (x>=0) ? (int)(x+0.5) : (int)(x-0.5) )
va009039 2:908338b1151a 9 #endif
va009039 1:e74530ad6b9e 10
va009039 1:e74530ad6b9e 11 BaseIPS::BaseIPS() {
va009039 1:e74530ad6b9e 12 PS = 0xfff8;
va009039 1:e74530ad6b9e 13 RS = 0x4f8;
va009039 1:e74530ad6b9e 14 depth=0;
va009039 1:e74530ad6b9e 15 idle=0;
va009039 1:e74530ad6b9e 16 input_ptr = 512;
va009039 1:e74530ad6b9e 17 cycle = 0;
va009039 1:e74530ad6b9e 18 inputfile = NULL;
va009039 1:e74530ad6b9e 19 }
va009039 1:e74530ad6b9e 20
va009039 1:e74530ad6b9e 21 u16 BaseIPS::peek(u16 a) {
va009039 1:e74530ad6b9e 22 return peekB(a) | peekB(a + 1)<<8;
va009039 1:e74530ad6b9e 23 }
va009039 1:e74530ad6b9e 24
va009039 1:e74530ad6b9e 25 void BaseIPS::poke(u16 a, u16 w) {
va009039 1:e74530ad6b9e 26 pokeB(a, w & 0xff);
va009039 1:e74530ad6b9e 27 pokeB(a + 1, w>>8);
va009039 1:e74530ad6b9e 28 }
va009039 1:e74530ad6b9e 29
va009039 1:e74530ad6b9e 30 u32 BaseIPS::peek32(u16 a) {
va009039 1:e74530ad6b9e 31 return peekB(a) | peekB(a + 1)<<8 | peekB(a + 2)<<16 | peekB(a + 3)<<24;
va009039 1:e74530ad6b9e 32 }
va009039 1:e74530ad6b9e 33
va009039 1:e74530ad6b9e 34
va009039 1:e74530ad6b9e 35 void BaseIPS::push_ps(u16 w) {
va009039 1:e74530ad6b9e 36 PS -= 2;
va009039 1:e74530ad6b9e 37 poke(PS, w);
va009039 1:e74530ad6b9e 38 }
va009039 1:e74530ad6b9e 39
va009039 1:e74530ad6b9e 40 u16 BaseIPS::pull_ps() {
va009039 1:e74530ad6b9e 41 PS += 2;
va009039 1:e74530ad6b9e 42 return peek(PS - 2);
va009039 1:e74530ad6b9e 43 }
va009039 1:e74530ad6b9e 44
va009039 1:e74530ad6b9e 45 void BaseIPS::push_rs(u16 w) {
va009039 1:e74530ad6b9e 46 RS -= 2;
va009039 1:e74530ad6b9e 47 poke(RS, w);
va009039 1:e74530ad6b9e 48 }
va009039 1:e74530ad6b9e 49
va009039 1:e74530ad6b9e 50 u16 BaseIPS::pull_rs() {
va009039 1:e74530ad6b9e 51 RS += 2;
va009039 1:e74530ad6b9e 52 return peek(RS - 2);
va009039 1:e74530ad6b9e 53 }
va009039 1:e74530ad6b9e 54
va009039 1:e74530ad6b9e 55 void BaseIPS::c_rumpelstilzchen(void) { // 0
va009039 1:e74530ad6b9e 56 }
va009039 1:e74530ad6b9e 57
va009039 1:e74530ad6b9e 58 void BaseIPS::c_defex(void) { // 1
va009039 1:e74530ad6b9e 59 push_rs(PPC);
va009039 1:e74530ad6b9e 60 PPC = HP;
va009039 1:e74530ad6b9e 61 depth++;
va009039 1:e74530ad6b9e 62 }
va009039 1:e74530ad6b9e 63
va009039 2:908338b1151a 64 void BaseIPS::c_consex(void) { // 2
va009039 1:e74530ad6b9e 65 push_ps(peek(HP));
va009039 1:e74530ad6b9e 66 }
va009039 1:e74530ad6b9e 67
va009039 1:e74530ad6b9e 68 void BaseIPS::c_varex(void) { // 3
va009039 1:e74530ad6b9e 69 push_ps(HP);
va009039 1:e74530ad6b9e 70 }
va009039 1:e74530ad6b9e 71
va009039 1:e74530ad6b9e 72 void BaseIPS::c_retex(void) { // 4
va009039 1:e74530ad6b9e 73 depth--;
va009039 1:e74530ad6b9e 74 PPC = pull_rs();
va009039 1:e74530ad6b9e 75 }
va009039 1:e74530ad6b9e 76
va009039 1:e74530ad6b9e 77 void BaseIPS::c_get(void) { // 5
va009039 1:e74530ad6b9e 78 poke(PS, peek(peek(PS)));
va009039 1:e74530ad6b9e 79 }
va009039 1:e74530ad6b9e 80
va009039 1:e74530ad6b9e 81 void BaseIPS::c_getB(void) { // 6
va009039 1:e74530ad6b9e 82 poke(PS, peekB(peek(PS)));
va009039 1:e74530ad6b9e 83 }
va009039 1:e74530ad6b9e 84
va009039 1:e74530ad6b9e 85 void BaseIPS::c_put(void) { // 7
va009039 1:e74530ad6b9e 86 u16 a = pull_ps();
va009039 1:e74530ad6b9e 87 u16 v = pull_ps();
va009039 1:e74530ad6b9e 88 if (peek(a) != v) idle=0;
va009039 1:e74530ad6b9e 89 poke(a, v);
va009039 1:e74530ad6b9e 90 }
va009039 1:e74530ad6b9e 91
va009039 1:e74530ad6b9e 92 void BaseIPS::c_putB(void) { // 8
va009039 1:e74530ad6b9e 93 u16 a = pull_ps();
va009039 1:e74530ad6b9e 94 u16 v = pull_ps();
va009039 1:e74530ad6b9e 95 if (peekB(a) != v) idle=0;
va009039 1:e74530ad6b9e 96 pokeB(a, v);
va009039 1:e74530ad6b9e 97 idle=0;
va009039 1:e74530ad6b9e 98 }
va009039 1:e74530ad6b9e 99
va009039 1:e74530ad6b9e 100 void BaseIPS::c_1bliteral(void) { // 9
va009039 1:e74530ad6b9e 101 push_ps(peekB(PPC));
va009039 1:e74530ad6b9e 102 PPC++;
va009039 1:e74530ad6b9e 103 }
va009039 1:e74530ad6b9e 104
va009039 1:e74530ad6b9e 105 void BaseIPS::c_2bliteral(void) { // 10
va009039 1:e74530ad6b9e 106 push_ps(peek(PPC));
va009039 1:e74530ad6b9e 107 PPC += 2;
va009039 1:e74530ad6b9e 108 }
va009039 1:e74530ad6b9e 109
va009039 1:e74530ad6b9e 110 void BaseIPS::c_bronz(void) { // 11
va009039 1:e74530ad6b9e 111 if ((pull_ps() & 1) == 0) PPC=peek(PPC);
va009039 1:e74530ad6b9e 112 else PPC += 2;
va009039 1:e74530ad6b9e 113 }
va009039 1:e74530ad6b9e 114
va009039 1:e74530ad6b9e 115 void BaseIPS::c_jump(void) { // 12
va009039 1:e74530ad6b9e 116 PPC = peek(PPC);
va009039 1:e74530ad6b9e 117 }
va009039 1:e74530ad6b9e 118
va009039 1:e74530ad6b9e 119 void BaseIPS::c_weg(void) { // 13
va009039 1:e74530ad6b9e 120 PS += 2;
va009039 1:e74530ad6b9e 121 }
va009039 1:e74530ad6b9e 122
va009039 1:e74530ad6b9e 123 void BaseIPS::c_pweg(void) { // 14
va009039 1:e74530ad6b9e 124 PS += 4;
va009039 1:e74530ad6b9e 125 }
va009039 1:e74530ad6b9e 126
va009039 1:e74530ad6b9e 127 void BaseIPS::c_plus(void) { // 15
va009039 1:e74530ad6b9e 128 s16 v = pull_ps();
va009039 1:e74530ad6b9e 129 poke(PS, peek(PS) + v);
va009039 1:e74530ad6b9e 130 }
va009039 1:e74530ad6b9e 131
va009039 1:e74530ad6b9e 132 void BaseIPS::c_minus(void) { // 16
va009039 1:e74530ad6b9e 133 s16 v = pull_ps();
va009039 1:e74530ad6b9e 134 poke(PS, peek(PS) - v);
va009039 1:e74530ad6b9e 135 }
va009039 1:e74530ad6b9e 136
va009039 1:e74530ad6b9e 137 void BaseIPS::c_dup(void) { // 17
va009039 1:e74530ad6b9e 138 push_ps(peek(PS));
va009039 1:e74530ad6b9e 139 }
va009039 1:e74530ad6b9e 140
va009039 1:e74530ad6b9e 141 void BaseIPS::c_pdup(void) { // 18
va009039 1:e74530ad6b9e 142 push_ps(peek(PS + 2));
va009039 1:e74530ad6b9e 143 push_ps(peek(PS + 2));
va009039 1:e74530ad6b9e 144 }
va009039 1:e74530ad6b9e 145
va009039 1:e74530ad6b9e 146 void BaseIPS::c_vert(void) { // 19
va009039 1:e74530ad6b9e 147 s16 h=peek(PS);
va009039 1:e74530ad6b9e 148 poke(PS, peek(PS + 2));
va009039 1:e74530ad6b9e 149 poke(PS + 2, h);
va009039 1:e74530ad6b9e 150 }
va009039 1:e74530ad6b9e 151
va009039 1:e74530ad6b9e 152 void BaseIPS::c_zwo(void) { // 20
va009039 1:e74530ad6b9e 153 push_ps(peek(PS+2));
va009039 1:e74530ad6b9e 154 }
va009039 1:e74530ad6b9e 155
va009039 1:e74530ad6b9e 156 void BaseIPS::c_rdu(void) { // 21
va009039 1:e74530ad6b9e 157 s16 h=peek(PS);
va009039 1:e74530ad6b9e 158 poke(PS, peek(PS+2));
va009039 1:e74530ad6b9e 159 poke(PS+2, peek(PS+4));
va009039 1:e74530ad6b9e 160 poke(PS+4, h);
va009039 1:e74530ad6b9e 161 }
va009039 1:e74530ad6b9e 162
va009039 1:e74530ad6b9e 163 void BaseIPS::c_rdo(void) { // 22
va009039 1:e74530ad6b9e 164 s16 h=peek(PS+4);
va009039 1:e74530ad6b9e 165 poke(PS+4, peek(PS+2));
va009039 1:e74530ad6b9e 166 poke(PS+2, peek(PS));
va009039 1:e74530ad6b9e 167 poke(PS, h);
va009039 1:e74530ad6b9e 168 }
va009039 1:e74530ad6b9e 169
va009039 1:e74530ad6b9e 170 void BaseIPS::c_index(void) { // 23
va009039 1:e74530ad6b9e 171 push_ps(peek(RS));
va009039 1:e74530ad6b9e 172 }
va009039 1:e74530ad6b9e 173
va009039 1:e74530ad6b9e 174 void BaseIPS::c_s_to_r(void) { // 24
va009039 1:e74530ad6b9e 175 push_rs(pull_ps());
va009039 1:e74530ad6b9e 176 }
va009039 1:e74530ad6b9e 177
va009039 1:e74530ad6b9e 178 void BaseIPS::c_r_to_s(void) { // 25
va009039 1:e74530ad6b9e 179 push_ps(pull_rs());
va009039 1:e74530ad6b9e 180 }
va009039 1:e74530ad6b9e 181
va009039 1:e74530ad6b9e 182 void BaseIPS::c_eqz(void) { // 26
va009039 1:e74530ad6b9e 183 poke(PS,(peek(PS)==0));
va009039 1:e74530ad6b9e 184 }
va009039 1:e74530ad6b9e 185
va009039 1:e74530ad6b9e 186 void BaseIPS::c_gz(void) { // 27
va009039 1:e74530ad6b9e 187 poke(PS,((s16)peek(PS)>0));
va009039 1:e74530ad6b9e 188 }
va009039 1:e74530ad6b9e 189
va009039 1:e74530ad6b9e 190 void BaseIPS::c_lz(void) { // 28
va009039 1:e74530ad6b9e 191 poke(PS,((s16)peek(PS)<0));
va009039 1:e74530ad6b9e 192 }
va009039 1:e74530ad6b9e 193
va009039 1:e74530ad6b9e 194 void BaseIPS::c_geu(void) { // 29
va009039 1:e74530ad6b9e 195 u16 a,b;
va009039 1:e74530ad6b9e 196 b=pull_ps();
va009039 1:e74530ad6b9e 197 a=peek(PS);
va009039 1:e74530ad6b9e 198 poke(PS,a>=b);
va009039 1:e74530ad6b9e 199 }
va009039 1:e74530ad6b9e 200
va009039 1:e74530ad6b9e 201 void BaseIPS::c_f_vergl(void) { // 30
va009039 1:e74530ad6b9e 202 int t;
va009039 1:e74530ad6b9e 203 u16 n,a1,a2;
va009039 1:e74530ad6b9e 204 n=pull_ps();
va009039 1:e74530ad6b9e 205 a2=pull_ps();
va009039 1:e74530ad6b9e 206 a1=peek(PS);
va009039 1:e74530ad6b9e 207 t=1;
va009039 1:e74530ad6b9e 208 do {
va009039 1:e74530ad6b9e 209 int b;
va009039 1:e74530ad6b9e 210 b=(s16)peekB(a1++)-(s16)peekB(a2++);
va009039 1:e74530ad6b9e 211 if (b>0) t=2;
va009039 1:e74530ad6b9e 212 else if (b<0) t=0;
va009039 1:e74530ad6b9e 213 n=(n-1)&0xff;
va009039 1:e74530ad6b9e 214 } while (n);
va009039 1:e74530ad6b9e 215 poke(PS,t);
va009039 1:e74530ad6b9e 216 }
va009039 1:e74530ad6b9e 217
va009039 1:e74530ad6b9e 218 void BaseIPS::c_nicht(void) { // 31
va009039 1:e74530ad6b9e 219 poke(PS, 0xffff^peek(PS));
va009039 1:e74530ad6b9e 220 }
va009039 1:e74530ad6b9e 221
va009039 1:e74530ad6b9e 222 void BaseIPS::c_und(void) { // 32
va009039 1:e74530ad6b9e 223 u16 v = pull_ps();
va009039 1:e74530ad6b9e 224 poke(PS, v & peek(PS));
va009039 1:e74530ad6b9e 225 }
va009039 1:e74530ad6b9e 226
va009039 1:e74530ad6b9e 227 void BaseIPS::c_oder(void) { // 33
va009039 1:e74530ad6b9e 228 u16 v = pull_ps();
va009039 1:e74530ad6b9e 229 poke(PS, v | peek(PS));
va009039 1:e74530ad6b9e 230 }
va009039 1:e74530ad6b9e 231
va009039 1:e74530ad6b9e 232 void BaseIPS::c_exo(void) { // 34
va009039 1:e74530ad6b9e 233 u16 v = pull_ps();
va009039 1:e74530ad6b9e 234 poke(PS, v ^ peek(PS));
va009039 1:e74530ad6b9e 235 }
va009039 1:e74530ad6b9e 236
va009039 1:e74530ad6b9e 237 void BaseIPS::c_bit(void) { // 35
va009039 1:e74530ad6b9e 238 poke(PS, 1<<peek(PS));
va009039 1:e74530ad6b9e 239 }
va009039 1:e74530ad6b9e 240
va009039 1:e74530ad6b9e 241 void BaseIPS::c_cbit(void) { // 36
va009039 1:e74530ad6b9e 242 int a = pull_ps();
va009039 1:e74530ad6b9e 243 int b = (pull_ps())&0x07;
va009039 1:e74530ad6b9e 244 pokeB(a, peekB(a)&~(1<<b) );
va009039 1:e74530ad6b9e 245 }
va009039 1:e74530ad6b9e 246
va009039 1:e74530ad6b9e 247 void BaseIPS::c_sbit(void) { // 37
va009039 1:e74530ad6b9e 248 int a,b;
va009039 1:e74530ad6b9e 249 a=pull_ps();
va009039 1:e74530ad6b9e 250 b=(pull_ps())&0x07;
va009039 1:e74530ad6b9e 251 pokeB(a, peekB(a)|(1<<b) );
va009039 1:e74530ad6b9e 252 }
va009039 1:e74530ad6b9e 253
va009039 1:e74530ad6b9e 254 void BaseIPS::c_tbit(void) { // 38
va009039 1:e74530ad6b9e 255 int a,b;
va009039 1:e74530ad6b9e 256 a=pull_ps();
va009039 1:e74530ad6b9e 257 b=(peek(PS))&0x07;
va009039 1:e74530ad6b9e 258 if (peekB(a)&(1<<b)) poke(PS,1);
va009039 1:e74530ad6b9e 259 else poke(PS,0);
va009039 1:e74530ad6b9e 260 }
va009039 1:e74530ad6b9e 261
va009039 1:e74530ad6b9e 262 void BaseIPS::loop_sharedcode(int i) {
va009039 1:e74530ad6b9e 263 int l;
va009039 1:e74530ad6b9e 264 l=(s16)peek(RS);
va009039 1:e74530ad6b9e 265 if (i<=l) {
va009039 1:e74530ad6b9e 266 push_rs(i);
va009039 1:e74530ad6b9e 267 PPC=peek(PPC);
va009039 1:e74530ad6b9e 268 } else {
va009039 1:e74530ad6b9e 269 pull_rs();
va009039 1:e74530ad6b9e 270 PPC+=2;
va009039 1:e74530ad6b9e 271 }
va009039 1:e74530ad6b9e 272 }
va009039 1:e74530ad6b9e 273
va009039 1:e74530ad6b9e 274 void BaseIPS::c_jeex(void) { // 39
va009039 1:e74530ad6b9e 275 PPC=peek(PPC);
va009039 1:e74530ad6b9e 276 push_rs(pull_ps());
va009039 1:e74530ad6b9e 277 loop_sharedcode((s16)pull_ps());
va009039 1:e74530ad6b9e 278 }
va009039 1:e74530ad6b9e 279
va009039 1:e74530ad6b9e 280 void BaseIPS::c_loopex(void) { // 40
va009039 1:e74530ad6b9e 281 loop_sharedcode((s16)(pull_rs()+1));
va009039 1:e74530ad6b9e 282 }
va009039 1:e74530ad6b9e 283
va009039 1:e74530ad6b9e 284 void BaseIPS::c_plusloopex(void) { // 41
va009039 1:e74530ad6b9e 285 int i;
va009039 1:e74530ad6b9e 286 i=(s16)(pull_rs());
va009039 1:e74530ad6b9e 287 loop_sharedcode(i+(s16)pull_rs());
va009039 1:e74530ad6b9e 288 }
va009039 1:e74530ad6b9e 289
va009039 1:e74530ad6b9e 290 void BaseIPS::c_fieldtrans(void) { // 42
va009039 1:e74530ad6b9e 291 /* note: cannot call memcpy() here, because memcpy()'s behaviour is not defined when source and destination areas overlap */
va009039 1:e74530ad6b9e 292 /* memmove() cannot be used either, because its behaviour for overlap is different from what IPS expects */
va009039 1:e74530ad6b9e 293 int n,d,s,b;
va009039 1:e74530ad6b9e 294 n=pull_ps();
va009039 1:e74530ad6b9e 295 d=pull_ps();
va009039 1:e74530ad6b9e 296 s=pull_ps();
va009039 1:e74530ad6b9e 297 do {
va009039 1:e74530ad6b9e 298 b=peekB(s++);
va009039 1:e74530ad6b9e 299 pokeB(d++,b);
va009039 1:e74530ad6b9e 300 n=(n-1)&0xff;
va009039 1:e74530ad6b9e 301 } while (n);
va009039 1:e74530ad6b9e 302 if (d<=0x400) redraw=1;
va009039 1:e74530ad6b9e 303 idle=0;
va009039 1:e74530ad6b9e 304 }
va009039 1:e74530ad6b9e 305
va009039 1:e74530ad6b9e 306 void BaseIPS::c_pmul(void) { // 43
va009039 1:e74530ad6b9e 307 u32 c = pull_ps() * pull_ps();
va009039 1:e74530ad6b9e 308 push_ps((s16)(c&0xffff));
va009039 1:e74530ad6b9e 309 push_ps(c>>16);
va009039 1:e74530ad6b9e 310 }
va009039 1:e74530ad6b9e 311
va009039 1:e74530ad6b9e 312 void BaseIPS::c_pdiv(void) { // 44
va009039 1:e74530ad6b9e 313 u32 q,n;
va009039 1:e74530ad6b9e 314 u16 d,nh,nl,r;
va009039 1:e74530ad6b9e 315 d=pull_ps();
va009039 1:e74530ad6b9e 316 nh=pull_ps();
va009039 1:e74530ad6b9e 317 nl=pull_ps();
va009039 1:e74530ad6b9e 318 n=(nh<<16)+nl;
va009039 1:e74530ad6b9e 319 if (d==0) { q=0xffff; r=0; }
va009039 1:e74530ad6b9e 320 else {
va009039 1:e74530ad6b9e 321 q=n/d;
va009039 1:e74530ad6b9e 322 r=n%d;
va009039 1:e74530ad6b9e 323 if (q>=0x10000) { q=0xffff; r=0; }
va009039 1:e74530ad6b9e 324 }
va009039 1:e74530ad6b9e 325 push_ps(q);
va009039 1:e74530ad6b9e 326 push_ps(r);
va009039 1:e74530ad6b9e 327 }
va009039 1:e74530ad6b9e 328
va009039 1:e74530ad6b9e 329 void BaseIPS::c_tue(void) { // 45
va009039 1:e74530ad6b9e 330 HP = pull_ps();
va009039 1:e74530ad6b9e 331 }
va009039 1:e74530ad6b9e 332
va009039 1:e74530ad6b9e 333 void BaseIPS::c_polyname(void) { // 46
va009039 1:e74530ad6b9e 334 u32 x,p,d;
va009039 1:e74530ad6b9e 335 d=pull_ps();
va009039 1:e74530ad6b9e 336 x=pull_ps();
va009039 1:e74530ad6b9e 337 p=pull_ps();
va009039 1:e74530ad6b9e 338 x= x | (p&0xff00) | ((p&0xff)<<16);
va009039 1:e74530ad6b9e 339 p = d ^ x ^ (x>>1) ^ (x>>2) ^ (x>>7);
va009039 1:e74530ad6b9e 340 x = x ^ ((p&0xff)<<24);
va009039 1:e74530ad6b9e 341 x >>= 7;
va009039 1:e74530ad6b9e 342 push_ps( (x&0xff00) | ((x>>16)&0xff) );
va009039 1:e74530ad6b9e 343 push_ps( (x&0xff) );
va009039 1:e74530ad6b9e 344 }
va009039 1:e74530ad6b9e 345
va009039 1:e74530ad6b9e 346 void BaseIPS::c_scode(void) { // 47
va009039 1:e74530ad6b9e 347 int i;
va009039 1:e74530ad6b9e 348 u32 nd;
va009039 1:e74530ad6b9e 349 int offs=peek(a_Os);
va009039 1:e74530ad6b9e 350 i=peek(a_NDptr);
va009039 1:e74530ad6b9e 351 nd=peek32(i);
va009039 1:e74530ad6b9e 352 i=peek(a_P3);
va009039 1:e74530ad6b9e 353 while (i) {
va009039 1:e74530ad6b9e 354 i+=offs;
va009039 1:e74530ad6b9e 355 if ( ( (peek32(i) ^ nd) & 0xffffff3f) ==0) {
va009039 1:e74530ad6b9e 356 push_ps(i+6);
va009039 1:e74530ad6b9e 357 return;
va009039 1:e74530ad6b9e 358 }
va009039 1:e74530ad6b9e 359 i=peek(i+4);
va009039 1:e74530ad6b9e 360 }
va009039 1:e74530ad6b9e 361 push_ps(0);
va009039 1:e74530ad6b9e 362 }
va009039 1:e74530ad6b9e 363
va009039 1:e74530ad6b9e 364 void BaseIPS::c_cscan(void) { // 48
va009039 1:e74530ad6b9e 365 int a;
va009039 1:e74530ad6b9e 366 int pi,pe;
va009039 1:e74530ad6b9e 367 int comment=0;
va009039 1:e74530ad6b9e 368 pi=peek(a_PI);
va009039 1:e74530ad6b9e 369 pe=peek(a_PE);
va009039 1:e74530ad6b9e 370
va009039 1:e74530ad6b9e 371 a=pull_ps();
va009039 1:e74530ad6b9e 372 if (a==1) {
va009039 1:e74530ad6b9e 373 while (pi<=pe) {
va009039 1:e74530ad6b9e 374 if (comment) {
va009039 1:e74530ad6b9e 375 if (peekB(pi)==')') comment=0;
va009039 1:e74530ad6b9e 376 } else {
va009039 1:e74530ad6b9e 377 if (peekB(pi)=='(') comment=1;
va009039 1:e74530ad6b9e 378 else if (peekB(pi)!=' ') {
va009039 1:e74530ad6b9e 379 poke(a_PI,pi);
va009039 1:e74530ad6b9e 380 push_ps(1);
va009039 1:e74530ad6b9e 381 return;
va009039 1:e74530ad6b9e 382 }
va009039 1:e74530ad6b9e 383 }
va009039 1:e74530ad6b9e 384 pi++;
va009039 1:e74530ad6b9e 385 }
va009039 1:e74530ad6b9e 386 push_ps(0);
va009039 1:e74530ad6b9e 387 poke(a_P2,1);
va009039 1:e74530ad6b9e 388 return;
va009039 1:e74530ad6b9e 389 } else {
va009039 1:e74530ad6b9e 390 while (pi<=pe) {
va009039 1:e74530ad6b9e 391 if (peekB(pi)==' ') {
va009039 1:e74530ad6b9e 392 break;
va009039 1:e74530ad6b9e 393 }
va009039 1:e74530ad6b9e 394 pi++;
va009039 1:e74530ad6b9e 395 }
va009039 1:e74530ad6b9e 396 poke(a_PI,pi);
va009039 1:e74530ad6b9e 397 push_ps(0);
va009039 1:e74530ad6b9e 398 }
va009039 1:e74530ad6b9e 399 }
va009039 1:e74530ad6b9e 400
va009039 1:e74530ad6b9e 401 void BaseIPS::c_chs(void) { // 49
va009039 1:e74530ad6b9e 402 poke(PS,-(s16)peek(PS));
va009039 1:e74530ad6b9e 403 }
va009039 1:e74530ad6b9e 404
va009039 1:e74530ad6b9e 405 void BaseIPS::c_cyc2(void) { // 50
va009039 1:e74530ad6b9e 406 u32 ch,a,crcc;
va009039 1:e74530ad6b9e 407 int i;
va009039 2:908338b1151a 408
va009039 1:e74530ad6b9e 409 ch=pull_ps();
va009039 1:e74530ad6b9e 410 a=pull_ps();
va009039 1:e74530ad6b9e 411 crcc=(a>>8)|((a&0xff)<<8);
va009039 2:908338b1151a 412
va009039 1:e74530ad6b9e 413 ch<<=8;
va009039 1:e74530ad6b9e 414 for (i=0;i<=7;i++) {
va009039 1:e74530ad6b9e 415 //int test;
va009039 1:e74530ad6b9e 416 //test=(ch^crcc)&0x8000;
va009039 1:e74530ad6b9e 417 crcc<<=1;
va009039 1:e74530ad6b9e 418 ch<<=1;
va009039 1:e74530ad6b9e 419 if ((ch^crcc)&0x10000) crcc^=0x1021;
va009039 1:e74530ad6b9e 420 }
va009039 1:e74530ad6b9e 421
va009039 1:e74530ad6b9e 422 push_ps( ((crcc&0xff)<<8) | ((crcc>>8)&0xff) );
va009039 1:e74530ad6b9e 423 }
va009039 1:e74530ad6b9e 424
va009039 1:e74530ad6b9e 425 void BaseIPS::c_close(void) { // 51
va009039 1:e74530ad6b9e 426 if (inputfile) {
va009039 1:e74530ad6b9e 427 file_close(inputfile);
va009039 1:e74530ad6b9e 428 inputfile = NULL;
va009039 1:e74530ad6b9e 429 }
va009039 1:e74530ad6b9e 430 }
va009039 1:e74530ad6b9e 431
va009039 1:e74530ad6b9e 432 void BaseIPS::c_open(void) { // 52
va009039 1:e74530ad6b9e 433 if (inputfile) {
va009039 1:e74530ad6b9e 434 file_close(inputfile);
va009039 1:e74530ad6b9e 435 }
va009039 2:908338b1151a 436 size_t namelen = pull_ps();
va009039 1:e74530ad6b9e 437 int namestart = pull_ps();
va009039 1:e74530ad6b9e 438 char filename[256];
va009039 2:908338b1151a 439 namelen = std::min(namelen, sizeof(filename)-1);
va009039 2:908338b1151a 440 for(size_t i = 0; i < namelen; i++) {
va009039 1:e74530ad6b9e 441 filename[i] = peekB(namestart + i);
va009039 1:e74530ad6b9e 442 }
va009039 1:e74530ad6b9e 443 filename[namelen] = '\0';
va009039 1:e74530ad6b9e 444 inputfile = file_open(filename);
va009039 1:e74530ad6b9e 445 push_ps(inputfile != NULL ? 1 : 0);
va009039 1:e74530ad6b9e 446 }
va009039 1:e74530ad6b9e 447
va009039 1:e74530ad6b9e 448 void BaseIPS::c_oscli(void) { // 53
va009039 1:e74530ad6b9e 449 error("OSCLI not implemented!");
va009039 1:e74530ad6b9e 450 }
va009039 1:e74530ad6b9e 451
va009039 1:e74530ad6b9e 452 void BaseIPS::c_load(void) { // 54
va009039 1:e74530ad6b9e 453 error("LOAD not implemented!");
va009039 1:e74530ad6b9e 454 }
va009039 1:e74530ad6b9e 455
va009039 1:e74530ad6b9e 456 void BaseIPS::c_save(void) { // 55
va009039 1:e74530ad6b9e 457 int namelen = pull_ps();
va009039 1:e74530ad6b9e 458 int namestart = pull_ps();
va009039 1:e74530ad6b9e 459 int end = pull_ps();
va009039 1:e74530ad6b9e 460 int start = pull_ps();
va009039 1:e74530ad6b9e 461
va009039 1:e74530ad6b9e 462 char filename[256];
va009039 1:e74530ad6b9e 463 if (namelen > 255) namelen = 255;
va009039 1:e74530ad6b9e 464 for(int i = 0; i < namelen; i++) {
va009039 1:e74530ad6b9e 465 filename[i] = peekB(namestart + i);
va009039 1:e74530ad6b9e 466 }
va009039 1:e74530ad6b9e 467 filename[namelen] = 0;
va009039 1:e74530ad6b9e 468
va009039 1:e74530ad6b9e 469 void* fh = file_open(filename, "wb");
va009039 1:e74530ad6b9e 470 if (fh == NULL) {
va009039 1:e74530ad6b9e 471 push_ps(0);
va009039 1:e74530ad6b9e 472 return;
va009039 1:e74530ad6b9e 473 }
va009039 1:e74530ad6b9e 474 for(int i = start; i < end; i++) {
va009039 1:e74530ad6b9e 475 file_putc(peekB(i), fh);
va009039 1:e74530ad6b9e 476 }
va009039 1:e74530ad6b9e 477 file_close(fh);
va009039 1:e74530ad6b9e 478 push_ps(1);
va009039 1:e74530ad6b9e 479 }
va009039 1:e74530ad6b9e 480
va009039 1:e74530ad6b9e 481 void BaseIPS::c_setkbptr(void) { // 56
va009039 1:e74530ad6b9e 482 input_ptr = pull_ps() & 0x3ff;
va009039 1:e74530ad6b9e 483 }
va009039 1:e74530ad6b9e 484
va009039 1:e74530ad6b9e 485 void BaseIPS::c_getPS(void) { // 57
va009039 1:e74530ad6b9e 486 push_ps(PS);
va009039 1:e74530ad6b9e 487 }
va009039 1:e74530ad6b9e 488
va009039 1:e74530ad6b9e 489 void BaseIPS::c_setPS(void) { // 58
va009039 1:e74530ad6b9e 490 PS=pull_ps();
va009039 1:e74530ad6b9e 491 }
va009039 1:e74530ad6b9e 492
va009039 2:908338b1151a 493 #ifndef NO_MATH
va009039 1:e74530ad6b9e 494 void BaseIPS::c_rp_code(void) { // 59
va009039 1:e74530ad6b9e 495 double theta,x,y,r;
va009039 1:e74530ad6b9e 496 pull_ps();
va009039 1:e74530ad6b9e 497 y=(s16)pull_ps();
va009039 1:e74530ad6b9e 498 x=(s16)pull_ps();
va009039 1:e74530ad6b9e 499 theta=((s16)pull_ps())/10430.38; /* convert to radians */
va009039 1:e74530ad6b9e 500 theta+=atan2(y,x);
va009039 1:e74530ad6b9e 501 r=sqrt(x*x+y*y)*1.6468;
va009039 1:e74530ad6b9e 502 push_ps(Round(theta*10430.38));
va009039 1:e74530ad6b9e 503 push_ps((int)(r+0.5));
va009039 1:e74530ad6b9e 504 push_ps(0);
va009039 1:e74530ad6b9e 505 }
va009039 1:e74530ad6b9e 506
va009039 1:e74530ad6b9e 507 void BaseIPS::c_tr_code(void) { // 60
va009039 1:e74530ad6b9e 508 double theta,x,y,r;
va009039 1:e74530ad6b9e 509 pull_ps();
va009039 1:e74530ad6b9e 510 y=(s16)pull_ps();
va009039 1:e74530ad6b9e 511 x=(s16)pull_ps();
va009039 1:e74530ad6b9e 512 theta=((s16)pull_ps())/10430.38; /* convert to radians */
va009039 1:e74530ad6b9e 513 theta+=atan2(y,x);
va009039 1:e74530ad6b9e 514 r=sqrt(x*x+y*y)*1.6468;
va009039 1:e74530ad6b9e 515 push_ps(0);
va009039 1:e74530ad6b9e 516 push_ps(Round(r*cos(theta)));
va009039 1:e74530ad6b9e 517 push_ps(Round(r*sin(theta)));
va009039 1:e74530ad6b9e 518 }
va009039 2:908338b1151a 519 #else
va009039 2:908338b1151a 520 void BaseIPS::c_rp_code(void) {
va009039 2:908338b1151a 521 error("c_rp_code not implemented!\n");
va009039 2:908338b1151a 522 }
va009039 2:908338b1151a 523 void BaseIPS::c_tr_code(void) {
va009039 2:908338b1151a 524 error("c_tr_code not implemented!\n");
va009039 2:908338b1151a 525 }
va009039 2:908338b1151a 526 #endif
va009039 1:e74530ad6b9e 527
va009039 1:e74530ad6b9e 528 void BaseIPS::c_swap3(void) { // 61
va009039 1:e74530ad6b9e 529 u16 h;
va009039 1:e74530ad6b9e 530 h=peek(PS+6); poke(PS+6,peek(PS)); poke(PS,h);
va009039 1:e74530ad6b9e 531 h=peek(PS+8); poke(PS+8,peek(PS+2)); poke(PS+2,h);
va009039 1:e74530ad6b9e 532 h=peek(PS+10); poke(PS+10,peek(PS+4)); poke(PS+4,h);
va009039 1:e74530ad6b9e 533 }
va009039 1:e74530ad6b9e 534
va009039 1:e74530ad6b9e 535 void BaseIPS::c_defchar(void) { // 62
va009039 1:e74530ad6b9e 536 error("DEFCHAR not implemented!\n");
va009039 1:e74530ad6b9e 537 }
va009039 1:e74530ad6b9e 538
va009039 1:e74530ad6b9e 539 void BaseIPS::c_pplus(void) { // 63
va009039 1:e74530ad6b9e 540 u32 h=pull_ps();
va009039 1:e74530ad6b9e 541 u32 b=(h<<16)+pull_ps();
va009039 1:e74530ad6b9e 542 h=pull_ps();
va009039 1:e74530ad6b9e 543 u32 a=(h<<16)+pull_ps();
va009039 1:e74530ad6b9e 544 u32 c=a+b;
va009039 1:e74530ad6b9e 545 push_ps(c&0xffff);
va009039 1:e74530ad6b9e 546 push_ps(c>>16);
va009039 1:e74530ad6b9e 547 }
va009039 1:e74530ad6b9e 548
va009039 1:e74530ad6b9e 549 void BaseIPS::c_pminus(void) { // 64
va009039 1:e74530ad6b9e 550 u32 h = pull_ps();
va009039 1:e74530ad6b9e 551 u32 b = (h<<16)+pull_ps();
va009039 1:e74530ad6b9e 552 h = pull_ps();
va009039 1:e74530ad6b9e 553 u32 a = (h<<16)+pull_ps();
va009039 1:e74530ad6b9e 554 u32 c = a - b;
va009039 1:e74530ad6b9e 555 push_ps(c&0xffff);
va009039 1:e74530ad6b9e 556 push_ps(c>>16);
va009039 1:e74530ad6b9e 557 }
va009039 1:e74530ad6b9e 558
va009039 1:e74530ad6b9e 559 void BaseIPS::do_20ms(void) {
va009039 1:e74530ad6b9e 560 pokeB(UHR, peekB(UHR) + 2); // 20ms
va009039 1:e74530ad6b9e 561 if (peekB(UHR) == 100) {
va009039 1:e74530ad6b9e 562 pokeB(UHR, 0);
va009039 1:e74530ad6b9e 563 pokeB(UHR+1, peekB(UHR+1) + 1);
va009039 1:e74530ad6b9e 564 if (peekB(UHR+1) == 60) {
va009039 1:e74530ad6b9e 565 pokeB(UHR+1, 0);
va009039 1:e74530ad6b9e 566 pokeB(UHR+2, peekB(UHR+2) + 1);
va009039 1:e74530ad6b9e 567 if (peekB(UHR+2) == 60) {
va009039 1:e74530ad6b9e 568 pokeB(UHR+2, 0);
va009039 1:e74530ad6b9e 569 pokeB(UHR+3, peekB(UHR+3) + 1);
va009039 1:e74530ad6b9e 570 if (peekB(UHR+3) == 24) {
va009039 1:e74530ad6b9e 571 pokeB(UHR+3, 0);
va009039 1:e74530ad6b9e 572 poke(UHR+4, peek(UHR+4) + 1);
va009039 1:e74530ad6b9e 573 }
va009039 1:e74530ad6b9e 574 }
va009039 1:e74530ad6b9e 575 }
va009039 1:e74530ad6b9e 576 }
va009039 1:e74530ad6b9e 577
va009039 1:e74530ad6b9e 578 const int sus[4]={SU0,SU1,SU2,SU3};
va009039 1:e74530ad6b9e 579 for (int i = 0; i < 4; i++) {
va009039 1:e74530ad6b9e 580 int su=sus[i];
va009039 1:e74530ad6b9e 581 if ((peekB(su)&1) == 0) {
va009039 1:e74530ad6b9e 582 if (peekB(su) != 0) {
va009039 1:e74530ad6b9e 583 pokeB(su, peekB(su) - 2);
va009039 1:e74530ad6b9e 584 } else {
va009039 1:e74530ad6b9e 585 if (peekB(su+1) != 0) {
va009039 1:e74530ad6b9e 586 pokeB(su, 98);
va009039 1:e74530ad6b9e 587 pokeB(su+1, peekB(su+1) - 1);
va009039 1:e74530ad6b9e 588 } else {
va009039 1:e74530ad6b9e 589 if (peekB(su+2) != 0) {
va009039 1:e74530ad6b9e 590 pokeB(su+1, 59);
va009039 1:e74530ad6b9e 591 pokeB(su+2, peekB(su+2) - 1);
va009039 1:e74530ad6b9e 592 } else {
va009039 1:e74530ad6b9e 593 if (peekB(su+3) != 0) {
va009039 1:e74530ad6b9e 594 pokeB(su+2, 255);
va009039 1:e74530ad6b9e 595 pokeB(su+3, peekB(su+3) - 1);
va009039 1:e74530ad6b9e 596 } else {
va009039 1:e74530ad6b9e 597 pokeB(su, 1);
va009039 1:e74530ad6b9e 598 }
va009039 1:e74530ad6b9e 599 }
va009039 1:e74530ad6b9e 600 }
va009039 1:e74530ad6b9e 601 }
va009039 1:e74530ad6b9e 602 }
va009039 1:e74530ad6b9e 603 }
va009039 1:e74530ad6b9e 604 }
va009039 1:e74530ad6b9e 605
va009039 1:e74530ad6b9e 606 void BaseIPS::read_inputfile(void) {
va009039 1:e74530ad6b9e 607 for(int i = 0x200; i < 0x400; i++) {
va009039 1:e74530ad6b9e 608 pokeB(i, ' ');
va009039 1:e74530ad6b9e 609 }
va009039 1:e74530ad6b9e 610
va009039 1:e74530ad6b9e 611 do {
va009039 1:e74530ad6b9e 612 int ch = file_getc(inputfile);
va009039 2:908338b1151a 613 if (ch<1) {
va009039 1:e74530ad6b9e 614 if (input_ptr == peek(a_PI)) {
va009039 2:908338b1151a 615 file_close(inputfile);
va009039 2:908338b1151a 616 inputfile = NULL;
va009039 2:908338b1151a 617 pokeB(LOADFLAG, 0);
va009039 1:e74530ad6b9e 618 input_ptr = 0x200;
va009039 1:e74530ad6b9e 619 }
va009039 2:908338b1151a 620 break;
va009039 1:e74530ad6b9e 621 }
va009039 1:e74530ad6b9e 622 if (ch=='\r') {
va009039 1:e74530ad6b9e 623 /* ignore \r, we expect at least also a \n as end-of-line */
va009039 1:e74530ad6b9e 624 } else if (ch=='\n') {
va009039 1:e74530ad6b9e 625 input_ptr=(input_ptr&0xffc0)+64;
va009039 1:e74530ad6b9e 626 } else {
va009039 1:e74530ad6b9e 627 pokeB(input_ptr++,ch);
va009039 1:e74530ad6b9e 628 }
va009039 1:e74530ad6b9e 629 } while (input_ptr<1024 && inputfile); /* 1024 = TVE */
va009039 1:e74530ad6b9e 630
va009039 1:e74530ad6b9e 631 if (input_ptr!=peek(a_PI)) {
va009039 1:e74530ad6b9e 632 pokeB(READYFLAG,1);
va009039 1:e74530ad6b9e 633 poke(a_PE,input_ptr-1);
va009039 1:e74530ad6b9e 634 idle=0;
va009039 1:e74530ad6b9e 635 }
va009039 1:e74530ad6b9e 636 }
va009039 1:e74530ad6b9e 637
va009039 1:e74530ad6b9e 638 void BaseIPS::emulator() {
va009039 1:e74530ad6b9e 639 PPC = 0x0400;
va009039 1:e74530ad6b9e 640 input_ptr = peek(a_PI);
va009039 1:e74530ad6b9e 641 while(1) {
va009039 1:e74530ad6b9e 642 HP = peek(PPC);
va009039 1:e74530ad6b9e 643 PPC += 2;
va009039 1:e74530ad6b9e 644 exec: u16 CPC = peek(HP);
va009039 1:e74530ad6b9e 645 HP += 2;
va009039 1:e74530ad6b9e 646 trace(cycle++, PPC-2, HP-2, CPC, PS, RS);
va009039 1:e74530ad6b9e 647 switch(CPC) {
va009039 2:908338b1151a 648 case 0: c_rumpelstilzchen(); break;
va009039 1:e74530ad6b9e 649 case 1: c_defex(); break;
va009039 1:e74530ad6b9e 650 case 2: c_consex(); break;
va009039 1:e74530ad6b9e 651 case 3: c_varex(); break;
va009039 1:e74530ad6b9e 652 case 4: c_retex(); break;
va009039 1:e74530ad6b9e 653 case 5: c_get(); break;
va009039 1:e74530ad6b9e 654 case 6: c_getB(); break;
va009039 1:e74530ad6b9e 655 case 7: c_put(); break;
va009039 1:e74530ad6b9e 656 case 8: c_putB(); break;
va009039 1:e74530ad6b9e 657 case 9: c_1bliteral(); break;
va009039 1:e74530ad6b9e 658 case 10: c_2bliteral(); break;
va009039 1:e74530ad6b9e 659 case 11: c_bronz(); break;
va009039 1:e74530ad6b9e 660 case 12: c_jump(); break;
va009039 1:e74530ad6b9e 661 case 13: c_weg(); break;
va009039 1:e74530ad6b9e 662 case 14: c_pweg(); break;
va009039 1:e74530ad6b9e 663 case 15: c_plus(); break;
va009039 1:e74530ad6b9e 664 case 16: c_minus(); break;
va009039 1:e74530ad6b9e 665 case 17: c_dup(); break;
va009039 1:e74530ad6b9e 666 case 18: c_pdup(); break;
va009039 1:e74530ad6b9e 667 case 19: c_vert(); break;
va009039 1:e74530ad6b9e 668 case 20: c_zwo(); break;
va009039 1:e74530ad6b9e 669 case 21: c_rdu(); break;
va009039 1:e74530ad6b9e 670 case 22: c_rdo(); break;
va009039 1:e74530ad6b9e 671 case 23: c_index(); break;
va009039 1:e74530ad6b9e 672 case 24: c_s_to_r(); break;
va009039 1:e74530ad6b9e 673 case 25: c_r_to_s(); break;
va009039 1:e74530ad6b9e 674 case 26: c_eqz(); break;
va009039 1:e74530ad6b9e 675 case 27: c_gz(); break;
va009039 1:e74530ad6b9e 676 case 28: c_lz(); break;
va009039 1:e74530ad6b9e 677 case 29: c_geu(); break;
va009039 1:e74530ad6b9e 678 case 30: c_f_vergl(); break;
va009039 1:e74530ad6b9e 679 case 31: c_nicht(); break;
va009039 1:e74530ad6b9e 680 case 32: c_und(); break;
va009039 1:e74530ad6b9e 681 case 33: c_oder(); break;
va009039 1:e74530ad6b9e 682 case 34: c_exo(); break;
va009039 1:e74530ad6b9e 683 case 35: c_bit(); break;
va009039 1:e74530ad6b9e 684 case 36: c_cbit(); break;
va009039 1:e74530ad6b9e 685 case 37: c_sbit(); break;
va009039 1:e74530ad6b9e 686 case 38: c_tbit(); break;
va009039 1:e74530ad6b9e 687 case 39: c_jeex(); break;
va009039 1:e74530ad6b9e 688 case 40: c_loopex(); break;
va009039 1:e74530ad6b9e 689 case 41: c_plusloopex(); break;
va009039 1:e74530ad6b9e 690 case 42: c_fieldtrans(); break;
va009039 1:e74530ad6b9e 691 case 43: c_pmul(); break;
va009039 1:e74530ad6b9e 692 case 44: c_pdiv(); break;
va009039 1:e74530ad6b9e 693 case 45: c_tue(); goto exec;
va009039 1:e74530ad6b9e 694 case 46: c_polyname(); break;
va009039 1:e74530ad6b9e 695 case 47: c_scode(); break;
va009039 1:e74530ad6b9e 696 case 48: c_cscan(); break;
va009039 1:e74530ad6b9e 697 case 49: c_chs(); break;
va009039 1:e74530ad6b9e 698 case 50: c_cyc2(); break;
va009039 1:e74530ad6b9e 699 case 51: c_close(); break;
va009039 1:e74530ad6b9e 700 case 52: c_open(); break;
va009039 1:e74530ad6b9e 701 case 53: c_oscli(); break;
va009039 1:e74530ad6b9e 702 case 54: c_load(); break;
va009039 1:e74530ad6b9e 703 case 55: c_save(); break;
va009039 1:e74530ad6b9e 704 case 56: c_setkbptr(); break;
va009039 1:e74530ad6b9e 705 case 57: c_getPS(); break;
va009039 1:e74530ad6b9e 706 case 58: c_setPS(); break;
va009039 1:e74530ad6b9e 707 case 59: c_rp_code(); break;
va009039 1:e74530ad6b9e 708 case 60: c_tr_code(); break;
va009039 1:e74530ad6b9e 709 case 61: c_swap3(); break;
va009039 1:e74530ad6b9e 710 case 62: c_defchar(); break;
va009039 1:e74530ad6b9e 711 case 63: c_pplus(); break;
va009039 1:e74530ad6b9e 712 case 64: c_pminus(); break;
va009039 2:908338b1151a 713 default: usercode(CPC); break;
va009039 1:e74530ad6b9e 714 }
va009039 1:e74530ad6b9e 715 do_io();
va009039 1:e74530ad6b9e 716 if (test_20ms()) {
va009039 1:e74530ad6b9e 717 do_20ms();
va009039 1:e74530ad6b9e 718 }
va009039 1:e74530ad6b9e 719 if (inputfile) {
va009039 1:e74530ad6b9e 720 if (!(peekB(READYFLAG)&1) && (peekB(LOADFLAG)&1)) {
va009039 1:e74530ad6b9e 721 read_inputfile();
va009039 1:e74530ad6b9e 722 }
va009039 1:e74530ad6b9e 723 }
va009039 1:e74530ad6b9e 724 }
va009039 1:e74530ad6b9e 725 }
va009039 1:e74530ad6b9e 726
va009039 1:e74530ad6b9e 727 void BaseIPS::load_image(const u8* image, int size) {
va009039 1:e74530ad6b9e 728 for(int i = 0; i < size; i++) {
va009039 1:e74530ad6b9e 729 pokeB(i, *image++);
va009039 1:e74530ad6b9e 730 }
va009039 1:e74530ad6b9e 731 }
va009039 1:e74530ad6b9e 732
va009039 1:e74530ad6b9e 733 void BaseIPS::command(const char* s) {
va009039 1:e74530ad6b9e 734 if (s) {
va009039 1:e74530ad6b9e 735 int cmd_len = strlen(s);
va009039 1:e74530ad6b9e 736 for(int i = 0; i < cmd_len; i++) {
va009039 1:e74530ad6b9e 737 pokeB(i + 64*8, *s++);
va009039 1:e74530ad6b9e 738 }
va009039 1:e74530ad6b9e 739 poke(a_PE, 0x200 + cmd_len);
va009039 1:e74530ad6b9e 740 pokeB(READYFLAG, 1);
va009039 1:e74530ad6b9e 741 }
va009039 1:e74530ad6b9e 742 }
va009039 1:e74530ad6b9e 743
va009039 1:e74530ad6b9e 744