mirror of
				https://github.com/TomHarte/CLK.git
				synced 2025-11-04 00:16:26 +00:00 
			
		
		
		
	Install extra cycle for 65c02 decimal arithmetic.
This commit is contained in:
		@@ -86,7 +86,7 @@ void Processor<model, Traits>::run_for(const Cycles cycles) {
 | 
				
			|||||||
		default:
 | 
							default:
 | 
				
			||||||
			__builtin_unreachable();
 | 
								__builtin_unreachable();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// MARK: - Read, write or modify accesses.
 | 
							// MARK: - Read, write or modify a zero-page address.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		access_zero:
 | 
							access_zero:
 | 
				
			||||||
			++registers.pc.full;
 | 
								++registers.pc.full;
 | 
				
			||||||
@@ -100,6 +100,18 @@ void Processor<model, Traits>::run_for(const Cycles cycles) {
 | 
				
			|||||||
				goto access_zero_write;
 | 
									goto access_zero_write;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								// ADC and SBC decimal take an extra cycle on the 65c02.
 | 
				
			||||||
 | 
								if constexpr (is_65c02(model)) {
 | 
				
			||||||
 | 
									if(
 | 
				
			||||||
 | 
										(
 | 
				
			||||||
 | 
											Storage::decoded_.operation == Operation::ADC ||
 | 
				
			||||||
 | 
											Storage::decoded_.operation == Operation::SBC
 | 
				
			||||||
 | 
										) && registers.flags.decimal
 | 
				
			||||||
 | 
									) {
 | 
				
			||||||
 | 
										goto access_zero_65c02_decimal;
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			// Read.
 | 
								// Read.
 | 
				
			||||||
			check_interrupt();
 | 
								check_interrupt();
 | 
				
			||||||
			access(BusOperation::Read, ZeroPage(Storage::address_.halves.low), Storage::operand_);
 | 
								access(BusOperation::Read, ZeroPage(Storage::address_.halves.low), Storage::operand_);
 | 
				
			||||||
@@ -123,6 +135,15 @@ void Processor<model, Traits>::run_for(const Cycles cycles) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
			goto fetch_decode;
 | 
								goto fetch_decode;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							access_zero_65c02_decimal:
 | 
				
			||||||
 | 
								access(BusOperation::Read, ZeroPage(Storage::address_.halves.low), Storage::operand_);
 | 
				
			||||||
 | 
								check_interrupt();
 | 
				
			||||||
 | 
								access(BusOperation::Read, ZeroPage(Storage::address_.halves.low), Storage::operand_);
 | 
				
			||||||
 | 
								perform_operation();
 | 
				
			||||||
 | 
								goto fetch_decode;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// MARK: - Read, write or modify an arbitrary address.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		access_absolute:
 | 
							access_absolute:
 | 
				
			||||||
			++registers.pc.full;
 | 
								++registers.pc.full;
 | 
				
			||||||
			if constexpr (is_65c02(model)) {
 | 
								if constexpr (is_65c02(model)) {
 | 
				
			||||||
@@ -134,6 +155,18 @@ void Processor<model, Traits>::run_for(const Cycles cycles) {
 | 
				
			|||||||
				goto access_absolute_write;
 | 
									goto access_absolute_write;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								// ADC and SBC decimal take an extra cycle on the 65c02.
 | 
				
			||||||
 | 
								if constexpr (is_65c02(model)) {
 | 
				
			||||||
 | 
									if(
 | 
				
			||||||
 | 
										(
 | 
				
			||||||
 | 
											Storage::decoded_.operation == Operation::ADC ||
 | 
				
			||||||
 | 
											Storage::decoded_.operation == Operation::SBC
 | 
				
			||||||
 | 
										) && registers.flags.decimal
 | 
				
			||||||
 | 
									) {
 | 
				
			||||||
 | 
										goto access_absolute_65c02_decimal;
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			// Read.
 | 
								// Read.
 | 
				
			||||||
			check_interrupt();
 | 
								check_interrupt();
 | 
				
			||||||
			access(BusOperation::Read, Literal(Storage::address_.full), Storage::operand_);
 | 
								access(BusOperation::Read, Literal(Storage::address_.full), Storage::operand_);
 | 
				
			||||||
@@ -157,6 +190,13 @@ void Processor<model, Traits>::run_for(const Cycles cycles) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
			goto fetch_decode;
 | 
								goto fetch_decode;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							access_absolute_65c02_decimal:
 | 
				
			||||||
 | 
								access(BusOperation::Read, Literal(Storage::address_.full), Storage::operand_);
 | 
				
			||||||
 | 
								check_interrupt();
 | 
				
			||||||
 | 
								perform_operation();
 | 
				
			||||||
 | 
								access(BusOperation::Read, Literal(Storage::address_.full), Storage::operand_);
 | 
				
			||||||
 | 
								goto fetch_decode;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// MARK: - Fetch/decode.
 | 
							// MARK: - Fetch/decode.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		fetch_decode:
 | 
							fetch_decode:
 | 
				
			||||||
@@ -172,9 +212,6 @@ void Processor<model, Traits>::run_for(const Cycles cycles) {
 | 
				
			|||||||
				goto interrupt;
 | 
									goto interrupt;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if constexpr (is_65c02(model)) {
 | 
					 | 
				
			||||||
				check_interrupt();
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			access(BusOperation::ReadOpcode, Literal(registers.pc.full), Storage::opcode_);
 | 
								access(BusOperation::ReadOpcode, Literal(registers.pc.full), Storage::opcode_);
 | 
				
			||||||
			++registers.pc.full;
 | 
								++registers.pc.full;
 | 
				
			||||||
			Storage::decoded_ = Decoder<model>::decode(Storage::opcode_);
 | 
								Storage::decoded_ = Decoder<model>::decode(Storage::opcode_);
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user