Autor Wątek: Modyfikacja ROM-u w CPC  (Przeczytany 5480 razy)

ZbyniuR

  • *****
  • Wiadomości: 3333
  • Miejsce pobytu:
    Carlisle w UK
  • CPC AGA PSX
Modyfikacja ROM-u w CPC
« dnia: 2016.02.21, 19:05:38 »
   Przydałby mi się spec od Asemblera Z80 by rozpracować kawałek kodu w ROMie Amstrada.
Chciałbym zmodyfikować OS6128.rom  a konkretnie zmienić znaczenie klawiszy funkcyjnych. I tu nieco wprowadzenia dla tych co nie są Amstradowcami. W CPC można modyfikować mapę klawiatury za pomocą POKE, 80 klawiszy i 3 ich znaczenia w sumie ta mapka ma 240 bajtów i w identycznej postaci jest ROMie jakby ktoś chciał to zmienić trwalej pod Emulatorem. Bułka z masłem i nie z tym mam problem.
   Jednak kody od 128 do 156 przypisane pod jakiś klawisz nie powodują po wciśnięciu pojawienia się tych znaków na ekranie, tylko zamiast nich wyświetla się tzw funkcja, czyli po prostu ciąg znaków przypisanych do tego kodu. Domyślnie po resecie 13 z tych 32 kodów jest zdefiniowana jako 10 cyfr od 0 do 9, (czyli w tym przypadku ciąg znaków ma po 1 bajcie długości). następne 2 to kropka i kod 13 [cr] czyli Enter, oraz jedyny dłuższy ciąg ułatwiający uruchamianie plików czyli  RUN" +[cr]. Pozostałe ciągi są puste.
   W pamięci RAM te ciągi są zapisane dość przejrzyście co widać na obrazku pierwszym od adresu &B590, czyli 1 bajt określa długość ciągu po czym następuje ten ciąg znaków, a potem kolejny bajt z długością następnego ciągu. Jeśli ciąg jest pusty to mamy tylko 1 bajt &00 i od razu kolejny kod.  Łatwo to zmienić komendą Basica albo POKE-ami, ale niestety w ROM-ie jest to zapisane w jakiś czarodziejski sposób...
   Jedyne miejsce w ROM gdzie jest wspomniany ten adres &B590 pod którym te ciągi są w RAM, jest na obrazku pod &5B9F, (wczytałem ten 16K ROM do ramu pod &4000), kilkanaście linijek niżej widać 3 ostatnie z tych 13 zdefiniowanych ciągów, w identycznej postaci jak są w RAM czyli bajt długości i ciąg, poznajemy to po słówku RUN który to ciąg kończy się pod &5C45.
   A pomiędzy jest ok 200 bajtów kodu w których przypuszczam że definiuje kody od 128 do 137 jako cyfry (0-9) po czym bierze ostatnie 3 definicje podane jak wspomniałem i przerzuca to do RAMu w chwili resetu. Możliwe że robi to za pomocą procedur z drugiego ROMu z Basiciem albo że nazywa te kody zamiast (128-137) to (0-9) bo Basic uznaje oba sposoby.
   Idealnie by było gdyby tej pętli z cyframi nie było, a wszystkie ciągi były robione tak jak te 3 ostatnie i przechowywane w ROM w identycznej formie jak w RAM, albo przerzucał to do RAM LDIR-em a nie jakimiś odwołaniami do procedur.
   Gdyby ten obszar był z 10 razy mniejszy to bym się przemęczył z tabelką z rozkazami i sam próbował to rozgryźć ale póki co liczę że znajdzie się ktoś chętny do pomocy i bystry. :)

- Jeśli masz w domu światło i wodę, tzn. że masz światłowód. ;)

McArti0

  • ***
  • Wiadomości: 113
Odp: Modyfikacja ROM-u w CPC
« Odpowiedź #1 dnia: 2021.07.28, 06:33:59 »
org #1b98
call #1e75
call #1bf8
ld de,#b590 <------ &b590
ld hl,#0098
call #1c0a

