Forum www.zim2013.fora.pl Strona Główna
RejestracjaSzukajFAQUżytkownicyGrupyGalerieZaloguj
[TuT]Konfiguracja DOSBox, polecenie do nasma.

 
Odpowiedz do tematu    Forum www.zim2013.fora.pl Strona Główna » Materiały z zajęć Zobacz poprzedni temat
Zobacz następny temat
[TuT]Konfiguracja DOSBox, polecenie do nasma.
Autor Wiadomość
CichyHD
Administrator



Dołączył: 16 Paź 2013
Posty: 25
Przeczytał: 0 tematów

Ostrzeżeń: 0/5

Post [TuT]Konfiguracja DOSBox, polecenie do nasma.
1.Uruchamiamy "DOSBox options" na końcu dodajemy mount c: d:\users\(nazwa naszego katalogu)\ i zapisujemy
2.Odpalamy DOSBox-a, wpisujemy c: i klikamy enter.

Odpalamy nasma znajdziemy go na dysku P w folderze nasm.

Aby skompilować program w nasmie wpisujemy:
cd (nazwa naszego katalogu)
"nasm (nazwa pliku).asm -f bin -o (nazwa pliku).com"

Teraz możemy odpalic nasz program w DOSBoxie, wpisujemy nazwe naszego programu i klikamy enter



Post został pochwalony 0 razy

Ostatnio zmieniony przez CichyHD dnia Czw 17:44, 24 Paź 2013, w całości zmieniany 4 razy
Czw 17:55, 17 Paź 2013 Zobacz profil autora
mostrom
Moderator



Dołączył: 17 Paź 2013
Posty: 3
Przeczytał: 0 tematów

Ostrzeżeń: 0/5

Post
Program ułatwiający tworzenie, kompilowanie i odpalanie jednoplikowych programów w asemblerze.

Link:
Kod:
http://puu.sh/53daa.zip


mam nadzieję, że wam zadziała..

insktrukcja:
1) rozpakować plik do jakiegoś katalogu
!! Program utworzy plik konfiguracyjny i katalog z "biblioteką" programów w asemblerze obok exeka
można odpalić program
2) Jeśli ścieżki w konfiguracyjnym pliku się nie zgadzają z preferowanym położeniem biblioteki oraz z miejscem instalacji nasma i dosboxa, to trzeba zmienić wg potrzeb.
- pierwsza linijka: miejsce biblioteki (może być gdziekolwiek)
- druga linijka: katalog nasma
- trzecia linijka: plik DOSBox.exe
3) zapisujemy config.txt i jedziemy Very Happy


Projekt zostaje utworzony w bibliotece (podanej w pliku config.txt w pierwszym wierszu).
Nasz kod źródłowy to <nazwa_projektu>.asm
Kompilujemy program uruchamiając plik wsadowy "kompiluj.bat"
Uruchamiamy program plikiem "odpalamy.bat"



Programik napisany w c++, a oto jego kod:

Kod:
/*
    AsmProject
    :p by jacek q:
*/

#include <fstream>
#include <string>
#include <iostream>
#include <Windows.h>
#include <unistd.h> //acces(const char*, FLAGI), F_OK - plik istnieje

using namespace std;

string instance_path() //zwraca sciezke do pliku wykonywanego (znalazłem gdzieś na internetach to)
{
    int max_buf = 100;
    char buffer[ max_buf ];
    GetModuleFileNameA( NULL, buffer, max_buf );
    string::size_type pos = string( buffer ).find_last_of( "\\/" ); //             of /
    return string( buffer ).substr( 0, pos + 1 ); // ze znakiem "/" na koncu
}


const string DEFAULT_PATH = instance_path() + "programy\\";
string f_conf_name = "config.txt";
const string DOSBOX_DEFAULT_FILE = "D:\\Programy\\DOSBox-0.74\\DOSBox.exe";
string NASM_DEFAULT_PATH;


string nasm_pth(char** env)
{
    string program_files, program_files_path;

    while(*env)
    {
        string zmienna = string(*env);
        if(zmienna.substr(0, zmienna.find('=')) == "ProgramFiles(x86)")
        {
            program_files = "%ProgramFiles(x86)";
            program_files_path = zmienna.substr(zmienna.find('=')+1, zmienna.length() - zmienna.find('='));
            break;
        }
        else
        {
            if(zmienna.substr(0, zmienna.find('=')) == "ProgramFiles")
            {
                program_files = "ProgramFiles";
                program_files_path = zmienna.substr(zmienna.find('=')+1, zmienna.length() - zmienna.find('='));
                break;
            }
        }

        *env++;
    }

    return program_files_path+"\\nasm";
}

