Aktualności: C64 Power - online od stycznia 2000 !

Autor Wątek: Przeniesienie informacji o jednym zapalonym bicie z zmiennej na inna zmienna  (Przeczytany 1284 razy)

0 użytkowników i 1 Gość przegląda ten wątek.

Offline siudym

  • Level 1
  • *
  • Wiadomości: 29
Mam pierwsza zmienna, ktora bedzie zapalac co jakis czas jeden dowolny bit, przykladowo na poczatku zapalam bit0:

LDA temp
ORA #%00000001
STA temp

teraz musze ten bit i tylko ten przekopiowac do innej zmiennej, robie to tak:

lda temp
ora temp
sta magazyn


i w zmiennej magazyn mam bit0 przeniesiony jako zapalony, tylko czy sta zapisalo jedynie bit0 pomijajac wszystkie inne?. Zmienna temp bedzie miala wiele razy jeszcze zapalane inne bity, czy jak np. zapale ponownie jakis bit zmiennej temp np. bit2:

LDA temp
ORA #%00000100
STA temp

i znowu chce przeniesc zapalony bit2 do magazyn:

lda temp
ora temp
sta magazyn

to w magazyn teraz bedzie #%00000101 czyli poprzednio przeniesiony zapalony bit0 pozostanie razem z obecnie przeniesionym bit2 ?

« Ostatnia zmiana: 15 Maja 2019, 08:21 wysłana przez siudym »



Offline siudym

  • Level 1
  • *
  • Wiadomości: 29
EDIT: Ok widze, ze jednak STA magazyn za drugim razem zapisuje calosc bitow, wiec jak najpierw przenosilem z temp #%00000001 a drugi raz temp mialo #%00000100, to poprzednio przeniesiony zapalony bit0 zostal zgaszony (chodzi o to, aby na koncu w zmiennej magazyn bylo 00000101 itd gdy bede przenosil i magazynowal zapalone bity.

EDIT2: Nie wiem czy poprawnie, wydaje sie ok:

lda temp
ora 00000001
sta temp

lda magazyn
ora temp
sta magazyn

lda temp
ora 00000100
sta temp

lda magazyn
ora temp
sta magazyn

= w magazyn mam 00000101

i kazdy bit pozostaly zapalany wczesniej w temp bedzie przenoszony do magazyn z ominieciem tych JUZ zapisanych wczesniej w magazynie. ?
« Ostatnia zmiana: 15 Maja 2019, 08:48 wysłana przez siudym »

Offline Zbych

  • Level 3
  • ***
  • Wiadomości: 210
Nie do końca rozumiem od czego zmierzasz, ale jeśli w temp sterujesz jaki jeden bit jest zapalony to temp powinien być przed wykonaniem OR wyzerowany.

Offline siudym

  • Level 1
  • *
  • Wiadomości: 29
tak bedzie zerowany, to temp jedynie tymczasowo "lapiacy" zapalone bity i przenoszacy do magazynu (roboczo nazwa).

Nie wiem jak to najprosciej zobrazowac, ale chodzi i przeciwnikow na ekranie. Jest wiele ekranow na nich maxymalnie 8 przeciwnikow, kazda kolizja/zabicie przeciwnika zapala jeden z bitow temp (numer przeciwnika odpowiada numerowi bitu),
magazyn to bedzie zmienna osobna dla kazdego ekranu informujaca o zabitych przeciwniakach aby nie pojawily sie juz po wyjsciu/ponownym wjesciu na ekran. Przykladowo:

- wchodze na jeden z ekranow gry, zabijam przeciwnika nr3, w czasie kolizji/zabicia zapala sie bit2 temp (lda temp, ora, sta temp), jednoczesnie bit zostaje przeniesiony do zmiennej np. magazyn_mapka_33 i juz tam ZAWSZE zostaje. Czyli jak przechodze na inne mapki, ale wracam do mapki33, to zmienna magazyn_mapka_33 sprawdza bit2 czy jest zapalony i juz nie reaktywuje przeciwnika nr3.

Zmienna temp jest jedna, poniewaz mapek jest wiele, bity0-7 odpowiadajace za zabicie przeciwnika odpowiadaja WSZYSTKIM w calej grze, rodzielone sa jedynie w zmiennej magazyn dla danej mapki. Dlatego wazne jest aby temp przenosilo zapalony bit zapisujac go w zmiennej magazyn bez ruszania innych bitow. Ogolnie wydaje sie dzialac wszystko.
« Ostatnia zmiana: 15 Maja 2019, 21:08 wysłana przez siudym »

Offline malik_cjm

  • Level 2
  • **
  • Wiadomości: 55
Popraw jeżeli się mylę:
Każda lokacja ma z góry przypisana max ilość przeciwników. Nie więcej niż 8.
Po przejściu do danej lokacji do rysowania/animacji jest używana uaktualniana ilość przeciwników. Po zlikwidowaniu przeciwnika ta wartość jest aktualizowana. I ta nowa wartość jest używana do rysowania/animacji odpowiedniej ilości pozostałych przeciwników.

Co myślisz o takim podejściu:
Domyślna ilość przeciwników jest kopiowana do odpowiednich zmiennych magazyn per lokacja.
Podczas zmiany lokacji wartość zmiennej temp jest kopiowana do zmiennej magazyn odpowiedniej dla starej lokacji. A do zmiennej temp jest kopiowana wartość zmiennej magazyn dla nowej lokacji.

W ten sposób nie musisz martwić się o bity. Tylko o cały bajt.

Offline siudym

  • Level 1
  • *
  • Wiadomości: 29
Ciezko to opisac, bo moze ja uzywam specyficznej metody:

- kazda mapka ma swoj numer od 1 do 256, zapisuje go po wejsciu na dana mapke do zmiennej MapNrMemory
- jest MAX 8 przeciwnikow na mapce i kazdy ma swoja osobny kod kolizji z graczem/jego mieczem
- przykladowo kolizja gracza z przeciwnik nr 3 zapala bit2 zmiennej temp przenoszacej info o zabitych enemy
  (oczywiscie pomijam takze w kodzie kolizji jest kod animacji zabicia i znikniecie przeciwnika)
- w tym samym czasie w tej kolizji wykonany jest skok do kodu z tablica, ktora odczytuje zmienna MapNrMemory i wg numerka
  mapki przenosi zapalony bit2 do zmiennej EnemyKillMagazynLev033 (przykladowo).
- gdy teraz wyjde zabijajac przeciwnika nr 3 z mapki 33 na mapke 34 i tam takze zabije przeciwnika nr. 3 to podobnie jak wyzej
  kod w kolizji sprawdzi numer z MapNrMemory, byl 34, wiec kod z tablica przeniesie znowu bit2 do EnemyKillMagazynLev034 itd itd
- bity z kazdej zmiennej EnemyKillMagazynLev_xxx sa takze osobno odczytywane przy wejsciu do kazdej mapki i pelnia funkcje flagi blokujacej wznowienie sie pojawienia przeciwnika. Czyli domyslnie zgaszona flaga laduje przeciwnika na mapke, a zgaszona pomija to i po wejsciu zabity przeciwnik zwyczajnie nie pojawia sie.

I tak to dziala, w pelnej automatyce powiedzmy juz. Akurat jakos nigdy nie lapalem bitow w taki sposob dlatego zapytalem sie o to :) Widze dziala, wiec jest ok.

Tak to wyglada, ale jeszcze bez kodu zapamietania zabitych przeciwnikow (czyli robia respawn po kazdym wejsciu.wyjsciu z mapki), kod bedzie napisany na nowo.
https://www.youtube.com/watch?v=GKf8mvdcG-A

Tak to jest z tym asm, ze nie potrafie nauczyc sie wszystkiego na blache, cala nauka wylazi w praktyce - jak czegos wczesniej nie uzywalem, ucze sie w praktyce :)
« Ostatnia zmiana: 16 Maja 2019, 10:01 wysłana przez siudym »

Offline hobocti77x

  • Level 5
  • *****
  • Wiadomości: 731
Nie do końca rozumiem od czego zmierzasz, ale jeśli w temp sterujesz jaki jeden bit jest zapalony to temp powinien być przed wykonaniem OR wyzerowany.
nie ma sensu zerowac bity przed ustawieniem czy zerowaniem bitu, to tylko strata czasu i pamieci. Rozkazy  ORA i AND z odpowiednia maska ustawiaja/kasuja bit bez wzgledu na jego poprzednia wartosc i zachowuja poprzednia dla bitow ktorych wartosci nie chcemy zmieniac.  ;)
Np. ORA #01 ustawi bit0 i nie zmieni warosci bitow7 do 1 , oraz AND#FE skasuje jedynie bit0 bez zmiany innych.

Offline siudym

  • Level 1
  • *
  • Wiadomości: 29
Jeszcze zastanawia mnie przeniesienie STATU danego bitu z jednej zmiennej do innej. Zapalony dany bit juz wiadomo, ale jednoczesnie stan zgaszony/zapalony to nie wiem. Przykladowo mam zminna1 i zmienna2, bit5 w zmienna1 odpowiada za jakis status i jest raz zapalany raz gaszony, chcialbym przeniesc stan bit5 z zmienna1 do zmienna2 nie ruszajac innych bitow. ?

Offline siudym

  • Level 1
  • *
  • Wiadomości: 29
Nie STATU ale STANU (literowka). Jedyny sposob spartanski jaki wpada mi do glowy to:

lda zmienna1
and 00100000
bne zapalbit5zmienna2  ;skok krotki gdzie zapalimy bit5 uzywajac ora na nim
beq zgasbit5zmienna2   ;jak wyzej ale skok wykona sie gaszac uzywajac and na nim