146 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			146 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
/*******************************************************************************/
 | 
						|
/* gtemuAT67 Ver 1.0.5R, (Rlease)                                              */
 | 
						|
/*                                                                             */ 
 | 
						|
/* gtemuAT67 is an emulator, controller, assembler, (vCPU and Native code),    */
 | 
						|
/* disassembler, debugger and  BASIC compiler for the Gigatron TTL             */
 | 
						|
/* microcomputer. Written in C++ using SDL2 by Ari Tsironis, (see the LICENSE  */
 | 
						|
/* and README.md in Contrib\at67 for comprehensive documentation), this        */
 | 
						|
/* project provides Microsoft Windows, Linux and MacOS support.                */
 | 
						|
/*******************************************************************************/
 | 
						|
 | 
						|
 | 
						|
#include "memory.h"
 | 
						|
#include "cpu.h"
 | 
						|
#include "audio.h"
 | 
						|
#include "editor.h"
 | 
						|
#include "loader.h"
 | 
						|
#include "timing.h"
 | 
						|
#include "image.h"
 | 
						|
#include "graphics.h"
 | 
						|
#include "menu.h"
 | 
						|
#include "terminal.h"
 | 
						|
#include "expression.h"
 | 
						|
#include "assembler.h"
 | 
						|
#include "compiler.h"
 | 
						|
#include "operators.h"
 | 
						|
#include "keywords.h"
 | 
						|
#include "pragmas.h"
 | 
						|
#include "functions.h"
 | 
						|
#include "optimiser.h"
 | 
						|
#include "validater.h"
 | 
						|
#include "linker.h"
 | 
						|
 | 
						|
 | 
						|