org #1c0a
di
ld a,l   ;<----- A=l=&98
sub #31      A=&98-&31=&67 CY=0
ld a,h      A=H=0
sbc #00      A=0-0-CY=0  CY=0
ret c      return jezeli CY=1 czyli nie
add hl,de    &0098+&b590=&b628
ld (#b62d),hl   poke &b62d,&28 : poke &b62e,&b6
ex de,hl   de=&b628 , hl=&b590
ld (#b62b),hl   poke &b62b,&90 : poke &b62c,&b5

.L_1C1A        ;#####<-powiedzmy ze odtad mozna zmieniac kod na swoj
ld bc,#0a30
;******************************************
      hl=&b590: C=&30=48
.L_1c1d      For b=&A to 1 step -1
ld (hl),#01      poke hl,1
inc hl      hl=hl+1
ld (hl),c   poke hl,C
inc hl      hl=hl+1
inc c      C=C+1
djnz L_1c1d   next
;*************************kod ma 11 bajtow, tworzy 20b tablice
ex de,hl
ld hl,L_1c3c   ;   <dane
ld c,#0a
ldir        ; kopia 10 bajtow z DANE do

ex de,hl
ld b,#13

xor a   A=0

.L_1c31      ; KASOWANIE reszty obszaru RAM 19 bajtow
ld (hl),a
inc hl
djnz L_1c31

          ; zapamietanie w systemie konca bloku ustawien klawiszy
ld (#b62f),hl  poke &b62f,l : poke &b630,h <- hl=&b5c2
ld (#b629),a   poke &b629,0
ret      ;<powrot

.L_1c3c      ;<dane
db #01
db  #2e
db #01
db  #0d   
db #05
db  #52,#55,#4e,#22 ;RUN"
db  #0d        ; enter

^L_1C45    ostatni adres tego bloku programu
           od 1C1A-1C45 (44 bajty) mozna zmienic na swoja proc.
           z obostrzeniami wypelnienia zmiennych systemowych

McArti0

  • ***
  • Wiadomości: 113
Odp: Modyfikacja ROM-u w CPC
« Odpowiedź #2 dnia: 2021.07.28, 17:24:52 »

Za mapą firmwaru:
CPC6128    CPC464   bajty
&B590       &B446     &98 DEF KEY's definition area (for Keys &80 to &9F in sequence):
                                      each definition has either a single byte of &00 if it is unused/unaltered,
                                      or: byte 1: length of definition bytes 2 to x: definition,
                                      either a single key or a string of keys

&B628       &B4DE       1 Byte after end of DEF KEY area
&B629       &B4DF       1                                           <-0
&B62A       &B4E0       1                 
&B62B(C)    &B4E1       2 address of DEF KEY area                   <-&b590
&B62D(E)    &B4E3       2 address of byte after end of DEF KEY area <-&b628
&B62F       &B4E5       1                                           <-&b5(c2) <-adres bajtu po użytym obszarze Key Def Tab
&B630       &B4E6       1                                           <-&(b5)c2 


ROM wypełnia te bajty troche inaczej niż to opisane, używa komórek nie opisanych.

McArti0

  • ***
  • Wiadomości: 113
Odp: Modyfikacja ROM-u w CPC
« Odpowiedź #3 dnia: 2021.07.28, 20:17:52 »
W Romie AMSDOSa od adresu DC00 do DFFF jest "chyba niepotrzebna dziura" o wartościach &FF, bite 1024 bajty. Mam nadzieje, że nie służy to do kasowania sektorów czy czegoś podobnego.  :D

ZbyniuR

  • *****
  • Wiadomości: 3333
  • Miejsce pobytu:
    Carlisle w UK
  • CPC AGA PSX
Odp: Modyfikacja ROM-u w CPC
« Odpowiedź #4 dnia: 2021.07.29, 01:36:22 »
Widzę że się napracowałeś tylko że ja mam ostatnio ważniejsze problemy na głowie i nie mam czasu by nad tym pomyśleć.
- Jeśli masz w domu światło i wodę, tzn. że masz światłowód. ;)

McArti0

  • ***
  • Wiadomości: 113
Odp: Modyfikacja ROM-u w CPC
« Odpowiedź #5 dnia: 2021.08.01, 09:41:18 »
Spoko to nasza zabawa w wolnym czasie. Kuriozalne jest już to, że odpowiedz dostałeś po ponad 5 latach  ;D

A oto gotowiec ...  :D :P 8) :o

OS6128mod.ROM
AMSDOSmod3.ROM

do wypełnienia jest tabelka userKeys w AMSDOSmod3.ROM od adresu &1C00 (w pamięci CPC &DC00)
pod adresem &1C86 (&DC86)  trzeba wpisać długość tabelki w bajtach.

skorzystałem z funkcji bios
&B90F ustawianie romu (w C podajemy nr AMSDOSA 7, a w B dostajemy ustawienie poprzedniego stanu ), i
&B90C powrót do poprzedniego stanu (w A podajemy poprzedni stan)

ZbyniuR

  • *****
  • Wiadomości: 3333
  • Miejsce pobytu:
    Carlisle w UK
  • CPC AGA PSX
Odp: Modyfikacja ROM-u w CPC
« Odpowiedź #6 dnia: 2021.08.01, 12:34:59 »
ŁAŁ - Szacun i dzięki. :)
Muszę poszukać gdzie miałem ten Basic który mi modyfikował te klawisze co chciałem.

Chodziło mi o ułatwienia przy edycji Basica i przy uruchamianiu programów.
Np klawisz TAB przy edycji Basica do niczego sie nie przydaje, a jeśli ktoś grzebie w listingu to często przerywa program listuje go i uruchamia na nowo, dlatego wygodnie jest mieć pod Tab słówko run z enterem (ale bez cudzysa jak jest na enter), Tab+shift to  mode 2:list   a Tab+Shift to  cat

A do uruchamiania plików ze stacji np  run"disc  albo |cpm   co byłoby odpowiednikiem run" który sie sprawdza ale tylko w magnecie. Albo jeszcze fajniej po wpisaniu cat przydałyby sie klawisze z funkcjami do przeskakiwania kursorem do następnej kolumny na widocznej liście plików, oraz klawisz z funkcją która jeśli umieścimy kursor na początku nazwy pliku i go wciśniemy to skopiuje nam nazwę tego pliku i go uruchomi.
Musiałbym znaleźć czas i natchnienie i to potestować.

A z tej kilobajtowej dziury zostało 133 bajty, rozumiem że opis modyfikacji ma zostać. Normalnie CPC pozwala by wszystkie zmodyfikowane funkcje razem nie zajmowały więcej niż 255 znaków, łącznie z tymi bajtami które wskazują długość poszczególnych funkcji. A czy te FF-y formatują, nie sądzę bo puste sektory są wypełniane znaczkiem liścia czyli 229 (&E5). :)

