Hasło ‘Obozy koncentracyjne hitlerowskie’ w WEP

WEP to Wielka Encyklopedia Powszechna. Z hasłem Obozy koncentracyjne hitlerowskie związane były pewne perypetie, które Wiki tak opisuje:

Sztandarowym przykładem żywego zainteresowania społeczeństwa treściami zawartymi w encyklopedii była burzliwa dyskusja dotycząca hasła „Obozy koncentracyjne hitlerowskie”, które znajdowało się w wydrukowanym i rozkolportowanym już wśród subskrybentów tomie VIII wydanym w 1966.

No, mam wrażenie że nie całkiem chodziło tylko o żywe zainteresowanie społeczeństwa 😉

Ale ponieważ Wiki nie mówi co było problemem w hasłach encyklopedii (a nie szkodzi to wiedzieć 😉 ) – dla ciekawych podam obydwa hasła. (Przynajmniej jest jakiś pożytek z WEP 🙂 )

 

Oryginalne hasło

OBOZY KONCENTRACYJNE HITLEROWSKIE, miejsca uwięzienia tworzone od 1933 przez organa III Rzeszy, początkowo w celu izolowania przeciwników hitleryzmu (przede wszystkim komunistów) i stosowania wobec nich brutalnych represji, następnie w celu systematycznego masowego wyniszczania ludzi. Inicjatorem zakładania obozów był H. Göring, ówczesny premier rządu Prus, organizator i szef prus. tajnej policji państw. (→ gestapo). Pierwsze h.o.k. były założone w początkach 1933, w Oranienburgu k. Berlina i w Dachau k. Monachium. H.o.k. stały się wkrótce narzędziem bezwzględnego terroru polit. w III Rzeszy. Osadzenie w obozie (tzw. uwięzienie ochronne opierające się na „rozporządzeniu wyjątkowym dla ochrony narodu i państwa” z 28 II 1933) nie było karą za przestępstwo wymierzoną na podstawie wyroku sądowego; miało ono charakter prewencyjnego środka policyjnego. Nakaz osadzenia w h.o.k. wydawało początkowo gestapo, a od 1939 nowo utworzony Główny Urząd Bezpieczeństwa Rzeszy (RSHA), w skład którego wchodziło gestapo. Początkowo h.o.k. podlegały policji; po objęciu 1936 przez naczelnego dowódcę SS H. Himmlera stanowiska szefa policji niem. (Reichsführer SS und Chef der deutschen Polizei) władzę nad obozami przejęło SS. Z czasem, niezależnie od „przestępców polit.”, a w czasie II wojny świat. – osób przypadkowych (aresztowanych w „łapankach” i traktowanych również jako „polityczni”), zaczęto kierować do h.o.k. także tzw. elementy aspołeczne (zawodowych kryminalistów po odbyciu kary więzienia, włóczęgów, prostytutki itp.).

Przed II wojną świat, na terenie III Rzeszy istniało kilkanaście różnych h.o.k. W czasie wojny liczba ich na obszarze Niemiec i krajów przez nie okupowanych była wielokrotnie większa; dokładna ich liczba nie została jeszcze ustalona, wg różnych szacunków wynosiła łącznie z filiami ok. 700 do ok. 900. Jednocześnie rozszerzono ich zadania. Charakter miejsca odosobnienia zachowały obozy jedynie w stosunku do Niemców, gł. przestępców kryminalnych. Dla więźniów innej narodowości stały się narzędziem masowego wyniszczenia. Wskutek bardzo ciężkich warunków bytowych: głodu, pracy ponad siły i nieludzkiego traktowania, większość więźniów po kilku miesiącach ginęła „śmiercią naturalną”. Praca, która wg propagandy hitlerowskiej miała być środkiem wychowawczym, była od początku istnienia obozów środkiem fiz. udręki i bestialskiego traktowania, a w czasie wojny stała się ponadto środkiem masowego wyniszczania. Początkowo zatrudniano więźniów przy rozbudowie obozów, budowie autostrad, w przyobozowych warsztatach i zakładach prowadzonych przez SS. Od 1942, wskutek braku rąk roboczych, zaczęto w szerokim zakresie wykorzystywać pracę więźniów w niem. przemyśle wojennym. W szeregu firm i koncernów, jak np. I.G. Farbenindustrie, Krupp, pracowały niewolniczo dziesiątki tysięcy więźniów; ich siłę roboczą wykorzystywano do ostatnich granic. Chorych nieuleczalnie i krańcowo wyczerpanych, jako niezdolnych do dalszej pracy, mordowano gazem lub śmiertelnymi zastrzykami. W strukturze władz obozowych najbardziej ponurą rolę odgrywali nadzorcy więźniów, przede wszystkim „blokowi”, bezpośredni przełożeni w hierarchii obozowej, będący funkcjonariuszami SS, oraz „kapo”, zazwyczaj najbrutalniejsi więźniowie kryminalni, pełniący funkcje dozorców grup roboczych więźniów.

W h.o.k. panowały różne choroby i szerzyły się epidemie, w wyniku całokształtu warunków i minimalnej pomocy lekarskiej. Biegunka głodowa, dur brzuszny i plamisty, gruźlica zabierały tysiące ofiar. W szpitalach obozowych brakło prycz, pościeli, lekarstw i środków opatrunkowych. Od poł. 1942 lekarze SS zaczęli przeprowadzać na więźniach (mężczyznach i kobietach), za zgodą Himmlera, różne eksperymenty lekarskie, m.in. sterylizację, kastrację, operacje kostne i mięśniowe nóg (na kilkudziesięciu Polkach w obozie Ravensbrück), zaszczepianie raka, zakażenia zimnicą i innymi chorobami, zakażanie umyślnie zadawanych ran bakteriami ropotwórczymi zgorzeli gazowej, tężca i innymi, zamrażanie więźniów, umieszczanie ich w komorach niskiego ciśnienia, wypróbowywanie nowych leków itp. Wiele ofiar tych zbrodniczych eksperymentów zmarło, wiele doznało trwałych schorzeń oraz uszkodzeń ciała i narządów wewnętrznych. W h.o.k. często dokonywano egzekucji więźniów, gł. z „wyroku” policyjnych sądów doraźnych albo na rozkaz RSHA; były one również wykorzystywane do szybkiej zagłady jednostek lub określonych grup, których nie obejmowała ewidencja obozowa; np. w Oświęcimiu w bloku XI (tzw. blok śmierci) zamordowano wielu więźniów będących w ewidencji, w Gross-Rosen natomiast wymordowano kilkutysięczną grupę radz. jeńców wojennych, nie wliczonych do stanu więźniów. W czasie wojny na terenie Niemiec i Austrii istniały następujące duże h.o.k.; Bergen-Belsen, Buchenwald, Dachau, Dora (Nordhausen), Flossenbürg, Mauthausen, Neuengamme, Ravensbrück i Sachsenhausen-Oranienburg wraz z podległymi im filiami; jeden duży obóz, Natzweiler-Struthof, znajdował się na terenie okupowanej Francji, w Alzacji.

Na obecnych ziemiach pol. istniały 4 duże obozy: Gross-Rosen k. Świdnicy (obecnie Rogoźnica), Stutthof k. Gdańska (obecnie Sztutowo), Oświęcim-Brzezinka (Ausschwitz-Birkenau) i Majdanek. Dwa ostatnie były jednocześnie ośrodkami masowej zagłady. Ośrodki te, w nomenklaturze hitlerowskiej zwane obozami specjalnymi (Sonderlager), a nieoficjalnie przez samych hitlerowców – Vernichtungslager, czyli obozami zagłady, nie miały charakteru obozu i stanowiły odrębne ogniwo w systemie hitlerowskiej polityki eksterminacyjnej. Obozy zagłady były ośrodkami, których jedynym zadaniem było masowe uśmiercanie ludzi; istniały one tylko na ziemiach okupowanej Polski; przeznaczone były do masowego mordowania Żydów z całej Europy, w ramach realizacji hitlerowskiego planu „ostatecznego rozwiązania kwestii żydowskiej” (Endlösung der Judenfrage). Organizację tej akcji przeprowadzał specjalny wydział w RSHA, na którego czele stał Adolf Eichmann (1906-62). Gł. urządzeniami obozów były komory gazowe i krematoria. Bezpośrednio po przewiezieniu do obozu, ofiary – nie podejrzewające podstępu – przeprowadzano do komór gazowych, urządzonych zewnętrznie jako łaźnie. Zwłoki ofiar uśmierconych gazem palono w krematoriach lub na wielkich stosach. Wszelkie przedmioty wartościowe, jak pieniądze, biżuteria oraz odzież i inne rzeczy, stanowiące własność ofiar, wywożono do Niemiec; pomordowanym ofiarom wyrywano złote zęby, a kobietom nadto obcinano włosy, które wysyłano do przerobu przem. (materace, włosianki itp.). Wszystkie czynności pomocnicze, jak wyjmowanie zwłok z komór, palenie ich, sortowanie rzeczy itp. wykonywały specjalne drużyny robocze (Sonderkommando), złożone z więźniów zakwaterowanych na miejscu; co pewien czas całe Sonderkommando zostawało zgładzone; na ziemiach pol., prócz obozów zagłady w h.o.k. Oświęcim-Brzezinka i Majdanek, istniały 4 samodzielne ośrodki masowej zagłady (obozy zagłady): w Chełmnie (Culmhof) nad Nerem (Poznańskie), w Bełżcu i w Sobiborze (Lubelskie) oraz w Treblince (Warszawskie).

We wszystkich h.o.k. mimo niesłychanego terroru istniał wśród więźniów tajny ruch oporu, który przybierał rozmaite formy. Najprostszą jego postacią była samopomoc koleżeńska w niewielkich, narodowościowych z reguły, grupach więźniów, nie mająca z początku formy organizacyjnej. W miarę napływu elementów uświadomionych politycznie i społecznie przybierał on stopniowo formy zorganizowane, ale był jeszcze rozbity na grupy narodowościowe i polityczne. Najbardziej postępowe i bojowe elementy wśród więźniów dążyły do międzynar. skonsolidowania tajnych grup obozowych, w celu wspólnego organizowania oporu i walki przeciwko hitleryzmowi. Tego rodzaju organizacje międzynar. istniały w Oświęcimiu, Buchenwaldzie, Mauthausen, Sachsenhausen i in. Zorganizowany ruch oporu istniał również wśród żyd. więźniów, obsługujących obozy masowej zagłady; on to zorganizował bunty obsługi w Oświęcimiu, Sobiborze, Treblince.

Wskutek zniszczenia przez hitlerowców większości dokumentacji obozowej, w celu zatarcia śladów zbrodni, nie udało się ustalić dokładnie liczby więźniów, którzy przeszli przez h.o.k. Według obliczeń szacunkowych można przypuszczać, że wynosi ona nie mniej niż 2,2 mln osób (mężczyzn, kobiet i dzieci). Z tej liczby prawdopodobnie ok. 1,5 mln osób poniosło śmierć. Powyższe liczby nie dotyczą innego rodzaju obozów (np. obozów karnych, pracy przymusowej i in.) ani obozów zagłady. W obozach zagłady nie wolno było prowadzić statystyki ani ewidencji zamordowanych ofiar, gdyż akcja masowej eksterminacji była w zasadzie dokonywana w tajemnicy; na podstawie danych szacunkowych opartych na ułamkowych materiałach, zgromadzonych przez Główną Komisję Badania Zbrodni Hitlerowskich w Polsce, można przypuszczać, że w obozach zagłady uśmiercono ok. 5,7 mln ofiar (ok. 99% Żydów, ok. 1% Cyganów i in.).

Międzynarodowy Trybunał Wojskowy w Norymberdze 1946 ustalił, że obozy koncentracyjne i obozy zagłady były narzędziem ludobójstwa, a organizatorzy i funkcjonariusze tych obozów są współsprawcami tej zbrodni. Po zakończeniu wojny na terenie Niemiec i w innych krajach odbyło się wiele procesów funkcjonariuszy SS, członków załóg obozów. M.in. w Polsce odbyły się procesy członków załogi obozów w Majdanku, Stutthofie, Gross-Rosen i Oświęcimiu-Brzezince.

Pamięć ofiar, które zginęły w obozach koncentracyjnych i obozach zagłady, jest czczona w różnych formach. Poświęcone im są uroczystości w okresie Międzynar. Tygodnia Solidarności Ruchu Oporu w kwietniu każdego roku, a także uroczystości lokalne, zwykle związane z rocznicą wyzwolenia poszczególnych obozów. W Polsce tereny obozów zostały uporządkowane, wystawiono na nich pomniki, urządzono symboliczne cmentarze lub usypano kopce, kryjące popioły ofiar; w Oświęcimiu, Majdanku, Sztutowie powstały muzea. W ramach ZBoWiD-u działają koła lub kluby byłych więźniów różnych obozów. Byli więźniowie niektórych obozów (m.in. Oświęcimia) założyli międzynar. komitety, grupujące przedstawicieli b. więźniów z całej Europy. Zob. też ludobójstwo, zbrodnie wojenne.

Największe hitlerowskie obozy koncentracyjne

Obóz Data powstania Data wyzwolenia Przybliżona liczba[1] Uwagi
więźniów ofiar
Bergen-Belsen X 1940 15 IV 1945 75 000 bliżej nie ustalona
Buchenwald VI 1937 11 IV 1945 240 000 56 000 powstał pod nazwą Ettersberg
Dachau IV 1933 29 IV 1945 160 000 bliżej nie ustalona
Dora (Nordhausen) VIII 1943 11 IV 1945 60 000 bliżej nie ustalona początkowo podobóz Buchenwaldu
Flossenbürg V 1938 23 IV 1945 81 000 bliżej nie ustalona
Rogoźnica (Gross-Rosen) VIII 1940 5 V 1945 125 000 50 000 początkowo podobóz Sachsenhausen
Majdanek X 1941 24 VII 1944 300 000 160 000 (bez obozu zagłady)
Mauthausen VII 1938 6 V 1945 164 000 bliżej nie ustalona
Natzweiler-Struthof VII 1940 V 1945 45 000 bliżej nie ustalona
Neuengamme VI 1940 4 V 1945 95 000 bliżej nie ustalona
Oświęcim-Brzezinka (Auschwitz-Birkenau) V 1940 27 I 1945 405 000 340 000 (bez obozu zagłady)
Ravensbrück V 1939 30 IV 1945 132 000 bliżej nie ustalona obóz kobiecy
Sachsenhausen-Oranienburg IX 1936 22 IV 1945 bliżej nie ustalona bliżej nie ustalona
Sztutowo (Stutthof) IX 1939 28 I 1945 120 000 70 000

[1] wg szacunkowych danych będących w posiadaniu Głównej Komisji Badania Zbrodni Hitlerowskich w Polsce.

 

Największe hitlerowskie obozy masowej zagłady

Nazwa obozu Data powstania Data likwidacji Przybliżona liczba ofiar[1]
Bełżec III 1942 IV 1943 600 000
Chełmno nad Nerem XII 1941 I 1945 360 000
Majdanek V 1942 VII 1944 200 000
Brzezinka (Oświęcim II) I 1942 XI 1944 3 500 000
Sobibór III 1942 X 1943 250 000
Treblinka II VII 1942 XI 1943 750 000

[1] wg szacunkowych danych będących w posiadaniu Głównej Komisji Badania Zbrodni Hitlerowskich w Polsce.

 

Hasło poprawione

PAŃSTWOWE WYDAWNICTWO NAUKOWE

Wielka Encyklopedia Powszechna PWN

Wkładka do tomu XI-1968

OD WYDAWNICTWA

W tomie VIII Wielkiej Encyklopedii Powszechnej PWN (1966) na str. 87-89 zostało zamieszczone hasło „obozy koncentracyjne hitlerowskie”, w którym się znalazły poważne błędy. Hasło to spotkało się z uzasadnioną krytyką.