bool reset_conf( fstream & plik )
{
    if( plik.is_open() )
         plik.close();

    plik.clear();
    plik.open( f_conf_name.c_str(), ios::out | ios::trunc );
    if( !plik || !plik.is_open() ) return false;

    plik << DEFAULT_PATH << endl
        << NASM_DEFAULT_PATH << endl
        << DOSBOX_DEFAULT_FILE;

    plik.close();

    plik.clear();
    plik.open( f_conf_name.c_str(), ios::in );
    if( !plik || !plik.is_open() ) return false;

    return true;
}

string existing_path( string path ) //czysty substr
{
    string ret_path;

    string::size_type pos = 0, pocz_pos = 0;
    while(( pos = path.find_first_of( "\\", pos ) ) != string::npos )
    {
        if( access( path.substr( 0, pos ).c_str(), F_OK ) == 0 )
        {
            ret_path = path.substr( 0, pos );
        }

        pocz_pos = pos;
        pos++;
    }

    //ostatni przebieg, jesli na koncu nie ma "\"
    if( path[ path.length() - 1 ] != '\\' )
    {
        if( access( path.substr( 0, pos ).c_str(), F_OK ) == 0 )
        {
            ret_path = path.substr( 0, pos );
        }
    }


    return ret_path;
}

string missing_path( string path ) //czysty substr
{
    string ret_path;

    string::size_type pos = 0, pocz_pos = 0;
    while(( pos = path.find_first_of( "\\", pos ) ) != string::npos )
    {
        if( access( path.substr( 0, pos ).c_str(), F_OK ) == 0 )
        {
            pocz_pos = pos;
        }

        pos++;
    }
    ret_path = path.substr( pocz_pos, path.length() - pocz_pos );

    return ret_path;
}

bool zaladuj_dosbox_conf(fstream & plik, string path, string nazwa)
{
    plik << "[sdl]" << endl
    << "fullscreen=false" << endl
    << "fulldouble=false" << endl
    << "fullresolution=0x0" << endl
    << "windowresolution=0x0" << endl
    << "output=overlay" << endl
    << "autolock=true" << endl
    << "sensitivity=100" << endl
    << "waitonerror=true" << endl
    << "priority=higher,normal" << endl
    << "mapperfile=mapper.txt" << endl
    << "usescancodes=true" << endl
    << endl
    << "[dosbox]" << endl
    << "language=" << endl
    << "machine=svga_s3" << endl
    << "captures=capture" << endl
    << "memsize=16" << endl
    << endl
    << "[render]" << endl
    << "frameskip=0" << endl
    << "aspect=false" << endl
    << "scaler=normal2x" << endl
    << endl
    << "[cpu]" << endl
    << "core=auto" << endl
    << "cputype=auto" << endl
    << "cycles=auto" << endl
    << "cycleup=10" << endl
    << "cycledown=20" << endl
    << endl
    << "[mixer]" << endl
    << "nosound=false" << endl
    << "rate=44100" << endl
    << "blocksize=1024" << endl
    << "prebuffer=20" << endl
    << endl
    << "[midi]" << endl
    << "mpu401=intelligent" << endl
    << "mididevice=default" << endl
    << "midiconfig=" << endl
    << endl
    << "[sblaster]" << endl
    << "sbtype=sb16" << endl
    << "sbbase=220" << endl
    << "irq=7" << endl
    << "dma=1" << endl
    << "hdma=5" << endl
    << "sbmixer=true" << endl
    << "oplmode=auto" << endl
    << "oplemu=default" << endl
    << "oplrate=44100" << endl
    << endl
    << "[gus]" << endl
    << "gus=false" << endl
    << "gusrate=44100" << endl
    << "gusbase=240" << endl
    << "gusirq=5" << endl
    << "gusdma=3" << endl
    << "ultradir=C:\\ULTRASND" << endl
    << endl
    << "[speaker]" << endl
    << "pcspeaker=true" << endl
    << "pcrate=44100" << endl
    << "tandy=auto" << endl
    << "tandyrate=44100" << endl
    << "disney=true" << endl
    << endl
    << "[joystick]" << endl
    << "joysticktype=auto" << endl
    << "timed=true" << endl
    << "autofire=false" << endl
    << "swap34=false" << endl
    << "buttonwrap=false" << endl
    << endl
    << "[serial]" << endl
    << "serial1=dummy" << endl
    << "serial2=dummy" << endl
    << "serial3=disabled" << endl
    << "serial4=disabled" << endl
    << endl
    << "[dos]" << endl
    << "xms=true" << endl
    << "ems=true" << endl
    << "umb=true" << endl
    << "keyboardlayout=auto" << endl
    << endl
    << "[ipx]" << endl
    << "ipx=false" << endl
    << endl
    << "[autoexec]" << endl
    << "mount d: " << path << "\\binary\\" << endl
    << "d:" << endl
    << "cls" << endl
    << nazwa << endl;

    return true;
}

