mirror of
				https://github.com/TomHarte/CLK.git
				synced 2025-10-31 20:16:07 +00:00 
			
		
		
		
	Forwards most of the Z80 state.
This commit is contained in:
		| @@ -7,40 +7,65 @@ | ||||
| // | ||||
|  | ||||
| #include "SNA.hpp" | ||||
|  | ||||
| #include "../FileHolder.hpp" | ||||
|  | ||||
| #include "../../Analyser/Static/ZXSpectrum/Target.hpp" | ||||
| #include "../../Machines/Sinclair/ZXSpectrum/State.hpp" | ||||
|  | ||||
| using namespace Storage::State; | ||||
|  | ||||
| std::unique_ptr<Analyser::Static::Target> SNA::load(const std::string &file_name) { | ||||
| 	using Target = Analyser::Static::ZXSpectrum::Target; | ||||
| 	auto result = std::make_unique<Target>(); | ||||
| 	// Make sure the file is accessible and appropriately sized. | ||||
| 	FileHolder file(file_name); | ||||
| 	if(file.stats().st_size != 48*1024 + 0x1b) { | ||||
| 		return nullptr; | ||||
| 	} | ||||
|  | ||||
| 	// SNAs are always for 48kb machines. | ||||
| 	using Target = Analyser::Static::ZXSpectrum::Target; | ||||
| 	auto result = std::make_unique<Target>(); | ||||
| 	result->model = Target::Model::FortyEightK; | ||||
|  | ||||
| 	// 0x1a byte header: | ||||
| 	// | ||||
| 	// Prepare to populate ZX Spectrum state. | ||||
| 	auto *const state = new Sinclair::ZXSpectrum::State(); | ||||
| 	result->state = std::unique_ptr<Reflection::Struct>(state); | ||||
|  | ||||
| 	// Comments below: [offset] [contents] | ||||
|  | ||||
| 	//	00	I | ||||
| 	//	01	HL' | ||||
| 	//	03	DE' | ||||
| 	//	05	BC' | ||||
| 	//	07	AF' | ||||
| 	//	09	HL | ||||
| 	//	0B	DE | ||||
| 	//	0D	BC | ||||
| 	//	0F	IY | ||||
| 	//	11	IX | ||||
| 	const uint8_t i = file.get8(); | ||||
|  | ||||
| 	//	01	HL';	03	DE';	05	BC';	07	AF' | ||||
| 	state->z80.registers.hlDash = file.get16le(); | ||||
| 	state->z80.registers.deDash = file.get16le(); | ||||
| 	state->z80.registers.bcDash = file.get16le(); | ||||
| 	state->z80.registers.afDash = file.get16le(); | ||||
|  | ||||
| 	//	09	HL;		0B	DE;		0D	BC;		0F	IY;		11	IX | ||||
| 	state->z80.registers.hl = file.get16le(); | ||||
| 	state->z80.registers.de = file.get16le(); | ||||
| 	state->z80.registers.bc = file.get16le(); | ||||
| 	state->z80.registers.iy = file.get16le(); | ||||
| 	state->z80.registers.ix = file.get16le(); | ||||
|  | ||||
| 	//	13	IFF2 (in bit 2) | ||||
| 	const uint8_t iff = file.get8(); | ||||
| 	state->z80.registers.iff1 = state->z80.registers.iff2 = iff & 4; | ||||
|  | ||||
| 	//	14	R | ||||
| 	//	15	AF | ||||
| 	//	17	SP | ||||
| 	//	19	interrupt mode | ||||
| 	const uint8_t r = file.get8(); | ||||
| 	state->z80.registers.ir = uint16_t((i << 8) | r); | ||||
|  | ||||
| 	//	15	AF;		17	SP;		19	interrupt mode | ||||
| 	state->z80.registers.flags = file.get8(); | ||||
| 	state->z80.registers.a = file.get8(); | ||||
| 	state->z80.registers.stack_pointer = file.get16le(); | ||||
| 	state->z80.registers.interrupt_mode = file.get8(); | ||||
|  | ||||
| 	// TODO: border colour, RAM contents, then pop the program counter. | ||||
| 	//	1A	border colour | ||||
| 	//	1B–	48kb RAM contents | ||||
| 	// | ||||
| 	// (perform a POP to get the PC) | ||||
|  | ||||
| 	(void)file_name; | ||||
|  | ||||
| 	return result; | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user