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:
LD HL,(nn) ;ED 6B nn
Közben megtaláltam:
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
Valaki meg tudná nekem mondani, hogy az Indexregiszteres címzés az összeadással mire jó?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; ... };
PL: LD A, (IX+d)
{
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;}
}
}
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
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
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