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
- ips-02.tgz - ips for linux/unix
- ipsdoc.zip - document
- https://bitbucket.org/va009039/ips/
BaseIPS.cpp@1:e74530ad6b9e, 2015-05-13 (annotated)
- 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?
User | Revision | Line number | New 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 |