Ech gdyby tak jeszcze dało sie dorobić obrazek powitalny, trzymany w dodatkowym 16K bloczku ROM. W emulcu taki obrazek byłby łatwy do dodania, ale w realnym CPC byłoby to dostępne tylko dla posiadaczy ROM-boxa. I mogłyby powstawać fanowskie obrazki startowe jak do FutureOS-a. :)


« Ostatnia zmiana: 2021.08.01, 12:45:32 wysłana przez ZbyniuR »
- Jeśli masz w domu światło i wodę, tzn. że masz światłowód. ;)

McArti0

  • ***
  • Wiadomości: 113
Odp: Modyfikacja ROM-u w CPC
« Odpowiedź #7 dnia: 2021.08.01, 13:59:53 »
Na wszystkie UserKeys mamy razem 133 bajty tak wygląda w RAM ta tablica. Pozostałe 19 bajtów są zerowe. razem 152 bajty i koniec, ściana. Basic nie pozwala zapełnić nawet tych 19 bajtów.

key 0,space$(105)
Improper argument
key 0,space$(104)
Ready

chodzi mi po głowie wyprowadzenie tej tablicy poza b590. sprawdze czy to działa.

W Amsdosie zostało około 1024-133-1=890 bajtów. 890/8=111 znaków mod2 = 55 mod1 =grafika 5x10 znaków, może troche mniej bo kod kopiujący trzeba tu wcisnąć

ZbyniuR

  • *****
  • Wiadomości: 3333
  • Miejsce pobytu:
    Carlisle w UK
  • CPC AGA PSX
