trunk/src/emu/cpu/lr35902/opc_main.h
| r23908 | r23909 | |
| 3 | 3 | register UINT8 r,f; \ |
| 4 | 4 | x++; \ |
| 5 | 5 | r=(x); \ |
| 6 | | f=(UINT8)(m_F&FLAG_C); \ |
| 7 | | if( r==0 ) f|=FLAG_Z; \ |
| 8 | | if( (r&0xF)==0 ) f|=FLAG_H; \ |
| 6 | f=(UINT8)(m_F&LR35902_FLAG_C); \ |
| 7 | if( r==0 ) f|=LR35902_FLAG_Z; \ |
| 8 | if( (r&0xF)==0 ) f|=LR35902_FLAG_H; \ |
| 9 | 9 | m_F=f; \ |
| 10 | 10 | } |
| 11 | 11 | |
| r23908 | r23909 | |
| 14 | 14 | register UINT8 r,f; \ |
| 15 | 15 | x--; \ |
| 16 | 16 | r=(x); \ |
| 17 | | f=(UINT8)((m_F&FLAG_C)|FLAG_N); \ |
| 18 | | if( r==0 ) f|=FLAG_Z; \ |
| 19 | | if( (r&0xF)==0xF ) f|=FLAG_H; \ |
| 17 | f=(UINT8)((m_F&LR35902_FLAG_C)|LR35902_FLAG_N); \ |
| 18 | if( r==0 ) f|=LR35902_FLAG_Z; \ |
| 19 | if( (r&0xF)==0xF ) f|=LR35902_FLAG_H; \ |
| 20 | 20 | m_F=f; \ |
| 21 | 21 | } |
| 22 | 22 | |
| r23908 | r23909 | |
| 26 | 26 | register UINT8 f; \ |
| 27 | 27 | r1=((m_H<<8)|m_L)+(x); \ |
| 28 | 28 | r2=(((m_H<<8)|m_L)&0xFFF)+((x)&0xFFF); \ |
| 29 | | f=(UINT8)(m_F&FLAG_Z); \ |
| 30 | | if( r1>0xFFFF ) f|=FLAG_C; \ |
| 31 | | if( r2>0x0FFF ) f|=FLAG_H; \ |
| 29 | f=(UINT8)(m_F&LR35902_FLAG_Z); \ |
| 30 | if( r1>0xFFFF ) f|=LR35902_FLAG_C; \ |
| 31 | if( r2>0x0FFF ) f|=LR35902_FLAG_H; \ |
| 32 | 32 | m_L = r1; \ |
| 33 | 33 | m_H = r1 >> 8; \ |
| 34 | 34 | m_F=f; \ |
| r23908 | r23909 | |
| 41 | 41 | r1=(UINT16)((m_A&0xF)+((x)&0xF)); \ |
| 42 | 42 | r2=(UINT16)(m_A+(x)); \ |
| 43 | 43 | m_A=(UINT8)r2; \ |
| 44 | | if( ((UINT8)r2)==0 ) f=FLAG_Z; \ |
| 44 | if( ((UINT8)r2)==0 ) f=LR35902_FLAG_Z; \ |
| 45 | 45 | else f=0; \ |
| 46 | | if( r2>0xFF ) f|=FLAG_C; \ |
| 47 | | if( r1>0xF ) f|=FLAG_H; \ |
| 46 | if( r2>0xFF ) f|=LR35902_FLAG_C; \ |
| 47 | if( r1>0xF ) f|=LR35902_FLAG_H; \ |
| 48 | 48 | m_F=f; \ |
| 49 | 49 | } |
| 50 | 50 | |
| r23908 | r23909 | |
| 55 | 55 | r1=(UINT16)((m_A&0xF)-((x)&0xF)); \ |
| 56 | 56 | r2=(UINT16)(m_A-(x)); \ |
| 57 | 57 | m_A=(UINT8)r2; \ |
| 58 | | if( ((UINT8)r2)==0 ) f=FLAG_N|FLAG_Z; \ |
| 59 | | else f=FLAG_N; \ |
| 60 | | if( r2>0xFF ) f|=FLAG_C; \ |
| 61 | | if( r1>0xF ) f|=FLAG_H; \ |
| 58 | if( ((UINT8)r2)==0 ) f=LR35902_FLAG_N|LR35902_FLAG_Z; \ |
| 59 | else f=LR35902_FLAG_N; \ |
| 60 | if( r2>0xFF ) f|=LR35902_FLAG_C; \ |
| 61 | if( r1>0xF ) f|=LR35902_FLAG_H; \ |
| 62 | 62 | m_F=f; \ |
| 63 | 63 | } |
| 64 | 64 | |
| r23908 | r23909 | |
| 69 | 69 | register UINT8 f; \ |
| 70 | 70 | r=(UINT16)(m_A-(x)); \ |
| 71 | 71 | if( ((UINT8)r)==0 ) \ |
| 72 | | f=FLAG_N|FLAG_Z; \ |
| 72 | f=LR35902_FLAG_N|LR35902_FLAG_Z; \ |
| 73 | 73 | else \ |
| 74 | | f=FLAG_N; \ |
| 75 | | f|=(UINT8)((r>>8)&FLAG_C); \ |
| 74 | f=LR35902_FLAG_N; \ |
| 75 | f|=(UINT8)((r>>8)&LR35902_FLAG_C); \ |
| 76 | 76 | if( (r^m_A^(x))&0x10 ) \ |
| 77 | | f|=FLAG_H; \ |
| 77 | f|=LR35902_FLAG_H; \ |
| 78 | 78 | m_F=f; \ |
| 79 | 79 | } |
| 80 | 80 | */ |
| r23908 | r23909 | |
| 85 | 85 | register UINT8 f; \ |
| 86 | 86 | r1=(UINT16)((m_A&0xF)-((x)&0xF)); \ |
| 87 | 87 | r2=(UINT16)(m_A-(x)); \ |
| 88 | | if( ((UINT8)r2)==0 ) f=FLAG_N|FLAG_Z; \ |
| 89 | | else f=FLAG_N; \ |
| 90 | | if( r2>0xFF ) f|=FLAG_C; \ |
| 91 | | if( r1>0xF ) f|=FLAG_H; \ |
| 88 | if( ((UINT8)r2)==0 ) f=LR35902_FLAG_N|LR35902_FLAG_Z; \ |
| 89 | else f=LR35902_FLAG_N; \ |
| 90 | if( r2>0xFF ) f|=LR35902_FLAG_C; \ |
| 91 | if( r1>0xF ) f|=LR35902_FLAG_H; \ |
| 92 | 92 | m_F=f; \ |
| 93 | 93 | } |
| 94 | 94 | |
| r23908 | r23909 | |
| 96 | 96 | { \ |
| 97 | 97 | register UINT16 r1,r2; \ |
| 98 | 98 | register UINT8 f; \ |
| 99 | | r1=(UINT16)((m_A&0xF)-((x)&0xF)-((m_F&FLAG_C)?1:0)); \ |
| 100 | | r2=(UINT16)(m_A-(x)-((m_F&FLAG_C)?1:0)); \ |
| 99 | r1=(UINT16)((m_A&0xF)-((x)&0xF)-((m_F&LR35902_FLAG_C)?1:0)); \ |
| 100 | r2=(UINT16)(m_A-(x)-((m_F&LR35902_FLAG_C)?1:0)); \ |
| 101 | 101 | m_A=(UINT8)r2; \ |
| 102 | | if( ((UINT8)r2)==0 ) f=FLAG_N|FLAG_Z; \ |
| 103 | | else f=FLAG_N; \ |
| 104 | | if( r2>0xFF ) f|=FLAG_C; \ |
| 105 | | if( r1>0xF ) f|=FLAG_H; \ |
| 102 | if( ((UINT8)r2)==0 ) f=LR35902_FLAG_N|LR35902_FLAG_Z; \ |
| 103 | else f=LR35902_FLAG_N; \ |
| 104 | if( r2>0xFF ) f|=LR35902_FLAG_C; \ |
| 105 | if( r1>0xF ) f|=LR35902_FLAG_H; \ |
| 106 | 106 | m_F=f; \ |
| 107 | 107 | } |
| 108 | 108 | |
| r23908 | r23909 | |
| 110 | 110 | { \ |
| 111 | 111 | register UINT16 r1,r2; \ |
| 112 | 112 | register UINT8 f; \ |
| 113 | | r1=(UINT16)((m_A&0xF)+((x)&0xF)+((m_F&FLAG_C)?1:0)); \ |
| 114 | | r2=(UINT16)(m_A+(x)+((m_F&FLAG_C)?1:0)); \ |
| 115 | | if( (m_A=(UINT8)r2)==0 ) f=FLAG_Z; \ |
| 113 | r1=(UINT16)((m_A&0xF)+((x)&0xF)+((m_F&LR35902_FLAG_C)?1:0)); \ |
| 114 | r2=(UINT16)(m_A+(x)+((m_F&LR35902_FLAG_C)?1:0)); \ |
| 115 | if( (m_A=(UINT8)r2)==0 ) f=LR35902_FLAG_Z; \ |
| 116 | 116 | else f=0; \ |
| 117 | | if( r2>0xFF ) f|=FLAG_C; \ |
| 118 | | if( r1>0xF ) f|=FLAG_H; \ |
| 117 | if( r2>0xFF ) f|=LR35902_FLAG_C; \ |
| 118 | if( r1>0xF ) f|=LR35902_FLAG_H; \ |
| 119 | 119 | m_F=f; \ |
| 120 | 120 | } |
| 121 | 121 | |
| 122 | 122 | #define AND_A_X(x) \ |
| 123 | 123 | if( (m_A&=(x))==0 ) \ |
| 124 | | m_F=FLAG_H|FLAG_Z; \ |
| 124 | m_F=LR35902_FLAG_H|LR35902_FLAG_Z; \ |
| 125 | 125 | else \ |
| 126 | | m_F=FLAG_H; |
| 126 | m_F=LR35902_FLAG_H; |
| 127 | 127 | |
| 128 | 128 | #define XOR_A_X(x) \ |
| 129 | 129 | if( (m_A^=(x))==0 ) \ |
| 130 | | m_F=FLAG_Z; \ |
| 130 | m_F=LR35902_FLAG_Z; \ |
| 131 | 131 | else \ |
| 132 | 132 | m_F=0; |
| 133 | 133 | |
| 134 | 134 | #define OR_A_X(x) \ |
| 135 | 135 | if( (m_A|=(x))==0 ) \ |
| 136 | | m_F=FLAG_Z; \ |
| 136 | m_F=LR35902_FLAG_Z; \ |
| 137 | 137 | else \ |
| 138 | 138 | m_F=0; |
| 139 | 139 | |
| r23908 | r23909 | |
| 190 | 190 | m_A = (UINT8) ((m_A << 1) | (m_A >> 7)); |
| 191 | 191 | if (m_A & 1) |
| 192 | 192 | { |
| 193 | | m_F = FLAG_C; |
| 193 | m_F = LR35902_FLAG_C; |
| 194 | 194 | } |
| 195 | 195 | else |
| 196 | 196 | { |
| r23908 | r23909 | |
| 244 | 244 | m_F = 0; |
| 245 | 245 | if (m_A & 0x80) |
| 246 | 246 | { |
| 247 | | m_F |= FLAG_C; |
| 247 | m_F |= LR35902_FLAG_C; |
| 248 | 248 | } |
| 249 | 249 | break; |
| 250 | 250 | case 0x10: /* STOP */ |
| r23908 | r23909 | |
| 289 | 289 | break; |
| 290 | 290 | case 0x17: /* RLA */ |
| 291 | 291 | |
| 292 | | x = (m_A & 0x80) ? FLAG_C : 0; |
| 292 | x = (m_A & 0x80) ? LR35902_FLAG_C : 0; |
| 293 | 293 | |
| 294 | | m_A = (UINT8) ((m_A << 1) | ((m_F & FLAG_C) ? 1 : 0)); |
| 294 | m_A = (UINT8) ((m_A << 1) | ((m_F & LR35902_FLAG_C) ? 1 : 0)); |
| 295 | 295 | m_F = x; |
| 296 | 296 | break; |
| 297 | 297 | case 0x18: /* JR n8 */ |
| r23908 | r23909 | |
| 340 | 340 | break; |
| 341 | 341 | case 0x1F: /* RRA */ |
| 342 | 342 | |
| 343 | | x = (m_A & 1) ? FLAG_C : 0; |
| 343 | x = (m_A & 1) ? LR35902_FLAG_C : 0; |
| 344 | 344 | |
| 345 | | m_A = (UINT8) ((m_A >> 1) | ((m_F & FLAG_C) ? 0x80 : 0)); |
| 345 | m_A = (UINT8) ((m_A >> 1) | ((m_F & LR35902_FLAG_C) ? 0x80 : 0)); |
| 346 | 346 | m_F = x; |
| 347 | 347 | break; |
| 348 | 348 | case 0x20: /* JR NZ,n8 */ |
| 349 | 349 | { |
| 350 | 350 | INT8 offset = mem_read_byte( m_PC++ ); |
| 351 | | if (! (m_F & FLAG_Z) ) |
| 351 | if (! (m_F & LR35902_FLAG_Z) ) |
| 352 | 352 | { |
| 353 | 353 | m_PC += offset; |
| 354 | 354 | cycles_passed( 4 ); |
| r23908 | r23909 | |
| 405 | 405 | { |
| 406 | 406 | int tmp = m_A; |
| 407 | 407 | |
| 408 | | if ( ! ( m_F & FLAG_N ) ) { |
| 409 | | if ( ( m_F & FLAG_H ) || ( tmp & 0x0F ) > 9 ) |
| 408 | if ( ! ( m_F & LR35902_FLAG_N ) ) { |
| 409 | if ( ( m_F & LR35902_FLAG_H ) || ( tmp & 0x0F ) > 9 ) |
| 410 | 410 | tmp += 6; |
| 411 | | if ( ( m_F & FLAG_C ) || tmp > 0x9F ) |
| 411 | if ( ( m_F & LR35902_FLAG_C ) || tmp > 0x9F ) |
| 412 | 412 | tmp += 0x60; |
| 413 | 413 | } else { |
| 414 | | if ( m_F & FLAG_H ) { |
| 414 | if ( m_F & LR35902_FLAG_H ) { |
| 415 | 415 | tmp -= 6; |
| 416 | | if ( ! ( m_F & FLAG_C ) ) |
| 416 | if ( ! ( m_F & LR35902_FLAG_C ) ) |
| 417 | 417 | tmp &= 0xFF; |
| 418 | 418 | } |
| 419 | | if ( m_F & FLAG_C ) |
| 419 | if ( m_F & LR35902_FLAG_C ) |
| 420 | 420 | tmp -= 0x60; |
| 421 | 421 | } |
| 422 | | m_F &= ~ ( FLAG_H | FLAG_Z ); |
| 422 | m_F &= ~ ( LR35902_FLAG_H | LR35902_FLAG_Z ); |
| 423 | 423 | if ( tmp & 0x100 ) |
| 424 | | m_F |= FLAG_C; |
| 424 | m_F |= LR35902_FLAG_C; |
| 425 | 425 | m_A = tmp & 0xFF; |
| 426 | 426 | if ( ! m_A ) |
| 427 | | m_F |= FLAG_Z; |
| 427 | m_F |= LR35902_FLAG_Z; |
| 428 | 428 | } |
| 429 | 429 | break; |
| 430 | 430 | case 0x28: /* JR Z,n8 */ |
| 431 | 431 | { |
| 432 | 432 | INT8 offset = mem_read_byte( m_PC++ ); |
| 433 | 433 | |
| 434 | | if (m_F & FLAG_Z) |
| 434 | if (m_F & LR35902_FLAG_Z) |
| 435 | 435 | { |
| 436 | 436 | m_PC += offset; |
| 437 | 437 | cycles_passed( 4 ); |
| r23908 | r23909 | |
| 486 | 486 | case 0x2F: /* CPL */ |
| 487 | 487 | |
| 488 | 488 | m_A = ~m_A; |
| 489 | | m_F |= FLAG_N | FLAG_H; |
| 489 | m_F |= LR35902_FLAG_N | LR35902_FLAG_H; |
| 490 | 490 | break; |
| 491 | 491 | case 0x30: /* JR NC,n8 */ |
| 492 | 492 | { |
| 493 | 493 | INT8 offset = mem_read_byte( m_PC++ ); |
| 494 | 494 | |
| 495 | | if ( ! (m_F & FLAG_C) ) |
| 495 | if ( ! (m_F & LR35902_FLAG_C) ) |
| 496 | 496 | { |
| 497 | 497 | m_PC += offset; |
| 498 | 498 | cycles_passed( 4 ); |
| r23908 | r23909 | |
| 528 | 528 | UINT16 addr = ( m_H << 8 ) | m_L; |
| 529 | 529 | register UINT8 r, f; |
| 530 | 530 | |
| 531 | | f = (UINT8) (m_F & FLAG_C); |
| 531 | f = (UINT8) (m_F & LR35902_FLAG_C); |
| 532 | 532 | r = mem_read_byte( addr ); |
| 533 | 533 | r += 1; |
| 534 | 534 | mem_write_byte( addr, r ); |
| 535 | 535 | |
| 536 | 536 | if (r == 0) |
| 537 | | f |= FLAG_Z; |
| 537 | f |= LR35902_FLAG_Z; |
| 538 | 538 | |
| 539 | 539 | if ((r & 0xF) == 0) |
| 540 | | f |= FLAG_H; |
| 540 | f |= LR35902_FLAG_H; |
| 541 | 541 | |
| 542 | 542 | m_F = f; |
| 543 | 543 | } |
| r23908 | r23909 | |
| 547 | 547 | UINT16 addr = ( m_H << 8 ) | m_L; |
| 548 | 548 | register UINT8 r, f; |
| 549 | 549 | |
| 550 | | f = (UINT8) ((m_F & FLAG_C) | FLAG_N); |
| 550 | f = (UINT8) ((m_F & LR35902_FLAG_C) | LR35902_FLAG_N); |
| 551 | 551 | r = mem_read_byte( addr ); |
| 552 | 552 | r -= 1; |
| 553 | 553 | mem_write_byte( addr, r ); |
| 554 | 554 | |
| 555 | 555 | if (r == 0) |
| 556 | | f |= FLAG_Z; |
| 556 | f |= LR35902_FLAG_Z; |
| 557 | 557 | |
| 558 | 558 | if ((r & 0xF) == 0xF) |
| 559 | | f |= FLAG_H; |
| 559 | f |= LR35902_FLAG_H; |
| 560 | 560 | |
| 561 | 561 | m_F = f; |
| 562 | 562 | } |
| r23908 | r23909 | |
| 569 | 569 | break; |
| 570 | 570 | case 0x37: /* SCF */ |
| 571 | 571 | |
| 572 | | m_F = (UINT8) ((m_F & FLAG_Z) | FLAG_C); |
| 572 | m_F = (UINT8) ((m_F & LR35902_FLAG_Z) | LR35902_FLAG_C); |
| 573 | 573 | break; |
| 574 | 574 | case 0x38: /* JR C,n8 */ |
| 575 | 575 | { |
| 576 | 576 | INT8 offset = mem_read_byte( m_PC++ ); |
| 577 | 577 | |
| 578 | | if (m_F & FLAG_C) |
| 578 | if (m_F & LR35902_FLAG_C) |
| 579 | 579 | { |
| 580 | 580 | m_PC += offset; |
| 581 | 581 | cycles_passed( 4 ); |
| r23908 | r23909 | |
| 618 | 618 | break; |
| 619 | 619 | case 0x3F: /* CCF */ |
| 620 | 620 | |
| 621 | | m_F = (UINT8) ((m_F & FLAG_Z) | ((m_F & FLAG_C) ? 0 : FLAG_C)); |
| 621 | m_F = (UINT8) ((m_F & LR35902_FLAG_Z) | ((m_F & LR35902_FLAG_C) ? 0 : LR35902_FLAG_C)); |
| 622 | 622 | break; |
| 623 | 623 | case 0x40: /* LD B,B */ |
| 624 | 624 | break; |
| r23908 | r23909 | |
| 1026 | 1026 | break; |
| 1027 | 1027 | case 0xA7: /* AND A,A */ |
| 1028 | 1028 | |
| 1029 | | m_F = (m_A == 0) ? (FLAG_H | FLAG_Z) : FLAG_H; |
| 1029 | m_F = (m_A == 0) ? (LR35902_FLAG_H | LR35902_FLAG_Z) : LR35902_FLAG_H; |
| 1030 | 1030 | break; |
| 1031 | 1031 | case 0xA8: /* XOR A,B */ |
| 1032 | 1032 | |
| r23908 | r23909 | |
| 1132 | 1132 | break; |
| 1133 | 1133 | case 0xC0: /* RET NZ */ |
| 1134 | 1134 | cycles_passed( 4 ); |
| 1135 | | if (!(m_F & FLAG_Z)) |
| 1135 | if (!(m_F & LR35902_FLAG_Z)) |
| 1136 | 1136 | { |
| 1137 | 1137 | m_PC = mem_read_word( m_SP ); |
| 1138 | 1138 | m_SP += 2; |
| r23908 | r23909 | |
| 1147 | 1147 | UINT16 addr = mem_read_word( m_PC ); |
| 1148 | 1148 | m_PC += 2; |
| 1149 | 1149 | |
| 1150 | | if ( ! (m_F & FLAG_Z) ) |
| 1150 | if ( ! (m_F & LR35902_FLAG_Z) ) |
| 1151 | 1151 | { |
| 1152 | 1152 | m_PC = addr; |
| 1153 | 1153 | cycles_passed( 4 ); |
| r23908 | r23909 | |
| 1163 | 1163 | UINT16 addr = mem_read_word( m_PC ); |
| 1164 | 1164 | m_PC += 2; |
| 1165 | 1165 | |
| 1166 | | if ( ! (m_F & FLAG_Z) ) |
| 1166 | if ( ! (m_F & LR35902_FLAG_Z) ) |
| 1167 | 1167 | { |
| 1168 | 1168 | m_SP -= 2; |
| 1169 | 1169 | mem_write_word( m_SP, m_PC ); |
| r23908 | r23909 | |
| 1189 | 1189 | break; |
| 1190 | 1190 | case 0xC8: /* RET Z */ |
| 1191 | 1191 | cycles_passed( 4 ); |
| 1192 | | if (m_F & FLAG_Z) |
| 1192 | if (m_F & LR35902_FLAG_Z) |
| 1193 | 1193 | { |
| 1194 | 1194 | m_PC = mem_read_word( m_SP ); |
| 1195 | 1195 | m_SP += 2; |
| r23908 | r23909 | |
| 1206 | 1206 | UINT16 addr = mem_read_word( m_PC ); |
| 1207 | 1207 | m_PC += 2; |
| 1208 | 1208 | |
| 1209 | | if (m_F & FLAG_Z) |
| 1209 | if (m_F & LR35902_FLAG_Z) |
| 1210 | 1210 | { |
| 1211 | 1211 | m_PC = addr; |
| 1212 | 1212 | cycles_passed( 4 ); |
| r23908 | r23909 | |
| 1225 | 1225 | UINT16 addr = mem_read_word( m_PC ); |
| 1226 | 1226 | m_PC += 2; |
| 1227 | 1227 | |
| 1228 | | if (m_F & FLAG_Z) |
| 1228 | if (m_F & LR35902_FLAG_Z) |
| 1229 | 1229 | { |
| 1230 | 1230 | m_SP -= 2; |
| 1231 | 1231 | mem_write_word( m_SP, m_PC ); |
| r23908 | r23909 | |
| 1258 | 1258 | break; |
| 1259 | 1259 | case 0xD0: /* RET NC */ |
| 1260 | 1260 | cycles_passed( 4 ); |
| 1261 | | if (!(m_F & FLAG_C)) |
| 1261 | if (!(m_F & LR35902_FLAG_C)) |
| 1262 | 1262 | { |
| 1263 | 1263 | m_PC = mem_read_word( m_SP ); |
| 1264 | 1264 | m_SP += 2; |
| r23908 | r23909 | |
| 1273 | 1273 | UINT16 addr = mem_read_word( m_PC ); |
| 1274 | 1274 | m_PC += 2; |
| 1275 | 1275 | |
| 1276 | | if ( ! (m_F & FLAG_C) ) |
| 1276 | if ( ! (m_F & LR35902_FLAG_C) ) |
| 1277 | 1277 | { |
| 1278 | 1278 | m_PC = addr; |
| 1279 | 1279 | cycles_passed( 4 ); |
| r23908 | r23909 | |
| 1287 | 1287 | UINT16 addr = mem_read_word( m_PC ); |
| 1288 | 1288 | m_PC += 2; |
| 1289 | 1289 | |
| 1290 | | if ( ! (m_F & FLAG_C) ) |
| 1290 | if ( ! (m_F & LR35902_FLAG_C) ) |
| 1291 | 1291 | { |
| 1292 | 1292 | m_SP -= 2; |
| 1293 | 1293 | mem_write_word( m_SP, m_PC ); |
| r23908 | r23909 | |
| 1313 | 1313 | break; |
| 1314 | 1314 | case 0xD8: /* RET C */ |
| 1315 | 1315 | cycles_passed( 4 ); |
| 1316 | | if (m_F & FLAG_C) |
| 1316 | if (m_F & LR35902_FLAG_C) |
| 1317 | 1317 | { |
| 1318 | 1318 | m_PC = mem_read_word( m_SP ); |
| 1319 | 1319 | m_SP += 2; |
| r23908 | r23909 | |
| 1331 | 1331 | UINT16 addr = mem_read_word( m_PC ); |
| 1332 | 1332 | m_PC += 2; |
| 1333 | 1333 | |
| 1334 | | if (m_F & FLAG_C) |
| 1334 | if (m_F & LR35902_FLAG_C) |
| 1335 | 1335 | { |
| 1336 | 1336 | m_PC = addr; |
| 1337 | 1337 | cycles_passed( 4 ); |
| r23908 | r23909 | |
| 1345 | 1345 | UINT16 addr = mem_read_word( m_PC ); |
| 1346 | 1346 | m_PC += 2; |
| 1347 | 1347 | |
| 1348 | | if (m_F & FLAG_C) |
| 1348 | if (m_F & LR35902_FLAG_C) |
| 1349 | 1349 | { |
| 1350 | 1350 | m_SP -= 2; |
| 1351 | 1351 | mem_write_word( m_SP, m_PC ); |
| r23908 | r23909 | |
| 1414 | 1414 | |
| 1415 | 1415 | if ( ( m_SP & 0xFF ) + (UINT8)(n & 0xFF) > 0xFF ) |
| 1416 | 1416 | { |
| 1417 | | m_F = FLAG_C; |
| 1417 | m_F = LR35902_FLAG_C; |
| 1418 | 1418 | } |
| 1419 | 1419 | else |
| 1420 | 1420 | { |
| r23908 | r23909 | |
| 1423 | 1423 | |
| 1424 | 1424 | if ( ( m_SP & 0x0F ) + ( n & 0x0F ) > 0x0F ) |
| 1425 | 1425 | { |
| 1426 | | m_F |= FLAG_H; |
| 1426 | m_F |= LR35902_FLAG_H; |
| 1427 | 1427 | } |
| 1428 | 1428 | |
| 1429 | 1429 | m_SP = (UINT16) ( m_SP + n ); |
| r23908 | r23909 | |
| 1509 | 1509 | |
| 1510 | 1510 | if ( ( m_SP & 0xFF ) + (UINT8)(n & 0xFF) > 0xFF ) |
| 1511 | 1511 | { |
| 1512 | | m_F = FLAG_C; |
| 1512 | m_F = LR35902_FLAG_C; |
| 1513 | 1513 | } |
| 1514 | 1514 | else |
| 1515 | 1515 | { |
| r23908 | r23909 | |
| 1518 | 1518 | |
| 1519 | 1519 | if ( ( m_SP & 0x0F ) + ( n & 0x0F ) > 0x0F ) |
| 1520 | 1520 | { |
| 1521 | | m_F |= FLAG_H; |
| 1521 | m_F |= LR35902_FLAG_H; |
| 1522 | 1522 | } |
| 1523 | 1523 | |
| 1524 | 1524 | UINT16 res = m_SP + n; |