Welcome, Guest. Please login or register.


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

Offline IstvanV

  • EP addict
  • *
  • Posts: 4822
Re: Assembly programozás
« Reply #750 on: 2013.December.20. 17:51:18 »
Quote from: Povi
valahonnét (az újabb EXOS-ok esetében) ki lehet olvasni, hány MHz-es a gép? Ha nem, hogyan lehet megállapítani viszonylag egyszerűen?

Ha nem fontos a nagy pontosság, akkor az 1 kHz-es megszakítások számából egy 50 Hz-es video megszakítás alatt, például így:

Code: ZiLOG Z80 Assembler
  1.         di
  2.         ld    b, 0
  3.         ld    a, 04h
  4.         out   (0bfh), a
  5.         ld    c, b
  6.         call  .l2
  7.         ld    l, b
  8.         call  .l2                       ; L = 1 kHz interrupts per video frame
  9.         ld    a, 25
  10.         cp    l
  11.         ld    a, 03h
  12.         rla
  13.         rla
  14.         out   (0bfh), a                 ; Z80 <= 5 MHz: 0Ch, > 5 MHz: 0Eh
  15.         ...
  16.         ret
  17. .l2:    in    a, (0b4h)
  18.         and   11h
  19.         or    c
  20.         rlca
  21.         and   66h
  22.         ld    c, a                      ; -ON--ON-
  23.         rlca                            ; ON--ON--
  24.         xor   c                         ; OXN-OXN-
  25.         bit   2, a
  26.         jr    z, .l3
  27.         inc   l                         ; 1 kHz interrupt
  28. .l3:    cp    0c0h
  29.         jr    c, .l2                    ; not 50 Hz interrupt ?
  30.         ret
« Last Edit: 2013.December.20. 17:59:03 by IstvanV »

Offline IstvanV

  • EP addict
  • *
  • Posts: 4822
Re: Assembly programozás
« Reply #751 on: 2013.December.20. 18:10:50 »
Quote from: Povi
LPT táblát hogy kell módosítani, hogy legyen még egy 36 pixelsor magas szöveges lapom, a grafikus rész alatt, hasonlóan a BASIC graphics parancsához?
A legegyszerűbb az EXOS státusz sor LPB-jét (BFF4h-ról olvasható a címe a 2. lapon) másolni, ez már tartalmazza a karakterkészlet kezdőcímét, és beállítani az LD1 címet, margókat (figyelve az ALTIND0/1 bitekre), és palettát. Természetesen az alsó és felső keretet is rövidíteni kell összesen 36 sorral.

Offline szipucsu

  • Global Moderator
  • EP addict
  • *
  • Posts: 9898
  • Country: hu
    • Támogató Támogató
    • Webnyelv.hu - Tanuljunk nyelveket!
Re: Assembly programozás
« Reply #752 on: 2013.December.20. 18:11:45 »
Quote from: Povi
valahonnét (az újabb EXOS-ok esetében) ki lehet olvasni, hány MHz-es a gép? Ha nem, hogyan lehet megállapítani viszonylag egyszerűen?
Valamelyik Spectrum Világ mellékletében volt egy példaprogram, ami kiírja az órajelet. A 12-16. számok között lehetett az egyikben.
100 SOUND SOURCE 2,STYLE 128,PITCH 25.2,SYNC 1
110 SOUND PITCH 25,SYNC 1
120 ! Videos

Offline Zozosoft

  • Global Moderator
  • EP addict
  • *
  • Posts: 14723
  • Country: hu
    • http://enterprise.iko.hu/
Re: Assembly programozás
« Reply #753 on: 2013.December.28. 16:31:46 »
Povi kérdésére az órajelmérés az EXOS 2.4-ből, gyakorlatilag azt számolja, hogy hány INC HL-es ciklus fut le egy videó megszakítás alatt.
38h-n egy JP (IX) utasítás van. A végére a BC-ben az órajel MHz-ben számolt értékének százszorosa van, így lesz kiírva két tizedes pontossággal.
A végén van egy összehasonlítás, a 191-es port kezdőértékéhez, 500 azaz 5Mhz alatt 12, felette 14 (azaz 4 vagy 6 Mhz-es beállítás).
A hívott matematikai rutinok a Hsoft féle MULDIV csomagból vannak.
Code: ZiLOG Z80 Assembler
  1.                 LD A,12
  2.                 OUT (191),A
  3.                 LD HL,0
  4.                 LD IX,IRQ1
  5.                 LD BC,30B4H
  6.                 OUT (C),B
  7.                 EI
  8.                 HALT
  9. IRQ1            LD IX,IRQ2
  10.                 OUT (C),B
  11.                 EI
  12. IRQW            INC HL
  13.                 JP IRQW
  14. IRQ2            DI
  15.                 LD IX,0BD50H
  16.  
  17.  
  18.                 LD BC,HL
  19.                 LD DE,1000
  20.                 CALL MUL_DE_BC
  21.                 LD BC,HL
  22.                 LD A,E
  23.                 LD DE,12485
  24.                 CALL DIV_ABC_DE
  25.                 OR A
  26.                 LD DE,6243
  27.                 SBC HL,DE
  28.                 JR C,NEMKEREKIT
  29.                 INC C
  30. NEMKEREKIT      LD (IX+11),C
  31.                 LD (IX+12),B   ;orajel erteke
  32.                 LD HL,BC
  33.                 PUSH HL
  34.                 LD DE,500
  35.                 SBC HL,DE
  36.                 LD A,12
  37.                 JR C,JO4MHZ
  38.                 LD A,14
  39. JO4MHZ          PUSH AF
  40.  

Offline geco

  • EP addict
  • *
  • Posts: 7082
  • Country: hu
    • Támogató Támogató
Re: Assembly programozás
« Reply #754 on: 2014.February.02. 18:03:50 »
Van olyan z80 utasítás (nem dokumentált) amivel megtudhatjuk, hogy milyen megszakítási mód van beállítva?

Offline Zozosoft

  • Global Moderator
  • EP addict
  • *
  • Posts: 14723
  • Country: hu
    • http://enterprise.iko.hu/
Re: Assembly programozás
« Reply #755 on: 2014.February.02. 18:28:01 »
Quote from: geco
Van olyan z80 utasítás (nem dokumentált) amivel megtudhatjuk, hogy milyen megszakítási mód van beállítva?
Nincs. Az emuba azt csináltam, hogy az I alapból a ROM-ba mutat értelmetlen helyre (tehát nem az FF-ekre), és ha megváltozik, akkor azt IM2-re áttérésnek veszi. Nem tökéletes módszer, de nagy rakás játék működövé vált így.

Offline geco

  • EP addict
  • *
  • Posts: 7082
  • Country: hu
    • Támogató Támogató
Re: Assembly programozás
« Reply #756 on: 2014.February.02. 18:58:39 »
Quote from: Zozosoft
Nincs. Az emuba azt csináltam, hogy az I alapból a ROM-ba mutat értelmetlen helyre (tehát nem az FF-ekre), és ha megváltozik, akkor azt IM2-re áttérésnek veszi. Nem tökéletes módszer, de nagy rakás játék működövé vált így.
A TAP-ok betöltése miatt kérdeztem, mert van olyan program, ami beállítja az IM2-t, és elkezd tölteni, na nálam ez egy hatalmas fagyi lett :lol: , most le van tiltva az összes megszakítás a TAP egy-egy részének töltése végéig, ezt akartam valahogy elkerülni.
Az 0500h-0600h-ig tartó címre, és az emu állítja is az IM2-t, vagy hagyod a programokra ezt a feladatot? Fél órája néztem pár percet az emut, láttam, hogy az előbb említett tartományban van egy ugrótábla, de van benne kód is, hogy oldottad meg, hogy a kódba ne ugorjon véletlenül? A port hívások is NMI-ből mennek nem? Az NMI-ből a portkezelő, és attributum konvertáló rutinra való ugrás egy plusz JP-n keresztül történik, annak is van valami funkciója?
Én azt csináltam, hogy az LD I,A-kat cseréltem le, és az ugrótáblát minden esetben 3bh-val töltöm fel, és a 3b3bh-n lévő im2-es megszakításrutin végére teszem az ugrótábla eredeti értékét, ha az nem 0ffh, mert ha az, akkor vagy 0fff4h , vagy 0aff3h kerül a végére, ha I értéke 0ffh, vagy kisebb, mint 3fh, akkor a 3e00h-3f00h-ra kerül a tábla, ezért veszti el pár játék a karakterkészletét, ilyen a Heartland is.
Vannak a trükkös programok, amik váltogatják az ugrótáblákat, de nem generálnak semmit, arra az esetre tároltam el az ugrótáblákhoz használt előző értékeket, ezzel megjavult a Wec Le Mans (az SNA verzióm sajnos egyből a megszakításban kezd, ezért oda ugrik , ahová nem kéne, de műxik, csak az elején van egy kis érdekesség), és az Operation Wolf.

