Welcome, Guest. Please login or register.


Author Topic: Assembly programozás (Read 254354 times)

Offline IstvanV

  • EP addict
  • *
  • Posts: 4822
Re: Assembly programozás
« Reply #885 on: 2015.February.02. 20:37:38 »
Ja, én  a Spectris-ben (spectrumról átírt 1kB-os Tetris klón) használtam az R-regisztert véletlenszám-generátorként, nem is jött be... :-) Ugye 7 különböző alakzat van, fogtam az R értékét, kinulláztam a felső 5 bitet, és ha nulla volt az eredmény, akkor újra vettem az R-t. Így volt egy "véletlen számom" 1-7 között. Meg is látszik a játékban, hogy baromira nem lett jó így, mert sokkal gyakrabban kapok "Z" formát, aminek 1 a kódja, mint a többi elemet. :-)

Ezt a véletlenszám generátort a Boulder Dash átiratomban használtam, viszonylag egyszerű, és elfogadható minőségű. Az A regiszter a kimenet:
Code: ZiLOG Z80 Assembler
  1. dstAddr:
  2. .l1:    ld    hl, 7fffh                 ; * random seed
  3.         ld    a, r
  4.         xor   l
  5.         add   hl, hl
  6.         xor   h
  7.         ld    l, a
  8.         xor   h
  9.         ld    h, a
  10.         ld    (.l1 + 1), hl
  11.         ret

Offline Povi

  • EP addict
  • *
  • Posts: 2296
  • Country: hu
    • http://povi.fw.hu
Re: Assembly programozás
« Reply #886 on: 2015.February.21. 01:31:12 »
az LDIR utasításra azt írják, hogy 21 / 16 ciklus a végrehajtási ideje. Gondolom a 21 ciklus egy bájtra vonatkozik, a 16 pedig arra, ha BC == 0?
*** Speicherplatz zu klein

Offline lgb

  • EP addict
  • *
  • Posts: 3563
  • Country: hu
  • æðsta yfirmaður
    • http://lgb.hu/
Re: Assembly programozás
« Reply #887 on: 2015.February.21. 02:06:01 »
az LDIR utasításra azt írják, hogy 21 / 16 ciklus a végrehajtási ideje. Gondolom a 21 ciklus egy bájtra vonatkozik, a 16 pedig arra, ha BC == 0?

Szerintem igen. Ha megnezed, az LDI 16 ciklus. Azaz pont annyi mint az LDIR, ha nem kell "ismetelni" mar (a 21 meg arra, ha kell meg). Nem tartozik a temahoz, de ez regi szivfajdalmam a Z80 kapcsan. Logikusabb lenne _szerintem_ ha az LDI beken hagyna a BC-t, mert pl sok LDI egymas utan trukknel nem rontana el a BC-t. Az LDIR meg megfelelne egy LDI + looping-nak, ahol a looping resz intezne a BC-s dolgot. Ilyesforman lehet, egy sima LDI meg gyorsabb is lenne, mint most. Ehelyett, most maskepp van "felosztva", LDI magaban is butykoli a BC-t.

Offline IstvanV

  • EP addict
  • *
  • Posts: 4822
Re: Assembly programozás
« Reply #888 on: 2015.February.21. 12:25:40 »
Logikusabb lenne _szerintem_ ha az LDI beken hagyna a BC-t, mert pl sok LDI egymas utan trukknel nem rontana el a BC-t. Az LDIR meg megfelelne egy LDI + looping-nak, ahol a looping resz intezne a BC-s dolgot. Ilyesforman lehet, egy sima LDI meg gyorsabb is lenne, mint most. Ehelyett, most maskepp van "felosztva", LDI magaban is butykoli a BC-t.

A BC csökkentése a sok LDI-s megoldásnál is hasznos lehet, mert így az LDI-k JP PE utasítással ciklusban futtathatók. 2-nél több LDI esetén ez már gyorsabb, mint az LDIR.

A BC csökkentésének a hiánya valószínűleg nem gyorsítaná az LDI/LDD utasításokat, mert a DE és HL regisztereket továbbra is növelni/csökkenteni kellene (4 + 4 ciklus utasítás olvasás, 3 ciklus (HL) olvasás, 3 (DE) írás, és 2 regiszter módosítás = 16 ciklus).

