Jak (bezboleśnie) wrócić do kodowania na Amigę? Krystian Bacławski 8 czerwca 2013



Podobne dokumenty
Laboratorium 1 Temat: Przygotowanie środowiska programistycznego. Poznanie edytora. Kompilacja i uruchomienie prostych programów przykładowych.

Środowisko Keil. Spis treści. Krzysztof Świentek. Systemy wbudowane. 1 Trochę teorii. 2 Keil

Wykład VII. Programowanie. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej. c Copyright 2014 Janusz Słupik

Wykład. Materiały bazują częściowo na slajdach Marata Dukhana

Automatyzacja kompilacji. Automatyzacja kompilacji 1/28

Podstawy programowania. Wykład 9 Preprocesor i modularna struktura programów. Krzysztof Banaś Podstawy programowania 1

Co nie powinno być umieszczane w plikach nagłówkowych:

Programowanie niskopoziomowe

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

Programowanie Proceduralne

Grzegorz Cygan. Wstęp do programowania mikrosterowników w języku C

Programowanie Systemów Wbudowanych

PROGRAMOWANIE w C prolog

Co to jest sterta? Sterta (ang. heap) to obszar pamięci udostępniany przez system operacyjny wszystkim działającym programom (procesom).

Wykład 1

Programowanie w C++ Wykład 1. Katarzyna Grzelak. 26 luty K.Grzelak (Wykład 1) Programowanie w C++ 1 / 28

Programowanie w asemblerze Linkowanie

Systemy wbudowane. Wprowadzenie. Struktura. Mikrokontrolery AVR. Wprowadzenie do programowania w C

Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych.

Tworzenie oprogramowania

Funkcja (podprogram) void

Programowanie w elektronice: Podstawy C

1.Wstęp. 2.Generowanie systemu w EDK

PRYWATNA WYŻSZA SZKOŁA BUSINESSU, ADMINISTRACJI I TECHNIK KOMPUTEROWYCH S Y L A B U S

Laboratorium Informatyka (I) AiR Ćwiczenia z debugowania

Kompilator języka C na procesor 8051 RC51 implementacja

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 8. Karol Tarnowski A-1 p.

Język C - podstawowe informacje

Wstęp do Programowania, laboratorium 02

Wstęp. do języka C na procesor (kompilator RC51)

Programowanie I. O czym będziemy mówili. Plan wykładu nieco dokładniej. Plan wykładu z lotu ptaka. Podstawy programowania w językach. Uwaga!

Wstęp do programowania

Konsolidacja (linking)

#line #endif #ifndef #pragma

Wstęp do programowania INP003203L rok akademicki 2018/19 semestr zimowy. Laboratorium 3. Karol Tarnowski A-1 p.

RPC. Zdalne wywoływanie procedur (ang. Remote Procedure Calls )

Kompilacja i scalanie programów w linii poleceń gcc i make

Język ludzki kod maszynowy

Wykład 3: Implementacja programów wbudowanych

Programowanie w C. dr inż. Stanisław Wszelak

Globalne / Lokalne. Wykład 15. Podstawy programowania (język C) Zmienne globalne / lokalne (1) Zmienne globalne / lokalne (2)

DYNAMICZNE PRZYDZIELANIE PAMIECI

Język C zajęcia nr 11. Funkcje

Automatyzacja kompilacji. Automatyzacja kompilacji 1/40

Inżynieria Wytwarzania Systemów Wbudowanych

Zaawansowane programowanie w języku C++ Zarządzanie pamięcią w C++

Wprowadzenie do programowania w języku C

Programowanie Niskopoziomowe

Podstawy programowania. Wykład Co jeszcze... Przypomnienia, uzupełnienia. Krzysztof Banaś Podstawy programowania 1

Programowanie hybrydowe C (C++) - assembler. MS Visual Studio Inline Assembler

Tworzenie oprogramowania

Argumenty wywołania programu, operacje na plikach

Szablony klas, zastosowanie szablonów w programach

Ćwiczenie nr 6. Programowanie mieszane

Tablice i struktury. czyli złożone typy danych. Programowanie Proceduralne 1

1. Tworzenie nowego projektu.

1. Brian W. Kernighan, Dennis M. Ritchie, Język ANSI C, WNT, Warszawa 1998.

Zadania: 1. Funkcja przeliczająca F na C: float FtoC(float f){ return (f 32.0) * 5.0 / 9.0; }