Przyjęty w haśle podział na obozy koncentracyjne i obozy zagłady oraz podana liczba ofiar według narodowości, oparte na błędnych kryteriach, zniekształciły prawdę o systemie i rozmiarach hitlerowskiego ludobójstwa. Liczby bowiem ofiar wszystkich obozów hitlerowskich świadczą, że ludobójstwo więźniów było jedną z podstawowych funkcji nie tylko obozów koncentracyjnych i ośrodków masowej zagłady, lecz także obozów karnych, więzień, gett i innych typów obozów hitlerowskich, jak obozy pracy i obozy jeńców wojennych. Pominięto również fakt, że system i funkcja obozów hitlerowskich sprzed 1939 r. były zupełnie inne niż po agresji hitlerowskiej na Polskę. System obozów hitlerowskich odegrał w okresie 1939-45 r. kluczową rolę w systemie ludobójstwa, które miało służyć urzeczywistnieniu hitlerowskiego „nowego porządku” (Neue Ordnung) w Europie. W haśle „obozy koncentracyjne hitlerowskie” nastąpiło nieuzasadnione wyizolowanie systemu obozów z całokształtu polityki eksterminacji, stosowanej przez Niemcy hitlerowskie wobec okupowanych państw i podbitych narodów, zwłaszcza wobec Polaków.

Brak informacji o męczeństwie i stratach narodu polskiego w okresie okupacji, szczególnie o stratach Polaków i obywateli polskich innych narodowości w hitlerowskich obozach koncentracyjnych i ośrodkach zagłady, sprawił, że obraz martyrologii narodu polskiego i obywateli polskich innych narodowości został zniekształcony. Straty bowiem społeczeństwa polskiego w okresie II wojny świat, są w stosunku do ogółu ludności największe w porównaniu ze stratami innych państw koalicji antyhitlerowskiej.

W treści hasła podano, że obozy zagłady «istniały tylko na ziemiach okupowanej Polski», podczas gdy hitlerowskie obozy, których celem była zagłada więźniów, zlokalizowane były nie tylko w Polsce, lecz przede wszystkim w Niemczech, a także na terenie Austrii, na okupowanej przez III Rzeszę części terytorium ZSRR, w Jugosławii i innych państwach europejskich.

Uznając słuszność zarzutów odnoszących się do hasła „obozy koncentracyjne hitlerowskie”, redakcja Wielkiej Encyklopedii Powszechnej PWN przygotowała nowy tekst hasła, pt. „obozy hitlerowskie”. Opracowanie to zawiera możliwie szczegółową informację o zbrodniach popełnionych w różnego rodzaju obozach hitlerowskich. Czyniąc zadość powszechnemu życzeniu, Wydawnictwo załącza przy tomie XI nowo opracowany tekst hasła, którym czytelnicy zastąpią błędny tekst hasła „obozy koncentracyjne hitlerowskie”; niezależnie od tego nowy tekst hasła będzie w całości wydrukowany w suplemencie, w tomie XIII. Rzetelne zaznajomienie czytelnika z problemem obozów hitlerowskich jest szczególnie ważne wobec fałszerstw zawartych w niektórych publikacjach (również encyklopedycznych) krajów kapitalistycznych oraz w obliczu sojuszu Izraela z NRF, tak tragicznego w swojej wymowie politycznej i wobec zbrodni ludobójstwa popełnionych przez hitlerowców na narodach Europy.

Hasło „obozy hitlerowskie” uwzględnia wyniki obecnego stanu prac badawczych. Wydawnictwo pragnie dodać, że opracowało program, który w ostatnich trzech tomach Encyklopedii (XI-XIII) w pewnym stopniu uzupełnia braki i naprawia podstawowe błędy Wielkiej Encyklopedii Powszechnej PWN popełnione w jej pierwszym wydaniu. Całkowite uwzględnienie uwag krytycznych nastąpi w drugim wydaniu Encyklopedii, nad którym Wydawnictwo rozpocznie prace w 1969 r.

Wydawnictwo dziękuje Głównej Komisji Badania Zbrodni Hitlerowskich w Polsce, Radzie Ochrony Pomników Walki i Męczeństwa, Związkowi Bojowników o Wolność i Demokrację – za pomoc w zredagowaniu nowego tekstu hasła. Również cenną pomoc naukową okazali Wydawnictwu liczni pracownicy nauki Instytutu Historii PAN, Wojskowego Instytutu Historycznego, Uniwersytetu im. Adama Mickiewicza w Poznaniu, państwowych muzeów w Oświęcimiu, Majdanku i Stutthofie.

Państwowe Wydawnictwo Naukowe

Warszawa, w grudniu 1968 r.

 

OBOZY HITLEROWSKIE, miejsca uwięzienia i odosobnienia, pracy niewolniczej i masowej zagłady, organizowane przez władze hitlerowskie 1933-45 na terenie III Rzeszy i krajów okupowanych, kierowane przez SA, potem SS, aparat policyjny i Wehrmacht. Do 1939 celem o.h. było izolowanie i wyniszczenie opozycji antyhitlerowskiej, gł. komunistów, socjaldemokratów, antyfaszystowskich intelektualistów i działaczy. W 1939-45 o.h. zostały rozbudowane i przekształcone w podstawowy instrument terroru, eksploatacji siły roboczej oraz realizacji hitlerowskiego programu ludobójstwa podbitych narodów Europy. Organizowane były pod różnymi nazwami. Najbardziej znanym typem o.h. były hitlerowskie obozy koncentracyjne, uznane przez Międzynar. Trybunał Wojskowy w Norymberdze (1946) za jedne z najbardziej haniebnych środków terroru w stosunku do ludności krajów okupowanych, a zbrodnie w nich popełnione – za zbrodnie przeciw ludzkości. Należy zaznaczyć, że wskutek zniszczenia przez hitlerowców większości dokumentacji obozowej w celu zatarcia śladów zbrodni tylko częściowo udało się zewidencjonować zbrodnie dokonane w o.h., a dzięki prowadzonym badaniom stale odkrywa się nowe miejsca zbrodni.

Pierwsze obozy koncentracyjne zostały zorganizowane w III Rzeszy po wydaniu 28 II 1933 „rozporządzenia wyjątkowego o ochronie narodu i państwa”, zawieszającego wolność osobistą obywateli niem. i zezwalającego na aresztowanie i osadzanie bez wyroku sądowego na czas nieograniczony wszystkich antyfaszystów, jako wrogów państwa i narodu.

20 III 1933 na podstawie zarządzenia H. Himmlera zorganizowano pierwszy obóz koncentracyjny w Dachau. Gdy 1934 podporządkowano obozy koncentracyjne organom SS, obóz w Dachau stał się obozem wzorcowym. W 1933 SA i SS, przy współpracy policji, zorganizowały dalsze obozy, m.in. w Oranienburgu, Berlinie (Columbia-Haus), Papenburgu, Esterwegen, Dürrgoy (Tarnogaj k. Wrocławia), Kemna k. Wuppertalu, Sonnenburgu, Sachsenburgu, Lichtenburgu. W następnych latach powstawały obozy: w Sachsenhausen (1936), w Buchenwaldzie (1937), Mauthausen(1938), we Flossenbürgu (1938) oraz obóz dla kobiet w Ravensbrück (1939). Liczbę więźniów h.o. koncentracyjnych 1933-39 szacuje się na ok. 165-170 tys. osób.

Agresja Niemiec hitlerowskich na Polskę stanowiła w rozwoju o.h. zasadniczy punkt zwrotny. Do września 1939 istniały w III Rzeszy tylko obozy koncentracyjne jako jedyny typ o.h.; więziono w nich przede wszystkim obywateli III Rzeszy, Austrii i Czechosłowacji. Od września 1939 sieć o.h. została znacznie rozszerzona, a charakter obozów zróżnicowany. Wszystkie typy o.h., bez względu na nazwę, realizowały w różnym nasileniu i zakresie trzy podstawowe zadania: terror, wykorzystanie siły roboczej oraz fizyczne wyniszczanie narodów, gł. słowiańskich, a wśród nich przede wszystkim narodu polskiego i narodów ZSRR, oraz Żydów i osób, uznanych wg ustaw norymberskich za Żydów. O.h. stały się jednym z gł. narzędzi hitlerowskiej polityki eksterminacyjnej. Zmieniła się zasadniczo struktura narodowościowa więźniów. W 1939-45 w o.h. przebywali: Polacy, obywatele ZSRR, Francuzi, Holendrzy, Belgowie, Czesi, Jugosłowianie, Norwegowie, Duńczycy, Grecy, komuniści i antyfaszyści niem. i in. oraz obywatele pochodzenia żyd. z okupowanych przez III Rzeszę państw europejskich.

W systemie o.h. podstawową rolę odgrywały obozy koncentracyjne. Stan więźniów w tych obozach wzrósł z ok. 25 tys. w 1939 do ok. 88 tys. w grudniu 1942 i do 714 211 więźniów, w tym 202 674 kobiety, w dniu 15 I 1945. Obozy podlegały: 1) Głównemu Urzędowi Bezpieczeństwa Rzeszy (RSHA – Reichssicherheitshauptamt), 2) Głównemu Urzędowi Gospodarki i Administracji SS (SS-WVHA-Wirtschaftsverwaltungshauptamt), 3) Inspektorowi Obozów Koncentracyjnych (Führungs- und Aufsichtshauptamt – Inspektion der Konzentrationslager), który od 3 III 1942 wszedł w skład SS-WVHA jako Amtsgruppe D. Konzentrationslager. Sztab kierowniczy h.o. koncentracyjnych mieścił się w Oranienburgu 1936-45. Z obozami koncentracyjnymi (Konzentrationslager, Schutzhaft- und Konzentrationslager) były złączone ich podobozy (Nebenlager, Aussenlager) i oddziały robocze (Aussenkommando). Po 1939 znacznie rozbudowano dotychczas istniejące obozy koncentracyjne na terenie Niemiec, a w miarę okupowania innych krajów organizowano nowe obozy i ośrodki zagłady. Największe z nich to m.in.: Stutthof (Sztutowo – sierpień 1939), Oświęcim-Brzezinka (Auschwitz-Birkenau – maj 1940), Neuengamme (czerwiec 1940), Natzweiler-Struthof (lipiec 1940), Gross-Rosen (Rogoźnica – sierpień 1940), Bergen-Belsen (październik 1940), Majdanek (październik 1941), Chełmno n. Nerem (grudzień 1941), ‘s-Hertogenbosch (styczeń 1942), Bełżec (marzec 1942), Sobibór (marzec 1942), Treblinka II (lipiec 1942), Ryga-Kaiserwald (Salaspils maj 1943), Dora-Mittelbau (1943). Przy lokalizacji obozów brano m.in. pod uwagę położenie dogodne ze względów komunikacyjnych, ułatwiające transport setek tysięcy więźniów z całej prawie Europy (gł. na terenie Niemiec, Austrii i Polski), sąsiedztwo wielkich zakładów produkcyjnych lub kamieniołomów w celu wykorzystania pracy niewolniczej więźniów (gł. na terenie III Rzeszy), szczególnie niekorzystne warunki klimatyczne (obszary zabagnione, malaryczne, np. Stutthof, Oświęcim, Brzezinka, Dachau). W 1941 hitlerowcy zaczęli budować w kilku obozach komory gazowe, w których wymordowali co najmniej 3 mln ludzi. Pierwszą prowizoryczną komorę gazową urządzono w bloku 11 w Oświęcimiu; 3 IX 1941 zagazowano tu 850 więźniów, wśród których większość stanowili radz. jeńcy wojenni i Polacy. Obozy koncentracyjne były obozami stopniowej i masowej zagłady więźniów (np. Dachau, Buchenwald, Mauthausen-Gusen) lub obozami natychmiastowej i masowej zagłady, a w stosunku do poważnej części więźniów obozami natychmiastowej zagłady (np. Oświęcim-Brzezinka, Majdanek), natomiast tzw. ośrodki zagłady (np. Chełmno n. Nerem, Treblinka II, Bełżec, Sobibór) były miejscami bezpośredniej, natychmiastowej zagłady deportowanych.

Podobne funkcje eksterminacyjne spełniały więzienia policyjne przy organach gestapo (np. Fort VII w Poznaniu, Pawiak w Warszawie, Fort VII w Toruniu, Zamek w Lublinie, Rotunda w Zamościu, „Palace” w Zakopanem, więzienia w Żabikowie k. Poznania, w Radogoszczy – dzielnica Łodzi, i Montelupich w Krakowie), ciężkie więzienia, mające charakter obostrzonego obozu karnego (np. w Rawiczu, Wronkach). Charakter o.h. miały również obozy aresztu policyjnego, podległe wyższym dowódcom SS i policji.

Szczególnym typem o.h. były obozy dla dzieci i młodzieży (np. w Łodzi, Iławie, Potulicach, Lublińcu, Lubawie), które swym charakterem niejednokrotnie zbliżone były do obozów koncentracyjnych. W obozach tych oprócz dzieci polskich więzione były dzieci radz. (gł. białorus.), czes., jugosł., franc, i in. Ponadto dzieci przebywały prawie we wszystkich o.h., w niektórych obozach były specjalne oddziały dla dzieci, np. na Majdanku, w Oświęcimiu.

Z systemem obozów koncentracyjnych był powiązany system obozów pracy przymusowej, rozbudowany przez różne ogniwa aparatu hitlerowskiego, zwłaszcza przez koncerny przemysłowe, gł. przemysłu zbrojeniowego. Różnorodne były rodzaje i nazwy obozów pracy, m.in. karne obozy pracy (Strafarbeitslager, Straflager), obozy pracy przymusowej (Zwangsarbeitslager), wychowawcze obozy pracy (Arbeitserziehungslager), karne obozy służby budowlanej (Straflager des Baudienstes), budowy urządzeń wojskowych (Einsatzlager), obozy dla robotników, z Europy Wsch. (Ostarbeiterlager), obozy rolnomelioracyjne i obozy budowy dróg, obozy przy zakładach pracy (Gemeinschaftslager, Firmenlager). Do tej samej kategorii należały także obozy pracy dla Żydów (Judenarbeitslager). Więźniami obozów pracy byli obywatele wszystkich okupowanych krajów Europy. Liczba cudzoziemców wykonujących przymusowo pracę niewolniczą w III Rzeszy przekraczała 10 mln. Warunki egzystencji tych robotników niewiele się różniły od warunków więźniów w obozach koncentracyjnych; byli oni eksploatowani, podobnie jak więźniowie obozów koncentracyjnych, w gospodarce niem., np. w Generalnej Guberni w kwietniu 1943 pracowało w tzw. Firmenlager ok. 30 tys. osób, w zakładach Kruppa 1940-45 – 70 tys. robotników cywilnych, 23 tys. jeńców wojennych i 5 tys. więźniów obozów koncentracyjnych. Z pracy niewolniczej korzystały m.in. koncerny: IG-Farbenindustrie, Siemensa, Röchlinga, Flicka, Kruppa, Mannesmanna, Hoescha, Hawiela, AEG, „Hermann Göring”.

Jednym z typów o.h. były obozy przesiedleńcze i przejściowe (Umsiedlungslager), obozy dla cywilnych osób internowanych i dla zakładników (Internierungslager). Pierwsze takie obozy powstały na ziemiach pol. już we wrześniu 1939 (m.in. w Poznaniu, Skalmierzycach, Potulicach. Łodzi, Działdowie, Inowrocławiu); przeznaczone one były dla ludności pol. wysiedlonej z Wielkopolski, Śląska, ziemi łódzkiej, Pomorza i pd. Mazowsza. W 1942-44 zorganizowano takie obozy w Zamościu i Zwierzyńcu dla Polaków wysiedlonych z Zamojszczyzny, w Pruszkowie – dla mieszkańców Warszawy wysiedlonych po powstaniu warszawskim 1944. W obozach istniały specjalne bloki dla dzieci (np. blok 16 w Zamościu); b. złe warunki życia powodowały ogromną śmiertelność. Okupant hitlerowski organizował również obozy w celu germanizacji gł. dzieci polskich.

Do o.h. należy także włączyć getta dla ludności żydowskiej, organizowane w środk.-wsch. i pd. Europie. Warunki bytowania tej ludności, choroby, epidemie, masowe rozstrzeliwania powodowały wysoką śmiertelność.

Do systemu o.h. zalicza się wiele obozów jenieckich: obozy przejściowe dla jeńców wojennych (Durchgangslager – Dulag), obozy dla oficerów (Oflag), obozy dla podoficerów i szeregowców (Stalag) oraz jenieckie oddziały robocze (Arbeitskommando) i specjalne obozy pracy (Kriegsgefangenenarbeitskommando). Zaliczanie części obozów jenieckich do o.h. jest uzasadnione tym, że niektóre z tych obozów zostały faktycznie – wbrew międzynar. prawu – przekształcone w ośrodki zagłady, gł. obozy dla jeńców radz., a także różne karne i specjalne oddziały w obozach dla jeńców innych narodowości. Obozy jeńców radz., m.in. w Dęblinie, Szebniach, Łambinowicach (Lahmsdorf), Czarnem (Hammerstein), Suchożebrach, oraz inne obozy (m.in. w Rawie Ruskiej, Żaganiu, Częstochowie) były właściwie ośrodkami zagłady.

We wszystkich o.h. panowały ludobójcze warunki egzystencji, skazujące więźniów na nieuchronną śmierć. Władze obozów koncentracyjnych przeznaczały dla więźniów wyżywienie zawierające zaledwie 800-1000 kalorii dziennie; w dodatku esesmani systematycznie okradali więźniów z części ich żywności. Więźniowie pracowali 10-12 godzin na dobę, nie wyłączając świąt; wykonywali najcięższe roboty fiz., przekraczające często siły i możliwości ludzkiego organizmu. Należy tu zwłaszcza zaliczyć prace w kamieniołomach i żwirowniach, kopalniach, przy budowie tuneli i fabryk podziemnych oraz różnych urządzeń dla celów wojskowych. Obozy stały się terenem eksploatacji bezpłatnej siły roboczej; przynosiło to olbrzymie zyski koncernom hitlerowskim i przedsiębiorstwom SS. Okrutne kary, stosowane za najmniejsze uchybienia przepisom obozowym lub bez żadnego powodu, były także narzędziem eksterminacji więźniów. Najczęściej stosowane kary w obozach koncentracyjnych: chłosta, słupek, czyli wieszanie więźnia na wiele godzin za ręce związane z tyłu, stójka, polegająca na staniu na baczność, często przez całą noc, wyrafinowane ćwiczenia karne, kierowanie więźnia do karnej kompanii, co faktycznie oznaczało śmierć, osadzanie na wiele dni bez posiłku w bunkrze lub ciemnicy itp., kara śmierci. Egzekucji dokonywano przez zastrzelenie lub powieszenie na placu publicznym bądź na dziedzińcu kompanii karnej. Mordowano też więźniów przez wstrzykiwanie fenolu do mięśnia sercowego (w ten sposób uśmiercano w Oświęcimiu dzieci z Zamojszczyzny), topienie, duszenie, zagryzienie przez specjalnie szkolone psy. Najliczniejsze ofiary pochłonęły komory gazowe, w których mordowano ludzi dorosłych i dzieci (w Oświęcimiu zatruwając cyklonem B, w innych obozach – tlenkiem węgla, a także spalinami z silników Diesla). Okrutną formą znęcania się nad więźniami były tzw. apele; odbywały się 2-3 razy dziennie bez względu na pogodę i niekiedy trwały po kilkanaście godzin; apel był dodatkową okazją do mordowania więźniów. Dla sponiewierania godności ludzkiej, więźniów obozów koncentracyjnych oznaczano numerami (w Oświęcimiu dodatkowo byli tatuowani numerami). Więźniowie mieli naszyte na bluzie numery otaz barwne trójkąty (polityczni – czerwone) z inicjałami odpowiednich narodowości.

Wyniszczaniu więźniów w obozach koncentracyjnych sprzyjały również ludobójcze warunki bytowania. Stłoczeni w barakach, sypiali na wielopiętrowych pryczach, po 3-4 osoby, lub niejednokrotnie na betonie; byli pozbawieni bielizny i niezbędnej odzieży; ubiór więźnia składał się z tzw. pasiaka oraz drewnianych chodaków. Stan zdrowotności więźniów był katastrofalny. Najczęstszymi chorobami tyfus, krwawa dyzenteria, zapalenie płuc, obrzęki wodne, czyraki, flegmona, świerzb ropny. Dziesiątkowały one więźniów wskutek pozbawienia podstawowej opieki lekarskiej i lekarstw. Krańcowo wyczerpanych więźniów zabijano. Z początkiem 1942 lekarze SS zaczęli przeprowadzać na wielką skalę w obozach koncentracyjnych zbrodnicze eksperymenty pseudomedyczne, m.in. przez zarażanie więźniów malarią, tyfusem plamistym, ropowicą, zamrażanie, przeszczepianie wycinków mięśni i kości, zakażanie dzieci zarazkami gruźlicy; poza tym prowadzili badania nad odkryciem metod masowej sterylizacji i kastracji. Eksperymentom tym poddano wielu więźniów pol. (np. Polki w Ravensbrück). Wiele z tych eksperymentów dokonywano na zlecenie koncernów chem.-farm., niektóre służyły celom Wehrmachtu, a wszystkie sprowadzały śmierć lub co najmniej trwałe schorzenia czy kalectwa.

Wiosną 1945 setki tysięcy więźniów ewakuowano z o.h. W czasie marszów i transportów kolejowych zginęły wskutek zimna, głodu i egzekucji dziesiątki tysięcy więźniów. Były to marsze śmierci więźniów o.h. w przededniu odzyskania wolności i wyzwolenia z hitlerowskiego piekła. Podobny los spotkał tysiące więźniów wywiezionych m.in. z obozów Neuengamme, Stutthof; zostali oni zatopieni na Bałtyku i M. Północnym.

Pobyt w o.h. pozostawił trwałe ślady w stanie zdrowia (zarówno psych., jak fiz.) byłych więźniów; skutki pobytu w o.h. ujawniły się w przewlekle postępującej astenii, w uszkodzeniu narządów i układów tkanek ustroju oraz ich czynności; nastąpiło obniżenie odporności organizmu, np. zwiększona zapadalność na gruźlicę, przedwczesne starzenie się, które jest m.in. wynikiem długotrwałego przeciążenia nerwowego, lęku, bólu i stałych stresów psychicznych.

Ogółem na terenie III Rzeszy oraz 17 okupowanych państw hitlerowcy zorganizowali ok. 9 tys. obozów i podobozów. Przez wszystkie o.h. przeszło ok. 18 mln więźniów i jeńców wojennych z 30 krajów świata, a z nich zginęło 11 mln. W tej liczbie w obozach koncentracyjnych i ośrodkach zagłady było ogółem ok. 8.9 mln więźniów, z których zginęło co najmniej 7,2 mln, tj. 81%.

O.h. służyły realizacji programu biol. wyniszczenia narodu polskiego. W przemówieniu z dnia 15 II 1940, wygłoszonym do komendantów obozów koncentracyjnych, Heinrich Himmler stwierdził, że dla całkowitej eksterminacji narodu polskiego ”a) należy ustalić i wyszukać przywódców Polaków w celu ich unieszkodliwienia, b) należy szybko w ustalonych etapach wytępić Polaków, c) naród niemiecki powinien uznać za swoje główne zadanie zniszczenie wszystkich Polaków”. Ten program planowanej zagłady narodu pol. potwierdzają liczne dokumenty hitlerowskie, zweryfikowane w wyrokach Międzynar. Trybunału Wojskowego w Norymberdze (1946) oraz Najwyższego Trybunału Narodowego w Polsce (1946-48). Już w sierpniu i na początku września 1939 aresztowano i osadzono w o.h. ponad 2 tys. działaczy Związku Polaków w Niemczech i innych stowarzyszeń polonijnych w III Rzeszy, przy czym nauczycieli i uczniów gimnazjum pol. w Kwidzynie wywieziono do obozu w Hohenbruh k. Królewca (obecnie Kaliningrad). Systematyczne wysyłanie obywateli pol. do o.h. zaczęło się we wrześniu 1939. W końcu sierpnia utworzono w Stutthofie obóz policyjny dla Polaków (zwłaszcza z Gdańska i Pomorza). W końcu października 1939 rozpoczęto na rozkaz Himmlera wysiedlanie ok. 750 tys. Polaków z Wielkopolski, Pomorza i Śląska. Dalsze wysiedlanie objęło ziemie centralne Polski; 1940-44 wysiedlono z okolic Radomia, Dębicy, Lublina i Zamościa ok. 150 tys. Polaków (w tym ok. 30 tys. dzieci), z których wiele tysięcy osadzono w Oświęcimiu i na Majdanku lub wywieziono do obozów pracy na terenie Rzeszy. W listopadzie 1939 wywieziono do obozu w Sachsenhausen 184 profesorów i pracowników nauk. Uniwersytetu Jagiellońskiego i Akademii Górniczo-Hutniczej w Krakowie. Polacy stanowili pierwszą i największą grupę więźniów obozu w Oświęcimiu, który z czasem stał się jednym z największych ośrodków zbrodni hitlerowskich w Europie. Liczbę o.h. na ziemiach polskich szacuje się na ok. 2 tys. Poza tym Polacy znajdowali się prawie we wszystkich o.h. Najmocniej też odczuli niszczący system terroru i wyniszczenia. Z zasady kwalifikowani jako więźniowie polit., byli poddawani szczególnym formom terroru i eksterminacji. Straty zadane narodowi polskiemu przez hitlerowskiego okupanta 1939-45 wynoszą ogółem 6 028 000 ofiar (ponad 3 mln Polaków i ok. 2,7-3,0 mln obywateli pol. pochodzenia żyd., względnie uznanych wg ustaw norymberskich za Żydów); 5 384 000 osób zginęło wskutek terroru okupanta, w tym 1,3 mln Polaków – w obozach koncentracyjnych (Sprawozdanie w przedmiocie strat i szkód wojennych Polski w latach 1939-1945, sporządzone przez Biuro Odszkodowań Wojennych przy Prezydium Rady Ministrów w 1947). Ponadto należy uwzględnić ok. 2,4 mln Polaków, którzy zostali wywiezieni na roboty przymusowe do Niemiec lub innych krajów okupowanych i byli w obozach pracy, oraz ok. 2,5 mln Polaków, którzy zostali wysiedleni i przeszli przez różnego typu obozy wysiedleńcze i przejściowe, oraz wiele milionów Polaków dotkniętych kalectwem fiz. i psych, oraz gruźlicą. Potencjał pol. pracy przymusowej dla III Rzeszy szacuje się na 32 600 tys. lat roboczych. Zbrodnie hitlerowskie dokonane na narodzie polskim 1939-45 stanowiły wstęp do realizacji programu zagłady narodów wschodniej Europy, w tym zwłaszcza Polski, zawartego w „Generalnym Planie Wschód” – Generalplan Ost, opracowanego w Głównym Urzędzie Bezpieczeństwa Rzeszy – RSHA (27 IV 1942). Podstawowym narzędziem wykonaniu tego planu były o.h., które stale rozbudowywano dla przeprowadzenia masowej zagłady narodu polskiego. Świadczą o tym m.in. zachowane plany rozbudowy Majdanka, Oświęcimia oraz znajdujących się w nich komór gazowych i krematoriów.

Zbrodnie na jeńcach wojennych, gł. radzieckich, były elementem realizacji programu agresji i podboju narodów słowiańskich. Wbrew podpisanym przez Niemcy układom międzynar. (konwencja haska 1907 i konwencja genewska 1929) zbrodniarze hitlerowscy dopuścili się wymordowania w o.h. ponad 3,5 mln jeńców radzieckich. Od jesieni 1941 tworzono w obozach koncentracyjnych (Oświęcim, Sachsenhausen, Buchenwald) oddziały dla jeńców radz., organizowano dla nich także obozy przejściowe pod gołym niebem, w których pozbawieni wszelkiego pokarmu, wody i lekarstw, ginęli męczeńską śmiercią. Podobne metody stosowano wobec nich w zwykłych obozach jenieckich oraz poza obozami.

O.h. były także gł. narzędziem planu eksterminacji ludności żydowskiej, określanego przez hitlerowców jako „ostateczne rozwiązanie kwestii żydowskiej” („Endlösung der Judenfrage”). We wsch. Europie hitlerowcy skupiali początkowo Żydów w gettach, natomiast w zach. Europie poprzez obozy przejściowe kierowali do obozów koncentracyjnych i ośrodków zagłady, gdzie mordowali ich w komorach gazowych, a zwłoki palili w piecach krematoryjnych lub na stosach. Wg obliczeń szacunkowych na ok. 5,1 mln Żydów eur. zamordowanych przez hitlerowców, ok. 3 mln zginęło w o.h., 700 tys. w gettach, 1,4 mln zostało zabitych w miejscu pobytu przez Einsatzgruppen (oddziały specjalne), SS, policję, Wehrmacht i hitlerowskie władze cywilne. Tragiczne losy społeczności żydowskiej – obywateli polskich – są integralną częścią dziejów i tragedii państwa polskiego. W o.h. zginęło również wiele tysięcy Cyganów.

W wielu o.h. działał zorganizowany ruch oporu, który przybierał różne formy: od buntów więźniów (Sobibór, Treblinka, Brzezinka), poprzez działalność organizacyjną i polit., aż do przygotowywania powstania zbrojnego (Oświęcim, Majdanek, Buchenwald, Mauthausen). Główne kierunki działania ruchu oporu – to organizowanie solidarnej i wzajemnej pomocy, a zwłaszcza pomocy więźniom chorym i słabym przez przemycanie do obozów lekarstw, odzieży i żywności, organizowanie ucieczek, informowanie więźniów o rozwoju wydarzeń wojennych i polit., łączność z ruchem oporu poza obozem i przekazywanie informacji o zbrodniach hitlerowskich w obozie. Organizacje ruchu oporu w większości o.h. łączyły ludzi różnych narodowości i wszystkich kierunków polit., pogłębiały poczucie międzynar. solidarności więźniów, walczących przeciw hitleryzmowi. Czołową rolę odgrywali działacze lewicowi, gł. komuniści i socjaliści. Szczególnie aktywny udział w obozowym ruchu oporu brali Polacy, zwłaszcza w Oświęcimiu, Majdanku, Buchenwaldzie, Mauthausen-Gusen. Sachsenhausen, Dachau. Informacje o o.h. i dokonywanych tam zbrodniach były przekazywane pol. i świat, opinii publicznej przez prasę konspiracyjną, szczegółowe raporty, dokumenty i wydawnictwa polskiego podziemia.

Za ludobójstwo popełnione w o.h. odpowiedzialność ponoszą zbrodniarze hitlerowscy oraz przestępcze organizacje hitlerowskie: NSDAP, gestapo i SD (Sicherheitsdienst) oraz inne formacje policyjne, SS (Schutzstaffeln), SA (Sturmabteilungen). Odpowiedzialność ponosi również Wehrmacht, a także koncerny, organa wymiaru sprawiedliwości, organa propagandy, instytucje naukowe oraz wszystkie inne ośrodki gospodarki i przemysłu zbrojeniowego, planujące i realizujące agresję III Rzeszy przeciw narodom Europy oraz zbrodnie wojenne i zbrodnie przeciw ludzkości. Pod koniec wojny w obozach koncentracyjnych pełniło służbę ok. 45 tys. członków SS oraz ok. 10 tys. żołnierzy Wehrmachtu. W zbrodniczym aparacie organizującym i kierującym o.h. uczestniczyło kilkaset tys. osób. Nieznaczna ich część została ukarana. Polska, Związek Radziecki i niektóre inne kraje z koalicji antyhitlerowskiej oraz NRD nadal ścigają, zgodnie z zasadami prawa międzynar., zbrodniarzy hitlerowskich, spośród których większość przebywa na wolności, gł. w NRF. Wielu z nich organa wymiaru sprawiedliwości NRF uniewinniły lub pozostawiły poza ściganiem. To postępowanie władz NRF jest sprzeczne z zasadami prawa międzynar., z Konwencją ONZ z 5 XII 1948 w sprawie zapobiegania i karania zbrodni ludobójstwa oraz z Konwencją ONZ z 27 XI 1968 w sprawie nieprzedawniania zbrodni wojennych i zbrodni przeciw ludzkości.

W Polsce działalność dochodzeniowo-śledczą i badawczo-dokumentacyjną w zakresie zbrodni popełnionych przeciw narodowi pol. i obywatelom państwa pol., w tym w o.h., prowadzi Główna Komisja Badania Zbrodni Hitlerowskich. Na terenie niektórych największych o.h. powstały muzea martyrologii narodów, m.in. Państwowe Muzeum w Oświęcimiu, Państwowe Muzeum w Majdanku, muzeum na terenie dawnego obozu koncentracyjnego w Sztutowie (dawniej Stutthof), Muzeum w Łambinowicach. Niektóre z nich prowadzą intensywną działalność naukowo-badawczą i wydawniczą. Miejsca zbrodni i męczeństwa w o.h. zostały w odpowiedni sposób upamiętnione i otoczone szczególną opieką. W Polsce akcję tę prowadzi Rada Ochrony Pomników Walki i Męczeństwa. Dla uczczenia ofiar o.h. postawiono m.in. pomniki w Oświęcimiu, Treblince, Rogoźnicy, Sztutowie, Sobiborze, Płaszowie, na miejscu międzynar. obozu jeńców wojennych w Łambinowicach oraz w wielu tysiącach miejsc egzekucji i straceń. Więźniowie byłych o.h. są zrzeszeni w klubach i komitetach, spośród których szczególnie aktywne są Międzynar. Komitet Oświęcimski z siedzibą w Warszawie oraz Tow. Opieki nad Majdankiem w Lublinie. Polscy więźniowie są zorganizowani w Związku Bojowników o Wolność i Demokrację.

Rzeczywistość obozowa znalazła wielostronne odzwierciedlenie w literaturze pol. pamiętnikarskiej, fabularnej i naukowej oraz w filmie, muzyce, sztukach plastycznych. Zgromadzony w ten sposób materiał dokumentalny i poznawczy wzbogacił wiedzę o o.h., ugruntował w świadomości narodowej wiele cennych wartości humanistycznych, utrwalając pamięć o męczeństwie i bohaterstwie ofiar hitlerowskiego systemu masowej zagłady, o martyrologii i o walce Narodu Polskiego.

 

„Biuletyn Głównej Komisji Badania Zbrodni Hitlerowskich w Polsce”, r. 1-18, Warszawa 1946-68; „Biuletyn Żydowskiego Instytutu Historycznego”, nr. 1-67, Warszawa 1949-68; «Zeszyty oświęcimskie», wydawnictwo Państwowego Muzeum w Oświęcimiu, r. 1-11, 1957-68; „Przegląd lekarski”: zeszyty specjalne „Oświęcim” – poświęcone zagadnieniom lekarskim okresu okupacji hitlerowskiej w Polsce, Kraków 1961-68; W. Kiedrzyńska Ravensbrück, kobiecy obóz koncentracyjny, wyd. 2, Warszawa 1965; K. Bidakowski, T. Wójcik Pamiętniki nauczycieli. Z obozów i więzień hitlerowskich 1939-1945, Warszawa 1962; T. Cyprian, J. Sawicki Siedem procesów przed Najwyższym Trybunałem Narodowym, Poznań 1962; W. Kiedrzyńska Materiały do bibliografii hitlerowskich obozów koncentracyjnych, Warszawa 1964; Wspomnienia więźniów Pawiaka (1939-1944), red.; S. Płoski, Warszawa 1964; A. Fiderkiewicz Brzezinka. Wspomnienia z obozu, wyd. 4, Warszawa 1965; «Zeszyty Majdanka», wydawnictwo Państwowego Muzeum na Majdanku, t. 1-2, Lublin 1965-67; K. Dunin-Wąsowicz Obóz koncentracyjny Stutthof, Gdynia 1966; T. Sobański Ucieczki oświęcimskie, Warszawa 1966; Cz. Pilichowski O naukową rzetelność w traktowaniu problematyki zbrodni hitlerowskich oraz ich sprawców, „Za Wolność i Lud” 1967, nr 23; K. Rusinek Hitlerowskie obozy koncentracyjne, „Polityka” 1967, nr 45; J. Cyrankiewicz Przemówienie na odsłonięciu pomnika-mauzoleum w Oświęcimiu-Brzezince w dniu 16 IV 1967 r., „Trybuna Ludu” 1967, nr 105; A. Klafkowski Obozy koncentracyjne hitlerowskie jako zagadnienie prawa międzynarodowego, Warszawa 1968; T. Musioł Dachau 1933-1945, Katowice 1968; J. Wieczorek Hitlerowski obóz koncentracyjny Stutthof, „Trybuna Ludu” 1968, nr 240; Cz. Madajczyk Okupacja hitlerowska w Polsce, cz. 1-2, Warszawa 1968; Ponad ludzką miarę. Wspomnienia z Ravensbrück, Warszawa 1968; Catalogue of Comps and Prisons in Germany and German – Occupied Territories, Sept. 1 st 1939-May 8 th 1945, vol. 1-2, Arolsen 1949-50.

DSP. Zam. 10 595-N-30

Reklamy
Opublikowano Uncategorized | Otagowano , , , | Dodaj komentarz

Jerozolima stolicą Izraela

Nie, wcale nie chodzi o Trumpa 🙂

To Wielka Encyklopedia Powszechna w 1964 roku uznała Jerozolimę za stolicę Izraela.

Izrael w ERP

Słabo pamiętam tamte czasy, ale mam wrażenie że skutkiem była spora awantura: wydało wydawnictwo państwowe, zaakceptowała państwowa cenzura – czyli państwo to powiedziało. Arabscy sojusznicy się nie cieszyli…

(No i proszę – o tym to Wiki nie wie 🙂 )

 


A teraz, dla ciekawych stopka tego tomu. Nakład robi wrażenie…

Wydanie I. Nakład 178 000 + 550 egz. Seria A-1-133 500 dla subskrybentów. Seria B – 133 501-178 550 poza subskrypcją. Ark. wyd. 165, ark. druk. 52 + 2,5 ark. wkładek rotograwiurowych + 1 ark. wkładek wielobarwnych + 12 map wielobarwnych.

Papier druk. sat. kl. III 80 g 70 x 100, wyprodukowany w Fabryce Celulozy i Papieru im. J. Dąbrowskiego w Kluczach. Wkładki wielobarwne na papierze dwustronnie kredowanym kl. III, wyprodukowanym w Gnaszyńskich Zakładach Wyrobów Papierowych.

Wkładki rotograwiurowe na papierze kl. III 120 g 73 x 102, wyprodukowanym w Zakładach Celulozowo-Papierniczych we Włocławku.

Mapy na papierze mapowym kl. III 120 g 64 x 78, wyprodukowanym w Warszawskich Zakładach Papierniczych w Jeziornie. Skład, klisze, druk tekstu i wkładek rotograwiurowych oraz oprawę wykonano w Zakładach Graficznych Dom Słowa Polskiego w Warszawie.

Wkładki wielobarwne drukowano w Państwowej Wytwórni Papierów Wartościowych w Warszawie.

Mapy wielobarwne drukowano w Wydawnictwach Geologicznych w Warszawie.

Prace redakcyjne nad tomem piątym zakończono 30 czerwca 1964 r.

Oddano do składania 28 XII 1963 r. Druk ukończono w marcu 1965 r.

Cena dla subskrybentów: całość (t. 1-13) zł 1800.-; Cena tomów 1-12 – zł 135, tom 13- zł 180.-

Cena poza subskrypcją: całość (t. 1-13) zł 2340; cena jednego tomu zł 180.-

Zam. Nr 9300/64. Z-85

Opublikowano Uncategorized | Otagowano , , | Dodaj komentarz

Jak się kiedyś robiło polskie litery: praktyczny przykład z roku 1991

Dokumentacja:

(Tekst pochodzi z jakiegoś zamierzchłego edytora, stąd osobliwości, mimo oczyszczenia…)

*═══════════════════════════════════════════════════════*
EMUlator
Polskojęzyczne Środowisko programów.

*═══════════════════════════════════════════════════════*
CO TO JEST.

Program EMU (EMUlator bios’a) tworzy zintegrowane polskojęzyczne środowisko dla programów , korzystających przy obsłudze ekranu z funkcji BIOSa, głównie Clippper’owskich, ale także np.: C, FORTRAN, PASCAL. Umożliwia polskojęzyczną pracę dowolnego programu – przez uzyskanie i obsługę polskich znaków na ekranie, klawiaturze i drukarce, w dowolnym z kodów przyjętych w Polsce:

LATIN_2 – jedyny oficjalny kod polskich liter, stosowany przez IBM, Emix, Elwro,
MAZOVIA – jak sama nazwa wskazuje,
CSK – Computer Studio Kajkowscy (Mbank),
DHN – Dom Handlowy Nauki,
CYFROMAT –
MICROVEX –
UNIA –
NONE – nie używa żadnego kodu.

EMUlator jest zewnętrzny względem obsługiwanego programu – nie ma dla niego znaczenia w której wersji Clipper’a został
skompilowany program. Istotne jest tylko aby program kontaktował się z EMUlatorem w ustalony sposób. Program pracujący pod EMUlatorem może całkowicie poprawnie pracować bez EMUlatora – oczywiście bez polskich liter.

Dla skorzystania EMUlatora konieczne jest tylko posiadanie karty Hercules z dostępnymi obydwiema stronami graficznymi. Praktycznie znaczy to, że nie może być zainstalowana oprócz HGC karta CGA.

Wraz z EMUlatorem dostarczane są funkcje pozwalające użytkownikowi na uzyskanie całkowicie polskojęzycznego programu, co oznacza całkowicie polskojęzyczne sortowanie i wyszukiwanie.

Użytkownik może także w programie w łatwy sposób wywoływać wewnętrzne funkcje EMUlatora, jak np. definiować własne znaki.

EMUlator umożliwia przemienne stosowanie dowolnego standardu polskich liter, co może być niezwykle wygodne np.: przy pisaniu oprogramowania dla użytkowników stosujących różne standardy.

EMUlator nie jest rezydentny – więc nie zajmuje pamięci wtedy gdy nie jest potrzebny, gwarantuje, że po zakończeniu potomnego programu (nie ma znaczenia w jaki sposób się on zakończy) zostanie przywrócony normalny stan DOSa.

EMUlator instaluje własne przerwanie, pozwalające programowi użytkownika na bezpośrednie korzystanie z jego funkcji. Dostarczona dokumentacja oraz dostarczone wersje źródłowe funkcji pozwolą użytkownikowi znającemu asembler lub C na swobodne pisanie własnych funkcji korzystających z EMUlatora.

*═══════════════════════════════════════════════════════*

URUCHOMIENIE.

EMUlator uruchamia się w postaci:

EMU [-kod] nazwa_programu_do_uruchomienia [jego_argumenty…]

– kod w postaci minus i nazwa kodu polskich liter, tak jak to zostało podane powyżej. EMUlator domyślnie używa LATIN_2.
– nazwa_programu_do_uruchomienia – nazwa zbioru, który ma zostać uruchomiony jako potomek EMUlatora.
– jego_argumenty – o ile są podane to zostaną przekazane potomkowi.

Przykład:

Aby uruchomić program ‚kadry.exe’ trzeba napisać:
C:>EMU kadry.exe <───┘ Aby uruchomić DOSa w wersji polskiej – o ile nie masz zainstalowanego ANSI.SYSa ! – trzeba napisać: C:>EMU command <───┘ Możesz wypisać ten właśnie dokument po polsku pisząc: C:>type pg.doc >prn.

Zakończenie pracy uzyskasz pisząc:
C:>exit <───┘. Wraz z EMUlatorem został dostarczony przykładowy program ‚^demo.prg’ oraz ‚^clpm.bat’ służący do jego kompilacji. Uwaga: EMUlator szuka zbioru podanego do uruchomienia po ścieżce – PATH. Nie jest możliwe bezpośrednie uruchamianie zbiorów typu .BAT przez EMUlator. EMUlator pozwala uruchomić program o nazwie z dowolnym rozszerzeniem, nie tylko .COM i .EXE, ale próba uruchomienia zbioru tekstowego może skończyć się bardzo źle (nie wiadomo co on zrobi podczas wykonania, ale na pewno nic dobrego). *═══════════════════════════════════════════════════════* ZAKOŃCZENIE PRACY. Program potomny po wykonaniu się zawsze powraca do EMUlatora, niezależnie od sposobu zakończenia, a EMUlator przywraca poprzedni stan systemu i wyświetla końcowe informacje. W pierwszym wierszu: nazwę programu, numer wersji i numer seryjny. W drugim: nazwę używanego kodu polskich liter, oraz – jeżeli potomny program został poprawnie uruchomiony to podawany jest jego kod wyjścia w postaci dwóch liczb – pierwsza określa sposób zakończenia programu przez DOSa (0 – normalne, 1 – Ctrl-C, 2 – błąd urządzenia, 3 – program rezydentny), a druga jest to kod podawany przez program przy zakończeniu, w Clipper’ze obsługiwany funkcją ERRORLEVEL(). Jeżeli potomny program nie został uruchomiony to podawany jest komunikat określający rodzaj błędu, raportowanego przez funkcję SPAWN. Uwaga: Jeżeli program Clipper’owski załamie się podczas wykonania nagłówka, a przed rozpoczęciem właściwego programu – to zwrócony kod wyjścia nie będzie miał nic wspólnego z określonym przez ERRORLEVEL() w programie. Typowe błędy to: ENOENT – podany program nie został znaleziony ani w bieżącym katalogu, ani na ścieżce – albo go rzeczywiście nie ma, albo to literówka w jego nazwie. ENOMEM – jest za mało pamięci dla uruchomienia potomka – najpewniej masz jakiś program rezydentny – spróbuj go usunąć, wyjdź z NC, jeżeli w nim jesteś. ENOEXEC – to, co chcesz uruchomić, zdaniem DOSa, nie da się uruchomić. Jeżeli to rzeczywiście jest program typu EXE, to prawdopodobnie jest uszkodzony. E2BIG – nie powinno się pojawić, ale jeżeli się pojawi to sygnalizuje przepełnienie (prawdopodobnie) obszaru przeznaczonego na zmienne ustawiane przez SET – sprawdź to. Inne komunikaty świadczą, że prawdopodobnie EMUlator jest uszkodzony – czy to na dysku, czy to przez uruchomiony program. *═══════════════════════════════════════════════════════* SIDEKICK i inne rezydentne programy. Możliwe jest używanie wraz z EMUlatorem także Sidekick’a – istotne jest tylko, aby kończyć pracę z nim przez ESC, co przywróci właściwy tryb pracy ekranu, zmieniony przez SK. Nie jest wykluczone powstanie konfliktów pomiędzy niektórymi programami rezydentnymi a EMUlatorem przy obsłudze klawiatury. Dotąd nie zetknąłem się z czymś takim, ale jeżeli wystąpi to spróbuj empiryczne ustalić, czy zmiana kolejności instalowania programów nie zlikwiduje problemu. *═══════════════════════════════════════════════════════* INFORMACJE SZCZEGÓŁOWE: EKRAN. Podczas pracy programu ekran jest przełączany w tryb graficzny (640×350), znaki na ekranie są wyświetlane są jako graficzne, symulowana jest także sprzętowa obsługa kursora. Program użytkowy nie zdaje sobie z tego sprawy – dla programu użytkowego jest to monochromatyczny mod tekstowy 80×25 (mod 7). Po zakończeniu programu użytkowego jest przywracany poprzedni stan ekranu. Program pisze bezpośrednio do rejestrów kontrolera wizji, oraz samodzielnie wykonuje HGC FULL. Problemem jest interpretowanie atrybutów ekranu tekstowego w trybie graficznym. Program przedstawia znaki o podwyższonej jaskrawości oraz migające jako italiki (pochylone). Nie ma przeszkód przed dowolnym rozszerzeniem ilości fontów, spowoduje to jednak wzrost wielkości programu o więcej niż 256*14=3584 bajty, jeżeli życzysz sobie tego – skontaktuj się z autorem. EMUlator pozwala uzyskać dwa rodzaje kursora: stały oraz migający. EMU_CALL(33,0) && uruchomienie kursora NIE migającego Interpretacja atrybutów – Clipper. EMUlator musi przekształcić atrybuty ekranu do postaci odpowiedniej dla ekranu graficznego – tworzonego przez czarne i białe punkty. W clipper’ze dla tej wersji EMUlatora optymalną konwersję uzyskuje się dla: SETCOLOR(„W/N ,N+/U,,W,N/W”) Atrybut W dla BORDER’u jest zalecany, ponieważ określa on kolor znaków przy pracy z EMU.cga. Jeżeli życzysz sobie EMUlatora dostosowanego do swoich potrzeb – skontaktuj się z autorem, adres jest na końcu tekstu. *══════════════════════════════════════════════════════* INFORMACJE SZCZEGÓŁOWE: KLAWIATURA. Program obsługuje klawiaturę w sposób znany jako ‚klawiatura programisty’. Oznacza to, że literę ‚ą’ uzyskuje się naciskając klawisz ‚a’ wraz z klawiszem ALT, a literę ‚Ą’ – klawisz ‚A’ wraz z klawiszami SHIFT i ALT. (Litery ‚ż’ i ‚ź’ są przyporządkowane klawiszom ‚Z’ i ‚X’.) Klawisz ALT spełnia funkcję POLSKIEGO SHIFTa. Obsługę polskich liter włącza i wyłącza się klawiszem ScrollLock – co pozwala na używanie także kombinacji typu ALT-A, czy ALT-C, co jest niezbędne w wielu programach. Przez użycie EMU_CALL(69, 1) uzyskuje się wymuszenie polskiej klawiatury – stan ScrollLock nie ma wtedy znaczenia. Uwaga: Przez użycie EMU_CALL(71, 1) podczas aktywności polskich liter na klawiaturze: lewy shift oraz prawy shift wraz z klawiaturą numeryczną, szarym ‚+’ i ‚-‚ będą wypisywać znaki tworzące ramki, odpowiednio: pojedynczą i podwójną. Wraz z CapsLock wypisują znaki łączące ramki pojedyncze z podwójnymi. Także z klawiszami Esc, Backspace i Del są związane symbole semigraficzne. *═══════════════════════════════════════════════════════* INFORMACJE SZCZEGÓŁOWE: DRUKARKA. Przy drukowaniu polskich liter mogą wystąpić następujące sytuacje: 1) Drukarka ma zaprogramowany zestaw znaków. Rozwiązanie najprostsze w eksploatacji, ale często niewygodne do uzyskania – gdy oznacza konieczność przeprogramowania wlutowanych EPROMów, a trudne szczególnie dla egzotycznych drukarek. Zaletą są dobre kształty znaków, wadą przywiązanie do jednego kodu – szczególnie w warunkach krajowej wielości obowiązujących standardów. 2) Zaprogramowanie polskich liter na drukarce. Po każdym włączeniu drukarki należy wysłać do niej ciąg znaków definiujących polskie litery. Kody i kształty polskich liter określane są przy ich definiowaniu i mogą być różne dla różnych programów. 3) Metoda BackSpace. Polska litera powstaje poprzez wydrukowanie angielskiego odpowiednika, cofnięcie głowicy przez BS i wydrukowanie odpowiedniego ogonka. Przykładowo, ‚ą’ powstaje z ‚a’, BS, ‚,’. Wielką zaletą tej metody jest to, że działa praktycznie na wszystkich drukarkach, dając przyzwoite kształty polskich liter oraz tolerując wszelkie błędy wydruku. Metoda ta jest męcząca dla drukarki, co też jest jej największą wadą, a przy większej ilości polskich liter w tekście powolna. Ta metoda jest ustawiana przy starcie EMUlatora. Załączenie tej funkcji w programie uzyskuje się przez: EMU_CALL(129, 1) 4) Metoda dwu wierszy. Tekst jest drukowany wierszami. Jeżeli w drukowanym wierszu znajduje się polska litera to wiersz drukowany jest dwa razy: w pierwszym przebiegu angielskie odpowiedniki, w drugim przebiegu na pierwszy wiersz nadrukowywane są ogonki. Metoda nie obciąża drukarki, co jest jej największą zaletą. Wadą metody jest konieczność obsługi przez dosyć skomplikowany program, posiadający co najmniej jeden bufor, o długości większej od długości drukowanych wierszy. Jeżeli program obsługi będzie w miarę uniwersalny, to nie będzie mógł rozumieć większości kodów sterujących drukarki (gdyby chciał je rozumieć, to musiałby być funkcjonalną kopią programu sterującego drukarką). Użytkownik musi wydruki projektować biorąc pod uwagę istnienie i działanie programu. Jeżeli używasz tej metody, to pamiętaj, że handler drukarki rozpoznaje tylko typowe kody sterujące – żadnego z rozpoczynających się od ESCape (DODATEK C). Jeżeli stosujesz wielokrotne nadrukowywanie dla uwydatnienia tekstu, to w tej metodzie to nie zadziała. Załączenie tej funkcji w programie uzyskuje się przez: EMU_CALL(129, 2) *═══════════════════════════════════════════════════════* DODATEK A. Funkcje użytkownika. EMU_CALL(ax, bx, cx, dx, si, di) Wywołanie EMUlatora – to znaczy wykonanie przerwania INT 64h z podanymi wartościami w rejestrach – zgodnie z DODATKIEM B. Funkcja EMU_CALL() może być wywołana niezależnie od obecności EMUlatora. Na wejściu: ax – bx – cx – dx – si – di – Na wyjściu: bx – EMU_DEF(font, znak, def_string) Definiowanie własnych znaków przez użytkownika. Na wejściu: font – numer fontu, tutaj 0 znak – numer znaku 0..255 def_string – 14 znakowy (dla HGC) łańcuch zawierający definicję Na wyjściu: [ NIC ] ISEMU() Sprawdzenie obecności EMUlatora. Na wejściu: [ NIC ] Na wyjściu: .T. – EMUlator jest obecny .F. – nie ma EMUlatora PL_INIT() Inicjalizacja funkcji obsługujących polskie litery. Dane są czytane z EMUlatora, konieczne jest wywołanie tej funkcji na początku programu oraz po zmianie kodu polskich liter. Na wejściu: [ NIC ] Na wyjściu: .T. – EMUlator jest obecny .F. – nie ma EMUlatora PL_UPPER() Zamiana na duże litery, z uwzględnieniem aktualnych polskich. Na wejściu: Tekst Na wyjściu: Tekst PL_LOWER() Zamiana na małe litery, z uwzględnieniem aktualnych polskich. Na wejściu: Tekst Na wyjściu: Tekst PL_MAP() Zamienia na angielskie odpowiedniki podane polskie, z uwzględnieniem aktualnych polskich („Kądziołka”->”Kadziolka”). Funkcja pozwala wyszukiwać w zbiorze polskojęzyczne teksty, niezależnie od tego, czy zostały wpisane z polskimi literami, czy też bez. Przy indeksowaniu pozwala uzyskać przyzwoite polskojęzyczne uporządkowanie.