Offline lgb

  • EP addict
  • *
  • Posts: 3563
  • Country: hu
  • æðsta yfirmaður
    • http://lgb.hu/
Re: Assembly programozás
« Reply #889 on: 2015.February.21. 13:57:55 »
Nalam konkretan ott jott elo a problema, hogy fix hosszusagu dolgot masoltam volna jo par LDI-vel egy igen sebessegerzekeny rutinban, amde az azt korulvevo kodnal meg kellett volna meg a B es C masra. Konkretan nem is ertettem, miert nem jo a kodom, mert nem gondoltam ra, hogy az LDI is bizeralja a BC-t, nem csak az LDIR :) Az ep128emu debuggerevel jottem ra erre, ez persze az en figyelmetlensegem nyilvan, hogy nem ismertem elegge a Z80 mukodeset ezek szerint :) Jo persze az EX-es dolgok is nagy segitseget jelentenek azert, ha "keves a regiszter" :) Az mondjuk nem vilagos amit irtal, oke, hogy a DE, HL is modositando az LDI altal, de ha kimaradna a BC nem lenne gyorsabb a csak LDI-t hasznalok jellegu felhasznalasnal?

Offline IstvanV

  • EP addict
  • *
  • Posts: 4822
Re: Assembly programozás
« Reply #890 on: 2015.February.21. 16:38:20 »
Az mondjuk nem vilagos amit irtal, oke, hogy a DE, HL is modositando az LDI altal, de ha kimaradna a BC nem lenne gyorsabb a csak LDI-t hasznalok jellegu felhasznalasnal?

Úgy értettem, hogy az LDI nem feltétlenül lenne gyorsabb, mint 16 ciklus, mert a +2 ciklus idő az utasítás végén valószínűleg a DE növelése miatt nem volt elkerülhető. A BC csökkentését pedig más műveletekkel párhuzamosan (pl. (HL) olvasása közben) is el lehet végezni.

Offline lgb

  • EP addict
  • *
  • Posts: 3563
  • Country: hu
  • æðsta yfirmaður
    • http://lgb.hu/
Re: Assembly programozás
« Reply #891 on: 2015.February.21. 16:49:32 »
Úgy értettem, hogy az LDI nem feltétlenül lenne gyorsabb, mint 16 ciklus, mert a +2 ciklus idő az utasítás végén valószínűleg a DE növelése miatt nem volt elkerülhető. A BC csökkentését pedig más műveletekkel párhuzamosan (pl. (HL) olvasása közben) is el lehet végezni.

Aha, hat ezt nem tudom ... Az biztos, hogy egy normal 16 bites osszeadas/kivonas az kegyetlen lassu Z80-on, de mint megtudtam valojaban 4 bites ALU-ja van, tehat annyira nem meglepo. Gondolom, azert olyan helyeken ahol vmit eggyel csokkenteni vagy novelni kell (INC/DEC jellegu dolgok) azt nyilvan nem az ALU-n at csinalja, mert kulonben az LDI szuper lassu lenne, arrol nem is beszelve, hogy a PC-t is novelni kell ugye "eleg gyakran" mas opcode-oknal is :) A PC novelesere tenylegesen szoktak kulon inkrementalot beepiteni es az ALU-t nem bizeralni, esetleg INC/DEC op-okra is, de az LDI azert volt nekem gyanus, mert ott azert osszesen harom regiszternel van inc/dec mikozben megcsinalja. Bar akkor ezek szerint, nem kell ezt a harmat egyszerre csinalnia, parhuzamosithatja is oket mas muveletekkel, akkor meg igazad lehet, es sokat nem oszt, nem szoroz. Azert nekem az x86 megkozelites sem tunik tul rossznak, hogy van pl kulon REP "utasitas" es vegulis tobb mindent is moge irhatsz. Igaz, igy a kod lassabb lesz. Lehet az LDIR is lassabb lenne ilyen formaban, abba a 21-16=5 ciklusba valszeg nem ferne bele, a legelemibb utasitas (NOP) is 4 ugye ...

Offline Tuby128

  • EP addict
  • *
  • Posts: 1448
  • Country: hu
Re: Assembly programozás
« Reply #892 on: 2015.May.04. 09:47:46 »
Jól látom, hogy a Z80-ban nincsen
CALL HL
CALL IX
CALL IY
utasítások?