Wykład 15. Literatura. Kompilatory. Elementarne różnice. Preprocesor. Słowa kluczowe

Pliki w C/C++ Przykłady na podstawie materiałów dr T. Jeleniewskiego

Katedra Elektrotechniki Teoretycznej i Informatyki. wykład 12 - sem.iii. M. Czyżak

Fragment wykładu z języka C ( )

Spis treści. Język interpretowany vs język kompilowany

PMiK Programowanie Mikrokontrolera 8051

Make jest programem komputerowym automatyzującym proces kompilacji programów, na które składa się wiele zależnych od siebie plików.

Typy złożone. Struktury, pola bitowe i unie. Programowanie Proceduralne 1

wykład III uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C - zarządzanie pamięcią, struktury,

Wykład 4: Klasy i Metody

Programowanie w C++ Wykład 1. Katarzyna Grzelak. 25 luty K.Grzelak (Wykład 1) Programowanie w C++ 1 / 38

Wskaźniki. Przemysław Gawroński D-10, p marca Wykład 2. (Wykład 2) Wskaźniki 8 marca / 17

Metody Metody, parametry, zwracanie wartości

Języki programowania obiektowego Nieobiektowe elementy języka C++

Tworzenie projektu asemblerowego dla środowiska Visual Studio 2008.

Programowanie obiektowe

1. Pierwszy program. Kompilator ignoruje komentarze; zadaniem komentarza jest bowiem wyjaśnienie programu człowiekowi.

PROGRAMOWANIE NISKOPOZIOMOWE. Adresowanie pośrednie rejestrowe. Stos PN.04. c Dr inż. Ignacy Pardyka. Rok akad. 2011/2012

Przeciążenie (przeładowanie nazw) funkcji

część 8 wskaźniki - podstawy Jarosław Gramacki Instytut Informatyki i Elektroniki Podstawowe pojęcia

wykład I uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Wstęp do języka C wykład I dr Jarosław Mederski Spis Ogólne informacje

Przedmiot : Programowanie w języku wewnętrznym. Ćwiczenie nr 4

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Wykład 6

Podstawy Informatyki Wprowadzenie do języka C dr inż. Jarosław Bułat

Wprowadzenie do środowiska Qt Creator

Szablony funkcji i szablony klas

Podstawy programowania. Wykład 2 Zmienne i obsługa wejścia/wyjścia. Krzysztof Banaś Podstawy programowania 1

Języki programowania obiektowego Nieobiektowe elementy języka C++

Tablice (jedno i wielowymiarowe), łańcuchy znaków

Języki i metodyka programowania. Typy, operatory, wyrażenia. Wejście i wyjście.

Podstawy wykorzystania bibliotek DLL w skryptach oprogramowania InTouch

Wstęp do wiadomości teoretycznych (nie, nie jest to masło maślane ani wstęp, wstępów proszę cierpliwie czytać)

Programowanie niskopoziomowe

Zofia Kruczkiewicz, ETE8305_2 1

Microsoft IT Academy kurs programowania

Kurs języka Python. Wykład 13. Marcin Młotkowski. 18 stycznia Rozszerzenia Pythona w C Python/C API. 2 Osadzanie Pythona w C

Operacje wejścia/wyjścia odsłona pierwsza

int tab[5]; tab[1]; ciągły obszar pamięci, w którym umieszczone są elementy tego samego typu macierz [ ] - dwuargumentowy operator indeksowania

Java Podstawy. Michał Bereta

Szkolenia specjalistyczne

Programowanie z użyciem RPC

Transkrypt:

Jak (bezboleśnie) wrócić do kodowania na Amigę? Krystian Bacławski 8 czerwca 2013

Plan seminarium 1. Ustawienia WinUAE. 2. Narzędzia dla AmigaOS. 3. Port szeregowy. 4. Prezentacja: kilka złych programów. 5. Środowisko programisty. 6. Kompilacja programów i bibliotek. 7. Narzędzia pomocnicze. 8. Amiga GCC: sztuczki i kruczki. 9. Plan rozwoju. 10. Literatura i odnośniki

Ustawienia WinUAE Przegląd: procesor: 68040/060 + MMU (JIT wył.), serial port: localhost:1234 (po TCP/IP), katalogi jako dyski (projekt widziany przez emulator i maszynę na której budujemy). Emulacja MMU sporo spowalnia WinUAE, ale niezastąpione przy debugowaniu - empirycznie w okolicach szybkiej 68040.

