⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sloghex.cpp

📁 pc loader for 8051 based microcomputers
💻 CPP
字号:
// SlogHEX.cpp: implementation of the CSlogHEX class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "SlogHEX.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CSlogHEX::CSlogHEX()
: duzina_m(0)
, adresa_m(0)
, tip_m(UNDEFINED)
, kontrolnaSuma_m(0)
{
}

CSlogHEX::~CSlogHEX()
{

}

bool CSlogHEX::Inicijalizuj
    (
    PRG::tBajt duzina,
    PRG::tAdresa adresa,
    ETip tip,
    PRG::tBajt* pPodaci,
    UINT duzinaPodatka,
    PRG::tBajt suma
    )
{
    bool bOK = true;

    duzina_m = duzina;
    adresa_m = adresa;
    tip_m = tip;
    // isprazni stare i napuni nove podatke
    podaci_m.clear();
    for (UINT i=0; i<duzinaPodatka; ++i) {
        podaci_m.push_back(pPodaci[i]);
    }
    kontrolnaSuma_m = suma;

    return bOK;
}

bool CSlogHEX::Inicijalizuj
    (
    PRG::tBajt duzina,
    PRG::tAdresa adresa,
    PRG::tBajt tip,
    PRG::tBajt* pPodaci,
    UINT duzinaPodatka,
    PRG::tBajt suma
    )
{
    return Inicijalizuj
        (
        duzina,
        adresa,
        BajtUTip(tip),
        pPodaci,
        duzinaPodatka,
        suma
        );
}

void CSlogHEX::Isprazni(void)
{
    Inicijalizuj(0, 0, UNDEFINED, 0, 0, 0);
}

bool CSlogHEX::ProveriKontrolnuSumu(void)
{
    // Za nedefinisani slog, sumu ne proveravam (uvek je OK)
    if (tip_m == UNDEFINED) return true;
    // Za sve ostale tipove suma se proverava na isti nacin
    return (kontrolnaSuma_m == SracunajSumu());
}

bool CSlogHEX::DajBajt(int redBr, PRG::tBajt& bajt, PRG::tAdresa& adresa)
{
    bool bOK = true;

    try {
        bajt = podaci_m.at(redBr);
        adresa = adresa_m + redBr;
    }
    catch (...) {
        bOK = false;
    }

    return bOK;
}

bool CSlogHEX::DataSlog(void)
{
    return (tip_m == DATA);
}

PRG::tBajt CSlogHEX::Duzina(void)
{
    return duzina_m;
}

bool CSlogHEX::EOFSlog(void)
{
    return (tip_m == END_OF_FILE);
}

//////////////////////////////////////////////////////////////////////
// Pomocne funkcije
//////////////////////////////////////////////////////////////////////

CSlogHEX::ETip CSlogHEX::BajtUTip(PRG::tBajt bajt)
{
    ETip tip = UNDEFINED;
    switch (bajt) {
        case DATA:
        case END_OF_FILE:
        case EXTENDED_SEGMENT:
        case EXTENDED_LINEAR:
            tip = static_cast<ETip>(bajt);
            break;
        default:
            tip = UNDEFINED;
            break;
    }
    return tip;
}

PRG::tBajt CSlogHEX::SracunajSumu(void)
{
    // Za nedefinisani slog ne racunam sumu (suma je 0)
    if (tip_m == UNDEFINED) return 0;

    // Za ostale slogove suma se racuna kao dvojicni komplement 
    // zbira svih bajtova po modulu 256 :
    //  cc = 01H + NOT((ll + aa + aa + tt + dd + ...)mod256)
    using namespace PRG;
    tBajt cc = 0;
    //  - duzina (ll)
    cc += duzina_m;
    //  - adresa (aa + aa)
    tBajt adresaHI;
    tBajt adresaLO;
    RasclaniAdresuNaBajtove(adresaHI, adresaLO);
    cc += adresaHI;
    cc += adresaLO;
    //  - tip (tt)
    cc += tip_m;
    //  - podaci (dd + ...)
    tNizBajtova::const_iterator d_iterEnd = podaci_m.end();
    for (tNizBajtova::const_iterator d_iter = podaci_m.begin(); d_iter != d_iterEnd; ++d_iter) {
        cc += (*d_iter);
    }
    // mod 256
    cc = cc % 256;
    // dvojicni komplement
    cc = 0x01 + (~cc);

    return cc;
}

void CSlogHEX::RasclaniAdresuNaBajtove(PRG::tBajt& adresaHI, PRG::tBajt& adresaLO)
{
    adresaHI = (adresa_m >> 8) & 0xff;
    adresaLO = adresa_m & 0xff;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -