ENTERPRISE KLUB
2023. december 9.,  14-19 óráig
1074 Budapest, Károly krt. 3/A.
Részletek
Welcome, Guest. Please login or register.


Recent Posts

Pages: 1 2 [3] 4 5 6 7 8 9 10
21
Assembly / Re: Assembly programozás
« Last post by Tuby128 on 2023.December.07. 12:22:33 »
Ez az utasítás mit csinál?

LD HL,(nn)  ;ED 6B nn

Közben megtaláltam:
22
Assembly / Re: Assembly programozás
« Last post by Tuby128 on 2023.December.07. 12:08:32 »
Most hogy írod LD BC,HL utasításon megint meglepődtem, mint amikor kiderült, hogy bit rotáló útasításnál nem lehet megadni, hogy hányszor végezze el.

Azt olvastam, hogy a HL regiszter, az a 16 bites akkumulátor. Erre kiderül, hogy nincs lehetőség ebből a regiszterből 16 bites értéket másikba tölteni?
Most látom, hogy csak a következő HL utasítások validak:
LD HL,nn
LD HL,(nn)
LD SP,HL
LD (nn),HL

Most ha kiszámolok egy memóriacímet, és LDIR-t akkarok használni, akkor nem tudom áttölteni a BC és DE regiszterekbe az eredményt?
De át tudom, csak 8 bitenként:
LD B,H  (opcode 0x44)
LD C,L  (opcode 0x4D)

Annyiban igazuk van a tervezőknek, hogy mivel az 1 BYTE hosszú opcode-ok beteltek, nincs értelme egy LD BC,HL miatt egy 0xED utáni opcode-ot létrehozni pl: ED 22, mert ugyanúgy két BYTE hosszú lenne, mint amikor végrehajtjuk a 44 4D kódot.

 Megérett már az olyan Z80 FPGA mag, aminek 32 adatbusza van, és ezt a két utasítást egy FETCH utasítással beolvassa, és egy ciklus alatt elintézi.
Ugyanez a véleményem az indexregiszteres címzésre. 32 bites adatbusszal be lehetne olvasni az egész kiterjesztett LD (IX+d),A opkódot egyben, és így visszaírássel együtt 2 ciklus alatt el is intézhető.

 Még annyi finomság lehetne, hogy az indexregiszter által címzett memória a CPU néhány 16 Byte-os CACHE memóriájába lenne töltve, így piszokgyorsan hozzáférne a CPU az adatokhoz. Gyakorlatilag úgy működne mint regiszter. A visszaírás a normál memórába (cache ürítés) lenne problémás - időigényes, amikor az Index regiszter értéket váltana.
23
Assembly / Re: Assembly programozás
« Last post by geco on 2023.December.07. 11:52:27 »
itt van egy rövidebb, és index regiszter mentes megvalósítás:
Code: [Select]
tomby   db      04h           ;i
tombx   db      04h           ;j
tombstr defs    tombx*tomby

        ld      hl,tombstr
        ld      bc,(tomby) ;i=4,j=4
        ld      e,b             ;tombx
        ld      d,00h
        ld      a,255
fori    push    bc
forj    ld      (hl),a
        inc     hl
        djnz    forj            ;j--
        pop     bc
        add     hl,de           ;minden páratlan sort átugorjuk
        dec     c               ;i=i-2
        dec     c
        jr      nz,fori
24
Assembly / Re: Assembly programozás
« Last post by geco on 2023.December.07. 11:38:15 »
Jaa, hogy ilyen kis tömbről van szó, akkor az, amit említettem, fölös, mert nagyon helypazarló, viszont, ha jól látom az ix+4 tárolja az I változót, amit A-ba töltesz, és hasonlítod össze az L-lel, ha A kisebb, mint L, akkor lesz C, így nem hajtódik végre a ciklusod.
JR NC, END_FOR_i ,és JR NC, END_FOR_j    kéne
meg még egy dolgot kiszúrtam a i=i+2-nél:
LD (IX+5),A  helyett LD (IX+4),A kéne.

de a j++ megvalósítható INC (IX+5)-tel
az i=i+2 meg:
INC (IX+4)
INC (IX+4)-gyel

Nem tudom milyen fordítót használsz, van pár, ami nem szereti a LD BC,HL-t, mert ilyen z80 utasítás nincs, ha szereti a fordító, hagyhatod így is, de úgy látom fölösleges is ez az utasítás, mert:
 LD L,(IX+2)
 LD H,(IX+3)  ; HL <- base address of char tomb[][]
 LD BC,HL     ; BC <- base address of char tomb[][]
helyett
 LD C,(IX+2)
 LD B,(IX+3)  ; BC <- base address of char tomb[][]
ez is megadható
25
Assembly / Re: Assembly programozás
« Last post by ergoGnomik on 2023.December.07. 08:01:14 »
Valaki meg tudná nekem mondani, hogy az Indexregiszteres címzés az összeadással mire jó?

PL: LD A, (IX+d)
Nem tudom megmondani, de nekem úgy tűnik, mintha kifejezetten jól használható lenne felhasználó által definiált, összetett típusok kezelésénél. struct { típus1 mező1; ... };
26
Assembly / Re: Assembly programozás
« Last post by Tuby128 on 2023.December.06. 23:11:05 »
Vélelmezzük, hogy az IX regiszter már oda mutat arra a memóriára, ahol a változók lesznek eltárolva.

Tudom, hogy sok utasítás felesleges, vagy gyorsabb megoldással kiváltható. De az átláthatóság miatt így is megfelel.

 Kérdés, hogy a feltételes JR ugrás vajon fog-e működni?
 Meg hogy a kódban van-e más hiba?
