diff options
| -rw-r--r-- | cpu.c | 66 |
1 files changed, 46 insertions, 20 deletions
| @@ -244,7 +244,7 @@ bit(uint8_t arg) | |||
| 244 | { | 244 | { |
| 245 | regs.status.zero = (regs.a & arg) == 0; | 245 | regs.status.zero = (regs.a & arg) == 0; |
| 246 | regs.status.overflow = (arg & (1 << 6)) > 0; | 246 | regs.status.overflow = (arg & (1 << 6)) > 0; |
| 247 | regs.status.negative = (arg & (1 << 7)) > 0; | 247 | STATUS_UPDATE_NEGATIVE(arg); |
| 248 | } | 248 | } |
| 249 | 249 | ||
| 250 | static void | 250 | static void |
| @@ -329,7 +329,7 @@ cmp(uint8_t arg) | |||
| 329 | 329 | ||
| 330 | regs.status.carry = regs.a >= arg; | 330 | regs.status.carry = regs.a >= arg; |
| 331 | regs.status.zero = regs.a == arg; | 331 | regs.status.zero = regs.a == arg; |
| 332 | regs.status.negative = (tmp & (1 << 7)) > 0; | 332 | STATUS_UPDATE_NEGATIVE(tmp); |
| 333 | } | 333 | } |
| 334 | 334 | ||
| 335 | static void | 335 | static void |
| @@ -341,7 +341,7 @@ cpx(uint8_t arg) | |||
| 341 | 341 | ||
| 342 | regs.status.carry = regs.x >= arg; | 342 | regs.status.carry = regs.x >= arg; |
| 343 | regs.status.zero = regs.x == arg; | 343 | regs.status.zero = regs.x == arg; |
| 344 | regs.status.negative = (tmp & (1 << 7)) > 0; | 344 | STATUS_UPDATE_NEGATIVE(tmp); |
| 345 | } | 345 | } |
| 346 | 346 | ||
| 347 | static void | 347 | static void |
| @@ -353,37 +353,52 @@ cpy(uint8_t arg) | |||
| 353 | 353 | ||
| 354 | regs.status.carry = regs.y >= arg; | 354 | regs.status.carry = regs.y >= arg; |
| 355 | regs.status.zero = regs.y == arg; | 355 | regs.status.zero = regs.y == arg; |
| 356 | regs.status.negative = (tmp & (1 << 7)) > 0; | 356 | STATUS_UPDATE_NEGATIVE(tmp); |
| 357 | } | 357 | } |
| 358 | 358 | ||
| 359 | static void | 359 | static void |
| 360 | dec(uint16_t mem) | 360 | dec(uint16_t mem) |
| 361 | { | 361 | { |
| 362 | memwrite(mem, peek(mem) - 1); | 362 | memwrite(mem, peek(mem) - 1); |
| 363 | |||
| 364 | STATUS_UPDATE_ZERO(peek(mem)); | ||
| 365 | STATUS_UPDATE_NEGATIVE(peek(mem)); | ||
| 363 | } | 366 | } |
| 364 | 367 | ||
| 365 | static void | 368 | static void |
| 366 | dex(uint8_t arg) | 369 | dex(void) |
| 367 | { | 370 | { |
| 368 | /* TODO: complete this */ | 371 | regs.x--; |
| 372 | |||
| 373 | STATUS_UPDATE_ZERO(regs.x); | ||
| 374 | STATUS_UPDATE_NEGATIVE(regs.x); | ||
| 369 | } | 375 | } |
| 370 | 376 | ||
| 371 | static void | 377 | static void |
| 372 | dey(uint8_t arg) | 378 | dey(void) |
| 373 | { | 379 | { |
| 374 | /* TODO: complete this */ | 380 | regs.y--; |
| 381 | |||
| 382 | STATUS_UPDATE_ZERO(regs.y); | ||
| 383 | STATUS_UPDATE_NEGATIVE(regs.y); | ||
| 375 | } | 384 | } |
| 376 | 385 | ||
| 377 | static void | 386 | static void |
| 378 | eor(uint8_t arg) | 387 | eor(uint8_t arg) |
| 379 | { | 388 | { |
| 380 | /* TODO: complete this */ | 389 | regs.a ^= arg; |
| 390 | |||
| 391 | STATUS_UPDATE_ZERO(regs.a); | ||
| 392 | STATUS_UPDATE_NEGATIVE(regs.a); | ||
| 381 | } | 393 | } |
| 382 | 394 | ||
| 383 | static void | 395 | static void |
| 384 | inc(uint8_t arg) | 396 | inc(uint16_t mem) |
| 385 | { | 397 | { |
| 386 | /* TODO: complete this */ | 398 | memwrite(mem, peek(mem) + 1); |
| 399 | |||
| 400 | STATUS_UPDATE_ZERO(peek(mem)); | ||
| 401 | STATUS_UPDATE_NEGATIVE(peek(mem)); | ||
| 387 | } | 402 | } |
| 388 | 403 | ||
| 389 | static void | 404 | static void |
| @@ -398,13 +413,16 @@ inx(void) | |||
| 398 | static void | 413 | static void |
| 399 | iny(uint8_t arg) | 414 | iny(uint8_t arg) |
| 400 | { | 415 | { |
| 401 | /* TODO: complete this */ | 416 | regs.y++; |
| 417 | |||
| 418 | STATUS_UPDATE_ZERO(regs.y); | ||
| 419 | STATUS_UPDATE_NEGATIVE(regs.y); | ||
| 402 | } | 420 | } |
| 403 | 421 | ||
| 404 | static void | 422 | static void |
| 405 | jmp(uint8_t arg) | 423 | jmp(uint8_t arg) |
| 406 | { | 424 | { |
| 407 | /* TODO: complete this */ | 425 | regs.pc = arg; |
| 408 | } | 426 | } |
| 409 | 427 | ||
| 410 | static void | 428 | static void |
| @@ -416,7 +434,6 @@ jsr(uint8_t arg) | |||
| 416 | static void | 434 | static void |
| 417 | lda(uint8_t arg) | 435 | lda(uint8_t arg) |
| 418 | { | 436 | { |
| 419 | printf("arg1 $%02X\n", arg); | ||
| 420 | regs.a = arg; | 437 | regs.a = arg; |
| 421 | 438 | ||
| 422 | STATUS_UPDATE_ZERO(regs.a); | 439 | STATUS_UPDATE_ZERO(regs.a); |
| @@ -426,13 +443,19 @@ lda(uint8_t arg) | |||
| 426 | static void | 443 | static void |
| 427 | ldx(uint8_t arg) | 444 | ldx(uint8_t arg) |
| 428 | { | 445 | { |
| 429 | /* TODO: complete this */ | 446 | regs.x = arg; |
| 447 | |||
| 448 | STATUS_UPDATE_ZERO(regs.x); | ||
| 449 | STATUS_UPDATE_NEGATIVE(regs.x); | ||
| 430 | } | 450 | } |
| 431 | 451 | ||
| 432 | static void | 452 | static void |
| 433 | ldy(uint8_t arg) | 453 | ldy(uint8_t arg) |
| 434 | { | 454 | { |
| 435 | /* TODO: complete this */ | 455 | regs.y = arg; |
| 456 | |||
| 457 | STATUS_UPDATE_ZERO(regs.y); | ||
| 458 | STATUS_UPDATE_NEGATIVE(regs.y); | ||
| 436 | } | 459 | } |
| 437 | 460 | ||
| 438 | static void | 461 | static void |
| @@ -444,13 +467,16 @@ lsr(uint8_t arg) | |||
| 444 | static void | 467 | static void |
| 445 | nop(uint8_t arg) | 468 | nop(uint8_t arg) |
| 446 | { | 469 | { |
| 447 | /* TODO: complete this */ | 470 | return; |
| 448 | } | 471 | } |
| 449 | 472 | ||
| 450 | static void | 473 | static void |
| 451 | ora(uint8_t arg) | 474 | ora(uint8_t arg) |
| 452 | { | 475 | { |
| 453 | /* TODO: complete this */ | 476 | regs.a |= arg; |
| 477 | |||
| 478 | STATUS_UPDATE_ZERO(regs.a); | ||
| 479 | STATUS_UPDATE_NEGATIVE(regs.a); | ||
| 454 | } | 480 | } |
| 455 | 481 | ||
| 456 | static void | 482 | static void |
| @@ -975,11 +1001,11 @@ interpret(void) | |||
| 975 | cycles += 7; | 1001 | cycles += 7; |
| 976 | break; | 1002 | break; |
| 977 | case 0xca: | 1003 | case 0xca: |
| 978 | dex(opcode_arg(AM_ACC)); | 1004 | dex(); |
| 979 | cycles += 2; | 1005 | cycles += 2; |
| 980 | break; | 1006 | break; |
| 981 | case 0x88: | 1007 | case 0x88: |
| 982 | dey(opcode_arg(AM_ACC)); | 1008 | dey(); |
| 983 | cycles += 2; | 1009 | cycles += 2; |
| 984 | break; | 1010 | break; |
| 985 | case 0x49: | 1011 | case 0x49: |