Offline Zozosoft

  • Global Moderator
  • EP addict
  • *
  • Posts: 14723
  • Country: hu
    • http://enterprise.iko.hu/
Re: Assembly programozás
« Reply #757 on: 2014.February.03. 11:09:59 »
A snapshot mentésnél van egy ilyen lekérdezés az emu-ban:
Code: ZiLOG Z80 Assembler
  1. IMKERD          LD A,30H
  2.                 OUT (0B4H),A
  3.                 LD A,3DH
  4.                 LD I,A
  5.                 XOR A
  6.                 EI
  7.                 HALT
  8.                 DI
  9.                 IM 1
  10.                 PUSH AF
  11.                 LD A,3FH
  12.                 LD I,A
  13.                 POP AF
  14.                 RET
Itt már a 0-ás lap van belapozva, az azon futó IM2 rutinban egy INC A van.

Offline geco

  • EP addict
  • *
  • Posts: 7082
  • Country: hu
    • Támogató Támogató
Re: Assembly programozás
« Reply #758 on: 2014.February.03. 11:33:36 »
Quote from: Zozosoft
A snapshot mentésnél van egy ilyen lekérdezés az emu-ban:
Code: [Select]
IMKERD          LD A,30H
                OUT (0B4H),A
                LD A,3DH
                LD I,A
                XOR A
                EI
                HALT
                DI
                IM 1
                PUSH AF
                LD A,3FH
                LD I,A
                POP AF
                RET
Itt már a 0-ás lap van belapozva, az azon futó IM2 rutinban egy INC A van.
Na erre nem gondoltam, hogy a 0-ás lapra is csináljak egy saját IM 2 rutint :), ez sokkal jobb, mint amit én csináltam ideiglenesen, a speccy ROM-ban elhelyezett IM 2-mben állítottam :lol:

Offline Povi

  • EP addict
  • *
  • Posts: 2296
  • Country: hu
    • http://povi.fw.hu
Re: Assembly programozás
« Reply #759 on: 2014.April.08. 08:43:04 »
Készült-e arról valaha vizsgálat, hogy egy átlagos Z80 program esetében mennyi az egy utasításra jutó átlagos ciklusidő? (ugye érthető? :-) ). Mert hát ugye egy utasítás lehet 4 ciklus is, de akár 23 is. Na de mennyi a sebessége valós körülmények között? Hány MIPS? (Jó tudom, jó közelítéssel 1 MIPS egy 4MH-es Z80, de vajon tényleg annyi? - hiszen ekkor feltételezzük, hogy minden utasítás csak 4 ciklus)
*** Speicherplatz zu klein

Offline Pgyuri

  • EP fan
  • *
  • Posts: 156
Re: Assembly programozás
« Reply #760 on: 2014.April.08. 16:25:41 »
Üdv,

Ha definiálod az "átlagos Z80 program"-ot, akkor megválaszolom. Kérdésed szerintem nem megfelelő, hiszen programozási technikától függ ki milyen módon építi fel programját.

Utasítások hossza 4T és 23T tartományban van. 486 különböző utasítás van, átlag T értékük ~10,4.

Ha a programod minden utasításból egyet tartalmaz, akkor ez az átlag. Normális programozási elv mentén szerintem kb. 8 körül mozoghat az érték, míg IX és egyéb hosszú utasítások alkalmazásánál 12-14 körül lehet.

De mint említettem, kellene tudni az általad átlagosnak titulált program specifikációját, mert ha csak 8 bites műveleteket kell végezni, akkor gyors utasításokkal lehet dolgozni, de ha rengeteg nagy táblázatra gondolsz és átláthatóbb program a cél, akkor lassú utasítások tolonghatnak. Nézzek meg egy játékot esetleg ?  De akkor melyiket ?