27
Assembly / Re: Assembly programozás
« Last post by Tuby128 on 2023.December.06. 23:10:04 »
Írtam papíron egy egyszerű c programot amely egy két dimenziós tömböt manipulál:

Ansi C kód 4x4-es tömb, minden második sorát inicializáljuk 255-tel.
Code: [Select]
{
char x=4;  // ezek csak a tömb mérete miatt vannak deklarálva
char y=4;  // ezek csak a tömb mérete miatt vannak deklarálva
char tomb[4][4]; // nem inicializált
char i;
char j:
for (i=0;i<x;i=i+2)
  {
   for (j=0;j<y;j++)
    { tomb[i][j]=255;}
  }
}





Memóriaszervezés:


Code: [Select]
IndexRegiszter kezdőcím +
0. char x
1. char y
2. base address LOBYTE : char TOMB[i][j] - vegyük úgy, hogy a végrehajtáskor már valahova mutat
3. base address HIBYTE : char TOMB[i][j]
4. char i
5. char j

Assembly code (kézzel írtam index regiszter használatával)
Code: [Select]
INIC_FOR_i:
 LD(IX+4),0   ; for(i=0;.....)
FOR_i:
 LD A,(IX+4)  ;A <- char i
 LD L,(IX+0)  ;L <- char x
 CMP L        ;for(...;i<x;...)
 JR C, END_FOR_i ; elöl tesztelt for_i addig hajtjuk végre a ciklust amíg igaz: i<x
INIC_FOR_j:
 LD (IX+5),0  ;for(j=0;.....)
FOR_j:
 LD a,(IX+5)  ;A <- char j
 LD L,(IX+0)  ;L <- char y
 CMP L        ;for(...;j<y;...)
 JR C, END_FOR_j ; elöl tesztelt for_j addig hajtjuk végre a ciklust amíg igaz: j<y
 LD L,(IX+2)
 LD H,(IX+3)  ; HL <- base address of char tomb[][]
 LD BC,HL   ; BC <- base address of char tomb[][]
; most jön a tömb indexelt címének meghatározása: BASE_ADDR + 4*i + j
; elöször 4*i kiszámolása
 LD A,(IX+4) ; A <- char i
 SLA A
 SLA A ; 2x szorzás 2-vel a tömb 2. dimenziója miatt, itt kicsit megdöbbentem, hogy a Z80 nem kérdi, hányszor akarok léptetni
 LD DE,0
 LD E,A      ; DE <- 4*i
 LD HL,0
 LD L,(IX+5) ; HL <- char j
 ADD HL,DE   ; 4*i + j
 ADD HL,BC   ; BASE_ADDR + (4*i+j)
 LD (HL),255 ; tomb[i][j]=255;
 LD A,(IX+5) ; A <- char j
 INC A      ; A++
 LD (IX+5),A ; for(........;j++)
 JR FOR_j ; for(j... a növelés után visszaugrik elöltesztelésre
END_FOR_j:   ; ciklus vége
 LD A,(IX+4) ; A <- char i
 ADD A,2 ; A=A+2
 LD (IX+5),A ; for(........;i=i+2)
 JR FOR_i ; for(i... a növelés után visszaugrik elöltesztelésre
END_FOR_i:   ; ciklus vége
 RET
28
Hardver / Re: EP NYÁK?
« Last post by Judge on 2023.December.06. 22:10:21 »
Jelenleg nincs semmilyen alternatíva ezek pótlására és/vagy előállítására minthogy kiszeded egy meglévő alaplapból. Így viszont jogosan merül fel a kérdés, hogy minek szétbarmolni egy Issue6 alaplapot, hogy kapjak belőle aztán egy ugyanolyan Issue6 alaplapot?

VK

LIKE :smt109 
29
Assembly / Re: Assembly programozás
« Last post by geco on 2023.December.06. 21:53:56 »
Bocs, a 100h-s cimre beallitott tabla kicsit felreertelmezheto volt, a lenyeg az, hogy a tabla alacsony bajtja 00h-n legyen, tehat a tabla kezdocime xx00h legyen, lehet 1300h, 8000h, 9100h, a kodtol fuggoen, szerintem az osszes assemblerben konnyen beallithato, a sjasm-ban pl ha a kododban akarod beloni, akkor a
  defs low -$
tabla_kezdete:
 ezt az igazitast megoldja, egyszerubb megoldas, ha a kodon kivulre helyezed fixen, eleg ennyi:
tabla_kezdete equ 0c000h
30
Assembly / Re: Assembly programozás
« Last post by geco on 2023.December.06. 21:37:58 »
Az IX, es IY regisztereket hasznalo utasitasok hasznalatanak hasznalhatosagat jol leirtad, annyi a lenyeg meg, hogy sebesseg kritikus helyeken az ld (ix),a , ld a,(ix) hasznalata megfontolando, egyeb hasonlo utasitasoke is, mert nagyon lassuak,ez igaz az iy-ra is, mig pl egy ld a,(hl) 7 t-state, egy jo ld a,(ix) 19 t-state-be faj.
Visszaterve az eredeti kerdesre, en barmelyik normal regiszter part hasznalnam a 2 dimenzios tomb elemeinek megcimzesere, lehet pl a DE, a lenyeg az, hogy a tomb kezdete legyen 100h-s hatarra allitva, igy nem kell miden adat eleresnel 16 bites osszeadast elvegezni, E megadja az x coordinatan levo elemet, D -a tomb kezdete megadja az y-t.
Pages: 1 2 [3] 4 5 6 7 8 9 10