bool zaladuj_dosbox_bat(fstream & plik, string path, string dosbox_file)
{
    plik << "@\"" << dosbox_file << "\" -conf \"" << path <<"dosbox.conf\"";

    return true;
}

bool zaladuj_kompiluj_bat( fstream & plik, string path, string nazwa, string nasm_path )
{
    //nasm -o naszplik.com -f bin naszplik.asm
    if( !plik || !plik.is_open() ) return false;

    plik << "@echo off" << endl
    << "@echo nasm -o " << path.substr( 0, 3 ) << "...\\" << nazwa << "\\binary\\" << nazwa << ".com -f bin " << path.substr( 0, 3 ) << "...\\" << nazwa << "\\" << nazwa << ".asm" << endl
    << "@echo." << endl
    << "@mkdir binary" << endl
    << "@set path=" << nasm_path << ";" << endl
    << "@nasm -o " << path << "binary\\"<< nazwa << ".com -f bin " << path << nazwa << ".asm" << endl
    << "@echo." << endl
    << "pause";

    return true;
}

bool zaladuj_asm( fstream & plik )
{
    if( !plik || !plik.is_open() ) return false;

    plik << ";To jest komentarz" << endl
    << "; tu można wstawić:"
   << "; section .text" << endl
   << "; aby dać znać NASMowi, że to będzie w sekcji kodu." << endl
   << "section .text" << endl
    << endl
   << "org 100h" << endl

   << "start:" << endl
   << "   mov   ah, 9" << endl
   << "   mov   dx, label   " << endl
   << "   int   21h" << endl
    << endl
   << "   mov   ah, 0" << endl
   << "   int   16h" << endl
    << endl
   << "   mov   ax, 4C00h" << endl
   << "   int   21h" << endl
    << endl
   << "label   db   \"Pierwszy program w asemblerze.$\"" << endl
    << endl
    << endl
    << ";nasm -o naszplik.com -f bin naszplik.asm";

    return true;
}