Offline Zozosoft

  • Global Moderator
  • EP addict
  • *
  • Posts: 14721
  • Country: hu
    • http://enterprise.iko.hu/
Re: Assembly programozás
« Reply #893 on: 2015.May.04. 09:50:12 »
Jól. De könnyen helyettesíthető

CALLHL: JP (HL)
CALLIX: JP (IX)
CALLIY: JP (IY)

És a megfelelő rutinra CALL.

Offline Tuby128

  • EP addict
  • *
  • Posts: 1448
  • Country: hu
Re: Assembly programozás
« Reply #894 on: 2015.May.04. 16:47:45 »
Ez igaz, de a helyettesítés esetén kell egy push, ami előtt még a visszatérési címet is számolni kell.
 Ezzel a kódunk megint mozgathatatlan lesz. Másrészt, akkor eggyel több utasítást használtam. Így sokat veszítek.
 Kíváncsi vagyok, hogy a kibővitett Z80-as utasításkészletben (köv. generációs Z processzoroknál) ezt orvosolták-e?

Offline Zozosoft

  • Global Moderator
  • EP addict
  • *
  • Posts: 14721
  • Country: hu
    • http://enterprise.iko.hu/
Re: Assembly programozás
« Reply #895 on: 2015.May.04. 16:51:34 »
Mért kéne PUSH?

Offline lgb

  • EP addict
  • *
  • Posts: 3563
  • Country: hu
  • æðsta yfirmaður
    • http://lgb.hu/
Re: Assembly programozás
« Reply #896 on: 2015.May.04. 16:52:33 »
Ez igaz, de a helyettesítés esetén kell egy push, ami előtt még a visszatérési címet is számolni kell.

Miert kene push? A CALL a verembe beteszi a cuccost, igy ha majd RET-re fut, akkor az utan fog visszaterni. Igaz, a CALL ezek utan egy pl JP (HL)-re ugrik, ami aztan tovabb, de ez lenyegtelen, a lenyeg, hogy imho, a CALL nn, majd nn: JP (HL) az pontosan azt csinalja amit a CALL (HL) csinalna, ha lenne olyan, nem kell oda egy push ...

Amugy maga a JP (HL) is fura syntaxis, mivel a logikus a JP HL, a (..) altalaban indirekt cimzest jelentene, azaz ugorjon arra a cimre, amit a HL altal megadott memoria cim tartalmaz, de ugye itt nem errol van szo :) En ezert (is) mindig inkabb JP HL-t irok csak, ezt amugy az sjasm el is fogadja.[/quote]

Offline Tuby128

  • EP addict
  • *
  • Posts: 1448
  • Country: hu
Re: Assembly programozás
« Reply #897 on: 2015.May.04. 17:13:54 »
Tudtommal a CALL xxx azt csinálja, hogy eltárolja a soronkövetkező memóriacímet a verembe, és az xxx re ugrik.
EP nél nincs CALL HL utasítás.
Zozo szerint ez helyettesíthető JP HL -lel.
Erre mondtam, hogy az nem ugyanaz, mert a JP nem ment a verembe. Ahhoz, hogy CALL HL-t helyettesítsen, kell a PUSH is.

Offline Tuby128

  • EP addict
  • *
  • Posts: 1448
  • Country: hu
Re: Assembly programozás
« Reply #898 on: 2015.May.04. 17:15:58 »
Már látom, hogy a gyorsolvasásban elvétettem a "és a megfelelő rutinra CALL" mondatot. Nem láttam elnézést.
De így megint  értékes órajeleket veszítek, mert az ugróutasítás lassabb.

Offline Ferro73

  • EP lover
  • *
  • Posts: 967
  • Country: hu
Re: Assembly programozás
« Reply #899 on: 2015.May.04. 19:07:50 »
A nem hivatalos utasítás készletben nincs jelen?

egyébként milyen környezetbe,rutinba kellene a CALL HL, CALL IX, CALL IY?

valami generál egy HL értéket és azt hívja meg PL.:?

Esetleg egy PL.:
   ...
   CALL CALL_HL
IDE
   ....

CALL_HL
    LD HL,12345
    ADD HL,DE
    PUSH HL    ;HL=13000
    RET

org 13000
    ...
    ...
    ...
    RET    ;IDE     tér vissza