Przykładowo: ciągi znaków ‚AĄB’, ‚AĄA’, ‚AAB’ zostaną przez PL_MAP() uporządkowane następująco: ‚AĄA’, ‚AAB’, ‚AĄB’.

Na wejściu:
Tekst

Na wyjściu:
Tekst

PL_ORD()
Przekształca podany tekst na łańcuch zawierający bajty określające bezwzględną kolejność podanych znaków – z uwzględnieniem polskich liter. Użycie funkcji przy indeksowaniu spowoduje polskojęzyczne uporządkowanie zbioru.

Przykładowo: ciągi znaków ‚AĄB’, ‚AĄA’, ‚AAB’ zostaną przez PL_ORD() uporządkowane następująco: ‚AAB’, ‚AĄA’, ‚AĄB’.

Na wejściu:
Tekst

Na wyjściu:
Tekst

UWAGA:
W zbiorze $emu.c zawarte są dwie wersje niektórych funkcji, jedna operująca na kopii przekazanego łańcucha, druga bezpośrednio na samym łańcuchu.

*═══════════════════════════════════════════════════════*
DODATEK B.
Przerwanie EMUlatora.

EMUlator podczas pracy instaluje przerwanie 0x64, poprzez które potomny program uzyskuje dostęp do EMUlatora.

Sposób wywołania:

Na wejściu:

rejestr AX – numer funkcji
rejestr BX – główny argument
rejestry CX, DX, SI, DI – argumenty pozostałe
INT 64h

Na wyjściu:

rejestry BX, CX, DX, SI, DI
rejestr AX – jeżeli równy 0xffff, to brak funkcji którą wywoływano
rejestr BX – w nim zwracana jest główna wartość
rejestry CX, DX, SI, DI – pozostałe dane (o ile takowe są)

Opis wszystkich funkcji EMUlatora znajduje się w zbiorze ’emu_func.doc’.

*═══════════════════════════════════════════════════════*
DODATEK C.

Liniowy handler drukarki.
Poniżej podane jest, w jaki sposób liniowy handler drukarki traktuje znaki o kodach 0..31 i 127.

Znaki przesyłane do drukarki bez zmian – jednokrotnie.

Kod 0 – NULL
Kod 1 – SOH
Kod 2 – STX
Kod 3 –
Kod 4 –
Kod 5 –
Kod 6 –
Kod 7 – BEL
Kod 16 – DLE
Kod 17 – DC1
Kod 19 – DC3
Kod 21 –
Kod 22 – SYN
Kod 23 – ETB
Kod 25 – EM
Kod 26 – SUB
Kod 27 – ESC
Kod 28 – FS
Kod 29 – GS
Kod 30 – RS
Kod 31 – US

Znaki przesyłane w obydwu przebiegach.

Kod 8 – BS
Kod 9 – HT
Kod 14 – SO
Kod 15 – SI
Kod 18 – DC2
Kod 20 – DC4
Kod 127 – DEL

Znaki przesyłane i traktowane przez handler jako sterujące.

Kod 10 – LF wysuw papieru o jeden wiersz, powoduje wydruk.
Kod 11 – VT tabulacja pionowa, powoduje wydruk.
Kod 12 – FF wysuw do nowej strony, powoduje wydruk.
Kod 13 – CR powoduje wydruk, także bufora wewnętrznego.
Kod 24 – CAN skasowanie bufora drukarki, także wewnętrznego

Przy próbie przekroczenia wielkości bufora wewnętrznego jest on kasowany i blokowany, aż do rozpoczęcia nowego wiersza.
*═══════════════════════════════════════════════════════*
DODATEK D.

Kolejność polskich liter.
Polskie litery są umieszczone w wewnętrznych buforach programu w poniższej kolejności: „ĄĆĘŁŃÓŚŹŻ”, „ąćęłńóśźż”. Kolejność ta obowiązuje także dla funkcji sortujących.
*═══════════════════════════════════════════════════════*
DODATEK E.

Przygotowanie programu do współpracy z EMUlatorem – Clipper.

UWAGA:

Wśród zbiorów dostarczanych z EMUlatorem znajduje się ‚^DEMO.PRG’, będący przykładowym programem prezentującym podstawowe zastosowania funkcji użytkownika.
Dla wstępnego uruchomienia wystarczy linkować program z PCBIOS.OBJ. Pozwoli to na ewentualne skorygowanie ustawienia atrybutów (SET COLOR ) w programie, tak aby uzyskać jego właściwą postać przy pracy z EMUlatorem.
Następnym etapem jest wpisanie polskich liter do formatek i komunikatów programu.
Taki program będzie już pozwalał wprowadzać dane po polsku, a także będzie pisał na ekranie i drukarce po polsku. Jeżeli pola, w których są polskie litery nie są używane do indeksowania lub wyszukiwania, to może to być już koniec przeróbek!
Aby uzyskać polskojęzyczne sortowanie i wyszukiwanie trzeba oprócz PCBIOS.OBJ zlinkować z programem EMU.LIB (DODATEK G).
Na początku programu trzeba ustawić parametry pracy EMUlatora przez wywołania funkcji EMU_CALL().

*
IF ISEMU() && tylko wtedy, gdy jest EMUlator
*
SETCOLOR(„W/N ,N+/U,,W,N/W”)
*
EMU_CALL(33, 1) && kursor migający
EMU_CALL(65, 1) && kod aktualnie obowiązujących
&& polskich znaków – LATIN 2
EMU_CALL(69, 1) && polskie litery niezależne od ScrollLock
EMU_CALL(129, 2)&& wierszowa obsługa polskich liter
*
* Potem należy wywołać PL_INIT().
PL_INIT()
*
ELSE
* można uniemożliwić uruchomienie programu bez EMU,
* albo ustawić parametry programu dla pracy bez EMU.
*
?
? „*** Ten program wymaga EMUlatora ***”
?
QUIT
ENDIF
*

Jeżeli w bazie dane mają być zapisane dużymi literami to umieścić PL_UPPER() bezpośrednio w instrukcji REPLACE, co da pewność, że zostaną przekształcone.
Jeżeli stosuje się indeksowanie po polach mogących zawierać polskie litery użyć funkcji PL_MAP() albo PL_ORD().
Funkcja PL_MAP() przekształca polskie litery na angielskie odpowiedniki, co oznacza, że np. z ‚Kądziołki’ powstanie ‚Kadziolka’. Użycie tej funkcji do indexowania i wyszukiwania spowoduje, że: dane zostaną posortowane sensownie, ale nie doskonale – ‚ą’ będzie traktowane dokładnie jak ‚a’, ale też program będzie tolerował polskie dane wpisane po angielsku – np. wpisane przed użyciem EMUlatora, jak i błędy przy wprowadzaniu spowodowane brakiem przyzwyczajenia do używania polskich liter.

Przykład:
USE osoby
INDEX ON Pl_map(Pl_upper(nazwisko)) TO nazw
x = „Kądziołka”
x = Pl_upper(x)
SEEK Pl_map(x) * LOCATE FOR Pl_map(x) == Pl_map(osoby->nazwisko)
? imie

Funkcja PL_ORD() przekształca polskie litery na kody, określające w jednoznaczny sposób ich kolejność. Użycie tej
funkcji do indexowania i wyszukiwania spowoduje, że program będzie pracował CAŁKOWICIE po polsku.

Przykład:
USE osoby
INDEX ON Pl_ord(Pl_upper(nazwisko)) TO nazw
x = „Kądziołka”
x = Pl_upper(x)
SEEK Pl_ord(x)
? imie

Podobnie należy postąpić przy wyszukiwaniu (SEEK, LOCATE), oraz przy porównywaniu tekstów polskojęzycznych (IF PL_MAP(x) == PL_MAP(y) ).
Opisane funkcje mogą być wywoływane mimo braku EMUlatora – działają wtedy angielskojęzycznie.
Powyższe wskazówki są wyłącznie orientacyjne – każdy program jest inny i najważniejsze, to wiedzieć, co chce się osiągnąć.
*═══════════════════════════════════════════════════════*
DODATEK F.

Kompilacja.
Poniżej przedstawiony jest BATCH służący do kompilacji programów korzystających z funkcji użytkownika.

Założenia:

W katalogu C:\CLP znajduje się Clipper, czyli CLIPPER.EXE,
CLIPPER.LIB, EXTEND.LIB, DEBUG.OBJ, PCBIOS.OBJ.

EMU.LIB znajduje się w bieżącym katalogu.

LINK.EXE i TLIB.EXE są osiągalne na ścieżce.

Poniższy BATCH nazywa się ECLP.BAT i jest osiągalny na ścieżce.

@ECHO OFF C:\CLP\CLIPPER %1 %2 IF ERRORLEVEL 1 GOTO END ECHO .
rem ————————- rem
rem Ta pozycja ukazuje linkowanie przy pomocy LINKa.
rem (LINK ma duże możliwości, ale jest wolniejszy od TLINKa)
rem link %1+c:\clp\debug+c:\clp\pcbios/noe/noi/se:512/e/far,,nul.map,c:\clp\clipper+c:\clp\extend+EMU.LIB
rem ————————-
rem
rem Ta pozycja ukazuje linkowanie przy pomocy TLINKa.
rem (TLINK jest bardzo szybki ale głupi – może zakłócać działanie
rem niektórych funkcji !) tlink %1+c:\clp\debug+c:\clp\pcbios,,,c:\clp\clipper+c:\clp\extend+EMU.LIB
/c rem ————————- :END IF EXIST %1.OBJ ERASE
%1.OBJ ECHO .

Jeżeli chcesz skompilować przy pomocy powyższega BATCHa program nazywający się ‚TEST.PRG’ to napisz ‚ECLP test <───┘’ (nazwa programu BEZ rozszerzenia).
*═══════════════════════════════════════════════════════*
DODATEK G.

Biblioteka.
Wraz z EMUlatorem są dostarczone zbiory ‚$EMU.C’ i ‚EMU.LIB’. ‚EMU.LIB’ zawiera funkcje, które po dołączeniu, do kompilowanego programu pozwolą wywoływać funkcje EMUlatora, jak i polskojęzyczne warianty niezbędnych funkcji CLIPPER’owskich, a ‚$EMU.C’ zawiera ich postać źródłową. Biblioteka ta nie ma charakteru ostatecznego – jest przykładem i propozycją dla użytkownika jak napisać własne funkcje.

EMU_CALL(ax, bx, cx, dx, si, di) EMU_DEF(font, znak, def_string)

ISEMU() PL_INIT() PL_UPPER() PL_LOWER() PL_MAP() PL_ORD()

FULL_CRS() – załączenie dużego kursora SET_CRS(top, bottom) – zalączenie kursora o podanych wymiarach

Opis EMU, wersja 3.0 tk.

Makefile:

DEBUG=0
MASM_PATH=$(_)/masm
#VERSION=-DTREND
#VERSION=-DCLIPPER
#------------------------------------------------#
#!if $(DEBUG)==1
#C_FLAGS= -AS -c
#D_FLAG= -Mx -Zi
#L_FLAGS= /CPAR:1/FAR/NOI/COD/MAP
#------------------------------------------------#
#!else
C_FLAGS= -AS -Oti -c
D_FLAG= -Mx
L_FLAGS= /CPAR:1/FAR/NOI
#------------------------------------------------#
#!endif
emu.exe: emu.obj a1_emu.obj a2_emu.obj gpkey.obj
link emu.obj+a1_emu.obj+a2_emu.obj+gpkey.obj $(L_FLAGS);
C:/TOOLS/COPYR emu.exe
#
demu.exe:
cl $(C_FLAGS) -DDEMO $(VERSION) emu.c
$(MASM_PATH)/masm $(D_FLAG) -DDEMO $(VERSION) -I$(MASM_PATH) gpkey.asm;
$(MASM_PATH)/masm $(D_FLAG) -DDEMO $(VERSION) -I$(MASM_PATH) a1_emu.asm;
$(MASM_PATH)/masm $(D_FLAG) -DDEMO $(VERSION) -I$(MASM_PATH) a2_emu.asm;
link emu.obj+a1_emu.obj+a2_emu.obj+gpkey.obj $(L_FLAGS), demu.exe;
C:/TOOLS/COPYR demu.exe
del *.obj
#
emu.obj: emu.c
cl $(C_FLAGS) $(VERSION) emu.c
gpkey.obj: gpkey.asm
$(MASM_PATH)/masm $(D_FLAG) $(VERSION) -I$(MASM_PATH) gpkey.asm;
a1_emu.obj: a1_emu.asm
$(MASM_PATH)/masm $(D_FLAG) $(VERSION) -I$(MASM_PATH) a1_emu.asm;
a2_emu.obj: a2_emu.asm
$(MASM_PATH)/masm $(D_FLAG) $(VERSION) -I$(MASM_PATH) a2_emu.asm;

Jeden z modułów:

NAME a1_emu
INCLUDE mixed.inc
.MODEL small
cLang=1
;
CHAR_HEIGHT EQU 14
FONT_SIZE EQU 256*CHAR_HEIGHT
;
;
OFFSET_SUM1 EQU 137;/* SECURITY */
OFFSET_SUM2 EQU 112;/* SECURITY */
OFFSET_KEY EQU 81;/* SECURITY */
USER_NAME_LENGTH EQU 76;/* SECURITY */
;
;
_TEXT SEGMENT WORD PUBLIC 'CODE'
_TEXT ENDS
_DATA SEGMENT WORD PUBLIC 'DATA'
;------------------------------------------------------------------
EXTRN _crs_top:BYTE, _crs_bot:BYTE
EXTRN _crs_row:BYTE, _crs_col:BYTE
EXTRN _crs_on:BYTE

EXTRN _display_buffer:BYTE

EXTRN _font_tbl_norm:BYTE
EXTRN _font_tbl_pol:BYTE
EXTRN beg_rows:WORD
;
EXTRN _pol_tbl:BYTE;
EXTRN _eng_tbl:BYTE;
EXTRN _dia_tbl:BYTE;
EXTRN _map_char:BYTE, _map_dia:BYTE;
EXTRN _old_v_10:DWORD
EXTRN _old_v_17:DWORD
;
EXTRN _passwd:BYTE;/* SECURITY */
EXTRN _user_name:BYTE;/* SECURITY */
EXTRN _sum1:WORD;/* SECURITY */
;——————————————————————
_DATA ENDS
DGROUP GROUP _DATA

ASSUME CS: _TEXT, DS: DGROUP, SS: DGROUP

_TEXT SEGMENT
ASSUME CS: _TEXT
;——————————————————————
hProc , , reg_AX:WORD, reg_DX:WORD
;
mov AX, reg_AX
mov DX, reg_DX
pushf
CALL DWORD PTR _old_v_17
;
hRet
hEndp
;——————————————————————
; jeżeli znak jest polski, to zwraca !0 i (inaczej 0)
;wpisuje do map_char angielski odpowiednik,
;a do map_dia odpowiedni ogonek.
hProc , , char:BYTE
;
test char, 80h
jz no_map; polskie litery NA PEWNO >= 80h
;
mov AX, DS
mov ES, AX
;
mov AL, char
mov DI, OFFSET _pol_tbl
mov CX, 18
cld
repne scasb
je map_it
no_map:
sub AX, AX
jmp short end_map
;
map_it:
sub DI, OFFSET _pol_tbl + 1
mov AL, DS:[DI + OFFSET _eng_tbl]
mov _map_char, AL
;
mov AL, DS:[DI + OFFSET _dia_tbl]
mov _map_dia, AL
;
end_map:
hRet
hEndp
;——————————————————————
hProc ; AX != 0 dla HGC
;
int 11h
and AX, 0030h
cmp AX, 0030h
je is_mono
sub AX, AX
;
is_mono:
CALL _decode;/* SECURITY */
hRet
hEndp
;——————————————————————
; odczytuje pozycje kursora z biosa i wpisuje ją do zmiennych
hProc ,
;
mov AH, 03h
mov BH, 0
;
pushf
CALL DWORD PTR _old_v_10
;
mov _crs_row, DH
mov _crs_col, DL
;
hRet
hEndp
;——————————————————————
hProc ,
;
mov AH, 02h
mov BH, 0
;
mov DH, _crs_row
mov DL, _crs_col
;
pushf
CALL DWORD PTR _old_v_10
;
hRet
hEndp
;——————————————————————
hProc , , font:BYTE, char_no:BYTE, segm:WORD, offs:WORD
;
mov DI, OFFSET _font_tbl_norm
cmp font, 0
je lc_done
;
mov DI, OFFSET _font_tbl_pol
cmp font, 16
je lc_done
;
mov AX, 0ffffh
jmp short lc_quit
;
lc_done:
mov AX, CHAR_HEIGHT
mov BL, char_no
mul BL
add DI, AX ; DI wskazuje na znak w tablicy fontów
;
mov AX, CHAR_HEIGHT
push AX
push DI
push offs
push segm
CALL _from_far_cpy
add SP, 8
;
sub AX, AX
;
lc_quit:
;
hRet
hEndp
;——————————————————————
; kopiuje do EMU (DS:dst) z zewnątrz src_seg:src_off kount bajtów
hProc , , src_seg:WORD, src_off:WORD, dst_off:WORD, count:WORD
;
mov BX, dst_off
mov SI, src_seg
mov ES, SI
mov SI, src_off
;
mov CX, count
next_byte_cpy:
mov AL, BYTE PTR ES:[SI]
mov BYTE PTR [BX], AL
inc SI
inc BX
loop next_byte_cpy
;
hRet
hEndp
;——————————————————————
;——————————————————————
hProc , ;/* SECURITY */
;
mov DX, 0
mov BX, OFFSET _user_name
mov CX, USER_NAME_LENGTH
mov AH, DL
next_sum2:
mov AL, [BX]
add DX, AX
add BX, 1
loop next_sum2
;
mov AX, DX
;
hRet
hEndp
;——————————————————————
;——————————————————————
hProc ,
;
mov AX, 0b000h
mov ES, AX
mov DI, 0
MOV CX, 2000
mov AX, 0720h
cld
REP stosw
;
hRet
hEndp
;——————————————————————
hProc ,
;
mov AX, 0b800h
mov ES, AX
mov DI, 0
MOV CX, 4000h
mov AX, 0
cld
REP stosw
;
hRet
hEndp
;——————————————————————
; Scroll Window Up & Down
hProc , r_ax:WORD, r_bx:WORD, r_cx:WORD, r_dx:WORD
;
cli
mov AX, SP
push AX
sti
push BX
push CX
push DX
; push SP
push BP
push SI
push DI
;
mov AX, r_AX
mov BX, r_BX
mov CX, r_CX
mov DX, r_DX
;
pushf
CALL DWORD PTR _old_v_10
;
pop DI
pop SI
pop BP
; pop SP
pop DX
pop CX
pop BX
cli
pop AX
mov SP, AX
sti
;
hRet
hEndp
;——————————————————————
;——————————————————————
; Read Character and Attribute at Cursor
hProc ,
;
sub BH, BH
mov BL, _crs_col
shl BL, 1 ; BX = col*2
;
mov AL, 160
mov CL, _crs_row
mul CL ; AX = adres wiersza
;
add BX, AX ; BX = offset do ekranu
;
mov AX, 0b000h
mov DS, AX
;
mov AX, [BX]
; AH – attrib
; AL – ASCII
;
IFDEF DEMO ; Clear TRAP flag
push AX
pushf
pop AX
and AX, 0feffh
push AX
popf
pop AX
ENDIF
hRet
hEndp
;——————————————————————
; Write Character and Attribute at Cursor
hProc , , char:BYTE, attrib:BYTE, times:WORD
;
push SI
;
sub DH, DH
mov DL, _crs_col
mov BH, DL
shl DL, 1 ; DX = col*2
;
mov AL, 160
mov BL, _crs_row
mul BL ; AX = adres wiersza
;
add AX, DX
mov DI, AX ; DI = offset do ekranu
;
mov AX, 0b000h
mov ES, AX
;
mov AL, char ;
mov AH, attrib ;
mov SI, AX ; przechować, display_char niszczy AX
mov CX, times
;
cld
;
next_dsp_9:
mov AX, SI
stosw ; mov AX, ES:[DI], DI+=2
; AH – attrib
; AL – ASCII
;
push SI ; attrib + ASCII
mov DL, BH
push DX ; col
push BX ; row
CALL _display_char ;( BL, BH, AX)
add SP, 6
;
inc BH ; col++
cmp BH, 80
jb same_row_9
mov BH, 0 ; col=0;
inc BL ; row++
same_row_9:
LOOP next_dsp_9
;
pop SI
;
hRet
hEndp
;——————————————————————
;——————————————————————
hProc , ;/* SECURITY */
;
mov DX, [_sum1]
mov BX, OFFSET _user_name
mov AH, 0
mov CX, USER_NAME_LENGTH
next_sum1:
mov AL, [BX]
add DX, AX
inc BX
loop next_sum1
;
xchg AX, DX
;
hRet
hEndp
;——————————————————————
;——————————————————————
; Write Character at Cursor
hProc , , ascii:BYTE, times:WORD
;
sub DH, DH
mov DL, _crs_col
mov BH, DL
shl DL, 1 ; DX = col*2
;
mov AL, 160
mov BL, _crs_row
mul BL ; AX = adres wiersza
;
add AX, DX
mov DI, AX ; DI = offset do ekranu
;
mov AX, 0b000h
mov ES, AX
;
mov DL, ascii ; DL – ascii
mov CX, times
;
cld
;
next_dsp_a:
;
mov AX, ES:[DI] ; AH – attrib, AL – ASCII
mov AL, DL ; ascii do wypisanie
;
stosw ; mov AX, ES:[DI], DI+=2
;
push AX ; attrib + ASCII
mov AL, BH
push AX ; col
push BX ; row
CALL _display_char ;( BL, BH, AX)
add SP, 6
;
inc BH ; col++
cmp BH, 80
jb same_row_a
mov BH, 0 ; col=0;
inc BL ; row++
same_row_a:
LOOP next_dsp_a
;
hRet
hEndp
;——————————————————————
; Write Character in TTY Mode
hProc , , ascii:BYTE
hRet
hEndp
;——————————————————————
;——————————————————————
hProc , , src_addr:WORD, dst_addr:WORD, llength:WORD
;
mov AX, 0b000h
mov DS, AX
mov SI, src_addr
mov ES, AX
mov DI, dst_addr
;
mov CX, llength
cld
rep movsw
;
hRet
hEndp
;——————————————————————
hProc , , dst_addr:WORD, llength:WORD, filler:WORD
;
mov AX, 0b000h
mov ES, AX
mov DI, dst_addr
;
mov AX, filler
mov AL, ‚ ‚
mov CX, llength
cld
rep stosw
;
hRet
hEndp
;——————————————————————
;——————————————————————
; sumuje dla podanego fontu bajty drugiego jego znaku
; do sprawdzenia, czy font był zdefiniowany wewnątrz programu
; jeżeli nie (suma == 0): to program sam musi go zdefiniwać
hProc , , addr:WORD
;
mov SI, addr
add SI, CHAR_HEIGHT
;
sub BX, BX
cld
mov CX, 7
;
test_next:
lodsw
add BX, AX
loop test_next
;
mov AX, BX
;
hRet
hEndp
;——————————————————————
hProc
; BX – ascii+attrib
; CX – licznik znaków
; DX –
; ES:DI – b000 – text
;
sti
;
push ES
push DI
push BX
push CX
push DX
;
cld
;
mov AX, 0b000h
mov ES, AX
mov DI, 0
;
mov CX, 0
next_pair:
;
mov BX, ES:[DI]
inc DI
inc DI
mov AX, CX
mov DL, 80
div DL
; AH-col, AL, row
mov DL, AH ; col
push BX
push DX
push AX
CALL _display_char
add SP, 6
;
inc CX
cmp CX, 2000
jb next_pair
;
;
pop DX
pop CX
pop BX
pop DI
pop ES
;
hRet
hEndp
;——————————————————————
hProc
;DS:SI – tablica fontów
;DS:BX – tablica adresow poczatkow wierszy –> BP
;ES:DI – b800:, DI – col
; CL – row
;
push ES
push DI
push DS
push SI
push DX
push CX
push BX
push AX
push BP
;
;—————————————————>
;
; wpisac adres dla ekranu graficznego DI=CX==col
sub CH, CH
mov CL, _crs_col
; shl CL,1 ; *2
mov DI, CX
;
;—————————————————>
; obliczenie adresu znaku na ekranie
mov AX, 0b000h
mov ES, AX
;
mov AL, 160
mul _crs_row ; AX=row*160
;
mov BX, AX ; BX=row*160
add BX, CX ; BX= BX + col
add BX, CX
;
; wczytanie znaku z ekranu
mov BX, ES:[BX] ; asc, attr
;
mov AX, CHAR_HEIGHT
mul BL ; ascii
;
;—————————————————>
;
mov BL, BH ; kopia
and BL, 70h
cmp BL, 70h
je char_reversed
mov CL, 0ffh
jmp short cl_selected
char_reversed:
sub CL, CL ; CL==0 znak w rewersji ==> cursor normalny
cl_selected:
;
mov SI, OFFSET _font_tbl_norm
add SI, AX
;
;—————————————————>
; obliczyc poczatek tablicy adresow dla podanego wiersza
; BEGROWS ma po 2 bajty – WORD
mov AX, CHAR_HEIGHT*2
mov BL, _crs_row
mul BL
mov BP, OFFSET DS:beg_rows
add BP, AX
;
; mov BP, OFFSET DS:beg_rows
; mov AL, _crs_row
; add AL, AL
; sub AH, AH
; add BP, AX
;
;—————————————————>
;
; adres segmentu ekranu graficznego
mov DX, 0b800h
mov ES, DX
;
;—————————————————>
;
mov DH, _crs_top
mov DL, _crs_bot
;
;—————————————————>
cld
;—————————–*
;—————————–*
lodsb ; tablica fontów
mov BX, DS:[BP] ; beg rows
cmp DH, 0
ja no_crs_00
cmp DL, 0
jb no_crs_00
xor AL, CL ; CL==0 nic, CL=ff reversja
; not AL
no_crs_00:
mov ES:[BX+DI], AL
inc BP
inc BP
;
;—————————–*
lodsb
mov BX, DS:[BP]
cmp DH, 1
ja no_crs_01
cmp DL, 1
jb no_crs_01
xor AL, CL
no_crs_01:
mov ES:[BX+DI], AL
inc BP
inc BP
;
;—————————–*
lodsb
mov BX, DS:[BP]
cmp DH, 2
ja no_crs_02
cmp DL, 2
jb no_crs_02
xor AL, CL
no_crs_02:
mov ES:[BX+DI], AL
inc BP
inc BP
;
;—————————–*
lodsb
mov BX, DS:[BP]
cmp DH, 3
ja no_crs_03
cmp DL, 3
jb no_crs_03
xor AL, CL
no_crs_03:
mov ES:[BX+DI], AL
inc BP
inc BP
;
;—————————–*
lodsb
mov BX, DS:[BP]
cmp DH, 4
ja no_crs_04
cmp DL, 4
jb no_crs_04
xor AL, CL
no_crs_04:
mov ES:[BX+DI], AL
inc BP
inc BP
;
;—————————–*
lodsb
mov BX, DS:[BP]
cmp DH, 5
ja no_crs_05
cmp DL, 5
jb no_crs_05
xor AL, CL
no_crs_05:
mov ES:[BX+DI], AL
inc BP
inc BP
;
;—————————–*
lodsb
mov BX, DS:[BP]
cmp DH, 6
ja no_crs_06
cmp DL, 6
jb no_crs_06
xor AL, CL
no_crs_06:
mov ES:[BX+DI], AL
inc BP
inc BP
;
;—————————–*
lodsb
mov BX, DS:[BP]
cmp DH, 7
ja no_crs_07
cmp DL, 7
jb no_crs_07
xor AL, CL
no_crs_07:
mov ES:[BX+DI], AL
inc BP
inc BP
;
;—————————–*
lodsb
mov BX, DS:[BP]
cmp DH, 8
ja no_crs_08
cmp DL, 8
jb no_crs_08
xor AL, CL
no_crs_08:
mov ES:[BX+DI], AL
inc BP
inc BP
;
;—————————–*
lodsb
mov BX, DS:[BP]
cmp DH, 9
ja no_crs_09
cmp DL, 9
jb no_crs_09
xor AL, CL
no_crs_09:
mov ES:[BX+DI], AL
inc BP
inc BP
;
;—————————–*
lodsb
mov BX, DS:[BP]
cmp DH, 0ah
ja no_crs_0a
cmp DL, 0ah
jb no_crs_0a
xor AL, CL
no_crs_0a:
mov ES:[BX+DI], AL
inc BP
inc BP
;
;—————————–*
lodsb
mov BX, DS:[BP]
cmp DH, 0bh
ja no_crs_0b
cmp DL, 0bh
jb no_crs_0b
xor AL, CL
no_crs_0b:
mov ES:[BX+DI], AL
inc BP
inc BP
;
;—————————–*
lodsb
mov BX, DS:[BP]
cmp DH, 0ch
ja no_crs_0c
cmp DL, 0ch
jb no_crs_0c
xor AL, CL
no_crs_0c:
mov ES:[BX+DI], AL
inc BP
inc BP
;
;—————————–*
lodsb
mov BX, DS:[BP]
cmp DH, 0dh
ja no_crs_0d
cmp DL, 0dh
jb no_crs_0d
xor AL, CL
no_crs_0d:
mov ES:[BX+DI], AL
; inc BP
; inc BP
;—————————–*
;
pop BP
pop AX
pop BX
pop CX
pop DX
pop SI
pop DS
pop DI
pop ES
;
hRet
hEndp
;——————————————————————
hProc ,
;ES:DI – b000:, DI – col
;
mov AX, 0b000h
mov ES, AX
;
sub BH, BH
mov BL, _crs_col
shl BL, 1 ; BX = col*2
;
mov AL, 160
mov DL, _crs_row
mul DL ; AX = adres wiersza
;
add BX, AX
;
mov AX, ES:[BX]
; AH – attrib
; AL – ASCII
;
push AX ; attrib + ASCII
mov AL, _crs_col
push AX ; col
mov AL, _crs_row
push AX
CALL _display_char ;( BL, BH, AX)
add SP, 6
;
hRet
hEndp
;——————————————————————
;——————————————————————
hProc , , row:BYTE, col:BYTE
;ES:BX – b000:
;
;
;—————————————————>
;
; wpisac adres dla ekranu graficznego CX==col
sub CH, CH
mov CL, col
;
;—————————————————>
; obliczenie adresu znaku na ekranie
mov AX, 0b000h
mov ES, AX
;
mov AL, 160
mul row ; AX=row*160
;
mov BX, AX ; BX=row*160
add BX, CX ; BX= BX + col
add BX, CX
;
; wczytanie znaku z ekranu
mov AX, ES:[BX] ; attr, asc
;
hRet
hEndp
;——————————————————————
;——————————————————————
hProc , ;/* SECURITY */
;
mov CX, (USER_NAME_LENGTH/2)
mov DX, WORD PTR [_passwd+OFFSET_KEY] ; kod dekodowania
mov BX, OFFSET _user_name
;
next_decode:
mov AX, [BX]
xor AX, DX
mov [BX], AX
inc BX
inc BX
loop next_decode
;
hRet
hEndp
;——————————————————————
;——————————————————————
;——————————————————————
hProc , , row:BYTE, col:BYTE, ascii:WORD
;DS:SI – tablica fontów
;ES:DI – b800:, DI – col
; CL – row
;
cld
;
mov AX, DS
mov ES, AX
;
; kopiowanie znaku do display_buffer
mov BX, ascii
mov DI, OFFSET _display_buffer
mov SI, OFFSET _font_tbl_norm
;
;
mov AX, CHAR_HEIGHT
mul BL ; ascii
add SI, AX
mov CX, CHAR_HEIGHT/2 ; kopiowanie słowami
rep movsw
;
mov CH, BH ; kopia do sprawdzeń – BX jest do czego innego
;
mov SI, OFFSET _display_buffer
;————————————-*
; test CH, 88h
; jz not_blink_bold
;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
; mov BX, SI
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
;****************
test CH, 08h
jz not__bold
;**BOLD
mov BX, SI
;0
mov AX, [BX]
shr AH, 1
shr AL, 1
or [BX], AX
inc BX
inc BX
;1
mov AX, [BX]
shr AH, 1
shr AL, 1
or [BX], AX
inc BX
inc BX
;2
mov AX, [BX]
shr AH, 1
shr AL, 1
or [BX], AX
inc BX
inc BX
;3
mov AX, [BX]
shr AH, 1
shr AL, 1
or [BX], AX
inc BX
inc BX
;4
mov AX, [BX]
shr AH, 1
shr AL, 1
or [BX], AX
inc BX
inc BX
;5
mov AX, [BX]
shr AH, 1
shr AL, 1
or [BX], AX
inc BX
inc BX
;6
mov AX, [BX]
shr AH, 1
shr AL, 1
or [BX], AX
inc BX
inc BX
;7
mov AX, [BX]
shr AH, 1
shr AL, 1
or [BX], AX
; inc BX
; inc BX
;**
not__bold: ;======================
test CH, 80h
jz not__blink
mov BX, SI
;**BLINK
IFNDEF CLIPPER
;0
mov AX, [BX]
mov CL, 3
shr AL, CL
mov CL, 2
shr AH, CL
mov [BX], AX
inc BX
inc BX
;1
mov AX, [BX]
mov CL, 2
shr AL, CL
mov CL, 1
shr AH, CL
mov [BX], AX
inc BX
inc BX
;2
mov AX, [BX]
mov CL, 1
shr AL, CL
mov CL, 0
shr AH, CL
mov [BX], AX
inc BX
inc BX
;3
inc BX
inc BX
;4
mov AX, [BX]
mov CL, 0
shl AL, CL
mov CL, 1
shl AH, CL
mov [BX], AX
inc BX
inc BX
;5
mov AX, [BX]
mov CL, 1
shl AL, CL
mov CL, 2
shl AH, CL
mov [BX], AX
inc BX
inc BX
;6
; mov AX, [BX]
mov AX, [BX]
mov CL, 2
shl AL, CL
mov CL, 3
shl AH, CL
mov [BX], AX
; inc BX
; inc BX
;
ELSE
; Clipper – specjalne
mov AX, [SI]
not AX
mov [SI], AX
;
mov AX, [SI+12]
not AX
mov [SI+12], AX
; gdy ENH, to nie underl
jmp short not_underl
;
ENDIF
;**
not__blink: ;======================