Odp: Modyfikacja ROM-u w CPC
« Odpowiedź #8 dnia: 2021.08.01, 14:44:27 »
Ok mój błąd chyba tylko raz doszedłem do granic tej tablicy jak robiłem klawisze jak w Spectrum by całe Basicowe słówka wyświetlał jednym kliknięciem i starczyło mi na po słówku dla każdego z 26 liter.  Robiłem też kiedyś arabską klawiaturę aby znaki pisały sie od prawej do lewej, to do każdej z 22 liter funkcja dodawała dwie strzałki, ale to było nawet mniej.
Teraz widzę że wszystkie funkcje razem (bez bajtów długości) mogą mieć max 120 bajtów.
Ale spoko to też jest sporo miejsca do popisu. :)

A gdyby chcieć to zwiększać to wpierw trzeba by modyfikować procedury które obsługują te funkcje a potem szukać dla nich miejsca w RAM. Owszem są takie miejsca, (z tych poniżej pamięci obrazu), ale niektóre programy robią z nich użytek, bo to obszary które sie nie kasują przy resecie. Raczej nie ma potrzeby.
- Jeśli masz w domu światło i wodę, tzn. że masz światłowód. ;)

McArti0

  • ***
  • Wiadomości: 113
Odp: Modyfikacja ROM-u w CPC
« Odpowiedź #9 dnia: 2021.08.01, 16:06:10 »
Sprawdziłem.

&b62b,L_adr
&b62c,H_adr

adres tablicy do tych komórek. i mamy 255 znaków na każdy UserKey.

zaniedbujemy komórki adresu bajtu po tabeli. ( b62d(e),  b62f(30) )

co prawda Basic może taką tablice używać, ale ograniczenie na 104 znaki nadal istnieje dla komendy key.

ps. jeżeli w b62d(e) wpiszemy  adres bajtu po tabeli [maks.możliwy zakres] a w b62f(30) adres bajtu po dotychczasowym użyciu. ...

TO DZIAŁA KEY 0,space$(255)  !!!!!!!!!!!!!!!!!!!!!! niema ograniczenia na długość stringu!
« Ostatnia zmiana: 2021.08.01, 16:21:17 wysłana przez McArti0 »

ZbyniuR

  • *****
  • Wiadomości: 3333
  • Miejsce pobytu:
    Carlisle w UK
  • CPC AGA PSX
Odp: Modyfikacja ROM-u w CPC
« Odpowiedź #10 dnia: 2021.08.01, 16:54:51 »
Jeśli po resecie wpiszesz 
for a=0 to 31:key a,"":next
To możesz potem wpisać jedną funkcję o długości 120 bajtów.
Bo standardowo ma ustawione 11ie  1-bajtowych funkcji i jedną 5bajtową, to zostaje 104.

Pewnie jest taki poke który pozwala ustawić więcej funkcji niż 32.
Jest też gdzieś tabelka jak ma reagować na znaki kontrolne, (bodajże po 3 bajty z adresem do procedury w ROM), ale nie pamiętam czy tylko na te co już istnieją czy jest dla wszystkich kodów od 0 do 255.

EDIT:

Jest taka tabelka (w 6128 od &B763), ale tylko do kodów od 0 do 31, czyli tych jak się mają wyświetlać w PRINT, 1 bajt to ile bajtów parametrów potrzebuje, i 2 bajty adres.
A mnie by tu bardziej interesowało jak reaguje na kody kontrolne przypisane do klawiszy takie jak  127-159, 224-225 i 240-255. Bo wśród nich są funkcyjne 128-159). Ale to już nie wiem jak.

« Ostatnia zmiana: 2021.08.01, 17:38:00 wysłana przez ZbyniuR »
- Jeśli masz w domu światło i wodę, tzn. że masz światłowód. ;)

McArti0

  • ***
  • Wiadomości: 113
Odp: Modyfikacja ROM-u w CPC
« Odpowiedź #11 dnia: 2021.08.03, 00:05:19 »
 :o

Grafika ma 800 bajtów. 10x5 znaków Mode1.

zaczyna się w AMSDOSIE od &DCE0. Od DC90 zaczyna się procedura kopiująca.

na dyskietce kod wspomagający wykonanie takiego zdjęcia w pamięci.

wżarliśmy się do LowROM w &66D. wyżarty kod powtarzamy w ramie  od &A000 wraz z odtworzeniem stanu ustawień ROMu.

