Fix detect-on-load of Level 3.5 objects and DRCS mode

This commit is contained in:
G.K.MacGregor
2022-10-23 12:30:50 +01:00
parent 4faed597c0
commit 536c231941

View File

@@ -25,6 +25,8 @@
#include "levelonepage.h"
#include "x26triplets.h"
LevelOnePage::LevelOnePage()
{
m_enhancements.reserve(maxEnhancements());
@@ -403,17 +405,21 @@ bool LevelOnePage::isPaletteDefault(int fromColour, int toColour) const
int LevelOnePage::levelRequired() const
{
// X/28/4 present i.e. CLUTs 0 or 1 redefined - Level 3.5
if (!isPaletteDefault(0, 15))
return 3;
// TODO Check for X/28/1 for DCLUT for mode 1-3 DRCS characters - return 3
// Assume Level 2.5 if any X/28 page enhancements are present, otherwise assume Level 1
int levelSeen = (!isPaletteDefault(16,31) || m_leftSidePanelDisplayed || m_rightSidePanelDisplayed || m_defaultScreenColour !=0 || m_defaultRowColour !=0 || m_blackBackgroundSubst || m_colourTableRemap !=0 || m_defaultCharSet != 0 || m_secondCharSet != 0xf) ? 2 : 0;
// If there's no X/26 triplets, exit here as Level 1 or 2.5
if (m_enhancements.isEmpty())
return levelSeen;
for (int i=0; i<m_enhancements.size(); i++) {
// Font style - Level 3.5 only triplet
if (m_enhancements.at(i).modeExt() == 0x2e) // Font style
return 3;
@@ -426,9 +432,10 @@ int LevelOnePage::levelRequired() const
case 0x22: // G3 character @ Level 1.5
case 0x2f: // G2 character
case 0x30 ... 0x3f: // G0 character with diacritical
levelSeen = qMax(levelSeen, 1);
levelSeen = 1;
break;
}
if (levelSeen < 2)
switch (m_enhancements.at(i).modeExt()) {
// Check for Level 2.5 triplets
@@ -436,25 +443,26 @@ int LevelOnePage::levelRequired() const
case 0x01: // Full row colour
case 0x10 ... 0x13: // Origin Modifer and Object Invocation
case 0x15 ... 0x17: // Object Definition
// Check if Object Definition is required only at Level 3.5
if ((m_enhancements.at(i).address() & 0x18) == 0x10)
return 3;
else
levelSeen = qMax(levelSeen, 2);
break;
case 0x18: // DRCS Mode
// Check if DRCS is required only at Level 3.5
if ((m_enhancements.at(i).data() & 0x30) == 0x20)
return 3;
else
levelSeen = qMax(levelSeen, 2);
break;
case 0x20: // Foreground colour
case 0x21: // G1 character
case 0x23: // Background colour
case 0x27 ... 0x29: // Flash functions, G0 and G2 charset designation, G0 character @ Level 2.5
case 0x2b ... 0x2d: // G3 character @ Level 2.5, display attributes, DRCS character
levelSeen = qMax(levelSeen, 2);
levelSeen = 2;
break;
}
if (levelSeen == 2)
switch (m_enhancements.at(i).modeExt()) {
// Check for triplets with "required at Level 3.5 only" parameters
case 0x15 ... 0x17: // Object Definition
if ((m_enhancements.at(i).address() & 0x18) == 0x10)
return 3;
break;
case 0x18: // DRCS Mode
if ((m_enhancements.at(i).data() & 0x30) == 0x20)
return 3;
break;
}
}