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:
Wed May 13 18:39:01 2015 +0900
Revision:
1:e74530ad6b9e
Child:
2:908338b1151a
add L152RE.

Who changed what in which revision?

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