;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
;not_blink_bold:
;————————————-*
mov CL, CH ; odtworzenie atrybutów
and CL, 77h
cmp CL, 01h ; underl
jne not_underl
;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
; UNDERL
;6
mov AL, [SI+13]
not AL
mov [SI+13], AL
;
not_underl:
;————————————-*
mov CL, CH ; odtworzenie atrybutów
and CL, 77h
cmp CL, 70h
jne not_reversed
;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
mov BX, SI
; REVERSE
;0
mov AX, [BX]
not AX
mov [BX], AX
inc BX
inc BX
;1
mov AX, [BX]
not AX
mov [BX], AX
inc BX
inc BX
;2
mov AX, [BX]
not AX
mov [BX], AX
inc BX
inc BX
;3
mov AX, [BX]
not AX
mov [BX], AX
inc BX
inc BX
;4
mov AX, [BX]
not AX
mov [BX], AX
inc BX
inc BX
;5
mov AX, [BX]
not AX
mov [BX], AX
inc BX
inc BX
;6
mov AX, [BX]
not AX
mov [BX], AX
; inc BX
; inc BX
;——————————–*
not_reversed:
test CH, 77h
jnz not_blank
;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
mov BX, SI
; BLANK
sub AX, AX
;0
mov [BX], AX
inc BX
inc BX
;1
mov [BX], AX
inc BX
inc BX
;2
mov [BX], AX
inc BX
inc BX
;3
mov [BX], AX
inc BX
inc BX
;4
mov [BX], AX
inc BX
inc BX
;5
mov [BX], AX
inc BX
inc BX
;6
mov [BX], AX
; inc BX
; inc BX
not_blank:
;————————————-*
; ładowanie rejestru ES:DI
mov CL, row
mov AL, col
cbw
mov DI, AX
;
mov AX, 0b800h
mov ES, AX
;————————————-*
;
mov DX, 2000h ; dla przyśpieszenia wykonania
;
; DS:SI — display_buffer
;
;
row_0:
cmp CL, 0
jne row_1
mov BX, 0000h
jmp display_even
row_1:
cmp CL, 1
jne row_2
mov BX, 40f0h
jmp display_odd
row_2:
cmp CL, 2
jne row_3
mov BX, 0230h
jmp display_even
row_3:
cmp CL, 3
jne row_4
mov BX, 4320h
jmp display_odd
row_4:
cmp CL, 4
jne row_5
mov BX, 0460h
jmp display_even
row_5:
cmp CL, 5
jne row_6
mov BX, 4550h
jmp display_odd
row_6:
cmp CL, 6
jne row_7
mov BX, 0690h
jmp display_even
row_7:
cmp CL, 7
jne row_8
mov BX, 4780h
jmp display_odd
row_8:
cmp CL, 8
jne row_9
mov BX, 08c0h
jmp display_even
row_9:
cmp CL, 9
jne row_10
mov BX, 49b0h
jmp display_odd
row_10:
cmp CL, 10
jne row_11
mov BX, 0af0h
jmp display_even
row_11:
cmp CL, 11
jne row_12
mov BX, 4be0h
jmp display_odd
row_12:
cmp CL, 12
jne row_13
mov BX, 0d20h
jmp display_even
row_13:
cmp CL, 13
jne row_14
mov BX, 4e10h
jmp display_odd
row_14:
cmp CL, 14
jne row_15
mov BX, 0f50h
jmp display_even
row_15:
cmp CL, 15
jne row_16
mov BX, 5040h
jmp display_odd
row_16:
cmp CL, 16
jne row_17
mov BX, 1180h
jmp display_even
row_17:
cmp CL, 17
jne row_18
mov BX, 5270h
jmp display_odd
row_18:
cmp CL, 18
jne row_19
mov BX, 13b0h
jmp display_even
row_19:
cmp CL, 19
jne row_20
mov BX, 54a0h
jmp display_odd
row_20:
cmp CL, 20
jne row_21
mov BX, 15e0h
jmp display_even
row_21:
cmp CL, 21
jne row_22
mov BX, 56d0h
jmp display_odd
row_22:
cmp CL, 22
jne row_23
mov BX, 1810h
jmp display_even
row_23:
cmp CL, 23
jne row_24
mov BX, 5900h
jmp display_odd
row_24:
cmp CL, 24
jne row_25
mov BX, 1a40h
jmp display_even
row_25:
hRet
;=================================================================
; DI – col
; BX – współczynnik
; CX – 7fffh – dla przyśpieszenia wykonania
;=================================================================
display_even:
;
mov CX, 7fffh
;
lodsb ; [0]
mov ES:[BX+DI], AL
add BX, DX
and BX, CX
;
lodsb ; [1]
mov ES:[BX+DI], AL
add BX, DX
and BX, CX
;
lodsb ; [2]
mov ES:[BX+DI], AL
add BX, DX
and BX, CX
;
lodsb ; [3]
mov ES:[BX+DI], AL
add BX, DX
and BX, CX
;
lodsb ; [4]
add BX, 50h ;++
mov ES:[BX+DI], AL
add BX, DX
and BX, CX
;
lodsb ; [5]
mov ES:[BX+DI], AL
add BX, DX
and BX, CX
;
lodsb ; [6]
mov ES:[BX+DI], AL
add BX, DX
and BX, CX
;
lodsb ; [7]
mov ES:[BX+DI], AL
add BX, DX
and BX, CX
;
lodsb ; [8]
add BX, 50h ;++
mov ES:[BX+DI], AL
add BX, DX
and BX, CX
;
lodsb ; [9]
mov ES:[BX+DI], AL
add BX, DX
and BX, CX
;
lodsb ; [10]
mov ES:[BX+DI], AL
add BX, DX
and BX, CX
;
lodsb ; [11]
mov ES:[BX+DI], AL
add BX, DX
and BX, CX
;
lodsb ; [12]
add BX, 50h ;++
mov ES:[BX+DI], AL
add BX, DX
and BX, CX
;
lodsb ; [13]
mov ES:[BX+DI], AL
; add BX, DX
; and BX, CX
hRet
;=================================================================
display_odd:
;
mov CX, 7fffh
;
lodsb ; [0]
mov ES:[BX+DI], AL
add BX, DX
and BX, CX
;
lodsb ; [1]
mov ES:[BX+DI], AL
add BX, DX
and BX, CX
;
lodsb ; [2]
add BX, 50h ;++
mov ES:[BX+DI], AL
add BX, DX
and BX, CX
;
lodsb ; [3]
mov ES:[BX+DI], AL
add BX, DX
and BX, CX
;
lodsb ; [4]
mov ES:[BX+DI], AL
add BX, DX
and BX, CX
;
lodsb ; [5]
mov ES:[BX+DI], AL
add BX, DX
and BX, CX
;
lodsb ; [6]
add BX, 50h ;++
mov ES:[BX+DI], AL
add BX, DX
and BX, CX
;
lodsb ; [7]
mov ES:[BX+DI], AL
add BX, DX
and BX, CX
;
lodsb ; [8]
mov ES:[BX+DI], AL
add BX, DX
and BX, CX
;
lodsb ; [9]
mov ES:[BX+DI], AL
add BX, DX
and BX, CX
;
lodsb ; [10]
add BX, 50h ;++
mov ES:[BX+DI], AL
add BX, DX
and BX, CX
;
lodsb ; [11]
mov ES:[BX+DI], AL
add BX, DX
and BX, CX
;
lodsb ; [12]
mov ES:[BX+DI], AL
add BX, DX
and BX, CX
;
lodsb ; [13]
mov ES:[BX+DI], AL
; add BX, DX
; and BX, CX
hRet
;=================================================================
;
hRet
hEndp
;——————————————————————
hProc , , chr:BYTE
;
mov AH, 0Eh
mov AL, chr
mov BX, 0007h
INT 10h
;
hRet
hEndp
;——————————————————————
hProc , , cp:WORD
;
mov BX, WORD PTR cp
jmp SHORT fp_begin
fp_loop:
; INT 29h
push AX
CALL _fast_putchar
pop AX
fp_begin:
mov AL, BYTE PTR [BX]
inc BX
or AL, AL
jnz fp_loop
;
hRet
hEndp
;——————————————————————
; bajt b przekształca do postaci dziesiętnej, i wyświetla
hProc , , b:BYTE
;
sub AH, AH
mov AL, b
sub CX, CX ; licznik znaków
mov BX, 10 ; dzielnik
;
bt_getdigit:
sub DX, DX
div BX ; Remainder is last digit
add DL, ‚0’ ; to ASCII
push DX ; cyfra na stos
inc CX
or AX, AX ; czy już nic nie zostało
jnz bt_getdigit
;
; CL – ilość cyfr
;
bt_putdigit:
CALL _fast_putchar
pop AX ; cyfra ze stosu
; INT 29h
inc BX
loop bt_putdigit
;
hRet
hEndp
;——————————————————————
;——————————————————————
;═══════════════════════════════════════════════════════════════════════
;==================================================================

END

Opublikowano Komputery i Internet | Otagowano , , , , | Dodaj komentarz

Prosty i tani wzmacniaczyk klasy D (YL2020)