int main(int argc, char** argv, char** env)
{
    fstream f_conf;
    string f_conf_path = instance_path() + f_conf_name;
    string library_path, nasm_path, dosbox_file;

    NASM_DEFAULT_PATH = nasm_pth(env);
    nasm_path = NASM_DEFAULT_PATH;

    if( access( f_conf_path.c_str(), F_OK ) == 0 ) //jesli jest plik konfiguracyjny w folderze aplikacji
    {
        cout << "Znaleziono plik konfiguracyjny.\n\n";

        f_conf.open( f_conf_name.c_str(), ios::in );
        if( !f_conf ) { cout << "Nie udalo sie otworzyc pliku konfiguracyjnego.\n"; getchar(); return - 1; }
    }
    else //jesli nie znaleziono pliku
    {
        cout << "Tworzenie pliku konfiguracyjnego...\n";

        reset_conf( f_conf );
        if( !f_conf ) { cout << "Nie udalo sie utworzyc pliku konfiguracyjnego.\n"; getchar(); return - 1; }

        cout << "Utworzono!\n\n";
    }

    //w tym momencie, ZAWSZE plik f_conf jest otwarty w trybie READ_ONLY.


    getline( f_conf, library_path ); //odczytaj sciezke do biblioteki z pliku config.txt
    getline( f_conf, nasm_path ); //odczytaj sciezke do katalogu z nasmem
    getline( f_conf, dosbox_file ); //odczytaj sciezke do pliku dosboxa
    cout << "Odczytano z pliku conf.txt: " << endl
        << "Katalog z biblioteka:\n" << library_path << endl
        << "Katalog z nasmem:\n" << nasm_path << endl
        << "Sciezka do DOSBox.exe:\n" << dosbox_file << endl;

    f_conf.close();

    //dodaj ukosnik na koncu library_path
    if( library_path[ library_path.length() - 1 ] != '\\' )
    {
        library_path += "\\";
    }


    int przebieg = 0;
    while( access( library_path.c_str(), F_OK ) == - 1 )
    {
        // tutaj stworz taki folder jaki jest podany w pliku, ewentualnie wykaz bledy

        if( przebieg == 0 ) {
            cout << "\nNie znaleziono biblioteki programow.\n";
            cout << "Podana sciezka znajduje sie na dysku: " << existing_path( library_path ) << endl;
            cout << "Brakuje zatem " << missing_path( library_path ) << endl << endl;
        }


        string current = existing_path( library_path ) + missing_path( library_path ).substr( 0, missing_path( library_path ).find_first_of( "\\", 1 ) );

        cout << "Dodawanie folderu " << missing_path( library_path ).substr( 0, missing_path( library_path ).find_first_of( "\\", 1 ) ) << "...\n";

        if( !CreateDirectory( current.c_str(), NULL ) ) { cout << "BLAD PRZY TWORZENIU FOLDEROW!!! sprawdz pierwsza linijke pliku config.txt"; getchar(); return -1; }

        cout << "Dodano " << existing_path( library_path ) << endl;

        przebieg++;
    }
    cout << "\nZnaleziono " << existing_path( library_path ) << endl;


    if(access( nasm_path.c_str(), F_OK ) == 0) cout << "Znaleziono " << nasm_path  << endl;
    else { cout << "Nie znaleziono nasma! Otworz conf.txt i popraw druga linijke." << endl; getchar(); return -2; }

    if(access( dosbox_file.c_str(), F_OK ) == 0) cout << "Znaleziono " << dosbox_file << endl << endl;
    else { cout << "Nie znaleziono dosboxa! Otworz conf.txt i popraw trzecia linijke." << endl; getchar(); return -2; }

    string polecenie;
    cout << "Wpisz \"!reset\" zeby zresetowac plik konfiguracyjny.\n";
    cout << "Utworz projekt o nazwie: ";
    cin >> polecenie;
    cin.ignore();

    if( polecenie == "!reset" )
    {
        if( !reset_conf( f_conf ) ) { cout << "Blad przy resecie.\n"; getchar(); return - 1; }
        cout << "Zrestartuj program.";
        getchar();
        return 0;
    }

    string project_path = library_path + polecenie + "\\";
    if( !CreateDirectory( project_path.c_str(), NULL ) ) { cout << "BLAD PRZY TWORZENIU FOLDERU PROJEKTU!!!"; getchar(); return - 1; } //stworz folder projektu

    string asm_full_path = project_path + polecenie + ".asm";
    string bat_full_path = project_path + "kompiluj.bat";
    string dosbox_conf_full_path = project_path + "dosbox.conf";
    string dosbox_bat_full_path = project_path + "odpalamy.bat";

    fstream f_asm( asm_full_path.c_str(), ios::out );
    if( !f_asm || !f_asm.is_open() ) { cout << "NIE MOZNA UTWORZYC PLIKU"; getchar(); return - 1; }

    fstream f_kompiluj_bat( bat_full_path.c_str(), ios::out );
    if( !f_kompiluj_bat || !f_kompiluj_bat.is_open() ) { cout << "NIE MOZNA UTWORZYC PLIKU"; getchar(); return - 1; }

    fstream f_dosbox_conf( dosbox_conf_full_path.c_str(), ios::out );
    if( !f_dosbox_conf || !f_dosbox_conf.is_open() ) { cout << "NIE MOZNA UTWORZYC PLIKU"; getchar(); return - 1; }

    fstream f_dosbox_bat( dosbox_bat_full_path.c_str(), ios::out );
    if( !f_dosbox_bat || !f_dosbox_bat.is_open() ) { cout << "NIE MOZNA UTWORZYC PLIKU"; getchar(); return - 1; }

    zaladuj_kompiluj_bat( f_kompiluj_bat, project_path, polecenie, nasm_path );
    zaladuj_asm( f_asm );
    zaladuj_dosbox_conf( f_dosbox_conf, project_path, polecenie );
    zaladuj_dosbox_bat(f_dosbox_bat, project_path, dosbox_file);

    f_kompiluj_bat.close();
    f_asm.close();
    f_dosbox_conf.close();
    f_dosbox_bat.close();

    string polecenie_otwarcia_folderu = "explorer " + project_path;
    system( polecenie_otwarcia_folderu.c_str() );

    cout << "Utworzono! Wcisnij klawisz by zakonczyc...";

    getchar();
    return 0;
}



Post został pochwalony 0 razy

Ostatnio zmieniony przez mostrom dnia Śro 0:44, 30 Paź 2013, w całości zmieniany 3 razy
Pią 20:55, 18 Paź 2013 Zobacz profil autora
Wyświetl posty z ostatnich:    
Odpowiedz do tematu    Forum www.zim2013.fora.pl Strona Główna » Materiały z zajęć Wszystkie czasy w strefie EET (Europa)
Strona 1 z 1

 
Skocz do: 
Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach


fora.pl - załóż własne forum dyskusyjne za darmo
Powered by phpBB © 2001, 2005 phpBB Group
Design by Freestyle XL / Music Lyrics.
Regulamin