annotate emu52/iset.lst @ 42:792da050d8c4 tip

more dox
author james <jb302@eecs.qmul.ac.uk>
date Tue, 22 Apr 2014 14:25:14 +0100
parents 8205f1734ff2
children
rev   line source
jb302@36 1 C51 COMPILER V9.02 ISET 04/17/2014 15:17:32 PAGE 1
jb302@36 2
jb302@36 3
jb302@36 4 C51 COMPILER V9.02, COMPILATION OF MODULE ISET
jb302@36 5 OBJECT MODULE PLACED IN iset.obj
jb302@36 6 COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE src\iset.c OMF2 BROWSE DEBUG PRINT(.\iset.lst) OBJECT(iset.obj)
jb302@36 7
jb302@36 8 line level source
jb302@36 9
jb302@36 10 1 /* iset.c
jb302@36 11 2 * IR functions */
jb302@36 12 3 #include "iset.h"
jb302@36 13 4 #include "mem.h"
jb302@36 14 5
jb302@36 15 6 /* useful macros */
jb302@36 16 7 #define NNN (IR & 0x07)
jb302@36 17 8 #define MMM ((IR & 0x38) >> 3)
jb302@36 18 9
jb302@36 19 10 /* 0x00 - NOP */
jb302@36 20 11 void
jb302@36 21 12 NOP(void) {
jb302@36 22 13 1 }
jb302@36 23 14
jb302@36 24 15 /* 0x08 - SET C
jb302@36 25 16 * 0x0A - SET BS
jb302@36 26 17 * 0x0C - SET IE */
jb302@36 27 18 void
jb302@36 28 19 SET(void) {
jb302@36 29 20 1 switch (IR) {
jb302@36 30 21 2
jb302@36 31 22 2 case 0x08:
jb302@36 32 23 2 set_flag(C, 0x01);
jb302@36 33 24 2 break;
jb302@36 34 25 2
jb302@36 35 26 2 case 0x0A:
jb302@36 36 27 2 set_flag(BS, 0x01);
jb302@36 37 28 2 break;
jb302@36 38 29 2
jb302@36 39 30 2 case 0x0C:
jb302@36 40 31 2 set_flag(IE, 0x01);
jb302@36 41 32 2 break;
jb302@36 42 33 2
jb302@36 43 34 2 default:
jb302@36 44 35 2 break;
jb302@36 45 36 2 }
jb302@36 46 37 1 }
jb302@36 47 38
jb302@36 48 39 /* 0x09 - CLR C
jb302@36 49 40 * 0x0B - CLR BS
jb302@36 50 41 * 0x0D - CLR IE */
jb302@36 51 42 void
jb302@36 52 43 CLR(void) {
jb302@36 53 44 1 switch (IR) {
jb302@36 54 45 2
jb302@36 55 46 2 case 0x09:
jb302@36 56 47 2 set_flag(C, 0x00);
jb302@36 57 48 2 break;
jb302@36 58 49 2
jb302@36 59 50 2 case 0x0B:
jb302@36 60 51 2 set_flag(BS, 0x00);
jb302@36 61 52 2 break;
jb302@36 62 53 2
jb302@36 63 54 2 case 0x0D:
jb302@36 64 55 2 set_flag(IE, 0x00);
jb302@36 65 C51 COMPILER V9.02 ISET 04/17/2014 15:17:32 PAGE 2
jb302@36 66
jb302@36 67 56 2 break;
jb302@36 68 57 2
jb302@36 69 58 2 default:
jb302@36 70 59 2 break;
jb302@36 71 60 2 }
jb302@36 72 61 1 }
jb302@36 73 62
jb302@36 74 63 /* 0x0E - CPL C
jb302@36 75 64 * 0x0F - CPL A */
jb302@36 76 65 void
jb302@36 77 66 CPL(void) {
jb302@36 78 67 1 switch (IR) {
jb302@36 79 68 2
jb302@36 80 69 2 case 0x0E:
jb302@36 81 70 2 if (get_flag(C) == 0) {
jb302@36 82 71 3 set_flag(C, 0x01);
jb302@36 83 72 3 }
jb302@36 84 73 2 else {
jb302@36 85 74 3 set_flag(C, 0x00);
jb302@36 86 75 3 }
jb302@36 87 76 2
jb302@36 88 77 2 case 0x0F:
jb302@36 89 78 2 A = ~A;
jb302@36 90 79 2 break;
jb302@36 91 80 2
jb302@36 92 81 2 default:
jb302@36 93 82 2 break;
jb302@36 94 83 2 }
jb302@36 95 84 1 }
jb302@36 96 85
jb302@36 97 86 /* 0x10 - XCSD */
jb302@36 98 87 void
jb302@36 99 88 XCSD(void) {
jb302@36 100 89 1 tmpw = get_wide(SP);
jb302@36 101 90 1 set_wide(SP, get_wide(DPTR));
jb302@36 102 91 1 set_wide(DPTR, tmpw);
jb302@36 103 92 1 }
jb302@36 104 93
jb302@36 105 94 /* 0x11 - SFA */
jb302@36 106 95 void
jb302@36 107 96 SFA(void) {
jb302@36 108 97 1 A = flags;
jb302@36 109 98 1 }
jb302@36 110 99
jb302@36 111 100 /* 0x12 - LAF */
jb302@36 112 101 void
jb302@36 113 102 LAF(void) {
jb302@36 114 103 1 flags = A;
jb302@36 115 104 1 }
jb302@36 116 105
jb302@36 117 106 /* 0b00010XXX - special MOVs
jb302@36 118 107 * 0b00011XXX - direct, indirect and indexed MOVs
jb302@36 119 108 * 0b00100nnn - register-indirect MOVs - MOV @DPTR, Rn
jb302@36 120 109 * 0b00101nnn - immediate movs - MOV Rn, #data8
jb302@36 121 110 * 0b00110nnn - MOV Rn, A
jb302@36 122 111 * 0b00111nnn - MOV A, Rn
jb302@36 123 112 * 0b01mmmnnn - 64 register move instructions
jb302@36 124 113 *
jb302@36 125 114 * this is a mess */
jb302@36 126 115 void
jb302@36 127 116 MOV(void) {
jb302@36 128 117 1 switch (IR & 0x40) {
jb302@36 129 C51 COMPILER V9.02 ISET 04/17/2014 15:17:32 PAGE 3
jb302@36 130
jb302@36 131 118 2
jb302@36 132 119 2 case 0x00:
jb302@36 133 120 2 switch (IR & 0xF8) {
jb302@36 134 121 3
jb302@36 135 122 3 /* 0b00010XXX - special MOVs*/
jb302@36 136 123 3 case 0x10:
jb302@36 137 124 3 switch (NNN) {
jb302@36 138 125 4
jb302@36 139 126 4 /* MOV DPTR, SP */
jb302@36 140 127 4 case 3:
jb302@36 141 128 4 set_wide(DPTR, get_wide(SP));
jb302@36 142 129 4 break;
jb302@36 143 130 4
jb302@36 144 131 4 /* MOV SP, DPTR */
jb302@36 145 132 4 case 4:
jb302@36 146 133 4 set_wide(SP, get_wide(DPTR));
jb302@36 147 134 4 break;
jb302@36 148 135 4
jb302@36 149 136 4 /* MOV A, #data8 */
jb302@36 150 137 4 case 5:
jb302@36 151 138 4 A = fetch();
jb302@36 152 139 4 break;
jb302@36 153 140 4
jb302@36 154 141 4 /* MOV SP, #data16 */
jb302@36 155 142 4 case 6:
jb302@36 156 143 4 set_wide(SP, fetch_wide());
jb302@36 157 144 4 break;
jb302@36 158 145 4
jb302@36 159 146 4 /* MOV DPTR, #data16 */
jb302@36 160 147 4 case 7:
jb302@36 161 148 4 set_wide(DPTR, fetch_wide());
jb302@36 162 149 4 break;
jb302@36 163 150 4
jb302@36 164 151 4 default:
jb302@36 165 152 4 break;
jb302@36 166 153 4 }
jb302@36 167 154 3 break;
jb302@36 168 155 3
jb302@36 169 156 3 /* 0b00011XXX - direct, indirect and indexed MOVs*/
jb302@36 170 157 3 case 0x18:
jb302@36 171 158 3 switch (NNN) {
jb302@36 172 159 4
jb302@36 173 160 4 /* MOV A, addr16 */
jb302@36 174 161 4 case 0:
jb302@36 175 162 4 set_wide(TMP, fetch_wide());
jb302@36 176 163 4 A = mem[get_wide(TMP)];
jb302@36 177 164 4 break;
jb302@36 178 165 4
jb302@36 179 166 4 /* MOV addr16, A */
jb302@36 180 167 4 case 1:
jb302@36 181 168 4 set_wide(TMP, fetch_wide());
jb302@36 182 169 4 mem[get_wide(TMP)] = A;
jb302@36 183 170 4 break;
jb302@36 184 171 4
jb302@36 185 172 4 /* MOV A, @A+DPTR */
jb302@36 186 173 4 case 2:
jb302@36 187 174 4 set_wide(TMP, A + get_wide(DPTR));
jb302@36 188 175 4 A = mem[get_wide(TMP)];
jb302@36 189 176 4 break;
jb302@36 190 177 4
jb302@36 191 178 4 /* MOV A, @A+PC */
jb302@36 192 179 4 case 3:
jb302@36 193 C51 COMPILER V9.02 ISET 04/17/2014 15:17:32 PAGE 4
jb302@36 194
jb302@36 195 180 4 set_wide(TMP, A + get_wide(PC));
jb302@36 196 181 4 A = mem[TMP];
jb302@36 197 182 4 break;
jb302@36 198 183 4
jb302@36 199 184 4 /* MOV A, @addr16 */
jb302@36 200 185 4 case 4:
jb302@36 201 186 4 set_wide(TMP, fetch_wide());
jb302@36 202 187 4 A = mem[mem[get_wide(TMP)]];
jb302@36 203 188 4 break;
jb302@36 204 189 4
jb302@36 205 190 4 /* MOV @addr16, A */
jb302@36 206 191 4 case 5:
jb302@36 207 192 4 set_wide(TMP, fetch_wide());
jb302@36 208 193 4 mem[mem[get_wide(TMP)]] = A;
jb302@36 209 194 4 break;
jb302@36 210 195 4
jb302@36 211 196 4 /* MOV A, @DPTR */
jb302@36 212 197 4 case 6:
jb302@36 213 198 4 set_wide(TMP, get_wide(DPTR));
jb302@36 214 199 4 A = mem[get_wide(TMP)];
jb302@36 215 200 4 break;
jb302@36 216 201 4
jb302@36 217 202 4 /* MOV @DPTR, A */
jb302@36 218 203 4 case 7:
jb302@36 219 204 4 set_wide(TMP, get_wide(DPTR));
jb302@36 220 205 4 mem[get_wide(TMP)] = A;
jb302@36 221 206 4 break;
jb302@36 222 207 4
jb302@36 223 208 4 default:
jb302@36 224 209 4 break;
jb302@36 225 210 4 }
jb302@36 226 211 3 break;
jb302@36 227 212 3
jb302@36 228 213 3 /* 0b00100nnn - MOV @DPTR, Rn*/
jb302@36 229 214 3 case 0x20:
jb302@36 230 215 3 set_wide(TMP, get_wide(DPTR));
jb302@36 231 216 3 mem[get_wide(TMP)] = get_reg(NNN);
jb302@36 232 217 3 break;
jb302@36 233 218 3
jb302@36 234 219 3 /* 0b00101nnn - immediate movs - MOV Rn, #data8*/
jb302@36 235 220 3 case 0x28:
jb302@36 236 221 3 set_reg(NNN, fetch());
jb302@36 237 222 3 break;
jb302@36 238 223 3
jb302@36 239 224 3 /* 0b00110nnn - MOV Rn, A */
jb302@36 240 225 3 case 0x30:
jb302@36 241 226 3 set_reg(NNN, A);
jb302@36 242 227 3 break;
jb302@36 243 228 3
jb302@36 244 229 3 /* 0b00111nnn MOV A, Rn */
jb302@36 245 230 3 case 0x38:
jb302@36 246 231 3 A = get_reg(NNN);
jb302@36 247 232 3 break;
jb302@36 248 233 3
jb302@36 249 234 3 default:
jb302@36 250 235 3 break;
jb302@36 251 236 3 }
jb302@36 252 237 2 break;;
jb302@36 253 238 2
jb302@36 254 239 2 /* 0b01mmmnnn MOV Rm Rn
jb302@36 255 240 2 * if m == n: MOV Rm, @DPTR */
jb302@36 256 241 2 case 0x40:
jb302@36 257 C51 COMPILER V9.02 ISET 04/17/2014 15:17:32 PAGE 5
jb302@36 258
jb302@36 259 242 2 if (NNN == MMM) {
jb302@36 260 243 3 set_wide(TMP, get_wide(DPTR));
jb302@36 261 244 3 set_reg(NNN, mem[get_wide(TMP)]);
jb302@36 262 245 3 }
jb302@36 263 246 2 else {
jb302@36 264 247 3 set_reg(MMM, get_reg(NNN));
jb302@36 265 248 3 }
jb302@36 266 249 2 break;
jb302@36 267 250 2
jb302@36 268 251 2 default:
jb302@36 269 252 2 break;
jb302@36 270 253 2 }
jb302@36 271 254 1 }
jb302@36 272 255
jb302@36 273 256
jb302@36 274 257 /* 0x80 - ANL A, R0
jb302@36 275 258 * 0x81 - ANL A, R1
jb302@36 276 259 * 0x82 - ANL A, R2
jb302@36 277 260 * 0x83 - ANL A, R3
jb302@36 278 261 * 0x84 - ANL A, DPH
jb302@36 279 262 * 0x85 - ANL A, DPL
jb302@36 280 263 * 0x86 - ANL A, #data8
jb302@36 281 264 * 0x87 - ANL A, @DPTR */
jb302@36 282 265 void
jb302@36 283 266 ANL(void) {
jb302@36 284 267 1 if (NNN < 6) {
jb302@36 285 268 2 A = A & get_reg(NNN);
jb302@36 286 269 2 }
jb302@36 287 270 1 else {
jb302@36 288 271 2 switch (NNN) {
jb302@36 289 272 3
jb302@36 290 273 3 case 6:
jb302@36 291 274 3 A = A & fetch();
jb302@36 292 275 3 break;
jb302@36 293 276 3
jb302@36 294 277 3 case 7:
jb302@36 295 278 3 set_wide(TMP, get_wide(DPTR));
jb302@36 296 279 3 A = A & mem[TMP];
jb302@36 297 280 3 break;
jb302@36 298 281 3 }
jb302@36 299 282 2 }
jb302@36 300 283 1 set_zp(A);
jb302@36 301 284 1 }
jb302@36 302 285
jb302@36 303 286 /* 0x88 - ORL A, R0
jb302@36 304 287 * 0x89 - ORL A, R1
jb302@36 305 288 * 0x8A - ORL A, R2
jb302@36 306 289 * 0x8B - ORL A, R3
jb302@36 307 290 * 0x8C - ORL A, DPH
jb302@36 308 291 * 0x8D - ORL A, DPL
jb302@36 309 292 * 0x8E - ORL A, #data8
jb302@36 310 293 * 0x8F - ORL A, @DPTR */
jb302@36 311 294 void
jb302@36 312 295 ORL(void) {
jb302@36 313 296 1 if (NNN < 6) {
jb302@36 314 297 2 A = A | get_reg(NNN);
jb302@36 315 298 2 }
jb302@36 316 299 1 else {
jb302@36 317 300 2 switch (NNN) {
jb302@36 318 301 3
jb302@36 319 302 3 case 6:
jb302@36 320 303 3 A = A | fetch();
jb302@36 321 C51 COMPILER V9.02 ISET 04/17/2014 15:17:32 PAGE 6
jb302@36 322
jb302@36 323 304 3 break;
jb302@36 324 305 3
jb302@36 325 306 3 case 7:
jb302@36 326 307 3 set_wide(TMP, get_wide(DPTR));
jb302@36 327 308 3 A = A | mem[TMP];
jb302@36 328 309 3 break;
jb302@36 329 310 3 }
jb302@36 330 311 2 }
jb302@36 331 312 1 set_zp(A);
jb302@36 332 313 1 }
jb302@36 333 314
jb302@36 334 315 /* 0x90 - XRL A, R0
jb302@36 335 316 * 0x91 - XRL A, R1
jb302@36 336 317 * 0x92 - XRL A, R2
jb302@36 337 318 * 0x93 - XRL A, R3
jb302@36 338 319 * 0x94 - XRL A, DPH
jb302@36 339 320 * 0x95 - XRL A, DPL
jb302@36 340 321 * 0x96 - XRL A, #data8
jb302@36 341 322 * 0x97 - XRL A, @DPTR */
jb302@36 342 323 void
jb302@36 343 324 XRL(void) {
jb302@36 344 325 1 if (NNN < 6) {
jb302@36 345 326 2 A = A ^ get_reg(NNN);
jb302@36 346 327 2 }
jb302@36 347 328 1 else {
jb302@36 348 329 2 switch (NNN) {
jb302@36 349 330 3
jb302@36 350 331 3 case 6:
jb302@36 351 332 3 A = A ^ fetch();
jb302@36 352 333 3 break;
jb302@36 353 334 3
jb302@36 354 335 3 case 7:
jb302@36 355 336 3 set_wide(TMP, get_wide(DPTR));
jb302@36 356 337 3 A = A ^ mem[TMP];
jb302@36 357 338 3 break;
jb302@36 358 339 3 }
jb302@36 359 340 2 }
jb302@36 360 341 1 set_zp(A);
jb302@36 361 342 1 }
jb302@36 362 343
jb302@36 363 344 /* 0x98 - RL A */
jb302@36 364 345 void
jb302@36 365 346 RL(void) {
jb302@36 366 347 1 A = (A << 1) | (A >> 7);
jb302@36 367 348 1 }
jb302@36 368 349
jb302@36 369 350 /* 0x99 - RLC A */
jb302@36 370 351 void
jb302@36 371 352 RLC(void) {
jb302@36 372 353 1 tmpb = A;
jb302@36 373 354 1 A = (A << 1) | get_flag(C);
jb302@36 374 355 1 set_flag(C, tmpb >> 7);
jb302@36 375 356 1 }
jb302@36 376 357
jb302@36 377 358 /* 0x9A - RR A */
jb302@36 378 359 void
jb302@36 379 360 RR(void) {
jb302@36 380 361 1 A = (A >> 1) | (A << 7);
jb302@36 381 362 1 }
jb302@36 382 363
jb302@36 383 364 /* 0x9B - RRC A */
jb302@36 384 365 void
jb302@36 385 C51 COMPILER V9.02 ISET 04/17/2014 15:17:32 PAGE 7
jb302@36 386
jb302@36 387 366 RRC(void) {
jb302@36 388 367 1 tmpb = A;
jb302@36 389 368 1 A = (A >> 1) | (get_flag(C) << 7);
jb302@36 390 369 1 set_flag(C, tmpb & 0x01);
jb302@36 391 370 1 }
jb302@36 392 371
jb302@36 393 372 /* 0x9C - INC DPTR
jb302@36 394 373 * 0x9E - INC A */
jb302@36 395 374 void
jb302@36 396 375 INC(void) {
jb302@36 397 376 1 switch (IR) {
jb302@36 398 377 2
jb302@36 399 378 2 case 0x9C:
jb302@36 400 379 2 tmpw = get_wide(DPTR);
jb302@36 401 380 2 if ((tmpw + 1) > 0xFFFF) {
jb302@36 402 381 3 set_flag(OV, 1);
jb302@36 403 382 3 }
jb302@36 404 383 2 set_wide(DPTR, tmpw + 1);
jb302@36 405 384 2 set_zp(DPL);
jb302@36 406 385 2 set_zp(DPH);
jb302@36 407 386 2 break;
jb302@36 408 387 2
jb302@36 409 388 2 case 0x9E:
jb302@36 410 389 2 if ((A + 1) > 0xFF) {
jb302@36 411 390 3 set_flag(OV, 1);
jb302@36 412 391 3 }
jb302@36 413 392 2 A++;
jb302@36 414 393 2 set_zp(A);
jb302@36 415 394 2
jb302@36 416 395 2 }
jb302@36 417 396 1 }
jb302@36 418 397
jb302@36 419 398 /* 0x9D - DEC DPTR
jb302@36 420 399 * 0x9F - DEC A */
jb302@36 421 400 void
jb302@36 422 401 DEC(void) {
jb302@36 423 402 1 switch (IR) {
jb302@36 424 403 2
jb302@36 425 404 2 case 0x9D:
jb302@36 426 405 2 tmpw = get_wide(DPTR);
jb302@36 427 406 2 if ((tmpw - 1) < 0) {
jb302@36 428 407 3 set_flag(OV, 1);
jb302@36 429 408 3 }
jb302@36 430 409 2 set_wide(DPTR, tmpw - 1);
jb302@36 431 410 2 set_zp(DPL);
jb302@36 432 411 2 set_zp(DPH);
jb302@36 433 412 2
jb302@36 434 413 2 case 0x9F:
jb302@36 435 414 2 if ((A - 1) < 0) {
jb302@36 436 415 3 set_flag(OV, 1);
jb302@36 437 416 3 }
jb302@36 438 417 2 A--;
jb302@36 439 418 2 set_zp(A);
jb302@36 440 419 2 }
jb302@36 441 420 1 }
jb302@36 442 421
jb302@36 443 422 /* 0xA0 - ADD A, R0
jb302@36 444 423 * 0xA1 - ADD A, R1
jb302@36 445 424 * 0xA2 - ADD A, R2
jb302@36 446 425 * 0xA3 - ADD A, R3
jb302@36 447 426 * 0xA4 - ADD A, DPH
jb302@36 448 427 * 0xA5 - ADD A, DPL
jb302@36 449 C51 COMPILER V9.02 ISET 04/17/2014 15:17:32 PAGE 8
jb302@36 450
jb302@36 451 428 * 0xA6 - ADD A, #data8
jb302@36 452 429 * 0xA7 - ADD A, @DPTR */
jb302@36 453 430 void
jb302@36 454 431 ADD(void) {
jb302@36 455 432 1 if (NNN < 6) {
jb302@36 456 433 2 if ((A + get_reg(NNN)) > 0xFF) {
jb302@36 457 434 3 set_flag(OV, 1);
jb302@36 458 435 3 }
jb302@36 459 436 2 else {
jb302@36 460 437 3 set_flag(OV, 0);
jb302@36 461 438 3 }
jb302@36 462 439 2 A = A + get_reg(NNN);
jb302@36 463 440 2 set_zp(A);
jb302@36 464 441 2 }
jb302@36 465 442 1 else {
jb302@36 466 443 2 switch (NNN) {
jb302@36 467 444 3
jb302@36 468 445 3 case 6:
jb302@36 469 446 3 tmpb = fetch();
jb302@36 470 447 3 if ((A + tmpb) > 0xFF) {
jb302@36 471 448 4 set_flag(OV, 1);
jb302@36 472 449 4 }
jb302@36 473 450 3 else {
jb302@36 474 451 4 set_flag(OV, 0);
jb302@36 475 452 4 }
jb302@36 476 453 3 A = A + tmpb;
jb302@36 477 454 3 set_zp(A);
jb302@36 478 455 3 break;
jb302@36 479 456 3
jb302@36 480 457 3 case 7:
jb302@36 481 458 3 set_wide(TMP, get_wide(DPTR));
jb302@36 482 459 3 if ((A + mem[TMP]) > 0xFF) {
jb302@36 483 460 4 set_flag(OV, 1);
jb302@36 484 461 4 }
jb302@36 485 462 3 else {
jb302@36 486 463 4 set_flag(OV, 0);
jb302@36 487 464 4 }
jb302@36 488 465 3 A = A + mem[TMP];
jb302@36 489 466 3 set_zp(A);
jb302@36 490 467 3 break;
jb302@36 491 468 3 }
jb302@36 492 469 2 }
jb302@36 493 470 1
jb302@36 494 471 1 }
jb302@36 495 472
jb302@36 496 473 /* 0xA8 - ADDC A, R0
jb302@36 497 474 * 0xA9 - ADDC A, R1
jb302@36 498 475 * 0xAA - ADDC A, R2
jb302@36 499 476 * 0xAB - ADDC A, R3
jb302@36 500 477 * 0xAC - ADDC A, DPH
jb302@36 501 478 * 0xAD - ADDC A, DPL
jb302@36 502 479 * 0xAE - ADDC A, #data8
jb302@36 503 480 * 0xAF - ADDC A, @DPTR */
jb302@36 504 481 void
jb302@36 505 482 ADDC(void) {
jb302@36 506 483 1 if (NNN < 6) {
jb302@36 507 484 2 if ((A + get_reg(NNN) + get_flag(C)) > 0xFF) {
jb302@36 508 485 3 set_flag(C, 1);
jb302@36 509 486 3 }
jb302@36 510 487 2 else {
jb302@36 511 488 3 set_flag(C, 0);
jb302@36 512 489 3 }
jb302@36 513 C51 COMPILER V9.02 ISET 04/17/2014 15:17:32 PAGE 9
jb302@36 514
jb302@36 515 490 2 A = A + get_reg(NNN) + get_flag(C);
jb302@36 516 491 2 set_zp(A);
jb302@36 517 492 2 }
jb302@36 518 493 1 else {
jb302@36 519 494 2 switch (NNN) {
jb302@36 520 495 3
jb302@36 521 496 3 case 6:
jb302@36 522 497 3 tmpb = fetch();
jb302@36 523 498 3 if ((A + tmpb + get_flag(C)) > 0xFF) {
jb302@36 524 499 4 set_flag(C, 1);
jb302@36 525 500 4 }
jb302@36 526 501 3 else {
jb302@36 527 502 4 set_flag(C, 0);
jb302@36 528 503 4 }
jb302@36 529 504 3 A = A + tmpb + get_flag(C);
jb302@36 530 505 3 set_zp(A);
jb302@36 531 506 3 break;
jb302@36 532 507 3
jb302@36 533 508 3 case 7:
jb302@36 534 509 3 set_wide(TMP, get_wide(DPTR));
jb302@36 535 510 3 if ((A + mem[TMP] + get_flag(C)) > 0xFF) {
jb302@36 536 511 4 set_flag(C, 1);
jb302@36 537 512 4 }
jb302@36 538 513 3 else {
jb302@36 539 514 4 set_flag(C, 0);
jb302@36 540 515 4 }
jb302@36 541 516 3 A = A + mem[TMP] + get_flag(C);
jb302@36 542 517 3 set_zp(A);
jb302@36 543 518 3 break;
jb302@36 544 519 3 }
jb302@36 545 520 2 }
jb302@36 546 521 1
jb302@36 547 522 1
jb302@36 548 523 1 }
jb302@36 549 524
jb302@36 550 525 /* 0xB0 - SUB A, R0
jb302@36 551 526 * 0xB1 - SUB A, R1
jb302@36 552 527 * 0xB2 - SUB A, R2
jb302@36 553 528 * 0xB3 - SUB A, R3
jb302@36 554 529 * 0xB4 - SB A, DPH
jb302@36 555 530 * 0xB5 - SUB A, DPL
jb302@36 556 531 * 0xB6 - SUB A, #data8
jb302@36 557 532 * 0xB7 - SUB A, @DPTR */
jb302@36 558 533 void
jb302@36 559 534 SUB(void) {
jb302@36 560 535 1 if (NNN < 6) {
jb302@36 561 536 2 if ((A - get_reg(NNN)) < 0){
jb302@36 562 537 3 set_flag(S, 1);
jb302@36 563 538 3 }
jb302@36 564 539 2 else {
jb302@36 565 540 3 set_flag(S, 0);
jb302@36 566 541 3 }
jb302@36 567 542 2 A = A - get_reg(NNN);
jb302@36 568 543 2 set_zp(A);
jb302@36 569 544 2 }
jb302@36 570 545 1 else {
jb302@36 571 546 2 switch (NNN) {
jb302@36 572 547 3
jb302@36 573 548 3 case 6:
jb302@36 574 549 3 tmpb = fetch();
jb302@36 575 550 3 if ((A - tmpb) < 0) {
jb302@36 576 551 4 set_flag(S, 1);
jb302@36 577 C51 COMPILER V9.02 ISET 04/17/2014 15:17:32 PAGE 10
jb302@36 578
jb302@36 579 552 4 }
jb302@36 580 553 3 else {
jb302@36 581 554 4 set_flag(S, 0);
jb302@36 582 555 4 }
jb302@36 583 556 3 A = A - tmpb;
jb302@36 584 557 3 set_zp(A);
jb302@36 585 558 3 break;
jb302@36 586 559 3
jb302@36 587 560 3 case 7:
jb302@36 588 561 3 set_wide(TMP, get_wide(DPTR));
jb302@36 589 562 3 if ((A - mem[TMP]) < 0) {
jb302@36 590 563 4 set_flag(S, 1);
jb302@36 591 564 4 }
jb302@36 592 565 3 else {
jb302@36 593 566 4 set_flag(S, 0);
jb302@36 594 567 4 }
jb302@36 595 568 3 A = A - mem[TMP];
jb302@36 596 569 3 set_zp(A);
jb302@36 597 570 3 break;
jb302@36 598 571 3 }
jb302@36 599 572 2 }
jb302@36 600 573 1 }
jb302@36 601 574
jb302@36 602 575 /* 0xB8 - SUBB A, R0
jb302@36 603 576 * 0xB9 - SUBB A, R1
jb302@36 604 577 * 0xBA - SUBB A, R2
jb302@36 605 578 * 0xBB - SUBB A, R3
jb302@36 606 579 * 0xBC - SUBB A, DPH
jb302@36 607 580 * 0xBD - SUBB A, DPL
jb302@36 608 581 * 0xBE - SUBB A, #data8
jb302@36 609 582 * 0xBF - SUBB A, @DPTR */
jb302@36 610 583 void
jb302@36 611 584 SUBB(void) {
jb302@36 612 585 1 if (NNN < 6) {
jb302@36 613 586 2 if ((A - get_reg(NNN) - get_flag(C)) < 0){
jb302@36 614 587 3 set_flag(C, 1);
jb302@36 615 588 3 }
jb302@36 616 589 2 else {
jb302@36 617 590 3 set_flag(C, 0);
jb302@36 618 591 3 }
jb302@36 619 592 2 A = A - get_reg(NNN) -get_flag(C);
jb302@36 620 593 2 set_zp(A);
jb302@36 621 594 2 }
jb302@36 622 595 1 else {
jb302@36 623 596 2 switch (NNN) {
jb302@36 624 597 3
jb302@36 625 598 3 case 6:
jb302@36 626 599 3 tmpb = fetch();
jb302@36 627 600 3 if ((A - tmpb - get_flag(C)) < 0) {
jb302@36 628 601 4 set_flag(C, 1);
jb302@36 629 602 4 }
jb302@36 630 603 3 else {
jb302@36 631 604 4 set_flag(C, 0);
jb302@36 632 605 4 }
jb302@36 633 606 3 A = A - tmpb - get_flag(C);
jb302@36 634 607 3 set_zp(A);
jb302@36 635 608 3 break;
jb302@36 636 609 3
jb302@36 637 610 3 case 7:
jb302@36 638 611 3 set_wide(TMP, get_wide(DPTR));
jb302@36 639 612 3 if ((A - mem[TMP] - get_flag(C)) < 0) {
jb302@36 640 613 4 set_flag(C, 1);
jb302@36 641 C51 COMPILER V9.02 ISET 04/17/2014 15:17:32 PAGE 11
jb302@36 642
jb302@36 643 614 4 }
jb302@36 644 615 3 else {
jb302@36 645 616 4 set_flag(C, 0);
jb302@36 646 617 4 }
jb302@36 647 618 3 A = A - mem[TMP] - get_flag(C);
jb302@36 648 619 3 set_zp(A);
jb302@36 649 620 3 break;
jb302@36 650 621 3 }
jb302@36 651 622 2 }
jb302@36 652 623 1 }
jb302@36 653 624
jb302@36 654 625 void
jb302@36 655 626 PJMP(void) {
jb302@36 656 627 1 /* implement me */
jb302@36 657 628 1 }
jb302@36 658 629
jb302@36 659 630 void
jb302@36 660 631 PCALL(void) {
jb302@36 661 632 1 /* implement me */
jb302@36 662 633 1 }
jb302@36 663 634
jb302@36 664 635 /* 0xD0 - DJNZ R0, rel8
jb302@36 665 636 * 0xD1 - DJNZ R1, rel8
jb302@36 666 637 * 0xD2 - DJNZ R2, rel8
jb302@36 667 638 * 0xD3 - DJNZ R3, rel8 */
jb302@36 668 639 void
jb302@36 669 640 DJNZ(void) {
jb302@36 670 641 1 set_reg(NNN, get_reg(NNN) - 1);
jb302@36 671 642 1 if (get_reg(NNN) == 0) {
jb302@36 672 643 2 set_wide(PC, get_wide(PC) + (signed char)fetch() - 1);
jb302@36 673 644 2 }
jb302@36 674 645 1 else {
jb302@36 675 646 2 inc_pc(1);
jb302@36 676 647 2 }
jb302@36 677 648 1 }
jb302@36 678 649
jb302@36 679 650 /* 0xD4 - CJNE R0, #data, rel8
jb302@36 680 651 * 0xD5 - CJNE R1, #data, rel8
jb302@36 681 652 * 0xD6 - CJNE R2, #data, rel8
jb302@36 682 653 * 0xD7 - CJNE R3, #data, rel8
jb302@36 683 654 * 0xDF - CJNE A, #data8, rel8 */
jb302@36 684 655 void
jb302@36 685 656 CJNE(void) {
jb302@36 686 657 1 switch(IR) {
jb302@36 687 658 2
jb302@36 688 659 2 case 0xDF:
jb302@36 689 660 2 tmpb = fetch();
jb302@36 690 661 2 if (tmpb != A) {
jb302@36 691 662 3 set_wide(PC, get_wide(PC) + (signed char)fetch() - 1);
jb302@36 692 663 3 }
jb302@36 693 664 2 else {
jb302@36 694 665 3 inc_pc(1);
jb302@36 695 666 3 }
jb302@36 696 667 2 break;
jb302@36 697 668 2
jb302@36 698 669 2
jb302@36 699 670 2 default:
jb302@36 700 671 2 tmpb = fetch();
jb302@36 701 672 2 if (tmpb != get_reg(NNN - 4)) {
jb302@36 702 673 3 set_wide(PC, get_wide(PC) + (signed char)fetch() - 1);
jb302@36 703 674 3 }
jb302@36 704 675 2 else {
jb302@36 705 C51 COMPILER V9.02 ISET 04/17/2014 15:17:32 PAGE 12
jb302@36 706
jb302@36 707 676 3 inc_pc(1);
jb302@36 708 677 3 }
jb302@36 709 678 2 break;
jb302@36 710 679 2 }
jb302@36 711 680 1 }
jb302@36 712 681
jb302@36 713 682 /* 0xD8 - LJMP addr16 */
jb302@36 714 683 void
jb302@36 715 684 LJMP(void) {
jb302@36 716 685 1 set_wide(PC, fetch_wide());
jb302@36 717 686 1 }
jb302@36 718 687
jb302@36 719 688 /* 0xD9 - LCALL addr16 */
jb302@36 720 689 void
jb302@36 721 690 LCALL(void) {
jb302@36 722 691 1 /* push PC to stack */
jb302@36 723 692 1 mem[get_wide(SP)] = get_reg(PCL);
jb302@36 724 693 1 set_wide(SP, get_wide(SP) + 1);
jb302@36 725 694 1 mem[get_wide(SP)] = get_reg(PCH);
jb302@36 726 695 1 set_wide(SP, get_wide(SP) + 1);
jb302@36 727 696 1 /* jmp */
jb302@36 728 697 1 set_wide(PC, fetch_wide());
jb302@36 729 698 1 }
jb302@36 730 699
jb302@36 731 700 /* 0xDA - RET */
jb302@36 732 701 void
jb302@36 733 702 RET(void) {
jb302@36 734 703 1 /* get PC from stack */
jb302@36 735 704 1 set_wide(SP, get_wide(SP) - 1);
jb302@36 736 705 1 tmpb = mem[get_wide(SP)]; /* PCH */
jb302@36 737 706 1 set_wide(SP, get_wide(SP) - 1);
jb302@36 738 707 1 set_wide(PC, MWIDE(tmpb, mem[get_wide(SP)]));
jb302@36 739 708 1 }
jb302@36 740 709
jb302@36 741 710 void
jb302@36 742 711 RETI(void) {
jb302@36 743 712 1 /* implement me */
jb302@36 744 713 1 }
jb302@36 745 714
jb302@36 746 715 /* 0xDC - SJMP rel8 */
jb302@36 747 716 void
jb302@36 748 717 SJMP(void) {
jb302@36 749 718 1 /* -1 because the fetch() increments the PC */
jb302@36 750 719 1 set_wide(PC, get_wide(PC) + (signed char)fetch() -1);
jb302@36 751 720 1 }
jb302@36 752 721
jb302@36 753 722 /* 0xDD - JMP @A+DPTR
jb302@36 754 723 * 0xDE - JMP @DPTR */
jb302@36 755 724 void
jb302@36 756 725 JMP(void) {
jb302@36 757 726 1 switch(IR) {
jb302@36 758 727 2
jb302@36 759 728 2 case 0xDD:
jb302@36 760 729 2 set_wide(PC, A + get_wide(DPTR));
jb302@36 761 730 2 break;
jb302@36 762 731 2
jb302@36 763 732 2 case 0xDE:
jb302@36 764 733 2 set_wide(PC, get_wide(DPTR));
jb302@36 765 734 2 break;
jb302@36 766 735 2 }
jb302@36 767 736 1 }
jb302@36 768 737
jb302@36 769 C51 COMPILER V9.02 ISET 04/17/2014 15:17:32 PAGE 13
jb302@36 770
jb302@36 771 738 /* 0xE0 - JZ rel8 */
jb302@36 772 739 void
jb302@36 773 740 JZ(void) {
jb302@36 774 741 1 if (get_flag(Z) == 1) {
jb302@36 775 742 2 set_wide(PC, get_wide(PC) + (signed char)fetch() -1);
jb302@36 776 743 2 }
jb302@36 777 744 1 /* skip rel8 if jump not needed */
jb302@36 778 745 1 else {
jb302@36 779 746 2 inc_pc(1);
jb302@36 780 747 2 }
jb302@36 781 748 1 }
jb302@36 782 749
jb302@36 783 750 /* 0xE1 - JNZ rel8 */
jb302@36 784 751 void
jb302@36 785 752 JNZ(void) {
jb302@36 786 753 1 if (get_flag(Z) == 0) {
jb302@36 787 754 2 set_wide(PC, get_wide(PC) + (signed char)fetch() -1);
jb302@36 788 755 2 }
jb302@36 789 756 1 else {
jb302@36 790 757 2 inc_pc(1);
jb302@36 791 758 2 }
jb302@36 792 759 1 }
jb302@36 793 760
jb302@36 794 761 /* 0xE2 - JC rel8 */
jb302@36 795 762 void
jb302@36 796 763 JC(void) {
jb302@36 797 764 1 if (get_flag(C) == 1) {
jb302@36 798 765 2 set_wide(PC, get_wide(PC) + (signed char)fetch() -1);
jb302@36 799 766 2 }
jb302@36 800 767 1 else {
jb302@36 801 768 2 inc_pc(1);
jb302@36 802 769 2 }
jb302@36 803 770 1 }
jb302@36 804 771
jb302@36 805 772 /* 0xE3 - JNC rel8 */
jb302@36 806 773 void
jb302@36 807 774 JNC(void) {
jb302@36 808 775 1 if (get_flag(C) == 0) {
jb302@36 809 776 2 set_wide(PC, get_wide(PC) + (signed char)fetch() -1);
jb302@36 810 777 2 }
jb302@36 811 778 1 else {
jb302@36 812 779 2 inc_pc(1);
jb302@36 813 780 2 }
jb302@36 814 781 1 }
jb302@36 815 782
jb302@36 816 783 /* 0xE4 - JPO rel8 */
jb302@36 817 784 void
jb302@36 818 785 JPO(void) {
jb302@36 819 786 1 /* P = 1 when parity even */
jb302@36 820 787 1 if (get_flag(P) == 0) {
jb302@36 821 788 2 set_wide(PC, get_wide(PC) + (signed char)fetch() -1);
jb302@36 822 789 2 }
jb302@36 823 790 1 else {
jb302@36 824 791 2 inc_pc(1);
jb302@36 825 792 2 }
jb302@36 826 793 1
jb302@36 827 794 1 }
jb302@36 828 795
jb302@36 829 796 /* 0xE5 - JPE rel8 */
jb302@36 830 797 void
jb302@36 831 798 JPE(void) {
jb302@36 832 799 1 if (get_flag(P) == 1) {
jb302@36 833 C51 COMPILER V9.02 ISET 04/17/2014 15:17:32 PAGE 14
jb302@36 834
jb302@36 835 800 2 set_wide(PC, get_wide(PC) + (signed char)fetch() -1);
jb302@36 836 801 2 }
jb302@36 837 802 1 else {
jb302@36 838 803 2 inc_pc(1);
jb302@36 839 804 2 }
jb302@36 840 805 1 }
jb302@36 841 806
jb302@36 842 807 /* 0xE6 - JS rel8 */
jb302@36 843 808 void
jb302@36 844 809 JS(void) {
jb302@36 845 810 1 if (get_flag(S) == 1) {
jb302@36 846 811 2 set_wide(PC, get_wide(PC) + (signed char)fetch() -1);
jb302@36 847 812 2 }
jb302@36 848 813 1 else {
jb302@36 849 814 2 inc_pc(1);
jb302@36 850 815 2 }
jb302@36 851 816 1 }
jb302@36 852 817
jb302@36 853 818 /* 0xE7 - JNS rel8 */
jb302@36 854 819 void
jb302@36 855 820 JNS(void) {
jb302@36 856 821 1 if (get_flag(S) == 0) {
jb302@36 857 822 2 set_wide(PC, get_wide(PC) + (signed char)fetch() -1);
jb302@36 858 823 2 }
jb302@36 859 824 1 else {
jb302@36 860 825 2 inc_pc(1);
jb302@36 861 826 2 }
jb302@36 862 827 1 }
jb302@36 863 828
jb302@36 864 829 /* 0xE8 - PUSH R0
jb302@36 865 830 * 0xE9 - PUSH R1
jb302@36 866 831 * 0xEA - PUSH R2
jb302@36 867 832 * 0xEB - PUSH R3
jb302@36 868 833 * 0xEC - PUSH DPH
jb302@36 869 834 * 0xED - PUSH DPL
jb302@36 870 835 * 0xEE - PUSH A
jb302@36 871 836 * 0xEF - PUSH FLAGS */
jb302@36 872 837 void
jb302@36 873 838 PUSH(void) {
jb302@36 874 839 1 if (NNN < 6) {
jb302@36 875 840 2 mem[get_wide(SP)] = get_reg(NNN);
jb302@36 876 841 2 set_wide(SP, get_wide(SP) + 1);
jb302@36 877 842 2
jb302@36 878 843 2 }
jb302@36 879 844 1 else {
jb302@36 880 845 2 switch(IR) {
jb302@36 881 846 3
jb302@36 882 847 3 case 0xEE:
jb302@36 883 848 3 mem[get_wide(SP)] = A;
jb302@36 884 849 3 set_wide(SP, get_wide(SP) + 1);
jb302@36 885 850 3 break;
jb302@36 886 851 3
jb302@36 887 852 3 case 0xEF:
jb302@36 888 853 3 mem[get_wide(SP)] = flags;
jb302@36 889 854 3 set_wide(SP, get_wide(SP) + 1);
jb302@36 890 855 3 break;
jb302@36 891 856 3
jb302@36 892 857 3 default:
jb302@36 893 858 3 break;
jb302@36 894 859 3 }
jb302@36 895 860 2 }
jb302@36 896 861 1 }
jb302@36 897 C51 COMPILER V9.02 ISET 04/17/2014 15:17:32 PAGE 15
jb302@36 898
jb302@36 899 862
jb302@36 900 863 /* 0xF0 - POP R0
jb302@36 901 864 * 0xF1 - POP R1
jb302@36 902 865 * 0xF2 - POP R2
jb302@36 903 866 * 0xF3 - POP R3
jb302@36 904 867 * 0xF4 - POP DPH
jb302@36 905 868 * 0xF5 - POP DPL
jb302@36 906 869 * 0xF6 - POP A
jb302@36 907 870 * 0xF7 - POP FLAGS */
jb302@36 908 871 void
jb302@36 909 872 POP(void) {
jb302@36 910 873 1 if (NNN < 6) {
jb302@36 911 874 2 set_wide(SP, get_wide(SP) - 1);
jb302@36 912 875 2 set_reg(NNN, mem[get_wide(SP)]);
jb302@36 913 876 2 }
jb302@36 914 877 1 else {
jb302@36 915 878 2 switch(IR) {
jb302@36 916 879 3
jb302@36 917 880 3 case 0xF6:
jb302@36 918 881 3 set_wide(SP, get_wide(SP) - 1);
jb302@36 919 882 3 A = mem[get_wide(SP)];
jb302@36 920 883 3 break;
jb302@36 921 884 3
jb302@36 922 885 3 case 0xF7:
jb302@36 923 886 3 set_wide(SP, get_wide(SP) - 1);
jb302@36 924 887 3 flags = mem[get_wide(SP)];
jb302@36 925 888 3 break;
jb302@36 926 889 3
jb302@36 927 890 3 default:
jb302@36 928 891 3 break;
jb302@36 929 892 3 }
jb302@36 930 893 2 }
jb302@36 931 894 1 }
jb302@36 932 895
jb302@36 933 896
jb302@36 934 897 /* 0xF8 - MUL R0, R1 */
jb302@36 935 898 void
jb302@36 936 899 MUL(void) {
jb302@36 937 900 1 /* implement me */
jb302@36 938 901 1 }
jb302@36 939 902
jb302@36 940 903 /* 0xF9 - DIV R0, R1 */
jb302@36 941 904 void
jb302@36 942 905 DIV(void) {
jb302@36 943 906 1 /* implement me */
jb302@36 944 907 1 }
jb302@36 945 908
jb302@36 946 909 /* 0xFA - DA A */
jb302@36 947 910 void
jb302@36 948 911 DA(void) {
jb302@36 949 912 1 /* implement me */
jb302@36 950 913 1 }
jb302@36 951 914
jb302@36 952 915 /* 0xFC - IN port_addr */
jb302@36 953 916 void
jb302@36 954 917 IN(void) {
jb302@36 955 918 1 /* implement me */
jb302@36 956 919 1 }
jb302@36 957 920
jb302@36 958 921 /* 0xFD - OUT port_addr */
jb302@36 959 922 void
jb302@36 960 923 OUT(void) {
jb302@36 961 C51 COMPILER V9.02 ISET 04/17/2014 15:17:32 PAGE 16
jb302@36 962
jb302@36 963 924 1 /* implement me */
jb302@36 964 925 1 }
jb302@36 965 926
jb302@36 966 927 /* 0xFE INT vect8 */
jb302@36 967 928 void
jb302@36 968 929 INT(void) {
jb302@36 969 930 1 /* implement me */
jb302@36 970 931 1 }
jb302@36 971 932
jb302@36 972 933 /* 0xFF - HLT */
jb302@36 973 934 void
jb302@36 974 935 HLT(void) {
jb302@36 975 936 1 /* implement me */
jb302@36 976 937 1 }
jb302@36 977
jb302@36 978
jb302@36 979 MODULE INFORMATION: STATIC OVERLAYABLE
jb302@36 980 CODE SIZE = 2932 ----
jb302@36 981 CONSTANT SIZE = ---- ----
jb302@36 982 XDATA SIZE = ---- ----
jb302@36 983 PDATA SIZE = ---- ----
jb302@36 984 DATA SIZE = ---- ----
jb302@36 985 IDATA SIZE = ---- ----
jb302@36 986 BIT SIZE = ---- ----
jb302@36 987 EDATA SIZE = ---- ----
jb302@36 988 HDATA SIZE = ---- ----
jb302@36 989 XDATA CONST SIZE = ---- ----
jb302@36 990 FAR CONST SIZE = ---- ----
jb302@36 991 END OF MODULE INFORMATION.
jb302@36 992
jb302@36 993
jb302@36 994 C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)