Narzędzia dla AmigaOS 1. MuLib: 680x0.library, mmu.library 2. ViNCEd: konsola (zamiast KingCON) 3. Csh: najlepszy amigowy shell 4. SnoopDos: odpowiednik uniksowego strace 5. SegTracker: pamięta właścicieli hunków 6. BlowUp: treściwe Guru Meditation 7. PatchWork: błędne wywołania biblioteczne 8. MuTools: narzędzia wymagajace MMU MuForce: wykrywa błędne dostępy do pamięci MuGuardianAngel: problemy z allokacją pamięci (zamiast MungWall albo Wipeout)

Zastosowania portu szeregowego? 1. Odbieranie komunikatów od narzędzi do debugowania: BlowUp PatchWork MuForce MuGuardianAngel 2. Printf debugging: debug.lib 3. Debuggery działające po serialu: ROMWack (KS 2.04) lub SAD (KS 3.x), COP, GNU gdb (częściowo dzięki GDBStub z AROSa)

Jak skonfigurować port szeregowy? Potrzebujemy PuTTY! Dla windowsiarzy: raw, localhost:1234. Dla uniksiarzy: tunelowanie (remote) portu na maszynę ze środowiskiem programisty. Po stronie AmigaOS w Prefs / Serial: baud rate: 31250, 8n1.

Złe programy i ich debugowanie 1. BlowUp: Guru Meditation dzielenie przez zero pułapki i inne takie 2. MuForce: odczyt lub zapis pod nieistniejące adresy (0xDEADC0DE) indeksowanie tablicy pod adresem zero 3. MuGuardianAngel: wszelkie błędy związane z pojedyńczymi blokami (AllocMem, AllocVec, AllocPooled, etc.) 4. PatchWork: błędnie skonstruowane wywołania bibliotek systemowych