kod procedur zdjęciujących, można używać dla większych obrazków, procedura dość uniwersalna wyszła.
org #9200
;z pamieci na ekran
ld de,&4000 ;src
;call &9203,src
ld hl,#c000 ;trg

ld c,0
ld b,8
nextL2:
push bc
ld b,5   ;Y bajtow
push hl
nextL:30
push bc
ld bc,20  ;X bajtow
push hl
ex de,hl
ldir
ex de,hl
pop hl
ld c,80
add hl,bc

pop bc
djnz nextL
pop hl
ld bc,2048
add hl,bc
pop bc
djnz nextL2
ret


;z ekranu do pamieci
org #9230
ld de,#4000;trg
;call &9233,trg
ld hl,#c000;src;

ld c,0
ld b,8
nextS2:
push bc
ld b,5   ;Y bajtow
push hl
nextS:
push bc
ld bc,20  ;X bajtow
push hl

ldir

pop hl
ld c,80
add hl,bc

pop bc
djnz nextS
pop hl
ld bc,2048
add hl,bc
pop bc
djnz nextS2
ret

McArti0

  • ***
  • Wiadomości: 113
Odp: Modyfikacja ROM-u w CPC
« Odpowiedź #12 dnia: 2021.08.21, 16:08:00 »
są skróty jak na obrazku DEMO.

AMSDOSmod5.ROM i OS6128mod5.rom

Zmodyfikowana tablica przyporządkowania ASCII do klawiszy w OS6128LowROM. od &1EEF, którą potem Amstrad skopiuje do &B496

ДДДДДДЕДДДДДДДЕДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
     &B496 і &B34C і &50  і Normal Key Table:
           і       і      і Cur U Cur R Cur D f9    f6    f3    Enter f.
           і       і      і Cur L Copy  f7    f8    f5    f1    f2    f0
           і       і      і Clr   [     Ret   ]     f4          \
           і       і      і ^     -     @     p     ;     :     /     .
           і       і      і 0     9     o     i     l     k     m     j
           і       і      і 8     7     u     y     h     j     n     Space
           і       і      і 6     5     r     t     g     f     b     v
           і       і      і 4     3     e     w     s     d     c     x
           і       і      і 1     2     Esc   q     Tab   a     Caps  z
           і       і      і [VT]  [LF]  [BS]  [TAB] Fire2 Fire1       Del
     ДДДДДДЕДДДДДДДЕДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
     &B4E6 і &B39C і &50  і Shifted Key Table:
           і       і      і Cur U Cur R Cur D f9    f6    f3    Enter f.
           і       і      і Cur L Copy  f7    f8    f5    f1    f2    f0
           і       і      і Clr   {     Ret   }     f4          `
           і       і      і њ     =     |     P     +     *     ?     >
           і       і      і _     )     O     I     L     K     M     <
           і       і      і (     '     U     Y     H     J     N     Space
           і       і      і &     %     R     T     G     F     B     V
           і       і      і $     #     E     W     S     D     C     X
           і       і      і !     "     Esc   Q     ->    A     Caps  Z
           і       і      і [VT]  [LF]  [BS]  [TAB] Fire2 Fire1       Del
     ДДДДДДЕДДДДДДДЕДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
     &B536 і &B3EC і &50  і Control Key Table:
           і       і      і Cur U Cur R Cur D f9    f6    f3    Enter f.
           і       і      і Cur L Copy  f7    f8    f5    f1    f2    f0
           і       і      і Clr   (ESC) Ret   (GS)  f4          (FS)
           і       і      і (RS)        (NUL) (DLE)
           і       і      і (US)        (SI)  (HT)  (FF)  (VT)  (CR)
           і       і      і             (NAK) (EM)  (BS)  (LF)  (SO)
           і       і      і             (DC2) (DC4) (BEL) (ACK) (STX) (SYN)
           і       і      і             (ENQ) (ETB) (DC3) (EOT) (ETX) (CAN)
           і       і      і       ~     Esc   (DC1) Ins   (SOH) S-lck (SUB)
           і       і      і                                     Del
     ДДДДДДЕДДДДДДДЕДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД


Procedura obrazka rozszerzona o dekompresor RLE (zamiast 800 bajtów obrazek ma 290)

org #66D
;podmianka w OS6128 LowROM  od &066D
ld c,#07
call #b90f ;Wlaczenie ROMu AMSDOS
push bc
jp #dc90 skok do ROMu.

org #dc90
;############### RLE dekompresor #################
;format
;[1-127*][DN]...[128+(1-127*)][DN1][DN2]....[DNx]...[0]
ld hl,#dd00 ;adres skopresowanego obrazka w mod. ROM.
ld de,#4000 ; miejsce rozpakowania w RAM

NextD:

ld a,(hl)
cp 0

jr z,na_ekran
ld c,a

inc hl
bit 7,c
jp z,rle

res 7,c
ld b,0
ldir

jr nextD

rle:

ld b,c

ld a,(hl)

p1:
ld (de),A
inc de
djnz p1
inc hl
jr nextD

na_ekran:
;-------------------
ld hl,49152+1440+59 ;trg 18*80=1440
ld de,&4000 ;src
ld bc,#0500 ;Y -wysokosc w wierszach znakowych

nextL2:
push bc
ld b,8   
push hl
nextL:
push bc
ld bc,20  ;X=10*2 -szerokosc w bajtach
push hl
ex de,hl
ldir
ex de,hl
pop hl
ld b,8  ;2048
add hl,bc

pop bc
djnz nextL
pop hl
ld c,80
add hl,bc
pop bc
djnz nextL2


ld c,18
ld hl,koniec
ld de,#a000
ldir   ;kopiowanie procedury 'koniec' do pamięci RAM pod &A000

jp #a000   ;skok do procedury koniec w RAM

koniec: ;po skopiowaniu procedura znajduje sie w RAMie od &A000
pop bc ;ustawienie powrotne romu wracamy.
ld a,b
call #b90c

ei         ;procedura wywalona z LowROM teraz funkcjonalnie odtwarzana.
pop HL
call #001E ;standardowe napisy CPC
pop bc
pop hl
jp #0077

McArti0

  • ***
  • Wiadomości: 113
Odp: Modyfikacja ROM-u w CPC
« Odpowiedź #13 dnia: 2021.08.22, 23:45:33 »
No i zupełnie inne podejście wszystko w dodatkowym ROMIE. BEZ MODYFIKACJI wbudowanych ROMów.

pierwszy bajt ROMu w &c000 równy 1 aktywuje go jako background. Potem następuje skok do do &c006 i tu można zacząć dowolną własną procedurę.

tablica Userkeys wraz z ustawieniami systemu od &B590-B630 należy skopiować do &DC00-DCA0

tablica ASCII map Keys od &B496-B585 należy skopiować do &FF10-FFFF

obrazek skompresowany RLE od adresu &DD20

ZbyniuR

  • *****
  • Wiadomości: 3333
  • Miejsce pobytu:
    Carlisle w UK
  • CPC AGA PSX
Odp: Modyfikacja ROM-u w CPC
« Odpowiedź #14 dnia: 2021.08.23, 16:25:23 »
Wiem gdzie w ROMie jest mapa klawiatury, od dawna używam zmodyfikowanej mapy i fonta w emulatorze.
Co do funkcji na klawiszach myślałem np o czymś takim:
KEY 140,STRING$(8,CHR$(224))+CHR$(250)+"run"+CHR$(34)+CHR$(13)
Teraz tylko po cat najeżdżasz kursorem na 1szy znak nazwy pliku i wciskasz ctrl+enter a plik sie uruchamia.
To jest dla stacji tym czym run" jest dla taśmy. Choć może lepiej byłoby przypisać to na shift+enter (można by to jednym palcem włączać), a ten oryginalny taśmowy run" zostawić. Do kompletu na ctrl ze strzałkami <- i -> dodać kody które przeskakują kursorem o całą kolumnę na wyświetlanym katalogu, co by łatwiej trafić w pierwszy znak nazwy pliku w sąsiednich kolumnach. :)

Nie czaję na czym polega ta kompresja obrazka. Jaki duży może być ten obrazek w osobnym ROMie, jaką metodą go skompresować i jak wyświetlić?
- Jeśli masz w domu światło i wodę, tzn. że masz światłowód. ;)