mirror of
https://github.com/TomHarte/CLK.git
synced 2024-11-26 08:49:37 +00:00
Merge branch 'VDPs' of github.com:TomHarte/CLK into VDPs
This commit is contained in:
commit
bb436204f6
@ -171,7 +171,7 @@ void TMS9918<personality>::run_for(const HalfCycles cycles) {
|
|||||||
if(write_cycles_pool) {
|
if(write_cycles_pool) {
|
||||||
// Determine how much writing to do.
|
// Determine how much writing to do.
|
||||||
const int write_cycles = std::min(
|
const int write_cycles = std::min(
|
||||||
this->clock_converter_.CyclesPerLine - this->write_pointer_.column,
|
Timing<personality>::CyclesPerLine - this->write_pointer_.column,
|
||||||
write_cycles_pool
|
write_cycles_pool
|
||||||
);
|
);
|
||||||
const int end_column = this->write_pointer_.column + write_cycles;
|
const int end_column = this->write_pointer_.column + write_cycles;
|
||||||
@ -270,7 +270,7 @@ void TMS9918<personality>::run_for(const HalfCycles cycles) {
|
|||||||
this->write_pointer_.column = end_column;
|
this->write_pointer_.column = end_column;
|
||||||
write_cycles_pool -= write_cycles;
|
write_cycles_pool -= write_cycles;
|
||||||
|
|
||||||
if(this->write_pointer_.column == this->clock_converter_.CyclesPerLine) {
|
if(this->write_pointer_.column == Timing<personality>::CyclesPerLine) {
|
||||||
this->write_pointer_.column = 0;
|
this->write_pointer_.column = 0;
|
||||||
this->write_pointer_.row = (this->write_pointer_.row + 1) % this->mode_timing_.total_lines;
|
this->write_pointer_.row = (this->write_pointer_.row + 1) % this->mode_timing_.total_lines;
|
||||||
LineBuffer &next_line_buffer = this->line_buffers_[this->write_pointer_.row];
|
LineBuffer &next_line_buffer = this->line_buffers_[this->write_pointer_.row];
|
||||||
@ -279,7 +279,7 @@ void TMS9918<personality>::run_for(const HalfCycles cycles) {
|
|||||||
this->set_current_screen_mode();
|
this->set_current_screen_mode();
|
||||||
|
|
||||||
// Based on the output mode, pick a line mode.
|
// Based on the output mode, pick a line mode.
|
||||||
next_line_buffer.first_pixel_output_column = 86; // TODO: these should be a function of ClockConverter::CyclesPerLine.
|
next_line_buffer.first_pixel_output_column = 86; // TODO: these should be a function of Timing<personality>
|
||||||
next_line_buffer.next_border_column = 342;
|
next_line_buffer.next_border_column = 342;
|
||||||
this->mode_timing_.maximum_visible_sprites = 4;
|
this->mode_timing_.maximum_visible_sprites = 4;
|
||||||
switch(this->screen_mode_) {
|
switch(this->screen_mode_) {
|
||||||
@ -314,7 +314,7 @@ void TMS9918<personality>::run_for(const HalfCycles cycles) {
|
|||||||
if(read_cycles_pool) {
|
if(read_cycles_pool) {
|
||||||
// Determine how much time has passed in the remainder of this line, and proceed.
|
// Determine how much time has passed in the remainder of this line, and proceed.
|
||||||
const int target_read_cycles = std::min(
|
const int target_read_cycles = std::min(
|
||||||
this->clock_converter_.CyclesPerLine - this->read_pointer_.column,
|
Timing<personality>::CyclesPerLine - this->read_pointer_.column,
|
||||||
read_cycles_pool
|
read_cycles_pool
|
||||||
);
|
);
|
||||||
int read_cycles_performed = 0;
|
int read_cycles_performed = 0;
|
||||||
@ -448,7 +448,7 @@ void TMS9918<personality>::run_for(const HalfCycles cycles) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
read_cycles_pool -= target_read_cycles;
|
read_cycles_pool -= target_read_cycles;
|
||||||
if(this->read_pointer_.column == this->clock_converter_.CyclesPerLine) {
|
if(this->read_pointer_.column == Timing<personality>::CyclesPerLine) {
|
||||||
this->read_pointer_.column = 0;
|
this->read_pointer_.column = 0;
|
||||||
this->read_pointer_.row = (this->read_pointer_.row + 1) % this->mode_timing_.total_lines;
|
this->read_pointer_.row = (this->read_pointer_.row + 1) % this->mode_timing_.total_lines;
|
||||||
}
|
}
|
||||||
|
@ -15,6 +15,8 @@
|
|||||||
#include "../../../Numeric/BitReverse.hpp"
|
#include "../../../Numeric/BitReverse.hpp"
|
||||||
#include "../../../Outputs/CRT/CRT.hpp"
|
#include "../../../Outputs/CRT/CRT.hpp"
|
||||||
|
|
||||||
|
#include "PersonalityTraits.hpp"
|
||||||
|
|
||||||
#include <array>
|
#include <array>
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
@ -25,10 +27,7 @@
|
|||||||
namespace TI {
|
namespace TI {
|
||||||
namespace TMS {
|
namespace TMS {
|
||||||
|
|
||||||
constexpr bool is_sega_vdp(Personality p) {
|
// Additional properties that correlate with personality.
|
||||||
return p >= Personality::SMSVDP;
|
|
||||||
}
|
|
||||||
|
|
||||||
constexpr size_t memory_size(Personality p) {
|
constexpr size_t memory_size(Personality p) {
|
||||||
switch(p) {
|
switch(p) {
|
||||||
case TI::TMS::TMS9918A:
|
case TI::TMS::TMS9918A:
|
||||||
|
@ -10,18 +10,28 @@
|
|||||||
#define ClockConverter_hpp
|
#define ClockConverter_hpp
|
||||||
|
|
||||||
#include "../9918.hpp"
|
#include "../9918.hpp"
|
||||||
|
#include "PersonalityTraits.hpp"
|
||||||
|
|
||||||
namespace TI {
|
namespace TI {
|
||||||
namespace TMS {
|
namespace TMS {
|
||||||
|
|
||||||
template <Personality personality> constexpr int cycles_per_line() {
|
// Timing constants.
|
||||||
switch(personality) {
|
template <Personality, typename Enable = void> struct Timing {};
|
||||||
default: return 342;
|
|
||||||
case Personality::V9938:
|
template <Personality personality>
|
||||||
case Personality::V9958: return 1368;
|
struct Timing<personality, std::enable_if_t<is_yamaha_vdp(personality)>> {
|
||||||
case Personality::MDVDP: return 3420;
|
constexpr static int CyclesPerLine = 1368;
|
||||||
}
|
};
|
||||||
}
|
|
||||||
|
template <Personality personality>
|
||||||
|
struct Timing<personality, std::enable_if_t<is_classic_vdp(personality)>> {
|
||||||
|
constexpr static int CyclesPerLine = 342;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <>
|
||||||
|
struct Timing<Personality::MDVDP> {
|
||||||
|
constexpr static int CyclesPerLine = 3420;
|
||||||
|
};
|
||||||
|
|
||||||
constexpr int TMSAccessWindowsPerLine = 171;
|
constexpr int TMSAccessWindowsPerLine = 171;
|
||||||
|
|
||||||
@ -133,9 +143,6 @@ template <Personality personality> class ClockConverter {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// The number of internal cycles in a single line.
|
|
||||||
constexpr static int CyclesPerLine = cycles_per_line<personality>();
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// Holds current residue in conversion from the external to
|
// Holds current residue in conversion from the external to
|
||||||
// internal clock.
|
// internal clock.
|
||||||
|
36
Components/9918/Implementation/PersonalityTraits.hpp
Normal file
36
Components/9918/Implementation/PersonalityTraits.hpp
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
//
|
||||||
|
// PersonalityTraits.hpp
|
||||||
|
// Clock Signal
|
||||||
|
//
|
||||||
|
// Created by Thomas Harte on 06/01/2023.
|
||||||
|
// Copyright © 2023 Thomas Harte. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef PersonalityTraits_hpp
|
||||||
|
#define PersonalityTraits_hpp
|
||||||
|
|
||||||
|
namespace TI {
|
||||||
|
namespace TMS {
|
||||||
|
|
||||||
|
// Genus determinants for the various personalityes.
|
||||||
|
constexpr bool is_sega_vdp(Personality p) {
|
||||||
|
return p >= Personality::SMSVDP;
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr bool is_yamaha_vdp(Personality p) {
|
||||||
|
return p == Personality::V9938 || p == Personality::V9958;
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr bool is_classic_vdp(Personality p) {
|
||||||
|
return
|
||||||
|
p == Personality::TMS9918A ||
|
||||||
|
p == Personality::SMSVDP ||
|
||||||
|
p == Personality::SMS2VDP ||
|
||||||
|
p == Personality::GGVDP;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* PersonalityTraits_hpp */
|
@ -1246,6 +1246,7 @@
|
|||||||
4B228CDA24DA41880077EF25 /* ScanTarget.metal */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.metal; path = ScanTarget.metal; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.metal; };
|
4B228CDA24DA41880077EF25 /* ScanTarget.metal */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.metal; path = ScanTarget.metal; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.metal; };
|
||||||
4B24095A1C45DF85004DA684 /* Stepper.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = Stepper.hpp; sourceTree = "<group>"; };
|
4B24095A1C45DF85004DA684 /* Stepper.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = Stepper.hpp; sourceTree = "<group>"; };
|
||||||
4B2530F3244E6773007980BF /* fm.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = fm.json; sourceTree = "<group>"; };
|
4B2530F3244E6773007980BF /* fm.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = fm.json; sourceTree = "<group>"; };
|
||||||
|
4B262BFF29691F55002EC0F7 /* PersonalityTraits.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = PersonalityTraits.hpp; sourceTree = "<group>"; };
|
||||||
4B2A332C1DB86821002876E3 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = "Clock Signal/Base.lproj/OricOptions.xib"; sourceTree = SOURCE_ROOT; };
|
4B2A332C1DB86821002876E3 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = "Clock Signal/Base.lproj/OricOptions.xib"; sourceTree = SOURCE_ROOT; };
|
||||||
4B2A53901D117D36003C6002 /* CSAudioQueue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CSAudioQueue.h; sourceTree = "<group>"; };
|
4B2A53901D117D36003C6002 /* CSAudioQueue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CSAudioQueue.h; sourceTree = "<group>"; };
|
||||||
4B2A53911D117D36003C6002 /* CSAudioQueue.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CSAudioQueue.m; sourceTree = "<group>"; };
|
4B2A53911D117D36003C6002 /* CSAudioQueue.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CSAudioQueue.m; sourceTree = "<group>"; };
|
||||||
@ -4740,8 +4741,9 @@
|
|||||||
4B43983829620FB1006B0BFC /* 9918.cpp */,
|
4B43983829620FB1006B0BFC /* 9918.cpp */,
|
||||||
4BD388411FE34E010042B588 /* 9918Base.hpp */,
|
4BD388411FE34E010042B588 /* 9918Base.hpp */,
|
||||||
4B43983C29621024006B0BFC /* ClockConverter.hpp */,
|
4B43983C29621024006B0BFC /* ClockConverter.hpp */,
|
||||||
4B43983E29628538006B0BFC /* Fetch.hpp */,
|
|
||||||
4B43983F2967459B006B0BFC /* Draw.hpp */,
|
4B43983F2967459B006B0BFC /* Draw.hpp */,
|
||||||
|
4B43983E29628538006B0BFC /* Fetch.hpp */,
|
||||||
|
4B262BFF29691F55002EC0F7 /* PersonalityTraits.hpp */,
|
||||||
);
|
);
|
||||||
path = Implementation;
|
path = Implementation;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
|
Loading…
Reference in New Issue
Block a user