WinUAE ma wbudowany debugger! Dostępny pod skrótem SHIFT+F12: podglądanie stanu rejestrów sprzętowych, wykonywanie krokowe, przeskakiwanie przez funkcje, etc. Ale lepiej służy jako trainer :-(

Środowisko kompilacji Potrzebujemy: kompilatora C, asemblera, linkera, narzędzi pomocniczych (disassembler, etc.), standardowej biblioteki języka C, bibliotek AmigaOS. Będziemy używać m68k-amigaos-toolchain! Proces instalacji tutaj.

Kompilacja CC = m68k-amigaos-gcc -noixemul AS = vasm -quiet CFLAGS = -Wall -O2 ASFLAGS = -Faout -phxass m68k-amigaos-gcc: ta sama komenda robi za kompilator C, asembler i konsolidator vasm: tryb kompatybilności z phxass (AsmOne) i obiekty obsługiwane przez linker

Kompilacja, c.d. Prosty program: $(CC) $(CFLAGS) -o hello hello.c Obiekt: $(CC) $(CFLAGS) -c -o test.o test.c Konsolidacja: $(CC) -o prog a.o b.o c.o -lmy Asembler: $(AS) $(ASFLAGS) -o test.o test.s

Kompilacja, c.d. Pliki nagłówkowe: $(CC) $(CFLAGS) -Iincdir [...] Biblioteki: $(CC) $(CFLAGS) -Llibdir -lmy [...] Budowanie biblioteki statycznej: m68k-amigaos-ar cr libmy.a a.o b.o m68k-amigaos-ranlib libmy.a

Hello world bez printf #include <inline/exec.h> #include <dos/dos.h> #include <inline/dos.h> #include <workbench/workbench.h> int nocommandline=1; /* main() bez pobierania argumentów z CLI */ int initlibraries=0; /* nie otwieraj bibliotek automatycznie */ struct DosLibrary *DOSBase = NULL; extern struct WBStartup *_WBenchMsg; /* uruchomione z WB? */ int main(void) { if (_WBenchMsg == NULL) { if ((DOSBase=(struct DosLibrary*)OpenLibrary("dos.library",37))) { Write(Output(),"Hello world\n",12); CloseLibrary((struct Library *)DOSBase); } } return 0; }

Łączenie z kodem w asemblerze ; eksportujemy symbol ; tak żeby linker go widział XDEF _c2p1x1_8_c5_bm section c2p1x1_8_c5_bm, code ; d0.w chunkyx [chunky-pixels] ; d1.w chunkyy [chunky-pixels] ; d2.w offsx [screen-pixels] ; d3.w offsy [screen-pixels] ; a0 chunkyscreen ; a1 BitMap #ifndef C2P_H #define C2P_H #include <graphics/gfx.h> void c2p1x1_8_c5_bm( UBYTE *chunky asm("a0"), struct BitMap *bitmap asm("a1"), UWORD width asm("d0"), UWORD height asm("d1"), UWORD offsetx asm("d2"), UWORD offsety asm("d3")); _c2p1x1_8_c5_bm:... rts #endif

Narzędzia pomocnicze 1. [P] m68k-amigaos-objdump: disassemblacja: -d sekcje: -h relokacje: -r 2. [P] m68k-amigaos-nm: symbole lokalne, eksportowane lub zewnętrzne 3. [P] GccFindHit: znajdź linię z błędem 4. Hunk2aout: konwersja bibliotek na a.out 5. sfdc: gen. plików nagłówkowych inline 6. dumphunks: wyświetl strukturę AmigaHunk 7. dumpaout: wyświetl strukturę a.out

Przypomnienie AmigaOS ABI d0/d1/a0/a1/fp0/fp1: scratch registers a4: base register a5: frame pointer (można zrobić backtrace) a6: library pointer (do bieżącej biblioteki) a7: stack pointer Uwagi: a4: tylko dla -fbaserel, trzeba uważać i czasem użyć saveds a5: -fomit-frame-pointer wył. użycie

GCC: opcje kompilacji -fbaserel: sekcja danych adresowana względem rejestru a4, max. 64kB -fbaserel32: j.w. ale min. 68020, bez ograniczenia na wielkość, -msmall-code: wszystkie skoki względem rejestru pc, kod wielkości max. 32kB. -m68060, -m68020-60, -m68881: generowanie kodu na konkretny procesor -O2, -O3, -Os: rozmiar vs. szybkość kodu

GCC: atrybuty zmiennych i funkcji regargs: iff.c chip (GNU as nie trawi) saveds: input.c interrupt: vblank.c amiga_interrupt: copper.c asm(x) x="a?"/"d?"/"fp?": c2p.h

GCC: predefiniowane makra -Damiga -Dmc68020 -Dmc68060 -D HAVE_68881 #ifdef HAVE_68881 y = sin(x); #else y = IEEEDPSin(x) #endif

GCC: wywołania systemowe Jak wołać funkcje z bibliotek? 1. otworzyć bibliotekę lub użyć -lauto 2. #include <proto/dos.h> 3. Read(fh, ptr, length) Kompilator używa makr, a nie woła funkcje z amiga.lib. Poniższa opcja spowoduje, że kompilator nie będzie przeładowywał a6 za każdym razem: -D CONSTLIBBASEDECL =const

GCC: wstawki asemblerowe static inline unsigned int swap16(unsigned int a) { asm("swap %0": "=d" (a)); return a; } #define swapr(a,b) { \ asm("exg %0,%1" : \ "+r" (a), "+r" (b)); \ } static inline float fabsf(float x) { float value; } asm("fabs%.x %1,%0" : "=f" (value) : "f" (x)); return value;

toolchain: inne ciekawe ficzery 1. libnix: tworzenie bibliotek (library) i urządzeń (device) różne implementacje wejścia do main() automatyczne otwieranie bibliotek listy inicjalizatorów i deinicjalizatorów (funkcje wykonywane przed i za main(), z priorytetami) 2. GNU ld: możliwość tworzenia skryptów linkera (trackmo) tworzenie list obiektów wskaźniki na początek i koniec sekcji: code, data i bss

toolchain: plany 1. libnix: zgodność ze standardem C99 poprawić zgodność z Kickstart 1.3 (A500!) 2. GNU cc: zaimplementować braki w 3.4.6 zrobić przymiarkę do 4.8.x odpalać testy poprawności 3. GNU binutils: pełne wsparcie dla formatu Amiga Hunk linkowanie z bibliotekami amigowymi (ALink, BLink) 4. GNU gdb: umożliwić zdalne debugowanie (GDBStub)

Literatura i odnośniki 1. GCC compiler for AmigaOS/m68k 2. ADCD 1.2 i 2.1 (Amiga Developer CD) 3. Amiga Developer Docs a. Amiga RKM Devices Manual b. Amiga RKM Libraries Manual c. Amiga Hardware Reference Manual d. Includes and Autodocs 4. libnix - standard C library for amiga GCC 5. AmigaOS-only features of GCC 6. The Amiga Guru Book

Pytania?