int main(int argc, char* argv[])
 | 
						|
{
 | 
						|
    if(argc != 1  &&  argc != 2)
 | 
						|
    {
 | 
						|
        fprintf(stderr, "%s\n", VERSION_STR);
 | 
						|
        fprintf(stderr, "Usage:   gtemuAT67 <optional input filename>\n");
 | 
						|
        return 1;
 | 
						|
    }
 | 
						|
 | 
						|
    // TODO: the order of some of these is important
 | 
						|
    Memory::initialise();
 | 
						|
    Loader::initialise();
 | 
						|
    Cpu::initialise();
 | 
						|
    Image::initialise();
 | 
						|
    Editor::initialise();
 | 
						|
    Audio::initialise();
 | 
						|
    Graphics::initialise();
 | 
						|
    Menu::initialise();
 | 
						|
    Terminal::initialise();
 | 
						|
    Expression::initialise();
 | 
						|
    Assembler::initialise();
 | 
						|
    Compiler::initialise();
 | 
						|
    Operators::initialise();
 | 
						|
    Functions::initialise();
 | 
						|
    Keywords::initialise();
 | 
						|
    Pragmas::initialise();
 | 
						|
    Optimiser::initialise();
 | 
						|
    Validater::initialise();
 | 
						|
    Linker::initialise();
 | 
						|
 | 
						|
    // Load file
 | 
						|
    if(argc == 2)
 | 
						|
    {
 | 
						|
        std::string name = std::string(argv[1]);
 | 
						|
        size_t slash = name.find_last_of("\\/");
 | 
						|
        std::string path = (slash != std::string::npos) ? name.substr(0, slash) : ".";
 | 
						|
        Expression::replaceText(path, "\\", "/");
 | 
						|
        name = (slash != std::string::npos) ? name.substr(slash + 1) : name;
 | 
						|
 | 
						|
#ifdef _WIN32
 | 
						|
        Cpu::enableWin32ConsoleSaveFile(false);
 | 
						|
#endif
 | 
						|
 | 
						|
        Assembler::setIncludePath(path);
 | 
						|
        Loader::setFilePath(path + "/" + name);
 | 
						|
        Loader::uploadDirect(Loader::Emulator);
 | 
						|
 | 
						|
        // Choose memory model
 | 
						|
        if(name.find("64k") != std::string::npos  ||  name.find("64K") != std::string::npos)
 | 
						|
        {
 | 
						|
            if(Memory::getSizeRAM() == RAM_SIZE_LO)
 | 
						|
            {
 | 
						|
                Memory::setSizeRAM(RAM_SIZE_HI);
 | 
						|
                Cpu::setSizeRAM(Memory::getSizeRAM());
 | 
						|
            }
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
#if 0
 | 
						|
    Image::TgaFile tgaFile;
 | 
						|
    std::string imageName = "Clouds";
 | 
						|
    Image::loadTgaFile(imageName + ".tga", tgaFile);
 | 
						|
 | 
						|
    Image::GtRgbFile gtRgbFile{GTRGB_IDENTIFIER, Image::GT_RGB_222, tgaFile._header._width, tgaFile._header._height};
 | 
						|
    //Image::convertRGB8toRGB2(tgaFile._data, gtRgbFile._data, tgaFile._header._width, tgaFile._header._height, tgaFile._imageOrigin);
 | 
						|
    Image::ditherRGB8toRGB2(tgaFile._data, gtRgbFile._data, tgaFile._header._width, tgaFile._header._height, tgaFile._imageOrigin);
 | 
						|
    Image::saveGtRgbFile(imageName + ".gtrgb", gtRgbFile);
 | 
						|
    Image::loadGtRgbFile(imageName + ".gtrgb", gtRgbFile);
 | 
						|
    uint16_t vram = 0x0800;
 | 
						|
    for(int y=0; y<gtRgbFile._header._height; y++)
 | 
						|
    {
 | 
						|
        for(int x=0; x<gtRgbFile._header._width; x++)
 | 
						|
        {
 | 
						|
            uint8_t data = gtRgbFile._data[y*gtRgbFile._header._width + x];
 | 
						|
            Cpu::setRAM(vram++, data);
 | 
						|
            if((vram & 0x00FF) == 0x00) vram += 0x0100;
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
#if 0
 | 
						|
    Image::loadTgaFile(imageName + ".tga", tgaFile);
 | 
						|
    gtRgbFile._header = {GTRGB_IDENTIFIER, Image::GT_RGB_222, tgaFile._header._width, tgaFile._header._height};
 | 
						|
    Image::convertRGB8toRGB2(tgaFile._data, gtRgbFile._data, tgaFile._header._width, tgaFile._header._height, tgaFile._imageOrigin);
 | 
						|
    //Image::ditherRGB8toRGB2(tgaFile._data, gtRgbFile._data, tgaFile._header._width, tgaFile._header._height, tgaFile._imageOrigin);
 | 
						|
    Image::saveGtRgbFile(imageName + ".gtrgb", gtRgbFile);
 | 
						|
    Image::loadGtRgbFile(imageName + ".gtrgb", gtRgbFile);
 | 
						|
    vram = 0x3FA0;
 | 
						|
    for(int y=0; y<gtRgbFile._header._height; y++)
 | 
						|
    {
 | 
						|
        for(int x=0; x<gtRgbFile._header._width; x++)
 | 
						|
        {
 | 
						|
            uint8_t data = gtRgbFile._data[y*gtRgbFile._header._width + x];
 | 
						|
            Cpu::setRAM(vram++, data);
 | 
						|
            if((vram & 0x00FF) == 0x00) vram += 0x00A0;
 | 
						|
        }
 | 
						|
    }
 | 
						|
#endif
 | 
						|
#endif
 | 
						|
 | 
						|
    while(1)
 | 
						|
    {
 | 
						|
        switch(Editor::getEditorMode())
 | 
						|
        {
 | 
						|
            case Editor::Term:  Terminal::process(); break;
 | 
						|
            case Editor::Image: Image::process();    break;
 | 
						|
            case Editor::Audio: Audio::process();    break;
 | 
						|
 | 
						|
            default: Cpu::process(); break;
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    return 0;
 | 
						|
} |