Hiába, nincs klub :)  pedig ott jókat töprenghettünk...

Pgyuri

Offline geco

  • EP addict
  • *
  • Posts: 7082
  • Country: hu
    • Támogató Támogató
Re: Assembly programozás
« Reply #761 on: 2014.April.08. 16:41:29 »
Hát legyen egy klub :D

Offline Povi

  • EP addict
  • *
  • Posts: 2296
  • Country: hu
    • http://povi.fw.hu
Re: Assembly programozás
« Reply #762 on: 2014.April.08. 16:43:58 »
Quote from: Pgyuri
Normális programozási elv mentén szerintem kb. 8 körül mozoghat az érték, míg IX és egyéb hosszú utasítások alkalmazásánál 12-14 körül lehet.

Na, hát pont én is erre lennék kíváncsi... :-)
Vajon az emulátorban van erre mód? Mint ahogy a futási idő kijelzése is lehetséges, jó lenne, ha meg lehetne nézni, hogy a két töréspont között hány darab utasítás futott le, menni T idővel. :-)

Persze közben kicsit továbbgondoltam és bonyolítottam a dolgokat a fejemben. Mert mi van akkor, ha a programom csak 16 bites regiszter értékadásból áll? Akkor az átlagos T időm 10 lesz. Ha ugyanezt a programot 8 bites regiszterekkel írom meg, akkor az átlagos T időm 7 lesz, azt mondhatnánk, hogy így mégis csak több utasítást hajt végre a proci egy adott időegység alatt, mégis 40%-kal több ideig fog futni ugyanaz a program. Vagy ebben az esetben pl. az LD BC,1234 utasítást 2 db utasításnak kéne venni, hogy javítsa a MIPS eredményt? Szóval, nem egyszerű :-)
*** Speicherplatz zu klein

Offline lgb

  • EP addict
  • *
  • Posts: 3563
  • Country: hu
  • æðsta yfirmaður
    • http://lgb.hu/
Re: Assembly programozás
« Reply #763 on: 2014.April.09. 10:50:51 »
Lehetne igy trukkozni, de eleve nem az a lenyeg, hogy "javitsd a statisztikat" (MIPS-et), hanem hogy tenylegesen milyen gyors a programod ugyanazon a hw-n, azaz a ha a feladat pl az hogy a B regiszter erteke legyen 12h, a C meg 34h, akkor az lehet ket LD utasitas, illetve lehet egyetlen, 1234h-val. Az szerintem csak max reklamfaktor, hogy a MIPS az "million instruction per second", attol, hogy tobb utasitast hajtasz vegre 1 masodperc alatt egy masik megoldashoz kepest, nem biztos, hogy az lesz a gyorsabb, mert egyes utasitasok vegrehajtasi ideje nem ugyanaz. A MIPS dolognak tobb ertelme van imho egy RISC CPU-nal ahol nincs olyan nagy szoras az utasitasok vegrehajtasi idejeben, pl lehet tipikus, hogy legtobb utasitas egy orajelciklus, es kesz. Ott akkor tobb ertelme van tenyleg ennek a MIPS dolognak. Ami szerintem viszont fontos, az az, hogy nem ezt kell nezni, hanem azt, hogy adott feladatot minnel rovidebb futasidovel realizald, a MIPS ertektol fuggetlenul, ami egy CISC processornal amugy is nehezebben ertelmezheto fogalom.

Offline Povi

  • EP addict
  • *
  • Posts: 2296
  • Country: hu
    • http://povi.fw.hu
Re: Assembly programozás
« Reply #764 on: 2014.April.11. 08:55:25 »
Quote from: lgb
Az szerintem csak max reklamfaktor, hogy a MIPS az "million instruction per second", attol, hogy tobb utasitast hajtasz vegre 1 masodperc alatt egy masik megoldashoz kepest, nem biztos, hogy az lesz a gyorsabb, mert egyes utasitasok vegrehajtasi ideje nem ugyanaz.
És tényleg, most olvasom, hogy tréfásan "Meaningless Information on Performance for Salespeople" (értelmetlen teljesítményinformáció kereskedőknek) is értelmezik a rövidítést... :-)
*** Speicherplatz zu klein