Stwierdziłem, że przydał by mi się mały wzmacniacz, służący do okazyjnego słuchania muzyki z komputera.

Po zrobieniu remanentu okazało się, że mam:

  • J-042 (przedwzmacniacz, układ TDA1524A),
  • AVT2489 (wzmacniacz 2×25W, układ TDA8563Q),
  • transformator TST 20/003 (220V/12V 1,67A),
  • rozmaite drobiazgi, jak spory mostek i kondensatory elektrolityczne,
  • tudzież uniwersalne obudowy, w różnym stanie.

 Zasilacz dostał jakiś nieco większy mostek i kondensatory 2×4700µF/25V. Napięcie wyjściowe to ≈20V.

Przedwzmacniacz wymagał nowych potencjometrów, o dłuższych ośkach. Zamiast potencjometru balansu zastosowałem helltrim, przylepiony glutem do płytki. Trymery na wyjściu zostały pominięte, gdyby obniżenie poziomu było potrzebne, lepiej by było zrobić to na wejściu wzmacniacza mocy. Układ został zasilony z 7812.

Stopień mocy niestety się nie sprawdził, charczał jeden kanał – zapewne skutek zbyt wysokiego napięcia zasilania. Powstało pytanie: co dalej? Niepewna w skutkach wymiana IC na inny, czy poszukanie czegoś innego – taniego i o odpowiedniej mocy.

Szukać zacząłem na DX, tam znalazłem YL2020 – przeznaczony do telewizorów, o doskonale pasujących parametrach: moc 20W+20W (szczytowo 35W+35W), zasilanie 12V÷24V, obciążenie 4÷8Ω, zbudowany na układzie TPA3100D2. Kupiłem na Aliexpressie ($6.50 brutto, STIME Electronics Technology Co., Ltd). Układ TPA3100D2 posiada zabezpieczenie zwarciowe i cieplne (to drugie nie jest sygnalizowane przez FAULT), i – niestety w tej aplikacji niewykorzystaną – możliwość ustawiania wzmocnienia.

 

Układ, jak widać, to mała płytka, wygodna do zamontowania, z wyprowadzeniami opisanymi i wygodnymi do lutowania. Trzeba tylko przylutować wszystko tam, gdzie należy.

Jeżeli nie korzysta się z MUTE, to należy połączyć ze sobą FAULT i MUTE – spowoduje to wyciszanie wzmacniacza przy błędach.

Aby włączyć MUTE trzeba go podłączyć do dodatniego napięcia zasilania VCC (Wystarczy mniejsze, ale tak jest najprościej).

Wejście SD to !SHUTDOWN, nie trzeba podłączać, nie należy go też wykorzystywać jako Mute, bo użycie go powoduje łomoty w głośnikach.

Przy uruchomieniu jedyną niespodzianką był brak napięcia na jednym z wyjść głośnikowych, wzmacniacz normalnie tam utrzymuje ~½ VCC. Śledzenie doprowadziło do elementu w czerwonym kółku (zapewne dławik), przyciśnięcie go lutownicą rozwiązało problem.

 

 pa-03-of

Jeżeli do wzmacniacza dołącza się głośnik bezpośrednio, krótkimi przewodami, to jego własne filtry wyjściowe są wystarczające. Jeżeli chce się go dołączyć do bardziej odległych kolumn, to trzeba na wyjściu dać filtry dolnoprzepustowe; z jednej strony – by harmoniczne o sporych mocach nie szły w eter, z drugiej – by indukowane w kablach śmieci nie szły do wzmacniacza.

W dokumentacji podane są przykłady, jak taki filtr powinien być zrobiony, dosyć różne dla obciążenia 4Ω i 8Ω. Uznałem, że nie ma się tym co specjalnie przejmować, bo: na kolumnach pisze tylko że pasują do wzmacniaczy 4Ω i 8Ω, a że mają zwrotnice – to przy pytaniu o impedancję należy podawać częstotliwość.

Kluczem są w filtrach indukcyjności: w oryginale są to ekranowane magnetycznie Toko A7503AY-330M (33 μH ±20%, Idc =2,3A, Rdc =115mΩ). Przy szukaniu zamienników należy dbać, by prąd Idc zamienników nie był mniejszy. Ja znalazłem na Allegro tanią ofertę dławików 15 μH, o nieco większym prądzie; opłacalną cenowo przy łączeniu dławików w szereg. Kondensatory w filtrach są ceramiczne, na 50V, oryginalnie to ceramika X7R; dobierałem je tak, by pojemności w obydwu kanałach były podobne.

 

 pa-04-logika

Ponieważ front wzmacniacz miał mieć ładniejszy, dostał 10mm niebieską LEDę jako wskaźnik załączenia, małą czerwoną jako sygnalizator FAIL, oraz duży (niepasujący do nich 😉 ) zielony podświetlany przycisk do MUTE. Logikę zrobiłem na poczwórnym wzmacniaczu operacyjnym TL084, zastosowane tam diody to złącza BC tranzystorów BC337.

Kondensator opóźnienia załączania 22µF okazał się być zbyt mały, teraz jest 470µF (za duży), pewnie 220µF by wystarczyło; ale taki był pod ręką.

Najpoważniejszym zadaniem było takie dobranie oporników do LEDów, by te świeciły – ale nie oświetlały. W sumie – można było dać większe…

Układ nie zapewnia całkowitego wytłumienia dudnienia powstającego przy załączeniu, aby to uzyskać niezbędny by był normalnie zwarty przekaźnik, rozłączany z opóźnieniem, ale to co jest – jest wystarczające.

 

 pa-05-front

 pa-07-back

Obudową jest stara, używana, obudowa uniwersalna (z piwnicy), otwory trzeba było dopasować do już istniejących, wymienić śrubki i pomalować czarnym, błyszczącym lakierem w spreyu.

Układy zostały wykonane na płytkach uniwersalnych, kynarem.

 

 

Wnioski (subiektywne): nie było drogo, gra dobrze, potrafi być zbyt głośny, gdy nie ma muzyki słyszalny jest szum, ale cóż – TDA1524A tak ma.

W każdym razie: Dark Side of the Moon słucha się na tym całkiem dobrze.

 

 pa-06-top

Na obrazku wnętrzności: na przodzie przedwzmacniacz, osłaniająca go blacha aluminiowa to ekran i jednocześnie radiator 7812; na środkowej listwie zasilanie i logika, wejścia i wyjścia podłączone są wtykami; na tylnej ścianie wzmacniacz mocy i filtr wyjściowy.

Kawałek czerwonej taśmy przypomina, który kanał jest lewy.

Obrazka z zamkniętą obudową nie daję, bo blachy okazały się być nieco krzywe, ale, po pomalowaniu, nie wyglądają źle.

 

Przy budowie bardzo się przydał nieodległy sklep elektroniczny Tele-Elektronik Będzin Jasna 6, malutki, ale zaskakująco dobrze zaopatrzony.

Uwaga końcowa: Przylepiłem do IS kawałek radiatora, bo chyba załączało mi się ograniczenie cieplne.

Tekst został opublikowany na Elektrodzie: Elektrodzie

Modyfikacja

Dodałem moduł barwy dźwięku z LM1036 z Aliexpress. Trzeba było tylko wylutować mostek, połączyć kynarem właściwe miejsca.  Okazało się też, że z braku miejsca musiałem wylutować pierwotny elektrolit 4m7/25.

Przy pierwszym uruchomieniu myślałem, że nie działa – nic nie szumi.

W układzie kontur domyślnie jest włączony – efekt jest znakomity.

Poniżej płytka z opisanymi wejściami i wyjściami.

Opublikowano Elektronika | Otagowano , | Dodaj komentarz

Stycznik do czujnika ruchu

Zrobiłem lampę do przedpokoju:
– klosz matowy (z poprzednich wpisów wiadomo dlaczego),
– czujnik ruchu mikrofalowy (żeby mógł być wewnątrz obudowy),
– 2 moduły LED 10W (żeby przy awarii nie trzeba się był śpieszyć).
Czujnik był wygodny, z czterema wyprowadzeniami, przeznaczony do obsługi oświetlenia LED (czytaj: przetwornicy z prostownikiem i kondensatorem). Działało to bardzo ładnie, wykrywając także obecność osoby za drewnianym drzwiami ;), aż przestało gasnąć. Słychać było, że przekaźnik wykonawczy próbuje działać, najwyraźniej styki się skleiły.
Więc rozbiórka, przekaźnik, według dokumentacji, przeznaczony na obciążenia czysto rezystancyjne, więc co się dziwić… Zamiennik na Allegro był (RM50-3011-85-1009; ecoelektryk), wymiana szczęśliwie się udała (szczęśliwie, bo płytka wielowarstwowa…), ale co z przyszłością?
Postanowiłem dołożyć dodatkowy pośredniczący przekaźnik, na 230V (RM84-2012-35-5230, czerwonybonzaj), na wszelki wypadek w podstawce.

Schemat montażowy 😉

 

Wszystko zostało zlutowane na kawałku płytki uniwersalnej, miedź między kontaktami została zeszlifowana, całość została pokryta glutem dla izolacji i zabezpieczenia.

A tak to wygląda od podstawki.

 

 

Sama lampa: na samym dole czujnik mikrofalowy, wyżej dwa radiatory LED, na szczycie pionowo dwa zasilacze LED, między nimi, przekaźnikiem w dół stycznik. (Widoczne czerwone ślady to krew 🙂 )

Opublikowano Elektronika | Otagowano , , | Dodaj komentarz

ReplayGain w praktyce

Od dosyć dawna zbieram stare wideoklipy z ulubioną muzyką; źródła są różne: YT, samodzielne konwersje, i inne takie.

Zestandaryzowałem je, ujednolicając nazwy i konwertując format na MKV. Zrobiłem wyspecjalizowane odtwarzacze do ich grania; jeden wykorzystuje VLC, drugi MediaElement.

(Jak ktoś ciekaw, to można to jeszcze obejrzeć tu)

Mam utworzone różne kolekcje i zestawienia klipów do oglądania i słuchania. Ale – jest problem. Poziom głośności bywa dla poszczególnych klipów bardzo różny, co uniewygodnia przyjemność, zmuszając do czuwania przy gałce wzmacniacza.
Rozwiązaniem jest wykorzystanie przy odtwarzaniu informacji ReplayGain z odtwarzanego pliku do korygowania głośności. Ale, po pierwsze, ReplayGain w moich plikach nie ma…

Więc, jak dodać ReplayGain do videoklipu w formacie MKV?
Proste – Foobar2000 to zrobi 🙂

rgfoobar1

rgfoobar2

A teraz pytanie – jak to odczytać w programie?
Dodawać obcej biblioteki nie chciałem, samodzielne parsowanie struktury pliku Matroska nie wyglądało zachęcająco – sporo pracy dla jednej informacji…
Więc – brute force; wczytanie 1500 B od końca pliku i szukanie tam ciągu znaków. Potem okazało się, że w niewielu przypadkach ReplayGain występuje na początku pliku; więc tam ewentualnie też.

 

Teraz odtwarzanie: player wykorzystujący VLC ma zakres regulacji głośności to 0…200 (lepiej), MediaElement ma zakres 0.0…1.0.
Wyrażenia przeliczające ReplayGain na wzmocnienie są proste – zwykłe mnożenie przez współczynnik.
(Możliwe, że nie powinno być tak prosto, ale nie mam żadnej koncepcji jak powinno się to liczyć…)

Współczynnik trzeba było dobrać empirycznie, teraz dla VLC=5.0, dla MediaElement=0.05.
Na słuch sprawuje się to całkiem dobrze 🙂

 

Wyliczenie wzmocnienia dla podanego ReplayGain, dla MediaElement:


     // stałe z VLC podzielone przez 200
        public static double DefaultLevel
        {
            get { return 0.5; }
        }
        //
        public static double MaxLevel
        {
            get { return 1.0; }
        }
        //
        public static double MinLevel
        {
            get { return 0.1; }
        }
        //
        private static double rgc = 1.0;
        public static double ReplayGainCoefficient
        {
            get { return rgc; }
            set { rgc = value; }
        }
        //
        public static double CalculateLevelAndReplayGain(double replayGain)
        {
            return Math.Min(Math.Max(MinLevel, DefaultLevel + (rgc * replayGain)), MaxLevel);
        }

A tak wygląda szukanie w pliku:


  public class ReplayGain
    {
        //
        //
        //REPLAYGAIN_GAIND‡€
        private static byte [] RG = { 0x52, 0x45, 0x50, 0x4C, 0x41, 0x59, 0x47, 0x41, 0x49, 0x4E, 0x5F, 0x47, 0x41, 0x49, 0x4E, 0x44, 0x87, 0x88 };
        // Uwaga: ostatnie dwa bajty bywają różne

        //REPLAYGAIN_PEAKD‡€
        private static byte[] RP = { 0x52, 0x45, 0x50, 0x4C, 0x41, 0x59, 0x47, 0x41, 0x49, 0x4E, 0x5F, 0x50, 0x45, 0x41, 0x4B, 0x44, 0x87, 0x88 };


        private static bool findGainInBuffer(byte[] bb, out double gainValue)
        {
            bool gainFound = false;
            //
            bool tagFound = false;
            int tagBegin = 0;
            for (int n = 0; n < (bb.Length - RG.Length); n++)
            {
                    if (RG[0] == bb[n + 0] && RG[1] == bb[n + 1] && RG[2] == bb[n + 2] && RG[3] == bb[n + 3] && RG[4] == bb[n + 4] && RG[5] == bb[n + 5] && RG[6] == bb[n + 6] && RG[7] == bb[n + 7] && RG[8] == bb[n + 8] && RG[9] == bb[n + 9] && RG[10] == bb[n + 10] && RG[11] == bb[n + 11] && RG[12] == bb[n + 12] && RG[13] == bb[n + 13] && RG[14] == bb[n + 14] && RG[15] == bb[n + 15] && RG[16] == bb[n + 16])
                {
                    tagFound = true;
                    tagBegin = n;
                    break;

                }
            }
            //
            if (!tagFound)
            {
                gainValue = 0.0;
                return false;
            }
            //
            //
            int gainBegin = tagBegin + RG.Length;
            string gainValueString = "";
            gainValue = 0.0;
            //
            for (int j = gainBegin; j < bb.Length - RG.Length; j++)
            {
                char c = (char)bb[j];
                if (char.IsDigit(c) || '-' == c || '+' == c || '.' == c)
                {
                    gainValueString += c;
                }
                else
                {
                    gainValue = double.Parse(gainValueString, System.Globalization.CultureInfo.InvariantCulture);
                    gainFound = true;
                    break;
                }
            }
            //
            return gainFound;
        }
        //

Opublikowano Komputery i Internet, Uncategorized | Otagowano , , , , , | Dodaj komentarz

Jak zrobić klip video z nagrania audio

Jak zrobić? (Dlaczego? Miałem ściągnięte z YT ‘First Last and Always’ o nader nędznej jakości, chciałem lepsze.)
Czyli – jak połączyć obrazek ze ścieżką dźwiękową? Są do tego programy, niektóre nawet płatne  🙂
Ale najłatwiej to zrobić używając ffmpeg.
A tutaj batch, który to robi:
– wybiera ostatni obrazek w katalogu,
– konwertuje wszystkie pliki audio w katalogu.
Ciekawostką jest to, że jeżeli obrazek jest w formacie PNG to Filmy i TV go nie wyświetlają 🙂

@ECHO OFF
SET EXE="C:\Apps\Bin\ffmpeg.Exe"
SET EXT=mp3
Rem ---
FOR %%a IN (*.jpg) DO SET PIC=%%~dpnxa
Rem ---
IF DEFINED PIC (
ECHO %PIC%
) ELSE (
ECHO *** Image file not found ***
EXIT /B 1
)
Rem ---
FOR %%a IN (*.%EXT%) DO (
%EXE% -hide_banner -loop 1 -i "%PIC%" -i "%%~pa%%~na.%EXT%" -acodec copy -vcodec libx264 -tune stillimage -shortest "%%~pa%%~na.mkv"
)
Rem ---

Do katalogu ze ścieżkami audio kopiujemy obrazek i uruchamiamy batch. Po nieco dłuższej chwili dostajemy wynikowe pliki MKV.

Uwaga konfiguracyjna – tu trzeba wpisać, to co ma się u siebie:

SET EXE="C:\Apps\Bin\ffmpeg.Exe"
SET EXT=mp3
Opublikowano Komputery i Internet | Otagowano , , , | Dodaj komentarz